From noreply@seminar-singapore.com Mon Aug 1 00:20:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE,REMOVE_BEFORE_LINK,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9E3257CB5 for ; Mon, 1 Aug 2016 00:20:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F30F8F8039 for ; Sun, 31 Jul 2016 22:20:42 -0700 (PDT) X-ASG-Debug-ID: 1470028836-0bf57c136926afa0001-NocioJ Received: from seminar-singapore.com (seminar-singapore.com [153.92.230.9]) by cuda.sgi.com with ESMTP id J752xiu2BOY72wyV for ; Sun, 31 Jul 2016 22:20:36 -0700 (PDT) X-Barracuda-Envelope-From: noreply@seminar-singapore.com X-Barracuda-Effective-Source-IP: seminar-singapore.com[153.92.230.9] X-Barracuda-Apparent-Source-IP: 153.92.230.9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seminar-singapore.com; q=dns/txt; s=mail; bh=v7PT7esWLOgOj1bDSqF3c7Y3hnc6EiHBT8FITCYEgmg=; h=from:reply-to:subject:date:mime-version:content-type:list-id:list-unsubscribe; b=Ct36bkKPnPuDWsZFn7KlO8jw+dQcSix69d8PP5mp8w+LZEoAvKckAB1XCaBHrDkbRaLuRwewS7zx dCHK7xhbGcnnCgYDGSDc/XLNd93/wtd6S/W7bLYtkqwj8sVaDDDv93NB1VMXtJ3XeOiVG9d1HDmN nnxyRrEjQOh4gHdR0Bo= To: Subject: =?UTF-8?Q?Boost_Up_Your_Productivity_with_Timesaving_Tips_and_Tricks_in_Microsoft_2013?= From: =?UTF-8?Q?Aventis=20Learning=20Group?= X-ASG-Orig-Subj: =?UTF-8?Q?Boost_Up_Your_Productivity_with_Timesaving_Tips_and_Tricks_in_Microsoft_2013?= List-Id: MTIxNjQ5OC00NTYwNjczLTExMA== List-Unsubscribe: , Content-Type: multipart/alternative; boundary="-------?=_34446-9758955111934" MIME-Version: 1.0 Precedence: bulk Feedback-ID: ded_153.92.230.9:1216498:1216498_118:Sendinblue X-Mailer: Sendinblue X-Mailin-Client: 1216498 X-Mailin-Campaign: 118 Reply-To: fta@aventisglobal.edu.sg Message-Id: <201608010704.pqbd6282lpe4zj@seminar-singapore.com> Date: Mon, 01 Aug 2016 07:04:26 +0200 X-Barracuda-Connect: seminar-singapore.com[153.92.230.9] X-Barracuda-Start-Time: 1470028836 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 46608 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, REMOVE_BEFORE_LINK X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 REMOVE_BEFORE_LINK BODY: Removal phrase right before a link -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message ---------?=_34446-9758955111934 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable MS Excel 2013 Basics for Business Analysis and Reporting =C2=A0 [ View i= n browser ]( http://r.seminar-singapore.com/2s7fnl5jktpe4zf.html ) =C2= =A0 Microsoft Excel 2013 Basics for Business Analysis and Reporting= Boost Up Your Productivity with Timesaving Tips =C2=A0in Micro= soft =C2=A02013=0A14 - 15 Sep 2016 (Wed & Thu)| Concorde Hotel, Singapore = =C2=A0=0A=0AYour Challenge: How to replace manual tracking of busine= ss data to automated reports=0A=C2=A0=0ADo you want to learn how to:=0A= =C2=A0=0AEasily identify data trends using graphs or charts? Quickly store,= sort, and analyze large amounts of data/information? Perform mathematical = operations with ease?=0A=C2=A0=0AReplacing manual tracking of business data= to automated templates will make it easy for you to monitor financial perf= ormance, such as business profit or loss, calculate payments on large purch= ases, plan a budget, or stay organized with checklists.=0A=C2=A0=0AOur Solu= tion: MS Excel 2013 tips and tricks=0A=C2=A0=0AMicrosoft Excel is one of th= e most powerful tools in Microsoft Office Suite of Microsoft Office applica= tion. This application is used intensively to keep track of important data = that drives the business.=0A=C2=A0=0AYou can use Microsoft Excel to manage = all your business data such as maintain customer lists, create employee sch= eduling, prepare Financial Statements, find business templates, calculate t= he costs of your business using formulas, and prepare impressive business r= eports.=C2=A0=0A=C2=A0=0A=C2=A0=0AKey Takeaways=0A=C2=A0=0AThis workshop wi= ll prepare you to start using Excel on your own. Throughout the course, you= will learn interesting and useful tips and tricks to allow you work more e= fficiently with Excel.=0A=C2=A0=0AReady-made templates online for free Lear= n to create your own customized templates. Prepare Income Statements, Cash = Flows and Balance Sheet. Formatting reports using conditional formatting ru= les and styles. Calculating the costs of doing business with financial form= ulas. Create interactive charts with data stored in an Excel Table. Summari= ze data with interactive PivotTable and PivotChart.=0A=C2=A0=0A=0ANote: Par= ticipants are required to bring a laptop with Microsoft Excel 2013. = =C2=A0 =C2=A0=0A=0ATestimonials=0A=C2=A0=0A=E2=80=9CWell done Valene! R= eally enjoy this class. You have been very patient and helpful" - Manager, = Prudential Assurance=0A=0A=E2=80=9CExcellent! I will definitely recommend t= his workshop" - Manager, National Police=0A=C2=A0 =C2=A0 =C2=A0 = Microsoft Business Expert=C2=A0 =C2=A0=0AValene Ang is a Microsoft Cer= tified Trainer and Master Instructor of Microsoft Office Specialist (MOS). = She brings with her 20 years' experience in corporate training and consulta= ncy. Valene has a broad experience in customizing Microsoft Office training= programs, developing customized course outline and course material, assist= ing corporate clients in business data analysis and providing dynamic repor= t solutions. =C2=A0 =C2=A0=0AEVENT DETAILS=0A=C2=A0=0ADate: 14 & 15 = September=0ATime: 9.00am to 5.00pm=0AVenue: 100 Orchard Road Concorde Hotel= , #04-100=0AInvestment Fee: Only S$870 After PIC Grant of 40%=0A=C2=A0=0AC= ontact Us:=C2=A0Ms Vivian Lee|=C2=A06720 3333 |=C2=A0vivian@aventisglobal.e= du.sg =C2=A0 =C2=A0 [ > REGISTER HERE <=C2=A0 ]( http://r.semin= ar-singapore.com/b4tqmcm6b19pe4zd.html ) =C2=A0 =C2=A0=0A=0AThis e= mail was sent to xfs@oss.sgi.com=0AYou received this email because you are = registered with FT Academy=0A=C2=A0=0A[ Unsubscribe here ]( http://r.semina= r-singapore.com/2s7fnl5jktpe4zg.html ) =C2=A0=0A=0ASent by=0A[ ]( http:/= /r.seminar-singapore.com/b4tqmcm6btppe4zd.html ) =C2=A0 =C2=A0=0A=0A= =C2=A9 2016 Financial Training Academy =C2=A0 ---------?=_34446-9758955111934 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Boost Up Your Productivity with Timesaving T= ips and Tricks in Microsoft 2013 =0A=0A=0A=0A=09=0A=09=0A=0A=09=0A=0A=09= =09=0A=09=09=0A=09=0A=0A=09=09=0A=09=09=0A =0A=0A =
MS Excel 2013 Basics for= Business Analysis and Reporting
=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A= =0A=09=09=09=0A=09=09=09=0A=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=0A=09=09=09
=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09= =09= =0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09
 
=0A=09=09=09=09= =09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09View in bro= wser=0A=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09
&nb= sp;
= =0A=09=09=09=09=09
=0A= =09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A=09=09= =09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09= =09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A= =09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09= =0A=09=09=09=0A=09=09=09=0A=0A =0A =0A =0A= =0A=0A =0A =0A =0A=0A=09=09
=0A=0A=09=09=09=0A=09=09=09=0A= =09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09= =0A=09=09=09=0A=0A =0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09= =09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A= =09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09= =0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A = =0A =0A =0A =0A =0A =0A=0A
=0A = =0A=0A =0A =0A = =0A =0A=0A = =0A =0A =0A= =0A=0A=0A =0A =
=0A=0A =0A =
=0A=0A = =0A =0A=0A= =0A = =0A = =0A=0A = =0A = =0A = =0A =0A = =0A = =0A = =0A = =0A =0A= =0A
=0A=0A = =0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09Microsoft Excel 2013 Basics= for Business Analysis and Reporting=0A =
=0A = =0A=0A =
=0A=0A =0A
=0A=0A
=0A =0A=0A=0A =0A = =0A =0A=0A=09=09=0A=09=0A=0A=09=09=0A=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09= =09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A= =09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09= =0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09= =09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09= =09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A = =0A =0A =0A =0A= =0A =0A=0A
=0A =0A=0A = =0A = =0A =0A = =0A =0A=0A =
=0A=0A =0A =0A=0A =0A = =0A = =0A=0A=0A=0A =0A =
=0A=0A = =0A = =0A=0A = =0A = =0A = =0A=0A = =0A =0A = =0A = =0A= =0A = =0A = =0A = =0A = =0A=0A =
=0A=0A = =0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Boost Up Your Productiv= ity with Timesaving Tips  in Microsoft  2013
= =0A14 - 15 Sep 2016 (Wed & Thu)| Concorde Hotel, Singapore
=0A
=0A =0A=0A =
=0A=0A =
=0A=0A
=0A =0A=0A=0A = =0A =0A =0A=0A=09=09=0A=09=0A=0A=09=09= =0A=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09= =09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A= =0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09= =0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09= =09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09= =09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A = =0A =0A=0A=0A =0A =0A =0A =0A= =0A =0A
=0A =0A =0A=0A =0A = =0A =0A = =0A =0A = =0A =0A = =0A =0A = =0A
 
=0A=0A = =0A = =0A = =0A =0A = =0A =0A =0A
=0A=0A = =0A = =0A =0A = =0A = =0A=0A = =0A = =0A = =0A = =0A = =0A = =0A=0A
=0A
Your C= hallenge: How to replace manual tracking of business data to automated repo= rts
=0A=0A
<= span style=3D"font-size:18px;"> 
=0A=0A
Do you want to learn how to:
=0A=0A
 
=0A=0A
    =0A=09
  • Ea= sily identify data trends using graphs or charts?
  • =0A=09<= li style=3D"text-align: justify;">Quickly store, sort, and analyze large amounts of dat= a/information?=0A=09
  • <= span style=3D"color:#000000;">Perform mathe= matical operations with ease?
  • =0A
=0A=0A
 
=0A=0A
Replacin= g manual tracking of business data to automated templates will make it easy= for you to monitor financial performance, such as business profit or loss,= calculate payments on large purchases, plan a budget, or stay organized wi= th checklists.
=0A=0A
 
=0A=0A
Our Solution: MS Excel 2013 tips and tricks<= /span>
=0A=0A
 
=0A=0A
Microsoft Excel= is one of the most powerful tools in Microsoft Office Suite of Microsoft O= ffice application. This application is used intensively to keep track of im= portant data that drives the business.
=0A=0A
 =0A=0A
<= span style=3D"font-size:16px;">You can use Microsoft Excel to manage all yo= ur business data such as maintain customer lists, create employee schedulin= g, prepare Financial Statements, find business templates, calculate the cos= ts of your business using formulas, and prepare impressive business reports= . 
=0A=0A
 
=0A=0A
 
=0A=0A
Key Takeaways
=0A= =0A
 
=0A=0A
This workshop will prepare you to start using Excel on your own. Thro= ughout the course, you will learn interesting and useful tips and tricks to= allow you work more efficiently with Excel.
=0A=0A
 =
=0A=0A
    =0A=09
  • Ready-made templates online fo= r free
  • =0A=09
  • Learn to create your = own customized templates.
  • =0A=09
  • Pr= epare Income Statements, Cash Flows and Balance Sheet.
  • = =0A=09
  • Formatting reports using conditional formattin= g rules and styles.
  • =0A=09
  • Calculat= ing the costs of doing business with financial formulas.
  • = =0A=09
  • Create interactive charts with data stored in = an Excel Table.
  • =0A=09
  • = Summarize da= ta with interactive PivotTable and PivotChart.
  • =0A
= =0A=0A
 
=0A=0A

=0ANote:= Participants are required to bring a laptop with Microsoft Excel 2013.
=0A
=0A
=0A= =0A =0A =
=0A=0A =
 
= =0A=0A
=0A =0A=0A=09=09=0A=09=0A=0A=09=09=0A= =09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09= =09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A = =0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A= =0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09= =0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09= =09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A = =0A =0A=0A=0A =0A =0A =0A =0A = =0A
=0A =0A =0A=0A =0A = =0A =0A = =0A =0A = =0A= =0A =0A = =0A =0A
 
=0A=0A = =0A = =0A = =0A =0A = =0A =0A =
=0A=0A = =0A = =0A =0A = =0A = =0A=0A = =0A = =0A = =0A = =0A =0A = =0A=0A =
=0A
Testimonials=0A=0A
 
=0A=0A
=E2=80=9CWell done Valene! Really enjoy this clas= s. You have been very patient and helpful" - Manager, Prudential As= surance
=0A
=0A=E2=80=9CExcellent! I will definitely recomme= nd this workshop" - Manager, National Police
=
=0A=0A
 
=0A=0A
=0A=0A = =0A =0A
=0A=0A
 
=0A=0A =0A
=0A =0A= =0A=09=09=0A=09=0A=0A=09=09=0A=09=09=0A=0A= =09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A= =0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A=09=09=09=0A=09=09= =09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09= =0A= =09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09= =09=09=0A=09=09=09=09=09=09=09=09=0A=0A=09=09=09= =09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09
 
=0A=0A=09=09=09=09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=09=09=0A=0A=09=09=09=09=09=09=09=09=09=09= =09=0A=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=0A=0A=09=09=09=09= =09=09=09=09=09=09=09= =0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=0A= =09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=09=09=09=09=09=09=0A=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=0A= =09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09= =09=09=09=09=09=09=0A=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09= =09=09=09=09=09=09=09=09=09=09=0A = =0A =0A=0A=09= =09=09=09=09=09=09=09=09=09=09=09
=0A=0A=09=09=09=09=09=09= =09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=0A=09=09=09=09=09=09=09=09= =09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09= =09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=09=09=09=09=09=09=0A=0A=09=09=09=09=09=09=09=09=09=09=09=09
=0A =0A = =0A = =0A = 3D""=0A=09=09=09=09=09=09=09=09=09=09=09=09= =09=09
=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=0A=09=09=09=09=09=09= =09=09=09=09=09
=0A=0A=09= =09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=0A=09=09=09=09=09=09= =09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09
=0A=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=0A =0A=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09Micr= osoft Business Expert =0A=09=09=09=09=09=09=09=09= =09=09=09=09=09=09
=  
Valene Ang is a Microsoft Certified Trainer and Master Instructor= of Microsoft Office Specialist (MOS). She brings with her 20 years' experi= ence in corporate training and consultancy. Valene has a broad experience i= n customizing Microsoft Office training programs, developing customized cou= rse outline and course material, assisting corporate clients in business da= ta analysis and providing dynamic report solutions.
=0A<= /td>=0A=09=09=09=09=09=09=09=09=09=09=09=09=09
=0A=09=09=09=09=09=09=09= =09=09=09=09=09=0A=0A=09=09=09=09=09=09=09=09=09=09=09
=0A=0A= =09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09=09 =0A=09=09=09=09=09=09=09=0A=09=09= =09=09=09=09=0A=0A=09=09=09=09=09=0A=09=09=09=09= =0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09= =09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A= =09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A = =0A =0A=0A=0A =0A =0A =0A= =0A=09=09=0A=09=0A=0A=09=09=0A=09=09=0A=0A= =09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A= =0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A=09=09=09=0A=09=09= =09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09= =09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A= =09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09= =0A=09=09=09=0A=0A =0A =0A =0A=0A=0A = =0A =0A = =0A =0A =0A=09=0A=0A=09=09=0A=09=09
=0A = =0A =0A=0A = =0A =0A = =0A =0A = =0A =0A=09=0A=0A=09=09= =0A=09=09=0A=09=09=09=09=0A=09=09=09
 
=0A=0A =0A =0A = =0A = =0A =0A = =0A =0A = =0A = =0A =0A =0A=0A =0A =0A <= /tbody>
=0A=0A = =0A =0A = =0A = =0A =0A=0A = =0A =0A =0A = =0A = =0A = =0A=0A =0A=0A =0A = =0A = =0A
EVE= NT DETAILS =0A=0A
 
=0A=0A
<= span style=3D"font-size:16px;">Date: 14 &= ; 15 September
=0A=0A
Time: 9.00am to 5.00pm
= =0A=0A
V= enue: 100 Orchard Road Concorde Hotel , #04-100
=0A=0AInvestmen= t Fee: Only S$870 After PIC Grant of 40%=0A=0A
 
=0A=0A
Contact Us: Ms Vivian Lee| 6720 3333 | vivian@avent= isglobal.edu.sg
=0A
=0A=0A =
 
=0A =0A=0A=09=09
=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09= =09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A= =0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09= =0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=09= =0A=09=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A= =09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09
=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A= =09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09= =09=0A=09=09=09=09=09=09=09=09=09
 
=0A=0A=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09
=0A=0A=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09= =09=09=09=0A=0A=09=09=09= =09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09= =09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=0A=09=09=09=09=09=09= =09=09=09=09=09=09
=0A= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09
=0A=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09> REGI= STER HERE < =0A=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09
=0A=09=09=09=09= =09=09=09=09=09=09=09=09=09=09
=0A=09=09=09=09=09=09=09=09=09=09=09=09= =0A=0A=09=09=09=09=09=09=09=09=09=09=09
=0A=0A=09=09=09=09=09= =09=09=09
 
=0A=0A=09=09=09=09=09
=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09= =09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A = =0A =0A =0A=0A=0A =0A = =0A =0A=0A=09=09
=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09= =09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A= =09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09= =0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09= =09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=09=0A=09=09=09= =09=09=0A=09=09=09=09=09=0A=09=0A=0A=09=09=0A=09=09
=0A=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A= =09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09= =09=09=09=09=09=0A =0A=09=09=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09= =09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=0A=09=09=09
 
=0A=09=09=09=09= =09=09=09=09=09
This = email was sent to xfs@oss.sgi.com=0A
You received this email because yo= u are registered with FT Academy
=0A=0A
 
=0A
=0A=0A=09=09=09=09=09=09=09=09=09
=0A=09= =09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09=09Unsubscribe here=0A=09=09=09=09=09= =09=09=09=09
=0A
 
=0A=09=09=09=09=09=09=09=09=09=0A =
=0A =
Sent by
=0A 3D"SendinBlue"<= /a>=0A
=0A=09=09=09=09=09=09=09=09=
=  
= =0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A = =0A =0A=0A=0A =0A =0A = =0A=0A=09=09
=0A= =0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09= =0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A=09=09=09=0A=09= =09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A= =09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09=09= =0A=09=09=09=0A=0A=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A=09=09=09=0A=09=09= =09=0A=09=09=09=09<= tbody>=0A=09=09=09=09=09=0A=09=09=09=09=09
=0A=09=09=09=09=09=09= =0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09=09=09=09= =09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=0A=09= =09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09= =09=09=09=09=09=09=0A=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=0A=09=09=09=09=09=0A=09=09=09=09=0A=09=09=09=0A=09=09=09=0A=0A =0A =0A =0A=0A=0A = =0A =0A =0A=0A=09=09=0A=09=0A
 
=0A= =09=09=09=09=09=09=09=09=09=0A=09=09=09=09=09=09=09=09=09
=C2= =A9 2016 Financial Training Academy
=0A
=0A=09=09=09=09=09=09=09= =09
 
=0A=0A
---------?=_34446-9758955111934-- From info9@kitchen-helper.com Mon Aug 1 00:21:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B10B17CBA for ; Mon, 1 Aug 2016 00:21:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 402998F8035 for ; Sun, 31 Jul 2016 22:21:10 -0700 (PDT) X-ASG-Debug-ID: 1470028866-0bf8157e6d318d50001-NocioJ Received: from kitchen-helper.com ([115.214.61.209]) by cuda.sgi.com with SMTP id g6Nb75EsPEIh0K7x for ; Sun, 31 Jul 2016 22:21:07 -0700 (PDT) X-Barracuda-Envelope-From: info9@kitchen-helper.com X-Barracuda-Effective-Source-IP: UNKNOWN[115.214.61.209] X-Barracuda-Apparent-Source-IP: 115.214.61.209 Received: from MQZ2E3BNIJH5CCE[127.0.0.1] by MQZ2E3BNIJH5CCE[127.0.0.1] (SMTPD32); Mon, 1 Aug 2016 12:52:59 +0800 From: "yyotsales01@163.com" Subject: sink racks To: xfs@oss.sgi.com X-ASG-Orig-Subj: sink racks MIME-Version: 1.0 Sender: info9@kitchen-helper.com Reply-To: yyotsales01@163.com Date: Mon, 1 Aug 2016 12:52:59 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[115.214.61.209] X-Barracuda-Start-Time: 1470028866 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 19431 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160801052110.5E230D80072@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC42MDAxLjIzNTg4Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJNQVJHSU46 IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1Rp bWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vybmlu ZzogMS4wMDAwcHQiPkhpPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1Rp bWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vybmlu ZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBw dCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVz IE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzog MS4wMDAwcHQiPlRoaXMgDQppczwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMz OTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDEuMDAwMHB0Ij4mbmJzcDtRdWVlbmllPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPiZuYnNwO2Zyb20gDQo8L1NQQU4+PFNQQU4gDQpz dHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTog MTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFt aWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij5ZdXlhbyANCk91dGFpIEVs ZWN0cmljYWwgY28uPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVz IE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzog MS4wMDAwcHQiPi5XZSANCmFyZSBhIHByb2Zlc3Npb25hbCBtYW51ZmFjdHVyZXIgYW5kIGRlc2ln bmVyIGluIDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcg Um9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4w MDAwcHQiPiZuYnNwO21ha2luZyANCjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZv bnQta2VybmluZzogMS4wMDAwcHQiPmtpdGNoZW53YXJlIA0KPC9TUEFOPjxTUEFOIA0Kc3R5bGU9 IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+cHJvZDwvU1BBTj48U1BBTiANCnN0 eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAx MC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPnVjdHMscGxhc3RpYyANCmdp ZnRzLGFuZCBob3VzZWhvbGQgcHJvZHVjdHMuPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBt c28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgc3R5 bGU9Ik1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28t Zm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+QWxsIA0Kb3VyIDwvU1BBTj48U1BBTiANCnN0eWxlPSJG T05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovk vZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij5wcm9kdWN0czwvU1BBTj48U1BBTiANCnN0 eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAx MnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij4mbmJzcDtoYXZlIA0KYmVlbiBJ U08gOTAwMSwgYW5kIGdldCBhIGhpZ2ggcmVwdXRhdGlvbiBhbmQgaG90IG1hcmtldCBpbiA8L1NQ QU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBt c28tYmlkaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWFzY2lp LWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28taGFuc2ktZm9udC1m YW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsiPkU8L1NQQU4+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTJwdDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+dXJvcGUgDQphbmQgPC9TUEFOPjxTUEFO IA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWJpZGkt Zm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1hc2NpaS1mb250LWZh bWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAm IzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7Ij5OPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNv LWZvbnQta2VybmluZzogMS4wMDAwcHQiPm9ydGggDQo8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1Rp bWVzIE5ldyBSb21hbiYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTsiPkE8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGlt ZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3ll cyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5n OiAxLjAwMDBwdCI+bWVyaWNhPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovk vZM7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4m IzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7Ij4m bmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJv bWFuJiMzOTs7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dCI+YW5kIA0Kb3RoZXIgY291bnRyaWVzLiA8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28t Zm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9 Ik1BUkdJTjogMHB0OyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMC4wMDAwZ2QiIGNsYXNzPU1zb05v cm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij5Qcm9k dWN0cyANCm1haW5seSBpbmNsdWRlIDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFS R0lOOiAwcHQ7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZCIgY2xhc3M9TXNvTm9ybWFs PjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTJwdDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNv LWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1hc2NpaS1m b250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFt aWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7Ij4mbmJzcDsmbmJzcDs8L1NQQU4+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZh bWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+MSkgDQo8L1NQQU4+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQt U0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij5taWNyb3dhdmUg DQpub29kbGUgYm93bDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1l cyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vybmlu ZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBw dDsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkIiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYmlkaS1m b250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFt aWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYj Mzk7VGltZXMgTmV3IFJvbWFuJiMzOTsiPiZuYnNwOyZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxl PSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0 OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij4yKSANCjwvU1BBTj48U1BBTiANCnN0 eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAx MC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPm1pY3Jvd2F2ZSANCnNvdXAg bXVnPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21h biYjMzk7OyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMHB0OyBtc28tcGFy YS1tYXJnaW4tbGVmdDogMC4wMDAwZ2QiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJG T05ULUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5 OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6ICYjMzk7 VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1oYW5zaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBO ZXcgUm9tYW4mIzM5OyI+Jm5ic3A7Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNv LWZvbnQta2VybmluZzogMS4wMDAwcHQiPjMpIA0KPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVwdDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+bWljcm93YXZlIA0KcmljZSBjb29rZXI8L1NQ QU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7 IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpw PjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwcHQ7IG1zby1wYXJhLW1hcmdp bi1sZWZ0OiAwLjAwMDBnZCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7 VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBO ZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21h biYjMzk7Ij4mbmJzcDsmbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYj Mzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdCI+NCkgDQpkcmFpbiBiYXNrZXQ8L1NQQU4+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTAuNXB0 OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+ DQo8UCBzdHlsZT0iTUFSR0lOOiAwcHQ7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZCIg Y2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovkvZM7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAxLjAwMDBwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMz OTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7Ij4mbmJzcDsmbmJz cDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFu JiMzOTs7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+ NSkgDQpzY29vcCB0cm9vcCBtZWxvbiBiYWxsZXIgYW5kIGZydWl0IHNjb29wIHNldDwvU1BBTj48 U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9O VC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9v OnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdDsgbXNvLXBhcmEtbWFyZ2luLWxl ZnQ6IDAuMDAwMGdkIiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJiMzOTtUaW1l cyBOZXcgUm9tYW4mIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBS b21hbiYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMz OTsiPiZuYnNwOyZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtU aW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5p bmc6IDEuMDAwMHB0Ij42KSANCjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMz OTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQt a2VybmluZzogMS4wMDAwcHQiPnNpbmsgDQpyYWNrczwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9 kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQ IHN0eWxlPSJNQVJHSU46IDBwdDsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkIiBjbGFz cz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpF OiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEu MDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5Ozsg bXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28taGFu c2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsiPiZuYnNwOyZuYnNwOzwv U1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij43KSAN CjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4m IzM5OzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQi PmRlbHV4ZSANCmZhdCBzZXBhcmF0b3I8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1m b250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0i TUFSR0lOOiAwcHQ7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZCIgY2xhc3M9TXNvTm9y bWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTJwdDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsg bXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1hc2Np aS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQt ZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7Ij4mbmJzcDsmbmJzcDs8L1NQQU4+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+OCkgDQo8L1NQQU4+ PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZP TlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij4zLWluIA0K cGVlbGVyPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBS b21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAw MDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMHB0OyBtc28t cGFyYS1tYXJnaW4tbGVmdDogMC4wMDAwZ2QiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxl PSJGT05ULUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1iaWRpLWZvbnQtZmFt aWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6ICYj Mzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1oYW5zaS1mb250LWZhbWlseTogJiMzOTtUaW1l cyBOZXcgUm9tYW4mIzM5OyI+Jm5ic3A7Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPjkpIA0KPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVwdDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+c21hbGwvYmlnIA0KY3JhZnQgc3RvcmFn ZSBib3g8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJv bWFuJiMzOTs7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAw MHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwcHQiIGNsYXNz PU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9t YW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0 Ij4uPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21h biYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQi PjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYj Mzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPlBs PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYj Mzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPmVh c2U8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFu JiMzOTs7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+ Jm5ic3A7ZmVlbCANCmZyZWUgdG8gY29udGFjdCB3aXRoIG1lIGlmIHlvdSB3b3VsZCBsaWtlIHRv IGtub3cgbW9yZSAhIDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1l cyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwcHQi IGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBO ZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEu MDAwMHB0Ij5CLndpc2hlczwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtU aW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5p bmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAw cHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1l cyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0Ij48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lO OiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtU aW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5p bmc6IDEuMDAwMHB0Ij5RdWVlbmllPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAm IzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQt a2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJH SU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5 O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdCI+WXV5YW8gDQpPdXRhaSBFbGVjdHJpY2FsIGNvLjwvU1BBTj48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1T SVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPkNPLiwgDQpMVEQ8 L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMz OTs7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1m YXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48 bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwcHQiIGNsYXNzPU1zb05v cm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPkFk ZHJlc3M6PC9TUEFOPjxCPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5l dyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPk5PLjwvU1BBTj48L0I+PEI+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTAu NXB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+ NjA8L1NQQU4+PC9CPjxCPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5l dyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPiZuYnNwOzwvU1BBTj48L0I+PEI+PFNQQU4gDQpz dHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTog MTAuNXB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dCI+SmluZmVuZzwvU1BBTj48L0I+PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7 VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTAuNXB0OyBGT05ULVdFSUdIVDogYm9s ZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+Jm5ic3A7Um9hZCxZdXlhbyxaaGVq aWFuZyxDTiANCjMxNTQwMDwvU1BBTj48L0I+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYj Mzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFS R0lOOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMz OTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQt a2VybmluZzogMS4wMDAwcHQiPlRlbDo8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1m b250LWtlcm5pbmc6IDEuMDAwMHB0Ij4wNTc0LTYyNjQyOTg5PC9TUEFOPjxTUEFOIA0Kc3R5bGU9 IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEwLjVw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9Q Pg0KPFAgc3R5bGU9Ik1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTAuNXB0 OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij5FbWFpbDogDQo8L1NQQU4+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0la RTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48QSANCmhyZWY9Im1h aWx0bzoyNDM1MTI1MDE3QHFxLmNvbSI+MjQzNTEyNTAxN0BxcS5jb208L0E+PC9TUEFOPjxTUEFO IA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJ WkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48 L1NQQU4+PC9QPg0KPFAgc3R5bGU9Ik1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0la RTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij5za3lwZTo8L1NQQU4+ PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZP TlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwv bzpwPjwvU1BBTj48L1A+PCEtLUVuZEZyYWdtZW50LS0+PC9CT0RZPjwvSFRNTD4NCg0K From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:24:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14F8A7CB8 for ; Mon, 1 Aug 2016 01:24:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8ABEFAC001 for ; Sun, 31 Jul 2016 23:23:59 -0700 (PDT) X-ASG-Debug-ID: 1470032637-0bf8157e6b31cc10001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CIAPzCdJpGLBjxid (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:23:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6dn-0000GG-Sf; Mon, 01 Aug 2016 06:23:55 +0000 Date: Sun, 31 Jul 2016 23:23:55 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 1/2] Remove workaround for getsubopt() on X-ASG-Orig-Subj: Re: [PATCH xfsprogs 1/2] Remove workaround for getsubopt() on MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160730133725.GA5895@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032637 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 326 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Jul 30, 2016 at 03:37:25PM +0200, Felix Janda wrote: > The workaround addressed only a const-correctness warning. > It was wrongly applied also to alternative c libraries on linux. > > Signed-off-by: Felix Janda Didn't I ACK this before? Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:24:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6C6A77CBD for ; Mon, 1 Aug 2016 01:24:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6823AC002 for ; Sun, 31 Jul 2016 23:24:51 -0700 (PDT) X-ASG-Debug-ID: 1470032689-0bf57b369e2c5f30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id PAqrAYPhH29feObL (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:24:50 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6ef-0000Pq-1D; Mon, 01 Aug 2016 06:24:49 +0000 Date: Sun, 31 Jul 2016 23:24:49 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160801062449.GB596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160730133737.GB5895@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032689 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 516 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > int64_t is guaranteed to have the correct size and signedness and is > always avaible because linux.h has a include. > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > public header is included without _LARGEFILE64_SOURCE or > _GNU_SOURCE defined. This bug was introduced in commit > cb898f157f8410a03cf5f3400baa1df9e5eecd33. I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:25:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 765F07CBD for ; Mon, 1 Aug 2016 01:25:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED543AC004 for ; Sun, 31 Jul 2016 23:25:13 -0700 (PDT) X-ASG-Debug-ID: 1470032712-0bf8157e6b31cea0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CoMWHuxVjQXk55wH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:25:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6ez-0001TT-4t; Mon, 01 Aug 2016 06:25:09 +0000 Date: Sun, 31 Jul 2016 23:25:09 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 01/17] xfs/26[34]: remove duplicate tests Message-ID: <20160801062509.GC596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/17] xfs/26[34]: remove duplicate tests References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914478187.11762.1309628175021637188.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914478187.11762.1309628175021637188.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032712 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 367 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:46:21PM -0700, Darrick J. Wong wrote: > These two tests were accidentally double-added as xfs/30[78], but the > newer versions have fixed up helper usage and fewer whitespace > problems, so nuke the old tests. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:25:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CBCC87CCC for ; Mon, 1 Aug 2016 01:25:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9E8C98F8033 for ; Sun, 31 Jul 2016 23:25:32 -0700 (PDT) X-ASG-Debug-ID: 1470032730-0bf57b369c2c6050001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 5ur8AqWzv1gbjb6Z (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:25:31 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6fI-0001fZ-Jr; Mon, 01 Aug 2016 06:25:28 +0000 Date: Sun, 31 Jul 2016 23:25:28 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 02/17] xfs: use rmapbt-checking helper Message-ID: <20160801062528.GD596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/17] xfs: use rmapbt-checking helper References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914478956.11762.1523179302392973799.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914478956.11762.1523179302392973799.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032731 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 263 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:46:29PM -0700, Darrick J. Wong wrote: > Don't open-code _notrun checks for the rmapbt, just use the helper. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:25:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EE05E7CC7 for ; Mon, 1 Aug 2016 01:25:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 74724AC001 for ; Sun, 31 Jul 2016 23:25:50 -0700 (PDT) X-ASG-Debug-ID: 1470032749-0bf8157e6d31cf80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 1sbrUKUAhbVSSICe (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:25:49 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6fb-0001ii-05; Mon, 01 Aug 2016 06:25:47 +0000 Date: Sun, 31 Jul 2016 23:25:46 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 03/17] xfs/310: fix the size calculation for the huge device Message-ID: <20160801062546.GE596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/17] xfs/310: fix the size calculation for the huge device References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914479586.11762.2725828627113169692.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914479586.11762.2725828627113169692.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032749 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 380 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:46:35PM -0700, Darrick J. Wong wrote: > Fix the calculation of the dmhuge size. The previous calculation > tried to calculate the size correctly, but got it wrong for 1k > block sizes. Therefore, clean the whole mess up. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:26:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0D8047CCB for ; Mon, 1 Aug 2016 01:26:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D35EF304039 for ; Sun, 31 Jul 2016 23:26:11 -0700 (PDT) X-ASG-Debug-ID: 1470032769-0bf57c136a26d690001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WUupCFf2JWTAsAgu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:26:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6fv-0001vG-P6; Mon, 01 Aug 2016 06:26:07 +0000 Date: Sun, 31 Jul 2016 23:26:07 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 04/17] xfs/122: list the new log redo items Message-ID: <20160801062607.GF596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/17] xfs/122: list the new log redo items References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914480214.11762.17421079802696784668.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914480214.11762.17421079802696784668.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032770 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 257 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:46:42PM -0700, Darrick J. Wong wrote: > List the new log redo items. These should have stable sizes. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:26:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D2FD87CCF for ; Mon, 1 Aug 2016 01:26:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 560E6AC001 for ; Sun, 31 Jul 2016 23:26:29 -0700 (PDT) X-ASG-Debug-ID: 1470032786-0bf57b369c2c61a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id k9ZhFQClQ4U82fr2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:26:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6gD-0001x8-A3; Mon, 01 Aug 2016 06:26:25 +0000 Date: Sun, 31 Jul 2016 23:26:25 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 05/17] common/reflink: actually test dedupe on scratch device Message-ID: <20160801062625.GG596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/17] common/reflink: actually test dedupe on scratch device References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914480842.11762.9490852645886489605.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914480842.11762.9490852645886489605.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032787 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 265 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:46:48PM -0700, Darrick J. Wong wrote: > In _require_scratch_dedupe, test the scratch device, not the testdev. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:27:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3DA0B7CCA for ; Mon, 1 Aug 2016 01:27:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01FE4304039 for ; Sun, 31 Jul 2016 23:27:23 -0700 (PDT) X-ASG-Debug-ID: 1470032840-0bf57b369c2c6360001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LM6zxFZ3rrMdiU33 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:27:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6h5-00022z-6w; Mon, 01 Aug 2016 06:27:19 +0000 Date: Sun, 31 Jul 2016 23:27:19 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test Message-ID: <20160801062719.GH596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032841 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 322 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:46:54PM -0700, Darrick J. Wong wrote: > Run xfs_repair twice at the end of each test -- once to rebuild > the btree indices, and again with -n to check the rebuild work. This looks fine to me in general, but shouldn't we have specific tests that test the rebuilding in a normal auto run? From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:27:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4001C7CD0 for ; Mon, 1 Aug 2016 01:27:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 12AB98F8033 for ; Sun, 31 Jul 2016 23:27:43 -0700 (PDT) X-ASG-Debug-ID: 1470032860-0bf57c136726d860001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id T6hHV1G0mouMDrbt (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:27:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6hP-00024t-61; Mon, 01 Aug 2016 06:27:39 +0000 Date: Sun, 31 Jul 2016 23:27:39 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 07/17] xfs/128: cycle_mount the scratch device, not the test device Message-ID: <20160801062739.GI596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/17] xfs/128: cycle_mount the scratch device, not the test device References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914482100.11762.3197784490090678443.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914482100.11762.3197784490090678443.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032861 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 323 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:47:01PM -0700, Darrick J. Wong wrote: > This test uses the scratch device, so cycle that, not the test dev. > This is also a xfs_fsr test, so put it in the fsr group. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:27:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 18E267CD3 for ; Mon, 1 Aug 2016 01:27:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2CB5304039 for ; Sun, 31 Jul 2016 23:27:58 -0700 (PDT) X-ASG-Debug-ID: 1470032877-0bf8157e6c31d290001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 8rauqrQoBNfyGLQf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:27:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6hf-000265-5S; Mon, 01 Aug 2016 06:27:55 +0000 Date: Sun, 31 Jul 2016 23:27:55 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 08/17] xfs/129: fix post-metadump remounting idiocy Message-ID: <20160801062755.GJ596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 08/17] xfs/129: fix post-metadump remounting idiocy References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914482728.11762.13650586482755819412.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914482728.11762.13650586482755819412.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032877 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 390 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:47:07PM -0700, Darrick J. Wong wrote: > Use the standard _scratch_mount to mount the filesystem from the restored > image, instead of trying to call mount directly. This is needed in case > we had custom mount options (like rtdev). > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:28:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CF34A7CD4 for ; Mon, 1 Aug 2016 01:28:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9378A8F8033 for ; Sun, 31 Jul 2016 23:28:39 -0700 (PDT) X-ASG-Debug-ID: 1470032918-0bf8157e6c31d3a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id y2cBCEfCHLjdmuDR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:28:38 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6iK-0002F2-94; Mon, 01 Aug 2016 06:28:36 +0000 Date: Sun, 31 Jul 2016 23:28:36 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 09/17] common/dmerror: fix mount option issues Message-ID: <20160801062836.GK596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 09/17] common/dmerror: fix mount option issues References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032918 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 438 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:47:13PM -0700, Darrick J. Wong wrote: > Calling _mount doesn't work when we want to add mount options > such as realtime devices. Since it's just a normal scratch device > mount except for the source device, just call _scratch_mount with > SCRATCH_DEV set to the dmerror device. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:28:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EA2E47CDD for ; Mon, 1 Aug 2016 01:28:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id ADC648F8035 for ; Sun, 31 Jul 2016 23:28:54 -0700 (PDT) X-ASG-Debug-ID: 1470032932-0bf8157e6b31d3e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DA4Ml7gUS3cbnftW (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:28:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6iZ-0002Gs-F8; Mon, 01 Aug 2016 06:28:51 +0000 Date: Sun, 31 Jul 2016 23:28:51 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/17] xfs/179: use scratch device helpers Message-ID: <20160801062851.GL596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 10/17] xfs/179: use scratch device helpers References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914483981.11762.15707981777571396710.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914483981.11762.15707981777571396710.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032933 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 318 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:47:19PM -0700, Darrick J. Wong wrote: > Use the helper functions for scratch devices. This fixes a problem > where xfs/179 fails when there's a realtime device. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:29:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 639F87CDD for ; Mon, 1 Aug 2016 01:29:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3522B304048 for ; Sun, 31 Jul 2016 23:29:08 -0700 (PDT) X-ASG-Debug-ID: 1470032945-0bf57c136826d9e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Q3EDZLs8DkL0TnG2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:29:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6im-0002I6-6d; Mon, 01 Aug 2016 06:29:04 +0000 Date: Sun, 31 Jul 2016 23:29:04 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 11/17] xfs/234: use scratch device helpers Message-ID: <20160801062904.GM596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/17] xfs/234: use scratch device helpers References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914484608.11762.11733588115406137276.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914484608.11762.11733588115406137276.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032946 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 318 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:47:26PM -0700, Darrick J. Wong wrote: > Use the helper functions for scratch devices. This fixes a problem > where xfs/234 fails when there's a realtime device. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:29:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 836F77CDA for ; Mon, 1 Aug 2016 01:29:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04D7AAC002 for ; Sun, 31 Jul 2016 23:29:35 -0700 (PDT) X-ASG-Debug-ID: 1470032973-0bf57c136726da40001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id BjiXqIhvN8RkiFRk (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:29:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6jE-0002KG-Ck; Mon, 01 Aug 2016 06:29:32 +0000 Date: Sun, 31 Jul 2016 23:29:32 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 12/17] reflink: test cross-mountpoint reflink and dedupe Message-ID: <20160801062932.GN596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 12/17] reflink: test cross-mountpoint reflink and dedupe References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914485237.11762.2526971565060691741.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914485237.11762.2526971565060691741.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470032974 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 373 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:47:32PM -0700, Darrick J. Wong wrote: > Test sharing blocks via reflink and dedupe between two different > mountpoints of the same filesystem. This shouldn't work, since > we don't allow cross-mountpoint functions. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:30:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0A8477CE0 for ; Mon, 1 Aug 2016 01:30:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B0C54304062 for ; Sun, 31 Jul 2016 23:30:07 -0700 (PDT) X-ASG-Debug-ID: 1470033006-0bf8157e6c31d5b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id KKH6FX1HEtVZa0ad (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:30:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6jk-0002rU-OL; Mon, 01 Aug 2016 06:30:04 +0000 Date: Sun, 31 Jul 2016 23:30:04 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 16/17] xfs/122: add the realtime rmapbt inode and btree fields Message-ID: <20160801063004.GO596@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 16/17] xfs/122: add the realtime rmapbt inode and btree fields References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914488084.11762.2546324713817812928.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914488084.11762.2546324713817812928.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033006 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 252 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 21, 2016 at 04:48:00PM -0700, Darrick J. Wong wrote: > Add the on-disk structures added by the realtime rmapbt. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:31:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9FBFB7CDC for ; Mon, 1 Aug 2016 01:31:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 637B88F8035 for ; Sun, 31 Jul 2016 23:31:34 -0700 (PDT) X-ASG-Debug-ID: 1470033091-0bf57c136a26dbc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id BmQo3AnL3NIbKUCY (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:31:32 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6l6-0004dy-9r; Mon, 01 Aug 2016 06:31:28 +0000 Date: Sun, 31 Jul 2016 23:31:28 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Al Viro , linux-api@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, "Kirill A. Shutemov" , Vlastimil Babka Subject: Re: [PATCH] vfs: cap dedupe request structure size at PAGE_SIZE Message-ID: <20160801063128.GA15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] vfs: cap dedupe request structure size at PAGE_SIZE References: <20160728183534.GB15753@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160728183534.GB15753@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033092 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 958 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 28, 2016 at 11:35:34AM -0700, Darrick J. Wong wrote: > Kirill A. Shutemov reports that the kernel doesn't try to cap dest_count > in any way, and uses the number to allocate kernel memory. This causes > high order allocation warnings in the kernel log if someone passes in a > big enough value. We should clamp the allocation at PAGE_SIZE to avoid > stressing the VM. > > The two existing users of the dedupe ioctl never send more than 120 > requests, so we can safely clamp dest_range at PAGE_SIZE, because with > 4k pages we can handle up to 127 dedupe candidates. Given the max > extent length of 16MB, we can end up doing 2GB of IO which is plenty. Looks fine, Reviewed-by: Christoph Hellwig > @@ -582,6 +582,10 @@ static int ioctl_file_dedupe_range(struct file *file, void __user *arg) This function returns long in mainline. Maybe you should resend your return type fix to Al while you're at it? From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:32:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D117D7CE3 for ; Mon, 1 Aug 2016 01:32:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 941608F8033 for ; Sun, 31 Jul 2016 23:32:10 -0700 (PDT) X-ASG-Debug-ID: 1470033128-0bf57c136726dc30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id yqNMN5dYEnZrvKdw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:32:09 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6lk-0004jL-3Y; Mon, 01 Aug 2016 06:32:08 +0000 Date: Sun, 31 Jul 2016 23:32:08 -0700 From: Christoph Hellwig To: David Binderman Cc: david@fromorbit.com, xfs@oss.sgi.com, Linux Kernel Mailing List , dcb314@hotmail.com Subject: Re: xfs_icache.c:1298]: (style) Redundant condition Message-ID: <20160801063208.GB15590@infradead.org> X-ASG-Orig-Subj: Re: xfs_icache.c:1298]: (style) Redundant condition References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033129 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 527 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Jul 25, 2016 at 04:13:28PM +0100, David Binderman wrote: > Hello there, > > linux-4.7/fs/xfs/xfs_icache.c:1298]: (style) Redundant condition: > eofb. '!eofb || (eofb && eofb.eof_scan_owner!=0)' is equivalent to > '!eofb || eofb.eof_scan_owner!=0' > > Source code is > > ASSERT(!eofb || (eofb && eofb->eof_scan_owner != 0)); > > Maybe better code > > ASSERT(!eofb || (eofb->eof_scan_owner != 0)); Yes, that would be better. But it's probably not worth changing existing code just for that. From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:33:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C4B7E7CE0 for ; Mon, 1 Aug 2016 01:33:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 966298F8033 for ; Sun, 31 Jul 2016 23:33:31 -0700 (PDT) X-ASG-Debug-ID: 1470033209-0bf57b369e2c6d90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id mmAuwqCxfYHYfdnB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:33:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6mw-0004pJ-Br; Mon, 01 Aug 2016 06:33:22 +0000 Date: Sun, 31 Jul 2016 23:33:22 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 01/47] vfs: fix return type of ioctl_file_dedupe_range Message-ID: <20160801063322.GC15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/47] vfs: fix return type of ioctl_file_dedupe_range References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907696757.25461.13451944377009612990.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907696757.25461.13451944377009612990.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033209 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 424 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 09:56:07PM -0700, Darrick J. Wong wrote: > All the VFS functions in the dedupe ioctl path return int status, so > the ioctl handler ought to as well. > > Found by Coverity, CID 1350952. > > Signed-off-by: Darrick J. Wong Nothing to do with rmap, or XFS for that matter. Please send it directly to Al. Otherwise: Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:33:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D41637CE0 for ; Mon, 1 Aug 2016 01:33:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A5B0E8F8033 for ; Sun, 31 Jul 2016 23:33:59 -0700 (PDT) X-ASG-Debug-ID: 1470033237-0bf57b369b2c6df0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Zmnp3HFcrA1kyn0W (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:33:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6nT-0004r1-RN; Mon, 01 Aug 2016 06:33:55 +0000 Date: Sun, 31 Jul 2016 23:33:55 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 02/47] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE Message-ID: <20160801063355.GD15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/47] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907697404.25461.4210564656872865210.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907697404.25461.4210564656872865210.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033237 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 313 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 09:56:14PM -0700, Darrick J. Wong wrote: > Introduce XFLAGs for the new XFS reflink inode flag and the CoW extent > size hint, and actually plumb the CoW extent size hint into the fsxattr > structure. This has nothing to do with rmap support, please move it to the reflink series. From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:34:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 781F37CE0 for ; Mon, 1 Aug 2016 01:34:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A97A304048 for ; Sun, 31 Jul 2016 23:34:22 -0700 (PDT) X-ASG-Debug-ID: 1470033259-0bf57b369d2c6e70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Egapr0xkctEznKwZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:34:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6nq-0004rw-9t; Mon, 01 Aug 2016 06:34:18 +0000 Date: Sun, 31 Jul 2016 23:34:18 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 03/47] xfs: fix attr shortform structure alignment on cris Message-ID: <20160801063418.GE15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/47] xfs: fix attr shortform structure alignment on cris References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907698036.25461.13007151908183013504.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907698036.25461.13007151908183013504.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033260 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 438 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 09:56:20PM -0700, Darrick J. Wong wrote: > Apparently cris doesn't require structure stride to align with the > largest type in the struct, so list[0] isn't at offset 4 like it is > everywhere else. Fix this... insofar as existing XFSes on cris are > screwed. > > Signed-off-by: Darrick J. Wong Looks fine and should go in ASAP: Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:35:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 92DFD7CE0 for ; Mon, 1 Aug 2016 01:35:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07364AC001 for ; Sun, 31 Jul 2016 23:35:00 -0700 (PDT) X-ASG-Debug-ID: 1470033298-0bf57b369c2c6f20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id pe8lgbeA2kicO5vd (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:34:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6oR-0004uo-89; Mon, 01 Aug 2016 06:34:55 +0000 Date: Sun, 31 Jul 2016 23:34:55 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 04/47] xfs: fix locking of the rt bitmap/summary inodes Message-ID: <20160801063455.GF15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/47] xfs: fix locking of the rt bitmap/summary inodes References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907698690.25461.7316591529865921141.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907698690.25461.7316591529865921141.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033298 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 478 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 09:56:26PM -0700, Darrick J. Wong wrote: > When we're deleting realtime extents, we need to lock the summary > inode in case we need to update the summary info to prevent an assert > on the rsumip inode lock on a debug kernel. While we're at it, fix > the locking annotations so that we avoid triggering lockdep warnings. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:35:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 17F217CE0 for ; Mon, 1 Aug 2016 01:35:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9134FAC002 for ; Sun, 31 Jul 2016 23:35:47 -0700 (PDT) X-ASG-Debug-ID: 1470033346-0bf8157e6d31dc10001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id dCUH0NDbuoAC9tit (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:35:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6pC-00069Y-Ve; Mon, 01 Aug 2016 06:35:42 +0000 Date: Sun, 31 Jul 2016 23:35:42 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 05/47] xfs: set *stat=1 after iroot realloc Message-ID: <20160801063542.GG15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/47] xfs: set *stat=1 after iroot realloc References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907699326.25461.8018421055879226973.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907699326.25461.8018421055879226973.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033346 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 354 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 09:56:33PM -0700, Darrick J. Wong wrote: > If we make the inode root block of a btree unfull by expanding the > root, we must set *stat to 1 to signal success, rather than leaving > it uninitialized. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:37:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 290DF7CE0 for ; Mon, 1 Aug 2016 01:37:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EF563304051 for ; Sun, 31 Jul 2016 23:37:17 -0700 (PDT) X-ASG-Debug-ID: 1470033435-0bf57c136726e030001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id S1VvBDNy56jHo4X6 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:37:16 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6qc-0006Gz-Ik; Mon, 01 Aug 2016 06:37:10 +0000 Date: Sun, 31 Jul 2016 23:37:10 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 06/47] xfs: during btree split, save new block key & ptr for future insertion Message-ID: <20160801063710.GH15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/47] xfs: during btree split, save new block key & ptr for future insertion References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907699965.25461.15978861148226786001.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907699965.25461.15978861148226786001.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033436 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 54 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Nice! Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:39:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 78F387CED for ; Mon, 1 Aug 2016 01:39:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49101304048 for ; Sun, 31 Jul 2016 23:39:07 -0700 (PDT) X-ASG-Debug-ID: 1470033545-0bf57b369b2c7310001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id zp7oQzQhguJFhMqQ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:39:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU6sQ-0006NP-Lm; Mon, 01 Aug 2016 06:39:02 +0000 Date: Sun, 31 Jul 2016 23:39:02 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 07/47] xfs: add function pointers for get/update keys to the btree Message-ID: <20160801063902.GI15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/47] xfs: add function pointers for get/update keys to the btree References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907700604.25461.2181974283557088355.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907700604.25461.2181974283557088355.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470033545 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 583 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31663 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 09:56:46PM -0700, Darrick J. Wong wrote: > Add some function pointers to bc_ops to get the btree keys for > leaf and node blocks, and to update parent keys of a block. > Convert the _btree_updkey calls to use our new pointer, and > modify the tree shape changing code to call the appropriate > get_*_keys pointer instead of _btree_copy_keys because the > overlapping btree has to calculate high key values. I don't really like to add ops for something that isn't really per-btree type. Can you just add an overlapping flag and act based on that? From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:48:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A409B7CF1 for ; Mon, 1 Aug 2016 01:48:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 74237304048 for ; Sun, 31 Jul 2016 23:48:23 -0700 (PDT) X-ASG-Debug-ID: 1470034100-0bf57c136726e5c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GeJhXfplBRPQmCDe (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:48:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU71O-00026n-78; Mon, 01 Aug 2016 06:48:18 +0000 Date: Sun, 31 Jul 2016 23:48:18 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys Message-ID: <20160801064818.GJ15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470034101 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3192 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > v2: When we're deleting a record in a btree that supports overlapped > interval records and the deletion results in two btree blocks being > joined, we defer updating the high/low keys until after all possible > joining (at higher levels in the tree) have finished. At this point, > the btree pointers at all levels have been updated to remove the empty > blocks and we can update the low and high keys. > > When we're doing this, we must be careful to update the keys of all > node pointers up to the root instead of stopping at the first set of > keys that don't need updating. This is because it's possible for a > single deletion to cause joining of multiple levels of tree, and so > we need to update everything going back to the root. > > v3: Make diff_two_keys return < 0, 0, or > 0 if key1 is less than, > equal to, or greater than key2, respectively. This is consistent > with the rest of the kernel and the C library. Clarify some comments > and refactor the sibling_update function out of existence. Check the > return value of btree_updkeys(). The changelogs go below the "-- " marker so that they don't appear in the git log. That is unless they actually are useful like this one and should be merged into the actual patch description instead of being worded incrementally. > +++ b/fs/xfs/libxfs/xfs_btree.c > @@ -51,7 +51,6 @@ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { > #define xfs_btree_magic(cur) \ > xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] > > - > STATIC int /* error (0 or EFSCORRUPTED) */ > xfs_btree_check_lblock( > struct xfs_btree_cur *cur, /* btree cursor */ Random whitespace change that probably shouldn't be in the patch. > @@ -428,6 +427,50 @@ xfs_btree_dup_cursor( > * into a btree block (xfs_btree_*_offset) or return a pointer to the given > * record, key or pointer (xfs_btree_*_addr). Note that all addressing > * inside the btree block is done using indices starting at one, not zero! > + * > + * If XFS_BTREE_OVERLAPPING is set, then this btree supports keys containing And here we already have the flag I asked for in the last patch. I think that should be enough to drop the new methods. > +/* > + * In-core key that holds both low and high keys for overlapped btrees. > + * The two keys are packed next to each other on disk, so do the same > + * in memory. Preserve the existing xfs_btree_key as a single key to > + * avoid the mental model breakage that would happen if we passed a > + * bigkey into a function that operates on a single key. > + */ > +union xfs_btree_bigkey { > + struct xfs_bmbt_key bmbt; > + xfs_bmdr_key_t bmbr; /* bmbt root block */ > + xfs_alloc_key_t alloc; > + struct xfs_inobt_key inobt; > +}; I don't understand the purpose of this union at all, and the comment seems misleading. Compared to union xfs_btree_key the only difference seems to be that xfs_btree_bigkey is missing the 'struct xfs_rmap_key rmap' member. How does that enable us to holds low and high keys? Also every single user seems to cast it to xfs_btree_key which is a little odd and smells unsafe. From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 01:50:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D326D7CF1 for ; Mon, 1 Aug 2016 01:50:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3FCF304051 for ; Sun, 31 Jul 2016 23:50:40 -0700 (PDT) X-ASG-Debug-ID: 1470034238-0bf57c136926e6a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id zMrBsUxGGlSnQkrO (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 31 Jul 2016 23:50:38 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU73b-0003OM-Td; Mon, 01 Aug 2016 06:50:35 +0000 Date: Sun, 31 Jul 2016 23:50:35 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 10/47] xfs: refactor btree owner change into a separate visit-blocks function Message-ID: <20160801065035.GK15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 10/47] xfs: refactor btree owner change into a separate visit-blocks function References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907702579.25461.15346459038604068167.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907702579.25461.15346459038604068167.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470034238 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 443 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 09:57:05PM -0700, Darrick J. Wong wrote: > Refactor the btree_change_owner function into a more generic apparatus > which visits all blocks in a btree. We'll use this in a subsequent > patch for counting btree blocks for AG reservations. > > Signed-off-by: Darrick J. Wong > Reviewed-by: Brian Foster Looks fine, Reviewed-by: Christoph Hellwig From felix.janda@posteo.de Mon Aug 1 01:54:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C924C7CF4 for ; Mon, 1 Aug 2016 01:54:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8B93E304051 for ; Sun, 31 Jul 2016 23:54:40 -0700 (PDT) X-ASG-Debug-ID: 1470034475-0bf57c136a26e890001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id fCQMXCWxNPQQwuaJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 31 Jul 2016 23:54:37 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 8F0F920900 for ; Mon, 1 Aug 2016 08:54:35 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s2qnk4gFJz105k; Mon, 1 Aug 2016 08:54:30 +0200 (CEST) Date: Mon, 1 Aug 2016 08:54:10 +0200 From: Felix Janda To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160801065410.GA341@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801062449.GB596@infradead.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470034476 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 713 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Christoph Hellwig wrote: > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > int64_t is guaranteed to have the correct size and signedness and is > > always avaible because linux.h has a include. > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > public header is included without _LARGEFILE64_SOURCE or > > _GNU_SOURCE defined. This bug was introduced in commit > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. Thanks for the suggestion, but that does not work if the system header defining (or not) off64_t is included before the xfs headers. --- Felix From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 02:08:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7B9217CF7 for ; Mon, 1 Aug 2016 02:08:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65006AC001 for ; Mon, 1 Aug 2016 00:08:47 -0700 (PDT) X-ASG-Debug-ID: 1470035323-0bf8157e6c31edc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id L7KPJMpKOhRUVj4V (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 00:08:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU7L6-0003Bx-DY; Mon, 01 Aug 2016 07:08:40 +0000 Date: Mon, 1 Aug 2016 00:08:40 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 11/47] xfs: move deferred operations into a separate file Message-ID: <20160801070840.GL15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/47] xfs: move deferred operations into a separate file References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470035323 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 975 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > + * NOTE: To avoid exceeding the transaction reservation, we limit the > + * number of items that we attach to a given xfs_defer_pending. This seems like a new feature compared to the old bmap_free code, can you explain it it in a little more detail? As I'm trying to compare this code to the existing one there are a few things that confuse me, most importantly the purpose of the xfs_defer_pending structure, which seems like a new indirection. I don't really like that indirection at all, as it introduces another memory allocation deep down in the commit path where we can't recover from ENOMEM. Also there seems to be a 1:1 relationship between it and the xfs_bmap_free_item structure that got renamed to xfs_extent_free_item. > +static const struct xfs_defer_op_type *defer_op_types[XFS_DEFER_OPS_TYPE_MAX]; We shouldn't really need this global array and the xfs_defer_ops_type enum, just pass the xfs_defer_op_type pointer into xfs_defer_add. From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 02:09:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 365FB7CFB for ; Mon, 1 Aug 2016 02:09:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF74C30405F for ; Mon, 1 Aug 2016 00:09:06 -0700 (PDT) X-ASG-Debug-ID: 1470035345-0bf8157e6b31edf0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id E0g39DCjYc9Phr4y (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 00:09:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU7LR-0003HX-FN; Mon, 01 Aug 2016 07:09:01 +0000 Date: Mon, 1 Aug 2016 00:09:01 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 13/47] xfs: clean up typedef usage in the EFI/EFD handling code Message-ID: <20160801070901.GM15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 13/47] xfs: clean up typedef usage in the EFI/EFD handling code References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907705011.25461.9159996141406923498.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907705011.25461.9159996141406923498.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470035345 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 02:12:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 61D907CF9 for ; Mon, 1 Aug 2016 02:12:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 310D3304051 for ; Mon, 1 Aug 2016 00:12:42 -0700 (PDT) X-ASG-Debug-ID: 1470035559-0bf57c136a26efa0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 5WRQUvbxEXtZiLpI (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 00:12:39 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU7Ov-0005HR-Cv; Mon, 01 Aug 2016 07:12:37 +0000 Date: Mon, 1 Aug 2016 00:12:37 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 38/47] xfs: create rmap update intent log items Message-ID: <20160801071237.GO15590@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 38/47] xfs: create rmap update intent log items References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907721624.25461.1280539951915485473.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907721624.25461.1280539951915485473.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470035559 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9350 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 10:00:16PM -0700, Darrick J. Wong wrote: > Create rmap update intent/done log items to record redo information in > the log. Because we need to roll transactions between updating the > bmbt mapping and updating the reverse mapping, we also have to track > the status of the metadata updates that will be recorded in the > post-roll transactions, just in case we crash before committing the > final transaction. This mechanism enables log recovery to finish what > was already started. > > Signed-off-by: Darrick J. Wong > Reviewed-by: Brian Foster There is absolutely no need to log the extent array in the rmap update done item. We have always done this for the EFD, but if you look at it it's not actually needed there either. Something like the patch below (relative to your whole tree) will fix this up and reduce the amount of data logged: diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index a8d794d..a6eed43 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -658,9 +658,8 @@ struct xfs_rui_log_format { struct xfs_rud_log_format { __uint16_t rud_type; /* rud log item type */ __uint16_t rud_size; /* size of this item */ - __uint32_t rud_nextents; /* # of extents freed */ + __uint32_t __pad; __uint64_t rud_rui_id; /* id of corresponding rui */ - struct xfs_map_extent rud_extents[1]; /* array of extents rmapped */ }; /* diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index e51fd2b..e8638fd 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3482,9 +3482,7 @@ xlog_recover_rud_pass2( struct xfs_ail *ailp = log->l_ailp; rud_formatp = item->ri_buf[0].i_addr; - ASSERT(item->ri_buf[0].i_len == (sizeof(struct xfs_rud_log_format) + - ((rud_formatp->rud_nextents - 1) * - sizeof(struct xfs_map_extent)))); + ASSERT(item->ri_buf[0].i_len == sizeof(struct xfs_rud_log_format)); rui_id = rud_formatp->rud_rui_id; /* diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c index 6d6cc3b..7e47432 100644 --- a/fs/xfs/xfs_rmap_item.c +++ b/fs/xfs/xfs_rmap_item.c @@ -273,36 +273,13 @@ static inline struct xfs_rud_log_item *RUD_ITEM(struct xfs_log_item *lip) } STATIC void -xfs_rud_item_free(struct xfs_rud_log_item *rudp) -{ - if (rudp->rud_format.rud_nextents > XFS_RUD_MAX_FAST_EXTENTS) - kmem_free(rudp); - else - kmem_zone_free(xfs_rud_zone, rudp); -} - -/* - * This returns the number of iovecs needed to log the given rud item. - * We only need 1 iovec for an rud item. It just logs the rud_log_format - * structure. - */ -static inline int -xfs_rud_item_sizeof( - struct xfs_rud_log_item *rudp) -{ - return sizeof(struct xfs_rud_log_format) + - (rudp->rud_format.rud_nextents - 1) * - sizeof(struct xfs_map_extent); -} - -STATIC void xfs_rud_item_size( struct xfs_log_item *lip, int *nvecs, int *nbytes) { *nvecs += 1; - *nbytes += xfs_rud_item_sizeof(RUD_ITEM(lip)); + *nbytes += sizeof(struct xfs_rud_log_format); } /* @@ -320,13 +297,11 @@ xfs_rud_item_format( struct xfs_rud_log_item *rudp = RUD_ITEM(lip); struct xfs_log_iovec *vecp = NULL; - ASSERT(rudp->rud_next_extent == rudp->rud_format.rud_nextents); - rudp->rud_format.rud_type = XFS_LI_RUD; rudp->rud_format.rud_size = 1; xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_RUD_FORMAT, &rudp->rud_format, - xfs_rud_item_sizeof(rudp)); + sizeof(struct xfs_rud_log_format)); } /* @@ -374,7 +349,7 @@ xfs_rud_item_unlock( if (lip->li_flags & XFS_LI_ABORTED) { xfs_rui_release(rudp->rud_ruip); - xfs_rud_item_free(rudp); + kmem_zone_free(xfs_rud_zone, rudp); } } @@ -398,7 +373,7 @@ xfs_rud_item_committed( * aborted due to log I/O error). */ xfs_rui_release(rudp->rud_ruip); - xfs_rud_item_free(rudp); + kmem_zone_free(xfs_rud_zone, rudp); return (xfs_lsn_t)-1; } @@ -437,25 +412,14 @@ static const struct xfs_item_ops xfs_rud_item_ops = { struct xfs_rud_log_item * xfs_rud_init( struct xfs_mount *mp, - struct xfs_rui_log_item *ruip, - uint nextents) + struct xfs_rui_log_item *ruip) { struct xfs_rud_log_item *rudp; - uint size; - - ASSERT(nextents > 0); - if (nextents > XFS_RUD_MAX_FAST_EXTENTS) { - size = (uint)(sizeof(struct xfs_rud_log_item) + - ((nextents - 1) * sizeof(struct xfs_map_extent))); - rudp = kmem_zalloc(size, KM_SLEEP); - } else { - rudp = kmem_zone_zalloc(xfs_rud_zone, KM_SLEEP); - } + rudp = kmem_zone_zalloc(xfs_rud_zone, KM_SLEEP); xfs_log_item_init(mp, &rudp->rud_item, XFS_LI_RUD, &xfs_rud_item_ops); rudp->rud_ruip = ruip; - rudp->rud_format.rud_nextents = nextents; rudp->rud_format.rud_rui_id = ruip->rui_format.rui_id; return rudp; @@ -523,7 +487,7 @@ xfs_rui_recover( error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); if (error) return error; - rudp = xfs_trans_get_rud(tp, ruip, ruip->rui_format.rui_nextents); + rudp = xfs_trans_get_rud(tp, ruip); for (i = 0; i < ruip->rui_format.rui_nextents; i++) { rmap = &(ruip->rui_format.rui_extents[i]); diff --git a/fs/xfs/xfs_rmap_item.h b/fs/xfs/xfs_rmap_item.h index 59ef3ec..aefcc3a 100644 --- a/fs/xfs/xfs_rmap_item.h +++ b/fs/xfs/xfs_rmap_item.h @@ -77,21 +77,15 @@ struct xfs_rui_log_item { struct xfs_rud_log_item { struct xfs_log_item rud_item; struct xfs_rui_log_item *rud_ruip; - uint rud_next_extent; struct xfs_rud_log_format rud_format; }; -/* - * Max number of extents in fast allocation path. - */ -#define XFS_RUD_MAX_FAST_EXTENTS 16 - extern struct kmem_zone *xfs_rui_zone; extern struct kmem_zone *xfs_rud_zone; struct xfs_rui_log_item *xfs_rui_init(struct xfs_mount *, uint); struct xfs_rud_log_item *xfs_rud_init(struct xfs_mount *, - struct xfs_rui_log_item *, uint); + struct xfs_rui_log_item *); int xfs_rui_copy_format(struct xfs_log_iovec *buf, struct xfs_rui_log_format *dst_rui_fmt); void xfs_rui_item_free(struct xfs_rui_log_item *); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 45773df..24ef83e 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1770,9 +1770,7 @@ xfs_init_zones(void) if (!xfs_icreate_zone) goto out_destroy_ili_zone; - xfs_rud_zone = kmem_zone_init((sizeof(struct xfs_rud_log_item) + - ((XFS_RUD_MAX_FAST_EXTENTS - 1) * - sizeof(struct xfs_map_extent))), + xfs_rud_zone = kmem_zone_init(sizeof(struct xfs_rud_log_item), "xfs_rud_item"); if (!xfs_rud_zone) goto out_destroy_icreate_zone; diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index bb4b84f..e2bf86a 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -241,7 +241,7 @@ enum xfs_rmap_intent_type; void xfs_rmap_update_init_defer_op(void); struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp, - struct xfs_rui_log_item *ruip, uint nextents); + struct xfs_rui_log_item *ruip); int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, xfs_fileoff_t startoff, diff --git a/fs/xfs/xfs_trans_rmap.c b/fs/xfs/xfs_trans_rmap.c index 8341476..35650d6 100644 --- a/fs/xfs/xfs_trans_rmap.c +++ b/fs/xfs/xfs_trans_rmap.c @@ -129,29 +129,14 @@ xfs_trans_log_start_rmap_update( xfs_trans_set_rmap_flags(rmap, type, whichfork, state); } -/* - * This routine is called to allocate an "rmap update done" - * log item that will hold nextents worth of extents. The - * caller must use all nextents extents, because we are not - * flexible about this at all. - */ struct xfs_rud_log_item * xfs_trans_get_rud( struct xfs_trans *tp, - struct xfs_rui_log_item *ruip, - uint nextents) + struct xfs_rui_log_item *ruip) { struct xfs_rud_log_item *rudp; - ASSERT(tp != NULL); - ASSERT(nextents > 0); - - rudp = xfs_rud_init(tp->t_mountp, ruip, nextents); - ASSERT(rudp != NULL); - - /* - * Get a log_item_desc to point at the new item. - */ + rudp = xfs_rud_init(tp->t_mountp, ruip); xfs_trans_add_item(tp, &rudp->rud_item); return rudp; } @@ -174,8 +159,6 @@ xfs_trans_log_finish_rmap_update( xfs_exntst_t state, struct xfs_btree_cur **pcur) { - uint next_extent; - struct xfs_map_extent *rmap; int error; error = xfs_rmap_finish_one(tp, type, owner, whichfork, startoff, @@ -191,16 +174,6 @@ xfs_trans_log_finish_rmap_update( tp->t_flags |= XFS_TRANS_DIRTY; rudp->rud_item.li_desc->lid_flags |= XFS_LID_DIRTY; - next_extent = rudp->rud_next_extent; - ASSERT(next_extent < rudp->rud_format.rud_nextents); - rmap = &(rudp->rud_format.rud_extents[next_extent]); - rmap->me_owner = owner; - rmap->me_startblock = startblock; - rmap->me_startoff = startoff; - rmap->me_len = blockcount; - xfs_trans_set_rmap_flags(rmap, type, whichfork, state); - rudp->rud_next_extent++; - return error; } @@ -255,7 +228,7 @@ xfs_rmap_update_create_done( void *intent, unsigned int count) { - return xfs_trans_get_rud(tp, intent, count); + return xfs_trans_get_rud(tp, intent); } /* Process a deferred rmap update. */ From david@fromorbit.com Mon Aug 1 02:39:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 03D0F7CFD for ; Mon, 1 Aug 2016 02:39:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C8BFF8F8035 for ; Mon, 1 Aug 2016 00:39:11 -0700 (PDT) X-ASG-Debug-ID: 1470037148-0bf57b369e2c9850001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id lIYtBu5WCsvw0asr for ; Mon, 01 Aug 2016 00:39:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AocOALP7nld5LBnFIGdsb2JhbABdg0WBUoZxnR8GjF+KGYYXAgIBAQKBKE0BAQEBAQEHAQEBAQEBNwFAhF8BBTocIxAIAxgJJQ8FJQMHGhOIMMBkAQEIAgEkHoVEhRWECIYTAQSZM451j0mMMIN3gmGBfyoyhxuBNgEBAQ Received: from ppp121-44-25-197.lns20.syd4.internode.on.net (HELO dastard) ([121.44.25.197]) by ipmail04.adl6.internode.on.net with ESMTP; 01 Aug 2016 17:09:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bU7oY-0001cG-9q; Mon, 01 Aug 2016 17:39:06 +1000 Date: Mon, 1 Aug 2016 17:39:06 +1000 From: Dave Chinner To: Dan Williams Cc: Keith Packard , Jan Kara , "linux-nvdimm@lists.01.org" , XFS Developers , linux-fsdevel , linux-ext4 Subject: Re: Subtle races between DAX mmap fault and write path Message-ID: <20160801073906.GK16044@dastard> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path References: <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <20160801014645.GI16044@dastard> <86k2g15gh8.fsf@hiro.keithp.com> <20160801040737.GJ16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470037148 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2043 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Jul 31, 2016 at 09:39:38PM -0700, Dan Williams wrote: > On Sun, Jul 31, 2016 at 9:07 PM, Dave Chinner wrote: > > OTOH, DAX directly exposes the physical layout to the filesytem. > > And because it's DAX-based pmem and not cached struct pages, we > > can't run vm_map_ram() to virtually map the range we need to see as > > a contiguous range, as we do in XFS for large objects such as directory > > blocks and log buffers. For other large objects such as inode > > clusters, we can directly map each page as the objects within the > > clusters are page aligned and never overlap page boundaries, but > > that only works for inode and dquot buffers. Hence DAX as it stands > > makes it extremely difficult to "retrofit" DAX into all aspects of > > existing fileystems because exposing physical discontiguities breaks > > code that assumes they don't exist. > > On this specific point about page remapping, the administrator can > configure struct pages for pmem and you can detect whether they are > present in the filesystem with pfn_t_has_page(). I.e. you could > require pages be present for XFS, if that helps... It's kinda silly to require struct pages for the entire pmem device if they are only needed for accessing a (comparitively) small amount of metadata. Besides, now that I look at it more deeply, we can't use virtually mapped pmem for the log buffers. We can't allocate memory at the point in time where we work out what LBA in the log we need to map to physical pmem for the current log write. Hence calls to vm_map_ram() can't be used, and so that rules out using mapped page based pmem for log buffers. I'll probably have to rewrite the xlog_write() engine completely to be able to handle discontiguous pages in the iclog buffers before we can consider mapping them via DAX now, and I'm really not sure it's worth the effort. I'd much prefer to spend time designing a native pmem filesystem.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 03:00:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 744617CEC for ; Mon, 1 Aug 2016 03:00:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42401304051 for ; Mon, 1 Aug 2016 01:00:46 -0700 (PDT) X-ASG-Debug-ID: 1470038443-0bf57b369e2cb980001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id o8JMmHOyuT69r5Lx (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 01:00:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU89N-0000im-JH; Mon, 01 Aug 2016 08:00:37 +0000 Date: Mon, 1 Aug 2016 01:00:37 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 09/47] xfs: introduce interval queries on btrees Message-ID: <20160801080037.GA30547@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 09/47] xfs: introduce interval queries on btrees References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701913.25461.16492865819245768513.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907701913.25461.16492865819245768513.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470038443 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 978 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Jul 20, 2016 at 09:56:59PM -0700, Darrick J. Wong wrote: > Create a function to enable querying of btree records mapping to a > range of keys. This will be used in subsequent patches to allow > querying the reverse mapping btree to find the extents mapped to a > range of physical blocks, though the generic code can be used for > any range query. > > v2: add some shortcuts so that we can jump out of processing once > we know there won't be any more records to find. > > v3: document the range query algorithm, refactor the pop-up code, > fix the diff_two_keys usage. > > v4: The overlapped query range function should use the btree get_block > helper because the root block could be an inode, in which case > bc_bufs[nlevels-1] will be NULL. Refactor the key calculations > so that we can return -EINVAL if low > high. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 03:02:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1EC877CFD for ; Mon, 1 Aug 2016 03:02:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A1FD7AC002 for ; Mon, 1 Aug 2016 01:02:30 -0700 (PDT) X-ASG-Debug-ID: 1470038548-0bf8157e6c322620001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id qb8LzLZHVbngJ7xQ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 01:02:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU8B5-0000t5-8F; Mon, 01 Aug 2016 08:02:23 +0000 Date: Mon, 1 Aug 2016 01:02:23 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 11/47] xfs: move deferred operations into a separate file Message-ID: <20160801080223.GB30547@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/47] xfs: move deferred operations into a separate file References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470038549 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 507 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31665 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS I looked over this again and I really don't see the use case of merging it. Yes, the freed extent, rmap and reflink code is fairly similar, but there is all kinds of subtile differences that we need to paper over using methods and flags. I think we're better off not trying to share this code and have a separate, but easily understandable implementation for each btree. At least for the traditional traditional freed extent case the new code also is a lot less optimal than the previous version. From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 03:10:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3895B7D03 for ; Mon, 1 Aug 2016 03:10:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AF79304051 for ; Mon, 1 Aug 2016 01:10:29 -0700 (PDT) X-ASG-Debug-ID: 1470039026-0bf57c136a273da0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id lNiQ20nFGQ6ZX4PD (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 01:10:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU8Ip-0004ST-KW; Mon, 01 Aug 2016 08:10:23 +0000 Date: Mon, 1 Aug 2016 01:10:23 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 18/47] xfs: refactor redo intent item processing Message-ID: <20160801081023.GC30547@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 18/47] xfs: refactor redo intent item processing References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907708421.25461.405239727630066080.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907708421.25461.405239727630066080.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470039027 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1710 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +int > +xfs_efi_recover( > + struct xfs_mount *mp, > + struct xfs_efi_log_item *efip) > +{ > + struct xfs_efd_log_item *efdp; > + struct xfs_trans *tp; > + int i; > + int error = 0; > + xfs_extent_t *extp; > + xfs_fsblock_t startblock_fsb; > + > + ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); > + > + /* > + * First check the validity of the extents described by the > + * EFI. If any are bad, then assume that all are bad and > + * just toss the EFI. > + */ > + for (i = 0; i < efip->efi_format.efi_nextents; i++) { > + extp = &(efip->efi_format.efi_extents[i]); > + startblock_fsb = XFS_BB_TO_FSB(mp, > + XFS_FSB_TO_DADDR(mp, extp->ext_start)); > + if ((startblock_fsb == 0) || > + (extp->ext_len == 0) || > + (startblock_fsb >= mp->m_sb.sb_dblocks) || > + (extp->ext_len >= mp->m_sb.sb_agblocks)) { > + /* > + * This will pull the EFI from the AIL and > + * free the memory associated with it. > + */ > + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > + xfs_efi_release(efip); > + return -EIO; > + } > + } I know it's just a code move, but there are lots of superflous braces here, please remove them. > + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); > + if (error) > + return error; > + efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents); > + > + for (i = 0; i < efip->efi_format.efi_nextents; i++) { > + extp = &(efip->efi_format.efi_extents[i]); and here.. > + ASSERT(XFS_LSN_CMP(last_lsn, lip->li_lsn) >= 0); This new check seems useful, but nothing in the changelog mentions why it has been added. Otherwise this looks fine to me. From BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 1 04:03:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9A36B7D02 for ; Mon, 1 Aug 2016 04:03:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6DC63304048 for ; Mon, 1 Aug 2016 02:03:03 -0700 (PDT) X-ASG-Debug-ID: 1470042179-0bf57c13692760f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rbkEob6WR8JziSpZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 02:03:00 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3661fea9d560e80d7b9c+4726+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bU97j-00030G-4v; Mon, 01 Aug 2016 09:02:59 +0000 From: Christoph Hellwig To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] generic/095: update warning whitelist Date: Mon, 1 Aug 2016 11:02:56 +0200 X-ASG-Orig-Subj: [PATCH] generic/095: update warning whitelist Message-Id: <1470042176-31447-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470042180 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1174 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.20 X-Barracuda-Spam-Status: No, SCORE=1.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31665 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 The recent direct I/O path refactor changed the function name in the racing read case. Update the test case to handle the new name in addition to the old one. Signed-off-by: Christoph Hellwig --- tests/generic/095 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/generic/095 b/tests/generic/095 index c656ef1..4754992 100755 --- a/tests/generic/095 +++ b/tests/generic/095 @@ -125,9 +125,11 @@ $FIO_PROG $fio_config >>$seqres.full 2>&1 filter_xfs_dmesg() { local warn1="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_dio_aio_write.*" - local warn2="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_read_iter.*" + local warn2="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_dio_aio_read.*" + local warn3="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_read_iter.*" sed -e "s#$warn1#Intentional warnings in xfs_file_dio_aio_write#" \ - -e "s#$warn2#Intentional warnings in xfs_file_read_iter#" + -e "s#$warn2#Intentional warnings in xfs_file_dio_aio_read#" \ + -e "s#$warn3#Intentional warnings in xfs_file_read_iter#" } # umount before checking dmesg in case umount triggers any WARNING or Oops -- 2.1.4 From sales05@topa.site Mon Aug 1 04:17:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 646E47D07 for ; Mon, 1 Aug 2016 04:17:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 366698F8035 for ; Mon, 1 Aug 2016 02:16:59 -0700 (PDT) X-ASG-Debug-ID: 1470043017-0bf57b369c2cf1d0001-NocioJ Received: from server1.topa.site (host12.dfhgjhhh.com [47.88.15.216]) by cuda.sgi.com with ESMTP id TPdwUpE5KiATdoPY for ; Mon, 01 Aug 2016 02:16:57 -0700 (PDT) X-Barracuda-Envelope-From: sales05@topa.site X-Barracuda-Effective-Source-IP: host12.dfhgjhhh.com[47.88.15.216] X-Barracuda-Apparent-Source-IP: 47.88.15.216 Received: from PC-201102141339 (218.17.231.77) by server1.topa.site id hjs9ok0e97cn for ; Mon, 1 Aug 2016 17:16:56 +0800 (envelope-from ) From: "hongmypcb1@126.com" Subject: RE:We would like to establish business relationship with your honor company To: xfs@oss.sgi.com X-ASG-Orig-Subj: RE:We would like to establish business relationship with your honor company MIME-Version: 1.0 Sender: sales05@topa.site Reply-To: hongmypcb1@126.com Date: Mon, 1 Aug 2016 17:16:58 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: host12.dfhgjhhh.com[47.88.15.216] X-Barracuda-Start-Time: 1470043017 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10247 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31665 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word Message-Id: <20160801091659.C721D64005C@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8+PEhFQUQ+DQo8TUVUQSBodHRwLWVxdWl2PWNvbnRlbnQtdHlw ZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KPE1FVEEgY29udGVudD0iTVNI VE1MIDYuMDAuMjkwMC42NTUwIiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+DQo8Qk9EWT4NCjxESVYg DQpzdHlsZT0iV09SRC1TUEFDSU5HOiAwcHg7IEZPTlQ6IDE0cHgvMjJweCBBcmlhbDsgVEVYVC1U UkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoNTEsOTIsMTczKTsgVEVYVC1JTkRFTlQ6IDBweDsg V0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1D T0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgb3JwaGFuczogYXV0bzsgd2lkb3dzOiAxOyB3ZWJraXQt dGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQt U0laRTogMTFwdDsgQ09MT1I6IHJnYigwLDAsMTI4KTsgRk9OVC1GQU1JTFk6IEFyaWFsIj5EZWFy PFNQQU4gDQpzdHlsZT0iRk9OVC1XRUlHSFQ6IG5vcm1hbDsgRk9OVC1TSVpFOiAxMXB0OyBDT0xP UjogcmdiKDAsMCwxMjgpOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ Jm5ic3A7Jm5ic3A7UHVyY2hhc2luZyANCk1hbmFnZXImbmJzcDsmbmJzcDs8U1BBTiANCmNsYXNz PUFwcGxlLWNvbnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQQU4+PC9TUEFOPjwvU1BBTj48U1BBTiBs YW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtV0VJR0hUOiBub3JtYWw7IEZPTlQtU0laRTogMTFwdDsg Q09MT1I6IHJnYigwLDAsMTI4KTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlMWTogQXJp YWwiPiw8L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IENP TE9SOiByZ2IoMCw2NCwxMjgpOyBGT05ULUZBTUlMWTog5a6L5L2TIj48bzpwIA0Kc3R5bGU9IkZP TlQtV0VJR0hUOiBub3JtYWw7IEZPTlQtU0laRTogMTFwdDsgQ09MT1I6IHJnYigwLDAsMTI4KTsg Rk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlMWTogQXJpYWwiPjwvbzpwPjwvU1BBTj48L0RJ Vj4NCjxESVYgDQpzdHlsZT0iV09SRC1TUEFDSU5HOiAwcHg7IEZPTlQ6IDE0cHgvMjJweCBBcmlh bDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoNTEsOTIsMTczKTsgVEVYVC1JTkRF TlQ6IDBweDsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFD S0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgb3JwaGFuczogYXV0bzsgd2lkb3dzOiAx OyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+DQo8RElWIGNsYXNzPUZveERpdjIwMTMw ODI2MTcxMzA4ODQzNTQ4Pg0KPERJVj4NCjxESVYgY2xhc3M9Rm94RGl2MjAxMzA4MjMyMzQ5MTYy MDA5ODggc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6IHdoaXRlIj4NCjxESVY+DQo8RElWIGNsYXNz PUZveERpdjIwMTMwODIzMjMxMjM4Njk4Mzg1IHN0eWxlPSJCQUNLR1JPVU5ELUNPTE9SOiB3aGl0 ZSI+DQo8RElWPg0KPERJViBjbGFzcz1Gb3hEaXYyMDEzMDgyMzIyNDAyOTc5NTUwMCBzdHlsZT0i QkFDS0dST1VORC1DT0xPUjogd2hpdGUiPg0KPERJVj4NCjxESVYgY2xhc3M9Rm94RGl2MjAxMzA4 MjExMDI2MjgzMjg2OTA+DQo8RElWPg0KPERJViBjbGFzcz1Gb3hEaXYyMDEzMDYyNzE2NDU0NjAx NTEwNT4NCjxESVY+DQo8RElWIGNsYXNzPUZveERpdjIwMTMwNjI1MTYyMzQ3MDkzNDY5Pg0KPERJ Vj4NCjxESVYgY2xhc3M9Rm94RGl2MjAxMzA2MjUxNjE4MTU2MDk2Mzc+DQo8RElWPg0KPERJViBj bGFzcz1Gb3hEaXYyMDEzMDUyODE2MzI0MDE1NjIwMD4NCjxESVY+DQo8RElWIGNsYXNzPUZveERp djIwMTMwNTI4MTYxMTIxNTE1MTQ5Pg0KPERJVj4NCjxESVYgY2xhc3M9Rm94RGl2MjAxMzA1Mjgx NDMwNDQ1OTM1NjM+DQo8RElWPg0KPERJViBjbGFzcz1Gb3hEaXYyMDEzMDUyODE0MjgwODY4NzIy NT4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVYgY2xhc3M9Rm94RGl2MjAxMzA1MjExNjAyNTc4 NzU0NTU+DQo8RElWPg0KPERJViBjbGFzcz1Gb3hEaXYyMDEzMDUyMTE0MzUwNTkyMTc0OD4NCjxE SVY+DQo8RElWIGNsYXNzPUZveERpdjIwMTMwNTIxMTQyNzQxODkwMzE5Pg0KPERJVj4NCjxESVYg Y2xhc3M9Rm94RGl2MjAxMzA1MjExMTU1NDM3NTA1MzM+DQo8RElWPg0KPERJViBjbGFzcz1Gb3hE aXYyMDEzMDUyMTExNTMwNzA0NjEyMT4NCjxESVY+DQo8RElWIGNsYXNzPUZveERpdjIwMTMwNTIx MTE0NTUxNzUwNjg1Pg0KPERJVj4NCjxESVYgY2xhc3M9Rm94RGl2MjAxMzA1MjAxODA3MDEyOTYx MTY+DQo8RElWPg0KPERJVj4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20g MGNtIDBwdDsgVEVYVC1BTElHTjogbGVmdCIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMg DQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBDT0xPUjogcmdiKDAsMCwxMjgpOyBGT05ULUZBTUlM WTog5a6L5L2TIj4mbmJzcDs8bzpwIA0Kc3R5bGU9IkNPTE9SOiByZ2IoMCwwLDEyOCkiPjwvbzpw PjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQ7IFRFWFQtQUxJR046IGxlZnQiIGFsaWduPWxlZnQ+PEEgDQpzdHlsZT0iQ09MT1I6IHJnYig1 NiwxNDgsMTkzKTsgVEVYVC1ERUNPUkFUSU9OOiBub25lIiB0YXJnZXQ9X2JsYW5rIA0KbmFtZT1P TEVfTElOSzM+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IENPTE9S OiByZ2IoMCwwLDEyOCk7IEZPTlQtRkFNSUxZOiBBcmlhbCI+SSBhbSBDb2NvIENIRU4gDQpmcm9t Jm5ic3A7Jm5ic3A7U2hlbnpoZW4mbmJzcDtIb25nbXkmbmJzcDtQcmVjaXNpb24mbmJzcDtDaXJj dWl0Jm5ic3A7Q28uLCZuYnNwO0x0ZCANCmFuZCBzbyBmb3J0dW5hdGUga25vdyB5b3VyIGNvbXBh bnkgZnJvbSB3ZWJzaXRlLjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNw OzwvU1BBTj48L1NQQU4+PC9BPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAx MXB0OyBDT0xPUjogcmdiKDAsMCwxMjgpOyBGT05ULUZBTUlMWTogQXJpYWwiPkhvbmdteTxCIA0K c3R5bGU9IkNPTE9SOiByZ2IoMCwwLDEyOCkiPjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVk LXNwYWNlPiZuYnNwOzwvU1BBTj48L0I+aXMgYW4gaW50ZXJuYXRpb25hbCBtYW51ZmFjdHVyZXIg DQpzcGVjaWFsaXplZCBpbiB0aGU8U1BBTiBjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5i c3A7PC9TUEFOPjxCPjxVIA0Kc3R5bGU9IkNPTE9SOiByZ2IoMCwwLDEyOCkiPlByaW50ZWQgQ2ly Y3VpdCBCb2FyZHM8L1U+PC9CPjwvU1BBTj48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0iRk9O VC1TSVpFOiAxMXB0OyBDT0xPUjogcmdiKDAsMCwxMjgpOyBGT05ULUZBTUlMWTogQXJpYWwiPjxT UEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48L1NQQU4+PFNQ QU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IENPTE9SOiByZ2IoMCwwLDEy OCk7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ZmllbGQgYW5kIA0KbG9jYXRlZCBpbiBDaGluYS48L1NQ QU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0OyBU RVhULUFMSUdOOiBsZWZ0IiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJG T05ULVNJWkU6IDExcHQ7IENPTE9SOiByZ2IoMCwwLDEyOCk7IEZPTlQtRkFNSUxZOiBBcmlhbCI+ Jm5ic3A7PG86cCANCnN0eWxlPSJDT0xPUjogcmdiKDAsMCwxMjgpIj48L286cD48L1NQQU4+PC9Q Pg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0OyBURVhULUFM SUdOOiBsZWZ0IiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJ WkU6IDExcHQ7IENPTE9SOiByZ2IoMCwwLDEyOCk7IEZPTlQtRkFNSUxZOiBBcmlhbCI+SG9uZ215 IGhhdmUgDQpiZWVuIHdvcmtpbmcgYXMgb25lIG9mIHRoZSBwcm9mZXNzaW9uYWw8U1BBTiANCmNs YXNzPUFwcGxlLWNvbnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQQU4+PEIgc3R5bGU9IkNPTE9SOiBy Z2IoMCwwLDEyOCkiPjxVIA0Kc3R5bGU9IkNPTE9SOiByZ2IoMCwwLDEyOCkiPkNoaW5lc2UgUHJp bnRlZCBDaXJjdWl0IEJvYXJkPC9VPjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNl PiZuYnNwOzwvU1BBTj48L0I+c3VwcGxpZXJzIHdpdGggOSB5ZWFycyYjMzk7IGhpc3RvcnkgaW4g DQpQQ0Igd29ybGR3aWRlIGJ1c2luZXNzLlRoZSBQQ0IgZnJvbSAxLTE2bGF5ZXJzIHdpdGggdGhl IG1hdGVyaWFsIEZSNCxBbHVtaW51bSANCmJhc2UuPC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05v cm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdDsgVEVYVC1BTElHTjogbGVmdCIgDQphbGln bj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBDT0xPUjog cmdiKDAsMCwxMjgpOyBGT05ULUZBTUlMWTogQXJpYWwiPjwvU1BBTj48U1BBTiANCmxhbmc9RU4t VVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBDT0xPUjogcmdiKDAsMCwxMjgpOyBGT05ULUZB TUlMWTog5a6L5L2TIj4mbmJzcDs8L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZP TlQtU0laRTogMTJwdDsgQ09MT1I6IHJnYigwLDAsMTI4KTsgRk9OVC1GQU1JTFk6IOWui+S9kyI+ Jm5ic3A7PG86cCANCnN0eWxlPSJDT0xPUjogcmdiKDAsMCwxMjgpIj48L286cD48L1NQQU4+PC9Q Pg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQ7IFdPUkQt QlJFQUs6IGJyZWFrLWFsbDsgTElORS1IRUlHSFQ6IDIzcHg7IFRFWFQtQUxJR046IGxlZnQiIA0K YWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtV0VJR0hUOiBub3JtYWw7 IEZPTlQtU0laRTogMTFwdDsgQ09MT1I6IHJnYigwLDAsMTI4KTsgTElORS1IRUlHSFQ6IDIzcHg7 IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IEFyaWFsIj5XZSANCmFyZSBsb29raW5n IGZvcndhcmQgdG8gcmVjZWl2aW5nIHlvdXIgaW5xdWlyeSBzb29uIGFuZCBob3BlIHRvJm5ic3A7 ZXN0YWJsaXNoIA0KZ29vZCBidXNpbmVzcyByZWxhdGlvbnNoaXAgd2l0aCB5b3VyIGNvbXBhbnkg Zm9yIG11dHVhbCBiZW5lZml0LjxvOnAgDQpzdHlsZT0iRk9OVC1XRUlHSFQ6IG5vcm1hbDsgRk9O VC1TSVpFOiAxMXB0OyBDT0xPUjogcmdiKDAsMCwxMjgpOyBGT05ULVNUWUxFOiBub3JtYWw7IEZP TlQtRkFNSUxZOiBBcmlhbCI+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBz dHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdDsgVEVYVC1BTElHTjogbGVmdCIgDQphbGlnbj1sZWZ0 PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBDT0xPUjogcmdiKDAs MCwxMjgpOyBGT05ULUZBTUlMWTog5a6L5L2TIj4mbmJzcDs8bzpwIA0Kc3R5bGU9IkNPTE9SOiBy Z2IoMCwwLDEyOCkiPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHls ZT0iTUFSR0lOOiAwY20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDIzcHg7IFRFWFQtQUxJR046IGxl ZnQiIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFw dDsgQ09MT1I6IHJnYigwLDAsMTI4KTsgTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiBB cmlhbCI+VGhhbmtzIA0KeW91IHZlcnkgbXVjaCBmb3Iga2luZGx5IGF0dGVudGlvbiwgYW5kIHdp c2ggeW91IGEgbmljZSBhbmQgZnJ1aXRmdWwgZGF5ITxvOnAgDQpzdHlsZT0iQ09MT1I6IHJnYigw LDAsMTI4KSI+PC9vOnA+PC9TUEFOPjwvUD48L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8SFIg c3R5bGU9IldJRFRIOiAyMTBweDsgSEVJR0hUOiAxcHgiIGFsaWduPWxlZnQgY29sb3I9I2I1YzRk ZiBTSVpFPTE+DQoNCjxESVY+PFNQQU4+DQo8RElWPg0KPERJVj48U1BBTiBsYW5nPUVOLVVTIA0K c3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFu JiMzOTsiPjxGT05UIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09MT1I6IHJnYigwLDAsMjU1 KTsgRk9OVC1TVFlMRTogaXRhbGljOyBGT05ULUZBTUlMWTogQXJpYWwiIA0KZmFjZT0iIiBjb2xv cj0jMDAwMDAxIHNpemU9MT4NCjxESVY+PFNQQU4+DQo8RElWPg0KPERJVj4NCjxQIGNsYXNzPU1z b05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4gbGFuZz1FTi1VUyANCnN0 eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYj Mzk7Ij48Rk9OVCANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IENPTE9SOiByZ2IoMCwwLDI1NSk7 IEZPTlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1GQU1JTFk6IEFyaWFsIiANCmZhY2U9IiIgY29sb3I9 IzAwMDAwMSBzaXplPTE+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7 IEZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7Ij48Rk9OVCANCnN0eWxlPSJG T05ULVNJWkU6IDExcHQ7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZPTlQtU1RZTEU6IGl0YWxpYzsg Rk9OVC1GQU1JTFk6IEFyaWFsIiANCmZhY2U9IiIgY29sb3I9IzAwMDAwMSBzaXplPTE+V2l0aCBN eSBCZXN0IA0KUmVnYXJkcyw8L0ZPTlQ+PC9TUEFOPjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgY2xh c3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BBTiBsYW5nPUVOLVVT IA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJv bWFuJiMzOTsiPjxGT05UIGZhY2U9QXJpYWwgDQpjb2xvcj0jMDAwMGZmPjwvRk9OVD48L1NQQU4+ Jm5ic3A7PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0 Ij48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6 ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsiPjxGT05UIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFw dDsgQ09MT1I6IHJnYigwLDAsMjU1KTsgRk9OVC1TVFlMRTogaXRhbGljOyBGT05ULUZBTUlMWTog QXJpYWwiIA0KZmFjZT0iIiBjb2xvcj0jMDAwMDAxIHNpemU9MT5Db2NvIENIRU48L0ZPTlQ+PC9T UEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+ PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAm IzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7Ij48L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7 Ij48Rk9OVCANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZP TlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1GQU1JTFk6IEFyaWFsIiANCmZhY2U9IiIgY29sb3I9IzAw MDAwMSBzaXplPTE+PFNUUk9ORz48L1NUUk9ORz48QlI+T3ZlcnNlYSBTYWxlcyAvIFNhbGVzIA0K RGVwYXJ0bWVudDwvRk9OVD48QlI+PC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9O VC1TSVpFOiAxMXB0OyBDT0xPUjogcmdiKDAsMCwyNTUpOyBGT05ULVNUWUxFOiBpdGFsaWM7IEZP TlQtRkFNSUxZOiBBcmlhbCI+KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKio8L1NQQU4+PC9QPjwvRElWPjwvRElWPjwvU1BBTj48Rk9O VCANCmNvbG9yPSMwMDQwODA+Jm5ic3A7PC9GT05UPiANCjxQIGNsYXNzPU1zb05vcm1hbCBzdHls ZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJ WkU6IDExcHQ7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZPTlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1G QU1JTFk6IEFyaWFsIj5URUw6Jm5ic3A7Kzg2IA0KNzU1IDI2OTU0MDg0IEV4dCA2MDEmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8bzpwIA0Kc3R5bGU9Ik1BUkdJTi1UT1A6IDBw eDsgRk9OVC1TSVpFOiAxMXB0OyBNQVJHSU4tQk9UVE9NOiAwcHg7IENPTE9SOiByZ2IoMCwwLDI1 NSk7IEZPTlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1GQU1JTFk6IEFyaWFsIj48L286cD48L1NQQU4+ PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0Ij48U1BB TiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09MT1I6IHJnYigwLDAsMjU1 KTsgRk9OVC1TVFlMRTogaXRhbGljOyBGT05ULUZBTUlMWTogQXJpYWwiPkZBWDombmJzcDsrODYt NzU1IA0KODYzNzI2NTM8QlI+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0i TUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6 IDExcHQ7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZPTlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1GQU1J TFk6IEFyaWFsIj5Ta3lwZTombmJzcDtjb2NvaG9uZ215cGNiJm5ic3A7Jm5ic3A7Jm5ic3A7PC9T UEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+ PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IENPTE9SOiByZ2IoMCww LDI1NSk7IEZPTlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1GQU1JTFk6IEFyaWFsIj48U1BBTiANCmxh bmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBDT0xPUjogYmx1ZTsgRk9OVC1GQU1J TFk6IEFyaWFsLCBzYW5zLXNlcmlmIj5FLW1haWw6aG9uZ215cGNiMUAxMjYuY29tJm5ic3A7Jm5i c3A7PC9TUEFOPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjog MGNtIDBjbSAwcHQiPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBD T0xPUjogcmdiKDAsMCwyNTUpOyBGT05ULVNUWUxFOiBpdGFsaWM7IEZPTlQtRkFNSUxZOiBBcmlh bCI+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09MT1I6IGJs dWU7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+V2hhdCYjMzk7c2FwcDo4NjE1OTg2 NjU5MDEzPC9TUEFOPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvU1BBTj48U1BBTiANCmxhbmc9 RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBDT0xPUjogcmdiKDAsMCwyNTUpOyBGT05U LVNUWUxFOiBpdGFsaWM7IEZPTlQtRkFNSUxZOiBBcmlhbCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9T UEFOPjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IENPTE9SOiBy Z2IoMCwwLDI1NSk7IEZPTlQtU1RZTEU6IGl0YWxpYzsgRk9OVC1GQU1JTFk6IEFyaWFsIj48U1BB TiANCmNsYXNzPUFwcGxlLWNvbnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQQU4+PC9TUEFOPjxTUEFO IGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBDT0xPUjogcmdiKDAsMCwyNTUp OyBGT05ULVNUWUxFOiBpdGFsaWM7IEZPTlQtRkFNSUxZOiBBcmlhbCI+Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7PC9TUEFOPjwvUD48L0RJVj48L0ZPTlQ+PC9TUEFOPjwvRElWPjwvRElWPjwvU1BB Tj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJ Vj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0JPRFk+PC9IVE1MPg0KDQo= From boaz@plexistor.com Mon Aug 1 05:13:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A12F87D0A for ; Mon, 1 Aug 2016 05:13:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5869B304048 for ; Mon, 1 Aug 2016 03:13:52 -0700 (PDT) X-ASG-Debug-ID: 1470046428-0bf8157e6c327e50001-NocioJ Received: from mail-wm0-f46.google.com (mail-wm0-f46.google.com [74.125.82.46]) by cuda.sgi.com with ESMTP id CV2SEFSCxyD0QXS8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 03:13:49 -0700 (PDT) X-Barracuda-Envelope-From: boaz@plexistor.com X-Barracuda-Effective-Source-IP: mail-wm0-f46.google.com[74.125.82.46] X-Barracuda-Apparent-Source-IP: 74.125.82.46 Received: by mail-wm0-f46.google.com with SMTP id i5so236692823wmg.0 for ; Mon, 01 Aug 2016 03:13:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plexistor-com.20150623.gappssmtp.com; s=20150623; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-transfer-encoding; bh=BSGmNjcW8hmS5bvBY976Ih5cLjY05WiqH+ixt6MHH6k=; b=qjTnQcxzgsMq674zkaR7sU1qGNkEYctVlth8vugy5XsEKSxta/GW/1acrPWmJYRpIy etmXID/i3Y0fMENqSPHNkcr8yB03yrN+rDYY+p8Zn67pgoM3BK0mkiAoF9dVvOUgKUgN tj89oDcvUgYF0h2oMet5CoAntbTG42RP6i/DUrhwCWayAOxGKdsNbv6hwVPZB8W1Rf0Z cKfcfS/QXABwDsE671a66Itlqd6TLChKx3nQxFMB7JiKrYSGjyGXAIGSceAOln2BZ/aS 29Ssx5/dPvR0locaDX9m9XO7fwo2HxacXwPpKuryLFPj3/JgQfyl5BxlkWFOJrGMhAaP VgRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-transfer-encoding; bh=BSGmNjcW8hmS5bvBY976Ih5cLjY05WiqH+ixt6MHH6k=; b=TanVAhA0iE9FMueeFOw/X+lEIl3DSolW1XLxoScFlCEoN3FxwVlAiFT+eKze7l5Wlf HWIYGNfTmSBGnOkdOxujkNr64pr0WXc0hB3ecST5AiK5MLg+toYrvgI8hvjk6SU+s4mx zk4abJn+474Y+NVfIu/R3HVLmL34AiCCqmoJTlRjrytwM56l7GjKrgfzuTUnnNQVsDi7 bumTu/M2BntIoBKuZJCs3AYaYGWN5htJln0IZVYa/aVj0IilhM8hATzb9HNp40fBlZjV v1aFMymoK0LSPJl82tHVOnnvnddwDDzirsxhGXylQEWb4WuwxV81BWPw4fIBS5xD52lt E4SA== X-Gm-Message-State: AEkoouup0z08ghe8+oIQvfsVLqpXR8WV7NMy8XzfsEl37bowHVv0ZHyHZQrnsUtsBnoWtw== X-Received: by 10.194.235.229 with SMTP id up5mr55082943wjc.69.1470046428240; Mon, 01 Aug 2016 03:13:48 -0700 (PDT) Received: from [10.0.0.5] ([207.232.55.62]) by smtp.googlemail.com with ESMTPSA id pm1sm29728183wjb.40.2016.08.01.03.13.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Aug 2016 03:13:47 -0700 (PDT) Message-ID: <579F20D9.80107@plexistor.com> Date: Mon, 01 Aug 2016 13:13:45 +0300 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Dave Chinner , Dan Williams CC: Jan Kara , "linux-nvdimm@lists.01.org" , XFS Developers , linux-fsdevel , linux-ext4 Subject: Re: Subtle races between DAX mmap fault and write path References: <20160727120745.GI6860@quack2.suse.cz> <20160727211039.GA20278@linux.intel.com> <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path In-Reply-To: <20160730001249.GE16044@dastard> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wm0-f46.google.com[74.125.82.46] X-Barracuda-Start-Time: 1470046429 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2319 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31666 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 07/30/2016 03:12 AM, Dave Chinner wrote: <> > > If we track the dirty blocks from write in the radix tree like we > for mmap, then we can just use a normal memcpy() in dax_do_io(), > getting rid of the slow cache bypass that is currently run. Radix > tree updates are much less expensive than a slow memcpy of large > amounts of data, ad fsync can then take care of persistence, just > like we do for mmap. > No! mov_nt instructions, That "slow cache bypass that is currently run" above is actually faster then cached writes by 20%, and if you add the dirty tracking and cl_flush instructions it becomes x2 slower in the most optimal case and 3 times slower in the DAX case. The network guys have noticed the mov_nt instructions superior performance for years before we pushed DAX into the tree. look for users of copy_from_iter_nocache and the comments when they where introduced, those where used before DAX, and nothing at all to do with persistence. So what you are suggesting is fine only 3 times slower in the current implementation. > We should just make the design assumption that all persistent memory > is volatile, track where we dirty it in all paths, and use the > fastest volatile memcpy primitives available to us in the IO path. The "fastest volatile memcpy primitives available" is what we do today with the mov_nt instructions. > We'll end up with a faster fastpath that if we use CPU cache bypass > copies, dax_do_io() and mmap will be coherent and synchronised, and > fsync() will have the same requirements and overhead regardless of > the way the application modifies the pmem or the hardware platform > used to implement the pmem. > I measured, there is tests running in our labs every night, your suggestion on an ADR system is 3 times slower to reach persistence. Is why I was pushing for MMAP_PMEM_AWARE, because a smart mmap application from user-mode uses mov_nt anyway because it wants that 20% gain regardless of what the Kernel will do. Then it calls fsync() and the Kernel will burn x2 more CPU, just for the sake of burning CPU, because the data is already persistent at the get go. > Cheers, > Dave. As you, I do not care for DAX very much, but please lets keep the physical facts strait Cheers indeed Boaz From lista.unx@gmail.com Mon Aug 1 06:24:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=FREEMAIL_FROM,STOX_REPLY_TYPE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EA2F77D11 for ; Mon, 1 Aug 2016 06:24:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7CD88AC001 for ; Mon, 1 Aug 2016 04:24:07 -0700 (PDT) X-ASG-Debug-ID: 1470050644-0bf8157e6d332d50001-NocioJ Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by cuda.sgi.com with ESMTP id Mn7mF98Qljus71Nf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 04:24:05 -0700 (PDT) X-Barracuda-Envelope-From: lista.unx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Apparent-Source-IP: 74.125.82.67 Received: by mail-wm0-f67.google.com with SMTP id i5so25725978wmg.2 for ; Mon, 01 Aug 2016 04:24:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:from:to:references:subject:date:mime-version :content-transfer-encoding; bh=/FmqyKFCWfEmgOiCnS3qgWdDscJgll0xyMCE5z/cZrk=; b=g4fSdyT0Q62NV0LFj8jDerRkrJgoj1KIqjPWTSFl9KReiEYlfrWmhN5LqcOcvVPeKt /EabYhpXtp9ubuJ7VnreX5Go//rrM/H8/k/DG5Ah0mQK/MyZiNqqJI0Cqi2OUWnuhwGS z5Tah1rUjrOdotIwOdLctqb5ZaX71cESbh/Ugb/KDKy2ijxyLhN3B9lFhMTDBcHc9AM+ /fwhkqhQdMOqBWds/DO6nERpDF+FV4gHV+ishfuD1GFKfarrvCRwo0qEelzlT3O+3eWc ZLsuPCkFsVuqfEWsUgdkp3mPb/CgAKb9DGL26sgbtoaM8Q6lOuNuMBO36XGo36myg2Fb B3dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:references:subject:date :mime-version:content-transfer-encoding; bh=/FmqyKFCWfEmgOiCnS3qgWdDscJgll0xyMCE5z/cZrk=; b=Ib28Gm38rHDyrsNS+Vr3D2bHuvE67t1N1+TMNdhrsLXOpWLa1PdAaKE4pZcMXWy15R sFA+gZxLJJuBGQBEhv0H/PS3h0+/u8nvuvlwudGLiVq8EVznjgBhKamo0CjaYhG0Y3SJ dv4htCA0En7PTaafr4I/Y+uibGqhcaIJxwpw6vBxaffzdsGZuaYaifYwYwXPzBSmfMxa fKMnJD6PcJkqrXdGta3JqfhhTre1SpQBH6WBhnVvs9C0TRfZeGeMNvrFVD0pBWSBgK0Y mWN7ROAbQTQ4OF+SGhqrl4rTA/7lofVY5PammFP9vDNVa6gv9sVd4simSoFWTmFCwqQC 8u0w== X-Gm-Message-State: AEkoouvoLokmBVI7c/2uFwfY5sjvMTj/fr2ukAviGFI+Fs2kAIL1tPuvImaTELjmCSfuvQ== X-Received: by 10.194.104.197 with SMTP id gg5mr50156224wjb.6.1470050643914; Mon, 01 Aug 2016 04:24:03 -0700 (PDT) Received: from dinulap (dev155.demoshop.ro. [5.2.129.155]) by smtp.gmail.com with ESMTPSA id v203sm16585448wmv.2.2016.08.01.04.24.02 for (version=TLS1 cipher=DES-CBC3-SHA bits=112/168); Mon, 01 Aug 2016 04:24:03 -0700 (PDT) Message-ID: <37A306C32B7B409DB062BB807061728D@dinulap> From: "Lista Unx" To: References: <4278AB9734C1445A8E48635B155149F8@dinulap> <83306f91-6bc3-258b-19a8-68e60317de43@sandeen.net> Subject: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug Date: Mon, 1 Aug 2016 14:24:02 +0300 X-ASG-Orig-Subj: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Barracuda-Connect: mail-wm0-f67.google.com[74.125.82.67] X-Barracuda-Start-Time: 1470050645 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2870 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31667 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature ----- Original Message ----- From: "Eric Sandeen" To: Sent: Saturday, July 30, 2016 12:49 AM Subject: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug > Can you include full contents of /proc/mounts? > > If you have something bind-mounted or similar, it will hide it from "du" > traversal. > > -Eric > Yes, see below: # cat /proc/mounts rootfs / rootfs rw 0 0 sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 devtmpfs /dev devtmpfs rw,nosuid,size=32873088k,nr_inodes=8218272,mode=755 0 0 securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0 tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0 devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /run tmpfs rw,nosuid,nodev,mode=755 0 0 tmpfs /sys/fs/cgroup tmpfs ro,nosuid,nodev,noexec,mode=755 0 0 cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups -agent,name=systemd 0 0 pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0 cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0 cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0 cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0 cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0 cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0 cgroup /sys/fs/cgroup/net_cls cgroup rw,nosuid,nodev,noexec,relatime,net_cls 0 0 cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0 cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0 cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0 configfs /sys/kernel/config configfs rw,relatime 0 0 /dev/mapper/centos-root / xfs rw,relatime,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota 0 0 systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=28,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 mqueue /dev/mqueue mqueue rw,relatime 0 0 hugetlbfs /dev/hugepages hugetlbfs rw,relatime 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0 nfsd /proc/fs/nfsd nfsd rw,relatime 0 0 binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0 /dev/mapper/centos-home /home xfs rw,relatime,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota 0 0 /dev/sda1 /boot xfs rw,relatime,attr2,inode64,logbsize=256k,sunit=512,swidth=512,noquota 0 0 tmpfs /run/user/0 tmpfs rw,nosuid,nodev,relatime,size=6576812k,mode=700 0 0 From lista.unx@gmail.com Mon Aug 1 07:00:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=FREEMAIL_FROM,STOX_REPLY_TYPE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 38A3C7D13 for ; Mon, 1 Aug 2016 07:00:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 914B8AC002 for ; Mon, 1 Aug 2016 05:00:13 -0700 (PDT) X-ASG-Debug-ID: 1470052810-0bf57c136a27f9c0001-NocioJ Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by cuda.sgi.com with ESMTP id 4OHT5Z0ESmlQMrxb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 05:00:11 -0700 (PDT) X-Barracuda-Envelope-From: lista.unx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f54.google.com[74.125.82.54] X-Barracuda-Apparent-Source-IP: 74.125.82.54 Received: by mail-wm0-f54.google.com with SMTP id i5so240748464wmg.0 for ; Mon, 01 Aug 2016 05:00:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:from:to:cc:references:subject:date:mime-version :content-transfer-encoding; bh=zu4TSDBNbIIY6zxTWURG9mjdiemkPY2YylKcSPouND4=; b=Gx8SWxuDleoGjrY9TqMi9pOHDpMYiRuABlO/BVKHUcnR0re6JoasJabopzEF3RVigU JJE5gM6Gaogn4vBKzV034L4hAp4/z27Hc2GD/n33ZGtUrVTbXWOYvEdQ4U7HahNyzmep 5R8kVumluP/QXu9Ao85Nqy/b47YMIKOoQ3mZgDhCwyqySB1wdHhiLtJeVcJdDb9br0GY JPyG2H7ZtDeurQaBSoSlklcZc5ZVDc3bbQ60ZI/IGnJUDZ38g1/e2XTqDz28vE4ECDp5 2tyDIjU9FmZhWvM/bx+9EjsAfkdsCSrS0cCccNNlNnni8UzjFopLOLDqp0eqHPV/APDe rpWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:subject:date :mime-version:content-transfer-encoding; bh=zu4TSDBNbIIY6zxTWURG9mjdiemkPY2YylKcSPouND4=; b=aZ0/SZZ27VbwmHxbj0s6FXvpybe6RAbDHqv/pRCLK5BCj+xQWc3egpnWJibmUpa2Kz pqRAfCpM2+n2rpjsxCbz91OHkvYktfGEWSlB4ixDQ9gkANxc2DLovDfizFXST9VuhVeo 2gGzQmEKxxzBAH3McjME7ksbBNjrMUbxUfNffnedWnxfG2atJvWLP+s5s9fwg+bNDbly ezspvtwkOc8mu+ljL1yQszAa600tPyaj3BX6CeaAYyUvGC/xCOHDHrGRuNdhZgB6FzLw 0RM1h7q8BuL50oU3BzpqxDphjrgy8Kx29V0Uy6kESsbUZ36OP3V3B6PtvQCiQNueRECn DOaQ== X-Gm-Message-State: AEkoouuSQNvUgi9LtinXeYhBKqkUTXGtaJnpeEglhRdZBSQatY2neN0m3ld5Sa6/YsqrEw== X-Received: by 10.28.29.211 with SMTP id d202mr53686715wmd.64.1470052809836; Mon, 01 Aug 2016 05:00:09 -0700 (PDT) Received: from dinulap (dev155.demoshop.ro. [5.2.129.155]) by smtp.gmail.com with ESMTPSA id a21sm16786725wma.10.2016.08.01.05.00.08 (version=TLS1 cipher=DES-CBC3-SHA bits=112/168); Mon, 01 Aug 2016 05:00:09 -0700 (PDT) Message-ID: <57CF7681619F42CCB4C0CF589E9686E5@dinulap> From: "Lista Unx" To: "Dave Chinner" Cc: References: <4278AB9734C1445A8E48635B155149F8@dinulap> <20160729233524.GD16044@dastard> Subject: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug Date: Mon, 1 Aug 2016 15:00:08 +0300 X-ASG-Orig-Subj: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Barracuda-Connect: mail-wm0-f54.google.com[74.125.82.54] X-Barracuda-Start-Time: 1470052811 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3447 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31667 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature ----- Original Message ----- From: "Dave Chinner" To: "Lista Unx" Cc: Sent: Saturday, July 30, 2016 2:35 AM Subject: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug > Ok, so you followed my advice on why you couldn't post to the list, Yes, I've created a new gmail account especially to be able to post to this mailing list which is filtering very seriously legit messages comming from legit usres, just because they are comming from yahoo accounts (servers) ... but is allowing ANYONE else to post here WITHOUT having valid subscription and also WITHOUT any minimal intention to post here something which has or is related to XFS. Just in last days, I was informed about new microwave acquisition, plastic delivery, or any other craps arriving here from a "trusted and very legit" source, like gmail. That's sound like really a very good job! > but you ignored my answer as to the cause of the changing numbers of > inodes. I'll repeat it here for the benefit of everyone, so they > don't waste time chasing ghosts. No, not at all, is not my style. Just mentioned twice to you, that we are not talking about number of inode usage. we are talking about max number of inodes which differ with at least 10 times less, for partitions with THE SAME SIZE AND USAGE! > That is, inodes are dynamically allocated so the number of supported > inodes is directly proportional to the amount of free space left in > the filesystem. You have filesystems with different amounts NO! Booth systems are almost identical (minor differencies) and this has been stated very clear on my first post. That's not necessary to comment each line in my post, just to point us in the right direction. > That's probably because there are open but unlinked files present in > the filesystem, and du will not find them. e.g. large O_TMPFILE > files, or files that applications are using as scratch space. You > may even have zombie processes hanging about holding unlinked files > open. Has been mentioned on my first post, reboot does not solve problem, there are no (large, small or any kind of files) exahusting inodes! > > lsof might find those files, it might not. There might also be > orphan inodes on the unlinked lists, and without an unclean shutdown > log recovery won't process them. Yes, also mentioned on my first post, lsof does not show anomalies ... > So it may simply be best to run > sync, then press the reset button to do a hard restart which > will trigger log recovery on restart. The same, mentioned on my first post, reboot (which will clean zombies) does not resolve issue. > If the problem still persists, > then xfs_repair is really the only option to find out where the > space has gone and recover it. Yes, that was also my conclusion BEFORE to post here. I did not have (yet) possibility to put / partition offline (or to not be mounted in order to run xfs_repair) and that's I asked here, considering that someone in the past encountered a simillar problem or in case not, there are few other things to be done, in order to consider that the last step to follow is to put server down for deep investigation. I am still waiting approval to put server down for deep investigations (xfs_repaid & friends). Have a nice day, Alex From robin.listas@telefonica.net Mon Aug 1 07:23:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 504EB7D15 for ; Mon, 1 Aug 2016 07:23:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14ACB304048 for ; Mon, 1 Aug 2016 05:23:45 -0700 (PDT) X-ASG-Debug-ID: 1470054223-0bf57b369b2dc000001-NocioJ Received: from smtp.movistar.es (smtp21.acens.net [86.109.99.145]) by cuda.sgi.com with ESMTP id zxoDf7n3fR7soA57 for ; Mon, 01 Aug 2016 05:23:43 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@telefonica.net X-Barracuda-Effective-Source-IP: smtp21.acens.net[86.109.99.145] X-Barracuda-Apparent-Source-IP: 86.109.99.145 X-Junkmail-Premium-Raw: score=8/50,refid=2.7.2:2016.8.1.95417:17:8.129,ip=,rules=__HAS_FROM, __TO_MALFORMED_2, __TO_NAME, __TO_NAME_DIFF_FROM_ACC, __BOUNCE_CHALLENGE_SUBJ, __BOUNCE_NDR_SUBJ_EXEMPT, __SUBJ_ALPHA_END, __IN_REP_TO, __HAS_MSGID, __SANE_MSGID, __REFERENCES, __USER_AGENT, __MIME_VERSION, __CT, __CTYPE_HAS_BOUNDARY, __CTYPE_MULTIPART, __CTYPE_MULTIPART_MIXED, __ANY_URI, __URI_NO_WWW, __STOCK_PHRASE_24, __STOCK_PHRASE_7, __SUBJ_ALPHA_NEGATE, __LINES_OF_YELLING, __FORWARDED_MSG, BODYTEXTP_SIZE_3000_LESS, BODY_SIZE_2000_2999, __MIME_TEXT_ONLY, HTML_00_01, HTML_00_10, BODY_SIZE_5000_LESS, IN_REP_TO, REFERENCES, BODY_SIZE_7000_LESS, NO_URI_HTTPS, MSG_THREAD, __TO_REAL_NAMES, LEGITIMATE_SIGNS, MIME_TEXT_ONLY_MP_MIXED, LEGITIMATE_NEGATE Received: from minas-tirith.valinor (95.126.209.47) by smtp.movistar.es (8.6.122.03) (authenticated as robin.listas2) id 574060E703944F45 for xfs@oss.sgi.com; Mon, 1 Aug 2016 12:23:42 +0000 Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id 554071814D5 for ; Mon, 1 Aug 2016 14:23:41 +0200 (CEST) Date: Mon, 1 Aug 2016 14:23:41 +0200 (CEST) From: "Carlos E. R." Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug In-Reply-To: <57CF7681619F42CCB4C0CF589E9686E5@dinulap> X-ASG-Orig-Subj: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug Message-ID: References: <4278AB9734C1445A8E48635B155149F8@dinulap> <20160729233524.GD16044@dastard> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 Content-Type: multipart/mixed; BOUNDARY="-1463758550-1059158630-1470053550=:18210" Content-ID: X-Barracuda-Connect: smtp21.acens.net[86.109.99.145] X-Barracuda-Start-Time: 1470054223 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2155 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31667 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463758550-1059158630-1470053550=:18210 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Content-ID: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Content-ID: El 2016-08-01 a las 15:00 +0300, Lista Unx escribió: > El 2016-07-30 a las 09:35 +1000, Dave Chinner escribió: >> That is, inodes are dynamically allocated so the number of supported >> inodes is directly proportional to the amount of free space left in >> the filesystem. You have filesystems with different amounts > > NO! Booth systems are almost identical (minor differencies) and this has been > stated very clear on my first post. That's not necessary to comment each line > in my post, just to point us in the right direction. They are identical, except that one has free space and the other does not. Number of inodes is dynamic and associated to free space. No free space, thus, almost no inodes available. One thing follows from the other. >> That's probably because there are open but unlinked files present in >> the filesystem, and du will not find them. e.g. large O_TMPFILE >> files, or files that applications are using as scratch space. You >> may even have zombie processes hanging about holding unlinked files >> open. > Has been mentioned on my first post, reboot does not solve problem, > there are no (large, small or any kind of files) > exahusting inodes! Dave refers to a unix/linux "feature". Files can be deleted, but if they are in use at the time, the contents are not deleted. Disk shows an ammount of free space that does not match the total - used space. However, a reboot clears this situation, and you did say in the original post you had rebooted the system. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlefP00ACgkQja8UbcUWM1xEEQD+P6UaCgpP4L/ZES7wmVBBgLib Rx78tVXJJKE5+FCQAY8BAI+6boqtqicVZA3PeOYM8PCa9IrRKyHffx3l5ty0LKpI =h9xF -----END PGP SIGNATURE----- ---1463758550-1059158630-1470053550=:18210-- From quantumcode@gmail.com Mon Aug 1 08:12:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=FREEMAIL_FROM,SINGLE_HEADER_2K, TVD_SPACE_RATIO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9D0E07D18 for ; Mon, 1 Aug 2016 08:12:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F015304048 for ; Mon, 1 Aug 2016 06:12:44 -0700 (PDT) X-ASG-Debug-ID: 1470057155-0bf57b369d2de1b0001-NocioJ Received: from EUR03-AM5-obe.outbound.protection.outlook.com (mail-am5eur03hn0232.outbound.protection.outlook.com [104.47.8.232]) by cuda.sgi.com with ESMTP id e5DqMhYKWAeYmlyO (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 01 Aug 2016 06:12:36 -0700 (PDT) X-Barracuda-Envelope-From: quantumcode@gmail.com X-Barracuda-Effective-Source-IP: mail-am5eur03hn0232.outbound.protection.outlook.com[104.47.8.232] X-Barracuda-Apparent-Source-IP: 104.47.8.232 Received: from DB3PR03CA0025.eurprd03.prod.outlook.com (2a01:111:e400:9438::25) by AM3PR03MB1012.eurprd03.prod.outlook.com (2a01:111:e400:586b::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Mon, 1 Aug 2016 13:12:34 +0000 Received: from DB5EUR03FT025.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e0a::208) by DB3PR03CA0025.outlook.office365.com (2a01:111:e400:9438::25) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.549.15 via Frontend Transport; Mon, 1 Aug 2016 13:12:33 +0000 Authentication-Results: spf=softfail (sender IP is 217.21.237.90) smtp.mailfrom=gmail.com; oss.sgi.com; dkim=none (message not signed) header.d=none;oss.sgi.com; dmarc=fail action=none header.from=gmail.com; Received-SPF: SoftFail (protection.outlook.com: domain of transitioning gmail.com discourages use of 217.21.237.90 as permitted sender) Received: from smtprelay02.stockholm.se (217.21.237.90) by DB5EUR03FT025.mail.protection.outlook.com (10.152.20.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.557.8 via Frontend Transport; Mon, 1 Aug 2016 13:12:34 +0000 Received: from WS01101 (ws01101.ad.stockholm.se [172.23.137.229]) by smtprelay02.stockholm.se (8.14.4/8.14.4) with SMTP id u71DCXak016046 for ; Mon, 1 Aug 2016 15:12:33 +0200 thread-index: AdHr9l25MnF9K0XHSJO2zA2uIOWeMA== Thread-Topic: Link from skulptur.stockholm.se From: To: Subject: Link from skulptur.stockholm.se Date: Mon, 1 Aug 2016 15:12:33 +0200 X-ASG-Orig-Subj: Link from skulptur.stockholm.se Message-ID: <17E7ED65580F48258560279CA6876AAC@ad.stockholm.se> MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 7bit X-Mailer: Microsoft CDO for Windows 2000 Content-Class: urn:content-classes:message Importance: normal Priority: normal X-MimeOLE: Produced By Microsoft MimeOLE V6.2.9200.21896 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131145307548061188;(10d0e04f-2bcf-451d-47f0-08d3afca154a);() X-Forefront-Antispam-Report: CIP:217.21.237.90;IPV:NLI;CTRY:SE;EFV:NLI;SFV:SPM;SFS:(10009020)(6009001)(7916002)(2980300002)(199003)(189002)(7636002)(7696003)(5003940100001)(356003)(7846002)(189998001)(15395725005)(9686002)(76482005)(450100001)(1720100001)(2906002)(2876002)(73972006)(77096005)(33656002)(81442002)(8426002)(558084003)(15975445007)(87936001)(48376002)(105596002)(87572001)(50986999)(586003)(86152002)(44726023)(8676002)(246002)(50226002)(305945005)(8936002)(86362001)(50466002)(104016004)(230700001)(81816999)(62236002)(6260500002)(47776003)(82202001)(5880100001)(92566002)(73392002)(102836003)(110136002)(19580395003)(61296003)(83322999)(15198665003)(229853001)(2920100001)(2351001)(44706002)(106466001)(107886002)(60750200001)(569964007);DIR:OUT;SFP:1501;SCL:5;SRVR:AM3PR03MB1012;H:smtprelay02.stockholm.se;FPR:;SPF:SoftFail;PTR:remail2.stockholm.se;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;DB5EUR03FT025;1:bQHrXNDFgeXwrQYd6neQZ6q2WYI5Ozp/Cm9tK0uuH0vH7UrNUvnbfLvpbJLgkAxfkv72glqGsHuzqFnWnfo3TMcQQ9uGJtZZ54HoK6TCqnQ598XQ1qbiAPt1Rc8SYNfQpjH1+Dact0MEnROpBBVbNedVD3viTOhTwgphqq4NwHa9caw2AeHjHGa5hblbIVuSp7k4ZosY7orS57JHqkoIYjaDf5Z3JXOdDMnyD4uoYyeUooNwRlRA94sTt0csPPoJYN8Q2vXr3QedsSxgZXxUjs7nvd9kzgFqSkc55baleBbvZgVFzkkD4N+3E/BwVUo2BLMO07CDN5jtzsuQ2h5gNp05x+BC7QcYW1aIE4wJsCnEvpr8SE855HtG62LV/G13xsVbFdERVeJFKnQ5/6APQBteF6DQaK58z70sivQ3PzgAcnWvHPEfJPmynHF1XZ5vKCPSg5EsNnT4hqLjg4tTuL6u5/xs0uHl5gM+z2YKvYYNJCgfdt4qr0AnXHvPq3cOvMV7WqedohI4l/BGLq5srROSmYOWT0k6yPrHBa1/4f0= X-MS-Office365-Filtering-Correlation-Id: ede00e1b-021f-4956-a364-08d3ba0d80a8 X-Microsoft-Exchange-Diagnostics: 1;AM3PR03MB1012;2:yiF7dJ1aSKFLsX/B1Wn2GkOaSu1tTH6tO5EAZA9Syl6ZSnmXcZXPkMSxsha9K9sobOY62fH4FpgsXlr0tbJmiJYlZUHy266Wm8O0U/Vkou9+Xw/d6wdtDRPEd83oopktkq0qSztHqK2n3X9lU9qeh3RqhEopAVwtt2CfyUzBErRTLECkjniz0IUuLMUpxaCP;3:PRAxzsabsCQBrszlbJBRLsQclzNSZaYihytdWHU1ZvhxguCx3seNI1EqIVc4TisCnbDBbfyXo2aOMW9O8tMsYp9CzWVN17h9xu8mpi66web7vxEhnUr/POgCDyzD6F4tXkvvdYIO4WK1e1+tNL7SUTMlPVImySQ8q39LChQUFgr4C8Ifshlwh2h7G8/0YIaWliiG0dCzM+6nJWXiKVA3jFfQFyd/zF6fUkojX+ZrZp8= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM3PR03MB1012; X-Microsoft-Exchange-Diagnostics: 1;AM3PR03MB1012;25:dxJlRFBaqEzB8gjdfile9rEaGrHw5nCEiThiQIxZadN5W95H8+ghyeG0Ujha5jVEFXyIvh/LNqlPpU2vbqU9nnz54yOW0VCQFue1Ly7AdsEvncMrooczwoFPiPv04XZRhec9GAt1XlItLqYxsiIYsqYRQc8jip5aP4hamcgk58+GHbFkDwTx9AM89Jto+i/z7XJjYXYEeWuXMCGj/Wx4XMwGKCB77rohKsfIbhBuoXQ//fKz0DQn7/Nk8vLZQw7Sj3o/OLPnnFnz8BYV36IoPx7BBcpbgf6nm1HJJ0e3d5DIx0vjuGReNhpJ1K0GGDPXnm9+EaXZGE0l7bZgXrelwcsMNg0zha79wcg8B3sTiJE1iFCB48PtnQGARiB/n0BuQXcR6DJO1Po/w598OpFyIQEHRkUzOSN8VzfjxJbrOcrQlxSVK+q5gfW7ODJCdb9R7oFOgxpIf7T2tiyJq90xngDaYNJc+cYSEhImCMsCoUYEjrlVdeK0n7YF2lepYZ9w3zbX8ZVFF/wDJ5f2aEtPKc9nuTt4Gk6N/mOyWiDefvnuoU+t2fiebNcjfPV9Mvfy+g8EzGA8e9wpkPIwURNrwsgtEOoROA2DfEk3hYNNepQtcHLxK37IlY2XqHL5b+/jJou6FITR7JcmddYC47jnJPN+j4N8AQ0ta1zV4BK176W7ctV0hkXIrWMfiBOpNvez3wA4D83XTbM+ndFPcJ7bdeQu+D53gWWnq+jJ1O/I7P4iEq+/rwGjjowPLAQn6Lf2d4oB/UKg2p7A03iInH8gCJpdezVMDH0CTwAkIHLGtyo= X-Microsoft-Exchange-Diagnostics: 1;AM3PR03MB1012;31:Y+WOS6WoG08NQuhmmNN9qwUVnPf2y0qwI7H5/gGauECJIkgiX1gzQfNZZZrF6fB/QKl8+yiOtfRwQ0zbyCRCVZiO2Fy/cRJ2/WUL/HfDt4EP3JZ55q3AFwMHifYj1aEgnLSAH/4NJY7qHZcQIafoGut767KzfmHaBlRXaEBv5fP9ud0uQCB1Ef+9zTHwDCwcvUQeeRv7Wwkr+UaABtCpWvheHAu2a4OycauLnhq7d48=;4:BA7+Ek++NlcCbuj2IK8wxhy7DsJesE7pOE0NeYibDmsDszRKyavjRQsDsRM2Dt74Jfvl/KqLV3Ds9FEyojdLa7VVX100qdaiusKrpdQPCMKs5n59vCrMl5JGkAfpaRGzEk2bCf+H+d58NNZ/pNH0ydGV6vE6zFkvxT14D+B/1vtc163QZXJ0uhOZ1WjlOhea015dshEHBtKtzhVtc1C1EmiZAM5EsHq+L5MpnLYRSYh8TH+IOqc0fPeSQd8uMK9kJko2DNH5z1v+UbasNqRaviKyw7KvRPw++Xcm0cuiNxtEvSjtjPTrn6kQArjkHzZyncxZOLignXMikZl5i0eQC5X6IojyNAkaiKUmUsojIcHNqbLHNjVgEJuqvlZlWe8ARDVqOJcw7nn95VwtItC6cgkoBOVz5ZeKBwo0mxrij6GMFb/nUj2geCbgp2H72rZEhBRYRitWOvUptvQu7zrxO0O+vaAu0CgQ7x5sWNR5zejxn9sWE7WHoZWgDdDRitS2 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(20890368164391); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(13018025)(13024025)(13023025)(13016025)(8121501046)(5005006)(10201501046)(3002001)(6055026);SRVR:AM3PR03MB1012;BCL:0;PCL:0;RULEID:(400006);SRVR:AM3PR03MB1012; X-Forefront-PRVS: 0021920B5A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM3PR03MB1012;23:+9K2cuPmHDZO55q0Egpp2j7GMzKG3B2jEmhrngkCP?= =?us-ascii?Q?trxETvSuvPCBqdIrgfaHteFg7AJDlReWvReLog267wP5CDj1speCCKjVlzVC?= =?us-ascii?Q?vt0J1Gjsgu7wAc1RofZT78mEYKK05KSz0pW4RvTe3hgT9b1gc3vTcxdYxzjJ?= =?us-ascii?Q?VCvi4V1g3ZrNnh72mv49SN6FJgHHOrbrbvxnWwo51Wt3ags7WoAzdpD+v7MZ?= =?us-ascii?Q?X5I0E7b/lGsZ7wj2hr1nf6SgfBaYbFVZqF4vTrrJFwPYvWKLNFcn9CS65DfB?= =?us-ascii?Q?GLwWFc4mjjCA7oYGHWBK6poefdz9IdSUpSxYKZfNw7QfFzeXso61Jg0y5/y8?= =?us-ascii?Q?2N7gxZ/2mFQYy+MWex4EDb++dLjshAfswYtjNI4iMNPFhomD7i/OoceGWifK?= =?us-ascii?Q?MUTCBoW2yuc6WHewZ8qyRb05MfH+ryIcLINZHvEWUPpyyEfccvuhUfLFtamz?= =?us-ascii?Q?Sf3xfpHb1vIlFFKRINTYDRoTVYOO/ZNt0LjxBaB2GM91PXTOP9z8BittY5pO?= =?us-ascii?Q?RfQYo/GpbXwb63DWpcNm4LUbWoUiAxOApLCsk8LsKoN5cFdm5awiXkz1q5gO?= =?us-ascii?Q?IJsfufnGLVkULb8Qwj8s7ILTqIQsuWYqRwcySK6SPeNiuS/yKre5peWf98z5?= =?us-ascii?Q?Ci4lR+QYpO4KXKBA7St3Q+QgubtcUu52L5VCQ0fLGxWztSp92xKP3+Tq1Qqe?= =?us-ascii?Q?H/GTWEk5TZ1PvhuSJ89P7SSA0K3MONOyAAclq5AF/6yRzK+1gOk0BHksH7mY?= =?us-ascii?Q?pco3CGuvaPxwnobXj9AH4yV3CaN5lmu4PZ1RfkDCfwPMRm34RVQ05v9iqbRw?= =?us-ascii?Q?2mwuqbkTj89a8XuqIO/q7Asj/vdWXE6zqqh5Jv/U1GhG62ukIZcsPG47MB6V?= =?us-ascii?Q?kjJ1Hdp0rQe9IpohcxvX5sfvCoRp3F/BcX1WOTtO8y3gjicr+dNGV08rXC3i?= =?us-ascii?Q?HmizWpd9Rxl5l40bLwyIaXjytO+XMT6pFm9GDbwLsouqIea6gHe/qSGeHd9X?= =?us-ascii?Q?qKVPpFetrWnimX0vhuomjq73Z+k4HmCoWmI1LOLG0P1/Jc0b8HXjMUolLEug?= =?us-ascii?Q?1kPxsXs4wZUiwYZScPRSGoM4VAR7LzblDGjmj+ZMIxXs6TdnXTgGi+pF524a?= =?us-ascii?Q?vgGHz6ubO4dR8E9asa+JBwe2rHX2t1JXGsLU7I5THrOlAjCPWhKxQwk0CmcA?= =?us-ascii?Q?fB/ovF4gTbA2pcyy5IPVORAE9awFnTiA2FsBxzDt7LRY2Do4daUqHxlZUtXr?= =?us-ascii?Q?Z4M1cXvQIdm6UzxJmXLvuOtqRiZH0asVvHJc+d+RdTuEwOCJGKBd8KRuYf+s?= =?us-ascii?Q?el/20rwmtHcn+9zllDobsYkx4SfcYTh71xzKH/VdsLFqSoru8ffgu8Wj/uv7?= =?us-ascii?Q?waONGs5osyo87pw5cZ0NtAlm3mB/DVWbyQva0KUyRAkPYd3UjvWP6f2p/u8g?= =?us-ascii?Q?/KOK4iVls3B2z2R+igV3nvaSwXGR4Vpei+wPKZ0pWxYNu6TEj3LTWd3lMfLi?= =?us-ascii?Q?mbO6JhdlHjU3rT72Unqhxb2+coVpAfE30gAn5IIhq74vRfFfWRwQPrHHWnxB?= =?us-ascii?Q?Y+JL5KOZ6FFaL23ccKKCZxhyO9L6YyBX/7+KERZjLdD7OVcsjyUX/od01y/?= X-Microsoft-Exchange-Diagnostics: 1;AM3PR03MB1012;6:sRcJjOiuhqHyt458TczQS1u/LJ+AUBK131xGuYrMUvHoQAn8oxEeafO72B1IIULwm2nkDez4oO8/SYgQmiIYKXZW6x+Tdh4+hBssvJwsk0u2CuQxRVe/TW4vYPc2iXWAIbMorqvE0wjFDBddcMiWKAU+5przcI7WELhWynm0KMxph/xb2YeQwVnGpMRJDBBEJ9+6OS5E3g73CNQFvFy1MR6PPhVNDpZdoln+YxXNaMO5E2mCS++NP626ZL3ti7j1BZI/Fd3RzwHHGidrfipKLqH0thmKZW6KbHJC5O5KNHc=;5:Zk5aVVrSsMy1Vrwk9th0Hx0KI1KTDX/1TnDIQoyLBo5vfXP2fmaLoFU+8cLYi5hleUCkMyjzseFQEGgu+fRxfigItPFt9LomkrIgq3znSEGvv/HTBudp6Ytr418KTsDDJmArTPUCrwQxBHZcl328MOqKZYANzfxmDvMWFOOBxhc=;24:yvuqrhVlYwgrSPcE+G15cHP3ShKtDyXqI+2PPtMntrTFtTwLj1Mf7sWbIQoltByoEEgloSYIaV5yCnVYSiL3NA==;7:HB9ObRM1jcpMVRPZra/oFHcsYvGrMXhT65szHuQbhCI4SblmVoD97gvfXSqrL+LSXvMpvVah9H3CyUbJ253Nfm1j+36Le8kaChfg7u9U4+667WHYOtjK4eWXKIajXTCJCO8KtrUumik4e4l5Voq7NEe/KdKfDQuBgmrOnXQPMorX+Fo4327V9Sm8Btz6Yfup8iFGuODEP8b2dTH5r1/CKsywcwJgsI6Ipd+32zVEAgqiOP6t4W3Fap9M0+P8EAX9 SpamDiagnosticOutput: 1:22 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Aug 2016 13:12:34.3373 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[217.21.237.90];Helo=[smtprelay02.stockholm.se] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM3PR03MB1012 X-Barracuda-Connect: mail-am5eur03hn0232.outbound.protection.outlook.com[104.47.8.232] X-Barracuda-Start-Time: 1470057156 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 137 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NO_REAL_NAME, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31668 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 NO_REAL_NAME From: does not include a real name 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Congratulations,==>> http://ow.ly/ypd4302jPnq http://ow.ly/ypd4302jPnq http://www.skulptur.stockholm.se/default.asp?id=9730&lang=EN From bfoster@redhat.com Mon Aug 1 10:57:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9E9117D18 for ; Mon, 1 Aug 2016 10:57:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25494AC004 for ; Mon, 1 Aug 2016 08:57:40 -0700 (PDT) X-ASG-Debug-ID: 1470067058-0bf8157e6a3484c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Tefg6nyarIp3ZSbx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 08:57:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6CC27C04D2AC; Mon, 1 Aug 2016 15:57:38 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-147.bos.redhat.com [10.18.41.147]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u71Fvbtk000996; Mon, 1 Aug 2016 11:57:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8E5BE1225E2; Mon, 1 Aug 2016 11:57:36 -0400 (EDT) Date: Mon, 1 Aug 2016 11:57:36 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH v2 07/47] xfs: add function pointers for get/update keys to the btree Message-ID: <20160801155736.GA64218@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 07/47] xfs: add function pointers for get/update keys to the btree References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907700604.25461.2181974283557088355.stgit@birch.djwong.org> <20160728194615.GA15746@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160728194615.GA15746@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 01 Aug 2016 15:57:38 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470067059 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11436 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 28, 2016 at 12:46:15PM -0700, Darrick J. Wong wrote: > Add some function pointers to bc_ops to get the btree keys for > leaf and node blocks, and to update parent keys of a block. > Convert the _btree_updkey calls to use our new pointer, and > modify the tree shape changing code to call the appropriate > get_*_keys pointer instead of _btree_copy_keys because the > overlapping btree has to calculate high key values. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/libxfs/xfs_alloc_btree.c | 4 + > fs/xfs/libxfs/xfs_bmap_btree.c | 4 + > fs/xfs/libxfs/xfs_btree.c | 164 +++++++++++++++++++++++--------------- > fs/xfs/libxfs/xfs_btree.h | 19 ++++ > fs/xfs/libxfs/xfs_ialloc_btree.c | 8 ++ > 5 files changed, 135 insertions(+), 64 deletions(-) > ... > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > index 8d8e362..405442d 100644 > --- a/fs/xfs/libxfs/xfs_btree.c > +++ b/fs/xfs/libxfs/xfs_btree.c ... > @@ -2146,11 +2194,10 @@ xfs_btree_lshift( > */ > cur->bc_ops->init_key_from_rec(&key, > xfs_btree_rec_addr(cur, 1, right)); > - rkp = &key; Sorry, I should have been more clear. I think this entire hunk (the above key initialization and comment) is effectively dead. > } > > - /* Update the parent key values of right. */ > - error = xfs_btree_updkey(cur, rkp, level + 1); > + /* Update the parent keys of the right block. */ > + error = cur->bc_ops->update_keys(cur, level); > if (error) > goto error0; > > @@ -2292,7 +2339,6 @@ xfs_btree_rshift( > xfs_btree_log_recs(cur, rbp, 1, rrecs + 1); > > cur->bc_ops->init_key_from_rec(&key, rrp); > - rkp = &key; Same here. key isn't used beyond this. I see that hch has some objections to the design here. FWIW, resolution of that aside, and with the above fixes: Reviewed-by: Brian Foster > > ASSERT(cur->bc_ops->recs_inorder(cur, rrp, > xfs_btree_rec_addr(cur, 2, right))); > @@ -2321,7 +2367,8 @@ xfs_btree_rshift( > if (error) > goto error1; > > - error = xfs_btree_updkey(tcur, rkp, level + 1); > + /* Update the parent keys of the right block. */ > + error = cur->bc_ops->update_keys(tcur, level); > if (error) > goto error1; > > @@ -2422,6 +2469,11 @@ __xfs_btree_split( > > XFS_BTREE_STATS_ADD(cur, moves, rrecs); > > + /* Adjust numrecs for the later get_*_keys() calls. */ > + lrecs -= rrecs; > + xfs_btree_set_numrecs(left, lrecs); > + xfs_btree_set_numrecs(right, xfs_btree_get_numrecs(right) + rrecs); > + > /* > * Copy btree block entries from the left block over to the > * new block, the right. Update the right block and log the > @@ -2447,14 +2499,15 @@ __xfs_btree_split( > } > #endif > > + /* Copy the keys & pointers to the new block. */ > xfs_btree_copy_keys(cur, rkp, lkp, rrecs); > xfs_btree_copy_ptrs(cur, rpp, lpp, rrecs); > > xfs_btree_log_keys(cur, rbp, 1, rrecs); > xfs_btree_log_ptrs(cur, rbp, 1, rrecs); > > - /* Grab the keys to the entries moved to the right block */ > - xfs_btree_copy_keys(cur, key, rkp, 1); > + /* Stash the keys of the new block for later insertion. */ > + cur->bc_ops->get_node_keys(cur, right, key); > } else { > /* It's a leaf. Move records. */ > union xfs_btree_rec *lrp; /* left record pointer */ > @@ -2463,27 +2516,23 @@ __xfs_btree_split( > lrp = xfs_btree_rec_addr(cur, src_index, left); > rrp = xfs_btree_rec_addr(cur, 1, right); > > + /* Copy records to the new block. */ > xfs_btree_copy_recs(cur, rrp, lrp, rrecs); > xfs_btree_log_recs(cur, rbp, 1, rrecs); > > - cur->bc_ops->init_key_from_rec(key, > - xfs_btree_rec_addr(cur, 1, right)); > + /* Stash the keys of the new block for later insertion. */ > + cur->bc_ops->get_leaf_keys(cur, right, key); > } > > - > /* > * Find the left block number by looking in the buffer. > - * Adjust numrecs, sibling pointers. > + * Adjust sibling pointers. > */ > xfs_btree_get_sibling(cur, left, &rrptr, XFS_BB_RIGHTSIB); > xfs_btree_set_sibling(cur, right, &rrptr, XFS_BB_RIGHTSIB); > xfs_btree_set_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); > xfs_btree_set_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); > > - lrecs -= rrecs; > - xfs_btree_set_numrecs(left, lrecs); > - xfs_btree_set_numrecs(right, xfs_btree_get_numrecs(right) + rrecs); > - > xfs_btree_log_block(cur, rbp, XFS_BB_ALL_BITS); > xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); > > @@ -2802,6 +2851,7 @@ xfs_btree_new_root( > bp = lbp; > nptr = 2; > } > + > /* Fill in the new block's btree header and log it. */ > xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); > xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); > @@ -2810,19 +2860,24 @@ xfs_btree_new_root( > > /* Fill in the key data in the new root. */ > if (xfs_btree_get_level(left) > 0) { > - xfs_btree_copy_keys(cur, > - xfs_btree_key_addr(cur, 1, new), > - xfs_btree_key_addr(cur, 1, left), 1); > - xfs_btree_copy_keys(cur, > - xfs_btree_key_addr(cur, 2, new), > - xfs_btree_key_addr(cur, 1, right), 1); > + /* > + * Get the keys for the left block's keys and put them directly > + * in the parent block. Do the same for the right block. > + */ > + cur->bc_ops->get_node_keys(cur, left, > + xfs_btree_key_addr(cur, 1, new)); > + cur->bc_ops->get_node_keys(cur, right, > + xfs_btree_key_addr(cur, 2, new)); > } else { > - cur->bc_ops->init_key_from_rec( > - xfs_btree_key_addr(cur, 1, new), > - xfs_btree_rec_addr(cur, 1, left)); > - cur->bc_ops->init_key_from_rec( > - xfs_btree_key_addr(cur, 2, new), > - xfs_btree_rec_addr(cur, 1, right)); > + /* > + * Get the keys for the left block's records and put them > + * directly in the parent block. Do the same for the right > + * block. > + */ > + cur->bc_ops->get_leaf_keys(cur, left, > + xfs_btree_key_addr(cur, 1, new)); > + cur->bc_ops->get_leaf_keys(cur, right, > + xfs_btree_key_addr(cur, 2, new)); > } > xfs_btree_log_keys(cur, nbp, 1, 2); > > @@ -2858,7 +2913,7 @@ xfs_btree_make_block_unfull( > int *index, /* new tree index */ > union xfs_btree_ptr *nptr, /* new btree ptr */ > struct xfs_btree_cur **ncur, /* new btree cursor */ > - union xfs_btree_key *key, /* key of new block */ > + union xfs_btree_key *key, /* key of new block */ > int *stat) > { > int error = 0; > @@ -3086,8 +3141,8 @@ xfs_btree_insrec( > xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); > > /* If we inserted at the start of a block, update the parents' keys. */ > - if (optr == 1) { > - error = xfs_btree_updkey(cur, key, level + 1); > + if (xfs_btree_needs_key_update(cur, optr)) { > + error = cur->bc_ops->update_keys(cur, level); > if (error) > goto error0; > } > @@ -3107,7 +3162,7 @@ xfs_btree_insrec( > */ > *ptrp = nptr; > if (!xfs_btree_ptr_is_null(cur, &nptr)) { > - *key = nkey; > + xfs_btree_copy_keys(cur, key, &nkey, 1); > *curp = ncur; > } > > @@ -3386,8 +3441,6 @@ xfs_btree_delrec( > struct xfs_buf *bp; /* buffer for block */ > int error; /* error return value */ > int i; /* loop counter */ > - union xfs_btree_key key; /* storage for keyp */ > - union xfs_btree_key *keyp = &key; /* passed to the next level */ > union xfs_btree_ptr lptr; /* left sibling block ptr */ > struct xfs_buf *lbp; /* left buffer pointer */ > struct xfs_btree_block *left; /* left btree block */ > @@ -3458,13 +3511,6 @@ xfs_btree_delrec( > xfs_btree_log_keys(cur, bp, ptr, numrecs - 1); > xfs_btree_log_ptrs(cur, bp, ptr, numrecs - 1); > } > - > - /* > - * If it's the first record in the block, we'll need to pass a > - * key up to the next level (updkey). > - */ > - if (ptr == 1) > - keyp = xfs_btree_key_addr(cur, 1, block); > } else { > /* It's a leaf. operate on records */ > if (ptr < numrecs) { > @@ -3473,16 +3519,6 @@ xfs_btree_delrec( > -1, numrecs - ptr); > xfs_btree_log_recs(cur, bp, ptr, numrecs - 1); > } > - > - /* > - * If it's the first record in the block, we'll need a key > - * structure to pass up to the next level (updkey). > - */ > - if (ptr == 1) { > - cur->bc_ops->init_key_from_rec(&key, > - xfs_btree_rec_addr(cur, 1, block)); > - keyp = &key; > - } > } > > /* > @@ -3549,8 +3585,8 @@ xfs_btree_delrec( > * If we deleted the leftmost entry in the block, update the > * key values above us in the tree. > */ > - if (ptr == 1) { > - error = xfs_btree_updkey(cur, keyp, level + 1); > + if (xfs_btree_needs_key_update(cur, ptr)) { > + error = cur->bc_ops->update_keys(cur, level); > if (error) > goto error0; > } > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > index b4f3035..e097e60 100644 > --- a/fs/xfs/libxfs/xfs_btree.h > +++ b/fs/xfs/libxfs/xfs_btree.h > @@ -180,6 +180,19 @@ struct xfs_btree_ops { > union xfs_btree_rec *r1, > union xfs_btree_rec *r2); > #endif > + > + /* derive the low & high keys from the records in a leaf block */ > + void (*get_leaf_keys)(struct xfs_btree_cur *cur, > + struct xfs_btree_block *block, > + union xfs_btree_key *key); > + > + /* derive the low & high keys from the keys in a node block */ > + void (*get_node_keys)(struct xfs_btree_cur *cur, > + struct xfs_btree_block *block, > + union xfs_btree_key *key); > + > + /* update the parent keys of given btree level */ > + int (*update_keys)(struct xfs_btree_cur *cur, int level); > }; > > /* > @@ -475,4 +488,10 @@ bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); > uint xfs_btree_compute_maxlevels(struct xfs_mount *mp, uint *limits, > unsigned long len); > > +void xfs_btree_get_leaf_keys(struct xfs_btree_cur *cur, > + struct xfs_btree_block *block, union xfs_btree_key *key); > +void xfs_btree_get_node_keys(struct xfs_btree_cur *cur, > + struct xfs_btree_block *block, union xfs_btree_key *key); > +int xfs_btree_update_keys(struct xfs_btree_cur *cur, int level); > + > #endif /* __XFS_BTREE_H__ */ > diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c > index 88da2ad..a48f448 100644 > --- a/fs/xfs/libxfs/xfs_ialloc_btree.c > +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c > @@ -314,6 +314,10 @@ static const struct xfs_btree_ops xfs_inobt_ops = { > .keys_inorder = xfs_inobt_keys_inorder, > .recs_inorder = xfs_inobt_recs_inorder, > #endif > + > + .get_leaf_keys = xfs_btree_get_leaf_keys, > + .get_node_keys = xfs_btree_get_node_keys, > + .update_keys = xfs_btree_update_keys, > }; > > static const struct xfs_btree_ops xfs_finobt_ops = { > @@ -335,6 +339,10 @@ static const struct xfs_btree_ops xfs_finobt_ops = { > .keys_inorder = xfs_inobt_keys_inorder, > .recs_inorder = xfs_inobt_recs_inorder, > #endif > + > + .get_leaf_keys = xfs_btree_get_leaf_keys, > + .get_node_keys = xfs_btree_get_node_keys, > + .update_keys = xfs_btree_update_keys, > }; > > /* > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From chris@colorremedies.com Mon Aug 1 11:51:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 95B6E7D11 for ; Mon, 1 Aug 2016 11:51:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F25CDAC003 for ; Mon, 1 Aug 2016 09:51:42 -0700 (PDT) X-ASG-Debug-ID: 1470070299-0bf57b369d2ee420001-NocioJ Received: from mail-oi0-f54.google.com (mail-oi0-f54.google.com [209.85.218.54]) by cuda.sgi.com with ESMTP id gUktkBCQbqORdXbv (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 09:51:40 -0700 (PDT) X-Barracuda-Envelope-From: chris@colorremedies.com X-Barracuda-Effective-Source-IP: mail-oi0-f54.google.com[209.85.218.54] X-Barracuda-Apparent-Source-IP: 209.85.218.54 Received: by mail-oi0-f54.google.com with SMTP id l65so200435307oib.1 for ; Mon, 01 Aug 2016 09:51:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=colorremedies-com.20150623.gappssmtp.com; s=20150623; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to; bh=/r8+Pi8aW7R3DWsf8rkgniZoUm3gSU1R/f5IT3+slkg=; b=nmpQl3AP5CM4w37G23vSzNpM6Bq7aham72LdXmSUCdUw07AE5/K+GshBQS97lyq7jt 9zJB8O6QL1j2umlJzj8RHs32bfQnnmg52V3lpn2vMjXsnfdI5AQ+DgfGIO87amDK8YNa rE3QiE0bEWHq/9pOj1mxEhRgK4p4a3rMTwIsGJwwrRUu4OYlUk76n6Y2MxfEQ0oLp+no MLSJqkPdDaSxu18kuD2ItKCoW0wQzwwnzGadCetTX58Rk8Sibvc6OXLO9Pw+2ev2uW8C lg/U5U3da9LoN4TZhapbuVFCjf1LUBB5wjyJUygetEEJpUZshuRxFEUcHNaXrpJ23D32 sV/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to; bh=/r8+Pi8aW7R3DWsf8rkgniZoUm3gSU1R/f5IT3+slkg=; b=gZ8RRes012hqjyXQ3983YB2fMa+RK6NBLzet+NS5ZrM6Sw4jem5tfITOlkGbKtzLj3 spytkNTEiF9bKOs5Ik2+mgzNh/DQyBG6ai2W3ljDk9xMnN/Rau51zFMSmYsC7fyEhYMr OPxculoBVexa0SMa9kLfqEaQpu1kbrfwnbH7K5z48AZq8gKXiR1/t+UhaqguAjRRypqJ D3FMHLO8w1LpDmiwJpiIq1nKPOT7+SOlpwyFl7LjwfAlJKMS8UBaQP8pAY6sX1Yo0eub 0VHu4ZZDBluk8A5bn6DS5R8ZRpkEklFqMNMYcvlCUlYszsCbmEX+mEnEAj5vEYmu2ZMF 1aNA== X-Gm-Message-State: AEkoous8DdeslX/EBBmzPtludny3RK0lQZjGGaU8HcjrQVATszdB4AK13/sc4ITZ/hDgYwNiO29Qd68NQUDZ/A== X-Received: by 10.202.235.23 with SMTP id j23mr35260355oih.192.1470070299337; Mon, 01 Aug 2016 09:51:39 -0700 (PDT) MIME-Version: 1.0 Sender: chris@colorremedies.com Received: by 10.202.7.134 with HTTP; Mon, 1 Aug 2016 09:51:38 -0700 (PDT) X-Originating-IP: [69.7.127.116] In-Reply-To: <57CF7681619F42CCB4C0CF589E9686E5@dinulap> References: <4278AB9734C1445A8E48635B155149F8@dinulap> <20160729233524.GD16044@dastard> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> From: Chris Murphy Date: Mon, 1 Aug 2016 10:51:38 -0600 X-Google-Sender-Auth: atVo2GPHnHHfstZFM7kbPHv8A2o Message-ID: Subject: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug To: "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f54.google.com[209.85.218.54] X-Barracuda-Start-Time: 1470070300 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 673 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31672 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Aug 1, 2016 at 6:00 AM, Lista Unx wrote: > Yes, I've created a new gmail account especially to be able to post to this > mailing list which is filtering very seriously legit messages comming from > legit usres, just because they are comming from yahoo accounts (servers) ... It's a Yahoo policy. It's completely reasonable for lists to reject yahoo.com emails, but ideally it'd reject them at signup time. https://help.yahoo.com/kb/SLN24050.html https://help.yahoo.com/kb/mail/SLN24016.html?impressions=true http://www.pcworld.com/article/2141120/yahoo-email-antispoofing-policy-breaks-mailing-lists.html -- Chris Murphy From darrick.wong@oracle.com Mon Aug 1 12:08:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6F0977D1C for ; Mon, 1 Aug 2016 12:08:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32F58304039 for ; Mon, 1 Aug 2016 10:08:52 -0700 (PDT) X-ASG-Debug-ID: 1470071329-0bf57c136a28f660001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id a7fKUfYGCgLlI5pw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 10:08:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u71H8LWC002033 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 17:08:22 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u71H8KrA013432 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 17:08:21 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u71H8IT2014645; Mon, 1 Aug 2016 17:08:19 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 01 Aug 2016 10:08:16 -0700 Date: Mon, 1 Aug 2016 10:08:15 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, eguan@redhat.com, fstests@vger.kernel.org, linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test Message-ID: <20160801170814.GA8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> <20160801062719.GH596@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801062719.GH596@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470071330 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 790 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31672 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Sun, Jul 31, 2016 at 11:27:19PM -0700, Christoph Hellwig wrote: > On Thu, Jul 21, 2016 at 04:46:54PM -0700, Darrick J. Wong wrote: > > Run xfs_repair twice at the end of each test -- once to rebuild > > the btree indices, and again with -n to check the rebuild work. > > This looks fine to me in general, but shouldn't we have specific > tests that test the rebuilding in a normal auto run? We do have specific tests that examine the outputs of rebuilding the indices (all the fuzzer group tests do this too); this patch enables a test runner to expand that coverage to all tests. Running a rebuilding xfs_repair for all the tests shook out some bugs in the xfs_repair rmap handling code that only triggered under some of the non-rmap non-reflink stressor tests. --D From darrick.wong@oracle.com Mon Aug 1 12:14:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 35C3C7D1F for ; Mon, 1 Aug 2016 12:14:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB722304048 for ; Mon, 1 Aug 2016 10:14:26 -0700 (PDT) X-ASG-Debug-ID: 1470071664-0bf57c1367290040001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 7hPKnSIPyam6JYou (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 10:14:25 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u71HDhqD031627 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 1 Aug 2016 17:13:44 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u71HDgwv002230 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 17:13:43 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u71HDe8A022189; Mon, 1 Aug 2016 17:13:41 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 01 Aug 2016 10:13:40 -0700 Date: Mon, 1 Aug 2016 10:13:39 -0700 From: "Darrick J. Wong" To: Al Viro , Christoph Hellwig Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: [PATCH] vfs: fix return type of ioctl_file_dedupe_range Message-ID: <20160801171339.GB8590@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] vfs: fix return type of ioctl_file_dedupe_range MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470071664 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 725 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31673 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines All the VFS functions in the dedupe ioctl path return int status, so the ioctl handler ought to as well. Found by Coverity, CID 1350952. Signed-off-by: Darrick J. Wong --- fs/ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ioctl.c b/fs/ioctl.c index 116a333..db3d033 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -568,7 +568,7 @@ static int ioctl_fsthaw(struct file *filp) return thaw_super(sb); } -static long ioctl_file_dedupe_range(struct file *file, void __user *arg) +static int ioctl_file_dedupe_range(struct file *file, void __user *arg) { struct file_dedupe_range __user *argp = arg; struct file_dedupe_range *same = NULL; From darrick.wong@oracle.com Mon Aug 1 12:34:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 185ED7D21 for ; Mon, 1 Aug 2016 12:34:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84172AC002 for ; Mon, 1 Aug 2016 10:34:07 -0700 (PDT) X-ASG-Debug-ID: 1470072844-0bf57b369c2f0e20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Onk392a28ZcP5O0u (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 10:34:05 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u71HXc6G001528 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 1 Aug 2016 17:33:39 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u71HXbnp032403 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 17:33:37 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u71HXWWO032143; Mon, 1 Aug 2016 17:33:33 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 01 Aug 2016 10:33:32 -0700 Date: Mon, 1 Aug 2016 10:33:31 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 07/47] xfs: add function pointers for get/update keys to the btree Message-ID: <20160801173331.GC8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 07/47] xfs: add function pointers for get/update keys to the btree References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907700604.25461.2181974283557088355.stgit@birch.djwong.org> <20160801063902.GI15590@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801063902.GI15590@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470072845 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2068 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31673 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Sun, Jul 31, 2016 at 11:39:02PM -0700, Christoph Hellwig wrote: > On Wed, Jul 20, 2016 at 09:56:46PM -0700, Darrick J. Wong wrote: > > Add some function pointers to bc_ops to get the btree keys for > > leaf and node blocks, and to update parent keys of a block. > > Convert the _btree_updkey calls to use our new pointer, and > > modify the tree shape changing code to call the appropriate > > get_*_keys pointer instead of _btree_copy_keys because the > > overlapping btree has to calculate high key values. > > I don't really like to add ops for something that isn't really > per-btree type. Can you just add an overlapping flag and act based on > that? That's roughly the approach I took in previous versions of this patch, but using the OVERLAPPING flag to dispatch the overlapped vs. non- versions of the get*keys and updkey* functions confused Dave, so he asked me to add to function pointers[1] to the btree ops and dispatch that way. There are still a few places where we need to know if it's an overlapped btree (like when we update a block and have to update the high keys, which only applies to overlapped trees), so the flag didn't entirely go away. Now, one thing I could do differently is move those new function pointers to the btree cursor and add a xfs_btree_init_cursor() that checks the flag and sets the function pointers accordingly. It seems a little funny to me to be sprinking function pointers in both btree_cursor and btree_ops, but I suppose the flag is in the cursor, so having function pointers there too probably isn't so bad. That encapsulates some btree details so that each btree doesn't have to get them right, so I'll at least code this up and add it to the end of my -experimental tree. I'm not sure how far Dave has gotten in evaluating/fixing/whatever the for-next-for-4.8-2 tree to send to Linus, so I'll hold off on folding that fix into the existing patch unless Dave wants it for his second merge-window pull request. --D [1] https://www.spinics.net/lists/xfs/msg40870.html From dan.j.williams@intel.com Mon Aug 1 12:47:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 584407D1C for ; Mon, 1 Aug 2016 12:47:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 233C730405F for ; Mon, 1 Aug 2016 10:47:13 -0700 (PDT) X-ASG-Debug-ID: 1470073629-0bf57c1369291c00001-NocioJ Received: from mail-oi0-f41.google.com (mail-oi0-f41.google.com [209.85.218.41]) by cuda.sgi.com with ESMTP id yWI5A6diT3DrDeWm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 01 Aug 2016 10:47:10 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f41.google.com[209.85.218.41] X-Barracuda-Apparent-Source-IP: 209.85.218.41 Received: by mail-oi0-f41.google.com with SMTP id j185so202330466oih.0 for ; Mon, 01 Aug 2016 10:47:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=dIpAbYq1k1eJ4I3bhhATt2czxxiJDnbMuNRn0Be46WA=; b=Gk8BRZW5SFluueFvF4Wja/p3mmaPdkZ1kGHk/07S4+aO5EiLs3akNznc4ENP9tb1bo nw5qEYF/cK/xeYv7xxmcr8JJzOjGECa9FC5vP5V8ZOLTmWDVyDazAWEaV9Nam60gM9Ss nMVQqBMbZy+SR0F881OGB/oOQEkpzn9jE04j0vpORWxUNZKIJQeaLT2NP4uPRS4mrAvT c6FYutE8q8+iwd8qQwpFDZ2XNdt1AHsBzeXbkbYT7FD8anJ9ecKHFEuB8SFB/OHY5jZ5 4hU49dsFyZYCikN7OCICuAtzok+LpPf1zdsZfayXc+Palhw2nYaG8vUMcDJhWIEe9NRN Ta6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=dIpAbYq1k1eJ4I3bhhATt2czxxiJDnbMuNRn0Be46WA=; b=Mnn9CR/U8a69ReXFVQ62TbMxRUIkxhXejKqUB/76YB5pzKdS4ADkVb1AajywbrZ05+ c8kKN6rPxIdV1R222nyxgqC3nncXD6PLU8lJHfOAuLi6DAQVxNIpEthgT+S0JmpZoJJz 1Ao2xbKYtr3SuTqhOunfsXlsowVE3Pbg5z0uKu3ACRoZbGwz0NOnUaaOrYLvh2mNSaCh Kh0UgAgEJWsVxpmGX5ykDDdN/K65HWdklIOb3TqDLfm/9Qyt0O8B/7TVelbUDs/RoFd6 zn9ZJRa4TKoAwL0SMud483JL5SO3Yfzo2fKeW6v4ZhEz+FDmSwzNMkSM6AWOv2ySy9GT jaaA== X-Gm-Message-State: AEkooutFVsl9or2GKAJ3fbME89MXdy9rdhRuw4oZ0VB3mJtPhDQF8RyiK5X5jSykMZ2yhrae2ZORr2opXH66TYVK X-Received: by 10.202.190.2 with SMTP id o2mr23700416oif.81.1470073629383; Mon, 01 Aug 2016 10:47:09 -0700 (PDT) MIME-Version: 1.0 Received: by 10.157.62.182 with HTTP; Mon, 1 Aug 2016 10:47:08 -0700 (PDT) In-Reply-To: <20160730001249.GE16044@dastard> References: <20160727120745.GI6860@quack2.suse.cz> <20160727211039.GA20278@linux.intel.com> <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> From: Dan Williams Date: Mon, 1 Aug 2016 10:47:08 -0700 Message-ID: Subject: Re: Subtle races between DAX mmap fault and write path To: Dave Chinner X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path Cc: Jan Kara , Ross Zwisler , linux-fsdevel , "linux-nvdimm@lists.01.org" , XFS Developers , linux-ext4 Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f41.google.com[209.85.218.41] X-Barracuda-Start-Time: 1470073630 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3802 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Jul 29, 2016 at 5:12 PM, Dave Chinner wrote: > On Fri, Jul 29, 2016 at 07:44:25AM -0700, Dan Williams wrote: >> On Thu, Jul 28, 2016 at 7:21 PM, Dave Chinner wrote: >> > On Thu, Jul 28, 2016 at 10:10:33AM +0200, Jan Kara wrote: >> >> On Thu 28-07-16 08:19:49, Dave Chinner wrote: >> [..] >> >> So DAX doesn't need flushing to maintain consistent view of the data but it >> >> does need flushing to make sure fsync(2) results in data written via mmap >> >> to reach persistent storage. >> > >> > I thought this all changed with the removal of the pcommit >> > instruction and wmb_pmem() going away. Isn't it now a platform >> > requirement now that dirty cache lines over persistent memory ranges >> > are either guaranteed to be flushed to persistent storage on power >> > fail or when required by REQ_FLUSH? >> >> No, nothing automates cache flushing. The path of a write is: >> >> cpu-cache -> cpu-write-buffer -> bus -> imc -> imc-write-buffer -> media >> >> The ADR mechanism and the wpq-flush facility flush data thorough the >> imc (integrated memory controller) to media. dax_do_io() gets writes >> to the imc, but we still need a posted-write-buffer flush mechanism to >> guarantee data makes it out to media. > > So what you are saying is that on and ADR machine, we have these > domains w.r.t. power fail: > > cpu-cache -> cpu-write-buffer -> bus -> imc -> imc-write-buffer -> media > > |-------------volatile-------------------|-----persistent--------------| > > because anything that gets to the IMC is guaranteed to be flushed to > stable media on power fail. > > But on a posted-write-buffer system, we have this: > > cpu-cache -> cpu-write-buffer -> bus -> imc -> imc-write-buffer -> media > > |-------------volatile-------------------------------------------|--persistent--| > > IOWs, only things already posted to the media via REQ_FLUSH are > considered stable on persistent media. What happens in this case > when power fails during a media update? Incomplete writes? > >> > Or have we somehow ended up with the fucked up situation where >> > dax_do_io() writes are (effectively) immediately persistent and >> > untracked by internal infrastructure, whilst mmap() writes >> > require internal dirty tracking and fsync() to flush caches via >> > writeback? >> >> dax_do_io() writes are not immediately persistent. They bypass the >> cpu-cache and cpu-write-bufffer and are ready to be flushed to media >> by REQ_FLUSH or power-fail on an ADR system. > > IOWs, on an ADR system write is /effectively/ immediately persistent > because if power fails ADR guarantees it will be flushed to stable > media, while on a posted write system it is volatile and will be > lost. Right? > > If so, that's even worse than just having mmap/write behave > differently - now writes will behave differently depending on the > specific hardware installed. I think this makes it even more > important for the DAX code to hide this behaviour from the > fielsystems by treating everything as volatile. Sorry, I confused things above by implying that Linux will need to consider NVDIMM platforms without ADR. ADR is already required for present day NVDIMM platforms and that requirement continues. The explicit flushing allowed by REQ_FLUSH is an optional mechanism to backstop ADR, but is not required and will not be used as an alternative to ADR. See pages 21 and 22 of the latest driver writer's guide if you want more details [1]. Long story short, we should always consider writes that enter the persistence domain (movnt + sfence) as persistent regardless of the presence of WPQ-flush. [1]: http://pmem.io/documents/NVDIMM_DriverWritersGuide-July-2016.pdf From bfoster@redhat.com Mon Aug 1 12:47:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2E7E77D1C for ; Mon, 1 Aug 2016 12:47:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A4F6FAC001 for ; Mon, 1 Aug 2016 10:47:24 -0700 (PDT) X-ASG-Debug-ID: 1470073641-0bf8157e6d350eb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WWkCqa7OSVQsyrQF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 10:47:22 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C52843B70D; Mon, 1 Aug 2016 17:47:21 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-147.bos.redhat.com [10.18.41.147]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u71HlLqo020809; Mon, 1 Aug 2016 13:47:21 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E69721225E2; Mon, 1 Aug 2016 13:47:19 -0400 (EDT) Date: Mon, 1 Aug 2016 13:47:19 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys Message-ID: <20160801174719.GB64218@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 01 Aug 2016 17:47:21 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470073642 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 19199 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:56:52PM -0700, Darrick J. Wong wrote: > On a filesystem with both reflink and reverse mapping enabled, it's > possible to have multiple rmap records referring to the same blocks on > disk. When overlapping intervals are possible, querying a classic > btree to find all records intersecting a given interval is inefficient > because we cannot use the left side of the search interval to filter > out non-matching records the same way that we can use the existing > btree key to filter out records coming after the right side of the > search interval. This will become important once we want to use the > rmap btree to rebuild BMBTs, or implement the (future) fsmap ioctl. > > (For the non-overlapping case, we can perform such queries trivially > by starting at the left side of the interval and walking the tree > until we pass the right side.) > > Therefore, extend the btree code to come closer to supporting > intervals as a first-class record attribute. This involves widening > the btree node's key space to store both the lowest key reachable via > the node pointer (as the btree does now) and the highest key reachable > via the same pointer and teaching the btree modifying functions to > keep the highest-key records up to date. > > This behavior can be turned on via a new btree ops flag so that btrees > that cannot store overlapping intervals don't pay the overhead costs > in terms of extra code and disk format changes. > > v2: When we're deleting a record in a btree that supports overlapped > interval records and the deletion results in two btree blocks being > joined, we defer updating the high/low keys until after all possible > joining (at higher levels in the tree) have finished. At this point, > the btree pointers at all levels have been updated to remove the empty > blocks and we can update the low and high keys. > > When we're doing this, we must be careful to update the keys of all > node pointers up to the root instead of stopping at the first set of > keys that don't need updating. This is because it's possible for a > single deletion to cause joining of multiple levels of tree, and so > we need to update everything going back to the root. > > v3: Make diff_two_keys return < 0, 0, or > 0 if key1 is less than, > equal to, or greater than key2, respectively. This is consistent > with the rest of the kernel and the C library. Clarify some comments > and refactor the sibling_update function out of existence. Check the > return value of btree_updkeys(). > > v4: In btree_updkeys(), evaluate the force_all parameter before > running the key diff to avoid reading uninitialized memory when we're > forcing a key update. This happens when we've allocated an empty slot > at level N + 1 to point to a new block at level N and we're in the > process of filling out the new keys. > > v5: Move the overlapping flag to bc_flags, refactor the get/update keys > code, and let client btrees set a doublewide key length. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/libxfs/xfs_btree.c | 339 +++++++++++++++++++++++++++++++++++++++++++-- > fs/xfs/libxfs/xfs_btree.h | 30 ++++ > fs/xfs/xfs_trace.h | 36 +++++ > 3 files changed, 392 insertions(+), 13 deletions(-) > > > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > index 70d1c60..1881536 100644 > --- a/fs/xfs/libxfs/xfs_btree.c > +++ b/fs/xfs/libxfs/xfs_btree.c ... > @@ -1918,14 +2053,107 @@ xfs_btree_get_keys( > /* > * Decide if we need to update the parent keys of a btree block. For > * a standard btree this is only necessary if we're updating the first > - * record/key. > + * record/key. For an overlapping btree, we must always update the > + * keys because the highest key can be in any of the records or keys > + * in the block. > */ > static inline bool > xfs_btree_needs_key_update( > struct xfs_btree_cur *cur, > int ptr) > { > - return ptr == 1; > + return (cur->bc_flags & XFS_BTREE_OVERLAPPING) || ptr == 1; > +} > + > +/* > + * Update the low and high parent keys of the given level, progressing > + * towards the root. If force_all is false, stop if the keys for a given > + * level do not need updating. > + */ > +STATIC int > +__xfs_btree_updkeys( > + struct xfs_btree_cur *cur, > + int level, > + struct xfs_btree_block *block, > + struct xfs_buf *bp0, > + bool force_all) > +{ > + union xfs_btree_bigkey key; /* keys from current level */ > + union xfs_btree_key *lkey; /* keys from the next level up */ > + union xfs_btree_key *hkey; > + union xfs_btree_key *nlkey; /* keys from the next level up */ > + union xfs_btree_key *nhkey; > + struct xfs_buf *bp; > + int ptr; > + > + ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); > + > + /* Exit if there aren't any parent levels to update. */ > + if (level + 1 >= cur->bc_nlevels) > + return 0; > + > + trace_xfs_btree_updkeys(cur, level, bp0); > + > + lkey = (union xfs_btree_key *)&key; > + hkey = xfs_btree_high_key_from_key(cur, lkey); So we create a bigkey object on the stack which presumably will contain storage for both keys for overlapping trees, then cast and pass down the normal xfs_btree_key structure throughout btree infrastructure. This seems slightly hairy/unfortunate in that we treat in-memory objects sort of like a buffer pointer. As hch points out, it is also kind of confusing (I had to skip forward to where the bigkey union was filled in to get an idea of what was going on). I'm not a huge fan, though I suppose the alternative might involve changing xfs_btree_key and possibly a bunch of other code to accommodate the dual keys model. Perhaps this is in fact the better option.. but have you considered any options enough to comment on that at all? > + xfs_btree_get_keys(cur, block, lkey); > + for (level++; level < cur->bc_nlevels; level++) { > +#ifdef DEBUG > + int error; > +#endif > + block = xfs_btree_get_block(cur, level, &bp); > + trace_xfs_btree_updkeys(cur, level, bp); > +#ifdef DEBUG > + error = xfs_btree_check_block(cur, block, level, bp); > + if (error) { > + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); > + return error; > + } > +#endif > + ptr = cur->bc_ptrs[level]; > + nlkey = xfs_btree_key_addr(cur, ptr, block); > + nhkey = xfs_btree_high_key_addr(cur, ptr, block); > + if (!force_all && > + !(cur->bc_ops->diff_two_keys(cur, nlkey, lkey) != 0 || > + cur->bc_ops->diff_two_keys(cur, nhkey, hkey) != 0)) > + break; > + xfs_btree_copy_keys(cur, nlkey, lkey, 1); > + xfs_btree_log_keys(cur, bp, ptr, ptr); > + if (level + 1 >= cur->bc_nlevels) > + break; > + cur->bc_ops->get_node_keys(cur, block, lkey); > + } > + > + return 0; > +} > + ... > } > > /* ... > @@ -2197,10 +2429,33 @@ xfs_btree_lshift( > rkp = &key; > } > > + /* > + * Using a temporary cursor, update the parent key values of the > + * block on the left. > + */ > + error = xfs_btree_dup_cursor(cur, &tcur); > + if (error) > + goto error0; > + i = xfs_btree_firstrec(tcur, level); > + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); Nit: tcur > + > + error = xfs_btree_decrement(tcur, level, &i); > + if (error) > + goto error1; > + Can we conditionalize tcur creation/processing against the overlapping flag as well and combine the two associated hunks? Brian > /* Update the parent keys of the right block. */ > error = cur->bc_ops->update_keys(cur, level); > if (error) > - goto error0; > + goto error1; > + > + /* Update the parent high keys of the left block, if needed. */ > + if (tcur->bc_flags & XFS_BTREE_OVERLAPPING) { > + error = tcur->bc_ops->update_keys(tcur, level); > + if (error) > + goto error1; > + } > + > + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); > > /* Slide the cursor value left one. */ > cur->bc_ptrs[level]--; > @@ -2217,6 +2472,11 @@ out0: > error0: > XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); > return error; > + > +error1: > + XFS_BTREE_TRACE_CURSOR(tcur, XBT_ERROR); > + xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR); > + return error; > } > > /* > @@ -2369,6 +2629,13 @@ xfs_btree_rshift( > if (error) > goto error1; > > + /* Update the parent high keys of the left block, if needed. */ > + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { > + error = cur->bc_ops->update_keys(cur, level); > + if (error) > + goto error1; > + } > + > /* Update the parent keys of the right block. */ > error = cur->bc_ops->update_keys(tcur, level); > if (error) > @@ -2549,6 +2816,14 @@ __xfs_btree_split( > xfs_btree_set_sibling(cur, rrblock, &rptr, XFS_BB_LEFTSIB); > xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); > } > + > + /* Update the parent high keys of the left block, if needed. */ > + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { > + error = cur->bc_ops->update_keys(cur, level); > + if (error) > + goto error0; > + } > + > /* > * If the cursor is really in the right block, move it there. > * If it's just pointing past the last entry in left, then we'll > @@ -2989,7 +3264,8 @@ xfs_btree_insrec( > struct xfs_buf *bp; /* buffer for block */ > union xfs_btree_ptr nptr; /* new block ptr */ > struct xfs_btree_cur *ncur; /* new btree cursor */ > - union xfs_btree_key nkey; /* new block key */ > + union xfs_btree_bigkey nkey; /* new block key */ > + union xfs_btree_key *lkey; > int optr; /* old key/record index */ > int ptr; /* key/record index */ > int numrecs;/* number of records */ > @@ -2997,11 +3273,13 @@ xfs_btree_insrec( > #ifdef DEBUG > int i; > #endif > + xfs_daddr_t old_bn; > > XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); > XFS_BTREE_TRACE_ARGIPR(cur, level, *ptrp, &rec); > > ncur = NULL; > + lkey = (union xfs_btree_key *)&nkey; > > /* > * If we have an external root pointer, and we've made it to the > @@ -3030,6 +3308,7 @@ xfs_btree_insrec( > > /* Get pointers to the btree buffer and block. */ > block = xfs_btree_get_block(cur, level, &bp); > + old_bn = bp ? bp->b_bn : XFS_BUF_DADDR_NULL; > numrecs = xfs_btree_get_numrecs(block); > > #ifdef DEBUG > @@ -3056,7 +3335,7 @@ xfs_btree_insrec( > xfs_btree_set_ptr_null(cur, &nptr); > if (numrecs == cur->bc_ops->get_maxrecs(cur, level)) { > error = xfs_btree_make_block_unfull(cur, level, numrecs, > - &optr, &ptr, &nptr, &ncur, &nkey, stat); > + &optr, &ptr, &nptr, &ncur, lkey, stat); > if (error || *stat == 0) > goto error0; > } > @@ -3141,8 +3420,17 @@ xfs_btree_insrec( > /* Log the new number of records in the btree header. */ > xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); > > - /* If we inserted at the start of a block, update the parents' keys. */ > - if (xfs_btree_needs_key_update(cur, optr)) { > + /* > + * If we just inserted into a new tree block, we have to > + * recalculate nkey here because nkey is out of date. > + * > + * Otherwise we're just updating an existing block (having shoved > + * some records into the new tree block), so use the regular key > + * update mechanism. > + */ > + if (bp && bp->b_bn != old_bn) { > + xfs_btree_get_keys(cur, block, lkey); > + } else if (xfs_btree_needs_key_update(cur, optr)) { > error = cur->bc_ops->update_keys(cur, level); > if (error) > goto error0; > @@ -3163,7 +3451,7 @@ xfs_btree_insrec( > */ > *ptrp = nptr; > if (!xfs_btree_ptr_is_null(cur, &nptr)) { > - xfs_btree_copy_keys(cur, key, &nkey, 1); > + xfs_btree_copy_keys(cur, key, lkey, 1); > *curp = ncur; > } > > @@ -3194,18 +3482,20 @@ xfs_btree_insert( > union xfs_btree_ptr nptr; /* new block number (split result) */ > struct xfs_btree_cur *ncur; /* new cursor (split result) */ > struct xfs_btree_cur *pcur; /* previous level's cursor */ > - union xfs_btree_key key; /* key of block to insert */ > + union xfs_btree_bigkey bkey; /* key of block to insert */ > + union xfs_btree_key *key; > union xfs_btree_rec rec; /* record to insert */ > > level = 0; > ncur = NULL; > pcur = cur; > + key = (union xfs_btree_key *)&bkey; > > xfs_btree_set_ptr_null(cur, &nptr); > > /* Make a key out of the record data to be inserted, and save it. */ > cur->bc_ops->init_rec_from_cur(cur, &rec); > - cur->bc_ops->init_key_from_rec(&key, &rec); > + cur->bc_ops->init_key_from_rec(key, &rec); > > /* > * Loop going up the tree, starting at the leaf level. > @@ -3217,7 +3507,7 @@ xfs_btree_insert( > * Insert nrec/nptr into this level of the tree. > * Note if we fail, nptr will be null. > */ > - error = xfs_btree_insrec(pcur, level, &nptr, &rec, &key, > + error = xfs_btree_insrec(pcur, level, &nptr, &rec, key, > &ncur, &i); > if (error) { > if (pcur != cur) > @@ -3916,6 +4206,16 @@ xfs_btree_delrec( > if (level > 0) > cur->bc_ptrs[level]--; > > + /* > + * We combined blocks, so we have to update the parent keys if the > + * btree supports overlapped intervals. However, bc_ptrs[level + 1] > + * points to the old block so that the caller knows which record to > + * delete. Therefore, the caller must be savvy enough to call updkeys > + * for us if we return stat == 2. The other exit points from this > + * function don't require deletions further up the tree, so they can > + * call updkeys directly. > + */ > + > XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); > /* Return value means the next level up has something to do. */ > *stat = 2; > @@ -3941,6 +4241,7 @@ xfs_btree_delete( > int error; /* error return value */ > int level; > int i; > + bool joined = false; > > XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); > > @@ -3954,6 +4255,18 @@ xfs_btree_delete( > error = xfs_btree_delrec(cur, level, &i); > if (error) > goto error0; > + if (i == 2) > + joined = true; > + } > + > + /* > + * If we combined blocks as part of deleting the record, delrec won't > + * have updated the parent high keys so we have to do that here. > + */ > + if (joined && (cur->bc_flags & XFS_BTREE_OVERLAPPING)) { > + error = xfs_btree_updkeys_force(cur, 0); > + if (error) > + goto error0; > } > > if (i == 0) { > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > index bb40457..3645d91 100644 > --- a/fs/xfs/libxfs/xfs_btree.h > +++ b/fs/xfs/libxfs/xfs_btree.h > @@ -44,6 +44,20 @@ union xfs_btree_key { > xfs_inobt_key_t inobt; > }; > > +/* > + * In-core key that holds both low and high keys for overlapped btrees. > + * The two keys are packed next to each other on disk, so do the same > + * in memory. Preserve the existing xfs_btree_key as a single key to > + * avoid the mental model breakage that would happen if we passed a > + * bigkey into a function that operates on a single key. > + */ > +union xfs_btree_bigkey { > + struct xfs_bmbt_key bmbt; > + xfs_bmdr_key_t bmbr; /* bmbt root block */ > + xfs_alloc_key_t alloc; > + struct xfs_inobt_key inobt; > +}; > + > union xfs_btree_rec { > xfs_bmbt_rec_t bmbt; > xfs_bmdr_rec_t bmbr; /* bmbt root block */ > @@ -162,11 +176,21 @@ struct xfs_btree_ops { > union xfs_btree_rec *rec); > void (*init_ptr_from_cur)(struct xfs_btree_cur *cur, > union xfs_btree_ptr *ptr); > + void (*init_high_key_from_rec)(union xfs_btree_key *key, > + union xfs_btree_rec *rec); > > /* difference between key value and cursor value */ > __int64_t (*key_diff)(struct xfs_btree_cur *cur, > union xfs_btree_key *key); > > + /* > + * Difference between key2 and key1 -- positive if key1 > key2, > + * negative if key1 < key2, and zero if equal. > + */ > + __int64_t (*diff_two_keys)(struct xfs_btree_cur *cur, > + union xfs_btree_key *key1, > + union xfs_btree_key *key2); > + > const struct xfs_buf_ops *buf_ops; > > #if defined(DEBUG) || defined(XFS_WARN) > @@ -249,6 +273,7 @@ typedef struct xfs_btree_cur > #define XFS_BTREE_ROOT_IN_INODE (1<<1) /* root may be variable size */ > #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ > #define XFS_BTREE_CRC_BLOCKS (1<<3) /* uses extended btree blocks */ > +#define XFS_BTREE_OVERLAPPING (1<<4) /* overlapping intervals */ > > > #define XFS_BTREE_NOERROR 0 > @@ -493,5 +518,10 @@ void xfs_btree_get_leaf_keys(struct xfs_btree_cur *cur, > void xfs_btree_get_node_keys(struct xfs_btree_cur *cur, > struct xfs_btree_block *block, union xfs_btree_key *key); > int xfs_btree_update_keys(struct xfs_btree_cur *cur, int level); > +void xfs_btree_get_leaf_keys_overlapped(struct xfs_btree_cur *cur, > + struct xfs_btree_block *block, union xfs_btree_key *key); > +void xfs_btree_get_node_keys_overlapped(struct xfs_btree_cur *cur, > + struct xfs_btree_block *block, union xfs_btree_key *key); > +int xfs_btree_update_keys_overlapped(struct xfs_btree_cur *cur, int level); > > #endif /* __XFS_BTREE_H__ */ > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index 1451690..8fb59e6 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -38,6 +38,7 @@ struct xlog_recover_item; > struct xfs_buf_log_format; > struct xfs_inode_log_format; > struct xfs_bmbt_irec; > +struct xfs_btree_cur; > > DECLARE_EVENT_CLASS(xfs_attr_list_class, > TP_PROTO(struct xfs_attr_list_context *ctx), > @@ -2185,6 +2186,41 @@ DEFINE_DISCARD_EVENT(xfs_discard_toosmall); > DEFINE_DISCARD_EVENT(xfs_discard_exclude); > DEFINE_DISCARD_EVENT(xfs_discard_busy); > > +/* btree cursor events */ > +DECLARE_EVENT_CLASS(xfs_btree_cur_class, > + TP_PROTO(struct xfs_btree_cur *cur, int level, struct xfs_buf *bp), > + TP_ARGS(cur, level, bp), > + TP_STRUCT__entry( > + __field(dev_t, dev) > + __field(xfs_btnum_t, btnum) > + __field(int, level) > + __field(int, nlevels) > + __field(int, ptr) > + __field(xfs_daddr_t, daddr) > + ), > + TP_fast_assign( > + __entry->dev = cur->bc_mp->m_super->s_dev; > + __entry->btnum = cur->bc_btnum; > + __entry->level = level; > + __entry->nlevels = cur->bc_nlevels; > + __entry->ptr = cur->bc_ptrs[level]; > + __entry->daddr = bp ? bp->b_bn : -1; > + ), > + TP_printk("dev %d:%d btnum %d level %d/%d ptr %d daddr 0x%llx", > + MAJOR(__entry->dev), MINOR(__entry->dev), > + __entry->btnum, > + __entry->level, > + __entry->nlevels, > + __entry->ptr, > + (unsigned long long)__entry->daddr) > +) > + > +#define DEFINE_BTREE_CUR_EVENT(name) \ > +DEFINE_EVENT(xfs_btree_cur_class, name, \ > + TP_PROTO(struct xfs_btree_cur *cur, int level, struct xfs_buf *bp), \ > + TP_ARGS(cur, level, bp)) > +DEFINE_BTREE_CUR_EVENT(xfs_btree_updkeys); > + > #endif /* _TRACE_XFS_H */ > > #undef TRACE_INCLUDE_PATH > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Mon Aug 1 12:54:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EAA017D24 for ; Mon, 1 Aug 2016 12:54:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7F5AF304051 for ; Mon, 1 Aug 2016 10:54:16 -0700 (PDT) X-ASG-Debug-ID: 1470074053-0bf8157e6c351a10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id wBeBZBhfHTjSYfpO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 10:54:13 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u71HsAeR020495 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 17:54:11 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u71HsAvU021273 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 17:54:10 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u71Hs9r6007793; Mon, 1 Aug 2016 17:54:09 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 01 Aug 2016 10:54:09 -0700 Date: Mon, 1 Aug 2016 10:54:07 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH v2 07/47] xfs: add function pointers for get/update keys to the btree Message-ID: <20160801175407.GA8593@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v2 07/47] xfs: add function pointers for get/update keys to the btree References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907700604.25461.2181974283557088355.stgit@birch.djwong.org> <20160728194615.GA15746@birch.djwong.org> <20160801155736.GA64218@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801155736.GA64218@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470074053 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12488 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 01, 2016 at 11:57:36AM -0400, Brian Foster wrote: > On Thu, Jul 28, 2016 at 12:46:15PM -0700, Darrick J. Wong wrote: > > Add some function pointers to bc_ops to get the btree keys for > > leaf and node blocks, and to update parent keys of a block. > > Convert the _btree_updkey calls to use our new pointer, and > > modify the tree shape changing code to call the appropriate > > get_*_keys pointer instead of _btree_copy_keys because the > > overlapping btree has to calculate high key values. > > > > Signed-off-by: Darrick J. Wong > > --- > > fs/xfs/libxfs/xfs_alloc_btree.c | 4 + > > fs/xfs/libxfs/xfs_bmap_btree.c | 4 + > > fs/xfs/libxfs/xfs_btree.c | 164 +++++++++++++++++++++++--------------- > > fs/xfs/libxfs/xfs_btree.h | 19 ++++ > > fs/xfs/libxfs/xfs_ialloc_btree.c | 8 ++ > > 5 files changed, 135 insertions(+), 64 deletions(-) > > > ... > > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > > index 8d8e362..405442d 100644 > > --- a/fs/xfs/libxfs/xfs_btree.c > > +++ b/fs/xfs/libxfs/xfs_btree.c > ... > > @@ -2146,11 +2194,10 @@ xfs_btree_lshift( > > */ > > cur->bc_ops->init_key_from_rec(&key, > > xfs_btree_rec_addr(cur, 1, right)); > > - rkp = &key; > > Sorry, I should have been more clear. I think this entire hunk (the > above key initialization and comment) is effectively dead. > > > } > > > > - /* Update the parent key values of right. */ > > - error = xfs_btree_updkey(cur, rkp, level + 1); > > + /* Update the parent keys of the right block. */ > > + error = cur->bc_ops->update_keys(cur, level); > > if (error) > > goto error0; > > > > @@ -2292,7 +2339,6 @@ xfs_btree_rshift( > > xfs_btree_log_recs(cur, rbp, 1, rrecs + 1); > > > > cur->bc_ops->init_key_from_rec(&key, rrp); > > - rkp = &key; > > Same here. key isn't used beyond this. > > I see that hch has some objections to the design here. FWIW, resolution > of that aside, and with the above fixes: Ah, right. "key" and its initializers can go away in both functions. I'll fix that and find out if Dave wants to take this (and the other fixes) for a 4.8 merge request, or just defer them until -rc2. --D > Reviewed-by: Brian Foster > > > > > ASSERT(cur->bc_ops->recs_inorder(cur, rrp, > > xfs_btree_rec_addr(cur, 2, right))); > > @@ -2321,7 +2367,8 @@ xfs_btree_rshift( > > if (error) > > goto error1; > > > > - error = xfs_btree_updkey(tcur, rkp, level + 1); > > + /* Update the parent keys of the right block. */ > > + error = cur->bc_ops->update_keys(tcur, level); > > if (error) > > goto error1; > > > > @@ -2422,6 +2469,11 @@ __xfs_btree_split( > > > > XFS_BTREE_STATS_ADD(cur, moves, rrecs); > > > > + /* Adjust numrecs for the later get_*_keys() calls. */ > > + lrecs -= rrecs; > > + xfs_btree_set_numrecs(left, lrecs); > > + xfs_btree_set_numrecs(right, xfs_btree_get_numrecs(right) + rrecs); > > + > > /* > > * Copy btree block entries from the left block over to the > > * new block, the right. Update the right block and log the > > @@ -2447,14 +2499,15 @@ __xfs_btree_split( > > } > > #endif > > > > + /* Copy the keys & pointers to the new block. */ > > xfs_btree_copy_keys(cur, rkp, lkp, rrecs); > > xfs_btree_copy_ptrs(cur, rpp, lpp, rrecs); > > > > xfs_btree_log_keys(cur, rbp, 1, rrecs); > > xfs_btree_log_ptrs(cur, rbp, 1, rrecs); > > > > - /* Grab the keys to the entries moved to the right block */ > > - xfs_btree_copy_keys(cur, key, rkp, 1); > > + /* Stash the keys of the new block for later insertion. */ > > + cur->bc_ops->get_node_keys(cur, right, key); > > } else { > > /* It's a leaf. Move records. */ > > union xfs_btree_rec *lrp; /* left record pointer */ > > @@ -2463,27 +2516,23 @@ __xfs_btree_split( > > lrp = xfs_btree_rec_addr(cur, src_index, left); > > rrp = xfs_btree_rec_addr(cur, 1, right); > > > > + /* Copy records to the new block. */ > > xfs_btree_copy_recs(cur, rrp, lrp, rrecs); > > xfs_btree_log_recs(cur, rbp, 1, rrecs); > > > > - cur->bc_ops->init_key_from_rec(key, > > - xfs_btree_rec_addr(cur, 1, right)); > > + /* Stash the keys of the new block for later insertion. */ > > + cur->bc_ops->get_leaf_keys(cur, right, key); > > } > > > > - > > /* > > * Find the left block number by looking in the buffer. > > - * Adjust numrecs, sibling pointers. > > + * Adjust sibling pointers. > > */ > > xfs_btree_get_sibling(cur, left, &rrptr, XFS_BB_RIGHTSIB); > > xfs_btree_set_sibling(cur, right, &rrptr, XFS_BB_RIGHTSIB); > > xfs_btree_set_sibling(cur, right, &lptr, XFS_BB_LEFTSIB); > > xfs_btree_set_sibling(cur, left, &rptr, XFS_BB_RIGHTSIB); > > > > - lrecs -= rrecs; > > - xfs_btree_set_numrecs(left, lrecs); > > - xfs_btree_set_numrecs(right, xfs_btree_get_numrecs(right) + rrecs); > > - > > xfs_btree_log_block(cur, rbp, XFS_BB_ALL_BITS); > > xfs_btree_log_block(cur, lbp, XFS_BB_NUMRECS | XFS_BB_RIGHTSIB); > > > > @@ -2802,6 +2851,7 @@ xfs_btree_new_root( > > bp = lbp; > > nptr = 2; > > } > > + > > /* Fill in the new block's btree header and log it. */ > > xfs_btree_init_block_cur(cur, nbp, cur->bc_nlevels, 2); > > xfs_btree_log_block(cur, nbp, XFS_BB_ALL_BITS); > > @@ -2810,19 +2860,24 @@ xfs_btree_new_root( > > > > /* Fill in the key data in the new root. */ > > if (xfs_btree_get_level(left) > 0) { > > - xfs_btree_copy_keys(cur, > > - xfs_btree_key_addr(cur, 1, new), > > - xfs_btree_key_addr(cur, 1, left), 1); > > - xfs_btree_copy_keys(cur, > > - xfs_btree_key_addr(cur, 2, new), > > - xfs_btree_key_addr(cur, 1, right), 1); > > + /* > > + * Get the keys for the left block's keys and put them directly > > + * in the parent block. Do the same for the right block. > > + */ > > + cur->bc_ops->get_node_keys(cur, left, > > + xfs_btree_key_addr(cur, 1, new)); > > + cur->bc_ops->get_node_keys(cur, right, > > + xfs_btree_key_addr(cur, 2, new)); > > } else { > > - cur->bc_ops->init_key_from_rec( > > - xfs_btree_key_addr(cur, 1, new), > > - xfs_btree_rec_addr(cur, 1, left)); > > - cur->bc_ops->init_key_from_rec( > > - xfs_btree_key_addr(cur, 2, new), > > - xfs_btree_rec_addr(cur, 1, right)); > > + /* > > + * Get the keys for the left block's records and put them > > + * directly in the parent block. Do the same for the right > > + * block. > > + */ > > + cur->bc_ops->get_leaf_keys(cur, left, > > + xfs_btree_key_addr(cur, 1, new)); > > + cur->bc_ops->get_leaf_keys(cur, right, > > + xfs_btree_key_addr(cur, 2, new)); > > } > > xfs_btree_log_keys(cur, nbp, 1, 2); > > > > @@ -2858,7 +2913,7 @@ xfs_btree_make_block_unfull( > > int *index, /* new tree index */ > > union xfs_btree_ptr *nptr, /* new btree ptr */ > > struct xfs_btree_cur **ncur, /* new btree cursor */ > > - union xfs_btree_key *key, /* key of new block */ > > + union xfs_btree_key *key, /* key of new block */ > > int *stat) > > { > > int error = 0; > > @@ -3086,8 +3141,8 @@ xfs_btree_insrec( > > xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); > > > > /* If we inserted at the start of a block, update the parents' keys. */ > > - if (optr == 1) { > > - error = xfs_btree_updkey(cur, key, level + 1); > > + if (xfs_btree_needs_key_update(cur, optr)) { > > + error = cur->bc_ops->update_keys(cur, level); > > if (error) > > goto error0; > > } > > @@ -3107,7 +3162,7 @@ xfs_btree_insrec( > > */ > > *ptrp = nptr; > > if (!xfs_btree_ptr_is_null(cur, &nptr)) { > > - *key = nkey; > > + xfs_btree_copy_keys(cur, key, &nkey, 1); > > *curp = ncur; > > } > > > > @@ -3386,8 +3441,6 @@ xfs_btree_delrec( > > struct xfs_buf *bp; /* buffer for block */ > > int error; /* error return value */ > > int i; /* loop counter */ > > - union xfs_btree_key key; /* storage for keyp */ > > - union xfs_btree_key *keyp = &key; /* passed to the next level */ > > union xfs_btree_ptr lptr; /* left sibling block ptr */ > > struct xfs_buf *lbp; /* left buffer pointer */ > > struct xfs_btree_block *left; /* left btree block */ > > @@ -3458,13 +3511,6 @@ xfs_btree_delrec( > > xfs_btree_log_keys(cur, bp, ptr, numrecs - 1); > > xfs_btree_log_ptrs(cur, bp, ptr, numrecs - 1); > > } > > - > > - /* > > - * If it's the first record in the block, we'll need to pass a > > - * key up to the next level (updkey). > > - */ > > - if (ptr == 1) > > - keyp = xfs_btree_key_addr(cur, 1, block); > > } else { > > /* It's a leaf. operate on records */ > > if (ptr < numrecs) { > > @@ -3473,16 +3519,6 @@ xfs_btree_delrec( > > -1, numrecs - ptr); > > xfs_btree_log_recs(cur, bp, ptr, numrecs - 1); > > } > > - > > - /* > > - * If it's the first record in the block, we'll need a key > > - * structure to pass up to the next level (updkey). > > - */ > > - if (ptr == 1) { > > - cur->bc_ops->init_key_from_rec(&key, > > - xfs_btree_rec_addr(cur, 1, block)); > > - keyp = &key; > > - } > > } > > > > /* > > @@ -3549,8 +3585,8 @@ xfs_btree_delrec( > > * If we deleted the leftmost entry in the block, update the > > * key values above us in the tree. > > */ > > - if (ptr == 1) { > > - error = xfs_btree_updkey(cur, keyp, level + 1); > > + if (xfs_btree_needs_key_update(cur, ptr)) { > > + error = cur->bc_ops->update_keys(cur, level); > > if (error) > > goto error0; > > } > > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > > index b4f3035..e097e60 100644 > > --- a/fs/xfs/libxfs/xfs_btree.h > > +++ b/fs/xfs/libxfs/xfs_btree.h > > @@ -180,6 +180,19 @@ struct xfs_btree_ops { > > union xfs_btree_rec *r1, > > union xfs_btree_rec *r2); > > #endif > > + > > + /* derive the low & high keys from the records in a leaf block */ > > + void (*get_leaf_keys)(struct xfs_btree_cur *cur, > > + struct xfs_btree_block *block, > > + union xfs_btree_key *key); > > + > > + /* derive the low & high keys from the keys in a node block */ > > + void (*get_node_keys)(struct xfs_btree_cur *cur, > > + struct xfs_btree_block *block, > > + union xfs_btree_key *key); > > + > > + /* update the parent keys of given btree level */ > > + int (*update_keys)(struct xfs_btree_cur *cur, int level); > > }; > > > > /* > > @@ -475,4 +488,10 @@ bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); > > uint xfs_btree_compute_maxlevels(struct xfs_mount *mp, uint *limits, > > unsigned long len); > > > > +void xfs_btree_get_leaf_keys(struct xfs_btree_cur *cur, > > + struct xfs_btree_block *block, union xfs_btree_key *key); > > +void xfs_btree_get_node_keys(struct xfs_btree_cur *cur, > > + struct xfs_btree_block *block, union xfs_btree_key *key); > > +int xfs_btree_update_keys(struct xfs_btree_cur *cur, int level); > > + > > #endif /* __XFS_BTREE_H__ */ > > diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c > > index 88da2ad..a48f448 100644 > > --- a/fs/xfs/libxfs/xfs_ialloc_btree.c > > +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c > > @@ -314,6 +314,10 @@ static const struct xfs_btree_ops xfs_inobt_ops = { > > .keys_inorder = xfs_inobt_keys_inorder, > > .recs_inorder = xfs_inobt_recs_inorder, > > #endif > > + > > + .get_leaf_keys = xfs_btree_get_leaf_keys, > > + .get_node_keys = xfs_btree_get_node_keys, > > + .update_keys = xfs_btree_update_keys, > > }; > > > > static const struct xfs_btree_ops xfs_finobt_ops = { > > @@ -335,6 +339,10 @@ static const struct xfs_btree_ops xfs_finobt_ops = { > > .keys_inorder = xfs_inobt_keys_inorder, > > .recs_inorder = xfs_inobt_recs_inorder, > > #endif > > + > > + .get_leaf_keys = xfs_btree_get_leaf_keys, > > + .get_node_keys = xfs_btree_get_node_keys, > > + .update_keys = xfs_btree_update_keys, > > }; > > > > /* > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Mon Aug 1 13:09:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EC0FE7D28 for ; Mon, 1 Aug 2016 13:09:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BD7AD304048 for ; Mon, 1 Aug 2016 11:09:03 -0700 (PDT) X-ASG-Debug-ID: 1470074940-0bf57b369d2f37c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id enPZrOricQZNj1uX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 11:09:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u71I8XFN014597 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 1 Aug 2016 18:08:33 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u71I8Wd8011472 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 18:08:33 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u71I8Qea005737; Mon, 1 Aug 2016 18:08:31 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 01 Aug 2016 11:08:20 -0700 Date: Mon, 1 Aug 2016 11:08:19 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 38/47] xfs: create rmap update intent log items Message-ID: <20160801180819.GD8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 38/47] xfs: create rmap update intent log items References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907721624.25461.1280539951915485473.stgit@birch.djwong.org> <20160801071237.GO15590@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801071237.GO15590@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470074940 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10297 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 01, 2016 at 12:12:37AM -0700, Christoph Hellwig wrote: > On Wed, Jul 20, 2016 at 10:00:16PM -0700, Darrick J. Wong wrote: > > Create rmap update intent/done log items to record redo information in > > the log. Because we need to roll transactions between updating the > > bmbt mapping and updating the reverse mapping, we also have to track > > the status of the metadata updates that will be recorded in the > > post-roll transactions, just in case we crash before committing the > > final transaction. This mechanism enables log recovery to finish what > > was already started. > > > > Signed-off-by: Darrick J. Wong > > Reviewed-by: Brian Foster > > There is absolutely no need to log the extent array in the rmap update > done item. We have always done this for the EFD, but if you look at it > it's not actually needed there either. I was aware that nothing ever used the extent array in the EFD and I've long wondered why it's even there. Fortunately it helps to have someone else say "nobody will ever use this, so don't go adding it for new redo items". :) I'll remove the extent arrays from the log update done items. --D > Something like the patch below (relative to your whole tree) will fix > this up and reduce the amount of data logged: > > diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h > index a8d794d..a6eed43 100644 > --- a/fs/xfs/libxfs/xfs_log_format.h > +++ b/fs/xfs/libxfs/xfs_log_format.h > @@ -658,9 +658,8 @@ struct xfs_rui_log_format { > struct xfs_rud_log_format { > __uint16_t rud_type; /* rud log item type */ > __uint16_t rud_size; /* size of this item */ > - __uint32_t rud_nextents; /* # of extents freed */ > + __uint32_t __pad; > __uint64_t rud_rui_id; /* id of corresponding rui */ > - struct xfs_map_extent rud_extents[1]; /* array of extents rmapped */ > }; > > /* > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index e51fd2b..e8638fd 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3482,9 +3482,7 @@ xlog_recover_rud_pass2( > struct xfs_ail *ailp = log->l_ailp; > > rud_formatp = item->ri_buf[0].i_addr; > - ASSERT(item->ri_buf[0].i_len == (sizeof(struct xfs_rud_log_format) + > - ((rud_formatp->rud_nextents - 1) * > - sizeof(struct xfs_map_extent)))); > + ASSERT(item->ri_buf[0].i_len == sizeof(struct xfs_rud_log_format)); > rui_id = rud_formatp->rud_rui_id; > > /* > diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c > index 6d6cc3b..7e47432 100644 > --- a/fs/xfs/xfs_rmap_item.c > +++ b/fs/xfs/xfs_rmap_item.c > @@ -273,36 +273,13 @@ static inline struct xfs_rud_log_item *RUD_ITEM(struct xfs_log_item *lip) > } > > STATIC void > -xfs_rud_item_free(struct xfs_rud_log_item *rudp) > -{ > - if (rudp->rud_format.rud_nextents > XFS_RUD_MAX_FAST_EXTENTS) > - kmem_free(rudp); > - else > - kmem_zone_free(xfs_rud_zone, rudp); > -} > - > -/* > - * This returns the number of iovecs needed to log the given rud item. > - * We only need 1 iovec for an rud item. It just logs the rud_log_format > - * structure. > - */ > -static inline int > -xfs_rud_item_sizeof( > - struct xfs_rud_log_item *rudp) > -{ > - return sizeof(struct xfs_rud_log_format) + > - (rudp->rud_format.rud_nextents - 1) * > - sizeof(struct xfs_map_extent); > -} > - > -STATIC void > xfs_rud_item_size( > struct xfs_log_item *lip, > int *nvecs, > int *nbytes) > { > *nvecs += 1; > - *nbytes += xfs_rud_item_sizeof(RUD_ITEM(lip)); > + *nbytes += sizeof(struct xfs_rud_log_format); > } > > /* > @@ -320,13 +297,11 @@ xfs_rud_item_format( > struct xfs_rud_log_item *rudp = RUD_ITEM(lip); > struct xfs_log_iovec *vecp = NULL; > > - ASSERT(rudp->rud_next_extent == rudp->rud_format.rud_nextents); > - > rudp->rud_format.rud_type = XFS_LI_RUD; > rudp->rud_format.rud_size = 1; > > xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_RUD_FORMAT, &rudp->rud_format, > - xfs_rud_item_sizeof(rudp)); > + sizeof(struct xfs_rud_log_format)); > } > > /* > @@ -374,7 +349,7 @@ xfs_rud_item_unlock( > > if (lip->li_flags & XFS_LI_ABORTED) { > xfs_rui_release(rudp->rud_ruip); > - xfs_rud_item_free(rudp); > + kmem_zone_free(xfs_rud_zone, rudp); > } > } > > @@ -398,7 +373,7 @@ xfs_rud_item_committed( > * aborted due to log I/O error). > */ > xfs_rui_release(rudp->rud_ruip); > - xfs_rud_item_free(rudp); > + kmem_zone_free(xfs_rud_zone, rudp); > > return (xfs_lsn_t)-1; > } > @@ -437,25 +412,14 @@ static const struct xfs_item_ops xfs_rud_item_ops = { > struct xfs_rud_log_item * > xfs_rud_init( > struct xfs_mount *mp, > - struct xfs_rui_log_item *ruip, > - uint nextents) > + struct xfs_rui_log_item *ruip) > > { > struct xfs_rud_log_item *rudp; > - uint size; > - > - ASSERT(nextents > 0); > - if (nextents > XFS_RUD_MAX_FAST_EXTENTS) { > - size = (uint)(sizeof(struct xfs_rud_log_item) + > - ((nextents - 1) * sizeof(struct xfs_map_extent))); > - rudp = kmem_zalloc(size, KM_SLEEP); > - } else { > - rudp = kmem_zone_zalloc(xfs_rud_zone, KM_SLEEP); > - } > > + rudp = kmem_zone_zalloc(xfs_rud_zone, KM_SLEEP); > xfs_log_item_init(mp, &rudp->rud_item, XFS_LI_RUD, &xfs_rud_item_ops); > rudp->rud_ruip = ruip; > - rudp->rud_format.rud_nextents = nextents; > rudp->rud_format.rud_rui_id = ruip->rui_format.rui_id; > > return rudp; > @@ -523,7 +487,7 @@ xfs_rui_recover( > error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); > if (error) > return error; > - rudp = xfs_trans_get_rud(tp, ruip, ruip->rui_format.rui_nextents); > + rudp = xfs_trans_get_rud(tp, ruip); > > for (i = 0; i < ruip->rui_format.rui_nextents; i++) { > rmap = &(ruip->rui_format.rui_extents[i]); > diff --git a/fs/xfs/xfs_rmap_item.h b/fs/xfs/xfs_rmap_item.h > index 59ef3ec..aefcc3a 100644 > --- a/fs/xfs/xfs_rmap_item.h > +++ b/fs/xfs/xfs_rmap_item.h > @@ -77,21 +77,15 @@ struct xfs_rui_log_item { > struct xfs_rud_log_item { > struct xfs_log_item rud_item; > struct xfs_rui_log_item *rud_ruip; > - uint rud_next_extent; > struct xfs_rud_log_format rud_format; > }; > > -/* > - * Max number of extents in fast allocation path. > - */ > -#define XFS_RUD_MAX_FAST_EXTENTS 16 > - > extern struct kmem_zone *xfs_rui_zone; > extern struct kmem_zone *xfs_rud_zone; > > struct xfs_rui_log_item *xfs_rui_init(struct xfs_mount *, uint); > struct xfs_rud_log_item *xfs_rud_init(struct xfs_mount *, > - struct xfs_rui_log_item *, uint); > + struct xfs_rui_log_item *); > int xfs_rui_copy_format(struct xfs_log_iovec *buf, > struct xfs_rui_log_format *dst_rui_fmt); > void xfs_rui_item_free(struct xfs_rui_log_item *); > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 45773df..24ef83e 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1770,9 +1770,7 @@ xfs_init_zones(void) > if (!xfs_icreate_zone) > goto out_destroy_ili_zone; > > - xfs_rud_zone = kmem_zone_init((sizeof(struct xfs_rud_log_item) + > - ((XFS_RUD_MAX_FAST_EXTENTS - 1) * > - sizeof(struct xfs_map_extent))), > + xfs_rud_zone = kmem_zone_init(sizeof(struct xfs_rud_log_item), > "xfs_rud_item"); > if (!xfs_rud_zone) > goto out_destroy_icreate_zone; > diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h > index bb4b84f..e2bf86a 100644 > --- a/fs/xfs/xfs_trans.h > +++ b/fs/xfs/xfs_trans.h > @@ -241,7 +241,7 @@ enum xfs_rmap_intent_type; > > void xfs_rmap_update_init_defer_op(void); > struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp, > - struct xfs_rui_log_item *ruip, uint nextents); > + struct xfs_rui_log_item *ruip); > int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, > struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, > __uint64_t owner, int whichfork, xfs_fileoff_t startoff, > diff --git a/fs/xfs/xfs_trans_rmap.c b/fs/xfs/xfs_trans_rmap.c > index 8341476..35650d6 100644 > --- a/fs/xfs/xfs_trans_rmap.c > +++ b/fs/xfs/xfs_trans_rmap.c > @@ -129,29 +129,14 @@ xfs_trans_log_start_rmap_update( > xfs_trans_set_rmap_flags(rmap, type, whichfork, state); > } > > -/* > - * This routine is called to allocate an "rmap update done" > - * log item that will hold nextents worth of extents. The > - * caller must use all nextents extents, because we are not > - * flexible about this at all. > - */ > struct xfs_rud_log_item * > xfs_trans_get_rud( > struct xfs_trans *tp, > - struct xfs_rui_log_item *ruip, > - uint nextents) > + struct xfs_rui_log_item *ruip) > { > struct xfs_rud_log_item *rudp; > > - ASSERT(tp != NULL); > - ASSERT(nextents > 0); > - > - rudp = xfs_rud_init(tp->t_mountp, ruip, nextents); > - ASSERT(rudp != NULL); > - > - /* > - * Get a log_item_desc to point at the new item. > - */ > + rudp = xfs_rud_init(tp->t_mountp, ruip); > xfs_trans_add_item(tp, &rudp->rud_item); > return rudp; > } > @@ -174,8 +159,6 @@ xfs_trans_log_finish_rmap_update( > xfs_exntst_t state, > struct xfs_btree_cur **pcur) > { > - uint next_extent; > - struct xfs_map_extent *rmap; > int error; > > error = xfs_rmap_finish_one(tp, type, owner, whichfork, startoff, > @@ -191,16 +174,6 @@ xfs_trans_log_finish_rmap_update( > tp->t_flags |= XFS_TRANS_DIRTY; > rudp->rud_item.li_desc->lid_flags |= XFS_LID_DIRTY; > > - next_extent = rudp->rud_next_extent; > - ASSERT(next_extent < rudp->rud_format.rud_nextents); > - rmap = &(rudp->rud_format.rud_extents[next_extent]); > - rmap->me_owner = owner; > - rmap->me_startblock = startblock; > - rmap->me_startoff = startoff; > - rmap->me_len = blockcount; > - xfs_trans_set_rmap_flags(rmap, type, whichfork, state); > - rudp->rud_next_extent++; > - > return error; > } > > @@ -255,7 +228,7 @@ xfs_rmap_update_create_done( > void *intent, > unsigned int count) > { > - return xfs_trans_get_rud(tp, intent, count); > + return xfs_trans_get_rud(tp, intent); > } > > /* Process a deferred rmap update. */ From Anna.Schumaker@netapp.com Mon Aug 1 14:00:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E26197D2A for ; Mon, 1 Aug 2016 14:00:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1C5D30405F for ; Mon, 1 Aug 2016 12:00:51 -0700 (PDT) X-ASG-Debug-ID: 1470078048-0bf57c136a296290001-NocioJ Received: from mx144.netapp.com (mx144.netapp.com [216.240.21.25]) by cuda.sgi.com with ESMTP id DgJYZdtxvljDPyNg (version=TLSv1.2 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 01 Aug 2016 12:00:49 -0700 (PDT) X-Barracuda-Envelope-From: Anna.Schumaker@netapp.com X-Barracuda-Effective-Source-IP: mx144.netapp.com[216.240.21.25] X-Barracuda-Apparent-Source-IP: 216.240.21.25 X-IronPort-AV: E=Sophos;i="5.28,456,1464678000"; d="scan'208";a="133567374" Received: from vmwexchts02-prd.hq.netapp.com ([10.122.105.23]) by mx144-out.netapp.com with ESMTP; 01 Aug 2016 12:00:45 -0700 Received: from smtp2.corp.netapp.com (10.57.159.114) by VMWEXCHTS02-PRD.hq.netapp.com (10.122.105.23) with Microsoft SMTP Server id 15.0.1210.3; Mon, 1 Aug 2016 12:00:39 -0700 Received: from gouda.nowheycreamery.com.hq.netapp.com ([10.63.234.159]) by smtp2.corp.netapp.com (8.13.1/8.13.1/NTAP-1.6) with ESMTP id u71J0hga025427; Mon, 1 Aug 2016 12:00:43 -0700 (PDT) From: Anna Schumaker To: CC: , Subject: [PATCH] xfs_io: Update man page for copy_range command Date: Mon, 1 Aug 2016 15:00:42 -0400 X-ASG-Orig-Subj: [PATCH] xfs_io: Update man page for copy_range command Message-ID: <20160801190042.8652-1-Anna.Schumaker@Netapp.com> X-Mailer: git-send-email 2.9.0 MIME-Version: 1.0 Content-Type: text/plain X-Barracuda-Connect: mx144.netapp.com[216.240.21.25] X-Barracuda-Start-Time: 1470078049 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1148 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Signed-off-by: Anna Schumaker --- man/man8/xfs_io.8 | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index b0300bb..2c56f09 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -556,6 +556,39 @@ Print timing statistics in a condensed format. .TP .B \-q Do not print timing statistics at all. +.RE +.PD +.TP +.TP +.BI "copy_range [ -s " src_offset " ] [ -d " dst_offset " ] [ -l " length " ] src_file" +On filesystems that support the +.BR copy_file_range (2) +system call, copies data from the +.I src_file +into the open file. If +.IR src_offset , +.IR dst_offset , +and +.I length +are omitted the contents of src_file will be copied to the beginning of the +open file, overwriting any data already there. +.RS 1.0i +.PD 0 +.TP 0.4i +.B \-s +Copy data from +.I src_file +beginning from +.IR src_offset . +.TP +.B \-d +Copy data into the open file beginning at +.IR dst_offset . +.TP +.B \-l +Copy up to +.I length +bytes of data. .SH MEMORY MAPPED I/O COMMANDS .TP -- 2.9.0 From darrick.wong@oracle.com Mon Aug 1 14:12:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 819BA7D2D for ; Mon, 1 Aug 2016 14:12:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 01219AC002 for ; Mon, 1 Aug 2016 12:12:00 -0700 (PDT) X-ASG-Debug-ID: 1470078717-0bf8157e6b35aad0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Z1IIk1r5BDrs7f8F (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 12:11:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u71JBVnx001030 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 19:11:31 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u71JBVgO005820 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 19:11:31 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u71JBS4H017324; Mon, 1 Aug 2016 19:11:29 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 01 Aug 2016 12:11:27 -0700 Date: Mon, 1 Aug 2016 12:11:26 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys Message-ID: <20160801191126.GE8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> <20160801064818.GJ15590@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801064818.GJ15590@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470078718 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7324 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Sun, Jul 31, 2016 at 11:48:18PM -0700, Christoph Hellwig wrote: > > v2: When we're deleting a record in a btree that supports overlapped > > interval records and the deletion results in two btree blocks being > > joined, we defer updating the high/low keys until after all possible > > joining (at higher levels in the tree) have finished. At this point, > > the btree pointers at all levels have been updated to remove the empty > > blocks and we can update the low and high keys. > > > > When we're doing this, we must be careful to update the keys of all > > node pointers up to the root instead of stopping at the first set of > > keys that don't need updating. This is because it's possible for a > > single deletion to cause joining of multiple levels of tree, and so > > we need to update everything going back to the root. > > > > v3: Make diff_two_keys return < 0, 0, or > 0 if key1 is less than, > > equal to, or greater than key2, respectively. This is consistent > > with the rest of the kernel and the C library. Clarify some comments > > and refactor the sibling_update function out of existence. Check the > > return value of btree_updkeys(). > > The changelogs go below the "-- " marker so that they don't appear > in the git log. That is unless they actually are useful like this > one and should be merged into the actual patch description instead > of being worded incrementally. > > > +++ b/fs/xfs/libxfs/xfs_btree.c > > @@ -51,7 +51,6 @@ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { > > #define xfs_btree_magic(cur) \ > > xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] > > > > - > > STATIC int /* error (0 or EFSCORRUPTED) */ > > xfs_btree_check_lblock( > > struct xfs_btree_cur *cur, /* btree cursor */ > > Random whitespace change that probably shouldn't be in the patch. Oops. > > @@ -428,6 +427,50 @@ xfs_btree_dup_cursor( > > * into a btree block (xfs_btree_*_offset) or return a pointer to the given > > * record, key or pointer (xfs_btree_*_addr). Note that all addressing > > * inside the btree block is done using indices starting at one, not zero! > > + * > > + * If XFS_BTREE_OVERLAPPING is set, then this btree supports keys containing > > And here we already have the flag I asked for in the last patch. I > think that should be enough to drop the new methods. (As I mentioned in a previous reply, I used to open code this: if (cur->bc_flags & XFS_BTREE_OVERLAPPING) xfs_btree_get_node_overlapped(...); else xfs_btree_get_node(...); but Dave prefers to dispatch this through function pointers so that the switching logic occurs in only one place.) > > +/* > > + * In-core key that holds both low and high keys for overlapped btrees. > > + * The two keys are packed next to each other on disk, so do the same > > + * in memory. Preserve the existing xfs_btree_key as a single key to > > + * avoid the mental model breakage that would happen if we passed a > > + * bigkey into a function that operates on a single key. > > + */ > > +union xfs_btree_bigkey { > > + struct xfs_bmbt_key bmbt; > > + xfs_bmdr_key_t bmbr; /* bmbt root block */ > > + xfs_alloc_key_t alloc; > > + struct xfs_inobt_key inobt; > > +}; > > I don't understand the purpose of this union at all, and the comment > seems misleading. Compared to union xfs_btree_key the only difference > seems to be that xfs_btree_bigkey is missing the > 'struct xfs_rmap_key rmap' member. How does that enable us to holds I think you might be missing a later patch, wherein we add the rmap stuff to the btree structures, which expands bigkey to look like this: union xfs_btree_bigkey { struct xfs_bmbt_key bmbt; xfs_bmdr_key_t bmbr; /* bmbt root block */ xfs_alloc_key_t alloc; struct xfs_inobt_key inobt; struct { struct xfs_rmap_key rmap; struct xfs_rmap_key rmap_hi; }; struct xfs_refcount_key refc; }; bigkey.rmap is the low key, bigkey.rmap_hi is the high key. None of the other btrees are overlapped, so they don't get a high key. > low and high keys? Also every single user seems to cast it to > xfs_btree_key which is a little odd and smells unsafe. On disk, the low and high keys of a pointer reside next to each other. The btree_split code wants to store the new block's keys somewhere so that the block can later be insrec'd into a higher btree level. It would be convenient if this incore storage could also store the two keys right next to each other so that we can memcpy key_len bytes from the temporary storage into the on-disk btree block and not have to special case that code. I thought about simply declaring an on-stack array of two union xfs_btree_keys. The array is big enough to contain both keys and eliminates the need for casting. On the other hand it's weird because the two keys have to be aligned to xfs_rmap_key boundaries, not xfs_btree_key, which means that the high key isn't necessarily stored in the second array element like the code would suggest. Then I thought about stuffing both low and high keys into xfs_rmap_key like so: struct xfs_rmap_key { __be32 rm_startblock; /* extent start block */ __be64 rm_owner; /* extent owner */ __be64 rm_offset; /* offset within the owner */ __be32 rm_hi_startblock; /* extent start block */ __be64 rm_hi_owner; /* extent owner */ __be64 rm_hi_offset; /* offset within the owner */ } __attribute__((packed)); But that was even uglier, because an overlapped btree has two keys associated with a pointer, not one gigantic key. It's also a non-starter because sometimes we want to be able to treat the high fields as a distinct key and then feed that key to the btree key handling functions; when we do this, the hi_ fields point past the end of the allotted space. The overlapped query range function and the btree scrubbers in later patches want to use high keys in this manner. So then there was this way: union xfs_btree_key { struct xfs_bmbt_key bmbt; xfs_bmdr_key_t bmbr; /* bmbt root block */ xfs_alloc_key_t alloc; struct xfs_inobt_key inobt; struct xfs_rmap_key rmap[2]; struct xfs_refcount_key refc; }; This gives us the storage we want and avoids casts, but it still doesn't fix the problem that sometimes we want to create a key pointer to just the high fields and treat that as a pointer. So I created the separate bigkey structure to get the storage size I wanted, and cast it to xfs_btree_key wherever it gets fed into the other parts of the btree code. It's smelly like you say, but at least we have a distinct type to help future us identify the three smelly places where we do this. What I really wanted to do instead of bigkey was this: struct xfs_btree_key *key = kmalloc(cur->bc_ops->key_len); ...except then we have a memory allocation. I don't have a problem with replacing the bigkey variables with two-element array and just living with the fact that the high key will not be found at key[1], but I worry that future me won't remember that subtlety. Whereas tracing the key pointers back to the bigkey on the stack is not subtle and even better the debugger correctly locates the high key contents. --D From darrick.wong@oracle.com Mon Aug 1 14:18:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C3BBF7D26 for ; Mon, 1 Aug 2016 14:18:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 97B838F8035 for ; Mon, 1 Aug 2016 12:18:34 -0700 (PDT) X-ASG-Debug-ID: 1470079110-0bf57c13682986f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id B8TuqWgjalSRK294 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 12:18:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u71JIRxY009909 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 19:18:28 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u71JIR9I015877 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 1 Aug 2016 19:18:27 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u71JIQcj021980; Mon, 1 Aug 2016 19:18:26 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 01 Aug 2016 12:18:26 -0700 Date: Mon, 1 Aug 2016 12:18:25 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys Message-ID: <20160801191825.GF8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> <20160801174719.GB64218@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801174719.GB64218@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470079110 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 20456 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 01, 2016 at 01:47:19PM -0400, Brian Foster wrote: > On Wed, Jul 20, 2016 at 09:56:52PM -0700, Darrick J. Wong wrote: > > On a filesystem with both reflink and reverse mapping enabled, it's > > possible to have multiple rmap records referring to the same blocks on > > disk. When overlapping intervals are possible, querying a classic > > btree to find all records intersecting a given interval is inefficient > > because we cannot use the left side of the search interval to filter > > out non-matching records the same way that we can use the existing > > btree key to filter out records coming after the right side of the > > search interval. This will become important once we want to use the > > rmap btree to rebuild BMBTs, or implement the (future) fsmap ioctl. > > > > (For the non-overlapping case, we can perform such queries trivially > > by starting at the left side of the interval and walking the tree > > until we pass the right side.) > > > > Therefore, extend the btree code to come closer to supporting > > intervals as a first-class record attribute. This involves widening > > the btree node's key space to store both the lowest key reachable via > > the node pointer (as the btree does now) and the highest key reachable > > via the same pointer and teaching the btree modifying functions to > > keep the highest-key records up to date. > > > > This behavior can be turned on via a new btree ops flag so that btrees > > that cannot store overlapping intervals don't pay the overhead costs > > in terms of extra code and disk format changes. > > > > v2: When we're deleting a record in a btree that supports overlapped > > interval records and the deletion results in two btree blocks being > > joined, we defer updating the high/low keys until after all possible > > joining (at higher levels in the tree) have finished. At this point, > > the btree pointers at all levels have been updated to remove the empty > > blocks and we can update the low and high keys. > > > > When we're doing this, we must be careful to update the keys of all > > node pointers up to the root instead of stopping at the first set of > > keys that don't need updating. This is because it's possible for a > > single deletion to cause joining of multiple levels of tree, and so > > we need to update everything going back to the root. > > > > v3: Make diff_two_keys return < 0, 0, or > 0 if key1 is less than, > > equal to, or greater than key2, respectively. This is consistent > > with the rest of the kernel and the C library. Clarify some comments > > and refactor the sibling_update function out of existence. Check the > > return value of btree_updkeys(). > > > > v4: In btree_updkeys(), evaluate the force_all parameter before > > running the key diff to avoid reading uninitialized memory when we're > > forcing a key update. This happens when we've allocated an empty slot > > at level N + 1 to point to a new block at level N and we're in the > > process of filling out the new keys. > > > > v5: Move the overlapping flag to bc_flags, refactor the get/update keys > > code, and let client btrees set a doublewide key length. > > > > Signed-off-by: Darrick J. Wong > > --- > > fs/xfs/libxfs/xfs_btree.c | 339 +++++++++++++++++++++++++++++++++++++++++++-- > > fs/xfs/libxfs/xfs_btree.h | 30 ++++ > > fs/xfs/xfs_trace.h | 36 +++++ > > 3 files changed, 392 insertions(+), 13 deletions(-) > > > > > > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > > index 70d1c60..1881536 100644 > > --- a/fs/xfs/libxfs/xfs_btree.c > > +++ b/fs/xfs/libxfs/xfs_btree.c > ... > > @@ -1918,14 +2053,107 @@ xfs_btree_get_keys( > > /* > > * Decide if we need to update the parent keys of a btree block. For > > * a standard btree this is only necessary if we're updating the first > > - * record/key. > > + * record/key. For an overlapping btree, we must always update the > > + * keys because the highest key can be in any of the records or keys > > + * in the block. > > */ > > static inline bool > > xfs_btree_needs_key_update( > > struct xfs_btree_cur *cur, > > int ptr) > > { > > - return ptr == 1; > > + return (cur->bc_flags & XFS_BTREE_OVERLAPPING) || ptr == 1; > > +} > > + > > +/* > > + * Update the low and high parent keys of the given level, progressing > > + * towards the root. If force_all is false, stop if the keys for a given > > + * level do not need updating. > > + */ > > +STATIC int > > +__xfs_btree_updkeys( > > + struct xfs_btree_cur *cur, > > + int level, > > + struct xfs_btree_block *block, > > + struct xfs_buf *bp0, > > + bool force_all) > > +{ > > + union xfs_btree_bigkey key; /* keys from current level */ > > + union xfs_btree_key *lkey; /* keys from the next level up */ > > + union xfs_btree_key *hkey; > > + union xfs_btree_key *nlkey; /* keys from the next level up */ > > + union xfs_btree_key *nhkey; > > + struct xfs_buf *bp; > > + int ptr; > > + > > + ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); > > + > > + /* Exit if there aren't any parent levels to update. */ > > + if (level + 1 >= cur->bc_nlevels) > > + return 0; > > + > > + trace_xfs_btree_updkeys(cur, level, bp0); > > + > > + lkey = (union xfs_btree_key *)&key; > > + hkey = xfs_btree_high_key_from_key(cur, lkey); > > So we create a bigkey object on the stack which presumably will contain > storage for both keys for overlapping trees, then cast and pass down the > normal xfs_btree_key structure throughout btree infrastructure. > > This seems slightly hairy/unfortunate in that we treat in-memory objects > sort of like a buffer pointer. As hch points out, it is also kind of > confusing (I had to skip forward to where the bigkey union was filled in > to get an idea of what was going on). I'm not a huge fan, though I > suppose the alternative might involve changing xfs_btree_key and > possibly a bunch of other code to accommodate the dual keys model. > Perhaps this is in fact the better option.. but have you considered any > options enough to comment on that at all? I did, and braindumped my notes in a reply to hch's email. Please see that. > > + xfs_btree_get_keys(cur, block, lkey); > > + for (level++; level < cur->bc_nlevels; level++) { > > +#ifdef DEBUG > > + int error; > > +#endif > > + block = xfs_btree_get_block(cur, level, &bp); > > + trace_xfs_btree_updkeys(cur, level, bp); > > +#ifdef DEBUG > > + error = xfs_btree_check_block(cur, block, level, bp); > > + if (error) { > > + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); > > + return error; > > + } > > +#endif > > + ptr = cur->bc_ptrs[level]; > > + nlkey = xfs_btree_key_addr(cur, ptr, block); > > + nhkey = xfs_btree_high_key_addr(cur, ptr, block); > > + if (!force_all && > > + !(cur->bc_ops->diff_two_keys(cur, nlkey, lkey) != 0 || > > + cur->bc_ops->diff_two_keys(cur, nhkey, hkey) != 0)) > > + break; > > + xfs_btree_copy_keys(cur, nlkey, lkey, 1); > > + xfs_btree_log_keys(cur, bp, ptr, ptr); > > + if (level + 1 >= cur->bc_nlevels) > > + break; > > + cur->bc_ops->get_node_keys(cur, block, lkey); > > + } > > + > > + return 0; > > +} > > + > ... > > } > > > > /* > ... > > @@ -2197,10 +2429,33 @@ xfs_btree_lshift( > > rkp = &key; > > } > > > > + /* > > + * Using a temporary cursor, update the parent key values of the > > + * block on the left. > > + */ > > + error = xfs_btree_dup_cursor(cur, &tcur); > > + if (error) > > + goto error0; > > + i = xfs_btree_firstrec(tcur, level); > > + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, error0); > > Nit: tcur Will fix this and the same problem in rshift. > > + > > + error = xfs_btree_decrement(tcur, level, &i); > > + if (error) > > + goto error1; > > + > > Can we conditionalize tcur creation/processing against the overlapping > flag as well and combine the two associated hunks? Yes, I think so. --D > Brian > > > /* Update the parent keys of the right block. */ > > error = cur->bc_ops->update_keys(cur, level); > > if (error) > > - goto error0; > > + goto error1; > > + > > + /* Update the parent high keys of the left block, if needed. */ > > + if (tcur->bc_flags & XFS_BTREE_OVERLAPPING) { > > + error = tcur->bc_ops->update_keys(tcur, level); > > + if (error) > > + goto error1; > > + } > > + > > + xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); > > > > /* Slide the cursor value left one. */ > > cur->bc_ptrs[level]--; > > @@ -2217,6 +2472,11 @@ out0: > > error0: > > XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); > > return error; > > + > > +error1: > > + XFS_BTREE_TRACE_CURSOR(tcur, XBT_ERROR); > > + xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR); > > + return error; > > } > > > > /* > > @@ -2369,6 +2629,13 @@ xfs_btree_rshift( > > if (error) > > goto error1; > > > > + /* Update the parent high keys of the left block, if needed. */ > > + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { > > + error = cur->bc_ops->update_keys(cur, level); > > + if (error) > > + goto error1; > > + } > > + > > /* Update the parent keys of the right block. */ > > error = cur->bc_ops->update_keys(tcur, level); > > if (error) > > @@ -2549,6 +2816,14 @@ __xfs_btree_split( > > xfs_btree_set_sibling(cur, rrblock, &rptr, XFS_BB_LEFTSIB); > > xfs_btree_log_block(cur, rrbp, XFS_BB_LEFTSIB); > > } > > + > > + /* Update the parent high keys of the left block, if needed. */ > > + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { > > + error = cur->bc_ops->update_keys(cur, level); > > + if (error) > > + goto error0; > > + } > > + > > /* > > * If the cursor is really in the right block, move it there. > > * If it's just pointing past the last entry in left, then we'll > > @@ -2989,7 +3264,8 @@ xfs_btree_insrec( > > struct xfs_buf *bp; /* buffer for block */ > > union xfs_btree_ptr nptr; /* new block ptr */ > > struct xfs_btree_cur *ncur; /* new btree cursor */ > > - union xfs_btree_key nkey; /* new block key */ > > + union xfs_btree_bigkey nkey; /* new block key */ > > + union xfs_btree_key *lkey; > > int optr; /* old key/record index */ > > int ptr; /* key/record index */ > > int numrecs;/* number of records */ > > @@ -2997,11 +3273,13 @@ xfs_btree_insrec( > > #ifdef DEBUG > > int i; > > #endif > > + xfs_daddr_t old_bn; > > > > XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); > > XFS_BTREE_TRACE_ARGIPR(cur, level, *ptrp, &rec); > > > > ncur = NULL; > > + lkey = (union xfs_btree_key *)&nkey; > > > > /* > > * If we have an external root pointer, and we've made it to the > > @@ -3030,6 +3308,7 @@ xfs_btree_insrec( > > > > /* Get pointers to the btree buffer and block. */ > > block = xfs_btree_get_block(cur, level, &bp); > > + old_bn = bp ? bp->b_bn : XFS_BUF_DADDR_NULL; > > numrecs = xfs_btree_get_numrecs(block); > > > > #ifdef DEBUG > > @@ -3056,7 +3335,7 @@ xfs_btree_insrec( > > xfs_btree_set_ptr_null(cur, &nptr); > > if (numrecs == cur->bc_ops->get_maxrecs(cur, level)) { > > error = xfs_btree_make_block_unfull(cur, level, numrecs, > > - &optr, &ptr, &nptr, &ncur, &nkey, stat); > > + &optr, &ptr, &nptr, &ncur, lkey, stat); > > if (error || *stat == 0) > > goto error0; > > } > > @@ -3141,8 +3420,17 @@ xfs_btree_insrec( > > /* Log the new number of records in the btree header. */ > > xfs_btree_log_block(cur, bp, XFS_BB_NUMRECS); > > > > - /* If we inserted at the start of a block, update the parents' keys. */ > > - if (xfs_btree_needs_key_update(cur, optr)) { > > + /* > > + * If we just inserted into a new tree block, we have to > > + * recalculate nkey here because nkey is out of date. > > + * > > + * Otherwise we're just updating an existing block (having shoved > > + * some records into the new tree block), so use the regular key > > + * update mechanism. > > + */ > > + if (bp && bp->b_bn != old_bn) { > > + xfs_btree_get_keys(cur, block, lkey); > > + } else if (xfs_btree_needs_key_update(cur, optr)) { > > error = cur->bc_ops->update_keys(cur, level); > > if (error) > > goto error0; > > @@ -3163,7 +3451,7 @@ xfs_btree_insrec( > > */ > > *ptrp = nptr; > > if (!xfs_btree_ptr_is_null(cur, &nptr)) { > > - xfs_btree_copy_keys(cur, key, &nkey, 1); > > + xfs_btree_copy_keys(cur, key, lkey, 1); > > *curp = ncur; > > } > > > > @@ -3194,18 +3482,20 @@ xfs_btree_insert( > > union xfs_btree_ptr nptr; /* new block number (split result) */ > > struct xfs_btree_cur *ncur; /* new cursor (split result) */ > > struct xfs_btree_cur *pcur; /* previous level's cursor */ > > - union xfs_btree_key key; /* key of block to insert */ > > + union xfs_btree_bigkey bkey; /* key of block to insert */ > > + union xfs_btree_key *key; > > union xfs_btree_rec rec; /* record to insert */ > > > > level = 0; > > ncur = NULL; > > pcur = cur; > > + key = (union xfs_btree_key *)&bkey; > > > > xfs_btree_set_ptr_null(cur, &nptr); > > > > /* Make a key out of the record data to be inserted, and save it. */ > > cur->bc_ops->init_rec_from_cur(cur, &rec); > > - cur->bc_ops->init_key_from_rec(&key, &rec); > > + cur->bc_ops->init_key_from_rec(key, &rec); > > > > /* > > * Loop going up the tree, starting at the leaf level. > > @@ -3217,7 +3507,7 @@ xfs_btree_insert( > > * Insert nrec/nptr into this level of the tree. > > * Note if we fail, nptr will be null. > > */ > > - error = xfs_btree_insrec(pcur, level, &nptr, &rec, &key, > > + error = xfs_btree_insrec(pcur, level, &nptr, &rec, key, > > &ncur, &i); > > if (error) { > > if (pcur != cur) > > @@ -3916,6 +4206,16 @@ xfs_btree_delrec( > > if (level > 0) > > cur->bc_ptrs[level]--; > > > > + /* > > + * We combined blocks, so we have to update the parent keys if the > > + * btree supports overlapped intervals. However, bc_ptrs[level + 1] > > + * points to the old block so that the caller knows which record to > > + * delete. Therefore, the caller must be savvy enough to call updkeys > > + * for us if we return stat == 2. The other exit points from this > > + * function don't require deletions further up the tree, so they can > > + * call updkeys directly. > > + */ > > + > > XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); > > /* Return value means the next level up has something to do. */ > > *stat = 2; > > @@ -3941,6 +4241,7 @@ xfs_btree_delete( > > int error; /* error return value */ > > int level; > > int i; > > + bool joined = false; > > > > XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); > > > > @@ -3954,6 +4255,18 @@ xfs_btree_delete( > > error = xfs_btree_delrec(cur, level, &i); > > if (error) > > goto error0; > > + if (i == 2) > > + joined = true; > > + } > > + > > + /* > > + * If we combined blocks as part of deleting the record, delrec won't > > + * have updated the parent high keys so we have to do that here. > > + */ > > + if (joined && (cur->bc_flags & XFS_BTREE_OVERLAPPING)) { > > + error = xfs_btree_updkeys_force(cur, 0); > > + if (error) > > + goto error0; > > } > > > > if (i == 0) { > > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > > index bb40457..3645d91 100644 > > --- a/fs/xfs/libxfs/xfs_btree.h > > +++ b/fs/xfs/libxfs/xfs_btree.h > > @@ -44,6 +44,20 @@ union xfs_btree_key { > > xfs_inobt_key_t inobt; > > }; > > > > +/* > > + * In-core key that holds both low and high keys for overlapped btrees. > > + * The two keys are packed next to each other on disk, so do the same > > + * in memory. Preserve the existing xfs_btree_key as a single key to > > + * avoid the mental model breakage that would happen if we passed a > > + * bigkey into a function that operates on a single key. > > + */ > > +union xfs_btree_bigkey { > > + struct xfs_bmbt_key bmbt; > > + xfs_bmdr_key_t bmbr; /* bmbt root block */ > > + xfs_alloc_key_t alloc; > > + struct xfs_inobt_key inobt; > > +}; > > + > > union xfs_btree_rec { > > xfs_bmbt_rec_t bmbt; > > xfs_bmdr_rec_t bmbr; /* bmbt root block */ > > @@ -162,11 +176,21 @@ struct xfs_btree_ops { > > union xfs_btree_rec *rec); > > void (*init_ptr_from_cur)(struct xfs_btree_cur *cur, > > union xfs_btree_ptr *ptr); > > + void (*init_high_key_from_rec)(union xfs_btree_key *key, > > + union xfs_btree_rec *rec); > > > > /* difference between key value and cursor value */ > > __int64_t (*key_diff)(struct xfs_btree_cur *cur, > > union xfs_btree_key *key); > > > > + /* > > + * Difference between key2 and key1 -- positive if key1 > key2, > > + * negative if key1 < key2, and zero if equal. > > + */ > > + __int64_t (*diff_two_keys)(struct xfs_btree_cur *cur, > > + union xfs_btree_key *key1, > > + union xfs_btree_key *key2); > > + > > const struct xfs_buf_ops *buf_ops; > > > > #if defined(DEBUG) || defined(XFS_WARN) > > @@ -249,6 +273,7 @@ typedef struct xfs_btree_cur > > #define XFS_BTREE_ROOT_IN_INODE (1<<1) /* root may be variable size */ > > #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ > > #define XFS_BTREE_CRC_BLOCKS (1<<3) /* uses extended btree blocks */ > > +#define XFS_BTREE_OVERLAPPING (1<<4) /* overlapping intervals */ > > > > > > #define XFS_BTREE_NOERROR 0 > > @@ -493,5 +518,10 @@ void xfs_btree_get_leaf_keys(struct xfs_btree_cur *cur, > > void xfs_btree_get_node_keys(struct xfs_btree_cur *cur, > > struct xfs_btree_block *block, union xfs_btree_key *key); > > int xfs_btree_update_keys(struct xfs_btree_cur *cur, int level); > > +void xfs_btree_get_leaf_keys_overlapped(struct xfs_btree_cur *cur, > > + struct xfs_btree_block *block, union xfs_btree_key *key); > > +void xfs_btree_get_node_keys_overlapped(struct xfs_btree_cur *cur, > > + struct xfs_btree_block *block, union xfs_btree_key *key); > > +int xfs_btree_update_keys_overlapped(struct xfs_btree_cur *cur, int level); > > > > #endif /* __XFS_BTREE_H__ */ > > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > > index 1451690..8fb59e6 100644 > > --- a/fs/xfs/xfs_trace.h > > +++ b/fs/xfs/xfs_trace.h > > @@ -38,6 +38,7 @@ struct xlog_recover_item; > > struct xfs_buf_log_format; > > struct xfs_inode_log_format; > > struct xfs_bmbt_irec; > > +struct xfs_btree_cur; > > > > DECLARE_EVENT_CLASS(xfs_attr_list_class, > > TP_PROTO(struct xfs_attr_list_context *ctx), > > @@ -2185,6 +2186,41 @@ DEFINE_DISCARD_EVENT(xfs_discard_toosmall); > > DEFINE_DISCARD_EVENT(xfs_discard_exclude); > > DEFINE_DISCARD_EVENT(xfs_discard_busy); > > > > +/* btree cursor events */ > > +DECLARE_EVENT_CLASS(xfs_btree_cur_class, > > + TP_PROTO(struct xfs_btree_cur *cur, int level, struct xfs_buf *bp), > > + TP_ARGS(cur, level, bp), > > + TP_STRUCT__entry( > > + __field(dev_t, dev) > > + __field(xfs_btnum_t, btnum) > > + __field(int, level) > > + __field(int, nlevels) > > + __field(int, ptr) > > + __field(xfs_daddr_t, daddr) > > + ), > > + TP_fast_assign( > > + __entry->dev = cur->bc_mp->m_super->s_dev; > > + __entry->btnum = cur->bc_btnum; > > + __entry->level = level; > > + __entry->nlevels = cur->bc_nlevels; > > + __entry->ptr = cur->bc_ptrs[level]; > > + __entry->daddr = bp ? bp->b_bn : -1; > > + ), > > + TP_printk("dev %d:%d btnum %d level %d/%d ptr %d daddr 0x%llx", > > + MAJOR(__entry->dev), MINOR(__entry->dev), > > + __entry->btnum, > > + __entry->level, > > + __entry->nlevels, > > + __entry->ptr, > > + (unsigned long long)__entry->daddr) > > +) > > + > > +#define DEFINE_BTREE_CUR_EVENT(name) \ > > +DEFINE_EVENT(xfs_btree_cur_class, name, \ > > + TP_PROTO(struct xfs_btree_cur *cur, int level, struct xfs_buf *bp), \ > > + TP_ARGS(cur, level, bp)) > > +DEFINE_BTREE_CUR_EVENT(xfs_btree_updkeys); > > + > > #endif /* _TRACE_XFS_H */ > > > > #undef TRACE_INCLUDE_PATH > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon Aug 1 19:29:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 24C367D31 for ; Mon, 1 Aug 2016 19:29:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 889C2AC002 for ; Mon, 1 Aug 2016 17:29:47 -0700 (PDT) X-ASG-Debug-ID: 1470097783-0bf57b369c317e30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id PPZs6zRBnBY7BJBb for ; Mon, 01 Aug 2016 17:29:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak0PAGjon1d5LDjQEGdsb2JhbABcg0WBUoZxnSQDBoxfihmGFwQCAoE0TQEBAQEBAQcBAQEBAQEBATZAhF4BAQQBOhwjBQsIAxgJDBkPBSUDBxoTiCkHwQQBAQgCASQehUSFFYR/hRwFmTOOdY9JjDCDd4JjAxyBXioyh2wBAQE Received: from ppp121-44-56-208.lns20.syd4.internode.on.net (HELO dastard) ([121.44.56.208]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Aug 2016 09:51:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUNSq-0003MP-MO; Tue, 02 Aug 2016 10:21:44 +1000 Date: Tue, 2 Aug 2016 10:21:44 +1000 From: Dave Chinner To: Boaz Harrosh Cc: Dan Williams , Jan Kara , "linux-nvdimm@lists.01.org" , XFS Developers , linux-fsdevel , linux-ext4 Subject: Re: Subtle races between DAX mmap fault and write path Message-ID: <20160802002144.GL16044@dastard> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path References: <20160727120745.GI6860@quack2.suse.cz> <20160727211039.GA20278@linux.intel.com> <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <579F20D9.80107@plexistor.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470097783 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6774 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31681 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 01, 2016 at 01:13:45PM +0300, Boaz Harrosh wrote: > On 07/30/2016 03:12 AM, Dave Chinner wrote: > <> > > > > If we track the dirty blocks from write in the radix tree like we > > for mmap, then we can just use a normal memcpy() in dax_do_io(), > > getting rid of the slow cache bypass that is currently run. Radix > > tree updates are much less expensive than a slow memcpy of large > > amounts of data, ad fsync can then take care of persistence, just > > like we do for mmap. > > > > No! > > mov_nt instructions, That "slow cache bypass that is currently run" above > is actually faster then cached writes by 20%, and if you add the dirty > tracking and cl_flush instructions it becomes x2 slower in the most > optimal case and 3 times slower in the DAX case. IOWs, we'd expect writing to a file with DAX to be faster than when buffered through the page cache and fsync()d, right? The numbers I get say otherwise. Filesystem on 8GB pmem block device: $ sudo mkfs.xfs -f /dev/pmem1 meta-data=/dev/pmem1 isize=512 agcount=4, agsize=524288 blks = sectsz=4096 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=0, rmapbt=0, reflink=0 data = bsize=4096 blocks=2097152, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Test command that writes 1GB to the filesystem: $ sudo time xfs_io -f -c "pwrite 0 1g" -c "sync" /mnt/scratch/foo wrote 1073741824/1073741824 bytes at offset 0 1 GiB, 262144 ops; 0:00:01.00 (880.040 MiB/sec and 225290.3317 ops/sec) 0.02user 1.13system 0:02.27elapsed 51%CPU (0avgtext+0avgdata 2344maxresident)k 0inputs+0outputs (0major+109minor)pagefaults 0swaps Results: pwrite B/W (MiB/s) runtime run no DAX DAX no DAX DAX 1 880.040 236.352 2.27s 4.34s 2 857.094 257.297 2.18s 3.99s 3 865.820 236.087 2.13s 4.34s It is quite clear that *DAX is much slower* than normal buffered IO through the page cache followed by a fsync(). Stop and think why that might be. We're only doing one copy with DAX, so why is the pwrite() speed 4x lower than for a copy into the page cache? We're not copying 4x the data here. We're copying it once. But there's another uncached write to each page during allocation to zero each block first, so we're actually doing two uncached writes to the page. And we're doing an allocation per page with DAX, whereas we're using delayed allocation in the buffered IO case which has much less overhead. The only thing we can do here to speed the DAX case up is do cached memcpy so that the data copy after zeroing runs at L1 cache speed (i.e. 50x faster than it currently does). Let's take the allocation out of it, eh? Let's do overwrite instead, fsync in the buffered Io case, no fsync for DAX: pwrite B/W (MiB/s) runtime run no DAX DAX no DAX DAX 1 1119 1125 1.85s 0.93s 2 1113 1121 1.83s 0.91s 3 1128 1078 1.80s 0.94s So, pwrite speeds are no different for DAX vs page cache IO. Also, now we can see the overhead of writeback - a second data copy to the pmem for the IO during fsync. If I take the fsync() away from the buffered IO, the runtime drops to 0.89-0.91s, which is identical to the DAX code. Given the DAX code has a short IO path than buffered IO, it's not showing any advantage speed for using uncached IO.... Let's go back to the allocation case, but this time take advantage of the new iomap based Io path in XFS to amortise the DAX allocation overhead by using a 16MB IO size instead of 4k: $ sudo time xfs_io -f -c "pwrite 0 1g -b 16m" -c sync /mnt/scratch/foo pwrite B/W (MiB/s) runtime run no DAX DAX no DAX DAX 1 1344 1028 1.63s 1.03s 2 1410 980 1.62s 1.06s 3 1399 1032 1.72s 0.99s So, pwrite bandwidth of the copy into the page cache is still much higher than that of the DAX path, but now the allocation overhead is minimised and hence the double copy in the buffered IO writeback path shows up. For completeness, lets just run the overwrite case here which is effectively just competing memcpy implementations, fsync for buffered, no fsync for DAX: pwrite B/W (MiB/s) runtime run no DAX DAX no DAX DAX 1 1791 1727 1.53s 0.59s 2 1768 1726 1.57s 0.59s 3 1799 1729 1.55s 0.59s Again, runtime shows the overhead of the double copy in the buffered IO/writeback path. It also shows the overhead in the DAX path of the allocation zeroing vs overwrite. If I drop the fsync from the buffered IO path, bandwidth remains the same but runtime drops to 0.55-0.57s, so again the buffered IO write path is faster than DAX while doing more work. IOws, the overhead of dirty page tracking in the page cache mapping tree is not significant in terms of write() performance. Hence I fail to see why it should be significant in the DAX path - it will probably have less overhead because we have less to account for in the DAX write path. The only performance penalty for dirty tracking is in the fsync writeback path itself, and that a separate issue for optimisation. Quite frankly, what I see here is that whatever optimisations that have been made to make DAX fast don't show any real world benefit. Further, the claims that dirty tracking has too much overhead are *completely shot down* by the fact that buffered write IO through the page cache is *faster* than the current DAX write IO path. > The network guys have noticed the mov_nt instructions superior > performance for years before we pushed DAX into the tree. look for > users of copy_from_iter_nocache and the comments when they where > introduced, those where used before DAX, and nothing at all to do > with persistence. > > So what you are suggesting is fine only 3 times slower in the current > implementation. What is optimal for one use case does not mean it is optimal for all. High level operation performance measurement disagrees with the assertion that we're using the *best* method of copying data in the DAX path available right now. Understand how data moves through the system, then optimise the data flow. What we are seeing here is that optimising for the fastest single data movement can result in lower overall performance where the code path requires multiple data movements to the same location.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sheena.37@hoistring.com Mon Aug 1 19:40:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=AXB_BODYMAIL_SBL112884, DATE_IN_PAST_12_24,FH_FROMEML_NOTLD,HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 24CED7D33 for ; Mon, 1 Aug 2016 19:40:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2ED630405F for ; Mon, 1 Aug 2016 17:40:08 -0700 (PDT) X-ASG-Debug-ID: 1470098402-0bf8157e6b381300001-NocioJ Received: from hoistring.com (no-data [60.27.28.103]) by cuda.sgi.com with SMTP id EsU9ICjceJ2t3ZHq for ; Mon, 01 Aug 2016 17:40:03 -0700 (PDT) X-Barracuda-Envelope-From: sheena.37@hoistring.com X-Barracuda-Effective-Source-IP: no-data[60.27.28.103] X-Barracuda-Apparent-Source-IP: 60.27.28.103 Received: from ksbwyj[127.0.0.1] by KSBWYJ[127.0.0.1] (SMTPD32); Mon, 1 Aug 2016 16:42:30 +0800 From: "rigging1@yeah.net " Subject: 2016-08-01 16:42:30hoist ring factory To: xfs@oss.sgi.com X-ASG-Orig-Subj: 2016-08-01 16:42:30hoist ring factory MIME-Version: 1.0 Sender: sheena.37@hoistring.com Reply-To: rigging1@yeah.net Date: Mon, 1 Aug 2016 16:42:30 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: no-data[60.27.28.103] X-Barracuda-Start-Time: 1470098402 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 875 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.46 X-Barracuda-Spam-Status: No, SCORE=1.46 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.50 BSF_SC0_MV0713 Custom rule MV0713 Message-Id: <20160802004008.8A257D80072@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC4xMDU4Ni4xNjIiPjwvSEVBRD4NCjxCT0RZPg0KPFA+SGksIHB1cmNo YXNpbmcgbWFuYWdlci48L1A+DQo8UD5Hb29kIGRheSE8L1A+DQo8UD5XZSBhcmUgaG9pc3Qgcmlu Zywgc3dpdmVsIGV5ZSBib2x0cyBhbmQgbGlmdGluZyBwb2ludCBtYW51ZmFjdHVyZXIsYW5kIHdl IA0KaGF2ZSByZXNlYXJjaGVkICZhbXA7IGRlc2lnbmVkIHNvbWUgbmV3IHByb2R1Y3QuPC9QPg0K PFA+SWYgeW91IGFyZSBpbnRlcmVzdGVkIGluLCBJICYjMzk7bGwgc2VuZCB5b3Ugb3VyIGNhdGFs b2d1ZS48L1A+DQo8UD5UaGFua3MgZm9yIHlvdXIgdmFsdWFibGUgdGltZS48L1A+DQo8UD5SZWdh cmRzLjwvUD4NCjxQPnNoZWVuYTwvUD4NCjxQPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LTwvUD4NCjxQPlNhbGVzIERlcGFydG1lbnQ8QlI+RS1tYWlsOnJpZ2dpbmcxQHllYWgubmV0PEJS PlNreXBlOnNoZWVuYS53YW5nMjAxMTxCUj5DZWxsIA0KcGhvbmU6MDA4Ni0xODYyMjg2MzYyMjxC Uj5UaWFuamluIFlpeXVuIFJpZ2dpbmcgQ28uLEx0ZDxCUj5BZGRyZXNzOiBOby43LCANClhpYW5n amlhbmcgUmluZyBSb2FkLCBEaXN0cmljdCBBLCBIb25nIEtvbmcgR2FyZGVuLCBEb25nbGkgRGV2 ZWxvcG1lbnQgWm9uZSANCixUaWFuamluLCBDaGluYTxCUj5aaXAgQ29kZTogMzAwMzAwPEJSPjwv UD48L0JPRFk+PC9IVE1MPg0KDQo= From mfasheh@suse.de Mon Aug 1 21:35:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA3827D33 for ; Mon, 1 Aug 2016 21:35:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF2E3304048 for ; Mon, 1 Aug 2016 19:35:12 -0700 (PDT) X-ASG-Debug-ID: 1470105308-0bf57b369c322c70001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Uq5sBaePRogjJwtK (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 01 Aug 2016 19:35:09 -0700 (PDT) X-Barracuda-Envelope-From: mfasheh@suse.de X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id DD0EAAAF1; Tue, 2 Aug 2016 02:35:07 +0000 (UTC) Date: Mon, 1 Aug 2016 19:35:07 -0700 From: Mark Fasheh To: "Darrick J. Wong" Cc: Al Viro , linux-api@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, "Kirill A. Shutemov" , Vlastimil Babka Subject: Re: [PATCH] vfs: cap dedupe request structure size at PAGE_SIZE Message-ID: <20160802023507.GH5316@wotan.suse.de> X-ASG-Orig-Subj: Re: [PATCH] vfs: cap dedupe request structure size at PAGE_SIZE Reply-To: Mark Fasheh References: <20160728183534.GB15753@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160728183534.GB15753@birch.djwong.org> Organization: SUSE Labs User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470105309 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 869 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31684 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Jul 28, 2016 at 11:35:34AM -0700, Darrick J. Wong wrote: > Kirill A. Shutemov reports that the kernel doesn't try to cap dest_count > in any way, and uses the number to allocate kernel memory. This causes > high order allocation warnings in the kernel log if someone passes in a > big enough value. We should clamp the allocation at PAGE_SIZE to avoid > stressing the VM. > > The two existing users of the dedupe ioctl never send more than 120 > requests, so we can safely clamp dest_range at PAGE_SIZE, because with > 4k pages we can handle up to 127 dedupe candidates. Given the max > extent length of 16MB, we can end up doing 2GB of IO which is plenty. > > Reported-by: "Kirill A. Shutemov" > Signed-off-by: Darrick J. Wong Reviewed-by: Mark Fasheh -- Mark Fasheh From darrick.wong@oracle.com Mon Aug 1 22:57:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 09EB37CA4 for ; Mon, 1 Aug 2016 22:57:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7FFE6AC001 for ; Mon, 1 Aug 2016 20:56:59 -0700 (PDT) X-ASG-Debug-ID: 1470110217-0bf8157e6b393640001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HoYRnjQXuLC2fIIo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 20:56:57 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u723usCn019993 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 03:56:55 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u723usBY023281 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 03:56:54 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u723uqOs005704; Tue, 2 Aug 2016 03:56:53 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 01 Aug 2016 20:56:52 -0700 Date: Mon, 1 Aug 2016 20:56:51 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: xfs@oss.sgi.com Subject: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace Message-ID: <20160802035651.GB8593@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470110217 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 976 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're iterating inode xattrs by handle, we have to copy the cursor back to userspace so that a subsequent invocation actually retrieves subsequent contents. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_ioctl.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 2ef22db..30e69f5 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -390,6 +390,7 @@ xfs_attrlist_by_handle( { int error = -ENOMEM; attrlist_cursor_kern_t *cursor; + struct xfs_fsop_attrlist_handlereq __user *p = arg; xfs_fsop_attrlist_handlereq_t al_hreq; struct dentry *dentry; char *kbuf; @@ -422,6 +423,11 @@ xfs_attrlist_by_handle( if (error) goto out_kfree; + if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) { + error = -EFAULT; + goto out_kfree; + } + if (copy_to_user(al_hreq.buffer, kbuf, al_hreq.buflen)) error = -EFAULT; From sheena.33@hoistring.com Mon Aug 1 23:57:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=AXB_BODYMAIL_SBL112884, FH_FROMEML_NOTLD,HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 647147D39 for ; Mon, 1 Aug 2016 23:57:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 37CAE304032 for ; Mon, 1 Aug 2016 21:57:35 -0700 (PDT) X-ASG-Debug-ID: 1470113851-0bf57b369c330180001-NocioJ Received: from hoistring.com (no-data [60.27.28.103]) by cuda.sgi.com with SMTP id BawQzaEotUi2PVA7 for ; Mon, 01 Aug 2016 21:57:32 -0700 (PDT) X-Barracuda-Envelope-From: sheena.33@hoistring.com X-Barracuda-Effective-Source-IP: no-data[60.27.28.103] X-Barracuda-Apparent-Source-IP: 60.27.28.103 Received: from ksbwyj[127.0.0.1] by KSBWYJ[127.0.0.1] (SMTPD32); Tue, 2 Aug 2016 12:37:16 +0800 From: "rigging1@yeah.net " Subject: 2016-08-02 12:37:16hoist ring factory To: xfs@oss.sgi.com X-ASG-Orig-Subj: 2016-08-02 12:37:16hoist ring factory MIME-Version: 1.0 Sender: sheena.33@hoistring.com Reply-To: rigging1@yeah.net Date: Tue, 2 Aug 2016 12:37:16 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: no-data[60.27.28.103] X-Barracuda-Start-Time: 1470113851 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 875 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.64 X-Barracuda-Spam-Status: No, SCORE=0.64 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0713 Custom rule MV0713 Message-Id: <20160802045735.C846A64005C@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC4xMDU4Ni4xNjIiPjwvSEVBRD4NCjxCT0RZPg0KPFA+SGksIHB1cmNo YXNpbmcgbWFuYWdlci48L1A+DQo8UD5Hb29kIGRheSE8L1A+DQo8UD5XZSBhcmUgaG9pc3Qgcmlu Zywgc3dpdmVsIGV5ZSBib2x0cyBhbmQgbGlmdGluZyBwb2ludCBtYW51ZmFjdHVyZXIsYW5kIHdl IA0KaGF2ZSByZXNlYXJjaGVkICZhbXA7IGRlc2lnbmVkIHNvbWUgbmV3IHByb2R1Y3QuPC9QPg0K PFA+SWYgeW91IGFyZSBpbnRlcmVzdGVkIGluLCBJICYjMzk7bGwgc2VuZCB5b3Ugb3VyIGNhdGFs b2d1ZS48L1A+DQo8UD5UaGFua3MgZm9yIHlvdXIgdmFsdWFibGUgdGltZS48L1A+DQo8UD5SZWdh cmRzLjwvUD4NCjxQPnNoZWVuYTwvUD4NCjxQPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LTwvUD4NCjxQPlNhbGVzIERlcGFydG1lbnQ8QlI+RS1tYWlsOnJpZ2dpbmcxQHllYWgubmV0PEJS PlNreXBlOnNoZWVuYS53YW5nMjAxMTxCUj5DZWxsIA0KcGhvbmU6MDA4Ni0xODYyMjg2MzYyMjxC Uj5UaWFuamluIFlpeXVuIFJpZ2dpbmcgQ28uLEx0ZDxCUj5BZGRyZXNzOiBOby43LCANClhpYW5n amlhbmcgUmluZyBSb2FkLCBEaXN0cmljdCBBLCBIb25nIEtvbmcgR2FyZGVuLCBEb25nbGkgRGV2 ZWxvcG1lbnQgWm9uZSANCixUaWFuamluLCBDaGluYTxCUj5aaXAgQ29kZTogMzAwMzAwPEJSPjwv UD48L0JPRFk+PC9IVE1MPg0KDQo= From zlang@redhat.com Tue Aug 2 01:49:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9944C7D3B for ; Tue, 2 Aug 2016 01:49:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6AFA18F8033 for ; Mon, 1 Aug 2016 23:49:06 -0700 (PDT) X-ASG-Debug-ID: 1470120544-0bf57c13682d55d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xogMWTE9VHPtEBWB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 01 Aug 2016 23:49:05 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8B6CC834 for ; Tue, 2 Aug 2016 06:49:04 +0000 (UTC) Received: from localhost (dhcp-12-154.nay.redhat.com [10.66.12.154]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u726n3aN022099; Tue, 2 Aug 2016 02:49:04 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: sandeen@redhat.com, Zorro Lang Subject: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails Date: Tue, 2 Aug 2016 14:49:00 +0800 X-ASG-Orig-Subj: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails Message-Id: <1470120540-15135-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 02 Aug 2016 06:49:04 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470120545 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2247 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 After XFS_GETNEXTQUOTA feature has been merged into linux kernel and xfsprogs, xfs_quota use Q_XGETNEXTQUOTA for report and dump, and fall back to old XFS_GETQUOTA ioctl if XFS_GETNEXTQUOTA fails. But when XFS_GETNEXTQUOTA fails, xfs_quota print a warning as "XFS_GETQUOTA: Invalid argument". That's due to kernel can't recognize XFS_GETNEXTQUOTA ioctl and return EINVAL. At this time, the warning is helpless, xfs_quota just need to fall back. Signed-off-by: Zorro Lang --- Hi, Both dump_file and report_mount have this problem, so I fix them together. xfstests xfs/299 can reproduce this bug in report_mount, the newest xfs/106 can reproduce both(dump and report, hope I didn't miss others:). This patch checks "if cmd == XFS_GETQUOTA", but I'm thinking about if we should check "if !(cmd == XFS_GETNEXTQUOTA && errno == EINVAL)"? The first one don't print all errors from XFS_GETNEXTQUOTA, but the second one only for EINVAL error. So the question become should we: 1) fall back silently if XFS_GETNEXTQUOTA fails? 2) Or fall back silently if kernel has no XFS_GETNEXTQUOTA feature? I think both of them make sense. What do you think? Thanks, Zorro quota/report.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/quota/report.c b/quota/report.c index 59290e1..70220b4 100644 --- a/quota/report.c +++ b/quota/report.c @@ -90,8 +90,10 @@ dump_file( else cmd = XFS_GETQUOTA; + /* Fall back silently if XFS_GETNEXTQUOTA fails, warn on XFS_GETQUOTA */ if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { - if (errno != ENOENT && errno != ENOSYS && errno != ESRCH) + if (errno != ENOENT && errno != ENOSYS && errno != ESRCH && + cmd == XFS_GETQUOTA) perror("XFS_GETQUOTA"); return 0; } @@ -347,8 +349,10 @@ report_mount( else cmd = XFS_GETQUOTA; + /* Fall back silently if XFS_GETNEXTQUOTA fails, warn on XFS_GETQUOTA*/ if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { - if (errno != ENOENT && errno != ENOSYS && errno != ESRCH) + if (errno != ENOENT && errno != ENOSYS && errno != ESRCH && + cmd == XFS_GETQUOTA) perror("XFS_GETQUOTA"); return 0; } -- 2.7.4 From bratiliner@ziza.ru Tue Aug 2 03:23:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DD4047D3D for ; Tue, 2 Aug 2016 03:23:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF42F304039 for ; Tue, 2 Aug 2016 01:23:02 -0700 (PDT) X-ASG-Debug-ID: 1470126177-0bf57c13682d7810001-NocioJ Received: from mx.qip.ru (host-212.96.232.53.tvksmp.pl [212.96.232.53]) by cuda.sgi.com with ESMTP id b4FrEzuB5EC6OGGd for ; Tue, 02 Aug 2016 01:22:58 -0700 (PDT) X-Barracuda-Envelope-From: bratiliner@ziza.ru X-Barracuda-Effective-Source-IP: host-212.96.232.53.tvksmp.pl[212.96.232.53] X-Barracuda-Apparent-Source-IP: 212.96.232.53 From: "=?utf-8?B?0JIgINGC0LXQvdC00LXRgNC90YvQuSDQvtGC0LTQtdC7?=" To: Subject: =?utf-8?B?0JfQsNC60LDQt9GH0LjQutCw0Lw6INCk0JctMjIzOiDQv9GA0LDQutGC0LjRh9C10YHQutC40LUg0YDQtdC60L7QvNC10L3QtNCw0YbQuNC4INC/0L4g0LfQsNC60YPQv9C+0YfQvdC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4LiDQoNCw0LzQvtGH0L3Ri9C1INC00L7Qs9C+0LLQvtGA0Ysg0LIg0L/RgNCw0LrRgtC40LrQtSAyMjMt0KTQlywg0Y3Qu9C10LrRgtGA0L7QvdC90YvQtSDRgtC+0YDQs9C4INC4INCw0YDQsdC40YLRgNCw0LY=?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?B?0JfQsNC60LDQt9GH0LjQutCw0Lw6INCk0JctMjIzOiDQv9GA0LDQutGC0LjRh9C10YHQutC40LUg0YDQtdC60L7QvNC10L3QtNCw0YbQuNC4INC/0L4g0LfQsNC60YPQv9C+0YfQvdC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4LiDQoNCw0LzQvtGH0L3Ri9C1INC00L7Qs9C+0LLQvtGA0Ysg0LIg0L/RgNCw0LrRgtC40LrQtSAyMjMt0KTQlywg0Y3Qu9C10LrRgtGA0L7QvdC90YvQtSDRgtC+0YDQs9C4INC4INCw0YDQsdC40YLRgNCw0LY=?= Message-ID: X-Mailer: Yamail [ http://yandex.ru ] 5.0 Date: Tue, 2 Aug 2016 11:22:56 +0300 Content-Transfer-Encoding: base64 Content-Type: text/html; charset=utf-8 X-Barracuda-Connect: host-212.96.232.53.tvksmp.pl[212.96.232.53] X-Barracuda-Start-Time: 1470126177 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15281 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.65 X-Barracuda-Spam-Status: No, SCORE=1.65 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 PGRpdj48dGFibGUgYmdjb2xvcj0iI0Y4RTREOCIgYm9yZGVyPSIxIiB3aWR0aD0iNzM1Ij48dGJv ZHk+PHRyPjx0ZCBiZ2NvbG9yPSIjRTdBODdFIiB3aWR0aD0iNCI+wqA8L3RkPjx0ZCBiZ2NvbG9y PSIjRTdBODdFIj7CoDwvdGQ+PHRkIGJnY29sb3I9IiNGOUU5REYiPsKgPC90ZD48dGQgYmdjb2xv cj0iI0Y0RDhDNiI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjRjBDQUIwIj7CoDwvdGQ+PC90cj48dHI+ PHRkIGJnY29sb3I9IiNFN0E4N0UiIHdpZHRoPSI0Ij7CoDwvdGQ+PHRkIGJnY29sb3I9IiNGREY5 RjciPjx0YWJsZSBiZ2NvbG9yPSIjRkNGNEVGIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIj48dGJv ZHk+PHRyPjx0ZCBiZ2NvbG9yPSIjRkRGOUY3Ij48cCBhbGlnbj0iY2VudGVyIj48Zm9udCBmYWNl PSJDYW1icmlhIj48YnIgLz48L2ZvbnQ+PHNwYW4gbGFuZz0iZW4tdXMiPjxmb250IGNvbG9yPSIj Q0MwMDAwIiBmYWNlPSJDYW1icmlhIiBzaXplPSI0Ij4wOSAtIDEwPC9mb250Pjwvc3Bhbj48Zm9u dCBjb2xvcj0iI0NDMDAwMCIgZmFjZT0iQ2FtYnJpYSI+PGZvbnQgc2l6ZT0iNCI+wqDQsNCy0LPR g9GB0YLQsCB8INCzLiDQnNC+0YHQutCy0LA8L2ZvbnQ+PC9mb250PjwvcD48cCBhbGlnbj0iY2Vu dGVyIj48Zm9udCBmYWNlPSJDYW1icmlhIj48Yj7Qn9GA0L7QvNC+0LrQvtC0PC9iPjxzcGFuIGxh bmc9ImVuLXVzIj48Yj46PC9iPsKgNDgyPC9zcGFuPjxiciAvPjxiciAvPjxmb250IGNvbG9yPSIj RkY2NjAwIiBzaXplPSI0Ij7QkNCa0KLQo9CQ0JvQrNCd0KvQlSDQktCe0J/QoNCe0KHQqyDQn9Cg 0JDQmtCi0JjQmtCYINCf0KDQmNCc0JXQndCV0J3QmNCvIDIyMy3QpNCXINChINCj0KfQldCi0J7Q nCDQmNCX0JzQldCd0JXQndCY0Jkg0JIg0JfQkNCa0J7QndCe0JTQkNCi0JXQm9Cs0KHQotCS0JU8 YnIgLz48L2ZvbnQ+PGZvbnQgY29sb3I9IiNGRjk5MzMiPjxiciAvPjwvZm9udD48Zm9udCBjb2xv cj0iIzAwMDA4MCIgc2l6ZT0iNCI+0J7QsdGD0YfQtdC90LjQtSDRgSDRg9GH0LDRgdGC0LjQtdC8 INGN0LrRgdC/0LXRgNGC0L7QsiDQuCDQv9GA0LXQtNGB0YLQsNCy0LjRgtC10LvRjyDQpNCQ0KEg 0KDQvtGB0YHQuNC4LjwvZm9udD48L2ZvbnQ+PC9wPjxwIGFsaWduPSJsZWZ0Ij48Zm9udCBmYWNl PSJDYW1icmlhIj48Yj48Zm9udCBzaXplPSIyIj7QntCx0YPRh9C10L3QuNC1INC00LvRjzo8L2Zv bnQ+PC9iPjxmb250IHNpemU9IjIiPsKg0YDRg9C60L7QstC+0LTQuNGC0LXQu9C10Lkg0Lgg0YHQ v9C10YbQuNCw0LvQuNGB0YLQvtCyINCz0L7RgdC60L7RgNC/0L7RgNCw0YbQuNC5LCDQk9Cj0J/Q vtCyLCDQpNCT0KPQnyDQuCDQnNCj0J/QvtCyLCDQsNCy0YLQvtC90L7QvNC90YvRhSzCoDxiciAv PtCx0Y7QtNC20LXRgtC90YvRhSDRg9GH0YDQtdC20LTQtdC90LjQuSDQuCDRgdGD0LHRitC10LrR gtC+0LIg0LXRgdGC0LXRgdGC0LLQtdC90L3Ri9GFINC80L7QvdC+0L/QvtC70LjQuTsg0LjRhSDQ tNC+0YfQtdGA0L3QuNGFINC+0YDQs9Cw0L3QuNC30LDRhtC40LksINGH0LvQtdC90L7QssKgPGJy IC8+0LfQsNC60YPQv9C+0YfQvdGL0YUg0LrQvtC80LjRgdGB0LjQuSDQt9Cw0LrQsNC30YfQuNC6 0L7Qsjsg0YHQv9C10YbQuNCw0LvQuNGB0YLQvtCyINGC0LXQvdC00LXRgNC90YvRhSDQvtGC0LTQ tdC70L7QsiDQuCDQvtGC0LTQtdC70L7QsiDQv9GA0L7QtNCw0LYg0LrQvtC80L/QsNC90LjQuS08 YnIgLz7Qv9C+0YHRgtCw0LLRidC40LrQvtCyICjQv9C+0LTRgNGP0LTRh9C40LrQvtCyKSwg0YHR g9Cx0YrQtdC60YLQvtCyINC80LDQu9C+0LPQviDQuCDRgdGA0LXQtNC90LXQs9C+INC/0YDQtdC0 0L/RgNC40L3QuNC80LDRgtC10LvRjNGB0YLQstCwLi48YnIgLz48YnIgLz48YnIgLz7Qo9GH0LDR gdGC0L3QuNC60LDQvCDQvtCx0YPRh9C10L3QuNGPINC/0YDQtdC00L7RgdGC0LDQstC70Y/QtdGC 0YHRjyDQodCULdC00LjRgdC6INGBINGA0LDQsdC+0YfQuNC80Lgg0Lgg0L3QvtGA0LzQsNGC0LjQ stC90YvQvNC4INC00L7QutGD0LzQtdC90YLQsNC80LgswqA8YnIgLz7QstC60LvRjtGH0LDRjtGJ 0LjQuTog0LrQvtC80L/Qu9C10LrRgiDQvdC+0YDQvNCw0YLQuNCy0L3Qvi3Qv9GA0LDQstC+0LLR i9GFINCw0LrRgtC+0LIg0L/QviDQt9Cw0LrQvtC90YMgMjIzLdCk0JcsINGA0LDQt9GK0Y/RgdC9 0LXQvdC40LnCoDxiciAvPtCc0LjQvdGN0LrQvtC90L7QvNGA0LDQt9Cy0LjRgtC40Y8g0Lgg0KTQ kNChOyDQvtCx0YDQsNC30YbRiyDQn9C+0LvQvtC20LXQvdC40Lkg0L4g0LfQsNC60YPQv9C60LUs INC30LDQutGD0L/QvtGH0L3QvtC5INC60L7QvNC40YHRgdC40LgsINC00L7QutGD0LzQtdC90YLQ sNGG0LjQuCDQvsKgPGJyIC8+0LfQsNC60YPQv9C60LU7INGE0L7RgNC80Ysg0L/RgNC+0YLQvtC6 0L7Qu9C+0LIsINC/0YDQuNC60LDQt9C+0LIg0L/QviDQvtGB0YPRidC10YHRgtCy0LvQtdC90LjR jiDQt9Cw0LrRg9C/0L7Qujsg0LTQvtC70LbQvdC+0YHRgtC90YPRjiDQuNC90YHRgtGA0YPQutGG 0LjRjsKgPGJyIC8+0YHQv9C10YbQuNCw0LvQuNGB0YLQsCDQvtGC0LTQtdC70LAg0LfQsNC60YPQ v9C+0Lo7INC80LXRgtC+0LTQuNC60YMg0L7RhtC10L3QutC4INC30LDRj9Cy0L7QuiDRg9GH0LDR gdGC0L3QuNC60L7QsiDQutC+0L3QutGD0YDRgdC+0LIg0Lgg0LfQsNC/0YDQvtGB0L7QssKgPGJy IC8+0L/RgNC10LTQu9C+0LbQtdC90LjQuTsg0L/QvtC00LHQvtGA0LrQuCDRgNC10YjQtdC90LjQ uSDQpNCQ0KEgKNCj0KTQkNChKSwg0LDRgNCx0LjRgtGA0LDQttC90YvRhSDRgdGD0LTQvtCyINC/ 0L4g0YHQv9C+0YDQsNC8INC/0L4gMjIzLdCk0JcuPC9mb250Pjxmb250IGNvbG9yPSIjQzBDMEMw Ij48YnIgLz48L2ZvbnQ+PGJyIC8+PGI+0J7QsdGD0YfQtdC90LjQtSDQv9GA0L7QstC+0LTQuNGC 0YHRjzxzcGFuIGxhbmc9ImVuLXVzIj46PC9zcGFuPjwvYj7CoNGBIDEwPHNwYW4gbGFuZz0iZW4t dXMiPjo8L3NwYW4+MDAg0LTQviAxNzxzcGFuIGxhbmc9ImVuLXVzIj46PC9zcGFuPjMwPGJyIC8+ PGJyIC8+PGI+0JzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDRgdC+0YHRgtC+0LjRgtGB0Y8g0L/QviDQ sNC00YDQtdGB0YM6wqA8L2I+PGJyIC8+0LwuINCR0LDRg9C80LDQvdGB0LrQsNGPLCDRg9C7LiDQ kdCw0YPQvNCw0L3RgdC60LDRjywg0LQuNiwg0YHRgtGALjIsINCRLtCmLjxiciAvPjxiciAvPjxm b250IGNvbG9yPSIjRkY2NjAwIj48Yj7QmNC90YTQvtGA0LzQsNGG0LjRjyDQuCDRgNC10LPQuNGB 0YLRgNCw0YbQuNGPINC/0L4g0YLQtdC70LXRhNC+0L3RgzwvYj48YnIgLz48L2ZvbnQ+wqA8YnIg Lz48Zm9udCBzaXplPSI0Ij44PC9mb250PsKgwqA8Zm9udCBzaXplPSIyIj7QutC+0LQg0LPQvtGA 0L7QtNCwwqA8L2ZvbnQ+PGZvbnQgc2l6ZT0iNCI+KDQ5NSnCoDwvZm9udD7CoDxmb250IHNpemU9 IjIiPtGC0LXQuzwvZm9udD48c3BhbiBsYW5nPSJlbi11cyI+PGZvbnQgc2l6ZT0iMiI+OjwvZm9u dD48L3NwYW4+wqDCoDxmb250IHNpemU9IjQiPjk2MS0wMC0zODwvZm9udD7CoMKgPGZvbnQgc2l6 ZT0iMiI+KNC80L3QvtCz0L7QutCw0L3QsNC70YzQvdGL0LkpPC9mb250PjxiPjxiciAvPsKgPC9i PjwvZm9udD48L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48dGFibGUgYm9yZGVyPSIxIiB3 aWR0aD0iMTAwJSI+PHRib2R5Pjx0cj48dGQ+PHAgYWxpZ249ImNlbnRlciI+PGZvbnQgY29sb3I9 IiMwMDAwODAiIGZhY2U9IkNhbWJyaWEiIHNpemU9IjQiPtCa0YDQsNGC0LrQsNGPINC/0YDQvtCz 0YDQsNC80LzQsDo8L2ZvbnQ+PC9wPjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PHA+PGZvbnQg ZmFjZT0iQ2FtYnJpYSI+PGI+MS4g0JfQsNC60L7QvdC+0LTQsNGC0LXQu9GM0L3QvtC1INGA0LXQ s9GD0LvQuNGA0L7QstCw0L3QuNC1INC30LDQutGD0L/QvtC6LjwvYj48YnIgLz7Qk9GA0LDQttC0 0LDQvdGB0LrQuNC5INCa0L7QtNC10LrRgSwg0LfQsNC60L7QvSAyMjMt0KTQlyAo0LIg0YDQtdC0 0LDQutGG0LjQuCDQvtGCIDEzLjA3LjIwMTUg0LMuKSwg0LfQsNC60L7QvSDQviDQutC+0L3RgtGA 0LDQutGC0L3QvtC5INGB0LjRgdGC0LXQvNC1IDQ0LTxiciAvPtCk0JcsINC30LDQutC+0L0gMTM1 LdCk0JcgwqvQniDQt9Cw0YnQuNGC0LUg0LrQvtC90LrRg9GA0LXQvdGG0LjQuMK7LiDQn9C+0YHR gtCw0L3QvtCy0LvQtdC90LjRjyDQn9GA0LDQstC40YLQtdC70YzRgdGC0LLQsCDihJYgMTE2OSwg MTM1MiwgMTEzMizCoDxiciAvPjkwOCwgOTMyLCA2MTYg0Lgg0LTRgC48YnIgLz48Yj4yLiDQn9C+ 0YHQu9C10LTQvdC40LUg0LjQt9C80LXQvdC10L3QuNGPINC30LDQutC+0L3QsCDihJYgMjIzLdCk 0JcuPC9iPjxiciAvPtCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0LfQsNC60YPQv9C+0Log0L/RgNC4 INGA0LXQsNC70LjQt9Cw0YbQuNC4INC40L3QstC10YHRgtC40YbQuNC+0L3QvdGL0YUg0L/RgNC+ 0LXQutGC0L7Qsjsg0LLQstC10LTQtdC90LjQtSDQvtGG0LXQvdC60Lgg0Lgg0LzQvtC90LjRgtC+ 0YDQuNC90LPQsMKgPGJyIC8+0L/RgNC+0LXQutGC0L7QsiDQv9C70LDQvdC+0LIsINC/0LvQsNC9 0L7QsiDQt9Cw0LrRg9C/0LrQuCDQuCDQvtGC0YfQtdGC0L7QsiDQt9Cw0LrQsNC30YfQuNC60L7Q siwg0LfQsNC/0YDQtdGCINC90LAg0LfQsNC60LvRjtGH0LXQvdC40LUg0LTQvtCz0L7QstC+0YDQ vtCyLCDQvdC1wqA8YnIgLz7QstC60LvRjtGH0LXQvdC90YvRhSDQsiDQv9C70LDQvSDQt9Cw0LrR g9C/0LrQuC48YnIgLz48Yj4zLiDQn9C70LDQvdC40YDRg9C10LzRi9C1INC40LfQvNC10L3QtdC9 0LjRjyAyMjMt0KTQly48L2I+PGJyIC8+0J7Qs9GA0LDQvdC40YfQtdC90L3Ri9C5INC/0LXRgNC1 0YfQtdC90Ywg0YHQv9C+0YHQvtCx0L7QsiDQuCDRjdGC0LDQv9C+0LIg0L/RgNC+0LLQtdC00LXQ vdC40Y8g0LfQsNC60YPQv9C60LgsINC+0YLQsdC+0YAg0L7Qv9C10YDQsNGC0L7RgNC+0LIg0Y3Q u9C10LrRgtGA0L7QvdC90YvRhcKgPGJyIC8+0L/Qu9C+0YnQsNC00L7Quiwg0LLQstC10LTQtdC9 0LjQtSDRgtC40L/QvtCy0YvRhSDQv9C+0LvQvtC20LXQvdC40Lkg0L4g0LfQsNC60YPQv9C60LUs INGA0LDRgdGI0LjRgNC10L3QuNC1INCy0L7Qt9C80L7QttC90L7RgdGC0LXQuSDQtNC70Y8g0L7Q sdC20LDQu9C+0LLQsNC90LjRj8KgPGJyIC8+0LfQsNC60YPQv9C+0LosINCy0LLQtdC00LXQvdC4 0LUg0L/RgNC+0YbQtdC00YPRgNC90YvRhSDQvdC+0YDQvCDQtNC70Y8g0LrQvtC90LrRg9GA0LXQ vdGC0L3Ri9GFINGB0L/QvtGB0L7QsdC+0LIg0LfQsNC60YPQv9C60LgsINC/0LXRgNC10LLQvtC0 INC60L7QvdC60YPRgNC10L3RgtC90YvRhcKgPGJyIC8+0LfQsNC60YPQv9C+0Log0LIg0Y3Qu9C1 0LrRgtGA0L7QvdC90YPRjiDRhNC+0YDQvNGDLCDRg9C20LXRgdGC0L7Rh9C10L3QuNC1INGC0YDQ tdCx0L7QstCw0L3QuNC5INC6INGA0LDQt9C80LXRidC10L3QuNGOINC40L3RhNC+0YDQvNCw0YbQ uNC4INCyINCV0JjQoS7CoDxiciAvPjxiPjQuINCX0LDQutCw0LfRh9C40LrQuCwg0L/RgNC40LzQ tdC90Y/RjtGJ0LjQtSDQvdC+0YDQvNGLINCk0JctMjIzLjwvYj7CoDxiciAvPjxzcGFuIGxhbmc9 ImVuLXVzIj7CoMKgwqA8L3NwYW4+0J7RgdC+0LHQtdC90L3QvtGB0YLQuCDQt9Cw0LrRg9C/0L7Q uiDQsdGO0LTQttC10YLQvdGL0YUg0YPRh9GA0LXQttC00LXQvdC40Lkg0L/QviAyMjMt0KTQlywg 0LDQstGC0L7QvdC+0LzQvdGL0YUg0YPRh9GA0LXQttC00LXQvdC40LkswqA8YnIgLz48c3BhbiBs YW5nPSJlbi11cyI+wqDCoMKgPC9zcGFuPtGD0L3QuNGC0LDRgNC90YvRhSDQv9GA0LXQtNC/0YDQ uNGP0YLQuNC5LjxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqA8L3NwYW4+0J7RgdC90L7Q stC90YvQtSDQvtGC0LvQuNGH0LjRjyDQt9Cw0LrRg9C/0L7QuiDQv9C+IDIyMy3QpNCXINC4IDQ0 LdCk0JcgKNC60L7QvdGC0YDQsNC60YLQvdCw0Y8g0YHQuNGB0YLQtdC80LApLjxiciAvPjxzcGFu IGxhbmc9ImVuLXVzIj7CoMKgwqA8L3NwYW4+PGI+0J/QvtC70L7QttC10L3QuNC1INC+INC30LDQ utGD0L/QutC1OjwvYj7CoNGB0YLRgNGD0LrRgtGD0YDQsCwg0L7RgdC+0LHQtdC90L3QvtGB0YLQ uCDQtNC70Y8g0YDQsNC30LvQuNGH0L3Ri9GFINC30LDQutCw0LfRh9C40LrQvtCyLCDQvtCx0LfQ vtGAINGC0LjQv9C+0LLRi9GFwqA8YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgPC9zcGFu PtC/0L7Qu9C+0LbQtdC90LjQuS4g0KLQuNC/0LjRh9C90YvQtSDQvtGI0LjQsdC60Lgg0LfQsNC6 0LDQt9GH0LjQutC+0LIuINCg0LXQutC+0LzQtdC90LTQsNGG0LjQuCDQv9C+INC40LfQvNC10L3Q tdC90LjRjiDQuCDQtNC+0L/QvtC70L3QtdC90LjRjsKgPGJyIC8+PHNwYW4gbGFuZz0iZW4tdXMi PsKgwqDCoDwvc3Bhbj7Qn9C+0LvQvtC20LXQvdC40Y8g0L4g0LfQsNC60YPQv9C60LUsINGBINGD 0YfQtdGC0L7QvCDQuNC30LzQtdC90LXQvdC40Lkg0LfQsNC60L7QvdCwIOKEliAyMjMt0KTQly48 YnIgLz48Yj41LiDQodGC0LDQvdC00LDRgNGCPC9iPsKg0LfQsNC60YPQv9C+0YfQvdC+0Lkg0LTQ tdGP0YLQtdC70YzQvdC+0YHRgtC4INC/0L4gMjIzLdCk0Jcg0L7RgiDQpNCQ0KE6INC90LXQvtCx 0YXQvtC00LjQvNGL0LUg0LjQt9C80LXQvdC10L3QuNGPINCywqA8YnIgLz7RgNC10LPRg9C70LjR gNC+0LLQsNC90LjQuCDQt9Cw0LrRg9C/0L7Qui48YnIgLz48Yj42LiDQn9C70LDQvdC40YDQvtCy 0LDQvdC40LUg0LfQsNC60YPQv9C+0LouPC9iPsKgPGJyIC8+PHNwYW4gbGFuZz0iZW4tdXMiPsKg wqDCoDwvc3Bhbj7QmNC30LzQtdC90LXQvdC40Y8g0L/QvtGA0Y/QtNC60LAg0L/Qu9Cw0L3QuNGA 0L7QstCw0L3QuNGPINC30LDQutGD0L/QvtC6INCyIDIwMTYg0LPQvtC00YMuINCf0LXRgNC10YXQ vtC0INC6INC40YHQv9C+0LvRjNC30L7QstCw0L3QuNGOwqA8YnIgLz48c3BhbiBsYW5nPSJlbi11 cyI+wqDCoMKgPC9zcGFuPtC60LvQsNGB0YHQuNGE0LjQutCw0YLQvtGA0L7QsiDQntCa0J/QlDIs INCe0JrQktCt0JQyLjxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqA8L3NwYW4+0J/Qu9Cw 0L3QuNGA0L7QstCw0L3QuNC1INC30LDQutGD0L/QvtC6INGDINGB0YPQsdGK0LXQutGC0L7QsiDQ vNCw0LvQvtCz0L4g0Lgg0YHRgNC10LTQvdC10LPQviDQv9GA0LXQtNC/0YDQuNC90LjQvNCw0YLQ tdC70YzRgdGC0LLQsC48YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgPC9zcGFuPtCe0YbQ tdC90LrQsCDQuCDQvNC+0L3QuNGC0L7RgNC40L3QsyDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Y8g 0L/Qu9Cw0L3QvtCyINC30LDQutGD0L/QutC4LCDQv9GA0L7QtdC60YLQvtCyINC/0LvQsNC90L7Q siwg0LjQt9C80LXQvdC10L3QuNC5INC/0LvQsNC90L7QsiDQuMKgPGJyIC8+PHNwYW4gbGFuZz0i ZW4tdXMiPsKgwqDCoDwvc3Bhbj7Qv9GA0L7QtdC60YLQvtCyINC40LfQvNC10L3QtdC90LjQuSDQ siDRh9Cw0YHRgtC4INGB0L7QvtGC0LLQtdGC0YHRgtCy0LjRjyDQt9Cw0LrQvtC90L7QtNCw0YLQ tdC70YzRgdGC0LLRgyDQviDRgNCw0LfQstC40YLQuNC4INC80LDQu9C+0LPQviDQuCDRgdGA0LXQ tNC90LXQs9C+wqA8YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgPC9zcGFuPtC/0YDQtdC0 0L/RgNC40L3QuNC80LDRgtC10LvRjNGB0YLQstCwLjxiciAvPjxiPjcuINCV0LTQuNC90LDRjyDQ uNC90YTQvtGA0LzQsNGG0LjQvtC90L3QsNGPINGB0LjRgdGC0LXQvNCwINCyINGB0YTQtdGA0LUg 0LfQsNC60YPQv9C+0LogKNCV0JjQoSkuPC9iPjxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKg wqA8L3NwYW4+0J/RgNC40L3RhtC40L/QuNCw0LvRjNC90YvQtSDQvtGC0LvQuNGH0LjRjyDQvtGC INC+0YTQuNGG0LjQsNC70YzQvdC+0LPQviDRgdCw0LnRgtCwLCDRgdGC0YDRg9C60YLRg9GA0LAs INGB0L7QtNC10YDQttCw0L3QuNC1LCDQvdC+0LLRi9C1INGC0YDQtdCx0L7QstCw0L3QuNGPPGJy IC8+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoDwvc3Bhbj7QuiDRgNCw0LfQvNC10YnQtdC90LjR jiDQuNC90YTQvtGA0LzQsNGG0LjQuCDQviDQt9Cw0LrRg9C/0LrQsNGFLjxiciAvPjxzcGFuIGxh bmc9ImVuLXVzIj7CoMKgwqA8L3NwYW4+0KDQtdC10YHRgtGAINC00L7Qs9C+0LLQvtGA0L7Qsiwg 0LfQsNC60LvRjtGH0LDQtdC80YvRhSDQv9C+INC40YLQvtCz0LDQvCDQt9Cw0LrRg9C/0LrQuC48 YnIgLz48Yj44LiDQn9C+0YDRj9C00L7Quiwg0Y3RgtCw0L/RiyDQv9GA0L7QstC10LTQtdC90LjR jyDQt9Cw0L/RgNC+0YHQsCDQv9GA0LXQtNC70L7QttC10L3QuNC5LCDQutC+0L3QutGD0YDRgdCw LCDQt9Cw0L/RgNC+0YHQsCDQutC+0YLQuNGA0L7QstC+0LogKNGG0LXQvSkswqA8YnIgLz7RjdC7 0LXQutGC0YDQvtC90L3QvtCz0L4g0LDRg9C60YbQuNC+0L3QsC48L2I+wqA8YnIgLz48c3BhbiBs YW5nPSJlbi11cyI+wqDCoMKgPC9zcGFuPtCY0LfQstC10YnQtdC90LjQtS4g0JTQvtC60YPQvNC1 0L3RgtCw0YbQuNGPINC+INC30LDQutGD0L/QutC1LiDQoNCw0LfRgNCw0LHQvtGC0LrQsCDRgtC1 0YXQvdC40YfQtdGB0LrQuNGFINC30LDQtNCw0L3QuNC5LCDQv9GA0L7QtdC60YLQsCDQtNC+0LPQ vtCy0L7RgNCwLsKgPGJyIC8+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoDwvc3Bhbj7Qn9GA0LDQ utGC0LjQutCwINC+0LHQttCw0LvQvtCy0LDQvdC40Y8g0LTQvtC60YPQvNC10L3RgtCw0YbQuNC4 INC+INC30LDQutGD0L/QutC1LjxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqA8L3NwYW4+ 0KLRgNC10LHQvtCy0LDQvdC40Y8g0Log0YPRh9Cw0YHRgtC90LjQutCw0Lwg0LfQsNC60YPQv9C+ 0Lo6INC+0LHRj9C30LDRgtC10LvRjNC90YvQtSDQuCDQtNC+0L/QvtC70L3QuNGC0LXQu9GM0L3R i9C1LiDQmtCy0LDQu9C40YTQuNC60LDRhtC40Y/CoDxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7C oMKgwqA8L3NwYW4+0YPRh9Cw0YHRgtC90LjQutC+0LI6INGC0YDQtdCx0L7QstCw0L3QuNC1INC4 INC60YDQuNGC0LXRgNC40Lkg0L7RhtC10L3QutC4INC30LDRj9Cy0L7QujxiciAvPjxzcGFuIGxh bmc9ImVuLXVzIj7CoMKgwqA8L3NwYW4+PGk+PGI+0KLRgNC10L3QuNC90LM6PC9iPjwvaT7CoNCy 0YvRj9Cy0LvQtdC90LjQtSDQuCDQuNGB0L/RgNCw0LLQu9C10L3QuNC1INC+0YjQuNCx0L7QuiDQ siDQtNC+0LrRg9C80LXQvdGC0LDRhtC40Lgg0L4g0LfQsNC60YPQv9C60LU8YnIgLz48c3BhbiBs YW5nPSJlbi11cyI+wqDCoMKgPC9zcGFuPtCe0LHRj9C30LDRgtC10LvRjNC90YvQtSDQt9Cw0LrR g9C/0LrQuCDRgyDRgdGD0LHRitC10LrRgtC+0LIg0LzQsNC70L7Qs9C+INC4INGB0YDQtdC00L3Q tdCz0L4g0L/RgNC10LTQv9GA0LjQvdC40LzQsNGC0LXQu9GM0YHRgtCy0LAuINCf0L7RgdGC0LDQ vdC+0LLQu9C10L3QuNC1wqA8YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgPC9zcGFuPtCf 0YDQsNCy0LjRgtC10LvRjNGB0YLQstCwIOKEliAxMzUyLiDQodC/0L7RgdC+0LHRiyDQt9Cw0LrR g9C/0L7QuiDRgyDQodCc0LjQodCfLiDQntCx0Y/Qt9Cw0YLQtdC70YzQvdGL0LUg0YLRgNC10LHQ vtCy0LDQvdC40Y8g0Log0LfQsNC60YPQv9C60LDQvC7CoDxiciAvPjxzcGFuIGxhbmc9ImVuLXVz Ij7CoMKgwqA8L3NwYW4+0J3QvtCy0LDRjyDRhNC+0YDQvNCwINC00LXQutC70LDRgNCw0YbQuNC4 INGD0YfQsNGB0YLQvdC40LrQsCDRgSAxINGP0L3QstCw0YDRjyAyMDE2INCz0L7QtNCwLiDQntGC 0YfQtdGC0L3QvtGB0YLRjCDQviDQt9Cw0LrRg9C/0LrQsNGFINGDINCh0JzQuNCh0J8uPGJyIC8+ PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoDwvc3Bhbj7Ql9Cw0LrRgNGL0YLRi9C1INC30LDQutGD 0L/QutC4OiDRg9GB0LvQvtCy0LjRjyDQuCDQv9C+0YDRj9C00L7QuiDQv9GA0L7QstC10LTQtdC9 0LjRjzxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqA8L3NwYW4+0JTQvtC/0L7Qu9C90LjR gtC10LvRjNC90YvQtSDQv9GA0L7RhtC10LTRg9GA0Ys6INC60LLQsNC70LjRhNC40LrQsNGG0LjQ vtC90L3Ri9C5INC+0YLQsdC+0YAsINC60L7QvdC60YPRgNC10L3RgtC90YvQtSDQv9C10YDQtdCz 0L7QstC+0YDRiyzCoDxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqA8L3NwYW4+wqvQv9C1 0YDQtdGC0L7RgNC20LrQsMK7LCDQv9C+0LTQsNGH0LAg0LDQu9GM0YLQtdGA0L3QsNGC0LjQstC9 0YvRhSDQt9Cw0Y/QstC+0LosINC/0L7RgdGC0LrQstCw0LvQuNGE0LjQutCw0YbQuNGPPGJyIC8+ PGI+OS4g0J7RgdC+0LHQtdC90L3QvtGB0YLQuCDQt9Cw0LrRg9C/0L7QuiDQsiDRjdC70LXQutGC 0YDQvtC90L3QvtC5INGE0L7RgNC80LUuPC9iPsKgPGJyIC8+PHNwYW4gbGFuZz0iZW4tdXMiPsKg wqDCoDwvc3Bhbj7QntCx0LfQvtGAINGN0LvQtdC60YLRgNC+0L3QvdGL0YUg0L/Qu9C+0YnQsNC0 0L7Qui4g0J/RgNCw0LrRgtC40LrQsCDQt9Cw0LrRg9C/0L7QuiDQsiDRjdC70LXQutGC0YDQvtC9 0L3QvtC5INGE0L7RgNC80LUuPGJyIC8+PGI+MTAuINCj0YfQsNGB0YLQuNC1INCyINC30LDQutGD 0L/QutCw0YUg0L/QviDQpNCXLTIyMy48L2I+wqA8YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDC oMKgwqDCoDwvc3Bhbj7Qn9C+0LTQs9C+0YLQvtCy0LrQsCDQt9Cw0Y/QstC60LguINCe0YHQvdC+ 0LLQsNC90LjRjyDQtNC70Y8g0L7RgtC60LvQvtC90LXQvdC40Y8g0LfQsNGP0LLQvtC6LiDQn9GA 0LDQutGC0LjQutCwINC+0LHQttCw0LvQvtCy0LDQvdC40Y8g0L7RgtC60LvQvtC90LXQvdC40Y/C oDxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgPC9zcGFuPtC30LDRj9Cy0L7Qujxi ciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgPC9zcGFuPjxpPjxiPtCi0YDQtdC90LjQ vdCzOjwvYj48L2k+wqDRgtGA0LXQsdC+0LLQsNC90LjRjyDQuiDRgdC+0YHRgtCw0LLRgyDQt9Cw 0Y/QstC60Lgg0L3QsCDRg9GH0LDRgdGC0LjQtSDQsiDQt9Cw0LrRg9C/0LrQtTxiciAvPjxzcGFu IGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgPC9zcGFuPtCf0L7RgNGP0LTQvtC6INC+0YbQtdC90LrQ uCDQuCDRgdC+0L/QvtGB0YLQsNCy0LvQtdC90LjRjyDQt9Cw0Y/QstC+0Log0YPRh9Cw0YHRgtC9 0LjQutC+0LIuINCc0LXRgtC+0LTRiyDQsdCw0LvQu9GM0L3QvtC5INC+0YbQtdC90LrQuCzCoDxi ciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgPC9zcGFuPtGA0LDQvdC20LjRgNC+0LLQ sNC90LjRjy4g0J/RgNC40LzQtdGA0Ysg0Lgg0YPRgdC70L7QstC40Y8g0L/RgNC40LzQtdC90LXQ vdC40Y88YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoDwvc3Bhbj7QmtGA0LjRgtC1 0YDQuNC4IMKr0JrQsNGH0LXRgdGC0LLQvsK7INC4IMKr0JrQstCw0LvQuNGE0LjQutCw0YbQuNGP INGD0YfQsNGB0YLQvdC40LrQvtCywrsuINCd0L7QstGL0LUg0YLRgNC10LHQvtCy0LDQvdC40Y8g 0KTQkNChINC6INC/0L7RgNGP0LTQutGDwqA8YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKg wqDCoDwvc3Bhbj7QvtGG0LXQvdC60Lgg0LfQsNGP0LLQvtC6LjxiciAvPjxzcGFuIGxhbmc9ImVu LXVzIj7CoMKgwqDCoMKgPC9zcGFuPtCa0L7QvNC/0LvQtdC60YEg0LzQtdGAINC/0YDQvtGC0LjQ siDQvdC10LTQvtCx0YDQvtGB0L7QstC10YHRgtC90YvRhSDQv9C+0YHRgtCw0LLRidC40LrQvtCy PGJyIC8+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqA8L3NwYW4+PGI+0JfQsNC60YPQv9C6 0Lgg0YMg0LXQtNC40L3RgdGC0LLQtdC90L3QvtCz0L4g0L/QvtGB0YLQsNCy0YnQuNC60LAuPC9i PsKg0J7RhNC+0YDQvNC70LXQvdC40LUg0LfQsNC60YPQv9C+0Log0Lgg0YDQsNC30LzQtdGJ0LXQ vdC40LUg0LjQvdGE0L7RgNC80LDRhtC40Lgg0LLCoDxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7C oMKgwqDCoMKgPC9zcGFuPtCV0JjQoS4gwqvQoNCw0LzQvtGH0L3Ri9C1wrsg0LTQvtCz0L7QstC+ 0YDRizxiciAvPjxiPjExLiDQntGC0LLQtdGC0YHRgtCy0LXQvdC90L7RgdGC0Ywg0L/QvtGB0YLQ sNCy0YnQuNC60L7Qsi48L2I+wqA8YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoDwv c3Bhbj7QoNC10LXRgdGC0YAg0L3QtdC00L7QsdGA0L7RgdC+0LLQtdGB0YLQvdGL0YUg0L/QvtGB 0YLQsNCy0YnQuNC60L7QsjxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgPC9zcGFu PtCe0YLQstC10YLRgdGC0LLQtdC90L3QvtGB0YLRjCDQt9Cw0LrQsNC30YfQuNC60L7QsiAo0JrQ vtCQ0J8pLsKgPGJyIC8+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqA8L3NwYW4+0J3QvtCy 0YvQtSDQv9C+0LvQvdC+0LzQvtGH0LjRjyDQpNCQ0KEg0LIg0YHRhNC10YDQtSDQutC+0L3RgtGA 0L7Qu9GPINC30LDQutGD0L/QvtC6INC/0L4gMjIzLdCk0JcuwqA8YnIgLz48c3BhbiBsYW5nPSJl bi11cyI+wqDCoMKgwqDCoDwvc3Bhbj7Qn9GA0L7QutGD0YDQvtGA0YHQutC40LUg0L/RgNC+0LLQ tdGA0LrQuCDQsiDRgdGE0LXRgNC1INC30LDQutGD0L/QvtC6PGJyIC8+PHNwYW4gbGFuZz0iZW4t dXMiPsKgwqDCoMKgwqA8L3NwYW4+0J7QsdC20LDQu9C+0LLQsNC90LjQtSDQtNC10LnRgdGC0LLQ uNC5INC30LDQutCw0LfRh9C40LrQvtCyLiDQkNC90L3Rg9C70LjRgNC+0LLQsNC90LjQtSDQv9GA 0L7RhtC10LTRg9GALCDQv9GA0LXQtNC/0LjRgdCw0L3QuNGPLsKgPGJyIC8+PHNwYW4gbGFuZz0i ZW4tdXMiPsKgwqDCoMKgwqA8L3NwYW4+0JDQtNC80LjQvdC40YHRgtGA0LDRgtC40LLQvdCw0Y8g 0L/RgNCw0LrRgtC40LrQsCDQpNCQ0KE8YnIgLz48Yj4xMi4g0J/QvtGA0Y/QtNC+0Log0LfQsNC6 0LvRjtGH0LXQvdC40Y8g0Lgg0LjRgdC/0L7Qu9C90LXQvdC40Y8g0LTQvtCz0L7QstC+0YDQvtCy LjwvYj7CoDxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgPC9zcGFuPtCa0L7QvdGC 0YDQvtC70Ywg0LjRgdC/0L7Qu9C90LXQvdC40Y8g0LTQvtCz0L7QstC+0YDQvtCyLiDQmNC30LzQ tdC90LXQvdC40LUg0Lgg0YDQsNGB0YLQvtGA0LbQtdC90LjQtSDQtNC+0LPQvtCy0L7RgNC+0LIu INCg0LDQt9C80LXRidC10L3QuNC1wqA8YnIgLz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDC oDwvc3Bhbj7QuNC90YTQvtGA0LzQsNGG0LjQuCDQvtCxINC40LfQvNC10L3QtdC90LjQuCDQtNC+ 0LPQvtCy0L7RgNC+0LIg0LIg0JXQmNChLjxiciAvPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDC oMKgPC9zcGFuPtCg0LXQtdGB0YLRgCDQtNC+0LPQvtCy0L7RgNC+0LIg0JXQmNChOiDRgdGC0YDR g9C60YLRg9GA0LAsINGB0L7QtNC10YDQttCw0L3QuNC1LCDRgtGA0LXQsdC+0LLQsNC90LjRjyDQ pNC10LTQtdGA0LDQu9GM0L3QvtCz0L4g0JrQsNC30L3QsNGH0LXQudGB0YLQstCwINC6wqA8YnIg Lz48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoDwvc3Bhbj7RgNCw0LfQvNC10YnQtdC90LjR jiDQuNC90YTQvtGA0LzQsNGG0LjQuCDRgSAxINGP0L3QstCw0YDRjyAyMDE2INCzLjxiciAvPjxz cGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgPC9zcGFuPtCe0YLRh9C10YLQvdC+0YHRgtGMINC+ INC30LDQutGD0L/QutCw0YUg0L/QviAyMjMt0KTQly48YnIgLz7CoDwvZm9udD48L3A+PHRhYmxl IGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiPjx0Ym9keT48dHI+PHRkPjxwIGFsaWduPSJjZW50ZXIi Pjxmb250IGNvbG9yPSIjQzBDMEMwIj48c3BhbiBsYW5nPSJlbiI+PGZvbnQgZmFjZT0iQ2FtYnJp YSI+wqs8L2ZvbnQ+PC9zcGFuPjxmb250IGZhY2U9IkNhbWJyaWEiPjxzcGFuIGxhbmc9ImVuIj7C q8K7wrs8L3NwYW4+wqA8c3BhbiBsYW5nPSJlbiI+wqvCq8K7wrs8L3NwYW4+wqA8c3BhbiBsYW5n PSJlbiI+wqvCq8K7wrs8L3NwYW4+wqA8c3BhbiBsYW5nPSJlbiI+wqvCq8K7wrs8L3NwYW4+wqA8 L2ZvbnQ+PHNwYW4gbGFuZz0iZW4iPjxmb250IGZhY2U9IkNhbWJyaWEiPsKrPC9mb250Pjwvc3Bh bj48Zm9udCBmYWNlPSJDYW1icmlhIj48c3BhbiBsYW5nPSJlbiI+wqvCu8K7PC9zcGFuPsKgPHNw YW4gbGFuZz0iZW4iPsKrwqvCu8K7PC9zcGFuPsKgPHNwYW4gbGFuZz0iZW4iPsKrwqvCu8K7PC9z cGFuPsKgPHNwYW4gbGFuZz0iZW4iPsKrwqvCu8K7PC9zcGFuPsKgPC9mb250PjxzcGFuIGxhbmc9 ImVuIj48Zm9udCBmYWNlPSJDYW1icmlhIj7CqzwvZm9udD48L3NwYW4+PGZvbnQgZmFjZT0iQ2Ft YnJpYSI+PHNwYW4gbGFuZz0iZW4iPsKrwrvCuzwvc3Bhbj7CoDxzcGFuIGxhbmc9ImVuIj7Cq8Kr wrvCuzwvc3Bhbj7CoDwvZm9udD48c3BhbiBsYW5nPSJlbiI+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+ wqs8L2ZvbnQ+PC9zcGFuPjxmb250IGZhY2U9IkNhbWJyaWEiPjxzcGFuIGxhbmc9ImVuIj7Cq8K7 wrs8L3NwYW4+wqA8c3BhbiBsYW5nPSJlbiI+wqvCq8K7wrs8L3NwYW4+PC9mb250PjwvZm9udD48 Yj48Zm9udCBjb2xvcj0iI0MwQzBDMCIgZmFjZT0iQ2FtYnJpYSI+PGJyIC8+PGJyIC8+PC9mb250 Pjxmb250IGNvbG9yPSIjRkY2NjAwIiBmYWNlPSJDYW1icmlhIj7QodGC0L7QuNC80L7RgdGC0Ywg 0YPRh9Cw0YHRgtC40Y86PC9mb250PjwvYj48Zm9udCBmYWNlPSJDYW1icmlhIj48Zm9udCBjb2xv cj0iI0ZGNjYwMCI+wqA8L2ZvbnQ+PGI+PHNwYW4gbGFuZz0iZW4tdXMiPjIyPC9zcGFuPsKgODAw INGA0YPQsS48L2I+PGJyIC8+PGZvbnQgY29sb3I9IiNGRjY2MDAiPjxiPtCh0LrQuNC00LrQuDwv Yj48L2ZvbnQ+wqAoPGI+MiDRh9C10LvQvtCy0LXQutCwIOKAkyAxMCUsIDMg0YfQtdC70L7QstC1 0LrQsCDigJMgMTUlLCA0INGH0LXQu9C+0LLQtdC60LAg0Lgg0LHQvtC70LXQtSDigJMgMjAlLjwv Yj4pPGJyIC8+0JIg0YHRgtC+0LjQvNC+0YHRgtGMINCy0YXQvtC00LjRgiDQvNC10YLQvtC00LjR h9C10YHQutC40Lkg0LzQsNGC0LXRgNC40LDQuywg0L7QsdC10LTRiywg0LrQvtGE0LUt0L/QsNGD 0LfRiywg0YHQtdGA0YLQuNGE0LjQutCw0YIuPC9mb250PjwvcD48L3RkPjwvdHI+PC90Ym9keT48 L3RhYmxlPjwvdGQ+PHRkIGJnY29sb3I9IiNGOUU5REYiPsKgPC90ZD48dGQgYmdjb2xvcj0iI0Y0 RDhDNiI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjRjBDQUIwIj7CoDwvdGQ+PC90cj48dHI+PHRkIGJn Y29sb3I9IiNFN0E4N0UiIHdpZHRoPSI0Ij7CoDwvdGQ+PHRkIGJnY29sb3I9IiNFN0E4N0UiPsKg PC90ZD48dGQgYmdjb2xvcj0iI0Y5RTlERiI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjRjREOEM2Ij7C oDwvdGQ+PHRkIGJnY29sb3I9IiNGMENBQjAiPsKgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48 L2Rpdj4= From guaneryu@gmail.com Tue Aug 2 07:00:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 632F97CBA for ; Tue, 2 Aug 2016 07:00:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1897F8F8035 for ; Tue, 2 Aug 2016 05:00:55 -0700 (PDT) X-ASG-Debug-ID: 1470139252-0bf8157e6d3b5310001-NocioJ Received: from mail-pa0-f66.google.com (mail-pa0-f66.google.com [209.85.220.66]) by cuda.sgi.com with ESMTP id 9rg5GfMUjAY7fEvm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:00:52 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-Effective-Source-IP: mail-pa0-f66.google.com[209.85.220.66] X-Barracuda-Apparent-Source-IP: 209.85.220.66 Received: by mail-pa0-f66.google.com with SMTP id q2so11865405pap.0 for ; Tue, 02 Aug 2016 05:00:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=aL3VGbqFF7iaM90WryJeH7ia9mUoiBsTK0njnPToLos=; b=dHSnoI4VbhVDkUAufEZjQEfttk+7evgdL4J/T14pb1mDGAQhr56Cycwcq9a7N8b8J+ GXHPSpqa4qz9/d7ItrcXp4hPFM9N/ndY5oXdQph1IG96B6EF2Fpg5gkGTl/ujlr/Rk6h Hl8CQFR0ucNNzW2aMuZmh9LvIt4tMuEVcN5Mm4RcDB2uOWLjnoxkUikGxrgc8cF+x/Lf A9JcsKgAMNrBFaIUDv/y5JJsp6tYKF5IdmCPsWH9vkLXKF6aP713qqVUrSkHP/tovfNH Pv9XzgT09EnWtCh6iF78XJqPuQrWXeq34aDpLmKIpvtiPCv6dM7uWmGKkIlf5hlOywVx SgyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=aL3VGbqFF7iaM90WryJeH7ia9mUoiBsTK0njnPToLos=; b=VaskvkDKU5zHZ7adUjSw9zeNYXjwGzkN/jjPeH/7pBnnfrsOx9DkK+r/YIscPcr7yf UpTU/nKajH8Z66y0QL9sVadOz3jYuiduurBG4wqId7WUl0t1SRgjshHoAd7q5RD+nX7s wB9VB0A1MlD6HyiSYuKH88fU8HV9h3E+93oqN8Z3BtsSsuYM7ZAl2PYhypTV6HXqG0Os 8OgCYO0XGovx6Ulk0AjISJaN5ni5s0/HTb9EpVFZDrnPE8JvTEDIQabGeSqJkupVD2DD OLwcH9dgTYAtVNuA06d7I3dtmUxAP7O0Gzd1/iIMYKzHiezQ3lmn5AAXcQowWTiLrwvT fCcw== X-Gm-Message-State: AEkoousN+y7I0MjcWSlikNH7zXr4SXbs09OL67yfkXZzVdbEqHau+Nxeoc+MnSB+lh8/1g== X-Received: by 10.66.42.33 with SMTP id k1mr104915927pal.111.1470139251970; Tue, 02 Aug 2016 05:00:51 -0700 (PDT) Received: from localhost ([128.199.137.77]) by smtp.gmail.com with ESMTPSA id c8sm4425215pfe.39.2016.08.02.05.00.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 02 Aug 2016 05:00:51 -0700 (PDT) From: Eryu Guan To: linux-fsdevel@vger.kernel.org Cc: Eryu Guan , Steven Whitehouse , Bob Peterson , Alexander Viro , Dave Chinner , xfs@oss.sgi.com (supporter:XFS FILESYSTEM), cluster-devel@redhat.com (open list:GFS2 FILE SYSTEM), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2 RESEND] fs: return EPERM on immutable inode Date: Tue, 2 Aug 2016 19:58:28 +0800 X-ASG-Orig-Subj: [PATCH v2 RESEND] fs: return EPERM on immutable inode Message-Id: <1470139108-13115-1-git-send-email-guaneryu@gmail.com> X-Mailer: git-send-email 2.7.4 X-Barracuda-Connect: mail-pa0-f66.google.com[209.85.220.66] X-Barracuda-Start-Time: 1470139252 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2248 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature In most cases, EPERM is returned on immutable inode, and there're only a few places returning EACCES. I noticed this when running LTP on overlayfs, setxattr03 failed due to unexpected EACCES on immutable inode. So converting all EACCES to EPERM on immutable inode. Acked-by: Dave Chinner Signed-off-by: Eryu Guan --- v2: - update commit log to mention that it's found by running LTP fs/gfs2/inode.c | 2 +- fs/namei.c | 2 +- fs/utimes.c | 3 ++- fs/xfs/xfs_ioctl.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index e0621ca..e4da0ec 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -1800,7 +1800,7 @@ int gfs2_permission(struct inode *inode, int mask) } if ((mask & MAY_WRITE) && IS_IMMUTABLE(inode)) - error = -EACCES; + error = -EPERM; else error = generic_permission(inode, mask); if (gfs2_holder_initialized(&i_gh)) diff --git a/fs/namei.c b/fs/namei.c index c386a32..adb0414 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -410,7 +410,7 @@ int __inode_permission(struct inode *inode, int mask) * Nobody gets write access to an immutable file. */ if (IS_IMMUTABLE(inode)) - return -EACCES; + return -EPERM; /* * Updating mtime will likely cause i_uid and i_gid to be diff --git a/fs/utimes.c b/fs/utimes.c index 85c40f4..794f5f5 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -92,10 +92,11 @@ static int utimes_common(struct path *path, struct timespec *times) * then we need to check permissions, because * inode_change_ok() won't do it. */ - error = -EACCES; + error = -EPERM; if (IS_IMMUTABLE(inode)) goto mnt_drop_write_and_out; + error = -EACCES; if (!inode_owner_or_capable(inode)) { error = inode_permission(inode, MAY_WRITE); if (error) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 9a7c878..3d6820f 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -232,7 +232,7 @@ xfs_open_by_handle( } if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { - error = -EACCES; + error = -EPERM; goto out_dput; } -- 2.7.4 From BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 2 07:04:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 883987CA0 for ; Tue, 2 Aug 2016 07:04:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3FE23304039 for ; Tue, 2 Aug 2016 05:04:10 -0700 (PDT) X-ASG-Debug-ID: 1470139439-0bf8157e6c3b5500001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id G4raAmj8giantdHw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:03:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUYQM-0006Ah-Is; Tue, 02 Aug 2016 12:03:54 +0000 Date: Tue, 2 Aug 2016 05:03:54 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys Message-ID: <20160802120354.GA2667@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> <20160801064818.GJ15590@infradead.org> <20160801191126.GE8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801191126.GE8590@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470139439 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2479 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 01, 2016 at 12:11:26PM -0700, Darrick J. Wong wrote: > > > +/* > > > + * In-core key that holds both low and high keys for overlapped btrees. > > > + * The two keys are packed next to each other on disk, so do the same > > > + * in memory. Preserve the existing xfs_btree_key as a single key to > > > + * avoid the mental model breakage that would happen if we passed a > > > + * bigkey into a function that operates on a single key. > > > + */ > > > +union xfs_btree_bigkey { > > > + struct xfs_bmbt_key bmbt; > > > + xfs_bmdr_key_t bmbr; /* bmbt root block */ > > > + xfs_alloc_key_t alloc; > > > + struct xfs_inobt_key inobt; > > > +}; > > > > I don't understand the purpose of this union at all, and the comment > > seems misleading. Compared to union xfs_btree_key the only difference > > seems to be that xfs_btree_bigkey is missing the > > 'struct xfs_rmap_key rmap' member. How does that enable us to holds > > I think you might be missing a later patch, wherein we add the rmap > stuff to the btree structures, which expands bigkey to look like this: Yeah, I was stuck in the middle of tree. I still think the bigkey is a very bad idea. There are only 7 place left that actually allocate storage for a "union xfs_btree_key". Everything else uses fancy pointer arithmetics to get them out of a disk buffer: - xfs_btree_lookup - xfs_btree_get_leaf_keys_overlapped - xfs_btree_update_keys - xfs_btree_lshift - xfs_btree_rshift - xfs_btree_simple_query_range - xfs_btree_overlapped_query_range So just adding the rmap to union xfs_btree_key would simplify things and remove a potential pitfall at the cost of just a little bit more stack usage. And at least of the init_high_key_from_rec/init_key_from_rec we could probably replace two on-stack xfs_btree_keys with a single new, bigger xfs_btree_key. > union xfs_btree_key { > struct xfs_bmbt_key bmbt; > xfs_bmdr_key_t bmbr; /* bmbt root block */ > xfs_alloc_key_t alloc; > struct xfs_inobt_key inobt; > struct xfs_rmap_key rmap[2]; > struct xfs_refcount_key refc; > }; > > This gives us the storage we want and avoids casts, but it still > doesn't fix the problem that sometimes we want to create a key pointer > to just the high fields and treat that as a pointer. Where does that problem occur? I don't quite understand how having the bigger structure is a problem if we don't want to initialize all of it. From BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 2 07:23:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 570837CA0 for ; Tue, 2 Aug 2016 07:23:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 290C28F8033 for ; Tue, 2 Aug 2016 05:23:35 -0700 (PDT) X-ASG-Debug-ID: 1470140610-0bf57c13682e5e80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QXpQdL2ZkSBoQU1b (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:23:31 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUYjF-0008B4-Ff; Tue, 02 Aug 2016 12:23:25 +0000 Date: Tue, 2 Aug 2016 05:23:25 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 07/47] xfs: add function pointers for get/update keys to the btree Message-ID: <20160802122325.GA11128@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/47] xfs: add function pointers for get/update keys to the btree References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907700604.25461.2181974283557088355.stgit@birch.djwong.org> <20160801063902.GI15590@infradead.org> <20160801173331.GC8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801173331.GC8590@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470140611 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15195 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 01, 2016 at 10:33:31AM -0700, Darrick J. Wong wrote: > That's roughly the approach I took in previous versions of this patch, > but using the OVERLAPPING flag to dispatch the overlapped vs. non- > versions of the get*keys and updkey* functions confused Dave, so he > asked me to add to function pointers[1] to the btree ops and dispatch > that way. I remember I had a similar disagreement with Dave on the long vs short pointers when doing the initial common btree work, and I prevailed using the flag :) Below is a patch to on top of your for-dave-for-4.8-2 branch which uses the flag, but also keeps your useful refactoring. This both reduces source: 6 files changed, 61 insertions(+), 136 deletions(-) as well as binary: hch@brick:~/work/xfs$ size xfs.o-* text data bss dec hex filename 911881 160951 1568 1074400 1064e0 xfs.o-flag 912457 160951 1568 1074976 106720 xfs.o-pointer sizes and makes the whole thing much easier to follow and understand. diff --git a/fs/xfs/libxfs/xfs_alloc_btree.c b/fs/xfs/libxfs/xfs_alloc_btree.c index c60eeb8..5ba2dac 100644 --- a/fs/xfs/libxfs/xfs_alloc_btree.c +++ b/fs/xfs/libxfs/xfs_alloc_btree.c @@ -403,10 +403,6 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .keys_inorder = xfs_allocbt_keys_inorder, .recs_inorder = xfs_allocbt_recs_inorder, #endif - - .get_leaf_keys = xfs_btree_get_leaf_keys, - .get_node_keys = xfs_btree_get_node_keys, - .update_keys = xfs_btree_update_keys, }; /* diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index 9e34ca4..cd85274 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -763,10 +763,6 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, #endif - - .get_leaf_keys = xfs_btree_get_leaf_keys, - .get_node_keys = xfs_btree_get_node_keys, - .update_keys = xfs_btree_update_keys, }; /* diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index fe5f27e..45a9545b 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -1951,29 +1951,6 @@ error0: return error; } -/* Determine the low key of a leaf block (simple) */ -void -xfs_btree_get_leaf_keys( - struct xfs_btree_cur *cur, - struct xfs_btree_block *block, - union xfs_btree_key *key) -{ - union xfs_btree_rec *rec; - - rec = xfs_btree_rec_addr(cur, 1, block); - cur->bc_ops->init_key_from_rec(key, rec); -} - -/* Determine the low key of a node block (simple) */ -void -xfs_btree_get_node_keys( - struct xfs_btree_cur *cur, - struct xfs_btree_block *block, - union xfs_btree_key *key) -{ - memcpy(key, xfs_btree_key_addr(cur, 1, block), cur->bc_ops->key_len); -} - /* Find the high key storage area from a regular key. */ STATIC union xfs_btree_key * xfs_btree_high_key_from_key( @@ -1985,38 +1962,41 @@ xfs_btree_high_key_from_key( (cur->bc_ops->key_len / 2)); } -/* Determine the low and high keys of a leaf block (overlapped) */ -void -xfs_btree_get_leaf_keys_overlapped( +/* Determine the low (and high if overlapped) key of a leaf block */ +STATIC void +xfs_btree_get_leaf_keys( struct xfs_btree_cur *cur, struct xfs_btree_block *block, union xfs_btree_key *key) { - int n; union xfs_btree_rec *rec; - union xfs_btree_key max_hkey; - union xfs_btree_key hkey; - union xfs_btree_key *high; - ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); rec = xfs_btree_rec_addr(cur, 1, block); cur->bc_ops->init_key_from_rec(key, rec); - cur->bc_ops->init_high_key_from_rec(&max_hkey, rec); - for (n = 2; n <= xfs_btree_get_numrecs(block); n++) { - rec = xfs_btree_rec_addr(cur, n, block); - cur->bc_ops->init_high_key_from_rec(&hkey, rec); - if (cur->bc_ops->diff_two_keys(cur, &hkey, &max_hkey) > 0) - max_hkey = hkey; - } + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { + union xfs_btree_key max_hkey; + union xfs_btree_key hkey; + union xfs_btree_key *high; + int n; + + cur->bc_ops->init_high_key_from_rec(&max_hkey, rec); + for (n = 2; n <= xfs_btree_get_numrecs(block); n++) { + rec = xfs_btree_rec_addr(cur, n, block); + cur->bc_ops->init_high_key_from_rec(&hkey, rec); + if (cur->bc_ops->diff_two_keys(cur, &hkey, &max_hkey) + > 0) + max_hkey = hkey; + } - high = xfs_btree_high_key_from_key(cur, key); - memcpy(high, &max_hkey, cur->bc_ops->key_len / 2); + high = xfs_btree_high_key_from_key(cur, key); + memcpy(high, &max_hkey, cur->bc_ops->key_len / 2); + } } /* Determine the low and high keys of a node block (overlapped) */ -void -xfs_btree_get_node_keys_overlapped( +STATIC void +xfs_btree_get_node_keys( struct xfs_btree_cur *cur, struct xfs_btree_block *block, union xfs_btree_key *key) @@ -2026,19 +2006,23 @@ xfs_btree_get_node_keys_overlapped( union xfs_btree_key *max_hkey; union xfs_btree_key *high; - ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); - memcpy(key, xfs_btree_key_addr(cur, 1, block), - cur->bc_ops->key_len / 2); - - max_hkey = xfs_btree_high_key_addr(cur, 1, block); - for (n = 2; n <= xfs_btree_get_numrecs(block); n++) { - hkey = xfs_btree_high_key_addr(cur, n, block); - if (cur->bc_ops->diff_two_keys(cur, hkey, max_hkey) > 0) - max_hkey = hkey; - } + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { + memcpy(key, xfs_btree_key_addr(cur, 1, block), + cur->bc_ops->key_len / 2); + + max_hkey = xfs_btree_high_key_addr(cur, 1, block); + for (n = 2; n <= xfs_btree_get_numrecs(block); n++) { + hkey = xfs_btree_high_key_addr(cur, n, block); + if (cur->bc_ops->diff_two_keys(cur, hkey, max_hkey) > 0) + max_hkey = hkey; + } - high = xfs_btree_high_key_from_key(cur, key); - memcpy(high, max_hkey, cur->bc_ops->key_len / 2); + high = xfs_btree_high_key_from_key(cur, key); + memcpy(high, max_hkey, cur->bc_ops->key_len / 2); + } else { + memcpy(key, xfs_btree_key_addr(cur, 1, block), + cur->bc_ops->key_len); + } } /* Derive the keys for any btree block. */ @@ -2049,9 +2033,9 @@ xfs_btree_get_keys( union xfs_btree_key *key) { if (be16_to_cpu(block->bb_level) == 0) - cur->bc_ops->get_leaf_keys(cur, block, key); + xfs_btree_get_leaf_keys(cur, block, key); else - cur->bc_ops->get_node_keys(cur, block, key); + xfs_btree_get_node_keys(cur, block, key); } /* @@ -2125,28 +2109,12 @@ __xfs_btree_updkeys( xfs_btree_log_keys(cur, bp, ptr, ptr); if (level + 1 >= cur->bc_nlevels) break; - cur->bc_ops->get_node_keys(cur, block, lkey); + xfs_btree_get_node_keys(cur, block, lkey); } return 0; } -/* - * Update all the keys from some level in cursor back to the root, stopping - * when we find a key pair that don't need updating. - */ -int -xfs_btree_update_keys_overlapped( - struct xfs_btree_cur *cur, - int level) -{ - struct xfs_buf *bp; - struct xfs_btree_block *block; - - block = xfs_btree_get_block(cur, level, &bp); - return __xfs_btree_updkeys(cur, level, block, bp, false); -} - /* Update all the keys from some level in cursor back to the root. */ STATIC int xfs_btree_updkeys_force( @@ -2163,7 +2131,7 @@ xfs_btree_updkeys_force( /* * Update the parent keys of the given level, progressing towards the root. */ -int +STATIC int xfs_btree_update_keys( struct xfs_btree_cur *cur, int level) @@ -2174,20 +2142,21 @@ xfs_btree_update_keys( union xfs_btree_key key; int ptr; - ASSERT(!(cur->bc_flags & XFS_BTREE_OVERLAPPING)); + ASSERT(level >= 0); + + block = xfs_btree_get_block(cur, level, &bp); + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) + return __xfs_btree_updkeys(cur, level, block, bp, false); XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGIK(cur, level, keyp); - ASSERT(level >= 0); - /* * Go up the tree from this level toward the root. * At each level, update the key value to the value input. * Stop when we reach a level where the cursor isn't pointing * at the first entry in the block. */ - block = xfs_btree_get_block(cur, level, &bp); xfs_btree_get_keys(cur, block, &key); for (level++, ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { #ifdef DEBUG @@ -2257,7 +2226,7 @@ xfs_btree_update( /* Pass new key value up to our parent. */ if (xfs_btree_needs_key_update(cur, ptr)) { - error = cur->bc_ops->update_keys(cur, 0); + error = xfs_btree_update_keys(cur, 0); if (error) goto error0; } @@ -2447,13 +2416,13 @@ xfs_btree_lshift( goto error1; /* Update the parent keys of the right block. */ - error = cur->bc_ops->update_keys(cur, level); + error = xfs_btree_update_keys(cur, level); if (error) goto error1; /* Update the parent high keys of the left block, if needed. */ if (tcur->bc_flags & XFS_BTREE_OVERLAPPING) { - error = tcur->bc_ops->update_keys(tcur, level); + error = xfs_btree_update_keys(tcur, level); if (error) goto error1; } @@ -2633,13 +2602,13 @@ xfs_btree_rshift( /* Update the parent high keys of the left block, if needed. */ if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { - error = cur->bc_ops->update_keys(cur, level); + error = xfs_btree_update_keys(cur, level); if (error) goto error1; } /* Update the parent keys of the right block. */ - error = cur->bc_ops->update_keys(tcur, level); + error = xfs_btree_update_keys(tcur, level); if (error) goto error1; @@ -2778,7 +2747,7 @@ __xfs_btree_split( xfs_btree_log_ptrs(cur, rbp, 1, rrecs); /* Stash the keys of the new block for later insertion. */ - cur->bc_ops->get_node_keys(cur, right, key); + xfs_btree_get_node_keys(cur, right, key); } else { /* It's a leaf. Move records. */ union xfs_btree_rec *lrp; /* left record pointer */ @@ -2792,7 +2761,7 @@ __xfs_btree_split( xfs_btree_log_recs(cur, rbp, 1, rrecs); /* Stash the keys of the new block for later insertion. */ - cur->bc_ops->get_leaf_keys(cur, right, key); + xfs_btree_get_leaf_keys(cur, right, key); } /* @@ -2822,7 +2791,7 @@ __xfs_btree_split( /* Update the parent high keys of the left block, if needed. */ if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { - error = cur->bc_ops->update_keys(cur, level); + error = xfs_btree_update_keys(cur, level); if (error) goto error0; } @@ -3143,9 +3112,9 @@ xfs_btree_new_root( * Get the keys for the left block's keys and put them directly * in the parent block. Do the same for the right block. */ - cur->bc_ops->get_node_keys(cur, left, + xfs_btree_get_node_keys(cur, left, xfs_btree_key_addr(cur, 1, new)); - cur->bc_ops->get_node_keys(cur, right, + xfs_btree_get_node_keys(cur, right, xfs_btree_key_addr(cur, 2, new)); } else { /* @@ -3153,9 +3122,9 @@ xfs_btree_new_root( * directly in the parent block. Do the same for the right * block. */ - cur->bc_ops->get_leaf_keys(cur, left, + xfs_btree_get_leaf_keys(cur, left, xfs_btree_key_addr(cur, 1, new)); - cur->bc_ops->get_leaf_keys(cur, right, + xfs_btree_get_leaf_keys(cur, right, xfs_btree_key_addr(cur, 2, new)); } xfs_btree_log_keys(cur, nbp, 1, 2); @@ -3434,7 +3403,7 @@ xfs_btree_insrec( if (bp && bp->b_bn != old_bn) { xfs_btree_get_keys(cur, block, lkey); } else if (xfs_btree_needs_key_update(cur, optr)) { - error = cur->bc_ops->update_keys(cur, level); + error = xfs_btree_update_keys(cur, level); if (error) goto error0; } @@ -3880,7 +3849,7 @@ xfs_btree_delrec( * key values above us in the tree. */ if (xfs_btree_needs_key_update(cur, ptr)) { - error = cur->bc_ops->update_keys(cur, level); + error = xfs_btree_update_keys(cur, level); if (error) goto error0; } diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 9b6d628..04d0865 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -214,19 +214,6 @@ struct xfs_btree_ops { union xfs_btree_rec *r1, union xfs_btree_rec *r2); #endif - - /* derive the low & high keys from the records in a leaf block */ - void (*get_leaf_keys)(struct xfs_btree_cur *cur, - struct xfs_btree_block *block, - union xfs_btree_key *key); - - /* derive the low & high keys from the keys in a node block */ - void (*get_node_keys)(struct xfs_btree_cur *cur, - struct xfs_btree_block *block, - union xfs_btree_key *key); - - /* update the parent keys of given btree level */ - int (*update_keys)(struct xfs_btree_cur *cur, int level); }; /* @@ -527,17 +514,6 @@ bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); uint xfs_btree_compute_maxlevels(struct xfs_mount *mp, uint *limits, unsigned long len); -void xfs_btree_get_leaf_keys(struct xfs_btree_cur *cur, - struct xfs_btree_block *block, union xfs_btree_key *key); -void xfs_btree_get_node_keys(struct xfs_btree_cur *cur, - struct xfs_btree_block *block, union xfs_btree_key *key); -int xfs_btree_update_keys(struct xfs_btree_cur *cur, int level); -void xfs_btree_get_leaf_keys_overlapped(struct xfs_btree_cur *cur, - struct xfs_btree_block *block, union xfs_btree_key *key); -void xfs_btree_get_node_keys_overlapped(struct xfs_btree_cur *cur, - struct xfs_btree_block *block, union xfs_btree_key *key); -int xfs_btree_update_keys_overlapped(struct xfs_btree_cur *cur, int level); - /* return codes */ #define XFS_BTREE_QUERY_RANGE_CONTINUE 0 /* keep iterating */ #define XFS_BTREE_QUERY_RANGE_ABORT 1 /* stop iterating */ diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index c83691e..31ca220 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -320,10 +320,6 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, #endif - - .get_leaf_keys = xfs_btree_get_leaf_keys, - .get_node_keys = xfs_btree_get_node_keys, - .update_keys = xfs_btree_update_keys, }; static const struct xfs_btree_ops xfs_finobt_ops = { @@ -345,10 +341,6 @@ static const struct xfs_btree_ops xfs_finobt_ops = { .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, #endif - - .get_leaf_keys = xfs_btree_get_leaf_keys, - .get_node_keys = xfs_btree_get_node_keys, - .update_keys = xfs_btree_update_keys, }; /* diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c index 232450c..bc1faeb 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.c +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -453,10 +453,6 @@ static const struct xfs_btree_ops xfs_rmapbt_ops = { .keys_inorder = xfs_rmapbt_keys_inorder, .recs_inorder = xfs_rmapbt_recs_inorder, #endif - - .get_leaf_keys = xfs_btree_get_leaf_keys_overlapped, - .get_node_keys = xfs_btree_get_node_keys_overlapped, - .update_keys = xfs_btree_update_keys_overlapped, }; /* From BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 2 07:24:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E2B257CA0 for ; Tue, 2 Aug 2016 07:24:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72659AC002 for ; Tue, 2 Aug 2016 05:24:11 -0700 (PDT) X-ASG-Debug-ID: 1470140648-0bf8157e6a3b75c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id IaOJHRTsKkCrp1XA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:24:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUYjp-0008QM-O7; Tue, 02 Aug 2016 12:24:01 +0000 Date: Tue, 2 Aug 2016 05:24:01 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Christoph Hellwig , linux-btrfs@vger.kernel.org, eguan@redhat.com, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test Message-ID: <20160802122401.GA31492@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> <20160801062719.GH596@infradead.org> <20160801170814.GA8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801170814.GA8590@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470140648 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 462 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > We do have specific tests that examine the outputs of rebuilding the > indices (all the fuzzer group tests do this too); this patch enables a > test runner to expand that coverage to all tests. Running a > rebuilding xfs_repair for all the tests shook out some bugs in the > xfs_repair rmap handling code that only triggered under some of the > non-rmap non-reflink stressor tests. Ok, looks fine then: Reviewed-by: Christoph Hellwig From BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 2 07:24:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 42D517CA0 for ; Tue, 2 Aug 2016 07:24:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 14B60304032 for ; Tue, 2 Aug 2016 05:24:20 -0700 (PDT) X-ASG-Debug-ID: 1470140658-0bf57c13672e5ee0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gyEF2zKlsI9rTXFK (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:24:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUYk2-0008Vk-N7; Tue, 02 Aug 2016 12:24:14 +0000 Date: Tue, 2 Aug 2016 05:24:14 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Al Viro , Christoph Hellwig , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] vfs: fix return type of ioctl_file_dedupe_range Message-ID: <20160802122414.GB31492@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] vfs: fix return type of ioctl_file_dedupe_range References: <20160801171339.GB8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801171339.GB8590@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470140658 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 342 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 01, 2016 at 10:13:39AM -0700, Darrick J. Wong wrote: > All the VFS functions in the dedupe ioctl path return int status, so > the ioctl handler ought to as well. > > Found by Coverity, CID 1350952. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig From BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 2 07:25:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9B3697CA0 for ; Tue, 2 Aug 2016 07:25:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6C23A304032 for ; Tue, 2 Aug 2016 05:25:00 -0700 (PDT) X-ASG-Debug-ID: 1470140697-0bf57b369e344970001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id RjMZaTrELjLZltSs (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:24:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUYkg-0000Gt-R3; Tue, 02 Aug 2016 12:24:54 +0000 Date: Tue, 2 Aug 2016 05:24:54 -0700 From: Christoph Hellwig To: Anna Schumaker Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs_io: Update man page for copy_range command Message-ID: <20160802122454.GC31492@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs_io: Update man page for copy_range command References: <20160801190042.8652-1-Anna.Schumaker@Netapp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801190042.8652-1-Anna.Schumaker@Netapp.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470140698 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 2 07:25:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0D1967CA0 for ; Tue, 2 Aug 2016 07:25:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 86106AC003 for ; Tue, 2 Aug 2016 05:25:19 -0700 (PDT) X-ASG-Debug-ID: 1470140718-0bf8157e6c3b76e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id De8WBbjHuxgUI7Uo (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:25:18 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUYl3-0000zA-Nv; Tue, 02 Aug 2016 12:25:17 +0000 Date: Tue, 2 Aug 2016 05:25:17 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace Message-ID: <20160802122517.GD31492@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace References: <20160802035651.GB8593@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802035651.GB8593@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470140718 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 250 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 01, 2016 at 08:56:51PM -0700, Darrick J. Wong wrote: > When we're iterating inode xattrs by handle, we have to copy the > cursor back to userspace so that a subsequent invocation actually > retrieves subsequent contents. Testcase? From BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 2 07:27:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 76D7A7CA0 for ; Tue, 2 Aug 2016 07:27:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47CFA304032 for ; Tue, 2 Aug 2016 05:27:24 -0700 (PDT) X-ASG-Debug-ID: 1470140841-0bf57b369d344aa0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id IDWmYEEVH0aaCbvi (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:27:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUYn3-0001r8-2K; Tue, 02 Aug 2016 12:27:21 +0000 Date: Tue, 2 Aug 2016 05:27:21 -0700 From: Christoph Hellwig To: Zorro Lang Cc: xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails Message-ID: <20160802122721.GE31492@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails References: <1470120540-15135-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470120540-15135-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470140841 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 581 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 02, 2016 at 02:49:00PM +0800, Zorro Lang wrote: > After XFS_GETNEXTQUOTA feature has been merged into linux kernel and > xfsprogs, xfs_quota use Q_XGETNEXTQUOTA for report and dump, and > fall back to old XFS_GETQUOTA ioctl if XFS_GETNEXTQUOTA fails. > > But when XFS_GETNEXTQUOTA fails, xfs_quota print a warning as > "XFS_GETQUOTA: Invalid argument". That's due to kernel can't > recognize XFS_GETNEXTQUOTA ioctl and return EINVAL. At this time, > the warning is helpless, xfs_quota just need to fall back. We'd still want to report other errors, right? From BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 2 07:28:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E819B7CBA for ; Tue, 2 Aug 2016 07:28:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B81B7304032 for ; Tue, 2 Aug 2016 05:28:11 -0700 (PDT) X-ASG-Debug-ID: 1470140889-0bf57b369d344b20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id iguoL0KmdEdeZoJO (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 05:28:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f4cd355831319c0637e0+4727+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUYno-0002CO-Ow; Tue, 02 Aug 2016 12:28:08 +0000 Date: Tue, 2 Aug 2016 05:28:08 -0700 From: Christoph Hellwig To: Eryu Guan Cc: linux-fsdevel@vger.kernel.org, open list , "supporter:XFS FILESYSTEM" , "open list:GFS2 FILE SYSTEM" , Alexander Viro , Bob Peterson , Steven Whitehouse Subject: Re: [PATCH v2 RESEND] fs: return EPERM on immutable inode Message-ID: <20160802122808.GF31492@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 RESEND] fs: return EPERM on immutable inode References: <1470139108-13115-1-git-send-email-guaneryu@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470139108-13115-1-git-send-email-guaneryu@gmail.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470140890 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 541 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 02, 2016 at 07:58:28PM +0800, Eryu Guan wrote: > In most cases, EPERM is returned on immutable inode, and there're only a > few places returning EACCES. I noticed this when running LTP on > overlayfs, setxattr03 failed due to unexpected EACCES on immutable > inode. > > So converting all EACCES to EPERM on immutable inode. Looks fine, Reviewed-by: Christoph Hellwig Although maybe you'll have to split this into one patch per subsystems, as otherwise no maintainer might be enticed to pick it up. From zlang@redhat.com Tue Aug 2 08:14:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 11BFE7CA7 for ; Tue, 2 Aug 2016 08:14:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D6736304032 for ; Tue, 2 Aug 2016 06:14:30 -0700 (PDT) X-ASG-Debug-ID: 1470143668-0bf57c13692ea350001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Cr8RkBWhfox4DiSb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 06:14:29 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9D1108122F; Tue, 2 Aug 2016 13:14:28 +0000 (UTC) Received: from localhost (dhcp-12-196.nay.redhat.com [10.66.12.196]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72DERum004396; Tue, 2 Aug 2016 09:14:28 -0400 Date: Tue, 2 Aug 2016 21:14:27 +0800 From: Zorro Lang To: Christoph Hellwig Cc: sandeen@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails Message-ID: <20160802131427.GD16413@zlang.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails References: <1470120540-15135-1-git-send-email-zlang@redhat.com> <20160802122721.GE31492@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802122721.GE31492@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 02 Aug 2016 13:14:28 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470143669 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1413 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 02, 2016 at 05:27:21AM -0700, Christoph Hellwig wrote: > On Tue, Aug 02, 2016 at 02:49:00PM +0800, Zorro Lang wrote: > > After XFS_GETNEXTQUOTA feature has been merged into linux kernel and > > xfsprogs, xfs_quota use Q_XGETNEXTQUOTA for report and dump, and > > fall back to old XFS_GETQUOTA ioctl if XFS_GETNEXTQUOTA fails. > > > > But when XFS_GETNEXTQUOTA fails, xfs_quota print a warning as > > "XFS_GETQUOTA: Invalid argument". That's due to kernel can't > > recognize XFS_GETNEXTQUOTA ioctl and return EINVAL. At this time, > > the warning is helpless, xfs_quota just need to fall back. > > We'd still want to report other errors, right? Yes. This patch will make xfs_quota's report and dump command report nothing if XFS_GETNEXTQUOTA fails and falls back to XFS_GETQUOTA. But if XFS_GETQUOTA fails, it'll report errors. As I mentioned in email, we don't report errors if XFS_GETNEXTQUOTA fails, or we don't report errors if kernel has no XFS_GETNEXTQUOTA feature? The first one won't report any errors from XFS_GETNEXTQUOTA call, include kernel has no this feature. So: "cmd == XFS_GETQUOTA" or "!(cmd == XFS_GETNEXTQUOTA && errno == EINVAL)" I think they all make sense. Do you have any suggestions? Thanks, Zorro > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From mixmand@zoho.com Tue Aug 2 08:14:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=1.0 required=5.0 tests=HK_RANDOM_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 047FF7CB1 for ; Tue, 2 Aug 2016 08:14:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8F7B304032 for ; Tue, 2 Aug 2016 06:14:39 -0700 (PDT) X-ASG-Debug-ID: 1470143677-0bf57b369b349150001-NocioJ Received: from 589187.com (589187.com [104.168.102.54]) by cuda.sgi.com with ESMTP id uH2DnJLqX3SjAXGG for ; Tue, 02 Aug 2016 06:14:37 -0700 (PDT) X-Barracuda-Envelope-From: mixmand@zoho.com X-Barracuda-Effective-Source-IP: 589187.com[104.168.102.54] X-Barracuda-Apparent-Source-IP: 104.168.102.54 To: xfs@oss.sgi.com Subject: Mobile App Development Solutions- iOS, Android, Ionic & React Native Message-ID: <51af430d3cf7f16b116fd3a8d8000b88@tedbrownmusic.com> X-ASG-Orig-Subj: Mobile App Development Solutions- iOS, Android, Ionic & React Native Date: Tue, 02 Aug 2016 14:20:30 +0200 From: "Alex Rubens" Reply-To: yuiyangs@sina.com MIME-Version: 1.0 X-Mailer-LID: 8 X-Mailer-RecptId: 10449103 X-Mailer-SID: 1557 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 589187.com[104.168.102.54] X-Barracuda-Start-Time: 1470143677 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1173 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0646 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0646 Custom rule MV0646 Hello, Are you seeking assistance for developing a mobile application? Or need any help in identifying the right technology/ platform for launching your idea? We have a global clientele and extensive repertoire since 2011 in delivering Mobile App Solutions. Top enterprises and start-ups choose Solution Analysts as their preferred vendor for their dream projects. It’s your turn now. We are based in India. Our human resource base comprises of more than 90 tech experts who will help you set up a dedicated team that will deliver your solution exactly to the brief. Our App Development offerings are: • iOS App Development on Swift • Android App development • Cross Platform App Development: Ionic, React Native, PhoneGap Honest Numbers that will swing your opinion to start working with us: • 5+ years experience • 187+ Mobile apps delivered • 7+ Android & iOS SDK developed • 100% quality assurance • 85+ Testing Devices • 90+ Professional Developers and Designers We are ready to deliver you awesome mobile apps. Looking forward to your response and addressing your business needs. Sincerely, Alex Rubens From jeffm@suse.com Tue Aug 2 08:20:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B34CA7CA7 for ; Tue, 2 Aug 2016 08:20:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7EF6F8F8035 for ; Tue, 2 Aug 2016 06:20:30 -0700 (PDT) X-ASG-Debug-ID: 1470144026-0bf57b369c349900001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ZyqTAH5fprQGkLWm (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 02 Aug 2016 06:20:28 -0700 (PDT) X-Barracuda-Envelope-From: jeffm@suse.com X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4EA69ABC9 for ; Tue, 2 Aug 2016 13:20:26 +0000 (UTC) To: xfs@oss.sgi.com From: Jeff Mahoney Subject: Old bugs in xfsprogs? Message-ID: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> X-ASG-Orig-Subj: Old bugs in xfsprogs? Date: Tue, 2 Aug 2016 09:20:22 -0400 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="ec8K5VL5fk6GuveFqfwfAPxxF0jhJRIk7" X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470144027 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-ASG-Orig-Subj: Old bugs in xfsprogs? X-Barracuda-Scan-Msg-Size: 2566 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --ec8K5VL5fk6GuveFqfwfAPxxF0jhJRIk7 Content-Type: multipart/mixed; boundary="exDkSN8ViMSwQtfv8lh2kUx0xVrvueI6C" From: Jeff Mahoney To: xfs@oss.sgi.com Message-ID: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> Subject: Old bugs in xfsprogs? --exDkSN8ViMSwQtfv8lh2kUx0xVrvueI6C Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi all - While investigating a weird report on an internal list I found a few old commits that don't look quite right and that may be very old bugs. I know it's hard to go back nearly 15 years, especially in the days where very short commit messages were still acceptable, and try to remember why certain changes happened. In this case, a weird corner case[1] would've been caught, xfs_repair would've bailed, and a file system may have survived (despite obvious user error). 1/ Commit 5000d01d212f (white space cleanup) diff --git a/libxlog/util.c b/libxlog/util.c index 7aca165..aa3093d 100644 --- a/libxlog/util.c +++ b/libxlog/util.c @@ -49,8 +49,10 @@ header_check_uuid(xfs_mount_t *mp, xlog_rec_header_t *head) printf("* ERROR: mismatched uuid in log\n" "* SB : %s\n* log: %s\n", uu_sb, uu_log); + + memcpy(&mp->m_sb.sb_uuid, head->h_fs_uuid, sizeof(uuid_t)); - return 1; + return 0; } This one may well have been intended as a repair operation or perhaps it was accidentally duplicated from another chunk in the patch. At any rate, it hides a mismatched UUID between the log and the superblock from the rest of xfs_repair. The user sees the "error" message but it carries on anyway. 2) Commit d321ceac8da (add libxlog directory.) I believe this was supposed to be as simple as pushing some functionality from logprint into a new libxlog library, but the result is that things that used to return an error no longer did. The print_exit global that was initialized to 1 in logprint is initialized to 0 in libxlog and never set. So we always print an error message but then carry on. So even if the header_check_uuid() call above would fail properly, the error is printed and then the error condition ignored. -Jeff [1] The details are still murky, but what I got was that the user ran xfs_repair -L (yup, i know) on an image file that contained partitions. It found a valid XFS superblock and then "repaired" the file system to an empty state since everything it found was "corrupt." I suspect that there was an XFS file system on the raw image file, which was then partitioned without clearing the MBR, and the expected XFS file system was created on the first partition. xfs_repair was pointed at the whole image file, discovered the old superblock, and remade the fs in its own image since nothing was at the proper locations. --=20 Jeff Mahoney SUSE Labs --exDkSN8ViMSwQtfv8lh2kUx0xVrvueI6C-- --ec8K5VL5fk6GuveFqfwfAPxxF0jhJRIk7 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.19 (Darwin) Comment: GPGTools - http://gpgtools.org iQIcBAEBAgAGBQJXoJ4XAAoJEB57S2MheeWyeeoP/0Mo5oetJ+hsqCMFTyaAD7+/ rLehRKJSAQtZTUICPhuWvT5YKNUjMuIYdcSDeDnPd0HIGW31RgDWTxlJhuTNVtpT kuo2XEFVhtUuU9T206+I8XC+kmpH2KnQrhvQOAQHl/GLMCY5DpMOJANXOmvSHlVi R4ffYVybeXo+uaLuOMLPK8bD3CV4ppwz3i5LWJvGBEwrdosNx3PTJ5fk68GDE+2E d1st+ADu988AaMDLbAOKx0jplQl0oFIGd5x7gdS/98u9BV6vA9ioe4X6c1VBrKr7 d2wfEDdJe7/8PhKO33GKAcCF2MdF12MVyYxirxToRHKX/V7yPKlywvrPeRhF/tXn qekWQpBJY1Onwgr3QB2UZMS3BdAXd7Qf5RnAioRcxjDVGMqXZAmraNzKD96jSDfq RmvGLUhst6NqKsrGDNeFltuhiBKUrdo5vOL/kI6V2DStPlMU8w4cBsXuo8560/F9 tObSlfgVGyFEuVKh2BJW6v7yUgAOedW4Vpjlf+SfPB1Jhy1q+nVjsm5kjW+J6WBE lQuu3K2JezBSFLCEqzxDgipC1aogiWBC5W3pXklqCH8msxr/M6J90N8m7NCFtg/m tQDad/Fh/0fgnaOiiBIUhvduBjI2kmOns84IjrxnNEQVfgM0MreWkSF0iraXaSFY TD6GbUx4PvwyPJ6x82LA =9vPb -----END PGP SIGNATURE----- --ec8K5VL5fk6GuveFqfwfAPxxF0jhJRIk7-- From mixmand@zoho.com Tue Aug 2 08:29:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=1.0 required=5.0 tests=HK_RANDOM_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 73F957CAF for ; Tue, 2 Aug 2016 08:29:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44DDE8F8033 for ; Tue, 2 Aug 2016 06:29:52 -0700 (PDT) X-ASG-Debug-ID: 1470144588-0bf57b369d34a5d0001-NocioJ Received: from 589187.com (589187.com [104.168.102.54]) by cuda.sgi.com with ESMTP id PK86jL6wbgaRVcWN for ; Tue, 02 Aug 2016 06:29:49 -0700 (PDT) X-Barracuda-Envelope-From: mixmand@zoho.com X-Barracuda-Effective-Source-IP: 589187.com[104.168.102.54] X-Barracuda-Apparent-Source-IP: 104.168.102.54 To: xfs@oss.sgi.com Subject: Mobile App Development Solutions for startups, individuals & entrepreneurs Message-ID: <6d14379d1fe35687f925d1c91fceac15@tedbrownmusic.com> X-ASG-Orig-Subj: Mobile App Development Solutions for startups, individuals & entrepreneurs Date: Tue, 02 Aug 2016 14:13:13 +0200 From: "Alex Rubens" Reply-To: yuiyangs@sina.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1664 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 589187.com[104.168.102.54] X-Barracuda-Start-Time: 1470144588 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1173 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0646 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0646 Custom rule MV0646 Hello, Are you seeking assistance for developing a mobile application? Or need any help in identifying the right technology/ platform for launching your idea? We have a global clientele and extensive repertoire since 2011 in delivering Mobile App Solutions. Top enterprises and start-ups choose Solution Analysts as their preferred vendor for their dream projects. It’s your turn now. We are based in India. Our human resource base comprises of more than 90 tech experts who will help you set up a dedicated team that will deliver your solution exactly to the brief. Our App Development offerings are: • iOS App Development on Swift • Android App development • Cross Platform App Development: Ionic, React Native, PhoneGap Honest Numbers that will swing your opinion to start working with us: • 5+ years experience • 187+ Mobile apps delivered • 7+ Android & iOS SDK developed • 100% quality assurance • 85+ Testing Devices • 90+ Professional Developers and Designers We are ready to deliver you awesome mobile apps. Looking forward to your response and addressing your business needs. Sincerely, Alex Rubens From bfoster@redhat.com Tue Aug 2 09:04:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 20A8E7CAE for ; Tue, 2 Aug 2016 09:04:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C8A698F8033 for ; Tue, 2 Aug 2016 07:04:15 -0700 (PDT) X-ASG-Debug-ID: 1470146654-0bf8157e6c3c1c50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9TbA8vLg8Vz2b4wT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 07:04:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E84484E034; Tue, 2 Aug 2016 14:04:13 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72E4DcH017478; Tue, 2 Aug 2016 10:04:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id EFD7A120BDC; Tue, 2 Aug 2016 10:04:12 -0400 (EDT) Date: Tue, 2 Aug 2016 10:04:12 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys Message-ID: <20160802140412.GA9205@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> <20160801064818.GJ15590@infradead.org> <20160801191126.GE8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801191126.GE8590@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 02 Aug 2016 14:04:14 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470146654 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5946 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 01, 2016 at 12:11:26PM -0700, Darrick J. Wong wrote: > On Sun, Jul 31, 2016 at 11:48:18PM -0700, Christoph Hellwig wrote: ... > > > > > +++ b/fs/xfs/libxfs/xfs_btree.c ... > > I don't understand the purpose of this union at all, and the comment > > seems misleading. Compared to union xfs_btree_key the only difference > > seems to be that xfs_btree_bigkey is missing the > > 'struct xfs_rmap_key rmap' member. How does that enable us to holds > > I think you might be missing a later patch, wherein we add the rmap > stuff to the btree structures, which expands bigkey to look like this: > > union xfs_btree_bigkey { > struct xfs_bmbt_key bmbt; > xfs_bmdr_key_t bmbr; /* bmbt root block */ > xfs_alloc_key_t alloc; > struct xfs_inobt_key inobt; > struct { > struct xfs_rmap_key rmap; > struct xfs_rmap_key rmap_hi; > }; > struct xfs_refcount_key refc; > }; > > bigkey.rmap is the low key, bigkey.rmap_hi is the high key. None of > the other btrees are overlapped, so they don't get a high key. > > > low and high keys? Also every single user seems to cast it to > > xfs_btree_key which is a little odd and smells unsafe. > > On disk, the low and high keys of a pointer reside next to each other. > The btree_split code wants to store the new block's keys somewhere so > that the block can later be insrec'd into a higher btree level. It > would be convenient if this incore storage could also store the two > keys right next to each other so that we can memcpy key_len bytes from > the temporary storage into the on-disk btree block and not have to > special case that code. > > I thought about simply declaring an on-stack array of two union > xfs_btree_keys. The array is big enough to contain both keys and > eliminates the need for casting. On the other hand it's weird because > the two keys have to be aligned to xfs_rmap_key boundaries, not > xfs_btree_key, which means that the high key isn't necessarily stored > in the second array element like the code would suggest. > Thanks for writing this up... I'm wondering if we should define an in-core key structure variant similar to what we have for in-core records. That structure could encapsulate the low/high key model and use the already-defined in-core record structures (I suppose we could define tree-specific ikey variants, but I'll leave that alone for now). For example: struct xfs_btree_ikey { union xfs_bree_irec lo; union xfs_btree_irec hi; } Then define some conversion functions, tease apart the bits of the generic btree code that use the on-disk structure for in-memory storage vs. on-disk buffer references, and use the in-core structure for all instances of the former. That most certainly would mean more changes (as an indepedent patch) and tbh, it's not yet clear to me whether we'd run into other roadblocks that make it too ugly an option or just not worth it. I do feel like we're trying a bit too hard to retrofit the extra complexity of the multi-key model into the current design, however, and should try to explicitly define the multi-key model if we can find a reasonably elegant way to do so. Even passing around the xfs_btree_bigkey structure seems safer to me than pretending it's an xfs_btree_key and relying on key_len to make sure we copy the right amount of data or that we've defined bigkey in the right layers of the call stack. Thoughts? Brian > Then I thought about stuffing both low and high keys into > xfs_rmap_key like so: > > struct xfs_rmap_key { > __be32 rm_startblock; /* extent start block */ > __be64 rm_owner; /* extent owner */ > __be64 rm_offset; /* offset within the owner */ > __be32 rm_hi_startblock; /* extent start block */ > __be64 rm_hi_owner; /* extent owner */ > __be64 rm_hi_offset; /* offset within the owner */ > } __attribute__((packed)); > > But that was even uglier, because an overlapped btree has two keys > associated with a pointer, not one gigantic key. It's also a > non-starter because sometimes we want to be able to treat the high > fields as a distinct key and then feed that key to the btree key > handling functions; when we do this, the hi_ fields point past the end > of the allotted space. The overlapped query range function and the > btree scrubbers in later patches want to use high keys in this manner. > > So then there was this way: > > union xfs_btree_key { > struct xfs_bmbt_key bmbt; > xfs_bmdr_key_t bmbr; /* bmbt root block */ > xfs_alloc_key_t alloc; > struct xfs_inobt_key inobt; > struct xfs_rmap_key rmap[2]; > struct xfs_refcount_key refc; > }; > > This gives us the storage we want and avoids casts, but it still > doesn't fix the problem that sometimes we want to create a key pointer > to just the high fields and treat that as a pointer. > > So I created the separate bigkey structure to get the storage size I > wanted, and cast it to xfs_btree_key wherever it gets fed into the > other parts of the btree code. It's smelly like you say, but at least > we have a distinct type to help future us identify the three smelly > places where we do this. > > What I really wanted to do instead of bigkey was this: > > struct xfs_btree_key *key = kmalloc(cur->bc_ops->key_len); > > ...except then we have a memory allocation. > > I don't have a problem with replacing the bigkey variables > with two-element array and just living with the fact that the high key > will not be found at key[1], but I worry that future me won't remember > that subtlety. Whereas tracing the key pointers back to the bigkey on > the stack is not subtle and even better the debugger correctly locates > the high key contents. > > --D > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sales04@rds-light.pw Tue Aug 2 10:00:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B60977CA4 for ; Tue, 2 Aug 2016 10:00:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1996AAC007 for ; Tue, 2 Aug 2016 08:00:26 -0700 (PDT) X-ASG-Debug-ID: 1470150019-0bf57c13682ee120001-NocioJ Received: from server1.domain.com (server1.rds-light.pw [47.88.76.54]) by cuda.sgi.com with ESMTP id ZRTqhKnWlzPDXLO7 for ; Tue, 02 Aug 2016 08:00:20 -0700 (PDT) X-Barracuda-Envelope-From: sales04@rds-light.pw X-Barracuda-Effective-Source-IP: server1.rds-light.pw[47.88.76.54] X-Barracuda-Apparent-Source-IP: 47.88.76.54 Received: from linda (104.202.49.115) by server1.domain.com id hk2qog0e97cp for ; Tue, 2 Aug 2016 23:00:19 +0800 (envelope-from ) From: "sales05rds02@gmail.com" Subject: Re:Re:In 2017 Will Be Popular product.. To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re:Re:In 2017 Will Be Popular product.. MIME-Version: 1.0 Sender: sales04@rds-light.pw Reply-To: sales05rds02@gmail.com Date: Tue, 2 Aug 2016 23:00:22 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: server1.rds-light.pw[47.88.76.54] X-Barracuda-Start-Time: 1470150020 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14241 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31692 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20160802150026.716A01940062@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE3NTE0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIA0Kc3R5bGU9IlRFWFQt SlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBURVhULUFMSUdOOiBqdXN0aWZ5OyBMSU5FLUhFSUdI VDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFRFWFQtQVVUT1NQQUNFOiBp ZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28tY2hh ci1pbmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IG5vbmUiIA0KY2xhc3M9TXNv Tm9ybWFsIGFsaWduPWp1c3RpZnk+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZP TlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0Ij5IaSw8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZP TlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUpVU1RJ Rlk6IGludGVyLWlkZW9ncmFwaDsgVEVYVC1BTElHTjoganVzdGlmeTsgTElORS1IRUlHSFQ6IDIw MCU7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBURVhULUFVVE9TUEFDRTogaWRlb2dy YXBoLW51bWVyaWM7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZDsgbXNvLWNoYXItaW5k ZW50LWNvdW50OiAwLjAwMDA7IG1zby1wYWdpbmF0aW9uOiBub25lIiANCmNsYXNzPU1zb05vcm1h bCBhbGlnbj1qdXN0aWZ5PjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZB TUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAw MDBwdCI+R29vZCANCmRheSE8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7 IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5p bmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUpV U1RJRlk6IGludGVyLWlkZW9ncmFwaDsgVEVYVC1BTElHTjoganVzdGlmeTsgTElORS1IRUlHSFQ6 IDIwMCU7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBURVhULUFVVE9TUEFDRTogaWRl b2dyYXBoLW51bWVyaWM7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZDsgbXNvLWNoYXIt aW5kZW50LWNvdW50OiAwLjAwMDA7IG1zby1wYWdpbmF0aW9uOiBub25lIiANCmNsYXNzPU1zb05v cm1hbCBhbGlnbj1qdXN0aWZ5PjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05U LUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAx LjAwMDBwdCI+VGhpcyANCmlzJm5ic3A7TGluZGEmbmJzcDtmcm9tIFJ1aWRpc2kgbGlnaHQsV2Ug cHJvZHVjZSBMRUQgbGlnaHRzIGZvciBzZXZlcmFsIA0KeWVhcnMuPC9TUEFOPjwvUD4NCjxQIA0K c3R5bGU9IlRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBURVhULUFMSUdOOiBqdXN0aWZ5 OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFRFWFQt QVVUT1NQQUNFOiBpZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAw MGdkOyBtc28tY2hhci1pbmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IG5vbmUi IA0KY2xhc3M9TXNvTm9ybWFsIGFsaWduPWp1c3RpZnk+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlH SFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1m b250LWtlcm5pbmc6IDEuMDAwMHB0Ij48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgDQpzdHlsZT0iVEVY VC1KVVNUSUZZOiBpbnRlci1pZGVvZ3JhcGg7IFRFWFQtQUxJR046IGp1c3RpZnk7IExJTkUtSEVJ R0hUOiAyMDAlOyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46IDBwdDsgVEVYVC1BVVRPU1BBQ0U6 IGlkZW9ncmFwaC1udW1lcmljOyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMC4wMDAwZ2Q7IG1zby1j aGFyLWluZGVudC1jb3VudDogMC4wMDAwOyBtc28tcGFnaW5hdGlvbjogbm9uZSIgDQpjbGFzcz1N c29Ob3JtYWwgYWxpZ249anVzdGlmeT48Qj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAw JTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBib2xk OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij4yMDE3IA0Kd2lsbCBiZSBwb3B1bGFy IHByb2R1Y3RzOjwvU1BBTj48L0I+PEI+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7 IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogYm9sZDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9CPjwv UD4NCjxQIA0Kc3R5bGU9IlRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBURVhULUFMSUdO OiBqdXN0aWZ5OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAw cHQ7IFRFWFQtQVVUT1NQQUNFOiBpZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLWxl ZnQ6IDAuMDAwMGdkOyBtc28tY2hhci1pbmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRp b246IG5vbmUiIA0KY2xhc3M9TXNvTm9ybWFsIGFsaWduPWp1c3RpZnk+PFNQQU4gDQpzdHlsZT0i TElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTFwdDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsg bXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFs OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsIj4xLjwvU1BBTj48U1BBTiANCnN0eWxlPSJM SU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDExcHQ7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9 kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPk1vdGlvbiZuYnNwO2RpbW1lciZuYnNwO3Nl bnNvciZuYnNwO2xlZCZuYnNwO2hpZ2gmbmJzcDtiYXkmbmJzcDtsaWdodCwmbmJzcDtzYXZpbmcm bmJzcDt5b3VyJm5ic3A7ZWxlY3RyaWNpdHkmbmJzcDtjb3N0cy48L1NQQU4+PFNQQU4gDQpzdHls ZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0 OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48QlI+PC9TUEFOPjxTUEFOIA0Kc3R5 bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+Mi4mbmJzcDs4MHctMjAwdyZuYnNw O2Vjb25vbWljYWwmbmJzcDt2ZXJzaW9uJm5ic3A7bGVkJm5ic3A7aGlnaCZuYnNwO2JheSZuYnNw O2xpZ2h0LiZuYnNwO3NhbGVzJm5ic3A7MjAwMDBwY3MvbW9udGg8L1NQQU4+PFNQQU4gDQpzdHls ZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0 OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48QlI+PC9TUEFOPjxTUEFOIA0Kc3R5 bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+My4mbmJzcDtJUDY1Jm5ic3A7d2F0 ZXJwcm9vZiZuYnNwO2xlZCZuYnNwO2hpZ2gmbmJzcDtiYXkmbmJzcDtsaWdodCwmbmJzcDt2YXJp ZXR5Jm5ic3A7d2F5cyZuYnNwO2Fzc2VtYmx5Jm5ic3A7YW5kJm5ic3A7bXVsdGktYW5nbGUmbmJz cDtsZW5zLCZuYnNwO3dpZGVseSZuYnNwO3VzZWQmbmJzcDtpbiZuYnNwO2FsbCZuYnNwO2tpbmRz Jm5ic3A7b2YmbmJzcDtwbGFjZS48L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIw MCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDEuMDAwMHB0Ij48QlI+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAy MDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdCI+NC4mbmJzcDtMZWQmbmJzcDtsaW5lYXImbmJzcDtsaWdodCZuYnNw O3doaWNoJm5ic3A7d2lsbCZuYnNwO3JlcGxhY2UmbmJzcDtvZiZuYnNwO3R1YmUsJm5ic3A7cGFu ZWwmbmJzcDtsaWdodCwmbmJzcDtjYW4mbmJzcDthY2hpZXZlJm5ic3A7dGhlJm5ic3A7ZG9ja2lu ZywmbmJzcDtkaW1tZXIsJm5ic3A7bXVsdGktYW5nbGUmbmJzcDtyZXF1ZXN0Jm5ic3A7YW5kJm5i c3A7c28mbmJzcDtvbi48L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZP TlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0Ij48QlI+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBG T05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3ll cyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5n OiAxLjAwMDBwdCI+NS4mbmJzcDtTbGltJm5ic3A7bGVkJm5ic3A7Zmxvb2QmbmJzcDtsaWdodCwm bmJzcDtXaWRlJm5ic3A7cG93ZXImbmJzcDsxMHctMjAwdyxjYW4mbmJzcDtzYXZlJm5ic3A7eW91 ciZuYnNwO3RyYW5zcG9ydGF0aW9uJm5ic3A7Y29zdC4mbmJzcDsgDQo8L1NQQU4+PC9QPjxTUEFO IA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0la RTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZh bWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PFNQQU4gDQpzdHlsZT0i TElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovk vZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij4NCjxQIA0Kc3R5bGU9IlRFWFQtSlVTVElG WTogaW50ZXItaWRlb2dyYXBoOyBURVhULUFMSUdOOiBqdXN0aWZ5OyBMSU5FLUhFSUdIVDogMjAw JTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFRFWFQtQVVUT1NQQUNFOiBpZGVvZ3Jh cGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28tY2hhci1pbmRl bnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IG5vbmUiIA0KY2xhc3M9TXNvTm9ybWFs IGFsaWduPWp1c3RpZnk+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFN SUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAw MHB0Ij5MZXQgDQptZSBrbm93IGlmIHlvdSBhcmUgaW50ZXJlc3RlZCx3ZSBzZW5kIDxTVFJPTkc+ Y2F0YWxvZzwvU1RST05HPiB0byB5b3UgDQpzb29uLjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJU RVhULUpVU1RJRlk6IGludGVyLWlkZW9ncmFwaDsgVEVYVC1BTElHTjoganVzdGlmeTsgTElORS1I RUlHSFQ6IDIwMCU7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBURVhULUFVVE9TUEFD RTogaWRlb2dyYXBoLW51bWVyaWM7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZDsgbXNv LWNoYXItaW5kZW50LWNvdW50OiAwLjAwMDA7IG1zby1wYWdpbmF0aW9uOiBub25lIiANCmNsYXNz PU1zb05vcm1hbCBhbGlnbj1qdXN0aWZ5PjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAl OyBGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5 O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJu aW5nOiAxLjAwMDBwdCI+VGhhbmsgDQp5b3UhPC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQt SlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBURVhULUFMSUdOOiBqdXN0aWZ5OyBMSU5FLUhFSUdI VDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFRFWFQtQVVUT1NQQUNFOiBp ZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28tY2hh ci1pbmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IG5vbmUiIA0KY2xhc3M9TXNv Tm9ybWFsIGFsaWduPWp1c3RpZnk+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZP TlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0Ij48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1KVVNUSUZZOiBp bnRlci1pZGVvZ3JhcGg7IFRFWFQtQUxJR046IGp1c3RpZnk7IExJTkUtSEVJR0hUOiAyMDAlOyBU RVhULUlOREVOVDogMHB0OyBNQVJHSU46IDBwdDsgVEVYVC1BVVRPU1BBQ0U6IGlkZW9ncmFwaC1u dW1lcmljOyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMC4wMDAwZ2Q7IG1zby1jaGFyLWluZGVudC1j b3VudDogMC4wMDAwOyBtc28tcGFnaW5hdGlvbjogbm9uZSIgDQpjbGFzcz1Nc29Ob3JtYWwgYWxp Z249anVzdGlmeT48L1NQQU4+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtSlVT VElGWTogaW50ZXItaWRlb2dyYXBoOyBURVhULUFMSUdOOiBqdXN0aWZ5OyBMSU5FLUhFSUdIVDog MjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFRFWFQtQVVUT1NQQUNFOiBpZGVv Z3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28tY2hhci1p bmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IG5vbmUiIA0KY2xhc3M9TXNvTm9y bWFsIGFsaWduPWp1c3RpZnk+Jm5ic3A7PC9QPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAy MDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdCI+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAw cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFO IA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0la RTogMTFwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5n OiAwLjAwMDBwdCI+VGhhbmtzIA0KJmFtcDsgQmVzdCByZWdhcmRzPC9TUEFOPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTFw dDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+ LDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFw dDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+ PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElO RS1IRUlHSFQ6IDEycHQ7IE1BUkdJTjogNy41cHQgNy41cHQgNy41cHQgMHB0OyBtc28tcGFnaW5h dGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTogQXJpYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDExcHQ7IEZPTlQt V0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiIA0K Y2xhc3M9MTU+TGluZGEgLyBNYW5hZ2VyPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZ OiBBcmlhbDsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1m b250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxl PSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMTJwdDsgTUFSR0lOOiA3LjVwdCA3LjVw dCA3LjVwdCAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9y bWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYigwLDAsMCk7 IEZPTlQtU0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5 O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdCI+U2hlbnpoZW4gDQpSdWlkaXNpIExpZ2h0aW5nIENPLixMVEQ8 L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDExcHQ7 IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxv OnA+PC9vOnA+PC9TUEFOPjwvUD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENP TE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9 r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPg0KPFAgDQpzdHlsZT0iVEVYVC1B TElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDEycHQ7IE1BUkdJTjogNy41cHQgNy41cHQgNy41cHQg MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJ WkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2Vybmlu ZzogMC4wMDAwcHQiPldoYXRzYXBwOiANCis4Ni0xMzcyMzc2OTYwNzwvU1BBTj48U1BBTiANCnN0 eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IG5v cm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWls eTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+ PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDEycHQ7IE1B UkdJTjogNy41cHQgNy41cHQgNy41cHQgMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFu IiANCmNsYXNzPU1zb05vcm1hbD48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogbm9y bWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij5UZWw6IA0KKzg2IDc1 NSAyODkwOTUyMzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQt U0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAx LjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjog bGVmdDsgTElORS1IRUlHSFQ6IDEycHQ7IE1BUkdJTjogNy41cHQgNy41cHQgNy41cHQgMHB0OyBt c28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0 eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEx cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMC4w MDAwcHQiPlNreXBlOiANCmxpbmRhLnJkczwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28t Zm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDEycHQ7IE1BUkdJTjogNy41cHQgNy41 cHQgNy41cHQgMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05v cm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsg Rk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dCI+aHR0cDovL3d3dy5yZHMtbGVkLmNvbS88L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6IEFyaWFsOyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNv LWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5 bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxMnB0OyBNQVJHSU46IDcuNXB0IDcu NXB0IDcuNXB0IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29O b3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogcmdiKDAsMCww KTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1m b250LWtlcm5pbmc6IDAuMDAwMHB0Ij5BZGQ6IA0KMy9GIFNpbGljb24gVmFsbGV5IFBvd2VyIElu ZHVzdHJpYWwgUGFyayw8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBG T05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vybmlu ZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJ R046IGxlZnQ7IExJTkUtSEVJR0hUOiAxMnB0OyBNQVJHSU46IDcuNXB0IDcuNXB0IDcuNXB0IDBw dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpF OiAxMXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtMb25naHVhIA0KQmFvJiMz OTthbiBEaXN0cmljdCxzaGVuemhlbixjaGluYTwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBt c28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpz dHlsZT0iVEVYVC1KVVNUSUZZOiBpbnRlci1pZGVvZ3JhcGg7IFRFWFQtQUxJR046IGp1c3RpZnk7 IExJTkUtSEVJR0hUOiAyMDAlOyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46IDBwdDsgVEVYVC1B VVRPU1BBQ0U6IGlkZW9ncmFwaC1udW1lcmljOyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMC4wMDAw Z2Q7IG1zby1jaGFyLWluZGVudC1jb3VudDogMC4wMDAwOyBtc28tcGFnaW5hdGlvbjogbm9uZSIg DQpjbGFzcz1Nc29Ob3JtYWwgYWxpZ249anVzdGlmeT48IS0tRW5kRnJhZ21lbnQtLT48L1NQQU4+ PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgRk9O VC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpw PjwvU1BBTj48L1A+PCEtLUVuZEZyYWdtZW50LS0+PC9CT0RZPjwvSFRNTD4NCg0K From sandeen@sandeen.net Tue Aug 2 10:00:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 40C587CB1 for ; Tue, 2 Aug 2016 10:00:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E9CB08F8039 for ; Tue, 2 Aug 2016 08:00:44 -0700 (PDT) X-ASG-Debug-ID: 1470150041-0bf8157e6a3c4020001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id XzsRGeC6x7iVZghR for ; Tue, 02 Aug 2016 08:00:41 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0D5244AC133 for ; Tue, 2 Aug 2016 10:00:41 -0500 (CDT) Subject: Re: Old bugs in xfsprogs? To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Old bugs in xfsprogs? References: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> From: Eric Sandeen Message-ID: <626eedea-2b9a-4ca3-cd3d-1e528f45526f@sandeen.net> Date: Tue, 2 Aug 2016 10:00:31 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="iLBvSeQx8lh6327t3Tg3qwh5oF1C4gT3u" X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1470150041 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-ASG-Orig-Subj: Re: Old bugs in xfsprogs? X-Barracuda-Scan-Msg-Size: 3826 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --iLBvSeQx8lh6327t3Tg3qwh5oF1C4gT3u Content-Type: multipart/mixed; boundary="bfplggHAvDEWDw2HAdsXMLhxxeVI54wmu" From: Eric Sandeen To: xfs@oss.sgi.com Message-ID: <626eedea-2b9a-4ca3-cd3d-1e528f45526f@sandeen.net> Subject: Re: Old bugs in xfsprogs? References: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> In-Reply-To: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> --bfplggHAvDEWDw2HAdsXMLhxxeVI54wmu Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 8/2/16 8:20 AM, Jeff Mahoney wrote: > Hi all - >=20 > While investigating a weird report on an internal list I found a few ol= d > commits that don't look quite right and that may be very old bugs. I > know it's hard to go back nearly 15 years, especially in the days where= > very short commit messages were still acceptable, and try to remember > why certain changes happened. In this case, a weird corner case[1] > would've been caught, xfs_repair would've bailed, and a file system may= > have survived (despite obvious user error). >=20 > 1/ Commit 5000d01d212f (white space cleanup) Meh, not a white space cleanup, is it! > diff --git a/libxlog/util.c b/libxlog/util.c > index 7aca165..aa3093d 100644 > --- a/libxlog/util.c > +++ b/libxlog/util.c > @@ -49,8 +49,10 @@ header_check_uuid(xfs_mount_t *mp, xlog_rec_header_t= > *head) > printf("* ERROR: mismatched uuid in log\n" > "* SB : %s\n* log: %s\n", > uu_sb, uu_log); > + > + memcpy(&mp->m_sb.sb_uuid, head->h_fs_uuid, sizeof(uuid_t)); >=20 > - return 1; > + return 0; > } However, after seeing the mismatch, it "fixes" it by copying the header uuid into the mount point uuid. But that doesn't seem like the right approach at all, and it renders all the callers who check the return value of header_check_uuid pointless. So yeah, doesn't look good to me. > This one may well have been intended as a repair operation or perhaps i= t > was accidentally duplicated from another chunk in the patch. At any > rate, it hides a mismatched UUID between the log and the superblock fro= m > the rest of xfs_repair. The user sees the "error" message but it > carries on anyway. >=20 > 2) Commit d321ceac8da (add libxlog directory.) >=20 > I believe this was supposed to be as simple as pushing some > functionality from logprint into a new libxlog library, but the result > is that things that used to return an error no longer did. The > print_exit global that was initialized to 1 in logprint is initialized > to 0 in libxlog and never set. So we always print an error message but= > then carry on. So even if the header_check_uuid() call above would fai= l > properly, the error is printed and then the error condition ignored. Sigh, yeah, the old commits are wild west. :( In this case header_check_uuid returned 0 anyway,so print_exit would not have helped, but I think you're right. A perfect storm of derp. ;) > -Jeff >=20 > [1] The details are still murky, but what I got was that the user ran > xfs_repair -L (yup, i know) on an image file that contained partitions.= > It found a valid XFS superblock and then "repaired" the file system to > an empty state since everything it found was "corrupt." I suspect that= > there was an XFS file system on the raw image file, which was then > partitioned without clearing the MBR, and the expected XFS file system > was created on the first partition. xfs_repair was pointed at the whol= e > image file, discovered the old superblock, and remade the fs in its own= > image since nothing was at the proper locations. Oh, so it found 4 matching, old, valid, superblocks? Ugh. I don't know how to protect against that, although it probably should have found a few non-matching supers along the way as well. I wonder if we should be more cautious in that case. I could imagine that maybe for each candidate super we find, we should look at its geometry, and spot-check the other locations that it indicate= s should contain a superblock. If we get enough semi-valid but conflicting= "sets," maybe we should bail out and ask. It's quite a corner case, tho.= Any chance you have full xfs_repair output? -Eric --bfplggHAvDEWDw2HAdsXMLhxxeVI54wmu-- --iLBvSeQx8lh6327t3Tg3qwh5oF1C4gT3u Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org iQIcBAEBAgAGBQJXoLWYAAoJECCuFpLhPd7ggLEQAIXsnGsLvUeHDUDRHHA+R4eZ hGdgGO4sUC/9KbnAgPm1hsyYiVUIZRGoV7E1Q48xujS8B3w1p6Uvfh5ifFKj0zwa +W60KZ15B03TFs1GxQf9iXainL1O1zOLcpBQMOX2ny5/M1yc/9ReYbU8Ofby4Q7f w2zDbGHFCRiB8k9mf4iqm3bNzsf6bwMLnspntkokV8ozW7wwG4qdyhTbL1mFXzMi 3aFMSJns1Fy18gkc/K19O0qkmu0hD8vPPoVXVq8oBPHK8b9OfYh8ruKXy/5X7MQI bAwLrwsPUhGvBJLsjzguBDIcnvKX11kxl0c2MK6eQYWKLXIoM2BfgCRJVCvMt6VW +bz2lLboguWhBW6GtCtyY7dr/2LsXbqTBWAV+Q8DJIku4ENZVZC63FcZMvHIti0A 9IbMd60VMs7HqSSm/yuNvkl4QjrCmgBVlEzVipjBM1nhuqCZC7xsYh+yfOZHcNlh /J6mc6z8ruNqPchV7pEWVc0EfkU7+69ElUVbkTtsAIUpFQyjhHn88VD/g/4VXdX0 lkAyy0vfqjud8JMCD1gVFsLEJxfTOJn7wnuJZv0YtAWLa4m9yBhMi0LZ7jtxCowZ QTDKckyt3V22bA+jSqCquARQH115hRPOWvNXbhktV+KHXwIbpuAT8COeFbfCKtP5 amxG0cdtdbSC8oGLSaHj =yCyY -----END PGP SIGNATURE----- --iLBvSeQx8lh6327t3Tg3qwh5oF1C4gT3u-- From sandeen@sandeen.net Tue Aug 2 10:06:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 45AB77CAE for ; Tue, 2 Aug 2016 10:06:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F17378F8039 for ; Tue, 2 Aug 2016 08:06:27 -0700 (PDT) X-ASG-Debug-ID: 1470150385-0bf8157e6c3c44b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8QBCfGyu6Wt7y88v for ; Tue, 02 Aug 2016 08:06:25 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7DADC4AC120 for ; Tue, 2 Aug 2016 10:06:25 -0500 (CDT) Subject: Re: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails References: <1470120540-15135-1-git-send-email-zlang@redhat.com> <20160802122721.GE31492@infradead.org> From: Eric Sandeen Message-ID: Date: Tue, 2 Aug 2016 10:06:24 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160802122721.GE31492@infradead.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1470150385 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1560 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/2/16 7:27 AM, Christoph Hellwig wrote: > On Tue, Aug 02, 2016 at 02:49:00PM +0800, Zorro Lang wrote: >> After XFS_GETNEXTQUOTA feature has been merged into linux kernel and >> xfsprogs, xfs_quota use Q_XGETNEXTQUOTA for report and dump, and >> fall back to old XFS_GETQUOTA ioctl if XFS_GETNEXTQUOTA fails. >> >> But when XFS_GETNEXTQUOTA fails, xfs_quota print a warning as >> "XFS_GETQUOTA: Invalid argument". That's due to kernel can't >> recognize XFS_GETNEXTQUOTA ioctl and return EINVAL. At this time, >> the warning is helpless, xfs_quota just need to fall back. > > We'd still want to report other errors, right? I advised Zorro to do it this way, because -EINVAL can have a few meanings, and we don't know for sure why we got it. Could be a bad cmd, or a bad type, or ... If it fails, we're going to fall back anyway, so for any other error we'd print it twice; on the fallback, we'd print the real unexpected error anyway, so I think the user will get the relevant information in this case. But I guess we could do: + /* EINVAL is expected for XFS_GETNEXTQUOTA on older kernels */ if (xfsquotactl(cmd, dev, type, id, (void *)&d) < 0) { + if (errno != ENOENT && errno != ENOSYS && errno != ESRCH && + (cmd == XFS_GETNEXTQUOTA && errno != EINVAL) and then change what we print (not perror("XFS_GETQUOTA") in all cases)? But if we got i.e. EPERM, we'd print the EPERM error twice; once for the first call, and once for the fallback. I suppose that'd be ok, but not sure it's helpful. -Eric From darrick.wong@oracle.com Tue Aug 2 10:41:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4CF947CA4 for ; Tue, 2 Aug 2016 10:41:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AF366AC003 for ; Tue, 2 Aug 2016 08:41:08 -0700 (PDT) X-ASG-Debug-ID: 1470152465-0bf57b369d350150001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 8WmMVSBLJaiEFiDj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:41:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u72FebMQ023049 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 15:40:38 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u72FebG9001961 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 15:40:37 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u72FeaRP028443; Tue, 2 Aug 2016 15:40:36 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 08:40:36 -0700 Date: Tue, 2 Aug 2016 08:40:35 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace Message-ID: <20160802154035.GI8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace References: <20160802035651.GB8593@birch.djwong.org> <20160802122517.GD31492@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802122517.GD31492@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470152465 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 563 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 02, 2016 at 05:25:17AM -0700, Christoph Hellwig wrote: > On Mon, Aug 01, 2016 at 08:56:51PM -0700, Darrick J. Wong wrote: > > When we're iterating inode xattrs by handle, we have to copy the > > cursor back to userspace so that a subsequent invocation actually > > retrieves subsequent contents. > > Testcase? Found it while continuing development of xfs_scrub. I'll send along the xfstest patch when I've finished polishing it. (It was harder than usual since xfs_io doesn't /use/ the attr-by-handle interface... nothing does.) --D From jtulak@redhat.com Tue Aug 2 10:42:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 881677CA4 for ; Tue, 2 Aug 2016 10:42:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5A0A4304039 for ; Tue, 2 Aug 2016 08:42:52 -0700 (PDT) X-ASG-Debug-ID: 1470152567-0bf57c136a2eff70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bHAjLKfCukbRIApS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:48 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 27CF361E44 for ; Tue, 2 Aug 2016 15:42:47 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCn020921; Tue, 2 Aug 2016 11:42:46 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [RFC PATCH 0/8] mkfs: centralised conflict detection Date: Tue, 2 Aug 2016 17:42:11 +0200 X-ASG-Orig-Subj: [RFC PATCH 0/8] mkfs: centralised conflict detection Message-Id: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 02 Aug 2016 15:42:47 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152568 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4261 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi guys This is set follows the earlier cleaning of mkfs by utilising the new code to do also inter-option conflicts checks, and is inspired by Dave's idea in "xfstests: Add mkfs input validation tests" thread. With these patches, adding -i attr=1 -m crc=1 conflict is as simple as: { .index = I_ATTR, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 1, 1, + "V2 attribute format always enabled on CRC enabled filesytems."}, + {LAST_CONFLICT} }, And a similar change in the corresponding option. You can read it as: I_ATTR has a conflict with M_CRC depending on input values (the "true"), when M_CRC is 1 (the first 1) and I_ATTR is 1 (the second 1). Report it with message... (I should probably rewrite it to use named initialization, instead of positional.) This change should remove some other code from mkfs and make conflicts consistent. The patch set, as it is, should be mostly done. I think there are still some conflicts to be converted, and some new lines added/removed where they are not needed, but the main reason why this is RFC is an issue with defaults. Detection of conflicts in user input is working like a charm. However, if some option is conflicting with default settings, I have a problem. For example, lets look on -m crc=1 -n ftype=0. crc=1 is the default, so if the user inputs -n ftype=0 alone, it is still a conflict and the old code detects it once it loads and parses all user input. The new does not. The conflicts detecting code added in previous mkfs cleaning, which this patchset is extending, does conflicts detection at the moment it sees an option/flag, during getopt loop. Which means I can't just raise a red flag when something is in conflict with default, because it is possible that the very next option will change that default. I left the old code here and only added a comment (it is in the last patch), but there are other options with the same issue... The solutions I came up are here, but I would like to know some other people's thoughts before going for any of them. They are sorted by the amount of necessary changes. 1) Leave the old code there. This brings some duplicity, but not every option has this issue, so I think that overall it would be still a gain. 2) Do minimal changes to move the conflict checks after the getopt loop. I think that this should be possible without too many changes - I would remove all conflict-related things from getnum/getstr and instead would add a loop to go through the entire table with options after the getopt loop. So - one loop to fill the table, with user-given values, second loop to check for conflicts. 3) Rewrite conflicts from scratch and check them once everything was parsed and all options loaded. Similar to 2, but rather than making minimal changes, I would take the conflicts out of the current opt_params table and made a second table for conflicts only. This would also allow for merging the two entries necessary for every conflict (one from each side) into a single one. My thoughts about these ideas: 1 is clumsy and doesn't look correct, so I think about 2 and 3. For now, 2 would be easier, but I think also about adding range conflicts (inode size with and without crc, ...) and possibly other things and then I'm not sure which implementation would be better. I hope I described it well enough so you don't have to study every line of the code... Anyway, look on this patchset and tell me your thoughts. Thank you :-) Jan Jan Tulak (8): mkfs: remove intermediate getstr followed by getnum mkfs: merge tables for opts parsing into one table mkfs: extend opt_params with a value field mkfs: change conflicts array into a table capable of cross-option addressing mkfs: add a check for conflicting values mkfs: add cross-section conflict checks mkfs: Move opts related #define to one place mkfs: move conflicts into the table mkfs/xfs_mkfs.c | 1647 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 938 insertions(+), 709 deletions(-) -- 2.5.5 From jtulak@redhat.com Tue Aug 2 10:42:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F1BA77CA6 for ; Tue, 2 Aug 2016 10:42:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3351304048 for ; Tue, 2 Aug 2016 08:42:53 -0700 (PDT) X-ASG-Debug-ID: 1470152572-0bf57c13672eff80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uYMqsRUsihIY2zSd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:52 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 199BA85541 for ; Tue, 2 Aug 2016 15:42:52 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCs020921; Tue, 2 Aug 2016 11:42:51 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 5/8] mkfs: add a check for conflicting values Date: Tue, 2 Aug 2016 17:42:16 +0200 X-ASG-Orig-Subj: [PATCH 5/8] mkfs: add a check for conflicting values Message-Id: <1470152539-18759-6-git-send-email-jtulak@redhat.com> In-Reply-To: <1470152539-18759-1-git-send-email-jtulak@redhat.com> References: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 02 Aug 2016 15:42:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152572 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2971 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add a check that reports a conflict only when subopts are mixed with specific values. Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index b2fbc58..6f3f278 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1289,18 +1289,18 @@ illegal_option( */ static void check_opt( - struct opt_params *opts, + struct opt_params *opt, int index, bool str_seen) { - struct subopt_param *sp = &opts->subopt_params[index]; + struct subopt_param *sp = &opt->subopt_params[index]; int i; if (sp->index != index) { fprintf(stderr, ("Developer screwed up option parsing (%d/%d)! Please report!\n"), sp->index, index); - reqval(opts->name, (char **)opts->subopts, index); + reqval(opt->name, (char **)opt->subopts, index); } /* @@ -1313,11 +1313,11 @@ check_opt( */ if (!str_seen) { if (sp->seen) - respec(opts->name, (char **)opts->subopts, index); + respec(opt->name, (char **)opt->subopts, index); sp->seen = true; } else { if (sp->str_seen) - respec(opts->name, (char **)opts->subopts, index); + respec(opt->name, (char **)opt->subopts, index); sp->str_seen = true; } @@ -1327,10 +1327,44 @@ check_opt( if (conflict_opt.opt == LAST_CONFLICT) break; - if (opts->subopt_params[conflict_opt.subopt].seen || - opts->subopt_params[conflict_opt.subopt].str_seen) - conflict(opts->name, (char **)opts->subopts, + if (conflict_opt.test_values) + break; + if (opt->subopt_params[conflict_opt.subopt].seen || + opt->subopt_params[conflict_opt.subopt].str_seen) { + conflict(opt->name, (char **)opt->subopts, conflict_opt.subopt, index); + } + } +} + +/* + * Check for conflict values between options. + */ +static void +check_opt_value( + struct opt_params *opt, + int index, + long long value) +{ + struct subopt_param *sp = &opt->subopt_params[index]; + int i; + + /* check for conflicts with the option */ + for (i = 0; i < MAX_CONFLICTS; i++) { + struct subopt_conflict conflict_opt = sp->conflicts[i]; + + if (conflict_opt.opt == LAST_CONFLICT) + break; + if (!conflict_opt.test_values) + break; + if ((opt->subopt_params[conflict_opt.subopt].seen || + opt->subopt_params[conflict_opt.subopt].str_seen) && + opt->subopt_params[conflict_opt.subopt].value + == conflict_opt.invalid_value && + value == conflict_opt.at_value) { + conflict(opt->name, (char **)opt->subopts, + conflict_opt.subopt, index); + } } } @@ -1377,6 +1411,8 @@ getnum( illegal_option(str, opts, index, NULL); } + check_opt_value(opts, index, c); + /* Validity check the result. */ if (c < sp->minval) illegal_option(str, opts, index, _("value is too small")); -- 2.5.5 From jtulak@redhat.com Tue Aug 2 10:42:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C47E57CA4 for ; Tue, 2 Aug 2016 10:42:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27ADEAC003 for ; Tue, 2 Aug 2016 08:42:52 -0700 (PDT) X-ASG-Debug-ID: 1470152570-0bf57c13672eff70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kLFy2oW0ArBBFrCp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:50 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2CACC85367 for ; Tue, 2 Aug 2016 15:42:50 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCq020921; Tue, 2 Aug 2016 11:42:49 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 3/8] mkfs: extend opt_params with a value field Date: Tue, 2 Aug 2016 17:42:14 +0200 X-ASG-Orig-Subj: [PATCH 3/8] mkfs: extend opt_params with a value field Message-Id: <1470152539-18759-4-git-send-email-jtulak@redhat.com> In-Reply-To: <1470152539-18759-1-git-send-email-jtulak@redhat.com> References: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 02 Aug 2016 15:42:50 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152570 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12616 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add a new field into opt_params: value, which is filled with user input. Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 4741522..14cf7dd 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -115,6 +115,12 @@ unsigned int sectorsize; * sets what is used with simple specifying the subopt (-d file). * A special SUBOPT_NEEDS_VAL can be used to require a user-given * value in any case. + * + * value INTERNAL + * Do not set this on initialization. Use defaultval for what you want + * to do. This is filled with user input and anything you write here now + * is overwritten. (If the user input is a string and not a number, this + * value is set to a positive non-zero number.) */ struct opt_params { int index; @@ -131,6 +137,7 @@ struct opt_params { long long minval; long long maxval; long long defaultval; + long long value; } subopt_params[MAX_SUBOPTS]; } opts[MAX_OPTS] = { #define OPT_B 0 @@ -1543,12 +1550,20 @@ main( B_LOG); blocksize = 1 << blocklog; blflag = 1; + opts[OPT_B].subopt_params[B_LOG].value = + blocklog; + opts[OPT_B].subopt_params[B_SIZE].value = + blocksize; break; case B_SIZE: blocksize = getnum(value, &opts[OPT_B], B_SIZE); blocklog = libxfs_highbit32(blocksize); bsflag = 1; + opts[OPT_B].subopt_params[B_LOG].value = + blocklog; + opts[OPT_B].subopt_params[B_SIZE].value = + blocksize; break; default: unknown('b', value); @@ -1567,47 +1582,70 @@ main( agcount = getnum(value, &opts[OPT_D], D_AGCOUNT); daflag = 1; + opts[OPT_D].subopt_params[D_AGCOUNT].value = + agcount; break; case D_AGSIZE: agsize = getnum(value, &opts[OPT_D], D_AGSIZE); dasize = 1; + opts[OPT_D].subopt_params[D_AGSIZE].value = + agsize; break; case D_FILE: xi.disfile = getnum(value, &opts[OPT_D], D_FILE); + opts[OPT_D].subopt_params[D_FILE].value = + xi.disfile; break; case D_NAME: xi.dname = getstr(value, &opts[OPT_D], D_NAME); + opts[OPT_D].subopt_params[D_NAME].value = 1; break; case D_SIZE: dbytes = getnum(value, &opts[OPT_D], D_SIZE); + opts[OPT_D].subopt_params[D_SIZE].value = + dbytes; break; case D_SUNIT: dsunit = getnum(value, &opts[OPT_D], D_SUNIT); + opts[OPT_D].subopt_params[D_SUNIT].value = + dsunit; break; case D_SWIDTH: dswidth = getnum(value, &opts[OPT_D], D_SWIDTH); + opts[OPT_D].subopt_params[D_SWIDTH].value = + dswidth; break; case D_SU: dsu = getnum(value, &opts[OPT_D], D_SU); + opts[OPT_D].subopt_params[D_SU].value = + dsu; break; case D_SW: dsw = getnum(value, &opts[OPT_D], D_SW); + opts[OPT_D].subopt_params[D_SW].value = + dsw; break; case D_NOALIGN: nodsflag = getnum(value, &opts[OPT_D], D_NOALIGN); + opts[OPT_D].subopt_params[D_NOALIGN].value = + nodsflag; break; case D_SECTLOG: sectorlog = getnum(value, &opts[OPT_D], D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; + opts[OPT_D].subopt_params[D_SECTSIZE].value = + sectorsize; + opts[OPT_D].subopt_params[D_SECTLOG].value = + sectorlog; break; case D_SECTSIZE: sectorsize = getnum(value, &opts[OPT_D], @@ -1615,6 +1653,10 @@ main( sectorlog = libxfs_highbit32(sectorsize); ssflag = 1; + opts[OPT_D].subopt_params[D_SECTSIZE].value = + sectorsize; + opts[OPT_D].subopt_params[D_SECTLOG].value = + sectorlog; break; case D_RTINHERIT: c = getnum(value, &opts[OPT_D], @@ -1622,18 +1664,24 @@ main( if (c) fsx.fsx_xflags |= XFS_DIFLAG_RTINHERIT; + opts[OPT_D].subopt_params[D_RTINHERIT].value = + c; break; case D_PROJINHERIT: fsx.fsx_projid = getnum(value, &opts[OPT_D], D_PROJINHERIT); fsx.fsx_xflags |= XFS_DIFLAG_PROJINHERIT; + opts[OPT_D].subopt_params[D_PROJINHERIT].value = + fsx.fsx_projid; break; case D_EXTSZINHERIT: fsx.fsx_extsize = getnum(value, &opts[OPT_D], D_EXTSZINHERIT); fsx.fsx_xflags |= XFS_DIFLAG_EXTSZINHERIT; + opts[OPT_D].subopt_params[D_EXTSZINHERIT].value = + fsx.fsx_extsize; break; default: unknown('d', value); @@ -1652,43 +1700,64 @@ main( sb_feat.inode_align = getnum(value, &opts[OPT_I], I_ALIGN); + opts[OPT_I].subopt_params[I_ALIGN].value = + sb_feat.inode_align; break; case I_LOG: inodelog = getnum(value, &opts[OPT_I], I_LOG); isize = 1 << inodelog; ilflag = 1; + opts[OPT_I].subopt_params[I_SIZE].value = + isize; + opts[OPT_I].subopt_params[I_LOG].value = + inodelog; break; case I_MAXPCT: imaxpct = getnum(value, &opts[OPT_I], I_MAXPCT); imflag = 1; + opts[OPT_I].subopt_params[I_MAXPCT].value = + imaxpct; break; case I_PERBLOCK: inopblock = getnum(value, &opts[OPT_I], I_PERBLOCK); ipflag = 1; + opts[OPT_I].subopt_params[I_PERBLOCK].value = + inopblock; break; case I_SIZE: isize = getnum(value, &opts[OPT_I], I_SIZE); inodelog = libxfs_highbit32(isize); isflag = 1; + opts[OPT_I].subopt_params[I_SIZE].value = + isize; + opts[OPT_I].subopt_params[I_LOG].value = + inodelog; break; case I_ATTR: sb_feat.attr_version = + getnum(value, &opts[OPT_I], I_ATTR); + opts[OPT_I].subopt_params[I_ATTR].value = + sb_feat.attr_version; break; case I_PROJID32BIT: sb_feat.projid16bit = !getnum(value, &opts[OPT_I], I_PROJID32BIT); + opts[OPT_I].subopt_params[I_PROJID32BIT].value = + sb_feat.projid16bit; break; case I_SPINODES: sb_feat.spinodes = getnum(value, &opts[OPT_I], I_SPINODES); + opts[OPT_I].subopt_params[I_SPINODES].value = + sb_feat.spinodes; break; default: unknown('i', value); @@ -1707,24 +1776,34 @@ main( logagno = getnum(value, &opts[OPT_L], L_AGNUM); laflag = 1; + opts[OPT_L].subopt_params[L_AGNUM].value = + logagno; break; case L_FILE: xi.lisfile = getnum(value, &opts[OPT_L], L_FILE); + opts[OPT_L].subopt_params[L_FILE].value = + xi.lisfile; break; case L_INTERNAL: loginternal = getnum(value, &opts[OPT_L], L_INTERNAL); liflag = 1; + opts[OPT_L].subopt_params[L_INTERNAL].value = + loginternal; break; case L_SU: lsu = getnum(value, &opts[OPT_L], L_SU); lsuflag = 1; + opts[OPT_L].subopt_params[L_SU].value = + lsu; break; case L_SUNIT: lsunit = getnum(value, &opts[OPT_L], L_SUNIT); lsunitflag = 1; + opts[OPT_L].subopt_params[L_SUNIT].value = + lsunit; break; case L_NAME: case L_DEV: @@ -1733,22 +1812,32 @@ main( xi.logname = logfile; ldflag = 1; loginternal = 0; + opts[OPT_L].subopt_params[L_NAME].value = 1; + opts[OPT_L].subopt_params[L_DEV].value = 1; break; case L_VERSION: sb_feat.log_version = getnum(value, &opts[OPT_L], L_VERSION); lvflag = 1; + opts[OPT_L].subopt_params[L_VERSION].value = + sb_feat.log_version; break; case L_SIZE: logbytes = getnum(value, &opts[OPT_L], L_SIZE); + opts[OPT_L].subopt_params[L_SIZE].value = + logbytes; break; case L_SECTLOG: lsectorlog = getnum(value, &opts[OPT_L], L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; + opts[OPT_L].subopt_params[L_SECTSIZE].value = + lsectorsize; + opts[OPT_L].subopt_params[L_SECTLOG].value = + lsectorlog; break; case L_SECTSIZE: lsectorsize = getnum(value, &opts[OPT_L], @@ -1756,11 +1845,17 @@ main( lsectorlog = libxfs_highbit32(lsectorsize); lssflag = 1; + opts[OPT_L].subopt_params[L_SECTSIZE].value = + lsectorsize; + opts[OPT_L].subopt_params[L_SECTLOG].value = + lsectorlog; break; case L_LAZYSBCNTR: sb_feat.lazy_sb_counters = getnum(value, &opts[OPT_L], L_LAZYSBCNTR); + opts[OPT_L].subopt_params[L_LAZYSBCNTR].value = + sb_feat.lazy_sb_counters; break; default: unknown('l', value); @@ -1786,10 +1881,14 @@ main( M_CRC); if (sb_feat.crcs_enabled) sb_feat.dirftype = true; + opts[OPT_M].subopt_params[M_CRC].value = + sb_feat.crcs_enabled; break; case M_FINOBT: sb_feat.finobt = getnum( value, &opts[OPT_M], M_FINOBT); + opts[OPT_M].subopt_params[M_FINOBT].value = + sb_feat.finobt; break; case M_UUID: if (!value || *value == '\0') @@ -1797,6 +1896,7 @@ main( if (platform_uuid_parse(value, &uuid)) illegal(optarg, "m uuid"); break; + opts[OPT_M].subopt_params[M_UUID].value = 1; default: unknown('m', value); } @@ -1815,6 +1915,10 @@ main( N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; + opts[OPT_N].subopt_params[N_SIZE].value = + dirblocksize; + opts[OPT_N].subopt_params[N_LOG].value = + dirblocklog; break; case N_SIZE: dirblocksize = getnum(value, &opts[OPT_N], @@ -1822,6 +1926,10 @@ main( dirblocklog = libxfs_highbit32(dirblocksize); nsflag = 1; + opts[OPT_N].subopt_params[N_SIZE].value = + dirblocksize; + opts[OPT_N].subopt_params[N_LOG].value = + dirblocklog; break; case N_VERSION: value = getstr(value, &opts[OPT_N], @@ -1835,10 +1943,14 @@ main( N_VERSION); } nvflag = 1; + opts[OPT_N].subopt_params[N_VERSION].value = + sb_feat.dir_version; break; case N_FTYPE: sb_feat.dirftype = getnum(value, &opts[OPT_N], N_FTYPE); + opts[OPT_N].subopt_params[N_FTYPE].value = + sb_feat.dirftype; break; default: unknown('n', value); @@ -1870,23 +1982,33 @@ main( case R_EXTSIZE: rtextbytes = getnum(value, &opts[OPT_R], R_EXTSIZE); + opts[OPT_R].subopt_params[R_EXTSIZE].value = + rtextbytes; break; case R_FILE: xi.risfile = getnum(value, &opts[OPT_R], R_FILE); + opts[OPT_R].subopt_params[R_FILE].value = + xi.risfile; break; case R_NAME: case R_DEV: xi.rtname = getstr(value, &opts[OPT_R], R_NAME); + opts[OPT_R].subopt_params[R_NAME].value = 1; + opts[OPT_R].subopt_params[R_DEV].value = 1; break; case R_SIZE: rtbytes = getnum(value, &opts[OPT_R], R_SIZE); + opts[OPT_R].subopt_params[R_SIZE].value = + rtbytes; break; case R_NOALIGN: norsflag = getnum(value, &opts[OPT_R], R_NOALIGN); + opts[OPT_R].subopt_params[R_NOALIGN].value = + norsflag; break; default: unknown('r', value); @@ -1912,6 +2034,10 @@ main( sectorsize = 1 << sectorlog; lsectorsize = sectorsize; lslflag = slflag = 1; + opts[OPT_S].subopt_params[S_LOG].value = + sectorsize; + opts[OPT_S].subopt_params[S_SECTLOG].value = + sectorsize; break; case S_SIZE: case S_SECTSIZE: @@ -1925,6 +2051,10 @@ main( libxfs_highbit32(sectorsize); lsectorlog = sectorlog; lssflag = ssflag = 1; + opts[OPT_S].subopt_params[S_SIZE].value = + sectorlog; + opts[OPT_S].subopt_params[S_SECTSIZE].value = + sectorlog; break; default: unknown('s', value); -- 2.5.5 From jtulak@redhat.com Tue Aug 2 10:42:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1805B7CAE for ; Tue, 2 Aug 2016 10:42:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DCDB68F8039 for ; Tue, 2 Aug 2016 08:42:53 -0700 (PDT) X-ASG-Debug-ID: 1470152571-0bf57b369e350260001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QUPTXJ5bvowKeV8Z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:51 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 207E885364 for ; Tue, 2 Aug 2016 15:42:51 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCr020921; Tue, 2 Aug 2016 11:42:50 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 4/8] mkfs: change conflicts array into a table capable of cross-option addressing Date: Tue, 2 Aug 2016 17:42:15 +0200 X-ASG-Orig-Subj: [PATCH 4/8] mkfs: change conflicts array into a table capable of cross-option addressing Message-Id: <1470152539-18759-5-git-send-email-jtulak@redhat.com> In-Reply-To: <1470152539-18759-1-git-send-email-jtulak@redhat.com> References: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 02 Aug 2016 15:42:51 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152571 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 17343 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Change subopt_param.conflicts from array of integers into array of structures. This prepares the ground for more universal conflict detection in future patches. Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 239 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 127 insertions(+), 112 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 14cf7dd..b2fbc58 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -93,8 +93,16 @@ unsigned int sectorsize; * * conflicts MANDATORY * If your subopt is in a conflict with some other option, specify it. - * Accepts the .index values of the conflicting subopts and the last - * member of this list has to be LAST_CONFLICT. + * Accepts the .index values of the conflicting subopt as .opt (e.g. OPT_D) + * and .subopt (e.g. D_FILE). If .test_values is true, then the conflict + * is raised only when the "remote" suboption .value is equal to + * .invalid_value field and the "current" suboption has .value equal to + * .at_value. + * If .test_values is false, a conflict is raised when the suboption appears + * on the CLI, no matter its value. The field .message contains an optional + * explanatory string for the user. This string can't be translated here, + * so it has to be enveloped with _() when printed. + * The last member of this list has to be {LAST_CONFLICT}. * * minval, maxval OPTIONAL * These options are used for automatic range check and they have to be @@ -133,7 +141,14 @@ struct opt_params { bool str_seen; bool convert; bool is_power_2; - int conflicts[MAX_CONFLICTS]; + struct subopt_conflict { + int opt; + int subopt; + bool test_values; + long long invalid_value; + long long at_value; + const char *message; + } conflicts [MAX_CONFLICTS]; long long minval; long long maxval; long long defaultval; @@ -153,8 +168,8 @@ struct opt_params { }, .subopt_params = { { .index = B_LOG, - .conflicts = { B_SIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_B, B_SIZE, false, 0, 0}, + {LAST_CONFLICT} }, .minval = XFS_MIN_BLOCKSIZE_LOG, .maxval = XFS_MAX_BLOCKSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, @@ -162,8 +177,8 @@ struct opt_params { { .index = B_SIZE, .convert = true, .is_power_2 = true, - .conflicts = { B_LOG, - LAST_CONFLICT }, + .conflicts = { {OPT_B, B_LOG, false, 0, 0}, + {LAST_CONFLICT} }, .minval = XFS_MIN_BLOCKSIZE, .maxval = XFS_MAX_BLOCKSIZE, .defaultval = SUBOPT_NEEDS_VAL, @@ -209,84 +224,84 @@ struct opt_params { }, .subopt_params = { { .index = D_AGCOUNT, - .conflicts = { D_AGSIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_AGSIZE, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 1, .maxval = XFS_MAX_AGNUMBER, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_FILE, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = D_NAME, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SIZE, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .convert = true, .minval = XFS_AG_MIN_BYTES, .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SUNIT, - .conflicts = { D_NOALIGN, - D_SU, - D_SW, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_NOALIGN, false, 0, 0}, + {OPT_D, D_SU, false, 0, 0}, + {OPT_D, D_SW, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SWIDTH, - .conflicts = { D_NOALIGN, - D_SU, - D_SW, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_NOALIGN, false, 0, 0}, + {OPT_D, D_SU, false, 0, 0}, + {OPT_D, D_SW, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_AGSIZE, - .conflicts = { D_AGCOUNT, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_AGCOUNT, false, 0, 0}, + {LAST_CONFLICT} }, .convert = true, .minval = XFS_AG_MIN_BYTES, .maxval = XFS_AG_MAX_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SU, - .conflicts = { D_NOALIGN, - D_SUNIT, - D_SWIDTH, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_NOALIGN, false, 0, 0}, + {OPT_D, D_SUNIT, false, 0, 0}, + {OPT_D, D_SWIDTH, false, 0, 0}, + {LAST_CONFLICT} }, .convert = true, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SW, - .conflicts = { D_NOALIGN, - D_SUNIT, - D_SWIDTH, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_NOALIGN, false, 0, 0}, + {OPT_D, D_SUNIT, false, 0, 0}, + {OPT_D, D_SWIDTH, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTLOG, - .conflicts = { D_SECTSIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_SECTSIZE, false, 0, 0}, + {LAST_CONFLICT} }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_SECTSIZE, - .conflicts = { D_SECTLOG, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_SECTLOG, false, 0, 0}, + {LAST_CONFLICT} }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -294,29 +309,29 @@ struct opt_params { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_NOALIGN, - .conflicts = { D_SU, - D_SW, - D_SUNIT, - D_SWIDTH, - LAST_CONFLICT }, + .conflicts = { {OPT_D, D_SU, false, 0, 0}, + {OPT_D, D_SW, false, 0, 0}, + {OPT_D, D_SUNIT, false, 0, 0}, + {OPT_D, D_SWIDTH, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = D_RTINHERIT, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 1, .maxval = 1, .defaultval = 1, }, { .index = D_PROJINHERIT, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = D_EXTSZINHERIT, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, @@ -348,57 +363,57 @@ struct opt_params { }, .subopt_params = { { .index = I_ALIGN, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = I_LOG, - .conflicts = { I_PERBLOCK, - I_SIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_I, I_PERBLOCK, false, 0, 0}, + {OPT_I, I_SIZE, false, 0, 0}, + {LAST_CONFLICT} }, .minval = XFS_DINODE_MIN_LOG, .maxval = XFS_DINODE_MAX_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_MAXPCT, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 100, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PERBLOCK, - .conflicts = { I_LOG, - I_SIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_I, I_LOG, false, 0, 0}, + {OPT_I, I_SIZE, false, 0, 0}, + {LAST_CONFLICT} }, .is_power_2 = true, .minval = XFS_MIN_INODE_PERBLOCK, .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_SIZE, - .conflicts = { I_PERBLOCK, - I_LOG, - LAST_CONFLICT }, + .conflicts = { {OPT_I, I_PERBLOCK, false, 0, 0}, + {OPT_I, I_LOG, false, 0, 0}, + {LAST_CONFLICT} }, .is_power_2 = true, .minval = XFS_DINODE_MIN_SIZE, .maxval = XFS_DINODE_MAX_SIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = I_SPINODES, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -438,64 +453,64 @@ struct opt_params { }, .subopt_params = { { .index = L_AGNUM, - .conflicts = { L_DEV, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_DEV, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 0, .maxval = UINT_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_INTERNAL, - .conflicts = { L_FILE, - L_DEV, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_FILE, false, 0, 0}, + {OPT_L, L_DEV, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = L_SIZE, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .convert = true, .minval = 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */ .maxval = XFS_MAX_LOG_BYTES, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 1, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SUNIT, - .conflicts = { L_SU, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_SU, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 1, .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SU, - .conflicts = { L_SUNIT, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_SUNIT, false, 0, 0}, + {LAST_CONFLICT} }, .convert = true, .minval = BBTOB(1), .maxval = XLOG_MAX_RECORD_BSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_DEV, - .conflicts = { L_AGNUM, - L_INTERNAL, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_AGNUM, false, 0, 0}, + {OPT_L, L_INTERNAL, false, 0, 0}, + {LAST_CONFLICT} }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTLOG, - .conflicts = { L_SECTSIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_SECTSIZE, false, 0, 0}, + {LAST_CONFLICT} }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_SECTSIZE, - .conflicts = { L_SECTLOG, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_SECTLOG, false, 0, 0}, + {LAST_CONFLICT} }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -503,20 +518,20 @@ struct opt_params { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_FILE, - .conflicts = { L_INTERNAL, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_INTERNAL, false, 0, 0}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = L_NAME, - .conflicts = { L_AGNUM, - L_INTERNAL, - LAST_CONFLICT }, + .conflicts = { {OPT_L, L_AGNUM, false, 0, 0}, + {OPT_L, L_INTERNAL, false, 0, 0}, + {LAST_CONFLICT} }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_LAZYSBCNTR, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -540,15 +555,15 @@ struct opt_params { }, .subopt_params = { { .index = N_LOG, - .conflicts = { N_SIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_N, N_SIZE, false, 0, 0}, + {LAST_CONFLICT} }, .minval = XFS_MIN_REC_DIRSIZE, .maxval = XFS_MAX_BLOCKSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_SIZE, - .conflicts = { N_LOG, - LAST_CONFLICT }, + .conflicts = { {OPT_N, N_LOG, false, 0, 0}, + {LAST_CONFLICT} }, .convert = true, .is_power_2 = true, .minval = 1 << XFS_MIN_REC_DIRSIZE, @@ -556,13 +571,13 @@ struct opt_params { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_VERSION, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 2, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -590,38 +605,38 @@ struct opt_params { }, .subopt_params = { { .index = R_EXTSIZE, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .convert = true, .minval = XFS_MIN_RTEXTSIZE, .maxval = XFS_MAX_RTEXTSIZE, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_SIZE, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .convert = true, .minval = 0, .maxval = LLONG_MAX, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_DEV, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_FILE, .minval = 0, .maxval = 1, .defaultval = 1, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, }, { .index = R_NAME, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = R_NOALIGN, .minval = 0, .maxval = 1, .defaultval = 1, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, }, }, }, @@ -642,25 +657,25 @@ struct opt_params { }, .subopt_params = { { .index = S_LOG, - .conflicts = { S_SIZE, - S_SECTSIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_S, S_SIZE, false, 0, 0}, + {OPT_S, S_SECTSIZE, false, 0, 0}, + {LAST_CONFLICT} }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTLOG, - .conflicts = { S_SIZE, - S_SECTSIZE, - LAST_CONFLICT }, + .conflicts = { {OPT_S, S_SIZE, false, 0, 0}, + {OPT_S, S_SECTSIZE, false, 0, 0}, + {LAST_CONFLICT} }, .minval = XFS_MIN_SECTORSIZE_LOG, .maxval = XFS_MAX_SECTORSIZE_LOG, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SIZE, - .conflicts = { S_LOG, - S_SECTLOG, - LAST_CONFLICT }, + .conflicts = { {OPT_S, S_LOG, false, 0, 0}, + {OPT_S, S_SECTLOG, false, 0, 0}, + {LAST_CONFLICT} }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -668,9 +683,9 @@ struct opt_params { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = S_SECTSIZE, - .conflicts = { S_LOG, - S_SECTLOG, - LAST_CONFLICT }, + .conflicts = { {OPT_S, S_LOG, false, 0, 0}, + {OPT_S, S_SECTLOG, false, 0, 0}, + {LAST_CONFLICT} }, .convert = true, .is_power_2 = true, .minval = XFS_MIN_SECTORSIZE, @@ -694,19 +709,19 @@ struct opt_params { }, .subopt_params = { { .index = M_CRC, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = M_FINOBT, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = M_UUID, - .conflicts = { LAST_CONFLICT }, + .conflicts = { {LAST_CONFLICT} }, .defaultval = SUBOPT_NEEDS_VAL, }, }, @@ -1308,14 +1323,14 @@ check_opt( /* check for conflicts with the option */ for (i = 0; i < MAX_CONFLICTS; i++) { - int conflict_opt = sp->conflicts[i]; + struct subopt_conflict conflict_opt = sp->conflicts[i]; - if (conflict_opt == LAST_CONFLICT) + if (conflict_opt.opt == LAST_CONFLICT) break; - if (opts->subopt_params[conflict_opt].seen || - opts->subopt_params[conflict_opt].str_seen) + if (opts->subopt_params[conflict_opt.subopt].seen || + opts->subopt_params[conflict_opt.subopt].str_seen) conflict(opts->name, (char **)opts->subopts, - conflict_opt, index); + conflict_opt.subopt, index); } } -- 2.5.5 From jtulak@redhat.com Tue Aug 2 10:42:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 376107CB4 for ; Tue, 2 Aug 2016 10:42:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id ED7AB304039 for ; Tue, 2 Aug 2016 08:42:51 -0700 (PDT) X-ASG-Debug-ID: 1470152568-0bf57b369e350250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id inTKm0jPduq4HdZ7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:48 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1B5963CF for ; Tue, 2 Aug 2016 15:42:48 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCo020921; Tue, 2 Aug 2016 11:42:47 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 1/8] mkfs: remove intermediate getstr followed by getnum Date: Tue, 2 Aug 2016 17:42:12 +0200 X-ASG-Orig-Subj: [PATCH 1/8] mkfs: remove intermediate getstr followed by getnum Message-Id: <1470152539-18759-2-git-send-email-jtulak@redhat.com> In-Reply-To: <1470152539-18759-1-git-send-email-jtulak@redhat.com> References: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 02 Aug 2016 15:42:48 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152568 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9430 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Some options loaded a number as a stringi with getstr and converted it to number with getnum later in the code, without any reason for this approach. (They were probably forgotten in some past cleaning.) This patch changes them to skip the string and use getnum directly in the main option-parsing loop, as do all the other numerical options. Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 88 +++++++++++++++++++++++++-------------------------------- 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 8007dd0..188adb4 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1395,7 +1395,7 @@ main( char *dfile; int dirblocklog; int dirblocksize; - char *dsize; + __uint64_t dbytes; int dsu; int dsw; int dsunit; @@ -1419,7 +1419,7 @@ main( xfs_rfsblock_t logblocks; char *logfile; int loginternal; - char *logsize; + __uint64_t logbytes; xfs_fsblock_t logstart; int lvflag; int lsflag; @@ -1448,11 +1448,11 @@ main( char *protostring; int qflag; xfs_rfsblock_t rtblocks; + __uint64_t rtbytes; xfs_extlen_t rtextblocks; xfs_rtblock_t rtextents; - char *rtextsize; + __uint64_t rtextbytes; char *rtfile; - char *rtsize; xfs_sb_t *sbp; int sectorlog; __uint64_t sector_mask; @@ -1498,7 +1498,8 @@ main( qflag = 0; imaxpct = inodelog = inopblock = isize = 0; dfile = logfile = rtfile = NULL; - dsize = logsize = rtsize = rtextsize = protofile = NULL; + protofile = NULL; + rtbytes = rtextbytes = logbytes = dbytes = 0; dsu = dsw = dsunit = dswidth = lalign = lsu = lsunit = 0; nodsflag = norsflag = 0; force_overwrite = 0; @@ -1564,7 +1565,7 @@ main( xi.dname = getstr(value, &dopts, D_NAME); break; case D_SIZE: - dsize = getstr(value, &dopts, D_SIZE); + dbytes = getnum(value, &dopts, D_SIZE); break; case D_SUNIT: dsunit = getnum(value, &dopts, D_SUNIT); @@ -1711,7 +1712,7 @@ main( lvflag = 1; break; case L_SIZE: - logsize = getstr(value, &lopts, L_SIZE); + logbytes = getnum(value, &lopts, L_SIZE); break; case L_SECTLOG: lsectorlog = getnum(value, &lopts, @@ -1835,8 +1836,7 @@ main( switch (getsubopt(&p, (constpp)subopts, &value)) { case R_EXTSIZE: - rtextsize = getstr(value, &ropts, - R_EXTSIZE); + rtextbytes = getnum(value, &ropts, R_EXTSIZE); break; case R_FILE: xi.risfile = getnum(value, &ropts, @@ -1848,7 +1848,7 @@ main( R_NAME); break; case R_SIZE: - rtsize = getstr(value, &ropts, R_SIZE); + rtbytes = getnum(value, &ropts, R_SIZE); break; case R_NOALIGN: norsflag = getnum(value, &ropts, @@ -1952,14 +1952,14 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), * sector size mismatches between the new filesystem and the underlying * host filesystem. */ - check_device_type(dfile, &xi.disfile, !dsize, !dfile, + check_device_type(dfile, &xi.disfile, !dbytes, !dfile, Nflag ? NULL : &xi.dcreat, force_overwrite, "d"); if (!loginternal) - check_device_type(xi.logname, &xi.lisfile, !logsize, !xi.logname, + check_device_type(xi.logname, &xi.lisfile, !logbytes, !xi.logname, Nflag ? NULL : &xi.lcreat, force_overwrite, "l"); if (xi.rtname) - check_device_type(xi.rtname, &xi.risfile, !rtsize, !xi.rtname, + check_device_type(xi.rtname, &xi.risfile, !rtbytes, !xi.rtname, Nflag ? NULL : &xi.rcreat, force_overwrite, "r"); if (xi.disfile || xi.lisfile || xi.risfile) @@ -2119,10 +2119,7 @@ _("sparse inodes not supported without CRC support\n")); } - if (dsize) { - __uint64_t dbytes; - - dbytes = getnum(dsize, &dopts, D_SIZE); + if (dbytes) { if (dbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal data length %lld, not a multiple of %d\n"), @@ -2151,10 +2148,7 @@ _("sparse inodes not supported without CRC support\n")); usage(); } - if (logsize) { - __uint64_t logbytes; - - logbytes = getnum(logsize, &lopts, L_SIZE); + if (logbytes) { if (logbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal log length %lld, not a multiple of %d\n"), @@ -2168,10 +2162,7 @@ _("sparse inodes not supported without CRC support\n")); (long long)logbytes, blocksize, (long long)(logblocks << blocklog)); } - if (rtsize) { - __uint64_t rtbytes; - - rtbytes = getnum(rtsize, &ropts, R_SIZE); + if (rtbytes) { if (rtbytes % XFS_MIN_BLOCKSIZE) { fprintf(stderr, _("illegal rt length %lld, not a multiple of %d\n"), @@ -2188,10 +2179,7 @@ _("sparse inodes not supported without CRC support\n")); /* * If specified, check rt extent size against its constraints. */ - if (rtextsize) { - __uint64_t rtextbytes; - - rtextbytes = getnum(rtextsize, &ropts, R_EXTSIZE); + if (rtextbytes) { if (rtextbytes % blocksize) { fprintf(stderr, _("illegal rt extent size %lld, not a multiple of %d\n"), @@ -2208,7 +2196,7 @@ _("sparse inodes not supported without CRC support\n")); __uint64_t rswidth; __uint64_t rtextbytes; - if (!norsflag && !xi.risfile && !(!rtsize && xi.disfile)) + if (!norsflag && !xi.risfile && !(!rtbytes && xi.disfile)) rswidth = ft.rtswidth; else rswidth = 0; @@ -2319,15 +2307,15 @@ _("sparse inodes not supported without CRC support\n")); rtfile = _("volume rt"); else if (!xi.rtdev) rtfile = _("none"); - if (dsize && xi.dsize > 0 && dblocks > DTOBT(xi.dsize)) { + if (dbytes && xi.dsize > 0 && dblocks > DTOBT(xi.dsize)) { fprintf(stderr, - _("size %s specified for data subvolume is too large, " + _("size %lld specified for data subvolume is too large, " "maximum is %lld blocks\n"), - dsize, (long long)DTOBT(xi.dsize)); + (long long)dbytes, (long long)DTOBT(xi.dsize)); usage(); - } else if (!dsize && xi.dsize > 0) + } else if (!dbytes && xi.dsize > 0) dblocks = DTOBT(xi.dsize); - else if (!dsize) { + else if (!dbytes) { fprintf(stderr, _("can't get size of data subvolume\n")); usage(); } @@ -2360,22 +2348,22 @@ reported by the device (%u).\n"), reported by the device (%u).\n"), lsectorsize, xi.lbsize); } - if (rtsize && xi.rtsize > 0 && xi.rtbsize > sectorsize) { + if (rtbytes && xi.rtsize > 0 && xi.rtbsize > sectorsize) { fprintf(stderr, _( "Warning: the realtime subvolume sector size %u is less than the sector size\n\ reported by the device (%u).\n"), sectorsize, xi.rtbsize); } - if (rtsize && xi.rtsize > 0 && rtblocks > DTOBT(xi.rtsize)) { + if (rtbytes && xi.rtsize > 0 && rtblocks > DTOBT(xi.rtsize)) { fprintf(stderr, - _("size %s specified for rt subvolume is too large, " + _("size %lld specified for rt subvolume is too large, " "maximum is %lld blocks\n"), - rtsize, (long long)DTOBT(xi.rtsize)); + (long long)rtbytes, (long long)DTOBT(xi.rtsize)); usage(); - } else if (!rtsize && xi.rtsize > 0) + } else if (!rtbytes && xi.rtsize > 0) rtblocks = DTOBT(xi.rtsize); - else if (rtsize && !xi.rtdev) { + else if (rtbytes && !xi.rtdev) { fprintf(stderr, _("size specified for non-existent rt subvolume\n")); usage(); @@ -2578,26 +2566,26 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), sb_feat.log_version, lsunit, sb_feat.finobt); ASSERT(min_logblocks); min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks); - if (!logsize && dblocks >= (1024*1024*1024) >> blocklog) + if (!logbytes && dblocks >= (1024*1024*1024) >> blocklog) min_logblocks = MAX(min_logblocks, XFS_MIN_LOG_BYTES>>blocklog); - if (logsize && xi.logBBsize > 0 && logblocks > DTOBT(xi.logBBsize)) { + if (logbytes && xi.logBBsize > 0 && logblocks > DTOBT(xi.logBBsize)) { fprintf(stderr, -_("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), - logsize, (long long)DTOBT(xi.logBBsize)); +_("size %lld specified for log subvolume is too large, maximum is %lld blocks\n"), + (long long)logbytes, (long long)DTOBT(xi.logBBsize)); usage(); - } else if (!logsize && xi.logBBsize > 0) { + } else if (!logbytes && xi.logBBsize > 0) { logblocks = DTOBT(xi.logBBsize); - } else if (logsize && !xi.logdev && !loginternal) { + } else if (logbytes && !xi.logdev && !loginternal) { fprintf(stderr, _("size specified for non-existent log subvolume\n")); usage(); - } else if (loginternal && logsize && logblocks >= dblocks) { + } else if (loginternal && logbytes && logblocks >= dblocks) { fprintf(stderr, _("size %lld too large for internal log\n"), (long long)logblocks); usage(); } else if (!loginternal && !xi.logdev) { logblocks = 0; - } else if (loginternal && !logsize) { + } else if (loginternal && !logbytes) { if (dblocks < GIGABYTES(1, blocklog)) { /* tiny filesystems get minimum sized logs. */ @@ -2661,7 +2649,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), * Readjust the log size to fit within an AG if it was sized * automatically. */ - if (!logsize) { + if (!logbytes) { logblocks = MIN(logblocks, XFS_ALLOC_AG_MAX_USABLE(mp)); -- 2.5.5 From jtulak@redhat.com Tue Aug 2 10:42:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 560937CB5 for ; Tue, 2 Aug 2016 10:42:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 267248F8037 for ; Tue, 2 Aug 2016 08:42:55 -0700 (PDT) X-ASG-Debug-ID: 1470152573-0bf57b369e350270001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id x2tvPwBHMky37wY5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:53 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1BFFE83F47 for ; Tue, 2 Aug 2016 15:42:53 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCt020921; Tue, 2 Aug 2016 11:42:52 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 6/8] mkfs: add cross-section conflict checks Date: Tue, 2 Aug 2016 17:42:17 +0200 X-ASG-Orig-Subj: [PATCH 6/8] mkfs: add cross-section conflict checks Message-Id: <1470152539-18759-7-git-send-email-jtulak@redhat.com> In-Reply-To: <1470152539-18759-1-git-send-email-jtulak@redhat.com> References: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 02 Aug 2016 15:42:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152573 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2902 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Checks are modified to work with cross-section conflicts (data, metada, log, ...). Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 6f3f278..2eca989 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -728,6 +728,9 @@ struct opt_params { }, }; +static void conflict_struct(struct opt_params *opt, struct subopt_param *subopt, + struct subopt_conflict *conflict); + #define TERABYTES(count, blog) ((__uint64_t)(count) << (40 - (blog))) #define GIGABYTES(count, blog) ((__uint64_t)(count) << (30 - (blog))) #define MEGABYTES(count, blog) ((__uint64_t)(count) << (20 - (blog))) @@ -1329,10 +1332,9 @@ check_opt( break; if (conflict_opt.test_values) break; - if (opt->subopt_params[conflict_opt.subopt].seen || - opt->subopt_params[conflict_opt.subopt].str_seen) { - conflict(opt->name, (char **)opt->subopts, - conflict_opt.subopt, index); + if (opts[conflict_opt.opt].subopt_params[conflict_opt.subopt].seen || + opts[conflict_opt.opt].subopt_params[conflict_opt.subopt].str_seen) { + conflict_struct(opt, sp, &conflict_opt); } } } @@ -1357,13 +1359,12 @@ check_opt_value( break; if (!conflict_opt.test_values) break; - if ((opt->subopt_params[conflict_opt.subopt].seen || - opt->subopt_params[conflict_opt.subopt].str_seen) && - opt->subopt_params[conflict_opt.subopt].value + if ((opts[conflict_opt.opt].subopt_params[conflict_opt.subopt].seen || + opts[conflict_opt.opt].subopt_params[conflict_opt.subopt].str_seen) && + opts[conflict_opt.opt].subopt_params[conflict_opt.subopt].value == conflict_opt.invalid_value && value == conflict_opt.at_value) { - conflict(opt->name, (char **)opt->subopts, - conflict_opt.subopt, index); + conflict_struct(opt, sp, &conflict_opt); } } } @@ -3430,12 +3431,36 @@ conflict( char *tab[], int oldidx, int newidx) + { fprintf(stderr, _("Cannot specify both -%c %s and -%c %s\n"), opt, tab[oldidx], opt, tab[newidx]); usage(); } +static void +conflict_struct( + struct opt_params *opt, + struct subopt_param *subopt, + struct subopt_conflict *conflict) +{ + if(conflict->message) { + fprintf(stderr, _("Cannot specify both -%c %s and -%c %s: %s\n"), + opt->name, + opt->subopts[subopt->index], + opts[conflict->opt].name, + opts[conflict->opt].subopts[conflict->subopt], + _(conflict->message)); + } else { + fprintf(stderr, _("Cannot specify both -%c %s and -%c %s\n"), + opt->name, + opt->subopts[subopt->index], + opts[conflict->opt].name, + opts[conflict->opt].subopts[conflict->subopt]); + } + usage(); +} + static void illegal( -- 2.5.5 From jtulak@redhat.com Tue Aug 2 10:42:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 386947CBD for ; Tue, 2 Aug 2016 10:42:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0B3CB8F8037 for ; Tue, 2 Aug 2016 08:42:56 -0700 (PDT) X-ASG-Debug-ID: 1470152574-0bf57b369c350270001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gtPE6wITbZFEr2sR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:54 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 022B061E40 for ; Tue, 2 Aug 2016 15:42:54 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCu020921; Tue, 2 Aug 2016 11:42:53 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 7/8] mkfs: Move opts related #define to one place Date: Tue, 2 Aug 2016 17:42:18 +0200 X-ASG-Orig-Subj: [PATCH 7/8] mkfs: Move opts related #define to one place Message-Id: <1470152539-18759-8-git-send-email-jtulak@redhat.com> In-Reply-To: <1470152539-18759-1-git-send-email-jtulak@redhat.com> References: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 02 Aug 2016 15:42:54 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152574 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5371 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Takes all the "#define M_CRC x" from struct opt_params declaration and moves them into a single place before the struct. This is because we need to cross-link conflicts and we can't link -l version to -m crc if M_CRC is defined after the conflict section. Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 134 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 72 insertions(+), 62 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 2eca989..91c7fee 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -48,6 +48,78 @@ unsigned int sectorsize; #define MAX_CONFLICTS 8 #define LAST_CONFLICT (-1) +#define OPT_B 0 +#define B_LOG 0 +#define B_SIZE 1 + +#define OPT_D 1 +#define D_AGCOUNT 0 +#define D_FILE 1 +#define D_NAME 2 +#define D_SIZE 3 +#define D_SUNIT 4 +#define D_SWIDTH 5 +#define D_AGSIZE 6 +#define D_SU 7 +#define D_SW 8 +#define D_SECTLOG 9 +#define D_SECTSIZE 10 +#define D_NOALIGN 11 +#define D_RTINHERIT 12 +#define D_PROJINHERIT 13 +#define D_EXTSZINHERIT 14 + + +#define OPT_I 2 +#define I_ALIGN 0 +#define I_LOG 1 +#define I_MAXPCT 2 +#define I_PERBLOCK 3 +#define I_SIZE 4 +#define I_ATTR 5 +#define I_PROJID32BIT 6 +#define I_SPINODES 7 + +#define OPT_L 3 +#define L_AGNUM 0 +#define L_INTERNAL 1 +#define L_SIZE 2 +#define L_VERSION 3 +#define L_SUNIT 4 +#define L_SU 5 +#define L_DEV 6 +#define L_SECTLOG 7 +#define L_SECTSIZE 8 +#define L_FILE 9 +#define L_NAME 10 +#define L_LAZYSBCNTR 11 + + +#define OPT_N 4 +#define N_LOG 0 +#define N_SIZE 1 +#define N_VERSION 2 +#define N_FTYPE 3 + +#define OPT_R 5 +#define R_EXTSIZE 0 +#define R_SIZE 1 +#define R_DEV 2 +#define R_FILE 3 +#define R_NAME 4 +#define R_NOALIGN 5 + +#define OPT_S 6 +#define S_LOG 0 +#define S_SECTLOG 1 +#define S_SIZE 2 +#define S_SECTSIZE 3 + +#define OPT_M 7 +#define M_CRC 0 +#define M_FINOBT 1 +#define M_UUID 2 + /* * Table for parsing mkfs parameters. * @@ -155,14 +227,11 @@ struct opt_params { long long value; } subopt_params[MAX_SUBOPTS]; } opts[MAX_OPTS] = { -#define OPT_B 0 { .index = OPT_B, .name = 'b', .subopts = { -#define B_LOG 0 "log", -#define B_SIZE 1 "size", NULL }, @@ -185,40 +254,24 @@ struct opt_params { }, }, }, -#define OPT_D 1 { .index = OPT_D, .name = 'd', .subopts = { - #define D_AGCOUNT 0 "agcount", - #define D_FILE 1 "file", - #define D_NAME 2 "name", - #define D_SIZE 3 "size", - #define D_SUNIT 4 "sunit", - #define D_SWIDTH 5 "swidth", - #define D_AGSIZE 6 "agsize", - #define D_SU 7 "su", - #define D_SW 8 "sw", - #define D_SECTLOG 9 "sectlog", - #define D_SECTSIZE 10 "sectsize", - #define D_NOALIGN 11 "noalign", - #define D_RTINHERIT 12 "rtinherit", - #define D_PROJINHERIT 13 "projinherit", - #define D_EXTSZINHERIT 14 "extszinherit", NULL }, @@ -338,26 +391,17 @@ struct opt_params { }, }, }, -#define OPT_I 2 { .index = OPT_I, .name = 'i', .subopts = { -#define I_ALIGN 0 "align", -#define I_LOG 1 "log", -#define I_MAXPCT 2 "maxpct", -#define I_PERBLOCK 3 "perblock", -#define I_SIZE 4 "size", -#define I_ATTR 5 "attr", -#define I_PROJID32BIT 6 "projid32bit", -#define I_SPINODES 7 "sparse", NULL }, @@ -420,34 +464,21 @@ struct opt_params { }, }, }, -#define OPT_L 3 { .index = OPT_L, .name = 'l', .subopts = { - #define L_AGNUM 0 "agnum", - #define L_INTERNAL 1 "internal", - #define L_SIZE 2 "size", - #define L_VERSION 3 "version", - #define L_SUNIT 4 "sunit", - #define L_SU 5 "su", - #define L_DEV 6 "logdev", - #define L_SECTLOG 7 "sectlog", - #define L_SECTSIZE 8 "sectsize", - #define L_FILE 9 "file", - #define L_NAME 10 "name", - #define L_LAZYSBCNTR 11 "lazy-count", NULL }, @@ -538,18 +569,13 @@ struct opt_params { }, }, }, -#define OPT_N 4 { .index = OPT_N, .name = 'n', .subopts = { - #define N_LOG 0 "log", - #define N_SIZE 1 "size", - #define N_VERSION 2 "version", - #define N_FTYPE 3 "ftype", NULL, }, @@ -584,22 +610,15 @@ struct opt_params { }, }, }, -#define OPT_R 5 { .index = OPT_R, .name = 'r', .subopts = { - #define R_EXTSIZE 0 "extsize", - #define R_SIZE 1 "size", - #define R_DEV 2 "rtdev", - #define R_FILE 3 "file", - #define R_NAME 4 "name", - #define R_NOALIGN 5 "noalign", NULL }, @@ -640,18 +659,13 @@ struct opt_params { }, }, }, -#define OPT_S 6 { .index = OPT_S, .name = 's', .subopts = { - #define S_LOG 0 "log", - #define S_SECTLOG 1 "sectlog", - #define S_SIZE 2 "size", - #define S_SECTSIZE 3 "sectsize", NULL }, @@ -694,16 +708,12 @@ struct opt_params { }, }, }, -#define OPT_M 7 { .index = OPT_M, .name = 'm', .subopts = { - #define M_CRC 0 "crc", - #define M_FINOBT 1 "finobt", - #define M_UUID 2 "uuid", NULL }, -- 2.5.5 From jtulak@redhat.com Tue Aug 2 10:42:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6CA427CA6 for ; Tue, 2 Aug 2016 10:42:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3EE6A304032 for ; Tue, 2 Aug 2016 08:42:54 -0700 (PDT) X-ASG-Debug-ID: 1470152569-0bf57b369c350250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tGAG7FCZk1BTw1x4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:49 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3B9B0C05786F for ; Tue, 2 Aug 2016 15:42:49 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCp020921; Tue, 2 Aug 2016 11:42:48 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 2/8] mkfs: merge tables for opts parsing into one table Date: Tue, 2 Aug 2016 17:42:13 +0200 X-ASG-Orig-Subj: [PATCH 2/8] mkfs: merge tables for opts parsing into one table Message-Id: <1470152539-18759-3-git-send-email-jtulak@redhat.com> In-Reply-To: <1470152539-18759-1-git-send-email-jtulak@redhat.com> References: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 02 Aug 2016 15:42:49 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152569 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 38517 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Merge separate instances of opt_params into one indexable table. Git makes this patch looks a bit more complicated, but it does not change values or structure of anything else. It only moves all the "struct opt_params dopts = {...}", changes indentation for these substructures and replaces their usage (dopts -> opts[OPT_D]). Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 1214 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 624 insertions(+), 590 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 188adb4..4741522 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -42,6 +42,7 @@ static int ispow2(unsigned int i); unsigned int blocksize; unsigned int sectorsize; +#define MAX_OPTS 16 #define MAX_SUBOPTS 16 #define SUBOPT_NEEDS_VAL (-1LL) #define MAX_CONFLICTS 8 @@ -52,6 +53,10 @@ unsigned int sectorsize; * * Description of the structure members follows: * + * index MANDATORY + * An integer denoting the position of the specific option in opts array, + * counting from 0 up to MAX_OPTS. + * * name MANDATORY * Name is a single char, e.g., for '-d file', name is 'd'. * @@ -112,6 +117,7 @@ unsigned int sectorsize; * value in any case. */ struct opt_params { + int index; const char name; const char *subopts[MAX_SUBOPTS]; @@ -126,568 +132,576 @@ struct opt_params { long long maxval; long long defaultval; } subopt_params[MAX_SUBOPTS]; -}; - -struct opt_params bopts = { - .name = 'b', - .subopts = { +} opts[MAX_OPTS] = { +#define OPT_B 0 + { + .index = OPT_B, + .name = 'b', + .subopts = { #define B_LOG 0 - "log", + "log", #define B_SIZE 1 - "size", - NULL - }, - .subopt_params = { - { .index = B_LOG, - .conflicts = { B_SIZE, - LAST_CONFLICT }, - .minval = XFS_MIN_BLOCKSIZE_LOG, - .maxval = XFS_MAX_BLOCKSIZE_LOG, - .defaultval = SUBOPT_NEEDS_VAL, + "size", + NULL }, - { .index = B_SIZE, - .convert = true, - .is_power_2 = true, - .conflicts = { B_LOG, - LAST_CONFLICT }, - .minval = XFS_MIN_BLOCKSIZE, - .maxval = XFS_MAX_BLOCKSIZE, - .defaultval = SUBOPT_NEEDS_VAL, + .subopt_params = { + { .index = B_LOG, + .conflicts = { B_SIZE, + LAST_CONFLICT }, + .minval = XFS_MIN_BLOCKSIZE_LOG, + .maxval = XFS_MAX_BLOCKSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = B_SIZE, + .convert = true, + .is_power_2 = true, + .conflicts = { B_LOG, + LAST_CONFLICT }, + .minval = XFS_MIN_BLOCKSIZE, + .maxval = XFS_MAX_BLOCKSIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, }, }, -}; - -struct opt_params dopts = { - .name = 'd', - .subopts = { -#define D_AGCOUNT 0 - "agcount", -#define D_FILE 1 - "file", -#define D_NAME 2 - "name", -#define D_SIZE 3 - "size", -#define D_SUNIT 4 - "sunit", -#define D_SWIDTH 5 - "swidth", -#define D_AGSIZE 6 - "agsize", -#define D_SU 7 - "su", -#define D_SW 8 - "sw", -#define D_SECTLOG 9 - "sectlog", -#define D_SECTSIZE 10 - "sectsize", -#define D_NOALIGN 11 - "noalign", -#define D_RTINHERIT 12 - "rtinherit", -#define D_PROJINHERIT 13 - "projinherit", -#define D_EXTSZINHERIT 14 - "extszinherit", - NULL - }, - .subopt_params = { - { .index = D_AGCOUNT, - .conflicts = { D_AGSIZE, - LAST_CONFLICT }, - .minval = 1, - .maxval = XFS_MAX_AGNUMBER, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_FILE, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, - }, - { .index = D_NAME, - .conflicts = { LAST_CONFLICT }, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_SIZE, - .conflicts = { LAST_CONFLICT }, - .convert = true, - .minval = XFS_AG_MIN_BYTES, - .maxval = LLONG_MAX, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_SUNIT, - .conflicts = { D_NOALIGN, - D_SU, - D_SW, - LAST_CONFLICT }, - .minval = 0, - .maxval = UINT_MAX, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_SWIDTH, - .conflicts = { D_NOALIGN, - D_SU, - D_SW, - LAST_CONFLICT }, - .minval = 0, - .maxval = UINT_MAX, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_AGSIZE, - .conflicts = { D_AGCOUNT, - LAST_CONFLICT }, - .convert = true, - .minval = XFS_AG_MIN_BYTES, - .maxval = XFS_AG_MAX_BYTES, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_SU, - .conflicts = { D_NOALIGN, - D_SUNIT, - D_SWIDTH, - LAST_CONFLICT }, - .convert = true, - .minval = 0, - .maxval = UINT_MAX, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_SW, - .conflicts = { D_NOALIGN, - D_SUNIT, - D_SWIDTH, - LAST_CONFLICT }, - .minval = 0, - .maxval = UINT_MAX, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_SECTLOG, - .conflicts = { D_SECTSIZE, - LAST_CONFLICT }, - .minval = XFS_MIN_SECTORSIZE_LOG, - .maxval = XFS_MAX_SECTORSIZE_LOG, - .defaultval = SUBOPT_NEEDS_VAL, +#define OPT_D 1 + { + .index = OPT_D, + .name = 'd', + .subopts = { + #define D_AGCOUNT 0 + "agcount", + #define D_FILE 1 + "file", + #define D_NAME 2 + "name", + #define D_SIZE 3 + "size", + #define D_SUNIT 4 + "sunit", + #define D_SWIDTH 5 + "swidth", + #define D_AGSIZE 6 + "agsize", + #define D_SU 7 + "su", + #define D_SW 8 + "sw", + #define D_SECTLOG 9 + "sectlog", + #define D_SECTSIZE 10 + "sectsize", + #define D_NOALIGN 11 + "noalign", + #define D_RTINHERIT 12 + "rtinherit", + #define D_PROJINHERIT 13 + "projinherit", + #define D_EXTSZINHERIT 14 + "extszinherit", + NULL }, - { .index = D_SECTSIZE, - .conflicts = { D_SECTLOG, - LAST_CONFLICT }, - .convert = true, - .is_power_2 = true, - .minval = XFS_MIN_SECTORSIZE, - .maxval = XFS_MAX_SECTORSIZE, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_NOALIGN, - .conflicts = { D_SU, - D_SW, - D_SUNIT, - D_SWIDTH, - LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, - }, - { .index = D_RTINHERIT, - .conflicts = { LAST_CONFLICT }, - .minval = 1, - .maxval = 1, - .defaultval = 1, - }, - { .index = D_PROJINHERIT, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = UINT_MAX, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = D_EXTSZINHERIT, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = UINT_MAX, - .defaultval = SUBOPT_NEEDS_VAL, + .subopt_params = { + { .index = D_AGCOUNT, + .conflicts = { D_AGSIZE, + LAST_CONFLICT }, + .minval = 1, + .maxval = XFS_MAX_AGNUMBER, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_FILE, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = D_NAME, + .conflicts = { LAST_CONFLICT }, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_SIZE, + .conflicts = { LAST_CONFLICT }, + .convert = true, + .minval = XFS_AG_MIN_BYTES, + .maxval = LLONG_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_SUNIT, + .conflicts = { D_NOALIGN, + D_SU, + D_SW, + LAST_CONFLICT }, + .minval = 0, + .maxval = UINT_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_SWIDTH, + .conflicts = { D_NOALIGN, + D_SU, + D_SW, + LAST_CONFLICT }, + .minval = 0, + .maxval = UINT_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_AGSIZE, + .conflicts = { D_AGCOUNT, + LAST_CONFLICT }, + .convert = true, + .minval = XFS_AG_MIN_BYTES, + .maxval = XFS_AG_MAX_BYTES, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_SU, + .conflicts = { D_NOALIGN, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, + .convert = true, + .minval = 0, + .maxval = UINT_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_SW, + .conflicts = { D_NOALIGN, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, + .minval = 0, + .maxval = UINT_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_SECTLOG, + .conflicts = { D_SECTSIZE, + LAST_CONFLICT }, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_SECTSIZE, + .conflicts = { D_SECTLOG, + LAST_CONFLICT }, + .convert = true, + .is_power_2 = true, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_NOALIGN, + .conflicts = { D_SU, + D_SW, + D_SUNIT, + D_SWIDTH, + LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = D_RTINHERIT, + .conflicts = { LAST_CONFLICT }, + .minval = 1, + .maxval = 1, + .defaultval = 1, + }, + { .index = D_PROJINHERIT, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = UINT_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = D_EXTSZINHERIT, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = UINT_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, }, }, -}; - - -struct opt_params iopts = { - .name = 'i', - .subopts = { +#define OPT_I 2 + { + .index = OPT_I, + .name = 'i', + .subopts = { #define I_ALIGN 0 - "align", + "align", #define I_LOG 1 - "log", + "log", #define I_MAXPCT 2 - "maxpct", + "maxpct", #define I_PERBLOCK 3 - "perblock", + "perblock", #define I_SIZE 4 - "size", + "size", #define I_ATTR 5 - "attr", + "attr", #define I_PROJID32BIT 6 - "projid32bit", + "projid32bit", #define I_SPINODES 7 - "sparse", - NULL - }, - .subopt_params = { - { .index = I_ALIGN, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, + "sparse", + NULL }, - { .index = I_LOG, - .conflicts = { I_PERBLOCK, - I_SIZE, - LAST_CONFLICT }, - .minval = XFS_DINODE_MIN_LOG, - .maxval = XFS_DINODE_MAX_LOG, - .defaultval = SUBOPT_NEEDS_VAL, + .subopt_params = { + { .index = I_ALIGN, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = I_LOG, + .conflicts = { I_PERBLOCK, + I_SIZE, + LAST_CONFLICT }, + .minval = XFS_DINODE_MIN_LOG, + .maxval = XFS_DINODE_MAX_LOG, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = I_MAXPCT, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 100, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = I_PERBLOCK, + .conflicts = { I_LOG, + I_SIZE, + LAST_CONFLICT }, + .is_power_2 = true, + .minval = XFS_MIN_INODE_PERBLOCK, + .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = I_SIZE, + .conflicts = { I_PERBLOCK, + I_LOG, + LAST_CONFLICT }, + .is_power_2 = true, + .minval = XFS_DINODE_MIN_SIZE, + .maxval = XFS_DINODE_MAX_SIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = I_ATTR, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 2, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = I_PROJID32BIT, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = I_SPINODES, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, }, - { .index = I_MAXPCT, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 100, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = I_PERBLOCK, - .conflicts = { I_LOG, - I_SIZE, - LAST_CONFLICT }, - .is_power_2 = true, - .minval = XFS_MIN_INODE_PERBLOCK, - .maxval = XFS_MAX_BLOCKSIZE / XFS_DINODE_MIN_SIZE, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = I_SIZE, - .conflicts = { I_PERBLOCK, - I_LOG, - LAST_CONFLICT }, - .is_power_2 = true, - .minval = XFS_DINODE_MIN_SIZE, - .maxval = XFS_DINODE_MAX_SIZE, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = I_ATTR, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 2, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = I_PROJID32BIT, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, - }, - { .index = I_SPINODES, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, - }, - }, -}; - -struct opt_params lopts = { - .name = 'l', - .subopts = { -#define L_AGNUM 0 - "agnum", -#define L_INTERNAL 1 - "internal", -#define L_SIZE 2 - "size", -#define L_VERSION 3 - "version", -#define L_SUNIT 4 - "sunit", -#define L_SU 5 - "su", -#define L_DEV 6 - "logdev", -#define L_SECTLOG 7 - "sectlog", -#define L_SECTSIZE 8 - "sectsize", -#define L_FILE 9 - "file", -#define L_NAME 10 - "name", -#define L_LAZYSBCNTR 11 - "lazy-count", - NULL }, - .subopt_params = { - { .index = L_AGNUM, - .conflicts = { L_DEV, - LAST_CONFLICT }, - .minval = 0, - .maxval = UINT_MAX, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = L_INTERNAL, - .conflicts = { L_FILE, - L_DEV, - LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, - }, - { .index = L_SIZE, - .conflicts = { LAST_CONFLICT }, - .convert = true, - .minval = 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */ - .maxval = XFS_MAX_LOG_BYTES, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = L_VERSION, - .conflicts = { LAST_CONFLICT }, - .minval = 1, - .maxval = 2, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = L_SUNIT, - .conflicts = { L_SU, - LAST_CONFLICT }, - .minval = 1, - .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = L_SU, - .conflicts = { L_SUNIT, - LAST_CONFLICT }, - .convert = true, - .minval = BBTOB(1), - .maxval = XLOG_MAX_RECORD_BSIZE, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = L_DEV, - .conflicts = { L_AGNUM, - L_INTERNAL, - LAST_CONFLICT }, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = L_SECTLOG, - .conflicts = { L_SECTSIZE, - LAST_CONFLICT }, - .minval = XFS_MIN_SECTORSIZE_LOG, - .maxval = XFS_MAX_SECTORSIZE_LOG, - .defaultval = SUBOPT_NEEDS_VAL, +#define OPT_L 3 + { + .index = OPT_L, + .name = 'l', + .subopts = { + #define L_AGNUM 0 + "agnum", + #define L_INTERNAL 1 + "internal", + #define L_SIZE 2 + "size", + #define L_VERSION 3 + "version", + #define L_SUNIT 4 + "sunit", + #define L_SU 5 + "su", + #define L_DEV 6 + "logdev", + #define L_SECTLOG 7 + "sectlog", + #define L_SECTSIZE 8 + "sectsize", + #define L_FILE 9 + "file", + #define L_NAME 10 + "name", + #define L_LAZYSBCNTR 11 + "lazy-count", + NULL }, - { .index = L_SECTSIZE, - .conflicts = { L_SECTLOG, - LAST_CONFLICT }, - .convert = true, - .is_power_2 = true, - .minval = XFS_MIN_SECTORSIZE, - .maxval = XFS_MAX_SECTORSIZE, - .defaultval = SUBOPT_NEEDS_VAL, + .subopt_params = { + { .index = L_AGNUM, + .conflicts = { L_DEV, + LAST_CONFLICT }, + .minval = 0, + .maxval = UINT_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_INTERNAL, + .conflicts = { L_FILE, + L_DEV, + LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = L_SIZE, + .conflicts = { LAST_CONFLICT }, + .convert = true, + .minval = 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */ + .maxval = XFS_MAX_LOG_BYTES, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_VERSION, + .conflicts = { LAST_CONFLICT }, + .minval = 1, + .maxval = 2, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_SUNIT, + .conflicts = { L_SU, + LAST_CONFLICT }, + .minval = 1, + .maxval = BTOBB(XLOG_MAX_RECORD_BSIZE), + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_SU, + .conflicts = { L_SUNIT, + LAST_CONFLICT }, + .convert = true, + .minval = BBTOB(1), + .maxval = XLOG_MAX_RECORD_BSIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_DEV, + .conflicts = { L_AGNUM, + L_INTERNAL, + LAST_CONFLICT }, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_SECTLOG, + .conflicts = { L_SECTSIZE, + LAST_CONFLICT }, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_SECTSIZE, + .conflicts = { L_SECTLOG, + LAST_CONFLICT }, + .convert = true, + .is_power_2 = true, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_FILE, + .conflicts = { L_INTERNAL, + LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = L_NAME, + .conflicts = { L_AGNUM, + L_INTERNAL, + LAST_CONFLICT }, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = L_LAZYSBCNTR, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, }, - { .index = L_FILE, - .conflicts = { L_INTERNAL, - LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, - }, - { .index = L_NAME, - .conflicts = { L_AGNUM, - L_INTERNAL, - LAST_CONFLICT }, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = L_LAZYSBCNTR, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, - }, - }, -}; - -struct opt_params nopts = { - .name = 'n', - .subopts = { -#define N_LOG 0 - "log", -#define N_SIZE 1 - "size", -#define N_VERSION 2 - "version", -#define N_FTYPE 3 - "ftype", - NULL, }, - .subopt_params = { - { .index = N_LOG, - .conflicts = { N_SIZE, - LAST_CONFLICT }, - .minval = XFS_MIN_REC_DIRSIZE, - .maxval = XFS_MAX_BLOCKSIZE_LOG, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = N_SIZE, - .conflicts = { N_LOG, - LAST_CONFLICT }, - .convert = true, - .is_power_2 = true, - .minval = 1 << XFS_MIN_REC_DIRSIZE, - .maxval = XFS_MAX_BLOCKSIZE, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = N_VERSION, - .conflicts = { LAST_CONFLICT }, - .minval = 2, - .maxval = 2, - .defaultval = SUBOPT_NEEDS_VAL, +#define OPT_N 4 + { + .index = OPT_N, + .name = 'n', + .subopts = { + #define N_LOG 0 + "log", + #define N_SIZE 1 + "size", + #define N_VERSION 2 + "version", + #define N_FTYPE 3 + "ftype", + NULL, }, - { .index = N_FTYPE, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, + .subopt_params = { + { .index = N_LOG, + .conflicts = { N_SIZE, + LAST_CONFLICT }, + .minval = XFS_MIN_REC_DIRSIZE, + .maxval = XFS_MAX_BLOCKSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = N_SIZE, + .conflicts = { N_LOG, + LAST_CONFLICT }, + .convert = true, + .is_power_2 = true, + .minval = 1 << XFS_MIN_REC_DIRSIZE, + .maxval = XFS_MAX_BLOCKSIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = N_VERSION, + .conflicts = { LAST_CONFLICT }, + .minval = 2, + .maxval = 2, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = N_FTYPE, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, }, }, -}; - -struct opt_params ropts = { - .name = 'r', - .subopts = { -#define R_EXTSIZE 0 - "extsize", -#define R_SIZE 1 - "size", -#define R_DEV 2 - "rtdev", -#define R_FILE 3 - "file", -#define R_NAME 4 - "name", -#define R_NOALIGN 5 - "noalign", - NULL - }, - .subopt_params = { - { .index = R_EXTSIZE, - .conflicts = { LAST_CONFLICT }, - .convert = true, - .minval = XFS_MIN_RTEXTSIZE, - .maxval = XFS_MAX_RTEXTSIZE, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = R_SIZE, - .conflicts = { LAST_CONFLICT }, - .convert = true, - .minval = 0, - .maxval = LLONG_MAX, - .defaultval = SUBOPT_NEEDS_VAL, +#define OPT_R 5 + { + .index = OPT_R, + .name = 'r', + .subopts = { + #define R_EXTSIZE 0 + "extsize", + #define R_SIZE 1 + "size", + #define R_DEV 2 + "rtdev", + #define R_FILE 3 + "file", + #define R_NAME 4 + "name", + #define R_NOALIGN 5 + "noalign", + NULL }, - { .index = R_DEV, - .conflicts = { LAST_CONFLICT }, - .defaultval = SUBOPT_NEEDS_VAL, + .subopt_params = { + { .index = R_EXTSIZE, + .conflicts = { LAST_CONFLICT }, + .convert = true, + .minval = XFS_MIN_RTEXTSIZE, + .maxval = XFS_MAX_RTEXTSIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = R_SIZE, + .conflicts = { LAST_CONFLICT }, + .convert = true, + .minval = 0, + .maxval = LLONG_MAX, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = R_DEV, + .conflicts = { LAST_CONFLICT }, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = R_FILE, + .minval = 0, + .maxval = 1, + .defaultval = 1, + .conflicts = { LAST_CONFLICT }, + }, + { .index = R_NAME, + .conflicts = { LAST_CONFLICT }, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = R_NOALIGN, + .minval = 0, + .maxval = 1, + .defaultval = 1, + .conflicts = { LAST_CONFLICT }, + }, }, - { .index = R_FILE, - .minval = 0, - .maxval = 1, - .defaultval = 1, - .conflicts = { LAST_CONFLICT }, - }, - { .index = R_NAME, - .conflicts = { LAST_CONFLICT }, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = R_NOALIGN, - .minval = 0, - .maxval = 1, - .defaultval = 1, - .conflicts = { LAST_CONFLICT }, - }, - }, -}; - -struct opt_params sopts = { - .name = 's', - .subopts = { -#define S_LOG 0 - "log", -#define S_SECTLOG 1 - "sectlog", -#define S_SIZE 2 - "size", -#define S_SECTSIZE 3 - "sectsize", - NULL }, - .subopt_params = { - { .index = S_LOG, - .conflicts = { S_SIZE, - S_SECTSIZE, - LAST_CONFLICT }, - .minval = XFS_MIN_SECTORSIZE_LOG, - .maxval = XFS_MAX_SECTORSIZE_LOG, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = S_SECTLOG, - .conflicts = { S_SIZE, - S_SECTSIZE, - LAST_CONFLICT }, - .minval = XFS_MIN_SECTORSIZE_LOG, - .maxval = XFS_MAX_SECTORSIZE_LOG, - .defaultval = SUBOPT_NEEDS_VAL, - }, - { .index = S_SIZE, - .conflicts = { S_LOG, - S_SECTLOG, - LAST_CONFLICT }, - .convert = true, - .is_power_2 = true, - .minval = XFS_MIN_SECTORSIZE, - .maxval = XFS_MAX_SECTORSIZE, - .defaultval = SUBOPT_NEEDS_VAL, +#define OPT_S 6 + { + .index = OPT_S, + .name = 's', + .subopts = { + #define S_LOG 0 + "log", + #define S_SECTLOG 1 + "sectlog", + #define S_SIZE 2 + "size", + #define S_SECTSIZE 3 + "sectsize", + NULL }, - { .index = S_SECTSIZE, - .conflicts = { S_LOG, - S_SECTLOG, - LAST_CONFLICT }, - .convert = true, - .is_power_2 = true, - .minval = XFS_MIN_SECTORSIZE, - .maxval = XFS_MAX_SECTORSIZE, - .defaultval = SUBOPT_NEEDS_VAL, + .subopt_params = { + { .index = S_LOG, + .conflicts = { S_SIZE, + S_SECTSIZE, + LAST_CONFLICT }, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = S_SECTLOG, + .conflicts = { S_SIZE, + S_SECTSIZE, + LAST_CONFLICT }, + .minval = XFS_MIN_SECTORSIZE_LOG, + .maxval = XFS_MAX_SECTORSIZE_LOG, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = S_SIZE, + .conflicts = { S_LOG, + S_SECTLOG, + LAST_CONFLICT }, + .convert = true, + .is_power_2 = true, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, + { .index = S_SECTSIZE, + .conflicts = { S_LOG, + S_SECTLOG, + LAST_CONFLICT }, + .convert = true, + .is_power_2 = true, + .minval = XFS_MIN_SECTORSIZE, + .maxval = XFS_MAX_SECTORSIZE, + .defaultval = SUBOPT_NEEDS_VAL, + }, }, }, -}; - -struct opt_params mopts = { - .name = 'm', - .subopts = { -#define M_CRC 0 - "crc", -#define M_FINOBT 1 - "finobt", -#define M_UUID 2 - "uuid", - NULL - }, - .subopt_params = { - { .index = M_CRC, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, - }, - { .index = M_FINOBT, - .conflicts = { LAST_CONFLICT }, - .minval = 0, - .maxval = 1, - .defaultval = 1, +#define OPT_M 7 + { + .index = OPT_M, + .name = 'm', + .subopts = { + #define M_CRC 0 + "crc", + #define M_FINOBT 1 + "finobt", + #define M_UUID 2 + "uuid", + NULL }, - { .index = M_UUID, - .conflicts = { LAST_CONFLICT }, - .defaultval = SUBOPT_NEEDS_VAL, + .subopt_params = { + { .index = M_CRC, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = M_FINOBT, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 1, + }, + { .index = M_UUID, + .conflicts = { LAST_CONFLICT }, + .defaultval = SUBOPT_NEEDS_VAL, + }, }, }, }; @@ -1519,18 +1533,19 @@ main( case 'b': p = optarg; while (*p != '\0') { - char **subopts = (char **)bopts.subopts; + char **subopts = (char **)opts[OPT_B].subopts; char *value; switch (getsubopt(&p, (constpp)subopts, &value)) { case B_LOG: - blocklog = getnum(value, &bopts, B_LOG); + blocklog = getnum(value, &opts[OPT_B], + B_LOG); blocksize = 1 << blocklog; blflag = 1; break; case B_SIZE: - blocksize = getnum(value, &bopts, + blocksize = getnum(value, &opts[OPT_B], B_SIZE); blocklog = libxfs_highbit32(blocksize); bsflag = 1; @@ -1543,74 +1558,79 @@ main( case 'd': p = optarg; while (*p != '\0') { - char **subopts = (char **)dopts.subopts; + char **subopts = (char **)opts[OPT_D].subopts; char *value; switch (getsubopt(&p, (constpp)subopts, &value)) { case D_AGCOUNT: - agcount = getnum(value, &dopts, + agcount = getnum(value, &opts[OPT_D], D_AGCOUNT); daflag = 1; break; case D_AGSIZE: - agsize = getnum(value, &dopts, D_AGSIZE); + agsize = getnum(value, &opts[OPT_D], + D_AGSIZE); dasize = 1; break; case D_FILE: - xi.disfile = getnum(value, &dopts, + xi.disfile = getnum(value, &opts[OPT_D], D_FILE); break; case D_NAME: - xi.dname = getstr(value, &dopts, D_NAME); + xi.dname = getstr(value, &opts[OPT_D], + D_NAME); break; case D_SIZE: - dbytes = getnum(value, &dopts, D_SIZE); + dbytes = getnum(value, &opts[OPT_D], + D_SIZE); break; case D_SUNIT: - dsunit = getnum(value, &dopts, D_SUNIT); + dsunit = getnum(value, &opts[OPT_D], + D_SUNIT); break; case D_SWIDTH: - dswidth = getnum(value, &dopts, + dswidth = getnum(value, &opts[OPT_D], D_SWIDTH); break; case D_SU: - dsu = getnum(value, &dopts, D_SU); + dsu = getnum(value, &opts[OPT_D], D_SU); break; case D_SW: - dsw = getnum(value, &dopts, D_SW); + dsw = getnum(value, &opts[OPT_D], D_SW); break; case D_NOALIGN: - nodsflag = getnum(value, &dopts, + nodsflag = getnum(value, &opts[OPT_D], D_NOALIGN); break; case D_SECTLOG: - sectorlog = getnum(value, &dopts, + sectorlog = getnum(value, &opts[OPT_D], D_SECTLOG); sectorsize = 1 << sectorlog; slflag = 1; break; case D_SECTSIZE: - sectorsize = getnum(value, &dopts, + sectorsize = getnum(value, &opts[OPT_D], D_SECTSIZE); sectorlog = libxfs_highbit32(sectorsize); ssflag = 1; break; case D_RTINHERIT: - c = getnum(value, &dopts, D_RTINHERIT); + c = getnum(value, &opts[OPT_D], + D_RTINHERIT); if (c) fsx.fsx_xflags |= XFS_DIFLAG_RTINHERIT; break; case D_PROJINHERIT: - fsx.fsx_projid = getnum(value, &dopts, + fsx.fsx_projid = getnum(value, &opts[OPT_D], D_PROJINHERIT); fsx.fsx_xflags |= XFS_DIFLAG_PROJINHERIT; break; case D_EXTSZINHERIT: - fsx.fsx_extsize = getnum(value, &dopts, + fsx.fsx_extsize = getnum(value, &opts[OPT_D], D_EXTSZINHERIT); fsx.fsx_xflags |= XFS_DIFLAG_EXTSZINHERIT; @@ -1623,47 +1643,52 @@ main( case 'i': p = optarg; while (*p != '\0') { - char **subopts = (char **)iopts.subopts; + char **subopts = (char **)opts[OPT_I].subopts; char *value; switch (getsubopt(&p, (constpp)subopts, &value)) { case I_ALIGN: sb_feat.inode_align = getnum(value, - &iopts, I_ALIGN); + &opts[OPT_I], + I_ALIGN); break; case I_LOG: - inodelog = getnum(value, &iopts, I_LOG); + inodelog = getnum(value, &opts[OPT_I], + I_LOG); isize = 1 << inodelog; ilflag = 1; break; case I_MAXPCT: - imaxpct = getnum(value, &iopts, + imaxpct = getnum(value, &opts[OPT_I], I_MAXPCT); imflag = 1; break; case I_PERBLOCK: - inopblock = getnum(value, &iopts, + inopblock = getnum(value, &opts[OPT_I], I_PERBLOCK); ipflag = 1; break; case I_SIZE: - isize = getnum(value, &iopts, I_SIZE); + isize = getnum(value, &opts[OPT_I], + I_SIZE); inodelog = libxfs_highbit32(isize); isflag = 1; break; case I_ATTR: sb_feat.attr_version = - getnum(value, &iopts, I_ATTR); + getnum(value, &opts[OPT_I], + I_ATTR); break; case I_PROJID32BIT: sb_feat.projid16bit = - !getnum(value, &iopts, + !getnum(value, &opts[OPT_I], I_PROJID32BIT); break; case I_SPINODES: sb_feat.spinodes = getnum(value, - &iopts, I_SPINODES); + &opts[OPT_I], + I_SPINODES); break; default: unknown('i', value); @@ -1673,55 +1698,60 @@ main( case 'l': p = optarg; while (*p != '\0') { - char **subopts = (char **)lopts.subopts; + char **subopts = (char **)opts[OPT_L].subopts; char *value; switch (getsubopt(&p, (constpp)subopts, &value)) { case L_AGNUM: - logagno = getnum(value, &lopts, L_AGNUM); + logagno = getnum(value, &opts[OPT_L], + L_AGNUM); laflag = 1; break; case L_FILE: - xi.lisfile = getnum(value, &lopts, + xi.lisfile = getnum(value, &opts[OPT_L], L_FILE); break; case L_INTERNAL: - loginternal = getnum(value, &lopts, + loginternal = getnum(value, &opts[OPT_L], L_INTERNAL); liflag = 1; break; case L_SU: - lsu = getnum(value, &lopts, L_SU); + lsu = getnum(value, &opts[OPT_L], L_SU); lsuflag = 1; break; case L_SUNIT: - lsunit = getnum(value, &lopts, L_SUNIT); + lsunit = getnum(value, &opts[OPT_L], + L_SUNIT); lsunitflag = 1; break; case L_NAME: case L_DEV: - logfile = getstr(value, &lopts, L_NAME); + logfile = getstr(value, &opts[OPT_L], + L_NAME); xi.logname = logfile; ldflag = 1; loginternal = 0; break; case L_VERSION: sb_feat.log_version = - getnum(value, &lopts, L_VERSION); + getnum(value, &opts[OPT_L], + L_VERSION); lvflag = 1; break; case L_SIZE: - logbytes = getnum(value, &lopts, L_SIZE); + logbytes = getnum(value, &opts[OPT_L], + L_SIZE); break; case L_SECTLOG: - lsectorlog = getnum(value, &lopts, + lsectorlog = getnum(value, &opts[OPT_L], L_SECTLOG); lsectorsize = 1 << lsectorlog; lslflag = 1; break; case L_SECTSIZE: - lsectorsize = getnum(value, &lopts, + lsectorsize = getnum(value, &opts[OPT_L], L_SECTSIZE); lsectorlog = libxfs_highbit32(lsectorsize); @@ -1729,7 +1759,7 @@ main( break; case L_LAZYSBCNTR: sb_feat.lazy_sb_counters = - getnum(value, &lopts, + getnum(value, &opts[OPT_L], L_LAZYSBCNTR); break; default: @@ -1745,20 +1775,21 @@ main( case 'm': p = optarg; while (*p != '\0') { - char **subopts = (char **)mopts.subopts; + char **subopts = (char **)opts[OPT_M].subopts; char *value; switch (getsubopt(&p, (constpp)subopts, &value)) { case M_CRC: sb_feat.crcs_enabled = - getnum(value, &mopts, M_CRC); + getnum(value, &opts[OPT_M], + M_CRC); if (sb_feat.crcs_enabled) sb_feat.dirftype = true; break; case M_FINOBT: sb_feat.finobt = getnum( - value, &mopts, M_FINOBT); + value, &opts[OPT_M], M_FINOBT); break; case M_UUID: if (!value || *value == '\0') @@ -1774,38 +1805,39 @@ main( case 'n': p = optarg; while (*p != '\0') { - char **subopts = (char **)nopts.subopts; + char **subopts = (char **)opts[OPT_N].subopts; char *value; switch (getsubopt(&p, (constpp)subopts, &value)) { case N_LOG: - dirblocklog = getnum(value, &nopts, + dirblocklog = getnum(value, &opts[OPT_N], N_LOG); dirblocksize = 1 << dirblocklog; nlflag = 1; break; case N_SIZE: - dirblocksize = getnum(value, &nopts, + dirblocksize = getnum(value, &opts[OPT_N], N_SIZE); dirblocklog = libxfs_highbit32(dirblocksize); nsflag = 1; break; case N_VERSION: - value = getstr(value, &nopts, N_VERSION); + value = getstr(value, &opts[OPT_N], + N_VERSION); if (!strcasecmp(value, "ci")) { /* ASCII CI mode */ sb_feat.nci = true; } else { sb_feat.dir_version = - getnum(value, &nopts, + getnum(value, &opts[OPT_N], N_VERSION); } nvflag = 1; break; case N_FTYPE: - sb_feat.dirftype = getnum(value, &nopts, + sb_feat.dirftype = getnum(value, &opts[OPT_N], N_FTYPE); break; default: @@ -1830,28 +1862,30 @@ main( case 'r': p = optarg; while (*p != '\0') { - char **subopts = (char **)ropts.subopts; + char **subopts = (char **)opts[OPT_R].subopts; char *value; switch (getsubopt(&p, (constpp)subopts, &value)) { case R_EXTSIZE: - rtextbytes = getnum(value, &ropts, R_EXTSIZE); + rtextbytes = getnum(value, &opts[OPT_R], + R_EXTSIZE); break; case R_FILE: - xi.risfile = getnum(value, &ropts, + xi.risfile = getnum(value, &opts[OPT_R], R_FILE); break; case R_NAME: case R_DEV: - xi.rtname = getstr(value, &ropts, + xi.rtname = getstr(value, &opts[OPT_R], R_NAME); break; case R_SIZE: - rtbytes = getnum(value, &ropts, R_SIZE); + rtbytes = getnum(value, &opts[OPT_R], + R_SIZE); break; case R_NOALIGN: - norsflag = getnum(value, &ropts, + norsflag = getnum(value, &opts[OPT_R], R_NOALIGN); break; default: @@ -1862,7 +1896,7 @@ main( case 's': p = optarg; while (*p != '\0') { - char **subopts = (char **)sopts.subopts; + char **subopts = (char **)opts[OPT_S].subopts; char *value; switch (getsubopt(&p, (constpp)subopts, @@ -1872,7 +1906,7 @@ main( if (lssflag) conflict('s', subopts, S_SECTSIZE, S_SECTLOG); - sectorlog = getnum(value, &sopts, + sectorlog = getnum(value, &opts[OPT_S], S_SECTLOG); lsectorlog = sectorlog; sectorsize = 1 << sectorlog; @@ -1884,7 +1918,7 @@ main( if (lslflag) conflict('s', subopts, S_SECTLOG, S_SECTSIZE); - sectorsize = getnum(value, &sopts, + sectorsize = getnum(value, &opts[OPT_S], S_SECTSIZE); lsectorsize = sectorsize; sectorlog = @@ -1908,7 +1942,7 @@ main( fprintf(stderr, _("extra arguments\n")); usage(); } else if (argc - optind == 1) { - dfile = xi.volname = getstr(argv[optind], &dopts, D_NAME); + dfile = xi.volname = getstr(argv[optind], &opts[OPT_D], D_NAME); } else dfile = xi.dname; @@ -2087,7 +2121,7 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); * then issue an error. * The same is also for sparse inodes. */ - if (sb_feat.finobt && mopts.subopt_params[M_FINOBT].seen) { + if (sb_feat.finobt && opts[OPT_M].subopt_params[M_FINOBT].seen) { fprintf(stderr, _("finobt not supported without CRC support\n")); usage(); -- 2.5.5 From jtulak@redhat.com Tue Aug 2 10:42:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 02E8B7CA6 for ; Tue, 2 Aug 2016 10:42:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5BFDDAC004 for ; Tue, 2 Aug 2016 08:42:57 -0700 (PDT) X-ASG-Debug-ID: 1470152575-0bf57b369c350280001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6AOk64XWMOBcgCdt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 08:42:55 -0700 (PDT) X-Barracuda-Envelope-From: jtulak@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F066485541 for ; Tue, 2 Aug 2016 15:42:54 +0000 (UTC) Received: from jtulak.brq.redhat.com (jtulak.brq.redhat.com [10.34.26.85]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72FgjCv020921; Tue, 2 Aug 2016 11:42:54 -0400 From: Jan Tulak To: xfs@oss.sgi.com Cc: Jan Tulak Subject: [PATCH 8/8] mkfs: move conflicts into the table Date: Tue, 2 Aug 2016 17:42:19 +0200 X-ASG-Orig-Subj: [PATCH 8/8] mkfs: move conflicts into the table Message-Id: <1470152539-18759-9-git-send-email-jtulak@redhat.com> In-Reply-To: <1470152539-18759-1-git-send-email-jtulak@redhat.com> References: <1470152539-18759-1-git-send-email-jtulak@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 02 Aug 2016 15:42:54 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470152575 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6845 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Fill the table with conflicts data and remove now-duplicate code for their detection from other parts of mkfs. Signed-off-by: Jan Tulak --- mkfs/xfs_mkfs.c | 109 ++++++++++++++++++++++++++------------------------------ 1 file changed, 50 insertions(+), 59 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 91c7fee..44fa65a 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -45,7 +45,7 @@ unsigned int sectorsize; #define MAX_OPTS 16 #define MAX_SUBOPTS 16 #define SUBOPT_NEEDS_VAL (-1LL) -#define MAX_CONFLICTS 8 +#define MAX_CONFLICTS 32 #define LAST_CONFLICT (-1) #define OPT_B 0 @@ -407,7 +407,9 @@ struct opt_params { }, .subopt_params = { { .index = I_ALIGN, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 1, 0, + "Inodes always aligned for CRC enabled filesytems."}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -445,19 +447,26 @@ struct opt_params { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_ATTR, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 1, 1, + "V2 attribute format always enabled on CRC enabled filesytems."}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, }, { .index = I_PROJID32BIT, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 1, 0, + "32 bit Project IDs always enabled on CRC enabled filesytems."}, + {LAST_CONFLICT} }, + .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = I_SPINODES, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 0, 1, + "Sparse inodes not supported without CRC support."}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -506,7 +515,9 @@ struct opt_params { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_VERSION, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 1, 1, + "V2 logs are required for CRC enabled filesystems."}, + {LAST_CONFLICT} }, .minval = 1, .maxval = 2, .defaultval = SUBOPT_NEEDS_VAL, @@ -562,7 +573,9 @@ struct opt_params { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = L_LAZYSBCNTR, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 1, 0, + "Lazy superblock counted always enabled for CRC enabled filesytems."}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -603,7 +616,9 @@ struct opt_params { .defaultval = SUBOPT_NEEDS_VAL, }, { .index = N_FTYPE, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 1, 0, + "Cannot disable ftype with crcs enabled."}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -719,13 +734,31 @@ struct opt_params { }, .subopt_params = { { .index = M_CRC, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_L, L_VERSION, true, 1, 1, + "V2 logs are required for CRC enabled filesystems."}, + {OPT_I, I_ALIGN, true, 0, 1, + "Inodes always aligned for CRC enabled filesytems."}, + {OPT_I, I_PROJID32BIT, true, 0, 1, + "32 bit Project IDs always enabled on CRC enabled filesytems."}, + {OPT_I, I_ATTR, true, 1, 1, + "V2 attribute format always enabled on CRC enabled filesytems."}, + {OPT_L, L_LAZYSBCNTR, true, 0, 1, + "Lazy superblock counted always enabled for CRC enabled filesytems."}, + {OPT_M, M_FINOBT, true, 1, 0, + "Finobt not supported without CRC support."}, + {OPT_I, I_SPINODES, true, 1, 0, + "Sparse inodes not supported without CRC support."}, + {OPT_N, N_FTYPE, true, 0, 1, + "Cannot disable ftype with crcs enabled."}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, }, { .index = M_FINOBT, - .conflicts = { {LAST_CONFLICT} }, + .conflicts = { {OPT_M, M_CRC, true, 0, 1, + "Finobt not supported without CRC support."}, + {LAST_CONFLICT} }, .minval = 0, .maxval = 1, .defaultval = 1, @@ -2157,11 +2190,16 @@ _("Minimum block size for CRC enabled filesystems is %d bytes.\n"), XFS_MIN_CRC_BLOCKSIZE); usage(); } + + /* + * If user explicitly stated -m crc=1 -n ftype=0, an error was already + * issued. But if -n ftype=0 was stated alone, then it is a conflict + * with a default value for crc enabled and has to be detected here. + */ if (sb_feat.crcs_enabled && !sb_feat.dirftype) { fprintf(stderr, _("cannot disable ftype with crcs enabled\n")); usage(); } - if (!slflag && !ssflag) { sectorlog = XFS_MIN_SECTORSIZE_LOG; sectorsize = XFS_MIN_SECTORSIZE; @@ -2267,42 +2305,6 @@ _("Minimum inode size for CRCs is %d bytes\n"), 1 << XFS_DINODE_DFL_CRC_LOG); usage(); } - - /* inodes always aligned */ - if (!sb_feat.inode_align) { - fprintf(stderr, -_("Inodes always aligned for CRC enabled filesytems\n")); - usage(); - } - - /* lazy sb counters always on */ - if (!sb_feat.lazy_sb_counters) { - fprintf(stderr, -_("Lazy superblock counted always enabled for CRC enabled filesytems\n")); - usage(); - } - - /* version 2 logs always on */ - if (sb_feat.log_version != 2) { - fprintf(stderr, -_("V2 logs always enabled for CRC enabled filesytems\n")); - usage(); - } - - /* attr2 always on */ - if (sb_feat.attr_version != 2) { - fprintf(stderr, -_("V2 attribute format always enabled on CRC enabled filesytems\n")); - usage(); - } - - /* 32 bit project quota always on */ - /* attr2 always on */ - if (sb_feat.projid16bit) { - fprintf(stderr, -_("32 bit Project IDs always enabled on CRC enabled filesytems\n")); - usage(); - } } else { /* * The kernel doesn't currently support crc=0,finobt=1 @@ -2310,21 +2312,10 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); * explicitly turned finobt on, then silently turn it off to * avoid an unnecessary warning. * If the user explicitly tried to use crc=0,finobt=1, - * then issue an error. + * the error was already issued during args parsing. * The same is also for sparse inodes. */ - if (sb_feat.finobt && opts[OPT_M].subopt_params[M_FINOBT].seen) { - fprintf(stderr, -_("finobt not supported without CRC support\n")); - usage(); - } sb_feat.finobt = 0; - - if (sb_feat.spinodes) { - fprintf(stderr, -_("sparse inodes not supported without CRC support\n")); - usage(); - } sb_feat.spinodes = 0; } -- 2.5.5 From sandeen@sandeen.net Tue Aug 2 10:54:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F41D37CAE for ; Tue, 2 Aug 2016 10:54:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 93C1C304048 for ; Tue, 2 Aug 2016 08:54:57 -0700 (PDT) X-ASG-Debug-ID: 1470153294-0bf8157e6a3c7300001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vGCLAY388AcnCOt3 for ; Tue, 02 Aug 2016 08:54:54 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3225A4AC120 for ; Tue, 2 Aug 2016 10:54:54 -0500 (CDT) Subject: Re: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails References: <1470120540-15135-1-git-send-email-zlang@redhat.com> <20160802122721.GE31492@infradead.org> <20160802131427.GD16413@zlang.usersys.redhat.com> From: Eric Sandeen Message-ID: <564b87af-e3b2-5abf-4000-5f068191fc80@sandeen.net> Date: Tue, 2 Aug 2016 10:54:53 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160802131427.GD16413@zlang.usersys.redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1470153294 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2268 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31694 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/2/16 8:14 AM, Zorro Lang wrote: > On Tue, Aug 02, 2016 at 05:27:21AM -0700, Christoph Hellwig wrote: >> On Tue, Aug 02, 2016 at 02:49:00PM +0800, Zorro Lang wrote: >>> After XFS_GETNEXTQUOTA feature has been merged into linux kernel and >>> xfsprogs, xfs_quota use Q_XGETNEXTQUOTA for report and dump, and >>> fall back to old XFS_GETQUOTA ioctl if XFS_GETNEXTQUOTA fails. >>> >>> But when XFS_GETNEXTQUOTA fails, xfs_quota print a warning as >>> "XFS_GETQUOTA: Invalid argument". That's due to kernel can't >>> recognize XFS_GETNEXTQUOTA ioctl and return EINVAL. At this time, >>> the warning is helpless, xfs_quota just need to fall back. >> >> We'd still want to report other errors, right? > > Yes. This patch will make xfs_quota's report and dump command report > nothing if XFS_GETNEXTQUOTA fails and falls back to XFS_GETQUOTA. > > But if XFS_GETQUOTA fails, it'll report errors. > > As I mentioned in email, we don't report errors if XFS_GETNEXTQUOTA > fails, or we don't report errors if kernel has no XFS_GETNEXTQUOTA > feature? The first one won't report any errors from XFS_GETNEXTQUOTA call, > include kernel has no this feature. > > So: > "cmd == XFS_GETQUOTA" or "!(cmd == XFS_GETNEXTQUOTA && errno == EINVAL)" Oh, I see, this is what I was trying to do before coffee in my earlier reply, and failed. :) > I think they all make sense. Do you have any suggestions? Ignoring EINVAL only for XFS_GETNEXTQUOTA seems like a reasonable idea - we might print two warnings for other errors, though - that might be a little odd, but not terrible. I think the patch as it stands is ok; unexpected errors will be caught and printed on the fallback, and we don't need extra complexity around printing two different command names that way. But if there's preference for printing failure information for both calls, that's fine with me, as long as we filter out EINVAL for GETNEXTQUOTA. -Eric > Thanks, > Zorro > >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bfoster@redhat.com Tue Aug 2 12:30:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 88A7D7CA4 for ; Tue, 2 Aug 2016 12:30:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0C16BAC003 for ; Tue, 2 Aug 2016 10:30:22 -0700 (PDT) X-ASG-Debug-ID: 1470159021-0bf8157e6c3cc0b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2vCJRo8REmLfiFPN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 10:30:21 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 370C7C05678E; Tue, 2 Aug 2016 17:30:21 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72HUKQZ022793; Tue, 2 Aug 2016 13:30:20 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0B361120BDC; Tue, 2 Aug 2016 13:30:19 -0400 (EDT) Date: Tue, 2 Aug 2016 13:30:19 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 14/47] xfs: enable the xfs_defer mechanism to process extents to free Message-ID: <20160802173019.GB54148@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 14/47] xfs: enable the xfs_defer mechanism to process extents to free References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907705713.25461.10249893969831969843.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907705713.25461.10249893969831969843.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 02 Aug 2016 17:30:21 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470159021 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5851 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:57:37PM -0700, Darrick J. Wong wrote: > Connect the xfs_defer mechanism with the pieces that we'll need to > handle deferred extent freeing. We'll wire up the existing code to > our new deferred mechanism later. > > v2: Move the deferred item code into xfs_trans_extfree.c. (kernel) > > Signed-off-by: Darrick J. Wong > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_defer.h | 1 > fs/xfs/xfs_super.c | 2 + > fs/xfs/xfs_trans.h | 2 + > fs/xfs/xfs_trans_extfree.c | 110 ++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 115 insertions(+) > > > diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h > index a227bd2..b9b5a92 100644 > --- a/fs/xfs/libxfs/xfs_defer.h > +++ b/fs/xfs/libxfs/xfs_defer.h > @@ -51,6 +51,7 @@ struct xfs_defer_pending { > * find all the space it needs. > */ > enum xfs_defer_ops_type { > + XFS_DEFER_OPS_TYPE_FREE, > XFS_DEFER_OPS_TYPE_MAX, > }; > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 258b594..ce50474 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1858,6 +1858,8 @@ init_xfs_fs(void) > printk(KERN_INFO XFS_VERSION_STRING " with " > XFS_BUILD_OPTIONS " enabled\n"); > > + xfs_extent_free_init_defer_op(); > + > xfs_dir_startup(); > > error = xfs_init_zones(); > diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h > index 5226511..005fbec 100644 > --- a/fs/xfs/xfs_trans.h > +++ b/fs/xfs/xfs_trans.h > @@ -209,6 +209,8 @@ void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); > void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); > void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); > void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); > + > +void xfs_extent_free_init_defer_op(void); > struct xfs_efi_log_item *xfs_trans_get_efi(struct xfs_trans *, uint); > void xfs_trans_log_efi_extent(struct xfs_trans *, > struct xfs_efi_log_item *, > diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c > index 380cc46..a9f34ee 100644 > --- a/fs/xfs/xfs_trans_extfree.c > +++ b/fs/xfs/xfs_trans_extfree.c > @@ -22,10 +22,12 @@ > #include "xfs_log_format.h" > #include "xfs_trans_resv.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_trans.h" > #include "xfs_trans_priv.h" > #include "xfs_extfree_item.h" > #include "xfs_alloc.h" > +#include "xfs_bmap.h" > > /* > * This routine is called to allocate an "extent free intention" > @@ -145,3 +147,111 @@ xfs_trans_free_extent( > > return error; > } > + > +/* Sort bmap items by AG. */ > +static int > +xfs_extent_free_diff_items( > + void *priv, > + struct list_head *a, > + struct list_head *b) > +{ > + struct xfs_mount *mp = priv; > + struct xfs_bmap_free_item *ra; > + struct xfs_bmap_free_item *rb; > + > + ra = container_of(a, struct xfs_bmap_free_item, xbfi_list); > + rb = container_of(b, struct xfs_bmap_free_item, xbfi_list); > + return XFS_FSB_TO_AGNO(mp, ra->xbfi_startblock) - > + XFS_FSB_TO_AGNO(mp, rb->xbfi_startblock); > +} > + > +/* Get an EFI. */ > +STATIC void * > +xfs_extent_free_create_intent( > + struct xfs_trans *tp, > + unsigned int count) > +{ > + return xfs_trans_get_efi(tp, count); > +} > + > +/* Log a free extent to the intent item. */ > +STATIC void > +xfs_extent_free_log_item( > + struct xfs_trans *tp, > + void *intent, > + struct list_head *item) > +{ > + struct xfs_bmap_free_item *free; > + > + free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > + xfs_trans_log_efi_extent(tp, intent, free->xbfi_startblock, > + free->xbfi_blockcount); > +} > + > +/* Get an EFD so we can process all the free extents. */ > +STATIC void * > +xfs_extent_free_create_done( > + struct xfs_trans *tp, > + void *intent, > + unsigned int count) > +{ > + return xfs_trans_get_efd(tp, intent, count); > +} > + > +/* Process a free extent. */ > +STATIC int > +xfs_extent_free_finish_item( > + struct xfs_trans *tp, > + struct xfs_defer_ops *dop, > + struct list_head *item, > + void *done_item, > + void **state) > +{ > + struct xfs_bmap_free_item *free; > + int error; > + > + free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > + error = xfs_trans_free_extent(tp, done_item, > + free->xbfi_startblock, > + free->xbfi_blockcount); > + kmem_free(free); > + return error; > +} > + > +/* Abort all pending EFIs. */ > +STATIC void > +xfs_extent_free_abort_intent( > + void *intent) > +{ > + xfs_efi_release(intent); > +} > + > +/* Cancel a free extent. */ > +STATIC void > +xfs_extent_free_cancel_item( > + struct list_head *item) > +{ > + struct xfs_bmap_free_item *free; > + > + free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > + kmem_free(free); > +} > + > +static const struct xfs_defer_op_type xfs_extent_free_defer_type = { > + .type = XFS_DEFER_OPS_TYPE_FREE, > + .max_items = XFS_EFI_MAX_FAST_EXTENTS, > + .diff_items = xfs_extent_free_diff_items, > + .create_intent = xfs_extent_free_create_intent, > + .abort_intent = xfs_extent_free_abort_intent, > + .log_item = xfs_extent_free_log_item, > + .create_done = xfs_extent_free_create_done, > + .finish_item = xfs_extent_free_finish_item, > + .cancel_item = xfs_extent_free_cancel_item, > +}; > + > +/* Register the deferred op type. */ > +void > +xfs_extent_free_init_defer_op(void) > +{ > + xfs_defer_init_op_type(&xfs_extent_free_defer_type); > +} > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 2 12:30:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 56A417CB1 for ; Tue, 2 Aug 2016 12:30:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 295B38F8037 for ; Tue, 2 Aug 2016 10:30:22 -0700 (PDT) X-ASG-Debug-ID: 1470159016-0bf57c13692f4700001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MQs44ovCKlKirLfV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 10:30:16 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BD07C8122D; Tue, 2 Aug 2016 17:30:15 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72HUFIx024832; Tue, 2 Aug 2016 13:30:15 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 706F0120BDC; Tue, 2 Aug 2016 13:30:14 -0400 (EDT) Date: Tue, 2 Aug 2016 13:30:14 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 11/47] xfs: move deferred operations into a separate file Message-ID: <20160802173013.GA54148@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 11/47] xfs: move deferred operations into a separate file References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 02 Aug 2016 17:30:15 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470159016 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 22183 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:57:17PM -0700, Darrick J. Wong wrote: > All the code around struct xfs_bmap_free basically implements a > deferred operation framework through which we can roll transactions > (to unlock buffers and avoid violating lock order rules) while > managing all the necessary log redo items. Previously we only used > this code to free extents after some sort of mapping operation, but > with the advent of rmap and reflink, we suddenly need to do more than > that. > > With that in mind, xfs_bmap_free really becomes a deferred ops control > structure. Rename the structure and move the deferred ops into their > own file to avoid further bloating of the bmap code. > > v2: actually sort the work items by AG to avoid deadlocks. > > v3: split out the -EAGAIN continuation handling into a separate patch. > > Signed-off-by: Darrick J. Wong > --- Fixes up my comments from the previous version and punts off the EAGAIN stuff. hch's comments aside, this looks Ok to me: Reviewed-by: Brian Foster > fs/xfs/Makefile | 1 > fs/xfs/libxfs/xfs_defer.c | 444 +++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/libxfs/xfs_defer.h | 95 ++++++++++ > 3 files changed, 540 insertions(+) > create mode 100644 fs/xfs/libxfs/xfs_defer.c > create mode 100644 fs/xfs/libxfs/xfs_defer.h > > > diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile > index 3542d94..01857b0 100644 > --- a/fs/xfs/Makefile > +++ b/fs/xfs/Makefile > @@ -39,6 +39,7 @@ xfs-y += $(addprefix libxfs/, \ > xfs_btree.o \ > xfs_da_btree.o \ > xfs_da_format.o \ > + xfs_defer.o \ > xfs_dir2.o \ > xfs_dir2_block.o \ > xfs_dir2_data.o \ > diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c > new file mode 100644 > index 0000000..2809db7 > --- /dev/null > +++ b/fs/xfs/libxfs/xfs_defer.c > @@ -0,0 +1,444 @@ > +/* > + * Copyright (C) 2016 Oracle. All Rights Reserved. > + * > + * Author: Darrick J. Wong > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License > + * as published by the Free Software Foundation; either version 2 > + * of the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. > + */ > +#include "xfs.h" > +#include "xfs_fs.h" > +#include "xfs_shared.h" > +#include "xfs_format.h" > +#include "xfs_log_format.h" > +#include "xfs_trans_resv.h" > +#include "xfs_bit.h" > +#include "xfs_sb.h" > +#include "xfs_mount.h" > +#include "xfs_defer.h" > +#include "xfs_trans.h" > +#include "xfs_trace.h" > + > +/* > + * Deferred Operations in XFS > + * > + * Due to the way locking rules work in XFS, certain transactions (block > + * mapping and unmapping, typically) have permanent reservations so that > + * we can roll the transaction to adhere to AG locking order rules and > + * to unlock buffers between metadata updates. Prior to rmap/reflink, > + * the mapping code had a mechanism to perform these deferrals for > + * extents that were going to be freed; this code makes that facility > + * more generic. > + * > + * When adding the reverse mapping and reflink features, it became > + * necessary to perform complex remapping multi-transactions to comply > + * with AG locking order rules, and to be able to spread a single > + * refcount update operation (an operation on an n-block extent can > + * update as many as n records!) among multiple transactions. XFS can > + * roll a transaction to facilitate this, but using this facility > + * requires us to log "intent" items in case log recovery needs to > + * redo the operation, and to log "done" items to indicate that redo > + * is not necessary. > + * > + * Deferred work is tracked in xfs_defer_pending items. Each pending > + * item tracks one type of deferred work. Incoming work items (which > + * have not yet had an intent logged) are attached to a pending item > + * on the dop_intake list, where they wait for the caller to finish > + * the deferred operations. > + * > + * Finishing a set of deferred operations is an involved process. To > + * start, we define "rolling a deferred-op transaction" as follows: > + * > + * > For each xfs_defer_pending item on the dop_intake list, > + * - Sort the work items in AG order. XFS locking > + * order rules require us to lock buffers in AG order. > + * - Create a log intent item for that type. > + * - Attach it to the pending item. > + * - Move the pending item from the dop_intake list to the > + * dop_pending list. > + * > Roll the transaction. > + * > + * NOTE: To avoid exceeding the transaction reservation, we limit the > + * number of items that we attach to a given xfs_defer_pending. > + * > + * The actual finishing process looks like this: > + * > + * > For each xfs_defer_pending in the dop_pending list, > + * - Roll the deferred-op transaction as above. > + * - Create a log done item for that type, and attach it to the > + * log intent item. > + * - For each work item attached to the log intent item, > + * * Perform the described action. > + * * Attach the work item to the log done item. > + * > + * The key here is that we must log an intent item for all pending > + * work items every time we roll the transaction, and that we must log > + * a done item as soon as the work is completed. With this mechanism > + * we can perform complex remapping operations, chaining intent items > + * as needed. > + * > + * This is an example of remapping the extent (E, E+B) into file X at > + * offset A and dealing with the extent (C, C+B) already being mapped > + * there: > + * +-------------------------------------------------+ > + * | Unmap file X startblock C offset A length B | t0 > + * | Intent to reduce refcount for extent (C, B) | > + * | Intent to remove rmap (X, C, A, B) | > + * | Intent to free extent (D, 1) (bmbt block) | > + * | Intent to map (X, A, B) at startblock E | > + * +-------------------------------------------------+ > + * | Map file X startblock E offset A length B | t1 > + * | Done mapping (X, E, A, B) | > + * | Intent to increase refcount for extent (E, B) | > + * | Intent to add rmap (X, E, A, B) | > + * +-------------------------------------------------+ > + * | Reduce refcount for extent (C, B) | t2 > + * | Done reducing refcount for extent (C, B) | > + * | Increase refcount for extent (E, B) | > + * | Done increasing refcount for extent (E, B) | > + * | Intent to free extent (C, B) | > + * | Intent to free extent (F, 1) (refcountbt block) | > + * | Intent to remove rmap (F, 1, REFC) | > + * +-------------------------------------------------+ > + * | Remove rmap (X, C, A, B) | t3 > + * | Done removing rmap (X, C, A, B) | > + * | Add rmap (X, E, A, B) | > + * | Done adding rmap (X, E, A, B) | > + * | Remove rmap (F, 1, REFC) | > + * | Done removing rmap (F, 1, REFC) | > + * +-------------------------------------------------+ > + * | Free extent (C, B) | t4 > + * | Done freeing extent (C, B) | > + * | Free extent (D, 1) | > + * | Done freeing extent (D, 1) | > + * | Free extent (F, 1) | > + * | Done freeing extent (F, 1) | > + * +-------------------------------------------------+ > + * > + * If we should crash before t2 commits, log recovery replays > + * the following intent items: > + * > + * - Intent to reduce refcount for extent (C, B) > + * - Intent to remove rmap (X, C, A, B) > + * - Intent to free extent (D, 1) (bmbt block) > + * - Intent to increase refcount for extent (E, B) > + * - Intent to add rmap (X, E, A, B) > + * > + * In the process of recovering, it should also generate and take care > + * of these intent items: > + * > + * - Intent to free extent (C, B) > + * - Intent to free extent (F, 1) (refcountbt block) > + * - Intent to remove rmap (F, 1, REFC) > + */ > + > +static const struct xfs_defer_op_type *defer_op_types[XFS_DEFER_OPS_TYPE_MAX]; > + > +/* > + * For each pending item in the intake list, log its intent item and the > + * associated extents, then add the entire intake list to the end of > + * the pending list. > + */ > +STATIC void > +xfs_defer_intake_work( > + struct xfs_trans *tp, > + struct xfs_defer_ops *dop) > +{ > + struct list_head *li; > + struct xfs_defer_pending *dfp; > + > + list_for_each_entry(dfp, &dop->dop_intake, dfp_list) { > + dfp->dfp_intent = dfp->dfp_type->create_intent(tp, > + dfp->dfp_count); > + list_sort(tp->t_mountp, &dfp->dfp_work, > + dfp->dfp_type->diff_items); > + list_for_each(li, &dfp->dfp_work) > + dfp->dfp_type->log_item(tp, dfp->dfp_intent, li); > + } > + > + list_splice_tail_init(&dop->dop_intake, &dop->dop_pending); > +} > + > +/* Abort all the intents that were committed. */ > +STATIC void > +xfs_defer_trans_abort( > + struct xfs_trans *tp, > + struct xfs_defer_ops *dop, > + int error) > +{ > + struct xfs_defer_pending *dfp; > + > + /* > + * If the transaction was committed, drop the intent reference > + * since we're bailing out of here. The other reference is > + * dropped when the intent hits the AIL. If the transaction > + * was not committed, the intent is freed by the intent item > + * unlock handler on abort. > + */ > + if (!dop->dop_committed) > + return; > + > + /* Abort intent items. */ > + list_for_each_entry(dfp, &dop->dop_pending, dfp_list) { > + if (dfp->dfp_committed) > + dfp->dfp_type->abort_intent(dfp->dfp_intent); > + } > + > + /* Shut down FS. */ > + xfs_force_shutdown(tp->t_mountp, (error == -EFSCORRUPTED) ? > + SHUTDOWN_CORRUPT_INCORE : SHUTDOWN_META_IO_ERROR); > +} > + > +/* Roll a transaction so we can do some deferred op processing. */ > +STATIC int > +xfs_defer_trans_roll( > + struct xfs_trans **tp, > + struct xfs_defer_ops *dop, > + struct xfs_inode *ip) > +{ > + int i; > + int error; > + > + /* Log all the joined inodes except the one we passed in. */ > + for (i = 0; i < XFS_DEFER_OPS_NR_INODES && dop->dop_inodes[i]; i++) { > + if (dop->dop_inodes[i] == ip) > + continue; > + xfs_trans_log_inode(*tp, dop->dop_inodes[i], XFS_ILOG_CORE); > + } > + > + /* Roll the transaction. */ > + error = xfs_trans_roll(tp, ip); > + if (error) { > + xfs_defer_trans_abort(*tp, dop, error); > + return error; > + } > + dop->dop_committed = true; > + > + /* Rejoin the joined inodes except the one we passed in. */ > + for (i = 0; i < XFS_DEFER_OPS_NR_INODES && dop->dop_inodes[i]; i++) { > + if (dop->dop_inodes[i] == ip) > + continue; > + xfs_trans_ijoin(*tp, dop->dop_inodes[i], 0); > + } > + > + return error; > +} > + > +/* Do we have any work items to finish? */ > +bool > +xfs_defer_has_unfinished_work( > + struct xfs_defer_ops *dop) > +{ > + return !list_empty(&dop->dop_pending) || !list_empty(&dop->dop_intake); > +} > + > +/* > + * Add this inode to the deferred op. Each joined inode is relogged > + * each time we roll the transaction, in addition to any inode passed > + * to xfs_defer_finish(). > + */ > +int > +xfs_defer_join( > + struct xfs_defer_ops *dop, > + struct xfs_inode *ip) > +{ > + int i; > + > + for (i = 0; i < XFS_DEFER_OPS_NR_INODES; i++) { > + if (dop->dop_inodes[i] == ip) > + return 0; > + else if (dop->dop_inodes[i] == NULL) { > + dop->dop_inodes[i] = ip; > + return 0; > + } > + } > + > + return -EFSCORRUPTED; > +} > + > +/* > + * Finish all the pending work. This involves logging intent items for > + * any work items that wandered in since the last transaction roll (if > + * one has even happened), rolling the transaction, and finishing the > + * work items in the first item on the logged-and-pending list. > + * > + * If an inode is provided, relog it to the new transaction. > + */ > +int > +xfs_defer_finish( > + struct xfs_trans **tp, > + struct xfs_defer_ops *dop, > + struct xfs_inode *ip) > +{ > + struct xfs_defer_pending *dfp; > + struct list_head *li; > + struct list_head *n; > + void *done_item = NULL; > + void *state; > + int error = 0; > + void (*cleanup_fn)(struct xfs_trans *, void *, int); > + > + ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); > + > + /* Until we run out of pending work to finish... */ > + while (xfs_defer_has_unfinished_work(dop)) { > + /* Log intents for work items sitting in the intake. */ > + xfs_defer_intake_work(*tp, dop); > + > + /* Roll the transaction. */ > + error = xfs_defer_trans_roll(tp, dop, ip); > + if (error) > + goto out; > + > + /* Mark all pending intents as committed. */ > + list_for_each_entry_reverse(dfp, &dop->dop_pending, dfp_list) { > + if (dfp->dfp_committed) > + break; > + dfp->dfp_committed = true; > + } > + > + /* Log an intent-done item for the first pending item. */ > + dfp = list_first_entry(&dop->dop_pending, > + struct xfs_defer_pending, dfp_list); > + done_item = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, > + dfp->dfp_count); > + cleanup_fn = dfp->dfp_type->finish_cleanup; > + > + /* Finish the work items. */ > + state = NULL; > + list_for_each_safe(li, n, &dfp->dfp_work) { > + list_del(li); > + dfp->dfp_count--; > + error = dfp->dfp_type->finish_item(*tp, dop, li, > + done_item, &state); > + if (error) { > + /* > + * Clean up after ourselves and jump out. > + * xfs_defer_cancel will take care of freeing > + * all these lists and stuff. > + */ > + if (cleanup_fn) > + cleanup_fn(*tp, state, error); > + xfs_defer_trans_abort(*tp, dop, error); > + goto out; > + } > + } > + /* Done with the dfp, free it. */ > + list_del(&dfp->dfp_list); > + kmem_free(dfp); > + > + if (cleanup_fn) > + cleanup_fn(*tp, state, error); > + } > + > +out: > + return error; > +} > + > +/* > + * Free up any items left in the list. > + */ > +void > +xfs_defer_cancel( > + struct xfs_defer_ops *dop) > +{ > + struct xfs_defer_pending *dfp; > + struct xfs_defer_pending *pli; > + struct list_head *pwi; > + struct list_head *n; > + > + /* > + * Free the pending items. Caller should already have arranged > + * for the intent items to be released. > + */ > + list_for_each_entry_safe(dfp, pli, &dop->dop_intake, dfp_list) { > + list_del(&dfp->dfp_list); > + list_for_each_safe(pwi, n, &dfp->dfp_work) { > + list_del(pwi); > + dfp->dfp_count--; > + dfp->dfp_type->cancel_item(pwi); > + } > + ASSERT(dfp->dfp_count == 0); > + kmem_free(dfp); > + } > + list_for_each_entry_safe(dfp, pli, &dop->dop_pending, dfp_list) { > + list_del(&dfp->dfp_list); > + list_for_each_safe(pwi, n, &dfp->dfp_work) { > + list_del(pwi); > + dfp->dfp_count--; > + dfp->dfp_type->cancel_item(pwi); > + } > + ASSERT(dfp->dfp_count == 0); > + kmem_free(dfp); > + } > +} > + > +/* Add an item for later deferred processing. */ > +void > +xfs_defer_add( > + struct xfs_defer_ops *dop, > + enum xfs_defer_ops_type type, > + struct list_head *li) > +{ > + struct xfs_defer_pending *dfp = NULL; > + > + /* > + * Add the item to a pending item at the end of the intake list. > + * If the last pending item has the same type, reuse it. Else, > + * create a new pending item at the end of the intake list. > + */ > + if (!list_empty(&dop->dop_intake)) { > + dfp = list_last_entry(&dop->dop_intake, > + struct xfs_defer_pending, dfp_list); > + if (dfp->dfp_type->type != type || > + (dfp->dfp_type->max_items && > + dfp->dfp_count >= dfp->dfp_type->max_items)) > + dfp = NULL; > + } > + if (!dfp) { > + dfp = kmem_alloc(sizeof(struct xfs_defer_pending), > + KM_SLEEP | KM_NOFS); > + dfp->dfp_type = defer_op_types[type]; > + dfp->dfp_committed = false; > + dfp->dfp_intent = NULL; > + dfp->dfp_count = 0; > + INIT_LIST_HEAD(&dfp->dfp_work); > + list_add_tail(&dfp->dfp_list, &dop->dop_intake); > + } > + > + list_add_tail(li, &dfp->dfp_work); > + dfp->dfp_count++; > +} > + > +/* Initialize a deferred operation list. */ > +void > +xfs_defer_init_op_type( > + const struct xfs_defer_op_type *type) > +{ > + defer_op_types[type->type] = type; > +} > + > +/* Initialize a deferred operation. */ > +void > +xfs_defer_init( > + struct xfs_defer_ops *dop, > + xfs_fsblock_t *fbp) > +{ > + dop->dop_committed = false; > + dop->dop_low = false; > + memset(&dop->dop_inodes, 0, sizeof(dop->dop_inodes)); > + *fbp = NULLFSBLOCK; > + INIT_LIST_HEAD(&dop->dop_intake); > + INIT_LIST_HEAD(&dop->dop_pending); > +} > diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h > new file mode 100644 > index 0000000..a227bd2 > --- /dev/null > +++ b/fs/xfs/libxfs/xfs_defer.h > @@ -0,0 +1,95 @@ > +/* > + * Copyright (C) 2016 Oracle. All Rights Reserved. > + * > + * Author: Darrick J. Wong > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License > + * as published by the Free Software Foundation; either version 2 > + * of the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. > + */ > +#ifndef __XFS_DEFER_H__ > +#define __XFS_DEFER_H__ > + > +struct xfs_defer_op_type; > + > +/* > + * Save a log intent item and a list of extents, so that we can replay > + * whatever action had to happen to the extent list and file the log done > + * item. > + */ > +struct xfs_defer_pending { > + const struct xfs_defer_op_type *dfp_type; /* function pointers */ > + struct list_head dfp_list; /* pending items */ > + bool dfp_committed; /* committed trans? */ > + void *dfp_intent; /* log intent item */ > + struct list_head dfp_work; /* work items */ > + unsigned int dfp_count; /* # extent items */ > +}; > + > +/* > + * Header for deferred operation list. > + * > + * dop_low is used by the allocator to activate the lowspace algorithm - > + * when free space is running low the extent allocator may choose to > + * allocate an extent from an AG without leaving sufficient space for > + * a btree split when inserting the new extent. In this case the allocator > + * will enable the lowspace algorithm which is supposed to allow further > + * allocations (such as btree splits and newroots) to allocate from > + * sequential AGs. In order to avoid locking AGs out of order the lowspace > + * algorithm will start searching for free space from AG 0. If the correct > + * transaction reservations have been made then this algorithm will eventually > + * find all the space it needs. > + */ > +enum xfs_defer_ops_type { > + XFS_DEFER_OPS_TYPE_MAX, > +}; > + > +#define XFS_DEFER_OPS_NR_INODES 2 /* join up to two inodes */ > + > +struct xfs_defer_ops { > + bool dop_committed; /* did any trans commit? */ > + bool dop_low; /* alloc in low mode */ > + struct list_head dop_intake; /* unlogged pending work */ > + struct list_head dop_pending; /* logged pending work */ > + > + /* relog these inodes with each roll */ > + struct xfs_inode *dop_inodes[XFS_DEFER_OPS_NR_INODES]; > +}; > + > +void xfs_defer_add(struct xfs_defer_ops *dop, enum xfs_defer_ops_type type, > + struct list_head *h); > +int xfs_defer_finish(struct xfs_trans **tp, struct xfs_defer_ops *dop, > + struct xfs_inode *ip); > +void xfs_defer_cancel(struct xfs_defer_ops *dop); > +void xfs_defer_init(struct xfs_defer_ops *dop, xfs_fsblock_t *fbp); > +bool xfs_defer_has_unfinished_work(struct xfs_defer_ops *dop); > +int xfs_defer_join(struct xfs_defer_ops *dop, struct xfs_inode *ip); > + > +/* Description of a deferred type. */ > +struct xfs_defer_op_type { > + enum xfs_defer_ops_type type; > + unsigned int max_items; > + void (*abort_intent)(void *); > + void *(*create_done)(struct xfs_trans *, void *, unsigned int); > + int (*finish_item)(struct xfs_trans *, struct xfs_defer_ops *, > + struct list_head *, void *, void **); > + void (*finish_cleanup)(struct xfs_trans *, void *, int); > + void (*cancel_item)(struct list_head *); > + int (*diff_items)(void *, struct list_head *, struct list_head *); > + void *(*create_intent)(struct xfs_trans *, uint); > + void (*log_item)(struct xfs_trans *, void *, struct list_head *); > +}; > + > +void xfs_defer_init_op_type(const struct xfs_defer_op_type *type); > + > +#endif /* __XFS_DEFER_H__ */ > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 2 12:30:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 461F07CBA for ; Tue, 2 Aug 2016 12:30:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E0EB28F8037 for ; Tue, 2 Aug 2016 10:30:29 -0700 (PDT) X-ASG-Debug-ID: 1470159027-0bf8157e6b3cc0b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jQWRN8dVnPmX4tuC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 10:30:27 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 56D713DEEC; Tue, 2 Aug 2016 17:30:27 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72HUQtN025011; Tue, 2 Aug 2016 13:30:26 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 11A45120BDC; Tue, 2 Aug 2016 13:30:26 -0400 (EDT) Date: Tue, 2 Aug 2016 13:30:26 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 15/47] xfs: rework xfs_bmap_free callers to use xfs_defer_ops Message-ID: <20160802173025.GC54148@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 15/47] xfs: rework xfs_bmap_free callers to use xfs_defer_ops References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907706357.25461.14102482091596438964.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907706357.25461.14102482091596438964.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 02 Aug 2016 17:30:27 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470159027 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 22225 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:57:43PM -0700, Darrick J. Wong wrote: > Restructure everything that used xfs_bmap_free to use xfs_defer_ops > instead. For now we'll just remove the old symbols and play some > cpp magic to make it work; in the next patch we'll actually rename > everything. > > Signed-off-by: Darrick J. Wong > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_alloc.c | 1 > fs/xfs/libxfs/xfs_attr.c | 1 > fs/xfs/libxfs/xfs_attr_remote.c | 1 > fs/xfs/libxfs/xfs_bmap.c | 55 +++++------------------ > fs/xfs/libxfs/xfs_bmap.h | 32 -------------- > fs/xfs/libxfs/xfs_bmap_btree.c | 5 +- > fs/xfs/libxfs/xfs_btree.c | 1 > fs/xfs/libxfs/xfs_defer.h | 7 +++ > fs/xfs/libxfs/xfs_dir2.c | 1 > fs/xfs/libxfs/xfs_ialloc.c | 1 > fs/xfs/libxfs/xfs_inode_buf.c | 1 > fs/xfs/libxfs/xfs_sb.c | 1 > fs/xfs/xfs_bmap_util.c | 92 +-------------------------------------- > fs/xfs/xfs_bmap_util.h | 2 - > fs/xfs/xfs_dquot.c | 1 > fs/xfs/xfs_filestream.c | 3 + > fs/xfs/xfs_fsops.c | 1 > fs/xfs/xfs_inode.c | 1 > fs/xfs/xfs_iomap.c | 1 > fs/xfs/xfs_log_recover.c | 1 > fs/xfs/xfs_mount.c | 1 > fs/xfs/xfs_rtalloc.c | 1 > fs/xfs/xfs_symlink.c | 1 > fs/xfs/xfs_trace.c | 1 > 24 files changed, 42 insertions(+), 171 deletions(-) > > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index 88c26b8..5993f87 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -24,6 +24,7 @@ > #include "xfs_bit.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_btree.h" > #include "xfs_alloc_btree.h" > diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c > index 4e126f4..79d3a30 100644 > --- a/fs/xfs/libxfs/xfs_attr.c > +++ b/fs/xfs/libxfs/xfs_attr.c > @@ -23,6 +23,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_bit.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > #include "xfs_attr_sf.h" > diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c > index a572532..93a9ce1 100644 > --- a/fs/xfs/libxfs/xfs_attr_remote.c > +++ b/fs/xfs/libxfs/xfs_attr_remote.c > @@ -24,6 +24,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_bit.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > #include "xfs_inode.h" > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index c5981f4..e090d34 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -24,6 +24,7 @@ > #include "xfs_bit.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > #include "xfs_dir2.h" > @@ -595,41 +596,7 @@ xfs_bmap_add_free( > new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); > new->xbfi_startblock = bno; > new->xbfi_blockcount = (xfs_extlen_t)len; > - list_add(&new->xbfi_list, &flist->xbf_flist); > - flist->xbf_count++; > -} > - > -/* > - * Remove the entry "free" from the free item list. Prev points to the > - * previous entry, unless "free" is the head of the list. > - */ > -void > -xfs_bmap_del_free( > - struct xfs_bmap_free *flist, /* free item list header */ > - struct xfs_bmap_free_item *free) /* list item to be freed */ > -{ > - list_del(&free->xbfi_list); > - flist->xbf_count--; > - kmem_zone_free(xfs_bmap_free_item_zone, free); > -} > - > -/* > - * Free up any items left in the list. > - */ > -void > -xfs_bmap_cancel( > - struct xfs_bmap_free *flist) /* list of bmap_free_items */ > -{ > - struct xfs_bmap_free_item *free; /* free list item */ > - > - if (flist->xbf_count == 0) > - return; > - while (!list_empty(&flist->xbf_flist)) { > - free = list_first_entry(&flist->xbf_flist, > - struct xfs_bmap_free_item, xbfi_list); > - xfs_bmap_del_free(flist, free); > - } > - ASSERT(flist->xbf_count == 0); > + xfs_defer_add(flist, XFS_DEFER_OPS_TYPE_FREE, &new->xbfi_list); > } > > /* > @@ -767,7 +734,7 @@ xfs_bmap_extents_to_btree( > if (*firstblock == NULLFSBLOCK) { > args.type = XFS_ALLOCTYPE_START_BNO; > args.fsbno = XFS_INO_TO_FSB(mp, ip->i_ino); > - } else if (flist->xbf_low) { > + } else if (flist->dop_low) { > args.type = XFS_ALLOCTYPE_START_BNO; > args.fsbno = *firstblock; > } else { > @@ -788,7 +755,7 @@ xfs_bmap_extents_to_btree( > ASSERT(args.fsbno != NULLFSBLOCK); > ASSERT(*firstblock == NULLFSBLOCK || > args.agno == XFS_FSB_TO_AGNO(mp, *firstblock) || > - (flist->xbf_low && > + (flist->dop_low && > args.agno > XFS_FSB_TO_AGNO(mp, *firstblock))); > *firstblock = cur->bc_private.b.firstblock = args.fsbno; > cur->bc_private.b.allocated++; > @@ -3708,7 +3675,7 @@ xfs_bmap_btalloc( > error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); > if (error) > return error; > - } else if (ap->flist->xbf_low) { > + } else if (ap->flist->dop_low) { > if (xfs_inode_is_filestream(ap->ip)) > args.type = XFS_ALLOCTYPE_FIRST_AG; > else > @@ -3741,7 +3708,7 @@ xfs_bmap_btalloc( > * is >= the stripe unit and the allocation offset is > * at the end of file. > */ > - if (!ap->flist->xbf_low && ap->aeof) { > + if (!ap->flist->dop_low && ap->aeof) { > if (!ap->offset) { > args.alignment = stripe_align; > atype = args.type; > @@ -3834,7 +3801,7 @@ xfs_bmap_btalloc( > args.minleft = 0; > if ((error = xfs_alloc_vextent(&args))) > return error; > - ap->flist->xbf_low = 1; > + ap->flist->dop_low = true; > } > if (args.fsbno != NULLFSBLOCK) { > /* > @@ -3844,7 +3811,7 @@ xfs_bmap_btalloc( > ASSERT(*ap->firstblock == NULLFSBLOCK || > XFS_FSB_TO_AGNO(mp, *ap->firstblock) == > XFS_FSB_TO_AGNO(mp, args.fsbno) || > - (ap->flist->xbf_low && > + (ap->flist->dop_low && > XFS_FSB_TO_AGNO(mp, *ap->firstblock) < > XFS_FSB_TO_AGNO(mp, args.fsbno))); > > @@ -3852,7 +3819,7 @@ xfs_bmap_btalloc( > if (*ap->firstblock == NULLFSBLOCK) > *ap->firstblock = args.fsbno; > ASSERT(nullfb || fb_agno == args.agno || > - (ap->flist->xbf_low && fb_agno < args.agno)); > + (ap->flist->dop_low && fb_agno < args.agno)); > ap->length = args.len; > ap->ip->i_d.di_nblocks += args.len; > xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); > @@ -4319,7 +4286,7 @@ xfs_bmapi_allocate( > if (error) > return error; > > - if (bma->flist->xbf_low) > + if (bma->flist->dop_low) > bma->minleft = 0; > if (bma->cur) > bma->cur->bc_private.b.firstblock = *bma->firstblock; > @@ -4684,7 +4651,7 @@ error0: > XFS_FSB_TO_AGNO(mp, *firstblock) == > XFS_FSB_TO_AGNO(mp, > bma.cur->bc_private.b.firstblock) || > - (flist->xbf_low && > + (flist->dop_low && > XFS_FSB_TO_AGNO(mp, *firstblock) < > XFS_FSB_TO_AGNO(mp, > bma.cur->bc_private.b.firstblock))); > diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h > index f1f3ae6..891b728 100644 > --- a/fs/xfs/libxfs/xfs_bmap.h > +++ b/fs/xfs/libxfs/xfs_bmap.h > @@ -69,27 +69,6 @@ struct xfs_bmap_free_item > struct list_head xbfi_list; > }; > > -/* > - * Header for free extent list. > - * > - * xbf_low is used by the allocator to activate the lowspace algorithm - > - * when free space is running low the extent allocator may choose to > - * allocate an extent from an AG without leaving sufficient space for > - * a btree split when inserting the new extent. In this case the allocator > - * will enable the lowspace algorithm which is supposed to allow further > - * allocations (such as btree splits and newroots) to allocate from > - * sequential AGs. In order to avoid locking AGs out of order the lowspace > - * algorithm will start searching for free space from AG 0. If the correct > - * transaction reservations have been made then this algorithm will eventually > - * find all the space it needs. > - */ > -typedef struct xfs_bmap_free > -{ > - struct list_head xbf_flist; /* list of to-be-free extents */ > - int xbf_count; /* count of items on list */ > - int xbf_low; /* alloc in low mode */ > -} xfs_bmap_free_t; > - > #define XFS_BMAP_MAX_NMAP 4 > > /* > @@ -139,14 +118,6 @@ static inline int xfs_bmapi_aflag(int w) > #define DELAYSTARTBLOCK ((xfs_fsblock_t)-1LL) > #define HOLESTARTBLOCK ((xfs_fsblock_t)-2LL) > > -static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) > -{ > - INIT_LIST_HEAD(&flp->xbf_flist); > - flp->xbf_count = 0; > - flp->xbf_low = 0; > - *fbp = NULLFSBLOCK; > -} > - > /* > * Flags for xfs_bmap_add_extent*. > */ > @@ -195,9 +166,6 @@ int xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd); > void xfs_bmap_local_to_extents_empty(struct xfs_inode *ip, int whichfork); > void xfs_bmap_add_free(struct xfs_mount *mp, struct xfs_bmap_free *flist, > xfs_fsblock_t bno, xfs_filblks_t len); > -void xfs_bmap_cancel(struct xfs_bmap_free *flist); > -int xfs_bmap_finish(struct xfs_trans **tp, struct xfs_bmap_free *flist, > - struct xfs_inode *ip); > void xfs_bmap_compute_maxlevels(struct xfs_mount *mp, int whichfork); > int xfs_bmap_first_unused(struct xfs_trans *tp, struct xfs_inode *ip, > xfs_extlen_t len, xfs_fileoff_t *unused, int whichfork); > diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c > index 4f1a98e..1b7ba73 100644 > --- a/fs/xfs/libxfs/xfs_bmap_btree.c > +++ b/fs/xfs/libxfs/xfs_bmap_btree.c > @@ -23,6 +23,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_bit.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_trans.h" > #include "xfs_inode_item.h" > @@ -462,7 +463,7 @@ xfs_bmbt_alloc_block( > * block allocation here and corrupt the filesystem. > */ > args.minleft = args.tp->t_blk_res; > - } else if (cur->bc_private.b.flist->xbf_low) { > + } else if (cur->bc_private.b.flist->dop_low) { > args.type = XFS_ALLOCTYPE_START_BNO; > } else { > args.type = XFS_ALLOCTYPE_NEAR_BNO; > @@ -490,7 +491,7 @@ xfs_bmbt_alloc_block( > error = xfs_alloc_vextent(&args); > if (error) > goto error0; > - cur->bc_private.b.flist->xbf_low = 1; > + cur->bc_private.b.flist->dop_low = true; > } > if (args.fsbno == NULLFSBLOCK) { > XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > index 6e716f4..5c4d221 100644 > --- a/fs/xfs/libxfs/xfs_btree.c > +++ b/fs/xfs/libxfs/xfs_btree.c > @@ -23,6 +23,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_bit.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_trans.h" > #include "xfs_inode_item.h" > diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h > index b9b5a92..8d25086 100644 > --- a/fs/xfs/libxfs/xfs_defer.h > +++ b/fs/xfs/libxfs/xfs_defer.h > @@ -93,4 +93,11 @@ struct xfs_defer_op_type { > > void xfs_defer_init_op_type(const struct xfs_defer_op_type *type); > > +/* XXX: compatibility shims, will go away in the next patch */ > +#define xfs_bmap_finish xfs_defer_finish > +#define xfs_bmap_cancel xfs_defer_cancel > +#define xfs_bmap_init xfs_defer_init > +#define xfs_bmap_free xfs_defer_ops > +typedef struct xfs_defer_ops xfs_bmap_free_t; > + > #endif /* __XFS_DEFER_H__ */ > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > index af0f9d1..945c0345 100644 > --- a/fs/xfs/libxfs/xfs_dir2.c > +++ b/fs/xfs/libxfs/xfs_dir2.c > @@ -21,6 +21,7 @@ > #include "xfs_log_format.h" > #include "xfs_trans_resv.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > #include "xfs_inode.h" > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index 4b1e408..c654310 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -24,6 +24,7 @@ > #include "xfs_bit.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_btree.h" > #include "xfs_ialloc.h" > diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c > index 9d9559e..4b9769e 100644 > --- a/fs/xfs/libxfs/xfs_inode_buf.c > +++ b/fs/xfs/libxfs/xfs_inode_buf.c > @@ -22,6 +22,7 @@ > #include "xfs_log_format.h" > #include "xfs_trans_resv.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_error.h" > #include "xfs_cksum.h" > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 12ca867..2194e5d 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -24,6 +24,7 @@ > #include "xfs_bit.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_ialloc.h" > #include "xfs_alloc.h" > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 998c3e6..d3c3d46 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -25,6 +25,7 @@ > #include "xfs_bit.h" > #include "xfs_mount.h" > #include "xfs_da_format.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_btree.h" > #include "xfs_trans.h" > @@ -79,95 +80,6 @@ xfs_zero_extent( > GFP_NOFS, true); > } > > -/* Sort bmap items by AG. */ > -static int > -xfs_bmap_free_list_cmp( > - void *priv, > - struct list_head *a, > - struct list_head *b) > -{ > - struct xfs_mount *mp = priv; > - struct xfs_bmap_free_item *ra; > - struct xfs_bmap_free_item *rb; > - > - ra = container_of(a, struct xfs_bmap_free_item, xbfi_list); > - rb = container_of(b, struct xfs_bmap_free_item, xbfi_list); > - return XFS_FSB_TO_AGNO(mp, ra->xbfi_startblock) - > - XFS_FSB_TO_AGNO(mp, rb->xbfi_startblock); > -} > - > -/* > - * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi > - * caller. Frees all the extents that need freeing, which must be done > - * last due to locking considerations. We never free any extents in > - * the first transaction. > - * > - * If an inode *ip is provided, rejoin it to the transaction if > - * the transaction was committed. > - */ > -int /* error */ > -xfs_bmap_finish( > - struct xfs_trans **tp, /* transaction pointer addr */ > - struct xfs_bmap_free *flist, /* i/o: list extents to free */ > - struct xfs_inode *ip) > -{ > - struct xfs_efd_log_item *efd; /* extent free data */ > - struct xfs_efi_log_item *efi; /* extent free intention */ > - int error; /* error return value */ > - int committed;/* xact committed or not */ > - struct xfs_bmap_free_item *free; /* free extent item */ > - > - ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); > - if (flist->xbf_count == 0) > - return 0; > - > - list_sort((*tp)->t_mountp, &flist->xbf_flist, xfs_bmap_free_list_cmp); > - > - efi = xfs_trans_get_efi(*tp, flist->xbf_count); > - list_for_each_entry(free, &flist->xbf_flist, xbfi_list) > - xfs_trans_log_efi_extent(*tp, efi, free->xbfi_startblock, > - free->xbfi_blockcount); > - > - error = __xfs_trans_roll(tp, ip, &committed); > - if (error) { > - /* > - * If the transaction was committed, drop the EFD reference > - * since we're bailing out of here. The other reference is > - * dropped when the EFI hits the AIL. > - * > - * If the transaction was not committed, the EFI is freed by the > - * EFI item unlock handler on abort. Also, we have a new > - * transaction so we should return committed=1 even though we're > - * returning an error. > - */ > - if (committed) { > - xfs_efi_release(efi); > - xfs_force_shutdown((*tp)->t_mountp, > - SHUTDOWN_META_IO_ERROR); > - } > - return error; > - } > - > - /* > - * Get an EFD and free each extent in the list, logging to the EFD in > - * the process. The remaining bmap free list is cleaned up by the caller > - * on error. > - */ > - efd = xfs_trans_get_efd(*tp, efi, flist->xbf_count); > - while (!list_empty(&flist->xbf_flist)) { > - free = list_first_entry(&flist->xbf_flist, > - struct xfs_bmap_free_item, xbfi_list); > - error = xfs_trans_free_extent(*tp, efd, free->xbfi_startblock, > - free->xbfi_blockcount); > - if (error) > - return error; > - > - xfs_bmap_del_free(flist, free); > - } > - > - return 0; > -} > - > int > xfs_bmap_rtalloc( > struct xfs_bmalloca *ap) /* bmap alloc argument struct */ > @@ -815,7 +727,7 @@ xfs_bmap_punch_delalloc_range( > if (error) > break; > > - ASSERT(!flist.xbf_count && list_empty(&flist.xbf_flist)); > + ASSERT(!xfs_defer_has_unfinished_work(&flist)); > next_block: > start_fsb++; > remaining--; > diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h > index f200714..51aadde 100644 > --- a/fs/xfs/xfs_bmap_util.h > +++ b/fs/xfs/xfs_bmap_util.h > @@ -40,8 +40,6 @@ int xfs_getbmap(struct xfs_inode *ip, struct getbmapx *bmv, > xfs_bmap_format_t formatter, void *arg); > > /* functions in xfs_bmap.c that are only needed by xfs_bmap_util.c */ > -void xfs_bmap_del_free(struct xfs_bmap_free *flist, > - struct xfs_bmap_free_item *free); > int xfs_bmap_extsize_align(struct xfs_mount *mp, struct xfs_bmbt_irec *gotp, > struct xfs_bmbt_irec *prevp, xfs_extlen_t extsz, > int rt, int eof, int delay, int convert, > diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c > index e064665..be17f0a 100644 > --- a/fs/xfs/xfs_dquot.c > +++ b/fs/xfs/xfs_dquot.c > @@ -23,6 +23,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_bit.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_bmap.h" > #include "xfs_bmap_util.h" > diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c > index a51353a..3e990fb 100644 > --- a/fs/xfs/xfs_filestream.c > +++ b/fs/xfs/xfs_filestream.c > @@ -22,6 +22,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_bmap.h" > #include "xfs_bmap_util.h" > @@ -385,7 +386,7 @@ xfs_filestream_new_ag( > } > > flags = (ap->userdata ? XFS_PICK_USERDATA : 0) | > - (ap->flist->xbf_low ? XFS_PICK_LOWSPACE : 0); > + (ap->flist->dop_low ? XFS_PICK_LOWSPACE : 0); > > err = xfs_filestream_pick_ag(pip, startag, agp, flags, minlen); > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 7191c38..4c191d2 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -23,6 +23,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > #include "xfs_inode.h" > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 8825bcf..d2389bb 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -25,6 +25,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 620fc91..023a4b4 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -23,6 +23,7 @@ > #include "xfs_log_format.h" > #include "xfs_trans_resv.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_btree.h" > #include "xfs_bmap_btree.h" > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 8359978..080b54b 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -24,6 +24,7 @@ > #include "xfs_bit.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > #include "xfs_inode.h" > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 970c19b..5f3ba88 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -24,6 +24,7 @@ > #include "xfs_bit.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > #include "xfs_inode.h" > diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c > index 3938b37..627f7e6 100644 > --- a/fs/xfs/xfs_rtalloc.c > +++ b/fs/xfs/xfs_rtalloc.c > @@ -23,6 +23,7 @@ > #include "xfs_trans_resv.h" > #include "xfs_bit.h" > #include "xfs_mount.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_bmap.h" > #include "xfs_bmap_util.h" > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 08a46c6..20af47b 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -26,6 +26,7 @@ > #include "xfs_mount.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > +#include "xfs_defer.h" > #include "xfs_dir2.h" > #include "xfs_inode.h" > #include "xfs_ialloc.h" > diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c > index 3971527..7f17ae6 100644 > --- a/fs/xfs/xfs_trace.c > +++ b/fs/xfs/xfs_trace.c > @@ -24,6 +24,7 @@ > #include "xfs_mount.h" > #include "xfs_defer.h" > #include "xfs_da_format.h" > +#include "xfs_defer.h" > #include "xfs_inode.h" > #include "xfs_btree.h" > #include "xfs_da_btree.h" > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 2 12:30:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 114B07CA4 for ; Tue, 2 Aug 2016 12:30:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C8B8B8F8039 for ; Tue, 2 Aug 2016 10:30:36 -0700 (PDT) X-ASG-Debug-ID: 1470159035-0bf57c13672f4720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g7vPc2xZZltom9PJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 10:30:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DDC427DD0F; Tue, 2 Aug 2016 17:30:34 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72HUYGO030053; Tue, 2 Aug 2016 13:30:34 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B9243120BDC; Tue, 2 Aug 2016 13:30:33 -0400 (EDT) Date: Tue, 2 Aug 2016 13:30:33 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 16/47] xfs: change xfs_bmap_{finish, cancel, init, free} -> xfs_defer_* Message-ID: <20160802173033.GD54148@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 16/47] xfs: change xfs_bmap_{finish, cancel, init, free} -> xfs_defer_* References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907707014.25461.326080392148826094.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907707014.25461.326080392148826094.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 02 Aug 2016 17:30:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470159035 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5049 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:57:50PM -0700, Darrick J. Wong wrote: > Drop the compatibility shims that we were using to integrate the new > deferred operation mechanism into the existing code. No new code. > > v2: Also change xfs_bmap_free_item -> xfs_extent_free_item. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/libxfs/xfs_attr.c | 58 ++++++++++++++++++------------------ > fs/xfs/libxfs/xfs_attr_remote.c | 14 ++++----- > fs/xfs/libxfs/xfs_bmap.c | 46 ++++++++++++++--------------- > fs/xfs/libxfs/xfs_bmap.h | 18 ++++++----- > fs/xfs/libxfs/xfs_btree.h | 5 ++- > fs/xfs/libxfs/xfs_da_btree.h | 4 +-- > fs/xfs/libxfs/xfs_defer.h | 7 ---- > fs/xfs/libxfs/xfs_dir2.c | 6 ++-- > fs/xfs/libxfs/xfs_dir2.h | 8 +++-- > fs/xfs/libxfs/xfs_ialloc.c | 6 ++-- > fs/xfs/libxfs/xfs_ialloc.h | 2 + > fs/xfs/libxfs/xfs_trans_resv.c | 4 +-- > fs/xfs/xfs_bmap_util.c | 28 +++++++++--------- > fs/xfs/xfs_bmap_util.h | 2 + > fs/xfs/xfs_dquot.c | 10 +++--- > fs/xfs/xfs_inode.c | 62 ++++++++++++++++++++------------------- > fs/xfs/xfs_inode.h | 4 +-- > fs/xfs/xfs_iomap.c | 24 ++++++++------- > fs/xfs/xfs_rtalloc.c | 8 +++-- > fs/xfs/xfs_super.c | 2 + > fs/xfs/xfs_symlink.c | 16 +++++----- > fs/xfs/xfs_trans.h | 5 --- > fs/xfs/xfs_trans_extfree.c | 36 +++++++++++------------ > 23 files changed, 182 insertions(+), 193 deletions(-) > > ... > diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c > index a9f34ee..b484902 100644 > --- a/fs/xfs/xfs_trans_extfree.c > +++ b/fs/xfs/xfs_trans_extfree.c > @@ -35,7 +35,7 @@ > * caller must use all nextents extents, because we are not > * flexible about this at all. > */ > -struct xfs_efi_log_item * > +STATIC struct xfs_efi_log_item * > xfs_trans_get_efi(struct xfs_trans *tp, I think we should just fold this into the one caller below. > uint nextents) > { > @@ -59,7 +59,7 @@ xfs_trans_get_efi(struct xfs_trans *tp, > * extent is to be logged as needing to be freed. It should > * be called once for each extent to be freed. > */ > -void > +STATIC void > xfs_trans_log_efi_extent(struct xfs_trans *tp, > struct xfs_efi_log_item *efip, > xfs_fsblock_t start_block, Same here. Otherwise looks good: Reviewed-by: Brian Foster > @@ -156,13 +156,13 @@ xfs_extent_free_diff_items( > struct list_head *b) > { > struct xfs_mount *mp = priv; > - struct xfs_bmap_free_item *ra; > - struct xfs_bmap_free_item *rb; > + struct xfs_extent_free_item *ra; > + struct xfs_extent_free_item *rb; > > - ra = container_of(a, struct xfs_bmap_free_item, xbfi_list); > - rb = container_of(b, struct xfs_bmap_free_item, xbfi_list); > - return XFS_FSB_TO_AGNO(mp, ra->xbfi_startblock) - > - XFS_FSB_TO_AGNO(mp, rb->xbfi_startblock); > + ra = container_of(a, struct xfs_extent_free_item, xefi_list); > + rb = container_of(b, struct xfs_extent_free_item, xefi_list); > + return XFS_FSB_TO_AGNO(mp, ra->xefi_startblock) - > + XFS_FSB_TO_AGNO(mp, rb->xefi_startblock); > } > > /* Get an EFI. */ > @@ -181,11 +181,11 @@ xfs_extent_free_log_item( > void *intent, > struct list_head *item) > { > - struct xfs_bmap_free_item *free; > + struct xfs_extent_free_item *free; > > - free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > - xfs_trans_log_efi_extent(tp, intent, free->xbfi_startblock, > - free->xbfi_blockcount); > + free = container_of(item, struct xfs_extent_free_item, xefi_list); > + xfs_trans_log_efi_extent(tp, intent, free->xefi_startblock, > + free->xefi_blockcount); > } > > /* Get an EFD so we can process all the free extents. */ > @@ -207,13 +207,13 @@ xfs_extent_free_finish_item( > void *done_item, > void **state) > { > - struct xfs_bmap_free_item *free; > + struct xfs_extent_free_item *free; > int error; > > - free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > + free = container_of(item, struct xfs_extent_free_item, xefi_list); > error = xfs_trans_free_extent(tp, done_item, > - free->xbfi_startblock, > - free->xbfi_blockcount); > + free->xefi_startblock, > + free->xefi_blockcount); > kmem_free(free); > return error; > } > @@ -231,9 +231,9 @@ STATIC void > xfs_extent_free_cancel_item( > struct list_head *item) > { > - struct xfs_bmap_free_item *free; > + struct xfs_extent_free_item *free; > > - free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > + free = container_of(item, struct xfs_extent_free_item, xefi_list); > kmem_free(free); > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 2 12:30:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C5D3B7CA4 for ; Tue, 2 Aug 2016 12:30:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F5DF304048 for ; Tue, 2 Aug 2016 10:30:45 -0700 (PDT) X-ASG-Debug-ID: 1470159039-0bf8157e6c3cc0d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nGPip8f74hzZoWPM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 10:30:39 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7FB84C04B322; Tue, 2 Aug 2016 17:30:39 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72HUc3l023109; Tue, 2 Aug 2016 13:30:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 24F45120BDC; Tue, 2 Aug 2016 13:30:38 -0400 (EDT) Date: Tue, 2 Aug 2016 13:30:38 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 17/47] xfs: rename flist/free_list to dfops Message-ID: <20160802173037.GE54148@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 17/47] xfs: rename flist/free_list to dfops References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907707745.25461.6093481173463297003.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907707745.25461.6093481173463297003.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 02 Aug 2016 17:30:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470159039 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 72912 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:57:57PM -0700, Darrick J. Wong wrote: > Mechanical change of flist/free_list to dfops, since they're now > deferred ops, not just a freeing list. > > Signed-off-by: Darrick J. Wong > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_attr.c | 62 ++++++++++----------- > fs/xfs/libxfs/xfs_attr_leaf.c | 4 + > fs/xfs/libxfs/xfs_attr_remote.c | 18 +++--- > fs/xfs/libxfs/xfs_bmap.c | 116 ++++++++++++++++++++------------------- > fs/xfs/libxfs/xfs_bmap.h | 10 ++- > fs/xfs/libxfs/xfs_bmap_btree.c | 14 ++--- > fs/xfs/libxfs/xfs_btree.h | 4 + > fs/xfs/libxfs/xfs_da_btree.c | 6 +- > fs/xfs/libxfs/xfs_da_btree.h | 2 - > fs/xfs/libxfs/xfs_dir2.c | 14 ++--- > fs/xfs/libxfs/xfs_dir2.h | 6 +- > fs/xfs/libxfs/xfs_ialloc.c | 14 ++--- > fs/xfs/libxfs/xfs_ialloc.h | 2 - > fs/xfs/xfs_bmap_util.c | 40 +++++++------ > fs/xfs/xfs_dquot.c | 10 ++- > fs/xfs/xfs_filestream.c | 2 - > fs/xfs/xfs_inode.c | 94 ++++++++++++++++---------------- > fs/xfs/xfs_iomap.c | 30 +++++----- > fs/xfs/xfs_rtalloc.c | 10 ++- > fs/xfs/xfs_symlink.c | 24 ++++---- > 20 files changed, 241 insertions(+), 241 deletions(-) > > > diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c > index 66baf97..af1ecb1 100644 > --- a/fs/xfs/libxfs/xfs_attr.c > +++ b/fs/xfs/libxfs/xfs_attr.c > @@ -204,7 +204,7 @@ xfs_attr_set( > { > struct xfs_mount *mp = dp->i_mount; > struct xfs_da_args args; > - struct xfs_defer_ops flist; > + struct xfs_defer_ops dfops; > struct xfs_trans_res tres; > xfs_fsblock_t firstblock; > int rsvd = (flags & ATTR_ROOT) != 0; > @@ -222,7 +222,7 @@ xfs_attr_set( > args.value = value; > args.valuelen = valuelen; > args.firstblock = &firstblock; > - args.flist = &flist; > + args.dfops = &dfops; > args.op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; > args.total = xfs_attr_calc_size(&args, &local); > > @@ -317,13 +317,13 @@ xfs_attr_set( > * It won't fit in the shortform, transform to a leaf block. > * GROT: another possible req'mt for a double-split btree op. > */ > - xfs_defer_init(args.flist, args.firstblock); > + xfs_defer_init(args.dfops, args.firstblock); > error = xfs_attr_shortform_to_leaf(&args); > if (!error) > - error = xfs_defer_finish(&args.trans, args.flist, dp); > + error = xfs_defer_finish(&args.trans, args.dfops, dp); > if (error) { > args.trans = NULL; > - xfs_defer_cancel(&flist); > + xfs_defer_cancel(&dfops); > goto out; > } > > @@ -383,7 +383,7 @@ xfs_attr_remove( > { > struct xfs_mount *mp = dp->i_mount; > struct xfs_da_args args; > - struct xfs_defer_ops flist; > + struct xfs_defer_ops dfops; > xfs_fsblock_t firstblock; > int error; > > @@ -400,7 +400,7 @@ xfs_attr_remove( > return error; > > args.firstblock = &firstblock; > - args.flist = &flist; > + args.dfops = &dfops; > > /* > * we have no control over the attribute names that userspace passes us > @@ -585,13 +585,13 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > * Commit that transaction so that the node_addname() call > * can manage its own transactions. > */ > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_attr3_leaf_to_node(args); > if (!error) > - error = xfs_defer_finish(&args->trans, args->flist, dp); > + error = xfs_defer_finish(&args->trans, args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > return error; > } > > @@ -675,15 +675,15 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) > * If the result is small enough, shrink it all into the inode. > */ > if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); > /* bp is gone due to xfs_da_shrink_inode */ > if (!error) > error = xfs_defer_finish(&args->trans, > - args->flist, dp); > + args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > return error; > } > } > @@ -738,14 +738,14 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) > * If the result is small enough, shrink it all into the inode. > */ > if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); > /* bp is gone due to xfs_da_shrink_inode */ > if (!error) > - error = xfs_defer_finish(&args->trans, args->flist, dp); > + error = xfs_defer_finish(&args->trans, args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > return error; > } > } > @@ -864,14 +864,14 @@ restart: > */ > xfs_da_state_free(state); > state = NULL; > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_attr3_leaf_to_node(args); > if (!error) > error = xfs_defer_finish(&args->trans, > - args->flist, dp); > + args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > goto out; > } > > @@ -892,13 +892,13 @@ restart: > * in the index/blkno/rmtblkno/rmtblkcnt fields and > * in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields. > */ > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_da3_split(state); > if (!error) > - error = xfs_defer_finish(&args->trans, args->flist, dp); > + error = xfs_defer_finish(&args->trans, args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > goto out; > } > } else { > @@ -991,14 +991,14 @@ restart: > * Check to see if the tree needs to be collapsed. > */ > if (retval && (state->path.active > 1)) { > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_da3_join(state); > if (!error) > error = xfs_defer_finish(&args->trans, > - args->flist, dp); > + args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > goto out; > } > } > @@ -1114,13 +1114,13 @@ xfs_attr_node_removename(xfs_da_args_t *args) > * Check to see if the tree needs to be collapsed. > */ > if (retval && (state->path.active > 1)) { > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_da3_join(state); > if (!error) > - error = xfs_defer_finish(&args->trans, args->flist, dp); > + error = xfs_defer_finish(&args->trans, args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > goto out; > } > /* > @@ -1147,15 +1147,15 @@ xfs_attr_node_removename(xfs_da_args_t *args) > goto out; > > if ((forkoff = xfs_attr_shortform_allfit(bp, dp))) { > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_attr3_leaf_to_shortform(bp, args, forkoff); > /* bp is gone due to xfs_da_shrink_inode */ > if (!error) > error = xfs_defer_finish(&args->trans, > - args->flist, dp); > + args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > goto out; > } > } else > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c > index 01a5ecf..8ea91f3 100644 > --- a/fs/xfs/libxfs/xfs_attr_leaf.c > +++ b/fs/xfs/libxfs/xfs_attr_leaf.c > @@ -792,7 +792,7 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) > nargs.dp = dp; > nargs.geo = args->geo; > nargs.firstblock = args->firstblock; > - nargs.flist = args->flist; > + nargs.dfops = args->dfops; > nargs.total = args->total; > nargs.whichfork = XFS_ATTR_FORK; > nargs.trans = args->trans; > @@ -922,7 +922,7 @@ xfs_attr3_leaf_to_shortform( > nargs.geo = args->geo; > nargs.dp = dp; > nargs.firstblock = args->firstblock; > - nargs.flist = args->flist; > + nargs.dfops = args->dfops; > nargs.total = args->total; > nargs.whichfork = XFS_ATTR_FORK; > nargs.trans = args->trans; > diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c > index aabb516..d52f525 100644 > --- a/fs/xfs/libxfs/xfs_attr_remote.c > +++ b/fs/xfs/libxfs/xfs_attr_remote.c > @@ -461,16 +461,16 @@ xfs_attr_rmtval_set( > * extent and then crash then the block may not contain the > * correct metadata after log recovery occurs. > */ > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > nmap = 1; > error = xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno, > blkcnt, XFS_BMAPI_ATTRFORK, args->firstblock, > - args->total, &map, &nmap, args->flist); > + args->total, &map, &nmap, args->dfops); > if (!error) > - error = xfs_defer_finish(&args->trans, args->flist, dp); > + error = xfs_defer_finish(&args->trans, args->dfops, dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > return error; > } > > @@ -504,7 +504,7 @@ xfs_attr_rmtval_set( > > ASSERT(blkcnt > 0); > > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > nmap = 1; > error = xfs_bmapi_read(dp, (xfs_fileoff_t)lblkno, > blkcnt, &map, &nmap, > @@ -604,16 +604,16 @@ xfs_attr_rmtval_remove( > blkcnt = args->rmtblkcnt; > done = 0; > while (!done) { > - xfs_defer_init(args->flist, args->firstblock); > + xfs_defer_init(args->dfops, args->firstblock); > error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt, > XFS_BMAPI_ATTRFORK, 1, args->firstblock, > - args->flist, &done); > + args->dfops, &done); > if (!error) > - error = xfs_defer_finish(&args->trans, args->flist, > + error = xfs_defer_finish(&args->trans, args->dfops, > args->dp); > if (error) { > args->trans = NULL; > - xfs_defer_cancel(args->flist); > + xfs_defer_cancel(args->dfops); > return error; > } > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 71bf553..540a6b7 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -572,7 +572,7 @@ xfs_bmap_validate_ret( > void > xfs_bmap_add_free( > struct xfs_mount *mp, /* mount point structure */ > - struct xfs_defer_ops *flist, /* list of extents */ > + struct xfs_defer_ops *dfops, /* list of extents */ > xfs_fsblock_t bno, /* fs block number of extent */ > xfs_filblks_t len) /* length of extent */ > { > @@ -596,7 +596,7 @@ xfs_bmap_add_free( > new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); > new->xefi_startblock = bno; > new->xefi_blockcount = (xfs_extlen_t)len; > - xfs_defer_add(flist, XFS_DEFER_OPS_TYPE_FREE, &new->xefi_list); > + xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_FREE, &new->xefi_list); > } > > /* > @@ -649,7 +649,7 @@ xfs_bmap_btree_to_extents( > cblock = XFS_BUF_TO_BLOCK(cbp); > if ((error = xfs_btree_check_block(cur, cblock, 0, cbp))) > return error; > - xfs_bmap_add_free(mp, cur->bc_private.b.flist, cbno, 1); > + xfs_bmap_add_free(mp, cur->bc_private.b.dfops, cbno, 1); > ip->i_d.di_nblocks--; > xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L); > xfs_trans_binval(tp, cbp); > @@ -672,7 +672,7 @@ xfs_bmap_extents_to_btree( > xfs_trans_t *tp, /* transaction pointer */ > xfs_inode_t *ip, /* incore inode pointer */ > xfs_fsblock_t *firstblock, /* first-block-allocated */ > - struct xfs_defer_ops *flist, /* blocks freed in xaction */ > + struct xfs_defer_ops *dfops, /* blocks freed in xaction */ > xfs_btree_cur_t **curp, /* cursor returned to caller */ > int wasdel, /* converting a delayed alloc */ > int *logflagsp, /* inode logging flags */ > @@ -721,7 +721,7 @@ xfs_bmap_extents_to_btree( > */ > cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > cur->bc_private.b.firstblock = *firstblock; > - cur->bc_private.b.flist = flist; > + cur->bc_private.b.dfops = dfops; > cur->bc_private.b.flags = wasdel ? XFS_BTCUR_BPRV_WASDEL : 0; > /* > * Convert to a btree with two levels, one record in root. > @@ -734,7 +734,7 @@ xfs_bmap_extents_to_btree( > if (*firstblock == NULLFSBLOCK) { > args.type = XFS_ALLOCTYPE_START_BNO; > args.fsbno = XFS_INO_TO_FSB(mp, ip->i_ino); > - } else if (flist->dop_low) { > + } else if (dfops->dop_low) { > args.type = XFS_ALLOCTYPE_START_BNO; > args.fsbno = *firstblock; > } else { > @@ -755,7 +755,7 @@ xfs_bmap_extents_to_btree( > ASSERT(args.fsbno != NULLFSBLOCK); > ASSERT(*firstblock == NULLFSBLOCK || > args.agno == XFS_FSB_TO_AGNO(mp, *firstblock) || > - (flist->dop_low && > + (dfops->dop_low && > args.agno > XFS_FSB_TO_AGNO(mp, *firstblock))); > *firstblock = cur->bc_private.b.firstblock = args.fsbno; > cur->bc_private.b.allocated++; > @@ -940,7 +940,7 @@ xfs_bmap_add_attrfork_btree( > xfs_trans_t *tp, /* transaction pointer */ > xfs_inode_t *ip, /* incore inode pointer */ > xfs_fsblock_t *firstblock, /* first block allocated */ > - struct xfs_defer_ops *flist, /* blocks to free at commit */ > + struct xfs_defer_ops *dfops, /* blocks to free at commit */ > int *flags) /* inode logging flags */ > { > xfs_btree_cur_t *cur; /* btree cursor */ > @@ -953,7 +953,7 @@ xfs_bmap_add_attrfork_btree( > *flags |= XFS_ILOG_DBROOT; > else { > cur = xfs_bmbt_init_cursor(mp, tp, ip, XFS_DATA_FORK); > - cur->bc_private.b.flist = flist; > + cur->bc_private.b.dfops = dfops; > cur->bc_private.b.firstblock = *firstblock; > if ((error = xfs_bmbt_lookup_ge(cur, 0, 0, 0, &stat))) > goto error0; > @@ -983,7 +983,7 @@ xfs_bmap_add_attrfork_extents( > xfs_trans_t *tp, /* transaction pointer */ > xfs_inode_t *ip, /* incore inode pointer */ > xfs_fsblock_t *firstblock, /* first block allocated */ > - struct xfs_defer_ops *flist, /* blocks to free at commit */ > + struct xfs_defer_ops *dfops, /* blocks to free at commit */ > int *flags) /* inode logging flags */ > { > xfs_btree_cur_t *cur; /* bmap btree cursor */ > @@ -992,7 +992,7 @@ xfs_bmap_add_attrfork_extents( > if (ip->i_d.di_nextents * sizeof(xfs_bmbt_rec_t) <= XFS_IFORK_DSIZE(ip)) > return 0; > cur = NULL; > - error = xfs_bmap_extents_to_btree(tp, ip, firstblock, flist, &cur, 0, > + error = xfs_bmap_extents_to_btree(tp, ip, firstblock, dfops, &cur, 0, > flags, XFS_DATA_FORK); > if (cur) { > cur->bc_private.b.allocated = 0; > @@ -1018,7 +1018,7 @@ xfs_bmap_add_attrfork_local( > xfs_trans_t *tp, /* transaction pointer */ > xfs_inode_t *ip, /* incore inode pointer */ > xfs_fsblock_t *firstblock, /* first block allocated */ > - struct xfs_defer_ops *flist, /* blocks to free at commit */ > + struct xfs_defer_ops *dfops, /* blocks to free at commit */ > int *flags) /* inode logging flags */ > { > xfs_da_args_t dargs; /* args for dir/attr code */ > @@ -1031,7 +1031,7 @@ xfs_bmap_add_attrfork_local( > dargs.geo = ip->i_mount->m_dir_geo; > dargs.dp = ip; > dargs.firstblock = firstblock; > - dargs.flist = flist; > + dargs.dfops = dfops; > dargs.total = dargs.geo->fsbcount; > dargs.whichfork = XFS_DATA_FORK; > dargs.trans = tp; > @@ -1059,7 +1059,7 @@ xfs_bmap_add_attrfork( > int rsvd) /* xact may use reserved blks */ > { > xfs_fsblock_t firstblock; /* 1st block/ag allocated */ > - struct xfs_defer_ops flist; /* freed extent records */ > + struct xfs_defer_ops dfops; /* freed extent records */ > xfs_mount_t *mp; /* mount structure */ > xfs_trans_t *tp; /* transaction pointer */ > int blks; /* space reservation */ > @@ -1125,18 +1125,18 @@ xfs_bmap_add_attrfork( > ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP); > ip->i_afp->if_flags = XFS_IFEXTENTS; > logflags = 0; > - xfs_defer_init(&flist, &firstblock); > + xfs_defer_init(&dfops, &firstblock); > switch (ip->i_d.di_format) { > case XFS_DINODE_FMT_LOCAL: > - error = xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &flist, > + error = xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &dfops, > &logflags); > break; > case XFS_DINODE_FMT_EXTENTS: > error = xfs_bmap_add_attrfork_extents(tp, ip, &firstblock, > - &flist, &logflags); > + &dfops, &logflags); > break; > case XFS_DINODE_FMT_BTREE: > - error = xfs_bmap_add_attrfork_btree(tp, ip, &firstblock, &flist, > + error = xfs_bmap_add_attrfork_btree(tp, ip, &firstblock, &dfops, > &logflags); > break; > default: > @@ -1165,7 +1165,7 @@ xfs_bmap_add_attrfork( > xfs_log_sb(tp); > } > > - error = xfs_defer_finish(&tp, &flist, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto bmap_cancel; > error = xfs_trans_commit(tp); > @@ -1173,7 +1173,7 @@ xfs_bmap_add_attrfork( > return error; > > bmap_cancel: > - xfs_defer_cancel(&flist); > + xfs_defer_cancel(&dfops); > trans_cancel: > xfs_trans_cancel(tp); > xfs_iunlock(ip, XFS_ILOCK_EXCL); > @@ -1970,7 +1970,7 @@ xfs_bmap_add_extent_delay_real( > > if (xfs_bmap_needs_btree(bma->ip, whichfork)) { > error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, > - bma->firstblock, bma->flist, > + bma->firstblock, bma->dfops, > &bma->cur, 1, &tmp_rval, whichfork); > rval |= tmp_rval; > if (error) > @@ -2054,7 +2054,7 @@ xfs_bmap_add_extent_delay_real( > > if (xfs_bmap_needs_btree(bma->ip, whichfork)) { > error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, > - bma->firstblock, bma->flist, &bma->cur, 1, > + bma->firstblock, bma->dfops, &bma->cur, 1, > &tmp_rval, whichfork); > rval |= tmp_rval; > if (error) > @@ -2123,7 +2123,7 @@ xfs_bmap_add_extent_delay_real( > > if (xfs_bmap_needs_btree(bma->ip, whichfork)) { > error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, > - bma->firstblock, bma->flist, &bma->cur, > + bma->firstblock, bma->dfops, &bma->cur, > 1, &tmp_rval, whichfork); > rval |= tmp_rval; > if (error) > @@ -2172,7 +2172,7 @@ xfs_bmap_add_extent_delay_real( > > ASSERT(bma->cur == NULL); > error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, > - bma->firstblock, bma->flist, &bma->cur, > + bma->firstblock, bma->dfops, &bma->cur, > da_old > 0, &tmp_logflags, whichfork); > bma->logflags |= tmp_logflags; > if (error) > @@ -2214,7 +2214,7 @@ xfs_bmap_add_extent_unwritten_real( > xfs_btree_cur_t **curp, /* if *curp is null, not a btree */ > xfs_bmbt_irec_t *new, /* new data to add to file extents */ > xfs_fsblock_t *first, /* pointer to firstblock variable */ > - struct xfs_defer_ops *flist, /* list of extents to be freed */ > + struct xfs_defer_ops *dfops, /* list of extents to be freed */ > int *logflagsp) /* inode logging flags */ > { > xfs_btree_cur_t *cur; /* btree cursor */ > @@ -2707,7 +2707,7 @@ xfs_bmap_add_extent_unwritten_real( > int tmp_logflags; /* partial log flag return val */ > > ASSERT(cur == NULL); > - error = xfs_bmap_extents_to_btree(tp, ip, first, flist, &cur, > + error = xfs_bmap_extents_to_btree(tp, ip, first, dfops, &cur, > 0, &tmp_logflags, XFS_DATA_FORK); > *logflagsp |= tmp_logflags; > if (error) > @@ -3100,7 +3100,7 @@ xfs_bmap_add_extent_hole_real( > > ASSERT(bma->cur == NULL); > error = xfs_bmap_extents_to_btree(bma->tp, bma->ip, > - bma->firstblock, bma->flist, &bma->cur, > + bma->firstblock, bma->dfops, &bma->cur, > 0, &tmp_logflags, whichfork); > bma->logflags |= tmp_logflags; > if (error) > @@ -3675,7 +3675,7 @@ xfs_bmap_btalloc( > error = xfs_bmap_btalloc_nullfb(ap, &args, &blen); > if (error) > return error; > - } else if (ap->flist->dop_low) { > + } else if (ap->dfops->dop_low) { > if (xfs_inode_is_filestream(ap->ip)) > args.type = XFS_ALLOCTYPE_FIRST_AG; > else > @@ -3708,7 +3708,7 @@ xfs_bmap_btalloc( > * is >= the stripe unit and the allocation offset is > * at the end of file. > */ > - if (!ap->flist->dop_low && ap->aeof) { > + if (!ap->dfops->dop_low && ap->aeof) { > if (!ap->offset) { > args.alignment = stripe_align; > atype = args.type; > @@ -3801,7 +3801,7 @@ xfs_bmap_btalloc( > args.minleft = 0; > if ((error = xfs_alloc_vextent(&args))) > return error; > - ap->flist->dop_low = true; > + ap->dfops->dop_low = true; > } > if (args.fsbno != NULLFSBLOCK) { > /* > @@ -3811,7 +3811,7 @@ xfs_bmap_btalloc( > ASSERT(*ap->firstblock == NULLFSBLOCK || > XFS_FSB_TO_AGNO(mp, *ap->firstblock) == > XFS_FSB_TO_AGNO(mp, args.fsbno) || > - (ap->flist->dop_low && > + (ap->dfops->dop_low && > XFS_FSB_TO_AGNO(mp, *ap->firstblock) < > XFS_FSB_TO_AGNO(mp, args.fsbno))); > > @@ -3819,7 +3819,7 @@ xfs_bmap_btalloc( > if (*ap->firstblock == NULLFSBLOCK) > *ap->firstblock = args.fsbno; > ASSERT(nullfb || fb_agno == args.agno || > - (ap->flist->dop_low && fb_agno < args.agno)); > + (ap->dfops->dop_low && fb_agno < args.agno)); > ap->length = args.len; > ap->ip->i_d.di_nblocks += args.len; > xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); > @@ -4286,7 +4286,7 @@ xfs_bmapi_allocate( > if (error) > return error; > > - if (bma->flist->dop_low) > + if (bma->dfops->dop_low) > bma->minleft = 0; > if (bma->cur) > bma->cur->bc_private.b.firstblock = *bma->firstblock; > @@ -4295,7 +4295,7 @@ xfs_bmapi_allocate( > if ((ifp->if_flags & XFS_IFBROOT) && !bma->cur) { > bma->cur = xfs_bmbt_init_cursor(mp, bma->tp, bma->ip, whichfork); > bma->cur->bc_private.b.firstblock = *bma->firstblock; > - bma->cur->bc_private.b.flist = bma->flist; > + bma->cur->bc_private.b.dfops = bma->dfops; > } > /* > * Bump the number of extents we've allocated > @@ -4376,7 +4376,7 @@ xfs_bmapi_convert_unwritten( > bma->cur = xfs_bmbt_init_cursor(bma->ip->i_mount, bma->tp, > bma->ip, whichfork); > bma->cur->bc_private.b.firstblock = *bma->firstblock; > - bma->cur->bc_private.b.flist = bma->flist; > + bma->cur->bc_private.b.dfops = bma->dfops; > } > mval->br_state = (mval->br_state == XFS_EXT_UNWRITTEN) > ? XFS_EXT_NORM : XFS_EXT_UNWRITTEN; > @@ -4393,7 +4393,7 @@ xfs_bmapi_convert_unwritten( > } > > error = xfs_bmap_add_extent_unwritten_real(bma->tp, bma->ip, &bma->idx, > - &bma->cur, mval, bma->firstblock, bma->flist, > + &bma->cur, mval, bma->firstblock, bma->dfops, > &tmp_logflags); > /* > * Log the inode core unconditionally in the unwritten extent conversion > @@ -4447,7 +4447,7 @@ xfs_bmapi_write( > xfs_extlen_t total, /* total blocks needed */ > struct xfs_bmbt_irec *mval, /* output: map values */ > int *nmap, /* i/o: mval size/count */ > - struct xfs_defer_ops *flist) /* i/o: list extents to free */ > + struct xfs_defer_ops *dfops) /* i/o: list extents to free */ > { > struct xfs_mount *mp = ip->i_mount; > struct xfs_ifork *ifp; > @@ -4537,7 +4537,7 @@ xfs_bmapi_write( > bma.ip = ip; > bma.total = total; > bma.userdata = 0; > - bma.flist = flist; > + bma.dfops = dfops; > bma.firstblock = firstblock; > > while (bno < end && n < *nmap) { > @@ -4651,7 +4651,7 @@ error0: > XFS_FSB_TO_AGNO(mp, *firstblock) == > XFS_FSB_TO_AGNO(mp, > bma.cur->bc_private.b.firstblock) || > - (flist->dop_low && > + (dfops->dop_low && > XFS_FSB_TO_AGNO(mp, *firstblock) < > XFS_FSB_TO_AGNO(mp, > bma.cur->bc_private.b.firstblock))); > @@ -4735,7 +4735,7 @@ xfs_bmap_del_extent( > xfs_inode_t *ip, /* incore inode pointer */ > xfs_trans_t *tp, /* current transaction pointer */ > xfs_extnum_t *idx, /* extent number to update/delete */ > - struct xfs_defer_ops *flist, /* list of extents to be freed */ > + struct xfs_defer_ops *dfops, /* list of extents to be freed */ > xfs_btree_cur_t *cur, /* if null, not a btree */ > xfs_bmbt_irec_t *del, /* data to remove from extents */ > int *logflagsp, /* inode logging flags */ > @@ -5023,7 +5023,7 @@ xfs_bmap_del_extent( > * If we need to, add to list of extents to delete. > */ > if (do_fx) > - xfs_bmap_add_free(mp, flist, del->br_startblock, > + xfs_bmap_add_free(mp, dfops, del->br_startblock, > del->br_blockcount); > /* > * Adjust inode # blocks in the file. > @@ -5064,7 +5064,7 @@ xfs_bunmapi( > xfs_extnum_t nexts, /* number of extents max */ > xfs_fsblock_t *firstblock, /* first allocated block > controls a.g. for allocs */ > - struct xfs_defer_ops *flist, /* i/o: list extents to free */ > + struct xfs_defer_ops *dfops, /* i/o: list extents to free */ > int *done) /* set if not done yet */ > { > xfs_btree_cur_t *cur; /* bmap btree cursor */ > @@ -5137,7 +5137,7 @@ xfs_bunmapi( > ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE); > cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > cur->bc_private.b.firstblock = *firstblock; > - cur->bc_private.b.flist = flist; > + cur->bc_private.b.dfops = dfops; > cur->bc_private.b.flags = 0; > } else > cur = NULL; > @@ -5231,7 +5231,7 @@ xfs_bunmapi( > } > del.br_state = XFS_EXT_UNWRITTEN; > error = xfs_bmap_add_extent_unwritten_real(tp, ip, > - &lastx, &cur, &del, firstblock, flist, > + &lastx, &cur, &del, firstblock, dfops, > &logflags); > if (error) > goto error0; > @@ -5290,7 +5290,7 @@ xfs_bunmapi( > lastx--; > error = xfs_bmap_add_extent_unwritten_real(tp, > ip, &lastx, &cur, &prev, > - firstblock, flist, &logflags); > + firstblock, dfops, &logflags); > if (error) > goto error0; > goto nodelete; > @@ -5299,7 +5299,7 @@ xfs_bunmapi( > del.br_state = XFS_EXT_UNWRITTEN; > error = xfs_bmap_add_extent_unwritten_real(tp, > ip, &lastx, &cur, &del, > - firstblock, flist, &logflags); > + firstblock, dfops, &logflags); > if (error) > goto error0; > goto nodelete; > @@ -5357,7 +5357,7 @@ xfs_bunmapi( > } else if (cur) > cur->bc_private.b.flags &= ~XFS_BTCUR_BPRV_WASDEL; > > - error = xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, > + error = xfs_bmap_del_extent(ip, tp, &lastx, dfops, cur, &del, > &tmp_logflags, whichfork); > logflags |= tmp_logflags; > if (error) > @@ -5391,7 +5391,7 @@ nodelete: > */ > if (xfs_bmap_needs_btree(ip, whichfork)) { > ASSERT(cur == NULL); > - error = xfs_bmap_extents_to_btree(tp, ip, firstblock, flist, > + error = xfs_bmap_extents_to_btree(tp, ip, firstblock, dfops, > &cur, 0, &tmp_logflags, whichfork); > logflags |= tmp_logflags; > if (error) > @@ -5680,7 +5680,7 @@ xfs_bmap_shift_extents( > int *done, > xfs_fileoff_t stop_fsb, > xfs_fsblock_t *firstblock, > - struct xfs_defer_ops *flist, > + struct xfs_defer_ops *dfops, > enum shift_direction direction, > int num_exts) > { > @@ -5725,7 +5725,7 @@ xfs_bmap_shift_extents( > if (ifp->if_flags & XFS_IFBROOT) { > cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > cur->bc_private.b.firstblock = *firstblock; > - cur->bc_private.b.flist = flist; > + cur->bc_private.b.dfops = dfops; > cur->bc_private.b.flags = 0; > } > > @@ -5834,7 +5834,7 @@ xfs_bmap_split_extent_at( > struct xfs_inode *ip, > xfs_fileoff_t split_fsb, > xfs_fsblock_t *firstfsb, > - struct xfs_defer_ops *free_list) > + struct xfs_defer_ops *dfops) > { > int whichfork = XFS_DATA_FORK; > struct xfs_btree_cur *cur = NULL; > @@ -5896,7 +5896,7 @@ xfs_bmap_split_extent_at( > if (ifp->if_flags & XFS_IFBROOT) { > cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); > cur->bc_private.b.firstblock = *firstfsb; > - cur->bc_private.b.flist = free_list; > + cur->bc_private.b.dfops = dfops; > cur->bc_private.b.flags = 0; > error = xfs_bmbt_lookup_eq(cur, got.br_startoff, > got.br_startblock, > @@ -5949,7 +5949,7 @@ xfs_bmap_split_extent_at( > int tmp_logflags; /* partial log flag return val */ > > ASSERT(cur == NULL); > - error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, > + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, dfops, > &cur, 0, &tmp_logflags, whichfork); > logflags |= tmp_logflags; > } > @@ -5973,7 +5973,7 @@ xfs_bmap_split_extent( > { > struct xfs_mount *mp = ip->i_mount; > struct xfs_trans *tp; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t firstfsb; > int error; > > @@ -5985,21 +5985,21 @@ xfs_bmap_split_extent( > xfs_ilock(ip, XFS_ILOCK_EXCL); > xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > > - xfs_defer_init(&free_list, &firstfsb); > + xfs_defer_init(&dfops, &firstfsb); > > error = xfs_bmap_split_extent_at(tp, ip, split_fsb, > - &firstfsb, &free_list); > + &firstfsb, &dfops); > if (error) > goto out; > > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto out; > > return xfs_trans_commit(tp); > > out: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > xfs_trans_cancel(tp); > return error; > } > diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h > index 3dc8393..dc01bb8 100644 > --- a/fs/xfs/libxfs/xfs_bmap.h > +++ b/fs/xfs/libxfs/xfs_bmap.h > @@ -32,7 +32,7 @@ extern kmem_zone_t *xfs_bmap_free_item_zone; > */ > struct xfs_bmalloca { > xfs_fsblock_t *firstblock; /* i/o first block allocated */ > - struct xfs_defer_ops *flist; /* bmap freelist */ > + struct xfs_defer_ops *dfops; /* bmap freelist */ > struct xfs_trans *tp; /* transaction pointer */ > struct xfs_inode *ip; /* incore inode pointer */ > struct xfs_bmbt_irec prev; /* extent before the new one */ > @@ -164,7 +164,7 @@ void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, > > int xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd); > void xfs_bmap_local_to_extents_empty(struct xfs_inode *ip, int whichfork); > -void xfs_bmap_add_free(struct xfs_mount *mp, struct xfs_defer_ops *flist, > +void xfs_bmap_add_free(struct xfs_mount *mp, struct xfs_defer_ops *dfops, > xfs_fsblock_t bno, xfs_filblks_t len); > void xfs_bmap_compute_maxlevels(struct xfs_mount *mp, int whichfork); > int xfs_bmap_first_unused(struct xfs_trans *tp, struct xfs_inode *ip, > @@ -186,18 +186,18 @@ int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, > xfs_fileoff_t bno, xfs_filblks_t len, int flags, > xfs_fsblock_t *firstblock, xfs_extlen_t total, > struct xfs_bmbt_irec *mval, int *nmap, > - struct xfs_defer_ops *flist); > + struct xfs_defer_ops *dfops); > int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, > xfs_fileoff_t bno, xfs_filblks_t len, int flags, > xfs_extnum_t nexts, xfs_fsblock_t *firstblock, > - struct xfs_defer_ops *flist, int *done); > + struct xfs_defer_ops *dfops, int *done); > int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, > xfs_extnum_t num); > uint xfs_default_attroffset(struct xfs_inode *ip); > int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, > xfs_fileoff_t *next_fsb, xfs_fileoff_t offset_shift_fsb, > int *done, xfs_fileoff_t stop_fsb, xfs_fsblock_t *firstblock, > - struct xfs_defer_ops *flist, enum shift_direction direction, > + struct xfs_defer_ops *dfops, enum shift_direction direction, > int num_exts); > int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset); > > diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c > index 1b7ba73..0df5318 100644 > --- a/fs/xfs/libxfs/xfs_bmap_btree.c > +++ b/fs/xfs/libxfs/xfs_bmap_btree.c > @@ -407,11 +407,11 @@ xfs_bmbt_dup_cursor( > cur->bc_private.b.ip, cur->bc_private.b.whichfork); > > /* > - * Copy the firstblock, flist, and flags values, > + * Copy the firstblock, dfops, and flags values, > * since init cursor doesn't get them. > */ > new->bc_private.b.firstblock = cur->bc_private.b.firstblock; > - new->bc_private.b.flist = cur->bc_private.b.flist; > + new->bc_private.b.dfops = cur->bc_private.b.dfops; > new->bc_private.b.flags = cur->bc_private.b.flags; > > return new; > @@ -424,7 +424,7 @@ xfs_bmbt_update_cursor( > { > ASSERT((dst->bc_private.b.firstblock != NULLFSBLOCK) || > (dst->bc_private.b.ip->i_d.di_flags & XFS_DIFLAG_REALTIME)); > - ASSERT(dst->bc_private.b.flist == src->bc_private.b.flist); > + ASSERT(dst->bc_private.b.dfops == src->bc_private.b.dfops); > > dst->bc_private.b.allocated += src->bc_private.b.allocated; > dst->bc_private.b.firstblock = src->bc_private.b.firstblock; > @@ -463,7 +463,7 @@ xfs_bmbt_alloc_block( > * block allocation here and corrupt the filesystem. > */ > args.minleft = args.tp->t_blk_res; > - } else if (cur->bc_private.b.flist->dop_low) { > + } else if (cur->bc_private.b.dfops->dop_low) { > args.type = XFS_ALLOCTYPE_START_BNO; > } else { > args.type = XFS_ALLOCTYPE_NEAR_BNO; > @@ -491,7 +491,7 @@ xfs_bmbt_alloc_block( > error = xfs_alloc_vextent(&args); > if (error) > goto error0; > - cur->bc_private.b.flist->dop_low = true; > + cur->bc_private.b.dfops->dop_low = true; > } > if (args.fsbno == NULLFSBLOCK) { > XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); > @@ -527,7 +527,7 @@ xfs_bmbt_free_block( > struct xfs_trans *tp = cur->bc_tp; > xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); > > - xfs_bmap_add_free(mp, cur->bc_private.b.flist, fsbno, 1); > + xfs_bmap_add_free(mp, cur->bc_private.b.dfops, fsbno, 1); > ip->i_d.di_nblocks--; > > xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > @@ -793,7 +793,7 @@ xfs_bmbt_init_cursor( > cur->bc_private.b.forksize = XFS_IFORK_SIZE(ip, whichfork); > cur->bc_private.b.ip = ip; > cur->bc_private.b.firstblock = NULLFSBLOCK; > - cur->bc_private.b.flist = NULL; > + cur->bc_private.b.dfops = NULL; > cur->bc_private.b.allocated = 0; > cur->bc_private.b.flags = 0; > cur->bc_private.b.whichfork = whichfork; > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > index 6713af3..b8bbb21 100644 > --- a/fs/xfs/libxfs/xfs_btree.h > +++ b/fs/xfs/libxfs/xfs_btree.h > @@ -255,12 +255,12 @@ typedef struct xfs_btree_cur > union { > struct { /* needed for BNO, CNT, INO */ > struct xfs_buf *agbp; /* agf/agi buffer pointer */ > - struct xfs_defer_ops *flist; /* deferred updates */ > + struct xfs_defer_ops *dfops; /* deferred updates */ > xfs_agnumber_t agno; /* ag number */ > } a; > struct { /* needed for BMAP */ > struct xfs_inode *ip; /* pointer to our inode */ > - struct xfs_defer_ops *flist; /* deferred updates */ > + struct xfs_defer_ops *dfops; /* deferred updates */ > xfs_fsblock_t firstblock; /* 1st blk allocated */ > int allocated; /* count of alloced */ > short forksize; /* fork's inode space */ > diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c > index 097bf77..68594c7 100644 > --- a/fs/xfs/libxfs/xfs_da_btree.c > +++ b/fs/xfs/libxfs/xfs_da_btree.c > @@ -2030,7 +2030,7 @@ xfs_da_grow_inode_int( > error = xfs_bmapi_write(tp, dp, *bno, count, > xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA|XFS_BMAPI_CONTIG, > args->firstblock, args->total, &map, &nmap, > - args->flist); > + args->dfops); > if (error) > return error; > > @@ -2053,7 +2053,7 @@ xfs_da_grow_inode_int( > error = xfs_bmapi_write(tp, dp, b, c, > xfs_bmapi_aflag(w)|XFS_BMAPI_METADATA, > args->firstblock, args->total, > - &mapp[mapi], &nmap, args->flist); > + &mapp[mapi], &nmap, args->dfops); > if (error) > goto out_free_map; > if (nmap < 1) > @@ -2363,7 +2363,7 @@ xfs_da_shrink_inode( > */ > error = xfs_bunmapi(tp, dp, dead_blkno, count, > xfs_bmapi_aflag(w), 0, args->firstblock, > - args->flist, &done); > + args->dfops, &done); > if (error == -ENOSPC) { > if (w != XFS_DATA_FORK) > break; > diff --git a/fs/xfs/libxfs/xfs_da_btree.h b/fs/xfs/libxfs/xfs_da_btree.h > index 249813a..98c75cb 100644 > --- a/fs/xfs/libxfs/xfs_da_btree.h > +++ b/fs/xfs/libxfs/xfs_da_btree.h > @@ -70,7 +70,7 @@ typedef struct xfs_da_args { > xfs_ino_t inumber; /* input/output inode number */ > struct xfs_inode *dp; /* directory inode to manipulate */ > xfs_fsblock_t *firstblock; /* ptr to firstblock for bmap calls */ > - struct xfs_defer_ops *flist; /* ptr to freelist for bmap_finish */ > + struct xfs_defer_ops *dfops; /* ptr to freelist for bmap_finish */ > struct xfs_trans *trans; /* current trans (changes over time) */ > xfs_extlen_t total; /* total blocks needed, for 1st bmap */ > int whichfork; /* data or attribute fork */ > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > index 0523100..20a96dd 100644 > --- a/fs/xfs/libxfs/xfs_dir2.c > +++ b/fs/xfs/libxfs/xfs_dir2.c > @@ -260,7 +260,7 @@ xfs_dir_createname( > struct xfs_name *name, > xfs_ino_t inum, /* new entry inode number */ > xfs_fsblock_t *first, /* bmap's firstblock */ > - struct xfs_defer_ops *flist, /* bmap's freeblock list */ > + struct xfs_defer_ops *dfops, /* bmap's freeblock list */ > xfs_extlen_t total) /* bmap's total block count */ > { > struct xfs_da_args *args; > @@ -287,7 +287,7 @@ xfs_dir_createname( > args->inumber = inum; > args->dp = dp; > args->firstblock = first; > - args->flist = flist; > + args->dfops = dfops; > args->total = total; > args->whichfork = XFS_DATA_FORK; > args->trans = tp; > @@ -437,7 +437,7 @@ xfs_dir_removename( > struct xfs_name *name, > xfs_ino_t ino, > xfs_fsblock_t *first, /* bmap's firstblock */ > - struct xfs_defer_ops *flist, /* bmap's freeblock list */ > + struct xfs_defer_ops *dfops, /* bmap's freeblock list */ > xfs_extlen_t total) /* bmap's total block count */ > { > struct xfs_da_args *args; > @@ -459,7 +459,7 @@ xfs_dir_removename( > args->inumber = ino; > args->dp = dp; > args->firstblock = first; > - args->flist = flist; > + args->dfops = dfops; > args->total = total; > args->whichfork = XFS_DATA_FORK; > args->trans = tp; > @@ -499,7 +499,7 @@ xfs_dir_replace( > struct xfs_name *name, /* name of entry to replace */ > xfs_ino_t inum, /* new inode number */ > xfs_fsblock_t *first, /* bmap's firstblock */ > - struct xfs_defer_ops *flist, /* bmap's freeblock list */ > + struct xfs_defer_ops *dfops, /* bmap's freeblock list */ > xfs_extlen_t total) /* bmap's total block count */ > { > struct xfs_da_args *args; > @@ -524,7 +524,7 @@ xfs_dir_replace( > args->inumber = inum; > args->dp = dp; > args->firstblock = first; > - args->flist = flist; > + args->dfops = dfops; > args->total = total; > args->whichfork = XFS_DATA_FORK; > args->trans = tp; > @@ -681,7 +681,7 @@ xfs_dir2_shrink_inode( > > /* Unmap the fsblock(s). */ > error = xfs_bunmapi(tp, dp, da, args->geo->fsbcount, 0, 0, > - args->firstblock, args->flist, &done); > + args->firstblock, args->dfops, &done); > if (error) { > /* > * ENOSPC actually can happen if we're in a removename with no > diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h > index c272f1a..becc926 100644 > --- a/fs/xfs/libxfs/xfs_dir2.h > +++ b/fs/xfs/libxfs/xfs_dir2.h > @@ -129,18 +129,18 @@ extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp, > extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp, > struct xfs_name *name, xfs_ino_t inum, > xfs_fsblock_t *first, > - struct xfs_defer_ops *flist, xfs_extlen_t tot); > + struct xfs_defer_ops *dfops, xfs_extlen_t tot); > extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp, > struct xfs_name *name, xfs_ino_t *inum, > struct xfs_name *ci_name); > extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode *dp, > struct xfs_name *name, xfs_ino_t ino, > xfs_fsblock_t *first, > - struct xfs_defer_ops *flist, xfs_extlen_t tot); > + struct xfs_defer_ops *dfops, xfs_extlen_t tot); > extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp, > struct xfs_name *name, xfs_ino_t inum, > xfs_fsblock_t *first, > - struct xfs_defer_ops *flist, xfs_extlen_t tot); > + struct xfs_defer_ops *dfops, xfs_extlen_t tot); > extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, > struct xfs_name *name); > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index 972b2ea..f0e1f71 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -1818,7 +1818,7 @@ xfs_difree_inode_chunk( > struct xfs_mount *mp, > xfs_agnumber_t agno, > struct xfs_inobt_rec_incore *rec, > - struct xfs_defer_ops *flist) > + struct xfs_defer_ops *dfops) > { > xfs_agblock_t sagbno = XFS_AGINO_TO_AGBNO(mp, rec->ir_startino); > int startidx, endidx; > @@ -1829,7 +1829,7 @@ xfs_difree_inode_chunk( > > if (!xfs_inobt_issparse(rec->ir_holemask)) { > /* not sparse, calculate extent info directly */ > - xfs_bmap_add_free(mp, flist, XFS_AGB_TO_FSB(mp, agno, sagbno), > + xfs_bmap_add_free(mp, dfops, XFS_AGB_TO_FSB(mp, agno, sagbno), > mp->m_ialloc_blks); > return; > } > @@ -1873,7 +1873,7 @@ xfs_difree_inode_chunk( > > ASSERT(agbno % mp->m_sb.sb_spino_align == 0); > ASSERT(contigblk % mp->m_sb.sb_spino_align == 0); > - xfs_bmap_add_free(mp, flist, XFS_AGB_TO_FSB(mp, agno, agbno), > + xfs_bmap_add_free(mp, dfops, XFS_AGB_TO_FSB(mp, agno, agbno), > contigblk); > > /* reset range to current bit and carry on... */ > @@ -1890,7 +1890,7 @@ xfs_difree_inobt( > struct xfs_trans *tp, > struct xfs_buf *agbp, > xfs_agino_t agino, > - struct xfs_defer_ops *flist, > + struct xfs_defer_ops *dfops, > struct xfs_icluster *xic, > struct xfs_inobt_rec_incore *orec) > { > @@ -1977,7 +1977,7 @@ xfs_difree_inobt( > goto error0; > } > > - xfs_difree_inode_chunk(mp, agno, &rec, flist); > + xfs_difree_inode_chunk(mp, agno, &rec, dfops); > } else { > xic->deleted = 0; > > @@ -2122,7 +2122,7 @@ int > xfs_difree( > struct xfs_trans *tp, /* transaction pointer */ > xfs_ino_t inode, /* inode to be freed */ > - struct xfs_defer_ops *flist, /* extents to free */ > + struct xfs_defer_ops *dfops, /* extents to free */ > struct xfs_icluster *xic) /* cluster info if deleted */ > { > /* REFERENCED */ > @@ -2174,7 +2174,7 @@ xfs_difree( > /* > * Fix up the inode allocation btree. > */ > - error = xfs_difree_inobt(mp, tp, agbp, agino, flist, xic, &rec); > + error = xfs_difree_inobt(mp, tp, agbp, agino, dfops, xic, &rec); > if (error) > goto error0; > > diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h > index 2e06b67..0bb8966 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.h > +++ b/fs/xfs/libxfs/xfs_ialloc.h > @@ -95,7 +95,7 @@ int /* error */ > xfs_difree( > struct xfs_trans *tp, /* transaction pointer */ > xfs_ino_t inode, /* inode to be freed */ > - struct xfs_defer_ops *flist, /* extents to free */ > + struct xfs_defer_ops *dfops, /* extents to free */ > struct xfs_icluster *ifree); /* cluster info if deleted */ > > /* > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 07954e8..3bbe46b 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -685,7 +685,7 @@ xfs_bmap_punch_delalloc_range( > xfs_bmbt_irec_t imap; > int nimaps = 1; > xfs_fsblock_t firstblock; > - struct xfs_defer_ops flist; > + struct xfs_defer_ops dfops; > > /* > * Map the range first and check that it is a delalloc extent > @@ -716,18 +716,18 @@ xfs_bmap_punch_delalloc_range( > WARN_ON(imap.br_blockcount == 0); > > /* > - * Note: while we initialise the firstblock/flist pair, they > + * Note: while we initialise the firstblock/dfops pair, they > * should never be used because blocks should never be > * allocated or freed for a delalloc extent and hence we need > * don't cancel or finish them after the xfs_bunmapi() call. > */ > - xfs_defer_init(&flist, &firstblock); > + xfs_defer_init(&dfops, &firstblock); > error = xfs_bunmapi(NULL, ip, start_fsb, 1, 0, 1, &firstblock, > - &flist, &done); > + &dfops, &done); > if (error) > break; > > - ASSERT(!xfs_defer_has_unfinished_work(&flist)); > + ASSERT(!xfs_defer_has_unfinished_work(&dfops)); > next_block: > start_fsb++; > remaining--; > @@ -884,7 +884,7 @@ xfs_alloc_file_space( > int rt; > xfs_trans_t *tp; > xfs_bmbt_irec_t imaps[1], *imapp; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > uint qblocks, resblks, resrtextents; > int error; > > @@ -975,17 +975,17 @@ xfs_alloc_file_space( > > xfs_trans_ijoin(tp, ip, 0); > > - xfs_defer_init(&free_list, &firstfsb); > + xfs_defer_init(&dfops, &firstfsb); > error = xfs_bmapi_write(tp, ip, startoffset_fsb, > allocatesize_fsb, alloc_type, &firstfsb, > - resblks, imapp, &nimaps, &free_list); > + resblks, imapp, &nimaps, &dfops); > if (error) > goto error0; > > /* > * Complete the transaction > */ > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto error0; > > @@ -1008,7 +1008,7 @@ xfs_alloc_file_space( > return error; > > error0: /* Cancel bmap, unlock inode, unreserve quota blocks, cancel trans */ > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > xfs_trans_unreserve_quota_nblks(tp, ip, (long)qblocks, 0, quota_flag); > > error1: /* Just cancel transaction */ > @@ -1026,7 +1026,7 @@ xfs_unmap_extent( > { > struct xfs_mount *mp = ip->i_mount; > struct xfs_trans *tp; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t firstfsb; > uint resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0); > int error; > @@ -1045,13 +1045,13 @@ xfs_unmap_extent( > > xfs_trans_ijoin(tp, ip, 0); > > - xfs_defer_init(&free_list, &firstfsb); > + xfs_defer_init(&dfops, &firstfsb); > error = xfs_bunmapi(tp, ip, startoffset_fsb, len_fsb, 0, 2, &firstfsb, > - &free_list, done); > + &dfops, done); > if (error) > goto out_bmap_cancel; > > - error = xfs_defer_finish(&tp, &free_list, ip); > + error = xfs_defer_finish(&tp, &dfops, ip); > if (error) > goto out_bmap_cancel; > > @@ -1061,7 +1061,7 @@ out_unlock: > return error; > > out_bmap_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > out_trans_cancel: > xfs_trans_cancel(tp); > goto out_unlock; > @@ -1250,7 +1250,7 @@ xfs_shift_file_space( > struct xfs_mount *mp = ip->i_mount; > struct xfs_trans *tp; > int error; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t first_block; > xfs_fileoff_t stop_fsb; > xfs_fileoff_t next_fsb; > @@ -1328,19 +1328,19 @@ xfs_shift_file_space( > > xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > > /* > * We are using the write transaction in which max 2 bmbt > * updates are allowed > */ > error = xfs_bmap_shift_extents(tp, ip, &next_fsb, shift_fsb, > - &done, stop_fsb, &first_block, &free_list, > + &done, stop_fsb, &first_block, &dfops, > direction, XFS_BMAP_MAX_SHIFT_EXTENTS); > if (error) > goto out_bmap_cancel; > > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto out_bmap_cancel; > > @@ -1350,7 +1350,7 @@ xfs_shift_file_space( > return error; > > out_bmap_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > out_trans_cancel: > xfs_trans_cancel(tp); > return error; > diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c > index 764e1cc..8ca21b8 100644 > --- a/fs/xfs/xfs_dquot.c > +++ b/fs/xfs/xfs_dquot.c > @@ -307,7 +307,7 @@ xfs_qm_dqalloc( > xfs_buf_t **O_bpp) > { > xfs_fsblock_t firstblock; > - struct xfs_defer_ops flist; > + struct xfs_defer_ops dfops; > xfs_bmbt_irec_t map; > int nmaps, error; > xfs_buf_t *bp; > @@ -320,7 +320,7 @@ xfs_qm_dqalloc( > /* > * Initialize the bmap freelist prior to calling bmapi code. > */ > - xfs_defer_init(&flist, &firstblock); > + xfs_defer_init(&dfops, &firstblock); > xfs_ilock(quotip, XFS_ILOCK_EXCL); > /* > * Return if this type of quotas is turned off while we didn't > @@ -336,7 +336,7 @@ xfs_qm_dqalloc( > error = xfs_bmapi_write(tp, quotip, offset_fsb, > XFS_DQUOT_CLUSTER_SIZE_FSB, XFS_BMAPI_METADATA, > &firstblock, XFS_QM_DQALLOC_SPACE_RES(mp), > - &map, &nmaps, &flist); > + &map, &nmaps, &dfops); > if (error) > goto error0; > ASSERT(map.br_blockcount == XFS_DQUOT_CLUSTER_SIZE_FSB); > @@ -382,7 +382,7 @@ xfs_qm_dqalloc( > > xfs_trans_bhold(tp, bp); > > - error = xfs_defer_finish(tpp, &flist, NULL); > + error = xfs_defer_finish(tpp, &dfops, NULL); > if (error) > goto error1; > > @@ -398,7 +398,7 @@ xfs_qm_dqalloc( > return 0; > > error1: > - xfs_defer_cancel(&flist); > + xfs_defer_cancel(&dfops); > error0: > xfs_iunlock(quotip, XFS_ILOCK_EXCL); > > diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c > index 3e990fb..4a33a33 100644 > --- a/fs/xfs/xfs_filestream.c > +++ b/fs/xfs/xfs_filestream.c > @@ -386,7 +386,7 @@ xfs_filestream_new_ag( > } > > flags = (ap->userdata ? XFS_PICK_USERDATA : 0) | > - (ap->flist->dop_low ? XFS_PICK_LOWSPACE : 0); > + (ap->dfops->dop_low ? XFS_PICK_LOWSPACE : 0); > > err = xfs_filestream_pick_ag(pip, startag, agp, flags, minlen); > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 3ce50da..e08eaea 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1123,7 +1123,7 @@ xfs_create( > struct xfs_inode *ip = NULL; > struct xfs_trans *tp = NULL; > int error; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t first_block; > bool unlock_dp_on_error = false; > prid_t prid; > @@ -1183,7 +1183,7 @@ xfs_create( > XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); > unlock_dp_on_error = true; > > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > > /* > * Reserve disk quota and the inode. > @@ -1220,7 +1220,7 @@ xfs_create( > unlock_dp_on_error = false; > > error = xfs_dir_createname(tp, dp, name, ip->i_ino, > - &first_block, &free_list, resblks ? > + &first_block, &dfops, resblks ? > resblks - XFS_IALLOC_SPACE_RES(mp) : 0); > if (error) { > ASSERT(error != -ENOSPC); > @@ -1254,7 +1254,7 @@ xfs_create( > */ > xfs_qm_vop_create_dqattach(tp, ip, udqp, gdqp, pdqp); > > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto out_bmap_cancel; > > @@ -1270,7 +1270,7 @@ xfs_create( > return 0; > > out_bmap_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > out_trans_cancel: > xfs_trans_cancel(tp); > out_release_inode: > @@ -1402,7 +1402,7 @@ xfs_link( > xfs_mount_t *mp = tdp->i_mount; > xfs_trans_t *tp; > int error; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t first_block; > int resblks; > > @@ -1453,7 +1453,7 @@ xfs_link( > goto error_return; > } > > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > > /* > * Handle initial link state of O_TMPFILE inode > @@ -1465,7 +1465,7 @@ xfs_link( > } > > error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino, > - &first_block, &free_list, resblks); > + &first_block, &dfops, resblks); > if (error) > goto error_return; > xfs_trans_ichgtime(tp, tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > @@ -1483,9 +1483,9 @@ xfs_link( > if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) > xfs_trans_set_sync(tp); > > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) { > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > goto error_return; > } > > @@ -1527,7 +1527,7 @@ xfs_itruncate_extents( > { > struct xfs_mount *mp = ip->i_mount; > struct xfs_trans *tp = *tpp; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t first_block; > xfs_fileoff_t first_unmap_block; > xfs_fileoff_t last_block; > @@ -1563,12 +1563,12 @@ xfs_itruncate_extents( > ASSERT(first_unmap_block < last_block); > unmap_len = last_block - first_unmap_block + 1; > while (!done) { > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > error = xfs_bunmapi(tp, ip, > first_unmap_block, unmap_len, > xfs_bmapi_aflag(whichfork), > XFS_ITRUNC_MAX_EXTENTS, > - &first_block, &free_list, > + &first_block, &dfops, > &done); > if (error) > goto out_bmap_cancel; > @@ -1577,7 +1577,7 @@ xfs_itruncate_extents( > * Duplicate the transaction that has the permanent > * reservation and commit the old transaction. > */ > - error = xfs_defer_finish(&tp, &free_list, ip); > + error = xfs_defer_finish(&tp, &dfops, ip); > if (error) > goto out_bmap_cancel; > > @@ -1603,7 +1603,7 @@ out_bmap_cancel: > * the transaction can be properly aborted. We just need to make sure > * we're not holding any resources that we were not when we came in. > */ > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > goto out; > } > > @@ -1744,7 +1744,7 @@ STATIC int > xfs_inactive_ifree( > struct xfs_inode *ip) > { > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t first_block; > struct xfs_mount *mp = ip->i_mount; > struct xfs_trans *tp; > @@ -1781,8 +1781,8 @@ xfs_inactive_ifree( > xfs_ilock(ip, XFS_ILOCK_EXCL); > xfs_trans_ijoin(tp, ip, 0); > > - xfs_defer_init(&free_list, &first_block); > - error = xfs_ifree(tp, ip, &free_list); > + xfs_defer_init(&dfops, &first_block); > + error = xfs_ifree(tp, ip, &dfops); > if (error) { > /* > * If we fail to free the inode, shut down. The cancel > @@ -1808,11 +1808,11 @@ xfs_inactive_ifree( > * Just ignore errors at this point. There is nothing we can do except > * to try to keep going. Make sure it's not a silent error. > */ > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) { > xfs_notice(mp, "%s: xfs_defer_finish returned error %d", > __func__, error); > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > } > error = xfs_trans_commit(tp); > if (error) > @@ -2368,7 +2368,7 @@ int > xfs_ifree( > xfs_trans_t *tp, > xfs_inode_t *ip, > - struct xfs_defer_ops *flist) > + struct xfs_defer_ops *dfops) > { > int error; > struct xfs_icluster xic = { 0 }; > @@ -2387,7 +2387,7 @@ xfs_ifree( > if (error) > return error; > > - error = xfs_difree(tp, ip->i_ino, flist, &xic); > + error = xfs_difree(tp, ip->i_ino, dfops, &xic); > if (error) > return error; > > @@ -2490,7 +2490,7 @@ xfs_remove( > xfs_trans_t *tp = NULL; > int is_dir = S_ISDIR(VFS_I(ip)->i_mode); > int error = 0; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t first_block; > uint resblks; > > @@ -2572,9 +2572,9 @@ xfs_remove( > if (error) > goto out_trans_cancel; > > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > error = xfs_dir_removename(tp, dp, name, ip->i_ino, > - &first_block, &free_list, resblks); > + &first_block, &dfops, resblks); > if (error) { > ASSERT(error != -ENOENT); > goto out_bmap_cancel; > @@ -2588,7 +2588,7 @@ xfs_remove( > if (mp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) > xfs_trans_set_sync(tp); > > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto out_bmap_cancel; > > @@ -2602,7 +2602,7 @@ xfs_remove( > return 0; > > out_bmap_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > out_trans_cancel: > xfs_trans_cancel(tp); > std_return: > @@ -2663,7 +2663,7 @@ xfs_sort_for_rename( > static int > xfs_finish_rename( > struct xfs_trans *tp, > - struct xfs_defer_ops *free_list) > + struct xfs_defer_ops *dfops) > { > int error; > > @@ -2674,9 +2674,9 @@ xfs_finish_rename( > if (tp->t_mountp->m_flags & (XFS_MOUNT_WSYNC|XFS_MOUNT_DIRSYNC)) > xfs_trans_set_sync(tp); > > - error = xfs_defer_finish(&tp, free_list, NULL); > + error = xfs_defer_finish(&tp, dfops, NULL); > if (error) { > - xfs_defer_cancel(free_list); > + xfs_defer_cancel(dfops); > xfs_trans_cancel(tp); > return error; > } > @@ -2698,7 +2698,7 @@ xfs_cross_rename( > struct xfs_inode *dp2, > struct xfs_name *name2, > struct xfs_inode *ip2, > - struct xfs_defer_ops *free_list, > + struct xfs_defer_ops *dfops, > xfs_fsblock_t *first_block, > int spaceres) > { > @@ -2710,14 +2710,14 @@ xfs_cross_rename( > /* Swap inode number for dirent in first parent */ > error = xfs_dir_replace(tp, dp1, name1, > ip2->i_ino, > - first_block, free_list, spaceres); > + first_block, dfops, spaceres); > if (error) > goto out_trans_abort; > > /* Swap inode number for dirent in second parent */ > error = xfs_dir_replace(tp, dp2, name2, > ip1->i_ino, > - first_block, free_list, spaceres); > + first_block, dfops, spaceres); > if (error) > goto out_trans_abort; > > @@ -2732,7 +2732,7 @@ xfs_cross_rename( > if (S_ISDIR(VFS_I(ip2)->i_mode)) { > error = xfs_dir_replace(tp, ip2, &xfs_name_dotdot, > dp1->i_ino, first_block, > - free_list, spaceres); > + dfops, spaceres); > if (error) > goto out_trans_abort; > > @@ -2759,7 +2759,7 @@ xfs_cross_rename( > if (S_ISDIR(VFS_I(ip1)->i_mode)) { > error = xfs_dir_replace(tp, ip1, &xfs_name_dotdot, > dp2->i_ino, first_block, > - free_list, spaceres); > + dfops, spaceres); > if (error) > goto out_trans_abort; > > @@ -2798,10 +2798,10 @@ xfs_cross_rename( > } > xfs_trans_ichgtime(tp, dp1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > xfs_trans_log_inode(tp, dp1, XFS_ILOG_CORE); > - return xfs_finish_rename(tp, free_list); > + return xfs_finish_rename(tp, dfops); > > out_trans_abort: > - xfs_defer_cancel(free_list); > + xfs_defer_cancel(dfops); > xfs_trans_cancel(tp); > return error; > } > @@ -2856,7 +2856,7 @@ xfs_rename( > { > struct xfs_mount *mp = src_dp->i_mount; > struct xfs_trans *tp; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t first_block; > struct xfs_inode *wip = NULL; /* whiteout inode */ > struct xfs_inode *inodes[__XFS_SORT_INODES]; > @@ -2945,13 +2945,13 @@ xfs_rename( > goto out_trans_cancel; > } > > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > > /* RENAME_EXCHANGE is unique from here on. */ > if (flags & RENAME_EXCHANGE) > return xfs_cross_rename(tp, src_dp, src_name, src_ip, > target_dp, target_name, target_ip, > - &free_list, &first_block, spaceres); > + &dfops, &first_block, spaceres); > > /* > * Set up the target. > @@ -2973,7 +2973,7 @@ xfs_rename( > */ > error = xfs_dir_createname(tp, target_dp, target_name, > src_ip->i_ino, &first_block, > - &free_list, spaceres); > + &dfops, spaceres); > if (error) > goto out_bmap_cancel; > > @@ -3013,7 +3013,7 @@ xfs_rename( > */ > error = xfs_dir_replace(tp, target_dp, target_name, > src_ip->i_ino, > - &first_block, &free_list, spaceres); > + &first_block, &dfops, spaceres); > if (error) > goto out_bmap_cancel; > > @@ -3048,7 +3048,7 @@ xfs_rename( > */ > error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, > target_dp->i_ino, > - &first_block, &free_list, spaceres); > + &first_block, &dfops, spaceres); > ASSERT(error != -EEXIST); > if (error) > goto out_bmap_cancel; > @@ -3087,10 +3087,10 @@ xfs_rename( > */ > if (wip) { > error = xfs_dir_replace(tp, src_dp, src_name, wip->i_ino, > - &first_block, &free_list, spaceres); > + &first_block, &dfops, spaceres); > } else > error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > - &first_block, &free_list, spaceres); > + &first_block, &dfops, spaceres); > if (error) > goto out_bmap_cancel; > > @@ -3125,13 +3125,13 @@ xfs_rename( > if (new_parent) > xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); > > - error = xfs_finish_rename(tp, &free_list); > + error = xfs_finish_rename(tp, &dfops); > if (wip) > IRELE(wip); > return error; > > out_bmap_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > out_trans_cancel: > xfs_trans_cancel(tp); > out_release_wip: > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index dc93c20..2114d53 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -129,7 +129,7 @@ xfs_iomap_write_direct( > int quota_flag; > int rt; > xfs_trans_t *tp; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > uint qblocks, resblks, resrtextents; > int error; > int lockmode; > @@ -232,18 +232,18 @@ xfs_iomap_write_direct( > * From this point onwards we overwrite the imap pointer that the > * caller gave to us. > */ > - xfs_defer_init(&free_list, &firstfsb); > + xfs_defer_init(&dfops, &firstfsb); > nimaps = 1; > error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb, > bmapi_flags, &firstfsb, resblks, imap, > - &nimaps, &free_list); > + &nimaps, &dfops); > if (error) > goto out_bmap_cancel; > > /* > * Complete the transaction > */ > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto out_bmap_cancel; > > @@ -267,7 +267,7 @@ out_unlock: > return error; > > out_bmap_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > xfs_trans_unreserve_quota_nblks(tp, ip, (long)qblocks, 0, quota_flag); > out_trans_cancel: > xfs_trans_cancel(tp); > @@ -686,7 +686,7 @@ xfs_iomap_write_allocate( > xfs_fileoff_t offset_fsb, last_block; > xfs_fileoff_t end_fsb, map_start_fsb; > xfs_fsblock_t first_block; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_filblks_t count_fsb; > xfs_trans_t *tp; > int nimaps; > @@ -728,7 +728,7 @@ xfs_iomap_write_allocate( > xfs_ilock(ip, XFS_ILOCK_EXCL); > xfs_trans_ijoin(tp, ip, 0); > > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > > /* > * it is possible that the extents have changed since > @@ -784,11 +784,11 @@ xfs_iomap_write_allocate( > error = xfs_bmapi_write(tp, ip, map_start_fsb, > count_fsb, 0, &first_block, > nres, imap, &nimaps, > - &free_list); > + &dfops); > if (error) > goto trans_cancel; > > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto trans_cancel; > > @@ -822,7 +822,7 @@ xfs_iomap_write_allocate( > } > > trans_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > xfs_trans_cancel(tp); > error0: > xfs_iunlock(ip, XFS_ILOCK_EXCL); > @@ -843,7 +843,7 @@ xfs_iomap_write_unwritten( > int nimaps; > xfs_trans_t *tp; > xfs_bmbt_irec_t imap; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsize_t i_size; > uint resblks; > int error; > @@ -887,11 +887,11 @@ xfs_iomap_write_unwritten( > /* > * Modify the unwritten extent state of the buffer. > */ > - xfs_defer_init(&free_list, &firstfsb); > + xfs_defer_init(&dfops, &firstfsb); > nimaps = 1; > error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb, > XFS_BMAPI_CONVERT, &firstfsb, resblks, > - &imap, &nimaps, &free_list); > + &imap, &nimaps, &dfops); > if (error) > goto error_on_bmapi_transaction; > > @@ -910,7 +910,7 @@ xfs_iomap_write_unwritten( > xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > } > > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto error_on_bmapi_transaction; > > @@ -937,7 +937,7 @@ xfs_iomap_write_unwritten( > return 0; > > error_on_bmapi_transaction: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > xfs_trans_cancel(tp); > xfs_iunlock(ip, XFS_ILOCK_EXCL); > return error; > diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c > index c761a6a..802bcc3 100644 > --- a/fs/xfs/xfs_rtalloc.c > +++ b/fs/xfs/xfs_rtalloc.c > @@ -770,7 +770,7 @@ xfs_growfs_rt_alloc( > xfs_daddr_t d; /* disk block address */ > int error; /* error return value */ > xfs_fsblock_t firstblock;/* first block allocated in xaction */ > - struct xfs_defer_ops flist; /* list of freed blocks */ > + struct xfs_defer_ops dfops; /* list of freed blocks */ > xfs_fsblock_t fsbno; /* filesystem block for bno */ > struct xfs_bmbt_irec map; /* block map output */ > int nmap; /* number of block maps */ > @@ -795,14 +795,14 @@ xfs_growfs_rt_alloc( > xfs_ilock(ip, XFS_ILOCK_EXCL); > xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > > - xfs_defer_init(&flist, &firstblock); > + xfs_defer_init(&dfops, &firstblock); > /* > * Allocate blocks to the bitmap file. > */ > nmap = 1; > error = xfs_bmapi_write(tp, ip, oblocks, nblocks - oblocks, > XFS_BMAPI_METADATA, &firstblock, > - resblks, &map, &nmap, &flist); > + resblks, &map, &nmap, &dfops); > if (!error && nmap < 1) > error = -ENOSPC; > if (error) > @@ -810,7 +810,7 @@ xfs_growfs_rt_alloc( > /* > * Free any blocks freed up in the transaction, then commit. > */ > - error = xfs_defer_finish(&tp, &flist, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto out_bmap_cancel; > error = xfs_trans_commit(tp); > @@ -863,7 +863,7 @@ xfs_growfs_rt_alloc( > return 0; > > out_bmap_cancel: > - xfs_defer_cancel(&flist); > + xfs_defer_cancel(&dfops); > out_trans_cancel: > xfs_trans_cancel(tp); > return error; > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 3b005ec..58142ae 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -173,7 +173,7 @@ xfs_symlink( > struct xfs_inode *ip = NULL; > int error = 0; > int pathlen; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > xfs_fsblock_t first_block; > bool unlock_dp_on_error = false; > xfs_fileoff_t first_fsb; > @@ -270,7 +270,7 @@ xfs_symlink( > * Initialize the bmap freelist prior to calling either > * bmapi or the directory create code. > */ > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > > /* > * Allocate an inode for the symlink. > @@ -314,7 +314,7 @@ xfs_symlink( > > error = xfs_bmapi_write(tp, ip, first_fsb, fs_blocks, > XFS_BMAPI_METADATA, &first_block, resblks, > - mval, &nmaps, &free_list); > + mval, &nmaps, &dfops); > if (error) > goto out_bmap_cancel; > > @@ -362,7 +362,7 @@ xfs_symlink( > * Create the directory entry for the symlink. > */ > error = xfs_dir_createname(tp, dp, link_name, ip->i_ino, > - &first_block, &free_list, resblks); > + &first_block, &dfops, resblks); > if (error) > goto out_bmap_cancel; > xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > @@ -377,7 +377,7 @@ xfs_symlink( > xfs_trans_set_sync(tp); > } > > - error = xfs_defer_finish(&tp, &free_list, NULL); > + error = xfs_defer_finish(&tp, &dfops, NULL); > if (error) > goto out_bmap_cancel; > > @@ -393,7 +393,7 @@ xfs_symlink( > return 0; > > out_bmap_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > out_trans_cancel: > xfs_trans_cancel(tp); > out_release_inode: > @@ -427,7 +427,7 @@ xfs_inactive_symlink_rmt( > int done; > int error; > xfs_fsblock_t first_block; > - struct xfs_defer_ops free_list; > + struct xfs_defer_ops dfops; > int i; > xfs_mount_t *mp; > xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; > @@ -466,7 +466,7 @@ xfs_inactive_symlink_rmt( > * Find the block(s) so we can inval and unmap them. > */ > done = 0; > - xfs_defer_init(&free_list, &first_block); > + xfs_defer_init(&dfops, &first_block); > nmaps = ARRAY_SIZE(mval); > error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), > mval, &nmaps, 0); > @@ -486,17 +486,17 @@ xfs_inactive_symlink_rmt( > xfs_trans_binval(tp, bp); > } > /* > - * Unmap the dead block(s) to the free_list. > + * Unmap the dead block(s) to the dfops. > */ > error = xfs_bunmapi(tp, ip, 0, size, 0, nmaps, > - &first_block, &free_list, &done); > + &first_block, &dfops, &done); > if (error) > goto error_bmap_cancel; > ASSERT(done); > /* > * Commit the first transaction. This logs the EFI and the inode. > */ > - error = xfs_defer_finish(&tp, &free_list, ip); > + error = xfs_defer_finish(&tp, &dfops, ip); > if (error) > goto error_bmap_cancel; > /* > @@ -526,7 +526,7 @@ xfs_inactive_symlink_rmt( > return 0; > > error_bmap_cancel: > - xfs_defer_cancel(&free_list); > + xfs_defer_cancel(&dfops); > error_trans_cancel: > xfs_trans_cancel(tp); > error_unlock: > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From lista.unx@gmail.com Tue Aug 2 12:34:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=FREEMAIL_FROM,STOX_REPLY_TYPE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 13A437CA4 for ; Tue, 2 Aug 2016 12:34:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C179A304053 for ; Tue, 2 Aug 2016 10:34:38 -0700 (PDT) X-ASG-Debug-ID: 1470159275-0bf57b369c353bb0001-NocioJ Received: from mail-wm0-f54.google.com (mail-wm0-f54.google.com [74.125.82.54]) by cuda.sgi.com with ESMTP id wNeeB5VjV7zYpBtA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 10:34:36 -0700 (PDT) X-Barracuda-Envelope-From: lista.unx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f54.google.com[74.125.82.54] X-Barracuda-Apparent-Source-IP: 74.125.82.54 Received: by mail-wm0-f54.google.com with SMTP id f65so418107905wmi.0 for ; Tue, 02 Aug 2016 10:34:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:from:to:references:subject:date:mime-version :content-transfer-encoding; bh=7fbDH5Ov2giBrL0r+FpMRYN6aPyLN9Q7HSKSp5ejNII=; b=T+ObDyc4v6SFCaGbdHIP23yRqf1cbQFkcvZzIZ3BZdC/1/AKHcHwgFYnJU2oNa64vK PPy4bwOsdv4St7/o0pxfqXUi7e+K2orx9mFNa42W2H7yMcpRBUU+WPCRb1k4CI5o0Ih4 /Xnig9eMsBxhMbrvpBkoQ0HhgWtgRh69429LHwY3jYDaLifD1PF76LV8k5b4v7MK0k1O pOxwZ9E9rNYIIgWsldqtwOWFvSA5SKMI55qe1fSta2QcjNp4wwf0J3rvf0taQRZNEPnI RqdWcZRgWVpONOO5By6slCli3OTBn61KgHqZ+IUDcLn/7gFYNJbemuy8ZFDyJQlwiyoK OgAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:references:subject:date :mime-version:content-transfer-encoding; bh=7fbDH5Ov2giBrL0r+FpMRYN6aPyLN9Q7HSKSp5ejNII=; b=b5J0QZ7eKHCbb4SnOIkALwbPTroyV0nxgvM1pUapRUkXwdummLI3Wmwimfi+7lFcO6 GnoRvG/hDrlvR7ol/sM0fq0QvG0rBa3vQF/J38QXP35k1gqYNXiEd4aYduIQIVUJaoj4 L0mwprK+rt2T75JAmvDkjVLCT/3+bLHGkoiXZNALwGDvGl2HMtSZLleukQvyFU0c1Puw tgAfYE41i8ceriKjep5o/ISqppv4UElNm/8K8RG+lRuxAuVcD2VQuL9T48SEcxLXvXM0 slwfEnIBM7wFkGvWxi+JmNGTmZAfx/lMTqSN+R381X5jvju/noS2KWXqU1MSAh3PXoM6 x39Q== X-Gm-Message-State: AEkoouuqd6d0F9skIoZSl+x0zJBWT2EU0XRcnax440cNxSQcdhYmd3g0MKVF5f3ATJBPOQ== X-Received: by 10.28.5.9 with SMTP id 9mr19789546wmf.74.1470159275536; Tue, 02 Aug 2016 10:34:35 -0700 (PDT) Received: from dinulap (dev155.demoshop.ro. [5.2.129.155]) by smtp.gmail.com with ESMTPSA id k186sm23015041wmd.13.2016.08.02.10.34.34 (version=TLS1 cipher=DES-CBC3-SHA bits=112/168); Tue, 02 Aug 2016 10:34:34 -0700 (PDT) Message-ID: <299CA9DAF3C04126BA9722C2DC7F5730@dinulap> From: "Lista Unx" To: "Carlos E. R." , "XFS mailing list" References: <4278AB9734C1445A8E48635B155149F8@dinulap><20160729233524.GD16044@dastard><57CF7681619F42CCB4C0CF589E9686E5@dinulap> Subject: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug Date: Tue, 2 Aug 2016 20:34:35 +0300 X-ASG-Orig-Subj: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="UTF-8"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Barracuda-Connect: mail-wm0-f54.google.com[74.125.82.54] X-Barracuda-Start-Time: 1470159276 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 910 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature ----- Original Message ----- From: "Carlos E. R." To: "XFS mailing list" Sent: Monday, August 01, 2016 3:23 PM Subject: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug > Dave refers to a unix/linux "feature". Files can be deleted, but if > they are in use at the time, the contents are not deleted. Disk shows an > ammount of free space that does not match the total - used space. > It haS been checked! See below a snip from my first post. #lsof -nP |grep -i delete|wc -l 0 #find /proc/*/fd -ls | grep -i dele|wc -l 0 > However, a reboot clears this situation, and you did say in the original > post you had rebooted the system. Yes, tried also reboot which does not solve the problem. Its obvious that till not run xfs_repair, we can't conclude more. This will happen next days ... From lista.unx@gmail.com Tue Aug 2 12:34:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=FREEMAIL_FROM,STOX_REPLY_TYPE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8C28F7CB1 for ; Tue, 2 Aug 2016 12:34:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5EE458F8037 for ; Tue, 2 Aug 2016 10:34:44 -0700 (PDT) X-ASG-Debug-ID: 1470159281-0bf57c13682f48f0001-NocioJ Received: from mail-wm0-f47.google.com (mail-wm0-f47.google.com [74.125.82.47]) by cuda.sgi.com with ESMTP id 8gfIXOriptECpeTX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 10:34:42 -0700 (PDT) X-Barracuda-Envelope-From: lista.unx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f47.google.com[74.125.82.47] X-Barracuda-Apparent-Source-IP: 74.125.82.47 Received: by mail-wm0-f47.google.com with SMTP id o80so300991565wme.1 for ; Tue, 02 Aug 2016 10:34:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:from:to:references:subject:date:mime-version :content-transfer-encoding; bh=7fbDH5Ov2giBrL0r+FpMRYN6aPyLN9Q7HSKSp5ejNII=; b=puv4JJUw11i/fSV8BghlQfSF1y1Jh6++DZsmzHXnlkKn6tVKRAndkCOkW+fRMfTtiX zE6KlGoA73e6p4xXSDZEi8pjh9f/e8sUg6Vk3pfFsRJwxFTLLo9RKl8RK2gvYEawoOwe anEqhA0LDEeU3SVldLW3//DjJDHmYWX7Fu2v1i29c2YsbCBTWzBYWrCh8IKvthu+R95c hKPONIaNZNECvNw3XwXilug4NRIGI1wxTzPAWFnpiaqHoubTHUn32qv9yDPH15fZHgIM JKVfwZKRGQV7qcg2vvx8JTeO5q47kvDjR7gpcvSX2rogoQ2ZQc6AA/D8q2r5+3/o5zzp UGzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:references:subject:date :mime-version:content-transfer-encoding; bh=7fbDH5Ov2giBrL0r+FpMRYN6aPyLN9Q7HSKSp5ejNII=; b=LPN14OtbdQQ2YqEShH7TLfYWIk7w+EBdd7Ph1GwcP8X1/+wKIIo3Lb0bChRIQeQaM/ RI9iXyuR+3sfYQxiC+1cqvxbK6054RNGp/W+cLnPrbGOQ6hJ4jxtSkUW6htjGAVk8kOI zByluTZ1gJ0sGY4v3agcN053V+9kqIFAh2H4s8AR+D8FSKH0Zg3k5j3dGIGSK051NnOI S5hKaREJUXsEoaBEz3gDwEvbn4ZcVjangG8SIh6DF60u/PT+c6iDrLk/LXjJnzwKF0qR sjKRnH3aHwgwocTZjCtDKPAowGfrGSXfCj6XUU9owT3JckpZU8EJBLq92/vEbS5QzSwc 6dBA== X-Gm-Message-State: AEkoouvELGx5I/ClGOWnC3FidiyQj3Jy2KBSQfeckfhvJALO1zKxrR9m+TuPUPntXGIwlg== X-Received: by 10.194.79.161 with SMTP id k1mr4669203wjx.119.1470159281404; Tue, 02 Aug 2016 10:34:41 -0700 (PDT) Received: from dinulap (dev155.demoshop.ro. [5.2.129.155]) by smtp.gmail.com with ESMTPSA id u125sm23023226wmg.22.2016.08.02.10.34.40 (version=TLS1 cipher=DES-CBC3-SHA bits=112/168); Tue, 02 Aug 2016 10:34:40 -0700 (PDT) Message-ID: From: "Lista Unx" To: "Carlos E. R." , "XFS mailing list" References: <4278AB9734C1445A8E48635B155149F8@dinulap><20160729233524.GD16044@dastard><57CF7681619F42CCB4C0CF589E9686E5@dinulap> Subject: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug Date: Tue, 2 Aug 2016 20:34:41 +0300 X-ASG-Orig-Subj: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="UTF-8"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Barracuda-Connect: mail-wm0-f47.google.com[74.125.82.47] X-Barracuda-Start-Time: 1470159282 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 910 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature ----- Original Message ----- From: "Carlos E. R." To: "XFS mailing list" Sent: Monday, August 01, 2016 3:23 PM Subject: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug > Dave refers to a unix/linux "feature". Files can be deleted, but if > they are in use at the time, the contents are not deleted. Disk shows an > ammount of free space that does not match the total - used space. > It haS been checked! See below a snip from my first post. #lsof -nP |grep -i delete|wc -l 0 #find /proc/*/fd -ls | grep -i dele|wc -l 0 > However, a reboot clears this situation, and you did say in the original > post you had rebooted the system. Yes, tried also reboot which does not solve the problem. Its obvious that till not run xfs_repair, we can't conclude more. This will happen next days ... From lista.unx@gmail.com Tue Aug 2 12:58:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=FREEMAIL_FROM,STOX_REPLY_TYPE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 59CF77CA4 for ; Tue, 2 Aug 2016 12:58:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BC246AC004 for ; Tue, 2 Aug 2016 10:58:05 -0700 (PDT) X-ASG-Debug-ID: 1470160682-0bf57c13692f5320001-NocioJ Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com [74.125.82.50]) by cuda.sgi.com with ESMTP id p6PdW3osvxVEu0yj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 10:58:03 -0700 (PDT) X-Barracuda-Envelope-From: lista.unx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f50.google.com[74.125.82.50] X-Barracuda-Apparent-Source-IP: 74.125.82.50 Received: by mail-wm0-f50.google.com with SMTP id f65so418787928wmi.0 for ; Tue, 02 Aug 2016 10:58:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:from:to:references:subject:date:mime-version :content-transfer-encoding; bh=CTAHw1WXKCcIioMs53TOe7nt+Qqwj/cwXksZnSyEOiI=; b=j36UN3ZVwRQCATYgfW9D1GRTAoEZ8WrxLTvlP8aPSwaS4HFMB8xVOfaIUwzebzCIfi Fy8VAQ/cY/ZgDR20UJE3TZiMRwxySWnjDgOy1dYYZlCdU4YeS6eXHuHO0xMACFOoaJAO k9DlQZGtkVIbI2DGBhB/yRrG0oPNy5yW5xwTT2l+VkLfXCKund94zBDrwbOHjB+iBVDr t3/W4eemTp9b5V/yE2+IL+Ckj3gCG8KkVKeJ2woMXSVj4k08rdqrbfUjUSavuwFYH7/E Y0DpsT42FHMcFLXdMiHc+9JeiIafp7ngQgbr16uD6MvGVvsouG3bratEqLZbQDDePS5v awIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:references:subject:date :mime-version:content-transfer-encoding; bh=CTAHw1WXKCcIioMs53TOe7nt+Qqwj/cwXksZnSyEOiI=; b=fN6SaN/mM0y7vq6Tmjn79KUv0p9sCfKV5Nou6NeiJokwFNOcU6Oupkqc6FpV3CYzkb q6x8oO+NLTX1xqLl8fhSHk/tPJZKOeTFHSi6kd4TApnjKJJbHWfe1d2+WGbGqKDmYgoY U6bg9qUTdls1aZM4uEUkf3xE9KsHHv2FQEddNtFWE2f/yPZglNVYaWa8Ht7GnYJl262E Vdu5p9sipEGZTCewhIOKbVqk6z3D/m58M0WLgMmRMqy7pGKAGd/ol0U7UX+Hiy1pjQHu 0EnH4tN5ZgrpqdhgH0fwiSvdiWSXrUew4UaMokjbSgrELk99Ma7/eeW9cLdV70vIjxdi wX1Q== X-Gm-Message-State: AEkooutCh/IZzFqdGMyQFV4jf4YO1/J0zEPFw6dT60Ev4RrTyn+87/DF5A+lDXNI/YgABA== X-Received: by 10.28.38.196 with SMTP id m187mr19611757wmm.81.1470160681987; Tue, 02 Aug 2016 10:58:01 -0700 (PDT) Received: from dinulap (dev155.demoshop.ro. [5.2.129.155]) by smtp.gmail.com with ESMTPSA id c10sm3723113wjk.22.2016.08.02.10.58.00 (version=TLS1 cipher=DES-CBC3-SHA bits=112/168); Tue, 02 Aug 2016 10:58:01 -0700 (PDT) Message-ID: <5B47A77EB08F49A9B0843A6215A24C64@dinulap> From: "Lista Unx" To: "Chris Murphy" , References: <4278AB9734C1445A8E48635B155149F8@dinulap><20160729233524.GD16044@dastard><57CF7681619F42CCB4C0CF589E9686E5@dinulap> Subject: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug Date: Tue, 2 Aug 2016 20:58:01 +0300 X-ASG-Orig-Subj: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Barracuda-Connect: mail-wm0-f50.google.com[74.125.82.50] X-Barracuda-Start-Time: 1470160683 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1243 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31698 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature ----- Original Message ----- From: "Chris Murphy" To: Sent: Monday, August 01, 2016 7:51 PM Subject: Re: partition 100% full No space left on device. looks like xfsiscorrupted or a bug > On Mon, Aug 1, 2016 at 6:00 AM, Lista Unx wrote: > >> Yes, I've created a new gmail account especially to be able to post to >> this >> mailing list which is filtering very seriously legit messages comming >> from >> legit users, just because they are comming from yahoo accounts (servers) >> ... > > It's a Yahoo policy. It's completely reasonable for lists to reject > yahoo.com emails, but ideally it'd reject them at signup time. > > https://help.yahoo.com/kb/SLN24050.html > https://help.yahoo.com/kb/mail/SLN24016.html?impressions=true > http://www.pcworld.com/article/2141120/yahoo-email-antispoofing-policy-breaks-mailing-lists.html > > Ok, I understand. In this case: 1. Is a good idea to not allow those using yahoo accounts to subscribe to this list (with a clear message regarding why you are doing it) and 2. Reject all messages comming from users which does not have valid membership on this list (for sure, you will reduce spam) From bfoster@redhat.com Tue Aug 2 13:47:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C54067CA4 for ; Tue, 2 Aug 2016 13:47:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9741A304039 for ; Tue, 2 Aug 2016 11:47:38 -0700 (PDT) X-ASG-Debug-ID: 1470163656-0bf57c13672f6990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Shfqvs9EJQuMe06u (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 11:47:37 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 37736C03070B; Tue, 2 Aug 2016 18:47:36 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72IlZhw000862; Tue, 2 Aug 2016 14:47:35 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id BB869120BDC; Tue, 2 Aug 2016 14:47:34 -0400 (EDT) Date: Tue, 2 Aug 2016 14:47:34 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 18/47] xfs: refactor redo intent item processing Message-ID: <20160802184734.GA58152@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 18/47] xfs: refactor redo intent item processing References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907708421.25461.405239727630066080.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907708421.25461.405239727630066080.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 02 Aug 2016 18:47:36 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470163657 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6043 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:58:04PM -0700, Darrick J. Wong wrote: > Refactor the EFI intent item recovery (and cancellation) functions > into a general function that scans the AIL and an intent item type > specific handler. Move the function that recovers a single EFI item > into the extent free item code. We'll want the generalized function > when we start wiring up more redo item types. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/xfs_extfree_item.c | 65 ++++++++++++++++ > fs/xfs/xfs_extfree_item.h | 3 + > fs/xfs/xfs_log_recover.c | 182 +++++++++++++++++++++------------------------ > 3 files changed, 151 insertions(+), 99 deletions(-) > > ... > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 080b54b..af608aa 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -24,7 +24,6 @@ > #include "xfs_bit.h" > #include "xfs_sb.h" > #include "xfs_mount.h" > -#include "xfs_defer.h" > #include "xfs_da_format.h" > #include "xfs_da_btree.h" > #include "xfs_inode.h" > @@ -4165,126 +4164,112 @@ xlog_recover_process_data( ... > STATIC int > -xlog_recover_process_efis( > +xlog_recover_process_intents( > struct xlog *log) > { > struct xfs_log_item *lip; > - struct xfs_efi_log_item *efip; > int error = 0; > struct xfs_ail_cursor cur; > struct xfs_ail *ailp; > + xfs_lsn_t last_lsn; > > ailp = log->l_ailp; > spin_lock(&ailp->xa_lock); > lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); > + last_lsn = xlog_assign_lsn(log->l_curr_cycle, log->l_curr_block); > while (lip != NULL) { > /* > - * We're done when we see something other than an EFI. > - * There should be no EFIs left in the AIL now. > + * We're done when we see something other than an intent. > + * There should be no intents left in the AIL now. > */ > - if (lip->li_type != XFS_LI_EFI) { > + if (!xlog_item_is_intent(lip)) { > #ifdef DEBUG > for (; lip; lip = xfs_trans_ail_cursor_next(ailp, &cur)) > - ASSERT(lip->li_type != XFS_LI_EFI); > + ASSERT(!xlog_item_is_intent(lip)); > #endif > break; > } > > /* > - * Skip EFIs that we've already processed. > + * We should never see a redo item with a LSN higher than > + * the last transaction we found in the log at the start > + * of recovery. > */ > - efip = container_of(lip, struct xfs_efi_log_item, efi_item); > - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) { > - lip = xfs_trans_ail_cursor_next(ailp, &cur); > - continue; > - } > + ASSERT(XFS_LSN_CMP(last_lsn, lip->li_lsn) >= 0); > > - spin_unlock(&ailp->xa_lock); > - error = xlog_recover_process_efi(log->l_mp, efip); > - spin_lock(&ailp->xa_lock); > + switch (lip->li_type) { > + case XFS_LI_EFI: > + error = xlog_recover_process_efi(log->l_mp, ailp, lip); > + break; > + } I think I'd prefer to see the locking remain here rather than get buried in the helper functions. That said, this allows us to check the recovered bit without a lock cycle. Meh, either way: Reviewed-by: Brian Foster > if (error) > goto out; > lip = xfs_trans_ail_cursor_next(ailp, &cur); > @@ -4296,15 +4281,14 @@ out: > } > > /* > - * A cancel occurs when the mount has failed and we're bailing out. Release all > - * pending EFIs so they don't pin the AIL. > + * A cancel occurs when the mount has failed and we're bailing out. > + * Release all pending log intent items so they don't pin the AIL. > */ > STATIC int > -xlog_recover_cancel_efis( > +xlog_recover_cancel_intents( > struct xlog *log) > { > struct xfs_log_item *lip; > - struct xfs_efi_log_item *efip; > int error = 0; > struct xfs_ail_cursor cur; > struct xfs_ail *ailp; > @@ -4314,22 +4298,22 @@ xlog_recover_cancel_efis( > lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); > while (lip != NULL) { > /* > - * We're done when we see something other than an EFI. > - * There should be no EFIs left in the AIL now. > + * We're done when we see something other than an intent. > + * There should be no intents left in the AIL now. > */ > - if (lip->li_type != XFS_LI_EFI) { > + if (!xlog_item_is_intent(lip)) { > #ifdef DEBUG > for (; lip; lip = xfs_trans_ail_cursor_next(ailp, &cur)) > - ASSERT(lip->li_type != XFS_LI_EFI); > + ASSERT(!xlog_item_is_intent(lip)); > #endif > break; > } > > - efip = container_of(lip, struct xfs_efi_log_item, efi_item); > - > - spin_unlock(&ailp->xa_lock); > - xfs_efi_release(efip); > - spin_lock(&ailp->xa_lock); > + switch (lip->li_type) { > + case XFS_LI_EFI: > + xlog_recover_cancel_efi(log->l_mp, ailp, lip); > + break; > + } > > lip = xfs_trans_ail_cursor_next(ailp, &cur); > } > @@ -5140,16 +5124,16 @@ xlog_recover_finish( > */ > if (log->l_flags & XLOG_RECOVERY_NEEDED) { > int error; > - error = xlog_recover_process_efis(log); > + error = xlog_recover_process_intents(log); > if (error) { > - xfs_alert(log->l_mp, "Failed to recover EFIs"); > + xfs_alert(log->l_mp, "Failed to recover intents"); > return error; > } > /* > - * Sync the log to get all the EFIs out of the AIL. > + * Sync the log to get all the intents out of the AIL. > * This isn't absolutely necessary, but it helps in > * case the unlink transactions would have problems > - * pushing the EFIs out of the way. > + * pushing the intents out of the way. > */ > xfs_log_force(log->l_mp, XFS_LOG_SYNC); > > @@ -5174,7 +5158,7 @@ xlog_recover_cancel( > int error = 0; > > if (log->l_flags & XLOG_RECOVERY_NEEDED) > - error = xlog_recover_cancel_efis(log); > + error = xlog_recover_cancel_intents(log); > > return error; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 2 13:48:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 231337CA4 for ; Tue, 2 Aug 2016 13:48:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8D253AC001 for ; Tue, 2 Aug 2016 11:48:04 -0700 (PDT) X-ASG-Debug-ID: 1470163682-0bf57b369b355d50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CkGyfO2jvSRD2LWI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 11:48:03 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3413885A07; Tue, 2 Aug 2016 18:48:02 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72Im1pP028102; Tue, 2 Aug 2016 14:48:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E8844120BDC; Tue, 2 Aug 2016 14:48:00 -0400 (EDT) Date: Tue, 2 Aug 2016 14:48:00 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 19/47] xfs: add tracepoints and error injection for deferred extent freeing Message-ID: <20160802184800.GB58152@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 19/47] xfs: add tracepoints and error injection for deferred extent freeing References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907709074.25461.17602977707506082040.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907709074.25461.17602977707506082040.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 02 Aug 2016 18:48:02 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470163682 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3821 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:58:10PM -0700, Darrick J. Wong wrote: > Add a couple of tracepoints for the deferred extent free operation and > a site for injecting errors while finishing the operation. This makes > it easier to debug deferred ops and test log redo. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/libxfs/xfs_alloc.c | 7 +++++++ > fs/xfs/libxfs/xfs_bmap.c | 2 ++ > fs/xfs/xfs_error.h | 4 +++- > fs/xfs/xfs_trace.h | 5 ++++- > 4 files changed, 16 insertions(+), 2 deletions(-) > > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index 5993f87..22ac3f1 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -2702,6 +2702,13 @@ xfs_free_extent( > > ASSERT(len != 0); > > + trace_xfs_bmap_free_deferred(mp, agno, 0, agbno, len); > + Hmm, but the bmap code isn't the only caller here. I was thinking that maybe we'd be better served by pushing these down into xfs_defer_add() and friends, but I guess we don't necessarily have the extent information at that layer. How about we just rename these tracepoints to match the function names so they don't confuse me in the future? :) > + if (XFS_TEST_ERROR(false, mp, > + XFS_ERRTAG_FREE_EXTENT, > + XFS_RANDOM_FREE_EXTENT)) > + return -EIO; > + > error = xfs_free_extent_fix_freelist(tp, agno, &agbp); > if (error) > return error; > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 540a6b7..8e14ff4 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -596,6 +596,8 @@ xfs_bmap_add_free( > new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); > new->xefi_startblock = bno; > new->xefi_blockcount = (xfs_extlen_t)len; > + trace_xfs_bmap_free_defer(mp, XFS_FSB_TO_AGNO(mp, bno), 0, > + XFS_FSB_TO_AGBNO(mp, bno), len); > xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_FREE, &new->xefi_list); > } > > diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h > index 2e4f67f..da6f951 100644 > --- a/fs/xfs/xfs_error.h > +++ b/fs/xfs/xfs_error.h > @@ -90,7 +90,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp); > #define XFS_ERRTAG_STRATCMPL_IOERR 19 > #define XFS_ERRTAG_DIOWRITE_IOERR 20 > #define XFS_ERRTAG_BMAPIFORMAT 21 > -#define XFS_ERRTAG_MAX 22 > +#define XFS_ERRTAG_FREE_EXTENT 22 > +#define XFS_ERRTAG_MAX 23 > > /* > * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. > @@ -117,6 +118,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); > #define XFS_RANDOM_STRATCMPL_IOERR (XFS_RANDOM_DEFAULT/10) > #define XFS_RANDOM_DIOWRITE_IOERR (XFS_RANDOM_DEFAULT/10) > #define XFS_RANDOM_BMAPIFORMAT XFS_RANDOM_DEFAULT > +#define XFS_RANDOM_FREE_EXTENT 1 > Why not XFS_RANDOM_DEFAULT? Brian > #ifdef DEBUG > extern int xfs_error_test_active; > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index a45b030..939caf5 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -2417,9 +2417,12 @@ DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_cancel); > DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_finish); > DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_abort); > > -DEFINE_PHYS_EXTENT_DEFERRED_EVENT(xfs_defer_phys_extent); > DEFINE_MAP_EXTENT_DEFERRED_EVENT(xfs_defer_map_extent); > > +#define DEFINE_BMAP_FREE_DEFERRED_EVENT DEFINE_PHYS_EXTENT_DEFERRED_EVENT > +DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_defer); > +DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_deferred); > + > #endif /* _TRACE_XFS_H */ > > #undef TRACE_INCLUDE_PATH > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 2 13:48:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A39CA7CA4 for ; Tue, 2 Aug 2016 13:48:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29717AC001 for ; Tue, 2 Aug 2016 11:48:49 -0700 (PDT) X-ASG-Debug-ID: 1470163728-0bf8157e6d3cf180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id e2istbrTdiyzoXny (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 11:48:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B7E7B4E022; Tue, 2 Aug 2016 18:48:47 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72ImlSS001650; Tue, 2 Aug 2016 14:48:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 81915120BDC; Tue, 2 Aug 2016 14:48:46 -0400 (EDT) Date: Tue, 2 Aug 2016 14:48:46 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 20/47] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt Message-ID: <20160802184845.GC58152@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 20/47] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907709719.25461.3104352212846077948.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907709719.25461.3104352212846077948.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 02 Aug 2016 18:48:47 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470163728 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1458 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Jul 20, 2016 at 09:58:17PM -0700, Darrick J. Wong wrote: > By my calculations, a 1,073,741,824 block AG with a 1k block size > can attain a maximum height of 9. Assuming a record size of 24 > bytes, a key/ptr size of 44 bytes, and half-full btree nodes, > we'd need 53,687,092 blocks for the records and ~6 million blocks > for the keys. That requires a btree of height 9. > > Signed-off-by: Darrick J. Wong > --- I believe you.. :) but could you add a bit more detail to the commit log just to describe the calculations (e.g., how many records per leaf block, keys per node block) so 1.) I don't have to try and figure it out ;) (and probably get it wrong) and 2.) so we have a reference in the git repo going forward? Brian > fs/xfs/libxfs/xfs_btree.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > index b8bbb21..629ef4f 100644 > --- a/fs/xfs/libxfs/xfs_btree.h > +++ b/fs/xfs/libxfs/xfs_btree.h > @@ -133,7 +133,7 @@ do { \ > } \ > } while (0) > > -#define XFS_BTREE_MAXLEVELS 8 /* max of all btrees */ > +#define XFS_BTREE_MAXLEVELS 9 /* max of all btrees */ > > struct xfs_btree_ops { > /* size of the key and record structures */ > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jeffm@suse.com Tue Aug 2 13:51:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4983F7CA4 for ; Tue, 2 Aug 2016 13:51:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 19B28304039 for ; Tue, 2 Aug 2016 11:51:16 -0700 (PDT) X-ASG-Debug-ID: 1470163870-0bf57b369d355f30001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id eGgzCAOGjAn60itq (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 02 Aug 2016 11:51:11 -0700 (PDT) X-Barracuda-Envelope-From: jeffm@suse.com X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 00A58AAD1; Tue, 2 Aug 2016 18:51:10 +0000 (UTC) Subject: Re: Old bugs in xfsprogs? To: Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Old bugs in xfsprogs? References: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> <626eedea-2b9a-4ca3-cd3d-1e528f45526f@sandeen.net> From: Jeff Mahoney Message-ID: <74fde7f6-54a2-078f-6064-d9e32564f9a7@suse.com> Date: Tue, 2 Aug 2016 14:51:06 -0400 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <626eedea-2b9a-4ca3-cd3d-1e528f45526f@sandeen.net> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="OkkOVG4prTUTD7bkTVxPEP8qL1jqf1LAE" X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470163871 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-ASG-Orig-Subj: Re: Old bugs in xfsprogs? X-Barracuda-Scan-Msg-Size: 27295 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --OkkOVG4prTUTD7bkTVxPEP8qL1jqf1LAE Content-Type: multipart/mixed; boundary="Ip5vvUTc7UusOCKoPV4xFml4tRq3onsnd" From: Jeff Mahoney To: Eric Sandeen , xfs@oss.sgi.com Message-ID: <74fde7f6-54a2-078f-6064-d9e32564f9a7@suse.com> Subject: Re: Old bugs in xfsprogs? References: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> <626eedea-2b9a-4ca3-cd3d-1e528f45526f@sandeen.net> In-Reply-To: <626eedea-2b9a-4ca3-cd3d-1e528f45526f@sandeen.net> --Ip5vvUTc7UusOCKoPV4xFml4tRq3onsnd Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 8/2/16 11:00 AM, Eric Sandeen wrote: > On 8/2/16 8:20 AM, Jeff Mahoney wrote: >> Hi all - >> >> While investigating a weird report on an internal list I found a few o= ld >> commits that don't look quite right and that may be very old bugs. I >> know it's hard to go back nearly 15 years, especially in the days wher= e >> very short commit messages were still acceptable, and try to remember >> why certain changes happened. In this case, a weird corner case[1] >> would've been caught, xfs_repair would've bailed, and a file system ma= y >> have survived (despite obvious user error). >> >> 1/ Commit 5000d01d212f (white space cleanup) >=20 > Meh, not a white space cleanup, is it! >=20 >> diff --git a/libxlog/util.c b/libxlog/util.c >> index 7aca165..aa3093d 100644 >> --- a/libxlog/util.c >> +++ b/libxlog/util.c >> @@ -49,8 +49,10 @@ header_check_uuid(xfs_mount_t *mp, xlog_rec_header_= t >> *head) >> printf("* ERROR: mismatched uuid in log\n" >> "* SB : %s\n* log: %s\n", >> uu_sb, uu_log); >> + >> + memcpy(&mp->m_sb.sb_uuid, head->h_fs_uuid, sizeof(uuid_t)); >> >> - return 1; >> + return 0; >> } >=20 > However, after seeing the mismatch, it "fixes" it by copying the header= > uuid into the mount point uuid. >=20 > But that doesn't seem like the right approach at all, and it renders al= l > the callers who check the return value of header_check_uuid pointless. > So yeah, doesn't look good to me. >=20 >> This one may well have been intended as a repair operation or perhaps = it >> was accidentally duplicated from another chunk in the patch. At any >> rate, it hides a mismatched UUID between the log and the superblock fr= om >> the rest of xfs_repair. The user sees the "error" message but it >> carries on anyway. >> >> 2) Commit d321ceac8da (add libxlog directory.) >> >> I believe this was supposed to be as simple as pushing some >> functionality from logprint into a new libxlog library, but the result= >> is that things that used to return an error no longer did. The >> print_exit global that was initialized to 1 in logprint is initialized= >> to 0 in libxlog and never set. So we always print an error message bu= t >> then carry on. So even if the header_check_uuid() call above would fa= il >> properly, the error is printed and then the error condition ignored. >=20 > Sigh, yeah, the old commits are wild west. :( >=20 > In this case header_check_uuid returned 0 anyway,so print_exit would > not have helped, but I think you're right. >=20 > A perfect storm of derp. ;) Haha, yep. >> -Jeff >> >> [1] The details are still murky, but what I got was that the user ran >> xfs_repair -L (yup, i know) on an image file that contained partitions= =2E >> It found a valid XFS superblock and then "repaired" the file system to= >> an empty state since everything it found was "corrupt." I suspect tha= t >> there was an XFS file system on the raw image file, which was then >> partitioned without clearing the MBR, and the expected XFS file system= >> was created on the first partition. xfs_repair was pointed at the who= le >> image file, discovered the old superblock, and remade the fs in its ow= n >> image since nothing was at the proper locations. >=20 > Oh, so it found 4 matching, old, valid, superblocks? Ugh. I don't kno= w > how to protect against that, although it probably should hav= e > found a few non-matching supers along the way as well. I wonder if we > should be more cautious in that case. Well, it at least found the non-matching log but then ran into the trouble above. > I could imagine that maybe for each candidate super we find, we should > look at its geometry, and spot-check the other locations that it indica= tes > should contain a superblock. If we get enough semi-valid but conflicti= ng > "sets," maybe we should bail out and ask. It's quite a corner case, th= o. I'm not sure a geometry check would've helped here. The superblock geometry still would've covered the whole, unpartitioned device. Since we're already linking with blkid, maybe a check to see if there's a partition table on the device and bail if it sees one, unless forced? The part that I'm still trying to explain is how it managed to get a good magic from the log and then got the wrong uuid. > Any chance you have full xfs_repair output? Sure, below. I heard back from the reporter and confirmed that my hypothesis of mkfs -> fdisk -> mkfs was what happened. He's on SLE12 SP1, so that means xfsprogs 3.2.1. -Jeff --- labadmin:/ssd # xfs_repair postgre.raw -L Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes sb root inode value 18446744073709551615 (NULLFSINO) inconsistent with calculated value 128 resetting superblock root inode pointer to 128 sb realtime bitmap inode 18446744073709551615 (NULLFSINO) inconsistent with calculated value 129 resetting superblock realtime bitmap ino pointer to 129 sb realtime summary inode 18446744073709551615 (NULLFSINO) inconsistent with calculated value 130 resetting superblock realtime summary ino pointer to 130 Phase 2 - using internal log - zero log... * ERROR: mismatched uuid in log * SB : ae384026-e3ac-4350-90b8-6dc1ac91595d * log: 4cb79a9a-4b85-40fd-aed5-c7f2de36a3f5 ALERT: The filesystem has valuable metadata changes in a log which is bei= ng destroyed because the -L option was used. - scan filesystem freespace and inode maps... Metadata corruption detected at block 0x1/0x200 Metadata corruption detected at block 0x2/0x200 bad magic # 0x0 for agf 0 bad version # 0 for agf 0 bad length 0 for agf 0, should be 491520 bad magic # 0x0 for agi 0 bad version # 0 for agi 0 bad length # 0 for agi 0, should be 491520 reset bad agf for ag 0 reset bad agi for ag 0 bad agbno 0 for btbno root, agno 0 bad agbno 0 for btbcnt root, agno 0 bad agbno 0 for inobt root, agno 0 agi unlinked bucket 0 is 0 in ag 0 (inode=3D0) agi unlinked bucket 1 is 0 in ag 0 (inode=3D0) agi unlinked bucket 2 is 0 in ag 0 (inode=3D0) agi unlinked bucket 3 is 0 in ag 0 (inode=3D0) agi unlinked bucket 4 is 0 in ag 0 (inode=3D0) agi unlinked bucket 5 is 0 in ag 0 (inode=3D0) agi unlinked bucket 6 is 0 in ag 0 (inode=3D0) agi unlinked bucket 7 is 0 in ag 0 (inode=3D0) agi unlinked bucket 8 is 0 in ag 0 (inode=3D0) agi unlinked bucket 9 is 0 in ag 0 (inode=3D0) agi unlinked bucket 10 is 0 in ag 0 (inode=3D0) agi unlinked bucket 11 is 0 in ag 0 (inode=3D0) agi unlinked bucket 12 is 0 in ag 0 (inode=3D0) agi unlinked bucket 13 is 0 in ag 0 (inode=3D0) agi unlinked bucket 14 is 0 in ag 0 (inode=3D0) agi unlinked bucket 15 is 0 in ag 0 (inode=3D0) agi unlinked bucket 16 is 0 in ag 0 (inode=3D0) agi unlinked bucket 17 is 0 in ag 0 (inode=3D0) agi unlinked bucket 18 is 0 in ag 0 (inode=3D0) agi unlinked bucket 19 is 0 in ag 0 (inode=3D0) agi unlinked bucket 20 is 0 in ag 0 (inode=3D0) agi unlinked bucket 21 is 0 in ag 0 (inode=3D0) agi unlinked bucket 22 is 0 in ag 0 (inode=3D0) agi unlinked bucket 23 is 0 in ag 0 (inode=3D0) agi unlinked bucket 24 is 0 in ag 0 (inode=3D0) agi unlinked bucket 25 is 0 in ag 0 (inode=3D0) agi unlinked bucket 26 is 0 in ag 0 (inode=3D0) agi unlinked bucket 27 is 0 in ag 0 (inode=3D0) agi unlinked bucket 28 is 0 in ag 0 (inode=3D0) agi unlinked bucket 29 is 0 in ag 0 (inode=3D0) agi unlinked bucket 30 is 0 in ag 0 (inode=3D0) agi unlinked bucket 31 is 0 in ag 0 (inode=3D0) agi unlinked bucket 32 is 0 in ag 0 (inode=3D0) agi unlinked bucket 33 is 0 in ag 0 (inode=3D0) agi unlinked bucket 34 is 0 in ag 0 (inode=3D0) agi unlinked bucket 35 is 0 in ag 0 (inode=3D0) agi unlinked bucket 36 is 0 in ag 0 (inode=3D0) agi unlinked bucket 37 is 0 in ag 0 (inode=3D0) agi unlinked bucket 38 is 0 in ag 0 (inode=3D0) agi unlinked bucket 39 is 0 in ag 0 (inode=3D0) agi unlinked bucket 40 is 0 in ag 0 (inode=3D0) agi unlinked bucket 41 is 0 in ag 0 (inode=3D0) agi unlinked bucket 42 is 0 in ag 0 (inode=3D0) agi unlinked bucket 43 is 0 in ag 0 (inode=3D0) agi unlinked bucket 44 is 0 in ag 0 (inode=3D0) agi unlinked bucket 45 is 0 in ag 0 (inode=3D0) agi unlinked bucket 46 is 0 in ag 0 (inode=3D0) agi unlinked bucket 47 is 0 in ag 0 (inode=3D0) agi unlinked bucket 48 is 0 in ag 0 (inode=3D0) agi unlinked bucket 49 is 0 in ag 0 (inode=3D0) agi unlinked bucket 50 is 0 in ag 0 (inode=3D0) agi unlinked bucket 51 is 0 in ag 0 (inode=3D0) agi unlinked bucket 52 is 0 in ag 0 (inode=3D0) agi unlinked bucket 53 is 0 in ag 0 (inode=3D0) agi unlinked bucket 54 is 0 in ag 0 (inode=3D0) agi unlinked bucket 55 is 0 in ag 0 (inode=3D0) agi unlinked bucket 56 is 0 in ag 0 (inode=3D0) agi unlinked bucket 57 is 0 in ag 0 (inode=3D0) agi unlinked bucket 58 is 0 in ag 0 (inode=3D0) agi unlinked bucket 59 is 0 in ag 0 (inode=3D0) agi unlinked bucket 60 is 0 in ag 0 (inode=3D0) agi unlinked bucket 61 is 0 in ag 0 (inode=3D0) agi unlinked bucket 62 is 0 in ag 0 (inode=3D0) agi unlinked bucket 63 is 0 in ag 0 (inode=3D0) sb_fdblocks 7860416, counted 7368900 - 10:29:06: scanning filesystem freespace - 16 of 16 allocation groups done root inode chunk not found Phase 3 - for each AG... - scan and clear agi unlinked lists... - 10:29:06: scanning agi unlinked lists - 16 of 16 allocation groups done - process known inodes and perform inode discovery... - agno =3D 0 - agno =3D 15 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x40/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 Metadata corruption detected at block 0x50/0x2000 bad magic number 0x0 on inode 128 bad version number 0x0 on inode 128 bad magic number 0x0 on inode 129 bad version number 0x0 on inode 129 bad magic number 0x0 on inode 130 bad version number 0x0 on inode 130 bad magic number 0x0 on inode 131 bad version number 0x0 on inode 131 bad magic number 0x0 on inode 132 bad version number 0x0 on inode 132 bad magic number 0x0 on inode 133 bad version number 0x0 on inode 133 bad magic number 0x0 on inode 134 bad version number 0x0 on inode 134 bad magic number 0x0 on inode 135 bad version number 0x0 on inode 135 bad magic number 0x0 on inode 136 bad version number 0x0 on inode 136 bad magic number 0x0 on inode 137 bad version number 0x0 on inode 137 bad magic number 0x0 on inode 138 bad version number 0x0 on inode 138 bad magic number 0x0 on inode 139 bad version number 0x0 on inode 139 bad magic number 0x0 on inode 140 bad version number 0x0 on inode 140 bad magic number 0x0 on inode 141 bad version number 0x0 on inode 141 bad magic number 0x0 on inode 142 bad version number 0x0 on inode 142 bad magic number 0x0 on inode 143 bad version number 0x0 on inode 143 bad magic number 0x0 on inode 144 bad version number 0x0 on inode 144 bad magic number 0x0 on inode 145 bad version number 0x0 on inode 145 bad magic number 0x0 on inode 146 bad version number 0x0 on inode 146 bad magic number 0x0 on inode 147 bad version number 0x0 on inode 147 bad magic number 0x0 on inode 148 bad version number 0x0 on inode 148 bad magic number 0x0 on inode 149 bad version number 0x0 on inode 149 bad magic number 0x0 on inode 150 bad version number 0x0 on inode 150 bad magic number 0x0 on inode 151 bad version number 0x0 on inode 151 bad magic number 0x0 on inode 152 bad version number 0x0 on inode 152 bad magic number 0x0 on inode 153 bad version number 0x0 on inode 153 bad magic number 0x0 on inode 154 bad version number 0x0 on inode 154 bad magic number 0x0 on inode 155 bad version number 0x0 on inode 155 bad magic number 0x0 on inode 156 bad version number 0x0 on inode 156 bad magic number 0x0 on inode 157 bad version number 0x0 on inode 157 bad magic number 0x0 on inode 158 bad version number 0x0 on inode 158 bad magic number 0x0 on inode 159 bad version number 0x0 on inode 159 bad magic number 0x0 on inode 160 bad version number 0x0 on inode 160 bad magic number 0x0 on inode 161 bad version number 0x0 on inode 161 bad magic number 0x0 on inode 162 bad version number 0x0 on inode 162 bad magic number 0x0 on inode 163 bad version number 0x0 on inode 163 bad magic number 0x0 on inode 164 bad version number 0x0 on inode 164 bad magic number 0x0 on inode 165 bad version number 0x0 on inode 165 bad magic number 0x0 on inode 166 bad version number 0x0 on inode 166 bad magic number 0x0 on inode 167 bad version number 0x0 on inode 167 bad magic number 0x0 on inode 168 bad version number 0x0 on inode 168 bad magic number 0x0 on inode 169 bad version number 0x0 on inode 169 bad magic number 0x0 on inode 170 bad version number 0x0 on inode 170 bad magic number 0x0 on inode 171 bad version number 0x0 on inode 171 bad magic number 0x0 on inode 172 bad version number 0x0 on inode 172 bad magic number 0x0 on inode 173 bad version number 0x0 on inode 173 bad magic number 0x0 on inode 174 bad version number 0x0 on inode 174 bad magic number 0x0 on inode 175 bad version number 0x0 on inode 175 bad magic number 0x0 on inode 176 bad version number 0x0 on inode 176 bad magic number 0x0 on inode 177 bad version number 0x0 on inode 177 bad magic number 0x0 on inode 178 bad version number 0x0 on inode 178 bad magic number 0x0 on inode 179 bad version number 0x0 on inode 179 bad magic number 0x0 on inode 180 bad version number 0x0 on inode 180 bad magic number 0x0 on inode 181 bad version number 0x0 on inode 181 bad magic number 0x0 on inode 182 bad version number 0x0 on inode 182 bad magic number 0x0 on inode 183 bad version number 0x0 on inode 183 bad magic number 0x0 on inode 184 bad version number 0x0 on inode 184 bad magic number 0x0 on inode 185 bad version number 0x0 on inode 185 bad magic number 0x0 on inode 186 bad version number 0x0 on inode 186 bad magic number 0x0 on inode 187 bad version number 0x0 on inode 187 bad magic number 0x0 on inode 188 bad version number 0x0 on inode 188 bad magic number 0x0 on inode 189 bad version number 0x0 on inode 189 bad magic number 0x0 on inode 190 bad version number 0x0 on inode 190 bad magic number 0x0 on inode 191 bad version number 0x0 on inode 191 bad magic number 0x0 on inode 128, resetting magic number bad version number 0x0 on inode 128, resetting version number imap claims a free inode 128 is in use, correcting imap and clearing inod= e cleared root inode 128 bad magic number 0x0 on inode 129, resetting magic number bad version number 0x0 on inode 129, resetting version number imap claims a free inode 129 is in use, correcting imap and clearing inod= e cleared realtime bitmap inode 129 bad magic number 0x0 on inode 130, resetting magic number bad version number 0x0 on inode 130, resetting version number imap claims a free inode 130 is in use, correcting imap and clearing inod= e cleared realtime summary inode 130 bad magic number 0x0 on inode 131, resetting magic number bad version number 0x0 on inode 131, resetting version number bad magic number 0x0 on inode 132, resetting magic number bad version number 0x0 on inode 132, resetting version number bad magic number 0x0 on inode 133, resetting magic number bad version number 0x0 on inode 133, resetting version number bad magic number 0x0 on inode 134, resetting magic number bad version number 0x0 on inode 134, resetting version number bad magic number 0x0 on inode 135, resetting magic number bad version number 0x0 on inode 135, resetting version number bad magic number 0x0 on inode 136, resetting magic number bad version number 0x0 on inode 136, resetting version number bad magic number 0x0 on inode 137, resetting magic number bad version number 0x0 on inode 137, resetting version number bad magic number 0x0 on inode 138, resetting magic number bad version number 0x0 on inode 138, resetting version number bad magic number 0x0 on inode 139, resetting magic number bad version number 0x0 on inode 139, resetting version number bad magic number 0x0 on inode 140, resetting magic number bad version number 0x0 on inode 140, resetting version number bad magic number 0x0 on inode 141, resetting magic number bad version number 0x0 on inode 141, resetting version number bad magic number 0x0 on inode 142, resetting magic number bad version number 0x0 on inode 142, resetting version number bad magic number 0x0 on inode 143, resetting magic number bad version number 0x0 on inode 143, resetting version number bad magic number 0x0 on inode 144, resetting magic number bad version number 0x0 on inode 144, resetting version number bad magic number 0x0 on inode 145, resetting magic number bad version number 0x0 on inode 145, resetting version number bad magic number 0x0 on inode 146, resetting magic number bad version number 0x0 on inode 146, resetting version number bad magic number 0x0 on inode 147, resetting magic number bad version number 0x0 on inode 147, resetting version number bad magic number 0x0 on inode 148, resetting magic number bad version number 0x0 on inode 148, resetting version number bad magic number 0x0 on inode 149, resetting magic number bad version number 0x0 on inode 149, resetting version number bad magic number 0x0 on inode 150, resetting magic number bad version number 0x0 on inode 150, resetting version number bad magic number 0x0 on inode 151, resetting magic number bad version number 0x0 on inode 151, resetting version number bad magic number 0x0 on inode 152, resetting magic number bad version number 0x0 on inode 152, resetting version number bad magic number 0x0 on inode 153, resetting magic number bad version number 0x0 on inode 153, resetting version number bad magic number 0x0 on inode 154, resetting magic number bad version number 0x0 on inode 154, resetting version number bad magic number 0x0 on inode 155, resetting magic number bad version number 0x0 on inode 155, resetting version number bad magic number 0x0 on inode 156, resetting magic number bad version number 0x0 on inode 156, resetting version number bad magic number 0x0 on inode 157, resetting magic number bad version number 0x0 on inode 157, resetting version number bad magic number 0x0 on inode 158, resetting magic number bad version number 0x0 on inode 158, resetting version number bad magic number 0x0 on inode 159, resetting magic number bad version number 0x0 on inode 159, resetting version number bad magic number 0x0 on inode 160, resetting magic number bad version number 0x0 on inode 160, resetting version number bad magic number 0x0 on inode 161, resetting magic number bad version number 0x0 on inode 161, resetting version number bad magic number 0x0 on inode 162, resetting magic number bad version number 0x0 on inode 162, resetting version number bad magic number 0x0 on inode 163, resetting magic number bad version number 0x0 on inode 163, resetting version number bad magic number 0x0 on inode 164, resetting magic number bad version number 0x0 on inode 164, resetting version number bad magic number 0x0 on inode 165, resetting magic number bad version number 0x0 on inode 165, resetting version number bad magic number 0x0 on inode 166, resetting magic number bad version number 0x0 on inode 166, resetting version number bad magic number 0x0 on inode 167, resetting magic number bad version number 0x0 on inode 167, resetting version number bad magic number 0x0 on inode 168, resetting magic number bad version number 0x0 on inode 168, resetting version number bad magic number 0x0 on inode 169, resetting magic number bad version number 0x0 on inode 169, resetting version number bad magic number 0x0 on inode 170, resetting magic number bad version number 0x0 on inode 170, resetting version number bad magic number 0x0 on inode 171, resetting magic number bad version number 0x0 on inode 171, resetting version number bad magic number 0x0 on inode 172, resetting magic number bad version number 0x0 on inode 172, resetting version number bad magic number 0x0 on inode 173, resetting magic number bad version number 0x0 on inode 173, resetting version number bad magic number 0x0 on inode 174, resetting magic number bad version number 0x0 on inode 174, resetting version number bad magic number 0x0 on inode 175, resetting magic number bad version number 0x0 on inode 175, resetting version number bad magic number 0x0 on inode 176, resetting magic number bad version number 0x0 on inode 176, resetting version number bad magic number 0x0 on inode 177, resetting magic number bad version number 0x0 on inode 177, resetting version number bad magic number 0x0 on inode 178, resetting magic number bad version number 0x0 on inode 178, resetting version number bad magic number 0x0 on inode 179, resetting magic number bad version number 0x0 on inode 179, resetting version number bad magic number 0x0 on inode 180, resetting magic number bad version number 0x0 on inode 180, resetting version number bad magic number 0x0 on inode 181, resetting magic number bad version number 0x0 on inode 181, resetting version number bad magic number 0x0 on inode 182, resetting magic number bad version number 0x0 on inode 182, resetting version number bad magic number 0x0 on inode 183, resetting magic number bad version number 0x0 on inode 183, resetting version number bad magic number 0x0 on inode 184, resetting magic number bad version number 0x0 on inode 184, resetting version number bad magic number 0x0 on inode 185, resetting magic number bad version number 0x0 on inode 185, resetting version number bad magic number 0x0 on inode 186, resetting magic number bad version number 0x0 on inode 186, resetting version number bad magic number 0x0 on inode 187, resetting magic number bad version number 0x0 on inode 187, resetting version number bad magic number 0x0 on inode 188, resetting magic number bad version number 0x0 on inode 188, resetting version number bad magic number 0x0 on inode 189, resetting magic number bad version number 0x0 on inode 189, resetting version number bad magic number 0x0 on inode 190, resetting magic number bad version number 0x0 on inode 190, resetting version number bad magic number 0x0 on inode 191, resetting magic number bad version number 0x0 on inode 191, resetting version number - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - agno =3D 10 - agno =3D 11 - agno =3D 12 - agno =3D 13 - agno =3D 14 - 10:29:06: process known inodes and inode discovery - 64 of 0 inodes done - process newly discovered inodes... - 10:29:06: process newly discovered inodes - 16 of 16 allocation groups done Phase 4 - check for duplicate blocks... - setting up duplicate extent list... root inode lost - 10:29:06: setting up duplicate extent list - 16 of 16 allocation groups done - check for inodes claiming duplicate blocks... - agno =3D 0 - agno =3D 3 - agno =3D 10 - agno =3D 13 - agno =3D 6 - agno =3D 5 - agno =3D 8 - agno =3D 1 - agno =3D 7 - agno =3D 9 - agno =3D 11 - agno =3D 12 - agno =3D 2 - agno =3D 15 - agno =3D 14 - agno =3D 4 - 10:29:06: check for inodes claiming duplicate blocks - 64 of 0 inodes done Phase 5 - rebuild AG headers and trees... - 10:29:06: rebuild AG headers and trees - 16 of 16 allocation groups done - reset superblock... Phase 6 - check inode connectivity... reinitializing root directory reinitializing realtime bitmap inode reinitializing realtime summary inode - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... resetting inode 128 nlinks from 1 to 2 done --=20 Jeff Mahoney SUSE Labs --Ip5vvUTc7UusOCKoPV4xFml4tRq3onsnd-- --OkkOVG4prTUTD7bkTVxPEP8qL1jqf1LAE Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.19 (Darwin) Comment: GPGTools - http://gpgtools.org iQIcBAEBAgAGBQJXoOuaAAoJEB57S2MheeWy4MEQAJYKEz7KO4t3ECqEN23oOZji AqB8uSU6LBYLMqfXQTdVrr7KTtgswrIPbKo/goYkN8tgXWrowtS1PjJyNKfqv5u5 MsuqGEf5pjeS10rSHutwdYgLb48znt1X1u7oXenPmBCmRndDXfjBhTAkwB6IgEW2 XiSqMApMnyKszqRunQgyJ1P4wYO/LIWnhLg71Zb+ZPr8wf7P76DZomtmpG5R3gR+ B+ooeNiRjYChmCv/O7ujrIQXaJkoz1OP2m/L8s1k4qLp+vEUJW5ElYxtwt9P1Ubc KlqVY3UK+RbK8VSNY4Povu29PkwCHzbN3OCtRwTcs8cXOCZ3m0PorxHls4c+NJYI CNCrc7b5Kt6+g7lw2ZLDSf/GKgaJI2uq3NDHhIjezhe6d+dCI48hslljcpdyDKMX AkA2o6Gd4tjfjUe8qD3AY6nmGtrE/ThRtz2EQtMRESYAGvbv3580MC7gPunEW/q6 6StXM2wzh5Q3LMwL9Xd1ISbZF+6zEpJOVqo73VaoALhPb5QHxnO8WVrFWWe2DEVa eY7jglo/pqgzu8GvitdMG0D/cPsmf89w+eFDUSrab8YNZTKCA96lob3My+ERTquA 0agj0qZWFqrgBYMAwiiITeTtCEaJF19gsxLji9Tr7iTQFcCC0ATpPs2ecvqPa8Xj W/6i9JrztRexJiaz2/DI =VUeZ -----END PGP SIGNATURE----- --OkkOVG4prTUTD7bkTVxPEP8qL1jqf1LAE-- From tdm@sgi.com Tue Aug 2 14:11:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D6A1F7CA4 for ; Tue, 2 Aug 2016 14:11:06 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2D333AC006; Tue, 2 Aug 2016 12:11:03 -0700 (PDT) Received: from P-EXMB4-DC21.corp.sgi.com ([169.254.6.189]) by pv-excas2-dc21.corp.sgi.com ([137.38.106.9]) with mapi id 14.03.0224.002; Tue, 2 Aug 2016 14:11:02 -0500 From: Troy McCorkell To: Lista Unx , Chris Murphy , "xfs@oss.sgi.com" Subject: RE: partition 100% full No space left on device. looks like xfsiscorrupted or a bug Thread-Topic: partition 100% full No space left on device. looks like xfsiscorrupted or a bug Thread-Index: AQHR7OdopI4A4nmau0ijEYPt1q8NaKA2BwnD Date: Tue, 2 Aug 2016 19:11:01 +0000 Message-ID: References: <4278AB9734C1445A8E48635B155149F8@dinulap><20160729233524.GD16044@dastard><57CF7681619F42CCB4C0CF589E9686E5@dinulap> ,<5B47A77EB08F49A9B0843A6215A24C64@dinulap> In-Reply-To: <5B47A77EB08F49A9B0843A6215A24C64@dinulap> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [128.162.233.129] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 >On Mon, Aug 1, 2016 at 7:51 AM, Lista Unx wrote:=0A= >=0A= >> On Mon, Aug 1, 2016 at 6:00 AM, Lista Unx wrote:= =0A= >>=0A= >>> Yes, I've created a new gmail account especially to be able to post to= =0A= >>> this=0A= >>> mailing list which is filtering very seriously legit messages comming= =0A= >>> from=0A= >>> legit users, just because they are comming from yahoo accounts (servers= )=0A= >>> ...=0A= >>=0A= >> It's a Yahoo policy. It's completely reasonable for lists to reject=0A= >> yahoo.com emails, but ideally it'd reject them at signup time.=0A= >>=0A= >> https://help.yahoo.com/kb/SLN24050.html=0A= >> https://help.yahoo.com/kb/mail/SLN24016.html?impressions=3Dtrue=0A= >> http://www.pcworld.com/article/2141120/yahoo-email-antispoofing-policy-b= reaks-mailing-lists.html=0A= >>=0A= >>=0A= >=0A= >Ok, I understand. In this case:=0A= >1. Is a good idea to not allow those using yahoo accounts to subscribe to= =0A= >this list (with a clear message regarding why you are doing it)=0A= >and=0A= >2. Reject all messages comming from users which does not have valid=0A= >membership on this list (for sure, you will reduce spam)=0A= =0A= The policy for the xfs@oss.sgi.com mailing list is it is open and unmoderat= ed to allow any user=0A= of XFS to communicate with the XFS community. Yes, the policy does resul= t in spam on the mailing list.=0A= =0A= If you have problems with the mailing list please CC me on the email.=0A= =0A= Thanks,=0A= Troy McCorkell=0A= SGI=0A= =0A= =0A= From sandeen@sandeen.net Tue Aug 2 14:20:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C6E737CA4 for ; Tue, 2 Aug 2016 14:20:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2EEECAC004 for ; Tue, 2 Aug 2016 12:20:23 -0700 (PDT) X-ASG-Debug-ID: 1470165621-0bf57c13692f80f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fWhtONQXJyxlG0UB for ; Tue, 02 Aug 2016 12:20:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 508704AC120; Tue, 2 Aug 2016 14:20:21 -0500 (CDT) Subject: Re: Old bugs in xfsprogs? To: Jeff Mahoney , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Old bugs in xfsprogs? References: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> <626eedea-2b9a-4ca3-cd3d-1e528f45526f@sandeen.net> <74fde7f6-54a2-078f-6064-d9e32564f9a7@suse.com> From: Eric Sandeen Message-ID: Date: Tue, 2 Aug 2016 14:20:13 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <74fde7f6-54a2-078f-6064-d9e32564f9a7@suse.com> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="70jVWDRsHHbjA2XOqvmCwImDRNuA924Vu" X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1470165621 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-ASG-Orig-Subj: Re: Old bugs in xfsprogs? X-Barracuda-Scan-Msg-Size: 2090 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --70jVWDRsHHbjA2XOqvmCwImDRNuA924Vu Content-Type: multipart/mixed; boundary="0AcBdpWt23SSM1A25G9jUKuVtaDv10304" From: Eric Sandeen To: Jeff Mahoney , xfs@oss.sgi.com Message-ID: Subject: Re: Old bugs in xfsprogs? References: <7e185931-8830-5f31-7abb-5419bb255991@suse.com> <626eedea-2b9a-4ca3-cd3d-1e528f45526f@sandeen.net> <74fde7f6-54a2-078f-6064-d9e32564f9a7@suse.com> In-Reply-To: <74fde7f6-54a2-078f-6064-d9e32564f9a7@suse.com> --0AcBdpWt23SSM1A25G9jUKuVtaDv10304 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 8/2/16 1:51 PM, Jeff Mahoney wrote: > On 8/2/16 11:00 AM, Eric Sandeen wrote: =2E.. >> I could imagine that maybe for each candidate super we find, we should= >> look at its geometry, and spot-check the other locations that it indic= ates >> should contain a superblock. If we get enough semi-valid but conflict= ing >> "sets," maybe we should bail out and ask. It's quite a corner case, t= ho. >=20 > I'm not sure a geometry check would've helped here. The superblock > geometry still would've covered the whole, unpartitioned device. Since= > we're already linking with blkid, maybe a check to see if there's a > partition table on the device and bail if it sees one, unless forced? > The part that I'm still trying to explain is how it managed to get a > good magic from the log and then got the wrong uuid. Hm, yeah, maybe right off the bat, if the primary super looks bad do a blkid check, and a (sigh) "are you sure?" just like we do for mkfs. >> Any chance you have full xfs_repair output? >=20 > Sure, below. I heard back from the reporter and confirmed that my > hypothesis of mkfs -> fdisk -> mkfs was what happened. He's on SLE12 > SP1, so that means xfsprogs 3.2.1. >=20 > -Jeff >=20 > --- >=20 > labadmin:/ssd # xfs_repair postgre.raw -L > Phase 1 - find and verify superblock... > - reporting progress in intervals of 15 minutes > sb root inode value 18446744073709551615 (NULLFSINO) inconsistent with > calculated value 128 > resetting superblock root inode pointer to 128 > sb realtime bitmap inode 18446744073709551615 (NULLFSINO) inconsistent > with calculated value 129 > resetting superblock realtime bitmap ino pointer to 129 > sb realtime summary inode 18446744073709551615 (NULLFSINO) inconsistent= > with calculated value 130 > resetting superblock realtime summary ino pointer to 130 huh. Ok, so I guess the primary in block zero was mostly-ok, and all of the backup supers were still more or less intact, and it didn't have to go searching... -Eric --0AcBdpWt23SSM1A25G9jUKuVtaDv10304-- --70jVWDRsHHbjA2XOqvmCwImDRNuA924Vu Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org iQIcBAEBAgAGBQJXoPJ0AAoJECCuFpLhPd7gMMwP/0j3lITM12XKrfXHdOAzGiIz HjvNAwjvTtC1kx5mq8SnWFk/FPrhP8pDBzkF14aC3lyu4GB+Pp3SX+d7uGxpzQTK jdplNO2sB8iaNdPolvgMSXQ5UdU3cs6hnxIwlXqRnA6N6/3gyF3ZL2qihYG4NyK7 cNMfcBQYLu21CDtNMExAxlBLIpiND0ckyBOimfdYiiHaLetqzIGYDGBof/KVTC+r sEPSrLVXUMEU0XjIbJnfdIgB9wHmnNOqodjaJ6HYAT1FfLcwnngzYWRjW8JSE8wF lN6tdLUBVkq+r+WJUegdK6ZAFVBuAPJF6c4Dj4Kl4qwce/ftcz1K5DFDLcm12Prm bMKqrE6MDLOx3+12y0EI/hGkvKNtZjU5xmNL4eagz6WtjrzFYSggztDPJBTRMx9B 7nFofQGryW3aZ9fc9nQ79VGmP5zmue/DSeNk6ugFRSQhkhc/gdQuw1egubU309Fb c/QlNa8puWLRbB2MYH8WuwNJuVebbzuaF7Ug2vRYiwK/JwI90gON39mjI2rux6Lb trmayDjgjgh3sF9lSjLIgLQ/aUSSoQ+Sv2B/ksCjxOA7Zkd/pv1b/oOYBwth974u QoOJ/13huyQGayfEjITBmyrwdEndDHxQotH/yG/QwnmqeOqL7BJi5zQojykUJdaU 0ipfbFCZhskeoBddy4/C =QDdA -----END PGP SIGNATURE----- --70jVWDRsHHbjA2XOqvmCwImDRNuA924Vu-- From darrick.wong@oracle.com Tue Aug 2 15:06:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1D13B7CA4 for ; Tue, 2 Aug 2016 15:06:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A39ABAC002 for ; Tue, 2 Aug 2016 13:06:47 -0700 (PDT) X-ASG-Debug-ID: 1470168401-0bf8157e6c3d2350001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id WM2NIrw3cpihDmhd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 13:06:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u72K6dUE006047 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 2 Aug 2016 20:06:39 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u72K6cih009623 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 20:06:39 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u72K6bQ0008194; Tue, 2 Aug 2016 20:06:38 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 13:06:36 -0700 Date: Tue, 2 Aug 2016 13:06:35 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 20/47] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt Message-ID: <20160802200635.GJ8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 20/47] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907709719.25461.3104352212846077948.stgit@birch.djwong.org> <20160802184845.GC58152@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802184845.GC58152@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470168402 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2273 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31700 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 02, 2016 at 02:48:46PM -0400, Brian Foster wrote: > On Wed, Jul 20, 2016 at 09:58:17PM -0700, Darrick J. Wong wrote: > > By my calculations, a 1,073,741,824 block AG with a 1k block size > > can attain a maximum height of 9. Assuming a record size of 24 > > bytes, a key/ptr size of 44 bytes, and half-full btree nodes, > > we'd need 53,687,092 blocks for the records and ~6 million blocks > > for the keys. That requires a btree of height 9. > > > > Signed-off-by: Darrick J. Wong > > --- > > I believe you.. :) but could you add a bit more detail to the commit log > just to describe the calculations (e.g., how many records per leaf > block, keys per node block) so 1.) I don't have to try and figure it out > ;) (and probably get it wrong) and 2.) so we have a reference in the git > repo going forward? Block size = 1024b sblock CRC header = 56b == 1024-56 = 968 bytes for tree data rmapbt record = 24b == 40 records per leaf block rmapbt ptr/key = 44b == 22 ptr/keys per block Worst case, each block is half full, so 20 records and 11 ptrs per block. 1073741824 rmap records / 20 records per block == 53687092 leaf blocks 53687092 leaves / 11 ptrs per block == 4880645 level 1 blocks == 443695 level 2 blocks == 40336 level 3 blocks == 3667 level 4 blocks == 334 level 5 blocks == 31 level 6 blocks == 3 level 7 blocks == 1 level 8 block Yay latency.... (Hey, at least this isn't ext4 which has no lower bound on block fill...) --D > > Brian > > > fs/xfs/libxfs/xfs_btree.h | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > > index b8bbb21..629ef4f 100644 > > --- a/fs/xfs/libxfs/xfs_btree.h > > +++ b/fs/xfs/libxfs/xfs_btree.h > > @@ -133,7 +133,7 @@ do { \ > > } \ > > } while (0) > > > > -#define XFS_BTREE_MAXLEVELS 8 /* max of all btrees */ > > +#define XFS_BTREE_MAXLEVELS 9 /* max of all btrees */ > > > > struct xfs_btree_ops { > > /* size of the key and record structures */ > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Tue Aug 2 15:24:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DE4637CA4 for ; Tue, 2 Aug 2016 15:24:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF272304039 for ; Tue, 2 Aug 2016 13:24:36 -0700 (PDT) X-ASG-Debug-ID: 1470169473-0bf57c136a2f9850001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id L5RDD9sSuWBvFpAU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 13:24:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u72KOU6G025400 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 20:24:31 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u72KOUKA001210 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 20:24:30 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u72KORu2013103; Tue, 2 Aug 2016 20:24:28 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 13:24:27 -0700 Date: Tue, 2 Aug 2016 13:24:25 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 19/47] xfs: add tracepoints and error injection for deferred extent freeing Message-ID: <20160802202425.GK8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 19/47] xfs: add tracepoints and error injection for deferred extent freeing References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907709074.25461.17602977707506082040.stgit@birch.djwong.org> <20160802184800.GB58152@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802184800.GB58152@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470169474 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4909 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31700 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 02, 2016 at 02:48:00PM -0400, Brian Foster wrote: > On Wed, Jul 20, 2016 at 09:58:10PM -0700, Darrick J. Wong wrote: > > Add a couple of tracepoints for the deferred extent free operation and > > a site for injecting errors while finishing the operation. This makes > > it easier to debug deferred ops and test log redo. > > > > Signed-off-by: Darrick J. Wong > > --- > > fs/xfs/libxfs/xfs_alloc.c | 7 +++++++ > > fs/xfs/libxfs/xfs_bmap.c | 2 ++ > > fs/xfs/xfs_error.h | 4 +++- > > fs/xfs/xfs_trace.h | 5 ++++- > > 4 files changed, 16 insertions(+), 2 deletions(-) > > > > > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > > index 5993f87..22ac3f1 100644 > > --- a/fs/xfs/libxfs/xfs_alloc.c > > +++ b/fs/xfs/libxfs/xfs_alloc.c > > @@ -2702,6 +2702,13 @@ xfs_free_extent( > > > > ASSERT(len != 0); > > > > + trace_xfs_bmap_free_deferred(mp, agno, 0, agbno, len); > > + > > Hmm, but the bmap code isn't the only caller here. I was thinking that > maybe we'd be better served by pushing these down into xfs_defer_add() > and friends, but I guess we don't necessarily have the extent > information at that layer. Correct, we don't. > How about we just rename these tracepoints to match the function names > so they don't confuse me in the future? :) I broke with the function name convention so that the entry and exit tracepoints to deferred items would all have names that easily matched wildcards to make my life easier: # trace-cmd record -e 'xfs_*_defer' -e 'xfs_*_deferred' -F ... > > + if (XFS_TEST_ERROR(false, mp, > > + XFS_ERRTAG_FREE_EXTENT, > > + XFS_RANDOM_FREE_EXTENT)) > > + return -EIO; > > + > > error = xfs_free_extent_fix_freelist(tp, agno, &agbp); > > if (error) > > return error; > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > > index 540a6b7..8e14ff4 100644 > > --- a/fs/xfs/libxfs/xfs_bmap.c > > +++ b/fs/xfs/libxfs/xfs_bmap.c > > @@ -596,6 +596,8 @@ xfs_bmap_add_free( > > new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); > > new->xefi_startblock = bno; > > new->xefi_blockcount = (xfs_extlen_t)len; > > + trace_xfs_bmap_free_defer(mp, XFS_FSB_TO_AGNO(mp, bno), 0, > > + XFS_FSB_TO_AGBNO(mp, bno), len); > > xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_FREE, &new->xefi_list); > > } > > > > diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h > > index 2e4f67f..da6f951 100644 > > --- a/fs/xfs/xfs_error.h > > +++ b/fs/xfs/xfs_error.h > > @@ -90,7 +90,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp); > > #define XFS_ERRTAG_STRATCMPL_IOERR 19 > > #define XFS_ERRTAG_DIOWRITE_IOERR 20 > > #define XFS_ERRTAG_BMAPIFORMAT 21 > > -#define XFS_ERRTAG_MAX 22 > > +#define XFS_ERRTAG_FREE_EXTENT 22 > > +#define XFS_ERRTAG_MAX 23 > > > > /* > > * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. > > @@ -117,6 +118,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); > > #define XFS_RANDOM_STRATCMPL_IOERR (XFS_RANDOM_DEFAULT/10) > > #define XFS_RANDOM_DIOWRITE_IOERR (XFS_RANDOM_DEFAULT/10) > > #define XFS_RANDOM_BMAPIFORMAT XFS_RANDOM_DEFAULT > > +#define XFS_RANDOM_FREE_EXTENT 1 > > > > Why not XFS_RANDOM_DEFAULT? I don't want the injected redo errors going off at random -- I want to set one and have it go off the very next time we hit it. This way I can write the xfstests like so: mkfs/mount write to a file; sync set a logic bomb for the next time we free an extent truncate the file unmount check that xfs_repair grumbles about the dirty log mount check the file Were the free-extent bomb set to go off at XFS_RANDOM_DEFAULT intervals, it'd only have a 1/100 chance of triggering, which makes it harder to test. --D > > Brian > > > #ifdef DEBUG > > extern int xfs_error_test_active; > > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > > index a45b030..939caf5 100644 > > --- a/fs/xfs/xfs_trace.h > > +++ b/fs/xfs/xfs_trace.h > > @@ -2417,9 +2417,12 @@ DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_cancel); > > DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_finish); > > DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_abort); > > > > -DEFINE_PHYS_EXTENT_DEFERRED_EVENT(xfs_defer_phys_extent); > > DEFINE_MAP_EXTENT_DEFERRED_EVENT(xfs_defer_map_extent); > > > > +#define DEFINE_BMAP_FREE_DEFERRED_EVENT DEFINE_PHYS_EXTENT_DEFERRED_EVENT > > +DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_defer); > > +DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_deferred); > > + > > #endif /* _TRACE_XFS_H */ > > > > #undef TRACE_INCLUDE_PATH > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Tue Aug 2 15:35:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CC0787CA4 for ; Tue, 2 Aug 2016 15:35:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9CD16304039 for ; Tue, 2 Aug 2016 13:35:45 -0700 (PDT) X-ASG-Debug-ID: 1470170143-0bf57b369b3586d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id bRAzjgRELD6wu3nO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 13:35:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u72KZHkG008418 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 20:35:17 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u72KZGxr018550 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 20:35:17 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u72KZDRP017719; Tue, 2 Aug 2016 20:35:14 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 13:35:13 -0700 Date: Tue, 2 Aug 2016 13:35:11 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 18/47] xfs: refactor redo intent item processing Message-ID: <20160802203511.GL8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 18/47] xfs: refactor redo intent item processing References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907708421.25461.405239727630066080.stgit@birch.djwong.org> <20160801081023.GC30547@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801081023.GC30547@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470170143 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2355 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31700 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 01, 2016 at 01:10:23AM -0700, Christoph Hellwig wrote: > > +int > > +xfs_efi_recover( > > + struct xfs_mount *mp, > > + struct xfs_efi_log_item *efip) > > +{ > > + struct xfs_efd_log_item *efdp; > > + struct xfs_trans *tp; > > + int i; > > + int error = 0; > > + xfs_extent_t *extp; > > + xfs_fsblock_t startblock_fsb; > > + > > + ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); > > + > > + /* > > + * First check the validity of the extents described by the > > + * EFI. If any are bad, then assume that all are bad and > > + * just toss the EFI. > > + */ > > + for (i = 0; i < efip->efi_format.efi_nextents; i++) { > > + extp = &(efip->efi_format.efi_extents[i]); > > + startblock_fsb = XFS_BB_TO_FSB(mp, > > + XFS_FSB_TO_DADDR(mp, extp->ext_start)); > > + if ((startblock_fsb == 0) || > > + (extp->ext_len == 0) || > > + (startblock_fsb >= mp->m_sb.sb_dblocks) || > > + (extp->ext_len >= mp->m_sb.sb_agblocks)) { > > + /* > > + * This will pull the EFI from the AIL and > > + * free the memory associated with it. > > + */ > > + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > > + xfs_efi_release(efip); > > + return -EIO; > > + } > > + } > > I know it's just a code move, but there are lots of superflous braces > here, please remove them. Ok. It took me a while to figure out that you were referring to the parentheses on the if tests and not the curly braces around the code blocks. > > + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); > > + if (error) > > + return error; > > + efdp = xfs_trans_get_efd(tp, efip, efip->efi_format.efi_nextents); > > + > > + for (i = 0; i < efip->efi_format.efi_nextents; i++) { > > + extp = &(efip->efi_format.efi_extents[i]); > > and here.. > > > + ASSERT(XFS_LSN_CMP(last_lsn, lip->li_lsn) >= 0); > > This new check seems useful, but nothing in the changelog mentions > why it has been added. > > Otherwise this looks fine to me. I'm adding the following to the commit message: "Furthermore, ensure that log recovery only replays the redo items that were in the AIL prior to recovery by checking the item LSN against the largest LSN seen during log scanning. As written this should never happen, but we can be defensive anyway." --D From darrick.wong@oracle.com Tue Aug 2 15:48:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 85A177CA4 for ; Tue, 2 Aug 2016 15:48:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5644D304048 for ; Tue, 2 Aug 2016 13:48:05 -0700 (PDT) X-ASG-Debug-ID: 1470170882-0bf57c13672fa0b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 9wTcXeebTHHCNdwf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 13:48:02 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u72KlxMG020152 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 20:47:59 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u72Klwk4017116 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 20:47:59 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u72Klq1B004682; Tue, 2 Aug 2016 20:47:58 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 13:47:47 -0700 Date: Tue, 2 Aug 2016 13:47:46 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 16/47] xfs: change xfs_bmap_{finish, cancel, init, free} -> xfs_defer_* Message-ID: <20160802204746.GM8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 16/47] xfs: change xfs_bmap_{finish, cancel, init, free} -> xfs_defer_* References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907707014.25461.326080392148826094.stgit@birch.djwong.org> <20160802173033.GD54148@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802173033.GD54148@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470170882 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5407 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31700 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 02, 2016 at 01:30:33PM -0400, Brian Foster wrote: > On Wed, Jul 20, 2016 at 09:57:50PM -0700, Darrick J. Wong wrote: > > Drop the compatibility shims that we were using to integrate the new > > deferred operation mechanism into the existing code. No new code. > > > > v2: Also change xfs_bmap_free_item -> xfs_extent_free_item. > > > > Signed-off-by: Darrick J. Wong > > --- > > fs/xfs/libxfs/xfs_attr.c | 58 ++++++++++++++++++------------------ > > fs/xfs/libxfs/xfs_attr_remote.c | 14 ++++----- > > fs/xfs/libxfs/xfs_bmap.c | 46 ++++++++++++++--------------- > > fs/xfs/libxfs/xfs_bmap.h | 18 ++++++----- > > fs/xfs/libxfs/xfs_btree.h | 5 ++- > > fs/xfs/libxfs/xfs_da_btree.h | 4 +-- > > fs/xfs/libxfs/xfs_defer.h | 7 ---- > > fs/xfs/libxfs/xfs_dir2.c | 6 ++-- > > fs/xfs/libxfs/xfs_dir2.h | 8 +++-- > > fs/xfs/libxfs/xfs_ialloc.c | 6 ++-- > > fs/xfs/libxfs/xfs_ialloc.h | 2 + > > fs/xfs/libxfs/xfs_trans_resv.c | 4 +-- > > fs/xfs/xfs_bmap_util.c | 28 +++++++++--------- > > fs/xfs/xfs_bmap_util.h | 2 + > > fs/xfs/xfs_dquot.c | 10 +++--- > > fs/xfs/xfs_inode.c | 62 ++++++++++++++++++++------------------- > > fs/xfs/xfs_inode.h | 4 +-- > > fs/xfs/xfs_iomap.c | 24 ++++++++------- > > fs/xfs/xfs_rtalloc.c | 8 +++-- > > fs/xfs/xfs_super.c | 2 + > > fs/xfs/xfs_symlink.c | 16 +++++----- > > fs/xfs/xfs_trans.h | 5 --- > > fs/xfs/xfs_trans_extfree.c | 36 +++++++++++------------ > > 23 files changed, 182 insertions(+), 193 deletions(-) > > > > > ... > > diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c > > index a9f34ee..b484902 100644 > > --- a/fs/xfs/xfs_trans_extfree.c > > +++ b/fs/xfs/xfs_trans_extfree.c > > @@ -35,7 +35,7 @@ > > * caller must use all nextents extents, because we are not > > * flexible about this at all. > > */ > > -struct xfs_efi_log_item * > > +STATIC struct xfs_efi_log_item * > > xfs_trans_get_efi(struct xfs_trans *tp, > > I think we should just fold this into the one caller below. > > > uint nextents) > > { > > @@ -59,7 +59,7 @@ xfs_trans_get_efi(struct xfs_trans *tp, > > * extent is to be logged as needing to be freed. It should > > * be called once for each extent to be freed. > > */ > > -void > > +STATIC void > > xfs_trans_log_efi_extent(struct xfs_trans *tp, > > struct xfs_efi_log_item *efip, > > xfs_fsblock_t start_block, > > Same here. Otherwise looks good: Ok, will do. --D > > Reviewed-by: Brian Foster > > > @@ -156,13 +156,13 @@ xfs_extent_free_diff_items( > > struct list_head *b) > > { > > struct xfs_mount *mp = priv; > > - struct xfs_bmap_free_item *ra; > > - struct xfs_bmap_free_item *rb; > > + struct xfs_extent_free_item *ra; > > + struct xfs_extent_free_item *rb; > > > > - ra = container_of(a, struct xfs_bmap_free_item, xbfi_list); > > - rb = container_of(b, struct xfs_bmap_free_item, xbfi_list); > > - return XFS_FSB_TO_AGNO(mp, ra->xbfi_startblock) - > > - XFS_FSB_TO_AGNO(mp, rb->xbfi_startblock); > > + ra = container_of(a, struct xfs_extent_free_item, xefi_list); > > + rb = container_of(b, struct xfs_extent_free_item, xefi_list); > > + return XFS_FSB_TO_AGNO(mp, ra->xefi_startblock) - > > + XFS_FSB_TO_AGNO(mp, rb->xefi_startblock); > > } > > > > /* Get an EFI. */ > > @@ -181,11 +181,11 @@ xfs_extent_free_log_item( > > void *intent, > > struct list_head *item) > > { > > - struct xfs_bmap_free_item *free; > > + struct xfs_extent_free_item *free; > > > > - free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > > - xfs_trans_log_efi_extent(tp, intent, free->xbfi_startblock, > > - free->xbfi_blockcount); > > + free = container_of(item, struct xfs_extent_free_item, xefi_list); > > + xfs_trans_log_efi_extent(tp, intent, free->xefi_startblock, > > + free->xefi_blockcount); > > } > > > > /* Get an EFD so we can process all the free extents. */ > > @@ -207,13 +207,13 @@ xfs_extent_free_finish_item( > > void *done_item, > > void **state) > > { > > - struct xfs_bmap_free_item *free; > > + struct xfs_extent_free_item *free; > > int error; > > > > - free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > > + free = container_of(item, struct xfs_extent_free_item, xefi_list); > > error = xfs_trans_free_extent(tp, done_item, > > - free->xbfi_startblock, > > - free->xbfi_blockcount); > > + free->xefi_startblock, > > + free->xefi_blockcount); > > kmem_free(free); > > return error; > > } > > @@ -231,9 +231,9 @@ STATIC void > > xfs_extent_free_cancel_item( > > struct list_head *item) > > { > > - struct xfs_bmap_free_item *free; > > + struct xfs_extent_free_item *free; > > > > - free = container_of(item, struct xfs_bmap_free_item, xbfi_list); > > + free = container_of(item, struct xfs_extent_free_item, xefi_list); > > kmem_free(free); > > } > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 2 16:38:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BC11C7CA4 for ; Tue, 2 Aug 2016 16:38:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3258FAC001 for ; Tue, 2 Aug 2016 14:38:21 -0700 (PDT) X-ASG-Debug-ID: 1470173899-0bf57c13692faed0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jptPKdDKHC281DxK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 14:38:19 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D90414E034; Tue, 2 Aug 2016 21:38:18 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72LcIkF025611; Tue, 2 Aug 2016 17:38:18 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 44007120BDC; Tue, 2 Aug 2016 17:38:17 -0400 (EDT) Date: Tue, 2 Aug 2016 17:38:17 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 19/47] xfs: add tracepoints and error injection for deferred extent freeing Message-ID: <20160802213816.GA8100@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 19/47] xfs: add tracepoints and error injection for deferred extent freeing References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907709074.25461.17602977707506082040.stgit@birch.djwong.org> <20160802184800.GB58152@bfoster.bfoster> <20160802202425.GK8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802202425.GK8590@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 02 Aug 2016 21:38:18 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470173899 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5787 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 02, 2016 at 01:24:25PM -0700, Darrick J. Wong wrote: > On Tue, Aug 02, 2016 at 02:48:00PM -0400, Brian Foster wrote: > > On Wed, Jul 20, 2016 at 09:58:10PM -0700, Darrick J. Wong wrote: > > > Add a couple of tracepoints for the deferred extent free operation and > > > a site for injecting errors while finishing the operation. This makes > > > it easier to debug deferred ops and test log redo. > > > > > > Signed-off-by: Darrick J. Wong > > > --- > > > fs/xfs/libxfs/xfs_alloc.c | 7 +++++++ > > > fs/xfs/libxfs/xfs_bmap.c | 2 ++ > > > fs/xfs/xfs_error.h | 4 +++- > > > fs/xfs/xfs_trace.h | 5 ++++- > > > 4 files changed, 16 insertions(+), 2 deletions(-) > > > > > > > > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > > > index 5993f87..22ac3f1 100644 > > > --- a/fs/xfs/libxfs/xfs_alloc.c > > > +++ b/fs/xfs/libxfs/xfs_alloc.c > > > @@ -2702,6 +2702,13 @@ xfs_free_extent( > > > > > > ASSERT(len != 0); > > > > > > + trace_xfs_bmap_free_deferred(mp, agno, 0, agbno, len); > > > + > > > > Hmm, but the bmap code isn't the only caller here. I was thinking that > > maybe we'd be better served by pushing these down into xfs_defer_add() > > and friends, but I guess we don't necessarily have the extent > > information at that layer. > > Correct, we don't. > > > How about we just rename these tracepoints to match the function names > > so they don't confuse me in the future? :) > > I broke with the function name convention so that the entry and exit > tracepoints to deferred items would all have names that easily matched > wildcards to make my life easier: > > # trace-cmd record -e 'xfs_*_defer' -e 'xfs_*_deferred' -F ... > The xfs_bmap_free_defer tp seems reasonable, but xfs_bmap_free_deferred doesn't really make sense when called via other places where nothing has been deferred. I'm not totally sure I follow what the goal is with this tracepoint wrt to naming that the trace_xfs_defer_*() tracepoints don't already achieve (combined with standard infrastructure tracepoints), but if the name is important, we should at least put it somewhere where it's only triggered via a deferred operation (e.g., xfs_extent_free_finish_item()). > > > + if (XFS_TEST_ERROR(false, mp, > > > + XFS_ERRTAG_FREE_EXTENT, > > > + XFS_RANDOM_FREE_EXTENT)) > > > + return -EIO; > > > + > > > error = xfs_free_extent_fix_freelist(tp, agno, &agbp); > > > if (error) > > > return error; > > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > > > index 540a6b7..8e14ff4 100644 > > > --- a/fs/xfs/libxfs/xfs_bmap.c > > > +++ b/fs/xfs/libxfs/xfs_bmap.c > > > @@ -596,6 +596,8 @@ xfs_bmap_add_free( > > > new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); > > > new->xefi_startblock = bno; > > > new->xefi_blockcount = (xfs_extlen_t)len; > > > + trace_xfs_bmap_free_defer(mp, XFS_FSB_TO_AGNO(mp, bno), 0, > > > + XFS_FSB_TO_AGBNO(mp, bno), len); > > > xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_FREE, &new->xefi_list); > > > } > > > > > > diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h > > > index 2e4f67f..da6f951 100644 > > > --- a/fs/xfs/xfs_error.h > > > +++ b/fs/xfs/xfs_error.h > > > @@ -90,7 +90,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp); > > > #define XFS_ERRTAG_STRATCMPL_IOERR 19 > > > #define XFS_ERRTAG_DIOWRITE_IOERR 20 > > > #define XFS_ERRTAG_BMAPIFORMAT 21 > > > -#define XFS_ERRTAG_MAX 22 > > > +#define XFS_ERRTAG_FREE_EXTENT 22 > > > +#define XFS_ERRTAG_MAX 23 > > > > > > /* > > > * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. > > > @@ -117,6 +118,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); > > > #define XFS_RANDOM_STRATCMPL_IOERR (XFS_RANDOM_DEFAULT/10) > > > #define XFS_RANDOM_DIOWRITE_IOERR (XFS_RANDOM_DEFAULT/10) > > > #define XFS_RANDOM_BMAPIFORMAT XFS_RANDOM_DEFAULT > > > +#define XFS_RANDOM_FREE_EXTENT 1 > > > > > > > Why not XFS_RANDOM_DEFAULT? > > I don't want the injected redo errors going off at random -- I want to set > one and have it go off the very next time we hit it. This way I can write > the xfstests like so: > > mkfs/mount > write to a file; sync > set a logic bomb for the next time we free an extent > truncate the file > > unmount > check that xfs_repair grumbles about the dirty log > mount > check the file > > Were the free-extent bomb set to go off at XFS_RANDOM_DEFAULT intervals, it'd > only have a 1/100 chance of triggering, which makes it harder to test. > Ok. Brian > --D > > > > > Brian > > > > > #ifdef DEBUG > > > extern int xfs_error_test_active; > > > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > > > index a45b030..939caf5 100644 > > > --- a/fs/xfs/xfs_trace.h > > > +++ b/fs/xfs/xfs_trace.h > > > @@ -2417,9 +2417,12 @@ DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_cancel); > > > DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_finish); > > > DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_abort); > > > > > > -DEFINE_PHYS_EXTENT_DEFERRED_EVENT(xfs_defer_phys_extent); > > > DEFINE_MAP_EXTENT_DEFERRED_EVENT(xfs_defer_map_extent); > > > > > > +#define DEFINE_BMAP_FREE_DEFERRED_EVENT DEFINE_PHYS_EXTENT_DEFERRED_EVENT > > > +DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_defer); > > > +DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_deferred); > > > + > > > #endif /* _TRACE_XFS_H */ > > > > > > #undef TRACE_INCLUDE_PATH > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 2 16:38:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3903C7CA4 for ; Tue, 2 Aug 2016 16:38:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A4430AC001 for ; Tue, 2 Aug 2016 14:38:26 -0700 (PDT) X-ASG-Debug-ID: 1470173904-0bf57b369b359be0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id H0YJy4JqDWd8tdYt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 14:38:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 563F68535A; Tue, 2 Aug 2016 21:38:24 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-162.bos.redhat.com [10.18.41.162]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72LcOOG020309; Tue, 2 Aug 2016 17:38:24 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id ED42A120BDC; Tue, 2 Aug 2016 17:38:22 -0400 (EDT) Date: Tue, 2 Aug 2016 17:38:22 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 20/47] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt Message-ID: <20160802213822.GB8100@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 20/47] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907709719.25461.3104352212846077948.stgit@birch.djwong.org> <20160802184845.GC58152@bfoster.bfoster> <20160802200635.GJ8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802200635.GJ8590@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 02 Aug 2016 21:38:24 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470173904 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2594 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 02, 2016 at 01:06:35PM -0700, Darrick J. Wong wrote: > On Tue, Aug 02, 2016 at 02:48:46PM -0400, Brian Foster wrote: > > On Wed, Jul 20, 2016 at 09:58:17PM -0700, Darrick J. Wong wrote: > > > By my calculations, a 1,073,741,824 block AG with a 1k block size > > > can attain a maximum height of 9. Assuming a record size of 24 > > > bytes, a key/ptr size of 44 bytes, and half-full btree nodes, > > > we'd need 53,687,092 blocks for the records and ~6 million blocks > > > for the keys. That requires a btree of height 9. > > > > > > Signed-off-by: Darrick J. Wong > > > --- > > > > I believe you.. :) but could you add a bit more detail to the commit log > > just to describe the calculations (e.g., how many records per leaf > > block, keys per node block) so 1.) I don't have to try and figure it out > > ;) (and probably get it wrong) and 2.) so we have a reference in the git > > repo going forward? > > Block size = 1024b > sblock CRC header = 56b > == 1024-56 = 968 bytes for tree data > > rmapbt record = 24b > == 40 records per leaf block > > rmapbt ptr/key = 44b > == 22 ptr/keys per block > > Worst case, each block is half full, so 20 records and 11 ptrs per block. > > 1073741824 rmap records / 20 records per block > == 53687092 leaf blocks > > 53687092 leaves / 11 ptrs per block > == 4880645 level 1 blocks > == 443695 level 2 blocks > == 40336 level 3 blocks > == 3667 level 4 blocks > == 334 level 5 blocks > == 31 level 6 blocks > == 3 level 7 blocks > == 1 level 8 block > Thanks! Seems Ok to me.. with that in the commit log: Reviewed-by: Brian Foster > Yay latency.... > > (Hey, at least this isn't ext4 which has no lower bound on block fill...) > > --D > > > > > Brian > > > > > fs/xfs/libxfs/xfs_btree.h | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > > > > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > > > index b8bbb21..629ef4f 100644 > > > --- a/fs/xfs/libxfs/xfs_btree.h > > > +++ b/fs/xfs/libxfs/xfs_btree.h > > > @@ -133,7 +133,7 @@ do { \ > > > } \ > > > } while (0) > > > > > > -#define XFS_BTREE_MAXLEVELS 8 /* max of all btrees */ > > > +#define XFS_BTREE_MAXLEVELS 9 /* max of all btrees */ > > > > > > struct xfs_btree_ops { > > > /* size of the key and record structures */ > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Aug 2 16:41:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9DBE07CA4 for ; Tue, 2 Aug 2016 16:41:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0EBB1AC001 for ; Tue, 2 Aug 2016 14:41:07 -0700 (PDT) X-ASG-Debug-ID: 1470174064-0bf57c13682fafe0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id o3o2AABdwmqvzi7y for ; Tue, 02 Aug 2016 14:41:04 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DKBADTEqFXEMmOLHldg0WBUoJ5g3mdOQEBBoxfg2WCKIIPgX2GFwQCAoE+ORQBAQEBAQEBBgEBAQEBAQEBNkCEXwEFOhwjEAgDGAklDwUlAwcaE4gwv0EBAQgCJR6FRIUVihsFmTOOdY9JSItog3cehEIqMogxAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 07:11:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUhQr-00074Q-7L; Wed, 03 Aug 2016 07:41:01 +1000 Date: Wed, 3 Aug 2016 07:41:01 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace Message-ID: <20160802214101.GM16044@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace References: <20160802035651.GB8593@birch.djwong.org> <20160802122517.GD31492@infradead.org> <20160802154035.GI8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802154035.GI8590@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470174064 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 917 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31700 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 02, 2016 at 08:40:35AM -0700, Darrick J. Wong wrote: > On Tue, Aug 02, 2016 at 05:25:17AM -0700, Christoph Hellwig wrote: > > On Mon, Aug 01, 2016 at 08:56:51PM -0700, Darrick J. Wong wrote: > > > When we're iterating inode xattrs by handle, we have to copy the > > > cursor back to userspace so that a subsequent invocation actually > > > retrieves subsequent contents. > > > > Testcase? > > Found it while continuing development of xfs_scrub. I'll send along the > xfstest patch when I've finished polishing it. (It was harder than usual since > xfs_io doesn't /use/ the attr-by-handle interface... nothing does.) It was (and probably still is) used by SGI's HSM. I thought there was some coverage of the interface in the dmapi part of the xfstests suite, but perhaps it's only tested by SGI's internal hsm test suite... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 2 17:39:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 50C3D7CA4 for ; Tue, 2 Aug 2016 17:39:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 223048F8035 for ; Tue, 2 Aug 2016 15:39:58 -0700 (PDT) X-ASG-Debug-ID: 1470177592-0bf57b369e35c000001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id W1D1PdgbHqmMKoJd for ; Tue, 02 Aug 2016 15:39:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DKBADIH6FXEMmOLHldg0WBUoJ5g3mdOQEBBoxfhg2CD4F9hhcEAgKBPjkUAQEBAQEBAQYBAQEBAQEBATZAhF8BBTocIxAIAw4KCSUPBSUDBxoTiDC/GAEBCAIlHoVEhBKBA4l+HQWZM451j0mMMIN3HoRCKjKIMQEBAQ Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 08:09:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUiLm-0007AQ-CQ; Wed, 03 Aug 2016 08:39:50 +1000 Date: Wed, 3 Aug 2016 08:39:50 +1000 From: Dave Chinner To: Christoph Hellwig Cc: "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 11/47] xfs: move deferred operations into a separate file Message-ID: <20160802223950.GN16044@dastard> X-ASG-Orig-Subj: Re: [PATCH 11/47] xfs: move deferred operations into a separate file References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> <20160801080223.GB30547@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801080223.GB30547@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470177592 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 992 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 01, 2016 at 01:02:23AM -0700, Christoph Hellwig wrote: > I looked over this again and I really don't see the use case of merging > it. Yes, the freed extent, rmap and reflink code is fairly similar, but > there is all kinds of subtile differences that we need to paper over using > methods and flags. I think we're better off not trying to share this > code and have a separate, but easily understandable implementation > for each btree. At least for the traditional traditional freed extent > case the new code also is a lot less optimal than the previous version. Rather than have to make major changes to core infrastructure now, let's work this out as a separate patchset to clean up the rmap and reflink code in the next couple of releases. It's going to be better to get working code out there now under the experimental tag than it is is to keep it as an out of tree patchset for another cycle. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Aug 2 17:43:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BE1497CA4 for ; Tue, 2 Aug 2016 17:43:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4106AAC002 for ; Tue, 2 Aug 2016 15:43:34 -0700 (PDT) X-ASG-Debug-ID: 1470177810-0bf8157e6a3d99a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Cbv1VxvSM04wcTpF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 15:43:31 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u72MhTgt017401 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 22:43:29 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u72MhSJU011320 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 22:43:28 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u72MhRE6009003; Tue, 2 Aug 2016 22:43:28 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 15:43:27 -0700 Date: Tue, 2 Aug 2016 15:43:25 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, xfs@oss.sgi.com Subject: Re: [PATCH 19/47] xfs: add tracepoints and error injection for deferred extent freeing Message-ID: <20160802224325.GN8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 19/47] xfs: add tracepoints and error injection for deferred extent freeing References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907709074.25461.17602977707506082040.stgit@birch.djwong.org> <20160802184800.GB58152@bfoster.bfoster> <20160802202425.GK8590@birch.djwong.org> <20160802213816.GA8100@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802213816.GA8100@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470177811 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6315 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 02, 2016 at 05:38:17PM -0400, Brian Foster wrote: > On Tue, Aug 02, 2016 at 01:24:25PM -0700, Darrick J. Wong wrote: > > On Tue, Aug 02, 2016 at 02:48:00PM -0400, Brian Foster wrote: > > > On Wed, Jul 20, 2016 at 09:58:10PM -0700, Darrick J. Wong wrote: > > > > Add a couple of tracepoints for the deferred extent free operation and > > > > a site for injecting errors while finishing the operation. This makes > > > > it easier to debug deferred ops and test log redo. > > > > > > > > Signed-off-by: Darrick J. Wong > > > > --- > > > > fs/xfs/libxfs/xfs_alloc.c | 7 +++++++ > > > > fs/xfs/libxfs/xfs_bmap.c | 2 ++ > > > > fs/xfs/xfs_error.h | 4 +++- > > > > fs/xfs/xfs_trace.h | 5 ++++- > > > > 4 files changed, 16 insertions(+), 2 deletions(-) > > > > > > > > > > > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > > > > index 5993f87..22ac3f1 100644 > > > > --- a/fs/xfs/libxfs/xfs_alloc.c > > > > +++ b/fs/xfs/libxfs/xfs_alloc.c > > > > @@ -2702,6 +2702,13 @@ xfs_free_extent( > > > > > > > > ASSERT(len != 0); > > > > > > > > + trace_xfs_bmap_free_deferred(mp, agno, 0, agbno, len); > > > > + > > > > > > Hmm, but the bmap code isn't the only caller here. I was thinking that > > > maybe we'd be better served by pushing these down into xfs_defer_add() > > > and friends, but I guess we don't necessarily have the extent > > > information at that layer. > > > > Correct, we don't. > > > > > How about we just rename these tracepoints to match the function names > > > so they don't confuse me in the future? :) > > > > I broke with the function name convention so that the entry and exit > > tracepoints to deferred items would all have names that easily matched > > wildcards to make my life easier: > > > > # trace-cmd record -e 'xfs_*_defer' -e 'xfs_*_deferred' -F ... > > > > The xfs_bmap_free_defer tp seems reasonable, but xfs_bmap_free_deferred > doesn't really make sense when called via other places where nothing has > been deferred. > > I'm not totally sure I follow what the goal is with this tracepoint wrt > to naming that the trace_xfs_defer_*() tracepoints don't already achieve > (combined with standard infrastructure tracepoints), but if the name is > important, we should at least put it somewhere where it's only triggered > via a deferred operation (e.g., xfs_extent_free_finish_item()). Crap, you're right, the tp is in the wrong place. xfs_trans_free_extent() it is. Might as well rename them to xfs_extent_free_defer* while I'm at it. --D > > > > > + if (XFS_TEST_ERROR(false, mp, > > > > + XFS_ERRTAG_FREE_EXTENT, > > > > + XFS_RANDOM_FREE_EXTENT)) > > > > + return -EIO; > > > > + > > > > error = xfs_free_extent_fix_freelist(tp, agno, &agbp); > > > > if (error) > > > > return error; > > > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > > > > index 540a6b7..8e14ff4 100644 > > > > --- a/fs/xfs/libxfs/xfs_bmap.c > > > > +++ b/fs/xfs/libxfs/xfs_bmap.c > > > > @@ -596,6 +596,8 @@ xfs_bmap_add_free( > > > > new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); > > > > new->xefi_startblock = bno; > > > > new->xefi_blockcount = (xfs_extlen_t)len; > > > > + trace_xfs_bmap_free_defer(mp, XFS_FSB_TO_AGNO(mp, bno), 0, > > > > + XFS_FSB_TO_AGBNO(mp, bno), len); > > > > xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_FREE, &new->xefi_list); > > > > } > > > > > > > > diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h > > > > index 2e4f67f..da6f951 100644 > > > > --- a/fs/xfs/xfs_error.h > > > > +++ b/fs/xfs/xfs_error.h > > > > @@ -90,7 +90,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp); > > > > #define XFS_ERRTAG_STRATCMPL_IOERR 19 > > > > #define XFS_ERRTAG_DIOWRITE_IOERR 20 > > > > #define XFS_ERRTAG_BMAPIFORMAT 21 > > > > -#define XFS_ERRTAG_MAX 22 > > > > +#define XFS_ERRTAG_FREE_EXTENT 22 > > > > +#define XFS_ERRTAG_MAX 23 > > > > > > > > /* > > > > * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. > > > > @@ -117,6 +118,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); > > > > #define XFS_RANDOM_STRATCMPL_IOERR (XFS_RANDOM_DEFAULT/10) > > > > #define XFS_RANDOM_DIOWRITE_IOERR (XFS_RANDOM_DEFAULT/10) > > > > #define XFS_RANDOM_BMAPIFORMAT XFS_RANDOM_DEFAULT > > > > +#define XFS_RANDOM_FREE_EXTENT 1 > > > > > > > > > > Why not XFS_RANDOM_DEFAULT? > > > > I don't want the injected redo errors going off at random -- I want to set > > one and have it go off the very next time we hit it. This way I can write > > the xfstests like so: > > > > mkfs/mount > > write to a file; sync > > set a logic bomb for the next time we free an extent > > truncate the file > > > > unmount > > check that xfs_repair grumbles about the dirty log > > mount > > check the file > > > > Were the free-extent bomb set to go off at XFS_RANDOM_DEFAULT intervals, it'd > > only have a 1/100 chance of triggering, which makes it harder to test. > > > > Ok. > > Brian > > > --D > > > > > > > > Brian > > > > > > > #ifdef DEBUG > > > > extern int xfs_error_test_active; > > > > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > > > > index a45b030..939caf5 100644 > > > > --- a/fs/xfs/xfs_trace.h > > > > +++ b/fs/xfs/xfs_trace.h > > > > @@ -2417,9 +2417,12 @@ DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_cancel); > > > > DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_finish); > > > > DEFINE_DEFER_PENDING_EVENT(xfs_defer_pending_abort); > > > > > > > > -DEFINE_PHYS_EXTENT_DEFERRED_EVENT(xfs_defer_phys_extent); > > > > DEFINE_MAP_EXTENT_DEFERRED_EVENT(xfs_defer_map_extent); > > > > > > > > +#define DEFINE_BMAP_FREE_DEFERRED_EVENT DEFINE_PHYS_EXTENT_DEFERRED_EVENT > > > > +DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_defer); > > > > +DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_deferred); > > > > + > > > > #endif /* _TRACE_XFS_H */ > > > > > > > > #undef TRACE_INCLUDE_PATH > > > > > > > > _______________________________________________ > > > > xfs mailing list > > > > xfs@oss.sgi.com > > > > http://oss.sgi.com/mailman/listinfo/xfs From tinguely@sgi.com Tue Aug 2 17:47:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AA4E97CA1 for ; Tue, 2 Aug 2016 17:47:33 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay3.corp.sgi.com (Postfix) with ESMTP id 117D5AC001 for ; Tue, 2 Aug 2016 15:47:33 -0700 (PDT) Received: from eagdhcp-232-200.americas.sgi.com (128.162.232.200) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.224.2; Tue, 2 Aug 2016 17:47:32 -0500 Message-ID: <57A12305.7020506@sgi.com> Date: Tue, 2 Aug 2016 17:47:33 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Subject: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace References: <20160802035651.GB8593@birch.djwong.org> <20160802122517.GD31492@infradead.org> <20160802154035.GI8590@birch.djwong.org> <20160802214101.GM16044@dastard> In-Reply-To: <20160802214101.GM16044@dastard> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.232.200] On 08/02/16 16:41, Dave Chinner wrote: > On Tue, Aug 02, 2016 at 08:40:35AM -0700, Darrick J. Wong wrote: >> On Tue, Aug 02, 2016 at 05:25:17AM -0700, Christoph Hellwig wrote: >>> On Mon, Aug 01, 2016 at 08:56:51PM -0700, Darrick J. Wong wrote: >>>> When we're iterating inode xattrs by handle, we have to copy the >>>> cursor back to userspace so that a subsequent invocation actually >>>> retrieves subsequent contents. >>> Testcase? >> Found it while continuing development of xfs_scrub. I'll send along the >> xfstest patch when I've finished polishing it. (It was harder than usual since >> xfs_io doesn't /use/ the attr-by-handle interface... nothing does.) > It was (and probably still is) used by SGI's HSM. I thought there > was some coverage of the interface in the dmapi part of the xfstests > suite, but perhaps it's only tested by SGI's internal hsm test > suite... > > Cheers, > > Dave. You may be thinking of the DMAPI specific extended attribute interface and that is tested in xfstests. That function cannot cursor. This change would be appropriate to xfsdump (dumping extended attributes via jdm_attr_list()) than our HSM. I don't see a SGI test for attr_list_by_handle() nor jdm_attr_list(). There is mention in the xfstests source file src/open_unlink.c but that does not cursor. --Mark Tinguely. From smpessoa@terra.com.br Tue Aug 2 17:59:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=FREEMAIL_FROM, HTML_IMAGE_ONLY_24,HTML_MESSAGE,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 197647CA4 for ; Tue, 2 Aug 2016 17:59:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7F299AC003 for ; Tue, 2 Aug 2016 15:59:41 -0700 (PDT) X-ASG-Debug-ID: 1470178777-0bf57b369e35cd30001-NocioJ Received: from if06-mail-fb07-mia.mta.terra.com (if06-mail-fb07-mia.mta.terra.com [208.84.243.201]) by cuda.sgi.com with ESMTP id O2wG5dAGFQwmrTCa for ; Tue, 02 Aug 2016 15:59:38 -0700 (PDT) X-Barracuda-Envelope-From: smpessoa@terra.com.br X-Barracuda-Effective-Source-IP: if06-mail-fb07-mia.mta.terra.com[208.84.243.201] X-Barracuda-Apparent-Source-IP: 208.84.243.201 Received: from mail-smtp05-mia.tpn.terra.com (unknown [10.235.200.48]) by mail-fb07-mia.tpn.terra.com (Postfix) with ESMTP id 7446F18248C08; Tue, 2 Aug 2016 22:59:37 +0000 (UTC) X-Terra-Karma: -2% X-Terra-Hash: ecc457f0803b1a6caaf103c0d87d978e Received: from lywa.com (unknown [177.39.37.148]) (authenticated user smpessoa@terra.com.br) by mail-smtp05-mia.tpn.terra.com (Postfix) with ESMTPA id 9571AB6; Tue, 2 Aug 2016 22:59:33 +0000 (UTC) From: Cyril Brulebois To: "Miles Fidelman" , "793495" <793495@bugs.debian.org>, "xfs" , "751731" <751731@bugs.debian.org> Subject: =?utf-8?B?cGVyZmVjdCB3b3Jkcw==?= Date: Wed, 3 Aug 2016 01:59:24 +0300 X-ASG-Orig-Subj: =?utf-8?B?cGVyZmVjdCB3b3Jkcw==?= Message-ID: <00002682e82f$5b20b92d$f5b21933$@free.fr> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0001_301B2FA8.3A63124D" X-Mailer: Microsoft Outlook 16.0 Thread-Index: AdH+2AeWubtvXfga3guEyuxaHGiwzA== Content-Language: en-us X-CMAE-Score: 0 X-Barracuda-Connect: if06-mail-fb07-mia.mta.terra.com[208.84.243.201] X-Barracuda-Start-Time: 1470178778 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2504 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.29 X-Barracuda-Spam-Status: No, SCORE=1.29 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_IMAGE_ONLY_24, HTML_IMAGE_ONLY_24_2, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_IMAGE_ONLY_24 BODY: HTML: images with 2000-2400 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 1.28 HTML_IMAGE_ONLY_24_2 HTML: images with 2000-2400 bytes of words This is a multipart message in MIME format. ------=_NextPart_000_0001_301B2FA8.3A63124D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGkgZnJpZW5kISANCkkgd2FzIHJlYWRpbmcgIGFuIGFydGljbGUgYW5kIHN1ZGRlbmx5IGNhbWUg YWNjcm9zcyB0aG9zZSB3b3JkcywgdGhleSBhcmUganVzdCBwZXJmZWN0LCB5b3UgIGNhbiBmaW5k IHRoZSBhcnRpY2xlIGhlcmUgIDxodHRwOi8vaW52aXRlLnRoZWd1eWdlYXIuY29tL2U0emJoZ3U+ DQpDaGVlcnMsIEN5cmlsIEJydWxlYm9pcw0K ------=_NextPart_000_0001_301B2FA8.3A63124D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

<= span lang=3DEN-US>Hi friend!

I was reading an article and suddenly came accro= ss those words, they are just perfect, you can find the article here = http://invite.theguy= gear.com/e4zbhgu

Cheers, Cyril Brulebois

 

------=_NextPart_000_0001_301B2FA8.3A63124D-- From david@fromorbit.com Tue Aug 2 18:15:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D6C1E7CA4 for ; Tue, 2 Aug 2016 18:15:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BF72304032 for ; Tue, 2 Aug 2016 16:15:05 -0700 (PDT) X-ASG-Debug-ID: 1470179702-0bf8157e6a3dc580001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id BRttCv8KmuivUVga for ; Tue, 02 Aug 2016 16:15:02 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B2BQDoJ6FXEMmOLHldg0WBUoZynTsGjF+GDYIPgX2GFwICAQECgT45FAEBAQEBAQEGAQEBAQEBAQE2QIRfAQU6HCMQCAMOCgklDwUlAwcaE4gwvn4BAQEHAgEkHoVEhRWKGwWZM451j0mMMIN3HoRCKjKIMQEBAQ Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 08:45:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUitp-0007El-2U; Wed, 03 Aug 2016 09:15:01 +1000 Date: Wed, 3 Aug 2016 09:15:01 +1000 From: Dave Chinner To: Zorro Lang Cc: fstests@vger.kernel.org, sandeen@redhat.com, eguan@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/006: add EIO error handling test Message-ID: <20160802231501.GO12670@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/006: add EIO error handling test References: <1469976234-15121-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1469976234-15121-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470179702 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1756 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31703 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Jul 31, 2016 at 10:43:54PM +0800, Zorro Lang wrote: > Except fail_at_unmount, all EIO error handling can stop umount hanging > on IO error too. This case only tested fail_at_unmount before, so add > EIO/max_retries and EIO/retry_timeout_seconds test. > > Now this case test three situation when unmount hit EIO: > 1) fail_at_unmount=1 && \ > EIO/max_retries=-1 && \ > EIO/retry_timeout_seconds=0 > > 2) fail_at_unmount=0 && \ > EIO/max_retries=1 && \ > EIO/retry_timeout_seconds=0 > > 3) fail_at_unmount=0 && \ > EIO/max_retries=-1 && \ > EIO/retry_timeout_seconds=1 > > Signed-off-by: Zorro Lang > --- > > Hi, > > There're three patches from Eric fix XFS error handling bugs: > 5539d36 xfs: don't reset b_retries to 0 on every failure > 0b4db5d xfs: remove extraneous buffer flag changes > e97f6c5 xfs: fix xfs_error_get_cfg for negative errnos > > Without these patches, configurable error handling cannot be properly > set, and once set is not honored. > > For test part of this bug, add EIO error handling test into xfs/006. > The kernel with above 3 patches shouldn't hang on xfs/006. > > I haven't got an idea about how to test ENOSPC and default error > handling. So use EIO test to prove above patches can work well > on EIO handling at least. Can you put this into a new test? We don't tend to extend tests to add new cases, we add new tests instead. Factor the common parts of the tests into generic functions in common/ somewhere and call them from each test. This way adding new test cases doesn't cause tests that previously passed to fail and hence signal false regressions. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 2 18:23:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2BD377CA4 for ; Tue, 2 Aug 2016 18:23:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 93031AC002 for ; Tue, 2 Aug 2016 16:23:10 -0700 (PDT) X-ASG-Debug-ID: 1470180187-0bf57c136a2ffc80001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id geQhoOOjAhFmrAEf for ; Tue, 02 Aug 2016 16:23:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B2BQB+KqFXEMmOLHldg0WBUoZynTsGjF+GDYIPgX2GFwICAQECgT45FAEBAQEBAQEGAQEBAQEBAQE2QIRfAQU6HCMQCAMOCgklDwUlAwcaE4gwvn8BAQEBBgIBJB6FRIUVihsFjhaFWoVDjnWBdYgLhUmGZIVMg3cehEIqMogxAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 08:53:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUj1d-0007Fb-QH; Wed, 03 Aug 2016 09:23:05 +1000 Date: Wed, 3 Aug 2016 09:23:05 +1000 From: Dave Chinner To: Christoph Hellwig Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] generic/095: update warning whitelist Message-ID: <20160802232305.GQ12670@dastard> X-ASG-Orig-Subj: Re: [PATCH] generic/095: update warning whitelist References: <1470042176-31447-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470042176-31447-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470180187 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1306 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 01, 2016 at 11:02:56AM +0200, Christoph Hellwig wrote: > The recent direct I/O path refactor changed the function name in the > racing read case. Update the test case to handle the new name in > addition to the old one. > > Signed-off-by: Christoph Hellwig > --- > tests/generic/095 | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/tests/generic/095 b/tests/generic/095 > index c656ef1..4754992 100755 > --- a/tests/generic/095 > +++ b/tests/generic/095 > @@ -125,9 +125,11 @@ $FIO_PROG $fio_config >>$seqres.full 2>&1 > filter_xfs_dmesg() > { > local warn1="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_dio_aio_write.*" > - local warn2="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_read_iter.*" > + local warn2="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_dio_aio_read.*" > + local warn3="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_read_iter.*" > sed -e "s#$warn1#Intentional warnings in xfs_file_dio_aio_write#" \ > - -e "s#$warn2#Intentional warnings in xfs_file_read_iter#" > + -e "s#$warn2#Intentional warnings in xfs_file_dio_aio_read#" \ > + -e "s#$warn3#Intentional warnings in xfs_file_read_iter#" > } Looks fine. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Tue Aug 2 18:41:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 635A47CA4 for ; Tue, 2 Aug 2016 18:41:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 27EF18F8033 for ; Tue, 2 Aug 2016 16:41:13 -0700 (PDT) X-ASG-Debug-ID: 1470181271-0bf57c1369301320001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id IiFWAWn1tWPHui2j for ; Tue, 02 Aug 2016 16:41:12 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BiFQAoL6FXIMmOLHldg0WBA0+Gcp07BpJsgg+JWjkUAQEBAQEBAQYBAQEBAQE4QEEQAYQ6LyMYGGoDBy2IML8vhWKJJQ1vhHIdBZkzjwGBaYgLhUcChmSJQx6BdwELAYI+KjKGagIBJYEfAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 09:10:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1bUjIk-0007HW-7Z; Wed, 03 Aug 2016 09:40:46 +1000 Received: from dave by disappointment with local (Exim 4.87) (envelope-from ) id 1bUjIQ-0005SL-I6; Wed, 03 Aug 2016 09:40:26 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: jack@suse.cz Subject: [PATCH] xfs: don't invalidate whole file on DAX read/write Date: Wed, 3 Aug 2016 09:40:26 +1000 X-ASG-Orig-Subj: [PATCH] xfs: don't invalidate whole file on DAX read/write Message-Id: <1470181226-20935-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.8.0.rc3 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470181271 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1781 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we do DAX IO, we try to invalidate the entire page cache held on the file. This is incorrect as it will trash the entire mapping tree that now tracks dirty state in exceptional entries in the radix tree slots. What we are trying to do is remove cached pages (e.g from reads into holes) that sit in the radix tree over the range we are about to write to. Hence we should just limit the invalidation to the range we are about to overwrite. Reported-by: Jan Kara Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ed95e5b..e612a02 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -741,9 +741,20 @@ xfs_file_dax_write( * page is inserted into the pagecache when we have to serve a write * fault on a hole. It should never be dirtied and can simply be * dropped from the pagecache once we get real data for the page. + * + * XXX: This is racy against mmap, and there's nothing we can do about + * it. dax_do_io() should really do this invalidation internally as + * it will know if we've allocated over a holei for this specific IO and + * if so it needs to update the mapping tree and invalidate existing + * PTEs over the newly allocated range. Remove this invalidation when + * dax_do_io() is fixed up. */ if (mapping->nrpages) { - ret = invalidate_inode_pages2(mapping); + loff_t end = iocb->ki_pos + iov_iter_count(from) - 1; + + ret = invalidate_inode_pages2_range(mapping, + iocb->ki_pos >> PAGE_SHIFT, + end >> PAGE_SHIFT); WARN_ON_ONCE(ret); } -- 2.8.0.rc3 From david@fromorbit.com Tue Aug 2 18:42:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E793B7CA4 for ; Tue, 2 Aug 2016 18:42:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A451AC002 for ; Tue, 2 Aug 2016 16:42:52 -0700 (PDT) X-ASG-Debug-ID: 1470181369-0bf8157e6d3df630001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id jzMNgW5NA591nNjC for ; Tue, 02 Aug 2016 16:42:49 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2ALDQAoL6FXIMmOLHldg0WBUoZynTsGjF+IHIF9hhcEAgKBPjoTAQEBAQEBAQYBAQEBAQE4QIRfAQUnExwjEAgDDgoJJQ8FJQMHGhOIML5+AQslHoVEhRWKGwEEk3CFQ451j0mMMIN3HwGEQCoyiDEBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 09:12:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUjKh-0007Hj-UK; Wed, 03 Aug 2016 09:42:47 +1000 Date: Wed, 3 Aug 2016 09:42:47 +1000 From: Dave Chinner To: Christoph Hellwig Cc: rpeterso@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: iomap infrastructure and multipage writes V5 Message-ID: <20160802234247.GO16044@dastard> X-ASG-Orig-Subj: Re: iomap infrastructure and multipage writes V5 References: <1464792297-13185-1-git-send-email-hch@lst.de> <20160628002649.GI12670@dastard> <20160630172239.GA23082@lst.de> <20160718111400.GC16044@dastard> <20160718111851.GD16044@dastard> <20160731191900.GA29301@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160731191900.GA29301@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470181369 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1406 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Jul 31, 2016 at 09:19:00PM +0200, Christoph Hellwig wrote: > Now after spending this much time I've started wondering why we even > reserve blocks in xfs_iomap_write_allocate - after all we've reserved > space for the actual data blocks and the indlen worst case in > xfs_bmapi_reserve_delalloc. And in fact a little hack to drop that > reservation seems to solve both the root cause (depleted reserved pool) > and the cleanup mess. I just haven't spend enought time to convince > myself that it's actually safe, and in fact looking at the allocator > makes me thing it only works by accident currently despite generally > postive test results. > > Here is the quick patch if anyone wants to chime in: > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 620fc91..67c317f 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -717,7 +717,7 @@ xfs_iomap_write_allocate( > > nimaps = 0; > while (nimaps == 0) { > - nres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK); > + nres = 0; // XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK); > > error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, nres, > 0, XFS_TRANS_RESERVE, &tp); > This solves the problem for me, and from history appears to be the right thing to do. Christoph, can you send a proper patch for this? Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Aug 2 18:53:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D9BCA7CA4 for ; Tue, 2 Aug 2016 18:53:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 903A38F8033 for ; Tue, 2 Aug 2016 16:53:31 -0700 (PDT) X-ASG-Debug-ID: 1470182007-0bf8157e6c3dfd30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id cE1J6u3CH93K8M59 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 16:53:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u72Nr2YT020828 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 2 Aug 2016 23:53:02 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u72Nr2pi022185 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 23:53:02 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u72Nqs6l014229; Tue, 2 Aug 2016 23:53:00 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 16:52:54 -0700 Date: Tue, 2 Aug 2016 16:52:51 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: [PATCH] xfs: test attr_list_by_handle cursor iteration Message-ID: <20160802235251.GB8586@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs: test attr_list_by_handle cursor iteration MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470182007 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8719 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Apparently the XFS attr_list_by_handle ioctl has never actually copied the cursor contents back to user space, which means that iteration has never worked. Add a test case for this and see the patch "xfs: in _attrlist_by_handle, copy the cursor back to userspace". Signed-off-by: Darrick J. Wong --- src/Makefile | 3 - src/attr-list-by-handle-cursor-test.c | 186 +++++++++++++++++++++++++++++++++ tests/xfs/700 | 64 +++++++++++ tests/xfs/700.out | 5 + tests/xfs/group | 1 5 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 src/attr-list-by-handle-cursor-test.c create mode 100755 tests/xfs/700 create mode 100644 tests/xfs/700.out diff --git a/src/Makefile b/src/Makefile index 1bf318b..ae06d50 100644 --- a/src/Makefile +++ b/src/Makefile @@ -20,7 +20,8 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ seek_copy_test t_readdir_1 t_readdir_2 fsync-tester nsexec cloner \ - renameat2 t_getcwd e4compact test-nextquota punch-alternating + renameat2 t_getcwd e4compact test-nextquota punch-alternating \ + attr-list-by-handle-cursor-test SUBDIRS = diff --git a/src/attr-list-by-handle-cursor-test.c b/src/attr-list-by-handle-cursor-test.c new file mode 100644 index 0000000..5aef79c --- /dev/null +++ b/src/attr-list-by-handle-cursor-test.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ATTRBUFSZ 1024 +#define BSTATBUF_SZ 1024 + +/* Read all the extended attributes of a file handle. */ +void +read_handle_xattrs( + struct xfs_handle *handle, + bool root_space) +{ + struct attrlist_cursor cur; + char attrbuf[ATTRBUFSZ]; + char *firstname = NULL; + struct attrlist *attrlist = (struct attrlist *)attrbuf; + struct attrlist_ent *ent; + int i; + int flags = 0; + int error; + + if (root_space) + flags |= ATTR_ROOT; + + memset(&cur, 0, sizeof(cur)); + while ((error = attr_list_by_handle(handle, sizeof(*handle), + attrbuf, ATTRBUFSZ, flags, + &cur)) == 0) { + for (i = 0; i < attrlist->al_count; i++) { + ent = ATTR_ENTRY(attrlist, i); + + if (i != 0) + continue; + + if (firstname == NULL) { + firstname = malloc(ent->a_valuelen); + memcpy(firstname, ent->a_name, ent->a_valuelen); + } else { + if (memcmp(firstname, ent->a_name, + ent->a_valuelen) == 0) + fprintf(stderr, + "Saw duplicate xattr \"%s\", buggy XFS?\n", + ent->a_name); + else + fprintf(stderr, + "Test passes.\n"); + goto out; + } + } + + if (!attrlist->al_more) + break; + } + +out: + if (firstname) + free(firstname); + if (error) + perror("attr_list_by_handle"); + return; +} + +/* Iterate a range of inodes. */ +void +find_inode( + struct xfs_handle *fshandle, + int fd, + ino_t ino) +{ + struct xfs_fsop_bulkreq bulkreq; + struct xfs_bstat *bstatbuf; + struct xfs_bstat *p; + struct xfs_bstat *endp; + struct xfs_handle handle; + __u64 first_ino = ino & ~63; + __s32 buflenout = 0; + int error; + + bstatbuf = malloc(BSTATBUF_SZ * sizeof(struct xfs_bstat)); + if (!bstatbuf) { + perror("bulkstat malloc"); + return; + } + + bulkreq.lastip = (__u64 *)&first_ino; + bulkreq.icount = BSTATBUF_SZ; + bulkreq.ubuffer = (void *)bstatbuf; + bulkreq.ocount = &buflenout; + + memcpy(&handle.ha_fsid, fshandle, sizeof(handle.ha_fsid)); + handle.ha_fid.fid_len = sizeof(xfs_fid_t) - + sizeof(handle.ha_fid.fid_len); + handle.ha_fid.fid_pad = 0; + while ((error = xfsctl("", fd, XFS_IOC_FSBULKSTAT, &bulkreq)) == 0) { + if (buflenout == 0) + break; + for (p = bstatbuf, endp = bstatbuf + buflenout; p < endp; p++) { + if (p->bs_ino > ino) { + fprintf(stderr, + "Expected ino %llu, got %llu.\n", + (unsigned long long)ino, p->bs_ino); + goto out; + } + + handle.ha_fid.fid_gen = p->bs_gen; + handle.ha_fid.fid_ino = p->bs_ino; + + read_handle_xattrs(&handle, false); + read_handle_xattrs(&handle, true); + goto out; + } + } + + if (error) + perror("bulkstat"); +out: + free(bstatbuf); + return; +} + +int main( + int argc, + char *argv[]) +{ + struct xfs_handle *fshandle; + size_t fshandle_len; + struct stat sb; + int fd; + int error; + + if (argc != 2) { + fprintf(stderr, "Usage: %s filename\n", argv[0]); + return 1; + } + + error = path_to_fshandle(argv[1], (void **)&fshandle, &fshandle_len); + if (error) { + perror("getting fshandle"); + return 2; + } + + fd = open(argv[1], O_RDONLY); + if (fd < 0) { + perror("opening file"); + return 2; + } + + error = fstat(fd, &sb); + if (error) { + perror("fstat file"); + return 2; + } + + find_inode(fshandle, fd, sb.st_ino); + + close(fd); + free_handle(fshandle, fshandle_len); + return 0; +} diff --git a/tests/xfs/700 b/tests/xfs/700 new file mode 100755 index 0000000..4a5680d --- /dev/null +++ b/tests/xfs/700 @@ -0,0 +1,64 @@ +#! /bin/bash +# FS QA Test No. 700 +# +# Check that attr_list_by_handle copies the cursor back to userspace. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/testout +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_os Linux +_require_scratch +_require_test_program "attr-list-by-handle-cursor-test" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Stuff file with xattrs" +mkdir $SCRATCH_MNT/foo +__populate_create_attr $SCRATCH_MNT/foo 100 + +echo "Run test program" +./src/attr-list-by-handle-cursor-test $SCRATCH_MNT/foo + +# success, all done +status=0 +exit diff --git a/tests/xfs/700.out b/tests/xfs/700.out new file mode 100644 index 0000000..493a68a --- /dev/null +++ b/tests/xfs/700.out @@ -0,0 +1,5 @@ +QA output created by 700 +Format and mount +Stuff file with xattrs +Run test program +Test passes. diff --git a/tests/xfs/group b/tests/xfs/group index ff0efa5..ae12e74 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -307,3 +307,4 @@ 325 auto quick clone 326 auto quick clone 327 auto quick clone +700 auto quick From darrick.wong@oracle.com Tue Aug 2 18:58:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9F3AF7CA4 for ; Tue, 2 Aug 2016 18:58:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 162BBAC002 for ; Tue, 2 Aug 2016 16:58:02 -0700 (PDT) X-ASG-Debug-ID: 1470182277-0bf57c1369301c10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HvykXRGNvzluGhyz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 16:57:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u72NvYng024041 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 23:57:35 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u72NvYcp014719 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 2 Aug 2016 23:57:34 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u72NvXQ5005235; Tue, 2 Aug 2016 23:57:34 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 16:57:33 -0700 Date: Tue, 2 Aug 2016 16:57:32 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace Message-ID: <20160802235732.GD8593@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: in _attrlist_by_handle, copy the cursor back to userspace References: <20160802035651.GB8593@birch.djwong.org> <20160802122517.GD31492@infradead.org> <20160802154035.GI8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802154035.GI8590@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470182278 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 970 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31705 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 02, 2016 at 08:40:35AM -0700, Darrick J. Wong wrote: > On Tue, Aug 02, 2016 at 05:25:17AM -0700, Christoph Hellwig wrote: > > On Mon, Aug 01, 2016 at 08:56:51PM -0700, Darrick J. Wong wrote: > > > When we're iterating inode xattrs by handle, we have to copy the > > > cursor back to userspace so that a subsequent invocation actually > > > retrieves subsequent contents. > > > > Testcase? > > Found it while continuing development of xfs_scrub. I'll send along the > xfstest patch when I've finished polishing it. (It was harder than usual since > xfs_io doesn't /use/ the attr-by-handle interface... nothing does.) Found some extra time while I run all of today's rmap changes through QA to push to Dave, so I fixed (I hope) the remaining problems I had and sent out a testcase. --D > > --D > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Tue Aug 2 19:13:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ECF4E7CA4 for ; Tue, 2 Aug 2016 19:13:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3B37304032 for ; Tue, 2 Aug 2016 17:13:31 -0700 (PDT) X-ASG-Debug-ID: 1470183207-0bf8157e6b3e06d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Vwi1sBIBUFyiS2SQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 17:13:28 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u730D0DI029218 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 00:13:00 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u730CxRd017058 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 00:13:00 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u730CwuX032078; Wed, 3 Aug 2016 00:12:59 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 17:12:58 -0700 Date: Tue, 2 Aug 2016 17:12:57 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 07/47] xfs: add function pointers for get/update keys to the btree Message-ID: <20160803001257.GO8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 07/47] xfs: add function pointers for get/update keys to the btree References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907700604.25461.2181974283557088355.stgit@birch.djwong.org> <20160801063902.GI15590@infradead.org> <20160801173331.GC8590@birch.djwong.org> <20160802122325.GA11128@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802122325.GA11128@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470183208 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16448 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31705 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 02, 2016 at 05:23:25AM -0700, Christoph Hellwig wrote: > On Mon, Aug 01, 2016 at 10:33:31AM -0700, Darrick J. Wong wrote: > > That's roughly the approach I took in previous versions of this patch, > > but using the OVERLAPPING flag to dispatch the overlapped vs. non- > > versions of the get*keys and updkey* functions confused Dave, so he > > asked me to add to function pointers[1] to the btree ops and dispatch > > that way. > > I remember I had a similar disagreement with Dave on the long vs > short pointers when doing the initial common btree work, and > I prevailed using the flag :) > > Below is a patch to on top of your for-dave-for-4.8-2 branch > which uses the flag, but also keeps your useful refactoring. > > This both reduces source: > > 6 files changed, 61 insertions(+), 136 deletions(-) > > as well as binary: > > hch@brick:~/work/xfs$ size xfs.o-* > text data bss dec hex filename > 911881 160951 1568 1074400 1064e0 xfs.o-flag > 912457 160951 1568 1074976 106720 xfs.o-pointer > > sizes and makes the whole thing much easier to follow and understand. Ok, sounds good. Disentangling this was actually simpler than I thought it would be, so I tossed it on the branch I'm (imminently) sending to Dave. I reworked some of the comments to reflect the newer approach. We ought to collect a S-o-B from you too. --D > > diff --git a/fs/xfs/libxfs/xfs_alloc_btree.c b/fs/xfs/libxfs/xfs_alloc_btree.c > index c60eeb8..5ba2dac 100644 > --- a/fs/xfs/libxfs/xfs_alloc_btree.c > +++ b/fs/xfs/libxfs/xfs_alloc_btree.c > @@ -403,10 +403,6 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { > .keys_inorder = xfs_allocbt_keys_inorder, > .recs_inorder = xfs_allocbt_recs_inorder, > #endif > - > - .get_leaf_keys = xfs_btree_get_leaf_keys, > - .get_node_keys = xfs_btree_get_node_keys, > - .update_keys = xfs_btree_update_keys, > }; > > /* > diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c > index 9e34ca4..cd85274 100644 > --- a/fs/xfs/libxfs/xfs_bmap_btree.c > +++ b/fs/xfs/libxfs/xfs_bmap_btree.c > @@ -763,10 +763,6 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { > .keys_inorder = xfs_bmbt_keys_inorder, > .recs_inorder = xfs_bmbt_recs_inorder, > #endif > - > - .get_leaf_keys = xfs_btree_get_leaf_keys, > - .get_node_keys = xfs_btree_get_node_keys, > - .update_keys = xfs_btree_update_keys, > }; > > /* > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > index fe5f27e..45a9545b 100644 > --- a/fs/xfs/libxfs/xfs_btree.c > +++ b/fs/xfs/libxfs/xfs_btree.c > @@ -1951,29 +1951,6 @@ error0: > return error; > } > > -/* Determine the low key of a leaf block (simple) */ > -void > -xfs_btree_get_leaf_keys( > - struct xfs_btree_cur *cur, > - struct xfs_btree_block *block, > - union xfs_btree_key *key) > -{ > - union xfs_btree_rec *rec; > - > - rec = xfs_btree_rec_addr(cur, 1, block); > - cur->bc_ops->init_key_from_rec(key, rec); > -} > - > -/* Determine the low key of a node block (simple) */ > -void > -xfs_btree_get_node_keys( > - struct xfs_btree_cur *cur, > - struct xfs_btree_block *block, > - union xfs_btree_key *key) > -{ > - memcpy(key, xfs_btree_key_addr(cur, 1, block), cur->bc_ops->key_len); > -} > - > /* Find the high key storage area from a regular key. */ > STATIC union xfs_btree_key * > xfs_btree_high_key_from_key( > @@ -1985,38 +1962,41 @@ xfs_btree_high_key_from_key( > (cur->bc_ops->key_len / 2)); > } > > -/* Determine the low and high keys of a leaf block (overlapped) */ > -void > -xfs_btree_get_leaf_keys_overlapped( > +/* Determine the low (and high if overlapped) key of a leaf block */ > +STATIC void > +xfs_btree_get_leaf_keys( > struct xfs_btree_cur *cur, > struct xfs_btree_block *block, > union xfs_btree_key *key) > { > - int n; > union xfs_btree_rec *rec; > - union xfs_btree_key max_hkey; > - union xfs_btree_key hkey; > - union xfs_btree_key *high; > > - ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); > rec = xfs_btree_rec_addr(cur, 1, block); > cur->bc_ops->init_key_from_rec(key, rec); > > - cur->bc_ops->init_high_key_from_rec(&max_hkey, rec); > - for (n = 2; n <= xfs_btree_get_numrecs(block); n++) { > - rec = xfs_btree_rec_addr(cur, n, block); > - cur->bc_ops->init_high_key_from_rec(&hkey, rec); > - if (cur->bc_ops->diff_two_keys(cur, &hkey, &max_hkey) > 0) > - max_hkey = hkey; > - } > + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { > + union xfs_btree_key max_hkey; > + union xfs_btree_key hkey; > + union xfs_btree_key *high; > + int n; > + > + cur->bc_ops->init_high_key_from_rec(&max_hkey, rec); > + for (n = 2; n <= xfs_btree_get_numrecs(block); n++) { > + rec = xfs_btree_rec_addr(cur, n, block); > + cur->bc_ops->init_high_key_from_rec(&hkey, rec); > + if (cur->bc_ops->diff_two_keys(cur, &hkey, &max_hkey) > + > 0) > + max_hkey = hkey; > + } > > - high = xfs_btree_high_key_from_key(cur, key); > - memcpy(high, &max_hkey, cur->bc_ops->key_len / 2); > + high = xfs_btree_high_key_from_key(cur, key); > + memcpy(high, &max_hkey, cur->bc_ops->key_len / 2); > + } > } > > /* Determine the low and high keys of a node block (overlapped) */ > -void > -xfs_btree_get_node_keys_overlapped( > +STATIC void > +xfs_btree_get_node_keys( > struct xfs_btree_cur *cur, > struct xfs_btree_block *block, > union xfs_btree_key *key) > @@ -2026,19 +2006,23 @@ xfs_btree_get_node_keys_overlapped( > union xfs_btree_key *max_hkey; > union xfs_btree_key *high; > > - ASSERT(cur->bc_flags & XFS_BTREE_OVERLAPPING); > - memcpy(key, xfs_btree_key_addr(cur, 1, block), > - cur->bc_ops->key_len / 2); > - > - max_hkey = xfs_btree_high_key_addr(cur, 1, block); > - for (n = 2; n <= xfs_btree_get_numrecs(block); n++) { > - hkey = xfs_btree_high_key_addr(cur, n, block); > - if (cur->bc_ops->diff_two_keys(cur, hkey, max_hkey) > 0) > - max_hkey = hkey; > - } > + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { > + memcpy(key, xfs_btree_key_addr(cur, 1, block), > + cur->bc_ops->key_len / 2); > + > + max_hkey = xfs_btree_high_key_addr(cur, 1, block); > + for (n = 2; n <= xfs_btree_get_numrecs(block); n++) { > + hkey = xfs_btree_high_key_addr(cur, n, block); > + if (cur->bc_ops->diff_two_keys(cur, hkey, max_hkey) > 0) > + max_hkey = hkey; > + } > > - high = xfs_btree_high_key_from_key(cur, key); > - memcpy(high, max_hkey, cur->bc_ops->key_len / 2); > + high = xfs_btree_high_key_from_key(cur, key); > + memcpy(high, max_hkey, cur->bc_ops->key_len / 2); > + } else { > + memcpy(key, xfs_btree_key_addr(cur, 1, block), > + cur->bc_ops->key_len); > + } > } > > /* Derive the keys for any btree block. */ > @@ -2049,9 +2033,9 @@ xfs_btree_get_keys( > union xfs_btree_key *key) > { > if (be16_to_cpu(block->bb_level) == 0) > - cur->bc_ops->get_leaf_keys(cur, block, key); > + xfs_btree_get_leaf_keys(cur, block, key); > else > - cur->bc_ops->get_node_keys(cur, block, key); > + xfs_btree_get_node_keys(cur, block, key); > } > > /* > @@ -2125,28 +2109,12 @@ __xfs_btree_updkeys( > xfs_btree_log_keys(cur, bp, ptr, ptr); > if (level + 1 >= cur->bc_nlevels) > break; > - cur->bc_ops->get_node_keys(cur, block, lkey); > + xfs_btree_get_node_keys(cur, block, lkey); > } > > return 0; > } > > -/* > - * Update all the keys from some level in cursor back to the root, stopping > - * when we find a key pair that don't need updating. > - */ > -int > -xfs_btree_update_keys_overlapped( > - struct xfs_btree_cur *cur, > - int level) > -{ > - struct xfs_buf *bp; > - struct xfs_btree_block *block; > - > - block = xfs_btree_get_block(cur, level, &bp); > - return __xfs_btree_updkeys(cur, level, block, bp, false); > -} > - > /* Update all the keys from some level in cursor back to the root. */ > STATIC int > xfs_btree_updkeys_force( > @@ -2163,7 +2131,7 @@ xfs_btree_updkeys_force( > /* > * Update the parent keys of the given level, progressing towards the root. > */ > -int > +STATIC int > xfs_btree_update_keys( > struct xfs_btree_cur *cur, > int level) > @@ -2174,20 +2142,21 @@ xfs_btree_update_keys( > union xfs_btree_key key; > int ptr; > > - ASSERT(!(cur->bc_flags & XFS_BTREE_OVERLAPPING)); > + ASSERT(level >= 0); > + > + block = xfs_btree_get_block(cur, level, &bp); > + if (cur->bc_flags & XFS_BTREE_OVERLAPPING) > + return __xfs_btree_updkeys(cur, level, block, bp, false); > > XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); > XFS_BTREE_TRACE_ARGIK(cur, level, keyp); > > - ASSERT(level >= 0); > - > /* > * Go up the tree from this level toward the root. > * At each level, update the key value to the value input. > * Stop when we reach a level where the cursor isn't pointing > * at the first entry in the block. > */ > - block = xfs_btree_get_block(cur, level, &bp); > xfs_btree_get_keys(cur, block, &key); > for (level++, ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { > #ifdef DEBUG > @@ -2257,7 +2226,7 @@ xfs_btree_update( > > /* Pass new key value up to our parent. */ > if (xfs_btree_needs_key_update(cur, ptr)) { > - error = cur->bc_ops->update_keys(cur, 0); > + error = xfs_btree_update_keys(cur, 0); > if (error) > goto error0; > } > @@ -2447,13 +2416,13 @@ xfs_btree_lshift( > goto error1; > > /* Update the parent keys of the right block. */ > - error = cur->bc_ops->update_keys(cur, level); > + error = xfs_btree_update_keys(cur, level); > if (error) > goto error1; > > /* Update the parent high keys of the left block, if needed. */ > if (tcur->bc_flags & XFS_BTREE_OVERLAPPING) { > - error = tcur->bc_ops->update_keys(tcur, level); > + error = xfs_btree_update_keys(tcur, level); > if (error) > goto error1; > } > @@ -2633,13 +2602,13 @@ xfs_btree_rshift( > > /* Update the parent high keys of the left block, if needed. */ > if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { > - error = cur->bc_ops->update_keys(cur, level); > + error = xfs_btree_update_keys(cur, level); > if (error) > goto error1; > } > > /* Update the parent keys of the right block. */ > - error = cur->bc_ops->update_keys(tcur, level); > + error = xfs_btree_update_keys(tcur, level); > if (error) > goto error1; > > @@ -2778,7 +2747,7 @@ __xfs_btree_split( > xfs_btree_log_ptrs(cur, rbp, 1, rrecs); > > /* Stash the keys of the new block for later insertion. */ > - cur->bc_ops->get_node_keys(cur, right, key); > + xfs_btree_get_node_keys(cur, right, key); > } else { > /* It's a leaf. Move records. */ > union xfs_btree_rec *lrp; /* left record pointer */ > @@ -2792,7 +2761,7 @@ __xfs_btree_split( > xfs_btree_log_recs(cur, rbp, 1, rrecs); > > /* Stash the keys of the new block for later insertion. */ > - cur->bc_ops->get_leaf_keys(cur, right, key); > + xfs_btree_get_leaf_keys(cur, right, key); > } > > /* > @@ -2822,7 +2791,7 @@ __xfs_btree_split( > > /* Update the parent high keys of the left block, if needed. */ > if (cur->bc_flags & XFS_BTREE_OVERLAPPING) { > - error = cur->bc_ops->update_keys(cur, level); > + error = xfs_btree_update_keys(cur, level); > if (error) > goto error0; > } > @@ -3143,9 +3112,9 @@ xfs_btree_new_root( > * Get the keys for the left block's keys and put them directly > * in the parent block. Do the same for the right block. > */ > - cur->bc_ops->get_node_keys(cur, left, > + xfs_btree_get_node_keys(cur, left, > xfs_btree_key_addr(cur, 1, new)); > - cur->bc_ops->get_node_keys(cur, right, > + xfs_btree_get_node_keys(cur, right, > xfs_btree_key_addr(cur, 2, new)); > } else { > /* > @@ -3153,9 +3122,9 @@ xfs_btree_new_root( > * directly in the parent block. Do the same for the right > * block. > */ > - cur->bc_ops->get_leaf_keys(cur, left, > + xfs_btree_get_leaf_keys(cur, left, > xfs_btree_key_addr(cur, 1, new)); > - cur->bc_ops->get_leaf_keys(cur, right, > + xfs_btree_get_leaf_keys(cur, right, > xfs_btree_key_addr(cur, 2, new)); > } > xfs_btree_log_keys(cur, nbp, 1, 2); > @@ -3434,7 +3403,7 @@ xfs_btree_insrec( > if (bp && bp->b_bn != old_bn) { > xfs_btree_get_keys(cur, block, lkey); > } else if (xfs_btree_needs_key_update(cur, optr)) { > - error = cur->bc_ops->update_keys(cur, level); > + error = xfs_btree_update_keys(cur, level); > if (error) > goto error0; > } > @@ -3880,7 +3849,7 @@ xfs_btree_delrec( > * key values above us in the tree. > */ > if (xfs_btree_needs_key_update(cur, ptr)) { > - error = cur->bc_ops->update_keys(cur, level); > + error = xfs_btree_update_keys(cur, level); > if (error) > goto error0; > } > diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h > index 9b6d628..04d0865 100644 > --- a/fs/xfs/libxfs/xfs_btree.h > +++ b/fs/xfs/libxfs/xfs_btree.h > @@ -214,19 +214,6 @@ struct xfs_btree_ops { > union xfs_btree_rec *r1, > union xfs_btree_rec *r2); > #endif > - > - /* derive the low & high keys from the records in a leaf block */ > - void (*get_leaf_keys)(struct xfs_btree_cur *cur, > - struct xfs_btree_block *block, > - union xfs_btree_key *key); > - > - /* derive the low & high keys from the keys in a node block */ > - void (*get_node_keys)(struct xfs_btree_cur *cur, > - struct xfs_btree_block *block, > - union xfs_btree_key *key); > - > - /* update the parent keys of given btree level */ > - int (*update_keys)(struct xfs_btree_cur *cur, int level); > }; > > /* > @@ -527,17 +514,6 @@ bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); > uint xfs_btree_compute_maxlevels(struct xfs_mount *mp, uint *limits, > unsigned long len); > > -void xfs_btree_get_leaf_keys(struct xfs_btree_cur *cur, > - struct xfs_btree_block *block, union xfs_btree_key *key); > -void xfs_btree_get_node_keys(struct xfs_btree_cur *cur, > - struct xfs_btree_block *block, union xfs_btree_key *key); > -int xfs_btree_update_keys(struct xfs_btree_cur *cur, int level); > -void xfs_btree_get_leaf_keys_overlapped(struct xfs_btree_cur *cur, > - struct xfs_btree_block *block, union xfs_btree_key *key); > -void xfs_btree_get_node_keys_overlapped(struct xfs_btree_cur *cur, > - struct xfs_btree_block *block, union xfs_btree_key *key); > -int xfs_btree_update_keys_overlapped(struct xfs_btree_cur *cur, int level); > - > /* return codes */ > #define XFS_BTREE_QUERY_RANGE_CONTINUE 0 /* keep iterating */ > #define XFS_BTREE_QUERY_RANGE_ABORT 1 /* stop iterating */ > diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c > index c83691e..31ca220 100644 > --- a/fs/xfs/libxfs/xfs_ialloc_btree.c > +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c > @@ -320,10 +320,6 @@ static const struct xfs_btree_ops xfs_inobt_ops = { > .keys_inorder = xfs_inobt_keys_inorder, > .recs_inorder = xfs_inobt_recs_inorder, > #endif > - > - .get_leaf_keys = xfs_btree_get_leaf_keys, > - .get_node_keys = xfs_btree_get_node_keys, > - .update_keys = xfs_btree_update_keys, > }; > > static const struct xfs_btree_ops xfs_finobt_ops = { > @@ -345,10 +341,6 @@ static const struct xfs_btree_ops xfs_finobt_ops = { > .keys_inorder = xfs_inobt_keys_inorder, > .recs_inorder = xfs_inobt_recs_inorder, > #endif > - > - .get_leaf_keys = xfs_btree_get_leaf_keys, > - .get_node_keys = xfs_btree_get_node_keys, > - .update_keys = xfs_btree_update_keys, > }; > > /* > diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c > index 232450c..bc1faeb 100644 > --- a/fs/xfs/libxfs/xfs_rmap_btree.c > +++ b/fs/xfs/libxfs/xfs_rmap_btree.c > @@ -453,10 +453,6 @@ static const struct xfs_btree_ops xfs_rmapbt_ops = { > .keys_inorder = xfs_rmapbt_keys_inorder, > .recs_inorder = xfs_rmapbt_recs_inorder, > #endif > - > - .get_leaf_keys = xfs_btree_get_leaf_keys_overlapped, > - .get_node_keys = xfs_btree_get_node_keys_overlapped, > - .update_keys = xfs_btree_update_keys_overlapped, > }; > > /* From david@fromorbit.com Tue Aug 2 19:39:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EB80E7CA4 for ; Tue, 2 Aug 2016 19:39:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AC074304039 for ; Tue, 2 Aug 2016 17:39:17 -0700 (PDT) X-ASG-Debug-ID: 1470184754-0bf57c1369302d10001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ccTlvUawwF7XCqGb for ; Tue, 02 Aug 2016 17:39:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BcBQAmPKFXIMmOLHldg0WBUoZynTsGjF+IHIF9hhcCAgEBgUI5FAEBAQEBAQEGAQEBAQEBOECFHxwjGCQ0BSUDBy2IML5uMR6FRIohhHIdBZkzjnWPSZAnHoRCKjKIMQEBAQ Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 10:03:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUk8A-0007M7-Sv; Wed, 03 Aug 2016 10:33:54 +1000 Date: Wed, 3 Aug 2016 10:33:54 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org, linux-nvdimm@lists.01.org Subject: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Message-ID: <20160803003354.GP16044@dastard> X-ASG-Orig-Subj: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470184754 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2556 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi folks, Just hit a reproducable hang in generic/361. Essentially this on a 8GB pmem device: mkfs.xfs -f /dev/pmem1 mount -o dax /dev/pmem1 /mnt/scratch xfs_io -f -c "truncate 1g" test.img losetup -f --show /mnt/scratch/test.img mkfs.xfs -f /dev/loop0 And the mkfs.xfs command hangs with a discard that never completes: [ 243.413918] INFO: task mkfs.xfs:5708 blocked for more than 120 seconds. [ 243.415678] Not tainted 4.7.0-dgc+ #862 [ 243.416772] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 243.418769] mkfs.xfs D ffff880835143c18 13848 5708 5441 0x00000000 [ 243.420620] ffff880835143c18 ffff880835143c20 ffff88083a244780 ffff8808358ba3c0 [ 243.422636] ffff88023aa20000 ffff880835144000 7fffffffffffffff 7fffffffffffffff [ 243.424586] ffff8808358ba3c0 00000000024000c0 ffff880835143c30 ffffffff81e5e38c [ 243.426466] Call Trace: [ 243.427050] [] schedule+0x3c/0x90 [ 243.428224] [] schedule_timeout+0x265/0x330 [ 243.429563] [] ? kvm_clock_read+0x25/0x40 [ 243.430896] [] ? kvm_clock_get_cycles+0x9/0x10 [ 243.432360] [] ? ktime_get+0x3c/0xb0 [ 243.433556] [] io_schedule_timeout+0xa4/0x110 [ 243.434932] [] wait_for_completion_io+0xd6/0x110 [ 243.436297] [] ? wake_up_q+0x70/0x70 [ 243.437436] [] submit_bio_wait+0x56/0x70 [ 243.438671] [] blkdev_issue_discard+0x6a/0xb0 [ 243.439980] [] ? __might_sleep+0x49/0x80 [ 243.441182] [] blk_ioctl_discard+0x97/0xb0 [ 243.442370] [] blkdev_ioctl+0x7eb/0x9a0 [ 243.443485] [] block_ioctl+0x3d/0x50 [ 243.444552] [] do_vfs_ioctl+0x8f/0x670 [ 243.445630] [] ? exit_to_usermode_loop+0x94/0xb0 [ 243.446902] [] SyS_ioctl+0x79/0x90 [ 243.447927] [] ? syscall_return_slowpath+0xf5/0x190 [ 243.449236] [] entry_SYSCALL_64_fastpath+0x1a/0xa4 This only reproduces when the underlying filesystem is mounted with -o dax, so there is a bad interaction with loop devices and DAX occurring somewhere. generic/361 is a recent test (committed june 14) so this probably hasn't actually been tested until now. I haven't got time to look at this right now, hence the report. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dan.j.williams@intel.com Tue Aug 2 19:59:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DEB177CA4 for ; Tue, 2 Aug 2016 19:59:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AEDFF304032 for ; Tue, 2 Aug 2016 17:59:34 -0700 (PDT) X-ASG-Debug-ID: 1470185971-0bf57b369d361a40001-NocioJ Received: from mail-oi0-f44.google.com (mail-oi0-f44.google.com [209.85.218.44]) by cuda.sgi.com with ESMTP id ZXNPvl26chYC1Ypk (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 02 Aug 2016 17:59:31 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f44.google.com[209.85.218.44] X-Barracuda-Apparent-Source-IP: 209.85.218.44 Received: by mail-oi0-f44.google.com with SMTP id w18so261120161oiw.3 for ; Tue, 02 Aug 2016 17:59:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=6YMFuYWxv5OUUcclN2JkuULH+gm+ao+XQmvHBAk3Pso=; b=ZkhUx+lQOMYYmaT1mRyljShMGqd59/5iAvFt8LBVlZe/KkGWQR9bsfbTCTxpM+IwNf TuKAgvsNTN+Co8xEjj3x3zZ0ouygRGpppIObtWMu8aBwrx8w8QWqp43R2XxzKoO6IwSw Rt66rK720EwbWH2UDL1CVdGUMHehFI4PTeA5V94lGtz0IoDLsFs+YxlWweBjkkj3Mn6P FWAhDhJiJmPGEkeUyJ7J1UhoU9RvpAE/qcKDissY4h315JkcHuNQ8Ra584h+zQirgJtr FSWklRllISJyeAY9RrocVQ0uA5/abe9FIB1LG3HPuiPgmAyRyMXwWTKwlR4fnNg1e9jm OVVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=6YMFuYWxv5OUUcclN2JkuULH+gm+ao+XQmvHBAk3Pso=; b=Kp2L9+NC4dspFM0bBF4ZZ7ZkQFF77i8L9yREytKyCkiNMWSefdWFHfMWCckhMqrGaF vKR+qFdF6dhqYRmQTG/gEWkYRO+wCF2gubsSm5IGAVCL/N+sDn7T4XGdN+uH7t3Mn/9u nxU/PstMcVQinlDU5XvAjrNmpP21dJ+Foad6SA5CIZwyk/Qf2K0e89cJaJLlEcOwPC9E W8oo5Yz2/1N3lQoNCewAGMgSt+4wXW7EdNK7SfawneHd0dkg3KIg8xebaZ3EYdJK/bAW rODgOXMJ8kt3AK2nzrzjU88NSh9AyA/HZQVam3b0sp4CHvoHaAc1+UZQ/875NxGWz7Fv EJlQ== X-Gm-Message-State: AEkoouux70lrvFsN0RWGbV30VLc5jUzhvstqtcxiJYP5OfdS5G9oMpSY3jb9MJJ0ggL4m8MkS3z0Zah71hRSUheI X-Received: by 10.202.114.6 with SMTP id p6mr3542682oic.16.1470185970978; Tue, 02 Aug 2016 17:59:30 -0700 (PDT) MIME-Version: 1.0 Received: by 10.157.62.182 with HTTP; Tue, 2 Aug 2016 17:59:30 -0700 (PDT) In-Reply-To: <20160803003354.GP16044@dastard> References: <20160803003354.GP16044@dastard> From: Dan Williams Date: Tue, 2 Aug 2016 17:59:30 -0700 Message-ID: Subject: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems To: Dave Chinner X-ASG-Orig-Subj: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Cc: XFS Developers , linux-fsdevel , "linux-nvdimm@lists.01.org" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f44.google.com[209.85.218.44] X-Barracuda-Start-Time: 1470185971 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2697 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31707 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Aug 2, 2016 at 5:33 PM, Dave Chinner wrote: > Hi folks, > > Just hit a reproducable hang in generic/361. Essentially this on > a 8GB pmem device: > > mkfs.xfs -f /dev/pmem1 > mount -o dax /dev/pmem1 /mnt/scratch > xfs_io -f -c "truncate 1g" test.img > losetup -f --show /mnt/scratch/test.img > mkfs.xfs -f /dev/loop0 > > And the mkfs.xfs command hangs with a discard that never completes: > > [ 243.413918] INFO: task mkfs.xfs:5708 blocked for more than 120 seconds. > [ 243.415678] Not tainted 4.7.0-dgc+ #862 > [ 243.416772] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > [ 243.418769] mkfs.xfs D ffff880835143c18 13848 5708 5441 0x00000000 > [ 243.420620] ffff880835143c18 ffff880835143c20 ffff88083a244780 ffff8808358ba3c0 > [ 243.422636] ffff88023aa20000 ffff880835144000 7fffffffffffffff 7fffffffffffffff > [ 243.424586] ffff8808358ba3c0 00000000024000c0 ffff880835143c30 ffffffff81e5e38c > [ 243.426466] Call Trace: > [ 243.427050] [] schedule+0x3c/0x90 > [ 243.428224] [] schedule_timeout+0x265/0x330 > [ 243.429563] [] ? kvm_clock_read+0x25/0x40 > [ 243.430896] [] ? kvm_clock_get_cycles+0x9/0x10 > [ 243.432360] [] ? ktime_get+0x3c/0xb0 > [ 243.433556] [] io_schedule_timeout+0xa4/0x110 > [ 243.434932] [] wait_for_completion_io+0xd6/0x110 > [ 243.436297] [] ? wake_up_q+0x70/0x70 > [ 243.437436] [] submit_bio_wait+0x56/0x70 > [ 243.438671] [] blkdev_issue_discard+0x6a/0xb0 > [ 243.439980] [] ? __might_sleep+0x49/0x80 > [ 243.441182] [] blk_ioctl_discard+0x97/0xb0 > [ 243.442370] [] blkdev_ioctl+0x7eb/0x9a0 > [ 243.443485] [] block_ioctl+0x3d/0x50 > [ 243.444552] [] do_vfs_ioctl+0x8f/0x670 > [ 243.445630] [] ? exit_to_usermode_loop+0x94/0xb0 > [ 243.446902] [] SyS_ioctl+0x79/0x90 > [ 243.447927] [] ? syscall_return_slowpath+0xf5/0x190 > [ 243.449236] [] entry_SYSCALL_64_fastpath+0x1a/0xa4 > > This only reproduces when the underlying filesystem is mounted with > -o dax, so there is a bad interaction with loop devices and DAX > occurring somewhere. generic/361 is a recent test (committed june 14) > so this probably hasn't actually been tested until now. > > I haven't got time to look at this right now, hence the report. > Thanks Dave, we'll take a look. From david@fromorbit.com Tue Aug 2 20:07:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E7F9C7CA4 for ; Tue, 2 Aug 2016 20:07:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A721E8F8033 for ; Tue, 2 Aug 2016 18:07:01 -0700 (PDT) X-ASG-Debug-ID: 1470186415-0bf57c136a3037b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id be1vSAV0VqrRluMq for ; Tue, 02 Aug 2016 18:06:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AMDQATQ6FXIMmOLHldg0WBUoZynTsGjF+GDYIPgX2GFwQCAoFCOxIBAQEBAQEBBgEBAQEBAThAhF8BBTocIxAIAw4KCSUPBSUDBxoTiDC+ZwEBCAIlHoVEhRWELIVvBZkzjnWPSYwwg3clC4IzH4FeKjKGbAElBIEbAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 10:36:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUkdw-0007PG-S9; Wed, 03 Aug 2016 11:06:44 +1000 Date: Wed, 3 Aug 2016 11:06:44 +1000 From: Dave Chinner To: Brian Foster Cc: "Darrick J. Wong" , Christoph Hellwig , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, vishal.l.verma@intel.com Subject: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys Message-ID: <20160803010644.GQ16044@dastard> X-ASG-Orig-Subj: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> <20160801064818.GJ15590@infradead.org> <20160801191126.GE8590@birch.djwong.org> <20160802140412.GA9205@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802140412.GA9205@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470186415 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3887 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31707 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 02, 2016 at 10:04:12AM -0400, Brian Foster wrote: > On Mon, Aug 01, 2016 at 12:11:26PM -0700, Darrick J. Wong wrote: > > On Sun, Jul 31, 2016 at 11:48:18PM -0700, Christoph Hellwig wrote: > ... > > > > > > > +++ b/fs/xfs/libxfs/xfs_btree.c > ... > > > I don't understand the purpose of this union at all, and the comment > > > seems misleading. Compared to union xfs_btree_key the only difference > > > seems to be that xfs_btree_bigkey is missing the > > > 'struct xfs_rmap_key rmap' member. How does that enable us to holds > > > > I think you might be missing a later patch, wherein we add the rmap > > stuff to the btree structures, which expands bigkey to look like this: > > > > union xfs_btree_bigkey { > > struct xfs_bmbt_key bmbt; > > xfs_bmdr_key_t bmbr; /* bmbt root block */ > > xfs_alloc_key_t alloc; > > struct xfs_inobt_key inobt; > > struct { > > struct xfs_rmap_key rmap; > > struct xfs_rmap_key rmap_hi; > > }; > > struct xfs_refcount_key refc; > > }; > > > > bigkey.rmap is the low key, bigkey.rmap_hi is the high key. None of > > the other btrees are overlapped, so they don't get a high key. > > > > > low and high keys? Also every single user seems to cast it to > > > xfs_btree_key which is a little odd and smells unsafe. > > > > On disk, the low and high keys of a pointer reside next to each other. > > The btree_split code wants to store the new block's keys somewhere so > > that the block can later be insrec'd into a higher btree level. It > > would be convenient if this incore storage could also store the two > > keys right next to each other so that we can memcpy key_len bytes from > > the temporary storage into the on-disk btree block and not have to > > special case that code. > > > > I thought about simply declaring an on-stack array of two union > > xfs_btree_keys. The array is big enough to contain both keys and > > eliminates the need for casting. On the other hand it's weird because > > the two keys have to be aligned to xfs_rmap_key boundaries, not > > xfs_btree_key, which means that the high key isn't necessarily stored > > in the second array element like the code would suggest. > > > > Thanks for writing this up... > > I'm wondering if we should define an in-core key structure variant > similar to what we have for in-core records. That structure could > encapsulate the low/high key model and use the already-defined in-core > record structures (I suppose we could define tree-specific ikey > variants, but I'll leave that alone for now). For example: > > struct xfs_btree_ikey { > union xfs_bree_irec lo; > union xfs_btree_irec hi; > } > > Then define some conversion functions, tease apart the bits of the > generic btree code that use the on-disk structure for in-memory storage > vs. on-disk buffer references, and use the in-core structure for all > instances of the former. > > That most certainly would mean more changes (as an indepedent patch) and > tbh, it's not yet clear to me whether we'd run into other roadblocks > that make it too ugly an option or just not worth it. I do feel like > we're trying a bit too hard to retrofit the extra complexity of the > multi-key model into the current design, however, and should try to > explicitly define the multi-key model if we can find a reasonably > elegant way to do so. Even passing around the xfs_btree_bigkey structure > seems safer to me than pretending it's an xfs_btree_key and relying on > key_len to make sure we copy the right amount of data or that we've > defined bigkey in the right layers of the call stack. Thoughts? Yes, we should clean it up, but I'm not going to hold off merging because of this. We can clean this sort of thing up as followup patches. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 2 21:00:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 870D37CA4 for ; Tue, 2 Aug 2016 21:00:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 57251304032 for ; Tue, 2 Aug 2016 19:00:44 -0700 (PDT) X-ASG-Debug-ID: 1470189641-0bf57b369e363b10001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id IiA4KmXIt54Tk82x for ; Tue, 02 Aug 2016 19:00:41 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BfBQDQTqFXIMmOLHldg0WBUoZynTsGjF+GDYIPgX2GFwICAQECgUM5FAEBAQEBAQEGAQEBAQEBOECEXwEFOhwjEAgDGAklDwUlAwcaE4gwvm0BAQgCJR6FRIUVihsBBJkzjnWBX41qjDCDdx6EQioyiDEBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 11:30:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUlU7-0007Us-Fq; Wed, 03 Aug 2016 12:00:39 +1000 Date: Wed, 3 Aug 2016 12:00:39 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 36/47] xfs: convert unwritten status of reverse mappings Message-ID: <20160803020039.GR16044@dastard> X-ASG-Orig-Subj: Re: [PATCH 36/47] xfs: convert unwritten status of reverse mappings References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907720267.25461.12865808398854547794.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907720267.25461.12865808398854547794.stgit@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470189641 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 585 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31707 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Jul 20, 2016 at 10:00:02PM -0700, Darrick J. Wong wrote: > Provide a function to convert an unwritten extent to a real one and > vice versa. > > v2: Move unwritten bit to rm_offset. > > v3: Fix a bug where we touched the wrong btree_irec field due to a > stupid cut-and-paste error. > > Signed-off-by: Darrick J. Wong I've added a comment to the commit message that the algorithm and code structure has been derived from xfs_bmap_add_extent_unwritten_real(). It looks to be correct. -Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Aug 2 21:37:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0B7527CA3 for ; Tue, 2 Aug 2016 21:37:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 67500AC001 for ; Tue, 2 Aug 2016 19:37:20 -0700 (PDT) X-ASG-Debug-ID: 1470191837-0bf57c13673073a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 7D8HcE9JI8pgd6Y1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 19:37:17 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u732bFkC021266 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 02:37:15 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u732bFIb017810 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 02:37:15 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u732bDjk017278; Wed, 3 Aug 2016 02:37:14 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 19:37:12 -0700 Date: Tue, 2 Aug 2016 19:37:11 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: xfs@oss.sgi.com Subject: [PATCH] xfs: store rmapbt block count in the AGF Message-ID: <20160803023711.GE8593@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs: store rmapbt block count in the AGF MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470191837 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3422 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31708 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Track the number of blocks used for the rmapbt in the AGF. When we get to the AG reservation code we need this counter to quickly make our reservation during mount. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 1 + fs/xfs/libxfs/xfs_format.h | 11 ++++++++--- fs/xfs/libxfs/xfs_rmap_btree.c | 6 ++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 776ae2f..af1a72e 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2264,6 +2264,7 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_longest), offsetof(xfs_agf_t, agf_btreeblks), offsetof(xfs_agf_t, agf_uuid), + offsetof(xfs_agf_t, agf_rmap_blocks), sizeof(xfs_agf_t) }; diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index f814d42..e6a8bea 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -640,12 +640,15 @@ typedef struct xfs_agf { __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ uuid_t agf_uuid; /* uuid of filesystem */ + __be32 agf_rmap_blocks; /* rmapbt blocks used */ + __be32 agf_padding; /* padding */ + /* * reserve some contiguous space for future logged fields before we add * the unlogged fields. This makes the range logging via flags and * structure offsets much simpler. */ - __be64 agf_spare64[16]; + __be64 agf_spare64[15]; /* unlogged fields, written during buffer writeback. */ __be64 agf_lsn; /* last write sequence */ @@ -670,7 +673,8 @@ typedef struct xfs_agf { #define XFS_AGF_LONGEST 0x00000400 #define XFS_AGF_BTREEBLKS 0x00000800 #define XFS_AGF_UUID 0x00001000 -#define XFS_AGF_NUM_BITS 13 +#define XFS_AGF_RMAP_BLOCKS 0x00002000 +#define XFS_AGF_NUM_BITS 14 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_FLAGS \ @@ -686,7 +690,8 @@ typedef struct xfs_agf { { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ { XFS_AGF_LONGEST, "LONGEST" }, \ { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ - { XFS_AGF_UUID, "UUID" } + { XFS_AGF_UUID, "UUID" }, \ + { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" } /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c index bc1faeb..17b8eeb 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.c +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -98,6 +98,8 @@ xfs_rmapbt_alloc_block( union xfs_btree_ptr *new, int *stat) { + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); int error; xfs_agblock_t bno; @@ -124,6 +126,8 @@ xfs_rmapbt_alloc_block( xfs_trans_agbtree_delta(cur->bc_tp, 1); new->s = cpu_to_be32(bno); + be32_add_cpu(&agf->agf_rmap_blocks, 1); + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS); XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); *stat = 1; @@ -143,6 +147,8 @@ xfs_rmapbt_free_block( bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); trace_xfs_rmapbt_free_block(cur->bc_mp, cur->bc_private.a.agno, bno, 1); + be32_add_cpu(&agf->agf_rmap_blocks, -1); + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS); error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); if (error) return error; From darrick.wong@oracle.com Tue Aug 2 22:29:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CE1FE7CA4 for ; Tue, 2 Aug 2016 22:29:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FF638F8033 for ; Tue, 2 Aug 2016 20:29:51 -0700 (PDT) X-ASG-Debug-ID: 1470194988-0bf57c1369309030001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id icGhN4tzpRlF8MAf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 20:29:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u733TMdX015634 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 03:29:23 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u733TMoA017861 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 03:29:22 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u733TLx4001200; Wed, 3 Aug 2016 03:29:21 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 02 Aug 2016 20:29:21 -0700 Date: Tue, 2 Aug 2016 20:29:20 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys Message-ID: <20160803032920.GP8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 08/47] xfs: support btrees with overlapping intervals for keys References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907701258.25461.18255100969448497359.stgit@birch.djwong.org> <20160801064818.GJ15590@infradead.org> <20160801191126.GE8590@birch.djwong.org> <20160802120354.GA2667@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802120354.GA2667@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470194989 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4413 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31709 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 02, 2016 at 05:03:54AM -0700, Christoph Hellwig wrote: > On Mon, Aug 01, 2016 at 12:11:26PM -0700, Darrick J. Wong wrote: > > > > +/* > > > > + * In-core key that holds both low and high keys for overlapped btrees. > > > > + * The two keys are packed next to each other on disk, so do the same > > > > + * in memory. Preserve the existing xfs_btree_key as a single key to > > > > + * avoid the mental model breakage that would happen if we passed a > > > > + * bigkey into a function that operates on a single key. > > > > + */ > > > > +union xfs_btree_bigkey { > > > > + struct xfs_bmbt_key bmbt; > > > > + xfs_bmdr_key_t bmbr; /* bmbt root block */ > > > > + xfs_alloc_key_t alloc; > > > > + struct xfs_inobt_key inobt; > > > > +}; > > > > > > I don't understand the purpose of this union at all, and the comment > > > seems misleading. Compared to union xfs_btree_key the only difference > > > seems to be that xfs_btree_bigkey is missing the > > > 'struct xfs_rmap_key rmap' member. How does that enable us to holds > > > > I think you might be missing a later patch, wherein we add the rmap > > stuff to the btree structures, which expands bigkey to look like this: > > Yeah, I was stuck in the middle of tree. I still think the bigkey > is a very bad idea. There are only 7 place left that actually > allocate storage for a "union xfs_btree_key". Everything else uses > fancy pointer arithmetics to get them out of a disk buffer: > > - xfs_btree_lookup > - xfs_btree_get_leaf_keys_overlapped > - xfs_btree_update_keys > - xfs_btree_lshift > - xfs_btree_rshift > - xfs_btree_simple_query_range > - xfs_btree_overlapped_query_range > > So just adding the rmap to union xfs_btree_key would simplify things > and remove a potential pitfall at the cost of just a little bit > more stack usage. And at least of the > init_high_key_from_rec/init_key_from_rec we could probably replace > two on-stack xfs_btree_keys with a single new, bigger xfs_btree_key. > > > union xfs_btree_key { > > struct xfs_bmbt_key bmbt; > > xfs_bmdr_key_t bmbr; /* bmbt root block */ > > xfs_alloc_key_t alloc; > > struct xfs_inobt_key inobt; > > struct xfs_rmap_key rmap[2]; > > struct xfs_refcount_key refc; > > }; > > > > This gives us the storage we want and avoids casts, but it still > > doesn't fix the problem that sometimes we want to create a key pointer > > to just the high fields and treat that as a pointer. > > Where does that problem occur? I don't quite understand how having > the bigger structure is a problem if we don't want to initialize all > of it. Let's say we make the change as you suggest above. Then we have: +---------------------+ | union xfs_btree_key | +----------+----------+ | rmap[0] | rmap[1] | +----------+----------+ Now we go declaring one on the stack: union xfs_btree_key x; union xfs_btree_key *lkey = &x; ------------------------------------------ stack | x.rmap[0] | x.rmap[1] | more stack ------------------------------------------ ^ +- lkey Now let's get the high key: union xfs_btree_key *hkey = xfs_btree_high_key_from_key(cur, lkey); ------------------------------------------ stack | x.rmap[0] | x.rmap[1] | more stack ------------------------------------------ ^ ^ +- lkey +- hkey cur->bc_ops->init_high_key_from_rec(&rec_hkey, rec); if (cur->bc_ops->diff_two_keys(cur, hkey, &rec_hkey) > 0) do_stuff(); Oh, but hkey is a union xfs_btree_key *, so we can erroneously view memory like this: ------------------------------------------ stack | x.rmap[0] | x.rmap[1] | more stack ------------------------------------------ ^ ^ hkey.rmap[0] -+ +- hkey.rmap[1] (eeeek!!!) xfs_btree_copy_keys(cur, ckp, hkey, 1); // eeeek!! So if we forget that hkey is a pointer to a high key and try to access the high key, we've wandered off into the stack somewhere. Unfortunately, there's no way for the compiler to check that we're not taking the high key of a high key. ------- On the other hand, in writing all this out I've realized there's nothing preventing you from calling xfs_btree_high_key_from_key on something that's already a high key, in which case disaster results anyway. All right, I'm convinced. Will fix. --D From eguan@redhat.com Tue Aug 2 23:47:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9BB707CA2 for ; Tue, 2 Aug 2016 23:47:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 532C58F8033 for ; Tue, 2 Aug 2016 21:47:28 -0700 (PDT) X-ASG-Debug-ID: 1470199645-0bf8157e6d3eaee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OlbR9J2b8ePTID4j (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 02 Aug 2016 21:47:26 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BDA538535A; Wed, 3 Aug 2016 04:47:25 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u734lNke005488; Wed, 3 Aug 2016 00:47:24 -0400 Date: Wed, 3 Aug 2016 12:47:22 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: Re: [PATCH] xfs: test attr_list_by_handle cursor iteration Message-ID: <20160803044722.GD27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: test attr_list_by_handle cursor iteration References: <20160802235251.GB8586@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802235251.GB8586@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Wed, 03 Aug 2016 04:47:25 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470199646 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11447 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 02, 2016 at 04:52:51PM -0700, Darrick J. Wong wrote: > Apparently the XFS attr_list_by_handle ioctl has never actually copied > the cursor contents back to user space, which means that iteration has > never worked. Add a test case for this and see the patch > "xfs: in _attrlist_by_handle, copy the cursor back to userspace". > > Signed-off-by: Darrick J. Wong > --- > src/Makefile | 3 - > src/attr-list-by-handle-cursor-test.c | 186 +++++++++++++++++++++++++++++++++ New test program needs an entry in .gitignore > tests/xfs/700 | 64 +++++++++++ > tests/xfs/700.out | 5 + > tests/xfs/group | 1 > 5 files changed, 258 insertions(+), 1 deletion(-) > create mode 100644 src/attr-list-by-handle-cursor-test.c > create mode 100755 tests/xfs/700 > create mode 100644 tests/xfs/700.out > > diff --git a/src/Makefile b/src/Makefile > index 1bf318b..ae06d50 100644 > --- a/src/Makefile > +++ b/src/Makefile > @@ -20,7 +20,8 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ > bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ > stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ > seek_copy_test t_readdir_1 t_readdir_2 fsync-tester nsexec cloner \ > - renameat2 t_getcwd e4compact test-nextquota punch-alternating > + renameat2 t_getcwd e4compact test-nextquota punch-alternating \ > + attr-list-by-handle-cursor-test > > SUBDIRS = > > diff --git a/src/attr-list-by-handle-cursor-test.c b/src/attr-list-by-handle-cursor-test.c > new file mode 100644 > index 0000000..5aef79c > --- /dev/null > +++ b/src/attr-list-by-handle-cursor-test.c > @@ -0,0 +1,186 @@ > +/* > + * Copyright (C) 2016 Oracle. All Rights Reserved. > + * > + * Author: Darrick J. Wong > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License > + * as published by the Free Software Foundation; either version 2 > + * of the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. > + */ > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define ATTRBUFSZ 1024 > +#define BSTATBUF_SZ 1024 > + > +/* Read all the extended attributes of a file handle. */ > +void > +read_handle_xattrs( > + struct xfs_handle *handle, > + bool root_space) On RHEL6, stdbool.h is needed for bool. Or simply change it to int? [CC] attr-list-by-handle-cursor-test attr-list-by-handle-cursor-test.c:38: error: expected declaration specifiers or '...' before 'bool' attr-list-by-handle-cursor-test.c: In function 'read_handle_xattrs': attr-list-by-handle-cursor-test.c:49: error: 'root_space' undeclared (first use in this function) attr-list-by-handle-cursor-test.c:49: error: (Each undeclared identifier is reported only once attr-list-by-handle-cursor-test.c:49: error: for each function it appears in.) attr-list-by-handle-cursor-test.c: In function 'find_inode': attr-list-by-handle-cursor-test.c:135: error: 'false' undeclared (first use in this function) attr-list-by-handle-cursor-test.c:135: error: too many arguments to function 'read_handle_xattrs' attr-list-by-handle-cursor-test.c:136: error: 'true' undeclared (first use in this function) attr-list-by-handle-cursor-test.c:136: error: too many arguments to function 'read_handle_xattrs' gmake[2]: *** [attr-list-by-handle-cursor-test] Error 1 gmake[1]: *** [src] Error 2 make: *** [default] Error 2 > +{ > + struct attrlist_cursor cur; > + char attrbuf[ATTRBUFSZ]; > + char *firstname = NULL; > + struct attrlist *attrlist = (struct attrlist *)attrbuf; > + struct attrlist_ent *ent; > + int i; > + int flags = 0; > + int error; > + > + if (root_space) > + flags |= ATTR_ROOT; > + > + memset(&cur, 0, sizeof(cur)); > + while ((error = attr_list_by_handle(handle, sizeof(*handle), > + attrbuf, ATTRBUFSZ, flags, > + &cur)) == 0) { > + for (i = 0; i < attrlist->al_count; i++) { I applied the patch "xfs: in _attrlist_by_handle, copy the cursor back to userspace" on top of 4.7-rc7 kernel and did some tests, in some cases test failed because nothing was printed by the test program, e.g. # diff -u tests/xfs/700.out /root/workspace/xfstests/results//xfs_4k_crc/xfs/700.out.bad --- tests/xfs/700.out 2016-08-03 11:32:02.502000000 +0800 +++ /root/workspace/xfstests/results//xfs_4k_crc/xfs/700.out.bad 2016-08-03 11:34:57.018000000 +0800 @@ -2,4 +2,3 @@ Format and mount Stuff file with xattrs Run test program -Test passes. Debug code shows that this is because attrlist->al_count is 0 in such cases, so it doesn't go into the for loop. Failed test configs are: 2k block size XFS with CRC enabled 1k block size XFS with CRC enabled 512 block size XFS > + ent = ATTR_ENTRY(attrlist, i); > + > + if (i != 0) > + continue; > + > + if (firstname == NULL) { > + firstname = malloc(ent->a_valuelen); > + memcpy(firstname, ent->a_name, ent->a_valuelen); > + } else { > + if (memcmp(firstname, ent->a_name, > + ent->a_valuelen) == 0) > + fprintf(stderr, > + "Saw duplicate xattr \"%s\", buggy XFS?\n", > + ent->a_name); > + else > + fprintf(stderr, > + "Test passes.\n"); > + goto out; > + } > + } > + > + if (!attrlist->al_more) > + break; > + } > + > +out: > + if (firstname) > + free(firstname); > + if (error) > + perror("attr_list_by_handle"); > + return; > +} > + > +/* Iterate a range of inodes. */ > +void > +find_inode( > + struct xfs_handle *fshandle, > + int fd, > + ino_t ino) > +{ > + struct xfs_fsop_bulkreq bulkreq; > + struct xfs_bstat *bstatbuf; > + struct xfs_bstat *p; > + struct xfs_bstat *endp; > + struct xfs_handle handle; > + __u64 first_ino = ino & ~63; > + __s32 buflenout = 0; > + int error; > + > + bstatbuf = malloc(BSTATBUF_SZ * sizeof(struct xfs_bstat)); > + if (!bstatbuf) { > + perror("bulkstat malloc"); > + return; > + } > + > + bulkreq.lastip = (__u64 *)&first_ino; > + bulkreq.icount = BSTATBUF_SZ; > + bulkreq.ubuffer = (void *)bstatbuf; > + bulkreq.ocount = &buflenout; > + > + memcpy(&handle.ha_fsid, fshandle, sizeof(handle.ha_fsid)); > + handle.ha_fid.fid_len = sizeof(xfs_fid_t) - > + sizeof(handle.ha_fid.fid_len); > + handle.ha_fid.fid_pad = 0; > + while ((error = xfsctl("", fd, XFS_IOC_FSBULKSTAT, &bulkreq)) == 0) { > + if (buflenout == 0) > + break; > + for (p = bstatbuf, endp = bstatbuf + buflenout; p < endp; p++) { > + if (p->bs_ino > ino) { > + fprintf(stderr, > + "Expected ino %llu, got %llu.\n", > + (unsigned long long)ino, p->bs_ino); > + goto out; > + } > + > + handle.ha_fid.fid_gen = p->bs_gen; > + handle.ha_fid.fid_ino = p->bs_ino; > + > + read_handle_xattrs(&handle, false); > + read_handle_xattrs(&handle, true); > + goto out; > + } > + } > + > + if (error) > + perror("bulkstat"); > +out: > + free(bstatbuf); > + return; > +} > + > +int main( > + int argc, > + char *argv[]) > +{ > + struct xfs_handle *fshandle; > + size_t fshandle_len; > + struct stat sb; > + int fd; > + int error; > + > + if (argc != 2) { > + fprintf(stderr, "Usage: %s filename\n", argv[0]); > + return 1; > + } > + > + error = path_to_fshandle(argv[1], (void **)&fshandle, &fshandle_len); > + if (error) { > + perror("getting fshandle"); > + return 2; > + } > + > + fd = open(argv[1], O_RDONLY); > + if (fd < 0) { > + perror("opening file"); > + return 2; > + } > + > + error = fstat(fd, &sb); > + if (error) { > + perror("fstat file"); > + return 2; > + } > + > + find_inode(fshandle, fd, sb.st_ino); > + > + close(fd); > + free_handle(fshandle, fshandle_len); > + return 0; > +} > diff --git a/tests/xfs/700 b/tests/xfs/700 > new file mode 100755 > index 0000000..4a5680d > --- /dev/null > +++ b/tests/xfs/700 > @@ -0,0 +1,64 @@ > +#! /bin/bash > +# FS QA Test No. 700 > +# > +# Check that attr_list_by_handle copies the cursor back to userspace. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/testout > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > +. ./common/populate > + > +# real QA test starts here > +_supported_os Linux > +_require_scratch > +_require_test_program "attr-list-by-handle-cursor-test" > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > + > +echo "Stuff file with xattrs" > +mkdir $SCRATCH_MNT/foo > +__populate_create_attr $SCRATCH_MNT/foo 100 > + > +echo "Run test program" > +./src/attr-list-by-handle-cursor-test $SCRATCH_MNT/foo > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/700.out b/tests/xfs/700.out > new file mode 100644 > index 0000000..493a68a > --- /dev/null > +++ b/tests/xfs/700.out > @@ -0,0 +1,5 @@ > +QA output created by 700 > +Format and mount > +Stuff file with xattrs > +Run test program > +Test passes. > diff --git a/tests/xfs/group b/tests/xfs/group > index ff0efa5..ae12e74 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -307,3 +307,4 @@ > 325 auto quick clone > 326 auto quick clone > 327 auto quick clone > +700 auto quick Also add ioctl group? Thanks, Eryu From david@fromorbit.com Wed Aug 3 01:17:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5B7577CA4 for ; Wed, 3 Aug 2016 01:17:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 02FCB304032 for ; Tue, 2 Aug 2016 23:16:56 -0700 (PDT) X-ASG-Debug-ID: 1470205010-0bf8157e6c3f0030001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id orlvYXDYnaZEoALv for ; Tue, 02 Aug 2016 23:16:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2APBgAGi6FXIMmOLHldg0WBUoJ5g3mdOAEBAQEBAQaMYIgcgX2GFwICAQGBRTkUAQEBAQEBAQYBAQEBAQE4QIUMExwjGCQ0BSUDBy2IML56MR6FRI8THQWIHgeFcoE0iWmOdY9JSI9fHoJIHBeBRyoyiDQBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2016 15:44:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUpRm-0007qO-K9; Wed, 03 Aug 2016 16:14:30 +1000 Date: Wed, 3 Aug 2016 16:14:30 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: bfoster@redhat.com Subject: [current tot] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 Message-ID: <20160803061430.GS16044@dastard> X-ASG-Orig-Subj: [current tot] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470205010 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3700 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Brian, It seems I can hit this fairly often on a single CPU, 1GB ram VM in generic/306: [12279.804308] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 [12279.806499] ------------[ cut here ]------------ [12279.807560] kernel BUG at fs/xfs/xfs_message.c:113! [12279.808717] invalid opcode: 0000 [#1] PREEMPT SMP [12279.809790] Modules linked in: [12279.810526] CPU: 0 PID: 8181 Comm: xfs_quota Tainted: G W 4.7.0-dgc+ #864 [12279.812362] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014 [12279.814372] task: ffff880028ae0000 task.stack: ffff88000ec98000 [12279.815707] RIP: 0010:[] [] assfail+0x22/0x30 [12279.817477] RSP: 0018:ffff88000ec9bc28 EFLAGS: 00010282 [12279.818689] RAX: 00000000ffffffea RBX: ffff880008b51930 RCX: 0000000000000021 [12279.820318] RDX: ffff88000ec9bb50 RSI: 000000000000000a RDI: ffffffff823b0e6c [12279.822036] RBP: ffff88000ec9bc28 R08: 0000000000000000 R09: 0000000000000000 [12279.823643] R10: 000000000000000a R11: f000000000000000 R12: ffff880008b518c0 [12279.825277] R13: ffff88003d51c6e0 R14: ffff88003d51c600 R15: 0000000000000000 [12279.826892] FS: 00007f67553c8700(0000) GS:ffff88003fc00000(0000) knlGS:0000000000000000 [12279.828734] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [12279.830013] CR2: 00007f6207369008 CR3: 000000001445f000 CR4: 00000000000006f0 [12279.831621] Stack: [12279.832074] ffff88000ec9bc60 ffffffff8150f498 ffff880039c37920 ffff880034681200 [12279.833823] ffff88003d439000 ffff880039c37a98 ffff880039c37ad8 ffff88000ec9bca8 [12279.835528] ffffffff8154d705 ffff880008b518c0 ffff880008b518c0 0000000000000000 [12279.837257] Call Trace: [12279.837834] [] xfs_buf_rele+0x2b8/0x3b0 [12279.839078] [] xfs_qm_dqpurge+0x1d5/0x220 [12279.840367] [] ? xfs_qm_shrink_count+0x20/0x20 [12279.841765] [] xfs_qm_dquot_walk+0x100/0x170 [12279.843122] [] xfs_qm_dqpurge_all+0x52/0x70 [12279.844458] [] xfs_qm_scall_quotaoff+0x129/0x3f0 [12279.845887] [] xfs_quota_disable+0x3d/0x50 [12279.847197] [] SyS_quotactl+0x3c2/0x870 [12279.848435] [] ? SYSC_newstat+0x2f/0x40 [12279.849703] [] entry_SYSCALL_64_fastpath+0x1a/0xa4 [12279.851157] Code: 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 f1 41 89 d0 48 c7 c6 a8 03 40 82 48 89 e5 48 89 fa 31 c0 31 ff e8 4e fa ff ff <0f> 0b 66 90 66 [12279.856516] RIP [] assfail+0x22/0x30 [12279.857739] RSP [12279.859248] ---[ end trace 496ea0918ba4a5b4 ]--- I've seen it once also from inode reclaim, and AFAICT, the reason is the same both times: they call xfs_bwrite(). It looks to me like we get an XBF_INFLIGHT buffer, the reclaim code then tries to flush another object on the buffer, takes a reference to it and so prevents the XBF_INFLIGHT IO accounting from being decremented when the IO completes and releases. It then flushes the object to the buffer and calls xfs_bwrite() which clears XBF_ASYNC and it writes the buffer again. Once this completes, it calls xfs_buf_rele(), which drops the last reference and we try to release the XBF_INFLIGHT accounting. That then assert fails because XBF_ASYNC is not set. It looks to me like we should just remove the assert - I forgot about this particular corner case. Can you have a quick look and check whether my analysis above is correct or whether I've missed something else here? -Dave. -- Dave Chinner david@fromorbit.com From Vicky16@compressor.com Wed Aug 3 02:36:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FROM_LOCAL_DIGITS,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EC3297CA2 for ; Wed, 3 Aug 2016 02:36:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BFB868F8035 for ; Wed, 3 Aug 2016 00:36:25 -0700 (PDT) X-ASG-Debug-ID: 1470209771-0bf57b369b36f690001-NocioJ Received: from compressor.com ([58.23.232.13]) by cuda.sgi.com with SMTP id 1gcRlECZIeJsr9T4 for ; Wed, 03 Aug 2016 00:36:14 -0700 (PDT) X-Barracuda-Envelope-From: Vicky16@compressor.com X-Barracuda-Effective-Source-IP: UNKNOWN[58.23.232.13] X-Barracuda-Apparent-Source-IP: 58.23.232.13 Received: from no07[127.0.0.1] by NO07[127.0.0.1] (SMTPD32); Wed, 3 Aug 2016 15:37:07 +0800 From: "18850525834@163.com" <18850525834@163.com> Subject: Re: Industrial air compressor supplier from China To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Industrial air compressor supplier from China MIME-Version: 1.0 Sender: Vicky16@compressor.com Reply-To: 18850525834@163.com Date: Wed, 3 Aug 2016 15:37:07 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[58.23.232.13] X-Barracuda-Start-Time: 1470209772 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4476 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.48 X-Barracuda-Spam-Status: No, SCORE=1.48 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, FROM_LOCAL_DIGITS, FROM_LOCAL_HEX, FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31712 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 FROM_LOCAL_DIGITS From: localpart has long digit sequence 0.00 FROM_LOCAL_HEX From: localpart has long hexadecimal sequence 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160803073625.7AD8164005E@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTAuMDAuOTIwMC4xNzYwOSI+PC9IRUFEPg0KPEJPRFk+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9 IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMt c2VyaWYmIzM5OyI+SGVsbG8sPEJSPjxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgDQpHbGFkIHRvIGhlYXIgdGhhdCB5b3UmIzM5O3JlIG9uIHRoZSBtYXJrZXQg Zm9yIGNvbXByZXNzb3IgDQppdGVtcy48QlI+PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyBUaGlzIGlzIFZpY2t5LCBmcm9tIA0KWGlhbWVuIEhpZ2hRIENvbXBy ZXNzb3IgQ28uIEx0ZC4gV2Ugc3BlY2lhbGl6ZWQgaW4gcHJvZHVjaW5nJm5ic3A7Y29tcHJlc3Nv cnMgDQpvdmVyIDEwIHllYXJzLCZuYnNwOyBub3cgd2UgYXJlIGxvb2tpbmcgZm9yIGNvbXByZXNz b3IgcGFydG5lciBpbiB5b3VyIGNvdW50cnkhIA0KT3VyIHNjcmV3IGFpciBjb21wcmVzc29yIHdp dGggUm90b3Jjb21wIEFpci1lbmQmbmJzcDssIFNjaG5laWRlciBDb250cm9sbGVyIGFuZCANCm90 aGVyJm5ic3A7ZmFtb3VzIGJyYW5kIGNvbXBvbmVudHMuPC9TUEFOPjwvUD48U1BBTiBsYW5nPUVO LVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5 OywmIzM5O3NhbnMtc2VyaWYmIzM5OyI+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFD S0dST1VORDogd2hpdGU7IExBWU9VVC1HUklELU1PREU6IGJvdGg7IFRFWFQtQUxJR046IGp1c3Rp Znk7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBM SU5FLUhFSUdIVDogMTUuNzVwdDsgVEVYVC1JTkRFTlQ6IDIycHQ7IG1zby1sYXlvdXQtZ3JpZC1h bGlnbjogYXV0bzsgbXNvLWNoYXItaW5kZW50LWNvdW50OiAyLjAiPjxTUEFOIA0KbGFuZz1FTi1V UyANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYj Mzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby10 aGVtZWNvbG9yOiB0ZXh0MSI+MS5IYXZlIA0KeW91IGV2ZXIgbWVldCBhIGN1c3RvbWVyIHdobyBj YW7igJl0Jm5ic3A7IGFjY2VwdCB0aGUgcHJpY2Ugb2YgeW91ciBkaXN0cmlidXRpbmcgDQpicmFu ZD88bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFD S0dST1VORDogd2hpdGU7IExBWU9VVC1HUklELU1PREU6IGJvdGg7IFRFWFQtQUxJR046IGp1c3Rp Znk7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBM SU5FLUhFSUdIVDogMTUuNzVwdDsgVEVYVC1JTkRFTlQ6IDIycHQ7IG1zby1sYXlvdXQtZ3JpZC1h bGlnbjogYXV0bzsgbXNvLWNoYXItaW5kZW50LWNvdW50OiAyLjAiPjxTUEFOIA0KbGFuZz1FTi1V UyANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYj Mzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby10 aGVtZWNvbG9yOiB0ZXh0MSI+Mi5Xb3VsZCANCnlvdSBiZSBpbnRlcmVzdGVkIGluIGhhdmluZyBh bm90aGVyIGNvbXByZXNzb3IgYnJhbmQgd2hpY2ggaXMmbmJzcDt0cnVseSANCnJlbGlhYmxlIGFu ZCBsb3cgY29zdCB0byZuYnNwOyBhcyBhbiAyPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+bmQgb3B0aW9uIA0KZm9yIHlvdXIgY3VzdG9t ZXI/PFNQQU4gDQpzdHlsZT0iQ09MT1I6IGJsYWNrOyBtc28tdGhlbWVjb2xvcjogdGV4dDEiPjxv OnA+PC9vOnA+PC9TUEFOPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0i QkFDS0dST1VORDogd2hpdGU7IExBWU9VVC1HUklELU1PREU6IGJvdGg7IFRFWFQtQUxJR046IGp1 c3RpZnk7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBo OyBMSU5FLUhFSUdIVDogMTUuNzVwdDsgVEVYVC1JTkRFTlQ6IDIycHQ7IG1zby1sYXlvdXQtZ3Jp ZC1hbGlnbjogYXV0bzsgbXNvLWNoYXItaW5kZW50LWNvdW50OiAyLjAiPjxTUEFOIA0KbGFuZz1F Ti1VUyANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJp ZiYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj4zLldvdWxkIA0KeW91IGxp a2UgdG8gaGF2ZSB5b3VyIG93biBicmFuZCBvZiBjb21wcmVzc29yPyBXZSBhcmUgZnVsbCBvZiBw cm9mZXNzaW9uYWwgDQpleHBlcmllbmNlIGluIE9FTS48L1NQQU4+PEJSPjxCUj4mbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQpIb3BpbmcgdG8gaGVhciB5b3VyIGlu dGVyZXN0aW5nISBDYW4geW91IHBsZWFzZSBnaXZlIG1lIHlvdXIga2luZCANCnJlcGx5PzxvOnA+ PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20g MGNtIDEwcHQiPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05U LUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYjMzk7Ij4mbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQo8L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5z LXNlcmlmJiMzOTsiPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0la RTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5 OyI+QmVzdCANClJlZ2FyZHMsPG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5z LXNlcmlmJiMzOTsiPjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwvUD48U1BBTiANCmxhbmc9RU4t VVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMz OTsiPjxvOnA+DQo8RElWIA0Kc3R5bGU9Ik1BUkdJTi1CT1RUT006IDBweDsgV0hJVEUtU1BBQ0U6 IG5vcm1hbDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IFdPUkQtU1BBQ0lORzogMHB4OyBDT0xPUjog cmdiKDAsMCwwKTsgRk9OVDogMTRweCDlrovkvZM7IE1BUkdJTi1UT1A6IDBweDsgTEVUVEVSLVNQ QUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1J TkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48Rk9OVCANCnN0eWxl PSJGT05ULUZBTUlMWTogQXJpYWwiIGNvbG9yPSMzMzMzNjY+Vmlja3k8L0ZPTlQ+PC9ESVY+DQo8 RElWIA0Kc3R5bGU9Ik1BUkdJTi1CT1RUT006IDBweDsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgVEVY VC1UUkFOU0ZPUk06IG5vbmU7IFdPUkQtU1BBQ0lORzogMHB4OyBDT0xPUjogcmdiKDAsMCwwKTsg Rk9OVDogMTRweCDlrovkvZM7IE1BUkdJTi1UT1A6IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1h bDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsg LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij5Db21wYW55IA0KU2t5cGU6PFNQQU4gY2xh c3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48QSANCnN0eWxlPSJURVhULURF Q09SQVRJT046IG5vbmUgIWltcG9ydGFudCIgaHJlZj0ibWFpbHRvOlZpbmNlbnRAaHFjb21wLmNv bSIgDQp0YXJnZXQ9X2JsYW5rPlZpbmNlbnRAaHFjb21wLmNvbTwvQT48L0RJVj48L286cD48L1NQ QU4+DQo8UD48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From zlang@redhat.com Wed Aug 3 02:39:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A936E7CA4 for ; Wed, 3 Aug 2016 02:39:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29138AC002 for ; Wed, 3 Aug 2016 00:39:24 -0700 (PDT) X-ASG-Debug-ID: 1470209962-0bf8157e6d3f2710001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ESJFapNZq7vE6Klc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 00:39:23 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 74167C04D2A3; Wed, 3 Aug 2016 07:39:22 +0000 (UTC) Received: from localhost (dhcp-12-196.nay.redhat.com [10.66.12.196]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u737dJJF026155; Wed, 3 Aug 2016 03:39:21 -0400 Date: Wed, 3 Aug 2016 15:39:18 +0800 From: Zorro Lang To: Dave Chinner Cc: Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] generic/095: update warning whitelist Message-ID: <20160803073918.GE16413@zlang.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] generic/095: update warning whitelist References: <1470042176-31447-1-git-send-email-hch@lst.de> <20160802232305.GQ12670@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802232305.GQ12670@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 03 Aug 2016 07:39:22 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470209963 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2059 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 03, 2016 at 09:23:05AM +1000, Dave Chinner wrote: > On Mon, Aug 01, 2016 at 11:02:56AM +0200, Christoph Hellwig wrote: > > The recent direct I/O path refactor changed the function name in the > > racing read case. Update the test case to handle the new name in > > addition to the old one. > > > > Signed-off-by: Christoph Hellwig > > --- > > tests/generic/095 | 6 ++++-- > > 1 file changed, 4 insertions(+), 2 deletions(-) > > > > diff --git a/tests/generic/095 b/tests/generic/095 > > index c656ef1..4754992 100755 > > --- a/tests/generic/095 > > +++ b/tests/generic/095 > > @@ -125,9 +125,11 @@ $FIO_PROG $fio_config >>$seqres.full 2>&1 > > filter_xfs_dmesg() > > { > > local warn1="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_dio_aio_write.*" > > - local warn2="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_read_iter.*" > > + local warn2="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_dio_aio_read.*" > > + local warn3="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_read_iter.*" > > sed -e "s#$warn1#Intentional warnings in xfs_file_dio_aio_write#" \ > > - -e "s#$warn2#Intentional warnings in xfs_file_read_iter#" > > + -e "s#$warn2#Intentional warnings in xfs_file_dio_aio_read#" \ > > + -e "s#$warn3#Intentional warnings in xfs_file_read_iter#" Hi, 1) xfs_file_dio_aio_read() was splited from xfs_file_read_iter() by below commit: bbc5a74 xfs: split xfs_file_read_iter into buffered and direct I/O helpers 2) xfs_file_read_iter() came from xfs_file_aio_read() as below commit: b4f5d2c xfs: switch to ->read_iter() Some Linux distro (e.g: RHEL-7) still use the old kernel with old function xfs_file_aio_read(), generic/095 always fails on it. So how about filter xfs_file_aio_read too? Thanks, Zorro > > } > > Looks fine. > > Reviewed-by: Dave Chinner > > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eguan@redhat.com Wed Aug 3 02:55:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 32B447CA4 for ; Wed, 3 Aug 2016 02:55:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6735AC001 for ; Wed, 3 Aug 2016 00:55:36 -0700 (PDT) X-ASG-Debug-ID: 1470210935-0bf8157e6c3f37f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id heLCxxL3rMacmuuq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 00:55:35 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6D422C04B326; Wed, 3 Aug 2016 07:55:35 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u737tWro019502; Wed, 3 Aug 2016 03:55:34 -0400 Date: Wed, 3 Aug 2016 15:55:32 +0800 From: Eryu Guan To: Zorro Lang Cc: Dave Chinner , Christoph Hellwig , fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] generic/095: update warning whitelist Message-ID: <20160803075531.GI27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] generic/095: update warning whitelist References: <1470042176-31447-1-git-send-email-hch@lst.de> <20160802232305.GQ12670@dastard> <20160803073918.GE16413@zlang.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803073918.GE16413@zlang.usersys.redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 03 Aug 2016 07:55:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470210935 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1988 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 03, 2016 at 03:39:18PM +0800, Zorro Lang wrote: > On Wed, Aug 03, 2016 at 09:23:05AM +1000, Dave Chinner wrote: > > On Mon, Aug 01, 2016 at 11:02:56AM +0200, Christoph Hellwig wrote: > > > The recent direct I/O path refactor changed the function name in the > > > racing read case. Update the test case to handle the new name in > > > addition to the old one. > > > > > > Signed-off-by: Christoph Hellwig > > > --- > > > tests/generic/095 | 6 ++++-- > > > 1 file changed, 4 insertions(+), 2 deletions(-) > > > > > > diff --git a/tests/generic/095 b/tests/generic/095 > > > index c656ef1..4754992 100755 > > > --- a/tests/generic/095 > > > +++ b/tests/generic/095 > > > @@ -125,9 +125,11 @@ $FIO_PROG $fio_config >>$seqres.full 2>&1 > > > filter_xfs_dmesg() > > > { > > > local warn1="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_dio_aio_write.*" > > > - local warn2="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_read_iter.*" > > > + local warn2="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_dio_aio_read.*" > > > + local warn3="WARNING:.*fs/xfs/xfs_file\.c:.*xfs_file_read_iter.*" > > > sed -e "s#$warn1#Intentional warnings in xfs_file_dio_aio_write#" \ > > > - -e "s#$warn2#Intentional warnings in xfs_file_read_iter#" > > > + -e "s#$warn2#Intentional warnings in xfs_file_dio_aio_read#" \ > > > + -e "s#$warn3#Intentional warnings in xfs_file_read_iter#" > > Hi, > > 1) xfs_file_dio_aio_read() was splited from xfs_file_read_iter() by > below commit: > > bbc5a74 xfs: split xfs_file_read_iter into buffered and direct I/O helpers > > 2) xfs_file_read_iter() came from xfs_file_aio_read() as below commit: > > b4f5d2c xfs: switch to ->read_iter() > > Some Linux distro (e.g: RHEL-7) still use the old kernel with old function > xfs_file_aio_read(), generic/095 always fails on it. So how about filter > xfs_file_aio_read too? I think you can just send another (follow-up) patch for review. Eryu From eguan@redhat.com Wed Aug 3 04:15:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D30E57CA4 for ; Wed, 3 Aug 2016 04:15:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96CBD8F8035 for ; Wed, 3 Aug 2016 02:15:48 -0700 (PDT) X-ASG-Debug-ID: 1470215746-0bf57b369d372000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id f9VaXmHdIaxe1N4z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 02:15:47 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B2FC985547; Wed, 3 Aug 2016 09:15:45 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u739FgMm021070; Wed, 3 Aug 2016 05:15:44 -0400 Date: Wed, 3 Aug 2016 17:15:42 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test Message-ID: <20160803091542.GM27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Wed, 03 Aug 2016 09:15:46 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470215747 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3621 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 21, 2016 at 04:46:54PM -0700, Darrick J. Wong wrote: > Run xfs_repair twice at the end of each test -- once to rebuild > the btree indices, and again with -n to check the rebuild work. Seems like it's two more xfs_repair, three in total :) > > Signed-off-by: Darrick J. Wong > --- > README | 4 ++++ > common/rc | 30 ++++++++++++++++++++++++++++++ > 2 files changed, 34 insertions(+) > > > diff --git a/README b/README > index 2647e12..4509cc1 100644 > --- a/README > +++ b/README > @@ -80,6 +80,10 @@ Preparing system for tests (IRIX and Linux): > added to the end of fsstresss and fsx invocations, respectively, > in case you wish to exclude certain operational modes from these > tests. > + - set TEST_XFS_REPAIR_REBUILD=1 to have _check_xfs_filesystem > + run xfs_repair -n to check the filesystem; xfs_repair to rebuild > + metadata indexes; and xfs_repair -n (a third time) to check the > + results of the rebuilding. > > - or add a case to the switch in common/config assigning > these variables based on the hostname of your test > diff --git a/common/rc b/common/rc > index 7c79bf8..3b45578 100644 > --- a/common/rc > +++ b/common/rc > @@ -2428,6 +2428,36 @@ _check_xfs_filesystem() > ok=0 > fi > > + if [ -n "$TEST_XFS_REPAIR_REBUILD" ]; then > + $XFS_REPAIR_PROG -n $extra_options $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 > + if [ $? -ne 0 ] > + then > + echo "_check_xfs_filesystem: filesystem on $device is inconsistent (r) (see $seqres.full)" > + > + echo "_check_xfs_filesystem: filesystem on $device is inconsistent" >>$seqres.full > + echo "*** xfs_repair -n output ***" >>$seqres.full > + cat $tmp.repair | _fix_malloc >>$seqres.full > + echo "*** end xfs_repair output" >>$seqres.full > + > + ok=0 > + fi > + rm -f $tmp.fs_check $tmp.logprint $tmp.repair > + > + $XFS_REPAIR_PROG $extra_options $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 > + if [ $? -ne 0 ] > + then > + echo "_check_xfs_filesystem: filesystem on $device is inconsistent (r) (see $seqres.full)" > + > + echo "_check_xfs_filesystem: filesystem on $device is inconsistent" >>$seqres.full > + echo "*** xfs_repair -n output ***" >>$seqres.full > + cat $tmp.repair | _fix_malloc >>$seqres.full > + echo "*** end xfs_repair output" >>$seqres.full > + > + ok=0 > + fi > + rm -f $tmp.fs_check $tmp.logprint $tmp.repair > + fi > + I think we can move this hunk after the original xfs_repair and swap the xfs_repair order, i.e. xfs_repair -n # this is the original repair check if ; then xfs_repair # do rebuild without -n xfs_repair -n # check rebuild result fi This seems more clear to me and we can mark which repair is failing more easily (right now the three xfs_repairs are all marked as "(r)", it's hard to say which one is failing), e.g. xfs_repair -n # marked as "(r)", means "repair" if ; then xfs_repair # mark as "(rb)", means "rebuild"? xfs_repair -n # mark as "(rr)", means "repair rebuild"? fi Thanks, Eryu > $XFS_REPAIR_PROG -n $extra_options $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 > if [ $? -ne 0 ] > then > From BATV+bfb50cb660de995a4775+4728+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 3 04:16:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 09BAF7CA4 for ; Wed, 3 Aug 2016 04:16:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B0D088F8033 for ; Wed, 3 Aug 2016 02:16:36 -0700 (PDT) X-ASG-Debug-ID: 1470215794-0bf8157e6b3f7060001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id RX4CIzSHCoIsQrhW (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 03 Aug 2016 02:16:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bfb50cb660de995a4775+4728+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUsHr-0002lZ-TY; Wed, 03 Aug 2016 09:16:27 +0000 Date: Wed, 3 Aug 2016 02:16:27 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 11/47] xfs: move deferred operations into a separate file Message-ID: <20160803091627.GA5289@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/47] xfs: move deferred operations into a separate file References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> <20160801080223.GB30547@infradead.org> <20160802223950.GN16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802223950.GN16044@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470215794 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 713 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 03, 2016 at 08:39:50AM +1000, Dave Chinner wrote: > Rather than have to make major changes to core infrastructure now, > let's work this out as a separate patchset to clean up the rmap and > reflink code in the next couple of releases. It's going to be better > to get working code out there now under the experimental tag than it > is is to keep it as an out of tree patchset for another cycle. The problm is that this does not only affect the rmap code (for which I suspect it actually is fine), but also regresses the freed extent logging. If you want minimal changes we should simply drop the patches to move over the freed extent tracking to the new deferred ops mechanism for now. From BATV+bfb50cb660de995a4775+4728+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 3 04:25:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7E567CA4 for ; Wed, 3 Aug 2016 04:25:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8B09B304032 for ; Wed, 3 Aug 2016 02:25:04 -0700 (PDT) X-ASG-Debug-ID: 1470216302-0bf8157e6b3f72a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id MOMYxw77KfOatMT3 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 03 Aug 2016 02:25:02 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bfb50cb660de995a4775+4728+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bUsQA-00050R-2T; Wed, 03 Aug 2016 09:25:02 +0000 Date: Wed, 3 Aug 2016 02:25:02 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, jack@suse.cz Subject: Re: [PATCH] xfs: don't invalidate whole file on DAX read/write Message-ID: <20160803092502.GA17891@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't invalidate whole file on DAX read/write References: <1470181226-20935-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470181226-20935-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470216302 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1240 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 03, 2016 at 09:40:26AM +1000, Dave Chinner wrote: > From: Dave Chinner > > When we do DAX IO, we try to invalidate the entire page cache held > on the file. This is incorrect as it will trash the entire mapping > tree that now tracks dirty state in exceptional entries in the radix > tree slots. > > What we are trying to do is remove cached pages (e.g from reads > into holes) that sit in the radix tree over the range we are about > to write to. Hence we should just limit the invalidation to the > range we are about to overwrite. Looks fine (for a broad defintion of "fine"): Reviewed-by: Christoph Hellwig > + * XXX: This is racy against mmap, and there's nothing we can do about > + * it. dax_do_io() should really do this invalidation internally as > + * it will know if we've allocated over a holei for this specific IO and > + * if so it needs to update the mapping tree and invalidate existing > + * PTEs over the newly allocated range. Remove this invalidation when > + * dax_do_io() is fixed up. FYI, I've got a basically working version of an iomap based DAX I/O path (still fails a few corner cases), and I'll see if I can add that to it. From eguan@redhat.com Wed Aug 3 04:38:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 71A807CA4 for ; Wed, 3 Aug 2016 04:38:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40299304051 for ; Wed, 3 Aug 2016 02:38:00 -0700 (PDT) X-ASG-Debug-ID: 1470217079-0bf57b369c372580001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1lfztu7IYOKvfEW4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 02:38:00 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F23068E3E0; Wed, 3 Aug 2016 09:37:58 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u739buCQ002746; Wed, 3 Aug 2016 05:37:57 -0400 Date: Wed, 3 Aug 2016 17:37:55 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 07/17] xfs/128: cycle_mount the scratch device, not the test device Message-ID: <20160803093755.GN27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 07/17] xfs/128: cycle_mount the scratch device, not the test device References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914482100.11762.3197784490090678443.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914482100.11762.3197784490090678443.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Wed, 03 Aug 2016 09:37:59 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470217079 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2423 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 21, 2016 at 04:47:01PM -0700, Darrick J. Wong wrote: > This test uses the scratch device, so cycle that, not the test dev. > This is also a xfs_fsr test, so put it in the fsr group. > > Signed-off-by: Darrick J. Wong > --- > tests/xfs/128 | 7 ++++--- > tests/xfs/group | 2 +- > 2 files changed, 5 insertions(+), 4 deletions(-) > > > diff --git a/tests/xfs/128 b/tests/xfs/128 > index 8758d7e..2e756d5 100755 > --- a/tests/xfs/128 > +++ b/tests/xfs/128 > @@ -66,7 +66,7 @@ _pwrite_byte 0x61 0 $((blks * blksz)) $testdir/file1 >> $seqres.full > _cp_reflink $testdir/file1 $testdir/file2 > _cp_reflink $testdir/file2 $testdir/file3 > _cp_reflink $testdir/file3 $testdir/file4 > -_test_cycle_mount > +_scratch_cycle_mount > free_blocks1=$(stat -f $testdir -c '%f') > > md5sum $testdir/file1 | _filter_scratch > @@ -82,7 +82,7 @@ c04=$(_md5_checksum $testdir/file4) > echo "CoW the reflink copies" > _pwrite_byte 0x62 $blksz $blksz $testdir/file2 >> $seqres.full > _pwrite_byte 0x63 $(( blksz * (blks - 1) )) $blksz $testdir/file3 >> $seqres.full > -_test_cycle_mount > +_scratch_cycle_mount > free_blocks2=$(stat -f $testdir -c '%f') > > md5sum $testdir/file1 | _filter_scratch > @@ -97,11 +97,12 @@ c14=$(_md5_checksum $testdir/file4) > > echo "Defragment" > lsattr -l $testdir/ | _filter_scratch | _filter_spaces > +filefrag -v $testdir/file* >> $seqres.full Is this intentional? Use $FILEFRAG_PROG instead and add _require_command "$FILEFRAG_PROG" "filefrag" at the beginning of the test? Thanks, Eryu > $XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full > $XFS_FSR_PROG -v -d $testdir/file2 >> $seqres.full # fsr probably breaks the link > $XFS_FSR_PROG -v -d $testdir/file3 >> $seqres.full # fsr probably breaks the link > $XFS_FSR_PROG -v -d $testdir/file4 >> $seqres.full # fsr probably ignores this file > -_test_cycle_mount > +_scratch_cycle_mount > free_blocks3=$(stat -f $testdir -c '%f') > > md5sum $testdir/file1 | _filter_scratch > diff --git a/tests/xfs/group b/tests/xfs/group > index aa3b3ec..5ccf3d6 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -125,7 +125,7 @@ > 125 fuzzers > 126 fuzzers > 127 auto quick clone > -128 auto quick clone > +128 auto quick clone fsr > 129 auto quick clone > 130 fuzzers clone > 131 auto quick clone > From eguan@redhat.com Wed Aug 3 05:38:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ECC307CA2 for ; Wed, 3 Aug 2016 05:38:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E94EAC003 for ; Wed, 3 Aug 2016 03:38:06 -0700 (PDT) X-ASG-Debug-ID: 1470220684-0bf57c1369317ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fMYtmiCzC9uNHX5u (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 03:38:05 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6238DC03BD58; Wed, 3 Aug 2016 10:38:04 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u73Ac1jn007427; Wed, 3 Aug 2016 06:38:03 -0400 Date: Wed, 3 Aug 2016 18:38:00 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 09/17] common/dmerror: fix mount option issues Message-ID: <20160803103800.GO27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 09/17] common/dmerror: fix mount option issues References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 03 Aug 2016 10:38:04 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470220685 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1159 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 21, 2016 at 04:47:13PM -0700, Darrick J. Wong wrote: > Calling _mount doesn't work when we want to add mount options > such as realtime devices. Since it's just a normal scratch device > mount except for the source device, just call _scratch_mount with > SCRATCH_DEV set to the dmerror device. > > Signed-off-by: Darrick J. Wong > --- > common/dmerror | 7 +------ > 1 file changed, 1 insertion(+), 6 deletions(-) > > > diff --git a/common/dmerror b/common/dmerror > index 5ad9994..22b9ea9 100644 > --- a/common/dmerror > +++ b/common/dmerror > @@ -41,14 +41,9 @@ _dmerror_init() > DMERROR_TABLE="0 $blk_dev_size error $dm_backing_dev 0" > } > > -_dmerror_mount_options() > -{ > - echo `_common_dev_mount_options $*` $DMERROR_DEV $SCRATCH_MNT > -} > - > _dmerror_mount() > { > - _mount -t $FSTYP `_dmerror_mount_options $*` > + SCRATCH_DEV=$DMERROR_DEV _scratch_mount $* Perhaps you can add "_scratch_options mount" to _dmerror_mount then mount with $SCRATCH_OPTIONS? Like what _mount_delay does in common/dmdelay. Thanks, Eryu > } > > _dmerror_unmount() > From jack@suse.cz Wed Aug 3 06:28:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 42AF97CA2 for ; Wed, 3 Aug 2016 06:28:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F1441304032 for ; Wed, 3 Aug 2016 04:28:20 -0700 (PDT) X-ASG-Debug-ID: 1470223698-0bf57c1367318d30001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id TGOBYcMbHxE9pSbg (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 04:28:19 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C21FCACE1; Wed, 3 Aug 2016 11:28:15 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id E2D641E0F2B; Wed, 3 Aug 2016 13:28:14 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner , Ilya Dryomov , "Yan, Zheng" , ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 5/5] fs: Avoid premature clearing of capabilities Date: Wed, 3 Aug 2016 13:28:09 +0200 X-ASG-Orig-Subj: [PATCH 5/5] fs: Avoid premature clearing of capabilities Message-Id: <1470223689-17783-6-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1470223689-17783-1-git-send-email-jack@suse.cz> References: <1470223689-17783-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470223699 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2051 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Currently, notify_change() clears capabilities or IMA attributes by calling security_inode_killpriv() before calling into ->setattr. Thus it happens before any other permission checks in inode_change_ok() and user is thus allowed to trigger clearing of capabilities or IMA attributes for any file he can look up e.g. by calling chown for that file. This is unexpected and can lead to user DoSing a system. Fix the problem by calling security_inode_killpriv() at the end of inode_change_ok() instead of from notify_change(). At that moment we are sure user has permissions to do the requested change. References: CVE-2015-1350 Signed-off-by: Jan Kara --- fs/attr.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 5c45909ea204..83c8430d908f 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -47,7 +47,7 @@ int setattr_prepare(struct dentry *dentry, struct iattr *attr) /* If force is set do it anyway. */ if (ia_valid & ATTR_FORCE) - return 0; + goto kill_priv; /* Make sure a caller can chown. */ if ((ia_valid & ATTR_UID) && @@ -80,6 +80,16 @@ int setattr_prepare(struct dentry *dentry, struct iattr *attr) return -EPERM; } +kill_priv: + /* User has permission for the change */ + if (ia_valid & ATTR_KILL_PRIV) { + int error; + + error = security_inode_killpriv(dentry); + if (error) + return error; + } + return 0; } EXPORT_SYMBOL(setattr_prepare); @@ -220,13 +230,11 @@ int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **de if (!(ia_valid & ATTR_MTIME_SET)) attr->ia_mtime = now; if (ia_valid & ATTR_KILL_PRIV) { - attr->ia_valid &= ~ATTR_KILL_PRIV; - ia_valid &= ~ATTR_KILL_PRIV; error = security_inode_need_killpriv(dentry); - if (error > 0) - error = security_inode_killpriv(dentry); - if (error) + if (error < 0) return error; + if (error == 0) + ia_valid = attr->ia_valid &= ~ATTR_KILL_PRIV; } /* -- 2.6.6 From jack@suse.cz Wed Aug 3 06:28:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 475517CA3 for ; Wed, 3 Aug 2016 06:28:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B7F1304039 for ; Wed, 3 Aug 2016 04:28:20 -0700 (PDT) X-ASG-Debug-ID: 1470223696-0bf57b369b374f70001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 4OEbVvaxbbdgFL4V (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 04:28:17 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 98FEAACAC; Wed, 3 Aug 2016 11:28:15 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id E0F4F1E0F2E; Wed, 3 Aug 2016 13:28:14 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner , Ilya Dryomov , "Yan, Zheng" , ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 4/5] fs: Give dentry to inode_change_ok() instead of inode Date: Wed, 3 Aug 2016 13:28:08 +0200 X-ASG-Orig-Subj: [PATCH 4/5] fs: Give dentry to inode_change_ok() instead of inode Message-Id: <1470223689-17783-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1470223689-17783-1-git-send-email-jack@suse.cz> References: <1470223689-17783-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470223696 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 29066 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0713 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.50 BSF_SC0_MV0713 Custom rule MV0713 inode_change_ok() will be resposible for clearing capabilities and IMA extended attributes and as such will need dentry. Give it as an argument to inode_change_ok() instead of an inode. Also rename inode_change_ok() to setattr_prepare() to better relect that it does also some modifications in addition to checks. Signed-off-by: Jan Kara --- Documentation/filesystems/porting | 4 ++-- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/9p/vfs_inode.c | 2 +- fs/9p/vfs_inode_dotl.c | 2 +- fs/adfs/inode.c | 2 +- fs/affs/inode.c | 2 +- fs/attr.c | 15 +++++++++------ fs/btrfs/inode.c | 2 +- fs/ceph/inode.c | 2 +- fs/cifs/inode.c | 4 ++-- fs/ecryptfs/inode.c | 2 +- fs/exofs/inode.c | 2 +- fs/ext2/inode.c | 2 +- fs/ext4/inode.c | 2 +- fs/f2fs/file.c | 2 +- fs/fat/file.c | 2 +- fs/fuse/dir.c | 2 +- fs/gfs2/inode.c | 2 +- fs/hfs/inode.c | 2 +- fs/hfsplus/inode.c | 2 +- fs/hostfs/hostfs_kern.c | 2 +- fs/hpfs/inode.c | 2 +- fs/hugetlbfs/inode.c | 2 +- fs/jffs2/fs.c | 2 +- fs/jfs/file.c | 2 +- fs/kernfs/inode.c | 2 +- fs/libfs.c | 2 +- fs/logfs/file.c | 2 +- fs/minix/file.c | 2 +- fs/ncpfs/inode.c | 2 +- fs/nfsd/nfsproc.c | 8 +++----- fs/nilfs2/inode.c | 2 +- fs/ntfs/inode.c | 2 +- fs/ocfs2/dlmfs/dlmfs.c | 2 +- fs/ocfs2/file.c | 2 +- fs/omfs/file.c | 2 +- fs/orangefs/inode.c | 2 +- fs/overlayfs/inode.c | 2 +- fs/proc/base.c | 2 +- fs/proc/generic.c | 2 +- fs/proc/proc_sysctl.c | 2 +- fs/ramfs/file-nommu.c | 2 +- fs/reiserfs/inode.c | 2 +- fs/sysv/file.c | 2 +- fs/ubifs/file.c | 2 +- fs/udf/file.c | 2 +- fs/ufs/inode.c | 2 +- fs/utimes.c | 4 ++-- fs/xfs/xfs_iops.c | 10 ++++------ include/linux/fs.h | 2 +- mm/shmem.c | 2 +- 51 files changed, 67 insertions(+), 68 deletions(-) diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index a5fb89cac615..ebf429bbece4 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting @@ -287,8 +287,8 @@ implementing on-disk size changes. Start with a copy of the old inode_setattr and vmtruncate, and the reorder the vmtruncate + foofs_vmtruncate sequence to be in order of zeroing blocks using block_truncate_page or similar helpers, size update and on finally on-disk truncation which should not fail. -inode_change_ok now includes the size checks for ATTR_SIZE and must be called -in the beginning of ->setattr unconditionally. +setattr_prepare (which used to be inode_change_ok) now includes the size checks +for ATTR_SIZE and must be called in the beginning of ->setattr unconditionally. [mandatory] diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index 546063e728db..fb7b54eff027 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c @@ -1192,7 +1192,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import) attr->ia_valid |= ATTR_MTIME | ATTR_CTIME; } - /* POSIX: check before ATTR_*TIME_SET set (from inode_change_ok) */ + /* POSIX: check before ATTR_*TIME_SET set (from setattr_prepare) */ if (attr->ia_valid & TIMES_SET_FLAGS) { if ((!uid_eq(current_fsuid(), inode->i_uid)) && !capable(CFS_CAP_FOWNER)) diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 7da9a8354fad..1db8be34d708 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -1094,7 +1094,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr) struct p9_wstat wstat; p9_debug(P9_DEBUG_VFS, "\n"); - retval = inode_change_ok(d_inode(dentry), iattr); + retval = setattr_prepare(dentry, iattr); if (retval) return retval; diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 2ed04c2fe7af..645b5a8b1636 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -558,7 +558,7 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr) p9_debug(P9_DEBUG_VFS, "\n"); - retval = inode_change_ok(inode, iattr); + retval = setattr_prepare(dentry, iattr); if (retval) return retval; diff --git a/fs/adfs/inode.c b/fs/adfs/inode.c index 335055d828e4..f57baaa511aa 100644 --- a/fs/adfs/inode.c +++ b/fs/adfs/inode.c @@ -303,7 +303,7 @@ adfs_notify_change(struct dentry *dentry, struct iattr *attr) unsigned int ia_valid = attr->ia_valid; int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); /* * we can't change the UID or GID of any file - diff --git a/fs/affs/inode.c b/fs/affs/inode.c index 0fdb0f5b2239..1aa243502c7f 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c @@ -219,7 +219,7 @@ affs_notify_change(struct dentry *dentry, struct iattr *attr) pr_debug("notify_change(%lu,0x%x)\n", inode->i_ino, attr->ia_valid); - error = inode_change_ok(inode,attr); + error = setattr_prepare(dentry, attr); if (error) goto out; diff --git a/fs/attr.c b/fs/attr.c index 42bb42bb3c72..5c45909ea204 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -17,19 +17,22 @@ #include /** - * inode_change_ok - check if attribute changes to an inode are allowed - * @inode: inode to check + * setattr_prepare - check if attribute changes to a dentry are allowed + * @dentry: dentry to check * @attr: attributes to change * * Check if we are allowed to change the attributes contained in @attr - * in the given inode. This includes the normal unix access permission - * checks, as well as checks for rlimits and others. + * in the given dentry. This includes the normal unix access permission + * checks, as well as checks for rlimits and others. The function also clears + * SGID bit from mode if user is not allowed to set it. Also file capabilities + * and IMA extended attributes are cleared if ATTR_KILL_PRIV is set. * * Should be called as the first thing in ->setattr implementations, * possibly after taking additional locks. */ -int inode_change_ok(const struct inode *inode, struct iattr *attr) +int setattr_prepare(struct dentry *dentry, struct iattr *attr) { + struct inode *inode = d_inode(dentry); unsigned int ia_valid = attr->ia_valid; /* @@ -79,7 +82,7 @@ int inode_change_ok(const struct inode *inode, struct iattr *attr) return 0; } -EXPORT_SYMBOL(inode_change_ok); +EXPORT_SYMBOL(setattr_prepare); /** * inode_newsize_ok - may this inode be truncated to a given size diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 8078077d1090..065877c4155d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5037,7 +5037,7 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) if (btrfs_root_readonly(root)) return -EROFS; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 2aa3c0bcf3a5..082e82dcbaa4 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -2123,7 +2123,7 @@ int ceph_setattr(struct dentry *dentry, struct iattr *attr) if (ceph_snap(inode) != CEPH_NOSNAP) return -EROFS; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err != 0) return err; diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index b87efd0c92d6..13cf507d1423 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -2154,7 +2154,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) attrs->ia_valid |= ATTR_FORCE; - rc = inode_change_ok(inode, attrs); + rc = setattr_prepare(direntry, attrs); if (rc < 0) goto out; @@ -2294,7 +2294,7 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_PERM) attrs->ia_valid |= ATTR_FORCE; - rc = inode_change_ok(inode, attrs); + rc = setattr_prepare(direntry, attrs); if (rc < 0) { free_xid(xid); return rc; diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 9d153b6a1d72..5ffba186f352 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c @@ -927,7 +927,7 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia) } mutex_unlock(&crypt_stat->cs_mutex); - rc = inode_change_ok(inode, ia); + rc = setattr_prepare(dentry, ia); if (rc) goto out; if (ia->ia_valid & ATTR_SIZE) { diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c index 9dc4c6dbf3c9..5e68daee5fe4 100644 --- a/fs/exofs/inode.c +++ b/fs/exofs/inode.c @@ -1034,7 +1034,7 @@ int exofs_setattr(struct dentry *dentry, struct iattr *iattr) if (unlikely(error)) return error; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (unlikely(error)) return error; diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index d5c7d09919f3..65c077d9a5e9 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -1580,7 +1580,7 @@ int ext2_setattr(struct dentry *dentry, struct iattr *iattr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) return error; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3131747199e1..fdf9bee67a12 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5073,7 +5073,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) int orphan = 0; const unsigned int ia_valid = attr->ia_valid; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 0e493f63ea41..26ebda971d53 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -680,7 +680,7 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int err; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/fat/file.c b/fs/fat/file.c index f70185668832..c09ab4e108e5 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -450,7 +450,7 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr) attr->ia_valid &= ~TIMES_SET_FLAGS; } - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); attr->ia_valid = ia_valid; if (error) { if (sbi->options.quiet) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index f29ce9cb30e6..f693e0d45380 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1609,7 +1609,7 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS)) attr->ia_valid |= ATTR_FORCE; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index e0621cacf134..c94a9df6bdab 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -1932,7 +1932,7 @@ static int gfs2_setattr(struct dentry *dentry, struct iattr *attr) if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto out; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) goto out; diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index 02a3845363f7..f706906cfaca 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -605,7 +605,7 @@ int hfs_inode_setattr(struct dentry *dentry, struct iattr * attr) struct hfs_sb_info *hsb = HFS_SB(inode->i_sb); int error; - error = inode_change_ok(inode, attr); /* basic permission checks */ + error = setattr_prepare(dentry, attr); /* basic permission checks */ if (error) return error; diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index 19462d773fe2..c43ef397a3aa 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c @@ -245,7 +245,7 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index 5c57654927a6..f26cf2b3a011 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -812,7 +812,7 @@ static int hostfs_setattr(struct dentry *dentry, struct iattr *attr) int fd = HOSTFS_I(inode)->fd; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index 1f3c6d76200b..b9c724ed1e7e 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c @@ -273,7 +273,7 @@ int hpfs_setattr(struct dentry *dentry, struct iattr *attr) if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size) goto out_unlock; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) goto out_unlock; diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 4ea71eba40a5..fb3312f2c861 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c @@ -672,7 +672,7 @@ static int hugetlbfs_setattr(struct dentry *dentry, struct iattr *attr) BUG_ON(!inode); - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index ae2ebb26b446..3773b24b4db0 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c @@ -193,7 +193,7 @@ int jffs2_setattr(struct dentry *dentry, struct iattr *iattr) struct inode *inode = d_inode(dentry); int rc; - rc = inode_change_ok(inode, iattr); + rc = setattr_prepare(dentry, iattr); if (rc) return rc; diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 7f1a585a0a94..cf62037b8a04 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c @@ -103,7 +103,7 @@ int jfs_setattr(struct dentry *dentry, struct iattr *iattr) struct inode *inode = d_inode(dentry); int rc; - rc = inode_change_ok(inode, iattr); + rc = setattr_prepare(dentry, iattr); if (rc) return rc; diff --git a/fs/kernfs/inode.c b/fs/kernfs/inode.c index 63b925d5ba1e..df21f5b75549 100644 --- a/fs/kernfs/inode.c +++ b/fs/kernfs/inode.c @@ -122,7 +122,7 @@ int kernfs_iop_setattr(struct dentry *dentry, struct iattr *iattr) return -EINVAL; mutex_lock(&kernfs_mutex); - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) goto out; diff --git a/fs/libfs.c b/fs/libfs.c index 74dc8b9e7f53..2b3c3ae70153 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -394,7 +394,7 @@ int simple_setattr(struct dentry *dentry, struct iattr *iattr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) return error; diff --git a/fs/logfs/file.c b/fs/logfs/file.c index f01ddfb1a03b..5d9fe466bbc9 100644 --- a/fs/logfs/file.c +++ b/fs/logfs/file.c @@ -244,7 +244,7 @@ static int logfs_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int err = 0; - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/minix/file.c b/fs/minix/file.c index 94f0eb9a6e2c..a6a4797aa0d4 100644 --- a/fs/minix/file.c +++ b/fs/minix/file.c @@ -26,7 +26,7 @@ static int minix_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 1af15fcbe57b..f6cf4c7e92b1 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c @@ -884,7 +884,7 @@ int ncp_notify_change(struct dentry *dentry, struct iattr *attr) /* ageing the dentry to force validation */ ncp_age_dentry(server, dentry); - result = inode_change_ok(inode, attr); + result = setattr_prepare(dentry, attr); if (result < 0) goto out; diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index 4cd78ef4c95c..44f6f4f5eee0 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -74,10 +74,10 @@ nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp, * which only requires access, and "set-[ac]time-to-X" which * requires ownership. * So if it looks like it might be "set both to the same time which - * is close to now", and if inode_change_ok fails, then we + * is close to now", and if setattr_prepare fails, then we * convert to "set to now" instead of "set to explicit time" * - * We only call inode_change_ok as the last test as technically + * We only call setattr_prepare as the last test as technically * it is not an interface that we should be using. */ #define BOTH_TIME_SET (ATTR_ATIME_SET | ATTR_MTIME_SET) @@ -92,17 +92,15 @@ nfsd_proc_setattr(struct svc_rqst *rqstp, struct nfsd_sattrargs *argp, * request is. We require it be within 30 minutes of now. */ time_t delta = iap->ia_atime.tv_sec - get_seconds(); - struct inode *inode; nfserr = fh_verify(rqstp, fhp, 0, NFSD_MAY_NOP); if (nfserr) goto done; - inode = d_inode(fhp->fh_dentry); if (delta < 0) delta = -delta; if (delta < MAX_TOUCH_TIME_ERROR && - inode_change_ok(inode, iap) != 0) { + setattr_prepare(fhp->fh_dentry, iap) != 0) { /* * Turn off ATTR_[AM]TIME_SET but leave ATTR_[AM]TIME. * This will cause notify_change to set these times diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index af04f553d7c9..402c325e0467 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c @@ -829,7 +829,7 @@ int nilfs_setattr(struct dentry *dentry, struct iattr *iattr) struct super_block *sb = inode->i_sb; int err; - err = inode_change_ok(inode, iattr); + err = setattr_prepare(dentry, iattr); if (err) return err; diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c index e01287c964a8..9d7a44872df5 100644 --- a/fs/ntfs/inode.c +++ b/fs/ntfs/inode.c @@ -2893,7 +2893,7 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr) int err; unsigned int ia_valid = attr->ia_valid; - err = inode_change_ok(vi, attr); + err = setattr_prepare(dentry, attr); if (err) goto out; /* We do not support NTFS ACLs yet. */ diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c index 47b3b2d4e775..d71f538d0a18 100644 --- a/fs/ocfs2/dlmfs/dlmfs.c +++ b/fs/ocfs2/dlmfs/dlmfs.c @@ -211,7 +211,7 @@ static int dlmfs_file_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); attr->ia_valid &= ~ATTR_SIZE; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 4e7b0dc22450..1ab3657242e8 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -1155,7 +1155,7 @@ int ocfs2_setattr(struct dentry *dentry, struct iattr *attr) if (!(attr->ia_valid & OCFS2_VALID_ATTRS)) return 0; - status = inode_change_ok(inode, attr); + status = setattr_prepare(dentry, attr); if (status) return status; diff --git a/fs/omfs/file.c b/fs/omfs/file.c index d9e26cfbb793..bf83e6644333 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c @@ -349,7 +349,7 @@ static int omfs_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/orangefs/inode.c b/fs/orangefs/inode.c index 28a0557a69be..cff00ebac03a 100644 --- a/fs/orangefs/inode.c +++ b/fs/orangefs/inode.c @@ -219,7 +219,7 @@ int orangefs_setattr(struct dentry *dentry, struct iattr *iattr) "orangefs_setattr: called on %s\n", dentry->d_name.name); - ret = inode_change_ok(inode, iattr); + ret = setattr_prepare(dentry, iattr); if (ret) goto out; diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 1b885c156028..990388dba9b8 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -52,7 +52,7 @@ int ovl_setattr(struct dentry *dentry, struct iattr *attr) * inode_newsize_ok() will always check against MAX_LFS_FILESIZE and not * check for a swapfile (which this won't be anyway). */ - err = inode_change_ok(dentry->d_inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/proc/base.c b/fs/proc/base.c index 54e270262979..207f36039f63 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -709,7 +709,7 @@ int proc_setattr(struct dentry *dentry, struct iattr *attr) if (attr->ia_valid & ATTR_MODE) return -EPERM; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/proc/generic.c b/fs/proc/generic.c index c633476616e0..23ff30e3c1e7 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -105,7 +105,7 @@ static int proc_notify_change(struct dentry *dentry, struct iattr *iattr) struct proc_dir_entry *de = PDE(inode); int error; - error = inode_change_ok(inode, iattr); + error = setattr_prepare(dentry, iattr); if (error) return error; diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index b59db94d2ff4..1614ddd1fac2 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c @@ -754,7 +754,7 @@ static int proc_sys_setattr(struct dentry *dentry, struct iattr *attr) if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID)) return -EPERM; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index be3ddd189cd4..2bcbf4e77982 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c @@ -169,7 +169,7 @@ static int ramfs_nommu_setattr(struct dentry *dentry, struct iattr *ia) int ret = 0; /* POSIX UID/GID verification for setting inode attributes */ - ret = inode_change_ok(inode, ia); + ret = setattr_prepare(dentry, ia); if (ret) return ret; diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index c2c59f9ff04b..cb7f518d37ae 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -3312,7 +3312,7 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) unsigned int ia_valid; int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/sysv/file.c b/fs/sysv/file.c index 82ddc09061e2..7ba997e31aeb 100644 --- a/fs/sysv/file.c +++ b/fs/sysv/file.c @@ -33,7 +33,7 @@ static int sysv_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 7bbf420d1289..b0a6a53263f3 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c @@ -1262,7 +1262,7 @@ int ubifs_setattr(struct dentry *dentry, struct iattr *attr) dbg_gen("ino %lu, mode %#x, ia_valid %#x", inode->i_ino, inode->i_mode, attr->ia_valid); - err = inode_change_ok(inode, attr); + err = setattr_prepare(dentry, attr); if (err) return err; diff --git a/fs/udf/file.c b/fs/udf/file.c index 632570617327..2d61d9827e6f 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -247,7 +247,7 @@ static int udf_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 9f49431e798d..e4a4d248a0f5 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -1208,7 +1208,7 @@ int ufs_setattr(struct dentry *dentry, struct iattr *attr) unsigned int ia_valid = attr->ia_valid; int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; diff --git a/fs/utimes.c b/fs/utimes.c index 85c40f4f373d..9368ac446797 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -81,7 +81,7 @@ static int utimes_common(struct path *path, struct timespec *times) newattrs.ia_valid |= ATTR_MTIME_SET; } /* - * Tell inode_change_ok(), that this is an explicit time + * Tell setattr_prepare(), that this is an explicit time * update, even if neither ATTR_ATIME_SET nor ATTR_MTIME_SET * were used. */ @@ -90,7 +90,7 @@ static int utimes_common(struct path *path, struct timespec *times) /* * If times is NULL (or both times are UTIME_NOW), * then we need to check permissions, because - * inode_change_ok() won't do it. + * setattr_prepare() won't do it. */ error = -EACCES; if (IS_IMMUTABLE(inode)) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index f5db392e7d1e..6d0d5d413fad 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -547,9 +547,7 @@ xfs_vn_change_ok( struct dentry *dentry, struct iattr *iattr) { - struct inode *inode = d_inode(dentry); - struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; + struct xfs_mount *mp = XFS_I(d_inode(dentry))->i_mount; if (mp->m_flags & XFS_MOUNT_RDONLY) return -EROFS; @@ -557,14 +555,14 @@ xfs_vn_change_ok( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - return inode_change_ok(inode, iattr); + return setattr_prepare(dentry, iattr); } /* * Set non-size attributes of an inode. * * Caution: The caller of this function is responsible for calling - * inode_change_ok() or otherwise verifying the change is fine. + * setattr_prepare() or otherwise verifying the change is fine. */ int xfs_setattr_nonsize( @@ -772,7 +770,7 @@ xfs_vn_setattr_nonsize( * Truncate file. Must have write permission and not be a directory. * * Caution: The caller of this function is responsible for calling - * inode_change_ok() or otherwise verifying the change is fine. + * setattr_prepare() or otherwise verifying the change is fine. */ int xfs_setattr_size( diff --git a/include/linux/fs.h b/include/linux/fs.h index f3f0b4c8e8ac..21ae62181e4b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2999,7 +2999,7 @@ extern int buffer_migrate_page(struct address_space *, #define buffer_migrate_page NULL #endif -extern int inode_change_ok(const struct inode *, struct iattr *); +extern int setattr_prepare(struct dentry *, struct iattr *); extern int inode_newsize_ok(const struct inode *, loff_t offset); extern void setattr_copy(struct inode *inode, const struct iattr *attr); diff --git a/mm/shmem.c b/mm/shmem.c index 2ac19a61d565..17b1c41d0c3c 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -959,7 +959,7 @@ static int shmem_setattr(struct dentry *dentry, struct iattr *attr) struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; -- 2.6.6 From jack@suse.cz Wed Aug 3 06:28:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A6D797CA6 for ; Wed, 3 Aug 2016 06:28:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 76BF4304039 for ; Wed, 3 Aug 2016 04:28:19 -0700 (PDT) X-ASG-Debug-ID: 1470223696-0bf57c1369318d30001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id URjv7CHa0bj3BGsy (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 04:28:17 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 81190ACAB; Wed, 3 Aug 2016 11:28:15 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id DAC9B1E06FC; Wed, 3 Aug 2016 13:28:14 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner , Ilya Dryomov , "Yan, Zheng" , ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Date: Wed, 3 Aug 2016 13:28:05 +0200 X-ASG-Orig-Subj: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Message-Id: <1470223689-17783-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1470223689-17783-1-git-send-email-jack@suse.cz> References: <1470223689-17783-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470223696 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6393 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. Propagate dentry down to functions calling inode_change_ok(). This is rather straightforward except for xfs_set_mode() function which does not have dentry easily available. Luckily that function does not call inode_change_ok() anyway so we just have to do a little dance with function prototypes. Acked-by: Dave Chinner Signed-off-by: Jan Kara --- fs/xfs/xfs_file.c | 2 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_iops.c | 94 ++++++++++++++++++++++++++++++++++++------------------ fs/xfs/xfs_iops.h | 3 +- 5 files changed, 68 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ed95e5bb04e6..79205202a29a 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -973,7 +973,7 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; - error = xfs_setattr_size(ip, &iattr); + error = xfs_vn_setattr_size(file_dentry(file), &iattr); if (error) goto out_unlock; } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8825bcfd314c..c96f3d21b2bc 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1709,7 +1709,7 @@ xfs_inactive_truncate( /* * Log the inode size first to prevent stale data exposure in the event * of a system crash before the truncate completes. See the related - * comment in xfs_setattr_size() for details. + * comment in xfs_vn_setattr_size() for details. */ ip->i_d.di_size = 0; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 9a7c87809d3b..e5fae04298f6 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -714,7 +714,7 @@ xfs_ioc_space( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = bf->l_start; - error = xfs_setattr_size(ip, &iattr); + error = xfs_vn_setattr_size(file_dentry(filp), &iattr); break; default: ASSERT(0); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ab820f84ed50..f5db392e7d1e 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -542,6 +542,30 @@ xfs_setattr_time( inode->i_mtime = iattr->ia_mtime; } +static int +xfs_vn_change_ok( + struct dentry *dentry, + struct iattr *iattr) +{ + struct inode *inode = d_inode(dentry); + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + + if (mp->m_flags & XFS_MOUNT_RDONLY) + return -EROFS; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + return inode_change_ok(inode, iattr); +} + +/* + * Set non-size attributes of an inode. + * + * Caution: The caller of this function is responsible for calling + * inode_change_ok() or otherwise verifying the change is fine. + */ int xfs_setattr_nonsize( struct xfs_inode *ip, @@ -558,21 +582,6 @@ xfs_setattr_nonsize( struct xfs_dquot *udqp = NULL, *gdqp = NULL; struct xfs_dquot *olddquot1 = NULL, *olddquot2 = NULL; - trace_xfs_setattr(ip); - - /* If acls are being inherited, we already have this checked */ - if (!(flags & XFS_ATTR_NOACL)) { - if (mp->m_flags & XFS_MOUNT_RDONLY) - return -EROFS; - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - error = inode_change_ok(inode, iattr); - if (error) - return error; - } - ASSERT((mask & ATTR_SIZE) == 0); /* @@ -743,8 +752,27 @@ out_dqrele: return error; } +int +xfs_vn_setattr_nonsize( + struct dentry *dentry, + struct iattr *iattr) +{ + struct xfs_inode *ip = XFS_I(d_inode(dentry)); + int error; + + trace_xfs_setattr(ip); + + error = xfs_vn_change_ok(dentry, iattr); + if (error) + return error; + return xfs_setattr_nonsize(ip, iattr, 0); +} + /* * Truncate file. Must have write permission and not be a directory. + * + * Caution: The caller of this function is responsible for calling + * inode_change_ok() or otherwise verifying the change is fine. */ int xfs_setattr_size( @@ -759,18 +787,6 @@ xfs_setattr_size( uint lock_flags = 0; bool did_zeroing = false; - trace_xfs_setattr(ip); - - if (mp->m_flags & XFS_MOUNT_RDONLY) - return -EROFS; - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - error = inode_change_ok(inode, iattr); - if (error) - return error; - ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_MMAPLOCK_EXCL)); ASSERT(S_ISREG(inode->i_mode)); @@ -942,16 +958,32 @@ out_trans_cancel: goto out_unlock; } +int +xfs_vn_setattr_size( + struct dentry *dentry, + struct iattr *iattr) +{ + struct xfs_inode *ip = XFS_I(d_inode(dentry)); + int error; + + trace_xfs_setattr(ip); + + error = xfs_vn_change_ok(dentry, iattr); + if (error) + return error; + return xfs_setattr_size(ip, iattr); +} + STATIC int xfs_vn_setattr( struct dentry *dentry, struct iattr *iattr) { - struct xfs_inode *ip = XFS_I(d_inode(dentry)); int error; if (iattr->ia_valid & ATTR_SIZE) { - uint iolock = XFS_IOLOCK_EXCL; + struct xfs_inode *ip = XFS_I(d_inode(dentry)); + uint iolock = XFS_IOLOCK_EXCL; xfs_ilock(ip, iolock); error = xfs_break_layouts(d_inode(dentry), &iolock, true); @@ -959,11 +991,11 @@ xfs_vn_setattr( xfs_ilock(ip, XFS_MMAPLOCK_EXCL); iolock |= XFS_MMAPLOCK_EXCL; - error = xfs_setattr_size(ip, iattr); + error = xfs_vn_setattr_size(dentry, iattr); } xfs_iunlock(ip, iolock); } else { - error = xfs_setattr_nonsize(ip, iattr, 0); + error = xfs_vn_setattr_nonsize(dentry, iattr); } return error; diff --git a/fs/xfs/xfs_iops.h b/fs/xfs/xfs_iops.h index a0f84abb0d09..0259a383721a 100644 --- a/fs/xfs/xfs_iops.h +++ b/fs/xfs/xfs_iops.h @@ -33,6 +33,7 @@ extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size); extern void xfs_setattr_time(struct xfs_inode *ip, struct iattr *iattr); extern int xfs_setattr_nonsize(struct xfs_inode *ip, struct iattr *vap, int flags); -extern int xfs_setattr_size(struct xfs_inode *ip, struct iattr *vap); +extern int xfs_vn_setattr_nonsize(struct dentry *dentry, struct iattr *vap); +extern int xfs_vn_setattr_size(struct dentry *dentry, struct iattr *vap); #endif /* __XFS_IOPS_H__ */ -- 2.6.6 From jack@suse.cz Wed Aug 3 06:28:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B2D87CA2 for ; Wed, 3 Aug 2016 06:28:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3E59C304032 for ; Wed, 3 Aug 2016 04:28:19 -0700 (PDT) X-ASG-Debug-ID: 1470223696-0bf8157e6b3fa760001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ZupCb7LWGQKdck8M (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 04:28:17 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 62558ABC9; Wed, 3 Aug 2016 11:28:15 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id D6F841E0F22; Wed, 3 Aug 2016 13:28:14 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner , Ilya Dryomov , "Yan, Zheng" , ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 0/5 v2] fs: Avoid premature clearing of file capabilities Date: Wed, 3 Aug 2016 13:28:04 +0200 X-ASG-Orig-Subj: [PATCH 0/5 v2] fs: Avoid premature clearing of file capabilities Message-Id: <1470223689-17783-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470223697 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 764 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello, this patch series is my attempt to fix an issue when user can clear capabilites of arbitrary file he can look up for example by running chown on it (this got assigned CVE-2015-1350). The problem is that we call security_inode_killpriv() before checking permissions in inode_change_ok(). This patch set moves that call into inode_change_ok() after permissions are checked - the only trouble is that we need to give dentry instead of inode there and that is not completely trivial in some cases - I'm still missing a review from Ceph people to verify I didn't miss anything. Anyway, I guess the changes are fine for merging. Al, you please merge the patches? Thanks! Changes since v1: * Added acks for XFS and FUSE patches Honza From jack@suse.cz Wed Aug 3 06:28:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A5D327CA4 for ; Wed, 3 Aug 2016 06:28:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 76C3C304048 for ; Wed, 3 Aug 2016 04:28:19 -0700 (PDT) X-ASG-Debug-ID: 1470223695-0bf57b369d374f70001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id iep2GiNaNC24nrA2 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 04:28:16 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 76B54AC7A; Wed, 3 Aug 2016 11:28:15 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id DBEE81E0F23; Wed, 3 Aug 2016 13:28:14 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner , Ilya Dryomov , "Yan, Zheng" , ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 2/5] ceph: Propagate dentry down to inode_change_ok() Date: Wed, 3 Aug 2016 13:28:06 +0200 X-ASG-Orig-Subj: [PATCH 2/5] ceph: Propagate dentry down to inode_change_ok() Message-Id: <1470223689-17783-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1470223689-17783-1-git-send-email-jack@suse.cz> References: <1470223689-17783-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470223696 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2003 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. ceph_setattr() has the dentry easily available but __ceph_setattr() is also called from ceph_set_acl() where dentry is not easily available. Luckily that call path does not need inode_change_ok() to be called anyway. So reorganize functions a bit so that inode_change_ok() is called only from paths where dentry is available. Signed-off-by: Jan Kara --- fs/ceph/acl.c | 5 +++++ fs/ceph/inode.c | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c index 013151d50069..a2cedfde75eb 100644 --- a/fs/ceph/acl.c +++ b/fs/ceph/acl.c @@ -127,6 +127,11 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type) goto out_free; } + if (ceph_snap(inode) != CEPH_NOSNAP) { + ret = -EROFS; + goto out_free; + } + if (new_mode != old_mode) { newattrs.ia_mode = new_mode; newattrs.ia_valid = ATTR_MODE; diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index dd3a6dbf71eb..2aa3c0bcf3a5 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -1905,13 +1905,6 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr) int inode_dirty_flags = 0; bool lock_snap_rwsem = false; - if (ceph_snap(inode) != CEPH_NOSNAP) - return -EROFS; - - err = inode_change_ok(inode, attr); - if (err != 0) - return err; - prealloc_cf = ceph_alloc_cap_flush(); if (!prealloc_cf) return -ENOMEM; @@ -2124,7 +2117,17 @@ out_put: */ int ceph_setattr(struct dentry *dentry, struct iattr *attr) { - return __ceph_setattr(d_inode(dentry), attr); + struct inode *inode = d_inode(dentry); + int err; + + if (ceph_snap(inode) != CEPH_NOSNAP) + return -EROFS; + + err = inode_change_ok(inode, attr); + if (err != 0) + return err; + + return __ceph_setattr(inode, attr); } /* -- 2.6.6 From jack@suse.cz Wed Aug 3 06:28:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B614C7CAE for ; Wed, 3 Aug 2016 06:28:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 69C7D8F8033 for ; Wed, 3 Aug 2016 04:28:19 -0700 (PDT) X-ASG-Debug-ID: 1470223696-0bf8157e6a3fa760001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id kYDKvDrhuVikAdPQ (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 04:28:17 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 66AA8ABEC; Wed, 3 Aug 2016 11:28:15 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id DD8ED1E0F2A; Wed, 3 Aug 2016 13:28:14 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner , Ilya Dryomov , "Yan, Zheng" , ceph-devel@vger.kernel.org, Miklos Szeredi , Jan Kara Subject: [PATCH 3/5] fuse: Propagate dentry down to inode_change_ok() Date: Wed, 3 Aug 2016 13:28:07 +0200 X-ASG-Orig-Subj: [PATCH 3/5] fuse: Propagate dentry down to inode_change_ok() Message-Id: <1470223689-17783-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 2.6.6 In-Reply-To: <1470223689-17783-1-git-send-email-jack@suse.cz> References: <1470223689-17783-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470223697 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2511 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. Propagate it down to fuse_do_setattr(). Acked-by: Miklos Szeredi Signed-off-by: Jan Kara --- fs/fuse/dir.c | 7 ++++--- fs/fuse/file.c | 2 +- fs/fuse/fuse_i.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 5f1627725791..f29ce9cb30e6 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1591,9 +1591,10 @@ int fuse_flush_times(struct inode *inode, struct fuse_file *ff) * vmtruncate() doesn't allow for this case, so do the rlimit checking * and the actual truncation by hand. */ -int fuse_do_setattr(struct inode *inode, struct iattr *attr, +int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, struct file *file) { + struct inode *inode = d_inode(dentry); struct fuse_conn *fc = get_fuse_conn(inode); struct fuse_inode *fi = get_fuse_inode(inode); FUSE_ARGS(args); @@ -1707,9 +1708,9 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr) return -EACCES; if (attr->ia_valid & ATTR_FILE) - return fuse_do_setattr(inode, attr, attr->ia_file); + return fuse_do_setattr(entry, attr, attr->ia_file); else - return fuse_do_setattr(inode, attr, NULL); + return fuse_do_setattr(entry, attr, NULL); } static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry, diff --git a/fs/fuse/file.c b/fs/fuse/file.c index f394aff59c36..4b9201b7c80b 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -2841,7 +2841,7 @@ static void fuse_do_truncate(struct file *file) attr.ia_file = file; attr.ia_valid |= ATTR_FILE; - fuse_do_setattr(inode, &attr, file); + fuse_do_setattr(file_dentry(file), &attr, file); } static inline loff_t fuse_round_up(loff_t off) diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 5db5d24f91a5..c6a3bef34fd3 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -958,7 +958,7 @@ bool fuse_write_update_size(struct inode *inode, loff_t pos); int fuse_flush_times(struct inode *inode, struct fuse_file *ff); int fuse_write_inode(struct inode *inode, struct writeback_control *wbc); -int fuse_do_setattr(struct inode *inode, struct iattr *attr, +int fuse_do_setattr(struct dentry *dentry, struct iattr *attr, struct file *file); void fuse_set_initialized(struct fuse_conn *fc); -- 2.6.6 From david@fromorbit.com Wed Aug 3 07:09:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 02BBA7CA2 for ; Wed, 3 Aug 2016 07:09:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8733304032 for ; Wed, 3 Aug 2016 05:09:24 -0700 (PDT) X-ASG-Debug-ID: 1470226160-0bf57b369c3764a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id aI22IHymZl39hySl for ; Wed, 03 Aug 2016 05:09:21 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: An8VAADeoVd5LI7JIGdsb2JhbABcg0VWfIJ5oTMGjGCGDYQMIIV3BIFPTQEBAQEBAQcBAQEBAQE4QEEQAYQ6LzskNAUlAwctiDAPnz+fOw4ehUSEEoUmAQGCZAuDBwWTcYVDhhiIXYF1jVMChmSJQ4IVDAGCPioyglCERw8XBIEbAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail04.adl6.internode.on.net with ESMTP; 03 Aug 2016 21:39:03 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bUuyr-0008Ut-Gl for xfs@oss.sgi.com; Wed, 03 Aug 2016 22:09:01 +1000 Date: Wed, 3 Aug 2016 22:09:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfs: for-next branch updated to 3481b68 Message-ID: <20160803120901.GT16044@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 3481b68 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="RIYY1s2vRbPFwWeW" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470226160 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9618 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --RIYY1s2vRbPFwWeW Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. I've just pushed the initial reverse block mapping support code from Darrick out to the for-next branch. The code as it stands will work for most cases, but it is still definitely considered experimental - don't put any data you want to keep on rmap enable filesystems at this point. It passes all of xfstests and other local testing without regressions for non-rmap filesystems, so existing filesystems should be unaffected by this merge. Known problems when rmapbt is enabled are: - On disk format needs a minor tweak to keep a persistent count of allocated rmapbt blocks. This is required for sensible mount time behaviour of the upcoming AG reservation code, and will be merged as soon as the patch Darrick posted earlier this evening is reviewed and tested. - hangs/corrupts/assert fails at ENOSPC because of insufficient free block reservations. I can reproduce this with generic/274, it will be solved by the AG reservation code that currently sits in the reflink patchset. - assert fails on generic/299. This is another ENOSPC test, but we haven't got to the bottom of this failure yet. There are still some pending code cleanups as a result of review; these don't affect operation or the on-disk format, so they will be merged when they are done and tested. I expect we'll end up doing a -rc2 or -rc3 update with the bug fixes and tweaks we accumulate over the next week or two. The plan now is to leave this in for-next for the next two days. If no showstoppers are reported, I will send Linus a pull request for this code, and hopefully he'll merge it. Ultimately merging will be his call because we are /very/ late in the cycle with this. It would be a good idea for anyone who has a spare cycle or two to build rmap enabled filesysetms and smoke test them through xfstests on their test machines in the next couple of days. Darrick's latest userspace tree is at https://github.com/djwong/xfsprogs.git, and IIRC I've been using the "djwong-devel" branch for testing. Darrick can clarify which is best to use at this point. If anyone has any questions or problems then send mail to the list or grab djwong or myself on the #xfs channel on freenode. -Dave. The new head of the for-next branch is commit: 3481b68 xfs: move (and rename) the deferred bmap-free tracepoints New Commits: Darrick J. Wong (52): [0facef7] xfs: in _attrlist_by_handle, copy the cursor back to usersp= ace [3dadf90] xfs: fix attr shortform structure alignment on cris [f4a0660] xfs: fix locking of the rt bitmap/summary inodes [0d30979] xfs: set *stat=3D1 after iroot realloc [e5821e5] xfs: during btree split, save new block key & ptr for futur= e insertion [70b2265] xfs: add function pointers for get/update keys to the btree [2c813ad] xfs: support btrees with overlapping intervals for keys [105f7d8] xfs: introduce interval queries on btrees [28a8956] xfs: refactor btree owner change into a separate visit-bloc= ks function [4e0cc29] xfs: move deferred operations into a separate file [3cd48ab] xfs: add tracepoints for the deferred ops mechanism [bba61cb] xfs: clean up typedef usage in the EFI/EFD handling code [9749fee] xfs: enable the xfs_defer mechanism to process extents to f= ree [3ab78df] xfs: rework xfs_bmap_free callers to use xfs_defer_ops [310a75a] xfs: change xfs_bmap_{finish,cancel,init,free} -> xfs_defer= _* [2c3234d] xfs: rename flist/free_list to dfops [dc42375] xfs: refactor redo intent item processing [ba9e780] xfs: add tracepoints and error injection for deferred exten= t freeing [df3954f] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt [b870494] xfs: introduce rmap btree definitions [00f4e4f] xfs: add rmap btree stats infrastructure [8018026] xfs: rmap btree add more reserved blocks [340785c] xfs: add owner field to extent allocation and freeing [673930c] xfs: introduce rmap extent operation stubs [035e00a] xfs: define the on-disk rmap btree format [e70d829] xfs: add rmap btree growfs support [fa30f03] xfs: rmap btree transaction reservations [5254885] xfs: rmap btree requires more reserved free space [4b8ed67] xfs: add rmap btree operations [cfed56a] xfs: support overlapping intervals in the rmap btree [c543838] xfs: teach rmapbt to support interval queries [aa966d8] xfs: add tracepoints for the rmap functions [0a1b0b3] xfs: add an extent to the rmap btree [f922cd9] xfs: remove an extent from the rmap btree [fb7d926] xfs: convert unwritten status of reverse mappings [abf0923] xfs: add rmap btree insert and delete helpers [5880f2d7] xfs: create rmap update intent log items [9e88b5d] xfs: log rmap intent items [f8dbebe] xfs: enable the xfs_defer mechanism to process rmaps to upd= ate [9c19464] xfs: propagate bmap updates to rmapbt [5d650e9] xfs: add rmap btree geometry feature flag [a650e8f] xfs: add rmap btree block detection to log recovery [2b0eeb5] xfs: disable XFS_IOC_SWAPEXT when rmap btree is enabled [04f1306] xfs: don't update rmapbt when fixing agfl [1c0607a] xfs: enable the rmap btree functionality [973b831] xfs: remove the get*keys and update_keys btree ops pointers [1f704b2] xfs: remove unnecesary lshift/rshift key initialization [c1d22ae] xfs: in btree_lshift, only allocate temporary cursor when n= eeded [722e251] xfs: remove the extents array from the rmap update done log= item [e127faf] xfs: remove unnecessary parentheses from log redo item reco= very functions [51ce9d0] xfs: collapse single use static functions [3481b68] xfs: move (and rename) the deferred bmap-free tracepoints Code Diffstat: fs/xfs/Makefile | 5 + fs/xfs/libxfs/xfs_alloc.c | 149 ++++- fs/xfs/libxfs/xfs_alloc.h | 52 +- fs/xfs/libxfs/xfs_alloc_btree.c | 12 - fs/xfs/libxfs/xfs_attr.c | 71 +-- fs/xfs/libxfs/xfs_attr_leaf.c | 4 +- fs/xfs/libxfs/xfs_attr_remote.c | 19 +- fs/xfs/libxfs/xfs_bmap.c | 241 +++---- fs/xfs/libxfs/xfs_bmap.h | 54 +- fs/xfs/libxfs/xfs_bmap_btree.c | 32 +- fs/xfs/libxfs/xfs_btree.c | 914 ++++++++++++++++++++++----- fs/xfs/libxfs/xfs_btree.h | 88 ++- fs/xfs/libxfs/xfs_da_btree.c | 6 +- fs/xfs/libxfs/xfs_da_btree.h | 4 +- fs/xfs/libxfs/xfs_da_format.h | 1 + fs/xfs/libxfs/xfs_defer.c | 463 ++++++++++++++ fs/xfs/libxfs/xfs_defer.h | 97 +++ fs/xfs/libxfs/xfs_dir2.c | 15 +- fs/xfs/libxfs/xfs_dir2.h | 8 +- fs/xfs/libxfs/xfs_format.h | 131 +++- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/libxfs/xfs_ialloc.c | 23 +- fs/xfs/libxfs/xfs_ialloc.h | 2 +- fs/xfs/libxfs/xfs_ialloc_btree.c | 18 +- fs/xfs/libxfs/xfs_inode_buf.c | 1 + fs/xfs/libxfs/xfs_log_format.h | 63 +- fs/xfs/libxfs/xfs_rmap.c | 1399 ++++++++++++++++++++++++++++++++++= +++++++ fs/xfs/libxfs/xfs_rmap.h | 209 ++++++ fs/xfs/libxfs/xfs_rmap_btree.c | 511 +++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.h | 61 ++ fs/xfs/libxfs/xfs_sb.c | 9 + fs/xfs/libxfs/xfs_shared.h | 2 + fs/xfs/libxfs/xfs_trans_resv.c | 62 +- fs/xfs/libxfs/xfs_trans_resv.h | 10 - fs/xfs/libxfs/xfs_types.h | 4 +- fs/xfs/xfs_bmap_util.c | 139 +--- fs/xfs/xfs_bmap_util.h | 4 +- fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_dquot.c | 13 +- fs/xfs/xfs_error.h | 6 +- fs/xfs/xfs_extfree_item.c | 69 ++ fs/xfs/xfs_extfree_item.h | 3 + fs/xfs/xfs_filestream.c | 3 +- fs/xfs/xfs_fsops.c | 106 +++- fs/xfs/xfs_inode.c | 99 +-- fs/xfs/xfs_inode.h | 4 +- fs/xfs/xfs_ioctl.c | 6 + fs/xfs/xfs_iomap.c | 31 +- fs/xfs/xfs_log_recover.c | 336 +++++++--- fs/xfs/xfs_mount.c | 7 +- fs/xfs/xfs_mount.h | 6 + fs/xfs/xfs_ondisk.h | 3 + fs/xfs/xfs_rmap_item.c | 536 ++++++++++++++++ fs/xfs/xfs_rmap_item.h | 95 +++ fs/xfs/xfs_rtalloc.c | 11 +- fs/xfs/xfs_stats.c | 1 + fs/xfs/xfs_stats.h | 18 +- fs/xfs/xfs_super.c | 30 +- fs/xfs/xfs_symlink.c | 25 +- fs/xfs/xfs_trace.c | 2 + fs/xfs/xfs_trace.h | 374 +++++++++++ fs/xfs/xfs_trans.h | 26 +- fs/xfs/xfs_trans_extfree.c | 215 +++++-- fs/xfs/xfs_trans_rmap.c | 271 ++++++++ 64 files changed, 6267 insertions(+), 915 deletions(-) create mode 100644 fs/xfs/libxfs/xfs_defer.c create mode 100644 fs/xfs/libxfs/xfs_defer.h create mode 100644 fs/xfs/libxfs/xfs_rmap.c create mode 100644 fs/xfs/libxfs/xfs_rmap.h create mode 100644 fs/xfs/libxfs/xfs_rmap_btree.c create mode 100644 fs/xfs/libxfs/xfs_rmap_btree.h create mode 100644 fs/xfs/xfs_rmap_item.c create mode 100644 fs/xfs/xfs_rmap_item.h create mode 100644 fs/xfs/xfs_trans_rmap.c --=20 Dave Chinner david@fromorbit.com --RIYY1s2vRbPFwWeW Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXod7cAAoJEK3oKUf0dfodTtAP/iSJW64qIZ+P7uvSJ2Zj701F IZBUiawCEJYbAoZpnVa+8R7m/u9/fhX8IUbs1siGMm9MjtDaGOOT4Lcb90AW0WNi tdEXJPTggfnrvac2hqvKkRQf5BbRJNUT59Albfwf8W6FTNK3m289CFr2FVx1XxCL QWOdlVwd5sm0xjdu/aoPDLDGpl7IGN8Agz9b8KM2tyWTImDTzFW/AtJGEPsBK2U9 OTybKWhXwuVm6eW7jHt+nq6rGD69x/jJeVbajBWoiZrzOeJOVZBuL7q7RKiTO4M6 Gj2DLQZqzOmrP4DZt9dPKDgtN8o9LnvQHauBrzMaqHvBWlej6G411dpJQJgEp4tA qMFww3wiGQkJz3UxNEsY6RBmoIzejVt8/Rnkg5h6My+sKQn6l+Dh7H/rB0/8oqUt qo7g2doX2kn2u+DfqHaJyWXdJkEjcCPnDEkt4akQfWGqUQ+PGGF3gMS16g+mBSc7 QocwSqWOtRsZ2dVOkYDjay86H18HX4UmGpsc3aBh5lGIiyUT/U6QLU+9nYNz5wjb oPVNSelgesxBuYdJP+bCNkWfrliY+PyTopQJRLQtdQ32cQf8RkxzK6ljDB1yLEy9 8pvaR+wmuO+xk8W+TLz+kHuoQ6dv/JqPf22nUkLASU6m0fjJeCvx2vlhT8LCZjm8 NZ20HkTyfxWgmKrtYLZg =Kq2M -----END PGP SIGNATURE----- --RIYY1s2vRbPFwWeW-- From robin.listas@telefonica.net Wed Aug 3 07:59:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DC7297CA2 for ; Wed, 3 Aug 2016 07:59:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F1DAAC002 for ; Wed, 3 Aug 2016 05:59:15 -0700 (PDT) X-ASG-Debug-ID: 1470229152-0bf57c136a31bf00001-NocioJ Received: from smtp.movistar.es (smtp08.acens.net [86.109.99.132]) by cuda.sgi.com with ESMTP id cFAqboweTMCQSVsa for ; Wed, 03 Aug 2016 05:59:13 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@telefonica.net X-Barracuda-Effective-Source-IP: smtp08.acens.net[86.109.99.132] X-Barracuda-Apparent-Source-IP: 86.109.99.132 X-Junkmail-Premium-Raw: score=7/90,refid=2.7.2:2016.8.3.70017:17:7.944,ip=,rules=__HAS_FROM, __TO_MALFORMED_2, __TO_NAME, __TO_NAME_DIFF_FROM_ACC, __IN_REP_TO, __HAS_MSGID, __SANE_MSGID, __REFERENCES, __USER_AGENT, __MIME_VERSION, __CT, __CT_TEXT_PLAIN, __STOCK_PHRASE_7, __LINES_OF_YELLING, __FORWARDED_MSG, BODY_SIZE_1500_1599, BODYTEXTP_SIZE_3000_LESS, __MIME_TEXT_ONLY, HTML_00_01, HTML_00_10, BODY_SIZE_5000_LESS, NO_URI_FOUND, NO_CTA_URI_FOUND, BODY_SIZE_2000_LESS, IN_REP_TO, REFERENCES, BODY_SIZE_7000_LESS, NO_URI_HTTPS, MSG_THREAD, __TO_REAL_NAMES, LEGITIMATE_SIGNS, LEGITIMATE_NEGATE Received: from Telcontar.valinor (81.36.154.234) by smtp.movistar.es (8.6.122.03) (authenticated as robin.listas2) id 579B6AD4003A89FB for xfs@oss.sgi.com; Wed, 3 Aug 2016 12:59:12 +0000 Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id EF83B120AE1 for ; Wed, 3 Aug 2016 14:59:11 +0200 (CEST) X-Virus-Scanned: amavisd-new at valinor Received: from Telcontar.valinor ([127.0.0.1]) by localhost (Telcontar.valinor [127.0.0.1]) (amavisd-new, port 10024) with LMTP id dIwTNlf__ptu for ; Wed, 3 Aug 2016 14:59:11 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id C97DF120AE0 for ; Wed, 3 Aug 2016 14:59:11 +0200 (CEST) Date: Wed, 3 Aug 2016 14:59:11 +0200 (CEST) From: "Carlos E. R." Sender: cerobinson@telefonica.net To: XFS mailing list Subject: Spam on this list [Was: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug] In-Reply-To: <57CF7681619F42CCB4C0CF589E9686E5@dinulap> X-ASG-Orig-Subj: Spam on this list [Was: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug] Message-ID: References: <4278AB9734C1445A8E48635B155149F8@dinulap> <20160729233524.GD16044@dastard> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed X-Barracuda-Connect: smtp08.acens.net[86.109.99.132] X-Barracuda-Start-Time: 1470229153 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1557 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Monday, 2016-08-01 at 15:00 +0300, Lista Unx wrote: > Yes, I've created a new gmail account especially to be able to post to this > mailing list which is filtering very seriously legit messages comming from > legit usres, just because they are comming from yahoo accounts (servers) ... > but is allowing ANYONE else to post here WITHOUT having valid subscription and > also WITHOUT any minimal intention to post here something which has or is > related to XFS. Just in last days, I was informed about new microwave > acquisition, plastic delivery, or any other craps arriving here from a > "trusted and very legit" source, like gmail. That's sound like really a very > good job! :-) Yes, Spam is bad in this list, and has increased recently. You will find, however, that gmail does a good job of filtering them out: you only have to mark as spam those that it does not detect, and conversely, clear out the false positives. It learns soon. I also have problems with my ISP and Spam on this list. You will find that the people on this list are very knowledgeable and will try to help you on your problem with XFS. Spam is not a thing on their power, though X'-) - -- Cheers, Carlos E. R. (from 13.1 x86_64 "Bottle" at Telcontar) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAleh6p8ACgkQtTMYHG2NR9VwbACfQ48V7GoSWDjxkscKMZZBGbeW qf8An0XDo7JRY1wOjQlVAqyE3Of/t6DG =n207 -----END PGP SIGNATURE----- From martin@lichtvoll.de Wed Aug 3 08:21:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E6DF97CA2 for ; Wed, 3 Aug 2016 08:21:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 748D0AC001 for ; Wed, 3 Aug 2016 06:21:32 -0700 (PDT) X-ASG-Debug-ID: 1470230489-0bf8157e6a3feca0001-NocioJ Received: from mail.lichtvoll.de (mondschein.lichtvoll.de [194.150.191.11]) by cuda.sgi.com with ESMTP id hOxYBjfcrqyXlfFD for ; Wed, 03 Aug 2016 06:21:30 -0700 (PDT) X-Barracuda-Envelope-From: martin@lichtvoll.de X-Barracuda-Effective-Source-IP: mondschein.lichtvoll.de[194.150.191.11] X-Barracuda-Apparent-Source-IP: 194.150.191.11 Received: by mail.lichtvoll.de (Postfix, from userid 120) id F373F7F7; Wed, 3 Aug 2016 15:21:28 +0200 (CEST) Received: from merkaba.localnet (ppp-93-104-46-63.dynamic.mnet-online.de [93.104.46.63]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.lichtvoll.de (Postfix) with ESMTPSA id F09684A9; Wed, 3 Aug 2016 15:21:26 +0200 (CEST) From: Martin Steigerwald To: xfs@oss.sgi.com Cc: "Carlos E. R." , Lista Unx Subject: Re: Spam on this list [Was: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug] Date: Wed, 03 Aug 2016 15:21:26 +0200 X-ASG-Orig-Subj: Re: Spam on this list [Was: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug] Message-ID: <4382687.Pe7d1tBhVA@merkaba> User-Agent: KMail/5.2.3 (Linux/4.7.0-tp520-btrfstrim+; KDE/5.23.0; x86_64; ; ) In-Reply-To: References: <4278AB9734C1445A8E48635B155149F8@dinulap> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" X-Barracuda-Connect: mondschein.lichtvoll.de[194.150.191.11] X-Barracuda-Start-Time: 1470230489 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1699 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Am Mittwoch, 3. August 2016, 14:59:11 CEST schrieb Carlos E. R.: > On Monday, 2016-08-01 at 15:00 +0300, Lista Unx wrote: > > Yes, I've created a new gmail account especially to be able to post to > > this > > mailing list which is filtering very seriously legit messages comming f= rom > > legit usres, just because they are comming from yahoo accounts (servers) > > ... but is allowing ANYONE else to post here WITHOUT having valid > > subscription and also WITHOUT any minimal intention to post here > > something which has or is related to XFS. Just in last days, I was > > informed about new microwave acquisition, plastic delivery, or any other > > craps arriving here from a "trusted and very legit" source, like gmail. > > That's sound like really a very good job! > : > :-) >=20 > Yes, Spam is bad in this list, and has increased recently. You will > find, however, that gmail does a good job of filtering them out: you > only have to mark as spam those that it does not detect, and conversely, > clear out the false positives. It learns soon. >=20 > I also have problems with my ISP and Spam on this list. >=20 >=20 > You will find that the people on this list are very knowledgeable and > will try to help you on your problem with XFS. Spam is not a thing on > their power, though X'-) Lista, Carlos, I recommend: If you are concerned about spam on the list=20 contact the listmasters of it. They are the ones that can address it global= ly=20 for the list. Or=E2=80=A6 improve your spamfilters. I did not see any of the spam mails y= ou=20 mentioned, Lista, as my mailserver rejected them on the SMTP level. Discussing spam topics here just adds to the noise. =2D-=20 Martin From robin.listas@telefonica.net Wed Aug 3 08:35:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6C27D7CA2 for ; Wed, 3 Aug 2016 08:35:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C2D14AC002 for ; Wed, 3 Aug 2016 06:35:02 -0700 (PDT) X-ASG-Debug-ID: 1470231299-0bf57c136731ce30001-NocioJ Received: from smtp.movistar.es (smtp22.acens.net [86.109.99.146]) by cuda.sgi.com with ESMTP id iApltG6FcAih8RH2 for ; Wed, 03 Aug 2016 06:34:59 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@telefonica.net X-Barracuda-Effective-Source-IP: smtp22.acens.net[86.109.99.146] X-Barracuda-Apparent-Source-IP: 86.109.99.146 X-Junkmail-Premium-Raw: score=7/50,refid=2.7.2:2016.8.3.73917:17:7.944,ip=,rules=__BOUNCE_CHALLENGE_SUBJ, __BOUNCE_NDR_SUBJ_EXEMPT, __TO_MALFORMED_2, __TO_NAME, __TO_NAME_DIFF_FROM_ACC, __REFERENCES, __HAS_FROM, __HAS_MSGID, __SANE_MSGID, __USER_AGENT, __MOZILLA_USER_AGENT, __MIME_VERSION, __IN_REP_TO, __CT, __CTYPE_HAS_BOUNDARY, __CTYPE_MULTIPART, __HAS_ATTACHMENT1, __STOCK_PHRASE_7, __SUBJ_ALPHA_NEGATE, __ATTACHMENT_SIZE_0_10K, __HAS_ATTACHMENT2, BODYTEXTP_SIZE_3000_LESS, BODY_SIZE_1200_1299, HTML_00_01, HTML_00_10, BODY_SIZE_5000_LESS, __HAS_ATTACHMENT, NO_URI_FOUND, NO_CTA_URI_FOUND, BODY_SIZE_2000_LESS, IN_REP_TO, REFERENCES, BODY_SIZE_7000_LESS, NO_URI_HTTPS, MSG_THREAD, __TO_REAL_NAMES, LEGITIMATE_SIGNS, LEGITIMATE_NEGATE Received: from Telcontar.valinor (81.36.154.234) by smtp.movistar.es (8.6.122.03) (authenticated as robin.listas2) id 5784FE4601359FEF for xfs@oss.sgi.com; Wed, 3 Aug 2016 13:34:57 +0000 Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 58EF0120AE1 for ; Wed, 3 Aug 2016 15:34:58 +0200 (CEST) X-Virus-Scanned: amavisd-new at valinor Received: from Telcontar.valinor ([127.0.0.1]) by localhost (Telcontar.valinor [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 7vvsR_TJILYi for ; Wed, 3 Aug 2016 15:34:58 +0200 (CEST) Received: from [127.0.0.1] (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 3EE5D120AE0 for ; Wed, 3 Aug 2016 15:34:58 +0200 (CEST) Subject: Re: Spam on this list [Was: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug] To: XFS mail list X-ASG-Orig-Subj: Re: Spam on this list [Was: Re: partition 100% full No space left on device. looks like xfs iscorrupted or a bug] References: <4278AB9734C1445A8E48635B155149F8@dinulap> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> <4382687.Pe7d1tBhVA@merkaba> From: "Carlos E. R." Message-ID: <9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net> Date: Wed, 3 Aug 2016 15:34:58 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2 MIME-Version: 1.0 In-Reply-To: <4382687.Pe7d1tBhVA@merkaba> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="t6A56OvM2XWCL75K7SIuiEqVVfA7OUglR" X-Barracuda-Connect: smtp22.acens.net[86.109.99.146] X-Barracuda-Start-Time: 1470231299 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 678 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --t6A56OvM2XWCL75K7SIuiEqVVfA7OUglR Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 2016-08-03 15:21, Martin Steigerwald wrote: > Lista, Carlos, I recommend: If you are concerned about spam on the list= =20 > contact the listmasters of it. They are the ones that can address it gl= obally=20 > for the list. Oh, I did, long ago. Still waiting. > Or=E2=80=A6 improve your spamfilters. I did not see any of the spam mai= ls you=20 > mentioned, Lista, as my mailserver rejected them on the SMTP level. So does mine. Now and then it rejects spam, and the list automatically stops my subscription as a consequence. --=20 Cheers / Saludos, Carlos E. R. (from 13.1 x86_64 "Bottle" at Telcontar) --t6A56OvM2XWCL75K7SIuiEqVVfA7OUglR Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAleh8wIACgkQtTMYHG2NR9UTggCeOFGzd6J7n+eeRmQxYCyX2f8H APkAn0HKti1d4hRHZRYsuV+Cxqqk+kBN =fr0Y -----END PGP SIGNATURE----- --t6A56OvM2XWCL75K7SIuiEqVVfA7OUglR-- From bfoster@redhat.com Wed Aug 3 09:45:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 821EE7CA1 for ; Wed, 3 Aug 2016 09:45:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 51821304048 for ; Wed, 3 Aug 2016 07:44:59 -0700 (PDT) X-ASG-Debug-ID: 1470235497-0bf57b369e37d4e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rQDdqimlWdsA4SSJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 07:44:57 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E1ED9C057FAA; Wed, 3 Aug 2016 14:44:56 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-64.bos.redhat.com [10.18.41.64]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u73EiuSg032469; Wed, 3 Aug 2016 10:44:56 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 69BBA1223ED; Wed, 3 Aug 2016 10:44:55 -0400 (EDT) Date: Wed, 3 Aug 2016 10:44:55 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [current tot] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 Message-ID: <20160803144454.GA17518@bfoster.bfoster> X-ASG-Orig-Subj: Re: [current tot] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 References: <20160803061430.GS16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803061430.GS16044@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 03 Aug 2016 14:44:56 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470235497 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10402 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 03, 2016 at 04:14:30PM +1000, Dave Chinner wrote: > Hi Brian, > > It seems I can hit this fairly often on a single CPU, 1GB ram VM > in generic/306: > I ended up reproducing on a similarly configured vm via xfs/305 (generic/306 appears unrelated to quota..?). > [12279.804308] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 > [12279.806499] ------------[ cut here ]------------ > [12279.807560] kernel BUG at fs/xfs/xfs_message.c:113! > [12279.808717] invalid opcode: 0000 [#1] PREEMPT SMP > [12279.809790] Modules linked in: > [12279.810526] CPU: 0 PID: 8181 Comm: xfs_quota Tainted: G W 4.7.0-dgc+ #864 > [12279.812362] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Debian-1.8.2-1 04/01/2014 > [12279.814372] task: ffff880028ae0000 task.stack: ffff88000ec98000 > [12279.815707] RIP: 0010:[] [] assfail+0x22/0x30 > [12279.817477] RSP: 0018:ffff88000ec9bc28 EFLAGS: 00010282 > [12279.818689] RAX: 00000000ffffffea RBX: ffff880008b51930 RCX: 0000000000000021 > [12279.820318] RDX: ffff88000ec9bb50 RSI: 000000000000000a RDI: ffffffff823b0e6c > [12279.822036] RBP: ffff88000ec9bc28 R08: 0000000000000000 R09: 0000000000000000 > [12279.823643] R10: 000000000000000a R11: f000000000000000 R12: ffff880008b518c0 > [12279.825277] R13: ffff88003d51c6e0 R14: ffff88003d51c600 R15: 0000000000000000 > [12279.826892] FS: 00007f67553c8700(0000) GS:ffff88003fc00000(0000) knlGS:0000000000000000 > [12279.828734] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > [12279.830013] CR2: 00007f6207369008 CR3: 000000001445f000 CR4: 00000000000006f0 > [12279.831621] Stack: > [12279.832074] ffff88000ec9bc60 ffffffff8150f498 ffff880039c37920 ffff880034681200 > [12279.833823] ffff88003d439000 ffff880039c37a98 ffff880039c37ad8 ffff88000ec9bca8 > [12279.835528] ffffffff8154d705 ffff880008b518c0 ffff880008b518c0 0000000000000000 > [12279.837257] Call Trace: > [12279.837834] [] xfs_buf_rele+0x2b8/0x3b0 > [12279.839078] [] xfs_qm_dqpurge+0x1d5/0x220 > [12279.840367] [] ? xfs_qm_shrink_count+0x20/0x20 > [12279.841765] [] xfs_qm_dquot_walk+0x100/0x170 > [12279.843122] [] xfs_qm_dqpurge_all+0x52/0x70 > [12279.844458] [] xfs_qm_scall_quotaoff+0x129/0x3f0 > [12279.845887] [] xfs_quota_disable+0x3d/0x50 > [12279.847197] [] SyS_quotactl+0x3c2/0x870 > [12279.848435] [] ? SYSC_newstat+0x2f/0x40 > [12279.849703] [] entry_SYSCALL_64_fastpath+0x1a/0xa4 > [12279.851157] Code: 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 f1 41 89 d0 48 c7 c6 a8 03 40 82 48 89 e5 48 89 fa 31 c0 31 ff e8 4e fa ff ff <0f> 0b 66 90 66 > [12279.856516] RIP [] assfail+0x22/0x30 > [12279.857739] RSP > [12279.859248] ---[ end trace 496ea0918ba4a5b4 ]--- > > > I've seen it once also from inode reclaim, and AFAICT, the reason is the > same both times: they call xfs_bwrite(). It looks to me like we get > an XBF_INFLIGHT buffer, the reclaim code then tries to flush another > object on the buffer, takes a reference to it and so prevents the > XBF_INFLIGHT IO accounting from being decremented when the IO > completes and releases. It then flushes the object to the buffer and > calls xfs_bwrite() which clears XBF_ASYNC and it writes the buffer > again. Once this completes, it calls xfs_buf_rele(), which drops the > last reference and we try to release the XBF_INFLIGHT accounting. > That then assert fails because XBF_ASYNC is not set. > Yeah, I collected some buffer tracepoints from a reproducer run (a few custom ioacct tps added): xfsaild/dm-3-13580 [000] 3231.470825: xfs_buf_trylock: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES caller 0xffffffffc0575c6bs xfsaild/dm-3-13580 [000] 3231.470826: xfs_buf_find: dev 253:3 bno 0x50 len 0x1000 hold 2 pincount 0 lock 0 flags READ caller 0xffffffffc05760eas xfsaild/dm-3-13580 [000] 3231.470826: xfs_buf_get: dev 253:3 bno 0x50 len 0x1000 hold 2 pincount 0 lock 0 flags READ caller 0xffffffffc057709ds xfsaild/dm-3-13580 [000] 3231.470826: xfs_buf_read: dev 253:3 bno 0x50 len 0x1000 hold 2 pincount 0 lock 0 flags READ caller 0xffffffffc05ab822s xfsaild/dm-3-13580 [000] 3231.470827: xfs_buf_delwri_queue: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES caller 0xffffffffc05af52as xfsaild/dm-3-13580 [000] 3231.470827: xfs_buf_unlock: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 1 flags ASYNC|DONE|PAGES|DELWRI_Q caller 0xffffffffc05af53ds xfsaild/dm-3-13580 [000] 3231.470828: xfs_buf_rele: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 1 flags ASYNC|DONE|PAGES|DELWRI_Q caller 0xffffffffc05af545s xfsaild/dm-3-13580 [000] 3231.471477: xfs_buf_trylock: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES|DELWRI_Q caller 0xffffffffc0576de2s xfsaild/dm-3-13580 [000] 3231.471477: xfs_buf_delwri_split: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES|DELWRI_Q caller 0xffffffffc0577d50s xfsaild/dm-3-13580 [000] 3231.471478: xfs_buf_submit: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller 0xffffffffc0576ccfs xfsaild/dm-3-13580 [000] 3231.471478: xfs_buf_hold: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller 0xffffffffc05769ccs xfsaild/dm-3-13580 [000] 3231.471478: xfs_buf_ioacct_inc: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES caller 0xffffffffc0576ccfs xfsaild/dm-3-13580 [000] 3231.471483: xfs_buf_rele: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES|IN_FLIGHT caller 0xffffffffc05769fds xfs_quota-13687 [000] 3231.478357: xfs_buf_trylock_fail: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES|IN_FLIGHT caller 0xffffffffc0575c6bs xfs_quota-13687 [000] 3231.478358: xfs_buf_lock: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES|IN_FLIGHT caller 0xffffffffc0575c84s kworker/0:1-9420 [000] 3231.637774: xfs_buf_iodone: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags WRITE|ASYNC|DONE|PAGES|IN_FLIGHT caller 0xffffffffc05764b5s kworker/0:1-9420 [000] 3231.637775: xfs_buf_iodone: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags ASYNC|DONE|PAGES|IN_FLIGHT caller 0xffffffffc05a01aas kworker/0:1-9420 [000] 3231.637779: xfs_buf_unlock: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags ASYNC|DONE|PAGES|IN_FLIGHT caller 0xffffffffc05a01aas kworker/0:1-9420 [000] 3231.637779: xfs_buf_rele: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags ASYNC|DONE|PAGES|IN_FLIGHT caller 0xffffffffc0576455s xfs_quota-13687 [000] 3231.637827: xfs_buf_lock_done: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags ASYNC|DONE|PAGES|IN_FLIGHT caller 0xffffffffc0575c84s xfs_quota-13687 [000] 3231.637828: xfs_buf_find: dev 253:3 bno 0x50 len 0x1000 hold 2 pincount 0 lock 0 flags READ caller 0xffffffffc05760eas xfs_quota-13687 [000] 3231.637828: xfs_buf_get: dev 253:3 bno 0x50 len 0x1000 hold 2 pincount 0 lock 0 flags READ caller 0xffffffffc057709ds xfs_quota-13687 [000] 3231.637829: xfs_buf_read: dev 253:3 bno 0x50 len 0x1000 hold 2 pincount 0 lock 0 flags READ caller 0xffffffffc05ab822s xfs_quota-13687 [000] 3231.637832: xfs_buf_submit_wait: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags WRITE|PAGES|IN_FLIGHT caller 0xffffffffc05773d6s xfs_quota-13687 [000] 3231.637833: xfs_buf_hold: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 0 flags WRITE|PAGES|IN_FLIGHT caller 0xffffffffc0576e6cs xfs_quota-13687 [000] 3231.637850: xfs_buf_iowait: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags WRITE|PAGES|IN_FLIGHT caller 0xffffffffc05773d6s kworker/0:1-9420 [000] 3232.565081: xfs_buf_iodone: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags WRITE|PAGES|IN_FLIGHT caller 0xffffffffc05764b5s kworker/0:1-9420 [000] 3232.565082: xfs_buf_iodone: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags DONE|PAGES|IN_FLIGHT caller 0xffffffffc05a01aas xfs_quota-13687 [000] 3232.565092: xfs_buf_iowait_done: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags DONE|PAGES|IN_FLIGHT caller 0xffffffffc05773d6s xfs_quota-13687 [000] 3232.565093: xfs_buf_rele: dev 253:3 bno 0x50 nblks 0x8 hold 3 pincount 0 lock 0 flags DONE|PAGES|IN_FLIGHT caller 0xffffffffc0576eb8s xfs_quota-13687 [000] 3232.565094: xfs_buf_unlock: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 1 flags DONE|PAGES|IN_FLIGHT caller 0xffffffffc05b27f2s xfs_quota-13687 [000] 3232.565094: xfs_buf_rele: dev 253:3 bno 0x50 nblks 0x8 hold 2 pincount 0 lock 1 flags DONE|PAGES|IN_FLIGHT caller 0xffffffffc05b27fes xfs_quota-13687 [000] 3232.565094: xfs_buf_ioacct_dec: dev 253:3 bno 0x50 nblks 0x8 hold 1 pincount 0 lock 1 flags DONE|PAGES|IN_FLIGHT caller 0xffffffffc05b27fes xfs_quota-13687 [000] 3232.565095: xfs_buf_ioacct_dec_assert: dev 253:3 bno 0x50 nblks 0x8 hold 1 pincount 0 lock 1 flags DONE|PAGES|IN_FLIGHT caller 0xffffffffc05b27fes I don't have the surrounding context, but this clearly shows a buffer going through an async I/O and sync I/O within a single non-zero hold count cycle. > It looks to me like we should just remove the assert - I forgot > about this particular corner case. Can you have a quick look and > check whether my analysis above is correct or whether I've missed > something else here? > Agreed. I'll fire off a patch. Thanks for catching this. Brian > -Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jack@suse.cz Wed Aug 3 10:34:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A3B267CA1 for ; Wed, 3 Aug 2016 10:34:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0B66CAC003 for ; Wed, 3 Aug 2016 08:34:41 -0700 (PDT) X-ASG-Debug-ID: 1470238478-0bf57c1367322b10001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id J6oUoECYDKXQJG33 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 08:34:39 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 178BFAC11; Wed, 3 Aug 2016 15:34:38 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 7D8DD1E0F22; Wed, 3 Aug 2016 17:34:37 +0200 (CEST) Date: Wed, 3 Aug 2016 17:34:37 +0200 From: Jan Kara To: Dave Chinner Cc: xfs@oss.sgi.com, jack@suse.cz Subject: Re: [PATCH] xfs: don't invalidate whole file on DAX read/write Message-ID: <20160803153437.GC4576@quack2.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't invalidate whole file on DAX read/write References: <1470181226-20935-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470181226-20935-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470238479 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2330 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31719 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed 03-08-16 09:40:26, Dave Chinner wrote: > From: Dave Chinner > > When we do DAX IO, we try to invalidate the entire page cache held > on the file. This is incorrect as it will trash the entire mapping > tree that now tracks dirty state in exceptional entries in the radix > tree slots. > > What we are trying to do is remove cached pages (e.g from reads > into holes) that sit in the radix tree over the range we are about > to write to. Hence we should just limit the invalidation to the > range we are about to overwrite. The patch looks good. Just one comment below. > > Reported-by: Jan Kara > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_file.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index ed95e5b..e612a02 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -741,9 +741,20 @@ xfs_file_dax_write( > * page is inserted into the pagecache when we have to serve a write > * fault on a hole. It should never be dirtied and can simply be > * dropped from the pagecache once we get real data for the page. > + * > + * XXX: This is racy against mmap, and there's nothing we can do about > + * it. dax_do_io() should really do this invalidation internally as > + * it will know if we've allocated over a holei for this specific IO and > + * if so it needs to update the mapping tree and invalidate existing > + * PTEs over the newly allocated range. Remove this invalidation when > + * dax_do_io() is fixed up. And would it be OK for XFS if dax_do_io() actually invalidated page cache / PTEs under just XFS_IOLOCK_SHARED? Because currently you seem to be careful to call invalidate_inode_pages2() only when holding the lock exclusively and then demote it to a shared one when calling dax_do_io(). Honza > */ > if (mapping->nrpages) { > - ret = invalidate_inode_pages2(mapping); > + loff_t end = iocb->ki_pos + iov_iter_count(from) - 1; > + > + ret = invalidate_inode_pages2_range(mapping, > + iocb->ki_pos >> PAGE_SHIFT, > + end >> PAGE_SHIFT); > WARN_ON_ONCE(ret); > } > > -- > 2.8.0.rc3 > -- Jan Kara SUSE Labs, CR From bfoster@redhat.com Wed Aug 3 11:12:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC83A7CA3 for ; Wed, 3 Aug 2016 11:12:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE8778F8039 for ; Wed, 3 Aug 2016 09:12:56 -0700 (PDT) X-ASG-Debug-ID: 1470240775-0bf57c1367323b80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gDj8hpQwOsWRScgI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 09:12:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F21228E251 for ; Wed, 3 Aug 2016 16:12:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-64.bos.redhat.com [10.18.41.64]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u73GCsCS021812 for ; Wed, 3 Aug 2016 12:12:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 991A31223ED; Wed, 3 Aug 2016 12:12:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: don't assert fail on non-async buffers on ioacct decrement Date: Wed, 3 Aug 2016 12:12:53 -0400 X-ASG-Orig-Subj: [PATCH] xfs: don't assert fail on non-async buffers on ioacct decrement Message-Id: <1470240773-12850-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Wed, 03 Aug 2016 16:12:55 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470240775 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1404 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The buffer I/O accounting mechanism tracks async buffers under I/O. As an optimization, the buffer I/O count is incremented only once on the first async I/O for a given hold cycle of a buffer and decremented once the buffer is released to the LRU (or freed). xfs_buf_ioacct_dec() has an ASSERT() check for an XBF_ASYNC buffer, but we have one or two corner cases where a buffer can be submitted for I/O multiple times via different methods in a single hold cycle. If an async I/O occurs first, the I/O count is incremented. If a sync I/O occurs before the hold count drops, XBF_ASYNC is cleared by the time the I/O count is decremented. Remove the async assert check from xfs_buf_ioacct_dec() as this is a perfectly valid scenario. For the purposes of I/O accounting, we really only care about the buffer async state at I/O submission time. Discovered-and-analyzed-by: Dave Chinner Signed-off-by: Brian Foster --- fs/xfs/xfs_buf.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 32fc540..b13ff61 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -115,7 +115,6 @@ xfs_buf_ioacct_dec( if (!(bp->b_flags & _XBF_IN_FLIGHT)) return; - ASSERT(bp->b_flags & XBF_ASYNC); bp->b_flags &= ~_XBF_IN_FLIGHT; percpu_counter_dec(&bp->b_target->bt_io_count); } -- 2.5.5 From zwisler@gmail.com Wed Aug 3 11:25:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 589AE7CA3 for ; Wed, 3 Aug 2016 11:25:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28DD5304032 for ; Wed, 3 Aug 2016 09:25:06 -0700 (PDT) X-ASG-Debug-ID: 1470241503-0bf57c13693242c0001-NocioJ Received: from mail-qt0-f193.google.com (mail-qt0-f193.google.com [209.85.216.193]) by cuda.sgi.com with ESMTP id KWYF2jyihPrxBuZv (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 03 Aug 2016 09:25:04 -0700 (PDT) X-Barracuda-Envelope-From: zwisler@gmail.com X-Barracuda-Effective-Source-IP: mail-qt0-f193.google.com[209.85.216.193] X-Barracuda-Apparent-Source-IP: 209.85.216.193 Received: by mail-qt0-f193.google.com with SMTP id q11so11235509qtb.2 for ; Wed, 03 Aug 2016 09:25:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=I9A27A3VFOO0vseQRwqsQpdgavHGcK8HIi09j2qXAGg=; b=erHveZkS8PXmua8MSUbO19c56JlrzE4eGdidnz2avzu79PZm+Omp/OwxMXzJK9OSZh Bn9K76Rn6a1ztaeDKAbgcMf9NpE4jJ9ZWQ6zJmW3S46Uzd3TRdfLqlZ8L/jHgSRDr5aC 8zKKMIaxnNsR9yQoeVJDKCEFVJZHcDSDsXuitmP28P4IqoSUyjo1libcsx8DLuscVO+i CF75V4HIQkEU0Gw2GDFvtFCuXlQnQXURNrw3Jk4Vzz4R1JXawDgWOxhrkrFhAmxLXtm6 6x38Pie5oe067x4JHXG5JQ28u585TGQXub+Sq97f8FGb7040FK197O1NWEbbMav5FGsj 8YKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=I9A27A3VFOO0vseQRwqsQpdgavHGcK8HIi09j2qXAGg=; b=JXL+o9lGpuk1cUve0T6PlriqaLF+lZc0B4Tzv+3cGYjxqQQkp5Ca2IIImYVPfdabIm R4GuD8ZUNJnLYrr68XE6NlTSVUMy06m6hF03DGDhOoorQrRwvGEiRXHEIgC1VuLqzUHF R6QVqQ2JSbbQDtfGaQlA/rRvN/QPYsew8X8+A8a5iwt6rRfYA/BAnIImt9tcOLg0QUc6 wJEuCANot61IWy97argHON4SIUzSr90JuhOxjaag5wqVMigDlpi0sVxxFwAXEaVSkpM0 oZDCi/u5PEyIfiRK6jbVlY5FPGAi49pRJ+lQq0itoGMhDjuSNmoSD75CXBeYSdtjPJDw yM5g== X-Gm-Message-State: AEkoousJjiAC1lqjNRcu4nCK4aC73fb+7FIu0wpZKPjBYCNomh7BLaqsshSRh07LDJ5vUr2A/vPj1awJMQSuxQ== X-Received: by 10.237.36.38 with SMTP id r35mr844213qtc.3.1470241503260; Wed, 03 Aug 2016 09:25:03 -0700 (PDT) MIME-Version: 1.0 Received: by 10.55.54.9 with HTTP; Wed, 3 Aug 2016 09:25:02 -0700 (PDT) In-Reply-To: <1465155145-10812-43-git-send-email-mchristi@redhat.com> References: <1465155145-10812-1-git-send-email-mchristi@redhat.com> <1465155145-10812-43-git-send-email-mchristi@redhat.com> From: Ross Zwisler Date: Wed, 3 Aug 2016 10:25:02 -0600 Message-ID: Subject: Re: [PATCH 42/45] block, fs, drivers: remove REQ_OP compat defs and related code To: mchristi@redhat.com, axboe@fb.com, Ross Zwisler X-ASG-Orig-Subj: Re: [PATCH 42/45] block, fs, drivers: remove REQ_OP compat defs and related code Cc: linux-f2fs-devel@lists.sourceforge.net, linux-ext4 , konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel , linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, LKML , linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, XFS Developers , ocfs2-devel@oss.oracle.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qt0-f193.google.com[209.85.216.193] X-Barracuda-Start-Time: 1470241503 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4544 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580D, BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31720 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.75 BSF_RULE_7580D Custom Rule 7580D On Sun, Jun 5, 2016 at 1:32 PM, wrote: > From: Mike Christie > > This patch drops the compat definition of req_op where it matches > the rq_flag_bits definitions, and drops the related old and compat > code that allowed users to set either the op or flags for the operation. > > We also then store the operation in the bi_rw/cmd_flags field similar > to how we used to store the bio ioprio where it sat in the upper bits > of the field. > > Signed-off-by: Mike Christie I was doing some xfstests testing yesterday using linux/master, and hit a kernel BUG that bisected to this change. The failing test is generic/008 + ext2, without DAX. This BUG reproduces with this test 100% as of this change, and 0% with the previous commit. Here's the kernel commit that I bisected to: commit 4e1b2d52a80d79296a5d899d73249748dea71a53 Author: Mike Christie Date: Sun Jun 5 14:32:22 2016 -0500 block, fs, drivers: remove REQ_OP compat defs and related code Here are the steps to reproduce the BUG using a pair of 1 GiB BRD ramdisks: SCRATCH_DEV=/dev/ram0 TEST_DEV=/dev/ram1 mkfs.ext2 -F $SCRATCH_DEV mkfs.ext2 -F $TEST_DEV cd ~/xfstests ./check generic/008 Here is the BUG output for that commit, passed through kasan_symbolize.py. The line numbers are for the commit listed above, not for linux/master: run fstests generic/008 at 2016-08-03 09:54:56 page:ffffea0017af04c0 count:3 mapcount:0 mapping:ffff8805eb059200 index:0x0 flags: 0x3fff8000002828(uptodate|lru|private|writeback) page dumped because: VM_BUG_ON_PAGE(!PageLocked(page)) page->mem_cgroup:ffff8806098e0800 ------------[ cut here ]------------ kernel BUG at mm/filemap.c:833! invalid opcode: 0000 [#1] SMP Modules linked in: brd dax_pmem nd_pmem dax nd_btt nd_e820 libnvdimm CPU: 0 PID: 2522 Comm: xfs_io Not tainted 4.7.0-rc2-00042-g4e1b2d52 #18 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.1-0-gb3ef39f-prebuilt.qemu-project.org 04/01/2014 task: ffff8805ebae4ec0 ti: ffff8805eba3c000 task.ti: ffff8805eba3c000 RIP: 0010:[] [] unlock_page+0xa5/0xb0 RSP: 0018:ffff8805eba3fa60 EFLAGS: 00010282 RAX: 0000000000000021 RBX: 0000000000000000 RCX: 0000000000000006 RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8806109ce200 RBP: ffff8805eba3fa60 R08: 0000000000000001 R09: 0000000000000001 R10: ffff8805ebae4ec0 R11: 0000000000000001 R12: ffffea0017af04c0 R13: 0000000000028000 R14: ffffffffa00202c0 R15: ffff88060eff1200 FS: 00007f87a31cf700(0000) GS:ffff880610800000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f87a31e6000 CR3: 000000060da31000 CR4: 00000000001406f0 Stack: ffff8805eba3fa98 ffffffff812bd782 ffff8805eba3fdb0 0000000000001000 ffffea0017af04c0 0000000000000000 0000000000000088 ffff8805eba3fbe0 ffffffff812c3ff1 ffff8805eba3fd00 0000000000028000 0000000c00000000 Call Trace: [] bdev_write_page+0xb2/0xe0 fs/block_dev.c:462 [] __mpage_writepage+0x5c1/0x750 fs/mpage.c:604 [] write_cache_pages+0x20d/0x5f0 mm/page-writeback.c:2261 [] mpage_writepages+0x75/0xe0 fs/mpage.c:703 [] ext2_writepages+0x3b/0x40 fs/ext2/inode.c:887 [] do_writepages+0x21/0x30 mm/page-writeback.c:2361 [] __filemap_fdatawrite_range+0xc6/0x100 mm/filemap.c:300 [] filemap_write_and_wait_range+0x44/0x90 mm/filemap.c:490 [] __generic_file_fsync+0x27/0x90 fs/libfs.c:937 [] generic_file_fsync+0x19/0x40 fs/libfs.c:974 [] ext2_fsync+0x2e/0x70 fs/ext2/file.c:149 [] vfs_fsync_range+0x4b/0xb0 fs/sync.c:195 [< inline >] vfs_fsync fs/sync.c:209 [] do_fsync+0x3d/0x70 fs/sync.c:219 [< inline >] SYSC_fsync fs/sync.c:227 [] SyS_fsync+0x10/0x20 fs/sync.c:225 [] entry_SYSCALL_64_fastpath+0x1f/0xbd arch/x86/entry/entry_64.S:207 Code: 00 00 48 d3 ea 89 d2 48 8d 0c 92 48 8d 14 4a 48 8d 3c d0 31 d2 e8 bc fc f1 ff 5d c3 48 c7 c6 20 1d ec 81 4c 89 c7 e8 bb 8d 03 00 <0f> 0b 66 0f 1f 84 00 00 00 00 00 66 66 66 66 90 55 b9 08 00 00 RIP [] unlock_page+0xa5/0xb0 mm/filemap.c:833 RSP ---[ end trace d419bf59bba263fb ]--- I'm happy to provide any additional info you need, or to test fixes. Thanks, - Ross From ross.zwisler@linux.intel.com Wed Aug 3 12:11:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A83737CA1 for ; Wed, 3 Aug 2016 12:11:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5DCDA8F8035 for ; Wed, 3 Aug 2016 10:11:29 -0700 (PDT) X-ASG-Debug-ID: 1470244287-0bf8157e6a40af10001-NocioJ Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by cuda.sgi.com with ESMTP id FiQRA4Gr73naVDtv for ; Wed, 03 Aug 2016 10:11:28 -0700 (PDT) X-Barracuda-Envelope-From: ross.zwisler@linux.intel.com X-Barracuda-Effective-Source-IP: mga02.intel.com[134.134.136.20] X-Barracuda-Apparent-Source-IP: 134.134.136.20 X-ASG-Whitelist: Client Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga101.jf.intel.com with ESMTP; 03 Aug 2016 10:11:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,466,1464678000"; d="scan'208";a="150077285" Received: from theros.lm.intel.com (HELO linux.intel.com) ([10.232.112.65]) by fmsmga004.fm.intel.com with ESMTP; 03 Aug 2016 10:11:27 -0700 Date: Wed, 3 Aug 2016 11:11:27 -0600 From: Ross Zwisler To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-nvdimm@lists.01.org Subject: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Message-ID: <20160803171127.GA15876@linux.intel.com> X-ASG-Orig-Subj: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Mail-Followup-To: Ross Zwisler , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-nvdimm@lists.01.org References: <20160803003354.GP16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803003354.GP16044@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Barracuda-Connect: mga02.intel.com[134.134.136.20] X-Barracuda-Start-Time: 1470244287 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2781 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 03, 2016 at 10:33:54AM +1000, Dave Chinner wrote: > Hi folks, > > Just hit a reproducable hang in generic/361. Essentially this on > a 8GB pmem device: > > mkfs.xfs -f /dev/pmem1 > mount -o dax /dev/pmem1 /mnt/scratch > xfs_io -f -c "truncate 1g" test.img > losetup -f --show /mnt/scratch/test.img > mkfs.xfs -f /dev/loop0 > > And the mkfs.xfs command hangs with a discard that never completes: > > [ 243.413918] INFO: task mkfs.xfs:5708 blocked for more than 120 seconds. > [ 243.415678] Not tainted 4.7.0-dgc+ #862 > [ 243.416772] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > [ 243.418769] mkfs.xfs D ffff880835143c18 13848 5708 5441 0x00000000 > [ 243.420620] ffff880835143c18 ffff880835143c20 ffff88083a244780 ffff8808358ba3c0 > [ 243.422636] ffff88023aa20000 ffff880835144000 7fffffffffffffff 7fffffffffffffff > [ 243.424586] ffff8808358ba3c0 00000000024000c0 ffff880835143c30 ffffffff81e5e38c > [ 243.426466] Call Trace: > [ 243.427050] [] schedule+0x3c/0x90 > [ 243.428224] [] schedule_timeout+0x265/0x330 > [ 243.429563] [] ? kvm_clock_read+0x25/0x40 > [ 243.430896] [] ? kvm_clock_get_cycles+0x9/0x10 > [ 243.432360] [] ? ktime_get+0x3c/0xb0 > [ 243.433556] [] io_schedule_timeout+0xa4/0x110 > [ 243.434932] [] wait_for_completion_io+0xd6/0x110 > [ 243.436297] [] ? wake_up_q+0x70/0x70 > [ 243.437436] [] submit_bio_wait+0x56/0x70 > [ 243.438671] [] blkdev_issue_discard+0x6a/0xb0 > [ 243.439980] [] ? __might_sleep+0x49/0x80 > [ 243.441182] [] blk_ioctl_discard+0x97/0xb0 > [ 243.442370] [] blkdev_ioctl+0x7eb/0x9a0 > [ 243.443485] [] block_ioctl+0x3d/0x50 > [ 243.444552] [] do_vfs_ioctl+0x8f/0x670 > [ 243.445630] [] ? exit_to_usermode_loop+0x94/0xb0 > [ 243.446902] [] SyS_ioctl+0x79/0x90 > [ 243.447927] [] ? syscall_return_slowpath+0xf5/0x190 > [ 243.449236] [] entry_SYSCALL_64_fastpath+0x1a/0xa4 > > This only reproduces when the underlying filesystem is mounted with > -o dax, so there is a bad interaction with loop devices and DAX > occurring somewhere. generic/361 is a recent test (committed june 14) > so this probably hasn't actually been tested until now. > > I haven't got time to look at this right now, hence the report. Cool, thanks for the report. I've reproduced this with linux/master, and the test passes with v4.7. Running a bisect... From mchristi@redhat.com Wed Aug 3 12:28:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3EBA87CA1 for ; Wed, 3 Aug 2016 12:28:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99CF6AC002 for ; Wed, 3 Aug 2016 10:28:46 -0700 (PDT) X-ASG-Debug-ID: 1470245324-0bf57b369d384d00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KDJQEKgDDYDSDmvu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 10:28:45 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 938D63919B5; Wed, 3 Aug 2016 17:28:43 +0000 (UTC) Received: from [10.10.58.202] (vpn-58-202.rdu2.redhat.com [10.10.58.202]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u73HSdvP031350; Wed, 3 Aug 2016 13:28:40 -0400 Subject: Re: [PATCH 42/45] block, fs, drivers: remove REQ_OP compat defs and related code To: Ross Zwisler , axboe@fb.com, Ross Zwisler X-ASG-Orig-Subj: Re: [PATCH 42/45] block, fs, drivers: remove REQ_OP compat defs and related code References: <1465155145-10812-1-git-send-email-mchristi@redhat.com> <1465155145-10812-43-git-send-email-mchristi@redhat.com> Cc: linux-f2fs-devel@lists.sourceforge.net, linux-ext4 , konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel , linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, LKML , linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, XFS Developers , ocfs2-devel@oss.oracle.com From: Mike Christie Message-ID: <57A229C7.6010102@redhat.com> Date: Wed, 3 Aug 2016 12:28:39 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 03 Aug 2016 17:28:44 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470245325 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3335 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/03/2016 11:25 AM, Ross Zwisler wrote: > run fstests generic/008 at 2016-08-03 09:54:56 > page:ffffea0017af04c0 count:3 mapcount:0 mapping:ffff8805eb059200 index:0x0 > flags: 0x3fff8000002828(uptodate|lru|private|writeback) > page dumped because: VM_BUG_ON_PAGE(!PageLocked(page)) > page->mem_cgroup:ffff8806098e0800 > ------------[ cut here ]------------ > kernel BUG at mm/filemap.c:833! > invalid opcode: 0000 [#1] SMP > Modules linked in: brd dax_pmem nd_pmem dax nd_btt nd_e820 libnvdimm > CPU: 0 PID: 2522 Comm: xfs_io Not tainted 4.7.0-rc2-00042-g4e1b2d52 #18 > Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS > rel-1.9.1-0-gb3ef39f-prebuilt.qemu-project.org 04/01/2014 > task: ffff8805ebae4ec0 ti: ffff8805eba3c000 task.ti: ffff8805eba3c000 > RIP: 0010:[] [] unlock_page+0xa5/0xb0 > RSP: 0018:ffff8805eba3fa60 EFLAGS: 00010282 > RAX: 0000000000000021 RBX: 0000000000000000 RCX: 0000000000000006 > RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff8806109ce200 > RBP: ffff8805eba3fa60 R08: 0000000000000001 R09: 0000000000000001 > R10: ffff8805ebae4ec0 R11: 0000000000000001 R12: ffffea0017af04c0 > R13: 0000000000028000 R14: ffffffffa00202c0 R15: ffff88060eff1200 > FS: 00007f87a31cf700(0000) GS:ffff880610800000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 00007f87a31e6000 CR3: 000000060da31000 CR4: 00000000001406f0 > Stack: > ffff8805eba3fa98 ffffffff812bd782 ffff8805eba3fdb0 0000000000001000 > ffffea0017af04c0 0000000000000000 0000000000000088 ffff8805eba3fbe0 > ffffffff812c3ff1 ffff8805eba3fd00 0000000000028000 0000000c00000000 > Call Trace: > [] bdev_write_page+0xb2/0xe0 fs/block_dev.c:462 > [] __mpage_writepage+0x5c1/0x750 fs/mpage.c:604 > [] write_cache_pages+0x20d/0x5f0 mm/page-writeback.c:2261 > [] mpage_writepages+0x75/0xe0 fs/mpage.c:703 > [] ext2_writepages+0x3b/0x40 fs/ext2/inode.c:887 > [] do_writepages+0x21/0x30 mm/page-writeback.c:2361 > [] __filemap_fdatawrite_range+0xc6/0x100 mm/filemap.c:300 > [] filemap_write_and_wait_range+0x44/0x90 mm/filemap.c:490 > [] __generic_file_fsync+0x27/0x90 fs/libfs.c:937 > [] generic_file_fsync+0x19/0x40 fs/libfs.c:974 > [] ext2_fsync+0x2e/0x70 fs/ext2/file.c:149 > [] vfs_fsync_range+0x4b/0xb0 fs/sync.c:195 > [< inline >] vfs_fsync fs/sync.c:209 > [] do_fsync+0x3d/0x70 fs/sync.c:219 > [< inline >] SYSC_fsync fs/sync.c:227 > [] SyS_fsync+0x10/0x20 fs/sync.c:225 > [] entry_SYSCALL_64_fastpath+0x1f/0xbd > arch/x86/entry/entry_64.S:207 > Code: 00 00 48 d3 ea 89 d2 48 8d 0c 92 48 8d 14 4a 48 8d 3c d0 31 d2 > e8 bc fc f1 ff 5d c3 48 c7 c6 20 1d ec 81 4c 89 c7 e8 bb 8d 03 00 <0f> > 0b 66 0f 1f 84 00 00 00 00 00 66 66 66 66 90 55 b9 08 00 00 > RIP [] unlock_page+0xa5/0xb0 mm/filemap.c:833 > RSP > ---[ end trace d419bf59bba263fb ]--- Thanks for testing and the detailed bug report. Looks like I missed the rw_page callback. Testing a patch right now. Should be done in a couple of hours. From BATV+bfb50cb660de995a4775+4728+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 3 12:33:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 04E817CA1 for ; Wed, 3 Aug 2016 12:33:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A6E1AC003 for ; Wed, 3 Aug 2016 10:33:14 -0700 (PDT) X-ASG-Debug-ID: 1470245590-0bf57b369e384fc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id fAvPcfTrmnLBVjyh (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 03 Aug 2016 10:33:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+bfb50cb660de995a4775+4728+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bV02X-00063c-Eh for xfs@oss.sgi.com; Wed, 03 Aug 2016 17:33:09 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix bogus space reservation in xfs_iomap_write_allocate Date: Wed, 3 Aug 2016 19:33:06 +0200 X-ASG-Orig-Subj: [PATCH] xfs: fix bogus space reservation in xfs_iomap_write_allocate Message-Id: <1470245586-14068-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470245590 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1926 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31722 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 The space reservations was without an explaination back in commit "Add error reporting calls in error paths that return EFSCORRUPTED" back in 2003. There is no reason to reserve disk blocks in the transaction when allocating blocks for delalloc space as we already reserved the space when creating the delalloc extent. With this fix we stop running out of the reserved pool in generic/229, which has happened for long time with small blocksize file systems, and has increased in severity with the new buffered write path. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 2114d53..279353c 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -691,7 +691,6 @@ xfs_iomap_write_allocate( xfs_trans_t *tp; int nimaps; int error = 0; - int nres; /* * Make sure that the dquots are there. @@ -715,12 +714,15 @@ xfs_iomap_write_allocate( * is in the delayed allocation extent on which we sit * but before our buffer starts. */ - nimaps = 0; while (nimaps == 0) { - nres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK); - - error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, nres, + /* + * We have already reserved space for the extent and any + * indirect blocks when creating the delalloc extent, + * there is no need to reserve space in this transaction + * again. + */ + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, 0, 0, XFS_TRANS_RESERVE, &tp); if (error) return error; @@ -783,7 +785,7 @@ xfs_iomap_write_allocate( */ error = xfs_bmapi_write(tp, ip, map_start_fsb, count_fsb, 0, &first_block, - nres, imap, &nimaps, + 0, imap, &nimaps, &dfops); if (error) goto trans_cancel; -- 2.1.4 From viro@ftp.linux.org.uk Wed Aug 3 12:37:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CA7D27CA1 for ; Wed, 3 Aug 2016 12:37:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90930304039 for ; Wed, 3 Aug 2016 10:37:22 -0700 (PDT) X-ASG-Debug-ID: 1470245837-0bf8157e6b40d2d0001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id zmetq9xkYjjJDJLl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 10:37:19 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Effective-Source-IP: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.86_2 #1 (Red Hat Linux)) id 1bV06T-0005xo-2t; Wed, 03 Aug 2016 17:37:13 +0000 Date: Wed, 3 Aug 2016 18:37:13 +0100 From: Al Viro To: Eryu Guan Cc: linux-fsdevel@vger.kernel.org, Steven Whitehouse , Bob Peterson , Dave Chinner , "supporter:XFS FILESYSTEM" , "open list:GFS2 FILE SYSTEM" , open list Subject: Re: [PATCH v2 RESEND] fs: return EPERM on immutable inode Message-ID: <20160803173712.GJ2356@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: [PATCH v2 RESEND] fs: return EPERM on immutable inode References: <1470139108-13115-1-git-send-email-guaneryu@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470139108-13115-1-git-send-email-guaneryu@gmail.com> User-Agent: Mutt/1.6.1 (2016-04-27) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1470245839 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 457 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31723 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 02, 2016 at 07:58:28PM +0800, Eryu Guan wrote: > In most cases, EPERM is returned on immutable inode, and there're only a > few places returning EACCES. I noticed this when running LTP on > overlayfs, setxattr03 failed due to unexpected EACCES on immutable > inode. > > So converting all EACCES to EPERM on immutable inode. > > Acked-by: Dave Chinner > Signed-off-by: Eryu Guan Applied. From mfasheh@suse.de Wed Aug 3 14:45:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 83F4D7CA1 for ; Wed, 3 Aug 2016 14:45:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4007F304048 for ; Wed, 3 Aug 2016 12:45:42 -0700 (PDT) X-ASG-Debug-ID: 1470253537-0bf57c136932f760001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 1QCep0oLcpFXrI8Q (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 12:45:38 -0700 (PDT) X-Barracuda-Envelope-From: mfasheh@suse.de X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 21597AD2C; Wed, 3 Aug 2016 19:45:37 +0000 (UTC) Date: Wed, 3 Aug 2016 12:45:36 -0700 From: Mark Fasheh To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160803194536.GJ5316@wotan.suse.de> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support Reply-To: Mark Fasheh References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> Organization: SUSE Labs User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470253538 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1177 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31727 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Darrick, On Wed, Jul 20, 2016 at 09:55:55PM -0700, Darrick J. Wong wrote: > Hi all, > > This is the seventh revision of a patchset that adds to XFS kernel > support for tracking reverse-mappings of physical blocks to file and > metadata (rmap). Per reviewers' request with v6, I am splitting the > gigantic patchbombs into separate functional areas. Given the > significant amount of design assumptions that change with block > sharing, rmap and reflink are provided together. There shouldn't be > any incompatible on-disk format changes, pending a thorough review of > the patches within. Where can I the patches to enable dedupe_range on xfs? I tested your previous devel branch based on Linux v4.7-rc3 with duperemove (https://github.com/markfasheh/duperemove) and it worked extremely well - even handling some cases that btrfs still has issues with. I actually committed the code to enable xfs support in duperemove so anyone can test on xfs with the dedupe_range patches. I'd gladly test your latest patches by doing my usual 'large' duperemove tests once I can get ahold of the dedupe_range work :) Thanks, --Mark -- Mark Fasheh From darrick.wong@oracle.com Wed Aug 3 15:55:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D1B0D7CA1 for ; Wed, 3 Aug 2016 15:55:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 886628F8033 for ; Wed, 3 Aug 2016 13:55:37 -0700 (PDT) X-ASG-Debug-ID: 1470257735-0bf8157e6d418e40001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ywZCBWKzmeM0oz5z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 13:55:35 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73KtXo9020008 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 20:55:33 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u73KtWCo008888 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 20:55:33 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u73KtL0i006460; Wed, 3 Aug 2016 20:55:26 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 13:55:21 -0700 Date: Wed, 3 Aug 2016 13:55:20 -0700 From: "Darrick J. Wong" To: Mark Fasheh Cc: david@fromorbit.com, linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160803205520.GQ8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803194536.GJ5316@wotan.suse.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470257735 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2027 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31731 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 12:45:36PM -0700, Mark Fasheh wrote: > Hi Darrick, > > On Wed, Jul 20, 2016 at 09:55:55PM -0700, Darrick J. Wong wrote: > > Hi all, > > > > This is the seventh revision of a patchset that adds to XFS kernel > > support for tracking reverse-mappings of physical blocks to file and > > metadata (rmap). Per reviewers' request with v6, I am splitting the > > gigantic patchbombs into separate functional areas. Given the > > significant amount of design assumptions that change with block > > sharing, rmap and reflink are provided together. There shouldn't be > > any incompatible on-disk format changes, pending a thorough review of > > the patches within. > > Where can I the patches to enable dedupe_range on xfs? I tested your > previous devel branch based on Linux v4.7-rc3 with duperemove > (https://github.com/markfasheh/duperemove) and it worked extremely well - > even handling some cases that btrfs still has issues with. I actually > committed the code to enable xfs support in duperemove so anyone can test on > xfs with the dedupe_range patches. > > I'd gladly test your latest patches by doing my usual 'large' duperemove > tests once I can get ahold of the dedupe_range work :) Your best bets are probably the -experimental trees: https://github.com/djwong/linux/commits/djwong-experimental https://github.com/djwong/xfsprogs/commits/djwong-experimental I haven't updated them in a while because I've been busy trying to get reverse-mapping (the start of those patchbombs) into 4.8. Just as a warning, don't put anything critical on those XFS filesystems because there's going to be a disk format update between now and the next time I post the patches because Dave and I decided to cache the block counts for the new btrees in order to speed up mounting. I don't anticipate having time to clean up my dev tree and push to github until a week or two after the merge window closes. --D > > Thanks, > --Mark > > -- > Mark Fasheh From darrick.wong@oracle.com Wed Aug 3 16:46:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 149567CA1 for ; Wed, 3 Aug 2016 16:46:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BEC688F8033 for ; Wed, 3 Aug 2016 14:46:29 -0700 (PDT) X-ASG-Debug-ID: 1470260784-0bf8157e6d41e1f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id vpO9m212jPhtGQ9u (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 14:46:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73LkMnL004018 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 21:46:22 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u73LkK39024232 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 21:46:21 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u73LkEXd027813; Wed, 3 Aug 2016 21:46:20 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 14:46:14 -0700 Date: Wed, 3 Aug 2016 14:46:13 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: xfs@oss.sgi.com Subject: [PATCH v2] xfs: store rmapbt block count in the AGF Message-ID: <20160803214613.GF8593@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2] xfs: store rmapbt block count in the AGF MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470260784 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3915 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Track the number of blocks used for the rmapbt in the AGF. When we get to the AG reservation code we need this counter to quickly make our reservation during mount. v2: Actually include growfs support. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 1 + fs/xfs/libxfs/xfs_format.h | 11 ++++++++--- fs/xfs/libxfs/xfs_rmap_btree.c | 6 ++++++ fs/xfs/xfs_fsops.c | 1 + 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 776ae2f..af1a72e 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2264,6 +2264,7 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_longest), offsetof(xfs_agf_t, agf_btreeblks), offsetof(xfs_agf_t, agf_uuid), + offsetof(xfs_agf_t, agf_rmap_blocks), sizeof(xfs_agf_t) }; diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index f814d42..e6a8bea 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -640,12 +640,15 @@ typedef struct xfs_agf { __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ uuid_t agf_uuid; /* uuid of filesystem */ + __be32 agf_rmap_blocks; /* rmapbt blocks used */ + __be32 agf_padding; /* padding */ + /* * reserve some contiguous space for future logged fields before we add * the unlogged fields. This makes the range logging via flags and * structure offsets much simpler. */ - __be64 agf_spare64[16]; + __be64 agf_spare64[15]; /* unlogged fields, written during buffer writeback. */ __be64 agf_lsn; /* last write sequence */ @@ -670,7 +673,8 @@ typedef struct xfs_agf { #define XFS_AGF_LONGEST 0x00000400 #define XFS_AGF_BTREEBLKS 0x00000800 #define XFS_AGF_UUID 0x00001000 -#define XFS_AGF_NUM_BITS 13 +#define XFS_AGF_RMAP_BLOCKS 0x00002000 +#define XFS_AGF_NUM_BITS 14 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_FLAGS \ @@ -686,7 +690,8 @@ typedef struct xfs_agf { { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ { XFS_AGF_LONGEST, "LONGEST" }, \ { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ - { XFS_AGF_UUID, "UUID" } + { XFS_AGF_UUID, "UUID" }, \ + { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" } /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c index bc1faeb..17b8eeb 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.c +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -98,6 +98,8 @@ xfs_rmapbt_alloc_block( union xfs_btree_ptr *new, int *stat) { + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); int error; xfs_agblock_t bno; @@ -124,6 +126,8 @@ xfs_rmapbt_alloc_block( xfs_trans_agbtree_delta(cur->bc_tp, 1); new->s = cpu_to_be32(bno); + be32_add_cpu(&agf->agf_rmap_blocks, 1); + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS); XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); *stat = 1; @@ -143,6 +147,8 @@ xfs_rmapbt_free_block( bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); trace_xfs_rmapbt_free_block(cur->bc_mp, cur->bc_private.a.agno, bno, 1); + be32_add_cpu(&agf->agf_rmap_blocks, -1); + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS); error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); if (error) return error; diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 0f96847..0b7f986 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -248,6 +248,7 @@ xfs_growfs_data_private( agf->agf_roots[XFS_BTNUM_RMAPi] = cpu_to_be32(XFS_RMAP_BLOCK(mp)); agf->agf_levels[XFS_BTNUM_RMAPi] = cpu_to_be32(1); + agf->agf_rmap_blocks = cpu_to_be32(1); } agf->agf_flfirst = cpu_to_be32(1); From darrick.wong@oracle.com Wed Aug 3 16:47:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2A6E67CA1 for ; Wed, 3 Aug 2016 16:47:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EFEE7304048 for ; Wed, 3 Aug 2016 14:47:22 -0700 (PDT) X-ASG-Debug-ID: 1470260840-0bf57c136a337190001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id IgQAboynz5ksEkdp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 14:47:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73LlJdm005053 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 21:47:19 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73LlIFO003434 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 21:47:18 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u73LlB3r028175; Wed, 3 Aug 2016 21:47:17 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 14:47:11 -0700 Date: Wed, 3 Aug 2016 14:47:10 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: store rmapbt block count in the AGF Message-ID: <20160803214710.GG8593@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: store rmapbt block count in the AGF References: <20160803023711.GE8593@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803023711.GE8593@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470260840 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4030 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ok, let's try this again, but this time with the chunk we need for growfs actually included in the commit. Someone forgot to run 'stg ref'. v2 patch (and xfsprogs stuff) will be out shortly. --D On Tue, Aug 02, 2016 at 07:37:11PM -0700, Darrick J. Wong wrote: > Track the number of blocks used for the rmapbt in the AGF. When we > get to the AG reservation code we need this counter to quickly > make our reservation during mount. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/libxfs/xfs_alloc.c | 1 + > fs/xfs/libxfs/xfs_format.h | 11 ++++++++--- > fs/xfs/libxfs/xfs_rmap_btree.c | 6 ++++++ > 3 files changed, 15 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index 776ae2f..af1a72e 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -2264,6 +2264,7 @@ xfs_alloc_log_agf( > offsetof(xfs_agf_t, agf_longest), > offsetof(xfs_agf_t, agf_btreeblks), > offsetof(xfs_agf_t, agf_uuid), > + offsetof(xfs_agf_t, agf_rmap_blocks), > sizeof(xfs_agf_t) > }; > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > index f814d42..e6a8bea 100644 > --- a/fs/xfs/libxfs/xfs_format.h > +++ b/fs/xfs/libxfs/xfs_format.h > @@ -640,12 +640,15 @@ typedef struct xfs_agf { > __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ > uuid_t agf_uuid; /* uuid of filesystem */ > > + __be32 agf_rmap_blocks; /* rmapbt blocks used */ > + __be32 agf_padding; /* padding */ > + > /* > * reserve some contiguous space for future logged fields before we add > * the unlogged fields. This makes the range logging via flags and > * structure offsets much simpler. > */ > - __be64 agf_spare64[16]; > + __be64 agf_spare64[15]; > > /* unlogged fields, written during buffer writeback. */ > __be64 agf_lsn; /* last write sequence */ > @@ -670,7 +673,8 @@ typedef struct xfs_agf { > #define XFS_AGF_LONGEST 0x00000400 > #define XFS_AGF_BTREEBLKS 0x00000800 > #define XFS_AGF_UUID 0x00001000 > -#define XFS_AGF_NUM_BITS 13 > +#define XFS_AGF_RMAP_BLOCKS 0x00002000 > +#define XFS_AGF_NUM_BITS 14 > #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) > > #define XFS_AGF_FLAGS \ > @@ -686,7 +690,8 @@ typedef struct xfs_agf { > { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ > { XFS_AGF_LONGEST, "LONGEST" }, \ > { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ > - { XFS_AGF_UUID, "UUID" } > + { XFS_AGF_UUID, "UUID" }, \ > + { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" } > > /* disk block (xfs_daddr_t) in the AG */ > #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) > diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c > index bc1faeb..17b8eeb 100644 > --- a/fs/xfs/libxfs/xfs_rmap_btree.c > +++ b/fs/xfs/libxfs/xfs_rmap_btree.c > @@ -98,6 +98,8 @@ xfs_rmapbt_alloc_block( > union xfs_btree_ptr *new, > int *stat) > { > + struct xfs_buf *agbp = cur->bc_private.a.agbp; > + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); > int error; > xfs_agblock_t bno; > > @@ -124,6 +126,8 @@ xfs_rmapbt_alloc_block( > > xfs_trans_agbtree_delta(cur->bc_tp, 1); > new->s = cpu_to_be32(bno); > + be32_add_cpu(&agf->agf_rmap_blocks, 1); > + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS); > > XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); > *stat = 1; > @@ -143,6 +147,8 @@ xfs_rmapbt_free_block( > bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); > trace_xfs_rmapbt_free_block(cur->bc_mp, cur->bc_private.a.agno, > bno, 1); > + be32_add_cpu(&agf->agf_rmap_blocks, -1); > + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_RMAP_BLOCKS); > error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); > if (error) > return error; > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Wed Aug 3 16:57:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F2E3C7CA1 for ; Wed, 3 Aug 2016 16:57:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7715CAC002 for ; Wed, 3 Aug 2016 14:57:04 -0700 (PDT) X-ASG-Debug-ID: 1470261421-0bf8157e6b41ec10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id r4qc9VkEqDeaRrxm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 14:57:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73LuxUI015090 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 21:56:59 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73LuwQE024720 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 21:56:59 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u73Luvwd003847; Wed, 3 Aug 2016 21:56:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 14:56:57 -0700 Date: Wed, 3 Aug 2016 14:56:56 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfs: for-next branch updated to 3481b68 Message-ID: <20160803215656.GH8593@birch.djwong.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: for-next branch updated to 3481b68 References: <20160803120901.GT16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803120901.GT16044@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470261421 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10814 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 10:09:01PM +1000, Dave Chinner wrote: > Hi folks, > > The for-next branch of the xfs kernel repository at > > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git > > has just been updated. > > I've just pushed the initial reverse block mapping support code from > Darrick out to the for-next branch. The code as it stands will work > for most cases, but it is still definitely considered experimental - > don't put any data you want to keep on rmap enable filesystems at > this point. It passes all of xfstests and other local testing > without regressions for non-rmap filesystems, so existing > filesystems should be unaffected by this merge. > > Known problems when rmapbt is enabled are: > > - On disk format needs a minor tweak to keep a persistent > count of allocated rmapbt blocks. This is required for > sensible mount time behaviour of the upcoming AG > reservation code, and will be merged as soon as the patch > Darrick posted earlier this evening is reviewed and > tested. > - hangs/corrupts/assert fails at ENOSPC because of > insufficient free block reservations. I can reproduce this > with generic/274, it will be solved by the AG reservation > code that currently sits in the reflink patchset. > - assert fails on generic/299. This is another ENOSPC test, > but we haven't got to the bottom of this failure yet. > > There are still some pending code cleanups as a result of review; > these don't affect operation or the on-disk format, so they will be > merged when they are done and tested. I expect we'll end up doing a > -rc2 or -rc3 update with the bug fixes and tweaks we accumulate over > the next week or two. > > The plan now is to leave this in for-next for the next two > days. If no showstoppers are reported, I will send Linus a pull > request for this code, and hopefully he'll merge it. Ultimately > merging will be his call because we are /very/ late in the cycle > with this. > > It would be a good idea for anyone who has a spare cycle or two to > build rmap enabled filesysetms and smoke test them through xfstests > on their test machines in the next couple of days. Darrick's latest > userspace tree is at https://github.com/djwong/xfsprogs.git, and > IIRC I've been using the "djwong-devel" branch for testing. Darrick > can clarify which is best to use at this point. https://github.com/djwong/xfsprogs/tree/for-dave-for-4.8 This is xfsprogs#for-next with just the reverse mapping patches applied. The last patch is a little sloppy, but it does add agf_rmap_blocks support to the three tools that really need it. As a warning to anyone who's been testing rmap/reflink filesystems, we're adding two fields to the AGF to track the # of blocks used by the rmap and refcount trees, which is an on-disk format change. The familiar -devel/-experimental/-wtf trees haven't been updated to reflect this and probably won't until after the merge window closes. --D > If anyone has any questions or problems then send mail to the list > or grab djwong or myself on the #xfs channel on freenode. > > -Dave. > > The new head of the for-next branch is commit: > > 3481b68 xfs: move (and rename) the deferred bmap-free tracepoints > > New Commits: > > Darrick J. Wong (52): > [0facef7] xfs: in _attrlist_by_handle, copy the cursor back to userspace > [3dadf90] xfs: fix attr shortform structure alignment on cris > [f4a0660] xfs: fix locking of the rt bitmap/summary inodes > [0d30979] xfs: set *stat=1 after iroot realloc > [e5821e5] xfs: during btree split, save new block key & ptr for future insertion > [70b2265] xfs: add function pointers for get/update keys to the btree > [2c813ad] xfs: support btrees with overlapping intervals for keys > [105f7d8] xfs: introduce interval queries on btrees > [28a8956] xfs: refactor btree owner change into a separate visit-blocks function > [4e0cc29] xfs: move deferred operations into a separate file > [3cd48ab] xfs: add tracepoints for the deferred ops mechanism > [bba61cb] xfs: clean up typedef usage in the EFI/EFD handling code > [9749fee] xfs: enable the xfs_defer mechanism to process extents to free > [3ab78df] xfs: rework xfs_bmap_free callers to use xfs_defer_ops > [310a75a] xfs: change xfs_bmap_{finish,cancel,init,free} -> xfs_defer_* > [2c3234d] xfs: rename flist/free_list to dfops > [dc42375] xfs: refactor redo intent item processing > [ba9e780] xfs: add tracepoints and error injection for deferred extent freeing > [df3954f] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt > [b870494] xfs: introduce rmap btree definitions > [00f4e4f] xfs: add rmap btree stats infrastructure > [8018026] xfs: rmap btree add more reserved blocks > [340785c] xfs: add owner field to extent allocation and freeing > [673930c] xfs: introduce rmap extent operation stubs > [035e00a] xfs: define the on-disk rmap btree format > [e70d829] xfs: add rmap btree growfs support > [fa30f03] xfs: rmap btree transaction reservations > [5254885] xfs: rmap btree requires more reserved free space > [4b8ed67] xfs: add rmap btree operations > [cfed56a] xfs: support overlapping intervals in the rmap btree > [c543838] xfs: teach rmapbt to support interval queries > [aa966d8] xfs: add tracepoints for the rmap functions > [0a1b0b3] xfs: add an extent to the rmap btree > [f922cd9] xfs: remove an extent from the rmap btree > [fb7d926] xfs: convert unwritten status of reverse mappings > [abf0923] xfs: add rmap btree insert and delete helpers > [5880f2d7] xfs: create rmap update intent log items > [9e88b5d] xfs: log rmap intent items > [f8dbebe] xfs: enable the xfs_defer mechanism to process rmaps to update > [9c19464] xfs: propagate bmap updates to rmapbt > [5d650e9] xfs: add rmap btree geometry feature flag > [a650e8f] xfs: add rmap btree block detection to log recovery > [2b0eeb5] xfs: disable XFS_IOC_SWAPEXT when rmap btree is enabled > [04f1306] xfs: don't update rmapbt when fixing agfl > [1c0607a] xfs: enable the rmap btree functionality > [973b831] xfs: remove the get*keys and update_keys btree ops pointers > [1f704b2] xfs: remove unnecesary lshift/rshift key initialization > [c1d22ae] xfs: in btree_lshift, only allocate temporary cursor when needed > [722e251] xfs: remove the extents array from the rmap update done log item > [e127faf] xfs: remove unnecessary parentheses from log redo item recovery functions > [51ce9d0] xfs: collapse single use static functions > [3481b68] xfs: move (and rename) the deferred bmap-free tracepoints > > > Code Diffstat: > > fs/xfs/Makefile | 5 + > fs/xfs/libxfs/xfs_alloc.c | 149 ++++- > fs/xfs/libxfs/xfs_alloc.h | 52 +- > fs/xfs/libxfs/xfs_alloc_btree.c | 12 - > fs/xfs/libxfs/xfs_attr.c | 71 +-- > fs/xfs/libxfs/xfs_attr_leaf.c | 4 +- > fs/xfs/libxfs/xfs_attr_remote.c | 19 +- > fs/xfs/libxfs/xfs_bmap.c | 241 +++---- > fs/xfs/libxfs/xfs_bmap.h | 54 +- > fs/xfs/libxfs/xfs_bmap_btree.c | 32 +- > fs/xfs/libxfs/xfs_btree.c | 914 ++++++++++++++++++++++----- > fs/xfs/libxfs/xfs_btree.h | 88 ++- > fs/xfs/libxfs/xfs_da_btree.c | 6 +- > fs/xfs/libxfs/xfs_da_btree.h | 4 +- > fs/xfs/libxfs/xfs_da_format.h | 1 + > fs/xfs/libxfs/xfs_defer.c | 463 ++++++++++++++ > fs/xfs/libxfs/xfs_defer.h | 97 +++ > fs/xfs/libxfs/xfs_dir2.c | 15 +- > fs/xfs/libxfs/xfs_dir2.h | 8 +- > fs/xfs/libxfs/xfs_format.h | 131 +++- > fs/xfs/libxfs/xfs_fs.h | 1 + > fs/xfs/libxfs/xfs_ialloc.c | 23 +- > fs/xfs/libxfs/xfs_ialloc.h | 2 +- > fs/xfs/libxfs/xfs_ialloc_btree.c | 18 +- > fs/xfs/libxfs/xfs_inode_buf.c | 1 + > fs/xfs/libxfs/xfs_log_format.h | 63 +- > fs/xfs/libxfs/xfs_rmap.c | 1399 +++++++++++++++++++++++++++++++++++++++++ > fs/xfs/libxfs/xfs_rmap.h | 209 ++++++ > fs/xfs/libxfs/xfs_rmap_btree.c | 511 +++++++++++++++ > fs/xfs/libxfs/xfs_rmap_btree.h | 61 ++ > fs/xfs/libxfs/xfs_sb.c | 9 + > fs/xfs/libxfs/xfs_shared.h | 2 + > fs/xfs/libxfs/xfs_trans_resv.c | 62 +- > fs/xfs/libxfs/xfs_trans_resv.h | 10 - > fs/xfs/libxfs/xfs_types.h | 4 +- > fs/xfs/xfs_bmap_util.c | 139 +--- > fs/xfs/xfs_bmap_util.h | 4 +- > fs/xfs/xfs_discard.c | 2 +- > fs/xfs/xfs_dquot.c | 13 +- > fs/xfs/xfs_error.h | 6 +- > fs/xfs/xfs_extfree_item.c | 69 ++ > fs/xfs/xfs_extfree_item.h | 3 + > fs/xfs/xfs_filestream.c | 3 +- > fs/xfs/xfs_fsops.c | 106 +++- > fs/xfs/xfs_inode.c | 99 +-- > fs/xfs/xfs_inode.h | 4 +- > fs/xfs/xfs_ioctl.c | 6 + > fs/xfs/xfs_iomap.c | 31 +- > fs/xfs/xfs_log_recover.c | 336 +++++++--- > fs/xfs/xfs_mount.c | 7 +- > fs/xfs/xfs_mount.h | 6 + > fs/xfs/xfs_ondisk.h | 3 + > fs/xfs/xfs_rmap_item.c | 536 ++++++++++++++++ > fs/xfs/xfs_rmap_item.h | 95 +++ > fs/xfs/xfs_rtalloc.c | 11 +- > fs/xfs/xfs_stats.c | 1 + > fs/xfs/xfs_stats.h | 18 +- > fs/xfs/xfs_super.c | 30 +- > fs/xfs/xfs_symlink.c | 25 +- > fs/xfs/xfs_trace.c | 2 + > fs/xfs/xfs_trace.h | 374 +++++++++++ > fs/xfs/xfs_trans.h | 26 +- > fs/xfs/xfs_trans_extfree.c | 215 +++++-- > fs/xfs/xfs_trans_rmap.c | 271 ++++++++ > 64 files changed, 6267 insertions(+), 915 deletions(-) > create mode 100644 fs/xfs/libxfs/xfs_defer.c > create mode 100644 fs/xfs/libxfs/xfs_defer.h > create mode 100644 fs/xfs/libxfs/xfs_rmap.c > create mode 100644 fs/xfs/libxfs/xfs_rmap.h > create mode 100644 fs/xfs/libxfs/xfs_rmap_btree.c > create mode 100644 fs/xfs/libxfs/xfs_rmap_btree.h > create mode 100644 fs/xfs/xfs_rmap_item.c > create mode 100644 fs/xfs/xfs_rmap_item.h > create mode 100644 fs/xfs/xfs_trans_rmap.c > -- > Dave Chinner > david@fromorbit.com > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Wed Aug 3 17:08:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1A8367CA1 for ; Wed, 3 Aug 2016 17:08:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B61A7304053 for ; Wed, 3 Aug 2016 15:08:09 -0700 (PDT) X-ASG-Debug-ID: 1470262087-0bf8157e6a41f490001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id FaEsSFEEM9ft5AHL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 15:08:07 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73M85PT001587 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:08:05 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73M84Ah021031 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:08:05 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u73M81ST004709; Wed, 3 Aug 2016 22:08:03 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 15:08:01 -0700 Date: Wed, 3 Aug 2016 15:08:00 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test Message-ID: <20160803220800.GR8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 06/17] xfs: run xfs_repair at the end of each test References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> <20160803091542.GM27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803091542.GM27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470262087 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4375 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 05:15:42PM +0800, Eryu Guan wrote: > On Thu, Jul 21, 2016 at 04:46:54PM -0700, Darrick J. Wong wrote: > > Run xfs_repair twice at the end of each test -- once to rebuild > > the btree indices, and again with -n to check the rebuild work. > > Seems like it's two more xfs_repair, three in total :) Ok, how about this new commit message? "xfs: optionally test xfs_repair index rebuilding at the end of each test "Run xfs_repair twice more at the end of each test -- once to rebuild the btree indices, and again with -n to check the rebuild work. This is in addition to the regular dry-run spot check." > > Signed-off-by: Darrick J. Wong > > --- > > README | 4 ++++ > > common/rc | 30 ++++++++++++++++++++++++++++++ > > 2 files changed, 34 insertions(+) > > > > > > diff --git a/README b/README > > index 2647e12..4509cc1 100644 > > --- a/README > > +++ b/README > > @@ -80,6 +80,10 @@ Preparing system for tests (IRIX and Linux): > > added to the end of fsstresss and fsx invocations, respectively, > > in case you wish to exclude certain operational modes from these > > tests. > > + - set TEST_XFS_REPAIR_REBUILD=1 to have _check_xfs_filesystem > > + run xfs_repair -n to check the filesystem; xfs_repair to rebuild > > + metadata indexes; and xfs_repair -n (a third time) to check the > > + results of the rebuilding. > > > > - or add a case to the switch in common/config assigning > > these variables based on the hostname of your test > > diff --git a/common/rc b/common/rc > > index 7c79bf8..3b45578 100644 > > --- a/common/rc > > +++ b/common/rc > > @@ -2428,6 +2428,36 @@ _check_xfs_filesystem() > > ok=0 > > fi > > > > + if [ -n "$TEST_XFS_REPAIR_REBUILD" ]; then > > + $XFS_REPAIR_PROG -n $extra_options $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 > > + if [ $? -ne 0 ] > > + then > > + echo "_check_xfs_filesystem: filesystem on $device is inconsistent (r) (see $seqres.full)" > > + > > + echo "_check_xfs_filesystem: filesystem on $device is inconsistent" >>$seqres.full > > + echo "*** xfs_repair -n output ***" >>$seqres.full > > + cat $tmp.repair | _fix_malloc >>$seqres.full > > + echo "*** end xfs_repair output" >>$seqres.full > > + > > + ok=0 > > + fi > > + rm -f $tmp.fs_check $tmp.logprint $tmp.repair > > + > > + $XFS_REPAIR_PROG $extra_options $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 > > + if [ $? -ne 0 ] > > + then > > + echo "_check_xfs_filesystem: filesystem on $device is inconsistent (r) (see $seqres.full)" > > + > > + echo "_check_xfs_filesystem: filesystem on $device is inconsistent" >>$seqres.full > > + echo "*** xfs_repair -n output ***" >>$seqres.full > > + cat $tmp.repair | _fix_malloc >>$seqres.full > > + echo "*** end xfs_repair output" >>$seqres.full > > + > > + ok=0 > > + fi > > + rm -f $tmp.fs_check $tmp.logprint $tmp.repair > > + fi > > + > > I think we can move this hunk after the original xfs_repair and swap the > xfs_repair order, i.e. > > xfs_repair -n # this is the original repair check > if ; then > xfs_repair # do rebuild without -n > xfs_repair -n # check rebuild result > fi Ok. > This seems more clear to me and we can mark which repair is failing more > easily (right now the three xfs_repairs are all marked as "(r)", it's > hard to say which one is failing), e.g. > > xfs_repair -n # marked as "(r)", means "repair" > if ; then > xfs_repair # mark as "(rb)", means "rebuild"? > xfs_repair -n # mark as "(rr)", means "repair rebuild"? We might as well use a full word to state which repair run failed. "filesystem on /dev/sdX is inconsistent (rebuild)" "filesystem on /dev/sdX is inconsistent (rebuild-reverify)" --D > fi > > Thanks, > Eryu > > > $XFS_REPAIR_PROG -n $extra_options $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 > > if [ $? -ne 0 ] > > then > > From darrick.wong@oracle.com Wed Aug 3 17:09:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9602B7CA1 for ; Wed, 3 Aug 2016 17:09:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 687F9304053 for ; Wed, 3 Aug 2016 15:09:46 -0700 (PDT) X-ASG-Debug-ID: 1470262184-0bf57c13683381a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id B2Ip9F94UHIQYDIm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 15:09:44 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73M9hk5002872 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:09:43 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73M9gM4024423 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:09:43 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u73M9gIb029740; Wed, 3 Aug 2016 22:09:42 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 15:09:41 -0700 Date: Wed, 3 Aug 2016 15:09:40 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 07/17] xfs/128: cycle_mount the scratch device, not the test device Message-ID: <20160803220940.GS8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 07/17] xfs/128: cycle_mount the scratch device, not the test device References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914482100.11762.3197784490090678443.stgit@birch.djwong.org> <20160803093755.GN27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803093755.GN27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470262184 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2674 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 05:37:55PM +0800, Eryu Guan wrote: > On Thu, Jul 21, 2016 at 04:47:01PM -0700, Darrick J. Wong wrote: > > This test uses the scratch device, so cycle that, not the test dev. > > This is also a xfs_fsr test, so put it in the fsr group. > > > > Signed-off-by: Darrick J. Wong > > --- > > tests/xfs/128 | 7 ++++--- > > tests/xfs/group | 2 +- > > 2 files changed, 5 insertions(+), 4 deletions(-) > > > > > > diff --git a/tests/xfs/128 b/tests/xfs/128 > > index 8758d7e..2e756d5 100755 > > --- a/tests/xfs/128 > > +++ b/tests/xfs/128 > > @@ -66,7 +66,7 @@ _pwrite_byte 0x61 0 $((blks * blksz)) $testdir/file1 >> $seqres.full > > _cp_reflink $testdir/file1 $testdir/file2 > > _cp_reflink $testdir/file2 $testdir/file3 > > _cp_reflink $testdir/file3 $testdir/file4 > > -_test_cycle_mount > > +_scratch_cycle_mount > > free_blocks1=$(stat -f $testdir -c '%f') > > > > md5sum $testdir/file1 | _filter_scratch > > @@ -82,7 +82,7 @@ c04=$(_md5_checksum $testdir/file4) > > echo "CoW the reflink copies" > > _pwrite_byte 0x62 $blksz $blksz $testdir/file2 >> $seqres.full > > _pwrite_byte 0x63 $(( blksz * (blks - 1) )) $blksz $testdir/file3 >> $seqres.full > > -_test_cycle_mount > > +_scratch_cycle_mount > > free_blocks2=$(stat -f $testdir -c '%f') > > > > md5sum $testdir/file1 | _filter_scratch > > @@ -97,11 +97,12 @@ c14=$(_md5_checksum $testdir/file4) > > > > echo "Defragment" > > lsattr -l $testdir/ | _filter_scratch | _filter_spaces > > +filefrag -v $testdir/file* >> $seqres.full > > Is this intentional? Use $FILEFRAG_PROG instead and add > > _require_command "$FILEFRAG_PROG" "filefrag" > > at the beginning of the test? Oops, that was a mistake. Good catch! --D > > Thanks, > Eryu > > > $XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full > > $XFS_FSR_PROG -v -d $testdir/file2 >> $seqres.full # fsr probably breaks the link > > $XFS_FSR_PROG -v -d $testdir/file3 >> $seqres.full # fsr probably breaks the link > > $XFS_FSR_PROG -v -d $testdir/file4 >> $seqres.full # fsr probably ignores this file > > -_test_cycle_mount > > +_scratch_cycle_mount > > free_blocks3=$(stat -f $testdir -c '%f') > > > > md5sum $testdir/file1 | _filter_scratch > > diff --git a/tests/xfs/group b/tests/xfs/group > > index aa3b3ec..5ccf3d6 100644 > > --- a/tests/xfs/group > > +++ b/tests/xfs/group > > @@ -125,7 +125,7 @@ > > 125 fuzzers > > 126 fuzzers > > 127 auto quick clone > > -128 auto quick clone > > +128 auto quick clone fsr > > 129 auto quick clone > > 130 fuzzers clone > > 131 auto quick clone > > From darrick.wong@oracle.com Wed Aug 3 17:14:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 223D47CA1 for ; Wed, 3 Aug 2016 17:14:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8ABC2AC002 for ; Wed, 3 Aug 2016 15:14:08 -0700 (PDT) X-ASG-Debug-ID: 1470262445-0bf57b369b395f30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 0HxW8B0hHtIi8h2a (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 15:14:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73ME4XK007621 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:14:04 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73ME3J7002515 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:14:03 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u73ME226031426; Wed, 3 Aug 2016 22:14:03 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 15:14:02 -0700 Date: Wed, 3 Aug 2016 15:14:01 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 09/17] common/dmerror: fix mount option issues Message-ID: <20160803221401.GT8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 09/17] common/dmerror: fix mount option issues References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> <20160803103800.GO27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803103800.GO27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470262446 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1341 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 06:38:00PM +0800, Eryu Guan wrote: > On Thu, Jul 21, 2016 at 04:47:13PM -0700, Darrick J. Wong wrote: > > Calling _mount doesn't work when we want to add mount options > > such as realtime devices. Since it's just a normal scratch device > > mount except for the source device, just call _scratch_mount with > > SCRATCH_DEV set to the dmerror device. > > > > Signed-off-by: Darrick J. Wong > > --- > > common/dmerror | 7 +------ > > 1 file changed, 1 insertion(+), 6 deletions(-) > > > > > > diff --git a/common/dmerror b/common/dmerror > > index 5ad9994..22b9ea9 100644 > > --- a/common/dmerror > > +++ b/common/dmerror > > @@ -41,14 +41,9 @@ _dmerror_init() > > DMERROR_TABLE="0 $blk_dev_size error $dm_backing_dev 0" > > } > > > > -_dmerror_mount_options() > > -{ > > - echo `_common_dev_mount_options $*` $DMERROR_DEV $SCRATCH_MNT > > -} > > - > > _dmerror_mount() > > { > > - _mount -t $FSTYP `_dmerror_mount_options $*` > > + SCRATCH_DEV=$DMERROR_DEV _scratch_mount $* > > Perhaps you can add "_scratch_options mount" to _dmerror_mount then > mount with $SCRATCH_OPTIONS? Like what _mount_delay does in > common/dmdelay. Oh, yeah, that makes sense. --D > > Thanks, > Eryu > > > } > > > > _dmerror_unmount() > > From david@fromorbit.com Wed Aug 3 17:26:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 04DD17CA1 for ; Wed, 3 Aug 2016 17:26:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C9A2C304048 for ; Wed, 3 Aug 2016 15:26:21 -0700 (PDT) X-ASG-Debug-ID: 1470263178-0bf57b369b3965e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vccVNTK9MasbH81V for ; Wed, 03 Aug 2016 15:26:19 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D4DgD0bqJXIMmOLHldg0WBUoZynSkGjGCKGYYXBAICgUxNAQEBAQEBBwEBAQEBAThAhF4BAQQBJxMcIwULCAMOCgkaCw8FJQMHGhOIKQe/WAELJR6FRIUVhCeFVx0BBIgehy2JaY51gXWNVUiGHIVMg3eDGYFHKjKHFoFEAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Aug 2016 07:56:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bV4cC-00016l-Im; Thu, 04 Aug 2016 08:26:16 +1000 Date: Thu, 4 Aug 2016 08:26:16 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [current tot] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 Message-ID: <20160803222616.GU16044@dastard> X-ASG-Orig-Subj: Re: [current tot] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 References: <20160803061430.GS16044@dastard> <20160803144454.GA17518@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803144454.GA17518@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1470263178 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 767 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 03, 2016 at 10:44:55AM -0400, Brian Foster wrote: > On Wed, Aug 03, 2016 at 04:14:30PM +1000, Dave Chinner wrote: > > Hi Brian, > > > > It seems I can hit this fairly often on a single CPU, 1GB ram VM > > in generic/306: > > > > I ended up reproducing on a similarly configured vm via xfs/305 > (generic/306 appears unrelated to quota..?). Ugh, don't know how I screwed that up. Yes, it was xfs/305 that triggered it here. Maybe it was generic/306 that triggered the inode reclaim variant of the problem.... Anyway, not important now... > Agreed. I'll fire off a patch. Thanks for catching this. I'll pull it in and add to the list of things for the next -rc update. Cheers, Dave. -- Dave Chinner david@fromorbit.com From zwisler@gmail.com Wed Aug 3 17:33:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9BC767CA1 for ; Wed, 3 Aug 2016 17:33:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E2536AC003 for ; Wed, 3 Aug 2016 15:33:18 -0700 (PDT) X-ASG-Debug-ID: 1470263595-0bf57c1369339150001-NocioJ Received: from mail-qk0-f195.google.com (mail-qk0-f195.google.com [209.85.220.195]) by cuda.sgi.com with ESMTP id bJDVrTLhrpCXBt7m (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 03 Aug 2016 15:33:16 -0700 (PDT) X-Barracuda-Envelope-From: zwisler@gmail.com X-Barracuda-Effective-Source-IP: mail-qk0-f195.google.com[209.85.220.195] X-Barracuda-Apparent-Source-IP: 209.85.220.195 Received: by mail-qk0-f195.google.com with SMTP id x185so1720842qkc.3 for ; Wed, 03 Aug 2016 15:33:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=u+Vmag54dlg5K678ERw13ptreUrxzTE//UQqfGabRf8=; b=wzhcS3QVd4/XMyVBdD2ts4MQ9DwkUtaISdfi+kwebSpuorTqzdEbcXc0EOz5wVjNBC lz9h6Py/j8D9+owaYwlHf1xrVqNApkHBJwMiN4re93tSBHst5eNy6zZJqie752Gtxo+9 5gBhXnLAlsiVIvgSbfFjCqDKJqu337SQJq8+XKb+dkg5oKCfZLVfz3eafmqo/E8iqT9I D4T1Wr9ZT+X0XnR8sj4nDHVr608S9H72vhmeJ9utMNz4ZV0LdO0Sg9Jb9o97NEwoS/Ar r7Ril4dQlZakJDqSPENeito0mYzzCOGBWR5WBp3gBiSTxDf96b3LRAsbzF4eFihN3wO4 H67w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=u+Vmag54dlg5K678ERw13ptreUrxzTE//UQqfGabRf8=; b=IHqXG+b7FBhbBcTL06MloUosG+FzjF0dL3wC2tW4SlH80ntyXrJzXHgUDCSFPe7Wan 781zpZSZyehYTBC4WV6am3BZ/BNjapev3GCMfbZHwwo4RFF8Ot7PzuhiB/vhBlIXjS3C JuTuTebmybgzC/UE1vhdrILuFdITknd/zNxpXcxO9uUcVSCriPz/ulR7k81eTheyDb29 kQmFGPXI/5vTWGzLtHp8cT+sRir1uvooPUDkV1zkGQOEx09BXC5N3piZrcLPY+8XIlA+ k/C0kXyNo+ZSRe/RRt6ffXZ0CVmGld6R8cBoVPCmZmpUpRizQfUGe/xo2d3fuNiY4+Il fCMg== X-Gm-Message-State: AEkoousunh/tLN6Zr0gvYX3RfJlCXYFPigeeJf4zG4KBFxCf9ffT8DnUFP0CnraE2u99g/tq0eeiiCmcqqhC7A== X-Received: by 10.55.39.81 with SMTP id n78mr2885154qkn.10.1470263595467; Wed, 03 Aug 2016 15:33:15 -0700 (PDT) MIME-Version: 1.0 Received: by 10.55.54.9 with HTTP; Wed, 3 Aug 2016 15:33:15 -0700 (PDT) In-Reply-To: <1465155145-10812-38-git-send-email-mchristi@redhat.com> References: <1465155145-10812-1-git-send-email-mchristi@redhat.com> <1465155145-10812-38-git-send-email-mchristi@redhat.com> From: Ross Zwisler Date: Wed, 3 Aug 2016 16:33:15 -0600 Message-ID: Subject: Re: [PATCH 37/45] drivers: use req op accessor To: Mike Christie , Ross Zwisler , Dave Chinner , axboe@fb.com X-ASG-Orig-Subj: Re: [PATCH 37/45] drivers: use req op accessor Cc: linux-f2fs-devel@lists.sourceforge.net, linux-ext4 , konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel , linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, LKML , linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, XFS Developers , ocfs2-devel@oss.oracle.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qk0-f195.google.com[209.85.220.195] X-Barracuda-Start-Time: 1470263596 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3472 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sun, Jun 5, 2016 at 1:32 PM, wrote: > From: Mike Christie > > The req operation REQ_OP is separated from the rq_flag_bits > definition. This converts the block layer drivers to > use req_op to get the op from the request struct. > > Signed-off-by: Mike Christie > --- > drivers/block/loop.c | 6 +++--- > drivers/block/mtip32xx/mtip32xx.c | 2 +- > drivers/block/nbd.c | 2 +- > drivers/block/rbd.c | 4 ++-- > drivers/block/xen-blkfront.c | 8 +++++--- > drivers/ide/ide-floppy.c | 2 +- > drivers/md/dm.c | 2 +- > drivers/mmc/card/block.c | 7 +++---- > drivers/mmc/card/queue.c | 6 ++---- Dave Chinner reported a deadlock with XFS + DAX, which I reproduced and bisected to this commit: commit c2df40dfb8c015211ec55f4b1dd0587f875c7b34 Author: Mike Christie Date: Sun Jun 5 14:32:17 2016 -0500 drivers: use req op accessor Here are the steps to reproduce the deadlock with a BRD ramdisk: mkfs.xfs -f /dev/ram0 mount -o dax /dev/ram0 /mnt/scratch xfs_io -f -c "truncate 1g" /mnt/scratch/test.img losetup -f --show /mnt/scratch/test.img mkfs.xfs -f /dev/loop0 At this point the mkfs.xfs deadlocks. Here is the stack trace gathered via "echo w > /proc/sysrq-trigger" and passed through kasan_symbolize.py: brd: module loaded XFS (ram0): DAX enabled. Warning: EXPERIMENTAL, use at your own risk XFS (ram0): Mounting V5 Filesystem XFS (ram0): Ending clean mount sysrq: SysRq : Show Blocked State task PC stack pid father mkfs.xfs D ffff88060ae47b38 0 1482 1287 0x00000000 ffff88060ae47b38 00000000000079e8 ffff880610fd8d98 ffff880036011a40 ffff8800aa6dcec0 ffff88060ae48000 ffff880610fd8d80 7fffffffffffffff ffff8800aa6dcec0 00000000024000c0 ffff88060ae47b50 ffffffff81aca775 Call Trace: [] schedule+0x35/0x80 kernel/sched/core.c:3360 [] schedule_timeout+0x271/0x460 kernel/time/timer.c:1493 [] io_schedule_timeout+0xa4/0x110 kernel/sched/core.c:4969 [< inline >] do_wait_for_common kernel/sched/completion.c:75 [< inline >] __wait_for_common kernel/sched/completion.c:93 [< inline >] wait_for_common_io kernel/sched/completion.c:107 [] wait_for_completion_io+0xdf/0x120 kernel/sched/completion.c:155 [] submit_bio_wait+0x66/0x90 block/bio.c:870 [] blkdev_issue_discard+0x86/0xc0 block/blk-lib.c:115 [] blk_ioctl_discard+0xa3/0xd0 block/ioctl.c:221 [] blkdev_ioctl+0x60a/0x9e0 block/ioctl.c:510 [] block_ioctl+0x43/0x50 fs/block_dev.c:1714 [< inline >] vfs_ioctl fs/ioctl.c:43 [] do_vfs_ioctl+0xa2/0x6a0 fs/ioctl.c:674 [< inline >] SYSC_ioctl fs/ioctl.c:689 [] SyS_ioctl+0x79/0x90 fs/ioctl.c:680 [] entry_SYSCALL_64_fastpath+0x1f/0xbd arch/x86/entry/entry_64.S:207 The line numbers are for the commit above, not for linux/master. This occurs 100% as of this commit, and 0% with the previous commit. This doesn't occur if you don't use DAX, but based on the content of the commit I'm guessing that difference is due to variations in the way the two paths use discard. - Ross From david@fromorbit.com Wed Aug 3 17:34:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F2D3F7CA1 for ; Wed, 3 Aug 2016 17:34:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9869F304048 for ; Wed, 3 Aug 2016 15:34:01 -0700 (PDT) X-ASG-Debug-ID: 1470263638-0bf8157e6b420640001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id NeM7PISiLrdvEYf7 for ; Wed, 03 Aug 2016 15:33:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BNOwA+cKJXIMmOLHldg0WBA0+Gcp0qBoxghg2EDIYXAgIBAQKBTE0BAQEBAQEHAQEBAQEBOECEXgEBBTocIxAIAw4HAwklDwUlAwcaE4gwv1cBAQEHAgEkHoVEhRWEEA2FYR0FmTSOdYF1iAyFSYZkhUyDd4RgKjKHFQElgR8BAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Aug 2016 08:02:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bV4iQ-00017K-4P; Thu, 04 Aug 2016 08:32:42 +1000 Date: Thu, 4 Aug 2016 08:32:42 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't invalidate whole file on DAX read/write Message-ID: <20160803223242.GV16044@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't invalidate whole file on DAX read/write References: <1470181226-20935-1-git-send-email-david@fromorbit.com> <20160803153437.GC4576@quack2.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803153437.GC4576@quack2.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1470263638 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2871 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 03, 2016 at 05:34:37PM +0200, Jan Kara wrote: > On Wed 03-08-16 09:40:26, Dave Chinner wrote: > > From: Dave Chinner > > > > When we do DAX IO, we try to invalidate the entire page cache held > > on the file. This is incorrect as it will trash the entire mapping > > tree that now tracks dirty state in exceptional entries in the radix > > tree slots. > > > > What we are trying to do is remove cached pages (e.g from reads > > into holes) that sit in the radix tree over the range we are about > > to write to. Hence we should just limit the invalidation to the > > range we are about to overwrite. > > The patch looks good. Just one comment below. > > > > > Reported-by: Jan Kara > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_file.c | 13 ++++++++++++- > > 1 file changed, 12 insertions(+), 1 deletion(-) > > > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > index ed95e5b..e612a02 100644 > > --- a/fs/xfs/xfs_file.c > > +++ b/fs/xfs/xfs_file.c > > @@ -741,9 +741,20 @@ xfs_file_dax_write( > > * page is inserted into the pagecache when we have to serve a write > > * fault on a hole. It should never be dirtied and can simply be > > * dropped from the pagecache once we get real data for the page. > > + * > > + * XXX: This is racy against mmap, and there's nothing we can do about > > + * it. dax_do_io() should really do this invalidation internally as > > + * it will know if we've allocated over a holei for this specific IO and > > + * if so it needs to update the mapping tree and invalidate existing > > + * PTEs over the newly allocated range. Remove this invalidation when > > + * dax_do_io() is fixed up. > > And would it be OK for XFS if dax_do_io() actually invalidated page cache / > PTEs under just XFS_IOLOCK_SHARED? Because currently you seem to be careful > to call invalidate_inode_pages2() only when holding the lock exclusively > and then demote it to a shared one when calling dax_do_io(). That really only exists to prevent multiple IOs trying to do invalidation at once. In the direct IO code, we don't want multiple page cache flushers running at once - one is enough - so we serialise on that state knowing that once the invalidation is done the remaining EXCL lock waiters will pass straight through. For DAX, I don't think that's a problem - the invalidation is ranged, and it's unlikely there will be overlaps, and mapping/pte invalidation is done under fine grained locks so we don't have to worry about races there, either. So it seems fine to me to do this under a SHARED lock. It will still serialise against truncate and other extent manipulation operations, and that's mainly what we care about here. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ross.zwisler@linux.intel.com Wed Aug 3 17:37:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D02917CA1 for ; Wed, 3 Aug 2016 17:37:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 365F0AC003 for ; Wed, 3 Aug 2016 15:37:16 -0700 (PDT) X-ASG-Debug-ID: 1470263834-0bf57c13673393a0001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id mmvrEc3k4INytdLW for ; Wed, 03 Aug 2016 15:37:14 -0700 (PDT) X-Barracuda-Envelope-From: ross.zwisler@linux.intel.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.120] X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP; 03 Aug 2016 15:37:15 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,467,1464678000"; d="scan'208";a="1029303712" Received: from theros.lm.intel.com (HELO linux.intel.com) ([10.232.112.65]) by orsmga002.jf.intel.com with ESMTP; 03 Aug 2016 15:37:13 -0700 Date: Wed, 3 Aug 2016 16:37:13 -0600 From: Ross Zwisler To: Ross Zwisler , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-nvdimm@lists.01.org Subject: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Message-ID: <20160803223713.GA22364@linux.intel.com> X-ASG-Orig-Subj: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Mail-Followup-To: Ross Zwisler , Dave Chinner , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-nvdimm@lists.01.org References: <20160803003354.GP16044@dastard> <20160803171127.GA15876@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803171127.GA15876@linux.intel.com> User-Agent: Mutt/1.6.2 (2016-07-01) X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1470263834 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3068 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 03, 2016 at 11:11:27AM -0600, Ross Zwisler wrote: > On Wed, Aug 03, 2016 at 10:33:54AM +1000, Dave Chinner wrote: > > Hi folks, > > > > Just hit a reproducable hang in generic/361. Essentially this on > > a 8GB pmem device: > > > > mkfs.xfs -f /dev/pmem1 > > mount -o dax /dev/pmem1 /mnt/scratch > > xfs_io -f -c "truncate 1g" test.img > > losetup -f --show /mnt/scratch/test.img > > mkfs.xfs -f /dev/loop0 > > > > And the mkfs.xfs command hangs with a discard that never completes: > > > > [ 243.413918] INFO: task mkfs.xfs:5708 blocked for more than 120 seconds. > > [ 243.415678] Not tainted 4.7.0-dgc+ #862 > > [ 243.416772] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > > [ 243.418769] mkfs.xfs D ffff880835143c18 13848 5708 5441 0x00000000 > > [ 243.420620] ffff880835143c18 ffff880835143c20 ffff88083a244780 ffff8808358ba3c0 > > [ 243.422636] ffff88023aa20000 ffff880835144000 7fffffffffffffff 7fffffffffffffff > > [ 243.424586] ffff8808358ba3c0 00000000024000c0 ffff880835143c30 ffffffff81e5e38c > > [ 243.426466] Call Trace: > > [ 243.427050] [] schedule+0x3c/0x90 > > [ 243.428224] [] schedule_timeout+0x265/0x330 > > [ 243.429563] [] ? kvm_clock_read+0x25/0x40 > > [ 243.430896] [] ? kvm_clock_get_cycles+0x9/0x10 > > [ 243.432360] [] ? ktime_get+0x3c/0xb0 > > [ 243.433556] [] io_schedule_timeout+0xa4/0x110 > > [ 243.434932] [] wait_for_completion_io+0xd6/0x110 > > [ 243.436297] [] ? wake_up_q+0x70/0x70 > > [ 243.437436] [] submit_bio_wait+0x56/0x70 > > [ 243.438671] [] blkdev_issue_discard+0x6a/0xb0 > > [ 243.439980] [] ? __might_sleep+0x49/0x80 > > [ 243.441182] [] blk_ioctl_discard+0x97/0xb0 > > [ 243.442370] [] blkdev_ioctl+0x7eb/0x9a0 > > [ 243.443485] [] block_ioctl+0x3d/0x50 > > [ 243.444552] [] do_vfs_ioctl+0x8f/0x670 > > [ 243.445630] [] ? exit_to_usermode_loop+0x94/0xb0 > > [ 243.446902] [] SyS_ioctl+0x79/0x90 > > [ 243.447927] [] ? syscall_return_slowpath+0xf5/0x190 > > [ 243.449236] [] entry_SYSCALL_64_fastpath+0x1a/0xa4 > > > > This only reproduces when the underlying filesystem is mounted with > > -o dax, so there is a bad interaction with loop devices and DAX > > occurring somewhere. generic/361 is a recent test (committed june 14) > > so this probably hasn't actually been tested until now. > > > > I haven't got time to look at this right now, hence the report. > > Cool, thanks for the report. I've reproduced this with linux/master, and the > test passes with v4.7. > > Running a bisect... This bisected to a commit to the block layer code. I've sent a bug report to the author of the commit. - Ross From darrick.wong@oracle.com Wed Aug 3 17:43:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 560917CA1 for ; Wed, 3 Aug 2016 17:43:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 24D30304048 for ; Wed, 3 Aug 2016 15:43:18 -0700 (PDT) X-ASG-Debug-ID: 1470264194-0bf57b369b396fe0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id wLBeDW0bjHAI4qEq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 15:43:15 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73MgjKu025602 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:42:46 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73Mgjug001788 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:42:45 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u73MgiMA010463; Wed, 3 Aug 2016 22:42:44 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 15:42:43 -0700 Date: Wed, 3 Aug 2016 15:42:42 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: Re: [PATCH] xfs: test attr_list_by_handle cursor iteration Message-ID: <20160803224242.GU8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: test attr_list_by_handle cursor iteration References: <20160802235251.GB8586@birch.djwong.org> <20160803044722.GD27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803044722.GD27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470264194 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12683 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 12:47:22PM +0800, Eryu Guan wrote: > On Tue, Aug 02, 2016 at 04:52:51PM -0700, Darrick J. Wong wrote: > > Apparently the XFS attr_list_by_handle ioctl has never actually copied > > the cursor contents back to user space, which means that iteration has > > never worked. Add a test case for this and see the patch > > "xfs: in _attrlist_by_handle, copy the cursor back to userspace". > > > > Signed-off-by: Darrick J. Wong > > --- > > src/Makefile | 3 - > > src/attr-list-by-handle-cursor-test.c | 186 +++++++++++++++++++++++++++++++++ > > New test program needs an entry in .gitignore Ok. > > tests/xfs/700 | 64 +++++++++++ > > tests/xfs/700.out | 5 + > > tests/xfs/group | 1 > > 5 files changed, 258 insertions(+), 1 deletion(-) > > create mode 100644 src/attr-list-by-handle-cursor-test.c > > create mode 100755 tests/xfs/700 > > create mode 100644 tests/xfs/700.out > > > > diff --git a/src/Makefile b/src/Makefile > > index 1bf318b..ae06d50 100644 > > --- a/src/Makefile > > +++ b/src/Makefile > > @@ -20,7 +20,8 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ > > bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ > > stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ > > seek_copy_test t_readdir_1 t_readdir_2 fsync-tester nsexec cloner \ > > - renameat2 t_getcwd e4compact test-nextquota punch-alternating > > + renameat2 t_getcwd e4compact test-nextquota punch-alternating \ > > + attr-list-by-handle-cursor-test > > > > SUBDIRS = > > > > diff --git a/src/attr-list-by-handle-cursor-test.c b/src/attr-list-by-handle-cursor-test.c > > new file mode 100644 > > index 0000000..5aef79c > > --- /dev/null > > +++ b/src/attr-list-by-handle-cursor-test.c > > @@ -0,0 +1,186 @@ > > +/* > > + * Copyright (C) 2016 Oracle. All Rights Reserved. > > + * > > + * Author: Darrick J. Wong > > + * > > + * This program is free software; you can redistribute it and/or > > + * modify it under the terms of the GNU General Public License > > + * as published by the Free Software Foundation; either version 2 > > + * of the License, or (at your option) any later version. > > + * > > + * This program is distributed in the hope that it would be useful, > > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > + * GNU General Public License for more details. > > + * > > + * You should have received a copy of the GNU General Public License > > + * along with this program; if not, write the Free Software Foundation, > > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. > > + */ > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#define ATTRBUFSZ 1024 > > +#define BSTATBUF_SZ 1024 > > + > > +/* Read all the extended attributes of a file handle. */ > > +void > > +read_handle_xattrs( > > + struct xfs_handle *handle, > > + bool root_space) > > On RHEL6, stdbool.h is needed for bool. Or simply change it to int? Yes, that's sufficient. > [CC] attr-list-by-handle-cursor-test > attr-list-by-handle-cursor-test.c:38: error: expected declaration specifiers or '...' before 'bool' > attr-list-by-handle-cursor-test.c: In function 'read_handle_xattrs': > attr-list-by-handle-cursor-test.c:49: error: 'root_space' undeclared (first use in this function) > attr-list-by-handle-cursor-test.c:49: error: (Each undeclared identifier is reported only once > attr-list-by-handle-cursor-test.c:49: error: for each function it appears in.) > attr-list-by-handle-cursor-test.c: In function 'find_inode': > attr-list-by-handle-cursor-test.c:135: error: 'false' undeclared (first use in this function) > attr-list-by-handle-cursor-test.c:135: error: too many arguments to function 'read_handle_xattrs' > attr-list-by-handle-cursor-test.c:136: error: 'true' undeclared (first use in this function) > attr-list-by-handle-cursor-test.c:136: error: too many arguments to function 'read_handle_xattrs' > gmake[2]: *** [attr-list-by-handle-cursor-test] Error 1 > gmake[1]: *** [src] Error 2 > make: *** [default] Error 2 > > > +{ > > + struct attrlist_cursor cur; > > + char attrbuf[ATTRBUFSZ]; > > + char *firstname = NULL; > > + struct attrlist *attrlist = (struct attrlist *)attrbuf; > > + struct attrlist_ent *ent; > > + int i; > > + int flags = 0; > > + int error; > > + > > + if (root_space) > > + flags |= ATTR_ROOT; > > + > > + memset(&cur, 0, sizeof(cur)); > > + while ((error = attr_list_by_handle(handle, sizeof(*handle), > > + attrbuf, ATTRBUFSZ, flags, > > + &cur)) == 0) { > > + for (i = 0; i < attrlist->al_count; i++) { > > I applied the patch "xfs: in _attrlist_by_handle, copy the cursor back > to userspace" on top of 4.7-rc7 kernel and did some tests, in some cases > test failed because nothing was printed by the test program, e.g. > > # diff -u tests/xfs/700.out /root/workspace/xfstests/results//xfs_4k_crc/xfs/700.out.bad > --- tests/xfs/700.out 2016-08-03 11:32:02.502000000 +0800 > +++ /root/workspace/xfstests/results//xfs_4k_crc/xfs/700.out.bad 2016-08-03 11:34:57.018000000 +0800 > @@ -2,4 +2,3 @@ > Format and mount > Stuff file with xattrs > Run test program > -Test passes. > > Debug code shows that this is because attrlist->al_count is 0 in such > cases, so it doesn't go into the for loop. > > Failed test configs are: > > 2k block size XFS with CRC enabled > 1k block size XFS with CRC enabled > 512 block size XFS Hmmm.... apparently I was feeding the wrong inputs to BULKSTAT. Most of the time it would (eventually) return the $SCRATCH_MNT/foo inode, but occasionally it wouldn't, which caused the test not to pass. I've changed the program to use BULKSTAT_SINGLE since we only care about the one inode and it seems to work now. This also makes the program a lot less convoluted. > > + ent = ATTR_ENTRY(attrlist, i); > > + > > + if (i != 0) > > + continue; > > + > > + if (firstname == NULL) { > > + firstname = malloc(ent->a_valuelen); > > + memcpy(firstname, ent->a_name, ent->a_valuelen); > > + } else { > > + if (memcmp(firstname, ent->a_name, > > + ent->a_valuelen) == 0) > > + fprintf(stderr, > > + "Saw duplicate xattr \"%s\", buggy XFS?\n", > > + ent->a_name); > > + else > > + fprintf(stderr, > > + "Test passes.\n"); > > + goto out; > > + } > > + } > > + > > + if (!attrlist->al_more) > > + break; > > + } > > + > > +out: > > + if (firstname) > > + free(firstname); > > + if (error) > > + perror("attr_list_by_handle"); > > + return; > > +} > > + > > +/* Iterate a range of inodes. */ > > +void > > +find_inode( > > + struct xfs_handle *fshandle, > > + int fd, > > + ino_t ino) > > +{ > > + struct xfs_fsop_bulkreq bulkreq; > > + struct xfs_bstat *bstatbuf; > > + struct xfs_bstat *p; > > + struct xfs_bstat *endp; > > + struct xfs_handle handle; > > + __u64 first_ino = ino & ~63; > > + __s32 buflenout = 0; > > + int error; > > + > > + bstatbuf = malloc(BSTATBUF_SZ * sizeof(struct xfs_bstat)); > > + if (!bstatbuf) { > > + perror("bulkstat malloc"); > > + return; > > + } > > + > > + bulkreq.lastip = (__u64 *)&first_ino; > > + bulkreq.icount = BSTATBUF_SZ; > > + bulkreq.ubuffer = (void *)bstatbuf; > > + bulkreq.ocount = &buflenout; > > + > > + memcpy(&handle.ha_fsid, fshandle, sizeof(handle.ha_fsid)); > > + handle.ha_fid.fid_len = sizeof(xfs_fid_t) - > > + sizeof(handle.ha_fid.fid_len); > > + handle.ha_fid.fid_pad = 0; > > + while ((error = xfsctl("", fd, XFS_IOC_FSBULKSTAT, &bulkreq)) == 0) { > > + if (buflenout == 0) > > + break; > > + for (p = bstatbuf, endp = bstatbuf + buflenout; p < endp; p++) { > > + if (p->bs_ino > ino) { > > + fprintf(stderr, > > + "Expected ino %llu, got %llu.\n", > > + (unsigned long long)ino, p->bs_ino); > > + goto out; > > + } > > + > > + handle.ha_fid.fid_gen = p->bs_gen; > > + handle.ha_fid.fid_ino = p->bs_ino; > > + > > + read_handle_xattrs(&handle, false); > > + read_handle_xattrs(&handle, true); > > + goto out; > > + } > > + } > > + > > + if (error) > > + perror("bulkstat"); > > +out: > > + free(bstatbuf); > > + return; > > +} > > + > > +int main( > > + int argc, > > + char *argv[]) > > +{ > > + struct xfs_handle *fshandle; > > + size_t fshandle_len; > > + struct stat sb; > > + int fd; > > + int error; > > + > > + if (argc != 2) { > > + fprintf(stderr, "Usage: %s filename\n", argv[0]); > > + return 1; > > + } > > + > > + error = path_to_fshandle(argv[1], (void **)&fshandle, &fshandle_len); > > + if (error) { > > + perror("getting fshandle"); > > + return 2; > > + } > > + > > + fd = open(argv[1], O_RDONLY); > > + if (fd < 0) { > > + perror("opening file"); > > + return 2; > > + } > > + > > + error = fstat(fd, &sb); > > + if (error) { > > + perror("fstat file"); > > + return 2; > > + } > > + > > + find_inode(fshandle, fd, sb.st_ino); > > + > > + close(fd); > > + free_handle(fshandle, fshandle_len); > > + return 0; > > +} > > diff --git a/tests/xfs/700 b/tests/xfs/700 > > new file mode 100755 > > index 0000000..4a5680d > > --- /dev/null > > +++ b/tests/xfs/700 > > @@ -0,0 +1,64 @@ > > +#! /bin/bash > > +# FS QA Test No. 700 > > +# > > +# Check that attr_list_by_handle copies the cursor back to userspace. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/testout > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > +. ./common/populate > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_scratch > > +_require_test_program "attr-list-by-handle-cursor-test" > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > + > > +echo "Stuff file with xattrs" > > +mkdir $SCRATCH_MNT/foo > > +__populate_create_attr $SCRATCH_MNT/foo 100 > > + > > +echo "Run test program" > > +./src/attr-list-by-handle-cursor-test $SCRATCH_MNT/foo > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/700.out b/tests/xfs/700.out > > new file mode 100644 > > index 0000000..493a68a > > --- /dev/null > > +++ b/tests/xfs/700.out > > @@ -0,0 +1,5 @@ > > +QA output created by 700 > > +Format and mount > > +Stuff file with xattrs > > +Run test program > > +Test passes. > > diff --git a/tests/xfs/group b/tests/xfs/group > > index ff0efa5..ae12e74 100644 > > --- a/tests/xfs/group > > +++ b/tests/xfs/group > > @@ -307,3 +307,4 @@ > > 325 auto quick clone > > 326 auto quick clone > > 327 auto quick clone > > +700 auto quick > > Also add ioctl group? Ok. Thank you for the review! --D > > Thanks, > Eryu From darrick.wong@oracle.com Wed Aug 3 17:45:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B70BC7CA1 for ; Wed, 3 Aug 2016 17:45:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 60B29304048 for ; Wed, 3 Aug 2016 15:45:48 -0700 (PDT) X-ASG-Debug-ID: 1470264346-0bf8157e6a421030001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id I82MU5zEoL41ElpL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 15:45:46 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73Mjiht028306 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 3 Aug 2016 22:45:44 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u73MjhMw007205 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:45:44 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u73Mjg55022807; Wed, 3 Aug 2016 22:45:43 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 15:45:42 -0700 Date: Wed, 3 Aug 2016 15:45:36 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH v2 06/17] xfs: optionally test xfs_repair index rebuilding at the end of each test Message-ID: <20160803224536.GC8586@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 06/17] xfs: optionally test xfs_repair index rebuilding at the end of each test References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914481474.11762.2741429828012981240.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470264346 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2932 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Run xfs_repair twice more at the end of each test -- once to rebuild the btree indices, and again with -n to check the rebuild work. This is in addition to the regular dry-run spot check. v2: Reorder the repair invocations and label them better in the output. Signed-off-by: Darrick J. Wong --- README | 4 ++++ common/rc | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/README b/README index 2647e12..4509cc1 100644 --- a/README +++ b/README @@ -80,6 +80,10 @@ Preparing system for tests (IRIX and Linux): added to the end of fsstresss and fsx invocations, respectively, in case you wish to exclude certain operational modes from these tests. + - set TEST_XFS_REPAIR_REBUILD=1 to have _check_xfs_filesystem + run xfs_repair -n to check the filesystem; xfs_repair to rebuild + metadata indexes; and xfs_repair -n (a third time) to check the + results of the rebuilding. - or add a case to the switch in common/config assigning these variables based on the hostname of your test diff --git a/common/rc b/common/rc index 0ff72f2..eca9b9d 100644 --- a/common/rc +++ b/common/rc @@ -2452,6 +2452,37 @@ _check_xfs_filesystem() fi rm -f $tmp.fs_check $tmp.logprint $tmp.repair + # Optionally test the index rebuilding behavior. + if [ -n "$TEST_XFS_REPAIR_REBUILD" ]; then + $XFS_REPAIR_PROG $extra_options $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 + if [ $? -ne 0 ] + then + echo "_check_xfs_filesystem: filesystem on $device is inconsistent (rebuild) (see $seqres.full)" + + echo "_check_xfs_filesystem: filesystem on $device is inconsistent (rebuild)" >>$seqres.full + echo "*** xfs_repair output ***" >>$seqres.full + cat $tmp.repair | _fix_malloc >>$seqres.full + echo "*** end xfs_repair output" >>$seqres.full + + ok=0 + fi + rm -f $tmp.fs_check $tmp.logprint $tmp.repair + + $XFS_REPAIR_PROG -n $extra_options $extra_log_options $extra_rt_options $device >$tmp.repair 2>&1 + if [ $? -ne 0 ] + then + echo "_check_xfs_filesystem: filesystem on $device is inconsistent (rebuild-reverify) (see $seqres.full)" + + echo "_check_xfs_filesystem: filesystem on $device is inconsistent (rebuild-reverify)" >>$seqres.full + echo "*** xfs_repair -n output ***" >>$seqres.full + cat $tmp.repair | _fix_malloc >>$seqres.full + echo "*** end xfs_repair output" >>$seqres.full + + ok=0 + fi + rm -f $tmp.fs_check $tmp.logprint $tmp.repair + fi + if [ $ok -eq 0 ] then echo "*** mount output ***" >>$seqres.full From darrick.wong@oracle.com Wed Aug 3 17:49:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28BA37CA1 for ; Wed, 3 Aug 2016 17:49:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EE3CC8F8033 for ; Wed, 3 Aug 2016 15:49:03 -0700 (PDT) X-ASG-Debug-ID: 1470264541-0bf57c1369339d20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id IaEsFiPhg1bYQUln (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 15:49:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73Mn0h8030942 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:49:00 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73MmxNW004309 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:49:00 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u73MmvP7019713; Wed, 3 Aug 2016 22:48:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 15:48:57 -0700 Date: Wed, 3 Aug 2016 15:48:55 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH v2 07/17] xfs/128: cycle_mount the scratch device, not the test device Message-ID: <20160803224855.GA25565@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 07/17] xfs/128: cycle_mount the scratch device, not the test device References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914482100.11762.3197784490090678443.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914482100.11762.3197784490090678443.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470264541 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1910 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines This test uses the scratch device, so cycle that, not the test dev. This is also a xfs_fsr test, so put it in the fsr group. Signed-off-by: Darrick J. Wong --- tests/xfs/128 | 6 +++--- tests/xfs/group | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/xfs/128 b/tests/xfs/128 index 8758d7e..04633a1 100755 --- a/tests/xfs/128 +++ b/tests/xfs/128 @@ -66,7 +66,7 @@ _pwrite_byte 0x61 0 $((blks * blksz)) $testdir/file1 >> $seqres.full _cp_reflink $testdir/file1 $testdir/file2 _cp_reflink $testdir/file2 $testdir/file3 _cp_reflink $testdir/file3 $testdir/file4 -_test_cycle_mount +_scratch_cycle_mount free_blocks1=$(stat -f $testdir -c '%f') md5sum $testdir/file1 | _filter_scratch @@ -82,7 +82,7 @@ c04=$(_md5_checksum $testdir/file4) echo "CoW the reflink copies" _pwrite_byte 0x62 $blksz $blksz $testdir/file2 >> $seqres.full _pwrite_byte 0x63 $(( blksz * (blks - 1) )) $blksz $testdir/file3 >> $seqres.full -_test_cycle_mount +_scratch_cycle_mount free_blocks2=$(stat -f $testdir -c '%f') md5sum $testdir/file1 | _filter_scratch @@ -101,7 +101,7 @@ $XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full $XFS_FSR_PROG -v -d $testdir/file2 >> $seqres.full # fsr probably breaks the link $XFS_FSR_PROG -v -d $testdir/file3 >> $seqres.full # fsr probably breaks the link $XFS_FSR_PROG -v -d $testdir/file4 >> $seqres.full # fsr probably ignores this file -_test_cycle_mount +_scratch_cycle_mount free_blocks3=$(stat -f $testdir -c '%f') md5sum $testdir/file1 | _filter_scratch diff --git a/tests/xfs/group b/tests/xfs/group index 05571e4..ff0efa5 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -125,7 +125,7 @@ 125 fuzzers 126 fuzzers 127 auto quick clone -128 auto quick clone +128 auto quick clone fsr 129 auto quick clone 130 fuzzers clone 131 auto quick clone From darrick.wong@oracle.com Wed Aug 3 17:50:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 864D07CA1 for ; Wed, 3 Aug 2016 17:50:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49619304048 for ; Wed, 3 Aug 2016 15:50:12 -0700 (PDT) X-ASG-Debug-ID: 1470264610-0bf8157e6b4213d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5rzvmc0YqAn01Qox (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 15:50:10 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73Mo8iw008654 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:50:09 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73Mo8BX005941 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:50:08 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u73Mo6ob024250; Wed, 3 Aug 2016 22:50:07 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 15:50:06 -0700 Date: Wed, 3 Aug 2016 15:50:04 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH v2 09/17] common/dmerror: fix mount option issues Message-ID: <20160803225004.GB25565@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 09/17] common/dmerror: fix mount option issues References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470264610 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 970 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Calling _mount doesn't work when we want to add mount options such as realtime devices. Since it's just a normal scratch device mount except for the source device, just call _scratch_mount with SCRATCH_DEV set to the dmerror device. v2: Use the standard _scratch_options for mounting. Signed-off-by: Darrick J. Wong --- common/dmerror | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/common/dmerror b/common/dmerror index 5ad9994..d05c4c8 100644 --- a/common/dmerror +++ b/common/dmerror @@ -41,14 +41,10 @@ _dmerror_init() DMERROR_TABLE="0 $blk_dev_size error $dm_backing_dev 0" } -_dmerror_mount_options() -{ - echo `_common_dev_mount_options $*` $DMERROR_DEV $SCRATCH_MNT -} - _dmerror_mount() { - _mount -t $FSTYP `_dmerror_mount_options $*` + _scratch_options mount + $MOUNT_PROG -t $FSTYP `_common_dev_mount_options $*` $SCRATCH_OPTIONS \ } _dmerror_unmount() From darrick.wong@oracle.com Wed Aug 3 17:52:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DA4D37CA1 for ; Wed, 3 Aug 2016 17:52:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4DF25AC002 for ; Wed, 3 Aug 2016 15:52:21 -0700 (PDT) X-ASG-Debug-ID: 1470264738-0bf57b369d397600001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id NuFTXGLIbEroevbr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 15:52:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73Mpsha000980 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:51:54 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u73MpsgE009088 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 22:51:54 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u73MpqNt021975; Wed, 3 Aug 2016 22:51:53 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 15:51:51 -0700 Date: Wed, 3 Aug 2016 15:51:50 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: [PATCH v2] xfs: test attr_list_by_handle cursor iteration Message-ID: <20160803225150.GC25565@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2] xfs: test attr_list_by_handle cursor iteration References: <20160802235251.GB8586@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802235251.GB8586@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470264738 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9050 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Apparently the XFS attr_list_by_handle ioctl has never actually copied the cursor contents back to user space, which means that iteration has never worked. Add a test case for this and see "xfs: in _attrlist_by_handle, copy the cursor back to userspace". v2: Use BULKSTAT_SINGLE for less confusion, fix build errors on RHEL6. Signed-off-by: Darrick J. Wong --- .gitignore | 1 src/Makefile | 3 - src/attr-list-by-handle-cursor-test.c | 185 +++++++++++++++++++++++++++++++++ tests/xfs/700 | 64 +++++++++++ tests/xfs/700.out | 5 + tests/xfs/group | 1 6 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 src/attr-list-by-handle-cursor-test.c create mode 100755 tests/xfs/700 create mode 100644 tests/xfs/700.out diff --git a/.gitignore b/.gitignore index 28bd180..e184a6f 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ /src/alloc /src/append_reader /src/append_writer +/src/attr-list-by-handle-cursor-test /src/bstat /src/bulkstat_unlink_test /src/bulkstat_unlink_test_modified diff --git a/src/Makefile b/src/Makefile index 1bf318b..ae06d50 100644 --- a/src/Makefile +++ b/src/Makefile @@ -20,7 +20,8 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ seek_copy_test t_readdir_1 t_readdir_2 fsync-tester nsexec cloner \ - renameat2 t_getcwd e4compact test-nextquota punch-alternating + renameat2 t_getcwd e4compact test-nextquota punch-alternating \ + attr-list-by-handle-cursor-test SUBDIRS = diff --git a/src/attr-list-by-handle-cursor-test.c b/src/attr-list-by-handle-cursor-test.c new file mode 100644 index 0000000..ac6ab05 --- /dev/null +++ b/src/attr-list-by-handle-cursor-test.c @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ATTRBUFSZ 1024 +#define BSTATBUF_NR 32 + +/* Read all the extended attributes of a file handle. */ +void +read_handle_xattrs( + struct xfs_handle *handle, + int root_space) +{ + struct attrlist_cursor cur; + char attrbuf[ATTRBUFSZ]; + char *firstname = NULL; + struct attrlist *attrlist = (struct attrlist *)attrbuf; + struct attrlist_ent *ent; + int i; + int flags = 0; + int error; + + if (root_space) + flags |= ATTR_ROOT; + + memset(&cur, 0, sizeof(cur)); + while ((error = attr_list_by_handle(handle, sizeof(*handle), + attrbuf, ATTRBUFSZ, flags, + &cur)) == 0) { + for (i = 0; i < attrlist->al_count; i++) { + ent = ATTR_ENTRY(attrlist, i); + + if (i != 0) + continue; + + if (firstname == NULL) { + firstname = malloc(ent->a_valuelen); + memcpy(firstname, ent->a_name, ent->a_valuelen); + } else { + if (memcmp(firstname, ent->a_name, + ent->a_valuelen) == 0) + fprintf(stderr, + "Saw duplicate xattr \"%s\", buggy XFS?\n", + ent->a_name); + else + fprintf(stderr, + "Test passes.\n"); + goto out; + } + } + + if (!attrlist->al_more) + break; + } + +out: + if (firstname) + free(firstname); + if (error) + perror("attr_list_by_handle"); + return; +} + +/* Iterate a range of inodes. */ +void +find_inode( + struct xfs_handle *fshandle, + int fd, + ino_t ino) +{ + struct xfs_fsop_bulkreq bulkreq; + struct xfs_bstat *bstatbuf; + struct xfs_handle handle; + __u64 first_ino = ino; + __s32 buflenout = 0; + int error; + + bstatbuf = malloc(BSTATBUF_NR * sizeof(struct xfs_bstat)); + if (!bstatbuf) { + perror("bulkstat malloc"); + return; + } + + bulkreq.lastip = (__u64 *)&first_ino; + bulkreq.icount = BSTATBUF_NR; + bulkreq.ubuffer = (void *)bstatbuf; + bulkreq.ocount = &buflenout; + + memcpy(&handle.ha_fsid, fshandle, sizeof(handle.ha_fsid)); + handle.ha_fid.fid_len = sizeof(xfs_fid_t) - + sizeof(handle.ha_fid.fid_len); + handle.ha_fid.fid_pad = 0; + error = xfsctl("", fd, XFS_IOC_FSBULKSTAT_SINGLE, &bulkreq); + if (error) { + perror("bulkstat"); + goto out; + } + + if (buflenout == 0) { + fprintf(stderr, "buflenout = 0??\n"); + goto out; + } + + if (bstatbuf->bs_ino != ino) { + fprintf(stderr, "Expected ino %llu, got %llu.\n", + (unsigned long long)ino, bstatbuf->bs_ino); + goto out; + } + + handle.ha_fid.fid_gen = bstatbuf->bs_gen; + handle.ha_fid.fid_ino = bstatbuf->bs_ino; + + read_handle_xattrs(&handle, false); + read_handle_xattrs(&handle, true); + +out: + free(bstatbuf); + return; +} + +int main( + int argc, + char *argv[]) +{ + struct xfs_handle *fshandle; + size_t fshandle_len; + struct stat sb; + int fd; + int error; + + if (argc != 2) { + fprintf(stderr, "Usage: %s filename\n", argv[0]); + return 1; + } + + error = path_to_fshandle(argv[1], (void **)&fshandle, &fshandle_len); + if (error) { + perror("getting fshandle"); + return 2; + } + + fd = open(argv[1], O_RDONLY); + if (fd < 0) { + perror("opening file"); + return 2; + } + + error = fstat(fd, &sb); + if (error) { + perror("fstat file"); + return 2; + } + + find_inode(fshandle, fd, sb.st_ino); + + close(fd); + free_handle(fshandle, fshandle_len); + return 0; +} diff --git a/tests/xfs/700 b/tests/xfs/700 new file mode 100755 index 0000000..4a5680d --- /dev/null +++ b/tests/xfs/700 @@ -0,0 +1,64 @@ +#! /bin/bash +# FS QA Test No. 700 +# +# Check that attr_list_by_handle copies the cursor back to userspace. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/testout +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_os Linux +_require_scratch +_require_test_program "attr-list-by-handle-cursor-test" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Stuff file with xattrs" +mkdir $SCRATCH_MNT/foo +__populate_create_attr $SCRATCH_MNT/foo 100 + +echo "Run test program" +./src/attr-list-by-handle-cursor-test $SCRATCH_MNT/foo + +# success, all done +status=0 +exit diff --git a/tests/xfs/700.out b/tests/xfs/700.out new file mode 100644 index 0000000..493a68a --- /dev/null +++ b/tests/xfs/700.out @@ -0,0 +1,5 @@ +QA output created by 700 +Format and mount +Stuff file with xattrs +Run test program +Test passes. diff --git a/tests/xfs/group b/tests/xfs/group index ff0efa5..b42153d 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -307,3 +307,4 @@ 325 auto quick clone 326 auto quick clone 327 auto quick clone +700 auto quick ioctl From david@fromorbit.com Wed Aug 3 17:58:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 83FD07CA1 for ; Wed, 3 Aug 2016 17:58:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3984D304048 for ; Wed, 3 Aug 2016 15:58:01 -0700 (PDT) X-ASG-Debug-ID: 1470265078-0bf8157e6b422050001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id asVicowDv8Dkrvty for ; Wed, 03 Aug 2016 15:57:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B1OQA7dqJXIMmOLHldg0WBA0+Gcp0qBoxghg2EDIYXBAICgUtNAQEBAQEBBwEBAQEBAThAhF8BBTocIxAIAw4KCSUPBSUDBxoTG4gVv2IBAQgCJR6FRIQSgQOJfh0FmTSOdYF1hFuIeowwg3eCZhyBXioyiFoBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Aug 2016 08:27:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bV56q-00019i-RW; Thu, 04 Aug 2016 08:57:56 +1000 Date: Thu, 4 Aug 2016 08:57:56 +1000 From: Dave Chinner To: Christoph Hellwig Cc: "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 11/47] xfs: move deferred operations into a separate file Message-ID: <20160803225756.GW16044@dastard> X-ASG-Orig-Subj: Re: [PATCH 11/47] xfs: move deferred operations into a separate file References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> <20160801080223.GB30547@infradead.org> <20160802223950.GN16044@dastard> <20160803091627.GA5289@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803091627.GA5289@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1470265078 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2233 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 03, 2016 at 02:16:27AM -0700, Christoph Hellwig wrote: > On Wed, Aug 03, 2016 at 08:39:50AM +1000, Dave Chinner wrote: > > Rather than have to make major changes to core infrastructure now, > > let's work this out as a separate patchset to clean up the rmap and > > reflink code in the next couple of releases. It's going to be better > > to get working code out there now under the experimental tag than it > > is is to keep it as an out of tree patchset for another cycle. > > The problm is that this does not only affect the rmap code (for which > I suspect it actually is fine), but also regresses the freed extent > logging. If you want minimal changes we should simply drop the patches > to move over the freed extent tracking to the new deferred ops > mechanism for now. I haven't said I want "minimal changes". What I don't want to do is make large, untested changes at the last minute, especially when there's no evidence that there is a regression caused by the code being changed. We need this kind of infrastructure for reflink, and there's no point rewriting the rmap code to remove it just to then have to immediately re-introduce it back into to the rmap code so it works with reflink. It's pointless churn and invalidates all the testing we've done on rmap up to this point. I don't understand what problem or regression you think this code causes, mainly because it hasn't been explained or demonstrated. I don't understand the solution being proposed, because the little that has been described tells me nothing about what the problem it solves is, nor how it solves the atomicity and ordering requirements that updating the bmbt, refcountbt and rmapbt have. I have no issues with fixing the code if it is broken, but first everyone needs to undestand how it is broken. It's time to make progress on this functionality - if we wait for the code to be perfect before it gets merged, we'll never make any progress. So, please explain in more detail what the problem is and what the proposed solution is so I (and probably Darrick, too) have some understanding of the issue you see with this code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 3 18:16:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F79F7CA1 for ; Wed, 3 Aug 2016 18:16:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98297AC003 for ; Wed, 3 Aug 2016 16:16:18 -0700 (PDT) X-ASG-Debug-ID: 1470266175-0bf57b369d398690001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id XPWBZlGrrekqyU3B for ; Wed, 03 Aug 2016 16:16:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AIDwDgeqJXIMmOLHldg0VWfIZynRgSBoxgihkchXsEAgKBSE0BAQEBAQEHAQEBAQEBOECEXwEFOhwjEAgDGAklDwUlAwcaExSIHL9dAQEBBwIlHoVEhRWETIVPBZk0hhiIXYF1ToQNiHqMMIN3gmYcgV4qMohaAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Aug 2016 08:45:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bV5Np-0001CT-9G; Thu, 04 Aug 2016 09:15:29 +1000 Date: Thu, 4 Aug 2016 09:15:29 +1000 From: Dave Chinner To: "Carlos E. R." Cc: XFS mail list Subject: Re: Spam on this list Message-ID: <20160803231529.GX16044@dastard> X-ASG-Orig-Subj: Re: Spam on this list References: <4278AB9734C1445A8E48635B155149F8@dinulap> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> <4382687.Pe7d1tBhVA@merkaba> <9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1470266175 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1573 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 03, 2016 at 03:34:58PM +0200, Carlos E. R. wrote: > On 2016-08-03 15:21, Martin Steigerwald wrote: > > > Lista, Carlos, I recommend: If you are concerned about spam on the list > > contact the listmasters of it. They are the ones that can address it globally > > for the list. > > Oh, I did, long ago. Still waiting. Yes, that is the fundamental issue - spam filtering is essentially controlled by SGI's internal infrastructure, which we have little option on. What it comes down to is whether we continue to use this list (xfs@oss.sgi.com) or whether we move to linux-xfs@vger.kernel.org so we get much more robust and up-to-date spam filtering. The issue with doing this is forcing everyone to resubscribe, and then capturing everything that is still sent to xfs@oss.sgi.com. That said, I'm seriously tempted right now just to say "we're moving to vger" and asking everyone to resubscribe to that list, and then making xfs@oss.sgi.com respond with "list moved to vger, please repost there". i.e. not even put a forwarding gateway in place. If we do that, then I'll also shut down all the XFS git trees on oss.sgi.com - I'll add commits to the them to say "go to kernel.org". I'll need to work something out for the tarball releases, but kernel.org does have functionality for that, too, so that may just be a small change of process on my end (i.e. use kup). Once that is done, we'll be running completely on community provided infrastructure.... Thoughts? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 3 18:17:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 48FA17CA1 for ; Wed, 3 Aug 2016 18:17:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 00EEE8F8033 for ; Wed, 3 Aug 2016 16:17:30 -0700 (PDT) X-ASG-Debug-ID: 1470266247-0bf8157e6c422c60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0aHSqbGHsXGhE7q3 for ; Wed, 03 Aug 2016 16:17:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D3DgDgeqJXIMmOLHldg0WBUoZynSoGjGCKGYYXBAICgUhNAQEBAQEBBwEBAQEBAThAhF8BBTocMwgDGAklDwUlAwcaARKIML9dAQslHoVEhRWJfh0FmTSOdY9KjDCDd4RgKjKIWgEBAQ Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Aug 2016 08:46:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bV5PD-0001Ck-7X; Thu, 04 Aug 2016 09:16:55 +1000 Date: Thu, 4 Aug 2016 09:16:55 +1000 From: Dave Chinner To: Ross Zwisler , xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-nvdimm@lists.01.org Subject: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Message-ID: <20160803231655.GY16044@dastard> X-ASG-Orig-Subj: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems References: <20160803003354.GP16044@dastard> <20160803171127.GA15876@linux.intel.com> <20160803223713.GA22364@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803223713.GA22364@linux.intel.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1470266248 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1325 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 03, 2016 at 04:37:13PM -0600, Ross Zwisler wrote: > On Wed, Aug 03, 2016 at 11:11:27AM -0600, Ross Zwisler wrote: > > On Wed, Aug 03, 2016 at 10:33:54AM +1000, Dave Chinner wrote: > > > Hi folks, > > > > > > Just hit a reproducable hang in generic/361. Essentially this on > > > a 8GB pmem device: > > > > > > mkfs.xfs -f /dev/pmem1 > > > mount -o dax /dev/pmem1 /mnt/scratch > > > xfs_io -f -c "truncate 1g" test.img > > > losetup -f --show /mnt/scratch/test.img > > > mkfs.xfs -f /dev/loop0 > > > > > > And the mkfs.xfs command hangs with a discard that never completes: .... > > > This only reproduces when the underlying filesystem is mounted with > > > -o dax, so there is a bad interaction with loop devices and DAX > > > occurring somewhere. generic/361 is a recent test (committed june 14) > > > so this probably hasn't actually been tested until now. > > > > > > I haven't got time to look at this right now, hence the report. > > > > Cool, thanks for the report. I've reproduced this with linux/master, and the > > test passes with v4.7. > > > > Running a bisect... > > This bisected to a commit to the block layer code. I've sent a bug report to > the author of the commit. And the commit id is ...? Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Wed Aug 3 18:29:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7F4F77CA1 for ; Wed, 3 Aug 2016 18:29:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 421FC304032 for ; Wed, 3 Aug 2016 16:29:55 -0700 (PDT) X-ASG-Debug-ID: 1470266991-0bf57c136733baf0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id bPTsWgnTa4HdBWCy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 16:29:52 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u73NToPJ011996 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 3 Aug 2016 23:29:50 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u73NTm7j028346 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Aug 2016 23:29:49 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.13.8/8.13.8) with ESMTP id u73NTkUT002215; Wed, 3 Aug 2016 23:29:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 16:29:44 -0700 Date: Wed, 3 Aug 2016 16:29:43 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: "Carlos E. R." , XFS mail list Subject: Re: Spam on this list Message-ID: <20160803232943.GI8593@birch.djwong.org> X-ASG-Orig-Subj: Re: Spam on this list References: <4278AB9734C1445A8E48635B155149F8@dinulap> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> <4382687.Pe7d1tBhVA@merkaba> <9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net> <20160803231529.GX16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803231529.GX16044@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470266992 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2175 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA085, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.10 BSF_SC0_SA085 Custom Rule SA085 On Thu, Aug 04, 2016 at 09:15:29AM +1000, Dave Chinner wrote: > On Wed, Aug 03, 2016 at 03:34:58PM +0200, Carlos E. R. wrote: > > On 2016-08-03 15:21, Martin Steigerwald wrote: > > > > > Lista, Carlos, I recommend: If you are concerned about spam on the list > > > contact the listmasters of it. They are the ones that can address it globally > > > for the list. > > > > Oh, I did, long ago. Still waiting. > > Yes, that is the fundamental issue - spam filtering is essentially > controlled by SGI's internal infrastructure, which we have little > option on. > > What it comes down to is whether we continue to use this list > (xfs@oss.sgi.com) or whether we move to linux-xfs@vger.kernel.org > so we get much more robust and up-to-date spam filtering. The issue > with doing this is forcing everyone to resubscribe, and then > capturing everything that is still sent to xfs@oss.sgi.com. > > That said, I'm seriously tempted right now just to say "we're moving > to vger" and asking everyone to resubscribe to that list, and then > making xfs@oss.sgi.com respond with "list moved to vger, please > repost there". i.e. not even put a forwarding gateway in place. > > If we do that, then I'll also shut down all the XFS git trees on > oss.sgi.com - I'll add commits to the them to say "go to > kernel.org". I'll need to work something out for the tarball > releases, but kernel.org does have functionality for that, too, so > that may just be a small change of process on my end (i.e. use kup). > Once that is done, we'll be running completely on community provided > infrastructure.... > > Thoughts? YAY! By the way, could we update the docs on http://xfs.org/index.php/XFS_Papers_and_Documentation ? The filesystem structure guide is a little out of date. (The user guide probably is too, but as I've only been sending patches for the disk format guide I'm keeping my mouth shut about the others.) --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From mchristi@redhat.com Wed Aug 3 18:47:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D26EB7CA1 for ; Wed, 3 Aug 2016 18:47:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 927D3304032 for ; Wed, 3 Aug 2016 16:47:54 -0700 (PDT) X-ASG-Debug-ID: 1470268072-0bf57c136a33ca70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8oY34uDBCtpYKSCe (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 16:47:53 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 580F43B709; Wed, 3 Aug 2016 23:47:51 +0000 (UTC) Received: from [10.10.62.81] (vpn-62-81.rdu2.redhat.com [10.10.62.81]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u73NllKx028980; Wed, 3 Aug 2016 19:47:47 -0400 Subject: Re: [PATCH 37/45] drivers: use req op accessor To: Ross Zwisler , Ross Zwisler , Dave Chinner , axboe@fb.com X-ASG-Orig-Subj: Re: [PATCH 37/45] drivers: use req op accessor References: <1465155145-10812-1-git-send-email-mchristi@redhat.com> <1465155145-10812-38-git-send-email-mchristi@redhat.com> Cc: linux-f2fs-devel@lists.sourceforge.net, linux-ext4 , konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel , linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, LKML , linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, XFS Developers , ocfs2-devel@oss.oracle.com From: Mike Christie Message-ID: <87fbe31f-27b3-ff7a-e381-34fc1aad337e@redhat.com> Date: Wed, 3 Aug 2016 18:47:47 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------E67039756464BB48DF8C2F48" X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 03 Aug 2016 23:47:51 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470268073 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1555 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a multi-part message in MIME format. --------------E67039756464BB48DF8C2F48 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit On 08/03/2016 05:33 PM, Ross Zwisler wrote: > On Sun, Jun 5, 2016 at 1:32 PM, wrote: >> From: Mike Christie >> >> The req operation REQ_OP is separated from the rq_flag_bits >> definition. This converts the block layer drivers to >> use req_op to get the op from the request struct. >> >> Signed-off-by: Mike Christie >> --- >> drivers/block/loop.c | 6 +++--- >> drivers/block/mtip32xx/mtip32xx.c | 2 +- >> drivers/block/nbd.c | 2 +- >> drivers/block/rbd.c | 4 ++-- >> drivers/block/xen-blkfront.c | 8 +++++--- >> drivers/ide/ide-floppy.c | 2 +- >> drivers/md/dm.c | 2 +- >> drivers/mmc/card/block.c | 7 +++---- >> drivers/mmc/card/queue.c | 6 ++---- > > Dave Chinner reported a deadlock with XFS + DAX, which I reproduced > and bisected to this commit: > > commit c2df40dfb8c015211ec55f4b1dd0587f875c7b34 > Author: Mike Christie > Date: Sun Jun 5 14:32:17 2016 -0500 > drivers: use req op accessor > > Here are the steps to reproduce the deadlock with a BRD ramdisk: > > mkfs.xfs -f /dev/ram0 > mount -o dax /dev/ram0 /mnt/scratch When using ramdisks, we need the attached patch like in your other bug report. I think it will fix some hangs people are seeing. I do not think that it should cause the failure to run issue you saw when doing generic/008 and ext2. --------------E67039756464BB48DF8C2F48 Content-Type: text/x-patch; name="convert-rw_page.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="convert-rw_page.patch" diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 3022dad..9fbbeba 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -300,20 +300,20 @@ static void copy_from_brd(void *dst, struct brd_device *brd, * Process a single bvec of a bio. */ static int brd_do_bvec(struct brd_device *brd, struct page *page, - unsigned int len, unsigned int off, int rw, + unsigned int len, unsigned int off, int op, sector_t sector) { void *mem; int err = 0; - if (rw != READ) { + if (op_is_write(op)) { err = copy_to_brd_setup(brd, sector, len); if (err) goto out; } mem = kmap_atomic(page); - if (rw == READ) { + if (!op_is_write(op)) { copy_from_brd(mem + off, brd, sector, len); flush_dcache_page(page); } else { @@ -330,7 +330,6 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) { struct block_device *bdev = bio->bi_bdev; struct brd_device *brd = bdev->bd_disk->private_data; - int rw; struct bio_vec bvec; sector_t sector; struct bvec_iter iter; @@ -347,14 +346,12 @@ static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) goto out; } - rw = bio_data_dir(bio); - bio_for_each_segment(bvec, bio, iter) { unsigned int len = bvec.bv_len; int err; err = brd_do_bvec(brd, bvec.bv_page, len, - bvec.bv_offset, rw, sector); + bvec.bv_offset, bio_op(bio), sector); if (err) goto io_error; sector += len >> SECTOR_SHIFT; @@ -369,11 +366,11 @@ io_error: } static int brd_rw_page(struct block_device *bdev, sector_t sector, - struct page *page, int rw) + struct page *page, int op, int op_flags) { struct brd_device *brd = bdev->bd_disk->private_data; - int err = brd_do_bvec(brd, page, PAGE_SIZE, 0, rw, sector); - page_endio(page, rw & WRITE, err); + int err = brd_do_bvec(brd, page, PAGE_SIZE, 0, op, sector); + page_endio(page, op, err); return err; } diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 7454cf1..f0e126c 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -843,15 +843,15 @@ static void zram_bio_discard(struct zram *zram, u32 index, } static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, - int offset, int rw) + int offset, int op) { unsigned long start_time = jiffies; int ret; - generic_start_io_acct(rw, bvec->bv_len >> SECTOR_SHIFT, + generic_start_io_acct(op, bvec->bv_len >> SECTOR_SHIFT, &zram->disk->part0); - if (rw == READ) { + if (!op_is_write(op)) { atomic64_inc(&zram->stats.num_reads); ret = zram_bvec_read(zram, bvec, index, offset); } else { @@ -859,10 +859,10 @@ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, ret = zram_bvec_write(zram, bvec, index, offset); } - generic_end_io_acct(rw, &zram->disk->part0, start_time); + generic_end_io_acct(op, &zram->disk->part0, start_time); if (unlikely(ret)) { - if (rw == READ) + if (!op_is_write(op)) atomic64_inc(&zram->stats.failed_reads); else atomic64_inc(&zram->stats.failed_writes); @@ -873,7 +873,7 @@ static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, static void __zram_make_request(struct zram *zram, struct bio *bio) { - int offset, rw; + int offset; u32 index; struct bio_vec bvec; struct bvec_iter iter; @@ -888,7 +888,6 @@ static void __zram_make_request(struct zram *zram, struct bio *bio) return; } - rw = bio_data_dir(bio); bio_for_each_segment(bvec, bio, iter) { int max_transfer_size = PAGE_SIZE - offset; @@ -903,15 +902,18 @@ static void __zram_make_request(struct zram *zram, struct bio *bio) bv.bv_len = max_transfer_size; bv.bv_offset = bvec.bv_offset; - if (zram_bvec_rw(zram, &bv, index, offset, rw) < 0) + if (zram_bvec_rw(zram, &bv, index, offset, + bio_op(bio)) < 0) goto out; bv.bv_len = bvec.bv_len - max_transfer_size; bv.bv_offset += max_transfer_size; - if (zram_bvec_rw(zram, &bv, index + 1, 0, rw) < 0) + if (zram_bvec_rw(zram, &bv, index + 1, 0, + bio_op(bio)) < 0) goto out; } else - if (zram_bvec_rw(zram, &bvec, index, offset, rw) < 0) + if (zram_bvec_rw(zram, &bvec, index, offset, + bio_op(bio)) < 0) goto out; update_position(&index, &offset, &bvec); @@ -968,7 +970,7 @@ static void zram_slot_free_notify(struct block_device *bdev, } static int zram_rw_page(struct block_device *bdev, sector_t sector, - struct page *page, int rw) + struct page *page, int op, int op_flags) { int offset, err = -EIO; u32 index; @@ -992,7 +994,7 @@ static int zram_rw_page(struct block_device *bdev, sector_t sector, bv.bv_len = PAGE_SIZE; bv.bv_offset = 0; - err = zram_bvec_rw(zram, &bv, index, offset, rw); + err = zram_bvec_rw(zram, &bv, index, offset, op); put_zram: zram_meta_put(zram); out: @@ -1005,7 +1007,7 @@ out: * (e.g., SetPageError, set_page_dirty and extra works). */ if (err == 0) - page_endio(page, rw, 0); + page_endio(page, op, 0); return err; } diff --git a/drivers/nvdimm/btt.c b/drivers/nvdimm/btt.c index 9dce03f..6a6208d 100644 --- a/drivers/nvdimm/btt.c +++ b/drivers/nvdimm/btt.c @@ -1133,11 +1133,11 @@ static int btt_write_pg(struct btt *btt, struct bio_integrity_payload *bip, static int btt_do_bvec(struct btt *btt, struct bio_integrity_payload *bip, struct page *page, unsigned int len, unsigned int off, - int rw, sector_t sector) + int op, sector_t sector) { int ret; - if (rw == READ) { + if (!op_is_write(op)) { ret = btt_read_pg(btt, bip, page, off, sector, len); flush_dcache_page(page); } else { @@ -1155,7 +1155,7 @@ static blk_qc_t btt_make_request(struct request_queue *q, struct bio *bio) struct bvec_iter iter; unsigned long start; struct bio_vec bvec; - int err = 0, rw; + int err = 0; bool do_acct; /* @@ -1170,7 +1170,6 @@ static blk_qc_t btt_make_request(struct request_queue *q, struct bio *bio) } do_acct = nd_iostat_start(bio, &start); - rw = bio_data_dir(bio); bio_for_each_segment(bvec, bio, iter) { unsigned int len = bvec.bv_len; @@ -1181,11 +1180,12 @@ static blk_qc_t btt_make_request(struct request_queue *q, struct bio *bio) BUG_ON(len % btt->sector_size); err = btt_do_bvec(btt, bip, bvec.bv_page, len, bvec.bv_offset, - rw, iter.bi_sector); + bio_op(bio), iter.bi_sector); if (err) { dev_info(&btt->nd_btt->dev, "io error in %s sector %lld, len %d,\n", - (rw == READ) ? "READ" : "WRITE", + (op_is_write(bio_op(bio))) ? "WRITE" : + "READ", (unsigned long long) iter.bi_sector, len); bio->bi_error = err; break; @@ -1200,12 +1200,12 @@ out: } static int btt_rw_page(struct block_device *bdev, sector_t sector, - struct page *page, int rw) + struct page *page, int op, int op_flags) { struct btt *btt = bdev->bd_disk->private_data; - btt_do_bvec(btt, NULL, page, PAGE_SIZE, 0, rw, sector); - page_endio(page, rw & WRITE, 0); + btt_do_bvec(btt, NULL, page, PAGE_SIZE, 0, op, sector); + page_endio(page, op, 0); return 0; } diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index b511099..6a7b97d 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -67,7 +67,7 @@ static void pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset, } static int pmem_do_bvec(struct pmem_device *pmem, struct page *page, - unsigned int len, unsigned int off, int rw, + unsigned int len, unsigned int off, int op, sector_t sector) { int rc = 0; @@ -79,7 +79,7 @@ static int pmem_do_bvec(struct pmem_device *pmem, struct page *page, if (unlikely(is_bad_pmem(&pmem->bb, sector, len))) bad_pmem = true; - if (rw == READ) { + if (!op_is_write(op)) { if (unlikely(bad_pmem)) rc = -EIO; else { @@ -134,7 +134,7 @@ static blk_qc_t pmem_make_request(struct request_queue *q, struct bio *bio) do_acct = nd_iostat_start(bio, &start); bio_for_each_segment(bvec, bio, iter) { rc = pmem_do_bvec(pmem, bvec.bv_page, bvec.bv_len, - bvec.bv_offset, bio_data_dir(bio), + bvec.bv_offset, bio_op(bio), iter.bi_sector); if (rc) { bio->bi_error = rc; @@ -152,12 +152,12 @@ static blk_qc_t pmem_make_request(struct request_queue *q, struct bio *bio) } static int pmem_rw_page(struct block_device *bdev, sector_t sector, - struct page *page, int rw) + struct page *page, int op, int op_flags) { struct pmem_device *pmem = bdev->bd_queue->queuedata; int rc; - rc = pmem_do_bvec(pmem, page, PAGE_SIZE, 0, rw, sector); + rc = pmem_do_bvec(pmem, page, PAGE_SIZE, 0, op, sector); /* * The ->rw_page interface is subtle and tricky. The core @@ -166,7 +166,7 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, * caused by double completion. */ if (rc == 0) - page_endio(page, rw & WRITE, 0); + page_endio(page, op, 0); return rc; } diff --git a/fs/block_dev.c b/fs/block_dev.c index ada42cf..e790ced 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -416,7 +416,8 @@ int bdev_read_page(struct block_device *bdev, sector_t sector, result = blk_queue_enter(bdev->bd_queue, false); if (result) return result; - result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, READ); + result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, + REQ_OP_READ, 0); blk_queue_exit(bdev->bd_queue); return result; } @@ -445,7 +446,7 @@ int bdev_write_page(struct block_device *bdev, sector_t sector, struct page *page, struct writeback_control *wbc) { int result; - int rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE; + int op_flags = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : 0; const struct block_device_operations *ops = bdev->bd_disk->fops; if (!ops->rw_page || bdev_get_integrity(bdev)) @@ -455,7 +456,8 @@ int bdev_write_page(struct block_device *bdev, sector_t sector, return result; set_page_writeback(page); - result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, rw); + result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, + REQ_OP_WRITE, op_flags); if (result) end_page_writeback(page); else diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index adf3307..3652408 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1673,7 +1673,8 @@ struct blk_dax_ctl { struct block_device_operations { int (*open) (struct block_device *, fmode_t); void (*release) (struct gendisk *, fmode_t); - int (*rw_page)(struct block_device *, sector_t, struct page *, int rw); + int (*rw_page)(struct block_device *, sector_t, struct page *, + int op, int op_flags); int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); long (*direct_access)(struct block_device *, sector_t, void **, pfn_t *, diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 81363b8..4578637 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -510,7 +510,7 @@ static inline void wait_on_page_writeback(struct page *page) extern void end_page_writeback(struct page *page); void wait_for_stable_page(struct page *page); -void page_endio(struct page *page, int rw, int err); +void page_endio(struct page *page, int op, int err); /* * Add an arbitrary waiter to a page's wait queue diff --git a/mm/filemap.c b/mm/filemap.c index 3083ded..daef091 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -887,9 +887,9 @@ EXPORT_SYMBOL(end_page_writeback); * After completing I/O on a page, call this routine to update the page * flags appropriately */ -void page_endio(struct page *page, int rw, int err) +void page_endio(struct page *page, int op, int err) { - if (rw == READ) { + if (!op_is_write(op)) { if (!err) { SetPageUptodate(page); } else { @@ -897,7 +897,7 @@ void page_endio(struct page *page, int rw, int err) SetPageError(page); } unlock_page(page); - } else { /* rw == WRITE */ + } else { if (err) { SetPageError(page); if (page->mapping) --------------E67039756464BB48DF8C2F48-- From Sales.20@fashion-business.com Wed Aug 3 19:02:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EB36A7CA1 for ; Wed, 3 Aug 2016 19:02:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 59DCC304032 for ; Wed, 3 Aug 2016 17:02:05 -0700 (PDT) X-ASG-Debug-ID: 1470268921-0bf57c136733e8f0001-NocioJ Received: from fashion-business.com ([14.218.91.74]) by cuda.sgi.com with SMTP id c9gjG19fauiMHbcp for ; Wed, 03 Aug 2016 17:02:02 -0700 (PDT) X-Barracuda-Envelope-From: Sales.20@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.91.74] X-Barracuda-Apparent-Source-IP: 14.218.91.74 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Wed, 3 Aug 2016 19:18:44 +0800 From: "angelbervogue@sina.com" Subject: Re:The fashion design of bag for 2016 market To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re:The fashion design of bag for 2016 market MIME-Version: 1.0 Sender: Sales.20@fashion-business.com Reply-To: angelbervogue@sina.com Date: Wed, 3 Aug 2016 19:18:44 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.91.74] X-Barracuda-Start-Time: 1470268921 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11457 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.56 X-Barracuda-Spam-Status: No, SCORE=1.56 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160804000205.1267F1940063@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTog5a6L5L2TOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMXB0OyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1z by1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBBcmlhbDsg bXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVm dDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7IFRFWFQtSU5ERU5U OiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElORy1SSUdIVDogMHB0 OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDogMHB0OyBtc28tcGFn aW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPXA+PEI+PFNQQU4gDQpzdHlsZT0iVEVYVC1U UkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBC QUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBMRVRURVItU1BBQ0lORzogMHB0OyBDT0xPUjog cmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAxMHB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSki IA0KY2xhc3M9MTU+SGksIFB1cmNoYXNpbmcgTWFuYWdlciw8L1NQQU4+PC9CPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD48L286cD48L1NQ QU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBw dDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQ QURESU5HLUxFRlQ6IDBwdDsgUEFERElORy1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1 LDI1NSwyNTUpOyBQQURESU5HLVRPUDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFu IiANCmNsYXNzPXA+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgQkFDS0dST1VO RDogcmdiKDI1NSwyNTUsMjU1KTsgRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3Jt YWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBB cmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6 IEFyaWFsOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUs MjU1LDI1NSkiPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21h OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQt a2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRF WFQtQUxJR046IGxlZnQ7IFBBRERJTkctQk9UVE9NOiAwcHQ7IExJTkUtSEVJR0hUOiAxNy40NXB0 OyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46IDBwdDsgUEFERElORy1MRUZUOiAwcHQ7IFBBRERJ TkctUklHSFQ6IDBwdDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgUEFERElORy1UT1A6 IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1wPjxCPjxTUEFOIA0K c3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFN SUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgTEVUVEVSLVNQQUNJTkc6 IDBwdDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7IEZPTlQtU0laRTogMTBwdDsgRk9OVC1XRUlHSFQ6 IGJvbGQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4w MDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1zaGFkaW5nOiByZ2Io MjU1LDI1NSwyNTUpIiANCmNsYXNzPTE1Pkdvb2QgZGF5ITwvU1BBTj48L0I+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BB Tj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBQQURESU5HLUJPVFRPTTogMHB0 OyBMSU5FLUhFSUdIVDogMTcuNDVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFBB RERJTkctTEVGVDogMHB0OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUs MjU1LDI1NSk7IFBBRERJTkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4i IA0KY2xhc3M9cD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBCQUNLR1JPVU5E OiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1h bDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFy aWFsOyBtc28taGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTog QXJpYWw7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwy NTUsMjU1KSI+Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7 IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1r ZXJuaW5nOiAwLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVY VC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7 IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElO Ry1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDog MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPXA+PEI+PFNQQU4gDQpz dHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1J TFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBMRVRURVItU1BBQ0lORzog MHB0OyBDT0xPUjogcmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAxMHB0OyBGT05ULVdFSUdIVDog Ym9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigy NTUsMjU1LDI1NSkiIA0KY2xhc3M9MTU+VGhpcyBpcyBBbmdlbG8gZnJvbSBBbmdlbGJlciBWb2d1 ZSBDby4sIEx0ZCBpbiBDaGluYS48L1NQQU4+PC9CPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZ OiBUYWhvbWE7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpz dHlsZT0iVEVYVC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6 IDE3LjQ1cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBw dDsgUEFERElORy1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURE SU5HLVRPUDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPXA+PEI+ PFNQQU4gDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsg Rk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBMRVRURVIt U1BBQ0lORzogMHB0OyBDT0xPUjogcmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAxMHB0OyBGT05U LVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJu aW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRp bmc6IHJnYigyNTUsMjU1LDI1NSkiIA0KY2xhc3M9MTU+V2UgYXJlIHByb2Zlc3Npb25hbCBiYWdz IHN1cHBsaWVyLCB0aGUgbWFpbmx5IHByb2R1Y3RzIA0KaW5jbHVkZSZuYnNwO2xhZGllcyBoYW5k YmFnLCBwdXJzZXMsIG1lbiBicmllZmNhc2UsIHRvdGUgYmFncyBhbmQgDQp3YWxsZXQmbmJzcDtl dGMuIHdlIGV4cG9ydCBhbG1vc3QgNTAwMCBwY3MgbW9udGhseSBhbGwgb3ZlciB0aGUgDQp3b3Js ZC48L1NQQU4+PC9CPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAw LjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjog bGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7IFRFWFQtSU5E RU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElORy1SSUdIVDog MHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDogMHB0OyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPXA+PEI+PFNQQU4gDQpzdHlsZT0iVEVY VC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IEFyaWFs OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBMRVRURVItU1BBQ0lORzogMHB0OyBDT0xP UjogcmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAxMHB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1 NSkiIA0KY2xhc3M9MTU+TWVhbnRpbWUsIHdlIGhhdmUgUmVzZWFyY2hlZCAmYW1wOyBEZXNpZ25l ZCBzb21lIG5ldyANCm1vZGVsLjwvU1BBTj48L0I+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IFRhaG9tYTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0 eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBQQURESU5HLUJPVFRPTTogMHB0OyBMSU5FLUhFSUdIVDog MTcuNDVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFBBRERJTkctTEVGVDogMHB0 OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFBBRERJ TkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9cD48Qj48 U1BBTiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBG T05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IExFVFRFUi1T UEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoNTEsNTEsNTEpOyBGT05ULVNJWkU6IDEwcHQ7IEZPTlQt V0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5p bmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tc2hhZGlu ZzogcmdiKDI1NSwyNTUsMjU1KSIgDQpjbGFzcz0xNT5DYXRhbG9nIGNvdWxkIGJlIHNlbnQgaWYg eW91IGFyZSBpbnRlcmVzdGVkIGluLjwvU1BBTj48L0I+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6IFRhaG9tYTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCAN CnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBQQURESU5HLUJPVFRPTTogMHB0OyBMSU5FLUhFSUdI VDogMTcuNDVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFBBRERJTkctTEVGVDog MHB0OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFBB RERJTkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9cD48 U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1 NSwyNTUpOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28taGFu c2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1m b250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+Jm5i c3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0laRTog MTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVm dDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7IFRFWFQtSU5ERU5U OiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElORy1SSUdIVDogMHB0 OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDogMHB0OyBtc28tcGFn aW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPXA+PEI+PFNQQU4gDQpzdHlsZT0iVEVYVC1U UkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBC QUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBMRVRURVItU1BBQ0lORzogMHB0OyBDT0xPUjog cmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAxMHB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSki IA0KY2xhc3M9MTU+VGhhbmtzIGZvciB5b3VyIHZhbHVhYmxlIHRpbWUuPC9TUEFOPjwvQj48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9v OnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IFBBRERJTkctQk9U VE9NOiAwcHQ7IExJTkUtSEVJR0hUOiAxNy40NXB0OyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46 IDBwdDsgUEFERElORy1MRUZUOiAwcHQ7IFBBRERJTkctUklHSFQ6IDBwdDsgQkFDS0dST1VORDog cmdiKDI1NSwyNTUsMjU1KTsgUEFERElORy1UT1A6IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93 LW9ycGhhbiIgDQpjbGFzcz1wPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovkvZM7IEJB Q0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IEZPTlQtU0laRTogMTAuNXB0OyBGT05ULVdFSUdI VDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZh bWlseTogQXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQt ZmFtaWx5OiBBcmlhbDsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiBy Z2IoMjU1LDI1NSwyNTUpIj4mbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IFRhaG9tYTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0 eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBQQURESU5HLUJPVFRPTTogMHB0OyBMSU5FLUhFSUdIVDog MTcuNDVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFBBRERJTkctTEVGVDogMHB0 OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFBBRERJ TkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9cD48Qj48 U1BBTiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBG T05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IExFVFRFUi1T UEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoNTEsNTEsNTEpOyBGT05ULVNJWkU6IDEwcHQ7IEZPTlQt V0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5p bmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tc2hhZGlu ZzogcmdiKDI1NSwyNTUsMjU1KSIgDQpjbGFzcz0xNT5CLiBSZWdhcmRzITwvU1BBTj48L0I+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwv bzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBQQURESU5HLUJP VFRPTTogMHB0OyBMSU5FLUhFSUdIVDogMTcuNDVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lO OiAwcHQ7IFBBRERJTkctTEVGVDogMHB0OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJBQ0tHUk9VTkQ6 IHJnYigyNTUsMjU1LDI1NSk7IFBBRERJTkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRv dy1vcnBoYW4iIA0KY2xhc3M9cD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBC QUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlH SFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1m YW1pbHk6IEFyaWFsOyBtc28taGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250 LWZhbWlseTogQXJpYWw7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzog cmdiKDI1NSwyNTUsMjU1KSI+Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZ OiBUYWhvbWE7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpz dHlsZT0iVEVYVC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6 IDE3LjQ1cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBw dDsgUEFERElORy1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURE SU5HLVRPUDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPXA+PEI+ PFNQQU4gDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsg Rk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBMRVRURVIt U1BBQ0lORzogMHB0OyBDT0xPUjogcmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAxMHB0OyBGT05U LVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJu aW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRp bmc6IHJnYigyNTUsMjU1LDI1NSkiIA0KY2xhc3M9MTU+QW5nZWxvIEh1YW5nPC9TUEFOPjwvQj48 U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+ PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IFBBRERJTkct Qk9UVE9NOiAwcHQ7IExJTkUtSEVJR0hUOiAxNy40NXB0OyBURVhULUlOREVOVDogMHB0OyBNQVJH SU46IDBwdDsgUEFERElORy1MRUZUOiAwcHQ7IFBBRERJTkctUklHSFQ6IDBwdDsgQkFDS0dST1VO RDogcmdiKDI1NSwyNTUsMjU1KTsgUEFERElORy1UT1A6IDBwdDsgbXNvLXBhZ2luYXRpb246IHdp ZG93LW9ycGhhbiIgDQpjbGFzcz1wPjxCPjxTUEFOIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBu b25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDog cmdiKDI1NSwyNTUsMjU1KTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYig1MSw1MSw1 MSk7IEZPTlQtU0laRTogMTBwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZM7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpOyBtc28taGlnaGxp Z2h0OiByZ2IoMjU1LDI1NSwwKSIgDQpjbGFzcz0xNT5Ta3lwZTogZGF2aWUxODE4MTg8L1NQQU4+ PC9CPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEJBQ0tHUk9VTkQ6IHJnYigy NTUsMjU1LDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5Ozsg bXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1oaWdobGlnaHQ6IHJnYigyNTUsMjU1LDAp Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElO RS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9 TXNvTm9ybWFsPjwhLS1FbmRGcmFnbWVudC0tPjwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From sheena.29@hoistring.com Wed Aug 3 19:06:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=DATE_IN_PAST_12_24, FH_FROMEML_NOTLD,HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DACF77CA1 for ; Wed, 3 Aug 2016 19:06:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9C593304032 for ; Wed, 3 Aug 2016 17:06:36 -0700 (PDT) X-ASG-Debug-ID: 1470269192-0bf57b369c39d290001-NocioJ Received: from hoistring.com (no-data [60.27.28.113]) by cuda.sgi.com with SMTP id 24fEgdl0Dc9R6qZT for ; Wed, 03 Aug 2016 17:06:33 -0700 (PDT) X-Barracuda-Envelope-From: sheena.29@hoistring.com X-Barracuda-Effective-Source-IP: no-data[60.27.28.113] X-Barracuda-Apparent-Source-IP: 60.27.28.113 Received: from ksbwyj[127.0.0.1] by KSBWYJ[127.0.0.1] (SMTPD32); Wed, 3 Aug 2016 14:29:51 +0800 From: "rigging1@yeah.net " Subject: 2016-08-03 14:29:51G80 hoist ring manufacturer To: xfs@oss.sgi.com X-ASG-Orig-Subj: 2016-08-03 14:29:51G80 hoist ring manufacturer MIME-Version: 1.0 Sender: sheena.29@hoistring.com Reply-To: rigging1@yeah.net Date: Wed, 3 Aug 2016 14:29:51 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: no-data[60.27.28.113] X-Barracuda-Start-Time: 1470269192 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1006 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.66 X-Barracuda-Spam-Status: No, SCORE=1.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0713, BSF_SC7_SA298e, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.20 BSF_SC7_SA298e Custom Rule SA298e 0.50 BSF_SC0_MV0713 Custom rule MV0713 Message-Id: <20160804000636.5F9DA64005C@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC4xMDU4Ni4xNjIiPjwvSEVBRD4NCjxCT0RZPg0KPFA+SEk8L1A+DQo8 UD5UaGlzIGlzIFNoZWVuYSBmcm9tIFlpeXVuIFJpZ2dpbmcgQ28uLCBMdGQgKENoaW5hKS4gR2xh ZCB0byBrbm93IHlvdSBhcmUgb24gDQp0aGUgbWFya2V0IG9mIHN3aXZlbCBob2lzdCByaW5nLCBX ZSBhcmUgZGVsaWNhdGVkIGluZHVzdHJpYWwgUmlnZ2luZyBob2lzdCByaW5nLCANCiZuYnNwO3N3 aXZlbCBleWUgYm9sdHMgYW5kIGxpZnRpbmcgcG9pbnQgZGVzaWduLCBSJmFtcDtEIHByb2Zlc3Np b25hbCANCm1hbnVmYWN0dXJlcnMuPC9QPg0KPFA+VGhlIENhdGFsb2cgJmFtcDsgU2FtcGxlcyBj YW4gYmUgb2ZmZXJlZCBpZiBwcmljZSBpcyBvaywgV2UmIzM5O3JlIHN1cmUgeW91ciBhbnkgDQpp bnF1aXJ5IG9yIHJlcXVpcmVtZW50IHdpbGwgZ2V0IHByb21wdCBhdHRlbnRpb24uIDwvUD4NCjxQ PkJlc3QmYW1wO3JlZ2FyZDwvUD4NCjxQPlNoZWVuYTxCUj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS08L1A+DQo8UD5TYWxlcyANCkRlcGFydG1lbnQ8QlI+RS1tYWlsOnN3aXZlbF9ob2lz dF9yaW5nQDEyNi5jb208QlI+U2t5cGU6c2hlZW5hLndhbmcyMDExPEJSPkNlbGwgDQpwaG9uZTow MDg2LTE4NjIyODYzNjIyPEJSPlRpYW5qaW4gWWl5dW4gUmlnZ2luZyBDby4sTHRkPEJSPkFkZHJl c3M6IE5vLjcsIA0KWGlhbmdqaWFuZyBSaW5nIFJvYWQsIERpc3RyaWN0IEEsIEhvbmcgS29uZyBH YXJkZW4sIERvbmdsaSBEZXZlbG9wbWVudCBab25lIA0KLFRpYW5qaW4sIENoaW5hPEJSPlppcCBD b2RlOiAzMDAzMDA8QlI+PC9QPjwvQk9EWT48L0hUTUw+DQoNCg== From shaun.tancheff@seagate.com Wed Aug 3 19:31:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C7DA27CA1 for ; Wed, 3 Aug 2016 19:31:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4FBF7AC002 for ; Wed, 3 Aug 2016 17:30:59 -0700 (PDT) X-ASG-Debug-ID: 1470270652-0bf8157e6c428e50001-NocioJ Received: from mx0a-000cda01.pphosted.com (mx0b-00003501.pphosted.com [67.231.152.68]) by cuda.sgi.com with ESMTP id 3KrtQJUlof1VmGtf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 17:30:52 -0700 (PDT) X-Barracuda-Envelope-From: shaun.tancheff@seagate.com X-Barracuda-Effective-Source-IP: mx0b-00003501.pphosted.com[67.231.152.68] X-Barracuda-Apparent-Source-IP: 67.231.152.68 Received: from pps.filterd (m0075034.ppops.net [127.0.0.1]) by mx0b-00003501.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u740S0aa010908 for ; Wed, 3 Aug 2016 20:30:51 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=seagate.com; h=mime-version : in-reply-to : references : from : date : message-id : subject : to : cc : content-type; s=s2016050306; bh=B7huOIrn4mLQTR7vic5j4jla/BHxWsyZon0JWV3Ygwg=; b=ph2J4kEKXzmXzUCO8APonKSctKYN8dCDeET7kK1KyRbQGxn8wjj1e/B2O9kKuWS5atUB sjpYRKoCTsAWfDZ4/Ptvfi/yH7mrtOZ9gK+4cAi65oks4rJ7q55/6kDLsCfVpGbWRn6p tcgYFQ6FZslLAg1C/mZIq3yUfSd/GIhV9UNS6fJ8jkmi4OlJonEb4ufi2tbqTJOE6mWh Fr4QoLiO4I6Mlc8XYVeUun61YdhoJxPX6vxtr9RuxhzmpU53ur63b2z3lYQw0A9rVYJ/ 1No8KCFRU1W9bwD/GB+b2kaKhV5BcCmoP+aP/VluD0oZ8Dknj/E9A4cVR4x3V2fvzs9u gA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=seagate.com; h=mime-version : in-reply-to : references : from : date : message-id : subject : to : cc : content-type; s=proofpoint; bh=B7huOIrn4mLQTR7vic5j4jla/BHxWsyZon0JWV3Ygwg=; b=Xen0YIEmhVbFRfzbhQFqduw2RcwMxgV7ED4Xvv7zaO1fONJV/ilfFJj4PxtEcYbFq8gO crda4tHySupkFKFFY19Ryu5O7S0RF39S/RuS5RHH+1qvTwU0/XrCnQANJncQjvIOB70I nDtqv+FgLNPU+S/sX27UUCdoP+BdE1x/yZulzF0VO6nQRtjxRmFg/tu/1nz/TrkK6B+H wq75hhq3vgKMuq+ySm27zQuZadPyKVfXx7Y/J+UYh0uEa4P4Vmp3Lu7FuIrNMQwnGmpu RNICSe7Kv0GWj13pkNKBTDyv9DAit++f347/zBrCBZq96Ld49OP7fnYwIOtGXv0widZD kg== Authentication-Results: seagate.com; dkim=pass header.s="google" header.d=seagate.com Received: from mail-qt0-f197.google.com (mail-qt0-f197.google.com [209.85.216.197]) by mx0b-00003501.pphosted.com with ESMTP id 24ktbr08v1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Wed, 03 Aug 2016 20:30:51 -0400 Received: by mail-qt0-f197.google.com with SMTP id n6so384509085qtn.2 for ; Wed, 03 Aug 2016 17:30:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seagate.com; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=96g5QOCn2AsIXj134OpL/MPc89ZpHnFxQ4DAOdlTzL8=; b=JQM/f4YedCTl5dM02f0R8Oqexn8P1MyDm6C4MhqLuesuzmPprUEDsWLoFweN2G6ym+ gD3SKjMj/EXQ87I02Rjy+6rFuRGKyILaLLcLdDCkEE4rqwXobW5ZEAJzQkChf96+93Wm Fiyyr9nKnPXWWCWuDdWmClyQhvFIdogvdZzR7FRGw7Grc82BlXesHGNbNfN8c3XOFI7y nh1vfUzhSG4k6wpTCJ4x0FxFze6NTyxm5f6a9PwdsajxvCt+NAe6f6f4qz2GGOce/K8K 07/c3CvrHcJPZ7EEXLzq/fN1x51h+Sb5ga+ZnpcvopVt9FHrbuW4xvBRAf1dy9l7dKoK zxlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=96g5QOCn2AsIXj134OpL/MPc89ZpHnFxQ4DAOdlTzL8=; b=iadfYvOWi6RDPKAlM3LnIhw9hZe7AOSK2LNDsF3kardGN5dP+MIb5zmttT3xKmXc4Q 7GMOlLQdIfA/b8PZ0SLhfVgqSNiB2ffih7AcneVPdMeVPQm9bhH52hsWKHwqIWAIZlDq WSqbiGSMUdZXDVgvTsvSW8UrzFGmKzzjL6DZU4eT8mxi2jwG5tLglHf6tqGZFmp6LmPp UOEobpo2MOKqHdIR0FHsRMQgsT1fTuJo3OhG/Bry+Wsts4H//Xw/f08M3pjMpE1r2i6F 6HH/XWp68BZdeZMkgBV1bFQL6h6uAk35Or4o31cjkv5g+hq43No8yd5OQ03sG9ZS0fpT 8qGg== X-Gm-Message-State: AEkoousK1ZuWrEKzPolvAgKDUYo+j+1FVkB9BKURDLB89YFiLK2y0eERCBqVewSXwvtTBkEqL2gDJUtxQHTJDxGg+2VrIgTYruDa4iA/NDymaJ4rZOdqIAF6BWJxxe8HuqNT9rSqkXSVrA7NGygQ1vA6WbwZE7HifW55LABnaHc= X-Received: by 10.37.208.74 with SMTP id h71mr6092030ybg.146.1470270650409; Wed, 03 Aug 2016 17:30:50 -0700 (PDT) X-Received: by 10.37.208.74 with SMTP id h71mr6092000ybg.146.1470270650131; Wed, 03 Aug 2016 17:30:50 -0700 (PDT) MIME-Version: 1.0 Received: by 10.129.132.199 with HTTP; Wed, 3 Aug 2016 17:30:29 -0700 (PDT) In-Reply-To: <87fbe31f-27b3-ff7a-e381-34fc1aad337e@redhat.com> References: <1465155145-10812-1-git-send-email-mchristi@redhat.com> <1465155145-10812-38-git-send-email-mchristi@redhat.com> <87fbe31f-27b3-ff7a-e381-34fc1aad337e@redhat.com> From: Shaun Tancheff Date: Wed, 3 Aug 2016 19:30:29 -0500 Message-ID: Subject: Re: [PATCH 37/45] drivers: use req op accessor To: Mike Christie X-ASG-Orig-Subj: Re: [PATCH 37/45] drivers: use req op accessor Cc: Ross Zwisler , Ross Zwisler , Dave Chinner , Jens Axboe , linux-f2fs-devel@lists.sourceforge.net, linux-ext4 , konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel , linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, LKML , linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, XFS Developers , ocfs2-devel@oss.oracle.com Content-Type: text/plain; charset=UTF-8 X-Proofpoint-PolicyRoute: Outbound X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-08-03_16:,, signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 suspectscore=1 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 impostorscore=0 lowpriorityscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1608040003 X-Proofpoint-Spam-Policy: Default Domain Policy X-Barracuda-Connect: mx0b-00003501.pphosted.com[67.231.152.68] X-Barracuda-Start-Time: 1470270652 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2805 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Aug 3, 2016 at 6:47 PM, Mike Christie wrote: > On 08/03/2016 05:33 PM, Ross Zwisler wrote: >> On Sun, Jun 5, 2016 at 1:32 PM, wrote: >>> From: Mike Christie >>> >>> The req operation REQ_OP is separated from the rq_flag_bits >>> definition. This converts the block layer drivers to >>> use req_op to get the op from the request struct. >>> >>> Signed-off-by: Mike Christie >>> --- >>> drivers/block/loop.c | 6 +++--- >>> drivers/block/mtip32xx/mtip32xx.c | 2 +- >>> drivers/block/nbd.c | 2 +- >>> drivers/block/rbd.c | 4 ++-- >>> drivers/block/xen-blkfront.c | 8 +++++--- >>> drivers/ide/ide-floppy.c | 2 +- >>> drivers/md/dm.c | 2 +- >>> drivers/mmc/card/block.c | 7 +++---- >>> drivers/mmc/card/queue.c | 6 ++---- >> >> Dave Chinner reported a deadlock with XFS + DAX, which I reproduced >> and bisected to this commit: >> >> commit c2df40dfb8c015211ec55f4b1dd0587f875c7b34 >> Author: Mike Christie >> Date: Sun Jun 5 14:32:17 2016 -0500 >> drivers: use req op accessor >> >> Here are the steps to reproduce the deadlock with a BRD ramdisk: >> >> mkfs.xfs -f /dev/ram0 >> mount -o dax /dev/ram0 /mnt/scratch > > When using ramdisks, we need the attached patch like in your other bug > report. I think it will fix some hangs people are seeing. > > I do not think that it should cause the failure to run issue you saw > when doing generic/008 and ext2. > I think the translation in loop.c is suspicious here: "if use DIO && not (a flush_flag or discard_flag)" should translate to: "if use DIO && not ((a flush_flag) || op == discard)" But in the patch I read: "if use DIO && ((not a flush_flag) || op == discard) Which would have DIO && discards follow the AIO path? So I would humbly suggest something like the following (on top of commit c2df40dfb8c015211ec55f4b1dd0587f875c7b34): [Please excuse the messed up patch format ... gmail eats tabs] diff --git a/drivers/block/loop.c b/drivers/block/loop.c index b9b737c..0754d83 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1659,8 +1659,9 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, if (lo->lo_state != Lo_bound) return -EIO; - if (lo->use_dio && (!(cmd->rq->cmd_flags & REQ_FLUSH) || - req_op(cmd->rq) == REQ_OP_DISCARD)) + if (lo->use_dio && !( + (cmd->rq->cmd_flags & REQ_FLUSH) || + req_op(cmd->rq) == REQ_OP_DISCARD)) cmd->use_aio = true; else cmd->use_aio = false; -- Shaun Tancheff From darrick.wong@oracle.com Wed Aug 3 19:34:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 930537CA2 for ; Wed, 3 Aug 2016 19:34:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 13A99AC005 for ; Wed, 3 Aug 2016 17:34:07 -0700 (PDT) X-ASG-Debug-ID: 1470270842-0bf8157e6a429320001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id AeQMLBtxRaGX7MCo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 17:34:02 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u740Y0bo032686 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 4 Aug 2016 00:34:01 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u740Y0P0018891 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 00:34:00 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u740XxIA026683; Thu, 4 Aug 2016 00:34:00 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 17:33:59 -0700 Date: Wed, 3 Aug 2016 17:33:54 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 09/17] common/dmerror: fix mount option issues Message-ID: <20160804003354.GD25565@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v2 09/17] common/dmerror: fix mount option issues References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> <20160803225004.GB25565@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803225004.GB25565@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470270842 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1393 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 03:50:04PM -0700, Darrick J. Wong wrote: > Calling _mount doesn't work when we want to add mount options > such as realtime devices. Since it's just a normal scratch device > mount except for the source device, just call _scratch_mount with > SCRATCH_DEV set to the dmerror device. > > v2: Use the standard _scratch_options for mounting. > > Signed-off-by: Darrick J. Wong > --- > common/dmerror | 8 ++------ > 1 file changed, 2 insertions(+), 6 deletions(-) > > diff --git a/common/dmerror b/common/dmerror > index 5ad9994..d05c4c8 100644 > --- a/common/dmerror > +++ b/common/dmerror > @@ -41,14 +41,10 @@ _dmerror_init() > DMERROR_TABLE="0 $blk_dev_size error $dm_backing_dev 0" > } > > -_dmerror_mount_options() > -{ > - echo `_common_dev_mount_options $*` $DMERROR_DEV $SCRATCH_MNT > -} > - > _dmerror_mount() > { > - _mount -t $FSTYP `_dmerror_mount_options $*` > + _scratch_options mount > + $MOUNT_PROG -t $FSTYP `_common_dev_mount_options $*` $SCRATCH_OPTIONS \ ...aaand of course the next line accidentally got erased. Sigh. v3 it is. --D > } > > _dmerror_unmount() > -- > To unsubscribe from this list: send the line "unsubscribe fstests" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From darrick.wong@oracle.com Wed Aug 3 19:34:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 21EEF7CA2 for ; Wed, 3 Aug 2016 19:34:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E7827304032 for ; Wed, 3 Aug 2016 17:34:41 -0700 (PDT) X-ASG-Debug-ID: 1470270880-0bf57c13673422d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id FPaB3qoYbDMICWE4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 17:34:40 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u740YdxE000814 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 00:34:39 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u740YcQD019388 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 00:34:39 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u740Yavp019887; Thu, 4 Aug 2016 00:34:37 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 17:34:36 -0700 Date: Wed, 3 Aug 2016 17:34:35 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH v3 09/17] common/dmerror: fix mount option issues Message-ID: <20160804003435.GE25565@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v3 09/17] common/dmerror: fix mount option issues References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914483353.11762.14647880235199676753.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470270880 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1001 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31736 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Calling _mount doesn't work when we want to add mount options such as realtime devices. Since it's just a normal scratch device mount except for the source device, just call _scratch_mount with SCRATCH_DEV set to the dmerror device. v2: Use the standard _scratch_options for mounting. Signed-off-by: Darrick J. Wong --- common/dmerror | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/common/dmerror b/common/dmerror index 5ad9994..d46c5d0 100644 --- a/common/dmerror +++ b/common/dmerror @@ -41,14 +41,11 @@ _dmerror_init() DMERROR_TABLE="0 $blk_dev_size error $dm_backing_dev 0" } -_dmerror_mount_options() -{ - echo `_common_dev_mount_options $*` $DMERROR_DEV $SCRATCH_MNT -} - _dmerror_mount() { - _mount -t $FSTYP `_dmerror_mount_options $*` + _scratch_options mount + $MOUNT_PROG -t $FSTYP `_common_dev_mount_options $*` $SCRATCH_OPTIONS \ + $DMERROR_DEV $SCRATCH_MNT } _dmerror_unmount() From david@fromorbit.com Wed Aug 3 19:47:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9C2AB7CA1 for ; Wed, 3 Aug 2016 19:47:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4FF5A8F8033 for ; Wed, 3 Aug 2016 17:47:52 -0700 (PDT) X-ASG-Debug-ID: 1470271669-0bf8157e6c42b0d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 3XIaAqbX7aW1gfGS for ; Wed, 03 Aug 2016 17:47:49 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CPDwAgkKJXIMmOLHldg0WBUoZynS0GjGCGDYQMhhcCAgEBAoFJTQEBAQEBAQcBAQEBAQE4QIRfAQU6HCMQCAMYCSUPBSUDBxoTiDC/ZgELASQehUSFFYobBY4Xix2OdY9KSItog3eEYCoyiFoBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Aug 2016 10:17:47 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bV6p9-0001LQ-4D; Thu, 04 Aug 2016 10:47:47 +1000 Date: Thu, 4 Aug 2016 10:47:47 +1000 From: Dave Chinner To: Felix Janda Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160804004747.GZ16044@dastard> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160801065410.GA341@nyan> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1470271669 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1059 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 01, 2016 at 08:54:10AM +0200, Felix Janda wrote: > Christoph Hellwig wrote: > > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > > int64_t is guaranteed to have the correct size and signedness and is > > > always avaible because linux.h has a include. > > > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > > public header is included without _LARGEFILE64_SOURCE or > > > _GNU_SOURCE defined. This bug was introduced in commit > > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. > > Thanks for the suggestion, but that does not work if the system header > defining (or not) off64_t is included before the xfs headers. Which, to me, is a build bug in whatever code is including the xfs headers. Isn't it the responsibility of the build environment to ensure the dependencies of the libraries being used are correctly met? Cheers, Dave. -- Dave Chinner david@fromorbit.com From robin.listas@telefonica.net Wed Aug 3 19:51:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 85E8A7CA1 for ; Wed, 3 Aug 2016 19:51:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 58C448F8037 for ; Wed, 3 Aug 2016 17:51:52 -0700 (PDT) X-ASG-Debug-ID: 1470271908-0bf57b369d3a0aa0001-NocioJ Received: from smtp.movistar.es (smtp22.acens.net [86.109.99.146]) by cuda.sgi.com with ESMTP id UGXxCiGZpzC4i7e9 for ; Wed, 03 Aug 2016 17:51:49 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@telefonica.net X-Barracuda-Effective-Source-IP: smtp22.acens.net[86.109.99.146] X-Barracuda-Apparent-Source-IP: 86.109.99.146 X-Junkmail-Premium-Raw: score=7/50,refid=2.7.2:2016.8.3.164817:17:7.944,ip=,rules=__BOUNCE_CHALLENGE_SUBJ, __BOUNCE_NDR_SUBJ_EXEMPT, __SUBJ_ALPHA_END, __TO_MALFORMED_2, __TO_NAME, __TO_NAME_DIFF_FROM_ACC, __REFERENCES, __HAS_FROM, __HAS_MSGID, __SANE_MSGID, __USER_AGENT, __MOZILLA_USER_AGENT, __MIME_VERSION, __IN_REP_TO, __CT, __CT_TEXT_PLAIN, __CTE, __SUBJ_ALPHA_NEGATE, __LINES_OF_YELLING, BODYTEXTP_SIZE_3000_LESS, BODY_SIZE_900_999, __MIME_TEXT_ONLY, HTML_00_01, HTML_00_10, BODY_SIZE_5000_LESS, NO_URI_FOUND, NO_CTA_URI_FOUND, BODY_SIZE_1000_LESS, BODY_SIZE_2000_LESS, IN_REP_TO, REFERENCES, BODY_SIZE_7000_LESS, NO_URI_HTTPS, MSG_THREAD, __TO_REAL_NAMES, LEGITIMATE_SIGNS, LEGITIMATE_NEGATE Received: from minas-tirith.valinor (88.17.65.53) by smtp.movistar.es (8.6.122.03) (authenticated as robin.listas2) id 5784FE46013C6F8C for xfs@oss.sgi.com; Thu, 4 Aug 2016 00:51:47 +0000 Received: from minas-tirith.valinor (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id 01799181225 for ; Thu, 4 Aug 2016 02:51:47 +0200 (CEST) Subject: Re: Spam on this list To: XFS mailing list X-ASG-Orig-Subj: Re: Spam on this list References: <4278AB9734C1445A8E48635B155149F8@dinulap> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> <4382687.Pe7d1tBhVA@merkaba> <9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net> <20160803231529.GX16044@dastard> From: "Carlos E. R." Message-ID: Date: Thu, 4 Aug 2016 02:51:47 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2 MIME-Version: 1.0 In-Reply-To: <20160803231529.GX16044@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp22.acens.net[86.109.99.146] X-Barracuda-Start-Time: 1470271909 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 914 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 On 2016-08-04 01:15, Dave Chinner wrote: > On Wed, Aug 03, 2016 at 03:34:58PM +0200, Carlos E. R. wrote: >> On 2016-08-03 15:21, Martin Steigerwald wrote: ... > Thoughts? I have no objection to either staying or moving :-) That is, I can live with the spam, and I can live with the move. You do not need to care for people like me, we are just "users" ;-) It is mostly the contributors you have to mind most. I suppose that as log as you leave an autoresponder it will be Ok. So go ahead when you wish :-) - -- Cheers / Saludos, Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAleikaMACgkQja8UbcUWM1x4AgD/b5NpxNS0O1LFuYAlBpdvMG7R Ikr5YoxtNqLT9EcT8YQA/1O9P1p977AEOSlHxbxP3YMB4uEsea8p2PCaGINCUrKr =OIsJ -----END PGP SIGNATURE----- From darrick.wong@oracle.com Wed Aug 3 19:58:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 335E57CA1 for ; Wed, 3 Aug 2016 19:58:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EBC82304032 for ; Wed, 3 Aug 2016 17:58:53 -0700 (PDT) X-ASG-Debug-ID: 1470272331-0bf57c136a343ff0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 2hsshb4cBMHkVglR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 17:58:52 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u740wnMa019531 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 00:58:49 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.13.8/8.13.8) with ESMTP id u740wm3J028522 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 00:58:49 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u740wiDM001809; Thu, 4 Aug 2016 00:58:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 03 Aug 2016 17:58:44 -0700 Date: Wed, 3 Aug 2016 17:58:43 -0700 From: "Darrick J. Wong" To: Mark Fasheh Cc: linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160804005843.GJ8593@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803205520.GQ8590@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470272332 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2740 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 01:55:20PM -0700, Darrick J. Wong wrote: > On Wed, Aug 03, 2016 at 12:45:36PM -0700, Mark Fasheh wrote: > > Hi Darrick, > > > > On Wed, Jul 20, 2016 at 09:55:55PM -0700, Darrick J. Wong wrote: > > > Hi all, > > > > > > This is the seventh revision of a patchset that adds to XFS kernel > > > support for tracking reverse-mappings of physical blocks to file and > > > metadata (rmap). Per reviewers' request with v6, I am splitting the > > > gigantic patchbombs into separate functional areas. Given the > > > significant amount of design assumptions that change with block > > > sharing, rmap and reflink are provided together. There shouldn't be > > > any incompatible on-disk format changes, pending a thorough review of > > > the patches within. > > > > Where can I the patches to enable dedupe_range on xfs? I tested your > > previous devel branch based on Linux v4.7-rc3 with duperemove > > (https://github.com/markfasheh/duperemove) and it worked extremely well - > > even handling some cases that btrfs still has issues with. I actually > > committed the code to enable xfs support in duperemove so anyone can test on > > xfs with the dedupe_range patches. > > > > I'd gladly test your latest patches by doing my usual 'large' duperemove > > tests once I can get ahold of the dedupe_range work :) > > Your best bets are probably the -experimental trees: > https://github.com/djwong/linux/commits/djwong-experimental > https://github.com/djwong/xfsprogs/commits/djwong-experimental > > I haven't updated them in a while because I've been busy trying > to get reverse-mapping (the start of those patchbombs) into 4.8. > > Just as a warning, don't put anything critical on those XFS filesystems > because there's going to be a disk format update between now and the > next time I post the patches because Dave and I decided to cache the > block counts for the new btrees in order to speed up mounting. I don't > anticipate having time to clean up my dev tree and push to github until > a week or two after the merge window closes. That said, all the craziness from the last two weeks (xfs_scrub sprint and the rmapbt review fixes) are now in the -wtf tree, which /should/ behave. I've dumped everything there in completely not cleaned up format, but this does have the AGF btree block counter stuff I talked about above. https://github.com/djwong/linux/commits/djwong-wtf https://github.com/djwong/xfsprogs/commits/djwong-wtf --D > > --D > > > > > Thanks, > > --Mark > > > > -- > > Mark Fasheh > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From being@news1.kr Wed Aug 3 20:06:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=AXB_XMAILER_MIMEOLE_OL_E023A, HTML_MESSAGE,HTML_OBFUSCATE_10_20,UNPARSEABLE_RELAY,WEIRD_PORT autolearn=no version=3.3.1 X-Original-To: xfs@OSS.SGI.com Delivered-To: xfs@OSS.SGI.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C30A97CA1 for ; Wed, 3 Aug 2016 20:06:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35789AC002 for ; Wed, 3 Aug 2016 18:06:02 -0700 (PDT) X-ASG-Debug-ID: 1470272754-0bf57c136a344860001-ps1ADW Received: from mail.news1.kr ([61.100.184.85]) by cuda.sgi.com with ESMTP id UUC6uMHdwoZJDDrm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 18:05:57 -0700 (PDT) X-Barracuda-Envelope-From: being@news1.kr X-Barracuda-Effective-Source-IP: UNKNOWN[61.100.184.85] X-Barracuda-Apparent-Source-IP: 61.100.184.85 Received: (Mail Queue Handler, PID 766 invoked by UID 1008); 4 Aug 2016 10:05:48 +0900 Received: from 220.180.241.116 (HELO arkhbgdv) (FROM: being@news1.kr) by 0 (SMTP Handler) with ESMTPA; 4 Aug 2016 10:05:48 +0900 Reply-To: <838550257@qq.com> Message-ID: <4BB0E5A4C01ED0395B2268029BE1CF8F@arkhbgdv> From: "admin" To: Subject: =?utf-8?B?T0Hpgq7nrrHljYfnuqc=?= Date: Thu, 4 Aug 2016 09:05:31 +0800 X-ASG-Orig-Subj: =?utf-8?B?T0Hpgq7nrrHljYfnuqc=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0D95_017E684A.1B0F0030" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 Disposition-Notification-To: 838550257@qq.com X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-Remote-Client-IP: 220.180.241.116 X-HMAC-SMTP-Auth-Info: <33e596294f7d98ac9f9d3281eddaf3e0> X-HMAC-Message-ID: <8fa0ff1925b7280872fd76662f3f9f38> X-Filter-Host: new-news1 X-Filter-SR: 1.00 X-Filter-Spam: S-FILTER Intelligent SPAM Detection Module V1.20 RC4 (20080922); 4 Aug 2016 10:05:48 +0900 X-Barracuda-Connect: UNKNOWN[61.100.184.85] X-Barracuda-Start-Time: 1470272757 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6114 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: weieryanjing.com X-Barracuda-Spam-Score: 1.10 X-Barracuda-Spam-Status: No, SCORE=1.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0113c, BSF_SC5_MJ1963, HTML_MESSAGE, HTML_OBFUSCATE_10_20, RDNS_NONE, UNPARSEABLE_RELAY, WEIRD_PORT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31737 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.50 WEIRD_PORT URI: Uses non-standard port number for HTTP 0.00 HTML_OBFUSCATE_10_20 BODY: Message is 10% to 20% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=_NextPart_000_0D95_017E684A.1B0F0030 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 DQoNCuWwiuaVrOeahOmihuWvvOS7peWPiuWQjOS6i++8mg0KDQoNCg0K55Sx5LqO6YOo5YiG56a7 6IGM5ZGY5bel56a76IGM5Yqe6YKu566x5pyq5LiK57y077yM5a+86Ie06LWE5paZ5rOE6ZyyT0Hp gq7nu5/nmoTlronlhajov5DokKXvvIENCg0KDQrnjrDor7flnKjlkZjlt6XphY3lkIjpgq7nrrHl pIfmoYjnmbvorrDvvIzpgL7ml7bmnKrlpIfmoYjnmoTpgq7nrrHlsIbliKDpmaTlpITnkIbjgIIN Cg0K54K5IOWHuyDlpIcg5qGIIOaIquatouaXpeacn++8mjIwMTblubQ45pyIMTHml6UNCg0KDQoN Cg0KICA= ------=_NextPart_000_0D95_017E684A.1B0F0030 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjYwMDEuMjM1MzIiPjwvSEVBRD4NCjxCT0RZPg0KPERJVj4NCjxESVYg DQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiAnbHVjaWRhIEdyYW5kZScs IFZlcmRhbmEsICdNaWNyb3NvZnQgWWFIZWknOyBDT0xPUjogcmdiKDAsMTI4LDApIj48Rk9OVCAN CnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweCIgY29sb3I9YmxhY2s+PEZPTlQgc2l6ZT01PjxCUj48 L0ZPTlQ+PC9GT05UPjwvRElWPg0KPERJViANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweDsgRk9O VC1GQU1JTFk6ICdsdWNpZGEgR3JhbmRlJywgVmVyZGFuYSwgJ01pY3Jvc29mdCBZYUhlaSc7IENP TE9SOiByZ2IoMCwxMjgsMCkiPjxGT05UIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4IiBjb2xv cj1ibGFjaz48Rk9OVCANCnNpemU9NT7lsIrmlaznmoTpooblr7zku6Xlj4rlkIzkuovvvJo8L0ZP TlQ+PEJSPjwvRk9OVD48L0RJVj4NCjxESVYgDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZP TlQtRkFNSUxZOiAnbHVjaWRhIEdyYW5kZScsIFZlcmRhbmEsICdNaWNyb3NvZnQgWWFIZWknOyBD T0xPUjogcmdiKDAsMTI4LDApIj48Rk9OVCANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweCIgY29s b3I9YmxhY2s+PEJSPjwvRk9OVD48L0RJVj4NCjxESVYgDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIz cHg7IEZPTlQtRkFNSUxZOiAnbHVjaWRhIEdyYW5kZScsIFZlcmRhbmEsICdNaWNyb3NvZnQgWWFI ZWknOyBDT0xPUjogcmdiKDAsMTI4LDApIj48Rk9OVCANCnNpemU9ND48Rk9OVCBzdHlsZT0iTElO RS1IRUlHSFQ6IDIzcHgiIA0KY29sb3I9IzAwMDAwMD7nlLHkuo7pg6jliIbnprvogYzlkZjlt6Xn prvogYzlip7pgq7nrrHmnKrkuIrnvLTvvIzlr7zoh7TotYTmlpnms4TpnLI8L0ZPTlQ+PFNQQU4g DQpzdHlsZT0iTElORS1IRUlHSFQ6IDEuNTsgRk9OVC1GQU1JTFk6IFZlcmRhbmE7IENPTE9SOiBy Z2IoMCwwLDApIj5PQemCrue7n+eahOWuieWFqOi/kOiQpe+8gTwvU1BBTj48L0ZPTlQ+PC9ESVY+ DQo8RElWIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogJ2x1Y2lkYSBH cmFuZGUnLCBWZXJkYW5hLCAnTWljcm9zb2Z0IFlhSGVpJzsgQ09MT1I6IHJnYigwLDEyOCwwKSI+ PEZPTlQgDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHgiIGNvbG9yPSMwMDAwMDAgc2l6ZT00PjxT UEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogQXJpYWw7IGZvbnQt c3RyZXRjaDogbm9ybWFsIj48QlI+PC9TUEFOPjwvRk9OVD48L0RJVj4NCjxESVYgDQpzdHlsZT0i TElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiAnbHVjaWRhIEdyYW5kZScsIFZlcmRhbmEs ICdNaWNyb3NvZnQgWWFIZWknOyBDT0xPUjogcmdiKDAsMTI4LDApIj48Rk9OVCANCnN0eWxlPSJM SU5FLUhFSUdIVDogMjNweCIgY29sb3I9IzAwMDAwMCBzaXplPTQ+PFNQQU4gDQpzdHlsZT0iTElO RS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiBBcmlhbDsgZm9udC1zdHJldGNoOiBub3JtYWwi PueOsDwvU1BBTj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweDsgRk9OVC1GQU1JTFk6 IEFyaWFsOyBmb250LXN0cmV0Y2g6IG5vcm1hbCI+6K+3PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJ TkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogQXJpYWw7IGZvbnQtc3RyZXRjaDogbm9ybWFs Ij7lnKg8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZ OiBBcmlhbDsgZm9udC1zdHJldGNoOiBub3JtYWwiPuWRmDwvU1BBTj48U1BBTiANCnN0eWxlPSJM SU5FLUhFSUdIVDogMjNweDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBmb250LXN0cmV0Y2g6IG5vcm1h bCI+5belPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlM WTogQXJpYWw7IGZvbnQtc3RyZXRjaDogbm9ybWFsIj7phY08L1NQQU4+PFNQQU4gDQpzdHlsZT0i TElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiBBcmlhbDsgZm9udC1zdHJldGNoOiBub3Jt YWwiPuWQiDwvU1BBTj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweDsgRk9OVC1GQU1J TFk6IEFyaWFsOyBmb250LXN0cmV0Y2g6IG5vcm1hbCI+6YKuPC9TUEFOPjxTUEFOIA0Kc3R5bGU9 IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogQXJpYWw7IGZvbnQtc3RyZXRjaDogbm9y bWFsIj7nrrE8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFN SUxZOiBBcmlhbDsgZm9udC1zdHJldGNoOiBub3JtYWwiPuWkhzwvU1BBTj48U1BBTiANCnN0eWxl PSJMSU5FLUhFSUdIVDogMjNweDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBmb250LXN0cmV0Y2g6IG5v cm1hbCI+5qGIPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZB TUlMWTogQXJpYWw7IGZvbnQtc3RyZXRjaDogbm9ybWFsIj7nmbs8L1NQQU4+PFNQQU4gDQpzdHls ZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiBBcmlhbDsgZm9udC1zdHJldGNoOiBu b3JtYWwiPuiusO+8jOmAvjwvU1BBTj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweDsg Rk9OVC1GQU1JTFk6IEFyaWFsOyBmb250LXN0cmV0Y2g6IG5vcm1hbCI+5pe2PC9TUEFOPjxTUEFO IA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogQXJpYWw7IGZvbnQtc3Ry ZXRjaDogbm9ybWFsIj7mnKo8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7 IEZPTlQtRkFNSUxZOiBBcmlhbDsgZm9udC1zdHJldGNoOiBub3JtYWwiPuWkhzwvU1BBTj48U1BB TiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBmb250LXN0 cmV0Y2g6IG5vcm1hbCI+5qGIPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4 OyBGT05ULUZBTUlMWTogQXJpYWw7IGZvbnQtc3RyZXRjaDogbm9ybWFsIj7nmoQ8L1NQQU4+PFNQ QU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiBBcmlhbDsgZm9udC1z dHJldGNoOiBub3JtYWwiPumCrjwvU1BBTj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNw eDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBmb250LXN0cmV0Y2g6IG5vcm1hbCI+566xPC9TUEFOPjxT UEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogQXJpYWw7IGZvbnQt c3RyZXRjaDogbm9ybWFsIj7lsIY8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIz cHg7IEZPTlQtRkFNSUxZOiBBcmlhbDsgZm9udC1zdHJldGNoOiBub3JtYWwiPuWIoDwvU1BBTj48 U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBmb250 LXN0cmV0Y2g6IG5vcm1hbCI+6ZmkPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAy M3B4OyBGT05ULUZBTUlMWTogQXJpYWw7IGZvbnQtc3RyZXRjaDogbm9ybWFsIj7lpIQ8L1NQQU4+ PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiBBcmlhbDsgZm9u dC1zdHJldGNoOiBub3JtYWwiPueQhuOAgjwvU1BBTj48L0ZPTlQ+PC9ESVY+DQo8RElWIA0Kc3R5 bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogJ2x1Y2lkYSBHcmFuZGUnLCBWZXJk YW5hLCAnTWljcm9zb2Z0IFlhSGVpJzsgQ09MT1I6IHJnYigwLDEyOCwwKSI+PEZPTlQgDQpzaXpl PTQ+PEZPTlQgc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4IiBjb2xvcj0jMDAwMDAwPjxTUEFOIA0K c3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogQXJpYWw7IGZvbnQtc3RyZXRj aDogbm9ybWFsIj48L1NQQU4+PC9GT05UPjwvRk9OVD4mbmJzcDs8L0RJVj4NCjxESVYgDQpzdHls ZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiAnbHVjaWRhIEdyYW5kZScsIFZlcmRh bmEsICdNaWNyb3NvZnQgWWFIZWknOyBDT0xPUjogcmdiKDAsMTI4LDApIj48Rk9OVCANCnNpemU9 ND48Rk9OVCBzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHgiIGNvbG9yPSMwMDAwMDA+PEEgDQpzdHls ZT0iTElORS1IRUlHSFQ6IDIzcHg7IE9VVExJTkUtU1RZTEU6IG5vbmU7IE9VVExJTkUtQ09MT1I6 IGludmVydDsgT1VUTElORS1XSURUSDogbWVkaXVtOyBGT05ULUZBTUlMWTogQXJpYWw7IENPTE9S OiByZ2IoMCw1MSwxNTMpOyBDVVJTT1I6IHBvaW50ZXI7IGZvbnQtc3RyZXRjaDogbm9ybWFsIiAN CmhyZWY9Imh0dHA6Ly93d3cud2VpZXJ5YW5qaW5nLmNvbToxMC8iIA0KdGFyZ2V0PV9ibGFuaz48 Qj7ngrk8L0I+Jm5ic3A7PEI+5Ye7PC9CPiZuYnNwOzxCPuWkhzwvQj4mbmJzcDs8Qj7moYg8L0I+ PC9BPiZuYnNwOzwvRk9OVD48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweDsgQ09MT1I6 IHJnYigwLDAsMCk7IGZvbnQtc3RyZXRjaDogbm9ybWFsIj7miKrmraLml6XmnJ/vvJo8L1NQQU4+ PC9GT05UPjxTUEFOIA0Kc3R5bGU9IkJPUkRFUi1CT1RUT006IHJnYigyMDQsMjA0LDIwNCkgMXB4 IGRhc2hlZDsgTElORS1IRUlHSFQ6IDIzcHg7IENPTE9SOiByZ2IoMCwwLDApOyBmb250LXN0cmV0 Y2g6IG5vcm1hbCIgDQp0aW1lcz0iIiB0PSI1Ij48U1BBTiBzdHlsZT0iQk9SREVSLUJPVFRPTTog cmdiKDIwNCwyMDQsMjA0KSAxcHggZGFzaGVkIiB0aW1lcz0iIiANCnQ9IjUiPjxGT05UIHNpemU9 ND4yMDE25bm0OOaciDEx5pelPC9GT05UPjwvU1BBTj48L1NQQU4+PC9ESVY+PC9ESVY+DQo8RElW IA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlMWTogJ2x1Y2lkYSBHcmFuZGUn LCBWZXJkYW5hLCAnTWljcm9zb2Z0IFlhSGVpJzsgQ09MT1I6IHJnYigwLDEyOCwwKSI+PEZPTlQg DQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHgiIGNvbG9yPSMwMDAwMDA+PEJSPjwvRk9OVD48L0RJ Vj4NCjxESVYgDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHg7IEZPTlQtRkFNSUxZOiAnbHVjaWRh IEdyYW5kZScsIFZlcmRhbmEsICdNaWNyb3NvZnQgWWFIZWknOyBDT0xPUjogcmdiKDAsMTI4LDAp Ij48Rk9OVCANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweCIgY29sb3I9IzAwMDAwMD48QlI+PC9G T05UPjwvRElWPg0KPERJViANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjNweDsgRk9OVC1GQU1JTFk6 ICdsdWNpZGEgR3JhbmRlJywgVmVyZGFuYSwgJ01pY3Jvc29mdCBZYUhlaSc7IENPTE9SOiByZ2Io MCwxMjgsMCkiPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4Ij4mbmJzcDs8L1NQQU4+ IA0KPERJViBzdHlsZT0iTElORS1IRUlHSFQ6IDIzcHgiPjxGT05UIHN0eWxlPSJMSU5FLUhFSUdI VDogMjNweCIgDQpjb2xvcj0jMDAwMDAwPjwvRk9OVD48QlI+PEJSPjwvRElWPg0KPERJViBzdHls ZT0iTElORS1IRUlHSFQ6IDIzcHgiPjxGT05UIHN0eWxlPSJMSU5FLUhFSUdIVDogMjNweCIgDQpj b2xvcj0jMDAwMDAwPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyM3B4OyBGT05ULUZBTUlM WTogQXJpYWw7IGZvbnQtc3RyZXRjaDogbm9ybWFsIj48L1NQQU4+PC9GT05UPjwvRElWPjwvRElW PjwvQk9EWT48L0hUTUw+DQo= ------=_NextPart_000_0D95_017E684A.1B0F0030-- From mfasheh@suse.de Wed Aug 3 21:19:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 86E207CA1 for ; Wed, 3 Aug 2016 21:19:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4B1D1304032 for ; Wed, 3 Aug 2016 19:18:59 -0700 (PDT) X-ASG-Debug-ID: 1470277135-0bf57c136a348aa0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id UJ3eewtmwxH9Rhkf (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 03 Aug 2016 19:18:56 -0700 (PDT) X-Barracuda-Envelope-From: mfasheh@suse.de X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 22F10AAEF; Thu, 4 Aug 2016 02:18:53 +0000 (UTC) Date: Wed, 3 Aug 2016 19:18:52 -0700 From: Mark Fasheh To: "Darrick J. Wong" Cc: linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160804021852.GK5316@wotan.suse.de> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support Reply-To: Mark Fasheh References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804005843.GJ8593@birch.djwong.org> Organization: SUSE Labs User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470277136 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2751 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 03, 2016 at 05:58:43PM -0700, Darrick J. Wong wrote: > On Wed, Aug 03, 2016 at 01:55:20PM -0700, Darrick J. Wong wrote: > > On Wed, Aug 03, 2016 at 12:45:36PM -0700, Mark Fasheh wrote: > > > Where can I the patches to enable dedupe_range on xfs? I tested your > > > previous devel branch based on Linux v4.7-rc3 with duperemove > > > (https://github.com/markfasheh/duperemove) and it worked extremely well - > > > even handling some cases that btrfs still has issues with. I actually > > > committed the code to enable xfs support in duperemove so anyone can test on > > > xfs with the dedupe_range patches. > > > > > > I'd gladly test your latest patches by doing my usual 'large' duperemove > > > tests once I can get ahold of the dedupe_range work :) > > > > Your best bets are probably the -experimental trees: > > https://github.com/djwong/linux/commits/djwong-experimental > > https://github.com/djwong/xfsprogs/commits/djwong-experimental > > > > I haven't updated them in a while because I've been busy trying > > to get reverse-mapping (the start of those patchbombs) into 4.8. > > > > Just as a warning, don't put anything critical on those XFS filesystems > > because there's going to be a disk format update between now and the > > next time I post the patches because Dave and I decided to cache the > > block counts for the new btrees in order to speed up mounting. I don't > > anticipate having time to clean up my dev tree and push to github until > > a week or two after the merge window closes. > > That said, all the craziness from the last two weeks (xfs_scrub sprint > and the rmapbt review fixes) are now in the -wtf tree, which /should/ > behave. I've dumped everything there in completely not cleaned up > format, but this does have the AGF btree block counter stuff I talked > about above. > > https://github.com/djwong/linux/commits/djwong-wtf > https://github.com/djwong/xfsprogs/commits/djwong-wtf Fantastic. Don't worry about corrupting data, I've been doing this long enough to know to use this only on scratch partitions for now :) I'm in the middle of a couple other tests but once I'm done there I'll grab those branches and give them another spin. Typically I'm running through 800G-1TB on these (with varying duplicated data percentages). Silly question which I could just answer by looking at the patches - are you reporting FIEMAP_EXTENT_SHARED yet for extents with more than one owner? We use that flag (by comparing SHARED bytes before and after dedupe) to give people an estimate of how much space was saved. I presume figuring the shared state of an extent would be as easy as querying the rmap btree, correct? --Mark -- Mark Fasheh From xzhou@redhat.com Wed Aug 3 21:45:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 528FD7CA1 for ; Wed, 3 Aug 2016 21:45:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2315D8F8033 for ; Wed, 3 Aug 2016 19:45:17 -0700 (PDT) X-ASG-Debug-ID: 1470278716-0bf57c1369349fc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EOcj9cQWNZbz6zE7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 19:45:17 -0700 (PDT) X-Barracuda-Envelope-From: xzhou@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E0B624E327; Thu, 4 Aug 2016 02:45:15 +0000 (UTC) Received: from localhost (dhcp-12-163.nay.redhat.com [10.66.12.163]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u742jE3i013388; Wed, 3 Aug 2016 22:45:15 -0400 Date: Thu, 4 Aug 2016 10:45:14 +0800 From: Xiong Zhou To: linux-nvdimm@ml01.01.org, xfs@oss.sgi.com Cc: linux-kernel@vger.kernel.org, jmoyer@redhat.com Subject: xfstests xfs fuzzers fail with DAX Message-ID: <20160804024514.GA2906@xzhoul.usersys.redhat.com> X-ASG-Orig-Subj: xfstests xfs fuzzers fail with DAX MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 04 Aug 2016 02:45:16 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470278716 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1856 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, A few xfs fuzzers in xfstests fail with dax mount option, pass without dax. They are xfs/086 xfs/088 xfs/089 xfs/091. xfstests to commit 4470ad4c7e (Jul 26) kernel to commit dd95069545 (Jul 24) + ./check xfs/091 FSTYP -- xfs (non-debug) PLATFORM -- Linux/x86_64 rhel73 4.7.0+ MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch xfs/091 104s Ran: xfs/091 Passed all 1 tests + echo 'MOUNT_OPTIONS="-o dax"' + ./check xfs/091 FSTYP -- xfs (non-debug) PLATFORM -- Linux/x86_64 rhel73 4.7.0+ MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 MOUNT_OPTIONS -- -o dax -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch xfs/091 104s ... - output mismatch (see /root/xfstests/results//xfs/091.out.bad) --- tests/xfs/091.out 2016-07-18 02:57:47.670000000 -0400 +++ /root/xfstests/results//xfs/091.out.bad 2016-08-03 22:38:14.948000000 -0400 @@ -6,6 +6,70 @@ + corrupt image + mount image + modify files +pwrite64: Structure needs cleaning +pwrite64: Structure needs cleaning +pwrite64: Structure needs cleaning +pwrite64: Structure needs cleaning ... (Run 'diff -u tests/xfs/091.out /root/xfstests/results//xfs/091.out.bad' to see the entire diff) Ran: xfs/091 Failures: xfs/091 Failed 1 of 1 tests # diff -u xfstests/tests/xfs/091.out /root/xfstests/results//xfs/091.out.bad --- xfstests/tests/xfs/091.out 2016-07-18 02:57:47.670000000 -0400 +++ /root/xfstests/results//xfs/091.out.bad 2016-08-03 22:38:14.948000000 -0400 @@ -6,6 +6,70 @@ + corrupt image + mount image + modify files +pwrite64: Structure needs cleaning +pwrite64: Structure needs cleaning + repair fs + mount image + chattr -R -i Thanks, Xiong From dan.j.williams@intel.com Wed Aug 3 21:52:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 24D647CA1 for ; Wed, 3 Aug 2016 21:52:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9028304032 for ; Wed, 3 Aug 2016 19:52:56 -0700 (PDT) X-ASG-Debug-ID: 1470279174-0bf57c136a34a600001-NocioJ Received: from mail-oi0-f49.google.com (mail-oi0-f49.google.com [209.85.218.49]) by cuda.sgi.com with ESMTP id kPMLKJyV47zLujEM (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 03 Aug 2016 19:52:55 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f49.google.com[209.85.218.49] X-Barracuda-Apparent-Source-IP: 209.85.218.49 Received: by mail-oi0-f49.google.com with SMTP id f189so31973425oig.3 for ; Wed, 03 Aug 2016 19:52:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=0teZmo3JWIW1SxIUujXF5R+48VbEoSXd5nI04kMhf7k=; b=txGJDK97+HkYy7QZ+b96gpRQdnaMfUQ/s9enXrgW1WxLv2ARrnspJ6a/+ossLCSVXa jTTwfgzfpSEfnsA9skCjOX1fQxwylIRF/Z6sYSBGDg1QWV3fMbx8A6JxpyjGYS4/5NOe 5dO8OwtYmppc4b3aKJkrLxjruJznz3XG9W266f79+1j/IvWKRJ3FHSsOZHX2Az3TLrqS VizekpnjmV+xAdq5cgpLgdbWC13mJ/l1KKGn4cbGhvraxp2SqiF+d90eIYwTjc4qT6Jm +NtQAh/O61AZ4ccbWuCfO5apHswBfzY59os+YcLn0S91QgkIMef4cBb8IRHXeojhReNG TxIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=0teZmo3JWIW1SxIUujXF5R+48VbEoSXd5nI04kMhf7k=; b=dkdwLvConeZ6YZBvGMhyygErrXT1+zL4E7j4b5cIobWw20N2/k2rSuskUrKQD679AZ HVgtNd5hrOFGGGD2b7ltCq0yIL9gqvSj7WkLGt/oKbz4bx62pjMPIIMmISXwpbqzfHBJ Us5s3eLaRxnKwikovOnnfO9CIVZn/UBj9yphNJSN87Dj2v+xRqI64l0hm+h4dRsNwdCD dPlNfZj/dDGOESi+datJt5CSYzWoo4IzHjTqpCy8VJNW1eV1tjrjSEJ7RXmwI1uUx71p 8i+af5to3d7fbCW5YgpnRUUbH5LALSKzmn621Gn/JIN0mQOhz6KYZWRkn0Ul0H6X3wVQ oUuA== X-Gm-Message-State: AEkoouvaTsHm5BGmoN6CcX3cRIcNvQ6RMYYn7kEYLB42VHKaifV26XNqgByEQ/iMHVBYR4xjXUh4BZb9UjNyfsXH X-Received: by 10.202.190.2 with SMTP id o2mr32091894oif.81.1470279174386; Wed, 03 Aug 2016 19:52:54 -0700 (PDT) MIME-Version: 1.0 Received: by 10.157.62.182 with HTTP; Wed, 3 Aug 2016 19:52:53 -0700 (PDT) In-Reply-To: <20160803231655.GY16044@dastard> References: <20160803003354.GP16044@dastard> <20160803171127.GA15876@linux.intel.com> <20160803223713.GA22364@linux.intel.com> <20160803231655.GY16044@dastard> From: Dan Williams Date: Wed, 3 Aug 2016 19:52:53 -0700 Message-ID: Subject: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems To: Dave Chinner X-ASG-Orig-Subj: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Cc: Ross Zwisler , XFS Developers , linux-fsdevel , "linux-nvdimm@lists.01.org" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f49.google.com[209.85.218.49] X-Barracuda-Start-Time: 1470279175 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1413 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Aug 3, 2016 at 4:16 PM, Dave Chinner wrote: > On Wed, Aug 03, 2016 at 04:37:13PM -0600, Ross Zwisler wrote: >> On Wed, Aug 03, 2016 at 11:11:27AM -0600, Ross Zwisler wrote: >> > On Wed, Aug 03, 2016 at 10:33:54AM +1000, Dave Chinner wrote: >> > > Hi folks, >> > > >> > > Just hit a reproducable hang in generic/361. Essentially this on >> > > a 8GB pmem device: >> > > >> > > mkfs.xfs -f /dev/pmem1 >> > > mount -o dax /dev/pmem1 /mnt/scratch >> > > xfs_io -f -c "truncate 1g" test.img >> > > losetup -f --show /mnt/scratch/test.img >> > > mkfs.xfs -f /dev/loop0 >> > > >> > > And the mkfs.xfs command hangs with a discard that never completes: > .... >> > > This only reproduces when the underlying filesystem is mounted with >> > > -o dax, so there is a bad interaction with loop devices and DAX >> > > occurring somewhere. generic/361 is a recent test (committed june 14) >> > > so this probably hasn't actually been tested until now. >> > > >> > > I haven't got time to look at this right now, hence the report. >> > >> > Cool, thanks for the report. I've reproduced this with linux/master, and the >> > test passes with v4.7. >> > >> > Running a bisect... >> >> This bisected to a commit to the block layer code. I've sent a bug report to >> the author of the commit. > > And the commit id is ...? c2df40dfb8c0 drivers: use req op accessor From sandeen@sandeen.net Wed Aug 3 22:00:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 58F227CA1 for ; Wed, 3 Aug 2016 22:00:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D05A5AC002 for ; Wed, 3 Aug 2016 20:00:15 -0700 (PDT) X-ASG-Debug-ID: 1470279610-0bf8157e6b433c40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FBqEv4iRvrGTa2fB for ; Wed, 03 Aug 2016 20:00:10 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 132849A for ; Wed, 3 Aug 2016 22:00:10 -0500 (CDT) Subject: Re: xfstests xfs fuzzers fail with DAX To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfstests xfs fuzzers fail with DAX References: <20160804024514.GA2906@xzhoul.usersys.redhat.com> From: Eric Sandeen Message-ID: Date: Wed, 3 Aug 2016 22:00:09 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160804024514.GA2906@xzhoul.usersys.redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1470279610 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1695 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31739 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/3/16 9:45 PM, Xiong Zhou wrote: > Hi, > > A few xfs fuzzers in xfstests fail with dax mount option, pass without dax. > They are xfs/086 xfs/088 xfs/089 xfs/091. > > xfstests to commit 4470ad4c7e (Jul 26) > kernel to commit dd95069545 (Jul 24) > > + ./check xfs/091 > FSTYP -- xfs (non-debug) > PLATFORM -- Linux/x86_64 rhel73 4.7.0+ > MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 > MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch > > xfs/091 104s > Ran: xfs/091 > Passed all 1 tests > > + echo 'MOUNT_OPTIONS="-o dax"' > + ./check xfs/091 > FSTYP -- xfs (non-debug) > PLATFORM -- Linux/x86_64 rhel73 4.7.0+ > MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 > MOUNT_OPTIONS -- -o dax -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch > > xfs/091 104s ... - output mismatch (see /root/xfstests/results//xfs/091.out.bad) > --- tests/xfs/091.out 2016-07-18 02:57:47.670000000 -0400 > +++ /root/xfstests/results//xfs/091.out.bad 2016-08-03 22:38:14.948000000 -0400 > @@ -6,6 +6,70 @@ > + corrupt image > + mount image > + modify files > +pwrite64: Structure needs cleaning > +pwrite64: Structure needs cleaning > +pwrite64: Structure needs cleaning > +pwrite64: Structure needs cleaning This means the filesystem has shut down, most likely, and more information about the error is in dmesg. Further, if the filesystem is corrupt, xfs_repair output would be interesting. Can you provide that information? This can probably be reproduced, but when reporting a bug it's always good to provide as many details as you can. Thanks, -Eric From eguan@redhat.com Wed Aug 3 23:24:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D246B7CA0 for ; Wed, 3 Aug 2016 23:24:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63267AC003 for ; Wed, 3 Aug 2016 21:24:51 -0700 (PDT) X-ASG-Debug-ID: 1470284690-0bf8157e6a437700001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9jC3u2dqt6dwxDcB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 21:24:50 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 39DE3C057FAA; Thu, 4 Aug 2016 04:24:50 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u744Onvg007643; Thu, 4 Aug 2016 00:24:49 -0400 Date: Thu, 4 Aug 2016 12:24:48 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: Re: [PATCH v2] xfs: test attr_list_by_handle cursor iteration Message-ID: <20160804042448.GR27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: test attr_list_by_handle cursor iteration References: <20160802235251.GB8586@birch.djwong.org> <20160803225150.GC25565@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803225150.GC25565@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 04 Aug 2016 04:24:50 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470284690 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1268 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 03, 2016 at 03:51:50PM -0700, Darrick J. Wong wrote: > Apparently the XFS attr_list_by_handle ioctl has never actually copied > the cursor contents back to user space, which means that iteration has > never worked. Add a test case for this and see > "xfs: in _attrlist_by_handle, copy the cursor back to userspace". > > v2: Use BULKSTAT_SINGLE for less confusion, fix build errors on RHEL6. > > Signed-off-by: Darrick J. Wong > --- > .gitignore | 1 > src/Makefile | 3 - > src/attr-list-by-handle-cursor-test.c | 185 +++++++++++++++++++++++++++++++++ > tests/xfs/700 | 64 +++++++++++ > tests/xfs/700.out | 5 + > tests/xfs/group | 1 > 6 files changed, 258 insertions(+), 1 deletion(-) > create mode 100644 src/attr-list-by-handle-cursor-test.c > create mode 100755 tests/xfs/700 > create mode 100644 tests/xfs/700.out > [snip] > + > + read_handle_xattrs(&handle, false); > + read_handle_xattrs(&handle, true); I have to replace false/true with 0/1 to build it on RHEL6. I can fix it at commit time if there's no other major updates. Thanks, Eryu From mchristi@redhat.com Thu Aug 4 00:47:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0FA497CA0 for ; Thu, 4 Aug 2016 00:47:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AA87D304032 for ; Wed, 3 Aug 2016 22:47:13 -0700 (PDT) X-ASG-Debug-ID: 1470289631-0bf8157e6b43cac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SXPt9uWtO9SaJNOL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 03 Aug 2016 22:47:12 -0700 (PDT) X-Barracuda-Envelope-From: mchristi@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E0EA985A07; Thu, 4 Aug 2016 05:47:10 +0000 (UTC) Received: from [10.10.63.200] (vpn-63-200.rdu2.redhat.com [10.10.63.200]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u745l4sS030112; Thu, 4 Aug 2016 01:47:04 -0400 Subject: Re: [PATCH 37/45] drivers: use req op accessor To: Shaun Tancheff X-ASG-Orig-Subj: Re: [PATCH 37/45] drivers: use req op accessor References: <1465155145-10812-1-git-send-email-mchristi@redhat.com> <1465155145-10812-38-git-send-email-mchristi@redhat.com> <87fbe31f-27b3-ff7a-e381-34fc1aad337e@redhat.com> Cc: Ross Zwisler , Ross Zwisler , Dave Chinner , Jens Axboe , linux-f2fs-devel@lists.sourceforge.net, linux-ext4 , konrad.wilk@oracle.com, drbd-dev@lists.linbit.com, philipp.reisner@linbit.com, lars.ellenberg@linbit.com, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel , linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, LKML , linux-scsi@vger.kernel.org, linux-mtd@lists.infradead.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, osd-dev@open-osd.org, XFS Developers , ocfs2-devel@oss.oracle.com From: Mike Christie Message-ID: <57A2D6D7.8040807@redhat.com> Date: Thu, 4 Aug 2016 00:47:03 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Thu, 04 Aug 2016 05:47:11 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470289632 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3186 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/03/2016 07:30 PM, Shaun Tancheff wrote: > On Wed, Aug 3, 2016 at 6:47 PM, Mike Christie wrote: >> On 08/03/2016 05:33 PM, Ross Zwisler wrote: >>> On Sun, Jun 5, 2016 at 1:32 PM, wrote: >>>> From: Mike Christie >>>> >>>> The req operation REQ_OP is separated from the rq_flag_bits >>>> definition. This converts the block layer drivers to >>>> use req_op to get the op from the request struct. >>>> >>>> Signed-off-by: Mike Christie >>>> --- >>>> drivers/block/loop.c | 6 +++--- >>>> drivers/block/mtip32xx/mtip32xx.c | 2 +- >>>> drivers/block/nbd.c | 2 +- >>>> drivers/block/rbd.c | 4 ++-- >>>> drivers/block/xen-blkfront.c | 8 +++++--- >>>> drivers/ide/ide-floppy.c | 2 +- >>>> drivers/md/dm.c | 2 +- >>>> drivers/mmc/card/block.c | 7 +++---- >>>> drivers/mmc/card/queue.c | 6 ++---- >>> >>> Dave Chinner reported a deadlock with XFS + DAX, which I reproduced >>> and bisected to this commit: >>> >>> commit c2df40dfb8c015211ec55f4b1dd0587f875c7b34 >>> Author: Mike Christie >>> Date: Sun Jun 5 14:32:17 2016 -0500 >>> drivers: use req op accessor >>> >>> Here are the steps to reproduce the deadlock with a BRD ramdisk: >>> >>> mkfs.xfs -f /dev/ram0 >>> mount -o dax /dev/ram0 /mnt/scratch >> >> When using ramdisks, we need the attached patch like in your other bug >> report. I think it will fix some hangs people are seeing. >> >> I do not think that it should cause the failure to run issue you saw >> when doing generic/008 and ext2. >> > > I think the translation in loop.c is suspicious here: > > "if use DIO && not (a flush_flag or discard_flag)" > should translate to: > "if use DIO && not ((a flush_flag) || op == discard)" > > But in the patch I read: > "if use DIO && ((not a flush_flag) || op == discard) > > Which would have DIO && discards follow the AIO path? > > So I would humbly suggest something like the following > (on top of commit c2df40dfb8c015211ec55f4b1dd0587f875c7b34): > [Please excuse the messed up patch format ... gmail eats tabs] > > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > index b9b737c..0754d83 100644 > --- a/drivers/block/loop.c > +++ b/drivers/block/loop.c > @@ -1659,8 +1659,9 @@ static int loop_queue_rq(struct blk_mq_hw_ctx *hctx, > if (lo->lo_state != Lo_bound) > return -EIO; > > - if (lo->use_dio && (!(cmd->rq->cmd_flags & REQ_FLUSH) || > - req_op(cmd->rq) == REQ_OP_DISCARD)) > + if (lo->use_dio && !( > + (cmd->rq->cmd_flags & REQ_FLUSH) || > + req_op(cmd->rq) == REQ_OP_DISCARD)) > cmd->use_aio = true; > else > cmd->use_aio = false; > You are right. The translation was bad and your code above is correct. I think we need my patch in the other mail though too, because for the rw_page user case if WB_SYNC_ALL is set, then the IO gets sent down as a read instead of a write. From dhsiliconesealant@aliyun.com Thu Aug 4 02:26:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE, MIME_QP_LONG_LINE,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5F9977CA0 for ; Thu, 4 Aug 2016 02:26:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E944304032 for ; Thu, 4 Aug 2016 00:26:59 -0700 (PDT) X-ASG-Debug-ID: 1470295610-0bf57b369b3b4a90001-NocioJ Received: from smtpcm9-306.freemail.mail.aliyun.com (smtpcm9-306.freemail.mail.aliyun.com [110.75.46.6]) by cuda.sgi.com with ESMTP id 2PLM8awXv5WXEACT for ; Thu, 04 Aug 2016 00:26:51 -0700 (PDT) X-Barracuda-Envelope-From: dhsiliconesealant@aliyun.com X-Barracuda-Effective-Source-IP: smtpcm9-306.freemail.mail.aliyun.com[110.75.46.6] X-Barracuda-Apparent-Source-IP: 110.75.46.6 DKIM-Signature:v=1; a=rsa-sha256; c=relaxed/relaxed; d=aliyun.com; s=s1024; t=1470295610; h=Date:From:To:Message-ID:Subject:MIME-Version:Content-Type; bh=f53x0qzlxxLbn7fA9uhbSNtNstqs0pKG9FSW3822MGI=; b=reecBe9w6QjScDev7WuXw+vy+pWvbkLFFf0zFcFjJcFcYG0J1Dor9RY7YKlrZmo8kix+v5mG8CAEoydodF4iJTPOIQ4sW8TcZpIG6PlYfDqGFyHfP3oy8ItbXQSlmZY4Zzcl5k59hXSuioxUACK0tNP6i3yESvipcZQGBLl0h/s= Received: from WS-web by r75b17218.cm9 at Thu, 04 Aug 2016 15:25:30 +0800 Date: Thu, 04 Aug 2016 15:25:25 +0800 From: "dhsiliconesealant" To: "xfs" Disposition-Notification-To: "dhsiliconesealant" Reply-To: "dhsiliconesealant" Message-ID: <40d394ec-38ec-4ec8-b558-59cf10b41148.dhsiliconesealant@aliyun.com> Subject: =?UTF-8?B?YWNldGljIHNpbGljb25lIHNlYWxhbnQ=?= X-Priority: 3 X-ASG-Orig-Subj: =?UTF-8?B?YWNldGljIHNpbGljb25lIHNlYWxhbnQ=?= X-Mailer: Alimail-Mailagent MIME-Version: 1.0 X-Alimail-AntiSpam: AC=CONTINUE;BC=0.1664244|-1;FP=0|0|0|0|0|-1|-1|-1;HT=r75b17221;MF=dhsiliconesealant@aliyun.com;NM=1;PH=DW;RN=50;RT=50;SR=0;TI=W4_4677096_0A881047_1470295812111_o7001c30q; X-Mailer: Alimail-Mailagent revision 5 x-aliyun-mail-creator: W4_4677096_V2lTW96aWxsYS81LjAgKGNvbXBhdGlibGU7IE1TSUUgMTAuMDsgV2luZG93cyBOVCA2LjE7IFdPVzY0OyBUcmlkZW50LzcuMCk=Ds Content-Type: multipart/alternative; boundary="----=ALIBOUNDARY_18951_5a4ce940_57a2edea_6c9f" X-Barracuda-Connect: smtpcm9-306.freemail.mail.aliyun.com[110.75.46.6] X-Barracuda-Start-Time: 1470295611 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5459 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: dehuiindustry.com X-Barracuda-Spam-Score: 2.59 X-Barracuda-Spam-Status: No, SCORE=2.59 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HELO_DYNAMIC_DHCP, HELO_DYNAMIC_DHCP_2, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, RDNS_DYNAMIC, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HELO_DYNAMIC_DHCP Relay HELO'd using suspicious hostname (DHCP) 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 1.66 HELO_DYNAMIC_DHCP_2 HELO_DYNAMIC_DHCP_2 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS ------=ALIBOUNDARY_18951_5a4ce940_57a2edea_6c9f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable =C2=A0Dear=C2=A0 Sir/Madam,Thank you for opening our =0Aemail.Jason Lee from D= ehui Industry =0ACo,. LTD is servicing for you.We are silicone sealant =0Afact= or.y. =0AThe products details as =0Abelow:Commodity =0ADetails:=0A1-Product:GP= silicone sealant=0A2-Brand/Code:Dehui=0A3-CAS =0ANo.:63148-52-7=0A4-Main Raw = Material:Silicone=0A5-Skin time: 4-8 =0Aminuets=0A6-Main Application:General P= urpose Glazing weather sealing=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =0ARoofing and Gutters=C2=A0 Rainwater Tanks Electrical Sealing and Insulatio= n=C2=A0=C2=A0 =0AAutomotive=0A7-Colors:white,black,transparent or as requested= =0A8-Shelf =0Alife:12 months=0A9-Certificate: SGS,ISO,TUVCommercial =0ADetails= :=0A1-Product:silicone sealant=0A2-HS =0ACode:3506100010=0A3-Package:=0A300ml/= Cartridge,24 cartridges/carton box=C2=A0=C2=A0=C2=A0 =0A600ml/sausage, 20sausa= ges/carton box=0A4-Carton Box =0Asize:300x200x235mm=0A5-Load Quantity:=0A300ml= :1900 cartons/20ft without =0Apallets;1600 cartons with pallets =0A600ml:1500 = cartons/20ft without =0Apallets;1100 cartons with pallets =0ADrum :200L/drum,7= 5 drums/20ft=0A6-MOQ: =0ANo=0A7-Delivery:5 days for trial order without printi= ng,15 days for printing =0Adesign=0A8-Service:OEM,Free logo design based on 10= 0 cartons.=0A9-Loading =0APort:Qingdao=0A10-Payment:T/T,LC,Western UnionFor mo= re details,on Skype or =0Awhats app. do not hesitate to contact me,18 hours on= line everyday!=0ABest =0ARegardsJason =C2=A0Jason Lee/Account Manager=0ADehui = Industry Company Limited=0ACell/Whatsapp:+86 181 054 67890=C2=A0=C2=A0 Skype:w= oodman718=0AEmail:=C2=A0jason@dehuiindustry.com=C2=A0=C2=A0=C2=A0 Tel:=C2=A0+8= 6 5466392306=0AWebsite:=C2=A0www.dehuiindustry.com=C2=A0 ------=ALIBOUNDARY_18951_5a4ce940_57a2edea_6c9f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
 

Dear  Sir/Madam,

Thank you for opening our =0Aemail.

Jason Lee from Dehui Industry =0A= Co,. LTD is servicing for you.

W= e are silicone sealant =0Afactor.y.


The products details as =0Abelow:

Commodity =0ADetails:
1-Product:GP silicone sealant
2-Bran= d/Code:Dehui
3-CAS =0ANo.:63148-52-7
4-Main Raw Material:Silicone
= 5-Skin time: 4-8 =0Aminuets
6-Main Application:General Purpose Glazing wea= ther sealing         =0ARoofing and Gu= tters  Rainwater Tanks Electrical Sealing and Insulation   =0AA= utomotive
7-Colors:white,black,transparent or as requested
8-Shelf =0A= life:12 months
9-Certificate: SGS,ISO,TUV

Commercial =0ADetails:
1-Product:silicone sealant
2-HS =0A= Code:3506100010
3-Package:
300ml/Cartridge,24 cartridges/carton box&nb= sp;   =0A600ml/sausage, 20sausages/carton box
4-Carton Box =0Asi= ze:300x200x235mm
5-Load Quantity:
300ml:1900 cartons/20ft without =0Ap= allets;1600 cartons with pallets
600ml:1500 cartons/20ft without =0Apalle= ts;1100 cartons with pallets
Drum :200L/drum,75 drums/20ft
6-MOQ: =0A= No
7-Delivery:5 days for trial order without printing,15 days for printing= =0Adesign
8-Service:OEM,Free logo design based on 100 cartons.
9-Load= ing =0APort:Qingdao
10-Payment:T/T,LC,Western Union

For more details,on Skype or =0Awhats app. do not hesi= tate to contact me,18 hours online everyday!
Best =0ARegards

Jason

 
<= span style=3D"color:#0000ff;font-family:Arial;font-size:16.0px;font-weight:no= rmal;">Jason Lee/Acco= unt Manager
Dehui Industry Company Limited
Cell/Whatsapp:+86 181 054 67890   Skype:woodman718
Email: 
jason@dehuiindustry.c= om    Tel: +86 54663= 92306
Website: 
www.dehui= industry.com
<= span style=3D"color:#000000;font-family:Tahoma,Arial,STHeiti,SimSun;font-size= :14.0px;"> 
------=ALIBOUNDARY_18951_5a4ce940_57a2edea_6c9f-- From lista.unx@gmail.com Thu Aug 4 06:34:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.9 required=5.0 tests=FREEMAIL_FROM,STOX_REPLY_TYPE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8BBB37CA0 for ; Thu, 4 Aug 2016 06:34:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5D126304032 for ; Thu, 4 Aug 2016 04:34:13 -0700 (PDT) X-ASG-Debug-ID: 1470310450-0bf57c136a35f030001-NocioJ Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by cuda.sgi.com with ESMTP id 0jefqO8HfHboOfLZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 04 Aug 2016 04:34:11 -0700 (PDT) X-Barracuda-Envelope-From: lista.unx@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f66.google.com[74.125.82.66] X-Barracuda-Apparent-Source-IP: 74.125.82.66 Received: by mail-wm0-f66.google.com with SMTP id x83so43252538wma.3 for ; Thu, 04 Aug 2016 04:34:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:from:to:cc:references:subject:date:mime-version :content-transfer-encoding; bh=60dEeCAH1VdYVEOWzOe91on9iZ7nX45Jv6lk35A2I4E=; b=e/naM/E8lFud5ne7q5ZHPO3p7w6MMNYLBKyCugqjuUye8p2fKxfDU7C6X0CdLxbh9F MuHZ4x6KtixVVnkUXzKO57JlmIGD+lfhSX2Jh34dXFP+vfkXr1tv8DgB8ZbaCxFWvzA3 QuwrMwRz+5wgfG0NEVHknVas+OzPQsA6s0R3QZIptT3NCtzt4Y6v8F329bgGNI3Cvk1A SMyJjsl/hT65MyOMpKnqm9V6XhfzMzAP1dNSO5eSes2G8+QBYX4fDmohavkdmvAr+M8I IZGN46wT0Mpu8zP2YZxEgh9IkDRlQ0d36Kd/oUHHOyHXjtiZZ8qQjqR1hEx+6vIbcu6Y PqWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:subject:date :mime-version:content-transfer-encoding; bh=60dEeCAH1VdYVEOWzOe91on9iZ7nX45Jv6lk35A2I4E=; b=Qm+PtcU1uy8dyxgEOdWdr5fG5MRtCTjdDWu9UtjApePFL3q0PwDPJAKz0IJk1BBpaQ 6rITMkO0ptTcVm9z5pr80OYXt0iYnSexCm+k+uS8qfqcNj6b6vEsWBuJr8bdCYY/A1SP PMEkYc/jd2DqHIt3u63lyayy1KqG8R+r9drgCcaqK9JrL0nVIdF4QWHcz4WzVnmZylQh urqsPKDefsKSnMnUWeHn8Rm1A/fwfdRdvcuhb7wcHEx+/7PqHK+QiyPQF3WaOKAe7tS2 bVKIu5gvc9lQzI6kwREobRxAYWuyHilXPgYAgyWLhcqeAxLcDGTXrXd9BMIZF/rwmfZ4 7YWA== X-Gm-Message-State: AEkoousMKoVqr6yKl1QnOazUDPiC9Q6l/fSuOQNFjmOJYVOOyzHenOD78PT2gvdw9VyTyA== X-Received: by 10.28.56.3 with SMTP id f3mr27799099wma.31.1470310449453; Thu, 04 Aug 2016 04:34:09 -0700 (PDT) Received: from dinulap (dev155.demoshop.ro. [5.2.129.155]) by smtp.gmail.com with ESMTPSA id us9sm12379962wjb.43.2016.08.04.04.34.08 (version=TLS1 cipher=DES-CBC3-SHA bits=112/168); Thu, 04 Aug 2016 04:34:08 -0700 (PDT) Message-ID: <3D58B7EB9A964054997E0E370C98251D@dinulap> From: "Lista Unx" To: "Dave Chinner" , "Carlos E. R." Cc: "XFS mail list" References: <4278AB9734C1445A8E48635B155149F8@dinulap><57CF7681619F42CCB4C0CF589E9686E5@dinulap><4382687.Pe7d1tBhVA@merkaba><9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net> <20160803231529.GX16044@dastard> Subject: Re: Spam on this list Date: Thu, 4 Aug 2016 14:34:11 +0300 X-ASG-Orig-Subj: Re: Spam on this list MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Barracuda-Connect: mail-wm0-f66.google.com[74.125.82.66] X-Barracuda-Start-Time: 1470310450 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1820 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31744 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature ----- Original Message ----- From: "Dave Chinner" To: "Carlos E. R." Cc: "XFS mail list" Sent: Thursday, August 04, 2016 2:15 AM Subject: Re: Spam on this list > Yes, that is the fundamental issue - spam filtering is essentially > controlled by SGI's internal infrastructure, which we have little > option on. > > What it comes down to is whether we continue to use this list > (xfs@oss.sgi.com) or whether we move to linux-xfs@vger.kernel.org > so we get much more robust and up-to-date spam filtering. The issue > with doing this is forcing everyone to resubscribe, and then > capturing everything that is still sent to xfs@oss.sgi.com. > > That said, I'm seriously tempted right now just to say "we're moving > to vger" and asking everyone to resubscribe to that list, and then > making xfs@oss.sgi.com respond with "list moved to vger, please > repost there". i.e. not even put a forwarding gateway in place. > > If we do that, then I'll also shut down all the XFS git trees on > oss.sgi.com - I'll add commits to the them to say "go to > kernel.org". I'll need to work something out for the tarball > releases, but kernel.org does have functionality for that, too, so > that may just be a small change of process on my end (i.e. use kup). > Once that is done, we'll be running completely on community provided > infrastructure.... > > Thoughts? I completely agree, is a good idea to move to a new place where more filters are already in place. It is a small change on user's side and benefits are for everyone. I cannot see any cons to not do it. It probably will be the best to keep also a message for newcommers and also for robots, that list has been moved to vger and new way to subscribe. From tdm@sgi.com Thu Aug 4 08:40:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0569D7CA0 for ; Thu, 4 Aug 2016 08:40:08 -0500 (CDT) Received: from xmail.sgi.com (pv-excas3-dc21.corp.sgi.com [137.38.106.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B8B4AC003; Thu, 4 Aug 2016 06:40:07 -0700 (PDT) Received: from P-EXMB4-DC21.corp.sgi.com ([169.254.6.189]) by pv-excas3-dc21.corp.sgi.com ([137.38.106.11]) with mapi id 14.03.0224.002; Thu, 4 Aug 2016 08:40:06 -0500 From: Troy McCorkell To: Dave Chinner , "Carlos E. R." CC: XFS mail list Subject: RE: Spam on this list Thread-Topic: Spam on this list Thread-Index: AQHR7d0P/gapxZGqS0++DAcYIc5Vg6A4zb38 Date: Thu, 4 Aug 2016 13:40:06 +0000 Message-ID: References: <4278AB9734C1445A8E48635B155149F8@dinulap> <57CF7681619F42CCB4C0CF589E9686E5@dinulap> <4382687.Pe7d1tBhVA@merkaba> <9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net>,<20160803231529.GX16044@dastard> In-Reply-To: <20160803231529.GX16044@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [128.162.233.129] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 On Wed, Aug 03,2016 at 6:15PM Dave Chinner wrote:=0A= >On Wed, Aug 03, 2016 at 03:34:58PM +0200, Carlos E. R. wrote:=0A= >> On 2016-08-03 15:21, Martin Steigerwald wrote:=0A= >>=0A= >> > Lista, Carlos, I recommend: If you are concerned about spam on the lis= t=0A= >> > contact the listmasters of it. They are the ones that can address it g= lobally=0A= >> > for the list.=0A= >>=0A= >> Oh, I did, long ago. Still waiting.=0A= >=0A= >Yes, that is the fundamental issue - spam filtering is essentially=0A= >controlled by SGI's internal infrastructure, which we have little=0A= >option on.=0A= >=0A= >What it comes down to is whether we continue to use this list=0A= >(xfs@oss.sgi.com) or whether we move to linux-xfs@vger.kernel.org=0A= >so we get much more robust and up-to-date spam filtering. The issue=0A= >with doing this is forcing everyone to resubscribe, and then=0A= >capturing everything that is still sent to xfs@oss.sgi.com.=0A= >=0A= >That said, I'm seriously tempted right now just to say "we're moving=0A= >to vger" and asking everyone to resubscribe to that list, and then=0A= >making xfs@oss.sgi.com respond with "list moved to vger, please=0A= >repost there". i.e. not even put a forwarding gateway in place.=0A= >=0A= >If we do that, then I'll also shut down all the XFS git trees on=0A= >oss.sgi.com - I'll add commits to the them to say "go to=0A= >kernel.org". I'll need to work something out for the tarball=0A= >releases, but kernel.org does have functionality for that, too, so=0A= >that may just be a small change of process on my end (i.e. use kup).=0A= >Once that is done, we'll be running completely on community provided=0A= >infrastructure....=0A= >=0A= >Thoughts?=0A= >=0A= >Cheers,=0A= >=0A= >Dave.=0A= >--=0A= >Dave Chinner=0A= >david@fromorbit.com=0A= =0A= Dave,=0A= =0A= It's probably the best option to move the mailing list to vger.=0A= Let me know what we can do to facilitate the move.=0A= =0A= Thanks,=0A= Troy=0A= From Sales.30@autoparts.com Thu Aug 4 10:17:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9859F7CA0 for ; Thu, 4 Aug 2016 10:17:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5A2BC304051 for ; Thu, 4 Aug 2016 08:17:13 -0700 (PDT) X-ASG-Debug-ID: 1470323829-0bf57b369c3d0fd0001-NocioJ Received: from autoparts.com ([49.87.251.134]) by cuda.sgi.com with SMTP id NxQ4NZYnX2B4H1Fr for ; Thu, 04 Aug 2016 08:17:09 -0700 (PDT) X-Barracuda-Envelope-From: Sales.30@autoparts.com X-Barracuda-Effective-Source-IP: UNKNOWN[49.87.251.134] X-Barracuda-Apparent-Source-IP: 49.87.251.134 Sender: Sales.30@autoparts.com Received: from PC-20151225RDFR[127.0.0.1] by PC-20151225RDFR[127.0.0.1] (SMTPD32); Thu, 4 Aug 2016 23:15:40 +0800 From: "simon.lilei@163.com" Subject: shawl & scarf & glove & hat To: xfs@oss.sgi.com X-ASG-Orig-Subj: shawl & scarf & glove & hat MIME-Version: 1.0 Reply-To: simon.lilei@163.com Date: Thu, 4 Aug 2016 23:15:40 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[49.87.251.134] X-Barracuda-Start-Time: 1470323829 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9074 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.94 X-Barracuda-Spam-Status: No, SCORE=0.94 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.20 BSF_SC0_SA038b Custom Rule SA038b 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160804151713.185D064005C@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA5LjAwLjgxMTIuMTY3MTciPjwvSEVBRD4NCjxCT0RZPg0KPERJViANCnN0eWxl PSJURVhULVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQQUNJTkc6 IG5vcm1hbDsgRk9OVDogMTRweC8yMXB4IEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmOyBXSElU RS1TUEFDRTogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13 ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6 IDEuNTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IGxhcmdlIj5Hb29kIG1vcm5pbmcg DQpTaXIsPC9TUEFOPjwvRElWPg0KPERJViANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsg VEVYVC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgRk9OVDogMTRweC8yMXB4 IEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmOyBXSElURS1TUEFDRTogbm9ybWFsOyBDT0xPUjog cmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6 IDBweCI+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBz dHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9O VD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1f Ymxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFj ZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxh bmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05U IA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhy ZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTog aGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElW Pg0KPFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+d2UgYXJlIGEgZ2FybWVudHMgZXhwb3J0ZXIg aW4gQ0hJTkEgZm9yIHllYXJzLCANCmxvb2tpbmcgZm9yIGltcG9ydGVycyBpbiB5b3VyIGFyZWE6 PC9GT05UPjwvUD4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxT UEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+ PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFy Z2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9 NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91 dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+ PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+ PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklM SVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+ PC9ESVY+DQo8UD48Rk9OVCBzaXplPTQgZmFjZT1BcmlhbD53ZSBjYW4gc3VwcGx5OjwvRk9OVD48 L1A+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHls ZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48 L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxh bms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1B cmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxhbmsj IiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0K c2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9 ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlk ZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0K PFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+amFja2V0czogPC9GT05UPjxGT05UIHNpemU9NCBm YWNlPUFyaWFsPndhdGVyIHByb29mLCANCnNvZnRzaGVsbCwgd2ludGVyLCBsYWR5LCBmbGVlY2Us ICwgZG93biBqYWNrZXQsIHBhZGRpbmcsPC9GT05UPjwvUD4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6 YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxG T05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxB IGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElU WTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwv RElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5 bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+ PC9TUEFOPjwvQT48L0RJVj4NCjxQPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPkNvYXRzOiA8L0ZP TlQ+PEZPTlQgZmFjZT1BcmlhbD48Rk9OVCBzaXplPTQ+dHJlbmNoLCANCmxhZHksIG1lbnMsIGNh c3VhbCwgd29vbGVuIGNvYXRzLi4uLi4uLi4uLjwvRk9OVD48Rk9OVCBzaXplPTQ+IHNoaXJ0cyxz dWl0cywgDQpibGF6ZXJzLCwgLi4uLi4uPC9GT05UPjwvRk9OVD48L1A+DQo8RElWPjxBIGhyZWY9 ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlk ZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0K PERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJ U0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFO PjwvQT48L0RJVj4NCjxQPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1A+DQo8RElW PjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJ TElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9B PjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4g c3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZP TlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9 X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZh Y2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48Rk9OVCBzaXplPTQgZmFjZT1B cmlhbD5QYW50czogPC9GT05UPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPkNhcmdvLCANCmNhc3Vh bCwuLi4uLi4uLi4uLi4uLi4uLjwvRk9OVD48L1A+DQo8UD48Rk9OVCBmYWNlPUFyaWFsPjxGT05U IHNpemU9ND53b3Jrd2VhcjogY292ZXJhbGwsIGhpZ2gtdml6IGphY2tldHMsIA0KcmVmbGVjdGl2 ZSB2ZXN0cy4uLi4uPC9GT05UPjwvRk9OVD48L1A+DQo8UD48Rk9OVCBzaXplPTQ+V2ludGVyIGtu aXR0ZWQgaGF0cyAmYW1wOyBnbG92ZXMgJmFtcDsgc2NhcmYgJmFtcDsgDQpzaGF3bC4uLi4uLi4u LjwvRk9OVD48L1A+DQo8UD48Rk9OVCBzaXplPTQ+QW5kIG90aGVyIGtpbmRzIG9mIGN1c3RvbWl6 ZWQgZ2FybWVudHMuLi4uLjwvRk9OVD48Rk9OVCANCmZhY2U9QXJpYWw+PEJSPjxGT05UIHNpemU9 ND4uPC9GT05UPjwvRk9OVD48L1A+DQo8UD48Rk9OVCBzaXplPTQ+SG9wZSB0byBnZXQgbG9uZyB0 ZXJtIGNvb3BlcmF0aW9uIHdpdGggeW91IGFuZCB5b3VyIGVzdGVlbWVkIA0KY29tcGFueSE8L0ZP TlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4g c3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZP TlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9 X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZh Y2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJs YW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9O VCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBo cmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6 IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJ Vj4NCjxQPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPkJlc3QgcmVnYXJkcyw8L0ZPTlQ+PC9QPg0K PERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJ U0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFO PjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxT UEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+ PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFy Z2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9 NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91 dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+ PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxQPjxG T05UIHNpemU9NCBmYWNlPUFyaWFsPkxJIExFSTwvRk9OVD48L1A+DQo8RElWPjxBIGhyZWY9ImFi b3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVu Ij48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJ Vj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lC SUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwv QT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFO IHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9G T05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0 PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBm YWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPFA+PEZPTlQgZmFjZT1BcmlhbD48 Rk9OVCBzaXplPTQ+PC9GT05UPjwvRk9OVD48L1A+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5r IyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCAN CnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVm PSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhp ZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4N CjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJW SVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BB Tj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48 U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFs PjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPjxGT05UIGZhY2U9QXJpYWw+PEJSPjxGT05UIA0Kc2l6 ZT00PjxTVFJPTkc+QkFNVE9OIElORFVTVFJZIENPLixMVEQ8L1NUUk9ORz48L0ZPTlQ+PC9GT05U PiANCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxGT05UIGZhY2U9 QXJpYWw+PFNQQU4gDQpzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48L1NQQU4+PC9GT05UPjwv QT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFO IHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9G T05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0 PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBm YWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPFA+PEZPTlQgc2l6ZT00IGZhY2U9 QXJpYWw+PC9GT05UPjwvUD4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2Js YW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9 QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5r IyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCAN CnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVm PSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhp ZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4N CjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJW SVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BB Tj48L0E+PC9ESVY+DQo8UD48Rk9OVCBzaXplPTQgZmFjZT1BcmlhbD48U1RST05HPkhVQUlBTiBG RU5HRkFOIElNUE9SVCAmYW1wOyBFWFBPUlQgDQpDTy4sTFREPC9TVFJPTkc+PC9GT05UPjwvUD4N CjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJW SVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BB Tj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48 U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFs PjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRh cmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXpl PTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJv dXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4i PjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48 Rk9OVCBzaXplPTQgZmFjZT1BcmlhbD5OTy4xMjUsIEhVQUlZSU4gRElTVFJJQ1QsIEhVQUlBTiwg SklBTkdTVSwgDQpDSElOQTwvRk9OVD48L1A+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIg dGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNp emU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJh Ym91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRl biI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxE SVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJ QklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48 L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BB TiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwv Rk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPFA+PEZPTlQgZmFjZT1BcmlhbD48Rk9OVCBzaXplPTQ+ VEVMOis4NiAxODEyMTY4NTI1OCwgMTUwNTEzODE2MjcgRS1NQUlMOjxTUEFOIA0KY2xhc3M9QXBw bGUtY29udmVydGVkLXNwYWNlPiA8L1NQQU4+PC9GT05UPjxBIA0KaHJlZj0ibWFpbHRvOmJ0LXRl eHRpbGVzLmNvbXNpbW9uLmxpbGVpQDE2My5jb20iPjxGT05UIGNvbG9yPSMwMDAwMDAgDQpzaXpl PTQ+c2ltb24ubGlsZWlAMTYzLmNvbTwvRk9OVD48L0E+PC9GT05UPjwvUD48L0RJVj48L0JPRFk+ PC9IVE1MPg0KDQo= From BATV+b244dc37f40e53d0e5a9+4729+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 4 10:44:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 282FC7CA0 for ; Thu, 4 Aug 2016 10:44:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FB31AC004 for ; Thu, 4 Aug 2016 08:44:48 -0700 (PDT) X-ASG-Debug-ID: 1470325480-0bf57c136736ced0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id bm7EZPKe6leGRvVB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 04 Aug 2016 08:44:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b244dc37f40e53d0e5a9+4729+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bVKp5-0004g5-2o; Thu, 04 Aug 2016 15:44:39 +0000 Date: Thu, 4 Aug 2016 08:44:39 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: store rmapbt block count in the AGF Message-ID: <20160804154439.GA15656@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: store rmapbt block count in the AGF References: <20160803214613.GF8593@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803214613.GF8593@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470325481 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1609 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 03, 2016 at 02:46:13PM -0700, Darrick J. Wong wrote: > Track the number of blocks used for the rmapbt in the AGF. When we > get to the AG reservation code we need this counter to quickly > make our reservation during mount. > > v2: Actually include growfs support. > > Signed-off-by: Darrick J. Wong > --- > fs/xfs/libxfs/xfs_alloc.c | 1 + > fs/xfs/libxfs/xfs_format.h | 11 ++++++++--- > fs/xfs/libxfs/xfs_rmap_btree.c | 6 ++++++ > fs/xfs/xfs_fsops.c | 1 + > 4 files changed, 16 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index 776ae2f..af1a72e 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -2264,6 +2264,7 @@ xfs_alloc_log_agf( > offsetof(xfs_agf_t, agf_longest), > offsetof(xfs_agf_t, agf_btreeblks), > offsetof(xfs_agf_t, agf_uuid), > + offsetof(xfs_agf_t, agf_rmap_blocks), > sizeof(xfs_agf_t) > }; > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > index f814d42..e6a8bea 100644 > --- a/fs/xfs/libxfs/xfs_format.h > +++ b/fs/xfs/libxfs/xfs_format.h > @@ -640,12 +640,15 @@ typedef struct xfs_agf { > __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ > uuid_t agf_uuid; /* uuid of filesystem */ > > + __be32 agf_rmap_blocks; /* rmapbt blocks used */ > + __be32 agf_padding; /* padding */ Now _spare? It could easily be used by the next new field. Otherwise this looks fine to me: Reviewed-by: Christoph Hellwig From BATV+b244dc37f40e53d0e5a9+4729+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 4 10:46:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7DCC17CA0 for ; Thu, 4 Aug 2016 10:46:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F34D5AC003 for ; Thu, 4 Aug 2016 08:46:37 -0700 (PDT) X-ASG-Debug-ID: 1470325595-0bf57c136a36d0a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 7jGWgbyri3emyqdC (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 04 Aug 2016 08:46:36 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b244dc37f40e53d0e5a9+4729+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bVKqk-00060A-9e; Thu, 04 Aug 2016 15:46:22 +0000 Date: Thu, 4 Aug 2016 08:46:22 -0700 From: Christoph Hellwig To: Shaun Tancheff Cc: Mike Christie , philipp.reisner@linbit.com, dm-devel@redhat.com, target-devel@vger.kernel.org, linux-mtd@lists.infradead.org, drbd-dev@lists.linbit.com, linux-scsi@vger.kernel.org, Ross Zwisler , linux-ext4 , konrad.wilk@oracle.com, XFS Developers , linux-raid@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, osd-dev@open-osd.org, Ross Zwisler , Jens Axboe , LKML , linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel , lars.ellenberg@linbit.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 37/45] drivers: use req op accessor Message-ID: <20160804154622.GB15656@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 37/45] drivers: use req op accessor References: <1465155145-10812-1-git-send-email-mchristi@redhat.com> <1465155145-10812-38-git-send-email-mchristi@redhat.com> <87fbe31f-27b3-ff7a-e381-34fc1aad337e@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470325596 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 565 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 03, 2016 at 07:30:29PM -0500, Shaun Tancheff wrote: > I think the translation in loop.c is suspicious here: > > "if use DIO && not (a flush_flag or discard_flag)" > should translate to: > "if use DIO && not ((a flush_flag) || op == discard)" > > But in the patch I read: > "if use DIO && ((not a flush_flag) || op == discard) > > Which would have DIO && discards follow the AIO path? Indeed. Sorry for missing out on your patch, I just sent a fix in reply to Dave's other report earlier which is pretty similar to yours. From BATV+b244dc37f40e53d0e5a9+4729+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 4 10:48:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AAFE97CA0 for ; Thu, 4 Aug 2016 10:48:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6E7D68F8035 for ; Thu, 4 Aug 2016 08:48:08 -0700 (PDT) X-ASG-Debug-ID: 1470325686-0bf57c136736d1d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id eP8IAOt2jcfKD0II (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 04 Aug 2016 08:48:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b244dc37f40e53d0e5a9+4729+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bVKsP-0006GJ-Gq; Thu, 04 Aug 2016 15:48:05 +0000 Date: Thu, 4 Aug 2016 08:48:05 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-nvdimm@ml01.01.org Subject: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Message-ID: <20160804154805.GA24025@infradead.org> X-ASG-Orig-Subj: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems References: <20160803003354.GP16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803003354.GP16044@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470325686 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 154 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Just send a fix that you're Cc'ed on. But now xfs/049 hangs, although only on pmem devices, loop on non-pmem seems to be fine. 4.7 was fine as well. From darrick.wong@oracle.com Thu Aug 4 10:49:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BCBCA7CA0 for ; Thu, 4 Aug 2016 10:49:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 30D60AC005 for ; Thu, 4 Aug 2016 08:49:04 -0700 (PDT) X-ASG-Debug-ID: 1470325741-0bf57c136936d270001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id QQAxrWCH1fvayvk3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 04 Aug 2016 08:49:02 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u74FmwMD020365 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 15:48:59 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u74FmwgU006554 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 15:48:58 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u74FmqXE023115; Thu, 4 Aug 2016 15:48:57 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 04 Aug 2016 08:48:46 -0700 Date: Thu, 4 Aug 2016 08:48:45 -0700 From: "Darrick J. Wong" To: Mark Fasheh Cc: linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160804154845.GV8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804021852.GK5316@wotan.suse.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470325742 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3480 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 03, 2016 at 07:18:52PM -0700, Mark Fasheh wrote: > On Wed, Aug 03, 2016 at 05:58:43PM -0700, Darrick J. Wong wrote: > > On Wed, Aug 03, 2016 at 01:55:20PM -0700, Darrick J. Wong wrote: > > > On Wed, Aug 03, 2016 at 12:45:36PM -0700, Mark Fasheh wrote: > > > > Where can I the patches to enable dedupe_range on xfs? I tested your > > > > previous devel branch based on Linux v4.7-rc3 with duperemove > > > > (https://github.com/markfasheh/duperemove) and it worked extremely well - > > > > even handling some cases that btrfs still has issues with. I actually > > > > committed the code to enable xfs support in duperemove so anyone can test on > > > > xfs with the dedupe_range patches. > > > > > > > > I'd gladly test your latest patches by doing my usual 'large' duperemove > > > > tests once I can get ahold of the dedupe_range work :) > > > > > > Your best bets are probably the -experimental trees: > > > https://github.com/djwong/linux/commits/djwong-experimental > > > https://github.com/djwong/xfsprogs/commits/djwong-experimental > > > > > > I haven't updated them in a while because I've been busy trying > > > to get reverse-mapping (the start of those patchbombs) into 4.8. > > > > > > Just as a warning, don't put anything critical on those XFS filesystems > > > because there's going to be a disk format update between now and the > > > next time I post the patches because Dave and I decided to cache the > > > block counts for the new btrees in order to speed up mounting. I don't > > > anticipate having time to clean up my dev tree and push to github until > > > a week or two after the merge window closes. > > > > That said, all the craziness from the last two weeks (xfs_scrub sprint > > and the rmapbt review fixes) are now in the -wtf tree, which /should/ > > behave. I've dumped everything there in completely not cleaned up > > format, but this does have the AGF btree block counter stuff I talked > > about above. > > > > https://github.com/djwong/linux/commits/djwong-wtf > > https://github.com/djwong/xfsprogs/commits/djwong-wtf > > Fantastic. Don't worry about corrupting data, I've been doing this long > enough to know to use this only on scratch partitions for now :) I'm in the > middle of a couple other tests but once I'm done there I'll grab those > branches and give them another spin. Typically I'm running through 800G-1TB > on these (with varying duplicated data percentages). > > Silly question which I could just answer by looking at the patches - are you > reporting FIEMAP_EXTENT_SHARED yet for extents with more than one owner? We > use that flag (by comparing SHARED bytes before and after dedupe) to give > people an estimate of how much space was saved. I presume figuring the > shared state of an extent would be as easy as querying the rmap btree, > correct? Yes, it should report FIEMAP_EXTENT_SHARED. In the past it would report exactly which parts of an extent were shared. If a file mapped blocks 30-40 and block 35 was shared, it would report 30-34, 35 (shared), and 36-40. However, btrfs only reports a single extent "30-40 (shared)" so I stopped doing that. Incidentally, GETFSMAP is in that code pile too, in case duperemove wanted to know exactly what's mapped to a block. I'd be wary of it for now though, since it hasn't been through any kind of review and could change in the future. --D > --Mark > > -- > Mark Fasheh From martin@lichtvoll.de Thu Aug 4 10:49:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D099B7CA0 for ; Thu, 4 Aug 2016 10:49:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A225B8F804B for ; Thu, 4 Aug 2016 08:49:45 -0700 (PDT) X-ASG-Debug-ID: 1470325781-0bf57b369c3d3240001-NocioJ Received: from mail.lichtvoll.de (mondschein.lichtvoll.de [194.150.191.11]) by cuda.sgi.com with ESMTP id NGMFEwvYQrmDxs5S for ; Thu, 04 Aug 2016 08:49:42 -0700 (PDT) X-Barracuda-Envelope-From: martin@lichtvoll.de X-Barracuda-Effective-Source-IP: mondschein.lichtvoll.de[194.150.191.11] X-Barracuda-Apparent-Source-IP: 194.150.191.11 Received: by mail.lichtvoll.de (Postfix, from userid 120) id 55FC67FD; Thu, 4 Aug 2016 17:49:41 +0200 (CEST) Received: from merkaba.localnet (aftr-95-222-24-209.unity-media.net [95.222.24.209]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.lichtvoll.de (Postfix) with ESMTPSA id DC523244; Thu, 4 Aug 2016 17:49:40 +0200 (CEST) From: Martin Steigerwald To: xfs@oss.sgi.com Cc: Dave Chinner , "Carlos E. R." Subject: Re: Spam on this list Date: Thu, 04 Aug 2016 17:49:40 +0200 X-ASG-Orig-Subj: Re: Spam on this list Message-ID: <1693896.yYUZdOzIYq@merkaba> User-Agent: KMail/5.2.3 (Linux/4.7.0-tp520-btrfstrim+; KDE/5.23.0; x86_64; ; ) In-Reply-To: <20160803231529.GX16044@dastard> References: <4278AB9734C1445A8E48635B155149F8@dinulap> <9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net> <20160803231529.GX16044@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-Barracuda-Connect: mondschein.lichtvoll.de[194.150.191.11] X-Barracuda-Start-Time: 1470325781 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1832 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Am Donnerstag, 4. August 2016, 09:15:29 CEST schrieb Dave Chinner: > On Wed, Aug 03, 2016 at 03:34:58PM +0200, Carlos E. R. wrote: > > On 2016-08-03 15:21, Martin Steigerwald wrote: > > > Lista, Carlos, I recommend: If you are concerned about spam on the list > > > contact the listmasters of it. They are the ones that can address it > > > globally for the list. > > > > Oh, I did, long ago. Still waiting. > > Yes, that is the fundamental issue - spam filtering is essentially > controlled by SGI's internal infrastructure, which we have little > option on. > > What it comes down to is whether we continue to use this list > (xfs@oss.sgi.com) or whether we move to linux-xfs@vger.kernel.org > so we get much more robust and up-to-date spam filtering. The issue > with doing this is forcing everyone to resubscribe, and then > capturing everything that is still sent to xfs@oss.sgi.com. > > That said, I'm seriously tempted right now just to say "we're moving > to vger" and asking everyone to resubscribe to that list, and then > making xfs@oss.sgi.com respond with "list moved to vger, please > repost there". i.e. not even put a forwarding gateway in place. > > If we do that, then I'll also shut down all the XFS git trees on > oss.sgi.com - I'll add commits to the them to say "go to > kernel.org". I'll need to work something out for the tarball > releases, but kernel.org does have functionality for that, too, so > that may just be a small change of process on my end (i.e. use kup). > Once that is done, we'll be running completely on community provided > infrastructure.... > > Thoughts? Nice, so this time discussing spam on the list on the list may have a nice effect in the end. I completely agree and have no issues with resubscribung there. Thank you, -- Martin From sandeen@sandeen.net Thu Aug 4 10:51:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 113527CA0 for ; Thu, 4 Aug 2016 10:51:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D620E304051 for ; Thu, 4 Aug 2016 08:51:16 -0700 (PDT) X-ASG-Debug-ID: 1470325873-0bf57c136936d460001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id L2JNGv5kuqgWnkzF for ; Thu, 04 Aug 2016 08:51:13 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D2D1C481A for ; Thu, 4 Aug 2016 10:51:12 -0500 (CDT) To: xfs-oss From: Eric Sandeen Subject: [PATCH] xfs_metadump: don't warn about unobfuscated log with -o Message-ID: <541974d2-5877-a7ef-af3c-7d1a47e227c0@sandeen.net> X-ASG-Orig-Subj: [PATCH] xfs_metadump: don't warn about unobfuscated log with -o Date: Thu, 4 Aug 2016 10:51:12 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1470325873 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 859 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- It makes no sense to warn about un-obfuscated logs when we asked xfs_metadump to not obfuscate metadata: # xfs_metadump -o /dev/loop2 bad.metadump xfs_metadump: Filesystem log is dirty; image will contain unobfuscated metadata in log. Signed-off-by: Eric Sandeen --- diff --git a/db/metadump.c b/db/metadump.c index d7ff6e5..01a51c4 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -2575,12 +2575,14 @@ copy_log(void) break; case 1: /* keep the dirty log */ - print_warning( + if (obfuscate) + print_warning( _("Filesystem log is dirty; image will contain unobfuscated metadata in log.")); break; case -1: /* log detection error */ - print_warning( + if (obfuscate) + print_warning( _("Could not discern log; image will contain unobfuscated metadata in log.")); break; } From darrick.wong@oracle.com Thu Aug 4 10:51:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1D4167CA0 for ; Thu, 4 Aug 2016 10:51:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2F45304048 for ; Thu, 4 Aug 2016 08:51:17 -0700 (PDT) X-ASG-Debug-ID: 1470325875-0bf57b369c3d3520001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 51EAkIyGeJe5UKEC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 04 Aug 2016 08:51:16 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u74FopcW022967 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 15:50:51 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u74FooNT013572 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 4 Aug 2016 15:50:50 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u74FohKi024122; Thu, 4 Aug 2016 15:50:49 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 04 Aug 2016 08:50:43 -0700 Date: Thu, 4 Aug 2016 08:50:42 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: store rmapbt block count in the AGF Message-ID: <20160804155042.GW8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: store rmapbt block count in the AGF References: <20160803214613.GF8593@birch.djwong.org> <20160804154439.GA15656@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804154439.GA15656@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470325876 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1891 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, Aug 04, 2016 at 08:44:39AM -0700, Christoph Hellwig wrote: > On Wed, Aug 03, 2016 at 02:46:13PM -0700, Darrick J. Wong wrote: > > Track the number of blocks used for the rmapbt in the AGF. When we > > get to the AG reservation code we need this counter to quickly > > make our reservation during mount. > > > > v2: Actually include growfs support. > > > > Signed-off-by: Darrick J. Wong > > --- > > fs/xfs/libxfs/xfs_alloc.c | 1 + > > fs/xfs/libxfs/xfs_format.h | 11 ++++++++--- > > fs/xfs/libxfs/xfs_rmap_btree.c | 6 ++++++ > > fs/xfs/xfs_fsops.c | 1 + > > 4 files changed, 16 insertions(+), 3 deletions(-) > > > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > > index 776ae2f..af1a72e 100644 > > --- a/fs/xfs/libxfs/xfs_alloc.c > > +++ b/fs/xfs/libxfs/xfs_alloc.c > > @@ -2264,6 +2264,7 @@ xfs_alloc_log_agf( > > offsetof(xfs_agf_t, agf_longest), > > offsetof(xfs_agf_t, agf_btreeblks), > > offsetof(xfs_agf_t, agf_uuid), > > + offsetof(xfs_agf_t, agf_rmap_blocks), > > sizeof(xfs_agf_t) > > }; > > > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > > index f814d42..e6a8bea 100644 > > --- a/fs/xfs/libxfs/xfs_format.h > > +++ b/fs/xfs/libxfs/xfs_format.h > > @@ -640,12 +640,15 @@ typedef struct xfs_agf { > > __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ > > uuid_t agf_uuid; /* uuid of filesystem */ > > > > + __be32 agf_rmap_blocks; /* rmapbt blocks used */ > > + __be32 agf_padding; /* padding */ > > Now _spare? It could easily be used by the next new field. The reflink patches will (almost immediately) consume agf_padding and the next spare for refcount_{root,level,blocks}. --D > Otherwise this looks fine to me: > > Reviewed-by: Christoph Hellwig From BATV+b244dc37f40e53d0e5a9+4729+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 4 11:00:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 307D27CA0 for ; Thu, 4 Aug 2016 11:00:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA0C3304075 for ; Thu, 4 Aug 2016 09:00:14 -0700 (PDT) X-ASG-Debug-ID: 1470326412-0bf57c136736db60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id jPRV8lhD6fEExrmG (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 04 Aug 2016 09:00:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b244dc37f40e53d0e5a9+4729+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bVL43-0002dk-IL; Thu, 04 Aug 2016 16:00:07 +0000 Date: Thu, 4 Aug 2016 09:00:07 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 11/47] xfs: move deferred operations into a separate file Message-ID: <20160804160007.GA7649@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/47] xfs: move deferred operations into a separate file References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> <20160801080223.GB30547@infradead.org> <20160802223950.GN16044@dastard> <20160803091627.GA5289@infradead.org> <20160803225756.GW16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160803225756.GW16044@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470326413 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 446 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 04, 2016 at 08:57:56AM +1000, Dave Chinner wrote: > So, please explain in more detail what the problem is and what the > proposed solution is so I (and probably Darrick, too) have some > understanding of the issue you see with this code. We were doing 1 (actually 2 with the busy extent tracking) allocations for each free extent, and now we're up to three. We need to get this down to 1 and not increase it for no benefit. From billodo@redhat.com Thu Aug 4 11:13:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 436837CA0 for ; Thu, 4 Aug 2016 11:13:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8D17AC002 for ; Thu, 4 Aug 2016 09:13:23 -0700 (PDT) X-ASG-Debug-ID: 1470327201-0bf57c136736e870001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id quelWDtknEapAs5H (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 04 Aug 2016 09:13:22 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 68204800A8; Thu, 4 Aug 2016 16:13:21 +0000 (UTC) Received: from redhat.com (vpn-53-32.rdu2.redhat.com [10.10.53.32]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u74GDJYl016315 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 4 Aug 2016 12:13:20 -0400 Date: Thu, 4 Aug 2016 11:13:18 -0500 From: "Bill O'Donnell" To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_metadump: don't warn about unobfuscated log with -o Message-ID: <20160804161318.GA739@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_metadump: don't warn about unobfuscated log with -o References: <541974d2-5877-a7ef-af3c-7d1a47e227c0@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <541974d2-5877-a7ef-af3c-7d1a47e227c0@sandeen.net> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 04 Aug 2016 16:13:21 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470327202 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1167 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 04, 2016 at 10:51:12AM -0500, Eric Sandeen wrote: > It makes no sense to warn about un-obfuscated logs > when we asked xfs_metadump to not obfuscate metadata: > > # xfs_metadump -o /dev/loop2 bad.metadump > xfs_metadump: Filesystem log is dirty; image will contain unobfuscated metadata in log. > > Signed-off-by: Eric Sandeen Reviewed-by: Bill O'Donnell > --- > > diff --git a/db/metadump.c b/db/metadump.c > index d7ff6e5..01a51c4 100644 > --- a/db/metadump.c > +++ b/db/metadump.c > @@ -2575,12 +2575,14 @@ copy_log(void) > break; > case 1: > /* keep the dirty log */ > - print_warning( > + if (obfuscate) > + print_warning( > _("Filesystem log is dirty; image will contain unobfuscated metadata in log.")); > break; > case -1: > /* log detection error */ > - print_warning( > + if (obfuscate) > + print_warning( > _("Could not discern log; image will contain unobfuscated metadata in log.")); > break; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From shaun.tancheff@seagate.com Thu Aug 4 11:32:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A12CE7CA0 for ; Thu, 4 Aug 2016 11:32:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 483CB304048 for ; Thu, 4 Aug 2016 09:32:50 -0700 (PDT) X-ASG-Debug-ID: 1470328368-0bf8157e6c465e80001-NocioJ Received: from mx0a-000cda01.pphosted.com (mx0a-00003501.pphosted.com [67.231.144.15]) by cuda.sgi.com with ESMTP id wbCcxXCCisCRzlSx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 04 Aug 2016 09:32:48 -0700 (PDT) X-Barracuda-Envelope-From: shaun.tancheff@seagate.com X-Barracuda-Effective-Source-IP: mx0a-00003501.pphosted.com[67.231.144.15] X-Barracuda-Apparent-Source-IP: 67.231.144.15 Received: from pps.filterd (m0075550.ppops.net [127.0.0.1]) by mx0a-00003501.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u74GHPTu003400 for ; Thu, 4 Aug 2016 12:32:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=seagate.com; h=mime-version : in-reply-to : references : from : date : message-id : subject : to : cc : content-type; s=s2016050306; bh=EjDDSewwq5ROcPs+EgWTjPwLOZNrH5ar0Pwnowrw6HM=; b=fKMZHmo7Hon/gPSM8p0fAQMvAxukFJWGx8nLywksvXTWlf20bZ23nGbr1ZWhhKlbbXI5 rFQ47baOPGXRToxgEPH2AvTQSHMZXXyhLub84y9sYyC0GKtHAsl07b6jqrFb4CWTgsBR fLMYcNnKUweLBAdYp4lRk5lMl2fqS6lICGG9yipAEArAHC/E+oJx0eOOpzDygtqAq9vF O69Xgf8rm32loEkRNxpx53JxhHiZgwMrw8Q+hA3uvml3lXesNabtHx9cQv9bxV/45wWI re9rWnXYlmrlP7MAbrzMA0g3fTVvR48C1huMJL6adIIEgh7oudC+8tQIckSEmP2ebL2z 7Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=seagate.com; h=mime-version : in-reply-to : references : from : date : message-id : subject : to : cc : content-type; s=proofpoint; bh=EjDDSewwq5ROcPs+EgWTjPwLOZNrH5ar0Pwnowrw6HM=; b=Y9GJbm/QrnzVr1P14i7HFGTd7GwftuoGHsIefuIsxgSohh/aoIKOSCglSrxP2l5ngMd5 5VM+1JzAKg0nJXUwmQodyUrfoQd9hnb72Nvp8P6OBPLRdh7bz4z17FdEQOV9BTl6MGZJ Jte4WW8BZQY+1X0vHqnNsXkuL76r0X6/+puivKCh3tugUTpvim7AC//BOkQEFmmGI72W yingpSOBuUNnQUF1KUazvLx3hiadnD9O6bx1mkCGsp4IrH0FJOrBeQ9BbVLtQFw7d0VM be3vO90SC84xsCEqQrIxeM1Ma8GAEg09Z5RU7M9v3x2zTYzJ5PFaAmzYz+qgVFeAYdsj LA== Authentication-Results: seagate.com; dkim=pass header.s="google" header.d=seagate.com Received: from mail-ua0-f197.google.com (mail-ua0-f197.google.com [209.85.217.197]) by mx0a-00003501.pphosted.com with ESMTP id 24m7axrtcf-9 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Thu, 04 Aug 2016 12:32:47 -0400 Received: by mail-ua0-f197.google.com with SMTP id r91so343230939uar.2 for ; Thu, 04 Aug 2016 09:32:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=seagate.com; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=pujnIOPYvg/trn0pa2wEfdI7pQ3GHRqmDWBGrusLH1o=; b=aHIf5aKV71GHxaU4MswzJ2IHOXzm2rlOyNF53O7Iv0erJZqyBqFldN4sGa76QiUqYA S6LHpkZ9wqsMT9T+Jp9WpCk42PG9RjliDT4wVLxK9T/3VI6vB7uGE9QomeDyqiYPg3XG km/E5dQPRC+omdgHbPTSEleicKxFUTgt8Ka3bp47Ustc9Y0WlBnlGmScm6httbliCl8C JC2MKAAu1PXEPKB2NU3cLzas4o8Uyp3oFKk80lyKIXlpJEqcxLJJ1LevftS56Y4iIuOV DUEfIucO35hlPH/CCTiKjKPinS5vsKxjrcExbyKGg4RIUvTCiGhrNhCTXlAS31ytRFF2 /OsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=pujnIOPYvg/trn0pa2wEfdI7pQ3GHRqmDWBGrusLH1o=; b=ENpoXkn2RThZ9iwdNfm4EDhFwM0hdL8HHuSPgCJiyQO8oieH5sfbABKK5GZbZeNoUy yLyGOfO7uCUsnklK9Xu9r09lEwqlibO/pgMQKBCO62tqFh3LLEWa7j3KiaLxfFjhw/rg 5IgAOKiUephhhnrrJ5/Az03Vfgm7S1ng5n3dQ74kO0L95gvw/ILEScVztxmmTW7yomNo HlIFixRmPqdPQFPf6MtnGSq0uUXkH2/6k3uRyggL5kmC46HibF9u4wa0kccYOx2ti3/E RU5Q847+FUudkgnFog43EBhGMi47sV5WhHwlQje/iey9TlbhK7VWF36fqbo4+T4c0b49 /AWQ== X-Gm-Message-State: AEkoouuzPi7k5xpQNuavsq9hLa4hXTBX/opdnEdsbJLcjXHjJLnyNvzdxLEtyhejc1dgNhpHGeN7EDN5tPNjmhPs++LEzdPPzHHpUyLlZm7l1gH64FdqFzagHly3HKypa8IprJ3cdZfpLG5Ceyz0p1sMgSnT4jcqTclAYCEv3k8= X-Received: by 10.37.50.195 with SMTP id y186mr927998yby.137.1470328362218; Thu, 04 Aug 2016 09:32:42 -0700 (PDT) X-Received: by 10.37.50.195 with SMTP id y186mr927724yby.137.1470328357108; Thu, 04 Aug 2016 09:32:37 -0700 (PDT) MIME-Version: 1.0 Received: by 10.129.132.199 with HTTP; Thu, 4 Aug 2016 09:32:16 -0700 (PDT) In-Reply-To: <20160804154622.GB15656@infradead.org> References: <1465155145-10812-1-git-send-email-mchristi@redhat.com> <1465155145-10812-38-git-send-email-mchristi@redhat.com> <87fbe31f-27b3-ff7a-e381-34fc1aad337e@redhat.com> <20160804154622.GB15656@infradead.org> From: Shaun Tancheff Date: Thu, 4 Aug 2016 11:32:16 -0500 Message-ID: Subject: Re: [PATCH 37/45] drivers: use req op accessor To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 37/45] drivers: use req op accessor Cc: Mike Christie , philipp.reisner@linbit.com, dm-devel@redhat.com, target-devel@vger.kernel.org, linux-mtd@lists.infradead.org, drbd-dev@lists.linbit.com, linux-scsi@vger.kernel.org, Ross Zwisler , linux-ext4 , konrad.wilk@oracle.com, XFS Developers , linux-raid@vger.kernel.org, linux-bcache@vger.kernel.org, linux-block@vger.kernel.org, osd-dev@open-osd.org, Ross Zwisler , Jens Axboe , LKML , linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel , lars.ellenberg@linbit.com, linux-btrfs@vger.kernel.org Content-Type: text/plain; charset=UTF-8 X-Proofpoint-PolicyRoute: Outbound X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-08-04_09:,, signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 suspectscore=1 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1608040176 X-Proofpoint-Spam-Policy: Default Domain Policy X-Barracuda-Connect: mx0a-00003501.pphosted.com[67.231.144.15] X-Barracuda-Start-Time: 1470328368 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 748 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31749 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Aug 4, 2016 at 10:46 AM, Christoph Hellwig wrote: > On Wed, Aug 03, 2016 at 07:30:29PM -0500, Shaun Tancheff wrote: >> I think the translation in loop.c is suspicious here: >> >> "if use DIO && not (a flush_flag or discard_flag)" >> should translate to: >> "if use DIO && not ((a flush_flag) || op == discard)" >> >> But in the patch I read: >> "if use DIO && ((not a flush_flag) || op == discard) >> >> Which would have DIO && discards follow the AIO path? > > Indeed. Sorry for missing out on your patch, I just sent a fix > in reply to Dave's other report earlier which is pretty similar to > yours. No worries. I prefer your switch to a an if conditional here. -- Shaun Tancheff From toshi.kani@hpe.com Thu Aug 4 13:40:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3690C7CA0 for ; Thu, 4 Aug 2016 13:40:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DE7B6304032 for ; Thu, 4 Aug 2016 11:40:49 -0700 (PDT) X-ASG-Debug-ID: 1470336044-0bf8157e6c4717f0001-NocioJ Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0138.outbound.protection.outlook.com [104.47.32.138]) by cuda.sgi.com with ESMTP id Ic68oPb0L06faqzZ (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 04 Aug 2016 11:40:45 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Effective-Source-IP: mail-sn1nam01on0138.outbound.protection.outlook.com[104.47.32.138] X-Barracuda-Apparent-Source-IP: 104.47.32.138 Received: from CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.11) by CS1PR84MB0008.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Thu, 4 Aug 2016 18:40:42 +0000 Received: from CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.11]) by CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.11]) with mapi id 15.01.0549.023; Thu, 4 Aug 2016 18:40:42 +0000 From: "Kani, Toshimitsu" To: "david@fromorbit.com" , "boaz@plexistor.com" CC: "linux-ext4@vger.kernel.org" , "jack@suse.cz" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" Subject: Re: Subtle races between DAX mmap fault and write path Thread-Topic: Subtle races between DAX mmap fault and write path X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path Thread-Index: AQHR5/+GKX9GoZT7i02Vp4UF+8RxL6AsxqeAgAATU4CAAKUNgIABMOkAgADPd4CAAJ7PgIADzJCAgADs7QCABFeAgA== Date: Thu, 4 Aug 2016 18:40:42 +0000 Message-ID: <1470335997.8908.128.camel@hpe.com> References: <20160727120745.GI6860@quack2.suse.cz> <20160727211039.GA20278@linux.intel.com> <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> In-Reply-To: <20160802002144.GL16044@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=toshi.kani@hpe.com; x-originating-ip: [15.219.163.9] x-ms-office365-filtering-correlation-id: b328c600-6904-4ec8-7a22-08d3bc96d6db x-microsoft-exchange-diagnostics: 1;CS1PR84MB0008;6:Zel+zKkqAzlAUHsoVgj8jQ7d5daTwCYZOMbOCQ33Ov3R4wqhG0DjoHbE16rVNXVXrYGQeJKz5+hA6XKspJQBx/lY7874QLICIPXnoU6G7sTfx7tz2kfAfPOJoLuBj5IHmwsigPq2AW140l+fiyGxYVA45KvSAHAIoKljVCyeTkAiaKtRQcz7Ha3W9VttnYy7YLtCsDGHVQ7s1wBnVlOtvbzjkAMacWR6+TcBAxvx4SFiqm30JjsvHbIaGpMJs0XjfM7nPhdsrW8cREqdb16CipNceGTNCOOHVlBSkcy1t/GAYVR1BvuboLG3B5eMvrgNpxqCBy/XwiscUOPUtNd6rw==;5:cvbfRc+qNyq9RG8Ko/VFmiZ1krc7bDX7GlS8HEZliBTCDMzgUwuFnGFgwpZb21MFq0OvRd8me8r3q4bdc8kN9FxHvohhvwSJd0npXsPCMyajO2ausD7P2Ut926X9q7AXXBJnrPtI2TqyjED0VVBZMA==;24:bv/RA5PWSklTnVCWlUSXIoVt/r7CZWOhLgXTrxClVxcCokn2XP+lzY+fa6cQTGEkZV/Dh6o7XsAmqHLF0ZJ89UEQ4I4YHZJlb5WDUGO1I5M=;7:jwfk2AOoiKNMTHxRnsS9hnc6jyqPzE90QtSTELNHGhEo5jyN+EPM8u/RhAy0Ej8/HggY7csu/Rrw+BmmXmLx9EzhALyiglQgQ5LgV2kzLB5b6W8Lo3lD9YmwOALhE8BXgc+YMPKrUceofce4rWfngu9O+MfLE8zaxgYhwi3dIcSPXGizKT2TEtqGmkii3N5tIX9npT1FBIbh7B5SBWspZ8p8NMkbD3JEz5pYgkh9EZjXoh2WKHPhY8oYky8rsd9d x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0008; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026);SRVR:CS1PR84MB0008;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0008; x-forefront-prvs: 00246AB517 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(7916002)(24454002)(43544003)(377454003)(199003)(377424004)(189002)(50986999)(2950100001)(2900100001)(86362001)(2906002)(101416001)(3660700001)(3280700002)(76176999)(68736007)(2501003)(4326007)(11100500001)(5001770100001)(106116001)(66066001)(54356999)(97736004)(36756003)(92566002)(103116003)(189998001)(102836003)(93886004)(3846002)(586003)(19580395003)(105586002)(8936002)(87936001)(10400500002)(7846002)(106356001)(305945005)(7736002)(99286002)(5002640100001)(33646002)(6116002)(81156014)(122556002)(8676002)(81166006)(77096005);DIR:OUT;SFP:1102;SCL:1;SRVR:CS1PR84MB0008;H:CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; received-spf: None (protection.outlook.com: hpe.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: hpe.com X-MS-Exchange-CrossTenant-originalarrivaltime: 04 Aug 2016 18:40:42.4004 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0008 X-Barracuda-Connect: mail-sn1nam01on0138.outbound.protection.outlook.com[104.47.32.138] X-Barracuda-Start-Time: 1470336045 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6831 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header T24gVHVlLCAyMDE2LTA4LTAyIGF0IDEwOjIxICsxMDAwLCBEYXZlIENoaW5uZXIgd3JvdGU6DQo+ IE9uIE1vbiwgQXVnIDAxLCAyMDE2IGF0IDAxOjEzOjQ1UE0gKzAzMDAsIEJvYXogSGFycm9zaCB3 cm90ZToNCj4gPiANCj4gPiBPbiAwNy8zMC8yMDE2IDAzOjEyIEFNLCBEYXZlIENoaW5uZXIgd3Jv dGU6DQo+ID4gPD4NCj4gPiA+IElmIHdlIHRyYWNrIHRoZSBkaXJ0eSBibG9ja3MgZnJvbSB3cml0 ZSBpbiB0aGUgcmFkaXggdHJlZSBsaWtlIHdlDQo+ID4gPiBmb3IgbW1hcCwgdGhlbiB3ZSBjYW4g anVzdCB1c2UgYSBub3JtYWwgbWVtY3B5KCkgaW4gZGF4X2RvX2lvKCksDQo+ID4gPiBnZXR0aW5n IHJpZCBvZiB0aGUgc2xvdyBjYWNoZSBieXBhc3MgdGhhdCBpcyBjdXJyZW50bHkgcnVuLiBSYWRp eA0KPiA+ID4gdHJlZSB1cGRhdGVzIGFyZSBtdWNoIGxlc3MgZXhwZW5zaXZlIHRoYW4gYSBzbG93 IG1lbWNweSBvZiBsYXJnZQ0KPiA+ID4gYW1vdW50cyBvZiBkYXRhLCBhZCBmc3luYyBjYW4gdGhl biB0YWtlIGNhcmUgb2YgcGVyc2lzdGVuY2UsIGp1c3QNCj4gPiA+IGxpa2Ugd2UgZG8gZm9yIG1t YXAuDQo+ID4gPiANCj4gPg0KPiA+IE5vIcKgDQo+ID4gDQo+ID4gbW92X250IGluc3RydWN0aW9u cywgVGhhdCAic2xvdyBjYWNoZSBieXBhc3MgdGhhdCBpcyBjdXJyZW50bHkgcnVuIiBhYm92ZQ0K PiA+IGlzIGFjdHVhbGx5IGZhc3RlciB0aGVuIGNhY2hlZCB3cml0ZXMgYnkgMjAlLCBhbmQgaWYg eW91IGFkZCB0aGUgZGlydHkNCj4gPiB0cmFja2luZyBhbmQgY2xfZmx1c2ggaW5zdHJ1Y3Rpb25z IGl0IGJlY29tZXMgeDIgc2xvd2VyIGluIHRoZSBtb3N0DQo+ID4gb3B0aW1hbCBjYXNlIGFuZCAz IHRpbWVzIHNsb3dlciBpbiB0aGUgREFYIGNhc2UuDQo+DQo+IElPV3MsIHdlJ2QgZXhwZWN0IHdy aXRpbmcgdG8gYSBmaWxlIHdpdGggREFYIHRvIGJlIGZhc3RlciB0aGFuIHdoZW4NCj4gYnVmZmVy ZWQgdGhyb3VnaCB0aGUgcGFnZSBjYWNoZSBhbmQgZnN5bmMoKWQsIHJpZ2h0Pw0KPg0KPiBUaGUg bnVtYmVycyBJIGdldCBzYXkgb3RoZXJ3aXNlLiBGaWxlc3lzdGVtIG9uIDhHQiBwbWVtIGJsb2Nr IGRldmljZToNCj4gDQo+ICQgc3VkbyBta2ZzLnhmcyAtZiAvZGV2L3BtZW0xDQo+IG1ldGEtZGF0 YT0vZGV2L3BtZW0xwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpc2l6ZT01MTLCoMKgwqDCoGFn Y291bnQ9NCwgYWdzaXplPTUyNDI4OCBibGtzDQo+IMKgwqDCoMKgwqDCoMKgwqDCoD3CoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2VjdHN6PTQwOTbCoMKgYXR0 cj0yLCBwcm9qaWQzMmJpdD0xDQo+IMKgwqDCoMKgwqDCoMKgwqDCoD3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3JjPTHCoMKgwqDCoMKgwqDCoMKgZmlub2J0 PTEsIHNwYXJzZT0wLCBybWFwYnQ9MCwNCj4gcmVmbGluaz0wDQo+IGRhdGHCoMKgwqDCoMKgPcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBic2l6ZT00MDk2wqDC oMKgYmxvY2tzPTIwOTcxNTIsIGltYXhwY3Q9MjUNCj4gwqDCoMKgwqDCoMKgwqDCoMKgPcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdW5pdD0wwqDCoMKgwqDC oMKgc3dpZHRoPTAgYmxrcw0KPiBuYW1pbmfCoMKgwqA9dmVyc2lvbiAywqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGJzaXplPTQwOTbCoMKgwqBhc2NpaS1jaT0wIGZ0eXBlPTENCj4gbG9nwqDC oMKgwqDCoMKgPWludGVybmFsIGxvZ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqBic2l6ZT00MDk2wqDC oMKgYmxvY2tzPTI1NjAsIHZlcnNpb249Mg0KPiDCoMKgwqDCoMKgwqDCoMKgwqA9wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNlY3Rzej00MDk2wqDCoHN1bml0 PTEgYmxrcywgbGF6eS1jb3VudD0xDQo+IHJlYWx0aW1lID1ub25lwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBleHRzej00MDk2wqDCoMKgYmxvY2tzPTAsIHJ0ZXh0ZW50cz0w DQo+IA0KPiBUZXN0IGNvbW1hbmQgdGhhdCB3cml0ZXMgMUdCIHRvIHRoZSBmaWxlc3lzdGVtOg0K PiANCj4gJCBzdWRvIHRpbWUgeGZzX2lvIC1mIC1jICJwd3JpdGUgMCAxZyIgLWMgInN5bmMiIC9t bnQvc2NyYXRjaC9mb28NCj4gd3JvdGUgMTA3Mzc0MTgyNC8xMDczNzQxODI0IGJ5dGVzIGF0IG9m ZnNldCAwDQo+IDEgR2lCLCAyNjIxNDQgb3BzOyAwOjAwOjAxLjAwICg4ODAuMDQwIE1pQi9zZWMg YW5kIDIyNTI5MC4zMzE3IG9wcy9zZWMpDQo+IDAuMDJ1c2VyIDEuMTNzeXN0ZW0gMDowMi4yN2Vs YXBzZWQgNTElQ1BVICgwYXZndGV4dCswYXZnZGF0YQ0KPiAyMzQ0bWF4cmVzaWRlbnQpaw0KPiAw aW5wdXRzKzBvdXRwdXRzICgwbWFqb3IrMTA5bWlub3IpcGFnZWZhdWx0cyAwc3dhcHMNCj4gDQo+ IFJlc3VsdHM6DQo+IA0KPiAJwqDCoMKgwqBwd3JpdGUgQi9XIChNaUIvcykJCQlydW50aW1lDQo+ IHJ1bglubyBEQVgJCURBWAkJbm8gREFYCQlEQQ0KPiBYDQo+IMKgMQk4ODAuMDQwCQkyMzYuMzUy CQkyLjI3cwkJDQo+IDQuMzRzDQo+IMKgMgk4NTcuMDk0CQkyNTcuMjk3CQkyLjE4cwkJDQo+IDMu OTlzDQo+IMKgMwk4NjUuODIwCQkyMzYuMDg3CQkyLjEzcwkJDQo+IDQuMzRzDQo+IA0KPiBJdCBp cyBxdWl0ZSBjbGVhciB0aGF0ICpEQVggaXMgbXVjaCBzbG93ZXIqIHRoYW4gbm9ybWFsIGJ1ZmZl cmVkDQo+IElPIHRocm91Z2ggdGhlIHBhZ2UgY2FjaGUgZm9sbG93ZWQgYnkgYSBmc3luYygpLg0K PiANCj4gU3RvcCBhbmQgdGhpbmsgd2h5IHRoYXQgbWlnaHQgYmUuIFdlJ3JlIG9ubHkgZG9pbmcg b25lIGNvcHkgd2l0aA0KPiBEQVgsIHNvIHdoeSBpcyB0aGUgcHdyaXRlKCkgc3BlZWQgNHggbG93 ZXIgdGhhbiBmb3IgYSBjb3B5IGludG8gdGhlDQo+IHBhZ2UgY2FjaGU/IFdlJ3JlIG5vdCBjb3B5 aW5nIDR4IHRoZSBkYXRhIGhlcmUuIFdlJ3JlIGNvcHlpbmcgaXQNCj4gb25jZS4gQnV0IHRoZXJl J3MgYW5vdGhlciB1bmNhY2hlZCB3cml0ZSB0byBlYWNoIHBhZ2UgZHVyaW5nDQo+IGFsbG9jYXRp b24gdG8gemVybyBlYWNoIGJsb2NrIGZpcnN0LCBzbyB3ZSdyZSBhY3R1YWxseSBkb2luZyB0d28N Cj4gdW5jYWNoZWQgd3JpdGVzIHRvIHRoZSBwYWdlLiBBbmQgd2UncmUgZG9pbmcgYW4gYWxsb2Nh dGlvbiBwZXIgcGFnZQ0KPiB3aXRoIERBWCwgd2hlcmVhcyB3ZSdyZSB1c2luZyBkZWxheWVkIGFs bG9jYXRpb24gaW4gdGhlIGJ1ZmZlcmVkIElPDQo+IGNhc2Ugd2hpY2ggaGFzIG11Y2ggbGVzcyBv dmVyaGVhZC4NCj4gDQo+IFRoZSBvbmx5IHRoaW5nIHdlIGNhbiBkbyBoZXJlIHRvIHNwZWVkIHRo ZSBEQVggY2FzZSB1cCBpcyBkbyBjYWNoZWQNCj4gbWVtY3B5IHNvIHRoYXQgdGhlIGRhdGEgY29w eSBhZnRlciB6ZXJvaW5nIHJ1bnMgYXQgTDEgY2FjaGUgc3BlZWQNCj4gKGkuZS4gNTB4IGZhc3Rl ciB0aGFuIGl0IGN1cnJlbnRseSBkb2VzKS4NCj4gDQo+IExldCdzIHRha2UgdGhlIGFsbG9jYXRp b24gb3V0IG9mIGl0LCBlaD8gTGV0J3MgZG8gb3ZlcndyaXRlIGluc3RlYWQsDQo+IGZzeW5jIGlu IHRoZSBidWZmZXJlZCBJbyBjYXNlLCBubyBmc3luYyBmb3IgREFYOg0KPiANCj4gCcKgwqDCoMKg cHdyaXRlIEIvVyAoTWlCL3MpCQkJcnVudGltZQ0KPiBydW4Jbm8gREFYCQlEQVgJCW5vIERBWAkJ REENCj4gWA0KPiDCoDEJMTExOQkJMTEyNQkJMS44NXMJCTAuOTNzDQo+IMKgMgkxMTEzCQkxMTIx CQkxLjgzcwkJMC45MXMNCj4gwqAzCTExMjgJCTEwNzgJCTEuODBzCQkwLjk0cw0KPiANCj4gU28s IHB3cml0ZSBzcGVlZHMgYXJlIG5vIGRpZmZlcmVudCBmb3IgREFYIHZzIHBhZ2UgY2FjaGUgSU8u IEFsc28sDQo+IG5vdyB3ZSBjYW4gc2VlIHRoZSBvdmVyaGVhZCBvZiB3cml0ZWJhY2sgLSBhIHNl Y29uZCBkYXRhIGNvcHkgdG8NCj4gdGhlIHBtZW0gZm9yIHRoZSBJTyBkdXJpbmcgZnN5bmMuIElm IEkgdGFrZSB0aGUgZnN5bmMoKSBhd2F5IGZyb20NCj4gdGhlIGJ1ZmZlcmVkIElPLCB0aGUgcnVu dGltZSBkcm9wcyB0byAwLjg5LTAuOTFzLCB3aGljaCBpcyBpZGVudGljYWwNCj4gdG8gdGhlIERB WCBjb2RlLiBHaXZlbiB0aGUgREFYIGNvZGUgaGFzIGEgc2hvcnQgSU8gcGF0aCB0aGFuDQo+IGJ1 ZmZlcmVkIElPLCBpdCdzIG5vdCBzaG93aW5nIGFueSBhZHZhbnRhZ2Ugc3BlZWQgZm9yIHVzaW5n IHVuY2FjaGVkDQo+IElPLi4uLg0KPg0KPiBMZXQncyBnbyBiYWNrIHRvIHRoZSBhbGxvY2F0aW9u IGNhc2UsIGJ1dCB0aGlzIHRpbWUgdGFrZSBhZHZhbnRhZ2UNCj4gb2YgdGhlIG5ldyBpb21hcCBi YXNlZCBJbyBwYXRoIGluIFhGUyB0byBhbW9ydGlzZSB0aGUgREFYIGFsbG9jYXRpb24NCj4gb3Zl cmhlYWQgYnkgdXNpbmcgYSAxNk1CIElPIHNpemUgaW5zdGVhZCBvZiA0azoNCj4gDQo+ICQgc3Vk byB0aW1lIHhmc19pbyAtZiAtYyAicHdyaXRlIDAgMWcgLWIgMTZtIiAtYyBzeW5jIC9tbnQvc2Ny YXRjaC9mb28NCj4gDQo+IA0KPiAJwqDCoMKgwqBwd3JpdGUgQi9XIChNaUIvcykJCQlydW50aW1l DQo+IHJ1bglubyBEQVgJCURBWAkJbm8gREFYCQlEQQ0KPiBYDQo+IMKgMQkxMzQ0CQkxMDI4CQkx LjYzcwkJMS4wM3MNCj4gwqAyCTE0MTAJCcKgOTgwCQkxLjYycwkJMS4wNnMNCj4gwqAzCTEzOTkJ CTEwMzIJCTEuNzJzCQkwLjk5cw0KPiANCj4gU28sIHB3cml0ZSBiYW5kd2lkdGggb2YgdGhlIGNv cHkgaW50byB0aGUgcGFnZSBjYWNoZSBpcyBzdGlsbCBtdWNoDQo+IGhpZ2hlciB0aGFuIHRoYXQg b2YgdGhlIERBWCBwYXRoLCBidXQgbm93IHRoZSBhbGxvY2F0aW9uIG92ZXJoZWFkDQo+IGlzIG1p bmltaXNlZCBhbmQgaGVuY2UgdGhlIGRvdWJsZSBjb3B5IGluIHRoZSBidWZmZXJlZCBJTyB3cml0 ZWJhY2sNCj4gcGF0aCBzaG93cyB1cC4gRm9yIGNvbXBsZXRlbmVzcywgbGV0cyBqdXN0IHJ1biB0 aGUgb3ZlcndyaXRlIGNhc2UNCj4gaGVyZSB3aGljaCBpcyBlZmZlY3RpdmVseSBqdXN0IGNvbXBl dGluZ8KgwqBtZW1jcHkgaW1wbGVtZW50YXRpb25zLA0KPiBmc3luYyBmb3IgYnVmZmVyZWQsIG5v IGZzeW5jIGZvciBEQVg6DQo+IA0KPiAJwqDCoMKgwqBwd3JpdGUgQi9XIChNaUIvcykJCQlydW50 aW1lDQo+IHJ1bglubyBEQVgJCURBWAkJbm8gREFYCQlEQQ0KPiBYDQo+IMKgMQkxNzkxCQkxNzI3 CQkxLjUzcwkJMC41OXMNCj4gwqAyCTE3NjgJCTE3MjYJCTEuNTdzCQkwLjU5cw0KPiDCoDMJMTc5 OQkJMTcyOQkJMS41NXMJCTAuNTlzDQo+IA0KPiBBZ2FpbiwgcnVudGltZSBzaG93cyB0aGUgb3Zl cmhlYWQgb2YgdGhlIGRvdWJsZSBjb3B5IGluIHRoZSBidWZmZXJlZA0KPiBJTy93cml0ZWJhY2sg cGF0aC4gSXQgYWxzbyBzaG93cyB0aGUgb3ZlcmhlYWQgaW4gdGhlIERBWCBwYXRoIG9mIHRoZQ0K PiBhbGxvY2F0aW9uIHplcm9pbmcgdnMgb3ZlcndyaXRlLiBJZiBJIGRyb3AgdGhlIGZzeW5jIGZy b20gdGhlDQo+IGJ1ZmZlcmVkIElPIHBhdGgsIGJhbmR3aWR0aCByZW1haW5zIHRoZSBzYW1lIGJ1 dCBydW50aW1lIGRyb3BzIHRvDQo+IDAuNTUtMC41N3MsIHNvIGFnYWluIHRoZSBidWZmZXJlZCBJ TyB3cml0ZSBwYXRoIGlzIGZhc3RlciB0aGFuIERBWA0KPiB3aGlsZSBkb2luZyBtb3JlIHdvcmsu DQo+IA0KPiBJT3dzLCB0aGUgb3ZlcmhlYWQgb2YgZGlydHkgcGFnZSB0cmFja2luZyBpbiB0aGUg cGFnZSBjYWNoZSBtYXBwaW5nDQo+IHRyZWUgaXMgbm90IHNpZ25pZmljYW50IGluIHRlcm1zIG9m IHdyaXRlKCkgcGVyZm9ybWFuY2UuIEhlbmNlDQo+IEkgZmFpbCB0byBzZWUgd2h5IGl0IHNob3Vs ZCBiZSBzaWduaWZpY2FudCBpbiB0aGUgREFYIHBhdGggLSBpdCB3aWxsDQo+IHByb2JhYmx5IGhh dmUgbGVzcyBvdmVyaGVhZCBiZWNhdXNlIHdlIGhhdmUgbGVzcyB0byBhY2NvdW50IGZvciBpbg0K PiB0aGUgREFYIHdyaXRlIHBhdGguIFRoZSBvbmx5IHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIGRp cnR5IHRyYWNraW5nDQo+IGlzIGluIHRoZSBmc3luYyB3cml0ZWJhY2sgcGF0aCBpdHNlbGYsIGFu ZCB0aGF0IGEgc2VwYXJhdGUgaXNzdWUNCj4gZm9yIG9wdGltaXNhdGlvbi4NCg0KSSBtb3N0bHkg YWdyZWUgd2l0aCB0aGUgYW5hbHlzaXMsIGJ1dCBJIGhhdmUgYSBmZXcgY29tbWVudHMgYWJvdXQg dGhlIHVzZSBvZg0KY2FjaGVkIC8gdW5jYWNoZWQgKG1vdm50KSBjb3B5IHRvIFBNRU0uDQoNCkkg ZG8gbm90IHRoaW5rIHRoZSB0ZXN0IHJlc3VsdHMgYXJlIHJlbGV2YW50IG9uIHRoaXMgcG9pbnQg YmVjYXVzZSBib3RoDQpidWZmZXJlZCBhbmQgZGF4IHdyaXRlKCkgcGF0aHMgdXNlIHVuY2FjaGVk IGNvcHkgdG8gYXZvaWQgY2xmbHVzaC4gwqBUaGUNCmJ1ZmZlcmVkIHBhdGggdXNlcyBjYWNoZWQg Y29weSB0byB0aGUgcGFnZSBjYWNoZSBhbmQgdGhlbiB1c2UgdW5jYWNoZWQgY29weSB0bw0KUE1F TSB2aWEgd3JpdGViYWNrLiDCoFRoZXJlZm9yZSwgdGhlIGJ1ZmZlcmVkIElPIHBhdGggYWxzbyBi ZW5lZml0cyBmcm9tIHVzaW5nDQp1bmNhY2hlZCBjb3B5IHRvIGF2b2lkIGNsZmx1c2guDQoNCkNh Y2hlZCBjb3B5IChyZXEgbW92cSkgaXMgc2xpZ2h0bHkgZmFzdGVyIHRoYW4gdW5jYWNoZWQgY29w eSwgYW5kIHNob3VsZCBiZQ0KdXNlZCBmb3Igd3JpdGluZyB0byB0aGUgcGFnZSBjYWNoZS4gwqBG b3Igd3JpdGluZyB0byBQTUVNLCBob3dldmVyLCBhZGRpdGlvbmFsDQpjbGZsdXNoIGNhbiBiZSBl eHBlbnNpdmUsIGFuZCBhbGxvY2F0aW5nIGNhY2hlbGluZXMgZm9yIFBNRU0gbGVhZHMgdG8gZXZp Y3QNCmFwcGxpY2F0aW9uJ3MgY2FjaGVsaW5lcy4NCg0KVGhhbmtzLA0KLVRvc2hp From ross.zwisler@linux.intel.com Thu Aug 4 13:47:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F7657CA0 for ; Thu, 4 Aug 2016 13:47:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 557738F8040 for ; Thu, 4 Aug 2016 11:47:00 -0700 (PDT) X-ASG-Debug-ID: 1470336418-0bf8157e6c471cf0001-NocioJ Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by cuda.sgi.com with ESMTP id g72XsXvYPe1i7hRH for ; Thu, 04 Aug 2016 11:46:59 -0700 (PDT) X-Barracuda-Envelope-From: ross.zwisler@linux.intel.com X-Barracuda-Effective-Source-IP: mga03.intel.com[134.134.136.65] X-Barracuda-Apparent-Source-IP: 134.134.136.65 X-ASG-Whitelist: Client Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga103.jf.intel.com with ESMTP; 04 Aug 2016 11:46:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,471,1464678000"; d="scan'208";a="859856972" Received: from theros.lm.intel.com (HELO linux.intel.com) ([10.232.112.65]) by orsmga003.jf.intel.com with ESMTP; 04 Aug 2016 11:46:58 -0700 Date: Thu, 4 Aug 2016 12:46:58 -0600 From: Ross Zwisler To: Christoph Hellwig Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, linux-nvdimm@ml01.01.org, xfs@oss.sgi.com Subject: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Message-ID: <20160804184658.GB3128@linux.intel.com> X-ASG-Orig-Subj: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Mail-Followup-To: Ross Zwisler , Christoph Hellwig , Dave Chinner , linux-fsdevel@vger.kernel.org, linux-nvdimm@ml01.01.org, xfs@oss.sgi.com References: <20160803003354.GP16044@dastard> <20160804154805.GA24025@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804154805.GA24025@infradead.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Barracuda-Connect: mga03.intel.com[134.134.136.65] X-Barracuda-Start-Time: 1470336419 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 403 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 04, 2016 at 08:48:05AM -0700, Christoph Hellwig wrote: > Just send a fix that you're Cc'ed on. But now xfs/049 hangs, although > only on pmem devices, loop on non-pmem seems to be fine. 4.7 was fine > as well. I don't think Mike's fix solves this issue. I'm still able to reproduce the hang with linux/master + the patch he sent out. Did you retest and get a different result? From ross.zwisler@linux.intel.com Thu Aug 4 13:54:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5786D7CA0 for ; Thu, 4 Aug 2016 13:54:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B82F8F8040 for ; Thu, 4 Aug 2016 11:54:27 -0700 (PDT) X-ASG-Debug-ID: 1470336866-0bf57b369b3e1a00001-NocioJ Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by cuda.sgi.com with ESMTP id 5SRt6yVqQWLOX6Nz for ; Thu, 04 Aug 2016 11:54:26 -0700 (PDT) X-Barracuda-Envelope-From: ross.zwisler@linux.intel.com X-Barracuda-Effective-Source-IP: mga09.intel.com[134.134.136.24] X-Barracuda-Apparent-Source-IP: 134.134.136.24 X-ASG-Whitelist: Client Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga102.jf.intel.com with ESMTP; 04 Aug 2016 11:54:26 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,471,1464678000"; d="scan'208";a="744280571" Received: from theros.lm.intel.com (HELO linux.intel.com) ([10.232.112.65]) by FMSMGA003.fm.intel.com with ESMTP; 04 Aug 2016 11:54:25 -0700 Date: Thu, 4 Aug 2016 12:54:25 -0600 From: Ross Zwisler To: Ross Zwisler , Christoph Hellwig , Dave Chinner , linux-fsdevel@vger.kernel.org, linux-nvdimm@ml01.01.org, xfs@oss.sgi.com Subject: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Message-ID: <20160804185425.GC3128@linux.intel.com> X-ASG-Orig-Subj: Re: [4.8 hang] xfstests generic/361 hangs on dax enabled filesystems Mail-Followup-To: Ross Zwisler , Christoph Hellwig , Dave Chinner , linux-fsdevel@vger.kernel.org, linux-nvdimm@ml01.01.org, xfs@oss.sgi.com References: <20160803003354.GP16044@dastard> <20160804154805.GA24025@infradead.org> <20160804184658.GB3128@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804184658.GB3128@linux.intel.com> User-Agent: Mutt/1.6.2 (2016-07-01) X-Barracuda-Connect: mga09.intel.com[134.134.136.24] X-Barracuda-Start-Time: 1470336866 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 549 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 04, 2016 at 12:46:58PM -0600, Ross Zwisler wrote: > On Thu, Aug 04, 2016 at 08:48:05AM -0700, Christoph Hellwig wrote: > > Just send a fix that you're Cc'ed on. But now xfs/049 hangs, although > > only on pmem devices, loop on non-pmem seems to be fine. 4.7 was fine > > as well. > > I don't think Mike's fix solves this issue. I'm still able to reproduce the > hang with linux/master + the patch he sent out. > > Did you retest and get a different result? Never mind, didn't see that you had sent out patches as well. From P.Rynhart@massey.ac.nz Thu Aug 4 17:48:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C89F47CA0 for ; Thu, 4 Aug 2016 17:48:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 995D3304053 for ; Thu, 4 Aug 2016 15:48:36 -0700 (PDT) X-ASG-Debug-ID: 1470350913-0bf57b369d3feb50001-NocioJ Received: from mu-mail3.massey.ac.nz (mu-mail3.massey.ac.nz [130.123.129.187]) by cuda.sgi.com with ESMTP id PlDOoeSWd9XMle6l for ; Thu, 04 Aug 2016 15:48:34 -0700 (PDT) X-Barracuda-Envelope-From: P.Rynhart@massey.ac.nz X-Barracuda-Effective-Source-IP: mu-mail3.massey.ac.nz[130.123.129.187] X-Barracuda-Apparent-Source-IP: 130.123.129.187 Received: from tur-mm4.massey.ac.nz (tur-mm4.massey.ac.nz [130.123.96.132]) by mu-mail3.massey.ac.nz (Postfix) with ESMTP id 24B6F1B2E8E for ; Fri, 5 Aug 2016 10:48:33 +1200 (NZST) Received: from tur-exch-hub2.massey.ac.nz (Not Verified[10.100.189.3]) by tur-mm4.massey.ac.nz with Trustwave SEG id ; Fri, 05 Aug 2016 10:48:32 +1200 Received: from TUR-EXCH-NODE1.massey.ac.nz ([fe80::9084:2fd8:264c:14e1]) by tur-exch-hub2.massey.ac.nz ([fe80::b593:a83a:a6d1:9959%13]) with mapi id 14.03.0266.001; Fri, 5 Aug 2016 10:48:32 +1200 From: "Rynhart, Patrick" To: "'xfs@oss.sgi.com'" Subject: Programmatically query default XFS Quota ? Thread-Topic: Programmatically query default XFS Quota ? X-ASG-Orig-Subj: Programmatically query default XFS Quota ? Thread-Index: AdHuoibRZ2b27dZGQ7uHZBtFJiM43g== Date: Thu, 4 Aug 2016 22:48:32 +0000 Message-ID: <839565DD1303AC4993B245FFDB34AF78510C9C8F@tur-exch-node1.massey.ac.nz> Accept-Language: en-GB, en-NZ, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.100.189.3] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: mu-mail3.massey.ac.nz[130.123.129.187] X-Barracuda-Start-Time: 1470350914 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 214 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Hi, I can set a default quota on a file system as follows: xfs_quota -x -c 'limit bsoft=3D100m bhard=3D100m -d' /home But I'm not sure how to query this - can anyone advise ? Thanks in Advance, Patrick From prvs=0171dd013=Vincent.Mcintyre@csiro.au Thu Aug 4 18:23:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DAC6D7CA0 for ; Thu, 4 Aug 2016 18:23:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6FCADAC003 for ; Thu, 4 Aug 2016 16:23:51 -0700 (PDT) X-ASG-Debug-ID: 1470353026-0bf8157e6a493810001-NocioJ Received: from act-MTAout4.csiro.au (act-MTAout4.csiro.au [150.229.7.41]) by cuda.sgi.com with ESMTP id wCFIlKf1WumuADyS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 04 Aug 2016 16:23:48 -0700 (PDT) X-Barracuda-Envelope-From: prvs=0171dd013=Vincent.Mcintyre@csiro.au X-Barracuda-Effective-Source-IP: act-MTAout4.csiro.au[150.229.7.41] X-Barracuda-Apparent-Source-IP: 150.229.7.41 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=csiro.au; i=@csiro.au; q=dns/txt; s=dkim; t=1470353029; x=1501889029; h=date:from:to:cc:subject:message-id:references: mime-version:in-reply-to; bh=TBpcL46g3bYA7PcQxcUFcq42Uhf1o/W7kgsCa0Vmcgk=; b=WD3U5grrTxGKO7QfZ5FiJuAMgmC8yOd/UwjC9c9PU6vVhZ5AAf5lEh5t e2rHEFwy6aE4TvPtaJ3Pbj8Tmpa0XS6SLDMgo3YnjX2KtCAIfAVlbm+G8 Hew1/CcVek8BAOjwejm79kqVjP9CMcE2NAXG2MbeeV4fTfHdqeS8oZXqW 8=; X-SBRS: None IronPort-PHdr: =?us-ascii?q?9a23=3ACJfxLh8FxWde+v9uRHKM819IXTAuvvDOBiVQ1KB9?= =?us-ascii?q?2+0cTK2v8tzYMVDF4r011RmSDN2du6kP0bGempujcFRI2YyGvnEGfc4EfD4+ou?= =?us-ascii?q?JSoTYdBtWYA1bwNv/gYn9yNs1DUFh44yPzahANS47AblHf6ke/8SQVUk2mc1Ek?= =?us-ascii?q?fqKlQcWI1Iye7KObw9XreQJGhT6wM/tZDS6dikHvjPQQmpZoMa0ryxHE8TNicu?= =?us-ascii?q?VSwn50dxrIx06vru/5xpNo8jxRtvQ97IYAFPyiJ+VrBYBfWX4cImY17df38VH7?= =?us-ascii?q?RBeV53AfGC1CqlxyEg7F5QvmdpL4qTD3p6x002+cL5ulY6ozXGGc7qFgRRn0wA?= =?us-ascii?q?IMFjgl4XvawphujaRQrRS94Rl0wojIcZuYHPFlf7naO9oHEzkSFv1NXjBMV9vv?= =?us-ascii?q?J7AECPAMaKMB99Hw?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A2EeAgDmzaNX/x/3U5hcDoM3gVm0Z4Q4g?= =?us-ascii?q?X2EVoFHAoFFOBQBAQEBAQEBAQJaJ4IyBAETAYIUAQU6PxALGAkVEA8FSQ6INr5?= =?us-ascii?q?HAQEBBwEBAQEBAQEghiqETYQdCoNFgi8FmTSOeIFfAY1qjDGDdx42gz9NhyxFA?= =?us-ascii?q?X4BAQE?= X-IPAS-Result: =?us-ascii?q?A2EeAgDmzaNX/x/3U5hcDoM3gVm0Z4Q4gX2EVoFHAoFFOBQ?= =?us-ascii?q?BAQEBAQEBAQJaJ4IyBAETAYIUAQU6PxALGAkVEA8FSQ6INr5HAQEBBwEBAQEBA?= =?us-ascii?q?QEghiqETYQdCoNFgi8FmTSOeIFfAY1qjDGDdx42gz9NhyxFAX4BAQE?= X-IronPort-AV: E=Sophos;i="5.28,471,1464616800"; d="scan'208";a="135022571" Received: from exch1-cdc.nexus.csiro.au ([152.83.247.31]) by act-ironport-int.csiro.au with ESMTP/TLS/AES256-SHA; 05 Aug 2016 09:23:45 +1000 Received: from ncpinstall.atnf.CSIRO.AU (130.155.194.144) by exch1-cdc.nexus.csiro.au (152.83.247.31) with Microsoft SMTP Server (TLS) id 15.0.1178.4; Fri, 5 Aug 2016 09:23:45 +1000 Date: Fri, 5 Aug 2016 09:23:43 +1000 From: Vincent McIntyre To: "Rynhart, Patrick" CC: "'xfs@oss.sgi.com'" Subject: Re: Programmatically query default XFS Quota ? Message-ID: <20160804232343.GC6606@ncpinstall.atnf.CSIRO.AU> X-ASG-Orig-Subj: Re: Programmatically query default XFS Quota ? References: <839565DD1303AC4993B245FFDB34AF78510C9C8F@tur-exch-node1.massey.ac.nz> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <839565DD1303AC4993B245FFDB34AF78510C9C8F@tur-exch-node1.massey.ac.nz> User-Agent: Mutt/1.5.23 (2014-03-12) X-Originating-IP: [130.155.194.144] X-Barracuda-Connect: act-MTAout4.csiro.au[150.229.7.41] X-Barracuda-Start-Time: 1470353027 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 314 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Aug 04, 2016 at 10:48:32PM +0000, Rynhart, Patrick wrote: > Hi, > > I can set a default quota on a file system as follows: > > xfs_quota -x -c 'limit bsoft=100m bhard=100m -d' /home > > But I'm not sure how to query this - can anyone advise ? quotatool understands xfs quotas to some degree. From david@fromorbit.com Thu Aug 4 18:38:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 630397CA0 for ; Thu, 4 Aug 2016 18:38:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25ECA304032 for ; Thu, 4 Aug 2016 16:38:15 -0700 (PDT) X-ASG-Debug-ID: 1470353892-0bf8157e6d495810001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id cL4UpHpd6fprQsLl for ; Thu, 04 Aug 2016 16:38:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnUPAHnRo1d5LI7JIGdsb2JhbABcDoM3gVKCeYN5nS8BAQEBAQEGjGCDZYY1hhcEAgKBRE0BAQEBAQEHAQEBAQEBOECEXwEFOhwjEAgDGAkMGQ8FJQMHGhOIML5GAQEIAgEkHoVEhRWEHAEKWIJtgi8BBJk0jniBX41rjDGDd4JmHIERTSoyhk8BJYEfAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2016 09:07:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVSCj-0003lx-0s; Fri, 05 Aug 2016 09:37:33 +1000 Date: Fri, 5 Aug 2016 09:37:32 +1000 From: Dave Chinner To: "Rynhart, Patrick" Cc: "'xfs@oss.sgi.com'" Subject: Re: Programmatically query default XFS Quota ? Message-ID: <20160804233732.GA16044@dastard> X-ASG-Orig-Subj: Re: Programmatically query default XFS Quota ? References: <839565DD1303AC4993B245FFDB34AF78510C9C8F@tur-exch-node1.massey.ac.nz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <839565DD1303AC4993B245FFDB34AF78510C9C8F@tur-exch-node1.massey.ac.nz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470353892 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 596 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 04, 2016 at 10:48:32PM +0000, Rynhart, Patrick wrote: > Hi, > > I can set a default quota on a file system as follows: > > xfs_quota -x -c 'limit bsoft=100m bhard=100m -d' /home > > But I'm not sure how to query this - can anyone advise ? Default quotas are recorded in the limits of ID 0. UID 0/GID 0 are not actually limited (though we do account their usage) so we store the default limits for everyone there. IIRC, you should be able to view the default user quota limits via the "quota -uv 0" command. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 4 18:44:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C7FA77CA0 for ; Thu, 4 Aug 2016 18:44:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36D55AC005 for ; Thu, 4 Aug 2016 16:44:19 -0700 (PDT) X-ASG-Debug-ID: 1470354255-0bf57c13673a5590001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vBqi4JE47NltcQzE for ; Thu, 04 Aug 2016 16:44:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnUPANnSo1d5LI7JIGdsb2JhbABcg0WBUoJ5g3mdLwEBAQEBAQaMYIYOhAyGFwQCAoFETQEBAQEBAQcBAQEBAQE4QIRfAQU6HCMQCAMOCgklDwUlAwcaExuIFb5GAQEBAQYCASQehUSFFYdsghIdBZk0jniBdYRbiHqMMYN3hGAqMogUAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2016 09:14:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVSJB-0003mj-DZ; Fri, 05 Aug 2016 09:44:13 +1000 Date: Fri, 5 Aug 2016 09:44:13 +1000 From: Dave Chinner To: Christoph Hellwig Cc: "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH 11/47] xfs: move deferred operations into a separate file Message-ID: <20160804234413.GB16044@dastard> X-ASG-Orig-Subj: Re: [PATCH 11/47] xfs: move deferred operations into a separate file References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <146907703710.25461.16650495404061662831.stgit@birch.djwong.org> <20160801080223.GB30547@infradead.org> <20160802223950.GN16044@dastard> <20160803091627.GA5289@infradead.org> <20160803225756.GW16044@dastard> <20160804160007.GA7649@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804160007.GA7649@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470354255 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1212 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 04, 2016 at 09:00:07AM -0700, Christoph Hellwig wrote: > On Thu, Aug 04, 2016 at 08:57:56AM +1000, Dave Chinner wrote: > > So, please explain in more detail what the problem is and what the > > proposed solution is so I (and probably Darrick, too) have some > > understanding of the issue you see with this code. > > We were doing 1 (actually 2 with the busy extent tracking) allocations > for each free extent, and now we're up to three. We need to get this > down to 1 and not increase it for no benefit. Oh, it's memory allocations in the extent freeing path you're worried about? That's a minor concern at this point, really. We do some many other allocations in these paths (e.g. multiple allocations for every metadata buffer that is not in cache) that another is not going to make any difference to the system stability or performance. Yes, it would be good to reduce the number of allocations, but it's not critical to the correct functioning of the code. hence it doesn't need to be solved right now, and We can work on optimising this over the next few months as we clean up all the rough edges we find. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 4 18:50:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7A57C7CA0 for ; Thu, 4 Aug 2016 18:50:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2E6448F8035 for ; Thu, 4 Aug 2016 16:50:20 -0700 (PDT) X-ASG-Debug-ID: 1470354617-0bf8157e6a496cb0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id fV3AftfkqIswwHdp for ; Thu, 04 Aug 2016 16:50:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhkPAALUo1d5LI7JIGdsb2JhbABcg0VWfIJ5oSgBAQEBAQEGjGCGDoQMJIUvRAQCAoFETQEBAQEBAQcBAQEBAQE4QIRfAQU6HCMQCAMYCSUPBSUDBxoTiDAPvjYBAQEBBgIBHwUehUSEEoEDh2yCLwWZNIYagnyFYoF1jC6BJ4ZkhU2Dd4JjAxyBXioyiBQBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2016 09:20:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVSP1-0003nI-R1; Fri, 05 Aug 2016 09:50:15 +1000 Date: Fri, 5 Aug 2016 09:50:15 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: Mark Fasheh , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160804235015.GC16044@dastard> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804154845.GV8590@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470354617 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3936 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 04, 2016 at 08:48:45AM -0700, Darrick J. Wong wrote: > On Wed, Aug 03, 2016 at 07:18:52PM -0700, Mark Fasheh wrote: > > On Wed, Aug 03, 2016 at 05:58:43PM -0700, Darrick J. Wong wrote: > > > On Wed, Aug 03, 2016 at 01:55:20PM -0700, Darrick J. Wong wrote: > > > > On Wed, Aug 03, 2016 at 12:45:36PM -0700, Mark Fasheh wrote: > > > > > Where can I the patches to enable dedupe_range on xfs? I tested your > > > > > previous devel branch based on Linux v4.7-rc3 with duperemove > > > > > (https://github.com/markfasheh/duperemove) and it worked extremely well - > > > > > even handling some cases that btrfs still has issues with. I actually > > > > > committed the code to enable xfs support in duperemove so anyone can test on > > > > > xfs with the dedupe_range patches. > > > > > > > > > > I'd gladly test your latest patches by doing my usual 'large' duperemove > > > > > tests once I can get ahold of the dedupe_range work :) > > > > > > > > Your best bets are probably the -experimental trees: > > > > https://github.com/djwong/linux/commits/djwong-experimental > > > > https://github.com/djwong/xfsprogs/commits/djwong-experimental > > > > > > > > I haven't updated them in a while because I've been busy trying > > > > to get reverse-mapping (the start of those patchbombs) into 4.8. > > > > > > > > Just as a warning, don't put anything critical on those XFS filesystems > > > > because there's going to be a disk format update between now and the > > > > next time I post the patches because Dave and I decided to cache the > > > > block counts for the new btrees in order to speed up mounting. I don't > > > > anticipate having time to clean up my dev tree and push to github until > > > > a week or two after the merge window closes. > > > > > > That said, all the craziness from the last two weeks (xfs_scrub sprint > > > and the rmapbt review fixes) are now in the -wtf tree, which /should/ > > > behave. I've dumped everything there in completely not cleaned up > > > format, but this does have the AGF btree block counter stuff I talked > > > about above. > > > > > > https://github.com/djwong/linux/commits/djwong-wtf > > > https://github.com/djwong/xfsprogs/commits/djwong-wtf > > > > Fantastic. Don't worry about corrupting data, I've been doing this long > > enough to know to use this only on scratch partitions for now :) I'm in the > > middle of a couple other tests but once I'm done there I'll grab those > > branches and give them another spin. Typically I'm running through 800G-1TB > > on these (with varying duplicated data percentages). > > > > Silly question which I could just answer by looking at the patches - are you > > reporting FIEMAP_EXTENT_SHARED yet for extents with more than one owner? We > > use that flag (by comparing SHARED bytes before and after dedupe) to give > > people an estimate of how much space was saved. I presume figuring the > > shared state of an extent would be as easy as querying the rmap btree, > > correct? > > Yes, it should report FIEMAP_EXTENT_SHARED. In the past it would > report exactly which parts of an extent were shared. If a file mapped > blocks 30-40 and block 35 was shared, it would report 30-34, 35 > (shared), and 36-40. However, btrfs only reports a single extent > "30-40 (shared)" so I stopped doing that. I'd much prefer that fiemap gives exact information about shared extents. FIEMAP is a diagnostic tool and as such we need it to accurately reflect the exact extent map of the inode being queried so we aren't mislead about the layout of the file during trouble shooting. Hence I think what btrfs does is sub-optimal and we shouldn't copy it. Let's do the right thing with XFS and if people complain it is different to btrfs then someone can go make btrfs report an accurate extent map, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 4 19:05:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 409707CA0 for ; Thu, 4 Aug 2016 19:05:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 11D658F8035 for ; Thu, 4 Aug 2016 17:05:02 -0700 (PDT) X-ASG-Debug-ID: 1470355500-0bf57c13693a7200001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id K6sg7pXsH4w6Z3BN for ; Thu, 04 Aug 2016 17:05:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhIQAEzXo1d5LI7JIGdsb2JhbABcg0WBUoJ5g3mdLwEBAQEBAQaMYINlgimEDIYXAgIBAQKBRE0BAQEBAQEHAQEBAQEBOECEXwEFJxMcIxAIAw4KCSUPBSUDBxoTiDC+QgEBAQEBBQEBAQEjHoVEhRWHbIIvBZk0jniPSkiLaYN3hGAqMogUAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2016 09:33:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVScE-0003pD-Ia; Fri, 05 Aug 2016 10:03:54 +1000 Date: Fri, 5 Aug 2016 10:03:54 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix bogus space reservation in xfs_iomap_write_allocate Message-ID: <20160805000354.GD16044@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix bogus space reservation in xfs_iomap_write_allocate References: <1470245586-14068-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470245586-14068-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470355500 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2863 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31761 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 03, 2016 at 07:33:06PM +0200, Christoph Hellwig wrote: > The space reservations was without an explaination back in commit > > "Add error reporting calls in error paths that return EFSCORRUPTED" > > back in 2003. There is no reason to reserve disk blocks in the > transaction when allocating blocks for delalloc space as we already > reserved the space when creating the delalloc extent. > > With this fix we stop running out of the reserved pool in generic/229, > which has happened for long time with small blocksize file systems, > and has increased in severity with the new buffered write path. > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/xfs_iomap.c | 14 ++++++++------ > 1 file changed, 8 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 2114d53..279353c 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -691,7 +691,6 @@ xfs_iomap_write_allocate( > xfs_trans_t *tp; > int nimaps; > int error = 0; > - int nres; > > /* > * Make sure that the dquots are there. > @@ -715,12 +714,15 @@ xfs_iomap_write_allocate( > * is in the delayed allocation extent on which we sit > * but before our buffer starts. > */ > - > nimaps = 0; > while (nimaps == 0) { > - nres = XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK); > - > - error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, nres, > + /* > + * We have already reserved space for the extent and any > + * indirect blocks when creating the delalloc extent, > + * there is no need to reserve space in this transaction > + * again. > + */ > + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, 0, > 0, XFS_TRANS_RESERVE, &tp); > if (error) > return error; > @@ -783,7 +785,7 @@ xfs_iomap_write_allocate( > */ > error = xfs_bmapi_write(tp, ip, map_start_fsb, > count_fsb, 0, &first_block, > - nres, imap, &nimaps, > + 0, imap, &nimaps, > &dfops); I don't think this part of the fix is correct. nres feeds into args->total which is then used during the AGFL fixup checks. If this is not set correctly, then we'll select AGs we have enough space in the AG to fix up the AGFL, but not enough space to allocate all the BMBT blocks we require. That then leads to ABBA deadlocks on AGF locks near ENOSPC - see commit dbd5c8c ("xfs: pass total block res. as total xfs_bmapi_write() parameter") for the full details. I've been testing a local version of this fix since you pointed out the problem that still passed nres into xfs_bmapi_write() and I haven't seen any problems, so I think it is correct to keep nres here. I'm going to drop this hunk from this patch for the moment in my tree. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Thu Aug 4 19:49:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 39D357CA0 for ; Thu, 4 Aug 2016 19:49:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96492AC003 for ; Thu, 4 Aug 2016 17:49:29 -0700 (PDT) X-ASG-Debug-ID: 1470358166-0bf57b369b40b860001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 57pnqGkQnENYJrHI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 04 Aug 2016 17:49:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u750nMuY026686 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 00:49:23 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u750nLoD002097 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 00:49:22 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u750nJWt029309; Fri, 5 Aug 2016 00:49:21 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 04 Aug 2016 17:49:19 -0700 Date: Thu, 4 Aug 2016 17:49:18 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: Mark Fasheh , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160805004918.GY8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> <20160804235015.GC16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804235015.GC16044@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470358167 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4282 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31763 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Fri, Aug 05, 2016 at 09:50:15AM +1000, Dave Chinner wrote: > On Thu, Aug 04, 2016 at 08:48:45AM -0700, Darrick J. Wong wrote: > > On Wed, Aug 03, 2016 at 07:18:52PM -0700, Mark Fasheh wrote: > > > On Wed, Aug 03, 2016 at 05:58:43PM -0700, Darrick J. Wong wrote: > > > > On Wed, Aug 03, 2016 at 01:55:20PM -0700, Darrick J. Wong wrote: > > > > > On Wed, Aug 03, 2016 at 12:45:36PM -0700, Mark Fasheh wrote: > > > > > > Where can I the patches to enable dedupe_range on xfs? I tested your > > > > > > previous devel branch based on Linux v4.7-rc3 with duperemove > > > > > > (https://github.com/markfasheh/duperemove) and it worked extremely well - > > > > > > even handling some cases that btrfs still has issues with. I actually > > > > > > committed the code to enable xfs support in duperemove so anyone can test on > > > > > > xfs with the dedupe_range patches. > > > > > > > > > > > > I'd gladly test your latest patches by doing my usual 'large' duperemove > > > > > > tests once I can get ahold of the dedupe_range work :) > > > > > > > > > > Your best bets are probably the -experimental trees: > > > > > https://github.com/djwong/linux/commits/djwong-experimental > > > > > https://github.com/djwong/xfsprogs/commits/djwong-experimental > > > > > > > > > > I haven't updated them in a while because I've been busy trying > > > > > to get reverse-mapping (the start of those patchbombs) into 4.8. > > > > > > > > > > Just as a warning, don't put anything critical on those XFS filesystems > > > > > because there's going to be a disk format update between now and the > > > > > next time I post the patches because Dave and I decided to cache the > > > > > block counts for the new btrees in order to speed up mounting. I don't > > > > > anticipate having time to clean up my dev tree and push to github until > > > > > a week or two after the merge window closes. > > > > > > > > That said, all the craziness from the last two weeks (xfs_scrub sprint > > > > and the rmapbt review fixes) are now in the -wtf tree, which /should/ > > > > behave. I've dumped everything there in completely not cleaned up > > > > format, but this does have the AGF btree block counter stuff I talked > > > > about above. > > > > > > > > https://github.com/djwong/linux/commits/djwong-wtf > > > > https://github.com/djwong/xfsprogs/commits/djwong-wtf > > > > > > Fantastic. Don't worry about corrupting data, I've been doing this long > > > enough to know to use this only on scratch partitions for now :) I'm in the > > > middle of a couple other tests but once I'm done there I'll grab those > > > branches and give them another spin. Typically I'm running through 800G-1TB > > > on these (with varying duplicated data percentages). > > > > > > Silly question which I could just answer by looking at the patches - are you > > > reporting FIEMAP_EXTENT_SHARED yet for extents with more than one owner? We > > > use that flag (by comparing SHARED bytes before and after dedupe) to give > > > people an estimate of how much space was saved. I presume figuring the > > > shared state of an extent would be as easy as querying the rmap btree, > > > correct? > > > > Yes, it should report FIEMAP_EXTENT_SHARED. In the past it would > > report exactly which parts of an extent were shared. If a file mapped > > blocks 30-40 and block 35 was shared, it would report 30-34, 35 > > (shared), and 36-40. However, btrfs only reports a single extent > > "30-40 (shared)" so I stopped doing that. > > I'd much prefer that fiemap gives exact information about shared > extents. FIEMAP is a diagnostic tool and as such we need it to > accurately reflect the exact extent map of the inode being queried > so we aren't mislead about the layout of the file during trouble > shooting. > > Hence I think what btrfs does is sub-optimal and we shouldn't copy > it. Let's do the right thing with XFS and if people complain it is > different to btrfs then someone can go make btrfs report an accurate > extent map, too. That's probably going to be right after I get a xfstest committed that checks for the XFS behavior and fails on btrfs. :) --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From info23@fabric.com Thu Aug 4 19:59:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, FROM_LOCAL_DIGITS,HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DDC847CA0 for ; Thu, 4 Aug 2016 19:59:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A08728F8037 for ; Thu, 4 Aug 2016 17:59:29 -0700 (PDT) X-ASG-Debug-ID: 1470358762-0bf57c13683ac2a0001-NocioJ Received: from fabric.com ([115.239.81.38]) by cuda.sgi.com with SMTP id dK24bHH6lkI64Ql7 for ; Thu, 04 Aug 2016 17:59:23 -0700 (PDT) X-Barracuda-Envelope-From: info23@fabric.com X-Barracuda-Effective-Source-IP: UNKNOWN[115.239.81.38] X-Barracuda-Apparent-Source-IP: 115.239.81.38 Sender: info23@fabric.com Received: from 2012-20160523UX[127.0.0.1] by 2012-20160523UX[127.0.0.1] (SMTPD32); Thu, 4 Aug 2016 18:56:12 +0800 From: "13758346203@163.com" <13758346203@163.com> Subject: =?UTF-8?B?UkXvvJpGYWJyaWNz?= To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?UTF-8?B?UkXvvJpGYWJyaWNz?= MIME-Version: 1.0 Reply-To: 13758346203@163.com Date: Thu, 4 Aug 2016 18:56:12 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[115.239.81.38] X-Barracuda-Start-Time: 1470358762 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10113 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.29 X-Barracuda-Spam-Status: No, SCORE=2.29 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, FROM_LOCAL_DIGITS, FROM_LOCAL_HEX, FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31763 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 FROM_LOCAL_DIGITS From: localpart has long digit sequence 0.00 FROM_LOCAL_HEX From: localpart has long hexadecimal sequence 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160805005929.691581940062@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOS4wMC44MTEyLjE2NDUwIj48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiBjbGFzcz1Nc29Ob3JtYWw+ PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBGT05U LVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1m b250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFt aWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dCI+SGkmbmJzcDtzaXImbmJzcDtvciZuYnNwO21hZGFtLDwvU1BBTj48U1BBTiANCnN0eWxlPSJG T05ULUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7 IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5 O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMg TmV3IFJvbWFuJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwv U1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgbXNvLXBhZ2luYXRpb246IHdp ZG93LW9ycGhhbiIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDl rovkvZM7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJv bWFuJiMzOTs7IG1zby1oYW5zaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwv UD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuIiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsg Rk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28t Zm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+VGhpcyZuYnNwO2lzJm5ic3A7QWxpZWVuJm5ic3A7ZnJv bSZuYnNwO0hhaW5pbmcmbmJzcDtIZW5nZGlhbiZuYnNwO1RleHRpbGUmbmJzcDtDby4sJm5ic3A7 THRkLiZuYnNwO1dlJm5ic3A7c3BlY2lhbGl6ZWQmbmJzcDtpbiZuYnNwO3Byb2R1Y2luZyZuYnNw O2ZhYnJpY3MmbmJzcDtmb3ImbmJzcDtzcG9ydHN3ZWFyLCZuYnNwO2xpbmdlcmllLCZuYnNwO3Vu ZGVyd2VhciwmbmJzcDtzd2ltc3VpdCwmbmJzcDtob21lJm5ic3A7dGV4dGlsZSZuYnNwO2FuZCZu YnNwO2Zhc2hpb25hYmxlJm5ic3A7ZHJlc3MuPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMg TmV3IFJvbWFuJiMzOTs7IG1zby1oYW5zaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9t YW4mIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwv UD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuIiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsg Rk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28t Zm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD4mbmJzcDs8L286cD48L1NQQU4+PC9QPg0KPFAg c3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIGNs YXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcg Um9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TIj5J ZiZuYnNwO3lvdSZuYnNwO2xpa2UmbmJzcDt0byZuYnNwO2tub3cmbmJzcDttb3JlJm5ic3A7YWJv dXQmbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1T SVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28tZm9udC1r ZXJuaW5nOiAwLjAwMDBwdCI+dXM8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYj Mzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5v cm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWJpZGktZm9udC1mYW1p bHk6IOWui+S9kyI+LCZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L 5L2TOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21h biYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij5wbGVhc2UmbmJzcDtkbyZuYnNwO25vdCZuYnNw O2hlc2l0YXRlJm5ic3A7dG8mbmJzcDtjb250YWN0Jm5ic3A7dXMsJm5ic3A7SSZuYnNwO3dpbGwm bmJzcDtzZW5kJm5ic3A7eW91Jm5ic3A7dGhlJm5ic3A7cGljdHVyZXMmbmJzcDtvZiZuYnNwO291 ciZuYnNwO3Byb2R1Y2luZyZuYnNwO2RlcGFydG1lbnQsJm5ic3A7ZHlpbmcmbmJzcDttYWNoaW5l LCZuYnNwO3NhbXBsZSZuYnNwO3Jvb20mbmJzcDthbmQmbmJzcDtvdXImbmJzcDtvZmZpY2UmbmJz cDtpZiZuYnNwO3lvdSZuYnNwO2xpa2UuPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZ OiDlrovkvZM7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTs7IG1zby1oYW5zaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4m IzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4N CjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFu IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9O VC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5Ozsg bXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD4mbmJzcDs8L286cD48L1NQQU4+PC9QPg0KPFAgc3R5 bGU9IlRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIGNsYXNz PU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6 IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5Ozsg bXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28taGFu c2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1mb250LWtlcm5p bmc6IDAuMDAwMHB0Ij5CZXN0Jm5ic3A7cmVnYXJkcyw8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtU aW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5l dyBSb21hbiYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD48L286cD48L1NQ QU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRv dy1vcnBoYW4iIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L 5L2TOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21h biYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij5BbGllZW48L1NQQU4+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFs OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMz OTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVz IE5ldyBSb21hbiYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD48L286cD48 L1NQQU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3 aWRvdy1vcnBoYW4iIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog 5a6L5L2TOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBS b21hbiYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMz OTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48 L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbiIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovkvZM7 IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5 O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMz OTs7IG1zby1oYW5zaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNv LWZvbnQta2VybmluZzogMC4wMDAwcHQiPkhhaW5pbmcmbmJzcDtIZW5nZGlhbiZuYnNwO1RleHRp bGUmbmJzcDtDby4sJm5ic3A7THRkPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDl rovkvZM7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJv bWFuJiMzOTs7IG1zby1oYW5zaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQ IHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiBj bGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1T SVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28tZm9udC1r ZXJuaW5nOiAwLjAwMDBwdCI+PG86cD4mbmJzcDs8L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9 IlRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIGNsYXNzPU1z b05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEy cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28taGFuc2kt Zm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0Ij5UaGUmbmJzcDtXZXN0Jm5ic3A7QnVpbGRpbmcmbmJzcDtOby4xMTgsJm5ic3A7 Q2hhbmdoZSZuYnNwO1JkLCZuYnNwOyZuYnNwO0NoYW5nPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IEZP TlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQt a2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiPuKAmTwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVz IE5ldyBSb21hbiYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJv bWFuJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij5hbiZuYnNwO1Rvd24sJm5ic3A7 SGFpbmluZyZuYnNwO0NpdHksJm5ic3A7WmhlamlhbmcsJm5ic3A7UHJvdmluY2UsJm5ic3A7Q2hp bmE8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAx MnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNp LWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAwLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046 IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIGNsYXNzPU1zb05vcm1hbD48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJ R0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQt ZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBtc28taGFuc2ktZm9udC1mYW1pbHk6 ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48 bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsg bXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtRkFNSUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5v cm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6 ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1oYW5zaS1mb250LWZhbWlseTogJiMzOTtU aW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPlRlbDowMDg2 Jm5ic3A7NTczJm5ic3A7ODc0NzM3OTc8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcg Um9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYj Mzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9QPg0K PFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4i IGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBGT05U LVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBt c28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0Ij5GYXg6MDA4NiZuYnNwOzU3Mzg3NDczNzg5PC9TUEFOPjxTUEFO IA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlH SFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1m YW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1oYW5zaS1mb250LWZhbWlseTog JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxv OnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBtc28tcGFn aW5hdGlvbjogd2lkb3ctb3JwaGFuIiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZhbWlseTogJiMzOTtU aW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5l dyBSb21hbiYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+TW9iaWxlOjAwODYmbmJz cDsxMzc1ODM0NjIwMzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBG T05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7 OyBtc28taGFuc2ktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1m b250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+PCEtLUVuZEZyYWdt ZW50LS0+PC9CT0RZPjwvSFRNTD4NCg0K From darrick.wong@oracle.com Thu Aug 4 21:06:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4C88A7CA0 for ; Thu, 4 Aug 2016 21:06:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B84A0AC004 for ; Thu, 4 Aug 2016 19:06:28 -0700 (PDT) X-ASG-Debug-ID: 1470362785-0bf57b369b411420001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 9LFbUwGGyeiIFriB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 04 Aug 2016 19:06:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7523tW1017508 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 02:03:56 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7523tOo022042 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 02:03:55 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7523r6C023007; Fri, 5 Aug 2016 02:03:54 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 04 Aug 2016 19:03:52 -0700 Date: Thu, 4 Aug 2016 19:03:51 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: [PATCH v3] xfs: test attr_list_by_handle cursor iteration Message-ID: <20160805020351.GF25565@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v3] xfs: test attr_list_by_handle cursor iteration References: <20160802235251.GB8586@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160802235251.GB8586@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470362785 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7674 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Apparently the XFS attr_list_by_handle ioctl has never actually copied the cursor contents back to user space, which means that iteration has never worked. Add a test case for this and see "xfs: in _attrlist_by_handle, copy the cursor back to userspace". v2: Use BULKSTAT_SINGLE for less confusion, fix build errors on RHEL6. v3: Use path_to_handle instead of bulkstat. Signed-off-by: Darrick J. Wong --- .gitignore | 1 src/Makefile | 3 + src/attr-list-by-handle-cursor-test.c | 118 +++++++++++++++++++++++++++++++++ tests/xfs/700 | 64 ++++++++++++++++++ tests/xfs/700.out | 5 + tests/xfs/group | 1 6 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 src/attr-list-by-handle-cursor-test.c create mode 100755 tests/xfs/700 create mode 100644 tests/xfs/700.out diff --git a/.gitignore b/.gitignore index 28bd180..e184a6f 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ /src/alloc /src/append_reader /src/append_writer +/src/attr-list-by-handle-cursor-test /src/bstat /src/bulkstat_unlink_test /src/bulkstat_unlink_test_modified diff --git a/src/Makefile b/src/Makefile index 1bf318b..ae06d50 100644 --- a/src/Makefile +++ b/src/Makefile @@ -20,7 +20,8 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize preallo_rw_pattern_reader \ bulkstat_unlink_test_modified t_dir_offset t_futimens t_immutable \ stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \ seek_copy_test t_readdir_1 t_readdir_2 fsync-tester nsexec cloner \ - renameat2 t_getcwd e4compact test-nextquota punch-alternating + renameat2 t_getcwd e4compact test-nextquota punch-alternating \ + attr-list-by-handle-cursor-test SUBDIRS = diff --git a/src/attr-list-by-handle-cursor-test.c b/src/attr-list-by-handle-cursor-test.c new file mode 100644 index 0000000..4269d1e --- /dev/null +++ b/src/attr-list-by-handle-cursor-test.c @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ATTRBUFSZ 1024 +#define BSTATBUF_NR 32 + +/* Read all the extended attributes of a file handle. */ +void +read_handle_xattrs( + struct xfs_handle *handle) +{ + struct attrlist_cursor cur; + char attrbuf[ATTRBUFSZ]; + char *firstname = NULL; + struct attrlist *attrlist = (struct attrlist *)attrbuf; + struct attrlist_ent *ent; + int i; + int flags = 0; + int error; + + memset(&cur, 0, sizeof(cur)); + while ((error = attr_list_by_handle(handle, sizeof(*handle), + attrbuf, ATTRBUFSZ, flags, + &cur)) == 0) { + for (i = 0; i < attrlist->al_count; i++) { + ent = ATTR_ENTRY(attrlist, i); + + if (i != 0) + continue; + + if (firstname == NULL) { + firstname = malloc(ent->a_valuelen); + memcpy(firstname, ent->a_name, ent->a_valuelen); + } else { + if (memcmp(firstname, ent->a_name, + ent->a_valuelen) == 0) + fprintf(stderr, + "Saw duplicate xattr \"%s\", buggy XFS?\n", + ent->a_name); + else + fprintf(stderr, + "Test passes.\n"); + goto out; + } + } + + if (!attrlist->al_more) + break; + } + +out: + if (firstname) + free(firstname); + if (error) + perror("attr_list_by_handle"); + return; +} + +int main( + int argc, + char *argv[]) +{ + struct xfs_handle *fshandle; + size_t fshandle_len; + struct xfs_handle *handle; + size_t handle_len; + int error; + + if (argc != 2) { + fprintf(stderr, "Usage: %s filename\n", argv[0]); + return 1; + } + + error = path_to_fshandle(argv[1], (void **)&fshandle, &fshandle_len); + if (error) { + perror("getting fshandle"); + return 2; + } + + error = path_to_handle(argv[1], (void **)&handle, &handle_len); + if (error) { + perror("getting handle"); + return 3; + } + + read_handle_xattrs(handle); + + free_handle(handle, handle_len); + free_handle(fshandle, fshandle_len); + return 0; +} diff --git a/tests/xfs/700 b/tests/xfs/700 new file mode 100755 index 0000000..4a5680d --- /dev/null +++ b/tests/xfs/700 @@ -0,0 +1,64 @@ +#! /bin/bash +# FS QA Test No. 700 +# +# Check that attr_list_by_handle copies the cursor back to userspace. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/testout +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/populate + +# real QA test starts here +_supported_os Linux +_require_scratch +_require_test_program "attr-list-by-handle-cursor-test" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Stuff file with xattrs" +mkdir $SCRATCH_MNT/foo +__populate_create_attr $SCRATCH_MNT/foo 100 + +echo "Run test program" +./src/attr-list-by-handle-cursor-test $SCRATCH_MNT/foo + +# success, all done +status=0 +exit diff --git a/tests/xfs/700.out b/tests/xfs/700.out new file mode 100644 index 0000000..493a68a --- /dev/null +++ b/tests/xfs/700.out @@ -0,0 +1,5 @@ +QA output created by 700 +Format and mount +Stuff file with xattrs +Run test program +Test passes. diff --git a/tests/xfs/group b/tests/xfs/group index ff0efa5..b42153d 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -307,3 +307,4 @@ 325 auto quick clone 326 auto quick clone 327 auto quick clone +700 auto quick ioctl From skills@alg.com.sg Thu Aug 4 21:34:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, MSGID_FROM_MTA_HEADER autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C6BB57CA0 for ; Thu, 4 Aug 2016 21:34:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0EA97AC004 for ; Thu, 4 Aug 2016 19:34:24 -0700 (PDT) X-ASG-Debug-ID: 1470364454-0bf57c13683b36b0001-NocioJ Received: from imss2.starhub.net.sg (imss2.starhub.net.sg [203.116.255.5]) by cuda.sgi.com with ESMTP id DEr22YAc5THXHHqH for ; Thu, 04 Aug 2016 19:34:16 -0700 (PDT) X-Barracuda-Envelope-From: skills@alg.com.sg X-Barracuda-Effective-Source-IP: imss2.starhub.net.sg[203.116.255.5] X-Barracuda-Apparent-Source-IP: 203.116.255.5 Received: from kbsmtao151.starhub.net.sg (smtp.starhub.net.sg [203.116.2.144]) by imss2.starhub.net.sg (Postfix) with ESMTP id 83D9D5718B3 for ; Fri, 5 Aug 2016 08:53:03 +0800 (SGT) Message-Id: Received: from unknown (HELO AVENTIS-HP) ([117.20.153.41]) by kbsmtao151.starhub.net.sg with ESMTP; 05 Aug 2016 10:33:29 +0800 Reply-To: "No Reply" From: "Can't Stand a Co-worker?" To: Subject: How to Work with Different Office Personality Types Effectively Date: Fri, 5 Aug 2016 10:34:08 +0800 X-ASG-Orig-Subj: How to Work with Different Office Personality Types Effectively Importance: Normal X-Priority: 3 (Normal) MIME-Version: 1.0 X-Mailer: Mach 5 Mailer version 4 RI{51d25-4a54a} Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: imss2.starhub.net.sg[203.116.255.5] X-Barracuda-Start-Time: 1470364455 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 29165 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.70 X-Barracuda-Spam-Status: No, SCORE=1.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, HTML_MESSAGE, MIME_HTML_ONLY, MSGID_FROM_MTA_HEADER, MSGID_FROM_MTA_HEADER_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MSGID_FROM_MTA_HEADER Message-Id was added by a relay 1.50 MSGID_FROM_MTA_HEADER_2 Message-Id was added by a relay 0.20 BSF_SC0_SA038b Custom Rule SA038b
   
23 Au= g 2016=20 (Tue)
Having trouble viewing?
Click Here
 
 
Emotional Intelligence - Di= fferent=20 Strokes For Different Folks
Keys to High Performance=20 in the Workplace
 
 Key Takeaways -= Learn=20 Tangible skills to Connect, Engage and influence as a man= ager=20 and leader.

This workshop delivers a step-by-step program for=20 increasing your EQ through

Relationship Building=20

  • Using EQ to interact positively with your colleague= s and=20 subordinates; and clients.=20
  • Identifying, discerning and escalating people=E2=80= =99s needs.=20
  • Maintaining ongoing relationships.=20
  • Reading people by identifying one=E2=80=99s percept= ion, values=20 and belief system.

Discovering People Communication=20 Tendencies

  • Personality development=E2=80=94nature or nurture?= =20
  • Understanding the 4 communication styles.=20
  • How to use the four personality type psychometric t= ool=20 (DISC) to communicate to different groups of people.=20
  • How to leverage on one=E2=80=99s strengths and work= on his/her=20 weaknesses.=20
  • Understanding the differences between behaviour and= =20 intentions-Customising communication style to different= =20 profile types.

Using the DISC to promote team cohesiveness= and=20 buddy systems.

  • Improve participants=E2=80=99 performance levels.=20
  • Reduce stress levels among colleagues.=20
  • Confidently handle and lessen grievances and compla= ints=20 in a systematic and calm fashion.=20
  • Master the art of objection handling and work towar= ds a=20 resolution.
 Who Should=20 Attend?
This course is designed for every wo= rking=20 professional who yearns to understand where their interna= l and=20 external customers are coming from.
 Testimonial -=20 Practical Guide to Help you and your team to reach Peak=20 Performance Level

The topic is thought-provoking, and th= e=20 trainer is very persuasive and knowledgeable on the subje= ct=20 mater - Assab Pacific

Highly entertaining and engaging speak= er.=20 Love the way she shares her experience & applied on t= he=20 course objectives. - Centre for Management=20 Technology

Extremely informative and interesting.= =20 Everything is well organized. Trainer is excellent and=20 enlightening. Thank you. - Building and Construct= ion=20 Authority, BCA Singapore

 Communication G= uru =E2=80=93=20 Ms Caroline Dawson Don't wait : Se= ats are=20 limited - Register Today!  Please=20 contact Grace @ 6720 3333 | grace@aventisg= lobal.edu.sg=20 for more information.  Over=20 100 Upcoming Courses

Engage, motivate and= =20 inspire your team today! Check out our latest course list= ing=20 or contact us @ 6720 3333 for A FREE Quotation for Custom= ized=20 In-house training
 Save=20 40% or up to 400% Tax Rebate via Productivity and Innovat= ion=20 Credit (PIC)
For more information, contact u= s or=20 visit=20 http://www.iras.gov.sg/irashome/picredit.aspx
 
Registration<= /TD>  
  Date   23 Aug 2016 (Tue)<= /TD>         Venue   100 Orchard=20 Road,
Concorde Hotel Singapore
         Time   9.00am to 5.00pm         Fees  

$588 | $352.80 (after 40% PIC)
Inclus= ive=20 of 2 coffee breaks, light refreshments and= =20 buffet lunch

<= /TD>
 
Register=20 Now
Contact Grace at (65) 6720 3333 or ema= il:=20 grace@av= entisglobal.edu.sgUnsubscri= be

To=20 unsubscribe, please click here
 
Download Registration= =20 Form
 
 
 
 
3D""=20
 
Emotional= =20 Intelligence- Another kind of Smart

Emotio= nal=20 intelligence is crucial in workplace peformance. Pe= ople=20 with high levels of emotional intelligence are able= to=20 foster stronger relationships, have greater career= =20 success and more effective leadership skills. The b= irth=20 of the term =E2=80=98Emotional Intelligence=E2=80= =99 served as a missing=20 link in the shocking finding that people with avera= ge IQ=20 perform better than those with higher IQs 70% of th= e=20 time. In this workshop, you will learn how to raise= your=20 emotional intelligence and communicate effectively = with=20 everyone and anyone.

 
Different= =20 Strokes for Different Folks

We are in the business of buildi= ng=20 relationships! People are not necessarily difficult= to=20 deal with. They only seem difficult because we lack= the=20 skills of an appropriate communication style. It is= =20 imperative that we are equipped with the essential= =20 skills to handle different groups of people.

You will learn the appropriate=20 communication styles that will help avoid ineffecti= ve=20 communication and improve work relationships. Do no= t let=20 negative experiences affect your willingness to try= and=20 get along with anyone! Discover how you can use the= DISC=20 as a tool to come out tops with not just textbook=20 answers but tried and tested techniques as=20 well!


Ms Caroline has more than = 16=20 years of invaluable experience in soft-skills=20 communication. During her numerous corporate exposu= re=20 with local and foreign participants, Caroline has=20 provided counselling and coaching services to many= =20 multicultural individuals and teams while also ment= oring=20 fellow educators in developing their professional s= kills=20

Caroline=E2=80=99s wide ranging = expertise in=20 the field of communication and management is just o= ne=20 half of the equation as her focus lies in the other= =20 where corporate education must always serve the bus= iness=20 need and that any development intervention is an=20 investment that must deliver a return. By closely=20 observing and identifying individuals with special= =20 learning needs, she has maintained that experientia= l,=20 innovative teaching methods and highly interactive= =20 curriculum are key motivational factors that enhanc= e=20 one=E2=80=99s communication and personal developmen= t=20 skills.

Date 23 Aug 2016 (Tue)Venue 100 Orchard Road, Concorde Hotel=20 SingaporeTime 9am to 5pmFee $588=20 | $352.80 (after 40% PIC
Inclusive of 2 coffee=20 breaks, light refreshments and buffet lunch<= /TD>
Enquiries

Grace @ 6720 3333

grace@av= entisglobal.edu.sg

 
From exchange@al-ansari.ae Thu Aug 4 22:33:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=DEAR_SOMETHING, FILL_THIS_FORM_FRAUD_PHISH,HTML_MESSAGE,T_FILL_THIS_FORM_SHORT,T_HTML_ATTACH autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6D3FA7CA0 for ; Thu, 4 Aug 2016 22:33:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 87B67304039 for ; Thu, 4 Aug 2016 20:33:02 -0700 (PDT) X-ASG-Debug-ID: 1470367972-0bf8157e6b4aa130001-NocioJ Received: from tuna.ip-asia.com (tuna25.ip-asia.com [124.217.255.75]) by cuda.sgi.com with ESMTP id nsU9SJZeICMLQqZ7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 04 Aug 2016 20:32:54 -0700 (PDT) X-Barracuda-Envelope-From: exchange@al-ansari.ae X-Barracuda-Effective-Source-IP: tuna25.ip-asia.com[124.217.255.75] X-Barracuda-Apparent-Source-IP: 124.217.255.75 Received: from [::1] (port=46612 helo=tuna.ip-asia.com) by tuna.ip-asia.com with esmtpa (Exim 4.87) (envelope-from ) id 1bVVmm-004ESj-4d; Fri, 05 Aug 2016 11:27:00 +0800 Received: from 105.112.40.190 ([105.112.40.190]) (SquirrelMail authenticated user amanda.wan@v-kool.com.my) by tuna.ip-asia.com with HTTP; Fri, 5 Aug 2016 11:27:00 +0800 Message-ID: Date: Fri, 5 Aug 2016 11:27:00 +0800 Subject: Balance Payment From: "Al Ansari Exchange LLC" X-ASG-Orig-Subj: Balance Payment To: exchange@alansari.ae User-Agent: SquirrelMail/1.5.2 [SVN] MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20160805112700_67842" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - tuna.ip-asia.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - al-ansari.ae X-Get-Message-Sender-Via: tuna.ip-asia.com: authenticated_id: amanda.wan@v-kool.com.my X-Authenticated-Sender: tuna.ip-asia.com: amanda.wan@v-kool.com.my X-Barracuda-Connect: tuna25.ip-asia.com[124.217.255.75] X-Barracuda-Start-Time: 1470367973 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 469 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA074, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 HTML_MESSAGE BODY: HTML included in message ------=_20160805112700_67842 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Dear Sir, The balance payment has been wired into your company account as instructed by your customer and attached to this email is the TT copy for your confirmations.Kindly log in with your full email address and password which you use in communicating with your customer so that you can view attached document. Also notify your customer immediately the payment is received. Regards Mr Khalid Bin Al Ansari Exchange LLC. Dubai, United Arab Emirates ------=_20160805112700_67842 Content-Type: text/html; name="TT Copy.htm" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="TT Copy.htm" PCFkb2N0eXBlIGh0bWw+DQogICAgPCEtLVtpZiBJRSA4XT4gPGh0bWwgZGF0YS1wbGFjZWhvbGRl ci1mb2N1cz0iZmFsc2UiIGNsYXNzPSJsdC1pZTkgaWU4IHVzIGVuIGhhcy1kb2ItZXhwbGFuYXRp b24iIGRhdGEtcGFnZW5hbWU9ImxvZ2luIj4gDQo8IVtlbmRpZl0tLT4NCiAgICA8IS0tW2lmIElF IDldPiA8aHRtbCBkYXRhLXBsYWNlaG9sZGVyLWZvY3VzPSJmYWxzZSIgY2xhc3M9ImllOSB1cyBl biBoYXMtZG9iLWV4cGxhbmF0aW9uIiBkYXRhLXBhZ2VuYW1lPSJsb2dpbiI+IA0KPCFbZW5kaWZd LS0+DQogICAgPCEtLVtpZiBndCBJRSA5XT48IS0tPg0KICAgIDxodG1sIGRhdGEtcGxhY2Vob2xk ZXItZm9jdXM9ImZhbHNlIiBjbGFzcz0idXMgZW4gaGFzLWRvYi1leHBsYW5hdGlvbiIgZGF0YS1w YWdlbmFtZT0ibG9naW4iPiA8IS0tPCFbZW5kaWZdLS0+DQogICAgPGhlYWQ+DQogICAgICAgIDxt ZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSIvPg0KICAg ICAgICA8bWV0YSBuYW1lPSJtc3dlYmRpYWxvZy1uZXd3aW5kb3d1cmwiIGNvbnRlbnQ9IioiLz4N CiAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0 bWw7IGNoYXJzZXQ9VVRGLTgiPg0KDQogICAgICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250 ZW50PSJpbml0aWFsLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubywgbWluaW11bS1zY2FsZT0x LjAsIG1heGltdW0tc2NhbGU9MS4wIi8+DQogICAgICAgICAgICA8dGl0bGU+U2lnbiBpbiAtIEFk b2JlIEZpbGU8L3RpdGxlPg0KDQogICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9 InNjcmVlbiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCwNCmJvZHksDQpkaXYs DQpzcGFuLA0KYXBwbGV0LA0Kb2JqZWN0LA0KaWZyYW1lLA0KaDEsDQpoMiwNCmgzLA0KaDQsDQpo NSwNCmg2LA0KcCwNCmJsb2NrcXVvdGUsDQpwcmUsDQphLA0KYWJiciwNCmFjcm9ueW0sDQphZGRy ZXNzLA0KYmlnLA0KY2l0ZSwNCmNvZGUsDQpkZWwsDQpkZm4sDQplbSwNCmltZywNCmlucywNCmti ZCwNCnEsDQpzLA0Kc2FtcCwNCnNtYWxsLA0Kc3RyaWtlLA0Kc3Ryb25nLA0Kc3ViLA0Kc3VwLA0K dHQsDQp2YXIsDQpiLA0KdSwNCmksDQpjZW50ZXIsDQpkbCwNCmR0LA0KZGQsDQpvbCwNCnVsLA0K bGksDQpmaWVsZHNldCwNCmZvcm0sDQpsYWJlbCwNCmxlZ2VuZCwNCnRhYmxlLA0KY2FwdGlvbiwN CnRib2R5LA0KdGZvb3QsDQp0aGVhZCwNCnRyLA0KdGgsDQp0ZCwNCmFydGljbGUsDQphc2lkZSwN CmNhbnZhcywNCmRldGFpbHMsDQplbWJlZCwNCmZpZ3VyZSwNCmZpZ2NhcHRpb24sDQpmb290ZXIs DQpoZWFkZXIsDQpoZ3JvdXAsDQptZW51LA0KbmF2LA0Kb3V0cHV0LA0KcnVieSwNCnNlY3Rpb24s DQpzdW1tYXJ5LA0KdGltZSwNCm1hcmssDQphdWRpbywNCnZpZGVvLA0KaW5wdXQsDQpzZWxlY3R7 bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowcHggbm9uZTtmb250LXNpemU6MTAwJTt2ZXJ0aWNh bC1hbGlnbjpiYXNlbGluZTsgZm9udC1zdHlsZTpub3JtYWw7IGZvbnQtdmFyaWFudDpub3JtYWw7 IGZvbnQtd2VpZ2h0Om5vcm1hbH1hcnRpY2xlLA0KYXNpZGUsDQpkZXRhaWxzLA0KZmlnY2FwdGlv biwNCmZpZ3VyZSwNCmZvb3RlciwNCmhlYWRlciwNCmhncm91cCwNCm1lbnUsDQpuYXYsDQpzZWN0 aW9ue2Rpc3BsYXk6YmxvY2s7fWJvZHl7bGluZS1oZWlnaHQ6MTt9b2wsDQp1bHtsaXN0LXN0eWxl Om5vbmU7fWJsb2NrcXVvdGUsDQpxe3F1b3Rlczpub25lO31ibG9ja3F1b3RlOmJlZm9yZSwNCmJs b2NrcXVvdGU6YWZ0ZXIsDQpxOmJlZm9yZSwNCnE6YWZ0ZXJ7Y29udGVudDonJztjb250ZW50Om5v bmU7fXRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowO30qLA0K KjphZnRlciwNCio6YmVmb3Jle21hcmdpbjowO3BhZGRpbmc6MDstd2Via2l0LWJveC1zaXppbmc6 Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1i b3g7fVtjbGFzcyo9J2dyaWRfJ117ZmxvYXQ6bGVmdDtwYWRkaW5nLXJpZ2h0OjAuNTU7fVtjbGFz cyo9J2dyaWRfJ106bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6MDtmbG9hdDpyaWdodDt9Lmdy aWRjb250YWluZXI6YWZ0ZXJ7Y29udGVudDoiIjtkaXNwbGF5OnRhYmxlO2NsZWFyOmJvdGg7fS5n cmlkXzF7d2lkdGg6MjUlO30uZ3JpZF8ye3dpZHRoOjUwJTt9LmdyaWRfM3t3aWR0aDo3NSUlO30u Z3JpZF80e3dpZHRoOjEwMCU7fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBw eCl7LmdyaWRfMSwNCiAuZ3JpZF8yLA0KIC5ncmlkXzN7d2lkdGg6MTAwJTtwYWRkaW5nLXJpZ2h0 OjA7cGFkZGluZy1ib3R0b206MC41NTt9LmdyaWRfMTpsYXN0LW9mLXR5cGUsDQogLmdyaWRfMjps YXN0LW9mLXR5cGUsDQogLmdyaWRfMzpsYXN0LW9mLXR5cGV7cGFkZGluZy1ib3R0b206MDt9fS5s e2Zsb2F0OmxlZnQ7fS5ye2Zsb2F0OnJpZ2h0O30uaGlkZGVue2Rpc3BsYXk6bm9uZTt9Lm5vd3Jh cHt3aGl0ZS1zcGFjZTpub3dyYXA7fWh0bWwgW2RhdGEtbW9iaWxlPSdzaG93J117ZGlzcGxheTpu b25lIWltcG9ydGFudDt9aHRtbCBbZGF0YS1tb2JpbGU9J2hpZGUnXXtkaXNwbGF5OmJsb2NrIWlt cG9ydGFudDt9aHRtbC5tb2JpbGUgW2RhdGEtbW9iaWxlPSdoaWRlJ117ZGlzcGxheTpub25lIWlt cG9ydGFudDt9aHRtbC5tb2JpbGUgW2RhdGEtbW9iaWxlPSdzaG93J117ZGlzcGxheTpibG9jayFp bXBvcnRhbnQ7fWh0bWwuaW9zey13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDAsIDAs IDAsIDApICFpbXBvcnRhbnQ7fWh0bWwuaW9zIGlucHV0W3R5cGU9J3RleHQnXSwNCmh0bWwuaW9z IGlucHV0W3R5cGU9J3Bhc3N3b3JkJ10sDQpodG1sLmlvcyBpbnB1dFt0eXBlPSdlbWFpbCddLA0K aHRtbC5pb3MgaW5wdXRbdHlwZT0nZGF0ZSddey13ZWJraXQtdHJhbnNpdGlvbi1kZWxheTowIWlt cG9ydGFudDt9aHRtbC5pb3MgaW5wdXRbdHlwZT0ndGV4dCddOmZvY3VzLA0KaHRtbC5pb3MgaW5w dXRbdHlwZT0ncGFzc3dvcmQnXTpmb2N1cywNCmh0bWwuaW9zIGlucHV0W3R5cGU9J2VtYWlsJ106 Zm9jdXMsDQpodG1sLmlvcyBpbnB1dFt0eXBlPSdkYXRlJ106Zm9jdXMsDQpodG1sLmlvcyBpbnB1 dFt0eXBlPSd0ZXh0J106Zm9jdXM6aG92ZXIsDQpodG1sLmlvcyBpbnB1dFt0eXBlPSdwYXNzd29y ZCddOmZvY3VzOmhvdmVyLA0KaHRtbC5pb3MgaW5wdXRbdHlwZT0nZW1haWwnXTpmb2N1czpob3Zl ciwNCmh0bWwuaW9zIGlucHV0W3R5cGU9J2RhdGUnXTpmb2N1czpob3ZlciwNCmh0bWwuaW9zIGlu cHV0W3R5cGU9J3RleHQnXTphY3RpdmUsDQpodG1sLmlvcyBpbnB1dFt0eXBlPSdwYXNzd29yZCdd OmFjdGl2ZSwNCmh0bWwuaW9zIGlucHV0W3R5cGU9J2VtYWlsJ106YWN0aXZlLA0KaHRtbC5pb3Mg aW5wdXRbdHlwZT0nZGF0ZSddOmFjdGl2ZXtib3JkZXI6MXB4IHNvbGlkICMwMDlkZjUgIWltcG9y dGFudDt9aHRtbC5pb3MgaW5wdXRbdHlwZT0ndGV4dCddOmhvdmVyLA0KaHRtbC5pb3MgaW5wdXRb dHlwZT0ncGFzc3dvcmQnXTpob3ZlciwNCmh0bWwuaW9zIGlucHV0W3R5cGU9J2VtYWlsJ106aG92 ZXIsDQpodG1sLmlvcyBpbnB1dFt0eXBlPSdkYXRlJ106aG92ZXJ7Ym9yZGVyOjFweCBzb2xpZCAj ZDVkNWQ1ICFpbXBvcnRhbnQ7fWh0bWwuaW9zIC5zZWxlY3QtYm94ey13ZWJraXQtdHJhbnNpdGlv bi1kZWxheTowIWltcG9ydGFudDt9aHRtbC5pb3MgLnNlbGVjdC1ib3guZm9jdXNlZCwNCmh0bWwu aW9zIC5zZWxlY3QtYm94Zm9jdXNlZDpob3ZlciwNCmh0bWwuaW9zIC5zZWxlY3QtYm94LmFjdGl2 ZSwNCmh0bWwuaW9zIC5zZWxlY3QtYm94LmFjdGl2ZTpob3Zlcntib3JkZXI6MXB4IHNvbGlkICM2 NjY2NjYgIWltcG9ydGFudDt9aHRtbC5pb3MgLnNlbGVjdC1ib3g6aG92ZXJ7Ym9yZGVyOjFweCBz b2xpZCAjZDVkNWQ1ICFpbXBvcnRhbnQ7fS5sb2dvLA0KLmZiLA0KLmdvb2dsZSwNCi5jYXBzbG9j ay1vbiAuY2Fwcy1pbmRpY2F0b3IsDQouc2VsZWN0LWJveCAudG9nZ2xlciBpLA0KLmljb24sDQou cm93Lm5ldHdvcmsgLmljb25zIGRpdiwNCi5wYXNzd29yZC1yZXZlYWxlcntiYWNrZ3JvdW5kLWlt YWdlOnVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFT d0FBQUdRQ0FNQUFBQWpxNjFKQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZK bFlXUjVjY2xsUEFBQUEzTnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJo WTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZ emxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlI ZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5TMWpNREl4SURjNUxqRTFORGt4TVN3 Z01qQXhNeTh4TUM4eU9TMHhNVG8wTnpveE5pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFz Ym5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXpl VzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VH MXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4 aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2 YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWha RzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJE MGllRzF3TG1ScFpEcGtaVGN5TURjMk1TMDNaVFF6TFRRNVpHUXRZbVl4TXkxbFl6VXhNalE0WW1J Mk1UWWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZORE00TTBJd05UQkZPRGhH TVRGRk16aENOek5CTkVZME5qUkROVVl3UWpjaUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRj QzVwYVdRNk5ETTRNMEl3TkVaRk9EaEdNVEZGTXpoQ056TkJORVkwTmpSRE5VWXdRamNpSUhodGNE cERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESUNoTllXTnBiblJ2YzJn cElqNGdQSGh0Y0UxTk9rUmxjbWwyWldSR2NtOXRJSE4wVW1WbU9tbHVjM1JoYm1ObFNVUTlJbmh0 Y0M1cGFXUTZNRFV3TkRRM00yVXRaVEpqTmkwMFpEazFMV0U0TldFdFpEa3pPV1E1TVdZM09EazBJ aUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPbVJsTnpJd056WXhMVGRsTkRNdE5E bGtaQzFpWmpFekxXVmpOVEV5TkRoaVlqWXhOaUl2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0 Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkv UG9WQzUxQUFBQU1BVUV4VVJaN1JLNG1KaWZQLy80dExtZEhSMGRWNGROcWErY1F4TE43ZTNqNCtQ dVhsNWNQRHc4dFFUWlJVcE5tS2lKQ1FrUFgxOVllSGgrcTMvOVRVMUl5TWpHeHNiTnJ1cit2Ly81 bVptZlg2NnQ2dnJkalkyT3IxMGFQVE9QejgvSlBNRkxhMXRlZkx0Ty91N2sxTlRkdWorYUdob2VY enlPYXEvL2lvLzVYTkdmN1YvOHpNekZsWldUb0JObkZ4Y1VvSlNyb3FBTjZ0aEg1K2ZrTUlRL0x5 OHZqNCtPaWIvYzV5S01oRFBhV2xwWGc0ZzlpWFlNU00zTVpYQWFSa3VkYU5VdURnNE9PeGpWTUtV dWphMk5EcG10RnJhS25XUk9qSXg1YVZsV1ZsWmZibDVYVjFkV1VrYWJNQUFPaSt2ZmovLzYydHJm ajg4ZXJxNnVqbzZGSlNVb0dCZ1Z3WVhJVEVBT0xpNHQrbG9sSVhVa3dXVE5iVzFwclBJdjdOLzR6 SUJNSklBTnZiMi9HOC84cGtEc1Y3Mk96ejg5V0o1dm42K3JoNTA3a0JBTFBiV29uSEFQTFUxSXFL aXJtNXVlN2s0dnU3LzNsNWVmN0QvN2h6eXVYdTd1S3pzY2lFNUo2ZW5xd0FBSTdKQ1AvZy83Mjh2 UFRCLy9TMS82aW9xRU1EUWV2WHdKREtEajhDUExLeXNuSTBmYXRxd0N3QUpibmVhYisvdjhxUzRI UzhBT2JtNWhVQUNwNWNzSU9EZzg3T3p0MmlkaU1BR1BEdzhKNW1yOXVQOEdrcWNETUFMdXpuMSsv cjlPZjA5ZkxyMmxnaldmSDA5UHUwLzdodXhVVkZSY2ZIeDY1Mnlid0hBRm9YV3I0WEV1REV3MkJn WU1DRTFyN2djK2p2Ny83MC85T1Y4RXNFVExRZEFGb2JYdlhKLy96KytIQXlkV0FlWmVQbTV2VDMr UHYvLy96NStGSWFVOCtPODYvWlVlTGc0T0h4dnVmazVKZk5Ic0FrSU9UajQvYjcvT3oxOTc4L0FM c1BDc1BqZlZRVFYwY0NSRTRQVUxVUERYRXZldVRuNkZRU1VlLzMzazBLVFVnSlIwWUlSb0JCamRL QVBGQUpVTXZMeTVqT0h2Ly8vOHZMeXBqT0g4N096ZGpZMTdDdnI4ckt5cHlibS83Ky92Ny8vK0ho NGVucDZWOFlYcGZPSGxjWFY1bk9JTnljbWVXOW1jNWZXdnY3KysvNSt1UFEwTzNILzhsZkl1ZjYr dXI0OXR1Z1pmNysvZS9iemVqcjYwY0VSLzM5L2ZEMDlQang3K3ZyNjdjS0J1RGk0dW5vNTk2cGVa Zk5IZDZ4OERNek0vLy8vM253b2ZnQUFBRUFkRkpPVS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy93QlQ5d2NsQUFBakswbEVRVlI0MnV6ZEQzeFQ1 YjB3OExZRVNFNm9UVWtxeFVpYUpWUW9iVTYzOUVSSkZlUmxVNU9GMkdvcEZNY2ZnODVTc1VpWlNq SFFqbFJpTnFDc0hXUjNkOWQvb0d5N2JqaDFmYWRYb1J0T3VONUxBYUVuYlpxV1ZnU3BtL2VPelc2 NTd6dVhjNS9ubkpQazVQeEpvb0F0OUhua1E1S1RwTzM1OW5sK3orOTV6aStTRWVHMVNpcmVLdmxQ VXVPN1pmQTRuck53bnJROGg3Q1NZZlVuUEd0RFdFbXdGSWFFWncyS1M4RXFqdVJMUFpVZktiNzZz VnA1VDdjaUxHa3NPZTlwZVdxc1NNUjh4Ykh3aURaNmgyMTJqVyswc1hEQjgzbXBzSHpnTUhHbHNl elJsOXNqSlhhNmdlOXFiQmxkTE9FWm5FNkZaWTdna1pZdkVTdjZQcDhaZEM5aUZMRktSRjVRa2h5 TGlKUm9SZDkzcGJIQWx6ZEdTb2pSdzlLTHZFQ2ZIS3NsWWdXZTJHaGdVVVJKUkROcVdFYWR5QXVH bjB1S1pRZFFWZ21VSzQxRllRcUpYOU9YZ0ZVbytvckNaRmhZeEE3L012S1o4a0d6Y2hIcEk3NEVM QzA4MUpJd2tPaEQyclN4d0pjeGp4S1dRandBRUlva1dQbDBjT2VmUXV3ZFVTeWZrZTI3dnRqN2NQ YVFJZzZLMmRtMFFKc3VGaEZSakJJV2QveHplM2Q5RWl3am5UYTBjSC9CSUpJb05NVUVwVzJ4UjdG YXdCY0hBRnBOakM4ZnpDYldZaTBHNTdUb2U3V0tpQmxRRk9NUmhUWk5MTUhqTHcycmlyT0NYcXlL UCtpVXh0SXltUm4zRnd5c3pFUml6UExGemg1NCtEZzlrajNFdklvd1JvOVo0ZGhPRHlzZnpDK2pn ZFdRc0RmRC9Sa2FKTEhNN0xtYjQ2bVdPZDdMb2xqRytCa1dzNnljQUsrTk1GR2FFMzhFL1NVSlZ2 Nm9ZTWs0UnhjbnpJd3lTU3lGSXByRzQ3R0lieVI0V0FtRGxNMWd1Yk9obWZuTkdPTXptNCtmRWto aStVWUhpOXZ6bitmbFhQc2xzT0lNaXVpU2gvdXJackh3aUk5N2RqZ2Z5MGQvYnkzbkp5RDQ0MUFT cTJWMHNIeThCU0UzSzNkTFlPRVJQSjlwSmRGeGE0OW8rVmpHU01MOFplUmpFZlQzOG9Ib0htMit0 TEZHWnhndTF2RzNHcDZQSHhoWkxJcUZpU3lWRkJGQlVwbzR2VE5mSkNFcHBRL2xKeXhDMDhYU1JG cEdBYXRKa0N0d2Y5NG1VU3dycHpNWTJSNFZFY0d5SnlZYlFpd2pNNjhWeHhzeGxsT0g1MVRDTEZR ZFA2UlNpR0dWY0lhY2hvM0pZbGlSNUQyTFhnVWtUd0xHVmxKcUUxbmZjSE1KbXdoV3dtNURkTW5E WFZUSFloYVJOR2ExME00dHlSYkZZMnU1dzlsNjF4bWpnYU16ZmpBc2dxVko2QXNsekJUQnliaWlX TnhEWXJPaG5YNm41RVpQRWl4aVZCYlMzTi9QdWxpVXpVeElQd1ZZaW9RZFVpdnpSVm80RVlyRlNw amJ6SUk4eThmMlNXT1M4RE9tdG1qa1lrbFZ3cVVlclFETGw3Z0pUYkM3eThaNGY0dG44QzN4UTBa ZUJnK1dPOFdzdHZSV25pZ1dzQnFOemI4OFNpeGRUNHhrZVh3c00yL1dabk56WHlTbUZjVXFqa1Jm V2h4Zkc3SW43VlBFdmd3NDkraWdTbU1oamVVclJtZGIrWG5CZUJQT2tjL3pzQVFUVVhTMHRVUWlS cGdGK0RRS3pxNkQzWWZSV3d3dHNjanNBNit4bGtUaTVGaEpSQUdQK2pUR0pBdHBtSzM0OGpYZ2pR b3JSWDM1V056SWFraklEWnNTMW9zSldDMkNpU2dhYll2dDBaM1gvT2h2dnBqZHlUY1d4OTdOTmpN blFoUFJYNVNpUlJvcitoTDhTNysydzJCeGw0RUxLdWxtRm00MFYvSjZGajl4cExCWU9NRmE0RVpw d2xqU1doT1BFTXpXS2U5ckVENzRSbUdnajMxcFREeHAvZkt3bnFzVkhvNTJzSFdKbS9IVStHNFov RnFReEQwczdnanRSMWo4V2hDMjliSmRpeFA3RFFxRVZTLytCTHZSd00wcVdoRldqZmdUMFkwR1Rs RHVIUGRZdU1RVDBiMEg3bklhSCs5WU1xbG5xdG11eFVtRWlzYzdGb1Vhd2tKWUNBdGhJU3lFaFJy Q1FsZ0lDMkVoTElTRkdzSkNXQWdMWVNFc2hFVlJBeUViYm5mWVFnT0lJeVhXdmJuOU1vSWlaUG01 WWVTUkFpdU1SNi9ScjhPUlZuS3NrZHg0UGNPNlhEUVNrMktGbUZJSHBpS3FQNFJFa21IbGNDcTRL WFVPRWttR2hST2NudFh1UUNMSnNOaUtST2FtTmcrSm9KNTFlV09XSGNVc05CdWlQR3YwTXZoN2NU Zks0Tk5lR3c2QnRhRmh1RjNXbjNzdjhraG4xOEdSaDNZZDBzTkNEV0VoTElTRnNCQVd3a0lOWVNF c2hJV3dFQmJDUWcxaFhTR3N6azRFa1M3V1FGOGYyc3BLRjJ0NVllRnlKSkVlbHFXcHNMREpnaWpT d2dvVmdvYXVnYVdGMVY1SXQzWmtrUWJXT2diTGpTeFFub1d3RUJhS1dXZzJSSGtXYWlpRFIydER0 T3R3bGFRT2FEOEw1VmtJQzJFaExJU0ZzRkJEV0FnTFlTR3NheEVyUHlkSlkvOFJDbHV5MTlqR0VW WW1yOVdERm4vRXZDcVhiWm5WRGh6UG8vK1lNMk1IeHhGV1RnS1ZKcmVod2RIUXFtRWZzaC9XektG VjZuUHhhcXM3OUx4U3VVdTdmRjFySzR1Vk0wNnhOSm00T2FlLzM2YkpGY0dxTitOTjdjdFBxMGlT REFmVk9kVzU0eHNMZEozQ0dtQkJLdkY2QVZabU5WNU1WdWJsNVNsSjBwVm5yNjRmNTFnYVhFL1N6 U2VHQlpSMjdjL1ZtTzB1a3RUaXNaQTFUckhxRzJ3RFVTekJNTXhzMEpCa0lURFM0TFl6SkdscnlC em5XUGp6QUVybFhxZmNhQmIyTE54SGtoc2RrTWpSU1pKNmZKeGpaZUpxZ0tVdmNlRFZJck1oTGlQ SmRYbjFjRHlHU05JTnNESXp4M1BQY3V3Q1dFME9qU2FXYUhHeGVxT2hDZ2NodnRDUnFYSFEvV3hj WW1sYXpmWVF4TEtielNKNVZpYmVSSks2ZWx5VHFRR1IzdERRbWx0dGJXb2R0ejJyUHFjQmpEU3l4 WnlUb3hIcFdhMk9LcGd6NE9ZOGg0WFVPT3FyOGZaaHZIcDhZdFhqNndaRzRHUTRNREl5b01RMUFx ejZobXFnaGVXMDVsUlpOTGltdGNHT0dmSWNyWm5qRTh0TnhwcFluZ1cwR3ZTZHBNcENqdVRtYVJ3 YkNZTnV4RUJZSGVNVFN6a1F3OUtMWWVWcXF2RUd2SklrZDVWb01oMzluUXRxaHdjN0M4Y25Wa09s WE4wT29MYXJYZkxDQmpFc21DdllRWTZ2Mm1qUDFiVGkrekdESFFlcm5uRTVHMVkzN0lkSnFYVi9R ME8xNks1RFpxN1pZY2ZENERXVmVkV1p1YmhCNVdnZHQza1duVXFSbFhTNktjVEt6SFRnR210eEww RUh0YnpXek5iOC9QR2N3ZE5KYVorRHMvZkh5Yk5hODJ6TFNjTnlXWi9WQU5hRzdyejYrZ1pIUGNJ U3hjckYxNEdFdFFISDhUeEhFQ1FZTmtmbXVGN3VKTU9xejJzaHlmejlyVEM0TmRobGNDQm1qdStG ZEJJc2Mrc3dxYzFqK3BLbW9jRkFQbzhqTENrc3ZKQWtRM25zN21oOVhpOUl4Y2I3ZnBZa1ZpYkVD dU5tRFpOQzVIV1M5UTNqdkdmQkxTdUpubFZ0dHBDazBrNnZuTTM3cmN6TzF2akdXczVkNmlRR2VM d2ZQS2ZPTVR0d1IrdTZBV1ZlN25qZktjMjFGUllXNXVSbWlxVU85YmhORHJocXQyK3ZVaGsyZ3B3 MGQ3eGYzVEU3SEk3WXhoOHZLYTNIRzJ4dXRieFRyc3h2d0RQalZ1TUtLK0hTdmFaZWszZ3huM2tW VFpQWjZzRHA1c2psVUlFMmpyQlFZY2pud0VJTllTRXNoSVd3RUJiQ1FnMWhJU3lFaGJBUUZzSkNE V0VoTElSMUZXRkZvazNCL0hOMGhDSjJCT2xJWXRXelIrby9CeGFtVGYvb05ZWFZ5UjZwK1J4WWR0 SFgyTzNYT2hZZU80U0xZV256V3k0emxqYWZIdmRFUHRPS2lhc0lxemgycUZnTVN4T0pFSmNYSzUv NWxySHZGckVYWHkxWSt6bkhTa1N3akNXUmxpdUV4VnhCMG1vVUVmTlZncldPYzJ5ZEVNc1g4UmxM cmlnV0dKRG1zYTdGWWhsMW5HUERSZ0dXV1FFR0luWmxzY0IzaVZpdkJxeEM1bEV0YzFQSXh5SVVa Z3FMYUJMZVdWeXM1V0JoOENFSFMxdGN6TFVsT0U5TFl4Rkc0MVdBeFNha2xJUGlKcWJ4VjdWRXdL bVdjTTZrR0U4WXFzVjJ1bnV5L2NKZVlxYS9RRWswWW1QMHE0MitWRmlVTmVJYisxaHNRaHFLS0xt SktXZGdHZWt6S1k2ZnFORmFYRnpjWW95d2xzWVdEUFBaMlpoamp4anp3Yk1nWWpOemdsYWhnRS96 cGdneExIN3ZIWk5ZTmRFTWk0MDJuWWxZR0gxQ1JDeitXaU5tZ2hPemlpTjJnbzA1K1V6UFl0OW1a TUpjaVlJZWdrU0pna2lCUlNuc1l4NnJJWjY3eXppSktXZDAwQ2VOc3llTHhVNkp3YkxIRUpoN3NR QmZUUE8yUkh0VWNVTDhGc1d5ajMwc1dYendzVkZMbG9ERlpnM1JzNDZQUnhxTE0zYVlWOFRQbUE1 enVDTFdiOHhYUHhhYmtLb1VuQ1hpZmc2V05tSm5saVRzbXNodVRFZ2RmUEZZUnRCbkhqOWpUWVNt TG1hYkVVK0ZWVExtc2RpRXRJa09WSm54eERTZS9zUWFsaGhZYUt6OFNEd3JvSU5lSENzZlBoOS9k NEtMS0ZZRUgrTll4bUg2M3NoaUpvc3cwSTkweGpoV0RNZkhCSjBJSHd0TGpwV2ZibExLaTJwakVh c3dLcEh3MnkrTVliWEVwM3dGSGJ5TWlWZ3RuRVU0SGI3aVdIYUZkRzhSd3pKSHRHTWJLenFWOVZa V1ZzSUI5NXdsbXBoR3QyemlNNzZHUGhrOGtvQ2xqWit1bHU0Wk1Td20yYkFiMDhYQ0ltTjdKeXdq d2kwMmJvZGRxeWs2TjNMUE9JcWhvV2REYTBMcUVGK2ttT2tSR2NQQ2FROU9NcHNjaXlnWjJ4MExZ RlZ4SHpZQXJNVTY5dGRNOFJJRk9yK2tPNTFDeThWcWlYSXllVlVNeThya0ZPRGxSRHBZV3RGZG9E R0YxWkR3c0plelhkUEF5WlVTRjIrK2lJTGU1dFN5eXgwOGdzTWVaV1ZWN0NVRXMxNDBSNE9lb2dV ZThlVkxZMmxiOElqQ1I0MXhMRm5pNDhYeHZFdkdHWGxVUWhTaWlzRmNhU3dCVTJkK2JCKzFCS3ls N1ZnMC9WZUFSNHJZek9aanJ4aVprKzJVbGxqSC9NWnl5dXVHUk9MbXVKWWRnTVV3U2ZYRm5zS3M0 R0VzNERCUGN0L215K2MrejI3cUVPeFdEOTJ1Z2kxNGRKRVZZU0VzaElXd0VCWnFDQXRoSVN5RWhi QVFGbW9JQzJFaExJU0ZzQkFXYWdnTFlTRXNoSVd3RUJacUNBdGhJU3lFaGJBUUZtb0lDMkVoTElT RnNCQVdhZ2dMWVNFc2hJV3dFQlpxQ0F0aElTeUVoYkFRRm1vSUMyRWhMSVNGc0JBV2FnZ0xZU0Vz aElXd0VCWnFDQXRoSVN5RWhiQVFGbXBVeG5CK2laRnRKZm5EQ0NRcFZyNlIwd29SU0ZJc3BsL2w1 REI5QzRFa3hhS1I4aXlXUFBvT0FrbUp0YmlUb21vV0k2eTBzTnp3bmh0aHBUY01qZkQvSm8yd0VC YkNHbFdzYUVNZ3FHZGQzcVNVeFVKSjZlZFk3bXhFSUdnaGZibXdFQUhDUWxnSUMyRWhMSVNGQ0JB V3drSllDQXRoSVN4RWdMQVFGc0pDV05jMFZuQ2pHYS9lS0VNZXFiRmNEblpqT1E5eHBjSnFXbXcw NXJnSUZ5dzdRdHZ3U2JGMEdtQmtwV3JjTlpRVjNET3JFSW9rVm0wdXZLNVR1MnV4Y2JGc0dGN29h YkFnRlNrc2FHVTBVL0Fta3pJYjZSdlVKTEI2WVJFYlRoWFNZeEdIbFczUEl4WEptRVZyeVMwNWRw dEtqcXhTelliYS9VYWp2UlBjcjdFYmpmdlZ5Q1JwNmhBR2FkYmlhbHMxNkdLdEJrU1NLb05YMGxu cFlqUEtTZE5hRzZxME1oZktHZEJDR21FaExJU0ZzQkFXYWdnTFlTRXNoSVd3RUJacUNBdGhJU3lF ZGUxaWpkajB5Q1JOckJHTnNRVHR3cWZDWXF0b01vMGxMbVNTSEN0V1JZT3NVbUt4VlRUQi9haUtK aFVXVzBWREdCekdFbFJGa3h5THJhSVpVam1NK3pGVVJaTWNpNjJpY2VGR3V4cFYwYVRBWXFwb0RI bkdQRU1ZVmRHa2lsbTBsaDE0VVRwVVJaTnlOb1JWTk1ZOGdxSzJveXFhMUtsRGNER3Fva2tYcTNP L01ROUhWVFJwWVZuMkc4MjFxSW9telo2bHpFUloreGZaZFVBTllTRXNoSVd3RUJiQ1FnMWhJU3lF Tlc2eFptUkl0eG44RnkvNklOYVcwRzNmdmlYdkhqMzY0YjRQUVZ2RWUvRnl0WFJiZm5WaWRkT3Ro LzRULzZzSE5IRExmL0ZDWGp1MWNLR3ArWU1sSHRQQ3JxNnVVdDZMWlRycGRuazJUb1lzWHpKV1Jr K1VCOTcwMEhjL0s2SnZ1d1hmOWdPZTFhbUZwZ08zclovNm5hTlE2MFBlaTlYRHBGUWJ2aXlibDBQ V3l0SEFZbHNQMDdGNlZtemR0Q0kxMWluUVBQdW1ibmhoellhWFM1dEZzR29IWWpxUDNQMzQzWS9v b284R2FpOExsa3ptdWtRc0FvczNRcGNHRnNlSzBlb3B5dmhHeHFvVnliRis0ZkdZUEVkTytkZXNM UGQ2SjJ6STluZVZTbUo5YytLTGpZMTF6cnBEZHp4Q1B4NFpTWUlWeHJCMGQreVVsNHlGbmVhMFhU WE1RUlhCTklzWVZnK25iOUVkcTJBck9YM1RwaFhkUFlKdnU0U2xPdUkvc3VpOVZ4Y3Q5SnBtem14 dU5oMlp0Y1pVS29JMVFtdGQ5eitOZTYrYjNPaXNxMnQwVG9SVXVtRXByS0JlSHdxRjNIMUtJcDFU ZFNtVjZXQ3BxbUMvU1kxMStyU2NQcWhsSDJGaXd6QWUzTmxoV0xEMVJ2S21nZ0pwTE5PbjJmK1lN MmZPeWxuWkUxWStZZkszdmJaK20xOE1TemN5UXBJWEd1c2E3NzU0OGJwM0d1djIxalhPUFVNT0Q5 ZGFSTEhrZmNIb1NmU0Ywc0FhekVrRHEwb1dvRnN2cGt1SmRkcVNHcXVudTJBcmFBWGQ1K2h1dFhY VDJwdEk4czIxSXNOd0NRaFRDeGY2Ri8zRE12V0ZDU2QvT0hQbGs5L3ptRjR0bi9UTUl0Q3o3aE5n RFE4UFhMelF1TmM1RjRTcGtiOWRjRHIzN20yY1M1NnByVldKWVFYZDhHY051OTJoTUloSGZha0hv eVh6ZENvc25Ub1FrSWNKSWl6dkRjaFU0bGgwcDFPcDRWMUQ2cGoxMllvWksyQ2pSeUc0TFNxNGtT VHZYQ1dDdFE5aStmYzgrV1MydDgzajhiYWR2SzI1N1lXVkcyYVZnNDRseExMVTZzanpqWHZybk4r a296cDUxMXpBMVRpUnJMV0lZUVhkSU9DNiswTDZRcHV0ajZDQ1RhbTdsblV3QlJhd2Nsa3NJQXhX V1hRMWdWNlZOQlpsNFhRbUdQY05PbEdzbnFKTjExK2NQbjM2c1l5dDNVVUZiNEY3MHk4bXdmSzgr OGM1aTNhOCt0T1pNMi9MOW5qTEh0eThyZnhkLy9FdUVTeVY1Y3pmOXRidGJieHU0UDMvOCtmL0M4 R1dIUUtoNjlFektoRXNUQS9ISWYzVEVxSCsvakFsU3owU2M5elNXTHFxWURBb0MyQTZPVE1NZzVa d29OY2lqYVdDZDhQMHQ1Y3g4YjVLRk92Y3BuTy9ncWNDc0FxMkhtT25kMGtzL3d2L1dyN2poeXRm K2VQbU9UT1A3eml3Wldaem13ZFFpV0tSMXpuM090OForT2lYaCs5LzROYVAva3lTT2hEdDc3ajRh MEtJQllaZHVBbWNqQVgrd09IK2ZvTHFTeFhsWGJZY2l4UVdGbUJERlJ1eXdEMVZWU0FvamVXQ1By QTMxZkRpUFMvUDZsbXhOT01la3J3SFlzRVJ5R0N0N2VrUncvSXNlZVcySFNmblRKMTYyL2QrYXZK a2U3TTNQQVhIWUducGNRRVdVZEV4R1dBdHUzakwvUS9NdS8vdy9mTSsrZlBGa1cvTzNmdmJDaUVX cHFRczBFdHY2OWVId0sydER4NUszaXBQNjVVU1dISVEwS0U4MWh1SU5aa3VHRkNKWU1uQm9IUHRn bGJ3V1FNOHBHYUN2RUVzS2UxWnNXcEd4dFBUWjhDZWRTTjV6NTB6N3J6enpoVWdpeGRpZFhYNUp6 ejVsSC9tNnFrVFRFYzhucCt1ZlBmSWx2azAxbkVSckk1SFFjQTZSRnJtSFQ1OGVONEQ4K1lkL3U2 STZzeXl4ajkwR0FSWVNqRHVnckJIZ1R0eW9CYXloYW0rNUZidG1lM3RPVU9pV0RVQnRZNXdCWU11 QWtiNGFLc3lCR3FTelladzNPbDJNVWc2Mk1Ga29ua1dHSW1nY3dHc0lvaFZzSFRWcWxWRkswU0c0 WWNBYTl1Y280dFdyOTdtOVJ6eG50eThaVUxiRzA5NFBwWEN1cXV1em5uWHdFZnpmdkQzdjk4eWI5 Nzl0L3oydHgyL2Z0RjVnd2dXaUZqQVJtK2pmejU1aUNKc0ljcWRmRUpVVnNMc1lVZ0Vpd0M5cUlZ QnF1Rm9xYWxlZGRMVVFhMmpxcUxEVHdjUHFFU0dJY3hFTjkwSnNPZ1VDdzVISnVNU3dTbzFiZHY4 YWZucXpSUGFUcFg2eTJkdDJkbjJ4QnRIbWdHVktOYmRkWTFUTGc2OGZ3dDVodnphNFhtSGIrLzQ5 Wm1KVHVleUNsRXM4TWZXRjN2VTc2WkNXTkxFSVFmT2hiSWNseEJMSGpCVXhicVRLajRTcVdCQUJF dXRCVzBYRzZWZzZKSnBvMGN3a2FRVS9xR3htSjRGc0ppMXRSaVcvNGNyMy8xZzZ0UTFYci9KVzc1 K3kwbnZHdythVGtDckV3SXNROFZkem5mQTNEZnYvWTVmZC93QVlIMVUwZkYxa01qZlVCRVdZUFhS ZjZMMS9iQ2Y5YVhBVWxycHhGU2Z1ZEVLbW42SWc5VXJvMkp4UFJDT2E0bGpNUUdlb0xWMDJvU3U1 aElPUXpxQkYyRDFTR0NkbkhPeTdZMnBzK1ovNjhCUjcvd3RwVWVmMmVtbHJVU3dzaDUxVHJuWTha V3YzcTZyT0FPdzVqMmExVEhYV2JmMzYxbERFajJybi9rWFZBbVFFdGlVeWJGQXgyby9YV2xWeWda bE5xdk1NaGpQVHpOMEFaY3FIcWtDcXFwMHNPZytkWnBJeE5LS1lNSHRxMFFzWnM5R2lGVmE2dW1h OWZLT1BldG56Wm8wNmVYNy9PLzVkODVlNUlkVVlsaC9yWmo4NytjN2puMHk3NVpiM244QWhxeUt4 NTE3Nnc1OS9Mc2hzWjZsSnlpbGpRNVRiam1ZRG9OVTBvK1I2RzFLV1h0MDNhTzB1dU9kSUlNSVlB U2RXakh4S3BZOXlHQ1hrOFNxaW1ISmlXaFRTV3pSTUZoc3pHTFhpbUpZcGQ3c0p5ZnNBTkZxeTZ3 Tk41ZnRPREI3ZDFtYnZ3eHFmWXVQRlE1WExHdDBUcjY3NGtlM1B3QXloNi9lV3BGMUNLUVNFN09H cWdSWU1qa1ZCRmxvdUU5T3lQVWdIWElEdGlTem9XVXdwMTE2cHhTazdjd0l0SEF5QnhEc2lZQThS Yyt5MU1UeUs1M0l4Z01UNElVeHExczBaZ0VzaitlTmxTZDNlSGF1V1ROL2tjbmt6NTc5WVBZZXYr ZTRDTmE5NFkvLytxTFQ2Ynp3VHdNVmI5OTk2eTFmNlFBNWF0M2VvWStyaEZnRURGb2dIeVdDYmht NHNZQTFkVEFvblk2NnJjb2syOHE5dld6TTRzUXIwTU4wcm9CQkFzdEN5RS9UdVFJUm5RUjE2bWhH ejkvUG9vZmg5Qm1yaXJadVlySEVaOFA3QUZhWC8raWtsZHZLMnRxOGJhYnMzZmZ0bUhEejdOa24v V1VueWdSWVErR2hyTWRCUUhmV1RmeDJSVmJXNzdLcTlvSUg1N093S2t5WXdldmRGRkVZL2VFc29I TUYreVV6QjdmKzlNWmtlL0R5UU5nZ2lPNEJ3aEJRcDloMUNETUovQzQ1SnQ4bG5tY3hVOStxTnk5 bXJOMjZhVzBzZGVnUnc0S2h2TXQ3L0lYMXp6d3hmK2Nhd0xUN045Nmo5ejA3ZTQrL1RJaFZOWFJ2 T0d1aUUrN012SGgrR3NDNjRLeHpYc2o2QzRaMUNyRkNJTVVpK2tMMG1BZzJnYURWTDdtU2RsVU9T UTlDdXZJUDlDSkRMNnZGNWxreUFyZ1JxZmV6ZEx2aWoxV2lHVHo0Yit1S1gwMi82Y2FiYnJ3bk9n ekZBanlOZGJ6TDc5K3o3WTJiYjk3OW5UMTdaajlvOHJlVjd0NHBpbFZWdGYzYldkZkJuWms2NStT WHN2NEFodVFkMDM1YzA5bFpJN0xyMEFjVDBxQytyMCt2bDFtWTFhRkVzdzNtdUpKZjNjRUNZR0Zh QlZMNDNnQkdHV3FDUVhtWXF1b05oSlB1WjhtWmI2aUxMZzVsaE9ST2FjL2FPOWxWNGE5Z2dFL1Nz MEQ3MU9zdk8zcjB1Ti9yZmZBaGs5OWI5cEFvRnJhOXF1cnRuMDk3ZkxJVGprWG4zTDJOaDVaTit6 bTBHaFRCc3ZUWllrdG5TOGpXSDViVWNDc0hVMTBLa3djQzlMbUQzaVNyQWgxRUZRWkJUUGdWTGJG NWo3c0RyOEpjV20yTmdaTFlLWVZZNTViT21NNW8wVEdyUnh6ckJOdktQQ2FUcDduTW13M2lsV25D emVWZUVheE8ra0xBZjB6NzcyVlREcjBEZXRmazg0OU5lMzJ3cG1ad1VDNjZVeHF5MmZSQjhBNjV1 OS9XOThWTForbWYycEF3RHpKN05KZnI2ZzZNVVN2V1pqd00yNXZuaWlTSDRRbHVLeXM3WVNwNzl1 YnZQSGh6dHNramdnWDZFR3ovOXRpMGFmL3hoNWYrOFBwL1RYdHN3ZURnNElJRmNuRXNpbEFXMnVp bXh5NzVJcXN1TEEvR203enFzdFF0WnpDNzcvRHZGVnZYMHUzZ09jbGh5Q3JCLytoMjNPL0ovczZ6 SjAybU1oRXMwSW5ZOXZwalAvNnZIei8yK29JRkVBbzBsenJKeFIwTXU4UXp1bkxYRFh1aVY2Tjdl dGpCMThQY2RJdGNrZVk2TWUyRXllc3hlVTMwZlg2ZXVZRGI1TEhtQXUxS2x2S1BsVnFIbjN4THJC MW5ibjV5N2RjNlhIc05ZU0VzaElXd0VCYkNRZzFoSWF5ckFtdEdtaG43b29UYTVIMzdsdnhuV2Rs Lzd1TVhKaThmaFN6OVM4VHFGcmFEOUYrODF3bXFiWDl4OHVRdlRLZDRoY2tTVmNranNtc0RpOTZX T1JoRE90alRzNm5vSExqTC96WWY4S3hlbTdsaHc2VFhUTHhhVzRtcTVGcjFOWUlGaU01eWV0WEJG WGR1QlZwbkpiRitjYVQ1eUtrakoyYk8yck5uNXFUanpZa1ZrZEZDMjRFYnBreWVPK1dPWlV4UnNs U1JyZHl0ZElmMHNsVGxSRU9XSzQ5Vm8yV2JLNXpzeTdHYk11eEZuSU5GbTQ1OVk2bEkxY3lTYUxs dDg3N1hGcHAyTEpwVDN0YjIydnB5UDY5bjFZNUFuY2NuTjc1WTE5am9kQjQ2VDFmWmltSmhmY3lH WmRpZHZPcGp5SHI2OG1DRjZlc1Y2aXF4T2o1dFFra0llQzFESjhSaXV4YXpiMVcwOWtieVo2cytF OGM2NVMvOTRjdy92ckw2dHZJWE5yelcxdmJVTSsrWkV1dlcxTFU2SFRrd3NiRnhNbW1aNkhUV09S c3ZnRUU0YkpFb2hhVENJWDJJQUd6SmZwMkRnNjdMZ2FWU0IzcmxHQ2FYaVJXVWNySG9jaVAyOG9V UWk5a1YzYnFpKzF3UnVQMys5ZVE5QlFVQ3JIMExUd0dyOTE1NThyYnNrOWt2UDdueUtlOVRFN1k4 NFJFTXcrRVJjbUpqWGVNakkrVEFJMU1BVitPRml5TmlkYVB3bW5Pb0x4VHE2N2NwTFpaazIreUQ3 c0hMZ0tYcTdhM1NHVEFzckF1TFhOcUJXSFEzcWhLdDhvdGpuUzE0OCtFMzMzeHpSa0YzMFFwNGV4 TjVyS0Rnb0FBTGx0dSs5Ni8vT080OWZsK3pkOEtFSFR0WHJ2OXBxYW1MMTdNc3RlVGRqWFhPS1FO blFPQWFlUHlRMDltNGpCVEJJdlNVcFkvNXFXVDlUWlp3a2xxR3dZMlhpRVdYbFBZR2lLcGVwcTRi dUtta3NLZ29WcFZMcG5ZWmhEMXIxY1Bnek1odkxPMWVOWU9adkk2SjlheFRwenhINTh4cys4MzNw cTVldmFadHgveVZFNzdsTWZGcmJkV3Fqak9UblhWMXRYLzY1RTlmK1JzSTl0ZTkwL2hPYllld0ZG SlBVUG93UmNqZ1J3TEMvWHJLbldRZ1psNGFscUUzMEF1eFlrMnVFaFNVeHJBTVRMRWZVOTB0dUdh ZjBkMXpkdW5QZ05EdmwzNjJpY1g2VlVGQmp4Q3J5Ny90U2M5dk5zOVpQWFh6QkpOcHdvWkZiWjky bFFxd3lMdkIwRHMvQUtzaEgzai9CLzk4NXB0M05KNG5CVmdXTjRXRktIbC92MXNKekdTMk1KR2th SFJqKzZWZ2hRTzlZUjFCNk1LY01xMGFma0VweE5vRkFqbzBrb01BTDRObGJMc0VXbkEyTEZyMTlO TTNYciswRzJKZC8vVHZmLzkwVVpGd0dIWWQ2VnI5Z25mU3lwbmxleFo1MTZ6eHZyekdMNnkxVmY4 TENlTDZpd1BmL2VyaHcvUG1IZjdsN1dmT2tKTW5kN1FMQ2d1Q3NQQ3hueTVoZ0xWWUljb3RlY0x0 bWNwTHdMTDBzbVdTbkNKSm1TV0FTUWQ0Z2c3dmNFNTA4YXV5WUUzV3VlNmwzLy9HV3d6V3c5OWZ1 blR0T1dIcThHR1hhYzhyZXc1c25scmU1bStic0hLbVorZWtUNXNGRlpIcWZ4bTU0SFRlUU43K3lh MjMzZ0swUHVyb01QelA1SXEvOHJGQ0dLV2tNQnNkSFVKaFdOb25YVk4wV20remZIRXNlWUNRUjBk ZmJDaGFaTUVrc3lFR0g5VVFCQkhtMXpoa0hPeUJ1ZnZTNjY5ZmVnNWkvV3dwMER2WUxZYjEzdW9Q MzlzOHM4dFU2czFlUDZucjVLeUZIaEdzamlrd2JaajMzWXV3Y25UZW94Vm5MalRPL2EwWVZnaGcw YjlmVEVZcGsySFpocFQ2TDQ0bFU2dmlzU3FxUlFTRDRqSExFZ1pqYnhlMUs2R2Y4WkxTejg1Q3JC NFc2NkJZUFJiQVdyVDV2WGRYVHozWjVtMDd1V0dTYWVmTHpjMkM4bEYxZThVVTU2Tm52bnYvbjJH WjdmM3ZaM1hjNVhUT3pSSVUyUVl4TU83Q1REMHk3Rmw2NmRJK2w1V3VRZnFpV0FFTWk5ZHpWNlhD QXFzS0NNVHBaZ1llMXNHREIzdTRQYXRickI3cnc5SWpuODVhMC9iRWhwblo1ZVZ0TytkN0oyM3pu empPcjRoVUd5b3UxRlVNL1AyWFgvdVI0ZGI3RC8rcG9tS3kwM2toNjE0K1ZqZ0VxOTJWTUhVUDkx R0VMU2pkcytDSGNpeVYxa0hRUG4rZ2gyV1NFRXZHZEtwbzFLTDRaWDl4TEpob0diUk1aaXEyM0lF ZENXSjl4bUFkN0RrTFVub2hGaGg5SzQrYVpxN2ZzbVg5VHI4Mys1a2xPenlDaWtoMXVPSWw1NkVi L3Zscjc4T1BVUnoreXBueklJdGZKbHBrU3pSWjRFcEhEOENVaFJhNVRMcGpEWjJ1MUZmYWN2WEtT dGNYN2xseWJ0MmYzQ0JJUzZOWUJCeUJGaERaNFUrc2MybTFGbjdQQWxvUTZ5Q0RkZTdnV2RHZVZl cnh6SnJsOVc5N2VkTExPNzA3Smp5ejg3Vm1QNzhpVW4zdnQ3UG1OanFuL0ZQSGo3NTIreWNQL1BY akY4SDY4SGUvMnk3QUNvV29ZSk1sdHZBSlM2Ynd0a3FsakM3Vmx1a3JLd2UvU015eThNTjdyeVhZ cTBzUzRMWDB4OEoyeVd0a2pGbmlyZ1BvU0JDcllHMEdNd3g3eExGSy9RZTJiSG10elZRRytsWDJq dkxaczUrNHo4L0hHaHJLdWd0MEp1Y2RIMS9NZXZ2cnNOYlBlVVBXMjhKU1NEa1llV0dtQmt2bXBp eE5FcVY5N2FjckwzR0xCZ3NZd2pRUkZ0V0NuM0xDa3F3TnRRQXlIUDM0cjBwa0dIWXZmZXN0Z0RY allqUm1DYlpvWU8xYXFmZmQ3NjEvWTM3Mi9FbXpuem5wL1hEUFF3K1dlUklMWnRSVlEzL0p1cTZ4 cnM3NTRuWFRLcksrRHV2N3N2NGlWZ3JwQmxxRTI5Mm4xd2VCbFVTNW1rdHBhNzlFTEIxWTJ4aUNF TW1sa2dPdVhya0ZDNmdsdDJoYzdJZUNWZkRqVHJ2a0ZyRXRtcDYxVDU4NWR1ekdZN0JublJXdHg2 SUwvVXI5cHZKbkg5cjl4TTZmWk04KzBMWmp5YzE3L0R5czdmOS8rODloTldTZHMzSHk0M0JFVHB6 MmMvRlNTTGROejA3THdYNEpLK1ZwNnlWdXNXYlFCWC93VTc0NlYwQkdmeGNncDlhbDgxNmRlSUNI cVJhOTVLRlhQV2U3eGVxeDdxTS9PVkhhN1BWNnlremVIVXRtbCs5b1c3UjdFUjhMMjc3OTdiOWt2 VFFGak1SRytDSGZ4NmM5OW0rZE5RdkU5clBraGJZbStKSHhmcHZFZnRhUVZYK3AvK1JFQnJNM0U1 Q0JwVFE5SGFyaFN2cVNka3BoR1ZiUjBxZmZ1dW1tdDI1NmVOUEJnMktwUTd6UXorTnBQdEZzZW5i M3E2OCt0TTNFSDRaMGZSODJiZHBMRSsrWWN1SENEZE9tMVN3WUhGd2dVZDBYZFBjVk5yRlZ5V0lC cS9JMGRSbXdLTHJzTmxiM0Y5WmR3cGRqTnVCN3puMjJDclJObXdwV2lIK2lJb3JGMUsrZDhCOS9k dmZ1K2NmNXRiYnFRVnByOFBWcFRIdGR6dFN1WFNONzhQSC9LOEZuUmJCOUZ2MC9PL0JlUjVlTnhx djhqdnY5Qnc3NC9md2lQMjZGMy85YkVDL3Z1MGF1N3FSNzNWQlk2QWM2bGFESTd4cS9ibmh0TjRT RnNCQVd3a0pZMTJqN1h3RUdBRHpnNnJ2NVRaVEdBQUFBQUVsRlRrU3VRbUNDJyk7fUBtZWRpYSBv bmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5 IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVl biBhbmQgKC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86My8yKSwgb25seSBzY3JlZW4gYW5kICht aW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRp b246MTQ0ZHBpKXsubG9nbywNCiAuZmIsDQogLmdvb2dsZSwNCiAuY2Fwc2xvY2stb24gLmNhcHMt aW5kaWNhdG9yLA0KIC5zZWxlY3QtYm94IC50b2dnbGVyIGksDQogLmljb24sDQogLnJvdy5uZXR3 b3JrIC5pY29ucyBkaXYsDQogLnBhc3N3b3JkLXJldmVhbGVye2JhY2tncm91bmQtaW1hZ2U6dXJs KGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBbGdBQUFNZ0NB TUFBQURJdnV6MkFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2Ns bFBBQUFBM05wVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0Jp WldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJ RHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RH czlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOUzFqTURJeElEYzVMakUxTkRreE1Td2dNakF4TXk4 eE1DOHlPUzB4TVRvME56b3hOaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJt UFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ri bk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVH MXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1 ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2 VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpi MjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xt UnBaRHBrWlRjeU1EYzJNUzAzWlRRekxUUTVaR1F0WW1ZeE15MWxZelV4TWpRNFltSTJNVFlpSUho dGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TkRNNE0wSXdOVFJGT0RoR01URkZNemhD TnpOQk5FWTBOalJETlVZd1FqY2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZO RE00TTBJd05UTkZPRGhHTVRGRk16aENOek5CTkVZME5qUkROVVl3UWpjaUlIaHRjRHBEY21WaGRH OXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElDaE5ZV05wYm5SdmMyZ3BJajRnUEho dGNFMU5Pa1JsY21sMlpXUkdjbTl0SUhOMFVtVm1PbWx1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2 TURVd05EUTNNMlV0WlRKak5pMDBaRGsxTFdFNE5XRXRaRGt6T1dRNU1XWTNPRGswSWlCemRGSmxa anBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT21SbE56SXdOell4TFRkbE5ETXRORGxrWkMxaVpq RXpMV1ZqTlRFeU5EaGlZall4TmlJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZ NlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BqdVgyZDRB QUFNQVVFeFVSYkp6eDltbC9uSnljdlAvLzlyYTJwZk5ITWhiQU9hWi9Vc0pTbGxaV2ZYMTlXVmxa VVFJUk8zdDdaN1JLK1RrNUttcHFWY1lWOWlPaTRwS2w5N2UzdEhSMGI2K3Z2WEcvL1M1LzZ2WFN0 TjBjS0dob2NQRHcwMU5UZVMwc2NNeExOanRxejgvUDlXSDV2ejgvRk1LVXFsb3ZQTHk4cFZVcE9q THMzNStmczJCM2RUVTFOK3Nxb2VIaCt2Ky84cFNUZUxpNGprQU5mWHA1WmFWbGVEZzRPMnovN1cx dGVuVzA3b3RBT084bS9qNCtNQjUwdGlDZnZqLy8rdnI2N01BQU12bWtQcjYrc05NQUd4c2JQVDY2 TTF3SjhhSDVKUExFK3VzLytqbzZJMk5qZE9WL0xrQ0FMd0pBTmFRVjlxZC91bkp4NldscGVTcS84 ek16SGs2ZysyNy8renk4Ky92NzlXWi9kNnRoNFhGQUptWm1lMzMxNXJQSStLaS80R0JnV1VsYWJt NXVlYm01c21VNDcyRDErcWovK1d5LzNoNGVFUURRWXpJQkhRMWZMS3lzdXZSeXZ6Uy8vbjg4b2pH QUV3WFRDd0FKcVhVT3ZTdS81NmVudGJXMXNIaWVUSUFMZXJrNHN0b0V1M2cxK0x4d2ZyMDhlWHE2 bytQajVHUmtmRFoyWkRLRFVaR1Jtb3FjT0NTOC96Ly81OWNzSmZOSHJmZFpJcUtpcytkNlQ4QlBO T1I5L0RBLzMzQkFOaU43cjBhRlk3SkN2SGozdHVWK2FCanNXQVpZTTdPenUvWnpQRDE5a29HU2VE SXh1LzMrb1NFaE51ZWJ1ano4NEJBaS9QMjk3a1VEU2NBSDY4QUFPWGk0ZHFxNzhkQlBPenY4TWZI eCtlNS8xd2RZTDNnY2VucDZiOGtIM0F0ZWN5Tjd0U2E4dWp1N2xBSlQ5eWNtdENVOFZnaldFZ0pT TG9PQ08zcTZ1VGYzMGNDUk01alg5NnQvdUhUMHZUNi9kN3Z0dm44L05LQlBlUGs1V0VnWk8zbjVP WGw1ZnY5OTlxZjlmdjkvL2o3OEU0S1RlanI2MFlJUnJnSkJGMFpYY0JBQVBIeTgvTDA5U0FBR1lt Smlaak9Ic3ZMeS8vLy8xRVJVc3ZMeW5Bd2Q1ak9IMEVJUVlpSWlKak9IY3JLeXY3Ky9xK3ZyNXli bTg3T3pkalkxK0xpNGYzLy81Zk5IZS80MzVuT0lQVDA4K1huNlBmdjYvdjcrNVhOR1ZFWFVmMysv UDcrL09HN3V2bjUrZnY1K3YzOS9aalBIdVhrNVA3Ky81blBJT0hoNGZIeDhmTHk4ZWoyOXV2NitU TXpNLy8vL3c1T2crd0FBQUVBZEZKT1UvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vd0JUOXdjbEFBQlpnMGxFUVZSNDJ1eTlEMkJUNWIzL1g5TW9i VU9oMENRdzJvcWw5TlJRZ1dhaFZZTk5oSDdWdGxTN1VqQklSZ3RJYWFVeUY4V2JPN2Rici9LbnE3 RkRKMk5qcSt0c055YXU2Z1pidHlIWHEyTzUyN2hWTmlsQlEvcVBDRmZ1a0R2NWNldktuZVQzUE0v NWszT1NjNUtUay9CSCtubVhQKzNKeWFHYzgrcm44M2sreitmNVBFa1hveWlYQ29ncVBUZmFPd09n Y2F5a2FIaFVTcjJ6RGNBQ3hRRldoZFE3SndOWUlPVmdOVXEvVlFWZ2dSU0RwWk4rcXc3QUFpa0ZT eFBwdlJvQUM2UVFMSDJrOTY2NWdtRFZYTHlvaXYxZHlIdlh3RE8vQ3NES0dZcjAzcnljS3dlV1BZ bzFsYlN4ZG5qbVZ3RllHWkhmbkFGZ2daU0E5ZlRweUc5T3l3V3dRQXJBTWtWN2Qwc2l3REpvTkJy Vk5RQVdwZEpvM0lJamJnMVJLanNTMHFqc2VqZUFkZkZpZXJSM1Z5UUNMSEp5OCtjZnJGcjAzNmdO T3hJZXQxYldqbmV3RERLc1RmeGdxY25KcW5FREZtYXJlWHlEcFk3K2RuLzhZRldpRzQzT3BxNVJz R3BxZzJxMmE1aW9OS2QySElOVkp2TlJ4UWtXdXRYTkYyUE9MMzF1d0FvbFNGMUpKMmtxcVhFTDFz dHkzcDhkTDFqNml4ZHpjZUl5ZFp5QWhkUk0wRXFseGlsWU1wOTBhcHhncVhBczF5elA4VjRqWUFV bys3VlBsalJZTWdQTTRmakFvc2k4RVJXcDhPdmFBd3U5a251dGt5VUoxdE9MNUYzQS9IUmNZTlZn VDBoR2x6bmpDYXlBT2xmZXNQdmFBMnNraGtjY0IxaXA5TzNWUjV2d3Z0YkFvc25Tanord2NtMXly eUJaL0M3bnpXNDJ1TXFOOGVmM2N3OFcrVm5LR1g5Z0haRi9pWTQ0d0twa2I2NGh4bFRXNXg4c1Vv SGJQTzdBS3BKL0NXMGNZT1d3UVh0dGpIZjVHZ0RMZlUyYkxBbXdZcHBoVVNrR0M3c0RONGRZRkZK cXVieDFxcUhaSUg2Nm1qMUhVNm1XQnN0ZG82S3pKTG1xR3VsSllhcFp4VnlyeG4wcHdDSldXai9P d0RvUjY0K3FNckFNd1hSWlpaQXgwYWRzejRsZU5sMnJpVElqaDhHaWFvU3BONFA0djBvWlpKd1VI MWp1YTNsZ21CUjdxYnZvMEU0UldGUnVjQ29IMzJWcE4yWFBqZjVOVW1IVFM2bnFjTEJTdzY4azlz L3FRMDdMYlU0OFdQaSs1WTR2c05iRWRwRVNoV0ExODYxVXFuVEU0YWJKVmRscjhkbnUyaHJpb3pR aTQvZUxxbVp5UVhjem9TeTNOZ3dzWXNzTU5iVzFWS0JXYjArVktPTm9KcWZWRUREVk5UbXlFc2F4 ZzJXUGVjTGhjdzVXemhueGsxOGVGRDkrSmtjWldCcCtNRmNqZVpjSk1ybDIvcUNSVW9XQ1JVN2lG OXE1Q1VXMTRXQVoxR0hlMHlEQ0ZkOUcxVnlVRVE3RkRsYnR4V3QzY1ljb1dGTC8yVEtwZ29jc1JX QzVCWGFBa29vNENESXFLdktvRUh2VlVKK0dEVUt1T3BUazBLUkdUYmczckExN0kvNGVjdDJKQmlz UTgwelc1eHVzM0RUeGM4Y3VYdlJMQjB1eGcxVWpiRG1pRW84NHlMVnJvcVViTkdMT3FqbDBMbDAw M2RBY1dudEc1WVJ5UlROaVNEaFlPWXFTSnA5YnNGb2t6bTJUWG5IZnBnU3NIT0d6a3BqVzBZaWEw QkN3bXNXZnV5SGt2ZUo1TEh0SXdHWVgrMGFpakZxVmdhVVpYMkJWUkRCTEVxOVZLQUJMSGZyOGNz WHlaM3J4ckZvSVdJalJIRXI4Vzg2Tm5pQk5GWmdzL0tid3h4MjlBRU1aV0JmSEQxaUdTSUZVbThT TGpiR0RaUWgxZmFMVE9qbmlMYnFFWURWTGpkcENYcEFBU3kvNFh6ZUw0eEMxQUVNQldQWnhCWlpF SEVXdmU4NlZXTG1qaXgyczNGQVRvQlp4ZWxMSUNNRlNTU1dFS0tFVmxKclN5ZUZESTFIT3FvODJt d2xnUlFaTHl1bXZpVnhPbzRrVkxIMTRlaUVuL0pGS0lTTUFLNEtiRWxwQktiQXFlZDhMSlRFc3Bx SlJBbUJGQmtzZm1aeW56ZEtjeEFTV0t0eTEyTU1EWkNuWExBQkxMLzBBaFNNQ0tiRDRVK0MxVXZt MGFLa3NCV0NweGhGWXFlZWorRHFKZmc1RE9iR0JSWW5NcGJqRExFK3QxTk1VZ0JYaEIxLzR6MGlC eFQ5TDhtSVhvNVJHS0F2ZWM4Y0xXTVBTb1hia0RqUVpzWUZWSTdXWU04eUdVVkhCMGtSWStpRUlz aVRMWm5oRTR5RGRMcUxLYU5NNmtHNklCSmFVcDB1UE9wRVkxaUVrOGorY0txc2xsMEhxUnpvVUxJ MnNaeWNKRnUrc1NPM2tFaDFqNVk0ZnNLVDZnSmlpcndzenhRS1dXdDdDZmtsa0JHRGxSTWlLSnhR c2RXTEJvaTVldTkxdlFzQ1N5aVlJMXVMVVJqVnEwY0hDamtWZkc2YlFySlU4c0NJOUg0TUNzRFJp cnJBV0YwUWtGcXhZeTJZL3gyQjFTSncyTEdmdHZTRUdzQ1JteVdwQ2JuWDhZRlhLQW90M0JjWGx5 MUEyRXdFc3JheUlTQzNMdlVWTFlvbjlyTHBERW1ueXdFcU5POFlTZ21XNFRHQ2xYc05GNzBteStv QzhMRy9TcDB3MldKS0xjbFRDVkpia2VDK3h3VHMvcTZGNHBBYWx5ZEpnMVVaSTVNbVlwbjVaTGxp U3RWZUJrTVl6bFZMWEVZQ2xpcEFPeXBHVGJxamg0Ung3Z3hLbFlGVkdHelJlTTJCSjNkQWl1UnZz cE1vRXExazZpNTByY0ErU1VVaFlndFFkVDRLVTc1UHNzVGZyVWdZV2xUdHVsbitWU0p6VUpuZExz R2FaWUdta2I2bEJnSkprOGE0QXJBaWpLK0ZzandSWWdveC96S3Y5bFlKbEh6Y0xWcDgrSS8yakph K3p3NktuWllIbGptRDBRa28xcFdiRmhkVU51WklySVN2bFRFSUxZS2FVUmo0eGdxVWVQMHZzc3lU T0VhbG9sMHJRajhnQ3l4NnBHak5IRURDcEpFNFZnbVdRdktDY3NwbVFvYWhLMmlJbkVDeGMvenhP bW9Ma1hoQS9SWFFEQ29rcFJWdXVITEJ5SXNYSHdzTGdab2xsMlVLd0pDdlNaUlg2YVlUUHYxbGhQ andtc0tqVThkUEdTS280VkhUTG5CeUpJZ2lmRExBaXIzcHlDMUhLRVg4NDRhWEpZa0YrYUh3c0Nw WTk5QkhuS3N0YnhnSVc0V3E4TkY2YkxCMXB5OSsrcVVnR1dGRTZ5MmdFTHpkZkRGOHlFdzVXcmZo ek1vUW44dTFpUmsxWUwxK2o3S0hIQUpZNlp4eTFpcFJhZ09PUGJjTTVWWFN3Y2lNM0hRbEpaV2xF eVFwZC9xVVNlMUtHaStHTHhPd2kwWDNvNVpXWkU5bGdVWlhqcXJtdExvSjlFZE5SOGROUFJBV3JP VXJVaXYwWEx3Uno1NHExVHJDSERLbElMSndxQ09CSld3L2hLdE13c05TcFl0aVNKYkpocmRqVlZF TEFVaHRJSEdvWUwrMjRwU3hRdWxRSmlTcWE1d3hJMjdUSVpaTWhZenk2S1lPR3o2S2JOQWtKaHlH M0p2aTQ5RG5oeklTQXBTWS9OQ0tPbHU2ZlkrQkJRVFZyb21YSlpZQkY2U3ZwSEhLT1BoQVlKMkJK L1U5TmtzVkoyaWl4Zm9UZzNCRDFDVldHUmlRSUFJT2RsTmJZRGFraXRhYTA4VUVuNld0eDN4QzZU WDhvTXhyU0VZUytUSTJCdnF4R3pIVFU1akxkUThpNTlrck54ZWpUTCtKZ3BXb3E2YkliZzRadDd4 WFNoK0xhQmt0cWxDZmRGRm1LRHE1RGlNUy9XQk45ekpVVDZ1Y3FSZm9BaEQyYzhMUEMralJvWkc5 cjR3NC9OVmVSS3hReDllTmdKNTBnV0ZKYlhnNUhxS2UwU0pNVEFTeE45SVJ6K095czJ5RE0vcWZX aU5vWndXUzVLdHpDNkVOdzBVUjR4c0l1Ymhkem9sb1p0UXl3TkpWNktoQVlSMkJKOVFFSnFITDRr dFhqZ1MxK2wzS0Z0YlZSMitNaDl4Tit6RTU4U2E1R1U5a3NlUUdxdVZLRFUvY2FnOFE1VksxZFJU WVFUSTEwR2VZN2JUYmdpMTNVYUF3MWN2SmE2ckR2bXZhNXRDdHNqbGFCZWsyQ1paSjN0dkNIV0Nw VjN3SzcySU9TSW5xMU1GY2lORm1ieE0rcUFMQkFTWEszdktRRDg2ZGxiWXRpQUxBQXJFaDlRS0lt SHlTbW92MEFGb0FsZTh0THZwZmpoa3FlQ0xFWTNOeHhEOWJMOHM5WHlacUsxZ05ZQUZac2F3ZXla VTFGbjA4RnNBQXN5VDRnb3NpRTVMSjJpcDgyREdBQldISzN2S1MxU2RaVU5KNEpncHM3enNFYWll a05ObmxUMFNZQWE3eURKZFVIUkVvaGJXenJ4YzlLendXd3hqbFlIVEcrNDRTOHFlZ09BR3VjZ3pV NTFyZUV0RXg3VXZ3c0xZQTF2c0ZTeGZ5V0dubGxTbVZ3YzhjMVdMRjNwUWhkR0MyeHpyVVdidTY0 Qmt2QmUwNWZFQ2dON2lJb0lXQ0JRQUFXQ01BQ0FWZ2dFSUFGQXJCQUFCWUlCR0NCQUN3UWdBVUNB VmdnQUFzRVlJRkFBQllJd0FJQldDQVFnQVVDc0VBQUZnZ0VZSUVBTEJDQUJRSUJXQ0FBQ3dSZ2dV QUFGZ2pBQWdGWUlCQ0FCUUt3UUFBV0NBUmdnUUFzRUlBRkFnRllvRXNNVnA0dXc2Y3FLMVA1TW5S NWNGOUFDUUlyclZtbDRhUnFob2Exb0lTQWRSUmhWYmxHZTJIUm9ndmFOWlVJclVHNE5hQzR3VHBm bzlHWUhnOGU5SnMwbXByemNITkE4WUUxaERnSzJTcFZqMGdEc2tEeGdaV2hVYmxEajA5V2FUTGc3 b0RpQWV1b1JsTVUvc0pramVZbzNCNlFjckRTVkJyUkxjUDFHaFdNRFVIS3dXcldtSUpmYW5pN2g1 czB6WEIvUUVyQk9xUFMrTVhCOG10VVorQUdnUlNDcGROVVNyMVdxZEhCRFFJcEJDdERzMGJxdFRV d01BUXBCdXVJUmgwUWQ0VUJ0ZVlJM0NDUVFyQlVHa29LTEVxamdoc0VVZ2hXbWVhTUZGaG5OTEN2 TXdqQUFvRXJCSTN6NEwwTmJoQklJVmpDZElNQUxFZzNnSlNESlV5UUNzQ0NCQ2xJT1Znd3BRTzZK R0RCSkRUbzBvQUZaVE9nU3dJV0x2U2JIUDdDWkkwR0ZsU0E0Z0VMbHlhSGtlVldhV3JnN29EaUF1 dTgrR0tLSWJnN29MakFvcGQvOGNhR2o4UHlMMUFpd0FvRUJwa0ZxMmZPd0lKVlVBTEJnaVgyb0Vz REZta0tNbGRWcGxFZHlkQkJYaFNVT0xCQUlBQUxCR0NCQUN3UUNNQUNBVmdnQUFzRUFyQkFBQllJ d0FLQkFDd1FnQVVDc0VBZ0FBc0VZSUVBTEJBSXdBSUJXQ0FBQ3dRQ3NFQUFGZ2pBQW9FQUxCQ0FC UUt3UUNBQUN3UmdnUUFzRUVnNVdKTW53OTBBSlI2c29lSGhJYmdkb0lTRDlYaFcxdU53TzBDSkJz dWNzU2tyd3d6M0E1UmdzQWF6a0tBL0pDakJZTm15aUd4d1EwQUpCV3NORGRZYXVDR2dSSUkxT1lz UnBCeEFDUVJyYUpnRkMxSU9vQVNDOVhnV0owZzVnQklHbGptRDQyb1RwQnhBQ1FOck1Jc25TRG1B RWdTV0xVc2dTRG1BRWdQV0dpRllrSElBSlN6ZEFBSUJXQ0FBQ3dSZ2dVQUFGZ2pBQW8xYnNDRGRB TG9rWUVHQ0ZIUnBYQ0ZNNllBdUNWaTQzcDBWVEVLREVoZThROWtNNkpLQUJZVitvRXVUYm9EU1pO QWxBUXNXVTRBdURWaXcvQXQwU2NDQ0JhdWdTd09XT1FQcTNVR1hBQ3hvQ2dLNk5HQkJHeVBRSlFF TEdxK0JMZzFZSUJDQUJRS3dRQUFXQ0FSZ2dRQXNFSUFGQWdGWUlBQUxCR0NCUUFBV0NNQUNBVmdn RUlBRkFyQkFBQllJQkdDQkFDd1FnQVVDQVZpZ3F3NHNVNHRpbWZpWGVySlNzWjZFQjNFTmduVWtE dkV2TlRjT3dZTzRCc0ZxVWM1VkMvOVNsY3E1cW9RSEFXREZERmFIUWFpT0l3QVdnQlVQV0w2NTlZ MHFWV045WmN1VFFkbHJudXdBc0FBczVXRDVqaGhVYzdOS2Rxb3J6R2VJOHBBOG52TXZWOVlEV0FE V2tiWU9Bekk3U0kyR0kyMHhnSFdrWHRYMmNwb25WR3BUWXoyNHduRVBWbHRidmNwZ3lpaFpVMUxT bkRIaTg4a0hxNjJ4Y1kzWjR4bXNzVzlxVHFlWldqQ1NVWkxWcURyaWcrQjl2SVBWTmxjMVYrOW1q YzFRWmIxc3NOcFU5V3FQSi8zSk1sV2pxc3l3azd6Zm5LRlJOYzQ5QXFQQ2NROVdXNGVxaEFwNnNU TXRzc0ZxYXpSWVBKN1RIV1hZUExVMWx0RmtlVXJLamtDNkFjQkNYR1h6d3lPcVRTNVl2dnJHSXZT RzVySTIra3VEcW9LK3hKT05QZ0FMd0ZMcEJYRjMrdHdPbVdBZEtjUHZQTk5tWUw5V1BjbUVXU3F3 V09NZXJEWkRwWEJBbDk0aEZ5eER4eUowdnJZeGFNTEtkUFExVEkwQTFyZ0hTL1d5RUt3MHVXRDVW UG9oZFA2Sm9IbnlxVGJSMTlDckFLenhEbFpIeDJtT0tadnR3Z1ZLS3hlc0RrT1BSd2dXT2tSSFdk ckdEZ0JybklObDJNUWxOU3ZuK282MHRjbk92QnRhenVPMzZWUStuaS9NWnR4cFBZQTF2c0h5TldZ d1hKMXJLK3ZvcUsrdjcyaVRDVllqaldTRmdXZWRWTU1BRm9CRnhJRTExdWlMYmE2d01ZdU4xSU1t aTRHdHB4NWNJWURGZWtKRHJHQXhUalNENXdzTlQrSjQzbE1Jd1R1QXhZS2xOY3lORFN3bXh2THM1 RkZrYUNGZ0RkT3MrZVoyZEFCWUFGYU1ZREdqUW8rNXc4Q2FMRitqSFI4NVA1Zk9tYmJWTnpZYTJn QXNBQ3Ntc0h5cU5mUTdzOHM0c0ZRMWRCcUxQdENZb1ZhWDhDSXdBR3RjZ05YV2hpdUl5N0xZR0V2 VlNOY1V5NjdIcWplWTZiZTJxRml6VklhenJVV3FlaG9tUEFuSkQ3Y0FyUEZoc1h4UG1reW11U1VN V0pQYlRMU095SzNIT3FJYUhxS3pDd1pWbXcrSFZHWDJJWngvYUdRNHc2bjVRUUJydklIVjBXSHhE QTBOY1huM0lWcm41SmZOekdYcklpeEh5bFFHZzZyTWpreFlJY2ZWWE93ckFhenhCOWJjMHg0eHlR ZnJTRDBiWmkxYU05THlaTlpSSEhDcENGZHRCcFZLcFdsR1gydFVxa1lHTlFCcm5JQ1ZMc2FWemRj aDIySWQ2U2diVWJNRmdpVDU4TEttdm8wTUR6TjBPM2RtVC9aNGVsN2V1VlBYYkFDd3hqMVk4c3Rt TUVBK1ZhUDlaYTNGWnJIUVEwczJibWVyU1prUnB3ckFHdmRncmEzdmlHbjUxOXhHVldQSFhGWHpr S0FxdWV3RWdBVmdDYlFnUEo4VmJTVjBSNzJCRkNsN1BHdFlzQXhaYTlhc3lVQnVjc0Z3eVpvMU5m VUExbmdhRlE2SnVzTEd1YkV2c2EvdnVNRFVOVFBydnVqZ2ZkZ3poSU4zRlFUdjR3bXN1WFBYWkdk bnJ5bGtnM1o5TnRGd3ZaTGVEWTBMMklwNTFWd3UxUTU1ckhFSlZsc2JYdnVjYW1jejd4b1Z2UlM2 VFFGWVBxWVF5K05adEttTWF3ZUNsMmtBV09NT3JIam5DZ1d1c0xITXovclNOU3AyNGhsUDhEd09Z QUZZQ3NCaVdzMTBtSTRNNTdGa0RiSmtHYkt5OVJrR0FBdkFpaFVzbkd1b3R6ZS9yQmEyQmZFelpP RUlIc3BtQUt4WXdmSWRhVlRaajlLWjBUUHBrOVU2QzdjdVE5WGhnd3BTQUVzWldHMzFaWFlTV0Yz SXpqRDU2ZzJOS2dPM3BucE5XUnVBQldBcEFndDNNQ0pZRFhlVXFScnI2enM2ZklheUxLWkN5L05r STRBRllDa0I2NGloa1dUQXRQVmxCcllYbG05dW1XOHRmYldYVlFBV2dLVUVyQTRWbVdaZXEycHNF elRNYWh3TFgyMElZQUZZY3NGaXF0dlBWS3FFd1JSeWtHUUdNcTNOQUdBQldBb3Nsb3JNNGVqS1Fr ZC9iU283THN6S2F3R3dBQ3dGWU5IcnZEd2w0YUdVaitUZ0YxVUNXQUNXQXJDWWJtM05JakU2S1Zl MmlYVnZBTEFBcktoZ0RUSVdLendScXNMcmZ0U05FTHlQYTdCODhZRVZIbU14NjFqRmlBT3d3R0pG QjR0ZW5tT2UyeGpXSVZtRllxelQ5ZldReHdLTHBRQXNBOVBIMWw5bUVKSjFSSVVYcldiQWxBNVlM R1Y1ckxKQ05zVk9Wa0Z6ODlJcW5NYzZBVzJNd0dJcHpHTVo1cDVqTzB5V3FWaS8xOUZZTm5jdEx1 NHp3TTRVNDkxaWNUWEZ0c2FZd0dwVG1jN1FienlmblRWWHhaUTFtOWFnZzltTjRsd0JXT01Kckhv N3ZZWWl1N2tqdG81K2JhcVdJclpLNWtMaHkvbzFldjBnenNhdnpTcXJiNE1OQk1ZOVdKVWRyTFVS YlpnY3FSNnJzYkhFRXJwNGJQSndvOHJuZzYxN0FhdzROc0k4VXErcXo4b3U0bXJkVHhldXNSdFU5 VWRnVDJnQUs3NGRWbjIrZXBYSzhHUldSbk56ODNDTi9RaGViTytEemNZQnJJUnMzY3R1emFwcXJK L3JnMTNzQWF4RTcySXZRd0RXdFFqV2tUakV2OVRjT0FRUDRob0V5OVNpV0NiK3BaNnNWS3duNFVG Y2cyQ0JRQUFXQ01BQ0FWZ2dFSUFGQXJCQUFCWUlCR0NCQUN3UWdBVUNBVmdnQUFzRVlJRkFBQllJ d0FJQldDQVFnQVVDc0VBQUZnZ0VZSUVBTEJDQUJRSUJXQ0FBQ3dSZ2dVQUFGZ2pBQWdGWUlCQ0FC UUt3UUFBV0NBUmdnYTRlc0M2S3FKWi94c3RpWjhDTkE4VU9WcXJ3bEZRQUM1UVFzRXFFcDVRQVdL QkVnUFgwSXVFcGk1NitSR0RWMXJvdnlibWdxeE9za2RCelJpNE5XTFVYTDJwaU9OY09EK3Z6RFZa dWV1ZzV0bHdBQ3hRM1dFZkNUK29Bc0VCeGd6VTUvQ1N0ZkxEc0dvMUdmNVdEaGI1SFhzQkdhWWh5 OEg4TC9XMXZobUR1a29DbEVqdExKUnNzamRRbHJpS3dOSUpNWFczWVQwMk9IZGhLUEZpMUVzOVZI bGh1OHFyN2N3Wldyb1lUOC84ekFGb0pCaXRWL0xSVW1XRFZvR2R5OFdMTjV3d3MvcmZoYmlibU9i Y0cyRWdvV0NYaXA1WElCQ3YxWWc0eVdqbWZZN0J3MUdYSHcyQUR3SkZBc0VLVG82eENrNlFTVjFO ZnZGaUpBekwxNXhvc1pMWlVRRlppd2NxU09tOUVGbGlWbUtsbVROZm5HeXcwY3J3bzgzOEJrZ05X TGlWMVhucXVITEJ5c1JlazBIVSs5MkRoYVBHaUh2aElFRmh0MGlmNlpJQ2xwMy9LVmZJZXlkVU5W Z0FOUW5Jb0FDUXhZQlZKbnpoWkJsZ0dPcnBxbHBmS3VzckJvbkxsRG05QjBjQVM0a0FKZjE1VlVj R2kyR3dGZWlRUmZ0WnI5WGE3dmJaVy9JbXFhKzMybWxwS0NpeDNiYlBkcnErVnVyUmIvTjJLd01J L0h6a0FTRUxBRWo2d3JLelFaeHNGckdiMlJ4eFpybWJ4ZjQ2cUNXYkVVc09lcU52QVJuS3BOVlE0 V09yS0hEWVdOTlNLWFp0OVdkT2NDTEFDT1JCbEpRWXNZWEwwZk03VFowSnlWRkhBU21WejdyVVNp Vlk2UWNTVDRJbFNCc0U0UWgvcU5uT0VVMCtoZGtuUGYxMURKUUNzU2tnNUpBYXNOYUdSdURCYldo SUZMSGZ3Q2VXSVR1dW9jNGl4cWFsRjB0dFRROEFpcjJwcTBDTlg2dzJoR1VyYVhPYXFrQnVzcmEw aFhqbEhIV291TCtiWWtSdEU3NzRZT2U2V0M1WWFmR0ZDd01vNUUzcjdoV2FIbnlRVnU1UTk2QUFy eFpKQTVORTNDOGpsUFZFMVlpbVZlOTVVcFpBc0RCYXZhb0s4TE1pTjRJdHo0YjBhUVp0S3hRMVc0 R0xFV0JFa0V5eGhTT1hIaDdLRlFWZGtzSEtDajBGc1dnZXpZYUNrUm9WVWFvaDN3NlEwODg4Vmtx clBGV0lwT0p0Y3pSNC9XQnFKT1hsUUxHRGxYaEM4VUI4V0E1RUJ1RFJZdFh3VGt4cjJTUENiRGRM cGhzb3dHNFBJeW5WTHB4djBBcFEwSWFrQmQyNkVHZ3ZaWUJrZ2VrOEFXTUxrS0pOcGYxeHdzQzBT V0lLblVCTVc5NnJDa2x2OEorb1dLYlpSOGE0aGtzZXE1Rm5GY0Rqc0VVeVdiTERzVUxlYUFMQ0Vs YVBNM0dDajRHQlJKTEJ5K1JNNVZPajBVRzM0ZkJIL2lZb0ZaVzdlVzBUQXdpWlFIV1N3TnV6TnFR RFcxUUNXU2p4UW54eHFSS1RBYWhiYUtGVklLc3NRL296NFQxVFVjL0d1SVpaNUQxNlNFZ25wVXFW cmV3Q3N5d21XVG5CNGpiaURySlVHSzZSWUpuUmFSeVFaejN1aWFsSDd3cnVHR0ZqQlVhVmV4TjVW U2dmZUFOWmxCRXNUZHUrWmtONFdhZ2ZFd1FvYkJ3cHRVSzNJOUNIdmlkYUlQa0hlTmNYQUNsWlIy RVdDYkR1QWRWV0FKVXlPNnFTV3I2NlJBcXRHVURtT0pKekNGWHRFdkNjcU1meks1ZjRoMFVsbzd2 dEFwQmpzSVVwTkFGZ3dLb3dickp3OHdkRkdYazJwbWYvQ21Sd0pzTVE2aCtSRWRreThKeXFSTU5K dzdsVVVMQTBQcktoTmN5Q1BkVVhBRWlaSExmekhNeXg0S1VzY0xIV293U0ltU3gzeEVRbkJja2Q4 c0pIQkVxTmFvMUhGSGJ6blF1WTlUckJDTWdFbWdkMDV6My9wUXE0b1dKWGhEOTdBajZpamd4V0lI YXdjOWwweExzMkd1Y0xMQnBadzdHY1dycHdRaGhsdG9tQ0pwQXYwL0FwbGpWSlhXQ3NueGtxOU5H RFZRSFZEdkdBSm9SaU9VTnZDVkpKS2p2eUZCa1hQUzBZb0E0dVNCa3ZOdlY4VG04dVNDMWFxWkZr WlNCNVlqWkVEOFoyaENhc3dzRlJpajRCZnpoUmxWR2dYcndLK0dIRlVXTVA1V2xWc1FiWk1zTlNS RnBlQTVJQWxUSTVxVXhtSkorVjNob05GaVQ0Q042L3FwRGx5SGtzdldpWFBtNVlSQTB2RFdjUVk4 MDB5d1ZLQko0d1RMS2xCVVJsTDFsam9jd2tCcTFuOEVmQmNpVnRrU1JqdmlicEZWNHdGVFpJWVdM ejMxRWFZR0ZRTWxwNWZYUUZTQXRZYWlkZjBMRmdkZ3NOcndzQktGVThrTnZPZWQwNjRzK1EvVWRG d2huZFpFYkEwdkVPNWNodVJ5QWNMRjk1QTJqMHVzRUlxUjRQS1kwZUh1VDJDd3praFlFbDFhNkI0 d3dKN2VMVXcvNGsyaTFjRzh1dGk3R0hVQnQydlFYYnZKTGxnNFZMQlZNQWpMckFrbDlXVGRlWkVK c0hockJDd0txVldvL05LR25DUlM2VTBXTmlpMlNNTXlzTEF3cFhNZWtFNDE1eElzSEJ4TTBUdThZ R1ZlMXJ5eFFwdUtqcE44Tk9jZXpFMHIrQ1c4cVU1ZkVpYnBjSFNoNzFzNEp1TVVMQnFRK3BSS3kv R01EQ01EaFplVFpTakJqcmlBcXNsd3F0Yy9WV0c0SERieFJCOHBKeEdEdThSYWlMV3ZHT09CRlhy Nk90Y3RRUllsRDIwR1F6MlhDSEZ5VzZsWU5IckV6VmdyK0lFcXlMQ3E5bmN2STVna25yeXhSRFRJ clVVblovS0lzOCtsK3ZDU0RXSExGZ2x5OEhZQjk2Y0krU3NsZ2VsVzZ4OUZYYU5GM09hMlhQMEJt V0xLZHkxZGczMFhVc0lXSTJSWGoyZkk3N21zRkhvR0NYejNvSTBBck1nTlVkanQxY3lxMC90SVlD aVYzSDlpd3BUa3FzV1dqZGtGeldWZGp2OXp0eXdVYWliVHJ1bDR2bnYxTEJyUndhTGVTUDNuODIx ZzdtS0d5eGR4SmMzaWErUzFnbUhaOUlqTW1FYW9WWlkzeExhNkZPd2xsbmdOY25nbjdkS1d2VEJD NWRaRzZqWXdBcE91aHVnQmlzUllNVjlCYlhkcnBiOW90cXVJWTgvVjFPcEYzbnl0WlVFdlJ4VlRY aGJFTVpXWFVUdmxQclhtZzIwMmRLb2FpS2x0ZlIyQVpqODhzRG9IVVZBbHdzc0VBakFBZ0ZZSUFB TEJBS3dRQUFXQ01BQ2dRQXNFSUFGQXJCQUlBQUxCR0NCQUN3UUNNQUNBVmdnQUFzRUFyQkFBQllJ d0FLQkFDd1FnQVVDc0VBQUZnZ0VZSUVBTEJDQUJRSUJXQ0FBQ3dSZ2dVQUFGZ2pBQWdGWUlCQ0FC UUt3UUFBV0NBUmdnUUFzRUlBRkFnRllJQUFMQkdDQlFBQVdDTUFDQVZnZ0VJQUZBckJBQUJZSUJH Q0JBQ3dRZ0FVQ0FWZ2dBQXNFWUlGQUFCWUl3QUlCV0NBUWdBVUNzRUFBRmdnRVlJRUFMQkNBQlFJ QldDQUFDd1JnZ1VBQUZnakFBZ0ZZSUJDQUJRS3dRQUFXQ0FSZ2dRQXNFSUFGQWdGWUlBQUxCR0NC UUFBV0NNQUNBVmdnRUlBRkFyQkFBQllJQkdDQkFDd1FnQVVDQVZnZ0FBc0VZSUZBQUJZSXdBSUJX Q0FRZ0FVQ3NFQUFGZ2dFWUlFQUxCQ0FCUUlCV0NBQUN3UmdnVUFBRmdqQUFnRllJQkNBQlFLd1FB QVdDTUNDV3dBQ3NFQUFGZ2pBQW9FQUxCQ0FCUUt3UUNBQUN3UmdnUUFzRUFqQUFnRllJQUFMQkFL d1FBQVdDTUFDZ1FBc0VJQUZBckJBSUFBTEJHQ0JBQ3dRQ01BQ0FWZ2dBQXNFQXJCQVZ5TllaNXBW cVRraFNsVTFuNEdiQTRvSHJIUlZqcWhVRnJnN0lPVmdMWkxnS2llbmJCSGNIcEJpc0pwekpOVU10 d2VrR0N5QndXcHBFVGhEdUQwZ3hXQUpuSi9aWE1iL0dtNFBLQkZncFJZRkFndFNBU3hRZ3NGYWd3 L29BU3hRWXNGcW9ZKzBBRmlnUklKVlpxYVA4TUlzdUQyZ3VNSENBUmF0WUpnRnR3Y1VOMWhyZ3Nm MEFCWW9vZWtHZkFEU0RTQUFDd1JnZ1FBc0FBc0VZSUVBTE5CNEJTdFVjSHRBQUJZSVhDRUl3QUtC RWc1V0t0d2VrR0t3Vk5KZ1FXa3lTRGxZc0pnQ2RFbkFXbFFHeTc5QWx3Q3NnRVZpWVdGWk90d2RV Qnhnd1JKNzBLVUJDd1FDc0VBQUZnakFBb0VBTEJDQUJRS3dRQ0FBQ3dSZ2dRQXNFQWpBQWdGWUlB QUxCQUt3UUFBV0NNQUNnUUFzRUlBRkFyQkFJQUFMQkdDQkFDd1FDTUFDQVZnZ0FBc0VBckJBQUJZ SXdBS0JBQ3dRZ0FVQ3NFQWdBQXNFWUlFQUxCQW9YckRPcTBzMm1VeWJTZ3JOY0d0QUNRTnJaeHZY akRUVjhQSVEzQjFRSXNBNkd0SStXVk9TQi9jSEZDOVk2ZlhoSGJsVmo4TU5Bc1VIVmpiakJGTnJD dFBUQzdOWWw1Z0ZSZ3NVQjFqbk56RWdqVEJCdTVrOTBBamJDSUFVZzVWbVlEQXFDYjVRd2taYWsr RW1nWlNCbGM1dXA5T0N2ckJzVXFrMldkQW5MZXo0VUExM0NhUUVyQjRORzZ3anQ2ZE9aV0d5NVFC Wm9EakFxdUM0NmdnRUZqRmZhTTRGQXR3d01YVUIzQ2RRckdDNU9hNXlhZ0tCbyt6bnRZRkFUVENq WllFYkJZb1JyTVpnMnFva0dMSUxQa2RqUTdoUm9CakJzZ2dzMWduMjh4Tjhpd1crRUJSN2pCV00z ZXNEZ1ROc2pMVW9FREJ3WEJYQmZRTEZQaW9NUnU4Vy9xZ3dIYmdDeFFWVzBHWlZvaS9Tc3hvYnMz QzZ2WTJOM04xd2wwQ0t3QXFrczNVTkdjRVhodG1KYUpqVEFTa0ZLemluWTBxakQ2ZVpXQ01HRlg4 ZzVXQUZoakxZZ0dya1JGSFJpVTFzcmNNYXVFT2dlTUFLQkhTYThIcXNSZ2l2UVBHQ0ZUQVBwd3F4 S25zWmJnOG9mckFDZ2J4c1F6QW4ycUtEbXdOS0RGaVlyY0tTTFB0SWxsNTlIbTROS0lGZ2dVQUFG Z2pBQWdGWUlCQ0FCUUt3UUFBV0NBUmdnUUFzRUlBRkFnRllJQUFMQkdDQlFBQVdDTUFDQVZnZ0VJ QUZBckJBQUJZSUJHQ0JBQ3dRZ0FVQ0FWZ2dBQXNFWUlGQUFCWUl3QUlCV0NBUWdBVUNzRUFBRmdn RVlJRUFMTkM0QSt1TUR4cVJnaElQbHRtUWs1TU5Od21VWUxETVpNODVzRm1neElLVlJyaFNwY0Zk QXNVTDFubDF5U2FUYVZOSm9Ua1FvTWdPTzQydzV3a29YckIydG5GN0NLUWE5SVFyQTNBRmloT3Nv NnJ3VFU4NkZzRXRBc1VGVm5wOWpzaG1Pbmx3aDBCeGdaWE43dmRWVTVpZVhwakZ1c1FzSUFzVUIx am5OekVnamRBaDFXUnVLN0JHMkFjVHBCZ3NiaC9NRXZwZ0VXOGZNTTFrdUVrZ1pXQ2xsekVRdGFB dnpKWUxPc0lWZXhCdlBBNEN4UTRXdDlkNERuSjc2VVhuNkkzc2EydzVRQllvRHJBcU9LNDZBb0U4 djdrd2xkbDJuQnNtcGk2QSt3U0tGU3gzY012ZW1rQ2d3cjJUY0pWVkVRalVCT01zQzl3b1VJeGdO UWJqZEJTNkYra0pWeVhwUllGQUNTK2ZCVGNLRkNOWUZvSEZXa00rV1JOSXQvQXRGdmhDVU93eFZq QjJydzlrazcrelVVQi9QaERnTm9oT0xZTDdCSXA5VkJpTTNwdHptUG9yY3hvYUh3SlhvTGpBNHRr c2pCSGlLZzlQNUxTeGtic2I3aEpJRVZpQjlHQmRRK3BPNW9WaDVvQUs1blJBU3NFS3p1bmtuS0FQ cDltWnJ5dWhIZ3VrSEt6QVVBWnJzVVpPRkJXZDJNVFdPcXlCT3dTS0I2eEFWbzVZT1JhRVY2RDR3 TEtMWUZVR3kzTkE4WUUxWktMVENucERzT2E5UlFjM0J4UWZXT2RiU0ZxaEFuMjZxTEFreXo2U3BW ZWZoMXNEaWhjc1V0ZW42WUdiQVVxd0sxU241cFJCdWdxVStPQmRhN0RCclFCZGluUURDQVJnZ1FB c0VJQUZBZ0ZZSUFBTEJHQ0JRQUFXQ01BQ0FWZ2dFSUFGQXJCQUFCWUlCR0NCQUN3UWdBVUNBVmdn QUFzRVlJRkFBQllJd0VxQUhwMmtVSTlHdS9McTc0VHFYZndob2luNEYvckF2N0RPcm81OFpYK2hR dmtCck11bWZxVFcvbjV2ZjZzWC9ZSGs5UTZnUHdmSThkWitSdWpGL2xQNEt5OTZwYlcvRmY4Ujdj cXpvMmp2N0wxOEhjSy9XVVcrc2s2eEFLekxwa21JSjR4TnYzZUFSc3M3Y0FyOXhwOWgzbHE5WGt3 WjRtNWdnSUVNbjRPT1RvcDI1ZS9JNUdyMnJpYVhhMzhLRDZ0RFV5SmZ1VkIzNWt4ZTdEcWpLd1N3 TGg5WXJRd3NyWmdtN3dENjFkcmZ5cG9wOUdVLy9TVmh6MHQvMW9xQUc0Z1BMQjVXeHFaM0R4NDha blRGQk5hUUoyWU5YVlZnMmNaczF6cFlYc1lPZVlrN0pOYUltS2hXbmpNay90SGIyczh4MTkrZkdM Qm11NXpMMXEyb3J2NWwwa0hIL3RtRXFwUkxBOWJRMEtLckNDeGJwYjdGZG0yRFJZQmlJcW1CZnNZ aUVZcG9wRnBwbDlqUE4xMll2RGpBb3FtYVRiaHFTcHBlWEZkZFhWZGNsMm5jVDJOMUtDVXFXSXVH aG1MbTZ2elZCRmEyS1pBOWRvMkRSUmpDcG9rT3RXZ0ROc0I4MWtwQ0t1SVg3em1GUFdNcjhZZEtZ Nnk5OUorc1pqZTUxazJydnE2NHZMeDhSZlgwQWtjS0FTdEZCbGpuaDJMbTZ2eTVxd2lzak9GQXp6 VnVzV2hiTk1DNHZRRm1RTWppeFkwTFQ2MzYrUG0vMDVRUkJsc1ZXeXorYU5DNWJkcUtwVC9mc2F3 enFicnVoZkxYbk1RVnlnTXJuS3ovNzE4LzJYZkhqQmwzVEwzeDRiOStHczVWM3RVRVZrMTJRSDVM b3MrcHhlTFlZYU1ueGhGNnZmMjgxMDQ5ZGRQUFZ2NmRHUlFPSUFnVmdpVklNYmhXRjlldGYvQ1FF Mmx6M1lxR3U1djJJNHNsRDZ4UXNqNzk1STNucXFxc1ZtczMrbDMxMHU1YnpvUnlkYldCbFgyRndm SWZGWk5mVzJGT0ZGaXRYc2IvRWF0Ri9GNHJuYTlpZ3lyMDE2bVZYeDZhOUsxVi9jUzZlUWRPUlI4 VnZoc3h1bUlNVm50MThXdU9RM3NQN2VyYVZ2NXMzV3RHakpVTXNNNWhzSGhrL2UzRzNZU29lNG1x RUdIZHIrNzdvcENyTTJZbFlGR2pXQW52ZDExVEVpaTVLc0hDS2t6RVJtS1R2T3k0ajQ3S0I3aU1L ZU1QQ1Y0b3NGcDVreWZ2MFpXcnVCZGpCbXN2anJEMnU0eEVydjI3RUZqR0hkUFhyM1BobVAyUThk M3FGUTJkemhTWllPVUp5UHJrMVc1cjFiM1czVE83cSs1bFplMys5VDRPSzh4VjdHQlpCb2ROcHF6 aDRlRVIwMGlKbjBvb1dEV0JtcXNXTEdTMytQdVhtOTFDV1dSYUxIWWNTSEFaWUl4WHE1Y090cndF S2p4d2ZPU20vL0g4ejZxVkgzbnA0ekdEaGFqYTYzTHVQZmphc3N6TXpnMnJwN2ljKzNjNWtvcUxr NHdwT0lQbG12MTZOUUpMcnNYSzQ1TjFCM0orOTk3Yi9ZYkhNK01sQVZyenY0R3dZcmxhRkNOWS9x d1IvZU1zVGFPREdhYVMwY1E5MVpLV1FNdFZETmJSUWg1WlZDaDE4c0E2UldLcGdWWXVyMDVENW1X R2hWN20yTUFqTjZGSCtCVmtzeGd2S1FPc3ZVSnJaWFFlM1BITW5qM3Q3ZFBhOTZ6L3licE9WMWZC K3VyaTZoUnNzZlk2VjljdGtXK3h6R2N3V1FTdElmTnVBcFAxT1JSb25mL3JHd1F5eGlWMlAvY2x6 MUFlamRXaVJXbXhnT1hQeWdpNWdWVDJ5SERDTnB2TTlvMGx6R0taTFIvNkM5OS8vNFJmN1U1TEZG aEhpK0lHYTRDMlZJemZHMkE0WXJLanA1aHhJQXVXNXo5V1BZWEFhbzNCRmU2bEE2dlorNTBIODlz M3RxOWZ2MmY1bmozckR4eG9iMSszWS8xMVM0c3pYU2tweUdCMTVaY3ZtYkRhR0FOWU5GbWViOHpz SmhCWlAySGM0a3cyMU1LMFZYMzMwL05uem1DdXpwMkxBU3p6OElqSTdUUHJUWU1KQWt2dEswa01X SGtXeEZSUUp6NDBKd2FzbytaNHdVTGVqdzdZQ1V3RFh2NjhzNWVkamtiQk93Mlc1NTlXdHRMZVVw YkYyc3NtRjJhN2pEdW1iZHl6ZnRyRzVkYzkrT0F6Q0t2aTY5WXZyMTdhdnF4cnI4dm9kTGdLbGo3 N1dKSnhGK0dxVndaWVoyaTBQSXRvcnU3dG5zbU5EMjk4THVnUHJkWXZlUml1elBMQnNveVVCTyty ZVRUb0FrZjVMOFFqczgrWEVMQXFUcndmS20xZVFzQ3E0RTVNOHd0VkpCTXNNdlZILzBHelJmOTlp c2s5MEdtdFZoYXNiejdDQkdIUndkckxteEUwOWoyNGNjK0JqUWZXRlh3dzVkQ3UyUWM3a3g3Y1U3 emlRSEduYzYveFdINUI1dDNsUytxcVgyRU1sZ3lMdGVnTVFjdmoyZDNOZUwwdkJRZUozNWp4RG9l VzlhVWh6em5DbFh5d0xDTTZIbFk2a3duSDdqUlE1b3lNeEpCbDh1bmpCeXVOc1ZaK3Q0V2liRzYx anJaYXR0akFvbmptVDhlQnBZNS9Tb2VKcWU3aGFZRE5oSDcwTVh0b0pRUFdTbWFrS0FPc1lJYmRl T3duR3c5TTI1ai9LNk9USGhVNm5VM0xIcHpXdnFIcmtPUFl6NmVYRjZNQTY3SFhISFRvTHNOaXBh R1FDWkYxM2pPVklhaDd4aENPMDJsNVB2M2lHOTFzcUdYZDdUbHZSbGpKQjh2Q3VVR0xQc3VVa1dF aUdoazBKNUtzRWwvOGVTd0xNVmQrWHVDWHBpVm9mYWdRTElSV1lXd09MMHJtSFZtbDYxZE51djVq VGlURGNBcWJxK3NIbUVNcmJ4cGlMUll4Y0RHQU5kdlZoTG42eVRLSHE4bHBuUDN1SzFQMk80Mzdu VTBMQzVDOTZydDcrcEs2cGNYbGQyOXc3a3FSYTdIU3poR3lQUC9LNEdOOWg4NkhucWZsK2ZUVFc5 aFFxNnA3M3hEaHlueGFIbGdjVjZQREkzb3RDakVHQjRkSENGcGFtcXpoUklDbDh4Mk5GeXdMWnFn d0pBdGlKbWhwbFlJVlNFc1lXTjZCQWV3R1AzNyszNy95WDZ5K1BPa3Aya01PUEhUbi8yTVBmb1d4 V0V6MWczeXdVTnkrYnVOMUc1K1o2RVF3WlNZOWM5MTFmM2h3eDBGblU1UFJkY2g1N0EvRlM1YStu cFMvck1tNUN4dXNYZ3pXMmVoZ25VTm9EUTB4QWRhOTNYZDR2dkhpN1g4bDN5R3B2VUovNzJOQ0xl dTlwU2V4dlVxVEI1WTVnL0ZSMmFiQm9HMnk2REZheE1pWXN3WVRZckUyeFFrVzRZcHMvWlhtOW1Q YjVkY1NIMmc3SVk4c2NiQUM0bUJSYnIrL1VJZmlLMHVlYkZkSUQvdThEejNLeTJSUGVyNmY1T092 ZitUcklSTnkyR0sxeXFwdUNGb3NaeWF5Vjg5TU5PNTNiWGh3NDdROUI5WWYyRE50YWRJcngzZnRh dm9Wc2xkTDcrN0ZyakdGVTI5MHNNeG1GRFY1SG1ZTjFxdGJQUysrZFBpRysyNy83bC9SLytJa0R0 ZFJxUFVHSFdwMVQvVmdybVNDbFozQmpBdXpoTGtGYWhpUlJaZ2JOU1VnNjlEaTh5bWRoRTZ6a1RR bEcwMVpkTHhCb1JzOWQzT2hMRzhvQVpZL1BNYktjd2REcjZNN2kvSmtndVdsYzFhclZqNzZONWFl cjJDTGhYVTlFN0lMd0tMSGliTEJPdVI2cFgxUCs0SDlScGN6YVdQN2RiUldMTis0d1hqb2tMTmc0 NUtsNjR6R1hTazhySHFqVzZ6VDJMVzk1Wm5QUk83V2h6MG52N2I0aHNXSER5Kys0ZTBIdm5zU2Za OG5GNTN6ZUw0OUg0ZGFWYjlPMjRxNW91U0FSVEhVaUlSU090Wm1aY2Z2RE5XK1RiNFNKV0NaUCtS eGhMaks4d3ZIaERvS0Iwcm9FeXBPaXhYY0JwSFNDY2VMTzIzeVhDRWRwWHY3Ly82dG4vSEFPb1Vu ZDA2SmdjWGtVZVdCaFN2WkhRWElZR1U2ZGhtVE5oNWd1S3BlajhhRHM0MnVYYTZGNVhXdnA3Z0VY UFgyeWdQTDgvc3FKbkxmUGVUNTd1SWJpREJjZDcxNDg3ZlBlRTRpOGp5MzRGa2VGR1VocnVTQlZV STdRajNMbFZrN3lOMTRQeUlMK3hqemlEWitUNmcyK2N3eGcyVU93VWhyS3d4TE42QWZERFB5aHJv OFJXQlZoT1d4S3NKVEVSWlpGZ3ZINlNScStuamxUWHlMNVJXM1dDdTlkTFFmRmF3cHpBS0ovU25Q N0ptMnpybmZ3WEJWdkh6NSt1WEZxeDJIbkp0WHV4eXZGUytadm9NazNIdFpyT1JZckRRTTFoMnN3 ZnBYejk4ZU9Id0RwOFdIRnkvKzJvdC96VE9uL2ZIVHZGdmVzVnAzYjMzejlPblRGMlNBUlpuSWJk YU8wSGZiVW9KWXl0RHJLTTVtamVBYlBoaXZ5VEw3V2dLNnVmcFl3YXBnMlBINy9lRkE4Y215c2VG WHJHQlJPNW1EM0k5T2tWaVN5eUxQRlRMSnE0K2VXdmwxRHF3QmtpSU5CK3RuSzVrU1pqbGc3U1dU TlozVERyUi80RFFlWEw0ZVliVit6NE5KU2V0KzB1blk2K3hkK3JyUjVWcTN0T0Z1MS82Z3RaSm5z WkJyZTJ2cmJpdVRhdkQ4OGVUYlBMQUlYTGZkUnlLcjBxRW5abmEvYWk2bFRwKzJ5UUFybS9nbk16 TXdIQ1NKaHNIQkVwT2UvZ0ZHY2RaZ0VMOTR4b1FsT0pWbGl3MHNMWjFiWitadHFBOVBTSkNGdmpr MU9qRXZWckFvbTVaemQreWJiYUxaMDUxcE1zQkNneittNkhqVjg2dSsrYzB2Zk9Gbm52OEppYkcr Z281K2svNllkQTlUU2hNZExFd1YrbkFtVGR2ejRINDBNcHlHdVdydmRCbU4rdys1VXB4VC9sQmN2 TUhwNkN4ZXNlUmRvNENyNkdCUkNLeVR2N21YSHZXOXRQWGsxaS9lRUtyREQzalNzSDQwZEVkMzFh MmxGRVhKQVN1TC9LUXlGZ21QQkxPeWNjME14WVR5RkdPeVN1SmNTTGJKaDJMak1ibko5eVFlVis0 OGZsQXREaGJ5Z21iMFY0WHl6THVPQlNlUHRXQTczZmdPYXVVbkl5WUZsM1QxdDY1NmF1VWpqM3py ZWpRcWZHcUFEOWFmSHZyV0k0enVXZFV2TTNpZlFpKzcyYi9yd1QzdFNTN2p3ZlhJRVI1WXY2R3Jh ZGV1L2E1ZFRXZC9QbjFKOFRhSDhkMFYxUTNMbkwwOHJPU0M5VEFkWW5WUEhUTGpFQXNGV2VRUDFt UTk4UitZcTlOYmJhOVdXVzhab3FnTE1zQ2lUTVF5WmZuWllKM0xMT2l6ekF4citEVmRmTDV3ekdj aTltOXVkZ3hnZllpUndRODhqNHdLYlppd05IR2o1U1lVRmlvR0t6ancwNFpVTzZUdEZJMzR4WU4z cG9hQkpCR1E4WHJvVVF5V1lJYndUNU9lOG5xREZWcXRzcVowcHRCTHVWd0hEeHlZVnVCMEZHQ0Qx Vjd3SGlrUlRkbmY5UHIwSlN1VzNyM2Y1VnBZVjE3ZzZCVW9LbGdYVU1qaytZU0FaWjNwZWV1MGh3 dXhXTElXZiszTlVuUlMyby9PbzZHajlZNnRGeTdZMHFPRDVjK2dVNlMwUDZRaFlqVE1wQnBNSmR3 WmNZVHVKRHRxTnZsMHNzSENZUk4rdkhRR0ZQdEVQQ21ZSnhwcm5VQUVvTC9NU3NIaUt2M01ZUWFL a211eUpnM1FWWDRFSzhJTkRSYXVZZUJpTEF4V2NJRU9YVk1qRnl6akIrc1BMTzkwR3ZOeHBxSDRO YWJpQ2cwUjE2OVlVYjFpaXRHWXY3Ujhtek5Hc0d5SW1aTTM0aXdXVGpXY2Z2UGsyN2U5K05jdi92 Nkx2Ly9HN1F4Wmg5OHUvUkVhQ1Y0NGVTc3VBWnp4MWdXYkhMQUdDVDI2RW1ZTVdCSWUxbytZQ0ZP bWVPWjFiTDRXK3UwOUxiTEl3bURsbmFDakpodlBSdUUwbHJqTlFtRG9TRFpDNlNRMFUrbW5EYmRQ L3JEcUIybXdXbHZaOGo0TUR3MFd2YUtRRDVhWEtkQmk1cXBsZ3BWaTNGQjgzWjROVGxmU2Nqd2tm SmZKTEJ3aXNWVjE5V3FqYzF0NVE3NnhMM2F3UExlUThyNzVuamZUdHY3bWhzTTNlMHEzbHBaNjBy Z1E2eVE2NTgvbVArSUkzL3BHcVR5dzlJUEJQOUdBVURENG9lTXFGTDRUWnprYWw4RmlYV0JQaTV5 aElRYkxUUWZsbGpDQVJNblNFbC80b1hLd0dOL0haTEQ0OTgwU2x1ZVNkb1ZjajRaV1BONmp3Y0xy SmZxOUhGalBlOWtWMEsxTThZTmNpK1hjc1A0NkZLUWJrOXFycTYrNzdpQmJ3T0RJTEY2Q3dEcUl3 R3BveUhmMnBjUUdGa1dkM29yQnFyTGVlcDQ2ZmZMMnc0ZHYzNHBBT2wzNkJPTU1GejljK244VTll ZXQrM0JLQW9GbGt3WFdNRUZxbU5qNURGT1dpRFhMTnBrd1U4T2pDVEJZbUN5VGI1Tk5EbGpJQUtG NG54SVpBRnJFd25kQ29qOE9zQWhNckNkVVUwRlZ5UFNGazFxRE5WZTAyQmpMSzRpeGtLdjB0cDdp REp1Y0dDdUZkb1diMTEvWDN1bDA3a0JnVlMvL2dLbGdhR3E2dXh5Qjlld3g1QW9iR2dxQ3JoQ1py cjYrNkdCZG9LaXRuMkFuTjlYemw5Ti8yWHJmNGNVY1dEUlhkNzM1Sm5YaFF1bVA3c1VwQ2V1TTB2 VDBkSXNNc0VhRGY1cE13Z2g5ZEpqSlFNUUxscUN3d1R6czgyV1BIYzJtTlNZRkZvNncwZ0o1dXJC b0trMmNMTUpnb1R5d0tqaG9iTzVDUWE2S2lrUmU5RkVoTVZoZWJsRUZBMWFJS3h5Z1ozS1lFTjdi S3NjVnB1QVAxNVRxcGN0M09KMmR5NnRYVkJjbk9WeUhhTER5aTFjOFc1NWtkRFd0bTlDUTZlQ293 bHpKQVF0Qjg2V3FLdXR6cGFYVTZUZi84clhGSVJicjhJdi84V2QwenNtcEpOVmxuU29YTEowMFdM b0VnY1UzV0dOSFMycGFmSHlKRlJJbWtTRmhZVEJCeWljcmo4bERpSUQxdm9MTU81Y2hQWXF0bnJ3 U1U4bDBReXNiTjdVR3dhSmJHdzBFTFJZQjcxUS9WeEl2dzJLUllHcS9hOTM2NG5WRzE2RVZPRm92 em5jNlhDNmpjMytmSTMvNmtzY3lIYzZEMWM5TzJNeFpyRDZpcUdDbDIyd1gzcm9WZ1hYTHlRc1gv cS8waWNVM0xMNGRwNnIrajdOWU4yUG5WL29FbWFXdXN0NG9FNnlTd2FCRHpEQUpJM1F1OHNJUElt TTBib00xbGwzajgyMnF5VDQ2bHQzaU0yV1RmNnRIWnlvUkJhdVE1QkRFaG9DRm9tUXBCb3RucGN5 UndhS2lnOFVVSnpQTFU3bDBReXZmWWdWZlp5eWJUTEJTVXB6YjJ1dCttZUp5RkxTalVXRDE5S1RW VTQ2dFh0YlU1RExtUDdiMG9ORlIwUERDM1lkY2ZLemtnV1ZMdGoxbnRkNDZoQkFyUlVOQkhMd2pl V3pFWWkzKzJtL2V2R0Q3WGltZG02OTY1N2ZKQ0t3ZUdhUENiRUUwSlJpeWpZd3l1QkZ6cHJqQW9Z Y1lMSFZKUzQxZTE4T042azArMzdDT3pwU0pna1hDcVR6UnBGV2hXTktCZ0hWQ0NWaUJ3cUF2akJj c3I1ZkxrcklXNjNuU3RjSExCOHZMOWpMQ3pyTzFWUzVZaDV5cjExZFA3K3hxYXFwZXYyVEZpaFhs UzVmOHNucDZQckpiWFVuNVR1T2gxMTlvU0RJMjhiR1NDZGFGMHZsVzY4d25QTW0yMHZ0dVc3ejQ3 ZHNmdVAyQkIyNi9iekVUWW4zUGx2N0g3OU5sTlZXdnp2dGV1c1VpQXl3L2NYZGFFclZiaE9tR3dT d205VDVNL2xKc3NHcDh1cDZTbXJCb3FrSy9DZGt2ZlhhMnFDdkVTT1h4UXZjVDZoT0NJYUE3SEt3 SzJjRjdDQ0ZGd2ZxR3VNQ2lGOVBqVWdabXpUUFBZckZnNFVscE9yZ2FZRWVRc3NGSzJXVmN1SDdw ei90Y3ptWFQ2NVlzV2JGa1JYWGRpaFdQYlhPNG1pYjJOWFYxTnN4cTZIVFNNVHVyaWRIQlNrKzNw WmZ1czk1cmZlZU9QNWVXM256WDF4YmZkdHRoTEhwTWVQaStaRnY2OTVLWnlVVHIvR1RFbGFVaU9s Z1dFNTI0dE5BVkRobjhWMGFaYlB3Z2wwaFZsblQzWmV2RXd4UHpHQXJmYmFMQk84VjVON1plaHA5 bFVGT2hGc3RQb2pLMUlyRGNRYkRZRWFDV0VsR2VqRkVoT3k0a1pERmduY0lST3Q5aXRiYXlxdzVi OGZseXdlbzkxTlU1ZmNuMC9LNCt4NFppTkJJa2VuYkpZMGtUanplNVhBZTN2ekFCQmZSOHFwQ2ln bVZCWktXLytZUG5xdkRhd2FtbFcwdDdibjd4cnNVc1ZnaXMyNUh2SytXcUh6NUo3a0VHU3daWWpM OWphbWQ0OWUxYVpsbzZpdzZ4OU5sS3dUTDV4bUorVHpoWUZzblpIRm9WYkZRV0gxaFVhS2xEREpv VTdQOUlHNmxXSm85RkxGVFFZbkdOMlZoRkI2dVhNVmxOeDE4dlhsRysyZEhVdGV6bnhjaG9QWXUw cEh6Nk1tZGZueVB6c1ZuUHpqblk1VFR5dVpJSkZrT08xVHIvazlMUzVPUTNiMzNnN2J0dU9IeVl6 T3RZM2t4UFRyK1hNVmd6aysvdlFaSURscDZadUtGdnRybGtaQkNYTjJuWlpZYWp6RkJ4UkZtSVpU WWY5U21ZWmFSakxJRXJUS016RUZJeWsxbG9TaEZZNmlCWWVVZkRFNlN5d2FKWk9VVlBBT0lHV09K emhReE9iQjlKMmFOQ2ttVi9wYnk2YnVrSFhVM09wb0pmbHBjdmJTZ3ZyMHY2WUdLdjBaWGlMSGhz MXBidEcxNDU1blEyOVRKWXlRWXIrY2RWOUtEUE92L1cwdVQ3azVPVDczL2lnZnR1V0h6NHRyZXh3 WnBoNVF6V1dvUlZoUnl3UmtueFFxQ0VmZnlqdUNETGxKWE4zSHhxaEF3SC9WbUt1TW8rYW01cE1T c0ZTeEM4UytXdkdOOUlvcTRUQVNWZ1diZ2d5c1psM2dXcGhUU21oWU04aThVTjlscFppelVnQU92 NUFhN3hETk9IVko3RklsVUxLZGdaMWkzZDREQzZITDNMdHVVbjVXZXVSaUE1anZXNVhNNXRFMlp0 MzdKOXpvN1ZUbU92YkxCNkNGZy9UWDZEWmVlZGZlbWwzN1A4OUh2emtwUC8rZmI3N25yNHM1N2tX OW1DK0puSlA2ekFXaXVuZ2pSamtBWW91R0NDQ3ZhYVlSZGFLRnBPMGJOSkZ4aWVlelNnQ0N3L21h RHh5eVRMVERMMVdpVmdCZk5ZbUtZaWtVV0dmbm5yRGlmUkxiYlp6clhvYjc3RnVsNVkzVUEzYVR0 RmFnQmxnTVVxWmFKajIvUWwxZVg1dlYxR285T0JmenVORHNjSDJ4YzZqYTczQ2hwbWJaODFhOEtX YlVaanIxeXdLaXhZUFQ5SWZ0WEt0V25ZbDV6ODA5OVlMT2svU0g1ejNnOTY3cDgzazRYdSs4bHJD VmR1T1dCcFI3U1lJNjFKYkVoRkZ5eVBabzhvTURzNlUwOUFIY1B5NTdBRXFVNUkwZ216SkZsdU9w V2FGaXRZYVJSLzFZU2FONmZES3huVnlxeWJJVFh2WHFaM0ErNWgyOHJMdkF0aXJBRitJaXNtc0hw VGtHRjZyUHJaeDE3di9KWExRZVE4dG5wSHc0U0diY2lJSVpzMVo5YVdXWE1tRkRpT00yQjlWUjVZ bHA3azczTXRRSkEvL0g1eU12M0NUeTBWeVRjeXFRYnIxT1QvSmx6SkE4czhRaStZOEllM2FUQVBF NjdNV1NZRlkwS2RUeGRBanRDbUVLdzBPbVR5aDJSR0xSS09FQmU5UjV2TWl6SlhlRFJORU1tcmFV eHRoYkxMWnBpNGZZQWI4akY1ckZPblRnME1YTStiSytRMXpKSlY4MzZXTjZ1Y1luUjAxcFUvVzEz K3dzS0N6ZzllMjVDWmYvZUVDYk5teldySVJ6Ykx1WG5LMmM1WnN4WnUyZURva3d0V0QwMldwWFFx dDVnZWgxbzlwWitSbHlwK01JK3haZDN6azMvaFJsU3RkYnNueXdITHdpeVlRS1pyV1BoRE9abzFi R1p5NzdFSDRHcGNnVlhqVTdadW5abUU5b2NNQlRGWmJ2RlV2RCs2d1lvR0ZoMUQ1UVZObU03djkr K1VtOFhpbHRqVHkrWnhzeG5pQ3A5bkswYS9kZFAvY01FNzNlTldkdkIrbGwrd2tOTFU5Y3JDdW9a bm41M1EwRENoZWtMRGhDMnpYcGp3d3ZZNURkdWNyb2xPby9POWQrZk1tWlUwMFVXNE9pNERMRm9W UDAyZUVld0FVbVY5YWVvL2tuK0JJdldlWkNiVllOMzlqMytNWXFvUVY3TEF3cE9COUppUEtqSHBl UjVnbUFtNzhPc3hWN3piV29aeDZ5SjlRREZZRmpxSkVFYVc1WVJJVHhDdG5JV0ZrY0hTaHMzd1NI VTVrZ2FMN1k1TWQ1b1plT1FMSHM5TnJPNzhMM1pVMklwM0dPaHZQVVg3VEJtWmQ3N0Z3clBMVHVm cXBBa05kUk5lZUdITEN5OU1tTkF3cC9QZ3JDMXpKdVFmZC9WTjdPdDdiOW1XaGJNMk8yVmFMQkkw SWJvcTF0NmZQTVBLNjdWbWZSV0ZXajFyNS8yWW5pVHMzajF2M285cHFpWlBMcEszeEw2RUpRc1BD VE95ZGFPam80UDZFYVoxQTdjRUxNYjVRVFFZMUNrTHNCaXd5RHhoV3JBUENFZVdjRVdZRHZ0YUxm TlNIR0FWaVl3U1EycHFaS1FibUF3VnN6ZkFQZmQ4M2VNWitwc0hmL0NYZzdWeXRmSHk4bGhuZTBQ VTVIQWVMRWhhdUhETzNYTVdKdTFZMXR2MTNpc291RnJZUk15VTg5aWNoYk0yT0dTQzVhNWdoY2lh eW11SXhZUmE5SERSYW4zanM4K0tHS3hrZzJYT1lOczA0S2VXUFl4VU1zak9PZVAxRlFxNkd1QmV0 cjVONW5qQVNtT0dnZ0YrUTZ4Q2ZDQk55MW90TmY2QnlOTXlvYjF5c0FSdE1XMDd3ODJaak1YUWsv clpPaGc4QTRpL1dQWDhRNkhyNnJIRjhyYTJldG1teWRpd1JRZUxYeFZLa3ArOVRXaElPREhsMkxG RHZTNzBXVy9mZXdWb01FaXNWSit4TDJuT0hBTFdjUm11Y1BMYXRSeFp2MGorTjM3dlVZelQ5NmRX NFJyQWwyNUovc2R2SnpNcUtocVQyVzBHazJVU203TUxVQm5LdUFvTWw1aDh5anRyMFlzcExPK3pL Mi9NbEFWYllRellDWG9wanBtcWNOdG9HaWdkUzZCQ3NQeWhmUUh6UXBZV0ZzcUtCQ2F4WnNqclpm cjQ5YTk2NktHYndzSENXUzJ1UTdlY1BOWlpZU2tNb3lhWHkyaDB1VndUY1piZFViQmwxc0ltSXdi TGNYRE93amtmT0FoWHNzQ2loY2h5cjAyZU4rTTVmb2RJSy9xb3N2NTYvdVI1dnl2aXNDb3FXaUMz UDVZWlowV3p3Z0F5azJXR3lycXdxTE43QW9INHdLTEo0aHNUVWkyakUwd0NVTVF4NnVTMGpFd1Rt d0NrUk45cGRuTVU2clF5QTh4SjNQUWZqc3pwTFhSV1BiVHkzOFBBYW0zMXR2WjdZMGczbk8wVDEw Uk9mWTVsRXhadTZYelBPUEc0MDdGanpzS0ZVNHpIaWFLRFJYSy9hOTAwWFQvKzRieGZUSjJKMEdK bHRWcWZtL0hiZVovOWxtVUttYXV4c1FYeVcwWHFTTDVkTUZsczBlTmVSbGtKNjBJYU8xaE1jc0Z2 NFI2K20ya1BhU1BmYUI3bHByMmtQKzhTZkJObU9UUFBvVk02M3VDT2NUUlpUejF5cDRDc1NjOHp6 SEhUaWdPS3dKb29sTEYzNGZZNWN6NDQ3blQyWnM1Sm1sWGdQQzRYck1tQ0J0R2pveitjOTlrdGI4 eDg5U1dNMWE5Zm5UbC8zMy9QKyt4M1l5eFdZeGlyQmRvWW10dVMzakltVThhZ24vUjUxK216NkVY UjVzQVZCQ3VRcG5zL3VrNWNDZlpGWGVFQUY1ZHpCVmVybm5yb24rN2thZFU5d1VJL092MGVzOFdh S0tKZXgrb3RDK2ZNU2lvb1dJZ2NZZEp4NTBTWllMRWVqcWQvbVRmdkgvL3liOS8vNUpQdi85dnZm amh2M2c4WEZQR1lRdEpxdFRHMTR4NmwwZUpwUkU5ZG1XZkU2emJqUGhFRks1MDdMM0NWZ0VXbjNl bTlDYjNzSnF0Ly8zZ2xYeC8vblo0bGJNVTdETkRyZW1JQWkvVjhJbWgxTGRzeUsybk9MRFJNbkRQ bkZjZkU0OHJCd216OTRoL3o1czM3N0IrLytKZmZMZUNvNHJDS0VTemN5aStEaHhYYmhmVEtnaFhJ czZpbHFTcjgwQmE0V2pUSnk2MlJvQmVpOW5NZGxMMVk3RHBDYnl1Myt4eDUyU3NEckNCUW92WUt4 ZWtUanp0V0p5RnZpTkRhMXN2YUt4bGdqU0Zxa0pzTEFhdG9NbzNTV0RoVFNzQUtrTmEyZzFqYUsr cGVrbVNGM1JRVnVKbzB5ZXZsZGczZzlzVEVZWHdyMjQrYjdaL0ZUQ2l5bFZ2Undab1lVY3k4NFBF dTE3S0NiZHN5TnpzNWV5VURyQVVFSGhHTkZTMFlDekxGcDBxclZjUFd2WmMzeHVKeW5xMU1SWXpY eXllSUNiMzYrM2xSdnF4UjRjUm93aGJyZUovUjRUUWFIWTdqUWE1a2dTV2xCUXRFbUNKY0FWaFh3 Qlh5bUtHdDF3QnR2eGcvR0J3NnRqSlpMK1Znc1NVTVFZNk91NDRMRlJVc2hwVUZBbW5GcGNZZlJB RFdaVlJ3cnkrMjhyMlZiZEZBNzdyS1ZNTjdHY05GVDFUalA2TmRXWnlxNDJGVWlTbEtsa214QUt6 THBrY25LZFNqMGE3OHE2K2VQVXQra1Era3MvUnY4bmxrL1NyS1pFU2hRajBPWUlGQUFCWUl3QUlC V0NBUWdBVUNzRUFBRmdnRVlJRUFMQkNBQlFJQldDQUFDd1JnZ1FBc0VBakFBZ0ZZSUFBTEJBS3dR QUJXbkhvMHdhWEhxNzhqMUx2b1Y2aW00Ri9rZzJpMTFMVmlMalgyQTFoWGpiaDlMTm5sV3dQY0Nr SjIyeSt5bGIzM2Y4bjZuQUZ2bE1VU3N5Tm83K3k5bkE3Uk8wT1RQVEdscmpWZUZrVmNrMkJOQ3Za TTgzb0hndTJJNkRYTzNKcEJab0ZPOUYzcXZ4T05xOWw3WFU2ajBlbmF5NUUxUmVwYWhib3plVEhv ek9kMUdkYzFDeGJUWW8yelhGNjJkWHR3ZVQyQmlwQ21HQ3phVXMzZTcveE93WTRkQmQ4eHVtYkxB R3ZJSTF0REFOWlZCUmJUYTVUemZBU3lBVzZOS21uenpqYWI2VDgxb0JnczJsck5kcmwyTEoxZVhG eGN0OE5sbkoxWXNCWUJXRmNaV0Y3ZUJoUThROFV1Zi83b25vOC9Zcy95ZXBXQnhZUlhzNXVhMXJV dkxTNHVMNitidnZDNGl3NnhJb0MxU0Q1WVErY0JyS3NMckg3ZVR2VjBQeGsyN0JxZ055b2NXUFhV eHgreHV4SXFzbGpCbU4yNWJWcmQrdnpPWmZsMTFkTzNPVk5TRUZjUndUb2ZTdGEzYjlsM3g0d1pk MHk5NVZZaFZrUG56NStMRVN5TGYzQndlSEJRTndwZ1hSS3dXb045aXJqV2ZQMXNPSS8vZU9UT08x ZWVZdTFhYSt4ZzhRYURUY2ZxMXBkbk9wek9yc3lHNnVydnVEQlhVY0Rpay9XTnFmTnh1MGVpcXQw enZ2MHBqNnU4dkpqQUd0V1BaT2dIL2FQK1FYM0dpRjRiNTEyMGpabXZCYkFvZDZnczVqZ3NGci94 Qjl2Zm96WG9INzByNy9SODgxdlhmeVJ2MjdoM1JiRGEzOVRrMnIrTEdLek02WHZ5SGZzUDdkM2wy RkhlME9ra0c0eEhBT3ZjZVI1WlF6TmU2aVpJa1U2MVZkYnVxdmxmNU13VkdoU2E1WU9semNyZzlV dWpkRmxaY2FGbGE4a3V1UmJBRXRzNVZXa3JRTkxFdGpXWWNRaTJiS2NqZGtUWXluL3lZTExreFZp aFlPSGt3dXgzRDM1bnluNm5jZi9zcm9MMjZabE9uR2h3TENzdkwzQ21SQU1yTDBqV2phOTJXKysx dm5IamZLNTllMVgzcjZjR3VaSVBscmtrSzlUOStabDlTNVRwYUUxQWYzV0JsZmFoWDBFelAvRXRl WGw3RGdpTW1ReUwxY3JyYytYbE9xcXh5UVlNMXQrK3VmSWp3dCtwR01CQ3hzcG8zRnlROU14MUJ3 NWN0MjVINTZIM0RqMjRkRnErRTNHMTE5RlpYcDRwQXl5T3JCa0lxM3V0TC8wTkVUYXptMFhMMmoz ZjdEbFBjN1ZJTGxpV2tlQStxS01zWWVic0VlWGQrYkt6QXoxWEUxZ1duYkwyb3hKN1BRZkpFdlI5 andMV1FEQU4ya3FuNGIyODlGVS9BNVpuNkpzUHhlSUttVEdnODROMTdSczN0aytiMXQ3ZVBxMzl3 Y3k3OXl3dDN1RGF0ZXVRMDdXdXJ1RTFZelN3ekdjd1dUaUNuNC8zQXFqcXZwR0VWZnZlWVhjR3FP cCs5YStmWXF6T0xGcVVKZzhzeXdoN1M2aFIzRjU3cElUKzJqL2lqd01zOWRVREZzVmc1VWRpR2li YjRnSXJ1TkZKTEdEeGVvc3k0MEl2MzNiMTkzOUV3UEo4L1pGVGNrYUY3OUtXQ3BFMWU3YnhlTkkw UkZYN2dXY2VmUEFQNjl1WDcyay9VTDcrTmVkK2w4dllsMVJlOTNwS1UzU3dNRmw1bnIrOVFVaXl6 cVJqcWsrL1BZUGJHS0Q3VmJObkVjTHEzRGw1WUZrWXkyUWV6TW9hSHFRYjFOS2JBbGdVMnl3VVlX VmZOV0I5U0t6VWgwelQ5N1FLSGJPamZSeGdjYnQwK25rcWloWmpDVEtqM2xZdW84WHM5a3pIV0I3 UFRRU3M2QmFMR3dQT2RyN3lrNDE3TnY0a2FjTXJ4L2J1bmJJNmM5M3k5ZXZMTnp0Y3h2eDErYTgz VkQrMmpJN2RJNEsxQ0pGMTVyem5qbTU2YjZXSHVVRCtTMXlvMWIzYk0zVHUzRG16V1JaWUZHT1hC a2ZJRmw2am8zNnlBUURaZDhRL29yQVBiSFpOejFVRGxqWnNWd3JpR0F2ejVJUEY3YjVyMmNuZm96 RFc0SjJRdGVvZXJzWDJJd01mRVV1MWl1MjgvYTF2MG1EUjRYdFVzRGl1cHV5WjFyNHgvNnpUd2V4 eGFkendoK1diblM1bi92VHk4cVU0d3RwRmIyY2ZBYXkwUllzUVdwOCtUSHUrN2pmUTkvSHBFSmJu MDA5dmVaWHhoOTFUUFc4aHJ1U0JOVXcyZ1RNUFoxRDh5TjFrSW50WkRtWW9lOEpIVzlSWEMxaGFa Z2U1UEl2V1g2anpxeXZNakJHVFExWW9XSUcwblRKM0lSUWRGZUpFNkZOZnVQT2ZHUDFzMWNmRWdO MHppVG53elgvL2xMWllaTXNjbVdETmRoMzZ5YlJwZXpZNG5NNzlHekl6TXp0ZmNUcWQ3MjQydXB4 SjA2dVhsbGNuZmVCc09rVDJobzVrc2RMT0liSThIbnJ6eXFwM3ZqSDBEV0t2Y0xpT0JoUjMvSm8y WkZWZjlLUWhzRTdMQU10UDBHSDNjQTRPRXhteU1wVFZSNHo1U25SWEdxdzBza0VUYnZhT3pKVlp5 OXVva05uTFY2c0FMSGJIcGlCWWVUWjNrVjhySTc4MWlaNkJmdXJqUC9IMk1jSEhCaDc2QXZQMVNR OXRzZWl1MnpMQjJtVjhjR1A3bmlrT1kxUEJnOHR4OEk1YzRpRVVXeDNDWEczYmZORG8zSFdJMmMz K2JBU3d6T2ZPdlRXMHI1dTFUTGN2ZnZ2Rm13bGNmenh6eHZQcEY5OGdvVmIzZk05YjVyUTBHV0Na Ujhnb2tPV0tHbVh2bUo3ZUhuVjBSRkhTd2V6empWMVJzUExjd1hHZ1B5OWdPeEc2MTRtRjNTRXNS ckRjUWxlWXArWDJrbE9ibzAvcDRMMU1IcnJuVDd4TkNMSFRlK2dMZ3VtVW0yUUc3NHpCY25SdTNO T09yTlFyejJ4c3Y0NW80L3F6cmhUbnRvMHJsbVoyT1l5N1VsajFSZ0RyTkRKRVc3ZStSQXlXOWRV aHoxMkhrYjcyOWdQZlBZKytvNjF2ZVR3UDcrNjIzbHRsL2RlVGFXbHBWSFN3L0dSejNVRjZpMTF0 QmdyYjlib0xMRm5ZNkF3ckd4bHV1ckpnVlFoQjBvYnVUS0VsK3phZHlJc2RMSHFyNTUyaE1SYzVh SWtLRmdabTFjcEhoWHZGL2U4algvQW9CMnQvN3pQdDB3b2N6bGYyVEtPeHFsNitmak1hRGJxbS9I SnArV3RkZTROWTlhWkVBV3ZvUm1aWDFCczlXNysyK0lZYmJsaDgrUERpdSs2Ny9Zay9FclQyb1ZE TE9zT0RESllNc0RLMEpINm5HUGRuTXVrZjE5T2JpSnV6VE5oYWFaVkZXWHBmNE1xQmxVZHZHZmVo aGFJcVBpeVUyci9lVC82TUVTeUw0RUJGeUZqUkV0MFZJaS8zZHpwR1ozYTNKQmJyYjN5d3ZvNkNk eG11Y01yZVE0ZjJIdHJyN055NC9Ka201N0dmWUs3V3R5OWZQbTNwSzA3anNXWDdIY3ZLbDk0OXNZ bkRDaWtTV0NoMjhyelJUUS8rL3VhNUdYTkZST0I2OGErTDByWjYzcnJqSGV2TTByZitjdnBDVkxD b0VVSUJpZCtIOGY1d21EQnFtQmd3UDczbG9MS0JvWDd1bGN0ajVSVUt0aXRNODR1UlJaR2RXUFBr Z2FWbHRrcXhhWmxablR3K1pUeFIwZkpZSkw5dy9jbzcvK3ZMWC83eTBGZG9pOVZQVzZ5dmZKbldm OTM1RU5tL3NGVVdXQ25HcEduVE1oM08vSTJJcS9ZL1pIWjJKbTEyR28xM1R6dm1iSHE5cm55RE00 aFZSTENvdExRL2xwTFF2Y3I2YlkvbnZzTTM4SFQ0dHRzOUtMUXE5WHhpdFg1cDYybktGaFVzUDVu Ukkrd01NaWtHckJKaXM3SklsRldpeUJlYWZGZHNycEJ3aGNPblBNcGlJZnNHMmtSMkFpc2s0MFdM UExCQ0UrOTBoSlZIKzhHZGJodEZGZEdmNjZLTUN1azlBRDc2K0ttUDczbnErZi9uWWNDaUxkYlhI N21INkdOU09STTkzVENGVkxNM0hidHV6NTdWamlrSDFpT3UxbjIxQzQwSVhTN1h3dmJwMjV5T0Fw eHA2RTBKN21VZkdTelB3MVhZRTNiUCtGdnAxcnNXM3lEUUUxdFJhSFhhODdEVnVzOUR5UUJyRU51 cVVlTHRSa3dadkpBZW81WnRNckdueEtvZW44bG52a0pnZlVodnlFc3htMzloMDVVbVFwWXRZSHYv ZmJVU3NCaDdGYUROVjZHWm40ZXdSTEpZM0pUelJ4L2ZjODlURDdGZ01USFcxMWZldzVEMWthd3Bu U21rZU0rMWVuMzczVTJPVGhTM0Z6L2pjdTVOT2JTcktXVmQrNHE2SmNlNk5pd3R6emZ5OTRXT0FO YUYwNmMvdlFXSFdGVy9QbjF5NnhlUkIxeU14YmpEdTByZlREdDkrczJ0TTYzV083WmV1QkFkckdF Y1lnMWkrelFxMkhNK0c5T2tOWm5RZmRJcU1UMTYzNWd2KzhxQVJSRm9tRDFWMlVoZGhDekUxSW4z VHlpeVdEdEppR1dtdnpBTFRpMk1NaXBrMmZMMjMzTVBBNWFYdFZnUFhjL1VPd3pRWWI0c3NJd2Zy SisydytuTVIyQXQ3M1NRVU4xMXJIcnBpdXE2ZzEyYjZ4b1dOalhKQTh0MityUm5uNVZPTmFSNUhy anQ3WnR2dnYzbW0xK2t5VHA4bndkeFJYbHU2YjdYT21QckJWdDZkTEJHV1pzMFNNd1RxOUZobXJW UjV0TlkxYklwVU5KaXV5SmdvWWpxUTJZWGFCNVpsbkNURlFnZ201YW1iRXBIeTBYdVhLQVF3cGxF OE02QjVhWEJhc1hMdkJpTDlkREhYbTVxV3JiRk1tN1lnOGFFcnFUbDExMjM5QlY2cWpuRm1WKzhv cnA2YzlmQkpYVjNIM0xKQnVzOEJzczZjK3RiYVo3N2Jyc1p6K1o0ZnNSWXJKdTNVcWVwdDlLZXc5 VTBwZkxCMGhHd2hrUEJDaWdHUytjN0dyQlZEbDhKc05KSUZxRWlMTHNRVGxZYXRtcVV3cm5DQ3RZ VCtybXFHZTRGNlJpcmxWZms5L0ZUR0t3QnZzWDYyQnZjL012cmxRZVdjME54K3phSGtZQjFrSjRT M0dWTUtsK3lvbTUxMThFWDZ1YnNrZ3NXUlcyZGloTlZYL0pRYjc1MTEyMjNiejE5K25UcEV6UlhY L3RMNlFYcXo1NFphTkNJd0xLbHgyYXhSa0xCb2hTRFZkT0NmbkNQK25SWEFDdzNObGg1b1o2dklz U0cwZU5DZDlTRVEyaTZJYzNOSks1MFhBNWVxdTVCUEkvbDVRcjlhSXVGNTZML3psa3NkZzBydldk aFZMQlNzTVhhZktBOTMrbmN0cnk2ZW5sQkZ4a0J1cWJVMVMxWlVYM3d2ZGZxNnBKY1FWZlkxeGNK ckFzWHNDdTB6dmY4aUNwOWVQRmlQbGlIM3k3OUVXVXJ2UldIWU5ZWnBlbnBsaGpBOHBPQWlqTTUr bmhjWVE4OUpLeTU3RW5TSk9JSjAwSU5GajJyb3cwRGk0b1pMUFRUeGdCa0Mrd1VCY3NmQ1N4bVM4 dUJJRmdFTnFIRjhqS1JWbFN3VXJCOU1oNWNXdng2citPRDR1cHE1QXZmMjQrNGFqcGVNTDI2N3U2 K3JtVU5EZHVjUEs2aWdGV0tndmVYbnZqamhRdGJIemg4R0lGRlVRZ3NIR1FkZnVDdEN4ZitVcm9i aDJEV3FiTEFJa3hwR2ZQRW15NGtCYVU2azhtc2FGUlk0aVBobFhsVGkrNnlnL1UrRHNqOVlubXJ2 TUxRSXhVS3dHSlM3K2pRMGRqQkNrWlpRYkQ2KzA4OXhGa3Nic3RDYi9UUzVDa2tubXBLZVgxOThl YXVsRit1WDdHaS9PY2JqQTduc1NhWEkvT3g2WjBPNTdhR2hrNEhSMVZrc05KdHR0TGY0cXFHN3lH RTdqdTgrR1pQYVducDFqL1RydkRoVXZUcUp5UXRiOTBuQ3l5U3h6SmpmZ0o2VTNENHB5ZFdLb01r SUdMUFk5bllISlo1MDF6OTVRZkxqNGQ3YkxZcU9LMlRSc2FMb2E3UUVqTll6Q0YxUUVmN1JMOVFr Vndoc3lpSFhwSERnSVVYUm5PanduNHZyMnk1VlJaWUtjNGQwNWNYT0J5WjAxYXNXTEswZUdIQmpq OWtkcm02dHIzUTYwaDU5b1VKcStsMFE1OGNzTDVYdXJ2NzFYOGVTbjd6TjRzUEwzN3h1dzgvL1BB VHQ1T0puYStsdjJuN0VaTTlyYm8xMldMcGtabDVKK3lZcVJFOU02VFJrelNXaFo0c2pMM1lqekZZ K0pyNnVTYjEyRmcya3JybnNvQkZFYkNDRXpjVzNzeXpWbVJVU01VTVZoRnJtZnhSWWlyeHVjSUJa bFZoMEdKNWd6R1dON2lIYi9UZURTeFlyeFV2clQ3a05DNmN2bUxKa2hWTGk4dVhsbWM2WEUzSGtO bHFtSkJ2Yk9LbzZ1dWJHQm1zOUxkbVdLMi92dU5IbnVUN0ZpKys3ZkRpR3hZVFIzakQ0ZnVTa2NH YVNzOVA3MDcrcWNWU0VYMnVrUGk4MFN4Q2xDVURyOVF4KzRjekxNd3NOSVZmVTJ5d2JMcnNtaGFm ejlkU2crVHptY1l1QTFocEFyQStGTTB6TUlsVDVPdWp6dWxJdThJaWhqQi9MR0J4a3pvSUd3YXNB VzlvSG91eld2TEE2ak1tRlJmbk81eXVkZE9ybDJBOVcvMVl3WEdYMGZoQjNaYTZnKzhkQ21JMU1S SllsdlQwOU5MdlYxVlZkYis2ci9UazcyOSs4YTRiRGgrbTUzVU8zLzZXSmZuM0pDdVBRcXprSGt1 UERMQklsQjRZWnBLWi9tR1R5Y1RXTXd4bURITHppREVOQ2JIQk11dEtUS2FhN0tOak5wM0pWNE10 bjFsOTlQSzdRb3MwV1JZTVliVDdFdzZXaGNzM1dFSVNWL1FhUkNyS2xBNnpOTWNiZElYOXdUd1d0 NTVWVm9LVW1WNTJIaXl1Sys3c2NocDNsRSt2UTFhcnVtSDZzMU9NZmM3TXg3WnYyZWJzY2hocG16 VXhPbGozbDg3RW1henUzVjg2dVRYNXpYKysvVDRNRnpKYk55ZW5sOUx6MDFYM1dqN3I2WkVERmox NVE0a3NtOURTcjVoaW5aa1ptNnMzNjRacnNvTXJWdFhEdnNwaDNaaFpkem5BT3NINHVDQlpibEd1 ZEdTWVdCRWpXR1kyM1lCNFlxWUsyVHZIek9tWW8xbXNWZ2FjNEtnd21NY0tOczlxbFFGV0wwT1dv MkI2WGZteUxxZHo5WTUxMVhWMTI1TXlKN3FNamlablo4UDJDZm5MT3M4NlhMMTk5QWJqVWNDeUpK TUF2Y3BxZmVQM3Bjay9TRTcrODYwUDNIZlhiWGQ5OXRQa2Y2TlhWRmhuSkNPc0ttU0FoZXlTanN6 ZWhKSTFPa0ptZTdJVUdDeDlkdWdVbkZtZFhWTXpYSEU1d1BMakNSMUx4RHdETTFWb1JuK2E1WUhG Uk9nNjRlRFB6Uy93bzNaRzg0eVR1SlE2em9yeVJvWC9LNHl4dkd5THJLZ1dpeDd3cFRRNWs0cnJ5 Z3RjRG9lajZlQnJtNDg1SFk2dVpabE9ZOWV5Q2R1M1RKZ3dLOU5vN0kwS1ZvL0ZrbTc1YWVsOEs3 TSs5WTQzays5UHZ6LzV6ZVJmM0g3ckQrNVAzazFIV00vTit3ZkNxbUt0RExEMGRQN0tQeUlrU0Vk c0dJcmZZNTBweEVuM0t5WUVWZ1hKcyt1aWthVWxaaTFxY2JKVTVuMG5oaW1QQlkzSFhJUXBva2xl TGtHS0YrWFFZSkdVVmpER0d1Q0dqVEl5NzJ5QzZwQVJSZTdWNVhjdmN6bTZ1dDU3cjh2aFBMdXQ3 ckZNaDdGclE4T0VMVnRtb1JEZTJCY05yQW9MVWs5eXp6dFdkaFhoTGNuSkZvVGIvY21mclUyK2hh NEF0SDZTN0VaWXJYWExBQXV4UTZxUExSbFp3WjgyYlFhSjM4MVpncXlwREtuTnBrMkJLd29XYllm U0l1ZEdNVkUyR1FaTENxeWRORDlwWVM5RVNvdHh5NzlvY0RCWXE1NC9kVDM2ZUlTWHgyS2pySUdv cnZBc2wvcE1NYUw0cXFHdVlkMjJEMWEvOHNycXp2enREZHUzTnlDeW5NczZQOWkyZmM2RVRBZHRz YjRhQlN4RTFpM3NLa0tyZGY2WGtwTXJFRm85UDdqL09aSnE2SjZSL0o5cmtkeVQ1YXpTOFRQTEpn TCtqQkc5ZjNSMDFKK2RSVE5tempDWllrcGkyWVlyOUZla0pKay9DYTBsNGJ0Rk1Da1lHbWN4OVE0 ZkJwU0I1V2Z0a20xbitOeDBOTERJU3RVQlBDcjhrK2VwbFk5Z2ZXdVNoOGxqQlh2UVJMZFlaMU40 WkRrMjNQMVlYVjFEM1F2Ym4zMmhZY0tFQ1Z1MmI1K1E2V3pDWHJGeis1dzV4NHhSd2VvaHNpVHZZ OGxDb2RhTTN5YmZYOUZUa1R5RExnQjhZOTc5a3hGV2JubGdZV2ZJNUtvc092M3c4TENlV1lSbnlS SWs0MldZSzFOUGowOGZ1TUpnbVU4UWNDZ2RQemNhb0hqSmVKMk41a3JHelJFQlM2ZWwrTUVqL3hW YjFIUUROK3BERnV1cHIzaisvYVoveDdycDY2ekY0czlTeTdkWU9BUGE1Y3BjT0tHQjFvUTUyMzZW T1dGV1E2ZHpZbCtmeTdGdDFxd1BITkhBV290akp4U1lZN0tDclVCZW1qb3YrVC9uL2ZpZEtwcXJm NHhpcXBEa0xiRkhaSm5DWTNUZFNJeGM2VnA2ekp0TTVpc05GcmV5eStMbnowRUhLQzFKdyt1MCtQ RmJUc2haU29HenhxRUsvZjlSUlg2R3QyaFZRcE9ZUHJaTTk2dldoNzVKMXVadzVlNDR4dktlNGsz N3hBSldiNHFyeTdpNXMyQkhmdjYyekExbkhWM08vQzBUQ2pCT2ZWMmJaMjN2SkdBZGp3Q1d1NExX MnY5TXZ2RWwxbWdodEdiZU9DOTVQcTU2cUpvNjc0Yy9IcDFNTkNhektZaWZXMVFmUElUTVZXeCtF SEVWS1BIMUJLNDRXQ1NpQ3Zaa29pdmd6Y0pCS21QSEVpVlpQMDJUZ2czV2NNcmhvNzkvUzdnNGgr U3hnam5VL2xNeXdPcmpUUVQyWXNkbmRCbnhuMzI5WFowVHRuUjJvWmk5dCt1RFdiTVFXTWNuSG84 RTFtUWNQQkd5L252ZTJqZTRmZzA0MUpwZmhiemk3dS9QKzhXUENWVkZSVVZ5d1VLUk8wWXJtMjAw TTVxTnNjcUlLVzYzdFJ4Rkk4SXIzUDZiV2FXRHlUcnhJZnUwNlRVN2FzNmcyRWdvWDVoM3ViKzVT YlFmSEtDVFZIaUFLQ1NMaWJHQ3hYN1J3ZW9MMDhTbXBvbGtCT2g4YmN2MmZLZXpiNkxUdVdQT25N MElyT09Sd1hLdlpUVTZiOTRudUo5ZlZkVzl4QVYyVzZ0bTdwczNiM0lSZzFYUjJBTDVqZGVJaFVK d29SZ3JpOWNXUkw2eVRZaXJrc0JWQVJieGRNanJxWmtTUENZUjc5ZTYzVm8vdC96cjhvUEZHU1E2 Z1Avb281V1AvazhRclA5NjVHTnZQeS9BandwV0dGUVRKektKVU9UMVhLNkZzN1p2TTNZNWpBVno1 aVJOTkdLREZSbXNvRWIvZTk2OGY1c3gvemxrcWRESFM3dmYrR1Rldkg4Wlk2a2FHMXVnamFWVnBM L0VGRlRzSlEzWm0wcm02Z05YQ1ZnQnMvLzlTTkplaVVod0VyOG1obnlDeVByQ25aeCtkcy8xUFBE UXFiR0FOVEZNamc4bXpKbVZsSm1aUDJzaGp0MlBSN0ZZUlpNRlFtak5HL3RrSDlJdGZ2VHBmeStn a1VKUVlXbGpiRzQ3cWhzY0hNNVcyTngyckNjUXVHckFRc00rclU1cTlybml5Z3d3RUZpbnVQUW9V OUszNnFHVndkNHpxeGh6TmNDc0VwTUoxa1J4TlRrNnQ4K2FNMnZXbkRtek9wM0hqOGNJRnRMdmZq aVA2Qi91b2pHR0tvS1ZGbWw4dCtNT0g5SWhwVjJ4YjI2U29IU0JYeXpxOWRKTjJGaExKalBkSU1r VUxaZGpjLzdDT1hNVzd0anNNRTZNQ3RZWWRuUFkyVTFtSW5UMG00WnBMQVFxQU9zcTA2UmdHVit3 bFY4clNVQjRlZTJVdlZ4UlZqU3dKa2JSY1lkenl1Yk5aNDJPNDhlalc2d0ZORUZGbk1pWEMvRGhC UUttc05RQTF0VUVsamVZbytJd2FnMzJ1K1h0NGRRdnB5bkkyVWdHaXlISjZYQTZYY2ZsZ0tWZElD WnRxTlQ0UXcxZ1hVM3FGOWdsdnMrajUzaThaRGtyRHpsdjVPdEpRelh4dUpRa2s1Q3dyZHpuRjZ4 RWI0VDVxN05mUFl0K01SOWZ4Yi94WDVIMEs4bVVRS3diWVQ0T1lJRkFBQllJd0FJQldDQVFnQVVD c0VBQUZnZ0VZSUVBTEJDQUJRSUJXQ0FBQzNUdDYvOFhZQUNmTGtucUJGN3dxZ0FBQUFCSlJVNUVy a0pnZ2c9PSk7fX0uY2Fwcy1pbmRpY2F0b3J7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6NC44cHg7 cmlnaHQ6MC4zcmVtO3RvcDo0LjhweDt0b3A6MC4zcmVtO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dp ZHRoOjMycHg7d2lkdGg6MnJlbTtoZWlnaHQ6MjcuMnB4O2hlaWdodDoxLjdyZW07LW1vei1vcGFj aXR5OjA7LWtodG1sLW9wYWNpdHk6MDstd2Via2l0LW9wYWNpdHk6MDtvcGFjaXR5OjA7LW1zLWZp bHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEob3BhY2l0eT0wKTtm aWx0ZXI6YWxwaGEob3BhY2l0eT0wKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7fS5jYXBzbG9j ay1vbiAuY2Fwcy1pbmRpY2F0b3J7YmFja2dyb3VuZC1zaXplOmF1dG8gYXV0bztiYWNrZ3JvdW5k LXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjoxMHB4IC0yNDBweDt9QG1lZGlh IG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9u bHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkgc2Ny ZWVuIGFuZCAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzozLzIpLCBvbmx5IHNjcmVlbiBhbmQg KG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1 dGlvbjoxNDRkcGkpey5jYXBzbG9jay1vbiAuY2Fwcy1pbmRpY2F0b3J7YmFja2dyb3VuZC1zaXpl OjMwMHB4IDQwMHB4O2JhY2tncm91bmQtcG9zaXRpb246MTBweCAtMjQwcHg7fX0uZm9jdXNlZCAu Y2Fwcy1pbmRpY2F0b3J7LW1vei1vcGFjaXR5OjE7LWtodG1sLW9wYWNpdHk6MTstd2Via2l0LW9w YWNpdHk6MTtvcGFjaXR5OjE7LW1zLWZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNy b3NvZnQuQWxwaGEob3BhY2l0eT0xMDApO2ZpbHRlcjphbHBoYShvcGFjaXR5PTEwMCk7fVtkYXRh LWNvbXBvbmVudD0ncGFzc3dvcmRyZXZlYWxlciddOjotbXMtcmV2ZWFse2Rpc3BsYXk6bm9uZTt9 LnBhc3N3b3JkLXJldmVhbGVye3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjQuOHB4O3JpZ2h0OjAu M3JlbTt0b3A6NC44cHg7dG9wOjAuM3JlbTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDozMnB4 O3dpZHRoOjJyZW07aGVpZ2h0OjI3LjJweDtoZWlnaHQ6MS43cmVtO2JhY2tncm91bmQtY29sb3I6 I2ZmZmZmZjstbW96LW9wYWNpdHk6MDsta2h0bWwtb3BhY2l0eTowOy13ZWJraXQtb3BhY2l0eTow O29wYWNpdHk6MDstbXMtZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5B bHBoYShvcGFjaXR5PTApO2ZpbHRlcjphbHBoYShvcGFjaXR5PTApO30ucGFzc3dvcmQtcmV2ZWFs ZXIub2Zme2JhY2tncm91bmQtc2l6ZTphdXRvIGF1dG87YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVw ZWF0O2JhY2tncm91bmQtcG9zaXRpb246NnB4IC0yNzBweDt9QG1lZGlhIG9ubHkgc2NyZWVuIGFu ZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkgc2NyZWVuIGFuZCAo bWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkgc2NyZWVuIGFuZCAoLW8tbWlu LWRldmljZS1waXhlbC1yYXRpbzozLzIpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1kZXZpY2UtcGl4 ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlvbjoxNDRkcGkpey5w YXNzd29yZC1yZXZlYWxlci5vZmZ7YmFja2dyb3VuZC1zaXplOjMwMHB4IDQwMHB4O2JhY2tncm91 bmQtcG9zaXRpb246NnB4IC0yNzBweDt9fS5wYXNzd29yZC1yZXZlYWxlci5vbntiYWNrZ3JvdW5k LXNpemU6YXV0byBhdXRvO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBv c2l0aW9uOjZweCAtMzAwcHg7fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRl dmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1w aXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0 aW86My8yKSwgb25seSBzY3JlZW4gYW5kIChtaW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9u bHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246MTQ0ZHBpKXsucGFzc3dvcmQtcmV2ZWFsZXIu b257YmFja2dyb3VuZC1zaXplOjMwMHB4IDQwMHB4O2JhY2tncm91bmQtcG9zaXRpb246NnB4IC0z MDBweDt9fS5mb2N1c2VkIC5wYXNzd29yZC1yZXZlYWxlci5lbmFibGVkLA0KLnJldmVhbGVyX2Ns aWNrZWQgLnBhc3N3b3JkLXJldmVhbGVyLmVuYWJsZWR7LW1vei1vcGFjaXR5OjE7LWtodG1sLW9w YWNpdHk6MTstd2Via2l0LW9wYWNpdHk6MTtvcGFjaXR5OjE7LW1zLWZpbHRlcjpwcm9naWQ6RFhJ bWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEob3BhY2l0eT0xMDApO2ZpbHRlcjphbHBoYShv cGFjaXR5PTEwMCk7fS5jb21wb25lbnQtd3JhcHBlcjpub3QoLmZvY3VzZWQpIC5wYXNzd29yZC1y ZXZlYWxlcntwb2ludGVyLWV2ZW50czpub25lO31zZWxlY3RbZGF0YS1jb21wb25lbnQ9J3NlbGVj dGJveCdde3Zpc2liaWxpdHk6aGlkZGVuO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdl YmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7YmFj a2dyb3VuZDp0cmFuc3BhcmVudDtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6bm9uZTtjb2xvcjoj MzMzO2xpbmUtaGVpZ2h0OjM2LjhweDtsaW5lLWhlaWdodDoyLjNyZW07d2lkdGg6MTMwJTt0ZXh0 LWluZGVudDo4cHg7dGV4dC1pbmRlbnQ6MC41cmVtOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO3ot aW5kZXg6MjA7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZToxNnB4O2ZvbnQtc2l6ZTox cmVtO30uaW9zIHNlbGVjdFtkYXRhLWNvbXBvbmVudD0nc2VsZWN0Ym94J117aGVpZ2h0OjM1LjJw eDtoZWlnaHQ6Mi4ycmVtO30uZmYgc2VsZWN0W2RhdGEtY29tcG9uZW50PSdzZWxlY3Rib3gnXXto ZWlnaHQ6MzguNHB4O2hlaWdodDoyLjRyZW07cGFkZGluZzo4cHggMHB4IDBweCAwcHg7cGFkZGlu ZzowLjVyZW0gMHJlbSAwcmVtIDByZW07dGV4dC1pbmRlbnQ6My4ycHggIWltcG9ydGFudDt0ZXh0 LWluZGVudDowLjJyZW0gIWltcG9ydGFudDt9LmllIHNlbGVjdFtkYXRhLWNvbXBvbmVudD0nc2Vs ZWN0Ym94J117aGVpZ2h0OjM2LjhweDtoZWlnaHQ6Mi4zcmVtO3BhZGRpbmc6MHB4IDBweCAwcHgg OHB4O3BhZGRpbmc6MHJlbSAwcmVtIDByZW0gMC41cmVtO30uaWUgc2VsZWN0W2RhdGEtY29tcG9u ZW50PSdzZWxlY3Rib3gnXTpmb2N1czo6LW1zLXZhbHVle2NvbG9yOiMzMzMzMzM7YmFja2dyb3Vu ZDp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7fS5pZTggc2VsZWN0W2RhdGEtY29tcG9uZW50PSdzZWxl Y3Rib3gnXXtsaW5lLWhlaWdodDphdXRvO2hlaWdodDphdXRvIWltcG9ydGFudDtwYWRkaW5nLXRv cDoxMHB4O3BhZGRpbmctYm90dG9tOjEwcHg7fXNlbGVjdFtkYXRhLWNvbXBvbmVudD0nc2VsZWN0 Ym94J106Zm9jdXN7b3V0bGluZTpub25lO31zZWxlY3RbZGF0YS1jb21wb25lbnQ9J3NlbGVjdGJv eCddOi1tb3otZm9jdXNyaW5ne2NvbG9yOnRyYW5zcGFyZW50O3RleHQtc2hhZG93OjAgMCAwICMz MzMzMzM7fS5zZWxlY3QtYm94e2JhY2tncm91bmQtY29sb3I6I2Y0ZjRmNDstd2Via2l0LWJvcmRl ci1yYWRpdXM6NC44cHg7LW1vei1ib3JkZXItcmFkaXVzOjQuOHB4O2JvcmRlci1yYWRpdXM6NC44 cHg7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjAuM3JlbTstbW96LWJvcmRlci1yYWRpdXM6MC4zcmVt O2JvcmRlci1yYWRpdXM6MC4zcmVtO2JvcmRlcjoxcHggc29saWQgI2Q1ZDVkNTtoZWlnaHQ6Mzgu NHB4O2hlaWdodDoyLjRyZW07dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6MHB4IDBweCAwcHggMHB4 O3BhZGRpbmc6MHJlbSAwcmVtIDByZW0gMHJlbTtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVs YXRpdmU7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgMC4zcyBlYXNlO31AbWVkaWEgb25seSBzY3Jl ZW4gYW5kIChtYXgtd2lkdGg6NDgwcHgpey5zZWxlY3QtYm94e3BhZGRpbmc6MHB4IDBweCAwcHgg MHB4O3BhZGRpbmc6MHJlbSAwcmVtIDByZW0gMHJlbTt9fS5zZWxlY3QtYm94OmhvdmVye2JvcmRl ci1jb2xvcjojNjY2NjY2O30uc2VsZWN0LWJveC5hY3RpdmV7Ym9yZGVyLWNvbG9yOiM2NjY2NjY7 YmFja2dyb3VuZC1jb2xvcjojZTFlMWUxO30uc2VsZWN0LWJveC5lcnJvcntib3JkZXI6MXB4IHNv bGlkICNmZjAwMDA7fS5zZWxlY3QtYm94IC50b2dnbGVye2JvcmRlci1sZWZ0OjFweCBzb2xpZCAj ZDVkNWQ1O2JveC1zaGFkb3c6aW5zZXQgMXB4IDBweCAwcHggMHB4ICNmZmY7d2lkdGg6NDRweDt3 aWR0aDoyLjc1cmVtO2hlaWdodDozOC40cHg7aGVpZ2h0OjIuNHJlbTtkaXNwbGF5OmJsb2NrO3Bv c2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjA7ei1pbmRleDoxO30uc2VsZWN0LWJveCAudG9n Z2xlciBpe2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTEuMnB4O3dpZHRo OjAuN3JlbTtoZWlnaHQ6MTcuNnB4O2hlaWdodDoxLjFyZW07dG9wOjExLjJweDt0b3A6MC43cmVt O2xlZnQ6MTZweDtsZWZ0OjFyZW07YmFja2dyb3VuZC1zaXplOmF1dG8gYXV0bztiYWNrZ3JvdW5k LXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjowcHggLTg1cHg7fUBtZWRpYSBv bmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5 IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVl biBhbmQgKC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86My8yKSwgb25seSBzY3JlZW4gYW5kICht aW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRp b246MTQ0ZHBpKXsuc2VsZWN0LWJveCAudG9nZ2xlciBpe2JhY2tncm91bmQtc2l6ZTozMDBweCA0 MDBweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOjBweCAtODVweDt9fUBtZWRpYSBvbmx5IHNjcmVlbiBh bmQgKG1heC13aWR0aDo0ODBweCl7LnNlbGVjdC1ib3ggLnRvZ2dsZXIgaXtsZWZ0OjMuMnB4O2xl ZnQ6MC4ycmVtO319QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjQ4MHB4KXsuc2Vs ZWN0LWJveCAudG9nZ2xlcnt3aWR0aDoxOS4ycHg7d2lkdGg6MS4ycmVtO2JhY2tncm91bmQtcG9z aXRpb246NXB4IC03M3B4O319LnNlbGVjdC1ib3ggc2VsZWN0e3Zpc2liaWxpdHk6dmlzaWJsZTt9 LmZvY3VzZWQgLnNlbGVjdC1ib3h7Ym9yZGVyOjFweCBzb2xpZCAjNjY2NjY2O30uZm9jdXNlZCAu c2VsZWN0LWJveC5lcnJvcntib3JkZXI6MXB4IHNvbGlkICNmZjAwMDAgIWltcG9ydGFudDt9Lml0 ICNhZG9iZXN1c2kgLmRhdGVvZmJpcnRoIC5ncmlkXzF7d2lkdGg6MzMlIWltcG9ydGFudDt9Lmpw ICNhZG9iZXN1c2kgLmRhdGVvZmJpcnRoIC5ncmlkXzF7d2lkdGg6MzQlIWltcG9ydGFudDt9LnJ1 ICNhZG9iZXN1c2kgLmRhdGVvZmJpcnRoIC5ncmlkXzEsDQoucGwgI2Fkb2Jlc3VzaSAuZGF0ZW9m YmlydGggLmdyaWRfMXt3aWR0aDozMCUhaW1wb3J0YW50O30uaXQgI2Fkb2Jlc3VzaSAuZGF0ZW9m YmlydGggLmdyaWRfMnt3aWR0aDozMyUhaW1wb3J0YW50O30uanAgI2Fkb2Jlc3VzaSAuZGF0ZW9m YmlydGggLmdyaWRfMnt3aWR0aDozMiUhaW1wb3J0YW50O30ucnUgI2Fkb2Jlc3VzaSAuZGF0ZW9m YmlydGggLmdyaWRfMiwNCi5wbCAjYWRvYmVzdXNpIC5kYXRlb2ZiaXJ0aCAuZ3JpZF8ye3dpZHRo OjQwJSFpbXBvcnRhbnQ7fS5qcCAjYWRvYmVzdXNpIC5zZXBhcmF0b3Igc3Bhbnt3aWR0aDo3MnB4 O3dpZHRoOjQuNXJlbTt9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjQ4MHB4KXtA LW1zLXZpZXdwb3J0e3dpZHRoOjMyMHB4O319I2Fkb2Jlc3VzaXstd2Via2l0LXRvdWNoLWNhbGxv dXQ6bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LWtodG1sLXVzZXItc2VsZWN0Om5vbmU7 LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5v bmU7Zm9udC1mYW1pbHk6IkFkb2JlLUNsZWFuIiwgIkdlbmV2YSIsICJUYWhvbWEiLCAiSGVsdmV0 aWNhIiwgIkFyaWFsIiwgc2Fucy1zZXJpZjtjb2xvcjojMzMzO2ZvbnQtc2l6ZToxNHB4O2ZvbnQt c2l6ZTowLjg3NXJlbTtjb2xvcjojNjY2NjY2Oy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFs aWFzZWQ7Zm9udC13ZWlnaHQ6bm9ybWFsO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7fSNhZG9iZXN1 c2kgLm1haW5jb250YWluZXJ7d2lkdGg6MzQ0cHg7d2lkdGg6MjEuNXJlbTttYXJnaW46MHB4IGF1 dG87fSNhZG9iZXN1c2kgLm1haW5jb250YWluZXIud2lkZXJ7d2lkdGg6NDEycHg7d2lkdGg6MjUu NzVyZW07fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7I2Fkb2Jlc3Vz aSAubWFpbmNvbnRhaW5lci53aWRlcnt3aWR0aDoyODhweCAhaW1wb3J0YW50O3dpZHRoOjE4cmVt ICFpbXBvcnRhbnQ7fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NDgwcHgpeyNh ZG9iZXN1c2kgLm1haW5jb250YWluZXJ7d2lkdGg6Mjg4cHg7d2lkdGg6MThyZW07fX0jYWRvYmVz dXNpIGgxe2ZvbnQtc2l6ZToyOHB4O2ZvbnQtc2l6ZToxLjc1cmVtO2xpbmUtaGVpZ2h0OjI4cHg7 bGluZS1oZWlnaHQ6MS43NXJlbTtjb2xvcjojMzMzMzMzO2ZvbnQtd2VpZ2h0OjMwMDtwYWRkaW5n OjYuNHB4IDBweCA2LjRweCAwcHg7cGFkZGluZzowLjRyZW0gMHJlbSAwLjRyZW0gMHJlbTtkaXNw bGF5OmJsb2NrO3RleHQtYWxpZ246bGVmdDt9I2Fkb2Jlc3VzaSBoMS5sYXJnZXJ7Zm9udC1zaXpl OjI4cHg7Zm9udC1zaXplOjEuNzVyZW07cGFkZGluZzowcHggMHB4IDEycHggMHB4O3BhZGRpbmc6 MHJlbSAwcmVtIDAuNzVyZW0gMHJlbTt9LndmLWxvYWRpbmcuZmYgI2Fkb2Jlc3VzaSBoMXt2aXNp YmlsaXR5OmhpZGRlbjt9LndmLWFjdGl2ZS5mZiAjYWRvYmVzdXNpIGgxe3Zpc2liaWxpdHk6dmlz aWJsZTt9I2Fkb2Jlc3VzaSBhe2NvbG9yOiMwMDlkZjU7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fSNh ZG9iZXN1c2kgYS5zaWxlbnR7Y29sb3I6IzY2NjY2Njt9I2Fkb2Jlc3VzaSBhOmZvY3Vze2JvcmRl ci1jb2xvcjoxcHggc29saWQgIzAwOWRmNTtvdXRsaW5lOm5vbmU7dGV4dC1kZWNvcmF0aW9uOnVu ZGVybGluZTt9I2Fkb2Jlc3VzaSBocnt3aWR0aDoxMDAlO2JvcmRlcjpub25lO2hlaWdodDoxcHg7 YmFja2dyb3VuZC1jb2xvcjojZGRkZGRkO21hcmdpbi1ib3R0b206MDttYXJnaW46MC42ODc1IGF1 dG87fSNhZG9iZXN1c2kgcHtsaW5lLWhlaWdodDoxOS4ycHg7bGluZS1oZWlnaHQ6MS4ycmVtO3Rl eHQtYWxpZ246bGVmdDt9I2Fkb2Jlc3VzaSBwLmVycm9ye2NvbG9yOiNmZjAwMDA7fSNhZG9iZXN1 c2kgcCBzdHJvbmd7Y29sb3I6IzMzMzMzMzt9I2Fkb2Jlc3VzaSBzdHJvbmd7Zm9udC13ZWlnaHQ6 NjAwO30jYWRvYmVzdXNpIC5pY29ue3dpZHRoOjIwcHg7d2lkdGg6MS4yNXJlbTtoZWlnaHQ6MjBw eDtoZWlnaHQ6MS4yNXJlbTtwYWRkaW5nOjBweCAwcHggMHB4IDBweCAhaW1wb3J0YW50O3BhZGRp bmc6MHJlbSAwcmVtIDByZW0gMHJlbSAhaW1wb3J0YW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO30j YWRvYmVzdXNpIC5pY29uLmluZm97YmFja2dyb3VuZC1zaXplOmF1dG8gYXV0bztiYWNrZ3JvdW5k LXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjowcHggLTUzcHg7fUBtZWRpYSBv bmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5 IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVl biBhbmQgKC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86My8yKSwgb25seSBzY3JlZW4gYW5kICht aW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRp b246MTQ0ZHBpKXsjYWRvYmVzdXNpIC5pY29uLmluZm97YmFja2dyb3VuZC1zaXplOjMwMHB4IDQw MHB4O2JhY2tncm91bmQtcG9zaXRpb246MHB4IC01M3B4O319I2Fkb2Jlc3VzaSAuZm9vdGVye3Bv c2l0aW9uOmFic29sdXRlO2JvdHRvbTowO3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXI7bWFy Z2luOjMycHggMHB4IDBweCAwcHg7bWFyZ2luOjJyZW0gMHJlbSAwcmVtIDByZW07YmFja2dyb3Vu ZC1jb2xvcjojZmZmO2NvbG9yOiM2NjY2NjY7Zm9udC1zaXplOjEycHg7Zm9udC1zaXplOjAuNzVy ZW07fSNhZG9iZXN1c2kgLmZvb3RlciAuaW5uZXJ7bWFyZ2luOjBweCBhdXRvO2JvcmRlci10b3A6 MXB4IHNvbGlkICNkZGRkZGQ7cGFkZGluZzoxMnB4IDBweCAxMnB4IDBweDtwYWRkaW5nOjAuNzVy ZW0gMHJlbSAwLjc1cmVtIDByZW07bWFyZ2luOjBweCAxNnB4IDBweCAxNnB4O21hcmdpbjowcmVt IDFyZW0gMHJlbSAxcmVtO30jYWRvYmVzdXNpIC5wb3B1cHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEo NTEsIDUxLCA1MSwgMC45KTtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDt3aWR0aDoxMDAlO2hl aWdodDoxMDAlO3RvcDowO2xlZnQ6MDt9I2Fkb2Jlc3VzaSAucG9wdXAgLndpbmRvd3ttYXJnaW46 MHB4IGF1dG87d2lkdGg6MTkuMzU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3BhZGRpbmc6MzJweCAx NnB4IDE2cHggMTZweDtwYWRkaW5nOjJyZW0gMXJlbSAxcmVtIDFyZW07cG9zaXRpb246cmVsYXRp dmU7fSNhZG9iZXN1c2kgLnBvcHVwIC53aW5kb3cgLmNsb3Nle2ZvbnQtc2l6ZToyNHB4O2ZvbnQt c2l6ZToxLjVyZW07Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTZweDty aWdodDoxcmVtO3RvcDoxNnB4O3RvcDoxcmVtO3otaW5kZXg6MTEwO30jYWRvYmVzdXNpIC5sb2dv e3dpZHRoOjE5NXB4O2hlaWdodDo0MHB4O2JhY2tncm91bmQtc2l6ZTphdXRvIGF1dG87YmFja2dy b3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246MCAwO31AbWVkaWEgb25s eSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBz Y3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4g YW5kICgtby1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjMvMiksIG9ubHkgc2NyZWVuIGFuZCAobWlu LWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9u OjE0NGRwaSl7I2Fkb2Jlc3VzaSAubG9nb3tiYWNrZ3JvdW5kLXNpemU6MzAwcHggNDAwcHg7YmFj a2dyb3VuZC1wb3NpdGlvbjowIDA7fX0jYWRvYmVzdXNpIC5pbmZve3RleHQtYWxpZ246bGVmdDtw YWRkaW5nOjE2cHggMHB4IDE2cHggMHB4O3BhZGRpbmc6MXJlbSAwcmVtIDFyZW0gMHJlbTt9I2Fk b2Jlc3VzaSAubm90aWNle2ZvbnQtc2l6ZToxNnB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9yOiMzMzMz MzM7fSNhZG9iZXN1c2kgLnN1Z2dlc3Rpb257dGV4dC1hbGlnbjpsZWZ0O2Rpc3BsYXk6YmxvY2s7 bWFyZ2luOjExcHggMHB4IDBweCAwcHg7bWFyZ2luOjAuNjg3NXJlbSAwcmVtIDByZW0gMHJlbTtw YWRkaW5nLWxlZnQ6MDt9I2Fkb2Jlc3VzaSAuc3VnZ2VzdGlvbiBpe2NvbG9yOiMwMDlkZjU7Y3Vy c29yOnBvaW50ZXI7fSNhZG9iZXN1c2kgLnN1Z2dlc3Rpb24gLmNsb3Nle2ZvbnQtc2l6ZToxNnB4 O2ZvbnQtc2l6ZToxcmVtO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRp bmc6MHB4IDBweCAwcHggOHB4O3BhZGRpbmc6MHJlbSAwcmVtIDByZW0gMC41cmVtO30jYWRvYmVz dXNpIGJ1dHRvbiwNCiNhZG9iZXN1c2kgLmJ1dHRvbiwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0i YnV0dG9uIl0sDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9InN1Ym1pdCJdey13ZWJraXQtYXBwZWFy YW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3Jv dW5kLWNvbG9yIDAuNXMgZWFzZTstbW96LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAwLjVz IGVhc2U7LW8tdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZTstbXMtdHJhbnNp dGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDAuNXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29s b3IgMC41cyBlYXNlO2JveC1zaXppbmc6Ym9yZGVyLWJveDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNh c2U7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjE2cHg7Zm9udC1zaXplOjFyZW07Zm9u dC13ZWlnaHQ6NDAwO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlcjpub25lO3RleHQtZGVjb3JhdGlv bjpub25lO3RleHQtc2hhZG93Om5vbmU7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjYuNHB4Oy1tb3ot Ym9yZGVyLXJhZGl1czo2LjRweDtib3JkZXItcmFkaXVzOjYuNHB4Oy13ZWJraXQtYm9yZGVyLXJh ZGl1czowLjRyZW07LW1vei1ib3JkZXItcmFkaXVzOjAuNHJlbTtib3JkZXItcmFkaXVzOjAuNHJl bTt3aWR0aDoxMDAlO2hlaWdodDozNi44cHg7aGVpZ2h0OjIuM3JlbTtwYWRkaW5nOjBweCAwcHgg MHB4IDEuNnB4O3BhZGRpbmc6MHJlbSAwcmVtIDByZW0gMC4xcmVtO3ZlcnRpY2FsLWFsaWduOm1p ZGRsZTtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLWNvbG9yOiMwMDlkZjU7Y29sb3I6I2ZmZjt9 I2Fkb2Jlc3VzaSBidXR0b25baHJlZl0sDQojYWRvYmVzdXNpIC5idXR0b25baHJlZl0sDQojYWRv YmVzdXNpIGlucHV0W3R5cGU9ImJ1dHRvbiJdW2hyZWZdLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBl PSJzdWJtaXQiXVtocmVmXXtwYWRkaW5nOjExLjJweCAwcHggMHB4IDEuNnB4O3BhZGRpbmc6MC43 cmVtIDByZW0gMHJlbSAwLjFyZW07Zm9udC13ZWlnaHQ6NDAwO30jYWRvYmVzdXNpIGJ1dHRvbltk aXNhYmxlZF0sDQojYWRvYmVzdXNpIC5idXR0b25bZGlzYWJsZWRdLA0KI2Fkb2Jlc3VzaSBpbnB1 dFt0eXBlPSJidXR0b24iXVtkaXNhYmxlZF0sDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9InN1Ym1p dCJdW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdDtiYWNrZ3JvdW5kLWNvbG9yOiNkNWQ1ZDU7fSNh ZG9iZXN1c2kgYnV0dG9uW2Rpc2FibGVkXTpob3ZlciwNCiNhZG9iZXN1c2kgLmJ1dHRvbltkaXNh YmxlZF06aG92ZXIsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9ImJ1dHRvbiJdW2Rpc2FibGVkXTpo b3ZlciwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ic3VibWl0Il1bZGlzYWJsZWRdOmhvdmVyLA0K I2Fkb2Jlc3VzaSBidXR0b25bZGlzYWJsZWRdOmZvY3VzLA0KI2Fkb2Jlc3VzaSAuYnV0dG9uW2Rp c2FibGVkXTpmb2N1cywNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0iYnV0dG9uIl1bZGlzYWJsZWRd OmZvY3VzLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSJzdWJtaXQiXVtkaXNhYmxlZF06Zm9jdXN7 YmFja2dyb3VuZC1jb2xvcjojZDVkNWQ1O30jYWRvYmVzdXNpIGJ1dHRvbi5mYiwNCiNhZG9iZXN1 c2kgLmJ1dHRvbi5mYiwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0iYnV0dG9uIl0uZmIsDQojYWRv YmVzdXNpIGlucHV0W3R5cGU9InN1Ym1pdCJdLmZie2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xv cjojNjY2NjY2O3RleHQtdHJhbnNmb3JtOm5vbmU7YmFja2dyb3VuZC1zaXplOmF1dG8gYXV0bzti YWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjotMXB4IC0xMTFw eDt9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlv OjEuNSksIG9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSks IG9ubHkgc2NyZWVuIGFuZCAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzozLzIpLCBvbmx5IHNj cmVlbiBhbmQgKG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kICht aW4tcmVzb2x1dGlvbjoxNDRkcGkpeyNhZG9iZXN1c2kgYnV0dG9uLmZiLA0KICNhZG9iZXN1c2kg LmJ1dHRvbi5mYiwNCiAjYWRvYmVzdXNpIGlucHV0W3R5cGU9ImJ1dHRvbiJdLmZiLA0KICNhZG9i ZXN1c2kgaW5wdXRbdHlwZT0ic3VibWl0Il0uZmJ7YmFja2dyb3VuZC1zaXplOjMwMHB4IDQwMHB4 O2JhY2tncm91bmQtcG9zaXRpb246LTFweCAtMTExcHg7fX0jYWRvYmVzdXNpIGJ1dHRvbi5nb29n bGUsDQojYWRvYmVzdXNpIC5idXR0b24uZ29vZ2xlLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSJi dXR0b24iXS5nb29nbGUsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9InN1Ym1pdCJdLmdvb2dsZXti YWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzY2NjY2Njt0ZXh0LXRyYW5zZm9ybTpub25lO2Jh Y2tncm91bmQtc2l6ZTphdXRvIGF1dG87YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tn cm91bmQtcG9zaXRpb246LTM3cHggLTExMXB4O31AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Vi a2l0LW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kIChtaW4tLW1v ei1kZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kICgtby1taW4tZGV2aWNl LXBpeGVsLXJhdGlvOjMvMiksIG9ubHkgc2NyZWVuIGFuZCAobWluLWRldmljZS1waXhlbC1yYXRp bzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOjE0NGRwaSl7I2Fkb2Jlc3Vz aSBidXR0b24uZ29vZ2xlLA0KICNhZG9iZXN1c2kgLmJ1dHRvbi5nb29nbGUsDQogI2Fkb2Jlc3Vz aSBpbnB1dFt0eXBlPSJidXR0b24iXS5nb29nbGUsDQogI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSJz dWJtaXQiXS5nb29nbGV7YmFja2dyb3VuZC1zaXplOjMwMHB4IDQwMHB4O2JhY2tncm91bmQtcG9z aXRpb246LTM3cHggLTExMXB4O319I2Fkb2Jlc3VzaSBidXR0b24uZ29vZ2xlOmhvdmVyLA0KI2Fk b2Jlc3VzaSAuYnV0dG9uLmdvb2dsZTpob3ZlciwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0iYnV0 dG9uIl0uZ29vZ2xlOmhvdmVyLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSJzdWJtaXQiXS5nb29n bGU6aG92ZXIsDQojYWRvYmVzdXNpIGJ1dHRvbi5nb29nbGU6YWN0aXZlLA0KI2Fkb2Jlc3VzaSAu YnV0dG9uLmdvb2dsZTphY3RpdmUsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9ImJ1dHRvbiJdLmdv b2dsZTphY3RpdmUsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9InN1Ym1pdCJdLmdvb2dsZTphY3Rp dmUsDQojYWRvYmVzdXNpIGJ1dHRvbi5nb29nbGU6Zm9jdXMsDQojYWRvYmVzdXNpIC5idXR0b24u Z29vZ2xlOmZvY3VzLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSJidXR0b24iXS5nb29nbGU6Zm9j dXMsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9InN1Ym1pdCJdLmdvb2dsZTpmb2N1c3tiYWNrZ3Jv dW5kLWNvbG9yOiNmZmY7fSNhZG9iZXN1c2kgYnV0dG9uLnNpbGVudCwNCiNhZG9iZXN1c2kgLmJ1 dHRvbi5zaWxlbnQsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9ImJ1dHRvbiJdLnNpbGVudCwNCiNh ZG9iZXN1c2kgaW5wdXRbdHlwZT0ic3VibWl0Il0uc2lsZW50e2JhY2tncm91bmQ6bm9uZTtjb2xv cjojMDA5ZGY1O30jYWRvYmVzdXNpIGJ1dHRvbi5zaWxlbnQ6aG92ZXIsDQojYWRvYmVzdXNpIC5i dXR0b24uc2lsZW50OmhvdmVyLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSJidXR0b24iXS5zaWxl bnQ6aG92ZXIsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9InN1Ym1pdCJdLnNpbGVudDpob3ZlciwN CiNhZG9iZXN1c2kgYnV0dG9uLnNpbGVudDphY3RpdmUsDQojYWRvYmVzdXNpIC5idXR0b24uc2ls ZW50OmFjdGl2ZSwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0iYnV0dG9uIl0uc2lsZW50OmFjdGl2 ZSwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ic3VibWl0Il0uc2lsZW50OmFjdGl2ZSwNCiNhZG9i ZXN1c2kgYnV0dG9uLnNpbGVudDpmb2N1cywNCiNhZG9iZXN1c2kgLmJ1dHRvbi5zaWxlbnQ6Zm9j dXMsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9ImJ1dHRvbiJdLnNpbGVudDpmb2N1cywNCiNhZG9i ZXN1c2kgaW5wdXRbdHlwZT0ic3VibWl0Il0uc2lsZW50OmZvY3Vze2JhY2tncm91bmQ6bm9uZTt9 I2Fkb2Jlc3VzaSBidXR0b246Zm9jdXMsDQojYWRvYmVzdXNpIC5idXR0b246Zm9jdXMsDQojYWRv YmVzdXNpIGlucHV0W3R5cGU9ImJ1dHRvbiJdOmZvY3VzLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBl PSJzdWJtaXQiXTpmb2N1c3tvdXRsaW5lOm5vbmU7fSNhZG9iZXN1c2kgYnV0dG9uOmhvdmVyLA0K I2Fkb2Jlc3VzaSAuYnV0dG9uOmhvdmVyLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSJidXR0b24i XTpob3ZlciwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ic3VibWl0Il06aG92ZXJ7YmFja2dyb3Vu ZC1jb2xvcjojMmE3OGI4O30jYWRvYmVzdXNpIGJ1dHRvbjphY3RpdmUsDQojYWRvYmVzdXNpIC5i dXR0b246YWN0aXZlLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSJidXR0b24iXTphY3RpdmUsDQoj YWRvYmVzdXNpIGlucHV0W3R5cGU9InN1Ym1pdCJdOmFjdGl2ZSwNCiNhZG9iZXN1c2kgYnV0dG9u OmZvY3VzLA0KI2Fkb2Jlc3VzaSAuYnV0dG9uOmZvY3VzLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBl PSJidXR0b24iXTpmb2N1cywNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ic3VibWl0Il06Zm9jdXN7 YmFja2dyb3VuZC1jb2xvcjojMjE1YzhkO30jYWRvYmVzdXNpIGlucHV0W3R5cGU9J3RleHQnXSwN CiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ncGFzc3dvcmQnXSwNCiNhZG9iZXN1c2kgaW5wdXRbdHlw ZT0nZW1haWwnXSwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZGF0ZSddey13ZWJraXQtYXBwZWFy YW5jZTpub25lOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7Ym94LXNpemluZzpi b3JkZXItYm94O21hcmdpbi1ib3R0b206MC42ODc1Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94 O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7LXdlYmtpdC10cmFuc2l0aW9uOmJvcmRl ci1jb2xvciAwLjNzIGVhc2U7LW1vei10cmFuc2l0aW9uOmJvcmRlci1jb2xvciAwLjNzIGVhc2U7 LW8tdHJhbnNpdGlvbjpib3JkZXItY29sb3IgMC4zcyBlYXNlOy1tcy10cmFuc2l0aW9uOmJvcmRl ci1jb2xvciAwLjNzIGVhc2U7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgMC4zcyBlYXNlOy13ZWJr aXQtYm9yZGVyLXJhZGl1czo0LjhweDstbW96LWJvcmRlci1yYWRpdXM6NC44cHg7Ym9yZGVyLXJh ZGl1czo0LjhweDstd2Via2l0LWJvcmRlci1yYWRpdXM6MC4zcmVtOy1tb3otYm9yZGVyLXJhZGl1 czowLjNyZW07Ym9yZGVyLXJhZGl1czowLjNyZW07Ym9yZGVyOjFweCBzb2xpZCAjZDVkNWQ1O2Zv bnQtc2l6ZToxNnB4O2ZvbnQtc2l6ZToxcmVtO3BhZGRpbmc6OHB4IDEyLjhweCA4cHggMTAuNHB4 O3BhZGRpbmc6MC41cmVtIDAuOHJlbSAwLjVyZW0gMC42NXJlbTtiYWNrZ3JvdW5kLWNvbG9yOiNm ZmZmZmY7Y29sb3I6IzUzNTM1Mzt9I2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSd0ZXh0J106bGFzdC1v Zi10eXBlLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdwYXNzd29yZCddOmxhc3Qtb2YtdHlwZSwN CiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZW1haWwnXTpsYXN0LW9mLXR5cGUsDQojYWRvYmVzdXNp IGlucHV0W3R5cGU9J2RhdGUnXTpsYXN0LW9mLXR5cGV7bWFyZ2luLWJvdHRvbTowO30jYWRvYmVz dXNpIGlucHV0W3R5cGU9J3RleHQnXVtkaXNhYmxlZF0sDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9 J3Bhc3N3b3JkJ11bZGlzYWJsZWRdLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdlbWFpbCddW2Rp c2FibGVkXSwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZGF0ZSddW2Rpc2FibGVkXXtiYWNrZ3Jv dW5kLWNvbG9yOiNmNGY0ZjQ7fSNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ndGV4dCddW2Rpc2FibGVk XTpmb2N1cywNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ncGFzc3dvcmQnXVtkaXNhYmxlZF06Zm9j dXMsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J2VtYWlsJ11bZGlzYWJsZWRdOmZvY3VzLA0KI2Fk b2Jlc3VzaSBpbnB1dFt0eXBlPSdkYXRlJ11bZGlzYWJsZWRdOmZvY3VzLA0KI2Fkb2Jlc3VzaSBp bnB1dFt0eXBlPSd0ZXh0J11bZGlzYWJsZWRdOmhvdmVyLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBl PSdwYXNzd29yZCddW2Rpc2FibGVkXTpob3ZlciwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZW1h aWwnXVtkaXNhYmxlZF06aG92ZXIsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J2RhdGUnXVtkaXNh YmxlZF06aG92ZXJ7Ym9yZGVyLWNvbG9yOiNkNWQ1ZDU7fSNhZG9iZXN1c2kgaW5wdXRbdHlwZT0n dGV4dCddOmZvY3VzLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdwYXNzd29yZCddOmZvY3VzLA0K I2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdlbWFpbCddOmZvY3VzLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0 eXBlPSdkYXRlJ106Zm9jdXN7b3V0bGluZTpub25lO2JvcmRlci1jb2xvcjojMDA5ZGY1O30jYWRv YmVzdXNpIGlucHV0W3R5cGU9J3RleHQnXTpob3ZlciwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0n cGFzc3dvcmQnXTpob3ZlciwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZW1haWwnXTpob3ZlciwN CiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZGF0ZSddOmhvdmVye291dGxpbmU6bm9uZTtib3JkZXIt Y29sb3I6IzAwOWRmNTt9I2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSd0ZXh0J10uZXJyb3IsDQojYWRv YmVzdXNpIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ10uZXJyb3IsDQojYWRvYmVzdXNpIGlucHV0W3R5 cGU9J2VtYWlsJ10uZXJyb3IsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J2RhdGUnXS5lcnJvcnti b3JkZXI6MXB4IHNvbGlkICNmZjAwMDA7bWFyZ2luLWJvdHRvbTowO30jYWRvYmVzdXNpIGlucHV0 W3R5cGU9J3RleHQnXS5lcnJvciArIGlucHV0LA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdwYXNz d29yZCddLmVycm9yICsgaW5wdXQsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J2VtYWlsJ10uZXJy b3IgKyBpbnB1dCwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZGF0ZSddLmVycm9yICsgaW5wdXR7 bWFyZ2luLXRvcDowLjY4NzU7fSNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ndGV4dCddICsgaW5wdXRb dHlwZT0idGV4dCJdLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdwYXNzd29yZCddICsgaW5wdXRb dHlwZT0idGV4dCJdLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdlbWFpbCddICsgaW5wdXRbdHlw ZT0idGV4dCJdLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdkYXRlJ10gKyBpbnB1dFt0eXBlPSJ0 ZXh0Il0sDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J3RleHQnXSArIGlucHV0W3R5cGU9InBhc3N3 b3JkIl0sDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ10gKyBpbnB1dFt0eXBlPSJw YXNzd29yZCJdLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdlbWFpbCddICsgaW5wdXRbdHlwZT0i cGFzc3dvcmQiXSwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZGF0ZSddICsgaW5wdXRbdHlwZT0i cGFzc3dvcmQiXSwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ndGV4dCddICsgaW5wdXRbdHlwZT0i ZW1haWwiXSwNCiNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ncGFzc3dvcmQnXSArIGlucHV0W3R5cGU9 ImVtYWlsIl0sDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J2VtYWlsJ10gKyBpbnB1dFt0eXBlPSJl bWFpbCJdLA0KI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdkYXRlJ10gKyBpbnB1dFt0eXBlPSJlbWFp bCJde21hcmdpbjoxMXB4IDBweCAwcHggMHB4O21hcmdpbjowLjY4NzVyZW0gMHJlbSAwcmVtIDBy ZW07fS5pZTggI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSd0ZXh0J10gKyBpbnB1dFt0eXBlPSJ0ZXh0 Il0sDQouaWU4ICNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ncGFzc3dvcmQnXSArIGlucHV0W3R5cGU9 InRleHQiXSwNCi5pZTggI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdlbWFpbCddICsgaW5wdXRbdHlw ZT0idGV4dCJdLA0KLmllOCAjYWRvYmVzdXNpIGlucHV0W3R5cGU9J2RhdGUnXSArIGlucHV0W3R5 cGU9InRleHQiXSwNCi5pZTggI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSd0ZXh0J10gKyBpbnB1dFt0 eXBlPSJwYXNzd29yZCJdLA0KLmllOCAjYWRvYmVzdXNpIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ10g KyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLA0KLmllOCAjYWRvYmVzdXNpIGlucHV0W3R5cGU9J2Vt YWlsJ10gKyBpbnB1dFt0eXBlPSJwYXNzd29yZCJdLA0KLmllOCAjYWRvYmVzdXNpIGlucHV0W3R5 cGU9J2RhdGUnXSArIGlucHV0W3R5cGU9InBhc3N3b3JkIl0sDQouaWU4ICNhZG9iZXN1c2kgaW5w dXRbdHlwZT0ndGV4dCddICsgaW5wdXRbdHlwZT0iZW1haWwiXSwNCi5pZTggI2Fkb2Jlc3VzaSBp bnB1dFt0eXBlPSdwYXNzd29yZCddICsgaW5wdXRbdHlwZT0iZW1haWwiXSwNCi5pZTggI2Fkb2Jl c3VzaSBpbnB1dFt0eXBlPSdlbWFpbCddICsgaW5wdXRbdHlwZT0iZW1haWwiXSwNCi5pZTggI2Fk b2Jlc3VzaSBpbnB1dFt0eXBlPSdkYXRlJ10gKyBpbnB1dFt0eXBlPSJlbWFpbCJdLA0KLmllOSAj YWRvYmVzdXNpIGlucHV0W3R5cGU9J3RleHQnXSArIGlucHV0W3R5cGU9InRleHQiXSwNCi5pZTkg I2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSdwYXNzd29yZCddICsgaW5wdXRbdHlwZT0idGV4dCJdLA0K LmllOSAjYWRvYmVzdXNpIGlucHV0W3R5cGU9J2VtYWlsJ10gKyBpbnB1dFt0eXBlPSJ0ZXh0Il0s DQouaWU5ICNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZGF0ZSddICsgaW5wdXRbdHlwZT0idGV4dCJd LA0KLmllOSAjYWRvYmVzdXNpIGlucHV0W3R5cGU9J3RleHQnXSArIGlucHV0W3R5cGU9InBhc3N3 b3JkIl0sDQouaWU5ICNhZG9iZXN1c2kgaW5wdXRbdHlwZT0ncGFzc3dvcmQnXSArIGlucHV0W3R5 cGU9InBhc3N3b3JkIl0sDQouaWU5ICNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZW1haWwnXSArIGlu cHV0W3R5cGU9InBhc3N3b3JkIl0sDQouaWU5ICNhZG9iZXN1c2kgaW5wdXRbdHlwZT0nZGF0ZSdd ICsgaW5wdXRbdHlwZT0icGFzc3dvcmQiXSwNCi5pZTkgI2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSd0 ZXh0J10gKyBpbnB1dFt0eXBlPSJlbWFpbCJdLA0KLmllOSAjYWRvYmVzdXNpIGlucHV0W3R5cGU9 J3Bhc3N3b3JkJ10gKyBpbnB1dFt0eXBlPSJlbWFpbCJdLA0KLmllOSAjYWRvYmVzdXNpIGlucHV0 W3R5cGU9J2VtYWlsJ10gKyBpbnB1dFt0eXBlPSJlbWFpbCJdLA0KLmllOSAjYWRvYmVzdXNpIGlu cHV0W3R5cGU9J2RhdGUnXSArIGlucHV0W3R5cGU9ImVtYWlsIl17bWFyZ2luOjBweCAwcHggMHB4 IDBweDttYXJnaW46MHJlbSAwcmVtIDByZW0gMHJlbTt9I2Fkb2Jlc3VzaSBpbnB1dFt0eXBlPSd0 ZXh0J10ucGxhY2Vob2xkZXIsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J3Bhc3N3b3JkJ10ucGxh Y2Vob2xkZXIsDQojYWRvYmVzdXNpIGlucHV0W3R5cGU9J2VtYWlsJ10ucGxhY2Vob2xkZXIsDQoj YWRvYmVzdXNpIGlucHV0W3R5cGU9J2RhdGUnXS5wbGFjZWhvbGRlcntjb2xvcjojYzFjMWMxO30j YWRvYmVzdXNpIGlucHV0OmZvY3VzOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyey13ZWJraXQt dHJhbnNpdGlvbjpjb2xvciAwLjJzIGVhc2U7LW1vei10cmFuc2l0aW9uOmNvbG9yIDAuMnMgZWFz ZTstby10cmFuc2l0aW9uOmNvbG9yIDAuMnMgZWFzZTstbXMtdHJhbnNpdGlvbjpjb2xvciAwLjJz IGVhc2U7dHJhbnNpdGlvbjpjb2xvciAwLjJzIGVhc2U7Y29sb3I6I2MxYzFjMTt9I2Fkb2Jlc3Vz aSBpbnB1dDpmb2N1czotbW96LXBsYWNlaG9sZGVyey13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAw LjJzIGVhc2U7LW1vei10cmFuc2l0aW9uOmNvbG9yIDAuMnMgZWFzZTstby10cmFuc2l0aW9uOmNv bG9yIDAuMnMgZWFzZTstbXMtdHJhbnNpdGlvbjpjb2xvciAwLjJzIGVhc2U7dHJhbnNpdGlvbjpj b2xvciAwLjJzIGVhc2U7Y29sb3I6I2MxYzFjMTt9I2Fkb2Jlc3VzaSBpbnB1dDpmb2N1czo6LW1v ei1wbGFjZWhvbGRlcnstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgMC4ycyBlYXNlOy1tb3otdHJh bnNpdGlvbjpjb2xvciAwLjJzIGVhc2U7LW8tdHJhbnNpdGlvbjpjb2xvciAwLjJzIGVhc2U7LW1z LXRyYW5zaXRpb246Y29sb3IgMC4ycyBlYXNlO3RyYW5zaXRpb246Y29sb3IgMC4ycyBlYXNlO2Nv bG9yOiNjMWMxYzE7fSNhZG9iZXN1c2kgbGFiZWx7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzow cHggMHB4IDBweCAyMC44cHg7cGFkZGluZzowcmVtIDByZW0gMHJlbSAxLjNyZW07bGluZS1oZWln aHQ6MTcuOTJweDtsaW5lLWhlaWdodDoxLjEycmVtO2Rpc3BsYXk6YmxvY2s7dGV4dC1hbGlnbjps ZWZ0O30jYWRvYmVzdXNpIGxhYmVsLmZpZWxkdGl0bGV7cGFkZGluZzozLjM2cHggMHB4IDhweCAw cHg7cGFkZGluZzowLjIxcmVtIDByZW0gMC41cmVtIDByZW07Zm9udC1zaXplOjE0cHg7Zm9udC1z aXplOjAuODc1cmVtO2NvbG9yOiMzMzMzMzM7fSNhZG9iZXN1c2kgbGFiZWwuc2VwYXJhdGVke21h cmdpbjoyMnB4IDBweCAwcHggMHB4O21hcmdpbjoxLjM3NXJlbSAwcmVtIDByZW0gMHJlbTt9I2Fk b2Jlc3VzaSBsYWJlbC5lcnJvcntjb2xvcjojZmYwMDAwO3BhZGRpbmctbGVmdDowO3RleHQtYWxp Z246bGVmdDtwYWRkaW5nOjExcHggMHB4IDBweCAwcHg7cGFkZGluZzowLjY4NzVyZW0gMHJlbSAw cmVtIDByZW07Y2xlYXI6Ym90aDt9I2Fkb2Jlc3VzaSBsYWJlbCBpbnB1dFt0eXBlPSJjaGVja2Jv eCJde3Bvc2l0aW9uOmFic29sdXRlOy1tb3otYXBwZWFyYW5jZTpub25lOy1tcy1hcHBlYXJhbmNl Om5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGVmdDowO3RvcDoycHg7fSNhZG9iZXN1c2kgbGFi ZWwgaW5wdXRbdHlwZT0iY2hlY2tib3giXS5lcnJvciwNCiNhZG9iZXN1c2kgbGFiZWwgaW5wdXRb dHlwZT0iY2hlY2tib3giXS5lcnJvcjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6bm9uZTstbW96 LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7b3V0bGluZToxcHggc29saWQgI2ZmMDAw MDt9I2Fkb2Jlc3VzaSBsYWJlbCBhe3doaXRlLXNwYWNlOm5vd3JhcDt9I2Fkb2Jlc3VzaTo6LXdl YmtpdC1pbnB1dC1wbGFjZWhvbGRlcntwYWRkaW5nLXRvcDowLjFyZW07Y29sb3I6Izk5OTk5OTtv cGFjaXR5OjEgIWltcG9ydGFudDtmb250LXdlaWdodDo0MDA7fSNhZG9iZXN1c2k6LW1vei1wbGFj ZWhvbGRlcntwYWRkaW5nLXRvcDowLjFyZW07Y29sb3I6Izk5OTk5OTtvcGFjaXR5OjEgIWltcG9y dGFudDt9I2Fkb2Jlc3VzaTo6LW1vei1wbGFjZWhvbGRlcntwYWRkaW5nLXRvcDowLjFyZW07Y29s b3I6Izk5OTk5OTtvcGFjaXR5OjEgIWltcG9ydGFudDt9I2Fkb2Jlc3VzaTotbXMtaW5wdXQtcGxh Y2Vob2xkZXJ7cGFkZGluZy10b3A6MC4xcmVtO2NvbG9yOiM5OTk5OTk7b3BhY2l0eToxICFpbXBv cnRhbnQ7fSNhZG9iZXN1c2kgZGl2LnJvd3t0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDox OS4ycHg7bGluZS1oZWlnaHQ6MS4ycmVtO30jYWRvYmVzdXNpIGZpZWxkc2V0LA0KI2Fkb2Jlc3Vz aSBkaXYucm93e3Bvc2l0aW9uOnJlbGF0aXZlO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlcjpub25l O21hcmdpbjowcHggMHB4IDExcHggMHB4O21hcmdpbjowcmVtIDByZW0gMC42ODc1cmVtIDByZW07 ZGlzcGxheTpibG9jazt9I2Fkb2Jlc3VzaSBmaWVsZHNldC5zZXBhcmF0ZWQsDQojYWRvYmVzdXNp IGRpdi5yb3cuc2VwYXJhdGVke21hcmdpbjoyMnB4IDBweCAxMXB4IDBweDttYXJnaW46MS4zNzVy ZW0gMHJlbSAwLjY4NzVyZW0gMHJlbTt9I2Fkb2Jlc3VzaSBmaWVsZHNldC5kZXRhY2hlZCwNCiNh ZG9iZXN1c2kgZGl2LnJvdy5kZXRhY2hlZHttYXJnaW46MHB4IDBweCAyMnB4IDBweDttYXJnaW46 MHJlbSAwcmVtIDEuMzc1cmVtIDByZW07fSNhZG9iZXN1c2kgZmllbGRzZXQuc2VwYXJhdGVkLmRl dGFjaGVkLA0KI2Fkb2Jlc3VzaSBkaXYucm93LnNlcGFyYXRlZC5kZXRhY2hlZHttYXJnaW46MjJw eCAwcHggMjJweCAwcHg7bWFyZ2luOjEuMzc1cmVtIDByZW0gMS4zNzVyZW0gMHJlbTt9I2Fkb2Jl c3VzaSBmaWVsZHNldC5jb250ZXh0LA0KI2Fkb2Jlc3VzaSBkaXYucm93LmNvbnRleHR7dGV4dC1h bGlnbjpsZWZ0O3BhZGRpbmc6MHB4IDBweCA1LjVweCAwcHg7cGFkZGluZzowcmVtIDByZW0gMC4z NDM3NXJlbSAwcmVtO30jYWRvYmVzdXNpIGZpZWxkc2V0LmNvbnRleHQgLmFjdGlvbiwNCiNhZG9i ZXN1c2kgZGl2LnJvdy5jb250ZXh0IC5hY3Rpb257dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2Rp c3BsYXk6YmxvY2s7bWFyZ2luOjBweCAwcHggOC44cHggMHB4O21hcmdpbjowcmVtIDByZW0gMC41 NXJlbSAwcmVtO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtc2l6ZTowLjg3NXJlbTt9LndmLWxvYWRpbmcu ZmYgI2Fkb2Jlc3VzaSBmaWVsZHNldC5jb250ZXh0IC5hY3Rpb24sDQoud2YtbG9hZGluZy5mZiAj YWRvYmVzdXNpIGRpdi5yb3cuY29udGV4dCAuYWN0aW9ue3Zpc2liaWxpdHk6aGlkZGVuO30ud2Yt YWN0aXZlLmZmICNhZG9iZXN1c2kgZmllbGRzZXQuY29udGV4dCAuYWN0aW9uLA0KLndmLWFjdGl2 ZS5mZiAjYWRvYmVzdXNpIGRpdi5yb3cuY29udGV4dCAuYWN0aW9ue3Zpc2liaWxpdHk6dmlzaWJs ZTt9I2Fkb2Jlc3VzaSBmaWVsZHNldC5jb250ZXh0IC5oZWFkaW5nLA0KI2Fkb2Jlc3VzaSBkaXYu cm93LmNvbnRleHQgLmhlYWRpbmd7Zm9udC1zaXplOjI4cHg7Zm9udC1zaXplOjEuNzVyZW07bGlu ZS1oZWlnaHQ6MzUuMnB4O2xpbmUtaGVpZ2h0OjIuMnJlbTtmb250LXdlaWdodDozMDA7Y29sb3I6 IzAwMDtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjBweCAw cHggMHB4IDQwcHg7cGFkZGluZzowcmVtIDByZW0gMHJlbSAyLjVyZW07fSNhZG9iZXN1c2kgZmll bGRzZXQuY29udGV4dCAuaGVhZGluZzpmaXJzdC1saW5lLA0KI2Fkb2Jlc3VzaSBkaXYucm93LmNv bnRleHQgLmhlYWRpbmc6Zmlyc3QtbGluZXtsaW5lLWhlaWdodDoyNS42cHg7bGluZS1oZWlnaHQ6 MS42cmVtO30ud2YtbG9hZGluZy5mZiAjYWRvYmVzdXNpIGZpZWxkc2V0LmNvbnRleHQgLmhlYWRp bmcsDQoud2YtbG9hZGluZy5mZiAjYWRvYmVzdXNpIGRpdi5yb3cuY29udGV4dCAuaGVhZGluZ3t2 aXNpYmlsaXR5OmhpZGRlbjt9LndmLWFjdGl2ZS5mZiAjYWRvYmVzdXNpIGZpZWxkc2V0LmNvbnRl eHQgLmhlYWRpbmcsDQoud2YtYWN0aXZlLmZmICNhZG9iZXN1c2kgZGl2LnJvdy5jb250ZXh0IC5o ZWFkaW5ne3Zpc2liaWxpdHk6dmlzaWJsZTt9I2Fkb2Jlc3VzaSBmaWVsZHNldC5jb250ZXh0IC5o ZWFkaW5nLm5vaW1hZ2UsDQojYWRvYmVzdXNpIGRpdi5yb3cuY29udGV4dCAuaGVhZGluZy5ub2lt YWdle3BhZGRpbmc6MHB4IDBweCAwcHggMHB4O3BhZGRpbmc6MHJlbSAwcmVtIDByZW0gMHJlbTt9 QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjQ4MHB4KXsjYWRvYmVzdXNpIGZpZWxk c2V0LmNvbnRleHQgLmhlYWRpbmcsDQogI2Fkb2Jlc3VzaSBkaXYucm93LmNvbnRleHQgLmhlYWRp bmd7cGFkZGluZzowcHggMHB4IDBweCAyOHB4O3BhZGRpbmc6MHJlbSAwcmVtIDByZW0gMS43NXJl bTtmb250LXNpemU6MjNweDtmb250LXNpemU6MS40Mzc1cmVtO2xpbmUtaGVpZ2h0OjI3LjJweDts aW5lLWhlaWdodDoxLjdyZW07fSNhZG9iZXN1c2kgZmllbGRzZXQuY29udGV4dCAuaGVhZGluZzpm aXJzdC1saW5lLA0KICNhZG9iZXN1c2kgZGl2LnJvdy5jb250ZXh0IC5oZWFkaW5nOmZpcnN0LWxp bmV7bGluZS1oZWlnaHQ6MjBweDtsaW5lLWhlaWdodDoxLjI1cmVtO319I2Fkb2Jlc3VzaSBmaWVs ZHNldC5jb250ZXh0IC5oZWFkaW5nIGltZywNCiNhZG9iZXN1c2kgZGl2LnJvdy5jb250ZXh0IC5o ZWFkaW5nIGltZ3twb3NpdGlvbjphYnNvbHV0ZTt2ZXJ0aWNhbC1hbGlnbjp0b3A7d2lkdGg6Mjhw eDt3aWR0aDoxLjc1cmVtO2xlZnQ6MDt0b3A6MDtiYWNrZ3JvdW5kLXNpemU6MTAwJSAxMDAlO21h cmdpbjowcHggMy4ycHggMHB4IDBweDttYXJnaW46MHJlbSAwLjJyZW0gMHJlbSAwcmVtO31AbWVk aWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NDgwcHgpeyNhZG9iZXN1c2kgZmllbGRzZXQu Y29udGV4dCAuaGVhZGluZyBpbWcsDQogI2Fkb2Jlc3VzaSBkaXYucm93LmNvbnRleHQgLmhlYWRp bmcgaW1ne3dpZHRoOjIwLjk2cHg7d2lkdGg6MS4zMXJlbTt9fSNhZG9iZXN1c2kgZmllbGRzZXQu aGVhZGVyLA0KI2Fkb2Jlc3VzaSBkaXYucm93LmhlYWRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7 cGFkZGluZzoyMXB4IDBweCAwcHggMHB4O3BhZGRpbmc6MS4zMTI1cmVtIDByZW0gMHJlbSAwcmVt O21hcmdpbjowcHggMHB4IDExcHggMHB4O21hcmdpbjowcmVtIDByZW0gMC42ODc1cmVtIDByZW07 fSNhZG9iZXN1c2kgZmllbGRzZXQuZm9vdGVybm90ZSwNCiNhZG9iZXN1c2kgZGl2LnJvdy5mb290 ZXJub3Rle21hcmdpbi10b3A6My40Mzc1O30jYWRvYmVzdXNpIGZpZWxkc2V0Lm5ldHdvcmssDQoj YWRvYmVzdXNpIGRpdi5yb3cubmV0d29ya3t0ZXh0LWFsaWduOmNlbnRlcjtmb250LXNpemU6MTZw eDtmb250LXNpemU6MXJlbTt9I2Fkb2Jlc3VzaSBmaWVsZHNldC5uZXR3b3JrIC5pY29ucyBkaXYs DQojYWRvYmVzdXNpIGRpdi5yb3cubmV0d29yayAuaWNvbnMgZGl2e2Rpc3BsYXk6aW5saW5lLWJs b2NrO3dpZHRoOjMycHg7d2lkdGg6MnJlbTtoZWlnaHQ6MjlweDtoZWlnaHQ6MS44MTI1cmVtO21h cmdpbjoxNnB4IDEyLjhweCAwcHggMHB4O21hcmdpbjoxcmVtIDAuOHJlbSAwcmVtIDByZW07fSNh ZG9iZXN1c2kgZmllbGRzZXQubmV0d29yayAuaWNvbnMgZGl2Omxhc3QtY2hpbGQsDQojYWRvYmVz dXNpIGRpdi5yb3cubmV0d29yayAuaWNvbnMgZGl2Omxhc3QtY2hpbGR7bWFyZ2luOjBweCAwcHgg MHB4IDBweDttYXJnaW46MHJlbSAwcmVtIDByZW0gMHJlbTt9QG1lZGlhIG9ubHkgc2NyZWVuIGFu ZCAobWF4LXdpZHRoOjQ4MHB4KXsjYWRvYmVzdXNpIGZpZWxkc2V0Lm5ldHdvcmsgLmljb25zIGRp diwNCiAjYWRvYmVzdXNpIGRpdi5yb3cubmV0d29yayAuaWNvbnMgZGl2e3dpZHRoOjI1LjEycHg7 d2lkdGg6MS41N3JlbTtoZWlnaHQ6MjUuMTJweDtoZWlnaHQ6MS41N3JlbTt9fSNhZG9iZXN1c2kg ZmllbGRzZXQubmV0d29yayAuaWNvbnMgZGl2LmNyZWF0aXZlX2Nsb3VkLA0KI2Fkb2Jlc3VzaSBk aXYucm93Lm5ldHdvcmsgLmljb25zIGRpdi5jcmVhdGl2ZV9jbG91ZHtiYWNrZ3JvdW5kLXNpemU6 YXV0byBhdXRvO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9u OjBweCAtMzMzcHg7fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWluLWRldmljZS1w aXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmljZS1waXhlbC1y YXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKC1vLW1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86My8y KSwgb25seSBzY3JlZW4gYW5kIChtaW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkgc2Ny ZWVuIGFuZCAobWluLXJlc29sdXRpb246MTQ0ZHBpKXsjYWRvYmVzdXNpIGZpZWxkc2V0Lm5ldHdv cmsgLmljb25zIGRpdi5jcmVhdGl2ZV9jbG91ZCwNCiAjYWRvYmVzdXNpIGRpdi5yb3cubmV0d29y ayAuaWNvbnMgZGl2LmNyZWF0aXZlX2Nsb3Vke2JhY2tncm91bmQtc2l6ZTozMDBweCA0MDBweDti YWNrZ3JvdW5kLXBvc2l0aW9uOjBweCAtMzMzcHg7fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kICht YXgtd2lkdGg6NDgwcHgpeyNhZG9iZXN1c2kgZmllbGRzZXQubmV0d29yayAuaWNvbnMgZGl2LmNy ZWF0aXZlX2Nsb3VkLA0KICNhZG9iZXN1c2kgZGl2LnJvdy5uZXR3b3JrIC5pY29ucyBkaXYuY3Jl YXRpdmVfY2xvdWR7YmFja2dyb3VuZC1wb3NpdGlvbjowcHggLTM2OXB4O319I2Fkb2Jlc3VzaSBm aWVsZHNldC5uZXR3b3JrIC5pY29ucyBkaXYuYmVoYW5jZSwNCiNhZG9iZXN1c2kgZGl2LnJvdy5u ZXR3b3JrIC5pY29ucyBkaXYuYmVoYW5jZXtiYWNrZ3JvdW5kLXNpemU6YXV0byBhdXRvO2JhY2tn cm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00M3B4IC0zMjlweDt9 QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEu NSksIG9ubHkgc2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9u bHkgc2NyZWVuIGFuZCAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzozLzIpLCBvbmx5IHNjcmVl biBhbmQgKG1pbi1kZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kIChtaW4t cmVzb2x1dGlvbjoxNDRkcGkpeyNhZG9iZXN1c2kgZmllbGRzZXQubmV0d29yayAuaWNvbnMgZGl2 LmJlaGFuY2UsDQogI2Fkb2Jlc3VzaSBkaXYucm93Lm5ldHdvcmsgLmljb25zIGRpdi5iZWhhbmNl e2JhY2tncm91bmQtc2l6ZTozMDBweCA0MDBweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00M3B4IC0z MjlweDt9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7I2Fkb2Jlc3Vz aSBmaWVsZHNldC5uZXR3b3JrIC5pY29ucyBkaXYuYmVoYW5jZSwNCiAjYWRvYmVzdXNpIGRpdi5y b3cubmV0d29yayAuaWNvbnMgZGl2LmJlaGFuY2V7YmFja2dyb3VuZC1wb3NpdGlvbjotNDBweCAt MzY3cHg7fX0jYWRvYmVzdXNpIGZpZWxkc2V0Lm5ldHdvcmsgLmljb25zIGRpdi50eXBla2l0LA0K I2Fkb2Jlc3VzaSBkaXYucm93Lm5ldHdvcmsgLmljb25zIGRpdi50eXBla2l0e2JhY2tncm91bmQt c2l6ZTphdXRvIGF1dG87YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9z aXRpb246LTkwcHggLTMzMXB4O31AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1k ZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2Ut cGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kICgtby1taW4tZGV2aWNlLXBpeGVsLXJh dGlvOjMvMiksIG9ubHkgc2NyZWVuIGFuZCAobWluLWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBv bmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOjE0NGRwaSl7I2Fkb2Jlc3VzaSBmaWVsZHNl dC5uZXR3b3JrIC5pY29ucyBkaXYudHlwZWtpdCwNCiAjYWRvYmVzdXNpIGRpdi5yb3cubmV0d29y ayAuaWNvbnMgZGl2LnR5cGVraXR7YmFja2dyb3VuZC1zaXplOjMwMHB4IDQwMHB4O2JhY2tncm91 bmQtcG9zaXRpb246LTkwcHggLTMzMXB4O319QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdp ZHRoOjQ4MHB4KXsjYWRvYmVzdXNpIGZpZWxkc2V0Lm5ldHdvcmsgLmljb25zIGRpdi50eXBla2l0 LA0KICNhZG9iZXN1c2kgZGl2LnJvdy5uZXR3b3JrIC5pY29ucyBkaXYudHlwZWtpdHtiYWNrZ3Jv dW5kLXBvc2l0aW9uOi03OHB4IC0zNjlweDt9fSNhZG9iZXN1c2kgZmllbGRzZXQubmV0d29yayAu aWNvbnMgZGl2Lmt1bGVyLA0KI2Fkb2Jlc3VzaSBkaXYucm93Lm5ldHdvcmsgLmljb25zIGRpdi5r dWxlcntiYWNrZ3JvdW5kLXNpemU6YXV0byBhdXRvO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVh dDtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMzVweCAtMzMxcHg7fUBtZWRpYSBvbmx5IHNjcmVlbiBh bmQgKC13ZWJraXQtbWluLWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQg KG1pbi0tbW96LWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKC1vLW1p bi1kZXZpY2UtcGl4ZWwtcmF0aW86My8yKSwgb25seSBzY3JlZW4gYW5kIChtaW4tZGV2aWNlLXBp eGVsLXJhdGlvOjEuNSksIG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246MTQ0ZHBpKXsj YWRvYmVzdXNpIGZpZWxkc2V0Lm5ldHdvcmsgLmljb25zIGRpdi5rdWxlciwNCiAjYWRvYmVzdXNp IGRpdi5yb3cubmV0d29yayAuaWNvbnMgZGl2Lmt1bGVye2JhY2tncm91bmQtc2l6ZTozMDBweCA0 MDBweDtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMzVweCAtMzMxcHg7fX1AbWVkaWEgb25seSBzY3Jl ZW4gYW5kIChtYXgtd2lkdGg6NDgwcHgpeyNhZG9iZXN1c2kgZmllbGRzZXQubmV0d29yayAuaWNv bnMgZGl2Lmt1bGVyLA0KICNhZG9iZXN1c2kgZGl2LnJvdy5uZXR3b3JrIC5pY29ucyBkaXYua3Vs ZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTE4cHggLTM2OXB4O319I2Fkb2Jlc3VzaSBmaWVsZHNl dC5uZXR3b3JrIC5pY29ucyBkaXYucmV2ZWwsDQojYWRvYmVzdXNpIGRpdi5yb3cubmV0d29yayAu aWNvbnMgZGl2LnJldmVse2JhY2tncm91bmQtc2l6ZTphdXRvIGF1dG87YmFja2dyb3VuZC1yZXBl YXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246LTE4MHB4IC0zMzFweDt9QG1lZGlhIG9u bHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkg c2NyZWVuIGFuZCAobWluLS1tb3otZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSksIG9ubHkgc2NyZWVu IGFuZCAoLW8tbWluLWRldmljZS1waXhlbC1yYXRpbzozLzIpLCBvbmx5IHNjcmVlbiBhbmQgKG1p bi1kZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kIChtaW4tcmVzb2x1dGlv bjoxNDRkcGkpeyNhZG9iZXN1c2kgZmllbGRzZXQubmV0d29yayAuaWNvbnMgZGl2LnJldmVsLA0K ICNhZG9iZXN1c2kgZGl2LnJvdy5uZXR3b3JrIC5pY29ucyBkaXYucmV2ZWx7YmFja2dyb3VuZC1z aXplOjMwMHB4IDQwMHB4O2JhY2tncm91bmQtcG9zaXRpb246LTE4MHB4IC0zMzFweDt9fUBtZWRp YSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7I2Fkb2Jlc3VzaSBmaWVsZHNldC5u ZXR3b3JrIC5pY29ucyBkaXYucmV2ZWwsDQogI2Fkb2Jlc3VzaSBkaXYucm93Lm5ldHdvcmsgLmlj b25zIGRpdi5yZXZlbHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNTZweCAtMzY5cHg7fX0jYWRvYmVz dXNpIGZpZWxkc2V0Lm5ldHdvcmsgLmljb25zIGRpdi5tYXJrZXRpbmdfY2xvdWQsDQojYWRvYmVz dXNpIGRpdi5yb3cubmV0d29yayAuaWNvbnMgZGl2Lm1hcmtldGluZ19jbG91ZHtiYWNrZ3JvdW5k LXNpemU6YXV0byBhdXRvO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBv c2l0aW9uOi0yMjNweCAtMzMycHg7fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWlu LWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKG1pbi0tbW96LWRldmlj ZS1waXhlbC1yYXRpbzoxLjUpLCBvbmx5IHNjcmVlbiBhbmQgKC1vLW1pbi1kZXZpY2UtcGl4ZWwt cmF0aW86My8yKSwgb25seSBzY3JlZW4gYW5kIChtaW4tZGV2aWNlLXBpeGVsLXJhdGlvOjEuNSks IG9ubHkgc2NyZWVuIGFuZCAobWluLXJlc29sdXRpb246MTQ0ZHBpKXsjYWRvYmVzdXNpIGZpZWxk c2V0Lm5ldHdvcmsgLmljb25zIGRpdi5tYXJrZXRpbmdfY2xvdWQsDQogI2Fkb2Jlc3VzaSBkaXYu cm93Lm5ldHdvcmsgLmljb25zIGRpdi5tYXJrZXRpbmdfY2xvdWR7YmFja2dyb3VuZC1zaXplOjMw MHB4IDQwMHB4O2JhY2tncm91bmQtcG9zaXRpb246LTIyM3B4IC0zMzJweDt9fUBtZWRpYSBvbmx5 IHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7I2Fkb2Jlc3VzaSBmaWVsZHNldC5uZXR3b3Jr IC5pY29ucyBkaXYubWFya2V0aW5nX2Nsb3VkLA0KICNhZG9iZXN1c2kgZGl2LnJvdy5uZXR3b3Jr IC5pY29ucyBkaXYubWFya2V0aW5nX2Nsb3Vke2JhY2tncm91bmQtcG9zaXRpb246LTE5M3B4IC0z NjlweDt9fSNhZG9iZXN1c2kgZmllbGRzZXQubmV0d29yayAuaWNvbnMgZGl2LmFjcm9iYXQsDQoj YWRvYmVzdXNpIGRpdi5yb3cubmV0d29yayAuaWNvbnMgZGl2LmFjcm9iYXR7YmFja2dyb3VuZC1z aXplOmF1dG8gYXV0bztiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3Np dGlvbjotMjY1cHggLTMyOXB4O31AbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1pbi1k ZXZpY2UtcGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kIChtaW4tLW1vei1kZXZpY2Ut cGl4ZWwtcmF0aW86MS41KSwgb25seSBzY3JlZW4gYW5kICgtby1taW4tZGV2aWNlLXBpeGVsLXJh dGlvOjMvMiksIG9ubHkgc2NyZWVuIGFuZCAobWluLWRldmljZS1waXhlbC1yYXRpbzoxLjUpLCBv bmx5IHNjcmVlbiBhbmQgKG1pbi1yZXNvbHV0aW9uOjE0NGRwaSl7I2Fkb2Jlc3VzaSBmaWVsZHNl dC5uZXR3b3JrIC5pY29ucyBkaXYuYWNyb2JhdCwNCiAjYWRvYmVzdXNpIGRpdi5yb3cubmV0d29y ayAuaWNvbnMgZGl2LmFjcm9iYXR7YmFja2dyb3VuZC1zaXplOjMwMHB4IDQwMHB4O2JhY2tncm91 bmQtcG9zaXRpb246LTI2NXB4IC0zMjlweDt9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13 aWR0aDo0ODBweCl7I2Fkb2Jlc3VzaSBmaWVsZHNldC5uZXR3b3JrIC5pY29ucyBkaXYuYWNyb2Jh dCwNCiAjYWRvYmVzdXNpIGRpdi5yb3cubmV0d29yayAuaWNvbnMgZGl2LmFjcm9iYXR7YmFja2dy b3VuZC1wb3NpdGlvbjotMjMwcHggLTM2OXB4O319I2Fkb2Jlc3VzaSBmaWVsZHNldC5uZXR3b3Jr IGhyLA0KI2Fkb2Jlc3VzaSBkaXYucm93Lm5ldHdvcmsgaHJ7bWFyZ2luOjBweCAwcHggMjYuNHB4 IDBweDttYXJnaW46MHJlbSAwcmVtIDEuNjVyZW0gMHJlbTt9I2Fkb2Jlc3VzaSBmaWVsZHNldC5v bmVtb3JldGhpbmcsDQojYWRvYmVzdXNpIGRpdi5yb3cub25lbW9yZXRoaW5ne21hcmdpbjoyNnB4 IDBweCAyNnB4IDBweDttYXJnaW46MS42MjVyZW0gMHJlbSAxLjYyNXJlbSAwcmVtO30jYWRvYmVz dXNpIGZpZWxkc2V0LnNlcGFyYXRvciwNCiNhZG9iZXN1c2kgZGl2LnJvdy5zZXBhcmF0b3J7Zm9u dC1zdHlsZTppdGFsaWM7Zm9udC1zaXplOjE2cHg7Zm9udC1zaXplOjFyZW07Ym9yZGVyLXRvcDox cHggc29saWQgI2NjY2NjYzttYXJnaW46MjkuNnB4IDBweCA2LjRweCAwcHg7bWFyZ2luOjEuODVy ZW0gMHJlbSAwLjRyZW0gMHJlbTtjb2xvcjojMzMzMzMzO30jYWRvYmVzdXNpIGZpZWxkc2V0LnNl cGFyYXRvciBzcGFuLA0KI2Fkb2Jlc3VzaSBkaXYucm93LnNlcGFyYXRvciBzcGFue2JhY2tncm91 bmQtY29sb3I6I2ZmZjt3aWR0aDo0MHB4O3dpZHRoOjIuNXJlbTtkaXNwbGF5OmlubGluZS1ibG9j aztwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6LTEwcHg7fSNhZG9iZXN1c2kgZmllbGRzZXQuc3BhY2Vk LA0KI2Fkb2Jlc3VzaSBkaXYucm93LnNwYWNlZHttYXJnaW46MTYuNXB4IDBweCAxNi41cHggMHB4 O21hcmdpbjoxLjAzMTI1cmVtIDByZW0gMS4wMzEyNXJlbSAwcmVtO30jYWRvYmVzdXNpIGZpZWxk c2V0LnNwYWNlZCAucm93LA0KI2Fkb2Jlc3VzaSBkaXYucm93LnNwYWNlZCAucm93LA0KI2Fkb2Jl c3VzaSBmaWVsZHNldC5zcGFjZWQgZmllbGRzZXQsDQojYWRvYmVzdXNpIGRpdi5yb3cuc3BhY2Vk IGZpZWxkc2V0e21hcmdpbjowcHggMHB4IDE2LjVweCAwcHg7bWFyZ2luOjByZW0gMHJlbSAxLjAz MTI1cmVtIDByZW07fSNhZG9iZXN1c2kgZmllbGRzZXQuZW50ZXJwcmlzZSwNCiNhZG9iZXN1c2kg ZGl2LnJvdy5lbnRlcnByaXNlLA0KI2Fkb2Jlc3VzaSBmaWVsZHNldC5nZXRhZG9iZWlkLA0KI2Fk b2Jlc3VzaSBkaXYucm93LmdldGFkb2JlaWR7cGFkZGluZzoxNi41cHggMHB4IDBweCAwcHg7cGFk ZGluZzoxLjAzMTI1cmVtIDByZW0gMHJlbSAwcmVtO30jYWRvYmVzdXNpIGZpZWxkc2V0LmNvdW50 cnksDQojYWRvYmVzdXNpIGRpdi5yb3cuY291bnRyeSwNCiNhZG9iZXN1c2kgZmllbGRzZXQuZGF0 ZW9mYmlydGgsDQojYWRvYmVzdXNpIGRpdi5yb3cuZGF0ZW9mYmlydGh7dGV4dC1hbGlnbjpsZWZ0 O30jYWRvYmVzdXNpIGZpZWxkc2V0LmRhdGVvZmJpcnRoIC5ncmlkXzIsDQojYWRvYmVzdXNpIGRp di5yb3cuZGF0ZW9mYmlydGggLmdyaWRfMiwNCiNhZG9iZXN1c2kgZmllbGRzZXQubmFtZXMgLmdy aWRfMiwNCiNhZG9iZXN1c2kgZGl2LnJvdy5uYW1lcyAuZ3JpZF8ye3dpZHRoOjUwJSFpbXBvcnRh bnQ7cGFkZGluZzowcHggOC44cHggMHB4IDBweDtwYWRkaW5nOjByZW0gMC41NXJlbSAwcmVtIDBy ZW07fSNhZG9iZXN1c2kgZmllbGRzZXQuZGF0ZW9mYmlydGggLmdyaWRfMSwNCiNhZG9iZXN1c2kg ZGl2LnJvdy5kYXRlb2ZiaXJ0aCAuZ3JpZF8xe3dpZHRoOjI1JSFpbXBvcnRhbnQ7cGFkZGluZzow cHggOC44cHggMHB4IDBweDtwYWRkaW5nOjByZW0gMC41NXJlbSAwcmVtIDByZW07fSNhZG9iZXN1 c2kgZmllbGRzZXQuZGF0ZW9mYmlydGggLmdyaWRfMjpsYXN0LW9mLXR5cGUsDQojYWRvYmVzdXNp IGRpdi5yb3cuZGF0ZW9mYmlydGggLmdyaWRfMjpsYXN0LW9mLXR5cGUsDQojYWRvYmVzdXNpIGZp ZWxkc2V0LmRhdGVvZmJpcnRoIC5ncmlkXzE6bGFzdC1vZi10eXBlLA0KI2Fkb2Jlc3VzaSBkaXYu cm93LmRhdGVvZmJpcnRoIC5ncmlkXzE6bGFzdC1vZi10eXBlLA0KI2Fkb2Jlc3VzaSBmaWVsZHNl dC5uYW1lcyAuZ3JpZF8yOmxhc3Qtb2YtdHlwZSwNCiNhZG9iZXN1c2kgZGl2LnJvdy5uYW1lcyAu Z3JpZF8yOmxhc3Qtb2YtdHlwZXtwYWRkaW5nOjBweCAwcHggMHB4IDBweDtwYWRkaW5nOjByZW0g MHJlbSAwcmVtIDByZW07fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo0ODBweCl7 I2Fkb2Jlc3VzaSBmaWVsZHNldC5kYXRlb2ZiaXJ0aCAuZ3JpZF8xLA0KICNhZG9iZXN1c2kgZGl2 LnJvdy5kYXRlb2ZiaXJ0aCAuZ3JpZF8xe3dpZHRoOjI1JSFpbXBvcnRhbnQ7cGFkZGluZzowcHgg OC44cHggMHB4IDBweDtwYWRkaW5nOjByZW0gMC41NXJlbSAwcmVtIDByZW07fSNhZG9iZXN1c2kg ZmllbGRzZXQuZGF0ZW9mYmlydGggLmdyaWRfMiwNCiAjYWRvYmVzdXNpIGRpdi5yb3cuZGF0ZW9m YmlydGggLmdyaWRfMiwNCiAjYWRvYmVzdXNpIGZpZWxkc2V0Lm5hbWVzIC5ncmlkXzIsDQogI2Fk b2Jlc3VzaSBkaXYucm93Lm5hbWVzIC5ncmlkXzJ7d2lkdGg6NTAlIWltcG9ydGFudDtwYWRkaW5n OjBweCA4LjhweCAwcHggMHB4O3BhZGRpbmc6MHJlbSAwLjU1cmVtIDByZW0gMHJlbTt9I2Fkb2Jl c3VzaSBmaWVsZHNldC5kYXRlb2ZiaXJ0aCAuZ3JpZF8yOmxhc3Qtb2YtdHlwZSwNCiAjYWRvYmVz dXNpIGRpdi5yb3cuZGF0ZW9mYmlydGggLmdyaWRfMjpsYXN0LW9mLXR5cGUsDQogI2Fkb2Jlc3Vz aSBmaWVsZHNldC5kYXRlb2ZiaXJ0aCAuZ3JpZF8xOmxhc3Qtb2YtdHlwZSwNCiAjYWRvYmVzdXNp IGRpdi5yb3cuZGF0ZW9mYmlydGggLmdyaWRfMTpsYXN0LW9mLXR5cGUsDQogI2Fkb2Jlc3VzaSBm aWVsZHNldC5uYW1lcyAuZ3JpZF8yOmxhc3Qtb2YtdHlwZSwNCiAjYWRvYmVzdXNpIGRpdi5yb3cu bmFtZXMgLmdyaWRfMjpsYXN0LW9mLXR5cGV7cGFkZGluZzowcHggMHB4IDBweCAwcHg7cGFkZGlu ZzowcmVtIDByZW0gMHJlbSAwcmVtO319I2Fkb2Jlc3VzaSBmaWVsZHNldC5zb2NpYWwsDQojYWRv YmVzdXNpIGRpdi5yb3cuc29jaWFse2ZvbnQtc2l6ZToxNnB4O2ZvbnQtc2l6ZToxcmVtO2NvbG9y OiMzMzMzMzM7cGFkZGluZzowcHggMHB4IDExcHggMHB4O3BhZGRpbmc6MHJlbSAwcmVtIDAuNjg3 NXJlbSAwcmVtO30jYWRvYmVzdXNpIGZpZWxkc2V0LnNvY2lhbCAuYnV0dG9uLA0KI2Fkb2Jlc3Vz aSBkaXYucm93LnNvY2lhbCAuYnV0dG9uey13ZWJraXQtYm9yZGVyLXJhZGl1czo0LjhweDstbW96 LWJvcmRlci1yYWRpdXM6NC44cHg7Ym9yZGVyLXJhZGl1czo0LjhweDstd2Via2l0LWJvcmRlci1y YWRpdXM6MC4zcmVtOy1tb3otYm9yZGVyLXJhZGl1czowLjNyZW07Ym9yZGVyLXJhZGl1czowLjNy ZW07ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDttYXJnaW46MHB4 IDBweCAwcHggMTZweDttYXJnaW46MHJlbSAwcmVtIDByZW0gMXJlbTt9I2Fkb2Jlc3VzaSBmaWVs ZHNldC5zb2NpYWwgLmJ1dHRvbjpmaXJzdC1jaGlsZCwNCiNhZG9iZXN1c2kgZGl2LnJvdy5zb2Np YWwgLmJ1dHRvbjpmaXJzdC1jaGlsZHttYXJnaW46MHB4IDBweCAwcHggMHB4O21hcmdpbjowcmVt IDByZW0gMHJlbSAwcmVtO30jYWRvYmVzdXNpIGZpZWxkc2V0LnN0YXlpbmZvcm1lZCwNCiNhZG9i ZXN1c2kgZGl2LnJvdy5zdGF5aW5mb3JtZWQsDQojYWRvYmVzdXNpIGZpZWxkc2V0LnRvcywNCiNh ZG9iZXN1c2kgZGl2LnJvdy50b3N7dGV4dC1hbGlnbjpsZWZ0O21hcmdpbi10b3A6MS4wMzEyNTtt YXJnaW4tYm90dG9tOjEuMDMxMjU7fSNhZG9iZXN1c2kgZmllbGRzZXQuc2lnbmluX29wdGlvbnMs DQojYWRvYmVzdXNpIGRpdi5yb3cuc2lnbmluX29wdGlvbnN7bWFyZ2luOjBweCAwcHggMHB4IDBw eCAhaW1wb3J0YW50O21hcmdpbjowcmVtIDByZW0gMHJlbSAwcmVtICFpbXBvcnRhbnQ7fSNhZG9i ZXN1c2kgZmllbGRzZXQuc2lnbmluX29wdGlvbnMgLmdyaWRfMiwNCiNhZG9iZXN1c2kgZGl2LnJv dy5zaWduaW5fb3B0aW9ucyAuZ3JpZF8ye3dpZHRoOjUwJTt0ZXh0LWFsaWduOmxlZnQ7fSNhZG9i ZXN1c2kgZmllbGRzZXQuc2lnbmluX29wdGlvbnMgLmdyaWRfMjpsYXN0LWNoaWxkLA0KI2Fkb2Jl c3VzaSBkaXYucm93LnNpZ25pbl9vcHRpb25zIC5ncmlkXzI6bGFzdC1jaGlsZHt0ZXh0LWFsaWdu OnJpZ2h0O30jYWRvYmVzdXNpIGZpZWxkc2V0LnNpZ25pbl9vcHRpb25zIC5pY29uLA0KI2Fkb2Jl c3VzaSBkaXYucm93LnNpZ25pbl9vcHRpb25zIC5pY29ue3Bvc2l0aW9uOmFic29sdXRlO30jYWRv YmVzdXNpIGZpZWxkc2V0ICNjaGVja2JveF9leHBsYWluZXIsDQojYWRvYmVzdXNpIGRpdi5yb3cg I2NoZWNrYm94X2V4cGxhaW5lcnt0ZXh0LWFsaWduOmxlZnQ7Zm9udC1zdHlsZTppdGFsaWM7cGFk ZGluZzozcHggMHB4IDBweCAwcHggIWltcG9ydGFudDtwYWRkaW5nOjAuMTg3NXJlbSAwcmVtIDBy ZW0gMHJlbSAhaW1wb3J0YW50O2Rpc3BsYXk6YmxvY2s7Y29sb3I6IzAwMDt9I2Fkb2Jlc3VzaSBm aWVsZHNldCAjY2hlY2tib3hfZXhwbGFpbmVyLm5vbmludHJ1c2l2ZSwNCiNhZG9iZXN1c2kgZGl2 LnJvdyAjY2hlY2tib3hfZXhwbGFpbmVyLm5vbmludHJ1c2l2ZXtwYWRkaW5nOjBweCAwcHggMHB4 IDIwcHggIWltcG9ydGFudDtwYWRkaW5nOjByZW0gMHJlbSAwcmVtIDEuMjVyZW0gIWltcG9ydGFu dDtwYWRkaW5nLWxlZnQ6MjBweDt0ZXh0LXRyYW5zZm9ybTpsb3dlcmNhc2U7Zm9udC1zaXplOjEy cHg7cGFkZGluZy10b3A6MnB4O2NvbG9yOmluaGVyaXQ7fSNhZG9iZXN1c2kgZmllbGRzZXQgLmhp bnQsDQojYWRvYmVzdXNpIGRpdi5yb3cgLmhpbnR7Y29sb3I6IzMzMzMzMztwb3NpdGlvbjphYnNv bHV0ZTtyaWdodDotMjBweDtmb250LXNpemU6MTZweDtmb250LXNpemU6MXJlbTtsaW5lLWhlaWdo dDo0MHB4O2xpbmUtaGVpZ2h0OjIuNXJlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Y3Vyc29yOnBv aW50ZXI7fSNhZG9iZXN1c2kgZmllbGRzZXQgLnRvdSwNCiNhZG9iZXN1c2kgZGl2LnJvdyAudG91 e3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6MTZweCAxNnB4IDE2cHggMTZweDtw YWRkaW5nOjFyZW0gMXJlbSAxcmVtIDFyZW07bGluZS1oZWlnaHQ6MjRweDtsaW5lLWhlaWdodDox LjVyZW07aGVpZ2h0OjI3NS4ycHg7aGVpZ2h0OjE3LjJyZW07b3ZlcmZsb3cteTpzY3JvbGw7LW1z LW92ZXJmbG93LXN0eWxlOi1tcy1hdXRvaGlkaW5nLXNjcm9sbGJhcjtib3JkZXI6MXB4IHNvbGlk ICNlMWUxZTE7fSNhZG9iZXN1c2kgbGFiZWwubm90aWZpY2F0aW9ue2Rpc3BsYXk6YmxvY2s7cGFk ZGluZzowLjM0Mzc1O21hcmdpbi1ib3R0b206MC42ODc1O21hcmdpbi10b3A6MC42ODc1O3RleHQt YWxpZ246Y2VudGVyO3dpZHRoOjEwMCU7Y29sb3I6I2ZmZjt9I2Fkb2Jlc3VzaSBsYWJlbC5ub3Rp ZmljYXRpb24uc3VjY2Vzc3tjb2xvcjpncmVlbjt9I2Fkb2Jlc3VzaSBsYWJlbC5ub3RpZmljYXRp b24ud2FybmluZ3tjb2xvcjpvcmFuZ2U7fSNhZG9iZXN1c2kgbGFiZWwubm90aWZpY2F0aW9uLmVy cm9ye2NvbG9yOiNmZjAwMDA7fSNhZG9iZXN1c2kgLmNvbXBvbmVudC13cmFwcGVye3Bvc2l0aW9u OnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpyaWdo dDt9I2Fkb2Jlc3VzaSAuY29tcG9uZW50LXdyYXBwZXIgKyAuY29tcG9uZW50LXdyYXBwZXJ7bWFy Z2luOjExcHggMHB4IDBweCAwcHg7bWFyZ2luOjAuNjg3NXJlbSAwcmVtIDByZW0gMHJlbTt9PC9z dHlsZT4NCiAgICAgICAgICAgICAgICAgICAgPCEtLVtpZiBJRV0+DQogICAgICAgIDxsaW5rIGhy ZWY9Imh0dHBzOi8vYWRvYmVpZC1uYTEuc2VydmljZXMuYWRvYmUuY29tL3JlbmdhLWlkcHJvdmlk ZXIvcmVzb3VyY2VzL3dlYl92Mi9jc3MvaWUuY3NzIiBtZWRpYT0ic2NyZWVuIiByZWw9InN0eWxl c2hlZXQiIHR5cGU9InRleHQvY3NzIj4NCiAgICAgICAgPCFbZW5kaWZdLS0+DQogICAgICAgIDwh LS1baWYgSUUgOF0+DQogICAgICAgIDxsaW5rIGhyZWY9Imh0dHBzOi8vYWRvYmVpZC1uYTEuc2Vy dmljZXMuYWRvYmUuY29tL3JlbmdhLWlkcHJvdmlkZXIvcmVzb3VyY2VzL3dlYl92Mi9jc3MvaWU4 LmNzcyIgbWVkaWE9InNjcmVlbiIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQog ICAgICAgIDwhW2VuZGlmXS0tPg0KICAgICAgICA8IS0tW2lmIGx0IElFIDhdPg0KICAgICAgICA8 bGluayBocmVmPSJodHRwczovL2Fkb2JlaWQtbmExLnNlcnZpY2VzLmFkb2JlLmNvbS9yZW5nYS1p ZHByb3ZpZGVyL3Jlc291cmNlcy93ZWJfdjIvY3NzL2x0aWU4LmNzcyIgbWVkaWE9InNjcmVlbiIg cmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+DQogICAgICAgIDwhW2VuZGlmXS0tPg0K DQogICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vdXNl LnR5cGVraXQubmV0L2F0aDVkanMuanMiPjwvc2NyaXB0Pg0KDQogICAgICAgIDxzY3JpcHQgdHlw ZT0idGV4dC9qYXZhc2NyaXB0Ij52YXIgc3BlY2lhbF9kYXlfY2hhciA9ICIiOzwvc2NyaXB0Pg0K DQoNCiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC8qDQoNCg0KIENTUyBCcm93c2VyIFNlbGVjdG9yIGpzIHYwLjUuMyAo SnVseSAyLCAyMDEzKQ0KDQogLS0gb3JpZ2luYWwgLS0NCiBSYWZhZWwgTGltYSAoaHR0cDovL3Jh ZmFlbC5hZG0uYnIpDQogaHR0cDovL3JhZmFlbC5hZG0uYnIvY3NzX2Jyb3dzZXJfc2VsZWN0b3IN CiBMaWNlbnNlOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvDQog Q29udHJpYnV0b3JzOiBodHRwOi8vcmFmYWVsLmFkbS5ici9jc3NfYnJvd3Nlcl9zZWxlY3RvciNj b250cmlidXRvcnMNCiAtLSAvb3JpZ2luYWwgLS0NCg0KIEZvcmsgcHJvamVjdDogaHR0cDovL2Nv ZGUuZ29vZ2xlLmNvbS9wL2Nzcy1icm93c2VyLXNlbGVjdG9yLw0KIFNvbmcgSHlvLUppbiAoc2hq IGF0IHhlbm9zaS5kZSkNCg0KDQogQWRvYmUgVmlzaXRvciBBUEkgZm9yIEphdmFTY3JpcHQgdmVy c2lvbjogMS4xDQogQ29weXJpZ2h0IDE5OTYtMjAxMyBBZG9iZSwgSW5jLiBBbGwgUmlnaHRzIFJl c2VydmVkDQogTW9yZSBpbmZvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9tbml0dXJlLmNvbQ0K DQoNCiBBcHBNZWFzdXJlbWVudCBmb3IgSmF2YVNjcmlwdCB2ZXJzaW9uOiAxLjIuMw0KIENvcHly aWdodCAxOTk2LTIwMTMgQWRvYmUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZA0KIE1vcmUgaW5m byBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vbW5pdHVyZS5jb20NCiovDQp0cnl7VHlwZWtpdC5s b2FkKCl9Y2F0Y2goZSl7fQ0KZnVuY3Rpb24gY3NzX2Jyb3dzZXJfc2VsZWN0b3IoYSl7dmFyIGM9 YS50b0xvd2VyQ2FzZSgpLGc9ZnVuY3Rpb24oYSl7cmV0dXJuLTE8Yy5pbmRleE9mKGEpfTthPTA7 dmFyIHA9d2luZG93LmRldmljZVBpeGVsUmF0aW8/KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKyIi KS5yZXBsYWNlKCIuIiwiXyIpOiIxIixnPVshL29wZXJhfHdlYnR2Ly50ZXN0KGMpJiYvbXNpZVxz KFxkKykvLnRlc3QoYykmJihhPTEqUmVnRXhwLiQxKT8iaWUgaWUiK2ErKDY9PWF8fDc9PWE/IiBp ZTY3IGllNjc4IGllNjc4OSI6OD09YT8iIGllNjc4IGllNjc4OSI6OT09YT8iIGllNjc4OSBpZTlt Ijo5PGE/IiBpZTltIjoiIik6L3RyaWRlbnRcL1xkKy4qPztccypydjooXGQrKVwuKFxkKylcKS8u dGVzdChjKSYmKGE9W1JlZ0V4cC4kMSxSZWdFeHAuJDJdKT8iaWUgaWUiK2FbMF0rIiBpZSIrYVsw XSsiXyIrYVsxXSsiIGllOW0iOi9maXJlZm94XC8oXGQrKVwuKFxkKykvLnRlc3QoYykmJihyZT1S ZWdFeHApPw0KImdlY2tvIGZmIGZmIityZS4kMSsiIGZmIityZS4kMSsiXyIrcmUuJDI6ZygiZ2Vj a28vIik/ImdlY2tvIjpnKCJvcGVyYSIpPyJvcGVyYSIrKC92ZXJzaW9uXC8oXGQrKS8udGVzdChj KT8iIG9wZXJhIitSZWdFeHAuJDE6L29wZXJhKFxzfFwvKShcZCspLy50ZXN0KGMpPyIgb3BlcmEi K1JlZ0V4cC4kMjoiIik6Zygia29ucXVlcm9yIik/ImtvbnF1ZXJvciI6ZygiYmxhY2tiZXJyeSIp PyJtb2JpbGUgYmxhY2tiZXJyeSI6ZygiY2hyb21lIil8fGcoImNyaW9zIik/IndlYmtpdCBjaHJv bWUiOmcoImlyb24iKT8id2Via2l0IGlyb24iOiFnKCJjcHUgb3MiKSYmZygiYXBwbGV3ZWJraXQv Iik/IndlYmtpdCBzYWZhcmkiOmcoIm1vemlsbGEvIik/ImdlY2tvIjoiIixnKCJhbmRyb2lkIik/ Im1vYmlsZSBhbmRyb2lkIjoiIixnKCJ0YWJsZXQiKT8idGFibGV0IjoiIixnKCJqMm1lIik/Im1v YmlsZSBqMm1lIjpnKCJpcGFkOyB1OyBjcHUgb3MiKT8ibW9iaWxlIGNocm9tZSBhbmRyb2lkIHRh YmxldCI6DQpnKCJpcGFkO3U7Y3B1IG9zIik/Im1vYmlsZSBjaHJvbWVkZWYgYW5kcm9pZCB0YWJs ZXQiOmcoImlwaG9uZSIpPyJtb2JpbGUgaW9zIGlwaG9uZSI6ZygiaXBvZCIpPyJtb2JpbGUgaW9z IGlwb2QiOmcoImlwYWQiKT8ibW9iaWxlIGlvcyBpcGFkIHRhYmxldCI6ZygibWFjIik/Im1hYyI6 ZygiZGFyd2luIik/Im1hYyI6Zygid2VidHYiKT8id2VidHYiOmcoIndpbiIpPyJ3aW4iKyhnKCJ3 aW5kb3dzIG50IDYuMCIpPyIgdmlzdGEiOiIiKTpnKCJmcmVlYnNkIik/ImZyZWVic2QiOmcoIngx MSIpfHxnKCJsaW51eCIpPyJsaW51eCI6IiIsIjEiIT1wPyIgcmV0aW5hIHJhdGlvIitwOiIiLCJq cyBwb3J0cmFpdCJdLmpvaW4oIiAiKTt3aW5kb3cualF1ZXJ5JiYhd2luZG93LmpRdWVyeS5icm93 c2VyJiYod2luZG93LmpRdWVyeS5icm93c2VyPWE/e21zaWU6MSx2ZXJzaW9uOmF9Ont9KTtyZXR1 cm4gZ30NCihmdW5jdGlvbihhLGMpe3ZhciBnPWNzc19icm93c2VyX3NlbGVjdG9yKG5hdmlnYXRv ci51c2VyQWdlbnQpLHA9YS5kb2N1bWVudEVsZW1lbnQ7cC5jbGFzc05hbWUrPSIgIitnO2c9Zy5y ZXBsYWNlKC9eXHMqfFxzKiQvZywiIikuc3BsaXQoLyArLyk7Yy5DU1NCUz0xO2Zvcih2YXIgbT0w O208Zy5sZW5ndGg7bSsrKWNbIkNTU0JTXyIrZ1ttXV09MTtjLmpRdWVyeSYmZnVuY3Rpb24oZyl7 ZnVuY3Rpb24gbSgpe2lmKDA9PXope3RyeXt2YXIgZj1hLmRvY3VtZW50RWxlbWVudC5jbGllbnRX aWR0aHx8YS5ib2R5LmNsaWVudFdpZHRoO2Y+KGEuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdo dHx8YS5ib2R5LmNsaWVudEhlaWdodCk/dS5yZW1vdmVDbGFzcyhkKS5hZGRDbGFzcyhiKTp1LnJl bW92ZUNsYXNzKGIpLmFkZENsYXNzKGQpO2lmKGY9PXgpcmV0dXJuO3g9Zn1jYXRjaChjKXt9ej1z ZXRUaW1lb3V0KHcsMTAwKX19ZnVuY3Rpb24gdygpe3RyeXt1LnJlbW92ZUNsYXNzKHEpLA0KdS5h ZGRDbGFzcygzNjA+PXg/Zjo2NDA+PXg/czo3Njg+PXg/azoxMDI0Pj14P246InBjIil9Y2F0Y2go YSl7fXo9MH12YXIgZD0icG9ydHJhaXQiLGI9ImxhbmRzY2FwZSIsZj0ic21hcnRuYXJyb3ciLHM9 InNtYXJ0d2lkZSIsaz0idGFibGV0bmFycm93IixuPSJ0YWJsZXR3aWRlIixxPWYrIiAiK3MrIiAi K2srIiAiK24rIiBwYyIsdT1nKHApLHo9MCx4PTA7Yy5DU1NCU19pZT9zZXRJbnRlcnZhbChtLDFF Myk6ZyhjKS5vbigicmVzaXplIG9yaWVudGF0aW9uY2hhbmdlIixtKS50cmlnZ2VyKCJyZXNpemUi KX0oYy5qUXVlcnkpfSkoZG9jdW1lbnQsd2luZG93KTsNCmZ1bmN0aW9uIFZpc2l0b3IoYSl7dmFy IGM9dGhpcztjLnZlcnNpb249IjEuMSI7dmFyIGc9d2luZG93O2cuc19jX2lufHwoZy5zX2NfaWw9 W10sZy5zX2NfaW49MCk7Yy5fYz0iVmlzaXRvciI7Yy5faWw9Zy5zX2NfaWw7Yy5faW49Zy5zX2Nf aW47Yy5faWxbYy5faW5dPWM7Zy5zX2NfaW4rKzt2YXIgcD1nLmRvY3VtZW50LG09Zy56O218fCht PW51bGwpO3ZhciByPWcuQTtyfHwocj0hMCk7dmFyIHQ9Zy53O3R8fCh0PSExKTtjLnM9ZnVuY3Rp b24oKXt2YXIgYTshYSYmZy5sb2NhdGlvbiYmKGE9Zy5sb2NhdGlvbi5ob3N0bmFtZSk7aWYoYSlp ZigvXlswLTkuXSskLy50ZXN0KGEpKWE9IiI7ZWxzZXt2YXIgZD1hLnNwbGl0KCIuIiksYj1kLmxl bmd0aC0xLGY9Yi0xOzE8YiYmMj49ZFtiXS5sZW5ndGgmJjA+IixhbSxhcSxheCxjYyxjZixjZyxj aCxjdixjeixkZSxkaixkayxldSxmbSxmbyxnYSxnZCxnZixnbCxnbSxncSxncyxndyxobSxsaSxs dSxtZCxtaCxtcCxtcSxtcyxuZSxubCxudSxwbSxzaSxzayxzbSxzcixzdSx0Yyx0ZCx0Zix0Zyx0 ayx0dix2YSx2Zyx2dSx3Zix5dCwiLmluZGV4T2YoIiwiKw0KZFtiXSsiLCIpJiZmLS07aWYoMDxm KWZvcihhPSIiO2I+PWY7KWE9ZFtiXSsoYT8iLiI6IiIpK2EsYi0tfXJldHVybiBhfTtjLmNvb2tp ZVJlYWQ9ZnVuY3Rpb24oYSl7dmFyIGQ9KCI7IitwLmNvb2tpZSkuc3BsaXQoIiAiKS5qb2luKCI7 IiksYj1kLmluZGV4T2YoIjsiK2ErIlx4M2QiKSxmPTA+Yj9iOmQuaW5kZXhPZigiOyIsYisxKTty ZXR1cm4gMD5iPyIiOmRlY29kZVVSSUNvbXBvbmVudChkLnN1YnN0cmluZyhiKzIrYS5sZW5ndGgs MD5mP2QubGVuZ3RoOmYpKX07Yy5jb29raWVXcml0ZT1mdW5jdGlvbihhLGQsYil7dmFyIGY9Yy5j b29raWVMaWZldGltZSxzO2Q9IiIrZDtmPWY/KCIiK2YpLnRvVXBwZXJDYXNlKCk6IiI7YiYmIlNF U1NJT04iIT1mJiYiTk9ORSIhPWY/KHM9IiIhPWQ/cGFyc2VJbnQoZj9mOjApOi02MCk/KGI9bmV3 IERhdGUsYi5zZXRUaW1lKGIuZ2V0VGltZSgpKzFFMypzKSk6MT09YiYmKGI9bmV3IERhdGUscz1i LmdldFllYXIoKSxiLnNldFllYXIocysyKw0KKDE5MDA+cz8xOTAwOjApKSk6Yj0wO3JldHVybiBh JiYiTk9ORSIhPWY/KHAuY29va2llPWErIlx4M2QiK2VuY29kZVVSSUNvbXBvbmVudChkKSsiOyBw YXRoXHgzZC87IisoYj8iIGV4cGlyZXNceDNkIitiLnRvR01UU3RyaW5nKCkrIjsiOiIiKSsoYy5r PyIgZG9tYWluXHgzZCIrYy5rKyI7IjoiIiksYy5jb29raWVSZWFkKGEpPT1kKTowfTtjLmI9bTtj Lmo9ZnVuY3Rpb24oYSxkKXt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/YS5hcHBseShnLGQpOmFb MV0uYXBwbHkoYVswXSxkKX1jYXRjaChiKXt9fTtjLnU9ZnVuY3Rpb24oYSxkKXtkJiYoYy5iPT1t JiYoYy5iPXt9KSx2b2lkIDA9PWMuYlthXSYmKGMuYlthXT1bXSksYy5iW2FdLnB1c2goZCkpfTtj LnA9ZnVuY3Rpb24oYSxkKXtpZihjLmIhPW0pe3ZhciBiPWMuYlthXTtpZihiKWZvcig7MDxiLmxl bmd0aDspYy5qKGIuc2hpZnQoKSxkKX19O2MuYz1tO2MudD1mdW5jdGlvbihhLGQsYil7IWQmJmIm JmIoKTt2YXIgZj1wLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJIRUFEIilbMF0sDQpzPXAuY3JlYXRl RWxlbWVudCgiU0NSSVBUIik7cy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO3Muc2V0QXR0cmlidXRl KCJhc3luYyIsImFzeW5jIik7cy5zcmM9ZDtmLmZpcnN0Q2hpbGQ/Zi5pbnNlcnRCZWZvcmUocyxm LmZpcnN0Q2hpbGQpOmYuYXBwZW5kQ2hpbGQocyk7Yy5jPT1tJiYoYy5jPXt9KTtjLmNbYV09c2V0 VGltZW91dChiLGMubG9hZFRpbWVvdXQpfTtjLnE9ZnVuY3Rpb24oYSl7Yy5jIT1tJiZjLmNbYV0m JihjbGVhclRpbWVvdXQoYy5jW2FdKSxjLmNbYV09MCl9O2MubD10O2MubT10O2MuaXNBbGxvd2Vk PWZ1bmN0aW9uKCl7aWYoIWMubCYmKGMubD1yLGMuY29va2llUmVhZChjLmNvb2tpZU5hbWUpfHxj LmNvb2tpZVdyaXRlKGMuY29va2llTmFtZSwiVCIsMSkpKWMubT1yO3JldHVybiBjLm19O2MuYT1t O2Mubj10O2MuaT1mdW5jdGlvbigpe2lmKCFjLm4pe2Mubj1yO3ZhciBhPWMuY29va2llUmVhZChj LmNvb2tpZU5hbWUpLGQsYixmLHMsaz1uZXcgRGF0ZTtpZihhJiYNCiJUIiE9YSl7YT1hLnNwbGl0 KCJ8Iik7MT09YS5sZW5ndGglMiYmYS5wb3AoKTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCs9MilpZihi PWFbZF0uc3BsaXQoIi0iKSxmPWJbMF0scz1hW2QrMV0sYj0xPGIubGVuZ3RoP3BhcnNlSW50KGJb MV0pOjAsZiYmcyYmKCFifHxrLmdldFRpbWUoKTwxRTMqYikpYy5mKGYscywxKSwwPGImJihjLmFb ImV4cGlyZSIrZl09Yil9aWYoIWMuZCgiTUNBSUQiKSYmKGE9Yy5jb29raWVSZWFkKCJzX3ZpIikp KWE9YS5zcGxpdCgifCIpLDE8YS5sZW5ndGgmJjA8PWFbMF0uaW5kZXhPZigidjEiKSYmKHM9YVsx XSxkPXMuaW5kZXhPZigiWyIpLDA8PWQmJihzPXMuc3Vic3RyaW5nKDAsZCkpLHMmJnMubWF0Y2go L15bMC05YS1mQS1GXC1dKyQvKSYmYy5mKCJNQ0FJRCIscykpfX07Yy52PWZ1bmN0aW9uKCl7dmFy IGE9IiIsZCxiO2ZvcihkIGluIGMuYSkhT2JqZWN0LnByb3RvdHlwZVtkXSYmYy5hW2RdJiYiZXhw aXJlIiE9ZC5zdWJzdHJpbmcoMCw2KSYmKGI9Yy5hW2RdLA0KYSs9KGE/InwiOiIiKStkKyhjLmFb ImV4cGlyZSIrZF0/Ii0iK2MuYVsiZXhwaXJlIitkXToiIikrInwiK2IpO2MuY29va2llV3JpdGUo Yy5jb29raWVOYW1lLGEsMSl9O2MuZD1mdW5jdGlvbihhKXtyZXR1cm4gYy5hIT1tP2MuYVthXTpt fTtjLmY9ZnVuY3Rpb24oYSxkLGIpe2MuYT09bSYmKGMuYT17fSk7Yy5hW2FdPWQ7Ynx8Yy52KCl9 O2Mubz1mdW5jdGlvbihhLGQpe3ZhciBiPW5ldyBEYXRlO2Iuc2V0VGltZShiLmdldFRpbWUoKSsx RTMqZCk7Yy5hPT1tJiYoYy5hPXt9KTtjLmFbImV4cGlyZSIrYV09TWF0aC5mbG9vcihiLmdldFRp bWUoKS8xRTMpfTtjLnI9ZnVuY3Rpb24oYSl7aWYoYSYmKCJvYmplY3QiPT10eXBlb2YgYSYmKGE9 YS52aXNpdG9ySUQ/YS52aXNpdG9ySUQ6YS5pZD9hLmlkOmEudXVpZD9hLnV1aWQ6IiIrYSksYSYm KGE9YS50b1VwcGVyQ2FzZSgpLCJOT1RBUkdFVCI9PWEmJihhPSJOT05FIikpLCFhfHwiTk9ORSIh PWEmJiFhLm1hdGNoKC9eWzAtOWEtZkEtRlwtXSskLykpKWE9DQoiIjtyZXR1cm4gYX07Yy5nPWZ1 bmN0aW9uKGEsZCl7dmFyIGI7Yy5xKGEpOyhiPWMuZChhKSl8fChiPWMucihkKSkmJmMuZihhLGIp O2lmKCJvYmplY3QiPT10eXBlb2YgZCl7dmFyIGY9ODY0MDA7Ik1DQUFNSUQiPT1hJiYodm9pZCAw IT1kLmlkX3N5bmNfdHRsJiZkLmlkX3N5bmNfdHRsJiYoZj1wYXJzZUludChkLmlkX3N5bmNfdHRs KSksYy5vKGEsZiksYy5vKCJNQ0FBTUxIIixmKSxkLmRjc19yZWdpb24mJmMuZigiTUNBQU1MSCIs ZC5kY3NfcmVnaW9uKSl9Yy5wKGEsWyJOT05FIiE9Yj9iOiIiXSl9O2MuZT1tO2MuaD1mdW5jdGlv bihhLGQsYil7aWYoYy5pc0FsbG93ZWQoKSl7Yy5pKCk7dmFyIGY9Yy5kKGEpO2lmKGYpcmV0dXJu Ik5PTkUiPT1mJiZjLmooYixbIiJdKSwiTk9ORSIhPWY/ZjoiIjtpZihjLmU9PW18fHZvaWQgMD09 Yy5lW2FdKWMuZT09bSYmKGMuZT17fSksYy5lW2FdPXIsYy50KGEsZCxmdW5jdGlvbigpe2lmKCFj LmQoYSkpe3ZhciBkPSIiO2lmKCJNQ01JRCI9PQ0KYSl7dmFyIGI9ZD0iIixmLHEsdT0xMCxnPTEw O2ZvcihmPTA7MTk+ZjtmKyspcT1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdSksZCs9IjAxMjM0 NTY3ODkiLnN1YnN0cmluZyhxLHErMSksdT0wPT1mJiY5PT1xPzM6MTAscT1NYXRoLmZsb29yKE1h dGgucmFuZG9tKCkqZyksYis9IjAxMjM0NTY3ODkiLnN1YnN0cmluZyhxLHErMSksZz0wPT1mJiY5 PT1xPzM6MTA7ZCs9Yn1jLmcoYSxkKX19KTtjLnUoYSxiKX1yZXR1cm4iIn07Yy5zZXRNYXJrZXRp bmdDbG91ZFZpc2l0b3JJRD1mdW5jdGlvbihhKXtjLmcoIk1DTUlEIixhKX07Yy5nZXRNYXJrZXRp bmdDbG91ZFZpc2l0b3JJRD1mdW5jdGlvbihhKXt2YXIgZD1jLm1hcmtldGluZ0Nsb3VkU2VydmVy LGI9IiI7Yy5sb2FkU1NMJiZjLm1hcmtldGluZ0Nsb3VkU2VydmVyU2VjdXJlJiYoZD1jLm1hcmtl dGluZ0Nsb3VkU2VydmVyU2VjdXJlKTtkJiYoYj0iaHR0cCIrKGMubG9hZFNTTD8icyI6IiIpKyI6 Ly8iK2QrIi9pZD9kX3J0YmRceDNkanNvblx4MjZkX2NpZFx4M2QiKw0KZW5jb2RlVVJJQ29tcG9u ZW50KGMubmFtZXNwYWNlKSsiXHgyNmRfY2JceDNkc19jX2lsJTVCIitjLl9pbisiJTVELnNldE1h cmtldGluZ0Nsb3VkVmlzaXRvcklEIik7cmV0dXJuIGMuaCgiTUNNSUQiLGIsYSl9O2Muc2V0QXVk aWVuY2VNYW5hZ2VyVmlzaXRvcklEPWZ1bmN0aW9uKGEpe2MuZygiTUNBQU1JRCIsYSl9O2MuZ2V0 QXVkaWVuY2VNYW5hZ2VyVmlzaXRvcklEPWZ1bmN0aW9uKGEpe3ZhciBkPWMuYXVkaWVuY2VNYW5h Z2VyU2VydmVyLGI9IiI7Yy5sb2FkU1NMJiZjLmF1ZGllbmNlTWFuYWdlclNlcnZlclNlY3VyZSYm KGQ9Yy5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXJTZWN1cmUpO2QmJihiPSJodHRwIisoYy5sb2FkU1NM PyJzIjoiIikrIjovLyIrZCsiL2lkP2RfcnRiZFx4M2Rqc29uXHgyNmRfY2JceDNkc19jX2lsJTVC IitjLl9pbisiJTVELnNldEF1ZGllbmNlTWFuYWdlclZpc2l0b3JJRCIpO3JldHVybiBjLmgoIk1D QUFNSUQiLGIsYSl9O2MuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50PQ0KZnVuY3Rpb24o KXtjLmkoKTt2YXIgYT1jLmQoIk1DQUFNTEgiKTtyZXR1cm4gYT9hOjB9O2Muc2V0QW5hbHl0aWNz VmlzaXRvcklEPWZ1bmN0aW9uKGEpe2MuaSgpO2MuZygiTUNBSUQiLGEpfTtjLmdldEFuYWx5dGlj c1Zpc2l0b3JJRD1mdW5jdGlvbihhKXt2YXIgZD1jLnRyYWNraW5nU2VydmVyLGI9IiI7Yy5sb2Fk U1NMJiZjLnRyYWNraW5nU2VydmVyU2VjdXJlJiYoZD1jLnRyYWNraW5nU2VydmVyU2VjdXJlKTtk JiYoYj0iaHR0cCIrKGMubG9hZFNTTD8icyI6IiIpKyI6Ly8iK2QrIi9pZD9jYWxsYmFja1x4M2Rz X2NfaWwlNUIiK2MuX2luKyIlNUQuc2V0QW5hbHl0aWNzVmlzaXRvcklEIik7cmV0dXJuIGMuaCgi TUNBSUQiLGIsYSl9O2MuZ2V0VmlzaXRvcklEPWZ1bmN0aW9uKGEpe3JldHVybiBjLmdldE1hcmtl dGluZ0Nsb3VkVmlzaXRvcklEKGEpfTtjLm5hbWVzcGFjZT1hO2MuY29va2llTmFtZT0iQU1DVl8i K2E7Yy5rPWMucygpO2MubG9hZFNTTD0wPD1nLmxvY2F0aW9uLnByb3RvY29sLnRvTG93ZXJDYXNl KCkuaW5kZXhPZigiaHR0cHMiKTsNCmMubG9hZFRpbWVvdXQ9NTAwO2MubWFya2V0aW5nQ2xvdWRT ZXJ2ZXI9Yy5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXI9ImRwbS5kZW1kZXgubmV0In1WaXNpdG9yLmdl dEluc3RhbmNlPWZ1bmN0aW9uKGEpe3ZhciBjLGc9d2luZG93LnNfY19pbCxwO2lmKGcpZm9yKHA9 MDtwPGcubGVuZ3RoO3ArKylpZigoYz1nW3BdKSYmIlZpc2l0b3IiPT1jLl9jJiZjLm5hbWVzcGFj ZT09YSlyZXR1cm4gYztyZXR1cm4gbmV3IFZpc2l0b3IoYSl9Ow0KZnVuY3Rpb24gQXBwTWVhc3Vy ZW1lbnQoKXt2YXIgYT10aGlzO2EudmVyc2lvbj0iMS4yLjMiO3ZhciBjPXdpbmRvdztjLnNfY19p bnx8KGMuc19jX2lsPVtdLGMuc19jX2luPTApO2EuX2lsPWMuc19jX2lsO2EuX2luPWMuc19jX2lu O2EuX2lsW2EuX2luXT1hO2Muc19jX2luKys7YS5fYz0ic19jIjt2YXIgZz1jLmhiO2d8fChnPW51 bGwpO3ZhciBwPWMsbSxyO3RyeXttPXAucGFyZW50O2ZvcihyPXAubG9jYXRpb247bSYmbS5sb2Nh dGlvbiYmciYmIiIrbS5sb2NhdGlvbiE9IiIrciYmcC5sb2NhdGlvbiYmIiIrbS5sb2NhdGlvbiE9 IiIrcC5sb2NhdGlvbiYmbS5sb2NhdGlvbi5ob3N0PT1yLmhvc3Q7KXA9bSxtPXAucGFyZW50fWNh dGNoKHQpe31hLlNhPWZ1bmN0aW9uKGEpe3RyeXtjb25zb2xlLmxvZyhhKX1jYXRjaChiKXt9fTth LmthPWZ1bmN0aW9uKGEpe3JldHVybiIiK3BhcnNlSW50KGEpPT0iIithfTthLnJlcGxhY2U9ZnVu Y3Rpb24oYSxiLGYpe3JldHVybiFhfHwwPmEuaW5kZXhPZihiKT8NCmE6YS5zcGxpdChiKS5qb2lu KGYpfTthLmVzY2FwZT1mdW5jdGlvbihkKXt2YXIgYixmO2lmKCFkKXJldHVybiBkO2Q9ZW5jb2Rl VVJJQ29tcG9uZW50KGQpO2ZvcihiPTA7Nz5iO2IrKylmPSIrfiEqKCknIi5zdWJzdHJpbmcoYixi KzEpLDA8PWQuaW5kZXhPZihmKSYmKGQ9YS5yZXBsYWNlKGQsZiwiJSIrZi5jaGFyQ29kZUF0KDAp LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKSk7cmV0dXJuIGR9O2EudW5lc2NhcGU9ZnVuY3Rp b24oZCl7aWYoIWQpcmV0dXJuIGQ7ZD0wPD1kLmluZGV4T2YoIisiKT9hLnJlcGxhY2UoZCwiKyIs IiAiKTpkO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGQpfWNhdGNoKGIpe31yZXR1cm4g dW5lc2NhcGUoZCl9O2EuSmE9ZnVuY3Rpb24oKXt2YXIgZD1jLmxvY2F0aW9uLmhvc3RuYW1lLGI9 YS5mcENvb2tpZURvbWFpblBlcmlvZHMsZjtifHwoYj1hLmNvb2tpZURvbWFpblBlcmlvZHMpO2lm KGQmJiFhLmRhJiYhL15bMC05Ll0rJC8udGVzdChkKSYmDQooYj1iP3BhcnNlSW50KGIpOjIsYj0y PGI/YjoyLGY9ZC5sYXN0SW5kZXhPZigiLiIpLDA8PWYpKXtmb3IoOzA8PWYmJjE8YjspZj1kLmxh c3RJbmRleE9mKCIuIixmLTEpLGItLTthLmRhPTA8Zj9kLnN1YnN0cmluZyhmKTpkfXJldHVybiBh LmRhfTthLmNfcj1hLmNvb2tpZVJlYWQ9ZnVuY3Rpb24oZCl7ZD1hLmVzY2FwZShkKTt2YXIgYj0i ICIrYS5kLmNvb2tpZSxmPWIuaW5kZXhPZigiICIrZCsiXHgzZCIpLGM9MD5mP2Y6Yi5pbmRleE9m KCI7IixmKTtkPTA+Zj8iIjphLnVuZXNjYXBlKGIuc3Vic3RyaW5nKGYrMitkLmxlbmd0aCwwPmM/ Yi5sZW5ndGg6YykpO3JldHVybiJbW0JdXSIhPWQ/ZDoiIn07YS5jX3c9YS5jb29raWVXcml0ZT1m dW5jdGlvbihkLGIsZil7dmFyIGM9YS5KYSgpLGs9YS5jb29raWVMaWZldGltZSxuO2I9IiIrYjtr PWs/KCIiK2spLnRvVXBwZXJDYXNlKCk6IiI7ZiYmIlNFU1NJT04iIT1rJiYiTk9ORSIhPWsmJigo bj0iIiE9Yj9wYXJzZUludChrP2s6MCk6DQotNjApPyhmPW5ldyBEYXRlLGYuc2V0VGltZShmLmdl dFRpbWUoKSsxRTMqbikpOjE9PWYmJihmPW5ldyBEYXRlLG49Zi5nZXRZZWFyKCksZi5zZXRZZWFy KG4rNSsoMTkwMD5uPzE5MDA6MCkpKSk7cmV0dXJuIGQmJiJOT05FIiE9az8oYS5kLmNvb2tpZT1k KyJceDNkIithLmVzY2FwZSgiIiE9Yj9iOiJbW0JdXSIpKyI7IHBhdGhceDNkLzsiKyhmJiYiU0VT U0lPTiIhPWs/IiBleHBpcmVzXHgzZCIrZi50b0dNVFN0cmluZygpKyI7IjoiIikrKGM/IiBkb21h aW5ceDNkIitjKyI7IjoiIiksYS5jb29raWVSZWFkKGQpPT1iKTowfTthLkQ9W107YS5DPWZ1bmN0 aW9uKGQsYixmKXtpZihhLmVhKXJldHVybiAwO2EubWF4RGVsYXl8fChhLm1heERlbGF5PTI1MCk7 dmFyIGM9MCxrPShuZXcgRGF0ZSkuZ2V0VGltZSgpK2EubWF4RGVsYXksbj1hLmQuZmIscT1bIndl YmtpdHZpc2liaWxpdHljaGFuZ2UiLCJ2aXNpYmlsaXR5Y2hhbmdlIl07bnx8KG49YS5kLmdiKTtp ZihuJiYicHJlcmVuZGVyIj09DQpuKXtpZighYS5OKXthLk49MTtmb3IoZj0wO2Y8cS5sZW5ndGg7 ZisrKWEuZC5hZGRFdmVudExpc3RlbmVyKHFbZl0sZnVuY3Rpb24oKXt2YXIgZD1hLmQuZmI7ZHx8 KGQ9YS5kLmdiKTsidmlzaWJsZSI9PWQmJihhLk49MCxhLmRlbGF5UmVhZHkoKSl9KX1jPTE7az0w fWVsc2UgZnx8YS5xKCJfZCIpJiYoYz0xKTtjJiYoYS5ELnB1c2goe206ZCxhOmIsdDprfSksYS5O fHxzZXRUaW1lb3V0KGEuZGVsYXlSZWFkeSxhLm1heERlbGF5KSk7cmV0dXJuIGN9O2EuZGVsYXlS ZWFkeT1mdW5jdGlvbigpe3ZhciBkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGI9MCxmO2ZvcihhLnEo Il9kIikmJihiPTEpOzA8YS5ELmxlbmd0aDspe2Y9YS5ELnNoaWZ0KCk7aWYoYiYmIWYudCYmZi50 PmQpe2EuRC51bnNoaWZ0KGYpO3NldFRpbWVvdXQoYS5kZWxheVJlYWR5LHBhcnNlSW50KGEubWF4 RGVsYXkvMikpO2JyZWFrfWEuZWE9MTthW2YubV0uYXBwbHkoYSxmLmEpO2EuZWE9MH19O2Euc2V0 QWNjb3VudD0NCmEuc2E9ZnVuY3Rpb24oZCl7dmFyIGIsZjtpZighYS5DKCJzZXRBY2NvdW50Iixh cmd1bWVudHMpKWlmKGEuYWNjb3VudD1kLGEuYWxsQWNjb3VudHMpe2I9YS5hbGxBY2NvdW50cy5j b25jYXQoZC5zcGxpdCgiLCIpKTthLmFsbEFjY291bnRzPVtdO2Iuc29ydCgpO2ZvcihmPTA7Zjxi Lmxlbmd0aDtmKyspKDA9PWZ8fGJbZi0xXSE9YltmXSkmJmEuYWxsQWNjb3VudHMucHVzaChiW2Zd KX1lbHNlIGEuYWxsQWNjb3VudHM9ZC5zcGxpdCgiLCIpfTthLmZvcmVhY2hWYXI9ZnVuY3Rpb24o ZCxiKXt2YXIgZixjLGssbixxPSIiO2s9Yz0iIjtpZihhLmxpZ2h0UHJvZmlsZUlEKWY9YS5ILChx PWEubGlnaHRUcmFja1ZhcnMpJiYocT0iLCIrcSsiLCIrYS5RLmpvaW4oIiwiKSsiLCIpO2Vsc2V7 Zj1hLmM7aWYoYS5wZXx8YS5saW5rVHlwZSlpZihxPWEubGlua1RyYWNrVmFycyxjPWEubGlua1Ry YWNrRXZlbnRzLGEucGUmJihrPWEucGUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSthLnBl LnN1YnN0cmluZygxKSwNCmFba10pKXE9YVtrXS5lYixjPWFba10uY2I7cSYmKHE9IiwiK3ErIiwi K2Euei5qb2luKCIsIikrIiwiKTtjJiZxJiYocSs9IixldmVudHMsIil9YiYmKGI9IiwiK2IrIiwi KTtmb3IoYz0wO2M8Zi5sZW5ndGg7YysrKWs9ZltjXSwobj1hW2tdKSYmKCFxfHwwPD1xLmluZGV4 T2YoIiwiK2srIiwiKSkmJighYnx8MDw9Yi5pbmRleE9mKCIsIitrKyIsIikpJiZkKGssbil9O2Eu WD1mdW5jdGlvbihkLGIsZixjLGspe3ZhciBuPSIiLHEsdSxnLG0scD0wOyJjb250ZXh0RGF0YSI9 PWQmJihkPSJjIik7aWYoYil7Zm9yKHEgaW4gYilpZighT2JqZWN0LnByb3RvdHlwZVtxXSYmKCFr fHxxLnN1YnN0cmluZygwLGsubGVuZ3RoKT09aykmJmJbcV0mJighZnx8MDw9Zi5pbmRleE9mKCIs IisoYz9jKyIuIjoiIikrcSsiLCIpKSl7Zz0hMTtpZihwKWZvcih1PTA7dTxwLmxlbmd0aDt1Kysp cS5zdWJzdHJpbmcoMCxwW3VdLmxlbmd0aCk9PXBbdV0mJihnPSEwKTtpZighZyYmKCIiPT1uJiYo bis9Ilx4MjYiKw0KZCsiLiIpLHU9YltxXSxrJiYocT1xLnN1YnN0cmluZyhrLmxlbmd0aCkpLDA8 cS5sZW5ndGgpKWlmKGc9cS5pbmRleE9mKCIuIiksMDxnKXU9cS5zdWJzdHJpbmcoMCxnKSxnPShr P2s6IiIpK3UrIi4iLHB8fChwPVtdKSxwLnB1c2goZyksbis9YS5YKHUsYixmLGMsZyk7ZWxzZSBp ZigiYm9vbGVhbiI9PXR5cGVvZiB1JiYodT11PyJ0cnVlIjoiZmFsc2UiKSx1KXtpZigicmV0cmll dmVMaWdodERhdGEiPT1jJiYwPmsuaW5kZXhPZigiLmNvbnRleHREYXRhLiIpKXN3aXRjaChnPXEu c3Vic3RyaW5nKDAsNCksbT1xLnN1YnN0cmluZyg0KSxxKXtjYXNlICJ0cmFuc2FjdGlvbklEIjpx PSJ4YWN0IjticmVhaztjYXNlICJjaGFubmVsIjpxPSJjaCI7YnJlYWs7Y2FzZSAiY2FtcGFpZ24i OnE9InYwIjticmVhaztkZWZhdWx0OmEua2EobSkmJigicHJvcCI9PWc/cT0iYyIrbToiZVZhciI9 PWc/cT0idiIrbToibGlzdCI9PWc/cT0ibCIrbToiaGllciI9PWcmJihxPSJoIittLHU9dS5zdWJz dHJpbmcoMCwNCjI1NSkpKX1uKz0iXHgyNiIrYS5lc2NhcGUocSkrIlx4M2QiK2EuZXNjYXBlKHUp fX0iIiE9biYmKG4rPSJceDI2LiIrZCl9cmV0dXJuIG59O2EuTGE9ZnVuY3Rpb24oKXt2YXIgZD0i IixiLGYsYyxrLG4scSxnLG0scD0iIixyPSIiLHQ9Zj0iIjtpZihhLmxpZ2h0UHJvZmlsZUlEKWI9 YS5ILChwPWEubGlnaHRUcmFja1ZhcnMpJiYocD0iLCIrcCsiLCIrYS5RLmpvaW4oIiwiKSsiLCIp O2Vsc2V7Yj1hLmM7aWYoYS5wZXx8YS5saW5rVHlwZSlpZihwPWEubGlua1RyYWNrVmFycyxyPWEu bGlua1RyYWNrRXZlbnRzLGEucGUmJihmPWEucGUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2Uo KSthLnBlLnN1YnN0cmluZygxKSxhW2ZdKSlwPWFbZl0uZWIscj1hW2ZdLmNiO3AmJihwPSIsIitw KyIsIithLnouam9pbigiLCIpKyIsIik7ciYmKHI9IiwiK3IrIiwiLHAmJihwKz0iLGV2ZW50cywi KSk7YS5ldmVudHMyJiYodCs9KCIiIT10PyIsIjoiIikrYS5ldmVudHMyKX1mb3IoZj0wO2Y8Yi5s ZW5ndGg7ZisrKXtrPQ0KYltmXTtuPWFba107Yz1rLnN1YnN0cmluZygwLDQpO3E9ay5zdWJzdHJp bmcoNCk7IW4mJiJldmVudHMiPT1rJiZ0JiYobj10LHQ9IiIpO2lmKG4mJighcHx8MDw9cC5pbmRl eE9mKCIsIitrKyIsIikpKXtzd2l0Y2goayl7Y2FzZSAidGltZXN0YW1wIjprPSJ0cyI7YnJlYWs7 Y2FzZSAiZHluYW1pY1ZhcmlhYmxlUHJlZml4IjprPSJEIjticmVhaztjYXNlICJ2aXNpdG9ySUQi Oms9InZpZCI7YnJlYWs7Y2FzZSAibWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQiOms9Im1pZCI7YnJl YWs7Y2FzZSAiYW5hbHl0aWNzVmlzaXRvcklEIjprPSJhaWQiO2JyZWFrO2Nhc2UgImF1ZGllbmNl TWFuYWdlclZpc2l0b3JJRCI6az0iYWFtaWQiO2JyZWFrO2Nhc2UgImF1ZGllbmNlTWFuYWdlckxv Y2F0aW9uSGludCI6az0iYWFtbGgiO2JyZWFrO2Nhc2UgInBhZ2VVUkwiOms9ImciOzI1NTxuLmxl bmd0aCYmKGEucGFnZVVSTFJlc3Q9bi5zdWJzdHJpbmcoMjU1KSxuPW4uc3Vic3RyaW5nKDAsMjU1 KSk7DQpicmVhaztjYXNlICJwYWdlVVJMUmVzdCI6az0iLWciO2JyZWFrO2Nhc2UgInJlZmVycmVy IjprPSJyIjticmVhaztjYXNlICJ2bWsiOmNhc2UgInZpc2l0b3JNaWdyYXRpb25LZXkiOms9InZt dCI7YnJlYWs7Y2FzZSAidmlzaXRvck1pZ3JhdGlvblNlcnZlciI6az0idm1mIjthLnNzbCYmYS52 aXNpdG9yTWlncmF0aW9uU2VydmVyU2VjdXJlJiYobj0iIik7YnJlYWs7Y2FzZSAidmlzaXRvck1p Z3JhdGlvblNlcnZlclNlY3VyZSI6az0idm1mIjshYS5zc2wmJmEudmlzaXRvck1pZ3JhdGlvblNl cnZlciYmKG49IiIpO2JyZWFrO2Nhc2UgImNoYXJTZXQiOms9ImNlIjticmVhaztjYXNlICJ2aXNp dG9yTmFtZXNwYWNlIjprPSJucyI7YnJlYWs7Y2FzZSAiY29va2llRG9tYWluUGVyaW9kcyI6az0i Y2RwIjticmVhaztjYXNlICJjb29raWVMaWZldGltZSI6az0iY2wiO2JyZWFrO2Nhc2UgInZhcmlh YmxlUHJvdmlkZXIiOms9InZ2cCI7YnJlYWs7Y2FzZSAiY3VycmVuY3lDb2RlIjprPSJjYyI7DQpi cmVhaztjYXNlICJjaGFubmVsIjprPSJjaCI7YnJlYWs7Y2FzZSAidHJhbnNhY3Rpb25JRCI6az0i eGFjdCI7YnJlYWs7Y2FzZSAiY2FtcGFpZ24iOms9InYwIjticmVhaztjYXNlICJyZXNvbHV0aW9u IjprPSJzIjticmVhaztjYXNlICJjb2xvckRlcHRoIjprPSJjIjticmVhaztjYXNlICJqYXZhc2Ny aXB0VmVyc2lvbiI6az0iaiI7YnJlYWs7Y2FzZSAiamF2YUVuYWJsZWQiOms9InYiO2JyZWFrO2Nh c2UgImNvb2tpZXNFbmFibGVkIjprPSJrIjticmVhaztjYXNlICJicm93c2VyV2lkdGgiOms9ImJ3 IjticmVhaztjYXNlICJicm93c2VySGVpZ2h0IjprPSJiaCI7YnJlYWs7Y2FzZSAiY29ubmVjdGlv blR5cGUiOms9ImN0IjticmVhaztjYXNlICJob21lcGFnZSI6az0iaHAiO2JyZWFrO2Nhc2UgInBs dWdpbnMiOms9InAiO2JyZWFrO2Nhc2UgImV2ZW50cyI6dCYmKG4rPSgiIiE9bj8iLCI6IiIpK3Qp O2lmKHIpe3E9bi5zcGxpdCgiLCIpO249IiI7Zm9yKGM9MDtjPHEubGVuZ3RoO2MrKylnPQ0KcVtj XSxtPWcuaW5kZXhPZigiXHgzZCIpLDA8PW0mJihnPWcuc3Vic3RyaW5nKDAsbSkpLG09Zy5pbmRl eE9mKCI6IiksMDw9bSYmKGc9Zy5zdWJzdHJpbmcoMCxtKSksMDw9ci5pbmRleE9mKCIsIitnKyIs IikmJihuKz0obj8iLCI6IiIpK3FbY10pfWJyZWFrO2Nhc2UgImV2ZW50czIiOm49IiI7YnJlYWs7 Y2FzZSAiY29udGV4dERhdGEiOmQrPWEuWCgiYyIsYVtrXSxwLGspO249IiI7YnJlYWs7Y2FzZSAi bGlnaHRQcm9maWxlSUQiOms9Im10cCI7YnJlYWs7Y2FzZSAibGlnaHRTdG9yZUZvclNlY29uZHMi Oms9Im10c3MiO2EubGlnaHRQcm9maWxlSUR8fChuPSIiKTticmVhaztjYXNlICJsaWdodEluY3Jl bWVudEJ5IjprPSJtdGkiO2EubGlnaHRQcm9maWxlSUR8fChuPSIiKTticmVhaztjYXNlICJyZXRy aWV2ZUxpZ2h0UHJvZmlsZXMiOms9Im10c3IiO2JyZWFrO2Nhc2UgImRlbGV0ZUxpZ2h0UHJvZmls ZXMiOms9Im10c2QiO2JyZWFrO2Nhc2UgInJldHJpZXZlTGlnaHREYXRhIjphLnJldHJpZXZlTGln aHRQcm9maWxlcyYmDQooZCs9YS5YKCJtdHMiLGFba10scCxrKSk7bj0iIjticmVhaztkZWZhdWx0 OmEua2EocSkmJigicHJvcCI9PWM/az0iYyIrcToiZVZhciI9PWM/az0idiIrcToibGlzdCI9PWM/ az0ibCIrcToiaGllciI9PWMmJihrPSJoIitxLG49bi5zdWJzdHJpbmcoMCwyNTUpKSl9biYmKGQr PSJceDI2IitrKyJceDNkIisoInBldiIhPWsuc3Vic3RyaW5nKDAsMyk/YS5lc2NhcGUobik6bikp fSJwZXYzIj09ayYmYS5nJiYoZCs9YS5nKX1yZXR1cm4gZH07YS51PWZ1bmN0aW9uKGEpe3ZhciBi PWEudGFnTmFtZTtpZigidW5kZWZpbmVkIiE9IiIrYS5wYnx8InVuZGVmaW5lZCIhPSIiK2EuWGEm JiJIVE1MIiE9KCIiK2EuWGEpLnRvVXBwZXJDYXNlKCkpcmV0dXJuIiI7Yj1iJiZiLnRvVXBwZXJD YXNlP2IudG9VcHBlckNhc2UoKToiIjsiU0hBUEUiPT1iJiYoYj0iIik7YiYmKCgiSU5QVVQiPT1i fHwiQlVUVE9OIj09YikmJmEudHlwZSYmYS50eXBlLnRvVXBwZXJDYXNlP2I9YS50eXBlLnRvVXBw ZXJDYXNlKCk6DQohYiYmYS5ocmVmJiYoYj0iQSIpKTtyZXR1cm4gYn07YS5nYT1mdW5jdGlvbihh KXt2YXIgYj1hLmhyZWY/YS5ocmVmOiIiLGYsYyxrO2Y9Yi5pbmRleE9mKCI6Iik7Yz1iLmluZGV4 T2YoIj8iKTtrPWIuaW5kZXhPZigiLyIpO2lmKGImJigwPmZ8fDA8PWMmJmY+Y3x8MDw9ayYmZj5r KSljPWEucHJvdG9jb2wmJjE8YS5wcm90b2NvbC5sZW5ndGg/YS5wcm90b2NvbDpsLnByb3RvY29s P2wucHJvdG9jb2w6IiIsZj1sLnBhdGhuYW1lLmxhc3RJbmRleE9mKCIvIiksYj0oYz9jKyIvLyI6 IiIpKyhhLmhvc3Q/YS5ob3N0OmwuaG9zdD9sLmhvc3Q6IiIpKygiLyIhPWguc3Vic3RyaW5nKDAs MSk/bC5wYXRobmFtZS5zdWJzdHJpbmcoMCwwPmY/MDpmKSsiLyI6IiIpK2I7cmV0dXJuIGJ9O2Eu Rj1mdW5jdGlvbihkKXt2YXIgYj1hLnUoZCksZixjLGs9IiIsbj0wO3JldHVybiBiJiYoZj1kLnBy b3RvY29sLGM9ZC5vbmNsaWNrLGQuaHJlZiYmKCJBIj09Ynx8IkFSRUEiPT1iKSYmKCFjfHwhZnx8 DQowPmYudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJqYXZhc2NyaXB0IikpP2s9YS5nYShkKTpjPyhr PWEucmVwbGFjZShhLnJlcGxhY2UoYS5yZXBsYWNlKGEucmVwbGFjZSgiIitjLCJcciIsIiIpLCJc biIsIiIpLCJcdCIsIiIpLCIgIiwiIiksbj0yKToiSU5QVVQiPT1ifHwiU1VCTUlUIj09Yj8oZC52 YWx1ZT9rPWQudmFsdWU6ZC5pbm5lclRleHQ/az1kLmlubmVyVGV4dDpkLnRleHRDb250ZW50JiYo az1kLnRleHRDb250ZW50KSxuPTMpOmQuc3JjJiYiSU1BR0UiPT1iJiYoaz1kLnNyYyksayk/e2lk Omsuc3Vic3RyaW5nKDAsMTAwKSx0eXBlOm59OjB9O2EubWI9ZnVuY3Rpb24oZCl7Zm9yKHZhciBi PWEudShkKSxmPWEuRihkKTtkJiYhZiYmIkJPRFkiIT1iOylpZihkPWQucGFyZW50RWxlbWVudD9k LnBhcmVudEVsZW1lbnQ6ZC5wYXJlbnROb2RlKWI9YS51KGQpLGY9YS5GKGQpO2lmKCFmfHwiQk9E WSI9PWIpZD0wO2lmKGQmJihiPWQub25jbGljaz8iIitkLm9uY2xpY2s6IiIsMDw9DQpiLmluZGV4 T2YoIi50bCgiKXx8MDw9Yi5pbmRleE9mKCIudHJhY2tMaW5rKCIpKSlkPTA7cmV0dXJuIGR9O2Eu VmE9ZnVuY3Rpb24oKXt2YXIgZCxiLGY9YS5saW5rT2JqZWN0LHM9YS5saW5rVHlwZSxrPWEubGlu a1VSTCxuLHE7YS5SPTE7Znx8KGEuUj0wLGY9YS5qKTtpZihmKXtkPWEudShmKTtmb3IoYj1hLkYo Zik7ZiYmIWImJiJCT0RZIiE9ZDspaWYoZj1mLnBhcmVudEVsZW1lbnQ/Zi5wYXJlbnRFbGVtZW50 OmYucGFyZW50Tm9kZSlkPWEudShmKSxiPWEuRihmKTtpZighYnx8IkJPRFkiPT1kKWY9MDtpZihm KXt2YXIgZz1mLm9uY2xpY2s/IiIrZi5vbmNsaWNrOiIiO2lmKDA8PWcuaW5kZXhPZigiLnRsKCIp fHwwPD1nLmluZGV4T2YoIi50cmFja0xpbmsoIikpZj0wfX1lbHNlIGEuUj0xOyFrJiZmJiYoaz1h LmdhKGYpKTtrJiYhYS5saW5rTGVhdmVRdWVyeVN0cmluZyYmKG49ay5pbmRleE9mKCI/IiksMDw9 biYmKGs9ay5zdWJzdHJpbmcoMCxuKSkpO2lmKCFzJiZrKXt2YXIgbT0NCjAscD0wLHI7aWYoYS50 cmFja0Rvd25sb2FkTGlua3MmJmEubGlua0Rvd25sb2FkRmlsZVR5cGVzKXtnPWsudG9Mb3dlckNh c2UoKTtuPWcuaW5kZXhPZigiPyIpO3E9Zy5pbmRleE9mKCIjIik7MDw9bj8wPD1xJiZxPG4mJihu PXEpOm49cTswPD1uJiYoZz1nLnN1YnN0cmluZygwLG4pKTtuPWEubGlua0Rvd25sb2FkRmlsZVR5 cGVzLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiwiKTtmb3IocT0wO3E8bi5sZW5ndGg7cSsrKShyPW5b cV0pJiZnLnN1YnN0cmluZyhnLmxlbmd0aC0oci5sZW5ndGgrMSkpPT0iLiIrciYmKHM9ImQiKX1p ZihhLnRyYWNrRXh0ZXJuYWxMaW5rcyYmIXMmJihnPWsudG9Mb3dlckNhc2UoKSxhLmphKGcpKSlp ZihhLmxpbmtJbnRlcm5hbEZpbHRlcnN8fChhLmxpbmtJbnRlcm5hbEZpbHRlcnM9Yy5sb2NhdGlv bi5ob3N0bmFtZSksbj0wLGEubGlua0V4dGVybmFsRmlsdGVycz8obj1hLmxpbmtFeHRlcm5hbEZp bHRlcnMudG9Mb3dlckNhc2UoKS5zcGxpdCgiLCIpLA0KbT0xKTphLmxpbmtJbnRlcm5hbEZpbHRl cnMmJihuPWEubGlua0ludGVybmFsRmlsdGVycy50b0xvd2VyQ2FzZSgpLnNwbGl0KCIsIikpLG4p e2ZvcihxPTA7cTxuLmxlbmd0aDtxKyspcj1uW3FdLDA8PWcuaW5kZXhPZihyKSYmKHA9MSk7cD9t JiYocz0iZSIpOm18fChzPSJlIil9fWEubGlua09iamVjdD1mO2EubGlua1VSTD1rO2EubGlua1R5 cGU9cztpZihhLnRyYWNrQ2xpY2tNYXB8fGEudHJhY2tJbmxpbmVTdGF0cylpZihhLmc9IiIsZilz PWEucGFnZU5hbWUsaz0xLGY9Zi5zb3VyY2VJbmRleCxzfHwocz1hLnBhZ2VVUkwsaz0wKSxjLnNf b2JqZWN0SUQmJihiLmlkPWMuc19vYmplY3RJRCxmPWIudHlwZT0xKSxzJiYoYiYmYi5pZCYmZCkm JihhLmc9Ilx4MjZwaWRceDNkIithLmVzY2FwZShzLnN1YnN0cmluZygwLDI1NSkpKyhrPyJceDI2 cGlkdFx4M2QiK2s6IiIpKyJceDI2b2lkXHgzZCIrYS5lc2NhcGUoYi5pZC5zdWJzdHJpbmcoMCwx MDApKSsoYi50eXBlPyJceDI2b2lkdFx4M2QiKw0KYi50eXBlOiIiKSsiXHgyNm90XHgzZCIrZCso Zj8iXHgyNm9pXHgzZCIrZjoiIikpfTthLk1hPWZ1bmN0aW9uKCl7dmFyIGQ9YS5SLGI9YS5saW5r VHlwZSxmPWEubGlua1VSTCxjPWEubGlua05hbWU7aWYoYiYmKGZ8fGMpKWI9Yi50b0xvd2VyQ2Fz ZSgpLCJkIiE9YiYmImUiIT1iJiYoYj0ibyIpLGEucGU9Imxua18iK2IsYS5wZXYxPWY/YS5lc2Nh cGUoZik6IiIsYS5wZXYyPWM/YS5lc2NhcGUoYyk6IiIsZD0xO2EuYWJvcnQmJihkPTApO2lmKGEu dHJhY2tDbGlja01hcHx8YS50cmFja0lubGluZVN0YXRzKXt2YXIgYj17fSxmPTAsaz1hLmNvb2tp ZVJlYWQoInNfc3EiKSxuPWs/ay5zcGxpdCgiXHgyNiIpOjAsZyxtLHAsaz0wO2lmKG4pZm9yKGc9 MDtnPG4ubGVuZ3RoO2crKyltPW5bZ10uc3BsaXQoIlx4M2QiKSxjPWEudW5lc2NhcGUobVswXSku c3BsaXQoIiwiKSxtPWEudW5lc2NhcGUobVsxXSksYlttXT1jO2M9YS5hY2NvdW50LnNwbGl0KCIs Iik7aWYoZHx8YS5nKXtkJiYhYS5nJiYNCihrPTEpO2ZvcihtIGluIGIpaWYoIU9iamVjdC5wcm90 b3R5cGVbbV0pZm9yKGc9MDtnPGMubGVuZ3RoO2crKyl7ayYmKHA9YlttXS5qb2luKCIsIikscD09 YS5hY2NvdW50JiYoYS5nKz0oIlx4MjYiIT1tLmNoYXJBdCgwKT8iXHgyNiI6IiIpK20sYlttXT1b XSxmPTEpKTtmb3Iobj0wO248YlttXS5sZW5ndGg7bisrKXA9YlttXVtuXSxwPT1jW2ddJiYoayYm KGEuZys9Ilx4MjZ1XHgzZCIrYS5lc2NhcGUocCkrKCJceDI2IiE9bS5jaGFyQXQoMCk/Ilx4MjYi OiIiKSttKyJceDI2dVx4M2QwIiksYlttXS5zcGxpY2UobiwxKSxmPTEpfWR8fChmPTEpO2lmKGYp e2s9IiI7Zz0yOyFkJiZhLmcmJihrPWEuZXNjYXBlKGMuam9pbigiLCIpKSsiXHgzZCIrYS5lc2Nh cGUoYS5nKSxnPTEpO2ZvcihtIGluIGIpIU9iamVjdC5wcm90b3R5cGVbbV0mJjA8ZyYmMDxiW21d Lmxlbmd0aCYmKGsrPShrPyJceDI2IjoiIikrYS5lc2NhcGUoYlttXS5qb2luKCIsIikpKyJceDNk IithLmVzY2FwZShtKSwNCmctLSk7YS5jb29raWVXcml0ZSgic19zcSIsayl9fX1yZXR1cm4gZH07 YS5OYT1mdW5jdGlvbigpe2lmKCFhLmJiKXt2YXIgZD1uZXcgRGF0ZSxiPXAubG9jYXRpb24sZixj LGssbj1mPSIiLGc9IiIsbT0iIixyPSIxLjIiLHQ9YS5jb29raWVXcml0ZSgic19jYyIsInRydWUi LDApPyJZIjoiTiIsdz0iIixBPSIiLHk9MDtpZihkLnNldFVUQ0RhdGUmJihyPSIxLjMiLHkudG9Q cmVjaXNpb24mJihyPSIxLjUiLGY9W10sZi5mb3JFYWNoKSkpe3I9IjEuNiI7az0wO2M9e307dHJ5 e2s9bmV3IEl0ZXJhdG9yKGMpLGsubmV4dCYmKHI9IjEuNyIsZi5yZWR1Y2UmJihyPSIxLjgiLHIu dHJpbSYmKHI9IjEuOC4xIixEYXRlLnBhcnNlJiYocj0iMS44LjIiLE9iamVjdC5jcmVhdGUmJihy PSIxLjguNSIpKSkpKX1jYXRjaChCKXt9fWY9c2NyZWVuLndpZHRoKyJ4IitzY3JlZW4uaGVpZ2h0 O2s9bmF2aWdhdG9yLmphdmFFbmFibGVkKCk/IlkiOiJOIjtjPXNjcmVlbi5waXhlbERlcHRoP3Nj cmVlbi5waXhlbERlcHRoOg0Kc2NyZWVuLmNvbG9yRGVwdGg7Zz1hLncuaW5uZXJXaWR0aD9hLncu aW5uZXJXaWR0aDphLmQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoO209YS53LmlubmVySGVp Z2h0P2Eudy5pbm5lckhlaWdodDphLmQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodDtkPW5h dmlnYXRvci5wbHVnaW5zO3RyeXthLmIuYWRkQmVoYXZpb3IoIiNkZWZhdWx0I2hvbWVQYWdlIiks dz1hLmIubmIoYik/IlkiOiJOIn1jYXRjaChDKXt9dHJ5e2EuYi5hZGRCZWhhdmlvcigiI2RlZmF1 bHQjY2xpZW50Q2FwcyIpLEE9YS5iLmNvbm5lY3Rpb25UeXBlfWNhdGNoKEQpe31pZihkKWZvcig7 eTxkLmxlbmd0aCYmMzA+eTspe2lmKGI9ZFt5XS5uYW1lKWI9Yi5zdWJzdHJpbmcoMCwxMDApKyI7 IiwwPm4uaW5kZXhPZihiKSYmKG4rPWIpO3krK31hLnJlc29sdXRpb249ZjthLmNvbG9yRGVwdGg9 YzthLmphdmFzY3JpcHRWZXJzaW9uPXI7YS5qYXZhRW5hYmxlZD1rO2EuY29va2llc0VuYWJsZWQ9 dDthLmJyb3dzZXJXaWR0aD0NCmc7YS5icm93c2VySGVpZ2h0PW07YS5jb25uZWN0aW9uVHlwZT1B O2EuaG9tZXBhZ2U9dzthLnBsdWdpbnM9bjthLmJiPTF9fTthLkk9e307YS5sb2FkTW9kdWxlPWZ1 bmN0aW9uKGQsYil7dmFyIGY9YS5JW2RdO2lmKCFmKXtmPWNbIkFwcE1lYXN1cmVtZW50X01vZHVs ZV8iK2RdP25ldyBjWyJBcHBNZWFzdXJlbWVudF9Nb2R1bGVfIitkXShhKTp7fTthLklbZF09YVtk XT1mO2YudWE9ZnVuY3Rpb24oKXtyZXR1cm4gZi53YX07Zi54YT1mdW5jdGlvbihiKXtpZihmLndh PWIpYVtkKyJfb25Mb2FkIl09YixhLkMoZCsiX29uTG9hZCIsW2EsZl0sMSl8fGIoYSxmKX07dHJ5 e09iamVjdC5kZWZpbmVQcm9wZXJ0eT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZiwib25Mb2FkIix7 Z2V0OmYudWEsc2V0OmYueGF9KTpmLl9vbGM9MX1jYXRjaChzKXtmLl9vbGM9MX19YiYmKGFbZCsi X29uTG9hZCJdPWIsYS5DKGQrIl9vbkxvYWQiLFthLGZdLDEpfHxiKGEsZikpfTthLnE9ZnVuY3Rp b24oZCl7dmFyIGIsDQpmO2ZvcihiIGluIGEuSSlpZighT2JqZWN0LnByb3RvdHlwZVtiXSYmKGY9 YS5JW2JdKSlpZihmLl9vbGMmJmYub25Mb2FkJiYoZi5fb2xjPTAsZi5vbkxvYWQoYSxmKSksZltk XSYmZltkXSgpKXJldHVybiAxO3JldHVybiAwfTthLlFhPWZ1bmN0aW9uKCl7dmFyIGQ9TWF0aC5m bG9vcigxRTEzKk1hdGgucmFuZG9tKCkpLGI9YS52aXNpdG9yU2FtcGxpbmcsZj1hLnZpc2l0b3JT YW1wbGluZ0dyb3VwLGY9InNfdnNuXyIrKGEudmlzaXRvck5hbWVzcGFjZT9hLnZpc2l0b3JOYW1l c3BhY2U6YS5hY2NvdW50KSsoZj8iXyIrZjoiIiksYz1hLmNvb2tpZVJlYWQoZik7aWYoYil7YyYm KGM9cGFyc2VJbnQoYykpO2lmKCFjKXtpZighYS5jb29raWVXcml0ZShmLGQpKXJldHVybiAwO2M9 ZH1pZihjJTFFND52KXJldHVybiAwfXJldHVybiAxfTthLko9ZnVuY3Rpb24oZCxiKXt2YXIgZixj LGssZyxtLHA7Zm9yKGY9MDsyPmY7ZisrKXtjPTA8Zj9hLmFhOmEuYztmb3Ioaz0wO2s8Yy5sZW5n dGg7aysrKWlmKGc9DQpjW2tdLChtPWRbZ10pfHxkWyIhIitnXSl7aWYoIWImJigiY29udGV4dERh dGEiPT1nfHwicmV0cmlldmVMaWdodERhdGEiPT1nKSYmYVtnXSlmb3IocCBpbiBhW2ddKW1bcF18 fChtW3BdPWFbZ11bcF0pO2FbZ109bX19fTthLnFhPWZ1bmN0aW9uKGQsYil7dmFyIGYsYyxrLGc7 Zm9yKGY9MDsyPmY7ZisrKXtjPTA8Zj9hLmFhOmEuYztmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKWc9 Y1trXSxkW2ddPWFbZ10sIWImJiFkW2ddJiYoZFsiISIrZ109MSl9fTthLklhPWZ1bmN0aW9uKGEp e3ZhciBiLGYsYyxrLGcsbT0wLHAscj0iIix0PSIiO2lmKGEmJjI1NTxhLmxlbmd0aCYmKGI9IiIr YSxmPWIuaW5kZXhPZigiPyIpLDA8ZiYmKHA9Yi5zdWJzdHJpbmcoZisxKSxiPWIuc3Vic3RyaW5n KDAsZiksaz1iLnRvTG93ZXJDYXNlKCksYz0wLCJodHRwOi8vIj09ay5zdWJzdHJpbmcoMCw3KT9j Kz03OiJodHRwczovLyI9PWsuc3Vic3RyaW5nKDAsOCkmJihjKz04KSxmPWsuaW5kZXhPZigiLyIs YyksDQowPGYmJihrPWsuc3Vic3RyaW5nKGMsZiksZz1iLnN1YnN0cmluZyhmKSxiPWIuc3Vic3Ry aW5nKDAsZiksMDw9ay5pbmRleE9mKCJnb29nbGUiKT9tPSIscSxpZSxzdGFydCxzZWFyY2hfa2V5 LHdvcmQsa3csY2QsIjowPD1rLmluZGV4T2YoInlhaG9vLmNvIikmJihtPSIscCxlaSwiKSxtJiZw KSkpKXtpZigoYT1wLnNwbGl0KCJceDI2IikpJiYxPGEubGVuZ3RoKXtmb3IoYz0wO2M8YS5sZW5n dGg7YysrKWs9YVtjXSxmPWsuaW5kZXhPZigiXHgzZCIpLDA8ZiYmMDw9bS5pbmRleE9mKCIsIitr LnN1YnN0cmluZygwLGYpKyIsIik/cis9KHI/Ilx4MjYiOiIiKStrOnQrPSh0PyJceDI2IjoiIikr aztyJiZ0P3A9cisiXHgyNiIrdDp0PSIifWY9MjUzLShwLmxlbmd0aC10Lmxlbmd0aCktYi5sZW5n dGg7YT1iKygwPGY/Zy5zdWJzdHJpbmcoMCxmKToiIikrIj8iK3B9cmV0dXJuIGF9O2EuemE9ITE7 YS4kPSExO2Eua2I9ZnVuY3Rpb24oZCl7YS5tYXJrZXRpbmdDbG91ZFZpc2l0b3JJRD0NCmQ7YS4k PSEwO2EuQSgpfTthLks9ITE7YS5ZPSExO2EudGE9ZnVuY3Rpb24oZCl7YS5hbmFseXRpY3NWaXNp dG9ySUQ9ZDthLlk9ITA7YS5BKCl9O2EueWE9ITE7YS5aPSExO2EuamI9ZnVuY3Rpb24oZCl7YS5h dWRpZW5jZU1hbmFnZXJWaXNpdG9ySUQ9ZDthLmF1ZGllbmNlTWFuYWdlclZpc2l0b3JJRCYmYS52 aXNpdG9yLmdldEF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludCYmKGEuYXVkaWVuY2VNYW5hZ2Vy TG9jYXRpb25IaW50PWEudmlzaXRvci5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQoKSk7 YS5aPSEwO2EuQSgpfTthLmlzUmVhZHlUb1RyYWNrPWZ1bmN0aW9uKCl7dmFyIGQ9ITAsYj1hLnZp c2l0b3I7aWYoYiYmYi5pc0FsbG93ZWQoKSl7aWYoIWEuSyYmIWEuYW5hbHl0aWNzVmlzaXRvcklE JiZiLmdldEFuYWx5dGljc1Zpc2l0b3JJRCYmKGEuYW5hbHl0aWNzVmlzaXRvcklEPWIuZ2V0QW5h bHl0aWNzVmlzaXRvcklEKFthLGEudGFdKSwhYS5hbmFseXRpY3NWaXNpdG9ySUQpKWEuSz0NCiEw O2lmKGEuemEmJiFhLiQmJiFhLm1hcmtldGluZ0Nsb3VkVmlzaXRvcklEfHxhLksmJiFhLlkmJiFh LmFuYWx5dGljc1Zpc2l0b3JJRHx8YS55YSYmIWEuWiYmIWEuYXVkaWVuY2VNYW5hZ2VyVmlzaXRv cklEKWQ9ITF9cmV0dXJuIGR9O2Euaz1nO2EubD0wO2EuY2FsbGJhY2tXaGVuUmVhZHlUb1RyYWNr PWZ1bmN0aW9uKGQsYixjKXt2YXIgcztzPXt9O3MuRGE9ZDtzLkNhPWI7cy5BYT1jO2Euaz09ZyYm KGEuaz1bXSk7YS5rLnB1c2gocyk7MD09YS5sJiYoYS5sPXNldEludGVydmFsKGEuQSwxMDApKX07 YS5BPWZ1bmN0aW9uKCl7dmFyIGQ7aWYoYS5pc1JlYWR5VG9UcmFjaygpJiYoYS5sJiYoY2xlYXJJ bnRlcnZhbChhLmwpLGEubD0wKSxhLmshPWcpKWZvcig7MDxhLmsubGVuZ3RoOylkPWEuay5zaGlm dCgpLGQuQ2EuYXBwbHkoZC5EYSxkLkFhKX07YS52YT1mdW5jdGlvbihkKXt2YXIgYixjLHM9Zyxr PWc7aWYoIWEuaXNSZWFkeVRvVHJhY2soKSl7Yj1bXTtpZihkIT1nKWZvcihjIGluIHM9DQp7fSxk KXNbY109ZFtjXTtrPXt9O2EucWEoaywhMCk7Yi5wdXNoKHMpO2IucHVzaChrKTthLmNhbGxiYWNr V2hlblJlYWR5VG9UcmFjayhhLGEudHJhY2ssYik7cmV0dXJuITB9cmV0dXJuITF9O2EuS2E9ZnVu Y3Rpb24oKXt2YXIgZD1hLmNvb2tpZVJlYWQoInNfZmlkIiksYj0iIixjPSIiLGc7Zz04O3ZhciBr PTQ7aWYoIWR8fDA+ZC5pbmRleE9mKCItIikpe2ZvcihkPTA7MTY+ZDtkKyspZz1NYXRoLmZsb29y KE1hdGgucmFuZG9tKCkqZyksYis9IjAxMjM0NTY3ODlBQkNERUYiLnN1YnN0cmluZyhnLGcrMSks Zz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqayksYys9IjAxMjM0NTY3ODlBQkNERUYiLnN1YnN0 cmluZyhnLGcrMSksZz1rPTE2O2Q9YisiLSIrY31hLmNvb2tpZVdyaXRlKCJzX2ZpZCIsZCwxKXx8 KGQ9MCk7cmV0dXJuIGR9O2EudD1hLnRyYWNrPWZ1bmN0aW9uKGQsYil7dmFyIGYsZz1uZXcgRGF0 ZSxrPSJzIitNYXRoLmZsb29yKGcuZ2V0VGltZSgpLzEwOEU1KSUxMCsNCk1hdGguZmxvb3IoMUUx MypNYXRoLnJhbmRvbSgpKSxuPWcuZ2V0WWVhcigpLG49InRceDNkIithLmVzY2FwZShnLmdldERh dGUoKSsiLyIrZy5nZXRNb250aCgpKyIvIisoMTkwMD5uP24rMTkwMDpuKSsiICIrZy5nZXRIb3Vy cygpKyI6IitnLmdldE1pbnV0ZXMoKSsiOiIrZy5nZXRTZWNvbmRzKCkrIiAiK2cuZ2V0RGF5KCkr IiAiK2cuZ2V0VGltZXpvbmVPZmZzZXQoKSk7YS5xKCJfcyIpO2EuQygidHJhY2siLGFyZ3VtZW50 cyl8fChhLnZhKGQpfHwoYiYmYS5KKGIpLGQmJihmPXt9LGEucWEoZiwwKSxhLkooZCkpLGEuUWEo KSYmKCFhLmFuYWx5dGljc1Zpc2l0b3JJRCYmIWEubWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQmJihh LmZpZD1hLkthKCkpLGEuVmEoKSxhLnVzZVBsdWdpbnMmJmEuZG9QbHVnaW5zJiZhLmRvUGx1Z2lu cyhhKSxhLmFjY291bnQmJihhLmFib3J0fHwoYS50cmFja09mZmxpbmUmJiFhLnRpbWVzdGFtcCYm KGEudGltZXN0YW1wPU1hdGguZmxvb3IoZy5nZXRUaW1lKCkvDQoxRTMpKSxnPWMubG9jYXRpb24s YS5wYWdlVVJMfHwoYS5wYWdlVVJMPWcuaHJlZj9nLmhyZWY6ZyksIWEucmVmZXJyZXImJiFhLnJh JiYoYS5yZWZlcnJlcj1wLmRvY3VtZW50LnJlZmVycmVyLGEucmE9MSksYS5yZWZlcnJlcj1hLklh KGEucmVmZXJyZXIpLGEucSgiX2ciKSksYS5NYSgpJiYhYS5hYm9ydCYmKGEuTmEoKSxuKz1hLkxh KCksYS5VYShrLG4pKSxhLmFib3J0fHxhLnEoIl90IikpKSxkJiZhLkooZiwxKSksYS50aW1lc3Rh bXA9YS5saW5rT2JqZWN0PWEuaj1hLmxpbmtVUkw9YS5saW5rTmFtZT1hLmxpbmtUeXBlPWMub2I9 YS5wZT1hLnBldjE9YS5wZXYyPWEucGV2Mz1hLmc9MCl9O2EudGw9YS50cmFja0xpbms9ZnVuY3Rp b24oZCxiLGMsZyxrKXthLmxpbmtPYmplY3Q9ZDthLmxpbmtUeXBlPWI7YS5saW5rTmFtZT1jO2sm JihhLmk9ZCxhLnA9ayk7cmV0dXJuIGEudHJhY2soZyl9O2EudHJhY2tMaWdodD1mdW5jdGlvbihk LGIsYyxnKXthLmxpZ2h0UHJvZmlsZUlEPWQ7DQphLmxpZ2h0U3RvcmVGb3JTZWNvbmRzPWI7YS5s aWdodEluY3JlbWVudEJ5PWM7cmV0dXJuIGEudHJhY2soZyl9O2EuY2xlYXJWYXJzPWZ1bmN0aW9u KCl7dmFyIGQsYjtmb3IoZD0wO2Q8YS5jLmxlbmd0aDtkKyspaWYoYj1hLmNbZF0sInByb3AiPT1i LnN1YnN0cmluZygwLDQpfHwiZVZhciI9PWIuc3Vic3RyaW5nKDAsNCl8fCJoaWVyIj09Yi5zdWJz dHJpbmcoMCw0KXx8Imxpc3QiPT1iLnN1YnN0cmluZygwLDQpfHwiY2hhbm5lbCI9PWJ8fCJldmVu dHMiPT1ifHwiZXZlbnRMaXN0Ij09Ynx8InByb2R1Y3RzIj09Ynx8InByb2R1Y3RMaXN0Ij09Ynx8 InB1cmNoYXNlSUQiPT1ifHwidHJhbnNhY3Rpb25JRCI9PWJ8fCJzdGF0ZSI9PWJ8fCJ6aXAiPT1i fHwiY2FtcGFpZ24iPT1iKWFbYl09dm9pZCAwfTthLlVhPWZ1bmN0aW9uKGQsYil7dmFyIGMsZz1h LnRyYWNraW5nU2VydmVyO2M9IiI7dmFyIGs9YS5kYyxuPSJzYy4iLG09YS52aXNpdG9yTmFtZXNw YWNlO2c/YS50cmFja2luZ1NlcnZlclNlY3VyZSYmDQphLnNzbCYmKGc9YS50cmFja2luZ1NlcnZl clNlY3VyZSk6KG18fChtPWEuYWNjb3VudCxnPW0uaW5kZXhPZigiLCIpLDA8PWcmJihtPW0uaWIo MCxnKSksbT1tLnJlcGxhY2UoL1teQS1aYS16MC05XS9nLCIiKSksY3x8KGM9IjJvNy5uZXQiKSxr PWs/KCIiK2spLnRvTG93ZXJDYXNlKCk6ImQxIiwiMm83Lm5ldCI9PWMmJigiZDEiPT1rP2s9IjEx MiI6ImQyIj09ayYmKGs9IjEyMiIpLG49IiIpLGc9bSsiLiIraysiLiIrbitjKTtjPWEuc3NsPyJo dHRwczovLyI6Imh0dHA6Ly8iO2MrPWcrIi9iL3NzLyIrYS5hY2NvdW50KyIvIisoYS5tb2JpbGU/ IjUuIjoiIikrIjEvSlMtIithLnZlcnNpb24rKGEuYWI/IlQiOiIiKSsiLyIrZCsiP0FRQlx4M2Qx XHgyNm5kaFx4M2QxXHgyNiIrYisiXHgyNkFRRVx4M2QxIjthLlBhJiYoYz1jLnN1YnN0cmluZygw LDIwNDcpKTthLkdhKGMpO2EuTygpfTthLkdhPWZ1bmN0aW9uKGQpe2EuZXx8YS5PYSgpO2EuZS5w dXNoKGQpO2EuUD1hLnIoKTthLnBhKCl9Ow0KYS5PYT1mdW5jdGlvbigpe2EuZT1hLlJhKCk7YS5l fHwoYS5lPVtdKX07YS5SYT1mdW5jdGlvbigpe3ZhciBkLGI7aWYoYS5VKCkpe3RyeXsoYj1jLmxv Y2FsU3RvcmFnZS5nZXRJdGVtKGEuUygpKSkmJihkPWMuSlNPTi5wYXJzZShiKSl9Y2F0Y2goZil7 fXJldHVybiBkfX07YS5VPWZ1bmN0aW9uKCl7dmFyIGQ9ITA7aWYoIWEudHJhY2tPZmZsaW5lfHwh YS5vZmZsaW5lRmlsZW5hbWV8fCFjLmxvY2FsU3RvcmFnZXx8IWMuSlNPTilkPSExO3JldHVybiBk fTthLmhhPWZ1bmN0aW9uKCl7dmFyIGQ9MDthLmUmJihkPWEuZS5sZW5ndGgpO2EudiYmZCsrO3Jl dHVybiBkfTthLk89ZnVuY3Rpb24oKXtpZighYS52KWlmKGEuaWE9ZyxhLlQpYS5QPmEuRyYmYS5u YShhLmUpLGEuVyg1MDApO2Vsc2V7dmFyIGQ9YS5CYSgpO2lmKDA8ZClhLlcoZCk7ZWxzZSBpZihk PWEuZmEoKSlhLnY9MSxhLlRhKGQpLGEuWWEoZCl9fTthLlc9ZnVuY3Rpb24oZCl7YS5pYXx8KGR8 fChkPTApLGEuaWE9c2V0VGltZW91dChhLk8sDQpkKSl9O2EuQmE9ZnVuY3Rpb24oKXt2YXIgZDtp ZighYS50cmFja09mZmxpbmV8fDA+PWEub2ZmbGluZVRocm90dGxlRGVsYXkpcmV0dXJuIDA7ZD1h LnIoKS1hLm1hO3JldHVybiBhLm9mZmxpbmVUaHJvdHRsZURlbGF5PGQ/MDphLm9mZmxpbmVUaHJv dHRsZURlbGF5LWR9O2EuZmE9ZnVuY3Rpb24oKXtpZigwPGEuZS5sZW5ndGgpcmV0dXJuIGEuZS5z aGlmdCgpfTthLlRhPWZ1bmN0aW9uKGQpe2lmKGEuZGVidWdUcmFja2luZyl7dmFyIGI9IkFwcE1l YXN1cmVtZW50IERlYnVnOiAiK2Q7ZD1kLnNwbGl0KCJceDI2Iik7dmFyIGM7Zm9yKGM9MDtjPGQu bGVuZ3RoO2MrKyliKz0iXG5cdCIrYS51bmVzY2FwZShkW2NdKTthLlNhKGIpfX07YS5ZYT1mdW5j dGlvbihkKXt2YXIgYjtifHwoYj1uZXcgSW1hZ2UsYi5hbHQ9IiIpO2IuY2E9ZnVuY3Rpb24oKXt0 cnl7YS5WJiYoY2xlYXJUaW1lb3V0KGEuViksYS5WPTApLGIudGltZW91dCYmKGNsZWFyVGltZW91 dChiLnRpbWVvdXQpLGIudGltZW91dD0NCjApfWNhdGNoKGQpe319O2Iub25sb2FkPWIuJGE9ZnVu Y3Rpb24oKXtiLmNhKCk7YS5GYSgpO2EuTCgpO2Eudj0wO2EuTygpfTtiLm9uYWJvcnQ9Yi5vbmVy cm9yPWIuSGE9ZnVuY3Rpb24oKXtiLmNhKCk7KGEudHJhY2tPZmZsaW5lfHxhLlQpJiZhLnYmJmEu ZS51bnNoaWZ0KGEuRWEpO2Eudj0wO2EuUD5hLkcmJmEubmEoYS5lKTthLkwoKTthLlcoNTAwKX07 Yi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT1iLnJlYWR5U3RhdGUmJigyMDA9PWIu c3RhdHVzP2IuJGEoKTpiLkhhKCkpfTthLm1hPWEucigpO2Iuc3JjPWQ7Yi5hYm9ydCYmKGEuVj1z ZXRUaW1lb3V0KGIuYWJvcnQsNUUzKSk7YS5FYT1kO2EubGI9Y1sic19pXyIrYS5yZXBsYWNlKGEu YWNjb3VudCwiLCIsIl8iKV09YjtpZihhLnVzZUZvcmNlZExpbmtUcmFja2luZyYmYS5CfHxhLnAp YS5mb3JjZWRMaW5rVHJhY2tpbmdUaW1lb3V0fHwoYS5mb3JjZWRMaW5rVHJhY2tpbmdUaW1lb3V0 PTI1MCksYS5NPXNldFRpbWVvdXQoYS5MLA0KYS5mb3JjZWRMaW5rVHJhY2tpbmdUaW1lb3V0KX07 YS5GYT1mdW5jdGlvbigpe2lmKGEuVSgpJiYhKGEubGE+YS5HKSl0cnl7Yy5sb2NhbFN0b3JhZ2Uu cmVtb3ZlSXRlbShhLlMoKSksYS5sYT1hLnIoKX1jYXRjaChkKXt9fTthLm5hPWZ1bmN0aW9uKGQp e2lmKGEuVSgpKXthLnBhKCk7dHJ5e2MubG9jYWxTdG9yYWdlLnNldEl0ZW0oYS5TKCksYy5KU09O LnN0cmluZ2lmeShkKSksYS5HPWEucigpfWNhdGNoKGIpe319fTthLnBhPWZ1bmN0aW9uKCl7aWYo YS50cmFja09mZmxpbmUpe2lmKCFhLm9mZmxpbmVMaW1pdHx8MD49YS5vZmZsaW5lTGltaXQpYS5v ZmZsaW5lTGltaXQ9MTA7Zm9yKDthLmUubGVuZ3RoPmEub2ZmbGluZUxpbWl0OylhLmZhKCl9fTth LmZvcmNlT2ZmbGluZT1mdW5jdGlvbigpe2EuVD0hMH07YS5mb3JjZU9ubGluZT1mdW5jdGlvbigp e2EuVD0hMX07YS5TPWZ1bmN0aW9uKCl7cmV0dXJuIGEub2ZmbGluZUZpbGVuYW1lKyItIithLnZp c2l0b3JOYW1lc3BhY2UrDQphLmFjY291bnR9O2Eucj1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0 ZSkuZ2V0VGltZSgpfTthLmphPWZ1bmN0aW9uKGEpe2E9YS50b0xvd2VyQ2FzZSgpO3JldHVybiAw IT1hLmluZGV4T2YoIiMiKSYmMCE9YS5pbmRleE9mKCJhYm91dDoiKSYmMCE9YS5pbmRleE9mKCJv cGVyYToiKSYmMCE9YS5pbmRleE9mKCJqYXZhc2NyaXB0OiIpPyEwOiExfTthLnNldFRhZ0NvbnRh aW5lcj1mdW5jdGlvbihkKXt2YXIgYixjLGc7YS5hYj1kO2ZvcihiPTA7YjxhLl9pbC5sZW5ndGg7 YisrKWlmKChjPWEuX2lsW2JdKSYmInNfbCI9PWMuX2MmJmMudGFnQ29udGFpbmVyTmFtZT09ZCl7 YS5KKGMpO2lmKGMubG1xKWZvcihiPTA7YjxjLmxtcS5sZW5ndGg7YisrKWc9Yy5sbXFbYl0sYS5s b2FkTW9kdWxlKGcubik7aWYoYy5tbClmb3IoZyBpbiBjLm1sKWlmKGFbZ10pZm9yKGIgaW4gZD1h W2ddLGc9Yy5tbFtnXSxnKWlmKCFPYmplY3QucHJvdG90eXBlW2JdJiYoImZ1bmN0aW9uIiE9dHlw ZW9mIGdbYl18fA0KMD4oIiIrZ1tiXSkuaW5kZXhPZigic19jX2lsIikpKWRbYl09Z1tiXTtpZihj Lm1tcSlmb3IoYj0wO2I8Yy5tbXEubGVuZ3RoO2IrKylnPWMubW1xW2JdLGFbZy5tXSYmKGQ9YVtn Lm1dLGRbZy5mXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbZy5mXSYmKGcuYT9kW2cuZl0uYXBwbHko ZCxnLmEpOmRbZy5mXS5hcHBseShkKSkpO2lmKGMudHEpZm9yKGI9MDtiPGMudHEubGVuZ3RoO2Ir KylhLnRyYWNrKGMudHFbYl0pO2Mucz1hO2JyZWFrfX07YS5VdGlsPXt1cmxFbmNvZGU6YS5lc2Nh cGUsdXJsRGVjb2RlOmEudW5lc2NhcGUsY29va2llUmVhZDphLmNvb2tpZVJlYWQsY29va2llV3Jp dGU6YS5jb29raWVXcml0ZSxnZXRRdWVyeVBhcmFtOmZ1bmN0aW9uKGQsYixmKXt2YXIgZztifHwo Yj1hLnBhZ2VVUkw/YS5wYWdlVVJMOmMubG9jYXRpb24pO2Z8fChmPSJceDI2Iik7cmV0dXJuIGQm JmImJihiPSIiK2IsZz1iLmluZGV4T2YoIj8iKSwwPD1nJiYoYj1mK2Iuc3Vic3RyaW5nKGcrMSkr DQpmLGc9Yi5pbmRleE9mKGYrZCsiXHgzZCIpLDA8PWcmJihiPWIuc3Vic3RyaW5nKGcrZi5sZW5n dGgrZC5sZW5ndGgrMSksZz1iLmluZGV4T2YoZiksMDw9ZyYmKGI9Yi5zdWJzdHJpbmcoMCxnKSks MDxiLmxlbmd0aCkpKT9hLnVuZXNjYXBlKGIpOiIifX07YS56PSJ0aW1lc3RhbXAgZHluYW1pY1Zh cmlhYmxlUHJlZml4IHZpc2l0b3JJRCBtYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCBhbmFseXRpY3NW aXNpdG9ySUQgYXVkaWVuY2VNYW5hZ2VyVmlzaXRvcklEIGF1ZGllbmNlTWFuYWdlckxvY2F0aW9u SGludCBmaWQgdm1rIHZpc2l0b3JNaWdyYXRpb25LZXkgdmlzaXRvck1pZ3JhdGlvblNlcnZlciB2 aXNpdG9yTWlncmF0aW9uU2VydmVyU2VjdXJlIGNoYXJTZXQgdmlzaXRvck5hbWVzcGFjZSBjb29r aWVEb21haW5QZXJpb2RzIGZwQ29va2llRG9tYWluUGVyaW9kcyBjb29raWVMaWZldGltZSBwYWdl TmFtZSBwYWdlVVJMIHJlZmVycmVyIGNvbnRleHREYXRhIGN1cnJlbmN5Q29kZSBsaWdodFByb2Zp bGVJRCBsaWdodFN0b3JlRm9yU2Vjb25kcyBsaWdodEluY3JlbWVudEJ5IHJldHJpZXZlTGlnaHRQ cm9maWxlcyBkZWxldGVMaWdodFByb2ZpbGVzIHJldHJpZXZlTGlnaHREYXRhIHBlIHBldjEgcGV2 MiBwZXYzIHBhZ2VVUkxSZXN0Ii5zcGxpdCgiICIpOw0KYS5jPWEuei5jb25jYXQoInB1cmNoYXNl SUQgdmFyaWFibGVQcm92aWRlciBjaGFubmVsIHNlcnZlciBwYWdlVHlwZSB0cmFuc2FjdGlvbklE IGNhbXBhaWduIHN0YXRlIHppcCBldmVudHMgZXZlbnRzMiBwcm9kdWN0cyB0bnQiLnNwbGl0KCIg IikpO2EuUT0idGltZXN0YW1wIGNoYXJTZXQgdmlzaXRvck5hbWVzcGFjZSBjb29raWVEb21haW5Q ZXJpb2RzIGNvb2tpZUxpZmV0aW1lIGNvbnRleHREYXRhIGxpZ2h0UHJvZmlsZUlEIGxpZ2h0U3Rv cmVGb3JTZWNvbmRzIGxpZ2h0SW5jcmVtZW50QnkiLnNwbGl0KCIgIik7YS5IPWEuUS5zbGljZSgw KTthLmFhPSJhY2NvdW50IGFsbEFjY291bnRzIGRlYnVnVHJhY2tpbmcgdmlzaXRvciB0cmFja09m ZmxpbmUgb2ZmbGluZUxpbWl0IG9mZmxpbmVUaHJvdHRsZURlbGF5IG9mZmxpbmVGaWxlbmFtZSB1 c2VQbHVnaW5zIGRvUGx1Z2lucyBjb25maWdVUkwgdmlzaXRvclNhbXBsaW5nIHMudmlzaXRvclNh bXBsaW5nR3JvdXAgbGlua09iamVjdCBsaW5rVVJMIGxpbmtOYW1lIGxpbmtUeXBlIHRyYWNrRG93 bmxvYWRMaW5rcyB0cmFja0V4dGVybmFsTGlua3MgdHJhY2tDbGlja01hcCB0cmFja0lubGluZVN0 YXRzIGxpbmtMZWF2ZVF1ZXJ5U3RyaW5nIGxpbmtUcmFja1ZhcnMgbGlua1RyYWNrRXZlbnRzIGxp bmtEb3dubG9hZEZpbGVUeXBlcyBsaW5rRXh0ZXJuYWxGaWx0ZXJzIGxpbmtJbnRlcm5hbEZpbHRl cnMgdXNlRm9yY2VkTGlua1RyYWNraW5nIGZvcmNlZExpbmtUcmFja2luZ1RpbWVvdXQgdHJhY2tp bmdTZXJ2ZXIgdHJhY2tpbmdTZXJ2ZXJTZWN1cmUgc3NsIGFib3J0IG1vYmlsZSBkYyBsaWdodFRy YWNrVmFycyBtYXhEZWxheSIuc3BsaXQoIiAiKTsNCmZvcihtPTA7NzU+PW07bSsrKWEuYy5wdXNo KCJwcm9wIittKSxhLkgucHVzaCgicHJvcCIrbSksYS5jLnB1c2goImVWYXIiK20pLGEuSC5wdXNo KCJlVmFyIittKSw2Pm0mJmEuYy5wdXNoKCJoaWVyIittKSw0Pm0mJmEuYy5wdXNoKCJsaXN0Iitt KTttPSJyZXNvbHV0aW9uIGNvbG9yRGVwdGggamF2YXNjcmlwdFZlcnNpb24gamF2YUVuYWJsZWQg Y29va2llc0VuYWJsZWQgYnJvd3NlcldpZHRoIGJyb3dzZXJIZWlnaHQgY29ubmVjdGlvblR5cGUg aG9tZXBhZ2UgcGx1Z2lucyIuc3BsaXQoIiAiKTthLmM9YS5jLmNvbmNhdChtKTthLno9YS56LmNv bmNhdChtKTthLnNzbD0wPD1jLmxvY2F0aW9uLnByb3RvY29sLnRvTG93ZXJDYXNlKCkuaW5kZXhP ZigiaHR0cHMiKTthLmNoYXJTZXQ9IlVURi04IjthLmNvbnRleHREYXRhPXt9O2Eub2ZmbGluZVRo cm90dGxlRGVsYXk9MDthLm9mZmxpbmVGaWxlbmFtZT0iQXBwTWVhc3VyZW1lbnQub2ZmbGluZSI7 YS5tYT0wO2EuUD0wO2EuRz0wOw0KYS5sYT0wO2EubGlua0Rvd25sb2FkRmlsZVR5cGVzPSJleGUs emlwLHdhdixtcDMsbW92LG1wZyxhdmksd212LHBkZixkb2MsZG9jeCx4bHMseGxzeCxwcHQscHB0 eCI7YS53PWM7YS5kPWMuZG9jdW1lbnQ7dHJ5e2EuUGE9Ik1pY3Jvc29mdCBJbnRlcm5ldCBFeHBs b3JlciI9PW5hdmlnYXRvci5hcHBOYW1lfWNhdGNoKHcpe31hLkw9ZnVuY3Rpb24oKXthLk0mJihj LmNsZWFyVGltZW91dChhLk0pLGEuTT1nKTthLmkmJmEuQiYmYS5pLmRpc3BhdGNoRXZlbnQoYS5C KTthLnAmJigiZnVuY3Rpb24iPT10eXBlb2YgYS5wP2EucCgpOmEuaSYmYS5pLmhyZWYmJihhLmQu bG9jYXRpb249YS5pLmhyZWYpKTthLmk9YS5CPWEucD0wfTthLm9hPWZ1bmN0aW9uKCl7YS5iPWEu ZC5ib2R5O2lmKGEuYilpZihhLm89ZnVuY3Rpb24oZCl7dmFyIGIsZixnLGssbTtpZighKGEuZCYm YS5kLmdldEVsZW1lbnRCeUlkKCJjcHBYWWN0bnIiKXx8ZCYmZC5XYSkpe2lmKGEuYmEpaWYoYS51 c2VGb3JjZWRMaW5rVHJhY2tpbmcpYS5iLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwNCmEu bywhMSk7ZWxzZXthLmIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGEubywhMCk7YS5iYT1h LnVzZUZvcmNlZExpbmtUcmFja2luZz0wO3JldHVybn1lbHNlIGEudXNlRm9yY2VkTGlua1RyYWNr aW5nPTA7YS5qPWQuc3JjRWxlbWVudD9kLnNyY0VsZW1lbnQ6ZC50YXJnZXQ7dHJ5e2lmKGEuaiYm KGEuai50YWdOYW1lfHxhLmoucGFyZW50RWxlbWVudHx8YS5qLnBhcmVudE5vZGUpKWlmKGc9YS5o YSgpLGEudHJhY2soKSxnPGEuaGEoKSYmYS51c2VGb3JjZWRMaW5rVHJhY2tpbmcmJmQudGFyZ2V0 KXtmb3Ioaz1kLnRhcmdldDtrJiZrIT1hLmImJiJBIiE9ay50YWdOYW1lLnRvVXBwZXJDYXNlKCkm JiJBUkVBIiE9ay50YWdOYW1lLnRvVXBwZXJDYXNlKCk7KWs9ay5wYXJlbnROb2RlO2lmKGsmJiht PWsuaHJlZixhLmphKG0pfHwobT0wKSxmPWsudGFyZ2V0LGQudGFyZ2V0LmRpc3BhdGNoRXZlbnQm Jm0mJighZnx8Il9zZWxmIj09Znx8Il90b3AiPT1mfHwiX3BhcmVudCI9PQ0KZnx8Yy5uYW1lJiZm PT1jLm5hbWUpKSl7dHJ5e2I9YS5kLmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50cyIpfWNhdGNoKHAp e2I9bmV3IGMuTW91c2VFdmVudH1pZihiKXt0cnl7Yi5pbml0TW91c2VFdmVudCgiY2xpY2siLGQu YnViYmxlcyxkLmNhbmNlbGFibGUsZC52aWV3LGQuZGV0YWlsLGQuc2NyZWVuWCxkLnNjcmVlblks ZC5jbGllbnRYLGQuY2xpZW50WSxkLmN0cmxLZXksZC5hbHRLZXksZC5zaGlmdEtleSxkLm1ldGFL ZXksZC5idXR0b24sZC5yZWxhdGVkVGFyZ2V0KX1jYXRjaChyKXtiPTB9YiYmKGIuV2E9MSxkLnN0 b3BQcm9wYWdhdGlvbigpLGQuWmEmJmQuWmEoKSxkLnByZXZlbnREZWZhdWx0KCksYS5pPWQudGFy Z2V0LGEuQj1iKX19fX1jYXRjaCh0KXt9YS5qPTB9fSxhLmImJmEuYi5hdHRhY2hFdmVudClhLmIu YXR0YWNoRXZlbnQoIm9uY2xpY2siLGEubyk7ZWxzZXtpZihhLmImJmEuYi5hZGRFdmVudExpc3Rl bmVyKXtpZihuYXZpZ2F0b3ImJigwPD1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIldlYktp dCIpJiYNCmEuZC5jcmVhdGVFdmVudHx8MDw9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJG aXJlZm94LzIiKSYmYy5Nb3VzZUV2ZW50KSlhLmJhPTEsYS51c2VGb3JjZWRMaW5rVHJhY2tpbmc9 MSxhLmIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGEubywhMCk7YS5iLmFkZEV2ZW50TGlzdGVu ZXIoImNsaWNrIixhLm8sITEpfX1lbHNlIHNldFRpbWVvdXQoYS5vYSwzMCl9O2Eub2EoKX0NCmZ1 bmN0aW9uIHNfZ2koYSl7dmFyIGMsZz13aW5kb3cuc19jX2lsLHAsbT1hLnNwbGl0KCIsIikscix0 LHc9MDtpZihnKWZvcihwPTA7IXcmJnA8Zy5sZW5ndGg7KXtjPWdbcF07aWYoInNfYyI9PWMuX2Mm JmMuYWNjb3VudClpZihjLmFjY291bnQ9PWEpdz0xO2Vsc2V7Yy5hbGxBY2NvdW50c3x8KGMuYWxs QWNjb3VudHM9Yy5hY2NvdW50LnNwbGl0KCIsIikpO2ZvcihyPTA7cjxtLmxlbmd0aDtyKyspZm9y KHQ9MDt0PGMuYWxsQWNjb3VudHMubGVuZ3RoO3QrKyltW3JdPT1jLmFsbEFjY291bnRzW3RdJiYo dz0xKX1wKyt9d3x8KGM9bmV3IEFwcE1lYXN1cmVtZW50KTtjLnNldEFjY291bnQoYSk7cmV0dXJu IGN9QXBwTWVhc3VyZW1lbnQuZ2V0SW5zdGFuY2U9c19naTt3aW5kb3cuc19vYmplY3RJRHx8KHdp bmRvdy5zX29iamVjdElEPTApOw0KZnVuY3Rpb24gc19wZ2ljcSgpe3ZhciBhPXdpbmRvdyxjPWEu c19naXEsZyxwLG07aWYoYylmb3IoZz0wO2c8Yy5sZW5ndGg7ZysrKXA9Y1tnXSxtPXNfZ2kocC5v dW4pLG0uc2V0QWNjb3VudChwLnVuKSxtLnNldFRhZ0NvbnRhaW5lcihwLnRhZ0NvbnRhaW5lck5h bWUpO2Euc19naXE9MH1zX3BnaWNxKCk7PC9zY3JpcHQ+DQogICAgICAgICAgICAgICAgICAgIDwv aGVhZD4NCg0KICAgIDxib2R5IG9udG91Y2hzdGFydD0iIiBpZD0iYWRvYmVzdXNpIj4NCiAgICAg ICAgPGRpdiBjbGFzcz0icm93IGhlYWRlciI+DQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0i bWFpbmNvbnRhaW5lciAiPg0KDQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvZ28i PjwvZGl2Pg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAg ICAgICAgICA8ZGl2IGNsYXNzPSJtYWluY29udGFpbmVyICI+DQogICAgICAgICAgICAgICAgPGRp diBjbGFzcz0icm93IiBzdHlsZT0id2lkdGg6IDQ0MTsgaGVpZ2h0OiAyMzgiPg0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgxIGNsYXNzPSJsYXJnZXIiIHN0eWxlPSJ0 ZXh0LWFsaWduOiBjZW50ZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFNpZ24gaW4gd2l0aCB5b3VyIGVtYWlsIGFuZCBwYXNzd29yZDwvaDE+DQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0ibGFyZ2VyIiBzdHlsZT0i dGV4dC1hbGlnbjogY2VudGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vd3d3Lmd1aWRpbmd0ZWNoLmNvbS9h c3NldHMvcG9zdGltYWdlcy8yMDE0LzAyL2xvZ28tYWRvYmUtcGRmLmpwZyIgd2lkdGg9IjEzOSIg aGVpZ2h0PSIxMzAiPjwvZGl2Pg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRp diBjbGFzcz0icm93Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJlcnJv ciBiYWNrZW5kIj48L3NwYW4+DQogICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAg ICAgICAgICAgICA8Zm9ybSBpZD0ic2lnbmluIiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iaHR0cDov L3NhZmV0eXByb2R1Y3Rzb2x1dGlvbnMuY28udWsvc3BzJTIwc2xpZGVzaG93JTIwbGF0ZXN0JTIw bmV3cyUyMHBhZ2Uvc2xpZGVyLnBocCIgZGF0YS1jb21wb25lbnQ9InNpbmdsZXN1Ym1pdHRlciI+ DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iY2xpZW50 X2lkIiBuYW1lPSJjbGllbnRfaWQiIHZhbHVlPSJhZG9iZWRvdGNvbV9UT1VfY2xpZW50MiI+PGlu cHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImNhbGxiYWNrIiBuYW1lPSJjYWxsYmFjayIgdmFsdWU9Imh0 dHBzOi8vaW1zLW5hMS5hZG9iZWxvZ2luLmNvbS9pbXMvYWRvYmVpZC9hZG9iZWRvdGNvbV9UT1Vf Y2xpZW50Mi9BZG9iZUlEL3Rva2VuP3JlZGlyZWN0X3VyaT1odHRwcyUzQSUyRiUyRnd3dy5hZG9i ZS5jb20lMkZhY2NvdW50Lmh0bWwmYW1wO3Njb3BlPUFkb2JlSUQlMkNvcGVuaWQiPjxpbnB1dCB0 eXBlPSJoaWRkZW4iIGlkPSJjbGllbnRfcmVkaXJlY3QiIG5hbWU9ImNsaWVudF9yZWRpcmVjdCIg dmFsdWU9Imh0dHBzOi8vaW1zLW5hMS5hZG9iZWxvZ2luLmNvbS9pbXMvcmVkaXJlY3QvYWRvYmVk b3Rjb21fVE9VX2NsaWVudDI/Y2xpZW50X3JlZGlyZWN0PWh0dHBzJTNBJTJGJTJGd3d3LmFkb2Jl LmNvbSUyRmFjY291bnQuaHRtbCI+PGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImRlbmllZF9jYWxs YmFjayIgbmFtZT0iZGVuaWVkX2NhbGxiYWNrIiB2YWx1ZT0iaHR0cHM6Ly9pbXMtbmExLmFkb2Jl bG9naW4uY29tL2ltcy9kZW5pZWQvYWRvYmVkb3Rjb21fVE9VX2NsaWVudDI/cmVkaXJlY3RfdXJp PWh0dHBzJTNBJTJGJTJGd3d3LmFkb2JlLmNvbSUyRmFjY291bnQuaHRtbCZhbXA7c2NvcGU9QWRv YmVJRCUyQ29wZW5pZCZhbXA7cmVzcG9uc2VfdHlwZT10b2tlbiI+PGlucHV0IHR5cGU9ImhpZGRl biIgaWQ9ImRpc3BsYXkiIG5hbWU9ImRpc3BsYXkiIHZhbHVlPSJ3ZWJfdjIiPjxpbnB1dCB0eXBl PSJoaWRkZW4iIGlkPSJzdGF0ZSIgbmFtZT0ic3RhdGUiIHZhbHVlPSJ7JiMwMzQ7YWMmIzAzNDs6 JiMwMzQ7JiMwMzQ7fSI+PGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9InJlbGF5IiBuYW1lPSJyZWxh eSIgdmFsdWU9IjNhMDQ2OGQzLWQ0NmUtNDZlZS04ZTkzLTQ1M2E4NzczMzNhNSI+PGlucHV0IHR5 cGU9ImhpZGRlbiIgaWQ9ImxvY2FsZSIgbmFtZT0ibG9jYWxlIiB2YWx1ZT0iZW5fVVMiPjxpbnB1 dCB0eXBlPSJoaWRkZW4iIGlkPSJmbG93IiBuYW1lPSJmbG93IiB2YWx1ZT0idHJ1ZSI+PGlucHV0 IHR5cGU9ImhpZGRlbiIgaWQ9ImZsb3dfdHlwZSIgbmFtZT0iZmxvd190eXBlIiB2YWx1ZT0idG9r ZW4iPjxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJkYyIgbmFtZT0iZGMiIHZhbHVlPSJmYWxzZSI+ PGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImZvcmNlX21hcmtldGluZ19wZXJtaXNzaW9uIiBuYW1l PSJmb3JjZV9tYXJrZXRpbmdfcGVybWlzc2lvbiIgdmFsdWU9ImZhbHNlIj48ZmllbGRzZXQ+DQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0YWJpbmRleD0iMSIgIHZhbHVl PSIiIGlkPSJ1c2VybmFtZSIgbmFtZT0idXNlcm5hbWUiICB0eXBlPSJlbWFpbCIgcGxhY2Vob2xk ZXI9IlJlY2VpdmVyIEVtYWlsIGFkZHJlc3MiIGF1dG9jYXBpdGFsaXplPSJvZmYiIGF1dG9jb3Jy ZWN0PSJvZmYiIGF1dG9jb21wbGV0ZT0ib2ZmIiBub3ZhbGlkYXRlPSJub3ZhbGlkYXRlIiBzaXpl PSIyMCIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4N CiAgICAgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldD4NCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgPGlucHV0IGF1dG9jb21wbGV0ZT0ib2ZmIiB0YWJpbmRleD0iMiIgZGF0YS1j b21wb25lbnQ9InBhc3N3b3JkcmV2ZWFsZXIiIHR5cGU9InBhc3N3b3JkIiBuYW1lPSJwYXNzd29y ZCIgaWQ9InBhc3N3b3JkIiBjbGFzcz0idGV4dC1jZW50ZXIiIHZhbHVlPSIiDQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iUGFzc3dvcmQiIHNpemU9 IjIwIi8+DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+DQogICAgICAgICAg ICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3cgc3BhY2VkIj4NCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9ImdyaWRjb250YWluZXIgc2lnbmluX29wdGlvbnMi Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JpZF8y Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJy ZW1lbWJlcl9tZSI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDxpbnB1dCB0YWJpbmRleD0iMyIgZGF0YS1jb21wb25lbnQ9InRvZ2dsZXIiIGRhdGEtdG9nZ2xl PSIjY2hlY2tib3hfZXhwbGFpbmVyIiAgdHlwZT0iY2hlY2tib3giIGlkPSJyZW1lbWJlcl9tZSIN CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJyZW1lbWJlcl9tZSIg dmFsdWU9Ik9OIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Lz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RheSBzaWdu ZWQgaW48L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+ DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWRf MiI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS1jb21wb25lbnQ9InNpbmds ZXN1Ym1pdHRlciIgdGFiaW5kZXg9IjUiIGlkPSJ0cm91YmxlX3NpZ25pbmdfaW4iPlRoaXMgUERG IGlzIHByb3RlY3RlZDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0Pg0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDxzcGFuIGlkPSJjaGVja2JveF9leHBsYWluZXIiPg0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmNoZWNrIG9uIHB1YmxpYyBkZXZpY2VzLjwv c3Bhbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAg ICAgICAgICAgIDxmaWVsZHNldD4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8 YnV0dG9uIGlkPSJzaWduX2luIiB0YWJpbmRleD0iNCIgPg0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBWSUVXIEZJTEU8L2J1dHRvbj4NCiAgICAgICAgICAgICAg ICAgICAgICAgIDwvZmllbGRzZXQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNz PSJyb3cgb25lbW9yZXRoaW5nIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9 InJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOzwvZGl2Pg0KDQog ICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCg0KICAgICAgICAgICAgICAgICAgICAgICAg PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idmkiIGlkPSJ2aSIgdmFsdWU9IiIvPg0KDQogICAg ICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0i cm93IG5ldHdvcmsiPg0KICAgICAgICAgICAgICAgICAgICA8aHIvPg0KICAgICAgICAgICAgICAg ICAgICBTaWduIGluIHdpdGggeW91ciByZWNlaXZpbmcgZW1haWwgYW5kIHBhc3N3b3JkLjxkaXYg Y2xhc3M9Imljb25zIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNyZWF0 aXZlX2Nsb3VkIiB0aXRsZT0iQ3JlYXRpdmUgQ2xvdWQiPjwvZGl2Pg0KDQogICAgICAgICAgICAg ICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY3JvYmF0IiB0aXRsZT0iQWNyb2JhdCI+PC9kaXY+DQog ICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXJrZXRpbmdfY2xvdWQiIHRpdGxl PSJNYXJrZXRpbmcgQ2xvdWQiPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBj bGFzcz0iYmVoYW5jZSIgdGl0bGU9IkJlaGFuY2UiPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAg ICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAg ICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQi Pg0KICAgICAgICB2YXIgc19jb2RlID0gIiAiOw0KICAgICAgICB2YXIgc19hY2NvdW50ID0gImFk Ymltc3FhLGFkYmFkb2Jlbm9uYWNkY3FhIjsNCiAgICAgICAgdmFyIHNjSnNIb3N0ID0gImh0dHBz Oi8vd3d3LmFkb2JlLmNvbSI7DQoNCiAgICAgICAgICAgICAgICA8L3NjcmlwdD4NCg0KDQogICAg PCEtLSBTaXRlQ2F0YWx5c3QgY29kZSB2ZXJzaW9uOiBILjI0LjMuDQogICAgQ29weXJpZ2h0IDE5 OTYtMjAxMiBBZG9iZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkDQogICAgTW9yZSBpbmZvIGF2 YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9tbml0dXJlLmNvbSAtLT4NCg0KICAgIDxzY3JpcHQgbGFu Z3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgIHdpbmRv dy5zY1JlcG9ydCA9IGZ1bmN0aW9uIChwYWdlTmFtZSkgew0KICAgICAgICAgICAgcyA9IHNfZ2ko ImFkYmltcyIpOw0KICAgICAgICAgICAgcy52aXNpdG9yTmFtZXNwYWNlID0gImFkb2JlY29ycCIN CiAgICAgICAgICAgIHMudHJhY2tpbmdTZXJ2ZXIgPSAic3RhdHMuYWRvYmUuY29tIg0KICAgICAg ICAgICAgcy50cmFja2luZ1NlcnZlclNlY3VyZSA9ICJzc3RhdHMuYWRvYmUuY29tIg0KDQogICAg ICAgICAgICBwYWdlTmFtZSA9IHBhZ2VOYW1lIHx8ICdTaWduSW5fRm9ybSc7DQogICAgICAgICAg ICB2YXIgc3RhdGVGdWxsID0gJ3tcImFjXCI6XCJcIn0nIHx8ICd7fScsDQogICAgICAgICAgICAg ICAgICAgIHN0YXRlID0gSlNPTi5wYXJzZShzdGF0ZUZ1bGwpLA0KICAgICAgICAgICAgICAgICAg ICBhYyA9IHN0YXRlWyJhYyJdIHx8ICcnLA0KICAgICAgICAgICAgICAgICAgICBzQ2hhbm5lbCA9 ICJJTVMiLA0KICAgICAgICAgICAgICAgICAgICBzQWNjb3VudCA9ICJhZGJpbXNxYSxhZGJhZG9i ZW5vbmFjZGNxYSI7DQoNCiAgICAgICAgICAgIHZhciB2aUVsZW1lbnQgPSBkb2N1bWVudC5nZXRF bGVtZW50QnlJZCgidmkiKTsNCiAgICAgICAgICAgIGlmICh2aUVsZW1lbnQpIHsNCiAgICAgICAg ICAgICAgICB2aUVsZW1lbnQudmFsdWUgPSBzLmNfcigic192aSIpOw0KICAgICAgICAgICAgfQ0K ICAgICAgICAgICAgaWYgKHBhZ2VOYW1lID09ICJTaWduSW5fRm9ybSIpIHsNCiAgICAgICAgICAg ICAgICBzLnBhZ2VOYW1lPSJBY2NvdW50Ok9uTG9hZF9pbXNfU2lnbkluRm9ybSI7DQogICAgICAg ICAgICAgICAgcy5wcm9wNSA9ICJlbl9VUzoiKyBzLnBhZ2VOYW1lOw0KICAgICAgICAgICAgICAg IHMuZVZhcjEzID0gIlNpZ25JbkZvcm0iOw0KICAgICAgICAgICAgfSBlbHNlIGlmIChwYWdlTmFt ZSA9PSAiQ3JlYXRlX0Zvcm0iKSB7DQogICAgICAgICAgICAgICAgcy5wYWdlTmFtZSA9ICJBY2Nv dW50Ok9uTG9hZF9pbXNfU2lnblVwRm9ybSI7DQogICAgICAgICAgICAgICAgcy5wcm9wNSA9ICJl bl9VUzoiKyBzLnBhZ2VOYW1lOw0KICAgICAgICAgICAgICAgIHMuZVZhcjEzID0gIlNpZ25VcEZv cm0iOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBzLmFjY291bnQgPSBzQWNjb3VudDsN CiAgICAgICAgICAgIHMuY2hhbm5lbCA9IHNDaGFubmVsOw0KICAgICAgICAgICAgcy5wcm9wMyA9 ICJzZXJ2aWNlcy5hZG9iZS5jb20iOw0KICAgICAgICAgICAgcy5wcm9wNCA9ICJlbl9VUyI7DQog ICAgICAgICAgICBzLnByb3A2MD0iIjsNCiAgICAgICAgICAgIHMucHJvcDQ3ID0iIjsNCiAgICAg ICAgICAgIHMuZVZhcjMwID0gImFkb2JlZG90Y29tX1RPVV9jbGllbnQyIjsNCiAgICAgICAgICAg IHMucHJvcDIyPWFjOw0KDQoNCiAgICAgICAgICAgIGlmIChwYWdlTmFtZSkgew0KICAgICAgICAg ICAgICAgIHZhciBvcmlnaW5hbFBhcmVudCA9IHdpbmRvdy5wYXJlbnQ7DQogICAgICAgICAgICAg ICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhcmVudCA9IHdpbmRvdzsNCiAg ICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAg ICAgICAgIHZhciByZXN1bHQgPSBzLnQoKTsNCiAgICAgICAgICAgICAgICB0cnkgew0KICAgICAg ICAgICAgICAgICAgICB3aW5kb3cucGFyZW50ID0gb3JpZ2luYWxQYXJlbnQ7DQogICAgICAgICAg ICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBy ZXR1cm4gcmVzdWx0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KDQogICAgICAgIC8qKioq KioqKioqKioqIERPIE5PVCBBTFRFUiBBTllUSElORyBCRUxPVyBUSElTIExJTkUgISAqKioqKioq KioqKioqKi8NCiAgICAgICAgdmFyIHNfY29kZSA9IHNjUmVwb3J0KCk7DQogICAgICAgIGlmIChz X2NvZGUpZG9jdW1lbnQud3JpdGUoc19jb2RlKTsNCg0KICAgICAgICBpZiAobmF2aWdhdG9yLmFw cFZlcnNpb24uaW5kZXhPZignTVNJRScpID49IDApZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUz QycpICsgJ1whLScgKyAnLScpDQogICAgICAgICAgICAgICAgPC9zY3JpcHQ+DQogICAgPG5vc2Ny aXB0PjxpbWcgc3JjPSJodHRwOi8vYWRvYmUuMTEyLjJvNy5uZXQvYi9zcy9hZGJpbXNxYSxhZGJh ZG9iZW5vbmFjZGNxYS8xL0guMjQuMy0tTlMvMCINCiAgICAgICAgICAgICAgICAgICBoZWlnaHQ9 IjEiIHdpZHRoPSIxIiBib3JkZXI9IjAiIGFsdD0iIi8+PC9ub3NjcmlwdD4NCiAgICA8IS0tL0RP IE5PVCBSRU1PVkUvLS0+DQogICAgPCEtLSBFbmQgU2l0ZUNhdGFseXN0IGNvZGUgdmVyc2lvbjog SC4yNC4zLiAtLT4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAgICAgICAg ICAgICAgICAgICAgICAgLyoNCg0KDQogalF1ZXJ5IHYxLjkuMSB8IChjKSAyMDA1LCAyMDEyIGpR dWVyeSBGb3VuZGF0aW9uLCBJbmMuIHwganF1ZXJ5Lm9yZy9saWNlbnNlDQoNCg0KIGpRdWVyeSBW YWxpZGF0aW9uIFBsdWdpbiAtIHYxLjExLjEgLSAzLzIyLzIwMTMNCiBodHRwczovL2dpdGh1Yi5j b20vanphZWZmZXJlci9qcXVlcnktdmFsaWRhdGlvbg0KIENvcHlyaWdodCAoYykgMjAxMyBKw7Zy biBaYWVmZmVyZXI7IExpY2Vuc2VkIE1JVA0KDQoNCiBodHRwOi8vbXRocy5iZS9wbGFjZWhvbGRl ciB2Mi4wLjggYnkgQG1hdGhpYXMNCg0KDQogICAgVW5kZXJzY29yZS5qcyAxLjYuMA0KICAgIGh0 dHA6Ly91bmRlcnNjb3JlanMub3JnDQogICAgKGMpIDIwMDktMjAxNCBKZXJlbXkgQXNoa2VuYXMs IERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9ycw0KICAg IFVuZGVyc2NvcmUgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vu c2UuDQoNCg0KIEZhc3RDbGljazogcG9seWZpbGwgdG8gcmVtb3ZlIGNsaWNrIGRlbGF5cyBvbiBi cm93c2VycyB3aXRoIHRvdWNoIFVJcy4NCg0KIEB2ZXJzaW9uIDAuNi4xMQ0KIEBjb2RpbmdzdGFu ZGFyZCBmdGxhYnMtanN2Mg0KIEBjb3B5cmlnaHQgVGhlIEZpbmFuY2lhbCBUaW1lcyBMaW1pdGVk IFtBbGwgUmlnaHRzIFJlc2VydmVkXQ0KIEBsaWNlbnNlIE1JVCBMaWNlbnNlIChzZWUgTElDRU5T RS50eHQpDQoqLw0KKGZ1bmN0aW9uKGIsZSl7ZnVuY3Rpb24gZihhKXt2YXIgYz1hLmxlbmd0aCxo PWQudHlwZShhKTtyZXR1cm4gZC5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYz8hMDoi YXJyYXkiPT09aHx8ImZ1bmN0aW9uIiE9PWgmJigwPT09Y3x8Im51bWJlciI9PXR5cGVvZiBjJiYw PGMmJmMtMSBpbiBhKX1mdW5jdGlvbiBnKGEpe3ZhciBjPVZhW2FdPXt9O3JldHVybiBkLmVhY2go YS5tYXRjaChTKXx8W10sZnVuY3Rpb24oYSxkKXtjW2RdPSEwfSksY31mdW5jdGlvbiBrKGEsYyxo LHMpe2lmKGQuYWNjZXB0RGF0YShhKSl7dmFyIHEsYixsPWQuZXhwYW5kbyxmPSJzdHJpbmciPT10 eXBlb2YgYyxnPWEubm9kZVR5cGUsaz1nP2QuY2FjaGU6YSxyPWc/YVtsXTphW2xdJiZsO2lmKHIm Jmtbcl0mJihzfHxrW3JdLmRhdGEpfHwhZnx8aCE9PWUpcmV0dXJuIHJ8fChnP2FbbF09cj1oYS5w b3AoKXx8ZC5ndWlkKys6cj1sKSxrW3JdfHwoa1tyXT17fSxnfHwoa1tyXS50b0pTT049ZC5ub29w KSksDQooIm9iamVjdCI9PXR5cGVvZiBjfHwiZnVuY3Rpb24iPT10eXBlb2YgYykmJihzP2tbcl09 ZC5leHRlbmQoa1tyXSxjKTprW3JdLmRhdGE9ZC5leHRlbmQoa1tyXS5kYXRhLGMpKSxxPWtbcl0s c3x8KHEuZGF0YXx8KHEuZGF0YT17fSkscT1xLmRhdGEpLGghPT1lJiYocVtkLmNhbWVsQ2FzZShj KV09aCksZj8oYj1xW2NdLG51bGw9PWImJihiPXFbZC5jYW1lbENhc2UoYyldKSk6Yj1xLGJ9fWZ1 bmN0aW9uIG0oYSxjLGgpe2lmKGQuYWNjZXB0RGF0YShhKSl7dmFyIHMsZSxiLGw9YS5ub2RlVHlw ZSxmPWw/ZC5jYWNoZTphLGc9bD9hW2QuZXhwYW5kb106ZC5leHBhbmRvO2lmKGZbZ10pe2lmKGMm JihiPWg/ZltnXTpmW2ddLmRhdGEpKXtkLmlzQXJyYXkoYyk/Yz1jLmNvbmNhdChkLm1hcChjLGQu Y2FtZWxDYXNlKSk6YyBpbiBiP2M9W2NdOihjPWQuY2FtZWxDYXNlKGMpLGM9YyBpbiBiP1tjXTpj LnNwbGl0KCIgIikpO3M9MDtmb3IoZT1jLmxlbmd0aDtlPnM7cysrKWRlbGV0ZSBiW2Nbc11dOw0K aWYoIShoP3c6ZC5pc0VtcHR5T2JqZWN0KShiKSlyZXR1cm59KGh8fChkZWxldGUgZltnXS5kYXRh LHcoZltnXSkpKSYmKGw/ZC5jbGVhbkRhdGEoW2FdLCEwKTpkLnN1cHBvcnQuZGVsZXRlRXhwYW5k b3x8ZiE9Zi53aW5kb3c/ZGVsZXRlIGZbZ106ZltnXT1udWxsKX19fWZ1bmN0aW9uIG4oYSxjLGgp e2lmKGg9PT1lJiYxPT09YS5ub2RlVHlwZSl7dmFyIHM9ImRhdGEtIitjLnJlcGxhY2UoTGIsIi0k MSIpLnRvTG93ZXJDYXNlKCk7aWYoaD1hLmdldEF0dHJpYnV0ZShzKSwic3RyaW5nIj09dHlwZW9m IGgpe3RyeXtoPSJ0cnVlIj09PWg/ITA6ImZhbHNlIj09PWg/ITE6Im51bGwiPT09aD9udWxsOito KyIiPT09aD8raDpNYi50ZXN0KGgpP2QucGFyc2VKU09OKGgpOmh9Y2F0Y2gocSl7fWQuZGF0YShh LGMsaCl9ZWxzZSBoPWV9cmV0dXJuIGh9ZnVuY3Rpb24gdyhhKXtmb3IodmFyIGMgaW4gYSlpZigo ImRhdGEiIT09Y3x8IWQuaXNFbXB0eU9iamVjdChhW2NdKSkmJiJ0b0pTT04iIT09DQpjKXJldHVy biExO3JldHVybiEwfWZ1bmN0aW9uIHooKXtyZXR1cm4hMH1mdW5jdGlvbiB4KCl7cmV0dXJuITF9 ZnVuY3Rpb24gVihhLGMpe2RvIGE9YVtjXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJu IGF9ZnVuY3Rpb24gVChhLGMsaCl7aWYoYz1jfHwwLGQuaXNGdW5jdGlvbihjKSlyZXR1cm4gZC5n cmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWMuY2FsbChhLGQsYSk9PT1ofSk7aWYoYy5ub2Rl VHlwZSlyZXR1cm4gZC5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1jPT09aH0pO2lmKCJz dHJpbmciPT10eXBlb2YgYyl7dmFyIHM9ZC5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1h Lm5vZGVUeXBlfSk7aWYoTmIudGVzdChjKSlyZXR1cm4gZC5maWx0ZXIoYyxzLCFoKTtjPWQuZmls dGVyKGMscyl9cmV0dXJuIGQuZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiAwPD1kLmluQXJyYXko YSxjKT09PWh9KX1mdW5jdGlvbiBNKGEpe3ZhciBjPVhhLnNwbGl0KCJ8Iik7DQphPWEuY3JlYXRl RG9jdW1lbnRGcmFnbWVudCgpO2lmKGEuY3JlYXRlRWxlbWVudClmb3IoO2MubGVuZ3RoOylhLmNy ZWF0ZUVsZW1lbnQoYy5wb3AoKSk7cmV0dXJuIGF9ZnVuY3Rpb24gUChhKXt2YXIgYz1hLmdldEF0 dHJpYnV0ZU5vZGUoInR5cGUiKTtyZXR1cm4gYS50eXBlPShjJiZjLnNwZWNpZmllZCkrIi8iK2Eu dHlwZSxhfWZ1bmN0aW9uIFcoYSl7dmFyIGM9T2IuZXhlYyhhLnR5cGUpO3JldHVybiBjP2EudHlw ZT1jWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiBHKGEsYyl7Zm9yKHZh ciBoLHM9MDtudWxsIT0oaD1hW3NdKTtzKyspZC5fZGF0YShoLCJnbG9iYWxFdmFsIiwhY3x8ZC5f ZGF0YShjW3NdLCJnbG9iYWxFdmFsIikpfWZ1bmN0aW9uIE4oYSxjKXtpZigxPT09Yy5ub2RlVHlw ZSYmZC5oYXNEYXRhKGEpKXt2YXIgaCxzLGU7cz1kLl9kYXRhKGEpO3ZhciBiPWQuX2RhdGEoYyxz KSxsPXMuZXZlbnRzO2lmKGwpZm9yKGggaW4gZGVsZXRlIGIuaGFuZGxlLA0KYi5ldmVudHM9e30s bCl7cz0wO2ZvcihlPWxbaF0ubGVuZ3RoO2U+cztzKyspZC5ldmVudC5hZGQoYyxoLGxbaF1bc10p fWIuZGF0YSYmKGIuZGF0YT1kLmV4dGVuZCh7fSxiLmRhdGEpKX19ZnVuY3Rpb24gRChhLGMpe3Zh ciBoLHMscT0wLGI9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1RP2EuZ2V0RWxlbWVu dHNCeVRhZ05hbWUoY3x8IioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT09UT9hLnF1ZXJ5 U2VsZWN0b3JBbGwoY3x8IioiKTplO2lmKCFiKXtiPVtdO2ZvcihoPWEuY2hpbGROb2Rlc3x8YTtu dWxsIT0ocz1oW3FdKTtxKyspIWN8fGQubm9kZU5hbWUocyxjKT9iLnB1c2gocyk6ZC5tZXJnZShi LEQocyxjKSl9cmV0dXJuIGM9PT1lfHxjJiZkLm5vZGVOYW1lKGEsYyk/ZC5tZXJnZShbYV0sYik6 Yn1mdW5jdGlvbiBQYihhKXtEYS50ZXN0KGEudHlwZSkmJihhLmRlZmF1bHRDaGVja2VkPWEuY2hl Y2tlZCl9ZnVuY3Rpb24gWWEoYSxjKXtpZihjIGluIGEpcmV0dXJuIGM7DQpmb3IodmFyIGQ9Yy5j aGFyQXQoMCkudG9VcHBlckNhc2UoKStjLnNsaWNlKDEpLHM9YyxlPVphLmxlbmd0aDtlLS07KWlm KGM9WmFbZV0rZCxjIGluIGEpcmV0dXJuIGM7cmV0dXJuIHN9ZnVuY3Rpb24gZWEoYSxjKXtyZXR1 cm4gYT1jfHxhLCJub25lIj09PWQuY3NzKGEsImRpc3BsYXkiKXx8IWQuY29udGFpbnMoYS5vd25l ckRvY3VtZW50LGEpfWZ1bmN0aW9uICRhKGEsYyl7Zm9yKHZhciBoLHMsZSxiPVtdLGw9MCxmPWEu bGVuZ3RoO2Y+bDtsKyspcz1hW2xdLHMuc3R5bGUmJihiW2xdPWQuX2RhdGEocywib2xkZGlzcGxh eSIpLGg9cy5zdHlsZS5kaXNwbGF5LGM/KGJbbF18fCJub25lIiE9PWh8fChzLnN0eWxlLmRpc3Bs YXk9IiIpLCIiPT09cy5zdHlsZS5kaXNwbGF5JiZlYShzKSYmKGJbbF09ZC5fZGF0YShzLCJvbGRk aXNwbGF5IixhYihzLm5vZGVOYW1lKSkpKTpiW2xdfHwoZT1lYShzKSwoaCYmIm5vbmUiIT09aHx8 IWUpJiZkLl9kYXRhKHMsIm9sZGRpc3BsYXkiLGU/aDoNCmQuY3NzKHMsImRpc3BsYXkiKSkpKTtm b3IobD0wO2Y+bDtsKyspcz1hW2xdLHMuc3R5bGUmJihjJiYibm9uZSIhPT1zLnN0eWxlLmRpc3Bs YXkmJiIiIT09cy5zdHlsZS5kaXNwbGF5fHwocy5zdHlsZS5kaXNwbGF5PWM/YltsXXx8IiI6Im5v bmUiKSk7cmV0dXJuIGF9ZnVuY3Rpb24gYmIoYSxjLGQpe3JldHVybihhPVFiLmV4ZWMoYykpP01h dGgubWF4KDAsYVsxXS0oZHx8MCkpKyhhWzJdfHwicHgiKTpjfWZ1bmN0aW9uIGNiKGEsYyxoLHMs ZSl7Yz1oPT09KHM/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT1jPzE6MDtmb3IodmFy IGI9MDs0PmM7Yys9MikibWFyZ2luIj09PWgmJihiKz1kLmNzcyhhLGgrS1tjXSwhMCxlKSkscz8o ImNvbnRlbnQiPT09aCYmKGItPWQuY3NzKGEsInBhZGRpbmciK0tbY10sITAsZSkpLCJtYXJnaW4i IT09aCYmKGItPWQuY3NzKGEsImJvcmRlciIrS1tjXSsiV2lkdGgiLCEwLGUpKSk6KGIrPWQuY3Nz KGEsInBhZGRpbmciK0tbY10sITAsZSksDQoicGFkZGluZyIhPT1oJiYoYis9ZC5jc3MoYSwiYm9y ZGVyIitLW2NdKyJXaWR0aCIsITAsZSkpKTtyZXR1cm4gYn1mdW5jdGlvbiBkYihhLGMsaCl7dmFy IGU9ITAsYj0id2lkdGgiPT09Yz9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LHU9WChhKSxs PWQuc3VwcG9ydC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PWQuY3NzKGEsImJveFNpemluZyIs ITEsdSk7aWYoMD49Ynx8bnVsbD09Yil7aWYoYj1iYShhLGMsdSksKDA+Ynx8bnVsbD09YikmJihi PWEuc3R5bGVbY10pLHFhLnRlc3QoYikpcmV0dXJuIGI7ZT1sJiYoZC5zdXBwb3J0LmJveFNpemlu Z1JlbGlhYmxlfHxiPT09YS5zdHlsZVtjXSk7Yj1wYXJzZUZsb2F0KGIpfHwwfXJldHVybiBiK2Ni KGEsYyxofHwobD8iYm9yZGVyIjoiY29udGVudCIpLGUsdSkrInB4In1mdW5jdGlvbiBhYihhKXt2 YXIgYz10LGg9ZWJbYV07cmV0dXJuIGh8fChoPWZiKGEsYyksIm5vbmUiIT09aCYmaHx8KG1hPSht YXx8ZCgiXHgzY2lmcmFtZSBmcmFtZWJvcmRlclx4M2QnMCcgd2lkdGhceDNkJzAnIGhlaWdodFx4 M2QnMCcvXHgzZSIpLmNzcygiY3NzVGV4dCIsDQoiZGlzcGxheTpibG9jayAhaW1wb3J0YW50Iikp LmFwcGVuZFRvKGMuZG9jdW1lbnRFbGVtZW50KSxjPShtYVswXS5jb250ZW50V2luZG93fHxtYVsw XS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGMud3JpdGUoIlx4M2MhZG9jdHlwZSBodG1sXHgz ZVx4M2NodG1sXHgzZVx4M2Nib2R5XHgzZSIpLGMuY2xvc2UoKSxoPWZiKGEsYyksbWEuZGV0YWNo KCkpLGViW2FdPWgpLGh9ZnVuY3Rpb24gZmIoYSxjKXt2YXIgaD1kKGMuY3JlYXRlRWxlbWVudChh KSkuYXBwZW5kVG8oYy5ib2R5KSxlPWQuY3NzKGhbMF0sImRpc3BsYXkiKTtyZXR1cm4gaC5yZW1v dmUoKSxlfWZ1bmN0aW9uIEVhKGEsYyxoLGUpe3ZhciBiO2lmKGQuaXNBcnJheShjKSlkLmVhY2go YyxmdW5jdGlvbihjLGQpe2h8fFJiLnRlc3QoYSk/ZShhLGQpOkVhKGErIlsiKygib2JqZWN0Ij09 dHlwZW9mIGQ/YzoiIikrIl0iLGQsaCxlKX0pO2Vsc2UgaWYoaHx8Im9iamVjdCIhPT1kLnR5cGUo YykpZShhLGMpO2Vsc2UgZm9yKGIgaW4gYylFYShhKw0KIlsiK2IrIl0iLGNbYl0saCxlKX1mdW5j dGlvbiBnYihhKXtyZXR1cm4gZnVuY3Rpb24oYyxoKXsic3RyaW5nIiE9dHlwZW9mIGMmJihoPWMs Yz0iKiIpO3ZhciBlLGI9MCx1PWMudG9Mb3dlckNhc2UoKS5tYXRjaChTKXx8W107aWYoZC5pc0Z1 bmN0aW9uKGgpKWZvcig7ZT11W2IrK107KSIrIj09PWVbMF0/KGU9ZS5zbGljZSgxKXx8IioiLChh W2VdPWFbZV18fFtdKS51bnNoaWZ0KGgpKTooYVtlXT1hW2VdfHxbXSkucHVzaChoKX19ZnVuY3Rp b24gaGIoYSxjLGgscyl7ZnVuY3Rpb24gYihmKXt2YXIgZztyZXR1cm4gdVtmXT0hMCxkLmVhY2go YVtmXXx8W10sZnVuY3Rpb24oYSxkKXt2YXIgZj1kKGMsaCxzKTtyZXR1cm4ic3RyaW5nIiE9dHlw ZW9mIGZ8fGx8fHVbZl0/bD8hKGc9Zik6ZTooYy5kYXRhVHlwZXMudW5zaGlmdChmKSxiKGYpLCEx KX0pLGd9dmFyIHU9e30sbD1hPT09RmE7cmV0dXJuIGIoYy5kYXRhVHlwZXNbMF0pfHwhdVsiKiJd JiZiKCIqIil9ZnVuY3Rpb24gR2EoYSwNCmMpe3ZhciBoLHMsYj1kLmFqYXhTZXR0aW5ncy5mbGF0 T3B0aW9uc3x8e307Zm9yKHMgaW4gYyljW3NdIT09ZSYmKChiW3NdP2E6aHx8KGg9e30pKVtzXT1j W3NdKTtyZXR1cm4gaCYmZC5leHRlbmQoITAsYSxoKSxhfWZ1bmN0aW9uIGliKCl7dHJ5e3JldHVy biBuZXcgYi5YTUxIdHRwUmVxdWVzdH1jYXRjaChhKXt9fWZ1bmN0aW9uIGpiKCl7cmV0dXJuIHNl dFRpbWVvdXQoZnVuY3Rpb24oKXtpYT1lfSksaWE9ZC5ub3coKX1mdW5jdGlvbiBTYihhLGMpe2Qu ZWFjaChjLGZ1bmN0aW9uKGMsZCl7Zm9yKHZhciBlPShuYVtjXXx8W10pLmNvbmNhdChuYVsiKiJd KSxiPTAsbD1lLmxlbmd0aDtsPmImJiFlW2JdLmNhbGwoYSxjLGQpO2IrKyk7fSl9ZnVuY3Rpb24g a2IoYSxjLGgpe3ZhciBlLGI9MCx1PXJhLmxlbmd0aCxsPWQuRGVmZXJyZWQoKS5hbHdheXMoZnVu Y3Rpb24oKXtkZWxldGUgZi5lbGVtfSksZj1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZh ciBjPWlhfHxqYigpLA0KYz1NYXRoLm1heCgwLGcuc3RhcnRUaW1lK2cuZHVyYXRpb24tYyksZD0x LShjL2cuZHVyYXRpb258fDApLGg9MCxiPWcudHdlZW5zLmxlbmd0aDtiPmg7aCsrKWcudHdlZW5z W2hdLnJ1bihkKTtyZXR1cm4gbC5ub3RpZnlXaXRoKGEsW2csZCxjXSksMT5kJiZiP2M6KGwucmVz b2x2ZVdpdGgoYSxbZ10pLCExKX0sZz1sLnByb21pc2Uoe2VsZW06YSxwcm9wczpkLmV4dGVuZCh7 fSxjKSxvcHRzOmQuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxoKSxvcmlnaW5hbFByb3Bl cnRpZXM6YyxvcmlnaW5hbE9wdGlvbnM6aCxzdGFydFRpbWU6aWF8fGpiKCksZHVyYXRpb246aC5k dXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYyxoKXt2YXIgZT1kLlR3ZWVu KGEsZy5vcHRzLGMsaCxnLm9wdHMuc3BlY2lhbEVhc2luZ1tjXXx8Zy5vcHRzLmVhc2luZyk7cmV0 dXJuIGcudHdlZW5zLnB1c2goZSksZX0sc3RvcDpmdW5jdGlvbihjKXt2YXIgZD0wLGg9Yz9nLnR3 ZWVucy5sZW5ndGg6DQowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7aD5kO2QrKylnLnR3ZWVu c1tkXS5ydW4oMSk7cmV0dXJuIGM/bC5yZXNvbHZlV2l0aChhLFtnLGNdKTpsLnJlamVjdFdpdGgo YSxbZyxjXSksdGhpc319KTtoPWcucHJvcHM7Zm9yKFRiKGgsZy5vcHRzLnNwZWNpYWxFYXNpbmcp O3U+YjtiKyspaWYoYz1yYVtiXS5jYWxsKGcsYSxoLGcub3B0cykpcmV0dXJuIGM7cmV0dXJuIFNi KGcsaCksZC5pc0Z1bmN0aW9uKGcub3B0cy5zdGFydCkmJmcub3B0cy5zdGFydC5jYWxsKGEsZyks ZC5meC50aW1lcihkLmV4dGVuZChmLHtlbGVtOmEsYW5pbTpnLHF1ZXVlOmcub3B0cy5xdWV1ZX0p KSxnLnByb2dyZXNzKGcub3B0cy5wcm9ncmVzcykuZG9uZShnLm9wdHMuZG9uZSxnLm9wdHMuY29t cGxldGUpLmZhaWwoZy5vcHRzLmZhaWwpLmFsd2F5cyhnLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBU YihhLGMpe3ZhciBoLGUsYix1LGw7Zm9yKGIgaW4gYSlpZihlPWQuY2FtZWxDYXNlKGIpLHU9Y1tl XSwNCmg9YVtiXSxkLmlzQXJyYXkoaCkmJih1PWhbMV0saD1hW2JdPWhbMF0pLGIhPT1lJiYoYVtl XT1oLGRlbGV0ZSBhW2JdKSxsPWQuY3NzSG9va3NbZV0sbCYmImV4cGFuZCJpbiBsKWZvcihiIGlu IGg9bC5leHBhbmQoaCksZGVsZXRlIGFbZV0saCliIGluIGF8fChhW2JdPWhbYl0sY1tiXT11KTtl bHNlIGNbZV09dX1mdW5jdGlvbiBCKGEsYyxkLGUsYil7cmV0dXJuIG5ldyBCLnByb3RvdHlwZS5p bml0KGEsYyxkLGUsYil9ZnVuY3Rpb24gdWEoYSxjKXt2YXIgZCxlPXtoZWlnaHQ6YX0sYj0wO2Zv cihjPWM/MTowOzQ+YjtiKz0yLWMpZD1LW2JdLGVbIm1hcmdpbiIrZF09ZVsicGFkZGluZyIrZF09 YTtyZXR1cm4gYyYmKGUub3BhY2l0eT1lLndpZHRoPWEpLGV9ZnVuY3Rpb24gbGIoYSl7cmV0dXJu IGQuaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdp bmRvdzohMX12YXIgd2EsbWIsUT10eXBlb2YgZSx0PWIuZG9jdW1lbnQsVWI9Yi5sb2NhdGlvbiwN ClZiPWIualF1ZXJ5LFdiPWIuJCx4YT17fSxoYT1bXSxuYj1oYS5jb25jYXQsSGE9aGEucHVzaCxZ PWhhLnNsaWNlLG9iPWhhLmluZGV4T2YsWGI9eGEudG9TdHJpbmcsb2E9eGEuaGFzT3duUHJvcGVy dHksSWE9IjEuOS4xIi50cmltLGQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbmV3IGQuZm4uaW5pdChh LGMsbWIpfSx5YT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxT PS9cUysvZyxZYj0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csWmI9L14oPzoo PFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxwYj0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58 KSQvLCRiPS9eW1xdLDp7fVxzXSokLyxhYz0vKD86Xnw6fCwpKD86XHMqXFspKy9nLGJjPS9cXCg/ OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZyxjYz0vIlteIlxcXHJcbl0qInx0cnVlfGZh bHNlfG51bGx8LT8oPzpcZCtcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvZyxkYz0NCi9eLW1zLS8s ZWM9Ly0oW1xkYS16XSkvZ2ksZmM9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYy50b1VwcGVyQ2FzZSgp fSxGPWZ1bmN0aW9uKGEpeyh0LmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWEudHlwZXx8ImNv bXBsZXRlIj09PXQucmVhZHlTdGF0ZSkmJihxYigpLGQucmVhZHkoKSl9LHFiPWZ1bmN0aW9uKCl7 dC5hZGRFdmVudExpc3RlbmVyPyh0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2Fk ZWQiLEYsITEpLGIucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsRiwhMSkpOih0LmRldGFjaEV2 ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEYpLGIuZGV0YWNoRXZlbnQoIm9ubG9hZCIsRikpfTtk LmZuPWQucHJvdG90eXBlPXtqcXVlcnk6IjEuOS4xIixjb25zdHJ1Y3RvcjpkLGluaXQ6ZnVuY3Rp b24oYSxjLGgpe3ZhciBiLHE7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBh KXtpZihiPSJceDNjIj09PWEuY2hhckF0KDApJiYiXHgzZSI9PT0NCmEuY2hhckF0KGEubGVuZ3Ro LTEpJiYzPD1hLmxlbmd0aD9bbnVsbCxhLG51bGxdOlpiLmV4ZWMoYSksIWJ8fCFiWzFdJiZjKXJl dHVybiFjfHxjLmpxdWVyeT8oY3x8aCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGMpLmZpbmQo YSk7aWYoYlsxXSl7aWYoYz1jIGluc3RhbmNlb2YgZD9jWzBdOmMsZC5tZXJnZSh0aGlzLGQucGFy c2VIVE1MKGJbMV0sYyYmYy5ub2RlVHlwZT9jLm93bmVyRG9jdW1lbnR8fGM6dCwhMCkpLHBiLnRl c3QoYlsxXSkmJmQuaXNQbGFpbk9iamVjdChjKSlmb3IoYiBpbiBjKWQuaXNGdW5jdGlvbih0aGlz W2JdKT90aGlzW2JdKGNbYl0pOnRoaXMuYXR0cihiLGNbYl0pO3JldHVybiB0aGlzfWlmKHE9dC5n ZXRFbGVtZW50QnlJZChiWzJdKSxxJiZxLnBhcmVudE5vZGUpe2lmKHEuaWQhPT1iWzJdKXJldHVy biBoLmZpbmQoYSk7dGhpcy5sZW5ndGg9MTt0aGlzWzBdPXF9cmV0dXJuIHRoaXMuY29udGV4dD10 LHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPw0KKHRoaXMuY29udGV4dD10 aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTpkLmlzRnVuY3Rpb24oYSk/aC5yZWFkeShhKToo YS5zZWxlY3RvciE9PWUmJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEu Y29udGV4dCksZC5tYWtlQXJyYXkoYSx0aGlzKSl9LHNlbGVjdG9yOiIiLGxlbmd0aDowLHNpemU6 ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4g WS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/dGhpcy50b0FycmF5 KCk6MD5hP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEp e2E9ZC5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksYSk7cmV0dXJuIGEucHJldk9iamVjdD10aGlz LGEuY29udGV4dD10aGlzLmNvbnRleHQsYX0sZWFjaDpmdW5jdGlvbihhLGMpe3JldHVybiBkLmVh Y2godGhpcyxhLGMpfSxyZWFkeTpmdW5jdGlvbihhKXtyZXR1cm4gZC5yZWFkeS5wcm9taXNlKCku ZG9uZShhKSwNCnRoaXN9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFku YXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgw KX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFy IGM9dGhpcy5sZW5ndGg7YT0rYSsoMD5hP2M6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKDA8PWEm JmM+YT9bdGhpc1thXV06W10pfSxtYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNr KGQubWFwKHRoaXMsZnVuY3Rpb24oYyxkKXtyZXR1cm4gYS5jYWxsKGMsZCxjKX0pKX0sZW5kOmZ1 bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0s cHVzaDpIYSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX07ZC5mbi5pbml0LnByb3RvdHlw ZT1kLmZuO2QuZXh0ZW5kPWQuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYyxoLGIscSx1LA0K bD1hcmd1bWVudHNbMF18fHt9LGY9MSxnPWFyZ3VtZW50cy5sZW5ndGgsaz0hMTsiYm9vbGVhbiI9 PXR5cGVvZiBsJiYoaz1sLGw9YXJndW1lbnRzWzFdfHx7fSxmPTIpOyJvYmplY3QiPT10eXBlb2Yg bHx8ZC5pc0Z1bmN0aW9uKGwpfHwobD17fSk7Zm9yKGc9PT1mJiYobD10aGlzLC0tZik7Zz5mO2Yr KylpZihudWxsIT0ocT1hcmd1bWVudHNbZl0pKWZvcihiIGluIHEpYT1sW2JdLGg9cVtiXSxsIT09 aCYmKGsmJmgmJihkLmlzUGxhaW5PYmplY3QoaCl8fChjPWQuaXNBcnJheShoKSkpPyhjPyhjPSEx LHU9YSYmZC5pc0FycmF5KGEpP2E6W10pOnU9YSYmZC5pc1BsYWluT2JqZWN0KGEpP2E6e30sbFti XT1kLmV4dGVuZChrLHUsaCkpOmghPT1lJiYobFtiXT1oKSk7cmV0dXJuIGx9O2QuZXh0ZW5kKHtu b0NvbmZsaWN0OmZ1bmN0aW9uKGEpe3JldHVybiBiLiQ9PT1kJiYoYi4kPVdiKSxhJiZiLmpRdWVy eT09PWQmJihiLmpRdWVyeT1WYiksZH0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSwNCmhvbGRSZWFk eTpmdW5jdGlvbihhKXthP2QucmVhZHlXYWl0Kys6ZC5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9u KGEpe2lmKCEwPT09YT8hLS1kLnJlYWR5V2FpdDohZC5pc1JlYWR5KXtpZighdC5ib2R5KXJldHVy biBzZXRUaW1lb3V0KGQucmVhZHkpO2QuaXNSZWFkeT0hMDshMCE9PWEmJjA8LS1kLnJlYWR5V2Fp dHx8KHdhLnJlc29sdmVXaXRoKHQsW2RdKSxkLmZuLnRyaWdnZXImJmQodCkudHJpZ2dlcigicmVh ZHkiKS5vZmYoInJlYWR5IikpfX0saXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm4iZnVuY3Rp b24iPT09ZC50eXBlKGEpfSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVy biJhcnJheSI9PT1kLnR5cGUoYSl9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1h JiZhPT1hLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGEpe3JldHVybiFpc05hTihwYXJzZUZs b2F0KGEpKSYmaXNGaW5pdGUoYSl9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PQ0KYT9h KyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/eGFbWGIuY2FsbChh KV18fCJvYmplY3QiOnR5cGVvZiBhfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHwi b2JqZWN0IiE9PWQudHlwZShhKXx8YS5ub2RlVHlwZXx8ZC5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0 cnl7aWYoYS5jb25zdHJ1Y3RvciYmIW9hLmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIW9hLmNhbGwo YS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChj KXtyZXR1cm4hMX1mb3IodmFyIGggaW4gYSk7cmV0dXJuIGg9PT1lfHxvYS5jYWxsKGEsaCl9LGlz RW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjIGluIGEpcmV0dXJuITE7cmV0dXJuITB9 LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IEVycm9yKGEpO30scGFyc2VIVE1MOmZ1bmN0aW9uKGEs YyxoKXtpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsOw0KImJvb2xlYW4iPT10 eXBlb2YgYyYmKGg9YyxjPSExKTtjPWN8fHQ7dmFyIGU9cGIuZXhlYyhhKTtoPSFoJiZbXTtyZXR1 cm4gZT9bYy5jcmVhdGVFbGVtZW50KGVbMV0pXTooZT1kLmJ1aWxkRnJhZ21lbnQoW2FdLGMsaCks aCYmZChoKS5yZW1vdmUoKSxkLm1lcmdlKFtdLGUuY2hpbGROb2RlcykpfSxwYXJzZUpTT046ZnVu Y3Rpb24oYSl7cmV0dXJuIGIuSlNPTiYmYi5KU09OLnBhcnNlP2IuSlNPTi5wYXJzZShhKTpudWxs PT09YT9hOiJzdHJpbmciPT10eXBlb2YgYSYmKGE9ZC50cmltKGEpLGEmJiRiLnRlc3QoYS5yZXBs YWNlKGJjLCJAIikucmVwbGFjZShjYywiXSIpLnJlcGxhY2UoYWMsIiIpKSk/RnVuY3Rpb24oInJl dHVybiAiK2EpKCk6KGQuZXJyb3IoIkludmFsaWQgSlNPTjogIithKSxlKX0scGFyc2VYTUw6ZnVu Y3Rpb24oYSl7dmFyIGMsaDtpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsO3Ry eXtiLkRPTVBhcnNlcj8oaD1uZXcgRE9NUGFyc2VyLGM9DQpoLnBhcnNlRnJvbVN0cmluZyhhLCJ0 ZXh0L3htbCIpKTooYz1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGMuYXN5 bmM9ImZhbHNlIixjLmxvYWRYTUwoYSkpfWNhdGNoKHMpe2M9ZX1yZXR1cm4gYyYmYy5kb2N1bWVu dEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8 ZC5lcnJvcigiSW52YWxpZCBYTUw6ICIrYSksY30sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZh bDpmdW5jdGlvbihhKXthJiZkLnRyaW0oYSkmJihiLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGEpe2Iu ZXZhbC5jYWxsKGIsYSl9KShhKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxh Y2UoZGMsIm1zLSIpLnJlcGxhY2UoZWMsZmMpfSxub2RlTmFtZTpmdW5jdGlvbihhLGMpe3JldHVy biBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1jLnRvTG93ZXJDYXNlKCl9 LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLA0KYj0wLHU9YS5sZW5ndGgsbD1mKGEpO2lmKGQp aWYobClmb3IoO3U+YiYmIShlPWMuYXBwbHkoYVtiXSxkKSwhMT09PWUpO2IrKyk7ZWxzZSBmb3Io YiBpbiBhKXtpZihlPWMuYXBwbHkoYVtiXSxkKSwhMT09PWUpYnJlYWt9ZWxzZSBpZihsKWZvcig7 dT5iJiYhKGU9Yy5jYWxsKGFbYl0sYixhW2JdKSwhMT09PWUpO2IrKyk7ZWxzZSBmb3IoYiBpbiBh KWlmKGU9Yy5jYWxsKGFbYl0sYixhW2JdKSwhMT09PWUpYnJlYWs7cmV0dXJuIGF9LHRyaW06SWEm JiFJYS5jYWxsKCLvu7/CICIpP2Z1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOklhLmNhbGwo YSl9OmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOihhKyIiKS5yZXBsYWNlKFliLCIiKX0s bWFrZUFycmF5OmZ1bmN0aW9uKGEsYyl7dmFyIGg9Y3x8W107cmV0dXJuIG51bGwhPWEmJihmKE9i amVjdChhKSk/ZC5tZXJnZShoLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6SGEuY2FsbChoLGEp KSxofSxpbkFycmF5OmZ1bmN0aW9uKGEsDQpjLGQpe3ZhciBlO2lmKGMpe2lmKG9iKXJldHVybiBv Yi5jYWxsKGMsYSxkKTtlPWMubGVuZ3RoO2ZvcihkPWQ/MD5kP01hdGgubWF4KDAsZStkKTpkOjA7 ZT5kO2QrKylpZihkIGluIGMmJmNbZF09PT1hKXJldHVybiBkfXJldHVybi0xfSxtZXJnZTpmdW5j dGlvbihhLGMpe3ZhciBkPWMubGVuZ3RoLGI9YS5sZW5ndGgscT0wO2lmKCJudW1iZXIiPT10eXBl b2YgZClmb3IoO2Q+cTtxKyspYVtiKytdPWNbcV07ZWxzZSBmb3IoO2NbcV0hPT1lOylhW2IrK109 Y1txKytdO3JldHVybiBhLmxlbmd0aD1iLGF9LGdyZXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGI9 W10sZj0wLGw9YS5sZW5ndGg7Zm9yKGQ9ISFkO2w+ZjtmKyspZT0hIWMoYVtmXSxmKSxkIT09ZSYm Yi5wdXNoKGFbZl0pO3JldHVybiBifSxtYXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGI9MCx1PWEu bGVuZ3RoLGw9W107aWYoZihhKSlmb3IoO3U+YjtiKyspZT1jKGFbYl0sYixkKSxudWxsIT1lJiYo bFtsLmxlbmd0aF09ZSk7DQplbHNlIGZvcihiIGluIGEpZT1jKGFbYl0sYixkKSxudWxsIT1lJiYo bFtsLmxlbmd0aF09ZSk7cmV0dXJuIG5iLmFwcGx5KFtdLGwpfSxndWlkOjEscHJveHk6ZnVuY3Rp b24oYSxjKXt2YXIgaCxiLHE7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBjJiYocT1hW2NdLGM9YSxh PXEpLGQuaXNGdW5jdGlvbihhKT8oaD1ZLmNhbGwoYXJndW1lbnRzLDIpLGI9ZnVuY3Rpb24oKXty ZXR1cm4gYS5hcHBseShjfHx0aGlzLGguY29uY2F0KFkuY2FsbChhcmd1bWVudHMpKSl9LGIuZ3Vp ZD1hLmd1aWQ9YS5ndWlkfHxkLmd1aWQrKyxiKTplfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGgsYixx LGYsbCl7dmFyIGc9MCxrPWEubGVuZ3RoLG09bnVsbD09aDtpZigib2JqZWN0Ij09PWQudHlwZSho KSlmb3IoZyBpbiBxPSEwLGgpZC5hY2Nlc3MoYSxjLGcsaFtnXSwhMCxmLGwpO2Vsc2UgaWYoYiE9 PWUmJihxPSEwLGQuaXNGdW5jdGlvbihiKXx8KGw9ITApLG0mJihsPyhjLmNhbGwoYSxiKSxjPW51 bGwpOihtPQ0KYyxjPWZ1bmN0aW9uKGEsYyxoKXtyZXR1cm4gbS5jYWxsKGQoYSksaCl9KSksYykp Zm9yKDtrPmc7ZysrKWMoYVtnXSxoLGw/YjpiLmNhbGwoYVtnXSxnLGMoYVtnXSxoKSkpO3JldHVy biBxP2E6bT9jLmNhbGwoYSk6az9jKGFbMF0saCk6Zn0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5l dyBEYXRlKS5nZXRUaW1lKCl9fSk7ZC5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGEpe2lmKCF3YSlp Zih3YT1kLkRlZmVycmVkKCksImNvbXBsZXRlIj09PXQucmVhZHlTdGF0ZSlzZXRUaW1lb3V0KGQu cmVhZHkpO2Vsc2UgaWYodC5hZGRFdmVudExpc3RlbmVyKXQuYWRkRXZlbnRMaXN0ZW5lcigiRE9N Q29udGVudExvYWRlZCIsRiwhMSksYi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixGLCExKTtlbHNl e3QuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsRik7Yi5hdHRhY2hFdmVudCgib25s b2FkIixGKTt2YXIgYz0hMTt0cnl7Yz1udWxsPT1iLmZyYW1lRWxlbWVudCYmdC5kb2N1bWVudEVs ZW1lbnR9Y2F0Y2goaCl7fWMmJg0KYy5kb1Njcm9sbCYmZnVuY3Rpb24gcSgpe2lmKCFkLmlzUmVh ZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7cmV0dXJuIHNldFRpbWVvdXQocSw1 MCl9cWIoKTtkLnJlYWR5KCl9fSgpfXJldHVybiB3YS5wcm9taXNlKGEpfTtkLmVhY2goIkJvb2xl YW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3Ii LnNwbGl0KCIgIiksZnVuY3Rpb24oYSxjKXt4YVsiW29iamVjdCAiK2MrIl0iXT1jLnRvTG93ZXJD YXNlKCl9KTttYj1kKHQpO3ZhciBWYT17fTtkLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJp bmciPT10eXBlb2YgYT9WYVthXXx8ZyhhKTpkLmV4dGVuZCh7fSxhKTt2YXIgYyxoLGIscSxmLGws dj1bXSxrPSFhLm9uY2UmJltdLG09ZnVuY3Rpb24oZCl7aD1hLm1lbW9yeSYmZDtiPSEwO2Y9bHx8 MDtsPTA7cT12Lmxlbmd0aDtmb3IoYz0hMDt2JiZxPmY7ZisrKWlmKCExPT09dltmXS5hcHBseShk WzBdLGRbMV0pJiYNCmEuc3RvcE9uRmFsc2Upe2g9ITE7YnJlYWt9Yz0hMTt2JiYoaz9rLmxlbmd0 aCYmbShrLnNoaWZ0KCkpOmg/dj1bXTpyLmRpc2FibGUoKSl9LHI9e2FkZDpmdW5jdGlvbigpe2lm KHYpe3ZhciBlPXYubGVuZ3RoOyhmdW5jdGlvbiBnYyhjKXtkLmVhY2goYyxmdW5jdGlvbihjLGgp e3ZhciBlPWQudHlwZShoKTsiZnVuY3Rpb24iPT09ZT9hLnVuaXF1ZSYmci5oYXMoaCl8fHYucHVz aChoKTpoJiZoLmxlbmd0aCYmInN0cmluZyIhPT1lJiZnYyhoKX0pfSkoYXJndW1lbnRzKTtjP3E9 di5sZW5ndGg6aCYmKGw9ZSxtKGgpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0 dXJuIHYmJmQuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxoKXtmb3IodmFyIGU7LTE8KGU9ZC5p bkFycmF5KGgsdixlKSk7KXYuc3BsaWNlKGUsMSksYyYmKHE+PWUmJnEtLSxmPj1lJiZmLS0pfSks dGhpc30saGFzOmZ1bmN0aW9uKGEpe3JldHVybiBhPy0xPGQuaW5BcnJheShhLHYpOiEoIXZ8fCF2 Lmxlbmd0aCl9LA0KZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gdj1bXSx0aGlzfSxkaXNhYmxlOmZ1 bmN0aW9uKCl7cmV0dXJuIHY9az1oPWUsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4h dn0sbG9jazpmdW5jdGlvbigpe3JldHVybiBrPWUsaHx8ci5kaXNhYmxlKCksdGhpc30sbG9ja2Vk OmZ1bmN0aW9uKCl7cmV0dXJuIWt9LGZpcmVXaXRoOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGQ9ZHx8 W10sZD1bYSxkLnNsaWNlP2Quc2xpY2UoKTpkXSwhdnx8YiYmIWt8fChjP2sucHVzaChkKTptKGQp KSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIHIuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMp LHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFifX07cmV0dXJuIHJ9O2QuZXh0ZW5kKHtE ZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYz1bWyJyZXNvbHZlIiwiZG9uZSIsZC5DYWxsYmFja3Mo Im9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixkLkNhbGxiYWNrcygi b25jZSBtZW1vcnkiKSwNCiJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLGQuQ2FsbGJh Y2tzKCJtZW1vcnkiKV1dLGg9InBlbmRpbmciLGU9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGh9 LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBiLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50 cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50cztyZXR1cm4gZC5EZWZlcnJl ZChmdW5jdGlvbihoKXtkLmVhY2goYyxmdW5jdGlvbihjLGYpe3ZhciBnPWZbMF0saz1kLmlzRnVu Y3Rpb24oYVtjXSkmJmFbY107YltmWzFdXShmdW5jdGlvbigpe3ZhciBhPWsmJmsuYXBwbHkodGhp cyxhcmd1bWVudHMpO2EmJmQuaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUo aC5yZXNvbHZlKS5mYWlsKGgucmVqZWN0KS5wcm9ncmVzcyhoLm5vdGlmeSk6aFtnKyJXaXRoIl0o dGhpcz09PWU/aC5wcm9taXNlKCk6dGhpcyxrP1thXTphcmd1bWVudHMpfSl9KTthPW51bGx9KS5w cm9taXNlKCl9LA0KcHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9kLmV4dGVuZChh LGUpOmV9fSxiPXt9O3JldHVybiBlLnBpcGU9ZS50aGVuLGQuZWFjaChjLGZ1bmN0aW9uKGEsZCl7 dmFyIGY9ZFsyXSxnPWRbM107ZVtkWzFdXT1mLmFkZDtnJiZmLmFkZChmdW5jdGlvbigpe2g9Z30s Y1sxXmFdWzJdLmRpc2FibGUsY1syXVsyXS5sb2NrKTtiW2RbMF1dPWZ1bmN0aW9uKCl7cmV0dXJu IGJbZFswXSsiV2l0aCJdKHRoaXM9PT1iP2U6dGhpcyxhcmd1bWVudHMpLHRoaXN9O2JbZFswXSsi V2l0aCJdPWYuZmlyZVdpdGh9KSxlLnByb21pc2UoYiksYSYmYS5jYWxsKGIsYiksYn0sd2hlbjpm dW5jdGlvbihhKXt2YXIgYz0wLGg9WS5jYWxsKGFyZ3VtZW50cyksZT1oLmxlbmd0aCxiPTEhPT1l fHxhJiZkLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9lOjAsZj0xPT09Yj9hOmQuRGVmZXJyZWQoKSxs PWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gZnVuY3Rpb24oaCl7Y1thXT10aGlzO2RbYV09MTxhcmd1 bWVudHMubGVuZ3RoPw0KWS5jYWxsKGFyZ3VtZW50cyk6aDtkPT09Zz9mLm5vdGlmeVdpdGgoYyxk KTotLWJ8fGYucmVzb2x2ZVdpdGgoYyxkKX19LGcsayxtO2lmKDE8ZSl7Zz1BcnJheShlKTtrPUFy cmF5KGUpO2ZvcihtPUFycmF5KGUpO2U+YztjKyspaFtjXSYmZC5pc0Z1bmN0aW9uKGhbY10ucHJv bWlzZSk/aFtjXS5wcm9taXNlKCkuZG9uZShsKGMsbSxoKSkuZmFpbChmLnJlamVjdCkucHJvZ3Jl c3MobChjLGssZykpOi0tYn1yZXR1cm4gYnx8Zi5yZXNvbHZlV2l0aChtLGgpLGYucHJvbWlzZSgp fX0pO2Quc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBhLGMsaCxlLGYsdSxsLGc9dC5jcmVhdGVFbGVt ZW50KCJkaXYiKTtpZihnLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLGcuaW5uZXJIVE1M PSIgIFx4M2NsaW5rL1x4M2VceDNjdGFibGVceDNlXHgzYy90YWJsZVx4M2VceDNjYSBocmVmXHgz ZCcvYSdceDNlYVx4M2MvYVx4M2VceDNjaW5wdXQgdHlwZVx4M2QnY2hlY2tib3gnL1x4M2UiLGM9 Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLA0KaD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJh IilbMF0sIWN8fCFofHwhYy5sZW5ndGgpcmV0dXJue307ZT10LmNyZWF0ZUVsZW1lbnQoInNlbGVj dCIpO2Y9ZS5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtjPWcuZ2V0RWxl bWVudHNCeVRhZ05hbWUoImlucHV0IilbMF07aC5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4O2Zsb2F0 OmxlZnQ7b3BhY2l0eTouNSI7YT17Z2V0U2V0QXR0cmlidXRlOiJ0IiE9PWcuY2xhc3NOYW1lLGxl YWRpbmdXaGl0ZXNwYWNlOjM9PT1nLmZpcnN0Q2hpbGQubm9kZVR5cGUsdGJvZHk6IWcuZ2V0RWxl bWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFnLmdldEVsZW1l bnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi90b3AvLnRlc3QoaC5nZXRBdHRyaWJ1 dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOiIvYSI9PT1oLmdldEF0dHJpYnV0ZSgiaHJlZiIp LG9wYWNpdHk6L14wLjUvLnRlc3QoaC5zdHlsZS5vcGFjaXR5KSwNCmNzc0Zsb2F0OiEhaC5zdHls ZS5jc3NGbG9hdCxjaGVja09uOiEhYy52YWx1ZSxvcHRTZWxlY3RlZDpmLnNlbGVjdGVkLGVuY3R5 cGU6ISF0LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGh0bWw1Q2xvbmU6Ilx4M2M6bmF2 XHgzZVx4M2MvOm5hdlx4M2UiIT09dC5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITAp Lm91dGVySFRNTCxib3hNb2RlbDoiQ1NTMUNvbXBhdCI9PT10LmNvbXBhdE1vZGUsZGVsZXRlRXhw YW5kbzohMCxub0Nsb25lRXZlbnQ6ITAsaW5saW5lQmxvY2tOZWVkc0xheW91dDohMSxzaHJpbmtX cmFwQmxvY2tzOiExLHJlbGlhYmxlTWFyZ2luUmlnaHQ6ITAsYm94U2l6aW5nUmVsaWFibGU6ITAs cGl4ZWxQb3NpdGlvbjohMX07Yy5jaGVja2VkPSEwO2Eubm9DbG9uZUNoZWNrZWQ9Yy5jbG9uZU5v ZGUoITApLmNoZWNrZWQ7ZS5kaXNhYmxlZD0hMDthLm9wdERpc2FibGVkPSFmLmRpc2FibGVkO3Ry eXtkZWxldGUgZy50ZXN0fWNhdGNoKGspe2EuZGVsZXRlRXhwYW5kbz0NCiExfWM9dC5jcmVhdGVF bGVtZW50KCJpbnB1dCIpO2Muc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpO2EuaW5wdXQ9IiI9PT1j LmdldEF0dHJpYnV0ZSgidmFsdWUiKTtjLnZhbHVlPSJ0IjtjLnNldEF0dHJpYnV0ZSgidHlwZSIs InJhZGlvIik7YS5yYWRpb1ZhbHVlPSJ0Ij09PWMudmFsdWU7Yy5zZXRBdHRyaWJ1dGUoImNoZWNr ZWQiLCJ0Iik7Yy5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0Iik7aD10LmNyZWF0ZURvY3VtZW50RnJh Z21lbnQoKTtoLmFwcGVuZENoaWxkKGMpO2EuYXBwZW5kQ2hlY2tlZD1jLmNoZWNrZWQ7YS5jaGVj a0Nsb25lPWguY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkO2cu YXR0YWNoRXZlbnQmJihnLmF0dGFjaEV2ZW50KCJvbmNsaWNrIixmdW5jdGlvbigpe2Eubm9DbG9u ZUV2ZW50PSExfSksZy5jbG9uZU5vZGUoITApLmNsaWNrKCkpO2ZvcihsIGlue3N1Ym1pdDohMCxj aGFuZ2U6ITAsZm9jdXNpbjohMH0pZy5zZXRBdHRyaWJ1dGUoaD0NCiJvbiIrbCwidCIpLGFbbCsi QnViYmxlcyJdPWggaW4gYnx8ITE9PT1nLmF0dHJpYnV0ZXNbaF0uZXhwYW5kbztyZXR1cm4gZy5z dHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGcuY2xvbmVOb2RlKCEwKS5zdHlsZS5i YWNrZ3JvdW5kQ2xpcD0iIixhLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Zy5zdHls ZS5iYWNrZ3JvdW5kQ2xpcCxkKGZ1bmN0aW9uKCl7dmFyIGMsZCxoLGU9dC5nZXRFbGVtZW50c0J5 VGFnTmFtZSgiYm9keSIpWzBdO2UmJihjPXQuY3JlYXRlRWxlbWVudCgiZGl2IiksYy5zdHlsZS5j c3NUZXh0PSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDow O2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweCIsZS5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGls ZChnKSxnLmlubmVySFRNTD0iXHgzY3RhYmxlXHgzZVx4M2N0clx4M2VceDNjdGRceDNlXHgzYy90 ZFx4M2VceDNjdGRceDNldFx4M2MvdGRceDNlXHgzYy90clx4M2VceDNjL3RhYmxlXHgzZSIsDQpo PWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRkIiksaFswXS5zdHlsZS5jc3NUZXh0PSJwYWRkaW5n OjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lIix1PTA9PT1oWzBdLm9mZnNldEhlaWdo dCxoWzBdLnN0eWxlLmRpc3BsYXk9IiIsaFsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixhLnJlbGlh YmxlSGlkZGVuT2Zmc2V0cz11JiYwPT09aFswXS5vZmZzZXRIZWlnaHQsZy5pbm5lckhUTUw9IiIs Zy5zdHlsZS5jc3NUZXh0PSJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJv cmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVy OjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29s dXRlO3RvcDoxJTsiLGEuYm94U2l6aW5nPTQ9PT1nLm9mZnNldFdpZHRoLGEuZG9lc05vdEluY2x1 ZGVNYXJnaW5JbkJvZHlPZmZzZXQ9MSE9PWUub2Zmc2V0VG9wLGIuZ2V0Q29tcHV0ZWRTdHlsZSYm DQooYS5waXhlbFBvc2l0aW9uPSIxJSIhPT0oYi5nZXRDb21wdXRlZFN0eWxlKGcsbnVsbCl8fHt9 KS50b3AsYS5ib3hTaXppbmdSZWxpYWJsZT0iNHB4Ij09PShiLmdldENvbXB1dGVkU3R5bGUoZyxu dWxsKXx8e3dpZHRoOiI0cHgifSkud2lkdGgsZD1nLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVu dCgiZGl2IikpLGQuc3R5bGUuY3NzVGV4dD1nLnN0eWxlLmNzc1RleHQ9InBhZGRpbmc6MDttYXJn aW46MDtib3JkZXI6MDtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1i b3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDsiLGQu c3R5bGUubWFyZ2luUmlnaHQ9ZC5zdHlsZS53aWR0aD0iMCIsZy5zdHlsZS53aWR0aD0iMXB4Iixh LnJlbGlhYmxlTWFyZ2luUmlnaHQ9IXBhcnNlRmxvYXQoKGIuZ2V0Q29tcHV0ZWRTdHlsZShkLG51 bGwpfHx7fSkubWFyZ2luUmlnaHQpKSx0eXBlb2YgZy5zdHlsZS56b29tIT09USYmDQooZy5pbm5l ckhUTUw9IiIsZy5zdHlsZS5jc3NUZXh0PSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlz cGxheTpibG9jaztib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50 LWJveDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MXB4O3BhZGRpbmc6MXB4 O2Rpc3BsYXk6aW5saW5lO3pvb206MSIsYS5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PTM9PT1nLm9m ZnNldFdpZHRoLGcuc3R5bGUuZGlzcGxheT0iYmxvY2siLGcuaW5uZXJIVE1MPSJceDNjZGl2XHgz ZVx4M2MvZGl2XHgzZSIsZy5maXJzdENoaWxkLnN0eWxlLndpZHRoPSI1cHgiLGEuc2hyaW5rV3Jh cEJsb2Nrcz0zIT09Zy5vZmZzZXRXaWR0aCxhLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJihlLnN0 eWxlLnpvb209MSkpLGUucmVtb3ZlQ2hpbGQoYyksZz1udWxsKX0pLGM9ZT1oPWY9aD1jPW51bGws YX0oKTt2YXIgTWI9Lyg/Olx7W1xzXFNdKlx9fFxbW1xzXFNdKlxdKSQvLA0KTGI9LyhbQS1aXSkv ZztkLmV4dGVuZCh7Y2FjaGU6e30sZXhwYW5kbzoialF1ZXJ5IisoIjEuOS4xIitNYXRoLnJhbmRv bSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxub0RhdGE6e2VtYmVkOiEwLG9iamVjdDoiY2xzaWQ6RDI3 Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIixhcHBsZXQ6ITB9LGhhc0RhdGE6ZnVu Y3Rpb24oYSl7cmV0dXJuIGE9YS5ub2RlVHlwZT9kLmNhY2hlW2FbZC5leHBhbmRvXV06YVtkLmV4 cGFuZG9dLCEhYSYmIXcoYSl9LGRhdGE6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBrKGEsYyxkKX0s cmVtb3ZlRGF0YTpmdW5jdGlvbihhLGMpe3JldHVybiBtKGEsYyl9LF9kYXRhOmZ1bmN0aW9uKGEs YyxkKXtyZXR1cm4gayhhLGMsZCwhMCl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYyl7cmV0dXJu IG0oYSxjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVUeXBlJiYxIT09YS5u b2RlVHlwZSYmOSE9PWEubm9kZVR5cGUpcmV0dXJuITE7DQp2YXIgYz1hLm5vZGVOYW1lJiZkLm5v RGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO3JldHVybiFjfHwhMCE9PWMmJmEuZ2V0QXR0 cmlidXRlKCJjbGFzc2lkIik9PT1jfX0pO2QuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYyl7 dmFyIGgsYixmPXRoaXNbMF0sZz0wLGw9bnVsbDtpZihhPT09ZSl7aWYodGhpcy5sZW5ndGgmJihs PWQuZGF0YShmKSwxPT09Zi5ub2RlVHlwZSYmIWQuX2RhdGEoZiwicGFyc2VkQXR0cnMiKSkpe2Zv cihoPWYuYXR0cmlidXRlcztoLmxlbmd0aD5nO2crKyliPWhbZ10ubmFtZSxiLmluZGV4T2YoImRh dGEtIil8fChiPWQuY2FtZWxDYXNlKGIuc2xpY2UoNSkpLG4oZixiLGxbYl0pKTtkLl9kYXRhKGYs InBhcnNlZEF0dHJzIiwhMCl9cmV0dXJuIGx9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBhP3RoaXMu ZWFjaChmdW5jdGlvbigpe2QuZGF0YSh0aGlzLGEpfSk6ZC5hY2Nlc3ModGhpcyxmdW5jdGlvbihj KXtyZXR1cm4gYz09PWU/Zj9uKGYsYSwNCmQuZGF0YShmLGEpKTpudWxsOih0aGlzLmVhY2goZnVu Y3Rpb24oKXtkLmRhdGEodGhpcyxhLGMpfSksZSl9LG51bGwsYywxPGFyZ3VtZW50cy5sZW5ndGgs bnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv bigpe2QucmVtb3ZlRGF0YSh0aGlzLGEpfSl9fSk7ZC5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEs YyxoKXt2YXIgYjtyZXR1cm4gYT8oYz0oY3x8ImZ4IikrInF1ZXVlIixiPWQuX2RhdGEoYSxjKSxo JiYoIWJ8fGQuaXNBcnJheShoKT9iPWQuX2RhdGEoYSxjLGQubWFrZUFycmF5KGgpKTpiLnB1c2go aCkpLGJ8fFtdKTplfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYyl7Yz1jfHwiZngiO3ZhciBoPWQucXVl dWUoYSxjKSxlPWgubGVuZ3RoLGI9aC5zaGlmdCgpLGY9ZC5fcXVldWVIb29rcyhhLGMpLGc9ZnVu Y3Rpb24oKXtkLmRlcXVldWUoYSxjKX07ImlucHJvZ3Jlc3MiPT09YiYmKGI9aC5zaGlmdCgpLGUt LSk7KGYuY3VyPWIpJiYNCigiZngiPT09YyYmaC51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRl IGYuc3RvcCxiLmNhbGwoYSxnLGYpKTshZSYmZiYmZi5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tz OmZ1bmN0aW9uKGEsYyl7dmFyIGg9YysicXVldWVIb29rcyI7cmV0dXJuIGQuX2RhdGEoYSxoKXx8 ZC5fZGF0YShhLGgse2VtcHR5OmQuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlv bigpe2QuX3JlbW92ZURhdGEoYSxjKyJxdWV1ZSIpO2QuX3JlbW92ZURhdGEoYSxoKX0pfSl9fSk7 ZC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsYyl7dmFyIGg9MjtyZXR1cm4ic3RyaW5nIiE9 dHlwZW9mIGEmJihjPWEsYT0iZngiLGgtLSksaD5hcmd1bWVudHMubGVuZ3RoP2QucXVldWUodGhp c1swXSxhKTpjPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBoPWQucXVldWUodGhp cyxhLGMpO2QuX3F1ZXVlSG9va3ModGhpcyxhKTsiZngiPT09YSYmImlucHJvZ3Jlc3MiIT09aFsw XSYmZC5kZXF1ZXVlKHRoaXMsDQphKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlz LmVhY2goZnVuY3Rpb24oKXtkLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGMp e3JldHVybiBhPWQuZng/ZC5meC5zcGVlZHNbYV18fGE6YSxjPWN8fCJmeCIsdGhpcy5xdWV1ZShj LGZ1bmN0aW9uKGMsZCl7dmFyIGU9c2V0VGltZW91dChjLGEpO2Quc3RvcD1mdW5jdGlvbigpe2Ns ZWFyVGltZW91dChlKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1 ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGMpe3ZhciBoLGI9MSxmPWQuRGVmZXJy ZWQoKSxnPXRoaXMsbD10aGlzLmxlbmd0aCx2PWZ1bmN0aW9uKCl7LS1ifHxmLnJlc29sdmVXaXRo KGcsW2ddKX07InN0cmluZyIhPXR5cGVvZiBhJiYoYz1hLGE9ZSk7Zm9yKGE9YXx8ImZ4IjtsLS07 KShoPWQuX2RhdGEoZ1tsXSxhKyJxdWV1ZUhvb2tzIikpJiZoLmVtcHR5JiYoYisrLGguZW1wdHku YWRkKHYpKTsNCnJldHVybiB2KCksZi5wcm9taXNlKGMpfX0pO3ZhciBqYSxyYixKYT0vW1x0XHJc bl0vZyxoYz0vXHIvZyxpYz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0 KSQvaSxqYz0vXig/OmF8YXJlYSkkL2ksc2I9L14oPzpjaGVja2VkfHNlbGVjdGVkfGF1dG9mb2N1 c3xhdXRvcGxheXxhc3luY3xjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0 aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCkkL2ksS2E9L14oPzpjaGVja2VkfHNl bGVjdGVkKSQvaSxVPWQuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsTGE9ZC5zdXBwb3J0LmlucHV0 O2QuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGQuYWNjZXNzKHRoaXMsZC5h dHRyLGEsYywxPGFyZ3VtZW50cy5sZW5ndGgpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEpe3JldHVy biB0aGlzLmVhY2goZnVuY3Rpb24oKXtkLnJlbW92ZUF0dHIodGhpcyxhKX0pfSxwcm9wOmZ1bmN0 aW9uKGEsDQpjKXtyZXR1cm4gZC5hY2Nlc3ModGhpcyxkLnByb3AsYSxjLDE8YXJndW1lbnRzLmxl bmd0aCl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9ZC5wcm9wRml4W2FdfHxhLHRo aXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPWUsZGVsZXRlIHRoaXNbYV19Y2F0Y2goYyl7 fX0pfSxhZGRDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxoLGUsYixmLGc9MCx2PXRoaXMubGVuZ3Ro O2M9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKGQuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5l YWNoKGZ1bmN0aW9uKGMpe2QodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNz TmFtZSkpfSk7aWYoYylmb3IoYz0oYXx8IiIpLm1hdGNoKFMpfHxbXTt2Pmc7ZysrKWlmKGg9dGhp c1tnXSxlPTE9PT1oLm5vZGVUeXBlJiYoaC5jbGFzc05hbWU/KCIgIitoLmNsYXNzTmFtZSsiICIp LnJlcGxhY2UoSmEsIiAiKToiICIpKXtmb3IoZj0wO2I9Y1tmKytdOykwPmUuaW5kZXhPZigiICIr DQpiKyIgIikmJihlKz1iKyIgIik7aC5jbGFzc05hbWU9ZC50cmltKGUpfXJldHVybiB0aGlzfSxy ZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxoLGUsYixmLGc9MCx2PXRoaXMubGVuZ3RoO2M9 MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihkLmlzRnVuY3Rp b24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtkKHRoaXMpLnJlbW92ZUNsYXNzKGEu Y2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGMpZm9yKGM9KGF8fCIiKS5tYXRjaChT KXx8W107dj5nO2crKylpZihoPXRoaXNbZ10sZT0xPT09aC5ub2RlVHlwZSYmKGguY2xhc3NOYW1l PygiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKEphLCIgIik6IiIpKXtmb3IoZj0wO2I9Y1tm KytdOylmb3IoOzA8PWUuaW5kZXhPZigiICIrYisiICIpOyllPWUucmVwbGFjZSgiICIrYisiICIs IiAiKTtoLmNsYXNzTmFtZT1hP2QudHJpbShlKToiIn1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6 ZnVuY3Rpb24oYSwNCmMpe3ZhciBoPXR5cGVvZiBhLGU9ImJvb2xlYW4iPT10eXBlb2YgYztyZXR1 cm4gZC5pc0Z1bmN0aW9uKGEpP3RoaXMuZWFjaChmdW5jdGlvbihoKXtkKHRoaXMpLnRvZ2dsZUNs YXNzKGEuY2FsbCh0aGlzLGgsdGhpcy5jbGFzc05hbWUsYyksYyl9KTp0aGlzLmVhY2goZnVuY3Rp b24oKXtpZigic3RyaW5nIj09PWgpZm9yKHZhciBiLGY9MCxnPWQodGhpcyksdj1jLGs9YS5tYXRj aChTKXx8W107Yj1rW2YrK107KXY9ZT92OiFnLmhhc0NsYXNzKGIpLGdbdj8iYWRkQ2xhc3MiOiJy ZW1vdmVDbGFzcyJdKGIpO2Vsc2UoaD09PVF8fCJib29sZWFuIj09PWgpJiYodGhpcy5jbGFzc05h bWUmJmQuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xh c3NOYW1lPXRoaXMuY2xhc3NOYW1lfHwhMT09PWE/IiI6ZC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFt ZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXthPSIgIithKyIgIjtmb3IodmFyIGM9 MCwNCmQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmMDw9KCIg Iit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoSmEsIiAiKS5pbmRleE9mKGEpKXJldHVy biEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oYSl7dmFyIGMsaCxiLGY9dGhpc1swXTtpZihhcmd1 bWVudHMubGVuZ3RoKXJldHVybiBiPWQuaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24o Yyl7dmFyIGYsZz1kKHRoaXMpOzE9PT10aGlzLm5vZGVUeXBlJiYoZj1iP2EuY2FsbCh0aGlzLGMs Zy52YWwoKSk6YSxudWxsPT1mP2Y9IiI6Im51bWJlciI9PXR5cGVvZiBmP2YrPSIiOmQuaXNBcnJh eShmKSYmKGY9ZC5tYXAoZixmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjphKyIifSkpLGg9 ZC52YWxIb29rc1t0aGlzLnR5cGVdfHxkLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNh c2UoKV0saCYmInNldCJpbiBoJiZoLnNldCh0aGlzLGYsInZhbHVlIikhPT1lfHwodGhpcy52YWx1 ZT0NCmYpKX0pO2lmKGYpcmV0dXJuIGg9ZC52YWxIb29rc1tmLnR5cGVdfHxkLnZhbEhvb2tzW2Yu bm9kZU5hbWUudG9Mb3dlckNhc2UoKV0saCYmImdldCJpbiBoJiYoYz1oLmdldChmLCJ2YWx1ZSIp KSE9PWU/YzooYz1mLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UoaGMsIiIpOm51 bGw9PWM/IiI6Yyl9fSk7ZC5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihh KXt2YXIgYz1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWN8fGMuc3BlY2lmaWVkP2EudmFsdWU6 YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjLGg9YS5vcHRpb25zLGU9 YS5zZWxlY3RlZEluZGV4LGI9InNlbGVjdC1vbmUiPT09YS50eXBlfHwwPmUsZj1iP251bGw6W10s Zz1iP2UrMTpoLmxlbmd0aCx2PTA+ZT9nOmI/ZTowO2c+djt2KyspaWYoYz1oW3ZdLCEoIWMuc2Vs ZWN0ZWQmJnYhPT1lfHwoZC5zdXBwb3J0Lm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PQ0K Yy5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpfHxjLnBhcmVudE5vZGUuZGlzYWJsZWQmJmQubm9k ZU5hbWUoYy5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoYT1kKGMpLnZhbCgpLGIpcmV0dXJu IGE7Zi5wdXNoKGEpfXJldHVybiBmfSxzZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgaD1kLm1ha2VBcnJh eShjKTtyZXR1cm4gZChhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxl Y3RlZD0wPD1kLmluQXJyYXkoZCh0aGlzKS52YWwoKSxoKX0pLGgubGVuZ3RofHwoYS5zZWxlY3Rl ZEluZGV4PS0xKSxofX19LGF0dHI6ZnVuY3Rpb24oYSxjLGgpe3ZhciBiLGYsZyxsPWEubm9kZVR5 cGU7aWYoYSYmMyE9PWwmJjghPT1sJiYyIT09bClyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRl PT09UT9kLnByb3AoYSxjLGgpOihmPTEhPT1sfHwhZC5pc1hNTERvYyhhKSxmJiYoYz1jLnRvTG93 ZXJDYXNlKCksYj1kLmF0dHJIb29rc1tjXXx8KHNiLnRlc3QoYyk/cmI6amEpKSwNCmg9PT1lP2Im JmYmJiJnZXQiaW4gYiYmbnVsbCE9PShnPWIuZ2V0KGEsYykpP2c6KHR5cGVvZiBhLmdldEF0dHJp YnV0ZSE9PVEmJihnPWEuZ2V0QXR0cmlidXRlKGMpKSxudWxsPT1nP2U6Zyk6bnVsbCE9PWg/YiYm ZiYmInNldCJpbiBiJiYoZz1iLnNldChhLGgsYykpIT09ZT9nOihhLnNldEF0dHJpYnV0ZShjLGgr IiIpLGgpOihkLnJlbW92ZUF0dHIoYSxjKSxlKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxjKXt2 YXIgaCxlLGI9MCxmPWMmJmMubWF0Y2goUyk7aWYoZiYmMT09PWEubm9kZVR5cGUpZm9yKDtoPWZb YisrXTspZT1kLnByb3BGaXhbaF18fGgsc2IudGVzdChoKT8hVSYmS2EudGVzdChoKT9hW2QuY2Ft ZWxDYXNlKCJkZWZhdWx0LSIraCldPWFbZV09ITE6YVtlXT0hMTpkLmF0dHIoYSxoLCIiKSxhLnJl bW92ZUF0dHJpYnV0ZShVP2g6ZSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYyl7 aWYoIWQuc3VwcG9ydC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09YyYmDQpkLm5vZGVOYW1lKGEsImlu cHV0Iikpe3ZhciBoPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixjKSxoJiYo YS52YWx1ZT1oKSxjfX19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJy ZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJt YXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRk aW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIs ZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJs ZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGgpe3ZhciBiLGYsZyxsPWEubm9kZVR5cGU7aWYoYSYmMyE9 PWwmJjghPT1sJiYyIT09bClyZXR1cm4gZz0xIT09bHx8IWQuaXNYTUxEb2MoYSksZyYmKGM9ZC5w cm9wRml4W2NdfHxjLGY9ZC5wcm9wSG9va3NbY10pLA0KaCE9PWU/ZiYmInNldCJpbiBmJiYoYj1m LnNldChhLGgsYykpIT09ZT9iOmFbY109aDpmJiYiZ2V0ImluIGYmJm51bGwhPT0oYj1mLmdldChh LGMpKT9iOmFbY119LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYz1h LmdldEF0dHJpYnV0ZU5vZGUoInRhYmluZGV4Iik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP3BhcnNl SW50KGMudmFsdWUsMTApOmljLnRlc3QoYS5ub2RlTmFtZSl8fGpjLnRlc3QoYS5ub2RlTmFtZSkm JmEuaHJlZj8wOmV9fX19KTtyYj17Z2V0OmZ1bmN0aW9uKGEsYyl7dmFyIGg9ZC5wcm9wKGEsYyks Yj0iYm9vbGVhbiI9PXR5cGVvZiBoJiZhLmdldEF0dHJpYnV0ZShjKTtyZXR1cm4oaD0iYm9vbGVh biI9PXR5cGVvZiBoP0xhJiZVP251bGwhPWI6S2EudGVzdChjKT9hW2QuY2FtZWxDYXNlKCJkZWZh dWx0LSIrYyldOiEhYjphLmdldEF0dHJpYnV0ZU5vZGUoYykpJiYhMSE9PWgudmFsdWU/Yy50b0xv d2VyQ2FzZSgpOmV9LHNldDpmdW5jdGlvbihhLA0KYyxoKXtyZXR1cm4hMT09PWM/ZC5yZW1vdmVB dHRyKGEsaCk6TGEmJlV8fCFLYS50ZXN0KGgpP2Euc2V0QXR0cmlidXRlKCFVJiZkLnByb3BGaXhb aF18fGgsaCk6YVtkLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2gpXT1hW2hdPSEwLGh9fTtMYSYmVXx8 KGQuYXR0ckhvb2tzLnZhbHVlPXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgaD1hLmdldEF0dHJpYnV0 ZU5vZGUoYyk7cmV0dXJuIGQubm9kZU5hbWUoYSwiaW5wdXQiKT9hLmRlZmF1bHRWYWx1ZTpoJiZo LnNwZWNpZmllZD9oLnZhbHVlOmV9LHNldDpmdW5jdGlvbihhLGMsaCl7cmV0dXJuIGQubm9kZU5h bWUoYSwiaW5wdXQiKT8oYS5kZWZhdWx0VmFsdWU9YyxlKTpqYSYmamEuc2V0KGEsYyxoKX19KTtV fHwoamE9ZC52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkPWEuZ2V0QXR0 cmlidXRlTm9kZShjKTtyZXR1cm4gZCYmKCJpZCI9PT1jfHwibmFtZSI9PT1jfHwiY29vcmRzIj09 PWM/IiIhPT1kLnZhbHVlOmQuc3BlY2lmaWVkKT8NCmQudmFsdWU6ZX0sc2V0OmZ1bmN0aW9uKGEs YyxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZU5vZGUoZCk7cmV0dXJuIGJ8fGEuc2V0QXR0cmlidXRl Tm9kZShiPWEub3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoZCkpLGIudmFsdWU9Yys9IiIs InZhbHVlIj09PWR8fGM9PT1hLmdldEF0dHJpYnV0ZShkKT9jOmV9fSxkLmF0dHJIb29rcy5jb250 ZW50ZWRpdGFibGU9e2dldDpqYS5nZXQsc2V0OmZ1bmN0aW9uKGEsYyxkKXtqYS5zZXQoYSwiIj09 PWM/ITE6YyxkKX19LGQuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxjKXtkLmF0 dHJIb29rc1tjXT1kLmV4dGVuZChkLmF0dHJIb29rc1tjXSx7c2V0OmZ1bmN0aW9uKGEsZCl7cmV0 dXJuIiI9PT1kPyhhLnNldEF0dHJpYnV0ZShjLCJhdXRvIiksZCk6ZX19KX0pKTtkLnN1cHBvcnQu aHJlZk5vcm1hbGl6ZWR8fChkLmVhY2goWyJocmVmIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiXSxm dW5jdGlvbihhLGMpe2QuYXR0ckhvb2tzW2NdPQ0KZC5leHRlbmQoZC5hdHRySG9va3NbY10se2dl dDpmdW5jdGlvbihhKXthPWEuZ2V0QXR0cmlidXRlKGMsMik7cmV0dXJuIG51bGw9PWE/ZTphfX0p fSksZC5lYWNoKFsiaHJlZiIsInNyYyJdLGZ1bmN0aW9uKGEsYyl7ZC5wcm9wSG9va3NbY109e2dl dDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYyw0KX19fSkpO2Quc3VwcG9ydC5z dHlsZXx8KGQuYXR0ckhvb2tzLnN0eWxlPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3R5bGUu Y3NzVGV4dHx8ZX0sc2V0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1jKyIi fX0pO2Quc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGQucHJvcEhvb2tzLnNlbGVjdGVkPWQuZXh0ZW5k KGQucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7YT1hLnBhcmVudE5vZGU7cmV0 dXJuIGEmJihhLnNlbGVjdGVkSW5kZXgsYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0 ZWRJbmRleCksbnVsbH19KSk7DQpkLnN1cHBvcnQuZW5jdHlwZXx8KGQucHJvcEZpeC5lbmN0eXBl PSJlbmNvZGluZyIpO2Quc3VwcG9ydC5jaGVja09ufHxkLmVhY2goWyJyYWRpbyIsImNoZWNrYm94 Il0sZnVuY3Rpb24oKXtkLnZhbEhvb2tzW3RoaXNdPXtnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51 bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9fX0pO2QuZWFjaChbInJh ZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2QudmFsSG9va3NbdGhpc109ZC5leHRlbmQoZC52 YWxIb29rc1t0aGlzXSx7c2V0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGQuaXNBcnJheShjKT9hLmNo ZWNrZWQ9MDw9ZC5pbkFycmF5KGQoYSkudmFsKCksYyk6ZX19KX0pO3ZhciBNYT0vXig/OmlucHV0 fHNlbGVjdHx0ZXh0YXJlYSkkL2ksa2M9L15rZXkvLGxjPS9eKD86bW91c2V8Y29udGV4dG1lbnUp fGNsaWNrLyx0Yj0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sdWI9L14oW14uXSop KD86XC4oLispfCkkLzsNCmQuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oYSxjLGgsYixm KXt2YXIgZyxsLHYsayxtLHIscCxuLHQ7aWYodj1kLl9kYXRhKGEpKXtoLmhhbmRsZXImJihrPWgs aD1rLmhhbmRsZXIsZj1rLnNlbGVjdG9yKTtoLmd1aWR8fChoLmd1aWQ9ZC5ndWlkKyspOyhsPXYu ZXZlbnRzKXx8KGw9di5ldmVudHM9e30pOyhtPXYuaGFuZGxlKXx8KG09di5oYW5kbGU9ZnVuY3Rp b24oYSl7cmV0dXJuIHR5cGVvZiBkPT09UXx8YSYmZC5ldmVudC50cmlnZ2VyZWQ9PT1hLnR5cGU/ ZTpkLmV2ZW50LmRpc3BhdGNoLmFwcGx5KG0uZWxlbSxhcmd1bWVudHMpfSxtLmVsZW09YSk7Yz0o Y3x8IiIpLm1hdGNoKFMpfHxbIiJdO2Zvcih2PWMubGVuZ3RoO3YtLTspZz11Yi5leGVjKGNbdl0p fHxbXSxuPXI9Z1sxXSx0PShnWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZz1kLmV2ZW50LnNw ZWNpYWxbbl18fHt9LG49KGY/Zy5kZWxlZ2F0ZVR5cGU6Zy5iaW5kVHlwZSl8fG4sZz1kLmV2ZW50 LnNwZWNpYWxbbl18fA0Ke30scj1kLmV4dGVuZCh7dHlwZTpuLG9yaWdUeXBlOnIsZGF0YTpiLGhh bmRsZXI6aCxndWlkOmguZ3VpZCxzZWxlY3RvcjpmLG5lZWRzQ29udGV4dDpmJiZkLmV4cHIubWF0 Y2gubmVlZHNDb250ZXh0LnRlc3QoZiksbmFtZXNwYWNlOnQuam9pbigiLiIpfSxrKSwocD1sW25d KXx8KHA9bFtuXT1bXSxwLmRlbGVnYXRlQ291bnQ9MCxnLnNldHVwJiYhMSE9PWcuc2V0dXAuY2Fs bChhLGIsdCxtKXx8KGEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobixtLCEx KTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbixtKSkpLGcuYWRkJiYoZy5hZGQu Y2FsbChhLHIpLHIuaGFuZGxlci5ndWlkfHwoci5oYW5kbGVyLmd1aWQ9aC5ndWlkKSksZj9wLnNw bGljZShwLmRlbGVnYXRlQ291bnQrKywwLHIpOnAucHVzaChyKSxkLmV2ZW50Lmdsb2JhbFtuXT0h MDthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxjLGgsZSxiKXt2YXIgZixnLHYsayxtLHIscCxu LHQsDQp3LFAseD1kLmhhc0RhdGEoYSkmJmQuX2RhdGEoYSk7aWYoeCYmKHI9eC5ldmVudHMpKXtj PShjfHwiIikubWF0Y2goUyl8fFsiIl07Zm9yKG09Yy5sZW5ndGg7bS0tOylpZih2PXViLmV4ZWMo Y1ttXSl8fFtdLHQ9UD12WzFdLHc9KHZbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSx0KXtwPWQu ZXZlbnQuc3BlY2lhbFt0XXx8e307dD0oZT9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8dDtu PXJbdF18fFtdO3Y9dlsyXSYmUmVnRXhwKCIoXnxcXC4pIit3LmpvaW4oIlxcLig/Oi4qXFwufCki KSsiKFxcLnwkKSIpO2ZvcihrPWY9bi5sZW5ndGg7Zi0tOylnPW5bZl0sIWImJlAhPT1nLm9yaWdU eXBlfHxoJiZoLmd1aWQhPT1nLmd1aWR8fHYmJiF2LnRlc3QoZy5uYW1lc3BhY2UpfHxlJiZlIT09 Zy5zZWxlY3RvciYmKCIqKiIhPT1lfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2Vs ZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGEsDQpnKSk7 ayYmIW4ubGVuZ3RoJiYocC50ZWFyZG93biYmITEhPT1wLnRlYXJkb3duLmNhbGwoYSx3LHguaGFu ZGxlKXx8ZC5yZW1vdmVFdmVudChhLHQseC5oYW5kbGUpLGRlbGV0ZSByW3RdKX1lbHNlIGZvcih0 IGluIHIpZC5ldmVudC5yZW1vdmUoYSx0K2NbbV0saCxlLCEwKTtkLmlzRW1wdHlPYmplY3Qocikm JihkZWxldGUgeC5oYW5kbGUsZC5fcmVtb3ZlRGF0YShhLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1 bmN0aW9uKGEsYyxoLGYpe3ZhciBnLHUsbCx2LGssbSxyPVtofHx0XSxwPW9hLmNhbGwoYSwidHlw ZSIpP2EudHlwZTphO209b2EuY2FsbChhLCJuYW1lc3BhY2UiKT9hLm5hbWVzcGFjZS5zcGxpdCgi LiIpOltdO2lmKGw9Zz1oPWh8fHQsMyE9PWgubm9kZVR5cGUmJjghPT1oLm5vZGVUeXBlJiYhdGIu dGVzdChwK2QuZXZlbnQudHJpZ2dlcmVkKSYmKDA8PXAuaW5kZXhPZigiLiIpJiYobT1wLnNwbGl0 KCIuIikscD1tLnNoaWZ0KCksbS5zb3J0KCkpLHU9MD5wLmluZGV4T2YoIjoiKSYmDQoib24iK3As YT1hW2QuZXhwYW5kb10/YTpuZXcgZC5FdmVudChwLCJvYmplY3QiPT10eXBlb2YgYSYmYSksYS5p c1RyaWdnZXI9ITAsYS5uYW1lc3BhY2U9bS5qb2luKCIuIiksYS5uYW1lc3BhY2VfcmU9YS5uYW1l c3BhY2U/UmVnRXhwKCIoXnxcXC4pIittLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIp Om51bGwsYS5yZXN1bHQ9ZSxhLnRhcmdldHx8KGEudGFyZ2V0PWgpLGM9bnVsbD09Yz9bYV06ZC5t YWtlQXJyYXkoYyxbYV0pLGs9ZC5ldmVudC5zcGVjaWFsW3BdfHx7fSxmfHwhay50cmlnZ2VyfHwh MSE9PWsudHJpZ2dlci5hcHBseShoLGMpKSl7aWYoIWYmJiFrLm5vQnViYmxlJiYhZC5pc1dpbmRv dyhoKSl7dj1rLmRlbGVnYXRlVHlwZXx8cDtmb3IodGIudGVzdCh2K3ApfHwobD1sLnBhcmVudE5v ZGUpO2w7bD1sLnBhcmVudE5vZGUpci5wdXNoKGwpLGc9bDtnPT09KGgub3duZXJEb2N1bWVudHx8 dCkmJnIucHVzaChnLmRlZmF1bHRWaWV3fHxnLnBhcmVudFdpbmRvd3x8DQpiKX1mb3IobT0wOyhs PXJbbSsrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWEudHlwZT0xPG0/djprLmJpbmRU eXBlfHxwLChnPShkLl9kYXRhKGwsImV2ZW50cyIpfHx7fSlbYS50eXBlXSYmZC5fZGF0YShsLCJo YW5kbGUiKSkmJmcuYXBwbHkobCxjKSwoZz11JiZsW3VdKSYmZC5hY2NlcHREYXRhKGwpJiZnLmFw cGx5JiYhMT09PWcuYXBwbHkobCxjKSYmYS5wcmV2ZW50RGVmYXVsdCgpO2lmKGEudHlwZT1wLCEo Znx8YS5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8ay5fZGVmYXVsdCYmITEhPT1rLl9kZWZhdWx0LmFw cGx5KGgub3duZXJEb2N1bWVudCxjKXx8ImNsaWNrIj09PXAmJmQubm9kZU5hbWUoaCwiYSIpfHwh ZC5hY2NlcHREYXRhKGgpfHwhdXx8IWhbcF18fGQuaXNXaW5kb3coaCkpKXsoZz1oW3VdKSYmKGhb dV09bnVsbCk7ZC5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7aFtwXSgpfWNhdGNoKG4pe31kLmV2ZW50 LnRyaWdnZXJlZD1lO2cmJihoW3VdPWcpfXJldHVybiBhLnJlc3VsdH19LA0KZGlzcGF0Y2g6ZnVu Y3Rpb24oYSl7YT1kLmV2ZW50LmZpeChhKTt2YXIgYyxoLGIsZixnLGw9W10sdj1ZLmNhbGwoYXJn dW1lbnRzKTtjPShkLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W107dmFyIGs9 ZC5ldmVudC5zcGVjaWFsW2EudHlwZV18fHt9O2lmKHZbMF09YSxhLmRlbGVnYXRlVGFyZ2V0PXRo aXMsIWsucHJlRGlzcGF0Y2h8fCExIT09ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkpe2w9ZC5l dmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYSxjKTtmb3IoYz0wOyhmPWxbYysrXSkmJiFhLmlzUHJv cGFnYXRpb25TdG9wcGVkKCk7KXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtO2ZvcihnPTA7KGI9Zi5o YW5kbGVyc1tnKytdKSYmIWEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTspKCFhLm5h bWVzcGFjZV9yZXx8YS5uYW1lc3BhY2VfcmUudGVzdChiLm5hbWVzcGFjZSkpJiYoYS5oYW5kbGVP Ymo9YixhLmRhdGE9Yi5kYXRhLGg9KChkLmV2ZW50LnNwZWNpYWxbYi5vcmlnVHlwZV18fA0Ke30p LmhhbmRsZXx8Yi5oYW5kbGVyKS5hcHBseShmLmVsZW0sdiksaCE9PWUmJiExPT09KGEucmVzdWx0 PWgpJiYoYS5wcmV2ZW50RGVmYXVsdCgpLGEuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gay5w b3N0RGlzcGF0Y2gmJmsucG9zdERpc3BhdGNoLmNhbGwodGhpcyxhKSxhLnJlc3VsdH19LGhhbmRs ZXJzOmZ1bmN0aW9uKGEsYyl7dmFyIGgsYixmLGcsbD1bXSxrPWMuZGVsZWdhdGVDb3VudCxtPWEu dGFyZ2V0O2lmKGsmJm0ubm9kZVR5cGUmJighYS5idXR0b258fCJjbGljayIhPT1hLnR5cGUpKWZv cig7bSE9dGhpczttPW0ucGFyZW50Tm9kZXx8dGhpcylpZigxPT09bS5ub2RlVHlwZSYmKCEwIT09 bS5kaXNhYmxlZHx8ImNsaWNrIiE9PWEudHlwZSkpe2Y9W107Zm9yKGc9MDtrPmc7ZysrKWI9Y1tn XSxoPWIuc2VsZWN0b3IrIiAiLGZbaF09PT1lJiYoZltoXT1iLm5lZWRzQ29udGV4dD8wPD1kKGgs dGhpcykuaW5kZXgobSk6ZC5maW5kKGgsdGhpcyxudWxsLFttXSkubGVuZ3RoKSwNCmZbaF0mJmYu cHVzaChiKTtmLmxlbmd0aCYmbC5wdXNoKHtlbGVtOm0saGFuZGxlcnM6Zn0pfXJldHVybiBjLmxl bmd0aD5rJiZsLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpjLnNsaWNlKGspfSksbH0sZml4OmZ1 bmN0aW9uKGEpe2lmKGFbZC5leHBhbmRvXSlyZXR1cm4gYTt2YXIgYyxlLGI7Yz1hLnR5cGU7dmFy IGY9YSxnPXRoaXMuZml4SG9va3NbY107Z3x8KHRoaXMuZml4SG9va3NbY109Zz1sYy50ZXN0KGMp P3RoaXMubW91c2VIb29rczprYy50ZXN0KGMpP3RoaXMua2V5SG9va3M6e30pO2I9Zy5wcm9wcz90 aGlzLnByb3BzLmNvbmNhdChnLnByb3BzKTp0aGlzLnByb3BzO2E9bmV3IGQuRXZlbnQoZik7Zm9y KGM9Yi5sZW5ndGg7Yy0tOyllPWJbY10sYVtlXT1mW2VdO3JldHVybiBhLnRhcmdldHx8KGEudGFy Z2V0PWYuc3JjRWxlbWVudHx8dCksMz09PWEudGFyZ2V0Lm5vZGVUeXBlJiYoYS50YXJnZXQ9YS50 YXJnZXQucGFyZW50Tm9kZSksYS5tZXRhS2V5PSEhYS5tZXRhS2V5LA0KZy5maWx0ZXI/Zy5maWx0 ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJl bnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0 IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntw cm9wczpbImNoYXIiLCJjaGFyQ29kZSIsImtleSIsImtleUNvZGUiXSxmaWx0ZXI6ZnVuY3Rpb24o YSxjKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yy5jaGFyQ29kZT9jLmNo YXJDb2RlOmMua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBj bGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNj cmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYyl7 dmFyIGQsYixmLGc9Yy5idXR0b24sbD1jLmZyb21FbGVtZW50Ow0KcmV0dXJuIG51bGw9PWEucGFn ZVgmJm51bGwhPWMuY2xpZW50WCYmKGI9YS50YXJnZXQub3duZXJEb2N1bWVudHx8dCxmPWIuZG9j dW1lbnRFbGVtZW50LGQ9Yi5ib2R5LGEucGFnZVg9Yy5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8 fGQmJmQuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZCYmZC5jbGllbnRMZWZ0fHww KSxhLnBhZ2VZPWMuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGQmJmQuc2Nyb2xsVG9wfHwwKS0o ZiYmZi5jbGllbnRUb3B8fGQmJmQuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmbCYm KGEucmVsYXRlZFRhcmdldD1sPT09YS50YXJnZXQ/Yy50b0VsZW1lbnQ6bCksYS53aGljaHx8Zz09 PWV8fChhLndoaWNoPTEmZz8xOjImZz8zOjQmZz8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1 YmJsZTohMH0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gZC5ub2RlTmFtZSh0aGlz LCJpbnB1dCIpJiYiY2hlY2tib3giPT09dGhpcy50eXBlJiYNCnRoaXMuY2xpY2s/KHRoaXMuY2xp Y2soKSwhMSk6ZX19LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7aWYodGhpcyE9PXQuYWN0aXZl RWxlbWVudCYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9 fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJu IHRoaXM9PT10LmFjdGl2ZUVsZW1lbnQmJnRoaXMuYmx1cj8odGhpcy5ibHVyKCksITEpOmV9LGRl bGVnYXRlVHlwZToiZm9jdXNvdXQifSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlv bihhKXthLnJlc3VsdCE9PWUmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQp fX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYyxlLGIpe2E9ZC5leHRlbmQobmV3IGQuRXZlbnQsZSx7 dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtiP2QuZXZlbnQudHJpZ2dl cihhLG51bGwsYyk6ZC5ldmVudC5kaXNwYXRjaC5jYWxsKGMsDQphKTthLmlzRGVmYXVsdFByZXZl bnRlZCgpJiZlLnByZXZlbnREZWZhdWx0KCl9fTtkLnJlbW92ZUV2ZW50PXQucmVtb3ZlRXZlbnRM aXN0ZW5lcj9mdW5jdGlvbihhLGMsZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2 ZW50TGlzdGVuZXIoYyxkLCExKX06ZnVuY3Rpb24oYSxjLGQpe2M9Im9uIitjO2EuZGV0YWNoRXZl bnQmJih0eXBlb2YgYVtjXT09PVEmJihhW2NdPW51bGwpLGEuZGV0YWNoRXZlbnQoYyxkKSl9O2Qu RXZlbnQ9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGQuRXZlbnQ/KGEmJmEu dHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVs dFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fCExPT09YS5yZXR1cm5WYWx1ZXx8YS5nZXRQ cmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP3o6eCk6dGhpcy50eXBlPWEsYyYm ZC5leHRlbmQodGhpcyxjKSx0aGlzLnRpbWVTdGFtcD0NCmEmJmEudGltZVN0YW1wfHxkLm5vdygp LHRoaXNbZC5leHBhbmRvXT0hMCxlKTpuZXcgZC5FdmVudChhLGMpfTtkLkV2ZW50LnByb3RvdHlw ZT17aXNEZWZhdWx0UHJldmVudGVkOngsaXNQcm9wYWdhdGlvblN0b3BwZWQ6eCxpc0ltbWVkaWF0 ZVByb3BhZ2F0aW9uU3RvcHBlZDp4LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhp cy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXo7YSYmKGEucHJldmVudERl ZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRp b246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9u U3RvcHBlZD16O2EmJihhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNh bmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMu aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9DQp6O3RoaXMuc3RvcFByb3BhZ2F0aW9uKCl9 fTtkLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxm dW5jdGlvbihhLGMpe2QuZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmMsYmluZFR5cGU6 YyxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGUsYj1hLnJlbGF0ZWRUYXJnZXQsZj1hLmhhbmRsZU9i ajtyZXR1cm4oIWJ8fGIhPT10aGlzJiYhZC5jb250YWlucyh0aGlzLGIpKSYmKGEudHlwZT1mLm9y aWdUeXBlLGU9Zi5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9YyksZX19fSk7 ZC5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChkLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpm dW5jdGlvbigpe3JldHVybiBkLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTooZC5ldmVudC5hZGQo dGhpcywiY2xpY2suX3N1Ym1pdCBrZXlwcmVzcy5fc3VibWl0IixmdW5jdGlvbihhKXthPWEudGFy Z2V0OyhhPWQubm9kZU5hbWUoYSwNCiJpbnB1dCIpfHxkLm5vZGVOYW1lKGEsImJ1dHRvbiIpP2Eu Zm9ybTplKSYmIWQuX2RhdGEoYSwic3VibWl0QnViYmxlcyIpJiYoZC5ldmVudC5hZGQoYSwic3Vi bWl0Ll9zdWJtaXQiLGZ1bmN0aW9uKGEpe2EuX3N1Ym1pdF9idWJibGU9ITB9KSxkLl9kYXRhKGEs InN1Ym1pdEJ1YmJsZXMiLCEwKSl9KSxlKX0scG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EuX3N1 Ym1pdF9idWJibGUmJihkZWxldGUgYS5fc3VibWl0X2J1YmJsZSx0aGlzLnBhcmVudE5vZGUmJiFh LmlzVHJpZ2dlciYmZC5ldmVudC5zaW11bGF0ZSgic3VibWl0Iix0aGlzLnBhcmVudE5vZGUsYSwh MCkpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBkLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8h MTooZC5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKSxlKX19KTtkLnN1cHBvcnQuY2hhbmdl QnViYmxlc3x8KGQuZXZlbnQuc3BlY2lhbC5jaGFuZ2U9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJu IE1hLnRlc3QodGhpcy5ub2RlTmFtZSk/DQooKCJjaGVja2JveCI9PT10aGlzLnR5cGV8fCJyYWRp byI9PT10aGlzLnR5cGUpJiYoZC5ldmVudC5hZGQodGhpcywicHJvcGVydHljaGFuZ2UuX2NoYW5n ZSIsZnVuY3Rpb24oYSl7ImNoZWNrZWQiPT09YS5vcmlnaW5hbEV2ZW50LnByb3BlcnR5TmFtZSYm KHRoaXMuX2p1c3RfY2hhbmdlZD0hMCl9KSxkLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fY2hhbmdl IixmdW5jdGlvbihhKXt0aGlzLl9qdXN0X2NoYW5nZWQmJiFhLmlzVHJpZ2dlciYmKHRoaXMuX2p1 c3RfY2hhbmdlZD0hMSk7ZC5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLGEsITApfSkpLCEx KTooZC5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7 YT1hLnRhcmdldDtNYS50ZXN0KGEubm9kZU5hbWUpJiYhZC5fZGF0YShhLCJjaGFuZ2VCdWJibGVz IikmJihkLmV2ZW50LmFkZChhLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7IXRoaXMucGFy ZW50Tm9kZXx8YS5pc1NpbXVsYXRlZHx8DQphLmlzVHJpZ2dlcnx8ZC5ldmVudC5zaW11bGF0ZSgi Y2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxkLl9kYXRhKGEsImNoYW5nZUJ1YmJsZXMi LCEwKSl9KSxlKX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0O3JldHVybiB0aGlz IT09Y3x8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1jLnR5cGUmJiJjaGVj a2JveCIhPT1jLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6 ZX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4gZC5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFu Z2UiKSwhTWEudGVzdCh0aGlzLm5vZGVOYW1lKX19KTtkLnN1cHBvcnQuZm9jdXNpbkJ1YmJsZXN8 fGQuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oYSxjKXt2 YXIgZT0wLGI9ZnVuY3Rpb24oYSl7ZC5ldmVudC5zaW11bGF0ZShjLGEudGFyZ2V0LGQuZXZlbnQu Zml4KGEpLCEwKX07ZC5ldmVudC5zcGVjaWFsW2NdPQ0Ke3NldHVwOmZ1bmN0aW9uKCl7MD09PWUr KyYmdC5hZGRFdmVudExpc3RlbmVyKGEsYiwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7MD09PS0t ZSYmdC5yZW1vdmVFdmVudExpc3RlbmVyKGEsYiwhMCl9fX0pO2QuZm4uZXh0ZW5kKHtvbjpmdW5j dGlvbihhLGMsYixmLGcpe3ZhciB1LGw7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9 dHlwZW9mIGMmJihiPWJ8fGMsYz1lKTtmb3IodSBpbiBhKXRoaXMub24odSxjLGIsYVt1XSxnKTty ZXR1cm4gdGhpc31pZihudWxsPT1iJiZudWxsPT1mPyhmPWMsYj1jPWUpOm51bGw9PWYmJigic3Ry aW5nIj09dHlwZW9mIGM/KGY9YixiPWUpOihmPWIsYj1jLGM9ZSkpLCExPT09ZilmPXg7ZWxzZSBp ZighZilyZXR1cm4gdGhpcztyZXR1cm4gMT09PWcmJihsPWYsZj1mdW5jdGlvbihhKXtyZXR1cm4g ZCgpLm9mZihhKSxsLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZi5ndWlkPWwuZ3VpZHx8KGwuZ3Vp ZD1kLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe2QuZXZlbnQuYWRkKHRoaXMsDQphLGYs YixjKX0pfSxvbmU6ZnVuY3Rpb24oYSxjLGQsYil7cmV0dXJuIHRoaXMub24oYSxjLGQsYiwxKX0s b2ZmOmZ1bmN0aW9uKGEsYyxiKXt2YXIgZixnO2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFu ZGxlT2JqKXJldHVybiBmPWEuaGFuZGxlT2JqLGQoYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGYubmFt ZXNwYWNlP2Yub3JpZ1R5cGUrIi4iK2YubmFtZXNwYWNlOmYub3JpZ1R5cGUsZi5zZWxlY3Rvcixm LmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXtmb3IoZyBpbiBhKXRoaXMub2Zm KGcsYyxhW2ddKTtyZXR1cm4gdGhpc31yZXR1cm4oITE9PT1jfHwiZnVuY3Rpb24iPT10eXBlb2Yg YykmJihiPWMsYz1lKSwhMT09PWImJihiPXgpLHRoaXMuZWFjaChmdW5jdGlvbigpe2QuZXZlbnQu cmVtb3ZlKHRoaXMsYSxiLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLm9u KGEsbnVsbCxjLGQpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5vZmYoYSwNCm51 bGwsYyl9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYyxkLGIpe3JldHVybiB0aGlzLm9uKGMsYSxkLGIp fSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihjLGF8fCIqKiIsZCl9LHRyaWdnZXI6ZnVuY3Rpb24o YSxjKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZC5ldmVudC50cmlnZ2VyKGEsYyx0aGlz KX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGMpe3ZhciBiPXRoaXNbMF07cmV0dXJuIGI/ ZC5ldmVudC50cmlnZ2VyKGEsYyxiLCEwKTplfX0pOyhmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGIo YSl7cmV0dXJuIG1hLnRlc3QoYSsiIil9ZnVuY3Rpb24gZSgpe3ZhciBhLGM9W107cmV0dXJuIGE9 ZnVuY3Rpb24oZCxiKXtyZXR1cm4gYy5wdXNoKGQrPSIgIik+eS5jYWNoZUxlbmd0aCYmZGVsZXRl IGFbYy5zaGlmdCgpXSxhW2RdPWJ9fWZ1bmN0aW9uIGYoYSl7cmV0dXJuIGFbRV09DQohMCxhfWZ1 bmN0aW9uIGcoYSl7dmFyIGM9Ty5jcmVhdGVFbGVtZW50KCJkaXYiKTt0cnl7cmV0dXJuIGEoYyl9 Y2F0Y2goZCl7cmV0dXJuITF9ZmluYWxseXt9fWZ1bmN0aW9uIGwoYSxjLGQsYil7dmFyIGUsaCxm LGcsbDtpZigoYz9jLm93bmVyRG9jdW1lbnR8fGM6SikhPT1PJiZzYShjKSxjPWN8fE8sZD1kfHxb XSwhYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBkO2lmKDEhPT0oZz1jLm5vZGVUeXBlKSYm OSE9PWcpcmV0dXJuW107aWYoIVomJiFiKXtpZihlPW5hLmV4ZWMoYSkpaWYoZj1lWzFdKWlmKDk9 PT1nKXtpZihoPWMuZ2V0RWxlbWVudEJ5SWQoZiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7 aWYoaC5pZD09PWYpcmV0dXJuIGQucHVzaChoKSxkfWVsc2V7aWYoYy5vd25lckRvY3VtZW50JiYo aD1jLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZikpJiZ2YShjLGgpJiZoLmlkPT09Zily ZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihlWzJdKXJldHVybiBOLmFwcGx5KGQsDQpLLmNhbGwo Yy5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSwwKSksZDtpZigoZj1lWzNdKSYmSC5nZXRCeUNsYXNz TmFtZSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBOLmFwcGx5KGQsSy5jYWxsKGMu Z2V0RWxlbWVudHNCeUNsYXNzTmFtZShmKSwwKSksZH1pZihILnFzYSYmIWNhLnRlc3QoYSkpe2lm KGU9ITAsaD1FLGY9YyxsPTk9PT1nJiZhLDE9PT1nJiYib2JqZWN0IiE9PWMubm9kZU5hbWUudG9M b3dlckNhc2UoKSl7Zz1wKGEpOyhlPWMuZ2V0QXR0cmlidXRlKCJpZCIpKT9oPWUucmVwbGFjZShx YSwiXFwkXHgyNiIpOmMuc2V0QXR0cmlidXRlKCJpZCIsaCk7aD0iW2lkXHgzZCciK2grIiddICI7 Zm9yKGY9Zy5sZW5ndGg7Zi0tOylnW2ZdPWgrdChnW2ZdKTtmPWVhLnRlc3QoYSkmJmMucGFyZW50 Tm9kZXx8YztsPWcuam9pbigiLCIpfWlmKGwpdHJ5e3JldHVybiBOLmFwcGx5KGQsSy5jYWxsKGYu cXVlcnlTZWxlY3RvckFsbChsKSwwKSksZH1jYXRjaChzKXt9ZmluYWxseXtlfHwNCmMucmVtb3Zl QXR0cmlidXRlKCJpZCIpfX19dmFyIHE7YTp7YT1hLnJlcGxhY2UoVSwiJDEiKTt2YXIgdSxrO2g9 cChhKTtpZighYiYmMT09PWgubGVuZ3RoKXtpZihxPWhbMF09aFswXS5zbGljZSgwKSwyPHEubGVu Z3RoJiYiSUQiPT09KHU9cVswXSkudHlwZSYmOT09PWMubm9kZVR5cGUmJiFaJiZ5LnJlbGF0aXZl W3FbMV0udHlwZV0pe2lmKGM9eS5maW5kLklEKHUubWF0Y2hlc1swXS5yZXBsYWNlKGthLGxhKSxj KVswXSwhYyl7cT1kO2JyZWFrIGF9YT1hLnNsaWNlKHEuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWZv cihnPWFhLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6cS5sZW5ndGg7Zy0tJiYhKHU9cVtnXSx5LnJl bGF0aXZlW2U9dS50eXBlXSk7KWlmKChrPXkuZmluZFtlXSkmJihiPWsodS5tYXRjaGVzWzBdLnJl cGxhY2Uoa2EsbGEpLGVhLnRlc3QocVswXS50eXBlKSYmYy5wYXJlbnROb2RlfHxjKSkpe2lmKHEu c3BsaWNlKGcsMSksYT1iLmxlbmd0aCYmdChxKSwhYSl7cT0oTi5hcHBseShkLA0KSy5jYWxsKGIs MCkpLGQpO2JyZWFrIGF9YnJlYWt9fXE9KE5hKGEsaCkoYixjLFosZCxlYS50ZXN0KGEpKSxkKX1y ZXR1cm4gcX1mdW5jdGlvbiBrKGEsYyl7dmFyIGQ9YyYmYSxiPWQmJih+Yy5zb3VyY2VJbmRleHx8 ViktKH5hLnNvdXJjZUluZGV4fHxWKTtpZihiKXJldHVybiBiO2lmKGQpZm9yKDtkPWQubmV4dFNp Ymxpbmc7KWlmKGQ9PT1jKXJldHVybi0xO3JldHVybiBhPzE6LTF9ZnVuY3Rpb24gbShhKXtyZXR1 cm4gZnVuY3Rpb24oYyl7cmV0dXJuImlucHV0Ij09PWMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYm Yy50eXBlPT09YX19ZnVuY3Rpb24gbihhKXtyZXR1cm4gZnVuY3Rpb24oYyl7dmFyIGQ9Yy5ub2Rl TmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09ZHx8ImJ1dHRvbiI9PT1kKSYmYy50 eXBlPT09YX19ZnVuY3Rpb24gcihhKXtyZXR1cm4gZihmdW5jdGlvbihjKXtyZXR1cm4gYz0rYyxm KGZ1bmN0aW9uKGQsYil7Zm9yKHZhciBlLGg9YShbXSxkLmxlbmd0aCwNCmMpLGY9aC5sZW5ndGg7 Zi0tOylkW2U9aFtmXV0mJihkW2VdPSEoYltlXT1kW2VdKSl9KX0pfWZ1bmN0aW9uIHAoYSxjKXt2 YXIgZCxiLGUsaCxmLGcscztpZihmPVNbYSsiICJdKXJldHVybiBjPzA6Zi5zbGljZSgwKTtmPWE7 Zz1bXTtmb3Iocz15LnByZUZpbHRlcjtmOyl7KCFkfHwoYj1nYS5leGVjKGYpKSkmJihiJiYoZj1m LnNsaWNlKGJbMF0ubGVuZ3RoKXx8ZiksZy5wdXNoKGU9W10pKTtkPSExOyhiPWhhLmV4ZWMoZikp JiYoZD1iLnNoaWZ0KCksZS5wdXNoKHt2YWx1ZTpkLHR5cGU6YlswXS5yZXBsYWNlKFUsIiAiKX0p LGY9Zi5zbGljZShkLmxlbmd0aCkpO2ZvcihoIGluIHkuZmlsdGVyKSEoYj1hYVtoXS5leGVjKGYp KXx8c1toXSYmIShiPXNbaF0oYikpfHwoZD1iLnNoaWZ0KCksZS5wdXNoKHt2YWx1ZTpkLHR5cGU6 aCxtYXRjaGVzOmJ9KSxmPWYuc2xpY2UoZC5sZW5ndGgpKTtpZighZClicmVha31yZXR1cm4gYz9m Lmxlbmd0aDpmP2wuZXJyb3IoYSk6UyhhLGcpLnNsaWNlKDApfQ0KZnVuY3Rpb24gdChhKXtmb3Io dmFyIGM9MCxkPWEubGVuZ3RoLGI9IiI7ZD5jO2MrKyliKz1hW2NdLnZhbHVlO3JldHVybiBifWZ1 bmN0aW9uIHcoYSxjLGQpe3ZhciBiPWMuZGlyLGU9ZCYmInBhcmVudE5vZGUiPT09YixoPW1jKys7 cmV0dXJuIGMuZmlyc3Q/ZnVuY3Rpb24oYyxkLGgpe2Zvcig7Yz1jW2JdOylpZigxPT09Yy5ub2Rl VHlwZXx8ZSlyZXR1cm4gYShjLGQsaCl9OmZ1bmN0aW9uKGMsZCxmKXt2YXIgZyxsLHMscT1JKyIg IitoO2lmKGYpZm9yKDtjPWNbYl07KXtpZigoMT09PWMubm9kZVR5cGV8fGUpJiZhKGMsZCxmKSly ZXR1cm4hMH1lbHNlIGZvcig7Yz1jW2JdOylpZigxPT09Yy5ub2RlVHlwZXx8ZSlpZihzPWNbRV18 fChjW0VdPXt9KSwobD1zW2JdKSYmbFswXT09PXEpe2lmKCEwPT09KGc9bFsxXSl8fGc9PT1BKXJl dHVybiEwPT09Z31lbHNlIGlmKGw9c1tiXT1bcV0sbFsxXT1hKGMsZCxmKXx8QSwhMD09PWxbMV0p cmV0dXJuITB9fWZ1bmN0aW9uIHgoYSl7cmV0dXJuIDE8DQphLmxlbmd0aD9mdW5jdGlvbihjLGQs Yil7Zm9yKHZhciBlPWEubGVuZ3RoO2UtLTspaWYoIWFbZV0oYyxkLGIpKXJldHVybiExO3JldHVy biEwfTphWzBdfWZ1bmN0aW9uIFAoYSxjLGQsYixlKXtmb3IodmFyIGgsZj1bXSxnPTAsbD1hLmxl bmd0aCxzPW51bGwhPWM7bD5nO2crKykoaD1hW2ddKSYmKCFkfHxkKGgsYixlKSkmJihmLnB1c2go aCkscyYmYy5wdXNoKGcpKTtyZXR1cm4gZn1mdW5jdGlvbiBNKGEsYyxkLGIsZSxoKXtyZXR1cm4g YiYmIWJbRV0mJihiPU0oYikpLGUmJiFlW0VdJiYoZT1NKGUsaCkpLGYoZnVuY3Rpb24oaCxmLGcs cyl7dmFyIHEsdSxrPVtdLHY9W10sbT1mLmxlbmd0aCxwO2lmKCEocD1oKSl7cD1jfHwiKiI7Zm9y KHZhciByPWcubm9kZVR5cGU/W2ddOmcsbj1bXSx0PTAsQ2E9ci5sZW5ndGg7Q2E+dDt0KyspbChw LHJbdF0sbik7cD1ufXA9IWF8fCFoJiZjP3A6UChwLGssYSxnLHMpO3I9ZD9lfHwoaD9hOm18fGIp P1tdOmY6cDtpZihkJiZkKHAscixnLHMpLA0KYil7cT1QKHIsdik7YihxLFtdLGcscyk7Zm9yKGc9 cS5sZW5ndGg7Zy0tOykodT1xW2ddKSYmKHJbdltnXV09IShwW3ZbZ11dPXUpKX1pZihoKXtpZihl fHxhKXtpZihlKXtxPVtdO2ZvcihnPXIubGVuZ3RoO2ctLTspKHU9cltnXSkmJnEucHVzaChwW2dd PXUpO2UobnVsbCxyPVtdLHEscyl9Zm9yKGc9ci5sZW5ndGg7Zy0tOykodT1yW2ddKSYmLTE8KHE9 ZT9YLmNhbGwoaCx1KTprW2ddKSYmKGhbcV09IShmW3FdPXUpKX19ZWxzZSByPVAocj09PWY/ci5z cGxpY2UobSxyLmxlbmd0aCk6ciksZT9lKG51bGwsZixyLHMpOk4uYXBwbHkoZixyKX0pfWZ1bmN0 aW9uIFcoYSl7dmFyIGMsZCxiLGU9YS5sZW5ndGgsaD15LnJlbGF0aXZlW2FbMF0udHlwZV07ZD1o fHx5LnJlbGF0aXZlWyIgIl07Zm9yKHZhciBmPWg/MTowLGc9dyhmdW5jdGlvbihhKXtyZXR1cm4g YT09PWN9LGQsITApLGw9dyhmdW5jdGlvbihhKXtyZXR1cm4tMTxYLmNhbGwoYyxhKX0sZCwhMCks cz1bZnVuY3Rpb24oYSxkLA0KYil7cmV0dXJuIWgmJihifHxkIT09emEpfHwoKGM9ZCkubm9kZVR5 cGU/ZyhhLGQsYik6bChhLGQsYikpfV07ZT5mO2YrKylpZihkPXkucmVsYXRpdmVbYVtmXS50eXBl XSlzPVt3KHgocyksZCldO2Vsc2V7aWYoZD15LmZpbHRlclthW2ZdLnR5cGVdLmFwcGx5KG51bGws YVtmXS5tYXRjaGVzKSxkW0VdKXtmb3IoYj0rK2Y7ZT5iJiYheS5yZWxhdGl2ZVthW2JdLnR5cGVd O2IrKyk7cmV0dXJuIE0oMTxmJiZ4KHMpLDE8ZiYmdChhLnNsaWNlKDAsZi0xKSkucmVwbGFjZShV LCIkMSIpLGQsYj5mJiZXKGEuc2xpY2UoZixiKSksZT5iJiZXKGE9YS5zbGljZShiKSksZT5iJiZ0 KGEpKX1zLnB1c2goZCl9cmV0dXJuIHgocyl9ZnVuY3Rpb24geihhLGMpe3ZhciBkPTAsYj0wPGMu bGVuZ3RoLGU9MDxhLmxlbmd0aCxoPWZ1bmN0aW9uKGgsZixnLHMscSl7dmFyIHUsayx2PVtdLG09 MCxwPSIwIixyPWgmJltdLG49bnVsbCE9cSx0PXphLENhPWh8fGUmJnkuZmluZC5UQUcoIioiLHEm JmYucGFyZW50Tm9kZXx8DQpmKSxXYT1JKz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8MC4xO2Zv cihuJiYoemE9ZiE9PU8mJmYsQT1kKTtudWxsIT0ocT1DYVtwXSk7cCsrKXtpZihlJiZxKXtmb3Io dT0wO2s9YVt1KytdOylpZihrKHEsZixnKSl7cy5wdXNoKHEpO2JyZWFrfW4mJihJPVdhLEE9Kytk KX1iJiYoKHE9IWsmJnEpJiZtLS0saCYmci5wdXNoKHEpKX1pZihtKz1wLGImJnAhPT1tKXtmb3Io dT0wO2s9Y1t1KytdOylrKHIsdixmLGcpO2lmKGgpe2lmKDA8bSlmb3IoO3AtLTspcltwXXx8dltw XXx8KHZbcF09ZGEuY2FsbChzKSk7dj1QKHYpfU4uYXBwbHkocyx2KTtuJiYhaCYmMDx2Lmxlbmd0 aCYmMTxtK2MubGVuZ3RoJiZsLnVuaXF1ZVNvcnQocyl9cmV0dXJuIG4mJihJPVdhLHphPXQpLHJ9 O3JldHVybiBiP2YoaCk6aH1mdW5jdGlvbiBEKCl7fXZhciBCLEEseSxBYSx2YixOYSxDLHphLHNh LE8sUixaLGNhLHRhLEcsdmEsTCxFPSJzaXp6bGUiKy1uZXcgRGF0ZSxKPWEuZG9jdW1lbnQsSD17 fSxJPTAsDQptYz0wLFE9ZSgpLFM9ZSgpLFQ9ZSgpLGZhPXR5cGVvZiBjLFY9LTIxNDc0ODM2NDgs Rj1bXSxkYT1GLnBvcCxOPUYucHVzaCxLPUYuc2xpY2UsWD1GLmluZGV4T2Z8fGZ1bmN0aW9uKGEp e2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZih0aGlzW2NdPT09YSlyZXR1cm4g YztyZXR1cm4tMX0sRj0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLnJlcGxhY2Uo InciLCJ3IyIpLGJhPSJcXFtbXFx4MjBcXHRcXHJcXG5cXGZdKigoPzpcXFxcLnxbXFx3LV18W15c XHgwMC1cXHhhMF0pKylbXFx4MjBcXHRcXHJcXG5cXGZdKig/OihbKl4kfCF+XT9ceDNkKVtcXHgy MFxcdFxcclxcblxcZl0qKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitGKyIp fCl8KVtcXHgyMFxcdFxcclxcblxcZl0qXFxdIixZPSI6KCg/OlxcXFwufFtcXHctXXxbXlxceDAw LVxceGEwXSkrKSg/OlxcKCgoWydcIl0pKCg/OlxcXFwufFteXFxcXF0pKj8pXFwzfCgoPzpcXFxc LnxbXlxcXFwoKVtcXF1dfCIrDQpiYS5yZXBsYWNlKDMsOCkrIikqKXwuKilcXCl8KSIsVT1SZWdF eHAoIl5bXFx4MjBcXHRcXHJcXG5cXGZdK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopW1xceDIw XFx0XFxyXFxuXFxmXSskIiwiZyIpLGdhPS9eW1x4MjBcdFxyXG5cZl0qLFtceDIwXHRcclxuXGZd Ki8saGE9L15bXHgyMFx0XHJcblxmXSooW1x4MjBcdFxyXG5cZj4rfl0pW1x4MjBcdFxyXG5cZl0q LyxpYT1SZWdFeHAoWSksamE9UmVnRXhwKCJeIitGKyIkIiksYWE9e0lEOi9eIygoPzpcXC58W1x3 LV18W15ceDAwLVx4YTBdKSspLyxDTEFTUzovXlwuKCg/OlxcLnxbXHctXXxbXlx4MDAtXHhhMF0p KykvLE5BTUU6L15cW25hbWU9WyciXT8oKD86XFwufFtcdy1dfFteXHgwMC1ceGEwXSkrKVsnIl0/ XF0vLFRBRzpSZWdFeHAoIl4oIisiKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLnJl cGxhY2UoInciLCJ3KiIpKyIpIiksQVRUUjpSZWdFeHAoIl4iK2JhKSxQU0VVRE86UmVnRXhwKCJe IitZKSxDSElMRDpSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGls ZHxvZi10eXBlKSg/OlxcKFtcXHgyMFxcdFxcclxcblxcZl0qKGV2ZW58b2RkfCgoWystXXwpKFxc ZCopbnwpW1xceDIwXFx0XFxyXFxuXFxmXSooPzooWystXXwpW1xceDIwXFx0XFxyXFxuXFxmXSoo XFxkKyl8KSlbXFx4MjBcXHRcXHJcXG5cXGZdKlxcKXwpIiwNCiJpIiksbmVlZHNDb250ZXh0OlJl Z0V4cCgiXltcXHgyMFxcdFxcclxcblxcZl0qW1x4M2Urfl18OihldmVufG9kZHxlcXxndHxsdHxu dGh8Zmlyc3R8bGFzdCkoPzpcXChbXFx4MjBcXHRcXHJcXG5cXGZdKigoPzotXFxkKT9cXGQqKVtc XHgyMFxcdFxcclxcblxcZl0qXFwpfCkoP1x4M2RbXi1dfCQpIiwiaSIpfSxlYT0vW1x4MjBcdFxy XG5cZl0qWyt+XS8sbWE9L15bXntdK1x7XHMqXFtuYXRpdmUgY29kZS8sbmE9L14oPzojKFtcdy1d Kyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxvYT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0 b24pJC9pLHBhPS9eaFxkJC9pLHFhPS8nfFxcL2cscmE9L1w9W1x4MjBcdFxyXG5cZl0qKFteJyJc XV0qKVtceDIwXHRcclxuXGZdKlxdL2csa2E9L1xcKFtcZGEtZkEtRl17MSw2fVtceDIwXHRcclxu XGZdP3wuKS9nLGxhPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IjB4IitjLTY1NTM2O3JldHVybiBkIT09 ZD9jOjA+ZD9TdHJpbmcuZnJvbUNoYXJDb2RlKGQrDQo2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29k ZSg1NTI5NnxkPj4xMCw1NjMyMHwxMDIzJmQpfTt0cnl7Sy5jYWxsKEouZG9jdW1lbnRFbGVtZW50 LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godWEpe0s9ZnVuY3Rpb24oYSl7Zm9yKHZh ciBjLGQ9W107Yz10aGlzW2ErK107KWQucHVzaChjKTtyZXR1cm4gZH19dmI9bC5pc1hNTD1mdW5j dGlvbihhKXtyZXR1cm4oYT1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQp PyJIVE1MIiE9PWEubm9kZU5hbWU6ITF9O3NhPWwuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dmFy IGQ9YT9hLm93bmVyRG9jdW1lbnR8fGE6SjtyZXR1cm4gZCE9PU8mJjk9PT1kLm5vZGVUeXBlJiZk LmRvY3VtZW50RWxlbWVudD8oTz1kLFI9ZC5kb2N1bWVudEVsZW1lbnQsWj12YihkKSxILnRhZ05h bWVOb0NvbW1lbnRzPWcoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZC5jcmVhdGVD b21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSwNCkguYXR0 cmlidXRlcz1nKGZ1bmN0aW9uKGEpe2EuaW5uZXJIVE1MPSJceDNjc2VsZWN0XHgzZVx4M2Mvc2Vs ZWN0XHgzZSI7YT10eXBlb2YgYS5sYXN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJtdWx0aXBsZSIpO3Jl dHVybiJib29sZWFuIiE9PWEmJiJzdHJpbmciIT09YX0pLEguZ2V0QnlDbGFzc05hbWU9ZyhmdW5j dGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9Ilx4M2NkaXYgY2xhc3NceDNkJ2hpZGRlbiBlJ1x4 M2VceDNjL2Rpdlx4M2VceDNjZGl2IGNsYXNzXHgzZCdoaWRkZW4nXHgzZVx4M2MvZGl2XHgzZSIs YS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5s ZW5ndGg/KGEubGFzdENoaWxkLmNsYXNzTmFtZT0iZSIsMj09PWEuZ2V0RWxlbWVudHNCeUNsYXNz TmFtZSgiZSIpLmxlbmd0aCk6ITF9KSxILmdldEJ5TmFtZT1nKGZ1bmN0aW9uKGEpe2EuaWQ9RSsw O2EuaW5uZXJIVE1MPSJceDNjYSBuYW1lXHgzZCciK0UrIidceDNlXHgzYy9hXHgzZVx4M2NkaXYg bmFtZVx4M2QnIisNCkUrIidceDNlXHgzYy9kaXZceDNlIjtSLmluc2VydEJlZm9yZShhLFIuZmly c3RDaGlsZCk7dmFyIGM9ZC5nZXRFbGVtZW50c0J5TmFtZSYmZC5nZXRFbGVtZW50c0J5TmFtZShF KS5sZW5ndGg9PT0yK2QuZ2V0RWxlbWVudHNCeU5hbWUoRSswKS5sZW5ndGg7cmV0dXJuIEguZ2V0 SWROb3ROYW1lPSFkLmdldEVsZW1lbnRCeUlkKEUpLFIucmVtb3ZlQ2hpbGQoYSksY30pLHkuYXR0 ckhhbmRsZT1nKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iXHgzY2EgaHJlZlx4M2Qn IydceDNlXHgzYy9hXHgzZSIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0 dHJpYnV0ZSE9PWZhJiYiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KT97 fTp7aHJlZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSx0eXBl OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0sSC5nZXRJZE5vdE5h bWU/DQooeS5maW5kLklEPWZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGMuZ2V0RWxlbWVudEJ5SWQh PT1mYSYmIVope3ZhciBkPWMuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGQmJmQucGFyZW50Tm9k ZT9bZF06W119fSx5LmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYz1hLnJlcGxhY2Uoa2EsbGEp O3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1jfX0pOih5 LmZpbmQuSUQ9ZnVuY3Rpb24oYSxkKXtpZih0eXBlb2YgZC5nZXRFbGVtZW50QnlJZCE9PWZhJiYh Wil7dmFyIGI9ZC5nZXRFbGVtZW50QnlJZChhKTtyZXR1cm4gYj9iLmlkPT09YXx8dHlwZW9mIGIu Z2V0QXR0cmlidXRlTm9kZSE9PWZhJiZiLmdldEF0dHJpYnV0ZU5vZGUoImlkIikudmFsdWU9PT1h P1tiXTpjOltdfX0seS5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGM9YS5yZXBsYWNlKGthLGxh KTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuKGE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9 PQ0KZmEmJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJmEudmFsdWU9PT1jfX0pLHkuZmluZC5U QUc9SC50YWdOYW1lTm9Db21tZW50cz9mdW5jdGlvbihhLGQpe3JldHVybiB0eXBlb2YgZC5nZXRF bGVtZW50c0J5VGFnTmFtZSE9PWZhP2QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk6Y306ZnVuY3Rp b24oYSxjKXt2YXIgZCxiPVtdLGU9MCxoPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoIioi PT09YSl7Zm9yKDtkPWhbZSsrXTspMT09PWQubm9kZVR5cGUmJmIucHVzaChkKTtyZXR1cm4gYn1y ZXR1cm4gaH0seS5maW5kLk5BTUU9SC5nZXRCeU5hbWUmJmZ1bmN0aW9uKGEsZCl7cmV0dXJuIHR5 cGVvZiBkLmdldEVsZW1lbnRzQnlOYW1lIT09ZmE/ZC5nZXRFbGVtZW50c0J5TmFtZShuYW1lKTpj fSx5LmZpbmQuQ0xBU1M9SC5nZXRCeUNsYXNzTmFtZSYmZnVuY3Rpb24oYSxkKXtyZXR1cm4gdHlw ZW9mIGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT09PWZhfHxaP2M6ZC5nZXRFbGVtZW50c0J5Q2xh c3NOYW1lKGEpfSwNCnRhPVtdLGNhPVsiOmZvY3VzIl0sKEgucXNhPWIoZC5xdWVyeVNlbGVjdG9y QWxsKSkmJihnKGZ1bmN0aW9uKGEpe2EuaW5uZXJIVE1MPSJceDNjc2VsZWN0XHgzZVx4M2NvcHRp b24gc2VsZWN0ZWRceDNkJydceDNlXHgzYy9vcHRpb25ceDNlXHgzYy9zZWxlY3RceDNlIjthLnF1 ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fGNhLnB1c2goIlxcW1tcXHgyMFxc dFxcclxcblxcZl0qKD86Y2hlY2tlZHxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxyZWFkb25seXxz ZWxlY3RlZHx2YWx1ZSkiKTthLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxj YS5wdXNoKCI6Y2hlY2tlZCIpfSksZyhmdW5jdGlvbihhKXthLmlubmVySFRNTD0iXHgzY2lucHV0 IHR5cGVceDNkJ2hpZGRlbicgaVx4M2QnJy9ceDNlIjthLnF1ZXJ5U2VsZWN0b3JBbGwoIltpXlx4 M2QnJ10iKS5sZW5ndGgmJmNhLnB1c2goIlsqXiRdXHgzZFtcXHgyMFxcdFxcclxcblxcZl0qKD86 XCJcInwnJykiKTsNCmEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGNhLnB1 c2goIjplbmFibGVkIiwiOmRpc2FibGVkIik7YS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iik7Y2Eu cHVzaCgiLC4qOiIpfSkpLChILm1hdGNoZXNTZWxlY3Rvcj1iKEc9Ui5tYXRjaGVzU2VsZWN0b3J8 fFIubW96TWF0Y2hlc1NlbGVjdG9yfHxSLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8Ui5vTWF0Y2hl c1NlbGVjdG9yfHxSLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJmcoZnVuY3Rpb24oYSl7SC5kaXNjb25u ZWN0ZWRNYXRjaD1HLmNhbGwoYSwiZGl2Iik7Ry5jYWxsKGEsIltzIVx4M2QnJ106eCIpO3RhLnB1 c2goIiFceDNkIixZKX0pLGNhPVJlZ0V4cChjYS5qb2luKCJ8IikpLHRhPVJlZ0V4cCh0YS5qb2lu KCJ8IikpLHZhPWIoUi5jb250YWlucyl8fFIuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rp b24oYSxjKXt2YXIgZD05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGI9YyYmYy5w YXJlbnROb2RlOw0KcmV0dXJuIGE9PT1ifHwhKCFifHwxIT09Yi5ub2RlVHlwZXx8IShkLmNvbnRh aW5zP2QuY29udGFpbnMoYik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJl RG9jdW1lbnRQb3NpdGlvbihiKSkpfTpmdW5jdGlvbihhLGMpe2lmKGMpZm9yKDtjPWMucGFyZW50 Tm9kZTspaWYoYz09PWEpcmV0dXJuITA7cmV0dXJuITF9LEw9Ui5jb21wYXJlRG9jdW1lbnRQb3Np dGlvbj9mdW5jdGlvbihhLGMpe3ZhciBiO3JldHVybiBhPT09Yz8oQz0hMCwwKTooYj1jLmNvbXBh cmVEb2N1bWVudFBvc2l0aW9uJiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZhLmNvbXBhcmVE b2N1bWVudFBvc2l0aW9uKGMpKT8xJmJ8fGEucGFyZW50Tm9kZSYmMTE9PT1hLnBhcmVudE5vZGUu bm9kZVR5cGU/YT09PWR8fHZhKEosYSk/LTE6Yz09PWR8fHZhKEosYyk/MTowOjQmYj8tMToxOmEu Y29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MX06ZnVuY3Rpb24oYSxjKXt2YXIgYixlPTA7Yj1h LnBhcmVudE5vZGU7DQp2YXIgaD1jLnBhcmVudE5vZGUsZj1bYV0sZz1bY107aWYoYT09PWMpcmV0 dXJuIEM9ITAsMDtpZighYnx8IWgpcmV0dXJuIGE9PT1kPy0xOmM9PT1kPzE6Yj8tMTpoPzE6MDtp ZihiPT09aClyZXR1cm4gayhhLGMpO2ZvcihiPWE7Yj1iLnBhcmVudE5vZGU7KWYudW5zaGlmdChi KTtmb3IoYj1jO2I9Yi5wYXJlbnROb2RlOylnLnVuc2hpZnQoYik7Zm9yKDtmW2VdPT09Z1tlXTsp ZSsrO3JldHVybiBlP2soZltlXSxnW2VdKTpmW2VdPT09Sj8tMTpnW2VdPT09Sj8xOjB9LEM9ITEs WzAsMF0uc29ydChMKSxILmRldGVjdER1cGxpY2F0ZXM9QyxPKTpPfTtsLm1hdGNoZXM9ZnVuY3Rp b24oYSxjKXtyZXR1cm4gbChhLG51bGwsbnVsbCxjKX07bC5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rp b24oYSxjKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PU8mJnNhKGEpLGM9Yy5yZXBsYWNlKHJh LCJceDNkJyQxJ10iKSwhKCFILm1hdGNoZXNTZWxlY3Rvcnx8Wnx8dGEmJnRhLnRlc3QoYyl8fGNh LnRlc3QoYykpKXRyeXt2YXIgZD0NCkcuY2FsbChhLGMpO2lmKGR8fEguZGlzY29ubmVjdGVkTWF0 Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChi KXt9cmV0dXJuIDA8bChjLE8sbnVsbCxbYV0pLmxlbmd0aH07bC5jb250YWlucz1mdW5jdGlvbihh LGMpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09TyYmc2EoYSksdmEoYSxjKX07bC5hdHRy PWZ1bmN0aW9uKGEsYyl7dmFyIGQ7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1PJiZzYShh KSxafHwoYz1jLnRvTG93ZXJDYXNlKCkpLChkPXkuYXR0ckhhbmRsZVtjXSk/ZChhKTpafHxILmF0 dHJpYnV0ZXM/YS5nZXRBdHRyaWJ1dGUoYyk6KChkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSl8fGEu Z2V0QXR0cmlidXRlKGMpKSYmITA9PT1hW2NdP2M6ZCYmZC5zcGVjaWZpZWQ/ZC52YWx1ZTpudWxs fTtsLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2du aXplZCBleHByZXNzaW9uOiAiKw0KYSk7fTtsLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGMs ZD1bXSxiPTEsZT0wO2lmKEM9IUguZGV0ZWN0RHVwbGljYXRlcyxhLnNvcnQoTCksQyl7Zm9yKDtj PWFbYl07YisrKWM9PT1hW2ItMV0mJihlPWQucHVzaChiKSk7Zm9yKDtlLS07KWEuc3BsaWNlKGRb ZV0sMSl9cmV0dXJuIGF9O0FhPWwuZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYyxkPSIiLGI9MDtp ZihjPWEubm9kZVR5cGUpaWYoMT09PWN8fDk9PT1jfHwxMT09PWMpe2lmKCJzdHJpbmciPT10eXBl b2YgYS50ZXh0Q29udGVudClyZXR1cm4gYS50ZXh0Q29udGVudDtmb3IoYT1hLmZpcnN0Q2hpbGQ7 YTthPWEubmV4dFNpYmxpbmcpZCs9QWEoYSl9ZWxzZXtpZigzPT09Y3x8ND09PWMpcmV0dXJuIGEu bm9kZVZhbHVlfWVsc2UgZm9yKDtjPWFbYl07YisrKWQrPUFhKGMpO3JldHVybiBkfTt5PWwuc2Vs ZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86ZixtYXRjaDphYSxmaW5kOnt9LHJl bGF0aXZlOnsiXHgzZSI6e2RpcjoicGFyZW50Tm9kZSIsDQpmaXJzdDohMH0sIiAiOntkaXI6InBh cmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6 InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFb MV09YVsxXS5yZXBsYWNlKGthLGxhKSxhWzNdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShrYSxs YSksIn5ceDNkIj09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElM RDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFd LnNsaWNlKDAsMyk/KGFbM118fGwuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8 MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9k ZCI9PT1hWzNdKSk6YVszXSYmbC5lcnJvcihhWzBdKSxhfSxQU0VVRE86ZnVuY3Rpb24oYSl7dmFy IGMsZD0hYVs1XSYmYVsyXTtyZXR1cm4gYWEuQ0hJTEQudGVzdChhWzBdKT8NCm51bGw6KGFbNF0/ YVsyXT1hWzRdOmQmJmlhLnRlc3QoZCkmJihjPXAoZCwhMCkpJiYoYz1kLmluZGV4T2YoIikiLGQu bGVuZ3RoLWMpLWQubGVuZ3RoKSYmKGFbMF09YVswXS5zbGljZSgwLGMpLGFbMl09ZC5zbGljZSgw LGMpKSxhLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oYSl7cmV0dXJuIioiPT09 YT9mdW5jdGlvbigpe3JldHVybiEwfTooYT1hLnJlcGxhY2Uoa2EsbGEpLnRvTG93ZXJDYXNlKCks ZnVuY3Rpb24oYyl7cmV0dXJuIGMubm9kZU5hbWUmJmMubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09 PWF9KX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGM9UVthKyIgIl07cmV0dXJuIGN8fChjPVJlZ0V4 cCgiKF58W1xceDIwXFx0XFxyXFxuXFxmXSkiK2ErIihbXFx4MjBcXHRcXHJcXG5cXGZdfCQpIikp JiZRKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGMudGVzdChhLmNsYXNzTmFtZXx8dHlwZW9mIGEuZ2V0 QXR0cmlidXRlIT09ZmEmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwNCiIiKX0pfSxBVFRSOmZ1 bmN0aW9uKGEsYyxkKXtyZXR1cm4gZnVuY3Rpb24oYil7Yj1sLmF0dHIoYixhKTtyZXR1cm4gbnVs bD09Yj8iIVx4M2QiPT09YzpjPyhiKz0iIiwiXHgzZCI9PT1jP2I9PT1kOiIhXHgzZCI9PT1jP2Ih PT1kOiJeXHgzZCI9PT1jP2QmJjA9PT1iLmluZGV4T2YoZCk6IipceDNkIj09PWM/ZCYmLTE8Yi5p bmRleE9mKGQpOiIkXHgzZCI9PT1jP2QmJmIuc2xpY2UoLWQubGVuZ3RoKT09PWQ6In5ceDNkIj09 PWM/LTE8KCIgIitiKyIgIikuaW5kZXhPZihkKToifFx4M2QiPT09Yz9iPT09ZHx8Yi5zbGljZSgw LGQubGVuZ3RoKzEpPT09ZCsiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxjLGQsYixlKXt2 YXIgaD0ibnRoIiE9PWEuc2xpY2UoMCwzKSxmPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGc9Im9mLXR5 cGUiPT09YztyZXR1cm4gMT09PWImJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnRO b2RlfTpmdW5jdGlvbihjLGQsbCl7dmFyIHMscSx1LA0Kayx2O2Q9aCE9PWY/Im5leHRTaWJsaW5n IjoicHJldmlvdXNTaWJsaW5nIjt2YXIgbT1jLnBhcmVudE5vZGUscD1nJiZjLm5vZGVOYW1lLnRv TG93ZXJDYXNlKCk7bD0hbCYmIWc7aWYobSl7aWYoaCl7Zm9yKDtkOyl7Zm9yKHE9YztxPXFbZF07 KWlmKGc/cS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cDoxPT09cS5ub2RlVHlwZSlyZXR1cm4h MTt2PWQ9Im9ubHkiPT09YSYmIXYmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYodj1bZj9tLmZp cnN0Q2hpbGQ6bS5sYXN0Q2hpbGRdLGYmJmwpe2w9bVtFXXx8KG1bRV09e30pO3M9bFthXXx8W107 az1zWzBdPT09SSYmc1sxXTt1PXNbMF09PT1JJiZzWzJdO2ZvcihxPWsmJm0uY2hpbGROb2Rlc1tr XTtxPSsrayYmcSYmcVtkXXx8KHU9az0wKXx8di5wb3AoKTspaWYoMT09PXEubm9kZVR5cGUmJisr dSYmcT09PWMpe2xbYV09W0ksayx1XTticmVha319ZWxzZSBpZihsJiYocz0oY1tFXXx8KGNbRV09 e30pKVthXSkmJnNbMF09PT1JKXU9DQpzWzFdO2Vsc2UgZm9yKDsocT0rK2smJnEmJnFbZF18fCh1 PWs9MCl8fHYucG9wKCkpJiYoIShnP3Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXA6MT09PXEu bm9kZVR5cGUpfHwhKyt1fHwhKGwmJigocVtFXXx8KHFbRV09e30pKVthXT1bSSx1XSkscT09PWMp KTspO3JldHVybiB1LT1lLHU9PT1ifHwwPT09dSViJiYwPD11L2J9fX0sUFNFVURPOmZ1bmN0aW9u KGEsYyl7dmFyIGQsYj15LnBzZXVkb3NbYV18fHkuc2V0RmlsdGVyc1thLnRvTG93ZXJDYXNlKCld fHxsLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGJbRV0/YihjKToxPGIu bGVuZ3RoPyhkPVthLGEsIiIsY10seS5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dl ckNhc2UoKSk/ZihmdW5jdGlvbihhLGQpe2Zvcih2YXIgZSxoPWIoYSxjKSxmPWgubGVuZ3RoO2Yt LTspZT1YLmNhbGwoYSxoW2ZdKSxhW2VdPSEoZFtlXT1oW2ZdKX0pOmZ1bmN0aW9uKGEpe3JldHVy biBiKGEsMCxkKX0pOg0KYn19LHBzZXVkb3M6e25vdDpmKGZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9 W10sYj1OYShhLnJlcGxhY2UoVSwiJDEiKSk7cmV0dXJuIGJbRV0/ZihmdW5jdGlvbihhLGMsZCxl KXt2YXIgaDtkPWIoYSxudWxsLGUsW10pO2ZvcihlPWEubGVuZ3RoO2UtLTspKGg9ZFtlXSkmJihh W2VdPSEoY1tlXT1oKSl9KTpmdW5jdGlvbihhLGUsaCl7cmV0dXJuIGNbMF09YSxiKGMsbnVsbCxo LGQpLCFkLnBvcCgpfX0pLGhhczpmKGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjKXtyZXR1 cm4gMDxsKGEsYykubGVuZ3RofX0pLGNvbnRhaW5zOmYoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0 aW9uKGMpe3JldHVybi0xPChjLnRleHRDb250ZW50fHxjLmlubmVyVGV4dHx8QWEoYykpLmluZGV4 T2YoYSl9fSksbGFuZzpmKGZ1bmN0aW9uKGEpe3JldHVybiBqYS50ZXN0KGF8fCIiKXx8bC5lcnJv cigidW5zdXBwb3J0ZWQgbGFuZzogIithKSxhPWEucmVwbGFjZShrYSxsYSkudG9Mb3dlckNhc2Uo KSxmdW5jdGlvbihjKXt2YXIgZDsNCmRvIGlmKGQ9Wj9jLmdldEF0dHJpYnV0ZSgieG1sOmxhbmci KXx8Yy5nZXRBdHRyaWJ1dGUoImxhbmciKTpjLmxhbmcpcmV0dXJuIGQ9ZC50b0xvd2VyQ2FzZSgp LGQ9PT1hfHwwPT09ZC5pbmRleE9mKGErIi0iKTt3aGlsZSgoYz1jLnBhcmVudE5vZGUpJiYxPT09 Yy5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGMpe3ZhciBkPWEubG9jYXRp b24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gZCYmZC5zbGljZSgxKT09PWMuaWR9LHJvb3Q6ZnVu Y3Rpb24oYSl7cmV0dXJuIGE9PT1SfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PU8uYWN0 aXZlRWxlbWVudCYmKCFPLmhhc0ZvY3VzfHxPLmhhc0ZvY3VzKCkpJiYhKCFhLnR5cGUmJiFhLmhy ZWYmJiF+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuITE9PT1hLmRpc2Fi bGVkfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4hMD09PWEuZGlzYWJsZWR9LGNoZWNrZWQ6 ZnVuY3Rpb24oYSl7dmFyIGM9DQphLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0 Ij09PWMmJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWMmJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6 ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5k ZXgsITA9PT1hLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7 YTthPWEubmV4dFNpYmxpbmcpaWYoIkAiPGEubm9kZU5hbWV8fDM9PT1hLm5vZGVUeXBlfHw0PT09 YS5ub2RlVHlwZSlyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiF5 LnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gcGEudGVzdChhLm5v ZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG9hLnRlc3QoYS5ub2RlTmFtZSl9LGJ1 dHRvbjpmdW5jdGlvbihhKXt2YXIgYz1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlu cHV0Ij09PWMmJg0KImJ1dHRvbiI9PT1hLnR5cGV8fCJidXR0b24iPT09Y30sdGV4dDpmdW5jdGlv bihhKXt2YXIgYztyZXR1cm4iaW5wdXQiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4 dCI9PT1hLnR5cGUmJihudWxsPT0oYz1hLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8Yy50b0xvd2Vy Q2FzZSgpPT09YS50eXBlKX0sZmlyc3Q6cihmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6cihm dW5jdGlvbihhLGMpe3JldHVybltjLTFdfSksZXE6cihmdW5jdGlvbihhLGMsZCl7cmV0dXJuWzA+ ZD9kK2M6ZF19KSxldmVuOnIoZnVuY3Rpb24oYSxjKXtmb3IodmFyIGQ9MDtjPmQ7ZCs9MilhLnB1 c2goZCk7cmV0dXJuIGF9KSxvZGQ6cihmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0xO2M+ZDtkKz0y KWEucHVzaChkKTtyZXR1cm4gYX0pLGx0OnIoZnVuY3Rpb24oYSxjLGQpe2ZvcihjPTA+ZD9kK2M6 ZDswPD0tLWM7KWEucHVzaChjKTtyZXR1cm4gYX0pLGd0OnIoZnVuY3Rpb24oYSxjLGQpe2Zvcihk PQ0KMD5kP2QrYzpkO2M+KytkOylhLnB1c2goZCk7cmV0dXJuIGF9KX19O2ZvcihCIGlue3JhZGlv OiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KXkucHNldWRvc1tC XT1tKEIpO2ZvcihCIGlue3N1Ym1pdDohMCxyZXNldDohMH0peS5wc2V1ZG9zW0JdPW4oQik7TmE9 bC5jb21waWxlPWZ1bmN0aW9uKGEsYyl7dmFyIGQsYj1bXSxlPVtdLGg9VFthKyIgIl07aWYoIWgp e2N8fChjPXAoYSkpO2ZvcihkPWMubGVuZ3RoO2QtLTspaD1XKGNbZF0pLGhbRV0/Yi5wdXNoKGgp OmUucHVzaChoKTtoPVQoYSx6KGUsYikpfXJldHVybiBofTt5LnBzZXVkb3MubnRoPXkucHNldWRv cy5lcTt5LmZpbHRlcnM9RC5wcm90b3R5cGU9eS5wc2V1ZG9zO3kuc2V0RmlsdGVycz1uZXcgRDtz YSgpO2wuYXR0cj1kLmF0dHI7ZC5maW5kPWw7ZC5leHByPWwuc2VsZWN0b3JzO2QuZXhwclsiOiJd PWQuZXhwci5wc2V1ZG9zO2QudW5pcXVlPWwudW5pcXVlU29ydDtkLnRleHQ9bC5nZXRUZXh0Ow0K ZC5pc1hNTERvYz1sLmlzWE1MO2QuY29udGFpbnM9bC5jb250YWluc30pKGIpO3ZhciBuYz0vVW50 aWwkLyxvYz0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxOYj0vXi5bXjojXFtcLixd KiQvLHdiPWQuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQscGM9e2NoaWxkcmVuOiEwLGNvbnRlbnRz OiEwLG5leHQ6ITAscHJldjohMH07ZC5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGMs YixlLGY9dGhpcy5sZW5ndGg7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBlPXRoaXMsdGhp cy5wdXNoU3RhY2soZChhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wO2Y+YztjKyspaWYoZC5j b250YWlucyhlW2NdLHRoaXMpKXJldHVybiEwfSkpO2I9W107Zm9yKGM9MDtmPmM7YysrKWQuZmlu ZChhLHRoaXNbY10sYik7cmV0dXJuIGI9dGhpcy5wdXNoU3RhY2soMTxmP2QudW5pcXVlKGIpOmIp LGIuc2VsZWN0b3I9KHRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICI6DQoiIikrYSxifSxo YXM6ZnVuY3Rpb24oYSl7dmFyIGMsYj1kKGEsdGhpcyksZT1iLmxlbmd0aDtyZXR1cm4gdGhpcy5m aWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wO2U+YztjKyspaWYoZC5jb250YWlucyh0aGlzLGJbY10p KXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlz LGEsITEpKX0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMs YSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJigic3RyaW5nIj09dHlwZW9mIGE/d2Iu dGVzdChhKT8wPD1kKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKTowPGQuZmlsdGVyKGEs dGhpcykubGVuZ3RoOjA8dGhpcy5maWx0ZXIoYSkubGVuZ3RoKX0sY2xvc2VzdDpmdW5jdGlvbihh LGMpe2Zvcih2YXIgYixlPTAsZj10aGlzLmxlbmd0aCxnPVtdLGw9d2IudGVzdChhKXx8InN0cmlu ZyIhPXR5cGVvZiBhP2QoYSxjfHx0aGlzLmNvbnRleHQpOjA7Zj4NCmU7ZSsrKWZvcihiPXRoaXNb ZV07YiYmYi5vd25lckRvY3VtZW50JiZiIT09YyYmMTEhPT1iLm5vZGVUeXBlOyl7aWYobD8tMTxs LmluZGV4KGIpOmQuZmluZC5tYXRjaGVzU2VsZWN0b3IoYixhKSl7Zy5wdXNoKGIpO2JyZWFrfWI9 Yi5wYXJlbnROb2RlfXJldHVybiB0aGlzLnB1c2hTdGFjaygxPGcubGVuZ3RoP2QudW5pcXVlKGcp OmcpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/ZC5pbkFy cmF5KHRoaXNbMF0sZChhKSk6ZC5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBd JiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFk ZDpmdW5jdGlvbihhLGMpe3ZhciBiPSJzdHJpbmciPT10eXBlb2YgYT9kKGEsYyk6ZC5tYWtlQXJy YXkoYSYmYS5ub2RlVHlwZT9bYV06YSksYj1kLm1lcmdlKHRoaXMuZ2V0KCksYik7cmV0dXJuIHRo aXMucHVzaFN0YWNrKGQudW5pcXVlKGIpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhp cy5hZGQobnVsbD09DQphP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEp KX19KTtkLmZuLmFuZFNlbGY9ZC5mbi5hZGRCYWNrO2QuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEp e3JldHVybihhPWEucGFyZW50Tm9kZSkmJjExIT09YS5ub2RlVHlwZT9hOm51bGx9LHBhcmVudHM6 ZnVuY3Rpb24oYSl7cmV0dXJuIGQuZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1 bmN0aW9uKGEsYyxiKXtyZXR1cm4gZC5kaXIoYSwicGFyZW50Tm9kZSIsYil9LG5leHQ6ZnVuY3Rp b24oYSl7cmV0dXJuIFYoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4g VihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gZC5kaXIo YSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gZC5kaXIoYSwicHJl dmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGMsYil7cmV0dXJuIGQuZGlyKGEs Im5leHRTaWJsaW5nIiwNCmIpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxjLGIpe3JldHVybiBkLmRp cihhLCJwcmV2aW91c1NpYmxpbmciLGIpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gZC5z aWJsaW5nKChhLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlv bihhKXtyZXR1cm4gZC5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEp e3JldHVybiBkLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRl bnRXaW5kb3cuZG9jdW1lbnQ6ZC5tZXJnZShbXSxhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxj KXtkLmZuW2FdPWZ1bmN0aW9uKGIsZSl7dmFyIGY9ZC5tYXAodGhpcyxjLGIpO3JldHVybiBuYy50 ZXN0KGEpfHwoZT1iKSxlJiYic3RyaW5nIj09dHlwZW9mIGUmJihmPWQuZmlsdGVyKGUsZikpLGY9 MTx0aGlzLmxlbmd0aCYmIXBjW2FdP2QudW5pcXVlKGYpOmYsMTx0aGlzLmxlbmd0aCYmb2MudGVz dChhKSYmDQooZj1mLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soZil9fSk7ZC5leHRlbmQoe2Zp bHRlcjpmdW5jdGlvbihhLGMsYil7cmV0dXJuIGImJihhPSI6bm90KCIrYSsiKSIpLDE9PT1jLmxl bmd0aD9kLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGNbMF0sYSk/W2NbMF1dOltdOmQuZmluZC5tYXRj aGVzKGEsYyl9LGRpcjpmdW5jdGlvbihhLGMsYil7dmFyIGY9W107Zm9yKGE9YVtjXTthJiY5IT09 YS5ub2RlVHlwZSYmKGI9PT1lfHwxIT09YS5ub2RlVHlwZXx8IWQoYSkuaXMoYikpOykxPT09YS5u b2RlVHlwZSYmZi5wdXNoKGEpLGE9YVtjXTtyZXR1cm4gZn0sc2libGluZzpmdW5jdGlvbihhLGMp e2Zvcih2YXIgZD1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWMmJmQu cHVzaChhKTtyZXR1cm4gZH19KTt2YXIgWGE9ImFiYnJ8YXJ0aWNsZXxhc2lkZXxhdWRpb3xiZGl8 Y2FudmFzfGRhdGF8ZGF0YWxpc3R8ZGV0YWlsc3xmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8aGVh ZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5 fHRpbWV8dmlkZW8iLA0KcWM9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyx4Yj1SZWdFeHAo Ilx4M2MoPzoiK1hhKyIpW1xccy9ceDNlXSIsImkiKSxPYT0vXlxzKy8seWI9LzwoPyFhcmVhfGJy fGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwv Pi9naSx6Yj0vPChbXHc6XSspLyxBYj0vPHRib2R5L2kscmM9Lzx8JiM/XHcrOy8sc2M9LzwoPzpz Y3JpcHR8c3R5bGV8bGluaykvaSxEYT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSx0Yz0vY2hlY2tl ZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxCYj0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0 L2ksT2I9L150cnVlXC8oLiopLyx1Yz0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0t KT5ccyokL2csQz17b3B0aW9uOlsxLCJceDNjc2VsZWN0IG11bHRpcGxlXHgzZCdtdWx0aXBsZSdc eDNlIiwiXHgzYy9zZWxlY3RceDNlIl0sbGVnZW5kOlsxLCJceDNjZmllbGRzZXRceDNlIiwiXHgz Yy9maWVsZHNldFx4M2UiXSwNCmFyZWE6WzEsIlx4M2NtYXBceDNlIiwiXHgzYy9tYXBceDNlIl0s cGFyYW06WzEsIlx4M2NvYmplY3RceDNlIiwiXHgzYy9vYmplY3RceDNlIl0sdGhlYWQ6WzEsIlx4 M2N0YWJsZVx4M2UiLCJceDNjL3RhYmxlXHgzZSJdLHRyOlsyLCJceDNjdGFibGVceDNlXHgzY3Ri b2R5XHgzZSIsIlx4M2MvdGJvZHlceDNlXHgzYy90YWJsZVx4M2UiXSxjb2w6WzIsIlx4M2N0YWJs ZVx4M2VceDNjdGJvZHlceDNlXHgzYy90Ym9keVx4M2VceDNjY29sZ3JvdXBceDNlIiwiXHgzYy9j b2xncm91cFx4M2VceDNjL3RhYmxlXHgzZSJdLHRkOlszLCJceDNjdGFibGVceDNlXHgzY3Rib2R5 XHgzZVx4M2N0clx4M2UiLCJceDNjL3RyXHgzZVx4M2MvdGJvZHlceDNlXHgzYy90YWJsZVx4M2Ui XSxfZGVmYXVsdDpkLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZT9bMCwiIiwiIl06WzEsIlhceDNjZGl2 XHgzZSIsIlx4M2MvZGl2XHgzZSJdfSxQYT1NKHQpLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVu dCgiZGl2IikpOw0KQy5vcHRncm91cD1DLm9wdGlvbjtDLnRib2R5PUMudGZvb3Q9Qy5jb2xncm91 cD1DLmNhcHRpb249Qy50aGVhZDtDLnRoPUMudGQ7ZC5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24o YSl7cmV0dXJuIGQuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1lP2QudGV4dCh0 aGlzKTp0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8 fHQpLmNyZWF0ZVRleHROb2RlKGEpKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSx3cmFwQWxs OmZ1bmN0aW9uKGEpe2lmKGQuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9u KGMpe2QodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxjKSl9KTtpZih0aGlzWzBdKXt2YXIgYz1k KGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnRO b2RlJiZjLmluc2VydEJlZm9yZSh0aGlzWzBdKTtjLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgYT10 aGlzO2EuZmlyc3RDaGlsZCYmDQoxPT09YS5maXJzdENoaWxkLm5vZGVUeXBlOylhPWEuZmlyc3RD aGlsZDtyZXR1cm4gYX0pLmFwcGVuZCh0aGlzKX1yZXR1cm4gdGhpc30sd3JhcElubmVyOmZ1bmN0 aW9uKGEpe3JldHVybiBkLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2QodGhp cykud3JhcElubmVyKGEuY2FsbCh0aGlzLGMpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBj PWQodGhpcyksYj1jLmNvbnRlbnRzKCk7Yi5sZW5ndGg/Yi53cmFwQWxsKGEpOmMuYXBwZW5kKGEp fSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGM9ZC5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVh Y2goZnVuY3Rpb24oYil7ZCh0aGlzKS53cmFwQWxsKGM/YS5jYWxsKHRoaXMsYik6YSl9KX0sdW53 cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe2Qubm9k ZU5hbWUodGhpcywiYm9keSIpfHxkKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9 KS5lbmQoKX0sDQphcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVu dHMsITAsZnVuY3Rpb24oYSl7KDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8 fDk9PT10aGlzLm5vZGVUeXBlKSYmdGhpcy5hcHBlbmRDaGlsZChhKX0pfSxwcmVwZW5kOmZ1bmN0 aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCEwLGZ1bmN0aW9uKGEpeygxPT09 dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSkmJnRo aXMuaW5zZXJ0QmVmb3JlKGEsdGhpcy5maXJzdENoaWxkKX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXty ZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnRO b2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5w YXJlbnROb2RlJiYNCnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJs aW5nKX0pfSxyZW1vdmU6ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGIsZT0wO251bGwhPShiPXRoaXNb ZV0pO2UrKykoIWF8fDA8ZC5maWx0ZXIoYSxbYl0pLmxlbmd0aCkmJihjfHwxIT09Yi5ub2RlVHlw ZXx8ZC5jbGVhbkRhdGEoRChiKSksYi5wYXJlbnROb2RlJiYoYyYmZC5jb250YWlucyhiLm93bmVy RG9jdW1lbnQsYikmJkcoRChiLCJzY3JpcHQiKSksYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIp KSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhLGM9MDtudWxsIT0oYT10 aGlzW2NdKTtjKyspe2ZvcigxPT09YS5ub2RlVHlwZSYmZC5jbGVhbkRhdGEoRChhLCExKSk7YS5m aXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5vcHRpb25zJiZkLm5vZGVO YW1lKGEsInNlbGVjdCIpJiYoYS5vcHRpb25zLmxlbmd0aD0wKX1yZXR1cm4gdGhpc30sY2xvbmU6 ZnVuY3Rpb24oYSwNCmMpe3JldHVybiBhPW51bGw9PWE/ITE6YSxjPW51bGw9PWM/YTpjLHRoaXMu bWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGQuY2xvbmUodGhpcyxhLGMpfSl9LGh0bWw6ZnVuY3Rpb24o YSl7cmV0dXJuIGQuYWNjZXNzKHRoaXMsZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXXx8e30sZj0w LGc9dGhpcy5sZW5ndGg7aWYoYT09PWUpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1M LnJlcGxhY2UocWMsIiIpOmU7aWYoISgic3RyaW5nIiE9dHlwZW9mIGF8fHNjLnRlc3QoYSl8fCFk LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSYmeGIudGVzdChhKXx8IWQuc3VwcG9ydC5sZWFkaW5nV2hp dGVzcGFjZSYmT2EudGVzdChhKXx8Q1soemIuZXhlYyhhKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNh c2UoKV0pKXthPWEucmVwbGFjZSh5YiwiXHgzYyQxXHgzZVx4M2MvJDJceDNlIik7dHJ5e2Zvcig7 Zz5mO2YrKyliPXRoaXNbZl18fHt9LDE9PT1iLm5vZGVUeXBlJiYoZC5jbGVhbkRhdGEoRChiLCEx KSksDQpiLmlubmVySFRNTD1hKTtiPTB9Y2F0Y2godSl7fX1iJiZ0aGlzLmVtcHR5KCkuYXBwZW5k KGEpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe3Jl dHVybiBkLmlzRnVuY3Rpb24oYSl8fCJzdHJpbmciPT10eXBlb2YgYXx8KGE9ZChhKS5ub3QodGhp cykuZGV0YWNoKCkpLHRoaXMuZG9tTWFuaXAoW2FdLCEwLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMu bmV4dFNpYmxpbmcsZT10aGlzLnBhcmVudE5vZGU7ZSYmKGQodGhpcykucmVtb3ZlKCksZS5pbnNl cnRCZWZvcmUoYSxiKSl9KX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShh LCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxjLGIpe2E9bmIuYXBwbHkoW10sYSk7dmFyIGYsZyx1 LGwsaz0wLG09dGhpcy5sZW5ndGgsbj10aGlzLHI9bS0xLHA9YVswXSx0PWQuaXNGdW5jdGlvbihw KTtpZih0fHwhKDE+PW18fCJzdHJpbmciIT10eXBlb2YgcHx8ZC5zdXBwb3J0LmNoZWNrQ2xvbmUp JiYNCnRjLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZj1uLmVxKGQp O3QmJihhWzBdPXAuY2FsbCh0aGlzLGQsYz9mLmh0bWwoKTplKSk7Zi5kb21NYW5pcChhLGMsYil9 KTtpZihtJiYobD1kLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhp cyksZj1sLmZpcnN0Q2hpbGQsMT09PWwuY2hpbGROb2Rlcy5sZW5ndGgmJihsPWYpLGYpKXtjPWMm JmQubm9kZU5hbWUoZiwidHIiKTt1PWQubWFwKEQobCwic2NyaXB0IiksUCk7Zm9yKGc9dS5sZW5n dGg7bT5rO2srKylmPWwsayE9PXImJihmPWQuY2xvbmUoZiwhMCwhMCksZyYmZC5tZXJnZSh1LEQo Ziwic2NyaXB0IikpKSxiLmNhbGwoYyYmZC5ub2RlTmFtZSh0aGlzW2tdLCJ0YWJsZSIpP3RoaXNb a10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fHRoaXNba10uYXBwZW5kQ2hpbGQo dGhpc1trXS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOnRoaXNba10sDQpm LGspO2lmKGcpe2w9dVt1Lmxlbmd0aC0xXS5vd25lckRvY3VtZW50O2QubWFwKHUsVyk7Zm9yKGs9 MDtnPms7aysrKWY9dVtrXSxCYi50ZXN0KGYudHlwZXx8IiIpJiYhZC5fZGF0YShmLCJnbG9iYWxF dmFsIikmJmQuY29udGFpbnMobCxmKSYmKGYuc3JjP2QuYWpheCh7dXJsOmYuc3JjLHR5cGU6IkdF VCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSk6ZC5n bG9iYWxFdmFsKChmLnRleHR8fGYudGV4dENvbnRlbnR8fGYuaW5uZXJIVE1MfHwiIikucmVwbGFj ZSh1YywiIikpKX1sPWY9bnVsbH1yZXR1cm4gdGhpc319KTtkLmVhY2goe2FwcGVuZFRvOiJhcHBl bmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVy OiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGMpe2QuZm5bYV09 ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsZT1bXSxmPWQoYSksZz1mLmxlbmd0aC0NCjE7Zz49Yjti KyspYT1iPT09Zz90aGlzOnRoaXMuY2xvbmUoITApLGQoZltiXSlbY10oYSksSGEuYXBwbHkoZSxh LmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7ZC5leHRlbmQoe2Nsb25lOmZ1bmN0 aW9uKGEsYyxiKXt2YXIgZSxmLGcsbCxrLG09ZC5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSk7 aWYoZC5zdXBwb3J0Lmh0bWw1Q2xvbmV8fGQuaXNYTUxEb2MoYSl8fCF4Yi50ZXN0KCJceDNjIith Lm5vZGVOYW1lKyJceDNlIik/Zz1hLmNsb25lTm9kZSghMCk6KFBhLmlubmVySFRNTD1hLm91dGVy SFRNTCxQYS5yZW1vdmVDaGlsZChnPVBhLmZpcnN0Q2hpbGQpKSwhKGQuc3VwcG9ydC5ub0Nsb25l RXZlbnQmJmQuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5u b2RlVHlwZXx8ZC5pc1hNTERvYyhhKSkpe2U9RChnKTtrPUQoYSk7Zm9yKGw9MDtudWxsIT0oZj1r W2xdKTsrK2wpaWYoZVtsXSl7dmFyIG49ZVtsXSxyPXZvaWQgMCwNCnA9dm9pZCAwLHQ9dm9pZCAw O2lmKDE9PT1uLm5vZGVUeXBlKXtpZihyPW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwhZC5zdXBw b3J0Lm5vQ2xvbmVFdmVudCYmbltkLmV4cGFuZG9dKXt0PWQuX2RhdGEobik7Zm9yKHAgaW4gdC5l dmVudHMpZC5yZW1vdmVFdmVudChuLHAsdC5oYW5kbGUpO24ucmVtb3ZlQXR0cmlidXRlKGQuZXhw YW5kbyl9InNjcmlwdCI9PT1yJiZuLnRleHQhPT1mLnRleHQ/KFAobikudGV4dD1mLnRleHQsVyhu KSk6Im9iamVjdCI9PT1yPyhuLnBhcmVudE5vZGUmJihuLm91dGVySFRNTD1mLm91dGVySFRNTCks ZC5zdXBwb3J0Lmh0bWw1Q2xvbmUmJmYuaW5uZXJIVE1MJiYhZC50cmltKG4uaW5uZXJIVE1MKSYm KG4uaW5uZXJIVE1MPWYuaW5uZXJIVE1MKSk6ImlucHV0Ij09PXImJkRhLnRlc3QoZi50eXBlKT8o bi5kZWZhdWx0Q2hlY2tlZD1uLmNoZWNrZWQ9Zi5jaGVja2VkLG4udmFsdWUhPT1mLnZhbHVlJiYo bi52YWx1ZT1mLnZhbHVlKSk6Im9wdGlvbiI9PT0NCnI/bi5kZWZhdWx0U2VsZWN0ZWQ9bi5zZWxl Y3RlZD1mLmRlZmF1bHRTZWxlY3RlZDooImlucHV0Ij09PXJ8fCJ0ZXh0YXJlYSI9PT1yKSYmKG4u ZGVmYXVsdFZhbHVlPWYuZGVmYXVsdFZhbHVlKX19fWlmKGMpaWYoYil7az1rfHxEKGEpO2U9ZXx8 RChnKTtmb3IobD0wO251bGwhPShmPWtbbF0pO2wrKylOKGYsZVtsXSl9ZWxzZSBOKGEsZyk7cmV0 dXJuIGU9RChnLCJzY3JpcHQiKSwwPGUubGVuZ3RoJiZHKGUsIW0mJkQoYSwic2NyaXB0IikpLGd9 LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxjLGIsZSl7Zm9yKHZhciBmLGcsbCxrLG0sbixyLHA9 YS5sZW5ndGgsdD1NKGMpLHc9W10seD0wO3A+eDt4KyspaWYoZz1hW3hdLGd8fDA9PT1nKWlmKCJv YmplY3QiPT09ZC50eXBlKGcpKWQubWVyZ2UodyxnLm5vZGVUeXBlP1tnXTpnKTtlbHNlIGlmKHJj LnRlc3QoZykpe2s9a3x8dC5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTttPSh6 Yi5leGVjKGcpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpOw0Kcj1DW21dfHxDLl9kZWZhdWx0 O2suaW5uZXJIVE1MPXJbMV0rZy5yZXBsYWNlKHliLCJceDNjJDFceDNlXHgzYy8kMlx4M2UiKSty WzJdO2ZvcihmPXJbMF07Zi0tOylrPWsubGFzdENoaWxkO2lmKCFkLnN1cHBvcnQubGVhZGluZ1do aXRlc3BhY2UmJk9hLnRlc3QoZykmJncucHVzaChjLmNyZWF0ZVRleHROb2RlKE9hLmV4ZWMoZylb MF0pKSwhZC5zdXBwb3J0LnRib2R5KWZvcihmPShnPSJ0YWJsZSIhPT1tfHxBYi50ZXN0KGcpPyJc eDNjdGFibGVceDNlIiE9PXJbMV18fEFiLnRlc3QoZyk/MDprOmsuZmlyc3RDaGlsZCkmJmcuY2hp bGROb2Rlcy5sZW5ndGg7Zi0tOylkLm5vZGVOYW1lKG49Zy5jaGlsZE5vZGVzW2ZdLCJ0Ym9keSIp JiYhbi5jaGlsZE5vZGVzLmxlbmd0aCYmZy5yZW1vdmVDaGlsZChuKTtkLm1lcmdlKHcsay5jaGls ZE5vZGVzKTtmb3Ioay50ZXh0Q29udGVudD0iIjtrLmZpcnN0Q2hpbGQ7KWsucmVtb3ZlQ2hpbGQo ay5maXJzdENoaWxkKTtrPXQubGFzdENoaWxkfWVsc2Ugdy5wdXNoKGMuY3JlYXRlVGV4dE5vZGUo ZykpOw0KayYmdC5yZW1vdmVDaGlsZChrKTtkLnN1cHBvcnQuYXBwZW5kQ2hlY2tlZHx8ZC5ncmVw KEQodywiaW5wdXQiKSxQYik7Zm9yKHg9MDtnPXdbeCsrXTspaWYoKCFlfHwtMT09PWQuaW5BcnJh eShnLGUpKSYmKGw9ZC5jb250YWlucyhnLm93bmVyRG9jdW1lbnQsZyksaz1EKHQuYXBwZW5kQ2hp bGQoZyksInNjcmlwdCIpLGwmJkcoayksYikpZm9yKGY9MDtnPWtbZisrXTspQmIudGVzdChnLnR5 cGV8fCIiKSYmYi5wdXNoKGcpO3JldHVybiB0fSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSxjKXtmb3Io dmFyIGIsZSxmLGcsbD0wLGs9ZC5leHBhbmRvLG09ZC5jYWNoZSxuPWQuc3VwcG9ydC5kZWxldGVF eHBhbmRvLHI9ZC5ldmVudC5zcGVjaWFsO251bGwhPShiPWFbbF0pO2wrKylpZigoY3x8ZC5hY2Nl cHREYXRhKGIpKSYmKGY9YltrXSxnPWYmJm1bZl0pKXtpZihnLmV2ZW50cylmb3IoZSBpbiBnLmV2 ZW50cylyW2VdP2QuZXZlbnQucmVtb3ZlKGIsZSk6ZC5yZW1vdmVFdmVudChiLGUsZy5oYW5kbGUp Ow0KbVtmXSYmKGRlbGV0ZSBtW2ZdLG4/ZGVsZXRlIGJba106dHlwZW9mIGIucmVtb3ZlQXR0cmli dXRlIT09UT9iLnJlbW92ZUF0dHJpYnV0ZShrKTpiW2tdPW51bGwsaGEucHVzaChmKSl9fX0pO3Zh ciBtYSxYLGJhLFFhPS9hbHBoYVwoW14pXSpcKS9pLHZjPS9vcGFjaXR5XHMqPVxzKihbXildKikv LHdjPS9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyx4Yz0vXihub25lfHRhYmxlKD8hLWNbZWFd KS4rKS8sQ2I9L15tYXJnaW4vLFFiPVJlZ0V4cCgiXigiK3lhKyIpKC4qKSQiLCJpIikscWE9UmVn RXhwKCJeKCIreWErIikoPyFweClbYS16JV0rJCIsImkiKSx5Yz1SZWdFeHAoIl4oWystXSlceDNk KCIreWErIikiLCJpIiksZWI9e0JPRFk6ImJsb2NrIn0semM9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIs dmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LERiPXtsZXR0ZXJTcGFjaW5nOjAs Zm9udFdlaWdodDo0MDB9LEs9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSwNClphPVsi V2Via2l0IiwiTyIsIk1veiIsIm1zIl07ZC5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihhLGMpe3Jl dHVybiBkLmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGEsYyxiKXt2YXIgZixnPXt9LGs9MDtpZihkLmlz QXJyYXkoYykpe2Y9WChhKTtmb3IoYj1jLmxlbmd0aDtiPms7aysrKWdbY1trXV09ZC5jc3MoYSxj W2tdLCExLGYpO3JldHVybiBnfXJldHVybiBiIT09ZT9kLnN0eWxlKGEsYyxiKTpkLmNzcyhhLGMp fSxhLGMsMTxhcmd1bWVudHMubGVuZ3RoKX0sc2hvdzpmdW5jdGlvbigpe3JldHVybiAkYSh0aGlz LCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiAkYSh0aGlzKX0sdG9nZ2xlOmZ1bmN0aW9uKGEp e3ZhciBjPSJib29sZWFuIj09dHlwZW9mIGE7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeyhj P2E6ZWEodGhpcykpP2QodGhpcykuc2hvdygpOmQodGhpcykuaGlkZSgpfSl9fSk7ZC5leHRlbmQo e2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxjKXtpZihjKXt2YXIgZD0NCmJhKGEs Im9wYWNpdHkiKTtyZXR1cm4iIj09PWQ/IjEiOmR9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6 ITAsZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAs b3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQi OmQuc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rp b24oYSxjLGIsZil7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxl KXt2YXIgZyxrLGwsbT1kLmNhbWVsQ2FzZShjKSxuPWEuc3R5bGU7aWYoYz1kLmNzc1Byb3BzW21d fHwoZC5jc3NQcm9wc1ttXT1ZYShuLG0pKSxsPWQuY3NzSG9va3NbY118fGQuY3NzSG9va3NbbV0s Yj09PWUpcmV0dXJuIGwmJiJnZXQiaW4gbCYmKGc9bC5nZXQoYSwhMSxmKSkhPT1lP2c6bltjXTtp ZihrPXR5cGVvZiBiLCJzdHJpbmciPT09ayYmKGc9eWMuZXhlYyhiKSkmJg0KKGI9KGdbMV0rMSkq Z1syXStwYXJzZUZsb2F0KGQuY3NzKGEsYykpLGs9Im51bWJlciIpLCEobnVsbD09Ynx8Im51bWJl ciI9PT1rJiZpc05hTihiKXx8KCJudW1iZXIiIT09a3x8ZC5jc3NOdW1iZXJbbV18fChiKz0icHgi KSxkLnN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PWJ8fDAhPT1jLmluZGV4T2YoImJhY2tn cm91bmQiKXx8KG5bY109ImluaGVyaXQiKSxsJiYic2V0ImluIGwmJihiPWwuc2V0KGEsYixmKSk9 PT1lKSkpdHJ5e25bY109Yn1jYXRjaCh0KXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxiLGYpe3ZhciBn LGssbCxtPWQuY2FtZWxDYXNlKGMpO3JldHVybiBjPWQuY3NzUHJvcHNbbV18fChkLmNzc1Byb3Bz W21dPVlhKGEuc3R5bGUsbSkpLGw9ZC5jc3NIb29rc1tjXXx8ZC5jc3NIb29rc1ttXSxsJiYiZ2V0 ImluIGwmJihrPWwuZ2V0KGEsITAsYikpLGs9PT1lJiYoaz1iYShhLGMsZikpLCJub3JtYWwiPT09 ayYmYyBpbiBEYiYmKGs9RGJbY10pLCIiPT09Ynx8Yj8oZz0NCnBhcnNlRmxvYXQoayksITA9PT1i fHxkLmlzTnVtZXJpYyhnKT9nfHwwOmspOmt9LHN3YXA6ZnVuY3Rpb24oYSxjLGQsYil7dmFyIGUs Zj17fTtmb3IoZSBpbiBjKWZbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWNbZV07ZD1kLmFwcGx5 KGEsYnx8W10pO2ZvcihlIGluIGMpYS5zdHlsZVtlXT1mW2VdO3JldHVybiBkfX0pO2IuZ2V0Q29t cHV0ZWRTdHlsZT8oWD1mdW5jdGlvbihhKXtyZXR1cm4gYi5nZXRDb21wdXRlZFN0eWxlKGEsbnVs bCl9LGJhPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZixnLGssbD0oYj1ifHxYKGEpKT9iLmdldFByb3Bl cnR5VmFsdWUoYyl8fGJbY106ZSxtPWEuc3R5bGU7cmV0dXJuIGImJigiIiE9PWx8fGQuY29udGFp bnMoYS5vd25lckRvY3VtZW50LGEpfHwobD1kLnN0eWxlKGEsYykpLHFhLnRlc3QobCkmJkNiLnRl c3QoYykmJihmPW0ud2lkdGgsZz1tLm1pbldpZHRoLGs9bS5tYXhXaWR0aCxtLm1pbldpZHRoPW0u bWF4V2lkdGg9bS53aWR0aD1sLGw9Yi53aWR0aCwNCm0ud2lkdGg9ZixtLm1pbldpZHRoPWcsbS5t YXhXaWR0aD1rKSksbH0pOnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKFg9ZnVuY3Rp b24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxiYT1mdW5jdGlvbihhLGMsZCl7dmFyIGIsZixn O2Q9KGQ9ZHx8WChhKSk/ZFtjXTplO3ZhciBsPWEuc3R5bGU7cmV0dXJuIG51bGw9PWQmJmwmJmxb Y10mJihkPWxbY10pLHFhLnRlc3QoZCkmJiF3Yy50ZXN0KGMpJiYoYj1sLmxlZnQsZj1hLnJ1bnRp bWVTdHlsZSxnPWYmJmYubGVmdCxnJiYoZi5sZWZ0PWEuY3VycmVudFN0eWxlLmxlZnQpLGwubGVm dD0iZm9udFNpemUiPT09Yz8iMWVtIjpkLGQ9bC5waXhlbExlZnQrInB4IixsLmxlZnQ9YixnJiYo Zi5sZWZ0PWcpKSwiIj09PWQ/ImF1dG8iOmR9KTtkLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1 bmN0aW9uKGEsYyl7ZC5jc3NIb29rc1tjXT17Z2V0OmZ1bmN0aW9uKGEsYixmKXtyZXR1cm4gYj8w PT09YS5vZmZzZXRXaWR0aCYmeGMudGVzdChkLmNzcyhhLA0KImRpc3BsYXkiKSk/ZC5zd2FwKGEs emMsZnVuY3Rpb24oKXtyZXR1cm4gZGIoYSxjLGYpfSk6ZGIoYSxjLGYpOmV9LHNldDpmdW5jdGlv bihhLGIsZSl7dmFyIGY9ZSYmWChhKTtyZXR1cm4gYmIoYSxiLGU/Y2IoYSxjLGUsZC5zdXBwb3J0 LmJveFNpemluZyYmImJvcmRlci1ib3giPT09ZC5jc3MoYSwiYm94U2l6aW5nIiwhMSxmKSxmKTow KX19fSk7ZC5zdXBwb3J0Lm9wYWNpdHl8fChkLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlv bihhLGMpe3JldHVybiB2Yy50ZXN0KChjJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5m aWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/MC4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6 Yz8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGMpe3ZhciBiPWEuc3R5bGUsZT1hLmN1cnJlbnRTdHls ZSxmPWQuaXNOdW1lcmljKGMpPyJhbHBoYShvcGFjaXR5XHgzZCIrMTAwKmMrIikiOiIiLGc9ZSYm ZS5maWx0ZXJ8fGIuZmlsdGVyfHwiIjtiLnpvb209DQoxOygxPD1jfHwiIj09PWMpJiYiIj09PWQu dHJpbShnLnJlcGxhY2UoUWEsIiIpKSYmYi5yZW1vdmVBdHRyaWJ1dGUmJihiLnJlbW92ZUF0dHJp YnV0ZSgiZmlsdGVyIiksIiI9PT1jfHxlJiYhZS5maWx0ZXIpfHwoYi5maWx0ZXI9UWEudGVzdChn KT9nLnJlcGxhY2UoUWEsZik6ZysiICIrZil9fSk7ZChmdW5jdGlvbigpe2Quc3VwcG9ydC5yZWxp YWJsZU1hcmdpblJpZ2h0fHwoZC5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGEs Yyl7cmV0dXJuIGM/ZC5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGJhLFthLCJtYXJn aW5SaWdodCJdKTplfX0pOyFkLnN1cHBvcnQucGl4ZWxQb3NpdGlvbiYmZC5mbi5wb3NpdGlvbiYm ZC5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYyl7ZC5jc3NIb29rc1tjXT17Z2V0OmZ1 bmN0aW9uKGEsYil7cmV0dXJuIGI/KGI9YmEoYSxjKSxxYS50ZXN0KGIpP2QoYSkucG9zaXRpb24o KVtjXSsicHgiOmIpOmV9fX0pfSk7DQpkLmV4cHImJmQuZXhwci5maWx0ZXJzJiYoZC5leHByLmZp bHRlcnMuaGlkZGVuPWZ1bmN0aW9uKGEpe3JldHVybiAwPj1hLm9mZnNldFdpZHRoJiYwPj1hLm9m ZnNldEhlaWdodHx8IWQuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJiJub25lIj09PShh LnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGQuY3NzKGEsImRpc3BsYXkiKSl9LGQuZXhwci5maWx0 ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWQuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0p O2QuZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGEs Yyl7ZC5jc3NIb29rc1thK2NdPXtleHBhbmQ6ZnVuY3Rpb24oZCl7dmFyIGI9MCxlPXt9O2Zvcihk PSJzdHJpbmciPT10eXBlb2YgZD9kLnNwbGl0KCIgIik6W2RdOzQ+YjtiKyspZVthK0tbYl0rY109 ZFtiXXx8ZFtiLTJdfHxkWzBdO3JldHVybiBlfX07Q2IudGVzdChhKXx8KGQuY3NzSG9va3NbYStj XS5zZXQ9YmIpfSk7DQp2YXIgQWM9LyUyMC9nLFJiPS9cW1xdJC8sRWI9L1xyP1xuL2csQmM9L14o PzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLENjPS9eKD86aW5wdXR8c2VsZWN0 fHRleHRhcmVhfGtleWdlbikvaTtkLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0 dXJuIGQucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rp b24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1kLnByb3AodGhpcywiZWxlbWVu dHMiKTtyZXR1cm4gYT9kLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFy IGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFkKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYm Q2MudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUJjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFEYS50 ZXN0KGEpKX0pLm1hcChmdW5jdGlvbihhLGMpe3ZhciBiPWQodGhpcykudmFsKCk7cmV0dXJuIG51 bGw9PQ0KYj9udWxsOmQuaXNBcnJheShiKT9kLm1hcChiLGZ1bmN0aW9uKGEpe3JldHVybntuYW1l OmMubmFtZSx2YWx1ZTphLnJlcGxhY2UoRWIsIlxyXG4iKX19KTp7bmFtZTpjLm5hbWUsdmFsdWU6 Yi5yZXBsYWNlKEViLCJcclxuIil9fSkuZ2V0KCl9fSk7ZC5wYXJhbT1mdW5jdGlvbihhLGMpe3Zh ciBiLGY9W10sZz1mdW5jdGlvbihhLGMpe2M9ZC5pc0Z1bmN0aW9uKGMpP2MoKTpudWxsPT1jPyIi OmM7ZltmLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyJceDNkIitlbmNvZGVVUklDb21w b25lbnQoYyl9O2lmKGM9PT1lJiYoYz1kLmFqYXhTZXR0aW5ncyYmZC5hamF4U2V0dGluZ3MudHJh ZGl0aW9uYWwpLGQuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFkLmlzUGxhaW5PYmplY3QoYSkpZC5l YWNoKGEsZnVuY3Rpb24oKXtnKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGIgaW4g YSlFYShiLGFbYl0sYyxnKTtyZXR1cm4gZi5qb2luKCJceDI2IikucmVwbGFjZShBYywiKyIpfTsN CmQuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1 bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3Zl ciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5 ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlv bihhLGMpe2QuZm5bY109ZnVuY3Rpb24oYSxkKXtyZXR1cm4gMDxhcmd1bWVudHMubGVuZ3RoP3Ro aXMub24oYyxudWxsLGEsZCk6dGhpcy50cmlnZ2VyKGMpfX0pO2QuZm4uaG92ZXI9ZnVuY3Rpb24o YSxjKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoY3x8YSl9O3ZhciBnYSxk YSxSYT1kLm5vdygpLFNhPS9cPy8sRGM9LyMuKiQvLEZiPS8oWz8mXSlfPVteJl0qLyxFYz0vXigu Kj8pOlsgXHRdKihbXlxyXG5dKilccj8kL2dtLEZjPS9eKD86R0VUfEhFQUQpJC8sDQpHYz0vXlwv XC8vLEdiPS9eKFtcdy4rLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLyxIYj1k LmZuLmxvYWQsSWI9e30sRmE9e30sSmI9IiovIi5jb25jYXQoIioiKTt0cnl7ZGE9VWIuaHJlZn1j YXRjaChMYyl7ZGE9dC5jcmVhdGVFbGVtZW50KCJhIiksZGEuaHJlZj0iIixkYT1kYS5ocmVmfWdh PUdiLmV4ZWMoZGEudG9Mb3dlckNhc2UoKSl8fFtdO2QuZm4ubG9hZD1mdW5jdGlvbihhLGMsYil7 aWYoInN0cmluZyIhPXR5cGVvZiBhJiZIYilyZXR1cm4gSGIuYXBwbHkodGhpcyxhcmd1bWVudHMp O3ZhciBmLGcsayxsPXRoaXMsbT1hLmluZGV4T2YoIiAiKTtyZXR1cm4gMDw9bSYmKGY9YS5zbGlj ZShtLGEubGVuZ3RoKSxhPWEuc2xpY2UoMCxtKSksZC5pc0Z1bmN0aW9uKGMpPyhiPWMsYz1lKTpj JiYib2JqZWN0Ij09dHlwZW9mIGMmJihrPSJQT1NUIiksMDxsLmxlbmd0aCYmZC5hamF4KHt1cmw6 YSx0eXBlOmssZGF0YVR5cGU6Imh0bWwiLGRhdGE6Y30pLmRvbmUoZnVuY3Rpb24oYSl7Zz0NCmFy Z3VtZW50cztsLmh0bWwoZj9kKCJceDNjZGl2XHgzZSIpLmFwcGVuZChkLnBhcnNlSFRNTChhKSku ZmluZChmKTphKX0pLmNvbXBsZXRlKGImJmZ1bmN0aW9uKGEsYyl7bC5lYWNoKGIsZ3x8W2EucmVz cG9uc2VUZXh0LGMsYV0pfSksdGhpc307ZC5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENv bXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlv bihhLGMpe2QuZm5bY109ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYyxhKX19KTtkLmVhY2go WyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtkW2NdPWZ1bmN0aW9uKGEsYixmLGcpe3JldHVy biBkLmlzRnVuY3Rpb24oYikmJihnPWd8fGYsZj1iLGI9ZSksZC5hamF4KHt1cmw6YSx0eXBlOmMs ZGF0YVR5cGU6ZyxkYXRhOmIsc3VjY2VzczpmfSl9fSk7ZC5leHRlbmQoe2FjdGl2ZTowLGxhc3RN b2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOmRhLHR5cGU6IkdFVCIsDQppc0xv Y2FsOi9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRn ZXQpOiQvLnRlc3QoZ2FbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250 ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0XHgzZFVU Ri04IixhY2NlcHRzOnsiKiI6SmIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4 bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRl eHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNv bi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQi fSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpiLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29u IjpkLnBhcnNlSlNPTiwidGV4dCB4bWwiOmQucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAs DQpjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/R2EoR2EoYSxk LmFqYXhTZXR0aW5ncyksYyk6R2EoZC5hamF4U2V0dGluZ3MsYSl9LGFqYXhQcmVmaWx0ZXI6Z2Io SWIpLGFqYXhUcmFuc3BvcnQ6Z2IoRmEpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBiKGEs YyxmLGcpe3ZhciBoLHMscSxyLHksej1jO2lmKDIhPT1DKXtDPTI7bSYmY2xlYXJUaW1lb3V0KG0p O3Q9ZTtsPWd8fCIiO0EucmVhZHlTdGF0ZT0wPGE/NDowO2lmKGYpe3I9cDtnPUE7dmFyIEIsRCxG LEwsRT1yLmNvbnRlbnRzLEo9ci5kYXRhVHlwZXMsSD1yLnJlc3BvbnNlRmllbGRzO2ZvcihMIGlu IEgpTCBpbiBmJiYoZ1tIW0xdXT1mW0xdKTtmb3IoOyIqIj09PUpbMF07KUouc2hpZnQoKSxEPT09 ZSYmKEQ9ci5taW1lVHlwZXx8Zy5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lm KEQpZm9yKEwgaW4gRSlpZihFW0xdJiZFW0xdLnRlc3QoRCkpe0oudW5zaGlmdChMKTsNCmJyZWFr fWlmKEpbMF1pbiBmKUY9SlswXTtlbHNle2ZvcihMIGluIGYpe2lmKCFKWzBdfHxyLmNvbnZlcnRl cnNbTCsiICIrSlswXV0pe0Y9TDticmVha31CfHwoQj1MKX1GPUZ8fEJ9cj1GPyhGIT09SlswXSYm Si51bnNoaWZ0KEYpLGZbRl0pOmV9aWYoMjAwPD1hJiYzMDA+YXx8MzA0PT09YSlpZihwLmlmTW9k aWZpZWQmJih5PUEuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx5JiYoZC5sYXN0 TW9kaWZpZWRba109eSkseT1BLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikseSYmKGQuZXRhZ1tr XT15KSksMjA0PT09YSloPSEwLHo9Im5vY29udGVudCI7ZWxzZSBpZigzMDQ9PT1hKWg9ITAsej0i bm90bW9kaWZpZWQiO2Vsc2V7dmFyIEk7YTp7Zj1wO2g9cjt2YXIgRyxOO3E9e307eT0wO3o9Zi5k YXRhVHlwZXMuc2xpY2UoKTtCPXpbMF07aWYoZi5kYXRhRmlsdGVyJiYoaD1mLmRhdGFGaWx0ZXIo aCxmLmRhdGFUeXBlKSkselsxXSlmb3IoRyBpbiBmLmNvbnZlcnRlcnMpcVtHLnRvTG93ZXJDYXNl KCldPQ0KZi5jb252ZXJ0ZXJzW0ddO2Zvcig7cz16WysreV07KWlmKCIqIiE9PXMpe2lmKCIqIiE9 PUImJkIhPT1zKXtpZihHPXFbQisiICIrc118fHFbIiogIitzXSwhRylmb3IoSSBpbiBxKWlmKE49 SS5zcGxpdCgiICIpLE5bMV09PT1zJiYoRz1xW0IrIiAiK05bMF1dfHxxWyIqICIrTlswXV0pKXsh MD09PUc/Rz1xW0ldOiEwIT09cVtJXSYmKHM9TlswXSx6LnNwbGljZSh5LS0sMCxzKSk7YnJlYWt9 aWYoITAhPT1HKWlmKEcmJmZbInRocm93cyJdKWg9RyhoKTtlbHNlIHRyeXtoPUcoaCl9Y2F0Y2go Syl7ST17c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjpHP0s6Ik5vIGNvbnZlcnNpb24gZnJvbSAi K0IrIiB0byAiK3N9O2JyZWFrIGF9fUI9c31JPXtzdGF0ZToic3VjY2VzcyIsZGF0YTpofX1oPUk7 ej1oLnN0YXRlO3M9aC5kYXRhO3E9aC5lcnJvcjtoPSFxfWVsc2UgcT16LChhfHwheikmJih6PSJl cnJvciIsMD5hJiYoYT0wKSk7QS5zdGF0dXM9YTtBLnN0YXR1c1RleHQ9KGN8fHopKyIiOw0KaD9Q LnJlc29sdmVXaXRoKHcsW3MseixBXSk6UC5yZWplY3RXaXRoKHcsW0EseixxXSk7QS5zdGF0dXND b2RlKFcpO1c9ZTtuJiZ4LnRyaWdnZXIoaD8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtBLHAs aD9zOnFdKTtNLmZpcmVXaXRoKHcsW0Esel0pO24mJih4LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIs W0EscF0pLC0tZC5hY3RpdmV8fGQuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSl9fSJvYmplY3Qi PT10eXBlb2YgYSYmKGM9YSxhPWUpO2M9Y3x8e307dmFyIGYsZyxrLGwsbSxuLHQscixwPWQuYWph eFNldHVwKHt9LGMpLHc9cC5jb250ZXh0fHxwLHg9cC5jb250ZXh0JiYody5ub2RlVHlwZXx8dy5q cXVlcnkpP2Qodyk6ZC5ldmVudCxQPWQuRGVmZXJyZWQoKSxNPWQuQ2FsbGJhY2tzKCJvbmNlIG1l bW9yeSIpLFc9cC5zdGF0dXNDb2RlfHx7fSx6PXt9LEI9e30sQz0wLEQ9ImNhbmNlbGVkIixBPXty ZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGM7DQppZigyPT09 Qyl7aWYoIXIpZm9yKHI9e307Yz1FYy5leGVjKGwpOylyW2NbMV0udG9Mb3dlckNhc2UoKV09Y1sy XTtjPXJbYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09Yz9udWxsOmN9LGdldEFsbFJlc3Bv bnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09Qz9sOm51bGx9LHNldFJlcXVlc3RIZWFk ZXI6ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnRvTG93ZXJDYXNlKCk7cmV0dXJuIEN8fChhPUJbZF09 QltkXXx8YSx6W2FdPWMpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJu IEN8fChwLm1pbWVUeXBlPWEpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oYSl7dmFyIGM7aWYo YSlpZigyPkMpZm9yKGMgaW4gYSlXW2NdPVtXW2NdLGFbY11dO2Vsc2UgQS5hbHdheXMoYVtBLnN0 YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXthPWF8fEQ7cmV0dXJuIHQmJnQu YWJvcnQoYSksYigwLGEpLHRoaXN9fTtpZihQLnByb21pc2UoQSkuY29tcGxldGU9DQpNLmFkZCxB LnN1Y2Nlc3M9QS5kb25lLEEuZXJyb3I9QS5mYWlsLHAudXJsPSgoYXx8cC51cmx8fGRhKSsiIiku cmVwbGFjZShEYywiIikucmVwbGFjZShHYyxnYVsxXSsiLy8iKSxwLnR5cGU9Yy5tZXRob2R8fGMu dHlwZXx8cC5tZXRob2R8fHAudHlwZSxwLmRhdGFUeXBlcz1kLnRyaW0ocC5kYXRhVHlwZXx8Iioi KS50b0xvd2VyQ2FzZSgpLm1hdGNoKFMpfHxbIiJdLG51bGw9PXAuY3Jvc3NEb21haW4mJihmPUdi LmV4ZWMocC51cmwudG9Mb3dlckNhc2UoKSkscC5jcm9zc0RvbWFpbj0hKCFmfHxmWzFdPT09Z2Fb MV0mJmZbMl09PT1nYVsyXSYmKGZbM118fCgiaHR0cDoiPT09ZlsxXT84MDo0NDMpKT09KGdhWzNd fHwoImh0dHA6Ij09PWdhWzFdPzgwOjQ0MykpKSkscC5kYXRhJiZwLnByb2Nlc3NEYXRhJiYic3Ry aW5nIiE9dHlwZW9mIHAuZGF0YSYmKHAuZGF0YT1kLnBhcmFtKHAuZGF0YSxwLnRyYWRpdGlvbmFs KSksaGIoSWIscCxjLEEpLDI9PT1DKXJldHVybiBBOyhuPXAuZ2xvYmFsKSYmDQowPT09ZC5hY3Rp dmUrKyYmZC5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtwLnR5cGU9cC50eXBlLnRvVXBwZXJD YXNlKCk7cC5oYXNDb250ZW50PSFGYy50ZXN0KHAudHlwZSk7az1wLnVybDtwLmhhc0NvbnRlbnR8 fChwLmRhdGEmJihrPXAudXJsKz0oU2EudGVzdChrKT8iXHgyNiI6Ij8iKStwLmRhdGEsZGVsZXRl IHAuZGF0YSksITE9PT1wLmNhY2hlJiYocC51cmw9RmIudGVzdChrKT9rLnJlcGxhY2UoRmIsIiQx X1x4M2QiK1JhKyspOmsrKFNhLnRlc3Qoayk/Ilx4MjYiOiI/IikrIl9ceDNkIitSYSsrKSk7cC5p Zk1vZGlmaWVkJiYoZC5sYXN0TW9kaWZpZWRba10mJkEuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9k aWZpZWQtU2luY2UiLGQubGFzdE1vZGlmaWVkW2tdKSxkLmV0YWdba10mJkEuc2V0UmVxdWVzdEhl YWRlcigiSWYtTm9uZS1NYXRjaCIsZC5ldGFnW2tdKSk7KHAuZGF0YSYmcC5oYXNDb250ZW50JiYh MSE9PXAuY29udGVudFR5cGV8fGMuY29udGVudFR5cGUpJiYNCkEuc2V0UmVxdWVzdEhlYWRlcigi Q29udGVudC1UeXBlIixwLmNvbnRlbnRUeXBlKTtBLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIs cC5kYXRhVHlwZXNbMF0mJnAuYWNjZXB0c1twLmRhdGFUeXBlc1swXV0/cC5hY2NlcHRzW3AuZGF0 YVR5cGVzWzBdXSsoIioiIT09cC5kYXRhVHlwZXNbMF0/IiwgIitKYisiOyBxXHgzZDAuMDEiOiIi KTpwLmFjY2VwdHNbIioiXSk7Zm9yKGcgaW4gcC5oZWFkZXJzKUEuc2V0UmVxdWVzdEhlYWRlcihn LHAuaGVhZGVyc1tnXSk7aWYocC5iZWZvcmVTZW5kJiYoITE9PT1wLmJlZm9yZVNlbmQuY2FsbCh3 LEEscCl8fDI9PT1DKSlyZXR1cm4gQS5hYm9ydCgpO0Q9ImFib3J0Ijtmb3IoZyBpbntzdWNjZXNz OjEsZXJyb3I6MSxjb21wbGV0ZToxfSlBW2ddKHBbZ10pO2lmKHQ9aGIoRmEscCxjLEEpKXtBLnJl YWR5U3RhdGU9MTtuJiZ4LnRyaWdnZXIoImFqYXhTZW5kIixbQSxwXSk7cC5hc3luYyYmMDxwLnRp bWVvdXQmJihtPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtBLmFib3J0KCJ0aW1lb3V0Iil9LA0KcC50 aW1lb3V0KSk7dHJ5e0M9MSx0LnNlbmQoeixiKX1jYXRjaCh5KXtpZighKDI+QykpdGhyb3cgeTti KC0xLHkpfX1lbHNlIGIoLTEsIk5vIFRyYW5zcG9ydCIpO3JldHVybiBBfSxnZXRTY3JpcHQ6ZnVu Y3Rpb24oYSxjKXtyZXR1cm4gZC5nZXQoYSxlLGMsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9u KGEsYyxiKXtyZXR1cm4gZC5nZXQoYSxjLGIsImpzb24iKX19KTtkLmFqYXhTZXR1cCh7YWNjZXB0 czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxp Y2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntz Y3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1 bmN0aW9uKGEpe3JldHVybiBkLmdsb2JhbEV2YWwoYSksYX19fSk7ZC5hamF4UHJlZmlsdGVyKCJz Y3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1lJiYoYS5jYWNoZT0hMSk7DQphLmNyb3NzRG9t YWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pO2QuYWpheFRyYW5zcG9ydCgic2NyaXB0 IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYyxiPXQuaGVhZHx8ZCgiaGVhZCIp WzBdfHx0LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2M9dC5jcmVh dGVFbGVtZW50KCJzY3JpcHQiKTtjLmFzeW5jPSEwO2Euc2NyaXB0Q2hhcnNldCYmKGMuY2hhcnNl dD1hLnNjcmlwdENoYXJzZXQpO2Muc3JjPWEudXJsO2Mub25sb2FkPWMub25yZWFkeXN0YXRlY2hh bmdlPWZ1bmN0aW9uKGEsZCl7KGR8fCFjLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRl c3QoYy5yZWFkeVN0YXRlKSkmJihjLm9ubG9hZD1jLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGMu cGFyZW50Tm9kZSYmYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpLGM9bnVsbCxkfHxlKDIwMCwi c3VjY2VzcyIpKX07Yi5pbnNlcnRCZWZvcmUoYyxiLmZpcnN0Q2hpbGQpfSwNCmFib3J0OmZ1bmN0 aW9uKCl7YyYmYy5vbmxvYWQoZSwhMCl9fX19KTt2YXIgS2I9W10sVGE9Lyg9KVw/KD89JnwkKXxc P1w/LztkLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9u KCl7dmFyIGE9S2IucG9wKCl8fGQuZXhwYW5kbysiXyIrUmErKztyZXR1cm4gdGhpc1thXT0hMCxh fX0pO2QuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYSxjLGYpe3ZhciBnLGss bSxsPSExIT09YS5qc29ucCYmKFRhLnRlc3QoYS51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2Yg YS5kYXRhJiYhKGEuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1m b3JtLXVybGVuY29kZWQiKSYmVGEudGVzdChhLmRhdGEpJiYiZGF0YSIpO3JldHVybiBsfHwianNv bnAiPT09YS5kYXRhVHlwZXNbMF0/KGc9YS5qc29ucENhbGxiYWNrPWQuaXNGdW5jdGlvbihhLmpz b25wQ2FsbGJhY2spP2EuanNvbnBDYWxsYmFjaygpOmEuanNvbnBDYWxsYmFjaywNCmw/YVtsXT1h W2xdLnJlcGxhY2UoVGEsIiQxIitnKTohMSE9PWEuanNvbnAmJihhLnVybCs9KFNhLnRlc3QoYS51 cmwpPyJceDI2IjoiPyIpK2EuanNvbnArIlx4M2QiK2cpLGEuY29udmVydGVyc1sic2NyaXB0IGpz b24iXT1mdW5jdGlvbigpe3JldHVybiBtfHxkLmVycm9yKGcrIiB3YXMgbm90IGNhbGxlZCIpLG1b MF19LGEuZGF0YVR5cGVzWzBdPSJqc29uIixrPWJbZ10sYltnXT1mdW5jdGlvbigpe209YXJndW1l bnRzfSxmLmFsd2F5cyhmdW5jdGlvbigpe2JbZ109azthW2ddJiYoYS5qc29ucENhbGxiYWNrPWMu anNvbnBDYWxsYmFjayxLYi5wdXNoKGcpKTttJiZkLmlzRnVuY3Rpb24oaykmJmsobVswXSk7bT1r PWV9KSwic2NyaXB0Iik6ZX0pO3ZhciBhYSxwYSxIYz0wLFVhPWIuQWN0aXZlWE9iamVjdCYmZnVu Y3Rpb24oKXtmb3IodmFyIGEgaW4gYWEpYWFbYV0oZSwhMCl9O2QuYWpheFNldHRpbmdzLnhocj1i LkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXt2YXIgYTtpZighKGE9DQohdGhpcy5pc0xvY2FsJiZp YigpKSlhOnt0cnl7YT1uZXcgYi5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpO2Jy ZWFrIGF9Y2F0Y2goYyl7fWE9dm9pZCAwfXJldHVybiBhfTppYjtwYT1kLmFqYXhTZXR0aW5ncy54 aHIoKTtkLnN1cHBvcnQuY29ycz0hIXBhJiYid2l0aENyZWRlbnRpYWxzImluIHBhOyhwYT1kLnN1 cHBvcnQuYWpheD0hIXBhKSYmZC5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3Nz RG9tYWlufHxkLnN1cHBvcnQuY29ycyl7dmFyIGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXt2 YXIgayxtLGw9YS54aHIoKTtpZihhLnVzZXJuYW1lP2wub3BlbihhLnR5cGUsYS51cmwsYS5hc3lu YyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpOmwub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyksYS54 aHJGaWVsZHMpZm9yKG0gaW4gYS54aHJGaWVsZHMpbFttXT1hLnhockZpZWxkc1ttXTthLm1pbWVU eXBlJiZsLm92ZXJyaWRlTWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZShhLm1pbWVUeXBlKTsN CmEuY3Jvc3NEb21haW58fGZbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGZbIlgtUmVxdWVzdGVkLVdp dGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKG0gaW4gZilsLnNldFJlcXVlc3RIZWFkZXIo bSxmW21dKX1jYXRjaChuKXt9bC5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKTtjPWZ1 bmN0aW9uKGIsZil7dmFyIGgsbSx1LG47dHJ5e2lmKGMmJihmfHw0PT09bC5yZWFkeVN0YXRlKSlp ZihjPWUsayYmKGwub25yZWFkeXN0YXRlY2hhbmdlPWQubm9vcCxVYSYmZGVsZXRlIGFhW2tdKSxm KTQhPT1sLnJlYWR5U3RhdGUmJmwuYWJvcnQoKTtlbHNle249e307aD1sLnN0YXR1czttPWwuZ2V0 QWxsUmVzcG9uc2VIZWFkZXJzKCk7InN0cmluZyI9PXR5cGVvZiBsLnJlc3BvbnNlVGV4dCYmKG4u dGV4dD1sLnJlc3BvbnNlVGV4dCk7dHJ5e3U9bC5zdGF0dXNUZXh0fWNhdGNoKHYpe3U9IiJ9aHx8 IWEuaXNMb2NhbHx8YS5jcm9zc0RvbWFpbj8xMjIzPT09aCYmKGg9MjA0KTpoPQ0Kbi50ZXh0PzIw MDo0MDR9fWNhdGNoKHQpe2Z8fGcoLTEsdCl9biYmZyhoLHUsbixtKX07YS5hc3luYz80PT09bC5y ZWFkeVN0YXRlP3NldFRpbWVvdXQoYyk6KGs9KytIYyxVYSYmKGFhfHwoYWE9e30sZChiKS51bmxv YWQoVWEpKSxhYVtrXT1jKSxsLm9ucmVhZHlzdGF0ZWNoYW5nZT1jKTpjKCl9LGFib3J0OmZ1bmN0 aW9uKCl7YyYmYyhlLCEwKX19fX0pO3ZhciBpYSxCYSxJYz0vXig/OnRvZ2dsZXxzaG93fGhpZGUp JC8sSmM9UmVnRXhwKCJeKD86KFsrLV0pXHgzZHwpKCIreWErIikoW2EteiVdKikkIiwiaSIpLEtj PS9xdWV1ZUhvb2tzJC8scmE9W2Z1bmN0aW9uKGEsYyxiKXt2YXIgZSxmLGcsbCxrLG0sbj10aGlz LHI9YS5zdHlsZSxwPXt9LHQ9W10sdz1hLm5vZGVUeXBlJiZlYShhKTtiLnF1ZXVlfHwoaz1kLl9x dWV1ZUhvb2tzKGEsImZ4IiksbnVsbD09ay51bnF1ZXVlZCYmKGsudW5xdWV1ZWQ9MCxtPWsuZW1w dHkuZmlyZSxrLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtrLnVucXVldWVkfHwNCm0oKX0pLGsudW5x dWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7ay51bnF1ZXVl ZC0tO2QucXVldWUoYSwiZngiKS5sZW5ndGh8fGsuZW1wdHkuZmlyZSgpfSl9KSk7MT09PWEubm9k ZVR5cGUmJigiaGVpZ2h0ImluIGN8fCJ3aWR0aCJpbiBjKSYmKGIub3ZlcmZsb3c9W3Iub3ZlcmZs b3csci5vdmVyZmxvd1gsci5vdmVyZmxvd1ldLCJpbmxpbmUiPT09ZC5jc3MoYSwiZGlzcGxheSIp JiYibm9uZSI9PT1kLmNzcyhhLCJmbG9hdCIpJiYoZC5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNM YXlvdXQmJiJpbmxpbmUiIT09YWIoYS5ub2RlTmFtZSk/ci56b29tPTE6ci5kaXNwbGF5PSJpbmxp bmUtYmxvY2siKSk7Yi5vdmVyZmxvdyYmKHIub3ZlcmZsb3c9ImhpZGRlbiIsZC5zdXBwb3J0LnNo cmlua1dyYXBCbG9ja3N8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7ci5vdmVyZmxvdz1iLm92ZXJmbG93 WzBdO3Iub3ZlcmZsb3dYPWIub3ZlcmZsb3dbMV07ci5vdmVyZmxvd1k9DQpiLm92ZXJmbG93WzJd fSkpO2ZvcihmIGluIGMpaWYoZz1jW2ZdLEljLmV4ZWMoZykpKGRlbGV0ZSBjW2ZdLGU9ZXx8InRv Z2dsZSI9PT1nLGc9PT0odz8iaGlkZSI6InNob3ciKSl8fHQucHVzaChmKTtpZihjPXQubGVuZ3Ro KXtnPWQuX2RhdGEoYSwiZnhzaG93Iil8fGQuX2RhdGEoYSwiZnhzaG93Iix7fSk7ImhpZGRlbiJp biBnJiYodz1nLmhpZGRlbik7ZSYmKGcuaGlkZGVuPSF3KTt3P2QoYSkuc2hvdygpOm4uZG9uZShm dW5jdGlvbigpe2QoYSkuaGlkZSgpfSk7bi5kb25lKGZ1bmN0aW9uKCl7dmFyIGM7ZC5fcmVtb3Zl RGF0YShhLCJmeHNob3ciKTtmb3IoYyBpbiBwKWQuc3R5bGUoYSxjLHBbY10pfSk7Zm9yKGY9MDtj PmY7ZisrKWU9dFtmXSxsPW4uY3JlYXRlVHdlZW4oZSx3P2dbZV06MCkscFtlXT1nW2VdfHxkLnN0 eWxlKGEsZSksZSBpbiBnfHwoZ1tlXT1sLnN0YXJ0LHcmJihsLmVuZD1sLnN0YXJ0LGwuc3RhcnQ9 IndpZHRoIj09PWV8fCJoZWlnaHQiPT09ZT8xOjApKX19XSwNCm5hPXsiKiI6W2Z1bmN0aW9uKGEs Yyl7dmFyIGIsZSxmPXRoaXMuY3JlYXRlVHdlZW4oYSxjKSxnPUpjLmV4ZWMoYyksaz1mLmN1cigp LG09K2t8fDAsbj0xLHQ9MjA7aWYoZyl7aWYoYj0rZ1syXSxlPWdbM118fChkLmNzc051bWJlclth XT8iIjoicHgiKSwicHgiIT09ZSYmbSl7bT1kLmNzcyhmLmVsZW0sYSwhMCl8fGJ8fDE7ZG8gbj1u fHwiLjUiLG0vPW4sZC5zdHlsZShmLmVsZW0sYSxtK2UpO3doaWxlKG4hPT0obj1mLmN1cigpL2sp JiYxIT09biYmLS10KX1mLnVuaXQ9ZTtmLnN0YXJ0PW07Zi5lbmQ9Z1sxXT9tKyhnWzFdKzEpKmI6 Yn1yZXR1cm4gZn1dfTtkLkFuaW1hdGlvbj1kLmV4dGVuZChrYix7dHdlZW5lcjpmdW5jdGlvbihh LGMpe2QuaXNGdW5jdGlvbihhKT8oYz1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIg YixlPTAsZj1hLmxlbmd0aDtmPmU7ZSsrKWI9YVtlXSxuYVtiXT1uYVtiXXx8W10sbmFbYl0udW5z aGlmdChjKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsDQpjKXtjP3JhLnVuc2hpZnQoYSk6cmEucHVz aChhKX19KTtkLlR3ZWVuPUI7Qi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkIsaW5pdDpmdW5jdGlv bihhLGMsYixlLGYsZyl7dGhpcy5lbGVtPWE7dGhpcy5wcm9wPWI7dGhpcy5lYXNpbmc9Znx8InN3 aW5nIjt0aGlzLm9wdGlvbnM9Yzt0aGlzLnN0YXJ0PXRoaXMubm93PXRoaXMuY3VyKCk7dGhpcy5l bmQ9ZTt0aGlzLnVuaXQ9Z3x8KGQuY3NzTnVtYmVyW2JdPyIiOiJweCIpfSxjdXI6ZnVuY3Rpb24o KXt2YXIgYT1CLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlz KTpCLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYyxi PUIucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMucG9zPWM9dGhpcy5vcHRpb25zLmR1 cmF0aW9uP2QuZWFzaW5nW3RoaXMuZWFzaW5nXShhLHRoaXMub3B0aW9ucy5kdXJhdGlvbiphLDAs MSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOg0KYSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFy dCkqYyt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxs KHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxiJiZiLnNldD9iLnNldCh0aGlzKTpCLnByb3BIb29r cy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319O0IucHJvdG90eXBlLmluaXQucHJvdG90eXBlPUIu cHJvdG90eXBlO0IucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjO3Jl dHVybiBudWxsPT1hLmVsZW1bYS5wcm9wXXx8YS5lbGVtLnN0eWxlJiZudWxsIT1hLmVsZW0uc3R5 bGVbYS5wcm9wXT8oYz1kLmNzcyhhLmVsZW0sYS5wcm9wLCIiKSxjJiYiYXV0byIhPT1jP2M6MCk6 YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXtkLmZ4LnN0ZXBbYS5wcm9wXT9kLmZ4LnN0 ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihudWxsIT1hLmVsZW0uc3R5bGVbZC5jc3NQcm9w c1thLnByb3BdXXx8ZC5jc3NIb29rc1thLnByb3BdKT8NCmQuc3R5bGUoYS5lbGVtLGEucHJvcCxh Lm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19O0IucHJvcEhvb2tzLnNjcm9sbFRv cD1CLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBl JiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19O2QuZWFjaChbInRv Z2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oYSxjKXt2YXIgYj1kLmZuW2NdO2QuZm5bY109 ZnVuY3Rpb24oYSxkLGUpe3JldHVybiBudWxsPT1hfHwiYm9vbGVhbiI9PXR5cGVvZiBhP2IuYXBw bHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZSh1YShjLCEwKSxhLGQsZSl9fSk7ZC5mbi5l eHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGMsZCxiKXtyZXR1cm4gdGhpcy5maWx0ZXIoZWEpLmNz cygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Y30sYSxkLGIpfSxh bmltYXRlOmZ1bmN0aW9uKGEsYyxiLA0KZSl7dmFyIGY9ZC5pc0VtcHR5T2JqZWN0KGEpLGc9ZC5z cGVlZChjLGIsZSksaz1mdW5jdGlvbigpe3ZhciBjPWtiKHRoaXMsZC5leHRlbmQoe30sYSksZyk7 ay5maW5pc2g9ZnVuY3Rpb24oKXtjLnN0b3AoITApfTsoZnx8ZC5fZGF0YSh0aGlzLCJmaW5pc2gi KSkmJmMuc3RvcCghMCl9O3JldHVybiBrLmZpbmlzaD1rLGZ8fCExPT09Zy5xdWV1ZT90aGlzLmVh Y2goayk6dGhpcy5xdWV1ZShnLnF1ZXVlLGspfSxzdG9wOmZ1bmN0aW9uKGEsYyxiKXt2YXIgZj1m dW5jdGlvbihhKXt2YXIgYz1hLnN0b3A7ZGVsZXRlIGEuc3RvcDtjKGIpfTtyZXR1cm4ic3RyaW5n IiE9dHlwZW9mIGEmJihiPWMsYz1hLGE9ZSksYyYmITEhPT1hJiZ0aGlzLnF1ZXVlKGF8fCJmeCIs W10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29r cyIsZz1kLnRpbWVycyxrPWQuX2RhdGEodGhpcyk7aWYoZSlrW2VdJiZrW2VdLnN0b3AmJmYoa1tl XSk7ZWxzZSBmb3IoZSBpbiBrKWtbZV0mJg0Ka1tlXS5zdG9wJiZLYy50ZXN0KGUpJiZmKGtbZV0p O2ZvcihlPWcubGVuZ3RoO2UtLTspZ1tlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZ1tlXS5xdWV1 ZSE9PWF8fChnW2VdLmFuaW0uc3RvcChiKSxjPSExLGcuc3BsaWNlKGUsMSkpOyhjfHwhYikmJmQu ZGVxdWV1ZSh0aGlzLGEpfSl9LGZpbmlzaDpmdW5jdGlvbihhKXtyZXR1cm4hMSE9PWEmJihhPWF8 fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjLGI9ZC5fZGF0YSh0aGlzKSxlPWJbYSsi cXVldWUiXTtjPWJbYSsicXVldWVIb29rcyJdO3ZhciBmPWQudGltZXJzLGc9ZT9lLmxlbmd0aDow O2IuZmluaXNoPSEwO2QucXVldWUodGhpcyxhLFtdKTtjJiZjLmN1ciYmYy5jdXIuZmluaXNoJiZj LmN1ci5maW5pc2guY2FsbCh0aGlzKTtmb3IoYz1mLmxlbmd0aDtjLS07KWZbY10uZWxlbT09PXRo aXMmJmZbY10ucXVldWU9PT1hJiYoZltjXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGMsMSkpO2Zv cihjPTA7Zz5jO2MrKyllW2NdJiYNCmVbY10uZmluaXNoJiZlW2NdLmZpbmlzaC5jYWxsKHRoaXMp O2RlbGV0ZSBiLmZpbmlzaH0pfX0pO2QuZWFjaCh7c2xpZGVEb3duOnVhKCJzaG93Iiksc2xpZGVV cDp1YSgiaGlkZSIpLHNsaWRlVG9nZ2xlOnVhKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNo b3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xl In19LGZ1bmN0aW9uKGEsYyl7ZC5mblthXT1mdW5jdGlvbihhLGQsYil7cmV0dXJuIHRoaXMuYW5p bWF0ZShjLGEsZCxiKX19KTtkLnNwZWVkPWZ1bmN0aW9uKGEsYyxiKXt2YXIgZT1hJiYib2JqZWN0 Ij09dHlwZW9mIGE/ZC5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmJ8fCFiJiZjfHxkLmlzRnVuY3Rp b24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YiYmY3x8YyYmIWQuaXNGdW5jdGlvbihjKSYmY307 cmV0dXJuIGUuZHVyYXRpb249ZC5meC5vZmY/MDoibnVtYmVyIj09dHlwZW9mIGUuZHVyYXRpb24/ ZS5kdXJhdGlvbjoNCmUuZHVyYXRpb24gaW4gZC5meC5zcGVlZHM/ZC5meC5zcGVlZHNbZS5kdXJh dGlvbl06ZC5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWUucXVldWV8fCEwPT09ZS5xdWV1ZSkm JihlLnF1ZXVlPSJmeCIpLGUub2xkPWUuY29tcGxldGUsZS5jb21wbGV0ZT1mdW5jdGlvbigpe2Qu aXNGdW5jdGlvbihlLm9sZCkmJmUub2xkLmNhbGwodGhpcyk7ZS5xdWV1ZSYmZC5kZXF1ZXVlKHRo aXMsZS5xdWV1ZSl9LGV9O2QuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3 aW5nOmZ1bmN0aW9uKGEpe3JldHVybiAwLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX07ZC50aW1l cnM9W107ZC5meD1CLnByb3RvdHlwZS5pbml0O2QuZngudGljaz1mdW5jdGlvbigpe3ZhciBhLGM9 ZC50aW1lcnMsYj0wO2ZvcihpYT1kLm5vdygpO2MubGVuZ3RoPmI7YisrKWE9Y1tiXSxhKCl8fGNb Yl0hPT1hfHxjLnNwbGljZShiLS0sMSk7Yy5sZW5ndGh8fGQuZnguc3RvcCgpO2lhPWV9O2QuZngu dGltZXI9DQpmdW5jdGlvbihhKXthKCkmJmQudGltZXJzLnB1c2goYSkmJmQuZnguc3RhcnQoKX07 ZC5meC5pbnRlcnZhbD0xMztkLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7QmF8fChCYT1zZXRJbnRlcnZh bChkLmZ4LnRpY2ssZC5meC5pbnRlcnZhbCkpfTtkLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhcklu dGVydmFsKEJhKTtCYT1udWxsfTtkLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1 bHQ6NDAwfTtkLmZ4LnN0ZXA9e307ZC5leHByJiZkLmV4cHIuZmlsdGVycyYmKGQuZXhwci5maWx0 ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBkLmdyZXAoZC50aW1lcnMsZnVuY3Rpb24o Yyl7cmV0dXJuIGE9PT1jLmVsZW19KS5sZW5ndGh9KTtkLmZuLm9mZnNldD1mdW5jdGlvbihhKXtp Zihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBhPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihj KXtkLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGMpfSk7dmFyIGMsYixmPXt0b3A6MCxsZWZ0OjB9 LA0KZz10aGlzWzBdLGs9ZyYmZy5vd25lckRvY3VtZW50O2lmKGspcmV0dXJuIGM9ay5kb2N1bWVu dEVsZW1lbnQsZC5jb250YWlucyhjLGcpPyh0eXBlb2YgZy5nZXRCb3VuZGluZ0NsaWVudFJlY3Qh PT1RJiYoZj1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxiPWxiKGspLHt0b3A6Zi50b3ArKGIu cGFnZVlPZmZzZXR8fGMuc2Nyb2xsVG9wKS0oYy5jbGllbnRUb3B8fDApLGxlZnQ6Zi5sZWZ0Kyhi LnBhZ2VYT2Zmc2V0fHxjLnNjcm9sbExlZnQpLShjLmNsaWVudExlZnR8fDApfSk6Zn07ZC5vZmZz ZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGMsYil7dmFyIGU9ZC5jc3MoYSwicG9zaXRpb24iKTsi c3RhdGljIj09PWUmJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBmPWQoYSksZz1m Lm9mZnNldCgpLGs9ZC5jc3MoYSwidG9wIiksbT1kLmNzcyhhLCJsZWZ0Iiksbj17fSx0PXt9LHIs cDsoImFic29sdXRlIj09PWV8fCJmaXhlZCI9PT1lKSYmLTE8ZC5pbkFycmF5KCJhdXRvIiwNCltr LG1dKT8odD1mLnBvc2l0aW9uKCkscj10LnRvcCxwPXQubGVmdCk6KHI9cGFyc2VGbG9hdChrKXx8 MCxwPXBhcnNlRmxvYXQobSl8fDApO2QuaXNGdW5jdGlvbihjKSYmKGM9Yy5jYWxsKGEsYixnKSk7 bnVsbCE9Yy50b3AmJihuLnRvcD1jLnRvcC1nLnRvcCtyKTtudWxsIT1jLmxlZnQmJihuLmxlZnQ9 Yy5sZWZ0LWcubGVmdCtwKTsidXNpbmciaW4gYz9jLnVzaW5nLmNhbGwoYSxuKTpmLmNzcyhuKX19 O2QuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBhLGMsYj17 dG9wOjAsbGVmdDowfSxlPXRoaXNbMF07cmV0dXJuImZpeGVkIj09PWQuY3NzKGUsInBvc2l0aW9u Iik/Yz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYz10 aGlzLm9mZnNldCgpLGQubm9kZU5hbWUoYVswXSwiaHRtbCIpfHwoYj1hLm9mZnNldCgpKSxiLnRv cCs9ZC5jc3MoYVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxiLmxlZnQrPQ0KZC5jc3MoYVswXSwi Ym9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yy50b3AtYi50b3AtZC5jc3MoZSwibWFyZ2luVG9w IiwhMCksbGVmdDpjLmxlZnQtYi5sZWZ0LWQuY3NzKGUsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZz ZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGE9 dGhpcy5vZmZzZXRQYXJlbnR8fHQuZG9jdW1lbnRFbGVtZW50O2EmJiFkLm5vZGVOYW1lKGEsImh0 bWwiKSYmInN0YXRpYyI9PT1kLmNzcyhhLCJwb3NpdGlvbiIpOylhPWEub2Zmc2V0UGFyZW50O3Jl dHVybiBhfHx0LmRvY3VtZW50RWxlbWVudH0pfX0pO2QuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhP ZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGMpe3ZhciBiPS9ZLy50 ZXN0KGMpO2QuZm5bYV09ZnVuY3Rpb24oZil7cmV0dXJuIGQuYWNjZXNzKHRoaXMsZnVuY3Rpb24o YSxmLGcpe3ZhciBrPWxiKGEpO3JldHVybiBnPT09ZT9rPw0KYyBpbiBrP2tbY106ay5kb2N1bWVu dC5kb2N1bWVudEVsZW1lbnRbZl06YVtmXTooaz9rLnNjcm9sbFRvKGI/ZChrKS5zY3JvbGxMZWZ0 KCk6ZyxiP2c6ZChrKS5zY3JvbGxUb3AoKSk6YVtmXT1nLGUpfSxhLGYsYXJndW1lbnRzLmxlbmd0 aCxudWxsKX19KTtkLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlv bihhLGMpe2QuZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpjLCIiOiJvdXRlciIrYX0s ZnVuY3Rpb24oYixmKXtkLmZuW2ZdPWZ1bmN0aW9uKGYsZyl7dmFyIGs9YXJndW1lbnRzLmxlbmd0 aCYmKGJ8fCJib29sZWFuIiE9dHlwZW9mIGYpLG09Ynx8KCEwPT09Znx8ITA9PT1nPyJtYXJnaW4i OiJib3JkZXIiKTtyZXR1cm4gZC5hY2Nlc3ModGhpcyxmdW5jdGlvbihjLGIsZil7dmFyIGc7cmV0 dXJuIGQuaXNXaW5kb3coYyk/Yy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06 OT09PWMubm9kZVR5cGU/KGc9Yy5kb2N1bWVudEVsZW1lbnQsDQpNYXRoLm1heChjLmJvZHlbInNj cm9sbCIrYV0sZ1sic2Nyb2xsIithXSxjLmJvZHlbIm9mZnNldCIrYV0sZ1sib2Zmc2V0IithXSxn WyJjbGllbnQiK2FdKSk6Zj09PWU/ZC5jc3MoYyxiLG0pOmQuc3R5bGUoYyxiLGYsbSl9LGMsaz9m OmUsayxudWxsKX19KX0pO2IualF1ZXJ5PWIuJD1kOyJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUm JmRlZmluZS5hbWQmJmRlZmluZS5hbWQualF1ZXJ5JiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rp b24oKXtyZXR1cm4gZH0pfSkod2luZG93KTsNCihmdW5jdGlvbihiKXtiLmV4dGVuZChiLmZuLHt2 YWxpZGF0ZTpmdW5jdGlvbihlKXtpZighdGhpcy5sZW5ndGgpcmV0dXJuIGUmJmUuZGVidWcmJndp bmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4oIk5vdGhpbmcgc2VsZWN0ZWQsIGNhbid0IHZhbGlk YXRlLCByZXR1cm5pbmcgbm90aGluZy4iKSx2b2lkIDA7dmFyIGY9Yi5kYXRhKHRoaXNbMF0sInZh bGlkYXRvciIpO3JldHVybiBmP2Y6KHRoaXMuYXR0cigibm92YWxpZGF0ZSIsIm5vdmFsaWRhdGUi KSxmPW5ldyBiLnZhbGlkYXRvcihlLHRoaXNbMF0pLGIuZGF0YSh0aGlzWzBdLCJ2YWxpZGF0b3Ii LGYpLGYuc2V0dGluZ3Mub25zdWJtaXQmJih0aGlzLnZhbGlkYXRlRGVsZWdhdGUoIjpzdWJtaXQi LCJjbGljayIsZnVuY3Rpb24oZSl7Zi5zZXR0aW5ncy5zdWJtaXRIYW5kbGVyJiYoZi5zdWJtaXRC dXR0b249ZS50YXJnZXQpO2IoZS50YXJnZXQpLmhhc0NsYXNzKCJjYW5jZWwiKSYmKGYuY2FuY2Vs U3VibWl0PSEwKTt2b2lkIDAhPT0NCmIoZS50YXJnZXQpLmF0dHIoImZvcm1ub3ZhbGlkYXRlIikm JihmLmNhbmNlbFN1Ym1pdD0hMCl9KSx0aGlzLnN1Ym1pdChmdW5jdGlvbihlKXtmdW5jdGlvbiBr KCl7dmFyIGs7cmV0dXJuIGYuc2V0dGluZ3Muc3VibWl0SGFuZGxlcj8oZi5zdWJtaXRCdXR0b24m JihrPWIoIlx4M2NpbnB1dCB0eXBlXHgzZCdoaWRkZW4nL1x4M2UiKS5hdHRyKCJuYW1lIixmLnN1 Ym1pdEJ1dHRvbi5uYW1lKS52YWwoYihmLnN1Ym1pdEJ1dHRvbikudmFsKCkpLmFwcGVuZFRvKGYu Y3VycmVudEZvcm0pKSxmLnNldHRpbmdzLnN1Ym1pdEhhbmRsZXIuY2FsbChmLGYuY3VycmVudEZv cm0sZSksZi5zdWJtaXRCdXR0b24mJmsucmVtb3ZlKCksITEpOiEwfXJldHVybiBmLnNldHRpbmdz LmRlYnVnJiZlLnByZXZlbnREZWZhdWx0KCksZi5jYW5jZWxTdWJtaXQ/KGYuY2FuY2VsU3VibWl0 PSExLGsoKSk6Zi5mb3JtKCk/Zi5wZW5kaW5nUmVxdWVzdD8oZi5mb3JtU3VibWl0dGVkPSEwLCEx KTprKCk6KGYuZm9jdXNJbnZhbGlkKCksDQohMSl9KSksZil9LHZhbGlkOmZ1bmN0aW9uKCl7aWYo Yih0aGlzWzBdKS5pcygiZm9ybSIpKXJldHVybiB0aGlzLnZhbGlkYXRlKCkuZm9ybSgpO3ZhciBl PSEwLGY9Yih0aGlzWzBdLmZvcm0pLnZhbGlkYXRlKCk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlv bigpe2U9ZSYmZi5lbGVtZW50KHRoaXMpfSksZX0scmVtb3ZlQXR0cnM6ZnVuY3Rpb24oZSl7dmFy IGY9e30sZz10aGlzO3JldHVybiBiLmVhY2goZS5zcGxpdCgvXHMvKSxmdW5jdGlvbihiLGUpe2Zb ZV09Zy5hdHRyKGUpO2cucmVtb3ZlQXR0cihlKX0pLGZ9LHJ1bGVzOmZ1bmN0aW9uKGUsZil7dmFy IGc9dGhpc1swXTtpZihlKXt2YXIgaz1iLmRhdGEoZy5mb3JtLCJ2YWxpZGF0b3IiKS5zZXR0aW5n cyxtPWsucnVsZXMsbj1iLnZhbGlkYXRvci5zdGF0aWNSdWxlcyhnKTtzd2l0Y2goZSl7Y2FzZSAi YWRkIjpiLmV4dGVuZChuLGIudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGUoZikpO2RlbGV0ZSBuLm1l c3NhZ2VzO21bZy5uYW1lXT0NCm47Zi5tZXNzYWdlcyYmKGsubWVzc2FnZXNbZy5uYW1lXT1iLmV4 dGVuZChrLm1lc3NhZ2VzW2cubmFtZV0sZi5tZXNzYWdlcykpO2JyZWFrO2Nhc2UgInJlbW92ZSI6 aWYoIWYpcmV0dXJuIGRlbGV0ZSBtW2cubmFtZV0sbjt2YXIgdz17fTtyZXR1cm4gYi5lYWNoKGYu c3BsaXQoL1xzLyksZnVuY3Rpb24oYixlKXt3W2VdPW5bZV07ZGVsZXRlIG5bZV19KSx3fX1nPWIu dmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGVzKGIuZXh0ZW5kKHt9LGIudmFsaWRhdG9yLmNsYXNzUnVs ZXMoZyksYi52YWxpZGF0b3IuYXR0cmlidXRlUnVsZXMoZyksYi52YWxpZGF0b3IuZGF0YVJ1bGVz KGcpLGIudmFsaWRhdG9yLnN0YXRpY1J1bGVzKGcpKSxnKTtnLnJlcXVpcmVkJiYoaz1nLnJlcXVp cmVkLGRlbGV0ZSBnLnJlcXVpcmVkLGc9Yi5leHRlbmQoe3JlcXVpcmVkOmt9LGcpKTtyZXR1cm4g Z319KTtiLmV4dGVuZChiLmV4cHJbIjoiXSx7Ymxhbms6ZnVuY3Rpb24oZSl7cmV0dXJuIWIudHJp bSgiIitiKGUpLnZhbCgpKX0sDQpmaWxsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuISFiLnRyaW0oIiIr YihlKS52YWwoKSl9LHVuY2hlY2tlZDpmdW5jdGlvbihlKXtyZXR1cm4hYihlKS5wcm9wKCJjaGVj a2VkIil9fSk7Yi52YWxpZGF0b3I9ZnVuY3Rpb24oZSxmKXt0aGlzLnNldHRpbmdzPWIuZXh0ZW5k KCEwLHt9LGIudmFsaWRhdG9yLmRlZmF1bHRzLGUpO3RoaXMuY3VycmVudEZvcm09Zjt0aGlzLmlu aXQoKX07Yi52YWxpZGF0b3IuZm9ybWF0PWZ1bmN0aW9uKGUsZil7cmV0dXJuIDE9PT1hcmd1bWVu dHMubGVuZ3RoP2Z1bmN0aW9uKCl7dmFyIGY9Yi5tYWtlQXJyYXkoYXJndW1lbnRzKTtyZXR1cm4g Zi51bnNoaWZ0KGUpLGIudmFsaWRhdG9yLmZvcm1hdC5hcHBseSh0aGlzLGYpfTooMjxhcmd1bWVu dHMubGVuZ3RoJiZmLmNvbnN0cnVjdG9yIT09QXJyYXkmJihmPWIubWFrZUFycmF5KGFyZ3VtZW50 cykuc2xpY2UoMSkpLGYuY29uc3RydWN0b3IhPT1BcnJheSYmKGY9W2ZdKSxiLmVhY2goZixmdW5j dGlvbihiLGYpe2U9DQplLnJlcGxhY2UoUmVnRXhwKCJcXHsiK2IrIlxcfSIsImciKSxmdW5jdGlv bigpe3JldHVybiBmfSl9KSxlKX07Yi5leHRlbmQoYi52YWxpZGF0b3Ise2RlZmF1bHRzOnttZXNz YWdlczp7fSxncm91cHM6e30scnVsZXM6e30sZXJyb3JDbGFzczoiZXJyb3IiLHZhbGlkQ2xhc3M6 InZhbGlkIixlcnJvckVsZW1lbnQ6ImxhYmVsIixmb2N1c0ludmFsaWQ6ITAsZXJyb3JDb250YWlu ZXI6YihbXSksZXJyb3JMYWJlbENvbnRhaW5lcjpiKFtdKSxvbnN1Ym1pdDohMCxpZ25vcmU6Ijpo aWRkZW4iLGlnbm9yZVRpdGxlOiExLG9uZm9jdXNpbjpmdW5jdGlvbihiKXt0aGlzLmxhc3RBY3Rp dmU9Yjt0aGlzLnNldHRpbmdzLmZvY3VzQ2xlYW51cCYmIXRoaXMuYmxvY2tGb2N1c0NsZWFudXAm Jih0aGlzLnNldHRpbmdzLnVuaGlnaGxpZ2h0JiZ0aGlzLnNldHRpbmdzLnVuaGlnaGxpZ2h0LmNh bGwodGhpcyxiLHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcyx0aGlzLnNldHRpbmdzLnZhbGlkQ2xh c3MpLA0KdGhpcy5hZGRXcmFwcGVyKHRoaXMuZXJyb3JzRm9yKGIpKS5oaWRlKCkpfSxvbmZvY3Vz b3V0OmZ1bmN0aW9uKGIpe3RoaXMuY2hlY2thYmxlKGIpfHwhKGIubmFtZSBpbiB0aGlzLnN1Ym1p dHRlZCkmJnRoaXMub3B0aW9uYWwoYil8fHRoaXMuZWxlbWVudChiKX0sb25rZXl1cDpmdW5jdGlv bihiLGYpeyg5IT09Zi53aGljaHx8IiIhPT10aGlzLmVsZW1lbnRWYWx1ZShiKSkmJihiLm5hbWUg aW4gdGhpcy5zdWJtaXR0ZWR8fGI9PT10aGlzLmxhc3RFbGVtZW50KSYmdGhpcy5lbGVtZW50KGIp fSxvbmNsaWNrOmZ1bmN0aW9uKGIpe2IubmFtZSBpbiB0aGlzLnN1Ym1pdHRlZD90aGlzLmVsZW1l bnQoYik6Yi5wYXJlbnROb2RlLm5hbWUgaW4gdGhpcy5zdWJtaXR0ZWQmJnRoaXMuZWxlbWVudChi LnBhcmVudE5vZGUpfSxoaWdobGlnaHQ6ZnVuY3Rpb24oZSxmLGcpeyJyYWRpbyI9PT1lLnR5cGU/ dGhpcy5maW5kQnlOYW1lKGUubmFtZSkuYWRkQ2xhc3MoZikucmVtb3ZlQ2xhc3MoZyk6DQpiKGUp LmFkZENsYXNzKGYpLnJlbW92ZUNsYXNzKGcpfSx1bmhpZ2hsaWdodDpmdW5jdGlvbihlLGYsZyl7 InJhZGlvIj09PWUudHlwZT90aGlzLmZpbmRCeU5hbWUoZS5uYW1lKS5yZW1vdmVDbGFzcyhmKS5h ZGRDbGFzcyhnKTpiKGUpLnJlbW92ZUNsYXNzKGYpLmFkZENsYXNzKGcpfX0sc2V0RGVmYXVsdHM6 ZnVuY3Rpb24oZSl7Yi5leHRlbmQoYi52YWxpZGF0b3IuZGVmYXVsdHMsZSl9LG1lc3NhZ2VzOnty ZXF1aXJlZDoiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iLHJlbW90ZToiUGxlYXNlIGZpeCB0aGlz IGZpZWxkLiIsZW1haWw6IlBsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MuIix1cmw6 IlBsZWFzZSBlbnRlciBhIHZhbGlkIFVSTC4iLGRhdGU6IlBsZWFzZSBlbnRlciBhIHZhbGlkIGRh dGUuIixkYXRlSVNPOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlIChJU08pLiIsbnVtYmVyOiJQ bGVhc2UgZW50ZXIgYSB2YWxpZCBudW1iZXIuIixkaWdpdHM6IlBsZWFzZSBlbnRlciBvbmx5IGRp Z2l0cy4iLA0KY3JlZGl0Y2FyZDoiUGxlYXNlIGVudGVyIGEgdmFsaWQgY3JlZGl0IGNhcmQgbnVt YmVyLiIsZXF1YWxUbzoiUGxlYXNlIGVudGVyIHRoZSBzYW1lIHZhbHVlIGFnYWluLiIsbWF4bGVu Z3RoOmIudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIG5vIG1vcmUgdGhhbiB7MH0gY2hh cmFjdGVycy4iKSxtaW5sZW5ndGg6Yi52YWxpZGF0b3IuZm9ybWF0KCJQbGVhc2UgZW50ZXIgYXQg bGVhc3QgezB9IGNoYXJhY3RlcnMuIikscmFuZ2VsZW5ndGg6Yi52YWxpZGF0b3IuZm9ybWF0KCJQ bGVhc2UgZW50ZXIgYSB2YWx1ZSBiZXR3ZWVuIHswfSBhbmQgezF9IGNoYXJhY3RlcnMgbG9uZy4i KSxyYW5nZTpiLnZhbGlkYXRvci5mb3JtYXQoIlBsZWFzZSBlbnRlciBhIHZhbHVlIGJldHdlZW4g ezB9IGFuZCB7MX0uIiksbWF4OmIudmFsaWRhdG9yLmZvcm1hdCgiUGxlYXNlIGVudGVyIGEgdmFs dWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHswfS4iKSxtaW46Yi52YWxpZGF0b3IuZm9ybWF0KCJQ bGVhc2UgZW50ZXIgYSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gezB9LiIpfSwNCmF1 dG9DcmVhdGVSYW5nZXM6ITEscHJvdG90eXBlOntpbml0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShl KXt2YXIgZj1iLmRhdGEodGhpc1swXS5mb3JtLCJ2YWxpZGF0b3IiKSxnPSJvbiIrZS50eXBlLnJl cGxhY2UoL152YWxpZGF0ZS8sIiIpO2Yuc2V0dGluZ3NbZ10mJmYuc2V0dGluZ3NbZ10uY2FsbChm LHRoaXNbMF0sZSl9dGhpcy5sYWJlbENvbnRhaW5lcj1iKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJl bENvbnRhaW5lcik7dGhpcy5lcnJvckNvbnRleHQ9dGhpcy5sYWJlbENvbnRhaW5lci5sZW5ndGgm JnRoaXMubGFiZWxDb250YWluZXJ8fGIodGhpcy5jdXJyZW50Rm9ybSk7dGhpcy5jb250YWluZXJz PWIodGhpcy5zZXR0aW5ncy5lcnJvckNvbnRhaW5lcikuYWRkKHRoaXMuc2V0dGluZ3MuZXJyb3JM YWJlbENvbnRhaW5lcik7dGhpcy5zdWJtaXR0ZWQ9e307dGhpcy52YWx1ZUNhY2hlPXt9O3RoaXMu cGVuZGluZ1JlcXVlc3Q9MDt0aGlzLnBlbmRpbmc9e307dGhpcy5pbnZhbGlkPQ0Ke307dGhpcy5y ZXNldCgpO3ZhciBmPXRoaXMuZ3JvdXBzPXt9O2IuZWFjaCh0aGlzLnNldHRpbmdzLmdyb3Vwcyxm dW5jdGlvbihlLGcpeyJzdHJpbmciPT10eXBlb2YgZyYmKGc9Zy5zcGxpdCgvXHMvKSk7Yi5lYWNo KGcsZnVuY3Rpb24oYixnKXtmW2ddPWV9KX0pO3ZhciBnPXRoaXMuc2V0dGluZ3MucnVsZXM7Yi5l YWNoKGcsZnVuY3Rpb24oZSxmKXtnW2VdPWIudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGUoZil9KTti KHRoaXMuY3VycmVudEZvcm0pLnZhbGlkYXRlRGVsZWdhdGUoIjp0ZXh0LCBbdHlwZVx4M2QncGFz c3dvcmQnXSwgW3R5cGVceDNkJ2ZpbGUnXSwgc2VsZWN0LCB0ZXh0YXJlYSwgW3R5cGVceDNkJ251 bWJlciddLCBbdHlwZVx4M2Qnc2VhcmNoJ10gLFt0eXBlXHgzZCd0ZWwnXSwgW3R5cGVceDNkJ3Vy bCddLCBbdHlwZVx4M2QnZW1haWwnXSwgW3R5cGVceDNkJ2RhdGV0aW1lJ10sIFt0eXBlXHgzZCdk YXRlJ10sIFt0eXBlXHgzZCdtb250aCddLCBbdHlwZVx4M2Qnd2VlayddLCBbdHlwZVx4M2QndGlt ZSddLCBbdHlwZVx4M2QnZGF0ZXRpbWUtbG9jYWwnXSwgW3R5cGVceDNkJ3JhbmdlJ10sIFt0eXBl XHgzZCdjb2xvciddICIsDQoiZm9jdXNpbiBmb2N1c291dCBrZXl1cCIsZSkudmFsaWRhdGVEZWxl Z2F0ZSgiW3R5cGVceDNkJ3JhZGlvJ10sIFt0eXBlXHgzZCdjaGVja2JveCddLCBzZWxlY3QsIG9w dGlvbiIsImNsaWNrIixlKTt0aGlzLnNldHRpbmdzLmludmFsaWRIYW5kbGVyJiZiKHRoaXMuY3Vy cmVudEZvcm0pLmJpbmQoImludmFsaWQtZm9ybS52YWxpZGF0ZSIsdGhpcy5zZXR0aW5ncy5pbnZh bGlkSGFuZGxlcil9LGZvcm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja0Zvcm0oKSxiLmV4 dGVuZCh0aGlzLnN1Ym1pdHRlZCx0aGlzLmVycm9yTWFwKSx0aGlzLmludmFsaWQ9Yi5leHRlbmQo e30sdGhpcy5lcnJvck1hcCksdGhpcy52YWxpZCgpfHxiKHRoaXMuY3VycmVudEZvcm0pLnRyaWdn ZXJIYW5kbGVyKCJpbnZhbGlkLWZvcm0iLFt0aGlzXSksdGhpcy5zaG93RXJyb3JzKCksdGhpcy52 YWxpZCgpfSxjaGVja0Zvcm06ZnVuY3Rpb24oKXt0aGlzLnByZXBhcmVGb3JtKCk7Zm9yKHZhciBi PTAsZj0NCnRoaXMuY3VycmVudEVsZW1lbnRzPXRoaXMuZWxlbWVudHMoKTtmW2JdO2IrKyl0aGlz LmNoZWNrKGZbYl0pO3JldHVybiB0aGlzLnZhbGlkKCl9LGVsZW1lbnQ6ZnVuY3Rpb24oZSl7dGhp cy5sYXN0RWxlbWVudD1lPXRoaXMudmFsaWRhdGlvblRhcmdldEZvcih0aGlzLmNsZWFuKGUpKTt0 aGlzLnByZXBhcmVFbGVtZW50KGUpO3RoaXMuY3VycmVudEVsZW1lbnRzPWIoZSk7dmFyIGY9ITEh PT10aGlzLmNoZWNrKGUpO3JldHVybiBmP2RlbGV0ZSB0aGlzLmludmFsaWRbZS5uYW1lXTp0aGlz LmludmFsaWRbZS5uYW1lXT0hMCx0aGlzLm51bWJlck9mSW52YWxpZHMoKXx8KHRoaXMudG9IaWRl PXRoaXMudG9IaWRlLmFkZCh0aGlzLmNvbnRhaW5lcnMpKSx0aGlzLnNob3dFcnJvcnMoKSxmfSxz aG93RXJyb3JzOmZ1bmN0aW9uKGUpe2lmKGUpe2IuZXh0ZW5kKHRoaXMuZXJyb3JNYXAsZSk7dGhp cy5lcnJvckxpc3Q9W107Zm9yKHZhciBmIGluIGUpdGhpcy5lcnJvckxpc3QucHVzaCh7bWVzc2Fn ZTplW2ZdLA0KZWxlbWVudDp0aGlzLmZpbmRCeU5hbWUoZilbMF19KTt0aGlzLnN1Y2Nlc3NMaXN0 PWIuZ3JlcCh0aGlzLnN1Y2Nlc3NMaXN0LGZ1bmN0aW9uKGIpe3JldHVybiEoYi5uYW1lIGluIGUp fSl9dGhpcy5zZXR0aW5ncy5zaG93RXJyb3JzP3RoaXMuc2V0dGluZ3Muc2hvd0Vycm9ycy5jYWxs KHRoaXMsdGhpcy5lcnJvck1hcCx0aGlzLmVycm9yTGlzdCk6dGhpcy5kZWZhdWx0U2hvd0Vycm9y cygpfSxyZXNldEZvcm06ZnVuY3Rpb24oKXtiLmZuLnJlc2V0Rm9ybSYmYih0aGlzLmN1cnJlbnRG b3JtKS5yZXNldEZvcm0oKTt0aGlzLnN1Ym1pdHRlZD17fTt0aGlzLmxhc3RFbGVtZW50PW51bGw7 dGhpcy5wcmVwYXJlRm9ybSgpO3RoaXMuaGlkZUVycm9ycygpO3RoaXMuZWxlbWVudHMoKS5yZW1v dmVDbGFzcyh0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MpLnJlbW92ZURhdGEoInByZXZpb3VzVmFs dWUiKX0sbnVtYmVyT2ZJbnZhbGlkczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9iamVjdExlbmd0 aCh0aGlzLmludmFsaWQpfSwNCm9iamVjdExlbmd0aDpmdW5jdGlvbihiKXt2YXIgZj0wLGc7Zm9y KGcgaW4gYilmKys7cmV0dXJuIGZ9LGhpZGVFcnJvcnM6ZnVuY3Rpb24oKXt0aGlzLmFkZFdyYXBw ZXIodGhpcy50b0hpZGUpLmhpZGUoKX0sdmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMu c2l6ZSgpfSxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JMaXN0Lmxlbmd0aH0sZm9j dXNJbnZhbGlkOmZ1bmN0aW9uKCl7aWYodGhpcy5zZXR0aW5ncy5mb2N1c0ludmFsaWQpdHJ5e2Io dGhpcy5maW5kTGFzdEFjdGl2ZSgpfHx0aGlzLmVycm9yTGlzdC5sZW5ndGgmJnRoaXMuZXJyb3JM aXN0WzBdLmVsZW1lbnR8fFtdKS5maWx0ZXIoIjp2aXNpYmxlIikuZm9jdXMoKS50cmlnZ2VyKCJm b2N1c2luIil9Y2F0Y2goZSl7fX0sZmluZExhc3RBY3RpdmU6ZnVuY3Rpb24oKXt2YXIgZT10aGlz Lmxhc3RBY3RpdmU7cmV0dXJuIGUmJjE9PT1iLmdyZXAodGhpcy5lcnJvckxpc3QsZnVuY3Rpb24o Yil7cmV0dXJuIGIuZWxlbWVudC5uYW1lPT09DQplLm5hbWV9KS5sZW5ndGgmJmV9LGVsZW1lbnRz OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxmPXt9O3JldHVybiBiKHRoaXMuY3VycmVudEZvcm0pLmZp bmQoImlucHV0LCBzZWxlY3QsIHRleHRhcmVhIikubm90KCI6c3VibWl0LCA6cmVzZXQsIDppbWFn ZSwgW2Rpc2FibGVkXSIpLm5vdCh0aGlzLnNldHRpbmdzLmlnbm9yZSkuZmlsdGVyKGZ1bmN0aW9u KCl7cmV0dXJuIXRoaXMubmFtZSYmZS5zZXR0aW5ncy5kZWJ1ZyYmd2luZG93LmNvbnNvbGUmJmNv bnNvbGUuZXJyb3IoIiVvIGhhcyBubyBuYW1lIGFzc2lnbmVkIix0aGlzKSx0aGlzLm5hbWUgaW4g Znx8IWUub2JqZWN0TGVuZ3RoKGIodGhpcykucnVsZXMoKSk/ITE6KGZbdGhpcy5uYW1lXT0hMCwh MCl9KX0sY2xlYW46ZnVuY3Rpb24oZSl7cmV0dXJuIGIoZSlbMF19LGVycm9yczpmdW5jdGlvbigp e3ZhciBlPXRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcy5yZXBsYWNlKCIgIiwiLiIpO3JldHVybiBi KHRoaXMuc2V0dGluZ3MuZXJyb3JFbGVtZW50Kw0KIi4iK2UsdGhpcy5lcnJvckNvbnRleHQpfSxy ZXNldDpmdW5jdGlvbigpe3RoaXMuc3VjY2Vzc0xpc3Q9W107dGhpcy5lcnJvckxpc3Q9W107dGhp cy5lcnJvck1hcD17fTt0aGlzLnRvU2hvdz1iKFtdKTt0aGlzLnRvSGlkZT1iKFtdKTt0aGlzLmN1 cnJlbnRFbGVtZW50cz1iKFtdKX0scHJlcGFyZUZvcm06ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCk7 dGhpcy50b0hpZGU9dGhpcy5lcnJvcnMoKS5hZGQodGhpcy5jb250YWluZXJzKX0scHJlcGFyZUVs ZW1lbnQ6ZnVuY3Rpb24oYil7dGhpcy5yZXNldCgpO3RoaXMudG9IaWRlPXRoaXMuZXJyb3JzRm9y KGIpfSxlbGVtZW50VmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGY9YihlKS5hdHRyKCJ0eXBlIiksZz1i KGUpLnZhbCgpO3JldHVybiJyYWRpbyI9PT1mfHwiY2hlY2tib3giPT09Zj9iKCJpbnB1dFtuYW1l XHgzZCciK2IoZSkuYXR0cigibmFtZSIpKyInXTpjaGVja2VkIikudmFsKCk6InN0cmluZyI9PXR5 cGVvZiBnP2cucmVwbGFjZSgvXHIvZywNCiIiKTpnfSxjaGVjazpmdW5jdGlvbihlKXtlPXRoaXMu dmFsaWRhdGlvblRhcmdldEZvcih0aGlzLmNsZWFuKGUpKTt2YXIgZixnPWIoZSkucnVsZXMoKSxr PSExLG09dGhpcy5lbGVtZW50VmFsdWUoZSksbjtmb3IobiBpbiBnKXt2YXIgdz17bWV0aG9kOm4s cGFyYW1ldGVyczpnW25dfTt0cnl7aWYoZj1iLnZhbGlkYXRvci5tZXRob2RzW25dLmNhbGwodGhp cyxtLGUsdy5wYXJhbWV0ZXJzKSwiZGVwZW5kZW5jeS1taXNtYXRjaCI9PT1mKWs9ITA7ZWxzZXtp ZihrPSExLCJwZW5kaW5nIj09PWYpcmV0dXJuIHRoaXMudG9IaWRlPXRoaXMudG9IaWRlLm5vdCh0 aGlzLmVycm9yc0ZvcihlKSksdm9pZCAwO2lmKCFmKXJldHVybiB0aGlzLmZvcm1hdEFuZEFkZChl LHcpLCExfX1jYXRjaCh6KXt0aHJvdyB0aGlzLnNldHRpbmdzLmRlYnVnJiZ3aW5kb3cuY29uc29s ZSYmY29uc29sZS5sb2coIkV4Y2VwdGlvbiBvY2N1cnJlZCB3aGVuIGNoZWNraW5nIGVsZW1lbnQg IitlLmlkKyIsIGNoZWNrIHRoZSAnIisNCncubWV0aG9kKyInIG1ldGhvZC4iLHopLHo7fX1yZXR1 cm4gaz92b2lkIDA6KHRoaXMub2JqZWN0TGVuZ3RoKGcpJiZ0aGlzLnN1Y2Nlc3NMaXN0LnB1c2go ZSksITApfSxjdXN0b21EYXRhTWVzc2FnZTpmdW5jdGlvbihlLGYpe3JldHVybiBiKGUpLmRhdGEo Im1zZy0iK2YudG9Mb3dlckNhc2UoKSl8fGUuYXR0cmlidXRlcyYmYihlKS5hdHRyKCJkYXRhLW1z Zy0iK2YudG9Mb3dlckNhc2UoKSl9LGN1c3RvbU1lc3NhZ2U6ZnVuY3Rpb24oYixmKXt2YXIgZz10 aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2JdO3JldHVybiBnJiYoZy5jb25zdHJ1Y3Rvcj09PVN0cmlu Zz9nOmdbZl0pfSxmaW5kRGVmaW5lZDpmdW5jdGlvbigpe2Zvcih2YXIgYj0wO2FyZ3VtZW50cy5s ZW5ndGg+YjtiKyspaWYodm9pZCAwIT09YXJndW1lbnRzW2JdKXJldHVybiBhcmd1bWVudHNbYl19 LGRlZmF1bHRNZXNzYWdlOmZ1bmN0aW9uKGUsZil7cmV0dXJuIHRoaXMuZmluZERlZmluZWQodGhp cy5jdXN0b21NZXNzYWdlKGUubmFtZSwNCmYpLHRoaXMuY3VzdG9tRGF0YU1lc3NhZ2UoZSxmKSwh dGhpcy5zZXR0aW5ncy5pZ25vcmVUaXRsZSYmZS50aXRsZXx8dm9pZCAwLGIudmFsaWRhdG9yLm1l c3NhZ2VzW2ZdLCJceDNjc3Ryb25nXHgzZVdhcm5pbmc6IE5vIG1lc3NhZ2UgZGVmaW5lZCBmb3Ig IitlLm5hbWUrIlx4M2Mvc3Ryb25nXHgzZSIpfSxmb3JtYXRBbmRBZGQ6ZnVuY3Rpb24oZSxmKXt2 YXIgZz10aGlzLmRlZmF1bHRNZXNzYWdlKGUsZi5tZXRob2QpLGs9L1wkP1x7KFxkKylcfS9nOyJm dW5jdGlvbiI9PXR5cGVvZiBnP2c9Zy5jYWxsKHRoaXMsZi5wYXJhbWV0ZXJzLGUpOmsudGVzdChn KSYmKGc9Yi52YWxpZGF0b3IuZm9ybWF0KGcucmVwbGFjZShrLCJ7JDF9IiksZi5wYXJhbWV0ZXJz KSk7dGhpcy5lcnJvckxpc3QucHVzaCh7bWVzc2FnZTpnLGVsZW1lbnQ6ZX0pO3RoaXMuZXJyb3JN YXBbZS5uYW1lXT1nO3RoaXMuc3VibWl0dGVkW2UubmFtZV09Z30sYWRkV3JhcHBlcjpmdW5jdGlv bihiKXtyZXR1cm4gdGhpcy5zZXR0aW5ncy53cmFwcGVyJiYNCihiPWIuYWRkKGIucGFyZW50KHRo aXMuc2V0dGluZ3Mud3JhcHBlcikpKSxifSxkZWZhdWx0U2hvd0Vycm9yczpmdW5jdGlvbigpe3Zh ciBiLGY7Zm9yKGI9MDt0aGlzLmVycm9yTGlzdFtiXTtiKyspZj10aGlzLmVycm9yTGlzdFtiXSx0 aGlzLnNldHRpbmdzLmhpZ2hsaWdodCYmdGhpcy5zZXR0aW5ncy5oaWdobGlnaHQuY2FsbCh0aGlz LGYuZWxlbWVudCx0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MsdGhpcy5zZXR0aW5ncy52YWxpZENs YXNzKSx0aGlzLnNob3dMYWJlbChmLmVsZW1lbnQsZi5tZXNzYWdlKTtpZih0aGlzLmVycm9yTGlz dC5sZW5ndGgmJih0aGlzLnRvU2hvdz10aGlzLnRvU2hvdy5hZGQodGhpcy5jb250YWluZXJzKSks dGhpcy5zZXR0aW5ncy5zdWNjZXNzKWZvcihiPTA7dGhpcy5zdWNjZXNzTGlzdFtiXTtiKyspdGhp cy5zaG93TGFiZWwodGhpcy5zdWNjZXNzTGlzdFtiXSk7aWYodGhpcy5zZXR0aW5ncy51bmhpZ2hs aWdodCl7Yj0wO2ZvcihmPXRoaXMudmFsaWRFbGVtZW50cygpO2ZbYl07YisrKXRoaXMuc2V0dGlu Z3MudW5oaWdobGlnaHQuY2FsbCh0aGlzLA0KZltiXSx0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3Ms dGhpcy5zZXR0aW5ncy52YWxpZENsYXNzKX10aGlzLnRvSGlkZT10aGlzLnRvSGlkZS5ub3QodGhp cy50b1Nob3cpO3RoaXMuaGlkZUVycm9ycygpO3RoaXMuYWRkV3JhcHBlcih0aGlzLnRvU2hvdyku c2hvdygpfSx2YWxpZEVsZW1lbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3VycmVudEVsZW1l bnRzLm5vdCh0aGlzLmludmFsaWRFbGVtZW50cygpKX0saW52YWxpZEVsZW1lbnRzOmZ1bmN0aW9u KCl7cmV0dXJuIGIodGhpcy5lcnJvckxpc3QpLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVs ZW1lbnR9KX0sc2hvd0xhYmVsOmZ1bmN0aW9uKGUsZil7dmFyIGc9dGhpcy5lcnJvcnNGb3IoZSk7 Zy5sZW5ndGg/KGcucmVtb3ZlQ2xhc3ModGhpcy5zZXR0aW5ncy52YWxpZENsYXNzKS5hZGRDbGFz cyh0aGlzLnNldHRpbmdzLmVycm9yQ2xhc3MpLGcuaHRtbChmKSk6KGc9YigiXHgzYyIrdGhpcy5z ZXR0aW5ncy5lcnJvckVsZW1lbnQrDQoiXHgzZSIpLmF0dHIoImZvciIsdGhpcy5pZE9yTmFtZShl KSkuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzKS5odG1sKGZ8fCIiKSx0aGlzLnNl dHRpbmdzLndyYXBwZXImJihnPWcuaGlkZSgpLnNob3coKS53cmFwKCJceDNjIit0aGlzLnNldHRp bmdzLndyYXBwZXIrIi9ceDNlIikucGFyZW50KCkpLHRoaXMubGFiZWxDb250YWluZXIuYXBwZW5k KGcpLmxlbmd0aHx8KHRoaXMuc2V0dGluZ3MuZXJyb3JQbGFjZW1lbnQ/dGhpcy5zZXR0aW5ncy5l cnJvclBsYWNlbWVudChnLGIoZSkpOmcuaW5zZXJ0QWZ0ZXIoZSkpKTshZiYmdGhpcy5zZXR0aW5n cy5zdWNjZXNzJiYoZy50ZXh0KCIiKSwic3RyaW5nIj09dHlwZW9mIHRoaXMuc2V0dGluZ3Muc3Vj Y2Vzcz9nLmFkZENsYXNzKHRoaXMuc2V0dGluZ3Muc3VjY2Vzcyk6dGhpcy5zZXR0aW5ncy5zdWNj ZXNzKGcsZSkpO3RoaXMudG9TaG93PXRoaXMudG9TaG93LmFkZChnKX0sZXJyb3JzRm9yOmZ1bmN0 aW9uKGUpe3ZhciBmPQ0KdGhpcy5pZE9yTmFtZShlKTtyZXR1cm4gdGhpcy5lcnJvcnMoKS5maWx0 ZXIoZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzKS5hdHRyKCJmb3IiKT09PWZ9KX0saWRPck5hbWU6 ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZ3JvdXBzW2IubmFtZV18fCh0aGlzLmNoZWNrYWJsZShi KT9iLm5hbWU6Yi5pZHx8Yi5uYW1lKX0sdmFsaWRhdGlvblRhcmdldEZvcjpmdW5jdGlvbihiKXty ZXR1cm4gdGhpcy5jaGVja2FibGUoYikmJihiPXRoaXMuZmluZEJ5TmFtZShiLm5hbWUpLm5vdCh0 aGlzLnNldHRpbmdzLmlnbm9yZSlbMF0pLGJ9LGNoZWNrYWJsZTpmdW5jdGlvbihiKXtyZXR1cm4v cmFkaW98Y2hlY2tib3gvaS50ZXN0KGIudHlwZSl9LGZpbmRCeU5hbWU6ZnVuY3Rpb24oZSl7cmV0 dXJuIGIodGhpcy5jdXJyZW50Rm9ybSkuZmluZCgiW25hbWVceDNkJyIrZSsiJ10iKX0sZ2V0TGVu Z3RoOmZ1bmN0aW9uKGUsZil7c3dpdGNoKGYubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7Y2FzZSAi c2VsZWN0IjpyZXR1cm4gYigib3B0aW9uOnNlbGVjdGVkIiwNCmYpLmxlbmd0aDtjYXNlICJpbnB1 dCI6aWYodGhpcy5jaGVja2FibGUoZikpcmV0dXJuIHRoaXMuZmluZEJ5TmFtZShmLm5hbWUpLmZp bHRlcigiOmNoZWNrZWQiKS5sZW5ndGh9cmV0dXJuIGUubGVuZ3RofSxkZXBlbmQ6ZnVuY3Rpb24o YixmKXtyZXR1cm4gdGhpcy5kZXBlbmRUeXBlc1t0eXBlb2YgYl0/dGhpcy5kZXBlbmRUeXBlc1t0 eXBlb2YgYl0oYixmKTohMH0sZGVwZW5kVHlwZXM6eyJib29sZWFuIjpmdW5jdGlvbihiKXtyZXR1 cm4gYn0sc3RyaW5nOmZ1bmN0aW9uKGUsZil7cmV0dXJuISFiKGUsZi5mb3JtKS5sZW5ndGh9LCJm dW5jdGlvbiI6ZnVuY3Rpb24oYixmKXtyZXR1cm4gYihmKX19LG9wdGlvbmFsOmZ1bmN0aW9uKGUp e3ZhciBmPXRoaXMuZWxlbWVudFZhbHVlKGUpO3JldHVybiFiLnZhbGlkYXRvci5tZXRob2RzLnJl cXVpcmVkLmNhbGwodGhpcyxmLGUpJiYiZGVwZW5kZW5jeS1taXNtYXRjaCJ9LHN0YXJ0UmVxdWVz dDpmdW5jdGlvbihiKXt0aGlzLnBlbmRpbmdbYi5uYW1lXXx8DQoodGhpcy5wZW5kaW5nUmVxdWVz dCsrLHRoaXMucGVuZGluZ1tiLm5hbWVdPSEwKX0sc3RvcFJlcXVlc3Q6ZnVuY3Rpb24oZSxmKXt0 aGlzLnBlbmRpbmdSZXF1ZXN0LS07MD50aGlzLnBlbmRpbmdSZXF1ZXN0JiYodGhpcy5wZW5kaW5n UmVxdWVzdD0wKTtkZWxldGUgdGhpcy5wZW5kaW5nW2UubmFtZV07ZiYmMD09PXRoaXMucGVuZGlu Z1JlcXVlc3QmJnRoaXMuZm9ybVN1Ym1pdHRlZCYmdGhpcy5mb3JtKCk/KGIodGhpcy5jdXJyZW50 Rm9ybSkuc3VibWl0KCksdGhpcy5mb3JtU3VibWl0dGVkPSExKTohZiYmMD09PXRoaXMucGVuZGlu Z1JlcXVlc3QmJnRoaXMuZm9ybVN1Ym1pdHRlZCYmKGIodGhpcy5jdXJyZW50Rm9ybSkudHJpZ2dl ckhhbmRsZXIoImludmFsaWQtZm9ybSIsW3RoaXNdKSx0aGlzLmZvcm1TdWJtaXR0ZWQ9ITEpfSxw cmV2aW91c1ZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBiLmRhdGEoZSwicHJldmlvdXNWYWx1ZSIp fHxiLmRhdGEoZSwicHJldmlvdXNWYWx1ZSIsDQp7b2xkOm51bGwsdmFsaWQ6ITAsbWVzc2FnZTp0 aGlzLmRlZmF1bHRNZXNzYWdlKGUsInJlbW90ZSIpfSl9fSxjbGFzc1J1bGVTZXR0aW5nczp7cmVx dWlyZWQ6e3JlcXVpcmVkOiEwfSxlbWFpbDp7ZW1haWw6ITB9LHVybDp7dXJsOiEwfSxkYXRlOntk YXRlOiEwfSxkYXRlSVNPOntkYXRlSVNPOiEwfSxudW1iZXI6e251bWJlcjohMH0sZGlnaXRzOntk aWdpdHM6ITB9LGNyZWRpdGNhcmQ6e2NyZWRpdGNhcmQ6ITB9fSxhZGRDbGFzc1J1bGVzOmZ1bmN0 aW9uKGUsZil7ZS5jb25zdHJ1Y3Rvcj09PVN0cmluZz90aGlzLmNsYXNzUnVsZVNldHRpbmdzW2Vd PWY6Yi5leHRlbmQodGhpcy5jbGFzc1J1bGVTZXR0aW5ncyxlKX0sY2xhc3NSdWxlczpmdW5jdGlv bihlKXt2YXIgZj17fTtlPWIoZSkuYXR0cigiY2xhc3MiKTtyZXR1cm4gZSYmYi5lYWNoKGUuc3Bs aXQoIiAiKSxmdW5jdGlvbigpe3RoaXMgaW4gYi52YWxpZGF0b3IuY2xhc3NSdWxlU2V0dGluZ3Mm JmIuZXh0ZW5kKGYsYi52YWxpZGF0b3IuY2xhc3NSdWxlU2V0dGluZ3NbdGhpc10pfSksDQpmfSxh dHRyaWJ1dGVSdWxlczpmdW5jdGlvbihlKXt2YXIgZj17fTtlPWIoZSk7dmFyIGc9ZVswXS5nZXRB dHRyaWJ1dGUoInR5cGUiKSxrO2ZvcihrIGluIGIudmFsaWRhdG9yLm1ldGhvZHMpe3ZhciBtOyJy ZXF1aXJlZCI9PT1rPyhtPWUuZ2V0KDApLmdldEF0dHJpYnV0ZShrKSwiIj09PW0mJihtPSEwKSxt PSEhbSk6bT1lLmF0dHIoayk7L21pbnxtYXgvLnRlc3QoaykmJihudWxsPT09Z3x8L251bWJlcnxy YW5nZXx0ZXh0Ly50ZXN0KGcpKSYmKG09TnVtYmVyKG0pKTttP2Zba109bTpnPT09ayYmInJhbmdl IiE9PWcmJihmW2tdPSEwKX1yZXR1cm4gZi5tYXhsZW5ndGgmJi8tMXwyMTQ3NDgzNjQ3fDUyNDI4 OC8udGVzdChmLm1heGxlbmd0aCkmJmRlbGV0ZSBmLm1heGxlbmd0aCxmfSxkYXRhUnVsZXM6ZnVu Y3Rpb24oZSl7dmFyIGYsZz17fSxrPWIoZSk7Zm9yKGYgaW4gYi52YWxpZGF0b3IubWV0aG9kcyll PWsuZGF0YSgicnVsZS0iK2YudG9Mb3dlckNhc2UoKSksdm9pZCAwIT09DQplJiYoZ1tmXT1lKTty ZXR1cm4gZ30sc3RhdGljUnVsZXM6ZnVuY3Rpb24oZSl7dmFyIGY9e30sZz1iLmRhdGEoZS5mb3Jt LCJ2YWxpZGF0b3IiKTtyZXR1cm4gZy5zZXR0aW5ncy5ydWxlcyYmKGY9Yi52YWxpZGF0b3Iubm9y bWFsaXplUnVsZShnLnNldHRpbmdzLnJ1bGVzW2UubmFtZV0pfHx7fSksZn0sbm9ybWFsaXplUnVs ZXM6ZnVuY3Rpb24oZSxmKXtyZXR1cm4gYi5lYWNoKGUsZnVuY3Rpb24oZyxrKXtpZighMT09PWsp cmV0dXJuIGRlbGV0ZSBlW2ddLHZvaWQgMDtpZihrLnBhcmFtfHxrLmRlcGVuZHMpe3ZhciBtPSEw O3N3aXRjaCh0eXBlb2Ygay5kZXBlbmRzKXtjYXNlICJzdHJpbmciOm09ISFiKGsuZGVwZW5kcyxm LmZvcm0pLmxlbmd0aDticmVhaztjYXNlICJmdW5jdGlvbiI6bT1rLmRlcGVuZHMuY2FsbChmLGYp fW0/ZVtnXT12b2lkIDAhPT1rLnBhcmFtP2sucGFyYW06ITA6ZGVsZXRlIGVbZ119fSksYi5lYWNo KGUsZnVuY3Rpb24oZyxrKXtlW2ddPWIuaXNGdW5jdGlvbihrKT8NCmsoZik6a30pLGIuZWFjaChb Im1pbmxlbmd0aCIsIm1heGxlbmd0aCJdLGZ1bmN0aW9uKCl7ZVt0aGlzXSYmKGVbdGhpc109TnVt YmVyKGVbdGhpc10pKX0pLGIuZWFjaChbInJhbmdlbGVuZ3RoIiwicmFuZ2UiXSxmdW5jdGlvbigp e3ZhciBmO2VbdGhpc10mJihiLmlzQXJyYXkoZVt0aGlzXSk/ZVt0aGlzXT1bTnVtYmVyKGVbdGhp c11bMF0pLE51bWJlcihlW3RoaXNdWzFdKV06InN0cmluZyI9PXR5cGVvZiBlW3RoaXNdJiYoZj1l W3RoaXNdLnNwbGl0KC9bXHMsXSsvKSxlW3RoaXNdPVtOdW1iZXIoZlswXSksTnVtYmVyKGZbMV0p XSkpfSksYi52YWxpZGF0b3IuYXV0b0NyZWF0ZVJhbmdlcyYmKGUubWluJiZlLm1heCYmKGUucmFu Z2U9W2UubWluLGUubWF4XSxkZWxldGUgZS5taW4sZGVsZXRlIGUubWF4KSxlLm1pbmxlbmd0aCYm ZS5tYXhsZW5ndGgmJihlLnJhbmdlbGVuZ3RoPVtlLm1pbmxlbmd0aCxlLm1heGxlbmd0aF0sZGVs ZXRlIGUubWlubGVuZ3RoLGRlbGV0ZSBlLm1heGxlbmd0aCkpLA0KZX0sbm9ybWFsaXplUnVsZTpm dW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciBmPXt9O2IuZWFjaChlLnNwbGl0 KC9ccy8pLGZ1bmN0aW9uKCl7Zlt0aGlzXT0hMH0pO2U9Zn1yZXR1cm4gZX0sYWRkTWV0aG9kOmZ1 bmN0aW9uKGUsZixnKXtiLnZhbGlkYXRvci5tZXRob2RzW2VdPWY7Yi52YWxpZGF0b3IubWVzc2Fn ZXNbZV09dm9pZCAwIT09Zz9nOmIudmFsaWRhdG9yLm1lc3NhZ2VzW2VdOzM+Zi5sZW5ndGgmJmIu dmFsaWRhdG9yLmFkZENsYXNzUnVsZXMoZSxiLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlKGUpKX0s bWV0aG9kczp7cmVxdWlyZWQ6ZnVuY3Rpb24oZSxmLGcpe3JldHVybiF0aGlzLmRlcGVuZChnLGYp PyJkZXBlbmRlbmN5LW1pc21hdGNoIjoic2VsZWN0Ij09PWYubm9kZU5hbWUudG9Mb3dlckNhc2Uo KT8oZT1iKGYpLnZhbCgpKSYmMDxlLmxlbmd0aDp0aGlzLmNoZWNrYWJsZShmKT8wPHRoaXMuZ2V0 TGVuZ3RoKGUsZik6MDxiLnRyaW0oZSkubGVuZ3RofSwNCmVtYWlsOmZ1bmN0aW9uKGIsZil7cmV0 dXJuIHRoaXMub3B0aW9uYWwoZil8fC9eKCgoW2Etel18XGR8WyEjXCQlJidcKlwrXC1cLz1cP1xe X2B7XHx9fl18W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKyhcLihb YS16XXxcZHxbISNcJCUmJ1wqXCtcLVwvPVw/XF5fYHtcfH1+XXxbXHUwMEEwLVx1RDdGRlx1Rjkw MC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkrKSopfCgoXHgyMikoKCgoXHgyMHxceDA5KSooXHgwZFx4 MGEpKT8oXHgyMHxceDA5KSspPygoW1x4MDEtXHgwOFx4MGJceDBjXHgwZS1ceDFmXHg3Zl18XHgy MXxbXHgyMy1ceDViXXxbXHg1ZC1ceDdlXXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZE RjAtXHVGRkVGXSl8KFxcKFtceDAxLVx4MDlceDBiXHgwY1x4MGQtXHg3Zl18W1x1MDBBMC1cdUQ3 RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSkpKigoKFx4MjB8XHgwOSkqKFx4MGRceDBh KSk/KFx4MjB8XHgwOSkrKT8oXHgyMikpKUAoKChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1Rjkw MC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1c dUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5 MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16XXxcZHxbXHUwMEEwLVx1RDdGRlx1RjkwMC1c dUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuKSsoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1 RkRDRlx1RkRGMC1cdUZGRUZdKXwoKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1 RkRGMC1cdUZGRUZdKShbYS16XXxcZHwtfFwufF98fnxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZE Q0ZcdUZERjAtXHVGRkVGXSkqKFthLXpdfFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRG MC1cdUZGRUZdKSkpJC9pLnRlc3QoYil9LA0KdXJsOmZ1bmN0aW9uKGIsZil7cmV0dXJuIHRoaXMu b3B0aW9uYWwoZil8fC9eKGh0dHBzP3xzP2Z0cCk6XC9cLygoKChbYS16XXxcZHwtfFwufF98fnxb XHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KCVbXGRhLWZdezJ9KXxb IVwkJidcKFwpXCpcKyw7PV18OikqQCk/KCgoXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVsw LTVdKVwuKFxkfFsxLTldXGR8MVxkXGR8MlswLTRdXGR8MjVbMC01XSlcLihcZHxbMS05XVxkfDFc ZFxkfDJbMC00XVxkfDI1WzAtNV0pXC4oXGR8WzEtOV1cZHwxXGRcZHwyWzAtNF1cZHwyNVswLTVd KSl8KCgoW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0p fCgoW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKFth LXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRUZd KSooW2Etel18XGR8W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKSlc LikrKChbYS16XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSl8KChb YS16XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkoW2Etel18XGR8 LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pKihbYS16 XXxbXHUwMEEwLVx1RDdGRlx1RjkwMC1cdUZEQ0ZcdUZERjAtXHVGRkVGXSkpKVwuPykoOlxkKik/ KShcLygoKFthLXpdfFxkfC18XC58X3x+fFtcdTAwQTAtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRG MC1cdUZGRUZdKXwoJVtcZGEtZl17Mn0pfFshXCQmJ1woXClcKlwrLDs9XXw6fEApKyhcLygoW2Et el18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0p fCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCkqKSopPyk/KFw/KCgoW2Etel18 XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZFRl0pfCgl W1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCl8W1x1RTAwMC1cdUY4RkZdfFwvfFw/ KSopPygjKCgoW2Etel18XGR8LXxcLnxffH58W1x1MDBBMC1cdUQ3RkZcdUY5MDAtXHVGRENGXHVG REYwLVx1RkZFRl0pfCglW1xkYS1mXXsyfSl8WyFcJCYnXChcKVwqXCssOz1dfDp8QCl8XC98XD8p Kik/JC9pLnRlc3QoYil9LA0KZGF0ZTpmdW5jdGlvbihiLGYpe3JldHVybiB0aGlzLm9wdGlvbmFs KGYpfHwhL0ludmFsaWR8TmFOLy50ZXN0KCIiK25ldyBEYXRlKGIpKX0sZGF0ZUlTTzpmdW5jdGlv bihiLGYpe3JldHVybiB0aGlzLm9wdGlvbmFsKGYpfHwvXlxkezR9W1wvXC1dXGR7MSwyfVtcL1wt XVxkezEsMn0kLy50ZXN0KGIpfSxudW1iZXI6ZnVuY3Rpb24oYixmKXtyZXR1cm4gdGhpcy5vcHRp b25hbChmKXx8L14tPyg/OlxkK3xcZHsxLDN9KD86LFxkezN9KSspPyg/OlwuXGQrKT8kLy50ZXN0 KGIpfSxkaWdpdHM6ZnVuY3Rpb24oYixmKXtyZXR1cm4gdGhpcy5vcHRpb25hbChmKXx8L15cZCsk Ly50ZXN0KGIpfSxjcmVkaXRjYXJkOmZ1bmN0aW9uKGIsZil7aWYodGhpcy5vcHRpb25hbChmKSly ZXR1cm4iZGVwZW5kZW5jeS1taXNtYXRjaCI7aWYoL1teMC05IFwtXSsvLnRlc3QoYikpcmV0dXJu ITE7dmFyIGc9MCxrPTAsbT0hMTtiPWIucmVwbGFjZSgvXEQvZywiIik7Zm9yKHZhciBuPWIubGVu Z3RoLTE7MDw9DQpuO24tLSlrPWIuY2hhckF0KG4pLGs9cGFyc2VJbnQoaywxMCksbSYmOTwoayo9 MikmJihrLT05KSxnKz1rLG09IW07cmV0dXJuIDA9PT1nJTEwfSxtaW5sZW5ndGg6ZnVuY3Rpb24o ZSxmLGcpe2U9Yi5pc0FycmF5KGUpP2UubGVuZ3RoOnRoaXMuZ2V0TGVuZ3RoKGIudHJpbShlKSxm KTtyZXR1cm4gdGhpcy5vcHRpb25hbChmKXx8ZT49Z30sbWF4bGVuZ3RoOmZ1bmN0aW9uKGUsZixn KXtlPWIuaXNBcnJheShlKT9lLmxlbmd0aDp0aGlzLmdldExlbmd0aChiLnRyaW0oZSksZik7cmV0 dXJuIHRoaXMub3B0aW9uYWwoZil8fGc+PWV9LHJhbmdlbGVuZ3RoOmZ1bmN0aW9uKGUsZixnKXtl PWIuaXNBcnJheShlKT9lLmxlbmd0aDp0aGlzLmdldExlbmd0aChiLnRyaW0oZSksZik7cmV0dXJu IHRoaXMub3B0aW9uYWwoZil8fGU+PWdbMF0mJmdbMV0+PWV9LG1pbjpmdW5jdGlvbihiLGYsZyl7 cmV0dXJuIHRoaXMub3B0aW9uYWwoZil8fGI+PWd9LG1heDpmdW5jdGlvbihiLGYsZyl7cmV0dXJu IHRoaXMub3B0aW9uYWwoZil8fA0KZz49Yn0scmFuZ2U6ZnVuY3Rpb24oYixmLGcpe3JldHVybiB0 aGlzLm9wdGlvbmFsKGYpfHxiPj1nWzBdJiZnWzFdPj1ifSxlcXVhbFRvOmZ1bmN0aW9uKGUsZixn KXtnPWIoZyk7cmV0dXJuIHRoaXMuc2V0dGluZ3Mub25mb2N1c291dCYmZy51bmJpbmQoIi52YWxp ZGF0ZS1lcXVhbFRvIikuYmluZCgiYmx1ci52YWxpZGF0ZS1lcXVhbFRvIixmdW5jdGlvbigpe2Io ZikudmFsaWQoKX0pLGU9PT1nLnZhbCgpfSxyZW1vdGU6ZnVuY3Rpb24oZSxmLGcpe2lmKHRoaXMu b3B0aW9uYWwoZikpcmV0dXJuImRlcGVuZGVuY3ktbWlzbWF0Y2giO3ZhciBrPXRoaXMucHJldmlv dXNWYWx1ZShmKTtpZih0aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2YubmFtZV18fCh0aGlzLnNldHRp bmdzLm1lc3NhZ2VzW2YubmFtZV09e30pLGsub3JpZ2luYWxNZXNzYWdlPXRoaXMuc2V0dGluZ3Mu bWVzc2FnZXNbZi5uYW1lXS5yZW1vdGUsdGhpcy5zZXR0aW5ncy5tZXNzYWdlc1tmLm5hbWVdLnJl bW90ZT1rLm1lc3NhZ2UsDQpnPSJzdHJpbmciPT10eXBlb2YgZyYme3VybDpnfXx8ZyxrLm9sZD09 PWUpcmV0dXJuIGsudmFsaWQ7ay5vbGQ9ZTt2YXIgbT10aGlzO3RoaXMuc3RhcnRSZXF1ZXN0KGYp O3ZhciBuPXt9O3JldHVybiBuW2YubmFtZV09ZSxiLmFqYXgoYi5leHRlbmQoITAse3VybDpnLG1v ZGU6ImFib3J0Iixwb3J0OiJ2YWxpZGF0ZSIrZi5uYW1lLGRhdGFUeXBlOiJqc29uIixkYXRhOm4s c3VjY2VzczpmdW5jdGlvbihnKXttLnNldHRpbmdzLm1lc3NhZ2VzW2YubmFtZV0ucmVtb3RlPWsu b3JpZ2luYWxNZXNzYWdlO3ZhciBuPSEwPT09Z3x8InRydWUiPT09ZztpZihuKXt2YXIgeD1tLmZv cm1TdWJtaXR0ZWQ7bS5wcmVwYXJlRWxlbWVudChmKTttLmZvcm1TdWJtaXR0ZWQ9eDttLnN1Y2Nl c3NMaXN0LnB1c2goZik7ZGVsZXRlIG0uaW52YWxpZFtmLm5hbWVdO20uc2hvd0Vycm9ycygpfWVs c2UgeD17fSxnPWd8fG0uZGVmYXVsdE1lc3NhZ2UoZiwicmVtb3RlIikseFtmLm5hbWVdPWsubWVz c2FnZT0NCmIuaXNGdW5jdGlvbihnKT9nKGUpOmcsbS5pbnZhbGlkW2YubmFtZV09ITAsbS5zaG93 RXJyb3JzKHgpO2sudmFsaWQ9bjttLnN0b3BSZXF1ZXN0KGYsbil9fSxnKSksInBlbmRpbmcifX19 KTtiLmZvcm1hdD1iLnZhbGlkYXRvci5mb3JtYXR9KShqUXVlcnkpOyhmdW5jdGlvbihiKXt2YXIg ZT17fTtpZihiLmFqYXhQcmVmaWx0ZXIpYi5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGIsZixtKXtm PWIucG9ydDsiYWJvcnQiPT09Yi5tb2RlJiYoZVtmXSYmZVtmXS5hYm9ydCgpLGVbZl09bSl9KTtl bHNle3ZhciBmPWIuYWpheDtiLmFqYXg9ZnVuY3Rpb24oZyl7dmFyIGs9KCJwb3J0ImluIGc/Zzpi LmFqYXhTZXR0aW5ncykucG9ydDtyZXR1cm4iYWJvcnQiPT09KCJtb2RlImluIGc/ZzpiLmFqYXhT ZXR0aW5ncykubW9kZT8oZVtrXSYmZVtrXS5hYm9ydCgpLGVba109Zi5hcHBseSh0aGlzLGFyZ3Vt ZW50cyksZVtrXSk6Zi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0pKGpRdWVyeSk7DQooZnVuY3Rp b24oYil7Yi5leHRlbmQoYi5mbix7dmFsaWRhdGVEZWxlZ2F0ZTpmdW5jdGlvbihlLGYsZyl7cmV0 dXJuIHRoaXMuYmluZChmLGZ1bmN0aW9uKGYpe3ZhciBtPWIoZi50YXJnZXQpO3JldHVybiBtLmlz KGUpP2cuYXBwbHkobSxhcmd1bWVudHMpOnZvaWQgMH0pfX0pfSkoalF1ZXJ5KTsNCmZ1bmN0aW9u IEZhc3RDbGljayhiKXt2YXIgZSxmPXRoaXM7dGhpcy50cmFja2luZ0NsaWNrPSExO3RoaXMudHJh Y2tpbmdDbGlja1N0YXJ0PTA7dGhpcy50YXJnZXRFbGVtZW50PW51bGw7dGhpcy5sYXN0VG91Y2hJ ZGVudGlmaWVyPXRoaXMudG91Y2hTdGFydFk9dGhpcy50b3VjaFN0YXJ0WD0wO3RoaXMudG91Y2hC b3VuZGFyeT0xMDt0aGlzLmxheWVyPWI7aWYoIWJ8fCFiLm5vZGVUeXBlKXRocm93IG5ldyBUeXBl RXJyb3IoIkxheWVyIG11c3QgYmUgYSBkb2N1bWVudCBub2RlIik7dGhpcy5vbkNsaWNrPWZ1bmN0 aW9uKCl7cmV0dXJuIEZhc3RDbGljay5wcm90b3R5cGUub25DbGljay5hcHBseShmLGFyZ3VtZW50 cyl9O3RoaXMub25Nb3VzZT1mdW5jdGlvbigpe3JldHVybiBGYXN0Q2xpY2sucHJvdG90eXBlLm9u TW91c2UuYXBwbHkoZixhcmd1bWVudHMpfTt0aGlzLm9uVG91Y2hTdGFydD1mdW5jdGlvbigpe3Jl dHVybiBGYXN0Q2xpY2sucHJvdG90eXBlLm9uVG91Y2hTdGFydC5hcHBseShmLA0KYXJndW1lbnRz KX07dGhpcy5vblRvdWNoTW92ZT1mdW5jdGlvbigpe3JldHVybiBGYXN0Q2xpY2sucHJvdG90eXBl Lm9uVG91Y2hNb3ZlLmFwcGx5KGYsYXJndW1lbnRzKX07dGhpcy5vblRvdWNoRW5kPWZ1bmN0aW9u KCl7cmV0dXJuIEZhc3RDbGljay5wcm90b3R5cGUub25Ub3VjaEVuZC5hcHBseShmLGFyZ3VtZW50 cyl9O3RoaXMub25Ub3VjaENhbmNlbD1mdW5jdGlvbigpe3JldHVybiBGYXN0Q2xpY2sucHJvdG90 eXBlLm9uVG91Y2hDYW5jZWwuYXBwbHkoZixhcmd1bWVudHMpfTtGYXN0Q2xpY2subm90TmVlZGVk KGIpfHwodGhpcy5kZXZpY2VJc0FuZHJvaWQmJihiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3Zl ciIsdGhpcy5vbk1vdXNlLCEwKSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5v bk1vdXNlLCEwKSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMub25Nb3VzZSwhMCkp LGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub25DbGljaywNCiEwKSxiLmFkZEV2ZW50 TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMub25Ub3VjaFN0YXJ0LCExKSxiLmFkZEV2ZW50TGlz dGVuZXIoInRvdWNobW92ZSIsdGhpcy5vblRvdWNoTW92ZSwhMSksYi5hZGRFdmVudExpc3RlbmVy KCJ0b3VjaGVuZCIsdGhpcy5vblRvdWNoRW5kLCExKSxiLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNo Y2FuY2VsIix0aGlzLm9uVG91Y2hDYW5jZWwsITEpLEV2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRp YXRlUHJvcGFnYXRpb258fChiLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSxmLG0pe3Zh ciBuPU5vZGUucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI7ImNsaWNrIj09PWU/bi5jYWxs KGIsZSxmLmhpamFja2VkfHxmLG0pOm4uY2FsbChiLGUsZixtKX0sYi5hZGRFdmVudExpc3RlbmVy PWZ1bmN0aW9uKGUsZixtKXt2YXIgbj1Ob2RlLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyOyJj bGljayI9PT1lP24uY2FsbChiLGUsZi5oaWphY2tlZHx8DQooZi5oaWphY2tlZD1mdW5jdGlvbihi KXtiLnByb3BhZ2F0aW9uU3RvcHBlZHx8ZihiKX0pLG0pOm4uY2FsbChiLGUsZixtKX0pLCJmdW5j dGlvbiI9PT10eXBlb2YgYi5vbmNsaWNrJiYoZT1iLm9uY2xpY2ssYi5hZGRFdmVudExpc3RlbmVy KCJjbGljayIsZnVuY3Rpb24oYil7ZShiKX0sITEpLGIub25jbGljaz1udWxsKSl9RmFzdENsaWNr LnByb3RvdHlwZS5kZXZpY2VJc0FuZHJvaWQ9MDxuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2Yo IkFuZHJvaWQiKTtGYXN0Q2xpY2sucHJvdG90eXBlLmRldmljZUlzSU9TPS9pUChhZHxob25lfG9k KS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtGYXN0Q2xpY2sucHJvdG90eXBlLmRldmljZUlz SU9TND1GYXN0Q2xpY2sucHJvdG90eXBlLmRldmljZUlzSU9TJiYvT1MgNF9cZChfXGQpPy8udGVz dChuYXZpZ2F0b3IudXNlckFnZW50KTsNCkZhc3RDbGljay5wcm90b3R5cGUuZGV2aWNlSXNJT1NX aXRoQmFkVGFyZ2V0PUZhc3RDbGljay5wcm90b3R5cGUuZGV2aWNlSXNJT1MmJi9PUyAoWzYtOV18 XGR7Mn0pX1xkLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO0Zhc3RDbGljay5wcm90b3R5cGUu bmVlZHNDbGljaz1mdW5jdGlvbihiKXtzd2l0Y2goYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtj YXNlICJidXR0b24iOmNhc2UgInNlbGVjdCI6Y2FzZSAidGV4dGFyZWEiOmlmKGIuZGlzYWJsZWQp cmV0dXJuITA7YnJlYWs7Y2FzZSAiaW5wdXQiOmlmKHRoaXMuZGV2aWNlSXNJT1MmJiJmaWxlIj09 PWIudHlwZXx8Yi5kaXNhYmxlZClyZXR1cm4hMDticmVhaztjYXNlICJsYWJlbCI6Y2FzZSAidmlk ZW8iOnJldHVybiEwfXJldHVybi9cYm5lZWRzY2xpY2tcYi8udGVzdChiLmNsYXNzTmFtZSl9Ow0K RmFzdENsaWNrLnByb3RvdHlwZS5uZWVkc0ZvY3VzPWZ1bmN0aW9uKGIpe3N3aXRjaChiLm5vZGVO YW1lLnRvTG93ZXJDYXNlKCkpe2Nhc2UgInRleHRhcmVhIjpyZXR1cm4hMDtjYXNlICJzZWxlY3Qi OnJldHVybiF0aGlzLmRldmljZUlzQW5kcm9pZDtjYXNlICJpbnB1dCI6c3dpdGNoKGIudHlwZSl7 Y2FzZSAiYnV0dG9uIjpjYXNlICJjaGVja2JveCI6Y2FzZSAiZmlsZSI6Y2FzZSAiaW1hZ2UiOmNh c2UgInJhZGlvIjpjYXNlICJzdWJtaXQiOnJldHVybiExfXJldHVybiFiLmRpc2FibGVkJiYhYi5y ZWFkT25seTtkZWZhdWx0OnJldHVybi9cYm5lZWRzZm9jdXNcYi8udGVzdChiLmNsYXNzTmFtZSl9 fTsNCkZhc3RDbGljay5wcm90b3R5cGUuc2VuZENsaWNrPWZ1bmN0aW9uKGIsZSl7dmFyIGYsZztk b2N1bWVudC5hY3RpdmVFbGVtZW50JiZkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09YiYmZG9jdW1l bnQuYWN0aXZlRWxlbWVudC5ibHVyKCk7Zz1lLmNoYW5nZWRUb3VjaGVzWzBdO2Y9ZG9jdW1lbnQu Y3JlYXRlRXZlbnQoIk1vdXNlRXZlbnRzIik7Zi5pbml0TW91c2VFdmVudCh0aGlzLmRldGVybWlu ZUV2ZW50VHlwZShiKSwhMCwhMCx3aW5kb3csMSxnLnNjcmVlblgsZy5zY3JlZW5ZLGcuY2xpZW50 WCxnLmNsaWVudFksITEsITEsITEsITEsMCxudWxsKTtmLmZvcndhcmRlZFRvdWNoRXZlbnQ9ITA7 Yi5kaXNwYXRjaEV2ZW50KGYpfTtGYXN0Q2xpY2sucHJvdG90eXBlLmRldGVybWluZUV2ZW50VHlw ZT1mdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kZXZpY2VJc0FuZHJvaWQmJiJzZWxlY3QiPT09Yi50 YWdOYW1lLnRvTG93ZXJDYXNlKCk/Im1vdXNlZG93biI6ImNsaWNrIn07DQpGYXN0Q2xpY2sucHJv dG90eXBlLmZvY3VzPWZ1bmN0aW9uKGIpe3ZhciBlO3RoaXMuZGV2aWNlSXNJT1MmJmIuc2V0U2Vs ZWN0aW9uUmFuZ2UmJjAhPT1iLnR5cGUuaW5kZXhPZigiZGF0ZSIpJiYidGltZSIhPT1iLnR5cGU/ KGU9Yi52YWx1ZS5sZW5ndGgsYi5zZXRTZWxlY3Rpb25SYW5nZShlLGUpKTpiLmZvY3VzKCl9O0Zh c3RDbGljay5wcm90b3R5cGUudXBkYXRlU2Nyb2xsUGFyZW50PWZ1bmN0aW9uKGIpe3ZhciBlLGY7 ZT1iLmZhc3RDbGlja1Njcm9sbFBhcmVudDtpZighZXx8IWUuY29udGFpbnMoYikpe2Y9Yjtkb3tp ZihmLnNjcm9sbEhlaWdodD5mLm9mZnNldEhlaWdodCl7ZT1mO2IuZmFzdENsaWNrU2Nyb2xsUGFy ZW50PWY7YnJlYWt9Zj1mLnBhcmVudEVsZW1lbnR9d2hpbGUoZil9ZSYmKGUuZmFzdENsaWNrTGFz dFNjcm9sbFRvcD1lLnNjcm9sbFRvcCl9Ow0KRmFzdENsaWNrLnByb3RvdHlwZS5nZXRUYXJnZXRF bGVtZW50RnJvbUV2ZW50VGFyZ2V0PWZ1bmN0aW9uKGIpe3JldHVybiBiLm5vZGVUeXBlPT09Tm9k ZS5URVhUX05PREU/Yi5wYXJlbnROb2RlOmJ9Ow0KRmFzdENsaWNrLnByb3RvdHlwZS5vblRvdWNo U3RhcnQ9ZnVuY3Rpb24oYil7dmFyIGUsZixnO2lmKDE8Yi50YXJnZXRUb3VjaGVzLmxlbmd0aCly ZXR1cm4hMDtlPXRoaXMuZ2V0VGFyZ2V0RWxlbWVudEZyb21FdmVudFRhcmdldChiLnRhcmdldCk7 Zj1iLnRhcmdldFRvdWNoZXNbMF07aWYodGhpcy5kZXZpY2VJc0lPUyl7Zz13aW5kb3cuZ2V0U2Vs ZWN0aW9uKCk7aWYoZy5yYW5nZUNvdW50JiYhZy5pc0NvbGxhcHNlZClyZXR1cm4hMDtpZighdGhp cy5kZXZpY2VJc0lPUzQpe2lmKGYuaWRlbnRpZmllcj09PXRoaXMubGFzdFRvdWNoSWRlbnRpZmll cilyZXR1cm4gYi5wcmV2ZW50RGVmYXVsdCgpLCExO3RoaXMubGFzdFRvdWNoSWRlbnRpZmllcj1m LmlkZW50aWZpZXI7dGhpcy51cGRhdGVTY3JvbGxQYXJlbnQoZSl9fXRoaXMudHJhY2tpbmdDbGlj az0hMDt0aGlzLnRyYWNraW5nQ2xpY2tTdGFydD1iLnRpbWVTdGFtcDt0aGlzLnRhcmdldEVsZW1l bnQ9ZTt0aGlzLnRvdWNoU3RhcnRYPQ0KZi5wYWdlWDt0aGlzLnRvdWNoU3RhcnRZPWYucGFnZVk7 MjAwPmIudGltZVN0YW1wLXRoaXMubGFzdENsaWNrVGltZSYmYi5wcmV2ZW50RGVmYXVsdCgpO3Jl dHVybiEwfTtGYXN0Q2xpY2sucHJvdG90eXBlLnRvdWNoSGFzTW92ZWQ9ZnVuY3Rpb24oYil7Yj1i LmNoYW5nZWRUb3VjaGVzWzBdO3ZhciBlPXRoaXMudG91Y2hCb3VuZGFyeTtyZXR1cm4gTWF0aC5h YnMoYi5wYWdlWC10aGlzLnRvdWNoU3RhcnRYKT5lfHxNYXRoLmFicyhiLnBhZ2VZLXRoaXMudG91 Y2hTdGFydFkpPmU/ITA6ITF9O0Zhc3RDbGljay5wcm90b3R5cGUub25Ub3VjaE1vdmU9ZnVuY3Rp b24oYil7aWYoIXRoaXMudHJhY2tpbmdDbGljaylyZXR1cm4hMDtpZih0aGlzLnRhcmdldEVsZW1l bnQhPT10aGlzLmdldFRhcmdldEVsZW1lbnRGcm9tRXZlbnRUYXJnZXQoYi50YXJnZXQpfHx0aGlz LnRvdWNoSGFzTW92ZWQoYikpdGhpcy50cmFja2luZ0NsaWNrPSExLHRoaXMudGFyZ2V0RWxlbWVu dD1udWxsO3JldHVybiEwfTsNCkZhc3RDbGljay5wcm90b3R5cGUuZmluZENvbnRyb2w9ZnVuY3Rp b24oYil7cmV0dXJuIHZvaWQgMCE9PWIuY29udHJvbD9iLmNvbnRyb2w6Yi5odG1sRm9yP2RvY3Vt ZW50LmdldEVsZW1lbnRCeUlkKGIuaHRtbEZvcik6Yi5xdWVyeVNlbGVjdG9yKCJidXR0b24sIGlu cHV0Om5vdChbdHlwZVx4M2RoaWRkZW5dKSwga2V5Z2VuLCBtZXRlciwgb3V0cHV0LCBwcm9ncmVz cywgc2VsZWN0LCB0ZXh0YXJlYSIpfTsNCkZhc3RDbGljay5wcm90b3R5cGUub25Ub3VjaEVuZD1m dW5jdGlvbihiKXt2YXIgZSxmLGc9dGhpcy50YXJnZXRFbGVtZW50O2lmKCF0aGlzLnRyYWNraW5n Q2xpY2spcmV0dXJuITA7aWYoMjAwPmIudGltZVN0YW1wLXRoaXMubGFzdENsaWNrVGltZSlyZXR1 cm4gdGhpcy5jYW5jZWxOZXh0Q2xpY2s9ITA7dGhpcy5jYW5jZWxOZXh0Q2xpY2s9ITE7dGhpcy5s YXN0Q2xpY2tUaW1lPWIudGltZVN0YW1wO2U9dGhpcy50cmFja2luZ0NsaWNrU3RhcnQ7dGhpcy50 cmFja2luZ0NsaWNrPSExO3RoaXMudHJhY2tpbmdDbGlja1N0YXJ0PTA7dGhpcy5kZXZpY2VJc0lP U1dpdGhCYWRUYXJnZXQmJihmPWIuY2hhbmdlZFRvdWNoZXNbMF0sZz1kb2N1bWVudC5lbGVtZW50 RnJvbVBvaW50KGYucGFnZVgtd2luZG93LnBhZ2VYT2Zmc2V0LGYucGFnZVktd2luZG93LnBhZ2VZ T2Zmc2V0KXx8ZyxnLmZhc3RDbGlja1Njcm9sbFBhcmVudD10aGlzLnRhcmdldEVsZW1lbnQuZmFz dENsaWNrU2Nyb2xsUGFyZW50KTsNCmY9Zy50YWdOYW1lLnRvTG93ZXJDYXNlKCk7aWYoImxhYmVs Ij09PWYpe2lmKGU9dGhpcy5maW5kQ29udHJvbChnKSl7dGhpcy5mb2N1cyhnKTtpZih0aGlzLmRl dmljZUlzQW5kcm9pZClyZXR1cm4hMTtnPWV9fWVsc2UgaWYodGhpcy5uZWVkc0ZvY3VzKGcpKXtp ZigxMDA8Yi50aW1lU3RhbXAtZXx8dGhpcy5kZXZpY2VJc0lPUyYmd2luZG93LnRvcCE9PXdpbmRv dyYmImlucHV0Ij09PWYpcmV0dXJuIHRoaXMudGFyZ2V0RWxlbWVudD1udWxsLCExO3RoaXMuZm9j dXMoZyk7aWYoIXRoaXMuZGV2aWNlSXNJT1M0fHwic2VsZWN0IiE9PWYpdGhpcy50YXJnZXRFbGVt ZW50PW51bGwsYi5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiExfWlmKHRoaXMuZGV2aWNlSXNJT1Mm JiF0aGlzLmRldmljZUlzSU9TNCYmKGU9Zy5mYXN0Q2xpY2tTY3JvbGxQYXJlbnQpJiZlLmZhc3RD bGlja0xhc3RTY3JvbGxUb3AhPT1lLnNjcm9sbFRvcClyZXR1cm4hMDt0aGlzLm5lZWRzQ2xpY2so Zyl8fChiLnByZXZlbnREZWZhdWx0KCksDQp0aGlzLnNlbmRDbGljayhnLGIpKTtyZXR1cm4hMX07 RmFzdENsaWNrLnByb3RvdHlwZS5vblRvdWNoQ2FuY2VsPWZ1bmN0aW9uKCl7dGhpcy50cmFja2lu Z0NsaWNrPSExO3RoaXMudGFyZ2V0RWxlbWVudD1udWxsfTtGYXN0Q2xpY2sucHJvdG90eXBlLm9u TW91c2U9ZnVuY3Rpb24oYil7cmV0dXJuIXRoaXMudGFyZ2V0RWxlbWVudHx8Yi5mb3J3YXJkZWRU b3VjaEV2ZW50fHwhYi5jYW5jZWxhYmxlPyEwOiF0aGlzLm5lZWRzQ2xpY2sodGhpcy50YXJnZXRF bGVtZW50KXx8dGhpcy5jYW5jZWxOZXh0Q2xpY2s/KGIuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9u P2Iuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk6Yi5wcm9wYWdhdGlvblN0b3BwZWQ9ITAsYi5z dG9wUHJvcGFnYXRpb24oKSxiLnByZXZlbnREZWZhdWx0KCksITEpOiEwfTsNCkZhc3RDbGljay5w cm90b3R5cGUub25DbGljaz1mdW5jdGlvbihiKXtpZih0aGlzLnRyYWNraW5nQ2xpY2spcmV0dXJu IHRoaXMudGFyZ2V0RWxlbWVudD1udWxsLHRoaXMudHJhY2tpbmdDbGljaz0hMSwhMDtpZigic3Vi bWl0Ij09PWIudGFyZ2V0LnR5cGUmJjA9PT1iLmRldGFpbClyZXR1cm4hMDtiPXRoaXMub25Nb3Vz ZShiKTtifHwodGhpcy50YXJnZXRFbGVtZW50PW51bGwpO3JldHVybiBifTsNCkZhc3RDbGljay5w cm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBiPXRoaXMubGF5ZXI7dGhpcy5kZXZpY2VJ c0FuZHJvaWQmJihiLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5vbk1vdXNl LCEwKSxiLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlLCEwKSxi LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHRoaXMub25Nb3VzZSwhMCkpO2IucmVtb3Zl RXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub25DbGljaywhMCk7Yi5yZW1vdmVFdmVudExpc3Rl bmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm9uVG91Y2hTdGFydCwhMSk7Yi5yZW1vdmVFdmVudExpc3Rl bmVyKCJ0b3VjaG1vdmUiLHRoaXMub25Ub3VjaE1vdmUsITEpO2IucmVtb3ZlRXZlbnRMaXN0ZW5l cigidG91Y2hlbmQiLHRoaXMub25Ub3VjaEVuZCwhMSk7Yi5yZW1vdmVFdmVudExpc3RlbmVyKCJ0 b3VjaGNhbmNlbCIsdGhpcy5vblRvdWNoQ2FuY2VsLCExKX07DQpGYXN0Q2xpY2subm90TmVlZGVk PWZ1bmN0aW9uKGIpe3ZhciBlLGY7aWYoInVuZGVmaW5lZCI9PT10eXBlb2Ygd2luZG93Lm9udG91 Y2hzdGFydClyZXR1cm4hMDtpZihmPSsoL0Nocm9tZVwvKFswLTldKykvLmV4ZWMobmF2aWdhdG9y LnVzZXJBZ2VudCl8fFssMF0pWzFdKWlmKEZhc3RDbGljay5wcm90b3R5cGUuZGV2aWNlSXNBbmRy b2lkKXtpZigoZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJtZXRhW25hbWVceDNkdmlld3BvcnRd IikpJiYoLTEhPT1lLmNvbnRlbnQuaW5kZXhPZigidXNlci1zY2FsYWJsZVx4M2RubyIpfHwzMTxm JiZ3aW5kb3cuaW5uZXJXaWR0aDw9d2luZG93LnNjcmVlbi53aWR0aCkpcmV0dXJuITB9ZWxzZSBy ZXR1cm4hMDtyZXR1cm4ibm9uZSI9PT1iLnN0eWxlLm1zVG91Y2hBY3Rpb24/ITA6ITF9O0Zhc3RD bGljay5hdHRhY2g9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBGYXN0Q2xpY2soYil9Ow0KInVuZGVm aW5lZCIhPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShmdW5jdGlvbigpe3JldHVy biBGYXN0Q2xpY2t9KToidW5kZWZpbmVkIiE9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRz Pyhtb2R1bGUuZXhwb3J0cz1GYXN0Q2xpY2suYXR0YWNoLG1vZHVsZS5leHBvcnRzLkZhc3RDbGlj az1GYXN0Q2xpY2spOndpbmRvdy5GYXN0Q2xpY2s9RmFzdENsaWNrOw0KKGZ1bmN0aW9uKGIsZSxm KXtmdW5jdGlvbiBnKGIpe3ZhciBlPXt9LGc9L15qUXVlcnlcZCskLztmLmVhY2goYi5hdHRyaWJ1 dGVzLGZ1bmN0aW9uKGIsZil7Zi5zcGVjaWZpZWQmJiFnLnRlc3QoZi5uYW1lKSYmKGVbZi5uYW1l XT1mLnZhbHVlKX0pO3JldHVybiBlfWZ1bmN0aW9uIGsoYixlKXt2YXIgZz1mKHRoaXMpO2lmKHRo aXMudmFsdWU9PWcuYXR0cigicGxhY2Vob2xkZXIiKSYmZy5oYXNDbGFzcygicGxhY2Vob2xkZXIi KSlpZihnLmRhdGEoInBsYWNlaG9sZGVyLXBhc3N3b3JkIikpe2c9Zy5oaWRlKCkubmV4dCgpLnNo b3coKS5hdHRyKCJpZCIsZy5yZW1vdmVBdHRyKCJpZCIpLmRhdGEoInBsYWNlaG9sZGVyLWlkIikp O2lmKCEwPT09YilyZXR1cm4gZ1swXS52YWx1ZT1lO2cuZm9jdXMoKX1lbHNlIHRoaXMudmFsdWU9 IiIsZy5yZW1vdmVDbGFzcygicGxhY2Vob2xkZXIiKSx0aGlzPT1uKCkmJnRoaXMuc2VsZWN0KCl9 ZnVuY3Rpb24gbSgpe3ZhciBiLGU9Zih0aGlzKSxtPQ0KdGhpcy5pZDtpZigiIj09dGhpcy52YWx1 ZSl7aWYoInBhc3N3b3JkIj09dGhpcy50eXBlKXtpZighZS5kYXRhKCJwbGFjZWhvbGRlci10ZXh0 aW5wdXQiKSl7dHJ5e2I9ZS5jbG9uZSgpLmF0dHIoe3R5cGU6InRleHQifSl9Y2F0Y2gobil7Yj1m KCJceDNjaW5wdXRceDNlIikuYXR0cihmLmV4dGVuZChnKHRoaXMpLHt0eXBlOiJ0ZXh0In0pKX1i LnJlbW92ZUF0dHIoIm5hbWUiKS5kYXRhKHsicGxhY2Vob2xkZXItcGFzc3dvcmQiOmUsInBsYWNl aG9sZGVyLWlkIjptfSkuYmluZCgiZm9jdXMucGxhY2Vob2xkZXIiLGspO2UuZGF0YSh7InBsYWNl aG9sZGVyLXRleHRpbnB1dCI6YiwicGxhY2Vob2xkZXItaWQiOm19KS5iZWZvcmUoYil9ZT1lLnJl bW92ZUF0dHIoImlkIikuaGlkZSgpLnByZXYoKS5hdHRyKCJpZCIsbSkuc2hvdygpfWUuYWRkQ2xh c3MoInBsYWNlaG9sZGVyIik7ZVswXS52YWx1ZT1lLmF0dHIoInBsYWNlaG9sZGVyIil9ZWxzZSBl LnJlbW92ZUNsYXNzKCJwbGFjZWhvbGRlciIpfQ0KZnVuY3Rpb24gbigpe3RyeXtyZXR1cm4gZS5h Y3RpdmVFbGVtZW50fWNhdGNoKGIpe319dmFyIHc9IltvYmplY3QgT3BlcmFNaW5pXSI9PU9iamVj dC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiLm9wZXJhbWluaSksej0icGxhY2Vob2xkZXIiaW4g ZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpJiYhdyx3PSJwbGFjZWhvbGRlciJpbiBlLmNyZWF0ZUVs ZW1lbnQoInRleHRhcmVhIikmJiF3LHg9Zi5mbixWPWYudmFsSG9va3MsVD1mLnByb3BIb29rczt6 JiZ3Pyh4PXgucGxhY2Vob2xkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30seC5pbnB1dD14LnRl eHRhcmVhPSEwKTooeD14LnBsYWNlaG9sZGVyPWZ1bmN0aW9uKCl7dGhpcy5maWx0ZXIoKHo/InRl eHRhcmVhIjoiOmlucHV0IikrIltwbGFjZWhvbGRlcl0iKS5ub3QoIi5wbGFjZWhvbGRlciIpLmJp bmQoeyJmb2N1cy5wbGFjZWhvbGRlciI6aywiYmx1ci5wbGFjZWhvbGRlciI6bX0pLmRhdGEoInBs YWNlaG9sZGVyLWVuYWJsZWQiLA0KITApLnRyaWdnZXIoImJsdXIucGxhY2Vob2xkZXIiKTtyZXR1 cm4gdGhpc30seC5pbnB1dD16LHgudGV4dGFyZWE9dyx4PXtnZXQ6ZnVuY3Rpb24oYil7dmFyIGU9 ZihiKSxnPWUuZGF0YSgicGxhY2Vob2xkZXItcGFzc3dvcmQiKTtyZXR1cm4gZz9nWzBdLnZhbHVl OmUuZGF0YSgicGxhY2Vob2xkZXItZW5hYmxlZCIpJiZlLmhhc0NsYXNzKCJwbGFjZWhvbGRlciIp PyIiOmIudmFsdWV9LHNldDpmdW5jdGlvbihiLGUpe3ZhciBnPWYoYiksdz1nLmRhdGEoInBsYWNl aG9sZGVyLXBhc3N3b3JkIik7aWYodylyZXR1cm4gd1swXS52YWx1ZT1lO2lmKCFnLmRhdGEoInBs YWNlaG9sZGVyLWVuYWJsZWQiKSlyZXR1cm4gYi52YWx1ZT1lOyIiPT1lPyhiLnZhbHVlPWUsYiE9 bigpJiZtLmNhbGwoYikpOmcuaGFzQ2xhc3MoInBsYWNlaG9sZGVyIik/ay5jYWxsKGIsITAsZSl8 fChiLnZhbHVlPWUpOmIudmFsdWU9ZTtyZXR1cm4gZ319LHp8fChWLmlucHV0PXgsVC52YWx1ZT14 KSx3fHwoVi50ZXh0YXJlYT0NCngsVC52YWx1ZT14KSxmKGZ1bmN0aW9uKCl7ZihlKS5kZWxlZ2F0 ZSgiZm9ybSIsInN1Ym1pdC5wbGFjZWhvbGRlciIsZnVuY3Rpb24oKXt2YXIgYj1mKCIucGxhY2Vo b2xkZXIiLHRoaXMpLmVhY2goayk7c2V0VGltZW91dChmdW5jdGlvbigpe2IuZWFjaChtKX0sMTAp fSl9KSxmKGIpLmJpbmQoImJlZm9yZXVubG9hZC5wbGFjZWhvbGRlciIsZnVuY3Rpb24oKXtmKCIu cGxhY2Vob2xkZXIiKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy52YWx1ZT0iIn0pfSkpfSkodGhpcyxk b2N1bWVudCxqUXVlcnkpOyQod2luZG93KS5vbigibG9hZCIsZnVuY3Rpb24oKXtGYXN0Q2xpY2su YXR0YWNoKGRvY3VtZW50LmJvZHkpfSk7DQooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZSgpe3ZhciBl PWIoIiNtb250aCBvcHRpb246c2VsZWN0ZWQiKS5hdHRyKCJ2YWx1ZSIpLTEsZj1iKCIjeWVhciBv cHRpb246c2VsZWN0ZWQiKS5hdHRyKCJ2YWx1ZSIpLG09YigiI2RheSBvcHRpb246c2VsZWN0ZWQi KS5hdHRyKCJ2YWx1ZSIpO2U/Zj9lPTMyLShuZXcgRGF0ZShmLGUsMzIpKS5nZXREYXRlKCk6MT09 PWU/ZT0yOTooZj0obmV3IERhdGUpLmdldEZ1bGxZZWFyKCksZT0zMi0obmV3IERhdGUoZixlLDMy KSkuZ2V0RGF0ZSgpKTplPTMxO3ZhciBmPWIoIiNkYXkiKSxuLHc7bj1mLnByb3A/Zi5wcm9wKCJv cHRpb25zIik6Zi5hdHRyKCJvcHRpb25zIik7aWYobi5sZW5ndGgtMSE9PWUpe249MDxuLmxlbmd0 aD9uWzBdLnRleHQ6IkRheSI7Yigib3B0aW9uIixmKS5yZW1vdmUoKTtmLmFwcGVuZChiKCJceDNj b3B0aW9uIC9ceDNlIikudmFsKCIiKS50ZXh0KG4pKTtmb3Iobj0xO248PWU7bis9MSl3PXdpbmRv dy5zcGVjaWFsX2RheV9jaGFyfHwNCiIiLGYuYXBwZW5kKGIoIlx4M2NvcHRpb24gL1x4M2UiKS52 YWwobikudGV4dChuLnRvU3RyaW5nKDEwKSt3KSk7Zi52YWwoIiIpfW0/KGIoIiNkYXkiKS52YWwo bSksIiI9PT1iKCIjZGF5IikudmFsKCk/YigiI2RheSIpLnJlbW92ZUNsYXNzKCJzZWxlY3RlZCIp OmIoIiNkYXkiKS5hZGRDbGFzcygic2VsZWN0ZWQiKSk6YigiI2RheSIpLnZhbCgiIil9dmFyIGY9 Im9udG91Y2hzdGFydCJpbiB3aW5kb3d8fHdpbmRvdy5Eb2N1bWVudFRvdWNoJiZkb2N1bWVudCBp bnN0YW5jZW9mIERvY3VtZW50VG91Y2g7Yi5mbi5xdWlja0NoYW5nZT1mdW5jdGlvbihlKXtyZXR1 cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe20uc2VsZWN0ZWRJbmRleCE9PW0u cWNpbmRleCYmKG0ucWNpbmRleD1tLnNlbGVjdGVkSW5kZXgsZS5hcHBseShtKSl9dmFyIG09dGhp cyxuO20ucWNpbmRleD1tLnNlbGVjdGVkSW5kZXg7YihtKS5mb2N1cyhmdW5jdGlvbigpe2YmJihu PXNldEludGVydmFsKGssDQoxMDApKX0pLmJsdXIoZnVuY3Rpb24oKXtmJiZ3aW5kb3cuY2xlYXJJ bnRlcnZhbChuKX0pLmNoYW5nZShrKX0pfTtiKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpe2Io IiNtb250aCIpLnF1aWNrQ2hhbmdlKGZ1bmN0aW9uKCl7ZSgpfSk7YigiI3llYXIiKS5xdWlja0No YW5nZShmdW5jdGlvbigpe2UoKX0pfSl9KShqUXVlcnkpOw0KKGZ1bmN0aW9uKGIpe3ZhciBlPWIu SU1TfHx7fTtlLnNldHVwX3Rvc19wb2xpY3k9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShiLGYpe3Jl dHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZnx8LTEhPT0kLmluQXJyYXkoZSxtW2JdKT8obi5odG1s KCQoIiN0b3VfIitiKyJfdGVtcGxhdGUiKS5odG1sKCkpLCEwKTohMX19Yj1iLnJlcGxhY2UoLyAr L2csIiIpLnNwbGl0KCI7Iik7dmFyIGssbT17bGlnaHQ6W10sbWVkaXVtOltdLGhlYXZ5OltdfSxu PSQoIiN0b3NfcG9saWN5Iiksdyx6LHgsVixULE07ej1lKCJsaWdodCIpO3g9ZSgibWVkaXVtIik7 Vj1lKCJoZWF2eSIpO3c9ZSgiaGVhdnkiLCEwKTtmb3IoTT0wO008Yi5sZW5ndGg7TSs9MSlrPWJb TV0uc3BsaXQoIjoiKSxUPWtbMF0saz1rWzFdLnNwbGl0KCIsIiksbVtUXT1rLCJBTEwiPT09a1sw XSYmKHc9ZShULCEwKSk7JCgiI2NvdW50cnkiKS5jaGFuZ2UoZnVuY3Rpb24oYil7Yj0kKHRoaXMp LnZhbCgpO3ooYil8fHgoYil8fFYoYil8fA0KdyhiKX0pfTtiLklNUz1lfSkod2luZG93KTsoZnVu Y3Rpb24oYil7Yj1iLklNUz1iLklNU3x8e307Yi5hcHBseV9mb2N1c19jbGFzcz1mdW5jdGlvbihi LGYpe2Y9Znx8ImFjdGl2ZSI7cmV0dXJuIGZ1bmN0aW9uKGcsayl7dmFyIG09JChrKTttLmZpbmQo Yikub24oImZvY3VzIixmdW5jdGlvbihiKXttLmFkZENsYXNzKGYpfSk7bS5maW5kKGIpLm9uKCJm b2N1c291dCIsZnVuY3Rpb24oYil7bS5yZW1vdmVDbGFzcyhmKX0pO2NvbnNvbGUubG9nKGspfX07 cmV0dXJuIGJ9KSh3aW5kb3cpOyJ1c2Ugc3RyaWN0IjsNCiQudmFsaWRhdG9yLnNldERlZmF1bHRz KHtvbmZvY3Vzb3V0OiExLHVuaGlnaGxpZ2h0OmZ1bmN0aW9uKGIsZSxmKXskKGIpLnJlbW92ZUNs YXNzKGUpO3ZhciBnOyhnPWdldEVuaGFuY2VkRHJvcGRvd25QYXJlbnQoYikpJiZnLnJlbW92ZUNs YXNzKGUpO2I9JChiKS5hdHRyKCJkYXRhLXZhbGlkYXRvckdyb3VwIik7aWYoMDwkKCJbZGF0YS12 YWxpZGF0b3JHcm91cFx4M2QnIitiKyInXS4iK2UpLnNpemUoKSl7dmFyIGs9JCgibGFiZWxbZm9y XHgzZCIrYisiXSIpWzBdO3RoaXMudG9IaWRlPSQoJC5ncmVwKHRoaXMudG9IaWRlLGZ1bmN0aW9u KGIpe3JldHVybiBiIT09a30pKX19LGludmFsaWRIYW5kbGVyOmZ1bmN0aW9uKGIsZSl7JCgiLmVy cm9yLmJhY2tlbmQiKS5yZW1vdmUoKX0saGlnaGxpZ2h0OmZ1bmN0aW9uKGIsZSxmKXskKCJpbnB1 dC5wbGFjZWhvbGRlciIpLmFkZENsYXNzKGUpOyQoYikuYWRkQ2xhc3MoZSk7aWYoIlNFTEVDVCI9 PSQoYikucHJvcCgidGFnTmFtZSIpKSQoYikub24oImNoYW5nZSIsDQpmdW5jdGlvbigpeyQodGhp cykudmFsaWQoKX0pO3ZhciBnOyhnPWdldEVuaGFuY2VkRHJvcGRvd25QYXJlbnQoYikpJiZnLmFk ZENsYXNzKGUpfX0pO2Z1bmN0aW9uIGdldFZhbGlkYXRvckdyb3VwcyhiKXt2YXIgZT17fTskKCJb ZGF0YS12YWxpZGF0b3JHcm91cF0iLGIpLmVhY2goZnVuY3Rpb24oZixnKXt2YXIgaz0kKGcpLmF0 dHIoImRhdGEtdmFsaWRhdG9yR3JvdXAiKTtpZighZVtrXSl7dmFyIG09IiI7JCgiW2RhdGEtdmFs aWRhdG9yR3JvdXBceDNkJyIraysiJ10iLGIpLmVhY2goZnVuY3Rpb24oYixlKXttKz0kKGUpLmF0 dHIoIm5hbWUiKSsiICJ9KTtlW2tdPW19fSk7cmV0dXJuIGV9ZnVuY3Rpb24gZ2V0RW5oYW5jZWRE cm9wZG93blBhcmVudChiKXtiPSQoYikuY2xvc2VzdCgiLnNlbGVjdC1ib3giKTtyZXR1cm4gMDxi LnNpemUoKT9iOm51bGx9DQokLnZhbGlkYXRvci5wcm90b3R5cGUuZm9ybWF0QW5kQWRkPWZ1bmN0 aW9uKGIsZSl7dmFyIGY9dGhpcy5kZWZhdWx0TWVzc2FnZShiLGUubWV0aG9kKSxnPS9cJD9ceyhc ZCspXH0vZzsiZnVuY3Rpb24iPT09dHlwZW9mIGY/Zj1mLmNhbGwodGhpcyxlLnBhcmFtZXRlcnMs Yik6Zy50ZXN0KGYpJiYoZj0kLnZhbGlkYXRvci5mb3JtYXQoZi5yZXBsYWNlKGcsInskMX0iKSxl LnBhcmFtZXRlcnMpKTt0aGlzLmVycm9yTGlzdC5wdXNoKHtydWxlOmUubWV0aG9kLG1lc3NhZ2U6 ZixlbGVtZW50OmJ9KTt0aGlzLmVycm9yTWFwW2IubmFtZV09Zjt0aGlzLnN1Ym1pdHRlZFtiLm5h bWVdPWZ9Ow0KdmFyIGNvbXBvbmVudHM9e2luaXQ6ZnVuY3Rpb24oKXskKCJbZGF0YS1jb21wb25l bnRdIikuZWFjaChmdW5jdGlvbihiLGUpeyQoJChlKS5kYXRhKCJjb21wb25lbnQiKS5zcGxpdCgi ICIpKS5lYWNoKGZ1bmN0aW9uKGIsZyl7Y29tcG9uZW50c1tnXSYmKGNvbXBvbmVudHMuZWxlbWVu dF9uYW1lPSQoZSkuYXR0cigibmFtZSIpLGNvbXBvbmVudHNbZ10uaW5pdChlKSl9KX0pfSx1dGls czp7d3JhcDpmdW5jdGlvbihiKXtpZigwPT0kKGIpLmNsb3Nlc3QoIi5jb21wb25lbnQtd3JhcHBl ciIpLnNpemUoKSl7dmFyIGU9alF1ZXJ5KCdceDNjc3BhbiBjbGFzc1x4M2QiY29tcG9uZW50LXdy YXBwZXIiIGZvclx4M2QiJytjb21wb25lbnRzLmVsZW1lbnRfbmFtZSsnIi9ceDNlJyk7JChiKS53 cmFwKGUpOyQoYikuYmluZCgiZm9jdXMiLGZ1bmN0aW9uKCl7JCh0aGlzKS5jbG9zZXN0KCIuY29t cG9uZW50LXdyYXBwZXIiKS5hZGRDbGFzcygiZm9jdXNlZCIpfSk7JChiKS5iaW5kKCJibHVyIiwN CmZ1bmN0aW9uKCl7JCh0aGlzKS5jbG9zZXN0KCIuY29tcG9uZW50LXdyYXBwZXIiKS5yZW1vdmVD bGFzcygiZm9jdXNlZCIpfSl9fSxpc01vYmlsZUJyb3dzZXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDwk KCJodG1sLm1vYmlsZSIpLmxlbmd0aD8hMDohMX19fTskKGRvY3VtZW50KS5yZWFkeShmdW5jdGlv bigpe2NvbXBvbmVudHMuaW5pdCgpfSk7DQokLmV4dGVuZCghMCxjb21wb25lbnRzLHtzZWxlY3Ri b3g6e2luaXQ6ZnVuY3Rpb24oYil7Mz49cGFyc2VJbnQoY29tcG9uZW50cy51dGlscy5nZXRBbmRy b2lkVmVyc2lvbigpKSYmJChiKS5hZGRDbGFzcygibmVlZHNjbGljayIpO2NvbXBvbmVudHMudXRp bHMud3JhcChiKTskKGIpLndyYXAoJ1x4M2NkaXYgY2xhc3NceDNkInNlbGVjdC1ib3giIGZvclx4 M2QiJytjb21wb25lbnRzLmVsZW1lbnRfbmFtZSsnIi9ceDNlJyk7dmFyIGU9JCgnXHgzY3NwYW4g Y2xhc3NceDNkInRvZ2dsZXIiL1x4M2UnKTskKCJceDNjaS9ceDNlIikuYXBwZW5kVG8oZSk7ZS5h cHBlbmRUbygiLnNlbGVjdC1ib3hbZm9yXHgzZCIrY29tcG9uZW50cy5lbGVtZW50X25hbWUrIl0i KTskKGIpLmJpbmQoImZvY3VzIixmdW5jdGlvbigpeyQodGhpcykuY2xvc2VzdCgiLnNlbGVjdC1i b3giKS5hZGRDbGFzcygiYWN0aXZlIil9KTskKGIpLmJpbmQoImJsdXIiLGZ1bmN0aW9uKCl7JCh0 aGlzKS5jbG9zZXN0KCIuc2VsZWN0LWJveCIpLnJlbW92ZUNsYXNzKCJhY3RpdmUiKX0pfX0sDQp1 dGlsczp7Z2V0QW5kcm9pZFZlcnNpb246ZnVuY3Rpb24oYil7Yj1ifHxuYXZpZ2F0b3IudXNlckFn ZW50O3JldHVybihiPWIubWF0Y2goL0FuZHJvaWRccyhbMC05XC5dKikvKSk/YlsxXTohMX19fSk7 JC5leHRlbmQoITAsY29tcG9uZW50cyx7dG9nZ2xlcjp7aW5pdDpmdW5jdGlvbihiKXskKGIpLmJp bmQoImNsaWNrIixmdW5jdGlvbihlKXskKGIpLmF0dHIoImhyZWYiKT8oZS5wcmV2ZW50RGVmYXVs dCgpLCQoJChiKS5hdHRyKCJocmVmIikpLnRvZ2dsZSgpKTokKGIpLmF0dHIoImRhdGEtdG9nZ2xl IikmJiQoJChiKS5hdHRyKCJkYXRhLXRvZ2dsZSIpKS50b2dnbGUoKX0pfX19KTsNCiQuZXh0ZW5k KCEwLGNvbXBvbmVudHMse3Bhc3N3b3JkcmV2ZWFsZXI6e2luaXQ6ZnVuY3Rpb24oYil7aWYoY29t cG9uZW50cy51dGlscy5zdXBwb3J0c1R5cGVDaGFuZ2UoYikmJmNvbXBvbmVudHMudXRpbHMuaXNN b2JpbGVCcm93c2VyKCkpe2NvbXBvbmVudHMudXRpbHMud3JhcChiKTt2YXIgZT0kKCdceDNjc3Bh biBjbGFzc1x4M2QicGFzc3dvcmQtcmV2ZWFsZXIgb2ZmIi9ceDNlJyk7ZS5vbigiY2xpY2siLGZ1 bmN0aW9uKCl7Y29tcG9uZW50cy51dGlscy50b2dnbGVSZXZlYWxQYXNzd29yZChiKX0pOyQoYiku b24oImtleXVwIixmdW5jdGlvbigpeyQoYikudmFsKCk/ZS5hZGRDbGFzcygiZW5hYmxlZCIpOmUu cmVtb3ZlQ2xhc3MoImVuYWJsZWQiKX0pOyQoYikub24oImZvY3VzIGtleXVwIixmdW5jdGlvbigp e2UuY3NzKHsiYmFja2dyb3VuZC1jb2xvciI6JChiKS5jc3MoImJhY2tncm91bmQtY29sb3IiKX0p fSk7dmFyIGY7JChkb2N1bWVudCkubW91c2Vkb3duKGZ1bmN0aW9uKGIpe2Y9DQokKGIudGFyZ2V0 KX0pOyQoYikub24oImJsdXIiLGZ1bmN0aW9uKCl7Zi5oYXNDbGFzcygicGFzc3dvcmQtcmV2ZWFs ZXIiKT8oJChiKS5jbG9zZXN0KCIuY29tcG9uZW50LXdyYXBwZXIiKS5hZGRDbGFzcygicmV2ZWFs ZXJfY2xpY2tlZCIpLCQoYikuZm9jdXMoKSk6JChiKS5jbG9zZXN0KCIuY29tcG9uZW50LXdyYXBw ZXIiKS5yZW1vdmVDbGFzcygicmV2ZWFsZXJfY2xpY2tlZCIpfSk7ZS5hcHBlbmRUbygnLmNvbXBv bmVudC13cmFwcGVyW2Zvclx4M2QiJytjb21wb25lbnRzLmVsZW1lbnRfbmFtZSsnIl0nKX19fSx1 dGlsczp7dG9nZ2xlUmV2ZWFsUGFzc3dvcmQ6ZnVuY3Rpb24oYil7JChiKS5zaWJsaW5ncygiLnBh c3N3b3JkLXJldmVhbGVyIikudG9nZ2xlQ2xhc3MoIm9uIik7InBhc3N3b3JkIj09JChiKS5hdHRy KCJ0eXBlIik/JChiKS5hdHRyKCJ0eXBlIiwidGV4dCIpOiQoYikuYXR0cigidHlwZSIsInBhc3N3 b3JkIik7JChiKS5mb2N1cygpfSxzdXBwb3J0c1R5cGVDaGFuZ2U6ZnVuY3Rpb24oYil7dHJ5eyQo YikuYXR0cigidHlwZSIsDQoicGFzc3dvcmQiKX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH19 fSk7DQokLmV4dGVuZCghMCxjb21wb25lbnRzLHtyZXNwb25zaXZlX2ltYWdlOntvcHRpb25zOntw cmVmaXhlczp7ImRlZmF1bHQiOiIyeF8iLCIxeCI6IjF4XyIsIjJ4IjoiMnhfIiwiNHgiOiI0eF8i fSxyZXRpbmFfcGl4ZWxyYXRpbzoxLjUscGhvbmVfbWF4X3dpZHRoOjQ4MH0saW5pdDpmdW5jdGlv bihiKXt2YXIgZT0kKGIpLmF0dHIoInNyYyIpLGY9ZS5yZXBsYWNlKC9bXlwvXSokLywiIiksZT1l LnJlcGxhY2UoL14uKltcXFwvXS8sIiIpLGc9IiIsZz1jb21wb25lbnRzLnV0aWxzLmlzUmV0aW5h KCk/Y29tcG9uZW50cy51dGlscy5pc1Bob25lKCk/dGhpcy5vcHRpb25zLnByZWZpeGVzWyIyeCJd OnRoaXMub3B0aW9ucy5wcmVmaXhlc1siNHgiXTp0aGlzLm9wdGlvbnMucHJlZml4ZXNbIjF4Il07 ZyE9dGhpcy5vcHRpb25zLnByZWZpeGVzWyJkZWZhdWx0Il0mJiExPT1jb21wb25lbnRzLnV0aWxz LmZpbGVuYW1lU3RhcnRzV2l0aFByZWZpeChlKSYmKGU9ZytlLCQoYikuYXR0cigic3JjIiwNCmYr ZSkpfX0sdXRpbHM6e2lzUmV0aW5hOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5kZXZpY2VQaXhl bFJhdGlvPmNvbXBvbmVudHMucmVzcG9uc2l2ZV9pbWFnZS5vcHRpb25zLnJldGluYV9waXhlbHJh dGlvfSxpc1Bob25lOmZ1bmN0aW9uKCl7cmV0dXJuICQod2luZG93KS5pbm5lcldpZHRoKCk8PWNv bXBvbmVudHMucmVzcG9uc2l2ZV9pbWFnZS5vcHRpb25zLnBob25lX21heF93aWR0aH0sZmlsZW5h bWVTdGFydHNXaXRoUHJlZml4OmZ1bmN0aW9uKGIpe3ZhciBlPSExOyQuZWFjaChjb21wb25lbnRz LnJlc3BvbnNpdmVfaW1hZ2Uub3B0aW9ucy5wcmVmaXhlcyxmdW5jdGlvbihmLGcpe2lmKDA9PWIu aW5kZXhPZihnKSlyZXR1cm4gZT0hMCwhMX0pO3JldHVybiBlfX19KTsNCiQuZXh0ZW5kKCEwLGNv bXBvbmVudHMse3NpbmdsZXN1Ym1pdHRlcjp7aW5pdDpmdW5jdGlvbihiKXt2YXIgZT1jb21wb25l bnRzLnV0aWxzLmNyZWF0ZU92ZXJsYXkoInJnYmEoMjU1LDI1NSwyNTUsMC44KSIsYiksZj1jb21w b25lbnRzLnV0aWxzLmNyZWF0ZVNwaW5uZXIoMzIsMzIpO2lmKCQoYikuaXMoImZvcm0iKSkkKGIp Lm9uKCJzdWJtaXQiLGZ1bmN0aW9uKCl7aWYoISQoYikudmFsaWR8fCQoYikudmFsaWRhdGUoKS5j aGVja0Zvcm0oKSljb21wb25lbnRzLnV0aWxzLnNldFNwaW5uZXJQb3NpdGlvbihmLCQod2luZG93 KS53aWR0aCgpLzItMTYsJCh3aW5kb3cpLmhlaWdodCgpLzQpLGNvbXBvbmVudHMudXRpbHMuc2V0 T3ZlcmxheVNpemUoZSksZi5hcHBlbmRUbyhlKSxlLmFwcGVuZFRvKCJib2R5Iil9KTtlbHNlICQo Yikub24oImNsaWNrIixmdW5jdGlvbihiKXswPT1iLmJ1dHRvbiYmKGNvbXBvbmVudHMudXRpbHMu c2V0U3Bpbm5lclBvc2l0aW9uKGYsJCh3aW5kb3cpLndpZHRoKCkvDQoyLTE2LCQod2luZG93KS5o ZWlnaHQoKS80KSxjb21wb25lbnRzLnV0aWxzLnNldE92ZXJsYXlTaXplKGUpLGYuYXBwZW5kVG8o ZSksZS5hcHBlbmRUbygiYm9keSIpKX0pfX0sdXRpbHM6e2NyZWF0ZU92ZXJsYXk6ZnVuY3Rpb24o YixlKXt2YXIgZj0kKCdceDNjZGl2IGlkXHgzZCJzcGlubmVyX292ZXJsYXkiL1x4M2UnKTskKGUp LmF0dHIoImlkIikmJmYuYXR0cigiZGF0YS1vdmVybGF5LXRyaWdnZXJlZGJ5IiwkKGUpLmF0dHIo ImlkIikpO2YuY3NzKHsiYmFja2dyb3VuZC1jb2xvciI6YixmaWx0ZXI6InByb2dpZDpEWEltYWdl VHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChHcmFkaWVudFR5cGVceDNkMCxzdGFydENvbG9y c3RyXHgzZCcjOWRmZmZmZmYnLCBlbmRDb2xvcnN0clx4M2QnIzRjZmZmZmZmJykiLHBvc2l0aW9u OiJmaXhlZCIsInotaW5kZXgiOjFFNCx0b3A6MCxsZWZ0OjB9KTtyZXR1cm4gZn0sY3JlYXRlU3Bp bm5lcjpmdW5jdGlvbihiLGUpe3ZhciBmPSQoJ1x4M2NpbWcgc3JjXHgzZCIvcmVuZ2EtaWRwcm92 aWRlci9yZXNvdXJjZXMvd2ViX3YyL2ltZy9zcXVhcmVzcGlubmVyXzJ4LmdpZiIgd2lkdGhceDNk IicrDQpiKyciIGhlaWdodFx4M2QiJytlKyciL1x4M2UnKTtmLmNzcyh7cG9zaXRpb246ImFic29s dXRlIiwiei1pbmRleCI6MkU0fSk7cmV0dXJuIGZ9LHNldE92ZXJsYXlTaXplOmZ1bmN0aW9uKGIp e2IuY3NzKHt3aWR0aDokKHdpbmRvdykud2lkdGgoKSxoZWlnaHQ6JCh3aW5kb3cpLmhlaWdodCgp fSl9LHNldFNwaW5uZXJQb3NpdGlvbjpmdW5jdGlvbihiLGUsZil7Yi5jc3Moe2xlZnQ6ZSx0b3A6 Zn0pfX19KTt0cnl7JChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXswPT0kKCJodG1sLm1vYmls ZSxodG1sLmFpciIpLnNpemUoKSYmJCgnaW5wdXRbdmFsdWVceDNkIiJdOnZpc2libGUnKS5maXJz dCgpLmZvY3VzKCk7JCgibGFiZWwgYVtocmVmXSIpLm9uKCJjbGljayIsZnVuY3Rpb24oYil7Yi5w cmV2ZW50RGVmYXVsdCgpOyJfYmxhbmsiPT09dGhpcy5nZXRBdHRyaWJ1dGUoInRhcmdldCIpP3dp bmRvdy5vcGVuKHRoaXMuaHJlZiwiX2JsYW5rIik6d2luZG93LmxvY2F0aW9uPXRoaXMuaHJlZn0p fSl9Y2F0Y2goZSQkNDkyKXt9DQp2YXIgX25vdz1EYXRlLm5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4o bmV3IERhdGUpLmdldFRpbWUoKX07ZnVuY3Rpb24gZGVib3VuY2UoYixlLGYpe3ZhciBnLGssbSxu LHcsej1mdW5jdGlvbigpe3ZhciB4PV9ub3coKS1uO3g8ZT9nPXNldFRpbWVvdXQoeixlLXgpOihn PW51bGwsZnx8KHc9Yi5hcHBseShtLGspLG09az1udWxsKSl9O3JldHVybiBmdW5jdGlvbigpe209 dGhpcztrPWFyZ3VtZW50cztuPV9ub3coKTt2YXIgeD1mJiYhZztnfHwoZz1zZXRUaW1lb3V0KHos ZSkpO3gmJih3PWIuYXBwbHkobSxrKSxtPWs9bnVsbCk7cmV0dXJuIHd9fSQoZG9jdW1lbnQpLnJl YWR5KGZ1bmN0aW9uKCl7JCgiaW5wdXQsdGV4dGFyZWEiKS5wbGFjZWhvbGRlcigpfSk7PC9zY3Jp cHQ+DQogICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAg ICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgew0KICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWxpZGF0b3IgPSAkKCIjc2lnbmluIikudmFs aWRhdGUoew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmU6W10sDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzOiB7DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB1c2VybmFtZToge3JlcXVpcmVkOiB0cnVlLCBlbWFpbDogdHJ1ZSxt YXhsZW5ndGg6NjB9LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dv cmQ6IHtyZXF1aXJlZDp0cnVlfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LA0K ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlczogew0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IHsNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDoiRW50ZXIgeW91ciBlbWFpbCIsDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4bGVuZ3RoOiJBIG1heGltdW0gb2Yg NjAgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCBmb3IgdGhlIEFkb2JlIElELiINCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwYXNzd29yZDogIkVudGVyIHlvdXIgcGFzc3dvcmQiDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCdp bnB1dFt0eXBlPSJoaWRkZW4iXSNyZW1lbWJlcl9tZScpLnJlbW92ZSgpOw0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNyZW1lbWJl cl9tZScpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaWYgKCQodGhpcykuaXMoIjpjaGVja2VkIikpIHsNCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICQoIiNyZW1lbWJlcl9tZV9zZGV2aWNlcyIpLmNzcygndmlzaWJpbGl0eScs ICd2aXNpYmxlJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjcmVtZW1iZXJfbWVfc2Rldmlj ZXMiKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsNCg0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICQoIiN1c2VybmFtZSIpLmNoYW5nZShmdW5jdGlvbiAoKSB7DQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAkLnRyaW0odGhpcy52 YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgICAg ICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgDQovLyAgICAgICAgICAgICAg ICAgICAgICAgICQoIiNzaWduaW4iKS5zdWJtaXQocmVwb3J0X29tbml0dXJlKTsNCg0KICAgICAg ICAgICAgICAgICAgICA8L3NjcmlwdD4NCg0KICAgICAgICAgICAgICAgICAgICA8c2NyaXB0IHR5 cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoNCg0K DQogalF1ZXJ5IGNhcHNsb2Nrc3RhdGUgcGx1Z2luIHYxLjIuMQ0KIGh0dHBzOi8vZ2l0aHViLmNv bS9ub3NpbGxlZy9jYXBzbG9ja3N0YXRlLWpxdWVyeS1wbHVnaW4vDQoNCiBDb3B5cmlnaHQgMjAx MiBKYXNvbiBFbGxpc29uDQogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlDQogaHR0cHM6 Ly9naXRodWIuY29tL25vc2lsbGVnL2NhcHNsb2Nrc3RhdGUtanF1ZXJ5LXBsdWdpbi9ibG9iL21h c3Rlci9NSVQtTElDRU5TRS50eHQNCg0KIERhdGU6IFN1biBGZWIgMyAyMDEzIDIxOjM0OjAwIEdN VA0KKi8NCihmdW5jdGlvbihhKXt2YXIgYj0idW5rbm93biIsZj17aW5pdDpmdW5jdGlvbihnKXth LmV4dGVuZCh7fSxnKTt2YXIgZj0hMD09PS9NYWNQUEN8TWFjSW50ZWwvLnRlc3Qod2luZG93Lm5h dmlnYXRvci5wbGF0Zm9ybSksZT17aXNDYXBzbG9ja09uOmZ1bmN0aW9uKGMpe3ZhciBhPSExO2Mu c2hpZnRLZXk/YT1jLnNoaWZ0S2V5OmMubW9kaWZpZXJzJiYoYT0hIShjLm1vZGlmaWVycyY0KSk7 Yz1TdHJpbmcuZnJvbUNoYXJDb2RlKGMud2hpY2gpO2MudG9VcHBlckNhc2UoKSE9PWMudG9Mb3dl ckNhc2UoKSYmKGMudG9VcHBlckNhc2UoKT09PWM/ITA9PT1mJiZhfHwoYj0hYSk6Yy50b0xvd2Vy Q2FzZSgpPT09YyYmKGI9YSkpO3JldHVybiBifSxpc0NhcHNsb2NrS2V5OmZ1bmN0aW9uKGEpezIw PT09YS53aGljaCYmInVua25vd24iIT09YiYmKGI9IWIpO3JldHVybiBifSxoYXNTdGF0ZUNoYW5n ZTpmdW5jdGlvbihiLGQpe2IhPT1kJiYoYSgiYm9keSIpLnRyaWdnZXIoImNhcHNDaGFuZ2VkIiks DQohMD09PWQ/YSgiYm9keSIpLnRyaWdnZXIoImNhcHNPbiIpOiExPT09ZD9hKCJib2R5IikudHJp Z2dlcigiY2Fwc09mZiIpOiJ1bmtub3duIj09PWQmJmEoImJvZHkiKS50cmlnZ2VyKCJjYXBzVW5r bm93biIpKX19O2EoImJvZHkiKS5iaW5kKCJrZXlwcmVzcy5jYXBzbG9ja3N0YXRlIixmdW5jdGlv bihhKXt2YXIgZD1iO2I9ZS5pc0NhcHNsb2NrT24oYSk7ZS5oYXNTdGF0ZUNoYW5nZShkLGIpfSk7 YSgiYm9keSIpLmJpbmQoImtleWRvd24uY2Fwc2xvY2tzdGF0ZSIsZnVuY3Rpb24oYSl7dmFyIGQ9 YjtiPWUuaXNDYXBzbG9ja0tleShhKTtlLmhhc1N0YXRlQ2hhbmdlKGQsYil9KTthKHdpbmRvdyku YmluZCgiZm9jdXMuY2Fwc2xvY2tzdGF0ZSIsZnVuY3Rpb24oKXt2YXIgYT1iO2I9InVua25vd24i O2UuaGFzU3RhdGVDaGFuZ2UoYSxiKX0pO2UuaGFzU3RhdGVDaGFuZ2UobnVsbCwidW5rbm93biIp O3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt9KX0sc3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4g Yn0sDQpkZXN0cm95OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2EoImJv ZHkiKS51bmJpbmQoIi5jYXBzbG9ja3N0YXRlIik7YSh3aW5kb3cpLnVuYmluZCgiLmNhcHNsb2Nr c3RhdGUiKX0pfX07alF1ZXJ5LmZuLmNhcHNsb2Nrc3RhdGU9ZnVuY3Rpb24oYil7aWYoZltiXSly ZXR1cm4gZltiXS5hcHBseSh0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50 cywxKSk7aWYoIm9iamVjdCI9PT10eXBlb2YgYnx8IWIpcmV0dXJuIGYuaW5pdC5hcHBseSh0aGlz LGFyZ3VtZW50cyk7YS5lcnJvcigiTWV0aG9kICIrYisiIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVy eS5jYXBzbG9ja3N0YXRlIil9fSkoalF1ZXJ5KTsNCiQuZXh0ZW5kKCEwLGNvbXBvbmVudHMse2Nh cHNpbmRpY2F0b3I6e2luaXQ6ZnVuY3Rpb24oYSl7aWYoITE9PWNvbXBvbmVudHMudXRpbHMuaXNN b2JpbGVCcm93c2VyKCkpe2NvbXBvbmVudHMudXRpbHMud3JhcChhKTt2YXIgYj0kKCdceDNjc3Bh biBjbGFzc1x4M2QiY2Fwcy1pbmRpY2F0b3IiIHRpdGxlXHgzZCJDQVBTIE9OIi9ceDNlJyk7JChh KS5vbigiZm9jdXMga2V5dXAiLGZ1bmN0aW9uKCl7Yi5jc3MoeyJiYWNrZ3JvdW5kLWNvbG9yIjok KGEpLmNzcygiYmFja2dyb3VuZC1jb2xvciIpfSl9KTtiLmFwcGVuZFRvKCcuY29tcG9uZW50LXdy YXBwZXJbZm9yXHgzZCInK2NvbXBvbmVudHMuZWxlbWVudF9uYW1lKyciXScpOyQod2luZG93KS5i aW5kKCJjYXBzT24iLGZ1bmN0aW9uKCl7Y29tcG9uZW50cy51dGlscy5zZXRDYXBzbG9ja1N0YXRl KCJvbiIpfSk7JCh3aW5kb3cpLmJpbmQoImNhcHNPZmYiLGZ1bmN0aW9uKCl7Y29tcG9uZW50cy51 dGlscy5zZXRDYXBzbG9ja1N0YXRlKCJvZmYiKX0pOw0KJCh3aW5kb3cpLmJpbmQoImNhcHNVbmtu b3duIixmdW5jdGlvbigpe2NvbXBvbmVudHMudXRpbHMuc2V0Q2Fwc2xvY2tTdGF0ZSgidW5rbm93 biIpfSk7JCh3aW5kb3cpLmNhcHNsb2Nrc3RhdGUoKX19fSx1dGlsczp7c2V0Q2Fwc2xvY2tTdGF0 ZTpmdW5jdGlvbihhKXskKCJodG1sIikucmVtb3ZlQ2xhc3MoImNhcHNsb2NrLW9uIGNhcHNsb2Nr LW9mZiBjYXBzbG9jay11bmtub3duIik7JCgiaHRtbCIpLmFkZENsYXNzKCJjYXBzbG9jay0iK2Ep fX19KTs8L3NjcmlwdD4NCiAgICAgICAgICAgICAgICAgICAgPC9ib2R5Pg0KICAgIDwvaHRtbD4N CiAgICA8cD4mbmJzcDs8L3A+ ------=_20160805112700_67842-- From david@fromorbit.com Fri Aug 5 00:17:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B4CBF7CA0 for ; Fri, 5 Aug 2016 00:17:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 762C7304032 for ; Thu, 4 Aug 2016 22:16:57 -0700 (PDT) X-ASG-Debug-ID: 1470374212-0bf57c13673c3800001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id a0eV3PEt7y5msZ1U for ; Thu, 04 Aug 2016 22:16:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4JADYgpFd5LI7JIGdsb2JhbABcg0VWfIJ5g3mdLwEBAQEBAQaMYCuFZIQMHIV7BIFJTQEBAQEBAQcBAQEBAQE4QIU7OyQ0BSUDBy2IMJ5DoBYOHoVEh3SBSIJiC1iCLwWIJZEQhhyIYIF1To0HAoZkhU+Dd4Ihgj8qMgEBAQGGTIFEAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2016 14:46:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVXV5-0004FU-8J for xfs@oss.sgi.com; Fri, 05 Aug 2016 15:16:51 +1000 Date: Fri, 5 Aug 2016 15:16:51 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: v4.7.0 released Message-ID: <20160805051651.GE16044@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: v4.7.0 released MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Qrgsu6vtpU/OV/zm" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470374212 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3310 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31766 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Qrgsu6vtpU/OV/zm Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Folks, The xfsprogs repositories have just been updated and tagged with the v4.7.0 release tag. It can be found here: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git v4.7.0 git://oss.sgi.com/xfs/cmds/xfsprogs.git v4.7.0 A signed gzipped-tar archive of the source code is available here: ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-4.7.0.tar.gz ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-4.7.0.tar.gz.sign The archive is signed with my gpg key (the same one that this release announcement is signed with). Many thanks go to all the contributors to this release. The summary of changes since v4.5.0 can be found listed in doc/CHANGES, which I have reproduced in part below. -Dave. xfsprogs-4.7.0 (5 Aug 2016) - xfs_io: man page for copy_file_range (Anna Schumaker) - xfs_quota: handle XFS_GETNEXTQUOTA failure sanely (Zorro Lang) - mkfs: remove old glibc build failure workaround (Felix Janda) xfsprogs-4.7.0-rc2 (20 Jul 2016) - xfs_io: add support for copy_file_range (Anna Schumaker) - repair: fix exit value after low memory is detected (Zorro Lang) - repair: fix quota inode detection issue (Eric Sandeen) - fix coverity issues from 4.7-rc1 (Bill O'Donnell) xfsprogs-4.7.0-rc1 (22 Jun 2016) - libxfs kernel sync up to 4.7-rc1 - quota: new efficient iteration mechanism (Eric Sandeen) - quota: support usernames starting with digits (Zorro Lang) - xfs_io: mmap/mremap fixes (Zorro Lang) - build/translation fixes (Mike Frysinger) - repair: error messge cleanups (Eric Sandeen) - mkfs: table based option parsing (Jan Tulak, Eric Sandeen) - metadump: sector size support fixes (Eric Sandeen) - db: unaligned acces fixes (Eric Sandeen) - db: add CRC recalculation for corrupt blocks - db: fix array notation handling in print commands - db: Note that fragmenation factor is meaningless (Eric Sandeen) - repair: more efficient secondary superblock search (Bill O'Donnell) - quota: timer reporting corner case fixes (Eric Sandeen) - headers: struct fsxattr redifinition fixes (Christoph Hellwig) - man page updates (Eric Sandeen, Jan Tulak, Zorro Lang) - repair: RT summary inode rebuild fix (Eric Sandeen) - db: sparse inode check fixes (Brian Foster) The new head of the master branch is commit: d7e1f5f xfsprogs: Release v4.7 New Commits: Anna Schumaker (1): [8f05294] xfs_io: Update man page for copy_range command Dave Chinner (1): [d7e1f5f] xfsprogs: Release v4.7 Felix Janda (1): [ab870d0] mkfs: Remove workaround for getsubopt() on older glibc Zorro Lang (1): [52e81d7] xfs_quota: fall back silently if XFS_GETNEXTQUOTA fails Code Diffstat: VERSION | 2 +- configure.ac | 2 +- debian/changelog | 6 ++++++ doc/CHANGES | 22 ++++++++++++++-------- include/darwin.h | 1 - include/freebsd.h | 2 -- include/gnukfreebsd.h | 2 -- include/irix.h | 2 -- include/linux.h | 6 ------ man/man8/xfs_io.8 | 33 +++++++++++++++++++++++++++++++++ mkfs/xfs_mkfs.c | 24 ++++++++---------------- quota/report.c | 8 ++++++-- repair/xfs_repair.c | 4 ++-- 13 files changed, 71 insertions(+), 43 deletions(-) --=20 Dave Chinner david@fromorbit.com --Qrgsu6vtpU/OV/zm Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXpCFCAAoJEK3oKUf0dfod2ZkQAJdW+2ToMyhNpjv1QecQn8EC qmDp8Pr4rs8yrsFUI/47s+cqSLYmkFFwIhRw9pSQXdxVLufcTjQxRSQrlynMQBkC c+XR0alcgSCmYYpYcQxHZskPTynJ6Z0Nyt1rbSdu5KjdRX7MLUvqVkw5tcpjnEqP VUfCVgTLqwlpYrEvKrXd0im7q4ib0f7yE7r/iXDsoD3/GOTl39MFG8MB7YXc3aMk kZetPyv0nBZ2zUCiv6U6BveSDdtF1oMBTjn5+DHgAEF9sHqsSHxW4+0ce/hhtO+D +Idn2ibpo+82hcj8WsM2llQNPttUjPl3Op14YcM304R1yBw37whMZT9MDj7cD9bh uzn9Oj6X+/eGYozvaXe13HA3ZDMT3QCccicofPEWbewHd3/UuAK8VCdnGIkXBNBE mg2x6ZxzCTxen/cmAx96TajqfVUccTCe7ODlV/kR2wPD+QSZpwJuDApXL1FBxUEC oxpn1XWBeRe2A8mfiQTLruHeJziIXB5ZlKsxCEaN1zYpyQcyxBurig8z/LlUOSZy ir+M2hhDDrS+NZK3SGFfbYMEjv9lYrKyheqG1DMGwXfUF6W7M1fn1MDRn2BzeCXp +4IePaAZAMHg3gQvJzR35oBMukV901Om25jzBUk7pI8jTmagL6V8xHtNFxIx5SyL HXS0JWPm9xyDd694bz8W =9wyv -----END PGP SIGNATURE----- --Qrgsu6vtpU/OV/zm-- From dedekind1@gmail.com Fri Aug 5 02:01:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6520F7CA0 for ; Fri, 5 Aug 2016 02:01:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 272618F8037 for ; Fri, 5 Aug 2016 00:01:30 -0700 (PDT) X-ASG-Debug-ID: 1470380489-0bf57c13683d1f10001-NocioJ Received: from mga04.intel.com ([192.55.52.120]) by cuda.sgi.com with ESMTP id 3KLeXBNweXGFBFnL for ; Fri, 05 Aug 2016 00:01:30 -0700 (PDT) X-Barracuda-Envelope-From: dedekind1@gmail.com X-Barracuda-Effective-Source-IP: UNKNOWN[192.55.52.120] X-Barracuda-Apparent-Source-IP: 192.55.52.120 X-ASG-Whitelist: Client Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP; 05 Aug 2016 00:01:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,473,1464678000"; d="scan'208";a="1030176240" Received: from linux.intel.com ([10.54.29.200]) by orsmga002.jf.intel.com with ESMTP; 05 Aug 2016 00:01:18 -0700 Received: from abityuts-desk.fi.intel.com (abityuts-desk.fi.intel.com [10.237.68.147]) by linux.intel.com (Postfix) with ESMTP id D1D986A4006; Fri, 5 Aug 2016 00:01:02 -0700 (PDT) Message-ID: <1470380474.2311.71.camel@gmail.com> Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support From: Artem Bityutskiy X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support Reply-To: dedekind1@gmail.com To: Dave Chinner , "Darrick J. Wong" Cc: Mark Fasheh , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Date: Fri, 05 Aug 2016 10:01:14 +0300 In-Reply-To: <20160804235015.GC16044@dastard> References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> <20160804235015.GC16044@dastard> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.20.4 (3.20.4-1.fc24) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: UNKNOWN[192.55.52.120] X-Barracuda-Start-Time: 1470380489 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 504 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, 2016-08-05 at 09:50 +1000, Dave Chinner wrote: > I'd much prefer that fiemap gives exact information about shared > extents. FIEMAP is a diagnostic tool and as such we need it to > accurately reflect the exact extent map of the inode being queried > so we aren't mislead about the layout of the file during trouble > shooting. Hi Dave, you are right, and here is a side note:  we were using FIEMAP for optimizing image deployment in production, so it is a diagnostic tool and more. From darrick.wong@oracle.com Fri Aug 5 02:21:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8FC317CA0 for ; Fri, 5 Aug 2016 02:21:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 60AF58F8040 for ; Fri, 5 Aug 2016 00:21:57 -0700 (PDT) X-ASG-Debug-ID: 1470381714-0bf57c136a3d4c00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id uQrqg32EDmetY19x (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 00:21:55 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u757LooS017410 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 07:21:51 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u757Lntc016605 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 07:21:50 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u757LmZc021661; Fri, 5 Aug 2016 07:21:49 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 05 Aug 2016 00:21:48 -0700 Date: Fri, 5 Aug 2016 00:21:47 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, dedekind1@gmail.com, mfasheh@suse.de Subject: [PATCH] generic: test accurate shared extent reporting Message-ID: <20160805072147.GG25565@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] generic: test accurate shared extent reporting MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470381715 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4110 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ensure that we can create a file with a single extent, reflink two blocks out of the middle of that extent, and the resulting fiemap reports two shared extents, instead of lazily reporting the entire huge extent as shared. Signed-off-by: Darrick J. Wong --- tests/generic/929 | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/929.out | 17 +++++++++ tests/generic/group | 1 + 3 files changed, 107 insertions(+) create mode 100755 tests/generic/929 create mode 100644 tests/generic/929.out diff --git a/tests/generic/929 b/tests/generic/929 new file mode 100755 index 0000000..9793be0 --- /dev/null +++ b/tests/generic/929 @@ -0,0 +1,89 @@ +#! /bin/bash +# FS QA Test No. 929 +# +# Check that bmap/fiemap accurately report shared extents. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* + wait +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_require_scratch_reflink +_require_fiemap + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blocks=5 +blksz=65536 +sz=$((blocks * blksz)) + +echo "Create the original files" +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full +_scratch_cycle_mount + +echo "file1 extents and holes" +_count_extents $testdir/file1 +_count_holes $testdir/file1 + +_reflink_range $testdir/file1 $blksz $testdir/file2 $((blksz * 3)) $blksz >> $seqres.full +_reflink_range $testdir/file1 $((blksz * 3)) $testdir/file2 $blksz $blksz >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch +md5sum $testdir/file2 | _filter_scratch + +echo "file1 extents and holes" +_count_extents $testdir/file1 +_count_holes $testdir/file1 +echo "file2 extents and holes" +_count_extents $testdir/file2 +_count_holes $testdir/file2 +echo "file1 shared extents" +$XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep '0x.*[2367aAbBfF]...$' -c + +# success, all done +status=0 +exit diff --git a/tests/generic/929.out b/tests/generic/929.out new file mode 100644 index 0000000..e290f4c --- /dev/null +++ b/tests/generic/929.out @@ -0,0 +1,17 @@ +QA output created by 929 +Format and mount +Create the original files +file1 extents and holes +1 +0 +Compare files +17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-929/file1 +79418df9c55ab7f58781cb7b9e7d5d91 SCRATCH_MNT/test-929/file2 +file1 extents and holes +5 +0 +file2 extents and holes +2 +2 +file1 shared extents +2 diff --git a/tests/generic/group b/tests/generic/group index 18b9775..732f6f6 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -375,3 +375,4 @@ 370 auto quick richacl 927 auto quick clone 928 auto quick clone dedupe +929 auto quick clone From darrick.wong@oracle.com Fri Aug 5 02:22:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6A67B7CA0 for ; Fri, 5 Aug 2016 02:22:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D676CAC004 for ; Fri, 5 Aug 2016 00:22:35 -0700 (PDT) X-ASG-Debug-ID: 1470381752-0bf57c13673d4d20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id a2gVhy0GgTLchKEY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 00:22:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u757MTLj017335 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 07:22:29 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u757MTvB019176 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 07:22:29 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u757MSHW001892; Fri, 5 Aug 2016 07:22:28 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 05 Aug 2016 00:22:28 -0700 Date: Fri, 5 Aug 2016 00:22:26 -0700 From: "Darrick J. Wong" To: Artem Bityutskiy Cc: Dave Chinner , Mark Fasheh , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160805072226.GA8590@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> <20160804235015.GC16044@dastard> <1470380474.2311.71.camel@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1470380474.2311.71.camel@gmail.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470381753 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 683 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Fri, Aug 05, 2016 at 10:01:14AM +0300, Artem Bityutskiy wrote: > On Fri, 2016-08-05 at 09:50 +1000, Dave Chinner wrote: > > I'd much prefer that fiemap gives exact information about shared > > extents. FIEMAP is a diagnostic tool and as such we need it to > > accurately reflect the exact extent map of the inode being queried > > so we aren't mislead about the layout of the file during trouble > > shooting. > > Hi Dave, you are right, and here is a side note:  we were using FIEMAP > for optimizing image deployment in production, so it is a diagnostic > tool and more. Will send an xfstest exercising this shortly, since AFAICT there isn't already one. --D From eguan@redhat.com Fri Aug 5 02:46:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EF5857CA0 for ; Fri, 5 Aug 2016 02:46:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E5EDAC004 for ; Fri, 5 Aug 2016 00:46:10 -0700 (PDT) X-ASG-Debug-ID: 1470383168-0bf8157e6d4cb250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KF5nvxmPNX0OTVzF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 00:46:09 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AD7DAC04D2A9; Fri, 5 Aug 2016 07:46:08 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u757k7Ql021414; Fri, 5 Aug 2016 03:46:08 -0400 Date: Fri, 5 Aug 2016 15:46:07 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, dedekind1@gmail.com, mfasheh@suse.de Subject: Re: [PATCH] generic: test accurate shared extent reporting Message-ID: <20160805074607.GW27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] generic: test accurate shared extent reporting References: <20160805072147.GG25565@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805072147.GG25565@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 05 Aug 2016 07:46:08 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470383169 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4544 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 05, 2016 at 12:21:47AM -0700, Darrick J. Wong wrote: > Ensure that we can create a file with a single extent, reflink two > blocks out of the middle of that extent, and the resulting fiemap > reports two shared extents, instead of lazily reporting the entire > huge extent as shared. > > Signed-off-by: Darrick J. Wong > --- > tests/generic/929 | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ > tests/generic/929.out | 17 +++++++++ > tests/generic/group | 1 + > 3 files changed, 107 insertions(+) > create mode 100755 tests/generic/929 > create mode 100644 tests/generic/929.out > > diff --git a/tests/generic/929 b/tests/generic/929 > new file mode 100755 > index 0000000..9793be0 > --- /dev/null > +++ b/tests/generic/929 > @@ -0,0 +1,89 @@ > +#! /bin/bash > +# FS QA Test No. 929 > +# > +# Check that bmap/fiemap accurately report shared extents. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 7 15 > + > +_cleanup() > +{ > + cd / > + rm -rf $tmp.* > + wait > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/reflink > + > +# real QA test starts here > +_supported_os Linux Need "_supported_fs generic" > +_require_scratch_reflink > +_require_fiemap > + > +echo "Format and mount" > +_scratch_mkfs > $seqres.full 2>&1 > +_scratch_mount >> $seqres.full 2>&1 > + > +testdir=$SCRATCH_MNT/test-$seq > +mkdir $testdir > + > +blocks=5 > +blksz=65536 > +sz=$((blocks * blksz)) > + > +echo "Create the original files" > +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full > +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full > +_scratch_cycle_mount > + > +echo "file1 extents and holes" > +_count_extents $testdir/file1 > +_count_holes $testdir/file1 > + > +_reflink_range $testdir/file1 $blksz $testdir/file2 $((blksz * 3)) $blksz >> $seqres.full > +_reflink_range $testdir/file1 $((blksz * 3)) $testdir/file2 $blksz $blksz >> $seqres.full > +_scratch_cycle_mount > + > +echo "Compare files" > +md5sum $testdir/file1 | _filter_scratch > +md5sum $testdir/file2 | _filter_scratch > + > +echo "file1 extents and holes" > +_count_extents $testdir/file1 > +_count_holes $testdir/file1 > +echo "file2 extents and holes" > +_count_extents $testdir/file2 > +_count_holes $testdir/file2 > +echo "file1 shared extents" > +$XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep '0x.*[2367aAbBfF]...$' -c Missing a command at the end? Thanks, Eryu > + > +# success, all done > +status=0 > +exit > diff --git a/tests/generic/929.out b/tests/generic/929.out > new file mode 100644 > index 0000000..e290f4c > --- /dev/null > +++ b/tests/generic/929.out > @@ -0,0 +1,17 @@ > +QA output created by 929 > +Format and mount > +Create the original files > +file1 extents and holes > +1 > +0 > +Compare files > +17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-929/file1 > +79418df9c55ab7f58781cb7b9e7d5d91 SCRATCH_MNT/test-929/file2 > +file1 extents and holes > +5 > +0 > +file2 extents and holes > +2 > +2 > +file1 shared extents > +2 > diff --git a/tests/generic/group b/tests/generic/group > index 18b9775..732f6f6 100644 > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -375,3 +375,4 @@ > 370 auto quick richacl > 927 auto quick clone > 928 auto quick clone dedupe > +929 auto quick clone From darrick.wong@oracle.com Fri Aug 5 03:02:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 078087CA0 for ; Fri, 5 Aug 2016 03:02:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA4B3AC003 for ; Fri, 5 Aug 2016 01:02:21 -0700 (PDT) X-ASG-Debug-ID: 1470384138-0bf57b369d437d70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 5zVrWgYjejaHjuRm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 01:02:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7582FHQ023517 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 08:02:15 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7582EtV021125 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 08:02:14 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7582DRW004138; Fri, 5 Aug 2016 08:02:14 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 05 Aug 2016 01:02:13 -0700 Date: Fri, 5 Aug 2016 01:02:12 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, dedekind1@gmail.com, mfasheh@suse.de Subject: Re: [PATCH] generic: test accurate shared extent reporting Message-ID: <20160805080212.GH25565@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] generic: test accurate shared extent reporting References: <20160805072147.GG25565@birch.djwong.org> <20160805074607.GW27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805074607.GW27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470384138 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5282 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Fri, Aug 05, 2016 at 03:46:07PM +0800, Eryu Guan wrote: > On Fri, Aug 05, 2016 at 12:21:47AM -0700, Darrick J. Wong wrote: > > Ensure that we can create a file with a single extent, reflink two > > blocks out of the middle of that extent, and the resulting fiemap > > reports two shared extents, instead of lazily reporting the entire > > huge extent as shared. > > > > Signed-off-by: Darrick J. Wong > > --- > > tests/generic/929 | 89 +++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/generic/929.out | 17 +++++++++ > > tests/generic/group | 1 + > > 3 files changed, 107 insertions(+) > > create mode 100755 tests/generic/929 > > create mode 100644 tests/generic/929.out > > > > diff --git a/tests/generic/929 b/tests/generic/929 > > new file mode 100755 > > index 0000000..9793be0 > > --- /dev/null > > +++ b/tests/generic/929 > > @@ -0,0 +1,89 @@ > > +#! /bin/bash > > +# FS QA Test No. 929 > > +# > > +# Check that bmap/fiemap accurately report shared extents. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > +# > > + > > +seq=`basename $0` > > +seqres=$RESULT_DIR/$seq > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 7 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf $tmp.* > > + wait > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/reflink > > + > > +# real QA test starts here > > +_supported_os Linux > > Need "_supported_fs generic" Ok. > > +_require_scratch_reflink > > +_require_fiemap > > + > > +echo "Format and mount" > > +_scratch_mkfs > $seqres.full 2>&1 > > +_scratch_mount >> $seqres.full 2>&1 > > + > > +testdir=$SCRATCH_MNT/test-$seq > > +mkdir $testdir > > + > > +blocks=5 > > +blksz=65536 > > +sz=$((blocks * blksz)) > > + > > +echo "Create the original files" > > +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full > > +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "file1 extents and holes" > > +_count_extents $testdir/file1 > > +_count_holes $testdir/file1 > > + > > +_reflink_range $testdir/file1 $blksz $testdir/file2 $((blksz * 3)) $blksz >> $seqres.full > > +_reflink_range $testdir/file1 $((blksz * 3)) $testdir/file2 $blksz $blksz >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Compare files" > > +md5sum $testdir/file1 | _filter_scratch > > +md5sum $testdir/file2 | _filter_scratch > > + > > +echo "file1 extents and holes" > > +_count_extents $testdir/file1 > > +_count_holes $testdir/file1 > > +echo "file2 extents and holes" > > +_count_extents $testdir/file2 > > +_count_holes $testdir/file2 > > +echo "file1 shared extents" > > +$XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep '0x.*[2367aAbBfF]...$' -c > > Missing a command at the end? Nope, it echoes the number of shared extents (that's what that awk and grep globule does), which /should/ be exactly 2. (Unless I'm missing something?) --D > > Thanks, > Eryu > > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/generic/929.out b/tests/generic/929.out > > new file mode 100644 > > index 0000000..e290f4c > > --- /dev/null > > +++ b/tests/generic/929.out > > @@ -0,0 +1,17 @@ > > +QA output created by 929 > > +Format and mount > > +Create the original files > > +file1 extents and holes > > +1 > > +0 > > +Compare files > > +17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-929/file1 > > +79418df9c55ab7f58781cb7b9e7d5d91 SCRATCH_MNT/test-929/file2 > > +file1 extents and holes > > +5 > > +0 > > +file2 extents and holes > > +2 > > +2 > > +file1 shared extents > > +2 > > diff --git a/tests/generic/group b/tests/generic/group > > index 18b9775..732f6f6 100644 > > --- a/tests/generic/group > > +++ b/tests/generic/group > > @@ -375,3 +375,4 @@ > > 370 auto quick richacl > > 927 auto quick clone > > 928 auto quick clone dedupe > > +929 auto quick clone > -- > To unsubscribe from this list: send the line "unsubscribe fstests" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From darrick.wong@oracle.com Fri Aug 5 03:03:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0FFB37CA4 for ; Fri, 5 Aug 2016 03:03:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B94DF304039 for ; Fri, 5 Aug 2016 01:03:05 -0700 (PDT) X-ASG-Debug-ID: 1470384175-0bf8157e6d4cd720001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id plYdR7kHkginIMI2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 01:02:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7582skS024764 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 08:02:54 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7582rKW022508 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 5 Aug 2016 08:02:53 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7582rmD004436; Fri, 5 Aug 2016 08:02:53 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 05 Aug 2016 01:02:52 -0700 Date: Fri, 5 Aug 2016 01:02:51 -0700 From: "Darrick J. Wong" To: david@fromorbit.com, eguan@redhat.com Cc: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, dedekind1@gmail.com, mfasheh@suse.de Subject: [PATCH v2] generic: test accurate shared extent reporting Message-ID: <20160805080251.GI25565@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2] generic: test accurate shared extent reporting References: <20160805072147.GG25565@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805072147.GG25565@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470384178 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4159 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ensure that we can create a file with a single extent, reflink two blocks out of the middle of that extent, and the resulting fiemap reports two shared extents, instead of lazily reporting the entire huge extent as shared. v2: add _supported_fs Signed-off-by: Darrick J. Wong --- tests/generic/929 | 90 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/929.out | 17 +++++++++ tests/generic/group | 1 + 3 files changed, 108 insertions(+) create mode 100755 tests/generic/929 create mode 100644 tests/generic/929.out diff --git a/tests/generic/929 b/tests/generic/929 new file mode 100755 index 0000000..1871789 --- /dev/null +++ b/tests/generic/929 @@ -0,0 +1,90 @@ +#! /bin/bash +# FS QA Test No. 929 +# +# Check that bmap/fiemap accurately report shared extents. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* + wait +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs generic +_require_scratch_reflink +_require_fiemap + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blocks=5 +blksz=65536 +sz=$((blocks * blksz)) + +echo "Create the original files" +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full +_scratch_cycle_mount + +echo "file1 extents and holes" +_count_extents $testdir/file1 +_count_holes $testdir/file1 + +_reflink_range $testdir/file1 $blksz $testdir/file2 $((blksz * 3)) $blksz >> $seqres.full +_reflink_range $testdir/file1 $((blksz * 3)) $testdir/file2 $blksz $blksz >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch +md5sum $testdir/file2 | _filter_scratch + +echo "file1 extents and holes" +_count_extents $testdir/file1 +_count_holes $testdir/file1 +echo "file2 extents and holes" +_count_extents $testdir/file2 +_count_holes $testdir/file2 +echo "file1 shared extents" +$XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep -c '0x.*[2367aAbBfF]...$' + +# success, all done +status=0 +exit diff --git a/tests/generic/929.out b/tests/generic/929.out new file mode 100644 index 0000000..e290f4c --- /dev/null +++ b/tests/generic/929.out @@ -0,0 +1,17 @@ +QA output created by 929 +Format and mount +Create the original files +file1 extents and holes +1 +0 +Compare files +17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-929/file1 +79418df9c55ab7f58781cb7b9e7d5d91 SCRATCH_MNT/test-929/file2 +file1 extents and holes +5 +0 +file2 extents and holes +2 +2 +file1 shared extents +2 diff --git a/tests/generic/group b/tests/generic/group index 18b9775..732f6f6 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -375,3 +375,4 @@ 370 auto quick richacl 927 auto quick clone 928 auto quick clone dedupe +929 auto quick clone From felix.janda@posteo.de Fri Aug 5 03:03:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=TRACKER_ID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BDAF17CA1 for ; Fri, 5 Aug 2016 03:03:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3FE53AC004 for ; Fri, 5 Aug 2016 01:03:27 -0700 (PDT) X-ASG-Debug-ID: 1470384195-0bf57b369e437f80001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id XEU784HUNF0YeQOF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 01:03:19 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 2E1CB20453 for ; Fri, 5 Aug 2016 10:03:14 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s5K735Hx6z1018; Fri, 5 Aug 2016 10:03:11 +0200 (CEST) Date: Fri, 5 Aug 2016 10:02:41 +0200 From: Felix Janda To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160805080241.GA749@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> <20160804004747.GZ16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804004747.GZ16044@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470384199 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1359 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, TRACKER_ID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31768 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 TRACKER_ID BODY: Incorporates a tracking ID number Dave Chinner wrote: > On Mon, Aug 01, 2016 at 08:54:10AM +0200, Felix Janda wrote: > > Christoph Hellwig wrote: > > > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > > > int64_t is guaranteed to have the correct size and signedness and is > > > > always avaible because linux.h has a include. > > > > > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > > > public header is included without _LARGEFILE64_SOURCE or > > > > _GNU_SOURCE defined. This bug was introduced in commit > > > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > > > > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. > > > > Thanks for the suggestion, but that does not work if the system header > > defining (or not) off64_t is included before the xfs headers. > > Which, to me, is a build bug in whatever code is including the xfs > headers. Isn't it the responsibility of the build environment to > ensure the dependencies of the libraries being used are correctly > met? Every program using the xfs header is supposed to know that (only on linux) since commit cb898f157f8410a03cf5f3400baa1df9e5eecd33 it is necessary to define _LARGEFILE64_SOURCE or _GNU_SOURCE? In commit f96aff0c250ae8c70f50d5becb592723eb064f5d something very similar was done. Felix From eguan@redhat.com Fri Aug 5 03:14:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E355E7CA1 for ; Fri, 5 Aug 2016 03:14:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2CC2304032 for ; Fri, 5 Aug 2016 01:14:24 -0700 (PDT) X-ASG-Debug-ID: 1470384862-0bf57b369b439740001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zdhdgYtymygoyB6k (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 01:14:23 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9A00DC057FAA; Fri, 5 Aug 2016 08:14:22 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u758ELoJ007902; Fri, 5 Aug 2016 04:14:22 -0400 Date: Fri, 5 Aug 2016 16:14:21 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: dedekind1@gmail.com, mfasheh@suse.de, fstests@vger.kernel.org, xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] generic: test accurate shared extent reporting Message-ID: <20160805081421.GX27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] generic: test accurate shared extent reporting References: <20160805072147.GG25565@birch.djwong.org> <20160805074607.GW27776@eguan.usersys.redhat.com> <20160805080212.GH25565@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805080212.GH25565@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 05 Aug 2016 08:14:22 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470384863 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 715 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 05, 2016 at 01:02:12AM -0700, Darrick J. Wong wrote: > On Fri, Aug 05, 2016 at 03:46:07PM +0800, Eryu Guan wrote: > > On Fri, Aug 05, 2016 at 12:21:47AM -0700, Darrick J. Wong wrote: > > > +_count_holes $testdir/file2 > > > +echo "file1 shared extents" > > > +$XFS_IO_PROG -c 'fiemap -v' $testdir/file1 | awk '{print $5}' | grep '0x.*[2367aAbBfF]...$' -c > > > > Missing a command at the end? > > Nope, it echoes the number of shared extents (that's what that awk and grep > globule does), which /should/ be exactly 2. > > (Unless I'm missing something?) Ah, thanks! I saw "-c" at the end and thought it was part of xfs_io command without looking at it carefully. Thanks, Eryu From cmaiolin@redhat.com Fri Aug 5 03:25:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9BE007CA0 for ; Fri, 5 Aug 2016 03:25:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0DCE2AC004 for ; Fri, 5 Aug 2016 01:25:28 -0700 (PDT) X-ASG-Debug-ID: 1470385525-0bf57b369e43afb0001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id uaAERAAUOssYyHKD (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 05 Aug 2016 01:25:26 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolin@redhat.com X-Barracuda-Effective-Source-IP: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail17.collab.prod.int.phx2.redhat.com (zmail17.collab.prod.int.phx2.redhat.com [10.5.83.19]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id u758PMTI022329; Fri, 5 Aug 2016 04:25:22 -0400 Date: Fri, 5 Aug 2016 04:25:21 -0400 (EDT) From: Carlos Eduardo Maiolino To: Martin Steigerwald Cc: xfs@oss.sgi.com, "Carlos E. R." Message-ID: <784564312.1292141.1470385521968.JavaMail.zimbra@redhat.com> In-Reply-To: <1693896.yYUZdOzIYq@merkaba> References: <4278AB9734C1445A8E48635B155149F8@dinulap> <9b25f9f9-8a55-8744-9f18-c1045fae0f79@telefonica.net> <20160803231529.GX16044@dastard> <1693896.yYUZdOzIYq@merkaba> Subject: Re: Spam on this list MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Spam on this list Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.3.229.63] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF47 (Linux)/8.0.6_GA_5922) Thread-Topic: Spam on this list Thread-Index: LGdPOvuA/lWrNjaqPi6LxGnc7zNfqg== X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1470385526 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1435 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header >> >> That said, I'm seriously tempted right now just to say "we're moving >> to vger" and asking everyone to resubscribe to that list, and then >> making xfs@oss.sgi.com respond with "list moved to vger, please >> repost there". i.e. not even put a forwarding gateway in place. >> >> If we do that, then I'll also shut down all the XFS git trees on >> oss.sgi.com - I'll add commits to the them to say "go to >> kernel.org". I'll need to work something out for the tarball >> releases, but kernel.org does have functionality for that, too, so >> that may just be a small change of process on my end (i.e. use kup). >> Once that is done, we'll be running completely on community provided >> infrastructure.... >> >> Thoughts? >Nice, so this time discussing spam on the list on the list may have a nice >effect in the end. > >I completely agree and have no issues with resubscribung there. > >Thank you, >-- >Martin +1 here. Honestly, I don't believe that moving to vger will be a big trouble for anyone other than the list maintainer who will need to set auto-respond messages. And we have the advantage of moving it to a community provided infra as you said. Let me know if you need any help with it, I'll be glad to help in this change -- --Carlos P.S. Martin, I apologize for the dup'ed e-mail, my MUA tricked me and I didn't copy xfs list on my previous reply.. From david@fromorbit.com Fri Aug 5 05:50:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 76CFD7CA0 for ; Fri, 5 Aug 2016 05:50:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DDFB0AC005 for ; Fri, 5 Aug 2016 03:49:56 -0700 (PDT) X-ASG-Debug-ID: 1470394193-0bf57b369d448920001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id E8yPeLgtgxFbjzbH for ; Fri, 05 Aug 2016 03:49:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar0PAB9upFd5LI7JIGdsb2JhbABcg0WBUoZynS8BAQEBAQEGjGGGD4QMhhMEBAICgUdNAQEBAQEBBwEBAQEBAThAhF8BBTIBIyMQCAMOCgklDwUlAwcaE4gwvjkBAQEHAgEkHoVEhRWHbIIvAQSZNY5+jiWBJ4wzg3eEYCoyh2UBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2016 20:19:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVchK-0004li-Ow; Fri, 05 Aug 2016 20:49:50 +1000 Date: Fri, 5 Aug 2016 20:49:50 +1000 From: Dave Chinner To: Artem Bityutskiy Cc: "Darrick J. Wong" , Mark Fasheh , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160805104950.GF16044@dastard> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> <20160804235015.GC16044@dastard> <1470380474.2311.71.camel@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1470380474.2311.71.camel@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470394193 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 805 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 05, 2016 at 10:01:14AM +0300, Artem Bityutskiy wrote: > On Fri, 2016-08-05 at 09:50 +1000, Dave Chinner wrote: > > I'd much prefer that fiemap gives exact information about shared > > extents. FIEMAP is a diagnostic tool and as such we need it to > > accurately reflect the exact extent map of the inode being queried > > so we aren't mislead about the layout of the file during trouble > > shooting. > > Hi Dave, you are right, and here is a side note:  we were using FIEMAP > for optimizing image deployment in production, so it is a diagnostic > tool and more. Yay, data corruption ahoy! Hasn't /anyone/ listened to the repeated statements from fs developers that FIEMAP is not a safe method of optimising data copying? -Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 5 06:27:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 145447CA3 for ; Fri, 5 Aug 2016 06:27:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D95E3304032 for ; Fri, 5 Aug 2016 04:27:44 -0700 (PDT) X-ASG-Debug-ID: 1470396461-0bf57c13683ec500001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 3BdiDvL93NomDps7 for ; Fri, 05 Aug 2016 04:27:41 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArgPAIR3pFd5LI7JIGdsb2JhbABcg0WBUoZynS8BAQEBAQEGjGGKG4YXBAICgUdNAQEBAQEBBwEBAQEBAThAhF4BAQQBMgEjIwULCAMYCSUPBSUDBxoTiCkHvkIBAQgCJR6FRIUVihsBBJk1jn6PTIwzg3eEYCoyh2UBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2016 20:57:40 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVdHv-0004qR-Dp; Fri, 05 Aug 2016 21:27:39 +1000 Date: Fri, 5 Aug 2016 21:27:39 +1000 From: Dave Chinner To: "Kani, Toshimitsu" Cc: "boaz@plexistor.com" , "linux-ext4@vger.kernel.org" , "jack@suse.cz" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" Subject: Re: Subtle races between DAX mmap fault and write path Message-ID: <20160805112739.GG16044@dastard> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path References: <20160727120745.GI6860@quack2.suse.cz> <20160727211039.GA20278@linux.intel.com> <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1470335997.8908.128.camel@hpe.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470396461 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1937 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31771 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header [ cut to just the important points ] On Thu, Aug 04, 2016 at 06:40:42PM +0000, Kani, Toshimitsu wrote: > On Tue, 2016-08-02 at 10:21 +1000, Dave Chinner wrote: > > If I drop the fsync from the > > buffered IO path, bandwidth remains the same but runtime drops to > > 0.55-0.57s, so again the buffered IO write path is faster than DAX > > while doing more work. > > I do not think the test results are relevant on this point because both > buffered and dax write() paths use uncached copy to avoid clflush.  The > buffered path uses cached copy to the page cache and then use uncached copy to > PMEM via writeback.  Therefore, the buffered IO path also benefits from using > uncached copy to avoid clflush. Except that I tested without the writeback path for buffered IO, so there was a direct comparison for single cached copy vs single uncached copy. The undenial fact is that a write() with a single cached copy with all the overhead of dirty page tracking is /faster/ than a much shorter, simpler IO path that uses an uncached copy. That's what the numbers say.... > Cached copy (req movq) is slightly faster than uncached copy, Not according to Boaz - he claims that uncached is 20% faster than cached. How about you two get together, do some benchmarking and get your story straight, eh? > and should be > used for writing to the page cache.  For writing to PMEM, however, additional > clflush can be expensive, and allocating cachelines for PMEM leads to evict > application's cachelines. I keep hearing people tell me why cached copies are slower, but no-one is providing numbers to back up their statements. The only numbers we have are the ones I've published showing cached copies w/ full dirty tracking is faster than uncached copy w/o dirty tracking. Show me the numbers that back up your statements, then I'll listen to you. -Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 5 06:52:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4EE487CA3 for ; Fri, 5 Aug 2016 06:52:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01E7A304032 for ; Fri, 5 Aug 2016 04:52:43 -0700 (PDT) X-ASG-Debug-ID: 1470397960-0bf8157e6d4e3170001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ykSrSI16JtudYGRL for ; Fri, 05 Aug 2016 04:52:41 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlcQAF99pFd5LI7JIGdsb2JhbABcg0WBUoZynS8BAQEBAQEGjGGGD4QMhhcCAgEBAoFITQEBAQEBAQcBAQEBAQE4QIRfAQU6HCMQCAMYCSUPBSUDBxoTiDC+QAELASQehUSFFYobBY4Xix6Ofo9MSItrg3eEYCoyh2UBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2016 21:22:40 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVdg7-0004t7-4B; Fri, 05 Aug 2016 21:52:39 +1000 Date: Fri, 5 Aug 2016 21:52:39 +1000 From: Dave Chinner To: Felix Janda Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160805115239.GH16044@dastard> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> <20160804004747.GZ16044@dastard> <20160805080241.GA749@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805080241.GA749@nyan> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470397960 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1713 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31771 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 05, 2016 at 10:02:41AM +0200, Felix Janda wrote: > Dave Chinner wrote: > > On Mon, Aug 01, 2016 at 08:54:10AM +0200, Felix Janda wrote: > > > Christoph Hellwig wrote: > > > > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > > > > int64_t is guaranteed to have the correct size and signedness and is > > > > > always avaible because linux.h has a include. > > > > > > > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > > > > public header is included without _LARGEFILE64_SOURCE or > > > > > _GNU_SOURCE defined. This bug was introduced in commit > > > > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > > > > > > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. > > > > > > Thanks for the suggestion, but that does not work if the system header > > > defining (or not) off64_t is included before the xfs headers. > > > > Which, to me, is a build bug in whatever code is including the xfs > > headers. Isn't it the responsibility of the build environment to > > ensure the dependencies of the libraries being used are correctly > > met? > > Every program using the xfs header is supposed to know that (only on > linux) since commit cb898f157f8410a03cf5f3400baa1df9e5eecd33 it is > necessary to define _LARGEFILE64_SOURCE or _GNU_SOURCE? Which, I'd say, most already do, because anything trying to use XFS ioctls needs to be 64 bit offset clean, even on 32 bit systems. I don't see any problem with requiring it when including a header that exposes ioctl interfaces with 64 bit file size/offset fields in them.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dedekind1@gmail.com Fri Aug 5 06:57:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DD1277CA1 for ; Fri, 5 Aug 2016 06:57:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 55AD6AC003 for ; Fri, 5 Aug 2016 04:57:21 -0700 (PDT) X-ASG-Debug-ID: 1470398240-0bf57c13683ee5c0001-NocioJ Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by cuda.sgi.com with ESMTP id JERgP0HF7lJnL910 for ; Fri, 05 Aug 2016 04:57:20 -0700 (PDT) X-Barracuda-Envelope-From: dedekind1@gmail.com X-Barracuda-Effective-Source-IP: mga09.intel.com[134.134.136.24] X-Barracuda-Apparent-Source-IP: 134.134.136.24 X-ASG-Whitelist: Client Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga102.jf.intel.com with ESMTP; 05 Aug 2016 04:57:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,473,1464678000"; d="scan'208";a="860270532" Received: from linux.intel.com ([10.54.29.200]) by orsmga003.jf.intel.com with ESMTP; 05 Aug 2016 04:57:20 -0700 Received: from abityuts-desk.fi.intel.com (abityuts-desk.fi.intel.com [10.237.68.147]) by linux.intel.com (Postfix) with ESMTP id A396D6A4006; Fri, 5 Aug 2016 04:57:04 -0700 (PDT) Message-ID: <1470398236.2311.89.camel@gmail.com> Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support From: Artem Bityutskiy X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support Reply-To: dedekind1@gmail.com To: Dave Chinner Cc: "Darrick J. Wong" , Mark Fasheh , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Date: Fri, 05 Aug 2016 14:57:16 +0300 In-Reply-To: <20160805104950.GF16044@dastard> References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> <20160804235015.GC16044@dastard> <1470380474.2311.71.camel@gmail.com> <20160805104950.GF16044@dastard> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.20.4 (3.20.4-1.fc24) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mga09.intel.com[134.134.136.24] X-Barracuda-Start-Time: 1470398240 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1005 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, 2016-08-05 at 20:49 +1000, Dave Chinner wrote: > On Fri, Aug 05, 2016 at 10:01:14AM +0300, Artem Bityutskiy wrote: > > > > On Fri, 2016-08-05 at 09:50 +1000, Dave Chinner wrote: > > > > > > I'd much prefer that fiemap gives exact information about shared > > > extents. FIEMAP is a diagnostic tool and as such we need it to > > > accurately reflect the exact extent map of the inode being > > > queried > > > so we aren't mislead about the layout of the file during trouble > > > shooting. > > > > Hi Dave, you are right, and here is a side note:  we were using > > FIEMAP > > for optimizing image deployment in production, so it is a > > diagnostic > > tool and more. > > Yay, data corruption ahoy! > > Hasn't /anyone/ listened to the repeated statements from fs > developers that FIEMAP is not a safe method of optimising data > copying? Yes, which is kind of sad from the user's perspective. We had issues with XFS, not ext4, and tweaking preallocation helped. From info27@jwm.com Fri Aug 5 07:27:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.6 required=5.0 tests=HTML_IMAGE_ONLY_12, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBFEC7CB1 for ; Fri, 5 Aug 2016 07:27:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7EC7C8F8050 for ; Fri, 5 Aug 2016 05:26:58 -0700 (PDT) X-ASG-Debug-ID: 1470399989-0bf57c13683ef7a0001-NocioJ Received: from jwm.com ([211.162.33.15]) by cuda.sgi.com with SMTP id XmCYsmrhfCuPxd7F for ; Fri, 05 Aug 2016 05:26:30 -0700 (PDT) X-Barracuda-Envelope-From: info27@jwm.com X-Barracuda-Effective-Source-IP: UNKNOWN[211.162.33.15] X-Barracuda-Apparent-Source-IP: 211.162.33.15 Sender: info27@jwm.com Received: from YOS-01601281706[127.0.0.1] by YOS-01601281706[127.0.0.1] (SMTPD32); Fri, 5 Aug 2016 20:29:28 +0800 From: "custompartsmfg@163.com" Subject: Re: spare parts xfs 2016-08-05 20:29:28 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: spare parts xfs 2016-08-05 20:29:28 Content-Type: multipart/mixed; charset=UTF-8; boundary="2G=_DIQwOlRgjlDPc3yxNaTfMvnB7x8kKd" MIME-Version: 1.0 Reply-To: custompartsmfg@163.com Date: Fri, 5 Aug 2016 20:29:28 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] X-Barracuda-Connect: UNKNOWN[211.162.33.15] X-Barracuda-Start-Time: 1470399989 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 951 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.37 X-Barracuda-Spam-Status: No, SCORE=2.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_IMAGE_ONLY_12, HTML_IMAGE_ONLY_12_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31771 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_IMAGE_ONLY_12 BODY: HTML: images with 800-1200 bytes of words 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.63 HTML_IMAGE_ONLY_12_2 HTML: images with 800-1200 bytes of words 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160805122658.20F131940065@cuda.sgi.com> This is a multi-part message in MIME format --2G=_DIQwOlRgjlDPc3yxNaTfMvnB7x8kKd Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC45NjAwLjE4MzQ5Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQPjxGT05UIGZh Y2U9Q2FsaWJyaT54ZnM8QlI+SGkgbWFuYWdlcjxCUj48QlI+PC9GT05UPjxGT05UIA0KZmFjZT1D YWxpYnJpPllvdSB3YW50IGRlcGVuZGFibGUgbWV0YWwgcGFydHMgc3VwcGxpZXI/IDxCUj5Mb29r IG5vIGZ1cnRoZXIuIE91ciANCnBvbGljeSBpcyB0byBvZmZlciBpdHMgY3VzdG9tZXJzIGEgcXVh bGl0eSBhbmQgY29tcGV0aXRpdmUgcHJvZHVjdCwmbmJzcDt3aXRoIG9uIA0KdGltZSBkZWxpdmVy eS48QlI+PEJSPjwvRk9OVD48Rk9OVCBmYWNlPUNhbGlicmk+SWYgeW91IGhhdmUgYW55IHJlcXVp cmVtZW50IA0KZm9yJm5ic3A7Y3VzdG9tIG1ldGFsIHBhcnRzLCBKV00gaXMganVzdCB5b3VyIHRv dGFsIHBhcnRzIG1hbnVmYWN0dXJpbmcgDQpzb2x1dGlvbiwgcGxlYXNlIGp1c3QgcmVwbHkgZm9y IGZ1cnRoZXIgYXNzaXN0YW5jZS48QlI+PEJSPjwvRk9OVD48Rk9OVCANCmZhY2U9Q2FsaWJyaT5U aGFuayB5b3UgaW4gYWR2YW5jZSE8QlI+Q3VzdG9tJm5ic3A7cGFydHMgTUZHIA0KdGVhbTxCUj4y MDE2LTA4LTA1IDIwOjI5OjI4PEJSPjQ2MkRENTRBLTJFMTUtNDU3Mi1BNTY0LUIwQjM3QTRGMEYw MjwvRk9OVD4mbmJzcDs8QlI+PElNRyBib3JkZXI9MCBoc3BhY2U9MCANCmFsdD0iIiBzcmM9ImNp ZDppbWcwLmpwZyIgYWxpZ249YmFzZWxpbmU+PC9QPjwvQk9EWT48L0hUTUw+DQoNCg== --2G=_DIQwOlRgjlDPc3yxNaTfMvnB7x8kKd Content-Type: image/jpeg; name="01.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="01.jpg" Content-ID: Content-Description: Photo /9j/4TsHRXhpZgAATU0AKgAAAAgAEQEAAAQAAAABAAAQIAEBAAQAAAABAAAJEgECAAMAAAADAAAA 2gEGAAMAAAABAAIAAAEPAAIAAAAIAAAA4AEQAAIAAAAJAAAA6AESAAMAAAABAAEAAAEVAAMAAAAB AAMAAAEaAAUAAAABAAAA8QEbAAUAAAABAAAA+QEoAAMAAAABAAIAAAExAAIAAAAeAAABAQEyAAIA AAAUAAABHwITAAMAAAABAAEAAOocAAcAAAgMAAABM4dpAAQAAAABAAAJQIglAAQAAAABAAAb0AAA G+QACAAIAAhTQU1TVU5HAFNNLUc3NTA5AAAK/IAAACcQAAr8gAAAJxBBZG9iZSBQaG90b3Nob3Ag Q1M2IChXaW5kb3dzKQAyMDE2OjA2OjI1IDIxOjA3OjM3ABzqAAAACAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAggpoABQAAAAEAAArG gp0ABQAAAAEAAArOiCIAAwAAAAEAAgAAiCcAAwAAAAEAMgAAkAAABwAAAAQwMjIwkAMAAgAAABQA AArWkAQAAgAAABQAAArqkQEABwAAAAQBAgMAkgEACgAAAAEAAAr+kgIABQAAAAEAAAsGkgMACgAA AAEAAAsOkgQACgAAAAEAAAsWkgUABQAAAAEAAAsekgcAAwAAAAEAAgAAkggAAwAAAAEAAAAAkgkA AwAAAAEAAAAAkgoABQAAAAEAAAsmkoYABwAACFQAAAsuoAAABwAAAAQwMTAwoAEAAwAAAAEAAQAA oAIABAAAAAEAAAKooAMABAAAAAEAAANAoAUABAAAAAEAABuwohcAAwAAAAEAAgAAowEABwAAAAEB AAAApAIAAwAAAAEAAAAApAMAAwAAAAEAAAAApAUAAwAAAAEAHAAApAYAAwAAAAEAAAAApCAAAgAA ACEAABOC6hwABwAACAwAABOj6h0ACQAAAAEAAAfmAAAAAAAAAAEAAAG9AAAAyAAAAGQyMDE2OjA2 OjI1IDEwOjE0OjA1ADIwMTY6MDY6MjUgMTA6MTQ6MDUAAAADbwAAAGQAAADIAAAAZAAAAqcAAABk AAAAAAAAAAoAAADIAAAAZAAAAXEAAABkQVNDSUkAAAAKAAAAQUxDU0lJRjW6ygYAXPgBAAAAAQDI dgEArOsBAHrw/v/ZIwAA5rP//4WSAQCXuf//Y/r//wEy//+e0wEAAQAAAKlRAAB7VwAA3FEAALhX AAC6F2QZAAAA/xigAQKlV9NRqFfYUXD9AAAAAAEAfP8AAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAA AAAAAAAAAAAAAAABAM1aAQI+gQAAB5kAAEZ9AABRlwAAHAgBAOUCAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABB TENFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZBRkETAKIBmgIAAAMAogEbAgAARkFGQQ4ATAEA AAAATAEAAAAAXAH0JwCGbAFeWgCPfAGb5wCYjAGvVgCgnAEU/gClrAGPGACivAGY2gCZzAG+MgCN pgEAAAAAogGfVACongFSpgCoogHHigCn//8AAQAA7v8GygAA3f8AAAAAzP8AZAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAARkFGQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAACurq6uOgH4AQABAAGCAncBywYAAK+vr6+qAAAAvr6+vgEBAAC/v7+/oQAA AM7Ozs6sAKwAz8/PzwIAAADe3t7eKAAoAODg4OACAAAAAAAAAIMAAADq6urqACgAKAICAgAAAAAA AAAAAOvr6+sBAAEACgAUAG7r/f7s7OzsAAEAAJUFawYCAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP/u3cwWAQAAUENMMTQyMTc1OSBDQUxGMTNRU0hFMDFNTSBDUkMwMQBGMTNRU0hJMDFN TQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgABAAIAAAAEUjk4AAACAAcAAAAEMDEw MAAAAAAAAAABAAAAAQAAAAQCAgAAAAAAAAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAHDIBGwAF AAAAAQAAHDoBKAADAAAAAQACAAACAQAEAAAAAQAAHEICAgAEAAAAAQAAHr0AAAAAAAAASAAAAAEA AABIAAAAAf/Y/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsK CxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0O DRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAz/wAARCACgAIMDASIAAhEBAxEB/90ABAAJ/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcI CQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCES MQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl 8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQE AwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKD ByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dn d4eXp7fH/9oADAMBAAIRAxEAPwAt/VKMO9tNtFz97d1b62OsDiDtdXtpZa5rmfylMdWYXbR0/qDn DSG4dxP/AFDUGl9reoWhpJJx3uaJiC337/7K0RbZfc0NufeX2Ha8iXP0Ppy0n895Y1SSlLioFjjE VdIP2lYBp0jqpP8AJwLT/wBU5ikzPzHkbOi9VH9bBj/z5m1LP6n/AIwcDpBOFgB+VY2W5GQIawuB 97KS8OfYxv8Apdte9dP9WvrHj9ew2nHO60AuE6OIB99ZZ/pKkzjl3XcEezUx2dRudA6Tngn6O6mi kT23vt6nbtZ/1pEe17bHsdy1xa6NdQS0/wDSXTYZBub8/vhcnblUjIzAHBzqsnIDm9/bY4u9n0ne 17Pop8JE7rZRA2SsmfNWGGCwEQ613p1NOhe8y702bvpP2tc5WPqnc9/RqHuMl1uWSfP7VfKP9YzG V0B86nqrB8N2NmNTDl1IrZcMfihOFlNrc91TmtYC5zjAgDVx5QjjZLmmKLCDwdp/uVvHzOq33dSo zcJ2NjU12Ci9zmFtgh2x1HpOc97HU/pH+r/N/wA2tFry6qoDWWsI85aEDkI6BPAO5ecyG24w3X1u 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 bAAAAAAAQ2xicmJvb2wAAAAAAFJnc01ib29sAAAAAABDcm5DYm9vbAAAAAAAQ250Q2Jvb2wAAAAA AExibHNib29sAAAAAABOZ3R2Ym9vbAAAAAAARW1sRGJvb2wAAAAAAEludHJib29sAAAAAABCY2tn T2JqYwAAAAEAAAAAAABSR0JDAAAAAwAAAABSZCAgZG91YkBv4AAAAAAAAAAAAEdybiBkb3ViQG/g AAAAAAAAAAAAQmwgIGRvdWJAb+AAAAAAAAAAAABCcmRUVW50RiNSbHQAAAAAAAAAAAAAAABCbGQg VW50RiNSbHQAAAAAAAAAAAAAAABSc2x0VW50RiNQeGxAUgAAAAAAAAAAAAp2ZWN0b3JEYXRhYm9v bAEAAAAAUGdQc2VudW0AAAAAUGdQcwAAAABQZ1BDAAAAAExlZnRVbnRGI1JsdAAAAAAAAAAAAAAA AFRvcCBVbnRGI1JsdAAAAAAAAAAAAAAAAFNjbCBVbnRGI1ByY0BZAAAAAAAAAAAAEGNyb3BXaGVu UHJpbnRpbmdib29sAAAAAA5jcm9wUmVjdEJvdHRvbWxvbmcAAAAAAAAADGNyb3BSZWN0TGVmdGxv bmcAAAAAAAAADWNyb3BSZWN0UmlnaHRsb25nAAAAAAAAAAtjcm9wUmVjdFRvcGxvbmcAAAAAADhC SU0D7QAAAAAAEABIAAAAAQACAEgAAAABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0E DQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAA AAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYA AAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP// //////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//// /////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQI AAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1MAAAAGAAAA AAAAAAAAAANAAAACqAAAAA8AMgAwADEANgAwADYAMgA1AF8AMQAwADEANAAwADYAAAABAAAAAAAA AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAqgAAANAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA AAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEA AAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAANAAAAAAFJn aHRsb25nAAACqAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3Ns aWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VP cmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAA AAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxv bmcAAAAAAAAAAEJ0b21sb25nAAADQAAAAABSZ2h0bG9uZwAAAqgAAAADdXJsVEVYVAAAAAEAAAAA AABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAA DmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVu dW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xp Y2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xv clR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAA AAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAA AAwAAAACP/AAAAAAAAA4QklNBBQAAAAAAAQAAAACOEJJTQQMAAAAAB7ZAAAAAQAAAIMAAACgAAAB jAAA94AAAB69ABgAAf/Y/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgM CQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM AQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAz/wAARCACgAIMDASIAAhEBAxEB/90ABAAJ/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwAB AgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEA AhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0 NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEA AgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTx JQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm 9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwAt/VKMO9tNtFz97d1b62OsDiDtdXtpZa5rmfylMdWY XbR0/qDnDSG4dxP/AFDUGl9reoWhpJJx3uaJiC337/7K0RbZfc0NufeX2Ha8iXP0Ppy0n895Y1SS lLioFjjEVdIP2lYBp0jqpP8AJwLT/wBU5ikzPzHkbOi9VH9bBj/z5m1LP6n/AIwcDpBOFgB+VY2W 5GQIawuB97KS8OfYxv8Apdte9dP9WvrHj9ew2nHO60AuE6OIB99ZZ/pKkzjl3XcEezUx2dRudA6T ngn6O6mikT23vt6nbtZ/1pEe17bHsdy1xa6NdQS0/wDSXTYZBub8/vhcnblUjIzAHBzqsnIDm9/b Y4u9n0ne17Pop8JE7rZRA2SsmfNWGGCwEQ613p1NOhe8y702bvpP2tc5WPqnc9/RqHuMl1uWSfP7 VfKP9YzGV0B86nqrB8N2NmNTDl1IrZcMfihOFlNrc91TmtYC5zjAgDVx5QjjZLmmKLCDwdp/uVvH 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 tukmHtBI1clQtIJpu4+Lj0VNqqADQ0bR5DugZlDSwgDlXjCHY0OEIoeOym3YmUzKpANtLg4AzDgD O10Fu7/yG9dTg2Yf1kpryMLIOH1bGHt9wDh22uJj1Gu+j/o7f5D/AFaVRzsEWTosO7puVRcL8Zzq rWmWvYSDP9lN2XaEPV5V+XQ00dc6W55bp9pxIg/yn4tm3b/1qz0/+DWBlH6u7y6mjJ3+Bra0/jYj Y31v+tVFQovqbmMGg3tE/wDkP/A0O3rPWco/o+mV1uP52xg/6ragVUQ51xaGl9dPpsEmXmTp4n6L FDBw8jqmX6NLpmDdkRLa2H6O3/0TX/hFpUdG6nmWi3Ov9Fo/Mp+l/wBuH21/+CrosHCow6RTQwVs GsDuTy97ne573fvvRAVdeJT0V04eNXj0N21VNDGN8APH95zvpvWd1bqN+PSX0v2v7R2K0Lp2wFgd VrteIDSU61rpfVmp2b9V+nusaXH031kmT/N221c/1WJmdDzcHMGd0vKtwsmIL6wCHN/ctqs3VXM/ 41i4g4/UKa3UNxrHAOc5j2vgQ53qfQ3Vu/OUH19Ud9HFePi4f3pWFUX0fJ6h9Yr6vSys1u3hzqaW VPPxscbdv/Wm1rj/AK03214X2Kqx1eO5zQ9rdZBPu3a+/c73+5ZDOn9XsMfZvvcAit+p/XMnWump g7B1rePmlYVTt/8AOTM+zfa92n7G9TbJ/pPr/sz1uf3/ANIko/8AM7qX2D7L6tW79n/Zd24x6v2z 9pbPo/zfpfo/V/0qSCn/2QA4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8A dABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADYAAAAB ADhCSU0EBgAAAAAABwACAAAAAQEA/+EODGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94 cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1w bWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4z LWMwMTEgNjYuMTQ1NjYxLCAyMDEyLzAyLzA2LTE0OjU2OjI3ICAgICAgICAiPiA8cmRmOlJERiB4 bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8 cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5j b20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0v IiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNl RXZlbnQjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEu MC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0 b3JUb29sPSJNaWNyb3NvZnQgV2luZG93cyBQaG90byBWaWV3ZXIgNi4xLjc2MDAuMTYzODUiIHht cDpNb2RpZnlEYXRlPSIyMDE2LTA2LTI1VDIxOjA3OjM3KzA4OjAwIiB4bXA6Q3JlYXRlRGF0ZT0i MjAxNi0wNi0yNVQxMDoxNDowNSIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxNi0wNi0yNVQyMTowNzoz NyswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMDE1NURDQUQ1M0FFNjExQUZFNEMy MzUxNEQ3M0RDRCIgeG1wTU06RG9jdW1lbnRJRD0iQ0JGOTBGQTdGOTBGN0Y4OTEyQkZEOEFBODQw M0ZCRUEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0iQ0JGOTBGQTdGOTBGN0Y4OTEyQkZEOEFB ODQwM0ZCRUEiIHBob3Rvc2hvcDpEYXRlQ3JlYXRlZD0iMjAxNi0wNi0yNVQxMDoxNDowNSIgcGhv dG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYt Mi4xIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxy ZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpGRjE0 NURDQUQ1M0FFNjExQUZFNEMyMzUxNEQ3M0RDRCIgc3RFdnQ6d2hlbj0iMjAxNi0wNi0yNVQyMTow NzozNyswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2lu ZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBz dEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjAwMTU1RENBRDUzQUU2MTFBRkU0QzIzNTE0RDczRENE IiBzdEV2dDp3aGVuPSIyMDE2LTA2LTI1VDIxOjA3OjM3KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFn ZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8 L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4g PC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAA AG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAA AAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJY WVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAA iHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQw AAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0 IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYx OTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAA AAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAA AAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAA AAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3Vy IHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3Vy IHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2Ug Vmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZp ZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA dmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dt ZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAA BAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEA hgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZ AR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB 6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1 AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgE VQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2 BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH +AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9 ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM 8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/s EAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MT YxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcd F0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsb YxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/q IBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNol CSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpo KpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUw bDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjau Nuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9 oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTO RRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJM uk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1Tb VShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhd yV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmbo Zz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw 4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsE e2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauG DoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/ kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPed ZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mp qhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm2 8Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRR xM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/S wdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE 4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw 5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////u AA5BZG9iZQBkgAAAAAH/2wCEAAgGBgYGBggGBggMCAcIDA4KCAgKDhANDQ4NDRARDAwMDAwMEQwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBCQgICQoJCwkJCw4LDQsOEQ4ODg4REQwMDAwMEREM DAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIA0ACqAMBIgACEQEDEQH/3QAE ACv/xAGiAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgME BQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMW YvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1 hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp +So6SlpqeoqaqrrK2ur6EQACAgECAwUFBAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB 0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kjs8MoKdPj84SU pLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6Pg5SVlp eYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/ADSlD8scAcx+1Wu2WtP7MzXDbA2/ hjgvTHKB/Zj1WgxQp8csAg+2LccwXb3xVaACBXGFCMWClflXNx5HfrilRCn+zNxrvi5Q/wBDmC4q o8Kb44KaH3xUIPDFVj8cVQ3E+GO47D9WCDGPDbrmKUwKocO4+7K4j+uLccwXFVPh7ZfHFeB7ZfE7 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 2Q== --2G=_DIQwOlRgjlDPc3yxNaTfMvnB7x8kKd-- From felix.janda@posteo.de Fri Aug 5 08:09:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6D86C7CB2 for ; Fri, 5 Aug 2016 08:09:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40001304039 for ; Fri, 5 Aug 2016 06:09:48 -0700 (PDT) X-ASG-Debug-ID: 1470402583-0bf57c136a3f0a90001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id ssGQOSa4IFefCfRB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 06:09:45 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 76F4C20852 for ; Fri, 5 Aug 2016 15:09:43 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s5Rwd6rCyz1048; Fri, 5 Aug 2016 15:09:37 +0200 (CEST) Date: Fri, 5 Aug 2016 15:09:05 +0200 From: Felix Janda To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160805130905.GA321@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> <20160804004747.GZ16044@dastard> <20160805080241.GA749@nyan> <20160805115239.GH16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805115239.GH16044@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470402584 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2168 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31772 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Dave Chinner wrote: > On Fri, Aug 05, 2016 at 10:02:41AM +0200, Felix Janda wrote: > > Dave Chinner wrote: > > > On Mon, Aug 01, 2016 at 08:54:10AM +0200, Felix Janda wrote: > > > > Christoph Hellwig wrote: > > > > > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > > > > > int64_t is guaranteed to have the correct size and signedness and is > > > > > > always avaible because linux.h has a include. > > > > > > > > > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > > > > > public header is included without _LARGEFILE64_SOURCE or > > > > > > _GNU_SOURCE defined. This bug was introduced in commit > > > > > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > > > > > > > > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. > > > > > > > > Thanks for the suggestion, but that does not work if the system header > > > > defining (or not) off64_t is included before the xfs headers. > > > > > > Which, to me, is a build bug in whatever code is including the xfs > > > headers. Isn't it the responsibility of the build environment to > > > ensure the dependencies of the libraries being used are correctly > > > met? > > > > Every program using the xfs header is supposed to know that (only on > > linux) since commit cb898f157f8410a03cf5f3400baa1df9e5eecd33 it is > > necessary to define _LARGEFILE64_SOURCE or _GNU_SOURCE? > > Which, I'd say, most already do, because anything trying to use XFS > ioctls needs to be 64 bit offset clean, even on 32 bit systems. I > don't see any problem with requiring it when including a header > that exposes ioctl interfaces with 64 bit file size/offset fields > in them.... The easiest way to be 64bit clean is to use _FILEOFFSET_BITS=64. Then off_t is 64bit on all architectures and it is impossible to use 32bit interfaces. However the type off64_t will still not be defined... (On the other hand, when just using _LARGEFILE64_SOURCE it is still easy to mix 32 and 64bit interfaces.) Please refer to the "Using LFS Section" of: http://users.suse.com/~aj/linux_lfs.html Cheers, Felix From toshi.kani@hpe.com Fri Aug 5 10:18:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B305B7CB4 for ; Fri, 5 Aug 2016 10:18:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 57B1B8F804B for ; Fri, 5 Aug 2016 08:18:20 -0700 (PDT) X-ASG-Debug-ID: 1470410296-0bf8157e6a4ea510001-NocioJ Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0133.outbound.protection.outlook.com [104.47.36.133]) by cuda.sgi.com with ESMTP id QIGEkGBaVl3AgyN8 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 05 Aug 2016 08:18:17 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Effective-Source-IP: mail-sn1nam02on0133.outbound.protection.outlook.com[104.47.36.133] X-Barracuda-Apparent-Source-IP: 104.47.36.133 Received: from CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.11) by CS1PR84MB0007.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Fri, 5 Aug 2016 15:18:15 +0000 Received: from CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.11]) by CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.11]) with mapi id 15.01.0549.023; Fri, 5 Aug 2016 15:18:14 +0000 From: "Kani, Toshimitsu" To: "david@fromorbit.com" CC: "linux-ext4@vger.kernel.org" , "jack@suse.cz" , "linux-nvdimm@lists.01.org" , "boaz@plexistor.com" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" Subject: Re: Subtle races between DAX mmap fault and write path Thread-Topic: Subtle races between DAX mmap fault and write path X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path Thread-Index: AQHR5/+GKX9GoZT7i02Vp4UF+8RxL6AsxqeAgAATU4CAAKUNgIABMOkAgADPd4CAAJ7PgIADzJCAgADs7QCABFeAgIABGYyAgABAN4A= Date: Fri, 5 Aug 2016 15:18:14 +0000 Message-ID: <1470410249.8908.170.camel@hpe.com> References: <20160727120745.GI6860@quack2.suse.cz> <20160727211039.GA20278@linux.intel.com> <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> In-Reply-To: <20160805112739.GG16044@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=toshi.kani@hpe.com; x-originating-ip: [15.219.163.9] x-ms-office365-filtering-correlation-id: 28b36127-5d6d-44dc-0d20-08d3bd43b8c2 x-microsoft-exchange-diagnostics: 1;CS1PR84MB0007;6:cuqtJN9M4ezLIGopQ0vKudDD8NpL7gZF0sN4loKh5euvlsShv54vKRWMZCvDJk524KirTPKCBv5lfc0+IltaSfeGbi5mvA+2Wkshm3TZdXUmeXskvZe8p0QQipapxNqX6agUEREtoUVrONPnpJaI+B9JXX5z/uxJ9VyV13Y+l8yXrlQBCCjhExeIbCaNGTFcDQ+Q6mCPdyE4HT8+QKfZ72bp9UI9G50DaVTzzc693AL5BNcFnMmWV6xgBdVTvytonIjFcZ68M8mnBvoOTox/DoyIIZPvLfVu4i+smcJFxdCJ74UxFav34wS0raJOj0qqCbHohGOynSefUwgKa9gl+w==;5:0oYwvpynimuSggaT/9E6Lufg+QJK/26s9gVEq8nPRTFpZarm0J3XK81SVBCE1h4T2hIh3fa6KScpUeu3Ix+7hx0ReIToE4vD09zoNZtscoFaqKlWXJLUqF3YvDaQl/hBZI2/Z994KqIrDZAEjTjzDg==;24:0Q644HEok3dbnK+oP8EPKUYUo0NKt4p+hmdzUA8XyqaI5I1UJqRFePLcaffqrS4e+Bs1q6RE8DFh3KmRrsMX9bx1X9cUgRoolhWkR35iUtI=;7:JOnbR3+pLG8aw2j/vO3XuVBXEST5XKPo19hZllla6cwAPCzwWVzY3ueHzRKTKaH8R3JvFZGIaYovfjy5GSSnxpBa2YTivVz9YS2NE1vLbiveVcNSPFTuTWkvM0jffQQciPXnMWX8osd+S8MhrCFf5QahvWBkikDozA8Ugoe6TxTicdOcPAQShcSaQr5F2i9BK9tg46RxWir6MRaoxKooFnYV4LZwFIg2jbhZCDLBYRwRd6bokL4jiVPnIqCO3cMC x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0007; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:CS1PR84MB0007;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0007; x-forefront-prvs: 0025434D2D x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(7916002)(199003)(53824002)(24454002)(189002)(377424004)(305945005)(3846002)(6116002)(102836003)(99286002)(81156014)(105586002)(97736004)(87936001)(189998001)(54356999)(86362001)(77096005)(2906002)(586003)(103116003)(110136002)(2351001)(33646002)(15975445007)(2501003)(122556002)(68736007)(106116001)(4326007)(5002640100001)(5640700001)(36756003)(92566002)(50986999)(81166006)(101416001)(76176999)(7736002)(93886004)(3660700001)(2950100001)(8936002)(2900100001)(66066001)(3280700002)(19580395003)(8676002)(7846002)(1730700003)(106356001)(10400500002);DIR:OUT;SFP:1102;SCL:1;SRVR:CS1PR84MB0007;H:CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; received-spf: None (protection.outlook.com: hpe.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: hpe.com X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Aug 2016 15:18:14.8134 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0007 X-Barracuda-Connect: mail-sn1nam02on0133.outbound.protection.outlook.com[104.47.36.133] X-Barracuda-Start-Time: 1470410297 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3028 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header T24gRnJpLCAyMDE2LTA4LTA1IGF0IDIxOjI3ICsxMDAwLCBEYXZlIENoaW5uZXIgd3JvdGU6DQo+ IFsgY3V0IHRvIGp1c3QgdGhlIGltcG9ydGFudCBwb2ludHMgXQ0KPiBPbiBUaHUsIEF1ZyAwNCwg MjAxNiBhdCAwNjo0MDo0MlBNICswMDAwLCBLYW5pLCBUb3NoaW1pdHN1IHdyb3RlOg0KPiA+IA0K PiA+IE9uIFR1ZSwgMjAxNi0wOC0wMiBhdCAxMDoyMSArMTAwMCwgRGF2ZSBDaGlubmVyIHdyb3Rl Og0KPiA+ID4gDQo+ID4gPiBJZiBJIGRyb3AgdGhlIGZzeW5jIGZyb20gdGhlDQo+ID4gPiBidWZm ZXJlZCBJTyBwYXRoLCBiYW5kd2lkdGggcmVtYWlucyB0aGUgc2FtZSBidXQgcnVudGltZSBkcm9w cyB0bw0KPiA+ID4gMC41NS0wLjU3cywgc28gYWdhaW4gdGhlIGJ1ZmZlcmVkIElPIHdyaXRlIHBh dGggaXMgZmFzdGVyIHRoYW4gREFYDQo+ID4gPiB3aGlsZSBkb2luZyBtb3JlIHdvcmsuDQo+ID4N Cj4gPiBJIGRvIG5vdCB0aGluayB0aGUgdGVzdCByZXN1bHRzIGFyZSByZWxldmFudCBvbiB0aGlz IHBvaW50IGJlY2F1c2UgYm90aA0KPiA+IGJ1ZmZlcmVkIGFuZCBkYXggd3JpdGUoKSBwYXRocyB1 c2UgdW5jYWNoZWQgY29weSB0byBhdm9pZCBjbGZsdXNoLiDCoFRoZQ0KPiA+IGJ1ZmZlcmVkIHBh dGggdXNlcyBjYWNoZWQgY29weSB0byB0aGUgcGFnZSBjYWNoZSBhbmQgdGhlbiB1c2UgdW5jYWNo ZWQNCj4gPiBjb3B5IHRvIFBNRU0gdmlhIHdyaXRlYmFjay4gwqBUaGVyZWZvcmUsIHRoZSBidWZm ZXJlZCBJTyBwYXRoIGFsc28gYmVuZWZpdHMNCj4gPiBmcm9tIHVzaW5nIHVuY2FjaGVkIGNvcHkg dG8gYXZvaWQgY2xmbHVzaC4NCj4NCj4gRXhjZXB0IHRoYXQgSSB0ZXN0ZWQgd2l0aG91dCB0aGUg d3JpdGViYWNrIHBhdGggZm9yIGJ1ZmZlcmVkIElPLCBzbw0KPiB0aGVyZSB3YXMgYSBkaXJlY3Qg Y29tcGFyaXNvbiBmb3Igc2luZ2xlIGNhY2hlZCBjb3B5IHZzIHNpbmdsZQ0KPiB1bmNhY2hlZCBj b3B5Lg0KDQpJIGFncmVlIHRoYXQgdGhlIHJlc3VsdCBzaG93ZWQgYSB0ZW50YXRpdmUgY29tcGFy aXNvbiBmb3IgY2FjaGVkIGNvcHkgdnMNCnVuY2FjaGVkIGNvcHkuIMKgTXkgcG9pbnQsIGhvd2V2 ZXIsIGlzIHRoYXQgd3JpdGVzIHRvIFBNRU0gbmVlZCB0byBwZXJzaXN0DQp1bmxpa2UgdGhlIHBh Z2UgY2FjaGUuIMKgU28gZm9yIFBNRU0sIHRoZSBjb21wYXJpc29uIHNob3VsZCBiZSAoY2FjaGVk IGNvcHkgKw0KY2xmbHVzaCkgdnMgdW5jYWNoZWQgY29weS4NCg0KPiBUaGUgdW5kZW5pYWwgZmFj dCBpcyB0aGF0IGEgd3JpdGUoKSB3aXRoIGEgc2luZ2xlIGNhY2hlZCBjb3B5IHdpdGgNCj4gYWxs IHRoZSBvdmVyaGVhZCBvZiBkaXJ0eSBwYWdlIHRyYWNraW5nIGlzIC9mYXN0ZXIvIHRoYW4gYSBt dWNoDQo+IHNob3J0ZXIsIHNpbXBsZXIgSU8gcGF0aCB0aGF0IHVzZXMgYW4gdW5jYWNoZWQgY29w eS4gVGhhdCdzIHdoYXQgdGhlDQo+IG51bWJlcnMgc2F5Li4uLg0KDQpUaGlzIGNvc3QgZXZhbHVh dGlvbiBuZWVkcyB0byBpbmNsdWRlIHRoZSBjb3N0IG9mIGNsZmx1c2ggZm9yIGNhY2hlZCBjb3B5 Lg0KwqBBbHNvLCBwYWdlIGNhY2hlIGFsbG9jYXRpb24gdGVuZHMgdG8gYmUgZmFzdGVyIHRoYW4g ZGlzayBibG9jayBhbGxvY2F0aW9uLg0KDQo+ID4gDQo+ID4gQ2FjaGVkIGNvcHkgKHJlcSBtb3Zx KSBpcyBzbGlnaHRseSBmYXN0ZXIgdGhhbiB1bmNhY2hlZCBjb3B5LA0KPg0KPiBOb3QgYWNjb3Jk aW5nIHRvIEJvYXogLSBoZSBjbGFpbXMgdGhhdCB1bmNhY2hlZCBpcyAyMCUgZmFzdGVyIHRoYW4N Cj4gY2FjaGVkLiBIb3cgYWJvdXQgeW91IHR3byBnZXQgdG9nZXRoZXIsIGRvIHNvbWUgYmVuY2ht YXJraW5nIGFuZCBnZXQNCj4geW91ciBzdG9yeSBzdHJhaWdodCwgZWg/DQoNCkkgdmFndWVseSBy ZW1lbWJlciBzZWVpbmcgc3VjaCByZXN1bHRzLCBidXQgSSBtYXkgYmUgd3JvbmcgYWJvdXQgdGhh dC4gwqBIZXJlDQphcmUgcGVyZm9ybWFuY2UgdGVzdCByZXN1bHRzIFJvYmVydCBFbGxpb3R0IGNv bmR1Y3RlZCBiZWZvcmUuDQpodHRwczovL2xrbWwub3JnL2xrbWwvMjAxNS80LzIvNDUzDQoNClRv IHF1b3RlIHRoZSByZXN1bHRzIHJlbGV2YW50IHRvIHRoaXMgdG9waWM6DQoNCi0gQ2FjaGVkIGNv cHkJCQkyLjUgTQ0KLSBVbmNhY2hlZCBjb3B5IHcvwqBNT1ZOVEkJMi42IE0JDQotIFVuY2FjaGVk IGNvcHkgdy/CoE1PVk5URFEJMy41IE0NCg0KTm90ZSB0aGF0IHdlIHVzZSBNT1ZOVEkgdG9kYXks IG5vdCBNT1ZOVERRLiDCoFdlIGluc3RydW1lbnRlZCBhIE1PVk5URFEgY29weQ0KZnVuY3Rpb24g Zm9yIHRoaXMgdGVzdC4gwqBXZSBjYW4gZnVydGhlciBpbXByb3ZlIHRoZSBjb3B5IHBlcmZvcm1h bmNlIGJ5IHVzaW5nDQpNT1ZOVERRLg0KDQo+ID4gYW5kIHNob3VsZCBiZSB1c2VkIGZvciB3cml0 aW5nIHRvIHRoZSBwYWdlIGNhY2hlLiDCoEZvciB3cml0aW5nIHRvIFBNRU0sDQo+ID4gaG93ZXZl ciwgYWRkaXRpb25hbCBjbGZsdXNoIGNhbiBiZSBleHBlbnNpdmUsIGFuZCBhbGxvY2F0aW5nIGNh Y2hlbGluZXMNCj4gPiBmb3IgUE1FTSBsZWFkcyB0byBldmljdCBhcHBsaWNhdGlvbidzIGNhY2hl bGluZXMuDQo+DQo+IEkga2VlcCBoZWFyaW5nIHBlb3BsZSB0ZWxsIG1lIHdoeSBjYWNoZWQgY29w aWVzIGFyZSBzbG93ZXIsIGJ1dA0KPiBuby1vbmUgaXMgcHJvdmlkaW5nIG51bWJlcnMgdG8gYmFj ayB1cCB0aGVpciBzdGF0ZW1lbnRzLiBUaGUgb25seQ0KPiBudW1iZXJzIHdlIGhhdmUgYXJlIHRo ZSBvbmVzIEkndmUgcHVibGlzaGVkIHNob3dpbmcgY2FjaGVkIGNvcGllcyB3Lw0KPiBmdWxsIGRp cnR5IHRyYWNraW5nIGlzIGZhc3RlciB0aGFuIHVuY2FjaGVkIGNvcHkgdy9vIGRpcnR5IHRyYWNr aW5nLg0KPiANCj4gU2hvdyBtZSB0aGUgbnVtYmVycyB0aGF0IGJhY2sgdXAgeW91ciBzdGF0ZW1l bnRzLCB0aGVuIEknbGwgbGlzdGVuDQo+IHRvIHlvdS4NCg0KUGxlYXNlIHNlZSBhYm92ZS4gwqBD YWNoZWQgY29weSByZXF1aXJlcyBjbGZsdXNoIG9uIHRvcCBvZiB0aGF0Lg0KDQpUaGFua3MsDQot VG9zaGkNCg== From mfasheh@suse.de Fri Aug 5 13:36:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F332D7CB9 for ; Fri, 5 Aug 2016 13:36:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B3B208F804C for ; Fri, 5 Aug 2016 11:36:20 -0700 (PDT) X-ASG-Debug-ID: 1470422176-0bf57c13693f89c0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id QMYVbQNUW09p4HQu (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 05 Aug 2016 11:36:18 -0700 (PDT) X-Barracuda-Envelope-From: mfasheh@suse.de X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 0BD22AAF1; Fri, 5 Aug 2016 18:36:16 +0000 (UTC) Date: Fri, 5 Aug 2016 11:36:14 -0700 From: Mark Fasheh To: Dave Chinner Cc: "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160805183614.GL5316@wotan.suse.de> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support Reply-To: Mark Fasheh References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> <20160804235015.GC16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804235015.GC16044@dastard> Organization: SUSE Labs User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470422178 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4762 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31779 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Dave! On Fri, Aug 05, 2016 at 09:50:15AM +1000, Dave Chinner wrote: > On Thu, Aug 04, 2016 at 08:48:45AM -0700, Darrick J. Wong wrote: > > On Wed, Aug 03, 2016 at 07:18:52PM -0700, Mark Fasheh wrote: > > > On Wed, Aug 03, 2016 at 05:58:43PM -0700, Darrick J. Wong wrote: > > > > On Wed, Aug 03, 2016 at 01:55:20PM -0700, Darrick J. Wong wrote: > > > > > On Wed, Aug 03, 2016 at 12:45:36PM -0700, Mark Fasheh wrote: > > > > > > Where can I the patches to enable dedupe_range on xfs? I tested your > > > > > > previous devel branch based on Linux v4.7-rc3 with duperemove > > > > > > (https://github.com/markfasheh/duperemove) and it worked extremely well - > > > > > > even handling some cases that btrfs still has issues with. I actually > > > > > > committed the code to enable xfs support in duperemove so anyone can test on > > > > > > xfs with the dedupe_range patches. > > > > > > > > > > > > I'd gladly test your latest patches by doing my usual 'large' duperemove > > > > > > tests once I can get ahold of the dedupe_range work :) > > > > > > > > > > Your best bets are probably the -experimental trees: > > > > > https://github.com/djwong/linux/commits/djwong-experimental > > > > > https://github.com/djwong/xfsprogs/commits/djwong-experimental > > > > > > > > > > I haven't updated them in a while because I've been busy trying > > > > > to get reverse-mapping (the start of those patchbombs) into 4.8. > > > > > > > > > > Just as a warning, don't put anything critical on those XFS filesystems > > > > > because there's going to be a disk format update between now and the > > > > > next time I post the patches because Dave and I decided to cache the > > > > > block counts for the new btrees in order to speed up mounting. I don't > > > > > anticipate having time to clean up my dev tree and push to github until > > > > > a week or two after the merge window closes. > > > > > > > > That said, all the craziness from the last two weeks (xfs_scrub sprint > > > > and the rmapbt review fixes) are now in the -wtf tree, which /should/ > > > > behave. I've dumped everything there in completely not cleaned up > > > > format, but this does have the AGF btree block counter stuff I talked > > > > about above. > > > > > > > > https://github.com/djwong/linux/commits/djwong-wtf > > > > https://github.com/djwong/xfsprogs/commits/djwong-wtf > > > > > > Fantastic. Don't worry about corrupting data, I've been doing this long > > > enough to know to use this only on scratch partitions for now :) I'm in the > > > middle of a couple other tests but once I'm done there I'll grab those > > > branches and give them another spin. Typically I'm running through 800G-1TB > > > on these (with varying duplicated data percentages). > > > > > > Silly question which I could just answer by looking at the patches - are you > > > reporting FIEMAP_EXTENT_SHARED yet for extents with more than one owner? We > > > use that flag (by comparing SHARED bytes before and after dedupe) to give > > > people an estimate of how much space was saved. I presume figuring the > > > shared state of an extent would be as easy as querying the rmap btree, > > > correct? > > > > Yes, it should report FIEMAP_EXTENT_SHARED. In the past it would > > report exactly which parts of an extent were shared. If a file mapped > > blocks 30-40 and block 35 was shared, it would report 30-34, 35 > > (shared), and 36-40. However, btrfs only reports a single extent > > "30-40 (shared)" so I stopped doing that. > > I'd much prefer that fiemap gives exact information about shared > extents. FIEMAP is a diagnostic tool and as such we need it to > accurately reflect the exact extent map of the inode being queried > so we aren't mislead about the layout of the file during trouble > shooting. I disagree about fiemap being a diagnostic tool. I mean it's perfectly suitable for that task, but it has many uses outside of that. In duperemove at least it's used to do things like look for holes and detect already deduped extents (via physical offset). We also use EXTENT_SHARED to get a rough estimate of space savings though that can be done in better ways. It's a performance sensitive area too - there's currently bugs in btrfs regarding fiemap taking too long (and one is actually blocking a duperemove feature). Figuring EXTENT_SHARED for btrfs in particular is a very cpu intensive process. None of this is using fiemap to get physical access to an extent btw, which is what I think you're most concerned with? I totally agree about reporting EXTENT_SHARED as you want it to be. It would actually make some parts of duperemove more accurate. Thanks, --Mark -- Mark Fasheh From brian.boylston@hpe.com Fri Aug 5 14:58:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 426F17CB8 for ; Fri, 5 Aug 2016 14:58:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B974CAC008 for ; Fri, 5 Aug 2016 12:58:43 -0700 (PDT) X-ASG-Debug-ID: 1470427117-0bf8157e6c4f5770001-NocioJ Received: from NAM02-BL2-obe.outbound.protection.outlook.com (mail-bl2nam02on0101.outbound.protection.outlook.com [104.47.38.101]) by cuda.sgi.com with ESMTP id 1vmJdvrX4H44uB1l (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 05 Aug 2016 12:58:37 -0700 (PDT) X-Barracuda-Envelope-From: brian.boylston@hpe.com X-Barracuda-Effective-Source-IP: mail-bl2nam02on0101.outbound.protection.outlook.com[104.47.38.101] X-Barracuda-Apparent-Source-IP: 104.47.38.101 Received: from CS1PR84MB0119.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.22) by CS1PR84MB0120.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Fri, 5 Aug 2016 19:58:34 +0000 Received: from CS1PR84MB0119.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.22]) by CS1PR84MB0119.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.22]) with mapi id 15.01.0549.023; Fri, 5 Aug 2016 19:58:33 +0000 From: "Boylston, Brian" To: Dave Chinner , "Kani, Toshimitsu" CC: "jack@suse.cz" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" Subject: RE: Subtle races between DAX mmap fault and write path Thread-Topic: Subtle races between DAX mmap fault and write path X-ASG-Orig-Subj: RE: Subtle races between DAX mmap fault and write path Thread-Index: AQHR5/+Li+nlOcNCgEG+8bNAqRCshaAsxqeAgAATU4CAAKUNgIABMOkAgADPd4CAAJ7PgIADzJCAgADs7QCABFe2AIABGVaAgACChKA= Date: Fri, 5 Aug 2016 19:58:33 +0000 Message-ID: References: <20160727120745.GI6860@quack2.suse.cz> <20160727211039.GA20278@linux.intel.com> <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> In-Reply-To: <20160805112739.GG16044@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=brian.boylston@hpe.com; x-originating-ip: [71.71.19.4] x-ms-office365-filtering-correlation-id: 4af16f3d-cad6-4e60-9469-08d3bd6ae16e x-microsoft-exchange-diagnostics: 1;CS1PR84MB0120;6:SIizUt5I2pjlldNJFZSGpkEkJS9WkQhPlZTVGkNFMBlMAbEf+jcWa2BO4V0NdoqizqZHPv7Cagt/e4LMtMtGLIcWODwZo/rBb1hZvtwapK6+zMxNsYdrpN+toRpYdyAJQDduOb3oEh6BVFH9hif8JJGmgGiTd2nnbZmESzBFx+zeQZG087lW+RtjZ21aYcnLO2+TQOlvuVObfCe16mgHSk9iG0PYDA82uEv8TC3uHDeWyPXc7yOn/RVrbgC+zu01QT0wFeO/G5SaVAoamyGkaF2u8RvsK71b5iY0WDTZCHlI6umLse7b3mhl7G1isEF+L+4S/R4xzsuxCU2fVdLDoQ==;5:mxQy8Zk1eHK3EByoKBg+a5s9RIqyxjC8Gh8OukNJigdTwQqAUe50zZ1fH+ziGdFopr5oQ31WV/NoBhPbkHC1V0oF2KbZHJNCx/QFfrJ5rJLTgK1Hcbj2Uq+sGADTzATrxxVMtGvvUKvPYKDficJ0rw==;24:9Idx9wfl88P1YRgrApgB7AkgGJWXDjzZ1Bdh8Sg4EJcRpOkT1yZ5FZ0KAbDgmDavSlIfj1h9F3j3V8L4xB1UeG3QYsaE8QYe3Glnfyl38as=;7:A4lkmBQWHLsDAhjYED36q9A9XphxBJ6XE7Pozm7hIthpiVspgFczGyC04B13zjCR3zyyT+Rfila5JZk83JSql7v24pbjyouwjaI41E/QWlPIGxQnyrthG3rl+6IzP0+FM6i5vcOEhj1OhKZcy6biUxPeNmiLlUL/2p6/cq5AC4M89TuC5p06UE3T+5L3gC6Y7XDHCXAMtrVz/g/yjPrVMjH9UZiHar1hoenwhE660fbwOwoy/8RBzsneFOlx9CSR x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0120; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026);SRVR:CS1PR84MB0120;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0120; x-forefront-prvs: 0025434D2D x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(7916002)(199003)(189002)(24454002)(377424004)(53824002)(6116002)(7736002)(7696003)(106356001)(7846002)(586003)(87936001)(4326007)(33656002)(9686002)(305945005)(106116001)(77096005)(93886004)(3846002)(68736007)(2906002)(10400500002)(101416001)(99286002)(105586002)(8676002)(74316002)(66066001)(102836003)(3280700002)(86362001)(2950100001)(8936002)(2900100001)(5001770100001)(54356999)(189998001)(76176999)(92566002)(50986999)(81156014)(5002640100001)(3660700001)(122556002)(97736004)(81166006);DIR:OUT;SFP:1102;SCL:1;SRVR:CS1PR84MB0120;H:CS1PR84MB0119.NAMPRD84.PROD.OUTLOOK.COM;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; received-spf: None (protection.outlook.com: hpe.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: hpe.com X-MS-Exchange-CrossTenant-originalarrivaltime: 05 Aug 2016 19:58:33.3023 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0120 X-Barracuda-Connect: mail-bl2nam02on0101.outbound.protection.outlook.com[104.47.38.101] X-Barracuda-Start-Time: 1470427117 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5699 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Dave Chinner wrote on 2016-08-05: > [ cut to just the important points ] > On Thu, Aug 04, 2016 at 06:40:42PM +0000, Kani, Toshimitsu wrote: >> On Tue, 2016-08-02 at 10:21 +1000, Dave Chinner wrote: >>> If I drop the fsync from the >>> buffered IO path, bandwidth remains the same but runtime drops to >>> 0.55-0.57s, so again the buffered IO write path is faster than DAX >>> while doing more work. >>=20 >> I do not think the test results are relevant on this point because both >> buffered and dax write() paths use uncached copy to avoid clflush. =A0Th= e >> buffered path uses cached copy to the page cache and then use uncached c= opy to >> PMEM via writeback. =A0Therefore, the buffered IO path also benefits fro= m using >> uncached copy to avoid clflush. >=20 > Except that I tested without the writeback path for buffered IO, so > there was a direct comparison for single cached copy vs single > uncached copy. >=20 > The undenial fact is that a write() with a single cached copy with > all the overhead of dirty page tracking is /faster/ than a much > shorter, simpler IO path that uses an uncached copy. That's what the > numbers say.... >=20 >> Cached copy (req movq) is slightly faster than uncached copy, >=20 > Not according to Boaz - he claims that uncached is 20% faster than > cached. How about you two get together, do some benchmarking and get > your story straight, eh? >=20 >> and should be >> used for writing to the page cache. =A0For writing to PMEM, however, add= itional >> clflush can be expensive, and allocating cachelines for PMEM leads to ev= ict >> application's cachelines. >=20 > I keep hearing people tell me why cached copies are slower, but > no-one is providing numbers to back up their statements. The only > numbers we have are the ones I've published showing cached copies w/ > full dirty tracking is faster than uncached copy w/o dirty tracking. >=20 > Show me the numbers that back up your statements, then I'll listen > to you. Here are some numbers for a particular scenario, and the code is below. Time (in seconds) to copy a 16KiB buffer 1M times to a 4MiB NVDIMM buffer (1M total memcpy()s). For the cached+clflush case, the flushes are done every 4MiB (which seems slightly faster than flushing every 16KiB): NUMA local NUMA remote Cached+clflush 13.5 37.1 movnt 1.0 1.3=20 In the code below, pmem_persist() does the CLFLUSH(es) on the given range, and pmem_memcpy_persist() does non-temporal MOVs with an SFENCE: #include #include #include #include #include /* * gcc -Wall -O2 -m64 -mcx16 -o memcpyperf memcpyperf.c -lpmem * * Not sure if -mcx16 allows gcc to use faster memcpy bits? */ /* * our source buffer. we'll copy this much at a time. * align it so that memcpy() doesn't have to do anything funny. */ char __attribute__((aligned(0x100))) src[4 * 4096]; int main( int argc, char* argv[] ) { char* path; char mode; int nloops; char* dstbase; size_t dstsz; int ispmem; int cpysz; char* dst; if (argc !=3D 4) { fprintf(stderr, "ERROR: usage: " "memcpyperf [cached | nt] PATH NLOOPS\n"); exit(1); } mode =3D argv[1][0]; path =3D argv[2]; nloops =3D atoi(argv[3]); dstbase =3D pmem_map_file(path, 0, 0, 0, &dstsz, &ispmem); if (NULL =3D=3D dstbase) { perror(path); exit(1); } if (!ispmem) fprintf(stderr, "WARNING: %s is not pmem\n", path); if (dstsz < sizeof(src)) cpysz =3D dstsz; else cpysz =3D sizeof(src); fprintf(stderr, "INFO: dst %p src %p dstsz %ld cpysz %d\n", dstbase, src, dstsz, cpysz); dst =3D dstbase; while (nloops--) { if (mode =3D=3D 'c') { memcpy(dst, src, cpysz); /* * we could do the clflush here on the 16KiB we jus= t * wrote, but with a 4MiB file (dst buffer) and 16K= iB * src buffer, it seems slightly faster to flush th= e * entire 4MiB below */ //pmem_persist(dst, cpysz); } else { pmem_memcpy_persist(dst, src, cpysz); } dst +=3D cpysz; if ((dst + cpysz) - dstbase > dstsz) { dst =3D dstbase; /* see note above */ if (mode =3D=3D 'c') pmem_persist(dst, dstsz); } } exit(0); } /* main() */ EOF Sample runs: $ numactl -N0 time -p ./memcpyperf c /pmem0/brian/cpt 1000000 INFO: dst 0x7f3f1a000000 src 0x601200 dstsz 4194304 cpysz 16384 real 13.53 user 13.53 sys 0.00 $ numactl -N0 time -p ./memcpyperf n /pmem0/brian/cpt 1000000 INFO: dst 0x7f2b54600000 src 0x601200 dstsz 4194304 cpysz 16384 real 1.04 user 1.04 sys 0.00 $ numactl -N1 time -p ./memcpyperf c /pmem0/brian/cpt 1000000 INFO: dst 0x7f8f8c200000 src 0x601200 dstsz 4194304 cpysz 16384 real 37.13 user 37.15 sys 0.00 $ numactl -N1 time -p ./memcpyperf n /pmem0/brian/cpt 1000000 INFO: dst 0x7f77f7400000 src 0x601200 dstsz 4194304 cpysz 16384 real 1.24 user 1.24 sys 0.00 Brian From darrick.wong@oracle.com Fri Aug 5 15:22:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 904A47CB9 for ; Fri, 5 Aug 2016 15:22:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 621B58F8040 for ; Fri, 5 Aug 2016 13:22:08 -0700 (PDT) X-ASG-Debug-ID: 1470428525-0bf57c13693fb450001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Z3vrAAnXoXbTpKST (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 13:22:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u75KM4dO003541 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 5 Aug 2016 20:22:05 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u75KM4N6016013 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 5 Aug 2016 20:22:04 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u75KM4vJ021638; Fri, 5 Aug 2016 20:22:04 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 05 Aug 2016 13:22:03 -0700 Date: Fri, 5 Aug 2016 13:22:02 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs Subject: [PATCH] xfs: remove OWN_AG rmap when allocating a block from the AGFL Message-ID: <20160805202202.GJ25565@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs: remove OWN_AG rmap when allocating a block from the AGFL References: <20160805202104.GB8590@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805202104.GB8590@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470428526 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2213 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines [resend, cc list this time] I ftrace'd the rmap code while trying to repro the g/299 assert you saw. Eventually I got it to reproduce and it looks like a block would go onto the AGFL and we'd add an OWN_AG rmap for the block. ~20s later the block mysteriously ends up being mapped in a second time as some inode's BMBT block without the OWN_AG rmap being removed. So I looked around for anything that grabbed a block off the AGFL and noticed that the regular allocation function can do that if we get really tight on space. I also noticed that it doesn't remove the OWN_AG rmap, nor does it credit the per-AG reservation for the block it used. So here's a test patch that updates the rmap. (The per-AG stuff is in the reflink patchset so we don't need it here.) --- When we're really tight on space, xfs_alloc_ag_vextent_small() can allocate a block from the AGFL and give it to the caller. Since the caller is never the AGFL-fixing method, we must remove the OWN_AG reverse mapping because it will clash with whatever rmap the caller wants to set up. This bug was discovered by running generic/299 repeatedly. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index af1a72e..3dd8f1d 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -1582,6 +1582,7 @@ xfs_alloc_ag_vextent_small( xfs_extlen_t *flenp, /* result length */ int *stat) /* status: 0-freelist, 1-normal/none */ { + struct xfs_owner_info oinfo; int error; xfs_agblock_t fbno; xfs_extlen_t flen; @@ -1624,6 +1625,18 @@ xfs_alloc_ag_vextent_small( error0); args->wasfromfl = 1; trace_xfs_alloc_small_freelist(args); + + /* + * If we're feeding an AGFL block to something that + * doesn't live in the free space, we need to clear + * out the OWN_AG rmap. + */ + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG); + error = xfs_rmap_free(args->tp, args->agbp, args->agno, + fbno, 1, &oinfo); + if (error) + goto error0; + *stat = 0; return 0; } From david@fromorbit.com Fri Aug 5 17:26:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8AFB77CBC for ; Fri, 5 Aug 2016 17:26:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5D3B28F804B for ; Fri, 5 Aug 2016 15:26:32 -0700 (PDT) X-ASG-Debug-ID: 1470435989-0bf57b369b460630001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id DoB3KUJA9gmnn920 for ; Fri, 05 Aug 2016 15:26:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ap8PANsRpVd5LI7JIGdsb2JhbABdg0WBUoZynQwBAQEBAQEGjGGGD4QMhhcEAgKBP00BAQEBAQEHAQEBAQEBNwFAhF8BBTIBIyMQCAMOCgklDwUlAwcaE4gwwBsBAQgCJR6FRIUVihsBBJk1jn6BdYRbh1WBJ4wzg3eEYCoyh3ABAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Aug 2016 07:56:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVnZS-0005vG-W3; Sat, 06 Aug 2016 08:26:27 +1000 Date: Sat, 6 Aug 2016 08:26:26 +1000 From: Dave Chinner To: Artem Bityutskiy Cc: "Darrick J. Wong" , Mark Fasheh , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160805222626.GK16044@dastard> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> <20160804235015.GC16044@dastard> <1470380474.2311.71.camel@gmail.com> <20160805104950.GF16044@dastard> <1470398236.2311.89.camel@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1470398236.2311.89.camel@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470435989 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1680 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 05, 2016 at 02:57:16PM +0300, Artem Bityutskiy wrote: > On Fri, 2016-08-05 at 20:49 +1000, Dave Chinner wrote: > > On Fri, Aug 05, 2016 at 10:01:14AM +0300, Artem Bityutskiy wrote: > > > > > > On Fri, 2016-08-05 at 09:50 +1000, Dave Chinner wrote: > > > > > > > > I'd much prefer that fiemap gives exact information about shared > > > > extents. FIEMAP is a diagnostic tool and as such we need it to > > > > accurately reflect the exact extent map of the inode being > > > > queried > > > > so we aren't mislead about the layout of the file during trouble > > > > shooting. > > > > > > Hi Dave, you are right, and here is a side note:  we were using > > > FIEMAP > > > for optimizing image deployment in production, so it is a > > > diagnostic > > > tool and more. > > > > Yay, data corruption ahoy! > > > > Hasn't /anyone/ listened to the repeated statements from fs > > developers that FIEMAP is not a safe method of optimising data > > copying? > > Yes, which is kind of sad from the user's perspective. No, it's not. FIEMAP was not ever intended as a user facing tool. What is sad is that the application developers are not listening to what they are told. It's got to be almost 5 years ago we thought we put this to bed after a raft of "cp causing data corruption" bugs were reported by users and that was caused by new "FIEMAP optimised date copies". We implemented SEEK_DATA/SEEK_HOLE - which is coherent with page caceh state - to allow application developers to optimise their sparse data copies without having to scan data. Use that instead, please. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 5 17:39:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A6917CBE for ; Fri, 5 Aug 2016 17:39:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1E320AC006 for ; Fri, 5 Aug 2016 15:39:31 -0700 (PDT) X-ASG-Debug-ID: 1470436768-0bf8157e6b4fc900001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id AgpvZc0jEn3NM8Cj for ; Fri, 05 Aug 2016 15:39:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ap4PAB0VpVd5LI7JIGdsb2JhbABdg0WBUoZynQwBAQEBAQEGjGGGD4QMhhcEAgKBP00BAQEBAQEHAQEBAQEBNwFAhF8BBTocIxAIAw4KCSUPBSUDBxoTiDDAHAEBCAIlHoVEhRWKGwWZNY5+jiWBJ4wzg3eEYCoyh3ABAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Aug 2016 08:09:05 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVnlh-0005w5-9y; Sat, 06 Aug 2016 08:39:05 +1000 Date: Sat, 6 Aug 2016 08:39:05 +1000 From: Dave Chinner To: Mark Fasheh Cc: "Darrick J. Wong" , linux-fsdevel@vger.kernel.org, vishal.l.verma@intel.com, bfoster@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH v7 00/47] xfs: add reverse mapping support Message-ID: <20160805223905.GL16044@dastard> X-ASG-Orig-Subj: Re: [PATCH v7 00/47] xfs: add reverse mapping support References: <146907695530.25461.3225785294902719773.stgit@birch.djwong.org> <20160803194536.GJ5316@wotan.suse.de> <20160803205520.GQ8590@birch.djwong.org> <20160804005843.GJ8593@birch.djwong.org> <20160804021852.GK5316@wotan.suse.de> <20160804154845.GV8590@birch.djwong.org> <20160804235015.GC16044@dastard> <20160805183614.GL5316@wotan.suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805183614.GL5316@wotan.suse.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470436768 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2551 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 05, 2016 at 11:36:14AM -0700, Mark Fasheh wrote: > On Fri, Aug 05, 2016 at 09:50:15AM +1000, Dave Chinner wrote: > > I'd much prefer that fiemap gives exact information about shared > > extents. FIEMAP is a diagnostic tool and as such we need it to > > accurately reflect the exact extent map of the inode being queried > > so we aren't mislead about the layout of the file during trouble > > shooting. > > I disagree about fiemap being a diagnostic tool. I mean it's perfectly > suitable for that task, but it has many uses outside of that. > > In duperemove at least it's used to do things like look for holes and detect > already deduped extents (via physical offset). We also use EXTENT_SHARED to > get a rough estimate of space savings though that can be done in better > ways. It's a performance sensitive area too - there's currently bugs in > btrfs regarding fiemap taking too long (and one is actually blocking a > duperemove feature). Figuring EXTENT_SHARED for btrfs in particular is a > very cpu intensive process. > > None of this is using fiemap to get physical access to an extent btw, which > is what I think you're most concerned with? No, I'm talking about the fact that FIEMAP does not reflect the current state of data in the file. e.g. there can be dirty data in the page cache over a range, but FIEMAP will report that as unwritten. If you optimise the copy to preallocate unwritten regions rahter than copy them, then you will not copy the active data and the destination will be corrupt. IOWs, it is safe to use as a query tool as long as the operations that follow have their own data integrity guarantees, such as a duperemove operation. It stands alone without the need for FIEMAP - FIEMAP is just used to optimise the search for candidate blocks, and if FIEMAP is wrong then it doesn't affect the data in the file at all - duperemove just does nothing. The problem comes when the output of FIEMAP is used to determine ranges for data accessi and retreival (e.g. sparse copies) - in these cases the output of FIEMAP is incorrect and live data is going to be missed. cp doesn't verify the data it copied to guarantee the destination is identical to the source, so it's going to sliently generate corrupt copies when these coherency problems occur. This is what makes FIEMAP a diagnostic tool - you cannot rely on the output to be valid and correct for followup operations based on that information. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 5 17:44:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E994D7CBE for ; Fri, 5 Aug 2016 17:44:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A92378F804B for ; Fri, 5 Aug 2016 15:44:43 -0700 (PDT) X-ASG-Debug-ID: 1470437080-0bf57b369c460ad0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id kBZLfvwbM6mXpSfZ for ; Fri, 05 Aug 2016 15:44:40 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjoQAFIWpVd5LI7JIGdsb2JhbABdg0WBUoZynQwBAQEBAQEGjGGGD4QMhhcCAgEBAoE/TQEBAQEBAQcBAQEBAQE3AUCEXwEFOhwjEAgDGAklDwUlAwcaE4gwwBwBCwEkHoVEhRWKGwWOF4sejn6PTEiLa4N3gmYcgV4qModwAQEB Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Aug 2016 08:14:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVnr5-0005wW-5I; Sat, 06 Aug 2016 08:44:39 +1000 Date: Sat, 6 Aug 2016 08:44:39 +1000 From: Dave Chinner To: Felix Janda Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160805224439.GM16044@dastard> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> <20160804004747.GZ16044@dastard> <20160805080241.GA749@nyan> <20160805115239.GH16044@dastard> <20160805130905.GA321@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805130905.GA321@nyan> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470437080 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2713 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 05, 2016 at 03:09:05PM +0200, Felix Janda wrote: > Dave Chinner wrote: > > On Fri, Aug 05, 2016 at 10:02:41AM +0200, Felix Janda wrote: > > > Dave Chinner wrote: > > > > On Mon, Aug 01, 2016 at 08:54:10AM +0200, Felix Janda wrote: > > > > > Christoph Hellwig wrote: > > > > > > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > > > > > > int64_t is guaranteed to have the correct size and signedness and is > > > > > > > always avaible because linux.h has a include. > > > > > > > > > > > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > > > > > > public header is included without _LARGEFILE64_SOURCE or > > > > > > > _GNU_SOURCE defined. This bug was introduced in commit > > > > > > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > > > > > > > > > > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. > > > > > > > > > > Thanks for the suggestion, but that does not work if the system header > > > > > defining (or not) off64_t is included before the xfs headers. > > > > > > > > Which, to me, is a build bug in whatever code is including the xfs > > > > headers. Isn't it the responsibility of the build environment to > > > > ensure the dependencies of the libraries being used are correctly > > > > met? > > > > > > Every program using the xfs header is supposed to know that (only on > > > linux) since commit cb898f157f8410a03cf5f3400baa1df9e5eecd33 it is > > > necessary to define _LARGEFILE64_SOURCE or _GNU_SOURCE? > > > > Which, I'd say, most already do, because anything trying to use XFS > > ioctls needs to be 64 bit offset clean, even on 32 bit systems. I > > don't see any problem with requiring it when including a header > > that exposes ioctl interfaces with 64 bit file size/offset fields > > in them.... > > The easiest way to be 64bit clean is to use _FILEOFFSET_BITS=64. Then > off_t is 64bit on all architectures and it is impossible to use 32bit > interfaces. However the type off64_t will still not be defined... > > (On the other hand, when just using _LARGEFILE64_SOURCE it is still > easy to mix 32 and 64bit interfaces.) Which, with library code, we are likely to see applications using. If you want to clean this up, then remove the dependence on _LARGEFILE64_SOURCE in the entire xfsprogs code base (e.g. it uses lseek64 everywhere which requires off64_t to be defined) and instead make it dependent on _FILEOFFSET_BITS=64. Then you can get rid of all the uses of off64_t completely, and we can break the build if _FILEOFFSET_BITS != 64 on inclusion of xfs.h. Cheers, Dave. -- Dave Chinner david@fromorbit.com From INFO@GOOGLE.COM Fri Aug 5 18:18:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2B99D7CCB for ; Fri, 5 Aug 2016 18:18:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E4CE58F804B for ; Fri, 5 Aug 2016 16:18:12 -0700 (PDT) X-ASG-Debug-ID: 1470439087-0bf8157e6c4fdc50001-NocioJ Received: from relay.iimk.ac.in (dspace.iimk.ac.in [210.212.226.69]) by cuda.sgi.com with ESMTP id nNUd7QwhWLqfeQS5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 05 Aug 2016 16:18:10 -0700 (PDT) X-Barracuda-Envelope-From: INFO@GOOGLE.COM X-Barracuda-Effective-Source-IP: dspace.iimk.ac.in[210.212.226.69] X-Barracuda-Apparent-Source-IP: 210.212.226.69 Received: from mail.iimk.ac.in (unknown [172.20.1.60]) by relay.iimk.ac.in (Postfix) with ESMTP id 8AF0142574E; Sat, 6 Aug 2016 02:42:19 +0530 (IST) Received: from [100.90.47.51] (unknown [115.184.27.194]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.iimk.ac.in (Postfix) with ESMTPSA id 84388284B9D; Sat, 6 Aug 2016 04:05:46 +0530 (IST) Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: Warning Message From Administration Office To: Recipients X-ASG-Orig-Subj: Warning Message From Administration Office From: INFO@GOOGLE.COM Date: Sat, 06 Aug 2016 02:56:19 +0530 Reply-To: Administrationcenter@webmail.cd X-Barracuda-Connect: dspace.iimk.ac.in[210.212.226.69] X-Barracuda-Start-Time: 1470439089 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 0 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MISSING_MID, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Message-Id: <20160805231812.7D8A8D80076@cuda.sgi.com> Your Mailbox has reached your limit quota, You might not be able to send or= get updates until you re-validate your mailbox. To re-validate your mailbox fill your info. {user-name : {Password : {Confirm Password : Technical Support 10.92.79.41.82??? From david@fromorbit.com Fri Aug 5 18:33:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2B6217CCB for ; Fri, 5 Aug 2016 18:33:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 887ECAC001 for ; Fri, 5 Aug 2016 16:33:02 -0700 (PDT) X-ASG-Debug-ID: 1470439978-0bf57b369d461ad0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id S9rfUDm9c4WRnHHS for ; Fri, 05 Aug 2016 16:32:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ap8PABEhpVd5LI7JIGdsb2JhbABdg0VWfIZynQwBAQEBAQEGjGGGD4QMHIV7BAKBPU0BAQEBAQEHAQEBAQEBNwFAhQwTHCMYJDQFJQMHLYgwwBwBCyUehUSJJxEBg0iCLwWIJZEQhh2IYYF1jVUChmSFT4N3hGAqMoYrDxcEgRsBAQE Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Aug 2016 09:02:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bVobo-00061N-F4; Sat, 06 Aug 2016 09:32:56 +1000 Date: Sat, 6 Aug 2016 09:32:56 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: [GIT PULL] xfs: reverse mapping support for 4.8-rc1 Message-ID: <20160805233256.GA19025@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: reverse mapping support for 4.8-rc1 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470439978 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11149 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31784 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, This is the second part of the XFS updates for this merge cycle. This pullreq contains the new reverse block mapping feature for XFS, and can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git tags/xfs-rmap-for-linus-4.8-rc1 The full request-pull output is at the bottom of this email. I'm later with the pullreq than I wanted to be because of a few late review issues that were spotted and needed fixing. The result of this is that the entire series of commits are new - I had to remove a couple of patches from the start of the series (they went to Al instead) and so everything effectively rebased. Because everything rebased, I cleaned up all the commit messages and tagged them appropriately, but otherwise left the code unchanged. Fixes from reviews were appended as the last few commits rather than merging them back in the original commits. Given this, I'll be up front and state that I think asking you to pull this is clearly trying to bend the rules a bit. However, it has been in linux-next for two days now and there's been no reports of build failures or regressions, so I think it is OK from a build persepective. For existing users, I've done a substantial amount of testing over the past 3-4 weeks and existing filesystems show no functional or performance regressions. Hence I think there is minimal risk for developers and existing users in merging this now. I will, however, leave the final determination to your judgement - if you have any problems with the code or reservations about what has been done so far, we can leave merging it to the next cycle. If you do merge it, then there will be a follow-up bug fix pullreq in the next week or two - we have a couple of regression fixes from the first pullreq being tested right now, and there will be more fixes for the new rmap code as we shake it out. Overall, however, it's looking pretty solid. What it is: Reverse mapping allows us to track the owner of a specific block on disk precisely. It is implemented as a set of btrees (one per allocation group) that track the owners of allocated extents. Effectively it is a "used space tree" that is updated when we allocate or free extents. i.e. it is coherent with the free space btrees we already maintain and never overlaps with them. This reverse mapping infrastructure is the building block of several upcoming features - reflink, copy-on-write data, dedupe, online metadata and data scrubbing, highly accurate bad sector/data loss reporting to users, and significantly improved reconstruction of damaged and corrupted filesystems. There's a lot of new stuff coming along in the next couple of cycles,a nd it all builds in the rmap infrastructure. As such, it's a huge chunk of new code with new on-disk format features and internal infrastructure. It warns at mount time as an experimental feature and that it may eat data (as we do with all new on-disk features until they stabilise). We have not released userspace suport for it yet - userspace support currently requires download from Darrick's xfsprogs repo and build from source, so the access to this feature is really developer/tester only at this point. Initial userspace support will be released at the same time kernel with this code in it is released. The new rmap enabled code regresses 3 xfstests - all are ENOSPC related corner cases, one of which Darrick posted a fix for a few hours ago. The other two are fixed by infrastructure that is part of the upcoming reflink patchset. This new ENOSPC infrastructure requires a on-disk format tweak required to keep mount times in check - we need to keep an on-disk count of allocated rmapbt blocks so we don't have to scan the entire btrees at mount time to count them. This is currently being tested and will be part of the fixes sent in the next week or two so users will not be exposed to this change. -Dave. The following changes since commit f2bdfda9a1c668539bc85baf5625f6f14bc510b1: Merge branch 'xfs-4.8-misc-fixes-4' into for-next (2016-07-22 14:10:56 +1000) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git tags/xfs-rmap-for-linus-4.8-rc1 for you to fetch changes up to 3481b68285238054be519ad0c8cad5cc2425e26c: xfs: move (and rename) the deferred bmap-free tracepoints (2016-08-03 12:31:07 +1000) ---------------------------------------------------------------- xfs: reverse block mapping support for 4.8-rc1 ---------------------------------------------------------------- Darrick J. Wong (52): xfs: in _attrlist_by_handle, copy the cursor back to userspace xfs: fix attr shortform structure alignment on cris xfs: fix locking of the rt bitmap/summary inodes xfs: set *stat=1 after iroot realloc xfs: during btree split, save new block key & ptr for future insertion xfs: add function pointers for get/update keys to the btree xfs: support btrees with overlapping intervals for keys xfs: introduce interval queries on btrees xfs: refactor btree owner change into a separate visit-blocks function xfs: move deferred operations into a separate file xfs: add tracepoints for the deferred ops mechanism xfs: clean up typedef usage in the EFI/EFD handling code xfs: enable the xfs_defer mechanism to process extents to free xfs: rework xfs_bmap_free callers to use xfs_defer_ops xfs: change xfs_bmap_{finish,cancel,init,free} -> xfs_defer_* xfs: rename flist/free_list to dfops xfs: refactor redo intent item processing xfs: add tracepoints and error injection for deferred extent freeing xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt xfs: introduce rmap btree definitions xfs: add rmap btree stats infrastructure xfs: rmap btree add more reserved blocks xfs: add owner field to extent allocation and freeing xfs: introduce rmap extent operation stubs xfs: define the on-disk rmap btree format xfs: add rmap btree growfs support xfs: rmap btree transaction reservations xfs: rmap btree requires more reserved free space xfs: add rmap btree operations xfs: support overlapping intervals in the rmap btree xfs: teach rmapbt to support interval queries xfs: add tracepoints for the rmap functions xfs: add an extent to the rmap btree xfs: remove an extent from the rmap btree xfs: convert unwritten status of reverse mappings xfs: add rmap btree insert and delete helpers xfs: create rmap update intent log items xfs: log rmap intent items xfs: enable the xfs_defer mechanism to process rmaps to update xfs: propagate bmap updates to rmapbt xfs: add rmap btree geometry feature flag xfs: add rmap btree block detection to log recovery xfs: disable XFS_IOC_SWAPEXT when rmap btree is enabled xfs: don't update rmapbt when fixing agfl xfs: enable the rmap btree functionality xfs: remove the get*keys and update_keys btree ops pointers xfs: remove unnecesary lshift/rshift key initialization xfs: in btree_lshift, only allocate temporary cursor when needed xfs: remove the extents array from the rmap update done log item xfs: remove unnecessary parentheses from log redo item recovery functions xfs: collapse single use static functions xfs: move (and rename) the deferred bmap-free tracepoints fs/xfs/Makefile | 5 + fs/xfs/libxfs/xfs_alloc.c | 149 +++- fs/xfs/libxfs/xfs_alloc.h | 52 +- fs/xfs/libxfs/xfs_alloc_btree.c | 12 - fs/xfs/libxfs/xfs_attr.c | 71 +- fs/xfs/libxfs/xfs_attr_leaf.c | 4 +- fs/xfs/libxfs/xfs_attr_remote.c | 19 +- fs/xfs/libxfs/xfs_bmap.c | 241 ++++--- fs/xfs/libxfs/xfs_bmap.h | 54 +- fs/xfs/libxfs/xfs_bmap_btree.c | 32 +- fs/xfs/libxfs/xfs_btree.c | 914 +++++++++++++++++++++---- fs/xfs/libxfs/xfs_btree.h | 88 ++- fs/xfs/libxfs/xfs_da_btree.c | 6 +- fs/xfs/libxfs/xfs_da_btree.h | 4 +- fs/xfs/libxfs/xfs_da_format.h | 1 + fs/xfs/libxfs/xfs_defer.c | 463 +++++++++++++ fs/xfs/libxfs/xfs_defer.h | 97 +++ fs/xfs/libxfs/xfs_dir2.c | 15 +- fs/xfs/libxfs/xfs_dir2.h | 8 +- fs/xfs/libxfs/xfs_format.h | 131 +++- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/libxfs/xfs_ialloc.c | 23 +- fs/xfs/libxfs/xfs_ialloc.h | 2 +- fs/xfs/libxfs/xfs_ialloc_btree.c | 18 +- fs/xfs/libxfs/xfs_inode_buf.c | 1 + fs/xfs/libxfs/xfs_log_format.h | 63 +- fs/xfs/libxfs/xfs_rmap.c | 1399 ++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap.h | 209 ++++++ fs/xfs/libxfs/xfs_rmap_btree.c | 511 ++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.h | 61 ++ fs/xfs/libxfs/xfs_sb.c | 9 + fs/xfs/libxfs/xfs_shared.h | 2 + fs/xfs/libxfs/xfs_trans_resv.c | 62 +- fs/xfs/libxfs/xfs_trans_resv.h | 10 - fs/xfs/libxfs/xfs_types.h | 4 +- fs/xfs/xfs_bmap_util.c | 139 +--- fs/xfs/xfs_bmap_util.h | 4 +- fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_dquot.c | 13 +- fs/xfs/xfs_error.h | 6 +- fs/xfs/xfs_extfree_item.c | 69 ++ fs/xfs/xfs_extfree_item.h | 3 + fs/xfs/xfs_filestream.c | 3 +- fs/xfs/xfs_fsops.c | 106 ++- fs/xfs/xfs_inode.c | 99 +-- fs/xfs/xfs_inode.h | 4 +- fs/xfs/xfs_ioctl.c | 6 + fs/xfs/xfs_iomap.c | 31 +- fs/xfs/xfs_log_recover.c | 336 ++++++--- fs/xfs/xfs_mount.c | 7 +- fs/xfs/xfs_mount.h | 6 + fs/xfs/xfs_ondisk.h | 3 + fs/xfs/xfs_rmap_item.c | 536 +++++++++++++++ fs/xfs/xfs_rmap_item.h | 95 +++ fs/xfs/xfs_rtalloc.c | 11 +- fs/xfs/xfs_stats.c | 1 + fs/xfs/xfs_stats.h | 18 +- fs/xfs/xfs_super.c | 30 +- fs/xfs/xfs_symlink.c | 25 +- fs/xfs/xfs_trace.c | 2 + fs/xfs/xfs_trace.h | 374 ++++++++++ fs/xfs/xfs_trans.h | 26 +- fs/xfs/xfs_trans_extfree.c | 215 ++++-- fs/xfs/xfs_trans_rmap.c | 271 ++++++++ 64 files changed, 6267 insertions(+), 915 deletions(-) create mode 100644 fs/xfs/libxfs/xfs_defer.c create mode 100644 fs/xfs/libxfs/xfs_defer.h create mode 100644 fs/xfs/libxfs/xfs_rmap.c create mode 100644 fs/xfs/libxfs/xfs_rmap.h create mode 100644 fs/xfs/libxfs/xfs_rmap_btree.c create mode 100644 fs/xfs/libxfs/xfs_rmap_btree.h create mode 100644 fs/xfs/xfs_rmap_item.c create mode 100644 fs/xfs/xfs_rmap_item.h create mode 100644 fs/xfs/xfs_trans_rmap.c -- Dave Chinner david@fromorbit.com From info35@whxcircuit.com Fri Aug 5 22:28:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 283977CCC for ; Fri, 5 Aug 2016 22:28:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D319B304048 for ; Fri, 5 Aug 2016 20:28:25 -0700 (PDT) X-ASG-Debug-ID: 1470454097-0bf8157e6c506150001-NocioJ Received: from whxcircuit.com ([14.20.104.225]) by cuda.sgi.com with SMTP id n5eu9isn7kJMQyoU for ; Fri, 05 Aug 2016 20:28:18 -0700 (PDT) X-Barracuda-Envelope-From: info35@whxcircuit.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.20.104.225] X-Barracuda-Apparent-Source-IP: 14.20.104.225 Sender: info35@whxcircuit.com Received: from PC-20140110XVSO[127.0.0.1] by PC-20140110XVSO[127.0.0.1] (SMTPD32); Sat, 6 Aug 2016 11:24:03 +0800 From: "market2@hqtcircuit.com" Subject: Re: PCB of IPC Class III To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: PCB of IPC Class III MIME-Version: 1.0 Reply-To: market2@hqtcircuit.com Date: Sat, 6 Aug 2016 11:24:03 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.20.104.225] X-Barracuda-Start-Time: 1470454098 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3562 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31788 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160806032825.89D7FD80077@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC42MDAxLjIzNTg4Ij48L0hFQUQ+DQo8Qk9EWT4NCjxESVY+DQo8RElWPg0KPERJ ViBzdHlsZT0iRk9OVC1TSVpFOiAxMXB0Ij4NCjxESVY+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVNJWkU6IDEycHQ7 IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICYj Mzk7QEFyaWFsIFVuaWNvZGUgTVMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDEuMDAwMHB0Ij4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8RElWPg0K PERJVj4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8 RElWPkhpLCZuYnNwO0ZyaWVuZCwmbmJzcDsmbmJzcDsmbmJzcDs8L0RJVj4NCjxESVY+SXQmIzM5 O3MmbmJzcDthJm5ic3A7d29uZGVyJm5ic3A7dG8mbmJzcDttZWV0Jm5ic3A7eW91ISZuYnNwOzwv RElWPg0KPERJVj5JJiMzOTttIEphY2ssIGZvcmllZ24gdHJhZGUgc2FsZXNtYW4gb2YgSFFUIGNp cmN1aXQuPC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj5XZSZuYnNwO21ha2UmbmJzcDsy LTI2Jm5ic3A7bGF5ZXJzJm5ic3A7UENCLFBDQiZuYnNwO2Fzc2VtYmx5LiANCjxESVYgc3R5bGU9 IkZPTlQtV0VJR0hUOiBib2xkIj48Rk9OVCANCmZhY2U9IlRpbWVzIE5ldyBSb21hbiI+QXNwZWN0 Jm5ic3A7cmF0aW86Jm5ic3A7MTQ6MSxNaW4uIA0KTGluZSZuYnNwO3dpZHRoL3NwYWNlOiZuYnNw OzIuNW1pbCxFeHRlcm5hbCZuYnNwO2NvcHBlcjombmJzcDsxNk9aLjwvRk9OVD48L0RJVj5XZSZu YnNwO2FyZSZuYnNwO2FwcHJvdmVkJm5ic3A7YnkmbmJzcDtJU08tOTAwMSwmbmJzcDtJU08xNDAw MCxVTCZuYnNwO2FuZCZuYnNwO1JvSFMuJm5ic3A7PC9ESVY+DQo8RElWPldlJm5ic3A7aGF2ZSZu YnNwOzIwOCZuYnNwO3dlbGwtdHJhaW5lZCZuYnNwO3dvcmtlcnMmbmJzcDthbmQmbmJzcDs2Jm5i c3A7eWVhcnMmbmJzcDtoaXN0b3J5LiZuYnNwOzwvRElWPg0KPERJVj4mbmJzcDs8L0RJVj4NCjxE SVY+T3VyJm5ic3A7cHJvZHVjdHMmbmJzcDthcmUmbmJzcDtleHBvcnRlZCZuYnNwO3RvJm5ic3A7 RXVyb3BlLEFtZXJpY2EsJm5ic3A7Q2FuYWRhLCZuYnNwO0JyYXppbCwmbmJzcDtBdXN0cmFsaWEs Jm5ic3A7U291dGgmbmJzcDtBZnJpY2EsJm5ic3A7SW5kaWEsJm5ic3A7TWlkZGxlJm5ic3A7RWFz dCZuYnNwO2FuZCZuYnNwO3NvJm5ic3A7b24uJm5ic3A7Jm5ic3A7PC9ESVY+DQo8RElWPiZuYnNw OzwvRElWPjwvRElWPjwvRElWPg0KPERJVj48L1NQQU4+PC9TUEFOPjxGT05UIHNpemU9Mz4NCjxI UiBzdHlsZT0iV0lEVEg6IDIxMHB4OyBIRUlHSFQ6IDFweCIgYWxpZ249bGVmdCBjb2xvcj0jYjVj NGRmIFNJWkU9MT4NCjwvRk9OVD48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48 L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj48L0RJVj4NCjxE SVY+PFNQQU4gaWQ9X0ZveEZST01OQU1FPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDlrovk vZM7IENPTE9SOiAjMDAwMDAwOyBGT05ULVNJWkU6IDEwLjVwdCI+DQo8RElWIHN0eWxlPSJGT05U LVNJWkU6IDEwcHQiPg0KPERJViBzdHlsZT0iTElORS1IRUlHSFQ6IDIxcHg7IEZPTlQtRkFNSUxZ OiBUYWhvbWE7IEZPTlQtU0laRTogMTRweCI+DQo8RElWIHN0eWxlPSJMSU5FLUhFSUdIVDogMjFw eDsgRk9OVC1GQU1JTFk6IFRhaG9tYTsgRk9OVC1TSVpFOiAxNHB4Ij4NCjxESVYgc3R5bGU9IkxJ TkUtSEVJR0hUOiAyMXB4OyBGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDE0cHgiPg0K PERJViANCnN0eWxlPSJGT05ULUZBTUlMWTogVGltZXMgTmV3IFJvbWFuOyBGT05ULVNJWkU6IDEy cHQiPldlbGNvbWUmbmJzcDt5b3VyJm5ic3A7aW5xdWlyeSEmbmJzcDsmbmJzcDsmbmJzcDs8L0RJ Vj4NCjxESVYgDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRpbWVzIE5ldyBSb21hbjsgRk9OVC1TSVpF OiAxMnB0Ij5UaGFua3MmbmJzcDsmYW1wOyZuYnNwO1JlZ2FyZHMmbmJzcDsmbmJzcDs8L0RJVj4N CjxESVYgDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRpbWVzIE5ldyBSb21hbjsgRk9OVC1TSVpFOiAx MnB0OyBGT05ULVdFSUdIVDogYm9sZCI+SmFjayANClBlbmcgPEJSPkZvcmllZ24gdHJhZGUgc2Fs ZXNtYW4gPC9ESVY+DQo8RElWIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUaW1lcyBOZXcgUm9tYW47 IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IGJvbGQiPkhRVCZuYnNwO0NpcmN1aXQmbmJz cDsoc2hlbnpoZW4pJm5ic3A7TGltaXRlZCZuYnNwOzwvRElWPg0KPERJViANCnN0eWxlPSJGT05U LUZBTUlMWTogVGltZXMgTmV3IFJvbWFuOyBGT05ULVNJWkU6IDEycHQiPkFkZDombmJzcDtSb29t Jm5ic3A7Tm8uJm5ic3A7MjE1LCZuYnNwO1poaWZ1Jm5ic3A7QnVpbGRpbmcsJm5ic3A7UGVuZ2Rh Jm5ic3A7Um9hZCwmbmJzcDs8L0RJVj4NCjxESVYgDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRpbWVz IE5ldyBSb21hbjsgRk9OVC1TSVpFOiAxMnB0Ij5Mb25nZ2FuZyZuYnNwO0Rpc3RyaWN0LCZuYnNw O1NoZW56aGVuLENoaW5hLiZuYnNwOzwvRElWPg0KPERJViANCnN0eWxlPSJGT05ULUZBTUlMWTog VGltZXMgTmV3IFJvbWFuOyBGT05ULVNJWkU6IDEycHQiPk1vYmlsZTowMDg2Jm5ic3A7MTg2MjAz NDMxMTkmbmJzcDs8L0RJVj4NCjxESVYgDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRpbWVzIE5ldyBS b21hbjsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogYm9sZCI+V2hhdHNBcHA6Jm5ic3A7 MDA4NiZuYnNwOzE4NjIwMzQzMTE5PC9ESVY+DQo8RElWIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBU aW1lcyBOZXcgUm9tYW47IEZPTlQtU0laRTogMTJwdCI+VGVsOiZuYnNwOzAwODYmbmJzcDs3NTUm bmJzcDs4NDMyMDg0MyZuYnNwOzwvRElWPg0KPERJViANCnN0eWxlPSJGT05ULUZBTUlMWTogVGlt ZXMgTmV3IFJvbWFuOyBGT05ULVNJWkU6IDEycHQiPkZheDombmJzcDswMDg2Jm5ic3A7NzU1Jm5i c3A7ODM0MjI5OTA8L0RJVj48L1NQQU4+PC9TUEFOPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwv RElWPjwvRElWPjwvQk9EWT48L0hUTUw+DQoNCg== From sales03@topa.site Fri Aug 5 23:56:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=DEAR_FRIEND,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A72BB7CCE for ; Fri, 5 Aug 2016 23:56:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 005C5AC005 for ; Fri, 5 Aug 2016 21:56:33 -0700 (PDT) X-ASG-Debug-ID: 1470459389-0bf57c136a403ed0001-NocioJ Received: from server1.topa.site (host12.dfhgjhhh.com [47.88.15.216]) by cuda.sgi.com with ESMTP id 1bx6zjOoHNkngo0P for ; Fri, 05 Aug 2016 21:56:30 -0700 (PDT) X-Barracuda-Envelope-From: sales03@topa.site X-Barracuda-Effective-Source-IP: host12.dfhgjhhh.com[47.88.15.216] X-Barracuda-Apparent-Source-IP: 47.88.15.216 Received: from PC-201102141339 (218.18.170.84) by server1.topa.site id hklmvs0e97c9 for ; Sat, 6 Aug 2016 12:56:29 +0800 (envelope-from ) From: "hongmypcb1@126.com" Subject: RE: MCPCB and PCB company Hongmy Shenzhen To: xfs@oss.sgi.com X-ASG-Orig-Subj: RE: MCPCB and PCB company Hongmy Shenzhen MIME-Version: 1.0 Sender: sales03@topa.site Reply-To: hongmypcb1@126.com Date: Sat, 6 Aug 2016 12:56:29 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: host12.dfhgjhhh.com[47.88.15.216] X-Barracuda-Start-Time: 1470459390 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11147 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.14 X-Barracuda-Spam-Status: No, SCORE=1.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DEAR_FRIEND, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31789 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 1.00 DEAR_FRIEND BODY: Dear Friend? That's not very dear! 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20160806045633.4CB2A1940065@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8geG1sbnM6byA9ICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29t Om9mZmljZTpvZmZpY2UiPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1jb250ZW50LXR5cGUgY29u dGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4NCjxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2 LjAwLjI5MDAuNjU1MCIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPg0KPEJPRFk+DQo8UCBjbGFzcz1N c29Ob3JtYWwgDQpzdHlsZT0iTUFSR0lOOiAwcHQ7IFRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09M T1I6IHJnYigwLDY0LDEyOCk7IEZPTlQtRkFNSUxZOiBBcmlhbDsgbXNvLXNwYWNlcnVuOiAmIzM5 O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJu aW5nOiAwLjAwMDBwdCI+RGVhciANCkZyaWVuZCw8L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIA0Kc3R5bGU9Ik1BUkdJTjogMHB0OyBURVhULUFMSUdOOiBsZWZ0OyBtc28tcGFnaW5hdGlv bjogd2lkb3ctb3JwaGFuIj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IENPTE9SOiBy Z2IoMCw2NCwxMjgpOyBGT05ULUZBTUlMWTogQXJpYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzog MC4wMDAwcHQiPjwvU1BBTj4mbmJzcDs8L1A+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0 OyBDT0xPUjogcmdiKDAsNjQsMTI4KTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0Ij4NCjxQIA0Kc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQ7IFdP UkQtU1BBQ0lORzogMHB4OyBGT05UOiAxMnB0LzExLjI1cHQgU2ltU3VuOyBURVhULVRSQU5TRk9S TTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFRFWFQtSU5ERU5UOiAwcHg7IFdISVRFLVNQQUNF OiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigy MTUsMjMyLDIwNCk7IG9ycGhhbnM6IGF1dG87IHdpZG93czogYXV0bzsgd2Via2l0LXRleHQtc3Ry b2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09MT1I6IHJn YigwLDY0LDEyOCk7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+VGhpcyANCkNvY28g ZnJvbSBIb25nbXkgYSBwcm9mZXNzaW9uYWwgUHJpbnRlZCBDaXJjdWl0IEJvYXJkIGZhY3Rvcnkg YW5kIG1hbnVmYWN0dXJlciANCmxvY2F0ZWQgaW4gU2hlbnpoZW4sQ2hpbmEuPC9TUEFOPjxvOnA+ PC9vOnA+PC9QPg0KPFAgDQpzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdDsgV09SRC1TUEFDSU5H OiAwcHg7IEZPTlQ6IDEycHQvMTEuMjVwdCBTaW1TdW47IFRFWFQtVFJBTlNGT1JNOiBub25lOyBD T0xPUjogcmdiKDAsMCwwKTsgVEVYVC1JTkRFTlQ6IDBweDsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsg TEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDIxNSwyMzIsMjA0 KTsgb3JwaGFuczogYXV0bzsgd2lkb3dzOiBhdXRvOyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6 IDBweCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBDT0xPUjogcmdiKDAsNjQsMTI4 KTsgRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmIj5XZSANCmFyZSBzbyBmb3J0dW5hdGUg dG8gbGVhcm4gdGhhdCB5b3UgZnJvbSBvbmUgb2YgbXkgZnJpZW5kLiBXZSB3cml0ZSB0byBzZWVr IA0KY29vcGVyYXRpb24uPC9TUEFOPjxvOnA+PC9vOnA+PC9QPg0KPFAgDQpzdHlsZT0iTUFSR0lO OiAwaW4gMGluIDBwdDsgV09SRC1TUEFDSU5HOiAwcHg7IEZPTlQ6IDEycHQvMTQuNHB0IFNpbVN1 bjsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBURVhULUlOREVOVDog MHB4OyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JP VU5ELUNPTE9SOiByZ2IoMjE1LDIzMiwyMDQpOyBvcnBoYW5zOiBhdXRvOyB3aWRvd3M6IGF1dG87 IHdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6 IDEwcHQ7IENPTE9SOiByZ2IoMCw2NCwxMjgpOyBGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2Vy aWYiPiZuYnNwOzwvU1BBTj48bzpwPjwvbzpwPjwvUD4NCjxQIA0Kc3R5bGU9Ik1BUkdJTjogMGlu IDBpbiAwcHQ7IFdPUkQtU1BBQ0lORzogMHB4OyBGT05UOiAxMnB0LzExLjI1cHQgU2ltU3VuOyBU RVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFRFWFQtSU5ERU5UOiAwcHg7 IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQt Q09MT1I6IHJnYigyMTUsMjMyLDIwNCk7IG9ycGhhbnM6IGF1dG87IHdpZG93czogYXV0bzsgd2Vi a2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFw dDsgQ09MT1I6IHJnYigwLDY0LDEyOCk7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+ SG9uZ215IA0KaGF2ZSBiZWVuIHdvcmtpbmcgYXMgb25lIG9mIHRoZSBwcm9mZXNzaW9uYWwmbmJz cDs8Qj48VT5DaGluZXNlIFByaW50ZWQgQ2lyY3VpdCANCkJvYXJkPC9VPiZuYnNwOzwvQj5zdXBw bGllcnMgd2l0aCAxMiB5ZWFycyYjMzk7IGhpc3RvcnkgaW4gUENCIHdvcmxkd2lkZSANCmJ1c2lu ZXNzLlRoZSBQQ0IgZnJvbSAxLTE2bGF5ZXJzIHdpdGggdGhlIG1hdGVyaWFsIEZSNCxBbHVtaW51 bSBiYXNlLGNvb3BlciBmcm9tIA0KMTh1bSB0byAyMTB1bSwgdGhpY2tuZXNzIGZyb20gMC4ybW0g dG8gMy4wbW0uPC9TUEFOPjxvOnA+PC9vOnA+PC9QPg0KPFAgDQpzdHlsZT0iTUFSR0lOOiAwaW4g MGluIDBwdDsgV09SRC1TUEFDSU5HOiAwcHg7IEZPTlQ6IDEycHQvMTQuNHB0IFNpbVN1bjsgVEVY VC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBURVhULUlOREVOVDogMHB4OyBX SElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNP TE9SOiByZ2IoMjE1LDIzMiwyMDQpOyBvcnBoYW5zOiBhdXRvOyB3aWRvd3M6IGF1dG87IHdlYmtp dC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7 IENPTE9SOiByZ2IoMCw2NCwxMjgpOyBGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWYiPiZu YnNwOzwvU1BBTj48bzpwPjwvbzpwPjwvUD4NCjxQIA0Kc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAw cHQ7IFdPUkQtU1BBQ0lORzogMHB4OyBGT05UOiAxMnB0LzExLjI1cHQgU2ltU3VuOyBURVhULVRS QU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFRFWFQtSU5ERU5UOiAwcHg7IFdISVRF LVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6 IHJnYigyMTUsMjMyLDIwNCk7IG9ycGhhbnM6IGF1dG87IHdpZG93czogYXV0bzsgd2Via2l0LXRl eHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09M T1I6IHJnYigwLDY0LDEyOCk7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+Rm9yIA0K bW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGtpbmRseSB2aXNpdCBvdXIgd2Vic2l0ZSZuYnNwOyZu YnNwOyBvciBjb250YWN0IA0KbWUuPC9TUEFOPjxvOnA+PC9vOnA+PC9QPg0KPFAgDQpzdHlsZT0i TUFSR0lOOiAwaW4gMGluIDBwdDsgV09SRC1TUEFDSU5HOiAwcHg7IEZPTlQ6IDEycHQvMTQuNHB0 IFNpbVN1bjsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBURVhULUlO REVOVDogMHB4OyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBC QUNLR1JPVU5ELUNPTE9SOiByZ2IoMjE1LDIzMiwyMDQpOyBvcnBoYW5zOiBhdXRvOyB3aWRvd3M6 IGF1dG87IHdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1BBTiANCnN0eWxlPSJGT05U LVNJWkU6IDEwcHQ7IENPTE9SOiByZ2IoMCw2NCwxMjgpOyBGT05ULUZBTUlMWTogQXJpYWwsIHNh bnMtc2VyaWYiPiZuYnNwOzwvU1BBTj48bzpwPjwvbzpwPjwvUD4NCjxQIA0Kc3R5bGU9Ik1BUkdJ TjogMGluIDBpbiAwcHQ7IFdPUkQtU1BBQ0lORzogMHB4OyBGT05UOiAxMnB0LzExLjI1cHQgU2lt U3VuOyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFRFWFQtSU5ERU5U OiAwcHg7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tH Uk9VTkQtQ09MT1I6IHJnYigyMTUsMjMyLDIwNCk7IG9ycGhhbnM6IGF1dG87IHdpZG93czogYXV0 bzsgd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0la RTogMTFwdDsgQ09MT1I6IHJnYigwLDY0LDEyOCk7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1z ZXJpZiI+VGhhbmsgDQp5b3Ugc28gbXVjaCBmb3IgeW91ciB0aW1lIGFuZCBzaW5jZXJlbHkgaG9w ZSB3ZSBtYXkgaGF2ZSB0aGUgaG9ub3IgdG8gY29vcGVyYXRlIA0Kd2l0aCB5b3UuPC9TUEFOPjxv OnA+PC9vOnA+PC9QPg0KPFAgDQpzdHlsZT0iTUFSR0lOOiAwaW4gMGluIDBwdDsgV09SRC1TUEFD SU5HOiAwcHg7IEZPTlQ6IDEycHQvMTQuNHB0IFNpbVN1bjsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7 IENPTE9SOiByZ2IoMCwwLDApOyBURVhULUlOREVOVDogMHB4OyBXSElURS1TUEFDRTogbm9ybWFs OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjE1LDIzMiwy MDQpOyBvcnBoYW5zOiBhdXRvOyB3aWRvd3M6IGF1dG87IHdlYmtpdC10ZXh0LXN0cm9rZS13aWR0 aDogMHB4Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IENPTE9SOiByZ2IoMCw2NCwx MjgpOyBGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWYiPiZuYnNwOzwvU1BBTj48bzpwPjwv bzpwPjwvUD4NCjxQIA0Kc3R5bGU9Ik1BUkdJTjogMGluIDBpbiAwcHQ7IFdPUkQtU1BBQ0lORzog MHB4OyBGT05UOiAxMnB0LzExLjI1cHQgU2ltU3VuOyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09M T1I6IHJnYigwLDAsMCk7IFRFWFQtSU5ERU5UOiAwcHg7IFdISVRFLVNQQUNFOiBub3JtYWw7IExF VFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyMTUsMjMyLDIwNCk7 IG9ycGhhbnM6IGF1dG87IHdpZG93czogYXV0bzsgd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAw cHgiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09MT1I6IHJnYigwLDY0LDEyOCk7 IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+TG9va2luZyANCmZvcndhcmQgdG8gaGVh ciBmcm9tIHlvdSBzb29uLjwvU1BBTj48L1A+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0la RTogMTJwdDsgQ09MT1I6IHJnYigwLDAsMTI4KTsgRk9OVC1GQU1JTFk6IENhbGlicmk7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMi PjxGT05UIA0KZmFjZT1WZXJkYW5hIGNvbG9yPSMwMDAwMDAgc2l6ZT0yPjwvRk9OVD48L1NQQU4+ DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iTUFSR0lOOiAwcHQ7IExBWU9VVC1HUklELU1P REU6IGNoYXI7IFRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4i PjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgQ09MT1I6IHJnYigwLDAsMTI4KTsgRk9O VC1GQU1JTFk6IENhbGlicmk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiPjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSJGT05U LVNJWkU6IDExcHQ7IENPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWYi PjxFTT48L0VNPjwvU1BBTj48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0K c3R5bGU9Ik1BUkdJTjogMHB0OyBMQVlPVVQtR1JJRC1NT0RFOiBjaGFyOyBURVhULUFMSUdOOiBs ZWZ0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIj48U1BBTiANCnN0eWxlPSJGT05ULVNJ WkU6IDEycHQ7IENPTE9SOiByZ2IoMCwwLDEyOCk7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2T Ij48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBDT0xPUjogYmx1 ZTsgRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmIj48L1NQQU4+PC9TUEFOPiZuYnNwOzwv UD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJNQVJHSU46IDBwdDsgTEFZT1VULUdSSUQt TU9ERTogY2hhcjsgVEVYVC1BTElHTjogbGVmdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhh biI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBDT0xPUjogcmdiKDAsMCwxMjgpOyBG T05ULUZBTUlMWTogQ2FsaWJyaTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNv LWJpZGktZm9udC1mYW1pbHk6IOWui+S9kyI+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZP TlQtU0laRTogMTFwdDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJp ZiI+PEVNPldpdGggTXkgDQpCZXN0IFJlZ2FyZHMsPC9FTT48L1NQQU4+PC9TUEFOPjwvUD4NCjxQ IGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJNQVJHSU46IDBwdDsgTEFZT1VULUdSSUQtTU9ERTog Y2hhcjsgVEVYVC1BTElHTjogbGVmdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PFNQ QU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBDT0xPUjogcmdiKDAsMCwxMjgpOyBGT05ULUZB TUlMWTogQ2FsaWJyaTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1m b250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWJpZGkt Zm9udC1mYW1pbHk6IOWui+S9kyI+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0la RTogMTFwdDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+PC9T UEFOPjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IENPTE9SOiByZ2IoMCww LDEyOCk7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAw MHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TIj48bzpwPjxTUEFOIA0KbGFuZz1FTi1V UyANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IENPTE9SOiBibHVlOyBGT05ULUZBTUlMWTogQXJp YWwsIHNhbnMtc2VyaWYiPjxFTT5Db2NvIA0KQ0hFTjwvRU0+PC9TUEFOPjwvbzpwPjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iTUFSR0lOOiAwcHQ7IExBWU9VVC1HUklE LU1PREU6IGNoYXI7IFRFWFQtQUxJR046IGxlZnQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW4iPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgQ09MT1I6IHJnYigwLDAsMTI4KTsg Rk9OVC1GQU1JTFk6IENhbGlicmk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1z by1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiPjxvOnA+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTFwdDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fu cy1zZXJpZiI+PEVNPjwvRU0+PC9TUEFOPjwvbzpwPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBjbGFz cz1Nc29Ob3JtYWwgDQpzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdDsgV09SRC1TUEFDSU5HOiAw cHg7IEZPTlQ6IDEycHQgU2ltU3VuOyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigw LDAsMCk7IFRFWFQtSU5ERU5UOiAwcHg7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFD SU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHdoaXRlOyBvcnBoYW5zOiBhdXRvOyB3aWRv d3M6IGF1dG87IHdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48ST48U1BBTiANCmxhbmc9 RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBDT0xPUjogYmx1ZTsgRk9OVC1GQU1JTFk6 IEFyaWFsLCBzYW5zLXNlcmlmIj5URUw6Jm5ic3A7Kzg2IA0KNzU1IDI2OTU0MDg0IEV4dCANCjYw MSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxvOnA+PC9vOnA+PC9TUEFOPjwv ST48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdDsg V09SRC1TUEFDSU5HOiAwcHg7IEZPTlQ6IDEycHQgU2ltU3VuOyBURVhULVRSQU5TRk9STTogbm9u ZTsgQ09MT1I6IHJnYigwLDAsMCk7IFRFWFQtSU5ERU5UOiAwcHg7IFdISVRFLVNQQUNFOiBub3Jt YWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHdoaXRlOyBvcnBo YW5zOiBhdXRvOyB3aWRvd3M6IGF1dG87IHdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48 ST48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBDT0xPUjogYmx1 ZTsgRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmIj5GQVg6Jm5ic3A7Kzg2LTc1NSANCjg2 MzcyNjUzPC9TUEFOPjwvST48ST48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkNPTE9SOiBibHVl Ij48bzpwPjwvbzpwPjwvU1BBTj48L0k+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAwcHQ7IFdPUkQtU1BBQ0lORzogMHB4OyBGT05UOiAxMnB0IFNpbVN1 bjsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBURVhULUlOREVOVDog MHB4OyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JP VU5ELUNPTE9SOiB3aGl0ZTsgb3JwaGFuczogYXV0bzsgd2lkb3dzOiBhdXRvOyB3ZWJraXQtdGV4 dC1zdHJva2Utd2lkdGg6IDBweCI+PEk+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQt U0laRTogMTFwdDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+ U2t5cGU6Jm5ic3A7Y29jb2hvbmdteXBjYiZuYnNwOyZuYnNwOzwvU1BBTj48L0k+PC9QPg0KPFAg Y2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQ7IFdPUkQtU1BBQ0lO RzogMHB4OyBGT05UOiAxMnB0IFNpbVN1bjsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiBy Z2IoMCwwLDApOyBURVhULUlOREVOVDogMHB4OyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVIt U1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiB3aGl0ZTsgb3JwaGFuczogYXV0bzsg d2lkb3dzOiBhdXRvOyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PEk+PFNQQU4gDQps YW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFN SUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQt U0laRTogMTFwdDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZiI+ RS1tYWlsOmhvbmdteXBjYjFAMTI2LmNvbSZuYnNwOyZuYnNwOzwvU1BBTj4mbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1NQQU4+PC9JPjxJPjxTUEFOIA0K bGFuZz1FTi1VUyANCnN0eWxlPSJDT0xPUjogYmx1ZTsgRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMg TmV3IFJvbWFuJiMzOTssIHNlcmlmIj48bzpwPjwvbzpwPjwvU1BBTj48L0k+PC9QPg0KPFAgY2xh c3M9TXNvTm9ybWFsIA0Kc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQ7IFdPUkQtU1BBQ0lORzog MHB4OyBGT05UOiAxMnB0IFNpbVN1bjsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2Io MCwwLDApOyBURVhULUlOREVOVDogMHB4OyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BB Q0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiB3aGl0ZTsgb3JwaGFuczogYXV0bzsgd2lk b3dzOiBhdXRvOyB3ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PEk+PFNQQU4gDQpsYW5n PUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgQ09MT1I6IGJsdWU7IEZPTlQtRkFNSUxZ OiBBcmlhbCwgc2Fucy1zZXJpZiI+V2hhdCYjMzk7c2FwcDorODYxNTk4NjY1OTAxMzwvU1BBTj48 L0k+PC9QPg0KPFA+PFNQQU4+PEVNPlxQPFNQQU4gY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNl PiZuYnNwOzwvU1BBTj5QbGVhc2UgY29uc2lkZXIgDQp5b3VyIGVudmlyb25tZW50YWwgcmVzcG9u c2liaWxpdHkgYmVmb3JlIHByaW50aW5nIHRoaXMgZS1tYWlsLjwvRU0+PC9TUEFOPjwhLS1FbmRG cmFnbWVudC0tPjwvUD48L0JPRFk+PC9IVE1MPg0KDQo= From felix.janda@posteo.de Sat Aug 6 03:39:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ABC1F7CD0 for ; Sat, 6 Aug 2016 03:39:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6076F8F8037 for ; Sat, 6 Aug 2016 01:39:39 -0700 (PDT) X-ASG-Debug-ID: 1470472773-0bf8157e6b5102d0001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id 9bP43mcQLK8liHze (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 06 Aug 2016 01:39:35 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 4651820994 for ; Sat, 6 Aug 2016 10:39:33 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s5xtR2Z9wz104C; Sat, 6 Aug 2016 10:39:27 +0200 (CEST) Date: Sat, 6 Aug 2016 10:38:52 +0200 From: Felix Janda To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160806083852.GA26156@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> <20160804004747.GZ16044@dastard> <20160805080241.GA749@nyan> <20160805115239.GH16044@dastard> <20160805130905.GA321@nyan> <20160805224439.GM16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805224439.GM16044@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470472775 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3637 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31792 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Dave Chinner wrote: > On Fri, Aug 05, 2016 at 03:09:05PM +0200, Felix Janda wrote: > > Dave Chinner wrote: > > > On Fri, Aug 05, 2016 at 10:02:41AM +0200, Felix Janda wrote: > > > > Dave Chinner wrote: > > > > > On Mon, Aug 01, 2016 at 08:54:10AM +0200, Felix Janda wrote: > > > > > > Christoph Hellwig wrote: > > > > > > > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > > > > > > > int64_t is guaranteed to have the correct size and signedness and is > > > > > > > > always avaible because linux.h has a include. > > > > > > > > > > > > > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > > > > > > > public header is included without _LARGEFILE64_SOURCE or > > > > > > > > _GNU_SOURCE defined. This bug was introduced in commit > > > > > > > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > > > > > > > > > > > > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. > > > > > > > > > > > > Thanks for the suggestion, but that does not work if the system header > > > > > > defining (or not) off64_t is included before the xfs headers. > > > > > > > > > > Which, to me, is a build bug in whatever code is including the xfs > > > > > headers. Isn't it the responsibility of the build environment to > > > > > ensure the dependencies of the libraries being used are correctly > > > > > met? > > > > > > > > Every program using the xfs header is supposed to know that (only on > > > > linux) since commit cb898f157f8410a03cf5f3400baa1df9e5eecd33 it is > > > > necessary to define _LARGEFILE64_SOURCE or _GNU_SOURCE? > > > > > > Which, I'd say, most already do, because anything trying to use XFS > > > ioctls needs to be 64 bit offset clean, even on 32 bit systems. I > > > don't see any problem with requiring it when including a header > > > that exposes ioctl interfaces with 64 bit file size/offset fields > > > in them.... > > > > The easiest way to be 64bit clean is to use _FILEOFFSET_BITS=64. Then > > off_t is 64bit on all architectures and it is impossible to use 32bit > > interfaces. However the type off64_t will still not be defined... > > > > (On the other hand, when just using _LARGEFILE64_SOURCE it is still > > easy to mix 32 and 64bit interfaces.) > > Which, with library code, we are likely to see applications using. > > If you want to clean this up, then remove the dependence on > _LARGEFILE64_SOURCE in the entire xfsprogs code base (e.g. it uses > lseek64 everywhere which requires off64_t to be defined) and instead > make it dependent on _FILEOFFSET_BITS=64. Then you can get rid of > all the uses of off64_t completely, and we can break the build if > _FILEOFFSET_BITS != 64 on inclusion of xfs.h. Yes, I'd like to clean this up. But first note that you can have both _FILE_OFFSET_BITS=64 and _LARGEFILE64_SOURCE. Then everything (off64_t, lseek64, ...) is defined and everything (off_t, lseek, ...) is 64bit. So to clean up I would first get _FILE_OFFSET_BITS=64 defined and then start "removing 64" from functions/types in any order. *Before modifying the public headers* the sizeof(off_t)=8 check needs to be put into xfs.h. Also note that there are 3 different (but equivalent) off_t types currently used in the code base: off64_t, loff_t and xfs_off_t. Should these be converted to xfs_off_t or off_t? Still, doing these type conversions is going to be pretty invasive and is not unlikely to conflict with outstanding patches. Is now a good time for this? (How about the __uint -> uint, __int -> int conversion?) Thanks, Felix From felix.janda@posteo.de Sat Aug 6 03:40:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8DF8D7CD0 for ; Sat, 6 Aug 2016 03:40:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 12BB2AC004 for ; Sat, 6 Aug 2016 01:40:28 -0700 (PDT) X-ASG-Debug-ID: 1470472826-0bf8157e6b510340001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id Y5P4a29B5shVyksy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 06 Aug 2016 01:40:27 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id D72E92083B for ; Sat, 6 Aug 2016 10:40:25 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s5xvY2yvvzysW for ; Sat, 6 Aug 2016 10:40:25 +0200 (CEST) Date: Sat, 6 Aug 2016 10:39:49 +0200 From: Felix Janda To: xfs@oss.sgi.com Subject: [PATCH xfsprogs] kill off u_int*_t types Message-ID: <20160806083949.GA28832@nyan> X-ASG-Orig-Subj: [PATCH xfsprogs] kill off u_int*_t types MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470472826 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1777 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31792 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- They were only used in two places and can be replaced by uint*_t. Signed-off-by: Felix Janda --- db/check.c | 2 +- include/darwin.h | 8 ++------ libxfs/xfs_format.h | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/db/check.c b/db/check.c index 25146e5..f507148 100644 --- a/db/check.c +++ b/db/check.c @@ -3336,7 +3336,7 @@ process_quota( int cb; xfs_dqblk_t *dqb; xfs_dqid_t dqid; - u_int8_t exp_flags = 0; + uint8_t exp_flags = 0; uint i; uint perblock; xfs_fileoff_t qbno; diff --git a/include/darwin.h b/include/darwin.h index 45e0c03..b5076ce 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -130,15 +130,11 @@ typedef signed long long int __s64; #define __int32_t int32_t #define __int32_t int32_t #define __int64_t int64_t -#define __uint8_t u_int8_t -#define __uint16_t u_int16_t -#define __uint32_t u_int32_t -#define __uint64_t u_int64_t #define off64_t off_t typedef off_t xfs_off_t; -typedef u_int64_t xfs_ino_t; -typedef u_int32_t xfs_dev_t; +typedef uint64_t xfs_ino_t; +typedef uint32_t xfs_dev_t; typedef int64_t xfs_daddr_t; #define stat64 stat diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index f89b6e0..eb50a76 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1109,7 +1109,7 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) * Dquot and dquot block format definitions */ #define XFS_DQUOT_MAGIC 0x4451 /* 'DQ' */ -#define XFS_DQUOT_VERSION (u_int8_t)0x01 /* latest version number */ +#define XFS_DQUOT_VERSION (uint8_t)0x01 /* latest version number */ /* * This is the main portion of the on-disk representation of quota -- 2.7.3 From felix.janda@posteo.de Sat Aug 6 04:13:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4F1027CD4 for ; Sat, 6 Aug 2016 04:13:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id ABC7FAC001 for ; Sat, 6 Aug 2016 02:13:42 -0700 (PDT) X-ASG-Debug-ID: 1470474818-0bf57b369c46ea20001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id OVwh5RecF0Fwe9Et (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 06 Aug 2016 02:13:40 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 981AE20ABA for ; Sat, 6 Aug 2016 11:13:38 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s5ydt0t1gz101D; Sat, 6 Aug 2016 11:13:38 +0200 (CEST) Date: Sat, 6 Aug 2016 11:13:01 +0200 From: Felix Janda To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160806091301.GA4074@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> <20160804004747.GZ16044@dastard> <20160805080241.GA749@nyan> <20160805115239.GH16044@dastard> <20160805130905.GA321@nyan> <20160805224439.GM16044@dastard> <20160806083852.GA26156@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160806083852.GA26156@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470474819 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3398 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31792 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Felix Janda wrote: > Dave Chinner wrote: > > On Fri, Aug 05, 2016 at 03:09:05PM +0200, Felix Janda wrote: > > > Dave Chinner wrote: > > > > On Fri, Aug 05, 2016 at 10:02:41AM +0200, Felix Janda wrote: > > > > > Dave Chinner wrote: > > > > > > On Mon, Aug 01, 2016 at 08:54:10AM +0200, Felix Janda wrote: > > > > > > > Christoph Hellwig wrote: > > > > > > > > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > > > > > > > > int64_t is guaranteed to have the correct size and signedness and is > > > > > > > > > always avaible because linux.h has a include. > > > > > > > > > > > > > > > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > > > > > > > > public header is included without _LARGEFILE64_SOURCE or > > > > > > > > > _GNU_SOURCE defined. This bug was introduced in commit > > > > > > > > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > > > > > > > > > > > > > > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. > > > > > > > > > > > > > > Thanks for the suggestion, but that does not work if the system header > > > > > > > defining (or not) off64_t is included before the xfs headers. > > > > > > > > > > > > Which, to me, is a build bug in whatever code is including the xfs > > > > > > headers. Isn't it the responsibility of the build environment to > > > > > > ensure the dependencies of the libraries being used are correctly > > > > > > met? > > > > > > > > > > Every program using the xfs header is supposed to know that (only on > > > > > linux) since commit cb898f157f8410a03cf5f3400baa1df9e5eecd33 it is > > > > > necessary to define _LARGEFILE64_SOURCE or _GNU_SOURCE? > > > > > > > > Which, I'd say, most already do, because anything trying to use XFS > > > > ioctls needs to be 64 bit offset clean, even on 32 bit systems. I > > > > don't see any problem with requiring it when including a header > > > > that exposes ioctl interfaces with 64 bit file size/offset fields > > > > in them.... > > > > > > The easiest way to be 64bit clean is to use _FILEOFFSET_BITS=64. Then > > > off_t is 64bit on all architectures and it is impossible to use 32bit > > > interfaces. However the type off64_t will still not be defined... > > > > > > (On the other hand, when just using _LARGEFILE64_SOURCE it is still > > > easy to mix 32 and 64bit interfaces.) > > > > Which, with library code, we are likely to see applications using. > > > > If you want to clean this up, then remove the dependence on > > _LARGEFILE64_SOURCE in the entire xfsprogs code base (e.g. it uses > > lseek64 everywhere which requires off64_t to be defined) and instead > > make it dependent on _FILEOFFSET_BITS=64. Then you can get rid of > > all the uses of off64_t completely, and we can break the build if > > _FILEOFFSET_BITS != 64 on inclusion of xfs.h. > > Yes, I'd like to clean this up. > > But first note that you can have both _FILE_OFFSET_BITS=64 and > _LARGEFILE64_SOURCE. Then everything (off64_t, lseek64, ...) is > defined and everything (off_t, lseek, ...) is 64bit. > > So to clean up I would first get _FILE_OFFSET_BITS=64 defined and then Actually I just noticed that xfsprogs has had _FILE_OFFSET_BITS=64 defined for linux (the only platform where this is necessary) since the beginning of xfsprogs-dev git history. Felix From Soniaggrwal@outlook.com Sat Aug 6 11:40:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 604857CD5 for ; Sat, 6 Aug 2016 11:40:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B98BCAC001 for ; Sat, 6 Aug 2016 09:40:19 -0700 (PDT) X-ASG-Debug-ID: 1470501613-0bf57b369c47b310001-NocioJ Received: from BLU004-OMC4S11.hotmail.com (blu004-omc4s11.hotmail.com [65.55.111.150]) by cuda.sgi.com with ESMTP id rkAAXISgyanrh54e (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO) for ; Sat, 06 Aug 2016 09:40:13 -0700 (PDT) X-Barracuda-Envelope-From: Soniaggrwal@outlook.com X-Barracuda-Effective-Source-IP: blu004-omc4s11.hotmail.com[65.55.111.150] X-Barracuda-Apparent-Source-IP: 65.55.111.150 Received: from APC01-PU1-obe.outbound.protection.outlook.com ([65.55.111.135]) by BLU004-OMC4S11.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.23008); Sat, 6 Aug 2016 09:40:13 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=NEVmMjL1O4BAzHS1ssdM6mJMJo4xi/BKIIswgHs+3AQ=; b=nd5r79l4pVsshh2uSTjraIOvKB2xTXSzyEV5QEJMZ2ptPNSp/moGj95gfkaZmmODQLNG+sEOvJHwlzqM6DujPR18osMhGTVp6RFsN0kBvO0fZqRguwBddIIaXjL5L5pbcjm2kQ7mpLXOGDrxj8x5n0Kg0f+oAVjF8hP9rMlPuxQv+FX9zMVRrOSad7RT6JIqyew1IRHS4rUcIRh6XxKVszgyNy7DAGXvcVXOXBvbKwV/VPoHAQfTenGyYMXEaQPXPHMQaJaTFSB3P/SuJDeemefvi1a+23lbur2CyQuAhSTAGBw5HQDkCU78zKNzWdEv1T0PdhdwSRPWpl1D/MSEFA== Received: from PU1APC01FT045.eop-APC01.prod.protection.outlook.com (10.152.252.60) by PU1APC01HT173.eop-APC01.prod.protection.outlook.com (10.152.253.186) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.5; Sat, 6 Aug 2016 16:39:46 +0000 Received: from HK2PR0301MB1220.apcprd03.prod.outlook.com (10.152.252.60) by PU1APC01FT045.mail.protection.outlook.com (10.152.253.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.5 via Frontend Transport; Sat, 6 Aug 2016 16:39:21 +0000 Received: from HK2PR0301MB1220.apcprd03.prod.outlook.com ([10.162.245.19]) by HK2PR0301MB1220.apcprd03.prod.outlook.com ([10.162.245.19]) with mapi id 15.01.0549.023; Sat, 6 Aug 2016 16:39:19 +0000 From: Soni Aggarwal Subject: First Page In Google Thread-Topic: First Page In Google X-ASG-Orig-Subj: First Page In Google Thread-Index: AQHR8AEPx1nUH16wikmI8wU4dcMh7Q== Date: Sat, 6 Aug 2016 16:39:19 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=softfail (sender IP is 10.152.252.60) smtp.mailfrom=outlook.com; Rentacenter.com; dkim=none (message not signed) header.d=none;Rentacenter.com; dmarc=fail action=none header.from=outlook.com; received-spf: SoftFail (protection.outlook.com: domain of transitioning outlook.com discourages use of 10.152.252.60 as permitted sender) x-tmn: [wqBOca02cc47P9PnpXhuOKKoht6IPwjY] x-eopattributedmessage: 0 x-forefront-antispam-report: CIP:10.152.252.60;IPV:NLI;CTRY:;EFV:NLI;SFV:NSPM;SFS:(10019020)(98900003);DIR:OUT;SFP:1102;SCL:1;SRVR:PU1APC01HT173;H:HK2PR0301MB1220.apcprd03.prod.outlook.com;FPR:;SPF:None;LANG:en; x-microsoft-exchange-diagnostics: 1;PU1APC01HT173;6:S4iDHB0K7uV1kkxUxj9lbvGA6tfU//eSElGzIEIZNl4STQvrTSqEfdSQisbEM7/u64ih/MzESWRrLRqWN8rPKbVJVVKfPlmJSrljNCmNjlEZoT17qJWHMkb3MzGzuz5yoW41PG2XqXNfgIckVg/Ylit5ckqpcHJRYr0hNP2IyRb2RhmnUBLSC5sbNkTH6bqIZ/TOWWNsRDNmyRTUPUFcqwGJNHIUFRIhBtqDjsfNNEzL7cYXnL80HO/30fE7JlR0r6T7eSH76wt7F3ylFucCVe/0vt8I+/P1BznaPZcJxtt+Az8DzH5SEHfVL5TCuNc+;5:8wuTPWezYi5Ucw+Y9USnk8eZ7hbxqKjopD46nMuZQhAEZ1zb2hwUUEGGqtedvfPKGuDwzCH8N2sTW1cWK3npez0muW259qr3WRDMPKR877cVT8DAEXIUBY6WnV3GxG6PeUOoOKDFlzik5TecizTt4w==;24:8Qz1nUxEpDJwx3yvYOJGh21sIU+yFu57oJivnnZangU6GqIR3hO35WpgwSTE3tNMmXDwVg5zGcWuBXCS+4NX7CUn1KoLe7jFV+gVhY1eWeU=;7:BPau5vkXsjrO5YCTtXCau3Apx75Nn7Yvci5PfLmC3kkFNQ4x4PyxE+HmEmB7kC+AHsY8FHk+9Ud0TdOoF3nUGxjzkQ8IrhQMk+S1nkrBuu0BE7clywWh2XY4mrZvoW6oUoo6mkgOtiaaU4+wZVbF2dMcFDiOH5+2LiuMhdmTir/WYMtE2T6bkvnO8LblFd2Kz2HTBmAb/y46pOZEWdUHTeqLhJ2Jxq+N42iDZTwizWPXZJUxpMSCru+dGUPwPT2O x-ms-office365-filtering-correlation-id: 22916b19-bdf3-479b-a21b-08d3be1836cd x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(1601124038)(1601125047);SRVR:PU1APC01HT173; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(432015012)(82015046);SRVR:PU1APC01HT173;BCL:0;PCL:0;RULEID:;SRVR:PU1APC01HT173; x-forefront-prvs: 0026334A56 spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: multipart/alternative; boundary="_000_HK2PR0301MB1220AFEA5FC47F4BEE847EB2AE190HK2PR0301MB1220_" MIME-Version: 1.0 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-originalarrivaltime: 06 Aug 2016 16:39:19.6379 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-Transport-CrossTenantHeadersStamped: PU1APC01HT173 X-OriginalArrivalTime: 06 Aug 2016 16:40:13.0202 (UTC) FILETIME=[3435A720:01D1F001] X-Barracuda-Connect: blu004-omc4s11.hotmail.com[65.55.111.150] X-Barracuda-Start-Time: 1470501613 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1776 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.23 X-Barracuda-Spam-Status: No, SCORE=1.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31798 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; --_000_HK2PR0301MB1220AFEA5FC47F4BEE847EB2AE190HK2PR0301MB1220_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi Hope you are doing well, I was examine your website and see have good design and looking great, But = it was not ranking on search engine for most of the keyword. I was not found your website on started pages; I can do better your ranking= on every search engines if you can give us permission. We are best service provider in optimization area. And can do better in aff= ordable charges. Please let me know if you are interested and have any questions. Waiting fo= r your reply! Kind Regards, Soni Aggarwal Business Development Manager --_000_HK2PR0301MB1220AFEA5FC47F4BEE847EB2AE190HK2PR0301MB1220_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

Hi
Hope you are doing well,
I was examine your website and see have good design and looking great,= But it was not ranking on search engine for most of the keyword.
I was not found your website on started pages; I can do better your ra= nking on every search engines if you can give us permission.
We are best service provider in optimization area. And can do better i= n affordable charges.
Please let me know if you are interested and have any questions. Waiti= ng for your reply!
Kind Regards, 
Soni Aggarwal
Business Development Manager            =          


--_000_HK2PR0301MB1220AFEA5FC47F4BEE847EB2AE190HK2PR0301MB1220_-- From david@fromorbit.com Sat Aug 6 18:18:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4FD697CC7 for ; Sat, 6 Aug 2016 18:18:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ACD5CAC001 for ; Sat, 6 Aug 2016 16:18:09 -0700 (PDT) X-ASG-Debug-ID: 1470525485-0bf57c1369418710001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id gL1pJkO6CEFarswd for ; Sat, 06 Aug 2016 16:18:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlgNABFvpld5LI7JIGdsb2JhbABdg0WBUoJ5g3mdEQEBAQEGjGKGD4QMhhcCAgEBAoEpTQEBAQEBAQcBAQEBAQE3AUCEXgEBBAEnExwjBQsIAxgJJQ8FJQMHGhOIKQfBOAELASQehUSFFYobBY4YiyGJGYVnj01Ii2yDeIJmHIFeKjKHMgEBAQ Received: from ppp121-44-142-201.lns20.syd7.internode.on.net (HELO dastard) ([121.44.142.201]) by ipmail04.adl6.internode.on.net with ESMTP; 07 Aug 2016 08:48:03 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bWAqx-0007WO-1I; Sun, 07 Aug 2016 09:18:03 +1000 Date: Sun, 7 Aug 2016 09:18:03 +1000 From: Dave Chinner To: Felix Janda Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160806231802.GN16044@dastard> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> <20160804004747.GZ16044@dastard> <20160805080241.GA749@nyan> <20160805115239.GH16044@dastard> <20160805130905.GA321@nyan> <20160805224439.GM16044@dastard> <20160806083852.GA26156@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160806083852.GA26156@nyan> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470525485 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4870 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31803 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Aug 06, 2016 at 10:38:52AM +0200, Felix Janda wrote: > Dave Chinner wrote: > > On Fri, Aug 05, 2016 at 03:09:05PM +0200, Felix Janda wrote: > > > Dave Chinner wrote: > > > > On Fri, Aug 05, 2016 at 10:02:41AM +0200, Felix Janda wrote: > > > > > Dave Chinner wrote: > > > > > > On Mon, Aug 01, 2016 at 08:54:10AM +0200, Felix Janda wrote: > > > > > > > Christoph Hellwig wrote: > > > > > > > > On Sat, Jul 30, 2016 at 03:37:37PM +0200, Felix Janda wrote: > > > > > > > > > int64_t is guaranteed to have the correct size and signedness and is > > > > > > > > > always avaible because linux.h has a include. > > > > > > > > > > > > > > > > > > Fixes compilation error "unkown type name 'off64_t'" on linux when the > > > > > > > > > public header is included without _LARGEFILE64_SOURCE or > > > > > > > > > _GNU_SOURCE defined. This bug was introduced in commit > > > > > > > > > cb898f157f8410a03cf5f3400baa1df9e5eecd33. > > > > > > > > > > > > > > > > I would much prefer to just define _LARGEFILE64_SOURCE in linux.h.. > > > > > > > > > > > > > > Thanks for the suggestion, but that does not work if the system header > > > > > > > defining (or not) off64_t is included before the xfs headers. > > > > > > > > > > > > Which, to me, is a build bug in whatever code is including the xfs > > > > > > headers. Isn't it the responsibility of the build environment to > > > > > > ensure the dependencies of the libraries being used are correctly > > > > > > met? > > > > > > > > > > Every program using the xfs header is supposed to know that (only on > > > > > linux) since commit cb898f157f8410a03cf5f3400baa1df9e5eecd33 it is > > > > > necessary to define _LARGEFILE64_SOURCE or _GNU_SOURCE? > > > > > > > > Which, I'd say, most already do, because anything trying to use XFS > > > > ioctls needs to be 64 bit offset clean, even on 32 bit systems. I > > > > don't see any problem with requiring it when including a header > > > > that exposes ioctl interfaces with 64 bit file size/offset fields > > > > in them.... > > > > > > The easiest way to be 64bit clean is to use _FILEOFFSET_BITS=64. Then > > > off_t is 64bit on all architectures and it is impossible to use 32bit > > > interfaces. However the type off64_t will still not be defined... > > > > > > (On the other hand, when just using _LARGEFILE64_SOURCE it is still > > > easy to mix 32 and 64bit interfaces.) > > > > Which, with library code, we are likely to see applications using. > > > > If you want to clean this up, then remove the dependence on > > _LARGEFILE64_SOURCE in the entire xfsprogs code base (e.g. it uses > > lseek64 everywhere which requires off64_t to be defined) and instead > > make it dependent on _FILEOFFSET_BITS=64. Then you can get rid of > > all the uses of off64_t completely, and we can break the build if > > _FILEOFFSET_BITS != 64 on inclusion of xfs.h. > > Yes, I'd like to clean this up. > > But first note that you can have both _FILE_OFFSET_BITS=64 and > _LARGEFILE64_SOURCE. Then everything (off64_t, lseek64, ...) is > defined and everything (off_t, lseek, ...) is 64bit. > > So to clean up I would first get _FILE_OFFSET_BITS=64 defined and then > start "removing 64" from functions/types in any order. *Before > modifying the public headers* the sizeof(off_t)=8 check needs to > be put into xfs.h. > > Also note that there are 3 different (but equivalent) off_t types > currently used in the code base: off64_t, loff_t and xfs_off_t. > Should these be converted to xfs_off_t or off_t? Not that simple. loff_t has to remain for the copy_file_range() syscall in xfs_io. That syscall requires _GNU_SOURCE and loff_t to be defined from the system headers, so it can't really go away. xfs_off_t is an internal XFS file offset definition, used by the code in libxfs/ and shared with the kernel code, so it can't go away, either. So, essentially, the only code that should change is all the code that uses off64_t - that can use off_t as that's what all the systems that use those variables require... > Still, doing these type conversions is going to be pretty invasive > and is not unlikely to conflict with outstanding patches. Is now > a good time for this? (How about the __uint -> uint, __int -> int > conversion?) off64_t -> off_t affects very little of the new code we have outstanding. It mostly affects xfs_io, so there's little to worry about in terms of merge conflicts here. The __*int conversions are a different matter. They affect the entire code base - they are widespread through the libxfs code so we need to do a kernel code conversion first. Then we can propagate that back into the libxfs code in xfsprogs, and then the rest of xfsprogs can be done. Cheers, Dave. -- Dave Chinner david@fromorbit.com From felix.janda@posteo.de Sun Aug 7 02:10:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9ED6D7CD8 for ; Sun, 7 Aug 2016 02:10:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 52C2E8F8040 for ; Sun, 7 Aug 2016 00:10:40 -0700 (PDT) X-ASG-Debug-ID: 1470553831-0bf8157e6a535a30001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id lX2pVLd8uAFte0q6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:10:33 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 419A620A8E for ; Sun, 7 Aug 2016 09:10:30 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6WsH4YGHz1019; Sun, 7 Aug 2016 09:10:27 +0200 (CEST) Date: Sun, 7 Aug 2016 09:09:49 +0200 From: Felix Janda To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t Message-ID: <20160807070949.GA24018@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 2/2] linux.h: Define xfs_off_t as int64_t References: <20160730133737.GB5895@nyan> <20160801062449.GB596@infradead.org> <20160801065410.GA341@nyan> <20160804004747.GZ16044@dastard> <20160805080241.GA749@nyan> <20160805115239.GH16044@dastard> <20160805130905.GA321@nyan> <20160805224439.GM16044@dastard> <20160806083852.GA26156@nyan> <20160806231802.GN16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160806231802.GN16044@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470553832 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2941 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Dave Chinner wrote: > On Sat, Aug 06, 2016 at 10:38:52AM +0200, Felix Janda wrote: > > Dave Chinner wrote: [snip] > > > If you want to clean this up, then remove the dependence on > > > _LARGEFILE64_SOURCE in the entire xfsprogs code base (e.g. it uses > > > lseek64 everywhere which requires off64_t to be defined) and instead > > > make it dependent on _FILEOFFSET_BITS=64. Then you can get rid of > > > all the uses of off64_t completely, and we can break the build if > > > _FILEOFFSET_BITS != 64 on inclusion of xfs.h. > > > > Yes, I'd like to clean this up. > > > > But first note that you can have both _FILE_OFFSET_BITS=64 and > > _LARGEFILE64_SOURCE. Then everything (off64_t, lseek64, ...) is > > defined and everything (off_t, lseek, ...) is 64bit. > > > > So to clean up I would first get _FILE_OFFSET_BITS=64 defined and then > > start "removing 64" from functions/types in any order. *Before > > modifying the public headers* the sizeof(off_t)=8 check needs to > > be put into xfs.h. > > > > Also note that there are 3 different (but equivalent) off_t types > > currently used in the code base: off64_t, loff_t and xfs_off_t. > > Should these be converted to xfs_off_t or off_t? > > Not that simple. loff_t has to remain for the copy_file_range() > syscall in xfs_io. That syscall requires _GNU_SOURCE and loff_t to > be defined from the system headers, so it can't really go away. loff_t is the kernel name for the 64 bit offset type. (The kernel needs to distinguish between off_t and loff_t because it needs to export both 32bit and 64bit syscalls.) Since we are in userspace, we can use the user space off_t, which coincides with kernel loff_t. > xfs_off_t is an internal XFS file offset definition, used by the > code in libxfs/ and shared with the kernel code, so it can't go > away, either. > > So, essentially, the only code that should change is all > the code that uses off64_t - that can use off_t as that's what > all the systems that use those variables require... ok. > > Still, doing these type conversions is going to be pretty invasive > > and is not unlikely to conflict with outstanding patches. Is now > > a good time for this? (How about the __uint -> uint, __int -> int > > conversion?) > > off64_t -> off_t affects very little of the new code we have > outstanding. It mostly affects xfs_io, so there's little to worry > about in terms of merge conflicts here. will send a patch series soon. > The __*int conversions are a different matter. They affect the > entire code base - they are widespread through the libxfs code so we > need to do a kernel code conversion first. Then we can propagate > that back into the libxfs code in xfsprogs, and then the rest of > xfsprogs can be done. ok, I looked into the kernel. The only user of __uint*_t and __int*_t are inside fs/xfs. I can prepare a patch for that. Thanks, Felix From felix.janda@posteo.de Sun Aug 7 02:35:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 409EA7CDA for ; Sun, 7 Aug 2016 02:35:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0283A8F8035 for ; Sun, 7 Aug 2016 00:35:47 -0700 (PDT) X-ASG-Debug-ID: 1470555343-0bf8157e6d536010001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id VcHB9So7UOmsSqgi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:45 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id A934A20A76 for ; Sun, 7 Aug 2016 09:35:43 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQR1Yq5z104R for ; Sun, 7 Aug 2016 09:35:43 +0200 (CEST) X-Mailbox-Line: From ea8cca9bf1dbeb13a788f85f73d6bafbcc374a89 Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: References: From: Felix Janda Date: Sun, 7 Aug 2016 07:21:20 +0200 Subject: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555344 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 601 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The autoconf macro AC_SYS_LARGEFILE defines _FILE_OFFSET_BITS=64 where necessary to ensure that off_t and all interfaces using off_t are 64bit, even on 32bit systems. Signed-off-by: Felix Janda --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index 1bb5fef..8fa96a5 100644 --- a/configure.ac +++ b/configure.ac @@ -107,6 +107,8 @@ AC_PACKAGE_UTILITIES(xfsprogs) AC_MULTILIB($enable_lib64) AC_RT($enable_librt) +AC_SYS_LARGEFILE + AC_PACKAGE_NEED_UUID_H AC_PACKAGE_NEED_UUIDCOMPARE -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9E03B7CDA for ; Sun, 7 Aug 2016 02:35:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F6A6304048 for ; Sun, 7 Aug 2016 00:35:48 -0700 (PDT) X-ASG-Debug-ID: 1470555344-0bf57c1369420100001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id fh9xzU0hbFqHHCqw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:45 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id A15FC20A85 for ; Sun, 7 Aug 2016 09:35:44 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQS1RVZz104W for ; Sun, 7 Aug 2016 09:35:44 +0200 (CEST) X-Mailbox-Line: From 672b1929c1d96977bf5755fbbc541d530f31198b Mon Sep 17 00:00:00 2001 Message-Id: <672b1929c1d96977bf5755fbbc541d530f31198b.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:43 +0200 Subject: [PATCH xfsprogs 03/14] replace fstat64 by equivalent fstat To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 03/14] replace fstat64 by equivalent fstat X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555345 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6645 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- copy/xfs_copy.c | 2 +- fsr/xfs_fsr.c | 4 ++-- include/darwin.h | 1 - include/freebsd.h | 1 - io/copy_file_range.c | 4 ++-- io/open.c | 12 ++++++------ io/sendfile.c | 4 ++-- libxfs/darwin.c | 2 +- libxfs/init.c | 2 +- libxfs/irix.c | 2 +- libxfs/linux.c | 4 ++-- mkfs/proto.c | 2 +- repair/xfs_repair.c | 2 +- 13 files changed, 20 insertions(+), 22 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 3c8998c..6dcc51a 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -641,7 +641,7 @@ main(int argc, char **argv) die_perror(); } - if (fstat64(source_fd, &statbuf) < 0) { + if (fstat(source_fd, &statbuf) < 0) { do_log(_("%s: couldn't stat source \"%s\"\n"), progname, source_name); die_perror(); diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index d75990a..2eaf1e7 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -514,7 +514,7 @@ fsrallfs(char *mtab, int howlong, char *leftofffile) if ( (fd = open(leftofffile, O_RDONLY)) == -1 ) { fsrprintf(_("%s: open failed\n"), leftofffile); } - else if ( fstat64(fd, &sb2) == 0) { + else if ( fstat(fd, &sb2) == 0) { /* * Verify that lstat & fstat point to the * same regular file (no links/no quick spoofs) @@ -1054,7 +1054,7 @@ fsr_setup_attr_fork( /* attr2 w/ fork offsets */ - if (fstat64(tfd, &tstatbuf) < 0) { + if (fstat(tfd, &tstatbuf) < 0) { fsrprintf(_("unable to stat temp file: %s\n"), strerror(errno)); return -1; diff --git a/include/darwin.h b/include/darwin.h index 45e0c03..1666294 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -142,7 +142,6 @@ typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; #define stat64 stat -#define fstat64 fstat #define lseek64 lseek #define pread64 pread #define pwrite64 pwrite diff --git a/include/freebsd.h b/include/freebsd.h index 6e77427..d6e75f4 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -34,7 +34,6 @@ #define __LITTLE_ENDIAN LITTLE_ENDIAN /* FreeBSD file API is 64-bit aware */ -#define fstat64 fstat #define ftruncate64 ftruncate #define lseek64 lseek #define stat64 stat diff --git a/io/copy_file_range.c b/io/copy_file_range.c index eddc634..a354fab 100644 --- a/io/copy_file_range.c +++ b/io/copy_file_range.c @@ -62,8 +62,8 @@ copy_src_filesize(int fd) { struct stat64 st; - if (fstat64(fd, &st) < 0) { - perror("fstat64"); + if (fstat(fd, &st) < 0) { + perror("fstat"); return -1; }; return st.st_size; diff --git a/io/open.c b/io/open.c index 2303527..766ac48 100644 --- a/io/open.c +++ b/io/open.c @@ -54,8 +54,8 @@ filesize(void) { struct stat64 st; - if (fstat64(file->fd, &st) < 0) { - perror("fstat64"); + if (fstat(file->fd, &st) < 0) { + perror("fstat"); return -1; } return st.st_size; @@ -102,8 +102,8 @@ stat_f( file->flags & IO_APPEND ? _(",append-only") : "", file->flags & IO_NONBLOCK ? _(",non-block") : "", file->flags & IO_TMPFILE ? _(",tmpfile") : ""); - if (fstat64(file->fd, &st) < 0) { - perror("fstat64"); + if (fstat(file->fd, &st) < 0) { + perror("fstat"); } else { printf(_("stat.ino = %lld\n"), (long long)st.st_ino); printf(_("stat.type = %s\n"), filetype(st.st_mode)); @@ -576,8 +576,8 @@ set_extsize(const char *path, int fd, long extsz) struct fsxattr fsx; struct stat64 stat; - if (fstat64(fd, &stat) < 0) { - perror("fstat64"); + if (fstat(fd, &stat) < 0) { + perror("fstat"); return 0; } if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) { diff --git a/io/sendfile.c b/io/sendfile.c index 21ab444..0dc6154 100644 --- a/io/sendfile.c +++ b/io/sendfile.c @@ -135,8 +135,8 @@ sendfile_f( } else { struct stat64 stat; - if (fstat64(fd, &stat) < 0) { - perror("fstat64"); + if (fstat(fd, &stat) < 0) { + perror("fstat"); goto done; } count = stat.st_size; diff --git a/libxfs/darwin.c b/libxfs/darwin.c index 017e190..3923473 100644 --- a/libxfs/darwin.c +++ b/libxfs/darwin.c @@ -71,7 +71,7 @@ platform_findsizes(char *path, int fd, long long *sz, int *bsz) __uint64_t size; struct stat64 st; - if (fstat64(fd, &st) < 0) { + if (fstat(fd, &st) < 0) { fprintf(stderr, _("%s: cannot stat the device file \"%s\": %s\n"), progname, path, strerror(errno)); diff --git a/libxfs/init.c b/libxfs/init.c index e04b6e0..919a510 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -124,7 +124,7 @@ retry: exit(1); } - if (fstat64(fd, &statb) < 0) { + if (fstat(fd, &statb) < 0) { fprintf(stderr, _("%s: cannot stat %s: %s\n"), progname, path, strerror(errno)); exit(1); diff --git a/libxfs/irix.c b/libxfs/irix.c index 65aaa7e..532ea34 100644 --- a/libxfs/irix.c +++ b/libxfs/irix.c @@ -53,7 +53,7 @@ platform_findsizes(char *path, int fd, long long *sz, int *bsz) { struct stat64 st; - if (fstat64(fd, &st) < 0) { + if (fstat(fd, &st) < 0) { fprintf(stderr, _("%s: cannot stat the device file \"%s\": %s\n"), progname, path, strerror(errno)); diff --git a/libxfs/linux.c b/libxfs/linux.c index c9f2baf..175156d 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -129,7 +129,7 @@ platform_flush_device(int fd, dev_t device) if (major(device) == RAMDISK_MAJOR) return; - if (fstat64(fd, &st) < 0) + if (fstat(fd, &st) < 0) return; if (S_ISREG(st.st_mode)) @@ -145,7 +145,7 @@ platform_findsizes(char *path, int fd, long long *sz, int *bsz) __uint64_t size; int error; - if (fstat64(fd, &st) < 0) { + if (fstat(fd, &st) < 0) { fprintf(stderr, _("%s: " "cannot stat the device file \"%s\": %s\n"), progname, path, strerror(errno)); diff --git a/mkfs/proto.c b/mkfs/proto.c index 5f7f0b4..a008801 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -784,7 +784,7 @@ filesize( { struct stat64 stb; - if (fstat64(fd, &stb) < 0) + if (fstat(fd, &stb) < 0) return -1; return (long)stb.st_size; } diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 50a1ac9..4986cc5 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -670,7 +670,7 @@ main(int argc, char **argv) int fd = libxfs_device_to_fd(x.ddev); struct stat64 statbuf; - if (fstat64(fd, &statbuf) < 0) + if (fstat(fd, &statbuf) < 0) do_warn(_("%s: couldn't stat \"%s\"\n"), progname, fs_name); else if (S_ISREG(statbuf.st_mode)) -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 829C77CDC for ; Sun, 7 Aug 2016 02:35:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 452908F8035 for ; Sun, 7 Aug 2016 00:35:48 -0700 (PDT) X-ASG-Debug-ID: 1470555345-0bf8157e6c536010001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id kG2k0HFHiNgVuHbX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:46 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 0AFB120850 for ; Sun, 7 Aug 2016 09:35:45 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQS4DGbz104R for ; Sun, 7 Aug 2016 09:35:44 +0200 (CEST) X-Mailbox-Line: From 903a519209407e8815607e741bf24027b07408ca Mon Sep 17 00:00:00 2001 Message-Id: <903a519209407e8815607e741bf24027b07408ca.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:45 +0200 Subject: [PATCH xfsprogs 04/14] replace lstat64 by equivalent lstat To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 04/14] replace lstat64 by equivalent lstat X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555345 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1303 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- fsr/xfs_fsr.c | 4 ++-- include/darwin.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 2eaf1e7..6099dc2 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -327,7 +327,7 @@ main(int argc, char **argv) for (; optind < argc; optind++) { argname = argv[optind]; - if (lstat64(argname, &sb) < 0) { + if (lstat(argname, &sb) < 0) { fprintf(stderr, _("%s: could not stat: %s: %s\n"), progname, argname, strerror(errno)); @@ -510,7 +510,7 @@ fsrallfs(char *mtab, int howlong, char *leftofffile) fs = fsbase; /* where'd we leave off last time? */ - if (lstat64(leftofffile, &sb) == 0) { + if (lstat(leftofffile, &sb) == 0) { if ( (fd = open(leftofffile, O_RDONLY)) == -1 ) { fsrprintf(_("%s: open failed\n"), leftofffile); } diff --git a/include/darwin.h b/include/darwin.h index 1666294..6d24957 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -222,7 +222,6 @@ static inline int timer_gettime (timer_t timerid, struct itimerspec *value) #include #include #define statvfs64 statfs -#define lstat64 lstat #define _PATH_MOUNTED "/etc/mtab" struct mntent -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EAE287CE1 for ; Sun, 7 Aug 2016 02:35:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD1078F8035 for ; Sun, 7 Aug 2016 00:35:49 -0700 (PDT) X-ASG-Debug-ID: 1470555346-0bf57c1368420100001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id qsHIU8a5cfiZScMW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:46 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id AA2EB20A8B for ; Sun, 7 Aug 2016 09:35:45 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQT1VVyz1043 for ; Sun, 7 Aug 2016 09:35:45 +0200 (CEST) X-Mailbox-Line: From bee6ac493d2b83099fb367f425e808c73e5888fa Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:47 +0200 Subject: [PATCH xfsprogs 05/14] replace stat64 by equivalent stat To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 05/14] replace stat64 by equivalent stat X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555346 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 19610 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- copy/xfs_copy.c | 6 +++--- fsr/xfs_fsr.c | 26 +++++++++++++------------- include/darwin.h | 3 +-- include/freebsd.h | 1 - io/copy_file_range.c | 2 +- io/open.c | 6 +++--- io/sendfile.c | 2 +- libxcmd/paths.c | 4 ++-- libxfs/darwin.c | 6 +++--- libxfs/freebsd.c | 8 ++++---- libxfs/init.c | 10 +++++----- libxfs/init.h | 6 +++--- libxfs/irix.c | 6 +++--- libxfs/linux.c | 16 ++++++++-------- mdrestore/xfs_mdrestore.c | 6 +++--- mkfs/proto.c | 2 +- mkfs/xfs_mkfs.c | 4 ++-- po/de.po | 8 ++++---- po/pl.po | 8 ++++---- repair/xfs_repair.c | 2 +- rtcp/xfs_rtcp.c | 18 +++++++++--------- 21 files changed, 74 insertions(+), 76 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 6dcc51a..55a9e2c 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -28,7 +28,7 @@ #define rounddown(x, y) (((x)/(y))*(y)) #define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) -extern int platform_check_ismounted(char *, char *, struct stat64 *, int); +extern int platform_check_ismounted(char *, char *, struct stat *, int); int logfd; char *logfile_name; @@ -560,7 +560,7 @@ main(int argc, char **argv) extern int optind; libxfs_init_t xargs; thread_args *tcarg; - struct stat64 statbuf; + struct stat statbuf; progname = basename(argv[0]); @@ -792,7 +792,7 @@ main(int argc, char **argv) for (i = 0; i < num_targets; i++) { int write_last_block = 0; - if (stat64(target[i].name, &statbuf) < 0) { + if (stat(target[i].name, &statbuf) < 0) { /* ok, assume it's a file and create it */ do_out(_("Creating file %s\n"), target[i].name); diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 6099dc2..36e0705 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -174,12 +174,12 @@ aborter(int unused) * of that. */ static char * -find_mountpoint_check(struct stat64 *sb, struct mntent *t) +find_mountpoint_check(struct stat *sb, struct mntent *t) { - struct stat64 ms; + struct stat ms; if (S_ISDIR(sb->st_mode)) { /* mount point */ - if (stat64(t->mnt_dir, &ms) < 0) + if (stat(t->mnt_dir, &ms) < 0) return NULL; if (sb->st_ino != ms.st_ino) return NULL; @@ -188,7 +188,7 @@ find_mountpoint_check(struct stat64 *sb, struct mntent *t) if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0) return NULL; } else { /* device */ - if (stat64(t->mnt_fsname, &ms) < 0) + if (stat(t->mnt_fsname, &ms) < 0) return NULL; if (sb->st_rdev != ms.st_rdev) return NULL; @@ -198,7 +198,7 @@ find_mountpoint_check(struct stat64 *sb, struct mntent *t) * Make sure the mountpoint given by mtab is accessible * before using it. */ - if (stat64(t->mnt_dir, &ms) < 0) + if (stat(t->mnt_dir, &ms) < 0) return NULL; } @@ -206,7 +206,7 @@ find_mountpoint_check(struct stat64 *sb, struct mntent *t) } static char * -find_mountpoint(char *mtab, char *argname, struct stat64 *sb) +find_mountpoint(char *mtab, char *argname, struct stat *sb) { struct mntent_cursor cursor; struct mntent *t = NULL; @@ -230,7 +230,7 @@ find_mountpoint(char *mtab, char *argname, struct stat64 *sb) int main(int argc, char **argv) { - struct stat64 sb; + struct stat sb; char *argname; int c; char *mntp; @@ -335,9 +335,9 @@ main(int argc, char **argv) } if (S_ISLNK(sb.st_mode)) { - struct stat64 sb2; + struct stat sb2; - if (stat64(argname, &sb2) == 0 && + if (stat(argname, &sb2) == 0 && (S_ISBLK(sb2.st_mode) || S_ISCHR(sb2.st_mode))) sb = sb2; @@ -405,7 +405,7 @@ initallfs(char *mtab) struct mntent *mnt= NULL; int mi; char *cp; - struct stat64 sb; + struct stat sb; /* malloc a number of descriptors, increased later if needed */ if (!(fsbase = (fsdesc_t *)malloc(fsbufsize * sizeof(fsdesc_t)))) { @@ -427,7 +427,7 @@ initallfs(char *mtab) int rw = 0; if (strcmp(mnt->mnt_type, MNTTYPE_XFS ) != 0 || - stat64(mnt->mnt_fsname, &sb) == -1 || + stat(mnt->mnt_fsname, &sb) == -1 || !S_ISBLK(sb.st_mode)) continue; @@ -502,7 +502,7 @@ fsrallfs(char *mtab, int howlong, char *leftofffile) char *ptr; xfs_ino_t startino = 0; fsdesc_t *fsp; - struct stat64 sb, sb2; + struct stat sb, sb2; fsrprintf("xfs_fsr -m %s -t %d -f %s ...\n", mtab, howlong, leftofffile); @@ -1027,7 +1027,7 @@ fsr_setup_attr_fork( xfs_bstat_t *bstatp) { #ifdef HAVE_FSETXATTR - struct stat64 tstatbuf; + struct stat tstatbuf; int i; int diff = 0; int last_forkoff = 0; diff --git a/include/darwin.h b/include/darwin.h index 6d24957..8708324 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,7 +141,6 @@ typedef u_int64_t xfs_ino_t; typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; -#define stat64 stat #define lseek64 lseek #define pread64 pread #define pwrite64 pwrite @@ -221,7 +220,7 @@ static inline int timer_gettime (timer_t timerid, struct itimerspec *value) # include #include #include -#define statvfs64 statfs +#define statvfs64 statfs #define _PATH_MOUNTED "/etc/mtab" struct mntent diff --git a/include/freebsd.h b/include/freebsd.h index d6e75f4..f7ab8fa 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -36,7 +36,6 @@ /* FreeBSD file API is 64-bit aware */ #define ftruncate64 ftruncate #define lseek64 lseek -#define stat64 stat #define pwrite64 pwrite #define pread64 pread #define fdatasync fsync diff --git a/io/copy_file_range.c b/io/copy_file_range.c index a354fab..7ba42b6 100644 --- a/io/copy_file_range.c +++ b/io/copy_file_range.c @@ -60,7 +60,7 @@ copy_file_range(int fd, loff_t *src, loff_t *dst, size_t len) static off64_t copy_src_filesize(int fd) { - struct stat64 st; + struct stat st; if (fstat(fd, &st) < 0) { perror("fstat"); diff --git a/io/open.c b/io/open.c index 766ac48..d4ec13c 100644 --- a/io/open.c +++ b/io/open.c @@ -52,7 +52,7 @@ static long extsize; off64_t filesize(void) { - struct stat64 st; + struct stat st; if (fstat(file->fd, &st) < 0) { perror("fstat"); @@ -90,7 +90,7 @@ stat_f( { struct dioattr dio; struct fsxattr fsx, fsxa; - struct stat64 st; + struct stat st; int verbose = (argc == 2 && !strcmp(argv[1], "-v")); printf(_("fd.path = \"%s\"\n"), file->name); @@ -574,7 +574,7 @@ static int set_extsize(const char *path, int fd, long extsz) { struct fsxattr fsx; - struct stat64 stat; + struct stat stat; if (fstat(fd, &stat) < 0) { perror("fstat"); diff --git a/io/sendfile.c b/io/sendfile.c index 0dc6154..c082acf 100644 --- a/io/sendfile.c +++ b/io/sendfile.c @@ -133,7 +133,7 @@ sendfile_f( goto done; } } else { - struct stat64 stat; + struct stat stat; if (fstat(fd, &stat) < 0) { perror("fstat"); diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 71af25f..bd91ae0 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -43,9 +43,9 @@ fs_device_number( const char *name, dev_t *devnum) { - struct stat64 sbuf; + struct stat sbuf; - if (stat64(name, &sbuf) < 0) + if (stat(name, &sbuf) < 0) return errno; /* * We want to match st_rdev if the path provided is a device diff --git a/libxfs/darwin.c b/libxfs/darwin.c index 3923473..bc552ba 100644 --- a/libxfs/darwin.c +++ b/libxfs/darwin.c @@ -27,13 +27,13 @@ int platform_has_uuid = 1; extern char *progname; int -platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) +platform_check_ismounted(char *name, char *block, struct stat *s, int verbose) { return 0; } int -platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) +platform_check_iswritable(char *name, char *block, struct stat *s, int fatal) { int fd, writable; @@ -69,7 +69,7 @@ void platform_findsizes(char *path, int fd, long long *sz, int *bsz) { __uint64_t size; - struct stat64 st; + struct stat st; if (fstat(fd, &st) < 0) { fprintf(stderr, diff --git a/libxfs/freebsd.c b/libxfs/freebsd.c index 6c9f089..1f1b5b9 100644 --- a/libxfs/freebsd.c +++ b/libxfs/freebsd.c @@ -27,14 +27,14 @@ int platform_has_uuid = 1; extern char *progname; int -platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) +platform_check_ismounted(char *name, char *block, struct stat *s, int verbose) { - struct stat64 st; + struct stat st; int cnt, i; struct statfs *fsinfo; if (!s) { - if (stat64(block, &st) < 0) + if (stat(block, &st) < 0) return 0; s = &st; } @@ -66,7 +66,7 @@ platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) } int -platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) +platform_check_iswritable(char *name, char *block, struct stat *s, int fatal) { int cnt, i; struct statfs *fsinfo; diff --git a/libxfs/init.c b/libxfs/init.c index 919a510..2057320 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -65,9 +65,9 @@ static struct dev_to_fd { static int check_isactive(char *name, char *block, int fatal) { - struct stat64 st; + struct stat st; - if (stat64(block, &st) < 0) + if (stat(block, &st) < 0) return 0; if ((st.st_mode & S_IFMT) != S_IFBLK) return 0; @@ -104,7 +104,7 @@ libxfs_device_open(char *path, int creat, int xflags, int setblksize) dev_t dev; int fd, d, flags; int readonly, dio, excl; - struct stat64 statb; + struct stat statb; readonly = (xflags & LIBXFS_ISREADONLY); excl = (xflags & LIBXFS_EXCLUSIVELY) && !creat; @@ -199,9 +199,9 @@ check_open(char *path, int flags, char **rawfile, char **blockfile) int readonly = (flags & LIBXFS_ISREADONLY); int inactive = (flags & LIBXFS_ISINACTIVE); int dangerously = (flags & LIBXFS_DANGEROUSLY); - struct stat64 stbuf; + struct stat stbuf; - if (stat64(path, &stbuf) < 0) { + if (stat(path, &stbuf) < 0) { perror(path); return 0; } diff --git a/libxfs/init.h b/libxfs/init.h index 112febb..baf2f68 100644 --- a/libxfs/init.h +++ b/libxfs/init.h @@ -18,12 +18,12 @@ #ifndef LIBXFS_INIT_H #define LIBXFS_INIT_H -struct stat64; +struct stat; extern int platform_check_ismounted (char *path, char *block, - struct stat64 *sptr, int verbose); + struct stat *sptr, int verbose); extern int platform_check_iswritable (char *path, char *block, - struct stat64 *sptr, int fatal); + struct stat *sptr, int fatal); extern int platform_set_blocksize (int fd, char *path, dev_t device, int bsz, int fatal); extern void platform_flush_device (int fd, dev_t device); extern char *platform_findrawpath(char *path); diff --git a/libxfs/irix.c b/libxfs/irix.c index 532ea34..a3bd832 100644 --- a/libxfs/irix.c +++ b/libxfs/irix.c @@ -25,13 +25,13 @@ extern char *progname; extern __int64_t findsize(char *); int -platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) +platform_check_ismounted(char *name, char *block, struct stat *s, int verbose) { return 0; } int -platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) +platform_check_iswritable(char *name, char *block, struct stat *s, int fatal) { return 1; } @@ -51,7 +51,7 @@ platform_flush_device(int fd, dev_t device) void platform_findsizes(char *path, int fd, long long *sz, int *bsz) { - struct stat64 st; + struct stat st; if (fstat(fd, &st) < 0) { fprintf(stderr, diff --git a/libxfs/linux.c b/libxfs/linux.c index 175156d..7da6dd6 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -49,14 +49,14 @@ static int max_block_alignment; #define PROC_MOUNTED "/proc/mounts" int -platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) +platform_check_ismounted(char *name, char *block, struct stat *s, int verbose) { /* Pad ust; pre-2.6.28 linux copies out too much in 32bit compat mode */ struct ustat ust[2]; - struct stat64 st; + struct stat st; if (!s) { - if (stat64(block, &st) < 0) + if (stat(block, &st) < 0) return 0; if ((st.st_mode & S_IFMT) != S_IFBLK) return 0; @@ -74,11 +74,11 @@ platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) } int -platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) +platform_check_iswritable(char *name, char *block, struct stat *s, int fatal) { int sts = 0; FILE *f; - struct stat64 mst; + struct stat mst; struct mntent *mnt; char mounts[MAXPATHLEN]; @@ -89,7 +89,7 @@ platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) return fatal; } while ((mnt = getmntent(f)) != NULL) { - if (stat64(mnt->mnt_fsname, &mst) < 0) + if (stat(mnt->mnt_fsname, &mst) < 0) continue; if ((mst.st_mode & S_IFMT) != S_IFBLK) continue; @@ -125,7 +125,7 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata void platform_flush_device(int fd, dev_t device) { - struct stat64 st; + struct stat st; if (major(device) == RAMDISK_MAJOR) return; @@ -141,7 +141,7 @@ platform_flush_device(int fd, dev_t device) void platform_findsizes(char *path, int fd, long long *sz, int *bsz) { - struct stat64 st; + struct stat st; __uint64_t size; int error; diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index a22efc2..26d61eb 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -197,7 +197,7 @@ usage(void) exit(1); } -extern int platform_check_ismounted(char *, char *, struct stat64 *, int); +extern int platform_check_ismounted(char *, char *, struct stat *, int); int main( @@ -208,7 +208,7 @@ main( int dst_fd; int c; int open_flags; - struct stat64 statbuf; + struct stat statbuf; int is_target_file; progname = basename(argv[0]); @@ -244,7 +244,7 @@ main( /* check and open target */ open_flags = O_RDWR; is_target_file = 0; - if (stat64(argv[optind], &statbuf) < 0) { + if (stat(argv[optind], &statbuf) < 0) { /* ok, assume it's a file and create it */ open_flags |= O_CREAT; is_target_file = 1; diff --git a/mkfs/proto.c b/mkfs/proto.c index a008801..7de0a99 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -782,7 +782,7 @@ static long filesize( int fd) { - struct stat64 stb; + struct stat stb; if (fstat(fd, &stb) < 0) return -1; diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 8b02983..8b98a8a 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -794,7 +794,7 @@ check_device_type( bool force_overwrite, const char *optname) { - struct stat64 statbuf; + struct stat statbuf; if (*isfile && (no_size || no_name)) { fprintf(stderr, @@ -808,7 +808,7 @@ check_device_type( usage(); } - if (stat64(name, &statbuf)) { + if (stat(name, &statbuf)) { if (errno == ENOENT && *isfile) { if (create) *create = 1; diff --git a/po/de.po b/po/de.po index fc62525..61a60f3 100644 --- a/po/de.po +++ b/po/de.po @@ -13873,8 +13873,8 @@ msgstr "%s: Dateien zum Kopieren müssen angegeben werden\n" #: .././rtcp/xfs_rtcp.c:86 #, c-format -msgid "%s: stat64 of %s failed\n" -msgstr "%s: stat64 von %s fehlgeschlagen\n" +msgid "%s: stat of %s failed\n" +msgstr "%s: stat von %s fehlgeschlagen\n" #: .././rtcp/xfs_rtcp.c:93 #, c-format @@ -13883,8 +13883,8 @@ msgstr "%s: letztes Argument ist kein Verzeichnis\n" #: .././rtcp/xfs_rtcp.c:140 #, c-format -msgid "%s: failed stat64 on %s: %s\n" -msgstr "%s: stat64 auf %s fehlgeschlagen: %s\n" +msgid "%s: failed stat on %s: %s\n" +msgstr "%s: stat auf %s fehlgeschlagen: %s\n" #: .././rtcp/xfs_rtcp.c:161 #, c-format diff --git a/po/pl.po b/po/pl.po index a950f77..9d5128f 100644 --- a/po/pl.po +++ b/po/pl.po @@ -13005,8 +13005,8 @@ msgstr "%s: trzeba podać pliki do skopiowania\n" #: .././rtcp/xfs_rtcp.c:84 #, c-format -msgid "%s: stat64 of %s failed\n" -msgstr "%s: stat64 na %s nie powiodÅ‚o siÄ™\n" +msgid "%s: stat of %s failed\n" +msgstr "%s: stat na %s nie powiodÅ‚o siÄ™\n" #: .././rtcp/xfs_rtcp.c:91 #, c-format @@ -13015,8 +13015,8 @@ msgstr "%s: ostatni argument nie jest katalogiem\n" #: .././rtcp/xfs_rtcp.c:138 #, c-format -msgid "%s: failed stat64 on %s: %s\n" -msgstr "%s: nie udaÅ‚o siÄ™ wykonać stat64 na %s: %s\n" +msgid "%s: failed stat on %s: %s\n" +msgstr "%s: nie udaÅ‚o siÄ™ wykonać stat na %s: %s\n" #: .././rtcp/xfs_rtcp.c:159 #, c-format diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 4986cc5..361bace 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -668,7 +668,7 @@ main(int argc, char **argv) /* -f forces this, but let's be nice and autodetect it, as well. */ if (!isa_file) { int fd = libxfs_device_to_fd(x.ddev); - struct stat64 statbuf; + struct stat statbuf; if (fstat(fd, &statbuf) < 0) do_warn(_("%s: couldn't stat \"%s\"\n"), diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c index 3044350..705e958 100644 --- a/rtcp/xfs_rtcp.c +++ b/rtcp/xfs_rtcp.c @@ -35,7 +35,7 @@ int main(int argc, char **argv) { int c, i, r, errflg = 0; - struct stat64 s2; + struct stat s2; int extsize = - 1; progname = basename(argv[0]); @@ -80,8 +80,8 @@ main(int argc, char **argv) * which really exists. */ if (argc > 2) { - if (stat64(argv[argc-1], &s2) < 0) { - fprintf(stderr, _("%s: stat64 of %s failed\n"), + if (stat(argv[argc-1], &s2) < 0) { + fprintf(stderr, _("%s: stat of %s failed\n"), progname, argv[argc-1]); exit(2); } @@ -115,7 +115,7 @@ rtcp( char *source, char *target, int fextsize) int remove = 0, rtextsize; char *sp, *fbuf, *ptr; char tbuf[ PATH_MAX ]; - struct stat64 s1, s2; + struct stat s1, s2; struct fsxattr fsxattr; struct dioattr dioattr; @@ -134,8 +134,8 @@ rtcp( char *source, char *target, int fextsize) *sp = '\0'; } - if ( stat64(source, &s1) ) { - fprintf(stderr, _("%s: failed stat64 on %s: %s\n"), + if ( stat(source, &s1) ) { + fprintf(stderr, _("%s: failed stat on %s: %s\n"), progname, source, strerror(errno)); return( -1); } @@ -144,7 +144,7 @@ rtcp( char *source, char *target, int fextsize) * check for a realtime partition */ snprintf(tbuf, sizeof(tbuf), "%s", target); - if ( stat64(target, &s2) ) { + if ( stat(target, &s2) ) { if (!S_ISDIR(s2.st_mode)) { /* take out target file name */ if ((ptr = strrchr(tbuf, '/')) != NULL) @@ -165,14 +165,14 @@ rtcp( char *source, char *target, int fextsize) * check if target is a directory */ snprintf(tbuf, sizeof(tbuf), "%s", target); - if ( !stat64(target, &s2) ) { + if ( !stat(target, &s2) ) { if (S_ISDIR(s2.st_mode)) { snprintf(tbuf, sizeof(tbuf), "%s/%s", target, basename(source)); } } - if ( stat64(tbuf, &s2) ) { + if ( stat(tbuf, &s2) ) { /* * create the file if it does not exist */ -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DEB517CE2 for ; Sun, 7 Aug 2016 02:35:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35BDEAC003 for ; Sun, 7 Aug 2016 00:35:50 -0700 (PDT) X-ASG-Debug-ID: 1470555348-0bf57c1369420110001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id yx07wpOReHblVTgc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:48 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id E8C0A20A94 for ; Sun, 7 Aug 2016 09:35:47 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQW3f0CzysK for ; Sun, 7 Aug 2016 09:35:47 +0200 (CEST) X-Mailbox-Line: From 381255cfec13dc45dd4fe2232e94dc6ead92952b Mon Sep 17 00:00:00 2001 Message-Id: <381255cfec13dc45dd4fe2232e94dc6ead92952b.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 13:03:16 +0200 Subject: [PATCH xfsprogs 10/14] replace sendfile64 by equivalent sendfile To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 10/14] replace sendfile64 by equivalent sendfile X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555348 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 598 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- io/sendfile.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io/sendfile.c b/io/sendfile.c index c082acf..edd31c9 100644 --- a/io/sendfile.c +++ b/io/sendfile.c @@ -56,11 +56,11 @@ send_buffer( *total = 0; while (count > 0) { - bytes = sendfile64(file->fd, fd, &off, bytes_remaining); + bytes = sendfile(file->fd, fd, &off, bytes_remaining); if (bytes == 0) break; if (bytes < 0) { - perror("sendfile64"); + perror("sendfile"); return -1; } ops++; -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C45047CDC for ; Sun, 7 Aug 2016 02:35:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7D6BC8F8035 for ; Sun, 7 Aug 2016 00:35:50 -0700 (PDT) X-ASG-Debug-ID: 1470555347-0bf57b369e48b120001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id UzXzfK1KjuTLBJ5W (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:48 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 224D520A78 for ; Sun, 7 Aug 2016 09:35:47 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQV4hsFz1043 for ; Sun, 7 Aug 2016 09:35:46 +0200 (CEST) X-Mailbox-Line: From 54046df0c8591a0c5678dee87a8c8aba02ea1d88 Mon Sep 17 00:00:00 2001 Message-Id: <54046df0c8591a0c5678dee87a8c8aba02ea1d88.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:52 +0200 Subject: [PATCH xfsprogs 08/14] replace pread64 by equivalent pread To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 08/14] replace pread64 by equivalent pread X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555348 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2824 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- include/darwin.h | 1 - include/freebsd.h | 1 - io/pread.c | 10 +++++----- libxfs/rdwr.c | 2 +- repair/prefetch.c | 2 +- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/include/darwin.h b/include/darwin.h index 850d733..f4dbd9f 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,7 +141,6 @@ typedef u_int64_t xfs_ino_t; typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; -#define pread64 pread #define pwrite64 pwrite #define fdatasync fsync #define memalign(a,sz) valloc(sz) diff --git a/include/freebsd.h b/include/freebsd.h index 784e287..041dafe 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -35,7 +35,6 @@ /* FreeBSD file API is 64-bit aware */ #define pwrite64 pwrite -#define pread64 pread #define fdatasync fsync #define memalign(a,sz) valloc(sz) diff --git a/io/pread.c b/io/pread.c index cafead0..3395503 100644 --- a/io/pread.c +++ b/io/pread.c @@ -214,7 +214,7 @@ do_pread( ssize_t buffer_size) { if (!vectors) - return pread64(fd, buffer, min(count, buffer_size), offset); + return pread(fd, buffer, min(count, buffer_size), offset); return do_preadv(fd, offset, count, buffer_size); } @@ -254,7 +254,7 @@ read_random( if (bytes == 0) break; if (bytes < 0) { - perror("pread64"); + perror("pread"); return -1; } ops++; @@ -296,7 +296,7 @@ read_backward( if (bytes == 0) return ops; if (bytes < 0) { - perror("pread64"); + perror("pread"); return -1; } ops++; @@ -314,7 +314,7 @@ read_backward( if (bytes == 0) break; if (bytes < 0) { - perror("pread64"); + perror("pread"); return -1; } ops++; @@ -345,7 +345,7 @@ read_forward( if (bytes == 0) break; if (bytes < 0) { - perror("pread64"); + perror("pread"); return -1; } ops++; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index cb74b3c..36c39d9 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -915,7 +915,7 @@ __read_buf(int fd, void *buf, int len, off64_t offset, int flags) { int sts; - sts = pread64(fd, buf, len, offset); + sts = pread(fd, buf, len, offset); if (sts < 0) { int error = errno; fprintf(stderr, _("%s: read failed: %s\n"), diff --git a/repair/prefetch.c b/repair/prefetch.c index b4f20d9..175594c 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -565,7 +565,7 @@ pf_batch_read( /* * now read the data and put into the xfs_but_t's */ - len = pread64(mp_fd, buf, (int)(last_off - first_off), first_off); + len = pread(mp_fd, buf, (int)(last_off - first_off), first_off); /* * Check the last buffer on the list to see if we need to -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2DA607CE8 for ; Sun, 7 Aug 2016 02:35:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 71522AC001 for ; Sun, 7 Aug 2016 00:35:50 -0700 (PDT) X-ASG-Debug-ID: 1470555346-0bf57c1367420100001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id Jrcdto8EBiizg3Gi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:47 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id B0EAA20A76 for ; Sun, 7 Aug 2016 09:35:46 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQV1pBqz1043 for ; Sun, 7 Aug 2016 09:35:46 +0200 (CEST) X-Mailbox-Line: From 63ec40703b14df0c99b2d479dc1739c3a2fb3064 Mon Sep 17 00:00:00 2001 Message-Id: <63ec40703b14df0c99b2d479dc1739c3a2fb3064.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:50 +0200 Subject: [PATCH xfsprogs 07/14] replace lseek64 by equivalent lseek To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 07/14] replace lseek64 by equivalent lseek X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555347 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11607 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- copy/xfs_copy.c | 10 +++++----- fsr/xfs_fsr.c | 10 +++++----- include/darwin.h | 1 - include/freebsd.h | 1 - io/pread.c | 6 +++--- io/seek.c | 6 +++--- libxfs/rdwr.c | 2 +- logprint/log_misc.c | 4 ++-- logprint/logprint.c | 2 +- po/de.po | 16 ++++++++-------- po/pl.po | 16 ++++++++-------- repair/sb.c | 6 +++--- 12 files changed, 39 insertions(+), 41 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index f038c2e..cc5207d 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -162,7 +162,7 @@ check_errors(void) if (target[i].err_type == 0) do_log(_("write error")); else - do_log(_("lseek64 error")); + do_log(_("lseek error")); do_log(_(" at offset %lld\n"), target[i].position); } } @@ -192,7 +192,7 @@ do_write( buf = &w_buf; if (target[args->id].position != buf->position) { - if (lseek64(args->fd, buf->position, SEEK_SET) < 0) { + if (lseek(args->fd, buf->position, SEEK_SET) < 0) { error = target[args->id].err_type = 1; } else { target[args->id].position = buf->position; @@ -263,7 +263,7 @@ handler(int sig) target[i].position); } else { do_warn( - _("%s: lseek64 error on target %d \"%s\" at offset %lld\n"), + _("%s: lseek error on target %d \"%s\" at offset %lld\n"), progname, i, target[i].name, target[i].position); } @@ -388,9 +388,9 @@ read_wbuf(int fd, wbuf *buf, xfs_mount_t *mp) } if (source_position != buf->position) { - lres = lseek64(fd, buf->position, SEEK_SET); + lres = lseek(fd, buf->position, SEEK_SET); if (lres < 0LL) { - do_warn(_("%s: lseek64 failure at offset %lld\n"), + do_warn(_("%s: lseek failure at offset %lld\n"), progname, source_position); die_perror(); } diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index d87d020..98390e7 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1318,7 +1318,7 @@ packfile(char *fname, char *tname, int fd, fsrprintf(_("could not trunc tmp %s\n"), tname); } - if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { + if (lseek(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { fsrprintf(_("could not lseek in tmpfile: %s : %s\n"), tname, strerror(errno)); goto out; @@ -1338,7 +1338,7 @@ packfile(char *fname, char *tname, int fd, " %s\n"), tname); goto out; } - if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { + if (lseek(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { fsrprintf(_("could not lseek in tmpfile: %s : %s\n"), tname, strerror(errno)); goto out; @@ -1346,7 +1346,7 @@ packfile(char *fname, char *tname, int fd, } } /* end of space allocation loop */ - if (lseek64(tfd, 0, SEEK_SET)) { + if (lseek(tfd, 0, SEEK_SET)) { fsrprintf(_("Couldn't rewind on temporary file\n")); goto out; } @@ -1366,12 +1366,12 @@ packfile(char *fname, char *tname, int fd, for (extent = 0; extent < nextents; extent++) { pos = outmap[extent].bmv_offset; if (outmap[extent].bmv_block == -1) { - if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { + if (lseek(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { fsrprintf(_("could not lseek in tmpfile: %s : %s\n"), tname, strerror(errno)); goto out; } - if (lseek64(fd, outmap[extent].bmv_length, SEEK_CUR) < 0) { + if (lseek(fd, outmap[extent].bmv_length, SEEK_CUR) < 0) { fsrprintf(_("could not lseek in file: %s : %s\n"), fname, strerror(errno)); goto out; diff --git a/include/darwin.h b/include/darwin.h index 5c149a0..850d733 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,7 +141,6 @@ typedef u_int64_t xfs_ino_t; typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; -#define lseek64 lseek #define pread64 pread #define pwrite64 pwrite #define fdatasync fsync diff --git a/include/freebsd.h b/include/freebsd.h index f5e7fa9..784e287 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -34,7 +34,6 @@ #define __LITTLE_ENDIAN LITTLE_ENDIAN /* FreeBSD file API is 64-bit aware */ -#define lseek64 lseek #define pwrite64 pwrite #define pread64 pread #define fdatasync fsync diff --git a/io/pread.c b/io/pread.c index b98355f..cafead0 100644 --- a/io/pread.c +++ b/io/pread.c @@ -233,7 +233,7 @@ read_random( int ops = 0; srandom(seed); - end = lseek64(fd, 0, SEEK_END); + end = lseek(fd, 0, SEEK_END); offset = (eof || offset > end) ? end : offset; if ((bytes = (offset % buffersize))) offset -= bytes; @@ -279,8 +279,8 @@ read_backward( long long cnt = *count; int ops = 0; - end = lseek64(fd, 0, SEEK_END); - off = eof ? end : min(end, lseek64(fd, off, SEEK_SET)); + end = lseek(fd, 0, SEEK_END); + off = eof ? end : min(end, lseek(fd, off, SEEK_SET)); if ((end = off - cnt) < 0) { cnt += end; /* subtraction, end is negative */ end = 0; diff --git a/io/seek.c b/io/seek.c index 35a369e..d06375d 100644 --- a/io/seek.c +++ b/io/seek.c @@ -147,7 +147,7 @@ seek_f( * decide if we want to display that type of entry. */ if (flag & SEEK_HFLAG) { - offset = lseek64(file->fd, start, SEEK_HOLE); + offset = lseek(file->fd, start, SEEK_HOLE); if ((start == offset) || !(flag & SEEK_DFLAG)) { /* * this offset is a hole or are only displaying holes. @@ -162,7 +162,7 @@ seek_f( /* The offset is not a hole, or we are looking just for data */ current = DATA; - offset = lseek64(file->fd, start, SEEK_DATA); + offset = lseek(file->fd, start, SEEK_DATA); found_hole: /* @@ -202,7 +202,7 @@ found_hole: current ^= 1; /* alternate between data and hole */ start = offset; - offset = lseek64(file->fd, start, seekinfo[current].seektype); + offset = lseek(file->fd, start, seekinfo[current].seektype); } return 0; } diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 0ec38c5..cb74b3c 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -88,7 +88,7 @@ libxfs_device_zero(struct xfs_buftarg *btp, xfs_daddr_t start, uint len) fd = libxfs_device_to_fd(btp->dev); start_offset = LIBXFS_BBTOOFF64(start); - if ((lseek64(fd, start_offset, SEEK_SET)) < 0) { + if ((lseek(fd, start_offset, SEEK_SET)) < 0) { fprintf(stderr, _("%s: %s seek to offset %llu failed: %s\n"), progname, __FUNCTION__, (unsigned long long)start_offset, strerror(errno)); diff --git a/logprint/log_misc.c b/logprint/log_misc.c index e6ee832..8a687d5 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -887,8 +887,8 @@ xlog_print_lseek(struct xlog *log, int fd, xfs_daddr_t blkno, int whence) offset = BBTOOFF64(blkno+log->l_logBBstart); else offset = BBTOOFF64(blkno); - if (lseek64(fd, offset, whence) < 0) { - fprintf(stderr, _("%s: lseek64 to %lld failed: %s\n"), + if (lseek(fd, offset, whence) < 0) { + fprintf(stderr, _("%s: lseek to %lld failed: %s\n"), progname, (long long)offset, strerror(errno)); exit(1); } diff --git a/logprint/logprint.c b/logprint/logprint.c index a5c9b32..37b8cb9 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -80,7 +80,7 @@ logstat(xfs_mount_t *mp) x.dname, strerror(errno)); exit(1); } - lseek64(fd, 0, SEEK_SET); + lseek(fd, 0, SEEK_SET); if (read(fd, buf, sizeof(buf)) != sizeof(buf)) { fprintf(stderr, _(" read of XFS superblock failed\n")); exit(1); diff --git a/po/de.po b/po/de.po index 61a60f3..ff1930e 100644 --- a/po/de.po +++ b/po/de.po @@ -45,8 +45,8 @@ msgid "write error" msgstr "Schreibfehler" #: .././copy/xfs_copy.c:146 -msgid "lseek64 error" -msgstr "lseek64-Fehler" +msgid "lseek error" +msgstr "lseek-Fehler" #: .././copy/xfs_copy.c:147 #, c-format @@ -70,8 +70,8 @@ msgstr "%s: Schreibfehler auf Ziel %d »%s« bei Versatz %lld\n" #: .././copy/xfs_copy.c:260 #, c-format -msgid "%s: lseek64 error on target %d \"%s\" at offset %lld\n" -msgstr "%s: lseek64-Fehler auf Ziel %d »%s« bei Versatz %lld\n" +msgid "%s: lseek error on target %d \"%s\" at offset %lld\n" +msgstr "%s: lseek-Fehler auf Ziel %d »%s« bei Versatz %lld\n" #: .././copy/xfs_copy.c:266 #, c-format @@ -104,8 +104,8 @@ msgstr "Aufruf: %s [-bd] [-L Protokolldatei] Quelle Ziel [Ziel ...]\n" #: .././copy/xfs_copy.c:386 #, c-format -msgid "%s: lseek64 failure at offset %lld\n" -msgstr "%s: lseek64-Fehlschlag bei Versatz %lld\n" +msgid "%s: lseek failure at offset %lld\n" +msgstr "%s: lseek-Fehlschlag bei Versatz %lld\n" #: .././copy/xfs_copy.c:401 #, c-format @@ -6472,8 +6472,8 @@ msgstr "DQUOT: Magische 0x%hx Markierungen 0%ho\n" #: .././logprint/log_misc.c:821 #, c-format -msgid "%s: lseek64 to %lld failed: %s\n" -msgstr "%s: lseek64 auf %lld fehlgeschlagen: %s\n" +msgid "%s: lseek to %lld failed: %s\n" +msgstr "%s: lseek auf %lld fehlgeschlagen: %s\n" #: .././logprint/log_misc.c:864 #, c-format diff --git a/po/pl.po b/po/pl.po index 9d5128f..33a9d81 100644 --- a/po/pl.po +++ b/po/pl.po @@ -44,8 +44,8 @@ msgid "write error" msgstr "błąd zapisu" #: .././copy/xfs_copy.c:146 -msgid "lseek64 error" -msgstr "błąd lseek64" +msgid "lseek error" +msgstr "błąd lseek" #: .././copy/xfs_copy.c:147 #, c-format @@ -69,8 +69,8 @@ msgstr "%s: błąd zapisu przy celu %d \"%s\" pod offsetem %lld\n" #: .././copy/xfs_copy.c:241 #, c-format -msgid "%s: lseek64 error on target %d \"%s\" at offset %lld\n" -msgstr "%s: błąd lseek64 przy celu %d \"%s\" pod offsetem %lld\n" +msgid "%s: lseek error on target %d \"%s\" at offset %lld\n" +msgstr "%s: błąd lseek przy celu %d \"%s\" pod offsetem %lld\n" #: .././copy/xfs_copy.c:247 #, c-format @@ -103,8 +103,8 @@ msgstr "SkÅ‚adnia: %s [-bdV] [-L plik_logu] źródÅ‚o cel [cel ...]\n" #: .././copy/xfs_copy.c:367 #, c-format -msgid "%s: lseek64 failure at offset %lld\n" -msgstr "%s: niepowodzenie lseek64 pod offsetem %lld\n" +msgid "%s: lseek failure at offset %lld\n" +msgstr "%s: niepowodzenie lseek pod offsetem %lld\n" #: .././copy/xfs_copy.c:382 #, c-format @@ -6394,8 +6394,8 @@ msgstr "" #: .././logprint/log_misc.c:863 #, c-format -msgid "%s: lseek64 to %lld failed: %s\n" -msgstr "%s: lseek64 na %lld nie powiodÅ‚o siÄ™: %s\n" +msgid "%s: lseek to %lld failed: %s\n" +msgstr "%s: lseek na %lld nie powiodÅ‚o siÄ™: %s\n" #: .././logprint/log_misc.c:909 #, c-format diff --git a/repair/sb.c b/repair/sb.c index a8170ba..ad1a29f 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -138,7 +138,7 @@ __find_secondary_sb( /* * read disk 1 MByte at a time. */ - if (lseek64(x.dfd, off, SEEK_SET) != off) { + if (lseek(x.dfd, off, SEEK_SET) != off) { done = 1; } @@ -512,7 +512,7 @@ write_primary_sb(xfs_sb_t *sbp, int size) } memset(buf, 0, size); - if (lseek64(x.dfd, 0LL, SEEK_SET) != 0LL) { + if (lseek(x.dfd, 0LL, SEEK_SET) != 0LL) { free(buf); do_error(_("couldn't seek to offset 0 in filesystem\n")); } @@ -551,7 +551,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) /* try and read it first */ - if (lseek64(x.dfd, off, SEEK_SET) != off) { + if (lseek(x.dfd, off, SEEK_SET) != off) { do_warn( _("error reading superblock %u -- seek to offset %" PRId64 " failed\n"), agno, off); -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A487C7CEA for ; Sun, 7 Aug 2016 02:35:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0AB08AC003 for ; Sun, 7 Aug 2016 00:35:47 -0700 (PDT) X-ASG-Debug-ID: 1470555345-0bf57b369d48b110001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id AgzXUUHhDukGgEPF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:46 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 40C1220A78 for ; Sun, 7 Aug 2016 09:35:44 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQR4RCXz104R for ; Sun, 7 Aug 2016 09:35:43 +0200 (CEST) X-Mailbox-Line: From b68fd1777f0e0a4b24ef48a0c6643ce51fa1d8bf Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: References: From: Felix Janda Date: Sun, 7 Aug 2016 07:28:16 +0200 Subject: [PATCH xfsprogs 02/14] remove unecessary definitions of _FILE_OFFSET_BITS To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 02/14] remove unecessary definitions of _FILE_OFFSET_BITS X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555345 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2970 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- now that we use AC_SYS_LARGEFILE, there is no need to explicitly define _FILE_OFFSET_BITS. Signed-off-by: Felix Janda --- include/builddefs.in | 2 +- m4/package_libcdev.m4 | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/include/builddefs.in b/include/builddefs.in index 7153d7a..d406615 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -114,7 +114,7 @@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl ifeq ($(PKG_PLATFORM),linux) -PCFLAGS = -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 $(GCCFLAGS) +PCFLAGS = -D_GNU_SOURCE $(GCCFLAGS) ifeq ($(HAVE_UMODE_T),yes) PCFLAGS += -DHAVE_UMODE_T endif diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 7a847e9..9ef6f80 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -5,7 +5,6 @@ AC_DEFUN([AC_HAVE_FADVISE], [ AC_MSG_CHECKING([for fadvise ]) AC_TRY_COMPILE([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ posix_fadvise(0, 1, 0, POSIX_FADV_NORMAL); @@ -22,7 +21,6 @@ AC_DEFUN([AC_HAVE_MADVISE], [ AC_MSG_CHECKING([for madvise ]) AC_TRY_COMPILE([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ posix_madvise(0, 0, MADV_NORMAL); @@ -39,7 +37,6 @@ AC_DEFUN([AC_HAVE_MINCORE], [ AC_MSG_CHECKING([for mincore ]) AC_TRY_COMPILE([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ mincore(0, 0, 0); @@ -56,7 +53,6 @@ AC_DEFUN([AC_HAVE_SENDFILE], [ AC_MSG_CHECKING([for sendfile ]) AC_TRY_COMPILE([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ sendfile(0, 0, 0, 0); @@ -106,7 +102,6 @@ AC_DEFUN([AC_HAVE_FALLOCATE], [ AC_MSG_CHECKING([for fallocate]) AC_TRY_LINK([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include #include ], [ @@ -124,7 +119,6 @@ AC_DEFUN([AC_HAVE_FIEMAP], [ AC_MSG_CHECKING([for fiemap]) AC_TRY_LINK([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include #include ], [ @@ -142,7 +136,6 @@ AC_DEFUN([AC_HAVE_FIEMAP], AC_DEFUN([AC_HAVE_PREADV], [ AC_MSG_CHECKING([for preadv]) AC_TRY_LINK([ -#define _FILE_OFFSET_BITS 64 #define _BSD_SOURCE #include ], [ @@ -177,7 +170,6 @@ AC_DEFUN([AC_HAVE_SYNC_FILE_RANGE], [ AC_MSG_CHECKING([for sync_file_range]) AC_TRY_LINK([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ sync_file_range(0, 0, 0, 0); @@ -194,7 +186,6 @@ AC_DEFUN([AC_HAVE_SYNCFS], [ AC_MSG_CHECKING([for syncfs]) AC_TRY_LINK([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ syncfs(0); -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8327D7CE9 for ; Sun, 7 Aug 2016 02:35:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DD9A8AC002 for ; Sun, 7 Aug 2016 00:35:50 -0700 (PDT) X-ASG-Debug-ID: 1470555346-0bf57b369c48b110001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id ATpA8pC5kn6reOJe (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:48 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 16D9320A8E for ; Sun, 7 Aug 2016 09:35:46 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQT4TQjz104T for ; Sun, 7 Aug 2016 09:35:45 +0200 (CEST) X-Mailbox-Line: From 9a96c2eedc66f86669643fc59f9ea7d3a6b64321 Mon Sep 17 00:00:00 2001 Message-Id: <9a96c2eedc66f86669643fc59f9ea7d3a6b64321.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:49 +0200 Subject: [PATCH xfsprogs 06/14] replace ftruncate64 by equivalent ftruncate To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 06/14] replace ftruncate64 by equivalent ftruncate X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555347 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3687 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- copy/xfs_copy.c | 2 +- fsr/xfs_fsr.c | 2 +- include/darwin.h | 1 - include/freebsd.h | 1 - io/copy_file_range.c | 4 ++-- io/truncate.c | 2 +- mdrestore/xfs_mdrestore.c | 2 +- mkfs/xfs_mkfs.c | 2 +- 8 files changed, 7 insertions(+), 9 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 55a9e2c..f038c2e 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -832,7 +832,7 @@ main(int argc, char **argv) if (write_last_block) { /* ensure regular files are correctly sized */ - if (ftruncate64(target[i].fd, mp->m_sb.sb_dblocks * + if (ftruncate(target[i].fd, mp->m_sb.sb_dblocks * source_blocksize)) { do_log(_("%s: cannot grow data section.\n"), progname); diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 36e0705..d87d020 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1451,7 +1451,7 @@ packfile(char *fname, char *tname, int fd, } } } - if (ftruncate64(tfd, statp->bs_size) < 0) { + if (ftruncate(tfd, statp->bs_size) < 0) { fsrprintf(_("could not truncate tmpfile: %s : %s\n"), fname, strerror(errno)); goto out; diff --git a/include/darwin.h b/include/darwin.h index 8708324..5c149a0 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -144,7 +144,6 @@ typedef int64_t xfs_daddr_t; #define lseek64 lseek #define pread64 pread #define pwrite64 pwrite -#define ftruncate64 ftruncate #define fdatasync fsync #define memalign(a,sz) valloc(sz) diff --git a/include/freebsd.h b/include/freebsd.h index f7ab8fa..f5e7fa9 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -34,7 +34,6 @@ #define __LITTLE_ENDIAN LITTLE_ENDIAN /* FreeBSD file API is 64-bit aware */ -#define ftruncate64 ftruncate #define lseek64 lseek #define pwrite64 pwrite #define pread64 pread diff --git a/io/copy_file_range.c b/io/copy_file_range.c index 7ba42b6..88203e9 100644 --- a/io/copy_file_range.c +++ b/io/copy_file_range.c @@ -72,9 +72,9 @@ copy_src_filesize(int fd) static int copy_dst_truncate(void) { - int ret = ftruncate64(file->fd, 0); + int ret = ftruncate(file->fd, 0); if (ret < 0) - perror("ftruncate64"); + perror("ftruncate"); return ret; } diff --git a/io/truncate.c b/io/truncate.c index f2df168..20bada8 100644 --- a/io/truncate.c +++ b/io/truncate.c @@ -38,7 +38,7 @@ truncate_f( return 0; } - if (ftruncate64(file->fd, offset) < 0) { + if (ftruncate(file->fd, offset) < 0) { perror("ftruncate"); return 0; } diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 26d61eb..1540dcd 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -124,7 +124,7 @@ perform_restore( if (is_target_file) { /* ensure regular files are correctly sized */ - if (ftruncate64(dst_fd, sb.sb_dblocks * sb.sb_blocksize)) + if (ftruncate(dst_fd, sb.sb_dblocks * sb.sb_blocksize)) fatal("cannot set filesystem image size: %s\n", strerror(errno)); } else { diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 8b98a8a..5d5fcb7 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2815,7 +2815,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), * code will succeed. */ if (xi.disfile && xi.dsize * xi.dbsize < dblocks * blocksize) { - if (ftruncate64(xi.dfd, dblocks * blocksize) < 0) { + if (ftruncate(xi.dfd, dblocks * blocksize) < 0) { fprintf(stderr, _("%s: Growing the data section failed\n"), progname); -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AE6187CEB for ; Sun, 7 Aug 2016 02:35:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 172F0AC006 for ; Sun, 7 Aug 2016 00:35:50 -0700 (PDT) X-ASG-Debug-ID: 1470555347-0bf57c136a420110001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id JPi58X2BAUNVXRr7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:48 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 8CE5720850 for ; Sun, 7 Aug 2016 09:35:47 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQW0mFJz104K for ; Sun, 7 Aug 2016 09:35:47 +0200 (CEST) X-Mailbox-Line: From e62e8eae310f54fee1391ee069e9e6d88a9c5483 Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:54 +0200 Subject: [PATCH xfsprogs 09/14] replace pwrite64 by equivalent pwrite To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 09/14] replace pwrite64 by equivalent pwrite X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555348 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5859 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- copy/xfs_copy.c | 2 +- include/darwin.h | 1 - include/freebsd.h | 1 - io/pwrite.c | 10 +++++----- libxfs/rdwr.c | 6 +++--- mdrestore/xfs_mdrestore.c | 4 ++-- mkfs/xfs_mkfs.c | 2 +- po/de.po | 4 ++-- po/pl.po | 8 ++++---- 9 files changed, 18 insertions(+), 20 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index cc5207d..816ab29 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -860,7 +860,7 @@ main(int argc, char **argv) off = mp->m_sb.sb_dblocks * source_blocksize; off -= sizeof(lb); - if (pwrite64(target[i].fd, lb, sizeof(lb), off) < 0) { + if (pwrite(target[i].fd, lb, sizeof(lb), off) < 0) { do_log(_("%s: failed to write last block\n"), progname); do_log(_("\tIs target \"%s\" too small?\n"), diff --git a/include/darwin.h b/include/darwin.h index f4dbd9f..fb13915 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,7 +141,6 @@ typedef u_int64_t xfs_ino_t; typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; -#define pwrite64 pwrite #define fdatasync fsync #define memalign(a,sz) valloc(sz) diff --git a/include/freebsd.h b/include/freebsd.h index 041dafe..df924ef 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -34,7 +34,6 @@ #define __LITTLE_ENDIAN LITTLE_ENDIAN /* FreeBSD file API is 64-bit aware */ -#define pwrite64 pwrite #define fdatasync fsync #define memalign(a,sz) valloc(sz) diff --git a/io/pwrite.c b/io/pwrite.c index 67631ce..7c0bb7f 100644 --- a/io/pwrite.c +++ b/io/pwrite.c @@ -101,7 +101,7 @@ do_pwrite( ssize_t buffer_size) { if (!vectors) - return pwrite64(fd, buffer, min(count, buffer_size), offset); + return pwrite(fd, buffer, min(count, buffer_size), offset); return do_pwritev(fd, offset, count, buffer_size); } @@ -137,7 +137,7 @@ write_random( if (bytes == 0) break; if (bytes < 0) { - perror("pwrite64"); + perror("pwrite"); return -1; } ops++; @@ -175,7 +175,7 @@ write_backward( if (bytes == 0) return ops; if (bytes < 0) { - perror("pwrite64"); + perror("pwrite"); return -1; } ops++; @@ -193,7 +193,7 @@ write_backward( if (bytes == 0) break; if (bytes < 0) { - perror("pwrite64"); + perror("pwrite"); return -1; } ops++; @@ -228,7 +228,7 @@ write_buffer( if (bytes == 0) break; if (bytes < 0) { - perror("pwrite64"); + perror("pwrite"); return -1; } ops++; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 36c39d9..8e9d86a 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -1083,16 +1083,16 @@ __write_buf(int fd, void *buf, int len, off64_t offset, int flags) { int sts; - sts = pwrite64(fd, buf, len, offset); + sts = pwrite(fd, buf, len, offset); if (sts < 0) { int error = errno; - fprintf(stderr, _("%s: pwrite64 failed: %s\n"), + fprintf(stderr, _("%s: pwrite failed: %s\n"), progname, strerror(error)); if (flags & LIBXFS_B_EXIT) exit(1); return -error; } else if (sts != len) { - fprintf(stderr, _("%s: error - pwrite64 only %d of %d bytes\n"), + fprintf(stderr, _("%s: error - pwrite only %d of %d bytes\n"), progname, sts, len); if (flags & LIBXFS_B_EXIT) exit(1); diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 1540dcd..0d399f1 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -134,7 +134,7 @@ perform_restore( off64_t off; off = sb.sb_dblocks * sb.sb_blocksize - sizeof(lb); - if (pwrite64(dst_fd, lb, sizeof(lb), off) < 0) + if (pwrite(dst_fd, lb, sizeof(lb), off) < 0) fatal("failed to write last block, is target too " "small? (error: %s)\n", strerror(errno)); } @@ -146,7 +146,7 @@ perform_restore( print_progress("%lld MB read", bytes_read >> 20); for (cur_index = 0; cur_index < mb_count; cur_index++) { - if (pwrite64(dst_fd, &block_buffer[cur_index << + if (pwrite(dst_fd, &block_buffer[cur_index << tmb.mb_blocklog], block_size, be64_to_cpu(block_index[cur_index]) << BBSHIFT) < 0) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 5d5fcb7..e038d48 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1111,7 +1111,7 @@ zero_old_xfs_structures( off = 0; for (i = 1; i < sb.sb_agcount; i++) { off += sb.sb_agblocks; - if (pwrite64(xi->dfd, buf, new_sb->sb_sectsize, + if (pwrite(xi->dfd, buf, new_sb->sb_sectsize, off << sb.sb_blocklog) == -1) break; } diff --git a/po/de.po b/po/de.po index ff1930e..fab2667 100644 --- a/po/de.po +++ b/po/de.po @@ -5893,8 +5893,8 @@ msgstr "%s: lesen fehlgeschlagen: %s\n" #: .././libxfs/rdwr.c:502 #, c-format -msgid "%s: pwrite64 failed: %s\n" -msgstr "%s: pwrite64 fehlgeschlagen: %s\n" +msgid "%s: pwrite failed: %s\n" +msgstr "%s: pwrite fehlgeschlagen: %s\n" #: .././libxfs/rdwr.c:509 #, c-format diff --git a/po/pl.po b/po/pl.po index 33a9d81..49209f3 100644 --- a/po/pl.po +++ b/po/pl.po @@ -5940,13 +5940,13 @@ msgstr "%s: błąd - odczytano tylko %d z %d bajtów\n" #: .././libxfs/rdwr.c:878 #, c-format -msgid "%s: pwrite64 failed: %s\n" -msgstr "%s: pwrite64 nie powiodÅ‚o siÄ™: %s\n" +msgid "%s: pwrite failed: %s\n" +msgstr "%s: pwrite nie powiodÅ‚o siÄ™: %s\n" #: .././libxfs/rdwr.c:884 #, c-format -msgid "%s: error - pwrite64 only %d of %d bytes\n" -msgstr "%s: błąd - wykonano pwrite64 tylko %d z %d bajtów\n" +msgid "%s: error - pwrite only %d of %d bytes\n" +msgstr "%s: błąd - wykonano pwrite tylko %d z %d bajtów\n" #: .././libxfs/rdwr.c:920 #, c-format -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B47ED7CEC for ; Sun, 7 Aug 2016 02:35:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1777FAC007 for ; Sun, 7 Aug 2016 00:35:47 -0700 (PDT) X-ASG-Debug-ID: 1470555343-0bf57b369b48b100001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id iu7nGCslB61gwFrV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:44 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 4B0742045A for ; Sun, 7 Aug 2016 09:35:43 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQQ5zcBzysK for ; Sun, 7 Aug 2016 09:35:42 +0200 (CEST) X-Mailbox-Line: From 5562a1f5a96d39d406d2258053167e798b98fff Mon Sep 17 00:00:00 2001 Message-Id: From: Felix Janda Date: Sun, 7 Aug 2016 08:43:34 +0200 Subject: [PATCH xfsprogs 00/14] Convert from off64_t to off_t To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 00/14] Convert from off64_t to off_t X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555344 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3378 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The off64_t type and structs/functions dependent on it were envisaged as a stepping stone for the LFS (large file support) transition [1]. On most systems today, transparent LFS is enabled, i.e. off_t is 64bit and all interfaces are 64bit clean -- on many of these systems the type off64_t is even not defined. For a long time, we have used -D_FILE_OFFSET_BITS=64 on linux, which is the only supported system without transparent LFS by default. This patch series does several related things: - Enable transparent LFS support via an autoconf macro instead of using -D_FILE_OFFSET_BITS=64 - Replace all types/function involving off64_t by their equivalent involving off_t - Ensure that the xfs headers can only be used when transparent LFS is enabled. [1]: http://users.suse.com/~aj/linux_lfs.html Felix Janda (14): configure: use AC_SYS_LARGEFILE remove unecessary definitions of _FILE_OFFSET_BITS replace fstat64 by equivalent fstat replace lstat64 by equivalent lstat replace stat64 by equivalent stat replace ftruncate64 by equivalent ftruncate replace lseek64 by equivalent lseek replace pread64 by equivalent pread replace pwrite64 by equivalent pwrite replace sendfile64 by equivalent sendfile replace statvfs64 by equivalent statvfs replace off64_t by off_t outside of public headers xfs.h: require transparent LFS platform: remove use of off64_t configure.ac | 2 ++ copy/xfs_copy.c | 24 +++++++++--------- fsr/xfs_fsr.c | 64 +++++++++++++++++++++-------------------------- include/builddefs.in | 2 +- include/darwin.h | 12 ++------- include/freebsd.h | 7 ------ include/irix.h | 2 +- include/linux.h | 2 +- include/xfs.h | 2 ++ io/bmap.c | 10 ++++---- io/copy_file_range.c | 12 ++++----- io/fadvise.c | 2 +- io/io.h | 10 ++++---- io/madvise.c | 2 +- io/mincore.c | 2 +- io/mmap.c | 12 ++++----- io/open.c | 20 +++++++-------- io/pread.c | 38 ++++++++++++++-------------- io/pwrite.c | 28 ++++++++++----------- io/reflink.c | 4 +-- io/seek.c | 12 ++++----- io/sendfile.c | 16 ++++++------ io/sync_file_range.c | 2 +- io/truncate.c | 4 +-- libxcmd/paths.c | 4 +-- libxfs/darwin.c | 8 +++--- libxfs/freebsd.c | 8 +++--- libxfs/init.c | 12 ++++----- libxfs/init.h | 6 ++--- libxfs/irix.c | 8 +++--- libxfs/linux.c | 20 +++++++-------- libxfs/rdwr.c | 18 ++++++------- logprint/log_misc.c | 4 +-- logprint/logprint.c | 2 +- m4/package_libcdev.m4 | 9 ------- mdrestore/xfs_mdrestore.c | 14 +++++------ mkfs/proto.c | 4 +-- mkfs/xfs_mkfs.c | 8 +++--- po/de.po | 28 ++++++++++----------- po/pl.po | 32 ++++++++++++------------ repair/prefetch.c | 4 +-- repair/sb.c | 6 ++--- repair/xfs_repair.c | 4 +-- rtcp/xfs_rtcp.c | 18 ++++++------- 44 files changed, 240 insertions(+), 268 deletions(-) -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9A2807CEF for ; Sun, 7 Aug 2016 02:35:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5BBA8304048 for ; Sun, 7 Aug 2016 00:35:52 -0700 (PDT) X-ASG-Debug-ID: 1470555349-0bf8157e6c536020001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id LURvRUMMNjEQxd8z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:50 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 9100F20A76 for ; Sun, 7 Aug 2016 09:35:49 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQY0zytz104T for ; Sun, 7 Aug 2016 09:35:49 +0200 (CEST) X-Mailbox-Line: From 3be2b10b0037406374a415fda2318cbf95a67546 Mon Sep 17 00:00:00 2001 Message-Id: <3be2b10b0037406374a415fda2318cbf95a67546.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sun, 7 Aug 2016 07:43:42 +0200 Subject: [PATCH xfsprogs 13/14] xfs.h: require transparent LFS To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 13/14] xfs.h: require transparent LFS X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555350 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 642 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Since our interfaces depend on the consistent use of a 64bit offset type, we force downstreams to use transparent LFS (_FILE_OFFSET_BITS=64), so that it becomes impossible for them to use 32bit interfaces. Signed-off-by: Felix Janda --- include/xfs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/xfs.h b/include/xfs.h index 7bed957..37c95fe 100644 --- a/include/xfs.h +++ b/include/xfs.h @@ -47,6 +47,8 @@ # error unknown platform... have fun porting! #endif +extern int xfs_assert_largefile[sizeof(off_t)-8]; + /* * sparse kernel source annotations */ -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 485F07CF4 for ; Sun, 7 Aug 2016 02:35:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1979C304048 for ; Sun, 7 Aug 2016 00:35:53 -0700 (PDT) X-ASG-Debug-ID: 1470555350-0bf57b369c48b120001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id NtsNTo00CaqXNLUp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:51 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id F353F20A94 for ; Sun, 7 Aug 2016 09:35:49 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQY3vTHz1043 for ; Sun, 7 Aug 2016 09:35:49 +0200 (CEST) X-Mailbox-Line: From 5562ea1f5a96d39d406d2258053167e798b98fff Mon Sep 17 00:00:00 2001 Message-Id: <5562ea1f5a96d39d406d2258053167e798b98fff.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sun, 7 Aug 2016 07:52:09 +0200 Subject: [PATCH xfsprogs 14/14] platform: remove use of off64_t To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 14/14] platform: remove use of off64_t X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555350 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1897 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Since we force transparent LFS for downstreams, it can be replaced by off_t. Signed-off-by: Felix Janda --- include/darwin.h | 1 - include/freebsd.h | 1 - include/irix.h | 2 +- include/linux.h | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/include/darwin.h b/include/darwin.h index bd1a112..1f3f789 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -134,7 +134,6 @@ typedef signed long long int __s64; #define __uint16_t u_int16_t #define __uint32_t u_int32_t #define __uint64_t u_int64_t -#define off64_t off_t typedef off_t xfs_off_t; typedef u_int64_t xfs_ino_t; diff --git a/include/freebsd.h b/include/freebsd.h index df924ef..93a9204 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -41,7 +41,6 @@ #define EFSBADCRC 991 /* Bad CRC detected */ typedef off_t xfs_off_t; -typedef off_t off64_t; typedef __uint64_t xfs_ino_t; typedef __uint32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; diff --git a/include/irix.h b/include/irix.h index b92e01b..a212505 100644 --- a/include/irix.h +++ b/include/irix.h @@ -43,7 +43,7 @@ #define __int16_t short #define __uint8_t unsigned char #define __uint16_t unsigned short -typedef off64_t xfs_off_t; +typedef off_t xfs_off_t; typedef __int64_t xfs_ino_t; typedef __int32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; diff --git a/include/linux.h b/include/linux.h index 5614719..ed388ea 100644 --- a/include/linux.h +++ b/include/linux.h @@ -137,7 +137,7 @@ platform_discard_blocks(int fd, uint64_t start, uint64_t len) #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ #define EFSBADCRC EBADMSG /* Bad CRC detected */ -typedef off64_t xfs_off_t; +typedef off_t xfs_off_t; typedef __uint64_t xfs_ino_t; typedef __uint32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9DE607CE1 for ; Sun, 7 Aug 2016 02:35:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42E7A304048 for ; Sun, 7 Aug 2016 00:35:51 -0700 (PDT) X-ASG-Debug-ID: 1470555348-0bf8157e6d536020001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id P7lOYlh7p99psCMZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:49 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 5522D20A85 for ; Sun, 7 Aug 2016 09:35:48 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQW6LB0z104K for ; Sun, 7 Aug 2016 09:35:47 +0200 (CEST) X-Mailbox-Line: From f4fc0b97ae8cdb30f1e0b0d55521f136877b33f5 Mon Sep 17 00:00:00 2001 Message-Id: In-Reply-To: References: From: Felix Janda Date: Sun, 7 Aug 2016 08:24:40 +0200 Subject: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555349 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2697 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- For this it was necessary to change a workaround for missing f_brsize on Mac OS X. Signed-off-by: Felix Janda --- fsr/xfs_fsr.c | 16 ++++------------ include/darwin.h | 4 ++-- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 98390e7..f3cc07e 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -89,7 +89,7 @@ static void fsrallfs(char *mtab, int howlong, char *leftofffile); static void fsrall_cleanup(int timeout); static int getnextents(int); int xfsrtextsize(int fd); -int xfs_getrt(int fd, struct statvfs64 *sfbp); +int xfs_getrt(int fd, struct statvfs *sfbp); char * gettmpname(char *fname); char * getparent(char *fname); int fsrprintf(const char *fmt, ...); @@ -888,7 +888,7 @@ fsrfile_common( xfs_bstat_t *statp) { int error; - struct statvfs64 vfss; + struct statvfs vfss; struct fsxattr fsx; unsigned long bsize; @@ -940,16 +940,12 @@ fsrfile_common( * Note that xfs_bstat.bs_blksize returns the filesystem blocksize, * not the optimal I/O size as struct stat. */ - if (statvfs64(fsname ? fsname : fname, &vfss) < 0) { + if (statvfs(fsname ? fsname : fname, &vfss) < 0) { fsrprintf(_("unable to get fs stat on %s: %s\n"), fname, strerror(errno)); return -1; } -#ifndef statvfs64 bsize = vfss.f_frsize ? vfss.f_frsize : vfss.f_bsize; -#else - bsize = vfss.f_bsize; -#endif if (statp->bs_blksize * statp->bs_blocks > vfss.f_bfree * bsize - minimumfree) { fsrprintf(_("insufficient freespace for: %s: " @@ -1704,7 +1700,7 @@ xfs_getgeom(int fd, xfs_fsop_geom_v1_t * fsgeom) * Get xfs realtime space information */ int -xfs_getrt(int fd, struct statvfs64 *sfbp) +xfs_getrt(int fd, struct statvfs *sfbp) { unsigned long bsize; unsigned long factor; @@ -1717,11 +1713,7 @@ xfs_getrt(int fd, struct statvfs64 *sfbp) close(fd); return -1; } -#ifndef statvfs64 bsize = (sfbp->f_frsize ? sfbp->f_frsize : sfbp->f_bsize); -#else - bsize = sfbp->f_bsize; -#endif factor = fsgeom.blocksize / bsize; /* currently this is == 1 */ sfbp->f_bfree = (cnt.freertx * fsgeom.rtextsize) * factor; return 0; diff --git a/include/darwin.h b/include/darwin.h index fb13915..bd1a112 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -216,8 +216,8 @@ static inline int timer_gettime (timer_t timerid, struct itimerspec *value) # include #include #include -#define statvfs64 statfs -#define _PATH_MOUNTED "/etc/mtab" +#define f_frsize f_bsize +#define _PATH_MOUNTED "/etc/mtab" struct mntent { -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 02:35:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D12B77CE9 for ; Sun, 7 Aug 2016 02:35:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 93C65304048 for ; Sun, 7 Aug 2016 00:35:53 -0700 (PDT) X-ASG-Debug-ID: 1470555349-0bf57b369d48b120001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id ynZs9OH7eYvoBoTX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 00:35:50 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 3546220A8B for ; Sun, 7 Aug 2016 09:35:49 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6XQX5Fx4z1043 for ; Sun, 7 Aug 2016 09:35:48 +0200 (CEST) X-Mailbox-Line: From 638a270f0a8291a42e30adb8abd56224664931e5 Mon Sep 17 00:00:00 2001 Message-Id: <638a270f0a8291a42e30adb8abd56224664931e5.1470555003.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:52:31 +0200 Subject: [PATCH xfsprogs 12/14] replace off64_t by off_t outside of public headers To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH xfsprogs 12/14] replace off64_t by off_t outside of public headers X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470555350 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14734 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31809 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Signed-off-by: Felix Janda --- copy/xfs_copy.c | 2 +- fsr/xfs_fsr.c | 2 +- io/bmap.c | 10 +++++----- io/copy_file_range.c | 2 +- io/fadvise.c | 2 +- io/io.h | 10 +++++----- io/madvise.c | 2 +- io/mincore.c | 2 +- io/mmap.c | 12 ++++++------ io/open.c | 2 +- io/pread.c | 22 +++++++++++----------- io/pwrite.c | 18 +++++++++--------- io/reflink.c | 4 ++-- io/seek.c | 6 +++--- io/sendfile.c | 6 +++--- io/sync_file_range.c | 2 +- io/truncate.c | 2 +- libxfs/rdwr.c | 8 ++++---- mdrestore/xfs_mdrestore.c | 2 +- repair/prefetch.c | 2 +- 20 files changed, 59 insertions(+), 59 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 816ab29..a8a7b4e 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -854,7 +854,7 @@ main(int argc, char **argv) } } else { char *lb[XFS_MAX_SECTORSIZE] = { NULL }; - off64_t off; + off_t off; /* ensure device files are sufficiently large */ diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index f3cc07e..ce89433 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1214,7 +1214,7 @@ packfile(char *fname, char *tname, int fd, struct dioattr dio; static xfs_swapext_t sx; struct xfs_flock64 space; - off64_t cnt, pos; + off_t cnt, pos; void *fbuf = NULL; int ct, wc, wc_b4; char ffname[SMBUFSZ]; diff --git a/io/bmap.c b/io/bmap.c index 04d04c7..a7ad8ff 100644 --- a/io/bmap.c +++ b/io/bmap.c @@ -53,9 +53,9 @@ bmap_help(void) static int numlen( - off64_t val) + off_t val) { - off64_t tmp; + off_t tmp; int len; for (len = 0, tmp = val; tmp > 0; tmp = tmp/10) @@ -279,7 +279,7 @@ bmap_f( #define FLG_BSW 000010 /* Not on begin of stripe width */ #define FLG_ESW 000001 /* Not on end of stripe width */ int agno; - off64_t agoff, bbperag; + off_t agoff, bbperag; int foff_w, boff_w, aoff_w, tot_w, agno_w; char rbuf[32], bbuf[32], abuf[32]; int sunit, swidth; @@ -289,8 +289,8 @@ bmap_f( if (is_rt) sunit = swidth = bbperag = 0; else { - bbperag = (off64_t)fsgeo.agblocks * - (off64_t)fsgeo.blocksize / BBSIZE; + bbperag = (off_t)fsgeo.agblocks * + (off_t)fsgeo.blocksize / BBSIZE; sunit = (fsgeo.sunit * fsgeo.blocksize) / BBSIZE; swidth = (fsgeo.swidth * fsgeo.blocksize) / BBSIZE; } diff --git a/io/copy_file_range.c b/io/copy_file_range.c index 88203e9..d1473bb 100644 --- a/io/copy_file_range.c +++ b/io/copy_file_range.c @@ -57,7 +57,7 @@ copy_file_range(int fd, loff_t *src, loff_t *dst, size_t len) return 0; } -static off64_t +static off_t copy_src_filesize(int fd) { struct stat st; diff --git a/io/fadvise.c b/io/fadvise.c index d59d1ff..d8195a0 100644 --- a/io/fadvise.c +++ b/io/fadvise.c @@ -51,7 +51,7 @@ fadvise_f( int argc, char **argv) { - off64_t offset = 0, length = 0; + off_t offset = 0, length = 0; int c, range = 0, advise = POSIX_FADV_NORMAL; while ((c = getopt(argc, argv, "dnrsw")) != EOF) { diff --git a/io/io.h b/io/io.h index 2bc7ac4..1a38aca 100644 --- a/io/io.h +++ b/io/io.h @@ -60,7 +60,7 @@ extern int filelist_f(void); typedef struct mmap_region { void *addr; /* address of start of mapping */ size_t length; /* length of mapping */ - off64_t offset; /* start offset into backing file */ + off_t offset; /* start offset into backing file */ int prot; /* protection mode of the mapping */ char *name; /* name of backing file */ } mmap_region_t; @@ -69,13 +69,13 @@ extern mmap_region_t *maptable; /* mmap'd region array */ extern int mapcount; /* #entries in the mapping table */ extern mmap_region_t *mapping; /* active mapping table entry */ extern int maplist_f(void); -extern void *check_mapping_range(mmap_region_t *, off64_t, size_t, int); +extern void *check_mapping_range(mmap_region_t *, off_t, size_t, int); /* * Various xfs_io helper routines/globals */ -extern off64_t filesize(void); +extern off_t filesize(void); extern int openfile(char *, xfs_fsop_geom_t *, int, mode_t); extern int addfile(char *, int , xfs_fsop_geom_t *, int); extern void printxattr(uint, int, int, const char *, int, int); @@ -88,9 +88,9 @@ extern size_t buffersize; extern int vectors; extern struct iovec *iov; extern int alloc_buffer(size_t, int, unsigned int); -extern int read_buffer(int, off64_t, long long, long long *, +extern int read_buffer(int, off_t, long long, long long *, int, int); -extern void dump_buffer(off64_t, ssize_t); +extern void dump_buffer(off_t, ssize_t); extern void attr_init(void); extern void bmap_init(void); diff --git a/io/madvise.c b/io/madvise.c index 1d8b53c..5aacbb5 100644 --- a/io/madvise.c +++ b/io/madvise.c @@ -51,7 +51,7 @@ madvise_f( int argc, char **argv) { - off64_t offset, llength; + off_t offset, llength; size_t length; void *start; int advise = MADV_NORMAL, c; diff --git a/io/mincore.c b/io/mincore.c index 9e0d3a6..4a4781f 100644 --- a/io/mincore.c +++ b/io/mincore.c @@ -29,7 +29,7 @@ mincore_f( int argc, char **argv) { - off64_t offset, llength; + off_t offset, llength; size_t length; size_t blocksize, sectsize; void *start; diff --git a/io/mmap.c b/io/mmap.c index dc188d0..a8d8197 100644 --- a/io/mmap.c +++ b/io/mmap.c @@ -68,11 +68,11 @@ print_mapping( void * check_mapping_range( mmap_region_t *map, - off64_t offset, + off_t offset, size_t length, int pagealign) { - off64_t relative; + off_t relative; if (offset < mapping->offset) { printf(_("offset (%lld) is before start of mapping (%lld)\n"), @@ -156,7 +156,7 @@ mmap_f( int argc, char **argv) { - off64_t offset; + off_t offset; ssize_t length = 0, length2 = 0; void *address = NULL; char *filename; @@ -288,7 +288,7 @@ msync_f( int argc, char **argv) { - off64_t offset; + off_t offset; ssize_t length; void *start; int c, flags = 0; @@ -372,7 +372,7 @@ mread_f( int argc, char **argv) { - off64_t offset, tmp, dumpoffset, printoffset; + off_t offset, tmp, dumpoffset, printoffset; ssize_t length; size_t dumplen, cnt = 0; char *bp; @@ -529,7 +529,7 @@ mwrite_f( int argc, char **argv) { - off64_t offset, tmp; + off_t offset, tmp; ssize_t length; void *start; char *sp; diff --git a/io/open.c b/io/open.c index d4ec13c..aded8a6 100644 --- a/io/open.c +++ b/io/open.c @@ -49,7 +49,7 @@ static cmdinfo_t inode_cmd; static prid_t prid; static long extsize; -off64_t +off_t filesize(void) { struct stat st; diff --git a/io/pread.c b/io/pread.c index 3395503..da42b8f 100644 --- a/io/pread.c +++ b/io/pread.c @@ -125,7 +125,7 @@ alloc_buffer( void __dump_buffer( void *buf, - off64_t offset, + off_t offset, ssize_t len) { int i, j; @@ -150,7 +150,7 @@ __dump_buffer( void dump_buffer( - off64_t offset, + off_t offset, ssize_t len) { int i, l; @@ -173,7 +173,7 @@ dump_buffer( static int do_preadv( int fd, - off64_t offset, + off_t offset, ssize_t count, ssize_t buffer_size) { @@ -209,7 +209,7 @@ do_preadv( static int do_pread( int fd, - off64_t offset, + off_t offset, ssize_t count, ssize_t buffer_size) { @@ -222,13 +222,13 @@ do_pread( static int read_random( int fd, - off64_t offset, + off_t offset, long long count, long long *total, unsigned int seed, int eof) { - off64_t end, off, range; + off_t end, off, range; ssize_t bytes; int ops = 0; @@ -269,12 +269,12 @@ read_random( static int read_backward( int fd, - off64_t *offset, + off_t *offset, long long *count, long long *total, int eof) { - off64_t end, off = *offset; + off_t end, off = *offset; ssize_t bytes = 0, bytes_requested; long long cnt = *count; int ops = 0; @@ -329,7 +329,7 @@ read_backward( static int read_forward( int fd, - off64_t offset, + off_t offset, long long count, long long *total, int verbose, @@ -363,7 +363,7 @@ read_forward( int read_buffer( int fd, - off64_t offset, + off_t offset, long long count, long long *total, int verbose, @@ -378,7 +378,7 @@ pread_f( char **argv) { size_t bsize; - off64_t offset; + off_t offset; unsigned int zeed = 0; long long count, total, tmp; size_t fsblocksize, fssectsize; diff --git a/io/pwrite.c b/io/pwrite.c index 7c0bb7f..d2cbafb 100644 --- a/io/pwrite.c +++ b/io/pwrite.c @@ -60,7 +60,7 @@ pwrite_help(void) static int do_pwritev( int fd, - off64_t offset, + off_t offset, ssize_t count, ssize_t buffer_size) { @@ -96,7 +96,7 @@ do_pwritev( static int do_pwrite( int fd, - off64_t offset, + off_t offset, ssize_t count, ssize_t buffer_size) { @@ -108,12 +108,12 @@ do_pwrite( static int write_random( - off64_t offset, + off_t offset, long long count, unsigned int seed, long long *total) { - off64_t off, range; + off_t off, range; ssize_t bytes; int ops = 0; @@ -151,11 +151,11 @@ write_random( static int write_backward( - off64_t offset, + off_t offset, long long *count, long long *total) { - off64_t end, off = offset; + off_t end, off = offset; ssize_t bytes = 0, bytes_requested; long long cnt = *count; int ops = 0; @@ -207,11 +207,11 @@ write_backward( static int write_buffer( - off64_t offset, + off_t offset, long long count, size_t bs, int fd, - off64_t skip, + off_t skip, long long *total) { ssize_t bytes; @@ -249,7 +249,7 @@ pwrite_f( char **argv) { size_t bsize; - off64_t offset, skip = 0; + off_t offset, skip = 0; long long count, total, tmp; unsigned int zeed = 0, seed = 0xcdcdcdcd; size_t fsblocksize, fssectsize; diff --git a/io/reflink.c b/io/reflink.c index a09e82d..6becd12 100644 --- a/io/reflink.c +++ b/io/reflink.c @@ -109,7 +109,7 @@ dedupe_f( int argc, char **argv) { - off64_t soffset, doffset; + off_t soffset, doffset; long long count, total; char *infile; int condensed, quiet_flag; @@ -229,7 +229,7 @@ reflink_f( int argc, char **argv) { - off64_t soffset, doffset; + off_t soffset, doffset; long long count = 0, total; char *infile = NULL; int condensed, quiet_flag; diff --git a/io/seek.c b/io/seek.c index d06375d..36403a3 100644 --- a/io/seek.c +++ b/io/seek.c @@ -75,8 +75,8 @@ void seek_output( int startflag, char *type, - off64_t start, - off64_t offset) + off_t start, + off_t offset) { if (offset == -1) { if (errno == ENXIO) { @@ -104,7 +104,7 @@ seek_f( int argc, char **argv) { - off64_t offset, start; + off_t offset, start; size_t fsblocksize, fssectsize; int c; int current; /* specify data or hole */ diff --git a/io/sendfile.c b/io/sendfile.c index edd31c9..3463820 100644 --- a/io/sendfile.c +++ b/io/sendfile.c @@ -45,12 +45,12 @@ sendfile_help(void) static int send_buffer( - off64_t offset, + off_t offset, size_t count, int fd, long long *total) { - off64_t off = offset; + off_t off = offset; ssize_t bytes, bytes_remaining = count; int ops = 0; @@ -77,7 +77,7 @@ sendfile_f( int argc, char **argv) { - off64_t offset = 0; + off_t offset = 0; long long count, total; size_t blocksize, sectsize; struct timeval t1, t2; diff --git a/io/sync_file_range.c b/io/sync_file_range.c index 7e4f3e6..3b1f9c2 100644 --- a/io/sync_file_range.c +++ b/io/sync_file_range.c @@ -42,7 +42,7 @@ sync_range_f( int argc, char **argv) { - off64_t offset = 0, length = 0; + off_t offset = 0, length = 0; int c, sync_mode = 0; size_t blocksize, sectsize; diff --git a/io/truncate.c b/io/truncate.c index 20bada8..480574a 100644 --- a/io/truncate.c +++ b/io/truncate.c @@ -28,7 +28,7 @@ truncate_f( int argc, char **argv) { - off64_t offset; + off_t offset; size_t blocksize, sectsize; init_cvtnum(&blocksize, §size); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 8e9d86a..265f26a 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -911,7 +911,7 @@ libxfs_balloc(cache_key_t key) static int -__read_buf(int fd, void *buf, int len, off64_t offset, int flags) +__read_buf(int fd, void *buf, int len, off_t offset, int flags) { int sts; @@ -1024,7 +1024,7 @@ libxfs_readbufr_map(struct xfs_buftarg *btp, struct xfs_buf *bp, int flags) fd = libxfs_device_to_fd(btp->dev); buf = bp->b_addr; for (i = 0; i < bp->b_nmaps; i++) { - off64_t offset = LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); + off_t offset = LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); int len = BBTOB(bp->b_map[i].bm_len); error = __read_buf(fd, buf, len, offset, flags); @@ -1079,7 +1079,7 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, } static int -__write_buf(int fd, void *buf, int len, off64_t offset, int flags) +__write_buf(int fd, void *buf, int len, off_t offset, int flags) { int sts; @@ -1142,7 +1142,7 @@ libxfs_writebufr(xfs_buf_t *bp) char *buf = bp->b_addr; for (i = 0; i < bp->b_nmaps; i++) { - off64_t offset = LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); + off_t offset = LIBXFS_BBTOOFF64(bp->b_map[i].bm_bn); int len = BBTOB(bp->b_map[i].bm_len); bp->b_error = __write_buf(fd, buf, len, offset, diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 0d399f1..e1d8b6b 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -131,7 +131,7 @@ perform_restore( /* ensure device is sufficiently large enough */ char *lb[XFS_MAX_SECTORSIZE] = { NULL }; - off64_t off; + off_t off; off = sb.sb_dblocks * sb.sb_blocksize - sizeof(lb); if (pwrite(dst_fd, lb, sizeof(lb), off) < 0) diff --git a/repair/prefetch.c b/repair/prefetch.c index 175594c..318cea1 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -465,7 +465,7 @@ pf_batch_read( { xfs_buf_t *bplist[MAX_BUFS]; unsigned int num; - off64_t first_off, last_off, next_off; + off_t first_off, last_off, next_off; int len, size; int i; int inode_bufs; -- 2.7.3 From felix.janda@posteo.de Sun Aug 7 12:39:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E11BC7CD8 for ; Sun, 7 Aug 2016 12:39:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0ECC7AC002 for ; Sun, 7 Aug 2016 10:39:26 -0700 (PDT) X-ASG-Debug-ID: 1470591553-0bf57c136842ac90001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id rySjV58e7kcCqq2C (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 07 Aug 2016 10:39:14 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id BAA0720A8E for ; Sun, 7 Aug 2016 19:39:12 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s6npl2mDQzyZw for ; Sun, 7 Aug 2016 19:39:11 +0200 (CEST) Date: Sun, 7 Aug 2016 19:38:35 +0200 From: Felix Janda To: xfs@oss.sgi.com Subject: [PATCH] xfs: kill __uint*_t and __int*_t Message-ID: <20160807173835.GA20839@nyan> X-ASG-Orig-Subj: [PATCH] xfs: kill __uint*_t and __int*_t MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470591554 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 116883 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580F X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.75 BSF_RULE_7580F Custom Rule 7580F Replace them by the more widely used uint*_t and int*_t. Signed-off-by: Felix Janda --- This patch is essentially a global 'sed -i "s/__\(u*\)int\([0-9]*\)_t/\1int\2_t/"'. The only other changes are whitespace changes and removing the now unecessary type definitions. Running 'sed "s/^.//"' on the patch might be useful for checking that I didn't mess up the indentation. --- fs/xfs/libxfs/xfs_alloc_btree.c | 10 +- fs/xfs/libxfs/xfs_attr_remote.c | 8 +- fs/xfs/libxfs/xfs_attr_sf.h | 10 +- fs/xfs/libxfs/xfs_bit.h | 24 +-- fs/xfs/libxfs/xfs_bmap_btree.c | 8 +- fs/xfs/libxfs/xfs_btree.c | 18 +- fs/xfs/libxfs/xfs_btree.h | 16 +- fs/xfs/libxfs/xfs_cksum.h | 14 +- fs/xfs/libxfs/xfs_da_btree.c | 2 +- fs/xfs/libxfs/xfs_da_btree.h | 8 +- fs/xfs/libxfs/xfs_da_format.c | 28 ++-- fs/xfs/libxfs/xfs_da_format.h | 64 +++---- fs/xfs/libxfs/xfs_dir2.h | 8 +- fs/xfs/libxfs/xfs_dir2_leaf.c | 12 +- fs/xfs/libxfs/xfs_dir2_priv.h | 2 +- fs/xfs/libxfs/xfs_format.h | 112 ++++++------- fs/xfs/libxfs/xfs_fs.h | 12 +- fs/xfs/libxfs/xfs_ialloc.c | 6 +- fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +- fs/xfs/libxfs/xfs_inode_buf.c | 2 +- fs/xfs/libxfs/xfs_inode_buf.h | 26 +-- fs/xfs/libxfs/xfs_log_format.h | 216 ++++++++++++------------ fs/xfs/libxfs/xfs_log_recover.h | 2 +- fs/xfs/libxfs/xfs_quota_defs.h | 4 +- fs/xfs/libxfs/xfs_rmap.c | 8 +- fs/xfs/libxfs/xfs_rmap.h | 8 +- fs/xfs/libxfs/xfs_rmap_btree.c | 30 ++-- fs/xfs/libxfs/xfs_rtbitmap.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 4 +- fs/xfs/libxfs/xfs_types.h | 46 ++--- fs/xfs/xfs_aops.c | 4 +- fs/xfs/xfs_attr_list.c | 2 +- fs/xfs/xfs_bmap_util.c | 20 +-- fs/xfs/xfs_buf.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 8 +- fs/xfs/xfs_discard.c | 4 +- fs/xfs/xfs_dquot.c | 2 +- fs/xfs/xfs_fsops.c | 16 +- fs/xfs/xfs_fsops.h | 4 +- fs/xfs/xfs_inode.c | 6 +- fs/xfs/xfs_inode.h | 4 +- fs/xfs/xfs_ioctl.c | 20 +-- fs/xfs/xfs_ioctl.h | 10 +- fs/xfs/xfs_ioctl32.h | 6 +- fs/xfs/xfs_linux.h | 21 +-- fs/xfs/xfs_log.c | 20 +-- fs/xfs/xfs_log.h | 2 +- fs/xfs/xfs_log_priv.h | 2 +- fs/xfs/xfs_log_recover.c | 24 +-- fs/xfs/xfs_mount.c | 16 +- fs/xfs/xfs_mount.h | 32 ++-- fs/xfs/xfs_qm_bhv.c | 2 +- fs/xfs/xfs_rtalloc.c | 8 +- fs/xfs/xfs_stats.c | 8 +- fs/xfs/xfs_stats.h | 354 +++++++++++++++++++-------------------- fs/xfs/xfs_super.c | 26 +-- fs/xfs/xfs_trace.h | 10 +- fs/xfs/xfs_trans.h | 2 +- fs/xfs/xfs_trans_rmap.c | 2 +- 59 files changed, 671 insertions(+), 680 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc_btree.c b/fs/xfs/libxfs/xfs_alloc_btree.c index 5ba2dac..4051c7b 100644 --- a/fs/xfs/libxfs/xfs_alloc_btree.c +++ b/fs/xfs/libxfs/xfs_alloc_btree.c @@ -235,25 +235,25 @@ xfs_allocbt_init_ptr_from_cur( ptr->s = agf->agf_roots[cur->bc_btnum]; } -STATIC __int64_t +STATIC int64_t xfs_allocbt_key_diff( struct xfs_btree_cur *cur, union xfs_btree_key *key) { xfs_alloc_rec_incore_t *rec = &cur->bc_rec.a; xfs_alloc_key_t *kp = &key->alloc; - __int64_t diff; + int64_t diff; if (cur->bc_btnum == XFS_BTNUM_BNO) { - return (__int64_t)be32_to_cpu(kp->ar_startblock) - + return (int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } - diff = (__int64_t)be32_to_cpu(kp->ar_blockcount) - rec->ar_blockcount; + diff = (int64_t)be32_to_cpu(kp->ar_blockcount) - rec->ar_blockcount; if (diff) return diff; - return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; + return (int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } static bool diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c index d52f525..da72b16 100644 --- a/fs/xfs/libxfs/xfs_attr_remote.c +++ b/fs/xfs/libxfs/xfs_attr_remote.c @@ -253,7 +253,7 @@ xfs_attr_rmtval_copyout( xfs_ino_t ino, int *offset, int *valuelen, - __uint8_t **dst) + uint8_t **dst) { char *src = bp->b_addr; xfs_daddr_t bno = bp->b_bn; @@ -301,7 +301,7 @@ xfs_attr_rmtval_copyin( xfs_ino_t ino, int *offset, int *valuelen, - __uint8_t **src) + uint8_t **src) { char *dst = bp->b_addr; xfs_daddr_t bno = bp->b_bn; @@ -355,7 +355,7 @@ xfs_attr_rmtval_get( struct xfs_mount *mp = args->dp->i_mount; struct xfs_buf *bp; xfs_dablk_t lblkno = args->rmtblkno; - __uint8_t *dst = args->value; + uint8_t *dst = args->value; int valuelen; int nmap; int error; @@ -421,7 +421,7 @@ xfs_attr_rmtval_set( struct xfs_bmbt_irec map; xfs_dablk_t lblkno; xfs_fileoff_t lfileoff = 0; - __uint8_t *src = args->value; + uint8_t *src = args->value; int blkcnt; int valuelen; int nmap; diff --git a/fs/xfs/libxfs/xfs_attr_sf.h b/fs/xfs/libxfs/xfs_attr_sf.h index 90928bb..afd684a 100644 --- a/fs/xfs/libxfs/xfs_attr_sf.h +++ b/fs/xfs/libxfs/xfs_attr_sf.h @@ -31,10 +31,10 @@ typedef struct xfs_attr_sf_entry xfs_attr_sf_entry_t; * We generate this then sort it, attr_list() must return things in hash-order. */ typedef struct xfs_attr_sf_sort { - __uint8_t entno; /* entry number in original list */ - __uint8_t namelen; /* length of name value (no null) */ - __uint8_t valuelen; /* length of value */ - __uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */ + uint8_t entno; /* entry number in original list */ + uint8_t namelen; /* length of name value (no null) */ + uint8_t valuelen; /* length of value */ + uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */ xfs_dahash_t hash; /* this entry's hash value */ unsigned char *name; /* name value, pointer into buffer */ } xfs_attr_sf_sort_t; @@ -42,7 +42,7 @@ typedef struct xfs_attr_sf_sort { #define XFS_ATTR_SF_ENTSIZE_BYNAME(nlen,vlen) /* space name/value uses */ \ (((int)sizeof(xfs_attr_sf_entry_t)-1 + (nlen)+(vlen))) #define XFS_ATTR_SF_ENTSIZE_MAX /* max space for name&value */ \ - ((1 << (NBBY*(int)sizeof(__uint8_t))) - 1) + ((1 << (NBBY*(int)sizeof(uint8_t))) - 1) #define XFS_ATTR_SF_ENTSIZE(sfep) /* space an entry uses */ \ ((int)sizeof(xfs_attr_sf_entry_t)-1 + (sfep)->namelen+(sfep)->valuelen) #define XFS_ATTR_SF_NEXTENTRY(sfep) /* next entry in struct */ \ diff --git a/fs/xfs/libxfs/xfs_bit.h b/fs/xfs/libxfs/xfs_bit.h index e1649c0..61c6b20 100644 --- a/fs/xfs/libxfs/xfs_bit.h +++ b/fs/xfs/libxfs/xfs_bit.h @@ -25,47 +25,47 @@ /* * masks with n high/low bits set, 64-bit values */ -static inline __uint64_t xfs_mask64hi(int n) +static inline uint64_t xfs_mask64hi(int n) { - return (__uint64_t)-1 << (64 - (n)); + return (uint64_t)-1 << (64 - (n)); } -static inline __uint32_t xfs_mask32lo(int n) +static inline uint32_t xfs_mask32lo(int n) { - return ((__uint32_t)1 << (n)) - 1; + return ((uint32_t)1 << (n)) - 1; } -static inline __uint64_t xfs_mask64lo(int n) +static inline uint64_t xfs_mask64lo(int n) { - return ((__uint64_t)1 << (n)) - 1; + return ((uint64_t)1 << (n)) - 1; } /* Get high bit set out of 32-bit argument, -1 if none set */ -static inline int xfs_highbit32(__uint32_t v) +static inline int xfs_highbit32(uint32_t v) { return fls(v) - 1; } /* Get high bit set out of 64-bit argument, -1 if none set */ -static inline int xfs_highbit64(__uint64_t v) +static inline int xfs_highbit64(uint64_t v) { return fls64(v) - 1; } /* Get low bit set out of 32-bit argument, -1 if none set */ -static inline int xfs_lowbit32(__uint32_t v) +static inline int xfs_lowbit32(uint32_t v) { return ffs(v) - 1; } /* Get low bit set out of 64-bit argument, -1 if none set */ -static inline int xfs_lowbit64(__uint64_t v) +static inline int xfs_lowbit64(uint64_t v) { - __uint32_t w = (__uint32_t)v; + uint32_t w = (uint32_t)v; int n = 0; if (w) { /* lower bits */ n = ffs(w); } else { /* upper bits */ - w = (__uint32_t)(v >> 32); + w = (uint32_t)(v >> 32); if (w) { n = ffs(w); if (n) diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index cd85274..2d1806e 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -100,8 +100,8 @@ xfs_bmdr_to_bmbt( */ STATIC void __xfs_bmbt_get_all( - __uint64_t l0, - __uint64_t l1, + uint64_t l0, + uint64_t l1, xfs_bmbt_irec_t *s) { int ext_flag; @@ -621,12 +621,12 @@ xfs_bmbt_init_ptr_from_cur( ptr->l = 0; } -STATIC __int64_t +STATIC int64_t xfs_bmbt_key_diff( struct xfs_btree_cur *cur, union xfs_btree_key *key) { - return (__int64_t)be64_to_cpu(key->bmbt.br_startoff) - + return (int64_t)be64_to_cpu(key->bmbt.br_startoff) - cur->bc_rec.b.br_startoff; } diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index b5c213a..129289c 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -43,7 +43,7 @@ kmem_zone_t *xfs_btree_cur_zone; /* * Btree magic numbers. */ -static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { +static const uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, 0, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, XFS_FIBT_MAGIC }, { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, XFS_RMAP_CRC_MAGIC, @@ -761,14 +761,14 @@ xfs_btree_lastrec( */ void xfs_btree_offsets( - __int64_t fields, /* bitmask of fields */ + int64_t fields, /* bitmask of fields */ const short *offsets, /* table of field offsets */ int nbits, /* number of bits to inspect */ int *first, /* output: first byte offset */ int *last) /* output: last byte offset */ { int i; /* current bit number */ - __int64_t imask; /* mask for current bit number */ + int64_t imask; /* mask for current bit number */ ASSERT(fields != 0); /* @@ -1802,7 +1802,7 @@ xfs_btree_lookup( int *stat) /* success/failure */ { struct xfs_btree_block *block; /* current btree block */ - __int64_t diff; /* difference for the current key */ + int64_t diff; /* difference for the current key */ int error; /* error return value */ int keyno; /* current key number */ int level; /* level in the btree */ @@ -4387,7 +4387,7 @@ xfs_btree_visit_blocks( * recovery completion writes the changes to disk. */ struct xfs_btree_block_change_owner_info { - __uint64_t new_owner; + uint64_t new_owner; struct list_head *buffer_list; }; @@ -4433,7 +4433,7 @@ xfs_btree_block_change_owner( int xfs_btree_change_owner( struct xfs_btree_cur *cur, - __uint64_t new_owner, + uint64_t new_owner, struct list_head *buffer_list) { struct xfs_btree_block_change_owner_info bbcoi; @@ -4537,7 +4537,7 @@ xfs_btree_simple_query_range( { union xfs_btree_rec *recp; union xfs_btree_key rec_key; - __int64_t diff; + int64_t diff; int stat; bool firstrec = true; int error; @@ -4626,8 +4626,8 @@ xfs_btree_overlapped_query_range( union xfs_btree_key *hkp; union xfs_btree_rec *recp; struct xfs_btree_block *block; - __int64_t ldiff; - __int64_t hdiff; + int64_t ldiff; + int64_t hdiff; int level; struct xfs_buf *bp; int i; diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 04d0865..c0c0827 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -190,14 +190,14 @@ struct xfs_btree_ops { union xfs_btree_rec *rec); /* difference between key value and cursor value */ - __int64_t (*key_diff)(struct xfs_btree_cur *cur, + int64_t (*key_diff)(struct xfs_btree_cur *cur, union xfs_btree_key *key); /* * Difference between key2 and key1 -- positive if key1 > key2, * negative if key1 < key2, and zero if equal. */ - __int64_t (*diff_two_keys)(struct xfs_btree_cur *cur, + int64_t (*diff_two_keys)(struct xfs_btree_cur *cur, union xfs_btree_key *key1, union xfs_btree_key *key2); @@ -244,11 +244,11 @@ typedef struct xfs_btree_cur union xfs_btree_irec bc_rec; /* current insert/search record value */ struct xfs_buf *bc_bufs[XFS_BTREE_MAXLEVELS]; /* buf ptr per level */ int bc_ptrs[XFS_BTREE_MAXLEVELS]; /* key/record # */ - __uint8_t bc_ra[XFS_BTREE_MAXLEVELS]; /* readahead bits */ + uint8_t bc_ra[XFS_BTREE_MAXLEVELS]; /* readahead bits */ #define XFS_BTCUR_LEFTRA 1 /* left sibling has been read-ahead */ #define XFS_BTCUR_RIGHTRA 2 /* right sibling has been read-ahead */ - __uint8_t bc_nlevels; /* number of levels in the tree */ - __uint8_t bc_blocklog; /* log2(blocksize) of btree blocks */ + uint8_t bc_nlevels; /* number of levels in the tree */ + uint8_t bc_blocklog; /* log2(blocksize) of btree blocks */ xfs_btnum_t bc_btnum; /* identifies which btree type */ union { struct { /* needed for BNO, CNT, INO */ @@ -359,7 +359,7 @@ xfs_btree_islastblock( */ void xfs_btree_offsets( - __int64_t fields, /* bitmask of fields */ + int64_t fields, /* bitmask of fields */ const short *offsets,/* table of field offsets */ int nbits, /* number of bits to inspect */ int *first, /* output: first byte offset */ @@ -437,7 +437,7 @@ int xfs_btree_new_iroot(struct xfs_btree_cur *, int *, int *); int xfs_btree_insert(struct xfs_btree_cur *, int *); int xfs_btree_delete(struct xfs_btree_cur *, int *); int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *); -int xfs_btree_change_owner(struct xfs_btree_cur *cur, __uint64_t new_owner, +int xfs_btree_change_owner(struct xfs_btree_cur *cur, uint64_t new_owner, struct list_head *buffer_list); /* @@ -463,7 +463,7 @@ static inline int xfs_btree_get_numrecs(struct xfs_btree_block *block) } static inline void xfs_btree_set_numrecs(struct xfs_btree_block *block, - __uint16_t numrecs) + uint16_t numrecs) { block->bb_numrecs = cpu_to_be16(numrecs); } diff --git a/fs/xfs/libxfs/xfs_cksum.h b/fs/xfs/libxfs/xfs_cksum.h index fad1676..3c2bc92 100644 --- a/fs/xfs/libxfs/xfs_cksum.h +++ b/fs/xfs/libxfs/xfs_cksum.h @@ -1,18 +1,18 @@ #ifndef _XFS_CKSUM_H #define _XFS_CKSUM_H 1 -#define XFS_CRC_SEED (~(__uint32_t)0) +#define XFS_CRC_SEED (~(uint32_t)0) /* * Calculate the intermediate checksum for a buffer that has the CRC field * inside it. The offset of the 32bit crc fields is passed as the * cksum_offset parameter. */ -static inline __uint32_t +static inline uint32_t xfs_start_cksum(char *buffer, size_t length, unsigned long cksum_offset) { - __uint32_t zero = 0; - __uint32_t crc; + uint32_t zero = 0; + uint32_t crc; /* Calculate CRC up to the checksum. */ crc = crc32c(XFS_CRC_SEED, buffer, cksum_offset); @@ -33,7 +33,7 @@ xfs_start_cksum(char *buffer, size_t length, unsigned long cksum_offset) * so that it is consistent on disk. */ static inline __le32 -xfs_end_cksum(__uint32_t crc) +xfs_end_cksum(uint32_t crc) { return ~cpu_to_le32(crc); } @@ -44,7 +44,7 @@ xfs_end_cksum(__uint32_t crc) static inline void xfs_update_cksum(char *buffer, size_t length, unsigned long cksum_offset) { - __uint32_t crc = xfs_start_cksum(buffer, length, cksum_offset); + uint32_t crc = xfs_start_cksum(buffer, length, cksum_offset); *(__le32 *)(buffer + cksum_offset) = xfs_end_cksum(crc); } @@ -55,7 +55,7 @@ xfs_update_cksum(char *buffer, size_t length, unsigned long cksum_offset) static inline int xfs_verify_cksum(char *buffer, size_t length, unsigned long cksum_offset) { - __uint32_t crc = xfs_start_cksum(buffer, length, cksum_offset); + uint32_t crc = xfs_start_cksum(buffer, length, cksum_offset); return *(__le32 *)(buffer + cksum_offset) == xfs_end_cksum(crc); } diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index f2dc1a9..d21666a 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -1952,7 +1952,7 @@ xfs_da3_path_shift( * This is implemented with some source-level loop unrolling. */ xfs_dahash_t -xfs_da_hashname(const __uint8_t *name, int namelen) +xfs_da_hashname(const uint8_t *name, int namelen) { xfs_dahash_t hash; diff --git a/fs/xfs/libxfs/xfs_da_btree.h b/fs/xfs/libxfs/xfs_da_btree.h index 98c75cb..c3eee77c 100644 --- a/fs/xfs/libxfs/xfs_da_btree.h +++ b/fs/xfs/libxfs/xfs_da_btree.h @@ -60,10 +60,10 @@ enum xfs_dacmp { */ typedef struct xfs_da_args { struct xfs_da_geometry *geo; /* da block geometry */ - const __uint8_t *name; /* string (maybe not NULL terminated) */ + const uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ - __uint8_t filetype; /* filetype of inode for directories */ - __uint8_t *value; /* set of bytes (maybe contain NULLs) */ + uint8_t filetype; /* filetype of inode for directories */ + uint8_t *value; /* set of bytes (maybe contain NULLs) */ int valuelen; /* length of value */ int flags; /* argument flags (eg: ATTR_NOCREATE) */ xfs_dahash_t hashval; /* hash value of name */ @@ -207,7 +207,7 @@ xfs_daddr_t xfs_da_reada_buf(struct xfs_inode *dp, xfs_dablk_t bno, int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, struct xfs_buf *dead_buf); -uint xfs_da_hashname(const __uint8_t *name_string, int name_length); +uint xfs_da_hashname(const uint8_t *name_string, int name_length); enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args, const unsigned char *name, int len); diff --git a/fs/xfs/libxfs/xfs_da_format.c b/fs/xfs/libxfs/xfs_da_format.c index f1e8d4d..de4db17 100644 --- a/fs/xfs/libxfs/xfs_da_format.c +++ b/fs/xfs/libxfs/xfs_da_format.c @@ -49,7 +49,7 @@ xfs_dir3_sf_entsize( struct xfs_dir2_sf_hdr *hdr, int len) { - return xfs_dir2_sf_entsize(hdr, len) + sizeof(__uint8_t); + return xfs_dir2_sf_entsize(hdr, len) + sizeof(uint8_t); } static struct xfs_dir2_sf_entry * @@ -77,7 +77,7 @@ xfs_dir3_sf_nextentry( * not necessary. For non-filetype enable directories, the type is always * unknown and we never store the value. */ -static __uint8_t +static uint8_t xfs_dir2_sfe_get_ftype( struct xfs_dir2_sf_entry *sfep) { @@ -87,16 +87,16 @@ xfs_dir2_sfe_get_ftype( static void xfs_dir2_sfe_put_ftype( struct xfs_dir2_sf_entry *sfep, - __uint8_t ftype) + uint8_t ftype) { ASSERT(ftype < XFS_DIR3_FT_MAX); } -static __uint8_t +static uint8_t xfs_dir3_sfe_get_ftype( struct xfs_dir2_sf_entry *sfep) { - __uint8_t ftype; + uint8_t ftype; ftype = sfep->name[sfep->namelen]; if (ftype >= XFS_DIR3_FT_MAX) @@ -107,7 +107,7 @@ xfs_dir3_sfe_get_ftype( static void xfs_dir3_sfe_put_ftype( struct xfs_dir2_sf_entry *sfep, - __uint8_t ftype) + uint8_t ftype) { ASSERT(ftype < XFS_DIR3_FT_MAX); @@ -124,7 +124,7 @@ xfs_dir3_sfe_put_ftype( static xfs_ino_t xfs_dir2_sf_get_ino( struct xfs_dir2_sf_hdr *hdr, - __uint8_t *from) + uint8_t *from) { if (hdr->i8count) return get_unaligned_be64(from) & 0x00ffffffffffffffULL; @@ -135,7 +135,7 @@ xfs_dir2_sf_get_ino( static void xfs_dir2_sf_put_ino( struct xfs_dir2_sf_hdr *hdr, - __uint8_t *to, + uint8_t *to, xfs_ino_t ino) { ASSERT((ino & 0xff00000000000000ULL) == 0); @@ -225,7 +225,7 @@ xfs_dir3_sfe_put_ino( #define XFS_DIR3_DATA_ENTSIZE(n) \ round_up((offsetof(struct xfs_dir2_data_entry, name[0]) + (n) + \ - sizeof(xfs_dir2_data_off_t) + sizeof(__uint8_t)), \ + sizeof(xfs_dir2_data_off_t) + sizeof(uint8_t)), \ XFS_DIR2_DATA_ALIGN) static int @@ -242,7 +242,7 @@ xfs_dir3_data_entsize( return XFS_DIR3_DATA_ENTSIZE(n); } -static __uint8_t +static uint8_t xfs_dir2_data_get_ftype( struct xfs_dir2_data_entry *dep) { @@ -252,16 +252,16 @@ xfs_dir2_data_get_ftype( static void xfs_dir2_data_put_ftype( struct xfs_dir2_data_entry *dep, - __uint8_t ftype) + uint8_t ftype) { ASSERT(ftype < XFS_DIR3_FT_MAX); } -static __uint8_t +static uint8_t xfs_dir3_data_get_ftype( struct xfs_dir2_data_entry *dep) { - __uint8_t ftype = dep->name[dep->namelen]; + uint8_t ftype = dep->name[dep->namelen]; if (ftype >= XFS_DIR3_FT_MAX) return XFS_DIR3_FT_UNKNOWN; @@ -271,7 +271,7 @@ xfs_dir3_data_get_ftype( static void xfs_dir3_data_put_ftype( struct xfs_dir2_data_entry *dep, - __uint8_t type) + uint8_t type) { ASSERT(type < XFS_DIR3_FT_MAX); ASSERT(dep->namelen != 0); diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h index 9a492a9..38cba81 100644 --- a/fs/xfs/libxfs/xfs_da_format.h +++ b/fs/xfs/libxfs/xfs_da_format.h @@ -111,11 +111,11 @@ struct xfs_da3_intnode { * appropriate. */ struct xfs_da3_icnode_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t level; + uint32_t forw; + uint32_t back; + uint16_t magic; + uint16_t count; + uint16_t level; }; /* @@ -187,14 +187,14 @@ struct xfs_da3_icnode_hdr { /* * Byte offset in data block and shortform entry. */ -typedef __uint16_t xfs_dir2_data_off_t; +typedef uint16_t xfs_dir2_data_off_t; #define NULLDATAOFF 0xffffU typedef uint xfs_dir2_data_aoff_t; /* argument form */ /* * Offset in data space of a data entry. */ -typedef __uint32_t xfs_dir2_dataptr_t; +typedef uint32_t xfs_dir2_dataptr_t; #define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) #define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) @@ -206,7 +206,7 @@ typedef xfs_off_t xfs_dir2_off_t; /* * Directory block number (logical dirblk in file) */ -typedef __uint32_t xfs_dir2_db_t; +typedef uint32_t xfs_dir2_db_t; #define XFS_INO32_SIZE 4 #define XFS_INO64_SIZE 8 @@ -226,9 +226,9 @@ typedef __uint32_t xfs_dir2_db_t; * over them. */ typedef struct xfs_dir2_sf_hdr { - __uint8_t count; /* count of entries */ - __uint8_t i8count; /* count of 8-byte inode #s */ - __uint8_t parent[8]; /* parent dir inode number */ + uint8_t count; /* count of entries */ + uint8_t i8count; /* count of 8-byte inode #s */ + uint8_t parent[8]; /* parent dir inode number */ } __packed xfs_dir2_sf_hdr_t; typedef struct xfs_dir2_sf_entry { @@ -447,11 +447,11 @@ struct xfs_dir3_leaf_hdr { }; struct xfs_dir3_icleaf_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t stale; + uint32_t forw; + uint32_t back; + uint16_t magic; + uint16_t count; + uint16_t stale; }; /* @@ -538,10 +538,10 @@ struct xfs_dir3_free { * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. */ struct xfs_dir3_icfree_hdr { - __uint32_t magic; - __uint32_t firstdb; - __uint32_t nvalid; - __uint32_t nused; + uint32_t magic; + uint32_t firstdb; + uint32_t nvalid; + uint32_t nused; }; @@ -632,10 +632,10 @@ typedef struct xfs_attr_shortform { __u8 padding; } hdr; struct xfs_attr_sf_entry { - __uint8_t namelen; /* actual length of name (no NULL) */ - __uint8_t valuelen; /* actual length of value (no NULL) */ - __uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */ - __uint8_t nameval[1]; /* name & value bytes concatenated */ + uint8_t namelen; /* actual length of name (no NULL) */ + uint8_t valuelen; /* actual length of value (no NULL) */ + uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */ + uint8_t nameval[1]; /* name & value bytes concatenated */ } list[1]; /* variable sized array */ } xfs_attr_shortform_t; @@ -725,22 +725,22 @@ struct xfs_attr3_leafblock { * incore, neutral version of the attribute leaf header */ struct xfs_attr3_icleaf_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t usedbytes; + uint32_t forw; + uint32_t back; + uint16_t magic; + uint16_t count; + uint16_t usedbytes; /* * firstused is 32-bit here instead of 16-bit like the on-disk variant * to support maximum fsb size of 64k without overflow issues throughout * the attr code. Instead, the overflow condition is handled on * conversion to/from disk. */ - __uint32_t firstused; + uint32_t firstused; __u8 holes; struct { - __uint16_t base; - __uint16_t size; + uint16_t base; + uint16_t size; } freemap[XFS_ATTR_LEAF_MAPSIZE]; }; diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h index becc926..c66634f 100644 --- a/fs/xfs/libxfs/xfs_dir2.h +++ b/fs/xfs/libxfs/xfs_dir2.h @@ -45,9 +45,9 @@ struct xfs_dir_ops { struct xfs_dir2_sf_entry * (*sf_nextentry)(struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep); - __uint8_t (*sf_get_ftype)(struct xfs_dir2_sf_entry *sfep); + uint8_t (*sf_get_ftype)(struct xfs_dir2_sf_entry *sfep); void (*sf_put_ftype)(struct xfs_dir2_sf_entry *sfep, - __uint8_t ftype); + uint8_t ftype); xfs_ino_t (*sf_get_ino)(struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep); void (*sf_put_ino)(struct xfs_dir2_sf_hdr *hdr, @@ -58,9 +58,9 @@ struct xfs_dir_ops { xfs_ino_t ino); int (*data_entsize)(int len); - __uint8_t (*data_get_ftype)(struct xfs_dir2_data_entry *dep); + uint8_t (*data_get_ftype)(struct xfs_dir2_data_entry *dep); void (*data_put_ftype)(struct xfs_dir2_data_entry *dep, - __uint8_t ftype); + uint8_t ftype); __be16 * (*data_entry_tag_p)(struct xfs_dir2_data_entry *dep); struct xfs_dir2_data_free * (*data_bestfree_p)(struct xfs_dir2_data_hdr *hdr); diff --git a/fs/xfs/libxfs/xfs_dir2_leaf.c b/fs/xfs/libxfs/xfs_dir2_leaf.c index b887fb2..68bf3e8 100644 --- a/fs/xfs/libxfs/xfs_dir2_leaf.c +++ b/fs/xfs/libxfs/xfs_dir2_leaf.c @@ -145,7 +145,7 @@ xfs_dir3_leaf_check_int( static bool xfs_dir3_leaf_verify( struct xfs_buf *bp, - __uint16_t magic) + uint16_t magic) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_dir2_leaf *leaf = bp->b_addr; @@ -154,7 +154,7 @@ xfs_dir3_leaf_verify( if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; - __uint16_t magic3; + uint16_t magic3; magic3 = (magic == XFS_DIR2_LEAF1_MAGIC) ? XFS_DIR3_LEAF1_MAGIC : XFS_DIR3_LEAFN_MAGIC; @@ -178,7 +178,7 @@ xfs_dir3_leaf_verify( static void __read_verify( struct xfs_buf *bp, - __uint16_t magic) + uint16_t magic) { struct xfs_mount *mp = bp->b_target->bt_mount; @@ -195,7 +195,7 @@ __read_verify( static void __write_verify( struct xfs_buf *bp, - __uint16_t magic) + uint16_t magic) { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_buf_log_item *bip = bp->b_fspriv; @@ -299,7 +299,7 @@ xfs_dir3_leaf_init( struct xfs_trans *tp, struct xfs_buf *bp, xfs_ino_t owner, - __uint16_t type) + uint16_t type) { struct xfs_dir2_leaf *leaf = bp->b_addr; @@ -343,7 +343,7 @@ xfs_dir3_leaf_get_buf( xfs_da_args_t *args, xfs_dir2_db_t bno, struct xfs_buf **bpp, - __uint16_t magic) + uint16_t magic) { struct xfs_inode *dp = args->dp; struct xfs_trans *tp = args->trans; diff --git a/fs/xfs/libxfs/xfs_dir2_priv.h b/fs/xfs/libxfs/xfs_dir2_priv.h index ef9f6ea..673fc8b 100644 --- a/fs/xfs/libxfs/xfs_dir2_priv.h +++ b/fs/xfs/libxfs/xfs_dir2_priv.h @@ -70,7 +70,7 @@ extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_dir2_leaf_entry *ents, int *indexp, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, - struct xfs_buf **bpp, __uint16_t magic); + struct xfs_buf **bpp, uint16_t magic); extern void xfs_dir3_leaf_log_ents(struct xfs_da_args *args, struct xfs_buf *bp, int first, int last); extern void xfs_dir3_leaf_log_header(struct xfs_da_args *args, diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index f814d42..3d51015 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -103,8 +103,8 @@ struct xfs_ifork; * Must be padded to 64 bit alignment. */ typedef struct xfs_sb { - __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ - __uint32_t sb_blocksize; /* logical block size, bytes */ + uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ + uint32_t sb_blocksize; /* logical block size, bytes */ xfs_rfsblock_t sb_dblocks; /* number of data blocks */ xfs_rfsblock_t sb_rblocks; /* number of realtime blocks */ xfs_rtblock_t sb_rextents; /* number of realtime extents */ @@ -118,45 +118,45 @@ typedef struct xfs_sb { xfs_agnumber_t sb_agcount; /* number of allocation groups */ xfs_extlen_t sb_rbmblocks; /* number of rt bitmap blocks */ xfs_extlen_t sb_logblocks; /* number of log blocks */ - __uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */ - __uint16_t sb_sectsize; /* volume sector size, bytes */ - __uint16_t sb_inodesize; /* inode size, bytes */ - __uint16_t sb_inopblock; /* inodes per block */ + uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */ + uint16_t sb_sectsize; /* volume sector size, bytes */ + uint16_t sb_inodesize; /* inode size, bytes */ + uint16_t sb_inopblock; /* inodes per block */ char sb_fname[12]; /* file system name */ - __uint8_t sb_blocklog; /* log2 of sb_blocksize */ - __uint8_t sb_sectlog; /* log2 of sb_sectsize */ - __uint8_t sb_inodelog; /* log2 of sb_inodesize */ - __uint8_t sb_inopblog; /* log2 of sb_inopblock */ - __uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */ - __uint8_t sb_rextslog; /* log2 of sb_rextents */ - __uint8_t sb_inprogress; /* mkfs is in progress, don't mount */ - __uint8_t sb_imax_pct; /* max % of fs for inode space */ + uint8_t sb_blocklog; /* log2 of sb_blocksize */ + uint8_t sb_sectlog; /* log2 of sb_sectsize */ + uint8_t sb_inodelog; /* log2 of sb_inodesize */ + uint8_t sb_inopblog; /* log2 of sb_inopblock */ + uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */ + uint8_t sb_rextslog; /* log2 of sb_rextents */ + uint8_t sb_inprogress; /* mkfs is in progress, don't mount */ + uint8_t sb_imax_pct; /* max % of fs for inode space */ /* statistics */ /* * These fields must remain contiguous. If you really * want to change their layout, make sure you fix the * code in xfs_trans_apply_sb_deltas(). */ - __uint64_t sb_icount; /* allocated inodes */ - __uint64_t sb_ifree; /* free inodes */ - __uint64_t sb_fdblocks; /* free data blocks */ - __uint64_t sb_frextents; /* free realtime extents */ + uint64_t sb_icount; /* allocated inodes */ + uint64_t sb_ifree; /* free inodes */ + uint64_t sb_fdblocks; /* free data blocks */ + uint64_t sb_frextents; /* free realtime extents */ /* * End contiguous fields. */ xfs_ino_t sb_uquotino; /* user quota inode */ xfs_ino_t sb_gquotino; /* group quota inode */ - __uint16_t sb_qflags; /* quota flags */ - __uint8_t sb_flags; /* misc. flags */ - __uint8_t sb_shared_vn; /* shared version number */ + uint16_t sb_qflags; /* quota flags */ + uint8_t sb_flags; /* misc. flags */ + uint8_t sb_shared_vn; /* shared version number */ xfs_extlen_t sb_inoalignmt; /* inode chunk alignment, fsblocks */ - __uint32_t sb_unit; /* stripe or raid unit */ - __uint32_t sb_width; /* stripe or raid width */ - __uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */ - __uint8_t sb_logsectlog; /* log2 of the log sector size */ - __uint16_t sb_logsectsize; /* sector size for the log, bytes */ - __uint32_t sb_logsunit; /* stripe unit size for the log */ - __uint32_t sb_features2; /* additional feature bits */ + uint32_t sb_unit; /* stripe or raid unit */ + uint32_t sb_width; /* stripe or raid width */ + uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */ + uint8_t sb_logsectlog; /* log2 of the log sector size */ + uint16_t sb_logsectsize; /* sector size for the log, bytes */ + uint32_t sb_logsunit; /* stripe unit size for the log */ + uint32_t sb_features2; /* additional feature bits */ /* * bad features2 field as a result of failing to pad the sb structure to @@ -167,17 +167,17 @@ typedef struct xfs_sb { * the value in sb_features2 when formatting the incore superblock to * the disk buffer. */ - __uint32_t sb_bad_features2; + uint32_t sb_bad_features2; /* version 5 superblock fields start here */ /* feature masks */ - __uint32_t sb_features_compat; - __uint32_t sb_features_ro_compat; - __uint32_t sb_features_incompat; - __uint32_t sb_features_log_incompat; + uint32_t sb_features_compat; + uint32_t sb_features_ro_compat; + uint32_t sb_features_incompat; + uint32_t sb_features_log_incompat; - __uint32_t sb_crc; /* superblock crc */ + uint32_t sb_crc; /* superblock crc */ xfs_extlen_t sb_spino_align; /* sparse inode chunk alignment */ xfs_ino_t sb_pquotino; /* project quota inode */ @@ -449,7 +449,7 @@ static inline void xfs_sb_version_addprojid32bit(struct xfs_sb *sbp) static inline bool xfs_sb_has_compat_feature( struct xfs_sb *sbp, - __uint32_t feature) + uint32_t feature) { return (sbp->sb_features_compat & feature) != 0; } @@ -463,7 +463,7 @@ xfs_sb_has_compat_feature( static inline bool xfs_sb_has_ro_compat_feature( struct xfs_sb *sbp, - __uint32_t feature) + uint32_t feature) { return (sbp->sb_features_ro_compat & feature) != 0; } @@ -480,7 +480,7 @@ xfs_sb_has_ro_compat_feature( static inline bool xfs_sb_has_incompat_feature( struct xfs_sb *sbp, - __uint32_t feature) + uint32_t feature) { return (sbp->sb_features_incompat & feature) != 0; } @@ -490,7 +490,7 @@ xfs_sb_has_incompat_feature( static inline bool xfs_sb_has_incompat_log_feature( struct xfs_sb *sbp, - __uint32_t feature) + uint32_t feature) { return (sbp->sb_features_log_incompat & feature) != 0; } @@ -586,8 +586,8 @@ xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) */ #define XFS_FSB_TO_B(mp,fsbno) ((xfs_fsize_t)(fsbno) << (mp)->m_sb.sb_blocklog) #define XFS_B_TO_FSB(mp,b) \ - ((((__uint64_t)(b)) + (mp)->m_blockmask) >> (mp)->m_sb.sb_blocklog) -#define XFS_B_TO_FSBT(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_blocklog) + ((((uint64_t)(b)) + (mp)->m_blockmask) >> (mp)->m_sb.sb_blocklog) +#define XFS_B_TO_FSBT(mp,b) (((uint64_t)(b)) >> (mp)->m_sb.sb_blocklog) #define XFS_B_FSB_OFFSET(mp,b) ((b) & (mp)->m_blockmask) /* @@ -1045,7 +1045,7 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) * next agno_log bits - ag number * high agno_log-agblklog-inopblog bits - 0 */ -#define XFS_INO_MASK(k) (__uint32_t)((1ULL << (k)) - 1) +#define XFS_INO_MASK(k) (uint32_t)((1ULL << (k)) - 1) #define XFS_INO_OFFSET_BITS(mp) (mp)->m_sb.sb_inopblog #define XFS_INO_AGBNO_BITS(mp) (mp)->m_sb.sb_agblklog #define XFS_INO_AGINO_BITS(mp) (mp)->m_agino_log @@ -1242,16 +1242,16 @@ typedef __be32 xfs_alloc_ptr_t; #define XFS_FIBT_MAGIC 0x46494254 /* 'FIBT' */ #define XFS_FIBT_CRC_MAGIC 0x46494233 /* 'FIB3' */ -typedef __uint64_t xfs_inofree_t; +typedef uint64_t xfs_inofree_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) #define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) #define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) #define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) #define XFS_INOBT_HOLEMASK_FULL 0 /* holemask for full chunk */ -#define XFS_INOBT_HOLEMASK_BITS (NBBY * sizeof(__uint16_t)) +#define XFS_INOBT_HOLEMASK_BITS (NBBY * sizeof(uint16_t)) #define XFS_INODES_PER_HOLEMASK_BIT \ - (XFS_INODES_PER_CHUNK / (NBBY * sizeof(__uint16_t))) + (XFS_INODES_PER_CHUNK / (NBBY * sizeof(uint16_t))) static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) { @@ -1285,9 +1285,9 @@ typedef struct xfs_inobt_rec { typedef struct xfs_inobt_rec_incore { xfs_agino_t ir_startino; /* starting inode number */ - __uint16_t ir_holemask; /* hole mask for sparse chunks */ - __uint8_t ir_count; /* total inode count */ - __uint8_t ir_freecount; /* count of free inodes (set bits) */ + uint16_t ir_holemask; /* hole mask for sparse chunks */ + uint8_t ir_count; /* total inode count */ + uint8_t ir_freecount; /* count of free inodes (set bits) */ xfs_inofree_t ir_free; /* free inode mask */ } xfs_inobt_rec_incore_t; @@ -1368,15 +1368,15 @@ struct xfs_rmap_rec { * rm_offset:54-60 aren't used and should be zero * rm_offset:0-53 is the block offset within the inode */ -#define XFS_RMAP_OFF_ATTR_FORK ((__uint64_t)1ULL << 63) -#define XFS_RMAP_OFF_BMBT_BLOCK ((__uint64_t)1ULL << 62) -#define XFS_RMAP_OFF_UNWRITTEN ((__uint64_t)1ULL << 61) +#define XFS_RMAP_OFF_ATTR_FORK ((uint64_t)1ULL << 63) +#define XFS_RMAP_OFF_BMBT_BLOCK ((uint64_t)1ULL << 62) +#define XFS_RMAP_OFF_UNWRITTEN ((uint64_t)1ULL << 61) -#define XFS_RMAP_LEN_MAX ((__uint32_t)~0U) +#define XFS_RMAP_LEN_MAX ((uint32_t)~0U) #define XFS_RMAP_OFF_FLAGS (XFS_RMAP_OFF_ATTR_FORK | \ XFS_RMAP_OFF_BMBT_BLOCK | \ XFS_RMAP_OFF_UNWRITTEN) -#define XFS_RMAP_OFF_MASK ((__uint64_t)0x3FFFFFFFFFFFFFULL) +#define XFS_RMAP_OFF_MASK ((uint64_t)0x3FFFFFFFFFFFFFULL) #define XFS_RMAP_OFF(off) ((off) & XFS_RMAP_OFF_MASK) @@ -1402,8 +1402,8 @@ struct xfs_rmap_rec { struct xfs_rmap_irec { xfs_agblock_t rm_startblock; /* extent start block */ xfs_extlen_t rm_blockcount; /* extent length */ - __uint64_t rm_owner; /* extent owner */ - __uint64_t rm_offset; /* offset within the owner */ + uint64_t rm_owner; /* extent owner */ + uint64_t rm_offset; /* offset within the owner */ unsigned int rm_flags; /* state flags */ }; @@ -1459,11 +1459,11 @@ typedef struct xfs_bmbt_rec { __be64 l0, l1; } xfs_bmbt_rec_t; -typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ +typedef uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; typedef struct xfs_bmbt_rec_host { - __uint64_t l0, l1; + uint64_t l0, l1; } xfs_bmbt_rec_host_t; /* diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 7945505..c6fdce2 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -286,10 +286,10 @@ typedef struct xfs_bstat { * and using two 16bit values to hold new 32bit projid was choosen * to retain compatibility with "old" filesystems). */ -static inline __uint32_t +static inline uint32_t bstat_get_projid(struct xfs_bstat *bs) { - return (__uint32_t)bs->bs_projid_hi << 16 | bs->bs_projid_lo; + return (uint32_t)bs->bs_projid_hi << 16 | bs->bs_projid_lo; } /* @@ -439,10 +439,10 @@ typedef struct xfs_handle { */ typedef struct xfs_swapext { - __int64_t sx_version; /* version */ + int64_t sx_version; /* version */ #define XFS_SX_VERSION 0 - __int64_t sx_fdtarget; /* fd of target file */ - __int64_t sx_fdtmp; /* fd of tmp file */ + int64_t sx_fdtarget; /* fd of target file */ + int64_t sx_fdtmp; /* fd of tmp file */ xfs_off_t sx_offset; /* offset into file */ xfs_off_t sx_length; /* leng from offset */ char sx_pad[16]; /* pad space, unused */ @@ -529,7 +529,7 @@ typedef struct xfs_swapext #define XFS_IOC_ATTRLIST_BY_HANDLE _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq) #define XFS_IOC_ATTRMULTI_BY_HANDLE _IOW ('X', 123, struct xfs_fsop_attrmulti_handlereq) #define XFS_IOC_FSGEOMETRY _IOR ('X', 124, struct xfs_fsop_geom) -#define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t) +#define XFS_IOC_GOINGDOWN _IOR ('X', 125, uint32_t) /* XFS_IOC_GETFSUUID ---------- deprecated 140 */ diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 51b4e0d..ff97f76 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -141,9 +141,9 @@ xfs_inobt_get_rec( STATIC int xfs_inobt_insert_rec( struct xfs_btree_cur *cur, - __uint16_t holemask, - __uint8_t count, - __int32_t freecount, + uint16_t holemask, + uint8_t count, + int32_t freecount, xfs_inofree_t free, int *stat) { diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index 31ca220..3cb3342 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -196,12 +196,12 @@ xfs_finobt_init_ptr_from_cur( ptr->s = agi->agi_free_root; } -STATIC __int64_t +STATIC int64_t xfs_inobt_key_diff( struct xfs_btree_cur *cur, union xfs_btree_key *key) { - return (__int64_t)be32_to_cpu(key->inobt.ir_startino) - + return (int64_t)be32_to_cpu(key->inobt.ir_startino) - cur->bc_rec.i.ir_startino; } diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index 4b9769e..33e3856 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -397,7 +397,7 @@ xfs_dinode_calc_crc( struct xfs_mount *mp, struct xfs_dinode *dip) { - __uint32_t crc; + uint32_t crc; if (dip->di_version < 3) return; diff --git a/fs/xfs/libxfs/xfs_inode_buf.h b/fs/xfs/libxfs/xfs_inode_buf.h index 7c4dd32..9fe9ee9 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.h +++ b/fs/xfs/libxfs/xfs_inode_buf.h @@ -28,25 +28,25 @@ struct xfs_dinode; * format specific structures at the appropriate time. */ struct xfs_icdinode { - __int8_t di_version; /* inode version */ - __int8_t di_format; /* format of di_c data */ - __uint16_t di_flushiter; /* incremented on flush */ - __uint32_t di_uid; /* owner's user id */ - __uint32_t di_gid; /* owner's group id */ - __uint16_t di_projid_lo; /* lower part of owner's project id */ - __uint16_t di_projid_hi; /* higher part of owner's project id */ + int8_t di_version; /* inode version */ + int8_t di_format; /* format of di_c data */ + uint16_t di_flushiter; /* incremented on flush */ + uint32_t di_uid; /* owner's user id */ + uint32_t di_gid; /* owner's group id */ + uint16_t di_projid_lo; /* lower part of owner's project id */ + uint16_t di_projid_hi; /* higher part of owner's project id */ xfs_fsize_t di_size; /* number of bytes in file */ xfs_rfsblock_t di_nblocks; /* # of direct & btree blocks used */ xfs_extlen_t di_extsize; /* basic/minimum extent size for file */ xfs_extnum_t di_nextents; /* number of extents in data fork */ xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/ - __uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ - __int8_t di_aformat; /* format of attr fork's data */ - __uint32_t di_dmevmask; /* DMIG event mask */ - __uint16_t di_dmstate; /* DMIG state info */ - __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ + uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ + int8_t di_aformat; /* format of attr fork's data */ + uint32_t di_dmevmask; /* DMIG event mask */ + uint16_t di_dmstate; /* DMIG state info */ + uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ - __uint64_t di_flags2; /* more random flags */ + uint64_t di_flags2; /* more random flags */ xfs_ictimestamp_t di_crtime; /* time created */ }; diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index a6eed43..ca273f6 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -31,7 +31,7 @@ struct xfs_trans_res; * through all the log items definitions and everything they encode into the * log. */ -typedef __uint32_t xlog_tid_t; +typedef uint32_t xlog_tid_t; #define XLOG_MIN_ICLOGS 2 #define XLOG_MAX_ICLOGS 8 @@ -207,7 +207,7 @@ typedef struct xfs_log_iovec { typedef struct xfs_trans_header { uint th_magic; /* magic number */ uint th_type; /* transaction type */ - __int32_t th_tid; /* transaction id (unused) */ + int32_t th_tid; /* transaction id (unused) */ uint th_num_items; /* num items logged by trans */ } xfs_trans_header_t; @@ -253,52 +253,52 @@ typedef struct xfs_trans_header { * must be added on to the end. */ typedef struct xfs_inode_log_format { - __uint16_t ilf_type; /* inode log item type */ - __uint16_t ilf_size; /* size of this item */ - __uint32_t ilf_fields; /* flags for fields logged */ - __uint16_t ilf_asize; /* size of attr d/ext/root */ - __uint16_t ilf_dsize; /* size of data/ext/root */ - __uint64_t ilf_ino; /* inode number */ + uint16_t ilf_type; /* inode log item type */ + uint16_t ilf_size; /* size of this item */ + uint32_t ilf_fields; /* flags for fields logged */ + uint16_t ilf_asize; /* size of attr d/ext/root */ + uint16_t ilf_dsize; /* size of data/ext/root */ + uint64_t ilf_ino; /* inode number */ union { - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ + uint32_t ilfu_rdev; /* rdev value for dev inode*/ uuid_t ilfu_uuid; /* mount point value */ } ilf_u; - __int64_t ilf_blkno; /* blkno of inode buffer */ - __int32_t ilf_len; /* len of inode buffer */ - __int32_t ilf_boffset; /* off of inode in buffer */ + int64_t ilf_blkno; /* blkno of inode buffer */ + int32_t ilf_len; /* len of inode buffer */ + int32_t ilf_boffset; /* off of inode in buffer */ } xfs_inode_log_format_t; typedef struct xfs_inode_log_format_32 { - __uint16_t ilf_type; /* inode log item type */ - __uint16_t ilf_size; /* size of this item */ - __uint32_t ilf_fields; /* flags for fields logged */ - __uint16_t ilf_asize; /* size of attr d/ext/root */ - __uint16_t ilf_dsize; /* size of data/ext/root */ - __uint64_t ilf_ino; /* inode number */ + uint16_t ilf_type; /* inode log item type */ + uint16_t ilf_size; /* size of this item */ + uint32_t ilf_fields; /* flags for fields logged */ + uint16_t ilf_asize; /* size of attr d/ext/root */ + uint16_t ilf_dsize; /* size of data/ext/root */ + uint64_t ilf_ino; /* inode number */ union { - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ + uint32_t ilfu_rdev; /* rdev value for dev inode*/ uuid_t ilfu_uuid; /* mount point value */ } ilf_u; - __int64_t ilf_blkno; /* blkno of inode buffer */ - __int32_t ilf_len; /* len of inode buffer */ - __int32_t ilf_boffset; /* off of inode in buffer */ + int64_t ilf_blkno; /* blkno of inode buffer */ + int32_t ilf_len; /* len of inode buffer */ + int32_t ilf_boffset; /* off of inode in buffer */ } __attribute__((packed)) xfs_inode_log_format_32_t; typedef struct xfs_inode_log_format_64 { - __uint16_t ilf_type; /* inode log item type */ - __uint16_t ilf_size; /* size of this item */ - __uint32_t ilf_fields; /* flags for fields logged */ - __uint16_t ilf_asize; /* size of attr d/ext/root */ - __uint16_t ilf_dsize; /* size of data/ext/root */ - __uint32_t ilf_pad; /* pad for 64 bit boundary */ - __uint64_t ilf_ino; /* inode number */ + uint16_t ilf_type; /* inode log item type */ + uint16_t ilf_size; /* size of this item */ + uint32_t ilf_fields; /* flags for fields logged */ + uint16_t ilf_asize; /* size of attr d/ext/root */ + uint16_t ilf_dsize; /* size of data/ext/root */ + uint32_t ilf_pad; /* pad for 64 bit boundary */ + uint64_t ilf_ino; /* inode number */ union { - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ + uint32_t ilfu_rdev; /* rdev value for dev inode*/ uuid_t ilfu_uuid; /* mount point value */ } ilf_u; - __int64_t ilf_blkno; /* blkno of inode buffer */ - __int32_t ilf_len; /* len of inode buffer */ - __int32_t ilf_boffset; /* off of inode in buffer */ + int64_t ilf_blkno; /* blkno of inode buffer */ + int32_t ilf_len; /* len of inode buffer */ + int32_t ilf_boffset; /* off of inode in buffer */ } xfs_inode_log_format_64_t; @@ -367,8 +367,8 @@ static inline int xfs_ilog_fdata(int w) * information. */ typedef struct xfs_ictimestamp { - __int32_t t_sec; /* timestamp seconds */ - __int32_t t_nsec; /* timestamp nanoseconds */ + int32_t t_sec; /* timestamp seconds */ + int32_t t_nsec; /* timestamp nanoseconds */ } xfs_ictimestamp_t; /* @@ -376,18 +376,18 @@ typedef struct xfs_ictimestamp { * kept identical to struct xfs_dinode except for the endianness annotations. */ struct xfs_log_dinode { - __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ - __uint16_t di_mode; /* mode and type of file */ - __int8_t di_version; /* inode version */ - __int8_t di_format; /* format of di_c data */ - __uint8_t di_pad3[2]; /* unused in v2/3 inodes */ - __uint32_t di_uid; /* owner's user id */ - __uint32_t di_gid; /* owner's group id */ - __uint32_t di_nlink; /* number of links to file */ - __uint16_t di_projid_lo; /* lower part of owner's project id */ - __uint16_t di_projid_hi; /* higher part of owner's project id */ - __uint8_t di_pad[6]; /* unused, zeroed space */ - __uint16_t di_flushiter; /* incremented on flush */ + uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ + uint16_t di_mode; /* mode and type of file */ + int8_t di_version; /* inode version */ + int8_t di_format; /* format of di_c data */ + uint8_t di_pad3[2]; /* unused in v2/3 inodes */ + uint32_t di_uid; /* owner's user id */ + uint32_t di_gid; /* owner's group id */ + uint32_t di_nlink; /* number of links to file */ + uint16_t di_projid_lo; /* lower part of owner's project id */ + uint16_t di_projid_hi; /* higher part of owner's project id */ + uint8_t di_pad[6]; /* unused, zeroed space */ + uint16_t di_flushiter; /* incremented on flush */ xfs_ictimestamp_t di_atime; /* time last accessed */ xfs_ictimestamp_t di_mtime; /* time last modified */ xfs_ictimestamp_t di_ctime; /* time created/inode modified */ @@ -396,22 +396,22 @@ struct xfs_log_dinode { xfs_extlen_t di_extsize; /* basic/minimum extent size for file */ xfs_extnum_t di_nextents; /* number of extents in data fork */ xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/ - __uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ - __int8_t di_aformat; /* format of attr fork's data */ - __uint32_t di_dmevmask; /* DMIG event mask */ - __uint16_t di_dmstate; /* DMIG state info */ - __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ - __uint32_t di_gen; /* generation number */ + uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ + int8_t di_aformat; /* format of attr fork's data */ + uint32_t di_dmevmask; /* DMIG event mask */ + uint16_t di_dmstate; /* DMIG state info */ + uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ + uint32_t di_gen; /* generation number */ /* di_next_unlinked is the only non-core field in the old dinode */ xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */ /* start of the extended dinode, writable fields */ - __uint32_t di_crc; /* CRC of the inode */ - __uint64_t di_changecount; /* number of attribute changes */ + uint32_t di_crc; /* CRC of the inode */ + uint64_t di_changecount; /* number of attribute changes */ xfs_lsn_t di_lsn; /* flush sequence */ - __uint64_t di_flags2; /* more random flags */ - __uint8_t di_pad2[16]; /* more padding for future expansion */ + uint64_t di_flags2; /* more random flags */ + uint8_t di_pad2[16]; /* more padding for future expansion */ /* fields only written to during inode creation */ xfs_ictimestamp_t di_crtime; /* time created */ @@ -470,7 +470,7 @@ typedef struct xfs_buf_log_format { unsigned short blf_size; /* size of this item */ ushort blf_flags; /* misc state */ ushort blf_len; /* number of blocks in this buf */ - __int64_t blf_blkno; /* starting blkno of this buf */ + int64_t blf_blkno; /* starting blkno of this buf */ unsigned int blf_map_size; /* used size of data bitmap in words */ unsigned int blf_data_map[XFS_BLF_DATAMAP_SIZE]; /* dirty bitmap */ } xfs_buf_log_format_t; @@ -520,7 +520,7 @@ xfs_blft_to_flags(struct xfs_buf_log_format *blf, enum xfs_blft type) blf->blf_flags |= ((type << XFS_BLFT_SHIFT) & XFS_BLFT_MASK); } -static inline __uint16_t +static inline uint16_t xfs_blft_from_flags(struct xfs_buf_log_format *blf) { return (blf->blf_flags & XFS_BLFT_MASK) >> XFS_BLFT_SHIFT; @@ -541,14 +541,14 @@ typedef struct xfs_extent { * conversion routine. */ typedef struct xfs_extent_32 { - __uint64_t ext_start; - __uint32_t ext_len; + uint64_t ext_start; + uint32_t ext_len; } __attribute__((packed)) xfs_extent_32_t; typedef struct xfs_extent_64 { - __uint64_t ext_start; - __uint32_t ext_len; - __uint32_t ext_pad; + uint64_t ext_start; + uint32_t ext_len; + uint32_t ext_pad; } xfs_extent_64_t; /* @@ -557,26 +557,26 @@ typedef struct xfs_extent_64 { * size is given by efi_nextents. */ typedef struct xfs_efi_log_format { - __uint16_t efi_type; /* efi log item type */ - __uint16_t efi_size; /* size of this item */ - __uint32_t efi_nextents; /* # extents to free */ - __uint64_t efi_id; /* efi identifier */ + uint16_t efi_type; /* efi log item type */ + uint16_t efi_size; /* size of this item */ + uint32_t efi_nextents; /* # extents to free */ + uint64_t efi_id; /* efi identifier */ xfs_extent_t efi_extents[1]; /* array of extents to free */ } xfs_efi_log_format_t; typedef struct xfs_efi_log_format_32 { - __uint16_t efi_type; /* efi log item type */ - __uint16_t efi_size; /* size of this item */ - __uint32_t efi_nextents; /* # extents to free */ - __uint64_t efi_id; /* efi identifier */ + uint16_t efi_type; /* efi log item type */ + uint16_t efi_size; /* size of this item */ + uint32_t efi_nextents; /* # extents to free */ + uint64_t efi_id; /* efi identifier */ xfs_extent_32_t efi_extents[1]; /* array of extents to free */ } __attribute__((packed)) xfs_efi_log_format_32_t; typedef struct xfs_efi_log_format_64 { - __uint16_t efi_type; /* efi log item type */ - __uint16_t efi_size; /* size of this item */ - __uint32_t efi_nextents; /* # extents to free */ - __uint64_t efi_id; /* efi identifier */ + uint16_t efi_type; /* efi log item type */ + uint16_t efi_size; /* size of this item */ + uint32_t efi_nextents; /* # extents to free */ + uint64_t efi_id; /* efi identifier */ xfs_extent_64_t efi_extents[1]; /* array of extents to free */ } xfs_efi_log_format_64_t; @@ -586,26 +586,26 @@ typedef struct xfs_efi_log_format_64 { * size is given by efd_nextents; */ typedef struct xfs_efd_log_format { - __uint16_t efd_type; /* efd log item type */ - __uint16_t efd_size; /* size of this item */ - __uint32_t efd_nextents; /* # of extents freed */ - __uint64_t efd_efi_id; /* id of corresponding efi */ + uint16_t efd_type; /* efd log item type */ + uint16_t efd_size; /* size of this item */ + uint32_t efd_nextents; /* # of extents freed */ + uint64_t efd_efi_id; /* id of corresponding efi */ xfs_extent_t efd_extents[1]; /* array of extents freed */ } xfs_efd_log_format_t; typedef struct xfs_efd_log_format_32 { - __uint16_t efd_type; /* efd log item type */ - __uint16_t efd_size; /* size of this item */ - __uint32_t efd_nextents; /* # of extents freed */ - __uint64_t efd_efi_id; /* id of corresponding efi */ + uint16_t efd_type; /* efd log item type */ + uint16_t efd_size; /* size of this item */ + uint32_t efd_nextents; /* # of extents freed */ + uint64_t efd_efi_id; /* id of corresponding efi */ xfs_extent_32_t efd_extents[1]; /* array of extents freed */ } __attribute__((packed)) xfs_efd_log_format_32_t; typedef struct xfs_efd_log_format_64 { - __uint16_t efd_type; /* efd log item type */ - __uint16_t efd_size; /* size of this item */ - __uint32_t efd_nextents; /* # of extents freed */ - __uint64_t efd_efi_id; /* id of corresponding efi */ + uint16_t efd_type; /* efd log item type */ + uint16_t efd_size; /* size of this item */ + uint32_t efd_nextents; /* # of extents freed */ + uint64_t efd_efi_id; /* id of corresponding efi */ xfs_extent_64_t efd_extents[1]; /* array of extents freed */ } xfs_efd_log_format_64_t; @@ -613,11 +613,11 @@ typedef struct xfs_efd_log_format_64 { * RUI/RUD (reverse mapping) log format definitions */ struct xfs_map_extent { - __uint64_t me_owner; - __uint64_t me_startblock; - __uint64_t me_startoff; - __uint32_t me_len; - __uint32_t me_flags; + uint64_t me_owner; + uint64_t me_startblock; + uint64_t me_startoff; + uint32_t me_len; + uint32_t me_flags; }; /* rmap me_flags: upper bits are flags, lower byte is type code */ @@ -643,10 +643,10 @@ struct xfs_map_extent { * size is given by rui_nextents. */ struct xfs_rui_log_format { - __uint16_t rui_type; /* rui log item type */ - __uint16_t rui_size; /* size of this item */ - __uint32_t rui_nextents; /* # extents to free */ - __uint64_t rui_id; /* rui identifier */ + uint16_t rui_type; /* rui log item type */ + uint16_t rui_size; /* size of this item */ + uint32_t rui_nextents; /* # extents to free */ + uint64_t rui_id; /* rui identifier */ struct xfs_map_extent rui_extents[1]; /* array of extents to rmap */ }; @@ -656,10 +656,10 @@ struct xfs_rui_log_format { * size is given by rud_nextents; */ struct xfs_rud_log_format { - __uint16_t rud_type; /* rud log item type */ - __uint16_t rud_size; /* size of this item */ - __uint32_t __pad; - __uint64_t rud_rui_id; /* id of corresponding rui */ + uint16_t rud_type; /* rud log item type */ + uint16_t rud_size; /* size of this item */ + uint32_t __pad; + uint64_t rud_rui_id; /* id of corresponding rui */ }; /* @@ -669,12 +669,12 @@ struct xfs_rud_log_format { * 32 bits : log_recovery code assumes that. */ typedef struct xfs_dq_logformat { - __uint16_t qlf_type; /* dquot log item type */ - __uint16_t qlf_size; /* size of this item */ + uint16_t qlf_type; /* dquot log item type */ + uint16_t qlf_size; /* size of this item */ xfs_dqid_t qlf_id; /* usr/grp/proj id : 32 bits */ - __int64_t qlf_blkno; /* blkno of dquot buffer */ - __int32_t qlf_len; /* len of dquot buffer */ - __uint32_t qlf_boffset; /* off of dquot in buffer */ + int64_t qlf_blkno; /* blkno of dquot buffer */ + int32_t qlf_len; /* len of dquot buffer */ + uint32_t qlf_boffset; /* off of dquot in buffer */ } xfs_dq_logformat_t; /* @@ -733,8 +733,8 @@ typedef struct xfs_qoff_logformat { * decoding can be done correctly. */ struct xfs_icreate_log { - __uint16_t icl_type; /* type of log format structure */ - __uint16_t icl_size; /* size of log format structure */ + uint16_t icl_type; /* type of log format structure */ + uint16_t icl_size; /* size of log format structure */ __be32 icl_ag; /* ag being allocated in */ __be32 icl_agbno; /* start block of inode range */ __be32 icl_count; /* number of inodes to initialise */ diff --git a/fs/xfs/libxfs/xfs_log_recover.h b/fs/xfs/libxfs/xfs_log_recover.h index 8e385f9..1523780 100644 --- a/fs/xfs/libxfs/xfs_log_recover.h +++ b/fs/xfs/libxfs/xfs_log_recover.h @@ -26,7 +26,7 @@ #define XLOG_RHASH_SIZE 16 #define XLOG_RHASH_SHIFT 2 #define XLOG_RHASH(tid) \ - ((((__uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1)) + ((((uint32_t)tid)>>XLOG_RHASH_SHIFT) & (XLOG_RHASH_SIZE-1)) #define XLOG_MAX_REGIONS_IN_ITEM (XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK / 2 + 1) diff --git a/fs/xfs/libxfs/xfs_quota_defs.h b/fs/xfs/libxfs/xfs_quota_defs.h index 8eed512..d69c772 100644 --- a/fs/xfs/libxfs/xfs_quota_defs.h +++ b/fs/xfs/libxfs/xfs_quota_defs.h @@ -27,8 +27,8 @@ * they may need 64-bit accounting. Hence, 64-bit quota-counters, * and quota-limits. This is a waste in the common case, but hey ... */ -typedef __uint64_t xfs_qcnt_t; -typedef __uint16_t xfs_qwarncnt_t; +typedef uint64_t xfs_qcnt_t; +typedef uint16_t xfs_qwarncnt_t; /* * flags for q_flags field in the dquot. diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 73d0540..52b439f 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -1169,7 +1169,7 @@ int xfs_rmap_finish_one( struct xfs_trans *tp, enum xfs_rmap_intent_type type, - __uint64_t owner, + uint64_t owner, int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, @@ -1277,7 +1277,7 @@ __xfs_rmap_add( struct xfs_mount *mp, struct xfs_defer_ops *dfops, enum xfs_rmap_intent_type type, - __uint64_t owner, + uint64_t owner, int whichfork, struct xfs_bmbt_irec *bmap) { @@ -1358,7 +1358,7 @@ xfs_rmap_alloc_extent( xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, - __uint64_t owner) + uint64_t owner) { struct xfs_bmbt_irec bmap; @@ -1382,7 +1382,7 @@ xfs_rmap_free_extent( xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, - __uint64_t owner) + uint64_t owner) { struct xfs_bmbt_irec bmap; diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h index 71cf99a..74a420b 100644 --- a/fs/xfs/libxfs/xfs_rmap.h +++ b/fs/xfs/libxfs/xfs_rmap.h @@ -177,7 +177,7 @@ enum xfs_rmap_intent_type { struct xfs_rmap_intent { struct list_head ri_list; enum xfs_rmap_intent_type ri_type; - __uint64_t ri_owner; + uint64_t ri_owner; int ri_whichfork; struct xfs_bmbt_irec ri_bmap; }; @@ -194,15 +194,15 @@ int xfs_rmap_convert_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, struct xfs_bmbt_irec *imap); int xfs_rmap_alloc_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, - __uint64_t owner); + uint64_t owner); int xfs_rmap_free_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, - __uint64_t owner); + uint64_t owner); void xfs_rmap_finish_one_cleanup(struct xfs_trans *tp, struct xfs_btree_cur *rcur, int error); int xfs_rmap_finish_one(struct xfs_trans *tp, enum xfs_rmap_intent_type type, - __uint64_t owner, int whichfork, xfs_fileoff_t startoff, + uint64_t owner, int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, struct xfs_btree_cur **pcur); diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c index bc1faeb..0c0ec9e 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.c +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -192,7 +192,7 @@ xfs_rmapbt_init_high_key_from_rec( union xfs_btree_key *key, union xfs_btree_rec *rec) { - __uint64_t off; + uint64_t off; int adj; adj = be32_to_cpu(rec->rmap.rm_blockcount) - 1; @@ -234,7 +234,7 @@ xfs_rmapbt_init_ptr_from_cur( ptr->s = agf->agf_roots[cur->bc_btnum]; } -STATIC __int64_t +STATIC int64_t xfs_rmapbt_key_diff( struct xfs_btree_cur *cur, union xfs_btree_key *key) @@ -242,9 +242,9 @@ xfs_rmapbt_key_diff( struct xfs_rmap_irec *rec = &cur->bc_rec.r; struct xfs_rmap_key *kp = &key->rmap; __u64 x, y; - __int64_t d; + int64_t d; - d = (__int64_t)be32_to_cpu(kp->rm_startblock) - rec->rm_startblock; + d = (int64_t)be32_to_cpu(kp->rm_startblock) - rec->rm_startblock; if (d) return d; @@ -264,7 +264,7 @@ xfs_rmapbt_key_diff( return 0; } -STATIC __int64_t +STATIC int64_t xfs_rmapbt_diff_two_keys( struct xfs_btree_cur *cur, union xfs_btree_key *k1, @@ -272,10 +272,10 @@ xfs_rmapbt_diff_two_keys( { struct xfs_rmap_key *kp1 = &k1->rmap; struct xfs_rmap_key *kp2 = &k2->rmap; - __int64_t d; + int64_t d; __u64 x, y; - d = (__int64_t)be32_to_cpu(kp1->rm_startblock) - + d = (int64_t)be32_to_cpu(kp1->rm_startblock) - be32_to_cpu(kp2->rm_startblock); if (d) return d; @@ -377,10 +377,10 @@ xfs_rmapbt_keys_inorder( union xfs_btree_key *k1, union xfs_btree_key *k2) { - __uint32_t x; - __uint32_t y; - __uint64_t a; - __uint64_t b; + uint32_t x; + uint32_t y; + uint64_t a; + uint64_t b; x = be32_to_cpu(k1->rmap.rm_startblock); y = be32_to_cpu(k2->rmap.rm_startblock); @@ -407,10 +407,10 @@ xfs_rmapbt_recs_inorder( union xfs_btree_rec *r1, union xfs_btree_rec *r2) { - __uint32_t x; - __uint32_t y; - __uint64_t a; - __uint64_t b; + uint32_t x; + uint32_t y; + uint64_t a; + uint64_t b; x = be32_to_cpu(r1->rmap.rm_startblock); y = be32_to_cpu(r2->rmap.rm_startblock); diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index e2e1106..01395ef 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -1011,7 +1011,7 @@ xfs_rtfree_extent( mp->m_sb.sb_rextents) { if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; - *(__uint64_t *)&VFS_I(mp->m_rbmip)->i_atime = 0; + *(uint64_t *)&VFS_I(mp->m_rbmip)->i_atime = 0; xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); } return 0; diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 0e3d4f5..9050664 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -437,7 +437,7 @@ xfs_sb_quota_to_disk( struct xfs_dsb *to, struct xfs_sb *from) { - __uint16_t qflags = from->sb_qflags; + uint16_t qflags = from->sb_qflags; to->sb_uquotino = cpu_to_be64(from->sb_uquotino); if (xfs_sb_version_has_pquotino(from)) { @@ -737,7 +737,7 @@ xfs_sb_mount_common( mp->m_rmap_mnr[1] = mp->m_rmap_mxr[1] / 2; mp->m_bsize = XFS_FSB_TO_BB(mp, 1); - mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, + mp->m_ialloc_inos = (int)MAX((uint16_t)XFS_INODES_PER_CHUNK, sbp->sb_inopblock); mp->m_ialloc_blks = mp->m_ialloc_inos >> sbp->sb_inopblog; diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index 3d50364..ac1cb9d 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -18,34 +18,34 @@ #ifndef __XFS_TYPES_H__ #define __XFS_TYPES_H__ -typedef __uint32_t prid_t; /* project ID */ +typedef uint32_t prid_t; /* project ID */ -typedef __uint32_t xfs_agblock_t; /* blockno in alloc. group */ -typedef __uint32_t xfs_agino_t; /* inode # within allocation grp */ -typedef __uint32_t xfs_extlen_t; /* extent length in blocks */ -typedef __uint32_t xfs_agnumber_t; /* allocation group number */ -typedef __int32_t xfs_extnum_t; /* # of extents in a file */ -typedef __int16_t xfs_aextnum_t; /* # extents in an attribute fork */ -typedef __int64_t xfs_fsize_t; /* bytes in a file */ -typedef __uint64_t xfs_ufsize_t; /* unsigned bytes in a file */ +typedef uint32_t xfs_agblock_t; /* blockno in alloc. group */ +typedef uint32_t xfs_agino_t; /* inode # within allocation grp */ +typedef uint32_t xfs_extlen_t; /* extent length in blocks */ +typedef uint32_t xfs_agnumber_t; /* allocation group number */ +typedef int32_t xfs_extnum_t; /* # of extents in a file */ +typedef int16_t xfs_aextnum_t; /* # extents in an attribute fork */ +typedef int64_t xfs_fsize_t; /* bytes in a file */ +typedef uint64_t xfs_ufsize_t; /* unsigned bytes in a file */ -typedef __int32_t xfs_suminfo_t; /* type of bitmap summary info */ -typedef __int32_t xfs_rtword_t; /* word type for bitmap manipulations */ +typedef int32_t xfs_suminfo_t; /* type of bitmap summary info */ +typedef int32_t xfs_rtword_t; /* word type for bitmap manipulations */ -typedef __int64_t xfs_lsn_t; /* log sequence number */ -typedef __int32_t xfs_tid_t; /* transaction identifier */ +typedef int64_t xfs_lsn_t; /* log sequence number */ +typedef int32_t xfs_tid_t; /* transaction identifier */ -typedef __uint32_t xfs_dablk_t; /* dir/attr block number (in file) */ -typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */ +typedef uint32_t xfs_dablk_t; /* dir/attr block number (in file) */ +typedef uint32_t xfs_dahash_t; /* dir/attr hash value */ -typedef __uint64_t xfs_fsblock_t; /* blockno in filesystem (agno|agbno) */ -typedef __uint64_t xfs_rfsblock_t; /* blockno in filesystem (raw) */ -typedef __uint64_t xfs_rtblock_t; /* extent (block) in realtime area */ -typedef __uint64_t xfs_fileoff_t; /* block number in a file */ -typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ +typedef uint64_t xfs_fsblock_t; /* blockno in filesystem (agno|agbno) */ +typedef uint64_t xfs_rfsblock_t; /* blockno in filesystem (raw) */ +typedef uint64_t xfs_rtblock_t; /* extent (block) in realtime area */ +typedef uint64_t xfs_fileoff_t; /* block number in a file */ +typedef uint64_t xfs_filblks_t; /* number of blocks in a file */ -typedef __int64_t xfs_srtblock_t; /* signed version of xfs_rtblock_t */ -typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ +typedef int64_t xfs_srtblock_t; /* signed version of xfs_rtblock_t */ +typedef int64_t xfs_sfiloff_t; /* signed block number in a file */ /* * Null values for the types. @@ -122,7 +122,7 @@ struct xfs_name { * uid_t and gid_t are hard-coded to 32 bits in the inode. * Hence, an 'id' in a dquot is 32 bits.. */ -typedef __uint32_t xfs_dqid_t; +typedef uint32_t xfs_dqid_t; /* * Constants for bit manipulations. diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index ebfde55..faecade 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -742,7 +742,7 @@ xfs_writepage_map( struct inode *inode, struct page *page, loff_t offset, - __uint64_t end_offset) + uint64_t end_offset) { LIST_HEAD(submit_list); struct xfs_ioend *ioend, *next; @@ -894,7 +894,7 @@ xfs_do_writepage( struct xfs_writepage_ctx *wpc = data; struct inode *inode = page->mapping->host; loff_t offset; - __uint64_t end_offset; + uint64_t end_offset; pgoff_t end_index; trace_xfs_writepage(inode, page, 0, 0); diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 25e76cd..cf15bdb 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -286,7 +286,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) if (bp == NULL) { cursor->blkno = 0; for (;;) { - __uint16_t magic; + uint16_t magic; error = xfs_da3_node_read(NULL, dp, cursor->blkno, -1, &bp, diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 4ece4f2..3100f9b 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -392,10 +392,10 @@ xfs_getbmapx_fix_eof_hole( struct getbmapx *out, /* output structure */ int prealloced, /* this is a file with * preallocated data space */ - __int64_t end, /* last block requested */ + int64_t end, /* last block requested */ xfs_fsblock_t startblock) { - __int64_t fixlen; + int64_t fixlen; xfs_mount_t *mp; /* file system mount point */ xfs_ifork_t *ifp; /* inode fork pointer */ xfs_extnum_t lastx; /* last extent pointer */ @@ -441,9 +441,9 @@ xfs_getbmap( xfs_bmap_format_t formatter, /* format to user */ void *arg) /* formatter arg */ { - __int64_t bmvend; /* last block requested */ + int64_t bmvend; /* last block requested */ int error = 0; /* return value */ - __int64_t fixlen; /* length for -1 case */ + int64_t fixlen; /* length for -1 case */ int i; /* extent number */ int lock; /* lock state */ xfs_bmbt_irec_t *map; /* buffer for user's data */ @@ -499,7 +499,7 @@ xfs_getbmap( if (bmv->bmv_length == -1) { fixlen = XFS_FSB_TO_BB(mp, XFS_B_TO_FSB(mp, fixlen)); bmv->bmv_length = - max_t(__int64_t, fixlen - bmv->bmv_offset, 0); + max_t(int64_t, fixlen - bmv->bmv_offset, 0); } else if (bmv->bmv_length == 0) { bmv->bmv_entries = 0; return 0; @@ -623,7 +623,7 @@ xfs_getbmap( out[cur_ext].bmv_offset + out[cur_ext].bmv_length; bmv->bmv_length = - max_t(__int64_t, 0, bmvend - bmv->bmv_offset); + max_t(int64_t, 0, bmvend - bmv->bmv_offset); /* * In case we don't want to return the hole, @@ -1532,7 +1532,7 @@ xfs_swap_extents( int error = 0; int aforkblks = 0; int taforkblks = 0; - __uint64_t tmp; + uint64_t tmp; int lock_flags; /* XXX: we can't do this with rmap, will fix later */ @@ -1684,15 +1684,15 @@ xfs_swap_extents( /* * Fix the on-disk inode values */ - tmp = (__uint64_t)ip->i_d.di_nblocks; + tmp = (uint64_t)ip->i_d.di_nblocks; ip->i_d.di_nblocks = tip->i_d.di_nblocks - taforkblks + aforkblks; tip->i_d.di_nblocks = tmp + taforkblks - aforkblks; - tmp = (__uint64_t) ip->i_d.di_nextents; + tmp = (uint64_t) ip->i_d.di_nextents; ip->i_d.di_nextents = tip->i_d.di_nextents; tip->i_d.di_nextents = tmp; - tmp = (__uint64_t) ip->i_d.di_format; + tmp = (uint64_t) ip->i_d.di_format; ip->i_d.di_format = tip->i_d.di_format; tip->i_d.di_format = tmp; diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 32fc540..0f31017 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1151,7 +1151,7 @@ xfs_buf_ioerror_alert( { xfs_alert(bp->b_target->bt_mount, "metadata I/O error: block 0x%llx (\"%s\") error %d numblks %d", - (__uint64_t)XFS_BUF_ADDR(bp), func, -bp->b_error, bp->b_length); + (uint64_t)XFS_BUF_ADDR(bp), func, -bp->b_error, bp->b_length); } int diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index f44f799..86bb04a 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -44,7 +44,7 @@ static unsigned char xfs_dir3_filetype_table[] = { static unsigned char xfs_dir3_get_dtype( struct xfs_mount *mp, - __uint8_t filetype) + uint8_t filetype) { if (!xfs_sb_version_hasftype(&mp->m_sb)) return DT_UNKNOWN; @@ -127,7 +127,7 @@ xfs_dir2_sf_getdents( */ sfep = xfs_dir2_sf_firstentry(sfp); for (i = 0; i < sfp->count; i++) { - __uint8_t filetype; + uint8_t filetype; off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, xfs_dir2_sf_get_offset(sfep)); @@ -204,7 +204,7 @@ xfs_dir2_block_getdents( * Each object is a real entry (dep) or an unused one (dup). */ while (ptr < endptr) { - __uint8_t filetype; + uint8_t filetype; dup = (xfs_dir2_data_unused_t *)ptr; /* @@ -523,7 +523,7 @@ xfs_dir2_leaf_getdents( * Get more blocks and readahead as necessary. */ while (curoff < XFS_DIR2_LEAF_OFFSET) { - __uint8_t filetype; + uint8_t filetype; /* * If we have no buffer, or we're off the end of the diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 4ff499a..e890683 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -39,7 +39,7 @@ xfs_trim_extents( xfs_daddr_t start, xfs_daddr_t end, xfs_daddr_t minlen, - __uint64_t *blocks_trimmed) + uint64_t *blocks_trimmed) { struct block_device *bdev = mp->m_ddev_targp->bt_bdev; struct xfs_btree_cur *cur; @@ -161,7 +161,7 @@ xfs_ioc_trim( struct fstrim_range range; xfs_daddr_t start, end, minlen; xfs_agnumber_t start_agno, end_agno, agno; - __uint64_t blocks_trimmed = 0; + uint64_t blocks_trimmed = 0; int error, last_error = 0; if (!capable(CAP_SYS_ADMIN)) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 7a30b8f..52d79db 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -276,7 +276,7 @@ xfs_qm_init_dquot_blk( void xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp) { - __uint64_t space; + uint64_t space; dqp->q_prealloc_hi_wmark = be64_to_cpu(dqp->q_core.d_blk_hardlimit); dqp->q_prealloc_lo_wmark = be64_to_cpu(dqp->q_core.d_blk_softlimit); diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 0f96847..ab9af95 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -580,7 +580,7 @@ xfs_growfs_data_private( if (nagimax) mp->m_maxagi = nagimax; if (mp->m_sb.sb_imax_pct) { - __uint64_t icount = mp->m_sb.sb_dblocks * mp->m_sb.sb_imax_pct; + uint64_t icount = mp->m_sb.sb_dblocks * mp->m_sb.sb_imax_pct; do_div(icount, 100); mp->m_maxicount = icount << mp->m_sb.sb_inopblog; } else @@ -750,17 +750,17 @@ xfs_fs_counts( int xfs_reserve_blocks( xfs_mount_t *mp, - __uint64_t *inval, + uint64_t *inval, xfs_fsop_resblks_t *outval) { - __int64_t lcounter, delta; - __int64_t fdblks_delta = 0; - __uint64_t request; - __int64_t free; + int64_t lcounter, delta; + int64_t fdblks_delta = 0; + uint64_t request; + int64_t free; int error = 0; /* If inval is null, report current values and return */ - if (inval == (__uint64_t *)NULL) { + if (inval == (uint64_t *)NULL) { if (!outval) return -EINVAL; outval->resblks = mp->m_resblks; @@ -861,7 +861,7 @@ out: int xfs_fs_goingdown( xfs_mount_t *mp, - __uint32_t inflags) + uint32_t inflags) { switch (inflags) { case XFS_FSOP_GOING_FLAGS_DEFAULT: { diff --git a/fs/xfs/xfs_fsops.h b/fs/xfs/xfs_fsops.h index f32713f..79d3e76 100644 --- a/fs/xfs/xfs_fsops.h +++ b/fs/xfs/xfs_fsops.h @@ -22,8 +22,8 @@ extern int xfs_fs_geometry(xfs_mount_t *mp, xfs_fsop_geom_t *geo, int nversion); extern int xfs_growfs_data(xfs_mount_t *mp, xfs_growfs_data_t *in); extern int xfs_growfs_log(xfs_mount_t *mp, xfs_growfs_log_t *in); extern int xfs_fs_counts(xfs_mount_t *mp, xfs_fsop_counts_t *cnt); -extern int xfs_reserve_blocks(xfs_mount_t *mp, __uint64_t *inval, +extern int xfs_reserve_blocks(xfs_mount_t *mp, uint64_t *inval, xfs_fsop_resblks_t *outval); -extern int xfs_fs_goingdown(xfs_mount_t *mp, __uint32_t inflags); +extern int xfs_fs_goingdown(xfs_mount_t *mp, uint32_t inflags); #endif /* __XFS_FSOPS_H__ */ diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e08eaea..9c41dff 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -611,7 +611,7 @@ __xfs_iflock( STATIC uint _xfs_dic2xflags( - __uint16_t di_flags, + uint16_t di_flags, uint64_t di_flags2, bool has_attr) { @@ -834,8 +834,8 @@ xfs_ialloc( if (ip->i_d.di_version == 3) { inode->i_version = 1; ip->i_d.di_flags2 = 0; - ip->i_d.di_crtime.t_sec = (__int32_t)tv.tv_sec; - ip->i_d.di_crtime.t_nsec = (__int32_t)tv.tv_nsec; + ip->i_d.di_crtime.t_sec = (int32_t)tv.tv_sec; + ip->i_d.di_crtime.t_nsec = (int32_t)tv.tv_nsec; } diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index e1a411e..daea839 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -189,8 +189,8 @@ static inline void xfs_set_projid(struct xfs_inode *ip, prid_t projid) { - ip->i_d.di_projid_hi = (__uint16_t) (projid >> 16); - ip->i_d.di_projid_lo = (__uint16_t) (projid & 0xffff); + ip->i_d.di_projid_hi = (uint16_t) (projid >> 16); + ip->i_d.di_projid_lo = (uint16_t) (projid & 0xffff); } static inline prid_t diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index cf46658..3a44de9 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -440,8 +440,8 @@ xfs_attrmulti_attr_get( struct inode *inode, unsigned char *name, unsigned char __user *ubuf, - __uint32_t *len, - __uint32_t flags) + uint32_t *len, + uint32_t flags) { unsigned char *kbuf; int error = -EFAULT; @@ -469,8 +469,8 @@ xfs_attrmulti_attr_set( struct inode *inode, unsigned char *name, const unsigned char __user *ubuf, - __uint32_t len, - __uint32_t flags) + uint32_t len, + uint32_t flags) { unsigned char *kbuf; int error; @@ -495,7 +495,7 @@ int xfs_attrmulti_attr_remove( struct inode *inode, unsigned char *name, - __uint32_t flags) + uint32_t flags) { int error; @@ -873,7 +873,7 @@ xfs_merge_ioc_xflags( STATIC unsigned int xfs_di2lxflags( - __uint16_t di_flags) + uint16_t di_flags) { unsigned int flags = 0; @@ -1225,7 +1225,7 @@ xfs_ioctl_setattr_check_projid( struct fsxattr *fa) { /* Disallow 32bit project ids if projid32bit feature is not enabled. */ - if (fa->fsx_projid > (__uint16_t)-1 && + if (fa->fsx_projid > (uint16_t)-1 && !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb)) return -EINVAL; @@ -1777,7 +1777,7 @@ xfs_file_ioctl( case XFS_IOC_SET_RESBLKS: { xfs_fsop_resblks_t inout; - __uint64_t in; + uint64_t in; if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -1863,12 +1863,12 @@ xfs_file_ioctl( } case XFS_IOC_GOINGDOWN: { - __uint32_t in; + uint32_t in; if (!capable(CAP_SYS_ADMIN)) return -EPERM; - if (get_user(in, (__uint32_t __user *)arg)) + if (get_user(in, (uint32_t __user *)arg)) return -EFAULT; return xfs_fs_goingdown(mp, in); diff --git a/fs/xfs/xfs_ioctl.h b/fs/xfs/xfs_ioctl.h index 8b52881..e86c3ea 100644 --- a/fs/xfs/xfs_ioctl.h +++ b/fs/xfs/xfs_ioctl.h @@ -48,22 +48,22 @@ xfs_attrmulti_attr_get( struct inode *inode, unsigned char *name, unsigned char __user *ubuf, - __uint32_t *len, - __uint32_t flags); + uint32_t *len, + uint32_t flags); extern int xfs_attrmulti_attr_set( struct inode *inode, unsigned char *name, const unsigned char __user *ubuf, - __uint32_t len, - __uint32_t flags); + uint32_t len, + uint32_t flags); extern int xfs_attrmulti_attr_remove( struct inode *inode, unsigned char *name, - __uint32_t flags); + uint32_t flags); extern struct dentry * xfs_handle_to_dentry( diff --git a/fs/xfs/xfs_ioctl32.h b/fs/xfs/xfs_ioctl32.h index b1bb454..5492bcf 100644 --- a/fs/xfs/xfs_ioctl32.h +++ b/fs/xfs/xfs_ioctl32.h @@ -112,9 +112,9 @@ typedef struct compat_xfs_fsop_handlereq { /* The bstat field in the swapext struct needs translation */ typedef struct compat_xfs_swapext { - __int64_t sx_version; /* version */ - __int64_t sx_fdtarget; /* fd of target file */ - __int64_t sx_fdtmp; /* fd of tmp file */ + int64_t sx_version; /* version */ + int64_t sx_fdtarget; /* fd of target file */ + int64_t sx_fdtmp; /* fd of tmp file */ xfs_off_t sx_offset; /* offset into file */ xfs_off_t sx_length; /* leng from offset */ char sx_pad[16]; /* pad space, unused */ diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index b8d64d5..0392167 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -23,15 +23,6 @@ /* * Kernel specific type declarations for XFS */ -typedef signed char __int8_t; -typedef unsigned char __uint8_t; -typedef signed short int __int16_t; -typedef unsigned short int __uint16_t; -typedef signed int __int32_t; -typedef unsigned int __uint32_t; -typedef signed long long int __int64_t; -typedef unsigned long long int __uint64_t; - typedef __s64 xfs_off_t; /* type */ typedef unsigned long long xfs_ino_t; /* type */ typedef __s64 xfs_daddr_t; /* type */ @@ -184,22 +175,22 @@ extern struct xstats xfsstats; * are converting to the init_user_ns. The uid is later mapped to a particular * user namespace value when crossing the kernel/user boundary. */ -static inline __uint32_t xfs_kuid_to_uid(kuid_t uid) +static inline uint32_t xfs_kuid_to_uid(kuid_t uid) { return from_kuid(&init_user_ns, uid); } -static inline kuid_t xfs_uid_to_kuid(__uint32_t uid) +static inline kuid_t xfs_uid_to_kuid(uint32_t uid) { return make_kuid(&init_user_ns, uid); } -static inline __uint32_t xfs_kgid_to_gid(kgid_t gid) +static inline uint32_t xfs_kgid_to_gid(kgid_t gid) { return from_kgid(&init_user_ns, gid); } -static inline kgid_t xfs_gid_to_kgid(__uint32_t gid) +static inline kgid_t xfs_gid_to_kgid(uint32_t gid) { return make_kgid(&init_user_ns, gid); } @@ -314,14 +305,14 @@ static inline __u32 xfs_do_mod(void *a, __u32 b, int n) #define do_div(a, b) xfs_do_div(&(a), (b), sizeof(a)) #define do_mod(a, b) xfs_do_mod(&(a), (b), sizeof(a)) -static inline __uint64_t roundup_64(__uint64_t x, __uint32_t y) +static inline uint64_t roundup_64(uint64_t x, uint32_t y) { x += y - 1; do_div(x, y); return x * y; } -static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) +static inline uint64_t howmany_64(uint64_t x, uint32_t y) { x += y - 1; do_div(x, y); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 3b74fa0..26d6f5d2 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -434,7 +434,7 @@ xfs_log_reserve( int unit_bytes, int cnt, struct xlog_ticket **ticp, - __uint8_t client, + uint8_t client, bool permanent) { struct xlog *log = mp->m_log; @@ -825,9 +825,9 @@ xfs_log_unmount_write(xfs_mount_t *mp) if (!error) { /* the data section must be 32 bit size aligned */ struct { - __uint16_t magic; - __uint16_t pad1; - __uint32_t pad2; /* may as well make it 64 bits */ + uint16_t magic; + uint16_t pad1; + uint32_t pad2; /* may as well make it 64 bits */ } magic = { .magic = XLOG_UNMOUNT_TYPE, }; @@ -1665,7 +1665,7 @@ xlog_cksum( char *dp, int size) { - __uint32_t crc; + uint32_t crc; /* first generate the crc for the record header ... */ crc = xfs_start_cksum((char *)rhead, @@ -1828,7 +1828,7 @@ xlog_sync( */ dptr = (char *)&iclog->ic_header + count; for (i = 0; i < split; i += BBSIZE) { - __uint32_t cycle = be32_to_cpu(*(__be32 *)dptr); + uint32_t cycle = be32_to_cpu(*(__be32 *)dptr); if (++cycle == XLOG_HEADER_MAGIC_NUM) cycle++; *(__be32 *)dptr = cpu_to_be32(cycle); @@ -2370,8 +2370,8 @@ xlog_write( } reg = &vecp[index]; - ASSERT(reg->i_len % sizeof(__int32_t) == 0); - ASSERT((unsigned long)ptr % sizeof(__int32_t) == 0); + ASSERT(reg->i_len % sizeof(int32_t) == 0); + ASSERT((unsigned long)ptr % sizeof(int32_t) == 0); start_rec_copy = xlog_write_start_rec(ptr, ticket); if (start_rec_copy) { @@ -3150,7 +3150,7 @@ xlog_state_switch_iclogs( /* Round up to next log-sunit */ if (xfs_sb_version_haslogv2(&log->l_mp->m_sb) && log->l_mp->m_sb.sb_logsunit > 1) { - __uint32_t sunit_bb = BTOBB(log->l_mp->m_sb.sb_logsunit); + uint32_t sunit_bb = BTOBB(log->l_mp->m_sb.sb_logsunit); log->l_curr_block = roundup(log->l_curr_block, sunit_bb); } @@ -3786,7 +3786,7 @@ xlog_verify_iclog( xlog_in_core_2_t *xhdr; void *base_ptr, *ptr, *p; ptrdiff_t field_offset; - __uint8_t clientid; + uint8_t clientid; int len, i, j, k, op_len; int idx; diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index b5e7107..0b2b811 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -160,7 +160,7 @@ int xfs_log_reserve(struct xfs_mount *mp, int length, int count, struct xlog_ticket **ticket, - __uint8_t clientid, + uint8_t clientid, bool permanent); int xfs_log_regrant(struct xfs_mount *mp, struct xlog_ticket *tic); void xfs_log_unmount(struct xfs_mount *mp); diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 765f084..786c762 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -417,7 +417,7 @@ struct xlog { }; #define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ - ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) + ((log)->l_buf_cancel_table + ((uint64_t)blkno % XLOG_BC_TABLE_SIZE)) #define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index e8638fd..2fb9cca 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2214,9 +2214,9 @@ xlog_recover_get_buf_lsn( struct xfs_mount *mp, struct xfs_buf *bp) { - __uint32_t magic32; - __uint16_t magic16; - __uint16_t magicda; + uint32_t magic32; + uint16_t magic16; + uint16_t magicda; void *blk = bp->b_addr; uuid_t *uuid; xfs_lsn_t lsn = -1; @@ -2363,9 +2363,9 @@ xlog_recover_validate_buf_type( xfs_buf_log_format_t *buf_f) { struct xfs_da_blkinfo *info = bp->b_addr; - __uint32_t magic32; - __uint16_t magic16; - __uint16_t magicda; + uint32_t magic32; + uint16_t magic16; + uint16_t magicda; /* * We can only do post recovery validation on items on CRC enabled @@ -2810,7 +2810,7 @@ xlog_recover_buffer_pass2( if (XFS_DINODE_MAGIC == be16_to_cpu(*((__be16 *)xfs_buf_offset(bp, 0))) && (BBTOB(bp->b_io_length) != MAX(log->l_mp->m_sb.sb_blocksize, - (__uint32_t)log->l_mp->m_inode_cluster_size))) { + (uint32_t)log->l_mp->m_inode_cluster_size))) { xfs_buf_stale(bp); error = xfs_bwrite(bp); } else { @@ -3381,7 +3381,7 @@ xlog_recover_efd_pass2( xfs_efd_log_format_t *efd_formatp; xfs_efi_log_item_t *efip = NULL; xfs_log_item_t *lip; - __uint64_t efi_id; + uint64_t efi_id; struct xfs_ail_cursor cur; struct xfs_ail *ailp = log->l_ailp; @@ -3477,7 +3477,7 @@ xlog_recover_rud_pass2( struct xfs_rud_log_format *rud_formatp; struct xfs_rui_log_item *ruip = NULL; struct xfs_log_item *lip; - __uint64_t rui_id; + uint64_t rui_id; struct xfs_ail_cursor cur; struct xfs_ail *ailp = log->l_ailp; @@ -5334,9 +5334,9 @@ xlog_recover_check_summary( xfs_buf_t *agfbp; xfs_buf_t *agibp; xfs_agnumber_t agno; - __uint64_t freeblks; - __uint64_t itotal; - __uint64_t ifree; + uint64_t freeblks; + uint64_t itotal; + uint64_t ifree; int error; mp = log->l_mp; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index faeead6..1e186c2 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -166,7 +166,7 @@ xfs_free_perag( int xfs_sb_validate_fsb_count( xfs_sb_t *sbp, - __uint64_t nblocks) + uint64_t nblocks) { ASSERT(PAGE_SHIFT >= sbp->sb_blocklog); ASSERT(sbp->sb_blocklog >= BBSHIFT); @@ -419,7 +419,7 @@ STATIC void xfs_set_maxicount(xfs_mount_t *mp) { xfs_sb_t *sbp = &(mp->m_sb); - __uint64_t icount; + uint64_t icount; if (sbp->sb_imax_pct) { /* @@ -485,7 +485,7 @@ xfs_set_low_space_thresholds( int i; for (i = 0; i < XFS_LOWSP_MAX; i++) { - __uint64_t space = mp->m_sb.sb_dblocks; + uint64_t space = mp->m_sb.sb_dblocks; do_div(space, 100); mp->m_low_space[i] = space * (i + 1); @@ -582,10 +582,10 @@ xfs_mount_reset_sbqflags( return xfs_sync_sb(mp, false); } -__uint64_t +uint64_t xfs_default_resblks(xfs_mount_t *mp) { - __uint64_t resblks; + uint64_t resblks; /* * We default to 5% or 8192 fsbs of space reserved, whichever is @@ -596,7 +596,7 @@ xfs_default_resblks(xfs_mount_t *mp) */ resblks = mp->m_sb.sb_dblocks; do_div(resblks, 20); - resblks = min_t(__uint64_t, resblks, 8192); + resblks = min_t(uint64_t, resblks, 8192); return resblks; } @@ -616,7 +616,7 @@ xfs_mountfs( { struct xfs_sb *sbp = &(mp->m_sb); struct xfs_inode *rip; - __uint64_t resblks; + uint64_t resblks; uint quotamount = 0; uint quotaflags = 0; int error = 0; @@ -1001,7 +1001,7 @@ void xfs_unmountfs( struct xfs_mount *mp) { - __uint64_t resblks; + uint64_t resblks; int error; cancel_delayed_work_sync(&mp->m_eofblocks_work); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b36676c..33728f6 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -102,10 +102,10 @@ typedef struct xfs_mount { xfs_buftarg_t *m_ddev_targp; /* saves taking the address */ xfs_buftarg_t *m_logdev_targp;/* ptr to log device */ xfs_buftarg_t *m_rtdev_targp; /* ptr to rt device */ - __uint8_t m_blkbit_log; /* blocklog + NBBY */ - __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ - __uint8_t m_agno_log; /* log #ag's */ - __uint8_t m_agino_log; /* #bits for agino in inum */ + uint8_t m_blkbit_log; /* blocklog + NBBY */ + uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ + uint8_t m_agno_log; /* log #ag's */ + uint8_t m_agino_log; /* #bits for agino in inum */ uint m_inode_cluster_size;/* min inode buf size */ uint m_blockmask; /* sb_blocksize-1 */ uint m_blockwsize; /* sb_blocksize in words */ @@ -130,7 +130,7 @@ typedef struct xfs_mount { struct mutex m_growlock; /* growfs mutex */ int m_fixedfsid[2]; /* unchanged for life of FS */ uint m_dmevmask; /* DMI events for this FS */ - __uint64_t m_flags; /* global mount flags */ + uint64_t m_flags; /* global mount flags */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ int m_ialloc_min_blks;/* min blocks in sparse inode @@ -138,14 +138,14 @@ typedef struct xfs_mount { int m_inoalign_mask;/* mask sb_inoalignmt if used */ uint m_qflags; /* quota status flags */ struct xfs_trans_resv m_resv; /* precomputed res values */ - __uint64_t m_maxicount; /* maximum inode count */ - __uint64_t m_resblks; /* total reserved blocks */ - __uint64_t m_resblks_avail;/* available reserved blocks */ - __uint64_t m_resblks_save; /* reserved blks @ remount,ro */ + uint64_t m_maxicount; /* maximum inode count */ + uint64_t m_resblks; /* total reserved blocks */ + uint64_t m_resblks_avail;/* available reserved blocks */ + uint64_t m_resblks_save; /* reserved blks @ remount,ro */ int m_dalign; /* stripe unit */ int m_swidth; /* stripe width */ int m_sinoalign; /* stripe unit inode alignment */ - __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ + uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ @@ -181,7 +181,7 @@ typedef struct xfs_mount { * ever support shrinks it would have to be persisted in addition * to various other kinds of pain inflicted on the pNFS server. */ - __uint32_t m_generation; + uint32_t m_generation; bool m_fail_unmount; #ifdef DEBUG @@ -337,12 +337,12 @@ typedef struct xfs_perag { char pagi_init; /* this agi's entry is initialized */ char pagf_metadata; /* the agf is preferred to be metadata */ char pagi_inodeok; /* The agi is ok for inodes */ - __uint8_t pagf_levels[XFS_BTNUM_AGF]; + uint8_t pagf_levels[XFS_BTNUM_AGF]; /* # of levels in bno & cnt btree */ - __uint32_t pagf_flcount; /* count of blocks in freelist */ + uint32_t pagf_flcount; /* count of blocks in freelist */ xfs_extlen_t pagf_freeblks; /* total free blocks */ xfs_extlen_t pagf_longest; /* longest free space */ - __uint32_t pagf_btreeblks; /* # of blocks held in AGF btrees */ + uint32_t pagf_btreeblks; /* # of blocks held in AGF btrees */ xfs_agino_t pagi_freecount; /* number of free inodes */ xfs_agino_t pagi_count; /* number of allocated inodes */ @@ -376,7 +376,7 @@ typedef struct xfs_perag { extern void xfs_uuid_table_free(void); extern int xfs_log_sbcount(xfs_mount_t *); -extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); +extern uint64_t xfs_default_resblks(xfs_mount_t *mp); extern int xfs_mountfs(xfs_mount_t *mp); extern int xfs_initialize_perag(xfs_mount_t *mp, xfs_agnumber_t agcount, xfs_agnumber_t *maxagi); @@ -392,7 +392,7 @@ extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); extern void xfs_freesb(xfs_mount_t *); extern bool xfs_fs_writable(struct xfs_mount *mp, int level); -extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); +extern int xfs_sb_validate_fsb_count(struct xfs_sb *, uint64_t); extern int xfs_dev_is_read_only(struct xfs_mount *, char *); diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index 3e52d5d..2be6d27 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -33,7 +33,7 @@ xfs_fill_statvfs_from_dquot( struct kstatfs *statp, struct xfs_dquot *dqp) { - __uint64_t limit; + uint64_t limit; limit = dqp->q_core.d_blk_softlimit ? be64_to_cpu(dqp->q_core.d_blk_softlimit) : diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 802bcc3..4be8d8b 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -1264,13 +1264,13 @@ xfs_rtpick_extent( { xfs_rtblock_t b; /* result block */ int log2; /* log of sequence number */ - __uint64_t resid; /* residual after log removed */ - __uint64_t seq; /* sequence number of file creation */ - __uint64_t *seqp; /* pointer to seqno in inode */ + uint64_t resid; /* residual after log removed */ + uint64_t seq; /* sequence number of file creation */ + uint64_t *seqp; /* pointer to seqno in inode */ ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); - seqp = (__uint64_t *)&VFS_I(mp->m_rbmip)->i_atime; + seqp = (uint64_t *)&VFS_I(mp->m_rbmip)->i_atime; if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) { mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; *seqp = 0; diff --git a/fs/xfs/xfs_stats.c b/fs/xfs/xfs_stats.c index f04f547..44ca839 100644 --- a/fs/xfs/xfs_stats.c +++ b/fs/xfs/xfs_stats.c @@ -33,9 +33,9 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) { int i, j; int len = 0; - __uint64_t xs_xstrat_bytes = 0; - __uint64_t xs_write_bytes = 0; - __uint64_t xs_read_bytes = 0; + uint64_t xs_xstrat_bytes = 0; + uint64_t xs_write_bytes = 0; + uint64_t xs_read_bytes = 0; static const struct xstats_entry { char *desc; @@ -99,7 +99,7 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) void xfs_stats_clearall(struct xfsstats __percpu *stats) { int c; - __uint32_t vn_active; + uint32_t vn_active; xfs_notice(NULL, "Clearing xfsstats"); for_each_possible_cpu(c) { diff --git a/fs/xfs/xfs_stats.h b/fs/xfs/xfs_stats.h index 657865f..2333db9 100644 --- a/fs/xfs/xfs_stats.h +++ b/fs/xfs/xfs_stats.h @@ -26,207 +26,207 @@ */ struct xfsstats { # define XFSSTAT_END_EXTENT_ALLOC 4 - __uint32_t xs_allocx; - __uint32_t xs_allocb; - __uint32_t xs_freex; - __uint32_t xs_freeb; + uint32_t xs_allocx; + uint32_t xs_allocb; + uint32_t xs_freex; + uint32_t xs_freeb; # define XFSSTAT_END_ALLOC_BTREE (XFSSTAT_END_EXTENT_ALLOC+4) - __uint32_t xs_abt_lookup; - __uint32_t xs_abt_compare; - __uint32_t xs_abt_insrec; - __uint32_t xs_abt_delrec; + uint32_t xs_abt_lookup; + uint32_t xs_abt_compare; + uint32_t xs_abt_insrec; + uint32_t xs_abt_delrec; # define XFSSTAT_END_BLOCK_MAPPING (XFSSTAT_END_ALLOC_BTREE+7) - __uint32_t xs_blk_mapr; - __uint32_t xs_blk_mapw; - __uint32_t xs_blk_unmap; - __uint32_t xs_add_exlist; - __uint32_t xs_del_exlist; - __uint32_t xs_look_exlist; - __uint32_t xs_cmp_exlist; + uint32_t xs_blk_mapr; + uint32_t xs_blk_mapw; + uint32_t xs_blk_unmap; + uint32_t xs_add_exlist; + uint32_t xs_del_exlist; + uint32_t xs_look_exlist; + uint32_t xs_cmp_exlist; # define XFSSTAT_END_BLOCK_MAP_BTREE (XFSSTAT_END_BLOCK_MAPPING+4) - __uint32_t xs_bmbt_lookup; - __uint32_t xs_bmbt_compare; - __uint32_t xs_bmbt_insrec; - __uint32_t xs_bmbt_delrec; + uint32_t xs_bmbt_lookup; + uint32_t xs_bmbt_compare; + uint32_t xs_bmbt_insrec; + uint32_t xs_bmbt_delrec; # define XFSSTAT_END_DIRECTORY_OPS (XFSSTAT_END_BLOCK_MAP_BTREE+4) - __uint32_t xs_dir_lookup; - __uint32_t xs_dir_create; - __uint32_t xs_dir_remove; - __uint32_t xs_dir_getdents; + uint32_t xs_dir_lookup; + uint32_t xs_dir_create; + uint32_t xs_dir_remove; + uint32_t xs_dir_getdents; # define XFSSTAT_END_TRANSACTIONS (XFSSTAT_END_DIRECTORY_OPS+3) - __uint32_t xs_trans_sync; - __uint32_t xs_trans_async; - __uint32_t xs_trans_empty; + uint32_t xs_trans_sync; + uint32_t xs_trans_async; + uint32_t xs_trans_empty; # define XFSSTAT_END_INODE_OPS (XFSSTAT_END_TRANSACTIONS+7) - __uint32_t xs_ig_attempts; - __uint32_t xs_ig_found; - __uint32_t xs_ig_frecycle; - __uint32_t xs_ig_missed; - __uint32_t xs_ig_dup; - __uint32_t xs_ig_reclaims; - __uint32_t xs_ig_attrchg; + uint32_t xs_ig_attempts; + uint32_t xs_ig_found; + uint32_t xs_ig_frecycle; + uint32_t xs_ig_missed; + uint32_t xs_ig_dup; + uint32_t xs_ig_reclaims; + uint32_t xs_ig_attrchg; # define XFSSTAT_END_LOG_OPS (XFSSTAT_END_INODE_OPS+5) - __uint32_t xs_log_writes; - __uint32_t xs_log_blocks; - __uint32_t xs_log_noiclogs; - __uint32_t xs_log_force; - __uint32_t xs_log_force_sleep; + uint32_t xs_log_writes; + uint32_t xs_log_blocks; + uint32_t xs_log_noiclogs; + uint32_t xs_log_force; + uint32_t xs_log_force_sleep; # define XFSSTAT_END_TAIL_PUSHING (XFSSTAT_END_LOG_OPS+10) - __uint32_t xs_try_logspace; - __uint32_t xs_sleep_logspace; - __uint32_t xs_push_ail; - __uint32_t xs_push_ail_success; - __uint32_t xs_push_ail_pushbuf; - __uint32_t xs_push_ail_pinned; - __uint32_t xs_push_ail_locked; - __uint32_t xs_push_ail_flushing; - __uint32_t xs_push_ail_restarts; - __uint32_t xs_push_ail_flush; + uint32_t xs_try_logspace; + uint32_t xs_sleep_logspace; + uint32_t xs_push_ail; + uint32_t xs_push_ail_success; + uint32_t xs_push_ail_pushbuf; + uint32_t xs_push_ail_pinned; + uint32_t xs_push_ail_locked; + uint32_t xs_push_ail_flushing; + uint32_t xs_push_ail_restarts; + uint32_t xs_push_ail_flush; # define XFSSTAT_END_WRITE_CONVERT (XFSSTAT_END_TAIL_PUSHING+2) - __uint32_t xs_xstrat_quick; - __uint32_t xs_xstrat_split; + uint32_t xs_xstrat_quick; + uint32_t xs_xstrat_split; # define XFSSTAT_END_READ_WRITE_OPS (XFSSTAT_END_WRITE_CONVERT+2) - __uint32_t xs_write_calls; - __uint32_t xs_read_calls; + uint32_t xs_write_calls; + uint32_t xs_read_calls; # define XFSSTAT_END_ATTRIBUTE_OPS (XFSSTAT_END_READ_WRITE_OPS+4) - __uint32_t xs_attr_get; - __uint32_t xs_attr_set; - __uint32_t xs_attr_remove; - __uint32_t xs_attr_list; + uint32_t xs_attr_get; + uint32_t xs_attr_set; + uint32_t xs_attr_remove; + uint32_t xs_attr_list; # define XFSSTAT_END_INODE_CLUSTER (XFSSTAT_END_ATTRIBUTE_OPS+3) - __uint32_t xs_iflush_count; - __uint32_t xs_icluster_flushcnt; - __uint32_t xs_icluster_flushinode; + uint32_t xs_iflush_count; + uint32_t xs_icluster_flushcnt; + uint32_t xs_icluster_flushinode; # define XFSSTAT_END_VNODE_OPS (XFSSTAT_END_INODE_CLUSTER+8) - __uint32_t vn_active; /* # vnodes not on free lists */ - __uint32_t vn_alloc; /* # times vn_alloc called */ - __uint32_t vn_get; /* # times vn_get called */ - __uint32_t vn_hold; /* # times vn_hold called */ - __uint32_t vn_rele; /* # times vn_rele called */ - __uint32_t vn_reclaim; /* # times vn_reclaim called */ - __uint32_t vn_remove; /* # times vn_remove called */ - __uint32_t vn_free; /* # times vn_free called */ + uint32_t vn_active; /* # vnodes not on free lists */ + uint32_t vn_alloc; /* # times vn_alloc called */ + uint32_t vn_get; /* # times vn_get called */ + uint32_t vn_hold; /* # times vn_hold called */ + uint32_t vn_rele; /* # times vn_rele called */ + uint32_t vn_reclaim; /* # times vn_reclaim called */ + uint32_t vn_remove; /* # times vn_remove called */ + uint32_t vn_free; /* # times vn_free called */ #define XFSSTAT_END_BUF (XFSSTAT_END_VNODE_OPS+9) - __uint32_t xb_get; - __uint32_t xb_create; - __uint32_t xb_get_locked; - __uint32_t xb_get_locked_waited; - __uint32_t xb_busy_locked; - __uint32_t xb_miss_locked; - __uint32_t xb_page_retries; - __uint32_t xb_page_found; - __uint32_t xb_get_read; + uint32_t xb_get; + uint32_t xb_create; + uint32_t xb_get_locked; + uint32_t xb_get_locked_waited; + uint32_t xb_busy_locked; + uint32_t xb_miss_locked; + uint32_t xb_page_retries; + uint32_t xb_page_found; + uint32_t xb_get_read; /* Version 2 btree counters */ #define XFSSTAT_END_ABTB_V2 (XFSSTAT_END_BUF+15) - __uint32_t xs_abtb_2_lookup; - __uint32_t xs_abtb_2_compare; - __uint32_t xs_abtb_2_insrec; - __uint32_t xs_abtb_2_delrec; - __uint32_t xs_abtb_2_newroot; - __uint32_t xs_abtb_2_killroot; - __uint32_t xs_abtb_2_increment; - __uint32_t xs_abtb_2_decrement; - __uint32_t xs_abtb_2_lshift; - __uint32_t xs_abtb_2_rshift; - __uint32_t xs_abtb_2_split; - __uint32_t xs_abtb_2_join; - __uint32_t xs_abtb_2_alloc; - __uint32_t xs_abtb_2_free; - __uint32_t xs_abtb_2_moves; + uint32_t xs_abtb_2_lookup; + uint32_t xs_abtb_2_compare; + uint32_t xs_abtb_2_insrec; + uint32_t xs_abtb_2_delrec; + uint32_t xs_abtb_2_newroot; + uint32_t xs_abtb_2_killroot; + uint32_t xs_abtb_2_increment; + uint32_t xs_abtb_2_decrement; + uint32_t xs_abtb_2_lshift; + uint32_t xs_abtb_2_rshift; + uint32_t xs_abtb_2_split; + uint32_t xs_abtb_2_join; + uint32_t xs_abtb_2_alloc; + uint32_t xs_abtb_2_free; + uint32_t xs_abtb_2_moves; #define XFSSTAT_END_ABTC_V2 (XFSSTAT_END_ABTB_V2+15) - __uint32_t xs_abtc_2_lookup; - __uint32_t xs_abtc_2_compare; - __uint32_t xs_abtc_2_insrec; - __uint32_t xs_abtc_2_delrec; - __uint32_t xs_abtc_2_newroot; - __uint32_t xs_abtc_2_killroot; - __uint32_t xs_abtc_2_increment; - __uint32_t xs_abtc_2_decrement; - __uint32_t xs_abtc_2_lshift; - __uint32_t xs_abtc_2_rshift; - __uint32_t xs_abtc_2_split; - __uint32_t xs_abtc_2_join; - __uint32_t xs_abtc_2_alloc; - __uint32_t xs_abtc_2_free; - __uint32_t xs_abtc_2_moves; + uint32_t xs_abtc_2_lookup; + uint32_t xs_abtc_2_compare; + uint32_t xs_abtc_2_insrec; + uint32_t xs_abtc_2_delrec; + uint32_t xs_abtc_2_newroot; + uint32_t xs_abtc_2_killroot; + uint32_t xs_abtc_2_increment; + uint32_t xs_abtc_2_decrement; + uint32_t xs_abtc_2_lshift; + uint32_t xs_abtc_2_rshift; + uint32_t xs_abtc_2_split; + uint32_t xs_abtc_2_join; + uint32_t xs_abtc_2_alloc; + uint32_t xs_abtc_2_free; + uint32_t xs_abtc_2_moves; #define XFSSTAT_END_BMBT_V2 (XFSSTAT_END_ABTC_V2+15) - __uint32_t xs_bmbt_2_lookup; - __uint32_t xs_bmbt_2_compare; - __uint32_t xs_bmbt_2_insrec; - __uint32_t xs_bmbt_2_delrec; - __uint32_t xs_bmbt_2_newroot; - __uint32_t xs_bmbt_2_killroot; - __uint32_t xs_bmbt_2_increment; - __uint32_t xs_bmbt_2_decrement; - __uint32_t xs_bmbt_2_lshift; - __uint32_t xs_bmbt_2_rshift; - __uint32_t xs_bmbt_2_split; - __uint32_t xs_bmbt_2_join; - __uint32_t xs_bmbt_2_alloc; - __uint32_t xs_bmbt_2_free; - __uint32_t xs_bmbt_2_moves; + uint32_t xs_bmbt_2_lookup; + uint32_t xs_bmbt_2_compare; + uint32_t xs_bmbt_2_insrec; + uint32_t xs_bmbt_2_delrec; + uint32_t xs_bmbt_2_newroot; + uint32_t xs_bmbt_2_killroot; + uint32_t xs_bmbt_2_increment; + uint32_t xs_bmbt_2_decrement; + uint32_t xs_bmbt_2_lshift; + uint32_t xs_bmbt_2_rshift; + uint32_t xs_bmbt_2_split; + uint32_t xs_bmbt_2_join; + uint32_t xs_bmbt_2_alloc; + uint32_t xs_bmbt_2_free; + uint32_t xs_bmbt_2_moves; #define XFSSTAT_END_IBT_V2 (XFSSTAT_END_BMBT_V2+15) - __uint32_t xs_ibt_2_lookup; - __uint32_t xs_ibt_2_compare; - __uint32_t xs_ibt_2_insrec; - __uint32_t xs_ibt_2_delrec; - __uint32_t xs_ibt_2_newroot; - __uint32_t xs_ibt_2_killroot; - __uint32_t xs_ibt_2_increment; - __uint32_t xs_ibt_2_decrement; - __uint32_t xs_ibt_2_lshift; - __uint32_t xs_ibt_2_rshift; - __uint32_t xs_ibt_2_split; - __uint32_t xs_ibt_2_join; - __uint32_t xs_ibt_2_alloc; - __uint32_t xs_ibt_2_free; - __uint32_t xs_ibt_2_moves; + uint32_t xs_ibt_2_lookup; + uint32_t xs_ibt_2_compare; + uint32_t xs_ibt_2_insrec; + uint32_t xs_ibt_2_delrec; + uint32_t xs_ibt_2_newroot; + uint32_t xs_ibt_2_killroot; + uint32_t xs_ibt_2_increment; + uint32_t xs_ibt_2_decrement; + uint32_t xs_ibt_2_lshift; + uint32_t xs_ibt_2_rshift; + uint32_t xs_ibt_2_split; + uint32_t xs_ibt_2_join; + uint32_t xs_ibt_2_alloc; + uint32_t xs_ibt_2_free; + uint32_t xs_ibt_2_moves; #define XFSSTAT_END_FIBT_V2 (XFSSTAT_END_IBT_V2+15) - __uint32_t xs_fibt_2_lookup; - __uint32_t xs_fibt_2_compare; - __uint32_t xs_fibt_2_insrec; - __uint32_t xs_fibt_2_delrec; - __uint32_t xs_fibt_2_newroot; - __uint32_t xs_fibt_2_killroot; - __uint32_t xs_fibt_2_increment; - __uint32_t xs_fibt_2_decrement; - __uint32_t xs_fibt_2_lshift; - __uint32_t xs_fibt_2_rshift; - __uint32_t xs_fibt_2_split; - __uint32_t xs_fibt_2_join; - __uint32_t xs_fibt_2_alloc; - __uint32_t xs_fibt_2_free; - __uint32_t xs_fibt_2_moves; + uint32_t xs_fibt_2_lookup; + uint32_t xs_fibt_2_compare; + uint32_t xs_fibt_2_insrec; + uint32_t xs_fibt_2_delrec; + uint32_t xs_fibt_2_newroot; + uint32_t xs_fibt_2_killroot; + uint32_t xs_fibt_2_increment; + uint32_t xs_fibt_2_decrement; + uint32_t xs_fibt_2_lshift; + uint32_t xs_fibt_2_rshift; + uint32_t xs_fibt_2_split; + uint32_t xs_fibt_2_join; + uint32_t xs_fibt_2_alloc; + uint32_t xs_fibt_2_free; + uint32_t xs_fibt_2_moves; #define XFSSTAT_END_RMAP_V2 (XFSSTAT_END_FIBT_V2+15) - __uint32_t xs_rmap_2_lookup; - __uint32_t xs_rmap_2_compare; - __uint32_t xs_rmap_2_insrec; - __uint32_t xs_rmap_2_delrec; - __uint32_t xs_rmap_2_newroot; - __uint32_t xs_rmap_2_killroot; - __uint32_t xs_rmap_2_increment; - __uint32_t xs_rmap_2_decrement; - __uint32_t xs_rmap_2_lshift; - __uint32_t xs_rmap_2_rshift; - __uint32_t xs_rmap_2_split; - __uint32_t xs_rmap_2_join; - __uint32_t xs_rmap_2_alloc; - __uint32_t xs_rmap_2_free; - __uint32_t xs_rmap_2_moves; + uint32_t xs_rmap_2_lookup; + uint32_t xs_rmap_2_compare; + uint32_t xs_rmap_2_insrec; + uint32_t xs_rmap_2_delrec; + uint32_t xs_rmap_2_newroot; + uint32_t xs_rmap_2_killroot; + uint32_t xs_rmap_2_increment; + uint32_t xs_rmap_2_decrement; + uint32_t xs_rmap_2_lshift; + uint32_t xs_rmap_2_rshift; + uint32_t xs_rmap_2_split; + uint32_t xs_rmap_2_join; + uint32_t xs_rmap_2_alloc; + uint32_t xs_rmap_2_free; + uint32_t xs_rmap_2_moves; #define XFSSTAT_END_XQMSTAT (XFSSTAT_END_RMAP_V2+6) - __uint32_t xs_qm_dqreclaims; - __uint32_t xs_qm_dqreclaim_misses; - __uint32_t xs_qm_dquot_dups; - __uint32_t xs_qm_dqcachemisses; - __uint32_t xs_qm_dqcachehits; - __uint32_t xs_qm_dqwants; + uint32_t xs_qm_dqreclaims; + uint32_t xs_qm_dqreclaim_misses; + uint32_t xs_qm_dquot_dups; + uint32_t xs_qm_dqcachemisses; + uint32_t xs_qm_dqcachehits; + uint32_t xs_qm_dqwants; #define XFSSTAT_END_QM (XFSSTAT_END_XQMSTAT+2) - __uint32_t xs_qm_dquot; - __uint32_t xs_qm_dquot_unused; + uint32_t xs_qm_dquot; + uint32_t xs_qm_dquot_unused; /* Extra precision counters */ - __uint64_t xs_xstrat_bytes; - __uint64_t xs_write_bytes; - __uint64_t xs_read_bytes; + uint64_t xs_xstrat_bytes; + uint64_t xs_write_bytes; + uint64_t xs_read_bytes; }; int xfs_stats_format(struct xfsstats __percpu *stats, char *buf); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 24ef83e..28ad7e0 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -189,7 +189,7 @@ xfs_parseargs( int dsunit = 0; int dswidth = 0; int iosize = 0; - __uint8_t iosizelog = 0; + uint8_t iosizelog = 0; /* * set up the mount name first so all the errors will refer to the @@ -547,7 +547,7 @@ xfs_showargs( return 0; } -static __uint64_t +static uint64_t xfs_max_file_offset( unsigned int blockshift) { @@ -578,7 +578,7 @@ xfs_max_file_offset( # endif #endif - return (((__uint64_t)pagefactor) << bitshift) - 1; + return (((uint64_t)pagefactor) << bitshift) - 1; } /* @@ -613,7 +613,7 @@ xfs_set_inode_alloc( * the max inode percentage. Used only for inode32. */ if (mp->m_maxicount) { - __uint64_t icount; + uint64_t icount; icount = sbp->sb_dblocks * sbp->sb_imax_pct; do_div(icount, 100); @@ -1052,12 +1052,12 @@ xfs_fs_statfs( struct xfs_mount *mp = XFS_M(dentry->d_sb); xfs_sb_t *sbp = &mp->m_sb; struct xfs_inode *ip = XFS_I(d_inode(dentry)); - __uint64_t fakeinos, id; - __uint64_t icount; - __uint64_t ifree; - __uint64_t fdblocks; + uint64_t fakeinos, id; + uint64_t icount; + uint64_t ifree; + uint64_t fdblocks; xfs_extlen_t lsize; - __int64_t ffree; + int64_t ffree; statp->f_type = XFS_SB_MAGIC; statp->f_namelen = MAXNAMELEN - 1; @@ -1080,7 +1080,7 @@ xfs_fs_statfs( statp->f_bavail = statp->f_bfree; fakeinos = statp->f_bfree << sbp->sb_inopblog; - statp->f_files = MIN(icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); + statp->f_files = MIN(icount + fakeinos, (uint64_t)XFS_MAXINUMBER); if (mp->m_maxicount) statp->f_files = min_t(typeof(statp->f_files), statp->f_files, @@ -1093,7 +1093,7 @@ xfs_fs_statfs( /* make sure statp->f_ffree does not underflow */ ffree = statp->f_files - (icount - ifree); - statp->f_ffree = max_t(__int64_t, ffree, 0); + statp->f_ffree = max_t(int64_t, ffree, 0); if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && @@ -1106,7 +1106,7 @@ xfs_fs_statfs( STATIC void xfs_save_resvblks(struct xfs_mount *mp) { - __uint64_t resblks = 0; + uint64_t resblks = 0; mp->m_resblks_save = mp->m_resblks; xfs_reserve_blocks(mp, &resblks, NULL); @@ -1115,7 +1115,7 @@ xfs_save_resvblks(struct xfs_mount *mp) STATIC void xfs_restore_resvblks(struct xfs_mount *mp) { - __uint64_t resblks; + uint64_t resblks; if (mp->m_resblks_save) { resblks = mp->m_resblks_save; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 551b7e2..ae44dd5 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -246,7 +246,7 @@ TRACE_EVENT(xfs_iext_insert, __print_flags(__entry->bmap_state, "|", XFS_BMAP_EXT_FLAGS), (long)__entry->idx, __entry->startoff, - (__int64_t)__entry->startblock, + (int64_t)__entry->startblock, __entry->blockcount, __entry->state, (char *)__entry->caller_ip) @@ -290,7 +290,7 @@ DECLARE_EVENT_CLASS(xfs_bmap_class, __print_flags(__entry->bmap_state, "|", XFS_BMAP_EXT_FLAGS), (long)__entry->idx, __entry->startoff, - (__int64_t)__entry->startblock, + (int64_t)__entry->startblock, __entry->blockcount, __entry->state, (char *)__entry->caller_ip) @@ -1282,7 +1282,7 @@ DECLARE_EVENT_CLASS(xfs_imap_class, __entry->count, __print_symbolic(__entry->type, XFS_IO_TYPES), __entry->startoff, - (__int64_t)__entry->startblock, + (int64_t)__entry->startblock, __entry->blockcount) ) @@ -2035,7 +2035,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_buf_item_class, TP_ARGS(log, buf_f), TP_STRUCT__entry( __field(dev_t, dev) - __field(__int64_t, blkno) + __field(int64_t, blkno) __field(unsigned short, len) __field(unsigned short, flags) __field(unsigned short, size) @@ -2083,7 +2083,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_ino_item_class, __field(int, fields) __field(unsigned short, asize) __field(unsigned short, dsize) - __field(__int64_t, blkno) + __field(int64_t, blkno) __field(int, len) __field(int, boffset) ), diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index e2bf86a..3ed95c7 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -244,7 +244,7 @@ struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp, struct xfs_rui_log_item *ruip); int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, - __uint64_t owner, int whichfork, xfs_fileoff_t startoff, + uint64_t owner, int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, struct xfs_btree_cur **pcur); diff --git a/fs/xfs/xfs_trans_rmap.c b/fs/xfs/xfs_trans_rmap.c index 5a50ef8..7d6d087 100644 --- a/fs/xfs/xfs_trans_rmap.c +++ b/fs/xfs/xfs_trans_rmap.c @@ -87,7 +87,7 @@ xfs_trans_log_finish_rmap_update( struct xfs_trans *tp, struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, - __uint64_t owner, + uint64_t owner, int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, -- 2.7.3 From mtk.manpages@gmail.com Sun Aug 7 12:47:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D48147CDA for ; Sun, 7 Aug 2016 12:47:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A5C518F8037 for ; Sun, 7 Aug 2016 10:47:45 -0700 (PDT) X-ASG-Debug-ID: 1470592061-0bf57c136842aef0001-NocioJ Received: from mail-pa0-f68.google.com (mail-pa0-f68.google.com [209.85.220.68]) by cuda.sgi.com with ESMTP id ePQwOSTYyVbd08mo (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 07 Aug 2016 10:47:42 -0700 (PDT) X-Barracuda-Envelope-From: mtk.manpages@gmail.com X-Barracuda-Effective-Source-IP: mail-pa0-f68.google.com[209.85.220.68] X-Barracuda-Apparent-Source-IP: 209.85.220.68 Received: by mail-pa0-f68.google.com with SMTP id vy10so4048036pac.0 for ; Sun, 07 Aug 2016 10:47:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=subject:to:references:cc:from:message-id:date:user-agent :mime-version:in-reply-to:content-transfer-encoding; bh=heZ/3IU1Lu+iqhuj+q8Z+r/o3m+HmQi7gi8I4ytPquw=; b=TuNFa6hV3Sge7GTHOcrxEu3QIEoFiXHjFARcZx/sse9TwUejq266bX8DtK+7S816Et jpqV+PlzYhmePwZvuIgsqkGTrNR8K01dsVo/dC6OzUl/wvtISdiMy4BNFuk1rOYCn6Qc RTbwKSsZkiy7bowxKS0CzaEF1snHT94x/IUk4f0nz2uOfnBJQN0Wg+m+jo3O5WlHy+xf KwBsL05yGztAMJ5SA+yJcnvPxO2phhXbP9+ApRrsdLCoEpE8VchH74xSIPe6kM48fgJz y+gLbvWPMwKiihsGcI9hjvgBYPWpmtfkkCpLR6ZT0OJMR/SaNbYX2zvh7UXe2A+voqjH TBGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:subject:to:references:cc:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=heZ/3IU1Lu+iqhuj+q8Z+r/o3m+HmQi7gi8I4ytPquw=; b=DAQyQS0i5WX6+BSEWHzWIl8kpE9RyZTuGSuKgS3U2xf78XEMpAqIsxKOZ6NEtOqYVH 91281t9ESsF+d+vBWdUhzQAN9ePN+JlWgzwfMxKR5FmAhJoGwMKp/UnZCJ8zlh4s3m8C Q3DcWpx+BYgVL1ICYg6B53RZRPucPR1nYyktLZABUVMJ8mFoZBXbDZUkQkNLDBNJgxh5 ofx28p6oJzEJiFRk1ihv5vWM3a7/lWPoWPUhGt7RjVjkeBioV9dm7VGyaYuF4Mz8Q08e ToFbr9J+Xzyxvceb0huMN2ZAvW5RVXjA+iTVr3HEtQb7RqS7gxmcFlpucWwKbSpwqh0O eKOg== X-Gm-Message-State: AEkooutZ91Tr949NQZg9O68A6+ZWBsmzVms/EoBg41ZzhfRwrPE5ArMSoSKzgWZEqIvxTg== X-Received: by 10.66.78.5 with SMTP id x5mr43656341paw.108.1470592061260; Sun, 07 Aug 2016 10:47:41 -0700 (PDT) Received: from [192.168.0.11] (7.240.69.111.dynamic.snap.net.nz. [111.69.240.7]) by smtp.gmail.com with ESMTPSA id yv9sm42142016pab.0.2016.08.07.10.47.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 07 Aug 2016 10:47:39 -0700 (PDT) Subject: Re: [PATCH 8/9] vfs: hoist the btrfs deduplication ioctl to the vfs To: "Darrick J. Wong" , Eric Biggers X-ASG-Orig-Subj: Re: [PATCH 8/9] vfs: hoist the btrfs deduplication ioctl to the vfs References: <20151219085505.12478.71157.stgit@birch.djwong.org> <20151219085559.12478.33700.stgit@birch.djwong.org> <20160112060714.GA4980@zzz> <20160112091432.GB7832@birch.djwong.org> Cc: mtk.manpages@gmail.com, david@fromorbit.com, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, hch@infradead.org From: "Michael Kerrisk (man-pages)" Message-ID: <594f4812-e146-6a6b-60d5-91ac56d46d66@gmail.com> Date: Mon, 8 Aug 2016 03:47:34 +1000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 In-Reply-To: <20160112091432.GB7832@birch.djwong.org> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pa0-f68.google.com[209.85.220.68] X-Barracuda-Start-Time: 1470592062 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8703 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31817 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Darrick, On 01/12/2016 08:14 PM, Darrick J. Wong wrote: > [adding btrfs to the cc since we're talking about a whole new dedupe interface] In the discussion below, many points of possible improvement were notedfor the man page.... Would you be willing to put together a patch please? Thanks, Michael > On Tue, Jan 12, 2016 at 12:07:14AM -0600, Eric Biggers wrote: >> Some feedback on the VFS portion of the FIDEDUPERANGE ioctl and its man page... >> (note: I realize the patch is mostly just moving the code that already existed >> in btrfs, but in the VFS it deserves a more thorough review): > > Wheee. :) > > Yes, let's discuss the concerns about the btrfs extent same ioctl. > > I believe Christoph dislikes about the odd return mechanism (i.e. status and > bytes_deduped) and doubts that the vectorization is really necessary. There's > not a lot of documentation to go on aside from "Do whatever the BTRFS ioctl > does". I suspect that will leave my explanations lackng, since I neither > designed the btrfs interface nor know all that much about the decisions made to > arrive at what we have now. > > (I agree with both of hch's complaints.) > > Really, the best argument for keeping this ioctl is to avoid breaking > duperemove. Even then, given that current duperemove checks for btrfs before > trying to use BTRFS_IOC_EXTENT_SAME, we could very well design a new dedupe > ioctl for the VFS, hook the new dedupers (XFS) into the new VFS ioctl > leaving the old btrfs ioctl intact, and train duperemove to try the new > ioctl and fall back on the btrfs one if the VFS ioctl isn't supported. > > Frankly, I also wouldn't mind changing the VFS dedupe ioctl that to something > that resembles the clone_range interface: > > int ioctl(int dest_fd, FIDEDUPERANGE, struct file_dedupe_range * arg); > > struct file_dedupe_range { > __s64 src_fd; > __u64 src_offset; > __u64 length; > __u64 dest_offset; > __u64 flags; > }; > > "See if the byte range src_offset:length in src_fd matches all of > dest_offset:length in dest_fd; if so, share src_fd's physical storage with > dest_fd. Both fds must be files; if they are the same file the ranges cannot > overlap; src_fd must be readable; dest_fd must be writable or append-only. > Offsets and lengths probably need to be block-aligned, but that is filesystem > dependent." > > The error conditions would be superset of the ones we know about today. I'd > return EOVERFLOW or something if length is longer than the FS wants to deal > with. > > Now all the vectorization problems go away, and since it's a new VFS interface > we can define everything from the start. > > Christoph, if this new interface solves your complaints I think I'd like to get > started on the code/docs soon. > >> At high level, I am confused about what is meant by the "source" and >> "destination" files. I understand that with more than two files, you >> effectively have to choose one file to treat specially and dedupe with all >> the other files (an NxN comparison isn't realistic). But with just two >> files, a deduplication operation should be completely symmetric, should it >> not? The end > > Not sure what you mean by 'symmetric', but in any case the convention seems > to be that src_fd's storage is shared with dest_fd if there's a match. > >> result should be that the data is deduplicated, regardless of the order in >> which I gave the file descriptors. So why is there some non-symmetric >> behavior? There are several examples but one is that the VFS is checking >> !S_ISREG() on the "source" file descriptor but not on the "destination" file >> descriptor. > > The dedupe_range function pointer should only be supplied for regular files. > >> Another is that different permissions are required on the source versus on >> the destination. If there are good reasons for the nonsymmetry then this >> needs to be clearly explained in the man page; otherwise it may not be clear >> what to use as the "source" and what to use as the "destination". >> >> It seems odd to be adding "copy" as a system call but then have "dedupe" and >> "clone" as ioctls rather than system calls... it seems that they should all >> be one or the other (at least, if we put aside the fact that the ioctls >> already exist in btrfs). > > We can't put the clone ioctl aside; coreutils has already started using it. > > I'm not sure if clone_range or extent_same are all that popular, though. > AFAIK duperemove is the only program using extent_same, and I don't know > of anything using clone_range. > > (Well, xfs_io does...) > >> The range checking in clone_verify_area() appears incomplete. Someone could >> provide len=UINT64_MAX and all the checks would still pass even though >> 'pos+len' would overflow. > > Yeah... > >> Should the ioctl be interruptible? Right now it always goes through *all* >> the 'struct file_dedupe_range_info's you passed in --- potentially up to >> 65535 of them. > > There probably ought to be explicit signal checks, or we could just get rid > of the vectorization entirely. :) > >> Why 'info->bytes_deduped += deduped' rather than 'info->bytes_deduped = >> deduped'? 'bytes_deduped' is per file descriptor, not for the operation as a >> whole. > > Right, because bytes_deduped is a part of file_dedup_range_info, not > file_dedupe_range. > > (Note the bytes_deduped = 0 earlier in the function.) > >> What permissions do you need on the destination file descriptors? The man >> page implies they must be open for writing and not appending. The >> implementation differs: it requires FMODE_WRITE only for non-admin users, and >> it doesn't check for O_APPEND at all. > > I think the result of an earlier discussion was that src_fd must be readable, > and dest_fd must be writable or appendable. > >> The man page also says you get EPERM if "dest_fd is immutable" and ETXTBSY if >> "one of the files is a swap file", which I don't see actually happening in >> the implementation; it seems those error codes perhaps exist at all for this >> ioctl but rather be left to open(..., O_WRONLY). > > Those could be hoisted to the VFS (from the XFS implementation), I think. > >> If the filesystem doesn't support deduplication, or I pass in a strange file >> descriptor such as one for a named pipe, do I get EINVAL or EOPNOTSUPP? The >> man page isn't clear. > > Should be EOPNOTSUPP if dest_fd isn't a regular file; EISDIR if either are > directories; and EINVAL for any other kind of non-file fd. I suspect the > clone* manpages don't make this too clear either. > >> Under what circumstances will 'bytes_deduped' differ from the count that was >> passed in? > > btrfs/xfs will only compare the first 16MB. Not documented anywhere. :( > >> If short counts are allowed, what will be the 'status' be in that case: >> FILE_DEDUP_RANGE_DIFFERS, FILE_DEDUPE_RANGE_SAME, or something else? > > One of those two. > >> Can data be deduped even if only a prefix of the data region matches? > > No. > >> The man page doesn't mention FILE_DEDUPE_RANGE_SAME at all, instead calling it >> 0; it only mentions FILE_DEDUPE_RANGE_DIFFERS. > > Oops, good catch. :( > >> The man page isn't clear about whether the ioctl stops early if an error >> occurs or always processes all the 'struct file_dedupe_range_info's you pass >> in. And if it were, hypothetically, to stop early, how is the user meant to >> know on which file it stopped? > > I don't know if this should be the official behavior, but it stopped at > whichever file_dedupe_range_info has both status and bytes_deduped set to zero. > >> The man page says "logical_offset" but in the struct it is called >> "dest_offset". > > Oops. > >> There are some variables named "same" which don't really make sense now that >> the ioctl is called FIDEDUPERANGE instead of EXTENT_SAME. > > Perhaps not. > > I'll later take a look at how many of these issues apply to clone/clone_range. > > --D > >> >> Eric >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-api" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > -- > To unsubscribe from this list: send the line "unsubscribe linux-api" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/ From david@fromorbit.com Sun Aug 7 18:11:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B264B7CB6 for ; Sun, 7 Aug 2016 18:11:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 68BBB30405F for ; Sun, 7 Aug 2016 16:11:29 -0700 (PDT) X-ASG-Debug-ID: 1470611482-0bf8157e6c54b710001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id rVLl0G81VM1VzS5B for ; Sun, 07 Aug 2016 16:11:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Au8SAKS/p1d5LDUCEGdsb2JhbABdg0WBUoJ5g3mdEQEBAQEBAQaMYoobhhcEAgKBJ00BAQEBAQEHAQEBAQEBAQE2QIRfAQU6HCMQCAMYCSUPBSUDBxoTiDDCTwEBAQEGAQEBASMehUSFFYdsgi8FmTmPAI9NjDSDeIRgKjKHeQEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 08 Aug 2016 08:41:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bWXDo-0000cf-2s; Mon, 08 Aug 2016 09:11:08 +1000 Date: Mon, 8 Aug 2016 09:11:08 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: xfstests xfs fuzzers fail with DAX Message-ID: <20160807231107.GB19025@dastard> X-ASG-Orig-Subj: Re: xfstests xfs fuzzers fail with DAX References: <20160804024514.GA2906@xzhoul.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470611482 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2404 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31828 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 03, 2016 at 10:00:09PM -0500, Eric Sandeen wrote: > On 8/3/16 9:45 PM, Xiong Zhou wrote: > > Hi, > > > > A few xfs fuzzers in xfstests fail with dax mount option, pass without dax. > > They are xfs/086 xfs/088 xfs/089 xfs/091. > > > > xfstests to commit 4470ad4c7e (Jul 26) > > kernel to commit dd95069545 (Jul 24) > > > > + ./check xfs/091 > > FSTYP -- xfs (non-debug) > > PLATFORM -- Linux/x86_64 rhel73 4.7.0+ > > MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 > > MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch > > > > xfs/091 104s > > Ran: xfs/091 > > Passed all 1 tests > > > > + echo 'MOUNT_OPTIONS="-o dax"' > > + ./check xfs/091 > > FSTYP -- xfs (non-debug) > > PLATFORM -- Linux/x86_64 rhel73 4.7.0+ > > MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 > > MOUNT_OPTIONS -- -o dax -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch > > > > xfs/091 104s ... - output mismatch (see /root/xfstests/results//xfs/091.out.bad) > > --- tests/xfs/091.out 2016-07-18 02:57:47.670000000 -0400 > > +++ /root/xfstests/results//xfs/091.out.bad 2016-08-03 22:38:14.948000000 -0400 > > @@ -6,6 +6,70 @@ > > + corrupt image > > + mount image > > + modify files > > +pwrite64: Structure needs cleaning > > +pwrite64: Structure needs cleaning > > +pwrite64: Structure needs cleaning > > +pwrite64: Structure needs cleaning > > This means the filesystem has shut down, most likely, and more information about > the error is in dmesg. > > Further, if the filesystem is corrupt, xfs_repair output would be interesting. > > Can you provide that information? > > This can probably be reproduced, but when reporting a bug it's always good to provide > as many details as you can. What it indicates to me is that DAX detects inode/freespace metadata related corruption sooner than non-DAX paths because we don't do delayed allocation on DAX. i.e. we are doing direct allocation in the syscall path and errors that would have been detected in the writeback path and triggered until sync/unmount are now triggering in the pwrite() syscall path. Hence I think this is probably expected behaviour, and not a bug or regression. We probably should just filter the pwrite errors out... Cheers, Dave. -- Dave Chinner david@fromorbit.com From Sales.75@fashion-business.com Mon Aug 8 00:55:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3276F7CB4 for ; Mon, 8 Aug 2016 00:55:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AE3F8AC002 for ; Sun, 7 Aug 2016 22:55:41 -0700 (PDT) X-ASG-Debug-ID: 1470635734-0bf8157e6a560860001-NocioJ Received: from fashion-business.com ([14.218.89.214]) by cuda.sgi.com with SMTP id 9aAMcxZ90BfWmoH5 for ; Sun, 07 Aug 2016 22:55:35 -0700 (PDT) X-Barracuda-Envelope-From: Sales.75@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.89.214] X-Barracuda-Apparent-Source-IP: 14.218.89.214 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Mon, 8 Aug 2016 13:53:40 +0800 From: "angelbervogue@sina.com" Subject: Luxury bag for your checking To: xfs@oss.sgi.com X-ASG-Orig-Subj: Luxury bag for your checking MIME-Version: 1.0 Sender: Sales.75@fashion-business.com Reply-To: angelbervogue@sina.com Date: Mon, 8 Aug 2016 13:53:40 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.89.214] X-Barracuda-Start-Time: 1470635734 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2529 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160808055541.38DD4D80071@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJNQVJHSU4t Qk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog 5a6L5L2TOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28taGFu c2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWwiPkhpJm5i c3A7ZnJpZW5kLDwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFz cz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpF OiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBB cmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5XZSANCmFyZSBwcm9mZXNzaW9uYWwg c3VwcGxpZXIgZm9yIHZvZ3VlIGJhZ3MgaW4gQ2hpbmEuIE5pY2UgdG8gaW50cm9kdWNlIG91ciBu ZXcgDQpwcm9qZWN0IHRvIHlvdSBmcm9tIGhlcmUuPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJH SU4tQk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTog5a6L5L2TOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28t aGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWwiPk9u ZSANCmtpbmRzIG9mIG5ldyBzdHlsZSBiYWcgd2lsbCBiZSBzaG93biBpbiBFdXJvcGUgbWFya2V0 LCB0aGlzIGRlc2lnbiB3aWxsIGJlIG1hZGUgDQpieSB0aGUgZmlyc3QgbGF5ZXIgZ2VudWluZSBs ZWF0aGVyLCBhbmQgdGhlIGxvZ28gd2lsbCBiZSBtYWRlIGJ5IHN0YWlubGVzcyBzdGVlbCANCmZp bmlzaGVkIGJ5IHJlYWwgZ29sZGVuIHdhdGVyIHBsYXRpbmcuPC9TUEFOPjwvUD4NCjxQIHN0eWxl PSJNQVJHSU4tQk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFs OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJp YWwiPklmIA0KeW91IGFyZSBpbnRlcmVzdGVkIHdpdGggdGhpcywgSSB3aWxsIHNlbmQgdGhlIGNh dGFsb2cgdG8geW91IGZvciANCmNoZWNraW5nLjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lO LUJPVFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IOWui+S9kzsgRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhh bnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5UaGFu a3MgDQphbmQgYmVzdCByZWdhcmRzITwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRP TTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9 kzsgRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZv bnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5BbmdlbG8gDQpI dWFuZzwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFzcz1Nc29O b3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMC41 cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsg bXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5Ta3lwZTogDQpkYXZpZTE4MTgxODwvU1BBTj48 L1A+PC9CT0RZPjwvSFRNTD4NCg0K From dave@fromorbit.com Mon Aug 8 01:23:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6E5577CA4 for ; Mon, 8 Aug 2016 01:23:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E9457AC004 for ; Sun, 7 Aug 2016 23:23:03 -0700 (PDT) X-ASG-Debug-ID: 1470637378-0bf57b369b4b3360002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id HXeo6wG6JWyzfQII for ; Sun, 07 Aug 2016 23:23:01 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AucSAAgkqFd5LDUCIGdsb2JhbABdg0WBUoZynRcGkEiCKYtbTQEBAQEBAQcBAQEBAQE4QIRfBicvIxAIGDE5AwcUGYgwwxWFYoohhQ8FmTmPDI9BSI9kghUBC4I/KjKHPwEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 08 Aug 2016 15:52:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1bWdxf-0001GH-Qd; Mon, 08 Aug 2016 16:22:55 +1000 Received: from dave by disappointment with local (Exim 4.87) (envelope-from ) id 1bWdxJ-0007Ja-IB; Mon, 08 Aug 2016 16:22:33 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 1/2] iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag Date: Mon, 8 Aug 2016 16:22:30 +1000 X-ASG-Orig-Subj: [PATCH 1/2] iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag Message-Id: <1470637351-27933-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.8.0.rc3 In-Reply-To: <1470637351-27933-1-git-send-email-david@fromorbit.com> References: <1470637351-27933-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470637380 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 912 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31834 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The flag is checked as supported, but then we do an unconditional sync of the file, regardless of whether the flag is set or not. Make the sync conditional on having the FIEMAP_FLAG_SYNC flag set. Signed-off-by: Dave Chinner --- fs/iomap.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/fs/iomap.c b/fs/iomap.c index 48141b8..189742b 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -470,9 +470,11 @@ int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, if (ret) return ret; - ret = filemap_write_and_wait(inode->i_mapping); - if (ret) - return ret; + if (fi->fi_flags & FIEMAP_FLAG_SYNC) { + ret = filemap_write_and_wait(inode->i_mapping); + if (ret) + return ret; + } while (len > 0) { ret = iomap_apply(inode, start, len, 0, ops, &ctx, -- 2.8.0.rc3 From dave@fromorbit.com Mon Aug 8 01:23:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0975C7CA4 for ; Mon, 8 Aug 2016 01:23:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 71D94AC002 for ; Sun, 7 Aug 2016 23:23:02 -0700 (PDT) X-ASG-Debug-ID: 1470637378-0bf57b369b4b3360001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id aeYuxCyiYOb1bv1l for ; Sun, 07 Aug 2016 23:22:59 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtwSAAgkqFd5LDUCIGdsb2JhbABdg0WIRJ0XBpJxi1tNAQEBAQEBBwEBAQEBAThAhTsjGIECAweIXcMVhWKEEoYPhQ8FhgyTLYwMgwCPQZAsghUBCwGCPiqHcQEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 08 Aug 2016 15:52:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1bWdxf-0001GG-Q8; Mon, 08 Aug 2016 16:22:55 +1000 Received: from dave by disappointment with local (Exim 4.87) (envelope-from ) id 1bWdxJ-0007JY-HQ; Mon, 08 Aug 2016 16:22:33 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 0/2] iomap: fixes for fiemap interface Date: Mon, 8 Aug 2016 16:22:29 +1000 X-ASG-Orig-Subj: [PATCH 0/2] iomap: fixes for fiemap interface Message-Id: <1470637351-27933-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.8.0.rc3 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470637378 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1327 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31834 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, A couple of fixes things that Darrick and I noticed when using the iomap fiemap implementation. Darrick noticed that the attribute fork couldn't be mapped when updating his XFS scrubbing utility, and I noticed that the FIEMAP_FLAG_SYNC was being ignored by the code while looking at the attribute mapping issue. Both are regressions agains the old XFS fiemap implementation. The attribute mapping patch is the one that needs the most attention as it adds an iomap control flag and a new iomap internal error. The issue is that we don't know if there are attributes to map until we call down into the filesystem specific code, and at that point we need to tell iomap_apply() that there is nothing to map and so break out. This is done by returning -ENOENT, and then capturing that in iomap_fiemap() and treating it like we've reached the end of file. This causes fiemap to report the attribute map as having no extents. We also need to protect against write mappings being made against the attribute fork in XFS as it's not valid to write into the attribute extent map via this method. Hence we return -EINVAL if we detect an attempt to do so through the iomap control flags. I'm not sure it's the best way to solve the problem, but it does work. Better ideas are welcome... -Dave. From dave@fromorbit.com Mon Aug 8 01:23:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BF8327CCB for ; Mon, 8 Aug 2016 01:23:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 678F78F8040 for ; Sun, 7 Aug 2016 23:23:04 -0700 (PDT) X-ASG-Debug-ID: 1470637381-0bf8157e6c5630c0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id rbHkPaoOPcECfCwM for ; Sun, 07 Aug 2016 23:23:01 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuoSAAgkqFd5LDUCIGdsb2JhbABdg0VWfIZynRcGknGEKIczTQEBAQEBAQcBAQEBAQE4QIRfBicvIxAIGDE5AwcUGYgwwxWFYod0hzwFmTmGHYhvgWmIDYVLkCyCFQGCSioyhz8BAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 08 Aug 2016 15:52:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1bWdxf-0001GI-Qz; Mon, 08 Aug 2016 16:22:55 +1000 Received: from dave by disappointment with local (Exim 4.87) (envelope-from ) id 1bWdxJ-0007Jd-Ib; Mon, 08 Aug 2016 16:22:33 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org Subject: [PATCH 2/2] iomap: add fiemap support for attribute mappings Date: Mon, 8 Aug 2016 16:22:31 +1000 X-ASG-Orig-Subj: [PATCH 2/2] iomap: add fiemap support for attribute mappings Message-Id: <1470637351-27933-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.8.0.rc3 In-Reply-To: <1470637351-27933-1-git-send-email-david@fromorbit.com> References: <1470637351-27933-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470637381 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3338 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Prior to the iomap conversion, XFS supported the FIEMAP_FLAG_XATTR flag for mapping the attribute fork block map. This flag was not added to the iomap fiemap support so we have regressed fiemap functionality with this change. Add an iomap control flag to indicate that we should be operating on the attribute map rather than the file data map and pass it from iomap_fiemap() as appropriate. Add the appropriate flags to the XFS code to switch to the attribute fork lookup, and ensure we return EINVAL if anyone attempts a write mapping of the attribute fork. Signed-off-by: Dave Chinner --- fs/iomap.c | 11 +++++++++-- fs/xfs/xfs_iomap.c | 14 +++++++++++++- include/linux/iomap.h | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/fs/iomap.c b/fs/iomap.c index 189742b..2a04e5e 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -461,12 +461,13 @@ int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, { struct fiemap_ctx ctx; loff_t ret; + int flags = 0; memset(&ctx, 0, sizeof(ctx)); ctx.fi = fi; ctx.prev.type = IOMAP_HOLE; - ret = fiemap_check_flags(fi, FIEMAP_FLAG_SYNC); + ret = fiemap_check_flags(fi, FIEMAP_FLAG_SYNC | FIEMAP_FLAG_XATTR); if (ret) return ret; @@ -476,9 +477,15 @@ int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, return ret; } + if (fi->fi_flags & FIEMAP_FLAG_XATTR) + flags |= IOMAP_ATTR; + while (len > 0) { - ret = iomap_apply(inode, start, len, 0, ops, &ctx, + ret = iomap_apply(inode, start, len, flags, ops, &ctx, iomap_fiemap_actor); + /* inode with no attribute mapping will give ENOENT */ + if (ret == -ENOENT) + break; if (ret < 0) return ret; if (ret == 0) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 4398932..17b5b82 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -993,10 +993,22 @@ xfs_file_iomap_begin( struct xfs_bmbt_irec imap; xfs_fileoff_t offset_fsb, end_fsb; int nimaps = 1, error = 0; + int bmflags = XFS_BMAPI_ENTIRE; if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; + /* Attribute fork can only be read via this interface */ + if (flags & IOMAP_ATTR) { + if (flags & ~IOMAP_ATTR) + return -EINVAL; + /* if there are no attribute fork or extents, return ENOENT */ + if (!XFS_IFORK_Q(ip) || !ip->i_d.di_anextents) + return -ENOENT; + ASSERT(ip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL); + bmflags |= XFS_BMAPI_ATTRFORK; + } + xfs_ilock(ip, XFS_ILOCK_EXCL); ASSERT(offset <= mp->m_super->s_maxbytes); @@ -1006,7 +1018,7 @@ xfs_file_iomap_begin( end_fsb = XFS_B_TO_FSB(mp, offset + length); error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, - &nimaps, XFS_BMAPI_ENTIRE); + &nimaps, bmflags); if (error) { xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 3267df4..00a5477 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -36,6 +36,7 @@ struct iomap { */ #define IOMAP_WRITE (1 << 0) #define IOMAP_ZERO (1 << 1) +#define IOMAP_ATTR (1 << 2) /* operate on attributes */ struct iomap_ops { /* -- 2.8.0.rc3 From eguan@redhat.com Mon Aug 8 02:56:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 853557CCC for ; Mon, 8 Aug 2016 02:56:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 097DFAC002 for ; Mon, 8 Aug 2016 00:56:07 -0700 (PDT) X-ASG-Debug-ID: 1470642963-0bf8157e6b566d00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id chhUBGv3nBjB7juP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 00:56:04 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 47F7537E63; Mon, 8 Aug 2016 07:56:03 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u787u1J9000763; Mon, 8 Aug 2016 03:56:02 -0400 Date: Mon, 8 Aug 2016 15:56:01 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 12/17] reflink: test cross-mountpoint reflink and dedupe Message-ID: <20160808075601.GA27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 12/17] reflink: test cross-mountpoint reflink and dedupe References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914485237.11762.2526971565060691741.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914485237.11762.2526971565060691741.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 08 Aug 2016 07:56:03 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470642963 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 604 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 21, 2016 at 04:47:32PM -0700, Darrick J. Wong wrote: > Test sharing blocks via reflink and dedupe between two different > mountpoints of the same filesystem. This shouldn't work, since > we don't allow cross-mountpoint functions. > > Signed-off-by: Darrick J. Wong > --- > + > +# real QA test starts here > +_supported_os Linux I added "_supported_fs generic" > +_require_scratch_reflink > +_require_cp_reflink > + > +filter_md5() { and move "{" to a new line. Also made the same changes to 928 and queued the patch up. Thanks, Eryu From eguan@redhat.com Mon Aug 8 03:14:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F1F217CCE for ; Mon, 8 Aug 2016 03:14:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 99DFB8F8040 for ; Mon, 8 Aug 2016 01:14:03 -0700 (PDT) X-ASG-Debug-ID: 1470644041-0bf8157e6b568400001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0RnMDtiFOjbjXjXC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 01:14:01 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 25006C057FA7; Mon, 8 Aug 2016 08:14:01 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u788DxmA001565; Mon, 8 Aug 2016 04:14:00 -0400 Date: Mon, 8 Aug 2016 16:13:59 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 13/17] xfs: test swapext with reflink Message-ID: <20160808081359.GB27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 13/17] xfs: test swapext with reflink References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914485888.11762.1688573359701830686.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914485888.11762.1688573359701830686.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 08 Aug 2016 08:14:01 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470644041 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15602 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com On Thu, Jul 21, 2016 at 04:47:38PM -0700, Darrick J. Wong wrote: > Add a few tests to stress the new swapext code for reflink and rmap. > > Signed-off-by: Darrick J. Wong > --- > tests/xfs/873 | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/873.out | 6 +++ > tests/xfs/874 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/874.out | 10 +++++ > tests/xfs/875 | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/875.out | 12 ++++++ > tests/xfs/group | 3 + > 7 files changed, 337 insertions(+) > create mode 100755 tests/xfs/873 > create mode 100644 tests/xfs/873.out > create mode 100755 tests/xfs/874 > create mode 100644 tests/xfs/874.out > create mode 100755 tests/xfs/875 > create mode 100644 tests/xfs/875.out > > > diff --git a/tests/xfs/873 b/tests/xfs/873 > new file mode 100755 > index 0000000..a980148 > --- /dev/null > +++ b/tests/xfs/873 > @@ -0,0 +1,107 @@ > +#! /bin/bash > +# FS QA Test No. 873 > +# > +# See how well xfs_fsr handles "defragging" a file with a hojillion extents. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > +. ./common/reflink > + > +# real QA test starts here > +_supported_os Linux _supported_fs xfs (next two tests need this as well) > +_require_scratch_reflink > +_require_cp_reflink > +_require_test_program "punch-alternating" > +test -x $XFS_FSR_PROG || _notrun "xfs_fsr not found" This can be replaced by (applies to next two tests): _require_command "$XFS_FSR_PROG" "xfs_fsr" > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount >> "$seqres.full" 2>&1 > + > +testdir="$SCRATCH_MNT/test-$seq" > +mkdir "$testdir" > + > +# Setup for 16000 blocks, but we'll accept stress testing down to > +# 2^10 blocks... that should be plenty for anyone. > +fnr=$((12 + LOAD_FACTOR)) > +free_blocks=$(stat -f -c '%a' "$testdir") > +blksz=$(stat -f -c '%S' "$testdir") > +space_avail=$((free_blocks * blksz)) > +calc_space() { > + blocks_needed=$(( 2 ** (fnr + 1) )) > + space_needed=$((blocks_needed * blksz * 5 / 4)) > +} > +calc_space > +while test $space_needed -gt $space_avail; do > + fnr=$((fnr - 1)) > + calc_space > +done > +test $fnr -lt 10 && _notrun "Insufficient space for stress test; would only create $blocks_needed extents." > +bytes=$((blocks_needed * blksz)) > + > +echo "Create a many-block file" > +echo "creating $blocks_needed blocks..." >> "$seqres.full" > +_pwrite_byte 0x62 0 $blksz $testdir/file0 >> $seqres.full > +"$XFS_IO_PROG" -f -c "pwrite -S 0x61 -b 4194304 0 $bytes" "$testdir/file1" >> "$seqres.full" > +echo "punching..." >> "$seqres.full" > +"$here/src/punch-alternating" "$testdir/file1" >> "$seqres.full" > +seq 0 2 $((2 ** (fnr + 1) )) | while read lblk; do > + _reflink_range $testdir/file0 0 $testdir/file1 $((lblk * blksz)) $blksz >> $seqres.full > +done > +echo "...done" >> "$seqres.full" > +_scratch_cycle_mount > + > +echo "Reflink the big file" > +echo "reflinking $((blocks_needed / 2)) blocks, $((bytes / 2)) bytes" >> "$seqres.full" > +_reflink_range "$testdir/file1" 0 "$testdir/file2" 0 $bytes >> "$seqres.full" > + > +echo "Defrag the big file" > +old_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) There's a "_count_extents" helper, does that work for this case? > +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full > +new_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > + > +echo "Check extent count" > +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full > +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full > +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full > +test $old_nextents -gt $new_nextents || echo "FAIL: $old_nextents -> $new_nextents" > + > +# success, all done > +status=0 > +exit And 873 fails the post-test fs check on "-m reflink=1,rmapbt=1" XFS, test passed if rmapbt=0, just FYI (tested with your djwong-experimental branch kernel and xfsprogs). _check_xfs_filesystem: filesystem on /dev/sda6 is inconsistent *** xfs_repair -n output *** Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... sb_fdblocks 3903040, counted 3903229 - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. *** end xfs_repair output > diff --git a/tests/xfs/873.out b/tests/xfs/873.out > new file mode 100644 > index 0000000..9dddf55 > --- /dev/null > +++ b/tests/xfs/873.out > @@ -0,0 +1,6 @@ > +QA output created by 873 > +Format and mount > +Create a many-block file > +Reflink the big file > +Defrag the big file > +Check extent count > diff --git a/tests/xfs/874 b/tests/xfs/874 > new file mode 100755 > index 0000000..fb31ea8 > --- /dev/null > +++ b/tests/xfs/874 > @@ -0,0 +1,99 @@ > +#! /bin/bash > +# FS QA Test No. 874 > +# > +# Ensure that xfs_fsr handles errors correctly while defragging files. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > +. ./common/reflink > +. ./common/quota Seems this is not needed in this test. > +. ./common/inject > + > +# real QA test starts here > +_supported_os Linux > +_require_scratch_reflink > +_require_cp_reflink > +test -x $XFS_FSR_PROG || _notrun "xfs_fsr not found" > +_require_xfs_io_error_injection "bmap_finish_one" > +_require_xfs_scratch_rmapbt > + > +_repquota() { > + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' > +} Not used & needed. > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount >> "$seqres.full" 2>&1 > + > +testdir="$SCRATCH_MNT/test-$seq" > +blksz=65536 > +blks=3 > +mkdir "$testdir" > + > +echo "Create a many-block file" > +_pwrite_byte 0x62 0 $((blksz * blks)) $testdir/file1 >> $seqres.full > +_pwrite_byte 0x63 0 $blksz $testdir/file2 >> $seqres.full > +_reflink_range $testdir/file2 0 $testdir/file1 $blksz $blksz >> $seqres.full > +_scratch_cycle_mount > +$XFS_IO_PROG -c 'bmap -v' $testdir/file1 >> $seqres.full > + > +echo "Inject error" > +_scratch_inject_error "bmap_finish_one" > + > +echo "Defrag the file" > +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full 2>&1 > + > +echo "FS should be shut down, touch will fail" > +touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch > + > +echo "Remount to replay log" | tee /dev/ttyprintk > +_scratch_inject_logprint >> $seqres.full > + > +echo "Check extent count" | tee /dev/ttyprintk > +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full > +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full > +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full > + > +echo "FS should be online, touch should succeed" > +touch $SCRATCH_MNT/goodfs > +$XFS_IO_PROG -c 'bmap -v' $testdir/file1 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/874.out b/tests/xfs/874.out > new file mode 100644 > index 0000000..dbc0f49 > --- /dev/null > +++ b/tests/xfs/874.out > @@ -0,0 +1,10 @@ > +QA output created by 874 > +Format and mount > +Create a many-block file > +Inject error > +Defrag the file > +FS should be shut down, touch will fail > +touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error > +Remount to replay log > +Check extent count > +FS should be online, touch should succeed > diff --git a/tests/xfs/875 b/tests/xfs/875 > new file mode 100755 > index 0000000..17c28db > --- /dev/null > +++ b/tests/xfs/875 > @@ -0,0 +1,100 @@ > +#! /bin/bash > +# FS QA Test No. 875 > +# > +# Ensure that xfs_fsr handles quota correctly while defragging files. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > +. ./common/reflink > +. ./common/quota > + > +# real QA test starts here > +_supported_os Linux > +_require_scratch_reflink > +_require_cp_reflink > +test -x $XFS_FSR_PROG || _notrun "xfs_fsr not found" > +_require_quota > +_require_nobody > + > +_repquota() { > + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' > +} Helpers starting with "_" are usually from common code, I'd rename it to something like "do_repquota" and put the open brace to a new line. Thanks, Eryu > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" > +_scratch_mount >> "$seqres.full" 2>&1 > +quotacheck -u -g $SCRATCH_MNT 2> /dev/null > +quotaon $SCRATCH_MNT 2> /dev/null > + > +testdir="$SCRATCH_MNT/test-$seq" > +blksz=65536 > +blks=3 > +mkdir "$testdir" > + > +echo "Create a many-block file" > +touch $testdir/file1 > +chown nobody $testdir/file1 > +touch $testdir/file2 > +chown nobody $testdir/file2 > +_pwrite_byte 0x62 0 $((blksz * blks)) $testdir/file1 >> $seqres.full > +_pwrite_byte 0x63 0 $blksz $testdir/file2 >> $seqres.full > +_reflink_range $testdir/file2 0 $testdir/file1 $blksz $blksz >> $seqres.full > +_repquota > +_scratch_cycle_mount > + > +echo "Defrag the file" > +old_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full > +new_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > +_repquota > + > +echo "Remount the FS to see if accounting changes" > +_scratch_cycle_mount > +_repquota > + > +echo "Check extent count" > +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full > +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full > +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full > +test $old_nextents -gt $new_nextents || echo "FAIL: $old_nextents -> $new_nextents" > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/875.out b/tests/xfs/875.out > new file mode 100644 > index 0000000..57653e9 > --- /dev/null > +++ b/tests/xfs/875.out > @@ -0,0 +1,12 @@ > +QA output created by 875 > +Format and mount > +Create a many-block file > +root -- 0 0 0 4 0 0 > +nobody -- 256 0 0 2 0 0 > +Defrag the file > +root -- 0 0 0 4 0 0 > +nobody -- 256 0 0 2 0 0 > +Remount the FS to see if accounting changes > +root -- 0 0 0 4 0 0 > +nobody -- 256 0 0 2 0 0 > +Check extent count > diff --git a/tests/xfs/group b/tests/xfs/group > index 5ccf3d6..16f7947 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -306,3 +306,6 @@ > 325 auto quick clone > 326 auto quick clone > 327 auto quick clone > +873 auto quick clone fsr > +874 auto quick clone fsr > +875 auto quick clone fsr quota > From eguan@redhat.com Mon Aug 8 03:48:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9678C7CD1 for ; Mon, 8 Aug 2016 03:48:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1DC06AC002 for ; Mon, 8 Aug 2016 01:48:17 -0700 (PDT) X-ASG-Debug-ID: 1470646096-0bf8157e6d56a130001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CwCeJ78wcMgMWwnB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 01:48:16 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E6CB8C0467E6; Mon, 8 Aug 2016 08:48:15 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u788mELA023366; Mon, 8 Aug 2016 04:48:15 -0400 Date: Mon, 8 Aug 2016 16:48:14 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 14/17] xfs: more rmapbt tests Message-ID: <20160808084814.GC27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 14/17] xfs: more rmapbt tests References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914486527.11762.1173224384905616811.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914486527.11762.1173224384905616811.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 08 Aug 2016 08:48:16 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470646096 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8723 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 21, 2016 at 04:47:45PM -0700, Darrick J. Wong wrote: > More tests for the reverse mapping functionality. > > Signed-off-by: Darrick J. Wong > --- > tests/xfs/876 | 76 +++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/876.out | 4 ++ > tests/xfs/877 | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/877.out | 10 ++++++ > tests/xfs/group | 4 ++ > 5 files changed, 178 insertions(+), 1 deletion(-) > create mode 100755 tests/xfs/876 > create mode 100644 tests/xfs/876.out > create mode 100755 tests/xfs/877 > create mode 100644 tests/xfs/877.out > > > diff --git a/tests/xfs/876 b/tests/xfs/876 > new file mode 100755 > index 0000000..cf73d40 > --- /dev/null > +++ b/tests/xfs/876 > @@ -0,0 +1,76 @@ > +#! /bin/bash > +# FS QA Test No. 876 > +# > +# Create a big enough rmapbt that we tickle a fdblocks accounting bug. This test failed post-test fs check as well "sb_fdblocks 3912360, counted 3912522" Seems like it's a known bug? > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr Seems this is not needed. > +. ./common/reflink > + > +# real QA test starts here > +_supported_os Linux > +_require_scratch > +_require_xfs_scratch_rmapbt > +_require_scratch_reflink > +_require_test_program "punch-alternating" > + > +rm -f "$seqres.full" > + > +echo "+ create scratch fs" > +_scratch_mkfs > "$seqres.full" 2>&1 > + > +echo "+ mount fs image" > +_scratch_mount > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') We usually get isize from the output of _filter_mkfs, e.g. _scratch_mkfs | _filter_mkfs 2>$tmp.mkfs >/dev/null . $tmp.mkfs Then all mkfs info is set accordingly, including $isize But in this test, isize is got but not used. Remove the line? > + > +bt_ptrs=$(( (blksz - 56) / 44 )) > +bt_recs=$(( (blksz - 56) / 24 )) > + > +blocks=$((bt_ptrs * bt_recs + 1)) > +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) > +len=$((blocks * blksz)) > + > +echo "+ make some files" > +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/876.out b/tests/xfs/876.out > new file mode 100644 > index 0000000..96c1970 > --- /dev/null > +++ b/tests/xfs/876.out > @@ -0,0 +1,4 @@ > +QA output created by 876 > ++ create scratch fs > ++ mount fs image > ++ make some files > diff --git a/tests/xfs/877 b/tests/xfs/877 > new file mode 100755 > index 0000000..9700263 > --- /dev/null > +++ b/tests/xfs/877 > @@ -0,0 +1,85 @@ > +#! /bin/bash > +# FS QA Test No. 877 > +# > +# Make sure query_range returns -EINVAL if lowkey > highkey. This test failed too, is this expected (again, tested with your djwong-experimental branck kernel and xfsprogs)? [root@dhcp-66-86-11 xfstests]# diff -u tests/xfs/877.out /root/workspace/xfstests/results//xfs_reflink/xfs/877.out.bad --- tests/xfs/877.out 2016-08-08 16:22:35.151000000 +0800 +++ /root/workspace/xfstests/results//xfs_reflink/xfs/877.out.bad 2016-08-08 16:23:12.405000000 +0800 @@ -7,4 +7,3 @@ Unmount Try a regular fsmap Try a bad fsmap -Error 22 while querying fsmap btree. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr Seems this is not needed. > + > +# real QA test starts here > +_supported_os Linux _supported_fs xfs > +_require_xfs_scratch_rmapbt _require_xfs_io_command commands used in this test? e.g. falloc, fpunch, fcollapse and finsert And '_require_command "$XFS_DB_PROG" "xfs_db"' > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > +blksz=65536 > +blocks=16 > +len=$((blocks * blksz)) > + > +echo "Create some files" > +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > + > +echo "Manipulate file" > +$XFS_IO_PROG -c "fpunch $blksz $blksz" \ > + -c "fzero $((3 * blksz)) $blksz" \ > + -c "pwrite -S 0x69 $((5 * blksz)) $blksz" \ > + -c "fpunch $((7 * blksz)) $blksz" \ > + -c "fsync" \ > + -c "pwrite -S 0x70 $((7 * blksz)) $blksz" \ > + -c "fcollapse $((9 * blksz)) $blksz" \ > + -c "finsert $((10 * blksz)) $blksz" $SCRATCH_MNT/f1 >> $seqres.full > + > +echo "Check file" > +md5sum $SCRATCH_MNT/f1 | _filter_scratch > +od -tx1 -Ad -c $SCRATCH_MNT/f1 >> $seqres.full > + > +echo "Unmount" > +_scratch_unmount > + > +echo "Try a regular fsmap" > +$XFS_DB_PROG -c 'fsmap' $SCRATCH_DEV >> $seqres.full > +$XFS_DB_PROG -c 'fsmap 0 5' $SCRATCH_DEV >> $seqres.full > + > +echo "Try a bad fsmap" > +$XFS_DB_PROG -c 'fsmap 5 4' $SCRATCH_DEV > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/877.out b/tests/xfs/877.out > new file mode 100644 > index 0000000..4a2242f > --- /dev/null > +++ b/tests/xfs/877.out > @@ -0,0 +1,10 @@ > +QA output created by 877 > +Format and mount > +Create some files > +Manipulate file > +Check file > +e45c5707fcf6817e914ffb6ce37a0ac7 SCRATCH_MNT/f1 > +Unmount > +Try a regular fsmap > +Try a bad fsmap > +Error 22 while querying fsmap btree. > diff --git a/tests/xfs/group b/tests/xfs/group > index 16f7947..f81f899 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -3,8 +3,8 @@ > 003 db auto quick > 004 db auto quick > 005 auto quick > -007 auto quota quick > 006 auto quick mount > +007 auto quota quick This is already fixed in upstream, not needed. Thanks, Eryu > 008 rw ioctl auto quick > 009 rw ioctl auto prealloc quick > 010 auto quick repair > @@ -309,3 +309,5 @@ > 873 auto quick clone fsr > 874 auto quick clone fsr > 875 auto quick clone fsr quota > +876 auto quick rmap clone > +877 auto quick rmap clone > From eguan@redhat.com Mon Aug 8 03:52:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0C4077CA0 for ; Mon, 8 Aug 2016 03:52:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65859AC004 for ; Mon, 8 Aug 2016 01:52:43 -0700 (PDT) X-ASG-Debug-ID: 1470646361-0bf57b369b4b9060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mLQSz1biQhQrRMdO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 01:52:42 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6844EC03070B; Mon, 8 Aug 2016 08:52:41 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u788qedj025956; Mon, 8 Aug 2016 04:52:40 -0400 Date: Mon, 8 Aug 2016 16:52:39 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 15/17] xfs: scrub fs (if still mounted) at the end of the test Message-ID: <20160808085239.GD27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 15/17] xfs: scrub fs (if still mounted) at the end of the test References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914487167.11762.17599617419019795848.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914487167.11762.17599617419019795848.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 08 Aug 2016 08:52:41 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470646362 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2441 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 21, 2016 at 04:47:51PM -0700, Darrick J. Wong wrote: > Teach _check_xfs_filesystem to scrub mounted filesystems before > unmounting and fscking them. This is mostly to test the online > scrub tool... > > Signed-off-by: Darrick J. Wong > --- > README | 3 +++ > common/config | 1 + > common/rc | 7 +++++++ > 3 files changed, 11 insertions(+) > > > diff --git a/README b/README > index 4509cc1..c19fcb1 100644 > --- a/README > +++ b/README > @@ -84,6 +84,9 @@ Preparing system for tests (IRIX and Linux): > run xfs_repair -n to check the filesystem; xfs_repair to rebuild > metadata indexes; and xfs_repair -n (a third time) to check the > results of the rebuilding. > + - set TEST_XFS_SCRUB=1 to have _check_xfs_filesystem run > + xfs_scrub -vd to scrub the filesystem metadata online before > + unmounting to run the offline check. Mixed space and tab in above lines, I can fix it at commit time. Thanks, Eryu > > - or add a case to the switch in common/config assigning > these variables based on the hostname of your test > diff --git a/common/config b/common/config > index 08d5d80..168f46c 100644 > --- a/common/config > +++ b/common/config > @@ -163,6 +163,7 @@ export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" > export XFS_DB_PROG="`set_prog_path xfs_db`" > export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` > export XFS_IO_PROG="`set_prog_path xfs_io`" > +export XFS_SCRUB_PROG="`set_prog_path xfs_scrub`" > export XFS_PARALLEL_REPAIR_PROG="`set_prog_path xfs_prepair`" > export XFS_PARALLEL_REPAIR64_PROG="`set_prog_path xfs_prepair64`" > export __XFSDUMP_PROG="`set_prog_path xfsdump`" > diff --git a/common/rc b/common/rc > index 3b45578..861a721 100644 > --- a/common/rc > +++ b/common/rc > @@ -2391,6 +2391,13 @@ _check_xfs_filesystem() > > if [ "$type" = "xfs" ] > then > + if [ -n "$TEST_XFS_SCRUB" ] && [ -x "$XFS_SCRUB_PROG" ]; then > + "$XFS_SCRUB_PROG" $scrubflag -vd $device >>$seqres.full > + if [ $? -ne 0 ]; then > + echo "filesystem on $device failed scrub (see $seqres.full)" > + ok=0 > + fi > + fi > # mounted ... > mountpoint=`_umount_or_remount_ro $device` > fi > From eguan@redhat.com Mon Aug 8 04:08:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 171277CA1 for ; Mon, 8 Aug 2016 04:08:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8490304051 for ; Mon, 8 Aug 2016 02:08:07 -0700 (PDT) X-ASG-Debug-ID: 1470647283-0bf8157e6b56acb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rXadtT74BAJBcJW7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 02:08:03 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CFBDC61E54; Mon, 8 Aug 2016 09:08:02 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u78980uM003181; Mon, 8 Aug 2016 05:08:01 -0400 Date: Mon, 8 Aug 2016 17:08:00 +0800 From: Eryu Guan To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 17/17] xfs: test realtime rmapbt code Message-ID: <20160808090800.GE27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 17/17] xfs: test realtime rmapbt code References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914488713.11762.7958985131932985171.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <146914488713.11762.7958985131932985171.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 08 Aug 2016 09:08:02 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470647283 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 43616 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 21, 2016 at 04:48:07PM -0700, Darrick J. Wong wrote: > Test the realtime rmap btree code by exercising various IO patterns > on realtime files. > > Signed-off-by: Darrick J. Wong > --- > tests/xfs/878 | 88 +++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/878.out | 9 ++++ > tests/xfs/879 | 67 +++++++++++++++++++++++++++++++++ > tests/xfs/879.out | 7 +++ > tests/xfs/880 | 86 ++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/880.out | 7 +++ > tests/xfs/881 | 95 +++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/881.out | 8 ++++ > tests/xfs/882 | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/882.out | 11 +++++ > tests/xfs/883 | 89 ++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/883.out | 10 +++++ > tests/xfs/884 | 91 +++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/884.out | 9 ++++ > tests/xfs/885 | 94 ++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/885.out | 10 +++++ > tests/xfs/886 | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/886.out | 7 +++ > tests/xfs/887 | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/887.out | 7 +++ > tests/xfs/888 | 76 +++++++++++++++++++++++++++++++++++++ > tests/xfs/888.out | 6 +++ > tests/xfs/group | 11 +++++ > 23 files changed, 1107 insertions(+) > create mode 100644 tests/xfs/878 Need the mode of test file to be 755 > create mode 100644 tests/xfs/878.out > create mode 100755 tests/xfs/879 > create mode 100644 tests/xfs/879.out > create mode 100755 tests/xfs/880 > create mode 100644 tests/xfs/880.out > create mode 100755 tests/xfs/881 > create mode 100644 tests/xfs/881.out > create mode 100755 tests/xfs/882 > create mode 100644 tests/xfs/882.out > create mode 100755 tests/xfs/883 > create mode 100644 tests/xfs/883.out > create mode 100755 tests/xfs/884 > create mode 100644 tests/xfs/884.out > create mode 100755 tests/xfs/885 > create mode 100644 tests/xfs/885.out > create mode 100755 tests/xfs/886 > create mode 100644 tests/xfs/886.out > create mode 100755 tests/xfs/887 > create mode 100644 tests/xfs/887.out > create mode 100755 tests/xfs/888 > create mode 100644 tests/xfs/888.out > > > diff --git a/tests/xfs/878 b/tests/xfs/878 > new file mode 100644 > index 0000000..b1f2672 > --- /dev/null > +++ b/tests/xfs/878 > @@ -0,0 +1,88 @@ > +#! /bin/bash > +# FS QA Test No. 878 > +# > +# Set rrmapino to another inode on an non-rt rmap fs and see if repair fixes it. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux _supported_fs xfs (also apply to all tests in this patch) > +_require_xfs_scratch_rmapbt > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +SCRATCH_RTDEV= USE_EXTERNAL= _scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > + > +echo "Create some files" > +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full > +echo garbage > $SCRATCH_MNT/f3 > +ino=$(stat -c '%i' $SCRATCH_MNT/f3) > +_scratch_unmount > + > +echo "Corrupt fs" > +$XFS_DB_PROG -x -c 'sb 0' -c "write rrmapino $ino" $SCRATCH_DEV >> $seqres.full > +_scratch_mount > + > +echo "Check files" > +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch > + > +echo "Try to create more files" > +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 > + > +echo "Repair fs" > +_scratch_unmount 2>&1 | _filter_scratch I think there's no need to filter unmount. > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > + | tee $tmp.logprint | grep -q "" > +if [ $? -ne 0 ]; then > + echo "Dirty log, zeroing..." >> $seqres.full > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > +else > + _scratch_xfs_repair >> $seqres.full 2>&1 > +fi > +_scratch_xfs_repair >> $seqres.full 2>&1 > + > +echo "Try to create more files (again)" > +_scratch_mount > +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/878.out b/tests/xfs/878.out > new file mode 100644 > index 0000000..e134506 > --- /dev/null > +++ b/tests/xfs/878.out > @@ -0,0 +1,9 @@ > +QA output created by 878 > +Format and mount > +Create some files > +Corrupt fs > +Check files > +8f27047948255cb84872e2dd7c0bc56d SCRATCH_MNT/f1 > +Try to create more files > +Repair fs > +Try to create more files (again) > diff --git a/tests/xfs/879 b/tests/xfs/879 > new file mode 100755 > index 0000000..0cbaf09 > --- /dev/null > +++ b/tests/xfs/879 > @@ -0,0 +1,67 @@ > +#! /bin/bash > +# FS QA Test No. 879 > +# > +# Ensure that we can create a few realtime files on a rmapbt filesystem. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr common/attr seems not needed in this test and other tests in this patch. > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > + > +echo "Create a few files" > +$XFS_IO_PROG -f -R -c 'pwrite -S 0x67 0 50000' -c fsync $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c 'pwrite -S 0x67 0 50000' -c fsync $SCRATCH_MNT/f2 >> $seqres.full > +_scratch_cycle_mount > + > +echo "Grab contents" > +md5sum $SCRATCH_MNT/f1 $SCRATCH_MNT/f2 | _filter_scratch > + > +echo "Remove one file" > +rm -rf $SCRATCH_MNT/f2 > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/879.out b/tests/xfs/879.out > new file mode 100644 > index 0000000..9dfe48b > --- /dev/null > +++ b/tests/xfs/879.out > @@ -0,0 +1,7 @@ > +QA output created by 879 > +Format and mount > +Create a few files > +Grab contents > +10abe2628d19eb1c2ebe18aad7b14820 SCRATCH_MNT/f1 > +10abe2628d19eb1c2ebe18aad7b14820 SCRATCH_MNT/f2 > +Remove one file > diff --git a/tests/xfs/880 b/tests/xfs/880 > new file mode 100755 > index 0000000..2056097 > --- /dev/null > +++ b/tests/xfs/880 > @@ -0,0 +1,86 @@ > +#! /bin/bash > +# FS QA Test No. 880 > +# > +# Exercise expanding and shrinking the realtime rmap btree. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > +_require_test_program "punch-alternating" > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > + > +echo "Create a three-level rtrmapbt" > +i_ptrs=$(( (isize - 176) / 56 )) > +bt_ptrs=$(( (blksz - 56) / 56 )) > +bt_recs=$(( (blksz - 56) / 32 )) > + > +blocks=$((i_ptrs * bt_ptrs * bt_recs)) > +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) > +rtblksz=$(xfs_info $SCRATCH_MNT | grep '^realtime' | \ > + sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g') Both isize and rtextsz can be got from _filter_mkfs, as I mentioned in another email. Thanks, Eryu > +len=$((blocks * rtblksz)) > + > +echo "Create big file" > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > + > +echo "Explode the rtrmapbt" > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > +_scratch_cycle_mount > + > +echo "Remove half the records" > +rm -rf $SCRATCH_MNT/f1 > +_scratch_cycle_mount > + > +echo "Remove the rest of the records" > +rm -rf $SCRATCH_MNT/f2 > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/880.out b/tests/xfs/880.out > new file mode 100644 > index 0000000..b87665b > --- /dev/null > +++ b/tests/xfs/880.out > @@ -0,0 +1,7 @@ > +QA output created by 880 > +Format and mount > +Create a three-level rtrmapbt > +Create big file > +Explode the rtrmapbt > +Remove half the records > +Remove the rest of the records > diff --git a/tests/xfs/881 b/tests/xfs/881 > new file mode 100755 > index 0000000..c7474f5 > --- /dev/null > +++ b/tests/xfs/881 > @@ -0,0 +1,95 @@ > +#! /bin/bash > +# FS QA Test No. 881 > +# > +# Exercise metadump on realtime rmapbt preservation. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > +_require_test_program "punch-alternating" > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > + > +metadump_file=$TEST_DIR/${seq}_metadump > +rm -rf $metadump_file > + > +echo "Create a three-level rtrmapbt" > +i_ptrs=$(( (isize - 176) / 56 )) > +bt_ptrs=$(( (blksz - 56) / 56 )) > +bt_recs=$(( (blksz - 56) / 32 )) > + > +blocks=$((i_ptrs * bt_ptrs * bt_recs)) > +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) > +rtblksz=$(xfs_info $SCRATCH_MNT | grep '^realtime' | \ > + sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g') > +len=$((blocks * rtblksz)) > + > +echo "Create big file" > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > + > +echo "Explode the rtrmapbt" > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > +_scratch_cycle_mount > + > +echo "Create metadump file" > +_scratch_unmount > +_scratch_metadump $metadump_file > + > +# Now restore the obfuscated one back and take a look around > +echo "Restore metadump" > +xfs_mdrestore $metadump_file $TEST_DIR/image > +SCRATCH_DEV=$TEST_DIR/image _scratch_mount > +SCRATCH_DEV=$TEST_DIR/image _scratch_unmount > + > +echo "Check restored fs" > +_check_generic_filesystem $metadump_file > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/881.out b/tests/xfs/881.out > new file mode 100644 > index 0000000..6ad156c > --- /dev/null > +++ b/tests/xfs/881.out > @@ -0,0 +1,8 @@ > +QA output created by 881 > +Format and mount > +Create a three-level rtrmapbt > +Create big file > +Explode the rtrmapbt > +Create metadump file > +Restore metadump > +Check restored fs > diff --git a/tests/xfs/882 b/tests/xfs/882 > new file mode 100755 > index 0000000..569a560 > --- /dev/null > +++ b/tests/xfs/882 > @@ -0,0 +1,108 @@ > +#! /bin/bash > +# FS QA Test No. 882 > +# > +# Corrupt the realtime rmapbt and see how the kernel and xfs_repair deal. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > +_require_test_program "punch-alternating" > + > +rm -f "$seqres.full" > + > +echo "+ create scratch fs" > +_scratch_mkfs > "$seqres.full" 2>&1 > + > +echo "+ mount fs image" > +_scratch_mount > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > + > +i_ptrs=$(( (isize - 176) / 56 )) > +bt_ptrs=$(( (blksz - 56) / 56 )) > +bt_recs=$(( (blksz - 56) / 32 )) > + > +blocks=$((i_ptrs * bt_ptrs * bt_recs + 1)) > +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) > +len=$((blocks * blksz)) > + > +echo "+ make some files" > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > +_scratch_unmount > + > +echo "+ check fs" > +_scratch_xfs_repair -n >> $seqres.full 2>&1 || echo "xfs_repair should not fail" > + > +echo "+ corrupt image" > +$XFS_DB_PROG -x -c "sb" -c "addr rrmapino" -c "addr u3.rtrmapbt.ptrs[1]" -c "stack" \ > + -c "blocktrash -x 4096 -y 4096 -n 8 -3 -z" $SCRATCH_DEV >> $seqres.full 2>&1 > + > +echo "+ mount image" > +_scratch_mount > + > +echo "+ copy more" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 1" $SCRATCH_MNT/e3 >> $seqres.full 2>&1 > +test -s ${SCRATCH_MNT}/f3 && echo "should not be able to copy with busted rtrmap btree" > +_scratch_unmount > + > +echo "+ repair fs" > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > + | tee $tmp.logprint | grep -q "" > +if [ $? -ne 0 ]; then > + echo "Dirty log, zeroing..." >> $seqres.full > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > +else > + _scratch_xfs_repair >> $seqres.full 2>&1 > +fi > +_scratch_xfs_repair >> $seqres.full 2>&1 > + > +echo "+ mount image (2)" > +_scratch_mount > + > +echo "+ copy more (2)" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 1" $SCRATCH_MNT/e4 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/882.out b/tests/xfs/882.out > new file mode 100644 > index 0000000..5ebe620 > --- /dev/null > +++ b/tests/xfs/882.out > @@ -0,0 +1,11 @@ > +QA output created by 882 > ++ create scratch fs > ++ mount fs image > ++ make some files > ++ check fs > ++ corrupt image > ++ mount image > ++ copy more > ++ repair fs > ++ mount image (2) > ++ copy more (2) > diff --git a/tests/xfs/883 b/tests/xfs/883 > new file mode 100755 > index 0000000..403ef35 > --- /dev/null > +++ b/tests/xfs/883 > @@ -0,0 +1,89 @@ > +#! /bin/bash > +# FS QA Test No. 883 > +# > +# Set rrmapino to zero on an rtrmap fs and see if repair fixes it. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > + > +echo "Create some files" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full > +_scratch_unmount > + > +echo "Corrupt fs" > +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rrmapino' -c 'write core.nlinkv2 0' \ > + -c 'write core.mode 0' -c 'sb 0' -c 'write rrmapino 0' $SCRATCH_DEV >> $seqres.full > +_scratch_mount >> $seqres.full 2>&1 && echo "mount should have failed" > + > +echo "Check files" > +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch > + > +echo "Try to create more files" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 > +test -e $SCRATCH_MNT/f3 && echo "should not have been able to write f3" > + > +echo "Repair fs" > +_scratch_unmount 2>&1 | _filter_scratch > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > + | tee $tmp.logprint | grep -q "" > +if [ $? -ne 0 ]; then > + echo "Dirty log, zeroing..." >> $seqres.full > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > +else > + _scratch_xfs_repair >> $seqres.full 2>&1 > +fi > +_scratch_xfs_repair >> $seqres.full 2>&1 > + > +echo "Try to create more files (again)" > +_scratch_mount > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/883.out b/tests/xfs/883.out > new file mode 100644 > index 0000000..6e75ac1 > --- /dev/null > +++ b/tests/xfs/883.out > @@ -0,0 +1,10 @@ > +QA output created by 883 > +Format and mount > +Create some files > +Corrupt fs > +Check files > +md5sum: SCRATCH_MNT/f1: No such file or directory > +Try to create more files > +Repair fs > +umount: SCRATCH_DEV: not mounted > +Try to create more files (again) > diff --git a/tests/xfs/884 b/tests/xfs/884 > new file mode 100755 > index 0000000..ad648b8 > --- /dev/null > +++ b/tests/xfs/884 > @@ -0,0 +1,91 @@ > +#! /bin/bash > +# FS QA Test No. 884 > +# > +# Link rrmapino into the rootdir on an rtrmap fs and see if repair fixes it. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > + > +echo "Create some files" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full > +echo garbage > $SCRATCH_MNT/f3 > +ln $SCRATCH_MNT/f3 $SCRATCH_MNT/f4 > +_scratch_unmount > + > +echo "Corrupt fs" > +rrmapino=$($XFS_DB_PROG -c 'sb 0' -c 'p rrmapino' $SCRATCH_DEV | awk '{print $3}') > +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rootino' \ > + -c "write u3.sfdir3.list[3].inumber.i4 $rrmapino" $SCRATCH_DEV >> $seqres.full > +_scratch_mount > + > +echo "Check files" > +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch > + > +echo "Try to create more files" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 > + > +echo "Repair fs" > +_scratch_unmount 2>&1 | _filter_scratch > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > + | tee $tmp.logprint | grep -q "" > +if [ $? -ne 0 ]; then > + echo "Dirty log, zeroing..." >> $seqres.full > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > +else > + _scratch_xfs_repair >> $seqres.full 2>&1 > +fi > +_scratch_xfs_repair >> $seqres.full 2>&1 > + > +echo "Try to create more files (again)" > +_scratch_mount > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/884.out b/tests/xfs/884.out > new file mode 100644 > index 0000000..17a73ef > --- /dev/null > +++ b/tests/xfs/884.out > @@ -0,0 +1,9 @@ > +QA output created by 884 > +Format and mount > +Create some files > +Corrupt fs > +Check files > +8f27047948255cb84872e2dd7c0bc56d SCRATCH_MNT/f1 > +Try to create more files > +Repair fs > +Try to create more files (again) > diff --git a/tests/xfs/885 b/tests/xfs/885 > new file mode 100755 > index 0000000..b5880bd > --- /dev/null > +++ b/tests/xfs/885 > @@ -0,0 +1,94 @@ > +#! /bin/bash > +# FS QA Test No. 885 > +# > +# Set rrmapino to another inode on an rtrmap fs and see if repair fixes it. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > + > +echo "Create some files" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full > +echo garbage > $SCRATCH_MNT/f3 > +ino=$(stat -c '%i' $SCRATCH_MNT/f3) > +_scratch_unmount > + > +echo "Corrupt fs" > +rrmapino=$($XFS_DB_PROG -c 'sb 0' -c 'p rrmapino' $SCRATCH_DEV | awk '{print $3}') > +$XFS_DB_PROG -x -c "inode $rrmapino" -c 'write core.format 2' \ > + -c 'write core.size 0' -c 'write core.nblocks 0' \ > + -c 'sb 0' -c 'addr rootino' -c "write u3.sfdir3.list[2].inumber.i4 $rrmapino" \ > + -c 'sb 0' -c "write rrmapino $ino" $SCRATCH_DEV >> $seqres.full > +_scratch_mount >> $seqres.full 2>&1 && echo "mount should have failed" > + > +echo "Check files" > +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch > + > +echo "Try to create more files" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 > +test -e $SCRATCH_MNT/f3 && echo "should not have been able to write f3" > + > +echo "Repair fs" > +_scratch_unmount 2>&1 | _filter_scratch > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > + | tee $tmp.logprint | grep -q "" > +if [ $? -ne 0 ]; then > + echo "Dirty log, zeroing..." >> $seqres.full > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > +else > + _scratch_xfs_repair >> $seqres.full 2>&1 > +fi > +_scratch_xfs_repair >> $seqres.full 2>&1 > + > +echo "Try to create more files (again)" > +_scratch_mount > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/885.out b/tests/xfs/885.out > new file mode 100644 > index 0000000..df04f79 > --- /dev/null > +++ b/tests/xfs/885.out > @@ -0,0 +1,10 @@ > +QA output created by 885 > +Format and mount > +Create some files > +Corrupt fs > +Check files > +md5sum: SCRATCH_MNT/f1: No such file or directory > +Try to create more files > +Repair fs > +umount: SCRATCH_DEV: not mounted > +Try to create more files (again) > diff --git a/tests/xfs/886 b/tests/xfs/886 > new file mode 100755 > index 0000000..57edb3d > --- /dev/null > +++ b/tests/xfs/886 > @@ -0,0 +1,104 @@ > +#! /bin/bash > +# FS QA Test No. 886 > +# > +# Cross-link rrmapino to another inode on an rtrmap fs and see if repair fixes it. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > +_require_test_program "punch-alternating" > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > + > +i_ptrs=$(( (isize - 176) / 56 )) > +bt_recs=$(( (blksz - 56) / 32 )) > + > +blocks=$((i_ptrs * bt_recs + 1)) > +rtblksz=$(xfs_info $SCRATCH_MNT | grep '^realtime' | \ > + sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g') > +len=$((blocks * rtblksz)) > + > +echo "Create some files" > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > +echo garbage > $SCRATCH_MNT/f3 > +ino=$(stat -c '%i' $SCRATCH_MNT/f3) > +_scratch_unmount > + > +echo "Corrupt fs" > +fsbno=$($XFS_DB_PROG -c "inode $ino" -c 'bmap' $SCRATCH_DEV | \ > + sed -e 's/^.*startblock \([0-9]*\) .*$/\1/g') > + > +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rrmapino' -c "write u3.rtrmapbt.ptrs[1] $fsbno" \ > + -c 'p' $SCRATCH_DEV >> $seqres.full > +_scratch_mount > + > +echo "Try to create more files" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 > +test -e $SCRATCH_MNT/f5 && echo "should not have been able to write f5" > + > +echo "Repair fs" > +_scratch_unmount 2>&1 | _filter_scratch > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > + | tee $tmp.logprint | grep -q "" > +if [ $? -ne 0 ]; then > + echo "Dirty log, zeroing..." >> $seqres.full > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > +else > + _scratch_xfs_repair >> $seqres.full 2>&1 > +fi > +_scratch_xfs_repair >> $seqres.full 2>&1 > + > +echo "Try to create more files (again)" > +_scratch_mount > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/886.out b/tests/xfs/886.out > new file mode 100644 > index 0000000..7f00c5d > --- /dev/null > +++ b/tests/xfs/886.out > @@ -0,0 +1,7 @@ > +QA output created by 886 > +Format and mount > +Create some files > +Corrupt fs > +Try to create more files > +Repair fs > +Try to create more files (again) > diff --git a/tests/xfs/887 b/tests/xfs/887 > new file mode 100755 > index 0000000..cdf2707 > --- /dev/null > +++ b/tests/xfs/887 > @@ -0,0 +1,107 @@ > +#! /bin/bash > +# FS QA Test No. 887 > +# > +# Cross-link rrmapino to another inode on an rtrmap fs and see if repair fixes it. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > +_require_test_program "punch-alternating" > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > + > +i_ptrs=$(( (isize - 176) / 56 )) > +bt_recs=$(( (blksz - 56) / 32 )) > + > +blocks=$((i_ptrs * bt_recs + 1)) > +rtblksz=$(xfs_info $SCRATCH_MNT | grep '^realtime' | \ > + sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g') > +len=$((blocks * rtblksz)) > + > +echo "Create some files" > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > +echo garbage > $SCRATCH_MNT/f3 > +ino=$(stat -c '%i' $SCRATCH_MNT/f3) > +_scratch_unmount > + > +echo "Corrupt fs" > +$XFS_DB_PROG -c 'sb 0' -c 'addr rrmapino' -c 'p u3.rtrmapbt.ptrs[1]' $SCRATCH_DEV >> $seqres.full > + > +fsbno=$($XFS_DB_PROG -c 'sb 0' -c 'addr rrmapino' -c 'p u3.rtrmapbt.ptrs[1]' \ > + $SCRATCH_DEV | sed -e 's/^.*://g') > +$XFS_DB_PROG -x -c "inode $ino" -c "write u3.bmx[0].startblock $fsbno" \ > + $SCRATCH_DEV >> $seqres.full > +_scratch_mount > + > +od -tx1 -Ad -c $SCRATCH_MNT/f3 >> $seqres.full > + > +echo "Try to create more files" > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 > +test ! -e $SCRATCH_MNT/f5 && echo "should have been able to write f5" > + > +echo "Repair fs" > +_scratch_unmount 2>&1 | _filter_scratch > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > + | tee $tmp.logprint | grep -q "" > +if [ $? -ne 0 ]; then > + echo "Dirty log, zeroing..." >> $seqres.full > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > +else > + _scratch_xfs_repair >> $seqres.full 2>&1 > +fi > +_scratch_xfs_repair >> $seqres.full 2>&1 > + > +echo "Try to create more files (again)" > +_scratch_mount > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/887.out b/tests/xfs/887.out > new file mode 100644 > index 0000000..30cf032 > --- /dev/null > +++ b/tests/xfs/887.out > @@ -0,0 +1,7 @@ > +QA output created by 887 > +Format and mount > +Create some files > +Corrupt fs > +Try to create more files > +Repair fs > +Try to create more files (again) > diff --git a/tests/xfs/888 b/tests/xfs/888 > new file mode 100755 > index 0000000..15bec80 > --- /dev/null > +++ b/tests/xfs/888 > @@ -0,0 +1,76 @@ > +#! /bin/bash > +# FS QA Test No. 888 > +# > +# Basic rmap manipulation tests for realtime files. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > + > +seq=`basename "$0"` > +seqres="$RESULT_DIR/$seq" > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -rf "$tmp".* $metadump_file > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/attr > + > +# real QA test starts here > +_supported_os Linux > +_require_realtime > +_require_xfs_scratch_rmapbt > + > +rm -f "$seqres.full" > + > +echo "Format and mount" > +_scratch_mkfs > "$seqres.full" 2>&1 > +_scratch_mount > +blksz=65536 > +blocks=16 > +len=$((blocks * blksz)) > + > +echo "Create some files" > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > + > +echo "Manipulate file" > +$XFS_IO_PROG -c "fpunch $blksz $blksz" \ > + -c "fzero $((3 * blksz)) $blksz" \ > + -c "pwrite -S 0x69 $((5 * blksz)) $blksz" \ > + -c "fpunch $((7 * blksz)) $blksz" \ > + -c "fsync" \ > + -c "pwrite -S 0x70 $((7 * blksz)) $blksz" \ > + -c "fcollapse $((9 * blksz)) $blksz" \ > + -c "finsert $((10 * blksz)) $blksz" $SCRATCH_MNT/f1 >> $seqres.full > + > +echo "Check file" > +md5sum $SCRATCH_MNT/f1 | _filter_scratch > +od -tx1 -Ad -c $SCRATCH_MNT/f1 >> $seqres.full > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/888.out b/tests/xfs/888.out > new file mode 100644 > index 0000000..2587697 > --- /dev/null > +++ b/tests/xfs/888.out > @@ -0,0 +1,6 @@ > +QA output created by 888 > +Format and mount > +Create some files > +Manipulate file > +Check file > +e45c5707fcf6817e914ffb6ce37a0ac7 SCRATCH_MNT/f1 > diff --git a/tests/xfs/group b/tests/xfs/group > index f81f899..6fa2eb6 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -311,3 +311,14 @@ > 875 auto quick clone fsr quota > 876 auto quick rmap clone > 877 auto quick rmap clone > +878 auto quick rmap > +879 auto quick rmap > +880 auto quick rmap > +881 auto quick rmap > +882 fuzzers rmap > +883 auto quick rmap > +884 auto quick rmap > +885 auto quick rmap > +886 auto quick rmap > +887 auto quick rmap > +888 auto quick rmap > From jack@suse.cz Mon Aug 8 04:27:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2192F7CCB for ; Mon, 8 Aug 2016 04:27:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB92D8F8040 for ; Mon, 8 Aug 2016 02:27:02 -0700 (PDT) X-ASG-Debug-ID: 1470648418-0bf8157e6d56c350001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id rRIYPWacD2xRGrSA (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 08 Aug 2016 02:27:00 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4C669AAEF; Mon, 8 Aug 2016 09:26:57 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 02D5C1E0F3F; Mon, 8 Aug 2016 11:26:56 +0200 (CEST) Date: Mon, 8 Aug 2016 11:26:55 +0200 From: Jan Kara To: "Boylston, Brian" Cc: Dave Chinner , "Kani, Toshimitsu" , "jack@suse.cz" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Ross Zwisler Subject: Re: Subtle races between DAX mmap fault and write path Message-ID: <20160808092655.GA29128@quack2.suse.cz> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path References: <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470648419 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3908 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri 05-08-16 19:58:33, Boylston, Brian wrote: > Dave Chinner wrote on 2016-08-05: > > [ cut to just the important points ] > > On Thu, Aug 04, 2016 at 06:40:42PM +0000, Kani, Toshimitsu wrote: > >> On Tue, 2016-08-02 at 10:21 +1000, Dave Chinner wrote: > >>> If I drop the fsync from the > >>> buffered IO path, bandwidth remains the same but runtime drops to > >>> 0.55-0.57s, so again the buffered IO write path is faster than DAX > >>> while doing more work. > >> > >> I do not think the test results are relevant on this point because both > >> buffered and dax write() paths use uncached copy to avoid clflush.  The > >> buffered path uses cached copy to the page cache and then use uncached copy to > >> PMEM via writeback.  Therefore, the buffered IO path also benefits from using > >> uncached copy to avoid clflush. > > > > Except that I tested without the writeback path for buffered IO, so > > there was a direct comparison for single cached copy vs single > > uncached copy. > > > > The undenial fact is that a write() with a single cached copy with > > all the overhead of dirty page tracking is /faster/ than a much > > shorter, simpler IO path that uses an uncached copy. That's what the > > numbers say.... > > > >> Cached copy (req movq) is slightly faster than uncached copy, > > > > Not according to Boaz - he claims that uncached is 20% faster than > > cached. How about you two get together, do some benchmarking and get > > your story straight, eh? > > > >> and should be > >> used for writing to the page cache.  For writing to PMEM, however, additional > >> clflush can be expensive, and allocating cachelines for PMEM leads to evict > >> application's cachelines. > > > > I keep hearing people tell me why cached copies are slower, but > > no-one is providing numbers to back up their statements. The only > > numbers we have are the ones I've published showing cached copies w/ > > full dirty tracking is faster than uncached copy w/o dirty tracking. > > > > Show me the numbers that back up your statements, then I'll listen > > to you. > > Here are some numbers for a particular scenario, and the code is below. > > Time (in seconds) to copy a 16KiB buffer 1M times to a 4MiB NVDIMM buffer > (1M total memcpy()s). For the cached+clflush case, the flushes are done > every 4MiB (which seems slightly faster than flushing every 16KiB): > > NUMA local NUMA remote > Cached+clflush 13.5 37.1 > movnt 1.0 1.3 Thanks for the test Brian. But looking at the current source of libpmem this seems to be comparing apples to oranges. Let me explain the details below: > In the code below, pmem_persist() does the CLFLUSH(es) on the given range, > and pmem_memcpy_persist() does non-temporal MOVs with an SFENCE: Yes. libpmem does what you describe above and the name pmem_memcpy_persist() is thus currently misleading because it is not guaranteed to be persistent with the current implementation of DAX in the kernel. It is important to know which kernel version and what filesystem have you used for the test to be able judge the details but generally pmem_persist() does properly tell the filesystem to flush all metadata associated with the file, commit open transactions etc. That's the full cost of persistence. pmem_memcpy_persist() makes sure the data writes have reached persistent storage but nothing guarantees associated metadata changes have reached persistent storage as well. To assure that, fsync() (or pmem_persist() if you wish) is currently the only way from userspace. At which point you've lost most of the advantages using movnt. Ross researches into possibilities of allowing more efficient userspace implementation but currently there are none. Honza -- Jan Kara SUSE Labs, CR From cmaiolin@redhat.com Mon Aug 8 05:57:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 85CEC7CD5 for ; Mon, 8 Aug 2016 05:57:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49B06304053 for ; Mon, 8 Aug 2016 03:57:18 -0700 (PDT) X-ASG-Debug-ID: 1470653836-0bf57c1368451420001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id ZOC5vlnGbnXK3nCW (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 08 Aug 2016 03:57:16 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolin@redhat.com X-Barracuda-Effective-Source-IP: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Apparent-Source-IP: 209.132.183.24 Received: from zmail17.collab.prod.int.phx2.redhat.com (zmail17.collab.prod.int.phx2.redhat.com [10.5.83.19]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id u78AvFv4024320; Mon, 8 Aug 2016 06:57:15 -0400 Date: Mon, 8 Aug 2016 06:57:15 -0400 (EDT) From: Carlos Eduardo Maiolino To: Carlos Maiolino Cc: xfs@oss.sgi.com Message-ID: <907731470.210439.1470653835697.JavaMail.zimbra@redhat.com> In-Reply-To: <20160722085804.GA2990@redhat.com> References: <1468922657-3895-1-git-send-email-cmaiolino@redhat.com> <20160722040955.GB16413@zlang.usersys.redhat.com> <20160722085804.GA2990@redhat.com> Subject: Re: [PATCH] xfs: Document error handling behavior MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH] xfs: Document error handling behavior Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.3.228.28] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF47 (Linux)/8.0.6_GA_5922) Thread-Topic: Document error handling behavior Thread-Index: ubMokOW/yi9mO5t6bkeotHrL1Ri/Bg== X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1470653836 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 919 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.03 X-Barracuda-Spam-Status: No, SCORE=0.03 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain Hi folks, is there any update about this? I didn't see any comments if I need to change something on this patch to get the documentation applied, or perhaps I missed some e-mail? Cheers ----- Original Message ----- From: "Carlos Maiolino" To: "Zorro Lang" Cc: xfs@oss.sgi.com Sent: Friday, July 22, 2016 10:58:04 AM Subject: Re: [PATCH] xfs: Document error handling behavior On Fri, Jul 22, 2016 at 12:09:55PM +0800, Zorro Lang wrote: > On Tue, Jul 19, 2016 at 12:04:17PM +0200, Carlos Maiolino wrote: > > This is the first try to document the implementation of error handlers into > > sysfs. > > > > Reviews and comments are appreciated, please also notice I'm not english-native, > > so, spelling corrections are also appreciated :) > > > > Signed-off-by: Carlos Maiolino > > --- -- -- --Carlos From brian.boylston@hpe.com Mon Aug 8 07:30:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 917357CD5 for ; Mon, 8 Aug 2016 07:30:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4722F304048 for ; Mon, 8 Aug 2016 05:30:29 -0700 (PDT) X-ASG-Debug-ID: 1470659422-0bf8157e6c577780001-NocioJ Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0117.outbound.protection.outlook.com [104.47.32.117]) by cuda.sgi.com with ESMTP id x3zC836QdvMKXWJt (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 08 Aug 2016 05:30:22 -0700 (PDT) X-Barracuda-Envelope-From: brian.boylston@hpe.com X-Barracuda-Effective-Source-IP: mail-sn1nam01on0117.outbound.protection.outlook.com[104.47.32.117] X-Barracuda-Apparent-Source-IP: 104.47.32.117 Received: from CS1PR84MB0119.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.22) by CS1PR84MB0120.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Mon, 8 Aug 2016 12:30:19 +0000 Received: from CS1PR84MB0119.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.22]) by CS1PR84MB0119.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.22]) with mapi id 15.01.0549.025; Mon, 8 Aug 2016 12:30:18 +0000 From: "Boylston, Brian" To: Jan Kara CC: Dave Chinner , "Kani, Toshimitsu" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Ross Zwisler Subject: RE: Subtle races between DAX mmap fault and write path Thread-Topic: Subtle races between DAX mmap fault and write path X-ASG-Orig-Subj: RE: Subtle races between DAX mmap fault and write path Thread-Index: AQHR5/+Li+nlOcNCgEG+8bNAqRCshaAsxqeAgAATU4CAAKUNgIABMOkAgADPd4CAAJ7PgIADzJCAgADs7QCABFe2AIABGVaAgACChKCABBK/gIAALg0A Date: Mon, 8 Aug 2016 12:30:18 +0000 Message-ID: References: <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> <20160808092655.GA29128@quack2.suse.cz> In-Reply-To: <20160808092655.GA29128@quack2.suse.cz> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=brian.boylston@hpe.com; x-originating-ip: [71.71.19.4] x-ms-office365-filtering-correlation-id: 3128a10e-d72a-405f-4d33-08d3bf87c1e2 x-microsoft-exchange-diagnostics: 1;CS1PR84MB0120;6:6KVUuPCuMkBb7Pzv51R5BeLoNwTNINMYcXfJijjmlsM1iGtzW2LZ11M0OzIy9qTUg58NjObhfaqOugedDLraUeyFH35GGS7XRdMWO6uj5djEaZYGQJkztytAKNGIegZ+drDtVvd3qbEcfRXSO3/Vka3Xa0PC3WHlVqcTaNP0XiBJGZqXzlFm32JaK5kRgORi+wyREQ+wEbtscrl8cM+tbCyhO1+hE7/UsJ/+8I6LdZ3URlDmlFdCa1cyXj22JuQ9ZJ4lJ20CE6aBR2I7hvjv2RZyxe2n61F20nDDZuD+mldQzz2+45P+k88bf68oWMmbPv4f/DPEbLU30H6VIaKsOQ==;5:/MUIIoYAi6lEUWnR80QBZx+kN3JvTkc44DMK+aAihQxfhBLlcwKt7MwPtwfGxYCTeXsYdJrRijCJkg0tbQR4n9shlOZbZAzYrM3bGv8g8fWUFodTyLFM50UqWtecFxbea4VfI+CSh9beUfykyqLz3g==;24:aGBpgKjRyRxbDcGRs9jwa75+3DG1t2Bhv32hQ566qcgEJKAoFJsTZ6YUX4WBujDrl9Bcdp7Cef0DpK0augCMzw+2IPGbKcdaXvJ+JPUWFd4=;7:Aj5iWcQ1B4HbPHiaWZDNrc8kC1bJEBlyGAkcqD1NUBE1JafkkyQ81EXPq4tDxH1KNIUekqqwrfa2S0UTy0RU7nO4mV7YWzbYgpuAKg0LksW0HYNnozxwHlJLwbK07GNgyvDD/FP1HnWeM5QehUnWqIDkoahgqO9KsHpga9miEnObQu9KgQtZj+StWy/T7mmHdLXRLdWRRKueawNZdjxTCLdJWCuDCzF4KKyxkO7nrb5wv234PoRplb1LyEj1mbPi x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0120; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:CS1PR84MB0120;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0120; x-forefront-prvs: 00286C0CA6 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(7916002)(199003)(51914003)(377424004)(53824002)(24454002)(189002)(110136002)(99286002)(5002640100001)(105586002)(189998001)(33656002)(97736004)(2906002)(87936001)(4326007)(93886004)(3660700001)(81166006)(3846002)(6116002)(81156014)(102836003)(86362001)(586003)(50986999)(54356999)(76176999)(3280700002)(101416001)(8676002)(10400500002)(106116001)(77096005)(7846002)(7736002)(66066001)(74316002)(92566002)(305945005)(2900100001)(2950100001)(8936002)(122556002)(7696003)(9686002)(106356001)(68736007);DIR:OUT;SFP:1102;SCL:1;SRVR:CS1PR84MB0120;H:CS1PR84MB0119.NAMPRD84.PROD.OUTLOOK.COM;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; received-spf: None (protection.outlook.com: hpe.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: hpe.com X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Aug 2016 12:30:18.1864 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0120 X-Barracuda-Connect: mail-sn1nam01on0117.outbound.protection.outlook.com[104.47.32.117] X-Barracuda-Start-Time: 1470659422 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4987 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Jan Kara wrote on 2016-08-08: > On Fri 05-08-16 19:58:33, Boylston, Brian wrote: >> Dave Chinner wrote on 2016-08-05: >>> [ cut to just the important points ] >>> On Thu, Aug 04, 2016 at 06:40:42PM +0000, Kani, Toshimitsu wrote: >>>> On Tue, 2016-08-02 at 10:21 +1000, Dave Chinner wrote: >>>>> If I drop the fsync from the >>>>> buffered IO path, bandwidth remains the same but runtime drops to >>>>> 0.55-0.57s, so again the buffered IO write path is faster than DAX >>>>> while doing more work. >>>>=20 >>>> I do not think the test results are relevant on this point because bot= h >>>> buffered and dax write() paths use uncached copy to avoid clflush. =A0= The >>>> buffered path uses cached copy to the page cache and then use uncached= copy to >>>> PMEM via writeback. =A0Therefore, the buffered IO path also benefits f= rom using >>>> uncached copy to avoid clflush. >>>=20 >>> Except that I tested without the writeback path for buffered IO, so >>> there was a direct comparison for single cached copy vs single >>> uncached copy. >>>=20 >>> The undenial fact is that a write() with a single cached copy with >>> all the overhead of dirty page tracking is /faster/ than a much >>> shorter, simpler IO path that uses an uncached copy. That's what the >>> numbers say.... >>>=20 >>>> Cached copy (req movq) is slightly faster than uncached copy, >>>=20 >>> Not according to Boaz - he claims that uncached is 20% faster than >>> cached. How about you two get together, do some benchmarking and get >>> your story straight, eh? >>>=20 >>>> and should be >>>> used for writing to the page cache. =A0For writing to PMEM, however, a= dditional >>>> clflush can be expensive, and allocating cachelines for PMEM leads to = evict >>>> application's cachelines. >>>=20 >>> I keep hearing people tell me why cached copies are slower, but >>> no-one is providing numbers to back up their statements. The only >>> numbers we have are the ones I've published showing cached copies w/ >>> full dirty tracking is faster than uncached copy w/o dirty tracking. >>>=20 >>> Show me the numbers that back up your statements, then I'll listen >>> to you. >>=20 >> Here are some numbers for a particular scenario, and the code is below. >>=20 >> Time (in seconds) to copy a 16KiB buffer 1M times to a 4MiB NVDIMM buffe= r >> (1M total memcpy()s). For the cached+clflush case, the flushes are done >> every 4MiB (which seems slightly faster than flushing every 16KiB): >>=20 >> NUMA local NUMA remote >> Cached+clflush 13.5 37.1 >> movnt 1.0 1.3 >=20 > Thanks for the test Brian. But looking at the current source of libpmem > this seems to be comparing apples to oranges. Let me explain the details > below: >=20 >> In the code below, pmem_persist() does the CLFLUSH(es) on the given rang= e, >> and pmem_memcpy_persist() does non-temporal MOVs with an SFENCE: >=20 > Yes. libpmem does what you describe above and the name > pmem_memcpy_persist() is thus currently misleading because it is not > guaranteed to be persistent with the current implementation of DAX in > the kernel. >=20 > It is important to know which kernel version and what filesystem have you > used for the test to be able judge the details but generally pmem_persist= () > does properly tell the filesystem to flush all metadata associated with t= he > file, commit open transactions etc. That's the full cost of persistence. I used NVML 1.1 for the measurements. In this version and with the hardwar= e that I used, the pmem_persist() flow is: pmem_persist() pmem_flush() Func_flush() =3D=3D flush_clflush CLFLUSH pmem_drain() Func_predrain_fence() =3D=3D predrain_fence_empty no-op So, I don't think that pmem_persist() does anything to cause the filesystem to flush metadata as it doesn't make any system calls? > pmem_memcpy_persist() makes sure the data writes have reached persistent > storage but nothing guarantees associated metadata changes have reached > persistent storage as well. While metadata is certainly important, my goal with this specific test was to measure the "raw" performance of cached+flush vs uncached, without anything else in the way. > To assure that, fsync() (or pmem_persist() > if you wish) is currently the only way from userspace. Perhaps you mean pmem_msync() here? pmem_msync() calls msync(), but pmem_persist() does not. > At which point > you've lost most of the advantages using movnt. Ross researches into > possibilities of allowing more efficient userspace implementation but > currently there are none. Apart from the current performance discussion, if the metadata for a file is already established (file created, space allocated by explicit writes(), and everything synced), then if I map it and do pmem_memcpy_persist(), are there any "ongoing" metadata updates that would need to be flushed (besides timestamps)? Brian From BATV+968ece990c153ae608a0+4733+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 8 08:11:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 57BF47CE0 for ; Mon, 8 Aug 2016 08:11:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1BA7F304048 for ; Mon, 8 Aug 2016 06:11:32 -0700 (PDT) X-ASG-Debug-ID: 1470661889-0bf57c1367456af0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id f7THd41FO8Rt1TAI (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 08 Aug 2016 06:11:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+968ece990c153ae608a0+4733+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bWkL0-0006ff-T8; Mon, 08 Aug 2016 13:11:26 +0000 Date: Mon, 8 Aug 2016 06:11:26 -0700 From: Christoph Hellwig To: "Boylston, Brian" Cc: Jan Kara , Dave Chinner , "Kani, Toshimitsu" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Ross Zwisler Subject: Re: Subtle races between DAX mmap fault and write path Message-ID: <20160808131126.GA14464@infradead.org> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path References: <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> <20160808092655.GA29128@quack2.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470661890 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1105 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 08, 2016 at 12:30:18PM +0000, Boylston, Brian wrote: > I used NVML 1.1 for the measurements. In this version and with the hardware > that I used, the pmem_persist() flow is: Please don't use crap like NVML, given that the people behind it don't seem to understand persistency at all. > Perhaps you mean pmem_msync() here? pmem_msync() calls msync(), but > pmem_persist() does not. pmem_persist is misnamed then, don't use it. > > At which point > > you've lost most of the advantages using movnt. Ross researches into > > possibilities of allowing more efficient userspace implementation but > > currently there are none. > > Apart from the current performance discussion, if the metadata for a file > is already established (file created, space allocated by explicit writes(), > and everything synced), then if I map it and do pmem_memcpy_persist(), > are there any "ongoing" metadata updates that would need to be flushed > (besides timestamps)? Yes. For example because every write might mean a new space allocating if using reflinks or a COW file system. From eflorac@intellique.com Mon Aug 8 09:11:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1333C7CE2 for ; Mon, 8 Aug 2016 09:11:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8AFE4AC002 for ; Mon, 8 Aug 2016 07:11:32 -0700 (PDT) X-ASG-Debug-ID: 1470665489-0bf57b369c4ca000001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id kAhe7eoqTInxGr1T (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 07:11:29 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Effective-Source-IP: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id CF267547CE1; Mon, 8 Aug 2016 10:11:28 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id 46DA3547CF5; Mon, 8 Aug 2016 10:11:28 -0400 (EDT) Date: Mon, 8 Aug 2016 16:11:32 +0200 From: Emmanuel Florac To: Steve Brooks Cc: xfs@oss.sgi.com Subject: Re: Advice needed with file system corruption Message-ID: <20160808161132.1d76eb5c@harpe.intellique.com> X-ASG-Orig-Subj: Re: Advice needed with file system corruption In-Reply-To: <5787852A.7030900@st-andrews.ac.uk> References: <5787852A.7030900@st-andrews.ac.uk> Organization: Intellique X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1470665489 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1083 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31839 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email Le Thu, 14 Jul 2016 13:27:22 +0100 Steve Brooks =C3=A9crivait: > We have a RAID system with file system issues as follows, >=20 > 50 TB in RAID 6 hosted on an Adaptec 71605 controller using > WD4000FYYZ drives. >=20 > Centos 6.7 2.6.32-642.el6.x86_64 : xfsprogs-3.1.1-16.el6 >=20 > While rebuilding a replaced disk, with the file system online and in=20 > use, the system logs showed multiple entries of; >=20 > XFS (sde): Corruption detected. Unmount and run xfs_repair. >=20 Late to the game, I just wanted to remark that I've unfortunately verified many times that write activity during rebuilds on Adaptec RAID controllers often creates corruption. I've reported that to Adaptec, but they don't seem to care much... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From roger@filmlight.ltd.uk Mon Aug 8 10:38:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 221927CE4 for ; Mon, 8 Aug 2016 10:38:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB6598F8033 for ; Mon, 8 Aug 2016 08:38:16 -0700 (PDT) X-ASG-Debug-ID: 1470670692-0bf8157e6b589e70001-NocioJ Received: from c.mx.filmlight.ltd.uk (c.mx.filmlight.ltd.uk [54.76.112.217]) by cuda.sgi.com with ESMTP id qA507KpUiTFLSC1D for ; Mon, 08 Aug 2016 08:38:13 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Effective-Source-IP: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Apparent-Source-IP: 54.76.112.217 Received: from montana.filmlight.ltd.uk (unknown [62.7.83.226]) (Authenticated sender: roger) by omni.filmlight.ltd.uk (Postfix) with ESMTPSA id 12088888140; Mon, 8 Aug 2016 16:38:12 +0100 (BST) Message-ID: <1470670691.8958.11.camel@filmlight.ltd.uk> Subject: Re: Advice needed with file system corruption From: Roger Willcocks X-ASG-Orig-Subj: Re: Advice needed with file system corruption To: Emmanuel Florac Cc: Steve Brooks , xfs@oss.sgi.com Date: Mon, 08 Aug 2016 16:38:11 +0100 In-Reply-To: <20160808161132.1d76eb5c@harpe.intellique.com> References: <5787852A.7030900@st-andrews.ac.uk> <20160808161132.1d76eb5c@harpe.intellique.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.12.11 (3.12.11-15.el7) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: c.mx.filmlight.ltd.uk[54.76.112.217] X-Barracuda-Start-Time: 1470670692 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 948 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31840 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email On Mon, 2016-08-08 at 16:11 +0200, Emmanuel Florac wrote: > Le Thu, 14 Jul 2016 13:27:22 +0100 > Steve Brooks écrivait: > > > We have a RAID system with file system issues as follows, > > > > 50 TB in RAID 6 hosted on an Adaptec 71605 controller using > > WD4000FYYZ drives. > > > > Centos 6.7 2.6.32-642.el6.x86_64 : xfsprogs-3.1.1-16.el6 > > > > While rebuilding a replaced disk, with the file system online and in > > use, the system logs showed multiple entries of; > > > > XFS (sde): Corruption detected. Unmount and run xfs_repair. > > > > Late to the game, I just wanted to remark that I've unfortunately > verified many times that write activity during rebuilds on Adaptec RAID > controllers often creates corruption. I've reported that to Adaptec, > but they don't seem to care much... > It rather depends on why the disk was replaced in the first place... -- Roger From eflorac@intellique.com Mon Aug 8 10:44:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EB3417CE7 for ; Mon, 8 Aug 2016 10:44:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ADA538F8033 for ; Mon, 8 Aug 2016 08:44:26 -0700 (PDT) X-ASG-Debug-ID: 1470671064-0bf57c136a462ca0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id mmORfeVaZRm3FlQZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 08:44:24 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Effective-Source-IP: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id A8D42547C09; Mon, 8 Aug 2016 11:44:23 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id DD5B3547CB6; Mon, 8 Aug 2016 11:44:22 -0400 (EDT) Date: Mon, 8 Aug 2016 17:44:27 +0200 From: Emmanuel Florac To: Roger Willcocks Cc: Steve Brooks , xfs@oss.sgi.com Subject: Re: Advice needed with file system corruption Message-ID: <20160808174427.24d8272c@harpe.intellique.com> X-ASG-Orig-Subj: Re: Advice needed with file system corruption In-Reply-To: <1470670691.8958.11.camel@filmlight.ltd.uk> References: <5787852A.7030900@st-andrews.ac.uk> <20160808161132.1d76eb5c@harpe.intellique.com> <1470670691.8958.11.camel@filmlight.ltd.uk> Organization: Intellique X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1470671064 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1112 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Mon, 08 Aug 2016 16:38:11 +0100 Roger Willcocks =C3=A9crivait: > >=20 > > Late to the game, I just wanted to remark that I've unfortunately > > verified many times that write activity during rebuilds on Adaptec > > RAID controllers often creates corruption. I've reported that to > > Adaptec, but they don't seem to care much... > > =20 >=20 > It rather depends on why the disk was replaced in the first place... Well, given I always use RAID-6, it shouldn't matter; a failed drive shouldn't alter the array behaviour significantly, as it simply falls back to sort-of RAID-5 (any bad block read or write should be corrected on the fly). It seems like explicitly disabling individual disk drives write-back cache somewhat mitigates the effect.=20 --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From sjb14@st-andrews.ac.uk Mon Aug 8 11:18:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B2C2B7CA2 for ; Mon, 8 Aug 2016 11:18:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 845A18F8033 for ; Mon, 8 Aug 2016 09:17:58 -0700 (PDT) X-ASG-Debug-ID: 1470673074-0bf57b369b4d9c00001-NocioJ Received: from mcgraw.st-andrews.ac.uk (mcgraw.st-andrews.ac.uk [138.251.8.95]) by cuda.sgi.com with ESMTP id Cf3orDnIkAcMmvSS (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 08 Aug 2016 09:17:55 -0700 (PDT) X-Barracuda-Envelope-From: sjb14@st-andrews.ac.uk X-Barracuda-Effective-Source-IP: mcgraw.st-andrews.ac.uk[138.251.8.95] X-Barracuda-Apparent-Source-IP: 138.251.8.95 X-StAndrews-MailScanner-From: sjb14@st-and.ac.uk X-StAndrews-MailScanner-SpamCheck: not spam, SpamAssassin (not cached, score=-2.9, required 5, autolearn=not spam, ALL_TRUSTED -1.00, BAYES_00 -1.90) X-StAndrews-MailScanner: No virus detected X-StAndrews-MailScanner-ID: u78GHBbq005186 X-StAndrews-MailScanner-Information: Please contact the ISP for more information Received: from [192.168.10.2] ([82.98.17.134]) (authenticated bits=0) by mcgraw.st-andrews.ac.uk (8.14.9/8.14.9/Debian-4~bpo0+uos) with ESMTP id u78GHBbq005186 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Mon, 8 Aug 2016 16:17:28 GMT Subject: Re: Advice needed with file system corruption To: Emmanuel Florac , Steve Brooks X-ASG-Orig-Subj: Re: Advice needed with file system corruption References: <5787852A.7030900@st-andrews.ac.uk> <20160808161132.1d76eb5c@harpe.intellique.com> Cc: xfs@oss.sgi.com From: Steve Brooks Message-ID: <03277397-8360-3b9a-a163-b7d234310a8e@st-and.ac.uk> Date: Mon, 8 Aug 2016 17:16:05 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160808161132.1d76eb5c@harpe.intellique.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mcgraw.st-andrews.ac.uk[138.251.8.95] X-Barracuda-Start-Time: 1470673075 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1323 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31843 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email Hi, I chose the words "rebuilding a replaced disk" deliberately as I removed a disk that (according to adaptec's software) had some "media errors" even though the SMART attributes showed there were no "pending sectors" or "reallocated sectors", in fact all the SMART attributes were clean. As I was also using "RAID 6" I did not expect any issues leaving the filesystem online while rebuilding. Previous to this the RAID had been running live 24/7 for 0ver three years. Steve On 08/08/2016 15:11, Emmanuel Florac wrote: > Le Thu, 14 Jul 2016 13:27:22 +0100 > Steve Brooks écrivait: > >> We have a RAID system with file system issues as follows, >> >> 50 TB in RAID 6 hosted on an Adaptec 71605 controller using >> WD4000FYYZ drives. >> >> Centos 6.7 2.6.32-642.el6.x86_64 : xfsprogs-3.1.1-16.el6 >> >> While rebuilding a replaced disk, with the file system online and in >> use, the system logs showed multiple entries of; >> >> XFS (sde): Corruption detected. Unmount and run xfs_repair. >> > Late to the game, I just wanted to remark that I've unfortunately > verified many times that write activity during rebuilds on Adaptec RAID > controllers often creates corruption. I've reported that to Adaptec, > but they don't seem to care much... > From darrick.wong@oracle.com Mon Aug 8 12:29:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 71B7D7CA2 for ; Mon, 8 Aug 2016 12:29:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 36C3F8F8033 for ; Mon, 8 Aug 2016 10:29:06 -0700 (PDT) X-ASG-Debug-ID: 1470677343-0bf8157e6c593240001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id bWf4PumQeJCXtB1M (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 10:29:04 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u78HT1VQ018436 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Aug 2016 17:29:02 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u78HT1d4021416 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Aug 2016 17:29:01 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u78HT0Te020852; Mon, 8 Aug 2016 17:29:00 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 08 Aug 2016 10:29:00 -0700 Date: Mon, 8 Aug 2016 10:28:59 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 12/17] reflink: test cross-mountpoint reflink and dedupe Message-ID: <20160808172859.GB11291@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 12/17] reflink: test cross-mountpoint reflink and dedupe References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914485237.11762.2526971565060691741.stgit@birch.djwong.org> <20160808075601.GA27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160808075601.GA27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470677344 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 738 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31846 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 08, 2016 at 03:56:01PM +0800, Eryu Guan wrote: > On Thu, Jul 21, 2016 at 04:47:32PM -0700, Darrick J. Wong wrote: > > Test sharing blocks via reflink and dedupe between two different > > mountpoints of the same filesystem. This shouldn't work, since > > we don't allow cross-mountpoint functions. > > > > Signed-off-by: Darrick J. Wong > > --- > > > + > > +# real QA test starts here > > +_supported_os Linux > > I added "_supported_fs generic" > > > +_require_scratch_reflink > > +_require_cp_reflink > > > + > > +filter_md5() { > > and move "{" to a new line. Also made the same changes to 928 and queued > the patch up. Ok, thx. :) --D > > Thanks, > Eryu From darrick.wong@oracle.com Mon Aug 8 12:41:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4A0CD7CA2 for ; Mon, 8 Aug 2016 12:41:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15826304053 for ; Mon, 8 Aug 2016 10:41:40 -0700 (PDT) X-ASG-Debug-ID: 1470678096-0bf57c1367468da0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id lGShrZ8IPCtI5TsJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 10:41:37 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u78HfY3R002087 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Aug 2016 17:41:35 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u78HfYoF010914 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Aug 2016 17:41:34 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u78HfXP2027021; Mon, 8 Aug 2016 17:41:34 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 08 Aug 2016 10:41:33 -0700 Date: Mon, 8 Aug 2016 10:41:32 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 13/17] xfs: test swapext with reflink Message-ID: <20160808174132.GC11291@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 13/17] xfs: test swapext with reflink References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914485888.11762.1688573359701830686.stgit@birch.djwong.org> <20160808081359.GB27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160808081359.GB27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470678097 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 17131 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 08, 2016 at 04:13:59PM +0800, Eryu Guan wrote: > On Thu, Jul 21, 2016 at 04:47:38PM -0700, Darrick J. Wong wrote: > > Add a few tests to stress the new swapext code for reflink and rmap. > > > > Signed-off-by: Darrick J. Wong > > --- > > tests/xfs/873 | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/873.out | 6 +++ > > tests/xfs/874 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/874.out | 10 +++++ > > tests/xfs/875 | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/875.out | 12 ++++++ > > tests/xfs/group | 3 + > > 7 files changed, 337 insertions(+) > > create mode 100755 tests/xfs/873 > > create mode 100644 tests/xfs/873.out > > create mode 100755 tests/xfs/874 > > create mode 100644 tests/xfs/874.out > > create mode 100755 tests/xfs/875 > > create mode 100644 tests/xfs/875.out > > > > > > diff --git a/tests/xfs/873 b/tests/xfs/873 > > new file mode 100755 > > index 0000000..a980148 > > --- /dev/null > > +++ b/tests/xfs/873 > > @@ -0,0 +1,107 @@ > > +#! /bin/bash > > +# FS QA Test No. 873 > > +# > > +# See how well xfs_fsr handles "defragging" a file with a hojillion extents. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > +. ./common/reflink > > + > > +# real QA test starts here > > +_supported_os Linux > > _supported_fs xfs (next two tests need this as well) > > > +_require_scratch_reflink > > +_require_cp_reflink > > +_require_test_program "punch-alternating" > > +test -x $XFS_FSR_PROG || _notrun "xfs_fsr not found" > > This can be replaced by (applies to next two tests): > > _require_command "$XFS_FSR_PROG" "xfs_fsr" Ok, will fix both of these. > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount >> "$seqres.full" 2>&1 > > + > > +testdir="$SCRATCH_MNT/test-$seq" > > +mkdir "$testdir" > > + > > +# Setup for 16000 blocks, but we'll accept stress testing down to > > +# 2^10 blocks... that should be plenty for anyone. > > +fnr=$((12 + LOAD_FACTOR)) > > +free_blocks=$(stat -f -c '%a' "$testdir") > > +blksz=$(stat -f -c '%S' "$testdir") > > +space_avail=$((free_blocks * blksz)) > > +calc_space() { > > + blocks_needed=$(( 2 ** (fnr + 1) )) > > + space_needed=$((blocks_needed * blksz * 5 / 4)) > > +} > > +calc_space > > +while test $space_needed -gt $space_avail; do > > + fnr=$((fnr - 1)) > > + calc_space > > +done > > +test $fnr -lt 10 && _notrun "Insufficient space for stress test; would only create $blocks_needed extents." > > +bytes=$((blocks_needed * blksz)) > > + > > +echo "Create a many-block file" > > +echo "creating $blocks_needed blocks..." >> "$seqres.full" > > +_pwrite_byte 0x62 0 $blksz $testdir/file0 >> $seqres.full > > +"$XFS_IO_PROG" -f -c "pwrite -S 0x61 -b 4194304 0 $bytes" "$testdir/file1" >> "$seqres.full" > > +echo "punching..." >> "$seqres.full" > > +"$here/src/punch-alternating" "$testdir/file1" >> "$seqres.full" > > +seq 0 2 $((2 ** (fnr + 1) )) | while read lblk; do > > + _reflink_range $testdir/file0 0 $testdir/file1 $((lblk * blksz)) $blksz >> $seqres.full > > +done > > +echo "...done" >> "$seqres.full" > > +_scratch_cycle_mount > > + > > +echo "Reflink the big file" > > +echo "reflinking $((blocks_needed / 2)) blocks, $((bytes / 2)) bytes" >> "$seqres.full" > > +_reflink_range "$testdir/file1" 0 "$testdir/file2" 0 $bytes >> "$seqres.full" > > + > > +echo "Defrag the big file" > > +old_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > > There's a "_count_extents" helper, does that work for this case? It can, though stat -v reports GETFSXATTR results, which should be faster than _count_extents because the latter FIEMAPs the entire file and counts lines. Seeing as XFS records the extent count in the inode, we might as well use it. > > +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full > > +new_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > > + > > +echo "Check extent count" > > +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full > > +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full > > +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full > > +test $old_nextents -gt $new_nextents || echo "FAIL: $old_nextents -> $new_nextents" > > + > > +# success, all done > > +status=0 > > +exit > > And 873 fails the post-test fs check on "-m reflink=1,rmapbt=1" XFS, > test passed if rmapbt=0, just FYI (tested with your djwong-experimental > branch kernel and xfsprogs). Yes, this should be fixed in the -wtf branches. Sorry about that, I should have yelled a little louder about that. The -wtf branch is kind of a mess, but it does have all the latest fixes and the AGF btree block counters that will go into 4.8-rc2. > _check_xfs_filesystem: filesystem on /dev/sda6 is inconsistent > *** xfs_repair -n output *** > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - zero log... > - scan filesystem freespace and inode maps... > sb_fdblocks 3903040, counted 3903229 > - found root inode chunk > Phase 3 - for each AG... > - scan (but don't clear) agi unlinked lists... > - process known inodes and perform inode discovery... > - agno = 0 > - agno = 1 > - agno = 2 > - agno = 3 > - process newly discovered inodes... > Phase 4 - check for duplicate blocks... > - setting up duplicate extent list... > - check for inodes claiming duplicate blocks... > - agno = 0 > - agno = 1 > - agno = 2 > - agno = 3 > No modify flag set, skipping phase 5 > Phase 6 - check inode connectivity... > - traversing filesystem ... > - traversal finished ... > - moving disconnected inodes to lost+found ... > Phase 7 - verify link counts... > No modify flag set, skipping filesystem flush and exiting. > *** end xfs_repair output > > > diff --git a/tests/xfs/873.out b/tests/xfs/873.out > > new file mode 100644 > > index 0000000..9dddf55 > > --- /dev/null > > +++ b/tests/xfs/873.out > > @@ -0,0 +1,6 @@ > > +QA output created by 873 > > +Format and mount > > +Create a many-block file > > +Reflink the big file > > +Defrag the big file > > +Check extent count > > diff --git a/tests/xfs/874 b/tests/xfs/874 > > new file mode 100755 > > index 0000000..fb31ea8 > > --- /dev/null > > +++ b/tests/xfs/874 > > @@ -0,0 +1,99 @@ > > +#! /bin/bash > > +# FS QA Test No. 874 > > +# > > +# Ensure that xfs_fsr handles errors correctly while defragging files. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > +. ./common/reflink > > +. ./common/quota > > Seems this is not needed in this test. > > > +. ./common/inject > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_scratch_reflink > > +_require_cp_reflink > > +test -x $XFS_FSR_PROG || _notrun "xfs_fsr not found" > > +_require_xfs_io_error_injection "bmap_finish_one" > > +_require_xfs_scratch_rmapbt > > + > > +_repquota() { > > + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' > > +} > > Not used & needed. Will remove both. > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount >> "$seqres.full" 2>&1 > > + > > +testdir="$SCRATCH_MNT/test-$seq" > > +blksz=65536 > > +blks=3 > > +mkdir "$testdir" > > + > > +echo "Create a many-block file" > > +_pwrite_byte 0x62 0 $((blksz * blks)) $testdir/file1 >> $seqres.full > > +_pwrite_byte 0x63 0 $blksz $testdir/file2 >> $seqres.full > > +_reflink_range $testdir/file2 0 $testdir/file1 $blksz $blksz >> $seqres.full > > +_scratch_cycle_mount > > +$XFS_IO_PROG -c 'bmap -v' $testdir/file1 >> $seqres.full > > + > > +echo "Inject error" > > +_scratch_inject_error "bmap_finish_one" > > + > > +echo "Defrag the file" > > +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full 2>&1 > > + > > +echo "FS should be shut down, touch will fail" > > +touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch > > + > > +echo "Remount to replay log" | tee /dev/ttyprintk > > +_scratch_inject_logprint >> $seqres.full > > + > > +echo "Check extent count" | tee /dev/ttyprintk > > +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full > > +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full > > +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full > > + > > +echo "FS should be online, touch should succeed" > > +touch $SCRATCH_MNT/goodfs > > +$XFS_IO_PROG -c 'bmap -v' $testdir/file1 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/874.out b/tests/xfs/874.out > > new file mode 100644 > > index 0000000..dbc0f49 > > --- /dev/null > > +++ b/tests/xfs/874.out > > @@ -0,0 +1,10 @@ > > +QA output created by 874 > > +Format and mount > > +Create a many-block file > > +Inject error > > +Defrag the file > > +FS should be shut down, touch will fail > > +touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error > > +Remount to replay log > > +Check extent count > > +FS should be online, touch should succeed > > diff --git a/tests/xfs/875 b/tests/xfs/875 > > new file mode 100755 > > index 0000000..17c28db > > --- /dev/null > > +++ b/tests/xfs/875 > > @@ -0,0 +1,100 @@ > > +#! /bin/bash > > +# FS QA Test No. 875 > > +# > > +# Ensure that xfs_fsr handles quota correctly while defragging files. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > +. ./common/reflink > > +. ./common/quota > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_scratch_reflink > > +_require_cp_reflink > > +test -x $XFS_FSR_PROG || _notrun "xfs_fsr not found" > > +_require_quota > > +_require_nobody > > + > > +_repquota() { > > + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' > > +} > > Helpers starting with "_" are usually from common code, I'd rename it to > something like "do_repquota" and put the open brace to a new line. Ok. > Thanks, > Eryu > > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" > > +_scratch_mount >> "$seqres.full" 2>&1 > > +quotacheck -u -g $SCRATCH_MNT 2> /dev/null > > +quotaon $SCRATCH_MNT 2> /dev/null > > + > > +testdir="$SCRATCH_MNT/test-$seq" > > +blksz=65536 > > +blks=3 > > +mkdir "$testdir" > > + > > +echo "Create a many-block file" > > +touch $testdir/file1 > > +chown nobody $testdir/file1 > > +touch $testdir/file2 > > +chown nobody $testdir/file2 > > +_pwrite_byte 0x62 0 $((blksz * blks)) $testdir/file1 >> $seqres.full > > +_pwrite_byte 0x63 0 $blksz $testdir/file2 >> $seqres.full > > +_reflink_range $testdir/file2 0 $testdir/file1 $blksz $blksz >> $seqres.full > > +_repquota > > +_scratch_cycle_mount > > + > > +echo "Defrag the file" > > +old_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > > +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full > > +new_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > > +_repquota > > + > > +echo "Remount the FS to see if accounting changes" > > +_scratch_cycle_mount > > +_repquota > > + > > +echo "Check extent count" > > +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full > > +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full > > +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full > > +test $old_nextents -gt $new_nextents || echo "FAIL: $old_nextents -> $new_nextents" > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/875.out b/tests/xfs/875.out > > new file mode 100644 > > index 0000000..57653e9 > > --- /dev/null > > +++ b/tests/xfs/875.out > > @@ -0,0 +1,12 @@ > > +QA output created by 875 > > +Format and mount > > +Create a many-block file > > +root -- 0 0 0 4 0 0 > > +nobody -- 256 0 0 2 0 0 > > +Defrag the file > > +root -- 0 0 0 4 0 0 > > +nobody -- 256 0 0 2 0 0 > > +Remount the FS to see if accounting changes > > +root -- 0 0 0 4 0 0 > > +nobody -- 256 0 0 2 0 0 > > +Check extent count > > diff --git a/tests/xfs/group b/tests/xfs/group > > index 5ccf3d6..16f7947 100644 > > --- a/tests/xfs/group > > +++ b/tests/xfs/group > > @@ -306,3 +306,6 @@ > > 325 auto quick clone > > 326 auto quick clone > > 327 auto quick clone > > +873 auto quick clone fsr > > +874 auto quick clone fsr > > +875 auto quick clone fsr quota > > From darrick.wong@oracle.com Mon Aug 8 12:59:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ED9EA7CA1 for ; Mon, 8 Aug 2016 12:59:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 65CA4AC002 for ; Mon, 8 Aug 2016 10:59:48 -0700 (PDT) X-ASG-Debug-ID: 1470679185-0bf57b369d4e2ec0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zecFLhpAH9MfVUPo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 10:59:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u78HxfTr012081 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Aug 2016 17:59:41 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u78HxeqY004065 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Aug 2016 17:59:41 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u78HxT7V030442; Mon, 8 Aug 2016 17:59:40 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 08 Aug 2016 10:59:29 -0700 Date: Mon, 8 Aug 2016 10:59:28 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 14/17] xfs: more rmapbt tests Message-ID: <20160808175928.GD11291@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 14/17] xfs: more rmapbt tests References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914486527.11762.1173224384905616811.stgit@birch.djwong.org> <20160808084814.GC27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160808084814.GC27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1470679185 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9960 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31846 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 08, 2016 at 04:48:14PM +0800, Eryu Guan wrote: > On Thu, Jul 21, 2016 at 04:47:45PM -0700, Darrick J. Wong wrote: > > More tests for the reverse mapping functionality. > > > > Signed-off-by: Darrick J. Wong > > --- > > tests/xfs/876 | 76 +++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/876.out | 4 ++ > > tests/xfs/877 | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/877.out | 10 ++++++ > > tests/xfs/group | 4 ++ > > 5 files changed, 178 insertions(+), 1 deletion(-) > > create mode 100755 tests/xfs/876 > > create mode 100644 tests/xfs/876.out > > create mode 100755 tests/xfs/877 > > create mode 100644 tests/xfs/877.out > > > > > > diff --git a/tests/xfs/876 b/tests/xfs/876 > > new file mode 100755 > > index 0000000..cf73d40 > > --- /dev/null > > +++ b/tests/xfs/876 > > @@ -0,0 +1,76 @@ > > +#! /bin/bash > > +# FS QA Test No. 876 > > +# > > +# Create a big enough rmapbt that we tickle a fdblocks accounting bug. > > This test failed post-test fs check as well > > "sb_fdblocks 3912360, counted 3912522" > > Seems like it's a known bug? (Yes, it should be fixed in the -wtf branch, as noted in a previous reply.) > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > Seems this is not needed. > > > +. ./common/reflink > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_scratch > > +_require_xfs_scratch_rmapbt > > +_require_scratch_reflink > > +_require_test_program "punch-alternating" > > + > > +rm -f "$seqres.full" > > + > > +echo "+ create scratch fs" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > + > > +echo "+ mount fs image" > > +_scratch_mount > > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > > We usually get isize from the output of _filter_mkfs, e.g. > > _scratch_mkfs | _filter_mkfs 2>$tmp.mkfs >/dev/null > . $tmp.mkfs > > Then all mkfs info is set accordingly, including $isize > > But in this test, isize is got but not used. Remove the line? Ok. > > + > > +bt_ptrs=$(( (blksz - 56) / 44 )) > > +bt_recs=$(( (blksz - 56) / 24 )) > > + > > +blocks=$((bt_ptrs * bt_recs + 1)) > > +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) > > +len=$((blocks * blksz)) > > + > > +echo "+ make some files" > > +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/876.out b/tests/xfs/876.out > > new file mode 100644 > > index 0000000..96c1970 > > --- /dev/null > > +++ b/tests/xfs/876.out > > @@ -0,0 +1,4 @@ > > +QA output created by 876 > > ++ create scratch fs > > ++ mount fs image > > ++ make some files > > diff --git a/tests/xfs/877 b/tests/xfs/877 > > new file mode 100755 > > index 0000000..9700263 > > --- /dev/null > > +++ b/tests/xfs/877 > > @@ -0,0 +1,85 @@ > > +#! /bin/bash > > +# FS QA Test No. 877 > > +# > > +# Make sure query_range returns -EINVAL if lowkey > highkey. > > This test failed too, is this expected (again, tested with your > djwong-experimental branck kernel and xfsprogs)? > > [root@dhcp-66-86-11 xfstests]# diff -u tests/xfs/877.out /root/workspace/xfstests/results//xfs_reflink/xfs/877.out.bad > --- tests/xfs/877.out 2016-08-08 16:22:35.151000000 +0800 > +++ /root/workspace/xfstests/results//xfs_reflink/xfs/877.out.bad 2016-08-08 16:23:12.405000000 +0800 > @@ -7,4 +7,3 @@ > Unmount > Try a regular fsmap > Try a bad fsmap > -Error 22 while querying fsmap btree. During the code review of the XFS function that underlies GETFSMAP (query_range), someone suggested that it should return -EINVAL if someone queries start > end rather than simply returning no results, so this is the xfstest to ensure that happens. (It's in the -wtf branch.) > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > Seems this is not needed. > > > + > > +# real QA test starts here > > +_supported_os Linux > > _supported_fs xfs > > > +_require_xfs_scratch_rmapbt > > _require_xfs_io_command commands used in this test? e.g. falloc, fpunch, fcollapse and finsert Ok. > And '_require_command "$XFS_DB_PROG" "xfs_db"' I'm assuming this is a new requirement to declare explicitly that we're going to use xfs_db? All of the existing tests/xfs/ tests assume that XFS_DB_PROG is always set. > > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > +blksz=65536 > > +blocks=16 > > +len=$((blocks * blksz)) > > + > > +echo "Create some files" > > +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > > + > > +echo "Manipulate file" > > +$XFS_IO_PROG -c "fpunch $blksz $blksz" \ > > + -c "fzero $((3 * blksz)) $blksz" \ > > + -c "pwrite -S 0x69 $((5 * blksz)) $blksz" \ > > + -c "fpunch $((7 * blksz)) $blksz" \ > > + -c "fsync" \ > > + -c "pwrite -S 0x70 $((7 * blksz)) $blksz" \ > > + -c "fcollapse $((9 * blksz)) $blksz" \ > > + -c "finsert $((10 * blksz)) $blksz" $SCRATCH_MNT/f1 >> $seqres.full > > + > > +echo "Check file" > > +md5sum $SCRATCH_MNT/f1 | _filter_scratch > > +od -tx1 -Ad -c $SCRATCH_MNT/f1 >> $seqres.full > > + > > +echo "Unmount" > > +_scratch_unmount > > + > > +echo "Try a regular fsmap" > > +$XFS_DB_PROG -c 'fsmap' $SCRATCH_DEV >> $seqres.full > > +$XFS_DB_PROG -c 'fsmap 0 5' $SCRATCH_DEV >> $seqres.full > > + > > +echo "Try a bad fsmap" > > +$XFS_DB_PROG -c 'fsmap 5 4' $SCRATCH_DEV > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/877.out b/tests/xfs/877.out > > new file mode 100644 > > index 0000000..4a2242f > > --- /dev/null > > +++ b/tests/xfs/877.out > > @@ -0,0 +1,10 @@ > > +QA output created by 877 > > +Format and mount > > +Create some files > > +Manipulate file > > +Check file > > +e45c5707fcf6817e914ffb6ce37a0ac7 SCRATCH_MNT/f1 > > +Unmount > > +Try a regular fsmap > > +Try a bad fsmap > > +Error 22 while querying fsmap btree. > > diff --git a/tests/xfs/group b/tests/xfs/group > > index 16f7947..f81f899 100644 > > --- a/tests/xfs/group > > +++ b/tests/xfs/group > > @@ -3,8 +3,8 @@ > > 003 db auto quick > > 004 db auto quick > > 005 auto quick > > -007 auto quota quick > > 006 auto quick mount > > +007 auto quota quick > > This is already fixed in upstream, not needed. Ok. It'll probably fix itself when I rebase. --D > > Thanks, > Eryu > > > 008 rw ioctl auto quick > > 009 rw ioctl auto prealloc quick > > 010 auto quick repair > > @@ -309,3 +309,5 @@ > > 873 auto quick clone fsr > > 874 auto quick clone fsr > > 875 auto quick clone fsr quota > > +876 auto quick rmap clone > > +877 auto quick rmap clone > > From darrick.wong@oracle.com Mon Aug 8 13:03:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D02227CA1 for ; Mon, 8 Aug 2016 13:03:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F1AB304062 for ; Mon, 8 Aug 2016 11:03:36 -0700 (PDT) X-ASG-Debug-ID: 1470679414-0bf57b369d4e3120001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id I55E8dd4HFxJAz11 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 11:03:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u78I3W3Y005648 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Aug 2016 18:03:32 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u78I3W8A018285 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Aug 2016 18:03:32 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u78I3Voa025293; Mon, 8 Aug 2016 18:03:31 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 08 Aug 2016 11:03:31 -0700 Date: Mon, 8 Aug 2016 11:03:30 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 15/17] xfs: scrub fs (if still mounted) at the end of the test Message-ID: <20160808180330.GE11291@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 15/17] xfs: scrub fs (if still mounted) at the end of the test References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914487167.11762.17599617419019795848.stgit@birch.djwong.org> <20160808085239.GD27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160808085239.GD27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470679414 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2664 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31846 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 08, 2016 at 04:52:39PM +0800, Eryu Guan wrote: > On Thu, Jul 21, 2016 at 04:47:51PM -0700, Darrick J. Wong wrote: > > Teach _check_xfs_filesystem to scrub mounted filesystems before > > unmounting and fscking them. This is mostly to test the online > > scrub tool... > > > > Signed-off-by: Darrick J. Wong > > --- > > README | 3 +++ > > common/config | 1 + > > common/rc | 7 +++++++ > > 3 files changed, 11 insertions(+) > > > > > > diff --git a/README b/README > > index 4509cc1..c19fcb1 100644 > > --- a/README > > +++ b/README > > @@ -84,6 +84,9 @@ Preparing system for tests (IRIX and Linux): > > run xfs_repair -n to check the filesystem; xfs_repair to rebuild > > metadata indexes; and xfs_repair -n (a third time) to check the > > results of the rebuilding. > > + - set TEST_XFS_SCRUB=1 to have _check_xfs_filesystem run > > + xfs_scrub -vd to scrub the filesystem metadata online before > > + unmounting to run the offline check. > > Mixed space and tab in above lines, I can fix it at commit time. Ok. Sorry about that, --D > > Thanks, > Eryu > > > > > - or add a case to the switch in common/config assigning > > these variables based on the hostname of your test > > diff --git a/common/config b/common/config > > index 08d5d80..168f46c 100644 > > --- a/common/config > > +++ b/common/config > > @@ -163,6 +163,7 @@ export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" > > export XFS_DB_PROG="`set_prog_path xfs_db`" > > export XFS_GROWFS_PROG=`set_prog_path xfs_growfs` > > export XFS_IO_PROG="`set_prog_path xfs_io`" > > +export XFS_SCRUB_PROG="`set_prog_path xfs_scrub`" > > export XFS_PARALLEL_REPAIR_PROG="`set_prog_path xfs_prepair`" > > export XFS_PARALLEL_REPAIR64_PROG="`set_prog_path xfs_prepair64`" > > export __XFSDUMP_PROG="`set_prog_path xfsdump`" > > diff --git a/common/rc b/common/rc > > index 3b45578..861a721 100644 > > --- a/common/rc > > +++ b/common/rc > > @@ -2391,6 +2391,13 @@ _check_xfs_filesystem() > > > > if [ "$type" = "xfs" ] > > then > > + if [ -n "$TEST_XFS_SCRUB" ] && [ -x "$XFS_SCRUB_PROG" ]; then > > + "$XFS_SCRUB_PROG" $scrubflag -vd $device >>$seqres.full > > + if [ $? -ne 0 ]; then > > + echo "filesystem on $device failed scrub (see $seqres.full)" > > + ok=0 > > + fi > > + fi > > # mounted ... > > mountpoint=`_umount_or_remount_ro $device` > > fi > > From darrick.wong@oracle.com Mon Aug 8 13:18:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9C9F07CA0 for ; Mon, 8 Aug 2016 13:18:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6CCE08F8033 for ; Mon, 8 Aug 2016 11:18:49 -0700 (PDT) X-ASG-Debug-ID: 1470680322-0bf57c136746a2b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id UGAghIw9w93CQDEh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 08 Aug 2016 11:18:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u78IIdLd024869 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 8 Aug 2016 18:18:40 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u78IIdiL027292 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 8 Aug 2016 18:18:39 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u78IIc1A019810; Mon, 8 Aug 2016 18:18:38 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 08 Aug 2016 11:18:37 -0700 Date: Mon, 8 Aug 2016 11:18:36 -0700 From: "Darrick J. Wong" To: Eryu Guan Cc: david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 17/17] xfs: test realtime rmapbt code Message-ID: <20160808181836.GF11291@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 17/17] xfs: test realtime rmapbt code References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914488713.11762.7958985131932985171.stgit@birch.djwong.org> <20160808090800.GE27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160808090800.GE27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1470680323 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 46364 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31847 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 08, 2016 at 05:08:00PM +0800, Eryu Guan wrote: > On Thu, Jul 21, 2016 at 04:48:07PM -0700, Darrick J. Wong wrote: > > Test the realtime rmap btree code by exercising various IO patterns > > on realtime files. > > > > Signed-off-by: Darrick J. Wong > > --- > > tests/xfs/878 | 88 +++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/878.out | 9 ++++ > > tests/xfs/879 | 67 +++++++++++++++++++++++++++++++++ > > tests/xfs/879.out | 7 +++ > > tests/xfs/880 | 86 ++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/880.out | 7 +++ > > tests/xfs/881 | 95 +++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/881.out | 8 ++++ > > tests/xfs/882 | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/882.out | 11 +++++ > > tests/xfs/883 | 89 ++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/883.out | 10 +++++ > > tests/xfs/884 | 91 +++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/884.out | 9 ++++ > > tests/xfs/885 | 94 ++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/885.out | 10 +++++ > > tests/xfs/886 | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/886.out | 7 +++ > > tests/xfs/887 | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/887.out | 7 +++ > > tests/xfs/888 | 76 +++++++++++++++++++++++++++++++++++++ > > tests/xfs/888.out | 6 +++ > > tests/xfs/group | 11 +++++ > > 23 files changed, 1107 insertions(+) > > create mode 100644 tests/xfs/878 > > Need the mode of test file to be 755 D'oh! > > create mode 100644 tests/xfs/878.out > > create mode 100755 tests/xfs/879 > > create mode 100644 tests/xfs/879.out > > create mode 100755 tests/xfs/880 > > create mode 100644 tests/xfs/880.out > > create mode 100755 tests/xfs/881 > > create mode 100644 tests/xfs/881.out > > create mode 100755 tests/xfs/882 > > create mode 100644 tests/xfs/882.out > > create mode 100755 tests/xfs/883 > > create mode 100644 tests/xfs/883.out > > create mode 100755 tests/xfs/884 > > create mode 100644 tests/xfs/884.out > > create mode 100755 tests/xfs/885 > > create mode 100644 tests/xfs/885.out > > create mode 100755 tests/xfs/886 > > create mode 100644 tests/xfs/886.out > > create mode 100755 tests/xfs/887 > > create mode 100644 tests/xfs/887.out > > create mode 100755 tests/xfs/888 > > create mode 100644 tests/xfs/888.out > > > > > > diff --git a/tests/xfs/878 b/tests/xfs/878 > > new file mode 100644 > > index 0000000..b1f2672 > > --- /dev/null > > +++ b/tests/xfs/878 > > @@ -0,0 +1,88 @@ > > +#! /bin/bash > > +# FS QA Test No. 878 > > +# > > +# Set rrmapino to another inode on an non-rt rmap fs and see if repair fixes it. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > _supported_fs xfs (also apply to all tests in this patch) Ok. > > +_require_xfs_scratch_rmapbt > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +SCRATCH_RTDEV= USE_EXTERNAL= _scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > + > > +echo "Create some files" > > +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full > > +echo garbage > $SCRATCH_MNT/f3 > > +ino=$(stat -c '%i' $SCRATCH_MNT/f3) > > +_scratch_unmount > > + > > +echo "Corrupt fs" > > +$XFS_DB_PROG -x -c 'sb 0' -c "write rrmapino $ino" $SCRATCH_DEV >> $seqres.full > > +_scratch_mount > > + > > +echo "Check files" > > +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch > > + > > +echo "Try to create more files" > > +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 > > + > > +echo "Repair fs" > > +_scratch_unmount 2>&1 | _filter_scratch > > I think there's no need to filter unmount. > > > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > > + | tee $tmp.logprint | grep -q "" > > +if [ $? -ne 0 ]; then > > + echo "Dirty log, zeroing..." >> $seqres.full > > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > > +else > > + _scratch_xfs_repair >> $seqres.full 2>&1 > > +fi > > +_scratch_xfs_repair >> $seqres.full 2>&1 > > + > > +echo "Try to create more files (again)" > > +_scratch_mount > > +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/878.out b/tests/xfs/878.out > > new file mode 100644 > > index 0000000..e134506 > > --- /dev/null > > +++ b/tests/xfs/878.out > > @@ -0,0 +1,9 @@ > > +QA output created by 878 > > +Format and mount > > +Create some files > > +Corrupt fs > > +Check files > > +8f27047948255cb84872e2dd7c0bc56d SCRATCH_MNT/f1 > > +Try to create more files > > +Repair fs > > +Try to create more files (again) > > diff --git a/tests/xfs/879 b/tests/xfs/879 > > new file mode 100755 > > index 0000000..0cbaf09 > > --- /dev/null > > +++ b/tests/xfs/879 > > @@ -0,0 +1,67 @@ > > +#! /bin/bash > > +# FS QA Test No. 879 > > +# > > +# Ensure that we can create a few realtime files on a rmapbt filesystem. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > common/attr seems not needed in this test and other tests in this patch. Right. I'll remove them. > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > + > > +echo "Create a few files" > > +$XFS_IO_PROG -f -R -c 'pwrite -S 0x67 0 50000' -c fsync $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c 'pwrite -S 0x67 0 50000' -c fsync $SCRATCH_MNT/f2 >> $seqres.full > > +_scratch_cycle_mount > > + > > +echo "Grab contents" > > +md5sum $SCRATCH_MNT/f1 $SCRATCH_MNT/f2 | _filter_scratch > > + > > +echo "Remove one file" > > +rm -rf $SCRATCH_MNT/f2 > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/879.out b/tests/xfs/879.out > > new file mode 100644 > > index 0000000..9dfe48b > > --- /dev/null > > +++ b/tests/xfs/879.out > > @@ -0,0 +1,7 @@ > > +QA output created by 879 > > +Format and mount > > +Create a few files > > +Grab contents > > +10abe2628d19eb1c2ebe18aad7b14820 SCRATCH_MNT/f1 > > +10abe2628d19eb1c2ebe18aad7b14820 SCRATCH_MNT/f2 > > +Remove one file > > diff --git a/tests/xfs/880 b/tests/xfs/880 > > new file mode 100755 > > index 0000000..2056097 > > --- /dev/null > > +++ b/tests/xfs/880 > > @@ -0,0 +1,86 @@ > > +#! /bin/bash > > +# FS QA Test No. 880 > > +# > > +# Exercise expanding and shrinking the realtime rmap btree. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > +_require_test_program "punch-alternating" > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > > + > > +echo "Create a three-level rtrmapbt" > > +i_ptrs=$(( (isize - 176) / 56 )) > > +bt_ptrs=$(( (blksz - 56) / 56 )) > > +bt_recs=$(( (blksz - 56) / 32 )) > > + > > +blocks=$((i_ptrs * bt_ptrs * bt_recs)) > > +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) > > +rtblksz=$(xfs_info $SCRATCH_MNT | grep '^realtime' | \ > > + sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g') > > Both isize and rtextsz can be got from _filter_mkfs, as I mentioned in > another email. Ok. > > Thanks, > Eryu > > > +len=$((blocks * rtblksz)) > > + > > +echo "Create big file" > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > > + > > +echo "Explode the rtrmapbt" > > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > > +_scratch_cycle_mount > > + > > +echo "Remove half the records" > > +rm -rf $SCRATCH_MNT/f1 > > +_scratch_cycle_mount > > + > > +echo "Remove the rest of the records" > > +rm -rf $SCRATCH_MNT/f2 > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/880.out b/tests/xfs/880.out > > new file mode 100644 > > index 0000000..b87665b > > --- /dev/null > > +++ b/tests/xfs/880.out > > @@ -0,0 +1,7 @@ > > +QA output created by 880 > > +Format and mount > > +Create a three-level rtrmapbt > > +Create big file > > +Explode the rtrmapbt > > +Remove half the records > > +Remove the rest of the records > > diff --git a/tests/xfs/881 b/tests/xfs/881 > > new file mode 100755 > > index 0000000..c7474f5 > > --- /dev/null > > +++ b/tests/xfs/881 > > @@ -0,0 +1,95 @@ > > +#! /bin/bash > > +# FS QA Test No. 881 > > +# > > +# Exercise metadump on realtime rmapbt preservation. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > +_require_test_program "punch-alternating" > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > > + > > +metadump_file=$TEST_DIR/${seq}_metadump > > +rm -rf $metadump_file > > + > > +echo "Create a three-level rtrmapbt" > > +i_ptrs=$(( (isize - 176) / 56 )) > > +bt_ptrs=$(( (blksz - 56) / 56 )) > > +bt_recs=$(( (blksz - 56) / 32 )) > > + > > +blocks=$((i_ptrs * bt_ptrs * bt_recs)) > > +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) > > +rtblksz=$(xfs_info $SCRATCH_MNT | grep '^realtime' | \ > > + sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g') > > +len=$((blocks * rtblksz)) > > + > > +echo "Create big file" > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > > + > > +echo "Explode the rtrmapbt" > > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > > +_scratch_cycle_mount > > + > > +echo "Create metadump file" > > +_scratch_unmount > > +_scratch_metadump $metadump_file > > + > > +# Now restore the obfuscated one back and take a look around > > +echo "Restore metadump" > > +xfs_mdrestore $metadump_file $TEST_DIR/image > > +SCRATCH_DEV=$TEST_DIR/image _scratch_mount > > +SCRATCH_DEV=$TEST_DIR/image _scratch_unmount > > + > > +echo "Check restored fs" > > +_check_generic_filesystem $metadump_file > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/881.out b/tests/xfs/881.out > > new file mode 100644 > > index 0000000..6ad156c > > --- /dev/null > > +++ b/tests/xfs/881.out > > @@ -0,0 +1,8 @@ > > +QA output created by 881 > > +Format and mount > > +Create a three-level rtrmapbt > > +Create big file > > +Explode the rtrmapbt > > +Create metadump file > > +Restore metadump > > +Check restored fs > > diff --git a/tests/xfs/882 b/tests/xfs/882 > > new file mode 100755 > > index 0000000..569a560 > > --- /dev/null > > +++ b/tests/xfs/882 > > @@ -0,0 +1,108 @@ > > +#! /bin/bash > > +# FS QA Test No. 882 > > +# > > +# Corrupt the realtime rmapbt and see how the kernel and xfs_repair deal. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > +_require_test_program "punch-alternating" > > + > > +rm -f "$seqres.full" > > + > > +echo "+ create scratch fs" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > + > > +echo "+ mount fs image" > > +_scratch_mount > > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > > + > > +i_ptrs=$(( (isize - 176) / 56 )) > > +bt_ptrs=$(( (blksz - 56) / 56 )) > > +bt_recs=$(( (blksz - 56) / 32 )) > > + > > +blocks=$((i_ptrs * bt_ptrs * bt_recs + 1)) > > +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) > > +len=$((blocks * blksz)) > > + > > +echo "+ make some files" > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > > +_scratch_unmount > > + > > +echo "+ check fs" > > +_scratch_xfs_repair -n >> $seqres.full 2>&1 || echo "xfs_repair should not fail" > > + > > +echo "+ corrupt image" > > +$XFS_DB_PROG -x -c "sb" -c "addr rrmapino" -c "addr u3.rtrmapbt.ptrs[1]" -c "stack" \ > > + -c "blocktrash -x 4096 -y 4096 -n 8 -3 -z" $SCRATCH_DEV >> $seqres.full 2>&1 > > + > > +echo "+ mount image" > > +_scratch_mount > > + > > +echo "+ copy more" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 1" $SCRATCH_MNT/e3 >> $seqres.full 2>&1 > > +test -s ${SCRATCH_MNT}/f3 && echo "should not be able to copy with busted rtrmap btree" > > +_scratch_unmount > > + > > +echo "+ repair fs" > > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > > + | tee $tmp.logprint | grep -q "" > > +if [ $? -ne 0 ]; then > > + echo "Dirty log, zeroing..." >> $seqres.full > > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > > +else > > + _scratch_xfs_repair >> $seqres.full 2>&1 > > +fi > > +_scratch_xfs_repair >> $seqres.full 2>&1 > > + > > +echo "+ mount image (2)" > > +_scratch_mount > > + > > +echo "+ copy more (2)" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 1" $SCRATCH_MNT/e4 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/882.out b/tests/xfs/882.out > > new file mode 100644 > > index 0000000..5ebe620 > > --- /dev/null > > +++ b/tests/xfs/882.out > > @@ -0,0 +1,11 @@ > > +QA output created by 882 > > ++ create scratch fs > > ++ mount fs image > > ++ make some files > > ++ check fs > > ++ corrupt image > > ++ mount image > > ++ copy more > > ++ repair fs > > ++ mount image (2) > > ++ copy more (2) > > diff --git a/tests/xfs/883 b/tests/xfs/883 > > new file mode 100755 > > index 0000000..403ef35 > > --- /dev/null > > +++ b/tests/xfs/883 > > @@ -0,0 +1,89 @@ > > +#! /bin/bash > > +# FS QA Test No. 883 > > +# > > +# Set rrmapino to zero on an rtrmap fs and see if repair fixes it. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > + > > +echo "Create some files" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full > > +_scratch_unmount > > + > > +echo "Corrupt fs" > > +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rrmapino' -c 'write core.nlinkv2 0' \ > > + -c 'write core.mode 0' -c 'sb 0' -c 'write rrmapino 0' $SCRATCH_DEV >> $seqres.full > > +_scratch_mount >> $seqres.full 2>&1 && echo "mount should have failed" > > + > > +echo "Check files" > > +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch > > + > > +echo "Try to create more files" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 > > +test -e $SCRATCH_MNT/f3 && echo "should not have been able to write f3" > > + > > +echo "Repair fs" > > +_scratch_unmount 2>&1 | _filter_scratch > > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > > + | tee $tmp.logprint | grep -q "" > > +if [ $? -ne 0 ]; then > > + echo "Dirty log, zeroing..." >> $seqres.full > > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > > +else > > + _scratch_xfs_repair >> $seqres.full 2>&1 > > +fi > > +_scratch_xfs_repair >> $seqres.full 2>&1 > > + > > +echo "Try to create more files (again)" > > +_scratch_mount > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/883.out b/tests/xfs/883.out > > new file mode 100644 > > index 0000000..6e75ac1 > > --- /dev/null > > +++ b/tests/xfs/883.out > > @@ -0,0 +1,10 @@ > > +QA output created by 883 > > +Format and mount > > +Create some files > > +Corrupt fs > > +Check files > > +md5sum: SCRATCH_MNT/f1: No such file or directory > > +Try to create more files > > +Repair fs > > +umount: SCRATCH_DEV: not mounted > > +Try to create more files (again) > > diff --git a/tests/xfs/884 b/tests/xfs/884 > > new file mode 100755 > > index 0000000..ad648b8 > > --- /dev/null > > +++ b/tests/xfs/884 > > @@ -0,0 +1,91 @@ > > +#! /bin/bash > > +# FS QA Test No. 884 > > +# > > +# Link rrmapino into the rootdir on an rtrmap fs and see if repair fixes it. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > + > > +echo "Create some files" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full > > +echo garbage > $SCRATCH_MNT/f3 > > +ln $SCRATCH_MNT/f3 $SCRATCH_MNT/f4 > > +_scratch_unmount > > + > > +echo "Corrupt fs" > > +rrmapino=$($XFS_DB_PROG -c 'sb 0' -c 'p rrmapino' $SCRATCH_DEV | awk '{print $3}') > > +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rootino' \ > > + -c "write u3.sfdir3.list[3].inumber.i4 $rrmapino" $SCRATCH_DEV >> $seqres.full > > +_scratch_mount > > + > > +echo "Check files" > > +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch > > + > > +echo "Try to create more files" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 > > + > > +echo "Repair fs" > > +_scratch_unmount 2>&1 | _filter_scratch > > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > > + | tee $tmp.logprint | grep -q "" > > +if [ $? -ne 0 ]; then > > + echo "Dirty log, zeroing..." >> $seqres.full > > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > > +else > > + _scratch_xfs_repair >> $seqres.full 2>&1 > > +fi > > +_scratch_xfs_repair >> $seqres.full 2>&1 > > + > > +echo "Try to create more files (again)" > > +_scratch_mount > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/884.out b/tests/xfs/884.out > > new file mode 100644 > > index 0000000..17a73ef > > --- /dev/null > > +++ b/tests/xfs/884.out > > @@ -0,0 +1,9 @@ > > +QA output created by 884 > > +Format and mount > > +Create some files > > +Corrupt fs > > +Check files > > +8f27047948255cb84872e2dd7c0bc56d SCRATCH_MNT/f1 > > +Try to create more files > > +Repair fs > > +Try to create more files (again) > > diff --git a/tests/xfs/885 b/tests/xfs/885 > > new file mode 100755 > > index 0000000..b5880bd > > --- /dev/null > > +++ b/tests/xfs/885 > > @@ -0,0 +1,94 @@ > > +#! /bin/bash > > +# FS QA Test No. 885 > > +# > > +# Set rrmapino to another inode on an rtrmap fs and see if repair fixes it. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > + > > +echo "Create some files" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full > > +echo garbage > $SCRATCH_MNT/f3 > > +ino=$(stat -c '%i' $SCRATCH_MNT/f3) > > +_scratch_unmount > > + > > +echo "Corrupt fs" > > +rrmapino=$($XFS_DB_PROG -c 'sb 0' -c 'p rrmapino' $SCRATCH_DEV | awk '{print $3}') > > +$XFS_DB_PROG -x -c "inode $rrmapino" -c 'write core.format 2' \ > > + -c 'write core.size 0' -c 'write core.nblocks 0' \ > > + -c 'sb 0' -c 'addr rootino' -c "write u3.sfdir3.list[2].inumber.i4 $rrmapino" \ > > + -c 'sb 0' -c "write rrmapino $ino" $SCRATCH_DEV >> $seqres.full > > +_scratch_mount >> $seqres.full 2>&1 && echo "mount should have failed" > > + > > +echo "Check files" > > +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch > > + > > +echo "Try to create more files" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 > > +test -e $SCRATCH_MNT/f3 && echo "should not have been able to write f3" > > + > > +echo "Repair fs" > > +_scratch_unmount 2>&1 | _filter_scratch > > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > > + | tee $tmp.logprint | grep -q "" > > +if [ $? -ne 0 ]; then > > + echo "Dirty log, zeroing..." >> $seqres.full > > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > > +else > > + _scratch_xfs_repair >> $seqres.full 2>&1 > > +fi > > +_scratch_xfs_repair >> $seqres.full 2>&1 > > + > > +echo "Try to create more files (again)" > > +_scratch_mount > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/885.out b/tests/xfs/885.out > > new file mode 100644 > > index 0000000..df04f79 > > --- /dev/null > > +++ b/tests/xfs/885.out > > @@ -0,0 +1,10 @@ > > +QA output created by 885 > > +Format and mount > > +Create some files > > +Corrupt fs > > +Check files > > +md5sum: SCRATCH_MNT/f1: No such file or directory > > +Try to create more files > > +Repair fs > > +umount: SCRATCH_DEV: not mounted > > +Try to create more files (again) > > diff --git a/tests/xfs/886 b/tests/xfs/886 > > new file mode 100755 > > index 0000000..57edb3d > > --- /dev/null > > +++ b/tests/xfs/886 > > @@ -0,0 +1,104 @@ > > +#! /bin/bash > > +# FS QA Test No. 886 > > +# > > +# Cross-link rrmapino to another inode on an rtrmap fs and see if repair fixes it. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > +_require_test_program "punch-alternating" > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > > + > > +i_ptrs=$(( (isize - 176) / 56 )) > > +bt_recs=$(( (blksz - 56) / 32 )) > > + > > +blocks=$((i_ptrs * bt_recs + 1)) > > +rtblksz=$(xfs_info $SCRATCH_MNT | grep '^realtime' | \ > > + sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g') > > +len=$((blocks * rtblksz)) > > + > > +echo "Create some files" > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > > +echo garbage > $SCRATCH_MNT/f3 > > +ino=$(stat -c '%i' $SCRATCH_MNT/f3) > > +_scratch_unmount > > + > > +echo "Corrupt fs" > > +fsbno=$($XFS_DB_PROG -c "inode $ino" -c 'bmap' $SCRATCH_DEV | \ > > + sed -e 's/^.*startblock \([0-9]*\) .*$/\1/g') > > + > > +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rrmapino' -c "write u3.rtrmapbt.ptrs[1] $fsbno" \ > > + -c 'p' $SCRATCH_DEV >> $seqres.full > > +_scratch_mount > > + > > +echo "Try to create more files" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 > > +test -e $SCRATCH_MNT/f5 && echo "should not have been able to write f5" > > + > > +echo "Repair fs" > > +_scratch_unmount 2>&1 | _filter_scratch > > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > > + | tee $tmp.logprint | grep -q "" > > +if [ $? -ne 0 ]; then > > + echo "Dirty log, zeroing..." >> $seqres.full > > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > > +else > > + _scratch_xfs_repair >> $seqres.full 2>&1 > > +fi > > +_scratch_xfs_repair >> $seqres.full 2>&1 > > + > > +echo "Try to create more files (again)" > > +_scratch_mount > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/886.out b/tests/xfs/886.out > > new file mode 100644 > > index 0000000..7f00c5d > > --- /dev/null > > +++ b/tests/xfs/886.out > > @@ -0,0 +1,7 @@ > > +QA output created by 886 > > +Format and mount > > +Create some files > > +Corrupt fs > > +Try to create more files > > +Repair fs > > +Try to create more files (again) > > diff --git a/tests/xfs/887 b/tests/xfs/887 > > new file mode 100755 > > index 0000000..cdf2707 > > --- /dev/null > > +++ b/tests/xfs/887 > > @@ -0,0 +1,107 @@ > > +#! /bin/bash > > +# FS QA Test No. 887 > > +# > > +# Cross-link rrmapino to another inode on an rtrmap fs and see if repair fixes it. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > +_require_test_program "punch-alternating" > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > +blksz="$(stat -f $SCRATCH_MNT -c '%S')" > > +isize=$(xfs_info $SCRATCH_MNT | grep isize | sed -e 's/^.*isize=\([0-9]*\).*$/\1/g') > > + > > +i_ptrs=$(( (isize - 176) / 56 )) > > +bt_recs=$(( (blksz - 56) / 32 )) > > + > > +blocks=$((i_ptrs * bt_recs + 1)) > > +rtblksz=$(xfs_info $SCRATCH_MNT | grep '^realtime' | \ > > + sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g') > > +len=$((blocks * rtblksz)) > > + > > +echo "Create some files" > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full > > +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" > > +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" > > +echo garbage > $SCRATCH_MNT/f3 > > +ino=$(stat -c '%i' $SCRATCH_MNT/f3) > > +_scratch_unmount > > + > > +echo "Corrupt fs" > > +$XFS_DB_PROG -c 'sb 0' -c 'addr rrmapino' -c 'p u3.rtrmapbt.ptrs[1]' $SCRATCH_DEV >> $seqres.full > > + > > +fsbno=$($XFS_DB_PROG -c 'sb 0' -c 'addr rrmapino' -c 'p u3.rtrmapbt.ptrs[1]' \ > > + $SCRATCH_DEV | sed -e 's/^.*://g') > > +$XFS_DB_PROG -x -c "inode $ino" -c "write u3.bmx[0].startblock $fsbno" \ > > + $SCRATCH_DEV >> $seqres.full > > +_scratch_mount > > + > > +od -tx1 -Ad -c $SCRATCH_MNT/f3 >> $seqres.full > > + > > +echo "Try to create more files" > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 > > +test ! -e $SCRATCH_MNT/f5 && echo "should have been able to write f5" > > + > > +echo "Repair fs" > > +_scratch_unmount 2>&1 | _filter_scratch > > +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > > + | tee $tmp.logprint | grep -q "" > > +if [ $? -ne 0 ]; then > > + echo "Dirty log, zeroing..." >> $seqres.full > > + _scratch_xfs_repair -L >> $seqres.full 2>&1 > > +else > > + _scratch_xfs_repair >> $seqres.full 2>&1 > > +fi > > +_scratch_xfs_repair >> $seqres.full 2>&1 > > + > > +echo "Try to create more files (again)" > > +_scratch_mount > > +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/887.out b/tests/xfs/887.out > > new file mode 100644 > > index 0000000..30cf032 > > --- /dev/null > > +++ b/tests/xfs/887.out > > @@ -0,0 +1,7 @@ > > +QA output created by 887 > > +Format and mount > > +Create some files > > +Corrupt fs > > +Try to create more files > > +Repair fs > > +Try to create more files (again) > > diff --git a/tests/xfs/888 b/tests/xfs/888 > > new file mode 100755 > > index 0000000..15bec80 > > --- /dev/null > > +++ b/tests/xfs/888 > > @@ -0,0 +1,76 @@ > > +#! /bin/bash > > +# FS QA Test No. 888 > > +# > > +# Basic rmap manipulation tests for realtime files. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > + > > +seq=`basename "$0"` > > +seqres="$RESULT_DIR/$seq" > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -rf "$tmp".* $metadump_file > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > +. ./common/attr > > + > > +# real QA test starts here > > +_supported_os Linux > > +_require_realtime > > +_require_xfs_scratch_rmapbt > > + > > +rm -f "$seqres.full" > > + > > +echo "Format and mount" > > +_scratch_mkfs > "$seqres.full" 2>&1 > > +_scratch_mount > > +blksz=65536 > > +blocks=16 > > +len=$((blocks * blksz)) > > + > > +echo "Create some files" > > +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full > > + > > +echo "Manipulate file" > > +$XFS_IO_PROG -c "fpunch $blksz $blksz" \ > > + -c "fzero $((3 * blksz)) $blksz" \ > > + -c "pwrite -S 0x69 $((5 * blksz)) $blksz" \ > > + -c "fpunch $((7 * blksz)) $blksz" \ > > + -c "fsync" \ > > + -c "pwrite -S 0x70 $((7 * blksz)) $blksz" \ > > + -c "fcollapse $((9 * blksz)) $blksz" \ > > + -c "finsert $((10 * blksz)) $blksz" $SCRATCH_MNT/f1 >> $seqres.full > > + > > +echo "Check file" > > +md5sum $SCRATCH_MNT/f1 | _filter_scratch > > +od -tx1 -Ad -c $SCRATCH_MNT/f1 >> $seqres.full > > + > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/888.out b/tests/xfs/888.out > > new file mode 100644 > > index 0000000..2587697 > > --- /dev/null > > +++ b/tests/xfs/888.out > > @@ -0,0 +1,6 @@ > > +QA output created by 888 > > +Format and mount > > +Create some files > > +Manipulate file > > +Check file > > +e45c5707fcf6817e914ffb6ce37a0ac7 SCRATCH_MNT/f1 > > diff --git a/tests/xfs/group b/tests/xfs/group > > index f81f899..6fa2eb6 100644 > > --- a/tests/xfs/group > > +++ b/tests/xfs/group > > @@ -311,3 +311,14 @@ > > 875 auto quick clone fsr quota > > 876 auto quick rmap clone > > 877 auto quick rmap clone > > +878 auto quick rmap > > +879 auto quick rmap > > +880 auto quick rmap > > +881 auto quick rmap > > +882 fuzzers rmap > > +883 auto quick rmap > > +884 auto quick rmap > > +885 auto quick rmap > > +886 auto quick rmap > > +887 auto quick rmap > > +888 auto quick rmap > > From jack@suse.cz Mon Aug 8 13:29:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2BE637CA1 for ; Mon, 8 Aug 2016 13:29:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F083C304048 for ; Mon, 8 Aug 2016 11:29:33 -0700 (PDT) X-ASG-Debug-ID: 1470680970-0bf57c136846abd0001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id DdBdqMKK8zFlTcYm (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 08 Aug 2016 11:29:31 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A7677ABE0; Mon, 8 Aug 2016 18:28:28 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 5E1AA1E0F40; Mon, 8 Aug 2016 20:28:27 +0200 (CEST) Date: Mon, 8 Aug 2016 20:28:27 +0200 From: Jan Kara To: "Boylston, Brian" Cc: Jan Kara , Dave Chinner , "Kani, Toshimitsu" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Ross Zwisler Subject: Re: Subtle races between DAX mmap fault and write path Message-ID: <20160808182827.GI29128@quack2.suse.cz> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path References: <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> <20160808092655.GA29128@quack2.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470680971 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5398 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31847 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon 08-08-16 12:30:18, Boylston, Brian wrote: > Jan Kara wrote on 2016-08-08: > > On Fri 05-08-16 19:58:33, Boylston, Brian wrote: > >> Dave Chinner wrote on 2016-08-05: > >>> [ cut to just the important points ] > >>> On Thu, Aug 04, 2016 at 06:40:42PM +0000, Kani, Toshimitsu wrote: > >>>> On Tue, 2016-08-02 at 10:21 +1000, Dave Chinner wrote: > >>>>> If I drop the fsync from the > >>>>> buffered IO path, bandwidth remains the same but runtime drops to > >>>>> 0.55-0.57s, so again the buffered IO write path is faster than DAX > >>>>> while doing more work. > >>>> > >>>> I do not think the test results are relevant on this point because both > >>>> buffered and dax write() paths use uncached copy to avoid clflush.  The > >>>> buffered path uses cached copy to the page cache and then use uncached copy to > >>>> PMEM via writeback.  Therefore, the buffered IO path also benefits from using > >>>> uncached copy to avoid clflush. > >>> > >>> Except that I tested without the writeback path for buffered IO, so > >>> there was a direct comparison for single cached copy vs single > >>> uncached copy. > >>> > >>> The undenial fact is that a write() with a single cached copy with > >>> all the overhead of dirty page tracking is /faster/ than a much > >>> shorter, simpler IO path that uses an uncached copy. That's what the > >>> numbers say.... > >>> > >>>> Cached copy (req movq) is slightly faster than uncached copy, > >>> > >>> Not according to Boaz - he claims that uncached is 20% faster than > >>> cached. How about you two get together, do some benchmarking and get > >>> your story straight, eh? > >>> > >>>> and should be > >>>> used for writing to the page cache.  For writing to PMEM, however, additional > >>>> clflush can be expensive, and allocating cachelines for PMEM leads to evict > >>>> application's cachelines. > >>> > >>> I keep hearing people tell me why cached copies are slower, but > >>> no-one is providing numbers to back up their statements. The only > >>> numbers we have are the ones I've published showing cached copies w/ > >>> full dirty tracking is faster than uncached copy w/o dirty tracking. > >>> > >>> Show me the numbers that back up your statements, then I'll listen > >>> to you. > >> > >> Here are some numbers for a particular scenario, and the code is below. > >> > >> Time (in seconds) to copy a 16KiB buffer 1M times to a 4MiB NVDIMM buffer > >> (1M total memcpy()s). For the cached+clflush case, the flushes are done > >> every 4MiB (which seems slightly faster than flushing every 16KiB): > >> > >> NUMA local NUMA remote > >> Cached+clflush 13.5 37.1 > >> movnt 1.0 1.3 > > > > Thanks for the test Brian. But looking at the current source of libpmem > > this seems to be comparing apples to oranges. Let me explain the details > > below: > > > >> In the code below, pmem_persist() does the CLFLUSH(es) on the given range, > >> and pmem_memcpy_persist() does non-temporal MOVs with an SFENCE: > > > > Yes. libpmem does what you describe above and the name > > pmem_memcpy_persist() is thus currently misleading because it is not > > guaranteed to be persistent with the current implementation of DAX in > > the kernel. > > > > It is important to know which kernel version and what filesystem have you > > used for the test to be able judge the details but generally pmem_persist() > > does properly tell the filesystem to flush all metadata associated with the > > file, commit open transactions etc. That's the full cost of persistence. > > I used NVML 1.1 for the measurements. In this version and with the hardware > that I used, the pmem_persist() flow is: > > pmem_persist() > pmem_flush() > Func_flush() == flush_clflush > CLFLUSH > pmem_drain() > Func_predrain_fence() == predrain_fence_empty > no-op > > So, I don't think that pmem_persist() does anything to cause the filesystem > to flush metadata as it doesn't make any system calls? Ah, you are right. I somehow misread what is in NVML sources. I agree with Christoph that _persist suffix is then misleading for the reasons he stated but that's irrelevant to the test you did. So it indeed seems that in your test movnt + sfence is an order of magnitude faster than cached memcpy + cflush + sfence. I'm surprised I have to say. > > At which point > > you've lost most of the advantages using movnt. Ross researches into > > possibilities of allowing more efficient userspace implementation but > > currently there are none. > > Apart from the current performance discussion, if the metadata for a file > is already established (file created, space allocated by explicit writes(), > and everything synced), then if I map it and do pmem_memcpy_persist(), > are there any "ongoing" metadata updates that would need to be flushed > (besides timestamps)? As Christoph wrote, currently there is no way for userspace to know and filesystem may be doing all sorts of interesting stuff underneath that userspace doesn't know about. The only obligation filesystem has is that in response to fsync() it has to make sure all the data written before fsync() is visible after a crash... Honza -- Jan Kara SUSE Labs, CR From toshi.kani@hpe.com Mon Aug 8 14:32:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 20A7B7CA0 for ; Mon, 8 Aug 2016 14:32:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7D2C7AC002 for ; Mon, 8 Aug 2016 12:32:52 -0700 (PDT) X-ASG-Debug-ID: 1470684769-0bf57c136746da70001-NocioJ Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0123.outbound.protection.outlook.com [104.47.41.123]) by cuda.sgi.com with ESMTP id FGGToZFUEx05Ya6l (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 08 Aug 2016 12:32:50 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Effective-Source-IP: mail-dm3nam03on0123.outbound.protection.outlook.com[104.47.41.123] X-Barracuda-Apparent-Source-IP: 104.47.41.123 Received: from CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.11) by CS1PR84MB0118.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Mon, 8 Aug 2016 19:32:48 +0000 Received: from CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.11]) by CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.11]) with mapi id 15.01.0549.025; Mon, 8 Aug 2016 19:32:47 +0000 From: "Kani, Toshimitsu" To: Jan Kara , "Boylston, Brian" CC: Dave Chinner , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Ross Zwisler Subject: RE: Subtle races between DAX mmap fault and write path Thread-Topic: Subtle races between DAX mmap fault and write path X-ASG-Orig-Subj: RE: Subtle races between DAX mmap fault and write path Thread-Index: AQHR5/+GKX9GoZT7i02Vp4UF+8RxL6AsxqeAgAATU4CAAKUNgIABMOkAgADPd4CAAJ7PgIADzJCAgADs7QCABFeAgIABGYyAgACOv4CABAaEgIAAMz0AgABkEYCAAAtr8A== Date: Mon, 8 Aug 2016 19:32:47 +0000 Message-ID: References: <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> <20160808092655.GA29128@quack2.suse.cz> <20160808182827.GI29128@quack2.suse.cz> In-Reply-To: <20160808182827.GI29128@quack2.suse.cz> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=toshi.kani@hpe.com; x-originating-ip: [15.219.163.1] x-ms-office365-filtering-correlation-id: 457aeeca-aeaa-4783-0a58-08d3bfc2c74b x-microsoft-exchange-diagnostics: 1;CS1PR84MB0118;6:eGRS+7ZBqB2OdiIS3QpSKtbnYmHeYhkbnEm0QpsX4bpd9DyqujCIsT8WvbKm6WktBevCZnDCq23nZ92+O7PxeObjmr+89gf+rvGH0lU7qrd+XucEwvNtAeweh//QY6bFMoNUBW2yaGkkAjm2UzEEWYXXIj6nhm4OOgm3c1V0M3ZyxMIzNlsDJQjWpbCL/DvUw26YF/8rrO8CdreZBl1EfdWviSx9MeoDs1cpzuEoaumi2nH7id77cjqsdrijrDuta3nAtIp9zcmKeNfLk3o3DgPIsp6+ll3IKC+W/ULnQBMIo2XyaPm6GASamlnYPBgVppLQhEezywgOgMilW5QIXQ==;5:ZPq3sC4dai5f8fEH+l/QZ3QV2t/px/qZzKQxGRt6tg3OsceMSPoeaVpbuc5tfsu5oafrl4zTiX6rxinpNAy3NUnrbOqXJhmOSEAKqOUcNDPg6ofhKk4XUiRa+KHtR6rSVLEAVnLmlLUJu4E0RL9yfQ==;24:0lN89nQW6p4imLA+UN19jD2eJ1uJ9vwaNKtk/XmZrYzflN46tIQH0fHhf2Suy1YCG4UuCMt/yrj2Hm/IL3bVAstQtNnQWhjdjMZNUQomXp0=;7:R56K9Lk7eWghexREdS6H0PetUUrOH1txu0mD592/19W5tdIVPbaePfU/86DblVxuOXl86P+sG0sdoUcsb+y72HfU3AyPAIQuHslK7PQH1g/j8v0wfktozIeFCKh6fupHdUPgO6mkdD0okHN9KXQ5AAOzXEOxJAAU4QOAdtdoE6T5DTtGyh2wbt9nmWLZIrCnHFQpb282ePPj+5JBtwdgVPUaPZj/+rY58M7cqGFcYhpykHkbfHBK+JBgWeIHxL1R x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0118; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026);SRVR:CS1PR84MB0118;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0118; x-forefront-prvs: 00286C0CA6 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(7916002)(377424004)(199003)(189002)(24454002)(77096005)(5001770100001)(189998001)(93886004)(2900100001)(33656002)(105586002)(122556002)(5002640100001)(10400500002)(50986999)(106116001)(97736004)(106356001)(99286002)(101416001)(2950100001)(54356999)(76176999)(586003)(81156014)(4326007)(2906002)(86362001)(87936001)(81166006)(8676002)(92566002)(66066001)(6116002)(102836003)(7846002)(305945005)(3846002)(3280700002)(9686002)(74316002)(8936002)(3660700001)(68736007)(7696003)(7736002);DIR:OUT;SFP:1102;SCL:1;SRVR:CS1PR84MB0118;H:CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; received-spf: None (protection.outlook.com: hpe.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: hpe.com X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Aug 2016 19:32:47.6325 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0118 X-Barracuda-Connect: mail-dm3nam03on0123.outbound.protection.outlook.com[104.47.41.123] X-Barracuda-Start-Time: 1470684770 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1354 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31848 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header > > Jan Kara wrote on 2016-08-08: > > > On Fri 05-08-16 19:58:33, Boylston, Brian wrote: > > > > I used NVML 1.1 for the measurements. In this version and with the > > hardware that I used, the pmem_persist() flow is: > > > > pmem_persist() > > pmem_flush() > > Func_flush() =3D=3D flush_clflush > > CLFLUSH > > pmem_drain() > > Func_predrain_fence() =3D=3D predrain_fence_empty > > no-op > > > > So, I don't think that pmem_persist() does anything to cause the filesy= stem > > to flush metadata as it doesn't make any system calls? >=20 > Ah, you are right. I somehow misread what is in NVML sources. I agree wit= h > Christoph that _persist suffix is then misleading for the reasons he stat= ed > but that's irrelevant to the test you did. >=20 > So it indeed seems that in your test movnt + sfence is an order of > magnitude faster than cached memcpy + cflush + sfence. I'm surprised I ha= ve > to say. movnt is posted to WC buffer, which is asynchronously evicted to memory when each line is filled. clflush, on the other hand, must be serialized. So, it has to synchronousl= y evict line-by-line. clflushopt, when supported by new CPUs, should be a lot fast= er as it can execute simultaneously and does not have to wait line-by-line. It'd= be still slower than uncached copy, though.=20 -Toshi=20 From david@fromorbit.com Mon Aug 8 17:40:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 327A57CA0 for ; Mon, 8 Aug 2016 17:40:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F41898F8040 for ; Mon, 8 Aug 2016 15:40:16 -0700 (PDT) X-ASG-Debug-ID: 1470696013-0bf57c136a4768b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id mD1qOnxomW0Hr12O for ; Mon, 08 Aug 2016 15:40:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CCDACLCalXIAI1LHldg0WBUoZynR0BAQEBAQEGjGKGD4QMhhcEAgKBQj0QAQEBAQEBAQYBAQEBAQE3AUCEXwEFOhwjEAgDGAklDwUlAwcaE4gwwxABAQEHAgEkHoVEhRWHbIISHQWZOY8AgV8WjViGZIVQg3g1hCsqMoZ2AQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Aug 2016 08:10:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bWtDP-0003EW-9h; Tue, 09 Aug 2016 08:40:11 +1000 Date: Tue, 9 Aug 2016 08:40:11 +1000 From: Dave Chinner To: Carlos Eduardo Maiolino Cc: Carlos Maiolino , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Document error handling behavior Message-ID: <20160808224011.GC19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: Document error handling behavior References: <1468922657-3895-1-git-send-email-cmaiolino@redhat.com> <20160722040955.GB16413@zlang.usersys.redhat.com> <20160722085804.GA2990@redhat.com> <907731470.210439.1470653835697.JavaMail.zimbra@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <907731470.210439.1470653835697.JavaMail.zimbra@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470696013 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 516 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 08, 2016 at 06:57:15AM -0400, Carlos Eduardo Maiolino wrote: > Hi folks, > > is there any update about this? I didn't see any comments if I need to change > something on this patch to get the documentation applied, or perhaps I missed some e-mail? I've been waiting for a v2. i.e. If you have to explain how fail at unmount works (or doesn't, in this case) during review, then that clearly needs to be added to the documentation. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 8 18:12:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C51837CA0 for ; Mon, 8 Aug 2016 18:12:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B67F8F8039 for ; Mon, 8 Aug 2016 16:12:33 -0700 (PDT) X-ASG-Debug-ID: 1470697946-0bf8157e6d5a8070001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Nl1mPxFnNIScZLx1 for ; Mon, 08 Aug 2016 16:12:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B4DACnEKlXIAI1LHldg0WBUoZynR0BAQEBAQEGjGKIHoF9hhcEAgKBQDoTAQEBAQEBAQYBAQEBAQE3AUCEXwEFMgEjIxAIAxgJJQ8FJQMHGhOIMMMSAQEBAQYCASQehUSFFYQsg0CCLwWZOY8Aj02MNIN4HwGEQCoyhTKBRAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Aug 2016 08:42:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bWtib-0003Hr-6o; Tue, 09 Aug 2016 09:12:25 +1000 Date: Tue, 9 Aug 2016 09:12:25 +1000 From: Dave Chinner To: "Boylston, Brian" Cc: "Kani, Toshimitsu" , "jack@suse.cz" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" , "linux-ext4@vger.kernel.org" Subject: Re: Subtle races between DAX mmap fault and write path Message-ID: <20160808231225.GD19025@dastard> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path References: <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470697946 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4075 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 05, 2016 at 07:58:33PM +0000, Boylston, Brian wrote: > Dave Chinner wrote on 2016-08-05: > > [ cut to just the important points ] > > On Thu, Aug 04, 2016 at 06:40:42PM +0000, Kani, Toshimitsu wrote: > >> On Tue, 2016-08-02 at 10:21 +1000, Dave Chinner wrote: > >>> If I drop the fsync from the > >>> buffered IO path, bandwidth remains the same but runtime drops to > >>> 0.55-0.57s, so again the buffered IO write path is faster than DAX > >>> while doing more work. > >> > >> I do not think the test results are relevant on this point because both > >> buffered and dax write() paths use uncached copy to avoid clflush.  The > >> buffered path uses cached copy to the page cache and then use uncached copy to > >> PMEM via writeback.  Therefore, the buffered IO path also benefits from using > >> uncached copy to avoid clflush. > > > > Except that I tested without the writeback path for buffered IO, so > > there was a direct comparison for single cached copy vs single > > uncached copy. > > > > The undenial fact is that a write() with a single cached copy with > > all the overhead of dirty page tracking is /faster/ than a much > > shorter, simpler IO path that uses an uncached copy. That's what the > > numbers say.... > > > >> Cached copy (req movq) is slightly faster than uncached copy, > > > > Not according to Boaz - he claims that uncached is 20% faster than > > cached. How about you two get together, do some benchmarking and get > > your story straight, eh? > > > >> and should be > >> used for writing to the page cache.  For writing to PMEM, however, additional > >> clflush can be expensive, and allocating cachelines for PMEM leads to evict > >> application's cachelines. > > > > I keep hearing people tell me why cached copies are slower, but > > no-one is providing numbers to back up their statements. The only > > numbers we have are the ones I've published showing cached copies w/ > > full dirty tracking is faster than uncached copy w/o dirty tracking. > > > > Show me the numbers that back up your statements, then I'll listen > > to you. > > Here are some numbers for a particular scenario, and the code is below. > > Time (in seconds) to copy a 16KiB buffer 1M times to a 4MiB NVDIMM buffer > (1M total memcpy()s). For the cached+clflush case, the flushes are done > every 4MiB (which seems slightly faster than flushing every 16KiB): > > NUMA local NUMA remote > Cached+clflush 13.5 37.1 > movnt 1.0 1.3 So let's put that in memory bandwidth terms. You wrote 16GB to the NVDIMM. That means: NUMA local NUMA remote Cached+clflush 1.2GB/s 0.43GB/s movnt 16.0GB/s 12.3GB/s That smells wrong. The DAX code (using movnt) is not 1-2 orders of magnitude faster than a page cache copy, so I don't believe your benchmark reflects what I'm proposing. What I think you're getting wrong is that we are not doing a clflush after every 16k write when we use the page cache, nor will we do that if we use cached copies, dirty tracking and clflush on fsync(). IOWs, the correct equivalent "cached + clflush" loop to a volatile copy with dirty tracking + fsync would be: dstp = dst; while (--nloops) { memcpy(dstp, src, src_sz); // pwrite(); dstp += src_sz; } pmem_persist(dst, dstsz); // fsync(); i.e. The cache flushes occur only at the user defined synchronisation point not on every syscall. Yes, if you want to make your copy slow and safe, use O_SYNC to trigger clflush on every write() call - that's what we do for existing storage and the mechanisms are already there; we just need the dirty tracking to optimise it. Put simple: we should only care about cache flush synchronisation at user defined data integrity synchronisation points. That's the IO model the kernel has always exposed to users, and pmem storage is no different. Cheers, Dave. -- Dave Chinner david@fromorbit.com From toshi.kani@hpe.com Mon Aug 8 20:00:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 37AA87CA0 for ; Mon, 8 Aug 2016 20:00:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 926F9AC001 for ; Mon, 8 Aug 2016 18:00:36 -0700 (PDT) X-ASG-Debug-ID: 1470704433-0bf57c136947f5f0001-NocioJ Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0097.outbound.protection.outlook.com [104.47.41.97]) by cuda.sgi.com with ESMTP id ahbefwu8Al3idoFW (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 08 Aug 2016 18:00:33 -0700 (PDT) X-Barracuda-Envelope-From: toshi.kani@hpe.com X-Barracuda-Effective-Source-IP: mail-dm3nam03on0097.outbound.protection.outlook.com[104.47.41.97] X-Barracuda-Apparent-Source-IP: 104.47.41.97 Received: from CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.11) by CS1PR84MB0118.NAMPRD84.PROD.OUTLOOK.COM (10.162.189.21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Tue, 9 Aug 2016 01:00:31 +0000 Received: from CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.11]) by CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM ([10.162.189.11]) with mapi id 15.01.0549.025; Tue, 9 Aug 2016 01:00:31 +0000 From: "Kani, Toshimitsu" To: "david@fromorbit.com" , "Boylston, Brian" CC: "linux-ext4@vger.kernel.org" , "jack@suse.cz" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" Subject: Re: Subtle races between DAX mmap fault and write path Thread-Topic: Subtle races between DAX mmap fault and write path X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path Thread-Index: AQHR5/+GKX9GoZT7i02Vp4UF+8RxL6AsxqeAgAATU4CAAKUNgIABMOkAgADPd4CAAJ7PgIADzJCAgADs7QCABFeAgIABGYyAgACOv4CABO0pgIAAHiQA Date: Tue, 9 Aug 2016 01:00:30 +0000 Message-ID: <1470704418.32015.51.camel@hpe.com> References: <20160727221949.GU16044@dastard> <20160728081033.GC4094@quack2.suse.cz> <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> <20160808231225.GD19025@dastard> In-Reply-To: <20160808231225.GD19025@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=toshi.kani@hpe.com; x-originating-ip: [15.219.163.2] x-ms-office365-filtering-correlation-id: 93b1ca0d-c138-44b2-3205-08d3bff08f9a x-microsoft-exchange-diagnostics: 1;CS1PR84MB0118;6:7fh7Uhlx3ZgZR9JCtptIcj80vtbMGoLcD0KMGs1bFqnDKLB3qDR5TSMGLm2kGuAZouNST8TQkDA+X3kiXaT9AUiG58kS5uJGi2XqbaiRT03eGz3GaJPgWv/ZP7uTruYVrJa7o+0IsPRSZNt48whtPNxaUFinj77BG5uczqXwrasqeuj+UmSCAeH0d6xYS/lRh6B0lryMcRjRmwC6S2qoToFNL12q9/dC++zpfWVqUxFgoGKxBWnbIOjpjNgxCJzSB4JUjM2bkWmkjO5VmqRTnu9liRT6nWeTHmygHTClouiqxNaBuQkXict3lBPYJG9ulnkrxn40k0IUG/plvcWqSw==;5:oP3ncEH/F8QuWX2GRvMHLNU+43FuBb+MlkCKDN2urW4Dv74xZPnsZ64SwHECW428ZJoSuVytAfkQWSAuEPQdEQTCcdLitMcZh6QupteNaF8eCtl45NxXEkp6ETb5iwt5ggCQAwTm53VXnUQI1TSaeA==;24:GhB6mAAx+dXxYHQKgUFUtwtwJviLPb1F2gXu0PBRgGE4nz++02xcSAoGeNPGuKJIEONF3J4KPTduYkxE0BTwCKwr4MbUq4TukgT31a0JR54=;7:cBVIs2AkNy6201yRHHP64WJLa86AUQH9mF77kWK1A80+ZgwGybbwdWWBABSDqmMH4v/75zVStdiS/gYEU20BLAfm2nkRkXu+OppuqohJ+UqJE5fK/bvWAGkV3a1WZXL+h68i5vKYrUgs8MTtU1pZVEaLrhKQ/Kz+7DCrhdmkMFCY4M++YJZShHRKNjIrEXu3IAdwlqNK/7mrN6teSqPaZoXq50TS9E4j3M0UQT9NwnZwiqItDf3F+AHG3AZ42RYp x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0118; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6055026);SRVR:CS1PR84MB0118;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0118; x-forefront-prvs: 0029F17A3F x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(7916002)(199003)(189002)(377424004)(53824002)(24454002)(11100500001)(33646002)(5001770100001)(77096005)(189998001)(93886004)(103116003)(36756003)(105586002)(122556002)(2900100001)(5002640100001)(50986999)(10400500002)(106116001)(106356001)(97736004)(99286002)(101416001)(2950100001)(54356999)(76176999)(586003)(81156014)(4326007)(2906002)(86362001)(87936001)(2501003)(8676002)(3660700001)(81166006)(7846002)(92566002)(66066001)(3280700002)(305945005)(3846002)(6116002)(102836003)(8936002)(7736002)(68736007);DIR:OUT;SFP:1102;SCL:1;SRVR:CS1PR84MB0118;H:CS1PR84MB0005.NAMPRD84.PROD.OUTLOOK.COM;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; received-spf: None (protection.outlook.com: hpe.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" Content-ID: <83D29545D28AD64192DDB3A5134C0C0A@NAMPRD84.PROD.OUTLOOK.COM> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: hpe.com X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Aug 2016 01:00:30.9843 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 105b2061-b669-4b31-92ac-24d304d195dc X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0118 X-Barracuda-Connect: mail-dm3nam03on0097.outbound.protection.outlook.com[104.47.41.97] X-Barracuda-Start-Time: 1470704433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5167 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31859 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header T24gVHVlLCAyMDE2LTA4LTA5IGF0IDA5OjEyICsxMDAwLCBEYXZlIENoaW5uZXIgd3JvdGU6DQo+ IE9uIEZyaSwgQXVnIDA1LCAyMDE2IGF0IDA3OjU4OjMzUE0gKzAwMDAsIEJveWxzdG9uLCBCcmlh biB3cm90ZToNCj4gPiANCj4gPiBEYXZlIENoaW5uZXIgd3JvdGUgb24gMjAxNi0wOC0wNToNCj4g PiA+IA0KPiA+ID4gWyBjdXQgdG8ganVzdCB0aGUgaW1wb3J0YW50IHBvaW50cyBdDQo+ID4gPiBP biBUaHUsIEF1ZyAwNCwgMjAxNiBhdCAwNjo0MDo0MlBNICswMDAwLCBLYW5pLCBUb3NoaW1pdHN1 IHdyb3RlOg0KPiA+ID4gPiANCj4gPiA+ID4gT24gVHVlLCAyMDE2LTA4LTAyIGF0IDEwOjIxICsx MDAwLCBEYXZlIENoaW5uZXIgd3JvdGU6DQo+ID4gPiA+ID4gDQo+ID4gPiA+ID4gSWYgSSBkcm9w IHRoZSBmc3luYyBmcm9tIHRoZQ0KPiA+ID4gPiA+IGJ1ZmZlcmVkIElPIHBhdGgsIGJhbmR3aWR0 aCByZW1haW5zIHRoZSBzYW1lIGJ1dCBydW50aW1lDQo+ID4gPiA+ID4gZHJvcHMgdG8gMC41NS0w LjU3cywgc28gYWdhaW4gdGhlIGJ1ZmZlcmVkIElPIHdyaXRlIHBhdGggaXMNCj4gPiA+ID4gPiBm YXN0ZXIgdGhhbiBEQVggd2hpbGUgZG9pbmcgbW9yZSB3b3JrLg0KPiA+ID4gPiANCj4gPiA+ID4g SSBkbyBub3QgdGhpbmsgdGhlIHRlc3QgcmVzdWx0cyBhcmUgcmVsZXZhbnQgb24gdGhpcyBwb2lu dA0KPiA+ID4gPiBiZWNhdXNlIGJvdGggYnVmZmVyZWQgYW5kIGRheCB3cml0ZSgpIHBhdGhzIHVz ZSB1bmNhY2hlZCBjb3B5DQo+ID4gPiA+IHRvIGF2b2lkIGNsZmx1c2guIMKgVGhlIGJ1ZmZlcmVk IHBhdGggdXNlcyBjYWNoZWQgY29weSB0byB0aGUNCj4gPiA+ID4gcGFnZSBjYWNoZSBhbmQgdGhl biB1c2UgdW5jYWNoZWQgY29weSB0byBQTUVNIHZpYSB3cml0ZWJhY2suDQo+ID4gPiA+IMKgVGhl cmVmb3JlLCB0aGUgYnVmZmVyZWQgSU8gcGF0aCBhbHNvIGJlbmVmaXRzIGZyb20gdXNpbmcNCj4g PiA+ID4gdW5jYWNoZWQgY29weSB0byBhdm9pZCBjbGZsdXNoLg0KPiA+ID4gDQo+ID4gPiBFeGNl cHQgdGhhdCBJIHRlc3RlZCB3aXRob3V0IHRoZSB3cml0ZWJhY2sgcGF0aCBmb3IgYnVmZmVyZWQg SU8sDQo+ID4gPiBzbyB0aGVyZSB3YXMgYSBkaXJlY3QgY29tcGFyaXNvbiBmb3Igc2luZ2xlIGNh Y2hlZCBjb3B5IHZzIHNpbmdsZQ0KPiA+ID4gdW5jYWNoZWQgY29weS4NCj4gPiA+IA0KPiA+ID4g VGhlIHVuZGVuaWFsIGZhY3QgaXMgdGhhdCBhIHdyaXRlKCkgd2l0aCBhIHNpbmdsZSBjYWNoZWQg Y29weQ0KPiA+ID4gd2l0aCBhbGwgdGhlIG92ZXJoZWFkIG9mIGRpcnR5IHBhZ2UgdHJhY2tpbmcg aXMgL2Zhc3Rlci8gdGhhbiBhDQo+ID4gPiBtdWNoIHNob3J0ZXIsIHNpbXBsZXIgSU8gcGF0aCB0 aGF0IHVzZXMgYW4gdW5jYWNoZWQgY29weS4gVGhhdCdzDQo+ID4gPiB3aGF0IHRoZSBudW1iZXJz IHNheS4uLi4NCj4gPiA+IA0KPiA+ID4gPiANCj4gPiA+ID4gQ2FjaGVkIGNvcHkgKHJlcSBtb3Zx KSBpcyBzbGlnaHRseSBmYXN0ZXIgdGhhbiB1bmNhY2hlZCBjb3B5LA0KPiA+ID4gDQo+ID4gPiBO b3QgYWNjb3JkaW5nIHRvIEJvYXogLSBoZSBjbGFpbXMgdGhhdCB1bmNhY2hlZCBpcyAyMCUgZmFz dGVyDQo+ID4gPiB0aGFuIGNhY2hlZC4gSG93IGFib3V0IHlvdSB0d28gZ2V0IHRvZ2V0aGVyLCBk byBzb21lIGJlbmNobWFya2luZw0KPiA+ID4gYW5kIGdldCB5b3VyIHN0b3J5IHN0cmFpZ2h0LCBl aD8NCj4gPiA+IA0KPiA+ID4gPiBhbmQgc2hvdWxkIGJlIHVzZWQgZm9yIHdyaXRpbmcgdG8gdGhl IHBhZ2UgY2FjaGUuIMKgRm9yIHdyaXRpbmcNCj4gPiA+ID4gdG8gUE1FTSwgaG93ZXZlciwgYWRk aXRpb25hbCBjbGZsdXNoIGNhbiBiZSBleHBlbnNpdmUsIGFuZA0KPiA+ID4gPiBhbGxvY2F0aW5n IGNhY2hlbGluZXMgZm9yIFBNRU0gbGVhZHMgdG8gZXZpY3QgYXBwbGljYXRpb24ncw0KPiA+ID4g PiBjYWNoZWxpbmVzLg0KPiA+ID4gDQo+ID4gPiBJIGtlZXAgaGVhcmluZyBwZW9wbGUgdGVsbCBt ZSB3aHkgY2FjaGVkIGNvcGllcyBhcmUgc2xvd2VyLCBidXQNCj4gPiA+IG5vLW9uZSBpcyBwcm92 aWRpbmcgbnVtYmVycyB0byBiYWNrIHVwIHRoZWlyIHN0YXRlbWVudHMuIFRoZSBvbmx5DQo+ID4g PiBudW1iZXJzIHdlIGhhdmUgYXJlIHRoZSBvbmVzIEkndmUgcHVibGlzaGVkIHNob3dpbmcgY2Fj aGVkIGNvcGllcw0KPiA+ID4gdy8gZnVsbCBkaXJ0eSB0cmFja2luZyBpcyBmYXN0ZXIgdGhhbiB1 bmNhY2hlZCBjb3B5IHcvbyBkaXJ0eQ0KPiA+ID4gdHJhY2tpbmcuDQo+ID4gPiANCj4gPiA+IFNo b3cgbWUgdGhlIG51bWJlcnMgdGhhdCBiYWNrIHVwIHlvdXIgc3RhdGVtZW50cywgdGhlbiBJJ2xs DQo+ID4gPiBsaXN0ZW4gdG8geW91Lg0KPiA+IA0KPiA+IEhlcmUgYXJlIHNvbWUgbnVtYmVycyBm b3IgYSBwYXJ0aWN1bGFyIHNjZW5hcmlvLCBhbmQgdGhlIGNvZGUgaXMNCj4gPiBiZWxvdy4NCj4g PiANCj4gPiBUaW1lIChpbiBzZWNvbmRzKSB0byBjb3B5IGEgMTZLaUIgYnVmZmVyIDFNIHRpbWVz IHRvIGEgNE1pQiBOVkRJTU0NCj4gPiBidWZmZXIgKDFNIHRvdGFsIG1lbWNweSgpcykuwqDCoEZv ciB0aGUgY2FjaGVkK2NsZmx1c2ggY2FzZSwgdGhlDQo+ID4gZmx1c2hlcyBhcmUgZG9uZSBldmVy eSA0TWlCICh3aGljaCBzZWVtcyBzbGlnaHRseSBmYXN0ZXIgdGhhbg0KPiA+IGZsdXNoaW5nIGV2 ZXJ5IDE2S2lCKToNCj4gPiANCj4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBOVU1BIGxvY2FswqDCoMKgwqBOVU1BIHJlbW90ZQ0KPiA+IENhY2hlZCtjbGZsdXNowqDCoMKg wqDCoMKgMTMuNcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAzNy4xDQo+ID4gbW92bnTCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoDEuMMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDEuM8KgDQo+ IA0KPiBTbyBsZXQncyBwdXQgdGhhdCBpbiBtZW1vcnkgYmFuZHdpZHRoIHRlcm1zLiBZb3Ugd3Jv dGUgMTZHQiB0byB0aGUNCj4gTlZESU1NLsKgwqBUaGF0IG1lYW5zOg0KPiANCj4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgTlVNQSBsb2NhbMKgwqDCoMKgTlVNQSByZW1vdGUN Cj4gQ2FjaGVkK2NsZmx1c2jCoMKgwqDCoMKgwqAxLjJHQi9zwqDCoMKgwqDCoMKgwqDCoMKgMC40 M0dCL3MNCj4gbW92bnTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMTYuMEdCL3PCoMKgwqDC oMKgwqDCoMKgwqAxMi4zR0Ivcw0KPiANCj4gVGhhdCBzbWVsbHMgd3JvbmcuwqDCoFRoZSBEQVgg Y29kZSAodXNpbmcgbW92bnQpIGlzIG5vdCAxLTIgb3JkZXJzIG9mDQo+IG1hZ25pdHVkZSBmYXN0 ZXIgdGhhbiBhIHBhZ2UgY2FjaGUgY29weSwgc28gSSBkb24ndCBiZWxpZXZlIHlvdXINCj4gYmVu Y2htYXJrIHJlZmxlY3RzIHdoYXQgSSdtIHByb3Bvc2luZy4NCj4NCj4gV2hhdCBJIHRoaW5rIHlv dSdyZSBnZXR0aW5nIHdyb25nIGlzIHRoYXQgd2UgYXJlIG5vdCBkb2luZyBhIGNsZmx1c2gNCj4g YWZ0ZXIgZXZlcnkgMTZrIHdyaXRlIHdoZW4gd2UgdXNlIHRoZSBwYWdlIGNhY2hlLCBub3Igd2ls bCB3ZSBkbw0KPiB0aGF0IGlmIHdlIHVzZSBjYWNoZWQgY29waWVzLCBkaXJ0eSB0cmFja2luZyBh bmQgY2xmbHVzaCBvbiBmc3luYygpLg0KDQpBcyBJIG1lbnRpb25lZCBiZWZvcmUsIHdlIGRvIG5v dCB1c2UgY2xmbHVzaCBvbiB0aGUgd3JpdGUgcGF0aC4gwqBTbywNCnlvdXIgdGVzdHMgZGlkIG5v dCBpc3N1ZSBjbGZsdXNoIGF0IGFsbC4NCg0KPiBJT1dzLCB0aGUgY29ycmVjdCBlcXVpdmFsZW50 ICJjYWNoZWQgKyBjbGZsdXNoIiBsb29wIHRvIGEgdm9sYXRpbGUNCj4gY29weSB3aXRoIGRpcnR5 IHRyYWNraW5nICsgZnN5bmMgd291bGQgYmU6DQo+IA0KPiAJZHN0cCA9IGRzdDsNCj4gCXdoaWxl ICgtLW5sb29wcykgew0KPiAJCW1lbWNweShkc3RwLCBzcmMsIHNyY19zeik7CS8vIHB3cml0ZSgp Ow0KPiAJCWRzdHAgKz0gc3JjX3N6Ow0KPiAJfQ0KPiDCoMKgwqDCoMKgwqDCoMKgcG1lbV9wZXJz aXN0KGRzdCwgZHN0c3opOwkvLyBmc3luYygpOw0KPiANCj4gaS5lLiBUaGUgY2FjaGUgZmx1c2hl cyBvY2N1ciBvbmx5IGF0IHRoZSB1c2VyIGRlZmluZWQNCj4gc3luY2hyb25pc2F0aW9uIHBvaW50 IG5vdCBvbiBldmVyeSBzeXNjYWxsLg0KDQpCcmlhbidzIHRlc3QgaXMgKDE2IEtpQiBwd3JpdGUg KyBmc3luYykgcmVwZWF0ZWQgMU0gdGltZXMuIMKgSXQgY29tcGFyZWQNCnR3byBhcHByb2FjaGVz IGluIHRoZSBjYXNlIG9mIDE2IEtpQiBwZXJzaXN0ZW50IHdyaXRlLiDCoEkgZG8gbm90DQpjb3Np ZGVyIGl0IHdyb25nLCBidXQgaXQgaW5kaWNhdGVkIHRoYXQgY2FjaGVkIGNvcHkgKyBjbGZsdXNo IHdpbGwgbGVhZA0KbXVjaCBoaWdoZXIgb3ZlcmhlYWQgd2hlbiBzeW5jJ2QgaW4gYSBmaW5lciBn cmFudWxhcml0eS4NCg0KSSBhZ3JlZSB0aGF0IGl0IHNob3VsZCBoYXZlIGxlc3Mgb3ZlcmhlYWQg aW4gdG90YWwgd2hlbiBjbGZsdXNoIGlzIGRvbmUNCmF0IG9uY2Ugc2luY2UgaXQgb25seSBoYXMg dG8gZXZpY3QgYXMgbXVjaCBhcyB0aGUgY2FjaGUgc2l6ZS4NCg0KPiBZZXMsIGlmIHlvdSB3YW50 IHRvIG1ha2UgeW91ciBjb3B5IHNsb3cgYW5kIHNhZmUsIHVzZSBPX1NZTkMgdG8NCj4gdHJpZ2dl ciBjbGZsdXNoIG9uIGV2ZXJ5IHdyaXRlKCkgY2FsbCAtIHRoYXQncyB3aGF0IHdlIGRvIGZvcg0K PiBleGlzdGluZyBzdG9yYWdlIGFuZCB0aGUgbWVjaGFuaXNtcyBhcmUgYWxyZWFkeSB0aGVyZTsg d2UganVzdCBuZWVkDQo+IHRoZSBkaXJ0eSB0cmFja2luZyB0byBvcHRpbWlzZSBpdC4NCg0KUGVy aGFwcywgeW91IGFyZSByZWZlcnJpbmcgZmx1c2hpbmcgb24gZGlzayB3cml0ZSBjYWNoZT8gwqBJ IGRvIG5vdA0KdGhpbmsgY2xmbHVzaCBhcyBhIHg4NiBpbnN0cnVjdGlvbiBpcyB1c2VkIGZvciBl eGlzaXRpbmcgc3RvcmFnZS4NCg0KPiBQdXQgc2ltcGxlOiB3ZSBzaG91bGQgb25seSBjYXJlIGFi b3V0IGNhY2hlIGZsdXNoIHN5bmNocm9uaXNhdGlvbiBhdA0KPiB1c2VyIGRlZmluZWQgZGF0YSBp bnRlZ3JpdHkgc3luY2hyb25pc2F0aW9uIHBvaW50cy4gVGhhdCdzIHRoZSBJTw0KPiBtb2RlbCB0 aGUga2VybmVsIGhhcyBhbHdheXMgZXhwb3NlZCB0byB1c2VycywgYW5kIHBtZW0gc3RvcmFnZSBp cyBubw0KPiBkaWZmZXJlbnQuDQoNClRoYW5rcywNCi1Ub3NoaQ== From chingimleong@yahoo.com.sg Mon Aug 8 23:03:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A22E87CA0 for ; Mon, 8 Aug 2016 23:03:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 366558F8037 for ; Mon, 8 Aug 2016 21:03:50 -0700 (PDT) X-ASG-Debug-ID: 1470715423-0bf8157e6d5bbb90001-NocioJ Received: from nm32.bullet.mail.sg3.yahoo.com (nm32.bullet.mail.sg3.yahoo.com [106.10.151.27]) by cuda.sgi.com with ESMTP id u4e6GFScQ8o436x8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 08 Aug 2016 21:03:45 -0700 (PDT) X-Barracuda-Envelope-From: chingimleong@yahoo.com.sg X-ASG-Whitelist: Sender X-Barracuda-Effective-Source-IP: nm32.bullet.mail.sg3.yahoo.com[106.10.151.27] X-Barracuda-Apparent-Source-IP: 106.10.151.27 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com.sg; s=s2048; t=1470715423; bh=gKrnLk5QIUNd04M57u6zP9N0HdDxp2AwcqAeahFi4pM=; h=Date:From:Reply-To:To:Cc:In-Reply-To:References:Subject:From:Subject; b=RPfqBdnR8nngWsegeAQ5LOI7R/5g8+qHpkbKpmCJa/f8B+QPBWHczL/j8DIvB3Is1tOlSamyDTEuPjahfE2qmyekJPCmTaZPziq6TiKFUYxlXgSqk0mZnO1mZI8blqidqFrgCEyocHgyaqMTnxib1n7sdV0N05ARhzl5ILq5GWQPDaxAk1zUweEkkJaKSq1tnwgTdoFRJERlp0N7S4CDWpkXGBaEotYbloHQ448lhAeNk618HvU5GpnSJ5Cqs/ss9jif0DXKDnYVOX0Vz4rFsds03/5E99czGT2Cpn4u/NqDrOEkSMcN4dKmh7qrer0kA+xeCzri8/LsOdye53bBgg== Received: from [106.10.166.125] by nm32.bullet.mail.sg3.yahoo.com with NNFMP; 09 Aug 2016 04:03:43 -0000 Received: from [106.10.151.239] by tm14.bullet.mail.sg3.yahoo.com with NNFMP; 09 Aug 2016 04:03:43 -0000 Received: from [127.0.0.1] by omp1023.mail.sg3.yahoo.com with NNFMP; 09 Aug 2016 04:03:43 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 236460.93299.bm@omp1023.mail.sg3.yahoo.com X-YMail-OSG: tDvL5hEVM1nJRxswMeOJdd6kCbZRSGsTvp2gKP5fE3ZurW270TmFPI26Fet_v_k bxLjGiHRBGPdoE7GEqLE0FfgjTScGRbEt_uhNxDVOYqrjav9EEUjetzudm_DVBCbjrmSNh0.E6yt 8yxqVcBREJyBc2qJ9aH4WHNfwxzNzLqApaWcc5LNiFp4ssHTRtUwXQOkkIWEpYFBHPLzqE4RH33K Nhnmpgz490BSmE0Zb22Ho4o6vcUkafm_jQQaec4MXGS5e7n7lgqksKOtSTWF9lGzivsaxp5bErgF sARWr_buiNZWUZg5EJacJiQ4SnYyKIvR0M4mQmEYPeHELaIivz3of30.mZ3tCxmyLxWtJqIMuudS 453jJnXRvLbQ_EDjFDqLAKxwQtM1z4Gg32dziGTsXYd3YVuRi9Fm96CA7q3I9Ap8pCgwGAd4eV8p xaSiSjeUjXClh.y2VJ97Sdc1DeRVrYAhY7BhhrxObTbdWRWezH7MDcP4S1LhmKyimFMVFf_pi143 Ny7xKUk6R80mdgnGXHNR_ygQzN3p7ek9lSQ-- Received: from jws10946.mail.sg3.yahoo.com by sendmailws107.mail.sg3.yahoo.com; Tue, 09 Aug 2016 04:03:42 +0000; 1470715422.873 Date: Tue, 9 Aug 2016 04:02:55 +0000 (UTC) From: Gim Leong Chin Reply-To: Gim Leong Chin To: Emmanuel Florac , Roger Willcocks Cc: Steve Brooks , "xfs@oss.sgi.com" Message-ID: <592673683.10446004.1470715375850.JavaMail.yahoo@mail.yahoo.com> In-Reply-To: <20160808174427.24d8272c@harpe.intellique.com> References: <5787852A.7030900@st-andrews.ac.uk> <20160808161132.1d76eb5c@harpe.intellique.com> <1470670691.8958.11.camel@filmlight.ltd.uk> <20160808174427.24d8272c@harpe.intellique.com> Subject: Re: Advice needed with file system corruption MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Advice needed with file system corruption Content-Type: multipart/alternative; boundary="----=_Part_10446003_2107006600.1470715375844" X-Barracuda-Connect: nm32.bullet.mail.sg3.yahoo.com[106.10.151.27] X-Barracuda-Start-Time: 1470715424 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3991 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ------=_Part_10446003_2107006600.1470715375844 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable From: Emmanuel Florac To: Roger Willcocks =20 Cc: Steve Brooks ; xfs@oss.sgi.com Sent: Monday, 8 August 2016, 23:44 Subject: Re: Advice needed with file system corruption =20 Le Mon, 08 Aug 2016 16:38:11 +0100 Roger Willcocks =C3=A9crivait: > >=20 > > Late to the game, I just wanted to remark that I've unfortunately > > verified many times that write activity during rebuilds on Adaptec > > RAID controllers often creates corruption. I've reported that to > > Adaptec, but they don't seem to care much... > >=C2=A0=20 >=20 > It seems like explicitly disabling individual disk drives write-back > cache somewhat mitigates the effect.=20 Drives connected to RAID controllers with battery backed cache should have = their caches "disabled" (they are really set to write through mode instead)= .=C2=A0 By the way, I found out in lab testing that 7200 RPM SATA drives su= ffer a big performance loss when doing sequential writes in cache write thr= ough mode. ------=_Part_10446003_2107006600.1470715375844 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
<= /div>



From: Emmanuel Florac <eflorac= @intellique.com>
To: Roger Willcocks <roger@filmlight.ltd.uk>
Cc: Steve Brooks <sjb14@st-andrews.ac.uk>;= xfs@oss.sgi.com
Sent:= Monday, 8 August 2016, 23:44
Sub= ject: Re: Advice needed with file system corruption
=

Le Mon, 08 Aug 2016 16:38:11 +0100
Roger Will= cocks <roger@filmlight.ltd.uk> =C3=A9cri= vait:

> >
>= ; > Late to the game, I just wanted to remark that I've unfortunately> > verified many times that write activity during re= builds on Adaptec
> > RAID controllers often create= s corruption. I've reported that to
> > Adaptec, bu= t they don't seem to care much...
> > 
>

> It seems like = explicitly disabling individual disk drives write-back
&g= t; cache somewhat mitigates the effect.

Drives connected to RAID controllers w= ith battery backed cache should have their caches "disabled" (they are real= ly set to write through mode instead).  By the way, I found out in lab= testing that 7200 RPM SATA drives suffer a big performance loss when doing= sequential writes in cache write through mode.


------=_Part_10446003_2107006600.1470715375844-- From david@fromorbit.com Tue Aug 9 00:59:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8C5087CA0 for ; Tue, 9 Aug 2016 00:59:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 428F8304048 for ; Mon, 8 Aug 2016 22:58:58 -0700 (PDT) X-ASG-Debug-ID: 1470722331-0bf8157e6a5c1370001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6oKgE2ooypFTXQru for ; Mon, 08 Aug 2016 22:58:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DMDQAKcKlXIAI1LHldg0WBUoJ5g3mdJQEBBoxiiB6BfYYXBAICgT46EwEBAQEBAQEGAQEBAQEBOECEXgEBBAEyASMjBQsIAxIGCSUPBSUDBwYUE4gpB8M5AQEBAQYCASQehUSFFYQsg0CCLwWZOY8Aj02MNIN4HwGCRhyBXioyhTKBRAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Aug 2016 15:28:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bX03s-0003rO-Th; Tue, 09 Aug 2016 15:58:48 +1000 Date: Tue, 9 Aug 2016 15:58:48 +1000 From: Dave Chinner To: "Kani, Toshimitsu" Cc: "Boylston, Brian" , "linux-ext4@vger.kernel.org" , "jack@suse.cz" , "linux-nvdimm@lists.01.org" , "xfs@oss.sgi.com" , "linux-fsdevel@vger.kernel.org" Subject: Re: Subtle races between DAX mmap fault and write path Message-ID: <20160809055848.GE19025@dastard> X-ASG-Orig-Subj: Re: Subtle races between DAX mmap fault and write path References: <20160729022152.GZ16044@dastard> <20160730001249.GE16044@dastard> <579F20D9.80107@plexistor.com> <20160802002144.GL16044@dastard> <1470335997.8908.128.camel@hpe.com> <20160805112739.GG16044@dastard> <20160808231225.GD19025@dastard> <1470704418.32015.51.camel@hpe.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1470704418.32015.51.camel@hpe.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470722331 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8202 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 09, 2016 at 01:00:30AM +0000, Kani, Toshimitsu wrote: > On Tue, 2016-08-09 at 09:12 +1000, Dave Chinner wrote: > > On Fri, Aug 05, 2016 at 07:58:33PM +0000, Boylston, Brian wrote: > > > > > > Dave Chinner wrote on 2016-08-05: > > > > > > > > [ cut to just the important points ] > > > > On Thu, Aug 04, 2016 at 06:40:42PM +0000, Kani, Toshimitsu wrote: > > > > > > > > > > On Tue, 2016-08-02 at 10:21 +1000, Dave Chinner wrote: > > > > > > > > > > > > If I drop the fsync from the > > > > > > buffered IO path, bandwidth remains the same but runtime > > > > > > drops to 0.55-0.57s, so again the buffered IO write path is > > > > > > faster than DAX while doing more work. > > > > > > > > > > I do not think the test results are relevant on this point > > > > > because both buffered and dax write() paths use uncached copy > > > > > to avoid clflush.  The buffered path uses cached copy to the > > > > > page cache and then use uncached copy to PMEM via writeback. > > > > >  Therefore, the buffered IO path also benefits from using > > > > > uncached copy to avoid clflush. > > > > > > > > Except that I tested without the writeback path for buffered IO, > > > > so there was a direct comparison for single cached copy vs single > > > > uncached copy. > > > > > > > > The undenial fact is that a write() with a single cached copy > > > > with all the overhead of dirty page tracking is /faster/ than a > > > > much shorter, simpler IO path that uses an uncached copy. That's > > > > what the numbers say.... > > > > > > > > > > > > > > Cached copy (req movq) is slightly faster than uncached copy, > > > > > > > > Not according to Boaz - he claims that uncached is 20% faster > > > > than cached. How about you two get together, do some benchmarking > > > > and get your story straight, eh? > > > > > > > > > and should be used for writing to the page cache.  For writing > > > > > to PMEM, however, additional clflush can be expensive, and > > > > > allocating cachelines for PMEM leads to evict application's > > > > > cachelines. > > > > > > > > I keep hearing people tell me why cached copies are slower, but > > > > no-one is providing numbers to back up their statements. The only > > > > numbers we have are the ones I've published showing cached copies > > > > w/ full dirty tracking is faster than uncached copy w/o dirty > > > > tracking. > > > > > > > > Show me the numbers that back up your statements, then I'll > > > > listen to you. > > > > > > Here are some numbers for a particular scenario, and the code is > > > below. > > > > > > Time (in seconds) to copy a 16KiB buffer 1M times to a 4MiB NVDIMM > > > buffer (1M total memcpy()s).  For the cached+clflush case, the > > > flushes are done every 4MiB (which seems slightly faster than > > > flushing every 16KiB): > > > > > >                   NUMA local    NUMA remote > > > Cached+clflush      13.5           37.1 > > > movnt                1.0            1.3  > > > > So let's put that in memory bandwidth terms. You wrote 16GB to the > > NVDIMM.  That means: > > > >                   NUMA local    NUMA remote > > Cached+clflush      1.2GB/s         0.43GB/s > > movnt              16.0GB/s         12.3GB/s > > > > That smells wrong.  The DAX code (using movnt) is not 1-2 orders of > > magnitude faster than a page cache copy, so I don't believe your > > benchmark reflects what I'm proposing. > > > > What I think you're getting wrong is that we are not doing a clflush > > after every 16k write when we use the page cache, nor will we do > > that if we use cached copies, dirty tracking and clflush on fsync(). > > As I mentioned before, we do not use clflush on the write path.  So, > your tests did not issue clflush at all. Uh, yes, I made that clear by saying "using volatile, cached copies through the page cache, then using fsync() for integrity". This results in the page cache being written to the nvdimm via the writeback paths through bios, which the pmem driver does via movnt() instructions. And then we send a REQ_FLUSH bio to the device during fsync(), and that runs nvdimm_flush() which makes sure all the posted writes are flushed to persistent storage. I'll also point out that the writeback of the page cache doubled the runtime of the test, so the second memcpy() using movnt had basically the same cost as the volatile page cache copy up front. > > IOWs, the correct equivalent "cached + clflush" loop to a volatile > > copy with dirty tracking + fsync would be: > > > > dstp = dst; > > while (--nloops) { > > memcpy(dstp, src, src_sz); // pwrite(); > > dstp += src_sz; > > } > >         pmem_persist(dst, dstsz); // fsync(); > > > > i.e. The cache flushes occur only at the user defined > > synchronisation point not on every syscall. > > Brian's test is (16 KiB pwrite + fsync) repeated 1M times.  It compared > two approaches in the case of 16 KiB persistent write. Yes, Brian tested synchronous writes. But: THAT WAS NOT WHAT I WAS TESTING, PROPOSING OR DISCUSSING! Seriously, compare apples to apples, don't try to justify comparing apples to oranges by saying "but we like oranges better". > I do not > cosider it wrong, but it indicated that cached copy + clflush will lead > much higher overhead when sync'd in a finer granularity. That's true, but only until the next gen CPUs optimise clflush, and then it will have negliable difference in overhead. IOWs, you are advocating we optimise for existing, sub-optimal CPU design constraints, rather than architect a sane data integrity model. A model which, not by coincidence, will be much better suited to the capabilities of the next generation of CPUs and so will perform better than any micro-optimisations we could make now for existing CPUs. > I agree that it should have less overhead in total when clflush is done > at once since it only has to evict as much as the cache size. > > > Yes, if you want to make your copy slow and safe, use O_SYNC to > > trigger clflush on every write() call - that's what we do for > > existing storage and the mechanisms are already there; we just need > > the dirty tracking to optimise it. > > Perhaps, you are referring flushing on disk write cache?  I do not > think clflush as a x86 instruction is used for exisiting storage. I'm talking about *whatever volatile caches are in layers below the filesystem*. Stop thinking that pmem is some special little snowflake - it's not. It's no different to the existing storage architectures we have to deal with - it has volatile domains that we have to flush to ensure are flushed to the persistent domain when a data integrity synchronisation point occurs. For DAX we use the kernel writeback infrastructure to issue clflush. We use REQ_FLUSH to get the pmem driver to guarantee persistence of the posted writes that result from the clflush. That's no different to writing data via a bio to the SSD and then send REQ_FLUSH to ensure it is on stable media inside the SSD. These a /generic primitives/ we use to guarantee data integrity, and they apply equally to pmem as the do all other block and network based storage. And let's not forget that we can't guarantee data persistence just though a cache flush or synchronous data write. There is no guarantee that the filesystem metadata points to the location the data was written to until a data synchronisation command is given to the filesystem. The filesystem may have allocated a new block (e.g. due to a copy-on-write event in a reflinked file) for that data write so even overwrites are not guaranteed to be persistent until a fsync/msync/sync/O_[D]SYNC action takes place. Arguments that movnt is the fastest way to copy data into the persistent domain completely ignore the the context of the copy in the data integrity model filesystems present to applications. Microbenchmarks are good for comparing micro-optimisations, but they are useless for comparing the merits of high level architecture decisions. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 9 01:29:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1037F7CA0 for ; Tue, 9 Aug 2016 01:29:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 79E3FAC002 for ; Mon, 8 Aug 2016 23:29:49 -0700 (PDT) X-ASG-Debug-ID: 1470724186-0bf57c136748a630001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 8Zye8THLQlfU8RnE for ; Mon, 08 Aug 2016 23:29:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BbEQAOd6lXIAI1LHldg0WBUoZynSEBAQEBAQEGjGKGD4IPgX2GFwQCAoE/OhMBAQEBAQEBBgEBAQEBAThAhF8BBTocIxAIAxgJJQ8FJQMHGhOIMMM+AQEBBwIBJB6FRIUVh2yCLwWZOY8Aj02MNIN4IAGCQh+BXioyh00BAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Aug 2016 15:59:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bX0Xn-0003v1-8c; Tue, 09 Aug 2016 16:29:43 +1000 Date: Tue, 9 Aug 2016 16:29:43 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: Eryu Guan , linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 13/17] xfs: test swapext with reflink Message-ID: <20160809062943.GF19025@dastard> X-ASG-Orig-Subj: Re: [PATCH 13/17] xfs: test swapext with reflink References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914485888.11762.1688573359701830686.stgit@birch.djwong.org> <20160808081359.GB27776@eguan.usersys.redhat.com> <20160808174132.GC11291@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160808174132.GC11291@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470724186 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 971 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31863 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 08, 2016 at 10:41:32AM -0700, Darrick J. Wong wrote: > On Mon, Aug 08, 2016 at 04:13:59PM +0800, Eryu Guan wrote: > > On Thu, Jul 21, 2016 at 04:47:38PM -0700, Darrick J. Wong wrote: > > > Add a few tests to stress the new swapext code for reflink and rmap. > > > +_reflink_range "$testdir/file1" 0 "$testdir/file2" 0 $bytes >> "$seqres.full" > > > + > > > +echo "Defrag the big file" > > > +old_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > > > > There's a "_count_extents" helper, does that work for this case? > > It can, though stat -v reports GETFSXATTR results, which should be faster than > _count_extents because the latter FIEMAPs the entire file and counts lines. > Seeing as XFS records the extent count in the inode, we might as well use it. perhaps put a special xfs case in _count_extents() that does this rather than FIEMAP? Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:28:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 864A17CA0 for ; Tue, 9 Aug 2016 02:28:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A95C304039 for ; Tue, 9 Aug 2016 00:28:39 -0700 (PDT) X-ASG-Debug-ID: 1470727716-0bf8157e6c5c6c90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WdFDaPaxRgTjWm0E (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:28:36 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1Sm-0006wq-6X; Tue, 09 Aug 2016 07:28:36 +0000 Date: Tue, 9 Aug 2016 00:28:36 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 1/2] iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag Message-ID: <20160809072836.GA25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag References: <1470637351-27933-1-git-send-email-david@fromorbit.com> <1470637351-27933-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470637351-27933-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470727716 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 436 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 08, 2016 at 04:22:30PM +1000, Dave Chinner wrote: > From: Dave Chinner > > The flag is checked as supported, but then we do an unconditional > sync of the file, regardless of whether the flag is set or not. Make > the sync conditional on having the FIEMAP_FLAG_SYNC flag set. > > Signed-off-by: Dave Chinner Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:34:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AEC867CA1 for ; Tue, 9 Aug 2016 02:34:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7F1A9304039 for ; Tue, 9 Aug 2016 00:34:55 -0700 (PDT) X-ASG-Debug-ID: 1470728091-0bf57c136948d280001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CKE3dreryaPNWjJd (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:34:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1Yo-0000jJ-Rf; Tue, 09 Aug 2016 07:34:50 +0000 Date: Tue, 9 Aug 2016 00:34:50 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 2/2] iomap: add fiemap support for attribute mappings Message-ID: <20160809073450.GB25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] iomap: add fiemap support for attribute mappings References: <1470637351-27933-1-git-send-email-david@fromorbit.com> <1470637351-27933-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470637351-27933-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728092 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2599 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 08, 2016 at 04:22:31PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Prior to the iomap conversion, XFS supported the FIEMAP_FLAG_XATTR > flag for mapping the attribute fork block map. This flag was not > added to the iomap fiemap support so we have regressed fiemap > functionality with this change. > > Add an iomap control flag to indicate that we should be operating > on the attribute map rather than the file data map and pass it from > iomap_fiemap() as appropriate. Add the appropriate flags to the XFS > code to switch to the attribute fork lookup, and ensure we return > EINVAL if anyone attempts a write mapping of the attribute fork. I'm a little worried about this for a few reasons: > - ret = fiemap_check_flags(fi, FIEMAP_FLAG_SYNC); > + ret = fiemap_check_flags(fi, FIEMAP_FLAG_SYNC | FIEMAP_FLAG_XATTR); FIEMAP_FLAG_XATTR is a magic thing only supported by ext4 and historically XFS. By claiming general support here we make iomap_fiemap unsuitable for general use. At least we should pass in a flag if it's supported or not into the generic helper. Or see below for another idea. > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 4398932..17b5b82 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -993,10 +993,22 @@ xfs_file_iomap_begin( > struct xfs_bmbt_irec imap; > xfs_fileoff_t offset_fsb, end_fsb; > int nimaps = 1, error = 0; > + int bmflags = XFS_BMAPI_ENTIRE; > > if (XFS_FORCED_SHUTDOWN(mp)) > return -EIO; > > + /* Attribute fork can only be read via this interface */ > + if (flags & IOMAP_ATTR) { > + if (flags & ~IOMAP_ATTR) > + return -EINVAL; > + /* if there are no attribute fork or extents, return ENOENT */ > + if (!XFS_IFORK_Q(ip) || !ip->i_d.di_anextents) > + return -ENOENT; > + ASSERT(ip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL); > + bmflags |= XFS_BMAPI_ATTRFORK; > + } And this adds a special case for totally rare attr fork operation to the fast path that we'll soon be using for all file I/O. I'd suggest to just have a separate stub set of iomap_ops for the xattr case. xfs_vn_fiemap would then look something like: xfs_ilock(XFS_I(inode), XFS_IOLOCK_SHARED); if (fi->fi_flags & FIEMAP_FLAG_XATTR) { fi->fi_flags &= ~FIEMAP_FLAG_XATTR; error = iomap_fiemap(inode, fieinfo, start, length, &xfs_attr_iomap_ops); } else { error = iomap_fiemap(inode, fieinfo, start, length, &xfs_iomap_ops); } xfs_iunlock(XFS_I(inode), XFS_IOLOCK_SHARED); return error; From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:36:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBE1B7CA3 for ; Tue, 9 Aug 2016 02:36:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7E7548F8033 for ; Tue, 9 Aug 2016 00:36:15 -0700 (PDT) X-ASG-Debug-ID: 1470728172-0bf8157e6b5c7330001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id G2yV74bjPbGbpp9p (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:36:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1a7-0002A3-1w; Tue, 09 Aug 2016 07:36:11 +0000 Date: Tue, 9 Aug 2016 00:36:11 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE Message-ID: <20160809073611.GC25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728172 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 197 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Good plan: Reviewed-by: Christoph Hellwig Does this also error out for libraries that don't support large off_t at all? I think that would be helpful to add if not there yet. From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:36:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A282A7CA1 for ; Tue, 9 Aug 2016 02:36:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 64E038F8033 for ; Tue, 9 Aug 2016 00:36:32 -0700 (PDT) X-ASG-Debug-ID: 1470728189-0bf57c136748d300001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id r0mcDq8FiSRj9F1W (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:36:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1aP-0002BQ-EK; Tue, 09 Aug 2016 07:36:29 +0000 Date: Tue, 9 Aug 2016 00:36:29 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 02/14] remove unecessary definitions of _FILE_OFFSET_BITS Message-ID: <20160809073629.GD25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 02/14] remove unecessary definitions of _FILE_OFFSET_BITS References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728190 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:36:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E003C7CB1 for ; Tue, 9 Aug 2016 02:36:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3CBB304053 for ; Tue, 9 Aug 2016 00:36:50 -0700 (PDT) X-ASG-Debug-ID: 1470728208-0bf57c136948d320001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id aA5fPlc2ewi6bpMm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:36:49 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1ai-0002C4-7R; Tue, 09 Aug 2016 07:36:48 +0000 Date: Tue, 9 Aug 2016 00:36:48 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 03/14] replace fstat64 by equivalent fstat Message-ID: <20160809073648.GE25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 03/14] replace fstat64 by equivalent fstat References: <672b1929c1d96977bf5755fbbc541d530f31198b.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <672b1929c1d96977bf5755fbbc541d530f31198b.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728209 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:37:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 73D3A7CA4 for ; Tue, 9 Aug 2016 02:37:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EADF6AC003 for ; Tue, 9 Aug 2016 00:37:26 -0700 (PDT) X-ASG-Debug-ID: 1470728245-0bf8157e6a5c73a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YPuktEL34o7sfQJH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:37:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1bJ-0002Cs-MU; Tue, 09 Aug 2016 07:37:25 +0000 Date: Tue, 9 Aug 2016 00:37:25 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 04/14] replace lstat64 by equivalent lstat Message-ID: <20160809073725.GF25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 04/14] replace lstat64 by equivalent lstat References: <903a519209407e8815607e741bf24027b07408ca.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <903a519209407e8815607e741bf24027b07408ca.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728245 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 194 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig if for some reasons this has to be respun and reposted I'd do all calls of a family (e.g. stat/lstat/fstat) in one patch, though. From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:37:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E2FF17CB2 for ; Tue, 9 Aug 2016 02:37:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8146304053 for ; Tue, 9 Aug 2016 00:37:48 -0700 (PDT) X-ASG-Debug-ID: 1470728265-0bf57b369c511f70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id mzGjonlctk4DbpWe (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:37:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1bd-0002Dd-FN; Tue, 09 Aug 2016 07:37:45 +0000 Date: Tue, 9 Aug 2016 00:37:45 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 05/14] replace stat64 by equivalent stat Message-ID: <20160809073745.GG25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 05/14] replace stat64 by equivalent stat References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728266 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:38:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 049BA7CA1 for ; Tue, 9 Aug 2016 02:38:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AB58B8F8039 for ; Tue, 9 Aug 2016 00:38:04 -0700 (PDT) X-ASG-Debug-ID: 1470728283-0bf8157e6a5c7400001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id RwVrLbOC6MGRzTND (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:38:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1bv-0002E3-3p; Tue, 09 Aug 2016 07:38:03 +0000 Date: Tue, 9 Aug 2016 00:38:03 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 06/14] replace ftruncate64 by equivalent ftruncate Message-ID: <20160809073803.GH25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 06/14] replace ftruncate64 by equivalent ftruncate References: <9a96c2eedc66f86669643fc59f9ea7d3a6b64321.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <9a96c2eedc66f86669643fc59f9ea7d3a6b64321.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728283 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 62 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:38:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 68BA57CB1 for ; Tue, 9 Aug 2016 02:38:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D653FAC003 for ; Tue, 9 Aug 2016 00:38:24 -0700 (PDT) X-ASG-Debug-ID: 1470728302-0bf57c136848d390001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id cu4bdjsW54z3CI7l (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:38:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1cE-0002Fa-EV; Tue, 09 Aug 2016 07:38:22 +0000 Date: Tue, 9 Aug 2016 00:38:22 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 07/14] replace lseek64 by equivalent lseek Message-ID: <20160809073822.GI25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 07/14] replace lseek64 by equivalent lseek References: <63ec40703b14df0c99b2d479dc1739c3a2fb3064.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <63ec40703b14df0c99b2d479dc1739c3a2fb3064.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728303 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:38:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3E2597CBB for ; Tue, 9 Aug 2016 02:38:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3D34AC003 for ; Tue, 9 Aug 2016 00:38:41 -0700 (PDT) X-ASG-Debug-ID: 1470728320-0bf8157e6a5c7440001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QSDBfI9AtuYlJ1oi (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:38:40 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1cW-0002Gj-LQ; Tue, 09 Aug 2016 07:38:40 +0000 Date: Tue, 9 Aug 2016 00:38:40 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 08/14] replace pread64 by equivalent pread Message-ID: <20160809073840.GJ25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 08/14] replace pread64 by equivalent pread References: <54046df0c8591a0c5678dee87a8c8aba02ea1d88.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54046df0c8591a0c5678dee87a8c8aba02ea1d88.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728320 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:39:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9D0327CA4 for ; Tue, 9 Aug 2016 02:39:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 610438F8035 for ; Tue, 9 Aug 2016 00:39:06 -0700 (PDT) X-ASG-Debug-ID: 1470728344-0bf8157e6d5c7470001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QhoWyEOVfFX7ZMBU (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:39:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1cu-0002Hn-Rg; Tue, 09 Aug 2016 07:39:04 +0000 Date: Tue, 9 Aug 2016 00:39:04 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 09/14] replace pwrite64 by equivalent pwrite Message-ID: <20160809073904.GK25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 09/14] replace pwrite64 by equivalent pwrite References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728344 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:39:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3F0677CA3 for ; Tue, 9 Aug 2016 02:39:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A7C56AC003 for ; Tue, 9 Aug 2016 00:39:21 -0700 (PDT) X-ASG-Debug-ID: 1470728359-0bf57b369e512060001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 62G6sdStKXwHWrb4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:39:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1d8-0002IT-Rw; Tue, 09 Aug 2016 07:39:18 +0000 Date: Tue, 9 Aug 2016 00:39:18 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 10/14] replace sendfile64 by equivalent sendfile Message-ID: <20160809073918.GL25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 10/14] replace sendfile64 by equivalent sendfile References: <381255cfec13dc45dd4fe2232e94dc6ead92952b.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <381255cfec13dc45dd4fe2232e94dc6ead92952b.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728359 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:40:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 14E347CA3 for ; Tue, 9 Aug 2016 02:40:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D9B788F8035 for ; Tue, 9 Aug 2016 00:40:12 -0700 (PDT) X-ASG-Debug-ID: 1470728410-0bf57b369e5120d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WSOQA0YT3ZQwiWFM (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:40:11 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1dy-0003U3-Ky; Tue, 09 Aug 2016 07:40:10 +0000 Date: Tue, 9 Aug 2016 00:40:10 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs Message-ID: <20160809074010.GM25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728411 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 252 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sun, Aug 07, 2016 at 08:24:40AM +0200, Felix Janda wrote: > For this it was necessary to change a workaround for missing > f_brsize on Mac OS X. If we can get rid of that it'd be fine, but can you explain a bit more why we can get rid of it? From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:40:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5ABB77CB7 for ; Tue, 9 Aug 2016 02:40:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E241304053 for ; Tue, 9 Aug 2016 00:40:30 -0700 (PDT) X-ASG-Debug-ID: 1470728428-0bf8157e6a5c7500001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id uhVA9Gsbh4YoSu2o (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:40:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1eG-0003VE-KX; Tue, 09 Aug 2016 07:40:28 +0000 Date: Tue, 9 Aug 2016 00:40:28 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 12/14] replace off64_t by off_t outside of public headers Message-ID: <20160809074028.GN25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 12/14] replace off64_t by off_t outside of public headers References: <638a270f0a8291a42e30adb8abd56224664931e5.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <638a270f0a8291a42e30adb8abd56224664931e5.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728428 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:41:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB27F7CA4 for ; Tue, 9 Aug 2016 02:41:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3FABEAC002 for ; Tue, 9 Aug 2016 00:41:42 -0700 (PDT) X-ASG-Debug-ID: 1470728499-0bf57b369b512130001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id uUxaKVV03DMorMx5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:41:40 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1fO-0003kC-Vl; Tue, 09 Aug 2016 07:41:38 +0000 Date: Tue, 9 Aug 2016 00:41:38 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 13/14] xfs.h: require transparent LFS Message-ID: <20160809074138.GO25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 13/14] xfs.h: require transparent LFS References: <3be2b10b0037406374a415fda2318cbf95a67546.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3be2b10b0037406374a415fda2318cbf95a67546.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728500 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 192 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +extern int xfs_assert_largefile[sizeof(off_t)-8]; Please add a comment on why we have this declaration, otherwise this looks fine to me: Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 02:41:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1BE2D7CB1 for ; Tue, 9 Aug 2016 02:41:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E07BA8F8033 for ; Tue, 9 Aug 2016 00:41:58 -0700 (PDT) X-ASG-Debug-ID: 1470728516-0bf57c136a48d4b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id U2wlMgTfeC1yFeUn (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 00:41:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX1fg-0003kQ-Iv; Tue, 09 Aug 2016 07:41:56 +0000 Date: Tue, 9 Aug 2016 00:41:56 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 14/14] platform: remove use of off64_t Message-ID: <20160809074156.GP25647@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 14/14] platform: remove use of off64_t References: <5562ea1f5a96d39d406d2258053167e798b98fff.1470555003.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5562ea1f5a96d39d406d2258053167e798b98fff.1470555003.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470728517 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From cmaiolino@redhat.com Tue Aug 9 03:11:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EDA057CA6 for ; Tue, 9 Aug 2016 03:11:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B0EBF304051 for ; Tue, 9 Aug 2016 01:11:54 -0700 (PDT) X-ASG-Debug-ID: 1470730310-0bf8157e6b5c8980001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BjY4BbGAqtsX7Iul (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 01:11:50 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1D2233B3C2; Tue, 9 Aug 2016 08:11:50 +0000 (UTC) Received: from redhat.com (gfs-i24c-02.mpc.lab.eng.bos.redhat.com [10.16.144.214]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u798BmZ3006722 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 9 Aug 2016 04:11:49 -0400 Date: Tue, 9 Aug 2016 04:11:47 -0400 From: Carlos Maiolino To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Document error handling behavior Message-ID: <20160809081147.GA64251@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: Document error handling behavior Mail-Followup-To: Dave Chinner , xfs@oss.sgi.com References: <1468922657-3895-1-git-send-email-cmaiolino@redhat.com> <20160722040955.GB16413@zlang.usersys.redhat.com> <20160722085804.GA2990@redhat.com> <907731470.210439.1470653835697.JavaMail.zimbra@redhat.com> <20160808224011.GC19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160808224011.GC19025@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 09 Aug 2016 08:11:50 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470730310 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 698 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 09, 2016 at 08:40:11AM +1000, Dave Chinner wrote: > On Mon, Aug 08, 2016 at 06:57:15AM -0400, Carlos Eduardo Maiolino wrote: > > Hi folks, > > > > is there any update about this? I didn't see any comments if I need to change > > something on this patch to get the documentation applied, or perhaps I missed some e-mail? > > I've been waiting for a v2. > > i.e. If you have to explain how fail at unmount works (or doesn't, > in this case) during review, then that clearly needs to be added to > the documentation. Well, can't argue with that, I'll rework it and send a V2 :) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Carlos From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 03:28:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 855A57CA6 for ; Tue, 9 Aug 2016 03:28:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4624D304039 for ; Tue, 9 Aug 2016 01:28:00 -0700 (PDT) X-ASG-Debug-ID: 1470731278-0bf8157e6b5c9170001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gLaikkWDCg9sjo2s (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 01:27:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX2OC-0005lz-2y; Tue, 09 Aug 2016 08:27:56 +0000 Date: Tue, 9 Aug 2016 01:27:56 -0700 From: Christoph Hellwig To: Jan Kara Cc: Al Viro , Miklos Szeredi , xfs@oss.sgi.com, "Yan, Zheng" , linux-fsdevel@vger.kernel.org, Ilya Dryomov , ceph-devel@vger.kernel.org Subject: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Message-ID: <20160809082756.GA11657@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() References: <1470223689-17783-1-git-send-email-jack@suse.cz> <1470223689-17783-2-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470223689-17783-2-git-send-email-jack@suse.cz> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470731278 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 346 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > +static int > +xfs_vn_change_ok( > + struct dentry *dentry, > + struct iattr *iattr) Please don't use the _vn prefix for something that's not an actual inode operation (and we should do a mess rename to _iop one day as well.) > +int > +xfs_vn_setattr_nonsize( > + struct dentry *dentry, > + struct iattr *iattr) Same here. From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 03:28:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B0DA27CB0 for ; Tue, 9 Aug 2016 03:28:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 340B7AC002 for ; Tue, 9 Aug 2016 01:28:32 -0700 (PDT) X-ASG-Debug-ID: 1470731310-0bf8157e6a5c9200001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id XSM179W4BpaBMhSy (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 01:28:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX2Oi-00066O-T5; Tue, 09 Aug 2016 08:28:28 +0000 Date: Tue, 9 Aug 2016 01:28:28 -0700 From: Christoph Hellwig To: Jan Kara Cc: Al Viro , Miklos Szeredi , xfs@oss.sgi.com, "Yan, Zheng" , linux-fsdevel@vger.kernel.org, Ilya Dryomov , ceph-devel@vger.kernel.org Subject: Re: [PATCH 4/5] fs: Give dentry to inode_change_ok() instead of inode Message-ID: <20160809082828.GB11657@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/5] fs: Give dentry to inode_change_ok() instead of inode References: <1470223689-17783-1-git-send-email-jack@suse.cz> <1470223689-17783-5-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470223689-17783-5-git-send-email-jack@suse.cz> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470731310 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 496 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 03, 2016 at 01:28:08PM +0200, Jan Kara wrote: > inode_change_ok() will be resposible for clearing capabilities and IMA > extended attributes and as such will need dentry. Give it as an argument > to inode_change_ok() instead of an inode. Also rename inode_change_ok() > to setattr_prepare() to better relect that it does also some > modifications in addition to checks. > > Signed-off-by: Jan Kara Looks fine: Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 03:29:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C66837CA7 for ; Tue, 9 Aug 2016 03:29:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 47DE6AC003 for ; Tue, 9 Aug 2016 01:29:20 -0700 (PDT) X-ASG-Debug-ID: 1470731354-0bf57c136a48e630001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 3BF5qWGf6hCiyjcl (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 01:29:14 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX2PQ-0006Yj-2g; Tue, 09 Aug 2016 08:29:12 +0000 Date: Tue, 9 Aug 2016 01:29:12 -0700 From: Christoph Hellwig To: Jan Kara Cc: Al Viro , Miklos Szeredi , xfs@oss.sgi.com, "Yan, Zheng" , linux-fsdevel@vger.kernel.org, Ilya Dryomov , ceph-devel@vger.kernel.org Subject: Re: [PATCH 5/5] fs: Avoid premature clearing of capabilities Message-ID: <20160809082912.GC11657@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/5] fs: Avoid premature clearing of capabilities References: <1470223689-17783-1-git-send-email-jack@suse.cz> <1470223689-17783-6-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470223689-17783-6-git-send-email-jack@suse.cz> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470731354 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 752 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 03, 2016 at 01:28:09PM +0200, Jan Kara wrote: > Currently, notify_change() clears capabilities or IMA attributes by > calling security_inode_killpriv() before calling into ->setattr. Thus it > happens before any other permission checks in inode_change_ok() and user > is thus allowed to trigger clearing of capabilities or IMA attributes > for any file he can look up e.g. by calling chown for that file. This is > unexpected and can lead to user DoSing a system. > > Fix the problem by calling security_inode_killpriv() at the end of > inode_change_ok() instead of from notify_change(). At that moment we are > sure user has permissions to do the requested change. Looks fine, Reviewed-by: Christoph Hellwig From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 03:33:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EE2467CA6 for ; Tue, 9 Aug 2016 03:33:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B172F8F8037 for ; Tue, 9 Aug 2016 01:33:35 -0700 (PDT) X-ASG-Debug-ID: 1470731613-0bf57c136948e860001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 4Xsu8lWjG0UrsQHJ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 01:33:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX2Tc-0000pu-7e; Tue, 09 Aug 2016 08:33:32 +0000 Date: Tue, 9 Aug 2016 01:33:32 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: kill __uint*_t and __int*_t Message-ID: <20160809083332.GA1489@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: kill __uint*_t and __int*_t References: <20160807173835.GA20839@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160807173835.GA20839@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470731613 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 695 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sun, Aug 07, 2016 at 07:38:35PM +0200, Felix Janda wrote: > Replace them by the more widely used uint*_t and int*_t. > > Signed-off-by: Felix Janda > --- > This patch is essentially a global > 'sed -i "s/__\(u*\)int\([0-9]*\)_t/\1int\2_t/"'. The only other changes > are whitespace changes and removing the now unecessary type definitions. > > Running 'sed "s/^.//"' on the patch might be useful for checking that > I didn't mess up the indentation. If everyone is fine using (u)int*_t over s*/u* this looks good. I'd have a slight preference for s*/u* as in the rest of the kernel, but either way getting rid of our crazy __ types is a good thing. From cmaiolino@redhat.com Tue Aug 9 04:15:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B22F27CA6 for ; Tue, 9 Aug 2016 04:15:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 840948F8037 for ; Tue, 9 Aug 2016 02:15:32 -0700 (PDT) X-ASG-Debug-ID: 1470734130-0bf57b369c51a0e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WALnpRT8iiK0CO3m (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 02:15:31 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 65EA583F41 for ; Tue, 9 Aug 2016 09:15:30 +0000 (UTC) Received: from gfs-i24c-02.mpc.lab.eng.bos.redhat.com (gfs-i24c-02.mpc.lab.eng.bos.redhat.com [10.16.144.214]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u799FTLZ013803 for ; Tue, 9 Aug 2016 05:15:30 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH] xfs: Document error handlers behavior [V2] Date: Tue, 9 Aug 2016 05:15:24 -0400 X-ASG-Orig-Subj: [PATCH] xfs: Document error handlers behavior [V2] Message-Id: <1470734124-65204-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 09 Aug 2016 09:15:30 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470734131 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4690 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Document the implementation of error handlers into sysfs. Changelog: V2: - Add a description of the precedence order of each option, focusing on the behavior of "fail_at_unmount" which was not well explained in V1 Signed-off-by: Carlos Maiolino --- Documentation/filesystems/xfs.txt | 94 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 8146e9f..d483e0b 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt @@ -348,3 +348,97 @@ Removed Sysctls ---- ------- fs.xfs.xfsbufd_centisec v4.0 fs.xfs.age_buffer_centisecs v4.0 + +Error handling +============== + +XFS can act differently according with the type of error found +during its operation. The implementation introduces the following +concepts to the error handler: + + -failure speed: + Defines how fast XFS should shutdown in case of a specific + error is found during the filesystem operation. It can + shutdown immediately, after a defined number of tries, or + simply try forever, which was the old behavior and is now + set as default behavior, except during unmount time, where + in case of a error is found while unmounting, the filesystem + will shutdown. + + -error classes: + Specifies the subsystem/location where the error handlers + configure the behavior for, such as metadata or memory allocation. + + -error handlers: + Defines the behavior for a specific error. + +The filesystem behavior during an error can be set via sysfs files, where, the +errors are organized with the following structure: + + /sys/fs/xfs//error/// + +Each directory contains: + + /sys/fs/xfs//error/ + + fail_at_unmount (Min: 0 Default: 1 Max: 1) + Defines the global error behavior during unmount time. If set to + "1", XFS will shutdown in case of any error is found, otherwise, + if set to "0", the filesystem will indefinitely retry to cleanly + unmount the filesystem. + + subdirectories + Contains specific error handlers configuration + (Ex: /sys/fs/xfs//error/metadata). + + /sys/fs/xfs//error// + + The contents of this directory are specific, since each + might need to handle different types of errors. All directory + though, contains the "default" directory, which is a global configuration + for errors not available for independent configuration. + + /sys/fs/xfs//error// + + Contains the failure speed configuration files for each specific error, + including the "default" behavior, which contains the same configuration + options as the specific errors. + + The available configurations for each error type are: + + max_retries (Min: -1 Default: -1 Max: INTMAX) + Define how many tries the filesystem is allowed to retry its + operations during the specific error, before shutdown the + filesystem. Setting this file to "-1", will set XFS to retry + forever in the specific error, setting it to "0", will make + XFS to fail immediately after the specific error is found, + while setting it to a "N" value, where N is greater than 0, + will make XFS retry "N" times before shutdown. + + retry_timeout_seconds (Min: 0 Default: 0 Max: INTMAX) + Define the amount of time (in seconds) that the filesystem is + allowed to retry its operations when the specific error is + found. "0" means no wait time. + + + + Order of precedence: + "max_retries" takes precedence over "retry_timeout_seconds", + where, "retry_timeout_seconds" will only be tested if + "max_retries" limit was not reached yet or is set to retry + forever ("-1"). If "max_retries" limit is reached, the + filesystem will shutdown, wether or not "retry_timeout_seconds" + has been reached. + + "fail_at_unmount" on the other hand, works independently of the + remainder options. It will only be tested during unmount time, + but, it will shutdown the filesystem independent of the limits + set into "max_retries" or "retry_timeout_seconds". + It has been added because sysfs configuration can't be changed + after an unmount is triggered, once the sysfs directory from + the filesystem being unmounted will be detached from the sysfs + tree, so, even if the sysadmin wants to make XFS retry forever + for any error during the filesystem operation, the filesystem + can still be properly unmounted if any error was detected and + "fail_at_unmount" is set. Otherwise, the umount process get + stuck forever. -- 2.5.5 From jack@suse.cz Tue Aug 9 04:32:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EE66C7CA6 for ; Tue, 9 Aug 2016 04:32:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A485B304039 for ; Tue, 9 Aug 2016 02:32:54 -0700 (PDT) X-ASG-Debug-ID: 1470735169-0bf8157e6a5d3670001-NocioJ Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id r8fFHD7ImgV093A1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 09 Aug 2016 02:32:51 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Effective-Source-IP: mx2.suse.de[195.135.220.15] X-Barracuda-Apparent-Source-IP: 195.135.220.15 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 2DCBFABE0; Tue, 9 Aug 2016 09:32:48 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 344141E0EEF; Tue, 9 Aug 2016 11:32:46 +0200 (CEST) Date: Tue, 9 Aug 2016 11:32:46 +0200 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , Al Viro , Miklos Szeredi , xfs@oss.sgi.com, "Yan, Zheng" , linux-fsdevel@vger.kernel.org, Ilya Dryomov , ceph-devel@vger.kernel.org Subject: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Message-ID: <20160809093246.GB5107@quack2.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() References: <1470223689-17783-1-git-send-email-jack@suse.cz> <1470223689-17783-2-git-send-email-jack@suse.cz> <20160809082756.GA11657@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809082756.GA11657@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Barracuda-Connect: mx2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1470735170 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 681 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue 09-08-16 01:27:56, Christoph Hellwig wrote: > > +static int > > +xfs_vn_change_ok( > > + struct dentry *dentry, > > + struct iattr *iattr) > > Please don't use the _vn prefix for something that's not an > actual inode operation (and we should do a mess rename to > _iop one day as well.) > > > +int > > +xfs_vn_setattr_nonsize( > > + struct dentry *dentry, > > + struct iattr *iattr) > > Same here. So do you suggest xfs_iop_change_ok and xfs_iop_setattr_nonsize? I don't really care, I just remember Dave had some ideas how names should be consistent and this naming was his idea... Honza -- Jan Kara SUSE Labs, CR From BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 9 04:35:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6DE4B7CA6 for ; Tue, 9 Aug 2016 04:35:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2BFE6304039 for ; Tue, 9 Aug 2016 02:35:37 -0700 (PDT) X-ASG-Debug-ID: 1470735333-0bf57c1369495ea0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 201MH3stRpSCSvJf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 02:35:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3f646a7e0199b3aaa51d+4734+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bX3Rb-0002Z3-CX; Tue, 09 Aug 2016 09:35:31 +0000 Date: Tue, 9 Aug 2016 02:35:31 -0700 From: Christoph Hellwig To: Jan Kara Cc: Christoph Hellwig , Al Viro , Miklos Szeredi , xfs@oss.sgi.com, "Yan, Zheng" , linux-fsdevel@vger.kernel.org, Ilya Dryomov , ceph-devel@vger.kernel.org Subject: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Message-ID: <20160809093531.GA3937@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() References: <1470223689-17783-1-git-send-email-jack@suse.cz> <1470223689-17783-2-git-send-email-jack@suse.cz> <20160809082756.GA11657@infradead.org> <20160809093246.GB5107@quack2.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809093246.GB5107@quack2.suse.cz> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470735334 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 451 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 09, 2016 at 11:32:46AM +0200, Jan Kara wrote: > So do you suggest xfs_iop_change_ok and xfs_iop_setattr_nonsize? I don't > really care, I just remember Dave had some ideas how names should be > consistent and this naming was his idea... Nah, just skip the prefix entirely, and maybe also already adopt to the new setattr_prepare naming. But if Dave already had an opinions let's just keep it as-is and sort the naming out later. From robin.listas@telefonica.net Tue Aug 9 07:40:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0A3877CA0 for ; Tue, 9 Aug 2016 07:40:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 635C8AC001 for ; Tue, 9 Aug 2016 05:40:32 -0700 (PDT) X-ASG-Debug-ID: 1470746428-0bf57c136a4a1270001-NocioJ Received: from relaycp04.dominioabsoluto.net (relaycp04.dominioabsoluto.net [217.116.26.100]) by cuda.sgi.com with ESMTP id 70MVumCiA5VerSeQ for ; Tue, 09 Aug 2016 05:40:28 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@telefonica.net X-Barracuda-Effective-Source-IP: relaycp04.dominioabsoluto.net[217.116.26.100] X-Barracuda-Apparent-Source-IP: 217.116.26.100 Received: from smtp.movistar.es (smtp10.acens.net [86.109.99.134]) by relaycp04.dominioabsoluto.net (Postfix) with ESMTP id C181464236 for ; Tue, 9 Aug 2016 14:40:27 +0200 (CEST) X-CTCH-RefID: str=0001.0A0B0206.57A9CF3B.013F,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown Received: from Telcontar.valinor (88.17.65.53) by smtp.movistar.es (8.6.122.03) (authenticated as robin.listas2) id 57A52DD4001EE1DD for xfs@oss.sgi.com; Tue, 9 Aug 2016 12:40:29 +0000 Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 29B11120AE1 for ; Tue, 9 Aug 2016 14:40:27 +0200 (CEST) X-Virus-Scanned: amavisd-new at valinor Received: from Telcontar.valinor ([127.0.0.1]) by localhost (Telcontar.valinor [127.0.0.1]) (amavisd-new, port 10024) with LMTP id BZT_NI26Er4m for ; Tue, 9 Aug 2016 14:40:27 +0200 (CEST) Received: from [127.0.0.1] (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id ED0D8120AE0 for ; Tue, 9 Aug 2016 14:40:26 +0200 (CEST) Subject: Re: Advice needed with file system corruption To: XFS mail list X-ASG-Orig-Subj: Re: Advice needed with file system corruption References: <5787852A.7030900@st-andrews.ac.uk> <20160808161132.1d76eb5c@harpe.intellique.com> <1470670691.8958.11.camel@filmlight.ltd.uk> <20160808174427.24d8272c@harpe.intellique.com> <592673683.10446004.1470715375850.JavaMail.yahoo@mail.yahoo.com> From: "Carlos E. R." Message-ID: <7faf941c-2188-589d-b624-9fedb22dee40@telefonica.net> Date: Tue, 9 Aug 2016 14:40:26 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2 MIME-Version: 1.0 In-Reply-To: <592673683.10446004.1470715375850.JavaMail.yahoo@mail.yahoo.com> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="gC6BxN7Gs4AHu8Uk0JSLdKtnlfxvmMjJq" X-Barracuda-Connect: relaycp04.dominioabsoluto.net[217.116.26.100] X-Barracuda-Start-Time: 1470746428 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 737 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31867 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --gC6BxN7Gs4AHu8Uk0JSLdKtnlfxvmMjJq Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 2016-08-09 06:02, Gim Leong Chin wrote: > Drives connected to RAID controllers with battery backed cache should > have their caches "disabled" (they are really set to write through mode= > instead). By the way, I found out in lab testing that 7200 RPM SATA > drives suffer a big performance loss when doing sequential writes in > cache write through mode. If you disable the disk internal cache, as a consequence you also disable the disk internal write optimizations. It has to be much slower at writing. It seems to me obvious. --=20 Cheers / Saludos, Carlos E. R. (from 13.1 x86_64 "Bottle" at Telcontar) --gC6BxN7Gs4AHu8Uk0JSLdKtnlfxvmMjJq Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAlepzzoACgkQtTMYHG2NR9U6xACeIjOB+m2DDr67FLIgSWxnfIb/ e+YAn274gwUKmkkcJY/UFNdh6PVrU938 =6zli -----END PGP SIGNATURE----- --gC6BxN7Gs4AHu8Uk0JSLdKtnlfxvmMjJq-- From vapier@gentoo.org Tue Aug 9 09:43:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 277D37CA0 for ; Tue, 9 Aug 2016 09:43:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DE054304051 for ; Tue, 9 Aug 2016 07:43:55 -0700 (PDT) X-ASG-Debug-ID: 1470753828-0bf57b369e538a80001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id vNTQ9LLNJPBl4uax (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 07:43:49 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Effective-Source-IP: smtp.gentoo.org[140.211.166.183] X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id D1204340BF6 for ; Tue, 9 Aug 2016 14:43:47 +0000 (UTC) From: Mike Frysinger To: xfs@oss.sgi.com Subject: [PATCH xfsprogs] libxcmd: link against used libs Date: Tue, 9 Aug 2016 22:43:43 +0800 X-ASG-Orig-Subj: [PATCH xfsprogs] libxcmd: link against used libs Message-Id: <20160809144343.2228-1-vapier@gentoo.org> X-Mailer: git-send-email 2.9.0 X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1470753828 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 697 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Since this lib uses symbols from libxfs (platform_findsizes) and many symbols from libblkid, link against both. Otherwise, the resulting shared lib has missing symbols which makes linking against annoying. Signed-off-by: Mike Frysinger --- libxcmd/Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libxcmd/Makefile b/libxcmd/Makefile index aab8d6d63624..46ba138a37e2 100644 --- a/libxcmd/Makefile +++ b/libxcmd/Makefile @@ -12,6 +12,8 @@ LT_AGE = 0 CFILES = command.c input.c paths.c projects.c help.c quit.c topology.c +LTLIBS = $(LIBXFS) $(LIBBLKID) + ifeq ($(HAVE_GETMNTENT),yes) LCFLAGS += -DHAVE_GETMNTENT endif -- 2.9.0 From lin.wei15@imperial.ac.uk Tue Aug 9 09:51:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 095157CA0 for ; Tue, 9 Aug 2016 09:51:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CCEA1304053 for ; Tue, 9 Aug 2016 07:51:14 -0700 (PDT) X-ASG-Debug-ID: 1470754272-0bf57c136a4ab7b0001-NocioJ Received: from smtp1.cc.ic.ac.uk (smtp1.cc.ic.ac.uk [155.198.5.155]) by cuda.sgi.com with ESMTP id bR2qv7vLGEvEUugi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 07:51:12 -0700 (PDT) X-Barracuda-Envelope-From: lin.wei15@imperial.ac.uk X-Barracuda-Effective-Source-IP: smtp1.cc.ic.ac.uk[155.198.5.155] X-Barracuda-Apparent-Source-IP: 155.198.5.155 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=imperial.ac.uk; s=main01; h=Content-Type:MIME-Version:Message-ID:Subject:To :From:Date; bh=QSGCZVaJ2M9bV/g9i2qnyiU4h7AmHRypDsQ6+3QAdI0=; b=Ug7L+oBIp4Tw8Y tuEB3FC28egGKz/pNoAcmEX44H56WLJJ1VjvWfEsy923coSkuBaJGrUEWswP8Yu4f00+cwkfADc6q VoiBHz7ViEGHbauM6boWJsOABrRrq6mQLShLEG8OBeNogNpNvpTyqbNCk5motbIi256saLtpaEVAC LBU=; Received: from cloud-vm-46-210.doc.ic.ac.uk ([146.169.46.210] helo=ic) by smtp1.cc.ic.ac.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86) (envelope-from ) id 1bX8N5-0007Hm-Es for xfs@oss.sgi.com; Tue, 09 Aug 2016 15:51:11 +0100 Date: Tue, 9 Aug 2016 15:50:47 +0100 From: Wei Lin To: xfs@oss.sgi.com Subject: Question on migrating data between PVs in xfs Message-ID: <20160809145046.GB5583@ic> X-ASG-Orig-Subj: Question on migrating data between PVs in xfs MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.2 (2016-07-01) X-IC-MsgID: 1bX8N5-0007Hm-Es X-Barracuda-Connect: smtp1.cc.ic.ac.uk[155.198.5.155] X-Barracuda-Start-Time: 1470754272 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 644 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi there, I am working on an xfs based project and want to modify the allocation algorithm, which is quite involved. I am wondering if anyone could help with this. The high level goal is to create xfs agains multiple physical volumes, allow user to specify the target PV for files, and migrate files automatically. I plan to implement the user interface with extended attributes, but am now stuck with the allocation/migration part. Is there a way to make xfs respect the attribute, i.e. only allocate blocks/extents from the target PV specified by user? Any suggestion would be highly appreciated. Cheers, -- Wei Lin From executive06@buganviliasvallarta.com Tue Aug 9 10:41:06 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 49A697CA0 for ; Tue, 9 Aug 2016 10:41:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 043E88F8073 for ; Tue, 9 Aug 2016 08:41:02 -0700 (PDT) X-ASG-Debug-ID: 1470757256-0bf57b369d53dc60001-NocioJ Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0135.outbound.protection.outlook.com [104.47.40.135]) by cuda.sgi.com with ESMTP id SQj3FXoXj3vcrfuT (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 09 Aug 2016 08:40:57 -0700 (PDT) X-Barracuda-Envelope-From: executive06@buganviliasvallarta.com X-Barracuda-Effective-Source-IP: mail-co1nam03on0135.outbound.protection.outlook.com[104.47.40.135] X-Barracuda-Apparent-Source-IP: 104.47.40.135 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=buganviliasclub01.onmicrosoft.com; s=selector1-buganviliasvallarta-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=4Jn/BHdMKMHnAb6PCYeqbg4CPgPF5GWF2GUTBnznar4=; b=EaDY1ABcpiAbjANHrLudSGZqzRcIUqQFg+8dbPfXQBHIwFodkiST4rQ/elHGk0de6ZmGJaFsJpDMzkOmDbPi+7x4Bmwwgl3FMY7md2FDwoNMnqVo1x1dIkCXLRfU+2lQPVVbC8yvkdH8+fCkwpGvhLD85AlP83f1can/pWcNgx0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=executive06@buganviliasvallarta.com; Received: from BUGANVILIA12PC (187.254.156.90) by BL2PR18MB0852.namprd18.prod.outlook.com (10.167.120.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Tue, 9 Aug 2016 15:40:38 +0000 From: Franco Aros To: Franco Aros Subject: Vacaciona en Puerto Vallarta Date: Tue, 9 Aug 2016 10:40:36 -0500 X-ASG-Orig-Subj: Vacaciona en Puerto Vallarta Message-ID: <007b01d1f254$66bbe6a0$3433b3e0$@com> MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_007C_01D1F22A.7DE5DEA0" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdGhbzd7SWvI7BF6S7SEe/YWlTXJEA== Content-Language: es-mx X-Originating-IP: [187.254.156.90] X-ClientProxiedBy: SN1PR17CA0027.namprd17.prod.outlook.com (10.169.33.165) To BL2PR18MB0852.namprd18.prod.outlook.com (10.167.120.22) X-MS-Office365-Filtering-Correlation-Id: fa741233-6073-455e-7150-08d3c06b88b1 X-Microsoft-Exchange-Diagnostics: 1;BL2PR18MB0852;2:DF2f71W03N5xiaerHQeUkv6JX2l9XOSEBGJZ1VvyTJH0lqRv4Mb3v53e4cqvkhEXb4LAKv94xnqaulbIdBXlNpn+g6Ot25NtBPENgU80vx61d4jXun7UAuQ9y6bDdjbe+tXKKWEoMXMAPwhMT3eQNeTDP0nXq8G1LeiQXhHK76ry3X+X9Vqmx/GsHn+cOVkP;3:e/23Y2xTeX6PJ33YiTul0pFciFuRq6aG0CoOPs9vznplDZ6IhV5VPwRecKxRldBxuiAl1KDK3T7OVoF8xP0TdmV3QLjOnIh5wS4zB/FZaXTaRycy4wy8Vj2yUc1pzf3y X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BL2PR18MB0852; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BL2PR18MB0852;25:AJfN/m1fR4QYhM966/UgJXJNQHgYgWEDXRV8L4K4P?= =?us-ascii?Q?LyXkpzaAg7kLZkSi88tyG/GlUF19arw20gIbdt9sfigSoS4flFQIuzSTTdOE?= =?us-ascii?Q?8JssCQEg/cLxqcHTFABKacmpYhVh7Ctpc0sbcabjL5OzCN2AjrzpkhiEP4/0?= =?us-ascii?Q?0Hpc4fyXZtygMszndPs/CiMaiTPR/3xagd/HkxFGkr1+MTmL/JKVI9ZWqWmf?= =?us-ascii?Q?LMved+E0JC/EO3zsRsen97J51NkuUuNu/4/jYQ1kqG2Sqs+pbOcMdHKQkZDW?= =?us-ascii?Q?1+Tlpv9z6LuZUm6yysujv9nLAqSDNiE2T9SnainLAkDYLqUtLWqxVhzPmDhC?= =?us-ascii?Q?6RdQ4CcMnmNz9ul9UeFOFG1/eSMfy/fYvvpWNG10FgjOkFv6SKPy/0kX2cqt?= =?us-ascii?Q?jHspDTyT6QjCgTEJA1KBDWWyH4yCUOQDtRDypRc0syG6t5UzMZXPC/fZRZs/?= =?us-ascii?Q?kNuyslJUPrS49DNeevXp9uBk0vQt3XwvfJ0Pjhzf8cTDTl7EMdo5p1HoAbTU?= =?us-ascii?Q?LfMZdOSs+Z/1THcH4Lo++v2CSUDvzAtd5fiU9JrjqUDBFIk8/NxbzMKTxfBo?= =?us-ascii?Q?bzifxVQ6gs/4MaUjyXjaOTUqIvxDuakr4yMK8aTc3zxbxAKMp7+KICLHAOza?= =?us-ascii?Q?4ZtIGVDLlY1mNAcZ7i7LwcOqFfQ5KpVfglG7qlrGLNini9zu+Bz8QbPZ8KXB?= =?us-ascii?Q?+gVeWNZtro2iAj01WnnjGlrlM1qwNB6zV77SUIXXjkcrfGh0eCFQaTxvmV/S?= =?us-ascii?Q?nHVsK3wt+E+xaIKcS69ikCH3xR7WtZ/runMZNTyX95PmXOyvQIhoLWxw2BH+?= =?us-ascii?Q?0X8/QHlnBuqGsArIW9CZnbW46lWMLu177cdwECuoO44azS8Qxx5w0jtG7xEU?= =?us-ascii?Q?U8v5RAsqy642heXUyZCGF6F7zuxPeMhjfbGPezovSZU1D5k1I+ROB0P1oGOX?= =?us-ascii?Q?9iFHt9n/2QUUaCtbTJlLm9IQ244yiZkqIkvT+2FsRFTLKdSrYYBq6iNIrTkG?= =?us-ascii?Q?MfZDsb8sIi79s9X9DQEAI197MzbF7WCanA8hz9Tx6Ayjsbq33k/FlEkjD9aq?= =?us-ascii?Q?ZUy22QT76zR4X3/V9x6aeavHAFO4SmjVHQaYB3gt8pWx5ieqP/tiBRBrm8ze?= =?us-ascii?Q?u1TiqZpYGytVqFiPdVj0qHYymeuuaH6kdIrX1cO3vtxdTikucaNZP48v9WwP?= =?us-ascii?Q?ujXNUh/A/k0cIA=3D?= X-Microsoft-Exchange-Diagnostics: 1;BL2PR18MB0852;31:hKKtR9bYPyud8vjmJrLhHP9xeOhbWQqdXGa0ljTs+ZTmfDscEx0Uhlqk9kbBfK9rhw6MdEI+ZlQTziScj2JXD5/kO99t0wPB1Bg8VOzNTByImNgfC0rBNsRJZnq05Sfb4l8AU/bvFDEiLxmvPguay8Pj12KmL4Jjg7UOKWuAYQZadRFqJmORZHRe0exgfJcDPGeIYCU5MwONhfXv3+5maBptt1zXwUXSE75oyFkTN0IrGkq0JY5vHhMmKDzrjHH8;4:W3G9CFv+Fhtkx0eQ90paT1PnN7xT9XWvpK1Xx/Wu4S2gra7BFjGaCJNPC5FhRmDIpejeqJZ71xzWhH7ZFbmj3MR4OMmxQR2ZzPK1WEWgTHCLCGOZ3siogdc+/eqnKXDjS5ZWzQyFAgN+Fn9QhbfwwM+tdqpYm3Gv8aPM4CQQeFml7zXin5mqVmb6RYjKTBq27zZEhEd+TOLhf/E0GdabQhSb4qFMVOpHv13JKFOLOSpzJIyZqizG4Q+RE3GvtT7JScfi8m+LNzr7eWK6FVJYcZGliI3IA9R1s598gNd6LxNbOuG/mnap435roEuF4oKZyexfcaHrIJWItp1OpAHv0Dh+iGZaUeFthncobWexemY8zprhZTOw57/ZSXFEtYVEEPDmV7NbGpOadUpeiV+gT3q51wu/h0GkKH8VkaF8SMPmZYLERBAtrMgzYO/G11eLG5z2nfEVh9RhupojZ7fNUiCB0/ridhDIH+6uE46VKn6IwQE4ju9GHGAMVL6TwEedJ36fTWgr4MgOd1KmFuAlLH5QlU9Whxn8Qbelf2IF7bw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(31418570063057)(86561027422486)(21748063052155)(64217206974132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(102415321)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046);SRVR:BL2PR18MB0852;BCL:0;PCL:0;RULEID:;SRVR:BL2PR18MB0852; X-Forefront-PRVS: 0029F17A3F X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(7916002)(199003)(189002)(7406005)(7336002)(7366002)(512934002)(77096005)(7416002)(66066001)(15975445007)(101416001)(96836002)(6200100001)(18717965001)(105586002)(42186005)(4001450100002)(3846002)(19300405004)(81166006)(81156014)(8676002)(50226002)(3480700004)(7906003)(61296003)(19625215002)(102836003)(14726001)(7846002)(18206015028)(7736002)(861006)(586003)(15974865002)(8666005)(7826002)(6116002)(33716001)(107886002)(68736007)(19627595001)(19580395003)(110136002)(84326002)(71636004)(106356001)(97736004)(189998001)(229853001)(92566002)(50986999)(59696002)(16236675004)(9686002)(2906002)(15395725005)(84116002)(17760045003)(33646002)(19618635001)(1420700001)(19617315012)(19580405001)(86362001)(7099028)(7059030)(42262002)(562774006)(19627235001);DIR:OUT;SFP:1102;SCL:1;SRVR:BL2PR18MB0852;H:BUGANVILIA12PC;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:es; Received-SPF: None (protection.outlook.com: buganviliasvallarta.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BL2PR18MB0852;23:FUHnehOihu3//0F0pqLlMHht24o66BEYMR0FwRac6?= =?us-ascii?Q?yfL1minJ1zI3JQNuuXubQGw6ipJrW4CDIkeT5opdnKXmC+oXWNVXY974bgcD?= =?us-ascii?Q?N7BOJOdmGb5qX6en4pwcYMEU6elsRLpG7SSZdtWZmc8JBwYVu52pUMRxPjJo?= =?us-ascii?Q?IS4ba3hcQAT3mDeqQBp+38RKVyY5e6kTfvSuOGCg6yV3bn5S2wnY47XbNtFG?= =?us-ascii?Q?F4fBKtYF+FK7SdB6SIcBomrl1IxV8cDT7kaOh9BwtvAikq8tr1zuHHoT/7Bd?= =?us-ascii?Q?l37/6jxPB5jRZG9k2s+7fVaYM0hvWpWfshX+TT8APtzTxFdgA/AnItmSJ9ZC?= =?us-ascii?Q?eT0hYfqPQY8UNKg2IVLknpPxFuJGaxEfD9bZn4VODZ4BAiH5s2kxQbj7SnyQ?= =?us-ascii?Q?4SjKZ1RHn+t+TUrRl9q8cOIrD27aty7uZ4hadRzETJWF81SuIoII8rX9hdte?= =?us-ascii?Q?ntgSQLMQFTFN2LPqAGPykMlwjrQiUf65/2tisYYwDzVGQdJ6W4yZMG71Rmae?= =?us-ascii?Q?fW30X3rUVN6PeBu7u+Oux/bYdMDeJQ0O3HxtB73abDdal4nCa95rr7cYZznE?= =?us-ascii?Q?emvmPJwD8n0GWZRCrvPMtpoGulMeOnXbf1j1CMZ+6KyDDXSNfIwt69jMnjnB?= =?us-ascii?Q?DrpRNK64zOywDQxtSbUNLRTVSD2xE3IfCr3/HVpHlTwZ0eu5WwIBBUaQiys9?= =?us-ascii?Q?PfOGdq50c0DzxvuJOO0GQRqYL8HwuD7Bwxl9g9yhnFP8/7cm2bg+Li99ZS2h?= =?us-ascii?Q?px02RrBDJ/3aCUEF5ivNi+cW508ocq4XPa9LfahVsibnACYLedUc0TPKygFC?= =?us-ascii?Q?entxuLmDyDNFcaBDe+iX0i/OfnwkUioJy8LXertilutx/r7noAcwFt+D79hr?= =?us-ascii?Q?1pntOkbkjFqJQVe+SR2eydZj8THoN6bStuxyCD/+k6jBv08jeDYzXaDHHDne?= =?us-ascii?Q?cNf64uDVf9xji8mHY/18ZAuvysxY4IejMdHFAtsENLj3C4K+TNvJfGaSbJQ3?= =?us-ascii?Q?Iq8aXl0EFC5hnhwgBogU/uIEX6+pyuVpHVHlIsyCJoZRjChrtnuLApnGhQ1Z?= =?us-ascii?Q?zbc2FM60GWsb8zi4VG5GI8bQOTTcg/2yXxUv2CELkmu9rq2P8qjQs3WN2ik5?= =?us-ascii?Q?sOE8HFBYrFU8uG1tgSL12kf7jMI0U59uQb3o/S5f7g53BbPGieCeZ/K7BUqZ?= =?us-ascii?Q?y4RKqB4veFcBbSWgnNaSuW5yw5oY2qOnHDSsio0YxaMBc/wXKEBpo7zev3gv?= =?us-ascii?Q?1rcwF0AtXgiJ5tRN49PU61RjHyCQJuXxfIDkwWYnit92o0RGXiGa+tbdB2hs?= =?us-ascii?Q?IrhOfRWfo6COKnxOs5npfEEz1CwOBTL9VLSfAcyusg9hcUViInWWVM3Xj9QB?= =?us-ascii?Q?DIe69QJnPY+1raBXfvWI0RWPW65AneYNjhbEF5ZzfLmYEOjE22a3yMpyrI7a?= =?us-ascii?Q?fHNkxEA0KlKWjhYI6+mE6yqf8bMN3f6YqXvWM51+CFvM3EKAKP4be6NcJ6UG?= =?us-ascii?Q?ki5MVOwHWUbLzgjAF3BKxJMuP4FSMWlaAke4dZZV4/IQX4fXaYPjnW0Uy2aB?= =?us-ascii?Q?ev4o288HpGc82px+vnokI+w1acpl4OMprLMXQ5VYPwev/gKR8FHP0yCqTKMR?= =?us-ascii?Q?/m8D6JnasUBc5j/QLsY9IEtSAKmI18w8k/X56svuaD/ETTr8sKVSZrQ2VOYO?= =?us-ascii?Q?jzFJb4GSZeRtKQ1rZXdWZizKl1XmPF5HNayXuWBB0a89m09NdOHf1fxxW+qw?= =?us-ascii?Q?GqKk5xiN4jBPmLo66NbdUrj2KHIkLp3/JGCRxf1DXgrfhuEpuE=3D?= X-Microsoft-Exchange-Diagnostics: 1;BL2PR18MB0852;6:LnInbfW3o6A0fRqGE+H9kBOKIyCszWxSPvwpbo/l/dBOBfaqjLzpgxfaq71o7Ioks1dH+sK+XaI0K17OkyYcZE5IVsp6RyONMSf6PVoyXmITxPSoqkzuAZSOim4qFv+xt+xxMkZpeX+NMDF0FpUPTN0gucmOMYl9vcWIVML/7iiF3M71ekcOyELbV72uoUS7AMLbGEj5Oj0ULmccVC7W/8GhkrOdo9N8jpkfWR2qPA+MJyKKT3dJMyWM4P9HFiLU9A3Bj/F77zhbM7GIBkBFLwkIUFYrOxRzAaFvJGFYQvk=;5:PkMh/37Rd09aEtK1ULh+iX9V8Z61Tenf3VCRcakcVjaZ/7H1bmoyy6fDven1S30BCqXVRzrjbkGu+cZInkjRkjczPvnSrYxqXhfM1cCHDen8m/oTLTTBGImCWdGwh0ofLfJIHH54BwqIq4qtqDGj2A==;24:51Q0ly/WVPVI3IzcBRiUk0Hc4BaVberwkGQZa0nDmdpCgR2mavWiR9MOMzopZUAcyVGhIacoqfH7OncG7Co/P2V6+O6FGzV7uVcXNAXJfyI=;7:rfl8yIrc9YNW7GkNATI/sQKJnigC6wDQsbwX025bJn7tDhmbmsolIVF87UZJ3HNh5cShPQLR0LZLwjA6svC9AAO5BVMsmi4hWTlYgfMZVmaMbmDxGWE+E+SecAMMsH6vhcQ++6KcdfgHLN81I43UFwX9k+iIo/f5IF7RbjZ23l6Wygt/UWNw1rUTPgmwSMtf7EmrCBXi3QFG2h0WIJ4jg5kFT8wnv1UrYNvLPO5qTieiMCd2sviMNCUoePdGORNK SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: buganviliasvallarta.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Aug 2016 15:40:38.5511 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL2PR18MB0852 X-Barracuda-Connect: mail-co1nam03on0135.outbound.protection.outlook.com[104.47.40.135] X-Barracuda-Start-Time: 1470757257 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11971 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.57 X-Barracuda-Spam-Status: No, SCORE=0.57 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31870 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain ------=_NextPart_000_007C_01D1F22A.7DE5DEA0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_007D_01D1F22A.7DE5DEA0" ------=_NextPart_001_007D_01D1F22A.7DE5DEA0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable =20 BUGANVILIAS VACATION CLUB LE INVITA CORDIALMENTE A VACACIONAR EN SHERATON BUGANVILIAS PUERTO VALLARTA =20 =20 =20 =20 =20 =20 Para m=E1s informaci=F3n comun=EDquese con el siguiente asesor: =20 Franco Aros Ejecutivo de operaciones Call Center T +52 (322) 226 0404 Ext. 6949=20 E-mail ejecutivo7@buganviliasclub.com.mx=20 BUGANVILIAS RESORT VACATION CLUB, PUERTO VALLARTA, MEXICO Blvd. Francisco Medina Ascencio 999, Zona Hotelera Las Glorias, Puerto Vallarta, Jalisco. MX. 48333 www.buganviliasclub.com | https://www.facebook.com/BuganviliasVallartaMX | = https://twitter.com/buganviliasclub cid:image005.png@01D07123.FE9BC5C0 =20 =20 Este mensaje electr=F3nico contiene informaci=F3n de esta Empresa y es = propiedad confidencial y / o privilegiada. La informaci=F3n est=E1 destinada = s=F3lo para el uso de la persona (s) o entidad mencionada anteriormente. Si usted no es = el destinatario, est=E9 consciente de que cualquier divulgaci=F3n, copia, distribuci=F3n o utilizaci=F3n del contenido de esta informaci=F3n = est=E1 prohibida y con sus consecuencias legales. Si ha recibido esta transmisi=F3n = electr=F3nica por error, por favor notifique inmediatamente al remitente respondiendo = a la direcci=F3n que aparece en el campo "De:" =20 Respetamos su privacidad, en caso de que no quiera recibir este tipo de informaci=F3n y promociones favor de responder este correo con la = palabra **BAJA** su compresi=F3n, pues de ninguna manera es nuestra intenci=F3n molestarle, si no brindarle opciones para vacacionar. =20 =20 =20 ------=_NextPart_001_007D_01D1F22A.7DE5DEA0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

 

BU= GANVILIAS VACATION CLUB LE INVITA CORDIALMENTE A VACACIONAR = EN

SH= ERATON BUGANVILIAS PUERTO VALLARTA

 

 

 

 

 

 

Para m=E1s informaci=F3n comun=EDquese con el siguiente = asesor:

 

Franco Aros

Ejecutivo de operaciones Call = Center

T  +52 (322) 226 0404       Ext. = 6949 

E-m= ail&nb= sp;ejecut= ivo7@buganviliasclub.com.mx

BUGANVILIAS RESORT VACATION = CLUB, PUERTO VALLARTA, MEXICO

Blvd. Francisco Medina Ascencio 999, Zona Hotelera Las = Glorias, Puerto Vallarta, Jalisco. MX. = 48333

www.buganviliasclub.com= | htt= ps://www.facebook.com/BuganviliasVallartaMX= | htt= ps://twitter.com/buganviliasclub=
3D"cid:image005.png@01D07123.FE9BC5C0"

 

 

Este mensaje electr=F3nico contiene informaci=F3n de esta = Empresa y es propiedad confidencial y / o privilegiada. La informaci=F3n est=E1 = destinada s=F3lo para el uso de la persona (s) o entidad mencionada anteriormente. = Si usted no es el destinatario, est=E9 consciente de que cualquier divulgaci=F3n, = copia, distribuci=F3n o utilizaci=F3n del contenido de esta informaci=F3n = est=E1 prohibida y con sus consecuencias legales. Si ha recibido esta transmisi=F3n = electr=F3nica por error, por favor notifique inmediatamente al remitente respondiendo a la direcci=F3n que aparece en el campo = "De:"

        &nb= sp;           &nbs= p;            = ;            =             &= nbsp;         

Respetamos su privacidad, en caso de que no quiera = recibir este tipo de informaci=F3n y promociones favor de responder este correo con = la palabra **BAJA** su compresi=F3n, pues de ninguna manera es nuestra intenci=F3n molestarle, = si no brindarle opciones para vacacionar.

 

 

 

------=_NextPart_001_007D_01D1F22A.7DE5DEA0-- ------=_NextPart_000_007C_01D1F22A.7DE5DEA0 Content-Type: image/png; name="image003.png" Content-Transfer-Encoding: base64 Content-ID: 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 SUVORK5CYII= ------=_NextPart_000_007C_01D1F22A.7DE5DEA0 Content-Type: image/png; name="image004.png" Content-Transfer-Encoding: base64 Content-ID: iVBORw0KGgoAAAANSUhEUgAAAtcAAAOtCAYAAABKQElOAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAO xAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAP+QSURBVHhe 7P15jGRZluaHXXN3M9+3CI89IjMyI9dau6q7qtfpbjWHo2kOORyAgCSIBLRBIggJlABBgv7Rf4IA QZAgCSIlUhKIGXKIGQ2H4mwccnp6eu+u7q69snKPzIx98fB9d3Nz0/f7zr3Pnlu4R3hkRlZlVYdF WrrZs/fucu72nXO/e85QV6/07PVMAs8k8KlKYHVrJ91a20jd7n4aHU6p1UqpMZTSwICybaS0r1E4 qM9d3rWS8JlbeOk2fy7fn6TAPHvUizwe9XvJ+5Pkd1SZ6/kedyJ6XFkp53HTepI6HXXvfs6vtE9d XqWsnXxPf9vynfc+idC2j2jchm7cVYJ7uQ+Qdmm7ks8gaeniTi4U19XNEs/ucU3vgYFGGtjZS0P3 VtPa/GJaW1tN29ub6e7d+XTt2k1lsp1OjzbTxFAjNQf202B7J+3t6L29o9920kCnk1qD+m24qbQG 08buXuroWpS9kdTF1c+7aW+vk/Z0vaOMGxRE/9vT533dEMtOw/1uXwXm3XY6yk/la/iBSGdfb//N 93X2/VT1e8iwmzr8n8yV6kC3aSmpNGmvse/f9vVclzS46obopqHBwbS8vp2mxkfSV15/IZ0+M5Nm Tk+lianRtLq8nkZbI2lkZFDlaqfGYCcNSiYeuF2VsdPVR70HcqtKyA0EbXlHqaiHa6I6dSUz1xpB 6T//Rj1pMIo9rM96N9Kg5TrQUPl9T8iuq8mB+nW77RiwmjAajUG99VfpI7cB8lfZBvZ1b6OZOkPN 1E7DaW9gJLWHp1N7cDxtqkfs7CmBXWWqjrenNLe3d1O7Lfmr3EOtZhoZbqWmJqnh0ZE0IBnxptxR nshPWbvNmbcQCXVSsSXTeNMd3LfjpwNzTOn3FlZ+1ccPl8q4qt9T+nvuytEH8g1Ok+rrjRgeN09Q 9ur+2s1co040taZpl53x+6QvyqOW8nh91HxU/428GMP8JW8+F1nU55lS7/503VWOWdCSXmkj6hij p/cmqTLa+tusfKfpGW3VXNNXhtJm/cU6rOzlnv68+vvCrm4cyflqYKXF+dX0X/+Xv5O+8Y030lde O5V+/eWpNKKCeVyo9WjrljrnoMZDQ/NSe0fjmUlX89OO1ua2xjJzz+52J62trqf1tc20t9tOrYmp dPHV19P06dk0PDHmMbG7u5s6bZVAnYy+sqdxs6fvQ4wDxrzmSCZB5PLs9UwCzyTwKUpgZWUz3Vre SNsaiK0WC2SAAS8+mpHyOh8f8kxUn1weNTF/3GIXYFafzI47KX/cPH/cz/XX+VHlqQPXx8m/gIj6 wlZ/vixQj0vnuPI5DJjUn+V34bhqlXW7Vui+YZApzMyqkHbXt9LGwprA1VbaEcgc0KIASBtSRxwE 6BpABWhr6Lc9gcy9diftd5QqYKup9AyA1XWVR1EWM3Z2GUq9BzJQBD4W8MyPgEfeAaA7GVySZw04 lUSMNBk9MVAObdM8vgJBA6bjzdcoa3x2OqCoohBYiFlwLlD/iOiDCYcpQocgiWObr3K5sl5x3O7w 8H2uggqSlR3AsFBGgF9AMUoGt2RwHwDT/4u0APJIx9dQRQbcvugQh5btkA5Zut/T6vMfXxhHP+n+ YEUwiyc398cpc/2Z0muOk07IOZeBIaU3gLq866XvB9cln/78DumCn4b4qjTr9eTzxzH+PGkBAfOV 4iEBjo6NpFOnT6aWLFd3NJ9tXRxJo+NSLgWeDYLVefebUhLVkd3eeW7ptPdTe1vgWNcHpBE2R5qp udNKA5oXO5rnttd30tbKVhqfnkyjkxo7umegM6R+o3GhNFF2G8yFFkKejZhTlO8zcP2krfrs/mcS eAIJ3L+3nD744HbakGmnOTaaWhrg++3BNDLaSC1ZxAZk+WJC5TWoGQPQI6OTX+V6PbtD1jH/7AnV oKL3bB0aHAacy73lb32yftRicVhaj4EhD0nssDQeJdbDFqxHpVHkVK/jUfcXIFDkWH+mAOcydfaX 8SiZ9edfni9gsF++GTNWVqfD5FkvA88Xi2ApE8/Y8qQPWN2q67q5LUDVaWsx0FojmJz2VrdSun8v rdy9lx7cXUxbm1tpc3sjtWSBGVWfbAFCOyw6svnKyt2RNaYji43QdUYkSkPXB7TI2OqeTV4AMhmB bK3u7GEJjd9dNn+vAVvyAPjqAQzO/DXwFkInnQL+fF2Vwsq8qwWPBbMrazT3lvYJsB0DgWf9z1Zs ADWW6/jN+eXFlTIVSzn3Lq+sp6nJkTSTJlVWyq+ytyi8TVKWW5QwZ5U7Tmk7Vm3+uQ55TEZZiiX1 iB7I5cchklqHMea3sqOLTBL9yfr3sHg3kJPeIRjqsh/WZm+TKQ31i8Yuc9CAlCpZp3nUyoYs/mr/ /f1mGsRKX008AbzrffGhWmWwWOGNXlf8xJ/q46d8rvp5lvmTZlKB0bqMS/vV6lofs/U8+uemXp+s uuRDRTow/rNsSUe6qq3A9e7Qb2Gu/9bfbQ6bt4+SR33u8jjpu7HIpcyPlZxK/+/rB3xlnJUy9af/ JO3SL9P+Z5ER3V82YvVn7QZPjKRXv/Byuj2/nN5787305tu30uUzE2lmdlK7MFIOZUjoDu2n8YlR 9/V9WZvLFof3sjAqDGqN1vrc6bRk2R4xgN7Z6aSFW/O2gLe0mzc0NpyGmoydgbQrQ8OgBlNTOz2A aRsD3Pf1u4T5DFw/SYs/u/eZBJ5AAvcErH/wxlUv2sPjk6m13U7b0ny311uihgylEW1Ft0YHBbhZ BLXQjbLoZXDEX9b0GvLr3xqrFrWCKxjYKp/Xav2vTJZlETpqwgrb3cFX/fujfuOpWhEPJPIkEz0P Pgpf9Neh5Fv/WzIvWIXt2Pr2MZaOelnLVm99K5b7uW5Dr8FYtEFddo8qZ32BKvXnLxMt+RdQXL8v YyEXP7MKekpSfoZ7eIY02A4tZSz1qRZAgCP3UXY9YOylm7c3u2lzU2BJAHlfAHn79u20++57aWtt Pe1ubcl6s5W6eg83RCLQ4oBlurPfTvvacdnb0sKEJUZpjmtbdFR9FrALWMbqYwu26Q8C3FiCtHDt aEt1V38HxB1oajEy7UNgjdJZBiocwNYUEcB1buBRUU2araG0viH6CXQEDQKs5SO6NtwcSttK14Bf jUPdkENYwQG1WVj61In1LYPsyqYki762iU2nCBrFuqgu5Mn3j27dS8NSeM88d1Lsl7aUkT3lM6iy IUTKPWDFwVZ8Lpn/ErSWyuCd86xMvOYn6GYKi9XYX2sdyh0/vjcyFcQDn3SximWQHHKz/V3KN4WI MvjRnB7FMCXEYJqXyo+lTm3Am63svbSr3QYp95p0TANQX2hKzt1mS+kGXQfWDcoGRr99a/oDJthY ZQA4kA1zTc5GhryQBwoSubrssYtRdiX6x1DGk9W4OmxuOgzMlvFTmtrlqD1crMB1w4TzOiQxFFBo LLzY6SmguPSjstlTnzOyYA/88XirXamPVbI1Vav2e5mjuc9zL3kjK/0AaORVn+vrsjLFK9/TX6Vy nZ/rnw8rs+ucf/AYqr1L/swfgP0iyzxEq+RK/mVuK3NSSbukX+rbX47+Mta/l7SLLOu/FVkCrOlr I/5xL527MJf+tX/919KfnphKP/gn/zTdv72ULlycS2dPT+iebhoTyGbsD+m9uSpDgngjw2OiQO0P mQKyvy8DwrbmBVkgJiZ0fXQqbW910/L8errx9prmJeglnTQiegi8ofam5lKt58OiUDW6IxoPGj/7 mmNpv2eW66O63bPrzyTwySQw/2Alvf3uDQGaXXE2hzWRadGD9GpLlkCIZiLBBK2RWrIEPspC2YVo xxoGZsGSrRnKgPuQCbWacPJaXRaZ/omyf7Itzx1nAq7fU0Dloyb1utSOk/7jJtz673Urcv16WXzK tbJoFTDN9YAIvVd9wq/Lq2zHehHPci316F/w6vmVNPrLUn+mAPfD0vHiDyjpE0j9O4uXeZjKDC5n 3UJWAQBrAxQ++lDD3GB9Fwhur0H9WE07G7JS37qf0sKyLDg7aVBWnSEBWKDqkBahIS0uA22BZy0Q lqFQSFeAjy1VXpYNoA0wpS+A5AaA1Z9FGbE1G6DGwwGCwWjwgOOlB3XNzBL967Jtyz0AbdLPaQ5m xBNpQk2ItLkfakdoILazVlIrR4j2lSBvl9e3PrzEc6XDdnDmeO+K8902MT3G4yDEYcCsQWMG77n+ VnwDWx8EMvVOT/8pPIqqgfoa2F8PjpSGkWnvWgBD/a8g1dIIzBNVyYoccieqOnt0LMvIuwbRaGxp U7YsQisx5oX7gnYHsky5IwA9/S7KlLF/pSh6vBVZUMwsI+scGWDzfBFFGSMfZ34o0qtavF/eWZze +i+i7XWPh4X/cLeIe+iPuR79Y/qwFuy/VpI9rI6lK1RKPX0t51lkd1Qv6avuQ7c9qUz708tTR9C8 cv1LJuXeIs7+vMr1+t/6M09atv7KleeL/Kwc6c2cSGkBzbMzM+mLX3opda6/kq6+80H63jt30uLi ZHr18lwaE+Vja4vdNuYR9XLtgrU3RHUTz7rD2MeYoI7KjtWuFmgU6aa2k7F8r6xspNX7yzqDIMrI pbOpdXI2NXXfngwTew2s4FkJHeAgFXPU4DPL9XEGyrN7nkngSSTwYGE9vfv+vbQhi9/ImLRcrE9Y lML244NQe0I+A1vb3k7aBUR4MtchIh00wlLmQ0Eas01MGYBsFifWP321ZSlPfF7YaoU7bGIra0x9 ojtqTTlsQuufFD/pJHmULAsuLOU97L5Hlbu+hpaFsb6QlYWrWKQsy9q7LsvyXJFzXa4HFp1DVhr/ XgMZZcEqC3ZeCypIeJy2cNnATbXVt65seHHmd/5icRSDY38nHwKUhXl7cSVtzT9Iqw8W0poWiq17 82licclWTtJtyarctLUFqoDANauPFpgBQLMOAbEadWWVBlRvKb2CgvfVMTnQsy+ATf8GkAN8g8YR liLSMEC2TKK2lo8BMMA686FNRYDLqEVL+Q1hfgbYYU013zssq2FDzfSSfICvEotBAb8VokhdlQll IPqX6CtaHNssosqL7V2K1uEQphZatocpd1erN9SWgqKLpRGgWD98/NgxcRyElithHieJFzSaB4Lr RP2q03oZNNdP7yHLAtZDu8koM1vbuZLlGac+Qj3pWcjJlh2DQC4G1pLPALsZujdT1Cs+vLNAPDUB FOuxu2ToUe63RV+oi+Ljgq9qTEUNe6/8xX/qE0L9nvxMNbbdZ6IORzVTPal6fuV6UYLLb6V89bHN Z/cf5JjfZc4pu1pHFfnjyqmv2ge+lvm2zHWP7cOHJJabvzrwWep3WBs/qizlt8Nk2/9cSbvIke8A YTrioHbeTp87kX7pr/1amj5/Kn3322+nxdW1NL++l8YntWMjeuaQjF3NUfXsrc3UFqfah5xJIG+f uc/rMxQ2qJoj2qlbX9lPaw8wRmhOlKX69MkTAtrDosztaucNKlu8SaOrPLqyjD2jhRynxZ/d80wC x5TAwtJ6uvrRffFX97RdBL8rBn5lOTUAigVr35YyHeDSPTBIO0LPLdFFGgLbQ1LLh5u6WZ5FvMtr 6ojSyfuCB7Y5uV5bMA7CiSh4/6RdJvVHrD9VjY9zz8eZmA9ZEw8AzqNEflhe9ckcEdW3T8skHNNv z+Jb34KtW6n65dW/+BR5uBxuu4cX5QNgI+frBSAX/gAAyen0eK1H1FzPa24PI2Z+JmgBka7ThFMt Ba0jrmB7jcOHbVE31tOKaCCL4levzS+lDVE92rJaN/fWBSJD6QNkA6UG8exhnjR82wDXg2yd6O++ tkS7pKt+C0r1dRUA0NvxQUQOSwaoNagSYDW4huMo8N7GEs4ixO8GivEuBwwBuR0JaWgwQDRW5bBS M4aUXwbMAXCVVxbTAcpBBkqA8TiKl+VSjYJoAGTF2DO4VrkA+rv6uyU6yM7WrqhaQ1JoA+ACril1 MJJ7YC4W05xhaQffEGV76MxEaf8jBout7rakR8VKv+v1x56VPpSTuM8KBzsUlCGyzz/QliErl9WT UE4cHrv7UQbWpvaEYKRSVOc3aBs8vqB84B0kVJvImOdNPapr90XeZaDlovSDzzJey7yVb3viPy5y ltWh81R9YuhLnWc9djOuKrdatjRtTrs/3cPyOWqOLG1YL0axWBfw1S+DA/NLacr895POs/0Cruf1 qHmuyLn+fL1/HlWu2pT3idq2PFzSK0YR8mVKlB3BjTkqPlyzNZxmL7+QPjc6nhrj4+lbf/Dd9P0P FtPS0lb63MXZdPbMlG7VHCaaHPOZlXsGh+Ywn2VQhx4QP3soz19DjV17TdoRhW5NFM8hca9Pnjul v/IkJONZOB3BuJA7E3PpQOsZuH7iFn/2wDMJHCGBRZ0qvnprJa1rh701MuYFzdxQlnlbgWKJYdu3 LPp7HtixUO3AiTSgwWWQDj5KI96XxUjjVoeOYsJvinA7KMCdPY4F4GZeyQurx/dTbKGnPZkfVbRH rIEPPVLqV69n/XlzCAvwyAtvcHN7SZWFtVwqVuz6JN6/uFaYJd9ULMeFn22A21fakob5q3nR9n1q U/eG/AC7EqYfFCL4EYIq7W0gpWfY9CAJjMl76iM7W7og4LS/I+80yytpf31Ti8JSunfrZlp5sCh6 yHYa1s3NgR1biBFKdfjPoBogyXVcf0CbgBMNUAy+sKGXFh1AV0fXoHVUAJaFKcvb/GKURN1jdgfl tUUWcAacD5pBAMOQg8uRrUjmL8ZFox9zh/03wKLHURaey5ZFWVF5LNcy4iLtXuOE0AHPgMZweYer wnBJty3XXKNjWhwFsJ13PqVlizxtqDFZ+kJVFl842PrVN5fvmCOpdltUoXQaPodMfD1rVN0MqrP0 DtzeQ9vRLgPMRcgVJUlvu/xjdqLd1Ej8Hrxt6hg7aCVH5qx99QkOQNr1XhlMpYP3oS/PaaUP59/K nFV17WOK5Iih8MjL/crtYXNifXwf+JzH1HHnpHrah1WpGhNZJuWeon8UC3KfuA7Ur3/u+TgyOc4z paxHNU1/Oapx11c3ZFLq1adnHacYB7pIv3yLUlL6GFZ/KCLe6HLbhTI8e2o2ff5nv6RhM5S+88ff T/fuz6fhzlJqaAduWJC8JQNCK8+BDOw9ubjsMMC1ldexMjoU5y60Lk9OiJctyggAfen2Qrp79Vaa Oncyjc2d0jyi3zTPOlePpZgz/kJYruHT7Iv72pzRFv2z1zMJfAoSWFzbSR/e30ibHR1QlLbs5Tcv +mzDdsTxYHECBRtk5LXYC7bhhgY31mzRRVjIcIO2326mXf0OVaRYUrSblUYyqjPQYjcbwyKLZ21G PGoSrFf9sMXjU1zvDkj9qMXuOE1TL2NJp26th88uRk7wBvMNlpXe3tbO2ISDpMXoVnYWyveyaOBP tZ6HMZrelcVLn1F+nE8dGAFQeDbwa+RTS9y3k1aucFgYD6ZRAe9cXgCDOdD5Pv4Ed7AhQNhIWxvt tCkXUnvt7bS7spA25hdSZ3U5ba8upQd37qb21lo6oS3OCW1Zdpp47lCfNDjLFmT6n4B3V1ZmHZwP ayXUDayT9GXAP3XXticLmXdkeEuw0AYqLx2UUdf8fClsHb0wNHI9yjgIojWLGmMApbLIudBC8EMb iVAWL9y5cStf0s43GsdUkkqcIWU/7WeCtkL5hgCVelNMDmKubmynDXHTR8WtHJ0Q9ORAYzm4aK8Z QNLeq/CWs4pcKXB1rvWTjCnL0IM97O7x+ZDRkrXHokTa4pbnkh7GR9BZ8FYMJDt466UTGwzk8x64 KvPvWZHxrBQ0IID4vhpcm+5q6zJf5V2gknwxTZf+3FfpAqzpw65SHgtV/z/OwO+7pyi3h8nX6eYf jpprfKCzNr6rPlLL57A58lFFPao+9XmmPjeX+8vf/vmnP68yL30McR36SL0sRZ6em8oYPeSpehm4 t4yzMof2y+xJ+v9hhex/vuRf/P2bOcncmG/k9Aj0tgHNczMnT6av//rX0/kL59Nbf/znaf3m7bS8 0UmjAtdjgGARtq0s6h8nTNhho/wDooVxjgTXpA1ZsXH119BhbqzcS9r5u/Hu9XRSDgouTk6l4Umu h6pvd5XZg8hfCHC99v2bafM7t7tn/js/2xiclNnv2euZBJ6iBBY3dtOH8xtpXVvqzWH4ijFYg2PK W6PXhxxAInwX9SPP/CxmPOCJyYfEAmUBWJgtsMRxxqqssTrUrOAPka6d1rNV6zTLqlby7LejPVzh oxad2rr0FKX0cHkOy79WjWPlfdhig6ywZMQhucAmAazg1OZDW7ao0i7REl4g9CHaDhAbh+uAIj2v Ihn4qB3NkQTH5XdkkN+UPFeuYBtT+sqx/FyzujKEQhB9JYPnnEYds9i6nvdDsXB3BHg4eLOrSX4L f6xyp7e1IR6hrNZbCwtp8/5CSjrAuLexmtorq+pIW6KBKDCI6EZyspe2SUQnZulHLA57mQNt3iD0 EupA4BPkFqf6IgAKqqOe43pbAL1Ff1XB7WYvy8WY2kAxtkzDMwiWU6WXg67URcaz9HWlGuOl/iqc YtrUcu1RSnpotib73J5HAR3KYWuXdocMLnNe0Fs2ZLnekCFmClrXCI2S+0seg8UAbgDyiB76sUFQ QSsWwSG5lEu5Tx8QE33XikA24VU/1jpmAeW5nwXYjTFQymzrm8cNVu0QerW7YbM248ZTWu/8R20w e7zFNHagBP5C/61pJ0e10SNEW5XzUfc86W+Pa88jWuOwFjp21v195FH96diJPsGN9TY/0I9yX3hU Hz503n2CvD/JrYdt7pW6kG75nd0vdsdaI6Pp+Vee01y4km6JcrZzX4GzpEQP6aDimLwDsVgQBGmI eY/5SaB7gHWct9yR4IJ0SJNka3QoTcyMpE25rtzVPLG6tJbWFlfToGgog0PytiNg3tHESZ4OpvRJ KvmT8Oy+OHRrf/xhd+kfvptGL51Ms3/11Z+EYj8r40+IBFa0EH8gYL0mMiwDsFgjvWiwLgUmSfsc jsp1sjswW/vyTXzXYFR8Gd8DjomN3LzNnhcqrsC5bctFMdo2u9aOjMUCyWLHQWXdawsEeef8yqRd JsTaOug7jprU61jxSSf+eh79E3H5rX4Pn4vlozR9fcLkWt36U8pWpBTfw3owJNkOQ52xNYLJVn8F qnfl53lbHLs9TZhtWWhvrm07IAo2TkemE5AcGxvQARZNuppYWzJtD3KiJUfKC1zZc0sWRlk9p+uF zpGxX7aQRkMANHaxytKOub0oKDkXQkORBUpBzyqOtTYDW103BRiTsUw2O1v7AtN78kazk9bXN2Rt XdKpd7nN0xZmR9EUt0UB2V1cTiM7WkTkEWREHkGwWo4pwVFpZ7jJg94xJAtNq+V9D5+ex72V/Tvb P3Iod22Bzrai+QG4hyWXIZ2yBVyzw0LExVYuPIoGuy+B32gLOiELFpzs7OaNq/n+THBwy5XDeuRp 7x2kn5XO6A/BDeZlPrWESl5QOiIqYVGgCoc7xlt5JsBhpGQrKmkjU7+jp+1qcdzRQoobvr1dtY41 m7BqG2CSRz7odCjNI/eHcroPCYQ18DCUGWV59Ktv1HmHhJqA9KkDdYw8TOPw/JHlG4UOlGtB8NVs arcJ98fhKwspwHOG2G65/Ch/YZPyW+mXlJk2ct60OffkInku4k075b8H6lgGrtugp1A+ThLl97pE qmrlH/vnmeOkWRQB7q0rstVmQc6wFLvMUyXtMm5LuQ6b26IX9ebj+rxXfivP19PpT5N7+589Th2P uof0GflHgdW6t6X+NOrlpUx9OtNDa88nKedhz9Ln6+UrfcHtmIVEv2SOGtWu8aDOMp1/+fkkhyHp 5rffTB/cvKeDjYNpcmgsDYyjZNNvNbLiGIkDygxqnsOhwB4RGXVwUabrNDY1kma7Q4pK25ASvpXu 3Z5XFMdJWcjntHuoqI7yPEKePtD9tCv9WUqPxWL5Tz/obnz4oNG+vZzu/7//LI1cmUujL5/8LBXz WVl+QiWwrkF3a309CaLZly+LhSfoAqL4yKKjmbqJOzPzO4OH6kAORHjSPbG1Hp5B7H8e9kieIcqk YeMdv3GWLFs5ATvkxyTCcwxmL5YsWvpbbXnybF7oyiRfFonDJvrSHGXyfdSkXp4PEBHvgGq9Nb2A Sp//0nWv5zmT8rk8Vw6N1cvQ3z0MZJ1Z4YgCjnGvxEFRgWcJfcdmYgCYfDrrtMvWpg6rbXU8IbL9 v6Lwtj/44G5a39y2hwsOtlEoDvgNy6cyfsjHdGBlcnxabTfkABtNaTMttXOTYAPZ4ouFoolHDdu6 JfNccXYpDDAyuB6W5gQIb+cDfz7ox2HCbDmN9g5gGfzg8LYBny8iJCojEpRFtSMf0BuyvKxLOdiW n+ZteZ3Z3dpQR9hWf5NPah1iHFhZTi1N9k25DRnsKvKiPUQJJKmeWxykFVgeUL0IAcwBSLt8VPla uranTobF3gcNTRWBQyiwiYIgCgptxFYpiwgeRgzs3BwA0Ezr4MBcjgTodsqgmwOSKKFQPFBwOEyI xRhw1gTsAxiVBoC5y/W8w+B+y1kFfdgjXXe84AWjGIWsy04F4DyrLe4j0UttTfXgjB0IvGIMyeLE +OHHFkqDrm9KpruSoR3SsdqSEwtuBqweYh5PpRxRlujT3BhRWBkFZUwUBTiXpNel64OhPF8GRx+U Kjzi8GsdqmZX/RzAH75acm44JIeCZjDtu1R+rHgABDsF1RW41wqUoRDpDuPuSYfih9PB4Lhj1MN6 jeyDsob7xH31l/3cb4t1OhSRqL53jFz7PA/l4ubzoR8LeNXnKcTjTaA8r+Xmy0pQrkZPwo/8ZFFX 8o4+Ul6lacrP9Tmufg/Xy1xbjPLl2Wqqyg/UQWjJqj4HlmtlnqznUz67mWq1etQc/qjK85znrF7T uc18TT9Cd7Oy774er/52qD9b+no9z1LW/vocs3kOtEX5UtaX0h71MnCPKSL6i8et2Ln0wE8jJ2fS mckxefnQwSVZm5eu30gfKtT5WHc4TcgqPS7KHIGqoD7xHK5zBzRXDeveHU5MQvfQ/DgypfGjQHDr 2/tp8eYDzxtEXua3lowPrNEYKH5qwXVHW6VLf3K1u/wH79mF1KACBaz+7gfpxv/ut9OF/9WvpfEv nHnS9n12/zMJVBLYEj/j3uqmONadND4WUw/8XE8mDG4mJH3B8oi/4WbLq3Ncj4+yisaCrJ0qT1pa 5+Pkvb57+5+PuqGAU08QYHhRQxxxlbTLvTmQgxdgfS7u+njWE0UG3F7wau1YJtf65FcmLSYoLOPl nvpiw+dqMtWH4kqKxcSBB3I+/N3x9140vbrVISBClAhQVTixrNAGd1kGxcrJwb1N8YuZ+O32Te+O LI67ss7uStlpE2RkZ10yX7OM2wJJbAHy3pc1cleW3bZ8OhNQpaOw9EQiNKhWgvg53pCniAVZtwmC Ym8SpkA0VCdtL2q2HpMgacqmQErLB+J0XVy8IX1vAz5pYKgUDoACbYKJupNOyWQypuvrymMPWoKs 4s0xgXTc3KkAdkEHRNdkDtBuKq9pnUSf0WIwPtJKI1jQ1ag7ywrtu7QiGah8qi+7IGCpJmBJ9WoL YLcFDgc2133KES8eu/D4dVgHfL5KnTQ3AlzHIOsLLINS7CaSZnB/hcYRygrWfPuTzW0hHoq2STd1 I4qilA76oT1zBBeaxclKju4v1moa0Yuc+zzgWpxtKQFtwgurfcIbhaxImqNbEtoOio6e34UDZes1 AWtkPc8wIFzF0ekiLDdeRdxfGEcAbeVDFDXvWBi4+4fsn5n70Hj1Vp7sTGzIuk87ToyOGqguq6+c kLIy2VFEVfU1Dig1pWzR3tZxtPgaXBPgRnUIa3vRqmKg+XCVIWwMlEEfdAobYRXjpZh5/WhMDMbM GbH6sCKdMw88Dh1y34AsaAbOrOJIRZ8H5Ws3wpyTlv7a9S4Nh0tB6qCdtQEpX+qLIgSpD+pIV3Na /VVAg3D2kjlnQjymOdCFQqXHx9C49B1FiDZt63l8oQ+IrFqC8XjnJs8pLn75QrszfvW3PrfVhnw8 pYf6AWKZW8o8U7euMtcUyp0BDPNsnuMKKCz0rlysQ/+QR52a5W4RE5ILFB5vojnKnFmfO0uiLk88 UgWM4T6Skg4bikY0SWV0OAogl/qSdkmjzKXlt5p4Y37M95ZncvFLtzmy7vxQ1qz6XG+P90pU06W7 EmWvz+cl/ZIfzxalopSlLifqbbCb61/K31+ww8B5yaOeXn+d6/Xmc8yoPeUuOhfzvOZXefA6+bnX 0oS8iXznj/4svfXtH0bQGPXt0+qkcwqZ3tSEOqj5iQmlIeV6tKmojLjd07y1I2ljyGmIUkLwmoXr S+mGzrQM7q2ki6+8kEbmTjiq46bOv/xUguudO6vdxT96r7H27WuNLhYayOlsfWokrfxXb6W9hY3u 6X/7640Tf+VV8Wp+KkVw6IB6dvHpSOCBTgvPL8hSqFDJo6IQwIkGzHp33YtvnoxZv/UZIOxDE3ni 5rM9KPCXiYDFRfdy3VxhvvNmgifJwH9e7MBiTPaeLzA28UO2OmYKcQAOAojElFJNjmXy8mTPO6fr BSbmHr/qkxyLWlk4+K1sxdUtNPzOhAZOK1tyTifPtA6KYZNQgA2xM/wChDmaNtcd2Q/ACG0jrJn2 q1widbiAWFF1vz3BYXG1fdVhtiMqIFv6Aq97G5LjpoEewG9TgHkXwClQoKnAgGVAkblmpucMZqOs QTPYVf6kBWjakRDX5F0DcEwx7ClBoMMeF7KZ1D7LBew3Nc9YkUHqWJ8FjmkvxfAymOssKliL0txQ 2rh8YxejgWlFf7G8cg3hmSqkd0sFnRiW5RxgLcsI/lnJS4fWkwKLWXYGvKyCcJoBPypvw4dmKW8E hbEGBvcQ4O6qCpTJAt+VRgdYi21xKCuZvIDFMtM4IjQ4lpzgp7tPUnalYiupvVcEWA3rcJwZCK8e vc+Wr3+PjmYraAa95OsWoe/otz3vPuQDv6Uz5n4VlIiwz1a0jFyGsN4GuYFfbV3nW6mXO3ceOD58 GQf5XCIUII9VFBt8bLOTkQHmEK66whId1m49k7uzh4vHUKGs9H6M8Zp3Iejr5EHIZVM5ehxnUzSc bu43lFoyCG5738t1oc3Ub/SZ9ndZKp5NHsQFidTGs+9Htti47XYxzoBYni4nL+QTlUOBQKb+nH+y isylLMvSotXPIY4AdXmMV79Fd/GLLIrsuM2g9pAylyRKmhVwK9NJrX5lTitnHEp1HhZi74q7XnmV zzkTGzc8nqNOBRCWYtbTBTz6TAX36QbmzPr8mIf0scBuSbc/n3pRrYvlG+ttUGRd5v1H1b2eTx4Z 0Sal/VivcuKl7qVHlvT76/U40HyY7Orif9Tvh9Wl6ms1edTvq9KrPvAEO5SyRsvpwOd+/ivp9IVz 6e6162npzh155ttOyzv7aVr9fGSQQ4paU9SSKN4dzmdoPeloMW/b8MN6reiMmozXZWS7+d4dKeAj 6aTWLFkPrPD/VCFLFui179/oLv/h+2nr2kJ0ZllDupkQaYCt1/o3rjd2biynzW/fSnP/1lfS2JVT x+mHz+55JoF07a2P0nd+73tpdPZEuvT5F3QgYiTtsigDq9h6x3tXBsYMQDEM7KvaY5pJQP8Dz3lr q1hF8pocp5bz88i6f+bkO+kDpvPMViY8b+vbw0NYy22YA6znN+l6K1VvFgPSFpaNyZSLWCcMPHsv n79kze+bvOr3UEd75mC9ZxJSCg47rh92FEoWcEwo623RL0p9AC9YRvGXDJ93T9QF6BxjOmzXkgCx WOKfGWulRQAwsOz0HT/LArzhqq14loggJo6wJ3DdHN5P4zOElefgKNt6svRNjNrSRnAQFtUdcZAp VxvebiVrQZeJ4MO7jgIYe9omsBVXGgFUio44dQ77jRIAX1sgjGAn+1pVIyIgHh4kawNXPWOwKfeK omjsC+RP6jt57gJgHUyIz4TV1fOav4ZID+u45Dkiq2SD6GFSDNpM8lgtZe0eVX2GZRTAz/Se6rEj 13HbAvgAplFZyAFfa+viCRqAqz4oBVocgHWQV0i/9AUfXnPjR5/hfy47dwOC1Jk5hBgLZ4A+91ED XXo9bR1Wbl4FaLt1CGvu+8JnNVK1QqXcsVbT9lYosuUXCgjysFUyXyueQShLABg6ZaCrCshnsAVQ d9RHQCNA0uCxvECFebSgLGVA7LyzBdllBfRbWVE7adt3X/QXBgHltiJgN3zZolwSD8RZBJgzrNnw 9BNptt3OjDMmgOJJJTyyhNeR3sgKC/zhcCMAZGTOn4NwPUOl4jqBVK3c5jFqMB37SORLu0T4dtIr UFJyMLhiB0JlM/iN8tLnSrj1CpySdi5qgH36UZ5X8hxmWFNEQnp5UqmUFU9EIbo6SKtPgXmaijbN sq+oMlnqR4is6gX+kPNxc9aBfbkr96fS50yFyVmW+bbXr+IhMBVlEq6qLMkxTrI89PkQdelguXIe fi7/UpSGUmU3fe2pcm8WedWDHpdX/X7u5Xu9jt6A61sP+tuipNEvi/5KlV78uPseEsYRF/rrfNRz /XLqyTCUy6npGb2n01mFSL937abeHykK430dUtxKomErsnIzjWsiZt1hbhrS2tTWwtuQ5xB2HIeh iMjavfbunfSDN25pPdlLL726k86/dCnNnJ756QHXe8vyP/hHV7srf/ZBY295O0JKF7RCt8kTDNcH ZbXau7Oe7v+//jxtvHWve/bf+aXG7K9dOW7bPrvvL6gE7r77QfrmP/odHWJYTqdfuSz3ZqNpKp1I E3NTAnI96xtdzb6pJaccZ8PA1VYuXcQ6zctblyy2BVTnvc+61aeIuiwaXpQ0gRf3b0zeXrPKwpQX MEC1gTF55ES8fZnLxSW2uEnOlmsmUz7nydsTKc/XvpfJCfBcrHekt4t7Qd3Y3taBQYFQLKg7u6Jp iB88qAloRc73l0VlYJHGIjugCcpYDDdHLicAS+BlZ9MH/3blsBnwZWuoQVl4d3CBsGh3FRULl2AY CXSJzwAp0gA8Dmpbb0jPOpAM4NHuw1A+AAdRWQDoMBzfDKyirpobSND/QQcR8OWQi66hPLRk7d1X fbp7cmUHKMlcZKLfehdBnGZ/1DM4dHJgAc87A+Jwj6fW1JhC5cZUFFH/4j4Apa3ekteArPHDktGI aCOmIVBHvQHWQ+pE+6Iw7OndVoF8SNZbl0BvLJLIknRjJyF2RYJhS8ObDgHgzVbjfRYK7ssA02HS qbk7RIAvXiUwjL8AAp1WLPOmf2RPIHFv/GbPIcWKDUijHQHPBE1SvXxIMtN68OvutPxsxqnul9mq igjdXVjkAvQVHqWRHJYk/nCPAaFLknW5QDcFTPsnlKfct4CZYrUHuKVNAZxCSvi73lrf1u5BKGRW PISynEc2SwbgrIHoaqSRfk8lLRA/KB41SzXfXReL3RVw+QDW8TVEXgPdfj7X33VgTsn3OR2D4ehk Fk2VDvfSV1AmsVqjGMVfJ2DAXXIM+gtf6cvWHaxwhsJYdh58PsD88lKC0gYWfwD0PLcUIF7Vi3KX dj1Y2VybXr3KhV4uRS5ZbCzvNGuvslUah37I1ayUgyz+/nu5jVbMovDPBbQWIFqKzpCxftWXVmmD +rOPLlzIsJ5O+R594Wi59Munnk/VR2oX6+lyuZ5vzAAH8yrfS1rlHp6tK0RH1a+MlFKPx8nhUe3e n8ZhdS9tUwwJpY6lrCLyeYdrTAD7wmsjaeLEVFpQPIAlBdzaUpCtDRlqVna20oAMOuw6DY3K6KNO u6EzLiiZY1izFKiLzcHZycm0vrCdrr91R8acEfO0fyos15vXF9Pi77yTNt643WDhMNXjgLTzLFNa iwVHFqCurE9r/+KDRufmerf97/xCY+7f+EIa4Djps9czCfRJ4P6776Xv/eN/llZv3tViO6xQqHfT mri9kwtz6cqrV9LE9FQaVOQm3Pt0IcHWJnpP0liWsQSwqGiWYmI3oGNCLuD6iMWhmuS4n2eNiAOk GSzntLLxMCZFisDv+szkUl3jM8/oAlaWAgFyklWtKQoHvTS/FL20z6QUYwrr5JaszBsCTTfvLKZr txfTyvK6APJOmtPJ6hefO637VAJFCQSMDMr3qBcsFv8MmgfwDCFh7G5vpnVxXdsC18VqXYBG2EtD gRkkCEYGIAEEEQyrA0g0eMYbnO/bbRlcBvjDm4tC30rrwN0StJJh7WoV3mgVxa4svAaIHGmTxZgp GNAtF3YNAWgbToHiBhVd8bm3bD0GjJrmYs8gsm6rXG37CBa3WBzvpC1HtAHTC5T+IJSGYiXXveQz LMA8woFKTqsrPeazhkE6Vk8d1JTSsk7AAisZ8Gg5BBgcYLYsd9cM13W/FBvyQOkARun54FIH9cS0 JHfCCANjKdKnjG5jtfQUmrty6RjeMcjgzhEUAdeV9TOAuMF4BtQRfZF7SC8O1lF3wDWc7AjMEpmQ tUNtW+EJcO3Dun4HkHfzGLFkv9ru40E3KiCWe7JLbHIM2kVeEAJkR39DwYFYZOoLCpQSYVdhR2Vb E7Aebq0rZPKwvAEw6FQW/d60VT+DfltysxcN7wBQiDwYucvjOXco8uVwqsE12089ygjDwx4GrN3G wlXRWcpCVlAV1nhkFrpZAG0ecFfMOwX8gBKF0pkRJ0pmIF64+VBdsN7nvmG+hhMLq7TKwkHb8D5S qkSbRN1j3ont9QDIPYBtIF7GUPkbzRn1oh9ktFopFbn4ubvlNs5Asm/p5p4CbMvfqHvpofmGgoJr l/s/VnNfDSuUj55nag/UbvHV+nc+M57qalY1n1qAmRaYi1masiTfn/Zh6dfv7altvWr3lydn63LW QXIls5rIqrbJmRSFAkPAYfUu17ivAFXy60/nsHrVm+mw3+tt9KjfH/dsyafQGotMPTfkTKJ9Y/w0 W6Pp1IXn0snTp9P6Sy+m+RsfpjvX5cJZ88DooOKjyAMTOitelja0g0l05bVtHY5XUJkp4YErly6m +7cUrOvqYuqui4p4a/UnHFxrdK6/czct/Nbb3S15BDFYgVR5zBc0ESxVW+/cb9z83/922r270j37 P/x6Y2j2WbCZY4rwL8Rtd996K33/n/xTnQy+rcNrIwIzojIIWG/JJ95eZzvd1dbQidMn0+TJ6TQ6 NZ6GtDOCdxAGbkc+MVmUiaoIuDYAzladjCkqwF3tzuaZI2OMAwtHmSwKkK4W1vpCwDqZv8eWbl6o dN1gHpCfF61qocqLtQ2t+XMHK14G174uq7Qt5sVyqQrsyG3Zvfl5hY3eSdfuPEjXrmtbTT6XoWLt nptKczPD2j7T4osro0yfwcq8LzoDVkymOrs98nazAOGAwKEW/o5AaVkwAUT2SW1bG9vr4qEUq50r hDVPv0rQUE5iax/IiOWcCJcZ4LHI4WkiA8BdHQC0ZKqZOoTi6TbPzg2dWglwBqyAf9cLgk2AEX4Z nRC80ElTImoOclJc6ZvuAYdcbpsA9zsCu3uuG5ZjyhM8boMgaqbrInTYO8OAT6uGhRADAEFdAMax eHfSiE6kA9bx6oE3EYKh4MUEy/MOfHECwShvg5esVZmfrXdQheBRk1iAqQI9UUAA38jR7vhUDzyW lEApdfBmDnEG2uUAowFyH/AOjyNxL3I297sCjLH099MfCqBz36Qp8jvWwoAmBri6bipIDKmob263 Mj6qvp9raQjs9qYf8FdgXsjI/SsPFtwLbkqrNG2IE7TkYW63PmKprU65YR2OctCK4RiPGtWhTZWd 5Q0grSzZfg6NImzGtoQ/ChSWZGsIpXysd2GXxu0Q/dnWY/dpcg6lDIUvfIyEatIDK8gn3Bvi+YYz CyGu3h0+wEpz1k8DugK1Saj/Y1+ZjwJeZU7MrtBDkn03PzKbx6GuvnJFbzqIzcu1cmsBkIfVjvJ5 hyjnWwe+9fuLeOq/P2FRDxXuk6ZRr+tRTVbqX8BzbVgdKEOM3oOyO6oHeI7Lsn7SMj+iVx35Ux30 l5vqbV3/zKFOlOxhjD+tsTR1clQHcDXX64DzlqzUk+MzpgV6TRNlcV07sVD1Gnp3FHBqe34zrWo3 m3McWKw3xaK49sNbP7ngmslj9Ts30uJvvdXdubPSMKiuD/bjtogmywFF4+pIQHf/vT9p7C9sd8/+ u7/caJ2dPG4Kz+77KZbA/Ntvpzf+83+QFrVdNKzBBqWBk/dtubUa1GDaWW6nm2/Icnt6Np29fC5N nzmdRrXNNDiuAxECMfCapeTGdiKbIgCQbEqoaBuxnvVevfU/ok6xRubFyZMU6yQglydYPMuT+Z7K Il6bzDKeCMtv/gK0tCWK5VULPOGz8QfdZiLxVjrWt6AstLVVziloQrTvaMscvjRAdmVtI7139QOV R9+5UWBkTnXHKj45rLRlacWzxZ4iBzbxJLEr653kBwBsKx0svISZHsbNnYAsz2FaNys4I3+sfYNc w3poTm4+QJdnUGMWLIGgS72ha+ziEFy/mw+N8ACK7OfDucZyKmDfidOU9jdta2DZ10UuegQr9wiW dnPJw+JbMEIAcKyeKpsm4lFx7wHNLULWuz0kRykQ8Gxt2VXdmKD3obwAgKVs7AvAcXc0seque4ex LCuNpuke0GYoIOULWgfuGweJLIYrPOcvBULaUgl601A7NADXUnqcrlxEmRpikyFW4fDfDaDcQ7mg r2XCbBfaQz7Ix6FOH2jUgcrS/yiDwXcGy5YrIDsDandHUysykMvXi6U7+ipu/2Rt1yAI7nf4064D 7HJw0XxfyzyWdxQC89r9jnzcdw0auZQBpcdIDAwoL1HJ3iArY8FPZfQdnjaCUrIr+W1JfuvajfDB WleMxZX6uQYBkqFFOM8YjPAyYywW2JIHZx7PPiRIid2uXMzldYchgXxgw/fnUV1QgLtUyDUXJ0sl n0fwaI2fS5j2atLwAUZkll3wcR+HXzkZzG8qP2PLIBYFOHPabN2nrLpsilVui1Bc6J+6l/5pebhY 1ctdIP9UALN/5L4sHn/MY6qMq7rRoDfWDmD7at57KM+c9MGSHONbyaiUL5fxQLlz0Us1+8FbvZn6 c0Su3G8Qnn886v5az3mkrlLPo4i0r/iPfb5U23TBWoKlbC6r+/XDCshhUi3plTrWxZqTqh6r17// vlKPh+RYk9/jWrVen7KL0NdFK6UcKp/PCekfPvsxcIxNnkqXXpqyAAYHR2utjzIc7k49fqSkvvP7 P0y/+61/kWbHhtPpi6fShjw6vff+Tyi4ZhFb/c717oP/+oepPb/eGOD0T02zfpzgH/pd0sd7wP5m O93/m99s7CkwyHm56xu5MP3EST174KdHAvd++Fb69t/9z9LCh9cU0lw8KlVtRCvMkMDNnhalUS0s Om+W1lYX07pCTt8WkFwWV2vs5GyaPH0qDU/NOHrTmEAaExgWbMCHDxxqpNtbSJ5xMZplLBnGxowH 2JqzFSdPcJZuAeJ5VioTcsZ7PUf4TOiFV50XXxJy4AeVAwBRWalVuN0tgoLgyzi2+glIsi1+Lwss YHRTEwqHBrd3t+0uDcvzDgcIVZ7ZmQnzzjvtcVlW5aYL39/iKBMQdVv+pR2URPk6YpY+ECWQw377 e+IjC/COaWJaa2+aYmF/ugBJUwRwMxaHzpDiPkBRtBtbqtm+BhRTN4QgUNSgXFIEduX/D7JDuy37 tSkIuk/KwaB4cuYEqxGgX8jua5AUBvAi5KCfIPMtKQXhs5r08DudOckZEDp0uNyk2FMFbSgAj9cJ DhDyBNxvh7uXojGoekIZ2ZN8dwlqg0xUjqbqiF9tuNUcesTzBxoZfG3TOvCKIjmzSyC1RkIUHUTA GPCNLy1A96ZBfPSVQYEeyh+u1wN8WYnAn3HBQUp7UzsM5rtnWo4p2dnK7/4JBcJcXKg0kqvlFiC/ 0EPqK3gdRHtRzmnRNFYwJIthtxeHNnHbR7tlAA0OzX3eHGqDxNi9qHQeyzyny7IHXjywMsfySb5Y o7gZTn3FKc+rq8cLwFGysLs+J4KbOfWbHJpyQG0wiOcYlCWoQOTlXY/COy6QH6UlF6LaCcg7Ali1 rfnFuLdnFypkzjf9JPoek4M9hMStlSU8V8YTRfEmYoCLMd33ZZoGN7qfRT3YyYDHDtgvMnLkRuhU HhXhOpCxM2j/1qg4mSOWx4GP+XoQhA+WAgsrjyyWRfjYjnx70KV8ow198Jp5z3WMuatiqLiN8tyG jPLcVmjsTqc+x9XQkdMqz1hQkRR9HaB0sF/kG/r+1IF8+amAvuh/PfCfs6soFrlalTXWTVBLv3z2 OMrlqgPKOtA70IVzOv1AsCRdpdtXl3L/Uc/V61cs0qVOPMMyVB1yzuXlGWTgPtkn63r2h5XpYI+I ta3Uv59b4PRrbXhY2qV9H1e/8myfrarqnZSjuBp0fZUgLvVY23GbivtBjDu4BB0cUNTFrMLWWxej GUaL1AB0i8p35kRqnpwKjjbTgQwtG0rzJ45zzSS08u3raeGfvpHaiwDr7OD38PHzRFfhW3cloIX/ 7/c82V383/x6Gj4//URpPLv5p0MCUEG++Z/+3XT7zffSAOFNW6IvCFza76/AUUMrHNbDIVk2W3JK L4JI2l5aUvjkrdQSQMRueEK/Tc4oGInA4J4ANgf/zCtlecOKpYGcz5B57AK+eeGhrQCNEsab79wP WMbyHPSMLGsWgTwhlomScjLBhL+MmOCLqzPcjG0oZPttKQJsgdsNnbxNbAnYhVWVxEX5sI9oUTw8 84UFO3blBbCw2qFoqG5n50bTtNwSEhJ2TcB7S8ppV1bbESIewkE3fQCuJxzjKDTRApWZLaVUqKHP DVyVwUOBZ8wzWKJtLgbchHN/gzwFhAm+btTf9kCSxaqKxVrCGhsbFXgW51qfd3Crh5U6z7gG18p3 C8ut/D8DRgBgsc0dq6EP02Gp3Vf9aS8wkPnNuoPy4iMZkGT8UXwsR5kIDgPoDi8Y8HIxuQJWmXmZ uyUTUAf5SKCjSnRCAQxw87erYAXabFT5diWTOKQJ3xp5diXfoaG2uOIqh+Yqe4YRCOQZAuXArx2T 2z4s2SgYvHxglCIiG6+QtANeWuQvXG2L9JqaQwFbXuSy1Tm4waFShNIQIcwrcG3Um3nGhmt5+akB EudPlrl/Bm+avhAd3NxqREN7YCHNdAsDG8qcLdLGox4z0T4GNqSVV1rDdXfZ6BCFoGHwaWSerbK+ PxeGZwwMsf5H+7N7g0rk/QR2SaxIoHzwfOxe6KROPJfr5k/xn/thuMWjjADsjEx8JdJ3zbB6o5Tl PmfaTQ4o5WsZmVTW/Gw1jx2M8A3CLVFbWjc+FXmEch4g2oIkbYs6nrLY4en76aDVuKxZXp57ilrW iN2NsH0HzHaDenxESarrLkW8+sFVAbvOhrYqKCkX3+MoukNsQNcSKLeWa/6e7y/5WWaV3GoFecTH shFQp524v+b8bfCAypezK/Wq17FeYatOubClzPwt829V1nytfC8c4FKtPK0dKHklg0Pq039/EU0R Yf+z5ff6X5ItgLSUuS7iwxSEen0OK3O5VtLJulXVd8v3Q5qz6kP16j5KBv1iqYPrskzyF8VLTE3P f8yfmkqtWMRbPbn4vWVNoS8wbv3/6HK8XG7PjSGpEVFBR+Ud5MN3bqW7K6vpzMSwdrB/0ryFSCjr 37/VXcBivbDRiIOLTyLyR4y0/FNDaXZ1an/p739fp0Ob3fP/619rNE+OP/7BZ3f81EgAYP2n/+nf Sbff/0DbQxP2FjCkmbYtXvG6DuoF8NCoFLDsyhLaaImvpWAUOk0rLwPiZS120gOtJmvaHhoYUXhV bcOfuKDIoEoL7xkttto1C+/g7isPWqzYPjAl6gi+rBnYpiTrM2dsWQjWFdCCmxySFYOTrJ/0fgA4 OuaI1O+WA9MEb5Z7tnT4YkegeVtl3yBMtgJkbIgntimgtqBw2TuO1teWNTrCPmNW58jhsFD8iKga UDnKwgyoNFgUeOSwHd4mPCkTrWopgDmUBFNJBOA6qsSuwnM3BR4HZAXfkgu9jizJrXEFsGBR59Cd 0upqAQfE4+vZLAjJBTd3ADkOwGG9tpt6veEWD4tnDN/YQTX0ghcLb3tkQpYGpbG6pu18LNhyo0c7 YaFrAdKxOgMTHL2Rcup5/stmMDMnmE9Y/A1CZFGmrQyMANqyhNtaR7urrPxzFEXJW2WlzHsEbOmI eiGLPIFMAITmqMtNUyO2LkxbaWuOaQgAEwUMeso2dYcnLXkNwIflACPgxRbNoIOMyac6h+KGAOkG eaoTyha0Gq7gicMoRm2I2drYLofhpV9JXh2ZZnak/FAPaC90LGMJ6lSB5QyuDITsuDEAVeQaACtr f3wuURVxT8iBH1ssbfnJ/GJ9b1lLJA+M8qEcUTYC89hnuJEA5YkB4VxsLnYP88VywFGtG5cLvypb bKMiAEfYP5rHDeAD8IQFNCzK5pvrOyHOKQOUJPoo+xhdIqyhCElBkYdIca/lnQVlSQntSGYoLsbM SpQInh1cRtJ2gHNHSwwFxD7YLU+iPAagDQCr/2h3QJvGD5Qi/Oe6J9sReabxZGu1KVA+Q4C7w7AU D9KvcnoVpcbiRSHA2k8/V9ALo2h2K6L80U5Y6KS4qa8OjShNpRXKSVBsLCefmo6GkF0uxkINEqHw 4YmLA4/sAKFollfuFuFysCASmtXlzV0pmiLGGePd/SmDl+i28b32XGWJpp5cL21oxS+6JwaH8tlZ RZc98hVKSP45d8ECyqy4kyY2AN1D8C5uBZhhD4idrl7SfCZ/bf55x4if7FUJAEfT5uLUHqkergPB WnGq4hdwX8RZqlW+91fVQym/s5h77ZOvk6epPjUxcc1Kbb5m1w7UlwvsPJTh2Jd+f/79AqcMBcDy 2XLJ17g3RneeAvLD9Tocll6/nOqy6C8Pa6zrpESLLDFgaTMxxexe63MZQhdAXtIt95RyRTpxILgh fNDWbu2CDQcy2mg9vfjC3E+W5Xrjvftp/p+9mXbnVxtEXHzawLo04oAcg+8LaMz/ne82Bk+Ods/9 T3+5AYf22eunXwJ3fvhm+u7f+/tp/v2rBmwttuvRbrGUZe8GLC4+FMaEKmC3LjoRXiX2ZKnelFVu R8OqvbCa9ofHtD2tA226flk+sc/Kc8bo+GiamZ3Votry8y3NynZ7q+48Nh5BTpjAhX/M1RYmVphV 6BoNgeMkjjNWYdEtRKOYkU/mGR0NmNS+lrmlXgwaOuy2KxC95UOGi4srOnC4mJalUS8vrqYtXecE NFbh/VEd5iWcNtQOVXJ6YiRNjbXSpCz1gFGClQwrbSZVLJ9E+gt0JAAh0ItXhaBniF8O2NdvRGfE G8GeLK88t6n7xpTQ5vJqWllZdzjZvekxy3RXAHxE43hfX3bw0ywNoTk0XG0b74tuwcKOfOBah3cO AQcBPpQC+6zWFQK/NDFBKHQiWJDIf4Rntp9nB8OgnABVFnOAisAZ6WHd86zJasmqnqdOL7T6nyq3 KyDkddbW9wAD9nQmOWvX0FMxgHUP/rTuh3aCIsazgKy2qCgEtmnI7/Qg4XTZjlcCQyqbKQsoLAB3 FBt4fNARbBkERMC/zqBMWocwoCdvrPOALqhJXjQok72K4IUjOAPAIlvzAeZKC/gGLWRX0Rm3Nflj OR3TWROoCYCbYj2jPl7s9SEW/R6nOgB4lCFeAbnq3jgCk3BTWPULdz98h+NxI3suyfnQb02NyAtc WJtL+lwtS28PLjiMjb4CDkqTRWZVKmFthnaSgXs9zbLAQvDHQs3eBDsbUJ8IHGTf3kqKPnd3cT3N rWwoCqtca9HfBIg53Ei0z1a7JSoV9BzRXbS4uuYA7Eyb2UcBhA6S99YrcI0cJf99XDvSVaSk2xEe ShPnM9ThoRUB5MMSCjjGul5axHvXpQl61aatDDDV1vDyUSgzAqxAOJe4ifHgMwo0dJQxul1pu7C8 D6Ck+LdQsqzOO93cR3siz30iA9862inDKjdrZd11X4q+VjpAoSG4qroe45Myxy0+ZInM8iMFTPs3 5qJS5XoXqkr28AfycZ8uRajl2dsZ6YFVq+W6GWBG/8u4s8qb3wsdoIDUwrWOsfHoV00Uj7mzav4Y gz0R5naqRNprl9p9XCygvjxfLxvpAa6pT5HPYeU/Tp3KPcjF6dXKWv9c7zKl0OX3Uj+u1+t71DNY pkte7iN0WzWEj/SQSG6/rKM9JMN+eZJnUTx6qmTUrKld0sHpyXTXMRj20usXTqYv/vqXf3LA9c6d ZXkFeTPt3F5qEDr40wLWpVEHWPQFmub/o281Wucn06l/62djYnn2+qmVwI3vfj99++/8vbRy44at zWwLE2wEGxseQgDCea3zYsjAJCw2vnC5p60VAN5sGy6lgF5XM/CuZqZ2R4f6HjxI9+QNY1JbSB0B nEFFc9pji1eeRgZwJYK1Q2BgRdbdOw829JfDVMoATwbKG5/M4+JyjcusPauDlVPKc3Zc14YD0G7I MrrwYC2tbepg7v35tLiwKHC9K0C7nJaWFS5bbu72lLbdr2lCANROyv0QB+YaoryM6ftJOcmR8Veu h1AVtLiKNtHZkNu3PB2GUVfPs6uft5UBiDPDos2gRGBRFLCGy7u1JaKMgCKBUPa7ysdUD1WTdR3A SlpYpzFDCcDbQ4YUCNI3W0OW34jvnsEbwTsADbjPlPx29HdMVkY0FD5r88DWxm3VGU8PY+LIB087 e5QwfzvoGxy8bAvo4hEtzJp6lhUTi5wX15iybfU19QMAWKbhCBjhQ5AZdHQJgY27PLVVEwXDYCC4 1R3tEOwLzDaVp9QGK0F4KIJegMfGAcxiVBMLoMBO8VMdlAIO/4ViYDwEIOOvkXAgDLtiwzIaEVZC T9APuBn0GsIBSdqSOuhH05rUd3xY0ciit8gaWmVwUazYyMoUDAPr3jsse7FhCkUIiUX48xx8pmbW iwOK9SWxtrDXVvRYvMKC2gPD8Rx1x17NOOP4ZryivLH4I6/sno90KDMcc4qZ8yiuE0OXUltJmYP6 tClFLfQQPPvQBuxGRBj6De2o7KxtK5iEomQSkVXbQ2EJ1m6IgklQzbYCJHE4NNpHidMeyAOAH+t4 tJXLkguTlxKAOJnDj7bXEH43OGdbWrVlJwqPLQbc1q68Q+RDlNEEeV0qCUaQJCthtE7ui5Xu4RIB 7jmsCAKJHZKSWDwTpleArKNlMkfkecOCipp4BvR4qbXuUStkXV9ybrmf5Wbsodf8W68fVk2dy/gw QK0oIcjcJcv31PpWTuXAH7q/+3G5P/9aB9u2wHOffuNehlmJpMsIi4NwAbh9DpT+WMulDtKOKk65 p37vYeUtzx91f8xaB4F2b9bqXa+3USWr2nMl76q8RzXqYYXsa67SW/hbwGkpY8n7MLk8KsvDfiNt 2saGAnYbCGyWM2LTDEs10z0zR1Eq+stzVHWyXud25XP0/hh3Xl/ABVpvzr94Pp2eHU8//9WX0he/ +vJPBrjuaFt76Q+vdjeuzn98ryCP6AhH/TQgv8V78iJy7z/8s9S6cjLN/OILHyOVZ4/8JEjgxne+ m/74b/7ttHTthukbXtS0fYrHBw512SICMDFo0HdzYQFeAGosiMzCuJQjTKIWLL3xKgIPlkOCCzr0 uLkrFz6LY2ltflnG3yHxk2U57sr61RiWxUzW246iPQmILQvQMguMT7fS6bmJdG52JJ3W5zNzw+mM BvGcqAreAhbKu39zJd2Sf+lbcoN348ZdWajXZK1ekIV61WAPTjSHB4cF9qd1/gLMxbZlS9+nphRl StY4fPfa6imQsCPzOIsVYbebmpE28OhB1QjAIhSPr2isz1j1x6GHCKFOSybDWB9loe+IErEsZUKR ZL2dOC4LmlzKp12DBAEaJjlvebMYcbAP87w4w8qHg4pQYrA8O4ojKxYTGkFnvJUersrwRRyUCAEO aBnchoVNbbBHcBXP2mGxBowZ3OkiATEi5Drh0vEbnbnG4Bn7/c08Ui/8BDyBOhALJrIMMIe7PwC6 LNLZmj2uXQgOJELvAExTr6CWBBAGVM9I6GMZbLmrqP2GUCiwomuJ5hCn/Q8XqyK1Id8MFQx0TI5F 34qyxCSfAS+LOhSafDjRMJXFHgUAIeaQnq6L3gaTsUIEEPRNALL4zS/uy7ILvvTBd8hVslDZihJC e1jpyOlXgNwJRnuWxalCvTk7K1Z+zpqE4Rt/HWlRj2Y86dP8FrETCsXBqUOHyNZdpJqrFIpFyT2v zOZTqs3bULngt0sxG2XnhEOn5EXfUdpbouls6nzC+Ji47goi0dbhXMtZ/bgzrr+4maQZWdF9PiDn a8hZ6pyVtkzPCJpF/sfC7P7G/BIUEcsJyz+fEAjyRAbuANGvA6xSCVILuBByQNGX8mQZcnvxB17K lqkxAGOUAJROnkJGRoahTIZGkLMAa9OXSAKaSXBsskTDx3UFkJgnI6sMQHp35oeqP8i5prMeBMUU hRxyUYqu5i4b1farePApINnFzr/VAX1/3nx3/rW0/Cjlz3l7jGQ5uBlyWQBrBaDZk5J+C//2XgIq EJbFV93bX4Yi4nK9kmFP9IcVu7qWh2+lUNTTe1xa/XnXmvvIPLmn/7n6zY/7rW61Ls2EjJHlo559 lNxoQxmMtU73LNW0n3ebaa/8l2FVaDAlPfKtA2ePt/xjXX552q3atci9mlW09py7fD49/9LFdOW5 U+mkXPI2FW34J+JA4+r3bqa171yXwSC2x35kLwaRDhptv/Mgzf9/vpnGXppLrVPah3/2+qmSwI3v fS9942/9rXT/vQ/SyNikT9o7eqGAmjydxZYki4/RDofryowf2vKmrMxe4IQMzRN0H4Wbze1asDV1 jMPL1UwwgN9rOLYC1mJnpPWugHW3KQu3Dj5On0xnp0fSC+daaUT9bnJ2OJ09NS5wPZZmp4bTxISU PfGmV+4tmB7yYGErfXTtdrr64S1TP1ZlobYyIN/b+HjGH/LEtOgj8oQzqfeoLNNNgSw8WFAPgpgA VOBYA4LYsufw3IhoIdOyyo2KIjK+LTeVrJaAu3zYo3hZMLDRM9vylIK3gSbnFQBomT5DJ8GajNUN GondfklGgyqXg+rgi1q/Yf3ZAuxq9ZIhPvjSEmx4rlAa0EyQOwcKibBKWxjgx/OG1YBKQHvmi7I9 z5TtLXJ4sKaG5HDPBt4ZAByxAjOB0l6b2r0CTMBPxhd3JB+0gVgQUMIy5UQKAPQQ+O7suKO0wCmG vz4lRWQELzPZEmzDM9ZuI8YAPHitCFBoe3C2z2ZbrmTHYVDayQASIGnlIRYQaCq2JSIb0oHug+XW 3GbuidKiFLCjED6sdeCzjOQChgAXBRYprbrHjx6CiocQnWULRaYCeDFW+DFqFl+NF/tmDX+vXeQJ lzYDywDYWRHI99ZswX2pxbpQrFVuGaOzfFsBa/mr/X4zeJGP8iEa5rB2kUDwHIDdVRvijpD9hlDq kGscctzTuQvuGzYfX/XXffQL045CMlHqKv9AbPSfouhZqWE9y5bp4CezvhWrfOY/k5rHAVx9aBxq fzZu85gljwIGnbfTzZb/jHDDjh7loq7k5V0AONz4S+GwsK4F0MjWfihTtIMVwowmXS13kJ5Q3VtL 6r0m6eXY10xHfc2JFJHxPM0TSl/Uq7wfAmKHdqzH5+tuWfLNfyvgXpqQZsyAmRSL5dPATPdA3QNc u3/XRON+n9/9xXt8yY5/Rz2f4z/1+DvrgLeU/5Mgr8NkUJfPk4BrZF76CbM8331Owkp+nEGyUwDk 31uqDwXwj8q3/Ea9632cz0UWjKMRrZMvvXhOa+xImlEU3sjZ/nc+26+de2tp5Rsfpo64bQOQDn/U L/aAtKit/u4HafEfv5nO/Pe/XllKftRFeZbf05fAje+/kf7kP/5PBKyvapt4xJbnskDav3IZoJ5t 6AsaOFaJ2Q6PbWrIt/ZmwaFGgWlHYMNKGzakeI4pGHCNhdiLhqzc6s/TOtC015SPZEV5euGlM+n5 50+kc6d1OE986IaApF2pCSiuypn9LTmqv/b2jfTemx+J6rGe7t9fSXfuLAhkL/sA3MQIz8kCN8qh t2FZUwfle7MpCok8mmDlVf7gY/i3WFmw2G2KC8x+5ogW/lmdK5iamkhnZ6bk/WNM6UD3IEohlgF8 XIuv6210HU6EZ5wtwFuKGLgt02pTOz1YGVd1YHJ1TaHMxc3uSi7TmvW2Ta9RSsqnpYN5TdU7fBFH qOzGNis+PqqxAsahP/7u8RuLmoOZyAosRQRPGQb7nsZqdAUjjbCuslsAN56XASJvz4iRXuF0xpUA Yga1Bqdc9AVz0cmYg50cJCMojaNCMoEDIDWr7wqA46IQf9EAbagh3IO3lBGVG9kPA5btbUNghg7A oTf4L3qeHteUjNq6j0N0ttwGedZw05Zbg2sCymSvE1Q1DLwGerYs22IcFtEm7W1Z0NeCBmB/13Rh 9VuCxADuK+CVVzr/yWZAe76wIkJmB5ehACakHwc9YyGLvLMwQ64IGJlaxoE+LN6SR025sTXat/SW 8TixHy+3IXk8tCJG4U3Vyffbm07Jv7RvQaEkhixoX3WKEY1X2lej2O64ALFtceDh9Q+e0HjS6f/x yVHtJMkrgJTcXW0smSOvvBxsB4DqQsY+Q/SxoloEDAhvN+E5xyDWU0iUO6QX8uQgpBVFM56YPSQ7 XOXpDdgno+Hswi/C0+edGeqdtRio2+ZbZw2y7B5E4fIhU/qTPOV08dlLH8eqnkF8NqNH+Rh/KDlZ 6FHmHtSI2lUdMdqXrItJMrddHdmUp6MPlRtKI+e2pmZFWelv79ozuYpZ6r20+pPtyyXujwkky/7g HSXd8rfqc0z3WQI6EqJ5zZtP2gnMVvj8W+l7JF8HZ4eI44lAX71eDw2Dwyr5BNfq6eXpIMPEkNNh VuZy32HyPqrZ6tdLE9TH6mFFLhZmxjVLlstSMtdnDvlzqB+KZL8ScBw5HVbWehv2enxvXqEMzDkc ep88W45Gxq4S1MEfA1p9gtbWRLT67Wtp5+aSLF5ZFXmCx5/Wrbj721/eTov/+Rtp5tdeSiMvnnxa ST9L58cogQ+//YP0e//R39ThxXdltRqyBizHZo6U18WbPODGkf4EBLFeeA0J/i3b9AbfWCVHxrUQ hTUxZmr+6mbcywkQsZztbcnFHROCuNZjI5PKT9Zhgd/mbCsNC8wOjo+lMxfHtKUkK3cLn8Z7As3t dEPK5c278+ntD66n7//g/bR6977MvFteqEGITc0w52YH0qTM0jOyeg8LYA8IMHDAjTUTYCenGfbM MbDrC+LcyruEDmBRl238KsvMemJiNF15/mw6c3ImzU5MxMTFATyAnT8SelsBZAiwIVCOhw6oG/Yp PSorqb4z8RG8ZQ3QJiCwpe10vIbsyrJNNMRt/DQLnI+Jo42Ve1WmeyA3XjaWljbF9xYQF0DHohiu 9mJ17YEuFI6gk2CBbchlYHG1NzQU2/WA+F29h7RXCHi0xwoDNikWTLtOLxBYAXvVCltf+fQ7ita4 DqvQnliB4dRz8A2vEIBqBxjByq68UKSo1yR1Y6riecqo5wY5gCm+OzIrVAoOpVqTUOHwBBKRfQKV 2B8y+VkhwLaIRRteJ2gOAMZjcZjU4dGtYAQA457gdUcfpa7Gsd7OjwXJIE/XoN0cADd5AbW0QkQZ sMfSYiuQwW1YtEtfrzyNVMC3+P1WPXjGS3S2cBqsZ3jG51i3IylzjrkA3zjK4Otx0ZZMc4jp+paV SxX9owDrnL53PfJCW9LPEq7KjcUd9RkeOv0krPooYnDtUVB1iFjttKAzBMOjOqYsLzf8Q7ljB6Ul 5bMtf+qMreAkR7nKQly5dsxxxEPeWXbZ0hb9gX6c66B2xB86uzLhtDxCtfuQIych6B+s6lakok04 uBmgFiAcsrNfd9OEUPgAztxMmliq9Zv5C+GVhmdQwHxQNLdUqU3oI4wb5M3V6KOlXaItPcCqV699 D14ruLzIp/dr7VP50X02N3EINsu39Ine36LGRNnzffWLh2aUp+mqj5UHe+lSD9PSsYYypmkjxk1+ xlkgeius+W80RVXWOmjrB32HFat+fzUujip/iOgTv8invB9VJvIq+dXLeZwC1Nu8v15Vm/V1g3Ld c5/eZR2gsIBojiDQ9W3vog24h3vpjrUC8rG/3PV5p2Sbe7e/1stbL1/Jo6RXZOI1phhzMFxt4Lbz M/zaFrBY/+EdW3nwJPCxX48czcdIldbRZLr1fXFaf+u9dPbffgaujyG1z/Qt7/7Z99Jv/4f/cbr7 3g91+K1lixXb5fQ1juZ5612DZXRPPGK8BxiVBLDG16wDdLA+6Zo9o2mBZHs4vBOEhdp+nb1waZHT A7gHa2Z3XoP6Hf52U0B1VGipqcOOQ+Iqry/sp5tra+nOwkq6eutBeuP9G+ldAev7AtUL9++nscHd NDcljq/cgI3pgNVJvedkWWNLaljeHziI2BGHuSvuc0TziwAYLM0tUTJwOzamg5EjOpg1DC9coLol sDB3YjpdvHBG1JMxWfCkTGC56+gwI2YZldPR3HFJCM0B5/quJisJeRFyWwe/pBDgihAqxJhAPmHQ AQlNpb9CcBiApr0PSLNXGTfl1QQwvKVn5uc3UntSZZZl2oAQkXqyis8B0bA24gUktu5t0dO925J7 k0POqi/hv3EpOLgnUKJzoh3zu4MugWzwWoGVOLijTKLZ6poXGOdUTc46nLkZVvBN0kVREJiOkNCx rY71GtlPSzmCpz6uecqu/jgkZwAEoCKojTjlelfh022dD441OxNw2k2HwAqMfLLV3ooZdBIUOteD 3QCE78K71PRHhy7PIw5O+o52+nbJAzDmenMwDUUx89V1kHIAGQGIy0j1h4CHkXyAXTezf8pu7Izk gnJjilQuR6QfXwnIUkUK5BbGF/N4zqzkWQcHzjkTW1FmeyAl8iqREGNHIuAA6Zq67hUxUxoM9rLi UAC/ixmWb+6jD23maE6cI2C4Iy/aN/QG3G8GVWdDkRqX5ekGbx5w89lA5bdhXPHBk9f9hY4TEkRU HnTRuyzAXJsMUsnCCkqWox/Kp+e8I4CsMmZ1ehrHKNLhlo8xGYu5i1qt/tknr73gMO/EGC0cbSsp /Od5KzyVBM0o73fkMoZ0AeDZqp7ntMjIR5oDUMdUFy8asjRYaZ78k++v31v6W3Sp3kv3UKYqmZyO Ran0yy6idzMi+2p/oCRSySMK+eiX261Wh3x37iJOnPJomISnHj7nNmH+p6C4CKX/5c3KijbS67sH wfZjStRrypo4601cPkfv/2SvuojqaR34rJuyS/6Qf5FRFi/fPVfXrh9VKut3+V3ajnvd9XMafOY3 c9z5S5/gc/5L28hxj9ejPMScHc/5MGN+JuubVbkqLyE5/bocy+dSplKGej1It3Rx5FD4257vsIXE pmwYIOgj6hSfALF+soY9ztOb783jdi/Ukk/yKr3oE/RGwqt3tB+x8kcfpRP/xpdSaw5uzbPXT6IE vv+tH6T/5P/476futZtpQuCURYRFkoUUC4UPxmVftF6nsaRhSYXDymTKhMOAzoubObc+0BJWIH4b zK4xwoVbJ42Py8e1rJoAIXwT7Mrvs6kWMi9uyqo9IIC2sraelrWQv6HQqVdv3pfFejHNLyzIv/Wq eF1D4nWdTtMjspDK+oSrriY8XoK0iBi+3d6SVVWeKbT4thribOtABQtyS27w8FfNgB/QCoCHiD3t ZwJqR8Ybae7kRDqh6FLTsp4TsXBP9JM9HcqLgBUAF0w3LLR4LIhJzHQIW9P0hiaBbV5gfhe/uRNd 8c5GRZOYtbV7SBbyIQFfAtRsEQRFZRqRxY9Fa0Xu+bZxDSdQvnRiI62vL0sm4q/bf3GsjEFnAFzk KRieKGHEAbqa1fbwpZ0Dx0BZwQoOMCV4jkOIlzMaXp0BqEyGCCPSzrkEvScv2FzF4wZgcHVd6fl+ yVK0oZkp+SnXXDCCsuS/Q/IWI08SmlkdgEf8+862FC1RYgjvDl8cMO9NQ/UzuNtBQQm+so3zygfF BDpAKHXZEsbiTv8L7of7KJKBy80sbhBGZzNIyjxwL0JqO2hJWNd1jyNM4t3FQDO2Lbuy+tsri4mt pJflYqQYoNDAX9e9cMYtB94V3cDpBpmjLEwBUAKk2ylLtKbvyDpZpR94Wqbc1AkAmScVl8HNkkG+ IR/3xoQO6SpAVk6Xz8iEXLDg+28uB/0ZKghrifIJbjYRPAH06pdYrvXgjgQ+ov7qiJlSBF/94sX0 +hcuOq1d0Z+ggbTURvZhzligT7m7Rg1DALmOlAuFo4BrbqkUkOgE+Sk/asqRxmB4g4lf7K0D+boP hpx7Bxh1VxkqhcJj4dGvOGjpRnB5PI+VVJ10KGooiNxva7Z/D1la9m6/UKCCuV9+pQ/rOerp1ony xueqB4Q88qt/6aVYRS/r/60oidkQGH0OAINBoy6wWtoVyI+q+vXY5T7LvwB/51co74B8yhjDsQLx gKgyPunXrBceL7k+eZaqxgnlKAfiCoo5pAoHZBUtcFB25ZnHPXsgodqXw2RynLQse26kX2VZlOee FJX116v+nc8lmwLWswMkX2ceMqDVX7y0FDBe+O4FTNsjSJ6rSh+o1718LmD5qHtK2Uq5StlKu5R2 5nn6D8Oo9FeMbnLo9dkF13Datj6c73Z3O/IQ8hnQAZjY9N764b20+fbd1PqVF4/qx8+uf4YlsKcQ 5d/75pvpj759Nb2q4EBDApyjGh1tBYtoydo6LUvujkb1ytqGoubhBzhb+9hCZgsV12kavfs6jGgX aFqIh/QM1qGmZl77LWahsgqrBc5+lzX6RiSUYYFPAUBmKqzDQ0JGXVEm0tqi3D7i/3gijenZ0/uL aXH3Xrq1eke+dHfSSVnWx08I1Mk7AVvDQ/vKU6m0xJFoiVs9KIu0KQSUBy8eowpBPoKbPYE1mVY6 Vk7D6tuW0rChICuziorwhcuzOriobW4WSQeYWbMPbSy8HOpsUTc92qbMqg+c6kFxNPGKgc9fgGBX QBLQzuQ3IrOOD0mRncLDsg2+r/IP6vkBqA744bPv5s0AvSeIoCigjfeHyzNpcWlGct8UD1xjX14a 1hTwZo2w3ypzG0UGX8/IVnnzD2tmw95LVDeBnbbKuKv0h8YlF3keYXt9GH62Y8Drd9Vrm6A58GRV Xrvug1/LxAh4BWx5QY3ZWbbJ1JyaVrTHsXTq9FS6cPpkmhPv1oF1jBoFsuRucUJ5rS1upnc+vCtr /bw4vLSJ6rG1kQY213WgtJXGOvJIITSrfRBvwcN/t7Ki/rK9ta+AQ5sCdjokJ2rPuOSsaqeGlC7A FaB7COv58oYXuQm1GW7UoJlYKUTxsxmSanKwMyZ6uPVNLPS23udFgDYBNBF+W8oZskBJAIziunFX FIdRERib6lM78lxDsCAvHrl/kZf9ZStv/GWjzE3Lf+MgfpXh5zttwCX1k4KSwT2gtiViKhjRYcZJ R1/YMfIiioKqA5bZmXcGSBngAaQlq318chMcSXx/DuIOOOIQgE5pmwuv3UWVCR/ro+oXhJXnXMGK FLhd3YfrPFw07gs0D4iSNadT/W99dD+9c+2edz4mZyfls7aVvvi5S+lrX7mSLl06m6blm378xGTa ur+cbnzzrbQjv9dTOmQ8gVeRJe3GSF5DTZQ41RXFQHUO2gDHmKVMyZWKlSMoQaJVGSCr3BH1MStS WXnAHSUuIS0LxlYGNvYUAoWDfspOEMpplhlIPBQ03vqfdoTsts+OmAPu7sOlIigOFm36Llc1AEb1 0K68Cu2rb7ZGpw1ZCBvvaJHeBWqbh45y6FD05pYHqMZdHxEnrfhgQOAAt8E/vsBptwzoPc4yrQKF NgMRt3kkFUA0dB7b0QqAqQClPuARgrkUMEvQaYMisshpGgTpf7hgsyJRdw1REFL/upSBeG0TyJn7 e0ZPcKnt+bcAO6UL+ON3g2bKi0Wb8ll2PQsn30sAk2I5Paoo9aJxjymE+e28o1pR79rNBQQeUrXq mXqe9TTq6fQ/X74XOkyxCvNMeDzPBqZcnnD8efSrDkZLHYoeU+qGXOtygvrBqyhbpeyWf00WZfej yCJP376j0j1r95ey12VZZFHSLgo+z1uJynn2p1cykT0r9OvcJwc+y+B6d3497dxZQWc/2Jse04if 5s8NAZX2nfW0+d07aVrg+jid89Msz7O0n1QCWmS31oKD2BqTpw65SAOQYJmBX20erJGErdAcNAse VdhtUE8zOcGWTe61VQmLtQ8usv0eW+3MuvzZ10IKFYEJyTxQgCsAS6N0COAjUAIvm+3wQSGIcYHB kdOj6eTImXTh1Ei6pQAWC9riX5NVlEONCvmoAxQjccAOeoMWb4Vrkau9ZhoXPQQKRlOL6Z4sV2xx rwtMshC0BJgm5AWkKUV1aEzu8SaH08lpRZ8EUJrWAYBmxVMW7LkZ+CktPQd9gQkLi61YGwI44SMY wNTRqgdIdVm0bU55AHqAAafLtrnS3hPAMYoiYAbgAjeBKouBIy4MVY4hHaKcEcd5e0p0EVFG1vXM JhEFsfQbXFNWbdPL6rorWe5ihUfRAXShBABAJJcxWR2nCawDX5XfVHYCgkAl2SASJWhaLTal6JlN uLX6fZigPnoPEj5c45y6NZtj6cTMJXlNGUtTMyOif4zZgtiWFX7TvrZVTzmO2NNht8HRiXTq/Eg6 e/ZUkifz1JVLwwcCalt37ygkudpHcumKYrKv5/DVDcCE0+uDdJLlzJwAnHjZRJ7syKMMB16Jasg+ iP0vC2gPSoRNBxwJ7ycOWMKbg5IAMmrl7uoK2/+0+2k+ueUw496RAAwFmqGPmi+aVyvS4QKgASBt d4OAW4O5HC2QseLrdPNMmeIugLTyjhDnIJwaKMACqrqiDJi3qmc9JvS5DkDYWam77yveNcLtHkWW zASc6TNcgPcfAUaCW8w97DDRF/ZFtWLFgwffoY+JxrEvAM9YWlvfSvcl0xW1xcUrFwSkT6WzF+dS U7zqK1fOpldevpBmTkylDY2rTT27p7GwrU62rxB8REa1cqdKQP9CSSqLga2gNunFKhtexhFmUMY8 j0Qx/QraSHy2b2uHwwvZocSHotdbAwHkYZH2E65fHDykpTn0Gm1a1qaYveJ2W1dtAbcgTWdrcEhy UAqwzk00iIrkhg4KkoPlGLmUw8GG0kaWQQlDcSDQDciSObLYMnP5onhV36rWy9q1KFgpYHyu35dr 2Tt3ETpkqXpV1yLPQLhZuOVPXRh9P5Xsna8HUP6bd4Q8lLiMrGiSXEUvEzkfiyw/W5I/pFp9OT/6 a6lGVb4nevrhm/tFUr+D32otd+DhAlwL2Czt0f9MAZ2PKma/pbveLHXxHXZfAfS9Xa1ojz6xV329 Dvar/lQrXP+10gXrXabI7KhyV/fq4TqgLzL6DJiED2+OnburqSPn/S71Z+SF1WBfVr+tt+dFEdEB F4GZZ6+fDAkIimkgbgnIKPjKyZMCohMCbisCXFqssFBr1oSvu0ZACNYfQJ+AVlncvQjm0xOO9ATp TrMqkRXxzYxpzTtnLIgsXBm4cKyB4CrhV5eZm2N1LEoRhgYuNNYerLCDcs+3LwsXfpFfODeXXn7l QrorcP32R3fTR/eWBQrU3wTSsMiNiu5BXbAwYmHGbR4Ad0vgbQ+fzZhbtOARLnxc9ZuRk+vTJ2dl 9VR0RPGtZwSUZzT6iQ7IocJY/IMnHJHZwsMB1AiHJYcXjEWKBVwrJtZXrJa4/huQSclhoekKgC5T YtjiRyyxCA/I2u5DWKYlcPhOoEogEppCg5Dhqv9m3pYPqoIUAFmgRxU1EgBtixogW40zIlALP1ZG OoNsgBrBeggnD2XFfscFevd1klN2zgA3kg0gekru1jpCFVBVLpw6aXoNAAIr96B8nNkNo/d6oVZI brMzaWxCOwHywLKxvZVuiK6zurItMD6cTp2ZSqdEEyFC5q5oMWN7o+LEw4PXTsPwfjp7biZ98M1v p2vvfSj/5btpUqBwQ9bAQQlmGJeEyoOAQrSTXf2JXtKQEDZWZeFWU49ofqEvbengJ3z+CVFshtXm wZHlwGpYnPGnPpBXevoAiMac5YIWWPwDIsdqxD2EYM8h5pv2XYVyxCFMOirW6Qgrvwt4BWl7IQsA HV5e5L4ORQ3QnEFt8HvJPgNtgB+fkSYWavOFaX8QEr8FHEOJtbW3WOBzaW0JMloulAX6a/RLuhXd BMu4XVtyrkFlsQebbC0nH5TdEYHqAY3lTV1f2dVuiAAs90+qrX/xVz6ffu2/8dV08fLZNKQ2JmiU oxKqjz5Y2khb6sfTOo/gcMkaY5v6vqPIp20B7aY49j4D0KCf9eBHCbgSPsYzXcK0KihcGRHkP3VP LJV/b88/bjTf5WmD+YTn9ZndF+YjK0XmRTOXoLxg+Q90arBXTnnlJbRwr61Dh7bk0oWU8WSC0pSv ZZCNFRoDgYNAuTjO1PnZHWDeJok+2TM7F3Bo0EUTRpPHK4ropNxty/eClPJ9GddX1m1DAbpu9Aq/ Kj2G7kOVMigu4qtA5RHosqALp205R+IFbPn4RL5uilROJ4uvAnfZ4UrFuc7VrEBrLu6x/uRq9pSM Yz11vJtKfUv9ou0r1kdpngOJVZb9mtz7c3sUeD+qZI96pvxWKYY571L+kmZ/Grk7PVYY/fcVGZR2 Kwn0A+vDEi7dtv4s6X1mwfXe4oYWHkIKP1ZOP7obcmF2Af4rW8/A9Y9O8p8oJ21+aunb8JY8HOCT 8lU+PTuRHtx4IICNszmoBeIMy4q1JUssAxp6B1Ns2W5nKQEURXCJ2BYtk7FBDGDGmCMfIGQxBOdk y5X5pIBSB54Bp7M4hs9sc5axegNMoWXod1gkHJQzbWBzxkE6dpT3sigTy2sCZFrwOFw4KSCH2zyD U/G1O9oWn5kZTydFY6AeY0pjVlSGWdV3ZmbGQGNEhDCcoYzKuorVEzoL1uUunG1bndnmxsIsy7D3 boN2EH5xY9l0sBOVHbCUSa55oQ9QELiOVSnAuv35Qv/IwCtW/5jasz3P29pY7sBeBcCh0DrKoNLE KwOAktDv0GAA04A/ezLRM2zEA8I74nbs2dOJniVIjoAVEQuHZJFGGaFeuEGcnZKXFnNmaQemUb0l U8rZseUT7i113Es3FCF2XlEvNwSsxyTD03Pj6cKZSYWLH0wrUrSv3l5NN6UATUmZefnCbLp0bjKN zIh2c/Z0mhRIa25vqIvAyUaO8ggjpWFQSsX26npqi/4izU50DABOWNnpCyASM9pVdzzYhK9tWRRx o+feWd70zlhmqsVTX+vWKC8mtEt+A0yh93jxct0LwvGFOMhF2xYzKPfrbYudwS79N5RIExjcLZSG reR9L4AVwMSKmZvc77IwVgukr4el3B8zGjNYz+Wnrbd9KJjyancGMJ3lVPoXAwiPOFxXzBdZnCVn KQqr7MBo1+fU+dl07uLZ9OKrL6QvfPHF9KUvK5qaFNCFlRVZprcElqFPyTMO/RulTAqZ6PY+QLyl 4EvQZ3Z21JfGcbv5qAUqfjNFBsHnLlbq8hB6yrIN2eTzArSXh1LI2zsLVmCReijyAXPzXIKbPt1P H3K+RtplpPXaxedIbPJnfJfdjJijSN9dwvIv7VkaLrqEx6yt10ENcbtZYXq4+d0vM0AtndRJ69ph HOp6CgXYVQCGfpi7pWWb/1dKV/ycF9BddbLcTPXiHWi5wxBSdDErMbyKXlSmtpJnzOe98cj1+r2H S+Toq4/vUU+aYk9ZcFs86eNHPFBEdkSTP2kuD92fu0h1/Tjl5p6nVZ7j5Ndf6JI/fz+74FoLjrew UAk/Sy8m3NWdbmcDL5fPXp91CQCsdwSssXdwyA3QeOnylLd+b370YVrVQrndERcTch1u1dhO90Qp 8CblLibJCEGuDX2bRrA9d+GYsqaYfAe1A7/CQTGx1RpwikXQbJEIN22DHW6+8LrBPQBq3UIXN2ix FTjS3V5dM3e0K7/VF05PiB86arCwIvR47f6GojCuCUTi+3Y3LSyKoyxwNiUu5pXnZtPnvnAlnTl9 wtNMS1bqEVEtsG6bumEsnMN1Y33HnRFmQ1m8CESCSz2AdEfcaizVYxyMhKqg61BBDHNUdgJo2GqG rOCKQkGwZ5LwzuEDgCO74kCqDvBkN5WuLM5YHm3ZNpEO7mfMhtQZmsioytGxpw2UGCx9yBP7P8Sb AL/7or6wwKIM7epBtq+xYLehjWAxl1V5cGhEoEi0FtW7JVA94oOVeDsJcA1FZ0OBeADn0ECwVrOQ 4st6QDHsoRa0xEt/TorYvJSZN27dTbdvz6cLJ06m1y7NpQuXZnTQdC/96dv30lV5Nbp2a1EyaqfX 5af8fGfclJZRAZ1Ln/tceu71l1Nncyut3LmX9r79TloWf3dTmY3gE32E8PW4dpMQcCOIC0HJHEVm U7x/W3f1xgsJCg0HNg13rJwYAcXfAh4KGqkAaRCR7C/bwCmAWgXAUCD1rfAfnbRvw4opcctSTt+G IsKJv3JIkQztIUN/4ZvGYaNi2c5WRNrV1mwQEb/FATgUTDOw+Jatp15IGUc2Dcby6L7mNPJyqfTb UsA26YtQljjfQJsVfi1jj3MG7LBoPNsnO/1IiXQ0yEanJ9Mrr7+Qfu4XXk9f/soX0oUXLqvtJWv9 fvfBQvrg9n3LGIWU/jA8PaVzDaKhSDkb0a7DlHYx1id0wFhRUMfWRfUZlgtOvEjUFvQMNSsrbdUc +GnP/3qANWbPA0oEigsgmjHlYYT82OkKWaBAUF8fNDTtJwC0/3lOiY7gRb72vSjFTod5iBkOZRlQ zNkPjfdCvbEVnnGqe02XI728C2EwXKEeBn/mXFvhooDxHNfLAlmANUcfnD0/52Xd99TQkJMufTkj FX8vXcBzbsit/mh5rvjGLjSNosNXSdSeLYLypb7V3Ndy38K1ZrmlAEq+e5MnP1rA9AEAXkv2ScFC /f5S5HKtvwo9aTz8qV7ew+4rqtOjylf067q86+lW3eFRBfkYv/WXCdkeorpXbVOy6JfdYXXrl2Vd xp+0PiXtzyS49vj1PB42lc/ai4MV1f7QZ61wz8pTSUCQS4BYOyD6f4RjCdA8Kw8Zz714Pg3/sbxa 6DDPllb6cQEsWzE1elnU7O5N3h7gGQPGwk9sTC+O9OdDLlhwgx7h4IX54Jh3SqFWaLViSeWg3IB4 mgZvvHWtDDxbJLEiKWW2pFtQAwTw8KCxJvd0TYU+nzpzIk3q0Nj61qatZ8Nyl3dfwWE2N3bkzWIz Xb82nxZXN9LPvX4pfeH159MXf/ZztsQ7fndBrrjv0vMcTtzTwTq2eYcc2psVPC/wUDRsIhaYFg2B Q09Doko4yh+WXKIA2oKNpUYSxXOK8mBrHHqLF1ZoH1ibPfsCEMKbQkOIoDFE0BT90NZiTrRBFnnT BIKPjrrKNj/gGsWBg4iDWPoFuuEmExjFhzO5j3UdPrsxh2gWyndPykwbrvKw6BnTc7bsR1TFAB1W YDgpCE8ZJUK0szYAXeWGi4wytQUnG7/U2vofVDqrmwLn46PpnCgBp56bSycFrufEsaYqN26spW/8 2YdpQDzd86dn0ylFw/yZl06n87P6XfVeEaVnRQAcLywzpy7Ir/lEar95N91dX1J/2EyTamefOxNC w/tIRwc3OWw3LPm1ZUHdXlWkTckD/9njUg524GrTFuWEVQ/lGGwHSIi/Dj5ijIOg/EMAqvwV3cae OQyiaIig9RTsZN/aErUPCtpKGvzbcGsYN8YWOYGJov+G0boonW6YCjjaohmXDPIN9A2s2QWKIevN EP8vA28eoT8UC7bydr24we0PZx36E4c6Sbc8O5AW1H5L2sUZlXJ5QVzquXMnBaYvpNe+8JI8gLyU Tp45r9Sh9e2lBbm+vDH/IC1sbKYp7QLh9nAI7r58x3c0VlxUKUJjs1Np4uRkWpNXn02lzUHbOJio ejCGspwLEA5pRJf32OcAYAyMA7KJ2lty/leApIPmoJSQPi0gLcaHFa1RhNyKf20ecv19nCCWdzcT efPO8i80HdOJuGb+ddCM4p4MjsNyEP3KbR3tHNSugozj2Rj3kVeA+OhtBxBrrna5XABIsQoXWVV9 MLKOdu5VqYiqql8FinMfqsRb6h1VKiKtgHuVUEk/XyjAvpSDv3UM0leNKt1+S3UuzoHyftwvfZL8 uMlUMiuyr5fxuOUt6nyvz+b2eUypjpt+6Qf9yVX9xeMkXuXaUVnnLn/kvfXf6+k9Lt3D8iv9ovzG 988kuKZgw9NjCnQX4WJ7OvAn6lef/OFAAal1UrxVcVifvT67EoBjLduk+o44rnmqj9LKI4O29c+c OyUe8lTaW11w+PK29n0BaQAHu6sT6GbL2QEmDFgwL7NQxmLKjG3OYwbXXmOYiAFy+hyRwuMgGNvp WK9xx4YFFjANp5JDa3jqgAIALsFC28TFmyyzTPKEYB5SAi1oEfCexQdvK+Fxgb7LZ6cMHhcerKWd pbW0K2vatLasp2YUvl1b3zKBCjcIPQsEyMSLyw957gAIE+FNBceavCHZwNuV1dRWaJxq5O1dM8iV ryKpy8uBnnXoxAC+u/reEQWlocN1+AZvKSBOV1vn4edYZUUhEQiwlRUvCRa74VxerA3VwjJGfhzI U/J4diAqHoCC2+3FQsrGgDjkpm1gxWb5xiuLLWreCghzBu0B0OMLuw+E/+aApdwUhjVPZcXS77Dg Ata6vwnAUFr4oN4WtWNZ3jgeLK4KUG/Lt/FWWt7spN/9k4/SRR12+9zrZ9NzlwWcRbmZnplwAw/K 00tnbTWdnbuYPv/Kc+n0zGB6bpqQ4o10f3szffOtD9LVd6/bW8i/9LUvpVGV+ebidroh936iZKed Fi4D2wLS8vG9Ke80qu/ZmTFZREVVgtdLlEl48LK2I0Os2bYmU58MgoK+bAE437Jg+JJBWQE6fA0r srFq7q80Dc93xCFGwSHU/Z7BVtxjrBsUdKdvd4IG7hwm7KEWJ1k3KTrfeFupiYz8N6hBGbTl3zP0 r8Blhpm+F6Dv5w2gA/xxUNbKm/ocXmA4F4ALRny7Q9t6oLbeFJg9cWY2vf7F59Orn38hvfDaS2n2 zFlFW5xx/g0deCStlfWVtLq9bsrUiRPhQtIh4l1mWdnhpktxGxbwnpibTpv3F6SU7SSdzvCuAuO5 Wlzzyv8QcEExgdfuRDNw5WMlt4IOI88eaIwJxEoolmrmC3H8e20dcqys/LYOWIOPMjnZDBfcSDwZ wWPiqUChnrsqFBrpe7jSZva9nvtOSc19qyhb0NrCZWCuUe5jKOPR9hSroFT3yQJ+S1VjenV5LaJy e+lipQruA1kniCkhQHgMgaqqRacseeUkS/EOfD3qC+KwX2veOf862LYHDf1mn8u9rB9Krt4XHpVx ua8/rSKPjwP6HlfRmBkf/cIpj+XY2yDzA/XyPM4IWprnceWpy+CwcpXy1vM+TPZFZuRX6xZV9nkK PPDb4+rwqLIf1jafSXBNJcZfP5PW3rjV3fpwQTthfa36uBb6lH7n8NHgzGia/pdfajTljunZ67Mp AYC1/EIAp4KLqGLCxeUNwMV13bmzJ9LpUzPpxupieiCL1aSAKcCMQC/QCIAQbYEu3MnZKlEAB19s CY2Uiz9kQOIQKMSgId6xeIVlEFd0WLKHNBPDmzVFhQhqXtgCNHobWIs67v6Gld+0rG62RMo63dgZ SBOc4pf1Eq7klEMyy++yFuzWy+fTFXn+eFFuw6Y50LS0kBT9RAuOwIPoIl3VAzDdgEuNFRKrNqY+ he12AARnHJNnLIACKeGfLpvxWUCitlh4O7Lod3GvxwFfpbMn13H4CWvAc0a+0DkAtvkfpjtbK8tW cwbVERADf8uqkw43timv/sGXbYkaMSyayxDgmi11rKxKHHrNLtZnW7yxroclfYg81FaDKgNuFTd3 ZB32TgJyRgmC6gKtAooL2+E6GJkPLqK8zAiwjJ0YVrj4SQG3MZdjXlFZv/3BSrrxzgdp/sZH6YKs n/u/up6ufPFKGlffEd09nZ2QIiQgvSdwrEZJ799f8wHUP/7e1XTt2m27wrsiju97ClM/zn7+7HS6 8Dr5KNy8mnd/ZzOtLi2mhVv35LlBtBBoNbKI2ue6LNQD9leMjiSZ668jL1IXMFepkylHgQBMidCz 5iHTrPyvmvm911ItprZIqy/RFdiaccRNPafYndniLWs+IcA5SGcuNOnFEkQegMrg6Oqv83cyNoYW EF1miAKODdpUJ1tQDbaLFZszDaEc+FoePYD9sHTHaGKchZKB1xGVE5qQx1iMH/aKBrVTcI7dHlma X33lYvqZr7+Wzj13Lp0U/314TIoRFvDsNjO6eBxmxW/8mPocLiDb+CmX8gONaVOKDgciZzQeJ9R+ i3D+pVh5lwWFr5gtEWOusA/UUVXK5M+Wnv7LvPOMEiy/AmqdTub/W8y6yeMGjn0AVW7lIGXMM9GP 45XvRSa8M7r2DGWqVpjWfWbEbWVXJ0qT/sSB2DhrwVgKP/ABngHWdlvJmCaLbFiI6KZRLgoVdKHo gy5SrdtVRaSYGRDXwW9Y/APA8rlYR10zt3sWrH6zCz82n9xwcd3354eKOEu/K+1xAKhV4yHkWcTn v1GF3vXagzxWezRuz81Xt8CXvKMvH0y+/HbU334gWEBgEUEu4kPleFy6h5W9yNnD/4hyliUh917L uoDQA+30mALk7v7Iu+qyPdBetbL1y+dx9a63RX/bFVkW2fZ3heOmfdR9n1lwPXxhBnd3jV0dBtrX 9ihbw0/coz6pdGrP78OF1PfZv/66gsh8wVaIZ6/PngSggnB4ES8RTP12Kq837r4A17CGabmZE3L7 Jivke3hEkOVwVuB6QotyU4s1/GQWx7ZAnIOh6bOjL1HdMosatOGGSgssYE2WTLwuxCQWFh1P0l6s zPo0qLClS/dhEacgPpgF2MY6pLt2WdgVzZAQyxPiSnOgcGtxRRbcVpoVoBuRG4kNLN6AXFlaWwKL r8g6Nyqay6yoCWzjy5xtUG2aCgszkSMFFgBv+wKye/prt2BKJ/jVssyBsLDS4zVDPFusZBycI9w5 hyThnbKo78tF3u6qgDtyFQ8VsLreUl4CjvZRqurYxZ6pIYRhFlAX+hjOrvtMJWABNu9WZcHvtE4j oshwUAxr0LhoFyOy9hIAB9/abEPjGtGLPkoCdBcAAeAchQEgiWVNx/oJu47nAm+d+wQej4RrxS6g 1a7gwtsJ9BtWU7baR1W3qXFApNzqqXwEhO3sz6aXX7okP8k76f78Qnr//TvpP/j33k1T8rry+S++ nL76C59Pf/kXX0sN0UJaU+Pp5sJa+nu/9Z30B998L917sJK+/pVL6VfF7z09paiXU5OSy0j6/Nfl fYSImFNyu4icAfy7CgAk6+mtb7+R3v3jH6QNeQfREVVRgeSrHL67wB1BeEZ16I7AJtu0vZUKOMhY WeMzVY69g0wRsAVUVn5UOX6M6CSB+GgraFDm3HIpe/PIq3lQm7SbgHKmstC3cYFXLcLm+wbVBm8v lqNTzTuNeTXtGTPp3wHSK0RCVzAKz3QJMB0pUA+V3UAvg2tjeCMfqFVxMJaC46VmCGqI/XmzyzQg 6tRoevnnX02vfunFdBFQLc87HFJkh2qvsSXPOkEz8mjVfyNj49otUEAjAWbC21uBDM6LPaasivve 0Zww1Zq2q75B9cvddQ9n79IEMyKUyfoiVb7bJSJj0f0uzjZYyclA1fKwZReqVbYaU7SyxBQlxG76 9EMcCrEy6cYz0Az3eYbEukxLDeLL3IYA2jIaxK4YXU7eMRYQNPOAx4nS9lygfhN8+Ezr0s5G4dvH WW/GWKRjPr9N01CGQm4xE1KuKJ5pMYW7nPsW18uuBl3T5SwW91zCItECwBGJA7l4ly3vEDLPZmTU q1lkX16l39ZBW5X2wVsrXYdnqGueqnO9oj4ln74m7//qe49rte0rxgHAG+vK030VcBzt1QPND5Uj ulv1zjpNpQTVrcRHlfBR6fe3U5Fv/Xod+NaVgeNI5DC51dvl00Jyn1lwTVNO/czzdnm3+M/fTvsb cqXGyYJqtj6OWJ/OPV2BLLb/p//qa+n8v/vLqangI89enz0JAKz38uHFWMpjYgNYExzE2Eyjakgr +qy8aXzhq1dkXbyRbn2wam5s8Zc7JH7lsGZU3J6N4DIN6gSLFgu9QN2OQNyA3LxBp4Afizs3XoBR bfLrHqxBGVxCRYA6IXA6pIN2xjhYiHx4C3DCMb3gdfNykBRwLpZuWSuhisDLHYAHLQv7oNhIBI+h HBygYy0D+A4J3O/r0NyOfGFDGwBj7wESRN/oCphhFYSjzEKKlXxfPN8OcX1ZR1UGvJEY3otjii9f Fi9blrVb47DqEt7SdUWN/OhOuiMrLBHtTssPMK7yGqIyEGkBi6sX97zYmwIKtQXPHKdEY5Ec2/LZ DZ/bIAwFBL422clyOKxokw3JfEzb701xynEnx4LvBZuFXiAfSoh9ZGczu4yLUkDkhQMQiiUPSywt LheLhhp63hEl7f4Pues+ozb1A9FZDCJ1raF6OrQ996Dk6P+4ZDszMpnOCKy9cvp8evnMWPrmt95N H3x0K/25Dr9tLa2kX/7LX0+v/uwraUIUowBmKp/6xRcV2e9f+tUvpldfOG2Zn5RnkimC+6js9sEq GaFwUJBup2X/1bMXTqW550+baz2sdugo/Y6I6GtyHzei9poYHnNod6JaEiwF+gygd0hWfurjkNkk LbkC6IJ2Q70DQJm/zE5B/twG6FWWUQCQygYNgnYHUMNX16FOrOCWP4DKVD0oS9B3AqDbqkmH0XXa IFzkRXRILPBWsOAxq1M6qqbHIixf3NihBvMc6dOuKGQRwAQPH8ac3u0RVUbXm6LMDGvLYEGKpQPT SFHxoVd9PqHdm8vPz6UXXn1OB0nFqz57Ur7L9bvBbCyxbcluoCFLtHYO1OUs/z0ZTva0i7MrylB7 dNe7V9Pj4vircwzLF/rwrMC47iRMelN5TJ6dTfPra2lRvrKb+FQXWOcwakOTjPscyiByYbcFyg0H B6E6uRtHWwQ8Q3lwg4UFwKgiK0bsQvhShqkGedBC9DtUL49XHo2gLXyxspORBLtbBo8o1xKwN39t duTgNa4M8aSjOUD30waODqn+NdjV2Q4B6U2oMComPvlNC7HaG30gqCRZovqL21Lap6qTLdnslDGe aGfrwhUd3GOuAGz9tZ2KeVHJGjjlOlgcMVRdPysxDBmo8hmt8VslzQKwkUVGjr6U537+GhTn+7zT wTX9rYNu8o+2CvBeAojkpNxuJG9jQq6HL+Zi1e8r1wpgrOdTnqk/W4Bguc/lze+sGldc3jporN9f z7O/TG6LXM56WUoehwFR5JA3N/0s47XI5DjAul8e5bv7b58Q+uvRL6P+upVy1++ry7qk3w+gPTZq cugvx2FyOKwsj7r2GQbXTKrySfyrr3iyWv69d7t7izpjz0gsntyftLZPej+8ToC1tgtn//rn0vn/ 5a+nkZfmnjSVZ/f/CCQgG6sGvugTGvoFWDOAmJDKhG2rh2ZTluzT50+l3/irv5juXLubFu/et1eB Gbw06OkN+MSiI+BBxBYuts9ZpMxHBkCxlrINDbghEAo+nJV2BjwdABT+iGVRw7sB4GZQgB06CuWz tQgLbLZuN0Ab5MNhJcB6mJq0/andEgGLEYK36F97Xa7zBGAHWxPexvUhJCaIriC9Ds9trcr3OrSA XE8sW11Z6xq4IMPqyCLMwidBdMRv3t3AM0YAGw7Tgertrk6gD68Z8DK31xXMRdEHF+YX03vv30jz 86su35nT02niLMFPplJXAVb2tVDvcyDPQI7FNXNBHXiHhRef2Vi51DrIjLoCDExF0CFLlXpYhzbH RLsaF6eZrf222gF+d9SRhTamcrjm7CjYE0uZ7Tlchkx0QcwZgb8t19Wi9EIf/HXziwWEwgtCdvWJ 1Q4lx8AnH+4iL7XJ0IiUEy2lQwJ1l+R3+8zPPZduX5xKV2+tpKW799I3//k3lNZOelGW7A25chmR pnBe/q9fe+l8euniqTSKQiW5E/Kdg60j6hdbUoLe/uCerJ/r6bvffz9de//DdP/m9XTp9GR6flK0 BdFu9kUzWZ9fThd1gG5IB+tG1QcWBP425KK0he9hKx1SALWjwU4LSsy2nmMnAEUNLynh4SPAbfFx bF617qXN2cnhFSG2A5Qj7KCbABxkwVc7NODZsztDO6jvoBhCl0LxQRns0o5WTMKoakCpm2kHjK1t KZot7Qy5D5O/AWQsbRF+KWgsqzobYC4191AuMkSRwgKr61vqy5yybMin+IONDflvH1F0S7GbdrYk V/UdWfqnToge9fK5dEpnKgZ0NmFbVv9dPTeoQ6EAYTPzySPIzwEUiVKpNEc0jqE0jeCJRPXmvIAV V+0gMYbobIOt0TSsiI37Uv6WH6ynyV0dOJaCafOmqE32HIQHHuSArNznUOgA2nnZr6Eae27xyp8v GkyqbcsJyYwA3DQmGOtXDhEDtAG0GJy47jFCWkHRMLSm/6MAGaHGuQVaweAaqhWKGeOPVlAyo7LK N4dEi9rQwV4pqx4P9hCjOzAsWBNX29q8jFJFH8QlKJFWUbqytTu3rw3b9AmasVim81g2UGYpV9Ez 5o++k/tkAdhFVBZDdM9QErIo6acUs1i2ixitb4S44lJBU+SbkVNlpyvfcx4hTD3CPMk0U57ttVJF jzjAuspl7/9TgFodzB5x64HLBTjW/+bucOjj5T7LO4soV+WA8lAHpFmMpcoPgV2LTg9Y5MwNyCOn X9bXuqehR9XruPV/3H11i3tpWp6pA+j+Oh5WrtKsRQalnY7TNse55zMDrrFMb19flnVuV4cFtfWm BXtInNIBtlB/7ZXUmh1tLP2Lt3XPkq0AbMcd2hOOU+tj3NOFByqLxtCZ8TT33/5y98z/+Ocbw+em 3NPgXndkDewIePC9qcONQ1jvnr1+LBKIw4s9YF2fgPhcBn9l1dHdQ4pGdkYA+/kXz5iGwIFAQMqw rFYdHVbCesfBQlucso+C/splg2AcOPJaFuAN11k+OKTvXvfyFrrDp+cZIMBMnhJKZImKfBg5efDH GmmrHmkSIhlPHw7GYUulfhS/OaxTukcLJt5A4GY7D1uqoWHoGRm8AF94+CCE9L589bYABkpjT3QU /Eg3FB56UIssrvM2RE9Zkj/3B3eX0y25kVsR93tUAOaiXNGdPSfOuv5OClzvCGgAHGNlpJwkyUKe a6FKDxKGnIUWwIc8AAYADgEqDmoOaDx5CzsHdUF2DmIiwOhUDQoBFQJqAkrGDrZE4/mDA1rBNfWB SmXMlnXwWSkLNJJsAsPSZjyCFZdIM3k7n3FNhEcrLbwi1PygrMrIemdDStWqDpMKYF8+P5VOKqLi h3e300cPltOb33w73ZUCsqNDsYCVSwo68tycfFzr+4iAB1ExO/KQsi6Qt7a6K4rJYvreDz6US7fl 9Od//mZ66wdvp/u3bqfPyz3k8osXUpPDeIuLaU2W631REC4pr0G108byundeOHqL5X5IgBXwC4cf xQWwu6VdAUKR4/0m1KyDLyueehb3hRlaVp3NosorTPRnxJC9dQCY3H7cBEKh+VBUw00iaZV/pe/6 bwaPJkaRVn5zr+kEqJuAeZVnh10h2hgLuhTRYfsgD8oIBxa3UWwJoNKVFV8eXJ4TB35Q/f3BCtEs pRRKVvh6X15YTpOnd6SQaFfFnSdLgv4B9Un3otyV17AA9LjSa+3JFeQw0U8jAiQ7J1QUqyt9CwUs VHOVnuiZKhueZejT/QCjkl/03v5GyIivDruOsbRXjaPkcvGDWhJ5mO5R+jw4uFiIayXocaQZPxzu 5QxHcNChWUFvY1dqBGqcdrr29qXosd664Rm70W7khrLgQ+BWxMJS7ncug7tJnozL3/4uaX02l9XW YspcOhDzV5bcQz2578IBSTIF5eFeBP8QoM4yKWC+aqAnRMKlGMdovYN94Mf4rQ6oS+98ZPnzlF4v cmnrfovwo6r145LR48D6p9UUP35wrdG18b076cHf/V535fc/aHTlwWBgSuD69Hgaf/V0d/yrFxqT X7uYJrXNOnr5ZHrwz95Oa9+6Zu5nA6tK1tofKSAGsINhPKZ5+VmjDfDMtDHxtYvdM/+Tn2+c+Ouf F/VR2vyH82nzgwdp+9ZSd29Bh5jWdtzthuSHePorz6fJL13Qtj1H5p69flQSCPubtoi9zEf75vm8 +ly/1ptY5AlE1sQXrlxMp8Rlfv/+vCx/Y44KiLUZTw2toXFtjxKSWgYicxcBcMFhjFDS8JcBAAE2 vLXt2RrrUgQAiUiNAO1AJt4udQGDnxiTfnCQexH1YsGMegS4CJdbEVBF5NDgDGMVw4sHlkyZqASZ PR4Am3CPbeWSRdeWcRZCfcbLAZZb0h/TlveAotIRnt28a1mJ8fu8uricHswvpXt3F0112NmWkqmA GV/+2pV07vKpNCmKB2HGqRsWLU9e5pUyHAK8hVvCmJUb+JseVzQ7tskBw0hIvw2K3tJoyAMDIFnv bYFPfFdvSMHe0aFEyoNLNHYHsGXuaOseEANsh2ONq0EUDbw4QwfhL3XGotYyGOQdNBC7eENmLmzI vSlPIoGK4iCmN7zz7xY+qGpj1WWAFtOWotHeVhCbU9NpSn0GN4Wbcuf33e+8mzbfvpU+//NfSL/w 5VfTqA69zQlcj4kvviClDfAyplDqt+8vpd/50++nd9++LvrOlmgMshRKWZk9c1K0mYk0Ihldk0Iz LnnNaydiXvLf1OeXtUvyxeeH0wlFlBxHfXigw5oqN5x3c3ktz6A84emDthwxFxf6D+8MergPvS9b jd2HovdZLzK4CfFEH9bftvoMXkEAxfZYYQCHNVo7BHoe+hJKiXsxMvdcS3Af3CIKOKscjphoWoSu q83giZNfx549APoAeF1j16Wh45SUV8aTDp5A8v2UdFBW+hEpDRNSNJ67MJf+0i+8lqbEZ19cldtC 9R246oyzpYX1dEb0mcmTaFFSHqFlEEEUPrP7ZfCt3Q9VYKzeM5MYTjQm5OYSpc19WUoR/Pbgdwfv v9GVUUU/NVQOWFXrWMYVOXWMQ59lJ6mI0LIF5IY/6qJ8xnhGYQwgWg9E05vBLNLey2ARqbkBow0p F/NBRvYF8DjTbFL11JTNjpFnTCysh+az06625muHRjswUMRQBkeha4gesk1eUjq4bheWzDdOKCuv 7ieZAuJysTMW86TDv+c+lY3nIZCi5/ZVkUf6LcEue54Lsw53AJ+HkSJEUSHx8t39OF6Vlbr/c+iY 1T3FOs5ltx3lp+koW06rGM75WrKIdnv6rxiftXrkPJ9WfsUK/CiQ7DmRd1Z8Spl45iHl5AgRPK3y PqmES/vkkXPg8boFvC7np1XWHyu4xrq2+I/eSPf+H3+aNn5wR9iFyU+TniIgdhVifP33P2oM6jT+ yGun0+xfeSXN/uar6fRf+3yaeGmuu/i77za2Plr0qAku9sNiJ3hFVwtT19ussjaLvz0wIqsFXEf8 59QGnwcK1mpxQpta6KCBnP4f/VxjWEE5Nt6+m1a+d7279d79RmdFk5BIfHEYJjJta6t299pS2r65 1D3xG680WoqG9+z16UsgmLERICYgQrzK5FcGTP/fmEi4u5lOnT2VLl86k95/8720DLDRAg5Dok30 OugCtgjCKGVRzpZoPekDTwALtkmbQfEwuHbaWJUBCmGlDWt1UEoM4LB059P70XFjAfdtXnyiXwUQ 4kOugU1BdLtY3Mx7hLLCI5QZ7jBJsJjLGoeVb1sgu61+D9i3ezFxWc1dtVswUUm0pY73jQ342m3d p1VwU2NgAZqJgMOMKBoXFBjlgrbaL0jBbU2NiHMuSokszcYLACR4zLImBkTlkFkAf4MZSkT0R7mf Q/Pg8Cdb/17SBRw5jIZvb7bhR+RtA9d42/dXZbGGmgCnVrQHHW4ENNm1n0DTPu76jAbD2hZWaw7m oRlTKKgFLPh4QQhuctBVyuIdChJb62UMe+u8rOSWPgqP1BXJYIiIligHot/siY6wfp+w7yhfsuKf mUh3Ja81eZK4Ikv+C1cupe6IAv6oDbYk72U9736hNlzeWBMN5KrA9Y10Tge2m+LP72wrHLf8LE8K aO8I1CwIgI9KJitbskILaN6SorF3VwGDpIi8LJrJBVnC7ZUmg2YOM5oRi3URXrPSMOc6AwyAYH27 3Z9zv6r4vHncmEwQOkiAPvo5IAolJQMnwLaBfNzk6z5cacQGnSGoIHCrAd/UnXv9PIdY9dfUENJG xpmjDbiG57uOxxfz0tnlUVRS3D6iLIgCMqv+cVqUjJOzY+nUySm72fMOitppY20r3br2IK2urjpc N+OXMcbh3EFRSaCtOPqKaV5B0YAyQTuzC4ClVpxD/R3RONGOhsc64DpHJdU9be9QYd0VXUhGFBSA bRRSjalRtVWklrnQWab5oq3c8UvMEUVhNsiPQZ6fPbiQxW8lzfybd9MYbSiZ+t0bZZF+ZSEuSr2B fID5yJhxk+cPfAR4HERbdj1/cKYBvnnwiZPGps9fWAGGOx4gf1+7QU6qzGui7sSuXVi0izcYOouH akZhHnJ5grZHFd7YHRBU5jLkaa5a0+vAOKSR6xECP/RVX9oPA9YVIM9PV/fkDDyPlvLxt5ZlyfBp gbDDa9C72p9PqdtR+R92vVyLHhjvsi4+QoyHFq3+3JM++7i6fpzfj9MO9f5wWB5PYoE/bhl/bOCa Q4IP/u53u7f/L3+Qdq+vNqB/wAGrGss9QANe1IzNP7+Ztr5zOy38gx+mE7/5epr5q6+kM3/jK93l 715vrH/7RndvZauBJcEn4nnMJhfNArIcjZzTCW/RS0ZPzabtd2WJe/9Bd/fWGtRXcfKyBxIme/m0 Zc2a/KXnu3P/5lfT5K8839hZWk+Lf+eb3a1372ubXE6yfHSYgyqIrdekeF0gVPvSH15tdDZ3uqd+ 8wuNlrZyn70+PQlwaA13e3FcsQes6Tb0Apa6+npSuNfuH3pjgwOWTkkRevWVS+nP/2RCXFj5FgZZ a0EguMiGvFcArktUQRly/DCtv6/tU/NPsbhB9yjADIzG8oMLNT/LKqVr3O/95VwCj3YOgQHCY5Ey zzJ3q4L7sDw6Dc+K/K4PxM3QQ+XUvH8qiwLrpgrIYruvfuqtX5UYH9edbQEEtrtVINzfrehg4pI8 kSwoAM2mFFC69aBW1SFZ8kbl6u/i+TPpnLbeTz53Ms28MJdaGkc7+IAWPYSVd3hMBw+1+FLPsCfH oaaI0pjd4GVQYcXVqyjWdACFNZi0p8N/WIWJ8tgVgB30gbURg8VtHc7EyjkkkDqsrfxRXW9rjmDX ChDNVjWUAqzXWFXNYy9AG/hmk5NKZmAdtotsxIvdB4BiXvRjU6s+BQM2sARHnfBFDnDtAKg4UCj/ 4mm8IQ8eo+mKdtT2T86lS5fOmrJyX4rKkiyp8J7F2/CuB7sh8HImZXU9c/5EevWlsz7E+K6oH4sK q76nqI6XZMHeGdtOi+Jac6BvWlE2T2vemhRVZ0n96b178sUsB9nncMenMqEkcegvvHaolTU/DUgZ sZpmd3VRH6r2sJUpfjPwMXAOQB0c4R64Dg513mHRdVuYDdzovUHpQPkMjj3H37BuCtyqfYieyUFi ADaHA3ntMDXrWTdNNpWb/633ttLehtfsEkPNUB9XnQgc1NQuE/z+Fy+fER1kxh5S2uo/KIAosNBH MJjgZWdI835bCh1vdqfsQcWUIxQP2jNoVSgjAxwEzjKIg3UBXHmZoZxlQ4F9sJPhrD7fGlesAylU HfGTTa2AGmI55X6fATG7Sh6/nlZirOMxxMO1DxVkeOy8D7w8uEvvpF8CXnGNFztlsZvGHNEPrnM7 lnxyu/qsArervlB6TPKgiGWscIovlx8nXbxQdL35IyWPwDqmhHjuw1BQrNjR2UJm2WCQJ6bCjS6W YXeHYvbUZ6gl8WxU1BvSMWQP4OeiPJRx2y8qz4VZWNVGdZlTuZ4/27DOm/vLsC9yynnn+DpVFrk4 1Xjitr4mfLjtnvBKVf4jnuv/vV7k8kgR66OyLlV+HOjs9bsnrMinfHtd7v3Nd1Sd8hJ5oGRPu/3q if9YwDXgd/H/98Punf+TgPXtlcagLFPlUEZVOPdcrH4EuZBWrMl064176fZb82n5H7+Zpv+V1xqT v/ZCGvlXZ9La9250N9+b144dpzf8YHfkhbnG5NefT+MvnlKUO/GhmRwXtX34rqLZ/Rdvdpf+yVuN jvzY+pCXFv7hS7PdE3/j842Z33xZkd7k4/a330pb79zDS4nmY1k/tOg/NBuWwjJhCtwDINa+fcNK 8al/9UvKV6vvs9dTlwA+OeQAThNjHF4sdJAyEZg5Ed3HNm3gt4Nq6s26wXe5NTZ3dUQ+a8/LInji xExa2pq3FY4FBzC0LhDHEUT+40BSLMthFcQojT9qwARWMlM8jH3DAoVVGzBpfi8u+HAFbfACLMIq qk4CbzNP7nwHSISNKl4ATvpeYOuM7FnIHN2QRTHAY6GasK3Oi+1rLNWAjQFc2umgIPftysLa1XtP oHJDgWeuzd9PywqaQrCcMQGFWfkFbsnzwYi22k+em7VrP7bMR7STwxhlix9ebJcQ4Tqoty/O7w7W eKFyeJoBXMqyHAs+VjDKbk9/kuyAxpGMgwZsHLi0dwlwsLy1bHQU8l0NA/d9dGbIAHN5QUFdFjuK UijQLeAIUDYIoJ4ID2DNYTOU6VoHMA0ESdv8n2G1VybKBTBHTjb5hVXPq3Y8U2Fs6AMjoqOozm1F wxzFg4xoHBzO2t7VlrnKvC0FbId6qKzcN47lWG4P90Uf2EceRJVUHrgsPy+r6xl5GlqTdfXCmcn0 skD5ixemRClQP1a9f/1Xv5ze/cFH6V/81jcF5OQt6dSpNHZyWlZbHe4UXe4D8bpnVB654zaVxxZl 5Umf5jtuJOmE3sVg+77/ZcATICpjmB4QKtZpLJTuVgGyg5sd9zuKJhQAxoIpQOGRZgsvKRWgCpeJ AG4Ac3gGCQ8lO4BtKFeAstzPAWfcizVbIo1DgGg1ykNR6NMOOxnsfKQ1UzXOysvPK+NnDI4xr2I5 dnRN7aasi2pz++5Kurug4FHjcuWqMxWTGt8cgvdeI0AXfdYtbVTqPrrL4d62TkbK73NbY25Xlmuq xzOcvbCy4jKHi8eWgjSNij6Cy7+IeBrBlFAqfYgvK3G27vOtUHcKSGY885NlWCgUuR/2tVmJwBgp ZXgAoOVfVhhjRqE+YZX3vWX99JRQrOPRxe0HGyVAN3IA2EYs2h0Xl5wU1nmUcIWYd+qwQTFe1CY+ vMq85h2HoASFH+5s4bdyHV5oggoXET0poek0rJX8ZbjWzYUub+TDy2O7yImP/StpeTYaM+pLfTIY t75fnsvP5lui5zHMowuHZC2L2ueetJ12AWblL7cW/aCkkZP6xH9KOUtC9aqXcVvy7xdLtPajXyWN clc9zU9c+J+QBEo7HkdeH7dKPxZwvfzb76Vb/7c/aOzckueBw4D1IbXBr/SgtkQB2Ztv3mtsvr+Q Vn/nqtzjvdKY+MrZNKxADevfu5F27290x3/mfJr7K59Lo+dnDqQ0fE6HZM5NNfh99HOn053/6x+m vaXNLpbw2b/x+dS8ONXd+PB+WvvhbdE/BLztnshxro/1Mj1FC83Kd26KSjqcTv3mF3XS3P6enr2e kgS0DGsuJfJiAdaRcGmiApHCnh2gGlY235lwtX6G7wrNjCOhiDmlIdEo2BbO8MqLKt4X8FrB4Sev i6ZzhJUsDvjICiz0sCOQhZuxJh4R8JqQ7/XWKFkYc8YU7EVQOx29F4th+JDFIljN/LqBBc6M2kIh MVDBWqhnMniPRQJbdN65URrb4ki3BTYGtQ0+IiAwrL5IGoNwtcVLFVE0tVcJF95Ncxdn7cKM7fWT AtMNdnOkKI6I/sGZhg0d2t3kUJO8VwzJgjogN2jDUkuwee3h3UH93X7BJbsS/j2QW49GYz61QGgD mof8CuJajYUbsE9wFD7jxmxlWAu1IhzOnTglQKl8xLteWVlPW1KC8f09LiUBED+oxsRKG8wY/S9T QwzrAZ1sm+OX3jxwzGJqw8AxlrPxBM1C5MNs3uJ3W9Yt0LBRxWIr8CQ/3HsCcdDJRsd0aBFKzbYs rTLgr4tz/aHA3L3bClV/9vn0i69dSafndMB5QsqBlK81udXbEDg8KXrbWdEaJiXbB3cfpOsfDqWf ++IZWb1fTiui5ryrIDIT8r0+qsPR23puXL60z754Lt2TcnF/QVQ07Ywti352aridnp/FL7cC7TAn ZjACLxzZQH0AwIKRomr0SYnIukdGFH4m2qe8Aq4V4Bl0Dr6jODp6J9Z3lCt9t0s4zrsofXyVbxpc h4AN3N0ksavAUePYsQCoBlj320WIfhC8bhlP1B+3pJS0JethKW8cngVkbYk6syKF5NrtuwLQimYp WtDlSyelfEymB5LPOi7xANqiDH1w4758jK/Lm8dYuqgAMuPT497BQTFssnuEX2r7p5dc3Id05mdr XYd119KoggcB7gHaVnKpn4jVA4Ny2ZjHIW0/PCL6ks5ibC+v2v/4vvjKULKGBUrtX53neoINq3ls gFR9zxYYWseN1GuHChyrXFmdzill6zBpVHyK6M8Gx1n+bkMrERHgyu3v//fmSCv3XIQ2ad0Tahc7 QCo1ANvpRzsWwMr4cKh3tBOCx+xpXcMbkdUUbsZTSBQVS7Y3AZjXJHND//yj5QjAR0w5DxsWMig2 Zs7pWDK58HVwXZeLq12s26XMlDXLu1oYokq9MtJHS3sU8cewz5XIxSiZ5TnjgCCr0fN0PpQ26vWG h9Plt1h5jn49Dq7U8yljvuT5ccD606n900ulYIDS7+spl3o+qr5PqyQ/cnC9+e6D7t3/+x81tt5+ IK8EOP9/XFc4WFUAb0Nb1hzO2vj2LVmX76fxL51LU7/xUhp/7Xwa/+pAmvrKc43RMzN+UEBcByZv ywLdTiNXTnYnfu5ig9DlZ/4HX5M3kuGuDiem4VfndFBpN6389tuNtrZ7bXEzZeTJykZ+eDtoyIK+ +ufX0rAm/xO/fCWQ3LPXJ5ZAnNTvhTQvCfYPFCbcMvlkGp+/c+DL+IN20k07WtBv3l5Mb7x1PS2I AuRDWhwA1KzvAAxKuFhdAqmEjTwOOIXlUHDQBBUWvCHcC9h0FduztmHrKxzkYEa7h1R/YisXC0+2 1BjQlN/zVrcRJF0xrpM3gLZa+VhIxQMxDM9mG9zp2WWl+KbcD++aBbCNpVUAmzfR/1773HNp7vRM mlGAk1GUXEKWa5HFA0Ib92VKYlSAryN+JRZquyKTEsJiSPCYIYH2cQW1sZutWv7IBcs6EgDceisc LyA8x2JM9Du44KKGkR9uwQZV5nF53Bk6MS76h/xBk65cI45PTqed1XV56pAnIVkU8QG9K/rOMEFN 8MOcqQWFGOQdAQxwBM1hZ0CgCx/f4WAcCQIkQs4BmEK+GEKjbeK7DwLiJQRqAYBK9A+oIXCkbR3W 9nhTFBA5aUsDCml+f35DfWlZ/WcvTYq+wu/z6/jfFmAUAPvTtz+Q27ZNcYPX05o8jHxnbUleV2bS 669fSHdvz6fv/OlbigJ5Jy3fX7Hy8d/8az+ffvmXfib9Z//Vn6T33r1pnjrzHrsMi+IXK2yQA+zQ RliseeOX20DDZ7ezhV7tAvyhD9rjjOuX6w7ok8ACRAXo2XOH1/WMku3yLZsbHXobUeo7lmtzfkmL PEGltLcfD/863t2J5Gxd3vXhx/B/bRnnMdRW3wL8olxSh6b+nlaExZcva14XjWZzazPdu7+Ybtxe EAjeSt9686M0MTWaPqc6L8mDyor6x6XnzqQvXb5gi/Kb79xIK6Iv3dPBz1kdAm3IBO6NHJUPf8zi EMZY8niS4qdDvquyeu/jr1nGFKzRQUegTuG2DmstwNl8cCnR+1L+RnTvLgcvAZmxNeMxZMl4jshd ChBPP0UWyBzluIYg3Q8L8utbctxiGeX6p4yuKFkBp25Am3rZ1Yp+zI6XgTXKJL8wLmg7PgOSfS08 fPAc/s+hV/V2cnL6bu8Mhl0WasdBWq6hFEtpYgfPrgrzCLJbxlyWugIXIohXFk+eSsOSXywb+SZ+ 6/cjXR4/IKbcrasZNs/b3nCo5VMpDK5HFnlJsFYu0/1oEnRC5u+eeK0kFYt3KW5/Ep/292jph191 mfR1o4duPiqNj1P20s0/zrOf9JlSjzrCKnWv+sMnzeRjPv8jBdcdHSpc+Nvfamx844ajXMUE8PFe RFdrYMkWkF1TehvfvZumf/OVdOF/+xsBrDUqFv7+97t3/p/faGx/sOTFYmBqpDH7117rnvuf/XJj +OJ0Ovnf+nJj5U+vpoXfez/twaHUaAEEPCng768BFBEORi7/ydU0psNgI8+f/HiVfPZUJQEs1rIx 6XuxST88wZTBFEtizNW8iDnA/gHf7Sbdv4t/rEX0rbc/Sr/1ez9Mt+8tpTkdkd9sC7xrRp9SkIkd oRTYBrGwiq4AqNDyMOQtU1nCsrcDexfQgb5Rb7Wy0Ia3EazUewJ3duoGQ8AR8Ww34jSXQp2zjczM HYeDsD4T3MEHy/KEbnd7sRK6BraMZe41oNrR7ABQAH0O+invlqMsisaBBZMok6I0eJFQzljrW/iz nR3RITpxhKFa6N4ulkjd05Zle315zYccR/aJEilaidyTwdFur6jOE0rb9AyBzoa2x6dmTaJlHGJx hI7isw8omcoL6xCs7z3ROgysbNmUDARMh0VBGSY4iGZDwNWUDpeOy40d9aQs46OKmjmDPGUdVJhw LJy7Ch6yde+eDhbK9Z0OF26qbg2h+yFZPe3aD4qOAp+MSWHY0W9s2XuRxNUYdde8sae64XkE69aI LNFktiPlGu7ssMoJ0KcBOrLMt/QwB950ZtW0rx1xfN02CiKUWh1F7WvKN3VK1+X3+u53vpcWvv5i mvvaawae1wWkObCJJe+Ht29r52AlDc+Np9e+cjm9/cbV9A//wR+nP/j9CfkOX053P7qddgS63f5K f0WW+lsLS54n8UC0rjJPi3O8Lu8qP1hdSRdV7hdmFcFTz4wJ0M9KNlNjqh/l1i7BsNpgRcJelSLC hv0oVBtZg/HDjXKGEjAg7uwGvHbVbUS8Fazh61IEOHsAxcW6n6z7+wJPhEHfxRqNyVn1GeLAIMoG Ozey7LI74P6jQ5/b+m2DSKBScHiGt/nRUtiQMZx++iuHaAG70Cw4TNuVsjAletaE6js1LW8szXFR lWbSl7/wstttS2W4Iw8qdzRW1XzpnasP0rgUvKaCn9yTgrPf3E4/87UvpJ/7lZ9Nb793PTVF99iW EgPgHiYATENBmKQ0Q4WAO2wfHpLT9ITcSeoA6Zr6/pas36MKZjQoAE1DDIjmA2ub7kW4d/zVt/ew cI+mSblm3dq6mrZW3lLQH7mpnJR81C/2h8a0K6QDqoxL+o92Z1BiGOueowxyMwRAxnwsSM0gM6z9 xRJc9yYS2g3AFQTJOBGQxuxrDx2hqAeS1lzguUT/7PQ56mpuOjMQQ1TnHbqepzROCaAj5XVMfVpu vaNMSkuM9gj+wtsKmt4Io0NEVskUd32iNdGnnBeglXLQf3AsYqVbMrDFO2TqtADpBuphe6p2loqF n2pmi3T5W+kgyND5RJIWX/5eKCI+fqUfrNNk9Oc/3M+9WeZZ56lsFRY/rCTPGfjU92IRreU+EOtH QS4Wd+07t33cl/vGEa8CGGPtOvxVypKbrtLt6Frlef7Sng5rUPreY+ogG03R6fy35J+JeD2F6RFl f1TdPq68eC5688OKEteKYa3cU2RQf65+7ZOU47Bnf6Tgev1PZSH8R28ZYHgB+6QvOgcHGfHzurIp EKHodPbbq8Xpj66lm//nP2xsv3XPCxTaevvOWnrwt76VmjOj3XP/i7+kQ5TSwAUUOnKx5a0qaB1P 6QXA3pXXk6U//yid1iQ8yOGmZ6+PJYE6sGYhKAO1DKr+RD1B1t55bvVBxDLQmBwhgWzIEnbz/rL8 A7fTaVkGHU2tSZQ9HVxzWGlSxyotMA71QzNSAet2ZcYC7DuiVGaAs/bIwohdu6lZHpdjnX2oCZn7 yAIFdcEmxt60Awz3VioACaqEfwKwZzWB/JQesMBLVLb8+T5QrMAMOzqoAOZ6Ayw5UaYFdADLOmOF fqixgIVuUBZW82IplyzSLVkNzVEW15zIgNubSks838kZ+VmW8gB41h+BYnnPAJBj3uGEWgPaSba5 q062oBOSGosfFiy2kbF2UUYUFZVtaFAUDwEjgvVgjcWjCEE/uiKn49GkgbtALJlZvoND8r+t8Toi IMWG15oOAW4pciF8XBZvwBeLdFv5twSQxzh8KUDKQU4AATxzZNKSskO74Mu8wbwACPEqHQExwswa Ow5eV+GxWo4iOOAHXNcdMl70BZDmgKygMwL3M53ttHTtelqT9Xn4y1cUdKYlC/umlJaI5jqgiH9r CjLCLseIQDJc6qWb993+FxXx73OXT6fp6bF0d34l/VCW1z/71jvplpQce7nI7dUSTaI1M5O6OoS7 I2DU1gFQXAHuy0o7LEA9oT6LlbotS++u5LUln88rcOzV9m27n1M/UJk3pSAAhoYFjJCRWC+22gKk NgWytjh8SvAW9YdBvGdAaVd/4D4OKTo8OAAdN3kaI/K+LflF+lint3njFQYPNYwN9QECvgwLcHIA cUz0GLr0iqg7qMotuYQchFIhUDtCFEsB/X2NlwdL2iUYWE8z09Ppwnnx1c+NprNn59J5jde337ud vvfGbUVkPCXvIeKxr23qrbDx4+PyXT+TnhdNsI3iIAVsTErcEIciVUP3b1vugbcxI8xKEaMv7+zI zSpAWCAfmk1HigI7GIxurJdBjRDXfl+UKcl3fGZWu58rkhfdVwqglMF9aWHtgWHNFaKiYCtXXx5k DNqMHzNVmYMOIB6DyqA0RRTEAKo9YN172NZT75BlRd0AMj5XgVt8/igKHdS0HrA3HQhrupCi/bqT r8YHcxaNjY946ouoxDAzGMvsqQqwIQsUQUev5WyHQTu+6fEIBCeJQ8bkyVwQM3BFefGUyhjLhz8x aqlOPntRIhthPS4bgTEN9l5MfU4jv2MCrgA3n/PxjwPArwDxsh44wdqXUAwykMwA2z8X0WdgXVBC efTTBGi1Wlf9JusFVfX78z8MbNbToY6Aa/tneAzkcdfJ8i4rVV2xKP25nv6P8nOpe+kK9fFVfqvG 28Eu9Fil4JPW40cGrjuKHrf4X/xQnkG07fmUech0FgJfjL9+BuDsLTp43TvySQ2nGwDOS+u5tpe3 Gkv/7J00+69/Po29fjrh1YNgNe1drKJP8cX2n0blxpu308YXtb356vmnmPhfnKT6LdYMlPo8Wwb8 gclDX+pbdv33xHdN+5pZhuEkS8HaYqufBQA+rRafNn6fHfQlrCt5Z7y2HlbEgjzplZKxcEMtEUwG HHKYiW1SylTN3lhTAe4s9HnbVr8TFtyebsB4pGGTDr6gYxHyYupt50xJwTLtm2Ob2QuenyGJSNf0 EDOcIkx71A/es8AG/mw5LKzvUCA4yMU9E7OTKrPoC/PrsvAKkAh4jAv42TWagFxLB7mGFe5b5k+N J+34KAb5AMFSBNyHZBGknNixrEQjB8JXZ4uZJc9KzX95URzWSmi9VpSLXVkw7WKPG7HQIScBQDyL uOaMKy3agmKKqqeqgc5QRNjSBoTapYswgoAlB7TKIgtwIKpmm1NyKhdRHodkrd8h7Ln+4YqNuWJH lttdKRdg2ibKiE/C5h6U6RTRBi6g22Jcc8+MFIW78uaB9xV8WONFBS8o+0pvVPfNTozLVdzN9O23 31Mkzc00Ky7wz/zS59KL8sTy0sWT6Yx47+fnTqY33rkuJePPTGs4DRf+gkJ4C6htc0hS+Z+Vv/Fp 0Si25LKvI+A4qxD08I0HN+Nw6JZA9hbUH6xNksfYpJQV+ofqvCpreFt1Q5Hc0W4AfWcE7xqSw6Ke WxW/nTaD7z4qd4KMh0WBxl2BbSI0bkrGW7hhlFx3hLRxQQe3WiGAVDaAVtAR4DSPip/PG6DMYdlL AsUcjr2ng7RzUixG5cXj6s176ca9RUf4G9c9I3KTSih7aEscNJ6TEjEqRQke9e17C3LDNy7vNSfS We1Mroka847e128tyDf6rhSTUT9/9b1r6fr12+n82SmlKbea+i08oMDtRjmSAUY7PgP4v86oiTMD 02qPNfWZlnj+o8obJWxP6G5HfR9Fgl2uQSluzawM97yISJFVfQkBbqUS0Mg/cK3hLt2EPseMVJ+5 ajPW4RNUz9x4yHTfAxXxcFhn48CqZ4pi7q0jixh2vtfW21KsnJhLV6wSHsVhVY46OJcAdKTDWHBG ofCz6+Yottl0bE670yMjDj3HfaZc8k99JQ4tZoqS8gXEw92vLNb6neHMfWwox4TWA7uFnlHq4+K4 bH0CK2gz18k1oV6eZ+NVNUGWkS3fUb0wsOh6ncFaB26HrUF9JXjqX8mz2lGopV6vel/TV3d5LYuu WtctnriMRaxFyXjiBJ7iAzRXNkEdaM/+rvAUs3xsUj8ycL35gztp9fc/yI78n3KVGeBYrnQSn1dH W3u7OjVO8IyGrCG9XqUxolG6d38jdZZkrdZrQFYKDi1+Gh0EIINVfOMHt9PklTPO+9nrSSRAMJ91 vcOP9WGvo3pS0WSPAt9uby2Iw0Rky9vU5ZAVkw4R4UwlyO7lsI5yWh5LFsDRYZuZiDkopb7nidj/ 8oSVFx+7+writi2e7nPeNg1Or0FxBp5QGmytKjYKA9AesDP3FSBDHn4+gm9EIAru1eKVrcV4L/CC C+DkQJ/6oi3XUijw00tku0Eh2hZWQpVhV2MGpXRI1txhgSu4pVuyBK4vya+zAqEM2UXfkO6Tdwzt EA3Lgrqv/kxgFbZ8fZCT/Bl/1ApAA08YPjjgAmuWfuXg4z7WfJW5K+DTALToukqYFQdWU1ZarPiA ZqFnxzMP/xIN7VFipYOiM6q0d/U2roYmy8KrfM2RxFqPazbGII/rACLy3Rdgwoo5RPAc/W1Tb6w4 sjoOsVuxhVVWZeUwsxWF7G4sG7VDaYv9EytLKtQY4FpKffvmQrrx0a00f/t+Oi/lY1zAdbfd1Fb7 ULry3JyiXN6Um72ltCpAOXZFAaeaM6Y6XL3xIL334d30l39+Ir1y5bn0+c/dtQu7n/3Ky+n1ly8L 6A6nB+IVv3X9rg53rqZhye3e5oM0f28tvaKDk1hZ8Wu+jzVb5S/UtiGdG2lJKMQT4rAfETgpPRSJ dcn1xvpGOtOaSrMCoVitoZCgVLakNO3JqrwmJWFJIB8qD3Qkxgt+3a0T0uHYIZCl+fmzZ9RndNi1 KJNKf0wc9elphQaX55kJgdUpua7bUBma4pSfEGg+pbDu46cUEue9MftVnxE4ngDky3vN9taalbJp 8apRAO+JNrMshSQi86q9lf/F8yd18HUq3RevelO7T1jih2RNpuugIEHzaeWDyFYwVdxNHcplfIxp t6Ep6lCMs0BONKU91+DCEA8YJi9HX9iR0rnHToeAOWN3Q4ccuT6q/rUrOZmvT//A8sruTAbzRcU3 kD3OtHesm2KCCYyfPzAHgDoN7LF8B/AtQDiyLjNTLkj1qD4AfOnVWfkv1lvPNgVUZqRml4sGoJFH vHvzUgHd9qXusxfhGQY3hd6FstGJ8scOXYRqD6CNEsgcW2gY5aAi9zPXhrU8FAMfRqzJq25d9udD FoZyeyl3kUp1K3mUdip187wdFt6SbLk/an3Mtj1O+z/BPQVck38pc73K9TKWli/3+RnaALnq88dB JaRfyfMJyv1p3lqv/3GH0qdZnh8JuN6X5WMJS/Lt1Qjg8im8DDZYhOks+CFV1ERvS2sUVlEcmVC0 UgzpkNagFkMPLoOAus7zFAvHKNZksfXeQtrBR+2F6aeY+E97Upgk1/Xucaw/bo0PmWfz1CDw0WIB F8DEsqV+0BaIkPPF8AaC5ZVRqj5iJjTWbfzi0tfskirc4XEYKIIssLDxWF6osNB47QqOdnhdCABq KgIHiniAQ4k2JXCJQ2KZEmJMEKugFyK+Afpd+liUPMHbagbAju9esHJwEXsNUFkBjliWAScNKRNh ucin+PUQv9s7jqP+ibsrTu+0ABBjA+8M0GfGpsZFp5BrNAWYGZ+WqwzOTRh0sRKJWU1TUV67BMSa h+zYasbvOFQVXcdErZUKtckRFrEie6GmsnnJ8OrOASsEUmZxfmM1AKiLQqI5Be8YhK72+U6vzuHn Gt/FyATqCuAM7xk71BUJshOhMrgVlD60DzwaAPYb0Dyg3Yhn7LJwMBIFiHaifct2PUWinT13COiL 8nFCVlUe+0jc6Y8+uJvOvfaSrNOi03RUPj032DqRPv/aBYU6P5M+kAV5WRbcD67uK+y5dtwEzsc0 Z91+cT6dEAjdEWA7e3YmXblwVr6vz8mKGgF6GumeDt7Jqi6r8x21waaC7VwaETfZxHucoQlE0zdV zxVRIqQDyfsGLB9ZtAVgG+oTw0I9I/Rx4JhA764UpFUpIquqx4qs+2vaPdhb15wli/XWNh5aJlQ+ UTVkaS7W6FFRXsb0fUJ9ZFzvSQV0MT3PTYCva6g/yB9FTR6a1EYDoglZvdJ3fFlva2BMyTXhuef3 xC/XbgiHMtW0rQ2crUshUD0Yj8NSeuBV7+6i2A6kB6IprUkGrymo0RX5Cp+bUxAfHXSEozypco4K 5A+KEzzAeQkOTGBR56Cn8t6VVRpXck15pRlqsQtUZhQOOgp0q06cBm3SP/Cvrb1zdgIGdRB4EH/a +6Ieyro9Ly4/URlnRSPDm04TJZdDigbV/MVyzTjA5SNzSD7o+YQTmAFCnrz8p4YYKgutkWTepzLi DoB96MvzE6g009Mol8ce5ctzFrQ4hl/JN4PMCqwaYTKPRXlCqWfOKWA7dmztuo95iIOq+qv9EZNw XD4/H5DP/rpz1ayj5GFeAcaM4mxlzheZbmwQz5Xst1RHeXryKoqGy5tF6nLrc1EeSloH0sw35402 l58i1NeTOsh8wub9RLfXy5tF9lB6pWz9v5d6+ywKdarZHx9VqFLv/r+fqCJP8eFSriN6/1PM6XhJ fTpIty/v3evLslp/aCuf/Uo/5RcLPIe5dm+s+GAVE/30r7+Ulv7xe92dD+YV5ZEDNxpwEMh07+Rv vJhGLs+6FG1ZRDqarJ9+qXIlWShk/du8eq8rcP2pZfOURfpjTo6t+h6wDsh4/FeZTMpW0WGDLaDq gLxRjAtAjAtgCYRpRoZ2uIN1TlCARXHEHGIW9nAbts9v/o7exAwPz5SwznAW+S18zQIMWbBszXJg CqAP4dBZGLSk2crF4s9Cp5Lini4vjHZNp/twG9jV/2zddphokoDGEZa48CMdtBNvz3KnwWiuce0e KDC4FcRLCMonlAG4znsaN/xGgBTzTJXJjgAFr0mF+ObehVuLcptHlLxQINblWWWwOZ8m5qZtMdsD QMuyTFrwNzlfYEtPtl6xrT5InfH0Y14zB8RUX7wyeCs5u0dj7HoVzas7KyjgFg623uHbG5qIKA2y rjZkkoUDT/1DuaHuNsT5DT0BC3wEKwE0xCG8rgP8RHlRKnjxeU/8cSy0WHw5xAoVgANf5o/yHAfh +OfFKPqkPcYo3alZWa/lT/+6vFq8e/V2+pIoC5Njkw4gc+2BrokSAn3hyqsXXPb56/K3L4vsqtKh DAC7ty+cSJdEe+D7mbkZ+2huC+RaOVCdMQzYrZzy3FCZsD6LDRI7IboH+saWONPUdV3tuK57NlXu LYL16C8yRwY7ssLuKI8h9ft5lWVjRdQK3QNPmpDjBFsZl8X5RGsuXb54RpbmyaCKjI8qPLjoF+pH Y3J1N6HvAFGiGKKc0GkZC7jvw4MGPXeH8SHZDsoFYxJtQ8cW0wPxyhcF/k/Kgn1a7lLnPIzEy9bf M7J2j2m+hj+9usbhUVnaZVnnjey3M03oLjuTksO4ynVBfurpA3Dt2ZWg3+2JXsQuC2HRN2Wh5+Au HHLGZ0eHcfc7W3axV154W4EXjmvIJe0O4JpvSZz39Z2GOPXjaUJtzzJCX12XoiL9yIekdzDeyKzK UDbAzsowPq9Za1BUwy1e6Gsfa+GX6PxcBof16dC+ru0YIKvc0Cq0O0PQqniKfppPCbpsus8FyYq1 FfcAw8GTDj/lmeHiFAr2KimW3m/wxjzFWzc5MmP+V+Tqocy8yi6W8wp4akNDTqj6rMOm3p/KJum6 Vdi2CN66yNxy4LdagQr4jT2aAP9WFHjHJkW89GM+5+lrBYzX28e36zefIc1yKPn+OEF1MQWWsvD9 KOuzgfTBakdd2OHJ/iI5HnOcJbb0ptK2z/4+WgI/EnC9+f07aefDJVE3PqXsGAFa3Mln+4ZOh1+Z S1O/dDmd+5//UuPef/CNtEOYdP0+MCVrw7/yevf0f+/nGoX3vanoi/AioZWUQfc0Ow0TB5b79Xfv NSa/9rwjjT17PUoCmD/Dj3Vtk656oH+Pof69zKFlQSgTZbmnTIi9RUKBOsQlPnla7rrk9m1HYGUX jiXeDcT9HMb6yZYprsWwgPkvNIsM5gDG+sekz+HHUT03gL8/71jICgrQxBqMNRpgnmd725xt6Qpr toPMkBLIHojsqDERVY7DiJy8B9B7AYCDjU9uLagtW11ZqDjhxMIVQHyfA3lOgsU9OM/cb7dpuh/A 2QXoKlcs0SykBt0oGIq+uCWvCUMCWFNwYwWm8Ee9IQXRConSW1dER7beCUM+Kl6w0K+VDTjjA/jw lpcRzLgsn/Ce9+DmWtmA+hFlZobfBwjmQ28oCnhjwIrtVTG2AAJcK5+OrNX2iUy4aZCN10fdb5mK 6uV24gAkVmnAMyeS8IyB6z+8Gejwnf7i/o9F1oczVd5hUTfIcle+v1HQx8QTJsqfD+3JfSfAKXQX w2ojCVvKaDe3lVztQZORNfeMoim+9db99OEHN9Ldm3fS6ZcERmWpvXnvbvrnf/hdWcShpwjEive8 rQN4WEcH9NyGnn8gl5DfE+93VHz2i5dOpddfeV5Uk2kfSsR6uq77ORwLCFwRYISBvq82gyu9o3sI eCQfFt6xAD/5DAF0EZV1WLSSCckFWe2srxu0LpCnaBoPVlYdgGVaVt/Tp+bSmbPyd35yIp2TK7xT Up6m1P5NKRtW4KCFMJ8B6JA5SiZ0oNy3UNIA+i39TthyPIy08Riitmupjw+qT23goeeaaC+aEy8/ dyp98XOXJDcd+Naz52QlH1EZnxdt5u337qT3r91PbYHsc3JpOq6D6nCx2ciGn3373qo8hyynly6f Sq+8rDgHAs/0CPcjjeUBAeVVgeTVZdFJBh+kE6em04x8h3M2AE8+G+vLduc3qBD2PIec8Bu+JdD/ /R9+mN68eiPdX1zSbs9Melm7Bxfl9/2KfMJPjI2nSR223BcdCd/4HXa9NObb0EN0cLKrzwGiw2rt Q4bZk0fxqX7k7EeXr1td+5C4QWI0g8tcISImFk9u8YDpFN4lYxeMoRS0Efdbbs3gGd+kUKUA4hqV ajspx5wzKagSazblqRc4T55FB+ZHukNE+QxKiuctrPfMN7yzdZp51WlREB2QBSgPyFE782TEBNCv 6t8G0nnSLlZn627YIvS4D+HVfq+qzpxXK2vNxlCzsEf2FmUNdXpuzmLMk4v/oLfkYysPgdS+5jmy WZ/mD+QZZppQ7sxTzz3hMCWor6e43qAwlqnwfc8h76NLWNbUkk65s8i5rKlPs46PS+tAGz/u5h/j 758S2u3VCEvy6jeupX0tXoQ4f+ovn65Wh5kT304DdVUnyEee1ySqLevT/+ZX0pgCNWwodPq+fDeN vqjJ8ReebzQzN3v9W7e6i3/rO/KdLwvWC1OOHoelsTrA9DQKmwdyW/xI3s3Lz8D1UWLFWiwCgn4+ SAUpA7j+t6RxGLguE0j5rX8S5Hto+zrQJe7tlPie8DLZisbSNiiAAjQc0czq4Bgs2nrbOmfraVit eUfURYE4uK24GTP+whLEB4xB8Ts5DrHgaEWJU/MRNtoTYom4iKcPFxpeI/0asAJEZbXM271eIQPU 4W3EliD7ui4Gn1hUmUV9mNIHzOJZY1WoEPZnG1IxRSIfcrQVygf9HF/d2+goEmNSQKI8rNTgKlnv tOODRXJiVu7NZJX0AUGNHxbjndUAGKZesDjZNaCoAYhPHjOcL7USyDEPGqs/HkWshFC2mPntwUDf 7QZQY9RyNmjTwUss8Q7wFMfGvLlsq6XGsPjhDlSCa0D9DteYSIYRrlleLERoJk2eAXR74aBevhc6 QbRboBGAQrZY5y31agV3O+teASsUlhlRJLCvLsl6ff3da6JLKMrl+Cl57FNbSxnBU8iCfGHffO9W mpQV9+e+/pqA4UUf2FzQAUWiEQKSn7soSo48WHDQb39TkUhVRjy5nJCleUNgelNW2UkBw+Ht6bRK MBM9M7QqCofKIBaFDj/uCnRLrvgNw4MItCHJYEDlwIqLVXZenOQleXmBDvHcxXMCumfTKy9dSOcu nDL/eRILNb7P1SZ4gMALCLszO1JIdqBLAJwtKGIOxc6Hd1E8fUKTwHqNJRQvLGHPjENt6ldKY1mH JwduR7+8c2JCLvf0fnUknZiRNbs7ax42/tnXpeyxUxPnC6DxoBwSJVFtr3YhrfvicdsbiJQAON4t KSy4QBwTEO6KN86uC7zsSSkrnDugseHadyYAlT14QLh1FMH78kayINes9Ne2djsf6IxOS2HOT8o7 C64iJ+QtZ1AeQSZwk7gnryyYAnTA03zrbCY10ISGkQF2AQTMJPE6GpplnPfQNOkn66jGgzEHrbKJ ONK1tAtAriVWf9Qt5UeYXcKAEKclsku9XEJbi3O1nDz93RNg/sucwmyWwXU5oF3ZsCVT2ox+4F2e vIuEMs78NIjy6nlFbcE5EHU5V0XpZ+xXHb4MEB/u8QzumeYA6NmEm6fnAwi7Ath5HfaQLmJ0GXJF ybMM+XyJe7EDZG98R1rwH2qoT/lCnpVcnjq4Ltcf18P43Rsb7LbkdaPI5VFFL+C9pP8pV/PQ5Esd 6z8ePZJ+HCXs5fmpg+v2/XUFcblT69FPqcKeuDQ4NME1L4yn5kvTqSHL9Oq3r3WH9HfmF19o4I93 8qsX/e5/bXzrZvfm/+F3Gmu/91Ea0H7f0OJ2t3VlpjF0UqHSsex5EnhKzcbWtIJf7NyST9rLc09J AD9dyQCsceqlpTxD2V6XoRXKoIol4KCFokjC6wkTR75Qn4TKGlOW0gDecC3hF4f1kq1zADIHDR0J UFvw4XwjLDBs8Ua4loh+hkWKwgDYOvB27V4PjqF+M4cDQItlJkAnNJGhfGo+DsMB+ACGWJhx/cUW c7bA2h0Wsz+H1Th8FyWHUoJPaHwpdTQz2kpE8AtcpxGxLy92cVCIcA9gRJ7lIKTygkPtoDIEDMEj Bt5IVA0BUW7G53BTFjmsoauLa/aUMClAMSvguKZoeICPpoDN8uJ+uibrotNUPfBNPCullYOPO1Kk d6XMjgvkTCl0+skz02lYHh4IU76HJw5ZM334SmXHek+kR6gEewIwgBksoNQVSzjBaoiUuaHyQKug sMPy7jPMDhBp4IfZPPTw/jIkwA2XFj/d3gFnUfeJRTykhCIRUfEQm/yay4ILZoab3dRcAmDcZSeL tiaCo56nXd2axgABYqI1QulqaTdhUJbMaR2AbEmMC7JCv/39D9OFy+dFWTidLotbPIjLO/kZ+/mv vpC+9trF9LkXLqZf+dnPyavFbLqqyIN//oN30nvyioGWBEhsy0fzhoA1ytuJycl08ZQ8bszNiUax mq4vLKRzUgp3786mj77/QdpQO20IhI7r2WnVAUv3bsf+Du1ya0MAc02/dzicqGiQKCejArE///rL 6QWV8YoiQZ6WZXd6RgcMRflgC39VclkSwFTNrGAC/Dnky0FeEAnu1wZVX0f24zv9Da8aUpgcMpxd GbUVlvZRyVz7HKK2qO/o+4yAO58Xl1bTDVn5d2WJv/D8OQXfknL7wlndM5BOyVo9qn6GX+v7irhI ebCG48GlBWeatlS5sMKzi4KP7lm5jASEb6nvTQtkz85M6dyAIvfqgOSmdjvu3rkn6/Wc+vikfbf3 gHWYMBk/e3mXYEzj4rJ2EJbXR9Lynb304QNRDnWwcV9rysgJKVHywc2hzYbGxQ7We2YELPcoGPrr Q7sAF4MXdq9w31iQnDtP71WQTf96049icnoMeRKOOYyxFMm5a2aEiF4VM1zQL8y0oN/myTR6NAlG 3cs9tlw7jUiUzTQfHsyl9VP5u6ceFAufHQnKWKmXq8fvVn6Jnqm+oXHsA9bsnpkLT/Cj+OszJ7oW 9BIlw5hjF5G8ANVKDpsA/PCOzK6uK+nzFxyQLf5506+3YGQ594My16dUirm5LBClnvkB6shsVIzc pdnqfwvorLXoU/2YW+pAmqXo/LVOF12i8u1cr85h5fMamRWUWrM91XL/KBKr98vj5leXTf8QO24a x7nvUwfX21fF57u5knlhxynSY+7J1gAsMs2zY6l5RdaI8+M6KMOWnAbe+nZj8bfe7u7cXulOfuVS Y+y5E/IxK3d8TEaEW767lpb/+fvpwd/5TmPzh/c8GUI+ar+31Ni/LxdaL8hidHnaYZ4DdfQmjI9b eucNH/Lmcppme/xT4J1/3LJ9Fp4j8iIBYgDW4S23t/bU5r+qqPUBESCn9+J7XcMu37mnbsn2OqZZ e1Tb9hfPzfkg1MrasoCS+K+29gJSZO3TYk6wmK4AJIA5thSxcMd2pxc2ZvmM+rHiEOmRdFhkme4A OHZQp0zDi0d2Q4VlT4sFUNdrGTvbeeXCOmfQArjD5zMLdCB9W3ixyFpONtcoV6x7XnyCAgLINqBn yx5qiMut/8VDlpJVhHww0/RvryARLXHQqxqeNmTh46yE0g3PJHpSv+NVZAPQq0AgJxWQpimvPLZe KyOAVFsHwJYFaHYVI3xH/p5PCBwRUZFojqb4QZkRFcuLosAVLv+G1pSXwDXBb6BzYK3ms4E3IBze MF4+iGqg/7BqN8SfddQ73kRkLFxTFnECTfmwliyd0F5ULhZ1KlHJBL44ylBenHxIFes+io52wmxx s9WUBsbyGquu7X3GNQL79qMvSjGHQlWeu4rW+L5oBZf1fvWrr6Yzs1PprGgNt+SL/9UrZ9OL5wW4 T5+Sl46J9J4UlO+8+0F6Qwcht9RRnhfvekpBT2hPhzCHPiSZ05+GFUJdrkdiF2Bj3fIdljKxmb21 0LyrmmfW1G8BpvSRVQHSVVEdVhV0B9eFp3TIcmrsRLrwwoX05V/5arqgvj8rP9H0EyzTG9BWBDBX xBkHuI4QqEvpEFSGA4ZomyiCuGxsYUJEIaMtc9calFB2RC+IIBUCrNwLj0HKAm05KsXhhHZCoHhM 6POaQsHPi5POeQDc6p0W6D8p7vqMzkJMQkGSQrCp+mzvqgwSCGCePoyiBI8fCzmBbBqq9yZuFO2n WdEW7S2mmU7q3MC05N/ckpwU5nxT9ZqYEK9dJlIHZNJrW30U+s2i3CjevbtkTynDPgCsA5lE6h0S LUnjf2NjV2XdTKfHNW84ujBBYuh7nDsgaA7+vqWc0G/tE16yA3RCcQNcS+GJkRevwNS1GSxbu6sJ Le8U1Wc4+gLHAPyo57AMnykHYz+P/6wOZkAdjVMiPfpplCHWInbSXBZ2GOBbS4FQOPcBxgu7BIg7 L4GeavJEauOT1cu8S0GZsvXaVmz/Ky86AzdQvjwFZeUgdgPZWQIp6z/mROZqZ8pkF7t4xdblAC8F 8PNzFiGPW1fIEjWwp4RkzT2cXym/FdlXN/dwdimzsT5gNaaaCodXVcrXngSclXvr61U9vaM+9693 pccUYxIgDvmw38tSdBg/oORZT8vt5DrG/Nf/6n+mfD8srePU42ndc1z51e/rb6cnabePW+5PHVxv vTOf9jVJVx47Pm5JkRQLPhalk7I0CwA3nxeVYyIOunDYp0y6OvDUWPvW9SQ+dbd5eqIx9TOXZJVq pQd/+7tp/bvif19bVDh0nQK354LoVoz9/WWFV35D1+9uptYL02nwwoRDtBf3Sh+36J4g1JGhhexp +7alxePZq0hAYFPAWiF3dCGcmfY6fvkUW/qlncIay//C9tR7lW/8jXbNjuuYdvzPFs5q1O3LnddE +uWffzX9s398Kt366CPTglqyFGLBW5HlUEu1PI4Fz3pXC5Egi32uyt7pw2pNAYdxeL74i9YMj3UP uodBIJZP3bPD1jiTNFHrCLqixdYgXQsxFejIYrcrbxutCQ6swYNUHvik9pavFk+Jpm2LprikuBAD GBi3Z9tVPgDkA5fKp+ngH3AXUeQClJOft+ex3LKFLmtrF6svVAtcDup3eRgzDxmL7aCUjRkBr7aA MVvqD2QdXZWHCs4mcKht+txselHgCurIi6JhzclqDeBiJcaP8/rCepq/OZ+W5xVI6YGsrd+9rgNw ojto+x/vD456qLTYprdXBoH0pkAdhxTXBYC2ND4JT8/h5FF5KcH39rAA6pAs1nbHxqE5VlpRanyA Ei9E1IGgMGgZuOHDoqg5Y0gc2QlFJ9wfgLvN4Tsb+32oZ5RgOAYPKD4BuvEywqoM+Ijt76CT0HGa 9DkfKlV+nnM4qkpgFg6GtkVFCFd2Q6JrvPPG++lLitZ4XlbZ/+6/9svpm+++myaVNhbYf/i7f5be euN6+vZ3PpRSNZjmnhfgPj+XXjp/Pr147pLApQ6TitqwIj/i9+VZZFMKyLh2FXbpHwJx12TRvfr+ LVt9twCdrJKSwQaUC9Fe7iui5brqutYWaUHtfUquE18W5eMXXr+UXhR3+AR+p0+fNshd15wEPxoa xrbaAsszi/WYPOkEn5/hQ4fVb0rbeIidFRGk2S3Y3Qy/5C0ULKOc6G9WRxCRREc4e1OUhtWmsiZP CnjOqF05NwA/nx2Uq9fupFntSkzPXtFYkIKhUTakSJ7n5Qcc8Hf99gO5hdT8qTJhAQf4cqASJWxH OyL3ddB2XHzrMc318x31O7kvpMyXX72YZuZm0727MqZoPI8paA2c7+XlRSkRu+n6tXsKr76U5vX8 uuTBzg2vB4vaOdDu1fCEKGLqqyOaB1bEwz+jNE6oL6LIKQan26ktBXh9vZumTyh4kHYKtkUTaU6J m03/2GduQzmVUKJLed7C8m6ecWWxjrnJ0xNjtZoLQ7HjZXBt7jHnC0KB8aFJrL6OihpB1cJIzrzZ myFNIWM+4Q9zhdrSbjqVHrB/UPNJR5Em93bX0rA4+MwbbdobRVZ5odf4KAPjhOdh/g+F4suOmrNU +iiiEYk2vttbiNqKg8JR1wy8nSa7hZwVUJpqR6JhWlGmXkxxGBhsSEB2spLrmU1qz3xGuTg4zTLO mGaOBRQzVHO3NcssizjWjFg7/A5x+FqxXBdbmq3y+h17B+sNt5V2c/O4NeLvccHekwC6R92LXPJZ RJeNs8JyDJTkbVTzU5TXbZHLXC93VWb6IcoVeApZ1OpR8i7GqPphydITsygrGdRlkkVT/TluvY8j x+PcQ36l7KUQfK+U2v4CfkrfP1VwzcK2KXDd1cLT+AQu+OxOD6AgID10SSfwXxTw1dacD0949ByU jv1JM8jXthp7OtAyqOc0faf5v/eD1NWW4eCowFA//5sW4eAXk8edzbQtP9hD97SgC2QPnBYY5jRS IX09aWPk3gWw3lsUf+8ZuA4JmuAOx1qLD4Nd1q19m+tCGYlrRNMTbQAqgy07mCA4U84sGofXGDRM FBEyWH2FQ4Taro3DfBE8BU4of21Fq412Du7NsIUs6gMeBTqKtLcpwDitQ1MtXIiZWx2c5mofEm8T WKuUsSdezcxYrPe0kGO548AeURmD6oIbteigMakHnakEVKgmeEB/XlRsi/KiEotxLLRkhExy4cuC zO+24OR7mEXow95WtW8NcW8B91mJRHI2UQMYBTa9ECI3dlfw5QB1Apwm+Qk0dHZUfjXJlqgey0ub XiDHJ8WPPT2TLr78nEFPY2NVbaQAMNoZsqtA0T5asqjOnhaI0gG9dYUsv/3+3XRPB9UWtb0+ojYY 8tiN6IjeHhZIUnwULw7wMjkXOSIXdS2Ckeig37iUoBGBeg7Pse1vmWpFteUdekms7IEDkUVeWcoZ Cv+cV1Vb9L3gZiRjgMMugoXc6x9cZk6QTIha14UbT14GNNFe7JbtSploC0xtLm+l85PT6dXXXkm/ 8OtfTXdldb3+3gc+jPeVV1+QIpHSPfkMv6vw3f/kn/55+pPffyOdOXMyfeFrL6cZUWcuyHfzF19/ SUB41vUA5NqbCVQEBXUBZKzvrKe7K4vpffm8fl++sUdk8d+XBXtPBx63t8L9IbzoFVlit1k8tTNz 7typ9EtfupJ+9iVRQC6fEIVHtB/JGN7ztvjIBINBwQI8+SCad2UAb1E/U5v0YxN+rD1ixGFOB2aE U5wBindD1CYt9X9Plyh6HncCpux0SElbF997VpSM51+asbxv3ZxKK1PTUlw76b23b9i3+slTJ9Nz l86mCRlRsEYTNp1xPynA3ZIMxjUuN7VrsisaEfSPUQFwFNQtAV/MdozxTX2Ww1VdQ1HTrskIvHgU Oo1x9TuC/bz97p10Q+5hORxJ4B2iirbUv0cA7aofo3pc/OqGrLntTSmXHKSVkvac3BVy+JYdnAkp oR3dv2OLPmNL9eWwIxQl1iEOckouKHpYtVlDvGQBTpGt561gF6P8MhYOfdW6ZfRSrI5lXsr91ucE INLGWK+aJbZYYu6wZhS7IQ7wZAWfssWY8T4almTanL2eOHNcPWpw6npSXsYFVdQXW7J9sqNS5Ov1 iAPB8armKopjYKec5KOd/gPtjARCloy/mLMZ5+RtC63ZJXm+zOAaEXp3jnKpTHjAMKhEJIzrqGL1 Ji0z9+KnSjy5gDHf5+m3yPKwdjkO2Du8QT/Z1QKGSxu7ipZl71UHwv25hZyQ88FnHrrvkxXzL/TT nyq47sCHu7YcYKLe6scVeaaAeBv6XPCqB88oUAxWOavRj+ja2UrHKjqA1qzQu4M6cGVeGMd/j3rx E4umAEL76krq3JNF7bIA/eWZNHBCPE+ezVuTx62GJxTAhBa8vSWcZx0YA0+SzE/RvczaOqwlyxqm GDwQbM4/UJAM9ResHYA0WdFwp0WAE39nQfJ1fCoLDJhPK3HCI8YrgRZcwitD6e0IXA8LmLUEBMfE vZw9dSJNKwLemEIpEySF5wB4Q7LWsKU9OzkmX8N4xtD2tVYUuLdYprFOReAYDn/EAURzrd2Fwncy Ibe3ZDFtqkqe9HW1qQVsEPCh9OlyWtuVTw/8BTaG7hEzuBfLTDsJf7nZdZxBYABnDrbBW6ZPlwAM xeQQwyv+j2u4BlFI9LJfbnix3qGpz76ARSgTRUGJunBvWzJHh4HzvCGrKVETW6IjnL54wlbrE+dO pklZoJsCSd7uFhViW9bYLQG8XQHKLn6osUwLYA9jnRZgaKhRlu8LoKxtCGTJZ7DqsqEIgxxYw1J8 QvLvyvc8EQOxYrZkoR7RNfjV5N3Ue0Cn9fZYpAlhnpUFgwK3BdSY3iRjzqbBsxFjtFf2YGAKAwBD luxKObciE5bo+oHmsASGso5R1oM3W+XsW5wVTbJWkEpZVTfShO7/mdeeS1/7S19K74vq8c23r6v8 o+kFWYxv3RS3+t0bAsjhN5wdkVdfu5Rek2V1Sf2uKURAZMRNyXJpecVUAw4yjghMDupNMJ9lURvW RPO4I4B+UxbXWZV7WvdhgVyVl5fl9ZW0IU51a1zKiHxmn5D3j1dfupg+//nn0znxu9l52BBYhdKz rq2KvRICj15L/6Se6re2JkJvUv5FkaUvl+OjYB0s/xzQZZeEA4WOAAqetMvDQINNKa9YH0dRDOQv Gh73CSlK5+RZZWFhJV2Sj+zRwecNlv948Yfpw4/upB+8fSu9JGv/Ky/Kj7WUuGVx/ekneD2Z1Ju0 9jorpoyY8w6FQyB+Uw3E7sO2DtEvafdDh25kndYBzuV1jXntsmhMAyYXHzxI1+SJ5Adv3pAcZeEX EB9QPWdmdQhS/W9ExhfODmCdJ5IjY2JHawhzw6oUqfkHOvB4el0HJMXbNkAJQGxLMvxjxmcG0MgI haRQNqz4ZeDmYCke2LEemZ1sRBnTfJ4aTAMrjwQNpGf5LSugsbMND6Am5p0MsPnBbRE7dx4hWal0 +HFrlNlK7uvMq5pf9UZJcHRP1lna25nobUsx4FfAV4/bJWkeey4pdBnGXDYfcs20KtJnHcwzlctS Ad6gtUGf9D1QsqycIA+UgALO2SkKd6jhaUnzF/0QgwK3kj2bISjQfCfLjJ7r+VrsNTnHHOxGqLBK JfNc7WiVz9arlBHx0wsLsilNdUDWWe6lBvRxukmZNXuzZ9xRr/9nq9Y/GaX5VME1hxnbCnTgFn8S dG3AFBbIQVmNW5enbLFucPCMQQCh77gvcBCTvibXiJDoSBePfdn1FFbLdfG031wUyBZnkXI8JyoK fGwA0KPAfX8Oqj9BbnaXN/v78GPL8tN2w54OGG2v3pZ/cdFktJ3bdfQ4AVhZk/a1lRuyj8m4qYXN /FebOMJ1FHzGjixNWDnMwdSz9s0sqxdWvBWBjGuyVrEZu4zbLRYBeQ4YmzmRZgWwJ0UxGBfwPn9O gTrUntvKk21/wBJAAAvXrrjG5jDTBzXNsA3HgmEfEy6PygVAYzLXjUzwQ7LsManD0d7C24UO3hDg g4UVOqbxHRNgPjDrU/QsqViNdX0PbyGmhWj5wCIki3NZVuk05iWaZxwgyFxoiyofVvRsGN3LFvF6 xwE0cT/3umIBtm3Nz8CbrW1ku7vF9vCWLZaUjBDxo+LqjogPOyzfxgSYoc7bAohtAb0x+QtuiT+8 v49nhlB8mnKbgvcQ0FZTlsVTl07K9dl4WuHwnWgibdz9QbNQfVsCZ5M6VDwxMyZAKMqL6C9NKUDk NSiwAzWkg9WY8PDQMvR9IFvnvFTnFcUWV9XfQeHN3Qzrva3S3EcXMihH6nEAtSzZ7DP4VYQWblvU NuJTe9Fmt8KajhuxAgt8VR8clUxmCBGvSCiTWrTWHyy4X731g4/SXQHKlty0bWjn6geigaAsfPUL L6YvvHghvSJw3Rawu6MdNg4SrjmKYNMAGUtmS5bWIVlLR2S93pdniu2VB2lBMrS+INltoswQ6ESc akfPlNIyKTD/pS+9ms4+d0bvUzpUOZeeE8huSg54CwHAbLexgsdBtF7kz3CzV2ZXHyRjN4VdFA7M 0pb0VyyLdmQev43gI9170XD0CZUOmArf2rhRRInlUC+h5vFkQp5Yyq/dWJTVuZm++vnnfGDx9sJS elvRKt9+73b6F+Nv2pp84cKMQriLxqExMSbAN6J8R6Fo4ULOVIQAZSPqE7va6cDavyw5b0guo9ov v3VnMZ3QYdqZBmlIAZdy8mAJq/+DdENuW1fF89+RcgQVpMnWAv6s96TkKDCQo3sO6PCn2nNGvPQ9 5bG9uS9r97yoKerTF8XnFqqz5Zl+h9cbPNvINWWbA5+a1xr6bB/pLGl2bp+BaAaByIxARn5hPGAn oG+FMPU4Y9MDnRRF04o3NKWYnzwF0Gb+lF1+5p0Zo0+oUk6LsUFkYl1jreWgtcEoNDF5n5HRw2NN 0SytWzI0ChCOoRTDjuFXxgZfcbuXEV3ZTTLlkjmzNj+F4su1SDQ8GnGAMuYcyyK707SSk2vH7d41 yWMZQ8dghAyNnSf6GuwTvfNQdzkLiESOOUunUXSZ+lxZAVbPkJ/tVwHRNvrkdwHU/SWnLvV6wn6y LD7bVfyJLd2nCq6378n6siLrQpiWjvUKd0YaMDPDArM6rAivekYHEukY7E898UtPMrL0tmeFJ3kx 4PNpgT0dduwsyQXYnQ3RUmZS86IOUWpRKeV9XLIGTRzO0qEmrO7FsvC4537aft9cmU9L197QNvZC eHKARJe3FCck73G1ezXheurPhwi9l88KAu1AIAugRWCCbAnBqovXgD1xdR/AvdQCOC+r1b2r8+mt GwvppqyqG8pqbGpG2/TyRDA1kV6VxfCv/tKrAgfarr8vPuf6qkMaEw59VxQVDnHtN8Xz5TQ7kz0W bACEj8aF5dtbcbIOQ3HAPQBb0Sz42xxE1GIqSGR+qF28me7CUhhbyF4E3d2D3gAgNAxk9ePwkxcY VsK8Dc+BPe4vwDFDQxbGAEisjgG6AM08H/nkw48AJxYsUyB0LYOkiDwowCPAwi7BjugdeOlwIJEL 57y9bV6z6A1eaTlsKI70hqzQbYGYEQHvhoAJ/oUH4TDbagwwDaseIcu5NjEnBUeW6C29tzUO9vd0 bsIeFpBfV20jRVpnHBjl0EIYX7xj50DUMsnEVinlsx/m595qwaJpizJ0EwKZYJVGWDFnhCHVxxCt RIFWfGYzEIXvDXpD/BYrTljtetZGHbm1chPb+Gb8Y9XkAKFk8OJL56TfyTXc3fn0u//+30/LSuYH H91PMzqw90u/9sV08eRMaiswyeLdTvq5119IL8kzBl5Q/uBbH9h39f7LjTRPSPKTJ2TdnXVIeNM1 sCaqWJPqs+tXdwXWHygy4WTaFI3k1psfpaU7d5M0ynRqdiZ99XOvpJfkUu/LP/t6mjsvCoh8SA8J mOPXe1mhwrc1Hzepo+S+JWUK8dgTTa52uFQLJWS/xRHjACs0O2cICMUOhcdjAk8zISUDSCvIbNnj MUTXObwLWEL4G+JjS/WVtw7tJClQzF0p0n/2ww/Sa6+cS6+du5i6SwPpBVFn9kan0o3r99M//a1v pXc+uJP+5d/4sup0URFBtXOpftSRhRt/5FBEhlQwQPS2+uuYlLHTp1qy+K+LF60dMcbgtiJgShF5 7sXNNCNrObtBt+4spbfeu6lDp1IEdwTUJZtx8ZE44Ah1alPK/h5jvz2kiI+iRQkhYhk/eWI0jcqT 1LqMLNc1v7z94W25M1xNZ7SbclYKA89y8HgPpV+y2OWchlzHmDbFqGbqkoIY3Sr40kwe4Y9a/Zwx yPjncDI/9U38xo/unxmMGsEGVIrzKGSQQSedHQXceQHs0dS5I/puUehtMede5pg8vZLmvqhxu7vy wy5vMNDpHKTNc3S8ejzmmKuK8unsVK7ggkfSsQvHtVBqw3NRAfdxUNpAOYNruyXlH13SB4kxhnEt DBBDUG5sJKOP6j7djxWb+ANhUZBs5UMbZK3iW97Z0VLY+HIdKmO756n8A38z+K7TQuqAtK9Zfmxf Q5q5PfLnUr/Sf/jOOIzZqpxoyoqSfiSiLJIs1e+vTL0Plt72WZTFj60RHpPxpwqu9+XeTlERQyV9 3IuRAxiQhbl5UTSMKwLVc7IEZStfnE5+8ldo2yqC0tHfamfsiVJiAmTwarDv3ZR7ssXt1Lkrd07i fg/MKQgBJwLKSYijEqYMrDOyrnaJLvcXMJjM9sq9tPzhd8RRvWdQxZYxvsXLoZVxyUjruSdIt7c9 NcBP0IKQzSRxwlnAyXxblJQMqLTF39J3KKonus30UkdBMSYVclmWJNJqzg+IAys6AvfrgNG2LISr CqBxQ4fu2uIL37p1T2BRFkbRHuQt2KAGi9Sg3Y9hnVaxvBbFgoJFU6k5QiB8SiLk0UUAXGGtjkUv bKRaJNgFwYJFP/AZggDoWGHMbVXaWPtYxNgG3tMpoybAxOg9wLYtz0aEGYQr/yyubO2KBTWCx5A+ 8oltaOdly1hUZB/rmr4Don12gbJSPqXY0oHDscHRNHFCVkNxgo3A1Gf3xDX148hEuwY+ECxwsiuA 2CUgjPIdErjuEFADrrzWRYAJK/f62rqVDCywXfloZkofahCNb9SAf0Pb7TIHmlMN7QeAYpscQIQ+ Yh/aAvjI2kqWairra9nbDeWCnIK+4e1zfva8EiIs7jXDapeFl8drXvoPLDXeUVA9HCZeN6AH0j6U N3YP4tCVD/XhHUIHGum712/dT/+lgsbstkRpkXu4M80TaVUUCALynJIXjDt37qR3xC+e0BwwLyXj wcJaekVg++tffFUHQxWZkcNkynNYssDzBAoPbvnuSoYrooZMSI4bkgNeWJZlIWe35rm5E+nnPv9S +tW/9IV08fJZ7fIpjLpkcVfgUhtmbi/u63CQm76AJ5VskTamoGGRlxW0PN/RfyTEhsOBx+HTpizw LSh2suZyravp3VEkTSfAcwRgh4O5GDTiwDG9apGDsarHqQuz8oYykq7fXNBhS4FY3bamOj4QSMbN H4F4cKN49er19I0/+76pSWOq74uXteMkC/aCwPUD0W9wlUf+porRV8YaktuordMbm8wPRKJUNEid nbl7bzmdEKjHL/ttBZ65vyClUErAuGgzY+zK6C/gmvJv6ocBDfYxUUMmZAnXxozSFNUMl5Si7MzK B/iOUMmQgs+g9CxIWZlFEbVFOJQ6olTuabwyBrC6suMBfQQ3keHdB9RJx4vDfriFce+trXEV3svL nucTW6QDoIbnj/wyUuRzzJumTGbrr8e2NfgAvAbiBt6MrbwjqN88zWRKG24gu5JDS15SBsSFJuk6 mCt6fNBT6CNx+JosuYI12R7E6Q9MnHphUIgSxstgLZ/9MEAwuNacIHOq/ffzjR0O79aF8svuB16b aCf3UebyTKmJMsUa6x2UHfWP7EObHcUwhoSdrRy78ZyATCz7KJfTySjVSfak/Jn7VC8bnwtbvx8I l++V3LP8kYedAxyzZqXHfdblcszqfOq3farguv1gQzgG4ukjmi9r2aCiQfGqW3Kt1zyvqG+4t7Jl M/f6jykKuxjSwjygRT2iMH48kF5UYEeb0tb37vvLqXM/qCJY2OUGIPPlmLwOKawnNqK+yfKCZ4G/ YOC6uykPLffeTOOdxTQxLYsX1lWr2EHHcLNokWlDz2BiZeH2ikAEQQ7kGQJ4McIKHL9xylyWJgGb tqzWHQ7ksbBpsRtRukNyXXZZXixws7WhBVIbnbIooc2305S42JfOTKaF5aX07js30707D2SxEid+ X1vLAE5ZoXDt9v9n77+CLM3T9D7sO+m9z/K2q9p3z/SYndmZxWJ3sSDMgksSZAg0ohCSqAADIUaI waBwodCdIkRdSBeibhRSIGgVEskIAiIBGpEbi8XO2nE7ftpWl6+s9N5n6vd7/t+XeSq7qrum3fRi cXpyMuuc73zmb5/3fZ/3eU20Eom5cOnF6pJWwb3vdwGmWJn7+buf9zfdI/XaQQswugxOLt4o+j3F Svi7pwbbCZfrgYUvmJwAAXDCsUrPCdxF2oaZIwtQwDHH7QEWusjOL4jFjbmESFtQMOKhTsi+2bnK ktps5mVDLueOZ8gmNxmP+SkId3PtBlTLDzYM342HUp7vAZusYFKQs2tIP+CS74g09WbCRd1bgaYD p1qPvjtXgrg+i33F5qynqRc+e5dRAXWos4lxP3o2+YdtbHVMC3FE0ixVBjkLahQyfnss206jqpZS PPy2gQZH8fyXJy9s4Awl/m/PAjNORcGeBhZAKIV/klBWt0uzqRbXW+3CqqXJ6raTqhORBb24fM+i JfH+W2iIc2kk9vRTG5E5/RBu8AKez1W8yBNQ2OblLctfJQ/ge3/8U2gxcI0nRqr1S4wtxoeAQ2WX 69cuVP/sn/9i9eefe4n0XtRSTCjje8NysPmBlFb95N0H1R98+yfVLNcYIkH7IUbh3RuoX9DGX3jt ueqv/8qXkPk7BwUCox/95VWoGWpfL0CRUFLSKMsgxmwfdCj70qqJySEQBGtEGPoH7Fgi3KS6zC+e N5J0jAMVZPRY91mgRQ4IAyYa4CqIOB+YF46kffo4RWsY4GpSh7bDtW8trFTzVIe8DE2lh3V4g/54 Fr3v6TNjoVDtML63mUBS+C5fPQWvfL16+Ccz1R/+wXcCon7ll16qfvlLqIhwTpdX1U1UDYmxZpVP flZpe7nX0/C41wHVS4DwZYy2b37nbdQ7tqte6DVvv/MQ8C33uiRF0hSMDQ39YpRtO+812jHW9dZ3 QIs4MKfAqBjzdBDD5zwJmH29RBFYR7bnS3VS57fjw/VLre/dSPLJGy4c7EgYmitUG6dxHPh3tqPM yHie28FnAZyBfJnXjQEpoG0AYb7XuBg5YZYrPtcpkPHv2mn41XkZI7NEbrL0ZqZ62aKG1NK4d95q ONswvR7lvKgRWL11hoqW75e7K9Vji4MgJzaPw3VCTz3PlOPq6FTR4a6/27iH/Zr0pCScMuOdwxwn yHY9TGXHTELXlcIJL1UgY04Ux1d9q/7W+N+lbH3Fj3doUnCv1SgxCHV6h3UoyM59lNeRwXD0bI+q hNSH/dx/NUC5HVGVvixNUJtVR12W0ZU18biJyog6Lo7zsz5UPQwevcbPepI/A8d/YuDaTt5BGSOp xu3xhaZRA6YEGUrrUWJXPvNlPMEAokx9N9CmFz9sR2Qk6vliw8AjrnLERz6nC17CqAAHpPsOfjBf 7T2AKnJVqgjhcbh6SayK9+Dki00ID18Mjj8jr0z41Znq8MFPqp6tOZLtjfeXJLjitXGmF6ml6Chn oTNUWgqvyG2OF6Ne47PyZgGsARGAM55I3HMZLi6glhNH8k6vJ3gxnEmTx7oA3Hs1xWKEkO8YJY1n 4GTeuv0g2r49StCx8u5xLr1x/UrV1dd34DQLmvq68aZwQbZpoWlCoYWPXXaiBIAD5FzM1Z2u+ZBZ 7Rz7xQtedFQLKE6BjuwYNT/RQ+NlCgY/+vtoYW0wob+zOTaDyvYtm2tpr+KhaoqnZHENkCLszfkd zqqAWMpccG2BFuXuDgG80j8Eo55P2kg80lZLZHxHa1hwCZ+9Gy9XBU3kAI9hVxeSei7e2cFMlANU o6ogG9qEM1tSSb09vIKW3nbz7MSYNkEqHNK40epkSz2n9b035duLmz8PUXvbpOdwXLyYtin3BIBr DAFV1IsiSrqmvBpKyVGbPbr7xMDjuj5rKCqgzxSw4F7d8J3f8s6jQ46axMgonHE803OA2WHA52sU ifkJXuMb0BRWoSctwDNfUpIUYHzhvPxzKv0BdG8jVZjiIjzL1iEKHzECGK9QXyAkVTu89xbj83f+ 6EfVH33zp0ma1Hs6PzNfjWAAXfzcc9Vf+vLz1a9+/ZV45Fbgwe/Al9+BEywByXkk7SaqMLSD/Ppo fUNFQHSt0GUKUkqYXfeelR0LHQX+OJ7dQTjzgmuNnG4k9TSWws2lbTqcy+GN0CZm8FoJMh5QB3Q9 jp0DtImecvnmRpPsk+vXTiNd2BtajfOuBxWTLbzOancr2TgyPoqU41z1vR++ide6p3r52il0ugeR zxwlykQiNG1vJUn3mCX+vbSyUo3SNiMYh3C6UnTIRMt3b89yHTSv0bteIlJgBUepMOvmbzDGO1q7 XNOy6SbQYUABMg/IO9jl99Cg88QCMxqJeuvFjiUq0mviLWtI56qVXI1wlbnaILUk3YbLXPaLQjEq UDovh3kDoLMGuu/ZIc08Dk5t27NEg47LstYdG9JlnufcjyAfF41yxWOEVeZWoUXkBgLa4wRwjKjR 7Up0tH+1w7ij2w5APfJFuxw2qK5+/qyCztv8V8yB5umPbj6nLl74pk2Ct7PuF56+a6cgvVTKpZ11 jqg+1hyXNaDcY3n08v8phJN5r88Gw5j2PdAxUoujeP8q2qTVy/QrS6XtoNPAqcAZPppr77gfP8m/ TvZQMwTsHz9rHxL1sHsEGH+S9/Zn+dyfGLjOxMPDGy5jO9fZno4lyuRho+m5DAUEYNo5jgei9oZ8 ZADc1qNOGio1HnYMEsDXc90WevtIHe+kNq7C+fbQxT5YBCTIx0bRpCvSfYXzevJ6h3rRlLP4M/La W35Q7b77zapjaylgLJuAPMAGCTaApzRl9oAsyHXbxfOlR4wPEoasP0+GenYnpb543+Ia+3WoGK/T DkoUavJafXGcIifDiygBbKBegcJFN2HgU6eG8UZtQAu5S6njuSxBfXCxO9jYdXrsCbTxWnVB/xAW 15HIrLwu+ll8AwIZ5tIf9Gonu51wMMl2ARhZ2PfwHFISmw2rn+fWvushBB0punibsxNkM0mRDOaG nuwONtBdgIpFOMLXd26Iu/Eq9QJkkyCkF8b/MDAszkJDhC6jXRrgqUecMX9gyWcBssmhRgwS5scT PIT6Ds8rr7IbYGMSYVw7+rK5D0PsOsB8Za/V3rV0uEU7BE5JOuYhe6QZqJghpKI/YJpD28T7xSZN ZMEkSpMX0Z9PwleSRE1StDQ3/Eg9nZ1waAXqCdXqLZZ6wb116K0GxHiMRSSD4TAK9K3q2dJfXigt esJ5j/ZRqG+vr2w5xVArhXSi/MJ79o1+Y73teoij+EA76f20v2I700+73EczZvWYHQK2OmvFloTe 6QOP2cVgHqEK4+nzI6HzTLDunQNMqgt0j1LoJjfuTp8CLOurhlvOcy3df1j9IVzsH707G23q2zdv VS+SA3CZiokTqNv0QYHZg4c9szhf/QQ96x/+8EZ1G++1knt78KivX6dc+Re/Wn0Oeb3LSB4KPu4S fVklMVCX6zZefU0ccAVtY8n3vWqFPo3YYvjTKmKkalG8go0sV6mWp5wcB+H8H0ddZxAQH89pA6gE 1rSzyYqucb08q0NMwLxDe5QxbBKk7UNyLxNkjPE1PoRRQV8uUK1WHM6MTdEgJ0Ev15wimrTEXW/x 3MN430+dnq62oWptLFAyHi/9H377RvW5589VV85PkbTZW62urCeZUq1yK0jeuPMw1SmHrw1Uk6dQ BcKAvmOSJLKFb5N3cUDi7Z4JkTyPycE9GA1S03rxzPdQjl7jocf5CwITwGZ5sb2ce8yXNehm6zsk kVpohaI2fUPwsqGPqPBy2N1PEE6PaTGiezvw/lKcRodOF0m6co4PrDBqi4faVGItwd1Z+Ip3sZF8 VUqzYPLmgwzcEvHQ2oux7mLouuji6Zk9Z1kXo9Gecd4kGNbrZ3MhDUdBeocyqHSsnl3GN0/OdAa8 ktC4DxWpA0nOzg7Hibxri1dl6hSKnONLvpSVYsvdpM0C6pxTmXtl/dCDXQQAyvM0gPjoLYEvx+/F o+L3yrHOa186SrIz0D9RIa8NgqJk00B4lzkpW6XfyrV4RubqjtdkrdnK94qjRCWjQahoKbrF+0l6 dH3ms6bCZTs49bLNdlWe6tN/NUC6/b4a8Ozd1M19dGM2o748tgiSgcO8S7TQ7/ys4K8dxDd//7zb 42QPPK59mn77tO/1Z23fpx9NhnXIxC7JEjUbKGakvcwiRlVFEwM7T5thXxKeYrV/nK/soUweFnY3 al0QH3sDu+C5+KoEcpPy0HMUObhElUf52OPwd5UNi6JFGfl6BvbhHv5ZeO2tPay27nyHJMOHbOaG ++T5CbDLgpYs99rOiBGU5Bu9+rURlM7K7lNvHhZtCZ4uyUNmlrPYJojt0DKpSlpFFnzBE8l2gmuA dO8sldfmWWhBZ90Ar202j7ffWazevXmbJCbKPEM7EBBs6kU1Ma9vtNpgFZJGWxJ09EbznxrWJivx HHpm3aStancAsO3hxuRhd8Bn9rhevmNRGT1zS0CPHsbCIGB0TC8xYELNXrHrtmBSkM7m66ag1u4B m7P0IcxP1DoKuNySxMx96/x344oUVrz0hRt7gGLFvrxl1TQACiakqXDg/pQsfOYXTxkvdadlzgeR QUPhAuMzG+YB5blNqHKTTVnyCBnXEnd62QUbAn9BtGFgKcaQUte7VulfqtoBcvoMqSufqALLCp5D jrOAhJtX9HOzMcofr7cCdukdZRUBWT14J62+uIlShu3aB4juhkfbMvQvr5lnkEepPJzAIdUwJc+y dih35u3uU0lhG079rlQIOf0iQl4Fe9Sq6LX36pDoieBPakYPbXwIZct/Zz5zv8o7WhVR8G6xlhbU gi76szPRhIa/XoWbu7u1znNAE6NzjJRoSEwPd1SX4ZfP4FF9iCzfSy9cr86jZ71CP7/7+t3qrfvU AGBtEjT98X//k+rd74xUX/mFF9OOd+7PVzdI7NOje+3q6erLz0xXU51QG/bH0cy+UD3/7BmqK04T ZaAsPXxlE/WW4GO7a3bLTaWPwk3lDeeMQELDZ49n2ZJyw7zpOySaEM+fhqLFc9Awx0gVrPYAWv33 AIao7bELZWOX0umb6/CPrWjL81mIxXawaIvnOFDFh7UtCbpelHNurSFft7SFN7+jOoMR0EObtgTb zLeV2TU8ykW1Z4s5tAmi2RWly4fuJJKEkdrN+BmbmKaozmj1rT9+q7r11v3qb/xzX60ukMypd3IJ qcgB2nAUpRn7e1EqCAbIhXOnq0O80co5rmDsHMxuVOPneFZA+6Zee1VMoGxYfsFoi+CcMErMHxVJ rD5p0iZ5mAFr2AP0m9QCCzRh3AHa+qCh9PHdRLgGRiIFuorW+TD7m15RsiuhNqF40zUW46WrmzFk xMi5azaZveM8k2pkFEBtbDW7rchK2yZHo3ZFx7OcaA7PwNoWsBn3c+OocZ2s3dwC+XDGCoiNQ8Kh 4LgVtGft1eEPgPYeMBR0CrR45iHXDb6zvYMS0PZDgCzjoJ9EXCQJs0V70/Hec4tcepN7sXCQ7VQM VyNkzvF6vtW8+0IWK6BOL3fmf8G+dXTP70ifK+OxiV5lf/D+8yzFo6w0pao0yX9wrPGBfWVbyWYp uuEaDU0eCX+G/lPuUTqUzr1d1tR91nrb3WiXtCeFwFLd1jUzPVQepXm1g7e2tz/wz5Mg/QO/8D4H eK66WcoYartP2zi1F+of/T87cBbXMSwoOUC0K3bUY8kEH3RPxbx5/OtJ7zf3936fP+m6PysabL+/ dvDfDMePHfu9T4N5rU8MXO+jHWpFwkwMO1qZMaumnRkEeI4hrTdEoY+itvFRedXv1znZPKhqoIeu M1J+P2uXfdCQqz8Pb5bTW1nuJwvVHlnl0lwsp66HPl4QQ39sInvr1lJ64jh9ygt+tg/bX5updm5/ iyQqeKGpKOGKUGS+9DOUdLWaupCFoIQ747Bolg7bM6uwXOGyPCUJxoUvfNbaa3nUp34B0GWVOdUX klxkeeNSIW14CDktFmbD+nfuzlVzs0vVwuw86hgouPSRRCaYTthVDycbJseZDNN4g/YAmrsABuXj 9FzpBenDAzgKUBB0yrfcMKSc/Y6NmWv1kfyVio4APquZBaQbfhWAI4XlMhdVs5gaxZMdDVk2yIBZ 98w6xJkFQ7qvFBg9LXGu2XJlt8v445578ZT1IXu3BvDdAgwZhrf9BvDad8mZdS5E6g6vFJt5qABy nk1kCrVCXqOKISZ36QkqnjCTNqN0E09b8Zx18t0+qCSdygaKc3nOaNVyvG0ZiTMRTHixdWA4FQXh pAJwolcOWJOGENk9QIcbaVcoCAAZczH09AkSDMvLD9arXW8fYXQyJJpER98XrMgFLrijePZsm8ic 1V7CSPLZUdynWuAJ2x9tU8Wey3uOBf4hUM0QrsekwC6Fi+qIgHrA8UXyeSTZ+KwX42AYsLpC6e1F AN8DeMeXLk9Vz14A+A0A436MZ5WiOhbKufbMuerFF9B2BkgvoEYxo7IHCaSpoEd7XDw7UZ1GkWQU IPvs5emoXBhZ2FxaifTkqkVkGOephoex0E9fu7FmnnjPjrQU/TDC4nRQoUI1F4wVvdiW+hZMc17p DkZh/GybeWQ77WmIWMzJvtJBoAGW9uEavLeNJ1uQ7+bei4vMMboJqLVSoREe1T36aIsNPOuC8ikS DCc5doe27Y21yC0t03fR7FYlBQDPeOynWuoFCspMTo5Wd27dr956Z7n6w2+9Wf3qL5XiTw841517 C3m2MQwZaOahjKiLrU9HA8Hncqbs0Sfdho7qBinFixhngs3aSRIThInX7Y/tEwSoYcm64oST5iHJ gcEgfULqiA1thCOKQIw9pSI1TkTuOldsr06lI53QRnAck2WRCIAu0bwCDRrd9SM5vXq7OgILNnh7 JPiRbcDzlDUjr6Otrn4jiKseDB6UZylfiC+3QWSKCNTLcBkjZf6FPuYSVKOYwl1uom+1x7q5bPb9 IyLIEbBtLp9m9dgGER2hr7JDHN1Ls7bX9+bxzW1mbh+tkcUQqZfKjCFfMZQzt8u+occ9EUdexthS jZSxpoa6ydd1OkHW4cYYeKSJ/xT8o+yYpZ18jpjA6VAbq7ynGXbU5H8Knulpb/FxwKogh+OfT+u5 PzFwvXt/tdq+s1Jkw9wgCc0n+S/Ser3lYVP66Wmb7cMcV6z0LiWj8Ih1YrY1YaYPc7YP/E5GLVNS gIcHew93x94MFRmhvXSdR7rPIjZsOtsPVz9+D/oH3tynd0CA9a1vV4f8NoSfjY0NJguh0z4xxRI+ bRbZcnfSI8qAcDnMpKiBXPkX368BUklME0DpBmm34zkufGM9kPJuAdhueFy3H/C2DlC0kMl9gLVe r00AjHfVlAgXnOzpOTK8yK30wDGNNyarUuEAluphZUPSm7MhFYHjd+j7Hr0+rFwm9xl+3OWnN96q kpwX8CVYCbWkeOQbb49ndN2XZx56hAl7epyDostupJetFNSRVmKIH7CsYQdQOIgn3SQ1PdN4XHm2 XUEgKCOlx8dGo4xgQZaWEoO8l0Qn+kYgI9D1hrzvpkjNUWEKvWhWz6yN4XAy9YT5Q4KYuuDKIO7B 0d6aWydxdztV7orsoJEpKRc+kzrlerBLgqRKI+E127lZD/Cu6xk0CRIjQXBugY8ydkpoOUVxyhtH Xrh48uu1JCXKs7mXHaRdaSgePVUMTIbNGNKb1/xdUxoEyX7PeZzEs3KcYyPH28Zu2AHXpSS4KCHl 330225FHkRM9PTQEVWOnegv+tdzps3hpB6nQehntaUdeF5rOyrZNoZIxBcdYMGhFQ5UszlGiXLB7 CQ/1OcBl7zSlu62QidqGHuQVALWUiy28xZYu11stXWMfWlSXBXIYR0oH2gaCT9GCHjr1m1VuSTtr LKpTbTTRNpeiY/9LccBI3bLwlcZc2oA+0zBy/OWnPPf2HoVY4HqrVa0kHvCae9qvFlDS0EM4hkKK ZvXS4nr1gDLji/DSz5+1emdfNUuJ8XXkB+Un97FPjPHeTvcOxV1K/sX582eq1z53JXP33r37KH/M V7/3h9+rzpweqn7xyy8EOM+w1/RhME5OEqGyBDyqQLPUVxjDm62Otpr2zg3HnYZeo/jjeLMoUxhV 9p9RIJcPrpwfueq1PKbeXKM4B7SrhXfM3bAtdpmPeukF1EkmpO+Tvyh6oV+9lhVfbW+pULZX6P62 cb3+lYWtGHeRvPPHy3kzNnGNSBvwWNeHec+C3mylJYm5XN/3aoZFmRCe2jHsBAneLJKc5TMv5kOY RVKAt4a2hhUekqyn9eJcDq0RSwNE2x/n5M0dearLlHzUx+XlG8TTOOLf834/xfsAAP/0SURBVHTH UCF2QQCylJdHAUQD9rNiRy6oPGs5rHbOJPG6rCGuQVs4ETqdAxhC3fR5A6r93XivH3M7n+m34gjI E5tsXBwB+0Qnsp3W3f2ZfoCPcHMNkH6/8fgRTv/UX/3EwPX6d+5Ck1hMgmLPtYmqFxWQDhIXTWAs fMWnvscPf6AjSX4pHmvLnXehs1su7M8naL84+8WUehmR7kOSsOqcQQmFKo8VShk791eqAzaATrPt /gl77a8+xGP9TUrPPwwHOIAolrPt7WZRNoxWii+UPkiPBAyXjS3v5c16o4kbse6venNoFB+KjmqN r+uzCXIsdCKa6yIGFi8Gx+nZWyRhao4qkMvoDftdqwN24nnuJVy8x0Krt1bP94FqCgIKgEs2mtq7 tWP4nJ/tgBDAERcXPOulHrR8OtcWzCYRh+8JvLvw2E7R1d2CXxPAADr7RjHqRU7lDYFLNjbvNR7p bPl13p6Jc+V8gmiLjEQDVlBoEiDtHCWBgGsKhKhsgDdzi+foglYxALiZmELibWKCPbJUVczOKudZ dQBLlwMA9EbKv07ilvdXiJXZbIvRo3eoRAsE19m0vQ885PtQBnYBelHCkVphwRHD3HiilQVUlUSt 5V10gKUVqCSifJ2Gjx5pN7ckMaHiIA2ml7nRTWEZ6UQNAK6de8W7Jz1Fr1nyHmrvmmND4Ihx0R11 BNuoJGE2hXekqQnOsynHQNCzW5IUi9HC8W7eAfIWoyngJiH6Bmi7YWdIljHtNRqecdrLdud9kwHP wJ9eRH5z6wEJjQ8fVt/6cV+1Ar3ki1+kHPkrl6tLlyarW8jDvUnxlN/9/R/TLqUSqW129vREdenc eHX1zGSqEvqoen4XLcQDmF1F3m4HmoXGh1VH9cruEf71WXY0WAyLO0ZN8NTwU0oPcN5jOXKOHxwY KjKS8dqK70ohlG2A8Q7zwP5ZB8ALsm0nKVsqu2Qo1G0oRtuh/y1THg+tRimNoCLH2vI2ah69Ve94 MeBWGGOrygFiiFk0aGysRFc04Lp5uPPTo0kQfoiHv/MGBgYRkVfRuP7y569WCySGWoxoY3Oz+v4P ZqsrFMh5+fnL6E+j981YFwhNYLQIwjduzVczGM/OwR7m9riJjKy3FrDpPYAGIL+XcetYdLnZU00q hjFt7Jwjf0BgrWHcQ+Qm/a8hKxsXupYvNes7aQ891wfKv3NdvdcxYrJUlbyBnSSoFqWSwUP2v3rc ZX4719vAYYzASNcValKoV461+icKPUf7Zo2U6/UzN9VsaTEQBNG1EVrOWMNll0IHeHEYHEJTK1rc 9YnkT0s/0cOrcwB6yKHRE9a3Q5JkUwVRw0EMXvB5cQiUZT3nyb9zQ20v3ghQrQ86euxmW3Du8p/R rke+doS663fLrXsVrlmM3ZyWE8a7nouXnBjXCQ2RAErnQg4sv3NZvq9K0Rrc+H7GYw/yo311tCJ0 mfq4TwOqnGyuj+PfZZpKldFQVlLSUVfisLG9Po6LfMbO0T563sdO+1Tu+hMB1zu3l6u5/+qHWXT6 Xj5X9ZxXRaMuuPIRpfV+tlbBWwi4l5bRaagccOva954ky5/tpE95dNmwXHUOAB0Hb5DSdne96jxD 6JJQ6doLZ6rRX7j6lOf67B+WCSvH+jYe65U5FmIbWieyXkm9CKot2BzHw98/G5Acr2CdTe/TBpJH 49Rlzg2uhB9dlOPEzSafVfORDcj39JZ3U298m+qaLrb9eGrdPpQxW8Dj52IqGFXa7UAVBLzTAmxp JIXYV/jM++rwyoN2ddbZoddazzT9GtoGC7Uh5QE2/QMAix5nr+PmpeRdcR4VesQwz6OylcDNcHPa S3qJrcOBWcyzc+nALbSHiI7xfcQMCn3Bs0O/gIjKX3pHS5GRbnW/axDqYnoI6+iQbLoOnql/dKQa g+s6DE2kA93ltCzPdGASm8Bc71sMClPdOLfAug6hpriMG3S9i2pgBPjpbbeT5DrbT9nU9H6aja+B AQiJgSJruyhPCL42UMsIuOYn6hU5r9rm8H8t8S0dQQUGjBTVRQT6eaWcdgGK9rcA2kSx1l5RCGkS h5vNUNUHNZnlru6QTBqptnispatIbXHMFLAcD3z9W9CdqpcxAPX4CLgdxLUHs/ZeN55Eb00DS3At 9SZVIe2nGjkYUejnGQYx4HoZZ2u09R0SGS1QNEnVwEmqD56nJLlG0Osk7N248QDdaznEveg6n6Hc PJUV6bsJ6A+pTMr1F0niW4BXnIItNe/UyotywUuVPSMkKuQImkuCby9Ru37OGbUPk0m5rx6rPvLv GL7qMXMPAvJN+sn+UZJOicst+yrOkGJAFCPEf9cOEu7Dyosm4Y5YUdNkSgwpJQz7mV8jrLsmsyqF R4wiVSxtv4GowxwChjWEivwfEzKJZyvLHVHyee6ZU9VLJG4Oc46HD50EFCLCs720vVHdvDVXvfH2 /eoLn3+munRxCvlDEpi5Lz3TI8O98Y6vMtf9zoiFi6TQcF+DGmYp1iIFhb6WliRgMzHX8Z4Eiw5A s4ZwJnpJros3VyNN6b2SK6HmiRSXLfI4egSkOnCQ8tRoNalYybhdgSuE5KLPLLQx4uT1S9JzA5Zj zMb54PXLGnlUCj0BnTqS9zRbQZbFY2gYXnIeT695ec5Mpfyfx2YhLu/7i7+9t6QLm5BsIqY5IIws HQfJ9UzeRwnUpnk+4L5iR2SNqw+swXhxohQA3AD1+q3Hn7F+rGKXFGR+bID4CKX/yu9iBPvsKePu mpvLWV23JJUakcjyLg1I7fY6olC7H56mtT+Tx9QxhvSx4Fo5Tql7g+SHlOTQNN0/Ua9mDNbD+hHj 6OfxqB8/uGakrn7vziHAujX8V68fdlJd8QA2/YFlrhn0LsLHMaBPsG/rlu4+jcSfXkxB1nNTAG0o KXABkxL8Sb8EfvJMi3xDQobVyu7hzo/nq8XfeqvqvzLV6pke/qTv4lM5/8HabLVz50+q/TUqL7JZ FgUHN5iy8oq3MpubjSMgtCyjpapXAXKNJyeel7yX1T/LYtZV/85eX0L4AUs1wCq/i0yVXkgrNh4C LJT28lqLJJat8p7qE0OE3eOC4f1+wLEZ8SbFJGPe0DwePlddPYZuiPIp04vek//JcYjHGSACcFjh 3xavKMJ8VILkmoJupcYMTQ9J46BBOtnJ5W7LAh+C92oiULdAl/+KCpdn57ZUBQAEmLkfZ0xCsvLJ iw5t6Ap6mfBGxPOrULGea8CT1SdHzk0TncfXBpjpQ65MhY9tquIlUYrELSsfGlyJKkJxa+TZBQz7 eyYHCY5JwIIbHl5z9ip7RYAhPaTQAuyHonyCbJxt4hk4dhuP6gYUkU1zELimHNhtvId+R49JD22t ZnLUHpifA2TbdEB36CA5LfkRPJPAWbCbYhxyvm0HvVsmIOElbKTxcJlm7KSFBJfqOXMOeh8aVgG8 e/4ODaBwxnNsvYuXZ0vzlrFkEQxBM+c0h9QxZbuneI7tpdORw7OBcWDwGrkU21TkS5KfXr1s/np7 3bhNIiUJC2/zMmPQyp0/eON2tbC1GcpADD7WpCsX8ca+crEapS2u4pm9en66Gudvr7tCoZl1PLRS LdYw1gvHXGMHUMwY7EA6rgMQP4hRofbzKKXq5U37Y5KlkRXbtGy6RUN9gyJK4QmbiGh1TsDnNpEa C6FkfKkyAMiOrnfmrR5s6VI2VOHh2j/btM1QzwBShEOJDq1jRNku44y9ARQ7NpkfVmT0uc9Af/H6 cyiA7M8DunmWUcBvqBpkD28zjtdQCLl0ZrQ6+/nLHD8cDvoDEpI3oKiMjo3FUHkwt1T9zu//CE3r 0erqhckoh8ySIDkEEFeeb6BXDjpectCixWdWyAHaMAdhkzwDqBwmx1qkxyRqWVfOOr3VoYPUBpLj a882k0KgcQHQzBzUE8j9SgWTG95aZw6QaNxNmzkud02ui8eQBgS091tCPHNaD7hTpBhBBei2Oxt0 QpR/ZzjWRpr/KDQHJ0ADIXLYE0HtMV1C4Fx/pwbV8WHnmfVSlzX56Kp8oGK5NTZNgLWg0z7WfavH MVDvY7m5Qp068lI/elvl5tpeoZvXy7+3E5Ab0Hv8DO0AqLEN3gOKmu2gPrefh/aQyEr9pu2VraRQ Igq9q/ju479wbusYsQaGdCScDgM4YJg+RwA8+897nuJP1xtGz2wSx/3cPKrsu73VyMh4NRiVoA/o sD9dj3p0t/UyfgSsmzny8+jLjx1c+3ADXzrfuvTyGfWlWwd07Pbd5Wr9LbyaNxdQENGboOWryfsJ PjKTymsMXJkmpFUCIP0vnMaLTtGCH8MFlv/2Sb3cKFSAUN0AsND77MTh8C9eqoa/ernVc340+Wem 8Csz9k/Ca39tDn7996r9lVkep1QeDBTO/C2Z6Y8EoWJa1qukbdUsmA3Arhsl4Nt+rN0dZcF0g6+/ k5W5/DsJby6c8c4IimpOaDO7ym5VpLEIVQ8OUqiopqgMJJkFoGcd9CToAbTpNyLC1YjZ5Hqy9GrW 3vLCvUUVQcDKBr68ulw8c6ooWGgFRLbpD/exbSEaPdcp3lIS7xKmC6KzeEfhZsOCLgt/2uyoQeIB 63TTjptf+Xf+DhC2ymLZVPSQ9bDxdaHJq0rIIGHwcfi6gu7DJHOV+9yCa96CP6unSe9zi/cyFpsK caESyDm3DW0/QFyyAusEVA2agHOTRf2ce+FcvSgJ+CwmtSlFtiGQge+9SGKZ3kND/7MApN268McY 4f5xJMykRak5bGJlH8U5VBFS0815G452cGytmlBWjTIyGqPM9UOwol1RA2/7qokwqCDSkg8dz6yK DMV4Kx6yQrxpXja7Z89PQICRJzyUaeuGc1yoOA2+KYH1YngkkQ3DTVOkoA6jCl7asSp9hXO5qdNG G7T7Tao43oa6MIuiBC6z6uLFU9Xnnj1XPf88ES0A9RR0h0G8zXr8lwHU96kyOIsmdhIAMQ4zo/TQ 0QaOjRR4UTVDYAnAlLOtsSiw7wjNJwzaYpTyXZUt1lC2ULs8RpXgutExj+EqjuP8elvtiJIMUDy5 dV8IzGzrblBJh1Qljt+2gAo/Gk3SezRU1qFybMk75t/x9NOelhmPSgzXGqLfd7nGJuB1HR3MdcbL +dPj1bPPnM44u3HjIYCbyArzXJpJP+31EIrNWzfuV29QynyQ769gePg9PZBDUF5MblQ1ZBOver9J jXgl51coJMUxan8bYVI1R3m5MjOL+kyJGNXcer3RRuBcX0xe1Fyj/XeUydGo5GeXOSK1oIM5MUhf 6QEnl5Q5wTdqr24ZskUjPWOmRpTNmDsahDZxaJP1GtD2qxn+hWb3AcCvXusKfBKU11dovtgg15qW 137CLM15g/GsJJ8/rAVqYCeypZHhg9kmSRYsy3xzjWb5aptaza1nqWlAa7jtDqdc7/j7jWP7JPQr 93X8HHmkGij7fgOii264EoH11lD7awK+6ydLQDTXL84Bcw/k6uu1bq7j7+beTt7LyWf7rP276e5m PdO4XVxZpY80mseSOF/G/D+Zr/bh/vN8wo8dXDvh+knaOX6hk0qxgNEvX6nW35mr1r53+3DjzYet fZL91MwNl/UT8Ga7KPdQrWzgqjnp5dVzcbQa+fqlavNHD4oHS7moj3GMxTNWl9uW5z3wubPV+G88 X43+xeutvutTAPqPvbl/nmMn195dna02b3632qW0uRzrbEZu4kEoJuOVxa68jsFR8eoV7msKfNQe 6o54nuvtuw6HCqAT0vQU9XEFkIdwUsKnWQzpTy+vMo1SeICMXeW92Ni91jDcY3nP8A2y8ffAIfRS ghi5mVvyry04A+jbkxuNF0/QbSGKKL0S/k3mvFfiNKGBqEddnUri1xKV+ZZZxCz1vYFyguWd15cB vYDaLsDOIVQH5fjcAOQE73Lfu/yt59f7iKfU9sjmLm9XZxG/AbsNID5EU7pk69dV1aLkEeIMwANv NDzWHsLzUkwKBQMQI6+a+4EAXhK3eCY38E0SOi2uVNRK8JDrlQwNRAxVQPSOnv4aL6YDArABF/RD PLJ6T/E+biztkKw2H0CzwLVWePZZquPNUWZ+mbaZ5X099FN41V+gEMgpCtYMjAMg8e73AXLk01KO MFXUBMEQV+hgQ/B1H9ccaxFxAC4bfLmvGkJI2dETye+0p3PRMuzSHLi/XcBcvFecR2+uNCUBg88U JoD9a1+oIKGEn15f2k2Kg2opXiybc20MCj4z3nh5B3p9d/ToM5aMjIRnbrvoFa4BaFcPlUKhJK1Q XGuF98cmJ+AOT1eXUQq5fv088nETUdGQq75OG77z7gyl1OehSdB3GEWONT3ygmuf07/10g4BqkcA 5FH6kHsdhRVGT4yvwucXBMqh3pYXb7Ii97u5ZiShVEjNtJI/nwJBZfyVGVtLMOpppRnCc/d3M6Pl e2MICFLXaGMVQpxLI4Bb+d2rW2vVEs/chwd7ksqJGpJypE3aDCALlaoktKoXvrFKKjD7wmk879OM kbehfizideunP86S8LnAmN3FkJTWskjexDeofCm/+xSVWFUP8b43LbOOFrge9YeLK4kemWu6wTxc dQ12nKhik4qfFikRRBPxSN8Wr7LzP2OCiBYsrFKSu27PHSJetmF3Kn/u4hXHQw6vfnBnI2XYh1hn NHS6HaPy/U0IJRFyX312AanVCr2O406AWEO6cIbp+xTTilGWRe7I4G682lntNPiaZbXui+ZXvPDO kdr4LNUNS18emZD1pPazk2DMG7N/9dZ3meAnDStTykiS0ZuyBimD6vk6OUaVjRrTl+82oLa+qfhJ ynQrL+dPDY4bRBujL/y4cp+5RdfZZtuoP2o84EfPqyHj06XvNDr9bhboMoKNLsUZIbUqhLq8VswT 4YJjIyh6hcNZwH8D8DM8T7Ttn4Z/ev+1oG1ud501UEqkfee4MNPrCUPn5/54H0d7JyrS1nefdj82 1/7U0F4n3sCRV85Vg8+ebm3emDtc+/Hdav3N2dYeC6eSXAFJHwfQdjORfqG38PMXqt4zI0cDptMk mr/2YrX8229Vmz+Zo3CFBSrqBJQP2atHJdpdFUymmiCp5lW8T79+vRr5C9ergWenfu4D9pO6gd11 jKW7AOuVmVBBslFlq6gBdRBoWVGbha/ZEY691W2rWVa2AjSbTaXh06ktXBbKMmtqckYN3I87r9k+ BMR9AB1LKwfMspkODaDpzAFhYrLgys90/U3FOr1wArhcw+puADsl7IbKcY6nbikmySoHbPvbjYWd txNuxw6Acxne5yIV4JYB2XOLRGvQet7Ea6f6yAreSjdvC3Jks+J8SkKppqF6QwoopKMMxhpuL14V PQyRiuN3PLEBS9oH3APgYGdTvi8L5hilsqlq1wXIcuNfh7trpTk1TXfdrNV9BmzE+PHcPNsOyUrd SOLJFXWDzEc1J1WueEoPk0DXEqw5N/Vmh6+qJ1g9acAawGb9Jt7VmZXqxoO56g7PfY/S1SuAinWB FKBlQ4439z0AqN+nLa8IcAFCvdyvQDYe/Bq0aWSpX65xnEQrucMaaHXiXUAgn8UYS6y97BSCNdsj CjGWtYaCsoNxIG94H8BnZVS9qC01suuN2/72uXxlnAWBFA+jOLmUsi6JgQHgoe/UdCaHdQBn7dk3 gEIyYYeShMqt1dSDLdpQbWlvU6NgHWm7dcbD8ER39coLF6vf/CtfqV586RIJVf14X6nmCEhbhS98 895s9RNKdT+ggqhj7eqF6eoUgLPPKhDcgzSP4dG+ampsGE5yCWs7/wJENAQEQlKmHMuAzU0pOhpa GDomxkVfmbaJpy90ESM/hS+ugWX0RW+gAD4GVKnMUYOQWtXG8c9nA8yrJbzCC1SitD3HAMX9GLZq vG8wPtQL78GIU2d9cX2tWkAhpI9/W2p9NxQnqSdCPxwSGLijrNPDzF0rW967M1/tANp978wUhZ8w GFeRzrQYlAbNuxSOERi9+tz56vTUaNpYr/gEhpvVYDUUdhKtKWDNIjNSNwKYE5HgHnhOQWTWHf52 2YosJl9wHdDD7XxVSnIXMI2ZFqQocJaTvEWkZod5ssazdex2VNNTRGYY5/6Hy573vI5LoeOlXqsK Qj6COQLlAnhKNCDjUc1m14Bwv8vaGMAdylGDOI+hg+PX0xfZuRwUCkrxREvdKpeMQapFDie/8JeC aHP1AF6zO3RoyLnWK08/Rr1H2hzPYRRPefmUa9dwbLucpykqMsUQ02+WNKtct/6dK5VXlt62f3fG 2XIcHWmaqfGQ52ky5YLuuR9pWcVR4z2brKqjwcicxyUfghtQ2SUJ4Kqf5AntGuVQXUeswlnmVSEV lub+rALQtuZ67J8+wZGBQDs5Z5z7uJHSv41h/EHnaT4/3l2f9hufjeOamdH0o23ysz77R3mSTw1c NzfZyYI39MLp1sCz09XW3aVq/cZstf0OWsP8vUeYUm9hFvzQRo43i/d9yAARF5LCu+oaowTuFy8e jn7tmVYrFeeOX8NfuVid/Xf+/OHM//2PWps/fhiaiuAhm3jA4BNmVT3Csqm7YAng9Y65QY8R1r4y UQ19+cLhyC9dbg1+6WLVc/afDC71k9p9b2OhWr/3Q4DLQgofHCGdLIzt07FGQHaM/VonOko+TNEY eW9y+QQqbmgBMSV0bVMXfif/qD04TZJoFD3S38XL48FFPQOwy2fd8mzVuQbYSfeYhrt5eJMKboIt AJ20s0M1byNRhHeYU0gP6QIo9+J1Guq0KAWeVjbpLLyOK6Waat1hN6ii/1qS+roY130ki0yj7OA9 rQMA1qBFCLZXAdlzb98BeK5E6mwAz+MgP+N4ss/i4ZuAE6petkk2Jvep5uDOuk0xFV1Ebq4JqSvt xf1uE9oe4L0eknUXZ/ASU6hj6oUr1ZlnL1creIt9nkHO62Zo8ZXoIXMPW1sk1eLF6GSjMbEt5X9J ZNSX002kRW6uIMFj40uMlxcjBaAkjWqbZzEKsEFRkPVFksoI1797ZwE6jB7szuoBHvu3ZheqN+fn qyUA5HmoDs9wTyaSrbO4682/z+85k1xJWOueGApXWU3yXTXG07k1P5rfkaXTS+sOrbcs3OoC8JK4 lwqPxdPXbWgXw0L1kY2HGDTz66FqbENP2aEd5ZCm9HemeImYdKOzb8kydbEF4n7XBFa1nHfwem+g orJOKXGBxYAVLYWg9ViwGJFKEEmOUuGEzw8BKxtyzXnGfdpj2zHLGBFkrtA2S/S/9IsLU9PV3/jN X6v+2j/7FSTpJsK7voeG8wzepRmcDQJsJeocP6Pw0ZVR1KOu1N0IxVQunJ1ESYOy5HDUjawICULT oc1VDpEbu03SXzYX5oVzYI1xodKINBBfmZU8r21uYmvxoLr7lITdUHI0RhgTh2o4+72AQ4Cm3w9w YqwCPA9ZO9cArSv04+UL49W586OpsvjQPgDYqpoilQOXcwyUPtYLDRCNmz48w+t401fxokvVunbl FMVmxgKI/uQ771Q378xl/AnOe7c6Um11kH47iEa6+to71Zs3bgdonYOjbhRET//UJMYk96cxe+/h cooDTSBFuUY/a2AqUViS98TJdXlt1xtpW3qXHWM85/auNBLl/Ei2pF9LMqlGL/3KPSzTrhpze8z3 ZTTzb9EWw4zDCQyhfucrVlqLolW9qUaTBq6jHwXwHuWdNAYR7dyNQWPCoJ53wV8XuuGOXXNIlBPs wROvM0PaVoIv9fqYjnXa8t1OjJTkCtD+kS81AuRv11buKc4OKto6/iXEFFey/++zcwI0+ZV23GAt 6OzHGz91CuOdKBPPvjEnWANwm1gdfocFtYqTaptSgLaLHvghvPh2+14pGspYLWu6Yyv3XN9vAwSd Wn0Uvgo4ZD1gOS+CPlEALaA6UqkB/u4LUvWKE0DuexNV8lG6LCLGGNpgHmjAWSSI1irJl4lKYAQR CRlkXe1HbAHbLR7dFAGr50d9e4/dAtt3uCdBhvYvHptAT9pRy/tPA+g9pvErNG3X1pzpzWIcsN7x W0pWH+v3NeaHRrim/tOCzAyt97/l2nR7/4M+6BxNW5dZcfxqf66mfZ6mjQoZ8tjI+HkYS586uG6a zRDuwKWJ/Ox/GY/KzMrh+q351vbthcOdByut3SUXLabUHnCpAWZuAO0tG2+mvcEwYhPoPjVS9V6h NO7LZ/GQn2pZyvrkCx54Nf0vv9YaeP5UtfTfv3649I/eqbbfnGvtr8Jm3KMElwAv5l3jGSjg7kgr V+9mb/dh99mRVt8z41X/S6cPBz9/tjXw+bNV37Up1rynHbYfMGI/wx/vbUJ9uP96tbU8m03Whb4A 4OJNeGSZyKoi+C0evvYV5Kgr6439eAKUMr6F49c+u/lH3S/NghZPjd5cgbYg22S0+m8BgdzrDugG JinWbj0WeuXm8BnLv+aiVlq0gECPtAqTAOVbs0mWEtH6ljMqArIb/moy0qPz5MJuULI+NiFn2AEA 3yG8kYMUz1iHCjHKirc+vALYE/Dh7eJ7S2xQXV0AMTyHA1BV0FpAbUAFAqhVPLhha+k1mwKReI+s TCbVo4BJq+SZgCbYHMCD2UOymEmUViCzcp9I0qIsPXjcOgQTgEU9aV1sOkXkT4qH/HQ4seoZ43U9 pBKfCYI+U2gC6rJTSt7Prai3reczChwW5OiuzmpMUChHWscw3tH+OSrV3YQrfO9htYjXfgaudWgR Joju9eDJhyICkJoHQE5NQLtp5ptAQ6qWuykvN2PXiKJnax/rTVZ2zg/wKOqB5LwCcNBxwHG1IZhx s1VKTn1zqwjWyiQJ/dcbRcajY9X+5G9LujtmBI8CrUhX4dUSULq2OKwcA/m+38sOXU4Rzy9GCW21 RZh5C/C4z/hS9WKRe3yAhvMM7ScHfxQ6zHPPPF994dVr1V/41dfgFU9Ac1ip7j2YJ2y7iEQkOtBo hOtp1SAaZByOYXhNQLuIkcc4mYT2M4rXX+6xcnrqVnsjgsUky9mn/G2SYrzX0iQwMCwGY7Klc7Hw yQs9JiBZMOlPnk28pQe+bEyCzB3aR7Djh/oq4ufWQE2Rn67qAYBT0Do0Qi4DKMVrrjqe+G30qMwg m9kx08X968goHtVtxrJqNd6TPOlRfuzDBRI45/mx5b2OlB3nqPSXHSgWi1BgtnZITqcv1mjfedru PgV5xmkvedZGHAYxGCfHB9OuRQdcg5v1QEOEx1HOcKfHhOHiuYzCjAo6jIkO7jOJs/xsWX13b5O5 RgSG+ebY0mBcwfhZAlxvkYDZwfWU6GwBaj2HOtjSKDTwUpGXf0uNaagejZrFsVVDuyZC43Cuq1y6 lggjNSxrmofrWAC5jh1XyGa5LdtgWanS3DWdpFlkG6+5a23thApn3iFReGABrNInsoYKYFkPRtAK 32FgrZIbIIWNqj6J5A2Zj8Chm5xLrv4aSZ2JmEg7k5plvkfuG4BdL70pwNygp7KtFgd0/Xb8KPUz ZCi6Dfssft+tgN+eb19Z0hgJRdHHdja3wZwYgbYUwn5pX67rUrRY5E1e9ZwaqcnL4LQWNkqEs4/1 MD644tFu7qc2OZ4a8GaQfwqvdgDqvR7HHcrFmy13hfm+hKF5++5CKHHD5LX0uydk5DwdkP8UHudj v0Qz5E+2Uzt0/Ngv+pgT/tzAdfu9KJPX/8xUix+4odstPdg7c3jPFtBxxYOzR5j0YB3wu7GDUIGr gWuuiWkU+h3rb3XBt+uDX90D17uHUteqDXzQa/C1c3Ciz7Qm/qVXDzd+OFNtvTlXbcEJ37m1cri7 QEAbz1W2Ur3aLIo94wOH3aeGW914pHuR9Ou7OlH1XKac75nhlklkf1ZeOwCmjZlbcK2XspAm4c51 K56Lsjpmmz5Cv1nmjwqEBGiXXaB+1QQPN/3GneHHOlLClWtOVM55xN8WIPhT/5dFxRUzYKwsukUD u/Zoq1IhyDO5NZzUUg/Rw1MmW66tckxuaDVNxDtLYqSbED/ZNHxWK1YLQGoa035tjHmOgO+aQtLN 8SobjLKIn0NHewtvryHxO4CpFdQNlgAgawDeu8uWYe6CZ0qxIb1LgO9pvJWXCHMLZqSWrAIgD/Hq GPRU71iZN2XT3HUmT09WI0i64TJj7xsxay590GwTbhz9AjGBi7QHaCvqUXdqRPDZHiB/i5C2HOde AIkSeOELA/x2NvC6cvwG96tXT/1wS6abhPiM2tmoNXQgoaandlU1Bs77Glzh/+H3v1/99nffqN6h jHc3QMgiKXLyLes+y3x++/Z8NUabnILa0GE/WeBDjqfGTorIeB96VAtNp9Gg7oRraytsQKEwkj8I 8DzA1bo6Dw0HLWSpIa4R8p8F2YIo28HWELfHg6fnyrETEmhtPDeREc0kx4DUAT26OvHs/3gcy70E 6GvI2f+2J32xjudMqb2OXrj1rD/LAKq3ACRvPpilbD0qGRfw4l+9TGXBV6uXX7gQ7+Pt2zPVT9+6 g2eVCB4AeAU6wzp9ISicgp88BTCcQEJxkqjLWST5LIYi8N6MvrXlnRnTAtw2e145PY0DjTgNBCW4 9LhuS41hUjmeNCYjPUbOgb9jwPBeye8lYhDAVnjY69yTgCVGhtMyx/JbahPAWcB0d2E+c+j6tQsY lD3VMjrcRmx6MagGuGeL3SRxDDdmCtgoecZ5tpT6A7D20mejGKCXLp2C7tJZ3bkNHQaakR5KC8EI eg3ryzWfmgC89gPeMeRU/HChWJfXDw3q9bfvVudOEUHE0LOojcB6emokbfAGY3INbnSoTvgnBYgr cLY1oh0zPY43qj85xr2HA8bsEF7NbsbbkhUf4Wtj2gasmVsxyzOuEQkwotOFZ36UtrjItUb0M2Bd r1oaHW93P58RwiiWiuNG6s2+2u2sIRq8GjUOTpeulKgn4sF9Os56SPztYM7vYBhp5MqnV8VoFc66 uuFJwPPHnomTo6yJ9lVTZKuh1WW856MCHZMT4/qqRVZfP7SKnE+vPkYIC02/9bIxWreheh2uwaPv pAhcjFrGix5yvtxLFGd/y2qe8sBLPztXVpFCtZ+HhxijXE4bw2slQFyD6ua3z2+bZNttXjVjU9xb dPw1sjH+ct/+SPvpCrjW8I4HO955DBkiLAwz7lF1GCl9FnkyWsdPHQnbwsu+YQVRJEQ9fYzJsvUE sDa85acBZXUTtt38o38+zTme+OXHfNDca2OveL+Nx1paoRG0N99drN65NVPdmVmuLrB+uMdY5KwB 1z/L9T6tY0+2UxmtfzoNgc8cKuwy+YSfvnNj9mcrElgmhGyTxiKvufZsORtaPQSj8DZayjlexJ/x 5ULafx1QT7IhQCxJlnuLm3ix8c4ls6LmI3qNIQL2eGU6WDBZBD/uufIz3vnP53B5vCsz9+iP1dAA wrGOR0XflMusK2cBLKWBjsF2k7STTs3/HR1x9DCFEvLosxUOYMyc+nzl+zmuOba9N/J+CfuXj2uq SYB0zWeU08gnkZJzUY2Wdjk+zncBHb/dGKRWxDvIgpwiHPFMl+S58IC9dvgrhZPthmS7OLEO9O7B vdXr1C0AxXMwiIdZ+sIq4GOdDXsNkLi+CRWAYzoBmNKNDgDTkjV6SUzsZ+GX+ysXcQDwOcB1BzH2 9ObJZ7UYy8AEiZp4RUsrcUMccwgfOkk9PlVCwoSn9YgB4va4rgoRHa2BhObdaxzSh3jMlancXAL0 Q1GYm1mASoAXFQBk+P/05clqAgO2dxilFZ6tt4+iC3hR92s9anm0FtJ5hUp584C/N+Y2AF4rUYJY hZcafjOesWWucXtutTo7tkwotnirt5lzo8wzPZcxejhWD3zriPLjYxQwG/UYAbkAMJEDvJ9s7G6w +2wqe4BJPeTRxj7q16J4kl4OrpCHa2Ja0bZO34e3edRk9Zgr4zja5Y6VJPvVCYD+5j2L4uwo/8e9 70EPWQBFvIMn+sYcCZ60nYl8f+5rr1SvvHwtNBBjtTduzlLK+351E576MkBQLrD3NQaYniap8dL5 KQB2UQxRp91+0put11LPm79V2+jyngVVPF00l01iTfEXPa3KRAKq+bc0CwFGKDUSgeSPx2Nd5FFj bNI9UaWpw4OOpl7pOsiw6dlOu2lg0CIaU6rhJMmN7w+iLT06BRUCw2IdL3a3EpSsyxpKm3igzS8Y zDjBWw2gsSqeBtMABtbUBNUn+Z4UFwGr4FWFGbXP+6FEeDsqkFgIZwTDrv9Ub3S4d4i67IWvfYAB uEqbzoTH3TU5Vt2nMI/3Ik3kLMmNerUFb471Xb6rFzzkM0Ead7WnMVbTJfZ2Bb81wKRbVlaJNDHX uoFb3t8MsoDL0Hx6AM6nMBpVZkkuBuf23m9vr8JuRef7FDXDaPOuutR8kd5zeSqGf+QlsxTWC1gC dbVToF4iY/jU6KIUsiq0ksbDmvlef71EeOvlyKW3di4craj19fPvLM3+nwuVNnrJFSjGpg4sK40e VpvKNe7Tl1AohjB0Wv3QUygxbxHbYpOpVc76z9qHHgUGT5krPtsmSNn55vjqlz5Ur8hZl+vlvP5V VmoN6/Zlvd7SSxuV79QpExmjJVGx0Amb5wiF3HIFhWkY4zg0mRJ+zP2mxz2f1zOBXYqg7VbfVnw0 /DxKKD1qxU/0jw8C6c3Fm+3v6Dd/ZBfjt8/xcH6DiNhiIjXPkTB9ljmmAWyM1Z6oh8wn+iwf5uSP e/6nbZP26/08nq+5z6ZPPnPg+mSH6JlJXAlQ+8H+6A/TneU7CZPC1fbnn77e2wJWSLv95s2qe28V T6wgVZkteX0C1KK+cLwLFNDqv0uCoH+XymbNy4/bIppl2eXNJnc9HsfwsOvT5vPabx3vRAl75tz1 wnscVgykDrgMtaAunNFU/0oRIb5jUqD+a0OFseqbH8bbIQuu3i35olGf0MOnl6qRNYsLu9x0kpX4 KxJHJvnoOXIDFMBk/wJ448EbGeusJvn3xSvnAoA20X6eQ6/3IUBMlQ0r723jyfa+F/Q0Uip6jHE/ DOgc4ccQrJ53aQgmKapfuo/nqQ9gI08TuYbwaA+5T0PbnVAHshtp7AiuAe2gTnjWAG88gVtziyVE zE3qBVZRY5H7uY9HVX6wKhnDVPHrFTRDM+lOZUi9/BjAnFtgtoaO9W43njXVMaSK0JYD8E1fhPrw Fylk81OKo/wYvvksILuPkLnczBWS327szVXDfF+DYoTzH+BpHeweCo+38by1YGlFh1teu0aL60AA A4YHXj37bwsv3iZedd/XM7VDIuMaQEt+dhmCtUfPdjAxT4OoHmtWQyzqB0WJw+I9fi8lvtmG1F7f JQTtWDbh0zUihX8MR1sIRCOM29vh/qSntPBy3kEJ5A2SEG8gs9cNuPzal56rnn32fPXy556rRsfh EgMob/P5N7/7bvWj1+9AL9gOR3eS6NtpPNSX0Se3cqFUkD4ruHINPbRrUGn2oCaoDjIIAFfSL8ml 3GM8y9y3XmC1sKXwrFlZ0VLsobvgnTPhk7lgAaM8q8A0iimMTd4zgdW+sfhT1Jvqcds/WldZrT2H UjuSJCiPXNDO+SdINLTtZ1kjhuQDM4/GAbTywp0LIyZOKs8HitGIcC1Z4v4sMHMJWqBa1eYK3Lr1 sFqXF865x0dxsDCWBENb0oE0XjmvHFm1vy8i1WeJdVHQMrzgpaVlxuwyIJuiO0SK3kVlpZ9xdVEF Ftr11OxIwPaWUoiMka5OIiXcTzG4RV1FUz2JtIwlvfvMRDyp6LNjsOnhXU9imFx+ElKhn4yQkKtn Xe3xh4DvYYvmMDeHySUYmh4KZ90IVQ95DcojGo1xDIWzHb1wKUfFaHMFkftv26pUYx84FtVZN4qS CqYcp6GbBNOA7pJzklcdgSlGZ1n/AuLj6KiNSsF17G2/U3O/fU8HiUnCeKBjW0lyrtdvde474GMc 8Awb0G8qCjd19jBeh8sadH9empqJ2oXCpuPBqdarM4I1S0rRBv1kkEHnRI1pj5wo7Z5rH6lWDj3a D442jBqx6E2ubYijjcExEsWjmn6iR92K7R5XlJCixukUMcUmRlbWZ64ygLGQkgb1flTW8aMt5ejy n6U/2oF1c1/xZOe5StRCg3B4aLh6lhwGVaT2iJ6ELmbV4s8wdbV5tvdr76cB2z8Pw8ix09y//fGZ B9efpUH9ad2LRTc2rCamN+czMBFW8Ky99dY9kthWq1OD7rqC1lKtq1RedAXjp1noy2qvO6Q02Ul3 9BMaMhi5NjkbANT+1WMPxYnpFSBQvA8lG794q5XXKt6VArDKzuFtem91+D9Uj1ISWq1TNwBVBoif xetmImHCi25H8rQF2dkR/CnPmdMdnZ83o3xQuH9JFuM7O3qq6FcBgkBM6kUf7w+xyW7rjeVaJnbF qWISIsB5BgCyI6DuYrNmx9hkozIE64Ylqgu/0ATLxkMd7zRhfBfZ3GtJjCpeHSNAcK5N6MK1I2jd gQqyBffZu5Vbugld4x4h+bffuYunbhsv63Q1TR5Dv8oeFnnBs+giLe/Rwgt6iaTN6FGTC2rlOTdY 2+0MXOyvvsamCwiegwqzsggfO+oEeC0B+Isk2cyyIS8DFod7xvD+9SfkrmGRTUIeO4Am3jhxsR5X 2i4RCT5LKJe+2waUbQPIHBt6LbcAq6pjKKloH+mdtv2j0KLpZl9mnNZe6no5LGF0vZdK9hXQkuJG dnHC7QWw+P9+W1Mx3Ff6uMfKfPTnAgD4TfSr30aT2mTG689fqP7811+uLlNt8ZC2m2X+LNHGala/ g5f1Id7UASgg4wC056hEeP7UKCCbyIAlymuesVxq0UCRHCxcYGXoUs6Ee5X7LigTdJlEuA5dQl78 bpQQyvzTK91rfkEoTzxB6h/J0y58686ooOghpn1jhNTAzeviPXauBxbxvgaHRogyj4kS8PZpoowC evvZpNV++jW5CgItxtUYnvhdC3dplMiFL5MJCtNgNUwkR53s1c3l6m28+SZlniOhUb1un9ciMyIi 71MP8A5fVnrPOST/fIvjF1eK0bIBncLCRSbPCoAXoWGdImowipKOhWr6oUGt0kZypzUMB50jgl35 6UZ7smbZRqUUgY8sl9fAViPxZ1sr+WfRIymDeqrvz0iZIv8ADv3zF6erz1PS/vwwESeMZgvZOJ9N osyYdtLEK+7YKQtXcT6YyFuiXAMYB64z5mZI8enDSOmk39PP7AtN3QYNu6bCrWPV0Xns0S7L05Hz 4T1rbvsaWtaTo0U0C1oZc33MyR3oF1tSkdAg36XQTz8SkiZsSk3rXdXw03iHMuP8dPnj+awKOkSE zeTFRWQ6jTykAG7dron9liF1tObrXW6URTLtam9z7fDOE8QzW4KjeXmaODBcN+t1Om1aF9tt2kD7 08fyHrI+1iGqjmEMY9YKTydwbzznDY+53o7e03qftTeavTPPy49ryAUiKueoCO2zz83Vid04R3zI skv+09cn2QL/FFx/kq37Ic5t9vP37qwcvvlwvXr5/Ejr5bPq3v7slJcPcenHfkWQP0PWv6FvN/xW 9F6ZmFIjlHHTtZJVsHglCqhu+93M9hMzuZnczRJf1lHZgyXk6av4GAvvuolgHmu/Fj51fhKmb7jb BTw1Hp2Cg4s3WYAmbzoqNPVCXZBxfTf1CiVQlj9tKLuEYoOs4p3Ta9Ro/dbbFwmJhj4LZzuSbcl0 w9tUe3IsILIir9my0Kzgm01muzrvAIthAMCA5ckBabuAg/2VnWoVT+8ynN0trres+olZ+NkD2Vz3 NkhcLCW19dAsoYawDr1ghHLZtscm9KZtVtRhAFZ3JNoA4pxrk81+jwRD3IfZiA6gbmwtQdsAKPmG XuB1Qvjg90i8ncU7OAo1wXvrgROrZ9YEyS6TJfXackNJMtQAIbzfQmHArHwVQNQTP0fIfA/e5dtw yXeGkSLU08wmvQbA6KGPBgFLw919bNTD1RjUlh4jCvFMF/pFKuMJik30sg/tM3ZWy5oLggT58lHl FGtfBCiZiCnQJqE0oNiEOMBhD0DKTTkc+lTW5GSC6KNNxnEkraQ8Uzy+uWYZX4IxOamC3Z386NU2 AoL0HH24Tt/+5M6D6p2ZuQDp5wnFfu3rL1XPIbPnGPrpjbnq+28+qH7y07uA0FW0qfurFyga8+yz Z6rreJcuXJjIeNk2ea6WSXR8hccPiOsnUjA0VKhYJuIFpGKgKLG1BaDdxMDYBiTKxVYloUfgYxXO jNeikqKd3hk5QgAzxuOBv+nPzhoIB0QDEov3UiqIk1CjqSSvNXxdowv9jj30rJ1Oz1w5G++xkRRp IhoW0f1m3OppDgcXgLaO8bEJJWSAaNC5M9OhyHj9m/dX8OZreEAFYayG76vOfIAtBqn3j9FrLGKT 6MqqmukavrwnP1r9eovtCPBXAdgaMH1EOh4QPTAqoIFnxVQB9l202E32TOlz5v0ugFAjTeNIQ1q6 m+onoQk4lpHW0+jdR7ayxeQdAehO4JnWJTpDdOcOkokjk/Dpr1+pvvrqpepZ5uAEht8hhqt8Xuf7 OFKFPVAnLDBlAq3FZ6JjnXHlYK8XPP4MPYcOSLluP6/pI2rsK1nr2LQt7Jp8Lete830jhonZ5b8j GgbnyJplLrBUoDo5taydnCXJpZ6K/3dMayR7BT3fkfagP6TH8d4qtLIHt2aru6t71dlzw1TQHKi2 cLiUOQXXlwRVudYbmy3aG5rXIMbVKMbTmhSe40hk/OlSOOr9IX/HqC4T0rdLLs/xj0+pJ1oFktjH DdAuf5bv18BbWojLdq0KWOa5c0DvtkmRnHyP/hAAYQpmzMYwcZ3ndzzkR2tD08BP/t1uqjzpqE8C zDbXbe67qFe59g4RSSmJw+88WE6FxkGjnocarcdj45O4pw9urT8bR/wpB9c/y/D/09GhaogubUB+ ZUFcNzNdz+XPCVzrFVpa34jXxkzjPbL00R4IeJFnrUfGjffIO5JF0f9z03B1ckF3lyrSer7asXZ4 nPUHWSSCy8u24HFZP2twnJ6Op6dZoMvfZQlsO2/t7ogjpuwPR7SN6K5qICTcXGgdjXyTZ4mJ4AIc 9YACbNysGr6twMaNXtDtrceD7TECQP6Uy+aqHNlY/20YnpCcfNKBUTxAgoVUCwx6LEl6+CAjSUh/ D7NRrRAy3yCZS9CgJ9dqfkt4m/U+jANuLWazcUBYG2A6Bv9Uj/ANCm30nx6rniGUrrd6C6Al99bn GdjnWEuSw+veV/cZALSDB9Xn3mMT3WGz1EudMvX287A6w6dTBGQQ75Re4APuqY+OGJgyOQiQI683 fEpBF+0DaDq0XU0MxVOsXJhezU7cmmMk+J1h7LzL9bap1qjm7xj881OAnufPnamunD+NJjFcXasz AhQPUlaeNmy8zbWqSykXXcLcevd2uW8L8ZRhA5iTNgEw1rOnF71roJSgts8i52f5bwcDzBgpHxol BWEXj5Ybr/9S0ktvYelfJduK7bUPd95EyPBdHc/R+6b78XpZKOY24PIe1IQh+uTK9YvVl7/0fHXt +YuAbj67N1/93p/crF5Ht3oeYK3k46uvXKm+9uVnkY8bi6Fk0pXVA7doIznqDkQpQFKTHLMpbMPY W7fipdrj3PQeGsub9J0e200MIw3MjF/+r/CNBYsOcvoqieAmNEqv0OAA8JLsJXjWKypQtT2PwbWe fagKzr8YKbUcmgCQ8/cl+gJArV283uMERqLAW3AoyI00Jvfsed3kVwDAM6ihjOCVvnjpTHVmcpwo yf3qrVvz6asz0+hUb2DsQUFYJsk3kR+u3Yf0XqJGtPcOiXPpNn42AL0P4e5LKVF20zkd2UquB/Sv 7t2bC01pBEqWc3AYYOwY6gY8O3r3rBApHcJ2kzO/jwoLE6xUYMQY5qlJjYinvBta0GnyGsYAjBsY dPPQPZTl816uXztffZ7+PIex4NSeIUG1k1yKlhEUzuH8UpXDsWLdlUQ86nUt4KaEUwLw/Vuve9ZC o0CMWz3WapIXxaoy/jJu6/lQL53ppyKtyE9yAwq69Bol8lKiN86Xcio/cw2qQX4SJEtfN67hAw02 wGgXNJAheNe0ZPXg5lL1+ut3yZ04Vb368mQ1PiQyLgmLjlGnsNr2S/Th/h4yhszFQWT5ONURCD66 5zxJuT8fK/rZZWkuxV5qgK1RaLOZkNuBtGHW7nxeEm2dv87TBAS0F7L/lBSt2Aw18D7K0eBiGjsH ++oVlQRTWzViRJ6v/qlv7zP5y+dv9tXcc9MmjNXhQeYNT7GwslvdQC51Y221umhSedPefwqe7zPZ 6D/DTX0kcG34ZxYrdZGQn16RTFhel8dJdGIB22ThurvAws8idg5VgInoc1qcgYUPrVwljs6hWzrc pu6xgtdrnuSnFUJ3ivbLh706iW61m2/ba5EFbxFPxUVCqg341DK+vUgVLrysz8Kz669LnOsNfrC8 CY+VSl5owyodNIcHZIoExbNkQ2cDYiYu8t4D+KCT8FwHCGvdRq3EEXseHvYA57oDkPH+JuBSTsFz 9Rl96S27j9fF+x6DW3d2lBB3zllea9zPfc57HV5lIvhtryXu6fYCbcHm4PfOImd1dqzXJLbDsf5u ZGZ/Huwhvau2L/xCFSTgpR1sy7vjXqTA1otfo+7RPGnhWdch9HqRbrLXy+rZZgw1KDst3+Zl8QwN Zj7Gzo+0WXtIMIe4ttdJWM2B8kqPdLDj4S6bVcpA64FmI4uOsmF9aSH8LZAR0Jq812USq8CZL7ph elwX0lRFdC+II9uUtoMZ/JFrY1wX3q6yUKWccje7qV70FDNgk/LZ5G3HR2+hEsCom8E+rpYBwPEe b6oqoprEKNfemocHzVxZ3ccrOHRYjTFfvE81mkcYl+tw6+5AMxhDD/j09XMk1eFhphFUWHDpVYVD V7TXtColvJJ4wHcEZKnAiBfPREruV2m2UbzUygeqzCBPvBMvo4lxuwCjbUDCoZ5MPV8CuKnBqgsw uWlpaxQaekzY5Ln0CuphFMAO4Jl+5uJU9bu//wMqOC4mkewcYPrq1ASaxmegFIwH7B3WRXscIwUI lGp1Xeo427hCYkGnHnP+aXVBS7ub9KYRZHW/AH4GQyfj1cIoLTd7vhkqhP9n4m1HqTipKoLSXdmE AzbshAJAiwCyFJLCQc2YOeL/FwAiaBP4qXg8D8i6+RC9b7724suXqi9/9cXqBTjnqoT88Cd3qu/9 5Gb1jT/8KV7mg+rLrz1ffeULz1Vf/+rL1Vn0qtfWl4lQrMb7LNDb4iTeU7/6u6xPyu35THIl5emv YeyuhzNMP+g9V5JNMGFiFvfs9xJhcVzH6JO767NKyygmpMwPq8X2Qu3JSKRd7HufySI7KT8fkOLT lVeWdvPJY1TQBnhge1i3VYe4S9RETXYLNU2OjqTNpFft8jyDvdCJ7LMD5PAYR7MWmsFI7O9HBQQj Y46xvsh7F8+OVyMTk9Xs7e3sC+tot/dwP+MofkhNkAuud1SDQWDv3FKF5P7MfOQM7T+5yUOMXVVC VL+RstGP11plj+mJkXxPGU4un773OSPdaDSD9unsUtaygFb7UsC1zP6m97mfuSbFpJc14OYdKmci NdnR1VddvHq+un71XHVKNQaLOjGvuqAzTXG9sdND1eHcQrX8Ltx6DNIRCt/E2DMaphfR37V71nUh +UW0uGNBY0iVneRX1DSfVCDlGL27JYJXI0fXTNc280scl651/jzCbajXPvviaMFuj/5JMSvzrrwc 8yqpoLyyAhDFoOsfP+Q5J6oLSGo+2FDlZiEG+rOXRqLX73rI8gOQVrscmtQiRgjKX3skRI6N0G/Y cu23HedJvcY7ZgTlGaKpplU8yc0WoO6+xxJIYK8s4NpPnSsmkip/WraUQuWS6uEJ9snb0HGwxSIu pUhJSrXLt2PAHITv76sB5WE31i1wxKir//1Z/tUYAw3gLvNWvruRnNVoonfaULazvZv98LP3RG0I 4ejmGgOieeODbrvpv/ane9x5P4mnb7/2RwLXgiI1a/+T784cPjc9WL16ZqD13/547vD0cE/rb/7C +XTub7+zWP3+zeXDv/MrV1rjhqj5z4H89twmMlXL1W9SzVBwrYf2+3fxQqBt3Q+wJczamgU4vLu8 dfjPXJ9offnS2CNt8buc98ez69Xf/trFarT27GqBvzm/Vf37v3v78DdenGz97a9fzKLjQjTDff7e u8uHv/LMRIuqaYf/l9+5Wf3GC9Otf/1LZ4/Oq5HwhzdXqi9dGK0uTfRV/+/vzZLvddD6t37pEpt4 Z/VHt1aq//b1+cP/5S+cbU0AopuX7XADI+I/+uaDw3/ulVMtAXs9+3PIH9xcOeTa1d/5tYutAQVk 69cDwv8/eLB6SMJHnvX3Oc7vv3xupLoyOdDqMwNdUPApvwT6yzsAa9DRngoShv6RUNOr0xOeJjfE RtciuaVLaoils0EyjWclnueaPKcTyFWxM8UrGjcyAyAeFcBNXAY8o+C0YNYClLNxmMhUL8i1N9jN US61HtN9QVAKi+C1yl4jr1mPFwCX+7EIg5uY0l9urP6sEt494L570b7upS/koqaoC2OzXxUOs1uk EHC3PmavIWn/YxypYystRDCo0ZfEFzcz/wsA81pq45bNr3C9LWbgxkeoXlju+fK47mQAAhNtuFoX UYFeQvLdyFZ1n8H7O0byFF7KHTdszruGZ/JdNt0BvDYTeIM7oJksYDDqcZxirO4uLVT3v/MT6BVU 7AMESCM42CzgS1CTCn0mublR6xEEYYATqn4q1AHdAjDyxCYv6bHNVskzA8blzu7gid5hPJgIZijb 8HYPxSXMtm8d4BGUywcisT26SXTtgEusUWGi3GtfvlzNLL1a/eRHtwMkTwEar10YQ+cZNQxC6OoA 7+NFOsTL7lXtg26LhlDcQdAYfWKOiWqQbc6YsT925aTqRafPLXQSj6Ahd6gGHb1IhjFe7cOmZL2f dXKfrkLmCxx2B6UkWWt7WQMCuTO86hb9UF3D0ucW/THLXqNphfZfttqfhgegYwkwP4Me/zwe5PkO qiVePlu98sVXq4tI0q1TxOLbP7xb/cE330GpYqmaPnu6ugYI+zrA+zkA2SgAcI2y4GsAZcsTq5ms gTcEdcHkTYGqdJg9DHNBqqBAp8Am4HpHvrPUJpcGEInJlv113oDfcwPdoy8OjB64oWpUCHL9DuNT veBWNw6QvpEakdjTjvmiwCCPu5i8BZBF3o8+CO+ZvrcaqUWSLHMu3eE+covO+dNIM0pXMUmvl8hK UdAoG7qJs4M8z4vPTFeXzlEEp+cQ7eQ55tQOHjUS5Bj39uduKia6knNGDKsD1Fd4whgI0ZsO4DfR EEMDY2PDeyGKof67mtxbLDj4scOBGcDwO2D8zBBV6OA+h3BemCx6++6DeOWNQjX2vhJ5qoV0pK53 WY9SpbAFdYB5ukdbvnuHegyM0xkMgq6hkerCpbPVyy9foXAUexMgc5PxocqUoHub+bXOON7GCL7X Q3LZ4WY1cEDOwyba373cP/29Tpv0so/0qQaTa+pRV8++9FmR6StqTJ3MNyMBtq2JgqGswIG2XxpQ nDbLfZf3pLccOXPi/CoSkiUJvdZ4b2g4ehDcK92eQhVhbmhsMN8HWQO2O3n2dQyF+Qray2D19ZfO ZO//6Z2l4lXHUB7kvoYGzN+Abz0gHQmKGnPK59pY47myvmtc2D1y6PmoWd+9pI9dqPbFF+O+V3uU PdDb0gPNdI1RJGbY4R8anVvMwST2SoHhu6Rbp03tZwsIWYUzVUB1upjnYnEx58I+60RxdWSXTZTK 7Y1TNbSUvF/vwe27cTugfRyge9zO3Rx3Euw97vuP2/Y9Z+2Uz++TwLP9PJEQYL+cMGcGGtj506Ph xfuMDOfkEn3UoHi8/T8jPnkS0PXZHneuE/7II4Prgy7r+RrjrOmrD/rOR/m8/bm83kcC106QC1Qn dNGdIFnkqwDgmZWd1t/91v3Dr1web33pwnA1gReYOjDxXDcFIRR0fwYv7iYDfCJFB6rqt95YQL5q 4/AvvzDV0vMtf9Us8XcXN1qjAp62lx5q1BQOv3t3rXq4ttNSwsuX2fCfPz9SvXB2uPX3fjR3+OL0 YOvXnptMmPQaHKTV7cPWWe4DdYLWmeH+w3cWt9lHonWR6dPPZLs60R9PuQoNDsQtNrRxK4Rxjkl1 Zpmg53jmAZPe6pfnP8eiLSAZw9Pksc1LDqLe8B/BKbyzuFU9dwrTvn79IwyEUdKqf+Ol6ehS/uGt xda6izOLwrBexp/Dy03rIVJtglMXcjPB2d35W/kqNga8Ml0uyGx2naZlAwhJK8vntmE8EVkFE9Qr C6VbZZ1EdrxiymktFbPKCutm4lQt8mken43BjaB9RfKcrtJJGhRRu5vwXniMpShKy2pcJHvpcT0E ROj5tDrYAECuC8qx40cx/X4W+j6Lt2A16LHWI5zENzm+epVY/RndAdVuRlZPNOyajUHJL45LgfLg 0rIpC/6bbPNg1TyfbeVnx8tteWwl+2g/MswSvBWU8L5qLIcMk7VBKAAW8NCAsaT6PTRLidiMd24B VFSLOIwX+BwgdQfwvPLu7ap3abjqmOsn5FkqHdJzSYTU0LAIhBuufGQTCEcEL91Al24MEYt+KGXH M6pCuaeXTEUJvtebzVxPkkRG49uCa71oxbjp5P7kKnusK7ZVLgX9hxwrEL9ENda/MfnL1R20hh+g CNECUE5TInsSz14fx+9R6e2QvtlAAnAf0NaJh69HI6re+PcAn6kwuR6XVgr9aORsoFQiBSbFg2z7 JHHigdcj26MP3W4pG+6h4MHb11ASQFppkGtKVdkTFKFsYg6Bpa4POYeeYgevXsh9kjjXAbkb8t6l ohySGIfReQev5g24jNsYQFeuX66+9pXnq+devFw9xBP7e7/zo+qPfnADz9EOHvqz1V/+i1+oXiSy oDydG/4itIJ1+OcamfKOR1ASGcCgGGAddTxLT7G4yqZ61UrqCag1VgAGFpaMX8/xQ/vJHzW07biN USdw1BL2afVmxiCEWaoKhcNMRInl0asmN/8J2gqPy6krJ6eOHnB+P9sLBYh1KXWuNTwAM7TbIYLY 3V1op9OuctqdvivwKGxr54Y5GgcW6WEebdGHVix86RrRCpREDFPP4vnUDzE9CDefOftgSUoPkUSL ObKG2K3LGxRrwQjJUmIoX2OIH2kgogQjUCWx1hbZoxgPBTPo87MYmMNENa3uSHUE7L49/j1YTSEX eOMG65eGb8H9WXdsNyUCBV7xfio9wWt8HPk5rrUG8L9xbzlqJ2PTk9UzUEFeePFidYUExl73OD3N GqtZS/qQpxyoVmn7tV6MiDE+2+a763eYPhRmGaVdrViqnjXX1ph0PqlaY9THZxLuhdKmE8K5SP/u KV/I/XVZqAYHwb4VL/McxWttv5dkXNu/jt6U0EyeyUhes2Q2KXwBayZaCroFtI4N+uxANRwMl51N VG9GRqoe1FGWN5ZIeL5f9Y6era6/9Gx1HqPCdes++9pdCkypy35Au/Uzn6Vv9BsFxKWs59jCVxla rtv0lc7nWuG0eJ/Nibcf67z4cM6d1r5vH/nj/bkdQR1J9Xae38pJe1zTMWqit8ahxuii44BxqmRp WRs0pkruQrfFwaQBscf2Za9mfyhD+8iZE0OgBvgnge9JsPc4EG2bt7+fbTFXKq/HgevHAcB2gFh/ 9ag92v99cot09ZKG6Hy6eO40lKgOjF8i57l4iQq4bf2swLi5ZvMM7b/bPzv598k2epIx8qS2/KDz nfy8MTya63wa4Lr93j8yuPaBTBAbxStQMySq1wC3L94iKaq+kok1Q9EHfrTZBvnOJCE8F/8bJMz9 4xsLh//Sq6db16cGjtqpjwXnBUDxyddDvHh6yb99Z/Xw+4DW61NFG9eX1/tbXzlb/cMf97T+k+88 ODw/1tsS0CrrdNoap7wE97+JZ/s/+Pa9w7fR4n2JTd4FewNUcZbQvMA6xzEh1YNtwJ3yQoNqGZ/k dnCstBiPb2OD5Bxz0kEmelsXx3oPv3Nn7ZB7OWoIjYnpwW6cSSR/4En9S89NsamftEXfb8h+vJ9J SVjdW4+GbJL6YsabYARES8q8pIhSrjwbk97aGm8Ve7oA6Uw4P8u/C8AsIajirXUVl1Nr4l+Oz8mK jVk40G4Qfq/8+yh2mA0CP6+biKFc/xZQ56foHLs5yDfU266e7f4OIG+HDdjNT6+qRTdYjDWcwmPN plQ27mh204eutwGIJnwFxLvquuEUTmv98OUZ+XIp290sg3Wf+EjNqGQFK2HN4g1sXs2z6lFyubOJ 1So2oc15ZVNJeZIvOgHfc3tviuxFPNQUvxjDczrAZjEMeOhiTKL5ng1V0dYttarRjRa8K8dnxcku vPIe0+LYLgp9qGvdybwDJ6Zvu/DoCoY75PeaMKXXKwobGi/1rlYTEwUChozTe42sG/QXFU+SMOfG HO+YvN2yofcB5i9dO1udRhFjA5WMfRPw1KImbBv+vlEBKQ14gOVIZyTFQNNCsZ0FIIWzvo2BYV/p wRW0CSgEjv1ya2mPbpUcBB0ZPw654q3LvzUw5HOXwZpS8jvchxQUAeImY2YbSovgzrVpFwNlmXtd iXYzFQQ59zL3MENVvnkiAQLaSxTwee2F8/EM3QcwfvvH96o/+cmtGGtf+/zV6lWKxnz+5cvpn7sP FuDD4zWLV03eJ8aL/TtutEEqhUlr0kNKcqLe8wMNI7ngjgcjMTWNLp5Kx34MV+kdBSjYa47t0kf2 VaF+FEUQ+6MAKakRvgRsUZvwuLSL470GF3r7a4AuGEo1Uv5tkqD3opEj99/1P2XFrfhpNMnrcpyX kEpiDoD/7gF8rvH33Owy0ZgdPPX9SczFsYtyCtEUTuTY2cKokP6yQd9sWWWV25JqYv+pfy7yHiax dhLjchOvvuuuSY7LOAZm0WcfcN+BY93LPOlnTEcJyDwGK5ZiVJbnK1ERwd++zgE1r5MQWzyrelg7 qT4acgwGcB/qC6NT49VVpBWvIad5BnDZy5hZwpgysjOViplOfPcIIyRcj3NEVnARTj1g2uOTXKga jH+7hmScFiTXcPrTdy4V4amU3031332NgDgfpKrZz1lsynqZCGH9vbx5tNzkj7L6+H4BoR5ghYIC LI9W7wLGY3DgbbcN9Z7TIKtrFCa5TwRqq7O6/uKl6qVnTlfd5IjMLe9AoWEe6ZlGKSV8fYxRr9eP BL/l31P81TWOOS9bLQEGfhGcKE4WXg0zK+Om7dabqKbjDH9JeYZolKMtb2LzDvKUupud08ydu3hq TfDNmuj6YV/SpommcDK93J0ck5wR54BntJvr4R9/T/3+cbuVG2qA8eMA4qOt/fh/nQTCzT7ZfvTj 3nu/+2g/Z+7bZZsf+9Q5hv2Xh1Q2VI+14/KkkfA0994cU3brD/c6sVMeneT9kM/PApKPd9hjA6f9 vQ9310//raZtPpLnOpfjrrWQ5uAbz+PNeHd+s/orz423XjxtUYvj4RAvY9vLCS0QdmH7/v21hHY/ T/XD9s57XIOopbtIqdVreL6/iGf8W7eXD//q81MtOdG+5HcLyv+Nr56r/r3ffrf6D7714PB/9xeu tPRKF0WJ8vrKldHqP/v+TPX77y4FXPsMm9zDORbCo3s4AnblHYqxF2/rY9q5ObT9KQ3ZzbJRv4ji x1eWd1rfu7d6+Nf3qEJWy+tdJ5z///zju4dvQyn5F16ebn3lkmGbjzLkn34AnDxyV65vtQ6o2g31 wMWxw5AzHuAOfiQKdOLN7ozuacnmL5PE342eahsYFrB6kSat2/U/b5SNQI9Ds5SXewnCDbB+xLyv wXZj4cTrFg+MYF/QJOfUUF8d7qyTfEqY1WIHJAPBKxaw6IGWs7kvyFazOhQOQQCXDy4pm07xGJXF NiXQRRUuSoIJecDSQtSejcGYXal+1rbez6lKClFLjeQYTUdwuzxyVvMCavwsWsTyS/U46K0yejOE t8GFkucbHByqFmj3tXskJwIo9Dt0AlY6ANRDJsXFi2cZd0PNGKkCBAxF3zPSrxcxgBkjMyFZNqEW /a0mtjSDTmk0sSxceUvxB2XSTPZqER5uVFSSOGbvxVsoF1uftjSAAiqk+9TSBGy2Sc9nnlOJDzDU b4EonnFtfinVV/XMdgrqaQOpFt2WiGaHNZ9jlxC6/R5vHGcVFGn4baxROZLdWcC2xfwSpEgj6bHo jjkUUCv2fYY6TFzqlJfuTfTM++S/PbyQllHXY5/56z5M26fim0OC5xQmbup54/NuGk3FimXAsVQD 35+Ga/v5z12qTuNU+OmN+9UP350FiO9VzyOt94XXnq2u461OK7EumXg3v7AcQGchHr1ooRdlDEKH oJNMWDTMrac6pdvrhDvRj7AvhhxtWuxRQUMZPwKfGIqZlIXaUTarwsMV9Pg8HaGlYTLxd3I6hd91 EqJfLgltxTDyVII3aQiC3n1oQUrtyYW2Kq3GqknPgtB4WoXUGknMsVIwCM8zwHNe/XWe47S8Zz5T +3kOVRq7IrQ3f7PjD9Nvhwcmd5Zk1A3a2UqP/hjGt598RlfxTcau93bxzFR4wXLNrWp5nwIvb1Gp MaCcHxN8J5ACdO2WomQUppfCPAIwx1AxzPWCFyWh4Ha14ltEUWiLefqgSF4SuZyGb3xpunqWPj2D XKAqLsr6WTHRZWnP0uQafZG65NpEB5T/G8Yz39WxWW3dFjwWLfUY07UTQZDrXmESZqggoWUUr3Se 17Hr+MMLnoReE1RrY6jZjDJ+Hbc1oDqGFe/dE8q6XSdXe56A9GKERQrTNdC5w7rRR/KpxswORmj/ wHB17txUdefb96rf+UffQ1pyo/r6r3y+OoOBs41TxsRPK7Tu7ZFfxT6a5EA90VxQ3OvvgFy2WIPR DWXcCIXFZps5GKDPcXHY1Ugsdj3dBC7HmVC2C21JE0278ZSnEExKtzuoe9FCnyp7gv0SuUr14Gva DO9Ll0uklJvMPHkC+mo8u+0fu8r772anfhLIPHnK5nvv7ZF6O2i7jfbv1rvMe0B9+3Wbv49AqO3E De6xtg/wjLD04ghq7K2n9Vg/7hnage77NN2THrNsfaUL3/P6INfiB7Vhc+6mb550nfe9uQ/54ck+ +Mjg2pt34VL6a2Z1t/rm7ZXD00MsY5dHy9L+hEHrZw5rQ50zAPMoK7QBy0VCvrdI5LpFyOk8Uj4v nSFBkcVsBo/cfX4myF4+B7f7v/7x5uFNEidePF083np+17HsL0Et+V995Xzr3/utG4f/2fceVP/6 F8/V3vPSBCPM7l++Olb9EeCc5Miorbm4SutoXiljnYp75Z3wtlxznvBQzSRovj8Dj/o+P1OYjeOM 7jcxPN7EW/gKYXxff+2lqZZhzv/yB3OHf+e/eevwN1+Yqv7Nr11onUze/JB9/dRfU/t1ieIIPX2E LNUPZrHaIBSux68bj00LPnBX5LEsrGEiiIu7q6WgRE5djUabXcBpE3ewbd2A5UeHXtqqOcS/A66f 5pbrcx4F2cqXCrytT2iHBfyqLaunpGyQvooKSAEa5TA91UqQWbq8SJ25yUQGDIApBUEQkWhpA6z5 fsCvG6G8zdrjEc4vryPvn397PjcU7zAgrx5M3mqcKrUv2w0lfMRSWljPYzcn7u+HtiAfWp6iHr41 KCArlFLHqzcH13Rgg0jLDlXrAGoCHs9vcZNymRIKTlhWL7+eJIGoe5ChaCXYhEVSVtxQ3cTZrPQY JWnN+5cqIzijNHSSpXy6dL2KGwXwyGlsyb1O9TMv68M5LrydWCiAdL9T1Cq6oEDoZdxQQxfZND2z on956Z4jgiHyJO03jSOLa1jcAz04AZGAPNUH+e3G3C+fnrC1Jdm7AFrx4No3GQ72kY1bvHOx7QSl /LkvhUiBMT4X2EaHWAoFQE1akoBg2wGktxigpLNtaW0dKhp6ynzXa57CezlIMtcyAOsWxWFW8XJP nxmtvvi5Z6ovAq4H4Tua8DeLXKK8bQupCDAt9z3AvZZy6mXL2FFez/YsdmP60jFpQxbNdGkYemEZ B/ZtjQoaxY7MDJ13Pi5jRTnEeKPt88yHoqQhkNzXu5qg8PFWWeIqZZ4UXW2BifdckiS3HT/1ONUD GODCzTqunQN6HXWYKH3ogipPfBVjYXZuJZSBcdRnBJeWJtczb8GZjB9Au/rZAuQyBzQGANsHJJJr kGEsyklfZqwEP9Fmc6jf2CZDKcGuHnMX6iMUruFYK/nev/cAj/IK3vABxoqAtsguWshIXfJtxq7R rwJSyzVNAi7PpN65ETqoR3o4abuRcYDlecA1fHHvc5OxuW+SL+DbyMMQ151AEnCEv1WYyTpA86o3 PITh17nTX5FMlARjoxVOohQyoZ0DAjVsbdugTrvFgWo/NOtFkfss0S97v/4vzocCIv2/RtO/+Vq5 kye/jlw59eQ43q5LpKcfAYA18jssIDMIuD5/9hQynavV9994t3rjjTvV2fNnqovPnSYxsC/Ps8ze vEJV1/4+khsHXcdMJCz60g6pJB/SLganvGeXZT+3STJ2PcabcphmrJXj6qBZiYToV7B9az9AjLt6 afU9KSBD9IPvKdcpuDZ/Ua+5Y9RzSQ00ylaCQCUxvXl2f78fMHofSPNBzf2BW9z7nbv9sw/aKp3Z 2reacaRwZ59xrBXTugyxj/IcH/ign+ABH/Tsn+Cl3/fUtme7cfCRwbUDv5/ZcIpQ83OnCM0wJ0kW PByCTPkvvHo6kymeoMe0SErM8p+h72UXQA5qquip1qF1+Z9+98Hhv/a56dYXSDL0WveYvPObO4c3 F9xsrK7UWX3n7vIRuHbiKGXl5a7Bnf6bXz7T+rt/fA/A39t6mfsryiDl9avXxlu//dbi4bfvLFcv 472exGvWjpudnPKnm29oCARwPG5UOjmzpx9/eAfLHi/W4Q0ypl14pJV85/bqIeA6B1kk5n8K6P+r z59q/Tevz1X/xfceHL6Ex/+vwcH+tF6ChZ+Qza5G7UVKW4+cG8rmtUuIz/JgXST0xGMtyJaHre8O F4LeHvVoy8YviinexYJoHGWFH5uQXD4RaXmYxzfAugnVsznEiVt/9+jhg47e0xTZR+LUbDaWsrnE q1OH/71qvHR6KVjBtwyte5Deu9pbGLDB+BlQmYFNWg+dq4/e2z3D53rhpEm4qXFNvTvx/gms49E+ BteP66+MlRrEWzxCAHI0mOr7tWUE8XoKHc/x5AmMEmkBwOH5EpDkXJb/hoJwSGLUw3skF6FZfRfQ 0d2HF5B76gc4pGCKDpl8oYD6Rj3AiwsipCsI1A8sywgIbrERKiMYgORGn+7jzqJdC7iQtuFGlx2s eLzUuN6WBhAqjZUX3bWka5R5GS+axkrxjcYLbiLcLlGELpK9BpD1khe81rlYrcyuJPxs1cEeNcNV ctEjTxnqDjxhB1Zh3Chl2AXcW2z2csr1VPViVIziORtBxi3qFYZ5eQA3l4xOH9G28Eeg7QYeIxl6 CQBPr3/XABXNtinzTPJVv8VGaMdtxvcqyYqLkfZjo+YZZ0gmfGd+GeUW5jKUtvOXTgGuJ6sHqAgt 76JdDXj89c9dq04BwMZ5PhMWZ5YWKWYCIOd7/Vzr8oXpjDXngzzgPtpom3VOj7Y8IHmqLTZ8DbmA JfvF+QgQ3DX3QUIylkpmBe9ndRJAlw7KfBRADxKLL17qAogb6oCA1K8Uuck6r6OetrZbTYJKP2ck SN0RBPojdaqej4kscE/SVmwfExejdRwwxDw0+TBGrds7zgyMiTF+HlAVdAlpRykaffSxsnbrrOlq X585rWcbI0bDtjbExuA8W/59DErFIv2RJE/ucgPPvtUcB3FcOBetTikP/Cze8QnC4H9Aots80RHl DddMHsQAGqN/htEXH4XesS2dSOvJSE9kBVn79UQzBvV4q/0eecyJserM+VMou0xUzzxzNnSyuyTi 6zk3AjMK+JxEonKIv80fkLrUwrmj00Fgp2Grnek1BvACO9YtpZ555DxzvwpXQm85xqd9aU5Dxi39 Vxvu6eNMatdKExuNJNRSgnacS5uGayQb29bh99tIMhSKAdb0fHwQrqv2v1x0IzkatFDNOvvXSZYe ri5dHKteWzlDcnhV/eBPfkK+xEH1DCo5Jj4uLvVBo9pHQUc0jY49Mn1yoSNaxKlV+yCfsxgOPlux vZNcneW5/sx2MemuQaMN0C7zuPxohEe1stl7PVfarRjo2W/iwSnn1bvdrL+uA7twtg0ALuu40Mte o07B/c8CQI93/Pdr7EfB+8ldrTlH+/tPe16/0zRL853kpfKzab4K7v5uHJQmeMOEybGujf5+Wg92 lpvj7nj/B33Mp839tX/0YZ/5vYjgZ76dT+ULHxlcOzlKgpeZ5K3qVSgQel5VA8miyt9K4y0xOYfb EhO39FQxmuUpPwM94v/7w9nqj2+vVF+rPd4qZVycQHyfBW/S6nDMriWSW1z8f/25ydYE3gAB1Byb 9R/fWj7866hshBriwhAFiRLK+/PPTFR3SbIUpP/mi1PVP//K9NGY1bstqP6vfjR/iHe59Qr3/t7O L6FSX05iwbZh0ZMv708Fg2byrrg4c5DqJIJ2F45l7vVb8MRNWtRLf2t+o7rCM06givAvf/4UcoFb rYV1M6+OINgnOgjWSB67cftW9fDB/UiyDSJdMYUUoCvTLtw6vXep7Ja0OIPI/jYrxYwSns/NOLPG P5zK9aLuXTcLYzbpo38UbqfrXe2lKNw2/iH/OmCiPHx9tqPnP5pQAiONJ+kfTeb7ESWEo9xwdP0Z AhTkWdGQzy1eEVUJLijvWo9Sr0ktalADYE0062VzOFSdQiDIDTr2LOcbqoQgxdCpYNnfrMbxOjv2 j5a293ZXPLd8V29K8RMf7Re11wzPsnxuowJ8uq+nmLa0wpngMVJsfj/89G0AJFJnLI3s//zsV6u0 w7uEza22p3rLObjZfWcGKfwCgONi0l86aSc1XQXOesZ64aLKj9UDrDdDbWO93dJQwlVPOwlgGQfS LtCo9e5N1vT+Ve4Q6KXYBU3dQdBIVYZ91As0vFKEg+cFKgD0TYZlmQF8qOiwgzSUL2XLOvQucT+W iTeZbAswCjmi6ofD24uxnqJFUlq02ElmPLQoh14nnjPnIMoyCGAZgDrTg4dTkFUKwGAwAHKiilAb bCVKomFQIjImaFo+23Gl91tDfjvJmYJTPNm8uc44WuL4XvWJue59DM77VLRUJvH02Ag0hPFQXZYB cI6Js4Dql1+9iirFMMCPyNv9h0jNLWftMrFrFCrICD96gVeglezgPd2hv+2HWbys4QRTbjyQmoZO bofzx+mRZDfum3syN6KRz5OCIZWor6aYhMdr41jKvDY+Izcn9UCjKDkLAieNT9Uwjq+R4x1r3G9D W0jioNrDUgPov0Q0/Jv7kJZjZGSs33VTZQgT7kqhHY0gjRclIIehIem19j6lxihLN45xokd6kVL1 8uY14Jybzi8jIgWY0xfuK8y/EaIEPc5R5movCa9qVasZPkj7ywNfwIDZAxiPI5k3NjZd3UYu76dv 3orTYAke9vBqf3We5xsAqMvFXmQN35dfkPls1Koo/tjRRU+9LESnKXZz7blLKPLQd9COlnFGzENn 2mENn4KaqDHgvldKlesdpD1N+nZtYQ4r19pT5+Lopbfi5FYfRp3zg3Z0HkURJPuhHGzaO/dUr4Cp elLWxBhGtUGfvqopZRo6AZCuS4nKFe54A0xPrkrNBpMIT9Zwn7vMD9dh178UluHfqtPsk4woFWkb ecODwzlAdFf15VcvQI3aqr735v3qnXfnq6lL56rpMcrT0x4HM7soqlCoalnAX6rEahM2kUrgQKIz oQV5KW6jDx5147TSy+xPEqsF5e67dBXT4yi3y0eOF9pb9oEE2hwXNosPLDPN33F4lZ84dep/5xCe z+Von2dWJtDzI1ZTF5Yp5zm5D713hS/XKSvS+78a4HEEQNoOb/aFJ4Hu5tBmf3zSfWTq50M4/jTG A4uGsV6O4zSISEB98XY/zwfdt59/FGDdfu/N348zIp4WND+u/U4+Q/s++zTP93Ed09ybz/KRwfU2 G7ESdupd+/cdJhzyzNA4yLLmAhfH4Vgy4f/eDx5W/+KrpwjXUMKWRf7O8hYJhiqNdCB9N1J97uxg 6z/+1r1DwootFTsML86yQU2Q6KdF7Lz/4YNVQrK7lV7sxkOsN/q/+JMHyNgtVX/h+mQq4c3BAcVh jBeoNNk///Kp6scPSJpEneOffYmksLbXL18bbf2ff2f5UFpLu1fbDUh6yRoLv0oBPdA6/Ddec9Q0 tpPYaKKNhsMkC/YmK8GaYId/u9j9ye1lpLoOqlfOlaQVG0O5wv/8e7PV7769WP3SM2PV77yzVC1g MLwIGFLvGkOEhEfU3z+F1xarys1b71bzDx/gIUSVgk1ujgX9LG3vhtAJgBbkmd19IP9SL5leTsCP Unc+j88VpmVCyILjMgvj8Yrrxb98vyRMFR6Eb9dlrfNe7dX2yNor9sgka5slXi8B1Xgej73WhXt9 /KNslyAq8Uf5pdx7qA4CBzxUAqJBxl6vigkm2yYxS3pIzW/k7x42OkPfoYvEpeEjFtqGnmw9i0Wd oV55ynr2nlez0AXDGKb3furgkeH0kiBaqBgOk6KBXdQW3DQEFtIA/KbVD5U4HMTzNoGHTiNiFf7q IuXE9/ZWU+hF6bipU0jKBQRxUkGV3l6Lk/C31fjCdMBbr3HgvxV9sakMkx6oswyI2rXNcB2Z3NeN PF0qVpoQSVvsM84tJLMnTcU+VrUAT7IqDeHj6yKx8l/axF27SPQZou/m/caL2sGOOYR8WxfgXtm0 uVuMQ9Q3lFfrWFSVpoyrHZPb8D4KwkySEvyp2d2HAaGn2eRLQfURmBCANImuiTYJ2txvi0c0yggZ myZFKnOnoVjoE3qslQ9LMqyyc/LeafcNvI3z6g/zHCMjwwCr0fCkTeIan8KbR4XJITyz0o/WCKEv A8Ll/TomTNQ7f/oU3mwS4KQe0Df7eMt70I33PtRdnuQc3rPAtBAY6Js63Od6Enk1DSE50HhfQ1nj XsJhB2wGXEfBBUNJwwBvf6lWqRevGA6Ol1Bscj47R81vJzJ/Os/ruVjGtcfApOcagsJ4oOHGOyec DlsALu/LcZFz1CCtACb6LPNRCU/mUq0fH/1oixt534DkhPAtgw4gs6uX0AuX9hPOsb3De67jIiOB p3SOXucv/XQZ7u+YJdK5Z+fnOOA7BXrw6o8B3E/TngJfC83ouVbKUiWhtJHjI2uZl1HmcTvynEZ/ pLk4DvrRZ5fuMTmtigvqO/g85hfWS1Ii1xuGUzyNwSBoGaEPjDhMUmBGOTqBqFGDbpWUmGx7yiji rV+w4A33MoIkoM/gWIuMHRNQ9SFL2zeKHumDAF4BUYFUTTvH4KkXm1DcHOs1OE5ith2adfjJr3xW tqUSZWrWr9pJksRfgav9wflS4IbXFs8iiHXcTXb2Q8WB9rS4WL1B7lL3tSkoIxhT6MwvrSqBhzwh +ZAmNOqd9oYCiAXNhelW1EDq+2iAX+O7yj2WqXCU6ChIj73hd/gJsYnftX1hACBgXD9efCL1Oeqt JucJyOcYKZ+eC3YWjr8iTSc1rqFO+NVEF57QjE37epmnBdeNR/zkKUsP19G249s+AvjN8R7T9lhH p2m2nuY8tpsiO7OouCgz24fLWqdBoRTVxtr7jI/mo/fb3trH18cBWtq2+qe4s/c/pLm3J/XdR77A +5ygufZHAtduDBtsfOfxTJgsdg9O3D040n8Vz/KXEZb3dZ6FhOTC1h+gdf2NG8tQLwhI0sMTAz2t 0yMF/Sql92//+UvV/4gc3w8frENLO2idolKcC/X//EtnWy+eGkj4WW8wZW1jsDfPdgpZsV++Mob3 aI/vKSgMRBMAFAZHXgNsvn/rF8+1fvRg7dAwbPvrVZIo/w10q59tUylpPn8R4D673Dpc29hpDQHw NQy+ROLSKlrcSgCuYFSQyHk4cLYTEYYWCZmUKuf6a5t7LQrSuHxTpAud0CRbUgCE5/T7C2zUDnO8 1ocYGRS201N2UH3p4kj1CkD7k34tLixUP/jBD6sHMzO5lIv22vIyCkxsREuE19k0BrhXJe3UHz7g /ajgqioQKo86w83iJbx2taxnbHPzR0i7DLXGa1HAdZqjbOZujmWFP+YfP9IAzVJQvGoBRfVGEhgS kF17JfnDcwqu91jYD7jJVGMMt59jBMR6lAjLy+UkmF049XrLOCoeoCRaFukmN/8kFdUuFX+Xn7IR C3yjwRwwUPOc8yz1IlavFj5BkqXixQ7UyxMWw6PI+ekxtZEMCaeymptbbrpQpaJsYCiZU6gWMUrJ 8JKoR9/BvRb4zbHznEf2S492J2DahXRXj7lJWRaL4T6h0yfZLZEWQI+h6Hh00cAS9ivLZfWVSHFx ni0M3N4BeLcYuSaARlEgGrtFxSJ8X73VRoFtj4AC5e70wNehb0DENh6wJN0pOQaA2cSb2KlOshSR CWgwqE9YVXF7ZRzN6dVqnUQ4Db4UVwGjWinSuSTlv4+xqXEwgJGhZ98+2o2+MO0cgyiQ8sj7KFUm Xj/b3M7QM2lPcC+b6J5vMcZbehh5vi2eZdMKk3HJ02cY0RrMylOucd+DFMqZgCogzYFWglO8V51C MeEq6hGOIekJ3vcCFIZdzjXBXJqaGgV0jGbML2MMhWpTrC3Ah8VjjBBp3ZSkxjInDe2UqEioPBpF B0j2jU1Uw+MTtXe1KOCUaqO0AWPRBE3nRwHkBZsU730BS4kUhbZT1HSK3ViTQTT2XFxjpxSvvsmO W4BPDTNVaQYs0OPxrgWuAbStnyWaxAVMGOymIwSJtmtk/hzvXG/LSAjH9bDRR6aPz1ItEpBsu82T 5LjWgx40fRrlEMEu597hO1H0Y4RaQn1xa41iMRgUAG1pH71GQeC2qzOtQoQRl2E+lxu9Ar97nbG3 gVTllkBWOU3b2ghI6G164VUbKR5sR4bnGxoeibd9AC+3qiWCflGhwHoMID+OMTiG1J98/x6+28cP ZmMMC7n1zhsLnVmt8cH9uWpkY7UaAfyrTOPo7FCRx8iRiXU6KZxbibwUGo3RnMIHb9a/DIqMnRTA SZ+X9amM79q5kOTfAjwfQdftSOiR9bWA60CuGrBmzAT5FodD4m1GECRK80NzpjKox51GqevG7a3q zRsPKKBGBLBXo8Y2wrBZL7k7Gr8mHmYZrdFhVkKHBb+P8o7LUCxUEa5PYCrgV8AsL1uKTWciScdQ tqzRNQ2sLKG5L78TyfKy0D7yOtpRuCfXYK8fG5Pz1CImAdjN104Cx/b3m7/fp3mPrt0OgE90Qe4z 7X6yb04e2HbMyfs4vs/imFnAaz03u1oNQ+Np1EFsb/0QqSfjWlB3yWMu83N562RbP+4mnratH9dP n+ZDfSRw7Y1OM4n+1S+eTfDfzjJ5r5Gyq+dK9cvPIFV1frg1b2iX/wC7UCVKOK0Z+/6JZ1dahB7r Q73hv3BptIVUXY5xs3gWz+/Nxa3Wt0mapNAMTjwSKCi99GvPUu1tqp+9XQ4tsv+4NeFRH750Zqg1 TXjZ10XDhQit3sVjLrjd5Mvj6F3Lcf4rLxSO8ztQWR6s7Rz24RpbZac6PdTV+rXr57FqSzj/Wbh1 G2ywy9t7ra3Fg8MtPHtozrZuk3iJ0sjhP/fyFPrZKB6wEP3Kc9NZFgX2zes8Gtv/1i9fYB3Uq95R /fqz4y2pIiqVSL/Ac/00Y+sjjY8Hd2eq737z29XCgwd45fEUsqkJSE3cGx0Y4wfZHl1p8Hotr9xB 1nwL5NQVT08pCx1wGLWO2rKvgWEjeVbcCMW6iYZ4ss/dfAXnrg61x7emizScWAvKZBzRcCntW1NA RMYBBi4M3m+iA27o0h2kgZSS1dFpNvHN0CbXVx5rkw16gUjDEgRBHT5KrR0Qmu61iIpSWdImqCYG UTIGxSgbpsYQCuiRQtvvV82i+DKixhAgLo9bDmzNOa9jjoW/6KJVwHBoE7aFe1Nk//QaHz9L6Anh W3tI8WKqS9oJPUdA3UEkYaRjsPayosOOEavG8AJUAykL/YytU8yjPcbOzRt3q5+wkZtK3w8gmMJb YfuNEHEZZg50WahCQ0kvOZQeFGAxPkrJtEQepKWA3AuNQ0oMoJLk2/n7ywAUEoinRgDAhd/aQ+Jg 4g16ewX/bpwaMFZZtAw1QEQt6y4jUxgyGiN6DVVf8O98lx1tb5cS2VAAOgkd90D9mqQyadU6zf2h BEIfPSSsf/tH78JXXko57SSWEZrvwTNpWW2NJ8H6npxkx3AAqrst7ShP3LLNtLvRlx29+6wpZWyJ k6SYHKJJTVuiStHPutUF2dkyNpIzBT0aKS2utbS+WN3E8zjAMZfQNR7H234AcJuEf/rM1GQ1yeZl Ov4y97yK8o8gQA/9NLzraagjcqx3AKjrAL1tXXa0Q5JkM45o/0TwlS8rxojrmB5a1VH0vnbz04OX P3rVxM+7KVKyR3RBL3nx0JdCMxn/lsXkGcN7d+rV2bYaOnraE8sJiJA6VbTpC1gu49A7UNkjADBe RTTMOa8UjmGUWJwTAlXnlhxmFU22ALjSHPRqW5lzHySsbrda3rbFJXjpgumlVbjWcsp5TgvTiAAS pqffhniugTr6oCER+kPAZUm4lXaxvqrmt5EF+NV4UL1n/17CkIkuPcfqGb9HYqkSinqDpacsI5u4 tDJY/fSdmST+jkHnGJgZqNaRhNyA5hF1HbzTq2hvb5skfO4MUYaRahIqiG2xwXNsO99YIydRCZFn rYfaar9jcrkxtIyyzCPD+O4bi9W9B4vVKpEL54MqGxvc40WQ4hgRIMWwF6xayPrlPtEN2Hd5cR5s wVW28Iq0LdvFMSPVpZc12f63r4zYZUw7zF1mNQrCzTymsmQ9aVBTEGyBGe3rkxewz2xP50KMUqlU rHt671sYyF3M89Sk5fSwMHOfKbTjPXDaHp7HeTvRu129dedW9Sf7SHvuXK6ew4N95XRPdechFY9x tu0j8zmgugwqVALZJKVq33BbLGcJctbqmxmSRTavTGXfd1onAdLE2RiONWjmmeogR5IgHTZh5TC0 KRhaqIf1jhogWbsxva47usW7dnieQSyJIYxGl/F6ezpK9S3ukMe/2sHbkwB4802PzbnrNx53zrJf PvpqQHfzbvv32s/lTqRhUERMO1FyWav+4//PbydH45e/fKV4wJlPda2g9wD5J93Xyes9Dtg+zih4 GpDyNIbEyfP4nSd5/9uPbe6p6b9PGlg9rg0+Erh2MdNybxPYeGKbyrdu51y3H+iDC3j/7h/egUYx cvjLV0db/4AiML9PRcV/82vn0Ygu9BFBz2+RgHgej/evXRsPpwhqRquDqlCe+wf316WbHHJc68dQ SF6nguO/8tpZi8ZUb/L3zOrW4fgARYKZRfN4nv/rH80eXhrva/0vvnKuGmRxeYdy53Czq38e6sjE UHfrH/504fAH9zeqv/mVs60hVeZZtQh1tc5w/Qer262///2Hh3/l2TGMiWHUNvZa5whTN4aF1Z9O ThO5m+1Wt5+PWjTiU3rNz81Vv/M//m515+Ztkn4ASCzeW2x4yrVdpcLWtcuErinuoS91CzCyT5nY bmXS5GYeLdAu6sWD7MIbXC1YaUZX4mjl8wDNgLDae1Zil8erTIBoPV2aY9zePVkQEL/r8H48jgLB mlOb0LFcXL1mgusoSghUDBMXPqMKGTsoTKjksELykwv5Jpv0Nqv7QD90B26wZxevKRuToesWos9Z 1LM8lU3AXSoOZ5dYN/x6kZK7KuhwDhRucB1wE9hLowkFxJUgW1pAeWgneuhjTZTwXM6vN9jzCrKy wgMYY4yoxVooURoNhVsrrQpJNIv48N4AYFOv7Coh9TvvPoD+NBfFm+cAdUW3FtoBwK8TYEB8pVAP MJoONgznA67dZKPyIaWgePDVotCr3Y1nDd3Lah1wISDSW2xIWgqCcmbSDtygQ7mwrfEcBjgCDroH Oec+gEBFBitRYsx4vOA71SF5FoHPrhlFAA65wy2rNPrMcKgHoZWdA0RE/WPkdnXrzbvVvPxBdtF+ AO8GgH9fwzUrGG1miDebI/8nWOCXAKZDIW/u3aQsgUQ2Ve5hB8/+gpJwaIbbd5ae3+X4NcPgAF9D 2qqCLHGixRQjAiDApR5CNUIjw518DGrItetnMeAOqlkA3EqoGIds1H14PSl/zVxyXHltta1tG0Gz /WkUQYdBEhdrr7Njwsia4NKy3X0ATvWZk1DJ9wQbJnKurq3V869QL4xE2K+Zc0Yz6nFXer+MPbmv Vho0qmdfd1GEqMXcztEmx/F9E7bD7+Zb3pvzV4+yhVMGMeJM/JXysoS+twmxAm6P0Vsc+hT/WGEc ZhxzjXkSPTVSRukvp5Ce5UhhMg4E1yrUlAUE24Tx1O9nUlBqfrjGT7Hbixyj3uPsOVxXbeso4XCM VIuspZbg5nMpIDsYRjFmbWfWBvnfs3jGR0f2qwsXMHgwlPYfFsNkcnyKZNTRav++hXvg/Dt+aXM5 5QJOq3Z2M0fUyw5XHM+7zgaCsPnpYj5pYNy9/bB6BwD/4B7l4LmeYHyCsXIBytAkY7U3WXZESxgL OiyGzCsgWmNEyATbLRxL/bRzqEsYu5HEc13kM3+yBIV3U+oJhjLC78geGjVyTc76WtbfI1Tod5q2 rgFmWYFKIuxBCR2WJEZnUKImxbvfYmxn+TNaheGkFKYG2wCGlsVvrOb7/Pnxaq1aqe7fgWJorQiE BKYvjpM42kGCI7eWh6hpLmW25pV1rXbQpFS7oNs5XJb2QlfzeN5jeARAb0NBW1ote0i8zhqnHBO7 OpmNBbJpQKYYmNdwvtV0FI1ZI5u+dqE+7ii+zbq4y36YOhWufeVWjoBw7rW+Z395/+1g7XHA7XHv 1U3fdqb3/nnsijv+7HHnaj5t7iW5KHqk02Ad5HCsVb/3zbeq1z5/hdoCY7zJvKqnm/SX9u83z9Q8 5/td73E3b9t80Hfa2+/9GuBpjnuaY9qf6eTf79sBH/LDozFdfz9j8kOe62P/2pCJPco+sR+bFCn3 +t/9B28d/vbbS9Xf/NKZXE/utQ+hMsnL0Dl8ABORfN2H6/2Nt+cPv3Z1vPW5c8PV81BJvn2bTcjP SPj6rTcXDn/pynjr+VoxxETG8aGe1v/1G7cO8b63/pXP460AhHi2C+N9oW8oA/x/4/NXzw8g2zdR ncHz/Fe4tkomb8ziLWEluEzFLwvnPM99pNTvZ/T18OFc9Z0/+k5145070dJ1g1Zmb4Bnvk7xmpdf uQSwHsPbAu8RWb6DHcP4mZO8yianl7IB2Sl+kCRE+dgsSsWJW4C03qZ6CWomQuF28m7tIcvBbvY5 fa0dLnj2v3pTbVa0I3DeZm8fs8faG7zwhZKsZkKUG2sWYDmncGtdgLhgL/3WY4nt0DfkhHZXpyhW NMHm7OaiVmsPEZNhfnrUFK6r12Uhc/32+fxRL9lzpeR0USrJLbqI1belBzF7m4ClBkCZ7G42prbH GCmLUzYDPEYm1ZjgFIPC84ahoPe/FNcwAfEc3lOfcY2x3YWXrft5Eum4jzv3ZqvX+RFsjQO8jad3 LgGSNsldkKdsFEYZNTc1vGXhzKqeYuXGyNJxrzWQGRmBR/wsUlxSNKB8zdyZrzYBnONInvWZFGkR Bm+f9jLBbZf8AdukK4VtBFtqVWOkSUcBbAdUWiCn5rX61NkL5PfiMfQf8Zo+XEw5816uf/4rr1QT lBU/fert6o0fvhv+rPkNytb16K1lDEa+sJGbk5QZTUG86IL3OrFLj66RmD2+a1n5JYD67MJKzjVB 5b4hZNQWAGV3CaNKA9GzJqh+a22ZpMserj9VTaNIMgJgnuD5R+G8d7Pj35tZrLZ8TtptgKjDAN53 OcTy5GVQ7iiQTVs3HvvoKgfE1jSoJPHxrGzsqk8M4kHViyigTilzgSXf3+XeNApieGYulciBnyca lFdN72gmYiIFZTzG6+2Y03RMTVqcIgy0MreK5J4GXCJCtQ6zp18geqFXfDMlzwHaRNqkSQwPQhcR JDI+h9VC9h4BoxZpWd2BJvD2HQDmXnUWWUJVXNaIPOhlNpnYfIIischYoO+SFKiOdoAP1886UK8l NbD2WMF1SQ7V9V7mWnCgbeDxMcQdQ2X2mZtgdDSUIM49QJvKzUayPTSTHcac35RDP4IXfmMbiUj4 6yNQrgSYy+wpUkR6xtDelvbBuVTGmpDfLhpkfNyD6jhzd4E2gX6ixCDtM2l1X9YOHSl9Smo6p4gS qn9t0Sfb22RWFU/6kRs0uVcqC6Moya67tO8B7TSIR9xEXZ0G6mlHolAZxobyk/XmGGoEUD+6HLah nrRosyplLTEKJpe6D8NL2cQd3L1drEle0wlgv6tzbZ7HJs6JFjIflnbXSaCnYnOHiMD8CvPidPWV F89Wb9+cJaq2Ur3507sxBIcwkq9d7CdCarKyyZuMOoa0GDjDmLtRCs8parFS36d7jrzucdjUiYkC bvOYDXgIsnVC+H3BZJbJeu+1PoPjQepR1uGSbBOA7XVSubZeh1MBdZv1k8932PP3fWzX4bqV/Grj ImtaL+OsTKl6xj0KvNub/yQaaM7bAGKPPdFjjxTOebQzj//VXP9oKeAjjYdQ8ZOrs1fNEO07hbLU M8+cqXFJmSMJ7NXXPXntk/fz2UUzT2qZn//77bPsMwOusxiqCapWLy9BsPrWSqg1g0nAZiKhk6uR hEpBBsP4LEA/BfA+M42XpDVcncUS/Y0Xi/bmb7+xFGDzMqC9ZqIkae9Xoat8985K9Y13lg7/xudO t1y0B8zYN0mEyfrF82yk8D6UyvLlBhhupH+z0I3K+1QvmJMWXvVn83X37sPqD/7xH1Tzs7PBctJZ lNizDO8puOaXzk3AnSOxjGfbQMVgHx6qm4eSXhY/aTzVhexcZmazoQds+u+2db4sHsUb27wannH5 t3dR+NYJ3QV6Fl9Bo+5Q8EHtuRLy1jzZRgGiXQnhWDWkeN5cRNULjseC7wr8oh8c0F7Cx5G906PH ZR13Y4R45WnqpdMbozSXiWJ6aYoX6NinkGeuuYgNB7s0ikl95UmOqCF53hLiLqSXAgpc4QqPWuTj ew0Xu3iyo9MdLyMbRc0Xjl51uJ+8Z0lyPbMAJRM0L56X5lKKa8wCrjsopnGRtuiFKy3FY5MoxeYW tBfmxUTtmSNlr9yK1dciM6gHXuqNdBXaSEoHm52qDVKITCjsWJHiYk4DbURESKpMOPc+dyT+GDPc 1w5gqvB/eR4ARmeSH7l1PcN6OU2aVUlAzxle4nBx9cLT7pY7d7c4FMDz3cGJ0eo89CyNGIHM3Ttz 6dskmJrgp1wic1Fvagqs1HzgSAYqOqxnGK+hCciWS19Z3iRsCq8bb2P0xPWYcp/rPOMSIGmV70lx MJFxEdAxyPOqSDICzWMcL9Dp0+PVGDxqPd1zJKn5PH0myFowhKTN6ELXnFg38iiYBNg6/sr9+FxS V/T4NgWJ4qlmzIVPW2ZIST6UweG4Dt3Jr9NXPr8bJZGZRCgynvTk1v5qv1eGXskRsJ0br3bGP/eY uVDm3D73I63EMWUJ9Ax33l+GRmd+gm3v/UdVBVDYS/GhFYrDSMXRO6+xY/spq+pIvnN/sTpLxUrB tV7pRYwZPdyq9PDUtB2GDv2hYashYqKh/ZVp1LZuxPMcD7URl6Koo9TkQUpdF+Wg8JZdVXzPYwWq HO98lrftKNcwUfd7GGCcyoA2WB2NS38w3jVo+qU80F5GOVQsyXozThIxANjkRQ1ux4OG29byWnXv 1jyRwAdRwtFksQjYKOpP7mPuEVFUTE8U70M38/EAmsQ2x29j2ElrCwDUQVEEy4s0X033MInYSJVt E08/UZ6CodsW3Lb2euo/7feastaoISUC4jzWcNM7Lu2Ny4RS5G/+odHcMmETEL6Fg2YGmmEXScGn Me6/eH2quvVgpVohwfGdN7uq5547iyzlqKOmAusVp4HD1i3eR9G73IC9Yv+UZ6s3jlC4mgdy/Oug 57j+fil3NQgunot8JcmSjo3kDpRzxS/SbET8nYRx54ujlLyQXSr4RiGldnA0Y8+veO3aNv3AZm3f 6+ppd3TZureOQHv7ydrH+uPO0Xy3/Tv19tFsI+WjzH/7yuj6Hsm3G9Fkv355+mgnbkB908T/FDx/ YLf+TAec7L/PDLhu1gsVR5bxzr2BB+ncUFf1FQDukZXIRMI5Vv2Qio6UFK+UtFNt4xevjlen4Tqf Gelt/Z9++93D79xeaf21l6dRIBnOpvT63PYhlRdTKObk6wtwwb9/fz3yeI5WNzJVP+R8fxfZvFfP DKWC48lXqjVm5J9s0p+pPz7xg+8jB/Y7v/WN6jZUED1q6wnt7VdXL01Vr1yfqCbQlp2GE+mGs0t6 cYuJaaJQqZImmFbpQ4Dt3wUQhyvpplMvH6ovHKHuLFv1etZsXr5XH5KFIQcIGspqWrhwrm5HS2kN rIsknN60wr8uCgZJwgsoaBIay0Zb+7vyvmBJryYECHjyhv+UL1OzulRX1GPTz3Na/GHM7H02DTdx PWn96kwrtcfKXJReCq/xODBRPNe1G7sAJjcfBlgphV7+LiHJ8pyprpeNpGzkWfytgqhMnc/GTxKy 2NR9Zp8liTocmOQTdbJ5RjejHtVzWKoFUoJbOaP99Nfk6cnqCuNWhZv7y+jpooW1b9IO34fuWLXw QI/z2SBc4V6pDU6mbEbl+s6PFqALoYQk+ylpaYlxOb+j0BzWOgRIe9UDSld3c/6BUBeM9hABwSM3 CuA0VKwHcxPOqTfbS/hd0CwFySRTPXSR9FOtRIo1z2GRBzMi3fK6+lEUAVQHlTh+8ITpzR4YHaku /cJUNXhhkfn5/WoHXq0BaxO/9gEl3Xj8U3jG5LSDbQCuVCHAvcCF1zYhd73eq7TBAtSFJbKyRoaI XiFdaAThPjrUDwil6hkc1VvIeI9n1cRXKmP240WfOjNRnbt8mvGChjTjZx16hCplI/DZJ5DYS2ly DdIauGmA6BEOQJRTb2RAD6gc81pCT4Mgmuka9CYCEgsPn1/Q6LjPWCoAPMVjojdWAJDjw0TMjDge tDgciiGX4k71ptssU/EIh6Sao4qXN6A/b0T/XI+2iZPRa2bsjhL+760Lr+jpjLHEmCyqKFuhtURn GiNEvvUofWci4wOiD5MUjpFec//+PBUZlyNfl6lC17ouW/ylJK+VOdFIWybk7zJTA2vBpsZxCrvw WQd/CzhjFHCicIS5f+/PcbyNB9axNi69iLFr+foowtAfJh1KSVHLfBCKhx5nQb+JhtLE9vjZIEpg m1idVEA5RLTnPPk+p/BoDzEvVol4rMLXllN9DwrIIW7XYYtN8Qx93OAg99ivYStQdY1SRYdpbuKj 96uBoEHCyhY1k2WiT+Z+dCv5yFzo8mDOJee6Y6X0T2kju9n1r6agndg9Gu/tcb+Xvan0bwGh5cUf MfCko2iQGBFgXNr/uPUdsy4a5n0ccA8mKffDv25ZgVKZUMZGN8b9+gLPf/tB9fCNe9WztIFJvc9S 7G1pDaoORX7u3HyYMTmEO3pyBMcNRrtcaMed0nc+T7SqaSu6CvpIAcePoNJ6bGbrrpMUHRuuVVmv ap9HvS0V7y0vUw1qGzVRKGzWaDzH9EvkRnpYB2OY+Ue7W+SqcQc1u5m38jiA/WEA8ft9p+mVBvy2 Tduj/msH/c1xdeHZeNdD9bA9bCbnC06W1168Ur1y7SzvuDaUZrXNCjnpaCQ8Ysw2e/fRHt7c3Kf0 +08r4D9GLscN9ZkB17G4mGUPlreV7Tv8FoVd/tZXz0PxGDm6WxteK7pX77K6uSakJYuYyR9FkPNU yOps/f+ggPyPby1V/+bXz7d+4/kpkr+O9R1PjhG1sU0s8eVk3GTxepekpN+7sXy4ivr63/6li9U5 NpiTLwdrsOGnNOg+zGXu35+pvvG7f1TdvnsvJYLlMG64YIPWLl88U734/CXC2Hj6mZlbcCkPLIwg sJQfuydHebMUionHtwDh8uOvQumINq0wpwaYaUk3bNfvxxgetf+uNJznzU+WwwKu4wYvnxWvXa1E QGNnI9D/Gy9w2bRS6KD+L8sj34+eiWEy7mMHOkBK8vJvw/h6pPuhwqg9axh+Ej6kHi45zgd6MuEr D5qwB9jRAyAPNJ7B2nt8tNrVC1W8eQE76iMXT27jtfQZ5Hnvq0us7oOe6HgNjz0i8U7yXRkiHVy3 nxLHljeOESEw5yeUG70xbtowPdSPNrwJwzQcXUGL4WiirvCAR6gkd6q6yVy6jwLMJsVZBBMXAQaS XjoAGYskd3aptRtPFdcP8OAagAhfATx6kPUC0i6dAOYBXNg70CqW8FYuAk6NHp2yBHQnrm3udZO+ 6owX3RB/Cf13WGlSegjX3QPg7CR5iqWdc0dmL24h/q+uwqjMXjcbcB/Ui+4+48M8EKBHb3eSSXtQ abjQVz3z+ZVs7vs8s4Uq7FO1p7vULYZLfGDSK/cukJdm4FjbBDAtmXDI/a9hxAjYhgHEU9Mj1SLh /Hk8rRrVwyRoHTIHZgH1ljnvG8QAnRyDpztdPXP1dBLdVL1YAmAZfh3EMBsbGYlyiY9T5OaKnJw8 dF+JQISXL1WgrF29GERSJDp4L1EQntWEz3iPY6AKAkygLUmg0UCORF6R1iv8asuY+3gFVIceEaOP /0X7zEHaTFv5uMdbQPjKub3GKG18dLVH+Ei1pBTqkW+9vGICJMmK8m2VxAOReE/K0OmRHmR+jWgY cc8TjDeNEJfWB1RoXIUjr3Z7iUAVTrfnOjJaM+2PIUS0ue1DqT/SVURgda6C7xfN+nKehhookC/g ulBI5HoP8bOAEbRNXzr+Uu2U+SoVpZ/JpCxsskc4fR/P4/fX5XPz79OMD3PMT+GxnoYyhtx7tUbE 4zbazoszc6Fh7TOWyOmvRjhOJZ4u7qkX0N1t1Uke3mRf+9CERBMsVdkwb8Jr71L5ViWWZYy6EdRH HL+O2T4NX/p+E2NwB9URjYAYw5xbOs2h0V0XkSPnRenqRMviya3X66Y9a0dQiaaV9dk/NNg0hA9o Lz3k9rNeX3MhHDfd/DvShPzXQ5RKh8U2NK9Oik71QqNSM9yUof3ZpeqHf/TD6v6bd6AXXquuv/Js daqjr3rzLhJ93P+rr6KBzbq0uNGCNkJrqyyUERtmTbjCih8JfkldeM+mGrugRnvxTNffbcB1eabG iCh/p2lqEK6dHg85xzkeBduu16RrcV4Lb7neFadQ82pmSgO0m33+JPgrM+/4dfLfbR8d/Xk8yut+ azvoceDycdf0K6HU1c1VOOblRI5lo3nnz5yG7jjmOyV64/aaZKLyxebZ2r3zT3P/j3umj+u9p8FT j2ujj+v6H+d5PjPgOjJObKDPoJv5Agoecq3nqcrW/tIK7mNGvTA1WL1wqniTDfXqLXTBVoHkf/3n LlX/k9dOt/7Dbz+o/t73H1av1UVt0Md+7LhZRdN2vI8EIkPdHGGC5ot4q0f6tqq//4PVwzWUQR7X 4OrRpijHsTvz4+yXj3yuByz+v/cH38KD9BCvI0U2In21T5LYOGByoLpy9SzAYCRcR7Yq2rBsAtF0 1qtkkqDV1wSvBUW3AWz3pzre5gImCPSO21oqIb0jd7V+1jKVAwTCFS2PmNLP9QaX8tn1OfJ+MluK LnG85YJq1UHknuZjAUIBUOFqhnNpmLh4ddWRXVcjmbClG8uw3hdAjWoXkftiM00io49ch0CTUAZY kAGZBLx6y48pUePBUCB83PpmC9ex+D3CiQ3Isb38SjHsiqexwId4ngTZdZOVjYaSvfSLnnOTqgwz e/0jLqyACvAgxeWA5/Gacki72N0EFxTeZgOEUwrIebbnQiTR3njdcsSr1Y25pWykF5Qro0nfgVqh PvMZAaFSfew+PVRZC7vDojlBZ2oqS3cAwgvg5YHaVY55dqgBIkWTZ6mGpz4z42QH8LpKcY0NntFS 0cMTw5yTQjYcvwt4tdS4fGfnzEGPxpggUU8jbcFzyo1vAe4P2Lx3TXYj2dAkR72BpXUxT1B20JM8 cfFUtQvtZAlKht5iQbyGheMnsWZpQezactKjhsDUXwDAzAOM1MzW+2t1Qp9zi7Zbj0yhhSrgw2Ig LQOYHmBACHbVU37mmXPVS89dqM4R4dkApM3BM10GpE9jXJw9M4WhVjycBVybw1mS6OzXUFZUitEq Yrz5d6GBCKxL5c8AcdpFp7TREkFYPNKGOnJOvbNEA+h33U6CuNi8Aae2ncCzGKmhf/CHNJh0YwCV oLyOhmTMFnhSxm1ttNZATT1rx19jBC/i6S8KFcMkBQP26Mcz0GJEXxZwaSpHSpfrxShxHhptefWF i9XlS1SjZG3t6aV09gG8ZfrSyEc865zTvnOeOMZbSlBmDlt6XPqJY794UQV4AmoNYCUrlX0M5cf5 ZbtpQPkkMcSLgpDVQMcArMom3ibK4blW6dd5aG8WpDGJ0HaXViSvWqNcDrkGtUWSXKN6eY4zcLFH mWc7UImW+FEa8j4FanY4z9DYWDXBmBkhoV46odxdqVkSaKTVCeq8jnaOc0ntb6MryFHFwHJN0Ntu wusOXv9eOM3dGiCZfgVIqx3f57Nm/fMZS7Quy22DrOq1qEmMbsBolt+2daos5GXRCQjPgRk65d9x jUuDKx8Vo0+jrKi1OC+3VzXK8c7DB7c40MsvXswa9/rt+eruzY2o8iiZOX3hPNEyvsf+MQ9ds6eX 6CDjfzDOgwIMw4EuvptQ6LP017/LyCyv9HMW19gcUQWpH6NEb9qObfaPSPHx0+Rxelyeqz6nj6pK 1wb7f7e5I3BODCI2Ht2auVKuX3+n/deTAN77Ab8P852y9j36arzpzbv+O++VrRs6WyuqV1NTGnRl z42zSQeTx9F+7edsf77m/Sd9/pimeGIbtR/7uDY8ea6nOeZJ12/vp7KfPr7f3u/7H/dnnxlw3cwW J8HLZwZbv3hl5PDv/vFd5PC6W0jq1R+XLi+grbwaVY5ZkpQWCf0+B+g+xaT/n33xrJrbrJ+HrWcn +1t//8ezh3MUoJlCF7t5GWZ8e37jUPqIYdmAIjYm9+d/Bq3u33tn8fDf/8btw//9X3wGhRA8B22v xrJtLzzzcXfOhz3fCiH773zvBwCKRbjU41mg3dDU6T5PAR7lpM6dPVus990NFmvBNZs6i4xUgPAA 3RwUGU1CWNuwrz244Qrn7eIt9r8alpXJFp5eAeQl4ahZ2VzEPSW/sVsEX4X2Yei0fNYAhaYwTLvn XB6gCXTxYAim5UXqzUnhmAKuixNdzWHUH1ChUWrNFWVYuTULcEijAPhZKMJNW6+vgFHvm4lxuV8p Hm7Abv4BPeVxvb1wELM36bEuhWXyOHleN/oCMAqqLptUtGhroB7vtefPZpadNLuGgELt4UgAQmko /5b7qcetACa9tZ0qbgjS7C88t4IWeb7jlAEXsE3gMRyzUA6g720k+pZJ2b8L8DXhdoSoxCwesXnA Yy8ycoJwPc22mZ7UeHn0mPIUeq978OoL8k2oss8H8aBNTEKnYM6cuTpNNcLBqsU9bcytVYv3KTfN PFwnzG3f9AIYbCOpMYacw18P/1iQDqBclxtfFDw6U7pdsAng4P7czE306sE71kufmWR1SHa/YLub c+r9G2EDkYZi+6yScHnYWk+7dlsAqa4QmFLp6tFTAGSONhB/98WDDGBiLM0A0OdQzOHpQq95CIC8 vbAYKsGli+erV1++XF26eqa6cHaS58DzNmchEaqZEteeJqnRyn37eNytgBnPmDxqG68G0Hp1BdQH 3n8AdV2eOg6BzJS0vYA4y1q81DwDQFVwnciIIJM+kG7Bdhl98OJtFfjUBZqM7DjLkHGUUrJpARtn Z+ZpOS6zNIZfKWkvPaVQKwrA9sfxZ6JXHKB8V5k7Qd4Qa+oybbxBW0/CgZd/b8LaEh7+h5Q0t+8s qX779lzKh7/ywoU4KqxEqeKIBVlUPkmhGKUPLQhDezuv9JS61giitxlLrgXJkajXIgG8INuciTg0 YqgJ0osxG280L9ct14UtDSupH4ydU9PjRWWFqIsc8Vl40kMYmXKHnbejJqgSjbCS4xzPYSdqZFkN cgiP9SnGmKjkHjKXM0Q3pHoccP9SPPpZH0ZVwYLP0G9/2+0CawspOd9pRCM4JtfZN9tkvXZa296I GrccKoZzz5wQPNj78H/74ew3cqKuD9mXWE/26Puu0Bnq9fEIJ5c9sdDimv4uO0cT0agPyDtHsIo/ Q1Hx/DU9xLKIrvup8ulcdKwwZjVaLBd/wNgtGuGsmdBABvFeX3/uHJGs5ei3bzMPlucXqj/4xver UxfmqivPX64mLw1RLfMhyZwd5IWcxiArYFpXVwq+6DV27cSese8cdw0yCsCuN1r7Wo9sFCRLMKoe 32VNbpz4TQEaz51T+X+CbMeKy6zreP1ljYANxsrwkGs+xp/r0HELHSUzNkDzcUA3c6y+l5O/2t9/ 3DFP+l77eU4ekzZpnr3+3bxn24UOudNRncaonEIBKUZyfUD2zHqLbfDL+93/Ex7rE3v7adrjSRdv QyhHh3xQ+39iD1Kf+DMDrrUiFygEow61i8K/TIKhRV/+D7914/Dv/Orl1ufwkunRWARYoUWdjP5U h1QuieGztHnQ+sc3FqMfq1TeLWSgTGA8CyjWo/37t5ar/9d37h/+C6+eap0ljufm/jrViwagRPwF 9KZtj8Lh3kV5ZLt6Fe7Y3/rFi9X/9h++Wf0f4XH/b37pYusqEkONp3qDYy0SMIsH8Hn4eI3F/El3 2AedXxWQH/30dTaKOaqIDQAoqVxGaWXDj/Inp0kyOoXywbBFMFBCWKekbQea1gN6dVmmLPYhl7Af b7d8yt0VUwKLZ0wA2HijoyXtwlJby0eTNAuYdIOaiqO3oVnlklAlfGrng5YlK3zL8tfRkuGWVFwZ 5frFU6MVLiDBYEiWF2/FY+2/C73Ce4q8nMfq2ZZ7C6hMNTMrtGXDK6BnnRLwXlPFCIGjyT16r/gw 4M7nTYRc8MEvgWy9ixVPNMd7noSnU7K5eM98332r8GkLXSTlrE1c8t4sqCIg8ZgkPbWK2oAFO/zx XAJr7kVP4p7VEjl3B3+bjKv+sMmXOwJRnl0O77DcZh23PN/gOfIQ8CpPEwn6zrder2ZRizmA6nMe ybFhQvfSD3bgXHepbc2GZxP7bCZzmeAoJUXsb/KiXtN9NqFOnlFd36nLU9UkcmZDp5Cls3Ib4FUA 3A+lYmVmubrz1oPq9tsPwtEcBXxOnSVaggdQY0kOd0l+AMhh/Biuj/ewC/CkZ7QDxQkoTJ1Qd2xA DZbsvEgmpiqmhU/w6g8CkEaoetgFaF2bmye56m4KspicqIoJJ0oipjuyRWtMXtTbbOGgTgjoJiy6 uS5gCMxBiUpZeELE8yvLKIbMJe/g+aunqldevMC9Dye57Q76xQ9I2BqBS6xXVlpM2f2LkeVv20+u rgBNAO89e8QO4wDR0GJUNuPc8cN7ATj0p5u/48iRpppEC6suNKfalei5TCxUGq7QTgSTnI8vHgLw 4omW862BQnuWeJIUKZN7C6pQ0k06y55SbzWotp1C19BDGb43xlA44CVnQFqV96Ah5HiUg61qiNNC CoVG4BBzRQP9wUMq00K/+dxLV3LNZdVd6POGn783p5GAZrRGU8SLa/UGuE8pqR5FkBQBS86Ec08d 8/zWe8u1GCIB31ktBBO123MnCjt6g4vXUgNlxOgMTWSkcUuFDo0OI3SMayUlT50eq66en6xu3HoA ZWEJ+gv7BQ6JSfIHLpyfqsaJBi0ArO9DfZhdWKYS52h1hsTWLtphhM/kK0df3DUnTgaNnjqR1h7g gwPpB/G2Uk0To0ILb5M27YQ6IrC0xkCkPWsj1NwLNZ3lOUtLs412mX/YhEQ0Ck86Y8jlpG1DeGQP CtiujztaVWvqg+u40RB+bCMjKdu0y55GldKDtVqIjgeTLOX+K1/XKzWGeadE4Tb7nhEvjesh5v2Z cWlcXdVDdK1vLe5Ub9y4Xy3z7BeV48QQ7R3bq8ZIUJia4FnxZu9tFNAn28U1kKkfL7bT3leGaw2i ixFVQLVtbIEv/51p0fb8edpiS5bPBetOrURu6nPWnznLHNcaei3zQpRUzA7YDqWbk5d2PAKx9dvt ALXtNh7586MAxseds7E9/KzxssdrzQe5lnM5uRLDUYcqu1bxVscbX4+ZGCh8oeQBlVdZwT47r4/z XgrK+PReXu8zAa69EReWX7g43LKUuEmKk8yyf/vPXWr9Z997kOIuF+E2KvgOkG0NAi7emd+gHDnZ +hSmmca7fQ0QcQ3lixsLiParrctJ//Lzky0XQBv1b3/tQuubt5AJIkQllUSPcw8Lx1/iGDl1bh56 Gb56cQRMhm4w536GwjT/DpUjf+utherG/CZAXRk+N2W9TAfVly+MkP8HR4/NwgqOP+/XAmHve/Cs DXMP4lWy+pmLdDeLnJvyGIvINDxCvZeH+/JO0aFFskwgFU1gNwP5vmy8SuzLt/ZzVyo3sUzmeNiK FmiKjwh6HbgBjW7rrnj1sfHItgPjArzDRZXukdXPIgWW9ZaTUCZ3SbI5BtAp45wNpdyf9xBvm5uO nmc8JocAEcOXW3ioYIpDk+iqZgFhD9Hf27BioCW88bzIKZcbLM1hU9U2/tOjZmhY7WYX3UYHNQA+ bvDiZUYeMp6kKGuUMnZZwHfhCQfo8I9U1EuyGmBDpQIpD+HIWs1Qj6Hg3ox720awogydIW/oCdAe olDQ/CfQzf0aVzY5Skox4Jq+6eC9HfonIWWoDtEHZlyHy0pbmrA1ArC9+sxZFGA2A1gslf4AvjWG aLUxdFiNdiE1xjiftEoefUUSft3HpXBEizGtF1S6QieeSwF7LzSRKeSdJqQG0B4aYq0+QqtwFTrl 4IIA1tlgN7nOIrzkFT3DAO6z/LYohxrV6m7b7h0kHwpSUhWSjX0NoL9PkuTw+f6UEtebfVAsj6pL XrsRCMZyeKBYEYNwobvOn6t6TpMRPzpeLaKGM7+0gFrBSjXKeOhEGm+Zaol38arfwwMrl3psGMpK SoUDKGgr15A94sGWqpaGdm9BybTe6tqlS9XLr71YTZwajVzfAoBxGa/8AOvQOcDYuXPTMZyWAGSq J9hgArZekh9TBIWXPnl1pd3ZOjtL26TinaBVXXDpL1EMcRnWiBPk2pdNCXBnU+EoO2+UdtNxGBKN hpDqKIwDgZneZsfAvt5bjtXYSvSEtovhh9c0oX0HLNU4BVc7cH6jR1O78pI3gKFDrczQkrY5pzSp /lRdLJUYNTxNur13bx7QshCe9QUSaeUzv3vrYcp5X74wAe2qG73neTSnN5B6U0GG66k2w5MOqLnO fVmi3blVEnSNOBRgsKy3G4MtnGXnGvfdsnQ5z5c1iMfq4QTSoaRyHHCvfXiiu7j/dSIOmxhLau1J 4ZDnrRb8JrxrI1DSh2b524TUMySnShUL5x6Pts/Wzfg8T8LvWbiq/dzzMkpLS1RYPOTzSdapSbgf ExhnAuKeLtuT9VH1EAGjbSv4y+JotIo2j/PB9xkGGH2CHBWF7LNmz9E7HGk8TrUNTWF/pyQbOi5M vjMaV1CPa3ShEzVgqKF2lGbR0HK40RYmGhvRc62W789YkO4iXUllFjnULBwMUiUw3SOlS5UE2lBu jM4RIUm0raYqaTyV6EwBvlLpNNw0RGZI7JxHtlFaz+mR7mqCsf7w7l1A+GZ1+crZat8oBgpVY62J 5FS4Brt4mibh8FciX59GFPRqXnCiaM4jvdBeN1RzFbukdBSwLX/bVwO2azZUCQZqYBjRdG7ptU03 aEDqtnFOMTY6iWDite7aYpwJ7D2hOo06DfJq9vV6n8t7BfYVcNsA70eh4Ekg13zaAHI/b8BxfaHS 9vU/2iH+yb8b73rtesr+W2gs9qJ3JMUQZxkGQ5KGy7BIOzff0SZPno/jpb5AY5ydvPcPC0qbZ25+ P65N2o852SZPAtdPez/BJUc91LTyJ/P7cW328YLrD2keeGMmDf4bXzlfFtm6t68Dlv/dX7kCGDZD uSg2/KuvnclmY/gjFio//SysVkL8jRemkpRki3p8nyZx/boy0U9SV1883i40gmt51k1pa+/hZegn LyAB6D0oqeTrl66OWV0yXhMpA74E4S/h2X7hNFkYHK1E30d7PWn4Pf1ZTdR68927AbfjU5RH5vk2 CXdbTW2IheIUIWyz3UcFfXib1nEVHEAH0csm2UzvT8twphJp7P57eHT3AIRSRpKYGE8RSzt/W0kx lAb5sHo4ndasiHokSuyteArKplKT6rLvlPC0biV51Fn2AJgeI9A27G5L6Gk8NG4YXF6oHuFZe7xe akGlv1nljXgYjhTc6xkE11Xz3Oss9zPD3w/wiOx0Uap4AE88QIQ6nmo24DmBfkHVtCG8MVFEYLP0 CSNBRzfvGUbnHgYA3dm02LhlyVhQp/G26Rh1TBYPSdG71hsXnWI3LNuH6+0n1Co/3ytoKBQwrDfN JCzBisaC/O9Bog1u/HpCs7E2MlG2L/fdC+DpQSoxFQa5Lz3den/lFytbaUhZ43JOMGiVRNrlOjJZ 586drR4S1r43s1TdIkw7R8Rigc3W4knXOycoArFTTTBW9OBLudC7r5674FCAACKthoh69OOp6sGz tweHch8P1i76taEeYNRIj2iRln/2ufNwscequz+5U71FktNN1ATe/tGtSNidouDEFN7CQQB2w6aW Dyg1Z8OkvQnmF8/QwzjqtQ1R6YghRvlxE25byJi5Ce+sAN7Z0AeUvps+A//5ajWyuVTtvvXT6s4/ +qNq7SHKH2yic2v7qICQTAlwP3dqvLqA9qsV/9bxcksXGSC0vYtxcou5MkObdfSPVl94/vnqq19+ oZqANzov3Yxry80cxjjQmyktwspnm2p4Y1j1M346NCxcc0ZHM14stiKoVedYyb3eTqJeKWijTeLm XqTbeqmSqefac9mOgxgEOhEC1GL0lp8Wc6aLKJvG2rpULikFrkclnBMOewfoQ8OlRHKKMSbIMHm0 m7bY1fg1YU0gZWEoN1/nVq3aE36tMoaOd/7u4b5HAGnhPzNGJ2krZ4lUkDfpV73Av/zVF6qLGDdv Eqn44Q9v0a891a985fl8/6237iURUkkw+24JBEVh3SToqYqxQnsL9Lp7hgLUhlVt4KYfLCxBR2Hd whkwYoKpc4U1S1pTuNLcXheG6r6RG9Ypvb8D6C9zp4DTNcA1FCjk8JYoEGSMrI8xdGBUxMgJ4/k2 nPkx+vAKCaoP8bS//pOb1QrXHASEj+GUGDVqxbyK5OPDB8y57eo0xsoIdQ4GOqFnyP0WG9Lm8nU1 DmIwB7kISjXmS1TLpnS+C9ZadbJyxoDrTE1CKPQLwCXe3EWcHr20WT9IaI8xpwxsaFPOw2SkYZDp 8RfoZtsoSa8NiIihJCfd5VONdeeuAyG3UjID3MuKbKDFp4hcmlSbSBvnYbwaFbAoTt+I9CTWIsd2 DTal4Gn06GRw/XZ/GSTHYhAawswcewZyIBaPOUs09y5qRUtr89XG6xi3M7PVOuNk5/756uqrL1Yj 0Kykyq0y9lTcOSAPVjrmNut1I3SjzLvbsFEMn6fJKc+z6dRwHbAGTLFdsucIrt2le3uMJkmlk2Jk QTEdRB5kJIfopMaqtBs+28R5d5cxcbi1Wm3MP+R9Irlom3ezP3QMDSNHCt3OSI6Ro6zvRh3jRsl1 7Q+Lbh2/TsLK40/eDyk0YLB9128/vvnbx2h35RWk4lxuUSiJYnkzayRgjzDHpT0Wr3XuqAyN7HMO TSNAfldHSsZpfeEwFR8DPU7eX3N8YxCc/MqTgPPjQPPjrnfS+GjO/0Fo6+MyDprrPQnkP6aJjtqt UMQ+wsvNY44M8iG1dJkFeuEs9PJhOBIBwm1guLktQbI/x/9+/A1ngWJ4jGqRP+Hl4jH2hIqIbmwm pTzu1a5hbUO74LnhuMAOA77aX/NkR/v5ORbip33NkySiF+1n+U77ubdY0OaWl1ISeYCQv2EzvWfr glC5q0gaDgMi+wj3CZqi2BCNZJ/GmScYNomnbOgB0/yO19aXIDEb8/Gk85uZbPmjDOeipFeW+WM7 375rPMBlVWz4geVL9ZPUu0O8xQ3lI/dVNvwSAq/pH6FoFPB9dJ/EXeNJrw2vLVbogE03wPA9Lb5Q eIaG7lVtUH+3j/HahL9NgvI5yx5ZEvoacK0Xz7b0stnA4sUxGZA/Wam6QgMoHjirs60rCWdVN6Tl +lTQYFhaOjhJQYDhFJTRDpTrHToK1d8IuZpMaTJm3brcSzFURLgC7V4AWvdeagFng9nZ68PDCMjV g83z2kYLaAovLJTkPb1jcl9PoTc8jtfVgh+qi8zAjZzBUz5G2yyuD+AZJCyPfJ5awN2dg4ApvNEo inQBqvVeSw4aQK3DJEUjO4LBA6kBuAIFatJvHFed6l+7aaEHPIQSi9nqgprbMyQ8Ic+2yPeWAatW DRviftywIHKkrUPjYLfcVi6ym7Az9yJwSaiT9j+QEmL4Npk7GBDoC3eQsHnm81Tnu3SN5Mspcgou VDd6vhvQJOVlg3PpfR0AAIwDspJYJofXSAz9Jf1jZmO5epfNX2XCL7z2QvWlLzxbXbt2hn5EyYEK boJIvV0DeKVVE7HgTvqQjbl/sBSgOcBwkx6QwApjSK+jc60bYCLn3uIqlmOPegtGm22lrFkk9BgL 21toy8v376YvHMfNPHCsh2pkiN5hJyQr4CCFR5ynDA+BcB8eVUHegeA9ntEalfjLkel45fsHAgOa UPCwDndWj21AAtddAyzJbx6mrVT7sJLlLCBTGtm50xPIF/aGnyznepc22APguoZoZMqtHoJyNwb3 3yI9StwJ8i0dnvwOxkif80QOOv8lCiRoyXwrRZJKkrIRqjpy5dwPLcFvlOTMTH3HpImQ2r0+E8cb 9dG4jLpPErh4cGlg9f4RIz2GipKbgo4yjtcwrIzcSatyTZBfvIQxscwzDNHHA4IqDD2TNnWsJKoj OK4TsANt28Bfburop6yPGv+1HVRP7RLlKwBZsFPyERxXpS/KdzpY16SQSU+zpLsMmC7usSy5j4EZ vGUi+p5z02MxkK2qKCBVx7tLqUw+N2rQBdg/iJPEfmBM6NEm2VNq2TYJEba3zpYMI9rNZuyj/zW/ 7FPvQYdAF1HBU6cmqm2Uvu7VURc17icworqQ9pshT2GZ0u4Lq/tIYEI5nJiunsfIHSSBeXWdZ2Y+ DI1wf1BEmHIlGihQZksScNfCNfFUe02kvrP2Nd5qWyJzIw2nN7bOMUh08zgy40DTzsnYChLHSceY WceDv7W2VK3PzFSz79yoeg9WqslR5xMXmZ6uuiYmAqCNRvYzRnqhuXRjBOtEce/s8z0rGzsuch+l TZNMHEO1ybaxx9qh2nthW5OJUe+K7/lVdrhylkJhKT9ijpXVbYD1SrWITOSZ01DrDs1TKbZVtvRm 066HTvPe0RbuMK6Bdb0dl+u/D5ot91N+2rfy9q8d3+V7n+rE9v9I6zypDZ7m/fb7eZrjP+iYD3O+ jwSubc6bZFAPbnRUV1Hw2KCDDfm194UD2Y63MEv4qm0vJcz8XCm8dtUNoZnWs5a21nX7a5HNUkuU qoqPfMdzreJJG8Vz8miSIZax4XLONuDm1XY6F1q5074sJPJByh828Azh7lwHg6IDsNOn5mct5ed5 UBch7LiFfJP3cWwUSB+JggT/yZ1sf6plvjNDsuUQE3hIa7n9Jj+g1zfYlBfhieopmZhkkw99Q6mp Ug3LsOgQ3tAR1BsEeYeENvWa6X32/qPAHEBdPMylAmPgZT0jBdCe083djdAFmY/r2FRJWEzaRBaS TEo3kvzHgZ7G7zSgvY44BEC75fvvJgrhBur7ghS9NI6PAAsVQEp1OikBKkBEZ5y21zMhHzl3zfiy T01mkju/DHAQcMvv1BsbniHn7cXb1IeR1e3KHU5r2dCTeMiJBLyGXqNuEFk3Q5N1O0nPUBkBXrB0 EiXJ3Pz8fDM86ZKc6UrbLeAyGUivMv3vBu65Ih9naBmqgEVD5HbrCZG/HADANQM0BQ71Ym2PqJu8 jYd4l7L0DuSSgKa6QgnjairbRxNwoQWuVm9cgQ5hkqH3odnQTyWyZ545DRd6oLqDV24bz59lvvd6 KJyi3F6JnbKploQ6aSf77HQdjPcBSz+zkUTuTF4o7R7FA4EcG7g0ooSWBUMCAykegOtpnm2P5LWt PRRHOH6d8z7EIHi4aHvBd4eqNE1S2S6AYB9v+4bl1u1+gPagBo1GBJ5HKQddUXYAyEEdWEJve+Wu XFk2kxfusPEPAtyXqy3A0go5F8qMyQ814jSZ/AOSMx1Djn1D8Yz5GY69SYWLdQDmhQunq1/++ovV i69cSQn0uw+WyLw3uc+S632ARuYQ53BlMonSRNDh4ZF4sTdyf9DNTAplHuvVSllqgTBjdnXbhFI5 1yWJTINRLv2GofFExOpETxCF0Rzncww4KBxRYxFMyrk38Yrx4zMVxQmBpREQxgHts0wehSB10AI8 GorZUR1L8rILxzvh/VAuBNuACEBDHwoWrpsquNhmer+VqjTh7wC6h3JxF85OELkYrd6ijLgKLLt4 VmMgJgKFMYvbcWeXUuFGcGgTuf3SLWbxCmrgmZDbq7IK1xfkDQyUJEvnmfNWbna4v4lwlbm9aZIj 810uts8BSzjr46Yl5fkJuHP+0a8qufidPhwsXYy3IYxWk0gHUkbeUu0FujhvbT+rC95Hp3mF/g/X miqtQ6yR0rOM/mwz/ibozwFVazi+JNOaCFryKbJeCLIFT1LhBDIaVjWYOgYOJQoVM6IGMAEftUMo kb94jf1Q7jHtD3XrEL1xh4ae0hK7L3CqociJhOxH36/Z1GXd1ajToHddYU3YAkg7l3wGDflDcpbU JDfSd4DWu8nCkbHkGn3McaNt63v8cMzd2xjEGBnrzHfVe8yd6GHN0ki1suUpQJwJoRevMJ+MPjF3 V/iZRX5xRAlBbn1iuDMRxeWl5ZTl3mQMzwGqLz57pho5M0ZfuLYxDgTOaBdgR8erGg+1W02tPJg1 IWtxbOsaXBeA6rHx8AfJFR5+dgXHvRQXHUS2XfPvYAtoIUQ8Dp1rUCTlm2xTjr4fqsjkGGC6m/UW upu5Kh38HG4yl7fWUDvqSQ6F+4CRvfU5aXvFiO5kv83aaa0I2jT69ZrDSpJy/ka9R8M7fe6e6jgS MGetrzkx7fv+IxjccWaFU43LIi+5urxP0Zi1GInuuVM4AExm75Aal7279vxnL6639zIUC+huPP9t YzPj032g9mqXfby81wDNBoA3t9cOlNvxzUls3nzvccc88qgfgH2e9HH7OR53rQ952vcF/ief0Wt8 JHDtoqiKxjuEg86O7RNCLIPn+GVlt73qHXSjz5C5egb5rua1zqBYwrPmQjXK99qpFS6U78KddsBd m8JT1AbKb3IuOc5R/Wi71pYZ3VjOVqMbNgmkfs1jKS/hiVgmfH0JYDGFR615CWp/cGeJ03RB8UBl RMHS93kJ+O+ySlgm/RSb7eNePr28tiyANbZ24bgH79VNw4X3DNfpO+J0uaa1qhXA4A/vr2Kk9CcJ 82lebmYP5mfiUTU8rqaqXppOZovhVRPf+nleaQ8DlG3vNgwsSG0ptSUYamaYq1bjta69XS5CmZWF v+7/5T8XqnqBykYhfjaBz8Uho7oM7SNd7PztQQWsxxkeMC1w9nftqfazmmctBSWqEgHXAl/BddGw 1Rtrco8yaS4P0XiW6iNgYZMlJzbUn0WiAat44fQcRpkgFebE64YL9fC5ofM9NhFDzdgipVRyvPTS IeQ64g3gHEmU1MMsmAY0yGcVZCVEmIS1AsLXpC7wfP14NgQlFl9ROWF1ZZXkPtofrnunFCY2ftUT 9H5IH9ED5rO4wYVHeAhnNBz02rMnkLbCgkVnWKilt0TLW3qO4WeoEgKsEncpxR80kkbwhA8Nr2fh 3VjEewQ9QiUFSzNP945Uc9tL1Z3ZeXjKG9W4igF4nwRZLsiCM7nj27RRD+03DFd50EIpbiz0QSlq U1fPAwxK2imJrI6b+rcbiFKHGDfVDsYI4Wf1wxcBQe/eW6juUUUSLfnqEnSNa2fhMPP5oKCIdjrA c97aH0oyqGMqXtJwSM1vBPhAgxplTXEjfPBgtvrBD94giY8xr2eN53R8pVw3gHNUyoAbG/eTaqsC JJ5zkbXkx3BqH8LBnZ6erH7hSy9U1144T9GYXrxsAEWLa9ANfcydqamRgAWvn+RZxog6wCbFqdjS 18v4ZCPuw7sdL7xydin+An8ZI2927iHf3cejRBEauOIaVnsAd7d87y182niUnftOkqwkSTKTQ6zR oIrMGsb9JkDeJbFHdRvGd2hI/JjoOES/7XNt54TRnsaDWgzcMk+NTmhY6H3W0LDPTebt5voaAtlI Ob9FYkz8HCUpcI1IyAM82GOM620cAVsktN2+OxdA630YKSvRGKKXjP+u8Vb1zJXT0HT2AM0YVXo0 NRACcq2GWKpqSpmIJjr3tUW0R8+52tN65rd1FCirx7+3E0kr3HPnqTKb+GOh0cCfZ0xZSnydOajr QFqFwNJowYGqKFajlGLFM9ueB/tIbRJlnUFN6eFdIhaoXQz3TBDVJK+A4zdJCjcHpA9kKjWqD4qB zkgBdby3ka8MEkovBVzHTq/dCzouazdm1kq+GIM9wMkP7V+O14te97S/XYfs1zgQNNRCT6OPk+ch VawA+kRHYnz7U055tNnwlsd2M2ajduQaIX/CKCZfjOde2gp9topxIjmpvx/agzQnjPCVhxuJer31 xh0UUpar779zFyNzHnoH+SCcw/VviDE+QWTj/OmpSFX+6q//QvWFz12vLl4+A0bdgmZzq3oHo6Xv YgcgdSSFd/pwaHRBezHS/b1v/rj67uv3qq//yher3/wXv1qdZc+bxbPt/kpgrdoVTMs/N8VCaXWn R8IbZZti+UkbON5SWMs2rLGAPRCOta7v2gETOol9Y3Ol23QiFa10FVJ6oD92YhzKkBwbgyaIesj0 JHOa+bzfh0sdValIWbq42/6cI8uShZZYl3egIq2SxBl3oCGRjI1i8KTiZeYTtB4+c392TUhlU3M/ 2Jeidy9FVa487vsCCBsUa+Sg7JHFoULxpk0MSdaARZwKy0hlzoG/TDB2/FyB3z45NIkJynyMYJD8 /YKMHXWBUraD231GYQHXTbA0W33eLG0lJdDnbX5iVPp49bj10DKay+vYnViOedLr/T57n6899UfN +T8OsP7UFz1x4EcC155rms3sHZL9ZllwJ049Ck7diJbodD25erTbwfUaC8hdVDmu42118Wh/6WmW 62j3XEGho52s0W3I2c37RNcZ/lnXm1Ic0UevudA0infEyoRF6bG83HvcULQc1+MZeX9w7SK6zQIz j1fh3B4JctxFFAzaRoqTvVAYH+1WvfpWfZTnPYFXwaTx5iWgO0Wy5AibnBvJ07y2CWXNIxlmGNGm MHHLymTDcMQCeshEt2peH5u13MWOUEQEqhwvJUQeawCcQAwg4wSuZeTc1AXAFg5O6NINwo2tkAoL QPYYgagLWB418Lr+3Jlcjjvysuj7rj2bRS6vhH1d7AUrLTP9XT/iovVHgN1oVxeOfY5NyM9JL13A JCs24VBGCgfP8bbExr+G1yWqB/0lmVPvoItfJAelImRBE1hLgzDcW0LbAf0JS9euEUP6cllB302B FL8ncFlbE+y5oEqJwlB0oWTz6QfgCL5dLH1fvmI/nG9/vA/BudezEpvBbjf6ePaz4tmmhrX1BuaO s3H77Ok721iPJX/FK2G/MR8EFc2IS7hUGoG6smM8H172TbwZPX2EDAHZhuz3MMTGSNwanR+OdN4D PIx7xGQ1IKagAHShNrHC+5b+GkZ1ZHhyPJuC3mCVTNzCnJcaOrskKmlQgmQLNz8eeu6XsXUoKOCc nYBmlQ4ESbdRXngLUDOLJ8uxuwjweosKfpNQIi6Mj9P+LaSk5JWbKCnwIrStp03QJYjivkyW7MfT OEqRqW28pffuE/1ByWPdyn3Msx641o4vva96UI3aGAI3iuBYMhnuXaTXFjF+xidHq8+/eq16Adm9 A/rqAYnBD+dJqgMUjkKNmIBrPYnXWgMuJeDpN0PDAlspM8U0kgJSltNt+NybGnbs1kPMxyH6ffQZ +swcBtYf6QvrSi0SgTigT01iFFhuQVHwM8eAYNW+cPOVMmCUZVDv6jhhajbgbQC3lAbHjnSmbegm vhybAccaqFkly05YwHVZWdz/NVy3rMia+Uv1PNqrFKuhWh7UAKXhXFMGGTsT0HtMMnz9zbvVpQtT +Y6KNq+/fgNO/aXqS196Hh41pcH5ESS7zgzTbteun4uu9a07s8ktcMwW+hKQLg46UVKJfoSyFbpd URnK59xz1FNqUO1CUxKHne+C7BJdSnTUREuT9WwrvYS0g6okGkjStFJ1EH78rgYXhuEa7bqKLOAu kRLpHgPMcfm3+7TjIcdYunxcOT7rEmFh2S6hsWiY6622jHbmKu8LBvm3SbZ6Fctxtfymc0CgYnJi AEuNhmOIGsEsqjxR60kOkPsSY4p20EPreOjZNqpacn0CGP1AAzqmNu3jvTQrsOtXDqMtSeaWTiLd IwmOnFMPdKfJ2yjeHHB981X26P9bN2ert+DNv8NvlVPeIn9HY2WJ6ITfsz+MRu2gLDWL4+I+1IM3 bszEWfFHcNb/pX/mF6qrFyZZK5E8hSY1yJ6TCEESTwF+tM0URvYwfbNKgbifvPVO9bu8PzjQVX35 q9cokz5FxVbWS6UleZZwrQV3ZRhkr1aK0W3aPJKy79QA2nEfw8apUwa57VmoRY5/jytOorQzv0NT Yn5Lxxrk7x7mohGDA2U8HV+cz393bK5Goag4lcr86mT+Oc1MUNVQsRBNv0Z0IhNeR3qTnvVaOco1 gf16g4iBlC3thV06eiue63os1Yaa9DInbAyC5uXeV+MJjYbF9QLejVZtMFbVVz+FWssEeVWT06MB /ttgFCNpGTLsXQHHWSAyhPI7lyhDqmirN8fUbd4cn9zTGk3nV31s49tsB9eNW6Ae5UePcPLfbU/3 yJ8fJ+g+CaxPnvtnAd5Pc19lHzh+fWRwLR/6WSzPx9kpdppc4glA3kk+M5UU44FYZiMc1VvW5oVW jUMKh9Zd+IdttzyK11gOljSQdvqH1IwJklhUdGh/TXHtea7h9cbwkLe/DAudgovsVyxf+0Evr3GZ xMiHqzuHS+s7LRMpB92Q2u5d6aRTViZryiU5jjm/wNmCNWbOn6THDOEd2T9At5d7aHS73+9e1jcM tS5kg+nBc7epx4eNctuNgg3d0K6eDTm8em37LUyAlyyJhCSuuXi42EStw9UrlA2vWKgaZSv2mOLl 9fHkqmWD9vN4rktIS7O8eJxLcNL/8r/M2LIAlkWwLHaFc+1POSYgW2sktyGwLRuLSVaN0kY8FIJL 35NeIagOnaNIWq3iykhyH/f2kAjBHNyzTTcE7k+PdeGhes+G7ZQzAxzJoWMsuWkIiOPxiCekAH49 eILf4QmSHQGGJpNFczZeP0uVkxRKtMHwY/jb0gYoKqHUliDM6Mshi7MATApJDxUHO+mrjBUiBsJm vYalsQpNSJ6z/FLBhxSA0mgAMq6ZiEPipaVEc9NbLnpyd4vRUdoxRZUYl4bZd8KLhg4CRePMOQAb z6KHaH2rVU33AZj5/uLsavXTn7ybYjOnSUR8mUtTPTx0hFGk+waRHusnfOzt7pAspgfZRKdUyLQI BvcloIQTFeM2cReHlqBImT2AKEJ8qLgckmS2hqLPavUuAF9P7cgo4J7v34bzPE3iqZIOzv1Dpcc4 jTPWZ9uiX+WcuikartcDX1EprnuBfuEezo7DJUdGcv7mfHWLynCDcNPP4yE+iyb3JIm8A8zzDWkY eMgsD79EqPw+Xp8Rnu8lCmG8+vlnqpHp4WqNc6txLTdcUHEWkKC3dhDAqTd4E2NWPfR+vJw9bLJF QQMedWgi8OWZV2perzM+RkgIk188wPP30e4r8w+qb3/3B9Xbbz+sbt5eqOaQyLRPBR8bzN9FkuqM ftjv5keo+GNFyLMkgj57yWprI9Urn3sR3e0rPA+gnz7Zj7cZjzaqJYtLS9UckosaDyOWaA/9RE+b yb6Z0eUVwIWNpuHjuOMZ1q2ESX8NAYAssOTaerAHgIfKMwrlb2RlAAD2MLrVI4z1AdazudmF6ns/ frf6Nbj0mokjdVGZmYez3LNyn/0kmo5Ud24/zNyVVuC6va7jRAASfrTzvq0Ko+uI87ReP4vJWHZz jQPbO7kXHGfU0881YOV7W6ioh/vSYSLiTYEg+sucBNcaeemdRlwYR7vcwzbPonE6Ql7EiF5E1VTw vHYwiAf4/jDzuh+vtUo6roMpvlHT4QKA7CkBG59poLuGZszWEbAAJ73WAWYFEDUgzQN9HhNM81HO 2+xdZc2M/CbjyLVpn+hUb200EMYKYHYuCEXj3Il7tNBeAqyTwMd9AwA7jQwDdKUQuK65BnUjndk9 OFLNMvffeutu9d//zg+qb33/jerm3fuhg+ywdo2PjKLlPoVneaK6cm4iToYNwLkqNwLHGeg0r9+6 W/32H3y/+tGP36yep+rvL732UvXaC+eqV188D73GpND5Eplg7ZN9If3mGRxmq8yx22++Wf2H/4+Z 6sG7X67+9b/5F6opaFkzVHF0PwhNXgdU2rck4iXV1kYOmovbJ3tXwHc8876fjaXkDfmR3mnfjUOu SFd2sH+kMqgOAqII1gvosR+4QQJKOCMYf3LNBeQkj7ei8e8luREpH72CVo1efugLI1ep0eA67Hqc za2oV8Vj7pWASPtDItuaouF6rQNCV7xPwnNo8KpMVPIjfHA/KmO9eK31uLP24DDTcN/lmZC1rw7E Nq5z00Qeoe2FRnXAuEENyD1r3xydmnrS1JLIrdWBlLJrFBukXLP8OwxG/m6QUTuyar5TeqLMg7zX dlC7m9DufNSFWl+07dfTANj3fuvx75w815PO3f4cTzp3uv4pL9x+3EcG107s84RSmg5pvwcXpKt4 pv2s3bvrMf0AHLWkE9Y50eoTLPBj/GTNOPFFk/5O4U4o4vrHL8G71R1PAlc1rkfh17qgnLwHAW8j oXesb/n+rXgeisWpwV4cvUW67+T1pg0hc812jO/CelaNaUKv8XqceF5lB0cFZTzwyfOdvBu9hhY7 UONYKoheovgwlGZDRUCPHisKnpf9VFAb8Jr8ex9PE/7WXNtFKRI8ZV2qty/OIyDMBBFEOzVK2LKY usdTxbl+9Aj15qgoSCoP5viY7QHiAeMB0cUTnKVErrcAuxk0nszFyM8ta3wEpmtQzffjueUU8eaw iqq0scd9yo1cMXGPcxF1RHsccMQGcMDC14dXpIcNKVXg7K94GnRBFS+QtA4X0HjE61mW9YXnMCFN YC4YjWwVB6jgICDwXGaf17ToUBf6ANBDxDRTUtjwN2DFZuiT7w0Q0zuYvso4rDdbN2WTiJTbcxE0 ogAYEpzbA7ZmGbOuyIJ+z1OMG9+LMZKPiifPxdqXwETFlQ08M2rmbhre11vFeQ2Zj7MQd67i5ceT IlVlbBRdVMDjHEmHt2YWq++x2U4Bzp5/7kx1FY9SP9xKr2jymsDaipyCktA0AJUtNuKW1RcxDuIx 9xaNewAOGp77Cu1xHyrHDbSibz+kniQeI8uPG7bHoRgv2RSKGk3+guBgW860fHE5y1BXdjmmh41v mDVl8iKGAf27yXk2Aezd3M9peOYr/AjmLCh1CZrLFB66AakignL6zpyIOSgfc9xLD/3y7LPnqueo vqgXP+DbMtl0rDz4FlbCEJuVXuTkMthfUg6MHOiudA1i/EizMM4jQLKdB+CkgnvjMZcCtIo84H/3 j36v+gMqpn7vRzeoGEj1WbymJkqqvhNKLd5Rn3eH6JMGpB4spfb0uFu5c5okwVGA/mlA66lT0yRu AmCeu0q56ctIA06hJT6J/jbHYAht6AHHI271PyX/UmxGgJ15rMe1GPgDrA+OHV/d0A9KaXIfCZDK TZn8uoYnt4t18vS5UcCZdJsCiJVfmzg1ifbzRnXz3Rk86vA8MeBm4Nq+jUqI6iLD9EWSOmmrHkLs 5j4Yvva5U42V6+lAiUFpRKGmsRQddNcJDdSGOlEiYzFmNGTS/hjZrBfrOE+2VYnK3NXrbWVAeNkU EFoFnAq+PacGZj/9kdWLPt7FIBQTDQI0TWyV7KsspAnsY/TzgPcu+NKmNtrPJcVXWcPqtnQeJhel ztdIzU0dD41XMs4XF7iCWjJOIuOic6Ose2WDLOtyqcRY9irbwyJI8UTDvwYpx3lkFFKRJT3Wer+N 8gUABN+V/BdzJaQnRcUpeBMgxnNpdDifnDOLc9vVN775dvWt7/yk+v3vv0nC8RxG/Raa1dA9AGqv PEtV0rOMLYzUy1emy3iJ48ME8z2k91agBs1Uv/Ptt6r/4Zs/qm4uzDMe1hn3X6t+4aUL1Rpzdgl+ /hTzVfWOGEDc+1nooX3Pnapar+/g9X6z+kbPXvX556aqz33l5ao1fiqONqPTqSnmMwmubSLZLRjf ShY2aEfg6TjSaHP/anIMehjjrkNRfQqMZk2mzTOPlRaUJqTsqTk1tJmFgRwPvqfL3P3MNk1uA3uJ hdjsq6g+KR3rIHB9o38N1jFtc58BwUl0LYm6AbWuG3Q206jcuEA/yFaqkn/XOWfOUceA/Z3BUfbI 3F8NXg+ZpxtIhZowOjezSl7NOlEvru8Pc2AYg8hL9OKn6FRyl/6WnpboSJxhNmgZckV7vbwy42oU mecosyQGJczFI3xX24iP4L0GfH4QAC2709Flji/e9tcHneOxX3rCm09zrg8C/J76aQD4URs2bcnv jwyuH+2d9z7l+1UwLBvpe5sgXoInNJhjo5HJaz/ETleq6XGvJ92Dy/UJR/dT9V3u+wlfzH0/5jYE 7yeTM4/bTq/oB196E4/YHB5rvUx6wuTf7aqfzAwYRBptaY/FjgXSDO2L5wrnt5f3LZetd8pSqPpI yybrplCKhdTB47LOi4v9VOvfyZ1Di886YVDnZu2RKXxjN2694dIYSq+VjaeEx0p8zN+1BzszzM2l NmdcqNSEpWPduE3ky/ZQdoTi3U6YzkWmgMkcwY2IJTcJk20IyDmrfOtlwPWKZD0AsQApSYJ+lw0l GfF6sPOYJcyncoPV20JNcVECOPVrlPAjMO42EZJj3aBNJnRz8dY68FrqJTMMOo5nUw61r3i/XcBt iySTe8+eu/C1AxxCZvc5yoKdMGKaqnw3Mle1MRjviffGV/RIu9GWNDDD0GVDcSMoq71esoK9HRND KFm4kfT0WRioVL+TZ+g9y8fePdxicd7E4z5UvXjtQsLhC8is/eM/eaO6Clh7+bWr8SZ58S1Ayh5g 3V4z9G5o+sDEN8aVvFwU5aJNnCiEz8M9yxvd5j29uPK6b0H9uIVhuKrX2U2ee1213Lk7A3xhq2bK ubYt5fE6xvXE+FLZQznGQYDyKEa5bb8GV3oN7++6km72G8d109bynfdoVyvsjZPIq1G0hIHhzyLG xiz80UU4i6fPTFdXLgpWKQoiUAd0L2BwOBlVjRiDSjMEvcf+MVKhcoKGkjx++8tETikilqw+bKkb T/ibeTyE0esYksby9ps3q29849vVf/h3//PqT773I31lnBM6DqFz1SkszDOA0TdAIrNGp1zieCyT AFuqFG5Cn3kDrWWtNSBAwsqnRqeq569dql596WL1zLXz1UsvvVhdf+FKdQXt5qnJkWpmEb1vqD6G 8TUGI3NZz2VgrMisGIx6MkGPw30UwmJsqg29wbOaKNjD5gziYJzsE3KmHQHMN96e4Z5Wk9z58ktX q4ckld69P0+xkzNIFMLjh9//DmDbEX5udwIViEHupxQQ0khZw1ha5ce1JZQ6xrqAWUNQyk0kJmNI F7pN9oLQVcpesU3bWLiGbineWJUv6FfpPoUTXYDsGgb3HGNuATm+VfrbMeF6F7WU0Iu4Jtxq+8j5 IN49sLgNd36GiME08yOqI8wrfYlJAg1IMSpUr9XN9hXg4ryrQVUNqI8T1sriXjtcj78cj3hJEg/u 4ZPO2hDyDal9e1A7XLM0wluMvyTFxTmR4cBn/p83wJoA8GtobRrXfRh3NmK49YyjXsZbH1GHbWQO l6F1fOMH96v/9L/5VvXDN99FWWqLPKbh6nNXr1efe/lqde38dPXCdfTs6TuTIvtw0ljBtJSs1zZw XTrHQz1fvfrll6oxKmH+7h9/v/ru7RvV+DdIZAQZn4Krf/3ZsxiNGJH0Hz6paok5Nki/PX9xMrSL m+Q83Lt5q/ov/4v/jjyHleov/Wt/3Vagza3UWdokbcOQDZ2Df6s+lMHhWlMb8hoscVwlGlsAdFw5 2TNKRFCgXRYT3tNI0VDkfWkVLaviErWQJrQPlfBwz6gOe4bFxpSn9T4EzFJw3PtjPJWdxLGTBMUA Zz8qhuBRRMF/575wQth2Rh5qlJoxIY1II4nPDvKw7qVlnyoGl3u2+4afSyuRc8182VjnM40owD/7 kwmNrkdKXZpPVO3VIhJ1SCXjtjESPVf2p9IkgU7em7fhcXVbJ6G2MSjrkVu+ULogc9SfE5in+ax5 2/EqzSfNX75+BJMej9raL/bJ/P20133a407e5ccHrj+Z5/+nZ61bQD717Pw83Ee0YgmxWbBDvvEO IqGCmyESPHfwWm3Lb4fjOTFK0pTWudXVEhqTGiJA1TPMlNWLKjpNmK2oPKSgC15ulUPy46ZSyI9F szVMhQK0DxXidxOsPdP+TiiuHBLubVM5sWw6xYMdL2s4zcUr5UYX75mLIEmnqRrHvewAklU/EGwL DgSdseq5D7mVM5ZlZrWQL9iDGsActIEZstT1SO5xjIldLjomsO0A5kbIWB9Dw1mqjMDBZLcdw6e2 DSvMINEGPW0l3O9ihVIBx2zjIvJxBIBu+PFC0N5yeaVe6Nkeod2dgFEL4ccNXzfXEJuL3nGXoC4p IalSIHYr3gSff2+Xqozwc13d9pOBol622siFj9eppyQcziIDZg7qDgZVtIml0LDjuFF4TaXjDNlm LWWRlaIkT3dsFw8kbbPaiSYwbbwGgDIBuJdFeHiCEDjPP829QrOufvz6zZz3hecvVtc/d60aQL92 k+8mEcqHtNqcG4cjyrGk9wfAs88G2m2hDw02C6RIR5H3rmQbALsb1YsJEji3h0YBPuQfkIwrv9bk WxMdu4bQwLb6HfzmabzIkwD+MZIIR6FC9GIo2fsaCKm3wsV3MTAXKVJy/8Zs1GEEDXIM16CbTOJx nb5MBUW+b5lrox1Sh+4B/B6wua8KPHj2l/D6niHczQ3gPWcu8WM5ZH2bjodJQKr/1ivfz/gZ7IU3 n6RG2psxuGuCVxIJ++P18qeHMHo/QGRzeaX6B//g96u/9/d/B03oW9UBtI2vXzpPiH2qunj2FL8B 9IwfAVSKz3CfwkkpE3qwU2SGaywxnlcxBFahsdhvM/ws8Lmym6+//m71+hs3ExUaGR+rnqfc9Odf vcpzXa1+8WuvVCPMAelMKmus+x2uEK6/3HDm0zagVMm+XkC041nDexVZwnmMIIHrMPMl7cw1x0xm dUzh0Y1CDGPk2oVTAeI/ev1OKne+grdyBFWWmQcL1c1b0FMYD88/34f3cxTKCgouJJwPScXiufW8 mbu5gf4hGhWhbOzJQw2dQdurUKWSw1LnaDhnBediK0FpifZgHKsGxVjUU2vEY417WsZyW7I4DMbi 0vxi1rkDEz0xxBzI5hf4bEYdhjjXEM9kPYBBPpOmp7dazn7Ky+uxFiAJsONVLZzqOACYe3rRvV+P T4aA3sr62HgLj5wJAmlRiSimLOzFkeC8clVVkYl3nPvxUDPudU6QVWYUaJNkQNMuulGxMJ+jw+JY /FcihnGJ5PouDebuUOEs6jyREOWYbiK4JpZ+5/vvVL/9h69Xv//6/eoGUZTnr5ypPud8v3ia3+er CxicWQcF8iDHGKv0V5RcvG4Sq9X4JqeDMfZLX32uuoRR9/3vvFL9D//o29W3vner+o///u9Vf+PX vlD9xq+/Vv34R+iIU/RtnGhYH+tViwjIPkmkZ/oPq19/9Xz1zv2F6o+/8c3qLbjeHZOM3V98sZqa 7o0AwCLrlUmNznsjPAYedKKpk06eMM9Z2nSB/AApK0OMT6uF7lE0yYGUvcr/DxXRtT4WSVGjojE7 pU8YEWU96mCe9OkxN8LrEs7/hfYm3SbA0/NoiLnXyb2u1+h4pzVw9JsUS6vkMhSgfVR92GhFDKEa WkpFcWyUDTPjWo37OEq8fQGp0dIcUkeFWSsPAPvmEqhMMomh3gO9p4O+6MDDMTgywn7IWiifXwPa qJuOK+lJGpa1EafjJ7dSbrsA6+bf9S16V8W/Xo4pu/vxqwHQhSX+6Pv+qzk+x9VDvjnP444/cfpH /vlRjn+/8z7NZyef++R3ntQ2/xRcP03r/pyPsRTyHJ4oC1PocepUYQJC2qEyYU5yvZOsPtOjI1Xn ub3QE+SZHrBgHMCZFBW7IYqfD/XgMtK7AEkdLC5y0SyHnIUolr3sNj2QVgEscl1ZLFyXDGf5sWBX CbhMejwGhikzgWovak1RSOnx0Fbk0JUwcCnbrLwboJqfQzlm/h2vrSayHDE8aFTelAbgGrgfZQrO YhiU8PIa37kLiLIe4gjelkM2RRPT7rLArtJWvdAYegkBC4vdWAQFekNNzBoiBByOqZXd3OB5Nr2U VrSaIhnEsL73ZnKcYGYAHemuWiJLQ8ON1HMJPlww/LeSS5Gjs+V404RcxT2klvQRn5OHq6KHk9S2 yDIZFZZikESuyU1LOUgWQCMzPfFoSU/RIyOmtf/4Hh2Rf3tON6pwL9lAe5CV5BvqcSvbZrvvkETT JS+Q9jM0ryfXanuqqMyT4S6tpo922sdba1v14g4cR2rtIqD0z/3/2fuvIM3SJE0POxEZWmVGalVZ urpk6+5qPTM90zuzuxgMF1hgQeOS4AUueEfe03hBM96RRqMZaQSMBGyBJYE1ECuwOztqW0xPa1XV pbXMrNQytI7k87z+ncionKru6t4ZELSpyIqKiP8//xGfcH/d/XX3LzzcHUPplh4o4OLcbXJOjZ8x kxQ1vAT1NugA/JlPoOd/Ha/gBqXw0jKd5+PWuhk/jxGku/oygHFR6oK0EhOEpN4wVvsB+AcAabMm x/HTcmqCl0FzMgy/MhbrttuWQ6uxZWgfAGct62WMSD1TrrH7CGXfe8/JKEDHwfvUa3KNe7REo4bp AXjMJ2hvbtMeCwvoZTe0rJfK0mtTAHox6HUAzTg0j0miANKwBuFaOsaGj7fscAg4XsNYsLnGFNzd acZzlfF48icvdP+v//Jfd9/Ca30EQ/cPPnF39+gRjAXOIwVnL2OdJjDuKcFca05hN01rELtGBaBX Sa5M10G54HjqX4B2Mcz8eb+21RZ7zZODcRqu7Btnz3Xf+f4TAOz7sscefvhevPOWz7MuL+dNW+2K SDmtXt4dr/d2lTkxEmKSlzLC9bU6V9Qf+e0mpOmhO0zypwm5L79ytqI8APOnn3uTCguj3cMf0ZN+ Kud5mcZBm5tX8Vwz1uSpGHVY4hoHMZw0Pi5AQfLq8nL1HE8QJdpeG2bsrBJVXmmjP0bpBNC+prfO BC554dK99BbeCqFbEnKbChhmXrAsARsBJ44jRs8oRqb37/PpjVxj/ZkYN8l+t3KT33pUBX/ryNUl QL/c7T24NaUp5LsZlanjHvRtnoa0HsE1kRj3tPcaL3cBr91f2dG7XovMbFxb/QuG6QWzUeaCePMa mswwOTENczAEZw5Y/cYkbe4v91AOAu+wB3hGWYzYaAAP63XmeMdD3vy/+Ytnuv/2z5/qVgFgH6G5 1L/z+Ye7r3350STujlnFKC3aMXZCAzOJmnMUwks9/DIWcEwwN/N4S8fYY3dAH7vr2OPdR+871v0f /6//svsjQPbTL8x2X/rEvYnOWGZzY4QkexEySmSBbqru3wcOUZ1jeLZ7683Xu+effLn7f/+Xf47X e7T7/Gcx1IiWjOo44PwJSGjLMD4TlDH138Ya3zy3Dggr21wmirIGdWob/bcHw2RYg0JvvqQQgO1W mqJVRFUHxDpl9TY2KdfK2A7iBeaBaaplCVXG00iHLm2Ni3gSChPb/MyhKEdSGUMFhJunOWFD4WiB +MxLPtvmJyC5Xxf1e3wW7fMF0is6UIRP79VzNghnwx8bDKEn7a9qEqyGmJ18R5A9VjrS+62cGpBA zibfbDpCcW20sD1OIeJS7/Xdu5TbovVPv+JdryHY+dm/lqXaXr/95+61/8sAqsf2YH33OXdfd/f5 /sf4e7kwS6b6+4fg+n+Ms7TrnkxsmyeJbNlqALHYEbJkNIv37P42SoOYTRIa5yjLs4VwGEKY2CZZ UBPwlk1engY9IyWslZ1Fi/AvQUgRAP1Tj0mzvr0eglGl1FM0qsFME7Q5dVETQlQQMzYhXKQ16QyV ILinec1Txqx5z3WxhDecbxM6amVWmSnvxcCc3nHrOFe6pEpvDS+kiZt0q+7OA6gvUnrtHcq6zQFA hvCkyKWVX+tCt7TSIcCiDURW4OH62dShReiovFXq+3jPDo3pdJh2ynWPhvsNNQq4UjoJIBEQrKfC ckpWdEBpG3JcJPS8oucSIDZD2TpFhV4vIw4pgRYeK9UUGJNVOoF5DRvG2Jp5SgqBIX+bbkhrMHEO 5a/HeG6e56IqjLVm/baDwh4oBHqoTDCaxhM/S7mrgyQiHoYDa/KdoPUa3scbi/MobDikhLmnqWG9 tgb4psPcAcbDZoGW5lvDc74sKKFyj52Qj+IBfeDuo3h0D2f85vG4ruIB9H5dU3ojB/qa40YXmA9b DGsgWKXBZ12kS9g1PGIDgGK94zOUtrqJwl7mnqx4YvLYif2z3TnOrVd2gnG4A370YeYhZcdMLNIr pK2VyhAV9dDTLY4wMWvV6iEoqv14gAfmaHXPuaULSDHaB0h3vjbVJPynEpeaco2ER5fYcbzh99Gd z1KDgm6pBnNyrZnHQ4TB9+thsy43rx1gPKzyYiUYqSFrazbXwHhi7o0kJMJBw42Dhw+SfEgN6Odf 6f7kT3/U/Su81mffPN999sF7uo995K7ub3/8ju4EbaFvsresRKFHPeFl95aAygRuzmm9/Wm7LAYY kgyOkWGCq2B5Ea/7KOO6n7D+PKBUoClF5CAg5BBr/wbga4HQ+jNPv9j97/4PV7sH6Mz5tS8/1j36 iQfo0nkXwHhfd8M6xCRN2mhkAoVsFGUd0vs8CZUCBMP/VhnSsF1J85wCEO5x9b77JOvee7X6A9+X L13qvvVt0lUZ7y997sHuKOvrOkmrb56+3L3wElEQ+LVW7JmCZpOqHYyzzYGsny5XusRJRbWUFann rXEqDpOPKlDlOS2zOmTTIteCBizGjYZwuMktYpR630oKDJ0Vzi2tJgraSJFj6l5sSZGp8x1ir0eo DstJUIjd6iZVyaSnpVRd6yYblZuOi8Aq/7Llm3S9BTj6l3dgdua7idt3oYmSqSUL/b3EbCCVt+M9 NiNDikqYCUHSXlJZXldIS3XBP/tNyo+JeVMkDTteP/rBC3D/n+5+Cu/fXKOvPno/4PeB7hE6qh4B 5Nr1cnMNdzBRJo0D15/yKvz4bKVaA0VKaxFM7mnu8hUMv0W6Xu7r7scD/g9+//Fu/srV7gKJrX/+ nWe7+08eQgaQUMyaEuxKj9MznBwT7usgFKkvPnIflKsb3XM/ebb7T3EiPf25h7vf/Oqnuk99+m6M A2qSY7CvAoJXKUO3iscXGzVjoKNhChrHPeRgHN1n508iPsgHFnjmWo+/9JMlvjWaQg9ivdA/B6PI wglWnGKc2Mf4hLOnrUdfeTE+q5NVDXasFJI14MgzPilfl3XAMVqq6kP5EZLz4yF3aqoKlRHh6u1g xKPmqmputznul0+jNSUxsr2WyETAvFGNLOZEKu3KvO6BPMyo+pENY2nFRAQtfegGsr56ytnwOW35 eqnWrc/ndVxL3sfu79xhW9JtVfcAeXeiYtR0O/YX/fggx9z++ff7zAc51wcB8x/gtn/lQ9r2zph8 CK5/5eH7H+4Dhn7msagFDfFauq3lY6X7WrXcdUfYqnZh7nqs+hkAyhjgZBsO3Z5G7ejt47AY9UJ6 HjdSULPcs9pgsbITAuOFhD0FmaJdhYMKtkJrfZWPfC5hK0O7dVxxpdsxeU9vYs8pvgWm+9qd4UO3 40MloO60gkDrO8kicneDuhX0lNcC4KzoEcXLZLOLt+AOvkUY+oatvkn+mgVcD6QqgWW5CPHiITwK p9bKCDcAkyp3a/ruJ/nL12bw5tpiWRA9j8dQIKPjYgjLX0Ag1zE0ECt+8J3GIOHeoeC4Tjr+ARj1 KlolYgSOe9o7hzNaZagEphNQIjbxlCyvLMWLfODggW7/UfjMPNfilcvh5p55/Qw8UNqWUwbuGslC ly7OwbGnlilVDVY5t+da4VrLZLAXWQ7uNOD8BKD6ozQ++Rxtp48Tqj966lh3iMjFIMDeUmhrAH9n Ohx8gPxN+cu8sDFflS628LwKtLehbxwFgN1734luFrBuJRSTkmxCoSfMRiDO8TbOLBXSmhQGvitk awQF7yGAb/7aXNoqz1KNxE5/Ni+xnflVqAGGqqcbr91IzA1yCIw0PHDkQHfqEB5daKJTeEHH8MDI d9eKTLULnsAGN6kcgkKeI5HHqMQ08yg96iyt3TWe9GpqSDlnGlADGEjLtEq/TAlC53cSXvApEgAf oEwckxpwrad/DpBvY5NZzictxXWwiEd/hmoXMi6XoGOleRAh15SmYs27tq0oI8d5P53cLr1zofun //TPuv/+D3/YXb14pfviYw90f/fLH2d+9nUn91GajIWlcSdwlJrhGhJBaTym/jr7wCwGczOkDak0 95DEukld5gGM1SkzolDc0uClSFzimc7gyb5ke3bmdwbjb4SwsED54jkqkrxzrvuLb/+ke+jBe7v/ +H/xt7vf+Z1PdUdPHInBcOnCFQyn+YBrubRWQNELa+WRNCZyT6qskSMpy6zoUIG7p5mHcfbaNPX6 j1AO8TA1wi9dutH92befjJz64mcfiPffZk9XqEaxAb92P+PoerqGJ96uqNJQpLyYeBfRY5TeUnzW eG4VLcqmMlIjTcNunew/zqnhvAcZUCX4rF1tOUI84xgD1gJPQjGgSm7uKgavlLbUh448k88urQYK QCt3aP1/p0LZmgpD/J7EwbxW4D4J8f7M6wWsfS1ezMa9DSBuLqu8F1XR+7MKCJcTIjBVT0QAdO+4 KO+nMtKXekDVI/CGtBuU0YOaBmDhi7OWIg8EfAX+41AxIRNHg4bc5Uvz3Z9+85nun3zriXjaH8OA /v2vPNx9/tP3hIttLXu7FYZDZRMbDB9pa35WENs3vCnA6KWkOGTmElXTAXDT0pUHp7rHv/zRbp4G TH/09Z91P3/pTOhxRlUFvthGWd9DWPfWsjcqMjMz1D1Kfeax0dnuxvMYhz99ujv95jvIrbXuOHvx 6AkazfBYsxOWo4S3D8DGX5BWAGuAbjno+4iQ7MMoXLN52BwRmmGrx1hVyGoxUKpYB0vS5vhpEuMe 1sh+IkijfsZyduiePTpkrGlu/WonS3kj8YZSe6lRbiirGVeVC9Tyb0S8AbelN8Oj2MmrKShoBDYx 3N4DvWOINbrHuxCjjrCqSlXXcS3UOkkTKKOAysM01SIySCUq6SCj05ThQ88kKRPO1ZZGQcq9ip5r /Yixe+/1bjAdO60H1w0w9wC1v7Wa7fLMep7+70IRf/Vft1//V7nCX8f9fJDr99d1fD4E1x9kxP5/ cIwJCYZ7l6iGEMpBktoMc9XeNbq2BXhax1u9vkyoGJvVyiB7ERZmuIdPpiDHRRBoYuKD26JZ5DuJ hvm7PNy1zSsUFk6hAjyZ4eXxDv9Pwa9GieZzKQn2C/zGl6EUaJ7pJPf5XpLcdFi1RCWlorzrvF+A yc+oIFWKgxgHqWst8PB1ucluaFbsmsYEd3oZRXqazPTTeOyvACZ0cxnu3QQEWqJIvrklxVKakOsv WzmBc8ln9vXplqBjeNmbWzeJTMWcEnzyuFXmAA94iuUBcBGoXFFkoRnUs1nuK9xsBFrqugpA9Wjx rYdc3mCBlZUk5Aj+9lJH2i5y1y9TV/bF17snoBA8T63YeYCSIVTHM+2rQX6GRe+kzrShdMGtHm5L L65BC5Cfm256hPtfgUf5FqH6QYDLxz9xX/f4px/AY093RMCy9WGvUjbL2st69a224FwehNc87PMC WJYukdyFQjhC2a2jcIKHRgjlUwNXGtKgnSRN5gOEpc0317Y81bbdHAA2lvoywXGZ0nargFA9vo7d Pu57llCz4HcQZbyPijlTl4ehZlA2krWbOtTMx34MokMYOPvxbu3FC2Ui5iRGkY0uNAgGOEYvl/Qf 730VpbzCdQ35W4pKr6VrSNAwTUMMIwFyYE0ScpzOYoCdwUhx85yAY32M70m8XMwI98rcMM7j4Y/i tYUyko5q+oBQZBuAjFBzMLRGWDcaXIIaKxaEz44Rs4Jn/5t/9O3uG9/4UfcXf/6zlB388hcf7b74 yfvhsc52I6wDl4UNg1S6qVud7p6C5fKsr3tC5jbcdve3z80a03Po+wI6+fsDhMz3AyakU0zb5dBk RH4O3cA7L1UFr/dBIhmzM/CzLc+H0fDSK291/9l//i+67/7w6e53v/b57rOffhA++b5UyVjAcNPb 6zNrVK8iN/TQS0iQdqBOlvMvkNCTaeTA5jcj7NEZxusOEl8//6mHuudfOt29Tm3kn1POTU7ucQza WeZb+oQlIeVCuybCgdVDbnUOwYv7Q0OYpWS9+mWNNueVa0qPUrJEyugpbF47QYEyQS6/4MnqLoLV 1K236gnjK888kQ7OmefgXKESpdoIBiHXNV9iDC+qYNo5TjtzvJkakjof9/B71lHe92+bSVXiXBo1 ZZ+X0REBKXiJl725MwKkbh1jM60ktvWMgR294nGWTbRufnnyIxOVqAFUOUvkq84GI1vyrZN/YIRQ bnAsvkI9Ec2sWw1po0BvUv3nh1QF+enLZ1Kd52MP3Nl9Dc/w/fceZw2YC8LzRE7zvMrjWAEVtRvS Ww4aK7yuoeCd+LyuiXrmGbj5q9SDXkTGXAIU76NR0me+/EgM8BeePwuwRTeNScGrqhZ6rwWIRg3M n0k9Zq5zmPXyCDbv6soNHAxnu+9++7sAxeXuzruPdYfvOsx593ezJCHvNdmUPeA9DyMAlMdG15bI N5onuqOxdQzZN0iFlRvQtixjOI28HUOmb09aJYQ1ggwZYd+7dweIEk7goBpxv7HIhtgHNpVx/9v4 xeZkiVhk3hpPOupAL7YD09zAzlHQZ0USytssqK3IhoZPgesaN48pA6zWSb7ymZrKcmK1nz0SVnUi sxaRs1evIUPJCdoWyFNJRlqQlbQI6qUxlPJQQ0EZ4yF+E5TIXIZ7nf3U1Hh/G21N7gbMPcjtl2sP rHsgefv7O8t61y+/Ktj9VY+//Zof5J7e6z5/ndduv9f+7w/B9a8zmn/tn0FpEGpeSVmuUka6D/TA DAJitPzNk7MA/voSRe4pn7QXy30SL+wwtAG5YwN2nYrKsWWy7cIVwNIrpEVoaesLrABP3/68T/gI yM4KKW516Bv+FZDMG256tWwdUZUjejWY94oPW8Baj7a4gc/5LCi9JDEKjgIiy5sUD55eJTmMCjWE rd4zkw4pD04oECMBgGW5vXkAoR7rVygbd5UEpXRqIww8iMd4xVA95zxEzfO9CP1BXB7XEbieXzAx I98V4TxGl0Krh1jSb71xUb1vSy+ZCGjJLquF6A33dZWa94svO2OTds2CaoEpPwVKM5RBCme71YG1 lJ9ecJtY7Nle6Y5TRm2K0OkG8/bqsy903/zzJ7sfA6xPn74IuIMaAVXiIF5X68qajLcfj+heOMEB mvH26M2oxBfH1CRLPapXKXf19luXu58Q7n2N7PvnKKv13BMvd7/7W5/sPvdbnya570jG+CKVOpbx Ypswp9d+mvJp8iUnGO/58/PxAh0m6/8ASXd6ZL3QGJ7alCUEGMlL3xqBjsB4bfJMSQqSNsSYmUxp O2nrUbsyZgCdJiSO23IcIGjC3kHqSB8E5L5GZ7zz83Yc3OiOAASPU3nCLm6OvR5Pm/VYMlBQbZWQ eK/NEUDJaaysJJmwkuHWoHosoFQHmEuT6vYTAreEXfimPNfV68vdG+cud5egDx3EO34fgGIWT/Ka XnbeX5L3j7bR07+XhNYR+etSgzTELBPI79b6timKuQ/z0C4kKE1RcnMv7jN//+53n+z+0T/6w+61 l9/oTnH93/7sg91vfPZ+5nI8FASfxaRjc5UEFXr5TS4LuHafhcJkeTUmNV4pAEgrH6pRkXrQcvAF eIBrAznnGVNSK7v7j+zt7oTLffzaVPcG9aYvQPtYJnxu+/GjrKd9hNzniCK88uqbfJ/uXnnhne7z n3us+4N/94vdl7/0iQDPC+cvwcPHi9y4rd5vTAjpGdyg85KSiu7J7IOqnysw03hdxwizAojUnAuX rnZPPMMYPnQnhpr7gZA+0Y+Z6eU0FhEwC7I0ckWsOug1al3Q7tuAx90Aw3cEKg2UyDEdN+GYMbAc qYZV5po1MgYfdUMQbfk6qz80z186o8pf1tPIB6W8uMfHwrfu25r3AJoLJpehSq2m4p9NWKQrte+8 nvi6AKoxY5vI7GtaB1wFWNd3JrqPw0eE3oIvBQSKLlBNt/r3iyJS1bN6rzZGBejJzqdSagtcW8Gk qlPE38G59zA343iM13FCfPPbz3b//OtPdW8gLx+iFvW/+zufhtP8EUraMv7hawvG1Rs+unklPJ/G D/dt2/R6xqJD+FUknfbFx8yXGEc+WMry6juXkiB7hIYyX/rqR6mTvbc7d/Za6BnOrQagCaJSw6Ra rbP/4oHlGkBBmkgxryenu7cvk7R+7k2Sgq90h48d7048eGc3cYgI0F2nus/pOEBuOISzyJe9e4fx zK+EsrUBzU2jWuNJHbVK9MlmUIptAeeQ5enQCZvowS2A9QbG5005+aFUmpBt9Faqo3NvhRY87Cav mxAbWo56VKcVa8IYcKIitT5vAboeQJdBVFEMP+kE1bjVcnbR9FC15i1atX/PeYnXuuYoa4r1u8Q9 X7u8TKUeIpJ7yFOhqc/gGHkZJL6uYnQtsP4PHMDRRnUWz9cXZevxeZzvfutX2rle/dpUy635zcrc ue3dZsC7jvkgYPaXAebd7/+yY9918b/mPz7Is902jLmjD8H1X/PE/KqnR32Z5kOiRnn2sjvY1OUt gWu1SfiaXWE4dxt3z8gwgA/BtpeW6VIY1lfZcHqWtEzd2ApGrPc9LYytDzhiMuC630o9Bb9CvkXB CIIMBcWjLIXkfexY0z3Q1gqOZ7stwQgmP9e+BQwqCIVEXiuhl6olChN/x3NR7prKjk7FELlzAlgU /qIgMmFggDV/20r+DEDxEiBtAyE4QtLgICDQAv86xU2eNDFHgOxprR6goNy/bxgAbJm94rSm+YRV FOSA6tEGKJjcKAiwLJzATk+1AF9DIUlmcva4UT+7LO9VzzFDYxKp5dcM91e9YrvQVVtyvXPjlpAD vK0uUeoO7+Y3v/mz7smnXg1v/pPUWb4Db+opasvux4Mrh9bSZ3Y68zmSVGO4HqGpIWBCn3M9xLED APANsvzvhg5y4thsd+bcFUD228nQX4Q2cB0qxN/6O5/tpqA72MHLxB85rVYkyLgzqBOE2+Uoc/qs McGEA1TJlXhEVKA24wGMqLR05FueTbdKKoExAHobU1+cc04BjiescaynmXkUPA1yjX080+EjeJTO vEPZrYV4Vk5IB8HLOQ5HUJ6jPHS9unZ1zD22NZpkSu5bL2U8koz5AqFcDQs9X97nXowrG7ZYYcYq H1KaLtsiGMqOz3Xs6Cz1mvcnGcxay1TbCq3ADn37AM/uoSTAsV7UcHLsVWgaTILQa/LPMXg1QI7i Qbty9kL3b77+o+6P/+R73ZtvnusepCTe73/pke5TD52ieQ016K1MITWJNbdJ8tUq19QLrKoibSLP IxXD2tarzK9JsI5fKEXSD7i2pQw9TmBnWTa5wwI9KZ7jTMQY1Ax519eXqAwDyNnLOI9T9mUTer60 GUumjWHYHBqAlsEevHDuYvfHfwSPn2omeroeuPdYd5R1d52SdZfJWzCB0TKUyptVDCZRQF/OMnxo POwmWlpDP3QNxnAM+aOneun+O7rX8Vxex3Cyy5+fvZPxtkW89I8tPMIanFVSU35rfVYebKhqAZ+F LQrGvVtl+TnHwQidvNoVuOKBqFxHYKlccyxSV0h52dqNa2zZ8KNgYUFD5YHfcpLlz+utller57pP RhRApVJP++6Bcs+9Lu9kiS6/6keBan8WP1m52X4pDgmvVXSiPlu0PI8syZt3Ar7ybM3T2MfsPcpE w7ROF0Byb6kGoSuFZ9BAsVmPVB+bS53B6H7iuXe6596+GAfEZ6gA9Mgjd1AlCNmR5FWfNzFOLlj3 aeJlcktCzXOf19xIZ7kFvwpQmjcgbUyRMXtkOudYT/Uj5CnzdA/VR2Ywns+/faUoQqxvo5M3Edfp OaAzRANSYxddY8uMR07OsAYHutcuX2Vds4e2oaZRxeb6GZwIGMpXaV50hDU7gZx+8AHq1A8f5V5d t5T/wzExblWiFQznOWWz51del5MnXVIZvw0M8z2ub9azHRjFmc5DKsSY4dySZQf0WvN9Ex0aSpSd hDVkOK/1rF13TnSoQZmwBoIF4P1KyJxX3ZIegvdO7eLYtNW+s5BqnNvq7unbuUbJBeYX2sck8mkc GuIoZUyNZBhpVC7eBGRbVca+XtqAntZ9mgohbTn6vAGw/TqrJZyv9hi7Xqljf1XAe/vxvwyk7n7/ ve6hv6Ffdh89qnnXA/w1/tHf9+33/CG4/msc9F/11MW+JGEKzRtjVSWUBiFVBi11PKkp7fI3VD+O MLEShvp6bJztYmfGDfm1QZgBTuWF5jPhX+uJKi9xcSelibi7ikudi+oSEvhmU97KrC5FYJjqFuCP YuD8qRrSg2sBuNcN1aM0Tz5jY4wWlhXA6JHvgXWBvAp/Fw0EAKUy1mvNe/NIiYXWxv4CwOcdgMAF OH4mEA5TimhIYB0BqHqyZTRgKMl11gkuadGD7Rgl/B0hL8dTTzoH6FHTkzhmNzPrueqtUFl7TxoM CFDvTU/ZAEpgA0G2goDWGzOlxzNh/F6blsGRhivclx7zfSSzLV670j35sxe6f/bffqt7+bXzgJqZ 7re/9NHu8Y/fHx6qXluTtgIU5HVz65t6jlwDnE8FJ+0kdXEdZ8sxARxMLJu841A6+VlN4967j3ff +slL3c+ff6v7o3/9wzT/+PQXHumO4cGextOjcNrAI2sSppQAqRmC5BuAwXmbEvDt9UcAq1YkqTl3 HTXvmeBWCkLj5qpMr/GZRQDtBOM3SVWWUZPXDEPq3dbQ47n2Us7t2NrBbuZlE4/wDAOoT+KNEoDt TYtyPLwo5GHGf48Jb0lkreZBNkiQr+xPQeYqwNqIhCUYR5mbaZIOBXFmzUtBsMPcHBxs2zRbdvAA VS5OniDhk6YydrjUI72Jwqw22lBeTJZzDXFulZR81TH22DAg0nVi98RlvLvTRBIOAa5dKz/66XPd /+0//WfhLz8Eh/W3CbV/5XMfwUACpBNmlgRhMqzRppuG8Vkjgjn3ZmgOAiVr8Ea/sr60Z12Ngh3D 0R6TDjO8YeMagQ7PJt3oAN5qvembgIXLJLrayW8CQfCwiais/dcuUX8aT/KVeTm+nJ/wufvVBjOX KE33dYwCDYx/8Pe+2v0unszJY6wLpur8hcuEnPH+cY+CHcWDkYm0t29Gplxq23DehH7mPtlPREJv t2BqiQpFb7x9jkY5dGXkfEaJjhLOj2HKmNtUx+sKI/uciHkrleDW30kcjMIv2VHfyqceeJcqSxdV ztl72+XEpnMvIEoer81TUkHa5SdI1nuoHA2dA8PEGvjsJT2TlTuht7a8jMmnEFCb9NwiBoka5Pf+ u7jX285rw0YpFNHAVe+t1gPa8HI5K3raSOrSK5tKTvb55D2ESUt4/yl7PM7PuQ6MHrD2TQT0XFvh R/Op6Ar+Zt3usVwi9//OWySafue57oU3zkaGfZRcii995iPd0Tv2Cw1j8Axasi/g0LEyCll7PUnY vce91WB2Dopf3m7de+K1NeZvD5HC2X2ziVCmeg/RkiGbKWFQT2DUD0Fb2Fw/n6Y4Wyx067j3TYus 3Vz9FgDI3Neo3Ywnb3ZXqFYjbYsaMggAIivc39uXzhIheisdSK1YdA+UkYdI1p0mqiZt7ROP3EXD JauFsG+QiwcxcocoVzSHV3s5HGwMCuupa1SHjqQBakWhRucxokoOyrbRC3SqTxvXUeapHEKJLuhc EKEmKdmIQ/Mwex7mtu/TEAOsz9RPya3bIKLnM2QQ3nZbKg1kl0oufV2RkALuoyM00SKatr0+0B08 cbQ7QlOpQerUbzGHk8iOGccS4yZV/bz/so9Kp7vsgsA92c5lK+LRvm4H0rtB7/sB2/cCzruP/UVg efd13+s8vt+f639o4HxrVH6137zPD8H1rzZmf21Hq8i2BpYQQobhquxaQrBSKbI5EZo4X6anpTMg FIcqtG+1ipsIjS1KCgn6DH0FDFqvOr4QBYG7DIDt5tYybwKip3akBrUiJCCqQHZ5U5TpDSDHRO+V gFqkQHYvbPSDR8fkc2Wzx7r3dwSCyjWZ/Qh0fw+Xu5XjkyNX4LrKSlUZMltdNOMi3kqS6xC05/FY vwM4WIZaMazwRsgMww9eAxRto+xnEaZSA6w3egWPpQl/h+D9HsZza+gytXKXmwdQYwVhqKLVmy1w VcR6X+uMnyWgVvSwAVYsO+ZT6QHZpPaq8lUgZOLdQbwoJhsukDE/OUn3w3g7rDe7TVgebivh2def fqr7yV/8GA/nxSTN/cP/8De6Rx+4ozsGuPT6ateUH3YdAF5u4s2rdrcl9FX0QwJry9KhNOQcJuwt MnPMGEKNL5t2PP44LbJRpJ8hmej5197pvkFY+EfPvtH91m99jOz7h7rDCGQTQ+VHB+AAivTMzhMm naMW9DLVPobw4o/g6TLBTcqHzz6+gTfMiAL35uveMxCnO31+sTuL1xMoTtUSWmUD8lNjnUWkoWIk YANlNQwf+AA1jw9KF5EqAQ9ydnYCusZeuNYkMfIo1m6NF9H1Fud4GZfrzP0aSntbjiavXYdqYMMS AfckUYNhPNdqO5evVV7Mnr9Cwt5ZvFzbbJxTlKQ7hKJ3eSZmIwhnTXmsY7CC983a72OWVUtVGDEw 887cLNjyHRBzmIogeqFfeunN7lvf/En39T/9AQbJQvfpTz7Qfe1xmmncc5SkKBrW2PCFdWadaVt0 rxstGMIAIxIhTSkcZte7HFvzpKAoTRgiN0JDx0N32h4oJfH8m5TJPFsezfWwjqfeai2zR/ey9/DO AWxuSoVgzR1jfBYwKJbZY3ewriz5d/bqZHeaxlJvt9JnRiAOzsymjfuff/vH3Q2A+VW+v4BhcOrk wQCrc3gHl1gLdsPsQVa6mBq9sToKYz41qRfPiM8wvH7mk2jFErkAGjDOz6WL1wDYl1MCbou1egRP 6UP3HGG+p7tVXrexidQM5ZctuAUzAqS+RrRSJMa40RHLACpfmCcjRXPQgFyDdtNUTk5ybc+1Trac RpsRgk0b4JjMZZHklogp2BdySxEZo6yiPHrtYfersjWgSBAuhjV3V2e3mEcPraBb4KpHvP1MFZWA 6TI6NebLJG7Cs8pJ5Cs2QqRiyced4kx5vSI0lbzWYEjzhJafvWSwANj1bb3pKmHJ/Sdxmqum5ENx eo3CIS26n/zk9e6ffOPn3Xn2wUfuONz9O1/7ZPfIY3diwLKP7eBoHWs94/FY+9BNY3CtQfWOd9bK uIWtUvivLAjvKluUY2zLrrxDNqb6C+pGWokAD3GWfJET95zgA9WC/RoJuHOUeqpKJOUlT24D0dRR av1L1ZrGE30cfvSajpXrl7pVTjo2OwPVaQQqoMbqSnf6rSvdz598CgMO2hZJ0fsA8R97+E7yAI6Q /HsIzy57jjm0L8AlKifdoDjABrJMjr0dovezDvYyZ3ZPdJ9KtzTSW4YkdCFkRJKopS2lTG05q5JX 1AzAlJM1Cd8V6rCos6WKeIBg3GkJ/tZg97BdMDFoty2OtiBiVHp8VLfrpDfCypHl9UwiH2Ct76Mq 1ZEDB+hCewDju5Kzh6yigii0OZo0Lik4XjJXbb6f3mvdcPuOcVjPdOurZ420O8g5+rvfDZwLPdz6 6t/b/dqut3/hr+91/qy19zj/+53o/QD6B72HX+W4/lq3Im23Pv0huP5VRvKv6Vi9oXMo8KlJADPK N8U62FiJIOuAjnytxCqTqMqzSaiYlz1GzvEW9V21s+W7JRlQnpkiO+F7PdRlNcf+LVldSzbKqwfL Pf/Zlru1sRXa5RHmmGZJ95nsO0H7mNhtAzSPdX9ZP2Or3iRDpWyWVBBEiPKL20qTmLxWwtrbsgHC irxs7gFCARnmVPqAE2ct68uAoHlBFiBoFAU5CgAcsPYnAlAahiHtKbtX6lU12U5r3mRAvnVt6T3z HmzFbG1hQ8bhV+NxVWlq0NwE2Avw9VpvhF/HeEap2oiHcBsKIkqf1yYB71aQ2Fj0M5YGk1mHJ5x7 GbcdOorj8sUbNEl4rvvZj1+C8rG3+72vfrL7+McpPYVxcIVGKNfpcDeBh08uj3xWkbLloOJRAnRE Yav0madt6Q5yYVFe4UVyzwLym3piEagCUSsE3EkC0J00Ujl5cl8396c/pgvbmZRs9Lm+9jXaZFOy 7zq84Y1lgAae1mE8T6uMsV0PzTYXXA9pEOmpR2GaGLsFqNlmnSXhkuvYsVKe5Tt4bi9QBeK+owcw dqBmUM7OsTbkPAxgso71tgDdqisTeF3xOu3D06wXd5QoQ6pVSKlxcI0YyLGObmnPHJoQq9w1wRhY AcVOb4KrAJ5UBmEsUJZbAgzubZl7vIj37AYg7giA/sQxkhiZq0RM9KQzdypU13g81l7Ldcnnh4O0 3BrlxdQLLuf86PFD3TvnznV/+Mff7f7z/+e/Yo8tdZ/95EPd733p0e7xR+9AYUsgZnxMyhXEWd0i 9ZVVzrKq3UO1+ZJTEG9jefVNxo1ibsrYCgwBbt6bnzOuq1wASKpYtcTimeJzVnY5QGLhPB7nHz/x BtznBbza0IAwGJdZ99e4h1HrMJugp+Eg9YdbvQJt6ElaX9vzaAVKz7/3B1/sDh2eBSCtwpOFwuK2 b4ZA5IQA0/uK191uqiYBA9KkX6Xn/TZAZ7w7BZAThL4NNeT1t8/HoH3onsPdPXcejDE6gdExx7pR kKURFXNi11spVWke49rP+AtmHAeMJgZGO3KdiJOt42NYutZDkbE+fEU65GvvwCCP8TxGB3pHo8YM YzEh7901wKAOCfKMFGXPKRd7t0TzZPvcOgsUk72cywIpKOBnQqPTCG7j03erzfuC7wbQe2JKnA+R we7tHlDLu7bEYMn7wtm3oEI1AKvqS17LKM6A1ECbw/AcRgQH7QLLs1mG8Nk3LnTPY1idOrC/+ySN hR6DrmRejus8BhvGepaVvg0jfNxjPLjpQuhSrTVo9KhgVYM+/Y8GFEcpMerDrJuDgmweAdSmRCmf 35B2t0H0jpyGo8ij6yQ9zr9OKUkqBcnHt/Rkho7Puw8t8Sgt4wDr3PlYtXkORvQKJUlH8CQfpVTO /oOzVbUFiuS1yxe765eIuF2/2l29NNFdu3IFQ4sOqVQq2js1RXIvcoYI2RVoaPOLCwHQRzDwjgLE D+DkkBJmMYB0CVZyJ0rijhMsV/QznRV3zUWWSKgsGpxFn9ujp7itDcuf1rqVDske9/nMpcga6+ez KbvMZcPYHt9kXmqic96o00SYW/SUsbnO/r7BXh+CDmISuqg9ERXyBGDE2OwW/fZuQFrnabUF2i30 tt/tQHk3qN4NdneZBZHPvRn5QUH0rZWcR/5LX7vv472PqFd/2Xl+2fu/6Nzv994Hvbfdn/8QXP86 I/1X+Bk76l3F4ynFYcJqEO45lOco+2kfCQkDbJTQGAbc4GvdOC2rR6z9az2dbBgUuZzMMnURTChy hMGgLcENV7lJmxWs8q66m+x1OWR9EmLcsFWRJO29U2i/OGqpT50ERaRv253laTGzXQ8Cl+WmI5ja sVWM2AolKi29qxxtVQbuSTlhsxj5n5uGNbmXNRMuuZgBQNRmdwNAd42azBsIjTnu4SzA9VUEqHVT 5w3p7aHUGsBlaBQeKYJbpSrAtcYzFPQk1c0AXI+j6K15PMh4Ll7TS4siblUv9HaN4klVKJmglBJz emKlfAAM9RQLyKcAqisYKkt4PQbjhaMMGkBeob8fhWF7ecPQg4Q9J2ihPUTHr0GimPtobjPBOZ6g qce/olvZMHP8tUc+0n0Ez8o9tBof5piVK9fIVKeVvZ5uQpHWqUqfvCRLqckFV9ya/D/G0uiGNCCz 1wUXgr5KZgKgxMsm+uL1NRrsrACkACt3H53q/ld///Hu+eePdP/tH/6o+y/+L690559+ufu9v/uF 7iD3MjSO59ymKnfNdDcJxb594Xx38fRB6sYCkIh2TBNenbQ6Ad6STRp/mAik8Ca+0r1w5nJ38fIN GlNcSL3Yw/tPETkgkgB4ztozEqGSRPmO4tF33W3zvKcOneg+cccCfMqlbmwLOsKq3flQClQvGdxP qUCrj/CcAgk9+BsYBVJbst4wAG7Q3e3KjRvhlE6jQAcAF5vsFWr8dWtojLcpC/cm0Y2XLhJJIHLw 0EP3dA/SJlyDJKFtASETOclnNZT0fB/FMBBC6Qm3MYW/u0aB1iSHwdfH274M7/O/+kf/tPvH//iP 6Di32P2dLz7U/eYn6Yh4mKRTE+iIaAxaZnDfgTSqcd6WBC6C7FbvtjQw5zVhKs0idEVaa7cqFUyy bqO4BNB61ikDFr8o+12De4wmPyYmr8R7i0HFGLuurWV+CE/WQzS9mcCLr2fahM0tuP4bjOv62nTV wV7He6fxxvjO4u3TK//Siy92/xjwcp7ygf/Rf/AVahILwG2ysQ5VhzGl9KOgQy+/9d0HuMcCCVQo wcAYgCc7AkVt3z72wFUNwhEcBXjxqVTx6mtvd6+++QqA/zz5EevdH/zep0l2HYUvTxKtFCRLEwJ+ 9kIlGqek2DAROYYrAH6Fsmqh5/CCvPlrc+w71iNksHgBJ/DcahjLQV9ALly8bsk1xhNw55qwak0q JGiECaT5YwZDPOUaMXgmId2PsUenMPppFojjAr4/+1jD1mOdg5QqbDz5cs85FzYWMbpXwGaUfS+d a4swfVEnCgCYLF3VPmzChDMgvO9GuUiptrbHldGxpPyUHt2SqYkwNihRrASveZMmS8g5QOk1knXX F7e62WOkthIFskTdOIbLtYXt7pWn3+yepAOjCv5+bx4OAAD/9ElEQVT3SWD99/7Wp7ojAOstIj6W 3Uub78FKLoxXfYfioIHpa+1+IhsLgNf9alz5o3zq/s8uke4UjdxRrpGKKXKZ8+wIZDLSBxmjgycn u4+P34MuWeqeePJSqnkMQHFIhFbjjbFeYC9Yglbjc5AqH/uYmMPTVR1qlSjUDfITZkhmNNH6Tgz1 7uR+npfIEmMzNEouyiBREDjaK8vXkBvI/QW7XJKDAeVN2XOcknX3TNDsiDE8Osr6YG3YDMdy57Y9 37IkIX+YRO/m3YOfQFvbfdtHHop77lwXRcT9uKVx2XubdYgJPZuL2Gk1MmMn3eoJUV9JEEVel72t ZxvvuREXMMEQlU2k1dgIzIhWKoWBD6y2ch65eQknzjDJzeP8nGR/TgisrQdGZ0oeKTIaEZR5i/Hn 9bgfbyme5hJDmft41ts9+Z7E0x5Mlk/+vQFtjcK7zK52lvqxG+T2x+0+4L1A8PuB2N2vV+X6W/e4 +1q7DYDdhsG7bmzXH7ff43sd91733h+3+75u//1DcP1+o/4/wOvW111AOe3B0p2xLbDgA76nAFTA PCyYQACa/TRkLWk2sQkZCRUlZO4HerdDXA9FIWkVOkoq1gYquoc0g+Ypice6PM7xkpTjqbzYCoDe w6Z1LnxtXOygy4QQm+s5K9stWNfKZ6V9tEoSfaJH6qb2lU9yO+V50pOaCgG8Nwe1Yx6PyzrnN5S/ ABg/Q23kt67c6M5b79lmJoCCtHpFcuittOyWln0lV6H4kzDJcyJcqoxWGRdbAmaETbpO6vWwUkG8 8yXYwkHv63TzeCr18l5WCTH5r0t4am0jvcZ9jeMaMEFIADsOpzrUAgCKCnAWWsogoPB7f/pE953v Pkty2Ur3+Yfu6D79sbu6/fBPh61CAW/SklpSD/ageMpIcQLafLVdnx+Gq/VyqnQALNZvrqCtw+5v fKnQ9Ixw3+EnA4ZVhJsooylee5QqGeceu6f74ROvdN/71s8xFta7f/C/+fe7YyRCWl/8JJSAjz5y qjuDQn76mde7KT47dT8DZom4ZDq6rGiIAy91BCrHnuXh7iy83pfeOt8NwuM9ChVkL5QUk0BNeFOS j8IDlD+8gtd6jw10UtKQqiF4je49dbg7d+F6aBiCRhNH9bjptiuPvZ4k5jFGZHl4XWCub6uvGO3R w7wPbvcQ7pot1vWSVSIYpxs822UriNj1kfq6VohR4ZuEmWZErgFVGyetJtvVlMSxlCowgdfNzpZz eLrmAPLH8ZaZQPWdb/+o+5M/+m53iUTGhzCQPkVHwuOWSTSiIcXJNc09DYTWIkffKZU6Y9e3+KKa VtAzWN7QnYYSrlnuy5bSoQa4/HYBmAJpUqzcfpzLTnryimkKlAZMAm+8wnecOsjrXffmmUvUFSd/ g30rHeoQ9Ck7cs4jb6z/m8RK/rZ85Bpr9dXX36ASyjIJpzPdbzz+YD43T71glX8S/uJRa2UC9dC7 L7iQkSV3v5VVpokM7GOst6WoMQZWC1lcOIgX/BIUnrnu2Rfe7D7GPjhFJQm92bnnnvvMPc+RIGz6 hQmUUjVWQDg+t1UlHM9lkjvXBKxBCq4Rvc9SgaRr2YRJY0MPn2vVOTWmFyhRnud4i3nmeKytjGGz GtaCFTLcQo6xsreh4x2ZWNLtti9RSXspe9McluLehtLkWu3lapLQCjxlHhvo9s5SmaI2co9d/9LF ir/rvNf5DSnoEPBzMhiMsOkxN+9DWXSWkp7/5ntUIaI6yLGJaRJtj3Z3w03W8WJOhvS5bYzVbYya UIq8fpZmrbteJ+T393NLBnHUm3HECEYd00ZAT/J689a7Z5VDJlqa83D0OFVsXid6MUejrBVKUmKQ pr45umCIZLwN9rJyV8eHHP2ZjbFunoVhOdUFquGomqYmSOq0uhAOkGXqWK/ZbZeb3cOgjENTmSQS lwRckSbjsx+D0W6sd1Pj/W5qcR+01joPuqaDItQhPeGuZOWQMsJ9a4WmGucmZTNQfZm9OJQybnVM v2fzM8PofNW4mAgpx72n/tTH2oGqU49OuMA8G+/HJS5dpiU0N06847SAMbDEuUaghy4jW1coRWuO xB7an0teLDSMQwwVgA8o6rmJ3sgG13roKu1n096Zwn66e6CYaW7f/R7o36snq+Vy+2v9e7t/vheY rtGrrw9yjvc67y+6Vr+cdx/zV3mdX3Q/H4LrDzpbf8XHbeM5Xl+Zg6MJFURlks1teTNDSgJmBD+7 46YhZbyFJjOFO2VIPqGrppg5rmqnKqSbpzhIRLAQiZzXFXDJLu+TFP07QLnqv+Y7x/tadSpLxEqv gqFbP1dogfP04bMSOdI3ympXOfFKnxSp0hcMcCKT31Kirgkklbe1pfVcWXnDjPE1hFtqiiJk9Bar JF47f6E7a/KiyTe8J11BvmFl8fcgWeFR3p/qmsZFpUvwQ8949FHzzJgE1BwPisSiWhjas74tB8eS 1+kgh5DX10iknATAyce2fbbl3wRg++D/jQMmbFhhaS8Rhp5IucQaIk///JXu6zRtsHbuV3/7493H oWlYW9thWrZToGCseSsUwrbnNZKQmqUBV7F6Ymj1Ek8jIvLYMe2lUbwkJSx7QZIQLy9azm2Le7Me 9hDe4C/SPU9a0b/+5pPdt3/0QnfgG/d0f+/vfTkAZT/NGh577K7wrc/DgT2LQbMPcDRpAihjnyYj 3JceIhMeL5y/1j3/1rnuLYDTffvpwmi7cpRajCVAkkmJ43RmTEhfpRmnXSXmznAtKStWNpAa4nzp IbVr307CmPMZEOJWMDnU+sS2y4Zrq0cTZWOVE5sEObnLeCxvzDGuzNkNEjUXAPz7Cf96HXnSa3IQ mYuRVmPX1N5114pdOJ1rE1tZp6PwPIc0YKLscIZDVxnDkHvx+de6//5ffKs7f/Zy98j9d3ZfffyR 7r67CFFjSJmA5TOks5vz4U1rlBhabqqplHUDzDGEmog3YqJByJt+tjoJNsOpHVNUhFqYVitZDQWs 1rTRFoGFFVME+FIs9F7uhV8+b1UJlK9VbA7y2TX28DU81eHJYniQZQBNx7INXXcZ8HuJhj4vPv9G 98i9cqOrFbb1t2Nou2+8j8gTF5tmCd7sUHi8B6spELGB3iTvdom9KxXlKJ03LVm5xJpfoqb2DQDV 3hnaZtMRVHx/kChHwv/cqx0oU7ZSfn7K35UMUjbobdcI0MNpacAk/Ao22/5NHfTIRUGuCcuMSbv3 Cpk7z9V4a6cCSPi+4XSUcer8ZA4KYEeOKD8AezaY6WXLjoyJHNTR2FrRhxvOv4Yicj5BsHZMQ+KJ 8fUXQq4H2Lrdi/uX5w0pqkWuIrxyfK3H0LGYZ/nwdt6zpOkyRvroGICbteu9nz57pfvBs68mb+Xx R+7p7jp1NNSvFaIaOmjExHmeCMX29Z7IJxeuG9wNfXZoIiWc8gw7lsatE9azKm/Za/LE+XscKt8h WqXfR9L18y+ehqqxHKqce1DKj2WZ4+zhh69NEkmYdk2b4E5kaJUBWoLCFC8vWbXS78bw9ianJ/pK w5kEZSI+xKCicyZ4/26M/+PI7JPs1yNyJrgvKU1yvW1uBB08ayC2gXvZHBdBtqeMnrw1qbtlcP+M /XaOZz9D4JpSltfyyjJLYfL3+dJ45WCT4K2wZEObAZw55rb0DdfUK75n5Szl2R489+qf5F0YXTaH A9K1+Rcavuk0Xyq+1pzP0mayTM6a1d2Aul8R7zHrfwn8tlO+/zPteqct835kdgB7f0i/0j7Iyfrr vtf1+/NEJ36Ak/0qz/ABTrdziNf+EFz/KiP2V3WsGd6rV7sR6mXF+4SbVXEibxqkxt8CWPczytHE RGt0CUudMRVGXCooiux5D2y86oBnv6VrFJhWOIcz7TWzwv2s3t1WV9crt2oUScDQA6Oy99D2e9FC GtfP98LhrvBmLp1W594bnzcL3HB+PluVDVTOtqBNCTi5p3xuzRJtACKTr7TOvblt69cS0l7Ck/o2 vLIX3znfvX3xEskvJFcRBpyQWgCw3RDEm3ySclrFx6z6wZVwlKYICJcoX+6r/+539E6pLZ+xjYkK NF0wPd4hijRS8FYVE0k0UkEsc2RZvX2GZrmXVUDcIl6gCUDaodnZ8Ddfe/Gt7s/+9Kd573d/52Pd 5z//UDfNva7hdbFsld4UueByptOlrzdOFK8aOYYYe62bGypJkfes3uH89dLK1/N3fSaBDEEI62Ri mHAx4Mkyfiqck6cOAaQHu4sA4288+XL359/4SffwPZSyooTaNNSIk1QcOQdgfBOD4k0S0kyiu4/W xdZf3saJbbKhYOvcG9e7p154o3v13AWW6wYgbB/gWP6fVBWjKxiL3ocGY7yrKCqAWuhBPI687KN4 L2/ApdSD6ZodmyApEQ9++J4NfCZntkU1bHduItc1GgctALDHUZgmShq238I1swVlynPZFvwsvM4b VOuw+cQ9AMV9JLTKYc7kary5PgQqKn8jGBgFhtmNblidhaIgzKNNJ0a6EwCT8yT4/Rf/6F91//Jf fY/W6fu7v/WFj3Vf/sQ9qQpiSbphG4skElQALlC4kGiBtsZNzfUbaNt5LdvReWNNazBamcOQuOHi mH+eR8HjayhNBnaLWvZ6wkdR1uvDGJ2MsfWIfUS9zOPw3PffhMZiS3CeSYAtyFvenOymFqczB5as TNtnrjA2RhnJMcZv9Ur3LLXS74QS9JuUFDxMFZBLl21Zz/UE14HT5SWNRErEgX3DCZdY6+6VKegp JlNdwkizKcoktKkxIhijRBcsh2d1YDnPLldzJ6ZpGGTUzsZANsRK508+7zEadHqkV5AH8wCqVaN5 jM9oDOkCwBrP1rleQ4ZJJwgPlvGzeZCeay/kuLkG9YhrJKeNulVc0iilCislSVHw3eRHIld9NKhf O03+B1y5bZ07JydrXeCrWC4g2pcHDBAXYPMvnOgIo4ZqHNFodxNSednoXjwa/ZYvbnTWU0M7vm2N 9nGeacAGWTyjxou1mKf2QZnBSHnrnSvd6xjHxzBcPo3BfAclOtUpN9UtzIncZo1tL16Rkw8CQ9pd 7XCG+/tqskrR+ZeQShsLZI41+TUMrG5knfn7Hj7VnYO+dfX185EpQ3Ktk1DISKW1Ap9lcmyiNbVF mc214kdu4nRZZD1rMDkJ1nOfxMhWhzj/zodJ1yvIWqmOrriDGO73k0twF3kX+5EzJi5vY6BvmQRv qAS5ngYv7sPMSXPSpElP1V/vowvZt718CpCuPd0jz95obju3ybIaO43fXh5Ewzo8Ddmqs4oPJAjn KSy/Kv2zORiUJQJrO/XqlJLu6V73FMtERm38tITMW7a0IjJxz8AY1Z6oiGPVE9aWNkPlItR3Vfiq S+ZnvyT7NX7bz/bnu378KsC0v+57nacPAP0Kq3DH5Ov3Sn8vt1+nP+fue919nV/2DE1rvNdt/9LX PgTXv3SI/ooP2EBzz5/v9lAyTyCxHXAtOGVzb8FtpEa1VAqV3kC81g0kRwje8sz4mb6aU8WeylaL cNGLY6jLJZi3FIBqALd0JTDqFfTvcKdbRYZ4CvU2B0AXYAsPOQqkccyymstDnSBxs+rjYBFcGw4M sK7OjmljzvHl9K5z2DFQaoUl0lSK2eh8L3LQRSorXKJ6wSsXLnXnqWNt+F8QKsVgFEWs183wb6gD evxVMtxSymRxLVtwV83cuIvebW2rAJriqzdKBPp86YgmLy7HOGTlPRM8LONd914VsAK6GXjc8lyr igseYoSrvOUJwrKXqSP87NOvddcpAfcFSux9jEQia46vWZ/ahhd64IUY3PuwVT+kD+hxU7GmfKLh VGV67yHMrDf9Vwql/6qQpFPbxj2C2uRDHsW1ZXIURsZIOijWfFut4Yuf/EjChd+GK/297z4PSJzs 7r3/ZDdBSP/EHQe7S+eudW8RUl6XNsBnh5mr2e1pPM6T8Do3upeoePIE3d5WUey2Xp/dt695j/Gg 6WUiJKtbVc/ZkPWrAQHWlo73ijn2CXoPYrx+PIgdCR0TaVA+eyW6AZb05DBm6yhCObgmMtr+fC9z IKVAL47jt84CEnxpiN1gDamo7Q55gHKHI3jr/UyiKOFBlgGWEnO5Pvdkp0421KJRBQDINOefxaNm ze6nnnql+5M/pqQhRscXfvOT3Wco97UfAGs9db9HmEONl5SmdF32oXHnpnlCpQzo0izF6QTV5JVH uwChSbOCQBNo/bfj3WaupCwIJm0bvsdcDD4rb9pkSL2QW/DWBaQbGBdCX6t3WB3Fsdu4BsWDsdfj uw8jahOP2DzPomxYte0757He+hhh5fMYVT998tXuXtpRnzgGxWQErxhc6R37oIV9NLCTGOeSZN9k jwDybH5k4yPLpF3HELIsopSpUfijlszUYLMe+dJea8TTaY77cp9pMAuwLBe6QiUgS1MKpAe5hiUX LRMZGgvrKBVMeP6MpQadFWwCpquCiXs4HU6VE1J9oOpoHKSGu3XCpZCFLlb7aidRsf9lN96M7Xsr klBGUSGSXjHv9mhXBZFaXzES4x13adXR2cs5v5u1nSEPUxSonQp9fDYQys1Soj0IKHiMF9Pm3P1C komdLc1KneR5VmgocukKHGTm6RD0K2vfmwi/DC95i3EdVK75DHY91WNbfKsP/tXzH3qYlnvP1LTn 2nUqX8MYLJwsfc+EcnKGrOMP0D10aG/3GuB6EVA4Peh+agmVPqc6Q9qOeJTxs1zouvuY9bSMIabh ZFWYEXjSeq+tn+6qEJy7BuYXF9MF9BiRkzvIAzmEbJuUXqTe0gsuqI6+aomJOFeSVN+iuNEJPqPJ 4i1CESpS1ITroXKXysJqg1BQu1ctNc21VDIGMS5yjnKOZOSD9Py7aGPVY6AcAH44yyTH68iykhTy Ll2ESco1AZjjzPlRjq0qJ1lnmw6YRQGmmWu4+FNEEKVyS5mpNVhfjclz655vm7p+hfa0kd2LpF/7 H3zh/OUje5Db388vOuft790OxH8ZMH8vkP1X8Qy/6Pk/BNf/NqvjV/3s0lzXXXgNQTiXVs4DKIpB f1KJQQk1SHkh0/rCQc2OFHS3Qs39SlDJqlzapqwqeoJCk13aRk8stYB0y2asEHtAdiHZgDnBrxt7 B1RXibxQJRogj1c075dXJbVivWZYJ/2mLzBQdVI9r+FpudQc3xI2Qs9gG5vNvy645vPmHknnNfHH a54FgL50EVoCXpe3L1JvFxfiTZU+iU4Ca70e0hIGWstbPVLxCimE4oUpnaXVn+GK7sxANjVWgKX4 1jL0atwCqPvxbeC2aovbnm2wm8NbokdIz5ecUsv7lZdfzwieWIT+DPc3By/8uade706Tpf/I/ce7 z3/mAQTbaLd4g7bmjjdAMXWVFYrW0gYcpo45yYeCX9u+B3jpbfSe6tZL+EacG/ZVUyuAfVDnoLjz iRioLCx/ZwUTwN+GXQR4L15ZtJRKR8+cLcAf/9i93XOX57vvf/+Z7i6U3FFqN9vk5eS9h1Ph4W2S h85CIVh+/vXU1L0HoHXX2mEahCx3P3v9TPcklBBB4H44jBNcz3m8AWAbn9rsxqc1qGyAUrzvMegw 4SCnYowdzkqJxUgLulGpVLg8Xfrae37eb0G51SyWAc3zlrXjc1M20MEwnQPQoVLSGmkBJXMVD47r ay/JpgeltQAmt6RaxKhyRyTum7kchZ+6TCRBbJKmOJqahmS5H8GpVJcLcMp/8t2nuzM0R3nsrpPd Y6eOxxNmRZURPedWGdDrHG8Wp8g6bMC4rSkfR13Z3s7E9sHjovOUX6mfbs8Tmsh7aJR0C4VSppGm otaL7AIuigQeXOZ8XRoQ3uD9JAn6PAu8dv7aQjrg7eeZ11jPGroTjM1VKFfOgQaWeP86pQVfpZPj aZJVv0ILd5u8rAN+5LQHP3m/ARu137zHnmdrK2tfm7auO/vEEntSvkw6HMW7uMq9zBnC5jxWaliF Q63H0TwGZ8Zyl6N44hdJ0tMLbim01BjHAJizPbUUAGTmShpKlVfXdSRNYk0vfar8mI6lwWo9+jKI U8O6gerqFcDfHtWCRrcAUTMWYjGUd9zZ8Zk8uP5uGzNGrjNXeQ7xdDNGMd6TN9DWQ4yt2s+RT56h QjJZEL0cV16Hs59/GpeFynYM6wC6kmbKUWkykVsYIOGZc7rkG5DMfQ75qXQ7QVWNozT3UT5sYDQ6 z86X3Osk2DqHBQE/oCZrSLGNiw/gOfLUvUfbddhQY/WkqXNbmamcMVJTSCZG1hylbKOOiiX2rEaP CZ+eJrQcfmqYSSZRHhiVHDc/gBDailEK1o216k1SHsGxoXMjxq3eb85vc7B9ZPXdTVMZqxgdQEbt QUauQau6iYPAiFhFhZwL71Adp/7D4A5/vnSDeq5a0Tv/9TO1gBKhcOiabmk+j7zaK5Ps7XpfQ3HI +uNNEOzs9Tb6+Qj3b0lXz+k6LadYvyb5hBRNKEAmeFtdyG6yvr+epmXkZZnrZI4La2d9CToM0Sgr Vu0/NI7jxL1jPf8ULmGM1Cf16P3692dvx2Wvt+/aBX/5a/drv2wFeewtt9AHXG7tsH6sdn9q9/X6 +7j9Ht7LI777Ht7rmd7vWX/ZHffjlSXRvj8E179s1P6q3p+/1nWv/gyv9SWqIQA2BGiDcL/IslPY 6dlVy8er7FKOadsIt3odUxereTYComsGE9ZjE5roWIhXDzgb1GztfuM2z2Y42bvoA1XnugBzgDPv hVstuJZ37T3gTSngJmhu31Fq4vbA9/D+ih8r4PTYAtb2dpRpIdBaR5gb5rL51RpIewkBYCtz9Kgl gXP8BcDZOyjfK1TmsCujxwpEcbkBkATiabHRmju0VLQe4EcD1tJOq+Qot1vfvXjIWwJyfoYfnMog ev/K29SDht7wEKjpoVXATth50CYnHoeQNqlzRK8YzycP+aVnX+veee0c1TBmASbUk4ZbvEjoM01z nB3L9DldUlkQzvLppFVYlcExl6/tvfSCNkaBjyVoVlA3D1GqaLRnTTQiOzuLIeM/Qt1klfviNUA9 WkpvoefaMInS8CnC+SiJeI9jAPyzbz3R/emf/Rju8nj323/3szQlmO3ueeg45wCsovSefvrtUFkW +PwN7mMBkHsOT+KSCwD390X+nl22xirjRxLhxAR1ZKdoJzzCfVi/W2BhNj3Parg2wivezup8ODVh Yhxl4lRoZu4TufGZbBtuuHMNb/UiiXU3SM67RkRjkTrONouxKoc8fNeE20N+8Tm6MV6i5NYEwPte 6uoeoH623uA117n1pRnEFSufoIDHGSNBX7r4RRnb9Y45gN4yBS9Ug+Ei3S7/+//uG91TP3qWtuZ7 u888cKo7gEd1BaBqkut+qtOEliRVSzqMXmfXZ4BYr1b9WTXg9W6Hr6zObB5D95jGsnztShJwHzXI 4zg0aR2QYnRLL7frCYUqDSW1zxOq0EvKmBMl2MSbqRFqjfEDgBi9w5cpu0cpnm6ZOvqTHGOZiC2M 1sUl6mbz/CbITfBMc8zrNWg1L0Btev31s1A2MAI5vSFpubNJGs7ewkBpmkr5oTESINCAwXE4rnrU zpP06lgssK/P0ljmqWffzD56iM6QB0huu3BpIRx6m/KojPSgG5WwPrbNZmxOtCL45vH1zMuDjdxz P3Ef5oMsI1eWWTdrlppkrxbPt/JPAhAiBzBNXaOG+SOXoCLxzNKkpIj4rQfd/IMYegFp1YimEktL LjfRUiZaeUDCfQ59Wb5Njvflko0xfJu23QHXTWbVlm2yXBzH6+HEBuW4rwvMluIWtJbzRBbdPAZU qE5pvWf8UTm6ReI3td3hzrtSTmJcHmX+LaSjfLbMnd0d1xYol+fetCxLqwbShOcvx9mFmG+hrfxe CyEyyef1ev06z2uMHY6DrB13AzJ3cGygOw796GGq+Lz2+rl0d7WzAWGZyAYjkO6FVRP6WkTIRNRJ 7tuMoDmM/FUbvtidVcAoZQonlVE6PdTHWN8niTw9cuJwd5RonR57m+9IyUurd2k4GlCW23TWMifm BWnQcU0qv2ysqxeqxF6arynLbrd4Y232xkWbqT66mPfayMaQa4ZaU1UZtd0IMPu+GWvZ66oxjbOK 9GUtYEguM1bDVFpRfzifSXFirMwnSfAF9Y+05XAcDepc9sLoQnVwnpi0fCxGLOt7mMYC6sJch++w YNrtNnjxnqC6Xyv9MtgNwnfW0Xv80mvo3Z/v183uc93+0ds/5/vvB6j7z5bpW1+7QfT7Aerbj/tF z/F+791CILUXPgTXv84o/oqfuXnjSjfw/I+7m5feikIYWLdJBSKihc/LQxmNW9bqTvzP1xKrqiRB l8nOqlJJF6Da+Zw7y2oinkOgXjC9QHrzROczqujoAQW/iiivRKnn7x1PNcekfF6BNgG2v2dDtMvm hoKg2+ebB6ZqjKhvqj6tdDN5ntIRQnMDYOu5XuCc83huIyhU2ICaAUoN6TG23KCUkcF4FOTTKURL mOUpctnq6liGSIXdAzYcLQ7dkV0Zqrr3UG5UUqnwQKiuCe/iy7YEFu+bGzfk7IXGbHpi++8oOc5j uSTGL2wC3r9M45DL0CkOEBK/H97yUTh+Syi6FcplTeBF3lJw21HR0HcEmh3m+DZ8zb9UZEjWi2A0 j1LTzb2l82MAmteukol5MKMKCtNMiIK47i2NVuS027UPcKQnbQMAs4bXNxiN69vV8SHbphMytWX1 DwCQn/zsfd0haCEn7jrUzewf7S5RJ/oaymiZMobjeBEXGGOC87RO3tcdXVmivvXl7vzcQnfQ5EU0 nPMrjWcJkD2IEDexTqAp/zteN0P0Pr+CHfDkPahCRhhEEwpTcg8KgsrXBbMKgLA03gpG1+ICABGO 9ioW1yz0FNs+S/Xo3Y83AIkXaZYxT7TjzqP7Eg42kW9FWgljYk1xV8g6zSsSeeWfOQBjjo9qyKoC rIW9B2y+QicG1tEreHD/5R/9sDt/5gLefZKwjhymtOMkw04EwD3hYsaISJQntCGpSllCmby+ukdv CFe5tfcQ75lDvYDuM/d8rdM6sgBWfVXlDlu9m/kl79qyaiU6CtwP7atKC3MkD1oLfoR52YuxcQBP snXBLYdpBQQpIjcAon52kzW1SNRsFQ+3y8p8CIH1k0+91n2JjpNGPmyEU3SH2lGCcaMoGsVL5kRw XxPUFLYCjvSn/XTJW1+fBbzDlQZkm1xqw503Tp9PgvDxIzRXsiSc7dQRCHqkxwAygudZQLdr9Aq1 0wXXzpV0mD550jHMTuWYcK5NeOSZ3Us2+wkYtgpGQLEjmKrFbc/U8CYCFipZkxN68/zbKEqj9qR6 w67NmHNlDp2wksWRMbFtpPgVeOo9tzGBGWtpBMXPruTxrBdnM2DKY/r5FSa7y6sqSx1T8x43iL9r UPC3NaUVPuYFeGaLQBkJsJrGIvLTqhAHpUKQ1Jx8G/UBn1U2hJo1YQnPUiG/CHDcurPdv/VSNUqk 1ujOVzMIm67q17zyyCcziqWzAUsIOTLZ3fPgccosLnbXX18O3cNyj5ZANbI0aH1yWtyLhfvLWJd6 mgHX8NKDrX50HF0D7udhvDAz9FB/gIZPJ9nL1rMeZS2sIpN0Luhwrko5mk3lV+/lp0oxyfuMzzpV u4agWg3YcSaRr34p7Hzi1iPvBtFZJL3wboe4hY3Iqfgym/WV6zabOg4FI1HSvmKsVWJzcnOYN3NL am3h7CGSY8xU3RQaVOhEyFQMCnNFvFsdFvYPMKfH5bYkJY8xWljGe71QfR32HrC/QFZlqom022l7 5l3L8l33vXPvu5/jvRfKu17dWdO7xiDrmu8Yom2a3+tUu7bIL/WAZ5v8gvt592r9ADf+axziPXwI rn+NgfuVPnLlfNf96Fvd+huvxRO7DU1gDyHREcI1bvQITDanSSZJnAj4FSw2KZ0d1YS5C7FRPxTW fXZ8X9opPxXMfUzZDduDdj0KAaEtvBhah/9TITTeJ8dUbdVa7Nnw4TFWtYYc3nRBebfrj6E+ibGQ W57Hz6tsNg1R2bxFIMnvoYLwc4HrLoBbFxkUy2vphZme3dvdeYDmKHi29Bav040xlQK49gBgQieN VAp3YbzgKOYxOwnGoxW/YCx8Q3Bp55vxKrCaMJgc1YR7Bc5WQVGoVLWIVDTRMOD48mJLY7TUEREA a17j0RyXO8z5VVCW8RonOcYmKybb3eBeD6Ms7jx1hI51U901vJ434K/qRU0JLu5Or9gQnu7wjeUg cg2FoeAlzTPC+S7vVNkHpcALnFUIPPOT0nz96+qJAhGJEvLZZaplWHVBb9EeOHf6w1YFOXjb5aw6 voaRH6AM37//W5/q/ptv/Lh7+rnXu29/5+fdF37jMfiQs93oPupPXxvpfgcFtUKFh605Eomu07gF BTV9DIW1l3q6eFCuzM13F+HSzsqHt3waOv86XlLHelbqC6CrWt1XswULyloPd4y/rRqiV90kPsHt NqWlYoSgZPVIrdhxkDD3DWrzmqi4ajUB21VznTm6Sy5xnA1JBHNX6fp2DfDmvB/AK3/0+L54dVdc m4yOENoBMglVgKo3bAmvj940AeieoSrLZldDGwxdpLHPd3/wbPfGW2e6fRgW91Ph4Bjn3Q+PW2W3 TgJf+I9GGrK3KuoRz1yPoQXxMXhLYrg7K0Gt9nx91f7eKbXXoj+9d7joWSKCWgjyLW9CebipMRID QW5xNftxHL2DjVAO7JgnJYhKMMibExgc16EG3LyMUcjpxh1Da3zjpU9JTHMBuCcNoqERGrUQBfjB z17pHqF03vHDM+HnhvbBGtTzn+d0qXIu585GTTMYlvNbtKlmvvXsH6Bb5+yVCbppLtKJdC9Tv9U9 8fSrlP070z38AG2r7z3BvbLHDGmzt1dMZLw5QkRgPGBgHu+kkRI7Nw5z/vCrrd+vlNNQY6D7LrYa rhoJ8u/DRW/yKZSd7OkyzHtOdESVIL0B8BKT0tiUgUYClQE+YO+5rn2W9ugCs+w5N1zNb8Hk+tdc Gm3SvdfYzGWU+yWgalGJMo7r9XTxa6csxVCyK+9mmcjxN1pB2UlyEFyvg8iTJJBb0UR5a5SQ6R/H 8DiArjEaZk32DYzOPezZcPd5L/XLHT8N2R10WdcpsROhU7KogefSDHUfO2jIu896b0C1fd7PKvPK M2rUDOcI8t6ye0bwBkeBh0SgjpBEfYrKMudJnL1GFEOKiFELS3O6p0xw9TwBl8hHE1WdK73w47TQ 1KjaJFq1zpqXSjEzSqk/6ro/fOoYPGscNe6HeKyR48gcZUKaRmkMN4vF/avvSj/KSCJHapLKFUoj o77kIMDd/VyOghqnDJF3qN7r934btzZYjb5jDWsb/DQHiNfxc+oGF6f7mg8YQVGGJ4rqCRiLyALl DN/j1BGfho5mxG6JSJ50GPew1qZ0uUEjseoZZIFOC5sKDUO4NhLtXGuASK9bX82G6EbWPL8lOQ0Q V4UR0mSS6Ou8xhhpa/D9jLCdKW8S7b1+tJXfS7w8WzBCW3K73/egXr3156rdUF+9Obf777ZFcszt 5t4vuK2dt97v2frz/qL3+5O05bBjJHwIrj/IyP+6xwis/+KPu60XX6AUFUIbgDZqWTdKAg3BBdtm Y2wiTPQiC4JKoCtUmoAPK8TV7cJqQl76R7y0fMiKIFG+TeAZutVDYUjTTSqdAH5m1b1WIGjlFsg2 +SfJh4oGAWjAZYHOSC82vB5ElfYmglyPVx+urkvLjTX7vZTWpm1vDUurBOkdrJKz/fAmaHoFRbnB +Tb5XuM6SyjB65B0F2yUQGh6EgqCns/l8WkEgg1HaG4B62KZBjGrlm5QwWEHKmxnplHSCIXLNJRZ x4LXkyi/s6gxpexNbhmyRFiMhro/QeUE42+1gHT5Q2n77OMAw1Ql0OPakqviDVKRmyRl+14UlEJP L7Cl2eZvzKXMt+XOXvn5y93S+es05JjsDlBjeALJpMfaxgRTlCVLl0bOX5QTs7grdVsPSfG/fd1u kFUBIl73gJeSJvEy+RwqET34hrpVZpnzWgY+e7BavG/lxZC/PUHJKb0VqwymwnYaDrHe1RVrYOOZ mR2lBu6dx7rHH7i7+6Mnnu3+KdUwBnjWf/8ffpVWw3DI4VwP8Pkt63AjqO28aOWGm1cWulnuaxKv 0MVr17o3Ll3n+vDR989yK7YLJzw7PdOdwvgYYQzSthkgJwjLnHBOlexeAFdafDPOZsCPTbnmBGty reHn4rU8d+46dJAVjtnGC3WAsRzpLgCiLwLg9YINj0zw+zI806vpFnmEfXX33Ue7u+4/CuUGgM55 XOWGzOX9HsBYSCQg3k8VDXkO3M+E3ToFLqytFegoLzz3Zvftv3iiG+K+Hzl1svvcQ1RdODSVRhQi wSnWwYjjEsyr4i/iQFUJKWNREzPVIaJ0uY8YniVMKhjtHGrkWUaP+dcLzcTaUmnMrnesA0tBul8t WRhF7+/Z34AoDRK8zYLoVCLIHuZ91rhNWfQQygufojyXMkHP8UUaFy1qOHL9Ve57FHCmx5r6C7k2 giH3dY08ge/+8Onu8x+/t7uTttmzABY9yUtry1SqgN+Kt8z94b4atxKI8SD4qnbF0wDTW20i4TH4 rs7fOvc3OTbN0JE0SX3zN5nXL37+sW4WigKWER0liTJQKk7akrLDLpM2STEBTWMgIIlxlLbmfC6x RkYAVybDXZ8nQsRPk+UErSOUXjQJs6JdGLX8f4w5t6nThE2klAd8Ww951O6YdhABQG1itCSZrLIb AprSIVXPtKXfTLLUo5q8B4Zbj6FhuWh+EYilMjXwS62WV7oAeR+5qb3P31JImkxtmS+J0CnDsh4C aqrcnusphoUGhaCJtcGyzDq0pOQC9clNhj6CATiCPFzRscDpp/YCrmnsc+0i0R+iCwcOII/YAysY 3+sYo9vMm2tWJ4NwpgfR4dCnWkpVr4mISfS0dEicLD7fDgismu4BNvH6m0ztH307eGQyRlvqNpsj 4bpkHXjeSSIc93/0FMbyQvfs6lvdDZqFja5ItStjbt16zkRqpkxoZFyuc9/zrK1QtwCN565RGYjn P2T96mOHu4ceON4dJkoy6xwZrZNKaD5LpsIGW1TbCGVF44wH0cnC/ejA2QI8WzJ03LKiGuFGZlhH FahQ/zqu0jOcnHrOWplWfarfk5zexLLHWWWrAo3m2rAWk2eDZ1zet/kdPJvOIOW/RpJGRTUzM9LA OmTNmWDtWU1ONKr4maXR7sVXLnXn3r6YiN8DUGtu4viZZ/3bhGzWJlYYEEYL+nsXaNtozSjmiDRI nkU63SKlZV0sK6mW45Iyaboa0LgMqDJKN9MdsbXzbLeD4ZJq7/+1Gxz3v+9+zU8qEVODu/3+XoD2 g4LnnTn4Jff1ftfY/bHbn/W9PpM9suve+2f5ZePy4fu/xghsXHinW/mzP+w2X/w5m4mNOLW/Gz08 3Y2RJb1nmrZPAUFupvJoqVT2JE7nDBVHs/6n4O9DzHph2tTGs103tlNVwM3e8h/jdfaY4OoKV4ri E3ru7UZBdTO3cqoGsnNsIm7SR7gJBE7PU85hnkovFiE7eYIDdMazXGBK1mH6rrFrV+woZ3mlVkd7 QFCLZ8pQP3gHRWkInQoRSDM3uuDERiMTlPIaQgHcfY/1Pge6d94+0y3qkUQoTADETQCNqaH3V9CW 5BY7VDoQ5dlNU4243nkxQr8JQfUfY2JI2OPSzpyfekcUrr6uJ8HX9FrrJRlG+E1T3cDkEcEhT8Gd oxx4nk2K92+q0M3eVjAhwa15bctfz53qBxoedrf0Xjy310gjn0xrG01/WsdZTrZe6/IWZcP2Ge3e I576Ut7NK9+WR1F+2lLhp5QL/DPVMELQxhjLSVzBc7mOUeE8MAHUgrZb21D3CTo1XqK5yE/ePtt9 +wfPdAfv2Nc9/NjdGDIYOTQEGaH0G43xAuIGaSJzkFJagvBXTh+lHfilVNi4gJLTe2w3vWmun0Q1 6k5bks/W7sGz8Xg1D5cUIOZ/zxCGl55Xw5t2+hSI8Bm5syapqWCV8novjx9l7zCmi1YDQHEuMR83 qLN9hqQ8OZvySKegdFj2LZ5I91FAtPuqXDFy5KUDOFxGPdKi2PXE33rBLW32+qtnux/88PnuCq2j 76Iayl1HDnazGsV6zzRIrYkOwIwydUxSPrDl1Le9urNnm+y4nRLSU5R29m88VeUpy3eAWT1DklZd 6/4dI9KFLL/SsXLMKtQdU7KxyGxEsYrhvoZXOJEBPYL8nKHs3jK/myxsVYEYyeHwl6rzLvo21Mus 7e8xDtOMy8OP3EHlFdbDaZIjMSYPAGb2Abjlf8pdNzKxCDdf7vUoinzVeuSsP893AG//+QtzoQ1Z 03iBSg7XAM/WGbYu9gocfgFeVrwiTK6tnTL1LrozBHH+zJ4u30Ka8+ip1aBIVE0EJOCpsUreRTRx eVZ7Cl282DlLpFjmMNFAvawNQDWRmFWxGwBEipQo6W2kvBBudgCpc9UMrFyizaFLT7mkrKwJr2f1 RrInCqJVsq1Qu3lNndGkKWQhhJa3EecKfGtlCnM+bERO/B3VYTUKxTXHJslyTzdPxRYjCZa61GO8 tGjCLoBNI5la0AMa/hkPjYn66nnFcfK4vtpttndrL/fPoazymbOPSnbV8zkfbbDy7Boe5a2tOXLd 6fiB8oOH/S4SqY2QPXcdeY+hZHHacWTTMaJbKzhilnlN+TypscEDmxy7DFBXvhzfv7+7F/72nccP 8X0A4M0IXCZ6h6LZCnWu9lQohK6TGAnK44popryp7zG23meSzH32ltuit7mpkJoLH6t/zsx/m5+2 X3doIY5H1lQlKOoNTlMb97M+FHWZ+oc96pf7rhpCFUyL/o7crEs6HzaZuoOulJar1MPumrqOM8f2 8qN0bHStS5mZtEytMmlH35eMMgKQqjkaA8j1cqyVDKm9UPRN9UNsB2luO7qqVkBs0ayYd4Putnze 90e/vupKOyrrXb8Hh+w67+0n68/RH/d+F9t9rV92X7vf/2Xn/VXO9aHn+lcZrQ947I033uzO/rN/ 0q2//HSSncboEnf8boA1XsIhNr8JetsIlm2rURgqQiOuk+WudzaJHC63zLICuMJDUQXKAzdDL7R3 hHVbkNnwkeTxVleJNv5UmKiw4wFh4/bhyQjBOndtMj4eDd4fa3kwd1Hx0wKCm1cidBM2oAJLsLMS y1/loddqu1sSdGgd88kVrrOxvoeqBVvdpXnLdiFQBm1frkfYCiDWbtVzAhedAL4d8h6+/xRAaQIl S7trQtRbhP5MyBDgDut9wgst71NhtEyIXr7ZmBSEBhZUuiNcXyDaN5zJGEZhlODXm6viSS1rvULx HBcAtwb3GiB5iFC3lUBMErUSAw8CeIRjzHmvvnMpVSP0gMWuUUjWYFZpwDTYKFpN+LilWqKAAwBi xfRc9/pcwHcTWxWOk7teW76m95bYiIqOIG5fTRGPwOUXXKzCmVZRjAtuOcUinke92BN4MwWdy3CY 99Ie3KSiDbKe3sYj/ySt0VeJdvzetc92v/07n+lO3nmiu375ercANWNNzx7KeMzGL/y8mzk6hxf7 nedf7i5TNvEdqqWYGDkzCfBkHuYu3ug28QwryEeTVNloS9atEPTqybGlr1xg1tA6xpqpWRoZJrEt LWKoACjGGe8DeKOOwNO1/CINjhH6e7oXqMry/Omz3eV5gBvrbv8hOJZHiR7QWGbZUnPRTYxXo+UY NRAIhYLD9e1OqFGkQaRnZwav62kMjO9856nu63/xM+Ztvfv4vfd09x07lLJXDn2frKh3SW+6JcFG 5ArrXt2RzG0PBzI1kNHPW1P0Htr0WSavb4IUGojrM2u01sTOib2EDmrPy8YUclZL49rFaSEt2OHF gnHsB9YxgaQ891G8+ptELGQ7XFu5GDkypOI3yQ/KRn42vrF8eL3kTz3zSpqUOIa/93ufyBidPzfP uqmKLSpyKVM2spkj6dQkv0R+WHeG+L2vI0QorlP32ns7QI3z116nVfnFq92beN5OHp2lostojhVU CwiyFiyXpvcuwEYQbXIbRmuTg8k3yDNXJCSARDJ9mG4lw6qcZRlYhRS8m5qkSjit4fXt+m6GLacp p2TtxUpoLG9scjSCeIqGobgVV1dN/ZbMWDNbcjcXKJkScN2cJ4HCLWdiZ/9yDjvB6o0uYFuyPuKe Z7GeePIpmKs0XPG6oJ9x3Ivmq2gkmQcyw1qdl1bH569dQgYwrsrSFTy868iEQ1TpSBfdGDQNA+eZ boGluqjXVI7X2JTBWHfbG0JZnjFS+q8yWPL8OUe5ubUFNAblE/cyzJrVGgSj7NcT9xBpwov62gsX u1dp1HSTyMwxEsP34ohaWF7srhLFMiqXykRc4goRmHkiTHsnpjB+MYDZ95Osuznk1Dpc6UkTfkMJ 68evmY8m5rc9VSvIcXYsXP+qTSlWjPHaCs+K40f93EBqPXuh3QxH9GI9rpHIppb7p2/jWeA7pSCZ o1V6Inj9YfaM1a82qNmtvFMXGs3TURTZ0CwYxznda70Oe95df4guqkMj1I8HaJ/B0L1O1SerhBw4 Ml6dhBkXo6U2O0vXW+WBvPFG2ez1vffUdyMtXdOvBddrGbMasmkY6RbSfuQbsZm1t9vmKAl06+uW lrq1pm5/f/cxuz7axu/WKzuysr20+zy7P9f//n7nfa9j/ypfuyX166wfguu/ytHlXNfOvNO9/C// Rbdx5rVu/ynC2GCKSVoPj1pvFE8PSCH7M4LXBd2URBIQ3VA7gZG2a0tMRagbEI3KjLBtyrxfSU0R h2GapEMlWqN+uPFV2r3V3rjdnsJKHvGcBIC3HVLSnD+8XgmNYO5wfb2XErqC0oQ02XlbhrNMxgsn 2hArd8uGVi/PYWUv0sp4Hk/C9RUTVARVCBe8aDmeC+h9gojXreFZsYb37EEajVD+7QAC9sxbJEct zafusUrcMRqV/9xClno9DblJTRBUmyhILZZ4DBQalXxViqGeqiWKxJNcnmtBQbV5jjuphfOqikOA MMep2P3bmqvbCO+Lp6+kw6YloqL0fYQYCYwD96bHsG+0ExdL84S9G4T5+HGzRoH1YdXMvgJNVa7i 1tua0KO3V1rQz6X5dBSwIWyH3vl0jkx8bHQg1wyf1/O6wb2OQqcwqW0Tr7HlAUdHJ7q7TuzvHiQR 8zwA+xUqngyNPNUdOny4+63f+kx3c7bC6yquZZSDAN1KMMdPHOwepAPcPM1kLr1zkXJvc9RRnuwO UUVD4CDdYACtug59Rq9pFpiKSf0k190KEYBan9vEnBV41Zt0JdUDusjvNsdwjQ2N0SwCj/gw34OA 9IMkYe7B6/3WhRusK5r4UL/X80wRYTgGWLMhzjrrTY7imOfn2Q3Fp8mLoVZ5794Ea17PqxGHWTzU 8oSfefb17rs/eqa7eOlS9/BdtI12DQJM5MtXJZ8CFlWqsUL4NrFx/vv3blUK+cvqJlsr3qkG4Fyg giSNL3n4qYhjchwgLqimqRbv14YQKNjcu5Eb93QDdYIlx9y9LFhYk1/J5ktQw+oi/CLP9iD0pUt4 MQWxY0l2qmSwdhsxbmLEM0bO1yLG0WtvnO6eeOpQ9+ADJ0kmnU4pR599CY+z+0oPnAb1JpEH6WZW h9Eo0qsuz9RkRY2u4aHlVGtxzC9TReTnz5wOrWsGAGXnU42cUfjEJn5J0xJky4l358TraAKysjBr 3/3mM9pUw4oJutsKTGVuMvS7+NHZOjVDvb1iRLFX3AHQltALiCgqiOeLN7ZpzR2l3f/t9MSXUc6I Bk9qj3olZY67XieAz5AAlhNS5w6wyzXqzqQ/B8AbqddBnYonnt8IRVVe0ngY7ru5ev+8GMPMG+a5 rcQyiwF0mQQ+29cbt7HkpB9dp9LONgZhRFy7p517zTO1J+zXkYZJj7j6t/JM5Z3vvcFlXHimDFr7 4oOeT6eOl3O9mhujTMxc6SE1YmVJS7qgsncP01jqvvuOUfFkobtEUuY1kjM1FM0fcZ1pDOsosbKP MHMWYH3PyYPdR+4+TE3v2XDu5eivo2NGzWV51/045K6dMnIS52leYg23VPtxeKUlWYWEtWZDxQFL 4rTMzzhG0uDLIxNuUNKXaRE60e4vjytDNz0XlNk6n7L/3dYxjevbdZSFUrKlR7mJ5Vj/2vnNqUvO S+vYR9LmcfJKpF8tLs9FL5rQm1xNjWSuIf9+2PtiLAbzXU6gXKJdJjffXgsTqFFAsv5r+rIeoxWN XvKLGthIZu2R4mjvgPN2un4kdq+Id49PHeFr/2MFy++azl/jjw/B9a8xaO/3kYWrV7vTP/0BC3Kh O/n5h/GkwUUkSWuMzoJ7BuBYKxxcSmn+oCVZ4TI9ZEk08b3mibwlqypsqaBN0xK9zwFPBcjKinYT q/BLsaYnTYTfLavccHYK6Oe7vCIqKcFYkrHyWimxHuy5sxQMesT0vub2/F1B79/KA73DgJ49euEF 82x8a5AuIKBSHgpgPW/Gt7ue8PKUgNqi/4zJKL/vAfy4gRVo6OduHu/qCiHhoXFAFYbIGGW5RvnG ZUNokw6Ncrex9K3ykPBm6hA1Qc/zmOAypHIVoigp9MTt/CvgnPsWFABW0+0qY19JpfFMlqqLUvS4 dJDke5KKE5NyHrn/K9evdhdOX6aJygz3Uh7vhPsEvIJ6wWSTpM5d+Rx2fzVKzq6X4qlyPht4DjhQ QDtAEebl/c4zOHf9Z/Ona0BQX55YPSKRmXrCEMARgoDHTj6hIUPOOwWdx2NXUWIaCJ+g1Jw1h39I lYwnn3qD474LABvrHqBs2uEjtiu/Sjk1AC0RCCkCR48Pd1dIOjt6/HC3QHLNFeg7p6mPfZwSYCb/ CXq2CT8v8p7VHvII3rceEz2uPI/ATOMhtALOtbZG6TXbZwOwbdxjtru8XsOh2ypovqcJgU4CEo9w L8MvkqyzgKHA05r0Ng0vfJS1oTd82MRNAWvAQOOBMlb6gTSHrIm8Bn1hGi71frjY586c677z/Z/T lvmNNI95FM/8cZ5z0siEgMv58N4baErikY1O3H/RpU1Lqrj60K7vZZu6eVwiBaz9inPaPRZ0ks1U b/iBAKB6ra8Y4z3oidJoK1DNk+nN5J8Rm1oZVfdW3nqSSAVRXDtAVWPGvQfIkd/vliyQ3ZSu+1Cw nXvnGvDK/dzSwnz30589D5dzovuf/MEXu3vuOdJdYOyvUuoxnTkF1HxWj3UoHRhfcvMtqzfRgJ2R hyt4r68Q6bCCi6XUnqAayX13HqHR0p15b211vpuBhpV66M1w6L2c3lfknhileXV9bulD6f6XRLTa GuGdZ1zLqKzGPCUjs0daomLzbmQsNaCzb5sRXsc4nx5fBmDNvcmMZXBnBxamr2u3r76iSupZc4yR mwb7a3r7PRygpiFV+9fnSsKmHlef31kIjhP82R+gjrPms5okjoRQzrifjA9ea+hTJ47s756iS+Ob VC8a+QrcZLzASyRcr5mMDJB1HzomVq4qI6+t2x3g3AyFfq86kD0ADDKrZ47DR0qejo2ellTmSDmQ 8vyxPhLFkwLonzpJNAxDlYl3v0Zl74GZ7rFP3xe+/dprZwGN0Jq2bkQlRvKh225QWWSBqNT+icnu BI6XhyknevzYgeTOrLEWhhcAfzxn5KanbbIxc+RVWoKx1+wry5cHu+4j+q85o9SLvW5Jrovn06Dp jamcsK4Rvdz/6XpyLDNs5UzIvpcq6Vi7J42wEm3zuFRQ4rOu+zRHi2CoVVIjU19lUKrHSUyH+naI BllGz5bZ70aPl6DVjCPTR8lDUTcaSfG7eTMKwOe5C2ZkXAPGS/To5A7vWvFStlqumfvIONbrviZ1 JOXafYvjbZTW66T267tMm3frvvZAtz3fu199/79+0bk+6Dl2H7dr69Y4/zonaZ/bfW8fgutfcyBv /9gcSTUXXn8ZzvBAd+TTj9CAQorHEsAG63t8shuc2legB0vdCgp7UDoDcs4QBHbX0impwEkjmH52 E/fTK9ErWH7G+1HSvDh8bfU3MF1vabYWsM6mj8e6ccjyur+3AKnyI4cV5zWl9prwSJ3VllQpdzdc NWUru9GQlmWz9HzfWNzurlK9QcWgwL+Bx3EOQD0OpWLY1spY2QcPzJLcN5m/TeK4iZdaGZIM5igN PGFUhxhASMonPDA7IQsZvudkEnjW91CSy+c1wQ8Bma6PPlsPWhwWzfWY7qWESuiVtV/HFaDtw7k+ kmXaEjo09NYAccAP424DjSS44Q3Zg0I4MjNNSTqoKST6XTxzkXqxJJBQhcGKA5gIplzuWPMZd6/r gynQm3IvgKZAuyU6o4ydz3ibFVIt7MixTncJ2zYvyRySm82ZcvKa/9Jjdb0NPLlyh/VQuxbkgMtd dr6sfbwi31a6hSCU+sMLeJwpckyjmP2pLrEN4P3R82913/72z7u33rzc/c4XP9b9/t/9Qnf85BH4 fpvdNcKOI1OU5iPMbHWJjz9yfzeOK+Pt8xe7K/Cv375wtTuIEh+lW5+JjBpQEyTjWINZb7L0g3Ad naXWHl3gIjVgjsoSoRqFL2y1C3j4JkZCFdKOsmUx2Wgka01Ry5rW7W/dmaSlecK4chBbjD7RCMo9 l7DkWpaM22MoXA+Ve8F/vHYAhX4IOskSCXx/9qc/7H76k+epOLCn++Rj95LseaSb0mOOohqmLq8e 9CGubbJwQJt1GG180cMlt4vLLuusV7U1nwk9Nz5upm2XFO+pA/lMlHhRGQL4EpIu2kjqKnNua5eH FhF3kQCpPJsawFU5osCRc6m3WsBrYmRqOpM0egdr9h146i9fv5E1o4cv48HwaQSnjrqlvTh+nP3q Nc5dutr9sz/+HomHk93f/b3HKadHZRAMoDUMrZvrUH84dhqgbW30OcC443/EJj7wX63scgQjZc76 6IB+PWhybs8S5XvtjbPdJz9+T5JT9XZnT8u955/r1UiRz6MR3TsAEzFrcii5EVbGCYYoRFANiqR5 mUPBeTTiYjQX2E1ES6DcHBOxaxzzNpOVw9ID8QJEfZWR4tAWUA8od8npWbQCRcY9wuddGrpElPOl sSM4i1CtSGJNYdZG/dE/m0jKOXVulW3m5UibMe9BJEQOiDkJGNHKri1uxL/3MT/33HGgG3xis3uB EptrXGsv8nMZWeXdTR3cl/EZYa4sZ0naZ123rcdoBf9rhkiM36yJAvuVkFyyTWCdXAnXpgqsP1XE WXNpKPcErPzLHFo1ShoWHRl3DJWUJOU5+LylQB999ARrcQs5AuWBNaZTwCR1S0lexfkyiP64l0jw R+4+TnRNvYqBlTwX62DjkEEam4isTHSO+wpYAfHNZkrTMe6tZLT3WMZqej2kMyxOJdcIVYQaSs6a NTyYZMOsEaNLDp8P7HFtTfR7O+NRn3cPSrMatjyeMtrIDI4ny+WNjo7z/NUYSjkn5yIA33/uc/c3 /2Jw2Zl5C33kfkM3niI6rmHzNgnCl63qRJLvPqr0VIfHMhikTllBaHvTogLckxFW3papF9qVt1m3 XgDcY3wtcodIiUGsnKet61vLJVF07TuLj3is581+aj9znvbdTlsn/2v+6rVrf5le5N5+2duPu/3v X+U2++fsp/9DcP2rjN77HHsdTvDzz77QjW0sdMdIroBFzGI0vCrcwkOG8LMjn41d4jn21d6j5UZl zxguC7B2AxkfjPdSjSFhssJ+xdeTS6pQrs1TsrCWRHHJShiXJ6fRQkIP8EWO5Pq956dkeR2fMnT9 dwPtCUUiAOIVi8etccza7jFLWmF5nfDjxRtubK4P2FiSGzZFeJJao7N4F/ZA/dgDsLbL4gQhywGA 9foGGcoqB5NOstn1YpIpDpiagrN7EFrIKpUJ3nrjne4VqqvM37iWDoi2GrcKh/cUKofjaJkin1th IHjTU1UjUV5xn0OlFWBSoThfF5SZpZ0x1JsgCIv32HNWO2kVs2WcZEKmlBfHzlHa6tqlee4TQY7H t7zVldBYqVeOq+OvxCnFXMn3t8J7t0ROAWmn2xqnUnfjA3EOFI4+RcolKMD5z+56hM1LqJfQ9WEC yAKwW6hbIBVuP94wvP56Rcorr2cbaYhSHAfwSiWxucI2BtIYiWd34PV67B6atgCILl19pfvhz1/s LrxDUwqQ13/yn/x+98ADd3anKVN31uocGFE2Ujnx0J3dKNeW4zkHSL0AWH8baobc9D1I3tGFoW4Z T+UArKhh6u72dkVKOQp0pIikTjZUEqkg8rXjucbRTlOJxGc5ZsO1mHq5lOGiFPUhwPuD99yBccc6 oXqMD5PEuAyow9O8jVFODXTqFWQ8B9ifzskBgLWUlad+9lL3rW/+tJtjLz/6kVPdJx86RfJfdVST ciJQHeJ7IF5sZ69VUjAJSVCoxuol+F+S5HolpWY00BwPtfu79nHv4SyUVcC4vjymtnrq3gqAMcCS PyFQScJVkFcUf8BjxtNs//Jwe++WbNta4ySsSfMSDlOP+jje/9d5VlfOqF4u9zcPJnDfQgMHSnEb dr8z8XR5a7575/LF7gc/ea676+5j3X13n0jFFOkb66wn61zLGfXR9HbnWZtbTABmNZCDzJfJwdN2 y0MmLtEs6iwAyjm37u4e4ssbGj/NxSZYch8k4dhKSE0s5hj3OMcVtcCkTfaqdC3HRkCizMq+E1xX 6D3YIEtOcNyDiVuT9S7FGvHbvI/+zr1EHDdA3u/ZOs/OyW5N3S5dUXZ9k9kZ1iKElN/P60s58teK NERu9/+yHJo8aI6PPEhkc3GvB6TSWG4T8Clt5xhVfI5h9F6nGdA5PNh7oU4UdY4xss40PHk7Jm6m NEms+Vt3Gx3SLz9Bs9Eio6KCuwJrkUNGB2v77oxpr392naAt3nLa2JJew0JO801stjJKCzS6ZtRF E+iIU/cejTf3IHvzHHkbAmsrPV3HODPnwo69D911rLsDWppRhYtzN6AVQSkChKfSRyILta/6cQwd xGv5s0dB3nv0oWU4q2laGouZYD0kL8dIYEJseY7oBVuQNxxtDkckb9ZE6ZGS/73vtsbGtZfcAObV tdhTiWKk+AnXcta3CbzuYfkoNdDeapXMbdgg0VT/1khFxloz/jh1v3FELK5ep1iAuU/mECnjdNhV tRQkfIB1ldEsH8RIyofWfCZ60n83EaSjR/+BuibLs02sv4cuVB8V1sSTndebf8M/+pHI63y4UsBv fW5nmd1aMP9//dvtYv9DcP1vOZ0LcBK//91nu6t47R67l80OsLR83U0wwShC4KY1O/HGblKNAZdZ Eg1chltUatALO8QGNWm4LMaiOEhJiPd5CyCS1wXY3qjvu4nL2t791QNsFULPpyq5XF7biLH83ry9 baHvCEt1L38kMaOJf+8kISQFgtwzduC6is5mBdZNxmul4rsOANpmF+6jnu4BOrNZx2cIMD1L043R mRmuCegxOQQPiqX2trGuV/UscJ5BXPEVnqIEEMB6gKQ5aQB7UcbDQ/u63/vtT1FmaQIv6hPdMyRX 6XW19azAUUt5gpJMiosU0+fepXbocdbTF6Mkz9XCfTyfnkCVt40yUomC94b1vPBalbsrqWGSYiIM DKZzNKLUsEzcBtUS3rnazRP6/tSjJzkOMMtrg3gchkksCg2h1RP1wZKMklrIBWzjz2kKuULLBfqV hFIfpNeE96qyaVGMyh7XIFDw5iP1PwcgQqxJSM/Nr66xTYTtSsrMuXzwGhtlMBkKr1Eou4yfSkEQ NkzGWzz40jBQuifgNH8BLrXtiL/39BuA7GvdP//X3w///Utf+Xg3sXeaLnpWEiFRigjMoQPb3T6u OUNi2gsvne5ef+1M9zpVRI6RY3AIZaeNsUQlkTjwh6fKA8m9Zq0ZrbHeKh7WlDnjnpa5x8t0QZy3 IQkLcC8RA6Mblq5yPK1ZbXnHYX5/AEV8DX7mvIDLBFWHMs1TAJJ6bjFqzaxftRJLrqqXqhTGxDSl GfnlaegJ/49//Mfdj554ubv75LHu04/e253CyEg3N0Okdnfk+dKYhHFKFQvrcQ/AXad6Srxgzqn/ elpB25/VYU1qkQZO0Tp2V4QpbdM8z6r/KOHaq1HWnrj3VLsvXedJHrabXBkMAXx6aPGq3zTcz/5Y pZrKMrx1q8P4tcp4ebz0HJ1pdmMc9V4s56ZRmDWZzIGsQY1OPY3rjcs8xfEba2OUADvb/X/++fe7 v0uy6yceuSs5JMtwea22Y/KxZu0+9uQivy8hI+p5qvrHPupXf5nye0ZUzpy9QPoy/G8iFa+T2HgQ Xv4Ec7Uwb4Kk9S4EB1XHehPwLaDWcDbMHQPKW3Xc9DSGM14VO1wD4U67tR0bj1Kzu799uhjaJTnL g957od8tTWuF9uPSgFUPsHr6ROSr13GiqplJWnBn4rhm+6FRq2PiFvIuA6A52AMqfX8b2ZdSgyWw Koro/lV++8w8q1Wllpc8saWRkYOeVcOW/b55cwXnxQptz/d3f/+3P91978kXuz/84x92g7/xMWqV U1OeeTYPwgYjSXDj5H0Xy0LIDUQ6NsqbPG/ddq3JigqUruENgZ7/GI847X0toqjpplJeNU96bvW6 a+gogzVKedZ11qXzVuPIN/kf+6n6MU2S4nG81GfevBBZthcamO8/9jCRYPc3dDVrOPvaQfojzI9Q klLw3qIBqVdeN1WAukU7K+JRt+l+NCIbiqORLl4dXcObD7CWMphCGaJGUGmelPvcogtkqjWRQ1Ox Ds9ltKFAa59gnn3bZH5AJmNk0rAOo7RA1wlktR6TUzeR0+zZ4XSD9HoVcsu6VZ/XBFS0hXGTc22U YmXlBuVAiUaQs3Dy1FF00GR3/go0P7zgGjDDe/ipoZlKZBroVpcxGlvzEyjRMHvtB/7XONc+TKgh vGRxqf4rS6RNdT+7fcJJArA+djvepwh+8No1HDtmR+nCW9+3rvBv/9stbfhvf65/mzN8CK7/bUaP RX/l4pXutRfPdLN4AWdY3DN4MyUtjQyusLJQLljBm+uLbFiSewDZw8OGP0k4QvnoCR2Rhya6totW X0A0gkx5zdJGeYcd1iRCBJDvt/vOzwa+eu9ML+PyloIldBM/p7+kKW03SQs3ZaMpOBWSzcIvUIrA QKl6DQvUm6xkFy0be1irVgC0ROr2yMmjJG3CW4UKsNdSgxoTeyj9hMfhGgrWknpHjhwHCE8jUODO 6vXDjN0DABoZKw+BIGSEENz2xjJ826Vugax2Q/af/dSj3ScBO4/eS6vuP/xe9/Vv/ri7jmfUCgVW rRia4pwmVFGeKgKO5whNIyC6V7AFqnqBFSWNYE1ijF5TQGQ1kalygn0pvMqktj03nhONC+ZN2sJZ GsSs4UE8RHh9jSYqN6EqGEJPgiU/N9ONscz9lD3i84kkRNIoUXrPRnmvCvTVt8gvnPjGRYypk8iB HzVBrUmqXusp2jUamiaPwOJ/8mblMKv8pimpZw3lFVut6/W226SJfsxduJB4DUUc8VAAYqYA3nej 3MYwmoYwhJ586c3uDEmL/9l/8a+7F14+2/3P/5d/p3voo3d3k3iv3377PMft6e44RT1lvdLc6xtv nOsu0S1Rj/LxI5SIgn4isJcHvr0FHcpnsH5wpLAUI+aRnya+2eRlZQ3+NtUB5mzygkF2JPdtpIJ6 1ERELPeX8ovMyVGoB6dIOnzr0rUkOaqAVD565pw358RUYEsnxmtU2j8JsTNEQK5dudF949tPdX9C TWvDrY8+8NHuIzQCmrTRjFVjBWq6XLjfcJHRNCpkaVRDgqJRngMQr4GQNdaH9/mIr1STkgaendMY ybUHSzNnI+4YwTGc/RcvYZvbbPLUCAlgDMc4RvItQ7mqjbQun+xZyzEODFDLOFErxxbFnWiM42IX u8lUYdEwoJx8M6JdWzyjHeJwR21sUlIPw2VphXrnrNm9M1OpR/z9Hz6bLpb3nDrM/O4Pl/YqXOp5 aEJTeExnoYNtcO+LlN30GYwk2alRL9vnP3M/ho7VQq7EcFqEYvTamxfpJEgPAObs2jKkWUCbwCfd 8njyNcttApxGkpTVDA9HxD0rCI1DoMBIEkPb0GZ421Bn7wsVwqNt494DiSZLGyRsK6T/y1Gvue2N okILtdGymvw7ALku6Bz3Hu4Axwbmyne680eu2js/epBTEQ6OE2ClVFN7iCBxqXuUpdPI5NpSkFwV iUwgRteRO3OUvzxEdZa/9dWPd2+cO9d9+6fPdfednMXL+1gcBuvQg8b2U6rSe2+0qVxD4yNyRADn mlSG7gJhrkXXrzqpDU0fmVCexRhq/3zg7IXecMnkcKfWVzaiZs6RIgddYonIgEbLtmJML4nk1J/o EJNhNaivXEZ/YizuIxp2gHW7zYcvX1yAlkYvAShjVq2xvv4cXckWoUYMQZuxPrNz1FNCmnjc5U4t UG2OThrKyNOXHpXoQBn9KUXLeG+yDyJfpT04z8pjn5dHdIgC2Jtk6Qen9HJ5nj1QOassWCUB2700 xrO4R/WSb9DcS3mlnkhUsUV9qp56OUxCeXJO5LerzK0GY78CHCPmIh1ADo6Mk0g+NN+dYWxWMapN aIzjhvEa4bNy9UNpM3E/96+c8T7bPmmgIs+lA6amsGijDqcPc8spX0vTl+Rcx9htW6udrz9vlq7n 8RE4pk1NTuXvvSisM/zVfbXH2Tlhv6Pf7wq3H7/7uPf7bP+Z/mfbsXnOD8H1rzuXWJvd5o1u6ubV 7sG9q+EWjt28hjCgIx8g0c5t23tMHhE2EBonsXEgoVyqEwguU4y+WfTyuPDsLl6Bb4riTBcplM0w XsE9JmW5CAVceDYGBrHcKWzv/irudIG2CGeFX1LOFYy6w+2OJweXxDIL1iN0pDlsQS1Jsxi+4p1C yBjaNWS45mqH0zaAEbCMZ9quVXMIsQWoA0MIsvHZ2W5rHwBmFiFGfc0hLORjD9xbtYXx8C0O7qNr FMKOXbm4SAIKzQts4HHp2pkAXpW71Rz2wcEepWLIODzW8mYUNcXa13LBBHkjJD0OIWSn8TB+haoV ew/BgZ053P2E5Ko3X38LoYuiGN7Ay005KhvHCCqtTsE97cGrqBEzR2OKYeZhAkEWZZWCzdYnNsvZ 8bF2LGMwuJEuc4L2EZ5DsOxQOGabm3imudelxRvdc8+91r1J176H7z7E+MMLJiQ9MuTgQ3EhzK0g Sw1elYSKBK+HXmLhS0pvxYApoVXSqbxWCuKhVC+wgoPdG8tjEYMoQlqCEQJYD6qVHPB4BFzYscy1 4RgaUnYc5SVT7nAUcFz2AR4Mu99hhAyYgKbiTpU0b6TqoQo8tkzulMbhWuGVkzSh2MIzPM61fjSw 3r188Vz39e+u00xmuPvq4ie6E6cOUQYLmg/O0eus3TXG8yAelCP3neyef+Gt7hWMrztp6jBCTeQZ ohKhiipy8HQO4QGKIGL8Noji2EzpJsr2xvxW99I70EowDLaZhxFA7UXeX790MSD+5Na+bpYxGeJe DQFbZu4oY3WC3weJcEyT0BPwjBG3TgWKbbicjou86bRiZ86cg1HW4CWSL//wX/+g+4u/+Ek3A3D/ 7MP3dp+/51B3UC8kRtMkoHlmBMOE/ZCqMXq5DBmzTlUopkS4VtJOOTq5og3bUJ4SHjZZ1xn1uVNN p0rlpaoHQChezqyFWhOeRMXni5uA22pI4TybpFXrSVC9rRvKJbcLiKuQ+0TAgG6MmZSmdB1JnTCl P8dUqcxRnvGOKeogW/Iw+8Uqi4SX9bBxcvMRvJdJIlBrfEaPmYmQtpzXI/3kc6+ka+pv4on++IN3 J+l37tpymizZYW/USIk/U/PcZj7IIMbtIElYn/noPd3p0xe7p196K4bWNTtwwgneyz5fmCEngHOt MpYL66vVCt3BYT07vlYCkkducuYiJdpW8MSaFyFQMLkxDVgc00b7sSa9oXGZVTaPmXAtUN93gPUX EAh1z3J2ro8RjGwjX367LzznMF6AodQ09/pGyARKcqzL8yhgHEX2C37WrM6ixRAOdq2JNAyxAoXe xIDx8q7v0QnQ6iuHUcSxZKTwrAAuQ/uNz+xeTYfTNAQRAHLPmzooChCtQecawsAb8j41TJepe3x9 vTsEj/dLH/tYN7E93l1DTj77zHkiDXdQV3wGuUeEjJCM/O0t7lkesGttmcRmKQRTRBEGkcMCf+cu vQNipLlGG3AW8GVdI7PcV3nH1dqMTKMplTGfdSflSHmW5mK8tgagdJ2OG6Hkvl1fLLiUdzVfZJN5 GqVJ0x0kzxo5nEfXzM/RPAY+yU3Lrjp/PPcAdfg3kSeCx338PdoAcyNM5dq1N6sjr2PZG679mtF7 rgtJiXRzxe6iOFsUVlRGmmGOJoyICGxZRKncpJGDoN00mVjwy+s6CG5FrZpuj4jNCowjQTk7TjQ7 4NVIBbLErpEDhsdaEquAupJuA38zRsqD3imQogbmbQEtBtLsjAjy3FlkzRTG8jQUEZLU2acXUueb NYeTa5O9bxOp0I80FoJm0a84VRQ38WArHnjZ34UGbdhC5XApV9JtJnnny9PsBpU99q4o3ruPzV5o xpzv9QanvZRih/FDffCLAGl/rd1A9/Z7uP2y/c3mmrdu/V3PsPuY2w/pz99skJxj93k8r+/15CrH q/wnJh1/+PWrjwAJPN38O4wiwn/yZveZjx2JlT+Al3lrm6L9egB0AOEd0/M2YGevCaZEBUMx/MF4 H9k81vzMrPM5k86wzmO14ukbJOw+iHcoyQ0qDYSRgnvQZDYFC6t9AO9pWp6ndJNeBRVpASYrMVQ4 hg2Utqu+LKiUGoBiR3jtwdNIxgsUFRIkEPhuZhPdVG5b1KWep9PeVdtee18ozUMzNI64946A3v2A m/14ceVNHzl5knNDRcDTOEVlj0mToLgNy7aN8ZohrCu0uL3EtzU4TYacRcnaanoGA8KENbnWyyhT dB1AmJauKPWbgJoLV5ZQfNs0ENnXffFLB7p7qDv83e8/2/3f/9P/rnvhhVfJHidRhwf1Uax/bW1T 7+WgSVEILWkslg7sPUh6DfQWGGqU577OuJpIYoc+26iPOC5uciTKKEpc6sVNyb8I1FU86vMkgQmZ jtIBz9dSiwJhaGKRTTEMWcrTk77g2KcJmDSRCDQFqR4DoawSrJZeNq5CzTlE6BkajjNsl+jSW5Ha 0G5ehWWwEkJ9BC/mBoOmAokQ5n1r4Mrz1yvJ4rBTl0pFLmLmOS3tmXfGVYWnMHDui6dHkg3jlc+y vvbw+VN4wla2qSTSnaYj2pXuv/4nf9z97GfPdP/h3/9q91u/8XFCk9TQnYaGgogZ5zqT+/d1W3iX L8CRvAY1wbU+jJG0jQfaOuWD8COjZPlKtZIbRECgsCwREbl0Y7V7+8pcmtqM7JlCmd7k9xWaxNDM xvXMWjoEeB1nHl0nshRH0QZ23xsG5AwDdj23aYbWyh7BmLKznqUDtasGxgdZWzav6bqfkLz4R//m R92Fs+eoZX2g+9yDd2JQ2NJeIEg5SDr9jaHwA4ia5zCVZRogdo9FCcY9Wt7mmrKKf9qS2tfLUVrG T6gl4fw61u7P0ix9fXk/5+upghNOdYly7aGiMbg4OYaEK1dIPNga2a7p0GgEEcw3ssbImA1atzds OiKFhPrhHLeGHNkgcnbQSIMgntrXri8bRhmtWla22ERCgGPCZqs44qWVJWPczGXqDH/7Bz/POr3z yBH2zwjdGQE+vGCCoRxsG5noCMxeArAYNdEbeALq2B1UmHnhtXdyX5eY74vIhsPUOt6PgXSJnAbB gEZvz6ZIeTFpMAyAXk0B9foN1hFzVcmJwg9rpNvRkqiGc21FpnjapPEYEq+Quh68cNRNeAxVocBO AGfKlWngREMmolZEjx6B9KCn6BByfsNLloLWaumlbGZDDCrdoqIonzljQJjA3G6tBZqSCO39Sk8g pSbgmmxcn2WDuXHtbnJ/N5NI622RfxAdYztwzs3zDeGqFegizmnSg8F/dZWOoge7wYdIMCc6c+Pq CmAL6sMhIqtNN8RgYD9ZDjURETvpsjYmiEIGCrt2jaAEmMqxbsA5ALsAUWRZDLIGu/v1vAsQZi9k fpqgy3q3/CkGj5Fe91eqW/CcyNCqxlIRrVmohhZadp2qO5aIaBn9tXGRxuACtdVXcP6YEDthFRza CS5BN1zUIGFvJDqbsW9eaCvbGHnyqgBogbzGT5KDlbisgVVlJd8mzo5jiA7Qqj036+0n98GOibUu EoSjR4CGdsYz+7eHcgUDXQsep7Gh1z6yO5S4AtEJZCo6pM40WlM7W9MRCoqcPQg1NE++lXXu2Q08 9qkiovGIHj24z2vY4RJBwZqR9oW5ghFN5S5kqfvfsR4d2QsVyyiGlJPyQOeb+8v4eE3Bt/fb5ts3 dhxDdds7a2E3+G3LIM9f6ySicCfo01RfPt9TR9Rt/bn79dV/Pie67cvP9uep8aqv3eC7/3s3IN59 mtuB+u7r9sf1s+k5dn/7fu+p7n/vz2dX6w/B9XvN2i96bR3v5LW3AaWEL1nIAuhZAKcgdwsAsEa1 hE2AVtVkbYvPGsdWBXGj6mV0p6HoDNl7zBxlkq5fvJ4C+eOUrBoFdNpGvHasAg6AhJbUL1AT1k9h 25XJYnYDunprFQtaktXsAlDQ4RkXnK8jeFcRPmYnj2wA/lGWOlnlpq7K2wOUmt1/Dc/dFh2fVpEW IwDmfYR/j91xnNrTx+NRX8cLvBfvdRqrAED0CoxRBiptofF6CPxsrmsIX+t9GkrI7N5FPJOE+Bir UTjKdpQylJ1kGTmz3Oc6wu4qQOvM6rWU53r26dfxaq52X/niw92nPnFPd+rk8e5rv/3R7gyVBsag 4rzx+mmOu0YXuGloOYSjHSeUxDKKyXrUKvYo2gxZ8aptgbvKt22cFazZGFIJVNgaFszT7D7D5xgM COVRW3QDGOYAgdYGvgNwMAOQcPL0oFmMX3M/nvcIH1slC+D6THuVa+BdPE9qyPDYe4mg1OHLpK2+ g6bTKLSKD7RJHA/z3uXTpS1xvGOCdICV3FTmT+NJb0TavHOcqF6FqSdPr3rOL7BzZfUSJ7K7dX6M Z8Y1RGiVRzQJbRIjbxBDg4BmN/L2ue5lqCBP/vyN7uTxY9ACDnR33nECPvYMHi/b61ajkENULVig a+OL1My+j8SjY7Zit7W2NdCdb4CWCsEOgnKbBfF2XJRGtAyHXc9Wtwpfmn0zPwpQ9BkAHfvgWi7x 9yBgbUuvv15+v0Nx8t6l5ZhciTFke26eQQ+snF/TvixTNc7eksLw3R8+0527cAlQONrdf+fR7jBG hNzzTTzo1lseZ93r2cz9Vsw/Y55/RgniLa2umqVC3WfMSUr/1D70cyqp8N31uOtt0zulMmsgR4+u 8xaPTxRvAwOhfZRSrR1foDEl+fRgR5ZoXBcQsCybnl0vbVUYmy6F/68BzVrYRlNaheEmkbWx1Ddn ja8TqTEhyfOwFxVVo6yTYbxx7oxwgR0TEykFsdzAcCq3wP3FsH3l1Xe6l5jjR+492Z2kTvF1Ig7X aE2vYer59XJLzRkVwIEcTUC0Yc9eKDkzrKtFIlvX5xa66+ytm9uH05VPj1qVwQQ4sCfcg8mnsJyj Ze2ybmv/VFOoShSzJvYaZOsNjIlqNe+AuiGbWIwHroG85mENl1bnYNBDETcSPyq7KPurOgoW2Mh9 hYKj7BV5GHxhpLxG+L7lbdzhIHOUuRvRD55DbjxjaHk+6+8boJcV6O86WEwQLTRSxnRaoEuh8jyu BNecEUrXSNZXVaGI8aQskMvMHltmXHX47IOiMw34GxcAm6znWGlsanDzL417+Gzxu9sCjFwqGojt 38tOiJWSVfiuL+/D9Rhw2g5pv+5iSBWlYJfMKfClA0QDpcbWeuvmfYxahx35FeCL3B2DbjgLvUze 9LULNBPD3WnzKcdHoyUdRuOwKq+r5elSujY3sPu6zQjr96Yy073nGMSq1Z5FP7C2N7HEA8od25TI 8zzqCHWtYqx0efbmloA7G7VRLUPWqecNcaccIS6K3rmSc0SGtGXa1mXOo27oUVxO4o01YR2Qj+GJ 48qon5HtUXTuhtVNrECivmZ9noK3PjQ6mRKl6vA15naNMSIYHQNbB6CGhCkZnjk0ENah9l3JmLov Wam+3qPozFvbT1nzvFXdkd8b1O5eEuWUaKeq4dr57pefNbRzP20p+bP/7tVVD/R38FU7tr9Wjfuv /9UeJyfYveIF/7uNgloRt74cJo+319oK0bgPwfWvMAc3Vxe77uqbgOS5eCir2j/ikWQLAY6eIr0k Lk7BWJJu3CV09bu5DDc3q6K8mkobvS5yoy5T1u0y7YHvffSebgJwPQhgv2mWcqtwoCcqZZxETc58 S3TpJ7/3XiXiFqqJ4NrSPoAQPQCpaGFNZygTCc2wqVaw+LnnmQOU6gJALC5vAzjwYkF/WICLew0Q fuj4LLW6oW+gBPcdOtDto6nI+Mz+3N8Qzz0CYF7n2eRTmu2s51f+pVBARa9KMOlMbtkYgHyGkOSx atWVcKsgRU+bilthPknXqRUE6hU41Utw085duNZ94zvPdK++dKZ7/rVL3W++ern7O7/zaHeSMky/ 99uPh17yX/83f9I9+9wlyvxhsQOaRvF2r+ChmQOgb/O3/NL4GARi3JF8VdvryvVMFrwh/niTSgBG 2JZmLCCKsHcmblDT963TdGQElBwkVG0i4Koef4GMjYHkhWo8qTgBAQr/0EECTorXF4+08+8IKUAj dYv+4detFtCR0iWJIinK0+K4rgMS17muXvfw7/K29B0UETQIFf3AJOPNs5fj1GdQsPNsJsx63gj5 KlMWwS11IIJCiohcTrm9lsQe62YO7cd4IULBvNx5cBbhzNoAQF2GU/3zp1/BYznUPfqxB7vPf/7j tKw/HODwCeoW62H61jfPdU8+/1r3MTySD1I5xtrDemcM3es9F5iqEKySY4MIM92vOTc8w5peSgC2 HmurtozyWUO/aYVMbeoxDKOCQe45w7aGOOVy6rm2uqWemzJwNWasPGGi3DjPtMjafvq5N7ufcf+r UE4evuMualrfCX97phuAJx6AmtrPAhupQ6X0vVTAlclIcSEawrZSh4NXYNCxraYRDfjoOdaLhMG3 rkG7KY+b+4z3ssCBhmU1rWD89Yw1UF5T3xJeXQ7KF4G+gE9HKveZds6JWhUED1Dh3wjJje5Hj9U7 q2lepQo5hnvfgnulATjOdcccJ6lhfG4LBDgGsB7Tk+maYfXrodcw8DHLqKOxB0p5lfKHp8+c7773 4+cBxaPdZz51D8E8KGQm0jJO+4lwreFBXyFSIVhyzWu8zsCRPUYk6iiG2ekzF7pFDJ05El7l0SdS ZHQlyx85orjgp2sgdbQ1wJEh1Z1Vo6TqXJsMjGBqXmTXhONR+6rn3foEevqKDhJY3QBs8WEz3/Ek Nl91IhOK7KID9KXj6phe5Veyar5iNLkGBHsNWMl2cF5tNZ7ok9GHqjijx9orKepTBVSDBsMnXmPA 3R6BXMsCG7RMqqdO1EljOU8Wo7Li+MXB93if29bi5pIcOEDN4y1kAXOgYZ4kP+bfyIUe7/DaGzjt EwBjIJRkacZdFlVVq6qXy4fTDHFfKgOzxEt9uVl83vaXY+ZHM7EtahOnj+u69me8uwI61qYUF591 kKS8UUoDaRB4T/NXVsgDWEtkRGPKLeH4phuuPiyecwmdejNJm0VhUY6HTtUbJAGW7i2TkzHG3LPt 3mx+tryKgdf4EmvrjBVcySq16DhYo9t7KVnuRc0FqTJ5Xk1DDJmGM6svh1cjYGSoJZD6kMoRXS0B nC2yymf1iUf0N39ZjWRzeGScXQTsU8C0e97yoNL9gi003jmDFMkZ6Dbj5Nr4ZJbX3DSXh0NcqZsW JuCzVAlOtDRzG9lWy60oajXVPd2hB5GZ636KaynsgN/dr/fH9T97UFojUddrSyk/BaIa82lQ067h NROpbd/9+fvP9fcY8ds+0y+/3cf0x+267ff8tf/MewHz/r1+HPpjsm523584Cz28TGWzD8H1Lxvx 9v4WnurtK692A0vXAbmSgnX3qDmpvrDNZo6QQEhPU2XT8LTlhvK+1j+KhTrX2yjuTcGEHhLeu0Lr 0htwyVxpxz9ykpJJh7phShGlnW8SHMs7EU8jgsSL3GRTBftFOFRIWAs6yY873gwVbhhkJexVjlqt uKhtILwHT8A4oXxLtC2RrLEGP3lhgRAkDKtVClYubw1193z0we7eh+6q0mN4okegqQxjCUdBBXyY FFctW/fgTdRLkPq7/FRgy2G0GoHe5WHCb3ZmU7ns4dyCyNq95cUZEoDypwrUaiJT3NuD9w52jz96 F4BnmmYTp0nGodUyoP+Z598BeFMCjgzxx7/wUdpvX+tuoOQvnr/Q7bl0nZbcJxA4loSDp8sY2AxE oBa/sXwzhIpUlnkMAr1gexkLIwYqWjmTowjxqVTt4G+uY7UQQ2wXAfpvvnWpO0rN7qljexNiX8YY mQTI4s/N/IwIUrMQbOSB9yxzrcSyKbzFkFTSlTiz0zEyc6anwM8Z7y9xVAKneemaFykdGQ1rw02V s1/jrVIt0BSeV7qY6a32euVxqQTOCpO6tjYxvPT02bktPGAv5jqNuLcDnMZIMEIScNZsp8v7Ryi7 pyBfQ3m9yPWu4vX9s6/Pdd9/8o3uxdcvdn/ra5/sjgCaPvHJexHuE93LL77Wvf7i69071L2+Qove sXhGUR+Mzx69rdyjFSbk9DoXcn/ZSaw5a8EC7njuefaMBtsB7vUkNXoPUDkkI9lAj6AvQdok6jQv q8mPKLc9eugEpyZpMk8H8UwLtH760+e7f/GHP0BJr1Lh587us1RGuZdyZRPQbbaMdrAeTNCRWuF+ TkRFwylK0CkSNNS8FXgtT1NfLSL81CR+cT5+dd69DyfVvSOv3TEXKBZIK494gfScKGCjlIKKvAlw 6QZSVgxtB0iX0WjnzkQeBHfp2gfHGYC7aTKnIJmIgBEr78uokZ6+5Fjw/jiG77iySrqZazEVV5AJ ulndlfwwglOgvEBvKFYc615ZZ+5+8tSL8YDqwrqbMn2H6ZIpNUR6gzWKrX2tUVpGa+19a2Dfe/cR omSL3eXL0BYI78+xrvaREClocqzlugto0mQjFA55wvg2NCaCjpSjGJREz9ZjQBmpYncR6jYvxctp gFkDOjE8AXUoYu7AGi+/jW4l4UzAK8jId/FsBfFDrIso0My9+7RHBqKgNqcckWtzUKouNc9pzsn9 m5w3ikc+cxlPvIBP/qxguTyoRhlECZEFjrHn4ndzMQQ8rvsmNqNDClHojRYksW83HbeKwBkt0GhN Z1a+V8kpsUKThqPiNx001UM6E3qApf5yTWlAlZWWY/wKqGjIoryqJZtqRnsIVccXoHZ+jNDVrxUx a/Aoi6iHSr5d/waJFo3COY/NH9pIRSOc/wk4xUdOmuDY0bzrajj+9h/wVkZwCAkudcgsIi+sAhVH k/Sf/lYi/8vRUInA7l1BsU4P60BroFYei02sRuDlC6AnGbN1x8OqQMpjRVV2X99rQLpZVXcKuHbq LMFbndyiV/oKK0kYbQC2DJWSI7Wm2gAnAlFj3n40L3bTme5vEyzNstao8DkwmjS+Ro2GeD5oq+tX L3cbVutRN49PV2GC1LXWfoVGyVxOzxZ4zZlvTce7wGLLyy/DyvXvXO46Nnfd3/7O7q5zhu6RJ6nT 9wC4/91r71zac7fj+88kctaO6X96jFVc4rfc9e37u79T6aV9tv/heW9/7bZDdq3kemf3Z97vs/3z eAPb5Iask1R8U515+8k//Psvj8AmJW/WLr5I6TgqEqDow6kyASEdXZRvVdIJTcIiJtOg91quKxHZ 6OmBPk3CFsINHqrJRhso7nfePN9doQ3wXQ+e6k4+eFc3TA3YaGPDTQlHliAvpaZyYuPErGyK2Nl0 Beu9ihZvCkdvGppFWgJSIt4oC/DPLxMqx6s7iFdrjASwG0vb3aWLcwnRDhK2n8E7vUDYbenGBrWO 7+7ufPRBwP+VAMYhSiRt4wlBleUyIwIkNyr3t40ln1bC3LPKdjM0BO7bzR/QgzcsLFh4uXhebaRj 9z4VkR3erNyQzOgABhJIMF6mJhAW+8a6v/e3P9N95fFPZJFb53oRj7tgah7wcPgoJeO+9PHuArWV /+QPv52auePU750hrKgnd5twuMJkcWu9mzGDUVDCJpaTu6LxYTLm4dFuP4BZ2oCe/Sn4uFaRsGGD XpB91NxWUltKblmgR/3tKQC5021EQWBtkpgeTqtVRHHJa029ZhQu/EBBTGpVxz5S41et5/JzlBDN rPbKYEcalNraXRkiys7ptl6slIR4nspzGYCsNzRJO/K/HVKTbWSJa2/Z2tfnxD9gcqPXa3HJhvFq rhkk53WJMVm+vpLktOM0azjAOBzAa7QkNYXLvXH6HM2D5rvT116l2QN0AObh8c/d3/3B3/5C94mP 3d898pE7u7ffPEtzg2XaidMaHYqQnHZpDUMoo3XoU4t4dD2ft2F3yE3XjAlr3PsywHuT90dGlqnG Q4ku+JezRFE2WLcbjKN8+hVQhZz+GLYCVMGDoW/24JjAO1QJykTuJzzOmj9L9OHJJ1/qfvSjp7oH SL78/Efvg9JwtNvLNbe5nqXqRvGcBQwEIJcLqcqQ6R1rBm9THzFwkzwsEimALV3DGY1yFDSpltkH Jm4J0/pERMc+1WSsghEw3fa86yHAu1GCeoBikiC/+x0vuWF7vc4YSEqiwPSU7eOK8CuzyDT4/NcM 9V6Hx9DlmhpLo4DS9T3mc9hpDd6m4WK9m8oUedcabGhZqRbygN0P0hrGGCfXu01jfvzUS6lC8x+f OADAPtKdeedyNw+H3giOCYiOzSbjW5zwm6kRfwRjSWrIxYvX0pDIpjQHoROZfOx9mVysV1WgaMQt FWKwevTI+77fVgoStLlfjYJYB3lYsGVyoSDXKWDUU1ljBxg3Q1Jw7b5NciJjwTFRiBpRxdtpnsW8 WIq5zUVoCL1fLxPdPOWh7Gj0sBZ5OfQP7r9qpethZP5NJDQ3RGDb9nPZCrW3d77qtDvg0z/L/2id +8b99xm1gslDGHR8mEcNbw0GHSxGMKtOtbQhaW9Fc+gvlRydBvSyphrtJfI4BkCB5Z1nbzdXcqkS FEOBCLl9l38yi1FBVeNZz1XrMKCof17HVdElFuX6biWN7lqzBZ+kkOnJnmRtnLiPknPc40XKoS6Y gGnyvhEajF/zNgTd5pYsR486hcW5ztWzp3cZZo5mE8AOQ9Solbzat/vI9eo+qH3DvZrLk1KCDFVy IpQJjqk+4YpMRD/Ha17zG0OoGSmR9RnvNiaqgxqMGqK472uQd5ZChrWM+di7ZHEblXDtiwc25HYY uRObMJADGBnmt2wjv2/iELtpXWB1tNEPdVBDpvoI7ayYpdxPUf2arx405nZLvOW2e1DcDtv50d9v W7Y74LqkYe2tHhRnONt3u3ze71dRv5LaI9d4tKHJCPc3uesmXGqFyG55vPvnuP1eP+jf73GZnbHZ fQ6NdY3kNbzW66zLASvAfNCL/E09bgNP9fLpp7vtpUtZvOW6YSMpEFotoyG8sdlM8SKr6MtGqxq1 bsa2MgwnE9rcA+AaoOvG1IGFcCUnKXE1RLi6EcbicajEOJU2LwNCPM4QqFbzrZxaN2U1lTDjqW9b nr0sJYFz2HjjxvVlqnXAZUUArbDBLBW3fG6xe+ntC93ps1e6r37po93nf/PR7tB9d3VbUDDevvZM d4FEtAdNyKPyh0t1EHAdzi7XCleUi6yloL6cyNp1ekdNWFMgqbjjPaB5heDe9wXZU1YdkLNNzVzH Mm3CeSbr6Y7oRVK48nlYBxGw8ohVzgf2Uu7tCNnwm/uSYLlAhri87Qcfurv7D/AI7SOk/4MfPtU9 99QLOc/995yK92cZoXcdoatik7M7CsgRlK1xc4a+dVXpNdSbl01pDVW7gZG8uIzHbZqw25oRB4TV IbjEx/Gk7yXR7SZ0mD0INnmtG3bYxLNhKaWog15hCsRCeXEZGPdtAiXUAhtHqIR9s/dWlQLoedc5 jXMbDVCe03i8TEKTb+s9630xLB3lVF45vYQ3Uax6zOJtlRKj15q5CrATcInNEvloIU3XjGHwWrKJ UMg1n0Gh6RHe4PN22LNM36N0LjyIF/sAnOQ3qGc9Cai2Q+m3vkly4IWL3Z3HDnePf+p+vh/o3nrr fHeV8XsBIH4XlWYCYgX1jKfeVb2a84ylS+QCnpY5eIRxmspB5dlMkl1cHuxujNr2mGPH+Jzry05/ 8HTnAd/SVNxjU9AcpuTy89yjGJBqQEPE1tKb4Lpz0I1+8pMXuxdZ41Psw9/8xAPdpx+8A/oL0RRr WgPux6YJqUIxEsGucD9poNTAU3xZhpBd8M4TAxXdrEIrRx9j3AzfgCIxR3k99VZX6LbHGfJ6K2Qt 7cC14Hyl8khTvnq9AqdcA15S7ievaLAmuax5zaXTV5OPRiFpRlYaKrl82HN6yd3Hmlkup0FAmF8C KjnBI3g99bYKtK2KsACItha8Xutp5lmajfta76CySDCq19e9MsIeusEcfI8GMw995A5Kwc2GwqFB 5V7bh1ETSkgERRl5ehGtzmPZOEtb2p3T1ujHAdyC0SmAtclsy8yvZQRNBre2+RAyaYJkAHMK9s5s dYeOHOP+kSfuCYFkohg6IyqZsufNBqyF5qFHuvGqlUlZ84Lo9u0eclwyVZV8muowyrf2XmR/9qTn V9a56c2mKCMsgF0jkcGvnx5pErUf6Dnj4i0TKMVFBUcERhGlO6iqQMlusCOYUs9oCJUHj2fIc1ZU yiYn2+qjlGagvrhUkABAqHhcRwqO4ytdTmAYOaIcaACvr/2d8nKJtkQw7IDBJtraXTVvdADhbt+i 6zmjkzHyKxWRBJJt3yQxOGNR8s61HDhqZIV5zNp0YAWPevapPT06QFSTiOVJ9KdUQ42EC2dvALLd /xpY5JtI52De7MOgHqlGRO0mMm8NXGd09FhXsqZjIVXCNTqGPB2jIot0KmkhaxqeQUqunZhqFdlI tMlIlM26lPXu6fJoBwL4RE5UjOZq6pRX21oLoM61A83aQJWc78F3bj3ANsqgaEBxtik7jFTxuk4W P6+8x+NOJlF02k1oRTdjeOudV9YbwebuG1DGd9RZhGjH5tRgKPuq6bF3r79CNfV1OzDuZ7tW8rvM rBbdqM/tmoqs9R549+ftP99foz8matB75RtIUMZN06dVhapQkXuiv35/7nbLO9d/P8C8+7hf5/cN jJkldMwqzobBYLUPv953BLaX6R725hPdzRvnA7pS+UFeoCE7J1HhqcB10v3bknfNvEq2szzAUEhE Pgy25eIOHbJ7RZL+PnLwULdJWFRLOytH76pCMeV4gnDYRGbYlzIfNuyIF05fmDewJ/y6BsCSU1NC LpnoGAJ6UG9QI/SVN67QlnqrO3jycHeYxKMt3nvn3LWuu0z76lnCiHtnuyG41CP8PPXgSPfUq+e6 N85e6j5KUuMYISW5jFY2SdJYLxy5P8tLCbqSuU3SjKHJEbxXlu8jotuK1Vft0AXqq6p0Jnh/TCAq +OZ2FYBWEVgBLN1kfEbxbqbNs94WvlcIsyyj0MvrV4lRBygFN7VXoCMFZYR2uQ9299E58OMfv6/7 P/2f/3H38gtv4qWn5q6d4LjnORR3OmAytoKsACa9ysydvNwF+YgB3s5xdRBbYS41FOavb0PfuRIB fgSv+CESJ03UWsXgCQVGAYkySHk7VZ1Z79xXmqI0YRChkkVSnjDXjPfjjKUKhcJKgK+gj0upUFje c+kEgAdWoVT4vE024n1qxl7oRyWcBdcrlLOTd+5npH+EOmF5K0PzXtVSU5xuDTCZihTSigAH0Us9 HYEDzEa37JWthReg2VyjxvEgY2RjGMfqEjScGwtT3d79h7q3qIP90junu5deGOh+8tOXaLG9l7bW d6eE1p9944nuiRff6haOLKUz4CEAsKHMJZJ/V0yyFaixH24AoORYr0FXSqpQKljombZj5A3qt15O icQDUIT2QPpdv7bVXQUsXF1gDxF9mMVo2w8Pf481nuGuWu7Mf3ainKICzxM/e7v7s2/+pLtMAuwn HrufLox3dfuhIWybPKm3W0+uUSfWmMpDo8kylcnzcp83iokh5HjJo4nUVIxhgK9gRK9Sq6og3z8J kNXExfFPG/MG6FSSe6zYYlRKL7ZNi1w/3rXLgHk33Jz669bG4+9Nq9uA0sL/VXk3T73eNWkYCiJr 5a5eW4yR4f2ZeLgMBz5J1ryvdydJYFxHYz1txuW1G1EQLPPaInMuqDF/wOYuw3xoWW+Y+4ONbrOh RAgEbUnsNlfiUvetb/+csZ7sPk7ZtyNEO6x/vcr+Cn1Mg4lz2nzKmuvyWo8f3t+d3n85CY3n8WAf B2xPEi3yfvZbLYlxkCvvvhBoV16Ere0pkwjov+PUsW52/16uc4N26pQkg7M/EE9dzVnzN9feaIbj DreauapqDQWs1dCltNvfzbvodgx/N/PWN54xYlQG6xAyTeCkR76aIhVdjka0Tc55guJKFyxp4CmQ LsKhAfNbvOSdyjMN+RQPnLlS5gQ12HSEPAQAs7x0qSGRCQBBO1ZuMz6pu89x7n/LKCpy5pkPn/Xo yf3Z+0mKzRqviibRY34HrNfaT5OYAJlmqDeIlGMTuXEP9LDJBxLQtr8j9sqrX+ct4B3Hk5Eg/5aL DPDLXLV7KqOovOZ9adOBFfYnEaxJAPZxL2FXQso/GiEZYs+7jqvsIxESqB1SIW3xHlyaFaB3Ohsr z2ny+4pVuLDmldXun1WUlwl/E4yLM2V9fcz96DPF41YAtRRH9iuJlZ5nm8ouud88n8/k3/x0ffli H2UIb7vupF+XMdzj2EmRxXLQ+WzxyDUYmI9UFCHcf9ovbTDHA9JXcCxZVIHsbdY+eUQcOW6FEBN7 t3AK+Vw4F3zuLcoEb7I2t+NQ4u/GQkyAS1HGZ0OLanslz9bWQxu+nR/e0m5zymN3A+QefNed17HK HX/fWWPt7zJk66vcSLdAfX/ejAkHxZZQbSGy+yGyXKvMNdvJ6Ynv76M/T59oePsz/NX9zVyzhlYp BLEIuB6gdK+UuQ/B9fuM8PoNeF1vPdkNLJxLmLxWWdEtUjHAPSugCa26NlsWggox0IAvw5Rubiti xAmlx5INR7UOUqIRCCgRwPZNAMUmtAM9hPHk+mE90Xj0TPbzfNWgBPAH0BBAK7BS4zo13lT0fq4E kqHUFbyMVwHWp8/QqpoyTMMA+cP3wy391EepjznencJr+MiXLM8kr3gd7y5KCeV2gPJNd8JDvXj5 EuF6vAVUUhgg+VBYFvCn0aBgkYaJV2bU9sjhLrI5LXBinmfbrC1yHc/2RO/dR9BY7s+GNMWrZCjw Mk7q0cSkjkBUqDII1gVV2cUrocfGJ80zJ+IJwLV9OQqGkOsRkkp/4/HHupv/6/9p9w3Kqz1N6H+Z 8RsiXLqMx3OMY1KKzvEUWOu9QSitWWt0kNa5UlQssM2XQF/vmg9yjTJhr9PkYomQ9XEaGKQGKuMg YEkpPh/SrocaG3qmmtdqBACZlt5JFrOOcCvX5RpRSauo4mlW0dZr4aXqbXFuHQcFvIrIJWS0AIUn FUVwVaXbmhhRwYUKIriqzn0J4+nNNJFFzjlAMbXNeW69+HrMt2x7LrWA66mYch2NmoC2UoQCDTQz 3Tcn6LZpK/JKbrNc1TGSb52peUo+XSXUMGnZSQ6/Aof28uU5EhvvgSbyYPfyK6e7H3/n+dChTAJd hrYjGrAyAtMDoKO2ufoBY20lURpLsOnpUfpHO+fYCwCoScp/TEDlGeHebKJwmRDcMtJ279Ak8wfH H3BoJnxfH9hIxSQUhDXm6IWX3+7O0Un1FJzg3/7cQ91B6D9rGH0DKNkpPptx4XlSO1xPpeNt6D7C Xw+zgKBPeJUDbIzVUHKt2RhPRLW2jTrJ1Y2nq4CahqXnkz8uyEzL4yQw1jEV5Kpjq8FHgRsBsWuo 2kPjecTAWcWg0KMsGL+ZeurMmLz68IlrnYRipNfc6Ij7JtGKShpLkqRrw7UoPUQaEMcL690XrrVx mw7JZ9Yb57ePx/upa2wky8+EX6xhgZzgubaGxrvX3noHY+onJP2Od5/85AO5xpkzl8sr75rnc3pT pXUpuaaRL4foCKqxep25vIQxdniQqi2Ne2rZPO/F/Amv7Zgskx+yBpj3mjMY0PsA4e7tqzQ1WrYa EetBwyod9eLsUDa2qIz7rYGt2j09gCnQtQPEegRQSCevJwrUjM8YPgqiyOLazxrsVhaxXLOJZlX7 uPwlfunJDtWBQYkTxnUVxJAXshdLcZRMqAPad5OJxaEoWJN1FQpXo2cIvgSOWTsYIFji8dtwXvWH POAlnAQjJAQrT0M/FMz6LG2dx4eqgeA6iiCv2+hBTg+Cbg1dAeTsj9xzDVwjOWRcwmRsY5v3A7Ar ohOd5SMlF6W82RpW7QGzlrNfjMghM1YwpCe50Ajzvh8K0iHyluxn4PzqjV9CLl8C4AwaHVZWpTRr GS1Z+5ngeop4Q93vrm9+iwdb2cFPPdoa8vk9XjXzhRhvHRH+nj1UlJhq+KX89TYKzHvyMMp6sKcx nP1X196JTvR/xxps47EDP9v0N1EfuRy5JMVKnjevmCOCzLsptU68YcSaiFB0a07XKo0B+FxeMcLt /OyYSmdN1CyiC2OB2zbgrZEZeVSgO36dNrO7f9art5Zo//fun/168WcPuKPH2/n63/vP9Ous/+lK 6AG+Ec1EXNEVij2NSnFEcIDrHBkzBroOXZXPvR995b3u81d5rd+S/VhkS5qEb5Iw4zuJs2GKOfgQ XL/HqM5fPN9d+P43u+FlGldAAdAD7NcYXq5JQNwI3Oh0W0KQW5EjTQcaXzaAyY2qYqKBicoxIBGL W4+Sgy9oCE+TSRillfQgYGOPZemya1zp7iY3W0t+c7MJkCgxtUl1g9HmkZhH0GxxD1N4A4dp1LGF wlrDQ7UIDeSZZ891r759lcYuo93Hvvrp7t6vfKE7cILOc/v2ZtntRQKcaJJzg454C9SstrzZJBnG jwNST5++QAIkTSMAvGLOcevONg+OSnre1uUIl4MkiinrcRYk2chjBdoe6+J3ISYpiPqjbuAC3iUg 4nlmxyvofVI7awmm7W6okDPpxuQcT7ohX6wfHi1X7yXKurzHC1BepqlG8vd/7yvd5x+7r/vjr/+g +86PXsCL/RaGAmEabsrucUli4TxSR9bYqVafGKX+2DTA2fC1Y78A7cQQzzBeqTkU9nnKz91x+IB1 8Ipawe6+emkeYIAXHs9BAeWq02ppQkHsBM81ZfheoMz9jbNGzILXe2lpRad3EC2s8FKQVG1iaqDz 9wj3aS3uVE/wb6MfHJXuXgHkJfRTs9r629aNZsBVBlJGvJ4t0PW86plPiNjrWMuX8XI9JhteQNSS eAIcLLjgs3B4KhOovGnkEGOEuRwjaqI3c4XE0r14gj96//Hufv5+8+JqgNGFq9fpTVPNMSYwmK6Q bCot5q47D3c/n369e5PSfJcWF7v9GB77AMlmta8zGSub17ubV7ruTcZuXr5lDCwVpp53xoi1Ycj2 HT4/jxJZxpt0nCZE1qu9eH0u7bTvAOhPQ68KhaUliWkIH4DW4mL71l883f2QutZf/ti93e98/pHu LsoDbuDd3cDTZ7LZBM9jIuce10dKeakBAPXchwmXw6yfGFZyqFXG8nS9VnjZrmm1UCUsBdgKnsUv Ai5em4BqsmdwoiqPOPkq5OZ1jvLwetbfxQtmkxjrpMofTc1mjUL3DCc0iXgIo0BKlAbHNZ5/EyNy isRLO9VJ2UiFm9QuthoOIIt7sbui62IFg2QRQ1FAOAEotUTk4AAUG9bpknQpOewMvYBGXvS8DTp8 NnbbCOvNtvdJEHbdsDctEZr1wTX2IVsWWaM/fOJp9sV2EhsP4r0+f/EGjU0WoXeMkFSKQcZ4WEtf wKdxcTeJ3NICzuMMcB8fYV0OsScXiGwcppX30cMzKfE3QanNJRTYJZ7ZPVxJ0gPdIfIgpidOoFhH 0pxmfn4OkG3TEbvhDVF3n+d0FaWaETKNfRwjvQG7+IQDfiqq0FcDcf5GxvFIo8mtYx9zxFKS7ClL SA5isE+QXJwKNchmz2dZtAlyRbzWqnkXrCWjIdbXrt4/xc3MXCvBGi1N76W16W+ybxNhYp1LI9mi pYIe1g2pXS6byEzT6aRylJd9TMNYgMy9GSIfd1z1pCfKIDph3ptHVOSxjGw7f+Y68+EzsOYxLFfm kFtcb5wmTAK3cQxp17gRveLbNqO7B6cxVgR2TS80p3zqvvfIMQaIwN0UjzI0dgBZwHZBr0BxDYM4 EMowHmp8evWr+ypJ2doglrSM8wPvMpGLj3z83jiwzr19KfOmTFzAizstbYQLKwsmSJIXaBmFylLW Jhb8cj1iDERkqJ+dejqCz03WlzWht4hqURKX4vo3SZCX/7+pEaOc5L1hKoiMG6Hl2oLW3ugyojNg bfgYZLyh6BadImdMPK6SfGU8VYWV+r2qjbTXpHw05BZb0MUerV3RsS0jv1ZP0YgK7a2M34w7dawt sjDIvZsDxq1zPzgQpJAEWjAG9s1Ax+6BZmNd95pfx5aPy8hRNTBGqp1QRPxce4weaHv8biDs333e R/RZ5rUAbsPmeYbdVJAebPcg2ON2e5n9uz9HcETGpwwWZSa2Ad9SifTA1RyIPfrz7qy19kt/HzWa f/lr932+zyG5H59hN7dbvSGFEWhNAjz11tE5zseH4Pq2UVzGY3vhR9/sVs6+0W0gPOcQ6irBlAJC qI6kAgYgjM1v6/KE+N10KLoVPEoCaAWdi3CEcKaKexBF6GbTwg7PlgUd/p9WsOBHT5fttaUaBH26 o9xgWpauMBWmYR8sUy3mpqAFre6ANetWY5mmzBmC9/ylpe7tc9e7PSj0Oz9yd/fRL36yO/DIQ7XM 3UHmnWfT1WYeAuTvP2JV6trUewH8R4/R2h0qwAqbdRTlZMF+AZwtVb0lb9fAWUBBE5r9wnMFijka myVKIQu65Ei+vHc/pt0ihkyHQR2VvOgG8cQK5SErIei5bqs53jZPxjGpL9022rIgHaBsM4U7Thzv fuc3P52L6sk4TXLVuo0y6Ehn2F6ls8pJBHZrKL8NSylN1VgkSUfuoyFxwSncc42IfSgdOe8r/D2p AFXQ+Zwm0Dgi/q5h1ASRgMOmHkpzN/0awHkdKkOqS7CGti01BZBSWaeKiaUbUVjDAUXlBdJr54D1 lRGUKHpA0/xFHqh1jOPhq/H175tKHHmAfC6RBkP4Cl+9NyqnaGgpF36gl6oV1kwOQQRYeVOzXHw0 JjPJkCYcFpGV5U/iG8J7lAvtW6BL4r598NMpc0fE5yZAw1qrC9QvnsMTOUEC6BGMkxXW7zLAZoNM almCM1x/BRBxeZHmQjaKsa64lVqSUq9BUPfcc8EFNNcA8WcNvRGn1Ui5Alg/IH9Uzz+PJDi0vrV7 TI/nLKD7Bobjiy+fyXN8gpJ799IwxgWqp9xKNiYx6vksRcbceO1sEP4TrRg1UXDLr0+OQ0s89DaV DWmzLhXFBF4jFEZcSmXEyaiBhCwRCDHLmZOqUW1Sah8y56cVBlzfhsv7DZT7cKexbvXiJeIisJem JY3DRCXuwwiJwCMJa8UJLc+7bxoFsrJA0djCVXR8AAxr5EQM0n0zIWneTz4C5/DuNeJRt6W0WGEG ri11mZCz678VuE1zlHYNZeLi9kr33KtEK55+o/vspz9CN1bq7bqBFW1cX0+h4WyNK6uE6H0+uHdv 9wbVeN7AkLV9+kGNJRr6nKD6zH6amhwksnb8yFp3g7Wz96rtruXDmrBXCXzjUEnuu/sk9e73kWNy o3vp1Te7Jc7Vc6+FTjGImJfV0LkK+5TPuTyC+c7vTVY1eZWW6/yzvJ0us0SUmNPIMOa6mjRhLACi LdGpYVJyrv5ffHiBXAHM3XWhE+Z3vhPlqDUT/jGdXV3TOxU2GgDtDQLlS6KhWbclS11PybvJkqt1 liT4hiY0RKzIpJhagEqBB4AkwVqvib6ot5rh3pfHy9w2lBOvbx6pxiqRGqmKxlYjhNxAJbv7i/py jW3v2a5xD0Zvz9SPe26cczu+N+VpOFbcf5pCecpEgYuXvYFDYRC5MkOuzbRgJvelIVMdNn0Wo76u 5XRHdjx0bGQNGAllPVPVQ5mrl3o9HvK6J9vL31yCgohhTzpgqAbS1kzCtjyiteC9nuczcVVKwBaO qORQKJezuEoGpzlNJbikjndxpfN2HZ/J0btf45dIYb92ouzyyPUBNXS861U1KnkX1kX3PehBVaqT CVPvpCOxBC/3vP0xVKCuL+lkUoV8WCOjVYEnutvrqCPqsjXVTbfUqqp7aYf1aj+Xi+ONN9jWFDuo 8/UAtCIEDdbUKXe80W0pvCcQ70eiLd9cv0areaZd9F5sB1XU+7nP9vO9frzXeX/B4TvX7a+fsWof 8BZ0NlzHYXENXTSIvJ3YxjmmsfzLTvo36f3t1YVu8Q2oICuXuyN3Hw+QWJijJTnAx9rC59660r39 2gV4XyMpBXec8l3T+0FltitnxNdZXet2YTQ84+IiKWJ4nO2KQN6iFbih+XG8S3IUB2kUo+caDceK JNyONY4kqFWRdtmixlKM1WFMsMV1ENFrSwvxiJsICYm4u3r6CiFyJhaFe+PGSvf8W5e7VRTj41/5 WPfQ5z7ezd51Kh5EBUdwsHtdXce3XsaEfpuJ6fv+OoLi3YZDdIEQvx67vVBJFMB6libHKGGHsUFp bLxdCh9Dt7Xy9VbTQba3D/KZJPJEEbVQjTKgbbgkCWlt+pobWy4Vvwf3tZ2UMJVytd17FrnD4hD5 2Sas9GDP2b6bExw6eLD7/OMPEyJcwhMNj475s3WzlQRSN9zFD0DU07cIYJ6fWMELpWer1RnmnPOU L5un0sU08yNQU5jOU+8aJzwGyFgA+AohapO3LG2mANGLOskcazCl3JlhO8YqISPA+WCqJ1QCrCJG IJRObBw7YbUYXrfUnUDAMmZREmkAQqIK606QZ2OFADMFWu/VUMHqNUIp1Xs1KI5R2LnNcEjSDesz rbJbYl74xgGyVjwpRV3Hq0AE8l5IZdeSwTi/ylvwbqKb4OMOvZRvT3anL5/vzlN67yxVaI4dIdyv 0uL5LdG3yHPdgMe/iWLUxLM1t+E8W10vAsjX9eI14V1urh54ltAMz5ktsUT05hLeSZ9zbolOjozL EoaplJItogEaTCbZTcK/tv75Sy+/gydztXv0nhMAuTHoUsyhCa7xjItdS6OkmkRAguBaakolGQ5L 1YkxWFqowEEBjERO1Cyp4ODfrsumEUPjKTC24Y2H/+nCLY/lnlQZ0riquQBPJdycEnExqsvA9CNS Haz80FcluGkbd94Yx+MurUpe/DzGcDrpMXajJgEWFgk4SbMkDSjuU4Mind0yf9xb6orrsZaDG3iT +U0ZyoiLomk5SPG3hlOqklcuudk1SLyGG12wyxzg/fzxU68RDRvpPvvRuyj5N9It4L02wdRoyl7m JVEpbtAIjbkQU+yL+QW411dvhCfvaxeJfthkxuc03+HI0anu5J2z8drPQ32bAySK28dYYwLnk6yz ldWDeMdNrl4rz5myxX/RygWIewpOyZ6at5Iwpe57Dq3lOUfYy1aQkc/rnjbnwmRMjanwdOWUIzfG uEcNMPfnEArBz/jPz6QeuS1G46A0Qlce3pQ/dEkIGh3hFnWpzog9vaIHEP2aKzkauCXw5wRxiGYd mWBetB8fJw4X38888nkGQQ6xezYdL92AWZqtHn8D2Lmycjh0RAFk3UvWvLIiUqJkjXs19DZf6e+5 JTgmItDoPAUk+/2TX2sdNWumOlYW6Nw5n3ceGef91OYLfUOhX4IqMjY5Od4vHmJzDartfJVeLYqR zp6iIrpk48UOZaLey9jEKKjSmu7RdcdOwyflLbmWW8hxAGBrCFl4IItKQ8f5dU4cjzR881hzeJwb x11vNrMWOklRlDKe+VjRZFwBkS0ZlxrrHtzWq22NJPLp2inh4J7MvfSyp26E+6oqTDohqnRgUb7i wHL+uU9tbyMQO15fb9Hz+LPdizIyvwY8/OUvh0YnmeftPdM1ps0I8XlqeezQNXoA73l7L3f/frvs +wJk3+93RH83tULaffJzN7Dtj+/P23+m3VKN93s/2s45d5+7H4o8H9/LjPUN5a90NOZkRoCNRfYh uO4HlfjbwNIZrGAENZzjUThbewg7HdbKJdnmGo1ezrx6tjvz5iXKeV0O5/HOOw7RxpsEHBTF9KTZ 61PdNKHW4b1uRsuxUcMXcBehvFAbx5D7CBSRwcmGItgU2wIOKi4MgTgGbUiS1e+qcwnK63PDmvSh VYxC09UrQKKDXeQBYS9bYL925lr3ze89SwbwENU/Ptnd9emPdzMPPAjio3yZQpuzqVjjcW3631Va NnEtlBjd/JwEtM9RIeW7P3qx++hDi90s3FnbSO9BcYRqyG3K916n3J3tX4kw5XPiNRMO5B0SHQuI 14JNczV1aVvFuWaTm/6ejayz0p3mcSq99p1EIzcU9xqvdjs+m6bkYMBIwKDXw2DYS/v0j9x7X/eZ T6527+DJ//mTr3Rvn53r9u9V+dMgBU+0c7gNIFDZr1rlJK13K2xr+PwaXtdFqDYHKM83gcAWjCzy 2nWe9CAdCW8A7Lz4iM0t4qJUGZX32S9Dwo6KSt82vzchtKnY9T4GiEXRF6A3jC7nV2+39+TWHOTv 6t4nmMZbLDFZoejfKoy4BkrZ5TomxKmgpBLwbckmU9bkxCtI1uEDm6xpOcA0DbFrqPfsm4aS5ezq NYqir+/exVfHlEjT06ZjKYl9GjK0gj90bH/3Dl7rs1A33qRM1rd+9Fz3td94rDxFAJFZQM8BDM8N 61kPYQhi5OzBmBiDcwvzpNsQvOiRyrZoolMvsfsj66T2yzaFZq8ukJEtvYpxDZBAkA1KT0LBWi/C Q+0QOI7hqjH0xhvnc7+ffvhOGg3hATbBNcmDgmu9wgJFh7AlIzF2SeZyDAImmqcuSj+aKR5qmwQJ nteImNgRNe2TVETyGE0s4285gVI7nCtrMVeFgQJTRqti+KhYk1vqs4ZZ6Qrn88XrzNbgPcGr3mln xjHRc5rayVZUsO4vFI5qXlVeqSRKNzdhvOVSRnxdo1JQq2HXwFj2kN+eO2siWjkFNMt538bBduHh abuva576xikCFa89jnxzTz318xdSbvG+uw51Jw/ty3nmzl5NNHAWCpblL12PVuVxL9x513G4+4vJ kbhArsMERu01uPxLgNcJ9s8s1JdpvNqzB+gGiuE0jaE0LZ/epLMkITP73Jue73vvPtFdgve/xPk0 SDaslCTVysQ0xkWaQgBu5tipbx5F5Z+2JP+sqqATo4ymotgIkqUQ6Xl3nCwX6bHuXfMspJ30Ru+w cjFe4cqdCG9YIOSMZhG4QprHOCjKeFi914PYUFW4zyEMsW0Au2Km556795JoKRBrnk0PsDJNQBff RkvlHStWfY5tjW+b1aAA4mVTxrCYlEFZ8968VAeNRq4d0luAmOtY72irhMK5ekCv1zUAeQcZNrDS 1rnPE9AdfXY7kMmmzjXswJgGTJH/feJv8aULy1ezJfdH6A1G5FjL48iQKXSw+UNGM2eQk0sBuepL rqkByb25Jr1Hozpy+J1AGxAJPmM22m9BeWtk0/4VzMUKiURrgk+bwwVhE+2yvGKGyaTRilJ7kzHA 8RZ7TSNXg1TusOFMaC3eq+FeHyMbrAB01l1kdlsTzUjJcc6rp27yOB/O3q/+GRb9TnQqNdUbd7od M6AxrRTJe8puL2knUz2qrFFpkZYTdhy2cPCh2yOLWsmN6FIf1xuoVKR8ZS52/fSJsIOTLOvhPRB3 qBJY53Wdy+ljJv53nHx2jvX4/rvHH7VC6qtBhV2vvPs+vJfdx+z+bH+f/Xl2/92fpQfHu5/nvS7W e6lvf24/L0wb4yEPHphC50hgvAmdCOowwu5DcO0E0aro5vU3UXBUx5icAVhPlfWqBxkhLBgeJWw5 TWb7DJnpQ4Mv01TkevcmPK9XANwmGB1E2N9FfdeT9xyjesI0XmUSr1DuE60pzMImNTit1+kSjiLX siyQ3Mmdhq8qSNbTs7NiEtJ1lSrtFcJsJrycoQvgTVm1ZraKguvcoN3tM69f7v7Nz17vvvAbn+o+ 9dXPdfvvuoPKEnAtuZzgJBuHj/YhHMFunzDXg2w3gacfx3S1k+ETz7+VkP2D950gLLuPxEMrVGjR C4RNmmghyTxTnFhl4LqBXNGN/tGfv5cd0ftuPjdx22RpIKiMVrhGWBXI3vn2tbajYiB4zWYZ5Lzt NTexb03A6733vju7T35irjtz+jqVLN5MaUJblx+gzJc1UtNK2O/m6U04zxrXhHkW8HbqgJnG4DFB yjJPVqeYIzR96PDeAJ5hDQ4li4ok3kwVYHk//C4OWNEzwoFEaBtGi5HBBjSU3PMLe050X70gCYkN cEX3ohyq+V9l9hcIKoFnR7xBDacoPcFVJVD6blUm4Td+rKsIw7MuIBdvbAt7l0DldQGgIECvkMZl 9KbHRbRX+FRlqRHF+wfg6Y+Ri/AQ0Z4z7Iufv/lW96Ofvdg99tid3ak7DkIFwStP6HY/3m0qWwEq 4aqrpKEDCEinTMzDmFtZJFkPsBJw2Txvee48p09Z1XFW8HJTHwsPIiXZmBuvPQbwGgDMyM3W2zbD /vPxXyPSdI3oy8lDU5Ry3IcBTSdAxk6ak3Vqs1StTdxitQ3ShtPqOhrC45SLMreZTwGyY2P9dkPQ GftKYNRYE1xVcqi+IkAX29kQoSUF0zHV6zKA6bCp5zLArbiiKfHnxTiX2CBVEuLZ8/Iq32pQ4vXT fAmt1TBwzmPYPF0LTXhlV0m7SL5Hu5fyODugzJ2Jxd6XxpThaL7tgJm5dvgDphCB3MuwPF8+ZuWZ LKna3lyzJiflBkNhqOcZJoylZ/n6tSvdyy/f7F56/eFEDA4Q0RmTt87d+Rw3KNFopSCTkr3AKobB ZSg/8pOPHp7uPnLfMWqnz3RnBOTsu2dffDvcfttjP/LQqe7TeMT3MvcbGB0mQloOcB/XOIzhO6Xh Ru6CjYI2oCKlzJoVUMag9vEc0gcamyueuhJfBUiDRoIca0ytme/w65XsOzgKtAWuNmuyWpIdUZM4 x3hZhSgJq46RxoxGVDyT/hMU1lrWmomsyFg6Jj0EaMLUkeLYUAUiSxhjdIEVK7YA2yk7KGhzTSh7 /Xg8oybC4pWVB8o9Sj0SaqX2dVasgEwKkIZ8zbNeeD0uennl2IciqOA1JKs8zXnL7Ius82LBquol 12gDwQLFHFMg2a++8ki1h88r9YaH7fpcnK0aaHrCpdb4nXWdkYxxIxgukzQnzr6dSJSDyKKRQq4/ zXzYACq1M1yTHOpeSnEADR2jNlIrpe7ppGpRqsr1qDlJ+TqOX2LMpjL2rJ3Mq4aCBqeGilV+OJdK wspGHhd9qNxskYcWPRRH3NwolOqa2Nbh4RCV6mje+1vgdWeAdg9XG7sYT9m3UlCdy1q7KdMYo43f Pcb1zHopAK9YEewbzbRfhbJEsgiyy/LBBp2S81RRnDjZXHa539LHNQvv8R3ZUECzxdyjp4Mvcv9W VtHoU37W6xmHd62Eeu29gGw/Fv3xt1bPrVHK0m9/3v5+9MeuAe3f383v3j3eu+/LY/td2d9z/3f/ U+NhP7S0vXxHrWcFIKPfNYl/A//YXkfZXni527hiuT040ih8a07rIdpGGEf5yZsGQOwlYW7y1B3d qc8+Rph5iYTG+W6BCgZnXjjbLfLzHF67Z77+BBYydTJRtHfR3vcEgGJGBQCHYrXRQvZdX+hmDlML FqA+bOv0hO4sqcPKk7SUElpWB2C5CDJUXiyddZUmIFqahuUV1pbmWYx0ygMI/um3X+p+8Ozp7p7H Hul+6w++1p36+GMVhoqlLuBQCdYC7CkWtalr9fRZuRGcWQfwjKE+HCG0/+Ir57o//MaT3W9/4eHu AQyItEPW2wBwwB7IhtBQdgOa0OgjSA1pxnM2VGrs82WihN8peeX12yb2vdqI7Z68rbayE6ZSgLRd UYKidlNf/H8ntqQu4HsJj/o6wu8ogOp3MTY2aKBzjQS261fILsftIDf9xg3aiJsY07h8ek6tdbyM Qr4KHWgZo+IIgntQJQUQ2Eeikh54s7ItI2fzkhlKwBneTk1pQQwc0LnlBQAAnlO8aoKjJYwgFbQe 42C4/tl0nijk9XCMBE3lXNKOFPImMPow4RAivO2UOKCX1jWpEE94tk4Wha1UbIAgQ2X4UYHfOt6F f00YeCOhXBQEa6jOU5+vPBs+GZDnvVRFij2mkNsqGWFedbYrxJ5GR9yb5RU1SO5irf/W5x7urizP d6+cvUBnxmvdvR850W2RWLbFc03AoT3IPe8hMc2kLekgJqitcY0h6mbDoo53c0/aeTevbZNg1dRD r4dl1rguynSUvbP/wL7uEGXFxkk8tm/KKntvxhrJgCyT6H7+9JupBPPJR4hGMU56Sb1fPZd9ua8k /jV4lVJvKhfHIwKyAE7kgF54X0FhWWc5JbAsq4LbuedQxxFkQm5bs5kW7suESFd8RWgKkMQLqUJL qJZ5ksufz1VtX8PSqaFtmURbPWM8wFjPPhHQ+csStAh5xwKnGSq6yINeJDnNZDo90YPsT5WZhqFV VEx21AuZKh+pzWwjGTnirAHpm3q6OMZOjt6nQDFt1PV4+TdGzZC1c8MPdwfLH691EY9rKATV+MV8 kzn47l//1lPJh/jKpx9EppDYbbiee16AwiY4mqajrfXO7Zy6THe563Nr3QuvQafQUBK0cOoD1Jff z/cFKhqdO3+tex6j/403zuExmu1OHD+QSj8mNOpZvnJliVKjV6n0s5Bch6L9KD/NTQEgx/jRJ6ul 2iu9AtYC1WrIpLw0KlW0H0GYNC3zB9x/dgc0mdX9OjOLcafOiGsOCkmaTBVVx3keIxdBmWt1Hi8n ECphVl5r/4ysC82gIpwl+upfX2M74NoupwHcFYkUtMfXEqxe8abQ15BXlkkN1UdHtrLZ5kzMtTQh x8musYWGam17TQ0QNFLupcr/2d3S/V7GdcRuDPsauBhu3ohjFhBaN1NPVwZJwCTytpff5ZmvKE+h Nc+t7OITen3ZE6kP3oR+DvGaMRR4GKtjqMvkumOtpwMmz7YHOWttarvmrnCu4dZIKE1cCn7WQMcg 0Btfr6WrpuCdv/RwJ+JkZFC62h6iJqGo2cI+ZCmod4JrnG5UrKm2hz53GQXb/LwJxxs/d4wnqXY+ ZKJGUYhtVhUKGsOuQeV4k3OVx3BrWWYd9MjQW1fu4qDpnXNJsPR4jbdmwOUa8ccJ8EUIVrPyRNJi tIjsHMz40vVyk32QJmTKVGVCEvM1aG4lF+bWanvvfHlf/W3prFMaIJ6Si+UTJnqXSWLukVE3iUYl oVi5FYyjDi/Q71cPqnd7n/uL7brszth43M7yuW28drb0rtf9YH+e3e+/l7d79/t+rn/OXdOw81p/ zloh/V911r/R4PomwHrg6lvdwPw1QBUbwpAZdZajBAVDCOshvJw38XxsUcnAMOsQ3pDpw3d10zaU aaGnBynntUG70UvPvdq98uMX6Up3rrtycZ6kQqojXF1MWN4GHAsIeis/HNg3k++DZMEfwAMqeBf4 3PPp+7vZY/InmqBxccSrVt6vVcDeAN6ZQUCbLZoVtquAxiefebv7r/7wx93UocPd//5/+z/rvvS7 n0PGE+pRqjYh6B4H22fToC/yhf+v2CftZxZrE6C+ejdK6/d/6xPdf/0vvt996/vP0/mQqgzH6KqG IlEUeZta6H1ZnIRIxGGeQ3qI1rDHuJG00P29AWuv1QvgfjH3m2VHMHtM00MlLAqoeNM9baTf9P1n fK6ErLm+Xum9EKT3HZvtvvKFx7onnn2je/qJ9XhH5+bxkCL096IwreJhDHh1ybrGcleX8KDNdzcB t2PTAB3BNAJtL5xsqawCE0tarSJVBg0HSKcA9AqKTNBbRfHqJckS4ablZGpMyMm0Trd1caMwo1zL 4lFVyuu3BrV1mvWmCAzctNJOVGKreD7t5jdgbVOfUyUWtFYjmDFVCfVUAukhKoPSTrk/jwz3MKWr vA/uoXlPVJDxlurJScWWSt5R+MszlD8vMJMC07cgH7JTGO9rkOwHOH0aAPTs26e7V965SCLpVepg 05KY8bsE4JNXLtVljD0lqF7CWJjTG899Wf1iaIMSe3bOFFBp3CaqUOMkLSElMOM251kYx3ES3Q6c PNDtZQ/dRKrr+RQ8CTTlLl8+f7W7fPFq96n7T3QP3HGku3rucvInRlMBxaokog7/k+riczJQepTa Qotn1vCujqlGI4hQbwaL3uYNzuH6WLMjQwB0fD1Z7BWB8GW8X3g1bNOcEoFyNAN0XdSG9ktzmfRo JCN8UefRJMV44lWK8kqtk+t43yTCBhUp+Qw4B3imMQCF9aATVWJdLi2YhGrkg5fYEN6DzxLPduN5 x4vKpcM79/3wwM0XMXnRLaFxwdzwTI7RCItB0OzYVpJpgSjXevI29Fr7Oe49Ne1xSMxfW+iefeq5 KO4poniPPXCM0nvT8N6JUhjJY8z27cUIZR0eJjI4gmyzfvp1QPn3fvwMewIDk7s5QELsXXcdhYp3 tHvwnju6p555HU/2a91bUH4u3Xmc6i+HSWSeJdmYcWFML+HssFrNAHJzTIEQEGikSmBUUZ/sml34 usRiAa/gsTgkW3dH/kwt8Bi+8tTLQJ1AJk5RachIhrQcqR+jAgjHBaDq9kwDK50NqdVZxoInN6G9 ImZ8t2sV8GweSMGtjpWA6nKSVLWfovVUe/NatxXRcjlJa4BqgzFjo6z1JM86vzYJKuNn0H3MuIyO Mr8mECtHnHCGep3k+ML4rs0aoAD81GOvUes9/Fnp8OsFUJlz5YsD1zLkdmo2J2HzFmSp52tOngjy 9rd7hWsZ3dWBk0kyuqTN4lb0PrybpqTisKBykd7WMdZ+Sh9GliBjeV2KiKBZwC+Yd/xanCDn0RhR kRidMaHRWvPJSmKMHB8TVRfR+8PuGc+h19p9IKXGz+sIAWhD+IuMsPNm1YyvfaEYSATc92zaFEpX NltynYplZ8TCZyhv/EBK66r3C0jXH7vgZcKy7ZiID0Y2e7E3xepnntNLOS88R+5cg4n14HNsaaTB Qx1kYcar7zqPQVmAfxAs5K1nXbQl6ilboZPclvcbnc//ehZ+u2M84ZwMA99n3rhyBYBN3f1pc8TI K4I2gYejG6ALsyNVtbBS1XjXKunPdAsUtyHNsRWLra8eN2So2mu73/e1JpV37rv/bC8HPEcPnned Oue+/fVds5FDew3cZj1/e8zfWHC9vUJS4IXXoGRcjsdm2PitG9pse3i2SsAtrNANNlcJMRadoT43 O937fN820vEI4JkYgnt96rOPdrMP3Ns9jCd5yXAkfMOEZ/CmyS/cwNspz20UD/mw4UJmQWGtopUv NmRiYxS8oSflSiNMsBEVkn7jH0lVEQXlMgDv1deudD964nW8XmPdb/3mZ7qPffahtCpfxUsSb5S4 kYkWZie7nK84kUue58tNlaoQvtxW5xqb2Nbkn3joJMru4e5nz75F8w08km9c7u6943CEjCBhklJV JjbK39Ia1uq35a+h4gxpH94vvNE8LCUvcn1lZ8AlX27Sdo+996a/ySaHasO72csJUIvf19qzZBMp mFRmPKjZ4nqbTxyZ6b4KwJYK8Pxzb5CouET4cG8asozZmYWbs0SZ9XYXmF9DgnpRk7nODWp1yw91 zvTmWvbOLHJB8KbI2UoweYhWwUGPtZ5mBZc1vQEm1sCN98DxEZjEg1TPn2oLUbJcKy82vp2KtVkY UdJyJMOpqXBflHREp/fq52tr9zSB4m76eOWhSatnaSJRWAWIIrsbyOg9aQEBfCcRTppC/rkn+GYQ 9PampBXPs0YpKz3XE3iLb2IY3H/n0e6h+091FyhX+OoblwBTM8hTEtoYS5VgSgBKq9DNuyZHtcoY 6R0blGKRCicF3gTV8TD5vO2f6zn5B0zAqKE47s+mJ96XiXA2uNFreYGKOSfg+h4B8C9BvbJk3SQe bjnH6+zriocXgClrrYBMCW8Xq4raGvUmQ/i271kxR2WkZ6uAS2g9k7xn6UVlRFxNtThzCf9SCcao aVs8yq+8Ts6ZCpaVVJ6/TIcgqjxq8Zi7XlgbJjXr7dZTlTJ7RruEI64Fzi3vd3pGj1l5Mv1KR8Vg QZP+ilYQr7b7Nd7AAmHSM8IPdu1xPr37QxqQjofrU1PN5OqAqAJMqXAjTUFLWs+Zni8MUQ0w6Wrj kwA9sujfeP0cpRBfoBHTZHfq+Gz2j1V3jDRMJhu6g3K1Al+ahEWquYTqwEOsY6y+/c41oiBXuqfh cJ/bP9sdpWb/OAnWn/rog+FvW47wGaKG58/v6x6lY+tJyizaGl2utd1tIyAQRqGs2D5dr5yUg+zW BlTy+7u/fEIjLI7/uE2h9P5LS+DvUalirHVzBqQHuacmpt1f0l7aXEsBsiue1Sfi3qv1Fu90DKyd zb8T0Qi1pMnKW0C7lmdAaLzDrSJNgGaBKIGdjVgafyU8dPMSLCVpBMAIy6Zt1zXamEfzNvbvx5g1 Msf9S/HT0K9qV2VUVAWhSo6sBGz1knvfc/gsGHyux8b97ZOg48r2GTRSvD+Nd2VjjDLHuDcgfK56 Jt+IB17urxYDx9v4asO8EM4xSo7SkJEdcmPUi5k99x77zUifvGtLYyprpdcMp5mT3ybytbnOHvO+ WvOvrDGXrdGW5lTI3RXQdUxNtFZna9PbsMc9adTT/ZbGQWQhZ7wCrgXWRkZsrlQLKrLXi7gBuUbN rYC4jLhIinZ/tdFqLFz/PV3pXasy41eaOxTA3qDZMeoVVCVHqzxgg34ugSRC6jjxNatOgWMSCWXs PJc63eiOOk4KR6JqTb86Tm2DBKz6SBkpZVWt9yTOmuBL/tg6e3IIo38CZ4FUvEEcRaGlGX1P5SAn D7BtAC7nKpyymxay+7lLKpYs/UVf73Xc7td2jchfOt/7nbsHy+933f6+Nak9h7NTUvlv4Nc2dIrt sy91G9cvUTfazoFwE/U2IFw2CV+Y6DVKQpx8tUVC2mZ9j7ux9XSRGDMI50Euo2HcgES6x2UTUaZq 5uBUN0Mt12wShangWvBFfdjW/zZCKfXnENSGYeRtbaL8hzdbqYw2y4bvsgj1RlhPlo0hx1ePgHVQ z71zpfvmd57unnvtYve3f+fL3X/0D3+XxLEjxSEz+YXLulEw4uOxFgy6GXpLzjCOl1KWhTva1oIL YzUbkGQ1uLJf+zKt0Qm/P/fi6e6nP38ND+86SpB6tdzfFOO0GalYoGKZi+mBmyHB054jLrRVgPfi UqQPVQMQfLyeRAcXouPXzMyEvPr1GOF8C2xH/vKehr3hfwFpdmLTJxHegu62e5pIsXphhOLB2bHu d3/zY9nsazTsee75N8DD+1JOccxoBRezbu6ylSxQqJMpFYZ1TZcrp0/Po4kqejnGTXDk4SydFicn r9nt0ELyZq1PYp1vURpR3rZCNxVDFGI+K+fQkMq96rEQUAo0YwXVe1sYZoKAUYy26Bnd8PwcMSQN uJaOklBsFEMTn03pxQOmghbAy8vkovGKGIKkTrUA3S+VvR3OdtMXUopJkJ2fKlLBDQainX50inot cXkDVyYTCS4XMVQ0GKUraWjde+po92XG8I8BUy+9er57AL7+YwCtq9ByDOHOs36uUoXFSiLWrV5d 1BDB26+HJeChJLrKyv1RYVwNkfKeJUnSShU+F+db5/cbfH4bJbsX6ol86vNw7C9cmOseoULIfkD/ mTcvEHmguydG1hpG7io16CPUvYaXSJjSxi7FhYy3jvNYrk6euIpBfrmJcQLSNeZzJJ7lUgfyvAVZ JrNWGT7Hu5q/pBIIxnUcZW0uKpm1+Toyd9axLxqagCGtxS3L2LzAHquH2PrVJgu73hyvcTxAGujr RAL0pqb8Jx59k063rEKj0cHr8aCq/IMS1N++ZsDYus0oVI5b0VsXo4q7V7EK4jSaXWoBP35XollM EEuBcX/DGPYaYdWOvXjf3tsYuSozUOlc1zeuX++efubV7jOP3kdETPA7SNLxaLdybY3a3Sb0TnfX Wft2gp0mOW2RfAdBxkcfPdJ97vHB7uXXznavAtDffuts9+3v/ARO9pHu3vvv6o4dPUQOxSSRJmh5 VKhZWnyVxGUagOllZ6xsOrKpt26y8iAsu6g8SI34ZlD2nuLdsjHeP8bMTq3WD59k7zkX0orkV8v1 noA2N8C9F6UHygjXUy6pP5z7andNxInPGBlNx9Y4aKRuNHDt/DajMU7syDU9oRUhSgfE0HgKjAW0 uqcFpc2YV05GZRjpsfoT420jrBX+1kmyJsVKI5XbUayb5iO43tpnlMx8gT6gXcZESsR6Tq4RyoCw q5cJ7sOAZ3MONNRNCrYcoevGNSHA8vgyJCpxW3RdErmPnsX7HBxYe72vvGP5x/gYeNN1u87YObYV LaqKMElqTOkXPteiCePkXLhf7fzpiTUEpTOtCX5zaDNg47SwNrdRG9d2eXqVx9Vhs0GpGPdEHd2T uKOcW+lMG3uY2wB3nGQjOt0YW8pZJrnXIKaUOQG+13P8yNBOTodrIei0jVGcWeUUKYOj3oph0Y7x R3vMGr68oLwp4d93cSz3StHLouiVH+i0tH6P58zwFXfYIprlJrGWOtFZDREcZDa3Kv2qvBJvsDYY HfeKVI/M3q77VIsY1RJgL9AEb46iDzetBY/TYvnSZbDVtW6fho/UV2GMekSKiuUso884GdF356+n wrhbev3fYxSfuge3TbX35kIbtPrRf7b//O186l23vnO+ODbaaLbRrX30Ab96jOGKE5P0vPPQ1zM+ f9O+CKN2l17uBhcuIuxU5u5kJt4qGAoUPYexXCmnRPZnyPfWU922ra4WpwtKLxVWuw0uFBwqFBuM 2OQDBZUgatB2Q42C6YoIJswlR1IAp+djZGqqkpMC8ORMBE3B917hfFp3Zrab9CZQJwz9DqXfUCYb CMUnnznXfff5M93Bhx/o/tbf/1p358P34gF00+Ft4VTJF+aaEl3cnHpifRxfVz6GC8pxMZbbOuhB rKXMylK9CYVlsvvYwydTp/hnz71Fx8eX4R/PhFM8BZC84/BU9zDh3gmeRw/iIiXsFqg1axvWGUJB toGfsA4nu7MSJirsXGityqE5zt5Xb7lmc5XM2/nK8KmM+DYUpXJMSbd2RFg6gtk4PpxMBQMC11KI nMwmIw8+cLK7n+8XKM82QufJabxmWttreChGqdixQl/VJbrgTfLZoyjVcSMARjGQcssAK8tw7cGI sjMlXVVS2WNrWS82z2Xrdj1iPNMeOrIMYmDYDMZEm2GLy8vF1OOosuT+LOdkvWIVVJRmkLTeFyCO rXX1/AiUY6PJc2XNCCp5YpMoRpKYKMgsUWS99U1D/iqfTDLXZr2qHmzHXFVM9NouFH1CC6dNuHQP u1XKuVSp2S7ZsoKCgW1r+9rQx9bg0lJQOGlOI21AI1O+Oc+9cANwA2DfywQ8QPOQn4IC33z+7e5l wNSnaexz74OHeX8DDv/Zjkbq3d7xye4Cv22uLlUr9hgrzXPq8nAsDfU6OI0eIsC07fswnssRALvV VvZOkKnNuE4xL5N4YZbh3C5futrNcr5DDNSMj+k4MyYrNAjSc773yP48p9e1XrJgaAgrT49XdJjR Kp1NsKts+GTDn2151oJeQ7+sg3XOZe1tAYReTcH5niho6x47D1Vn2FWcUocNmDrPUXzxmBVAT5UG 5koQJTVJAJFSac5pvORGYph3Hf8CAe5ZAFs1wd3L3rRzXkjL5EqjSI6eEbgofM6dRCVBMWtu1IoB yD27VwoqJgAA1+kAu2RtYMbIc2ZPemoVbDO84tHU0EkcWYPHRllGWBRvFXVwbef+DX+7PlYH4cDf 6F58453u5KlDRIWZD5wW2zb94FksXXmTMdYZMI+hNMe3I3cNvuZhaCSHjhzieBo9oaz1wL9z9jry 73nKPdJ59ujRbvrAAStydxehodxgv91xz0Gqisx2K+zllQUcJjyjfN2AJ8ZoFSeKxpYALB5694Lg KM9bcxERIiji2Wxo5ZyNkUw5TdOuGb5HMbIrrYV96vpMiJAPGe0xWhBUYoSSNSGArOLy8chHDlqK UUjKHEf+epzeXSt3pAl97d9CPTXODjlDmRKWoYsY4m/yz/KLgukNnDR74P4NMA6WvXTthGaxIe+e Cie8poE+uvcYERd4t7xn2To1l9HTbcvMMRd66W1mlGiXlZU0vpig1FeW98x9aXx4DyZt1pi1tRHv h8/MD6NMsfobkBS4JnJQYHsHTDo26j+xOK9LHTtPd8990IVmT1QEb5h9Z2UeKXRjg9Q7Z42tECEc xSA7dOoA0bJr3Y2ry9ZIYg1vdcuMmfz+9CNIzovzVKVN0xo93oRKDPVPvfsaE6kog3NFvb9gXgz6 YZmBP6RR6Npl/0iTSllX81yQHVWfvtbB9rozW3LEPWykZM9ak2VZCy6vAvxZZ06z9bKzn5o+bkqw Rqh5+5UvGiCRKrUv876Ggh59l272uV76ol3EhDeXwnUShGrEUuCsTICyuHZDDlPmXJ3IBUJ3W8cw 2HNTnYEeUK/yzKq9rFpA9NriXMZljYjTNhx/lAcsAByEV690Q8tL3TD64+Y89wIeCPNtL4Z2ErDK i58ShpzXEqRWieppIQ01VTQn49SelV8c02Cyhg18z0fypR7M+lp/jmAGx6mdo8zd+opt2r58rf+7 /0xp1XICZth2Hb/7V48RTPf32YP2v1HgeovFcPPsCyTm3KjSM6yYNEPBqtqwSgGjY5mdPVpxCBYT ZOxamC5kmiYJ3wiOBCgsGmpL21VrmKoFAjszx1Ws6UhotYbMsJ2U+Lz8P3cCG32NzHc7fo0SAh3a y8LTygWUDE6iOFzcerU5v8JX76CF3q21uYmFvHqGVs3793Q3AA4/feZi9/qNze7zn/1Ud8/nPtkN yHE0tOyC0GDlJ48ZcO1X2ewaB95bUjPKA7Xz7WIqG3AkNfHqy/I9R2nq8IlHCfWTbPTim7QZnuM+ WHYXqPBwmS6Go2j8h+450h3nma7zPO+cpdsedswmPNpxBP2BfXoF9aqofBgGLiuIXKYGdcpduZAx ZnZSift7dkO1VZ0IIx7eMYTLeDKbCRfmOASa3G+eeIV5ks+2jmFiwtEkx6+iicyONwnoCDSBe+85 RfnE58OFH0O5bgDu5K5OSxjfWKXc3rUkjE2TIGbzAAcSeR5FaDezuNr/v+T9V7CmV3amie3jvc1j 0vtMAAnvCkBVoSyrimSzyWb1sEejGY1CESPptqUI3etqbhWSQtKEQj2tduK0Y5Pd7GbRlGGxPFAF DySQSKT3ebz3ep53f38iSbV0pe4mOQd1KjOP+f/v29/ea73rXe9ai+Wxq8EazMomv9NvISz3aSs9 W/rJYOvsMoqeccMDTNXrBnCHhXKFNeimjQMeeVsBOOBXEGyhTpLupuD9z7fkvnYo9rJ/bid9jTNG W2DvzxpwmOuOBXO9KtsoYy4DFKcvWeC+tjDS1mV2OeC9vdaMQI/xBkSmXZRA17SkV1oHTHjR3ToR 06KsrQGDFqWXe3aK4yaAbB6dqwVBwzCnhwgkHiHb8Uevf1i+/e9eK0N7PeXzn32C3zcDwLWxhoPI lzoBygYCtseLwNs90ugK46tlzA0AsL41MKlGrBNWvw9g0Mlk0wnY0R5eYxjwO4BjmL21QM+3pXJM jTwGv2u7s0yRgVnhPRbm+DegqAeGdwVd6uoSAMQWjLyFY5S00Lqk9Gfn/ueBbD6xAfrSd0kZ2yHE iJSf2oCxUR+aLiEy0gmMxVbaC9PXjrKvz6Fb6Rh7McykztX38B86GH6t9iCpLfV2sBe2lnPv1PKq Sj55dnrYyz3pd+UBkn8i+DOYA/AkPQsYynAZARFr3WN7wm4cJcypgcCmQINFVLerbZB5c+/ZG9g9 P6eEjdRtZ8vB8ubqe3eVBgkkm3R2QIFA0MDTLihmOmxlJtNn8KHD5HX22Lf+Z/CxybN48/2LZNf2 lS+8/AhdYgCoAL1Fz4tsMhck66q2eWp/Ty06ZU3vUfjo/rLX/CNnj5fpAwfLt7/7enn9Jz8v92Gs p8mCjDLJsZtC2b6xCvAkD4Zw5k6c3SAT5Blw7Pom7VF7eU1lMG0UUloDIlBq6Y6jH08wIdqpbd2M Klw3+6YPjw3zXiNpDRgCRZmU2l+ue5tgS/DuNhaAOBbes+nzMkDbJQWiLUuxmC+vvt8eyoJzdxQX GeFCnl2tLwgIVSbgoQlwVd6BrROgGxBwXgW9XksfwHjPVpv4st5BAnsKbRewPW6wdJjiOavPt4++ 23CA++ik3axtSFcJNLe5zx508bVIBulWI2dRr50JtMp+Egx47eJ97Ai/241NtCVky4+EtbVYO91p 3CcVzCVrE+QhaeDtfMoaV2AjkhLY2sYOu8y13iU72y1BY5DP8zNLYzCyRE2M9tL1UMo34KAh5k70 nb9a7jubgTXqI5pehUBbcngXZ6UulwGGCNS2n9Uv1KFAtXg5HJjZGqV/+F2HjS1j3+cBn/fxVeus 9w77MNp13rvbIm/+Ewd4XeLGDiNE71mQm+4k2ULx85FyeI6yLGqgfT+AbwIP7ZsLV21crW2skrBa 4xCagR+UiKvLHaWhz8PXCkSxVW8loby3MP5GDWYbJbckgXxt9kMX4xv3wDb6PrOB7ZJGPcOcuwEy 1/plCqY9nw6oU+bFGU09oow8v7OxwHwNQHQv6zckduKFu+wzzi+ySyGo2L8L+ATkgd10LWtjrkek J5KSBtT6NLbNCr+3oo/jNVogOfi5QcUh5DV3mktXpEGvLWAtdvBTgNsCttlOzUcLNPunn/5cs9vy ZwtsPwDxfE2gL7Hgz7Z+/mEw3nptf1fw3WL1fY3Wz/+PBlxvzN0v917/ftm8dSWp1UH6UTsOWxDj Aa1FXjUqr+yYabQKcGSXXL3ahsmNXMOm9C1F07WGc9Gp7Nq0XeOnQ0161+VVj8gmsq0bRqqbaLiH 4qMeegN3wIJoRCK89VDskAqFscn4UiNjDF0bRnWdlOrCfVItROv9tKgy7fnd9y7Ss7WrfONXPse4 8nMBl4uALdsFJdJiN/bxWZM9NdSTw9zcJCXuMAoHkWA81YK32tH591kc1RJR6Aq681HYmaMUEB2g R/EAMpDDsJHf/PKTZeElHCgAd4P7ukkv2Tff/LD8k9/9UTnAtb3y7Kly9NC+cpBP+9QqE5Hxnl2p Q0fsq5uMoMyWxgxnt+2UGYxD1w6A0c4YzY5PtFjtbT7iy/itZf4yy89b5LnJwTcYcYjEKKnaUUCs b0AcHQ2prLU6PNPcylGA0+UQxU/TdBFxoMndGbpYWIjC+i8twbrjiL0AD9Ii7FYPz7PPlC/30oP1 UK5hAZrsYsgYgZNpea5lhe4j8clKMNgTa+p6+XBEsuymwZc3UyenWSwICGnSkJnQ6LMKq+Vr6FTF L7UATnSgU84kT19fEGC7rQR0jWFhX+8kXev4aFkGRvbyu7J0ptl3dhkywvpbtBSwxoRIgaVSBx18 NwskM+SUSxkZB4Ek0ALAek+mxAViOod0EQHk61pkx5QC2E2hjmF2tlF3OXvqYPn47ny5TFHhP/qd b5e3zl8BHB0t+9hPB23Ld3s++9yU+9xdJFo8h16AbwVunkVT4hXs6vzC6ETTK2tKqzks/YBtt2RI TW9mHLmjqXlmoKZB9wJAYYX719Gl3Rgf95GLOFrbArtBwMU+mLEhgEYX1+H+iyZSGOEeW1ggOHLy FjdF8bBgYotx4QGZDj+hiFPOzw5BLY1O1OpZh0a3qh7ftmc6CEeryz75n0ylAJrXShEnX/fac3/C LO+f1/aadIotYx2Apv0J85Ytk/NTQU11ARkXLUvXMGFZuzDKlVGzBd6uMgzORyYxJiiowKnXDAWv vS7T637i0/iqMtI1iEjWJcWln7qmBEPNPddzW9ehDrsxy9CFDv5eeRt78eQjB8tZ2pb6bGaR3g2w X/ZNkHoXJHB96sS1zRbdanTpoJc1UH7QTRegx8+dyDpd/IhakFu3U/y7/+jhvI+Sh3k6MrlIgyOj 6dLQjo2RnbWovB+7795xdQ0000FBAJuz6fh5UUIQS83uGTzxOYB96QNgZ9BUjET1/q2BM62ViPTB R+O9525q1i6Zu2YfS+wETPk29fFlf+uH8pEj37TMNCBX2mEw47N1L8haN6x2QFgCaoOsqou257j/ 9toshDbVZSBogKU05gC2fJyMZORW6a1vIbHS9DppMIyrrDtBqHexQZcqn7uEgTbJwVdeo/2+1ebG fzbcXwqqc1P+XxUttCBM3Yf1XrMfNZj5rl/wJT2nBrGAe7NRnEklea75NgGfP9YZUE2Agc0cmkCG xzV67QYN2g2DXftlm+FIZi1FyQ18bwBq5c2rzvpBN6D8Thx8vX9+xSxVL150Hd8uS76EX7zH9e5s IkPpY2AI793Fda4yJ2Mv2asK4fSPToDM9E25GHz6Jl2XKnaoUpk2isaDKcxguQaRx2h/6mpJbmSt DERScd1orGMXWh+y5s3qumea1awFnA0qbRY8mfd0RqoJlj2y43uA4V1bQiqH8zpgss2adEIq9fG5 RHC2Aolg/dgiOERJJWquyCxHBm0/aoBtJoDnZlBoBzH1phY0WhuG79eX6K/WkI6s71LrBqHYT8ae Ix+pEjxiPr3nVmtebyP2ji82Sb6KG5qv+bMJEvgU7zzMSPsj2si6Ys1rND/zYNmavzw4sw92aP0d X7tVaNkC3Z+u+Z9/Fd8nx/0vvPj/KMD1DsWLSx/8vCxe/LAszZA2pHPBEEby4MHxtE1Sp5hiMVdI faTFiLbh62fzD9keSwdTo+maxq+PMtPZdIgcOOUBbqBE6qai+B2ZqhhQmUKmp8m6thGF9zLdsZ3C KixV1bxCCUEyUVwJJHRSo0BbFldNN4d/naEZK1TcKkeBti5v3LhYfvfHb5cTn3+i/Nb/4lfK468+ S/9W9IUCNNP5MnjqQtxeAUl1AuDS4hws0B20r7OJ/DdJuc7NAaTtdICxujuDFvmjW+UmvYoFH8eP Hiiff/mJ8gUmPT770uNlGPZviqBgarxuSVvVdTPqs/3xwxQd3WGAzXvlp29/TA/aQ+Xrrz5Xnnvs OC3RutBfw7Rza1to1aP/02hjkLvJDIy69kTEEq8a0/T5bzZrywg35yPbd4Fns0a07L3O4EDf//h6 uXrzPrrL3vICes6vfOZMJirKxK0T5TiJy/Hwhsh9AEfB4yTFp9P7R8q7t+6We3PoymFeB3tgKWm/ t8h975h+5RqXMNaCXH/PATrpxqAz4DHIsGXCH9/rp0XfqsWQGBI7gciK+vuCVlt0DaADtijWvqQe xEgGAhB1qrUy05R/WycSA8BmWIpWYOZ+VNtr548wWbW/so7dSfbuv0zl06k0bkw/oqZwV4MOQF6c W8tQHA1reu6ykwQLTgsdHIddx7ItspYL99Xg8ToUOantD1utJEldKf85FniFgEEQrU7PvWt7sw7W WdmMbQI14BtKaejScvTQZDTP1+7eL69/8FH55Nrd8lnS9r/xNz9Lmn+4XL41n3uKntWCOtuducaN +LR2bWjcRZxiZfRa+tMhuq/43AXXbTJNfPreq067jNOqrJ+a2wxXEfTwPDeRcMncHD99sBxAHz4I k9ozuS9OPaDJ3+O+A5Dv3imrd+6VDdtuoi234NkUdD+g3HNfAT8LxesJCJPWb6yz4NYASFnNNmvk 866BTaOhbe7TLeXAEQ1QhuIIMExPCz4MqAR+AQn8TAqSKl3V8FjVAQeNGYzx/gahnH9XLoFZjqvO thIEArwtO0owmdSaA2VnGXQlmDbIje6cLFmClkaT66aK16+evzXVsI53brkVv/fAw8dGVOAJ44WE p4c9dffOzXLh/MXy/gen6Js/jjQDMJziPq7Voj+BRMUf2X+ZJGogmQCTPQh7uIS9mqaVacczj+T3 PnzvQqQtiwRCVLwEEK+ur0bC1W92QzCIzXDo0YrsNWey1svUZ7ZtBqlhmaOhh1mrFr6edWtuuvmd fnqnK4VTUhNQVnFYg46rZ82z97O1JC2v69L4oq1vNeuWn9femRmwBWWAUl2zeg5qUBnDka1ZdfMh Ifi7X7ZfevZDnktlwpV4RabAa0Q3LJnB+mnThskonaJ7zhjkid/33Jk9dG/oB9OWL32JYXMBzyly Y906CXTsXJSuQvzbmMQ+8xJAyba19sf/B8xo1qTeanOtZsHc8s1+crWbraqNU3tvvYKTMNN20r2r 1MmCUoMbs5PsC4sxu7D3W5A0ISzU+dq2MvFSBbEGmna4SWiS/2lJmrOUpavA0nW0riABqK6T/5OU 6abn7LYSEM6H3UNcj0jnmoDPzFEdAa/EyCBGKRQZOh9Okxmxun5XEkkAbbFgmPxamFq55Pr82nZl 5r22Rs7Bd8Ku57pjbB5ISloBQhVmN0tbfyp+wTtORuZh6Od+0g4avOO/22k1aApLSVZepgObJuJ1 wqjtNCf7GZiGvIrahUvIR1bwETbK6SB7PoI0tB2CaIvg2KxCcEs2P3sBecjuGu+i3M8hTmRdV7A3 yxZA8zy7Lf4WX/FW8gGC/V7PWvZzZe0j1W/OVI6Uy+JZaT5bOOHfx1an3K35RhOuPgDgUUw2r+GR rKtfAXpLQtKYnyxqc2z/3K7+dMXr77be4+Gv//UH19sUpK1cRW/LRnv8RBmCSeu9NYcua5EBEzeS Shsa7c/Ql16Btg8eg9GXfqZV3xrrBpJpc4gL2DdMb3yIzt9sdpLvORAyTel3KoNgvts0jOlhHPrW BgiTYq42jEa6fgAuw0KZBmMS1B5dKnyPVB769KmE3yWVuo30Qj2TdXAfXVwq37twvazglJ7/6ovl xa9+FiDeW+7ANncRNo7LPOI452gFeO3CtXLxg0/KRx9epdr+XlkgyFjeXE7a2taCuwB5ZQymkAwE 1gkCFkDBq7LJXNj5mTvlw3feKn/8h98rn3nxmfLCC4+UZ55/pEzD/I4hr/CATNPj9QCa6/30w/7x zz8o3/vJO+XNn38UmU0XkoFnaINmGnYA8NCLISS0CHjQqDisAPKz9rvMBhUoPrAT1VH50Rhd7XAP xVMbw8grWJ9RAM5lNHk3kQG8dfdyuXZ9npHIG+V5wP6xY5O0S0TPycG/TyCRA9s+loJKi23UfKph XHd9eeYynkus98rSegbGCOqUTigyU4O5ZpUzRrHbiYpeb9i76mTnCdgsWlK/q5bZlH6rT2t0roIW LG0Mtwdb0CYzK+XgVtEQWGCYSvmHPrnmMAwBmbJQ/qwOuGoV051CrZ+sqg4/a6hDsHsEjkhtP6k3 5R4jE/18jqYdkkycObyuyXEMnJpzgj/6f89fvQnDDQhhL2lM13Fk/qjARcdvwCCoVs7intki3Sr4 saBNYy14ce8vs8fNVvTzXo+dOViuILO5RLeHheXZ8v75j8tLLz9WDh6dDqBT874iKy/QsagvLK9Z nEaH2myAVseUVu9bQZCMlcVve8oaZKX5nQWCxVVA7w6s/CrPozMdAyora+ZgbGK4HDwxVUbIrEwf OUyrxWG1LbX4QCtv0NMwSDqdjgMTKV5LB6HL1zkfl8suAZ5FVspM3CPdBMK2rkrBpc+GvaG0LG0O wyZbPMjD4+sGKk7qfGCQsTGRjnDmo6uP9lyLL4hSm107UWQMtWCKTJAa0oAEwZOMpecjILYBFO7N FIbxNScqChx0srkEHZqpd9lVWDkLd52OyfN18IsZGNsaapcMnEzhpjArQZwmru6/CuZkTxubF+9X 7V69uMra1o429UuCly7uZxEd9A9+8DbX014+8zwFjnQfWiBwucEAGYPCDNnhegOSWBzT9Om9zbny +pQbrBGoDwK8nnnqDFmSfs7+rbTeU+Y0yPNqBTA66C7S0RbpKaNKwNMENwl0Y3OqjCTP3vW020Om 8iGdseUjvsDBNRaPqs0O29uwyNYhJH397wOUD385Kfo4jYa9bKHvFiA3KBJZt77uw+Kzpc5j/QK5 +b4sbnejuxV4CSIiOwgQqEajtv+sWnHnKxhod3FfyltGqT05cQqdOsy1wDpyRv5TI67vS/Gs9Rqy 36591kQ/ZRYNW8BlRWNt0bzK3vT6q8+7tQ/rZmw01Q3wr9g7/1ftZz7r3/2wtkW/4FlUUmNHny5I MAF/OmdxP+5RH5UtG+3wFYbZ+5YsMOg12FbCwHPWvzg9bwtixWducNHq5Z/Q1GyC8VwCWF9EwaQZ Rc9N44u8PsGy+iFeV99v3Uj7HsSS66vd5QK6bNvrmbGrF4F0ZEGhlL1HyRblHhAcyrcioapsej2/ NaL0eloZmxrXuR7ih2Z7JZjz56qTrNmRBok2ZyyBmOA5r12D+PRu90ebZxKA7zNIVyr9CHtaG2WR o5PBuAdyTdwPNR7YJaWKZu0GYak3aJ/XxwV1twmoeV1qlOLH2FvbAOoMJd5a46xJuvD8lSyxRuvU AcwsI/+iE9AA8tFeOgapyfIeUz/FtQms6XxbQbDbpLnth8Fr63S0lqQl3/BnapFlcw6CK+qpTO2Z r/nQn/69VXTYWKw/9zP+nt9vYtq63g9dT+v1sqQPvfbD7/PXGlzbbm/vzoc4azTBgOceAOnI/vFy 4PRGuQ+LdusS0xVxkDMzC+X2rXthBOxFPEzrsD40lna8MHXhk05/0TA6TQFXoj8WXGbRTgUaIR+G QMioXwo2TrJGwmqg02h6dTlAqI003V6T3vLwyZZswpx2IBnptA+kB4OWNltrTG8kJefI89sU8fzj 735crs5sly985YXyha9+BuZ9qFynx7bvO+kwA6Ls65eulH/+979dfvJnb5crn3xSVtCfbnKwdwH7 MoPDSGIUZbTxNXtW96K1knkY5t6O7B/mvMIAEp7enp8vV3FYr//85+XdN94t3/2TY+XZFx4vr7zy WPmbf+uLZeroCboB1O38+PEBPifK3/rKMzDJ9zJ+9sThaRhr1hpwO8LkywF7cwNYHHzpQTLCd1nW BbKyIJwq44rWAXoQkTYHzX87htxWa8KTSUcif/258uSjJ8sbaDnfopvJ/+Of/ml56+kT5X/z3/xK xiAvYAxXHagA2B9jatsmTmcmThhNPdfSKaOBtERO2aIn+x97DbYXM3iwdZwOTXY/RnzYYrAKkjR8 mwA7u4IIhvrYO4I4+2j3GqTJyPL6SwQsvUTpDnFIDNYUvNVyE2VJVbqCwL8aae5PVkdGNuPULbLz zQU5GkG0wtH9qoVMWz8cs1X0DWhPr1t+wTT4LkZc5nzfQboqnDjqXPvaLkDrNT7OQ5ChpriJvw+d PhX95vqNG+Xmux+WS+9fpVBlo/bt5rUGWc9hMi46VGsGdL5mH3S0OjRfM+OfmUZqW0N1phbDnjtz uJy/fJe2fBTD3rpVrl65VZ595myYWNvkXbmBoW4GmmSKYYMrKjtaTVeAWpxKdeBp/ca3UsTF32XY HZxy5w5DgmDpd0d0aIAwe9TbXpPP8fHBcubpU2X6kSMJLGrrGTYewes2zKZT3byPtCyEpbPgrh2Z CpF56Zg+Qip0Min2+1dZH/a4TnGSHuqmfFdt35guCerfeW9thix7UySn9jhO0aBGZtRgIClx369O vdywDZoZCveZziE6SJ2/GQtT3TK8dbJiTZDJLPO6vqwA2lQ0nymu5HfTssw15H0qg2XatWH0ydT0 4FgHyPEqE1sjw2ExqnIRN5vje1vBnAFb+IJq4JoDGjQSmdbDDkVpSkJlg0GfWvP8zDa5321ht0tr ro8vXiZgJbhiPx3HToxgnx3Ocesez4/gXyLBIVC2eouDVHal5hZbNcKo4ZsyaPzQPp7pWQqUZeLv z8yQuaA3vX2OPR+syUaKg6tuvR3DY0AhgLegb1fGLvepNtbA0OEfrIuZGu7DPeWUx178hqSLreB8 nciQwizWNWp95O8NimkFg58ujj9b36t+r3H2gtI8zGYVfZjNa+bHWqgotG7DaLe8uc8+58G9wP+F 9KkFhco/9rAbtiIVYCdrxvftdrSfzN0Bikq9tzWIFAMSX1J9vh1/qk2SWIIBZ80F3TLYSo7WBbys g8XOWm87o9Q9XxnVEA6tQE+43wDsVpYldxmwLajms6lVCHMsRrPGhee0hU/e4vn2si+6uc4WSFQz 7hYchHXvYG/od+34paRrgALWfrTXawSofQS3PWaTlIpRc7HR6T6orG11y61C0notuU6ej7UL1rW4 8HHZQs7IXGotlmuzDVBcY4/O4pftjy1E2EcWWnnFFq+jp1CPnfasAZBKRNxftZNJbJivmX9V5xa5 CCywEjO/kQ4jyW5UllmJWbWF9flmHSudnZoV9/XD6DGkX6X8qgytCYolg3wt8Uxa5VrzIyEgMcJ9 GYikbix6efye8wiUS+LDV+kA0kdb0mEIqg4A9DrzIBztKKm3C9u9Y0GjPty15MUJy/MsHIa1qq2i u87440fK2OPY/sHR3IPXZyPONDXgT9fSFXoY1Lb+3jpqLeb5oaNX5SLNh3+Pquuh16meo360gHm1 YH/+o/UzD3/Vp1ZX/lNs8vB7+fd/3+/9tQXXextUiV95m7HiN1KE1tOP0zJVI9hV33dsqvRTsGYf zSW0QEvob9XtabDvz8yX7fsLFEi1lVE3EjumduyogxxM/Vdwo2HjUcEmpe+sUbTBoMyIlQ1sMh2j 0oQd2pCtq3uVSaC6doNN20MVfBu6WPNHuwDdzaUlHANMmoDHtPQyh4OU8jrDCe7eWizvXrhZLjF1 7tDZE+Xzv/RCGSVQWNoAkHMdo/1DFFfslcsffVD+zf/w7fIv/l9/VFZI9du54RyFHvbrnSdVuk0F tWn4DVJCFixMwPK4sedh5tRD92BcdBtLaysFnF+eRBpyHae1gNZqHt33j3/4U4bkXASgzpQXX3y0 TB1gJPy+KQx1Pzr2oTI6SCX92b6Mj+1Bw+vo6zJqz1wOm4aU93LzP7zBY+yaSDPBePPZ2tCtjRym iW/KkDpkwxqaSQHf4wNMwkQTTjT8x93v5j1u0BtX8fs6afhoSHUu3N8dxsxfQEoyRx9OFQgO1FF/ bkrcYRO21tKEDgPa7Mk7CGCWLZGR1gir4ZN9y1AOHIKS0A7kMvYEl9Vax1nZTk8nFRbFgkaAuV1D tjBEusP0Fs7+qHKjFmOmQkQyIbFWrGaj208bp9qKLoNVYixdML4sKosRqcZZ+y2gSA9dvtbDc7G7 Qe/oqGJF+yKWDQoPNwGkHbDUVoDLKDrIyILYdtPfhw6Ug2G3e8qdj65kTPUK99Vlz2erx2VeuAYZ 8G5ZTxywDrqdB5L2danoJ3uC8d3proDo6OFJ+hHTLg1503XkOHeo6h9PtqinXAOoJlCQCY3TaQER mSYZ1wpm6n1XnaT7VymOxWSCTpnru3cXCOxmyj4cU08XjBfPXeCoNGacQtujj1MM99RjTEWlBUhG qMPY5ZPnwtnXGab/swDb4TYCFDWIOgY6E3RSODn1zOOll+B7lpZwq5xpZUa77DF9qSxQGC8zH7I/ 6hsbsJNuWJH2qGdWn6h54M14LwtvbaMXnWzD8gV3t/7eXFM14jXVnQjE85Ashl+3HsTv1X3TWq8W uKlDKuzSw+/KXAPwJQoETRax2j6zd4eUNPvCoKwDZ6ldSJal2XNBNb5TnPxDzuYveJY49OZaQ2Qb PCuz4/fstiFgcMLhzes3y3f/9BeAlYKU7Ai1EONh8OcoYLT2wTOZ4IgXNLhbVSNuQRWZEmVfOxR3 +jMy7wfoSDO7cKDcv0WGZH6uDI8DvlKIyHPg/Kp5t0e700llv9cF2AlkDE5rF5W0YmMNuwBR/bDd Ei2yoQ6ZssZA4C25nJS7kgl18p7jLIZ7s/7Z+gyIbr4UOU8TmNT2elXylCmn+R2uI6CpAr3KPDag KJCu+bvPQ0Inxa51nWWZBX9mSA3SfTnXel2pIletvWrp/B1eth+/0QfRYe2HLRxTL5FuQna/sn2c QLQGme7LBLnsj2Qv8EexGeqiBd9KIfmbfZG9hqqU/wuwx/2onCEbuGY86mfTrzsSCQsEfSF7ie+U uWsUyxEkjzLIzKBIeVXApwEFL69dq/u8WWBtMlloQXY69LgGvKYZkHT34T3MQLYSAT53Aaasv+ci Q6qa64tfD4vd1F0E3tYAv0b+suEARuyDZ1Y5wzDrN8T58a21YJvcXy+RdS2OJai0vUuANhcc+lxc kbA1z152tz7QyrPGBvr+/D3aab/WbI9KMuSH4kMenMTmXGaN/X7DUD+8d3xBgyGD4Ly+UbMyRfyj 9TrOY6j9ViEMHboE4N4kG7xH1n1IaeSwZ8NwwYDMCav1mW5K+jhTIu/NymGXNyked4iU7VY7COgm Hj0ONjgFgQjGYSXIy6eAVA/W0k239nTrz3qjFTNU61M/Wnpo/94K3GrY0vqQYKqsteDYFWtW7QFQ bklDWsD8LwLk1jU8jElay17f9//3x19LcL23vlx2GWnetT5Ln/L+Oj1P9sfHY/9XDqgHdhjNn+ho HENhYsz02BZtfdYB13YC2Lw3W3ZJVVpsto4+2V61W47pVbengTbdFsdegYEna9fq7xzuRt8KQO/n PcZ49xWcxgzgeNPUHkVuk8enyigj0i2wsWAqk/uqfiHjzW13pNOevbtcfvHOtfIafV4PnDpZvvZr ny1Pf+5cpjTCtZV9IyOwrX3l4zffLP/X/+Nvlx99782yiG76IOz7Kbp8HISBXybS3KAQqz3XUx1d N+3M7JDhNEr7lNnnNs3v2e59Rq+CO74wNcgaDYyma8AtWPJf3Lxerly5Vr7170ito6t94aXnuRbY cJiSsXGq6X1PQPd+etBOT0/TdWOM1dUZaHYqI0BGyZbhn2ZBm8OTvtetv3sgmhMRfZ6HjP9TSuIS 6xCl7ZzEdWISpzHySHn2zAE04/Nlzucm4ON7po/b0RHvUTD6ySc3ytvvEBzwbI2wxa0bBj2s5ORY VxlEniMrOkIRzaEDI4noV5fNMjAwByBo4VV3UsM1iDKF7b9T3JpkhbpgO8SAY2V1tMUWyaZgqCli yj6RmYjpbJhFiztru8ddOqzUVlV1cIIgUUco+256UXCVanAZWR0yfw9IN8ALyMOwA2IGeA794xOl l64J9nLH22bq5BagekNZEKBZZl5pgKlBEHTtPTo2XvpPPFZODI8TMMEAXbpVbl2+nfdfgaFVgxpm RefEfa0ve+O1Q45rboZnmHTuLc7M/fuAJJzBFE7dXulzyE3O03P6p29cKM8/f5YAUrbWYjLBYeNE gk+CVAI+smsa8BJwDVCy/dMc0i57rquv7uWs3CdouIb+foKpjRZUhgEFXI2NDZZHnjpWjj59unRx DXsEsZt37ob5VX4SUBMmst6TRc3R3qbjAcH3jTucx9tl+NjR0os2u5dMwDCfH/3ZW+UK2RI16Am2 eWbpXR0QUntGhykTsLGfDMhkk3wWmRrHvQgsbfkXVwdwScwWtk+/2bB7uabqfNNCy9SPW99GNoIN AzKBYWP5k91w0I9r5s81eyktRmWxvT/+NJMVnSV/NxC0+8KC/ZGxfTKCvQQC66bT6xbLfSVYCICo AXItef00DA6L2mCrvPtDADEpbGU6UFVKNDYJ9t9644Ny9eqdcu7Js+W3vvlqOXEMMMX1jFlsx+G3 Jd8S2RMDRlmxNdLTtxkQZCcRa0vWWOcezsNRCASZ8EWyfXfJvBjoOkREeBIAw/Nclfnm/AwCZHbo XrMhQOY9enNdLczDWmB7tWED2OhBZQnsrbTEDLhqggtbm7EQFvZFP+vuaQHr2P9P1z9/j+a+9sWv 0poWqK5MZZYqiNC/17OfVc4zrMA96+wzSHtPAz7vzj3E8w5roXRGbW/tuGLGyUvpJ7u0bpDBy+0n Y3Po8FSCvBUKdTdYWzOtXdh460dcCIvX/NkepRe+r3vAnvh8Le0mIx73fuokTsG+E10rKes9+Pdc cM2cVAT25z8FcsohA7DNBtbuXQFq+NjrH93kbK+X6TNIcQzW9bX44fReV3eOz049Q3y5DEd0K+lL 7/Pzefi+Tku0hqBbm2mG0GuupydnMH/3mpuPLKOgvQHmcFE5e5lJ22LhWTvlE2vY5A3b+qUOYq+M A/g3KKIetubHLDg9sfvpF01bgjLE6xHOZI32MtWy+rLIxVJwb8DMFzON1bPOfmqyTV5dpCMJUpp9 4TZpbGSlejUY2Tr1drjvSGyysVqhQZzRA1RYB1EplxFY8xLW+aRlrg0a2Gf6C5oMOKHVeglbmbab 3eH5bNu+mE5K9ivaBlcsrbJHrevBDvYw/XjvNh247ljDBO7Ah0wiJd335ONkDI9wTUJzWO3GfhAm 5RZan40Ze7BjWuxyC8y2pB/NYWme3MOwusnocHWf/uynuKK1Ex9+v38fUI5pbOzcgw3S2ifNbn74 63/xNf7agevdlYWyceUtdNZIQRy3KeOAk01XBB1oKxUVB5G4nw1eI3MP5oC9gHHGbshNANra7Bz6 ZByl6TP0uJvocldhcZ3OaI9YU4wZCZwUjqwQIM4Ut0yc0gHYPsHzGL2pe6/eK2tvXih3r92mXRgb koN5hGvSkGPayr6x6aSia++0eNIYrvnZlXLx2gwyjdXy5V89W1545UlSo7A8MIv2pdSU3Lxyqfze v/yT8q3f/yEBwGY5Cdg8DlA6DLDcWlsss0szjM0mDYxnk/XrxBj2dA8m9QY9HtY2Vd84XIGbvTxX MRpLZADs+T1EQZKx6iJgTPZnFbnK+xcASujW7y/QdmcU0IERH+Q91a4P4xwPHJgszz/7aDl14mDa s/WhjTRG9bC0gwhiTFvOI+awAdD17utH47c/NX/VKBmDNB3imuQX3SNwtkemp3jkveVjANw8fZeF TINHJmHh0ZQjybmLbODmzdm00JMhVi0vK9tNh/D+KZvaoxIgyLKgbwT5jAbeyhW1lUOw5D22yuOy 7aQRcG26GEeWFlcx/hp0uG/2j3tOhmiA8c6rADrTzrK9Xn8606grdRADf8rWrDLYxII3sxum91uF Sy6BBTQrPP9M8ZNBdueqP+VPnX8faQa7Zajr9OeV3wwS6PSqq6ZF2TbjpNfuzGZiXYqi1K7zahJC 7fauNbWr3m4FoyoQF/QhT5p8/ElSs0PR4V2mzdU2+38UN2FFvnKbdcCOLQatW/A8qUOOxpu1WsPB zKPxt6DKe3SS6QB74D7jrS98fJUuN48Bfimg0RFq2KV5NP5NdNWSgTzMvER7Hu2jGQEKj2WbYRgt HN3gnC9zTd1d0wFe1zkz+vlHnjpZjjz7GPaAtmw3bnGGF0VpeUbyudX/1KLQDL1IkZG+jO/BOBn4 tjlcY3626pYIVnrprdzbf6HMXrtIz+zRMklxdBh9vq3u0rS8wXpYbF6n21HDAbdKN8ziCFLUdQbB 82amvBq/J5j2PLqXGsCeNp440Ay9cZnyOg3gs8Cs6Ytt/+sUMtlZoTk+rTS8NyVoM4MEVE0hq91L BIm92J0BtOM9MzKUAj/rnDipsqENS9piYuP8ArJrxi5Y4OHD+pDHydcFAQ09lGIw6xe4hn4kba7R LBmxN97grGBbziHZsVDq7OkDZQobJqgVXMuwpWAV1n2DgGqbgUgCrmXOrsGzcqVRMkhD2PxZMpTp 6tK3yWtCXAgBaKe2ht3rYV12sMeuo0HIOiC1j+xhtwV/rIO94mVmZcPVWpuZyX5IVqBhWGX+kvX3 XjxAAsQKwlqGK0qPJrjxa5l0mGZBNUBR/tNamxa2SyqfNa+DTDSSnsumHWdAn8VtNZtQWe6GU/O9 AsBrQa0vrE9KAM8/7Q6illepX79TM1NESvYH2+86+XPpz++a8LrWEXgv/R3YQ3ziOgGORfEJ7Aha 25V+mdnh9wzIbLxmx60qAfp0D9f91nTDaILjGki0rHkFeqlRkFCqoWD25Mz95cjyDOTTUx7bat9t x7V7Hbl+bE2nkzLNhvhhazzu1cxsR9Pp6AG49xkYgLboX31I3q0VuGSrP7g0yQO75PThY3dYy2Xt eeyk+71SRAbmnsA19sB97Lvnd4hAWzlR3osz22YdDc+6j+eSIFr7JUgXtOvmU3DM54MaEwuP4/pr lt3gJMx+ZYTrFTf/n7RQLazPMWs2kt+X6Eq9gj+dwp26NxIc+/5hteuzabUdzTsIyC0w5mc9p+kK g303mF2n2H8Vuc7Gxgrnw7l4+hsaAZC5vznLmeZcbooBFsjcQqp0waAN2rryqaNl9PlzpYvJqnLO 2qcWa/xwp48WmK339ykGaIHhllmpSCERBfuAc20TAs6xxGZqdthLYxY8N8FFC5y73K1T05ijT/dr 68Uf+rO1S1tkX+tbD+3ePxcyPtj7zQ/+tQLXK3fulJV3fwZAuB1GusepWLbpYXU1hBbvGSH2Appk /2RsrXre3VvJYdGIZpQxB9aUePfkROme2FdPnRUvIhEKOqx+zaGQqgy7YEhf+6HGzPk0HLbh69h1 wWIIWvDtAW76KQRshzltowCnA7ZIoXEHzsFCvW42RIqrPCxG2RyKZSQhl5GEXGCUcwepyqfRjJ45 ewzHBKvqZCwM5DsffFy+9XvfKf/6X30vwP/Y+Gg5jKOZwBAq7XBq3hDstb1Pe/jzHkHCHtoqO1is oQ3J9DkOcJfTvdic6obl2LodAMEtGvXLYntbA7LsBiBs4DWcmyO+z6N3Hh1fyNRGD6ts0grf60GH 9sZr75UnHz9Wzjx6uhw4fJDJahOwQbTxIU3fD9seK5IPXz3WpjlW1XCErKmrGrOinfAn0ic2xvuB i0mP5bVMueuGJUULy3NTUxg2GG/o2tyisO4erPWeAZewDmPcCxVucYYZij6Y/UGMuXo990eKmniO TmVT+uJ7ytaGW1IWwu8PAiyXYWlNp8sy9wD2Yi9l1Wz75Vhw2IFNNHquW5xojLQdU2x/hyaQ6H8X a7tlWhcGoA5uAEywbztIy+lYVtkLDjay80IYfphudcLqn7e4/u5o5+32AeMGwOhwTypBAViv3Jop i9y32NVCw06NPvvMezZtbu/WXtlVFYNo6+xPujc2QTrvUBnle4dhIK5evJUuM0M5HziVTKLjGQg4 WQ/Xe4NA1DXa5tEqxxngd1PVz48MkkWyOHDu2i2yMffCPKVoNMa+dsGIBrBqCeqnQKTSfdklrZSz zmuF7jqy2H0EGwv8/R46XBlKgwz1uRapTtFy7MCpA6Xv4HTZg9Vcu3kLh4HExZ7icTB1mwl1Ak4I Ot1njruvgKONvcq+xmGLjnZpR2U/WFBcGT84hWYZWVWjn/YK1SxnZDzX3M15bXUWqlVTAEKe1xrP w/ZnMvxpKayGX+KKRUpdRxBHDXbT69kiqAA7V8DiRgCGkiLZLpdIFpN7jRaxKWSq3rvBtGYGfFWD dc+LQNDn1gA9g7hIcvh5g8o+OyfpiPlZC8IiTRdwu/4GNgGGlaiobRArSIq0weuRT23Y20AB7yXp azMCtYWk+9vAs2OrBqIrdPr47rd/Ut74xUflIJ0sXn7xbHmCdntq6h09nu4l7DfHt/cR+AuK1b/L 1K62wAivM8xzGRkdJ9DiTLC37D8v0LD1cNpQchn28fbuLIvxatOq04wj//L89sI8qtv2bNfWjNne FQg2BsfBTYIrjVGAj4HVw4x1fp7/cz0yvMSfM5BzMmDzvSbbEA2t4Ep5lj+S/V7XutUZp2ZualYl i+z5F/ApFTNTwtf0BWpc3feGWBvcb60TIiARePJsDVi8N+28NSaVia9Bg3s118L/MgdB0ohntoZE wMFn3fbXx15lHxlUeDb1c01JSEtHXY+tu6c5sfk5QXRdJ5/9g6xM83d/MtjQeBabdIde1VNMOlZe F9bawJfn4YRaiQ5/RtbesxN3myxUnYqpLM3z5SW0ag4yJh1nlmYE3mLsb7XD8eIPpBZNoXqzpT03 TqDsMguSQLfR2htwYyt8PkpnFmX7eR0L5Tu5xn4Odu2hjWwkR9+9X02aBbMJgrR3FKTXItQqKQ3x oj3JRVYo0JL/ZaST5zSMdi1kblY4f4YkzAvUs/1A/55gvWGxzY65yBl4o23hT4YL1TeuEEapawID 39xr4B6U/t1HamkGc5WMh8B6cETbsFGuzm9QtE4Ghz7vk6z/KNnIMTqFHACjTE9Qq3LukdJJPY8Y yAPT2hkpZ2uee7a87+8Xmq8/DICrP2hsCPZbOVMHRmxrGS04GcyVJfY+72tmrIeMfR++rw+MYbeX 3FfeuWKJ7Jfm1VrAu9msD37Gf1ev9ulH63pyfJsv/8WfeejH//pMaNwlxbh+5XzZnrmVRvMrixQ3 XbwbqcUBKqMHKYKxSb79iTcWKSoUILp3BJKyxeqxnHrmwllQtoXj9oBZUdQ8+TT9J5pPJUD0CoJu tZkAOiQWao621FPDPrZRQGE6RTasOnw2+MRUGf/6ZHlGNvfKdeqoaITPYRyBXbRrQcfoSG3FF2q2 C/CyVy5cXyp/9PZltNYr5e/81ufL8889TapeYM00sstXy89+8Gb5Z7/9J7Sj+oRDslGOTY2Ug4SV g2wn21FZYd9GEUL3EIyI0SfX26PzUE+opIHdHHtq1Ge0St9uHYeGQNbNojOnNXrCLcga6Ia1tLUV r28br0EAxJbMPn3E78zRi9u0pdsSA7zGPfzw/p3y+k/fpJiMrgtKA7jX/TB9p84cK5P7pzIIxBSl xtbe0xNoJfXDAiTBgwVN1fnXVKkMU93avksFAHWzyzoB4Hg0PYzkG+qjjyva2hmyD07PfI8OK5cv XS8fXbiMJnO2TDCdbYD16OUehsb7kP1sAtCYzIgO/yhFnUNo7WVYO7thq1kvpeN7MmZ1YWraWTmI TDR7qbsfZs12b3wtbeFMc9qFw2CFQlXlFwnyqkeP3CdaVm8WNs1MyABtDr2fdcC0w0TU/io9cu3V dO8DdAzRwm6Y/sBtdpqxowfBzTLa34XbsNJ2yRDQs49GARgWzu3KWNN6cov+5Q7MscI+gz8A5unW 2Og71UjLZ+pA8zM63BXYGFLD0F0YyDPlNDrjy+98HMNvMaNOcoTAYmsNyRNr4741CDPIuEtXnjXf x/3HGnRz8xM8/zkArsGcPbMXLfR0SBJ7znHxapJ3nUzpZSXokk3XAVXHK0gIwxztfjsZHVpDcd56 kHd99BGdcS7exrEqB9kpV+kIdI6g7tlXzsEqT5Y9OpbIWFuc1c4QhihysldloOrfK/HjezhAQQaf a0EOFAeN40ibOw8L0hipmwGC4amjE2lJuczaB0DyO/08q2GyUWOHYNAJdCPz8kzD2m/MLZZ5WPs5 Am2zUkqBKlNV23+lP65/d48JJtj7aSOYds+1v7H1C5mQ6DnMUBgHgCgNqIVlabYY9kyHbd90pUp6 GPXG3l/jlQW9TmrEBlmwu8I9qjeeIJiYJxBURjE8hKSLVLX68y6nPCqgslhDkCGwURPduKvKqWku fYbNe0QyoaOq3Ur8sLODXzMoFDSq9bX7it1SFgjsltBM37p2rfzkZwfoi36EqarHwkj3YWsyeXJw t8yi59c229LTLj0rZJjsNW5myG4h5pwd/mVtgf5VMCLwkp1e5F4lBgTeAloD2nblIviBSeoTxmDb zLJYhGqa3AyX5Izp/ypxaFAS31YikQxHWEKZ/NCT/L0GzwkGffz82x751VKJq/iir2n20yFjFjTz YU2HYMagxQmcGSSkJjbtO7XTstHsR9benugWwSrX2+J9Fwk+Fs2gmVnkuTgcZszsG35hCTnYuVOH IGbo1GCxim6Jc+pwq2Sy2C8BwD4PCQfXJux+c99O5wMlJpmRbhL1ei0gTREbwL3er0G2E0eDsHO+ lCGZAfAZV2CtdKrBc4I5fj8DVdwn/M4q2eKrd+4zdZPAiH27QP1TByTFEMWrAuouztcmTGnvGN/H P2zjR5UAua+yydzj9klvNpzvmYmgDh5jj6xgWze4Rm1I4lP/Lojk/btiY+qnt2AYtpmAuwZZ1rLk rGmrlH7xQz3KvLi3ebPj2JhNnvMUHVkE2NH8r2BbYVh9vdhXbFS7feaxMX2sjfeQ9qxiEZdNmyzA jZ0zhViDa68vUiAL45ssQQLoBC0upL6kBg0ZER9A7+nk6gmo2gHy20g+Mv/ATIBtwTV9SD/sdlTv T9vuTA4CM3x9P+dgZxPyhyLkLeR/m2Qq5+6tlU8uMytgjcw+3diWILNW2iDdILKuswbjED37eK/F Qd4baeHofTLltPktgHGYrBrIaVNzGipPmYDOW6hYuPlOtRfuqWR+lDzx/LZn75W5q5CTDvvhPnoh 8foZSLaibRyjIxb+ag+99y6a93YyqHZPSGbW81Xfiqztp5MXW4RdCzEHAzY/myx7vYwH19uC+Y05 e4BBGvdRwTxm4K8Hcw1L0b52n1ZjGMSu4xll3kaRoh1B7N2rRlGQKANp0cc8jr8Po9PPAUjfTJ0Q q6jWLJpEN6sRqXSHrDMb1s2QMc86qRQBGBlreOxEYBTpMBQrk40skQpwgDoo7gvLq6JelsDACg1f LzrrXsDbACyYjeIHJiZKG7KKnJ4Ubmi1AVxc1A2u/w1AzQ4O9bNffakcPH06u3CXntVv/OCd8ju/ /Z3y2g/fThHefoBOjywJ7LpGAXSXQ9ING9urVfSAslNsUdRioqNLNJA1zcnb1/Sc4L6Cv05T0dy7 l7Tt0BOjcE2rLB9ftyNTP1/fxBEpkVFPXqNtrpG/b3Pfc4CRKxRj6kTsv2thqSnhPgrEBtGLdwFU BBKf/+y58vwz6GIBCAOCXyvA0XJ7wJ02Z5pnVHkJhtbpiLJ6icKbw1gPpS2lSHNjSC1KcgLVbdjq t8gW/ORn75Q7FDzt4XB7iKJHHfVrCp+Ay+faw7rYV3VsiNdnHZdpoL8Jy6UB1QDtdGtUNUK112yb MhoBC05MJqhl6FxD2Yt2mJI9DZgpQZ1K2qlV4BiZEkGJ35PpVFIyRv/zSETsy82eUsvdD+vtWg04 cpnApJNn3EZxSFrHwdL1kfEYwShPEqxtkLlZBmwSMmVwxpZDFWRE7EnLfhb8peOEASEAIVPggjI1 BvycGkb2rqm+tA0jONsjELFdXyfrcvIpuokgp7gJiLVDhvtgicCBtgsZmNSuXk84wd5I6zvBgEZR FqVJ/XYK2nMc6LBhu0aefWWNKohtIqUHz7Q+0daHzKjSjdp724BknnPuOGfBlSym3UvSXpK2UQfQ lh4+dTTAZx0gnqBahqvFoDr8KQwSz0TWSIbNtwrIqMWBHQ560BkgQxAFd9DiL/n9SF1YafbtJnbD 4yb4GKZIeQQ5zgAArWdkrLQpqdGGAHbYyBTIDUSTOXmYtpEMYLpBwag6dh12LyBzEC139gD3kKLZ IO8HfrMyeClc4x4FVrKUam6TPVMF1wzOYH8EANilxLVVXxm2ymFXVaufvsBNDjraXTNYapmdmtkG GFBuInvq3s6+r8/CANMYoyWvDYZpAGwdIvMpA/XgbIZwrU+y9Zxr8Wo9D2lHmLoYU7vb1ETME9zS wvHitfLue9fKcfqlP/7I8XKYVl799M23UNWBHu6BNc6L9l3mLs9EsL7O/gBUGszKdCo7smBLkLyR /S+DKKFQJ7n2cJaHCCSHya5YQyPQscDb3s6yfq1rFdzYYrG58AQZ0c2GwTeY4e8JXppcm0A72QTh WSv/1nomDUQNGK+vGbvqmW3AVgZwJE1f3yeMJz/Yks4GiGXNJUk8a3UD+8y08f6cMwEMwMYJUMwY qnPO/nEI0mjVlG9hwxzCUoMds28VgNlVKTZVm2ZQZHei9N0321TrC8LcJyNXz6f3kWJNM1INJDFI NCiskXNdHbesICR9rYWAnhNM3xKkRoJVAHkNKuxKpP9SJtUC8b5JZcEjzcnr1hqQBMEtrY3X53q5 Fn5GT1h9mH8VeIbB9rI9I+4LXyqArzLj3eybFCSbfRTceYaaAj7XvIcMbA9AdBtjv0T24Bo1AdL5 B5h/YPB1e551hGxrR5bZB+BjMGIdAsR5NBg0a5gMiTfh+3hV1ZnF19d7YR2ybj5bD18jD0lE4vrX JQgr69Ik09QUg1eDVvdkDlwNAndl3k07ND402QSkgQkiXaEW6sXGaFe1p/Yct1vX2lXmTMAad9Hh ygm5Q0qIujZKH4HuFHh2nK+PUqelfSedwsTcxWTl99IBwLx4Q6Lw7hL1sXG5Qm2CN1oDHDFJBl46 7A5ftM1U7C6Y8x3sg21LOyAXesdHyiC1Gv3YzjaIR8+OXadgd8BiToxVOVDPnx+f+pMGaOvqtN9i f9668uv1e/5pJULr96q3rB8tYs8/9XV1ieuZFk/91QfXjp5doNsA2uAOitHa+keJkPYAKvTwBAjM oHOeo4PAKozZII7P9kOCjB1YmqW1+QDkfoBLtxINpCAx/IbiWSRHIzsswK+x3RS8iRxj/Iw8bd0l OycmlnG2fRcpCaL+Lv60/7SRWm3Bx/fRANv2q25uolQ7DbiZZGWl5xxK0Wj4BHALPPFLd+hNzak6 fuxIGT10KO+xQf/pn3/vtXQE+fnr78PAtpVDGM2D3IMVvXsAQkcoy17Z51d2h+Au7JfTxwS97VYv R+OqY5NNIMDTmGQcr0VPsJxWkxspByDxoy3Wi+93mRarLiEVwr32JhWkc0osYLMQyl7ZFh+qU+4Z raONTaHJxi4yyGYBhsJx7xpVwdw1O50Aql1ijY/X3wEIzjh6GSKs4RR9hw/ACJ45ebAcP8Lfp8cC SkeGR8Ca9CvHMYRBzWt2UBiF3nhzuNyF2f3pD36elKiFlk72E5wvwOyuU8A1xSCZaYrdJljHXiUV 3MkQRT4ddJ3oSC9gpDsYwbB+YdZZ16RcnZZYnZ7MmBPlMiHMNlHGN1jt9DWN11M36mtWVkuDrcNy 4MAAUX5GV7BVerjfXnp5DxFIDHN/Q1xXB6xnGwY8kRpDWZJlUQJCwWg7066UirQBtFeYwOlEQUfL ykDXdUAH2JJBpak/xlNH1egyA6zj7KrTzMhej0ACQgLOFZ4RQdAgY+MPwJRfQx4yhzxkYmKQDBE9 n33GbHWNiXWAYUy53TA/WB0zIq51gGAG2fREOrSM0R3DidtJIqytDiemtRrXbC4dRYBHBRd5bYtt pd2VILVYy2jgHbjDgBGmLb5wbrocPn4gTm4LTd4KQcCuQ37yLOqEUveY+trqmPS0shu+lz9Ti4AM DnVktkgUWMh82XM+mm0zBSkSlcmLl8tUs17ubw/d6NKtO2WHwE6dao/gA0a1nVRp+yDgG8lZ1/Rq shxzSFXmAJICRJ9JJh/KODdUTp0apweqpr0+I+Vb1T65Jj7BFFN6G4IxC7AiZ2uBHW6rBdjCLFat pjIDnbegxRZ02jJbZ6WAj/u2Q8eq7LivbzZGW8jfa+tF5QR8zWfePLn6Z+OMAhA+dWitlG99ohUc tTDEpy6rdqHx1tUEL9NG9OMPL6DBneMML8BiHy2nTk8lIzfkLAJew6mzGQaDvUrNg5kXnkXOiBMY sQnaknXWzfS2nUbsNrTpsCg7JAH6+jg/E/RAHyLb5TUpw3IPCEAFRgEaygK8ULGKf/hns2djIA3O XP8WygmYaYCMRaQNiE6+rdUBJ2DHINfnVoMmfUu06Y2mOwDTQCdBvmCz/rtmWwK3sjeS8OQC0nqP 7/fBqCpTsgC/36mMDAOx9aKHTTAtELZWwf3pv53kasDRCwEk07xGoJ4uL1lT1tAgRaDpObT4PcF5 3QNGdpXx9ZFr32p2SYY99QF26rIDVrNXHxCv7gFtvdInwNf8zYXy0bvXsoiSXxYsm9lzjcwI9yN3 lBBJgMDz7SVj3J4Web4/UjWK6dwLlRmVQpANbtZJ6Q17NSFccx9p/tHsx6ylLtG9LsDVfrkuPA8l NmYHfLROsjW4D0ElkYCtXbbBM+stqXCDoHmWOoG7+7bKofF9TDIkoDbAr7R0bIUzo3xmytfa0DVp vw10tb3ZXw2Lm2OSTFBjEn2JpkNLvqY9a2yPDng3heGfAu0EQd5Xzrz72CnS1UYnw1wjjJoNzCas k4MjJON93R/tZgpYh34IyUnql449drScucd8iWvXkWrRRQycco96IW6m9LPG06zPNMTP1Di+i2C4 i+40cRDeh1JLMYgZAq8/8poaLJqtXWN2QoqQWVfX3G40GRImYbIwh81dLiPs6WFeo0vMBqnZRgZ0 r+sug8tA9fgnh2Mt8j6d9qYnkz8wOFkL9vVPIXwqYHZWTlhqbntAzJFnX7/W6jDiGrdAco54dROR X/qnOyIZSIco+U2DlkSNf9XBtUCUXta7pPPXKBLcYjiBKYJeRqK2dfOQKaSzDdnV9y+X23Y8uHgH fexAmaabwDigRbCpdm8FoLBMf1Vb5QkQhzGyAmQbp9VsHalZDYzGNTvaVF0dGVsjRZgUUvl29xjq 4ZDoiC18UwJAOih6MBmAsACebh6MU61kPXg4sifddm+guGsbx93GIe3aYUAKhXffe+cyALe7fOYz zwEsD/L7m+Ujx43/g9+njdWP07j+6PQkbBaaXS72ICw4GKLcorBLMNoC0xsaPsewA6i95n5u3gg0 hi96UNN5bj5jtaoz65CJD4ON0WfDdOnweW1L0DzPrSb4KUrQ/uXQONKbv2/h9ARtMiFsWWURpr/s vWpBju0JTd9rjJL+5E9bq82iXY4u08yAF5SrdbtXBxIY1AlbS0eLUZ7lMBKIfWQCTh8/XJ7g0D/G 1L0hjPLUFGPbWReLkvYzbnsC6cfi/N0wiQM9tGGEHbfAaZGIegdWsY/01T514ABUAYeFTd2K5RxA YWFqukE4Fa3eUyY/kv5SuzysxpogQT2/WRJlRjW1W4vLdB6rsEIO7qngGi11nBmGle91A9zto7uG UXB7pLAWJzJihmMfYMy+5+4legX7kOzLvWmREYZZrWgX42QdTgSExngh/Zkhsmd4joVz/ThKR9d3 sqfcZzW1Vpn0Ts5ILbSqwV6kKoDTLXSwqZjXSPPSXRgp91IZP1zG6JXdB7t37cq9MkGw2g843kDU r/F1/G8LmOrUdmBGTLnb1aRLECIDykcXZ1T20HZr6pkFUTrGFJkFjLQAWWXk8s+AbQGGg3Gc0qbE hTtmPTdIR84i/3F4jAHJ2XNHy6u/+lz8hoz1mqla2GElDxp2ZQQbvLeFXkmptgB8Al2dkW9V2dpG sxHQ0+mCAMoZ08bXsTsEym0wJPZed4JfN2vdz/l3AIlTWdNvmzVvW9MewdwZZNMxCGq1dBw7TGBE Nx2yLCNIkdpZjxWLMblGJUeilLTci6OtwVicrM+NZxngZ5AU39hkDASPCWqbzjye14C3JLWrZwiY EcDXoD59sfmyQ0k2WUv7YHfye10CfX7OGgYDpJYU5+EhPtEQOwnS99O+BOjpV5r/AlZaIbhP/lMo 3Sp+y4ZoPtLykPuK9lwbPFp/3gAA//RJREFUSF/c6ID5vq1L33/n/XLrxs1y8eoxpsdOlyfPHeGc j3A/1FGou1ywBzKdMsyicF0p1OIMmt1qw955dUpH1tZN4SMhQc7kvU7R+91JkaMUshtAZ7aTKWcD Z+7BIMbtV7sv1HtI3OPzqA+g3nuDuPOnjy4OuIIf/wvDrT3gDR7WUgek83+VfKjBbwJFSZKwxFVX nX74vKbDlxKs+775rP8Oo8nPZgCMEwSx4UtKb9i7U7TiPC7rzz5VSmTRu4GcNSEBzvaDVgbDR9X9 W7QIS6s+3j1ioR5Z2AR6iQ34P6UEYfKzwgGydYCaa1F7rdsv3sDN2pLIcpo9Ww9ZBe3tyixdVwiE 6/evlZ//4hNaoWLjlVFZmOjgJX2FLz3iPraYl8DBvvRGxh50rt3gaonifwMKxIUBRa12mGlD6X43 UHZPmsVoQJCPRT+MywoQ9cxUJruSPMbxXe5v15+vCTtUtUf2FnmJhfz4FZsHcJ0zkGiLEByL1Llc R85pPdVTh0YYnDJahpO9NAtQe+GvK9+A6POEKiV8MKBJrGHBExdSn0pzdpQENUXr2WfZX9mMVQbT aOadRKuEpWXH9si8RSKSrFUja2EdIzEK892EaO4jM/HWFCijCbhvJLNmtvRf+HJ9rlthHgnXEJd5 1P2CveviGkbxF/tgk8cF1lPjpe3Q4WTvdhZlm1lr9sKOpIexv/+H1ET1y076bK+mDkUiYyutCpGC CqSxV+1gZ31EP323M0XW57GkFMcsG2CaTk7+cjsBxCqZ/a52/FMXO8H0Oh+6UC4RSVAF0pa39Uuu ZHnrKovQ7GLS6m0tvpKDzHcbYO7r6DOTwYs8r8rlYqiymfxpgs+WYfur9ucKrOfajWuwthgRAzBB QSqfSedfp8MHEc0gesd+ANOhR45Fu3vzk5tl9ibpRkDrfproT9IX2Qr0AYxqhgRwcgSXmuF2i9Zc JAdDoFMSFnggPcd2utCqqb9Mml2tNRrA7WhLMH6AqA61SsZ/FrhpaGBgwmBiWDcA0JtWgeM8OnHI SkiyiwFqOwAVU7fb9Kh+54OL5Q0m2h08Nl1+/W9/KcVZb37nR+Vbv8uglPc/ThrjGBvqMCBnhl7U y4wYXQagKyBTs+wGlJmrDINRrjKP+vxdj0hAYtirE9R3RPPnVhIU8/1B285x05saQpl7vpepdxq7 ipUS7gX78J8ylwxgMIvOa7nfbPWzgD7YH+xIX2+dn4bX77m+CTFStd/j99W1KWvgc9uxsU0qO4C+ ARurAJtliqA6kXmMol+1X3k3xr6bNFAXkfMnl++V47T/OXESkE3f5s88f6ocomeq2mBTRssUN64L unA+9igdRQpiIZfOaZNIXFlHBliElamHs1aK15ZbOVBhUb0or8vSHz4EA56vJpWbcby2uCLftGXx arIg7h2eSRwL74NRlv5dIrvizystGJoYQ1MIsDbit/gSlncD8KVatTJ7gA9RAOzSrsNHBEyk57r7 0dkv34BYZTAMr2srrV3AurpZtc/tAhiZSftFEDmFFW6CoMRM8c+1b24tblGDjTFEftE2iMSK1PLE sUPl8ofX6Vu9zLQ3G01pbHhsTmxzbSKodL3UW1aQWif5GXWZonWlHNFMBoPi2nXuTeMUSNYA64ft Uc2RVDbZLatT0kmnmwb/XqS1oPKQAYDDI8cPlpOc906Y4e2byGRghAVYpmdTgIfj1UkKCqJzjF31 1bnOTDOsBjIDX5SG6FnDFCqZqe2/rIvIAAtAvT9rcNrHeXean+z4hlNh7XQQtk5gx3skwOa9OZ/+ XhsacGraU6vhAJ8emKs1dPHa+IY3qoyav+t/smReXFjlCqrTLYTtoZZSBmjHXsP29PE8RwjLGUua 2e1VX8Mi5l0CsE2ejZKJPdl4XbtZF8GC55W92cce2+jlZ6yGDhtTnY/3WvXTLaDob38KmvNz9Ufr V/89z7Oi0HpfD3/UTihBqPmf92fGQGZSJlmwt0Cv9Avn7WKwlqzUfmzikKBmiwFRBDSr7qUwe/Ui 3Mupk/A6mvcVLC8T7PayFqOwtkOc/UGyXga9dew37y0zmb7tFXQ0yPmhG2v9tcnsRSdTdcP5ed/e s5A97d/9nu3z/GsFavEv+Z8p/ybQNQBtsYzJADVZpRbEyvnK1my9SbI+Ad4GXP6Ol+tBwW5Y9NmP TT2MpMxgOPtISQhnr6tfyYv6XGU17GFkMWHjQnioq6+yCzOb7o+apdPmNWtZ0V2eV4KIXJTMaRPA mTmNXKzK9xKcGHT4nJv1yde0B9pZvm47TQeXfeXFxyOfymTSDLapDHdl7FmvZGCVLtT9qbxT/7+K LTBllvd0zTU1rb0f21ODeOG8lxA2Ov6v4X99+Zw3L2sPcIYN5Ro3upDNKN9jbTK3gj1mVyADon5I GHZnuTlzn8CN+hazv66/5pnfWUbDfGu5t3xC0fXYTl+ZdqaAXVe0DzK0rpvF8AF93meLPa8SJH9G P5N74dpCXjXnJBMmBX/unwRu9ex4cx1NsOqaOUU6Pktb38p+mJ1L4bO1YdqWel4iC8k5J2bhPAl2 +9EuL95fLTcgMe/SMWSP3+vFp7nbbEVqu0czGxaJW6O0wyRfZkGXTpjtvsXZ7Cu19Pp7m01IuSnT cmqmza4znJT/s6uSA7EkFiQza0twO63YXMDCJ3whJJNTef1skyiiyN8JRLYQtQZnEdJrHRa7q2cI +6bIo9oUJa3KcR2eVZOCauZ5nry3nEn8uKi7iaH9mhinJXEKuDaDFPmXx73iv+ASQXp+ttoKz/1f TXDNw9+4cbXMnj+PiB2pwBRM8zDsH+2YvNGtlUVE7xtl4fo92KTBMkRB0wAM4DiG+PK7l8vH714p b/30ozCNU3z9HBP99jPAQCCCRJl2Y2sUvCzzgEnP2yc7hqwCatc+k43UmWGZdDIaayNZi7SMRPdo +WaKq5M0SicFejqzJa6lgyhAY7aClpXkFSz3vtJHat0ezDGobupMB+soH6NR/tFP3k009z/95lfL l37l1bJAj+m///d+p/zkR2+FoTkKWDyCZGAQR769aboP50MhZpqT6JiUHHCdDsAJ0GbTKuGIMWwY WE9h+oHWmxSBx1hHj8m9yWjZG4NaYIIPdw+RJBsyX9fp8ivs8RRKadwz4MA10cnwmq00sT1TNV+V DXI1BSVcj+eCn7fAx0KcvT1SPLkemZFatCgAMDtQmTKLs/RQggnShBwiCyTPHpsATCMPYRLiEjKA j+mucuniFRQUx8uv/PJgeY4i0ueffaK89tq7meRWU/tMbbSfNU5nP89JJt+WPkajvWQLOmm1YpQe ttD+nfbL1pC5yeLhKhgUWMoSBCxoBBv7JiiwcHQAx62B2kIDWhkmW5HZgJ/iEntMixBpY+DYaXuX D5q+BVg7YEh94xaAzC4TGvX07mb1LI5KOhQGah3Wrtu9RmGf6z97jVaDGJkJ1kXHutuPfEFG3W44 WXytKHtNsOdtaIRjE7gfMxscAgMqY8U2U7I9BCS24uK12k8eK4eeOFnufXS5nL9wI5X89ljnypUh x8grB1L+4R6qxU2ChybrE8chM2rf8d10BVgmlSe7liljDbvaAiXVCbvUNeUsG9+DMQ17xxfMCNy2 +w178DNPnCjf+NIz5eSx/SDutQxRUpeXbAL71XHt9vUVZKsh1Ia2puO5+1sa5wBr93IDEsO2yd64 JmHmqjPY5d51QUoPtujkosFdoIWYz1h2f+TAaORmaROlBtAOJMjFMuZZ/bevRUGZ0rFBBtOs47TU uVbM8hBC1csluVTHkCerwxoKPiPvSTsBH6vPj6/5+noSTbxfSzBVXUy6EPm+7lH7/5vW58umuZMq zVszpdYggnvbhAXqIGBItpprqsVTTabL1w8obIKi1pnIazQs9l8E196c32uAbgvwxvTEAKlrV1YV 7xeZjwN5tImDnAmf4SpB8WXOto/p2LED5fChCdqYQpDwTDf5/tycgLquUVq2kZkyzPecGcxusvfn Ca6H+fcgDNt+2O9xClC9L2cZBOexHt1O3Uu3lnpdrZaGVe3amEv+iObdwl2RThMwtJj83FeyMTVE r5mYGpinsNgMV8N+2TI2xauCb1kxQWMDZrPt/PkGQNdlrEA70gRex9T0ZiMDUje+CnGwxucpSKTH kNGZ6ZMZT0conu8AWRZvxeFpCa4IwiUztDESEOnXL2PIGgRce/1eaw5AZe3rOfX+Gumb96W0STY8 sr5ap5Rx50qjfK7+jkvlPvC8hwW3LmELWcidssDzOnp6Ol2lUgTpLAaPAHs9+yEF9tUH29FJkLOB zV/m7K3SKjSZqPgev1+NceRCfHZhl3ym1h8oDUq3I1+rsdkPeswH1NVnaxeqOvQnI5jCg20QgDrM VJe4SsZ8cfl2WSLg6+seKCeOH6db1Uh8qZmSXoLuTgLi88gXhldh13nhLQZ6TdNxo5dr2uCC1zhg nr9uMwEWJgsAldBJapl3MpD2Ol3LcBdNsMy6bic4qOfT5xIfI0bkOWZStP8G0CYDYpYSoBMWG9LQ X3TfG5zXIk4lpTWjGv0zgNamEH1kBGeo/7rFJOvLDPgZnewvJ2mtZ0ZjaWYJooXzhO/qJFDdgWRZ og/2PFm69qXZMjRHW2SIjwzQUrbCGQ1RabpbrTmfOfOiAsCz85c1pt6nmTjrkXbATDtLC1EpDFCg jz4gygB35SYEwApFo9tggTXIkF4yggdeOMOMBxpF2C7N96neOZ1bZEitSbuM77lHlrcTfXh3O8PT 2GdKQbsB4NmWZEPCUDcBbuqQxDCevRBGf94m2AXGvZhnIF56YCX+qvxFJAPlP0AV/wYLtwozNbO6 VMbQWfahs27HUXXsH2NDoGXE+a8g9+gG2PWQnhjDwHhY+3gIHwMOPv7oepm/s8DQEUA4jc71IGom p3F0mWpF6sKUfYZ/hGUQZgKwZc/4U+ZHPKCebY+HsMpUlE3SL7KdTrobmhgF1ONgZURIFXUJrjHa Gn6qhurrwbBTfVXTXoBymUJ7S3704ZUY+l/5wmfKb/7mV3lgHeWP//in5bs/+EVZ5rWOGTA4RIHI cAfhvodXEGEkvsGmEDBrs5xQpSHJ9D/tWcO+26Wtk0LHMAoexBYLwa7SkAmGZAjVU8apCCaatkcV 41rM5yb0l43keE8cu++RIcI6ELaYG1O2ty/jci2kUdZQ2aSqz63GuY7uljH13SsArxa4ahZjxtXl NUMH7CW9C/ATuNqZYWIfEhGYGJ2Sl+RkxQUA1hXavn388WUmuB0ojz12srzPWO/7SAhstzfE/dgZ 4TASoXF0cQYeHrq0OfNFDDJcROG0Gj3ZxziH5qhKThj5msrlepUoBBR4uKww51505qbSttCFrnI9 mbLIHl4PY1vZIXVy6h1ljwZIT1tN7k0IyGQOlJB4LWETNJTq6WWVvCa1a16jYbaSDwK8GTR/y2QK hjF0ykC2TTvKXsA05DGHneBnN6tBfbj3a1r8CSIxthm+xBdkzGW3ukl1WpgySpeM0xSeXiFgvHVn ngJQQIqxnWCG37djzLZpV7MABgemqZPq1+BUtGw/dHXgN5ngtY6xTWsvjWAryGtAysNmSd+R7gwG k+ku0lbmkL8M8TqnGcj0lZfPIZ86l0zWOoNftgkwkrUR1ljZz3qnP29AqX2AeZ6cwdqruQYaNQdY wY3/1HkEyATwVGBhatOf3ZK5dl2j/8ZhWoEfcMz6GSzg3NJ3Wr0gzzAZB1LERtjaC9I5tfDIPs20 jlzpvwfzKkNT5TEd9FcPJHMLNnRUK9jwMbpUntNcqPvBrWc6WdPiYw77Lvrit903AjOzcyJlvp6x 1gJKX941kQXi9QwyHIVNGQCyAtPpZNpkf903vl7FNlmLyAD+v3y02OPKclf00vzqn/uNFs6uha2y pbXdWs0uVImEwYKSKveQz0aZyDUKvQ2yBH6HIRqGaRXkGHXrI0RYYYP5z5Z8Zu104J4tO+ys0Q2l j2B0AtAwlgmrVWrjXuiyaAv7bZs5M5VNRB3mMNcfgJyIL2dHmyarXouDm64OGrCG4Y3UqOk1HFmN jtv95J4MI29xvNepFKQ66Af1D7EX2skqDcl7aYd89gFDsqhKIurURmV2DimyHd1tdLAWDU/QZeMQ w750VkrvRF51gnDDVOrHoo2u7PIDaYdEsx2RmkAn+8dA3L0jIOLT/lr5+QjNs+sa2ZHZEEF5k+lL IKb8gH8rj4pdrTYjYNh6IAKeFeqj7FFv33zbQqaNYcM+e68sGFu18s61ZqSyh+6HRey6Z7A+++bE BJFW1je1FZ71hgU2/EvP8QZ41R3t463X6us4hGoFf5p2dKxzAhie1ypr5tCi2Da+10/XqxMUT7/w 7LnyxJOPJei+cv0On7DZ3O8mvn1pi5aoAHAHqGGS091lmHscsKaHde5h7YckkmSrlckZc3BtTgJN vojfkyCzTZ4ze7yfSjpEGFLPV+wUXxefeubdd3rP6FkaOUiylzVwq9kxAahr5J5sere3sS+VWliH AcBeBtg61dhuaxNTgxSKT5WDJ6bSBGKbjjF7AIVBimOV3Yq3tsEWW/p+CUmuvhsm28Fm7SoBHILE 5fi6/p54yWycTLvzBJxcmb3B/UjURKdtMOA+Zd8oxTQbvEah6PoCIJ5OJOvY7X0nDpShIwfL4GFa ryK7c/U2IKbuUvdyE6LlFn5xngBhgSnN82S9O0Ymy/j+g+UMA+8O0HmmRwbf2vR0drCbSM1o5sy7 tuKh+peqK6mh5YPsoq1tW12u/Jm/UuB6mbTCvXffLm1MYFSnOEjPZov4r7z1cTkPE5RBAgDaySeP lyHY7FEGOwhiNkhf2wu228lqaIWG0OkeOjVdDh7aV64w9fAG45eXAQ19soyHB8sAaW8L3tYBFerT TEVYJJhuCmykdYzAKu+3RNQjKJjcP1HGGL/bR3eQrl3HZbsRWHS0RBt7AGaYaSeOCbZkiwZpu9dO Z5NONYVGUhy4xFUwmYtE3x++d6P84PtvlScfO1b+zv/818rpp8+WH37ru+W/+7/8drl35145PEFh poVyAmkcvAB2kA3nuHEHqaiNs4tB1cJZmWtqu7Ly3aj4dRh7ttsBWGigYlQ9iPEHtSjIy9J5WJyY VLUHm81jIUartZcGywO8AruuY9SQ9nJQY5AF0KyBryNMsTghI1ZTeNR8xpnVVGYq3ZNCryycn5EC +Ml1REfKYe9mQEyYXn+M11rncK+gtbXVlJXcOcrc7tQkumt6ul4n0v4RbPVXvzwEAJvOcAjB8AiM 4STO9gT6++O0Uxs1HYGG2daEglaLMDONjLXcQ3umBr32Aq7IJZhFhxZtTC3CipQkU870ATpOXI9V zj0YaFqwWbQWbGLFvYaEdW+NEBd0K/WwBZgBVoqxTEPCzG6yB1ONL+PLehnJr6EZFoTYNkt97zoT OAd6KOwiqr/ve83Pl6MM8RF4W8SV7gEpwtTQ2mmC9GWYIwFj0wUnOI3vC/iVEFFAqQRo7sYM6yDI 5LpwNr2nj5ajn322HP7gcnmfIUIdeximUYcfVXCdIl+uNxJQWbXmOaslT99m1mectnzKcOa4VgdE BEwITex7Vj1cjFqMf6QldR+EVE4AlmgDnfIGtmCwfOmLTzC59AuwXcNlnr7v63QciBzFIhkCG89p F+ewn4BD0C+D181Z9LmGlWLfRlJrkOc5T5rfQsZaqOvbRZfK/Rv8tjvJkGLYVVK93Ug6NjdgsgDQ tkwcQCrTy/uYJtyh/6rPuUeBH45lncmpbtBuGWs3g6wyDF83BaMC7zUGqoTRE5hwVj0BrmcuwVtW ZmYXBSVTZh4EWwlUa1apy/sxMEsgUBFGLTpzLXk9mUBZ1qTq/XZlHwvXn3UXcOU5uDcFszVtmoyc LRPDgtegurKmdc3y0QDO+uSyHeoz8y86rpyU2rUhpYG5PIOBCmS6+pr5A2HgnR5plspBXJxB3shC 3cqwwo7BZq+SHr5Lca+g2bNy/CgTb0lf29LzNq3camcNbU2dOGjP7jbO+fI29ptMUD/M9CR22X0Z 4ArYMctn4ZYyQduoCcQcyZ6XCuCq+9Gphpn0aybOAJJ1UVCXzg4hCrSZHvaqafUZraerST1r0VA3 8oyAa0G0Q0qqbqSxe75XfZYB0dZEZHJWDfYfdNfJOa4/638pIMcfrF+HCeacKzObRO+7zp63pZq9 wNW6CuQN0GSaQ4S45ryJnZsc1iJgNahJgW3uqQadPrVazN2cycisqqwlQFZgkf0jOpeJqtrfEB+c oQTh+NMw2UHO+kXHU6zQ4es+RIeZPuyv/f9tAdmmdNK/N0pYfQWv6f7MzAHuQZu+QNFyNPsCePW6 /pz7L9ekVEOQ7DPxPLVInSqjSYCZDVkBdiSc/Fsm3/kCtQbIrjI9ZXyEGh46Nk2SMenjnNtS9sSJ Y5AMg9lXFwDUF6/cLFeRn8qtjo7tK+s8j4WVeQDefLl843a5gJ+YJqjbT03YUYi/g3QYGmci6JCS EYkJpZHuXa6lU4AKmnZ/hfCzda2BgiRIDnEFeH60FFCZePvgjOX4Nay3hIo+wJ+1IZ32x9fi/9Cb aCdlr5MZBiN0Yo+dXrxNW+Auiv73n5hIHc/koTEKTvtZm+VyrJ9Wx7YXNDOHXTFLum2wxKe4olsO yb1pxlaNuTUz+k7eW3larW0jW8zPDdFNZY/f3wVo7OirmmBfktD5Ebtk1VbRsm8vw47fXgzpNwpp 2gmY7j16pFzDvv7Ov/oOA/oA39jHO8iMLty4C0u9VOa5oF66iTxBJufseHt58vChcu4EBZrTdOLi nhTd236zOeaROukUsn8a49jiMmrmzSDBs1ftZbVtnt8KmP7KgOsdZtsvXvqgLFy5kBRf5w7dIRiK 0k+hWt++ftJ8iwwHmeeAsYikaYYxsIMwmhoaoz3BWbuGgwckmzgEW3n2HL2WcYTPkebuZ3MPkh7s JcJvQ6ubQTG2kHGxAL8po9e6wQzu4VA37S/MA9tUu0dqcQiQ1mmfalIMKuZN0aYALlve7gZNqk2D goSFUxRSKoZHRx5D04WmcLW8SV/r23cWy29944vliS88Wy6e/6T89/+3f1oufvAR18u0R4r0HPk8 gREa7Bqg2t22c0x45F7GcRayuT0NyAvba/rKfjYWJhk283aLa3OwUgthGdSU2dpOA+6YXFNhbmbZ +4pz3FpWESuBgckMwqlpX02t6bbu5jB3sKm6TJ9x8G2rL7AWTBs12xvbVKH1BWat3ZitoRROfTS9 tR1nooNSl9xkDHQZIh9tt05EwAigj++CjVVfbhutfdz7KAHUbbRhO1zPMaQ+62jgZIjV5BkYuOG1 +VMcpiMU80ywH+yN3U1xX1KAMroWCbKmFqY6sMJhABq8HosyLTqRrUqXhqplrRmMyvy0wIrMaPr5 Gn3zumvKJJBV9PPshpzI6fcsOKT40j3q5KsVnnkHr2tgEmBI0NDuVLJIQ3DMdj0QOMG67dhmz7Sr Okn/7pPi+rYBII41jvbUCYFKUTBIPr9N0q0WlMriBXa4/v4ne+qD1in5ShJLOngDS6Q5G7Bd/V30 mOWXtjhf3aaRjxwoB8+dLsM/fD8DO+xSMgg4dAVWZcv5c4s1cz+pMNDhrSPRsFOMkzr7CUQ3eI6m rW2n5nXEYbRoV505z3pbZrmWSsWJ1NZkdRKmAGyDXtwnnqSfNYz1II5qCXZiHT2+/bF1vDlittwz 7WqhqffoUZB9MwWr1CUgoUou1P3ZMiu1CdpJUpzWb6RfN1eiBluT4JTAZViTEID87jJFNSvoPZm7 U3ph3VzLTYux7OhiZxqIAKv8nfSqE3fqKYcOQGlEY6chgD4gz84+YaHyf4G5NasZVtd6HXX76WVQ JR9hRLmX6mVzLw9YLAGYTlUWKwxdBXzWUhiYWdhZu4awJtGSyZ4ShPhGFl3zwPucVEpGqB2ns8ne N40tswiZneCxFkdyRux3LcOcc1ptjIF0ejvLT3gQIvvhOsJa1vvxmn0eaQtpcBPP5iAeZAkWwZn6 d3+6790lPPNuOgg5YTR7hU8BmNKiRT69SdcwAXgqo7BD7DEn7/YSLK5ReO6HHUL20y5xDDvguqQD hr8Cw5ZR9Zy1XWx+phIKEGHism8EczyLyLL0K1yP4FuJVg0dPD+1u4ofYQj1BX4tzGG97wBVg7iw 3pVRtKVr2soJvMNU159Pts+9YwLLTAnv0uFchgD4mqkQJKt33VY2IChrWO1BAr9hgz32lr2dZdy2 HFalGN9nB3hSxJdBOr4WrHdkAg1Yr2lNA1rPGzYkk/CaCglthM/FPxt0l8JXjTvPzfPkvs05A5Qa LEWmYIZPckGJUiYA4j+61sudm/fLLITVIWqllB0KAgV3puaV6bgX7PLVwX6UyU19kMDQft9ILjb5 tBaow8Fb+CBlZu02DtBPeA7Mxulna0RY27lSd2KG1vtIViury54xAOeedJdbvM8EEq9pskvHD0+X E2RBT1HXcfTMwWiRrUe6emO+XPr4evn+jz6gTup62NcxpCFT1M7sh/C7dnsduQtF9MgPcN7MgGgr d7ieFfbjws4C0jYkiqT/TvM+g9gLz9lg6rW43uZsG6DY5MsKsDYDb22VPJNrHvq/Aj0//Lr36ePT Dm4yjdWtl8yrZ8q1sVtBRn6yGpmyxO9L/FPD0e6AGfvTse+dwNvV30ErPvxlTYfXjB7v38NZkUiw 1a+kg3tVNlv21+ynH7Y0jk6c1rNb4if8yRaBptkwO3aoDU2gYAH8tnVIfNFrEyhwTbasrXUB2Ctb +95bTkDMMIt0ept+6VxpO/tIuXdzubz2/W+X//b/8I/KrW1nedAKmcNhofIoXVseffxUefIzj5W/ CaZ6DpbbsCGEn4F1zmwNCDQdrmMYbJxSFz4gpFPcct074RH8WuxVXXD/qMGif/4VAde7G0jj71wo I92A5qcOxtCESeJGelngR/Y9UY7OHyuLd0ldwFjd/ehOuXT+RiI12yudxvlOAbQ0ltv0LpZdbGMD u4C9HPQBGU3YuDYkApxylkY0qnRDAOwGZMdpPNnsZUzDXVniLoCbbKdFSTJCqdATIfCwLCAIQNci umNps9Fp5J3UtwaYr8NsB+7Z/5ONtbK4R6RFC5/5nXLk2MHy7MtP5DV/+q0flh9+90eZxjcMa90N lTRA7vsQkbIOQm3aMCz4PpjacRj79kZfVR2YzrsCXDe/Laxcvo77HK57FGpwnz0YogGnWoUdluXD ARkhs8v6la9EugDIwiDaYk/j5SZX56ex2ofMRnZLCYCsvYxI3Wka+bpRXTN8d1jDNG0PsK6sXMC0 jkJ22AiX75mSUtLgVk6LoGYjt9Nu0cfjvTgBbwiQZmXyNIZsCKnBKtqruzSt7yU9fIoBMNNM2BRk evjXkUpY+NrFPhjkUB0lUOkHTO/B5qjl3WqDAScrEoKkhyHfGPbVRcAaBl1GtUNtv85Yh8L971ho kWvzVGrFdBZVxGchjxpG2U5vb2EDyUnHAGNZp8vUiUMZhJDCTtuGwbrvzABQ5+7Qz5M1hdU1M9bO 8ASLzLoMwABuvcie+tm3GoQ+rFW72jB+0HKaFFSwwHvbpOjogmIhoVXTW8iGSJ0km7AGy7CzS7bE gQ+W7coOmIqWOZOFi0TI67U6nKwIrLDV+DKvnRTgWADVLrhFhtWxPlYOnjldnqT/8Hv0Ip5h3UfH cRxct11A1CPuoitcAIRaCGiwcusu2jxG4zpQqBem9h6AVCe2Buuu00+rQ3X87gnxSBhv+Q2DGx15 QogENzKam6ybPWdffuZoOXbuFIXMNxnQ8gmDGexzvpMe3IM4tg6Ci8hTuM8VzpbnWKi8RNV5D46u k2evvs4AxuM7QMDSj0yoC5C9vl57UK8i2zFdv4+gXGO7xLCTxSVqD2DKe0gpriJvWZzHoAIEBtn0 3YJztwJsiP5sfZu9R590s2OyrhsOorEX/jAOf025GMNPxgASy/0BTbtKtmTauB4DXfdU6jy4/A2u RS15AL/7Q3mHQ4qCTnVqtfZBMJI2aayH6XJ/XjmKr2N9ichhAw2ozqTXLAh7aksHyyqLj+wc089r H7TTzgbMm+/N/jRVHEefSZewjDDAFs7JanfwzLXPAkPX2xZ39tpPNxiBnQVfkULUjE+DBdiNaKFZ kz3smmygDFgfwMVQYYl0tN0meuiaox2zm1Jnr73HbcVmTQPfI3hZw245OGVBGZPgwZ7n3juvO8J1 2It4fnMmwcdBugY9wtTOUV4z0i815wzaKjTm2RtgDVSWCMYMRhxIyvnRpFuQKvjqp8OI53uFQlpl QWGwMYKCY/vip3cGfyoj8F7TDg5HH311QLUMoYbQs1Yzd2aYNrA1yeL5GtrIMNbVphrQ68IHZMls t2dHE5lA153fsQGhQeM2bPUaINhA/NTkdBkfGI4fsw1fD2u7zvtsY9dTTwJw2qLjljUV3dSddLFO yXRZMCaoMzCQufe12Q+rBoeieQuy7YbCj6SNmoEpz1ef4bNLLVIkGqyhQePQaNZlk2fZQ/BplnOH kfTrZIANCDdmV8ulty+WebLMLwKCHFa2zT0MMdFYNlj70E/B9sLN22nl2YtePJ0slPnQhWKd6YFt duYwo0OQ1U0xm3s/Xbns3awN8Vr9j+eqDR1QoumebjQjyzC5bgWlk8sG/dz/sugdsuqR586V5547 TRvIA9TnTBLIj/PmXQxbWi3f+cG75f/+//yD8smFS2nz+tlXn8MmnYQN7S1Xr86Ud9+/Vt67TO/u 0l/GAXV2r+rhXG2ylosU6F5D5nmROhlj6AuzyC7wpwfYXycIivbxjMaVFgqyDabJJG2pjzb4FT3w p4X82tc2dSS5gfDd7DHJHZ4b523TvuFmfbim3cwxkLDSl9pT36BHM6FkhsJsqqQjP1kxIOalCFYt lHYQntk/DZqvEUkcPyIJIjYwe+PejU5ceZXZQN1iyBsBAWef87CqmoAMq3tMkkky0CnGGUqlIlJ/ w77sJZ3heV6+tliW8H9dwxBcg9wDM0HGTuwv/dSrESWXLQiqbu6lrR0ZoD6XvTHUN1aOHjtaTp46 WL70hXPlHMHQiaMH8T2DZdDaAt57iczMugFn8xFb5DkNQK7ra5AnoSG3UZU1ueGGzW6kVJrY6Mcq DAipbfbmwSv/Jf3L7jpt9q6fLzvL6KI5DEbQYUIFH64B/9dvag9GsI9FHkR7PUJa7+4nd8tVuoPc IEVjPLoIUBmwIwSAdBQQ2mE0RxTlNMYedHdqofEcAF50pSy6hRJhnt2EMmBqJcOyVCff3le1wKnO FxwQUppaST/miCEruE7favWhgLYdh9QAYi12THrR55qHojQD5wUT9t0ffBQm6Fd/43MwDv3ljT/8 YfnjP/xxBrEcnZosT9FecMLx4Th/JQ37YNwd19uHcxkAfA0y5S/p+6QOc8k5IBkIofZLNpP1c9R5 V5hAjDZR5A73rKsbZpM7vMUUnG3URLJ1/HT2W4ByOlY02mLXf5fwM0V9DRgIU2DwE0NVi9kSBBpZ x502O1Cw1Aq1w6BWrXj9iZpeDBPU5GIq+VW1ZzUNWv9tVwbTud5o1Rx6OAlWAHbqL33e6iHvswfW uE+LRmy152NSD++fOhQlHDL+/UTjA6yx15ECI9/XYhpbuAlMLIZj3/hsE6zkOSZpFzAg5elaVvlL LehzcmA/GYtBnLqtmVLMhKOWnUYYSZsixneTEk2EjvPYR92Aa7juFENqC4ZIIW4CWtcxyLaSygEP kG+YZ+lJntkawMJUZr8GuWFpoxXTIRsUcc2Rpfj+ebpNkBMZBA7Vvtjqdk2hZz8bA1johQxiQeas Yd94vxECm8coBr6NBOUujJMT/ZTS6MisBDf4ct9pq1YAX4tooAVZoxSmOcVwFh3car6mc1CGY1tK N420QM0B1G3X7Bn+NADz9S3wbB/YKaePHKHf+QH2Ggw5jlvZlqzdEuu2SKGNDsV9rJZ5V8SI7s/q 9m4C4r10F9IBA9Q4P35/FcnX5lwtDBsGVGa8snuN61DvqyxmHbuxBAiQvdmHbneTdXMSZwaz6AD9 ebe4zjzSBqey1XZnYfb8jz8Fp0tIhdp5z24LgZx2x/uZEjeLs5ECWDWGpum9j6rf1rZEx9u8foJS z4rbQvCW9VOb7/aobeRql4D6pzeTM+RZcx/Fq9QgPJPMDKbd+3ZzYaTwOg5FScEsoOU2AdES58D7 EqwKRGxp6ZnvQdaRoEfgrMxD1K59sSDR17c9p9fP3+2u0h+9KS0MtYl2ZOCi1rjndfaa0yLvr9zN eenjdbdZq1VAlIx1aj0s9jNIIWhNS80lQD2vm+EeXIsp65m7d3l73otBVPrQO0hF7Fo0BXh5EjLl BMWQ2kET01VuYnDiKHam0SkV8azzmutKs1irdJTyOXD/axTQ5bzLyrrwrq/PpWFFW19P94eIEJQo 6LeqZjksfEMw1L7VPrfKQkZLLWvdZDVTp8G+Ss9i7YrPjM8UONvxpnnfnJM8Rr9XpwcOEvgM4Q97 CIwtMA+jSW1MtdsGYV6zr1o3rBm37Ivsj6aozWyir6l94dx1A/gsclNm5gj1FNjliGosDCbVaUdj Ve24r9/Y7kgSfR3WmBcMG24jgHfe/qT86fffpuOVw7QATdWMBjxLuBgoxtbx+naFcaqrbK2VPE6b tQ2n56O7adHZcn4hduJDGlmLa561d+87ggISwbZ6nKG0xfNpmZFoNNXKDCeRko4C8m8RSL3zRze5 Zkg0e/WD+fUDtyH0LG1+4pnHy69+/fny4mceBzQvlTcIFq5dn0GyuFWefeZMOcik6FHquZQuGYRs gwcy+dC9xFqskxG/efkuwcJameHsrSDHkygY457G2ffq6C24G2v2oUG3+7Y9RfH6XPc/2CUBHM8W ciTnzqJng0NtilnO1Yqb4J0j24jWWpNhIMWa2PygNjZwbylPrJOJ24n0BfPJVjUZ5noGjH3UnQnY eT8ZNflJGTezvM3ZcMEyII2HaxZRrKS2vMCqO5RMnfYOGRW30eam8kCyLUhybHPs8+gmiLUeohec N+BUa4DyHoHfniQo9sC+9489cab81m98rRx7+oly8sxxCp2Hy5EjPD/WvFcSkw/37NycfsL4qO7T SuC4U2o8kd7rybSZfa0ZAXFIMoPW1JllzXb3nuvfY/MbV6Ub+0sNrncBpGs3ztPmjv7E3ICHqlWZ l5sNfq2FSC5RB1HVcNcIbDUNzBGpOwr4xid30FTfL/dvU3hl6yZ01jqPbqJ4wWDHCBvMFmwCa1NU Gj+ZMwyb6XCHRKhB6x+tiDFgWQdl/1QjehkIAI0XWJ1nQq+AH8Ni2a4dotstDP0GTtRe2N0w5DLn lhPsEKHJ7Anar5JOusbh+so3Xiqv/PoXyo//6LXy3/2f/3n5wWvvhCV59PSR8gWi5wk2kSM+J/YD UmBfo5H2QcOKdfK62SAykW72PPymA0g3kaK6OsEM7zcEaNOQCEIEdm6eQcC1utxF2oIt8Zk6Jr5u Yj5T/gSmHg574roheW37PZu2z3VwIabkBIAugRsuKr20PFI3Vv/toQ44NiKP7EJ3Xjd3pbo1Cm7u Tzd9td+1bVj7jqVxAGnWvJeDan9gHakDFNSbj1BcMU6gNY7mo4cDe/vK1fL6G+dhTpfKBEGIEpqA a559JwyuU/42YeX6YS2dYibAFQg4LbIfFtxCKAmBBADcowVP6t23Fv2iJ0udXy3iqeligxnYvDh7 AKVT+2CkjdJNK2+zJ9YpwLGIzF67pkcFbU6yFAgMffaxPMvNSHco0MThLPHzOqYBGHpB8a5FcmjL WtPbdgDfC7aE5L1HCQ4iPYmm2OuryyrA2lPS4j6I/rpx+tXlCE+SXZF51wCaGdKY1Ccs0MYomsqm N3zvgely5LPPlP2X79AK8qOMpO4msyDg0gDLgpp78AzMA6KXMOyyrHZ26AOkfHLNwktaVGqsHOdu 4CorE2xYveKDIKsBgmHWLbLkvA6y1l///FPlMDUSe/dmsBPz2UP+qu0tHYah8dTZW8Rma7Uu9rxf UyetaGRl2WEatNOyLRnXtISkbC0yG1hRHFkyN1y/aylLug6DMoctEVyPw0CNkM24S9H0hoE696pG Oz2BPYfaC2VGBNmbBNhqf80gdHsdjjDmdZUsBZgiUVIWIPM4wPfsKCOIk1lSY+x+26LFn/bOoNiT IiD1z2h40xWk0YrrMHlNJTQ+96yn/wkw+HkzQnGU6ts72MPau3y/2oqcULsVmA5nytwI9mkG8LKg NAn2ySFLnUgz5gAB85ynVRluHF4XmSTBgv2ZDSAGYN+8d5n2FETyurKop44fhZ08UZ6jT/Ux9JIG KJ7rWTIrH128Xj744Hr58S8+Lq+98W6ZA2QfY3iRtR/ajF7eIxp9GWE7gnDfi/Q2dp1cv/QyV8qh Vph7Sv0Hf1pTs8v5OAlQ+ios5G/+ysvlJQpgNxgGtE53KQvgO3rIotCJJEVPBL69nCEzm8kUcI5H Jmo2yuLjVfa/gXcvtlg/JHHhWX/Q79vty3OxK04naQwZ7LS30541jjzBYwOwW8RChzUUbgiTnp7N SElqAJ1iY8+I2lDPVgC0euyaCdQOhXPzjNiakS8N4BP2kb1VIrloAS0/Z1cVz7fs3VZa7nGt0YJr ixvAoM33zLlfdGVKunyO/GkHJIex1b7MVVIWplM/bEBuoKwsLhdTA5B0ZwrrZ9s89hznd5Ni5Dka ClzDfvzb7/6ivPbuR+Uc/cv3HRqtexUwpf2wu8UqGbhV5JnuI22g19zhOTDzBVhaZe+v87UBNX52 w+Be0i8myLreQ5Ubtoxg/XftBsI6WpSvP7HFqUQEft3WfqcfO16ee/lpAsrN8gffebO8/rM3DA3L 1GEGasGEvoA//vKrj5f/4m+9yqC3/Tn/P2Pv/ukP2bucj6ceO1K++iptf5luODq1L3vTuEMiQVtr W1/lPE5NdnLwnO1Dybgtsb/mbtzH1tCwAY3xTTOo3Ledc0YuMjQOzfdxyLUhsmYrZmO5ByWZ3n8/ fsbnYtGuQNt9bDCkhGkFn24mpTcdrCojG9mN75+FapoJGMjk8ZnNJsh3nxk0sfRm9JIR83GadXG6 p1lbs47+nOcghZF6qRjxEFqC42SgPJn82cZ5S6E9G8U6sQ3o8+W1Rje/YZ96zh2QzAr1PjJMwxNI Xifxxdhu8VuGzxkI+IzZH5Jsj2BX/hvu/8BjZ8noj7h7AymkkjbNYGCGVtbIwBsUKgvSVzV7ojmZ eT3PR51Y6UsIqJWfVkiSRKJ7O96p+k0De98lfK9fNeNY0cxfvo8dgPX6zY8AL0zeUZOTUFYHUKOG SDObAyOrVkPt+nUjun5SXMdh1YbRUd8CYM/T1WAJ47BDNfIaD34fjnFI54tRdNxqFw7V7SWg6QC4 QtuULcDwGqJ5e9buYZhtkyajoCPoEnRElydQ4bEIQIyijOxa15pCFf7N9009R7pvpsyxnDpCWW4A rw5gBaC2gJbo5efO0jLuVLl//kr5vX/JaPO3znNg0AePT5ezDEg5RlcEu4R4iAcIFuLE3cIabQ9I paEqFEp3DTe3QNXlEdzynhhhU64dQ5XtdZOZOlIG0JlCJ74vc8NBka3wjmRgZaRy2DiR3fw7xo0N 2ItTMz2YohAfE2vQMsyCpeicBfsyk7IQ/t0tqeHVoPlc43Sa16i30Gxe/6j3kDSpTkYnIIPNweq3 YT26K4eZtIa7eO1H0M4foqPKHob8xqWr5U+/8/Ny6dIN0kV9DN2hdRd69X7Zl4bVz/bRCXA9GiED Oe+3k7R3InWBDCA84KO1zu439kYHtIGMVrRvoYb8GQ1/E+XyusOwR7J1OqHo7IngHTLiKGtXXBZo P9OvrtKf+0M092pBjz16OAZQff+cNImRs1petf86PHvfyUpwbe5BixTV0QpWZQPN7cc2NNrNOmyi pgA1qBaMxJnmnuo6x1T4+lynevWwQThSI3G7Y1ivsKeekYCyl4KyLu5rAlbH4GOedF8f7MMuRs9K cSVEpt1MLy8Bkla5PnXryrI2eUE7mtjJwZSn5zeMS8sBNqhQ4yZzFUIw+yB3xCcOgof3+COHyVQN lkVYyR0AbifXZhbGOxfOybSp9Vwki2G2pQ3H5QCbgWFYYq7ZPStDI/jR07TDXtqWybG97gdTt4JF K9R9vouwS8u20eNSPIN2c1lAErJAmtPf9/xkMIZBiOue4mZ1iPZmVu8rAOe1eJ/0j5flRYspOJax 9ao9a96lBt69JpvtG6Y7g9vHjhKe5ib4yNrluanZrdXt0ZH774apDqsUg+nXBHU6VDd98zrNGatd g7ieZC14jspJACu2ButT6sTXAu7Zc0Ow/+nxzzX7TKOJtTOHZ9UgGGe6RurfeooR2OOjFH5/8eUn y+c++xSt4Q6XQ04fRbbTQzDrdRgUnntutbxKa8kXX3u//IN/0Ft+9sYH6Wc/wO8PUEjmvswwrKhd 6n4wmyAjt4XDNm3dwfU64GocjaxnZI5uUPjx8o3PPV1+7cvPlacfP11Onz1cBpgc188z2d4YdfBt NJ4DAPz2zlspjnPNk4mQ4XL90zlDSYzrrPzC6Y2VuQ2odi8FkdSMm/9X5bI8Q21Bnn79bH1U8kN2 t+7qKqnxacaq1yBagobnKJj2WffKBAsM+aGELIKc5v3C6zSMrBmo8ehNqeuwlz7MqxdkRsE6mYfZ 8gADj2FzHy6tNt37sIXoEvte2ZTSLQOcFF1LthgY61eajK3DXQTYmeTp//w+6ybRYCcdbzT9afhd s8o/+sEH5fwnN8o7n1wpyzyraRoDTB/fT2ejysimeFk5UQZVqbutXZusqUkHJ0+Mz0OPIpNL0Z2+ bkOduucoaIdnFyl7Dfbr+tdWsMp9lBsbBHUDDnu05dGccx65HlvqDZAlfpvGB5euzUC+jJannnoU iQhSVOR9J5B5nD5Flwr8yirr86OfnS/f/skHAZuvfu5ceenZs+x95UlkaRg0Ez+jzbWmxzMCqI8m 3YVG4nboFKCRhxqdtJNlmX1wlwLI++lwQXYQW7NDlnCFa3sLVrzrVhuvb3EkftB2xBI7BkbeazaU HWZYJeUxZimUE3n+lYiZqUxgbaapMs+uTZp1uLGy712nSjYGRuDbJdfczfruEC5mgePvanWMtSVm lUIusgclu6JkjwSDnxMQuEnV+uvPtfG8qRJVx977MxbUCmglIQXW4rIBauv6lBThu6M0sH2j/si9 CrjepXbF6chHeC7bHGiDrnoOa+Ylcz64x4FIASFXZNfd5Hykj1WTRa8BUAXtOduuF9fkjKUAa76e egLvPv9rEVN1T4X0CAn5l/DD4sW12x/SSusOwLoWkRmGCxLywAXYfi25KC2Jq8ufRlYyqTygbr43 BRidYACL0xhvfHSt3GIU+q1bc+VnTGw8TqXvU6QGdYSD6L3CQPCSfTCaQ6TkfRjtdkaQcYDdchrU rn1PfVYWs6yTauSAGPmqcTaK2pUpjHSFn/FSAWhuaJ1aJ/qnHSbfudHVE+/Y+svqWmqfdhmEs4lz noRdePGz55AzrJf/0z/8J+VffesH2dwvP3mOThf7yyOnJ1NY0etUNAsHM2EOo6Ix9qHGfLs+mfdU LWOAU0311aIhHzlHA82irWo0sIMCNJzjIoyNTIJGULnEEE7PzhQeQA17G5u1MveyKeoRq5aqV8E/ 6fX0xk7Dd62+DG+VIlg7Y+eDzRjuWlXvz+Uge9gSsNSNGLcU8Kr9rT8TIlvrEwae9+QaknpkHQYE 16ybh3HNVBivOEmf6MNMh1qBhXrvnY/L6z9+t7z2s7ezBo8xZOQIgVc39zyAAZdx2uBZCLTbLF7k GlcAvTruyCG41zXArdF+P9F++iXbgQIg536UqZbNao2qrmx9dYjuIVs/GgCpF+xx7T3RtswziwFb HoanKZ48wn69gwH/yZ+8VX7+g/cS+DnoyDWwlmDfYXqxkx6UMffQG/goa0p7R9kDrtP1HML4mFlo AYGMT5YxwuhVHSm7ykBJKZPMrkZKxyoYS7pdQEywxT1qI6dhF90ny/YEtd7AEdFuH6YfdgCwMsiD YO3m7H0cMhId3ltQvWaAolyC9VgGqG/AktlNRmC9SqpvBfY+UEPQaL9ajW8TaFVw0XKEbg43Qd3b cUQ86W72wAEKhnpwNHfo+KP+1AEG88sw4jhzAYH31gNzI2yVFZTNmkVitcweGnVQD4GDz85AIsVp gLMeHFUv6+zeVe9rMY4ZItdR2YiOZqjp/nPrk1uAhBnSjMs5M+vYCZ9PLynfHp03oFw9b++RQ9Eu 7pB9WOc1FwGQ2zxEWWnlEqukKe2k0MV7+1wdYjJA4GKPd294U6malaEBduqpG6Yx6e0amAi6o8PW oel0LKLl69oQpSM1w9I4Qe5h27HestyewbDh/hkYn0yYUqthJ6uxb3dJ2/bwzRXYz+uwapS0Zn+Z Dk6bv3TPqN02BrCTmzDY66yzMiaDn2/+6mfLf/XNL5Uzj50uh08cNuqh6p/Wg3Q/WuHToLV/bJSe 9VMM+DpaHnn0ZHkc4PK//2//XvnW914H93KO+BllWD2w5jueGwxLptDx3g6RWu9mzWXVuV6zGp0E 3XfQ4W+uLJTnHnuk/N2/+1+ULwCwyU3HbdjGlei7gkqeQaep430TZZLBEwNzFHwb/DGBTvDQDTh1 79s6z+yJ7K3PW3lSDXRc20+dabVnVYbhytbWdRWQioZj11q2mmtN9sG9k4JB7WPNAipbSlcFnqNg IV1zQgl7CxXAVoBdMzY+QIMZNcO9BBvqe51aGnInbDaBULJrusyarTDINCOsD2lJxer48kAr7N96 WUbPbDC5jzPjCHKDC22IEqZWp5JOh8a4/vq1RoOa/sys26Y6eILUXrIZG0hCbl66C7v7XvmdP36t 3ERzrAZ6mpkUZ8hS7MPXLZNBsvlAzVTCdcJ3dRroK2/Av+/hT2qhvew0f2b4h5u2AuMqtalnJxId AZO+w/aosrI+LnxoWGQQePwWiylrnaJ1QKRM7AD2ZAbS6733rvOeneWXv/Hl8lvf/GI59yi6cOzs CvvB9f3o0u3yr//g5+W9Dz4pUwRtX6Fw7sUnT3AW6ABEAN4FohymkFtJU0CqNl/5nRjOLSEg1U9j dyQbnJo6OF3KPq7r0JOn8D8EJ54x5xpwbu6Tqbt2Fdtz5Xb5kM8LdxdpdtBTHtueLEc7R8IctwEc lbJtsbetTXG/2XEjhbNKCrGKAvvwra6F+7RyRxVoB7u4LkLmms1Kz3mdgitvzZW4wK5jgPctA0ML m/EbVX7qREfWkvO6673xXOx0kmJhs/7c9ybZiCX2lu1iHbiz6PvxO/ra4VEyJAQOvX3DqfnppQmE mmp0TpUMEsrwfLL/xIzYlA7qrHqGxgiMuLsEc2IJteB2l+Ea8PM92FY/rQuS28hpcj80n/7TgDrn SZ8oyG/Oi40h9OueI7PxNViq59uPhA9h/f8SFjTu2gfy3gUALUNXPLhetA86d1uZuwArW0rVvBOM seFDLdTxZyy80NGEhbFnJuz1QRbCdj6LGLCbdN9Y4oD2UawgMAvjydcFVaVrtowBMgVFOsh+Vn+D 9I6DZdT72G6mEwfYsVmNVZtSFSkEESQFSw5xyNLyZcc+u0H9/javvQ6ADpG0ipPwdTUCOFT1qEa9 U4j0BTR/8Ac/K7/7Rz8mqtoqZ9GTnial9My5Q8hdSKfbB7kFomXiGgPrGnltGVmaVEfVWGlw0h+5 MUTVqLvh7KDiRoHRw3Ho5O3/68Q8I0gNbpi+GHgLZwgyBI0SqDBtFvN5n76/P7dNtw27ktQ0kMbL NbAqmduXnWFBDDpkwHSKKVxM9NswbQ85qMq+y2a3PFB1GmGN4/2rwWzpRT0U9hL1w9T9KClqe56+ /Tap5dc+oN3ijUT9o9yj/az7w7LVE5TpffzDDgimptbUVXModST25czgglS041BlaHSWPE/3iwBT htjraklfooVmX6QfLXuyk5SWvdI71Fl7gYDgHTWqBGxtpKcMclK4xmtqVA8hWzpyZAKDPl/e/PlH 5am2M2WatkcB+gY2shKCUIfusPdSxIj7XQTcqcm2YG6M4KFG1p4bnpkBXRhUA9AakFY2TFZUw9FY eBF7DI7/V7WYDnDoomBsb9FsS01Bu25qGw0ULHC0lqGLe5QR7o60AyBuu0DJC17DEdqyssEf7EU7 mcwTCBi42D0mAME9F913xSg+008//EeVOtTPCi4ECXZy2LVlJuezD2AcRyVwdP+YSWA9Org+p3AO EQRsyhZHYwiYMuiBCdFYrtJWz64l/UqrLNhjLZaVc+HMBlLkbNMgHByvbVBrjYet925eu8ewBIBD CvjoC811zN1bjGW2ZqJPDSh7xGLUNqQnDmVxCIrMmjI2BwbJxNjjuM3gByYrvV25duUlStfsdrFG VildhQxaW2fl04g0gVHtw836hICIX6kMomctf/LdJkjN3g/TJNtSf1btZVrJ+cELCJT7uNc5bNI8 gEjJkYWQA8hETKsuUw9jLix8+0IFJdYWGJhsEdiskOIVUHzx+XPlm7/8Svny117k/e3Rhe2bYXgQ bfQsmszB0ISjqd4hMOqiWKxraqo8+6UXy6/RRvP1n78b+cYq1y+ZYfF2bQPnveL6G+fpOq0zar6b wuEB9sY8bblWsQNPHD1Ufv0bL5dnX302LSIXyGTad3+VbIfFztpNz0XfxmDpJ6vVRSDsdMCOfuQh 7IGNDoO0Oj7aDJ/Hpd8sFHZjJTUXtn/jNXI4GpvVAN3WF1Ir0mS0BHXRmkYSJzGijWZf8qUUbPJL GQ5khijAS0KBJ8UzCYOWx1OzOZrEBPR8zSBWdfs6Z2nd7Cy1DQcpsLOOpJUN0TbV4RsCfX5Pf2ox vuZTMkS7nTNmwKZbtdDSIMxMDSwiwFq52LqSA2xEd2qR/DCAq5ptz3S0rDnw2oP63FqA/erFO+V7 yCZ+8MZHAOt5YktkV/zuOCD1JJOTeziXKwvsWa7JVrj2A7BTVfpra9N83fgabFrAYQ0KtRlKnCKX 8fpd4ua/2I+clwqUXOTMYpDRdt0FeiItvtYb+1DrI/xBi+S7qS94/LGp8qXPP1uefOQUksOJkFar WwvlKhOhv/ejj8qf/ewjcF9neemFs+XJx09m6uoma5R6MIuX9cNiGJn0ANjqP2PvvHgLYyXnEkDX SZB1joSF8WRlwEN94+joCbr3nzlWTj+3Vq4io/r+H79ePgDT3LtOTRH3b5+EUWyLXX4sVN7g+RmY K8mz+Ncj6HRchxYlU50aoYoL0k0l+KB2sNlVzkZdQ7rc6P9J0KXNgHLDJtDfY3Dd+h6ad2y+Uhoz DAa9fuzKWDoxWiKQrIYBuAGqQek69Rvr1BqtYj8lRFe59nWefTc2r0fizn7WnNMesrjplCVbHWbF jVvxYAUJtS5GzC8u6eRabUAQH8K3Db4E4GbG1tNwwTbGYhTtvM+57p/6elViFTmWNpXvx9c1TqkS FbVerdWzvkqgGjlNzmKtvflLxVxbPbw1+wlRyAxMAaGqBiRpi+oMPVp9trXiZgPissb8HwxMPWz1 0CjZaKPstNVH1LT2xGnSx6ScetmYSzj3j0jz/PyTq2WaThOPslCj/M4duo0s4fR7iZJkG4eItAcx vktq1fhPuYH9aocpkBuhb2g7KW4XscNo3XZMGqnW4RBTM1SmpuK5NoCQacRsXAT88/PrZQa9qZtB ANqLIzb9/Lv/4vvlH9MdZB7j9bUXqHKlG8OR/UPlwH4KISiG6PQgGDFqyCLG/9R5xqCp+/aQyki4 QbN56uGpy1P/k+NtIxKvAn2BZRcslU3X6bJwXzaNa3fIDcbewkT1E7b/M+W3ifBKtllwpoOwuUZa 6smoyUxrNDJ4R1bLrjqmSgw8BPN1o+/Yh9RxM15nS0aR79Uiy5a8pRrD+pnRtbaf85DyXoKbFZz4 DIe0q2cJA9ZTTp0cp5VRV7nAJM7vffedcvHjazCIgD5ex2szPdnX1Z+2R3YuiMRHaYdGhtsxuhW0 9cF2ykhvkQvahpkXIHf6c/6QxaC25eNnjajdoxpmz2cKb4S7as4ESb6+0bXGSX0vQHCX/bcnWHKq nzINU3cWynFtowR7L33u8fLuWxfLaz+n3oBn+HLPuVyXA4/sP91NmtGDvypADbBh2hQMqob7wGEk L3TGmbkxl3tyPeu0NS4rYNxrqtmUgG8DoGoHK/uZdKBeyQCWdbe/rJIl+lEnzcq3BfJJlVuMltQq +k32kUMVunEIyxjkO45lxyFs8VpzpDcX05GlBjBLFm/CevsMDXgTNAiuBHatjRqb2SDtnHzBtftD g10Nag+sufrfHc6KFIQ95LcIDs0y7JCV2KPlQ98UgYbBKHuMmDDrlSl9yTjx/BxUIVNoa6lcBvvK wQis1QpgclDwwc9vELhYmyAiUdbh83JYz30YI0cxD5vVyBoS6KjH5RmvYXeGWCOfy+y7l3DEMCvK q5TH8H5TdE0Z2b+vdNn6E9YO4X/ZZpqZv7upJId1EdhY97FrFwmeT7qcYWcMmN2LScXqyMI86+89 o4K2RsYQSUkFScmi8fW08+NZ2BSoMnj8X7rN8KlWOWCVgJmXXSKrN4s2tp3ffRIJztf+818pPdNH yzws0SL2axaQ/O3vv1Y++PAyA33IZAjGtNUGrVzRq6TQ/3f/q98sTz59CkCNJAc2WM3tHs7VkMUA Z9suGZzl9DrHLqzDFu/SpaXnzGPl1/7ON8qbvzhfvv/jt8sCTnsAwOImST/jAI8GVQnY7XnPutgZ CHhf7l69AcjuLn/3f/m3y6/95lfLEBmX2Xc+LLe41sNnDmffSoB4Ti3ebEe73S2IoViqjTZegz0U uvNMFnheciSbRIuuoUxn/kvxHJ0HklZvAhptJfefDGfjo5o0XEZbt9q+6dvSTz4sWMNkJ7MouBEz 2LGl8XF6QDrepKhQu1ffrhb8+Wz5FBCssSbryq3sDsGeOHVsqpx85EjYOucBRGObIkbZa5i7xiN4 Bh+Az/BUFUhFo0v2YYs9bZtLszUC7NbPWu8i89qRrhBmwDhPfD8pewcrCazZu+mCoiST975zdbb8 63/70/KtP3uj3CJ70wt4GldyxXqeolj/FFmyNlrA7SGdFKBt2m3IbithNfAfTccd/ag1J9GluyB+ sH4GjLb4rBnEukZNLB6vpx3JOdXvOovCfZTCW4IbwOY27JHTiK0asFPSlVswwodHyzcIDJ9CrvnS c48RtIyBIXaYoTBDz+p75fV3rpRPGKilnPPVVx4tTz1ORtxSWK63HxvQg12KQE/ml3VN10beMhyJ 9xRTLKC12wv3pa9Lz4Mq2aj9xznfXG87f1JFlHvZYVLt9GOnyt8A6D99+Va5guzxHWRUv/OnF2h8 MFEeObaPs4CNVaMuuE53FLPUTillzzmJ0aJMXs2BXrupW6r1WNpiaz7aAcNhaPX9SFiVfbUBtr0B n3m6kWBIZKBTdOu+VVqrP81+4yb5XKDA885NglVs6gJM9bqF7Dw7C24tOnTomxioz3onO8PYsYna ubSqhRRrp5atzelgbr8dByGJq8zGuULYdo2Va+izA+R3su4Gv0pXbVmb7jX6BXkjasQMkiUWJf7c 67GSzbOIBNZuZc782KObnMSY9tWAK7I//by+tT5HhwJ6736EqOJcW6v1lwZc7+B41u9e5MDcAygB ZGBHZIPSHzSjbOuNSDn6oC3E8NAFJBj0eZCTq7aoRXCphqY6FiUapoRNKRx59Ej5moYNw/WdH79X 7gJ2dCgnj0xFz2i05JS+FTR8G3QO0Sgtm17md2Tc9vYWywxp3TEKZLooHkjbJVtDGWVhxDoybrOC WdMx9cO+mbYOM6IDFAGqrt2iyBLAMgir9sJnzpSTTxwvr735Ufn97/+szFK8cI6m6M8/eqw8zvX2 w5THwDQbIJpLD6yFfaYaG8Oi/jcZHoF33lVWkAMdaqoJRJorSqqSFH5luGpXlC405eMEIDqMGYop Vi3W438VwlenbVpOwB1drTwJ76XTcKys1mwPiUsANr/TaRTZmDPaV3JoAQsCSRn/GD//LyFhHESt Tq6bvFWIWS+8OpwKXgW/MHppcVVbQy0CfHoAbTuDBkBMibLgwWBI0CBwAww7RfMwI1tHMSw9rJua MCP3QVhD2W6jblPYRtcZdmJhUYo0iLoB0LIpAcwyrLyuAZiaezMqdqOIpCBpvZoiitaV56QD7/Fn ZXpm0XGaVhbMGT2r1fdZOhVQYCejxGtP0RryDD9zAVbiPAazFzCto1yyfRvPfZRMjC0Pl5EomAJW tvIh0+qGaEF0EGlJPzrLGfquJrOjQ/f6bIdmJF6XO3rwOCgtuwyJ6S/ZbAMCHGMHhlvmYoN1mr9L /3gCzyHlNNyzf9+BsbGtky0PE7V7u8qFWA/1gHNo4Pqd/MVrbVDMtAZYlIFwSI6ymlXAtmBdLVYm zgVI+HdDtWq8WyRqrjeZDh25wWDdDQZZmWbJdcoMpvc4DsEzuabOWVOL816miGcR9tWhSwbAac/G p/2RVylQjHRHrW5HLcBL/QGvIzPW7whm9rijlS00ypblXmfvUwRMYaPXZsDfh2PotTjWs89esHXf IulkW2BtIIG5R+9tad8DSM7GpweRnpGud0SyLBl2pc0Wk7KhUxOlkz7l2xQ2raoPB0B4zu0IZNCg UxUkeb/KH+ypHMdr+ltgrS2MFKyxAU16vrbhq6y3EjbPVL5mcOX509G7NRq05jNZl4Hidx59lHHO Jw+UQ8wFmHj8EWgx8tW+B/tNQPzM73y7/Mt//kfl239CVyPlFLyu2bVh7ukz6Juff+UZ2OxS7l2+ nrkA7Z4V1rRHORJ7xf7Eypr6GPzkeguYNufu0yr0OhKR/eVv/o0vQnzMlR+/c5GgeABm1kJPL0F5 YL3+FBvzLOq4c4dVOJtgr7zywqPll3/ty2R/psvapWvI+ZjoSRbBo9HNegugTP9340T1A6a0O1j3 dtp+oa8q/ejE12dnyiZaV8+IkgezUr6HZyU22DPWqhcQ9MSIuZ7VvoUASlamIvAUDoYdrcxkAJZJ Je2oIEfA7etJjngSuM9uM5JckoMxrI2JbNFnzkvbaE6p1ZrPjGtcsRiPe5qi4H2CQWo+9dQhmGHj d7YMsk3dyQZ7D8p+yIBVGZ9MkOet6mwXCDjUse8jSFVC5dnwzqqczd1UWT8JBLNrSiQru+iPfWpv DNDvIcl8481L5bu/+LDcZY09L2YAZAKnYdkfPXUkUqhVsiTuTQkuC0qdYNvFcw+ZhD3qJttX96e+ RCkC58LzEDmKaL+y/R7UaG09sNnd3pcL3fyT77kPHLymT1IGagLUDNyS3Y3YkxZKHmPvv/rlJ2nr djSyM33nrftz5bs/eb/8hC4nC5zvl5hY+wqM9bO0/XVdVmz5KyGVYvktnomFynV+gmSuPttkQcgM rkFyzg+ldL6+rrxDX2KQgqR0WyzBc6lZThoOgBGcZ2Dx88ETFAafOlaenLnPcLTB8r32N8utBc7h BzcoIO4vR5C6DttRhDdcYKhVt20aLfrMMwaISsBFRaoNqTVRNUvDOWpkRLYK9bqzpjlr+uFqf9uU feg7FGsHywaEpOOYczvucnY/oVHDm29fZToydpQsVC97+hgFnmc534dOUheAdLdXeSeZkUhJbRoA 49+hXNPXC6Dw04yIf2roDBCsZ7FQ0TaBnOvOwUjG9NPiFLNE7k9tQ4jagKV6tuyA4vCamgmuvi9t MJtMmBmxrshc63n1/NQZwzUz7WvUvvVVdlTlR7VNrFr6vxTgOsB64TIpWKQgYYo8oFysToMbMG1R T0aN9AQyMg0CLKOuTJ7LZKMage/hzFOwY2GRhs/enA6+4PBZlX8EJ3EQndL2T94tN9B79d5WE0sF MFXVE0x+lCVcwsgOMKRmmoe4aZSlwWMhbRukBGEWA9BlupvD4ACD7qQwuAbAtbqzsMWCQjah+tPb AOrFeQbP8Pt3KSy5hmZKJ3mWg/tFdNQDSAF+8o//gGbz8+UUvZCfpAPCJGBmP1+3svcekfEOTHi6 VjidkXtrtYSLgw6janz8UPq8MeaVttSuV/Djh9skAzHYxGFOAxrJDBA5WhynxndLRkDn7T7OjhaI NzoxD6GUu2muhlWuBYGffibNZMSXVGNlrHXeVVBS2baUNPr1GMP6u+K/YPUETjqj+vCTRNOh+Mn3 5VFlG0xDCQQG+pw4iQwIY3KIccgHp4fL++/DvvH87NVrT+ZuDssqIHWe6HnIqZZOVZSZhIlbgyXp pc+tYDtFbjxnWbgUA/FhJC9zpWzAgjfv25TbFs9FCsd92Crs2mN06C7PI4y3xW1IgkyV64C8Rtu+ 6ZgFYykI4jAanJkuU5Kyn2lzJ48fKBdfu1feprjV4j2DTVvG9aL/XcdArmH8XYcVNJH3AYkbvRgM vmDKO+nirG4F0DUGrexm/s8vNLGNoF62RAzgfghD7z5jhb239OnlOocYey74sTo8xVVmagxqeMH0 SDeK57cE/HlP3r/GN0omkFx00I/UgTkErILCljbSM56ONrm25pn70H3NXG7ryivDUDta1AAn7QZl nCyMTAWWZ0Gc7hQ59dYwIV6/QQwXE4c93Mn62WrSsb6kgWFN+kmXWqi1sQoDb4tEgTVBjRMddzm7 gtwNdL19TdZkkfO/DFDMCHEco/toyAp89pRSkiVYOQHh9at3E1gcOjbJeGS6qzARbD9FycMHxlLB v2e/dOxBOw66ne42TIgKKBH0rbFflCipP+ylq5GMoyygrRRTPOsKR7dpwZwsUiv1XZ9t2BXPt0wq Z98lDdvp1zxjgrsgqXr+fP0EX7yytSECyPHxsfL05x8vY0+dLR1oopev3y4zb7xPYNlTppFbdB88 Ur7xq19k4AXBJ8HeH37vp7B6qwSwdBkhWD9CzYtFr5v2W+e+MnlPIOQzt0hPgN9kA6KFlUn0/AG+ Fj8ETJ/rL88+f6Yc+/6B8h1AWepuvELvmzOh3Qt4xSbmPriBdQB0G0zaUTr0/MoX6WZz/AgB4UxZ uHCNDktjZerINLZUNpUWaO4L1slnYdBhgEa0nlHUbfboduouwI70WIJrC/oceWQbV0vUPd8VAEss 1FT5gwyL5yBevdrkuto5iB7AB8GjS17tn8Ckyr9SyJhgodHMK93HXhs4+oMWgklqaM4FaQaLflaQ bTcNOz85PKYPCVINGBsT3gAMgX41ua1sZq4u+L+iEYNy7ZuZsl6YRJ+bLQg9r72QEskgKusxaPV5 GCw1LHBNJfuMsHPsTeVSH164Uf4MqdsNMkBK90YA1utkMazH2G8DAgMBfM8qwbCBkdnUPva+S9i5 j2wC533PZ8bztY3ddnvt4uIPSChlKqQ2V4Y2XZCymRv1QA0kXNf8pz+KXFIbVSfXCsxlN9fBChvs D2/l8XOHyy997YVy6uyRSNpu4Z+XAahvfnit/PAXF8oHtPt9maLFr1KkO8n5XaXwUoWy58ePTZ6D z3Azw1qwSQaFtdbPngmR5jgegwYc2A7nbjQ+0udaE3p1Mmfu0Vs1M0TwSjvJcQr9lDcsWyyupIz/ Xnn1mfIYkpR/+tv/tryFpGpqaIPeJtjKbrIwBm6CQl5TuVq1+VFTRwoooK1dXzQUVf4QT80+liQL 4eW+aCxyYnjJPYNh/JH+Ui2+ReqSXreRZX1y5U55i+zxJ7QVvAHZ4B0NEhwdg0Q4fHh/OUvgfvzc cdoIM/AFUm+P79mnXbCbgsaAYv2rLLKllGbnayFjbfvHamOvZdF7sN+daK6t7VrSvofxVxnQZIfM vBqgNLFfCv/Zw5kQadY2ALtmxNxHqgScZzLEaHuvJdjUbJN3wZpYJ2Qtimc/00gr/ZnMsDHqf3Jw vYcR3Fm4RNQ4G42rkXOcQaqx7THMAyclsE7Fsg+/joNtqpQ1BAFsROMCcR2IfkUmjk0j8A7DYypR Vi2AgNfDYT71/KPlK2i/3nz3k3IJw7vCe+2nunwIYDJBYcsgh9oJSSgnShuON7pj3m/Q6WscvPtO g5LJcJCA/WIwPtdxCJcuzwfSGGEtwlYuAnxmAG23Ya3d/kPICYy0TsBE/tbf/kp56tzRTL37h//g D8oPXj/P0JPx8pknSD8RAJw6MV2Gcdo7sF/DShUEtk6UA7z7QHOHAfCNlQTItwxjFdXHDjdBuwvT SorZptM2NhrnqkHqNNXsxmDd+ifY/Hx/dIr+xYD6BVg6i82cJNjtJBhetJ9nIegS1HrArcKNFdPh 8RO1q0HtCuK2Mz3jeHOryk079fJM1UaBZJJKzzAZfy6VtrbVctiMLIkH2CDAFJAoPy6ttrrhWa6T PlxmfUeHKWAFCIwCrAWnFlfcZfTpGk7d4Smd4zgH942RJderTtxn7bXpNDOBUV2cxiJpUQwQkXNv OoHYKtFiV5hNDSUOWKMoY2kBm+/l4BH3jA40HRZYDx22AFcGcpf9sotj6MBh7HEv2+yNdLzBKC3P 1mmTnQDnVNXD6spKHiawOn5tMq3h2hxpjOFow/js2dfcIYA4my2GgHTQLm7/5ESZg2WaY78dow3l 8pF5JpWu0osaYMZ69mm5w7BhRGVJkmZNaBqpSAaOJOcgOIbB8b4MYgXFgCQHeywjAdhYkBVQnsBe gJ/cRN50jVTvHANZHEgxb8ENjmSQtLq666VVimRhWTR4BiT2v17i3jc4Myky4T+Nos/JfZN+NjIi sCEOWMiY5TjD2nVjk3uRERnG4H31c0/RNrG/zF6ao9XmDGBvMiBgBb36BgMIZFAsorT/vWVna3oz XttiKMF1GzlRWwdafLO3tA3LROtDC+MsGOVaxuiCYrfzBZ6dBVMWO6YHLE4yjBegYyl9xws6YKaF DfOenlf25cpM1UrvJyDZd2CknH7+RFr3DbGHNNj2b1X/usXzsm1gJ/ty755nieuCgemZnCqD92dL n0GD44A5M+q1wxIaFHswIuGpXR407krUMhBIyy4yc+2ajkEBfMliNUy1jgdSoxuv3sfztduGbL3B u8HjKo5yhLP0BGnucRjQdZj09cu3o1HuYG90Ev1uc772DGoP7i9ffOnR0rfzm9S4LpQ/+fHrsSen jh8uj+I4O+h0sMazbJdh5BrV6XsV7n/PYTsZQJlKh9EYXK4htenxLOm8NlfKNC1In3z2sTL+b3+M 00ZKgERBGyuwdWDRqoVM1sLwWktkIucBX89wzX/rb79avvGFx0vH3K2yB/vcj7yr0zaB1qOoI1am 1zhbOzolyNOfWPBFsNOxN1/asBsD6LBX2Ptz2MIB5INmOXbYP7K3y0iknP46COPmcCYLs+w8IXup DNCHU/ufK0MIDg3bFl187G210bHbZhkEeTJkCY5rOz2fqfrb2ktdNAbIVd7m4CtridjT6aet//O3 uIeztIrbvx+23k5D1BP4/n0QSNb42IJRYJHuRTxvgcUGz0YLnG4cPBjnAThpdT8ysyHOvrI245r0 o8e2yagm++X+UmPtJozh957dpGaOKfzmWd5GgvnHf/zz8jP7Pt++X/YPdQVMWy+xskYnpfXO9G5u c3DL7FwmHNvXv9ct7NAjfN4egRssCb3tsWOc57YV3lf5y6KgjnvjTMa/726QcLCbCeeBFiGyoJtI +1bZ7/au3+D1tEVev12nFi1uhXtbhJ2cx4+s8L1FfPWTTz5SXqYo8bO//FXa905BoNlGswcZ2DKt cc+Xdy5cz4P7n/3m58ur9LWe2kc9B+9h8WLGz4MbbKe5kkwAe9Wpkko9GsKIragrq7p3nzGfQJzg FrMxWsI6IbDOtdP9JRmaYa42wa1SICUJmrXUYvAserGxk8d6y6/+Z18uxykIvnqRgsfrd8qHPIc+ 9tfRSQg75Bauax++xOJgA4o11mmZzz72Va81JZwtW2v6/vridtutqHhwfkKqMH3MSj2R+8RNq6m2 G9hmuX75fnnnIzvAMGcEG3GfM6Jk6BHOsY0kTiBbPHR4kiYNB8s0srghMq3K3wwAladYJG0GuYts kqVs6lLrWHHelH3oAL42DpMZyPRet/Ce99/YY3+wsHZm2TCQagLTFIJGKlSzFjly/J+dxrwV20yu Iv/yZwwW6r3XJgVmybvJPmTitb9rUKSkUC22RIERmM8yuFo/1WTd+dd/UnDtEI2NuU8iBakGBS2Q Y8aNrmQOjR5N9VhZmtRvZab9rI5CwNUYqIYpCxhrGIQqdpauF0IJ9mTUAAY4iGOPHi1f/+WX6eDQ UWZ/ggHCSM+s3AQM08UB43AW5vgFRp2uAIYHcZr2UvbNBFo9MAIW6pjmHkWHNs3u0vhd/+BKuUev ZCu719moV+7cLfeQkMzzRJzrdfzEmfKr3/xCOQOwPgIAOsXrr6FT/Bf//LXyz373+1zbdnnlibP5 /n765zpByubyXWyq9C3W/OW+bZNVWYYAaHe6+qekzmWpGgaiRVXkh0JJ1D9dC8Gs3TU0SO5f5R7+ rkVsHKphhzzAYg/sGyxXmTB1n24MRrfghrCPsn1qm7Z2uDM3m1ouDbNZepbbxgb2pn2QGmyu1Obz MR1GyR6k6Ld8Tqa2Q6s1THe1OrWlk4U2XmUtHHKaomlnTBYzQQiCvFY+7U89SBpM3dNd9LCfXLrJ wZOFIj3H/S3YQg2H3UHkv2+fEoVPizIEJ4LrqqnycPOnsg/AtVdsoZFN/KOvdgpiUraVHR0ag53m elYBStmbRrgZjEEXCluEoQNud5SsjK9sM0suc6ZcRLZMPa+vK9CLFkztusCINYrGlPvpwwANs9e2 cXxmXwRAPf1IMNpWk8HYP4XWF0ZlhfcaOEsHFbqMXP7gZgySjLqctWBZFkvA7zqmg0TccWUHZHLX sdT2kNYRaSyHqUDvRZ+u5GjNwpMAN8YPWIgp84jzvm63DMC1tQcy+xo9A167G8win1Ja0k8bNXtZ zxPoeMbCtsqaBDw6BKCyf2n5JGVDkbLntYtnnaIv3tYeqek/z6j16dHJ8swTR6sDMyOgvo87iYH0 fiutkj7Sdh2IpprvmxLXmRgA9fSTlTK4ZP31EA4OaYf9trWb7aRWKIazr6+ymA2Chq6G1U9XHK5V m0CCokyQMh/HYVk/4TqZQnU/pUALDekBhkcMn6YAivU0qHQi3xY6ZgGd0z9517BduxRODZiVmUbL jiRhiHoQJzka8MR2sbYCUoPasCgW5Phf0p313lv2TxYvLcsAvw/aj3nGDHdjF1lPQKJ7do3gPR1I rGdgnVy6AbWwvP8BJEqC+617s5EjdDkESSDE2goqN8nAyeAMIJ94FgnbKeR1f/JjAB/BwlmkGJME vCsAqnWKOCUGDNJTC+L96utUqAhEjcaVFpieZm26bL/leGcRBk7wEfoNn4DZvMD7OexlnhZlaoHd O4MEnTLO66TJXYNRrvEl2Luvf+npcoBzsIHEpINAoot9YMYkaWQNlEx9mDoXtaZ3wxMLVOy6Qsar fZQAHMa+d3SkdDAvQSmZPqUOi9GkytxJMtC7eWG73IehczDOECRMdcwU5znu2e4xOmhTctXc1WyS a+Db59X8qKSIWCLSEdcpIMrWcFyv68c19npmeKk1zkpPCpK1pzDb7FMB09kjB5nrMJzOUz5j5VDm 3/QNBv3J4JDV2eF6UsAcckSdvaOyCXAcU82X+jn7BhGCn2jM7X9vQXgjSTQTYaGdgXmVvnj1Neu0 CWl064Or5Rc/PV8+eu9aeiwPsh4HYXjHCEa1R8ofNqRzudMVSIg1mgm4RznsBL2QEp3rnAWkAubE lDAAylngaI+1J20dgFls9BABGsrbOmjJ/WWnDPZo/q7swXOlzUnWpGZ1ZPr78B/9BJGLyH5mCfrb euiRfHCqfPWXXi6/QoebyVMnkXQw3pxOY3eRhv34Zx8HOA6N9ZZzdL154SkHlVCQzLrZqca6qRWK cofwQ2PjBD2ceWWgthmUgc7786yUSQW+sGTRARPQSRStrTszw/Z1NBkwI2/ARaWr15r9YmcTiBKz G9ugcQMvh7zYEForn8nHrMdRAttpAP8M8pWLEIhv//xC+fDDq+UqYHcaXzJOkHgUedqEvitZdpG7 ffftCkSHH8gqM8ASUckOoFNO613f3+tWVWQNlVIQ9rvBcBdntZP+1OI0j20vRaD7J7soUj1SDlJM fozGDEco2J/k7xJX+jHtzSprs+xQIfbMCMXIyavJMpM13e7imQN0O2hino4w1kSByeTbVzhzzk5Y Jhhqp7WeBJC2fpf7V12Q3vGxg5VsrUXFZpQFxMpCbO/oNFOIBZsW8NEt/sgOTt49ZK5yx07monfm PNbptU6IrZOjRWXi0Xqom2RJ9tx/MnC9S/Hi5twlWFmmaHmNghYdnCyS+rfmRlrGpkoP6m6sQDs8 aw5loqgGNIof22HVZOQ0pK0RshWo1XYwYXVgnfaRnj15htZsFANcZxCEryUwnKHo5o2r1/lzsRzD QR6k/dDkPqK9pJphwhC4d8ke44xXeam7s6TliawvYhhuw5xYrb0IozWHY+9g4z3JRj+CsT999hij OJ9OA/i5mYXyR3/2ZrnwwaXypz96q9wGBD59ZH95lGuaAlh3oZHyAGnobQOlyF822lRNJDNJAWuB veFawPTgU+P0QLDa2OwA62q8/ajDTaq+q/ZvdSKSS1krw7PR6Ms5Tn9ZU7e+n90oNgFvHkJT4UZu vUgxetZ9NlUK4NtEsuEyRyJniltC22par99Nbha3pjRroaIbtfb93OR9ZFdrUY0OxgNRAXkduCCD ItiSCe1mWEydyCnwjXxA38U+WoApm6GwzEKZ/Whbpx3ty+sI9Hq5dnuctyYYei3qatUTW7wm6+Z+ 0aj4d/eiF5B7ShBXl9Hr8Lpchw2nhOGME3jIrhhVN302O1jbLZ0Ve6TDYg9X2YmQfp89JdthCrSD flMGhmmFZ0cSNWtInAIAfc9Ga+wUygQh8ryAbI1jr8wI620LK53lMHusl9G76zhFcYv1AmaCsj7V d8HkYtBMZ+sLWXcdhL+rrCNacxl2XtNn0vpatGmyoz4P2AMzRjcAnzMELoIUHa2A14EgTmxc5/pd 0zGyQj5HC1s2MGh2p/HZryMh+FT+A1gU/ACUOmBKksWI5EFNeB0Y5Pr3tPcxQOEQAdK+Mg8AVr89 QAcJAxnBRp+DJLhBpx56v54jQU7GGqOFDGhPf3IlNXWUuNkUGfcBU9GACLMFNykS7XawS4aWmAqH +eN+MzBG9ovrH8M+ONRnlZ9fwTmryRSczygj8HfsPsIargNwMiK3j6fm4omzzBbEjlUQJRtqV6Fu nEa7LaNwKivsYS80MhoCd59dsnQ4mEgidKiszbYpWbdIIzvyvG0R0GWEPJ8ZmCC7bbU8n+6ZoelR 9i2AMfpWgijuw8FJaxQIa1uGsXkZc66u1eA7WRdNsOxRZdQF+ruw1T2+Ps9rGhJAgU8v33scScgQ 67y8MJs1tu4htcux4zW16jGvZ0r5nkx1LeDaVNoh6IbJ7B8dK4eQzh0gk3OeDh8exmrrUCU5g8BD CMDowAZNIO176pGj5WUY96kDk1mb6OfDAipfqv4j4DbnuAYnYcTEl35dBywwoxBaEKf8qZPiWTMq atArBOc5AkxHALA7BL2eX+2FoCh6ZduKOVSpywxNdezVXlc5VGvYTGNNPkXbXpJrwvvWGhSzZFHF J9jQt5gPHIWFXrBFKA9908Ir5STcq7Mcpjj7Z84eBBxxJvSndidhLX2VdOixvW1kX3ZYqM+gFvWx T83cuF6sSc6RNjmdJmp3ruielRtln0mEGCS7/rb0MIXis+ULnIUlmP4P375U3oJ0cs8cm9wX2djU Puw1AZIBSS/Pz0zWOsHPgsWTXH8PNkRSyezChvU5giS19QbdOwtkIchE4hNrhtMMEGfeTl7UTCwB TteczSDrybXXqXoN0DZzIZrXj3KtadVm3QLrMM+ZXmYvHzs8Vl584QkyJU+U4elpMIn66Y1yizkZ b1C4+Gf0sNYmvfzSGdjt42Q/+7Jenby23cQGsMPGX+4BszAW9w0ayNBoXZlgiKLGbafY3FoXzxy+ dQMwabtW7aRDV/pJiflsrN8Q5PWCCbTbdmBKAAK5JO5RX2wLWjOB27z4Ftdsl4723kHODPKREYIZ /OQkLQJv3rhLZqaSgecZGd93t53vEQySNR3i9QfM3to8hrNgcwfxrGfZ5tRb9uMnGyGR5j5uQ6id okvYaiXh0Wk3xMMoGboTkpoA7X0QdAJqsz4j9FwXz5jhTn2PsqygjSpLtGOTZ2dXXTjGTgKqf5j7 VbYlGec5BVtt4nv0uWlRioOrMyaqjCT2MJpooZFnyA1aP9MUQU4pGSXOlpkRvmVGxkBI/2XAmCEy 7h/JHN+D19Rn+Py0nVVYV/FnIHalrht0lb/+pwHXexykndkrnGSKVrxQgZYZHVKiOrG0B0uCuBqk RKC5eQEzi58IoUW/Vx2QRsBbrUZXaYFf90V1OepBK7i2wtQU1zapxF421NlnT5aTtGp7n7SnjMwT 504ylGSg/JBo782LV8v7t+8Q3Q0T7Y1CoCAT4DqGiHbtJTwwQ+EFi34NbdFtmJkrd++Ve6SufHpd GOMzVMo/S6Hil2kDdQpd1mWKzn761ieM5Z0vV9EhffTex3QiWS4LAG1ZyWc4rE8y0UkgP+BBiiaX B54BFjgy70QDrVM2Gk9E3vz558B13azNnq1/jXC5AutsAg+ownvTL47zThGemil/tjIZGmCNw9Sp wzAxQ2WJAOTGB9dg8haz/r2OL7bIhV5JptnDGsZ5erir1GPTdF1E2zX8qf2f+WeAeN3skiYZJKLz szo6gxS4Br+nAU/hjOi2Opnaixk2FOZlDBZEMGsw0tJ8yzYusaZOPBzg+g+R3p+G1e7hQLbR23mI n3fMu/R6xrraCooD12Pa3wI51kUn5CRCCxQzCEEDz/UY9aY9kqC/ATd2l1AqoWTAQ+7BXiUIkYUe RkPbA5PWfp+2bnwdki3a6hQzuRD8vG7OlK19jncxsJs6QLV6pk01AKZpWRO1+8kKp8OHUyLtWAJD ziUPYMxcgznAphH9FNO7Jgj2Zigi8vfvs89kbLxHwa8yCdtcJQ4TvPHntobIfZRJo6TWOI93YQgF 9zLt6fGrHEBnImjHSG9wHxdv3S233cMwHbI3ju2+Mwug4pnq3NWs9QDc3CPqjy1a7Owite85TDCt 1rSm3UQ4GrS07tLtRQNnp1W7NdC6iZ8/TkrxV7/8Gc7JaJm7cj3ByQB7cf7eUgKaMYbx9AG2u31P rtn360ezbKu+WaQz6tVtuSfrI6unAzFLUduyOWSA80BP+jv3sQncw5DtLwW7fK7cR2tNBw3PpgMb nJypDn2ZNc8eyCRPGaAmMHYSI8/SgCJ98CNf0J7Z2aDSlmkxpo6QcyTAtj7Ee482H+Y5+8W8sRki gqk40630vql7qPEd6dzQOJnopw0A0i2kGWxjgGvXIiUAbIZMqGN91IfWinxYNosvARKCSwtj5wGI PXzfYTye574ElTrUGOyw0Lvq/VnDAQbCnGHa4gGKisawj888fpAC4j2Kxgm87CyUtKvODVtm9qa2 Z8l5ikTNTgRu8AZImV1ZJ/PRT4A2zVTHR585V1577woApKuchjU0S3XnPplBArtxGNbDxyfLY3Q0 efnZ0+UFBkmo1/W612Hm7diSEdBm67gOg4/sN4F9g7Qr8SKDl2qB6mc4223pne3ZtksMawAx0zfg mqLHpJVizzja1wThdG8ATOzw54rdGyh4c5S6Gc7IKbTfPq74ryp/rH/3OrTJ9VpaBIJBtPZJexel K+czthFQMwjzN0cw73Wps3a6rHVCK+yzE8fOIns8E5ty/RpSHu2ogRBv42vaTUW7HhJF2xsNvtkR wKzP2eALAkKZpn2JfVgBHAKvyAJ8XtjBaFf4U9ZPF0yAFkMK+Fm/M0sm92o5//4lgOm9cmSSoV6A a43QKMNAZKJXV7imvd5CYqNcoz7hxnUyvXRyGiVro8zQSbKbsL79C6wv/069AYDTIjclep4F9dFr dqBJFoNWc7D2HYzOTkvwuDHOEdlwQbUykA6AWAIseW7WX1B9BUb9JjUxI3TveeEzT1C8+HI5fPYM ErR+BhAtlctk5l5/43K6gtwhaH72qVPlHETZycMHU/MT8ieoDgkde2KYrl6VWYbJVT6Xbixxwo0P TqlrzUi5vHbHYF0kougVGjtiHG6mQSuobMc6gtUVMl4OPuunjsRniM2zsYB7eZNhRtvo190LAkZr BnyOvuMQrS2feGW4nHnmESRuC+CPe+XyR0xBZf7D5RsLpYNBeQNgoQOA4EeOII0Fi3h9i8gKDeg6 bF2SjeL6VV128p3xgZoXM0B1joAZEQcBOX8hUiOuI0OM2BsL7Nc6xVRA7TCqiu1ULLQz/GcDaaBZ RAd37dKNJf3HeZuOEXydewu77Pmcu0ZGGtXDjgG/eIy6iN6hUepAIAc4YPoZ8YSQIgSi58pnLr6w T7cSsGCfWm+V/tcsuJNLbWSQILg6o0S6kmtpMen+kZjShiWjXnla/4wJbuBVc5z/44PrPRjr3flr pBlma2WvUboGJX+p9xNYmAutrGWiDW7M6lurem1PVvskt2KeChj9CGHLAgY8+v1GEpKvux4eWtMw bBx1YZNnjpQTjx8rbT97h5TJbBkB2D5x7kT5Oo67Cz3nx1dvIvWggJHD34eRtTF/Xw8MZddixPBe wbpMIhtk+tD+cmrsBEUzDCJAh2iHh1NH+Ttg4C6O/6evXSi/93t/Vu6gD11l6lgHzsSey1YrHwUA nqKIbR8Mq+lDo6Q+WwLKUDUPTobZtjJpyK6BywPOTSX6bgHq6PcabN2C003o8eDrrn1YYw6/zKoA oALfGpV5KFIQgvPtVHJxyDaEMmkr0aV6AKyqjqPivaJF1ZDxXNTsZQhCWAMnCAreqgHfErSz/rZu a23hXK4PSDmLjg0wlMeVKF5mpIkTw0RU1t7783qcXmmApr5WZtO0mIyIDrWX9erHAMlN2DotEC3O 0/0Be6kFwznotBJkC05keHwfm8XLUDWBjAxe9pcr7QXnJFVnaCAgY92pppi/r+lcotutUpdM48LA LsMQrt4h7RntOcwgwLsboC+w1eCv0D1GsCe7Y7P/vUyhwsnZ4YSfa4cVSfmjkTrrbaHljp0fuM7+ YYINGVSM04opaFjbiSPj1ZhgcOZxCg7KMWXt86E2JG3HYoBYT6UcHowU/DSBq72Y10mZVVZLNITa PYGTqUdXR1YA5p008rrDPWQxadOoHnRd+QvMq8+wgzOjhlOtdNazaY2UIq4YMNbQ6u7mfNb3a5g7 ZSOuKw9nBYZaPfipYwfLqy8/GlYi2QGLjtXUGazxzANIlDmoJYR9icZSykfQw74Q+MZtuY84u/0A lSHW1uEWZhgMoAxEOvk9z98IxTZJGmgHWMc1HPEhJAp27JGZNh2p/t3nMQ5ruDqnPt6BNZUxt5PC bobJVD1r6i5NtQNkqj7akZmeBgNI1hamTGlcpqgJbBBreq07uzhS2WOlQwYmDnxsjF6yLU2w51rm dRvWLgyMLJm/1wRurv0KWlzT6AG7/HtrhaAQBt5esPamtcDX/SgQkZ3z+roTEMom8s+AK67ZIJW1 2+Pa9gNoT0NEyISPjgOAYJRTW+CPWoBu0bn68jz2WlAVO8Yz97l3yw4ZTOdMO2WtmRJKgHr20dNk EUfLbQC/AEztud096M5WTsBSv/r0yXKWTORppCy25bQI1baGGZhkYCHxyTPUBlg0afbHi0us3NiU 7EWDAAKdPVPeojRZOrN3dlgxgxJCwoJmi1kBnEq3fB5cC+iqdNLKb4jnu58AewnkOHdnrmZH7DEc s/EXvLHPMH6rmqd8hrlWDmK3rCbLWE1OA8Z9phbAyZhbQIa0Eea3A/B5jIzBPgJMn63PTC24xfb+ vPgtdeh8XdY08jAeyTp2w2yNAFYZmYGkmSNBtYPc9BdpEOCfLlsMh9fqumgnLWb0HsgUEBDd+fhG uY4sz/PmNNxjZEmm8K3mV6xN2EAH3UFdhH7DrNoWAf99so2X226hxwYoqT1XWmhtglI21kIGMYNX uLZViiI7rD+B/LB+Y4MR3RJD3Y7/JojenqutHTNu0DgqNldJoQtQbbmyi3UA8W2K2/dNTZbHCd6e f+nJMkGh3R7Pd5lA6hqB5i/e+aT8gtau96g9ehw56ZdffbIcojDWbhoW8blnZeJlnftYa8kAa5Pa OWvzyDBuMRX6BvLQNR7AKOdjnGBcZnfE7kkEMGrf+2zF6TOxUxHSnmiJCXTdKpVRxc5az7KMncce sL0r2GPzmuHyWW3y/mqHJSAkPbQvTk5Uv9zPHrWN8CSZtiGyO91kpFfxcTeu3aVP951yF3JwaWO+ 4jB+12tsTWA2U5YzYEGh+6+x08kqiiME3ayxw7p6IbHsbOPsA7XwW2y4bgkGrtOGAHbxEiModVVW 2OkeNDiJjhtP7aPhObp1zVh67njAad3ph2s+yzUrX+xWt09NxCBr1z80zD2TqcHuWxPVlU4rtVlC 63jVLFWTree8p5MXa9LqfGMmJgMLhQXJ3tdrA/YFH2kibDNskNz68Mdany2s1Xq//6iyEAtodmYv 0Tt0JkgmkXtYEA1aNSZJg5n+kd3Jv/X5piH5tA1NxWAVSgbgNACzeeh+JXo6Fkbmp+YAKgBpkHxe V/1fJ4xUB5vhM19+tvwGWr5/8ns/LN9j8Mh1jMPXP/ds+bW/8Xmmzi2W99FYfXD+KlrR1bSZ6kDz mQIcDE8/DPVJ2sm8/OIj5XGM+8nTBwBNHBTe++3z18pP3v24vPXb3ynvnOdw0hdzEe1it1pWJCXD jiD3OnmdV86cKGconOgDRIWtw+LJ9imsT3EZNz0ACLC6QYCZJIQPPNRj/WyN70wk1YDrGq1USckD ZO3v2ufS39XpSiO5fjrOBDOVpZEx2RJc8WU3YS/tkvYzNlgwMYvTuHdzrswQ9Q8AQJx41EG/vYxC 5b014hKj6TCkMXb9Ya/WHVxit5MwweKBmuINsDbq9jM6OYtO6rNtbdq0DGzYa/V/KbTDoQvcyt5A nus8Or9d2FY7xMhWW3i5SyS7CHAd609OO2Oo1+k53YOz03ClalxmvdmPOtW052m0jHX4QP0wnxKw kgAk26xxuPrG2v1AbewIBixFObaV1GjihBa5tnm04POyp+zxAcBHLwbJISv9OOkB9mQ2tiyLl4rB ts+0RXADoxTMoVMUEJuD8z8ngzlcQx23z0eQ6HCWRVt18f1h2hvJTtk6TwPpsAa7jbi//HrfGGw5 9y8Okx0x6HCQiQUb7pc2rqnHITi8v1pZU3gW7+0AoE2DqWHddJ9qoFjDTK6ENbHIz/WRVe+VkWXP zs7NBmEJDn2+GzyDrQyWqSx5Rrkrz+E9zTKlRZyAD2M6gPH0+WwBQnthtj7z/BPliacfYUjITQIO B5cMAhTpc05HmG5Apk5jnTXwJdWcbsoMm/7luemgtgBYBlw+e6edDnCdEKx0ASA1DEhctwsJ12B9 gcVc6k4FhjMMh7lD1slhSeqVB2B4ZFxSLZ6gTE0+Ux2R/9zXmfJcFriuAa6rDTFx1ecKLKtcTW2r 4F7wZJai21QpgdHqLDaGdduy/oTrqv2c+X5aBtZORIIgU6h+yLbIjvnMZch9oKY3/dCh2flAKYtn Rx2wqdb09wZ0jk+P8LsOxNlGqkZBEK896hAiO1YYsPgkdTbCsQS5Fd1FmuIwJGtCnMjGfazg8MY4 g89OI9exCIl9tIoMKNdiUGZXF885q+9ZMbscH9CcL/W+slUypTKxW3yuKKViyuJwe0959sz+8hjd Vn7yez8ot+/MYHMAZ1zjc7CIL9PG7UUm7vYbyCwANumcI+hJX2oLpHgPJScCbsGVGTHBuUFcC1zX eFlds3dbOynZum9rkfuzDSM/KOvv2vcjRbOgz24vm5Al9pIXXFusPADT3jkyVKZefqKM4zOW//UP 6bJyl2urcrOw/VnG6vvi9BOwNsG668sVqLO1B3YF28ZdQmIPIOviYDPAi89eJtGz5xmWzDlLkXw3 vm2d4EkgmqwLLLbdbjLBkPtyyMwurexsXaoNkJCI7lW7QpeVPkBfJBdeb4vM0SbEZqsbjgfiUvia 2UXZWR3F0kK5Q3ejt3/6frl45W764D9Gd5YzPDczw3bY6dYp4KI7OTv6wDXWa/IOrCPn78Kt2wzu ociQMxV7WNOcTUcKAx2yeHdFXtiv8d4ydhwSDJu2ssxeMzvEQbZDiqSGcxrSHyTBrFyp4In7ibsz Q8fzdO3YH18AVP/N/+xrpRuWdwbts8W39lb+6VuXy7/6Nz8NiDZw++bfeIkhMY9F7zxL28lB7Pfg ACQOXcIGIQEufAgQf/PjMnN7FhJpk4YEPD/W+hZknuDarPSkfsG6EIN/APw6n6v8XXv+jW+8SL3M /tJFKsg++2qg7UIziO0fgfG3+HqDOg219XaGyqh5M+X6Uc6D+wWAErmdvbpd/5U8FtqCIpkxs2Uh /zg1ZZ8bHC7L+KMPP7pSzl+4XG6Qpf/45hLtNFfLSYqvD+8fKCP49hQHsgklG4IrVBvYfljdvXaP c+7e71QiYu9zrrHHNrwGPm5c64t4zwMw2J22eZXMSxqF/WgtkvIrCSW13RBHXUhaJHssCN7mPuYW CKrSO916HolV/CU4SWlhD/u0x1ocLswJjcvU/qwoxyHzmFa0QhoJPjONyqHCViv7UF2AvDdNDFzH Kt0KdjLECB6qfj91spEqVpJQu5UYxGvUUhhciMkbmBBsyud/NHDt5MXN+x9TtGO7PZGDQnMjhNaN VKDS+rBNkw4oDEkDsNV6+vdOI9CA6gp3oqv2r9U65iVy/0kp+3OtWKMaL19EfZTM0AagegoQ8s3/ yS8xiauj/CMM95++9165g2H6O9/8Gm1tjqMX3QdQ7KSV0NVMNvIV1CbqKPfh+F95+cnytS89lT6N N5BO/OK9Sxj/++X7TGx6/a2Pyy1S17u79P0l0TNCKtNWb8O9/EtDsbIEGzNMAc6JjD9Pyi3/eU9N qymuK3eWPp6WzjXfD1NV9da1R4c3LrOoftDd4b/r92SfYlLyY9lBWa6konT2WSdjAllxd6T/q9Fa 5AA8KyO9IWUYNnznU4ZrhlRPS88ZiY/9WClQcaR4t/ov3w6baCcon4K6TAsDKu/pm7SkLRZi+rXK KmRARsgRi5oqS59exnZMYG/00FEhvaY1Hg7Y4DrtNy34EVwbFe8DfA/iTJy41c0M6z5b6PGW1qa6 GikQy3mqLJApY3t363xk+NJeKnIWqQ8v1bVu/vQXlYgInJsWRGE3+Xc/YHQfgVLSg6Y2Mayy0MMH iLTRt0G9ZWytfaxlfM3EnIBtOoM2331JYjYpTEF2wAhvGu26bKyFFD5RickmnStD4TVEH64UA0Al uJStt/hDFtsCK7uyJFXHL7t/0XZk4EOkVHbDsPE9IKZbcMvDAtvH6Aw64AjjuWXrOe7QYEGWpgcA sYahHJZFVMMIILPLhAx1ilACqjxzMOAZIiOoMx1dC2ntVZ8TbFajdZyzHWsQLUNoylmg59f8OE5R zAtIrAQ3ty7B0MP+CDY2AEG2w+zlfrcpDKx9YW3nRXDjduZ2DZpGBQ1d1ZgbCKoVdnNadOT4eB2a 0x7V5Ru4OdHM3Wr6eRn5gSzdIIbdTImFnntuqCDgKmFZIUVtIGenIDtXzJING2WyqsOlHKbkHrMo 2qyKe8O+t+7vqvODgVdCwXrojGTz7OqTKFS718hKOtQUGuBVcjq2IkFoUsICd5wFD889YdASVtKi Wn6ykwlyFqR1mxkJeApFkxS2bdcMurVBdk5YXl8o4xRk+hw67JOeYjzemyOqk/esbhNIDZh+5hmt 0PVmh70+QSFTP+AW1FTWO5EuqI9VLuU5UXrmkgl8Pf+ySy2HZq0FLx7JiD3LBfe87jqMZt/gvXLs 6L7y6BOnS8e/+RFdSWbo5NJTXmIWwJfpMfwMQ8ImkSWlQ4caVXv4E4iaifI9q4qlyZAKWi2mqwe2 sYfVpjo8K9kDrw5wYDeXGQrTtwGf6f7DHrGw16yloMagZYu9pyPvY09KDm0xw2DXVq2njpfOQwdY w0Olw24EoeOad4xvEzXXvR6T7OVo8xr7mGcTdrgGwHlSnG+11Yvco39mAE+Ydphy7M3TZF0nKZb3 eSqJUuLlmWuLjrn2eTeVriRJAsHifo30Gq+nTMw2nvaz7iVQ3wCV1b1V/Wn8gX9v+el8UR9hdM4a m+m4fbfcQmZ5EyLJNbbYb5pi32EC+Ujm6ObRTSE5eoYE0QOMtN6HbTpDtnehexl55X06y9CmFl9n Ub3M9uCGXcTcD2ir7egjoOfc9fB8uhyJPWhGjyJzLgNLWLvRuLWSfTWwqt2gkjEJnyRYdFof9t79 Djgbg7meJPN8F5A+h8yJZtDYsvXy+psXy8WLt8pXvvhU+caXnkEOcigacCWHFvuNY89HkY06aO79 CxfKt/7dD8vPfvpBMs/Hjk0wq+IgRADabMCxv2fWTlM2TweN61fvl1t3Z8u1G7P8eS9nxDaDn3/1 +XLg5P4yhsTKdpHzSE23YeZtNGB/6D0yb2bwJGzgKGqG18LvSFD4lBTBVix2IJfRJmMT0nFGWSLr YEcObc4Wa2Or0kcePZF5D+NXR8vVS1cJyubLPQJK/fnuCDYSSZ2Dpbq1XTDy6ssDQR1GxutJLLRR dLnr4CtUsVtmbdlXtiQOWWrKyO56gmVpNrvL5CUqvpALrm0lrTWq2TzrS7YJtjbxY0pvEhyZHOF5 T79wrPSg4caQUffGSHnufZXzuTDHJzU1a7xmp/7b4AM/avGv+z4kBNckGWRm0Qx1/Lr3wrW0CsKD izxrDVZKC0cDsio9z+9oA3MgawInJvoBJG3Oy38UcK3GegtgvbPEFDkZJDeIh/KBoYmLrfDPVEBA jGkDJQUVTOQOmhSCivsHTqWFIVuH31eKEKgarYCkUN0VQMWONTKFVboMCG4H0INNMU7013/jsyls fAut9fkbt8sffP9NGKXu8ihs7RGkHVeu34cdYBog0ddWB4COzTpGFPryi48DXkbLjxi1/ff/6bfL +YsXcPZLpLsAFRxgK1AHu4dxqGj06E+5Qz63TQBiCpRNOAlIOUoVbV/T5sauC240WRa1S+2yVfo1 N3HSE3XhauDQML810gjYa6im6nndA600ZJ5+ZYLVs7sgBghJR5qWTYFV0z1CptJtD+OmFt7UY/Ck KS8ChGEM+JTyC503UXFtjce1knNMJK3OTW0TTHXdnNVQZyJkwFQdMR2W0v/8WhxNfV7RzRsoNEx2 Js/hIJLV4KD3UWxpyyAlNCsYGzt9mOZbcAoiBVkGAz285hBrN2wfYsB+nwCSe49URDCottCvyV4L rJ2z68GO/Mh2fdUQ20M3S+hBjFHweiuLE7bG7/G8vD7HAw9jbAcodNLo7cG2+hK9MDS9Zw8w1KSv HMBhT384Xj5+92q5cXMWR7kW4zaE5s1x420y0YBE7EtTzMT78ZwEGzrjWpRVC9UEaOpKsyakMs2k uDuWcRAraK776PYhQJym5/cd0pMWWTmSXYJza9dOI4A6nFQ7Dq8DwCUTEV2jnSOiNHAoE/pkJ5dZ oGs6jdeXDesEVLdxPuzYYsi3xh6RJdXJ9aMLlI2N7t6CwDCUFttYTFN1inXdNNC1kMQ+9ZlCx8Xp XGVUVwHXaqo1uuyqcgIt7UkYzLUNdL4YbeUz25wzx+S6P7V5fUqFNmTzCMJgtTQ0duiQLZ2aQErD s1LW5LAXsfUGe0bmW/CRKXqCUu5okmBI6Y7s9zJBpOfRVo9jBBuV0eOeImeg97hsN55ujdS8zPA4 +0BgKzutdKXWlOP8LY5hTewDLYPfh02QRXGSm0V5szC9pt+71VnzvJ1gl2Iu0uiC68o1yMRbPZ8Q MftChjqFbxEB1iJM31sQYCGr6+35DAPE3wWxMt/ztC3cchhHpVITYKlJn0X6on7zBNc7aKGroFN7 mkCiKTJO6sktWTMBtkpU/+rwqAl7RcKG71DwjAtvguPK+gS4So8ABrQBHirPlRrMvuwR94TpAQsJ nYDI1wAZvfSrPvXkOXrWT5TrN7bLyYPT5Te//Fz5ystno4tXK89BD2niWgkyrH/wPrU/2je1z1tk XgKfkz2rXtFVy9Ao7J5nOSET536Nc3SHXr3WvUxjo9fYTqbee9eRyZF93IFpS8su/t5t+0B+f5X6 A7XWo3b1gV1zYmq5RxE7HSd8lpWp955bZEfMdLO+jU9vSKW0DwtLZncLcXBtJWfdhOB4XtkO/tQR zUcPj5enqdvpx5assF4bMJXZdWJZWTbPmoGSvd3iEus00nQJkiH1HGoPBD/6X3WmApRk9xoJgDY5 wvFaAJoidWsBIM82IKTu0PrtFn5S2zpO5vAALRHtPGMw6oTAXjI+Zj67eE4JcDzn+MFJAPgQgfAS HTnuEpx+AsDuxx70qKl1cAvPRPnhYdoiDuIvu0dgiqfoKANjLOiRBecJpL7EoNTaKomAnIlEL4kb UxguPeZX1t3TMqksh/Usy9iEVWdJYENnCaJ++tal8gnP7AgzE75CI4JX8POGhHMzs9HvjwxxHXSp UF71wz/9RfkRbP0CNQBff/Wx8uLLjzPc5VCInR7b2FlPQPBqlm4PezoB5jhGJ5IXtTXWPbCGl6nD +of/7LvUydwvv/Q3XimnaT/pIJURbsSM7D2GxFh8P0S9So9NCJzqy9lUusdDBXxbG8Kes0bAFnv4 7WWChWQilZDw/dgVbliW10mJssxq1a2pOrozBdu+VWYsEmZf3CJT18m6j/HMdI3dEmZOJ+6u/i+D x/jT5zlAHcL2Bj3Q/bo2gX3UBQmxoS9lb21i2xZ5Pf2ren8LBu2nEaJQktBAyADfbKbUB89mHZLD EelmtHoGsZEEr05t7KHLWjdTssMNQwbZTUWdf4aIJTsnqdMEzpooZZmRwVYiz/Oe2RrSA2n+o2Ov 5ERtmuA/BTt1SqrBQyc+0SSskC19vsUubCILTz0HmJn4szDY9Sj/h2eud5FQbN3/kGhrJinfaLOE yy1trpcS6K+Wq7aDC7OtEY6koxaQpZemTFiEc6ata9RTMWVlpANAZW00lqyQjEUifwGpr+3CNUDb f/fatk13wWHcZoLaBIUpn3vxsfLW+Vt8flzefu9CNG+TY98oU0giBuxprQaM9zH9ssGGkR1wQuBN Jk/9q9//SfnBj38OeIA5ZfRyPwDQqUz9XPt+HL5TqozAdbAjFMTs4/u4oIBrq9J3AAmmziwKkI10 gEcH7db6iMyNeHcDOH3w1SEYLoWVbhbCf+XB5v+qQUlk6M/XfzZmJcsahksWOB0FBL8e/OA3BwgQ ufL63RzIjLRtXk8jkDQ4gxWmjwEWOURXKVqxnVyAmZXK6pl1jHiDDhBira7XuLmpW9kDz1lj+AKy qjSoyUE80JO3Kvkj9AvCVUNm94nhchDdq32OO+jgIpgZIfW5xaAeK+aXrTzPgAOKHWVvlBhgSHZs wM+hCUh3CSNPgk0wPf+ATXLPRViYtW6xpgL/evBYK+1ljCU9nXEiFjf16+AxuMp5dHwLsBLrtncC 2PVGNwb7wDrI+h965FAZI0A5fO1+ufzhjbAaMr8Dyj4wFq6zmvZkC3BOFuApC1IasKVmWOlMUmQC HdN0rAn7aIc178V4zqMPnAG47+/alzZx++i2cIfC20UMVpdaRXo9W7tZdVc5dY2O1x687DOXh9fv AXQ73bGOmiddyzUN4ASR7KVmQSPu+FqZkllAcAUxwGD2zLpMRGQ4FgqaEanV4BnGIZvAu4aB5c8M 2lEVz/cEvwaQFg8LPG1jJss9NTFZnjx3hur2gTDClQkFLKnllYkgkHF/WWDoM9piDLvDXTpwPMtb Dr+gvRTAwz214l7jZ3RsTl6cRTozwvm284ydMNRK76MOYsBCXtbM/a1OfsJe1XYNkQ0yk0CgktZ4 ZGvqBDCnq1k0i4OmvdedWwsEgvcJnukXTGYqBEErzW7gaAaM33da5w5M2SIp2S6uv9+z0qQudS7p 2coa1kEvVctvtw6dlXs5RYr1iOc5ylYrUXJf+zwE/Olh7XrmGdQg1yC2G2Ayyt4ZsN6D9VFr3T18 DefLpEgA8ipAe8ee0DJZvkECUhhOgjYzKW3q1OOUGN5AhkJnP9E9lmKksFAydoK5aLUraxjeOnZe u1w1xSkCc76BaWapIfYoGysSrlUC0J7DR8qB6anyClm+GxSsvkJh2RfpCjKE818jW7XnlEd7Isfw 2ZmkOkwDDX2G2YBO22/KtDckQ6uIMC3MLBT1fT1bBhtc+yprcAeGcYwOTv1n6L1uuztAhGDPPW1q tQdg4cccRfHah8ZX09iCbkUBRLV1Yp5hMnIxPDm3StbqlLfWs6ugpbZVDY3Nn3ruurcE2Zri9Gbn OwswnQLECbpBPHL2aDlpX3HA1TJ2JwXLBkQCa8+VwMYza2clr9O+z2Q0Vggg0pUKEGsNSPaQBcUG DeqtxRmyne7bSPd4Tq5p4xN2CLzXZukYBBD9mM4gTuTz3B04NEav/vE8fwcyKUVqg/nst6XoNnUY BAA1WEOehX3TfllA/Mknd6sd4DllND2gTpmW7GMfrRFHD5E95U8/1Y+vC6Z5FHYHshjcYDv3wGun hsTVawVwgny11tHhWygHQQMMUvZRh8HZIasfnfXV8kff+hlSj87yS19+qXzmmVP4mL502+hDv26H jWXswg9+8FZ5600KVykUPMjk3K989pFygo4jw9xvx4Ydg8zkaffxAfy/Z8+2ew5h6sWIjkgqSAAA Esep/dqA4LtJEeqPvvs60yzPI/E5Xs4+drKM4VuUoJgB7sI/5Exhp30W9u52mI88mcFhNw3C9b+C TJsw9LAp1yyIdGCPcpImY5LgkGe4jL+cg3RZopWrswpGhpGLcD+3KY7vY48fABdZxLdJW7xNCi47 oYbbkN+0A7LNshTHL/O+DklzJytTFKtk5DiEzCqtNeWFtKvZj2a9lAGL1xIoKsG0u5GacogVAx6+ vs3vavetNbO4et/p/aWfQMcuYYF9tSdepLVxWOIV5atmkPhaS+7qOQu+UOrGZt7wPEjw+Pv824A4 pGSIvFoIHn+VkZSet4jjasDJf2aMbDPr2+5JWCi18ozkpx9A0v+w4HoX57Y9dwXQOI9DJzVqBWv4 dR1RTfOk16gsaRhtRf11jHEYVB6IbNgem6KPTdLF4bOX6TpRlw+jpXOJdk2DpAxE4KeGx/fwUbfu 1tRQDlmNK2p7L79mSpOfnaPFHhvo1WePle6lF8u//oPt8s9++HY5/yHVzjRDf5EK9MUnjpQ3z98o VylQ8cBvcD/zvPcckoOxg0OMOJ4LsB7uQfLhPHrBiS2/uB6OFL6C6JX3HoQN09Ft433G2DQHKeAQ gHmpOwy22BvDiABedfBhmpCkyPp5Px193JOMVSLyho0PCyHqzhZpAFM15P5XSakGbCfq0m/V6tla aGj+X1ZJw65R0vjb2sjK8JpSSXscAxajTNvnYJi7+veV6ROjSXPN0TFiYY4DzOHt5HcsnBjt3yn3 d9EYM2hkEzC1xnuur/K8M72qShPUtQ0Smq9ZFBV2UVbFgKc+p26KXnphEgwZV2CMHBPdPzxWHic9 /BwV8beRWAzodGQd0a6N8nvXb96FcbgMCMSRcG/b6NdcvT7WrR/D2s/h7ebZ9ZHWT79vP3VmOpB0 J6mjXi1EcxKW7JdSAPG9gMXxu4aqy3dX069zaIjA68AB2BR0mICaPdi7XQ5fByC4m2uSLonBp1OJ h3oT2YKa2iFYmD6CtqGRYYp/GHdtWp5U2ApG/iIM0CV1paT9xnvowmED4CpL5j4cxsJaMQ1MjeoA EhlB4oDFVRTiSnEtMuxAiUcnbet2eN+uPjurTJQd9u6iQ2l4hlM96uEs/ANcDcAEYCRkfQaovm7H Ac9Q8W8KsB8gNQjTArTH6NIH3mTHDuAZY9yPFvxZHMB3OSt3WXcN2w57acUe9mq4CRYEv9kzrIVg p0vAwB4wCE7bLQE4X98EtFh8YxtBmdgt2LBJJrOtqWFemi1fY6jDf/6l5xlWwjIRPNg73DNEM9T0 73aOmA7DPbLHwq3NAjAYDmOGYwtwpp4coil2eA2GeIV06xJgdg7d4QrtvYYI2CasmRjdV3uwC/RY x4Lmr519O4QNGoYxMQDW8Rv8qx8UUC3TOUhj24vDW3cwBm90dN9ECgJvfTJThg7Oln04HIc3xKbD FlvYK0tlsbTM+FFSwceefbR0IRPrOjAVGqRjne4k/IyDbAR1w3ae4Dmr+1XLbmavDfuoE7czQXpb s486YQbVhCt9Mqh3op2ci/+WzVYm0oN+ffL4iTJ64mDtGCToI1swZkEj5+gynTnuMiCor6svHQTU VK3Dhjlhcwvb0W9PcJ+nfbJhmHyeS/z9LgNXDh3YR6BiOhlzZYqY17bNo45VULbJmVSSpDGK3eE/ 5Zd+bxvbukVAJ3ldbPPJdXfQWm376oflFADtf/tfv4rU7g6kB3taBtRgjUzPJutgZ5gxntEOGcbZ WxS9aSsTKTogpSG0DGYIihzrbT2La+J77abg07ZztVDdYki1+HukyHfcdFzz6l20zkzx7GqjOw/d JCyc3gTItjIwgleLxAf3O+kWm8kZ2gS8qknX7G0a/AIke5QFAhLuX2JSMGsyDDBMESuPaduFkCRK VyCLwpqgXlZOp4gpWPMZK9/Y7ONsbDKJj0JS9k4vw4dWnAa7wT04chu70UOhl7anLT2CKcgX5NFY YAV99CzZrW1+bphzq9ZaVjhtyLCX6aSArdzgHjvspBQdvyCGReF3DWCVpazh825cvFYuMm772g0C EYLII0giDE77LOJsWGufcS/vj6g2YL2H9TPT5d7qJGPXxZ6zs9MAhtb2fPYwNqNiP3mzUQLhQbIH o8iD7Ddu4bGFxO0OdVI62Pj2XYfHjADAWM/OHQpPyYS1cb2dOLdeQK9Z0BkKy9e471uc/238tTIf bYEBwDV03z/9s/dIUWyU//q//FL5Kiy0Ic4e+2GUfXPw6DiE0iflv/97v19+/9/9aTl7aqr83f/1 rzM0aSrShY11++JXGaXvZfcq25ru8bwiDZEgJBMl0bPhLxjHsW/NFn4RcL62caq89/Pz5Q8h6378 e98ujz92ovzS118sZ146V8rIJIN2rCOxa4zNBjrLQeyWQfISeuO7douihfDoGOPE8dtKfJTSbG0O wH4vIkeZRb6zkYFZ614La+3IdLOn85tLFN1zrtFiW1u0wT66ZG975BZHOFN93MsaNtni3EECcv1d FyTi7rIgG1IQP5UgmTPrz2ygWHBM+l4b980xFPAbNKc+kp+3SH0OUvPDC7foFsOkbNbrMG1zR209 zOsMMWxomAFcyjiGITUGGTrTSfBfOHtlwwJ1/uwcymyU20sz6PXNDHWXM5BJA5CCkjqSOXbAMcBu J9OqlCjYw73Btfsvh31pdzLKXQIBexHRqkSeIkjw3Sb3IlFnG1hb+gJtQ7DUol8xZyV3P5UxW7Xx H+hDxnp73j7W6M+EsLUlQsB1qnijrxFYizyaMQeAUIGOTEyGh2hr1d1xoHcxrgFdRqPiRI1MmBf3 pl9rVMV8ryNMgJuvvkYFnNnDTbTt0w2tUtMFatwEAvw3ipF7+rFD5f7VY4j758tHjOz8yS/eT0pg CobyFAzUHdJWpg08+Dcwnu9TFf2rX36GavYj5YP3cMw8FHsft3EAjKqMXHfxpIJn03fqQgVxm4J7 hfZqlRPAc4AF+jiL9k5HKWvkBbN+k8uNkqOmE1vjwsXMFYY2bLZ/NkDaP+qKNYvQUFsthbZOrcrR W4apvk4NQiqgjw5Jp9himTX4DUvl8soij2AQbc21uTVXVhcBybKCPNYuXnyE4pJOnLCFoAI5103t ZuQhOJAYnaS763X6dv6fQ1iUpLSRdk3Rd5getaIMjQGMasCNzNXAm7ax8lo92W2LzmBoVwF3gwR0 yjIyYcpOBIBSD3A39+azsLAy09OUr6h9zYTLmv7cFRWoaXbpcUpmEzZ5TZkHi0g0nLZJqwARw2Jm xdZZdqcAgKaXrq+LETW6kYlqt9iKuzRC37YtIO2TBHEDjgIeNWhUXyzTZsESzm9mNbKjQfXLXlee rQDBIrqabUhK2mtRd2k2BuPvfnM4ies5z3qsr6gdrsWTfau0lyIAkIncxQBmmIJFWoNOFsMRCYZM D7Mv++1WIwNjVomvDyg5Ga5DM2QDtpXjDO8hOcHwyUaZVuMSfWeDYp9bipdcAoNHnF72jIDQfez9 2FPYTElYA5yigTKZhC0zJ07Kc7w6Z3v/4Hh54YkzsEKTKdQy1djtMCF12TwPjaUga90uDwyecANm XDzrbpJihzXZw8Bu2HGF69p03D3FuH5aqKNed5J7GGW97UDjPa5YhISDXYfJtdOAziHMjEbXAUMW zMhmSDAabBrw+0x4fVn3TQKLZYYsuccWATEZMuPZio0TrHG/FgSy10dZ72HAzcgUEgIYMryfIyAB lxh0J9DRN3yJftEyloqbbOvYagdVO+jYuULmX3mGyyqS9KzVlmAWckaDKEPE885UVpbfFLJn2EA3 HS0MuMLq1t6xi+zBmb55rpNAEbZOLbN9hJdZ23WLYQEcQ7y+BEVMqleX6EGzYocApW1KuqKxqlmg aKDNYNXiOrv0xe779/Qyr/YqMiiBL86rk/O4BUDyGRyaZLjFCgEg92hvc+8h+ndtFP8JOOyXvEqQ mxZeZgXVnNoNgNfdMJvktsRph002QFCuoWzCa5R84HW0w8ko2U+X+1snCzd3a55N3ctaASw5/9uc bwNu79cpja6xJEGyiJpOr4MzuGTbVl5XTewqTPzyHgCHfWbQqa+IBjia97ilmtWOZK7a57DHxudN Wz6v19jDrhDuxVEA1rBTAsl2bnCdggJ9a20aUM9gBr94bu0/n32NpIT9pJyu1y4bEAUGWRUgmEGu XYmSUZZZ8Jlx7jpCe5s1g8GjDuHu7dvlJjUkS6y38oD9Byl8Z3iPGvU9DoMZC31NvRUDhsZbpZCM DJWZWr8vGSErDGDqWSU7ZvtP3iOzA8hKur97LcI2e8e5kTBRtiKw3LMlYDaNvpH75bp9Ry87zfr9 B8/W56/dUXokPlixowz7sB8yax/zLK5dXyg//cmHySh8gamjTrvdgtSxXdxwHzIQGOR7V26W3/2d 75Rv/9EPy2GA3G/+0gvlsWOTvlEkImIcJW2CK9e/y+I/63hkuXiQBmBNCrqeCfeaZCB+qou9JmHz BMNpXN9f/Oz98iFA/nfRQT9z6Vp56gsvlImjJ3lNpKPsAaVCFqPqGyShrBO5xLAjQeIYHXZCpPme PEPbY3ZEpw3yD+/I/2mz62lPE4a4KzOm2P7Dx/dHivIx5IMFsO37CNIo3hwi+7ABsQN0Bm869Zaz 4ORrbaKYzICWNdfG1L1LpydY6BvX0XJDatwHUC9jQ+yyts5zVNbptNqTdEubppe9rH+bcpTpIQgh SB8+uh0cZPtci1zV8Sh+lrG3Owq+rJ0zNAw+cw84BE3yIfNQ9M8J7iCzsKsDPOdkUA1kDeTdQ7E5 tdWlZlM5WeZNGBw7MddJ0ZGBWDRsu9CKK8UuFqFnGV24poYjINstWHf8/38/thh5vHH3AyJKDBFv IStoh4YYbQ1YSp+92Bbi9VDodEwDWTAjaKlatjaMqlXZGTuNQ0wv1OQYQ9QGtMRwtM5uoxluTdDy znLodOZ1TfKVjFC3cjQOybY3pMZMXwFClDt8hmh1C3budaKqH713sfzht39WXnrxiXKEwotXes6W 12nNswqonkWj/SNSQ1944XT5witPMvqTUaPn/9+s/WeQpml2nom96b0rX12+ve+ZHoOxGMxgBiCw AIgASRGkRMquQvql0EbolyKkf4pQyERoGVLEKlYbZIgEQbcAYQgMYQcY73p62vvq7vImKyu9qazU dd3nebNqQHJjtdzqyamszO97v/d9nvMcc5/7nPMuRoWiF5F66QaiIURJGsOqtLa6lw338HNvVsYm VRqua7W2qV6nRcFIsVQeON511in+c56/9EYc4qyBTCJ/6HuSzLi3uXmt6ZhWra4S9b3NH69Apf0R UVI5h85bSHOlKf23DrY1LNWLcpxpagtHlLCqyN+wut6WV1xNzpiTmPZwVDhO1R/YlBVCDMbbppP1 d8kN2FGAr2la64zjXGzgqK5zGJ3YNsHPFnA+jpgaQiEbpWvoHeJxEkTD4qPvvvhO9/a7V0AOHYFu YANaAdIcFKb1otVwOkBgkGBUEMHXiXEToGa10v6xVRqrxKtrC9xuEKh10IERR0aLUnPI5FmPwKOW xLzFwIstitjsgpFeuaL9JmqM2tmoZJF19vwQnQmdq8x3lX4hz76cfWXdFlvHGbyyQJbDinq55bZc 0vKn44T70URCTll6+KIQM9mU9Ytz6GAEUnWzyPTMAsiiFAmHzkjfQSHavm4KAyhqegeu4HxGlwHU 0jViDKOjEdDgOlRkw2l1fJ7DagbJJrQQLNmRSarAjx4/FH6w3LpUiHNzoshWWEd2wgDQ4/JP8dUi pvmrUm6TIua2U7S9HuslvWOFvR9j4f7WX/tc9/O/+LluDGTj+qtXW8eGaVK0ODpyNxlwsMFeZ+Kg xWfylN3PcPkoNHRIg0GF6W/ueZOx8Wu8Xs6i8njIgI3RwLvch72dbeFn2ncNp9RAz57Jrl04w6yb wZRZMM+AtA6fx2yHhZEOXRkgyFm5ut5dhSt5DqXu2V/RWefLiX3ygmdZ29OgXodPHE6/bIttktuF ppJeVAQ8bEA3Cnp/BGh1nIGbm5v8jmVM60d5jSLsUDz2KBCzV7VGYhvZSWGgTrRGEb1hVX0cRzu+ kM4VDZqZnc8BuEUaWodMh9f+wcq6Z+XwqYPdhx8ude+9dZEJrePdsQcxfk8cC0d2z4Ev1lsgY2b8 nJroSHepf4eOHEyP/A0QITnLUqFnI5uqpaKCRV+poeLI93qoqH62jtSprYCe3+FBhLo2iF5h3Swu FQVPFyMLC6XLKJEGyInenA0AQkt6371NliEoRAMxGi0nVIkMn6nsXWgkMq6abVLPOsxm2WEn7P0K Z/oGQdLcEdBcuaGrfJ4FwT6HDrypcbt2cHbGoQNaCCp//zZdlS5/cJW2YePdA1AGboOaSrm5xpCV NYcGQVVRtYsgW2+S9oT8V51EilKXYm4eeIsMWKhtrPMKuu8WwcWDTGN8msE5BsNmlgQ37B+cwlBp QThD6aEfO1j8YuX6Do64dUAG3ZMg6QaQnpWgqy3g9fi6hqFdCfyw9sPSNLhPdd0FKG1vvv0enWI2 Is9mDQ7DMZ9Ab/kMBrhp25cAsGxRtZDVZhd4oS0Z0y9AB6Nesu8TZmAIUlyDtEoDKTUaTM93daRK FIcuS1RMnlxXoCx2zNfwLH3ApFwYYzgMy17fipW+xjr7u2S2kc84SM/yr3/n3e5bP3yz+zhZ0ccf Ptq9/hp2fmm++/xPfyTdS773rVe63/inX+2+9rXvkaEe7v7T/8Vf736ebmO3Ll/ifIOOo1snGN4j ACN1wD2weM76AuWtKEBm2Ps0igvi/tbQG3XfbTI/0lieZEbGOZz273/3SPf977/R/cvf+JPujxk8 92t/7292z37qI2TaDna3btygCxW1NSC10kelG1u/40Z7/vw8bYD6YgodsHDoAM7oRLcKQCiIgLam gBOdwj3NEqDevLnXXaD94FE6WT33zEnQ/FnoKW/Cg1/tDpIlPDwJksz1pbFu4xTry90ZAEDAvxOE Us4sHDcv6fRPdbPP5bn58Rvn6S62xnA9MtycEWV6Djv6+EPH6bJ2sjtH4a/TOy2i136NU+g6ge3b Rg+Hsmlxt46D7RWRWTd6/eYtOrldZHgQ90a2bxZaZhpBWAcCZdE2h1PQb4YBNEOL0wjH/LI+FiNL O8lAJYGG6uEt2KC8XGUf1pD3I/gcdpQKzQWZ2jLz64Ab22DGZyj75h9l8Y6Bkt1Sml777+2vOxuk W99/gSj0OlWmc4lkDLFjQIufkAORcxat6kGrryCzRp4qmKCq5VRaROdi6KDrcDaIhPe2Jyp5bZ5m 4/E29GOfKuH19z3HQkoyhldFK/9bdAtjcWccCgBR8gPnjnXPMPjDYsS7KOBXz1/pXv7xWzmsD8Ft u2mhC236dBovvHehe/Gl97onHjzafeZTtunZ6d5+8zz81ttZbXlPIoE+smk2R8jKZRrjhuwaYHFd nj9a4T4PtznLWaheaaSFnr/ond22ds2hvu8Ry6A0x6Xf4BpS0B/oe453TJzUCH/U742OXGg8Xqdl CXLJuseYAK8l18mUORQHK4JXJ9dpJ0YrICd9eeu8RgVt3+4ZnCHTedu8cc3Jb4GqW2N6IsR0OhHl DVJdhVceANF9CxoO0UP2GF8WwqyS2k7niozzHWEfrnUvEgitonCOnKh0fSJSq5F1ruUbGrCZOOkd 2baePreonkZJhMQUahyzaO/0ZCnj4L/jO5YDLifRPsx3QMPWOIzpKx2bWEFVJNjPyLq3vfNA+oyu o05EKyoNn0u+KUZF3tlhOLAHKHKc5rlFl4rioyGX692OjfIbhNIt8f8wRKs1wl3H2CDC7MgyDvKI /GA+T2d7gADBQsVx0FpRBJE5b8dgbjsTwQBO4bXu4nRt4livI++u80QmB1aXFg2JAmMq+RhBp9x2 29DdVdZFZ3Q6knrkdQpB5PaezP2E0uFXoUHZJoz7MZDQgVjG0TwGImdv2YceOhrakX88MzUpqzls qlT+PQhPV5TUVLK1AnI/1YATMxbKlFxp6A1m5qChWVQ8yr44hMeaDtvxqTzllJpU2/L5kNlJO36o yiy41aFFWYueODbX1n4Z3c5rTXNXL2RQVS6wBK9UdPYACMwKcrwK/cS1tU3jEVKdR0CH5o/AT2a9 pDalgFfHVXQVB3/kEKcMtGWEgulZ0Pw92pDtSIvzXPVrmSIL19gnLDlVySdL6FqB5BqgGPi6lyKH FoLO0DNa3rpt3XRaFSp/rgGTe7swziCiwze6a6C10kimCaJOmnlD5igFCcXgLkHKGJNl3LdlggY/ +xAo6iSOrWdn3YEOIpBJw9YdpztNZMK/K0yrXzQRCRmzeV216OmMcAfAzYJL3+owJDmRBgLVJafp NNO6nrXmspfzXoh5HC7PSvRXgQeiU2nxCZ2nBjsVpzinKWg1lBAXEcdkhXu5Tfp8XhSSz1DPj7G2 UQmi2KOFlpku9gwZxGTqZgJVHInTh7uDOMHTJ7a6BVsfMmhmkeK/FdA82RY6QPY31pHwop7V/ivF 36bcvX5OuuPQzXwNdA+dO9o99tipyPYKE1pHLY5NAbQBvY4x68OXg4PUBQYNqhx1hnSI8XTlYN+d hohyDLhg5OLncz8FCvF6gxd+bvcjR5vfIkP4LiO1rwEqHKD4dwHO8WHqYKZwijLcyi5NULSSam/U luyxKRP3Xb0KuJCgRpkQucXhT/ZBP4CphtkrX2+feN9qhlAdnntRnjzPOhRNnggyRSD1YcvxjrIN PSijrNvepy0mDpjTJy3ydH+cTXCLfs/jBDtTFEpaRHiLlrNnT8+nMPpDujv9xj//g+43f/vPugfJ 1v0c2eoH6fKkHKlnM/xFHYTu9nn6zIv6MFNIMxxNUET5828pCGazWt0MP04wLIVKDjgO8ARn7DM/ /WzqZv70j3/Yfe/Ft7rf+1d/RqA11H3ss8/FmZ7F0dReSP3Sp3HUeAamyD5BzuTfjzBYx3Ubhrox FLojAT9rIZXMTKMF7RaFXrp2s1vMpGGh12F0FHVBtNa8TmvBVdDZJfpsT5HdcqzMiAcjC43OTEs9 a+N4FpxUdeld+9Cb9eb5lqmBuk5mw71+GIR6nszzATLec9S0HCcYO8zQM+mRgW20QVbcm/HgLAlW ZD1NQcbxsLi3rn0brr/BxSrtEy0wHYGiKUjjkCdrCEZEui3gzZ/eBtV6T0hFSmvgkiPl1WDb8ysS Lv1DkCsTuc2O8H4Idqx9o9qqmtCzmsEhAz27+kQvONHYIu//Hv/cWYfv894P0hVkDH6LGPs+cloz zpujdi/dlcNmv1G5vDoKzWDGmfT7HCCVrQ9iJFu1voXklrkuNKSlM8ufLA6t+taPVFHc/4d/ZrSy dyQCgmGzu4PcMg+jPDy5SocoYtlyGtszD2Foxrqvv/RO95ff+CG02G1QxYO0PXqoe+/Cle487Wv+ 4T/6g+5v/9rnu09/8lEO3JHuG99+pfu3f/Tt7vJlprxNlnNlasYUmL1Yp+VDIZhT8uDaQbwrDzqo tGimCqPd934kIhdZQYur2xwWX1pp3PpzzxG+9+97D9+3Iiyl5M/LYewdR3VU/6fQnnuXrWliwb5j XPyVwnWnTZQzAlyAazlNgdvqzEr6K98yJUpa3UjWaY6HD5Ayw0FadLwxEbVIos8jVQM4TGGIwyrq sGkxrHxNDsg0zsX8AfhYOCVSJfzwDRTaAorFYg+dv5defqd74+23uyOc/MlRlF7QkKr21cnSeGVM qe3KOLiFHti7WSNdLcrKWOMw45zJ37LjhUpXpW67NA2RjrEtggbdU8fu8t71G1Y2g7DjFOroSx3Q Qa9hC+wbaTQdmKr+tytDjRMWnbkDhcPWeSroDZ1ZHBbbJdmp4gCRvKkstyIFlBq+pGpLKcSpaq2R BkCU/ePAmRnRcpSHbfkMam4wVdO0tijZYZy6MZ5tED91lutvIW8OYpjk80TOVhxx796i6G/TTcI0 ctrZJQ2Hs478ioSOGA3bwxRu8akH6GPLa9apiRhHYSrT2+tkg0QClF8NaEO069DuS1mJOv/n52QE O2m9ESkVKGMN0sfhkj7+1EP0Vb+SLiiezbvNobJoNdPZWJNpkBjrLEfllZJtiFtl8MLfU9A+pMGI GFdthvEqjgLoheiiaKlt1W7SrUD++ixc0VkcauXQ/uKi8zo6OjdJo8vXZT90HkW93HN5xYx8i+zY fs4xv1JHRrnWIYq79uhIsnwDlBx07zQtveZZ+7QE5T7Wss4WUmqYMSgpfr7dTXN2xsgKDOAIjxwh gLkNZx6DHw7ouIbYgs/qcqMjlGDUf3Ovro3nVZRa+sw2yOsO8rbl1EccF+lS6xjSVe5ZEMROAwqa OlFdNUbHj+MMIzn/5uXuCpM+r15e7M5Ko4FnL1XJgnD5u3K090D/VuCCyst9AKRHRys9ZDVKUho9 c07+1MFOAxfWyjMY2YgKC/gSsYh+8wk9v1WUpqMSpHmbc2qwoGOPM+i6ex7k9ScbGVoUwSLZsxUC GWkGFgCHiiWFjPUK8sRnyuNNWzbe63m9oyxZu4HhNnjVIbeYNc4enydKfAVD/oB0CIdoeT9mjEgV K7t3l5CrtLMkQLTTAZQgfzfJnj72zIPdoc8+GbtojcjBI0e6UxR/bly82n347Ze6S298SH9h6hlS jyR6bUEWMinNR3nlP4v1BJ404LdIh2/x+wfpnPAsrQhP0dFqaWmLtm1r3WGoeBalWhdjTYQtAnWM 78JNTfCm0+w5MZWeISY4XK63VCXstJQAW2saSGavzKLSncfzokxdgl99jfZ0tynYXWRugxMXz4A+ zlMrMQ3SGN2ho2lxvgN25GYPC6SUPcnEXe26pod7HKJQbnDEFKJ0SIPnolCERqFvbLtL3+NvOHvS 4nQKK5FbgWQBRr6ikOvqEFZBlZniu7x+0IgiSKMDRNwnZeVOd4wBRIcAEj784CKo7lb3s194opsH dLjCmXziqZPd80xx/saffKv7R//o97rfhmNt9vVXf+nT3d+i+FAdef6d82nzOm6XIjMQ1oxhy9Xv eU51t5l7HdFQWSsI1jlM73iLNUXslXHkdBr9adZjEyrYBvusY3kOsO9/+He/RJ3R491f/vD97p/9 w9/tXn7xje7LP/9T3UMMVzJAvgsCPWmRc7jDUscAsKRv0TlJvbVEZ7RNWvoJLIxBW5miZebeNPQk 7OkWsjHHZ91GZ19dglaJfH+fxg7HoeHY9nZ4YiNZuK3VRXj6Y91hgo+DCdq1YwILBcJpp2xRqw21 0HfAQIPn9jUHnOvAc52hneopsgIPEBTastWts57DNbLHyzA0SWXR6azrztpAWscAhKRk7JIhMUC+ /OaH3XsU0G6gz46fOdk9gvzPLBzCx6DegvN/44PLkR/bUNpfX/610iF1ZcQuPtyfttH9cejfhFk8 7iQiIp2Q+zwIOJwgKDFEtXMc1w+wrihTHrVt7Df3ukFvfeuF9BHMEIsl/ffmXN9ZX+puv/kteNYX aDsGtG87OUVdJ0PHWKcxkl2I8X6BnU60EWZTsikqi7OnHCqcDY0J8lAOdI2nrD8+XADAOOlNafuP 3nHcf+W9b/JSow9RAAykUemYG6pDgMO37thPFugABu3uSbnbe93npx8KqvMdGuS/9cb73WNPjHSP E4HJ09xCaN967d3ua38x3507fbR7/JGTQRwt7vnaN14ArVrKQAqjIHsuTrKxItejcrMk+bAyOpEZ HCKKHoSzOdD+1kPpz4KAqhbll7muKqgs3r6vEv2SK/b/1yLl9vhZd7/aoe+7rJQjXUhj1jigJH8H pYncFZqUT661TszjrYmSEPTY4cE9c9DFFI5aom+NE860xsK+siLXtr5ZcwqjSt5UWVAMjVmhJhpo K3Llc/ph03Pz8OEOZmiMn6cwm34VbZ1AUczjYC+RdvqQaZoWMEyQYhepM4IsJFrHp1KvEawoPfnK ZcTDW5aP6VeK1HC2UU6i3br7Ugo8bDrn9k3WGds0nct9i4iIwOgMafxF89JaqHfsLeJoXEqjcNNk GkpLCPxj+mub9dmwF7HV0iD/Bouitvaclevt9aqTgpXTypCoUIu4DRA8T/YISkAJZcVx3TgVMV6u JwGDnUz0hYPKODxJyINoX4TSvRqn8EcHNOgY9yfybWrNNnIWxozaH9qCU9bU6ZXpQ26aWLrIIdBK CljHWWDl2KBRedrGSfbIjuOkBR1M7tbz7l32gWPtSZRy0DSD3qrgXiPtPM+5/BIp2bNnj3fvUVy8 CZo7ATeyjnc5yRpP0eEYVtee3+oo+0elqpIQARqjx/OOKWBtnOgIe+b0Oe9NSsMqQc1tru+NTIC4 EQFT/IqR4NzvisTwXMNwHVXYg7ZMlNhEP9zBUYyHEyD9o2ETgUN25AAaDOrEiJBJv1G+DxDcHAbx EpBbIfuV82O6WkefNRunkCc9gcPhR/bgcdqSboDiPVHJKYNLqSnee84qF3KgCPeWTiu2VpRitiXl za4WqnmLdaswTJmyO8sqZ2aVNY6R4X59BukXTpaTPmImR57iATIoVyi6XIR7uUqwPAtqr1M7bq/z SSaN4k/tcnbsZqPhNrCaN1BjhULb0Kk3COEu5NAmQ6kDlVoSnQv1TmmW6s9fLfKC7PFf8HfRa87G rtwt3+3iJcOFGMjHxoHWgbBOI2g0/ynDZrikQLFY1YnJrAqfkfPhNbx+xhZyNlkHHSPvKUEB9+HQ k3HOiDzQRRwPgRWfIfUy3MqQU/AC+iDvtldNXzgQe2xIeprzWbMgudNk2+RyboNSW6th4DLAXkw8 erY7gVPjgLErDCtzwEhNQC3et/UGoRLooLq33JctEq8TZM4fWCB1/yCO7cnIxSajukUrVXQ6A1KG DLQNrnzvHTIeImoW/+p4zQJaWMioA1wyqBPP2nAegsD6sXZXAb3fpr2g7eRWCBA/ePsCvawvB9E+ yhCi+RPz0A1ADNErOhfWImnDlTd1bSaGqi9afU+uLY873o6HVFBNilzNkFBAbDgQoMmzapcZh5Sp wK2HUX8QxIRWFLshTSRkgPBDY99DAUqKMp9THHhta2VzUmvC+xZBqk+Nn0wG4H3oUYvQ4z769Lm0 bxsALbal3hSZ7N/8l/+2+0f/8ncph5jqPv+Jj3bPPwfgxrm4xHTDTSigk9Il0LPKkTbI+h3lLXQU u/bo3OU+RNaV4KqZie1utrdvT7pCBrTaZlpb04V6qo2ZI3j51E8/xcTYue73//zH3df+6LvYyO3u 1/8n86DABOD6EbZCVRfmYED74Z4Gh2exlegfdMsSANAYxYA6jqNTOrE4tfDih+gCMsWY80cfO5mA 6mWc15cZkX79+mj30EFkBD63GbU1ZGERBHsSlPvAKLKKDNiDOywDj6TyGv2BKsTIuXfargOcgedp E2nXKXWW/bvVfRkaxrONQknhUHABgE5oHFk3dKYd2RxMYZMBu3+s4lMt0hHszdcvwBxYqeYGR452 p86dJOAF27gJOLJ6u7v49rspTpaqKMi2JS+bPdemRk7RYavOgtAmIwNSbPQB/b2FwhFMawEbkyLs C33VdEpyFHr5Pz6zdTArToqVLmrWVHk1S14W4T/uzzZdMm699nWGxLyPYafamENrdGnboHj9Dhuw oaAqzw3oP84m5P5UJy34UmHsw7ZR8lXtxUHr3DSVqV6diHgUTnmSylEBt8FjS4ib/51D1RzOssjl zIdmYhWp3B+VcAqAjJZFjYiQEHwLTo7DeSoiO2kHHIgDpMD/8IV3uldwpj/BJnz8sTMhwf+bje91 b6F0/uCPXwyf7XHaxnzmM892yyj9P//Tb8YR1Gmb0DmSosAGpF8wkV0wGpTeLgdyVMWaFJJ6QWV3 38NEk9RzxqEiWtzvmbofTKjBTG+We94W5t4a1BKUUooJStz4V/64IdEEWq7sxR7V+5WOdJmK0hAX iY9TCZjS1lHUIUhAxPPZ+mqaaNWkxfKS07XKiXWa4xjv0QEesBVVqB8YLYuiXA/pGHGgcexAVWZJ Fx0gjWRfX6cv2TooAx0sSmCNRtm/W9dI4eGETIOmLcDNDlqBfGWqXeuuogERSSyQQ2Xgl861Rrq+ Imsx7PUMKgkR5VG+pEOE3mMHhlBYVNgspN0TRK5cE9ZMWd/GiZNDO2C/u95zdOnV98pZOIE8o9XM Ftr51Wg0VtRLv9ABcg8ylFyHVaPlf2nJ2O5XRdrG0pr5cNdHCUKG7X+Ko5h15PmnRSBU9gnmSras Nwilx8JZij3lM1rvMElRr4GFhV9Ji3E9C8N2wtN0qqAdX2qSo47CBPs0jwGyp3jyGqZiwz91b1lD aAMJiNP+oZerErmSb78pmk0KjHne8NaR8aOgtWfpQT9hMY41EtyX9xhH1yIaOXi8w+pyM1sutaiL nD6Nv8NlMmTB6/K88ed0RvnkNZSriIrZjMiy8unaqUD5e9AJgCA8dy2Y1DDzOp2zu3xmOiFzPw6x kaaTiYXWV4gssgYWVVtvYF9sEcQb8G4XGXAk/3BcziKO8Trt48wMZFQ4g6xcnk045rbxdHroXVpq SRR1CmAndYDnFSla4LWi3Bn4JMUlxYggruHFsjagu8qCwmjXJA3IJsW4yo7PMzbNs5B+X6O7jz3I I+t+NZTG9UzPZ4cQsf/HSIF/SJHUbVDrTbIaB3QqDUKduMk96EzvMZjH54pzldQ2HPhlDGl0G0eE M2uA0Rc83TXlW5sRZ8DPl8+uhASAif4vXeV2pVWeqKsOa2oMKHBqwZSvSxceC7HSlYOzivGcoEuB QYBZjlHWIAV7BsPUYNgKMnUtQUerBqWvjxlCZnUWQovgdwd5/kMEC4usgaiuqLkUpgzMSmBTYE1G yCPzW6DGK+x1ipXtZpFMHFkOiv4U0IylhuIzypnp6O4xCXI6+wCdfPZeB0G0C81954Il0F9WHSef yX5vsW63CYrOPXymewYn7wBZgnTLwXbZiSSpeTslZaiIMxJEd+tz7fZiMbUHwXHVkxSI6+DYz8o1 TtBuptdjleJT5YDhHHSscWCQ/ZFvkRHQHs5jD888TIcMUN8aaFU23DNptyEzDIIYOkkpuM1Z1aQU aFbnX6eF75UH75OuJjqcyTmqX+PAqBu8FvKe3u7cp3UGSXf42gJ88lp1iMCZbRzRwzrd9ivv//iM mS+FDvXx7JihAVeet2mFaWcdvw6SqXrkuQfIyM133/nOy93Xv/sSn3Gne/aJh7qf+8Iz3ZHD02lv F9ohz1ZTIOua1lDZ+jUWUltm9wkfMWurGWyCXYq4bs3rqKOQ7WWcTkGBSZw9JxFOo0O2nD6IE6iN ffDsoe5Xf+Fj3e/92xe6l154PW0+v/xLn+8mDx+EpsX9Y4tD8+L5R9EZ46Pwlv0cVIj1Co6bF+Rb SNtF6lT4t0Xw2tHjZMnmCKgdbPb625e7m2RTFqy9MVtn62IjJGkf+HiDAmXeugN11H+hUnrJ6trm 5hZP2S4t0MwIRqRA3cIB1u+yF/zIODVM1gHZUYS9ckDT2BhFoWZT1Wt+AtfbdLoocnSTblfff/nD 7srNje4ZWhc+/cmPdIcefTQTKH/8py90H9LG8eGHjqW/eobdoVuleGibBdjMpjm1NHuFzlhGB3/w /uXuPKCpGd0jnMNZ2n2OgmSHQx5gwsAw3ObSSUq66jUApF1QmKUx1/tpttQVQLB31X/kn51V+lu+ 9HUmM72FcpXPA5lfvpXcLg1W5FqOSnOkuaF9ykadnNyszmT6xvJekSF/FmPplxtoiiepnvZ8MQgV LeUnPcLtAQ0SKpe6/S6vaMq6rU+QE24uhy1Fkny+6VTuTwXqW0VAbMttxeoKvRpnQIdEq69iYKSI vPHKmylUk5P0M59+rnsdXvYbbxH90sLmmadOk06iD+vPfLz7Ef0q16/ZAxXlL09XBeCm2MGCDdTA q5hV5sWbLWpI8XTLSJYqyimsTY533H4q8qM68pAH2dYvaQqlp5a0d5ef53trSEzW3qVJIJNvynHf d7pzQvLlr3QOeqq7d5Vgxs4ouS/Ro+BPMQKjGDhTheOkdAaHQOjsRSWKzSUOojBWDmAQBkiV48Sl WIbPcJ/7iWo62vaNPkgRxgIo4BKH2MBlA4fuMId9lX9fA32zYvsCPaUXaa02Bf95GiSm0oEoFo2/ qXMdYryXEheRqYQMZaBFOfJVKGA52NVPNg6iz6ScmHb3GXw2EWXRdQeFkN7tR3krx/bqtGhJ5NK0 v6hFeQ2l/NU7Oi8q8XWQfWXLZ1JK7aHqRESdghQReRONRuK0RQ1mOG1Z+Da2PQYGB7KllJUrn8x1 nBmG2iBijSKsz8UBCA/RXuVmEdhOiz1skSXKIAIavjLpdIyqXOTiK9pRwWBZdIZ1YR9CUWJtx1F8 R6E6HJdu8hYfYrs1U4Om69MdSD5vr2ruGbp9kY4UNr6hoYSUIDh3x0md/+1f/VmKa2ZBiC4ngyCC oyEoXx1HuwjwudRgT4VACY8jB6IQG6t2Yqgx0Trve3fJhsgp5vdTtKcysJAitjkClxYlf4A2XwaF QaG47o5DR0zXIp+iW2pMC0FNJ4tejLHHtl1cgx8p9UGKyI7OIos0Q3/YIxgrncfrtFVcpH3gDA6V Os1uJ1IHRBozdTX5dx1OjApyvR9U61DaV5bPkz03MMlK8bk6sKLL8s6lO1jfEMTIe7O7hfzs9M6G m4ucSWER+UtxGvvo4JhtkHpR7QQs7K/8YgtZzeAocwn22Audy8NQspa5/w1oQTrcg2YmDW4RKklE rvEYhVx70GVug9rO897lpRsg9xRqsq5W56cvu3Qes2EGmeq3jD7mgeIQEQj4Gj9fh6jpql7VhTet I2ymoGVW0jubdRMdq05UPL9BugGPBnnPtLB1DA6McugSmSj09y52KgWk0Xml/xwMEQ2rY5TAsGYA HDt3pDsIejcER3qCM6NTOoYDYts2X7ORIE2qFjoJ58G9vgmF5tzZo90h1sROJjobd2jp6BkOZUn0 +CbvE9k/fao79pHHu1M/eLO7SbDlQZWyoA5Xn/Zjz7Wgtqxc5uytEkydOX28e+r5J0xadDcBF1y3 WXSh+jmDWvZrlaCdcZ5E1gdogyfP2paU44IF6Cc7MIhSG49V8Xw2NC1wt9BNy7Q4e+eld9PSzKIv O1ucehAqBYOp5mmVJrJIU6fsidzuDKKxI1YLOOLsuz7IjZtaBY11ZqupQZ/Nkl5QDmgoewIBDa2v f/M7dRA2QhlWrYQmExtWfkKCPvnCUCEEgRKUtYx5arna6zw3ZjVm4NM6CXIePTc2OYPjt9EdBch5 kMmkpx8/0b3+6tvdP/7//hYtBi93px843f0Mw2Secrw8jpuyb5Y2SDTfWyxpMBEHTnuRFqStb78B fOx4C2Tb8/c6MP3YY2fokgGtyqFu6YTCz33WMWgYfZemcRDeMyeGu1/5+Y91b5Lt+ICJ0H+CfD9B q9LDJ4+V/Rbx79fRTA3PO4ldnJurft5rjBW/uWjjW7ONKiE+S9RVvYlMPA6gcYs6nbdew5FFnkVj R+xTja67xcXtl72KPBzgLBxAJqb5vbz1flaGhek9KBq6nGCLNFD0ghlfaZrek0DNuuAB6zIGcj6w XNQ9231KVxwhe2j2e5OWu+6rffTHQNE/86WnuzNkM2/Rhee3/i+/kQmqz7NnH8XhHiPDNwOyPs6X w4oEWSqGsje3OqJsjHVcBzjXw3MPI9s8G7Tm2xSmXj1/IQXs2oHJhYPdwqnToQ73jnVzIfLvHBlE U+qX7ph1toIIcrf/o5zrrcXF7voLX6Nn7LtBumriFkoh5G/TaqJBlZax0r58Nw+S3/ROjY5wNG0Q KdNBFaWq5ChgFPdW4cY5LoWrv5lLhEZR4lmXLOdQoeqLA5s/Xm5gU54eawuIBmn5MzJpq5VynPx8 +TgiSXKfHOWrEZBvN8+XnLepteHuSx97uHvswePdv/zqt7v/+nf+vHvmY091n//sR7rTp453b1+4 STrl/e5tUIpjUESeeOaR7uTD57qXL15IP8WMis1NF0va6VcpssrB6v1YudV+oQxMaarslY6kMaP+ 6/l6Bzr2Ifh3FJeIajnJ/dHd/8jmdPcO+v1O+73XNu+9rW3h24VsmRbx2v6vPtEXpSHdXRQnwp9C pRhJDK9cdnp2TwYWgruMUZNHqJKUh1oNf53t5vVqPeL8se/EsoXogVofRNnZvtA+o0G/+M+WT4s4 NFeuLHfXCH4u2L+Z/creq07l4TYjlXSZvCjuY4isiJQPD8U+eyifX0sW1DoIgy3nKhXdo8TyGNMC DuUz5dQwHeu0QULR27c5zhuKB4TvFo6I2ZBJxv+mc4MdMPjPtj+hJOkkOuyG6v7bRN2b/H4aozsL YjIPEqWDYwqt3+MxDHRQUtHR9IH3VBfqrsNusZhAYLitJmFEzagj0KnecnIW/92CA2/KUi6wRmGC VF34xiohvizM27KJvz2NvRaL5Oh0f6bysl5AZ1SHawuHwilxg3LauMYCRYenGR88T8HMuoeGPxPy LSkBqTHO1WYvhUtZ73vhYl5cMR1nX6pD1VA8/dxT3f/sf/XrFPYxLv7t91OB7+dbiBSZlFuLE6lc uqc6WmYQdOjl8lnQODzGM6HUV0FglIFbFOZY7HiYQh1bXdrLXOqLPXV1lI4cWyDbQpYEOVzHyZ2E kqTTJhezCrPo8yyVgvTkFIZl1lZRTpG01zP3PwI6mjoO7v8Ae2k3CdvwrRMYrPEaz+4KXW7m+Z0B ljxNnZFbyO868mzxtF0Y1lInIIVDHqdDCgzCHQKC4XboBM8vdzYOfx3InO2E2eEny9+WpiFHGVqK xkM9jHAo084K2MFBm2SCp+vm2dTAZF/UwSJu0IYEHHQo7Vjjde1AYPZGAVzHSPt5QZfYvCEM4V3k 6AaI3iwB8zIOnzx+JydmIqZ63LZ8GKIE0WosfibCm7PTuJHh9/tUWq3ckfLj0tWz6cgXLUrZb7IU x7vOxJ5Z0pwLAxGdOV9TXXgy1ZT7IzQMzzjF09oMfbe05DLwrFoSqSwW145ToKkjvQklos+E+hw6 UetQAlbYW1HxKc6Ha/LeB9dA/Jbgwh7vFkDQ5OwPshe3yN45bGSOgU4WF2cQDWikdm2CLjhmSi98 eD3By7BT8PgvaHWW1/u0ccpdiulBkOlHfBS+9RR9yq/Tqu0aDtA8ffNt67mOUzSJvtDc6VDbjnQd Z0r5t7e2XUUGKEobDWDlOvHw1nG0ln1RyGaCQHKvvX6+u0LP/ZfpmuG1jkG5U2Yeeu4M9CTOjt1D AATsqJTJllwrlAb1p8VsOof2UJc3ff+Zb4a7cJ7aG/e3sld6haUUBgiO8rc6MzLhrRXJum5TB63e u0+PVM51xOPQll2LPxHbYHK8HPhVaYe8VUDB8e8LTP48Ryeqo5z/E3TwGae//2/99te6f/JP/w1F g9Pdz37xE3x9NCPdfb1F1wbpIq86wtIDDFTNslXQ5SCzCrzk6hZOYvWRcnefcXafC+/I+oVqGCE0 sBJkM4rwGTzkZiEMHne7s0zkPAu97L03r3bf+NZr3Ve/+r3uuc8+0/2Nv/eL1QnELIr0OhzSXTMH 3O8hqERml64BRl2A0zxtkwEcyWnoLl7fjJ+gymEosb/6S5/tfnT0je6P/vDbKe5cRz9IgXKSzQbn 2wDCzMcktnySjiFpuZmxvqWPBC18qLEJ+eXYdd6jYz0BZVa7ZFZlHb0ryOAwowMUI86OzDJzYLO7 AZV2GNszAx3x+o2l7hLyPXtokkYFB7un8L1++PL73T/9F39C44SN7hNwzj/5yce7R+jXPw3dymzl yAhD7ZgZItq9vUORvdkT9smMiutsoGLwNYRfd8D6QGR4j9qhDWqH1uGu337/QvfCt39Ip6Cu+/SX f7o7S33dEKyFNJnnVA4mElV8ihZjl6wRdPMQtUyTaQ+rB/Pf8c/W8lK39Nq3u53FD5IuGLK6H2M6 QiQoL1FtJdoTxyJcaVsDiVQQOVswxg3YQ1C/2v7FToJLekZj3fqg9kjiXTmeDplRHYM+uKnpyqCq 20cay1znYEYPV7IoCaPwrJrA1lHLwqZoWaG3kMOiNnmKcXSVCbsRmO4sp15DNk1j+q1tDBandA6H 7wvPPx6Q7sPzl7qvc28HSSecgPu0s/MAEx7PU+hwsXvk4VPdqeNHu7d4tlkMuaNcpYQoZMF7WRP7 m27yjJs5eD6fSkMuoLw+18Qn40lUVi0XkedqEX8DXxqQrSVpX21vYxCSj6pfqbnSGzdEdZejuTu9 h9l+lsO+/6YKCPo/4bm7xlEIXLQhYgP0t4zyg0ZiUJQ+2fwZxfCKRo3A+9qi4lhlOM4GHOTnW9vQ IEwleiupuHYkrmiPnSlMXaq4+SDCQn9+lzVZorG9joIOX1qc6RRyw6PIXooOoE2pRO0tLGo9Irov ehRJcJ29T65pap373zaadYS0+yISZvGegQDO/zQZGXlumTalA8UhlccckgOfYTcTizEM5Fa4rxWK YCcIBnSy5LVmDDU8MdO3TnO8enGxe/etS1Rer8G9J3XLGks5skvNOHwwC/Jc9kHbYiGTY6xRFWaU 1+Fnpxl/ESyrP7eBBOc+/HGcl23b0sHLFAH3HuXV3rYrBLJ2iPNqtbhIxa5BpKg+zyaLWEqKzyGX L9P05KBq9HjuXSdD8k0vF6L7CemsRseBevjMA91ZUtyvXKJnHM50aBV+ButowCyCUY52pXHvCZMf KPaOQuLbDZz1uen57itfeA5uIFPxNuD16vAqc3LwLCbxudm7Lbp7pEc95yrcOpS1iLwjl6WSqVz9 XNthKS9SNbz/DObg/ndwhnyPadTcK2vp2im320HJdcNcc/ttV79ojYd9cYsXjcHh37O08dLZX4WX vEGLth0QY/2JSaeGspbSaUTD3YP33mEAChkwue5XGIYi0ij4MDpjT3G73OAASi2g/dX0gq0rkRFa u5mC3qRgbQijn7Z6otQG4bzeLEHGo4d+xkrilDjMaZx9nl4AZZazbXBgS0ICOvd1meJT90JqyDWc e/vHHntQRJYBEzgPqStgjTRMh8lMzByZ6W5yzrT1TlCrtlZSCcrxM5i1hZ9dZTaQzRffvZCsyGc+ Cx/UVna2GOTMpU0c62pwozxGHqTb2B86zi7iEJqZRUJFF3H0vHzLpJB9Ds6WhdNJHSMTIuIj6nHW xX2O4ZQ+qAyw4QF/+FuYRtqi2Sh50QaxWVcDCzmZOBqVUTKg3E6wOwm1zfaWouMzOFbymJUXgQa5 rFpROcC2ChMpVe+cPHawZh0gh/Yi3jV4C4pq4SzIOfQHC+hH2ee5Y4uMsrYdHDQm9nQC4EBkdBuH eI6CxKvwnVeQUwvC7XZhcfVjtIs9deoo/FI4psiWCHQFKLaJRC+yTgbvBlCmxu3KMDNIoRz3qQOo TRwPD5g9NBtnIN8yTnu8Z3eDwjbs2g8Z6b2GvEw7+IbCxQNcZ/YwhWk41nbw2GOwTnArP7t5sqHa xHmU56+jXXQBnz0UlawDf+JQq8LMpphKl15RBdCxKb42/asrc9hMd16vfQngxnkZhj4VZNIMm84y nSusARLgiX/AfWwzwGoDKtSmw1u4GUEt+ci2TL6E7L9H+9ZJB21xBg/ynBcobvzd/8+3u9/8Z3+Q LOjPf+lj3S995XkydBQ2s24j+CvKemyiQ8zCWZeuZga+ijE9RwYzCRjUVy04FNizaFoHvDrdSJ0y 8NQHqS4YmSCs6DYnbh/g8nCoj7ViyKDDoh48Rxva3UfYExx9AqJXvvPj7sSZY90hdPEEDp+A1BYF qXepLB4bw7G15kvKDrZSu7hui2P+U078o1XRFk/w74dokbdKB7QLtI38AMDQgVdrNBowUFnh/i6Q 2ZiiMv40dRfsRGRTOdSvSStFnstARP9pMrSxwWpxyvukZiUeNrhtwbqTHc18rUst45x88Mbt7g06 6tjq8wTd2Myo/vk3fkS740uZGvkUQ/9+7vPPJ4vj4LFtgImMLFc6kjHVTzQbVokQly+BeTxfPte1 JuANPRSdPklv8MmpQzSdwIYCblw6f7N778W3u0tQZE5AAT7x1IOpUUhtjyCPdT8NwY3t5Zo1mE92 /X+HP1sMM7j5o7/stm6eZ2oiKWz5iQ7WaHPtkxowKtZBFEXhK6igzqAf7v+zO6KIIcInJYGTi+Mk r9IUlqfEQiqdoSAVDVUIyosF7iM9/10cq+LExIksf7j9X/+PWsxeSBMpp8y4zkdGu4q6m74ApXOB 5HTKK9xOVT1dEIxy6CBy5dJtDObd7pmHTqTLxVdffLP78Y/f7o6fXOt+/itHukfPHe/esgc20ZbG /bioBIp3DmGdkuhuoQEC6KhX0aYtOZEcth3QXxVsom5jAqN+FY0OLGuXwhCFRrSqfNbcfhQWfwfR F0c2zWzQkHCjUO640b3f7WHWZ5InVT53U1z3nO1Kk1aQce9PrxiLXZe4TX6kaLapP4W5DVORL6cD 4/SkpFlV6jgFExsYG1FMHDVr8OZId+3cIS1HpD1MscWerZ849GPIQlptOaDFQiAUmM9ngZsR7zV4 W/LJHOByGydSAyuf3WtqWIZRSn6fjIiODoYgxoeHEqAJdMGCuLcGAcMgSfbstFOMPuvQEPftaeRQ 6/YXmlTKtECVlnmRBoBjbSQ/Yp/YpL2qt+ki/UL3LjNy2+lrvpPPMc3rVMmX6ZMub/JRUlvHQUtn QYRMH/cFjN536G1WXesIc+8aS3mLw9yTqEYGDpW/XcGSKF3LZtgCTH6bQ2B8Vh0oe3OPsy+m1TLI IEoGeZQnzzVEtEfIFxe6Z0UKDiUG15ZNGghRTI+MdBWVpArWc7dBX2wR7CeZMPgUfLc3rlzO3ruQ 6oUEwi2l6+TNvtfx/aqnihylZtkDers7e+5c91PwSVeuX0nB0DiBrSOwRV3tfKHDLG9QJzRFePoI CQRM0SFnOjpmOfid6T8dvnEQlIGB2XAAs4sGW/Ya57MNagxaDBg3kAHPv51iTJ961OZwqLagRKyA gI+jeGdB9x1gsoRilpc+GSqc+ow15fstDIsO0aDDenAolWNbWF2BLvQuhvzxZ5mMSMssW/cN77DH olVQKrxPg947dE2wj6xIfWQ4xTXIJ6jlcNqXuf/Fiy7nEUMVDn/1OLcwNNRa2/vJg+U9IsTVXYGf GNBzLRfO8GGL/u0TC6L9OMb8zl7cOhGOaJYOYKrYIs4LFN7dIDicp32WAyV0atOSUT2fswsnXKoM 9/fC+fOABjvdxz79BPSucehytOIyiDJwMZgTgLHtozWAcbg5O3yG503qj58r8i+PfZ1MiSjX3DQ0 M1L47q1nxSmg8vpdpzXk0446BjExqHFawnYqxEo9rzzwPqk0qwQqOtMG254P2wda4LssLxQnwvWd e5Sx9Xye96tNm/OcIis6Rq6z8bmO8HCrN5D+YkbjLAibNJxNW/SJ2tn1yPZn8L1FBnfhBDucyDZw LDgyYJEja0xEtuWgD6hAVymuEwhcIfOkDFlAfJEiLqd0fvKZh6EjHu02sDG7nItxEERtWNbQQtPY wQp87KIzDuo2IAXEQvIECtYk8Bp7QTMFdM/pt+pz9tMuDZfe/KB76UfMDKAzyMEDE7RPO9HNkaUx kzUOcu3gJm2A1/Sc3JsAHNPd2vaVHQrlMBns5iD7e22C0XJ8AmRfmg8/i12Js+AAmmi2GLawHaPb fI8p68pUicK6Cclaqz/syCTnmO/T7aTeEQDBYnFBrJ1wsAdDBZkg0/I+RYmvU8B35jSZN4LhGzdu dr8LCvz/+C//CWd4rfsCPaV/7Rc+3X0aJ9PAS7mx45c6MaiwvBzWMa2CqS8RSDcb72RE28fqyKuv zWaZvZbaZ2bJ2pyMM/MRRVaTqJHqZ6Sqk1bPlPVRr/R2HnmS7sDCJwDVWX/m2VNkyU+jXxa79+AQ v3LtWnf28XPdmXMn0Dtk4pHlLalBKm3kUsR6gsJpaSuLyPvqikPg0K1SWljTFPOapSU4fujhB8gg k1XlbLzHOXoDxN/C7wGCrkXR7FVs0rwIOMHnjLSjChCkxdidaAlU+hp6cg3b6N7evIXORHfbYlUu uCDGpPoFbtHoAL24AR1uYk+/9cZbTB/d6J5nMuXzn3iku4ys//affJ9A+E73/FOPdJ/4OJ3Z8LWc tHibftfWrDhYTB1UmRC+VPP6l3xVuVHJk77okD6Ga2pQ6WstgvdvdOkkGfMnfupw99BTO90bX3+t +/F3Xum+xRTimRNHus//7HPd05/5KO81q2J9iUxD/K5kGGp93bn/v51rHesb3//zbvPq2+kfWA3r TbMo7DrVoj86LFXpHMfZAgUj+iDWIllWW5ciNdLx0KQ4ihscTO5Gc9YOUg5OOZf7f9r5C98uB9Cz UgdVUez7O8eZbpFK3n3v//KWPtL2A1yT5NU9ikF5dW40mNJVTKnhEM/aPcAiRFrSKHgojOMgG88+ eoom5vY8pS2cpfPwGX0ekR2jMw+bAif3t1qDFZpi+530EPWcNC8pwHsi9/p5vN9eyRjxi8K7pnGk daj6ValnjSZRiPr1yA/LGW7fFgIYTmPz0PdVUD68rrF/sf2F+4n1q/0ohyjp22i/3okv5EEhH6bQ yS21a4FIkii0jz8yqrGK944ssG5EjTrHNzTqKAwdgRGqkXWkVIxW57tHIjl2PFgi2FnH2bEKPlPe kCmNi+iAPDWDpF1RDycZenttXe3/meISWzFxjysYd3lfCwRORu4qGB2eCQymLew2uQ/pAXauMJWV gjsVgg4YCtUR0/a5NkWoY61TbbJDR8w2bzp8syhsX7cEon3d9oSkuTzU0kCkB+hYZ3iQgWJLZ7pH KcKTn+r3boP7JsZgeltUXYGusZ350uDLn0sPb/ZWOkAZK70KOnrQg9a9WgMRFbVz+ftuMb4ko7OD LNdb6gWRnP2UZsp0LHIym8PvdEZ3Uc7DKN6jpM9PkVYdsxgSB1ne6yDtnsxGlFLrz+D+Sb7vG7NQ BCo4FsrIaQZjyBFcg9Ih5eLuXegSrG9qrYyaPB9Ba3Ui68xqaM1eeIbcn7rpauHmACqRUu/DYkwL b3VkLfJUB5XDz/vSacL0tkikxcfSUHpQoGoRUvsRV0TUOOWLQTWVI/m0BkQ63tI8vGfbfo2DmFtM 5N7JHb8EEnSQYilT7D7PCqnIAoK5qk61bdJAiyepTViHV7iGU68TuzdRTl3pXJ3bokOkQFY9mmAB moHjom1Xx/NvEnzeReYcEJOgynvnPZt0SNm4A5rMdWf5nQO0VigKtlWfFKFpK+czuKGCs3R94vpL FLTNcu8WrVss6sbq1G/Jw0c2TElv8uLbGPO3Ll2F22ktxKEUxWaddfiVVad4SmPyuha+NbkOwhv1 JPoF6qZcOvTJgVUW+3J9HWC55RmjTYDu81sULA82A5ncqaT0Gte1naEADQYmsR2qrQIs0taS19j1 x0E/DseR/mJrxEKETSPL9bW9pkJoEMXvRH+RE3nlm2RRbvFeJUJutTK6LZ3IdYo+bQGg6DIBsiCB A7aSPUDG5bM7tW4HWZcPHcTeibDY1CnO1yprf4P9ee5RAJyHTwdYsFjVNfeWDDjNKDj22yJYxUke tMdlQPkUZSZbbEeaHUeCey7Z510cRIPaWBQutHjxevfuq+dx0i7hVI13J5lS6BjzIQAK9VF4zTrN ybigG5SBZntqfV3sXmlJPWnm5P7T7q309iqqzLNaOiK6WgHtYZ/Y7XpxeNNc2+Li2DX/ra8RMMLf N5UYqglvFD/ThNa7Sy48J1K3EAB11era7e5m0MtCwP/yGy93f/in38GxZq2feJh6qme6E7SY1Rbt DNWYcn03JwEuci6VTTM8BgcGg6EmBZQAn7B2Roe5ZY+1kD31sESiUPwURlq8rD6J3OanWZecBc9G EDdBSg2YHHY56eW2JMvNPTjEx2L/19641F189/3s/WGyHNPo1FEMk0CevomZYrPkgmHSQpwfsEog MWidDQG1QEPG2zfQ0gDtkYceyDAoz8a7tmNEr0xP4Jzj+10BIXZuxYYOuvrUbJS6l49Qbi8trkGX uhpHdwlZPwRlcZrPMUt5FXBmlnNwZAGdQk3JO1BWXmF2yOuXLuPYn6Azy4MBTH704vnu1Zc+7P7O 3/pS9xn45eosZX8TVN4Ax25J5TOppfVHBBkKdHLN0lMDkCHrq7w4uCd2t/REQzRNPRDw0lSfANSR 7o/xWbZXvfr73+6+/WffAXm/Hs/5occfQqcaRCuP6l33sYZ2ZSz6v8/M/Yd+trm02F391le7O9ff ZQwpKbl4ad68nDJ5VRZFYWiCtBQ3zjOh8VBwMlZSB1wudQoV7MeI9y/HEkGVzyPpPIGlML2IGd8a B9RRqgPiPzQ0cd5yvVyi/i5fMg+6XwWvaMdP0IBqiUqgkxLLRigIpXAj7klr1Ynckz9jmhGBkQMM 3BwkUqc4BtpULIJoP9QVtOEDNEbfpedx+hyyHttw465cotULo7incb4TlXpAOIBO+NEZ8F4skKqe z/WV+/AvUSYF3P/V2cpzVsGTB89G9PXchRCUkahax1JGpZdq9UrLFO89L6+X1Xuiifzc/COfofNS qbxa/3pBZQASBIhc52ciGdGK1RuV39n5xGgx9CAQgwoYRBHhpXGYDbrSMxjBffABuGOkii5An9BB 1BAfOXoYQ43Bt4euCowDaPN5ldfOLT7T9BtogQ62bcy8F7uQxDH3vlqKMXrYZzRdw99hbWuIRMVW 7dpRaxTlLOvAggToLQ6TmXDqnX26bdkjKqK2YD90JExD2at4jszE4Im7TLq7Hv7YGhXPoo/HTx4i Fb4eZ8vU5I9+/A7O9RIOgm32dN7p+43hOghy7cjzjHm2dVKsobSlQkIzOti9dkSzu5SevlUAmvaU yqtpOF+X/asU4wSOWWoLpInwHidr+f7b58kQIFcpbmtGP5MdHd2uUZJ2kSVR4HQVUB59DYCfq2Iy FRqjZus2CgiZDvYAI48fffxMN4ODuQTyIJozBp3BVmg6omYz+j+9s5FsSs65ClDEYac7BYL0uU89 B0q4gGNtf25bHxJ0iTrameaOxXo4VQS/dkhIGlUEVwReXcLP5Iinr7k8bIJdHbqkaUW0RVS4t0x/ MxOQAr6iDylLHjDP7xhrI2qZMgFbc0l12qmpXxadmnq220smfybywbGE3qMzZneOIQLOIdvygZgP OamPoMY2nLdoQ/XKK+ehGNBLn/2P0y8nWZqB/G6cxnnOxBxFhDrROztLGdjh50wcwcmhoG/A0fTo DzvvqAAMXqVSVMGx48aLMifi6oh3Az2N7zxc83FacJl5u3VxpbtGAd0yjsDpR06kN7WdAxI4siMW KNq9QB4hZMzQo26zzosYx9Ny73OerMNATo0oVdx8b8tDq+PssqKhfPWtC6CfjHY/OJNpcX3g6PkN eirq7RmWHxyqmYg8wSlrq6w5etlOIK6To6FFmO3rm8BFmp1pdhF/nt1i0E350J4XuanqLh0J7YWo vddvCOikXS6QgbRAtJuHHUcWcRK4x3F47dK4DlDMWR1Qqvhr2GmKOpcp3JOGA4IJXqC+uky9zUXO 9zxj4kfMAonGIvcWQN7F/m07aAN7IMd3EFnyfDnUZ4RswAp0IuliV67eLt0H59V+4a7jFQIj+cHX GIGtA/3sk492T3/8aZ7DXvKq/Ar4g6noVjSuuHpQ+7JzHR3p9uiM8bUFdSC1Iuo8zpb0sQ2yhv5M vumVS7QFxMEeR4bOnTvM9NWFjP0eJgtmoaKZ6iFBktgy91ljUdYh6KrOpXVXoXmU7q1iPnVTs0c+ vSBRDE8zLsquYFsDXfbxnaCBvKx3nnU0RYObI26gr12MjxCbbgaa17BnzjS4I/1L/SitMnQvYooa GN3N2YL34i3eu5Oi1SvXV7p/9ft/1v341de7I/OHu1/7+c9CB/l4Wsjekp7D+ti+0k5O6uZVzpe7 7PyAkD90ernult2amKap/nGITDqo8Lc2xIEvNUCnJjL7cLtM0bwX5Oun9LpcG+/T6WD7yhoO43MM AUb6b7uTZGKlTh3n4CAO9uPI+ge0FvyA6ZnWpZx86Ey3ME9XGWTPAmdtYMwexnqaIG3nDp2LQOTv WExtFyDtD7pSasgunGR15CiZz3n7mPNRkwS0r731IW3xVrrzrOsI52ByEzoeAaI6KROo0yllIA63 WdBHGL53GADmIjScMdbg3EOnQp9U5s3AbXLPb8G1/uo3X+hOMAb9P/vf/f3uON07vsEE7PdxzI9y Fv/TX//57jOffzadR6TAqXOjmw30uLHBARsQkMEKQKL/od+h/JQMRR/EN9XPrKyfRlOQKEFLJEm5 0U+04wo2Z+5Q9yS0oDnGvx///eHuG997vfsv/s//VfeJTz7VfZJauxOPYvOOnGhOlOi3LZ7NSvy3 /LPN8ILrONZrH7xMehkCuEbJBJ5UjnzhKKcFn76Hhr84zyr0VFL3Tp/GmIXPQxp1GSV4WzpC/O0C +aVw7bdEc9GyBIk7SzmzOQp4Cs803FGkHvLiXRlB6wD3Rry6YZRzGIPQnMNQJ1Lo6EUV5BJqf59A WmRZdMuK2ngCIl7VOD1jj5H0BYTwLMrwKoI1bZCxC8oEXGpBxBrK8yrKahr+jukZzbBroZI0wvMe VS7FIW/te3QQWlFXkCxlwGjddmBRIE2ZRDt66xo5n7UJUD1NOep1LNu/fQQXx8BLrq4xRDn3+dJp UrxQRDpD7puvC3KZ65Xjve8Y+ZnxtRsqHudZZ7xerBOQz1bB9046djpFHXY/kH8vTYaDewIn9QHa rr16icbwGG9Tag/QcsyGNosGLnACT9rfl3u5bbU/hnAKhXaHdd7i9yIxKqGqAq+WZQkOWts69zM9 ODWwifZFAiyU16GTz2pRq+hUTS2LwjPNJC8sPMca1iEPUwdGRTnC1BQd7Fsf3ox8zlKoofOmElQ2 LExUhu21uYEieA8jepMo/UkcmcOcIQfSWIDksIVtHEb7GKscy8DodDalKoKHPOjm6ki5fulgYjCm YlUqdHZFW5vMR4zdF87DFJ+l8yLS5tl0wIkFkFaGu1ZJz0oxwOLY69cHiFhxEZ0K/4gqJvgrGCXn I99yL7ZQ2kVhj+L0HKGoym4tmVLoOiWrEfUVlKlFveW8+yElvn5Y0RxQakcZ3vLcE6ej2FeoaPcF 7oFEOYPzXYyFt5UAPQKu0nENTK22DA7PKe1M51TdqqOpsyFKOyptAsVa0/RKPnOUpCfEKfB2ColK 9x3/BkQwK+IzpR+698x1RDoFBB2pbtsGOdA+z/Z2dcCJDrNoGRmbwBk7QnCI+u8+QCfM06v1UdEm C1hb32XlRn6yk/Ssrwj3Gcdqk2BlZ4OfcwQcYJMhOp7jZAt1UFkjHDGDKp9pFUd+d5PxvQZMINSe BTsxjY1TDzBL5wDOkoHdNRyGK/TVPcywGHvu38V5NRXsvtvfe52zZg/cFe5BdNk07mUQ+cccUJMg iwCTXrNjjGmPY2MtgkNqkOmDCwdArNa7l9++1D3+xJnusZOnisPOuojm6xAm86CzYBCnkw0v9o4B ZQLcau2pk21PEakpfQ2BiKC6K/xer2fgQcCzhCO6QlZrDkewDxxjF3qHrek691sdIzXDwNZ2c/Ko 7SQiim0njGNQnCYJnJVZdYPZRwP8tISUr2twao1Io8Uts1eu01GmFUrHkvuZshadWm/TNoLSGJqD b4cXh9Ho/BvoHSGz9Ah64AqZirfIbMzA/z18CPoRNvI6bcuus6eHcfgee+wcgy+OdZc+vEzgXE7Z rm3ncnb5IIMRB+Xo0EkJW2X90FujUN/MMKW1J+dDp2wb+7RM7/JbyMCqhVyk7O3tPQYifRy09jiO 9RhtPO1zr4wO2rHIegZpMOoaM4bRQE1XNTvU10tpjwvkKpubWgHPk/ojtqdsyL6D3V5f+1X6IcYn 9rs6YglcNBMTGx09xDfRL803SjMAa1YcwkNHGul/O5mc55fdfnCAeaOBWrJXrQPT66+/07386htx pr/4+Y9CPXiC6bMHWRsGrGBnbiD7oRMRaDoXQFmQw2zrx9SncH9l9bRzFXzLATfgdsCY9KCMOedv 9XcB9D5Xs6sgwM1o5yrlWJcVL2UpfilyXpOLMynXVnPNn0rhOFMqj1o0Cz/xww+udFfe/SBtFB94 8CRAzjEy8FPdMmek0P7yDqRVmTFc5zxIXUmCa48sETZinGBqA/sq4q0NOffgEYJcwBvk88evfkDb yWvdDc7OOI7tOHswDl1F4NDkjeuRBlv4PyeR74ehDs68fx0bToZHuid6bp19uEJG5n2oWFeQwSOP PND92q98rvv4Tz/TffcH73Q/eOEt2oHOdV+mBaLUHSlwzitwWZK5arx19UXVqbG+DC2KCAUjrZqk vnA5wVdkqQQsq1vGrIAq/cEEjrxZysgq9F50xfEHZruvfOU5goa73R9/7cfdn//+17u3fvhy97HP PdN98uc+B1BCFxl0Icoefbz838653rhxrbv27T/sdm68w8QnEBsQIwtRJNBbbZl8pgWHOgU6X41L VTQLz0WL2rxRN9LqYYQtnBxDSB3NDEQQKjatH6ysntGveMvNBexPk4ezhaumcYOMKSa9HN4vj+3w lpMo0lsc0wbi1neZiV2/b5yLHEINQMb8qugzIUiDaWszeJVrokVwJjkkxxBYVCUcwg14mE6WKx7h GqjAOqjAEYeCqJxVSBb1sLHq5KE4poWop7gWAxanPuhwbXrRanxeo3F+FO5QHQpHvRZZyz9GWwqF kZwOhD+Lp1DKKKF+e2nlT9q69hLm5zYhSxBSBRo1QricKY10pfmKf+zlQmlpDny1tPOWvAf54Tqu opeFUkTpiTbqMKLg0zLP1BQK+zCcvknWepODp3M8z6G+RbuwNVL68qx0aOSD3mR9XWDTSpvsySbX s9l82j0arfLICbzqbCcz4f/vpuK+gibRaTMs4Tg3R0pHWaMpH8w1S7Ffum94QmvoiMVDkyjeaSLw OJ/c1/soGPtSH8VBWaAt4zTjV1fhS/bBitXj/ttetBPwqh84eTgRvGs6RKAmJ9PxzmMUoFkkJQc1 9kR/MU50URbMACRoyeO4MTp95WCIDlfBlgE3DglnS4621IBxnF2LWnwmA7uDIGI61XsW2rkmBr9c sxzoMrxBoEKvqT2ulpiFKhYKVcZP1Czgi+0Gef0UnzVND2KDsASOCa5yq/3/NZmsQNCLp6+uGZgY G2khOBXw7mzinwI9kZDWHtOuDe5lDZhCbZqpEJVWFnEw0yHGwDcyKVpe08GkQxQFTe4xn4XzoHHK 6wzkRWZEgy3849aSbeFe1ji7okSm+Q081FdBprlmphtCY9JRnMBID8qVlmOrM+gQD2Ri9BAWRhrE 9irOHDKCI23bsgsY6XfPXwsYcBoZPgpSEwCBfRQh1LGWerZBbcEmQXtcGIKHDBPCUTc43XGynQFV M8I1lKKAB/MzOsZrZIK8X+klrtkG1AWRZukVR3Cc7PG6ynNdBznVkZo9uZAzICggT3lIOpcLIvqr 48xmrrrXOgsYb/m2rqEUCosnvR8HrcyiH0+ReXqVgs1Xzl/tPgfC9SxBQT8cx6CgqGIGqvD5scAR AwvDAlqUuPShv8GRwaBcf/fN3rIWP4n0K+tSthy7vQj3cpnnliMv7aKyE/W5cbYNpD03fpYpcrsj yGfnPyk1m2SkZilanIKqNUXxno6Lkxh1kkTypkHzvQc/P3UmtPbyZGSwFMG3cjpPO7xwsJEbeb7L PLsZMfo6xjHttm2FiLWwDz0/njtOgEVG4dM/93z3CR78xzgUv/N73+3e+hBKzbqdHACvuP/Ds3NQ EM91x044fRaQgT7l43M4M9jhpOC5d3d+GB3riHL508r1LnspMjhAEaW0D1X3EOdAxPoWkzevX6KG inWza46TWkVhFyjiPHSMoRrQlpxCO8LeOSJ7QDtt4KcTbPYPuUw7zP5PAtVWlNg7x9HDSrcC3ux4 skMGH6LbzeZ4DvVtAjj54maj/EdsjnvXPsgfVXq20PMyVAn+q8NGARAGXl7MegCpIK5beiizN+t2 eEJ/aXPMoFwni/PN776K/G52X37+qe6Xf/Yj3UMUHvuU0ameOc7yDtkH2I4F4mlrPR+8KrVEtABM 0Y3vktYXR7qynt6bXGuDcTMzOoIZ8OS/2wTBGipXgcr9f/Kkrq3nvelrdVSmw1qEnnqK6ikt7cc6 lAMEhurDH+Ocvv3K20Hdn/3kaDcHV9/hRmn1KOeedbEl8IKTdYdKp0mDTPc07s/svICT8yVC2WT/ T2LDPAcbPM/rDG1ZZk3NCGzwf3ahIVdDBxE3qXyqHfbmCrpnmJqTS2TSlghUPly62N3gnt6/cA0+ 9nbW+u/++le6z/zqF2nbd7v7B//gn3WvvXKx+zKc6499hAmnzK9Qtnadt8B5DBVQgNLFMUPesrhp XKCTraxJydKx0u+yJil+i6APf/l/TY6bgUpWuv6UfVMpO510b+M2ezXaHWBg08/wbKNkzL/zw7e6 119/r3vfFszfe6f7T/7OV7qnv/JFDiC2YAJ6zr+zi3/lBxu3bnTv/NnvdFsXX0uFu0MW1uwawAcP 2+YJZXFX1LqliAogQLA0filWLP6Jm5+iHA9Q422pGHVgxax1heJU74eiLExStH41A6+jkaPSzlQg QrlVDn2xepgFtEQ/CK5Rny+uV0dco1H9q0XTbQ1rIZvR3l/YdlD5TA1z2kfFwfaQFK/IfvfGqVMo sWOgbUscoBuXl7rLH17jiqJiu921izcyZGTe/qYWfYp6cSDHEeZR27J5CFk7092uYY/Op2OKvzVl jqD0fU97FDl+SYS3nms/8m3PlIrs9uxxauOE1wF1EVT85Sr77HWYgye039co4p6Q40c0Z6qFgzWI o+43I6VzBfe8d6gUZh1s0Y3qYKHy06k1DyFyGmyZ+9LRs13XMRyP40cPpMI9LddM01ugpbHV2eVx TRE7SGaMNLS8RIsO0+c3iAA+gGtq+tDnN1bzuXTkneAVh78c7EzC1PEyROeFKjo/QwdXp8hDJnon P/ZuHEh5ZMg8xmWS6VYLBxeyOg5qmT60RLsq+mNS1azjfIhCtRnkQaR7eFknlYAAjqgH+zgR+Ala NM7SA1lnSCRMB8CJnZ4nUazeEGl0EoioRHmOdC8xQxO6VdvHBF861MUzi2GTXoER2CDFN6UyNzix Q4HTMnmrSJt89HX43ypr0+pmKKRWpEWRxkrJ0AlJEa1rH2tW35vV4N+FP3ljoGOs0x0+4yApcKc1 cmqClPqqn5TNcsxTwNieoZdLs0DqvPnJ6W6GgMSiNhN8E4PybOmUIFyd4FPuoIN3OLMZllDImb1F DT5FXtNlwkyDXF33LUGezrG84JLX4v4qWxHNPFvfBkt0z+B/QHRIWaVoxn1Jn3p9TRFwaUOOAMbR MgsxSMeDnb3KoJjBGZ0uo2Tx7jpO9wy8+xlRTGToQxBjR1h/l/7Bq8iHFB6nHVZ/cwIunUw5nSCK me6msxZjrJMopxNDj5Exy5cJnqyDDpSBgN0wpux6Qb/9wUEMmnQKUN1M9zONPcQQCQASuzwt0OVE tP5tDITtMT8LKmV7wZx+1nCWVKyLY8G17d3M5GlEdRLnkOENs5SkpBXNGmldnWp0Ro5zbakr716+ 1l3GeUtwp5yLdvL6LXraivipSzSInnn3Nq0qfY28Zr4ykMMWZ6LROvPKaIIKdYspcQMw9mGvJhGK Bsfx0JlKwMHTuP9BPZuG5fobnAdHv3uODbJFsNNFAvQ+vaiRT69jUL3jGHoCr1moLdqCZBeQGeVF PvqmgSp2QR79EVqkCYBsk8lwn9YuYpyRyylqSNbtgc+e5vm4gMG2nXsm0Xu282Pjup966Ilu4cyp 7k/+8C+77/zoFYIf9ot1fO7Js92Xfuaj6Z9/i1S6dBYHtWjcLGK8w4ekpxaydusK9BJ0ncM/7AQy 6HoQD+zgzKgrDQQu0r9a6sBtCtOGOCRzyMxh9NbCUepAHFUN/dFhRu61dj/dUGydaoaj2XnBvTgr cTDL9vfOdQ5VDG6zDe5zs8GxSUFr1WW1JwGBCsaOfqt8tQdTBVd2XLlJy9Fkwfx3y97FJyqkV/9I 2pf1YOmwxX+irpnGpwOKvtf5jJxy3Wn0zSQt3HSuX3nl3e4o2cS/9qWPdp/65GMALWQdMwDJO7Tr EPp6UhqOrSgpOraY0edE7qRbOLDMIVAGcmZlMmAtdJSWAYuDX33zvZ9hnUSeZYugfQCAb2Rc2kVb N/5KA4d4L2VhXQd1X2lou2AU4OHLkslqdJlNpkarL2agbzwMEixlaYOBKW/96I3u5CObTCScT7C6 ZuZEWgeO4xhItHprE3lZAeCy4N6lP4zTbUGy2dXbdJExeJ5Dbo8w1+DJJ090S9dudrehQxlweX4t vJ3k+7EEzGaoqwvbh2Rf3mFAzk0Km0ek9LE/V24uUkc11X3xmWe7T33uI92DcNzfg8/93W/+sPvg /I3u4VNHuk989OHuiSfPZZLx2jU6KNlRy25z+jBmD7kftz8TjJUbFLRgVYr+IzYGcYGy9mUtgGGc 5yBxLUvcHAYFK0vugvK+AHDlJxicHuKMfPwjFKSjux559yAF6le7l77FOQXIeOfVS90nvvLp7gFa MP83OtcbSze7S9/8t93q+6/Tjsh85HiQClNLI1BBUqCokhNtU6jt0C9qklRFg9+CnFY1cVojxdlB sDNdUG6gaTJ9BiON5ujFqfZgyHG9x3MdlCsTk+5VaqKTMhsOKq8dRrEnEAwHzUsUL7UimFqrrGci a89iXan+FMc7w1ty6FX4pjSqCbxtA009SvfYtvhGA8pziwCNkoYxEzDJhy+i9JYYVzrDa7dRyO++ d6XxqzXKzqaviWYZna2TiQIM6mOq17SrDh/PEkdBxFcEUCPjxMvISQlMOMNJ6zSkuCm7RGJNIUVP KVR5zt4BL+WVgRMWgonKKnPt/VWM0hf4GA3XnkXf+VdTni5gOdhO4tMJrGgwaIFOtWuYqNC2Rzq2 FjKi5EwZSxcZJ7Jl7eRXGzWPIxuHqKw+S1X6IM6UyNAl1nFdXqZpN9ZqA+M3Foe4OnQ43EO5SfEa sqGTLqDkfm2wfnaJEJWtFnB1T+GCsTcZC8sTWQRlsOVr40CrvMOvdGlAD/lex8JCRdGxCb5mGcVu mtQWdNOM4n7w05NxXl/9+iv0HL0ANwwU6meeYYjIDA5EjXl1KtVxRiA/+NBRHBo4bPL3G48/UyYN JnD+gk67bS0QyqAav0SRXXszKabQkyGw6wuyaApdqgZpXzQL8iLHu55XY3KVFLMp3yJdVZBkF5wx A0cRPWXfPWd867CyrFwZfCQboAEq5S6qHaPIf659UEHkywr0HTIM03DmD+AUHz6ykCyW3TPsjNCn 5HIMlYtkZZqxiNx5/HxO1pk6jKNMrZumOn2ZoUDpICByjNNpO0HTm96X466zR+Z3RVJFeq32Nk3v wBiQ03X6nWrwBABMcVrAt4SBUZbNlNlNI/ejQQyNSAQJXcKN5m/kWt5pBjAgMzvJZoBS81opBQtQ POSXG7itU7AzyF5k7aSW8N82XqhBzrCUQykNDFSy1aP0yKcfZUAFaf2vgShN8KwPPnS8m9qlr7ud fhLU8D7OlMW0Bt+2Yxy4i9N8AIcHVezzZ20FMnSuRWENNNKmEIeP/bA40eLDDPXgnuV6hoNtXQMD TaTvHCHlfRwZ/ssfv9FtYqg/9aVnk+1IMaTBJg7fBrJ9B4W6hi68QdHTPMV4W6y5nUJES9NRScef +9ZZlrJh+tvWcbZ+u8193KY4zJaU6Q9tLQEyvIxjEYpd+OEEIvayr7RdOVlpuVbF8CLn0b92AkhG pwZBuNcBLAzkLGh0/w0AkAtbm+r8JDWsmkthWWXnDGztrWuLvzkQ7ym6bUgj0JF2Qqnn0R7OZirs HiPn324enmnRz9RnaHz69RcM4Z51OLSVS/Qyd9LjJM9kYGWXmzGGHt0iyLZbjK0iz0I7maf71Lg9 /5GJbbIZd5DRqUee6D764CPd3KkD3Vv/BxwNJgLPEAj9DPzOJ547Sx/9O6T6r4fm4VqZURmlC4n0 hCE7jRCU6Xw7tnxEGpj9l11OzvI6Ad1VzsBNqA2XmQa6xu+c4XCGQuQTpO1PnGVoxglHY1Ms6VYY ROpcE9xq24MMi5yaeWB91QNmH6x/aD5xbGtGecfW9za3/l02TH9ADdBAgvjPZWAqK+vvqntXvSle dH2vHnT/wiZ1H2OCWpYQuTGYkv7BV+YBtIIkQQXdCktmzAJXlgz0mv2fguIxw7Ay98aP+eUvfIYi xqfStWLx2hrrjXNtQIcQTZmdwRHd4BzZCcOzpaNoJsLCarti5c78LJ1WjWuK59WVghry/53yWhld AR8XLNSifTulbm/oddamrQOrIjKt4+tCjkIjjK+iHrAVLJm7BP0B/uCDL91Kt5/TFL8eYbjMRVoD v/7KhRTUP/1TT3cHzp5V8XZr1tO0bIN6agpdc3t5j17Yt2NbJjyzoZTVoJQbZGK2oOY5vfJx9Ngi tKJXBj5I0wGDhGSTeOFoMkQErjznDI68Z+kCGTLt6bkTC90R+NsnHznWffFzz2VOyDd/+Fr3v/3f /+fdawSUz8Fj/l/+T3+le+bx03QjwdavkJVh3Sbt3Z+pxzLhWHPuxyDKHuwByJqeCHjWWtfajq+y 19L+9POKupOcn2c5lAG7zug0+otmlPy5QTR1Q3tOvgQguMOz2+XtGG0BF8hunQFoe5LJmG8cu9F9 je46/6/vv9Z9kb7zf/d//Tf+w871OtO13v3a7zOy9fUU6cjT8SANojBsGD+BMspoT7mc3Gq6NriY MkS40VSyN7qCDpe/3yfvy40xqknVMdcwLS764CAIj1b8v0hVOcOeOxGHFsD1gV3LyxRfT6WMADcs bd9pLleyDmVw4rZu5buUifetvbnvEzL53Jxr+VkYdAyXfWjBnrNRKmGdS6f42DYpnQIQ7GVRV/4+ AFJkmvH6ynIVccqZlVJiDt0AyToknSY33ObrGngdXZ36RMJ60EqQCrRPjnpDjZfdkOTylRSQMiBR Tvt+S1NIDaHW6PbtkEzlhpPG3xrHIM5Bg8ppq/Ncn7sPlPqv3FYrYmzoQR5of8GaU+0Lg2TpvDQe tjxYZZhnSoW9raGyD+2a/H2QiuFd0qara1QRExFjcXE+LOwiorZjAf+Jct8iqjZ95XAOnSh5hmO2 0+MaOoEW5gUhb3opbZt4vjEdeRCYyXCbQeREdFHUI04i5Heif7sYQrmj48q9Q1h2aTvEXk+hDJwY KbIlIupwEh0Ci3zOPH4qBvmFb75O+6rL8LMOdo8+fTbPr5NjAaOG8dgJCqQcJR55r/OjHAwMEaym PV5RQVJwyv3umCZ0Xw38Sh24I1nu8AwbAhLKj6i8ctWCxhQssge3btJr21Q9RcijBMiZ2Mfajdv7 V2Mp5SOfKY3CYFXnTtmoUcYZtxGHxBuxqr1UVRURV/HZlkgRZ2RKh9MhNO4pvzeN6vjnZDhEIKPc cvflRAUsKFmXdjUNuuegAzu3rOBcixRI+bFzgq3t7kqt0ajk9YWyS7GKPvTeRYZEdvCzpTa4vzQX pOBSJ3GbwJcMAutqoaITQFNAamW8xa0+i8V8rUjS7I5cTQ2hXHq5vw6QSZ9nK+IRnNReWCQkjYLP n5LDmUCJAA/5kL84jl6zFadO5Cprb7B8nFZ2SyBBd1+uzgU6e+EYB+EKYII8gZar3F0vHnCEgGEK rvQwVITdO7RnQ5+kP27AgJbl0kCzd04JtUBNyoNr6z1O0s4wXW14Tvm+qxRcTR6ZTjbFAqyrOHfe Q4yQiJs6hQPkbkuJ0Ll0pLCdK8LttkDLom6RH9PlIlass+3MRI9DV4qxqjqYQtU11AhpzaCOjlEn +p2fWf1xCRwAagwurIi2eD39/SN0xeOPDPOZU5O0hzOY4nU674Iv6pWkj60FCIhQcmfJdR8cxhFk 78wUjGH4i8ut7jJAt/9xtYZz3bZAKM2gWRCs85Fe556Hdj/2eB/erOJgf2/bs0XO/AKOzTTdgIYI Ru5iIybvDDNRdjF6bB7H7TDTQA/CQZWGswOat2Xfcc/nB+9342fOdIfOPdg99uiD3au0iRMgWKAo VDm+/MFyt4jzfoIpieo7i1WHQFjNpAzY+lEqGwu/SuHsBp1adL5GeRb57lcZbvMuXzf9GRSrs9S6 PEy/7HME/baXNDtQGSU5+sY3ZaNjtwTDXLjGMRcZrHaxpedjiyKLze6w58FfsnFZrMhWnfj6dwE/ 7dcxBhUcFmrtR6ovPBJ1zdAjae/a9y9vItTKpup6bkx1z1HF131FxbRvo2ti6AFspHkxHlx+7SKB 6Ekmqn7lZ59PO8ll1m4VKsOmhagtiFJGBXqSAQTJmWNPBGbWKDZNf3Fa++kwC6xJXwioyCcJptlJ ZJgoJ8WQYisWndOFQz9CClMKTpt97f2UWi/1XS1fXALOldkWG0JkwJQ6z8yE2Vmn63J9M336HIJo DqUaQtcdhIpoceo1UObXX3yne2KaUecAIb5X4CKFzCx2huMgk1I+ljMV2Z7UaYocHebaq1ukM86S 7TgGN/8KNsYJyturBXypr82rxWKh/wx0l21ByRodwkacxjl9+OwxaHLz3aOPnGK69YXun/3Wn3Zv vOGPRKYAAP/0SURBVPomBbunu1/88ie7Z54+Teti6tYEA9QHBDZmEvaoy0jdQDIdFq+WzKdWxgCc +08dnr5pmBPlSEv/jFwpr1lW9UvJQb/G4WILavomxSZ0HkABwJ8hzvneLnZD35XfGczOgmILvswg LzIZ/owpq9//7ksZoPfvRa7XQazf/NPf6269/RK9Lee7UdqmyAPsHaWRcab5EEHoIIe2ELBaR6Fx W5LmqQUQudcIh/Om5feGQ/AsdMzI0ke1sbvVwIkxPJGi2/bk1JBzPVO0RVtojl0uVIdW4U5xRZRC pSIUrBLGOmzx9awgbScthZZ+jNwsX68SVpkWkaoWn5/TEInrym3icnYp4H7GjDpF2kVbUFAiRrP0 Aj2IIb+5utgdg+xvtu7W1Q9pM7PUTYloEIyMD5K24z5sO2Obq/TURgCC3Hq4CEackRFhkZcdioNL IZJdyPMQaI7r3TskcbAScbGzwhMiu/KNTZskA9BOpA5Tcre9o866C0bo4HE1hyRo4uzf6drYbkdk IX2SGwoRDpkro8OnAkORhxPs/AHWqkbPcn/cYJClWMxqQ+Wt3cEhcK8Vxl1eJ39/eMcG/wQq0xQm XNnsHiVCPkkq+qX3mHIGyjJHmnTOLgVWWUM/slf2HDxAgJqMZNUpGGR/drj2nvsxQAGGPYezlzhM hn4xmuUoxJCLHip/LbBQqZlWTWsi+e8qBTi5FgSJ2lh8KA1kBoTPyNdqmB34inJpM5EUpTRDRfX8 Fz+es/KdP/xu970X34XQ0KXjwCafexilfYjG/jriKnKzF3E6WDzF0+mSGUPrmvERqdQ2cMMgLtsL 2XHTnhO8xjtQDwyI5IOO4nBNQmXRIRFh3F6D78+5saXlgMVjFjZZoKSysA8xzzSpEXYULIOr91h/ +4CHzaN8BQpwMEc7A6pxfqSyEgV3X0VJ0wkoNRXsP5fe2bWbxybyQg9VOodYib1Dx4wEOOyZn2Zv Xe2ue2jgbTYoNB2DCGBkU51TyMHBw6TebdumoxhnSmQcfqn0IfqPYr+6rSHWH4Mw7GQs3jfCfY+o VzgznlkDuDnpEAa23KuUrDt0aBBNNCtilsuJY2ZMRgxyCeZ0ONU7OnMpfuTcOVzHAjvfpxESoROd vm3FuxMzm9HfTKpXpxCDyZ7MHKCHNYfX6487Zps07SbOq/s7i6wctPAVkOLsD9/pxuBwjrGICwQW o/S8NiAyKGCbacc3R6EaPZlJqYo+j9rxhcljg07Y41Bp5Goqq+Lo3qjLNIMEjgzOuE6rMPvFjzIg Y4a1m3IYD691sI3UtTW5xMokRnmN+1/Hmdxm7e5gHHSC/X7HfroY8jkmqH3kMbiPnM857nXijkET wSbPt0kvZo27/bozz4AgdVakDwm53XrQT1H0uLxlpxr1v9NbnSBqMXzxRffsvOSvfD65kuoMzvcO a69YSkeRK+sUTw32AG0IN+l8MQaSaIbN9df5L+Sdons/x0mioPwJ6NT5fk6CPHubz6aTlUNhpHfd gibiOgyjl3aS3ufmebZVijL3MNhzZKSUK3y76Gxb09mX3+FSe3SkmWOKn6iaCdyJKQrK7DRjmp97 HZ8ksPpgqXvnnesEOdPd059+sjvx3Lk4/xs4u3JZDVQskLx76QM+GAQdD+xXfvlL3fvowuuXbnXH 5w91txe3GKrEM5P9GoOioqy6RuH2GrDz3yR7fIZ0/cV35LrqYIzTcWm9+96rF7tXL1xJhuswcnWW lPtTp45RoHaiO05XEDMVtpfbIojCEKSOwwK2PZ9J1JrPsBA8WVWBEmTbIt0a5KZ28u8KWvrvE4Ro S5NhLee3bKu2yKyCQaEkMn0AjpxU0uYxV+ZV2W5yrVfRanak/yVLaubKpghm2KRK2T/aLjPcoxNN 1TFLBJp2uNGfvotzZhePZXrn7/BMZpLV+Ft0JTpG16a//kuf6j7y8YdDd7rwAdMyoYE4hTBTJLnf Ic7cLAHU7Ky9/s1mioJjB6B0DQAqKn/q1t0xHXYAk9hMaxJadzBrjHS89moSrXSMUJ9axjxFkRVH 1Dq1tcr3Ui14z0LQqOZTtXW1mFmfJ9kGzp6ZnOnphdTGbRH4qzukNT308DHkdLR7++0r3e//1h92 H/3CJ7vnnn6wu37lKjaIuQhQZHZEm9jTOXSYBbrvkEE+x+RCmzKMjxqoVaZ+5C6B9sBk98DBg93F BTrerN/i2rPdYfSuPdqvE6yINGNwulvwrJdXqKeBfvM4qPQTj50gu/vxUPb+yT/+3e4P/uQ73ZlD h7v/43/2P2Z+yHHeN9otXVklCKT7Dudq5rATJJFn6W88ZFppJtSrAlUHRNvRLa0QWZPRDIqqrJX6 NOCD7i56J4olpss9aP5NBNe1bx1EkGuifV7UgFva9o3QK35kmht20i7AzwAqZo4Ad9TgheDiU3MP dodPTHc/oI3lO9//4b/rXK8t3uxe++N/3V1++ftwwEBJWGydFr80SiHg0z5PxyVtA7kp+cApbgh6 UiGWByJUEdELnQlRMp/HaDaHsaK/HopPSybWhWMUqNr/MoHOM6gzpKOoP9LkLS5iUv1er36aYLTx tAP83xe1BgWP0FaqwojcCNxDE563qLeOu85i/FEVMGkd/tahcqT4HqkQ044qVp2ztG/R6ea9U3Cb pkkfjGIRj5hG4LXnr1+mDdYKbahA81CyFhGM0WFiGiRjxnG6pnDRKA7LMZWZqNypRgEJeCaMh61k XBU5c1FEFnSJ/pXeKaPkPfu8DUDeAwXVCfff6fXp82W9/J/PouNoMZ1vMMARhanFjc5zfXhOndFR HaF+38K5MYCqft0ZQ21gIp9RvyRCr1BwkaS46nWJF5Pis70drlBGnpOqnBTaJLVI2mYYfuoESuog yiV0BQIZnaVZInAbzC/a+xcjpaEV/TIlP2bvY51FDvPyMtdCXnRBndxkcZuPLhDnV5B6nsvsi+2w 7JssRcRrOuVRFDfVxA2lSYqaz5eTPU9h1tzBAzg0RMQ41TvQHzTYTiIdNhoWpQSlmFjoujMUPCw+ db37N7//3e5leNgfoS3XMAVHo6Aj4yN20WAZRDis2udebBM3QMW/U9BE/mriIyg8SnmSwGZwm/u4 jbOPwVOxbDNqdYe+6ypte67b1s+hJjvrZlNA7HE2ypA5fZG0NtMCh/1QnmUDtMufOXBigA1z0M5g Wtc1JMSgIoGIkE+dE521jKr2e8+zWaaGmHoW4qSYBUinHZEP9tVJnMqQBtgCKPY7XVVVXmyKtBWR lGTCRMa4X515hW8Uz3mM4QZJiwaOdkIhaCFO5BSfI+oxhPEcHAFRYi8MIMI9NFBSfdo6zu4T+oso ddd0Dc6kIjmK3IqyjjqmNgEgRlgISyTCNbLoSzQ8NAM/nmuh5FXjO6u2hgNZ5yyruOwTPiqVwGDW 1DDOiMM51vi33D8DGHKhNc3Lj9ihj7FHjM+2+l7ZW5if7x48cjSj1DeWuEe6eIhyG/DKNRdJGkcO 0xWKL9vOyXeVq+g9hqvMukSN6pTK+wQ10j6MD4OYgvrcAU5xsuEdRnKbaTyFwfAMapzGKc5btg0W 9+I9bUnx4dxsiWxrukSImaa6DVK0QxWmw4dOHoenTTp00Ie5zVklmFBW5Lc74fQu6PE26y0dZo79 WvBscq9T3LvonCiyfFh1wgTcVgEEbYFZvR3sxN2WKRlA7wTJN7PEOcv47DiSFr3xfnSmHVocLGNA KJ3JhVYWdSKGdIjUFQQAQ76eNXKwSsh1yi1/2QnBbMAAgfRtuNcWVU3jtA4gN2BsQYuBlQlAPLPo d6a0ev9JJaMvtXvKtGf/Dg620/B4YegBCzgco+iubWRoXZofev0mxVw3SKE/QV3GqUdPYqinupXz Fyk+XGJv6wzcoRDdrM1dQJlhWiY+/NEnumeffrK7MPQh0wMZDQ1FYZz1P0AmWTqDaPUejqR9qnep rVB/2AlmwmE0gBagDYj1DrVAd7t3dza7K5z5xymeffaxU92zdI84cuhAN02wNErnGAPmuzhTAipS qdKHXIfaAFXdjkxaBJ7QTSRP0ISzeY8nHdMf+1TooDqhnOm+m1WoIKKJ+geeLIU3AbRnXbtRzvV+ KzpBkmTnLK533yzK9jAgd5xX+bbWXTjArBokSA+wroA95x63OQwk9Al0zQ4aJEIfk6frMCszxtYh OFyF7j4njpztzjCR0DO/7LhvXjfrEDEH5Ui78P4cxiQCLXrPte3ik65AypZBOV5naliw933Qq49R XYYU0fKPKvgInJPnioXWxXH4Rf+nAYOFe6g8XCd8iABurWAz9Bo7svH+zOSozjbxUwChvBftclrq omcnCDxPnT5MMLHevfj1l7qXkfXHzuI4Y0zWyNCsUpxoQG1nkyOHRuE40+GKZzzKNaYcH+40TRzS Ye0pPuYmgMU8QfNZhqusMIhK2y7QtE32mSXMWfS+16niPLhwuHv2iZPd8wR+ZsvGyUq/+MM3ut/9 118Pr/1n/9oXu6988pnQ3W4DCkgD1b4NAWLsOlHSoknlRAcZbV9tWNnzBCYFENlOdcDCYmtTDMAT UxsoN9Rauoh+kGuryQm9SEDXNW5RTX6v/2hm1T7lOuWCSRpv9RD/Zh2loISvjk83QhA3cWeze2T0 sHFp99oE2aZ7Owl6dv1a9+Pf+63u+psvJLWpMg8yFTQ3n1jRVO5YhynbXr9rf1dayF/3vKrmbN// Qe37vp9zHUiFy5vXqNcPUvXeKonLmfan+b96Q53aCvT83Ljk/lcpgPaGe7Ka7+re03i+pWBzOQU3 9942LdVwonaVkvGa1UlE57v9zLPmxvFeW19JuF/AoNpNYglFvSb6JGqGUVpFARxAmRsFaxyXQUk0 EFHwHIANXm/z90rlc6B1rv0cEdecqxZ95TkrrdE3688Kx7Hu16Qcyernet+fPGg73EhiXywn0j2N s5e+qfY/5X0aQsfZey81TYvDLK8yHG0+CaU9TAGR96g6GLtDCp4Du66Sl++caX8oLrtWcFhyL3YH sFMMSsAiIAv+MoaaaMIphEdQ8DdpYaMBkj467uhzDMgIa9SRGvKwXYO/7NIcwBlHdxQqZCs7Xqvi 3kIJrImEo2RTIFrefpRoxtmLMBoMSMGwiNQVcYNTSVxr7oZL6RnmPjVgImyZEIq22ARl2nEsNAfs roMz0kXALhHwUuE1q5QeOHkk1KDXaIT/JJOzjoF4DWD80xrRFB7QlzUH6RLC+jjhzcK4cRBoxzmv wuu6S8Cxt8sgEGWE3xvEiRxXB50WrOAIyQV1yp28y10rteWksfZmOkQeTVF67xns5Jh2nK0B75W1 nwoaVciSaXe5wVUIWzITKkpkv8dn61wWClCypMyZALPARGdQeoR0Ix1oZV3OfPqR5szUdTJcSpw6 +qQc96LGgGZCq3ASmMbDYMKA3X1TQWZtQAlGuL4T+0yHj6T9nk6Tf4pSYYFd6gn43Yp8PX68BLLg 3xtSWJBFAPYEOHYi0eiazjc9L4KpXOpI64SKanrPS4yxT2Gh2IKoZehsBjs4dKBETu6TKrLMGbCw LZPyDIZ5jR2D5IbP4PRs4qRvuGcGdnz2Jz/1WHcdFNyJiEtwPk3njoMsHYCHuwTH7wLFMvKvT1BM fpDWlEZnFmIm08BzSFHS8VbxW9W/t1NdLOxJ/fAzk6BPM915Rve+AVXJAleffxYkSGM8MeeAHGNl EDfoCPJVi1Yj9cd2VvZYB1xgDWZNt/J8dhuRCmN7QD9YTuYAhnQF1Mvsiapbfrxn33P6kcfO0oLv RHcKZ9OAJD3UBWK8fc1KCVrp+Uw7q2yR3M215eUYXUdNTxGkui6ZdqeNQG5HeAiBDqeARq6892Ty 7M7gaG/OFMZ5mIBNeoCpeeWkhq7YVahS3DUcBqeUz03nCDOhBkTeEU6XXT08S+6v3WpiN/j8dOAQ wWsdNNbQ/7ht0XHW31igOMjrRaS36N9rilles4M+zPBtXV9MsKv86RSIMkq9kfJiH++ZE+jQ4xPd l774fLf5xNnu+NkjOC8j3YE5uv14n33b0zs4f3xeausAdXblidtfn+dQNt9gjPkLb54PIvlJCsN+ CsT8QRxsJ8M6GEWnQr2f0eM6jgFwip4jsu/59DykGxNOe3wD2+56itNNifUMpbDXG9Eo9+kR/m12 iPenwFkTrj7QXAWBzMclANJMVAZa064Nq2v6kypELx8kZyzF3kUPS02Kr4sN15ki6CHjo7xrHw7y nMsEQLY0XIXmYeZ4lffeRJ/bgUrH2P7Q1lCtEYx6Lw7EGg56ac9nqUZFwVJvpxYkequ41GnaoDbj JvohXvUYviZ4VOF+eaDyWeop63vXWABA9PUn/9QC5KnVxV4/wF6j2bmIHib9raabwyRs/pALWJOy uTvvm/eNYCOOY6M+TxeOl9+50n3zT77V/TR9nBfmFrqr8LInmS9wlKLmZYNGgpKrNwe6Cx/e6NYJ uqZYpzm64ZitXYG3vwqVaZb+4KfOHCVrv929TyHtErrBQVInj1szQqtH6HGu509/8vHu7/6NL3Bv 291rr7/f/b//n/+s+953Xu7OHD7U/fKvf6J7Uv42fHDPvqDWYeSzABKyDxSApysT+1N9vaUi2+2p hre4jsqnAVb8Ys99AjY+WSVn9zTNg+sRX8r1jLHgryrazxoKEimMAHABWrKYxbgoZ8H3NADW9eaa Q9jtcfStPoOUtKN2dUIv7u/k8vUb3Xf/+T/trrz8Q1LZFGVQXGavUh3HVG0rsGrLIFvl6BkZFn0y FrgcvPiuzbHNDcUzbA543WNvrPcPkYsTVKza1dThqENScLNoRUXBEbD2s0L3awGr3kFnNNLdPqgE sv3ffTJbfSajJEta+V0Jnl+mlzy4Pq4LVHyyeuaKZkw3FHrhfYmkpF8p77OIR6x3cPAWqVIQHATa yYOixRoxx3NqLG3v5JQkuU2mcKxezojbPLdrXAe1nJn+1ssa6XCXEqp12t+T5DHr/R7wFAL1kfL+ NSpq9kJiB0a6okJpbWXBKM9hfm5EQyaiyOFIqjnRucWVjkfly1RyK14dAPVyuMIo67m2uRrurYVM o7Rk8z0aOwtMRAcrDVhcMIMMDdE0xs/BBHuknAYBIpZQirOkv9f7kc3crcrTggh7k/q8iDMpsurx 60HMIA8OoaODt6A6jIpk+vjtOV0GxSLromOriEjB4Rk10rYVu1c3YvEeDiLowyT3ZUcPnZo762tw ylaDyg1AP7GVl/1k7ziRE+dp3JHhRO2eH1GK81Tj67Ra3b8B51Ij5E2kx6zylxtS3qvaWxRODrnd PQaJhl3zbdZ/9fbtcKWH7JNu0EKQ0ffu1Lg5GEDnWoqV42vlp1tFrlNS/VvlC+MksQdBCkV1gn6I AjX57mUlIpMwMmdiP3Bumr2MR7W+0lAmE5LrOB4dY7YECgTSqZMk0rmOAk7OgjW+46IYmzV0doi0 XNr1tUDSYSUzoJnTOCUWzG3YW1nEwOyA+s4itbXSC6ZPHQwRuxJdFMlPFiGUtHDw7OTAWlkM6eRC nRG5ufK2ea+0G5WxI7RDT+H9OmcW3CSm5942b9FtA4O3KXKOwZiFt+iiKXPemoGWjpzI7xj8w3Q8 0oh5vgkKdfykGHjOZ1HAQ6MMP3FICXKvc71AP9rLdOr44I0LkVRb/s3QQmuTIOIWBUWXPrjZHaVI 7giO1QzI6fbyLbVLUsDKnMGcQU06mVggjMPgWXZEuNxLg1OzMI4evkjLtddeez/FcfOsswHBCFX/ t8jESEfT475jYFIrWUacZ42zPCjfGCBgDF6wnEdkWOqYAYZOZ2oVWMcJwIU5+MQxRxT2ff7jT0Id GO1OnThEUS2TIqWaiSjFkVCXVrF7TZ2NMEZ3WNsT/acTzeeH7sHnq7qCecapqFZcyePZHCAt/NTH OEB2RTE7hxNYlDu+1xB65tThXlq7K9LFz81q6Azb99hR9QFfpJ0RDMlhF8lVbtOvOEOhavCXxWZm GrxYZcdK1g3UcmZ1ymlvltaOPOMEAZbjpe1AtIKjp53RcVMfiEpKGdBI3766xL2PJzV/+tzRbgCn PJNq2cdxnWARdOsf4ge3agy7Ydi3W51NULkK+vfB+9e619+62H1w5SaFq/PdF+jb/PgTD0T2xrkX A2GH2giA2JHFtY+TyIOEZpLMgqFwjFHOSIpjeYZkPAVHYrN6N1HT0oxN/Jdms+Pkuell0/L/2tTs e/2oJK+CryjriIN7zd+27dNu8KwCEnGUzKCl4UEhtdZFZSR9skfYIvTpogNfUvMBMguAtYgM6vYc IGuzyBS+dc61nYmOMfxNqozFuGZ6/PAZMgcO5kp9TEM/LeD2d+qtED7MbuonBFWumpdSZy1oEAxp z1FWfN8QNztca6eODHIaz7Dsc67g2chb2jqqlQ06el8oVyy7X5c3m1iv7ymxaUto/YHZaC7j/pkd efDB490FMlfvvvZu98iDDxC8naRbzIEMfRElNqNuS9R19NWFa8uh2kzAMV+gVeVdszv83LVavcYZ QW5uLG92H1ymiw26wUJvAcQP6LO9ROB9Dlrk49CPjhw/Aif5xe6//tff6P7NV7/VnWDNf/mXPto9 9dSJ8LcNZBOgI4sWUHqvW1B4LMQewZ+wRsYBLeo5daBn2JqZ1O8ZFGtL4/PUWdwflleOavMvGzil mIWCq73i11IlpY0awDeblMXMWnuwPQD+2zPRgF/thq1NU9wl7x2QwiyCNFa34fb1q923fvM3uwvf /ybjmOHlUbQlb00vPFEq/EAFNErECNUHsmOGghODVpuqkrtXNNiUpsKQELWcviYj+/dch8yfI6go xixOZKWKlEpo2gPGg3fhquimhKleUSKf22jflTL49/+pziV+lQZvTkScUhZ72Ck/ooxyV5vDL8mo xQwKc98iJ368b+fLA+gY1NxeNqRQEVPA6UThnbtmqdxnpUSa8gA1Jc5lSJq5TFN7MK/ja+oJ94+R Sqk9t7fQ3lFCoiJLtqF/+rY6OXX1vvC04yyrncvR8uciNHE0uJDomxO7quq6qvAHGf86PIpRv2vr sZIHpuNIEsYZJd3Nz4rOI+pQUbnGd8Yq66awVYjj4ypIDLdpnwxRAZXcWIyi1hkYR/mvmxq6erMb IN3kdCwngo7hvJq23AKB3dhAJk2BhSrLfeiAmRrk3k0BRwHKl23FohY0Fu3BNajBRn1f7vJzlS9+ 55LotCP3OqvZXBTzXSkXUjc8kNIRcoZxzpb5XeRQzeWULCd4Su8whYiR5QwZjUcesiWufWUDUhvg oXQIBKnHYVtiMbTB0dczFFRumRY3Ip5lAAkG9u4aa7WIU4fT2KNAdcW6sh1kUpCo8ytqzOSvDHHi vOpsey86ndXPqgSkiopaBqiJzP6x0IhxT/nPwLMPXP3MiLi9fO24UjLklD2DsThJOtNe31aGOCyJ ZaM4DdpFWhQfESzXQqcfBwc5sXhQxGMFpNPgcRRlJ0qxA1Voh4EmDijou2Sob9LxRJkNTawcajs8 2J/XZdHRka+bxJNtmgxGuBlBg7sUIIfrzl6Ibm4hT6bnRUlM/5o2VA9OmSJGN8qXtfDSYG6NCvaA AlxvY8gJi3XOQoFrAbjOibziXXn6towia2EHohFSqyJ5ovtmGtSxSoLFruMY+4vnL3dv43DrONsa b4bhPMm+ONUVp0tOtoOTRuDPundFr+H39MTWIOlsGNxLqXmAscUG9mM/fLt7heI4BzJZqDtvoI+R WMaBtCBVXX9X/R6al/JoXYnpbAI2DZgBBT/fAXkKihnYWzFSNgqc8KzpCAs6WM50Fv6kcmyxsZ05 YrxSLFhZnDgeCkXkrKr4M1hMvYlxzVzEBOjlgKfPbzwrUUR1aXGj8/lyllkLUUizON6D6XCL0ALO sO5p0SV6znsMQuNEKokGJwQqOs6RzVy/2uypm6fslsGbzKYkUxIH3KxIG6bDJWzJqAyLlOY6TbfG LltDQSBzBy7qMg6fgWKQfJ7F7gPSGRxI5FlxIJvt0MzM3IXvOmgbPGTiDpkNaTIbmzfrILlGPp/K 32ATHblBoJQ+61zrMv3FX3jpre7y9ZsgjiPdRygce44i6xnqg0Rn1aMVFONI8Xzp/tUoa54TC77T zswAK/lJ7aZ7UMNpVCNVF1GOcGxLD/bEZvuz5ui4fwES3LRSMsHg/CNY1F4ZndrrICW7vHac3FYv JbPMwEJn0bMqgsnZrAEifl9new9HSf72tgEJ9C+da2XcvctkZGRilUJ4W+o+eu5E+OcCY1sCB8mg q3Os81K4vEedVm1JTWBUdtIel+/T8MMXeavo2WQLtSP+KBTX8peipXukLM63Ab0fxXfsZW/Pe0ZA LLUZ5uhnF6g53s32u/9eIcH2vUUrsMOb8mwIwyggvCDtRXm2YbuwWTvGuX4W/vMPvv9m9+IPXke/ MRWUriLvvnuB3uwEd4BLBqZzAK23p+Bj55jWJ5kQtjv8MnK0ZtaMjkeuTzJW4TyjH5HVa9dusBbM AaFw8vRJ+rNzP79ND/ff/+Nvmzjufu4LDOr56EPJ/O4S2Ah4qFur/gxdKYfeloWcnxQqm0EGzNLH 8BkMMIfRLdHXDn9zT9QroRE33042Qlvr+MyRWSZHUtNl8WU54OgN9I0BsbpYvdI2ToNVfo4bFKHP xuaKAZdyTfUH9oZnmDYDSDAwfJvpOn/5T/5x9853vhG0UHhbYyRqrWKuA9ea8HvhHCodwTJkfZSr xJWDr3NcMWiTmzJ67d8RwBw8v6nX+BA6J/041ETCRhn33lXRca6h01h0Dd+Y/2+Xim903+G8d0z/ 6nd1YNsd1ulOxJfVqwK4BAx1F7nB/rr9PxNRq/RNt1crtTGq+Ldtu2SEyHtVtmnpxRUm5Bpzg6Id MyBgDpQQldtCsY1QnDSFAg2HUgfGKl/uTqCzT9Pvo/y5lzLiOVz59l66LLEF96WTlXtvgrO/AvtL XgI20vq17oAS6hCKeqV7CMr/rq3NHN4iCqxhC7LO96bwbX+mkFHspONp7145yRPwr6oDhalZUfBK YVcgU3fhLQzhjI+Kzqr0HMELwmkrtSk6spwaZXIc6Nh5hiRcc4iHNSsepjhvoNsgr2sq220OAVGt aM2GY6gdDkBF/hYLRyvSpLRDYO/pPXxyD57EiHAQkpExtRxFVPufqVtymUGyhoS1SE/vQHfYs40g r5AzuoNilvfse0ROpPREKcqjNiWNDV8A+RAV3+L+nH64JwLu+WB3XRNfnnaR3LsI+B6KRKKKSyU/ P21MpOKwSo7R1cl07NUAh3hnk/XCgMr5DlLGvsXAcH0nXNrxRGdGRSq1QYMR9EXHy/XXSTFTlBNV gWzOUtujiDn3sGt2al/2K/jtMzx5L8uzjhPnek5x/Q2cBBH4yLF7rbJFOUk9iq8dlKBCwQRfcbIN CFRwOjE417zHMdkOGpiyOwN9mdOfWmQwHLsqcM6N6XiJVKsdVJAWViOXPjsXCuVmDBR3T2TV52Zf BwzAeM86srSpE2nfeQOvOH7oAtE6kT3edxQUeQx61BJjvOXx6eyura1FNzrtTadTSonDNQzMLTBV yXtrOsAD6SpUQm/gl5aVOsIOD2It0sLOgld4uEG++LrFpLLXKIi9zICP5555sDt19njOoNcfJrh0 IR3ukglvUm7i1Bb1yQ11IuM6jpZGySDNoshzT58JiqpuW6ILwjQdPQ6eOEhAAJL/1hWM6ER3AAqJ nTdErB0tngAk61XBUEx4Cn4ltReiVg6kmQyDFA2hxW7y/6tQV6jMIrCgiTzvmIgP7ytanvsXKWk6 uKaEbq1WH2tHnftcGwRaa/C7zRY4SjzOr29hv3tblPvh+hpObdYAtKAKtgooCNdV/aqgJ3g2yC7q YhAPbUnoII5Qd+AITrQoMsGXAd/07EzWcx20Oe1X7cZgyzeL7lGFjnqeZ0LrsEOUzAhwDzqmybzw t3UOd2c3MonuOoHi03BZHbOuDrCeKB137PBCEeoCQ54yGITfbUJFc7CIz2DNxDbo4AAUPD/bdbct nlQZA6F16HQWr+mYX8WhfuGld7o337sEd3aue/ThE91PPf9Yd4xx0rbsDerPXqinXePQHpQP90mA J61VW8Bt3QNtOtuhTZ1SJgzyzOo3ZaqACfek0UPKPN/7cx+afd9PS5/4tt7EqhOjh5qeidyb7SsZ koakTRXkELkux1pktmiL/s5geUeaX6MM2k51V/49AeY0z7HBtey1vERR2rmTh7ovfvbZ7sFzxxMk bqCrfSafxQFxZpV1wDN8R9lqWXyR6lA3ta+6RfFOyvltx738C0GerEPBF/uZ/v3FqQhjH+muf9VS 5pwow66P8ltrm4xhCzriD/VZdT8jWbwGlUTX2v3GXLo1ccg2dTFSWHZtS8kenqTTx0X60b/z5sXu h6Mvdh/56ee7g2RvFu+C8AsuYt/nHZBFQeO63WfwE1aoT/BzN7DZ718G6eGcnCNba+cPOfnOoqiE BXKPs/rRp053X2Ha4iEK1W+il77/vZeY5Nh1/6Nf+0L3M/QSnyFLDm6SvtzKoZTU8o1K5ydzFRYF toZWoFvUFhkQ2ro16HyWufzRsia1DglaYmcLgKh/1z5mWB/BmVTJEkC+lJFGnWnObHMu3eBsQtNT otZ8tvqCmhN1C6cmusXMk2DJJJ13hn/nH/zn3ZVXX0nfX5vZh2Oilx4l1JRe4In+HrLtTYhUTtWq aTA3pR9TB22fHN4LTntbPUh72N5q9wfRz80ZDfx6z6i30xjB7EPcfRFUvhvfKqey1ukn/7QTuy/Q 9rF1YRWCHuFtkbE+jUNpEEzdkKFEnPelWNr3/eS6orIQ+eNUmg6/nQEGOGFIwiTO5jq2z3ZeVVig MuB3POcUylOetSloq1+N9NBoJRpN4bgA3p4GSp5RUzupkRW92fXgifjnv+JtVTRbFJNyb+rg9n/C dSs1EJQkbdKkFtgPWIcTdMVOE5u0ENw2pWa7MhW4SiOS2gyVBNa4K+zV8u2KT3BmnAY4yPqtWo0N 0itfVlGy17M2WY6fyOUUjuc4kbHdUrY4sBYNjfBZc6Bc8xzILa7zHlX6txiVukUXCtvv4ebjWDmJ jFSUI7BNwTlmmgjUSFHkMDxJnWz7nIoitwp8JxHWJDYr3nVIQR8p3DBA3XGyn4rahvd8xqiHUCWq 4eCzNtfhgVlxbWGe/jp7uLns2GIcqaSu7FPulC8+3Hu7upi+z+eO0CqLG7qBk+SfKRyaDO9RH+ZQ 8k0zEI4hTvsfDuoyI9JVZLac0ulWNAZwWhY/pLctGZRB5GYDBbdKEaQTBadZM+XHdda4aFxNLZsm t8BknM9VQNxHx82790mxsmb+vJCSkpbe0KlHwoxWpjwiUfTeexXS1CRP/+mUO5SwBgh5cgS0I96V Q50po/5qMdl0iuovQalGk93ItXTSa1DSBDrI4F7FWgNFasCClCCRVW91i+BhG8c4RVEuoUgWZy8d X0DnzYQM896xOZQcTtEIyMsQgVucYR1pBmTIIV0yYOICUzjRk7RMc322lK9QRLg3ebg6+zhGOo3S xZRVv+zMMkyxm5GQBkEDsIax0bE20HZEslQSUe1pWjja+jHNTMxaybHnOaUCWIDqNL+T9HMVhbwJ ReT1l9/vXnuZYRbQQJ799BN0mjnYbdI+a48C84mTc2yy2aXVrKuUFNF1EVAdvXWcr006n+xCQ9LB 25gwLU7mCNT91GMns4bvvf5ht0hhnIU5FhAusdZTVPGfOXY07aW85pb84cwlr/aAtoTUdO1Ig+L1 0TsGfFAvlMEa/2ygUh1vVjkH6hR553sGvjxzChp1WtxvsyvajNYTPM42+yMfXd6+9BKDAp3KJYr7 tpfsiIEz5+Ay1qu0tQ5i03/KQpBwMxk8Q0ZP8+V4es97nJ5CqNzXQuRxngU/4lyX4yJSfYee5aah h5k9oMGdRn7GWZ8NqBYr/G7kcA3bSNDOWx3aJOI1BjA1Cd3GNHWeR2TVzCfXMLhcQV2+ReA0sjrY Xb54nUDDtrYWDyJj7K2zIzwP6ezQRjxfxxmZoOuC9mYJR0Y60RTUvAQEcYRF3h1YQ9BHL31bSV66 cqv7ix+/1r1y8SLp6rHuU8881H0cvushqEXS4axlmkW2tqC5qUME0tILnv2TS2/BuBkSkX7leQRP KG3i1K18mMi4Tq26XDpgitWLl7mPl/07FljlJNf9PutcjlHZpnIF2jUMzJPZqAycAYD0FXv5Z2CY +safq9/cvxQoVp93ZdeWjEu0bLEfuQX5dgOziLEuf7e7xdm8RD3DOnL85Y881P0MY7VnCEBuEnRu su8zdIVQF6kjRh0SZe2ZSkr5KZOatU/HMP0NhTq1AD6Nr/F7MV6BlJqdkJ/Hn2o6lm9bGNKevxwX A2Q/yeXy3ybM24Xr6vEJyjfKNcsk17obEwjY8m2yZNjgFPPp9LEOIABFm4oDbqCA7uIB5DqvEvT9 5R/9gCLEze4X/saXoDLOs04AHDiz0jmPQoe7yWs/uHUbNHqZTHRRIXzCACrInYivAfqSsx24zjF0 zkO0HP0f/Mpnu489+yB67Z3uz/7ipW7l1q3u13/5s93//O98EZklk8PXDMi3e6dseR7SWEAAgYeR minYtUJ/9mW+amS99VxmyYVWxKGQg3SXwEZkAQsADo7j87qW0j7MDPVAyqC63YJ15U9KiNlKi6f1 xZpQVuRUAurf5ZpyTXNktdiZq8LaCjqmBTWj181UDb/9gxdAh0gJWdASzLwc0Xu8yibw/TVVqhpY 8wK+XGdOnmOUTdv4PnLqxS3OdnPwyo7356gEp/1e58U/iWI9YHLK4g7lp+0a5UD6Io1/Pj/vbwe0 HdJy7ttnNvmsf9fPQ+sQTfOQmEZJuWjdmKhq3HUcOJVYjRVuz9YEOyha7742qkyhKaZGULYObkiH FIxRoiPb7qi0Kmra0yKC2vhvaxh0UpJGagfQ+6jijUJbg8y4z+6n6LF3ijPZc68EaH1PH9tW8Vit e/HY71uLCJvKWQVW+5sonB+JHMlNtAJdLrk8ZvdXYYo/JcLvp4ju0UEgrehQwqn2xhFRFsPJ4/PS h9ihJqZl4ACnWIk2jlUoyXNpXOz16docIiKlHdDi+1TPoyQd0nGAA6fOWoaDjPcLCG26vSgBd0n7 xlU2utXBiM9ayJTrle4TKDmHX6SfOAGDB7HWwWKXQs4m0iXE1mwtW5FoxiEU9rvGobLTgikrUUjb gyn09iuXPsQ96ED2Y85jeXCYblOQuML7TuAU3TXdCwqqExJ+olwxU5oQvsM7l2vpEA0RZtZFQWa2 A7wygjQcbG3WNApAmow83EzudCIcDsg2CJuFg3F+cx+V8fBgpquP0qMCVWEQ7esQJLZ3HVyPvJLV CMG4zn2v/nPumsz70yKGePb7M9QOVd7GesnX5/W2vbppayKfV2PBnqUvqzJlwBe59DHrDAYt5ucZ AmI2xN8FVTebg3NMJmMNlMmx1AIA3teO6KiBUGhvNV3Tai59DpWrAzXsNGNxUA2/4LPjC9FqEkeJ gdLdLYzJzZUb6cYhX9ogU2OantO8Vq68HUoufXA1WSXFRhE39eeYbwc5jPADC1pXcFDMDsQYhyJT 3UR8Up21rY2icwhA9GhKCmFFRtfKehrI2Wv5qlPiXj6fTMQzpEsPUMSYFbcGwJswZW2alNfrgOoE +jPRXYv/lghsHCAz5TlDZnRK1rk/DYDzCnT0NYK3bt/sJuBbyuG/zZ5NE2CcpmjSAND9lgucfbeL B1Xwtknr70MwQTWVIN01Ydyv4IEI6mioVKylbQ2RGIssFbSgi2SqIl+NQhLhc1/i96jLCmnzWhYM VwcJdZWGrNL18tnTxlJdJ5KX2QYi+JVBSqaH61hb4PnUwd2iw46IY9rn5dXt82IsC+VysI06W0TQ Qj6dOGlBE9Y5cC8ZYR26gE6SLcFAse27zo8y0RVdaJDqvqiFReGk/VT9goE9xbVSvDwTnIclZHrO gNxUOAi9FCaBCCdBKk9rIOQT/EyO766pd+geNykqm0bHchASKCj3TsPTdhhQ3wS5tjD2ncs3u9ev XE5w9bGnHuqeoNXaQTjvDoQRNFJupfhIQRqbJIjAkTcTk+5eBJBSP9yD/dHe2mIdnd4mZV/ULe5/ 7en95iVb3Jy/3o7FV8he3rNDsfHNaW3apFBFr91+sI9g97pIe6Wu4X3q7xoyVRMQ42jxlama0mQ8 bji3Otnb6NxV0M7brK/IqpNDT9Dh4iPPPtQt4FhvmM1C31sT5VqI7lov4Sj4Mc9RhEYDafasLL+w ogFfbHb+Vxn3ppCjT7WXroV72ztm0dB5xqxc/+jlKO//xAMmylof+xMAWZPh8ux9U+mV3EHbD9fF TFJcmhSNav8qC5BhK4JOnB8zgnPoSPnXb799lQEu73YPQhU588jp7sA8tR9pA7qY7jOCCyL70j1s 53eYrN5dQI23L93obhAAHgKgEKCzO5P1GM8+fqL7yNPnmHT5FIHcevdHf/Lt7t/+4be75wjyP/Px R+O0W1MkyJRBcK6e92jNC2sf/8kzziL4LH65DwY7BnXDUARDAeKHwYN7eqCAYAMdK/DQ56qMcEbH e+49x3GUe1nTtuny2Z/fZgjWc3FN9RDv6anL+052gDDuL5PMan0T8GrPpN54j2O0Q7HXomon0XgM i+lLEabq+dpD7o0htC8M9xfNVdpEr7y+UlhYz5BFi01uX/Ff+l81ux4OZchjohporJYOKudaRVqO d4oiQlxughy/d98ryGuqoHL/E/bvt74pYa7WgTq1/p8X5j3AkmX0RWq9BQskWtqgHZreac1leJ+O YxCQFj3LDRrGuDtMIQQA14K12QaFNOU957ASLr5hRws2bZquALZS27JJOgiI6cX+kPkZrcanCUIW oO7ZZxAZjJ1RCjyF3lN9XhyKdlj7BSilVQ6Or08zeIy8hkx0Tsdwm6he/p4I5ygFWXc5TIPh5yoT hfaH5iG/yH5nIfJzHziC8T5SIU/a1AopK+H5bQqrSJMM4rXo8Lijth/zII0dYEAM1cljC4e6HQpu NlFwK6Q0F+g1+zhjW98iSl6xUjlV9TjqEwZULkOlLwdYtxRbqugaImoRSj8avk/lZWR0olj3TAcT RJRDJFInl0tDFjTOa7U0rLSMtLcyIlWdogCSjRXd1hkD5dHA2p5Ix6i0KFwznn1pe717dPxYCtuC ihqURPmL9JZcRcnxn23hvL5dP6QZKA/pRIFDGfTTFoMaeGRGJSQfdtuiEwtiNZIJjOxeUGiKR0Sl 77PKa08XGAyLKIVnQyfMVndDtgdR3l2PyEaf6yiDmZMXT7h+rvMc1yRRVjlDvksnJFxl5EOk4yZ7 mwmUoRJY+OXkPJ7DxYtjpoLzy0JUuw5Uxf/6OgM22Oe+QHIW53GK87HIVK9F0/EGGQifiKo0Gdvq SXNOBxZvEIUXVJPfrYFwLPGcOzzXOkHImlxZ1vYICOQkhTNUN9HzFsNp4R97v8pe3sSx1REdtSrd Il3XJIXKVdxs0Z4/N+vlGtpKTt786spquo44fMF1cYDLOs77JI6qiPftmyC9BE5mrGzblz/ougkp J+6XASLPsLWBofrwavc+EzV/Bi7i40yJs72d/NxR+qxrcHapph8cMX3KQBkmft4FzdSZEIG8dW2F yWrQpAg0Jg4zyAX0yPPk4JnpplQyJt2sHQu2we8MYm1NeI6iuec++Qh9Wg9gTOH26hzqiIF6a5Sl r+jglvNs8NKMEnIk+u49us9z3OM0vHRtyQ5n3sIpiz5F+svZqKxZsp1xYAzaPbtuH33MHVBjAMA9 hfvN9WfIPkxNo5NoiyYlJq0SuTf1aB+sGKQqQ9Lu1EMO99DhttDXAKN3fXoHJ3VAGtbUA4gvgna3 lPC2HVDYcJ9jhHGY6fBiD2yChwkLRAGiPIcrIMVO7HNE+B7Pfwc5y5RQzpW6qe/Tri7KGUBuT9ER SdDoFkHQ2gCFrdSViJ5JIbxCX+XbtOtz36aQ40cZ+3z4yQcz+XP3tfMgfucZM03tiWgq922LvTuc KwM4u9S8c/Fmdx5E9iqB3xqf8dlnHu6+8ouf6I4yCVKljeagZmA2RXprBMDjkGjty51piZoEAzyC TfdcB2YfYOPz0zs6m2T2wN7kxYWPQxQ70+z9/da2+Znutjoujqj2K2asOPrVRta/VReiqkUbKkfe LSoAqS/Oj/OYresda4OM4mHH5TUbJr2MfbE7iI6evcmdknmds7GETrWg97EzD4DmP9I9D1XG96zC ZzdrMI3dERDw86w7G8QX2gVk09FTTzpFOXZXvWcrVusQeG3oQdGHRV+JYxwwoZ7XZwJfKtvbVsvv fOa4LxFlHclGmev9mmjhZtt9Z/bAYWr8PKCfi+n/mbmpok+1tcG+3H2zTPu1MgaxBiT24dYWBejx zGzRS3q8+8wnH+3+AGT5//Z//43ur/3i57q/+fd/lVHfB7DVa9GBywSEN6gZWLxBhxADwyMUZDMa /c77N7oLZGeVWf+cp4jWLlZfpBPSF5i+uIYP8Rv/9Kvdn/z5d6GhzHV/7+98oTuJrb/83uW0MjxA hkqu9abot22OpfXYwSVtHgGbAKvUo7aknrErU3RoZXhcOG1edEvWp+qsrO/KGVcekj0vP7ayqAl/ q8tMu0787ARqBh720NcP86dxEsu36TvQ+TP9UZG/7JdeuWAeVwX8G6a1rpkoIcZwsKII4pA1tCtV zuWNJJrkBi1WiS8qipIKlCYo9dd/45/e/41Oa/5Yk7Mc7iZ/udH4rc0RaNLTrt0+z2jGA9c+to8Y I2cK7H1Xu3dT9d5eCSRtJ5KYXokVCZdX4jqKmJfR7iNnfxGuaPbLQIJvYtFNJziWVIenEFQRNNvN qUQz/c7PaumLHIMoFocAVtGXB0plHE6jdx8Cei1Uf9fyoD1LFf23B83F2sn0lSrhBDkiQD3i31Zg //AWvcPXqRT6CVmiTnsgPXHeUNZDONY57OYR85gqs+IAZziMQqziUJBTjc2PnD0uuliwVoRbyoRI 1x15uaZnd2wXxvtwSKJgDagUUP4eoZD24KOnUyW8htN6lvGqTz98FD71ne59queVUY27su50vKQM PYQYR0fFx2iLktUNV+s9/nPErSZ9jEIwF0+eu/mzBZBx0019jYFFpyJSkVV52KZCRasyZEVuuENR 3NtCz/0MaRvDFHL6vFsY4FXu8zz9rZUPC5gyMICDWoWGFrQpt54dH6IUYSETOGW2gLLAApjXk7fL Xnh9neutMYIe3yYywzVMxXtW7RVtxXsMDtcSeZX3r5GyqEXE0HG39uIdIrqgn0WT6RpeVFzBCn7r +2bYIuclu/3ZLCTbdkcGeBXYpZerskD7LtODV2l5p6M96lpzRXXGsIWrFoC1bilj8HtVcl7L9Lfn x5Tv9opcO9uCGfCJuiJrmw74wdFhJLV7qeL1HnUoHc3tKPI77M0ubWaSuhZFSNpfp4mzhQ7bZvCO gwbWaJc5NFNorVNm5dSvc89DcLptIylNy64a0rVFuDNGnT6u/lx0VUMgvzAGlXuxZZ+BkHpEB0eu ph0w5M+u20LOZw9iJK+12gzK59Z5c3SytQYi4Xver0eLNpbXXT/28eTZo3He1y5djZ6xbaec/7tm M2YMhkRBKnDdo2jV4Okm1Ks1ZGaMzFucOfneGZJCn3ULh/kc2/E5Uj3OI8H+DJzsp5462Z0+c6Sb w5lcp9WenGxlSMcgtSIeUeswWHeDGgGXGDEdHH5mi8QMMsmaQEtShwiQeB75mbrGwkL/SJOI0xGb ZecHDRqvQSf4mvDXDUKkrKhfef2YreH4/GQBcDzHSEkHtCCYFIVXjsziSOkyqxAkWj2EXKVAjTtL YbPybqCo3ovwqnrQT0Fi5YdSeOrvWnFouKoWMyEDUl400A43CoptlkXdHn1brdh2Tfm1c9MP8JKX mSI4/lNmFwg4HKV9gUmhxxgCA3+NATFLuebbr3yYwPsoLeAOMHBqjr+n6EWtQ7vAeky+eal7/4U3 u1sE7mYxJriXTZyOdQLDRRzqN67e6C471ZT7foR++089S/u+x44CYNCtSCqFgS0tTN1bh2/Zfb54 5QTxyJ4jrtVFQTcbHSPj5iXhEKj4J+igmdmMb2y2sNzH+qPej6dTr6/8buDD6Ki8KUF6IdRSi8KT jd0tX0Mz3Oud9CFO9rhQ6fSC9rxjE7aQM/82Pa+s3iF49/6VT/XHsI4kcrHJ+VtCj0rZtGjxCfjn jzNR96lnz+UMrFk4yoVTNyXvXOeL548+9KZ7wNB14N6CfDZOeoA/1yUiVDKl3gvY6KM2/Cv/DiDR 2+sGGwroRMU2hDt+Y63dfR7jff+s92ctczPttVHcZVP809fJ7RrASsfJffhBrKN+inactXM/Nwg6 1GEG2Gfev9r9iz/6TtqVPveJp7qTZ+Cisxa3qH1ygqVyNAWVSTDxGkOxnMtx224iBOTW7NmC9gqO 9gFaZx6mENvuV7/3O9/ofvu3/jzDd37hix/rnnj0FAEr2UgzwuzpOHpxwkFOtrZMEMNa2KEs9R2C Q1W8P46dneAzHAGvTGRvOOMJSPR/Pd92GtJPs4Yna61D5oL4VbYuaDb/pdDZv/frrVw+9UaBgC3i 0dmIzJYjLURef+VPGd5iyMaX8XeVLR7eYuFFDHYxfDtB/HByHHSAkvLDU5znOfKhNSr28DOK1QFQ 2WQxFKr7vnqovf9Zi4zLTNfnl/yUYNT9WaRkRFYIpL8LdUMB8o/KNA9YinFfjj2I/pc0QP+n6CQl 9u0DdBRzX55Of8O/dSj9u6UWcuj7iC5RqO83kgJV5l6GUVo7VtdBSAgfV6Ngo/5olOqUsKnCZ4Ms qhCpcEJUBnDg/K3QB3Lg7joHmjHaRnkYDNMu6TEMvy/pT9Ob+YTUyVdbtSYsGWqR6vCiOIS/6xqZ JRCl4bNSxQ+yFN6QUVvptbY2deCN4OQum6tPIZQZDTmljiwWUZW3uwF/VLlMcaaLqPNeB9drBiHF 13DNh3FUqCKsSn4LlES7dGj5pU7WBhyrzRvXopAnmZw2YoGMLazImiRVvnI7gczA3alu1oEGaNSV F94mxb7dPU6ka8R85caNjDy3hdQYw1jsi+3AkFvyArnEKo5tDAQPOIUzkTPA97Y8vM11NjbtQIIj w+FbAVm0h/Xxo3DrkG1bsQ3SH1hHzTPifo9woDNABOOy5v1xHbuXpNMFnKpQEVgXEYupmflwx9/5 wVvd93/0dvf6u1doPXS0O02nhGnGo+roOFkrk6WUuJxbI+qSa7m3cVaIeFP9nBxXOTNmOpKCVDGA NN3dVbbgDTO0yJT4DZGs0HKQFbnKLSU6jRG1G4AG5zZOpannDD1ieqJj0DdAVvHeg1DeNVpCRvf7 cqZYyOCL1TB4Sm7ShfFei9toyltFpr5Yx5mWq38Fh+Ft+jIbxIvw7g7j1MEjHWeo0hQ9VKP7eb8V 6P7D3roagRSW8REOxTl04ECZAORiRSePIGwhPVPnw8fdQMEvX18N7WLiIeSc3/kMrp9I7Bbo8zgt 4A6ePABtYiZnaYjzplN0icDHTIuOpgNBbiFXF6B9ZPIoz2jv1+VpCp1AZ3RE7TfsGZYipFEeHsJ4 4OTPMMDD6bGr9jUfmUlLzWVQTM/PAtxEDZeOjCn2A9y3ccjInqhO0TR0oEyH3sEpmuZa8oh1Kp1U an/jYQLbQ0e5DpzYGA3PFcbIuoKcQdKhZkDk6ZeDJJVjsLt5A543e3cU1NqOJPbxnuLZzaJpPNeh Flw3+Lu42N3CSD6EjpgDXf/48w+B+A+DSt3sLr53lfOxnrZYGcjDxoyTidvDwS3nQEerN2yV5nf9 lVn7sSdIod1ZKAvRFRXgTZOFsCjJwCPgm8Gq36M+TU/783TvQUfLG76Lo6pplWufol/eI/d6eI0a AqhCKc7l3pT5FQqOV6+vUePCZ/A5Ou864ZG38LA1wMWzVnmJnqboWtOdALSnezh5Ti9EVBzbJwoO rU99akZR5SASuLGDA8vzOmFWJdBPyZR3bnYsfXhlFJr1lOMves8eS79ZddgO7/qAvulnnzjVPWBH INpX3kSmpa49xM+e//zT3QEKXDeXGPp0Ffk8hJOtQ8j0wPVbi91Xv/oX3WV+d+7okX10d9kiRgJz h2udpePDJz79KAHaoQ7yGPfBGlpPgG1ahd9qAaIjhAdSKMY9p0Uif3hOi9bTotXj7rqEulXzAEI0 c2qwllFgxOUMMljqIU5ic4xjhwxsWgAWyk+c6vYndqnkJ/8lWHO/dP7alFEdQDMSBI7uRUbZ8/02 NQWbOM3SsBxF7c3fTTvSlrXDppkks/vMHW5uheE5+jbHKbj7KDSFjzKB8Sgt4XTottApQt8znJFk RqVqpkUk9kwboK422+rD+azZ8QoG7trhyYFI6l4DTs9pe7xC2KuexEUpR71Nwu3XIL+KA5M/Dq2L f+JVQu7uV8tAt7yR6OQ4iCXL5UxVkNN/r8xJabzTQAHfaXFikHXW0MDQNR5oE4Yd/JSi/Jnd7jkG vDxNy7y33jjffeuP/7L77Oc/2n1I5nCJzKFUy4MEh8ex0dfIvFy8spTGDMZdl/l+l+LfB2gbeozC xS//9JPdGUatf/UPvtH9n/6v/6VFAd3/5u//YvckcryG7O4Q0LhuY55l1jhF+AJQMgqQyQFmRwTA 49/Ws1VLy8pqbGDnlReztgJdvi7UEGus+nqKFjAbPO8Xi2bJSl4zMM4Jzi5znPcCTzNcMJngAgfy gUG7yxfMAdffEigqPm/kz3a3A9jDgJ0KhyBEuHVBoZqQtz1qu13XF6EMalWbHec3qCMiExloh8ab r9tpAnLvXzl37Z+9r1YOeR9stTRQc8R7uWtP2FDduvH93oXtYyLu9yFsKZjKpf1U77WX3v4N9e9K e/e4t89Vv/cQWKipm7sfBFSoWGeB/9uPavlZ0on9qWpRfLipiSK9FxwJPs1Upoq3+NpVeGf6Qk5z TaUSfW3IvYopr/UywQIiGBltnFRSW3Mj7EaD2edfywc2sktA4nr5pbLxGrXxe6LbEbZScFFqMToY FmVHxzoQgjdQMpCClKALJTIuRv6tMRGRxVkYpDPAwB4pI+9LJATxshhwg9QOEBRpfQ6jQqrYiTpz 6BPkiJJSoTxIQYQTFqdQ/pt8HQN1eeT0oRSgvHeBgRz0JtW5Gx2yyIhIFkdE/rEdHBxhu2DHG5rk 71FRv4phHuFAmvqUB29HkV3X2AmCHMxNHIy0DlK6aoJKgQGsV/xbUDEPlKOit0HSt1AeCZj4t8ik CLvRqq+7wSCQl358HoWzyBCU8e6ZJ850Jx88FhR1hYEOCYpsA6estB61FRSWw136VN6owZbqsJCM PkiQZ5hjahZJrpyGm1set50WCkTEcB102v6fKhi7cKgejOYt0JlhHUV6LCpLC0WebwcDVb2B6zSk 1ZlynhHDynSl0/LHfyuTLbsTha5Bs+CNe9shOLkOauaY23T94Z7kMu85tQ7FkzZvvF7dExQTYbzD KMUYVT8XxTYBNWkap87UoJ9nxwbPisjlJKm6dLGwPSRrL/q6SlHnNp8ndcI0sHJoId4or5k9tYCc rdZ0QtbtAA7HHEihAZOFWKLj6genDc7jkLgk9rt1GuiYHUNYhi0K2ByupKM5y1h7CzctNO1uQ4+w IwX37vWd7jmiQU4YVJksKSyjOKzqX1HldWgq63l4W62JsFar01AfeNZkCUVA0fzyfEVkNYK3CRZS eHTUSAxU37aB+ANZf6lBCqoojalx25DhVehk7NCBaP7QRLfAJLQxAgOR103Ss7dAxm9yL5vRZ9U7 3rHpu8LTZhDsEMDPzbwVQCHlyuNfgEXkpKlTeZvRexjmOKxNWVc7VY2XOrB0sL+LI+X58ntlhB+q R3WUnZyX8fEWFDq+mem0FcTbG1/54CSm57IBCnIvnQ75UiY2KOJ0jX1OKY4V/Klg+ADRS/fFzhoN jdRZv2cXXEjPWkPT/Z1nVLWnfvbcyr80AydtQX2Ze69MbhS59jGBs99afO4l67yE4ymHWW61QQ5O 9ZqBhM/EOxwaczcc+bHuGEVfjz5zKmjqDoGfHV9oz9CN4owM4GAffuZs9/x/8onu+y+91H2APrxG UCF94xDUusNQacZw9o/TTu3k6YPdIQfE8Lv0wKf42vg53WpcR2RTGlPvMFaXKpekSbDqyP0Lf9x1 8bm1Ge5DPXvaeeYtKqX77Wv5B8ENNDDNn8h7mve37wdmwTwzLViLDuztXdONcV4qGPJ3ZijWCUAN SGcYMW67Qot4zQb4Yb7c/d8gfbxMPcNNOk7d4X4eYcz7aQadPMkaHqVDiDSV6FM1vDRQHauAQwZt 2sgq1Byk3WLAt9j9ut/+mfLc3rMXaZFFljEPWA54f1b2X5cX/9U/7Yz4uxyo+nf9KR8g14y9zQfc +30tT8maa9x8NTNNPZBtxULuxx2oI5z7sqjYWSWqkG3kdoUgSzP4/FPnyJ7VtEP7n6uH7CI0PUvn Jm0vsrNMUHKLdT9xlAnG0M6kqCxR7HgWWtnHKKA9Tsebb37z5e63QKw//OBy96VPP9k9/eQZOu+M dLcBTfRNzJwalHvmBXKlR6UwUdnT/iZj1h51/7kLhM5aJPbj4cOLRi414dhn2zaOQN2qbjdxmwP6 5RIBrUpeix1Rr6g/HubmWPcyHSfJG+n3xYVrW9TEfl84FMHe1zTgKnOgDipH05XvR0XXPdz34f7a B4jZ1osv4UpqLNq+ac7caN1wHsg0Tr+r7THq1+01vY7SIcw9NIPevzZGq15byX/voe51/5HdjPpV rhv+bd61/8MIbt6h4xxHKg+Tr4qq+9WK/1lCmLCklES78v59F6R7n2OawxaXvHGf/GdJh5PcdBrt XOf0zjtGtRobv3RkdbhG/aw2EtXlbOh0mpqLuHjvFm+4PEGl/bnfliNdCEBtSxXveRF/Wmmqch7L mc8y+Buum9WNEjMdVs5y1SxrIGqNmijwvlI0+dy2KBmvbcBAkaAUo3CU5Rg71EK6jP1c5SJKVWjp HKu80z4E9HyAN6VrHtzNPZ5VRHvedlZ8f5So9cTDD3RnzxzsXnnrUvfn33uve/fCje4qVX8rOLFj pm6R4mlQSvfM0as63KugqBtw5eZ5zQEQraTEub4jlqdweiz2Mt2fDhNGsLRRrDYG7qGHsVrrZRw9 xtzCGAd8iNwu08XEgrZDoJIWxC2CBr79xkWmU92Mo3CadlcnGDFrpwm59RnygLJWiWl5pW4Ehck6 Gkm3lTQNpkjpxPYHPvFZu6dsG4aLe7fPtYib3Lr0HuU9tp+L88szLdvvWMoDzxJEjf+2CQ6cOLdD ceMO0b/DWnKaRV90FkSpNZ4pFLIYrPi5mXhn8BVj1GSeG7WwUDR+uI3sXQQhdyJiPYJDbLi3cGer UMzn1pOPMXC5gxJ6+Ks4ySrza6zlbRyLTBvMeZUfyj2T1r1JpwYN3WFQ3d156hdAqOW67qFc5x3u ooFg39dpRXfzChXtyJAIrtSPPfoF3wI5tGtFaGk6/PIGpezwzFK63FPTyQ79Sas/15JnT9/WFJwN gfzSQm2PvYcvbZGi/bjvwoEWWRtkPcyW68QZBHgmV9hk6QwDTqVHzuR5jwfRrz7IW3LMdU7Tjq36 QHtPZV2cfLiR3s3TIEbqUQuFHLMeFCcORenMnFuW0+5D4R1z66vpMgEVAaTJtnsaUzNqQYwtluPA OBgiw3rItikntkF0oqEDJHoKTu9UB80JL9ZtEy0qjegAJktN71DUF96huiBBf0mL34sy7Rf+lira d8AzpEyakHUroK/KY4qPSrmVc5cgeTwO+CZBlenhIUe2w5V1OI2yNYsDm0JGvdv7tHluE1nLmYsD Uso84UodnfoM70s9ZKCSYIEzoYPu+cw5bbzNOI08a5yd5lSrc6UZJijOU6Pu+GpUQifLHSXQUb51 UA6ZGTCYkrqEbppg3OwxpibaCncDOdXQpsiXe1ihbd+QkzWPHuzmHz/Tfe5zz5LdA8lH9qbouPQw fcwN1sxa2Wrv4Ml5+Px0ycFxH0V/6qVIixoi6+XY8GHbeeooAzbEgZTm5nrwunSlksaUFLoOaNOJ DYSJfsg6lI3O2ibwKhsRddWcdbtO1T6Uo1l+ZRmo7FAckTImCUaUCWUnFJDSOwGTlAG/Ir/2u8fZ s05McTOgtPhULjg/WCaQuKUe2WXiqb3CudYhAJsnGDd/5jHGbp8+luyjWaIEAa6/eimARMsSJ7Ao EGkAWYpc5Gl9hsCe0cm9TSzPpF6hb1T/zovL7ub5K2D/9/0pp7h/f33YPTpqAXn7Eu2Ziv33snUP pZHrnGVNXcOAVd5m7+TXZ0g/zfq29Q4I58Zwn7YONdv2NEOG3r9xKwWegg6HGCTj9FFrVtRB6+gY /32LczfjjIsGRs2QTT0DlfPIoanurTc/6H7/979GO8iXw2//hS98ujtu1yMAGLNzdk+aItuplAX9 T59qAA2zmVKPUKR9IBcKooli7sWgyEyQz5vaKPWVBag+g6h8OhwJMFntrqwV3dYMVTGty2eKDxs7 f29b+vaGBa7WTmWaow75flAUCS+b3AKe2IkGUNVmlP8wvG1HhQiCks2mqDOa09dX8/ZReAasuGlu UFN8OUDyj+qa9YHtIEU5tmhMIesjhIC6CetKJHPwpAkoRnmI3rnuD18d29xXnrooG/cEvkQsRZT+ z4MYka4jv78ueW8TR5Vl0ArfEGtRV+z7rjYnSx6fRQ1VLVqP1/anLboHvBzl/gDoNGxbbCLyFrpD Cb4YELUV1dEia1Db7WresRghMUsdBpGWHtUsxLLW1UyDPU69bYXQC+X2VQZxwOtwGcnmT4SnoQD9 o2bh6qQHdfbfdsewwh9nSo5WulrYdN92R9nGWu1aQtcpKqPOOO/VEUhfZIMLi5estJ+ZxdhTOcwh 3MYxmkBWBiD6Z1yxEwUjnFoy+MM+nn3rUIzMUu8muNYoKd7hE8e6IwsHuhNPPdY9C3f40cde7X4I ZeQvvvMqU8du0ImjpqAdhN91i7u5xjRD03np2uCe+MXaSduwawuv5tq4K9y/juM2jpFIpqhfpYfq YEnRsQ+sGIxo96YTJrX4/o/DPeq68e/LpMzeYbT0ErSAGSgD9vo8BdI+wQQwnRYd3l6i+wljKQwM wsAe669EXkvheV+R3j4C7tdcGdSYYxhE6Fz3nV1oAyglW8OFbyYfnWBgHEdMLm/atDkcBEM+as9g ELJMNTMQ44M0TCqf1Bz4PKCX0Q36ZtyYxkwx8vcGFekp2xwndYFOmv7dAdZ+jz29jqNzO9PNvH2c brn4KkB75RNV3hsco1Da/xgFFEVa0z2VnSD7XFPUVw7fSAJEnkODz+/lRcr521BpxigYjMmDrgmR uVepAJ5B23J5vzHeu90i97d7GyWOYp9EDlPvz+G5Db3De0tbNn4nx9vruN8rBFKroDSeVOlGcg79 3VFGU4+NO9SGdnN2HMFpz/AJ7tcUsbKQDgHuXwJX99XWcXUety3QaRQ713nNfuJ8vmdZJ03nfDjF wVCVcKgtlPMZt50IuQYX2g4myqn0NNeb51Se7Q++ybqpY26Akt4mnWtafwYH4yrFj+9QbOSkuocY SDSeATQ6MFoAjRtt3nCsPfATrL/cb1zs4kgrM41OEepeCmXLVoxO4MBx36bUozfcMn7X6/PoOfdK hB3doirbn31gDIEshhpiVkjj6AkIZ6rp3LTYqIzHCnQmMxa2V5w5fZy9vp1JhClaEnlUHrjWXahT lVX1/GcXyi5EZAJDFFCkrGcqpRnB9n1GRdfeeRRr6FRpzJ8cBlK2RfS8QJjsRNn0fSPIb9A71l0c I8C5Do1Lwy8dZ4ZMjRkbnW3T29MUYVr0a2ecETKAk1BGBmwj55RQUOoOSsgI6PSzf+0TnOnh7uUf vpd7P0yR5JhDO9jXWRyhafaa6Ki6gzTd3wM+7qXFp+7JmA62NQS529Jvgxauu0hBA3keg0SVks61 ayxVSDtTWxPnJsOqsm/lB5R5afalgUu1gvVn31FxvV22XKv+S02Kzp+6R9TdHtUW4Do/wqwNr7Hg UnBB27JGIa8cXJFVP9cC/SWyWTdo0zaK4/fko0e7c3TCeBCO9QKDTKy10GG3n3GPVAeFjzNmoK1u UoYEr4oSF+Q6Dk6zgxEEndzyU6pTUwlL+TxR4tEF+jW1IAqS9m5/GX7im8jkX3Wyc4l7trsOlp9d b913wHPZsimRcX0N+eeNEiWSW0pCHcE6Rk+aNa9gxTVLMNHu8eTpAzi+0K0EOeA5zx2b7s6/ezFF 5WvsySp7IU/9plQRn6eBA0cOHqRD1nx3icLav/iLH3Tf/N6PU5fx5S9+ovvZL30EXX6XIlNotS3Y niKQVC4FcartIvpI2lmj2Rj4ZLk8X3k2fo9/ZA/4AgVrj6wVSHmg2TfGlsufl+4qxSN1c+qrPljP OpXcpVNVG3SWjYnP1++bL/Lf2sSGXEeEFVa/af5VOxvZlBx8lVtt0rDjbgVpBJGqN3IhCr49hXh2 T2Aann+nGXesbSFs3osGY4gIvVAmo6N6X6Kq/oDtY5w/KVjNv64f8toh+5ookDxQKehoxzh2GTcZ gjvfZ+BEqbty0Ero69X3nrEu3DvqbTH2b8HD0Rzs9rP++OfZ95WBm1jhTZ6wBQtBffPve88U8dSo w8u2u4WH38ly4DEUVTh8xa4hdMowsjJYdi/4fkeKhg4ACtUm7BVAmKLVwZX/puKr53I4yJ7jq11/ nVW/MaUlcoXgZedM9bQDl/Mc57yZBy+dvEotVlJgIgI6SvKgcB4sBPFepW0Myn8TTe7frmzEOfMC FQDcpUhxxAJIWwNiSKRoqLQnaTzfj/Beh6M1ipzNOkhF7j6OXugw2xYQFIeKKSTd3o319DG24GsU PurgARz1A3vdFNXFUzS7f+DhU90XvvzJ7iO/8xfd7331e91L712BKrLTHaebwhD3cp5xqxYJHSNt KE9WQV0W7ePAkZHKYQqT0nZmKbbUMLTD60pLzdj3DuQlgr4iezdARO0lrZNyEFR6noW9SGeH77zy XvfWW5e7R0k7fuxjdFuAZ+YIXRHTraWGDOkA6YXqxKZzgU60aXNRmUIT46gk5XovsPTeYpvcv+aQ K4pjC6w1z4daTEp/DbR47hDUj0kKSJgaOAUFRF71GoHKMo7HIMroro6ebSCtqZBLbmulTbtC6DBX Cjty4n1o2OyQYTrbvsfcs1MYdVqrH3FNQtsUIWXfpDHcRi6vUFC3LMIR1EGDxVdaKuGwpiVbhJZC LJxGhC/DbzTuvM5MAjg0KMkcvZEtsmL9oDFYnT+EvE9IEToCGifKDA1okdSiinu6dXmRF72p48nz zPL8E6CEVrbbc3v+GMHZmRMQwRl5jGMmD9xlXgERl15iDcmZ0/R4xnnbAtFf5TrXKcqZNGXP85qp kEJ0kqI/09GOnjaYGbKzC070uB00eF5TqCpziwzH0payih7vstbby1XhPzpFAMS9LhMQ6STYUWRk qoYArW3Du2UTROpv4oSdeewUvZ5nurXrDregkA8nPv1+caJGXGPpIrZLMYDg5xaSykVds00j6ye9 wNZ6HtWXvvtO940X3uheePP9jME+y/OOyhFkwx3mNAbHcRLHeljKGQbB1pE0iMaxcFJjgRBxwNQZ 0cdN12szEqR5DwZkjqIu5Do6UkRabaYhS1as1E+a6zUdnracjfIRf4UPsWg0Cirn02BJ3KFaHF6n g9ACjupxubD25GdtpF3EySMy9PNiJ/wvTktz4PzwOE5FQ0rM07KDARD2s7f10U3lRVYM7PLv2FXP ZU1q9FqhVsU+Sp9IbJL3G5RrN500R0icjMgJKAlO5TxMIamUNfXBDeTLQTXjBMH6s8pW2vhxkV0H cbkejsdbp06C51z45NPd00xZ3OB5l+kQMz5vhhC5YajCbeR3jMBNytoAAW2C1YA3FYCltZ/Oayvg S29fMocJ6N0rg5K2RtIU64F76lYDv+JDNOdTSloQ5nIoiibY/A8dtixGXfM+/7p8hOxNOY/Z6gBM 1ZWq70xlHZO8a7M/5YQZZEHp44zaV96OSurErVX0BediGa69evocbfaOQwN5DqrNMc7tGEVzgl3l oNs+sShZlhwHGAtX14x2/7zt3z4VZySviRzxnAGyIjDlBQRUqmxw32qwOob0MlPnrJT5f+BPZEbH OBBogVjtm32gzH97H73fk10rx7kQ/uZca2cyaVYAq4QxTCj2X6c7/cF5jcGwg4xW0TfTUOMs7t/U 8eVvaaOr1F74nJMAB2vQ4S4y2hzafrqwLPOeRduZok8nOQN+1iT0PcX0vXcvd++8/WE3SVb5uUce 7H6KVpDmV1dAw0WX55Bz6XfaIofx2DxAG8PuxCZrcwRe0rVFUMymu/p8sY88P7pSTFcbFB8Cf+tu C8aD9SoQ2jqLHQX9ImpxWGpJ/c9+2BYrG1Q1jZG/4mDH+Sy5jf/Y2+R2sHOpdr1cN5F/u46/K0M6 rNFMkdhm9WZ2EEqNEOWXRqqkMsvTLwekkOvmaHpYbV+XXJoIgU/2kwJUCqk56/WxkZy6v3sPXNJU TmVgdR8pz1TeRV4q982m/AmP+yixXYN/58cKeFuSWp7+TznI/WfEWfQHXieGotDn9mRRSBFMEfXc kt/XLedlecz9E8Ba1jpZResEKJuqbyFwKkk7OmxysIdQXLZQs4+zTpSCaKFMCgzNIIyIbff3iRxi UTTJpgCtOrfFWIYvmAb2v5DzW6oy/D8FsNYmRTrpGFIFKBV9uT5lFONYR+kpB4WuyPe1uCNIu851 9tresiWopSw8pXYbUfmXwt6lkNIiTjkv0ig2l+h6YYW/6CgvkrMsX3V3lC+nCtpHUiUXxWvhl8WP GiaQQaaQrcJbHsAREtW8SzGkaAmeQg0kmZ3v5kGsfubnPxmZvPbP/7x75fr7OFEMBUABWGQiJ90C A5/XPZDjaHprCpTb1dhBxjf4uUV/4bmrnJpsxsi47/IN+dZ+qSKvNrbXCZTTvCFnkjOzRGcF+6ce g9/40KMPdCcepDIfB0j+s+3VMiY5xTAqAjt4VFAaedOAITPKnKhPjVvWYWpnzVXuU8/tzERGNYzK jaNaUYKO+Q5HzUp3h53YVYHXSImR079mP2U6bpjuk1Jg6lc+bqYbO9Ka5zQbkl7gbepbgubsqwVE doIovqoIkcwZU8ymF5UEU9umo6/eWEmv022zBqSq01XDPeg53q1Rsgo1LdhYZ0e9y3mXSzskp1oF xQLZs1cndRnFn74cyMsEBlMq9jSodbUIw4nlfQ6ASd2CZhJa1RTInSlxXyw6I9Kucz8JSjLj8BeD R51SFLfdJz0nxh3T/N7WfvY51SGWkz2H4zwF3aSGYpXBmyRQIdGSTIfpaX9nRbzoVqaz8r5xZHfw QGXC7PbiWdIp9TNt15cJcjgHIsazcGWT1tT55LxMOk2T137AwKBH4dym2JL7Wk/Bj/pB6lYZU+VG V9LXi1oHkTOQi6O12R0+Npf+1Q7H+D6jz99450JauDmcZkKKE4VuGjD1vL7sEPIJfsz1SgdE7xZY GKciukI92BfSB1DxCFf/2VT1G5iJXkdOw3YspyNrqCOindDo9U4cr1CHARun64Zjq3291II4BGVz XG8H8kTHmTWBOrHLfrqGhXzTFYaUMt5BtepSF6nferpkbwhiR9SnJeN+Vm8nerVepiGueRli9W0O rmuhsS7dF39J51qnTTnSmEd/+9q2Bu13pFrSx36Sr7uzFl0zsZHzZL3INfpTT8852dXe7cl9p9ev KKMZC4GKEeTO4Vnak7GFk93k6QcYCoO+Qc4nkKEh1uYA+mAG+R+37gQHRh2Y822tjM4/NkCqiLor HF30dtyzBPEVGGSInPevo530g8CK69j6Azf74QoY17W0wL6Vvc/aFshahrYytf0elIkq8EyHsumX CFFzELPvzUnUqbYAz7aK0tBMEOmjuCFVO7PVXXMADGdvgrN0Bmf66HNPdIdOHGYq4HwC3XRZErUN z7j2ZyTp+yrjrqLX5jTnyuWzFKtH+WrWPouksEcpJzjwhUlSNb2e60V2mq8QJ7z/x7+zVPm03je5 35GOL16QePu9y8UPc/a1BcUkEGz0ZT1I4jqqwyyAToiWALKAGotmo8Q922Y9LdRHfznYSpDALVkj QIkO5B8XL15Jy9olQBrX1zzsdTLIFjiqk9xUaWx2OpJiJsAldVd63bGFeSghx7oZPmeR3uvm2KbQ qYIrLo6AgSBMwB4RZPSOtiBcf8+lgKl6oOneADs8aApffbLopaK6ZJd0pM3gxkF1j5qjk63S4alN rOLm3ui3v+MQu0sVFNWfdp375PbeXjSHO+Bme20c5f4LUtWS0+38IPeXD7Xf7zpIWKbOecN4dpVq aEa/F/48YH24xS9FYLsnBCUPvYhqOCKN/KQWonCQXm4imVmwuogoQFN1njcPv1y/Jmt7OrKhgDSh 9ebL4y6ENRBccZXu/SlV2X9iv2G1/EYytR9ZqSiCun76BOdFJZyNAJMrR0Z5owiEqWf/qbCugR7Z d9RBEWlbxgttd2SRgJzI4XWcNA6GHLFx0XolGiWxrWAFLXA5qsjpTj1QDY9RAD3lRvjGZzFKfIdS F9HzBpPy1wGXsxcrxfd48TorwceJsHsKiymw6iVbk63CsbJCO9bHFK/p+Iaq92nSRk9xpxT0FDVp yAgMpF04dnaNgzhM8UOHg21qXu6n/aLvAB3v8PfwHlFpOg5wy2RFXEgdtyEcm1sg0bdJXy88eARk f45uAhxg2gD12ZK928vd4PxCt3CS4hQq6+1zffXaZVJYy3E+NnEqh3DEd3HC/GxbPRl36J8bb2wx zn2DD9ZB2uY1WzzfiGvjZvo/76m1L3MjVggUBnDKjzCCWqrC5Q+vdZfPXw+vewgE9DmGEEzDNTt2 lO4U0DFcQx16FYQdOhJwsfehU0RJtKBQaTcect+S2rdAqnqcF8mvvtzJSKjngEV3aI2V1ZkMKQeO +58Ctdb4ynGWerNO0ecWik5UdYrPHoPb5qjXQd5j+y6RHxWhQU94uHGI3MfWljIGrCafKY8quUzp MzDEoTML4zpZeGih6CrXeefS9RQ07urI4jjYI93jPBa+tcVqGrfimW9SNaNJE2lVjocoQjBgST0B imQIesIEWYwxNw4H4PbirSAsOlJb61BJeK9yrtOsqNrSLl12dC4dYMIZNKU5bYsnOPhWny9eu9Gd p6+qvOtj3MOchYz0aLV/uJ1mLPbcpHuKSL/GfI70+wHS9Cryo+xLpgvqUAyDQvK5dqYRzdGR1bG2 N7YPp4M0gpPv2hi0krvgvazTnO3BDIAcNkNnkw31SvHkq/2bcrDXPYicXWXC3otOaIRTfgLUXa7/ JsbM4GjKIMpx1wY6GtkUFdr7u6gXs6S97aevoQ0CT9Dz/oVrtEhconr/YMYdH6A4073dpovCpAPE uHUn0e6BADkwyWvTIITgv/ijcSI9F/xM0Sx+oerGzxR9KnTIDNyegZIrFUelKD+xEanR0VAKBhSg kKJH/o7cB3mzE1OzASJ42h2dKFO7vNfshD25Zymgus3EyiWChQ0HFvEZk8ibFIIN9mTKNopm25pj Vwqd/wWxVY9W1rGnjZnViVpLNkn4oNke7ia8c7fW9lopmvAslhwnyySXJCGOjo6BdFGp+nMryh9c ONkeet4TpNsxx+4oQ9ixNTJNH9K9ZYpOLjdIpy8cnApSa2Hp+ACBmF0c2CDP/SpnTIfmCKjcBJ1C 7KW7MbqM3JsaJ6vGMBRbSKp7tqmrGEHvx55oO0T+eS57txtEal8Tq5g1CBKfk1epcvc2YFJxVw0K 3bPYzFB3pBTw1GHJiRxW4FSGq/kougQxy/fSpPEX2p+svTYzDlOhrulC46AQHeHWlci2cTrVtojV 4TOjmTIg701KDQOORFHlUI8TuJ6jQ9OZx850R59/FJTfYnezd8v791atb4uXnzaAkYXcdcC0+F/e pn6OPkTAK5+9ni0+igFW/tH8j14WauXyur5YroKt/qGbX7G/Cn5zz0u5tzrNBchHlF+UpgQtwo8z qQ7eD0pEcBvwohOtc+1UWzO26qDMVag6jLRStOaMa91BL2r2/FJXUJIDn9qhMWZb7nYXOGM/+NFb 3TNeT50AwJE2kugn618sJo0t4fBsY9fdK6cJjybIhJ5IoHMMmVzAF5CgJJ1xSqone2DmYYN9E5Cd Yn1tezlqIGjHLNfbU6WsuaL8PD6mjjZ/6WeYcbG+RZgmbQfT9cz0foU1Uu6Kpld6qDYvC1B7lGgp UVopthKB5gBEGbSfFUiYxfsr/mT+GR2jn8VXbta/y3YPy/ey8Gl8iKgPo5GIR0TG1IECWH3Bc4HI yD35uXdDEbxegu69qL+lurF7f3oU6Cd+WC5ue2lzLJqDEcTOr/20yn3Sun+RUqD9Z+3fTVuT+pVC Vc5KwyT6T91f236d+lfsR44tXZQX6nRH6EtdZFJYWwHRMtth2ftVhGo3zrk8aTabg5yRx+nWoADg PEul2DVFIqpTh6+uZYqqHPpy/GyL5T9UiL6nPjuN+fc3uR5fh0Wnq9JeKkRvstCJ0hx54/7++fso M9tnNcQpBY45xKKqeoEcooxujCZpvp8oV11X42hB1jZa1zSt6W/y+5GldRydXVJ4k0TGGysUkd0B CeYaBiU+abh1pvS5+RW6bixDL5h5YC5ohbSUFJ7yxyLIXfs1c1tDHDwHU6iID8/M4TBgUHkkMwam va5RwGZG5hBOlMVDOj8ZtsFzmYqKrHvPQcZKtgKk64gnmtZ5ZV8cCCESzWPrrI0Adw6MUa1OpH+Y a08vUCxJn+GMFTc9qAMictYHIe36QYQ0ubaza1znPSOm5KMtKqpApxa2nfP9QLSc7HDp2CMnFo5B pxmf0VkbYVoWHNum8Idsg7hWxkrKgehQeohivIeRFTun6HymJRpBoOnspIl1ZHQMdNjk6wUtdMqZ 1ZzKehUlZ1y9+8K92qnA9mrK5qo0KDuYOO1NGBTFusLrRIe2m6yq+CK3ecQqVKKFcIxHkGjuT4Vs wYoI9R7BgA6fqfFB6QZkfmIsdGDToQMljTysougjEyKfOLVOevTaB2m1KIK9CJXALhkiNBqkDUdi s46mOEvxQjdg+E2N/bZ9GihjxoCTysRo6Kw6gvwa6IvFgjOivgbOItDIxhh7m84oZAR0zF3jtF9L r9Zqn6l5SdCL02Rx7SRoYzH8pbUW+mrniFPnjnRvvXex+/733+xefWWuO4pxOggdaoc2nktXF8Os 2bP3tPulo6Hu0SkMTxEnk3U5QNBg9f0iVKbr1ATYNefMsYPdQeTVYUc6a54VxS3JxuxJM84aG6NQ LJcVBzWdtmxSS97tO9dRI14oiCNfBuI9FztebMmTezYIv1tqiE5Zjkb9ujnvzQAiR+mWo05QZyr/ cSI8V9ax2BccAGhvPGjvpdcuVKchbmHU8d28rwpwRffbIWraNPzUlqIacHy8zx+k0UK2htyWWS5N Xso1Tq7ofRiLrrW/zjMWDaAczmb98GBtDFAc7EpJZ4yzxXLItkM9DKOtQdkEwBLB004s8m+DSxHD w8dmcRTpfoFc35nhrPMzwVV1y5ZUCBDaNUaojx85yt4V93gLPSgtRs62UL2c9C2HB5G1mGXKnkVg 6pignsqMvat01pzzJAVTdr3OquovxtmvAmo8YwliY/bqzKpf1S/DTqjLmkUSyp7c9ydIcECfZsOa g9L7EarE5EG5QGhCVdxTPk5eq0waW5UjGQpPHH6DMc4sDvXV64uc3e3uIIHoA6eOdA9CpVqAeiPH 3WzxDuCLsilVKx2bzKQh2wYTcZoLIYt+S6JQ+6ou6W0t9rkv3sxTCjbEjLYIMz5Lb1PvrYJBWk8P qufJAkbX7L/qJ5as7sOHTyAbkM3X+pZ6YWSv+R09F7sHaBPMlSnZF8rMl+D5DEq1zf7JoCDlMrLv 67EJdtxCb61BE9zl9xucIfnOV+j+cQNbMw/3fxubcBcu+wp2RNqavP392gntaAJbwAlec4vC9nWC 3geQxxPQJM32OSNAgFR7ZBeoFBd7q+hEAyf3xKLx9NU1UBC4yzNXoX05ySWDkXeBCuyD9zksEt0C xGTqeZ1tiV1PQ/2sy35GKQe/FF8Cd4VPBdfOfb/QQaR7XdDORO1C28PamtrOfl+zye2LR1mxSwUf 4lx0uarDtp8C3RubR2HJg9NYpdJSJ6RoCZnSxwdLI8nEmyxE0RVSJV7/Kkc298f36VGo0mucVhdL AVKS25/A+e54BP7ejUbJ9op4fw3qmxzCfE4dYt+uS1lb056zefnNL0wU2PfFVrEGE1eZZLHK+GcZ VUA6BINsOoIew6bD6kAH14zfy1vc3bYnrgMlimhvJH2DdN+ufTNZow3REIQBsxqe3KA8ar62nf6k E8f9263gjoKPoyZ/c4qb0BAO2RRdp1xkGUUxesd7qeJPOaIqblFwR/1qtIOC4bQ7fjq8r8Z5c3Fk NSUKFjECddViVis2UQ6dZ40OK2dqlrdqzLY3GVqhI+UYYBRWDSax60Rx8BVsOeAGYbYAW4UXaMXv +PRRYEt6ECNL604OBFlcgUM7xsG7s+U475qu5zQ5B8EoUxMoyG1bkKn00pOaojwO3hCO8oApLuTC ynajzT3Q2Sme56//7PPd3/qbTHw6cwrDS5cQjNL7b7/XvfDn3+jefedDRpHTi5M9XmDS1LKDBEBs p3CMF0ZnMSkcPNkprAEQdndIVIlNdm9cHx2miRmm/aFQNthPK/JncNQdHDKJ4cqB59q7OJY2VrWo zSbPd522yXhWUU0DghRvmj52amXS4cq52+ho3uqnbSBrWzudIl8jL3fHwlVkTj6uiJPt1PAvkSEd RDjk0hv43RQdARZxMIdRTBaimUbOjAsey/c6QEZOW/qjIx+rcnL5OiAaa/Dc0EGDjxTOsv+eRYt+ bOyvjHjDK/abjdFgj9iLOdF7vt68utl9wD7DQcDZk2+OA8SZ2TPQQal6nkQmphjao2HyhO7inJoC lN7iCbxDOn8iI8xwfOkEMzHAFLz0NeeB0Uu6TsMoae9vU+Xpvcrd5x537EUORWCKe5kckfuPs8u1 l0CkVeLy4WYZyPIYqJ4yLWXiOk6KcizCHCoFZ9i1ltta02n3aCuIIwPypUabxGFxqp4cUBEy92uE ZxwGlZYLHM6t+oL7tM/zNd6lsbDrgkjlFjUG29zP6I4T/eBpc5ZGCdZuwa3WQRwbpSiQ1zlC+KPP P9y9S+3A13/0Jt1FBsiOPNydOEhnGtbMrFCGCBnT2F9aubPFG6+zmt+OROox+8UqgwZ/swNQXpBd ZQ01EerSKOOLDWR0nuRXpnBZ2eRZRIaGh2rKYnrnN0qGnSQsZiubYzDIxdAvDjtKsa4G0/hbm6U9 icErx2DIXtHpyGAWUg+7kKc4Nuy5fwchRsA9j8pZ0afKoKpvnRQ7LP2Qz/jww5v0Fl/vTkEBOEj3 GAMzp+Pehd6j05m6CfdFNNLbzPcizmVjlO/wNJthTNvTBBgafQu0NTjo4hZUWCTNnKIy+EHA6ww7 WltZLPTXYUgFbkRHq0+1oSyYz66saUPsMKReCOrLaye47yX6mJ+nQPvhpx6o5+V1UpNcRvXj2i0Q el49ncAJ2hFy7t8WlI2x/9ME0gbW7p0yL2VMpHAUnZRBQ3Fe1f0FVO0SNGuLXUsd/qC4rV1Zc3Ur xS8tME5vnVv33uDMfS98psKRdMNwbbJf/TfNvMcxCi7eQJmy+dqY3WTJKnPmw9611kJnS5TS+/Me MugOnQG1JvLCJ6rLr3CGb6J3FqB+PMqkxdMPH6feBB3Eq9bNlOJfDGMHB+3cQDbMjhTVcs8rFFky A/TcLmXZqydQjcBkb/rWteXM+pw9Wt0/aGWOyoHz7vz02r8gNT2g3/yK0OJcP0GMZEyriNmXJ7BR 92dGhlNhi/JZCKs3qb1xFSugid/SmAQCIqG9eD1eX4OOHG6F7ml9rHNstSlpNQoVVaha/cQvHLS2 DOgwRsDnE9o/5jrO9RI6+CQdVpx0+8M3L3SXyYSpQ6VVWQanTyH10L7/0gUdZPXqm+8mg/s89VGP U58k4LAGhVIfQ2qJay+veswJtth/Qb0Rh0vJg+YsVVvB8h2zBuqPBKk1MGqA4DNAlSCQ9rdFt8mi iXY3FKCnI1e6SsUUQS2fKH4nPwjNp/9yI3xRQx2SQeafoSC5ePVX0wL3vvW7BAD+ShtWlxheNI3N Au9gqG6x4bf8PBv+w1scVUGLrOI8ycdT51hMY8rYgzwsR9T9NSVmtIGAiiDJ0Q1fukWu4QaH8O2z VRrJGwii2nMxXfKQ0n1RCWetr05iCWM93L0FCHWjd6L7w8FChaq371z7mhLMWqBStlnXSIjXCzOp lFoGsWgoK+1UxBa7B9h9gi9jBAp/BhBMP95R57uMLV66vZQhBiMcZHv9XoIKcWeIVD0pzEWuNYni sMfzHu2qaMEcw2gQMs2ADdW5qyNlZIyqPzmQG9tOnpOrTfESr3H93Ydh1m4IR0DCvxMHdXC3ofZo nuwTmXvnvrPaKqgcHpEGHH84TSJLeSKL3FioDZyfEYRnTEdPnp2IJW+1iGBzANnA2Vcwt6Ww4OiL 9uziCN2lkb8UAwtDdkjNWWC1w1SZpcWloMGT0CTwdnEsVRK0zKPoZgAjokOrIQxVgPtexWiYSh9m tPHpkye7BRyEpIroZjAG2rbrOoI6juAM6qgM2pnAbiPs9ynW5W///DPd7JMPkbunYK1zmIYtyla6 pa880331X/xR9w//1Z91ly9f7w7gOK8jt7dAQXco3jqo1UR+13D6NzHoWyt3uofGqc7HCd22iIg+ qXeAoU2tGelPSBEwKAu3A6UtOobilgc6mKEejjmnHdYGwQXjYScZ6apoifKmp7IUH9FjKCQavEy9 Yz1Nt+kMSONQDiYobjPVplOwQ4GSiniMkd0ZQ42TqT4UxZEHvcRnD1sTsAWnbf0u/UYpCkQ5Ts1x FjFaghXD7MuqRU8oM6ksHstR5ENqx3Y8a9Bo9lwu+RYBTI0Sr4aXI6yBfao3aWGoXN1GzkXinJIp 2jrOXmzw+X/63oXuRYo3p2YO5L42kTE7shgQOGY8RorrTc6ax4OrDsKxRkvAyKmV/1xrgzWfYTjP 3jZp7g3ud5K0NQ6HLei2ub8N7svrjLF+dvRYvg6KwnpMQ/sYGxzrljcdv0unBFBedeEKh+wi46Qt bjr7yEk6mixUuz06g+wS/B3C2ZyGn5ppiXytQicQ1bL3qkG/kwmDPGvXOJcfvHsh/bWnDFZum1HB 0XPiJVmDuzzLHak67JsTylZwgJfgSx87cag7wpQ99213RDSdMxyEFz2DEzE+x77TwcRhLwbsDj6Z Rc4+/YknQmv5L/6rP+h+66vf7S58uNj9jV/5XDdD+78lgtNNAgmDDdHTIQwoXny3rtjjhBgA3yQg nh2d7E7DOZ3ZniSY2uxuEPD7xyls8+h20R+neNoeUL27hR5I0SAybyCmAk4RrmBIozHoOAyyRiJJ 9pgKj1P7EEe00ut2OVKfWl+QzjoaAlO2pHsHaXfpO4foby63epDjmkmGZszUpei0XbJaTjKN+nIE seBHNgG9R8C4J7UIJ2CVVP+1CzeTmZo8eZCYjLoPHEqDKCeWquJTFNjaTGpaMjI7HkZ8pxryIiXK 7JJf3ofIvS9Jn2+CnvS55n0GH5y33vHViCSlrisOtW1PzjifUc2ztFXWbPDMHiTRN54/njL3M4Xe GkVmRacnKCZ1Eu1Lb6/RtuwNgii6iOB0HCJTMmLwiRw6EMShTw48maHANdMRHdaDHKyiO+fPznTz R+agQGxGVu2ytEDXIp1S6Vw1DEbHzEVVf3B/rVYqQa6Akal1nU6DJu+X19mZJxQVzn+yoO1MF5Ld 28sQu8pB2Xf6ygX2v6oRMmiVXlLTSgswtODOQvoqMrToUxrjDs+gTbDrif7Bpp1N2C9PvxQZi4Y3 KPxdpMeyuucYDtzDtCc89cwjnKeZvH6bSbp6EtZkZLJoALKGfBt8NPTMQXlOi1W37SP2iRyb0+o2 SnXqM+a6CnGAyy/pXYzmtVXAFd/KN5b73vdztxOSdk1dnwFvyRDxcgf8aEtsCavTK31OPezZBpDI NFjBrIwxVy5NobTR9AYjFihynRpMRfbQOgR9LKLool4ArFjjFXqLOsPZBO6v1CGDRKhpHHy7f1i0 HaCfNUg3EDrUvHX+At2U6DoEgPStF99KnZFBqTxsh7no/G7QwMB80+GjFOtiY65fvxbw7+Rhumbp j2krtOttPzWhU9bQEGRKXRrm/gLkKqesR4bt6DN6z+on18fhPrxROeWNAYCKOlwZLucDJEGjbuIz R+x5/BPOcI+w8hnWFnkz8QEqKMxe9mBwFEBzrOO45xDXz/K7dq3+jd6HY7mrG4BaMDqegkaQJWNt 3qgwynq8SQp/ESM0rhPJQ42JWOpomypsBUgWKzk5yWKjIErx2u/d5/0PFve2j/x8mfcdX9lD3px9 ZbX/WeN79c+cq4ZvUx9Qa3bP2e5/Xj+u12St6o3tX+0nJf/5XRzwRMeella54+8aYpJIPxFneeOV VqyFS5rK3/Pz9LW1j7P/0jnl5aI8dv6w3Y2G+304kyeO0PuYw7yMI2GKaxZDrcLwOk52m3UddXZE jHG23v/gRjqO2Bbn7Bk6HtDibQRNYxQoqjk0RLocYdKB8xB6YHTY99NxUah2YaloPIddtcDD24LH +w5qayrVzgkga3s6k6BMjkD3OgsU61nsKFdZYyCtwXy6QVSQnqBa8HB5b4atOJgFZ2EShEXkehhn z04Q3rcty0SXUlAjohgU1EI5FICuEwdnkoEI20THmQnWCsVSeCffi3sYwhgpkysXbyWVOoax2aMK OQcNRDE9eUAB5z/2XPcF7u8lemP/5r/5RveDdz6gz+zBTJRKBwwRT9ZA505ESSmRA1Ytwjw/LcWs jOtsJIXYV2HzXoIguWs6IDr9OqYbBAuKlCla3+96ibY7fS/t3eiqYkbBF8WgsI6bOudc13Sb49JT 5c3PfR6NpEFeqFrcq9kinWDPklmSgpGq08YMr5X+IScuo45N3zpe21S2Th3rbZs2EQ2VrqJsei5I k3LsURTBzcEo7mkoGHYJ0engvotzp3zDnzPDwH3eQLYXKUKVCwqjO0FP0m7qG9a1MvFVyCu6rEO9 hXOkMXDgkEhw6BWNz50+zNz/Gntv/2KRM8+WaW43SdQ1Qwu4YQfoTJBBmOB+nWYqf3gWxzG9STdM mZOBY02n4E8bMEkNue0AFfndQSmLt21GYlXjZWBgUR73PM3P7hJEqhusjZBK5HvcczMI8rwzlERU DfldZkiSyGX159Z2MhaYdVE2DDKmyKrMwI33fs0w+Yyede/Xz1cO40DaAo3Pehi06Cuferp77/3r cXqvwLedpt/7LB10NnDI43R6Zgx27RTC2dORstPKFEVzR0DzdGbW+Z3B0NFxnC9rELhnZSnp09DL CFx4dgETHSBpHp6PKgCr856zqqgZ0HOvBv8ijNKlRMokaFdbslLsKaDy2+bIDurkikjxGmks0ZMC L75DNeBnpGAy7nm0dhyYKPB9C7kPmCRjG4pGcxhdB7Ef+e8ac7NqGZnedLc6ECOtfLtf+4NQBITi WGsHRJ4rSOiHbuSz1f/aR5HG3sZ6e3lL3XdQXE2EqKec1lBViubn+2O+szRFtShgu9Axnao5kOeT OMPLOJVf+/rL3ac/9Xh36pEH4lDJGfasSfHwo9LpwX0hqyLQpcMrRSoBj3tn9sKiRde4BeL7xtn1 asvrZ6fzBc9cDnXZuJzWLHztUZk8ufXa21qftq1FTYrHoCQXEhysyqv4dzKsrqFBRuCre4FMKYb7 9rey0H52H1TY9cZCOh19ARmXTIT1KpQgB5QdRsZPM+b9OHQQM2ACHOpV6SXFHG/Xb/KStnp+rzyy F36fFoLKQaVjCtXMft3na/Rr1vbx/kvXa+uB67ljGPle995N939KQAF1/iaFvz6/mXyzG/w6Pc39 ePY8AWmrS6g1bgwC6XyxlX5EC3pTJyO/2CJkMw0VwOd93nfcpMp013mqMxqAM76LfGrPestWO5FW 28jXGG8QKPiAKbYr6GDpOZVewgXAkZdKZ7tVHfopZHQBvawOMhMxSqZgGt2r7klhuX4Of0uZMztg WtVuUPaz1vF2czPVNWeaD1A+2391gOq8ZR6J2QOfPy5dnef9PRMZDO/snt64X4fkdWFotv0Oan3f xuaa7mF/zbp03YPPXnu6/560OSydVpwir+1rpTm2Yol1Dd+WKa697sJ1nSDQLR720aHDINmkHQ0q RCKMXlUgXE/E0Ugr3QizVxWt3v9YbS+jRau3tS8sLVWvU9rrXnvC/v4DtOfq/+oPfZaiCXSukAv1 znct7P6185tead+7szj27dDk+5wM11SjU+11UraQFIU/r80oI+Lv/W0hMcWR1xmzGtl2e3BVE6Eb UoIk8Npx0y2s3TVSLU51WyCV/wQG9AwI7TEU61kqv2ds39XSuqI1izcWu6uXrjIQ4xqtuWg9xn9H SBvrEO/IixrcTBScFlg6RlGUJZIVQdfyJt3bEAnvM6kvHQacPh1dKRE6XJWCg4OFc6izq9ObfqPh XaqsS6o0wtKvTTdtQCMawdPWSVrnsBj9TsDRmoA+4R8Htdiy5wCI0jyfJ3VClp+G2zR1OJOOIGed lilknHLQDPesj7ZLBsBoPA5HOjmQVWAah4jUpTcvhf96knuFh5N+z/ua3RT7gYPdsY89SVeRT3Xf +/Hb3YeMdp6xXaCHnec0IFEJmRZ3OprOr2PCJwl4RL9UGiqydKdx6pMIAWto4KNzQt3kPhdwQAUj 8rdY51o6j/e4gUJyPzWMe7xBpNvKSlOcKXLleVwnAwcVnHtp8YmFmDoxjsaWKmBLPZ01ub/uz5Qo dHOkt1RcvEY6gI64bZU8G04dTDDE7+ZBPJVTi1yM/BxT7dhjB7OEx8htqWN0ItPILOeYgIFszRqO sLGn9B/HaN8hTejr59jjWzjAb9Dje5Fi0qQi7RTC+kkXE8kwfbyRaXsO9xARrkLJjKpNVszBD6L+ IhPW9DqdEJnkdwYr6wRTd+AB6neW5MlnLcqB59E2e1JQkI5QkkR+t0G07BiybQcbPlNk2fO8SnB7 i9Z8m6GjKOMO0OFsyBO2CJL1DR5nUNzQ7GXWncRRKBtpHaVMto4D6QSkAaIYU5Tb861xEHkWBdMx cO19TwJDrimlQpxPUMJgRP3gzzyroo4iPLYX2wQlmibQ/unPPt3NT7zTvf/hje7HP3o3nYUeoKe4 PHczh2mnhfyaRvYcaijHMdIH2Pt59MQq5+cmmZ8ZgotjDJLxHCqTOmIZQa/zxL6Jko9LJ/JWuBfl N/xz0/PcnxmbKk4siprComGTxhSfq3dimwOaDkLukeupMx+Pq3Rv2gfGEamfxRFIetxApTr3FMXC s6RznB+UPmuOsNd13VpjjexZfqcDD3Kkc60spYZAmDTFTvZVrwLL9MjVGZeyJVqW95cjXkM3CrX2 ltNnOTKrsDQ7YepeHeYaJAitazgMS7lO28EWjMWhjFNdoEsspA68RVrQdgQcDhJgyXt9kZHTf/K9 10Ibknsvar6C3G7zmgkcZl8vMqf+WSdDaEbE8fZSrvxs13aE1zgcSRkuB9f9aW5KUrY+V9nH8FFD NG4Ir1kw7UQcsSoqq7XNi3Pv+RPT2b7PmrR1aQhfnOo4I9qasqm11xpS369R6v+t3jKYV/h0Mgps Ugc61GQjdAKyfhicFYqRFwEh3J1DrNlpOjSdpnhxfH4+PwtVkRuVApI71Han3UeBTNUH3UCwfAWp BrnHZvu9uXIlao3qWf27RVX1k2ZY+3/U68t5aF5N1rAtfpa8OdtN3ou6WQGiVBXPU2pylDP+SxtK g8SAXzW2XN8poB06RlqYgVOAGNdL+TKoSFeVAlJSQC4AoG9goWiiT4MlNy+HKwXl6/x+BZ24zlcA QYR6KcWju9hLUH1+f5N++fPotSfOHWcq6AZ0EYpEsbmhUDk4ij+HAAd1rH/0yvk44gsHp7F7ZEpZ c4HC6D1tDxlqATB/tg0wY/H7CPIrmpyOO2bHE1xU8FOtht2v2g9tWz+tM45ClrnWuta834O2f20/ 67X3faXcy8+5/3X37W//4xKIe1/9XvfBaCm5WtOeE5f2iNi/GSrHE22waRsY300eeuvDne4y3Bn7 1h7AiFrhOWiKGMdHtM/UnJ0HHDWr4gqy2zu0sc0NMWjRX1KhpuTyu3JW+z/1bSmyhBSR09xxLVZ7 tp9ApyPP/UXKcdbR7Z3ve5cvBVBX8iAZ1vSLdd89ZOEV8uacqvh8l7qABQslJvfSelDJbzQW5PI6 geN0hZghfb2SVkEghDhaFtvlvMVayX+bJqVS7WxOHDzQfZ7U7y98+RPdaaZy6eSIUNjxYwaHagb0 dghjiKdHy6717sqPXu1e+saL3Yfv3bRBc4ZZGJ33wxcy2QwnaBvDF6dFCoL8Rr78L5FiDlQJX3pg i4DAcc2kN9ZP53jVCXYYuRGcQB3nNQsYcDCSUvXzeL/Oz7BjnVGGG3AeHT08RUs7HVGDCg+TXTMm HGTAAlp0coNG/6PIz6GDKn+cFA8/WWqd1SHHTbOQOzhq7734Lsj5HVL4M90RRoer0zbo1qHCsXfz nkaFNNc6Cvc6qP4e93nGbVO4lTmzByJpw1wczt3AaSZyMUDgJMMDbjBCWKdHbqP0kGnaxaUqGbTb qXQ6lvZOHqYHsA7SqAVppLvSZVznGoRZebDLRrWIKhQpKJ1FGazf4FrxKrPvKaoTFdERsQijeKXu w5g8QNvwISILx+fS5WN4jAb9OEiZ2NcMfYJrjSlfaZ7ADWiMR3S6OU8rOGj2647B9sxI77LYj+ey 64/ohAXL4eW3rEN1VLRuABmxRyzXHLRPPT+XzqMGT7sr1nrTIIJNsIrb66eXMOi7gcc8fXp/8OJ7 3Q8YLrBqqpuUrNQTW4x5HjatSTBwp0DQ1F7SwTjayogV6f3kNVPlori2VptmWMFxAs0pnHiRUWXZ 4tjJBagX/sc9mF0bh7vdkVW7fpXWfyA9Jl8GWN4bVLHvQqU5copJYGQ4klkimEoWATnUkXRqpu3p /NsuKcsggBbfaHzMKg2zQP7bKXk614MYpCk7s5DGFwlP5kZdp45oRtszpXMwgIxXF5kKGBz40jsy GlSNZgpo+dLRs9p+jrOuXIjYG4hpPFdxds38PPKRR0NrmeNe33v7SroenCRTYxca19Yj7VpLF9jm /Ov3GniJuluUu4mRXEW3aOSmcdhMmac7SUOt0umHiELkaYIe6emiwGJmEqljj9Er9hH3HBpo75iu 1jFQhmw1oS7BmU8hmg5AuLM6yxV4VpuwZsBwjlL86JuDLvG/1IiUMyUlIw4ElCJlZciiQSkngjIe bx0KdZbUCt/u+5s+y2ugZcRJV28HFUWGQeMMEiw4DrdeJ1tKWYI8zqeUg2Sl6vyUo106bECah+fP h1Fee6c7e16OZ/kp3p/ZtKIbJixV7hp2ql0K8i0gwjlQBswMxFbhSEzhxBzZne+OcW9rFO/+4LXz 3XdJv5/gHDz37NmACmvIkZmdKUa+T9NGcRiq1jIddHzeOZxMO5BEJtEpQ8NOrDVIr0mpBl+hlsdZ 6a1t7aGoUDkwzelsAExkNi+wk0sh8PcyBe512bU8q2vRHJ+4N65DA3N6CxtgyrWSRhS/zvWuuoYU 2avv2Cud7G3+XqJ+xMyQhW51L7Y9Xe8uXLqVwOeJJ09lIM9hetfPP3CE1R1MbYTv1bEWxd7dAQTw uknv+9X7Ep7f4Omxn9WKtGhr5Rq04KP/Qc5Ko6vecxl+4rs+6OhdkvI12p8WZPQOYJ/1lpLVt4st 58wmBN6TAVTp22RKQ5kp+VPAInOeA4O+9AAX/KrAJOiwYJgOOECXdTVyrvtWit5fBYueD+hr/O42 WeklZCWBMp+7jr6+RGZMB9l+7NYwffDBte4UNKVHqW+48/5NOg9B1ZTGqHPNvZspOXnuGDz4le7P vvFCd5u6q4UzpxmU5OSC8rkEZjxqLU6LzITuJd3Vn4aDzv7VxkT31/m+7ytXKp8uWxUJ9CUVvKW9 Z9MJFQiXv7P/d3DRksXIRP/a+/a+/M+6+r0PqrNw709O/z2Z8g3RS0EAokP8dtgo1/HVm6DWgyy0 vMRbK3KaIK6zeWcfoJcmDtUMxUoWgm1noISjrEWFeC9KISNT/8pH37cG3FYpu35J4u72D90c8xJq D0Ghxlm4hMztXfy+HGwPhordf/e/TRKsFrEteq3QvQWp7yrKqtcYsfqeqOM6cDoaidBdt6J0+BIL OROoNIXTb6JT6dxeW33NHqHKm2EAjjVfxbGTp2pniRQZ4mQtQxnYJI1yHGrI5z79bPelzz3dPQBX MKO6cereofJ9gfU8RHcAKRZTCPXU2cPdyIH57uSzjyVd1A28jhNCxMge2KnBQyMi6NMYpd6RlGgB pPfrpMco+/5Pvz62VqsD6FRGR4frkNqz1y4KIs02o9r2cHLoxki922PWYRse3mlkYRfneQYesErc FmWytK16H3AQiBPC4BsPwoXlB/RghaJhizr7TWPoZ3GMTJOnp62IJtcYsTUfsnXxLVqGwaPUATtn 8aOFY+xBUMkRu4CwjtdtScbv5AjiYAWhMoOSVDRfHPoMY+bzbOF3l+cRJXL8sGitrf2CWKtYFSNT YDrGGiTbY/HaadFkU9jyWfl9qEGm8jw+KVjk56LQ8i4bWmCwZcStwRO99750hHXIDFpFdVM0qm8R hABk+/9H2J82WZom6XnYG8uJOLFvGbln1tJd1dU13dM9jekBwRkC5JAEKMhoNKORMpNJMtMX8S/o b+irvsoko6QPhMlMgpkoAgTBgQaYBTPTe9deWZV7RMa+b7qu25/3ZGR1DxXVpzPinPe8y7O43+5+ u7vGmAonobkKsSejHWNMBW9FAQWASYnoU25Wb5leCpNUTqAiEDJGaOnNVmj6k2c0emLIWGDO+O1h JB2gsASJtntPxAmwE08h/yXE5pqX0qRHnc9V5oJ8w3p6oM0mVynGOyZ9iWu+xGh6LkVh0XrKlLxj TNNS3OtaC1yvTANBrlX9F6NEN3cxYyB3z+ofArQVxn0dz6zd5kzC1OyL11PQZaWYBnyWMNwgf6Qy wyzX5cTwzikByb45hG+cihjwu6WWpEmORp+UIxJUNe6cB/eGdJ0Bpf2sj76Gk0EvN4Mbz48eXvmD lySOOt/W0o3Xlzme4fzjJATqZFCGS9MyxKmSMbH5guiBnnIDwVa3OBb4ovSdGz3knmN2EX4ogGBC apitmI3OMF5WFQr409PNWliHs205wyX2UbygXFCKSkqEMTapBMP1vEZVfWn1yNnfNoWwjnZKQjKM ymq7Xs4YAYlBTblGuZ560Ex6ixHCvOkp4jpWU3D99dSJ7MWr6rCW1tEmGbV27+JZpY1jHaqY3uuI HKCPHtFgWAGg+6ZE8whwxDopeV6RMr2O7j0ODLFZ8FzNWhxw6W+hwPH8SfwXiAj23M+9p8tDvQ++ k8oI8d7VHuq93GmvXa7yXDvGMieRT2/J0lT7wBNuCciRZ1vZ1aoLpLymx3uczxT5U64eHzg5RNxf 8lSUxe1YgYPPa29E5fjcgsbWRPf9770Fz/Wg++RjEscwFL8FNWRRxxb7T6PSiihDGtFcMvd6dB0/ I19JmhWoGnH1Hvgv8FHM0WilvZE30sLqOikJTa1V3fGRsih9HWxignXp29EBUZeFQqriS7tW8wr3 x/UauHw7dY+eKpzngJDyLhdYVL6YTIvzxC69iQbUmjhkbdscRkrcHSqBfOu7b3dDDMYpokWhrbE2 XBpVWrGSJqv7bfnXk7yaESn51ZdSDO+/NySuY5gek2RsXmOGa6Pz+teMmdfqR/b68QXkcooc54Rc H8r6XPxZhp4y3LKnRY/QMJJKdX5OF0o/b7jFylw9AAxIbfsljXcSBVI/qM8tglAle1PFin1opFOM pzG6SwLPnnrfxlTODa9dooWvkKP7GNyu0R3wxqdfPut++P1vc+vjqQSySVlPdZo/yimxUnCIlD9b 02M4WDFqgP5Wd4kfwt9P/wB1rQas0UNkj3rBWu7IhfRVaWswo9njrR44+3f28OtBrK7UZWiXPGlj 3S/mWIbXBt0Nkb3qHv2m57pdPP9c+z0hoPadfuYDEsvBUOCwrenIExdgY3QYyq16jgAEBtWEEBf5 M0o//Xf/6idpazwkaWb1Qz16hIaxeKxGMN28p66OAN/mcStU17xp/QCNgO7rRdg/w2g82oBWcKa3 DLQqy0Ypa7pAYp3lujQQ6AYitCWYEeyHoh3dW5Tt/XgsgufznXHJjYHaTrKT5Ybn2ZxAwVzAvsKV /9crrHBui2uWsMiQBWtS1LEGCJ6RuZTx0RonAQf+5hqC8T/9h7/f/af/+I9IsBt2n1HLVm7xDbwU N0h+ugGwWEARutGOn74gWQkP1p0b3RjnfvjjD6Mk/+Zf/CUltrbCL1xYLH6WINAQ56V8T6sdNCF2 vT65C6EMkHqG1IaUf2wpG6kSJHyZkX5M6FxSl+cNBzMKH+ERqw8PKKewNusFLZizybWuSWw4RMFP CUoTCkKA4aV3zeHXQpnT4WmLYwDXUd5cd1KKhlEBa7HyWnRjMRrbGCgvCEN9/uuvUwngkrWmB+oM HvYeG3v76TYgBU7p3ZVuiEdTBa/XboAXVyvZZJbz3AtAb92KDqQ5GmZjbR5Ybg3BYum0gVzYcKYv 6SpM6Jz5mEFALPIMejYTDTCsZqa1nfdcJ667UKGYd6MXCGc9YwLS6iqF8MLyl7s+RYm8FaIPRyTo yeUezqLIzGHgPgwl25b7jLVxKC+a+zhA6JxxEaNEgj457rZ69vnmAVaC3HQgFPAjnOJJZz5cOybE 7dnaO4krBpOETkRBWG8Crl2EoS1u5/F8DVsNZIVcCZnIgYBwI+gK47Q6l5drmSYEpB5HWysfYCi4 VqSvPCVp8xFl3swUL8qR3M8KW5s17o9rSPBgSFvvmvacIN18gdRmbvy8WWpaz1PJ412a8DygdNMA 98WR3l2uu6DxwDibm2Dk1Jq3exijcndHtrfCk/mYteU4l14EfM8/WEnpPAGkXhlrUw/t2Mk5DTef nmBsEA3RCz9xMiAf9ma84K9e7odydcg6vUWN6TM7KxpZMaKXhGNrqpJHwLxwlvDWBd9WllngfN6K nm89byt4FU2alGNu1RXbqMtVlNYxIOTq9tljTR4R6q5OhqVYU9aRedumeoTPu3BjvvvWzINu01J8 fK4xFQNPgIQccl+Zpa+3yeiYusBQ+tKyVSWqZbwUD78zx16UFnQAiJP2Y+UKDU/zhDQq5Lb7TEYh kqwkFcv1rmjUmOfl7FqVQsqbnUgvrfOvaBHEBDO1kHwDXeU9TGkB7k0DoCpQVGm1MgoLbxWNwyiq FSClusW7brlG5GzWd0Bh8XItlyhN0UUc2gX3GUqfa5gaj+4V6REu85SPSwi9rW/GVUM5Osv1n1C6 Rl4Zu0nD0bBN9KlFqBqArSTOuueU/bOijRVmlJOekwTpC3Up+kTnigZ7Kho0nkbAZVSNddnZYyZi 81zftvIJXW3/5J/9dRw7W6xz1/6tuzfIG4DPajTB67Y6wRqxs8ynBrKnnELGuGccj1DQnLLYR80b 2wyYQih+1ryD4oz+GHVskwkpneaqlLbRNGnD3KVZe4910/HX1XEfvY421dBSTzi+/utYh84GMAYA yi23yZjNgY4xdKUMTpC0Z5THFtu77Ccr27z7rVvdd3/4HpGpO3FGWB7uGAN/3BKHA3QBz+ww6xhI NCFDXFgkeKRWWvRfIbIep7W/S7vX2PQP8/8HW9cpy4kwOn37tZ2oXU/qjZECr+XvrgcNN8bDOt7o iBjUygHXBXtyep7kVRunmQyIDFeuCLLNH3C91JqtNe7alWZoZOqc+vVWLNux+yznT6J1u7b5FcnP 4PKvcBwc6kzhWSOzGf9XyKgtvndoHgb3aKL54+ebgOyijbyEirdFBE25qs6znvrWs2fd15+vdvd/ /L3u937wYfcLtL7nPNBpMEEOlTLEUcDRcJIIKjIa6poOGZ/5FCdSntPeCA3iZQYCqovGUzkClWNi sZWRl7qt4dfrt2hN1w3BCOW+lqjjX5yl1+A668MbvA6ua9rq/bZmYoA17Bjl40bpJ1vrLpKRl5ub cTcEbAKGlQHGDffrycBTojKW2vAFLZ55/u5b92517z64FfBhpykH7MRFrAs/ZEUnp53/+uIKyG43 OsLCoxFsC+86SO4fykV47f0eJysghInZ5f2bbV1nszcgfv0efuP3un5Au5M2AuVtgHPp4p8l8UaP S29+uq4Fr3oLVEjcgpvZUoOW3lq2Qxxgoja2yqISwo4B17//g+90//E//IPu+z/6oHv15FVC3npO 38VDIZDU0hOwnhI5ONtFUagQWcjjeKPHANY2TjEcZiOWEwCnnEqVhhGGypJVkCnzSphljamYEkKu sLrKJGurCdF0BkRZzxLCkRt8CkgzoUElqjhScXveeTzOghMz1fWs78AB16snSB23CY0KVeB8Qgjv JeXvPvoUqsB8t/HV03gQ0xpY+ItAsOSORlpaCOsYUcGw9u68Q7OP5zvdk89ehh87m4ooJjvgmWU9 bgLmXvGCTt3dXbpNa2g85D6HAgqw4PTr1bZ01WAGjybX2kFBPec7j0l6FHhcIIAX8aobel8ApF+A KnbwAA9RgHfY8Cu0DR+SfHZkbW4TCfWMmADXgIJAIx5ClbYKVZpAwopVCqnhygBugZxAWkVr2bgT PVfcr6HpcdaKbWONNOi1HwrorR0qD17vrwoPyz6TBVC6NAKit8sycwDkKakKvL+Cx1UVuMcdnuht cDhM0KSizNSpwFSvGWs9ERR5dtVKWK+5ILYHQilp53NphOl1iwCrqiEx/PndEkwz0D6sD/4ZFVie M+ZmtNvUwLbhMyi4UqoF6CaZt0mAcyWclDGQ2sLG/uQU6mXheAHrHOD0DsB6dZU1qPFmIx4OWzYZ 0XbOjN+QSiE+zwatyWUnjss11ePr6DNFek+mrHfOsdmfrDlB8SkdKhOBtCUuJ9V40PN/tQc4QZbJ u/dl8o7r3fFKjV/mYjJNQtxLJhAr6EvYmxiXKES84mWIWgJRj2scF44bx1sZRqvg4oomC46NSpE7 1phRBGf/cg699OZpuNeGGBpJLmeu0sREuhd7RIA1piHJPYTeUYUt8OypTKGySO2yniznmMXInVnQ EHBlMrfQjVSIliazi6lhXYVXOtYlB0AD3aVstQI8TXqcNARTuaC43Xr83a8uMvdEqCICT4w9PYNt i8TbPOLVk2AZuonSJJtDaatX2HXpvRQnOcl+vBwXN1GBdK9leFywVKHwUEscfz5J6Nj1lC1Y4E2D MLIvAK6STsW7g3hFK1wbMBLvXQPIAX42SeqNAi9b6Nlk49DYvB/+zuU9ib9EBfkd77G82FFBUlr0 kLuJ/WJKaJWuSYWSJAGyJk2EdJ3Yht5VzPq5dWe1++5372NY463kniI7GXe7Lh5IZeG85tBo3FgG VmPXqKDnmdV4jCRy/5b+HIHEgArpaI5rgc1i6fgcb+pRRz2mXjBHeX8retsiyll1pZujH3P7pXuj U+Nkq4hfj1HlDrteivpT0SCdSIJFu5oqZzWgpK/FuaVTCgfDFg4Gk6HvQUt45/173T14v9KvLolU WTAgBgI6yb2q0HJdmu+RZjHKiOZN1+FjJKbXk1mrMczU7T1AqScY4Y7fMi61437LT8MqPYTvj+iH 9zrCKWzANTH+fG6bjBkljqPOKIgRcZqypRoPHOXJJTqqcrg65RCd7ziqs90fygH1vzLdiKmGvOt7 G4C8lYgpe9kE9MooQb6B6/iOMvzlnk3feGIrIFmyj3Ps8j3lUb8inPFtue7Il2N0ndxs12XkHnXO U/UFR8VXXz7uvv/Be9177z7oDly7GEk7/KuTaBfq6CSR58WbC8hIKVUlS1P/HSpTOXZrzjN+rrO2 Nvt1nPupJRzZnmny/3q6z29MifKof4o2+j2wbtjntee6ges3zvF67ZZn8fWI1O/tO1kjypWKqjVh VJ7ruPdZgCoXt9T0VJWnURAdz2LFUKT98VfPuj/7y4+79+/f7j78nbewOAjK4ik0oexqnJ7y7bu9 wVCGYg+AHRSlpNZ1CaSSSv0D1waP+s3H/ff6Ra4lF7fJSAZkC/erNdeqgbjOKavrXDvo2vDUu36h 94Y3QdHMz2r1W/f0etvVfee9Nm8ROgLZVJJAGeO1fvj2TUrSLHVjPzMpC8tNvq6Zzmzuv/fvfNh9 7wcfxPsrVeT9770dQGplDkPEZ4AVSxHJ603IGqAXqxVP7qWVB/Ayvfv3PqQl83z3+V9/CdDcjXCZ IVy4ChdTb1UUkc/Rmv+Molou3KzYeg69NsdYuJbMmgBYT1pWj03mBrVRy6z82njsEHgqKzbCbDiS V90O96oXeQmgtUQJKOGCz5NC84DhHYDpwS++DJ9416gHYHEBT7I8YBegnlVD09Z91qufcBjXG/Ac D0hSsWya5om82x2EicBFg8VSW3scf07t6m+zllQ4VyYPMe6H0B5cZtZm1ms8xJv07E//pvvn/+R/ 6F7SdOEP//BH3X26dx2+3OyefP6k+/ijr6gpvBwumdSMdcDtHcD6OiUE5ZHuUVnCZg9InICSdBpj /NLy2prR4eFW6FxPoxa5tAQrU8zjUY9nWtoD55bzarfKHZKQzOafDqjGI41XNkYZ4ziHwTGpFzje Img/fHaDklxSNPQm2uZcgKeBYyk1PRJwMuLN3qAd7SngyfrbloKTK73xfBteJgkjrBnDcjYo2cZD v9Ga7KgA5eYmTN68SgLveN4Y+7R6Z99ZT1uevYajvGXLLz6Fy/cXv/ySbofQKdZWum3Wt9SaWWvr 8rnlH4cmw8RrQmiR462trYJmeVY5KZWnQprX4vx4t0KNc5MkBbWbL3YxsnYZsvHu7r1VElsB9Rhf K1CvplhLL/lc7/PS0mKEhnaMyZty/JYwnDR1kggmNcaax5xTXrEGxxw0iTkcBO5VmzqF1sa/yjnb 8S5hYFmdYYe5T3tfONzylaUKpUEJ91sNnwTUUhM4DwB0Z+sIL/QJz1JVXPQEuQ/mV2l5Te1l+ZWu hznuTwVypEedkdZ4HC4Juli3AicAok4LqS3W27OG9ZEULeZ0CLgeUnpumgfeQSbItU7khnHWI6V4 jScLlGzi5jb5CgJOWw4vWL1HuRklVnXrL0kc0Imi0t7TwEwdcVsZV3KznO3SRwWOjQAYRVKZmwwV 8Mb55P1fKEdcN6XyoihTytRyfwIGuaTKd0FwPLh6r0sXRaF6rojkAtrlOymObukOxRbv65UWMGsJ SDdpToXK6bHZk0DZcmuGx8tICtzke4IY787kUiM3qUHv2XUMcKw1l/v8IWGX93x2gX6MIdIDsxKh ccYHgHLu1PHnTdZRwJvPLQGbc1ozP7WHjTbA/TYhOonkVZk2gNAcCc+j99b9sUwEc5WXtajjyWRg 9kkg00M7d/d28mA0hgSUGsGHLUpo5CYcXesG2721RWQdAat99D6VUK2aDozebVpu9C6fh8Kjnktt YY8pw6OPhCvCct4YmzU2MSAcYZ/XOvuOfYwMDB4jEInylkHv/CTpH3lu5FEjTmPSqJ9Vp/ZMnNu0 sRMUwW/d7X73x+93i+TipCCnJREZwCmr1FjwPZET1wo6WPof+RFVjLZAUDqC9obx6NlrHlMKsnZG 4Yf+1UboNagavfFbfmmgqp1nBDuiahuOCPap40KzMjF6X2ANAJby6VglsZSKQ6mjT5Wxr16CAea7 4Xtvk2ez3C3AHthF1m8RpdIbrYkp9cNXaGuMm3Q6we82EdxtxtVrDUm6ntYSZ4r0JpvAyP+6zQPW lwnoyOgtzqFH+hA9Ijg/wpCz+6VJ11L/PuJejKCql1ahru7tVLWOWeihV7ceQDE57X7ys4+6H3/v g+5bD+92++hPiwDsA6yNWLreNbhm0TkaBm4giwBMW1UEuV0dJstR0XP2ay/1c9KGPY7OwjFlymU3 jtbz6Pfecg5ga5/3h/aHe+54hntBxANF/Y3c0XW6zJubIEKpjm+0pVHlET9rhkF5BcA5drQzTDsA UPjS45TSZAFtcBBXLronDMLXVHL4BRUaHtIr3oYcjHxlxnGDoSH0z94ETvGjm9fa3xsFo1+ZRVHQ 5/QaKKf0z8iL7GKMmFY0ZtHHGzRCu82aGPGzX8PgFn27ti96mFxXH+HuttFeB72aEM9uq0mN0IhF UjPSZHwSzWJZojRt1mDCmpmu69A7vv3t+93Nv/6UWteAX+ePz2+SVPfD3303gOrLX34OveF5d3t9 jc8oA0bYRYEk+LTu5SUCZwxQNGYWrR4yqjGc460eAKrmKDt0C2FxBM1ic+ML+NpwTOUzmUjkq3xE o8I/8SLkecqzVK1/+T0eP8fQxiXVUc5EyiUA/dkEgNbcTbtaYZ1uA1Re4dVT2eqpNYlRrvUNkjFv woE7AWRZCkjAcGaZsWxqS9EAmgArAuUJlQqeXrsm9i1lL1OYskoYXihYuNeVm6uMIdcF5G3RDnjz bCvHy91eNXT0JdVTsIjNYF6Fsz6gO+M47c4vnxFCZXNqlExiIL74/Hn3//i///fdJx896v7R3/9B 97/53/+vuzt/9/vd5l/9svsX/+S/7/5P/82/YHOfcS7oFFHC1v9dArxiWOL5PiRUfwyvcdKwpUBC xemS1CsXJV8h5ghvM+v18plIwvt2b9TjtYOCMGQ8u0ykB2EqBWQoMNMhLbcaRXCKopDL6z0IqFKG EWErKB1QJ1yOtFQKsbT70/1gJrfz6H1sMw6bGA8C26U7y6kwIDC02oYeX8tpzrDmhgjjM2qT2+Lb a5s8kzWTRBg9htXIJy2pLVfGTQp842XiGaVBXNK2Wy/8DsD2S0rDKb8WCV1qQJwgB+T/TrMWBdGW 7bP0myW0BszzLF5UedpGylITVA88a07FcBMax/vv3aNN7my8HZskzOwy/jaCUWE4dnqMjar1ClCu vteym9gpLzmGUL+zL+Ufa8AaapSq47wlXMqzCPQ0UAZD+cMoHqIUboN99qpCdH19PeM1Pbfbfcka OtPrwnhY5ca1a2WYeKk5qeDRva/0O1ZRmrQWIdWS1hwz1zV/nwLSDMeqOJ0Xq4m4MeflPzdPtA1s jH4c7G8BRADRGGRT04vMEbQSu55yf9JnNKIOMXDPMRb0kOqJFzC6fmznnmx7DQ69gUZLADcmPqqo VLZ6pQUi1rlNVQ95mCaQqswCkgSaVbVGw71ASPGXXZ8pzeietvKHdXgFu0Y9NGus9hMZo/is6iJR RwLNBAGK25mGK3rVE1GrNRYdZ6iN4+KhagCuKjXJnfZZSR4GubkPTzQM+F44+xq6XEuDLYCJ74Sa ylfjjRd0klfkvbgO+oS80BSkvehF9/oNMAYQ+pQ5QdMfHtPr+oanSu+W8q0qGe3Zc76iuaSCg7+b TxQtUuVRe+PE+zayZN6BAFv6n0DGqEPyF8yFSmUhHCir0KZY7xq76UzXQK/yoxLVisOssyJVMXg/ YCVQrAa1j0r2pelKMSjfSkcEJEfRFXg2R2fMcmOZlOJZe2Dfwj4J8xGOBTxK5zT9n9+d39LsqZnu enPuWtJiaAOuHxuKmZvDWt8zGZc9uwYl8r0PHpCYfi/z5L7ROHEPXrGvpMg4J6k2o2hBL+lkqnhW 6UKfs56v3WcUeUVJdCxoobyemUxQ/TSn3bV3fvuvPWAPBOmRWy2+gL+se42KBv2MPKQaD3pTWoBz xNowEmM0ccJkcykb1Mqf5h6n32K/AbInwAvTRCqPYROEZM55jwHIB+gxCyWYFyV9z+6zh6wZguUj vBJDh+c55Hx7bb+eKw94WTt86wDHC/Wsg+W4ZZ0PU/TGmJjknJx/i3Ffw5Fm+UMjWJtEGpXf6qRj nmHjxXOMod3uEVS8d9Hhy1DqbOplNGgmBR2MosnDtjFeJbhXNNFroTN62pet07NMCzbnAVy/oy1Y OK+W6WtcVzyENr6Zt0YBbuu5Lew2r64DD3ZN1zqvN1xA7ZpZy/0aaJ/14LPtjXzeh6r9fg/A8zn4 R/7LzgFl3hAmlkWZuZpBWZr0ZPa5baBn8Yreoq31ZPfnnzzpfvj3vte9hQUtF28KRTGkUgQulAiP QGMHzMFQYHCe/olNwkkpqoSM+pEqb3YJzzo0jTr6B/XeE55zq4z2/ethtDB8rAgHqzZzCYo2K/0A ZRCK+F6fVIi6yuq1/cB9XaQAeAkGG2skLMyzXll5ItxrO2CZcMRmtI6qoRs2/BT3r/dIQToPQP3j P/pR96vPX3b/5E/+OvdnDck1vGyrePlYcfGeXZ2Q9Y1yvsQ7Zph33uRHV5vKiLm4NEP88YvyTpgw IGVE6x4L0rDxO7//fazYo+7Tn32JJxQ6xQsyeBFO8ysFFpIAQaWDhOJjyFS4cAyrvgydFEvLeCdx jwQ3uaA34fcdLRx0L59sRBDatMBGIpdYzPuE6/Xq3QJQr+Ndlofv5j7dJZmLxEepCiaH2QVqzpro NjFxTrn2kHVk+F+qh95CPdbe0TSKxLG0ZfikoZSEPwxT02ABi/aGCovbm0oy2jT1e1epYnLc/dzK IozVB3/8w6qGobC2bB8ABVOh+xPaR/9f/z9/1v3Rj36n+y//l/8xtVCpPsJ51r77XvfHCKmH7z3s /uSf/mn3z/7iV1nLrsNl5kfenw0bsjLwSNlhMo1i4Ne6fqyn7Ga366JtvRPe18MIMJwD1D9/sQ0g 437xOj9H2Hz4w3fizd59zHhaSASwp4/Pjpp6qZLkhmcylS0QRoKcY/4+PNkPh/YOCW0mys1QjUPl aYWPlwgw37M+8sHhbkDpjDWfTW5DUO7b2dBqPtIUDKUbKo89RT1sa5FyLXluoQp5/3jIBFNWZbTm aL7HtQZIZ73s8txO/A7zZUWcJwj9TbjCc3Mk37qGhtZxxnsvSJf3zj7Y4fxuP7mSJkSvGO0CKBzy fTPSVcJzeKMtA3d4MNW9RTh8muYiOySsTgNYV/DSWs/3OQaWwF5KyD6e2AOE8D73uwwP2WiKHvtT ecq2S+ecO4BkE6AmGQtL0OUZXemsPSkQUfDs9VM82eL8RQCLQEXFfcxe7PnF06z5GYzLYxoj7eC5 2cVTY4nKmyiOaZ7JFsDKgnSo1ROM11C5t837exg30yj9eYyGbcD5BlV1TFjrFZGREhMI04a8VfRx biynmN4CdgKFjxhQyNqsBgx2XOGGpbQYfUAW2HnvnEjXIYpvl323OknOBnQrwYR7+nKCfcmeEXg4 zkko4zM99Dax0sASaKWByEwpmNBhmH8NI+WEoXcNoBQV4sdym/J6Z4gOxUtu/WgjR6zLUzs7Si0M J7wpOOSuCUuWcbVknFGr1Oi2Oy0bQO+lEdCEr+12qXKVJ4zStSmZBpD3ENhGXXRBmQb+NM/+5R6J VXiwN6GhTbDe14bkOBDCFqxOSpFgT59TAlPP8SURiHCyWacadoM5ozzIIdajyacafRqVGm1pWS7C EAQjS6oMWt2HRkR8hn4u/SMbq3RPOh56DWRIKoc0z3nVNOa5tI35Wry1UlM4xnrNc0QVpFv5rEYw lwGUs+iIPWqyz9AMSLlsdEO65smLzZTtW0MGH1EBaUB1kFtUzDhi/r3+rACcakmpp18oJXOeylI9 paYBzTGMd9esnV3DUY73P0o3ay8N3piLgHbHQuOS/xzPAGsWRYGkooDoeTQnIK2o1aI6HFhHaWxm 8iSnObHCkQmKOAU0jjUS0+gnzVG8lymoTXTfZJ2t4ZD68IffgmN9O+vM2xjTGGb/KZMKFPOP3Hz2 keZD/NBGl2y4FiugqjX1lIPABPW+39VZ0bzJo3KS7e+eM57W59dAXAMXDUm0fzyX3lh/FOo6JVqy bJJdW2KrFCJLz9rh1sjbIWV5leHq1AurKumos3kZXmjzS6wOk66jT5+i+5lfmrIMbzHXf/lroltU GGOsrY3ufk6eCLr4BYUTDri2DIQha8rrHXP/vpR/B+hmX4kgMpYH6JunrzYoccheogjD/BLgGRny EAqwZVR//cvPkmR7BFXVCkQWEtA4X8Ch9f3vv5WI6CfU4rf06+5zqILohgtk64fQV+1KqiE1znhM jtntGJmO7FZuWMih99Cbr+XoyeFWdiQvQ6DqnjTqoJESonUZx1WxqEynMmhNcHa9F54r68D8mh4p 83cRtRuIrCh0AEFb2wFNzQgLSI7jrPZt3g9wlmPrd8qYzu/Z28oAXlLAsm/MxUMW3rm93r2wq15L 5pCPI8nah7NFr14nG4GccBNaJS8g1p/L/Yo3ukJCvZVa1ynunE0synvt/RVcDnBtA/PG6nzDQnT7 FkhuRkvAbPkU2pi8tlFin76mxBRob1PQHxzMHcN6dNEG5kdWZt1bGZgu/qKi1G2VYI2VFG+1yTJy vYrHnMoKqfqA5yf0mKvuNiG9dykHZjLdFoJkCk1hlY0kKgFKxlBC83jCTGSTh5vJkB7B7wLsjKdg EQA8IR/TGqdcT0F1tIM1y/lstnLz1kq3Q4KfnYu09M8AFG4gE2mizVyUKqqeD1grM6MQfiOLJ81C fI/JU7kMSahTCk5uKMz0GBNOBhjIUZUuoYdULvU011LJGe7TMPOWEzXhPvUea0idWDtbjyzAxooH JkmpXL1cuNf8ojcynlO8UamSYRkzQ6mejPNOqST53ajAgGMfvE8yC9/9yc8/7x7/C+oco5Dfwuup d2cSha+R9RzL/m/+/Nfhz37wzj260t1NR7OOmuEdAHrlrbvdj/+jP+iGAJdPMFZ+CkXELoxzlg4C vBwZdk2iCKBCIOQmc0NFnreNjeGS9xBk4cwCvIRuqTwi5557t/qKDUsmCNtKsZDWIi9YW1Bv2zif yye3tbrfXUlSpNEjjTt0SMv0VgkYSredd9rD2oac510GvClUpjRQTPaT38/eFPDJvzQScgy4Sy1l oywaaRE4gOWmC6wzbdKUe2iSzwWyoYS4mXlP2oEJzK4VqwPZZOW5XQL5HKxDOSeAgnUPUOaH8K4H lzZGsuKIXfasC851EwYswzk0Dp+LBRPj3KgEwGhVT90pzWgQtIbZxQFSJowi+J0BhuxlOOLuvfjH UlrO8xq5iQea4/T6e88aEXPQTAyZy2c8BCDqvc76ErSmRBueb9ZF5Awvx8ZmMKkrbhQE+fcWJabc j8cppehaLwFdEsr7woiJIVPPGLDIdawo4pqQuuHzaiiGxqT3PGuf+9b7bniXfTAwcdboBtdXWEmr EZQeI9AzZ15TbC11QHnDunKNGaFQBgWsqcgEy64Jk3b1oBvtYf5NdgrAi3lhSQsr5vhWeXxUnCkT yEWUoN6zo3KM0t5nHwsAPO8BcsZkQj1ehxhQM7rquVejMo6pii4RNEGVRp33yLqdkVpjdSn543rn WjpB2p27tRIJEozJ4eQ83iXPo6GUsnKsHYHtgD0+CygcQImyTOCEdAfOlSo1Jmer/JGtlmBUB00g Kws4CtwZC2tFJ3omVYFxEzB73UTaBI+WAzMi6eCU7k0jx3g69RZWJRQdIwnjq2uV33Yn5qV8U9Fm ffhc6mFVpeBWBewMqDPNuxAOssYTLTa3BHmj3DGsrxwJL1yT0edwv0q9Q3+4t+fRMUf7Rt3Q0zzv xRnGZZ5T72dFnkvlFi+9qoHU2qjydn3IPRr0GnXVG671XYmo3K97WD3iHWe9lIMhzxnPneCnojlZ Y3qE0WWpOa7TScDNv5ZyNMIreLy0fr77JWDbEp2Mo+tY3jBrT6/oXQyI++/eRdfMVvdYV6TR3ADe psybk6y801WeMn0ZYsC9BmKFAer+8tMMjAIGpf/yiX83Y6gd2P5pwK1dth1cp2qGWE16f43ynOen YaH8nYGUlmlpS6JzOpayXpALKgb58zomU9GIvzXWrM6msevasuMuBuQpQPgquSV2uSUBni6xWzAM Pn78rHtJCdnbaySH37X5miX3cEgw5qcmH+cWdGhyX8joXSk4fKbjahm6xyRydJ/3djBupJiop8yn 2YA256N9QIt5ddUuUV27vRb1h2gguu3J5/PdF588Isq91z15SalUzjc7XAltOMaaa8rV5iS5n0T4 GmY1irWOepCcduW+517UKeC4ltwpHNzWWr+m27qu8edr5vWoFEfYsq2ZRu+sdeBcB7TUeu7nzihN YJL32cINo89cL23N5Bh/byGCPCNvajWzBictsXcKUDCcZuZ3kvP4bGEOjw5C6BSLqW+qIBfvBRns CjxbbStsTo5QkrUTG3B7vfALXDNgWbtOQr8yXw/m67WaLd42eQ1qD8mzUUa7qc1DU29tCF5vNo9U 6DmJ17gz3t6I31531TZRu4PMifdaL/8ytB8AaXZ7lGeFURLCMtvdBcJ7E1iiC1bJsB22gJGo9/e+ c58yhje7l7/+KKFTuapasXtPnsFHsqEJxf8FmlZCsBIB7aOtt6wQulKaKyCsLQ5YEmyqHC7dJGTr Xtj0BNqI4PryO2fd1188rxAh92aILex5lGqeIh4Gw73yAGvRlAJVRrUF1f+rOFCxcLyh87C3G6CZ sAMTXGKbaViTdJtEQYHZEH7+LDVyT+B4CXBnrcGNYFBASnfQojeUPcWcqMBVPomupP5z8d1CtVAg k008gccwKV8CMpUQD2P/RL3bdmp8C2rNDZrvUIqFiiKPu0//6vPumDG5/fBmd/uDe90QT/tP/oef dL8GMP/wnQcIg7sIcix7LO9xwv2TlOIbE7ADCL77H/zd7u/+5LPuJ7/4JF5DAUkqO1gz1UQTLW4B FXPsWqplobWqwlKBeYsVAdGTuAuneRajY/2ddUA/Xlm8qtvw2Pb3J9OJbwGwp/I3QecIwZqkP6tv UDtaIJBax64B1tEsSmR+zSoh1WJeT+kRY+z7Ab8ReuXVVMl5voNd7kcDieM1aNJyWE9Aag/D/06l kyYsGGU/FzRltyVMa/Iankorl3h+OagcfqAyZG7W8Np+/nyvewZtwyobCSlaus69AvdYz66VJ/T3 nZ2zDjRMnG/uaduGLFzepLsjgNgUHk7HTSW6wri4NEOdQaCfECEZMuY38ci7J7zvY8pGDelUumgN bLyRemyuxskNYN+ZDGnd2DO8P+VlwztjgxwW2oEZ9q36iZrFBjdWLrniunpLt3EWWNmjp8IZFanu iSwR25IHmAjESI4FqO8DFAU3GpSGM62X7Twe7lailrkPc3wvLXw5iWBco8167gfWMG8884Awo3lq Cgb5BA+sXuTTRtUpEFT0jPDjPYdeLHMzOE88hAA9c+UUTUaFLB8nl9XQsqFbPdvWb68AndGgBnpU Apwz9J+mX/q61DorpfUoLINXDNBJT0HeJEGTPV4cbLxhrKUxxnZ63pKDgm8Npiqv6WNNO7/cQ+r3 cry1zOW3T2KVxV7g975TqnSPC3M8NFaZR+fEda5XXuNOeeBnlkc85/ene7SXF2Ci5J0nq25YmtIk /KFyX3DvUkfW+FkSRHWGyI8WqETJyyFXBgl8K2KpzIvTPWta45CITRoGlTfS57ps1UI0Sj3GkLyO FucgHY9wUcdZqX5XLXIuy4kes0d13owDhqyWZLUmEwxPLRkZ8CRAnYSiROJ1q/yjCk1L6wPG2agf cmuMethD1oOl+Q6pKUxGdPUy4OBELOPAqo6GceU2YNA3QvPpYjp5nGaqAKPQRP2oM5TPtWzqdU13 Jzk9lBSpUUQmNL7tqtXASCV9YyTZN4P5SxlNqS2WVLX/QyrsaIwp+629TqttaIe7O9DjkLgDGqy9 S4L/t7/3rW6RltrHfE/M4ZqWoxsKYYyGprNNDA3ANXHVQfcRyoiIHn8DeDWdFw91GQbFB7r+/J6/ xc8bmLs+PLnWtcNTMphn7i0U9WccTo5IS6r1/PU9wZf18nlZN1+ZK5XKRYfRK1VmCpmiQXNGRMV+ DVaDCiWAXKMhpUa/9e3bycWaxckVhxR7zAT9r3Eerf/s0+7XXzztvvp6t/v086dxwAyJotr994qW 4NvmvwDCNcavSPR22nT8rOGse/DwDlE2kv+fvaLnAzkd6JeD/R2O3aM5zK+7JejAP/i973QPHqwy P9M0v1spdgOy7RXe7Yc4FBfQE1b62sBJ8CVRR+u1S4usfA2i/BjHgmX3lPNuFHAeeawxb+TDWHfJ q+pcOUpCjVOjyt2WfyPWUgyO0VxfN54y+rrn2/of4cXmac5yqbWSY3LRth5iFTufvpzEHjyr+9tr 9JlAuioKxRLPM8Sn3k3evbUOkJ4PIX3XMnxakgjvE71j8tSS8FIcNT10zwjnaNnMoUjlRjlIA4TN G7i5tujIOGh/tqe4tirb8735eZZkrd120uvfCFzv3w/aqeNf7/5SVu0OSrpeFwztBAWgv3EvUQFO qyC/Jle6RICpYSeBlJNucgsKxL/1P+h9UtGeHLEZSFMyhP09GgD8vR9/p/v46xco+srgFUwkIc5E Gjxxbmq7G5rnZ6OC3LeWnBOkwEP69K2B9fUZ6hV8j+nNQ0jNkAR2c5KuSYRFcV1HadgUojoAWktS T64L5/UoqTwSnlL4+FzlVinemqDbTRCvsZ5yeG8ACrlcbg62ePMMmLmvei0PjUp/ggsPHGtD2IIA N6+Kzfqs1kqGWlFRyeZJEZzIVdZqV2HptdcgGLdrJJ7z6TJg9ByH22pVDY61osoKYOr34VHfvbfe bVI5Yguwpy0ySemxO5Sm2qQ2pwrmB995t7tPjkDarXszejfdAABtJ3eSduh3374TJaNGtW7xMeDK iiN5MD0OGDfh5XGMANgSYlkXzbgVEA0QbmZdn54edDMYIDMAPgXincsbUArwWusRbIo7AkO+tc1Y 9LIl5K/HsDxENqyJR1aqkF3/eDBLCSrA5k1owxN3ARXACIW3Hc+yXqLcLnMSGpWynhXDHhYkR04k rO2asJSR4ypqsk4xwIm/JQnpLVPIJWEsBpjJWHbxqsQXGxwdM95SQoYowCkrbdhsh+Pi6U9SWNX9 7bdcuLUmk7Huze2wxJP3lK5iPO8U118AJKSiDsBRYJ9mHjEOy2MhQEzd9rLFYjDgUi2j16lo3guV qOAw0STWrR7N8MVdnzoKTGLjHjWcTPzSkKykN2QbY+VYeu7xGaW3ypf7RcYZiYmRwH8Bg6GG8bmG COMpoLdjoz/x/PNMfWRPz7EKxDHUwIhhzpjq2a7rWZ6xzqmS9D51LEtfGFxZMm+fMcpyFQ1V9aEG /gN+ecYZgO8igF8wWq2DqxmN+mKgne6SAND2UrKvh2x4NlLQR3HuXEOOie8Jrp07frc2rvkMykXX cvCGnmT+TiEMnkmvmAtPwC79YYz1ZZK8lJs4V5xz9lKds+YyYNbvIs80Is4tZelcKAvzqYlqjJeG SvZNlSvcxeFzwAl+jIw9JxSucWn0YJ+9Zo+BUxb8NDS7nmOccqW8jEaaryBg9sE1QJNLEfngq+r9 phKCkt7149jFmPA+am8ZRYrMaOMkaE8DG87Rd2PMPvQ7GXQ9lTqu9NZyrwJfkhsnpytqoNwOuIbi UcEw8ldsSGUlEMBWVaAp2uUY1KkxS7aRYCtV7gC6XppvSOVSDjjY7m/3TBZIebPznyDTV/OoRva/ 6fGqDeaPdIbIlHrOutP6iawR18TpYOSzKlt4fOiG4gXBUqJ/FWUz4qLnOmVjLcGnDlTXtBC7jjtz dgY8083bN6gcdb9bIaoudUVKTzwZGmrotOLBN72uIdB0St2n6/a1yu+ZAq8f7NpvPsh1UH39oH5c Rv++8eE1TFGA2ecuL76qk5Eo6zHH2Xth5EFtVII0XTNZnjKgOnXGldNOHdzBsUnBmvLbrovIYJL6 9Wift9yst6mY4vxPkygNeMPRxItxfbC7073z/fe7L6Ag/tf/9T/v/s2f/arbwOOyDuXuBrrOxPQX eJW3aZyVBFM41Uk63N8NxXKGZOvHlADe3trK/U9D5bzz4B775aR7Du77q59+Ek/3MjrWZPhVKogN 0Mtfb9AJFoP4Ac4+CwPchcr4BDl/YOUW5kpAbShW2ZYITYasDFKnVcqcc6ijsq26OLMqMbjW8Wtj yfEt6nBfoq+8AL40nBzEWFevAWg+qzWd9xUmtaxrNY8AeP9++25KI2WRvMaU8dA2SRrQ3f5O7dB+ LVQO0+Q//Pd/BNY46h5TrmyTQd/FqnnOhn364hXAqpRBdg2DLxf0I6wi6x6+Rwc9yy3q3csgxRJs 143X1QVXt5/uUM1CTqijhdZ9qNGmDdh1IP1eggeq7Hy/yi299raWvCpPeMH62vi9p7wERg1ANqLn 9L92aF3T+80Jcj85R6zdmhzFeH9vcqBrc3sNhTSCONm6pZjNCB9HiOzCsR3SvELQuk5I5D//x3+Q cPT/+b/5l91Xj54A3PbwRq6nosaEQIYJmOL7E6DWY7w68TZkDLW4FBIFYi/duGJv7tdKB5M8+xEJ pmNYrvP3b1LX9zE1fTcQyJYP02KucPwEtV6TpVuz0B65RtVukAmlOS8NKCSjXuXvEJgAh6LSUy6w MMFBpXSF16SahVjr166dLiSqWBDynriCNiBthvPNoOznFgF+Zo6jIMz0CgcPbazXN0AgoUuTsmqN ptsU/L80b8CaNSFNg6PKKEV0pxKG971MMuUcvNsbhIef00Fqh2oqX3/6dfcV6/Nv/u3H8J+nug/e pgkDljNSIsp2DJ44btDuamsbjwDjhzKbv7PeLZMUaZURa40aljccbwjZ7HXpOrm5tr6zMuPVE0SW 0aWBqcdK4GW1FUu62XDpFi2Mz66eYYTqdbb+aFXtcH9LM0gDmfAWlWVwevH6WqbO1uxJRmZgBNoT JyTBGRrGqy+okX40uaDnVK+uST5SdgosVKtZy2tq/LU13Tyk0wFgls60Djl0EZ5Jw8Uf8awcuz5Z rfJB9DAAehH88xgLUzY8MtvcBivLVHRhjuTMy1/We2dHQ5NEqwmJ28nmF1VO0fbggpUAF8EA46gn a5GQ722qgFiC0nrjNt1Z5lqzRhGkcZAFpyd4ikiFAIz0DoxKrsuznGn8tBCnQEQe7hmNlPaQYVYC UZCbeKsBkbk5pIIKysUazwJtvd56+S2to8J3jyygHKR6uG71YOuhX0CB6TVbXK6OkP74fb2q3qNK wz1l51T3iJxyV/Y055qkooHgMJFC3hXXZbu5CBKlYF0718yXorbOpVED+GI92OI9tb4FzMzFAKCi 7IjXM14cjBMAyQoc3VRvaktVB8kFAFd5BiU+1J9QE9IC3IQqtiTh+L75bHJflAbBLZWAJxA8gWK2 p2fV9cda17GSijcaHFakANib0HqMR9gz6HmPLhBUCaTDRzZKInUnfnruydGqZLIkhSvbOb8870Nu zAjOBJzJySxqQ98VKo9c43tSeRboEPoB8vWzf/0RfNX94mTiNbvAiJCHjYUf5ew603hUV+lgMtnL /RVPr0ZuKBpFvXAJmBzrOEeFcc1ZwbDgm88voLBUpYsC4ZNYcklMjGcUcBtep/NbEQJPUuDUKAbz YMt5nTFyqAEnA/bTFfegIatBYfKusH5KGe79AE72cQTMRBZafUevPvNqPtT8UvoKHBMZi0dPo0yc oFznZVQxuipeZj4aAWvHv6JV+YKLLoChfvqKW/nUR1Mna7FGd/Z6tcBGlXctKpKGYuR7jEcrf1Tp RHVZgJHRPu9PeScdjo1g7oBeeZMUN62dzGy9S+Liex++3d16sJ66x7tEiqw2MY0D0GhsSgIKsJmz DL26wut7DZ+9Och8phaoLT1+HSy/YVD0IKVGZPQTw6NA25v2xzeO6zELBp2JtOGdA5CNXsfQzHxo lpqzZcRIwwMvfuvKLC1uSnnIeGkQ4epgnUIdBbQONabVS2Axc0ksz7jyEGfoW3e6KyhZRgAt1ztY Rhfh6JhevdG9df9hd+/SJlckFS7/0+5f/n//uvuTP/95t0BnT8H1AZSRY6K3RrVmVij/O0OlDiKi R0bmmJd95O/CygqJpKtUBVkmWrkc2fbpp09iDFj56eNfP8o+0Fg0GTKdX5mkt4gUf/f9t7t1QP8k RlGqIugYMrLEmMizDqpjDJSncco1w1VPv03lMtaZy9L5/asH2a7jRErjbGjr0knzjYDrNj+xxhtY 9lhZ3SPA3UD2CCT7vcRy2iZw8RuBau+n0ornapjRo0Jt8Tu6H/zdc9bnVtzSqJy8TYLYwkKVGlvC 6yYBfguQ8Rlc1MePX3Yvnj+vzF6tawbl0Vcvui+/fkoIYbVC9yYrNATfF2zvkwF6znVfw3S0NbnJ CNm2xbOpC+fVTeaN/FECI3+/fu567/Ui7/3mI8EQMF1fr6P6watzJDymTCm3QkmRXsAUhqufeBSb 96F541Qh0m0zlyqPeDMLpOjZmIDukVqbKKTvfedB95/9o9/v/p//7C9IGnjZbT952g3fh6ck95Jw tSWe4qUzSoAho/A1aaXH/ArnorYUIHaBDQAVDrelbvSADJk/a1Ar5I5QlnNXbBYfTw5Z5r8UR6zr LGzXWAFdy2fFiFHZJ/KhoLJJCB5FwOE0PD4tZz0kcqrK42d9VRKuaOcu0DPpTG/EwJbMbKhTa0mj KORkWzv7iOey6YxsxkoC8kHksytuGETpn0ZUBOUKZXmTGh8Cj1okJZycCxV+NmN5VMe5r3UaGy0A tDcfPe12CGd9Rpvop4Sj9IbpUUv5BsPXDorhW+7PsTY6MKDSxXBxsbsF6Lb5iN7M1MCVn+rcqmRN /BJMl19mFBRJYFxvmPfNRtJL6powWWfz2XY3Tr3zmyYjMo7nWEYaIhNGKawIY0g+DYvkLJbHOmmO c1JNAIkYBoIZFeQpBpJgwM5/dr9yQOYzRsXdVlDL2Z5bm0E42faYsCtnk27hcJ8JwuRMMtd6ieNV 4X8qo95oNZlLz+0Z0QUNAEFw6iMbpmee0nZc5c13jgCO53bTMqmIe9EjqCGVhhtyWrNPCqgJUvXM m7gyZ9m/hCjke+tVBbgB8K0qsoqR6Fo9aIDfrnRSzfYx+OXOLeGxn+Ma1ryVx7+0QsMWgKvgWiCt QeCPoC8RCApxxChIKT49hQ5bhbC1JaSGZBzcy3rcuHcpLRHognXvPsaBn5twpyFc9c3j2Xbeubbl GF0nHuMzqzAs93bCvo63xY+tAKGnm88FxEl85nfBm5HACcveWRYTsG6kSeM5HmXzDZhDozlp1sB5 TVyaF8QIPrlWNeSomuR6Lg/Y/zo7BvF0VnJiJZDzLOG+lyyM28B9lT3fZGAvTpvsCxMSt61gvFqH mwBWnmhf1sS3qsU0cyWvesYkVfanhkD8PVB2shK43wmv7f7VeE79vQJdqTcu5ScVq6iSQr1sZjP3 POd9BBBm5OLcMcFRg0fOqYBzSMmvC2hhm59vxSg14dbcIB9ln7wAgb4lpF1PRn4UB35fT7zPZI1z 9V46Neok0AjiHEfuafZC1C1zLN3PxHpWQcCj+i45A9yPuRqhSPSGrFQ/R9klFOyqrK35T2da39eL 75ryWIsHSD1xHDBQBElTJKM5p+53u7TO4Zm0TKJ85TResZoQ91F8/4qqOK/KDucps2xUMvPrQ1wP nbsY2mQ3vVBfyP+/BtdxNPUO4qZtmw7RuFB8jTf+eaoKMZd63A31n8LRtXa13uoTqTCCbqKBSXJ1 jljzjtIpMm2fqkBWo7KL7AK0g4eA69s4RazYYwRRGpYJdguWbjVaEv0TbcL92TSonESjKi3ORRT/ SPM3kDR6wGvP3yzdN9FzPxBtPOrPv/Unp1VPF6Uytbc1KEJX8H32YJM/kSzuA9afjADpXedH6Hul v55+80EYV+k0UyQ2m5Qu1jgGK2x88ax7Rm+MWXT9fOqCs0b5bAKsNoYMHJBgOEYlEbxcyObV7o/+ 0T/o7kArHAJgP/u//Lfdc+i888iXNRK/F5ApB6xvJ32O77iPF3EgvEUSo9S/GTDMXbzQs6w5HSnm XbxD7pJ0RmlZ45Y6ZL8dsA+l3e3T9nzz5fPuCbWupTg9uE0PCtbmtylta6L9wMpngFWNhxO44kZd pRXrEFFmmFeTXgEYx96Tka10a1QeO7ehtpWhUyU+W4TO/ZPfFWZiuMbFykKu47Ou3ZsBvx7ndF0H 1/7tQU3wjYywWquFQRuQjNDkLQWJExWA1Q6Lk6rAdipwmdB4QHmuQ8tZUZT9hNcUTR9WUHYfAPRu wml79Ggm2e+GjB8jaA+YyK8A3XuAlCWOQ3Sma518OW8ioaYo5Mog9maq69VrGoGLbrSbf8uq9Rn0 pPRhrRF3uz1HH+opMB+xMgLRDUIWaPQ8XikD4MD3g1VKpZgxdSe9bik0lwAc911dyOJJD8gunnUZ AJUhPJxDMZOsM0WYfMC/AzxxB2R0Hz95ktJ2f/cPvtv9z//+73b/9P/9b7pf/OVH3T/4vffjSbEa iSb5qaFirNgT/p1asCpGlbZKi12fQgXZXLvWy76iBIfDema5O0I1tiKfZQEHDJrkFOVS95m8RsP0 vASKWsOTDQWGPWBY3c9ElkjiOHMU2Gm2oeUNNYHFkhbbbEiBg0aW1R/m8CxJWTk/ZLEfl1csHhQW vPWJp1hsVtZwD6tU5qBsyAs3YTBUlyz0yuTWexWQ45wA5q2qUbdZ4Uz/l9kyJ0Awwsi4OfVKDlap fcw6nGKzr1KuaJZ73UGgf/SzpyX0nCq9kybQPN8o8M+4hysmP5PnWl+Au2nzGcUc9yo39BgAGC6u AEjdboJElnYzRlAsmSGpQYyXwGMZbtkRY2qN4Z6fabh6Fk6k4PocgWgVCjnAJ9SHF5g7ppZZ87pG GxyFqmqAl4axE5iGpqOMUImaE8GxaQetklOgC7B6BV+yPsArx7XSV76nZ6yPNKj45gyzKicssWZo XsTnmtMzh6IUdF/qncMDYZtxPdu2IY7mZ1COAZGT59Yw19vbJ1EVgA74THMWAb1lCk1S03CUc6ty hNlEZvv5OR0m5QzifRdgriJwZwGVPmdKvOktVIwkgcxGOXhP4NZmUuThavBhvOTcfC0dDFk3SR7W 4OSc+kvi+WVuZhhP26B3VBmNgnPs3McxEOCusyYcG2/Qmt0mnFlnfGsT2MdamA/fupq4KNfMMSgD VfpJVdBwrUQhcA+CJjHFDOM3jZDfI3pluHxGr7o84Oa9jaETnSC/mbG1Xi3PukbN/FlLX0HHiUdX YFGkw8oLMF/DWrnSagwzm1hNdzs7Fxo+TU3uFl1TNthi2o3u2ktuj7LTv5W3mRVldQE0Bz40ssjj Jks9Z9Y8corxcg8OoadJtzAEM8vf6oMTvTdUm0mZO40Pn9NntL51+D2946IcB0kkz96qu5DXnJcy InSm6sh40qp+rOBVMx9hiZr/X1gnmSo9OgBUwnKwt6gsI48X27RbAiBYUjBJjBobGpYmoSI3NeIV 8xMof6NKgtaJ1A3Gu2iYgaGQMoVYIrlUD3N5HtVz08yzcseKOAO+736VUiWNSbmTGVVGmjNj5CAJ 74yjXlvu6Yw8ArtbnnAur+EYaAiGj68s5rNDQjXhLKuwU7GKMTF6gkd7wPF6JAW1F3CXJ+kcKlXL z7P39Zw2YDDy3vaKrkRKfvq6we2P9ib/NEO5EjFLHsdYE0zrIOEaVohRJ4xZ/ci8LTv79bQr6SFN Xhr1tlPtMV53j1kBJBoR28coU+a9A8f67rsPAda3cMzoLKr8AyfAhD0dN3FEMQ4auFmtgsu8Kq8g uCg6vtb4SKn7wQhA9w9e+y3P/3oo+gGpN/tQ92/7/I33xB82yJL/XGVTjTSXeeapyqiSSNWXPDX6 cIYRcnbsPuJe1NMYWud2j5WnvoBnmX0Vmh5/b9NU7SmNu37n6oOUtktfCedWYx0q49khhr8Gugtv iSgpY/cutMj/3X/1X3Rv378DH3s3eO0ukW7l3CdfPun+4rOnNB8zqkIFMBL93yd528iiuRRWsbLV uTSwG1QCuUGC+CvvCzmzpJ4192qtGjMNiABuQF/75K9/Tb+ALXjjl92HGEgPKZV7G/mV8qx8LzpF I8yNEjxYeqKMIR0UVT6yzxeomtd2HdVQERQUKE5UtU141q5O3uyZfp5dFI2WUyu3QHHWQDtPJjie PpW4k31tJdS6yzqK1zGKn99DH6iZd331QjFvFOCWtidWPiaaRiEQPFCcxwF4Tmjm0XM2Mx62dTql 3WBy52bu4jGhtBUb9atb890vfvFZ1Rc13B+LXC9fKZe6WDUJMORcoLRCxNlkQfqlLK+v6Gqf3D+8 nyvQry3+/N6k+zeFQlvkBcDrw96r3XvQvFbZszE74okUGuV+8gWv7yC3+82+VCGXAncgVcBp1ubj BnANAzhyjHQJBIZC4FwPjgARDGJiyg3COP/F/+zvdL8ifPnRLx5RD5IOgwh1aSAD69MKrDwfiiN3 ZYm6gHuBodzpFrlT+VjmjIYaNnyZRlno9TmixrHVBHzpjXTc5QbHkNLIifdKwcwmclwNp8UiNPzM AyWMx9W0nBMKdpT0stgchbXRwroqYzfcpB5qDQvLUAGabDhkM5XiwRUYHHCciizVA3h/yHsmM/aG npMdb7S8QNeFniPlUKgIhg9rBpWtE0F/NbcabHqkY9HCd4lQtCuhfEUBjG3i4YMdo+gnDyx9ZkgZ hUakIK5Ckj4cG5F7vD14yicIiRnuehYeK2DButImXlkuT09bE9R+rQgUBa5zTy1ioQfzlHvT22CR DKOo7j1Lu1lyKW2kAQAn1EI+nzWZB+qA5YdcV84vHsfU1cXISVJjBAVlk/TskohiqTkV25CIgSUB 5S7qvXKN6EWcxjMgJz2VAqTvMEYawUOexRJNgh7nWK+6nkNnWFBv/wVBujJDp7h8P+dtbKwiFApC 24IMEXKLzPsR601vhSXMTN46SYdNzsX5BRWRcYZs9cQYzsy8aKjZsRFQOyRiIw2qcd4ErfJFved9 yoGKuayHGrNFx4DGmvOuguEagg4VvcmKKiTLEVYVCJPdOK9rg3EXKF8RWk9NdQ0k7lVD5ITPw/eW j+w+0WhgbegZdu0fMV9GLtJ1zr3E+lm/Q1v0dDfkO4yVwFyFd3q6n4RdwaVJrAIGQa7PK4A35KnX 1vC4/OlFjEC9ieIUjclZ671yrzaQuJxh7K7wxFPZZR9Hhver51Ug/t733wbwwXu3zKSl4jhXallb A3xLT2aVbtQw0iiSGqOXvzLyCzbUUuWZpGAYyXHdKQ8CUmpNa0SlvFlAi/tTeVCNTSzFJ1o0v8S6 7BKtrYKjYWOkc4KEqXI6lLxxfIy0dLRMHjfRkrHTSyX4nXDvuaeDNjS6rHZheS6BP6AQwKE8kPKU KIIyV4qPSZXse3OBXH96+DXi33nvdvfsp0sp++u8ubZu4BS6ktvJc1llQl6oFU5SIlDjjnPNc89y uF27RjmUKTYgydhOG24v+o3tzycFlAj+iVNXY2uqFZllcrsDzL+RkyZjVVfMGNyMc/KVGDNLus5j fEc4MMYm5TkxAsZ0FE0UmHO0SiHOn2Pn8+rcOpcvzrqdhb8quL+gLrH3PMe6soLUOfvySv4PMsLG ZBWdaLAxaq7XdaXySuA2MBLd194vEdwj1dIVaSQjmK4llf2pXtEDy72oDzUo0t2ZsR5nbpIInwiA CXv0LJh91W2Sf7TzaIfmSrspw2njky1ksknQv8M6f+vD9+O5P7UzsWKa/yxTKB0teMz169qN/irA muY4PaaKz6vdZA1ze+xvPFzDHyn3xomrEU7QV30ha7OAXMPH18D59XHy+FYxJREwZScyKhhIrjmC Nffmk7hAreij00Lwy0tZpLzRWEtnOYw38IMJ25Z/Pd1FvRkptNoRVKhdcl3CkYkBU5x1ZYpOwKvG xQ/C2YRGAs6YXVvr7gGs/7f/1f+ioKM0SwpVsNDJb9nq/vm//Ivuz376KcB7KyUdk1PLOn0J7XdA SdsdIgqWzn379lLobEZFDtC300SKY8iqHaS1If+WkV1jOI+eTj+JM+8OEfV3KTywSt8MOedGgwec W1mvcHf+dLgoA4MX2A+uJ2lao8XoEm0OgtfNZALmXgPpTG1bv86XPwHheufanuoB9Gid9x2cgjLa hLZao6PpzcXrVkwsiXyLkGnXLnmXfaQCldtphFwKiZX3TFBXNtgZbcpucSikC8qY2Z1nHc/ADTit F9RT1PuyRGjtYWoXUjVidTUF3M8VlPHm0pii3VQtt35RF6iusHrzi4y8xy7gfidfW7CKBRXQNeVw nRM2GtgArl4otN9z3SZE3pAWgUSv38n+ceDafXm9CKP6t6eJyIfMptPzYjINvypD7Qo1CYf3AktV DvAhIZdt6kJPksljp6lZM+f1xm3AV0bIfudbD7p//O/9Hh0Vt7tnnz/upsiyDclVCgLKf46xn1pl Y6ZCRXnSsmkS2q1H0ptrQXaV+DQ3YqjsDGB4rHeGer56SOEQAPKss1q1uMsPqhAUtpd3ylfqtDar PCGr3oukF5v7SYKWdYA5j2siVTPkSNlcg5CR4ESvmoJHr0E4vHLvDZsL8kyyyzFVVlBlo2feZx4Z frZFFnxoOOmRYSy0PgO2k0SoUcb96PHRsndm9BSyDidRIIbMxl3s8WQD0PQgGma6mOrWDW1NfEkX xq+7JWqCfpt5VoDLBbT7V3UwYw4BR9tkWD+Gg+2876S2uy3L9ebKAKw1U8qkvBABIll51YUv5RO5 P8GEnkormrhO5OS++GoDS36P5iZwbyXWqxB4RvfQAhEHDaJ4PFgrltPyGQ7x4Aok/ZEKcGKlDSlD fGYFjZT+EvQkAaoMvzkUrmMv2NFja/KIobazJLFVIq2eTK8Rz1czwIJhBWVJTrVkopEHn7CanwSx JHLCrSNY92ydy3t2SZSWME3t0lQw4B5SEUcPBccKCAIk5e2nGoOgpygUKnxLBKZbF/O1BuAIWOe1 igdkgWRWu5ZdIagFRJb781mP5F4K0jTKeB4rm2gcDvHwCDi9ntDH5KBjnscudkMrMjTu9TTvryxK HID7KrddUIXnUGqA9/mKPJNdaCdWHlkEHCi3UgN51xrXJAHheLBLo+cUiA92oGHYmlqDxvV+bAOQ Wu/yaAVq3l+NFbQO9u1h2hyXVzFVPdg7Vk9QXlo/1tqdk2PMsxQADWfuySRc6/WuUG3GPWgDmUm9 P+6TRATY73LEPSfjrMFRCTvSmWpvZdz9T0UlRSBgQv1TCkKQ2Eti76UwuTxW641Tl/+C5FXL3rFO D9k7ZdwLjjRcNKQxXgyHci7vQ2//EM/kJA4AE3CvBFgonUPlKJtLAyPLwb3k+lLpW8rOaAfWplUN BuzxOCvgrOsAyH7VoKAr7RN46Pdo+ITlGsqHzS2eQcXawCBRabsesHgwTNFfNKmS327ahyX9/H3A +fVEh5amTOS/yVQAwZvtHguAq66ZGr0Tcrl9LpWnxGzKnMaZEz6O1ChlRkU3fdksy/rXoYRkPE3q tbKWnq+SwW7xY4G08l06lUnfyFejhhpV6qZFKj1oah4BRs+O9mNYzoxTLpRSndJZqtcC/0pzkkct mOiBYqgiCi/nuImuYMceFPArxyQqpmHaZImGn8eXw8tFop4sXeKhHp+29XoeUzaRB2DdGxFJgzLz aZADUq88zxWeXGXO5D1buBvdXeo+//hR9zV9Gb4k8U6Kzrdu3ugWbt/qhmAOVEa4vMrK6SGygUiw 61lj3/F0rybKr0ZT/ef+CgqUeHZe+LcHWoEG18D1td/Loeb3BWw9cmlYYoTY2/iNzt+u8/qCAVjR T0nCc03JU2/VZRquCPfcqIhRvThxnDMdUBiiOFXStZcfk9MvmQueMvkrdqyME0c9wbinWpj8dJsp KSfVJ8o51pAUnH1yjy5MqDYxkggW1ljX4SDIY5Pof0qjmAHRjiEg+w//6N/pHr7zVvev/+yvuy/I WzrHuJ0cJ4mecZ6Hi/0ejWA0yHVkhO5iVM0uoex9fzT4w3ywNTrPdufWMuVk+Zxn/tF373f3qeAl ZXB/03KkUEWRbdayl+qV5mSMSer72y1XjKKONYLuWOiwy9IrJ2g5QtVTDXxn7tq89fMYMNwWg0wF X1n8/fxeA+5vSLx+AWWD5Dr1U2u/XrxnEQA/S9jflxvFw7yW12DxIsd07m1t0wFiBwC1uLzcLRkW xZq0lqxKVDAyM1zo1uDPONipbwxJ/mqc9sAIub0zlND0LYQRYODwUfh7UwItLfdYal6rMr0vualx FpBK2N5eRUHQylfINz5shFx5TkfPlV/rAcJ5beNUg9WUQtZ+D5zL691/p98G7Z0AiNFOVIi2TVqA rw1oDikLOS1vFbKxqgRRKA281RMsPK3Jp4RWnkGReclrn0SpeSywJUDQw7dvU/j+DkXVSTLk/Xs3 1rr/1X/5H3T/5r/9q27z5193t9gIK1BGDjdIXKDr3YBKGwG+XEtlqY90Ci+fUiSeNH3W3E42Ewvy UCVCF8WM2Dmc1iWqYCCUTT7asnX6qXOAp5P7dZyti50sZJTCON6X1OhGtZxh7TpxliwzqSdhDfni JqexgV2bs5MLsSpnSCgJwAZ8XLHpT0lsdDgvTehSBmezmCFeGyHiJqHnTB7l8ADX/i131y/SWtVQ QJpouB70/MrNBKTYcdgV5BpK5YG29it3l3mL8YAyMdtf+5nP9crLXXccbNizNpjrfv6TL6A8Gc4/ 6t7/O+/GoNjfg0oDj3GeMNjZzqD7+rNn3VcYCoc0tfjly43uLsJocgGPKFGHKcC4hrb3ZiifqeLZ yrt7BQiUIy4+mcdTeYa2Njy8aJMWnknBuE/ZOmdzuE4pJAD25QTz1pdIo0GARsyTRxvxlk8uk4DF 45yzT0xeDIfQ+tYInT27cDKHZ3TqE5QO2aMzhoCNXjCu04DiLTj45wesP0J2AoxTFbsgNwJJMDNB HVPapvMchzbaYMnYFlcPyDkhZQ+y26By4hIyXzxy7ON9QKFJLrfBFC8RGIcnhmnxsurlgBt6xsJ0 7gXWS3iBX7FunkNhsJrI8soyQBd+LGDMVuVWnbG198KCQPS8W6Vr43cfLEK23qZeMpSQWwvd7BUJ k7Q91mNqss/Qqj3sgZNt+JvWP2ZMFhHSeqKtIyXdYAJhP87es8W0RqU1ryfh0/caV2hgI4M5ywQy N3qfDTmaIBThndJYADgVulQHa3FrdFgZxmgRe0q++hpgZ4HQql7/WcDDS726eGdXqAW/sIT3lGts 4V2yuYMVhA4ZxEXkhQpkl2vt4gmawWOqIrc6kwbKNlFBm0gNJjWMWLur8yjL2W4ZJXTIuV5+9iSV QOYBGt7jFUDGmvCG4/VmnjJh00RsXvGMG4zTKbJlA4W8Mmsin02E8IIRiRhHxsjfvoQvKZgzV3AC j3kMa0GjvP80DSkeo7VBpBrp2dfDa3RT55q7Mh3yiJZMzFiHurjocp1N2t1mvZg4tbheZSdtl26D DA3bGIvollRUETA5n+YYpJY90ZxtkugJb7t+Zym7ODXDWp6qpG4BjIlTlhLbJCpzD8+a1KlJkrfu vrtGBZvDbo8onp7TX5NzsXJvAWN7lXsw4sESIyphBzoV4IDOlOcbx90d6Gwr5IXE0OVepSnIg3d9 uF+s733GnjhnX5+x5w6tZpLEZfenXOxqnMX2jxNDeWyE8FQ+bBI8a2zFDO6XY8rpRVHb/AfBsc+f +/FkCsivACdwVJemu6ckZc9x3TmadKkGDtAh6u05onIDGnZdjC/y7HgOrULBs5ibMYncsSlI8IaV dqRWWfKOEGoVCFCOVlRJw9L7uLSJSLoEQhGTAsUYuO9ScAZ5k3B8IVnAlfSPku9nZ+gpDbyU07vq FgBxc6kn7o7jCshwKPdlWNiWk+sPJ8hveet+t/4H693w3/68+z/+H/5v3d989LL74z/+3e53/sPf 7wZ0Nt6+YM7N+ZGCx9eyOvXOqo/xHlouVQNrUsDewx/1uL/3+Ch4gS9bnzLwoXR+n7DbY4u8j7e2 J5Tm+zlptE77w/vQs9nTB1R4DWz34Fr1hgcgJVkDI2KGRH4nMhQnID/M07h6Tf0CxWVpca3bnaUT LR5fKygtsgYtM3jGc6ayjJFZdQ56bsA5lsBiN6bmu2e/ftbdpUvzBPLh+NVmZOIC1UDclxuPX8Gt 3qJNPGX1fvxdZCfjRIOYsUXWAnOtp3tc74zhVTovLi2t8FrCeNvgu193L2hKNLF2Ix2GcTPRLfkG DzdR3ZmJmO6ir0MdZkErm41UGJkwYDLBtXapljbL3HyXkn4/+N5dKCjkHDEqZ1M4XzU6I4c15JR3 KnaeUdq1UY7YhZyTfR2nQPBZEX6dztceW8ZTR1VUv/PTLPWAENeadBBvCMWdL7YITSYhM9Tec170 YOtJr+pE9a8vv+PfLkKLMWjsuQzcyBXtKCgpqHY/G7L1DfQR132+9bT76c9fdJM/x5P6BMVs2+Qt hP+O4Wq+tE+o0S15F+tFr1OU/TgtMGm/6rE+xB6KBTdKN1SRx7tYozDCwAFCApISND5saCJxrbsJ Xh95nQ/dRuD1WPRvXLdAC3HXTwt//uYXRmeqw15/oX3Q78h+A9ZRZRLLlbMsWAs7hffDx9YopurA BtU5fv5Xn3aPv34VcGhiViIEepfNFNUbZxIg3DhD+DdILrDCypZAHA+ZnEu9vJOGYwAal4SeFW4p gM89pM0v4OhIfl3K61UFAzerFAsXohxSOwFZ+9aM/lPDqfJwM/ll2PSLNJz3vOJby0YL6K3YWoyI FK/PZ8Wtk6JwSQWHiBYXEOPifVkK7ADwmdAOHtsZFGFyERy7UCn4hufzLcMkfj8Gi5fi/IaPtfbZ 6NroVWe1koQi+PWmBcTqASiwHhGqoO8XtvtI7m5kHc8b+gPHGT7Gw/jeD96ls9RO9+mr593/+Cc/ 7b6CB78G0JlnLa+QIKSHV6PxFYbKDmN/gHB4xJwuIxgmAA6GiuVbm0uQyK/UBw1BhF9Co9xzOh1a YgpvgsBi3LCywJj/bF0+D3iU+mB04ny+OIp6sBymNAUKgNPGsCoHxg4iTEFrGF7wMQugSttuvfrx 6Ht9x9KQmh4+u5/R6RAvYbxs3m/KmsUnF8+/qCilwvRWa6wpsFPLXm+d4ZAy3FKlh8PThc524qw9 k+/kJCeiAIjbIvloi7VWDUbkwjFOKS2JBzeGlLQYlCCCcxa6kIknmTmuYyWIbcLbPsP+PqAdL8oi gPguVR8sw3UMHWAOKT0hNcW5Zz4iTfSGuYD0cILupKe5d5KtLnjhXs+UL65nPch6QDXw4C3Lz7ZB USqkaBBp7PPceosNxRuREyjHyGcMrGjimt/CQBA8mIA4RWfEOBoAWH7/OYneRipMuq362oq15qWX 3sU9SPByHPcBdIItqQYC+X32qNVD+k5klpUczvW1xTGc9DjxsCcIdMOuq2TqHyGbL1CGkyy6jAM3 mqo+aRikp6w4wwYZTDI9Yb8d01xkeRajWIdLPKrOQnnXigOr4sqHkZ1RZm1dhX9dD8U3mDfbomts 6WUXPAqKOfGltC/5xM67RrGnQ2kqvky0OlNGcV759le2OwaEHWOQ77PerHnvdy4A5q7nWbs1Mu47 RG32iJilKQVzMQuFKo4il7G0Jqk31q/mPtLpUdnCyzriiyTj69U3wnjI2v306y1oS1MpG7ZOcrHN RxKhbdVJnZsZgI4ecXnUexjcmxh1Gpf3761WrfhEIKuh0qn5MTof+Dutx03qZZxsCFM0Th7cveIa iwxlPJS1US3Z8IwHxjLH2djDdaIzyleidKk6ZBJu1QDX0DqFCnCOIQFPgjUFHYj8g5SQvCR5LeFd +d/y+/mC1A3leNSH81p6LE3e3B8ucO/nWpTCaI9eT6zR1M92LRhpFTSN2W9AWZwSiwIpE7K9JAba MU2k7GbK+cxLGAiSNLIVbJ6jxHm8+EU7dO+yFrjXaWTwzXu3urt4U19ACbnNv0skz40n4bQBKiN6 cbxp5EvZEXC39eQ6TX5XqfByvPQgqqn1BqhH6l4ZlPFq48I/yQDLl7Or+i+WDvOn4ZRcq8cZ1458 jRPaUPfOwZQl9L2KtKahTiKyRm0EarrmdXoICq0Uo9qC5+w9cQ6xm9RHq5FNGNlQXlsi1twNft82 qRsP9awdCDn3JfrnmHE0cvqEfhfbJIYu4QSYci9SQu+cfgBJ1oaekYg7hrtC6+rlM/Yz/TFwrK7i VL1N1ESu9F3q9D+gP8erQxv6yIk/7p5bb5vnsZpVugGzL4xGHZC/FFofQNfk8T2eT8fPrTWcAURT 7ep4qPOGe09kJFEP3atWCWkVwMQCLTkwBQIajqhGRzXBiSRlDjhWQBl95Gdt7isMV1OZfBGFUfv8 DWzY5jZz3BZpTXab2euGle+JKRCuVFeJ0lfv+bcv13Z/CkpqqnuknBk93iYnyK68k3Jh9vGQHHHe PTietoK+QDgJsrdQhg/urnTLCK/w1RgEBdganhpd+idcdEAofcZNnVJJvhpQbcu2v+3su1h93FQy aWqDKPD9KX5Y/9DXF/z1FV3nfv3Tn32Esq+d45vH5irtq9cHuX9f+CZoqM1SFVZq9AQNEyjCcPT0 ztCW/Amt4F88eoXTDV61lSEAdLOMzYRAyOQ4XuFRmbyCkh9He63cW46n8TkhTEuxPUCI68k1gUGP tHxgi+2bUHRxCAiAtyO3cRywN6BRg+W0Liy9k1bgU3CiAL7csptrAyWs4J9NCYlWmshHYAMKAi1/ ZkgvVTZ4ronQYrTM1Fzu7Pavi5m5FPz5KAHYfGanOb8iYDIzPFU0hJEKECF5A2eOX/M5VxShTWlG XoUdwVN0isx4/q6wY+81qJVQQKBfT737Wo5nzaKC12iCvxodqcWuta/n5vYH97s/wN0z+ctfd59Q peWjnz5CyS6mzfacikMBjmLVeLG5wylj+4Rs7A+JOFiJYo9nNFUtHhrvQ8Wqty/lkSrRq4CKQKcZ jqxrjY9LPIsmo8xRJ3SDUoHbtuRGSdnlUId/39jHIRfk+5R69MyQN+HRElWuP+kjZwgjS7zNABLc gwPLM5q4Zs1YlR+AX8/VHB5RIw7Ob8B1kJUGsWMsIKsQrvOpgg7XG6+eBoZ7We9j7BouLDdZOWDt ZhVQuouytnYRpq/wblzqsTPzipe2gorrSL6xnmDuZZlxlkJxbEJkvCXUJsabqud6aFI0nnONmgd0 +7IR0ubznXgJlwTAAjKupTEp7Sd2rh4gVlW8rVY8Ubh7vxoNLSIXJo1eLpUhBlCMMsGEABSwb5g6 tAWe61QaDHsra9l1g/yyLrmh1yPAXZIV9ZJZgo0rq1TsMHqEd3SHlsVSSRYBajdvr0TmOi/y3G3l bLKmHTNNWHYeXtGkxipAijsjDKl3z38pO8W1rXd9wLP7/JMTRALkL8gr5hw2X7Ls5ri1wW2WQoUM hp75wduoMcm5DKm+wgAGSXar0CB0CNgp8/JSzz0XVTaXlsqe6hPNY4ildF+Tv70Y9IEi9kr22Vws oW7lP+dymBOB0oBh6JLrFiyOt9kwj9FL/naNuY6mpaHFIkQqyNuO4SQIVC55ix5ncld1uVWJKm9c pxqmSchLom+jkARso9Adlz08uta0ZqzW1om+Lm4ABlhjGEUbVpqAhjHN5+dQR4ysDBfN/5DGaLlQ QAvPZmkxfwQx8kmdP50jU0SmbN+sHMxakyvG//S6D5lHPXLJtdEz7f3pmAilos6vI2vkCxIc+Hl0 fsk0h00DYdoB5HPrAB1IB7mYJvpFIyL21jH694Q9N9TTH0/sa1BRHe84T0rh1JjUWs9IpSlUlQp1 H3lEy6nRgyhKdu2bEyOQTy5H9TWQeDsO2MqYmASetaQnFtljZRKbL02jz9QrgkDpi64LwHMciQFF BY5HADaASNlMtHLzJYbqePdHf/gBAHuhu4V307UgNWwSwKjXO3JLY0SHVktsLwNYp5LOudxeLbwe HPeD3f/7W9R/9ErDGb3BXlZAf77+3/7L3/zgm/ihHa9cUbE1PTrKP4sxIyAsI0XdPsF4um50QE0w zlM4pvzugQ4GIyfImENwmA2TBuyHU5ycRu5ekfy924zJF0RmFvaQr+iJEyJZxxv7tC8/6J6Q9Kix M0eSr7LTSLd6+pJEyLHt3TRPm7pD3weoNpeW38MIx6QBv1FRh/3x0qEw0X2Gzr9Urtol4nQGuD7X icr8rXLeu9DT5jD8dwT5VjUZiiWqGILlQMVBd9GxdveWameC5hzycp5IbegNmbYe39UmCXB22p2f 4IJr+C/V0qosXlVOK+powUaFhTJO/dzwQ19WOcblaKFcWy/ZLe3vnm/t9dxfSrcGzkfRCv9G8eRt FaSvci73BmzwjPIKJ535ETYbM0GZAg7W0i1Fbb3eOZOjTLgj5PSSyfrX//bT7h067zy4Q7gA7+w8 Sn4JsL0NF9E1o0USykGZHKMbDx4RfARBF0crgxqZrffP+q9q5krEqj1xffF+c2H3A/IbO6Fd8/r7 /ab75uD21/jbwHuDbW1vaTGHwiK4bnUb5Q7uwaXefrxHZOWqu4mH7jaL5/YCdBmstVOAGj20WKQA bLuLASrOFKJk3M7fpewNnKgnlIx7ycIbIIFX4TSmKYA415JolvEyzJdbVbHpDSM0xA5QJB+TxHSO R8ZQ3j4bcYqEN5vUPCN0aJLjzAnh2KHgtThMwZxZD6/BRqbCOTD83cJYTSRHQKdpgQAyHqlS0Hor XSvxnOgh5j9D53We8gh6vZSZE5KolFx0KZPGOaKVywtdioD3XJ960/VOulb0xOuRHSHyBBlLuTdv WqqSaECaKIS5f2nYMQCyvDP6y88J41gn+8Effbeb+52b3btfUQccXryVURZszMIJTriWnkk9ZUcK NkD7Lz573v3hv/u97j7Rma+6z6obp2MY74nJdRUGCqj2WXkiC+Qv3FkOyLSov9hEsC2HbsKEO8vj 6eVBaMmHPYHzohcvSX2cYJmEJI2VlDnkJNaq1vCplrJ2YDsJBzieU5/T0Kxh6WRSF2f6AEu55qfK zCV9xjUlTcIxMZqi901gLadfJcg4HSG4LQtmI4GUyaJhkmMj0KgW5YIRy31Bp+CZd6HU7NlAhvrl nsFtYpOUFWRGStBJy3G9YGRatuwQRR3gdAEnEOWsN3ABEHuI1/qY8zy8f6u7/+B2aCQ7CKWbGCOg odQVjgGIpysrwLrelmJTBAq0m1wJ48hxdFpMrEkExgQZvGx6F/njQpAkP9yW2HoWhjawKIMppfN4 flFi5LXhaNci158BcEyzhizdJtga1+Gjt9GKEgHdynu9fNCxrGOOsbMHuJ4jPD8NSLACjHNmR0qB 9loS8FRYUGNQihqBxyRFalBJl7AyhetmH6eG1YTmpA9l3zT+vF1xpQIoSwFBxxwnnWDxxky38/nL GAVrC4D9GDQGJOTztvKDCbXI+dR7r0EIb9o9ihGoyB014dGLKraWF9o8SnrT+s/1/o9Jh9ArrWcu Okn+eHlM0+xHGeH1zR8RlHLs0OpDLXoiBS0RNb7vHozxz3cFapZtXFhcyDqaZb6sT261G8Fqmrs4 Rsg9r2XjoUmb0nDNOcDo3XfGI1d3P3oc7/Vd+J8n0J4Gcu75+5RjDaGf4LhQ1+wyr1uAGCsZLaY1 +7Bbp4yZA+K8qhMP3bPNy+x+TEMgHRh6FXnmlKflGB0j3l8P2HRkxNveUEPApgaHcxKnBFcxBaN5 95NzwrMdsk9tCKRMGEeGHVJ5wXGexzgYAsT0lAeec+wp68H7nNIr6R7INdWnxfO2Y+KkDiFeiVq0 PZ564MhAjVeFVup0W/mp3H5Kdf7hGjHoMNqsm+864hrxNs4vd9MUNliCdndM4tsJoM3eBVOG4d1D gt+o+or4us/MB9NgNnn3lMjtDLSFH/2DH3Tf+eE7MaLM7bESjMBQWk4ogVbccXysy65xoqGgURAv fK/Hs3gbiPL+C6y9fs/PyqiMF71hjRG46uHBb4MJjnQEZUVsR+cOaGsgMZvHj/hXQytCpBwuiRK0 vy/tdmnkE0ekaYCRIzjklq8wLDanum3yCJ69IPqJQThhbgKG9AF6Qh1iycYBc3siBxnsdcLt/MVf f5wusb40JK2Es2sDLmTtIjhDGSTdNvditIgos0nP7qcbhLmG9+7IMe3OLAc8sY1VB5WUTTiFw8Ge EQdfvkrLeffVGvvC6k06WoYpFYjcMqLPI89BGbP638khjr2zw+72/dXu7TsmUd5kj0C7I6lS2sgk VEUrjtnyXWdO0Y0YxlZVyX89XyJdjk9zDBXwLj1XCLyxB4IHePXzkG0hTnFdaDg67w1r+tbox4m+ PtlloNZPgOm1Q53nBgTLKi7qh57xcKz7rzUcg2xQth6f7SR6OEPpyMmXeDy3AYA7aU98hcJbpRD5 ancTC+Ulne+e4VVawitGox7q0S7GS3OE9fUC4K2FPUuYYZJyQcXrqsX8zefpnSF9m9Uc59xbuSIP 5IZUMZbgy+K8bpW+ecZv/PUN0J194EnaKd4YzP6r37jHdg9v3ncJMmcsngm9Xf7JJjonhGiC3hhK YB4gsYJgmEeAmmwlZQbaEBxjkgs2trp9FpiJZLp4DKkOCF/O0zRj4+uN7qsnL5Fd8zQxwSPlfhRk sXAHEJEm6VSYNqoaHnojTMZDYFaYCOVqbVAU+DrWpOGn1G2Jt5GMchWR6yACV8ArZKpEtgCUtpZK 6JQnNpVC5E0bxvMZeV6VUewfAR/KTwFp1QsFh2W2pEQIWJcQ/HrVq71yE6iRQfLHapOPuGeKOrW/ YDhGaRN6zpnXTqmuUk4K6l6+lZe9wEYUv4rbwv02ytAr5Di5udQNJlDpaZF7fe/tbu29m2z0l+Eu yhe/IglDzqh1kvctucW/UiAeoSz2FQbMl8lG0Ivjqe5DrVVu0FuopB45viZPTdtalrVg0MDPBJY2 d5mwbTMKYR5P+JiNI5hnIeuFoMCtzDmW4Ng6b7sIQBP34vXTU9QEuvw7vbUxfgFwtpu2tq6g3vmQ cpQSiYzLDPdtpYozwuzH/J3QOevSsOMlPMl+X1iO8QqNd4qwd12nmojUm4CwftVLp7D2aNz1AaTS RZIN71rWuGFfxODmXi7kFZvwKGVIYwJAZZhXmeL3ZgAwMx7LOBwC0ieZ4Du3FhHQNsdQh8vh5PzQ etKxqze0w2+19JtJlkXJGUUTEgks8G1yV4S1Xm+ONxKQMnD+p6dSb2uzqbPWsz8q6cjzHZ8AJCJe WxUNntnr7dh0Bk/7CXMnALN+uJ4/jYZtgEV0q2Mr5cZa4c7RBAYbimsOfva0NAaNFUPBrEmNKJs/ WBZzT2oC59OzvbZiqTk94Cg65IlVRk7Y48d4+A0PJ6qVkqc8v8mOgHSvOUU32AM7qUIhuLiACsI8 Wiar6D8mW6oL2BsqBb1o7knLSLqXrGTC2wFtPm+UWSkgZUXWobzUGHLZDAE7qZDkUcoGLL4YORlP /Sb+Ensl1zLB0QYTCKZ4oqVXSPkKuDZap2xgbtx/c+Q6rCzBVceLX7QMvXqcx0gEvxS4tnwdlYHw kskhT7UNZsFcg3UA9aMvnnT7JiyrCC1byP2cEB63fbaGzQx0IQ1GaTvxpinlU0ZSg0G8Cf3EspE+ hvevA0n6hDQ/nCw6kM0rMirpWLALiSTlYduzO3YOSEXm3E0J6grGBVgmdTKJthf3gHg2jSq59vlb +o/PZNtw19ICTpVp+eUaJOGrIreUz0aK1CdX0Dm4gD0vojbbT2BDDM8CAlGHghfpI0ZSrOqUvc/L TmPwfRNhaNUadPhIfTGEHzyh8ZBoLvdChGQODu8M97lJu+xxxwuQn6vIMWvUxvjbeoCiXLQcH0n9 0sGG9+FeE+E6I1lzk1wX5dwYxe1TPlK5H+BVkbdRnWM/01DpQXTUcwPUvTfUQezBcBuLwiVN6ZVp U59cf29EH3g9huWZFDw5UcpG/x59cXR231QOFVRT19W8FsAuj3YoaepoPZquJ9be/ORKos0HJmyD s7bZx/MssFOGkrSpjIW4QZw0rmy/YK45x+dgByvnrKPfbhGxmQWom+i/wt6wCo5KMwap3G3rqYfG UHkl57RQt/rUFtjkFXJtdt11RD4JnG8dB1s4rD5/ZsKkBjwJwysDmskQEeMZ3D97eKJ1aklnWoKO aFRlh5ymC/bqPfafeQPuL4WBVXqkvSapW8PcHDZr5+uzbIZ43yRGp5tYR90UDKhRFP0VARWwXGUl /bsiL4WmOfia863mvoHhEQhs8z3Cgv3f2Zi8fgvIDgCJsilaiD/iFv9uxlO9xx0Y9Vxa5hmhcT1+ RuRQByjzvAbYWyaJ4tXWIOHFHUJtv/wISghKxeSj27dWCZdvxOqyrqeu78dPXgCuD7r/5D/5d7u3 b76FsJArXCWsrv+Uh69s4gAiF57LMIq8WZOCV9938N749vXN8MZZX2+O0dvld/3Nr/eb6Lq18puH 1TsjNN5+F9ypkLz38p7IRR/HQp/mNcXfeo4vjwk362G8IPw7T5gHQSjH83SbkCOeFBMdb3z7NrQD OOoos8X7N7rfxWP32c+/6D7+819j6Wx17zqHCMtse8ZrGv7BBLtLJZYGPnilTvF07yFwTXroANVP oRsYopvFCFLxvkud0E+/etWiELayxtvK+5a2uRiolFHwJDDKlQxGzPjXowaoyr2V7qHHWv6vzWHY IJZQG9oYwuQhqzw04SHHVbqL3qk0XtEzZWwzHgL/qRJFekaL2tnmwA2Ss5SHJV5Dv8fPBSeo0Kr7 pfj5tWYqS1i+86VZ8cpwAYvKD3BuaLSqIBTInrCygE1OCKVdmZWNQl2gocuszUqsU+sGX1zqXj3d i0dXX5KK9MXGy27j5avu/PZankFDQo5m2vly3rQ/Zl/bWMV255O4n+SvHmJsGYKeW0QRppse1+Z9 vQn67WepbJBGGTZS4PqChEQGGCqbRMgj1UMtSNUbEe8g31+AD3lq6UNAqbxfK53otVSRZTg5h9xc a0wnksB8H5AgkxJNfq4Xk3nv2xFXU52KHqgAEh52dwqs+I61U/3JNuY9wfUl/+p91aOqvpjHWzFL cmvmUI4xPIUDxsmEUj1sArQjhLYHz7J2dseg3Ji8h9C3Ika63zEGq1Ae7lkfGU7pJGM/Z6KrGIVb yH1pFDjutlOWCtQ8uQHEPhfXj0y9tqyKPGIugsY6wN+OlnpW5ctKr+L4lC402Yv5c29ZhcWxsyyY XPQZxlNgpwEhrSHMGznVzKkoQ0PO79t50hDgK5wMvr/CHBtatSrI9gsMa+cT+tYsmmQL58UzgLLe Vr2TrmY9kTZp0EObKAZrS+65XjzfF2y8er5NI9Ed+NMoYs59gVPjwGYjerptJGLZReZmi3W+cXjQ reJpvA9ncjnJstYcVq6aRMSEmnQV9GsJL+hL3gW/yxWWN5xKBtKrvBXHvpeILhH3dsRrA3nIQz3N VjrQ258ul+5JOezRNoD6WMXWfi6qmx7keYzQSRO0pM8xx0Oqt1i5aMgmkw4zdmZFGKlNUkYKiLqm Y+xrUBgGtzmUj2NVFPbHCbQbS5lNsS5vscfvQ2P87PFW98XXND/r4Ihi1C0yfkZt4rjQUQEoNrT9 Dh1UrWdt3fRjZZig1uYnPJ/AYXapyloqrdJl1Go4GPTK1rTAYmxMzFJmm9gd+k2FhUpviOli0xoR KA9q8Yh8CX6bHhQrsH8cB0uPbnxNV9dXe6EFrBARrco2UsXs2lky8IT+AjEknaiUv+S/5GY47Jan VCa6p8qjHbGsnJBX5P5yfZgrwhozgjckwT462q7MKaGKPjCa1jyNqSyCR/XqySZipaVv4kC6YA9M oA8vSZjtQa8ee6V2yffmwUWn2VhtD53o/A+Qkwg4/iUqt2spS8afHg5jJNy6Jt/ozBevdY1rqkXE K9M2fsB0LJ6mwv37f0rftzkolVPC7rcC5tx87r/Cvz06UUi199v3U8O9ef0r8qts16FRzqoaAw5m /G0wZa1vnS46WqwQtYSz7R7HLmF86Lm2sc6s8tDIn2uSzw4ById8ZgnPRcoTuh9OeU6dGkPals+s 0hTJZHrkyxOqVK1ofIWKyDZhrK2aJJd789Fz9uSzJMBf+b00kZnqvvX+nW5unQRGOn9ub8NaQO58 9PHj7qsvN2MU3bqzkm6slv070alCwu0sMsw9Y9nJe0QjBNYL7Dfrd7tujKqb2G2SoLhRD3sqFhmt thJb1qi2nRHW8lyn+6ZT0s+L89p3aHM+sscauL7uWR7N5XUU6UZs85hJDhJ9vXZGv7ueap7K6+I+ UvD31I/2FRWIzxM5WvLQV5AjMmifWt9/9fPPuv/u33xExR+M0yUySVcA2O88XOueY4U+J0Txgtce RbAttbIHgPybnxxTn/klpeQQWHB1Ls/2OB3C6e073Y8/vE3mqOCkbrwganmiA7Jyv2W5lQlfIVkB 0zjJEdkoEep6SZTkdcOjzVM7oA1SP1DX/hz9+rdtKG/CU/xPfD663jeuK+hggCfSqcxWvFj7NI25 wSI6vE14LAqBgUboHwqOz1Aaiwr9sqoMRZlMMINVeCpFgMW1sAo3cI0qCnz2KW1EBeg7evvwUJko oEWqIJ6iWcKY3fmkLSBYTYbaYT5u31uPsDVsuUr1ByuFTAG4v/Pdh90jmsoc8n68u1IBWLFTg/Ka XalUBCWGuDNVFYop3nDzBitQA7IEf+WJkZeqBykJFmbKK8AVcin3UzMegZJ/y9vTJ6/GKxMybL8y am3EuOrXRrwcdUwEkfQGPVsmpvlvCyFr8fo9+V0pZaZgYQ2lWUoLtQnGs1LwquAmJdnS+rDkBSCw 025V74rFnbGmQYLd+A5lEy1xx7MYmj5krF/RjEIPsbxrFb3ATB6rpbhCZ9fAFBwL5lWsCgQkhNxp PQhzcHGl2h/Y2hewlCRTn4FHlN87aIKi2gYX1zpd9hw1Iwg8n6XqBBRyf/PTvLdWJ/GcST602Arv L9mFS7DH2lFgPn+6mcoWoZvokTZxTI+fc8upzhy3eOZMDATaJBog9YXru048Xs+ua0DjRiOGz9Nl kPesY26jHo20Iw0jvr+DQjZqswKYlH4x5HqzjHM8yrke39Vrx/Vdzyr2exjtVijaJlowCYC2yk4M BG4yHdgQBeeEDoQxU66X8C+FYiUfUh2mrd+4F3225gW1Iov8Xz0xGlwCKMPbevKtgW3NZZ9RgR/e q0lZGDaGqFMRh2dL6TRLQjofgDjbVUv1kGdoW+55onbSdowkzbKuVvDuuE82yNaXez3B/AphF1BC R6yZI7zIiop0O0SWaEQJ/I10OU/WYxYczXBun9/2xnJeLTnIAuWeGMfUlsbQdg3EQ0/LeKgDO/Lg GYskoHK/i6xLE6SNolzhLXq9x90vKg0Tqvo1yZrWJanXWnzCeTPWEd/8n/JTfJK0AAD/9ElEQVQg Coe9h+MgRibRIrt5Clb1Glt2LntcsO6xUqhCIyjHiXoo9AM97RoqUo0i68VEVCJi/KcG0Gpw2Owz dq57x0S5bcTkypJvMSqqSY73KiUm1SJtTgHIs3rCEgabOslSjJ++2goomVqGioSxMU2JTukhjq3R V/mtW1Zq8JyM65JlIHkdH3lvVRM7dao5Vx7J55GSxMNYKSmeKZ+90RLkXPvcoQJIl4vhWqpHWRXA mH9t86ySroTmcOBxGmQcuE+LKGw9p4Y6tKkbNiUzUd6TZD8WVc+st1M8EuOOu6g53ukmR90TGsYB pJmU7D2t0HGpjboNTYRG7ux9/rzb+uxF6IxLt20ngtxC91eiogn3erRZC9Zk52snzM3WFzjW4Pwe E11Yo574OjWPc0p00wgUuYaUZ64/9kfyLs5MmMN4xEF0Qg7KBZW0xrvVJNpNU1no6mSnaCo0sXPZ jRLswx8QPNc/BXgVAQ0T9J7q3rDJ+w18R+U3RVOStL5/HU70f4w87EF27Vi/24DW6/D7a3Dt+TUk 1JWJ+hbNSdmt/NBALj2qjqqcJ5MALStqQvUA2pkAUwP//ru3Iku2MXY8n5BUD6jVmi71GNsJkWj5 beT6O1QjM7nXrTB0jUgPAci6fl4RKX9GicPdV1RgQv4ZMbwEVL9izF/iHbd60cPv3OkevHevW/rO 293U7RvheV+x5zSIx0lwnKVG9V1k1/1bN7r/16s/7X7yy6/YO6hMOuPOI88sBSwdztKiezhdqMtT Zfj0flub3efj/nU0metg7oD7YhHaVcrsKacF1vFMaxsW5olJ1kcgYqSW4+c3wHXLU6i57Y+rqW6L sO28Nv+jCS90OloHox3qmlLelC6MdzpOAg0p947fad5wl1aTZUVFKceU/TIOmdtPqf71GTp4QP7M 5L/8019ipdswBq9ewvBj3X2slNtYU3rT9mh8oVCbhruI24+LU7R+31akdKRjoq3RPE69UcN2vTHZ CCJRvH3CTDixCqNg3UqQCMHdsXEoDBkUaaZB9AJ+PkCvUH9zYN7YJaPt8yYw78cy7trRMflm72HI gPeftdAobyUBUA+K4WUE6uCCrFmUm3b7il2K3DAqv10TcSzlheA1Q5ZxmsZoGVhnWI88H0zTBXCZ EmZO1BZeCSutLAiAWDzkJATEpwiMnDy+o6dTwSj1wjGbBnDNs6An0nIZri4eqgg2hS8b9f7797vB X31Chq71qRGOzKPrMuOpbizXUz1p701o3pT4AfVauL6a5Z0kRvmmbOhzwQYeSL2khlcn8ZzYen2X sLaXuLhUaDu3FbYPyPa/EdDmGEKn6c5niDrJPW1W4yJrYXqfXyMr7khrFyuk9bK6SARyjbsfIKoh wHsK3TxkKb4Ab4yeU+5XD9E4gMB7ESCnqoGDLOd1HCAIwHYNq9xNAjvhfI8pZ2RyqHQNq1tUIdp6 nlwPhZYuZXqtrDsM8NK7P0XpswU8Co6DLd/16Nu++hxQJ4/QygOW7Sv+ssZnbVqNFb0YcwhBDaxD vGjTcCLN/j442IqC0vq38owUmzQlQQGlWokZ5ACIA84/a33SxpV2PYQK0YBxwIFjzz3EQEjmeq3v NBzqLfi2BRxPPR16EI9sN2y94mTzC6jYB+Yg8NwHdlyTnuC88Tx6sF27VtEQaFrvU4G9bBdRvq9B aPvyOZT2d969mzD75x8/S/kvQdeFzQaMrDjv4gXOJd8zEkD557r1OQQxERx675yLSNVSet6L3nEa aVuyzlWm0nIfa7RZfOfoyEo4xX/10Z0ryxB6Co1Y5ysGgbjFZEXG2brZ0m/k/GoQ24jE5lomnTq2 0jQsQaoH1ootJmid7hHmxZu0At96cdmESvc13tl4gpEhUrr47xQO/h4VGKSG2YHxzIpNjNW0lRug feiFlGNtdDAdwACxVojRmPj082fkb+x2K/D9l6HYyI3cxjAfco20aXc/c+L4V9QdKnuTqQTADleT seoPy7gaNZkA7JV8hpMecG2SMKDUfW80TaPZGvhMihjZveVziPGmG2VEgKHRrKHnPkjNXmvns0mN UB0xZocAPMduBs1t1aFjohjOi8BXA0fALQAt44/5ci8mIXIcsEDUyeicjhnOYW1037/78FYiUV/v j3UbO0QP8K6ZRDvNfJlP5D503W8QUTxEDhywIEzWtSnNKuDBqItz7LqSLpMxxPOvl/7URh3R5Rof 7i/3n7kBygiTNTW0VTMaIY6RgqPW5JlA2ugu5zQrQivS/WBjJk3oJFjnnMgLru/92hzKhm3KP8dR D6nG7gSyJsaq52vVmEq2qy+lU5QXN/z65rhIJFCExPidYYztP9uE000CHDBojryhK0rFSZvbJEot fW2WKIAVWyZJuNNYkF+ub1rj2k6Lj+juZ7T1LqAwdCbWelWlKQOs9Ekr1+f+mjK3wzrPrBcMx72n tPJ2beA5NUH/Er2Z/JuEoxI+cTHWWAvEzKnwvXjrNAZ94gZ4gn0y8G/o+PboGf/89Go+hoh/955N f78m/OKlbgeHX5mNUt8JXSDCKHOuZgi4NiKZxnpN7ppI2PKTEqdl/KywsonzxspB5oXMLVUeTl92 dUoDLoZtAU1/NP5Nbp5CJ84SIbiFY+8WOT6pdMSa1LGioW1UeWaI55rvShEzGuoc2CTpGXrkKU4M k9TXSMK++dZ6N6GuomrWOYqsOjhjmCP7Jp6+6MYW2Fdzi93q/XvdD3//uyndeoBX9gCe9ox174lC mhexZeIe8u7mivoBT7z6hmHTeTGDXFQ3modxYa4I86N8jNZvU1wJt7ynM0E8oBEoHsgmc07bgQHY ZayOJtLh6eddQRYjzDWQN9t89Qf1k+9n16IeNaHtpcIRuLSXtTMLOKVpTwHs9ndZd3X9lk+BcGGe FsGFi90dEjpvUn558uPPn6Qt5tjYbSx/GqMoyOKJdu1NYJEM4V/f737wO/epMQr/j5v//MsX3Zfw fkxa2Mc7uJqF3Vd8qNsdGX/eUjZdAZ/6cQGZ/FJKv8mEtsCbIq3dU2Gt3qIZfb8t9N9GBbk2BW9M xhvvuwnbxsqY9ZSVBuSbkEzWuguPhWyG/hjUjyuqfUjR0Ms3RzhlDAvfWqJ2TDsnCWGHpiGnR2TO n1MLGK6f1Br5l8sUbZ9ZoqUoEYAvUmkEIYbl6hW1HCfwghmOkOtkotGkJcK8L70vWKULGEDzggEW ouHSFTg+q/dWyrPA/d6AwzYABG1RW9l7DvWjySJXQUHZWkjZ7OENFQBO6LV5ilxbVUGiETe0zC1H p/cIJS2X+ArAOmVLWhRAyk1Gxhh+VKGUF9sxzby1dSjgVzAlxK6ftlmwkVuuZ5N6uGEBiEomSFnj y+iBYdQ8i942aSYCv/KwJ2EvFzHJryoRxOOHQpy7NYdpb7mj6iZncwdrMtMJA1CEt3V2JSEzx/AM HpnN5z7DK/MVgv89QJHrdEQ3aYrDG4nyEvAy91rqSYK2FiHHbBP+f2G9XTbbsq2rGSND8ALIU667 mG5stfYUpLtbdGHU28vcWRVEj4aeDCdvj7JK8qg1rBYp/O/47TAus4CoJL22rn1WjXFsPOsSDYUE 4vGoZF4dR42aaiOb8niREYyJZdZMVtKr7XowtMk467WzHbS0Cb25C9MYkkYCWH8nrYOoyXVXGB96 L5a4R5OVpMEo7OcoceZ1TjFY9OjfgRfoM1zAt3Qvabh851u3A8S/xBO2xLN7vOdX7lSXUL2eJQpj fLmWfCanWqDggpCTKbBuryhinvGc4wTO8Qqq6A1ty6tl7/jeESBOCohj2leuke7l+CTiYBSKwVxc xHlA4tau5fAYh5Ryw2gw4fIMr5Kg9/Zd6vNiFH315fNuDYrWrgYSBu4iCsj65LMAlNQQBvzuYFAf URFCSkc6bg7XM95Dm+1Ygs59awgYZTbDGBh2vZrAIAdwHZBAHm6zexeFr4LbZyw/JgFpE6/UOjLc ms0mohv+vWGjHD1CkaEapsZ5TFczX6CqSmR83OcCAmUxnw80Qvwv44EXijyPqvgi0KwycRnuhO5N FsTjL+WG807BPbQrqmtRgKix53qeRclabcV1ZpWOMZ+Xc9rBM6rQewutsAeupR9yzZi1JVvUTaEM MU/PoTScsH5tIT9GBFSgbffZpfWV7gEy5t4zvOBHzzNPB9BmBIUmYC1YtpLzaX6t4HndBVA43+5J Zcpx1qBGIfPMXE+TYJtmL+GNm2NQCWkG9X3PrqeWfpzW8DBypgwTlDuu5oT0el5OdUA7bxh14Psm oO2z3i5Q0CYin9kSGyPkhH0zxKhSvx5s73WXlm1lfpVxkWOuAil8mkn8a/nVN7ytUZ3K20x+9LhV Q4zaGZk6RF68/PJZ1z2nRvvMYkC0XWm3qH71lHJuN6g5vXpjJZQrk4L1ou+9eBXdL+fcvfA13jn3 8nu/85AEx9bB0bXTHDTx3Ia61+S0zhVmM6LPqBz7ZMB6pYx50fisiR7bSaOuMEB0hPxcgXWoYk2h 6b1v4HOk6Pq/R3rezdLjhIYl8mcbl1zAv3uQVPI71yhuVB2bbNsgvt4L2IC1cqo0a+V0tHwldWcS x33+FiniPTn02+CGrRe7MeBn5ioHQ6MxjibqQ2vMWWtfmamj7or5mqLCzTLy1WZClyioZah0Onam kozgOKkzvT0iHyYyMl5HUHtPoHKobywv+RQqjvr1PpTUd3/37W4WCscL5O7Rxy+6WUD23Arg/caN eK0vTaZ89kk3vH23m3r4Vvfhj75LzfLT7l/92U+6LzC+ltlji+zzVAOyF4H5Zshv9/yx5YQptrDA PrNLrPrRNTRDcmT444F6vRNWeqpOtgLQBccKC74Gx06B89DmPtz3NocqhoBuP2/vB4h886cBkN94 v62J/v3Md3s5tgLqGK58P170tuRyPQ/1vXgjkF3mnpUTNE3FmL8p5+y7bI7cPgNhXo4XMLxoKFVB bkkV61+ruBawdMwYfusBZPpba/GyPCUMunyTDHkoE3o1nekh4CuLpgdRyYiom4puVIMGjFVpJ8ep Gso066RH5z2Y1hMQrdq/+s1SA3cdyNcTXLdy+qu+OchjKA7PmdJ3DohdsrjHdLrTa6WCUKkjSGem 5/AsveyefvWs23+63W1/+bLbBISd87xrLKTvw93TMDndRzADpsyIl54xbsk8ntDak+vDxSiz3S0q C+CqthTXBFUUvNch4boLFMCAcRlS2uYUL5jR8xt0rBoC4C2NpGW6o7cGwC7Alneb7loqHMuxAfJu QGX4EsG8AV9KACC/1MYBeuIMdZxT3k/PpVzaARSWyuBp4V4W1BAAr/f0gGYhLnY5tANCpYKOdH5E wC3bKY6xm7coPdbuFpUeDifxEqN0+lBuAK/yKclsKA+mQMDnBgvkVpkzBkmuspRty7S2/u+AWsfO rvMi4B/McC689c6H7VIFhNamVUHb9OLSFt96VmxFbbEJqR9O/zheIVpq2+RAcKtS00PWC06VueHZ FbKrC2QY4L7oHgMAn2Klvw/t5xBlt5hEuWpVrZUtQHFsDhn3xwjKS4TITQDtKfdgco/K2bJul9zH C0J0i1B3/AL4CJBlhz+MLs6b8lYpM1U84N7jaVY/jtWMpZUA7Ei2T5htD4BngpMRAxNG0qacXAeB 4qXt0CeKx6enWJAmOFUxmjWe6g9JbuGl4HBvMp5GEQQtlmp0XgSmfscR0yMuz3RVA5DvPH22kxCg u0tazDifLxCG17NrEs62YXuvAZXpfNowMJX5KFsngBb8LXEePfom17z3zq3uww/uEi48gntNkxI9 gCiDRTyHc4uUvDuwoocLA0oGe0gvcWg53LOAR4PDknoHhpkBPHbQkzdoGDvRBNbELspcT/qataIB DnPwCwXtegKXoWaZ2GVDqI0NPHicZ5+XQFHP5gAPkPe9glfNpkbjfHeKedY7pY4XfOktdr2u0ozI aITrXG/UDPJAQ/QWZTYFmEt47b3vbRK3pACZODQcribk+xVeZ+XrEvchAD8zKZHkGemWjv35mSCu OvapWKUAacDI215Ci+4y7z+lpfQTwPzfeR9lCIh9QV3bZdbNNElnM2joKQwA24T7vNa5teyaHm8N 0gWaABU9xAijyKYMvj6BLwl7AFeT6PTsCir3Ub4mj9p4RcMrHV/1tqlDrP2cNceYAUrPaF5jouoe ckvpqxdNr/2VEQXua1bZFkcLH1oVgoU/hlG8yH6yWovgbGd3O0pcUCZ1Z3iCkYb3//FL5o3krFkc D65HnyFJv8iBOeTgGvvu+Z/+Kuvrzp2lzMEmoXLrjN/CIHoFr9W1n+RRvudaESjPAmrnbKKhsYiH dYb9d+MmpcsYHo12c0hMwp3RETV72W2PQ6EEAI+zBvX4phV4+utVUpndMw8BU3bwlHcusD9D1kjv sOriGCB+LkDafCYcK+wPo0SuLfWn86bW1jjvXUC7rL2XT3e6Bx8SrbQDH7RAZeoRHspz1tAslCXX 5JXccKfVLoeWSdQA4f6cRz3RY/LXKfEqVYmFmIjTjJ3+0Fd7eFj1pB4D1E7tImoEhHmy3Kd/W53m YBdjlONsHmXZtxPGS6NCQ9ofaVdy86Va2bQqDhOb5rDGrcB1DHVn7KNP4ZGjG8ybUadJd0FnaQin fncwroC4Ad8AHV+C4QZ6Sum//gnw0e3TPNziipSx09HA7y4mAXMwhedvZnzK0/pGPEzZEwF9NisL ZvE9o0floZY25xzZPfIMr24ZgOaUmDxYidJWy8i5+I7Vg9ZxNKyulC71OeJ0MVF8gvKtPL/VrKZu VKTiCFmnip7VIcV9DG2Uxf3Z0KjHPd5jStJyi0ZvlH93iAoeM4fOx8KRNeDxqqJDb6HT7BYsPUcq 3hClNL5vkmXVljdJ0XKIM+ypMYpUHH/2EQUYVrv3/+DDboamUJ998mW3SQ8A8Yx9C+xdN49+nieS aj15dZWVReZYbybWz2j4tvyZ4tBnMkvX6MB0bBvozlxYcSbPlsMaZuyxI2/0TudQyuINKAPK+Y7h 5cs59L3fBqr7E/jZtd+Lz2rd4TgymMD6fuao/esa0dDyuKw3r8G/iVz6azn+xBm376x3d+7d7CY/ /OBB2vgmcUHQxQk9j0lMRcaHxoCHSiGY8kgKTjbdXVp4u0B2dhE4WFNWLyA9K4vOq6Vcm8IlpqeU AYGdIMbnaiCrbZzUtdcck+siyHbg23/1IG6k3uLpRz4f1IN+49eydq7vNgekJvb1T22ktCyVeuIY moQXpG5Wuq1F7b6FkEcKbgC6Hn1BJqicNMZjy9rSXwPEGIszKg3cgCYiUX951RI5gCVFIUKfQDcA lAxpPf2cepsKLO7dacCpSt8EvhWE9bk3QFMFFeEJSkbjJgl01joGT6uYDqDoTJBRrSfIUi+uj4Sj BFU8xwNqBv+CzSUIWrH0DmN/gbdZb7QZwk6NIRvnUM6i3acwmEMNEDDMYDzpWY7SbBa0t2XpMENK U1c0YkCBjOHm0lMvkJXWsEersSt45ioIPUuewwV3afk/B5xnTBiajSOQk8NZFRva583DkES7NnWp 0KLHjFrMlpJzz1TSJaDYdtex2Kt1uF5Yw7u2ARZAjxkG57tnCHfbSKccmMmYVskIhuAiAkxL5gjG FZLc8ARrUKrLFopjXE+tXk/3Ey+9udU5ymoShtsJ5QM0FgFM58yTXiQTrowiDvEqnjEOe/u7STJx 3PVGzAPSJrlfObNpMoTAk/Nt1z/riB/bstwmPQjFAB1LFHFxObz7VKawO5+tU1SMl3bfSuiRNaNh qDp3PRQlHuVaVRys1+x+i2eFG0n5OD1BdgW1BjBCVvqHIezyHjRPpsqBv+WWH7PGDmx0xDHet6Dx CqAxNGEPQ8JCXqcIVZuOOLaGJFOnWE8G86FnfRnFYlh7yNg9oLbtGkbNlyjmScYzbcR57vnZRbLe p7vt4500UDLcrKfYtRah7H61Q5vJfSo3uvkZSbHl+Sh0K/+NpC2/e+geEOw169tldmm5QHnNADtL VxqB0cskhxE1h/FTVWQObN6hOMLIlfs/g2GUKijx7EIf2TnGu0f1JJ4vXnrXGXvKezGhOawKDTv2 TfJN5FMDwBbh5S/gAd8AID3GWD9LRQv55YAWvNMDu0Gyh1VehySYL2JYy4ufQb6qcOOIYJ1vYgD/ DM/Tz0je2+E530ZeTDsXU/D+MQSsP3zKYpjkHs6IQlgdRu9XGVvmvag7CPtLwXEfRhf5f+7BPizN 8wjyrTxjLgj755yOmxrn6gA79inJk0isDAktyYTuahDhua1elEZYnNOQsQmbJhGntKXPU6UVAhyt CDMwIVwjgGsdGBnBgLA6ldzNSPFQhqSUHKca09rMrcx9uK08xBFzZN7DDZtmaDSwR1YYF8lLm9aN zjwIXieohkU5VfalSViC4h0At2OvglfWVBt0gY4bwTnyVYlq1si3OZCy+JC1Mib9LDIK5xLzrNFx gjyfRAYe6sFU3HKuUxMy+CN5GdIk+M6MkWLGwDrb0rHnrIKCbLPajp1ZQ9Gz5rcnUa44JkQ7h4Do CdZwJpP/uY9D22rVGSoM1JSjSaE4DazSc84Y7fDsS9D5pHjZQTN18z2GOTwkmjb7DB1j9EP+GOfR cHXta7x4HzOG8hlvy9Ie34Q+l2i3CcCsFTsBN8O9KIhiFoC2Tjvm7ZKHHIi28YiPPWaf25X0wToo EicTz+zeUcbGq9n0R1zieZQGpEp5tzV7Ta3nPYGXc9aAUH4XeDkJKVVRQD+gWnXfhLyD1XvqQg9Q 8PO9fD/8xQCotGIPfTK7MXS9NHNTr1mdw7+NxCTqXThK5sK0xrsJpWIhxunIJE7Wp46KLG7pdozb kHu0m+zQ73lVkuWlVywhO6SLTqSTrvqoIjpSiVxQloXUEaGnOFEHo6DQembpYOt51denrlXGUq62 zZeMfFhn/+yEii2W+7y1ju6bp7M0/RmQz7NvP+xWv/f97lu/8wGVSZa6rx89637+68+705ckonP9 Fc6/Dv67AR4ZuG+zL6q7pwbTpJVo4kVSoTmWPlCPw64DXIfSefOJg1YbhGtG1CiJ1RMoXMVvUeb1 8vxVnqa92txmA+QAXr0rt72XbOBGA9H4ss478q0MOS/Tor/iASNuWSdtPymxoP/qtAohnWeepMni ApHwd6FK3aKe+OSCmfF6EpvidRHqpVTgFmhnUvSy8jAmWrkw5MWZfb0Nd2iZTWDox5/yPrdnyTqV h9cStVzXbUwLRPWbozGte35NFnuNRYNeAcDNTHkTH1/bU6MxHL13HUhfB9r1viAtTTksXcaAniPA z002sUQRXpMTCOqCm0k0wmcffdn9/C8+Jllpk7D+RPfthze7D+AtvSArd5OGMNsIrV28S5YZW1m/ 183TIemIiZKza7k4W8f+6i9/FY/HMTV+3YByec8I21yhfKUQTANs0axJBNOrfSaXlbFVWRiRnMab M3QBzxCeBsgvYAEbZjuwhKIbffmi+w6861/9/Kso7ng6hrXBFRITdtDSO+RIIvj1eutZdh2l6YjU AIvcWwJIxSnQs0oK/x0isI/0VI6RuqAXWyABR0/NMMUm3cdDeQ4VJqXgKD5vePY8QhUFpbbgOlIc kuiYvVHRhihmaSABTqVgQlfJIqp7i+dbISLv29AqN6hMszi9zgeVblqqu7msH4rA0EtxioXtBqnu ZZ7OsJoNegBfgh3av6IVw1uMhz/Z/ig48gc28Ki4Sgy9HzO3eofNLTC64ZjrrbVyziLrRQV7iAd2 EstdICKP8wiwiGs/wFl5cgjInKZl9yFGzybVDVRCdpSbxDNplvwF17Z5zMSi5UeLlqDQmwiQs9un c+KYqrxQfp6/KVTB+nTz9qu89HY7bql0EaVuxY3aFDEck2wEuGEI7BZXxkwx/Py+30kiJINsQpjn mcSbsiJ3GCNgCKhUIZxCjxIkneFpu2D8U4GDfRPjic+N/qzAZ/e8GhbugQPW/hzCd4F7lHcoX/sA Bevx98jzmA/IEWQRVqMqgopDUGF1C71oAotKRKyENz1i4W3qGeMzDb1LPNmqpGkpHRoFeE0FdRuE Rufx2shl3yQ8O8+zLDCOhnDnbXLAHhRYOMcXzLf803PWyKq1oxmxfXMpADQqfEFgZIcVTHiZhLdN +NVmCXMarzzzKzoEOp77duri+HmqWEijch9ISXFtrqOsVJqnGGiff/IU4+mou8MYWN3HDoLWiR2/ CZ0M4GYi7L5NRvjePGHdjwnh/+tfPupeAaxtQPExCWILGL53kQ0qAhsZxUcUfeU9S0eq9RsHEs+a WslSDlIyqxmPMa7cd3rcAD5EHIxIXu2wtsgjGbK/jVkf4NHc575XUKxalPLA3VY6Is45V8+7jQ7k uUOlYjNwqwGnyprqPKq8F7Sg8HV4WopM2WN1BJS+1Q/i8eLrR0R8rLSgN1kv8LNPn0JZpGNwKqkI YjROWfvM0xLXfJexe4ZT5BU0LRvNqBz3Gf8nVLwwj2HnnJwBrrMGaKkEFf5OTolgFX1nNRbu0QZI Hu98OwEaPiebAB7XHvO9zDyqtGzoYdfKBRuD8IwbifjGXMnzHnDv0gTl42uWmKyWRMeDqhpi6VML u1xRAck1oNc7QII9POlx2ZPkBODZXX/ndjcDFTDeNYoPjGpe26gImXlgXWL2rc9xtvEq/ReO2QtD hMljaIk//4vPug9vPOhuDqlsw1ozSntqVSr24mNA1WOrXEEFeXhvKZ58dUxyPPSOMlY3AfbHzP/H H38V6t097sfypkZtTLoOuGNtGR5XFuxJl2K/W+HCpmip1ibONdKkMce92hrcLpQllBqQiMxqoKB3 sPUAuAcUfjxS8Q1cuYgDfh1Q57O9lJupAV16MWCjydJriC6yx5fVpTymKq5oWAmkBc9NrnLevt65 M53iAUniLDla7EapA+pM13slvap/c6xe655Kow+Z79r9eGJ8hXUEF53Pj3BgmheQfhfkvrmnU2ov EZtyWAYrCdoDLSoPRsfCCSVzzeNJ6UsNKPDdHHLQLriOjl72dHq18/AFuWAY7efmNZiQPkMTKx9g 50VA7zxe7PdW1ojGLndffPkIWbbTreNguE91rdk41VrSbxROGSqJ3iQpVMuzzUXAc31ehpDvlx7K T9NJI5ycv43gtO/03u5wX9t7rpeR4eXauQbc3wDV/fte02hGRRYq4Uyl6Npo9683R9DNeu7LWhox 18sTOqEOSx1NUbg4c9ARGj+WtPSt5N/L83Edhh9lWNrqFSgww8ZuDsGWwrdv5BCOf8LAhPzwrOjp MfkowcGmyIu3Vxw0/Xqa9aOoS8Gp15SobIBSphnQbITXHuy8KSDPcfXd3/ozevtv+Xw0c57fhS/g lA6CQNfLwUISDOl9DehU2DEe27TFPsBC18L0sxnCeHdJKjDcaB1rgfUe5H6V1UCuDUrWhTZASSwA uuaw0l8YduQacq+kN0zo2ZdjmZB9VWiQc7uMFT97RAk2+bSGjay7zH0vQ5LXKDk/olU9Qt9kATmH Cjx5mseA7LWba90d2tXvcK8BIGdsTgGWmziepxrj/KdwcA3yfsqwOafcQ21gktH0quu5URHogfN+ nTeOE/xd8d4UHkA/T2kqF2eRMTFIBPEFrlOKS49KPB7ljY2ni3/zuxGLfkNZzeScFdn2URIyUmtb nqae50owShk7OdfJOVBYcj2rAOAJViFVbW/OJXj0EQX64XXyuxn2ykvra1tBAqFlBvVzFIxlsKQI vIDeIR9Uz+YJFBvBi6HLbP0IAJMty5tnso2tqAeA53gTNCY9jP+zyoTvpbqLihXvjVnfeo6lyXgm +bV64QVpRi3S1lslZCml5rmRNiFqyLoxuYd7sLSc4yuoNVEvJe545jRGkecPMNEYETDqUYzR3bx7 fk8BIAf9dQJrcXFDD+B+NKa9Hw0GKRHTCOQ5eMOzM/tpVXymx0uwYjMTQ/wkRV16Tn4XoF6iOU0U TVSMed1Esds4aemtW3jmoDSgbAOumEurM6yToKvS3mV/OL/+qJSl9VxAfwHdZK2lqYgKL7q3DP+E nbluuMMVpgmQEvzsAHCsW65yt8OhYUrpGZMkvBYnWHC+mOd14kyytAHRiU0ACFOu3mTfcTunCk3D nPyXqg+cx/tzHtwny6vkRGCAaYQY0N+FMmQ98mOiGxeCV+bzAEW3B23Duq9W+lmwUg33v5s9ythz 346FJd+knOGYT0RDAKfR6x6ahPIA6useEQH73HKc3MsUa277AI4xYO2ANaeXcNlzM57mP1vaT0Px CvrZOSB9oDGOl15D0/m2brPRgbSbVs80mVFBb5P5ir9uJYeU4zRal0Q7a9lKtaqogv82U7miUk1J RemWVR+utt7cys+okpGVk6M+sGWzIFUjyVreGFZ8Nt1XF1HXSbvQuOU8XwIS3/3gHTplLmdPyyc2 Y+4YY0dj7J07i91zuum+hB9s8rjULxNDv8IpYmdQPda7UGp2MfRS2YJxWWR854gSHBA9Up6nfX04 0TbN0PijOo4hd4GxlBvOYSUSIx/H5OUYJbtiPSoDTgRn/GLZRatp7cboJGcCGZvyi5EX6ADWYKSg SW+hbvA790Khp3LQCcxcc8zBPrz9sXkoS3dXuykArpnJVpNw/OW35xkByVJkjKpIAdhHhh0RPTrf RSdgAO+zNrfRERsnm90y9z5FKd75mxibJKutwMH9FXzsX9JQa/DZePeHH77dPSAJLjrC/eozcbFl xukZ5/7s8XOMLqK1/C3FyXUsFUTdNc84SEdQV2h0y7P3WVPlRUPYJGAjEgon/hVgjwl4ehzgmnLh OFZSG+OJb86XhqHfxAENpJUErmODSRqwznps3+/BdY83eu9cqAW1JnsAZcnKJGjyr88XfRpZWg6i MjqKRps67IJVTlMJnd6za7Oirpfonz7ZM82sYmhW465LcIAGirLbc07fgHplS1/WXEmeAp/qLCME fXUt7yJe/jynj8ge0ZhmoHUQSD2Nw4NE56MJInLmHqG7NCRdw3NQvPziPvS9DZrZXPC9ux887O59 +K1uggjj2QuqxCGXB7dvdlO37nR3334HOhz5ClsbwYQmqMtbqD4Q3iPrVceaPoTMYTnLRgZQLI7m EHN+evpPjBznR7zHK14A/22GVvun8KCvpo+vG2MZoevAugHlvN+iH74VeSUG6A0t11dVIgrAzjpR 1yK7pFRJRcl9FF7JYxERNOJavQdse06tclkeUGtsijZpC27D2fJ+0haWE8f7Zl1eFoMeSEO0bgC9 1RLj/dfdLCDdO2QxsLDmF/QuNouh3Xy/GNKlKd7nRr7vl0kbgyyZfKcNZJn7WQQZx/Y0IcPXiOYB /7YfwUb99CD7m2C7KmlEn7as0HGETrpNcm45sS6OcZUKAmSVhfC9tymVgwA9JDy/Rbe/RbxJy+uL KL4V2o1SDQDh9YISOIYId+HgSYWXV5bccMZqgQvqqdv8Gq42E2HzGWtlCwCs3nACmB4A+E6om60H Ia1FDcWp1BRSlu7ifk/ohKTiObUeKRcRI+pJ3n6y1S2+dS+enEeDJyknh3SHA86mcuM3q/CC+tka COkUxjBaCsxNbqa7FrdeXK/VETZ0PIaAhWMX4ak1m+Xin0a5WP3DzoF6vWbZaLaTtrGKndBsEqFH Qu9M6nSzADU6kqDU7wtL7QmyEzbiX4UZ6yw1kQVLKimBebwLdqk0qYq1Jv+Pe1apqblsYWwW8rTZ uoCIYzyqF9Iqso8KtGi4yEUO4FaBMzSWC/e6QyIVS0tL3TQKyKzlIxTBMxLRXuI9mOeej1BqqK7s g3jj+a8SAC3TyISoGHMy1g3rQ2Bph1MpJQpAGczWe7aqjGG5pSlAJIIvIVfDfpwjHRqtYa2Hj/HR MFJIz7JGBMZ29hMsXDBm8nrlBqP6q8aogpyXBk6ek/tJ8itezJR4c63Ik2Q9CAjizTZygSC3TrkC RlpQuqCZppX9xlhx/yrrKWuk2unNEnW+x70YgRnDgFQMCLIcUKkie3imFwBxN6j5bAKrzyI3022r z3SR7nvvv4+3DB70Lh7FQ4Cvz63n9xEAag4l7zMIOPW0KmjVqeY9xOPuGDTuuMZUkgsF3c6B461n n38jt+Ce6tiyzFiy6aW8mT9hjXDuLy3NmSfBoXNxIJeZlr5VtowRYHwMfwdYJvKip11jTHdbzdGR dX7lW/JK+URL0/FdOYdHk6wfgO5OvFVSX4haSPXAmJpgHozoGTG8pLavRvw6wOYUoCQ9RCPV8pBr gJYzvNm2051i7qe5/2Nk0a8fbXb/9M9/1f3Zp19VZzys0UdUfri1+gpvJUYO59ujpFyi3yYf62XX GLPqRSJpBdS859DEGFdlVJFBqntoymEGIBjhQ4qxFuVTZ3+yL2xaoVEzZdMf3o8c47/qrlaGXFqs ayi5b/Sq8byWmtNI8lkqQiLQLm+RNA6NSrtdKpPkWiv/pNB5nQGyUdllZRmB/c8+ftp9D4PtDkAz a1P3DtOn/J7Ho/bjH387sngDw+qK9+7fu4UipFzidq37aIi2f1JwQH0qQGkeTXmuAhQjNEesqaFA n3WnAet6Tz1nDrf/gBQ/9WCqPLkW5VQLcoxsSc3RaHGsjUIgN53fAfxxr7GIsyZNghiPfde31AqN GpmSqlSpoA0g6uQwcrlEpMewu5+55gtHunnlPFsrX5Yl3vOv6LhHJBMGIBViBfV0FYYy84NvP+j2 v9jr/uann1Brerq79XCVOaUCkF559tE+NceltXzF+M5Bq5nn5by5Rmbm0QvsKw3ZXYyVV+i+zz9/ Ghk1YP6lBliPOQZGOg6LRKq60hjr6IL7PpH7jbE5dcaed+DlfbvnVZyGJHvg5HtlmfFe7aUCXd/U 6SXvR1zYBvJCN/0NgN1jA+e65rAGsCJ4vTM7TatMVEtuQUUB46jQkZH17VQj4a0Hbsm8eOQ4j8A7 IM3FWOBag6OcUJU/Ji3TqIyyxXNa2lC9pHNtYJEEr2HJRR18cTKgm5BB5owMLCUruPaaOslCpSkg mDkKWFV+qydJrOf6J2AP5eIRDdSO6agYCpZzyl7aYn28IAL/whrmzPkdOixeIT/Pnj7P8/tsh/Q2 mSSqqyd7/MYtoujIULn83vTRHh5+5HwbVk1l943lsQL6vZ/sqwZuXRB5PxCVe9WAcl49xpP0IMF/ 3YQJPdfnWRglY/LTg8MCjHW+N356zNiAexw3not/4rV2Tbk5ubd4sDUCmgzol1iO5TjLuvVcfZNR GWNlqT0zptBtExNPw6tHYDHW7GFrtaaeMGHYuPERJHrtFHBWApAvd4wCOIigUwAIhMqDKF/BBaNA Sam3AKLmgW7P4M3ms+isEuAuvDJO+oOKP6uAyYMqjJON3kYviQs14MkwjZukf/JvAu3ewuuP+W2b UH1UXe/0nrkABghwE/X0DqZcFu/P8awzTMZNBm4dkGGTh8cM8vNHT7tNvaJ2PdJaFbwaLpYf6T1z j1YJkNzumB0jzCm4wDUmCDMLtgklCkwRKgpXW8qfHVHjlO9N0vBEvBIvut5dhIsc41RFYBwdsgs7 XZ1TuUUgjEBz8x1gcc6vHXe3oEVIT3kOX1Ow3Gf1FpdcPjXnJeHsnPBbxhJhn5Jt3L/nsTh8vA0R YnzDiiAKPuU4wto1oXfXzaMSFogvAVIuAQ/7KBj5z0lO0oOvp12DDevbcXAhWhoqlS3cpOE6M9+N JjJA4NgVzCXgdaspQ3nFzk3a5PdQLrgfs5zHodFYRs2yWQOjBTb2sB0vYdyltP117iv5pLrCKYg4 n7HXbLKqSiBgMpve6ghI+26DKMALFMYNvIt73IdyIkCD80mT8Qb1RMU612DQW8zY7QKC5qlAYWLQ HsJSDvUE6fDT8nqRhzdurKZ1du/xMIqxiKK0Q5+Gl/xQPZGCb73i81Q2SOt01qFe0wA7vpyuW3pE fIKE/KXqtAiIlAPu07J742pnR8E5sMqL26s0SZ5Eb4YkBrmxrjV/BMzysz3KELHlmRaSVAV3FKC3 IRfP7xHCHWBUyFleowHFGYaRdKRp+KZGuRzzlJHUwGCM9djLt14H2HpPes7kf67j8dUrL9A3YqEH dcKqEwJs7kvwlaYT8cRIklHYGnESXJtEo2Dm9pSRtnhm71zSxt2OgBppy5S7EwgvA/rlPAsCB5bA M8LAWI0bhnafcoze4kuBukpJDx1AVFqW696yg8ojGyFUzWPC+vsk6rGOrfBzaKk+OLvz0rqaoSqv NylsKFCjeoskfnn9qjJBdQadFXrhBW7elyCfpLsj9u68ERVD/ChDwaI5E1MYus8wbP/kl3gW4Wu7 /z/84INEDfZ2trv1myTuSSWjq7EeasdT4zdRHc7ft+NOWSwUnsmAoU1F8dUYRu84pFIgjGpx/3Mc p+fbUn177IuqeQulhXOnq6sd5NiDyiiNIpPe+woKRTMSRGj8CQIqeU9Qm8/09MW7Z+TEMoMCf3Mb 2KLs9wBY5VToXYIHvPE82yl87ycYxJvs90JHUQ8Z51Pk48XsESHrhe4Wc/0ZFTCOuN6de7fx3usZ pCsg9YSRYtHrq1CEnKmnGHx2Ku7OWVc80zJeu0OMo1dEGwQmqc0t/UlDgLXg/btvBUlptgW1T0NR z43iehmng9HIY3JlDk58Jvei9axZi4zdyZENaMqYi6fUgQ+Y1xklaFbGlNfXcmmOtZ7fFTzJVnyw QoH3Yv13Q9TZt+ypKZKmpRruEXHd+HIjXsdVknPl+6svlu4vwEOf7352+Ovup48/x7P/ovv1k2fx Rmuwuvvv37yRPRIKIhS2NdZWOKesV8sEJtrKmGhsmRv/FP67IHHWJF847xfohR0odW5Xqx+ZiB3N zNo547kcTw0Nr5Va4c6hImgKp4mWQCHXBp4a4AlHVqGnQG7HxzBz8kse9mshOCsyUuzRjm/Yoiz2 9r0IxYp0JnqeU4hZKoE6+1PetP8FXEsLqfrVPbiOR9r8l5yiHDq5lVBDCg8ps6X9TCTyLnQyqli3 6xgkT4XPzJswCV7drcF2Ep1aFBMTg6Vx6CYOFtNZ0gBhGkG5fsjJEl+wGiJn1Rnzy4C/GRowIcN2 oK+lyZc4jKiauvyzz77uPqO5jBHpH//ue917338rla72vyJ6AbZbgg8/RR1rI2bjOPe6g02zKzGU 7AYp0DcZQcEbBVN6u1RP/V/bn6+pCnVca/3Z5s6D3cACqDbvBRIL7PaAe/RvTfdv/rR10IPtNr+j hCTBcYScG8wJaJMQWkgfHRmBV95rODLrxbXkMWISKbNVrlZ5BZAK7cbuu5ZLtbDBpDwoFa/PUN6i MGErHIaisKyK4QPDZ3qstZyniVcl+1PxFF6Pyr4G1e9WTWXBeoE0F2RKPukh8dFcCBxpqSHpJDV4 Lt4CK71Z4s1nwbSxbkP82mr528Z3hKcb8M4/b4JsN3qib2n20IyF3Jc85db4gvJsE1hyQ/nRgnAm Zg1BMQ7nSEtLSzId2/BQTZBANrNnQLhoJSar9QmCFyfbeDHgCuLxm397JeMqteNgaxvuMCFMG81Y S9hmFXxveoZz75mAUBzUeH+wsrR+IzCkRVhGDSUTYCStgEPOoKfYCMEGKM8A2yklqOfWyARfM4nG rPYIOB7e71bFFD1opSysu5lQLz9WsDhm3tMGWa+hfDApC6wXu82ZxKogMUtZY8T6twGunGfCNcUC tpuX864AiefYVyg4wiQNKLmEDTCpWPWo8n0DTanhrRBwKSWKIlec7yEsE1Lj/XjUWtTB57UM2hXA dowQuEsrwkzFFcEsQm7AOmNqVAYvn/U6fUaoJ47JERxpa3hOPVgL6NYYTKkyQaqUCe7B58qjNoqK 3uADgNDUgpuUsWOuAijoZTthZyvXmxtaoSofWkoVntJ5Uq4HdPa0i/HBFkYIhwRcM096oF/pXbbG rnPBPCY3Qo4560IAnRblqSla/GnHd2+L59EjpyHO8Qpuk1I1hGvs/cCatVA+9HbEE2RoUo8Kr+xz xlLaA8lO0yjKecZFz/cG9VJPnlELlWtOAupmodQc7q/meV8+fwlwISnWsms8g6BWxWKCr5GNWyhd Ow3u0NXQZMMbrJ85FL7lEePJlNqhOEgCs9NTdAE9o4LB0Ei4Vetuh6amN1uHgIo+ERLHlX2KZycA n6fSs613XIqKT+k49Al7KhnX9jyGrvvM6IbNaS4BVKesIctjTnttPG2x7zWg9dayPyyfaJ69tYil ZVxyvG2wq4W8QFP9UVQdFYnUjhmedZFmGlJlDCNnPwHmpJst3qIpzRCD0cYMKFF5+vOreIdNSqK8 1T51hLdYL8eslTnaHv/w975PBGC1+w///o8ARVQzIu/hCqfApx896p4y3yYVmVg3JJvfZF7Pk4ZY uo6ReHKW3TtSMeKNi/wtEJMYRjNgTKqW76vST9WdPfdB0Tqqo6tUJdE4Mghu/LgNUeL51pNcjVjc 33p5RBPVjbIM+gAS/hWoJfLPeZPbQ6WRKm0qfxdvW5op1XfSN0BaSqJHVCsCECcC4/m9L75jR7l9 KpVUaTN57oRqmRvnO0nrKFUjYLN0P3StnTDfdqfUeNdDq2y7YL1KQRLkziXpWTBQeqBvfOMidcys 4lBVbVj3OCeKTKMupmQi59ufwjAjJ2WaefR4czE0ss4vceJglNqFTy+zHutUBxFEozsT+dRhlcRj 5SZRCOt1s4/GAdAXUIEqUFARPit5CPoiD7OBGD8A1QV5Elck5CoLJzAmJ0lwW4IWc59GIpYCPf4K ZxFeSTgplOabpKQkzWG4v3F0nP0uVh9AoeGaSZ6XHuX2ZM7mAYEPkIWHvHZYr329enViOPPqCvTD NDJ2aKKvuookynPWpdLYyhJGlnQ44FrlBbAmEhzgoyAIMKrniJeR9WLX5FFJ3x60+azxPDvoDXTz rCmq4HqWzhG9yfpV9mlMx6ATKJVDcZRgn0sa4ZQiJ3VTEvM1cB16YYFr5Y5zXfKynEY9zSNORZ13 3jP3YQTRZNoJ5tU1INA+9R54VmWQcv4KmfA2MnYJQ8acjx3yUc4ZQ5NH3aE6Y/SBDFjHRoJSiz80 lpBTsk5cs1fgs1BGOMa1MI0hZTfXSZwh5zhh9OYbbdMgeglvehMHghHrdXLF3v3O/W6VaiOW9b24 3E5r+wsNxiSY8lVy07pX7EdpPCTolzHEB3btdY6U0f6EC11Gc+bPHeHCCdgufV/gu2GzgDvfKPlQ gLwdn/P1x/a/ZIe1l3Pv3/3LtxuIDmhu3umeWpSl0u4rxpnrSzpS+70HmrWJmVPrXBdtzhwVcYP/ aWxat12v/cHLF91Tqsg9o4rPBdQbfYA4F6t6hHzHoRn9enFJptCTLFVgGSvbjG1EVHWzUhAIoriB EwRWAIqeaxZK2lDHO92MGBetv6voBeP5uxR5LXoHuCxXf7eyQQ2pXuEauFBBEleqQc34BydfG8h+ 3PuJ8nyj2ei/UFZvsXDbBhKoKD2dy9ypJXLkjBY95JLFfIVSQxvSTMUi9yQ/IRimWPx6KeXZTZG8 Mg9nycoIoWIo3Gz7i9AUBC4gwGcBbUe4k0wgtKGBeSYDZmUXgbaHJ3CCMmom5iF9AQZSLVizeLCt DCKIdIMd7qLKrSbCQkhFDsZkwg0svYM5mIUnKlVkVk8DoKwNUvGdLbmkbmCtTp0IRvWO8NhuEI7U M2cjDi1tgZpcPb8vzeFiiyM4Xm6rky54tZJJykAzGQqJw5ckabLpHFuVslUEwiFTwNlsQk8+XljH NopcMK8wUJmqRBL6QT+bcCFQ19rnXJYRU5mqdGi02LxjKn4oNgoYxmFhHc4jXrWEz1pSU7aoz9eH mxRNTVAXp7i3jiuh0GoWciEtiWXiiPU6X5Gw5TjpMbOK7wmCoq8JLpgSKNuGWKNSCo9ex3jn23gL ZPUWhoNqeI+/D1lDAmRLCDpO8m/TNVAvIfdl1na8phpn6a5F4gl1060NrGc4ESJGxuQRwashQAGH Xlo9kNaYNpnpkETZlIPKPijFIxC1TbE/aSvOmE5Z8irbrDURMCStoojQzibJM6fEXx+9AHQI/Jyf sQE8YsKHW8+eB2hNTuOZtSQnwEWw4Xf11t6hZu6dxTvdd9650d3F46ZnVoF7bm1xJItzp1DWYx1F y3UTEdPTw1ShHooP7KMwufHyJvxZVVviPU3IscKQJlDKvXceNWT6KieuO7ssqpAExZaXc0wjSeLN Ze5t0YwHehMv/CLKZrhKR1TW+QHrrSItUEuSuGvor5oDya0/5TnPKaelISBVxHM6565tSz66Z6Xz CA5UxhrD7skTvEcao2kSxTo4XwCkWHWGcoS9o8ExMdImSJxdv9V9j54DD995q7tLd7U7d9ezft6D tnaOnDrAwN5HMR8jKw4Yx2npJ9RFPMcSNHozOVsAzix+I3UCZQ3FyFrBabl/s7fVf0ZlBA7OScpZ ss4dY/eNUaR00ovn0dyD0kpZM1GQLq1yoKR/gnvfvc16C03J7qRGJgL6zU2o6JD0AXWANAsjU5dw Rb2fGFsB4eJA29mP0TV4O97i0No0dNUnRqoA+v5rdaN57nlgvXHL27F27gEYx2hnPySHQKeRSaYa +VI+1gGWGoOOoWBRK8nEMvGDTg73txW1jPi6t3Q0OD7S31IZBVlg1NJ1qlHr94xUaBwusj89h9x8 97ljioYJeNOx4X62hJ75TI5JmlOFCmV1EQFdOZsm2GPcQJrB6Geu6iYVhXXfT5o/okjl+adcu4z1 Gd0oL+bKyeKc2z5+lbyhh9++3e1I+XuFXIEWcvP2Uko+en+O8co6eRaAaOVNChEAzJL8ynPMXUFv YawstrpqQQDWRMAd50/BAEIdhZHxwhrFc/1lWSB3MEIGNvjBuWAC/5VdR+mZQXJH814KfnQCuDSb pzlezGugO04814YL7RoICOgQm/iZh/h7QnIF+HwpM0zGHp2+Aepgm/o9JVop1TWmLI35WUniykj3 rJQOcUw18yoPqHNncxeBtevdY2vtI9OkgqD/U/lLRkA8XGVUvmL9mGz9DBrOLUr7Wut8m8jMOXtk yJpUn1pNZpGkYj2jRUvheoFQZczpwLIPbkUpVfj8C9YYUoXJRk4TlvyNgUbSNOvpVJxBgvJtZLJ8 eRN77751Owndtqo3mndxhT5Gjl6aE2QHRvMOzCPSqWMbd7prEt7Iesxku/C8tjJEgR3Aaihepayj 9DpgLuw1ikT0UzgC2j3KVawoMEtOvfGKUeWc+o+fN6zYvx8Of++d5t841dr5+jXh90MLUQCVx7/o KDoUkZ3oOE9vRE4DNeWac69G1HCcMZd7lAy1EtyFOUJgO2uMTzqhaRJgp6AWIvf+5U7F++AJ6UwV GkgEp1wuS/6YXGFCgrq9Qs4J9/kcpdLrJ3vEknzFs8kYNeDs+UqHh613bXdcm4C8W5MWZZMBbCeu mbn2t+fp99kIhRfQDveqOLBe1+x2N4xeZJ8pnmmDigzWNIB4aBbo6Q7AGm+H3CgydqWLTGBpW95u bwOgxMAvT5qdD/UDoKSXV0+F5bgu8GIeXOH9JFygV3qN+r0KiSNA+QQW5jTodInORoNpEpsAw3rx z206g4fD5DsZCtZkLRBjGLwqlzirepbdLApUE55kYsxZAxeFIOi23u203kxL1gkW23jVODsBTWa5 hkxkYlK0MdSRgusAt2iFap0uv84WuB6wRf1LQeDBLDxTPCK7JEGcUQPZxCl5voINAd8RHnm5+ipk leUxnngnPyXUNK7iAZAPraWq7qzqG/qqUxJqHA+J7mJ1kErNBFTOa/k3wf+RyRiMwSy1lqWIbJHZ bk1d6/hO4IZX+AdaygU1JBlDhNNJa/JBjdIMrPMrj7Tqs7v3iwHRysg1Ze4SS3fI3GqViLJUlCBf pawQnUM4WavY5GB5yAKMBax5ganVIeJJ1YPBnpnD27tsUwiuKec9hhgbMt0auQmB9az0Hrhcc/Pw JZk/qR9n5zwb11mwIgqPYHlEObwXl4fxvlqfNIrL0FQTM2lhr8eqcYX9QBDkUgq3XQFtElIAQlX5 qCgWYAArb46F6PqN0c05FmletHgTAQ84E0QfYjRK/VmlNOc/+Pd+1H3n2/coQ7Ra1Biy1BeZHxPC FNj38M7qOX6MELJ8X2g28vHZ2yaXTVpLmnUu0IqyivGrMVjrPXNlYqcGW5w+ZUSnqxn307eid62e cE/WB5db7jyN0dVOMGaHSJ+zAxgMlvGus44C7vlRcWoOaUgusz9X4YY71joRNP7TREeDWkXDGlxg Ho087FCJ5AvaSAsc5NbrQTyGBmMFEluGz1LpZwzDzbV8pvBlPbgnXC9WijncqaYTG9zvNi3A9X1q zJjfYrvkIZ7GBet4owxeco+73LOdwFZQup9+QQktjvvhhw9T3WLPTojM/7hd3diLQ2RIGp8o/nh+ 97LXFuhUmcIqwVrdeQUUzSvjuvCWOcaOfDqlpqmXazROhW7uhcl1i3BE9Yr1CYFGN/OM0atFw0pC lfMm343v6pwxhHrOWtBIsgqSxp8hVTtdzlDWU9qPxrhzIk98QFKre8n3rF5i8xUBq7LIsrGLOBfG 8VbHQeC64CatDKLXybnSIHKt6GjQYXSFobkj5QYZZGMOsa55L3pbo31YU4vs3z284OqsVJHBsDTZ 7FQHib0NpeTFGK3nNPHZag/zViYxYQxZmfvhunIxTQZ1z89xr9l7ehZ9RsvnkQtzpjGMF/2M9WrE xGRl5UM8+1JmWmUln8H6/qmwlKhDRYu9ZxOvLPV5iQxzTK3jf0oU02cz0dNk8zM7z6oeqXOugWUE 4MDEXPnzfufWIg4j8gZYy65fk8/lVyd3ir01RNak2Yn8afNFQCsQkgJcrF2/Q7naA/aYa01vvfvL zqEpz9fAbSousabnuI5VaIymXlFfeEzPaLBGD6Kb91OPE8eULi9jL5q+AEUDXr6lcus/ewMaNEzW H1/GehqRGYUJfaMMv+os7WmMqooLXFcCbp0NAFteAdbMS9x/6msjDBoVwYt1nni3fbmGBWTKLK/l +uc7KZVpmUxxHPtUPvTXJCn/0L+Zf/M0LtANNulzjhzDMUptxr7o+doxiB2jMkwjE31Eo4AauxjZ Op2Mrqsb5xZkJGDQ8PnMnfnuxVP6d3z6IknD9rAwen6M80MOuN9PNEZqGcbkJOBbPWJpzOM9ohHM /QwRFIsNlCXdQHX41t4kr3iOG8gOSyHKPhjsjZ+Rt9qbd4774948LN/L3Pvjc6vprs1zwzrFhvCe fMPriqi9n3Z8HAp+v1GQwqUWXGuANfyZPcWegAKZ+vDqJGRwChBIfZOKSuMdZeEWHUv3TWYUH3Nt 96iuizyMz5JWtypeTurid+MLavxsSj4xIaUlLhQlZaUKASqlgV4ikG6b+If1Eo4YN+HmS7hQHq3K mkEoL5mCoigktroOEPcZWSBjoJdRyCcT0Q+cVI0CYXrU/ckmSwgzLsr2XgHneFw81k2S/3w+P4sZ XH97uoRTivJQho78SIQIJVWObBIDYJuORwFhb7KZdAS0jB5reelXhM3coId4uOPZUmCgKMwutTLH pB2KBMZ4u+etm8z3LPcnoNFbYbhWL5tCRuvekJsbVs8m0pPfHTcEuWWg5IhTcq2sG+uN4oGLZS+P izGnYYp1neXtWh3AKtdPtmlZbgfCxle1tKhrxxDVGJ47F55JWo7lPkrZ2xqYUOXck6ywe7QdsGDp JBw92fCCyAvu19qZY3DjLhCIA4TjLMcPOM6GNSeWAcOTN0WDAgW0LX7PjZ9kCqvds9n4Q8bUboPO oyE8FYpr4lKBjvI5katqZQHG385ldpWbackaeoXEi0dalXKOser1tKvwpokmWHXBGrpXUjDSqaY3 uwCgeg/5bFJl7PyIPJjXccZ8GuF1QvLkM4yW5ybyAsDdJgckM6zxnKoyS5BNkdSzBAWn6BH8y2t6 iQ3HWCPPAIoAEV72UbP2rOB4AiU/i/U/7ZyYTEcXT30Nti/X63PKuKt0D+Xzy1+UBpQ6fHrQAWMA G8PwqbKgJxdjojcWFaAqZw0Mm0cY9m8bJoK95Ixe3uL/ec4oABWCSoWj9aw6fu4Ft5Te+AHPILVo C4G7itH5B3TsWrh1IwLnFONyC+/KMh7AtZXl7sc/+nb31v1VUXvq7Z/eOsZzWM0sTAQ+ZX0+e/YS gwCvsNzlhOhdU1PxMF66xnleS8rJ91ahqez12lSFGeYUr5ByMM0aNFIdM2WN9BbuXcNL2oyJtYJK IyeuWwGf3swqMRqtGlmXZO3Ubq6wtaPkuQRA6YTJmrN5iDSwJKTCEZ/V2DDQZHSJewo/WK8HY+66 FNgIGBxjPeQGUK4o/RGPE694wLkHG0KNk5E8Bkf8BZSaS4DcFGNtGNha1hrNJ3T2AqPhgWJu5hHk gAzXF/GtlMyyjIXgTSrMJYTzSRTdQEqU3lU+08BOsrs5Qamja3UkvsGYWXK150lmZzoGLpumC42K pexgogby9t2DLf+DZxh4LYwaK/4EUDSvYgEO1nAczsU3d/32FV2UuZOM6wTyLK3AkXHWf7YyjFv1 lEQ3lZR5HUsAVYGj9Z6lhJ37nET6pjjfIl4zG728Yg0mmmQ5QNb/IUp/2kgEO1dv4aGymrV3eAjY 5TyzgL4r9xEglOBgtwwNRarPjlxJnSkMgfQL73lAzkQif5o8kVNUcbDjpkBGXaZuk/PcAP0MYy/o dwOZLBo9at1fZXDK5ElvM3KkkmKOMMDw1qSc5ykTnhriAK3cv3QkZSYXUf4OGN+BFZak85izos5W RuiJEcQL+DivZUptYub6nbVUpxE25JelDXU6CMgHrF1BxJfbr7qPaMizeYTBu2Q3WMCzSb543wVa YlrXuON66ZzFxM1Sz5iZbKyfIvfIeBg9cw/OY5SG3sU6sDhCIA4yMBrdOuAaKK5TKV1JQOd5MIBS IsWF7140OUzgFs9jAz2eUz5e0/nlGW16XT1ofWn2YvaE4MjlLLUjIE/gbDe9kPRyvzbHiWES73Yt /EqwzZZPBR+NH99SR6WTqLzreK4VlFVJK7WtOZ9twVNRRNkSz3VVCfFQb9sKVXqsj3n/2Ig+IwIB qdvm71dGujBMnvGKWw3McIFsMo/I/CVpgDGmmM/eWx1HpXgzsr2iO95HyZAyUs655glRcrnY9ke4 JOtX59mMVV4O58F9L1LrfBtjeTgvnaqiieGIaxRZxlkvNQ4CyyZeILd8/jQnqtq9hW51YPZceafE 59VQchEF5PWguAfW7e8cW9jtN37yfOIeP+6xXh648NyIDuSfrzFewFNZT3zQQHMUR/tO772O17rm uyLalV9U91uRO2XplX0PFKLoJiPFYnJLFY6v3O6Oidw+onzlkY4i+1gw9zdhEEwukaygdZU6pPwE MDNGswsITjaVTThOkqQGWmfjrVMhQ06aSnqFUjEbL18lpLGBV9e+8zFSbN2tYIkLXq+D3iluxuQV Qy2Na52hCGCu8H96z8cCdPMoQBS8jo2CuzZUpsC343WpSU17V4VbPFmNx9tzbfWTOheGC2PbsREU XJ6vcakN66qUcIl0p9Qh3ibz2S6MJ4DrfcZDT4uHTxmyRsAcx4Jk8SbEc0UdVLzWCDnLEQ1MfFSh YIzMriJoUCC2O77aLU/ttJm+JjRtVS3QKLkARcLZJAdYVu8M5SJwskmG96tQHWPTxiiRlsPx4dQK BDQO9Ig/32VtkOjDMxgm3uMePsWjdouQvFUaTJ6Ul5vQeDqPWc+XDmMIVb10Wwh3O7eNDSi5o1eW jXdkeUuunfqYAAxLEEqLmUUoLq3ZYEDOM1EhSgBap1sLzu5N52wm6TCWFDtAUOyeQ7EAgCXSoicM cPoKK30F5biIx9NQqUkiCgE9ThMLhgzxPlqmjucY2FqcrBn5s57kGMNOwHVBTeMN+L9DkrlSms4Q s1QX64OioORenpLAcc7atGVghPsU39W7TeOfq5NK0poypLULGLvUMKJCw+Cq++TVUfcLElHflgdr C2wU861V67hy73hkl1AsdwCOKYMKRNiG4nACcDEJSYNoEWCaCgEabCaXyLXTW8C4nJiAekBJOzx0 AltD9js2o2GOBONbhHDHoQDsWr6QZz3ZPsXLaevnym+waUAMIo6Tr+98mXjYlz8UICUxKTyKEvqh tCRzvfit7oUzk1DMVjdEync04qpsU/FbVdSplIEBc8KXfv8H73b/EZ2nZplvWzKfIHS+okrN+3Sk stHPK2gvT57td1+/OOpessZWVuDxLZOYCYB8gLJ9Bn1oZ+Mlf+NJMVoCRUm/niXOHMgzAACsqAAI KSxnAbGUMGNNDZPoi1cWI2oe4KsXWW+OtCJzOHzUce9ZewRFb/voKbqiXgHGU7ZRzwMS0ZwExy6G sB3RuPbpoVQwudSU6ZPXrmI14sC+3ed+bWl/dMGcs4btAnqJ4JY2YrKjDUasQX2DELsKMV3J8Gr6 TEcY3SZt6X0ePwCIIwswAUkEYr7hU27v0pBKShHzYBLuKsb2TZpQnbEWrNd9RQRmamaFaBGNqGgs NcV6m1y72d1i35xhlGywvucQ4qtwH5cwbsxkXF1d7Z5MbXbb1D5eZQ8gxrMeDefrAZVuk+YO4hZK 6wkoUiJTMKgi0aOqDLcSgeFwxmR2rsqtWuP4kn1k0qQy12hDZJhJ0o2KlzbzOk402kLvUr+ynvRo yx02asD7cbwYyWJe9pAF51SnmET2z8/OJ6x9gQUxxX2vU24u3mu+o7JfQPZg7wYgGWWQqvg1LeCN flg685gw/g7yeY75W7bTnMnCMXjMPTlkDgiJG6kC0mALR76OQaeZHLNGOd5mZG91maRcJPSgCeT9 Kfc25sLyWJ7BOtZJbmTvS60yYe4Y+awBMBNABGCyykqS0VG2ricP5r0Tu8zybMpBvY9DlPGAc8Rr vk+0C+AsVokDKyAMnYRhYC1ljzfKaXncMb28GrDW5bacn3phBz3DZWx0dkBH10PGY3/jsNt5jlHB nAyt8MPYnBpVo+vwC3ii/+Onn3QfvXrRPYQa8PDtte4ueSZGPaUj2AnXhEwnWbqNnH27PJ6zHxR7 SVHkvEnoymxUJ17zG3ThKjvMDUpZOe7bIgX7lD3UG2rU12POtnguZLHdgaehW3bkCASJqtr1fpoj IC523WA8xqlmgpCgzt+lVmTzFxVCOoVOlnlLTmoUKp6NrOck/q7MKzpkvJG+vJzJ0Bpv4WZ7LU9r 0qDVMqoSUwxonimQRFBupBEEbsGxQ7vKiieS1yJNzUhk69LYckVyed4/Qiad8P195OwR62aP829A D3tl5SSu+ZPPH3f3qXYzS4nJscmdbsNSkujDRZuTmU+RNHR1YVU9E5skp0mqh1EN9E3Jv4pKuH5P iTJroOnE7CnQSD/OA/+eZFfzf549I0+LJPgb1Ic3mdi68mPWzHb/baGz0IFz7Efzsmy1bm8lc2nC sxY/CaQDsBUgCgYNIosEaPxJpWn0EOckQLsH2+qpms6KWjSQnY/FkJ7LVznoqlavn5XBlJ+crnnJ M0EtwTIe6Ur8HXmmzST1ffR1S465huu5f8G2a8Afj8VxebH5qptYX0F2z6WwxRmOIVyj6Jyr7tFX m92/+unjULJ0Ms6gx77zrVuhAjZg6s31ALZIGn3dQoFjrBhpH1zY0J/ejBuEEeTF7tJ0wxnOGk+o HGWnB8Ji8qEBqCj8MFujnCX9eASA1KCVJ1/IWBOTcctgViJkhjy8r7rV/PQWbP+nb+UCdYU+ChGu 9TXDqE+0LKu4WcIAJ7ukWRNUQa9F+RKA+oQW33pA1mkBugD9Qk/2ISDnhBuZoZzSGuOQMl8oVJMW wzFv4Qc3pB7rlJzzsQzhxVNq0kqjY+Q5fDTBbwGhWggaEO22G8dKxeMYW0IuiYQIXp9Vz9sQwJzS YQocxixWbDNYPCagIkYIX+F5Ym23zZmyXaOLOZevy64pQASDx3If9VIoOORj8d00lOF2TToySSie DZN1EFYHZBHrHTVMKkdV4CLgE8TIxbWKhmFYQbkNLmSKOw7VjMioiR4FxggEbOmyVMBw82HsGWKs SgfFb0uiZDwJKHEjCwhbOZPWyXbR6x2MIuX9C6tJGKazGoaGEvMShSoFwfOiXKz2sQGIfn9eYxJu bnjGxel1H/jjc5+wic3CtgbxiRQYOy6yDvQobdtmlutNA7DkrYcfzcuwtjSMxSFZ9aDatH3n2VSg kerMg9/3moZxk68gz9ULcm0TEVMDWgUFZWEC76ZLRmUopUFFnWY8rjeVn3PuPVvdIXqIe3EfO17N 85Oa2NIj3HPMfbrJoRgP7N7meXime/fWuptv38RwoVsh472FotzUmLrhZsf7ivWusbENWDJJS7a0 S/HEpj5J5sEjnCTBmiuXmw1cbIMdKWHFA8ZgB8pVun3K9beJCUA9fFIFXQzdGg+NDdeEbbelf2Sv Kej12BiZ8QJ6/TVC9YJ7TrtZxpBXIxUX3fJghnVTL7tVCokHn9+t968nSu6rntxdlFAafliLlvE/ dXxZo1bR0KgdGObVkyVohKZlhSCrpqzZ7AQjXu5pKBpcXgqETYoWkaFL7I8VlKcOCCNh5+QQTYEi vSeNaz1sSRDnPk1WnPZeWafqHdeEtJl4NdF4x4YujYQwllaR0Qsq0JCDn1r3yZKPSzTAqao/lVxo 0retA6Manl7+clVDiDPEiGA8p3rtjS7VfPTKcqQym5K18oKJe0bJ0ik03qPysGWdNs+R3mJzT07g rh/TpCo0VqOpHB+PZEK7ZRxW4yDH3gY/NEhhnqzCER6qQFq9E6OyEQ6jL3l2qXTmxjhvUivaPvYa JR+tIMS/crY1CLKmShcln0RvpADHhF074igncYpkHBibplAjUzJWOoTiUa1KHq5rq9w45hoCGnDx OnCsMiARFO4pvq5WV1nQVhxb5lRwLkBM4lhFTtNq294UrM1LgPshtCsbExkJ3XhK7WLKNLpPbM9u vX0pIPuM1ydQAp6/3ErJ0Xcxmh/QFn7JSjr8l2pE3LMOCheDEdHQJrQ8o1ojKBgnue6C3KKiCeIT qXBapQchQ9y3ykYNYruOaiSaoDnuOEj1Ub61qEcTZOGRZxE6xg6PeUBeQB58xqsBqXJp5qVffNSc zrHxfgMFjL4XCNPjq6GjXkwXYMfVY6I/KuqexiCucddP45CHUqkTSH3jsUbOTGxU9hhNUz6FRtmS HXOcc1ZAO91LHVJ1r2Y413fETlnfx3zHJH6rhejVfmm1IPbBPEmkgrXDcZJ2dbZF/5RudoADffhd HnXKWmaOPE7qrjpPXOperUhntg97xiiDDswD9o2GgXvJv3e3cAYwjnaplbJk9a8ZrHPr8R+ey6ln X9oYTwPdBera9ZV8Fye8AdLo6AZ6e/ZBhIuCr9ZN/fQguv+7vT36p39feVF7JN8dAer2exuHnLvp veyPnmsdcO2lS+64aVzLYoFgv1ok7aren8fFtc3zKUspkyylS8cvBsaFEa95Kn/x3unmZvfFrz7v fv7Rk+4G8/XwFpQb9YxYIkImTut60EyYC8bFz42mxathML5ggXmzqr0NPbYKwmVOaF9YF6aVJOZS 7QLLVQvZsKLCIjV99cn5zR7hulDbc7Uxe/NBXwNkLd5Irn4cOD6hXRfba3WQ+68h8rtuIBeW41fH 9v8Z0hIEyiOTB3g2RsUOwlEKEEMiM9aU1rsCkNb//wQv1Uu4xUccv2hzHZIxrNOZcO/VfLeGlWm5 oTkbEGCByyW84jgXs2FgBdT4sKgw1VSnDLRk0isUuL2JeNdqgyosa5zKq5R7z+Y25ISHlfkQXF9Z BQLh5ZGTbALD6tICTNJKIoUg2A3cQKobNKX4kN6CSsvv6bHzO1EonCdtyk1MbSBuho0mFSY8Xb2w lqDhfHO2TOX8eu2nBnCS4OUrQFLa0Tqwetd5FrvuWU9XcL01RrMGxtiwteXnvIZJa9JU5hvocf17 PyqmQ4GIXGUGKHSHaTYEniTrqet1tAqHgEUAY5v0cMz0HJtwoxDVE2uo0T1tuFFwiYU9zvWta36O l2of75RjkTrOeMgFCmkew7xtAJguFpjbVAsgvMz96CGbYeyt1GJEI04OhQ6/n1h3Wa+SXieBDZ7N WeZ9ikQ/cxeO4FMqSA9UfBqJk3jEWF+Ca73GM6yfeYwzPYxy6TWWrOYxCbCVE2cjFOjVLeQ/SbIR GJJxtYSguRN6HlXiAueAF9cYyisULL28ChX3i4DD41JK0uVVoftydBdvT0BX4rzWrUB6gEfsTM4d 0Zdxwtn7GA/K2FCk9Nxx/RnGdeWGlAjC9qzJiSvKSZEcmkRCxnnaHA5vT8NOqgVrTX6xORzOl6E3 a7K6b1cXlwkvz8bQGCd+nyZWyEnLn41Lu9KDkYyekmGl88soOCeJpviTytjiTOstTRQzBhJPRn5D 6Au80glUOpul9Fw/nDMceL63gAGggnFPHVCJJcazYxbnmV7+UnTy4TVwNO4OyL/YYv3ozZbKtrjK 8hOwc59GV25itM2Su3G0jSKzso48/Rg47ma9nZZBZd9JcxC8yr8lMnjZ5vPOnTUUH82PqEe/ybr4 tHvMOQfdLbx/3yIhavMTk5HKe2xDH8+a6KRhfDw2jmU5IQQcTWS6PoLWX8vlRA950CRQC8QFtAoK 6VSew/elPKg28l0Vd6+vSm55DakFM9LfnI9WUi01gh0fAbF7Kbzsxm9VdgW8uK+L75vrmTPB1dwP /hhpeUaN3lWST1cAhjE6dQZdwgtlPqRCVCvmqoeuMeVNaEibd6MTQLqRERIjBWEPiIBc9zrk8NoP rYSg00fvPfdi6H8WD+sec+z78wvVNMbhLL1ZVYTk1aondU5JC5tjfrwP8xHi55XeZ84E10rbdfSO 0V7rkvt4OhUcUfcIO6V0ntFk1r+UliRn86ND5Qg5vEMy3MUekWLm5AbroxJhpQtJwzvqvv7qZfc1 3RotN3kHL5wJpQ8oo3mXNfMhTUNuYzzPkSPhHFwkrG6rdJ+xuMMBoOo91XHMYedCQ6TmJbRP/nZ+ 3YepqsAzOt1nyEL56u6fVDzimXTMhRLI06ljJkz6HxKtJLoXT6jnSZQY+cu+DEbCe62zZwSGxAWZ G69jaUuNYXVbUZ9yLz3gyv2Vsy/36bqK0VN5Mxro6gK95DHSBMUXNuRxHTZ6h9/xfQF1EgerHJvG jOdL0mKfT5SqY/VeqoNgbEgvlfp2xDrVY73DWO8ir/a9ho4AQkrPt6GMEkG+Ad4y3+WYfWIXTSla c0ZmwVuqtHKUlVMzzyn+NKLOkBgZOMGbrkNDWqXbGKBTJUxda0akw80nMkU0b04swViYH7RFj4cT or1fff0CHUNFGNaFQFssMjVNBJt7UkYmadWL94A54LHkcQmVSJIYafkReCnYG+6uN3s8yJt+rxRS +27/TxNSzqOnMgEkQL6tg54uUgqsvoThWuC6B9ReKuC2ZF7ApKdowq+/bB7H89SzXNqnAXk+TjlD 16RJ4xeM4zT5UMriX/z0V93Pf/5ZnH+WoLxJHoy5KPaKwWFXtZirXFmBUfe9QkJTS/7VCkkH54TM b64tp16tqF/w4MIx8VFaxTEDuM+mNwFjJpy28jgM5K2hcCw5V6VxpGTU4KVxSD1mWfrSU64Ndupf Whu1bLYC120+UiYnYYHyJlo/tE7kW9JIahv1ILVMgvozXjyVjh4OjQA2ycREeV2HhD30Yu5QR3bs ZLqbeXAjINVSVDsIqF35Ywyu3jY91iuEZQ2FudgEkXZFO+Z+BK5WBEiM2RB2aGRV9qy8I2UgZAy4 WdeBi7Us3Tbh9chNWRW41uOmN/fcpDX+jV/OWrsmoynQrFrB9/UUulGstzilx4ZjTTKxXrk0CwWD meaeTxDsLAjM4iXVILKltWBRrrBJdmxIFYSCTWGSpDNBMJ5TPXOD2Uryk6LgpjdUP2UpMGp4qwgF ICmirxcKKblvhQunwYQYN7bl56Ao2c46XiCEb7zn0GvMbL8irCWSq8QaWyILouUIV6JT4AMyo/jz VDXB6yxPcMzrMPjhhOKx1dOgV2oQAYjHkY0gkO4BVZ6B5z5kQ23aOOSWpd1QxMyD3M0F7iXVKOJB kIKUBRV+7yRCx2eN98+xzFYqb3EBMIwJy4o1ZfXsKW24Dd9BVRHAJzHPNarhz/fl5RkjvpLnyt/y +g1pz9p0IlzO2luOgcLbsexrYFtjOYal5zMq0ZSdBlLGj3vxOTR5A7y9Ns+WpWfQxL3LM61C9zEh dJ8ws+HTM0D8LgfMym3mUI2CDT4zUdNdak6GDUbGURID1srJgR5LlAEe/kO83IckBs8JTvWiClak AxlZaBErz6nhoqGZRFYNGr238GLP+c4h1XuMdliHWLmgvNYQyN5SifCwgj2rYsTT5NpXGQeAV0k/ 17M3fy7YV1nxcZLA2OcCuCT4cR/HJpfx0kNhbV89gYcoHkH2lOAAmeB836IR19vfvpX7nJGywRzt Qi9bWIajzzoyIVKZuQV3cocGDoNDueGCAbytVrBg3LZeWcrsivKEhBUZvzPW6C60pF2OGYeOskyo dt6wOQXzxyZMRNOAYz8TBdlk/G1HfgalREPtxjpy+vEznruiNeVdrb0i3cFSj3EMtMz4NLRpxnUP WkI/ZE0EL1+LPkYmG+UZ/VdyLXIqHqyms5pkD5BhAzhmVpXq5b2n7XVxD8D1EqaSEB8a/Zyy1bOX l7vVwDX081TmUFaXs4k26CTsrd3c6959z1vlWuoe9qpVdw4Bh0kSTlRHwx9Z4tq3YpL0Mq5potIk ey16xjwPDa5W9132h3kr8dh6L4AYA0ZykgUuPngqOeBAsVpI+hEQSVJPmNzot0y+tBLJ+YWJjtwP 7+m02iPB8IBE+NAnNc7ZG+aI2GAMRksMM7uzjjOPk82YMZpnMrfGaSIGPKMdYi0zuCflgmvPUKpx HkNjVs8ndeXVS88evewe/eKL7pePniUR9v7dte5dmu/Mz93ubgLE10hCHtpURN3ENc6MIgUYCzD1 4FbSrQDS9er8h8apPmI8ytDyngvw9eA6Udg4AqW/1XhPut85MiVgjUbx/VOjohp9tGOPlzCGtrx3 p9hQvWNUkdb8JKRS8581p5edvWI0SU+5TV29x0DpJtMS8e49lIJSS+z5jEIdOfhypX0BnPvGRmnO BZj1+q5h/3aFG4k5t0kbfxlZMDG6qCB6oMsYke6YSiG81CeILcAon3FvgupN1sUu71uDPax+9u40 Ed1dzvsMffdQKigyZZdLHqKnTOy2OsVVwLURVmVZrcHg0tCJjMDiYLCyFHOo86zknVEaoj4a8C3i ZATnAgvSqNc8TsEk3TsYGmM2i8NgOPx6q9sjEiIdMdF58IX5MS7sVdbM9OK+9U0NsxVQyZ7QIHew m5c6UTduMCzemq/MXYM5o9y6AOFIkjqmn+x4GH3I9nkimC3K60d6oIMVvb6b1PXhMUHiDUDHpdkw ov96fx5bFKAaQF9eo738k2ulBwvJv0GcXjY9BHCWAbR/8rPPuscY9+88vNm9y2sNCi6oIv1A4rn2 KtW9riUA5EIsChaZJYHkXbkppAAY/hcITOO9E2Ab3phH+B/LV9ZragbpmcJQ5FTtQCdwVdUmEwi3 Z81UF+SNN83fHDD5gTGzKowZpWvoqfQj328xVU/XkjpeT1J292twbegkHq2ih0Sg89I7bej8BN6j izQcaEIkAl0zaZMhyzG7WNlytdbfXu/msOA++/gJrXNJdORZFuEc3aW4+gIl5gSdntxrCXrPAeFy ptOYJFxqveSVgCLISfOcPHgJLm+ht4wrY7nmxONrkZVQcM6tVamQO4ZTqWWvsjB72VDy6aRcK7w3 fG/fguYeJzdRnpyhbbu1HaNo2IUmJsxaWYR7F1yqiKRs9Fz2qiRgVj/cOz6znNUUQNnonEpkFoUz Zu1WQ5koDj3UaR6hoGgCaNJmA/xtQosK3UoqgkUjGpfptAiPjPEzcUaqiK1fTYg0xDUBuNATL7/Q 98/hF1tvXTAiZacIX3ptKlmlhCZCz6QtwWLbZwKu3JfH83sasaQsGt4Dvn8AEEo1Gyk1hmEtCWJl gGPCZMyj/PpZk5s4vhID68Th/yot48FGOVspRSOAj23ANOQeTcwzJychRp5pIEHd8LVJr9yzCs+1 c8Q1bN2ux8qFWrkDgvJS5BqYGqQK9iwd7vcQ6oUUhUMUtLWL5ZwbNQlwcv+r4PyqjTg04JsXxWcQ uJcQqjC3ykQsMbRikNEEFN0+XiQNIMF02r/yDMsY2Qu2mpYPzHW28IwkcYp1lTJtrIUF5zg1fJlD vXDOlW44QLEl0/bp4jhn9QvoHpaxEShY5cCIhx45FegC1Qgu4a1ZA1oP8BTzP7Sur6YK95ecAEUE 51eJJAJj0m92s9ENQXeCv+UkiJBkHJQH7iMXhwrEsRNwmritQk65LHU83h8VLn/P2SgH5eP6HCdy cmp7cUqVSmGwS6heHEuvCXb10IVuwlpK8waqiZgDcTVmFYnKQ7Ht+Tn7dZPEziPkzy0qcCwKpjiH DgipWpaLO+bZjJRZVejmu3e6Ox88oHSWERoV26D78im5LkdUyEFehgNpcq81k9PUxOoz8ZkHaAZs qmj0LprQBNczwJCxNIRp5YDs96aoA2Q1MDSk3asaKCy8hLRVNMpTRV6MmpJrpbhUZCP1mbcEW6mt niEv54o//n/mJtu2lGkSxy3NyRrQS2flG+FLD+r8fnjMgmbbr/Ofnugt+Ko7cNb1jBaoEewg06YA nIJrrpmkTPWPnmRAmEBGsCB9LJxh9ZM19/VyC+w57ynjYbMf3C8BMYJz9ZHrz2hZEls16tAZ0j+m SEy0x4DJqFNS0/TQ6mwBmCgjTeiUCuQYSA2ZB0hZ119ebxqPsK68l9KvDAj0D5M8xRjKfiNlJsmF 3hLDviJtqZdugxCA+oJlAHkO71u+t/e9iFHmXN0k8XPhyUtkPtxw1uJdal2vUO3FykQ60cKfVxZm shh5+buhjvE/a/i1iFhRefxfrYM0TXJOjSw148v9pT4p76+ypl+LAD4dD+IhHULqCq43wTqztCc3 Dge+NS6bwYM9icy0SyLlAtXTqSMfbm0WY9OPGkWOoQ4GudzlxY25lOiVm7mOL79VgQlzCqI/cnvN sJMuGS+92EOjgnOaa6AjQBmavLFKCj8TXHNcDEfnsIFr7bAAa73deX45+HYFYY+inHV8bXG8HutD xyiJsxoWvJCLHrfNXn5BVJXkHarTEBkh2nFucrkJzJTH08SRumHOVavHVyBR/GCkQKGvHmk0x3Ru DKzzOdxVrHNrWQNCXZPuhWXWiXQGsZEOCo380FxcBzyztDcNtVnu0wZLlvQLx02hCd0oi9RwXiIS hVt6o6iUUm8Z1bS1zX9tHpUHLWof2eADZXZeH+ufPXAeeaXVZ209qCCz3gTN6uv21fC/G8jPunHd 9ffYLhOdyJsyB/yut2ykEB2gB7vWEw4+nmOfCNATKrt8Da3KXgAr5uOoh014TkSd/JgiA4hPXAjX Qg1tEkyqmJMzx+Z/SZb/PjzQ1ckF6B8oA+5DcDAvqudBDTMky1QurN6pPoSSDSvg0SvQBtVBCMUk 6jD/JbQTDp+fVWJjjBFLqcnB9jOP5LNLw+pukMbpcaFF8AvErRKRyamQUyqRNC+DXgwF7Z4JJHh7 5vHMeStyH09Q5jMIykUAghvq+bMtvL0n3e+/u96tPrxBG+JDkrXgldJxS4swJa381zp08Q7bUIUS dAh6b3wcADpJYlYSP5wwn98F34RlPNTZ7Q1cu9FV/kEDpZCShe7zcEy8BSYtGvJBmOptHZAUp0fW phzHUCOm+JIez10WwyHjfhSeoQ1IAElMywAPyBDgCuEliVjnCH3D7jOELKME+2XvfGq18z2pIXpC VTipGtIMydAH2LxGKpZSW9tOqKwBhIaS2vlw48qvu0niogaZFq61YHcATVI79KI4z/Ge8VyOsUrE s52zDixrGEDOsyRpCOFiWS2VrKB/zCorhufaugqVwWe0zbWKmM8nTToytAoIvKI0YryqgKS9Q5P1 4LcijE1AdWPYZEIlr/Del0vN+K1Y1YW5VmDZXeycZ9tFkV9JlUDAGHbLGHETSbZkHG07awe8JEQB BBzXJH05XoAyC4NNTW2xFiyx5HjJ+a3QtUp4YNtuvFBmQ+mJuZQigkK35vkJc53SefwbD0YrNehO lvMZb0wDNIniWIvXcKXKLAqqdJP63PrZCpO0w015MACAiTGsxW28/ybYmBRmyQn3jg0wFvnz1EoO yiFufR3BovfYMTJpatcwKOe0gsM8ER4KWIc+ZBjajm42zQnNApB5tMcao9MmLvDIDoGewinyiHW5 C9d/hSRqn3Fc/jr3kbrI0bFW7SkAEMjG/VjxaMBaSTlMvTRWoNCgECRErDAHzi9rTEDmF11Lvc7V EK3KIYw3YUANwtS91/NvchWGUSI8TfkIrnfgVpvg6PurNyi/yFy+gufqmvZ55YzvnJOweHui++7D +/GafoEL5CnrawwjQorCkPE8sSwa93XMvL6ydBrnefBwvXv7B+906++91b3YgpbDmFyR3Kuxrhxb Jawf4x0Qb7lDOfeLrL2XCdtCV2LuLXt4bqUBZYmKScGNDJCzHoCm3HRcBElNIWY8NfZCHI7wKSAp R1Y5wHqJEaLc9mM+91wjz6BOEh0H/E+dGsBodMaxj6xXZNY69aJeL6Ug0SGRl8o/Dd1EuswPqEYc 3p/VOvaQb64Tv/iKcdyzjCFcVZ9Rx4JJ9RpE5k4UILOLqXqIslnMhxEf5y48e/cQx/S6X7aRhoV5 Grab1gtuFQwNtnOTblmjzqtzlbw7xmkW8GPy2ALG0DhyblawJnXJxHHWntEwqWCuC6lfS/PzACbK 3bFfBDMC7CvuZxBwbXUonlnPtuBLtMBQOPfS+krllaHfj7kRDBOKNSLnKdMo3e6KmuepZ855b7w9 3X2LxNqvnmywP10XGIhcS4KKVUbgBJRAkJPvv/yt7Fd2lEGvzKi5KmdP0SsiZ/R26zE1KihtzzsW WBqFFci5/4xiOb+howleOA4nXBoEQYUyQjo2BUAzDO+6YjzDw9aDzT6Ph1sQnshAu6Fs6ALboV8m B4n59r50Kugdj45luFS/cSCql7xz84akkWiCaxiX8ZCuofFmlw44N+dEGo6OJj9TnkTHNnCt+JTH byS/UUmKrl5VROLFdk9j0B4D8I/5e4/jdzG49jUCEoG00QtYQfqh+5Tj97mv50QykqtlNBDK0BSG 24nVj3he3mXM9Yx7Lf+v5qMM2VoXOrcu7NWQahLllfY/15HBgMW7S3FmbX61FUfmlBWs9J7xrLZg v/PuzejYdLJl3JXv/i3WsgfDNHRY5XY8QM6bhpVsrXjKFRhlSI94Zz1W9n3nJUZOm5/IbxeZkYHm gb1mPL1GwgmrFtVkBMD7ddDwlAIp3u0y9kdGWLudyLQUGfBSzbAOfveenNB2Hh+Bva69diIl03WC TjhlrDc/f9J99OULqD3oM3S1lBp/t0ePuYg29kIuKMBUlhWG73k85YmoJiZ6nARI1hPVI5MEE5WY HhrbMptUZFkeFrbH2LhAga/VrEWo0tRD2lu4PnGsSfdF/guWDszOxm3e3ZTMSQTXYyICMwBujIDx kvmVPNjcvFoRhbTqW/k18rxCWYJ8j0/yjwIdwaZRk7AXXrAjFvTFDorO0npahj6De9OBThhO69zN BV/qFZ4mJmJ5HE5tALAKJWZTeQGcLIVJEhrb33nmXkapkeq+KkzeC4Da6BUGK7ClTImxoHdfOoh0 Af52o1h9oq5qKTYsUQStFIYjFsq+lQioFq+SmGLm5+xVy8kmtbynbdLAwjDrjJtKUkboEuItzsu5 BPF6UCeow2oIyQCW5fUuVnoLU+9RAbq0YlXZAGQVLkYtQuPg5HIfXUsKD+t76vGUsz0+SYKYvFbr V7NIh0QIHI9ZE/x4tjmBKIpwVQe1pW7cv7wEEQqQCMI+fMn7luNSmB9aYpDzSh+w81oiBo5vT5HQ 4IBzLf/ZpWgt3Oj55m0ycUwBakm3dHuUBmMpRcZcxaHH+3IXw3IRo4MahyYpnrBuLqQdtJByPCA9 NmHtOAa98LP5wsO31pO0OO764LyvSBaRZqXgFIgOBARWPGEtLhon1tjRg4QHVbAywDBZgGuq5/JI oMi89uH32h8tLKlSMCkqSqP2WHlfUJwagXqCpdw0j5jKwuVn+G8VgZ7sdj1kUjiYEyt5uPffpmrI CrLBJBdLIp6wtvb5/BVUigMTMq2PC1d6inJSJgB66WmU5RAPoNx1E3stBCNACajiF/Md9ExWl1MT N6We8QH/mgchYL8yfKwnUn3rvhR7NGAn+DDRbwDAMZzuHk5iUe+JEAiocATraephdIvrpRKNCr+o IVOAnhkE6V5riS3wS81mK17oheOe5w7wJMGD3oU+tIPwtQZ2girIui1CqbYMj4eYZ3n+nKx/QN0t 1vfd+yvhUx7PbUFfgnqEHLFF9aydFOHy7tphkP05Dqd6SG3ZMbwgR1ybgAH86gPWBJEjxun26kqi IAdwu1/Q1VEa2i1aYx8DOr/8xadp7HQm8LBDopQ8vfcaTnpoGTdrGKcKkzuueX5SuceoZd4unnoS FxWWyr9mAAZYN256ksKy99t5IgUEp6XN4hF3DqIDlXWCHoG1xk/Rs+Io8Ri9Q3rb+yo2ev04Rlmk B9h1b5TjchNgaKlT7skkWUHac3ICrNaxA/1In/c5bcyrjF7RWCqxsFpN68gZyqF0swlGGoIMDkdQ pEwsr3RL5b6tU+049BSmXaoQGap3WA65V8tw6eVP4yPklaBFPaEzQJUwy1qQWmQ3WH9c/3J79Tif 2AFP54tjIWA3rwUQt49Buo3hlkgTFzIhVFxwlzm1rKPZwk7bhPWpAeTK0z3k0BF7aYk67iZL6hCY 4xnMIzFPZ1p9po5gLZ7g4DjDYDTJ0+sLJJyqyApe0iNTNlAgHKHR9FYUWEVgHdfi9leCvl7vaqZV Bn0l/3E+5LA8YGtiTxtx5nvqGKudxItMqd1x+LwTiziu3MsKAwWztdGzR62l7D7WZ1t7UYGSFaZ3 OF5ozu588ww6QEpGqBQKZ0V/BuwGSVWOU5J7C7AneqxBLjALOKn5TqKij5/EbPVclbOtClV6onGq KB+abvCUVtdxPhIN5l8qjFN5DJ3CmOyxjg8dY51jOm6kl9mUiD0lxpidxZmEYbMtC4B7MZJnW3nD U1ubeEqZEyOj1nOPfJOS47Ny11Yqcw8Pja5gXNrp1N4Byf8SUsQA0CBUxumoYP0uEWkXQJoTxJqW xmcezNDKSk0GCLaV3UV5rLE+Q+5M0J0wDaOU0f2r4a8Cr2WkvAFys36uLaZE6j3GOe3Bdf/3yDKq Y9p8v/H9RkfLZszh/J+IOPPsQ3Pe4MNcmPtX1pjPZbTOdcYxTff1tFxP5X5XR+mgNGna1TZNv5Ij MMEXjza6L77eTG+BGSJQeuytcLZIqd17b93pVvHsw5AQEMYGzcMl4S4Y1nrUKlQQOWFiPVbWT1ao u/jcGFNaRK7dBswTslJoyVMjhGFJH0kqTkZa4mrdJqRTY9QbJhkzBa8AtI1fjgkALxCuh68ygRmI phAaiaedzNHw2AQ82rnLI1J+cZVEJR4JxmYov3aIB3OXxXoMeJjDuzmDhaj3RyqEXM0VyhPNC8z0 5gFwFBh6F+dQaGkdrDXIPcrXFMSl7SxCwfB+NbawkxngyNC2xzNeMZry8Jm9PEtCuHk23s5c1L/u YhP4gIjxGhblQv5w1Ue1K+Qx2at6dvTAXAB4VEICS6kXNm09ieVeWcmhXIj3G/DqQ2YpGaQnVM+C YTCnTWGr4HbeBO0Kc/mz8KsExobq7WQmAHJv7EBROGcc9QZp4SaBQy5jjC+BMGPouJo8iJCwsorC WE+vC9suaJYC1EOtd3IcoaMHO7RjXnYrm6S2tB46y8717a3jaWjAxzWc7qEKYB40SUOCA7nYetIz l45rKQAFny+rBthwA6dUlEEyqpkDlZNVYc4W9LZUQksMCO/LqAyfzcwD+JhXhaVNS6YwBhbwSBkp cR4skzUpbYJzviIpNjShQwQq43T3rVvdky+fVoUSLhhvUysxlSoHClsFprVTqbc7I8d8EboJVAJB j1x37zuZ25FXQc0xagJm3EIqt3iPegVY66yWVyUsO4dGJVKNAKUh1zLC1bAy+/70rOhTtjNXwR9b kYL9OLtSi9nyeLvUhrfu8eSM+1P6jQDWMbOhkJQQPBss/lkVvLQRvTa8rJXr/rIluB1DBU5R7szh POBSo02MZiOTdD0TZyRUV/SNARSJdON0ADXowiFnnoMG+aDtX7nGygaT+Uwq87tT7CG7DAoOnA9L hFqm0mtknliD1uG1QdSOfFYTzTAAkyTMQRrUUwg7aUoCPDe1OSaRPzyra1ZO9/QslYY45yv42l9+ +jUAgE6qrH3lxIGeM57XiNksyk4ZamK4glwDDJOEqjWUs9S447mNSG1SdnOR0nu0cwl1aRvALfBc RSkro63pbCTiUk9zIl8VGVK+OiSRo4V302AoUULJHq6fgOtyIETPuY7woiq2x6ygETqJslzB6r+G zsthofcrHswmxON5FJkquwQt5pT8/7j6zyDNtjQ7zDtVld5nlr/e9G0/3T2+BwNgMIQhCDMAKIFO ovhHEkMkKCqoCEXoB39I+qEIhUIKBAgqFGRIChIUSZGiyBAcORwCIMbbnpn2vq8rb9JXZpbRetb+ 8s5QdTu7qrK+/L5z9tn7Netd73pnTpR9Qemxh7tfcxkCUQ7vvMrgOnrtM860krXgWuVOMLOi/Kpy GsRNwk8G1P2iay0lgYIkq7i6XolA1YXa14DPHfvVQVxjQJWqEnTyBVm7otbsBVqkhRqvH+vk32bT N1nG3jN7r3+ATzcsJOBGzop9MhfZSZUs+2Uxe+VhkiDrHqs5Aqi7qXikj6kdDNYxNuBpEmkVRhKU +3Hq9hW/ojES0OLUAYP4KHuSc99A7ch+1fQn6KPc1B6DnIPFJdrq0/QoCaDqhwFLS2xe7ElRfYFn +33QTgQ9kOTs49joJ1nPKkM1Hh0BdtOoj561xG0giecUtDan+ntfPuyp814ZQomBLZfvlbblc4Ue qb7OBbBYzDWQRiWJWrqfhkqfpeopMKZV7vsWkY0vlibuAKrMvp9rHkHSjJIkmPoouBZcso+CrNGT UPpH/QEEfHzNwqF8xBg212SiEbYAfPjHNt4XpBhD9ZqU9t5HcH1aX1TDnIpnAvAgO9ydyjLJ1toH 4gSJqeZM5sy66HPZTCJ2cDEVYCBR3mw9dEzVB1Sx26FH5oEEkc7eRycBlKGf+t1zyWe1hwC9SXCN R531KyBaVF58NMbPk99TxauOec6ggWQnkPrEDiuqJ/uZuTCjwoj/VmOfvL/F5Hc83cXj2OKwGC6k elmH4+ZrWIZPGrGahzTO+Oybs989eEGPrxH4zt7ED87+fP5vvtWdN75/DqJ2gWffH1IsH8WXH33W Hw7mnXHJmNgKd9qLZpXe4V8GAPUs190kz17Kq1CCBmU2sU3oWh8ELHk/X6sJpi9nIJzY78b1rYhb bE0vv/JSn2t6wqLVGwOjOYyxchieVAXA4UuAkHImFGGL1JMSWj7wAKUiB25tNeV7ciSyOJxe3EMO NTejkc7ru974l3ijA5rNQR98oGY8M+PvHosa5go6Ca8nTvMZ4zzoHgOLG52u50F3c+e+R76FU+hV OEp9qN3Zw9E2080XRES4mgO8djVjRrOhnty9V8rCivJ3PquNHPnaStljbksyYcjD4/AcH9RQ3Ag3 CZ92fTsqDhIMCQQ6CkfejDFOAp+V88Cxyycq9ZXXOQsEzp2MjV6ultK/rNP+sA6ChQYEebAdnAGB wXEm8wYNzjUqtWmYyptehOgkw92Nk7kVA0qLdr0jScO/TkDKMeF2PYgzVjrfoN8Mcc41H8YZrz3R je7gMc4DlYfMGOzCaHMoh+HDQYja+c8w4JXKuvP7w5QgNYAJjOnf2rUne3ltAi7TviQE6+5FomXU czYkJwCVUr6FwO6FpvMoPLOLafo5EPDhK0LxXoRf3uuItJvgD/LE4CrbUclQuoGoloubVcp9CmpM VKMzPKcpkhqAbcChQAizRw4PH5cexBCUH1/KAPrBoBapTjyCLIWXKEA4TGKwlX3EKS+mm1uyuJMy MGThlBqG7Fcgq4zm+vK+plmFrVON0lVSYflPICkjJj+ok9wB7mjnWgO8UpSEBI6+n+vWDAXh2NzZ yIHHPB7STzimgk4lZ4E9DVx/1nxajnURJInwkM/sZMLz3BRCkue0yrCjReTMH2UtDVWxDs61ffUo BlhJ/lImHGrGNCr+JJrb+9SBBM752sgzvho9dTbBfRvPThrs0W4ChyhiLPH4ue6F7NdVyhN55qfp 5ia4r6fhRQyWPW74D8OsUtbTm+uFZJej7+hymFlLQfyQQ3Qi6F3jAwaF0UyaQN4xr1KOAUh5naSg 8n2zfZIIps/O3mylJm91lO54Jc/dBKqlXrC5SudxKB2IkfVyrtcvhw+ec2oa6nyCWeZZlXot18ne SQ44zZ02wA3UlZN79dWdBvS37zxME9v+dC2o0KV8jkEabYaVwOc6URyeZi/eDB3k8hs3MwVsafru Bw+nW9+6PV1/NRrjyrS5Xs1wRyd3U6EaDaHrQS/nE2Q2UcjnbWUGwb3Hj5Mg5bo0w0HJ8pxRI8vH b8Ax9lFBlZZHVVNjHwEayvR5Xaf3Rl5QJaExGBUgSVnAmromAUEDJUFx7jWlCACEZA6wMKbXjbNg 2Az7P5pqmVr7WiPXaAxWGud3NIddyoWqCjoP5yOnUZWGbm8ai3OWJH+CSGw6MfRubLmfONJYmD31 4d2DNIcBAkYQw85KGrcSNPIT/JhKD/nCgiG9j+ydSlJmTRhrgZc10ZeQf1+snySRmL2bD3OW2d21 7CfBaxvbYxNX8j3UqGK01kglLvCgiZ/Os/dbyP2rHBmExJHv78du6yvJGuJFS9gupWF++IqRFJUy 5nxD4J23fA+wspr3BWo8Tk/Do+yvU1Wy3Atb9V7ojSoEH6bHAwXt5s3t6bqqVxrIJZWcEoCiZyb/ 3vA9KkeXAjhZb+/D7w2mxKAetOLTKHlodrdy5K8COuh4KG3H2aN7kuZSNBJXQJZzv8ea6fnsJC8S IYmDyuE5qtzghsYyZDxv2gDYnq0/lCCNhmda5a4B6FTgQ7UndrtDfLj7BrejEjN6lgaK3r6mVlLy bARNvthFcWGrg3qUAElZX82MreJm34lzBKh5b0lwaSKz3zUlih/dn54nv+xx6LWgdj//GLX7Ni+e 1kclRvAV2gf796zULDrvCbazv1ybhmvNh0/yZztWz9CCOQlpdD6Nr1XF1uhNxnMlQKEA+1kqAE+7 TwZv3X6mZgWgedFeC5xo6jYXkpQHT4dq573ZKf7YTAPXe2khPg+QkmBe74zem6eRUFxNwk8NrRUt uUb1zLPLDcDLnikyV4CKeQa++vM5v7kP5Q99WfBZmOaBVXBcsieAn31170t2fM0yO3c1S4D+gNZx 7tgacM4Q85FAfRRLqeJJ5vLeADXTuGujc45K3cz7DztwPhxsUJafxf6hg5p8+yhx4P2syeOMN6es 89prN6c33351unz1auh4qbJnfTY3thu3BXTRyBVkdXG5U9YOwxl+EK7lqoecaPwgDqql5FzM02x0 TUa+h8tm2hdjYxPazeuRlzJE4eQ4JTONCQmiBclKyUoZGhshYFpVGGtB0HmZcKiL0C44jylnTZFK dgycI29tWU+BSYNnfxmBtV+DCyxQyqIJmBpQDwPpv/KtZC0OVXjiq5FXuXD92nT3/ftBp3aLcp6l 8cpEpjZAXUpgnfLc43Tjv//+vek7791PKXYtgVICEg6jn47OO3h7vKzmtjqvfFb1hrNhl7KWRlPv R2LHwTVhq3QBD1njXn7uOMjfpTjSft9DLu8zG9VBjtM4Drrh7wtp7NpPl+qToF+rmQInu4V4utWN HKb96HR/QG4pB+hqnqfMdzff204J2aG7FQdwnKDzeu6DTrVJhQzucZ7hRoPQSInh70VrGFq3HYd9 IbQX6OZR9oaNWgNQmgT+V0r9NY45dDFAbdYM0iWoVZJq93yNkaa9rG+MAsR9IUMbGCvPiZ4neT2B raliJK6oeNzIGN7R2JaSee6VukHXFjWpCbSkjuJDjFHQIsERNBBP7VL2rgl4Riej1pwnzxz7hQR8 qCkPcWWzHtWRxccksWfvZN/i+ELSH4STfeTaY/yfJIlSAdjKFEc8XBWAjVwv1P0QimTQSb6n5Pos dIrFSNEFaGlz0dLK0+lG6AAoO3cjn7b3OA4QjQp3L+8EkYPsH1MrWCfTnEAozwWKySldPI7YP2+O bnFA7D/OCsKZvbIuSWLc82wEcEX+q4aZ4JfjmaHZ/j56ERLIxnFvVEcVepdqx372URIZTnslKKr8 ldHhKK+GR/w8e1aH+2MBxGXi+1E7iC0gs2maIbmwg8OHGSkdqbpkx/fu7Fcj/uXLS9P1TH5by9q8 2M+5Z2ejYeykb1zPXma8JY3oIiovDHr2h6D/EX7qbMiVsjYlgHbAt+FQtMF2j2ZEzrvDNUpzS7CN jxsDTAGhUn6oJg3Ghsb4SPJpuuZn4rQ0YtuL5WpCbfPj7nUxuRd9cfSLwYXP6wW3SSY5ocM8S7+v W0ucYig2CkCu+9YH96u1robShuZsQ0ijAPXhfdMYYzNx9vN+j0ItuZdE5lmuceOlrem1z7w+3fzY qx11/p3fPZy+/I070+M4zs+8cb1rY0r0YdaOnBdkWbC3n/10cLbQ6ZfURb73jdPp2nzOFn+V9Vp0 dgwJU+6UxbfnZyDPDulISuJQoGCQG+iX5K4JWBLBvBb9acg1lu3SfcfeSsw/EluFktfWsukC51F1 HA1ff8CRb9+ENaWGk8/y/CDolIIuBLAtiOCiMglWoCrZpdPM8V5PM57nfj9rtt99GsSa1jNdZXsk a/7ew8cFRl7NkAxJj0mx9oz1ESDc48PyUAz88Yzw7E0NfR66mAob1LdIca7nUtbLepBl1FS+rMck 97RPUUYSEN9mFHtpANkDbL5gaWiCq/wBTCTZqTfkvg7y2h0JgmpIOLcQwcfxO21DFTjkWbNlF7M/ GvhA6ylV6R3xQJs0Zi/HtqzEybNv9rER7HNBHF8s5uxnbzwOIeFW5lDsxaZCq1+9fjkDLl7KqOuN KjFdoMKT3hOUtwapDUZH9euF5IPNlVjmGb0QYOcmBgpquBpfypcLFIESwgSSpiiECSizzz/M+bAv oJ5sk/N5JLEw0t5Qtpx3w8ku6vzGx8+tnQQMopIyn4R9LuOlXySWID2oV0ZzGfWiC4lZBL3nKKRE uqBLrrFD1wQEaCrCpwZqg3401GgGkEFkwkAfe6QUAIGvfhZARHzqQTjsZGnd10FsOj97RgqSq897 qXh7LZDhoLGGUCOJR2MDCciYUAx02E+AdpL3wlLRPK/ZNEYvdBnVhaxrtqb9tZEZAipEi3kuZGbZ k1OBXfblemKI1968OT19L7bp8W4SqdCJspdOod352fxIOeESg2dsJF8s4Pdsc616BjTV83EqrzYk /1zVusRn6HJJh0uHzHDlVpYMKlsR/MeX6hmwFgBJ/PClJkl5FvYKQFa1Mgo/I1OZ0UQaNDMWs6C3 AbKofDyT/t7Xe15iBXFfo/bxb341axmNqiPTy+8MoPftBM98U0Ks+gpQN2TtAvnncY4LFOSeUYRG X5nEIzaga6NyBrwcyevo7zPRN2/bxOlkepTzsZdzDvh7lHNEzWUjtL63o7bzzsffCA3k1bAcbuSy 7Q8/OC577iTGysHlkMVyHBhOmuz6Yjy0oOp5DgAn36EVubTLeeONlFQpRQjArQtUyyQs2rN1ZFQ3 sn8EqpoYKFRAc8uq89AZEUZa4DxqTuVU1gjb7BYYrzjvXukwQZqyXIPlWVjdQ4RqMmPVFb72LBhl rxOq+7FRSmPwm6cpAQYlFTwcRwRcYPs8iBFu6UEQW58vgPzmt29N3412qBHOFA7WguZtBHGVsXig RWN8ps3SGJJDGVxwK1wqkc/KtTzR6Ic/m3scWuED1WJsUDEOk9CESltETYOeDOpZNmqxOQ6pGXHK wHkdZIJUEhUNjhDSLwAwMc7EsiMj2vH/GEHnK/d9nABt7gllilQcogX0KKgC/uorSzFeeR05tecx 9q/nmgUAMnPGU5LVkb0zWZ+tKCBAIh6E4jBQgRzOiLNpENoOP5ShUrZ2X7jSflF8aHd+tWQHatZn McsSLR46i1LhGnQ311zFkbxW0C+R6/hw8lQ5HFCeczWMUo9ykx0qwbjkXvDJ5hJURRgxe1qZd6B0 pzkUT+MwLxk0E/QSleUIQpaD3GpFps8N+tdQDYBi3I8ROzjcrPNWpFAygzA+CdfsIIoiD4N0rq1v VTVmLfzbo7wPTdCWZeNAVIE87Q8/iKRREjdNiQxmG0Tz5eztNuCLM3G4XWsuAToFcZPAkLA7jCHd 382ZkyzkM865cChKlQrrz4zSvqCb7qp9NRos0ZlSHYhEl8mNfyDFlv1A55tsWK7ZRsqjbxBg/1nT OehM1ucgVYjbed3FOKNN496NbRaM5HP3w7mmZCH54EwW0+F/JSj7Swkwb6byc5opoMd3Ejgyws6z Y+pDut9HBatfNcLjnDMJHTyCjjWzB0+yvwVrhxeD7sa4LifhEsjOp6fAczlKgNpqMcdnTdvBP9DY szyP1FMaQKM0QUkFb9yvoAgfVJupiYTtIch1HOWs7Kb0p79a9QaC/ihJeJFZmX6M9WHWxPov5flr iPXl7En41mMni9LmnpfzJqo8Z6ninKXU/zCDqQ5ylhdy38r6W0EoNcM8z3nbSAOnePdezjnkSkD2 SoIiHNhbuR7jop8HHtMkdQp8cMwAGfGSc7nm01BX0C008JkcN5fzGvPVkeF83EJsdEd2qxqUemFh 0D1y9o2Md76yTgKBNsMmcb0YegMzJ7mkCQ3NwtXVFEamC0p2Xl4+fBJ97/w8AEWAKVCxr+17DVyV z5w500FNgwYCGKKd75wa0IVWgVNcBGOc750EhMcJJiV1ndiY82kQ1bUABfXVub59CSdpzWwyQU1R 84Ei1UbrKzIxkf21Bq5vyITG5qoY5f4FiNwHxHyz0lpDHaI67JqZ8/kPYz8lfMrv0ElJKQ64z8f9 bpKbSi47ej/P0fu+9HKeq0CM/F5+5kns4kn2wEb+TZOaRHczAdVAks0rGAG1QAiIQPmErd/vPkcV URnT24Amd3F6OdWR6q8nOLuS/QQV/jDqVqhfGqw28t6vRS7sxkvbSVpjx8P/fobHnSSv53KEpA1y BCmjWj90nAEVH8VFVm8WaLM3e7lONBq2LdF9uLjpIbAP8/BWU9kj0au5ngxdxQgSsA+8dAwCqg5z ZSJn1KQiy4WB62dHXwSbX2eeaxogQWlMM6rDQKedAyDabPDPDOlsQC0RsGfBzmI3vqKg0sy+8Lts S/xBewFyNp6iCMVf+BnVXnYUrUMCiuajwV6lT0VTzcS9AZcMgwGM4GUfUfCJ732q1FNMInadZG/s zyLVKLZIDNXqzpARtd8vJYmQ+KNn4Fs7B0/0dUnI44NvpDKynmt/FP90GLvI1wCU+Ej3aU93doBn CrgK2CVw9FztVzGeicjPn+tbGEpdEuhVtNDcs2ocyhlgwsL7ubnsyQdpGl7ONR2n0rcQVRe12BjB 3ktkTap4EyM0aCFJimvkzw/nCIw+2mM1PB5qna5nl682Is5+xvM7/34RAq8Ta81+ZqAGA8UuTz57 SH9J7I0qTN/VOfZMc9b0Bs4FQAPvSnZ3H+xWXWkz9mM1a2rgHNtyEBuveuren0cAIcheBx6tByha 2nkxvRz/t3XtSuz05WkrE3E9z+fRXy9lVHlHVTRrndBDcx8FijiSPCjITvmSLY3HqeTf4qpLLdjP Yps+dzOIk+ZEN9BsJQt52sYZGcBoFhRMQTYGP3tWRuoi5hOzSSyFIHPQN0biIpPsEW81wUoPvksP +yxbV0oaXtk5k6bMXtf3GV+dVNTnMIJ1SIJN773YagoOOouf4AkjqreUn8A6aO27GaV7GI3Ja3GM v/3uB9Pvfnhn+rFPvTH90Cdeml6Lnu3V8GpoQupKHprNguXhmPrcxxXk/0bCMHQjPeDRgdyBBkFL BANUIHAVKzIPPeUYGJscSEa7I5uhH2gnvfpxL/g9/qaRJe6g+r/WSCPN5uU0LSZAPf4gz9LDVnrP Mzwijh80SCbn248StMzn2iDYDP5DTUBAPw6tzs7DgIgF1cvmhFope5Bak0QdpHwkqYGWHMfYX30p FIPsjYdp5MIVbLAp4AjyLNhcDdqpDNxSIq9NBpBT8b38V9UKaFkO+HzUI6BPOq01aI5GS44xhi5r dj4plCHt4BSKCPSKs9CuXwrfhApPcsBzsxI47jTnM8qR9IHdS8tGjL6KhnsSZHCwjG0CFoZWskWG yGP2XNfaMOcZPW0Q9CwHdzOUgfLtTzzfgSBAcZaDEN26FXpF/r4ZZ+O6CuhLvLpNC3l0bHC5fG22 pKAxmietDeRubynVihj8tYy1htA8S5ZcNQKNooLqoi45p0GLyh3O+gnIoLjkttYiAydIFNirGjxM oKYRstWUXMJ6kkj7rJxnDr4KDYOveYrWlfNGfmyTYkb21QP9BJLF7LuV3KMAyz65kGe0GkRhKwGm zb8bnulJ9oTBmLjvHd5bSMnQJo9dGZMjjsPIHjJAxz54kUAeX90RWtbzAdnO2owAJTzwnOP1JHQx Yk0sVXDRZ6zzUVBnP2hICDrBwziFlcNouZrGSKUGZxBCkfV9QGUh13WGZxs7oXmHRjE83EWrpqAV XAoowTY8i+7yTtBlz2b+Se7dCPIOWjhMIJWx0/ZMchUlVrSa3aA/m5sZ8JKhVBzTQrro7sdLo6Bc UlJt8JdKiP2fs3she+t2+NmeDRoBe3EzesUPE8R8EG30o/yckdnQGLSVzVQOtsL9247W/Fbui1a8 hl90g9pA26u8+zzn2Ivs0P5/aTYNCmqMi/x0oAoOZpNyCH/26KzhrTa1o9NNssz5aACWKkHOHtku ybSAUSNe5TQT0UsE8e3FtuYBFDfi5CWv7Ez2XqX+BLDQaX+fBUF4tOdNYqyqdeAXSOEdJMiWOJqx QKnH0IY79/er/jOoLFQvQ2ujx55kQsm8MnGlfgi2CB2M0yxwdn5qqp2PxdH05YyQCVVhwkVdz3O+ mLPzKMnk49i0tSR2m/ETx8CPvA9q4SLkMtcFrLp+beujJkF29JVIt+7nHECuJdInjxO8aDwHMmUN DAjZTkKK6gaFbRKuQpZ/F1xrrAI2SD70Rzg3HXQUTVHKT5tplkUX2HuYJvTcq2Zw1alX3si5SsXT Hn4psrJsJBsKIS4dzWLBoeyTfFZA80GhyHL5EkhKdtjghsSGkEjC+PXskScSJ3S72EwJ/cMk7Cf5 XV/SCzMDEsDvVhIRgJlKQWzFej53KW+eglb8PrUcVVwJG3uN/52LwP9uQ2O+X768DRd7bfBPNuPo 9Rr82ValpcquPd+TWJ832TawbsA+i6qb1I/g2vCo/luFGvCth+zcGHSUptJUaoBg+ypqguh0FfP5 kOtDwTUQqPSmBGF5HuRvVVDwqstfbyUmCZPGVkFX7gO9DCotwAZK4fPz5/a6ZMkelTSy23yqveSs GiqleszObQrOfT9n68NHD6fVXKdK63LWiE9by+GkkY1aOXToR+zA/3UoHCYBCmueT/WzVcrJQxI6 ALKE583XLiS4XGdLcLBD4RI3rd+I6ABbEqWyiyofXscHpSL8UaCbMepVH2jw84dQ6EZIzYJ69kYg xxn6VjdgvmYUkPPvnQfn3aC+6jzH/mCl2QwUqXmAXZ5jKk+ELfhG9E7JvcrG4rMkM6UCAh3sffQX My3iWw9TCUg88CgxoCFR7BOwB3hz441XApyl0pP1ATxgGKzuXM76RYLTLeeBHIStMaZ5uqUB0Mzh ZJGcOggy9jhGw+UKItyvjVO7qzmm2bMvN28/ZaGzwQSW+K1L0LTZA5OZengVTBfc5rUe6pAQGvyp 8qlmzYkNevPvcw6Ite7r7P6RubTUK2XPew4Olm+Wnd3wu0Tz/jeCW2fI4o9/G5t2gNoDpZHd+Ldy 3YwrDwn9KT4vObtkc7cfPpweJ6uHAr+aSVYfSynmtY+9VAOtoaljcLMJPTSIyCLJg372bMOUjDTb P7P91alURSzzWmoFnkI5z+M+GDRBQ9UgBCzoIm3YGoZecgFrepK1Pc4CKXE+DW3DKFwZNIk7TS6L oSOsxOBPl+4XtVZuh8hASF+AbPLzT8LVepq6t8CI0SjfKAtDu9pzPsq9CxKfxxmaANmqjevTJJnA GHJMp7jNnDPD5tmfDxiQnEFHBWPlhnuu+bmue7NV76ccZh813RllSVL6suYqWwhyw+3utMwYDVPN XEPQ5wbAHnKu/2L2Ht3guexh19kmEw4iv7cRnCGU1dsPpsnlRiBTR+FMoWdAK+ZTZXHInjerc3Dz vgxR/sigHpLbiaGCUHT6Xw616YZP4xx2c26O4hwuauRM8Poi3kIp2YCWS5qqvDZrwJA5cA70SQ72 heiNM2wqCnYNQ7kaNEKwoXl2L+8bFbrwk58H1cz3uyYj6F2IFl4bhFRCluL4Y1hk3dZ2yJklIMaL z54mEea54nzyPOXM5jOfJFjA00Zb0FshgFxJ0A6F3A2XpbJfksWutWqDhzXGunY6Hi+WoSfQwzsx 8NCTQ1Wq7JENqEo+dz2ByAbjexD+750HleJEIapOdR6m/YPK4/lz8G0mosjCUFKlhMDkTAiQJETK pq0vep9OzUxV2T20shJOd0vPsUWuUd+FRIrje57GrFwXhFlgJWE4yv37N1H+WZFRhnhw32tuIGGS v5ztS7kH1AsccUh+j7YufL0qlFqynqYxVtEi37uUIHceDzKvI721l0TucRKM+QAYV4KQoPzsBMF+ nnslaaqq8ChJ/pFpaVlbgeMH93KNWeNXXwpHOOjp5QTPC4tBxvNe+8qd2VXtQ6G/znbGVgjcx7CU qO8ksd1OIrecf1tR1ke1qA2MM8g+Rmtr414DieHgRo4+rGj7P2o3RzNa7VcpHDmP5yVnkdcMcWO4 R4PXAFxGI+1QECpYwyf2ugVss2DHZzsfRTTzTDlxqglof7MAD/XBIJgxXnoY1TbhAxM8W7xS/FTl 2iQzlDLYZApIngcbVIDDdc7skuSSv6/8Z5F0HzZsx7NM5FtgV1RNNYGjXuT7znSR6qzvlasJ6lPB tN9a5TscVVj7R1+IZn5fKzTRYxedw/mcLbKvC6GAzGWtKNHceXonkmwa1FRYEjylynCL1rsEInaK De4QEMGiRETCp2LJn+KJouhYEVVNYESbN0fywHfx7dfCr95Jj9BKhhtptkXFQTOEiF/UG5L7cs4q Uc7l5g3bvD3b5wLCk3wzZncEI6hAzUvHFFo0oacSPWeNT0Rfkcigb4gbnKMEgtBmVLw2iSVovEB2 MLZd8LiymUAz1WBxiN1nLw2fgc4wgl9V9AbXdYZjv3av2meC8Tp918WeQJuzx0atv8BK72cWpI1Z E4P2Zn/xGxJ19EDrAlTAZ6YkdZh7wjg4yL/hXfO1BX1UTqDDI9ioSgnaEo55gRHVIZV9FJB82CL/ Fb60swCRnp81/rN/VTVp9JD9Q9nFz2VtSs+Lz7QvarMkDAkcV+dWYpuSWIdmuXOdihBAI/Y/topo guTlkgqQRC/rTt6Rry1FK2t17heX2jCvAXhMc50ySA8lWDVuI77JxEjP+jDrAyCbC9jhhxce5R6y b/h2PThrQXOXMk33xULoGE/zA+Vde06zIOg8SJ4xFv4gOPLv54H1LHibxUsjgM6/e0mTogEg9aCq NBNGaKo3hB7YGW2aw87EBueM+9cm2qGJLliTUEHOgC1B/CXjnicbsbeX3qv4Ec9WQL710rVpK3Ff e59yjtc3L7fiq59A4AwcE6CryAIe0UzmM4VZ9aBN285QrjWDqQZqwNHjGhbaLuKMezOGfxDMdygX MprUa5Q+cS6rNQ1JzaFYDqehZHAc3gw4URa5lEyi2pjq6QMv6MFgxIfsH+c9wtJWD9q17SXjoDTo bg1ZdOfMyFRnQWtRRnoY403+IGBHORgNDZUGqkcZwewoP49AXJbcRpaUa+Ze7HTEJRm9q9EBfZiy 3uNQRTZTrv3RT7w2feHzb02XX93uOglOcGhdKEcnG3yRw1C5qjoOFzq4XkXkZg7bQe6lJBPs4ufK 4dG+iQttoMko03gXnMfR7NJOX/tJJpZ3hagd574O8pyeJECcC5JfefP8vErA5k4QrEikzS3cqlwY isSFNpgZLiFiSVCVP1+J8/fklTfx/XailHL1xs44MEH9IJRLMZKHKdXSa3boNRopsayHc75ucBAU JeOj7BGoafUz81yVv+0nSJSSbw0qY8f22yMMuYw+iySTb1Ao+O9BUNIaB4kzWI4mMl4iFRKBYJ01 Azo7k55hkb8YLSjl+MWozKpIhjRQiSkFpVF9EZaD7NFb0SZmHMm2VX3D8yuCNeSMvE/1TZsYDU5c nz9tVs2kucz9GJ2t8FrbW5DrnsOVzMOQRFnfx0HxJDNLqdetoVhlDUjy4WsvrI6gxWapegWnI1hK AK+8/Cz3ezV78Erk1aBhd959WGfN4RZVntE56HEzKNAFz1J5WUMVio2mRQGnZ2f0sElhqAocsUDa rvX8KFMIwDiXkwQTAla0lPUgKJLo4ww4eZAqxKmGyThrAwig++zBvfuHMU4JTqrIglc5JoQ+CjJ2 KeOjz5uGUCAW0TJw451lPMAEAMNZ5vmZeiagyV56FsS4+8IZg/BAQXRyN35IoJL705tznKAKpWMu KOkiBRrJWZ7DUu4dtQiqxTAqTy8FBYZsFtUOuuY1S+kpcJ8rSUrZHai5fWl/QbgXQj3BuRUYrEQF ZjkGlmSV53CCykPVJp+PbiW2gT5DdTW5USOBuKNEvPf1H0z3boUGolSbz8OxhzZbe42jd5UtE7BB q+4ksfpuEBSTRNInU/tKu/rGFX0Ua9O9m1u9huMkN5Jyklk1/qVyaAinEJF7TiXiYpIICCIKmOvw LFCGcCVLIzqnzqk4MEeSnmYXNci1t9BkwRu6wYU0s3JInhl71iEguOdBZNvoyFe0aqmyMmh5G6ku eG6VgvSf9/W72CevQx8pilaZv6G17s1H09lIhjrhNIZDgqyRcjHB0MUkG0zBkzwz1LHdKr3EPpD7 FCjh9sYHFbkUsLY52IAW8ngjgGbbTBR1bXuhaxSJzMcLcIyqtgD2FB/IsgvS1hIIruffBY94+WQb bU9VX/ZMgO0e7mUmgqrWvTzL1Uh4of6QCqS8sB2d671UjvZLR1C+Z//1PmQf5HsrOXcavzuIq/YI qh9/Z1/m+RwEWFGtaZApAE6QrrIs6GvVjf1j16OD7jV8VrxregR2G7w/N9irw5aEJHjC+fa43SLl bYbOF39jf5J4q1u1JqpJuRBJ3iMUNFr9xxBRMpipgGVNNWOOIBT6Px8ql0Q4NBQ/HjrZWgIdgNAF zf/Z3xrMWiURfwisW9VIcI22kXuej7TgQM7qWPO/vKGqLtvBZhc4m4FsBaQ885ExFOAQ9EClARSC 0bwNO/Mk9tk9a/R7GlQa5UZCzxdJcg+dqdzUMapZvo7QAgWuAusmi/n3/H6g8T6v1yTLdaxlmNv2 cqpOVdMy22A11duAL+KlAhQD3STbqjrB/nnuV/O6NfMRVF1jIwWBHWam+V9gq6E5PuFYApp13LmG GpepjqmYHe7Fn+VZrGtSrVhA/FRpfTljAmxhFMpA1kQyzu4J0J9k1kCVqnxefIJKyhowKOfkDNUv 7wE8iMEOYp6zdTd+KXHGaWKBw4ACNyNFu5OE80UmDU85k4GIRbh5vd43cVsz5XypSoh+Z0FcAyZ2 xkP1XD2I/mH25QXe55wiNIsLJdqz64Vjdj5MwdSRoDS+c66AwSpAAUXmqVDltc4MGiAb9l6omrcT 67k+1I7LN65M1165nir8S6FNbTeBZMJUilT+q1aUYBsQAzzWX+c13r/iEBpGJZTiuhyWuV/9ne8U wfncp16NCsaVPMjDomYVlGJoSdtBp2OgN5+OsZc2rrLPQB3HIXYzUASnv/I0Ag2ORn6h5GlBlXD6 flgvM6pHF4QBa4oy1lkjySxgrHJIPAhkawwDgHJrPLJTzmkjvj1DZvKS8rUdUBwl3+/NavjykPPn LIiy0QX3YBAMnuXS2nQ5Hfpv57B5xt/8zodpPFzKmNgr4U7GOXiL/FcucJ4SB3J2QcA8OKTVbZ1d Q52SYNJnztbL/QuAZ/BQQXlfHLdJhBobCJHbe+OKOUoITTZJc4/h6KqdrNyTTH4pKOl6nL/g5xnO GkeR5rOtUFeoBDC0Mlibx6aroD5DkAO7n9LjqkAo17xqMMvllPFz+H3SoaAojkhJSAn60oWhKLGb hIMR9xhk1hrwqBasp2SN44reUiTCeNT84vSUDjW+FpWHlORaBNAzizaeYZGZ7JciNilpSwZkfvag e/fcnK8ZKl3UqtHPoHEIjM+ngc38ckthNrikZDQx9AFW/1QSxRA+iINCM+Cw7bty+3ygJ+DA5JoE o/fjFLazniSSXqThJKFeT/S8/iJDTaqRreM6wb8DiZdqiE2uGfqxF37azStDtpChW4EUQZbzvDTS kfZxpqxlm2yalIyEEUVhOUHdyfMEhUW5Ryd7pYSaYAw+qrOKO1ZVCGV6AWm+7zWm1R0mmHwcpF7w 4Nmqmrgeyav1g3af7seIJFmQ1FELcW/HcTqDIzmOjiC+NIGijegHoSxcC5dbwpL3NuSAs76T8d+P Y7zWjG6OfOMCblvUQDqQBWqa90N/gfyyHwI6cpWLBgTNdKwxhPezpxqsSV7xGeNgPGuvpQKj6Yo5 U/J2vxKXh/dQQmjYhyuczxqc9Lx/bgC9xt4/eXFYxQ4/Y796Fs4onrVr8ZmGAq3Nb3S/vEiQeinX uroGHVKCzfU7B7mGrZUM1UrZcDfObTfP2kCPC6gwks/s2cN8niT3KWQyzdMH4D8DJRIgK2M+yefu JTFdz/dP8xXFyybb6BYavVjRxTyHjSCfr7ySsn7smnHbu7vmCmTvZE9rvApDv8m2jQeFbRUjifRG nrfg6UIiGxYb+lmOaoxr/RyHxu6wveLh5q6cVUwH9QeNiWxuvtMyPLk5HG9nM89C05uyq/1vopyJ lq38zACFlsw9j/y9DWgMrICoAuVjL1TVJXtQD8BAGvFZx9Cj6jznFxUcnNQ+j/zQ3Cl5usFF1vgp 2Cm9K+/oXEvwJLyQWPfJtpCfo4xFr7y0uwbqqX7l585HeEuifVZ7c0wjZXsTqD/KmHXBR7L9aVWj bfzdrShxSGQlBo8TmKlCaPYC3uyFbiT4dh/Pd59O775/d7oaG7uW9RmKBeOecejNhtjK3r+qUTKb 6+KscW40GQpM8OEFZPT/n0W1IJSu3LMKhUTG+0BMq3PDBuWMHqcR6/l29krUJfg7YMVpKEpUsPzC nxdai12kO9Wg8jAE2wV9BmWxvttzYk/y+SbUAeWOs36HAu+sA8FAyQwgRQKqB+MgZ+ZQOV4AJ/mw x5RTJe4BC6oyEh86QqbxHC6mgaCyesWBDJgZkpLzbI51zPfaLCv/6u/AkNn+nQXl/mqfWrcqj6i8 VE1kKOsUQGQ7c7322vk8Bj05T3DGs2f8vAR2P+f2KEbZ2kKO9+Pz7AGgDBoG5+9sEA6wVhrlNBzv bG+mOpV1zrodq/gCxIwkzwfPxyY+TUwzd4YCmfsLMMmHVG5XYO+6sgBAnaNUYoBKCLD622iVU03Z zdoKerdTxVxKVeJC4hYTH5+Fkuae1sRuRfCHmlJjiuYtqnkCfM26Q66PDeugGVUN/oByU9WiYj9V H1NZQI58kWveupxENDZliTJGovWsaCspz+JPn4Y2cjEN1ReKMowkqcFRf42n/NHvjfP+0Lf7lzq0 EYz7Q4HV/FHMw98VeMy3KYblC+JflSI2BaVHtNn9MN6rggcaLaNWwmdoSr2fJvl9jft537uhsGqu ffXN69ONV69PV25ej2rZVtYkbIY06bZvj5EDxPt8fknDaX4nyHopdB8+UBKKVt2gOtfe2EQC83vf eL/je995/Ua6cw1niNOi/5cFc/gH3xVaGIMSabeOopUZZhPoyO4kJtOcsoGsibBwDCIYH8Cae7QC QD+nRbHN1dDEBr4jYWEAUQvOZfVGLsqbCzKoAwwU2+EeCw4lG8+iChU+TqDm3wQ3NQieT963tmkE Vc00KAJwSln4i8mulHQuRVZrOdnYjbevV3f2VoIDGrSylU5bStABXekQgXyGgOaJ7NlaZA0G9xpq PvYUTcwxRpVjmCGnSrPZxCPZnhmIbHLByJmAvyjGCK7d+0yJakYtyt/jEAaP2nvQ0U1wE2Ns0hbU 9cjnxzlvpuS8Es5UZfc4oma5EBAOJWWmOLn7VB/wvnMd9DLt9XYwJyB40kmbQRyaDYzgdzjjEfhB NyEspOBaSoU2asBhNBtA5t44dlxe4upByAQBT58FjYHIG9AwS6SU6J4XMhmPVZlMg4cYgWILRPss hmQuzwcXvCoz42EP7mYuqpOoJD0cVhEvFRXgsv0wGvIaKigfyzWyDobsPE7W7RpVHiAgLZvZ9/ZI ghm8v904zO/fvj8tp/S5PR8UNCdN1QHFgUqM0rRGN/rcc3FcSq02iCmfS7mupXbOJ7AulzyBSq8J YpBRyQnqDrMuuykrW1vKGQxHeeNZZ7Ql50iScpRnOcbpDhWaBpgCn1zvUvaAc7NGuD4G0gwbgTF0 1TPSLEvdAl9TMgI91ljTiX32YT78GMUEop71EACrXEDXq/mexSRTeTmAyHoCeFKLZ6QMTRfMWpm2 KPFYQylyPqCacVTPggqvSHAF5/j70BDXVxs7uORY3s5PA6z8n+RgIdw96XWnTXpprrEylgyoc98z NfRZF0LTig/oa4fU1kBIlfIlfyYsqg5QDZkzsCHrvRR1AlmbqodfbJ1n6LPLg3e+0U5inKERqEi4 lCa4tmKl0ZLNU30KSr+VwEpjj0RM8xak70mulUYxVMv1XL2+WVnFu+8+yGAnsoT4qf7N/kszcBLi BfQf6DKOfM5wUe/smU4nJK0mMIxkpWB1aC7l72ms1WwV195mJ2vUv+eebSPVpCdLQd3Z0aC45PCc eTaq53Tm8gZqmL/lmrovsg7VqM8zLP9wLtUESa3EIOvToSEQHwgYqk+lJTXB5pqgkK0+jrPYxsSZ rbefS9PrvyotD8RcECzIEaB7duhoULOOIo+tRT1EcWI3nqBDjEcXIEhjsebdQbtz36hcL5rY5L0K eoi5cU/5tUEpGQ1x50E8ecHZufPa2f0JtpTmnQf3oOH9PBDLTXdwCxt/aBBZEijVpvnw6TfyWj0I RqFDtexujXODVhk7Rcko1zboKWOfahJt0J4A+xk1Hc8Nd5ecK/ua150CKvJcNPZSePDvrRDk31HE ek95G4ohEjkJAjnEMQSGW2THPY+hsgHGHEOWrMf49+6b/KUDUIAe/JsHJLjOQoqb2HxVG2FxG1RJ HZYGMsCmWMHa105BzrOaD01AhWY1FQx+2xhte9h5nKtKCHBDrxQVktFcbojPBdlrEiigWIe8XVJ9 TZMq39DAediGKsrUUgwfZX+3AinmcJ/oSZLN7CmzCyo/2ShtqLjQqbZA+p5Ii45+qIBQAUbu5+d3 VePzs4AQU/jwovsZ3dNJNMT9BZFGhVVz3KLBIqoOPQMSPNc8Gjlf6Emr0hqVrST38RF+75Ai+wko lVuvIEHuSaV2OecK4IFipGvxMEk8ysOL+CVgypKqmomfKEr5jJkS6EcBaptFXbNEKr97zlS5FOGb TNTijj9rxKQucydVl/qLgAoXQ2u6hP4oBtKfEt+Czz2PipdrPZNIp6FxPj/fQXrilO4xMRJ77esP B9jnkfUsYKohZtZnmb7Xjwc8aB/sJLBQLDmjSLLV0ChBsMqWzylHwufnRsV+niO1sbOnewHT0kie 3ht0HhXTtVR1rufr1cjpXbmZaZSrG1lPQ2MM/svC8KOpqizocQMK6l9jqwqCDvpHY1S2ksSs+HdW 0as4wNuBwTdiBBzeb2Sko41AIUKzSBt2cujp3+rwLtkhC4vPBo2BWjWsz6cYJDGf9BSfsp3MpZPk 9TM+mQ3NVca+D05jUfHh3O2kZs5p0OrQAwY8TsDyQ6E7/tvmmFEjai3Pn0ljpmGs/V8DUzc9y3L8 pf/NFqIDVBzMGG6Njw7Jk6D15KIWQnVYj8TTs1AhHIDHyfgFX2d4thcyMKQ6xTP+Yj6uzZq5rwWZ p86s2XUN8EgCwjnPul/bmQ5JHYYL5YbeJ6lFpaY9m5NlLBykhIM/O84G5y6btYtNaZsLB1QXOv7V JuTVYcr6HOYzt/MZl4Neb2fQyL1onjK8yk/taI2x6saIgbgbybQLp2udwqfkjioiG19Ffcj73Au5 H1dT/tu9gBOpozh8L5sIR4lhVq4e+uTk1CByoRCYxpcXNVg2nCN/oJ7RATNBL/GfiyjY5KWFjGcn SYPcLresmSA/RuYg5WYHd+mmoTXhhJf/byiRIG0kYJyukiOn7l7qAIIyGOzQznIHTdCSZ9TpewnI NGNxAEXA2oyTayJjRMEl9/U0JbD0a0SJIIOEghZ4zsZ1azSKSmDR96Voha/lYEkCTvIZS2TRBC3u hYLJ1vx048bWKKfS4oXs5uIkbat5zSouIuxIGTZriIvb7n8j52OYBbEczYfv3Wtj2PWbO9OFVJUO gu5plMRP5bQ0WlWWDwqTD1JKnItWuAEpe1kXwYhgScAMqRUseMYcfAMNyIpmSOhW1nctpS9BMMlN FYROCHWehXTZEzM31j2vn0IFwPm9lHVVPkttskHWxzIkZyvP4+57t5LIPB6DO+IIFuoBs7dzT5Lm Sz6DYRfI99l5vsrraSzUeAvt1gSdM0uFQ0XlJMaP3KNyX8cM514kDPbo9dd26kztw60kHJ3yGE75 Qtb7JEZxS3I9s/t76S/YEwTkuiH/lUzL8y+an/c8xMsUMOfPd0MZO0kAi4KhLLycwPNuZC5Xs0dv 5D3wfa2vKV2QTApLpswqkb/6Ut470owH9/bT8Kp5TUthdHby75Dz19JodpJK1EGSsDfTmLZRbqc1 QGF4FlQ02GDWYv9J+PA5/4x+SJal4jyTrCpTsjVZF1rTi9k7yzlrp7tNYxsYckDLWdfKrDlwzagH VQufmj1ulYccJK65qWw5cxdi++wT6Df73ImweS9UsTaucy5UD/L8HWRDtRhoSarg8yCyk2Nghmtm gWda8hyVoIlz95m5lrmgXxeCNM23QTZUHuo20PsZkFKqT4EJiV+eT/Z2KwCqq3kdmVJULedFQ+Pa i1TRch0CWfvI+WzQnXvQmL6k9J19r8rQqY0qIGgl+dkHoXNcjyLAKm5qnO7lPJftcJgpLanQsKsm YtK/NWa+zbj5/VGaUZ9vBsTPPtjayfvjJmeOwGH43IJIwalz2Ql6gtO8P1TaZEl0DfrXaIGDgpZr awManzboGMe539XQ5fwijRuGW/ezEv9Zyh5VJ4kRWogNvh+Em41Gu3AmrOtBPruBSsr3KsINeVqZ GHS6AYSNQFtIVCYBAClfVQHJz1ZxJc9gOfvsmE3IPSwFyXPWHnompAxjG5YTW7R3RgKWcyUxRTe0 F8gjlo/OVxTcwCknt8nu5EPJ50iwARiyCdWN+CmVhaZlfDs/P0q6DeiU6hu2FRDyfTckKQL2DBUa EnN+8aG7aVB2bFTLXNtd+vEk6FK9vZ9K1N2sWdqdRwKS/zwHb4lqNx9Qkh45oGUpQIs+pK0kEPPm SzhnnfCpAXxpupyKxWVzM3JmTPXbSCBML10ChJetyu8Zshlofqb1nolD8n2UPQlmJRJzr9vZt96H Ygf525NsBapRr9+8mj4d0o1DurB0o9hNjY0ANBE3sMoaabhXSfKh7d/K+psw+CjVsF37K2frfqaQ OusUVFbij9ZiI+6ESmm2wJP3T6erAQDWYx/EM/rPLhVoQx9TdhgTNUeSLVD2QAflqr/6/VmwXYci khUs8wQCc78LFCWDmngJSKSazV/152ex93kSVX1+6HZ+RIIUGksrbRROosx0526GBcZG4PZfe/lq gKiNafvlmwGLMn8AIp3K9EUNiq3m8+NApbFeADrP2/sdhR7pF2CmrIU8E3unAbhKzLi0/HyC65/4 wtvh0SzHQR5knOPdPmwlXqiLDbmZ0ik5sYHmDXqGRZEBXkiEchplB4EGQyajIB0DOfMBEkQL0kQC mgjpFrhwYHaSskRXaWTN1SooquHCrbFVR/cYqgql/SNglTs7UO8RPM+e2Ox7I5s4D7pZgRFs1ygz rnk559hSgwU0yjoLuIrAnkwMEvgk3z9KsI+3pbQyuEMOVYJrPCrv5x51e2e9n5MuVFlRUnanva3B w5VhIsc7zBl2VzT5iAYpDnGM0F42z+OD0DSCrlWKrRmb1cprfWUdquqSUgWO6Hyc5sUngvVs5tIs 6KHm0MYga4rbTqfujoabbCpBflGR/JuNXxWLWMazGA/SZLiKT7bw6K1DrqEcMJMlc1/59zVqMWSx stlX89kaDN0zdFXXOKdpnLLmPYio4MIMSaiHwI/DxaO8kGaj03xv2QGA4DtEPTiCGTJfnO7smTCe +efRNPoHNAhjtzV4aCSzP9qAVkjAVkEtcDjz9GW2AsoMpxAEFLmaIZXoGgICaCDajIda2Z48EwGd ME9QvpTneT2NoT+agPallN4u0TDfjWzjrhHoaRzNaziIolrQ8+yXixKX4YnKcX/2NM4DbSRB016M 1n4MeYPnwudR+IkxkzNBRezZ6u+Ws6UpzLTCOOag9hriPJOXE6g/y9jn/RxwgY31P8ceBQsQbVuH ykSVTvC9dZ/nmSofU56o9KPgQnk7ayCo0uQhwOHkoaXVlFZWz3Ov7KHqSn5mL3vl1OcmmA+kV06e hAwXdD+kyksca9CBEwL7eLRZZ0Hw7VtB/nPP6D6zQzvObx3KqPrwjxfbgBaLwIDg3kuc4pyV2dna 6kznjLSikRHgFzKo4kVQ7vKEu09SbYljM2gJR53B2wjS22An96iXgFQgxzSMQrirSUAERCQVBee4 iPaW64BG1T/oNxGcxM1qFHPfi7kOwZnqR/mXkMj2CITrHoUGBmNxaXBg7bJWGGNwoV2qJEq6e7EL u9WGD8gV1Lr69/ncnfBxg6GkQTRBa+zdi9gGTbuH4Vgf72a9kvUtxO6SmVTKNcV15PVjoI3dtJLr MHToSaoWKA/4r0ghrez17IjGSMCNalqpOUU4R0BcNRJ8Vf439rvydLnmSnhJVgFFeZzQwGd5Via2 QdA68AWXP/sV4sWWdZBOrtF7DNs+zn8Do8LEbDWvOOhedK6VmlUPnDHPS8Ll+UlQG5QCKvIj7Kv3 IskpIKUWq2zfsr7zCLFWpck7a0CeV5nIEqhlSco170s+L8Vmks5bTgKkRK+qAmnGo4brMTNzZC81 tAdNfZZzyWbM42CqIqhqhff/OEodzomt49qV4FWFNJZpMCxKz67lOtfyXht4rzlzy7EjzmoH6Kiw ZC8sGQyicpGKnz32POvgfSpNm3Xr1Fuc51ynIH0hwby9jIoGxXTfGvPtc9Wg2nf8Z7Kb+bVEv9uR 9Cyhmp49X8OkSgLymvrJouP417k+gbU93UQ2zybX8Ch7IMvRSp1/Y6/4+61w/i9Dq/OIjyJDepRK V1WzJFEsbZ1x1i3Xd+R7OeNzJqBCZAXVWfQXRfUTqEGfX2RdccW7r4a6iHJ9mz2h+yhEpErt9QZd qmMAkdHk3S/VhyQedvpBrocCT4PLDMs7zp+htegsbOyjg3CYY0OezSRH7emh+MVORn1F70QbiEOF DDVjM/SJSskGxRQEC8BM68W1f+2VK6HdbrdpE8iA3tE/57kBdyzSQMuHwtDCvcfTJcPgHNMO25pR f3L/y8saxwPO5c+HfHrsxEoSbudEoPgsGuCqrk/d5xhlW0QWQHHRxGeVJH0vlVHmK7Of0TbZgjxX 49f1BmyuJVHUo5LPWYvajHN3EPtOYffYHl7JjtlkS107IJH/m1UqB0Q+vrqhvGwWOM/i7QaG55Fy QzhGfgYwnsfk9ppzrGopsc6rgBv2u/dmX6D9QEuhoThC9XQ/PHL3jHJ5P1WcveRm61c3p5ffeXm6 9vpL8SvrEX/YbkD9pIOoDFL03qkAZOqbZLTSqmaVRIq0QIIKSn03IBEdS0w1mBzU8lCbhzKLe0hM sB4Du5xNczVl3YvJyhm8BWgITnzlTuKwXHSCMYePCgLi/WUomI2Rm1KSXE4go8PZOFqIJg6YcpmD delSMjkax7koJS7lMwu7kqBDMD8eTsracSABo2o4dLgy/KV6oEz0oQ2pk/nKTKB3yBRyM23Wye/N Ln3GCEYbfp8nBUoLM5TkkOHVyKf0HoMnoMGNMxduM8ohe7n/+0o4MQ5LQR/l7wZQVMoqDh5Pm7ck V3OQyPpMJy0HrKNcQJn3M1CC44CEniaYXbkQ3myMm5KdBOMwbbh3Y0jvBYk0nIPT3QqfU+ncAAtI xhFdRkYmi/IMOiMficGZC5fOw13O+u2nDAklm09HLEdxupfmuTQevfPqjcgKPq6xOAuB00E7DqJ4 YW6rAcrmTpzD6dH09Q+DwmQC4pXL17IGQUTzWWvhHN2MQXiWa3UQZYI4h2gFz21s6521FkQdowbE gNLrJFWzmiBO+Xg/QZXy4tOMLF9JgrZ2caN74lEqHJC8NltlbXbDe3qU4TrQrw5zaENsKhjxTi0H 70SayqCVrNWj0ng44dHAOaoeMfrhgjNMjDNf7bmjOlEXOMs9dPR8LPpZgrFL+f7u3vPp69+8M90J 5eNZ7vU0XFQaxy8HPZSUXL28Nr319tU0Ha1OFx/l5/N5+Mrv3cmhzVRH2+9G9j6qy95RBrrEoJvQ d4HkmDJ5DvXhA02/QVo1/mXcObRa86jnupNACkL8Am81+/JCnj/FDvcIbZYIMn44jspNC1dorEby L8MUNuLAyL51+laeC3T/cbigzVU6Ajjro7Sfs8IxbwVZWgvdiUMSoNDvNElOLHNtPY2J2bP3H2ui CjIRqThUE+XJ03SGUxBaXQmPO+u8gBuekhqHQu/0OFwM1avbD46qgGEQhdL0Wt5nfSUNMUHRFsK1 fnz/Xvb+s7wmPLYYur1UBJ7mNdYwGcy0T+0mZ8mY3Yv7Qf+yDhu5DvJte3nv19+MfFkazR493G2y sZyfO5zRna4F2TzN6wS6l4ICFeWjsZw1g3CvhT93IeoMz14kqcnr7ka/dDPo0c1oRlufQwNA4oQ2 thdDzckzTuK0FTSGwb93L9rdpl9GG74UlZzrKxkUcGkuiGP20+Urm0Emg9xsGPIThLGVKoFThgRp MJXk5Tme5TkqNT+4H+7zizSIXr2e0mQGe8RpPVEavhnb+HKGPWnGVCFpSTLJVBCvq1kfFVVqAGcX guLmnG9knwn27kZn/t6DTHtEa4q9ukg9YBYsbeQsvpJAb/XlV6b5w2ixh+Imwd3ZTLKXvbwYZObC JZMgDRBKcJPNc5AkQUCzEGdzgpagRE0SMY5c8G36Ls7pQYYNmQaoB8fQFyjockrGc3oOqkqWtU+A qsLBJle+MQ6eTN/FlLMhypwkZLgo9CwIqt/JdY/prqO6WLpQsirygQL90+yxwwQ+C9H/RwmSiKys rU83MuwLfet2AlvzzOZTXdPk2ua++B7+R2IC/VzJXt2KPTIkaz9Ji4FHyr0LRkxz0uxJ7p8o8eXL O21Eg1pS5ngvw1jmjk141bWX85RreJIzfEsSmzNhDLu+F0OlVCb0GgkQh/qWoGUM2znWMJ6fXcln XU9gvZuA5WIC1NU8c4GWROoJOJoeON1tfTmpUh5Ehk3we3hMDWXw16F6kPNWReNDDxLEhjgxPSJY EZu3Gjv+NNcryXgWcOJR9mmsRYGwy0tRk8k1a6CGpjcItYdjS42FLwUt/h/oA3zBT+28AkoMAsc0 wfu5tfj+Qs2513Uocz5rLYAE+/viIEmuBFBVLD5/A42Aoc6fTdQ8jD6sZAYHWOBviq/KuOSObOzz oLCL+ZxLxNwBNrl2SYsqG5tHoegk63WUa5VU5K2KYK9KDkKzMwhNIC2wPzIwRn9NviRgD0ICv58q 0t3Yvw8M9sreEj+ICRavZELqzZvT9ZeuNoFqY36exeOULflk1X5VruXYaHMv5nI+XBeFGNxoFTRo suCaSow1RP8QwKgMHKleSNSduVRqxn6XWObntran16O+8QpgMgagw8BQMVUEgJrokKprpLPj9zEE LP+T7JHTrFsywMRAFIgM68nezfCuZ1nHZTY+e7DJMuAj51oSQAnpYp63IHElk3jxtfnQnVSCVk9D VUuGvZF96r0ic1WlrW0qawFXUQMNnAGFMADooLNNFIckM89DsqkEzyhAOf/NgHP/NZjibfthBpgW kQXgCtZThXrWgUKJadpUTkI5iYVkN+9zaqibSpsYMO9xmvtXtZLgHqUBFjVP78XC1tXp+jufmF4O /YPYA6CxND8qj6HVDTtEgWd3Ws5ad+BX6Vz595zBBSojiUVdekemS5glKO43r3L25rIWraR0Bw3a 0dxGEI5lGXtLzHhPynM5lNlQTwyiwDvUsFUU2frk4UP/HHwoGL5pjJYubMZ/PBbjcVdyWOIIzjOX BDC6f09o+mhMycUoOZFDUV5jwM/i4ATQF6hvlw5izHHD55FeM7qFaAbKUf7eDPEYKPbI5p9pVslr OlxGdgvZHdFYgzcoX7vkoTX5GTq1+Mb2znHKCe++eytanQeZTJfhIHR0BTkxKNmvvS6lAVqkys6y JsazQ1/IDUEEs1aCRarIGlBOBdMxepWgyjUd5oE/TvDp4XOKgnG0ApPGVmIA0Sc8XI1OiANVJMjb 0kjFZVV1UoJYjsFmwHEiDcqgAnBy8igGdTPTDXc6Fevp7Rjhlqq3p9cub09XX47MTALI7azxo1t3 p299N6oiecaQdJxfmsyVMJK/WGs8ZMhb7kFmVq6e4AgCNLOpmshWsncExxCbjxqJ8oIHaex6nANS 54hzOCunLkHUCyk3/ynyBQU5yWF1gIYCyNDrVS2CWJWZ6/WCifPqhu1sr0A7e4KHPKQGMtfZZFly CKnGbs++F8zdvf8oQeXj6cablzNd6VoCuq2MMU1jQyg1V4M8Xr+xWTrQnbvJXDWzkGGK0zqxx/Ie tDFfxChqPLnUPWgCFPWN7K+QAvHaLyQ4qRqPhhjDRXL/2wlI8LCVdg8OIROqQBmrHs7tJpTWGuR5 0e+VNEnEoBH4vNZyNde2FMRtL4HuYVApvFjnTPPnSQIkwbmmQE24jL9A0HRBseyTiC/Ty8VzhfxB Iu3fJrpBXCCdKlKoGChNawk4dpJoeCYXNJp54LmfR/nsexDENDIyL9Dgp3FcnM9CDP1ZtLZfpDyk bCno2fRYoDmcbQ7R0/PK0wxFhABcypmtMStqpjk0QQT1B0wHpc/woRYTxNlDur2L0kqe/EB1hVNh OdLIJ/iCaGl4VFKHbAztaiV/ZdxSFVJFgGxCFi0OCsrte49mvPspetKPGsi+lQBLcok2gOOPlw31 dP6U0ivPhwJCdzmBNTuCnqCtE8rbameeZ3nESpe5bpKOu0lE0MxeCqK1mqExD3OvUbhuMCfwHAoS g0eMGkFhAajRYS1KuOUO4yajiuDlmkppVHuC9KzjgXKloCV7Iy3JTQCs13xslD2qGqVhCwK0Ehun ItZBHgmEgADlraPtRB2EtNazPF+2a8nQnioNZdk5O6gou0d8Nw1PAqULlDY8cihfnrGqWrXpNVIC OaBQ3r+lzXF+K+t5ouLVcXGlMUEK2aLdoO+tYJFyix3upEB7KNdbJQC69nND5xdC36qIP+d5oEux JRoGqx8fwEcQZ/0E+c5z0SamDgLKLgGErDWfkvep+kt8kXUb0qkzvrpEId/1vCR2ArvlBFZUgSBd levKmiv7S2JO8Mly/w/uPAqVItcT7v9RUMon6CB42jF0y2y5PQvQyDpIrnu/pVINvyhgOAlg0wqA IwnhFa/6PU//OLbpgyReL2fzvbN5pdxwpevVVDxLpJuL7K7hUYKFXN/olxkIr0Yx9AjXLcmnz80d OOOoN1fiWyCEGkjtzZUkcWg5BwlyF2a2yPpt7kAEgW7OA6WpBGWSX70B8fM+zz7AO16Pnn/jD8lz fIiAXf2FKpI97L5PIw/a8j3OMSqkPVI0JY8o/14KCHqKYyk5KJotGAL28Rnj2QrG2fK7sWHf/PDu 9EHQ4Y4fF0QlCL4SP3A9CXin1+b8u64nAK3sO6g0u76S7xmmJqFaytpuRIloLk7Z91erJ04haMyz 6JhtyigJUJ+hssXW2dcAC2eEg2ozPltmP2nyRhXiY6mZUfWh6oLTyy88HdK09LYvqlyx5cDJ8oAd OrGj4ULjGQKWNFKaC7CGSriQ55cXPs3zm0uyLwyUxKqwQuHL2VcBzVtvBig7C496L8F5x507K9nX Kv5jaJskePjX0vLzB6IEbYx2LedlsuGWZyi1Dxx+fNATCl3P/j77Ax9gf6h2q7wkNrI3VLLYheOA F6Rf2X6yeIuhSEGeDdj68P2Hhn5O19/cToOw6En1M1WFNJcuxrYCDboncv3HAX/QcMbAwVHNsrfd yaUk8PYS0Gk+Z/q8h+Sj3hFJif96K34f5/H8dvxhbjSS4KBp0iG8LoCeac7aAErtLkhWlYuqIohF tUZ9oMqaNHWzEfF68z4CMEGRgNN7Mz6CXCgLFyrgVJ6D1CnlLCQwQSfRhdkyd664mURRjc7dmUGS NdnDQNhJguX+Nn4fKgSDUtAChDJFD1at5TDYDFLfb0jneSWpq5N0Levkvx/5pO9968M4uvnptSBc Sl/leEDAlQFkQxwpVYV8iMPXWTb5hRtdpxXuuYYUXeGoIvbaw8d75T5pBnicB/owG+e5ppegX6t5 zV7QKk1SkhfOmQGFDJ7lzbdzqBk5RhYC1OasPIei6MrYDRBGo8qzBDUriWa2gwwbEPP4YCebKtPy Xr8Z4v6N6UaI+65jLQdz72pQmdzavQ/vxdkHZTT8JeQcQYfP11w3h+eEI9dBDINT1GA291EurNiG Ec4RR2Oh0EDsXlAosGvwSA7M6Nqg5yoKHAckqA1U2SueL3dcxQHc3wSpaBBkmzr8x7PO+gsulPtq WHseZ/Sh2cFtqbT7Z9BxOrrYg8nr234G3cl+HaX6Ian1+qs3E2C/Vt1QjltAtBsO/tNbEEQGOmsQ p0ce6ZVXt6YnG3GmQcoXoWB49OGWnSb7bVOqxZSYM16ck4Ykfw4PuqXVfM/3W87TDCqAQmno9h6y S+hY+6GQzMcRC2qdtTGyGw85CVf21z6ONyPMGWWP4aGdJjirBJ1kOcE1tKuT9BJ8MNitmiSgVBqt Bnf1UznI0SSpQcsyKhmbXFWpSusVo0VU375vI1J+lmO9HcTy6k4oGAnKPHnCD5A5lZfncSRVQ8jP 698IGaU9DgAM6EcBkPLaJbeQubzOQKS1jZyHrYFMObuC4qzxuoAuzx9SXHWK3INFqw5wqQjOTZ5D ZKDOsndsq0cJyI5wi1n9fN56KiCcnnL/rfcfT3fvPE5CtRLUOlzoPPMrQfc5lbUkOJ71/fu7KWmH r53n75mYsiaAZ+DRWE5SRTiY2dLlBLTtrm9CEjsYlEdJ8W7WsYooWbMqRtAWz3OCrkj+1zPR8+bL 2x1KcOf9e7UTV6/uhI4VBNI5ymcKzJcgq5p2YyuPNM/lc73ndpJkqjaXVL/yLNufYn0gXXmRgTIS NlKGz9M/IkkRZIL82GykPJUI/RicJmUd1Ik5PST6K4KCoSKgBjwJoKCSshjQZUyi1DuQcwqlZBP4 p3z+M1pfPbMiG0HSKMFrAIKuqRg0iGgpfqZLOwuuG+CiX+X7/AwEUUPtg1QcoKm4w/p82qTtYKf8 8dT+7cTVkbjjJ0thXuCW5oweUzciYRZEftjurMMxuoZgVDMbhZ9hP4fKgJy8Vq5nz94CdBRdVUGM wav6g5thb2JjNkiVJqksDS7XzY6oINFgR4NoFRMF0Rrkvu8luN5Q1t5OT0UOReULJSD596oqiWaB WoAKkQrUOZ/HjYl0NZu51k6YzPeOY6ck+BB9lDMVhnvpBXA21h8mEDwLbWE565cSfoMjDdySYKVs 623nCZzc96xyNU9G137KZUpYvKc9Ti8Yj5VajdxoJef/sepZ/g7METxK2I8NXeEHoOt5LmOmRKoS uaeTIJqSFzTC9ex99BEo72aqFlVCia6nz9pMv4sA97RDdRKIr+WesyeeJGm3/1X3qrAxizkkvud0 Mug33WmgEX9zO9WC+6nMHud+ocYqunqedmJvyHruJKheiQ71VmhkqLDojuySHWxUPcBrM4AFm7SW 87QWWwUskZRXdhatVVVfc6bz0R4H1ARNgDmjUAKyhAFGJONiKXKklQ+07fLzfGknQUrCq0E/o08W mU1CnfOq4V9Vfy4ADjBUbGO3qvYe5nntHee+ZipJl2PbNvN8JHDP4jdMEBUwPz1Txc21xE9Arr3e udJgLx57HGDR9as0AanKC3f2ocMkcfOZ+PL68VrFHs54gJUdAJRrl9mAyPnE4YXxYbsGIyL3a/b9 3n/+D4rW0oOFMDlyNCB3oJl/Z5+AKsaYm5lRwDTUp1Sg7t3ejRpPpt5mH+5c2ZmuZICTicSAUVTB IYQRXxZ7wA+Io55HBU1FSUza+DFJ0JCWxr2WpZgGPZgaDTFm9qFXLvgDfOn3ayzpFbN4Y3Z3c8bJ nnfoNmPpGgQ2x7OFyjow3rjx6SzLZzAZI8hKVnZIxOASmWCjxMGhjPKygM9Hmio4vxRj3EwLujgb OiD4cHFE1/PzRmO7SL/ho84JsBvM++IOBqJaUDU3N/jdfmakUP1pmUke4FDryFUKNGaL00VAZZHZ BvG6lLFrT1I6/fD7t6df//Vvd0KjA/5GEKXPvP1ynftp0EkhILSj2Qoul7WJQfCd3TTsVDECmh3n eRGKTO9xU/Cd8ks2xqMEzy9MhYxBw0kj3QNlWkmAp3no4pM45xhGfCLPgHD8bhoa5sNH7oS9GERa vRvhY0JeGjMUsXZlo1GPWHqzSaWZOOb1II/XNFGspkGK3JiGomylvVwjdZS1cMSuR9sa55yjvJvy +zb92KJ9KBWj+1ujYMePzzKz8t2yolX2yFqfZI1VBlFXIKyCazzZZdOfaG5Ce3IYqJ0wyGMUeQIw 6BV+pOfMKVvDBC3+naauLFOHo70GrSsC0efo+PWJDt5ek6X6h9G5XJSQioj9N5RCKCWMZonREb2+ vj396A//0PQjP/Gp6eorN6bbCVDuPnycRqOUyzXNQL9z38d5f13bqwZzZC1X8p6CqqMHCVSzThp1 yv0usDR4wpyVrmkcYhUH6MC6IFRQRtLN6wTCFBDsD+uAgx8j+DiUgaMYCNesxFsaVjY5rqcx2BQ9 7uc52RPQaUbvedad7VnA7wsKise/nz0pMGPIzkzJDB1kH2c1+w+NouuY66i+NkeVvx8EJXiYoHIv pVQBQdxkzkIk5bKWuPuaEReTiO7mgemaXy/Xc3Axfeal3CupQbajo9x7/mbBXFDNFxpFlPp9usfW Koj/DV6sahnkqlJ/s6ROAxPBJeeoDXH5QVMu/RIU6pGQEHScuaQt12FSHuckSMKFVvqGXnDu+MBo MfRos3krNcWZrcfBLsewb4ZHbcw2Lt1qHOH737oVishen9VLaV5bj0Nqibbj5aFMcTr6ILKGbGWH iEBYgp7gAJPxKdqea7yYZ0fdglOXtF8OB5BTP5N4Zc9AmiRKdN2Ps/+OUXtCZRLAKZs3yFURUdZN 4rqdppyNrRfTThzGw1QINJF5kDjphwky6ewKHE4TtBxRi6H7zElzIJxifnfOH4eT3oQ3f9Z2jl+8 jDNIUk7azKlqIi7lKWoQmotyPfjnysVbkeJczPtWmcHTnTnc6vSz1e4tNo/M2QjChwSa/dcKVIGS /E9viApi9WI5VtZqnCkHewEfmsKGiiGuo1VL9ejMV/xO6QHGdCdIvVhqFDRwNCtKTKq3zy+QYK1C xeiHKWCUC+DfzgGY82ChAFLeq2O6s4c1j6oAVJ8+v6CGprc+Dc0PH9MAH28nAVS1cc9bJnzaj84/ Obd8X7INVJl3rlSz0EFi+46TVBsk5j9IdHuFmvSMPiVn42FodBrT2VeBG5RScK3WoX/iyHPMvdzJ eX7yPXJtKxlCtD5dz1ovLcUW4KTmc1EhvWeDu3P7mtuq6pXnIQCEUPKtAk3UtbwU77p6yLnf43B/ FaMl9PxLh5bx1cr1fIJnwAb4cxMntp+sm3HdqEz2l5+hxPU8DZiRO8yamX6JGkUlZoBGQ5JTdVCC PB8kks4zn9fx9U12BrDhnLgvyfX9AApmDXznwwdpUERBobaRMfX5t82tzemlmxljHXuynSq1QS9k cSXPVLmAZZ7dznbOeO7NcCygH4pHh5rl39t3o9qTa7yI8y+xyLlgA4lEQJyXyLfhyqdyqPKxwkeL UYBFDeLYwqFNDjltrNloR2ViJD5N5GZAjLVViVtJJaITdxM70Zl/kJ978OBeJohG+lRFSVDvM2bP s0V/1XP7qMnZUFjqc+p5HFRaVBW65hI6MUZnnQBW8ueqAeXaKlXp/ZoYd7eWllgVIb4g5w3ttuji ua0vx/o86M43C5r53UniuCUgXpy/9WyicjlvaKISZ9QllclQT7Nj7sVX3YkvvBX7ZWz5dmzpJz73 sVA638iQp8ul2FDNAp5WJz5Idc+uvZceiXKnDXqSAOb+59OrU38Tv8CGFLhlhyRA4j5siRFqDJSa 7+rajuC758g/zn7NKT93clwXvIX3WcPPUJYod7U0CuVpZdBBgWgU78ufW8rKCuEKKmfQNXYI2pU9 UwSAQCWTWEyArTkK/cNDGw/HYipHzWTZBG9QcwY+v88XqRyIdCX7+OYZIiWwEXh5TsYrQ+Iqi0Ir ezynOuSBVo+Mg5MQXOjKfRLKgizta195d/reD+40sH7zpZ3p0z/0+nQ942qr8Zugue8xW9gGUtAV E5HyfoIXzqld792smj5GJcDGqUwMXnc+77FGt7wPdGspiIfAGueoE/Jm64g75n7auKMJ1MfHeVGX oE1cpDr3X6C0Gd3QF6101mwkvIN4Jcgbmbsj3KgcuNsXUzKx4XPNJynNrSfp2MlrZNUP03QGUdsN j3uTZBdOo8Nj7RuX2kSjDHTe+FRHZE8IQBOwSy4gxC1z5XuHeb1hC3Rge+j60TMuPY6fwwbh9HoO NQtL7F5r4wjAOGHBgu+M8l7bw/zMbD+MzTxDsvt8x+7uaOUsdGXHfKNl5hFQ0GhfSQnwY2/Lbldr SBxc6/4kDulZApd3onSxneD1m8f3qpaD+7gEKcKlzD3hYB1l7Q3uEVC2iF8VlHGPgiQuoxWTXLLS MJSl0mUzCT2oD2dUjmPOBCNosMi1BHeqJINHOfYUDh9nCrl6KsDIbUK/i4zFYWwlUxeAcSq7Kfke J5s3IvA0yQl0bD/f288zqoQZ5DJBwGaQDdz3wyQW0MC9GCkyUBJjFANVBMgfySx/lzRCYzTvooWx GZLz52kSaJJUFRcIPJpQEJY8ScHuctYqwFn3UGcLeF7MB6OatWslomd8JF7e82TW7U4tBhreKhij aG3x1bvHRpJfnjm71nIVegQpOwoJ0PknRYvosuN8Pp3RQq4lCaHVWrQrV1Q6SXslBphg/c+dpL1k iIhxxYJS08rIWAnKlpDAE6S0uUsAks84MII716rJDlWOfnkgs2k+tkUjkIBeAM+pC2TZzq3sR6if 4KslfM1vCRZrsIWnRVZn58caaGDT/5DPZEskJhR/BL7Gj+OlH2UfozAJzih94BlSL9FTs4b7mlvX R3GiAdaxygOoXCF+PjRQHwy7LehwLqHds0BMMuINlmZUILJcT/Mhguk2vQti+RQonHOsZ6bPaDSx V8KNjfOeNay5v3zuBV8h1I1GSLI8htDg3EKEh7+YAc3lXrYR08c1hBfIDQefkmwpQII3SlaHQatJ RgoKzhtp/WCn5irhz1Q72rSU71dVqWdPI6CGbp1Fmvtyn+IF9lDzObsvaG5vTeyK9Q1vVVA0D/nJ M1hPNclEOxiZa3kQOy1gpKBkmAVbchqQp1P2XFOR/0FtsZ9LJ0T5gOBBpnOmmpAHsKBsImlyL89T IXMdcaNt2Hocne1bSdivPwndCz0hPSQXcqbRIvgq5fWnCY4FYvw2StocUMEzyr11mi15wFz/VgLH Viuyjw2WkaA7E8AU9DVUQz6oAFw+X6IHmDq3d3t7qbiF23yevAAu/FvplIJ1us1Vrxj616ulxpiI C3wR8Q/bgKrKpp4Pg6t6kWWyTvnsyumRzoxqym5soIbFRwaxGICV12nq3thIhYwkZ/o0LocKJ6i+ GJthmFsThzybos7ZiVfYSAlf4xp2X//LSIo899JXgUz2cXyvQG0uDXGLQZsuJmBu9SDrpzFuH2fe PaVPCpJa4QNBds47vWl7cMjKDUDpo1+zAHhsh2ErUUY6yRE/PFRSVJiDfXFPXjNLBvUdmNWAxtEg PnckuUeN6tTUPH/qR2y+6iTK7lr8wXYSsWrkZx18EWLw7xeClvs+fwzI6LWYeDhngEzOrGeAu11f LyA2YXIk3CPzUXF0GS6SIxj00xnPYAa2qBXkWt0zO8F2OR8qNkHU+YPj090omexPt8IyeBwfuJ4K x9ufeXv6xGfemV578+UkeemxOBrqSNXLf3rQpKgDh/KeJ6GLqQoaha43p7KSbYblu8ggkjKU3ggb ZmwNCzurEgy56JEUzZa19m7MVPmDX3PLZLeUcjk3HFUZjdQ7b2RhZSoa1DqCdGaEmsX75G76IdF0 lIMh0CCgrstZFoqHKAiC+ni94QIcx3GaGDRicDweOj7afhrDkMRfVM5FCW04UhqqSwn2GEmZIcR4 8H4hmbyNB4BbPcqPBTtnqExvNP/X0deze67OdUs1yTZjGI4ScEAM74Wvw/i+8tb29MlPvDTdfOP6 tJwyNMRlaFqOgFrmJLsxorojZHP9MnEPQQZOlk/904FjNI3xqx5oDgMU1BjV1Tj19XB7K1OkFJef XVRua9ALlRkTwpYj9Sbg0iwkvOQEGGNCQhpHOzmToZkFFX5QBvkiHLatINVvJzm4fi1BYw55qsLl GW1lRLcpQ3uhqTgAr2Xa25McqG9osEr51RhmHKaOOIZ86u7usRxr3QRFcFYPN/iHgys9mjKhhBqc oCMOLeNPaUEy5NCRLeqExi7okNaBjDHmlWXDVcwzPud4MRrl0OXnO61zZlxErOf65X24Nv+AW7pP SxHh/AThELHyNAXugz+o/HYhRul2uHeGp+CFl0qQwOQkCQ8FAZxiDYkO9oIggvxOSmWpjaWBL02c 5eHKetPkoslEtOJ/M9S7AyuyjjiUrmslTX5QVwG1aWoc5XF+Fl/zYoIKDnslPMybQVGWktRad4in LygWRHs5a0ClYuhdGxWuCpEzZtBR7nY3TYBUQobTUR2KE4e05lqdHaVGXfGSz+UrabLJewlIDu/v N/t3btEwlAwF7jh/aEiM3Wl4ewKCFBQb7PglqVRxqpRhvzP4eTj0S+yG/U1spwi1ASDDdjTQqvzX CMhEmQJGCTeVmnKBJf1Zoyb1kBLOGxWJQ44NYAcYRYHP+aCN0thmSV8pMbE1nOBREoihzTyuey3J LFk13+PIrDHUWpDAeFJ2kFhcSbViLQDEcioH1HIkYCozAtm1DHJazLrcj2wlFH0nZxq3vlxucVWC u8Xsm4d5Bheyls37cu3rMeg7OYcoGYLp0cycZyrQtp7Zl7TeJZRniQg6BCL3YF8pkwtMOqBKAqn/ J+sCwXIGOkcA7SifJcGnwDTUTWJrNETlnuydFVSTfP4ljjHZu0CdRKXJkhqQhxybBH8E22vFTga6 zS6XI8s3aFLNGeIo5TgtU0Nyem04pCPZRiGDmncNGogMhLQjuWce6ln2jMS1wRl9Zw3UyvAm1knm OMrY377FDFDpPvJlr7Ex9dtj0qf1R+c4zBrzTxsG3KA/5RrHxEf2JtciERTozaiMdcpsft4MyOAX ihaagedH0aL7UGGI7cuNs8v0gfmz04XhuwAhlLdMTEXHWUo2YR+Tunwamg3bOUauk12sqG1EeCzM LCBp8ujojesFAlG7UEmjOvQ8tJ3FIEpQVjbmhHxpggbN0xI49K07qWDRod6I31nPF4RVcD4veJbA U4UBzAAO+uxmQbUNnL1zCPF3SrM2Z7HnD5KIeUCLsVOmWz55bAz4mOlQfWh8aTYmz649WH3WDrwg FMVAQjb6TsiNooPa1xzsSQJ977EVv6hSx+eQzSv/nV8ofTVocaq9jT9Q5bjP/PxQOhna38Z337m1 V5Ug8pgnee9LOTdrCboupxfpWuyrapxNyL4b1NRhTVWcCSAkwWOvYitwryO00jPaYVaNqPSb5bVi GtIZOadoY5gH9tBSJDKt7ZxAO9cN/U/3a9VBxAjeHLgIIDGOZFRM4lucZYAqecQZumx3l/4gtvNf rsuz8+KGYNY9KOsYmDM4wqQj1/LMcedFRSRYVZwMmPI82gdCoCG/j2FkqUah8GRNAIaXVQ2y71VI SsHqWXC9AtRZMmtNBtI2S/pnSXRe/4zwg0B6Bp51YYpI9odGJAbkE1y7oWYEnkdeF0pG0e6IAVxI HCmBx6c+Dsvgfnzbhx8+mu6lYbHPKlX8V1+6Ob3zyTemdxJc71y71rd/eP9hrmsMluvMDsh31VFS bWj1g3xn+svs/YCJANxqj6OAoH9Bq0nasA8Arll1p+BNA2tfVKUAzm7jnLo6bu381xz1inmpeI3x 6HLkkCl6yN4FO4y0Rca7nptlQTVqSNz0qBlDvOr6jjHkQ4Md51CeLrRQJlSHyEjTsoRxAmRnFI28 t/KR8k61ZZUWctN4lWvZnPQUg9pXKYRR9m/2mA2iJAa97phrmzBSSWM/joVgJPFdZyFiD82Srl56 3nGWjN87H78Rns729OpbL3WEuOysi5JA1c8fhefF2AvIbURlYVmgz1mrhJ81HA0MmsGgNwgxkGVo 8UMofjb9TkrBm+F/bsYRa+y0JoI/I7hxwcj4RA2maMFKG0RtkDHpjdN+BingTMMhlHiYhmV3d8Rr DK+pVifZ2AcQlFzPWwmwN25cC+qSgI74fRslFqeHEPAEVTeD4B3vLoV3fX/6IIb4YRKNuUg/rSeh EehAkzsWmlN1eOtUBLCGo1ghXDPNVgm48LZiGDtMwihYeqJKdqgynJiqA2RLqsCxCqYZKQ1tgt8Y DCZDsF20MvcFtHd/GlfrtDls2XPOobVv06o/xNLVwNobeGlNVpTVxwAdqDKZPD/P4AJ7DOuQ0Fkv wb6RtC+onuR+ic0vk3QTZOT9D+zZ/PximxIc7AS/+JcJVoyLtbeWJAAN8M+Tz6yhuJpzpAuftdlc z4CB7IPDIJ/3EqwOzXWBWOgWcbjGIa/lc59DAfN+UE1oqfMDfV7Lvy8nQF8N5QfichS1FeUx14uK Ye9JRDmNBuC5V8+BmZXUlSohScx94VxLx+7f3U2CmdHoJCkl1zPUnHbxUlRpoPKHKWU/Tp8Aqs2L BJ7WqMWyXL+mkGe5P/vV2dQsPHomBiUF8rCQ84s61NJ2bUO+aMRq2Mr96zeQLFxaSONTkhx7nlNQ XTqXW6q2NFWNPI/RlCkoHo2WgAAbApWDAkpRlbzqiUa7BKiHaXb0MypEjLlAEjp7ROYQjzyBQxP4 /tToNeEIX3/zRkeiW0ePdgwm0ShkvHhsUpzrYabv1SZkPY9jQwU+fEYdHJWCJG9QfZz0yysZFhPn rWLiWXQtcPrZIk237iPps6BWYNizDX1qpW+UeiUpVQ7Q+MijzvYcZyfZplaxnPMiAUfV2YzG7tXs l5OgPg9THvfMLySJeEHLOiiapHU5yVmneubLABucbwaazTlKD4JzICDhCyRS0PkObQkKdBbbCB1r mdXZKG9SPSBfs8ChwlPZy6qRFucizmT9l505nFbjuax9h3axVXTv2XA+PP+nf0fwVn8sUbR2qmH8 TCtbvobKhfcbEnw4tuQvh//pGOOspbX37AruZA3Zt/mCEyNQrBpB/o6Ot8Lx4CKzAQKomZwnO3Uh 9nCOrdW0F8Hh+hv3DGzBxU3gQxd7Idd1NXxXSdBOlGaSwee8JHBYTps0epG1MsGP4g+rLw6xF+1t iC11iZwPdCwKvgcGGeW9s9s7GRHX/FkCEmdY/4zFrN40SmJQ4Q9ja5LNNUjuxMOs9SK0OtdrRkIs dP+z+6yT9XUNJpYe9hpMGEwijwtvTciWsQGSkiZ/5jJEiSR2TfXn3G6Jm9okyibjJ5dikM9Vfcrn QoGt1+jniV+LPdA4qNLEU2hILTUFXUM/RWTRaNY7J/phRiVjBECkDO/HHtKI/sr374b+FVQzCfEG xaQrsX15782rW9NyqrWmPQriJCEVQp2h9+0Vy+e1kiH4XggFrZVTMfHoKbEGflYnTymm2VvoWtVk x9WWJIqD8nOd8un+cxbdF5qCxuFKx+b9G+A2MB5xRhMNam3nQWg+V/zk/eRd1gQ8gN6gP0ggO9f+ GVUQSiY5yxSqsvedFcDXObToPAIaxHKafzclOQlgl8ImIAfr8yWIHbRC2Ss+Qfy1HFCoyWeT4SES oDpYQInNqT41EE4gboqmXp34XjGUgLpTf2wEm3r2lecnqXd+DMXp4c8eEP/IGk4SW9354O50O19A L9xwscnjUGVf/bhg+p3pSuIatFpvbdjR3YAc4rPDNL8uJkgfA5qG3jeQeH5x0CDn0pw8h8ZjXfPf QlSTVN7cmAb19lxolsb5ZpHK3BgGje8ZJndWKysaPuzX//+vud2UjmwKxqBC+rNSx4OUOlmxTTwj GaQNZiP0Qc8yKQ/OJvC7oC2vaxCuxJ3rg26Up5svDqKaoRZ8diDa7S/gEhvlIT9rs0wMYIxDx9kq keb2Nlv6epaMNjJHypmaexrPjCyoB1hg7bDL9hnJXud5R+soUZbi4D9DoYIMrac0C31ZyOdyCts5 eCvphj5NYKhpTXnlfDKQjdoyvI51aKzJcEH6rMuaILToCydARWKUYEqySURKN/PDNFBsplni5kuX syHIbsWwCqzdu1IlhCTv5WDMz+Fyj7Kg9XXQL1yElufw5JCOwQpQ64E0CFTGw9W0N8o8tyI19dxB yAG6+kq4pCmFXYiTfBgeL/QKR24xElZQEXJLNp8y3XE276OUoxc3I8PTNRxlt6K3OQe6ps+R4KpH 5OcZaPrXgmvXzZguOYwJzIwDZ4C8xvMY42ih0a59qLgUnc9PngfHvldEXhFAhi6hsscY2PKYNfsM Z9z9ZW93RrxDLsfJVTTTH/SSoamd/3HGHIFDBGFIsKukdpovJfOVIMBkBakf8NoPaJ6m/4AaAw3p iwnUVmlgMyTKxLrfs1epozi05Xn3uSUcfUJYXoOwjB43HlowdM2f5Gc1yZCbY7zOOaoQSU7pAXnC NN9YJzxGTXKeecdH19GOiW41DrnXJ3FqJzEo8juKLegOUFvlP+OHDwT2mtuSNOoeh7yeqNhEzu3Z /TT4pbwmlVwPYtmU1L7K+0KvGZvHKec+iHNuw16uB8JIx6glw5yL3fzbWXSnb1zV2pb3V8WosVae jbYulEqjbh4PZKm68YKPGrBcZ5wmRHwhfHPB+L1buR6IyE5G1IbvvBalCrxzp30rgSI+uCBXJeJh 1gpl5tLFyEjmBe6z5foY9OfZO4JeiNOzGHJJnyagTvnM/nP/VBNwpO9mLC50lQOkXGSIxAgQNqqI AQXqKOh8byUBqME957Jx1DA8Z8edQ+19x0kdJqiWvHvOpGw1AW1e2c6ZzNl3WltCHsGG4EVznma5 06itLGSv4psOlH4gRhwA34SDOJCqmv6BskLimpiarslJZY+moc864quTfzzIZ93Pepa/S3IoCCsI ADc1m6iTIxO1Tdux4c47+VF89MePUs6H0DinsVWSkNvpT4CS4VpfyfsvRCoNiiupc93VjHd9gtx8 HdPLDerpuM4YjIMaVKs1KEG1n5LdBJkkNNtimx8wxKeWHlLkNXkGgyaRLwg0GwlsGTDvzL8MJBsN Z6DUJl3mvZNgeM47eX5sgOQQlQKlYm5uUBlcFVpAx7rnMzRytbE9Z46/UqktKzoXbeBLG13zb84q /8eusYQL2fCS4vsJUi6aRpoN6nMliKpBmnhPcg0an1278RRPco7K7QQW5V46WjnXYPqthMdMhNNc 4zHuaDnn+TcNrEr1uTbA1CN0D2VtiXKS9j2Sk2ngPQtSdzVD0jZKmTKTaL+Nbp4VZFPgVBR1hjAW qPO6fPaepsJcz9XEA+RaD3Of85ICdKnc9/rq2jRnuE7sggoP5SCVgqrkqEiz87luTxpHvMCLikY+ l+bzWsdpq1SPanabY8Uc6BcNPJpqdD+IR3DaJSKaQa13K3tJLG7nHD80tTMJx6kAlwZ1EE60vpIL Aww8E3jyBfyRs+2Z5VpG0DQSGgOK+Iq18KXZQJ6ETCI72XhGEp3EMoWxrJtKxrBn3dHeK19N8PvX ISFcCmxjH76Lpv1ArO3tMQ9Dk2KSAOGVPc5PduOPPpX6M75teLxRdZv5YH6llXV7Ju/zNOfNkDn9 IJWMDTgi8ZTg1/77WfSWJgmxLYLO/Pk4z5TqhuspYGR/jnBv3FtV1kY/i4KwfVoloFk8NiZizmhg nl/pH4xHDd6I2VqNHsIX41hLuEffwwVBd65v796D6Rtf+/703W/fpS8z7WTCrdhsJ4Nffupnf2q6 /NpbfX7PziKx+uGt6c6dB00YcKiXotgCqJGMu6xWZWKzGpRKXe11soCSu9hpfy7tsKIBY3iTR1lK CzCwZmzY2tJ1AEQze+T9/7tkkN5SfyXGHCUuP+ONBS3DUI+MpyXA6nQ6FHFQuQgX0gMAERYc5z9y YJBk2RNJqtVk+8j+NiFHKPg2adEa0vT18xQQPCudxK2o53598iLJKIfK881nnAYdl7E/25XRpck6 KKnSSVkCzp3MMD/JMNprHtMl2bcyPi5sXlOuKLQDUqFTNmX3rSDVz4MirG1G+xnX0vtpyIsubAfM 5GKh+CgCuKN+nTcgKM9uryldDhWHJmhxNEWS0FJmh5SsmDLes2yErfC7br4WaaQ4U5WBo0jzyNp1 vwq0TQEihWd9dVvvJthw6LdSmtqEFKc8sgatLno8EhZ8YF3XEoGBKsSLQ50TnN1N0HP6/G70fnem yzEiVA9w5ujDKtv72XsCKxPV8kzQDe4/ehyuWvSUY0Blp+Ve17BlbQRdWb9KV+W63WsHgPTf8a1y PSRycl04eYK882ekBG5rKxMbwtKSq6czy2hHR/AodVfJgB3twbPJ/R6ERSnU3uwzHuXLVpASSNU9 c3qC3vPsOH93jc/oadpf6SAiWUbGyhCZ51njC8nKGSQNOjLUtdkwHKovx9FMvpRm0AaxLga6Xu5V Ak8onyAkAcxpkLvDXNtiJp7RmB7lu/Ccs44rCWKK5uaZ7cb5/OC90ajE6V4ONQCy0AaLvPerL+/U QAtCIDDl7If/hqaxkgSwFQO0oATmj957UOO6HmexpQpyFkc2mzymqqKsxkGcRbLJ8xJAQiYrZ8TQ 4CYmgUbnEXRAdLeD6HiOlaeDmrvOOKxbkPGg1hJAJe0TyFTQjZbDshwC/404yJ0E7zi4i9FV50ZV L9Il2CrRfK7TZFCPZi7n2V5g7DkRAboA0iIrtwlCPTcJgoY8msrOKyfFgexBiiUYCQRvBXW3jpyV dfYsBfZGTEuArfMzXL3sy/M1UOXp8CRJEbpCzo0mJZMxoUGCKQ1UbMajOOu9ICaPkkiPATtJdvK+ RT2rjPJ8unZ1u/t2T3DBUXN80EQjsU1ZswfZiFZUEtBBvujWQ/Q1Deb7hlZwxvZ0OedJMl7g6voc FZvc+2gy1puiqYetSEDrOUEWnQ0/DxXO2seyjDHNggQ9HbGNlGsE0FXNyFpRRrA+81D9rEPR3TT9 THt5DgnKVjOshnQazupo1sy+gbzl+Z+SfWRTBR6doDiSH+llhxCDqofnGfawSiMQtdlEVrZ49u+V J5sFX/bC06yN4BmFkD1nf1U6l0NDMIWwFAkoqgZNlDk+iK+Qs2VPOqKX8vxPs76Rt47ihpHc4VMa yCPgzEs3lHVz3YNqgoqXn+N3hGDsiH4NiSJudM5x0Syc2LyO1vbBcfTONRkHOUP/4LieUBfK5+k3 QD8RuDS4TBJDUWg/4MjW1hhWc5DEvWhrgJBLUFRVFFJ9sfGVl2wlD1qZRC/2xYh3QaqY5zQ3UIUP CRcKQXyB76O/HJAfrAZ2mq0FvHlmj6Mc8mh3rwE4DjVKkgqPwBpY0YoFHzILuNZyFrYjpVtJSGoI Ag9TILIElzX7Zi8+Cs2KH5H468Lj452nxk9Za9xcOtZs9z56YNbO/uEX2faFlB7Z8tJQs1bAHnEB XWtj051/qlnO4gWj3jXiapikly7u6LXmq1Q9XNnoVtPDz2ex8Vev7UxXc31XklRqxK4HAwLFzs3H HmnCvIhzm3292pI7RFlimoqk+EmyQg1HFRBNIOcKBUTDoQpSe3okPvGdz/FDgFTxBagt/BibKpbh yxtjWTwPKU0QkPKBmg5VmaL23NfsHIiJXITzPughhuJQXxqV29F/MSYvX4QoaO2SnOfcGOokZllH +1o3oCb2JHvCMVQBoB4kxlAZfGi2R+y/5HsrfPzVDDRpAyqbmc/QCMs2HmaWR21O3gOyzXyVnjWj STR5rf8fPGe2H8UVXXdE3da+Ly5VRCLw3M979gUlBXH8qnJIJKBTediNzQVorMYnXX/1+vSxz741 bb/0UoDVtdhftMxI0cYniTcdl83Ll2d9CIM6VTphzg8VHnRkPlsigIZVgDXX04bPgLr2X2mUhnZJ vASeBQE9V4BNfr6PZATXVdHpbUl+3O9oyp1lPX2tX3Nbcd7egFMZD2ugI9Bh2eF+nKvsBfrDIBjx 6rBBLyBZjPpyKAoOj02OtP4UNy8d3BdysR6KpsFz+RkXqqTs4dq4q0oleT9KBdhdlzK0Yiecpe1t 04xkVsNIPwkyBwG6nwV1z8spado4+FtncUyoAqTVZEHa6ux318lweMhGV7P3kKtnUeB4Rj8SYszg 4uSAZW0sE3k4bjytcJGV4JX+O20pBxHid//2o2qWXogIvcDW2GeKIMu0dvNekC3OgkJDEZAsyyc+ 9cb0yutXp83rQcJyaI5xsgTWeZB70ZeWuKwnuJV1FvnKvT66u9dDt5UAYyMlxQMScQnK9wXSCX6X Sd3haKZJA7997SKuVJB/0zXz84bbQAmO93an0+gVP86mPeJABDp5VoJoY8xfuhZNz8gjvQgye//2 fKXoNg01yPuvJNgTi7lWKBVjx5B0ZLeMM9dnmM1CDrkDuboqQ0wgnRNY3NgmLEfMpszflWig3ZW2 4oQlsqNBAnbdCZeQFPvJDlWH5QCzzzSpMJPtWlaOnXWyV5FAAMOoZR0d9Gf2ci98oPFL4ZFDbO7c Mon0YZtetqLFGkubxsSYA7JdVDeCkp6gGbneGOcnzxKYUb/I567mejXMnAUFzeOYliPltpb7Lu2o lBtye3qYkphkHQSuC/MxUPm5g6zVbp6JZ+D1r79xY/qRH317+uAH98Iju99/g8uRfxOsOnPUd5RP 99LxHiJlyr1PIpUYQ1KbBWGBzik/l+hdZQKNq5Bj5XfDeshGXQ31x0YyHASN4iQ877NKt0WyMQnf zkvbNT64fFB0OuP3Pwz/Pqgu5OdujHB5qnlWHPhzAV+e0fVrmxkukymuKQWZNMcRHCeIWI3BWsz6 HWYfGZ37KJvgIGXw0wzL4LCvJGiUWg1Ef6gvGD7kHL3IXrq8kupR7BE79OZbN3qGtpMES3AfZfwu 5MO0TnJa9tXa9vJ04/UY11ybYT+Mcrv8U4kSqN+9/WD68PbjopCXjLkNP2UvZ4vTF1wrG0PEHwp4 VL8ELPmMo6z78kaQddQIAIEAARc9+/HhwXg/zufpOk1oAV/K9kGITHtkazZjjwQUowH4xfSBasWH D/NMNA2RGTOIYgyIeBS7ZmLgYihb9h8KmuEeHbEcm/nsafRqyZ8FkJhXpp2dD84Rfa/gj2SS7eWM gyRvRF3j6OJwQPfzXicCYPJv+bx7CQqO75O9jIMI0i1wWM7wlYt5no/Z7Dy7F0mglG1fxAaYPKmk 3Z6MJEdb164ESdXoF4cuwM4WlDRSWDiswgsDrNI5qmmimYXQD9cjBwdNq611j01G0f8G1QwH24S4 /pvnnHvayOtbdWwAzhHmLEV54UUM62aoDs79/edJTiJDejGfwdwsrcyk0pIcG6pyJzZ2MQjm9djB cnShkIWn8vrl0dujgsC2KfELMi4GpHgeG7OrqTevX2FvONr4jHtJ2K6kwriQSR4c8l6Stw+jdCFg uCFpTlWwqg75t5tRmaHM8WG007evsd0L029/7YPpinVwfshQ5poF8oAhHGYcfA2RhlO9n7K46x+I ecAaaCsQRdCbdTvLnjXY4050+3HLJagQUDxK1IPj+L5H+7uR8IyPT6K+dfNygI+sQ5IXiPSVUBWt 64fxawc5829FHvJTr+xM7916mObY46DtprvqwaKHTa+fjOigjNI8P0iz4q5BOp67ADnXqBpw9ORw eu3lK/3ed0LTUH1ejV17OWftpdgO8UalECHzKnx5ruwuH6vCZZz4hey5k1BBUM8oiFzaiV8IWomt DI1+oZKatbgTPu67HzzO3okvyz3vxtbh116NOAHOLl9kUqLIUBMga5uPLp1Un8VR9tpeqgbz66Pa renxTNOb6tE56j7Ay9jlJEfxt6YyAriq/NS9JKdkQweaX5qSQExgi/9vGI0cELKMP646k2clidBc aT3EAbV92dOjcqBSPBIDNgQgicoo/llKQCzoPjzOQCTVfmh1fm5Do2biqqPsmVsfPEgFLcBAXg+1 5nvEcFtJOi5vAQSidz0DO6mIseEqmOg9VFYo2YjrKhubO+FTACj2NbnXAlowpdid56n8pKGkgAFd asnLKHnlRQ6lvaHam1hP8iLYF4eUouP8MwtZr+9+94Pp/e/dmjZT5f/MG69O19782LR6JYO/4geO D/YbOw4U1fuOHq3W7VSnkxRLWlbWSbSOptSLuNt5FoJm/XZ0q1UYrS166Uk1+r3dUGpjbz3oinHU LsT+NL5o3aIJIugZDaYgYW6R3Tpvqh5iH7klnMaBUmmkUebDM8IfTlOL5qIsRg/sDMFGdBcMIYqX tN8BM6OBBGYyhr8M5HZA6snQBDn5ME0Oz1IiQBfpiNAieNlIWWR0kDrzXAtVhOVkMIJHI5OLcD1P x3MM8d6DB+XMtdxi2ls+T+Og++4o8G7l3Djk279BoCUMuQAGkjZwYzaZIbmYZjM4kWOcLYcGNXma e+70ogSx5QejRzR4k3cOystpgpTy1BlGZfK8nw2JY4qy8TibVQOksutGHCIjiOOuVC+w1UyzrqHC iNIEXZDl3Yw35mjK82pJdTSb0kA2Vndlhry47mbYniO0TskaZSKf4eevhN5wkoNyMCvFvCjHaQzs QYE5ItnkexoXlUIgunkPB+/SSVDQfD4e7HKlaAb9pHziZqFj8zj8NSiQM4RkrymHenDE/GO1U7N3 GI2Wzsu4sCGpEcyuv3tGGTzlRK9vOUKxalzvJcoqCWZlisTvZb0dRFGEaybV55B24w9eOBTTaxay vsbC+93hg05WF7mqEVlD6Ku9kWex8jzoSagEix0Kk+8KNrNWVRxp2S2JkgE32SvrOXAaeqCwT0N9 ePJCIjWy9FJ14gmZQ1Sok5Nk//Zb0EjBFk4f9GU/5WLUk90YQRUAo3U5U88b2gG1tRR302wosH7M 0UFhJHNQIutGoSM9BrjdeDvzuaYZCBzaSxrxNHFJ+rKvVS0kfz7LOV6MIXQtJNcYUOtSzmYCxN3s RRuMPTAUI83X5Vlap1OJFs4dmgXrxLLZA85P9rppWhCJ0QA9ftdDwSlLykoFg7LGuWtcepbXc9JQ VBfPuPesomkEPSk9I/e9F7TMNLqVnGGIUyTHM/Ewr09lx9LT4i0lK5f0IIGhoN05Z1ghbj24znL2 /EYSWfuyBjTfK8VKmVDwkPcQyKP7SEY4180ksJwB6k65wnkrcn6H2Y913Wwdy1O6S96rTtzY4VFp UdIX5Gpws89PUWHIc1J+kFBzpnmD6sYmGEXVehEHbp+OwJmawAAbPCtT/MiucTRu0XX55Zyh66wl ucPZFhCjXThNsuTncSCnOXh34zy/8+F+bQJUmlTnepw1e2qNoe4WbPsyjdhUfHJfEoFdSgP5PUJo XW8J2UFs4hMojh8pX4+jmjleZxbNLEmys3mY94a6AtzoAbtviJeESGaqgdP9dKxw3mfYkqHCA0g4 S0CPb/4oVBX2yXmKGShogDfdoisEzDXrkfE+sW/wqn0Uodw3EE0l6WI19Uc/EZWlJY152Z/1U1Be yUpWzvTQlaB6wAo2EouGvxIUQkpP0vjl3KCgsIX3VQyp+MRJC8jRHtjuO6GkXPzenemahmS7RTU3 KNBx3p9aBeClPSr5edxn93sha3KQ90VNgxhD4hFm5sITpev9KJVHYMhR0MUj+0lgEeUZQeZxKqP7 hwc9k2tJ5rauXk6VK9KPWUzoMOTDQCMSdZezvw1BOU0StB+A4VaS1NupnqGvqZhR//IrOH2ro5JQ qiF70Rd+nmc2wI7Ypdg46Kbn5fk4s6Qo/V1Pxk7AqqLd+WVf69d5Gl+gknSQkdWrCbABOdwqVP9F B0TFFnZwnUoAHfvsH1RWlercA5ScnrWmt9WstYrHelBbflgLg/3Tql1sq4qxEeAC7LUYtKrF5H1W e/6TROZ6+NoXcpM2XsYnzCq1Ng5f2WE2UQQRdKmmSVbZgyK1bH9fP3oAWpn1q2d8nN1yeQXsRUDH z7QJty8btMWqtTT2EZuqTgkJRnOwRAgwybCwP3sUrrIf9ag8iyrOcfY1W2Qthgxkj0PPpHjvMJNO TUNdJY88q7LXtTtvqnh8UC5mcLhn9kasY0S4QBl0zebMqgbPA3pptl0NqIaBYFjg0ySk8wEXEvzl sGSv5f7rQwVqAAwUK3FNEOoL2bfr169W0veD73x/+tKXvlU7/JOf/Nj08sc/Gd+w3vdrnGZWBl+Z 96hUL3GKVGmpovBphCrYc2DfKb/tnnDyPI981a+0WTycaz02Ve7pbmzsIjEdanizCnobF0es1You qziLg0rI9W+t9A773/yrj7z9iRyQctPouu8PVsd7OHiyJgcZQ8mBXMuEPyfiKDfKKNFc9rr9HO5z CR/DOJ7nBmVumgMW8r6LQV0c+rM0zCl1KVetrKaUE7Smjl5jQbIcmbsRvpr5OnVuVlagHAIx2jJe uyL2GoxwGrV2UJIIwhgDPs/DQkGDltHHbtYpCLA5IX15sDqelRmN0Ua3WA16xMFAe53E8pp8br5H lu15gmLOlZOzMesg876rQZQePw9/MRurwyzyQKxlm0IoNOS+cOE4ctJqr37sRrUxDRQ5pjmcLHNV KazqGKML3qNTgmKEAnj2UJezm4Mlw1RmQ7dYTEDSa3QAxYEIvQ6vco5ya7O1sWFUH/ZSLru4FH5p HMuzHADo626+IHIrGlabLSsjPwtyGomwvPWDoKkSq61svheaVu2TNo4MhKwBRsdhZZNrpMynDfoE pzgCFUjfaD7TJCt4IMo+1tP1Cw5HMDKC8dJKDEPJc7CGleBrwDFQpfmokJCvu2RkL0PDCbawAdEa kjkMj6BP2VhJnLFQyhe4Pg4P/W74ZPj8pIM6DTJG4ziVjBP8PUYYatxSpDGrIwmroglOmnWAxMU1 CgKwaU7iiMgBVUUje3Il++S5cv2znIkY4d3oCzNQL716pWgUAwdtvB8kFaIgaHrt1Wvdd7fvPw5t 5IGV7JqQ5ZM8HeS87ao65P3XsgZnAibrmps3bfJSnh8+sw30rBxESWnQSCPmldHzWvrqR1ETOMv1 V8ZNI0v45BAUfQT2MLrOo5ypD0KF8CyuaL7M9Ukk9BvYr8tZB5JkqhUaxSTIj4wqT9m4axNLZRJY m0Cz/mS/cNQPU9v1OYxX6QfZ1ynYVasVgvQ87yvxIad5cpyAqUhVpguaOBnHyPEc4I+r3OCe2/tB UKrukc+TfNAo1w+BgnD/w8fTBx/crzNUMXrptZ2iMQLmuaDDm/k5yPODNMEIIJwlfFWx4XzO2h41 F0jdxTH6Fxe7VaXsb3ZtFV0o++TOvceV2pNYaYhlSz0KCbpEBtIH8akEVs6XZsN2sTurwc98rqDE Z5DuQ3dRKTMoJE+3gcl6zjw5vFZqylull2xKH8lOVBA0hPF9gaxAjyzeOU8f924pe/s0iOt+qm17 oYEI4Pfz+2hYCu0oclZXo3m/Yo86j02UzYh83kYiFB1OY0vEmV9QS/9KHhQH3MTSp+F4OuyoKQQS Kt2V9ZY0bSXYlxBpKNS47axVPSSGik2B1kIs0SianEr689XkiG+q3q3BMKPR0H65EDugivdhnuH3 bz+M3u3j7MWgx85Yvh7l7JGEW1byfh4/9nx3ej8IskTq5ZzfxQxrchYF8m0OFzTm89CxOh2Rs44f mzO9FGc7/uphwBNqAvavwHT/YexJ9oqAUNInKfr+Bw87fEIVasfU1UtjYJZmdmcGovqFVK1W8pl7 +fn3f3C33PxXI1ULODCZFy0QjfLM1O983pJ9oyqLax47tJAA4YQ2f+79cc6s57Ua7f4ioHiyWd99 mscPH6Y/YHu6ltHPr7/xSlVy7FWDX64BUnK2aUFvZIz8TvYAjrFEfD9+jcAA7G+/KjNjsNf2DjRd Yx6f+2L6MPt/I9WD16OuJdm7fTvKOVW6im50ru+c9mCgCaDmWlBrifXDKHlYE31Untd9A5fi19/K ZFx7kP+lyLWbddgJfWk7IgD2S32CfF6Tbz6PHWAk8ecXNU3TfY5P3wkwgdeNibGWz9gJX9d+epDn dzHnRvUIZa/UqbwPcQMVE7ZT47gKGxEF1RONlGV82xs9W7m27OvF9NAIfsdAuwHrlTKAVeAgAAVL hxBajAFBnf/BRs3AKkHskLwzAZOfGxznAdKw6T5g0EBaLYZ6S4Bz3Xupnt+7+3B6HD79cgLDNb0b +Zw7GVJk8uZWEghDvCTa1XzP3tJLYprqnKQ+7AKqPKWlxA4cJktF0QWMqN4ADqtrLZBN0mXk/ACh 9VRJHoAyZFFJkYXfLZ5JQH+msvGEPCGQIQ8rEoQvDkIj5O8l/Lmuo1R+zFOQIG3lnFxMIH47Usj/ 5d/71elrX39v+tQnX592Xnkzo8tfTcP0o8QwD/vaqMHBvQAA//RJREFUxVQL7LMCbEQKCuDy+arh Fmxwq4knDLhhKB4VeZ7FG5U7NNgo168KoRImzmrixPeXhgd0HLFUnwabNHuW58H17O1rrwZVRxw0 qvmc8RyjXb6UyayzsrryapVC0CpyiGUR1SSOkSrSjFuTDeEBCLb3NPYlyIDEag7wEcpCi0t+bvAs F1KmMnCugzRmvJeOkMZt4fTz2Sgisq2NaHQKOpUGTdSBMMuSFxhwzlr2kRsN1tJqQ7M6gzIgLtn8 NxjDfJFv0/gloxfIKOGWX6Y8I6UdhZcBd1ocnjWbWWOHxgeNV6c4Zw5Ost25dIPjOht0Y50raxND dZjA3OYtTSUGFhfxsWBdSTPB6itv35yupTyGk/YkJTTJao0A/piGmNzrTsapqhgwIO7NtWjuOn42 Ju9VwUDJqYHeCGqHFMz4c0v6QlwHUKk3z0hgtEyyprzkoS/L2e0fGDSQ29YpXf7p6Jz1VqY04ezd Ey0Xkczbg5n8fZaF+6QK0zeBReNoSjKWsptsSPdApv2I+z1vUmQ86jx9v4H6CIqVDlFZihh5KsrR M8N13jz4PCVfSLs1KofahCpTPb2/Z50Po7dcEXicfI/X9UPlddnHeHAU+NZLKZnPpXS0m4BjjIrV xCApIP2Iux4pthjDx4+yN8tLjMNQXsrryLAZ8KOT/Wmc1FHe13UYMFHucgz7UmgLW0GNnSVVjssJ 5iznQgyQddpNIEgB4Hr4uh9756UGkd/4zp0Yv90iKNUvVrnh8LMXcAFXU76/cWV1unl9raiZ4A+F 6UUCheoIG7GL/9YEeWhhl6Jeozxr5IRioFTlMzQxuZiqIqJ0dI3Ge5DK0qRlGhu0tH0KKC6giawr /fvuY1WuaFVVTUnBix47jnTe+UjS6X0EnZ5l9omzxVWhm104CRqV6EGwxcEoL1ofARGKhmR/Luf/ qoY5hjPB9IqpkFkL9oIjEVhD7Hv9GkWzsTlFGt53NAdCpmmUx5kqLQtInR/GUMJWo5lz5dxuPx8l /poD1QxIR9H30XxM3xoCD+kVpEDXIMZkDiFvK8+gzIKz0TVPzcSfUTjcW3sUcu8QFRJ+7Q2RBKHH ZT2bQGj8w4PXjIOaMOvDEdAtSSiK4o7zWFuffSAIu0DDi5Of0Z2Nl/a6cgypo0CbKJAkcKEidCXr +PnrQePzvhsJAOndbyeIwQeu+o4PyFlQtVx8+KgVSkg49RPvS94KFWAj66ABvGoFOQcSTNaghasc 8OexX9Djh6Et4CnzGRK6DqJA/wKruY1c/pNUgIYU4ZBeVF4ezVK5j+xJ1RqB7MPYVgmaIEdidPvu o6Ksz3MGd4LOkobcQzWIqONZwISzJFNnqTl3mh+lBhUL9x0U9dLqoOHZx0ZAW1R7kW2FaKIcLCbJ q/JL1nQh9tFaCl5RrpwrTehs2nKu2ayAvYPYGYFIkhIJJpumImi6IMUP0nnXb262eRPf92Iaaz3v p/FrlfTLdVY2Mv9pcHyYNX1sL2uqzzrs1h8nKUxQ/SiSquzcUiSmBO0qyid76aPJmlNNmE+wfPXm jenlV17K/a618uqrVeo865UMGjKZ914AmMMjuvqoGUMT3b6vvn2eB6BIpWI1gafgrrKHBUX0wuJ5 N6IskmobbgcJX0xDN6lGnPT5aH/za17kNRI2h+LSHL83Gkv5we2g+tZKsrGfe1bhVe05i29/EbF8 lQSKSFBGtD12x7roszGMrioPeQ5mK6CUSJKAWh1AlRtTTahyyUyxQ8WkuugduMJDmmI6fOUYmjbU WvziAtmKUfGeNRxCs2ffL5LZd+grB5o9O6dj6ucIvvXzVCHEGuKM8un1v1Dp7E/8aQZDMNhKFdSV Es+gddA418xJmIBfa9WLGc5rz6fo4iyHINigEyWE2W4lCL8YYp09TJXKnu/obnYFgYprFWC63GJ2 qtKzIT1oddbfvbuZJggKYjOVIJ+j/YCqnOo7P+19nGHxgAokMC/rp8HStNmNG5dbbb3z/q3pH/7D 35l+7fe/n8E+29MnwrHeunq1DvzJSaht+ZmqivFnjSlG6Nx5J01ARh+Yp9Tevool5GIaG8j0xQPD B7Lt7Y2rfffcAYfegv93W0Xs+ixnt1k/0Wc5Mp8+31YyvKo/PGg7HyVFeZ3bb5DYDnobo3ygoZuo RESqinHgVGxypdDyDLNQnJUbMtmRkLjDOCZnaVIyNEFzixKRKY5jMh7DpnkHEkE6R/mDk7RhOWwl CVI1AoOKu3BIRWdpeYYPTeIlHkcwJkDS8KGccAmKo0yaHzyW0RTFHI1oZ6aDxSBBmuZiJMm3oH3k Q8cY6cKxoyHnmSYyASNkRclKxziHYRPFkSvpHmWSFj7tWOA0bCg1UvGI7q1mReunfEgVZJ3TCscN 0qjU/iglPx+3Sk9WgJ3PWqGzmQs1ep3zYOhpXpL2gkIpVWmE6nhZaPB4ruXHVlUj9wy5gvo5HO3A zuuM5YVMCAQ24gBQQfhgwvHJNYtKCBQlRNsa0aoYkvVzs7Ny2RjU8dGtjoz7PCHpHhyNO36kwexs 842uWnKLDPFIRpqkzMrv6CHdjPlBe0iZy4RByO943Shl4+/L6tE/vJ/moicmF5ZeUTfe08bsdry4 Z6V/wXNos1P+Lc9U3gQB3QnX7yRNEZc2d8zuTad+9nYc2Omppi+jbVOeDdq7klHCUNf9Ezc1hiOV +hAjf4SbF4RQsw8HKTPeMISATnrKrjdm2qhXE+Dp/CfZtmtEdfYJNY/tjKWHUmrA4ZANSvgwyJtA wTq0DJ899CCZPUcjIDUF1WYT2K0bOJI1qz6upsXsb1WLNu5mHRgViZo9JVDuYCNnhIFgDmT+2Qg4 ZvYzRIwsH76lHoqVfG89FSI24VkCd4bS07DHOqkLokfZB8qRs3oxnFUqKS+qz6vJMq/Jn46yJs8T QJtqaFaS4JENuZhrUjURYM+fpFSr3M/w57kntKuhsmeqw6xikb3b8bW550v5886NraIMuypfDL9n bH8JmvNefu5qVDmgWpwMZzqmuCVgiUyUsyuAsoYCKOojG6ToyhPMG+U2Vuicx4ZIADuWXpNNBxjE rgVhdZaHTn+eTRy2ZrMOxLDW7BY7qrEmzwVKu5kzuCRZaCnbUBeBAHWGoXwk0XJWnIoOs4l0Hmck wXGd7pOt4qTaAMvpcgDsI2qDPpGsGeTpYvbhedDOtto36wminNG5IDXu/6Xw7N/82M5wTtk4bJ0A GirM1kOf2EFJ5nz2m/L9an6vwbMmqWZCnfW5aAQoSi95wduEGhWswHtNaT8UBoOKVN8qKxq6AnDD 6bWXKoEILRP4GdGePbbKZ2RtKgeadX3uuQiynMnn4ZbGKfKZ9sx21nHzxpUGuwZgCKZu53m9/+Hd 6JRvhfOcJnL7KXtpJKvPM/Z6pdS582l19raBasOJDiBDUlTKDjvrDORBVYpQMNKgYiCQmunYHl+r K5FkW1ptUgJ9reKHimrMx24aIW9Heef07E7pNSfZvxs5GwJnSdCmAJXtM6BFMqxPw8AiPPjsIz0C dshhkFT25CjBtX2G+yspVYXbw7uOf0U9WEoidfnGzTzn8FZj9wS9AuuV3Odm/k3SfzW9DHCmxwGf 7j0YWsdUcOpzVZ3jDxps48pKLuajh0+yM88EvaPNuHsnpa6pMOrP2FhJRTRnyb6ULDSgY68kBjk3 gkubV69IfVjW+QppSoBI7lDlYMjMDa60+ONM0q9/Srlf5QMtRCPtjP7ZQGjm351/Z341VTG+RdBu 3fxai5LE+TNpcu45ShJUiGMX5aDbhso4R2wSbrHn3DhpzEnoQUJtaAguhxzNuSMEb5x3Dtv131E/ 7KUxGj6nXBOe33tVw84CLTqXIQ/pD6T5vK8q9KCINLHmS7MeYjPXTsLTHKv5fCgMTExxPT02R/Et +sIcfyBXR6WXGuK4j5kZl+OH2NoOjMqVzM9lf2XPQatb4ZtJ0fVZ5O6AdOKuEYjnOnMPQK022s8A mGexG2x1deAlCEm8egGSmfzZpNiDfNmLy/GTucLpS7//nenLX3t3+p2vvz9tpMr/Uz/1Q9Nnv/CZ UbE82+u+vojKkQRZXwf2g8SqiMXQ4hzr3nB4KKtAnmeRykCkG1OgyomfPDng0dAjJzpRaT1r63n1 +QnYR/B+rsr03wmsZ8/aT4wx7EOgYfxv/Bf2RDZ5gpRVIzrzrh6+AS9+KWPIWpRPBMsCYWjw9joF hUwcTBcyw3c9ZHMbxNMeIuNDq7jdrYJk3Nas5ta6RiQbfTTxLKeE5YAP2sNeN7aNtZsSQjezxZIB QDtniwdBU47ydHwPX5OZhlpQFRA8/je/8pU0/h1OX/jcm9Mbr12tUV2gv5wPwDO+G+3EpVzvdpyq Dl8NdotdoNkwlFwb4r6yI5T+MIbaQ6F4oUHqMA0mZNEEeOsXY6CPhuC9y8LlupbA42rI+JvZ5Dry 11JuO47xfgJdg8AneKF+4D3w5QTy+Jlf/87tKIRkolbUHzaNaiYCn6hD4xmqyDNoWTbokKEbGbJ1 tiZWiOxNN0e5xBz7GJLzMM1bJ/FEB+SHBCyzoFwThwBuJde9dSXGFi856/EkAWRBAAGqbDrvqXGu PDLZHRSxAdfoch5yHrOMjyX2OgaLQxREFMkeXMoh9Tj2w3m2x9hpdJSL9uByaIzP7PXNAEeducFF 2AwDte5rc08+M9zfixoRc13PE/gKWC9l39r4ypwvgkxsqiLE8a1chqquhAedvRhEZXFDmWhI7MUe B01K5puub2vw8pXoTx9mjyrd6XBmUiUepujl3IRh36YgqIOAAvr7IPvjhYaxBGgQ4sunQZoFG1mm e2l6uht6yv0Efdb+9SA0DxPUvp/gmpG7asR6nGu5+zH4utoFPT7zQYK75zFU66grFHwEXXjFufbq jwaJIF2IG/60o4bRa0bHOVvEgDOiVdTgJaL7acAP43mUpGX3UVCwPJsNg6DQP4oI4QamIiWIa9w7 jI7DN5Ri8jyCoFyAnic5MSH1RRpE9S/cTsn6iPRZGLrbaSZdChVMh3aVeA7CbeQU0Gvsx5w15VkS Y7UdCRZW0xg2hpXkvhz53MTtNF3hiL7yypXuzQdBQCBprUol0LuWpPVqxuBml3c9G+Tm2T0KEg4E 4ChRjg5THhUM+d5qknRggcDJ1h7o0izQSBCmkgM5haQqeSuRm4J5shjFlzQGURrx80MKSwA8M7DO aR1ruvSTaLVbo0lAHKqkIc+R824An+TGe2uCNLRmAzqpGtHzMhrOVUGqWhQbvJVKFxrDXJozRy+F IHUhI51HkLyaIIJNfkKRyN5OcM2RXLkeKkqeIdTWz57k38tvDo2EoyxK1bUeA0AobiQmnHGARVxD 8q7TGg0FowpFMcNnxN6cGY2e97ikl8FezdpfznW7vzYKonhUG5skqIYufXcBSWLf8jhaIRBsL2et 8V0bmHHUHfIwaCIdVawZPffh+Sl1e661taEqokyg/KgC6Fuw7AcJRq31SnwOLrLeCRWp05xzvwTX FHnO0S+yZORhn6CNua+cJc9rjTwhNY6i6SQuk1hnbwMBNLCvb15IE+6gOlRlSvNV3stZJGe5GvT4 /v1H07dCT3vv3bvTzeyfRzl3Js69n/NyM/uk6jWGMOU+0KOeSmDxe1MdFtxcjJ1SSdU0pjIJgXYu SW/i+K/lM9Y2djK3YWd6+bUbEQcImKBiJIBvUJ2fg8gncXoncx02Qv969/17oRg86oQ6idS9TLVD KdScTSu6UnEC36wZzX+qODvPUjkmvmwYlK2R/dM+DFxcNjs+oL47v7PB9kCHwOT+NvKsOr49PwPJ ZPet81e/ezdDUEZCrplOZQSlyUZhsvjN9JFGRSKsf/svCDllsZdeCt0n93YlUoNURVDIvBYnXzLV fo4AKFRSJMuCfAE/6p1nzV7y9bV/ORuet/15FBonSlTxpsYi1nHoyQv62EIxkLNW+rT/8rq6QUBU vzeSsf68856z03kJ/q26zspNY32dd+slsD0HPFEfR9O/qk8qEjlTB4m9TtIwOi95yN44StJ2T0P2 8X6FB66mUf0k+tWHOQOmcLIhhaKK3KKWqDKMhuLK7uXaDhIriN+WonrFxnXGQ54zdFy1WKILCXed VVPiV4F7QK7sSXTX57H/S2genlmep0pvYzXVxVDSzEugZmWvPEzF5mtpXPzStz9MT8/T6VM/9LHp p//oj00fi471ShqSjw52i84Lpu1x5x5o2Rih9mV8eQaz7SYiGQky0loeSCf6ktoTt/A3RAKsb8Bg CZhfnk1722YpWEELwTLgL//xl8Ppnf+a/blQ9vjwUbl3FePfmjbJ8n2wkp+AueoWSs1e5wUy1HCk UUbc6NmzcHLTSdvvUw7JRW2tbzSI8tB8Vk/aCPN6o6oqhwYN5L+h5avEHEdHei5oiB+pNu1pHKVG H5kxmgXY3kNNYOjdKu7PeSn5zYyjrBTf9ShRiAAV3eLd8JDe/d4HbZLSaXslwe2QDyQzGBmhBD8a TZah1dk4eIzLQVdkNn0wWYPnZ4j4mhWGVu3z2XufUzNa4ocW50sjDSqIppXNBKh4TjspbWxf3+qD wZ9LpbDlJZ+lQ1izFZWQ3QRYRgDTBmXYJDcCpY08l+U4S5tcqYfY+1k2xG4QI2V1Ruxp1SJ01qsA 5JBS3HBPeEicUL5f/tjcw0z2y+qj3CgNy5QhZnjrKdfOpWmT8THCFfcRMvDR1CuO1JO1+Ww2qa8D JRPtLkLrmSnVFk3nCLPWEh0IvGcoDO/UlsGPGrvZvhxINkukMjFoFuShoHPkpBwkSPxoSiCrUx3j IMsCgnK9a9XH5w50QPZPOzaB7azs3+7s3B8e9Wk6go7ztZ9xwxmrUOULjTyjaTUoY8rY6BZG8XLQ F1LqX8x1Gr5gNHO5lXhkT9N8i4YQig0U6UlG4knQOFTO4AWZsOxanNarCYSuZjJYg+YEm4+yX/cS EFDe2MH/3lWK1pCXfRLHb0pjJdV8FR3xrFMCxyPP+Xi0lv1rQICqTys2oWDpgoZC5JmSQ6wkk4ax rI3numr6nslb+ZlONG0hYHBZT1POx3empzuGPHAA2f4x4vraXIPJg5RB9FA8Cf9DkKevAFptOEzR 1fzdvus5xdu073MtOzkPT5+HKDJLiKmgCAwkDkfOhGauJBVPEzzQDtf0ay0Yf2XEp0m22wSa+3ii cS1lwqv5LE5cMDYCU0hV6GBxKmtxuKeao2dWqFMq7a9UKdbXJcHoEiPoHuhRHqdGRo1Ms6BNEIEM vrqFlxqENrZO0GfNcbsFQ+e2VOBNyaPBb/snNCUPNIpsERpbNZVr9PEO8z4apcphT0XC9bhXVJ2c 82zffM6g3UHxPEel4KpPKOfS2TZkKuvq+RbMyJkUTFAgGYO72Myhvfs0TXEdfJLryNEZCE6CzCdn mWAnoIAw19ZSJpjRyPgEwblz6KxLwqDaHK2zArVPEiDAkRaXtlYVgbb8VyNWrwzVGEnn5VmCXZOh cTHoKtpfg3U2Eb86v2uW7UROe19pWWgyq0x8ND0w1zhK5AEHIjH3PNSIJqJ59ZNwrp+92C/dAUJn 5LUgySAXwSrES1Ob/hlBRSd7suUSuyBYw6GOQUrzeXaXUnJBDWkjWX5WSd3YcW65cp5d41xL7aIB OhRR1rs+JBWdwzam5V5efvXC9PF3Qrl7EBrLrfsdlLIWO3mWPaXB9HYQYO+3kqrR0nESpOzpH6Sa +WGScTSKBwlGoKKHp3v1xdbG+agmu0SY78i1rod7feVamheD4vN5qqXsu/1riJV9SullIf+283JA oCSQG48DNqCqac6bJWWV6URvSsAuKFTdWDa5NPbrWGKS52eQyJjWOlDXoXCUBIQEIX557s1kT/Z0 6MRrDkV5G1KW5EopkqgAasY9jBSkyt92AtzLUXZR8RFToHJd0v+k8iUZT1J3SfIVAMW56NnPNUgU gGhsCylZfQdjSu3Q3bfHJfcAKc3qEonKvAaQEUiSzd2UzGoGDfB1Gvs/l6nLRTPzfZNanQF0CjaC /3EOV/kegasYS3VWYu0HsncbA7GJRBMEea34ScAkJloKzC4YNCfPc8j/jXUUyh7TNhfox/6brstm HqRRVW/Zxqz6ze+Q1nsa5ZCdNGquSZ5jX3wm2gMfX1UQAEh8heoZpTBVBxawz0LvCRulQqP3AXAn wadalCp4q0j6AHJungT1wwi0p1DznP32R5DQ7J4Y99YGzVa/0WBi13JNhjF9kMTyV373O2mqTmwS EPInf/Lj0x//2Z+c3vr4D/U8Hkbd5uGjB1lTk0AjmZyVsEYdtEMMQThRzW20t5E08M1tpLb+UZzD mfarsUz9EgEESRrgJXtXvTWvbag7A1WGzJ5MKL9D9SSO7uu/E1z3bWffmwX43sTPCEasYX5kTkkY 302wVAFKx9tDwF3KAslkdLW3wzUGRMm42r40AWcTxGqAi7BYTfGW/xsk7/OIXnc8g4DjUt3bPBQh Ge5eS1icWhyNRhwohYChOro4Nybo5e+cYQ0vDlgOrNKboMPCEA5fW9uI8diY/upf+aMZgXlvoHT5 /3uPd2sU1jYvR4kgwXwO33HQAk1iAjcodsXPcw+Ct3loejaUpgYFkZZafWaM8qFgNQdVObOTLFOq uwedy6HTQW6TC6Jl0XMrkcfJhq/hzEXSk7R+GtS8DuC7iQqR7wsMP/7mzRrJK+GdbaYs/DhJAI4o BJsoui8NXc9zeGJaiizbAFVqoT+rZK/sYQhBDsXqaTL3A1qdeMTZcMrf0O881wOBDM6ohqbAtfeD lG7n4C3jVWXDKaMytAvRuq1BUh6xcTk8+6JZd3dUsz4ZdJtLAMy2ksYNaPMoObR863lCBHqYewBH wjSGBSQIzBppWHyxhFNGI90eGM2aQxGFjifFmaEW08Pr2DXLTDIRTyrFm8/6QBlxQC9CZynEJEjc TansB3ePp9uRaXqxvjM9hfopm+V3COyFNHosRuJrHidUk0MO4oMHaaBL4LSR50HH+XKCLOh25nzU QQv4t2PQz2KM4cLVDc7evhZEBEpjMMJRrlvjzytzOzVw20HXrgR5QWdYD+qFny8OEzBAeNAPUAU2 E5RzEIwq7rAzIpG5lWaQZQlog7qMntD0ZhBD0EboensgaD3ncXguqBiuAeLRseQGMWXdHyZA3MsZ oNt7GuUd163zWcm6061SVtwPD9YQh7tpRj5SLszXXhwobudZDK4pi6+lGrCW7x89D4KdZ2Gq3WlK jDSJNfmhNuBRP83nrOFVOxu5FwiSAJrEVlUMkhg8yHjbY/SL3PNB1oXjkoAuJeAQ4Lz+yuXp8ktX 2u1+N/rbePBrV4Nmxbg7O7fev59GrjROx4DfT2MmBZ7tlBqXsyeq6KPcWZQXwpHzkPsVkLJzztqy 4R667vNs9GlotIJsLc0am9k3NmI7AUl1pxOUPU6A9+1IjZU6h1qV91xNpYzsGIoWAGAgKMY9Qw3z ZeIsm4ftgA5zaTSaSezAXVUm0vxHuzyvWYv9shaCasE1CoOgtNrwaBixoQKbzirIvujAoWyAkwR4 5ZTGSUjOD3Xu64Dn4LN2l+ZVJ7yWWIcJiDPJKXtHv0b21FIa1thPPsf+FgRfUl430yDbrDr5fFrB icGF1EdjrSqtaV+hsxTFGpNW5xMUQZgFOdWUD/3hiDPP3qRdXaqIoCfnf1QgRiDsWVjj1aDMnqOB IIvAnt5PJC+TzElKDmMz0fU28pGlMXUKHIUqjm80cWqiLmoPac8zqzILsyIgyN8lIew+m7SUKoVn 4oGR8qq+9YF+pPg1kxXzvpoJeay97DmMb8+WrVRZ0WDm2Sxlr72d4Pv1V29Mn/7Ea91LD9J0+DCN jU+SpHcoVYLl3dh+8cliEodODI5vPjqUOMRr5l7oQlPJOEzjITSTJV7OM+Fbl4vY8pOahiM8QBwg PkWjIHk7SQeK0UqeqTNzL+fkcYJ337OH90I3IVpAelaUyg4shibXORKzpEbCJyG/kNcn/Ix/i7hA KUtsXmT9YoNMNe45ETjmyx5eoLEcf/7tnNP2FcTQzbXpQ2Uvkpu5ztdfSQNyAi7c55N8fhXMgH8q g7FXlMYuXtKkj543VLg860dBRfMQW+1CL2U7+Uz8ameaTTnFU47NXCaXilrinFNEScK0yq7lOlFD T6mKZP/pe1nI+o19AtAIrz1odhunAXbON53zhlWzeOcc2KyLGjFR/1QfJijJfQuegXMoC9m3CV0j g2n9EhPlPNpXpZcJdBNfoaNhD4gxXqDz+XkVXIFk1kCley6Vvr3H2ad61fJs2P5VoOBmEH4+K+fo SOU7/+kvcin206gMOSODvkI8QtUZ6HQQ2/v4HKgqGA0ACciTe1+8SGZ2TM+0Ny5mreYKpMz2QeyL ZOhZ/ImfOaHXnuf39TQs/s6X350+jN1851OvTD/zT/3E9No7r+YaIxLx4H7tx5NQb6tCk2cIJCBQ YE00TDrnBZP1vmXvqH50ajfQSHLM1uUFgOIm+uKV/K7SMJevp+mHGo38M0UQ8Y3gHwBZZtYIyvXW Mb6NQ1HBRhj+h36dI9cq8a6lEX9j6Aoh3M+hhpAtL6UclI3pl79zEPNxPhbqODdqFHQNKAMWQyj7 O29qOvHA8sYCAgGqC3QzDKMAEuqImsGBeZgVgs8gGM4MmsMxKOeZ9fHihZJm9COz0byvErey0dmL BKOcCLk2EjlZaMG97vvFOFb43lo6nmWfa+GAvhF1ACVDpV9oU+V8wiVDpP+N3/p2JIweTh8PF/pG HO9CDtbzBGJr0CTOiaKBxqJ87rM1TTcC11AAEkifNzVdira3QykAvhiDcS1I9Y7SKLmfbOwasGxE 8oGqLgzgapCEK0HWbgeNuH8/E/VkztHRdaCgKx3dnComflQbD2MwTOuDMp9tCobHevaR5/cF5SXI Xr4ETFBEjuQ03EYalw2wZMxZK0jCxTjXZr8ag6IJKxcS8CsT3otShYlii/mAIpf5TBrFazHUHRAh G+P0BQl1PNaJYx/i/hBRe7GZuwA8v5cSlZ/zOobHGpQ3WsRFw5DNrMSEWpASaxpmVxJotTog2kzA PA5lMnfc/1mTln9Cy5CElbMt+5whsZWMarXEQJskc3EmS0FCOOwThid7qE4uDvMUwpJ7OVJCpiSR rD8hcfjn4d0lmD5LAnmSYERFQnLI8eifc+3ly+fz0Yrole4nSYTQIcszyC9HY1lnf5+lQT9ZxyvX Nop4PggSZX0dWP0sGl1fi7bslVQ6BH8qN84opJvBO3womQ0XMn9/FAP1XhJDARlNYcEEaUra0dvZ ezhp9GQZlTFUicZ0jHWmBXIkjKcyfHKOrMfu9EHOv87z9dzvzfAvNRxbtzYY5n00ZFEkES6QIFxy HvMeBmbgPzN4j1KePJSMJVOR5MipjhKYvh9FFFJLnOeCoMzIZrzG2AOFjL3sB0HYfP5dk/FZqgFH MaiM4XaqTTvhTV9Ow+fBk7tDjQJFjUxU3uPL33o3Ae2ddv1/+rOvVvlHz8KDUKAe53zgH95P8O0M omRwtBceZG1iuyp1mX8n19eJsdmPx3FgD2MbasNyZo5yhh5E0UByrdeBc7Z3afo6fxJWwQ3E+tad vendW4b6PG8j11aa3lrapUWce5EUrSbZupTvU1pwZktXgQDpEUCFQHkQZMSSQWgHz4+8mcAuer3h zGo45PDUMziX0aE+elqgM236018g2ELbOC9V53dIrLM7Ij75WGwCuwOBnFUJVdAGYjtkzyiCHAsU JdyVs/LjgoGh3c3RSyovPnP+VT5Hwl2ZrFwT1ItlZhfaJJR/A+Qo1yplY41RIDhK0rWPvlZ0O6CA ngc2u6TqMcVT0kxEVYCDB22SW66yCBw1kJWAFGgx86tBqJNQnB3S8BWgCBJQYAKYQK8ghXmCiwmE 1+NzBmddT80ILjwXzrSl46zBwWkqFChPuW4VyKensffZ/2x1q0mkGvO8VGDXcg0mgT5OImp/S0j4 yNqj/DwpyqdoM7mTjmTOc1VxuZZhZjej1GJfPI8t2QP85Fyu5TN+/Mfe6dpKGN5773711oNZ9vnf D8/5u+/SMUZRNHVyo4EImtB2AioKHa9F5/ml0EOIBCwnsFehbo8CClP23kEmNO8lmd0P8GDfH6ZK JAhVDbqczz9On5MGTRVktrwoeVbwdBj3BmjXQ8PiM4w/X00S67w8sq+zhnzLPvphQKnD9KqgHj6M bfjg7oPGFi+lYvXyznb7HgQnGm0vhxY5Fxv16MHhdD/naj1oxrUorUAmVT53bl5rc6iKF+AE3YHq 13pspFkT7Cb6jeO034mcw8dVhCF7A++ftKYg3Bk4jE1YT2Kymj1xMapGDaKzHzSnnwId7Qs9X77y HnxzqYywJEHpDLXXrzH4vd3q+S66h8oqozJokkNObwg5tEKCfoQ7nkAVynw3fphAgkB68M7HRNDS YzVc5o31fMFfJTNkfQGdi9SBsoZ7+Th2TWKyIqFKIra2kRghn0fViKDCfvy6ypoJjgex9QLghXl+ JzYhFTPr7GwX0c89U+FogpqzhjJWOWKVytxXJ+eqSMQBL9Ahzx6mPnYpPlsltVMU0Uvyc6ovv/kr X5/+wS99NaDX/PSzf/oL04/90c9ON956veDLB+990D1y/dr1nqfV9BJcpNfu3AMsxaUqZueggkZu wbVT3uB42ER+jl8Gpgh0lyHKndY9KmsLiWWfUxCR7DRhHnu7edAIJAbaXkvPJg1KT6OYotjjeXjv Idk3qEHj3wadtXtoWVZew5Nv4o1mMwninuOVyZzyStmwGxK4MMoOvTes7q+yASREKdLRrmxAz2kO +ZBwY9BxxkgP+blZc+WYKz8uv+UTSCFUZZkcUMZ97+cglJ8UlEHQABlBY8FJa8drDjSEw4E5DF3i djpOfxDRdPjB5z/+euTP3ugBo8foATy8f3/66g/en37xS+8G4bo37X7m2fTZlH2+/jAlulzCH/8j n6nBU5p6GoN2Fg+NgiEg04C2dHk1zjNJgUAvGwbPbu1qUAWjzNvcEscUxGo9/+bB3o6jx+1TnruW YAGiv+IhKCcZBgEJTBYMvXGwBHlGzy6GG7bMUyVYXo080Cj5RRooSOFL03Ydi4x8UWPThaCq0Grc yWzoE5ytTOVbSLKwhauU8tAH4WOdvAj6txNkO1DOXoMnwVrQs5RYnuXQVTY9BzTD9fIVeaYkVpzN 8pz7G6ONO/o3QfkaZyJZalUmG1FTHOfOqbfqoYQDpU5TGG5pkg/W5qzNBxonNcWNZhCJj03cgRQ0 1R0QVAGhhVJgyrKSMRzj8siZdk2mRiRTrmEEmp1y6jF+nlcCJZt9Nc8Kt0uF4blhE4kPTGtaznWs hAKysUCFJkYAPSZTOR/eezS9CCVjJ3JQhqLsp/T1NK+Z31DZid50SlUredYr1DZSdtqJgX7vwwcJ lvdrRCvvlMNLLWMvnH+HbC2vs87zCVwf564OBS4k9nLP+P+GD9HgfhonrOweWloQPI25OVcJbNfj sOeu7BSFuBZHdBMVZIbkkwOEarj/JeXE3LPAoE19EGs8/ewza9usv5y58RrRux6Hq6ghaAGtSkFy BF4MBFrAKLdBARZxVzkOiI2SqGdBqzSf9SJVEBrHjI99LKndjU7+K68kMdhJMJvreEAKMIjMhah5 3Is0mf33IIZUonIh5+j7t6OrGwmpD8I9R9naIgMKXTD1MGdLoMlp+ewfBN3+ZriZrg1S+izn5Rvf uNPE+XKCbPScp/idcR7OzuHDVCMS4Z3lOveU6lO5WEFbKlKcEmSG2wg45pPYn+5l0luSLFxXSd9K ZLw6ZTXvJQm5LeAmAZZruZ2BNhq8N1JheKXIC9nNBMEJaq4GnVzX55HrbqNw3kclh+MqBsI5OzsS eEE2TmvWvnrWgA2TN/O+HFqBgTh6qI3qHvSLg2VMDUOq5F7uAxKIKtO1YlslqbXtY0ohNwQtbse8 6haFHBU1qFO+l5+aUZGgQPkXQ37y/eOc45r1PLP5fJ/KAC4nZB6NDGDSFicTd4cXKGqK2qE6BXVt sm1vubp88zROGXihwrWSwHIuPM0V1Q2JO6fVRqzBxa2Ci72Xn9PUNBB0+8wAjKxpOLhPkuTkyfZz 0OnmVkLp2aD5TMfd+HqgT71kZwi4L8PE2oSkT6BOdDjYc6lQzlJPAt/TKcCuJQBEGx0BQ9mQJPIW c+b9G2RwVDaSRGlyTaA8lCjGiPt5aH8DeSAECkHOUX7mMPvR+y/mvVUKDi9kuFAqhqcaD7eulyfO Vq6/kl4OSgzkPnNQ7VGVK+mha1IRca68eI0GP+pmkjn9IIKA0b+QxnZTOPMwVhO4CFhuvPLadPuD exkdfn/6znc/jGrRB9N3v/d+zqfAOipbCdq2Up2yg/aU5fP5S5pbc/9kIxVbNPRqvqRSszCX67Se efZPHhpqFeSVvcvaLknUkgS8mcE6rvGl0OWu4cpDmrPWW7G/i9nDzt7ibBqfRX2kkiEtgWBTVcmz WRGYSkiyxvzRpjHsoXeuRDnlOWAwz1s1W7WOD1BlW4i92JYoZo00hh5k0h+u91wC9cMAeGehC+5T nFJJ5CtUN9hLDK98UwV4gRoUcMRmkajm50kvDoqX5s9UMaHGCfg1twIFJVtPOZFcK/tkvwjUBf8n Z+ldi11mG9BRHu3u1p9pop8PncNZrp3NOugFM9+jDchBYFXTDchTwXbW+erD7K2TnJf9xmBJBrLw hr/jyfeayOVRNAo38Fl8pgB7JdOLbyS26i3ZQ9mXx0m0fGPDUDDyj/w+BkDPBRUSEnc5C+KOyC2b rK0XoJaEvrUm35la3ONUWH79K7enX/7q3fjV1eknf/gT00/+8T8W8GRrenSLLnzO6/z2tHgZ5ccM gsFNH1KcJI1VBAc3WuArCVfJqDa12KI9KUOFxf3NodVm30pmancNupoh21AAZ4g9EL8UEPZf3eLo YWrgnHgUim3YUqlfcRan+RL3ONPWBgjltWXDtbrm/QB+eU25eznE0DLGRMD3PI7EQUJOL7dF+Y3j bOOLQzmGKXgzXLmLQXE9FAbA/8moeqUJ1gbdokOtmtW4bLxEhI2+XqxfoyQrnF1csic/x1l06EQ2 gSYKaIcAm07tfAzRSYzEe7fvRxv4bhG8Ryk5fP/de9OnXr05/einM5nrOfH+/fJrdLN/41vvTT94 93GmZF1PJpeydAYb3E5G/d1My5pLMPrOO69Ny2lEfKFc2fKhoDYJhSQjlU+OaS4I31N0bBJbRjPn idM8xV6oWkAOnwEiJoW5v+o65po1oUGHPZkzEx+z+Lh1ZLKaAeczTH16wVnlYJzl6eRcBQUbXFUU kJV81lqCWwOF6CtDpKHQ9GQlGCZNAuWWMh2MEUF3Wc8Ge5Dg4iBI9qU4/EUkf0FtPPRcbgo/90mQ IxqkC9lAnMZBHscZRx7y54M2qxSSCi8x95NnNZ99sQD6jKHneJSuZd8oBW3sOHeQ+TFlZBkujVuJ GO4YqofGTp4WGltpK2vAgeZQKY0ehPqAX8wwCi4u5XkrXa0mcKHC8mx5ZP+DS0XdYOiHqyagpqBw KJ2eqEq4HnzOOHwo7q27+9N8+GbreX4Mjud3kGdzN/tonxoHNOkLb04v5ec/pCccBNb7nwRlvRRj cpoFOo7T2Vi73sBpqUZ1SA3BpR4GMXuULF1wuhVjtpbk0ACJ9PCXS3jz+mZ/bi7rbsrgewkWv/zd O6liRNUlgfdGkDjDUzaD1rz8yrVcZ7q6NbElcCSdyeh26IAAt2jfoE9xArJxiPpCG42GEepAEglL 1qETWAULeHi69aEhs3MoiYSwtHIgwOPQVGByzuYTsLxv2leS2Js3r4zGII411ZGLCUpVVIZevr0I 5R8NeVUdyj7dDUr+IMGoHgLnRAXlbkbB479euBs+6eEPcn6jRJB9bOrqeugoj5M8XA+iiXdpSinH IlF+91YSoezn1TjT4/RpzM/fm74XrWA3spVyvb6LZyllX8a/zDNQ3VIqf7qOX57JjKk2pbxVRM81 VsEg1yyQuggJybpt5hlspln5MOekmtNK1HEWEHTjlTUE3U7JFPr8uR9+afrc595uBcUgFug6W8VG Xoqz90x2w5E8Cle8hlfiIyhU/QBSSNSViq1+z85QUIAWjYmE4znZp2Mwj94Sv0t4TQxOdUlAq1ka chQ7cI6sVOO/1zuQMoFJkxJUMkh1i0yyluHwz4fhDGjccJXRlOXPHFH1qXM9AhPBBz3qk2RWbCU7 IfDVTDQGNhRyKzjRXpZWsVxDbJhKR9YeaLOYZ0E9aV7p1xAvNrK+YPzcLDZv0igYR38ZvNbRXKx8 WxWGOqsZbzoXvWiSJQH4vEFVq5rMD56lNPws9o+zlhzwVbTw24RWusioxC4E6GGrnbfFDJI5b16z amg1F8ngOGMJIE0+ZUPZlZUE0gf7VnxUe9ku/T9VPVFCFmDl5/jds6xb1WyKbpNqTFIce38cH3Uh Fd6nQCrJaWw6H7q1vtn13doYFCfUkr4/l5ufHxrwQCeV4ST0SfSPgzifBUjRtL2XMygwyeqk8W1z +tTnX8pXbBo6SpQcvvG1b02//dtfmX7zd789/epvfL3UKjQG9mcrgILP4TcoW3m23/ju+50TQZNd 1Xd9ayNTH7eqRkFzejV+57XXr6X6sjWuPzaO9CO5PNXmUQXM/AYVWLLI1kQFBi2QqMKMEqEish+/ cP/Ovfr7DWtoCiUaAjtomyYoNwXwTipPpDk1Z3fiXrbBPHWIBJHmw+7FV5zxmfkZak6L+lyWrEk8 cXxr5eIiHUmfXdW+8rH5fL4KOl1mvqqHCkriAkIG+oRuR3P6Tqhk+hWux35fS/VtMzZ/PXbpLMGw xlrxiJ8zoEoTOX39KuR0PgLEOn07+ntUnPJcofGH+ODtUSBRHLAgcJhBQoL4s/KDyQsmkY/fWMrn ZTFTGQx4lJ8JtpKqas5T7MNmbIWGabMdUIfm0qVeSlAGsaxrPnXs5aDCcUmDhlYUqty/JmVKT8I7 v57Exp6mZ2sxMdFinrHYTFJU/++cSezFKFnn3/q9708//0vfKgXvL/7TPzH92E98ZnrlY2/U7gpa xUvr0SKfv5qKw4zW6jNGFVssM/ruKgOqT66VPbHmoDWPoUz8FdWlMYwN4DsUYUbSWulDYAYAUh8f AFOc2uofFLofMG6u8bXYdTRT10YI5muf/dPg0reHLL86J0ZVokm4iaux7y0tfuReh6FlcBjFBZB+ kb/ByfOmDtZxStMd7JHAcTFvPuTaRkmvSg+cPY6KgHqY7n6/SgNjxWroz3+NjAE6iA6BgzvEy7c2 IhNUJx1noYM+3Dq617vh6ih5332UZo8E1xCM61d3po+98dr06XfenK5HzWRrM0hhAmslNgHyXpoT bqVDm/LJj/7MxxL8PJpu/eDDcXBzAYzc1772g2ywBEA59Eqrc9nIK3FGZMM0WlWmUMBog8lMBb5Z SLxG6LTbg56ZkKREeS2SYZzEUTbh/aCi90mrPRuof7lQ5fqM/FfmW3JLAkAHudJaeVCC8o1NyYuS dpAQzVFBwdaCbMiYLmRjHKc5CDqwRKs1ygcqBuVd53OgzQzHg3Cvz/JajWkMLmOg9IPDzSBvzRq2 DnNwlTs38O1kvbqGZdXKKdlHmvUEjdBpOrUONkOoK5yBaFUiP4+HthwEZzTX5d8FFNnsHeYTFMl6 0uKW2M1ptNwmiWaQhrG2lC+yFyA/eIXZb6cPxkCNy6+kWpBBBB2bWx5c9lkbK4w83ZpWL0dFAq/q aQIfzhx6BplzbRG7NwTie+8/CMZ1MftJELuckuzl6c03xhS17713e/qV3wy3MXvu1QxG0JymDKj8 W1pTNgBN3wN618cpVeKc5YuUHY4+hLkyiLRdYxAOYmz20sF9FMWLZ4LsGN73b90ZKFeye1rnDADU 5wvv3JjeejPDhqo/Ox/nFCcV46yaAk0WdAq6uoGKfGWvzO6/zWsazwUEs0ZO5V17a3Gmw9vBALjb We+LydwME6jsmEBB5anokGBqlMmc3cpg5Rncu7s7/caXvp0EcW/6oc++MX3yYy/HKWSv5JlsprNb AFFKQvYkCoahK9C0Zueuaf7lrJGGKYMXlDZPpze+/2H5nhpH0SOeZX8KfAxI0Wxzrtzh31CnNFEJ HtmR9QzIaa9I7g9ShN5kWQxhOcjvkkQVA7JiKlx0TwUhKjCPglSbQPdeePCCVfu2TUnKyXjk2TMS EIjWHiWUGNeda+sJlpKMpuJFCxwq/WM//Nb01hsvdQjQRmwG49rJpJIsvMckYxcyhIbTxz91TdV7 1zg+s+CVnWxiOQJpe8Z6Df7mqA62OkObM98XfBI+lECwo3T9lUFxuPHIvV6gV0lHzkTps05C8DGa b5wJjCqo37nDKpo+CyCs6rl1dm3WXHA5M91VLQCqqIo0Icg1txEI2q03g7+S9Nqbs89sgFmqBZ7q 8ArnQ8Io8QiOOGG2yIKwAegQ9rl7aJLWJHFQuzjp1Sj+aIoE1hQdznVK+MiX4oJyjJC1auD6KjdT QM4hDo9WtLqTqGQFHNFoOp39r8ki31T1IuvDkQqOWV9ryTEbMiKo7dqOKlDpj1BGP2cVmmQO+on7 Op9ieyEBTmmHeW9I9OMEj+ys6+T7DWVSMQZsASas8R7/bG/gy/Kx+YGe32YB47okFBpZ8eU71bBC APj4kuGhdjGUaijjJHnMTS7GRt24mWbCKJi8E/m+n/ji7elHP/+708//wm9Mv/abX53ef/f59HJs 5XqC+8pTGuKWYEZBUixw+VrGy8cPvxpA4Eb6IlTariegXk317XLsWAUQJD1ZFxXEMYkQ7Wc037pf B5oE23LOk0CPPULbsa89lN34fAGoqgZq1lNJ3czGSFBMsT1mT2LfJMBnqWo9i21oz0MVL+z9fG9W GVpLAt7qBx+nMtJAKWBA6DLoPR24xW40dDmvkDorxVP6fbbD3ridwVVfCYBnQmflPrPuHQqXs/mT P/356Qs//OmemcdJYOyFk9hnNoGNHAoXPmJMKq6t973u/VkTdvaS4XP3QpdZWY6imWZnlE92N4Bk Qbny74c8p6qdQPQS7mGev0RlrhkIyu6zAhamDLfPrFXiJLqSeWe3FJgkfwn0DcAa0q6yN/0JiV/i N1FrHA79SKsZ8uP6IekURJKnDJnXPKcPUhX5yje+32f7xTQu/sl/4kdCWVmPT7nXdbLG7DMQJhlq z7zAtgAyG+9bM4Hrc+lRr3dOxUntc0ogvxLAx/cqdiGoJsXb4LqQdxPUAWKMPSXRxugeVqrpUn+3 Dfs0WmEYwTNAtEG6PsO8gA2UZIzELUBB4iZ22Mudcd/LhEZo0wwl6LMdD7KBNAebrw6Qya9zub2O sGwZS7ZP6oyW4cxwN1jUMergDLWIsXHOQ/jhTMZWHSbczaCkoJfYaG1YS/lvKcHIYjp1z04Famd5 mBvTw2wOEyNlt48J2udS3nzl+vSFT789XbsuGErgE6RWYFzyPY3HLMClzL232NCgNQ1MOUB38ueT lEw0ORok8s00Jd0ID/tyjAKqh+xwVUdygimOdhiukTxwFKT4stWaEFQHtQ4idBYcrnWl3UyPy0PF nS5FZuaxVtL8yJAICB0ysoQOf0n5novkRAkzayxYW1beT4Chs38uk/GUOxbCc/SAlasxiwSSHNJi DNizfI/TwPvGhxLsHD8M9YPTwTnL+8/lwHt2nF51OHO/AuZzyk6b23JwToPuDDSUDnQOTU4nVBQN AXf1WX6ANHiRutxPUYe8nswSPuGLFzGiJWKPLFQpqQ4u3zsL4jUUADRY5X3QN3Cr8nPb6XiHEDAO x3neB0rw0F+oaJBnydAou2Zf5r4lINuRYbpy/XLW5TjcW4Ekh4yHTne3jcyteEmODmPknh0q1ab0 KsBOAw3+6e07D6Zvfffd6Xvf/2B6KU7i5cgCSS2PU35letF/dGljuhzGGBisoLQGLcLrGqoNQyoP V/VB0FiB+c6rL9VI3wlC/r0kdZBbwfPnIj/01utv9Ll/7offzP7b7j1SiRhoaQxFp3MJmjXQ+TNn U2XvMQ0MbDwzEE7VsyBeXq907/vLqeA4u4eBMFSDrMG8cl6DPXZnVAUukNCDrDqUjR74aH/Ii5Qp yVBlE7cZF/I96xbXiT4Mcd4/Z64JhtK1smFxBIpDNJLxC8/qbAQCJnNRHvAc8Z3vP9pNM+VhzwvH YE96H/zOO0G+Lz4eA4fsy3XGPIglagL7UsQ2P3McJIXW8qPwrXeCnF3OeaVH7XmQ8lsOSqqs+SRB zPfD54R8Xs3rcDIhHSpBjLOGMoj/YvZV+dHhwD5MUP4gyJNA4lpoPp+P1OfnP/9OUUe8VYMNBGMq M9Dtdto3oByBXwe5cFCz81A7gjfIqTsigjdOQFDa2M+zGP+N4Gk0cp9k4plA+ZIJnc6bslkeEQWG BmJJDBuY1Yl65UhwegbjG86b9zSKdR8V9R02eTz48duINTX0QW9nnMI4asmmoUlt1ONEBMH+PEN1 BmAw3rDIM0QttlJSfz7uubtKabWB+PA7PnNeUxSkPpurpVeBkARvFlxJtKhK8AtL2R8CCmV2jpwC DT/ivQWsbOhqgsuOqZ59kMDaenmVKpn9DX1vAm6ls27PWpFzsBp+j2dapGpQR84DoU7s9N+sobC+ qwo9o4cGACQpxm92XWdJkKwVIMU7t2IpsJAYC8g1dnvm0Lr604HKVckl1y2Bo2FPn757p7zQMRHX V9e7Eaq1p6YTv5mzVhUYQWuplDkLeV/o/0aa/4EZQ5oQxWYmNhD/+NJrm/l6bfrcp9+IX70ce3s4 ffPr30uV+Pa0efms05k3oxO+FF/w+svR0n77lelK+pdeCaCEH72O411ALNXd7B8VRUgtF69R7WQ2 YewCPhnjl7VUZdEA3QRUkFckcsQfoxk2NiFB8atvvjIa2wVOMeylhRAgyDY/Qg+SkJa6IyHRNB3k vc/yQm2u6haZv4WAGCpN1Tru/hgKYAsLY3KzeQI42WQq5xpdj9eMyGXs9yaW+c69gCZf+86H05e+ /IMEoyb26uFI8pF/3Az19kZilE8mRgEYsS9NmAFO8ZM0zTvJsHZB/5sej/hn+w71s2d/fL6fFey2 ny22QqOo2EAyFZiwA3oqFVpQxCCq+HrOKhcioMyPtoIs+N5kh4NgjImzmnSHIpLExfRiPuFEw6yB SJ0KPU71as6LavJ6bGPeaiC76E15xmIfyiJruGuxQ3tJJL713VsFk37ypz49ff6HPxaKYbj81E0i SYlTDjQVP3SQHMosX9bgetA1OsynQaNPZ4fETnmaTeAHo8KJwhLwE8/EBvHRY+CPmQBsyWhIVYH2 nmhhK/oIVZ0/Mn0+ZzxjseKwaT5DUD545oMOoto4FEsoZbVujBJS1TSXKZAvdWQgbM9MIMl3Kjdk U3vvhr1BK3F5zg1gvgtVbuaQb0Lr6qRl0ErMnMksYGrgNjO4lTyaWfBRspxt0tnF+Zv3lCk4TPsZ PU6RYHCRok+txPViqH6c5UC8lwEBhwkUBZ7byYI4sP2DNIs9ehQZLs1lkTEKB/vW/aCUeT9jipWO Sd7RSZ7P4dasxTFeD+fvLNy073zn1vRukLTPzb+eHaR/V6kmZzo39yxSa40zlN815c3Kt+6Jgyod Ib86MCCL63uCxVJtTKnLGz1P9lVEN8EPwXZOWOlFIGCdLocjvCjA1XGdDUaBYRlykxK516r0V+c7 z+AkfzeYAecOKgbRmdOxzqjnBimeGA9KOodSgmwcF/ZiSkDnDZAO7HYCSw0KuHpGyxY5iIHBaRY4 QrKPspFPUrZZbWY/vO65IgwHQiJJwIOLrgzVMjTOVja4gN8zhB5BKBZMRmyjlaaDoL9BAx1kDvNF jCE9TUjr6mZK+aEsQTmgoGst4TvAQQDz2uWLm0XkDEw4NAbWgIbv3ZmmH9yLwUNvGtMJSbDNZ7LX UoKCu3ndMVRdo0rumULK46wf3vWPfv7toJDXa1w//omb0wcfGvSQ901QJVlgpK+EasL5KzfjVZ/l OZOv20jV4pQKTJCcgzxPEnsmntnz1tw+fpFnRGLqrTevT5/97JsdG301CPxr0WHfyfedIRUUCHbD KQdZg60GtuwNwbIJbM3AJXkjI61Eat0GQ98Ae5Slii7EATrt6AM12nFyi7mmJr1Z/6Us0kdB3Xlg ZIfTfM35aMczClZVfI7DjbzcRAj38OE95c0EytnXT3JvgkcNQAtq24xirvFO9jVNU6gyQ2kgFVTV mGXI73wc3B7eaD7PsKPP/9DbefZz0/czBteYeraEE9JwtKsiBHnPPi+1JfehSVfzIJURDTwqRL7H EX8Yzd75dx9G0tJ0zNXpRppFIdkSzZvbV6ZXLl1NA+R2ON6h/GSP/CDn/kXQeckL3ihObykAu4vT D1IduxUqymYahH44aPWP//DHp89mPO9J9s03v/N+UHZNbAZVCfpSas9naV6liT8IdhLYoQl+DkKU dpB9pcGShBajLDi5miSvkpeeap5j6RW5DgoUj4PaxaSU441m5UVbO1vtW4DyuEYccMHGTuhT1Xiu yUJ1GIGcfaWh1hmi6iIQajNOYaJupY/2HzuNdvIoIMaDh9HPTeAjOLFp2hhXma/s03NHNEPhz2cd uAs2xrRNMohFgrLvrmV9yp8mTeY12Y8+1Sjqx0YiCybsZjDQLMmzoSTv1Hm85zniZ389yrU1GMej rJ9xieGcxocsR7FJ5aKJZtbgepoHlxZiiwEGkuHYJtWXO7d3R8DKJqKeZd9A0ctR7/qOiuJAWYeb b5LruQa4EQC0Cbhl6iSaCR4M2Gm1s3X0IVWpBH32h5DzjsfOZ3o/FaUrl3dGcpbnw36q4pz3RCht d6gJIEZlsuddhcJbjCl/Q/t/jEn30C8l4dPo7szPcuSPaA385fHs8/lv18cmP00vRNr8GvCubm5N f+Wf/jPTD33urekb33w3COQHoVHtp3I6n0A6fOn0IV1LT8jlXLc9AYSR6rO9RcXjk55K6vUUtGJR zCj3OGKAUoZYLdRKez2+pulR7HXc5Egq0ZcoiOX9qIYsJ7FWrTo5Ds3KTILc++pmBAWy9z1n6mYP YleOsi8eJcB9ShUp31eyR8kjzdvhQewoSlYT0JFINmiMTdtKcqDqdTFUDs8OGDQCJ+DFkBxtEhS7 p/L2yJTL7F0zCzw7e+idj7+UaYNXp3feuDa98caNoOFRL4rPtnvw3ysgUSCNksWgFYofAHVD1CF2 KP+VHmLfmTcQsIWKEjUtymOVn5vR90ofzRkhMFARgzwE/PXlBLuoM2Qura1+d6DcbpIAwIY5DbZL m5DbzDemZZrgvJigGl/J2kjCND3uz4Jse1M18UYUrxaep7KH/511gUrPJbEy5OheGlcfJyb4eBKL H/rhT/be3vvgTiv7a7Elc5qQk3DikF/SF6UJH8uhMYYVHyyI8V/RzQI555OI/fxKviTqHTbHZ7Fz s4oXN1kZZlK+5YLbg+LcAf6OdIFdErQPaz37X/9cpNyaAM+yzzpnwJkv4ExRLXZF+aj7ZyQFTyWO SXVyHW4uToByQ76lsxaPduh9curJCmlJ5h9lA0P2aQRI1fHUKCCwnm2AapbO0Op2vY9PbSbectXs 18gUxwIWKc9riNr3Z5MtmFbHmQpGl+IUL+pg1qmcm7qfQ3M7maL3N3TBRoAOnoYucicaogs50Otp AqGJLbj5zru3p69FqNymfOONKx3DK1CElB8FmTWgZTGSQRQRHhJd93CCAJ+GJ2kNyyEk3TVzlAqz kCmOnHFkAJD6rYMhGXhd1aFWBsy/CaQ05j0L2gy1hTQeeWhxOBfivY6C1HlQ1/M6cZADtpLDZHoX U36We09Br8L6A0EaI1vxWh0gGpM2q8M6Nsd5OXaMstW/0RGfOXAOXRVFGLw8X2Ug5S2NK56WUako CaZwQYehkQfH0cDM13KqCWuSn7xns+9UB1RF5vOM8LY9rzFC1NSyoCF5z8Uc7FUSUC3PozXMJK8g 17l3SBZsU+c6/nCD7LzPlNKaUtVa+HlrCbQNRoA67sQ4GiDDIbaMfCcd/U/3Ur5P1tzgfoy73k5W LZM9g/SEfgGtPaJjGy7k5etZkNCEfnDvwXQ3gdO308RjQt6f+ROfm774xehtLnxi+sa335++nmD9 QZ7Re7ceTQfZ928k+BYQU/9w/0pRi8tjVDcZKFm64BFVQ/f7ZuhJL1+90imLN1+/Pr3y8pXp5Zs7 01tvv1yOqX1PiUeCcBbDeRC09EIUXSQ8gta10KKWk/QxsnscRwyhxpL2LeORtgF4lLpHt1/xsO4B nHud9E6c0plgzmCRNpOVxzi6xD8yJrNSVhEDtmAUTnL2QmWJGsbf+Bv/1fQ7X/peAznowijXD2UZ qOTH37k+/ak/88PTj//E2+UOvhcVg7/5f/356bd+89vTF77w1vRv/Ot/Pg4nY419tjfP+9y/dzj9 9f/L35t++Ze/MX32069O/7v/7T+fARyvTn/7v/zy9O/9e/9w5nzRjoYcm+DU2Sg9J46II/wn/uSn ooiwlarT/emXf/V7DcTFEUbSt7kTgpc9TmVjJ/vo9Ve3ph/65PWos2zFyO9O/9nf/+qYsDrAs+HY mVz2Cr0jn6vKQAr0z/3c56ef/ZmUdz/7dpOO/+f/6xen/+Q//eXp+9/LdM04KuiqqsWNNGv9xE98 bPqzf+FH41BezzsO1Q3PsUFOfjVgyFn72lfen/76X//bCfT3pj/5pz83/bV/9S9MOwlYxgRJgz4g 8k+n/+g/zGf9x/9tztLq9K/9L35u+pk/8dmiWs6WKtGv/urXp//j/+E/mz4IbQUv/U/96R+Z/tq/ 9heyB6kyGWwzKliP0pD5N//G35l++Re/On08zv/f/Df/6vT2WzeaVMwurNdW+kKc636Shv/bv/tf T//5f/4r5c3+G//Ln5s+n36E0V3PSXFZ+XOR3bEHm/TlNyjYboKbf/vf/rvTL/3SN1pGfSPJ5f/q f/3fS7D2epu+m0TMqmf/+Je+Pv3f/51f6LP1HPw+wtgRPFJseePNa9MXf/pT00/9kY9PC1GV+LVf /8b0b/2f/07pQOdT7Iq+sZtKwL2u2Kt8liExf+1//nPTP/nnf7QVk1YUsn9/7Ve+PP2Nv/5fVL+c ffrn/vmfmf6H/+KfiB3pNh9JgcMwXNn4JSji/LMGUHNBX5M/Z03wmPUeCOxAX3HN+dLmxOhs7q/R 7iyAgCZnT2mAa79RfO18/N1+6AnVOkedydel+QALQVxLbWlQPSrDo08CkIEBMKa3ysidmXNq0KDR jXOLg24Mu6BmZSFKK+2xcVtDHcx9GLENGUcD+fznf3j63Oe/MP1c7OzBwcP8m8Qq1bEE6INDPgbN eA7jep0862cvBbCJP15otRTCSEqPktEIUi3q8wAirajoDOtTnwUs7il+mm6xlapSjSQKEATkAwZl 3dbSvCoI2kRrzH5/Oe+5h9rx8HFnQ7z7wf2h1BT1LdQ2VbxSEnMTei6AbOyxfcI8vf7y1enjH4ud ePXV2O/1sa9dl+ttUCBGUu0dPROqCp8OVU4TsuTnteiHv/XGzQwFSyU8DZyPU5F798P7rYad97NU XpA19175ftH5mf0u/S/PqZUstmiG5PpetyTQhJ2HpOY14fe2N4H4xHq4+JfsF7FTfOFW/Ikm+GMU HAG4hGUufj3PEv3lUX4/xDE3Z6HVziTAAYwux17iKLVqBJl1rbOEn/b9C7Ee3w38jF1+ipqFWhcf R4r4YZLb3fi261Gs2b5ypRKPQAL79frN60nMMvAnz64Umvz8mCKMr+2eZ/unIfWwx+IDj6H9J/o1 WhE0yAptMvFHnjOKsuGEeqwagOdeVWnEls5hZbLyGn4M+g9xHyd7Zr/GKR+wcl7eZAMQlXV1llSk Kh85853OqQqqnrNhBu0jbBA9baWEjAPoF4PWxZQJC7dm3OmWGJWtGhTLIjntEeRpdmrjjYUXUFsI llTgXGMymqn+ALEem7QLOAuuxwbKzebzIb0V4w/yRs90I5vbxnkQ5OZLX/vO9Htf+34nL33uU6/G YY5pkR3Nmp+7vr1T0v1qFuOzCchejWam4GxfCT8L85l3bk6ffPtGeUV3o04gIPt+ELarkOp87aFp 5M7X4+DuZ5Ts8wSNbRqbZYh1BkyjzSSjgxDiFiGyyzjDP3LwOtEq92fzQQ6P48CVaZRSmda9ODkb HbKmyxlaeElKicaS76NU4jTX9mbNGUFNZHiHHVKR6xE0oF5wguSKFlkaPJhwmp9o2MAlTNODCs2a hr48K1jaWl5/OwHDg5TSjEivHJGgUHBdpHI4fiV4VQP30eAGIunQK8WFjyBLlfK+SOAtW7c2HKCm o+lJSrY5qLirmj/vnx1UH9zBJgVXREcCkeeHu97SL8k4HHic2xxCgdKdNPudvHu/xlb5diVDPVbW ISTQ/yG2vxJpprfffjXlxzHx04E6n6hJ3/YC2aas336a4B4maGdoKHX8fvQ2f/4XfnP60m9/c/rF X/1yjN+d6Yc//+b02U+83EaOt4I2vLUQBOFZxO5zPdejBHEtjTpGld8L0nWS0rTETue6dbn28vUk dUtFSl+OdNrNdMK/FENzORrOi7lHp0Ep+SgyQY/vHHTNnQkd/ZcThG9dzZNmKItUj8ENnDCeuirS +LvOfPxb52UYgEsC7M7cHVm48bp0EIYzGM1Wg/86mqvwgVGKGJjzkhtH2Y7zOgznW/d7+P5JED5I NeArKXd+++vfzDuEqlW+5DjXYzLhyfT7WcNf/ZXvTH/tX/9z01/5yz9RrffvfPtWFHy+M31fs1pK cFfD19R57RnhXKqMfOtbqS69/62e5+M2sz0PR+/B9I2vfn8YuSTyOORF5Eco1s/NCUtQcGX62T/x I9M/+bOfnf79/+AfT//F3/79IME67yO/WO1ZyVv2Zs7V/t6joJP3k2Tfmb7z3oPpj/2RN6cPb+1N 33/vYZ3xqKr5sm4jwHaTLdsKEILg/FAoPG9/7JXpg9iNf/9v/fL0t/7WfxsEny6rYVjhbsb+SOC/ evfu9NXf+/b0S7/8telf+p/+6eln/+RnY2g/8s99LlXEycdcSbKmGvXBu9+a/sEvXJj+0l/6YqhB myPArAOfsh73p1/4+d+afvDdr08vv/GJOM9UC2LLgA3Q8eMkgL/4i1+efvkf/Q4L3i+O5a/+1T82 fSpJy7MXzuHMKcVmfSvo4wff/0ZLnWgw+D2lNswSY/ctSe6o47zbu6kk3PrBN6PIARkUpKZRmBTj jPbn9W0jquezMQblQdL9/d9/MP29v/s7071bt7quP/juB9Of+ie/MH3uC6FC5XOde309Vv7uvf3p m33uSrChcyiVd8dzJXTsn0xf/t1vTP/oH/z+9C/8Sz87/U/+5T9dh3db0JJ/k8RYM8nk+DmNvYPn q99iOdJern8+e+okFI36jey5f/ALvzv93m99dfbcT6df+K/Wpz/zZ78Q3vB2bbwgtcGqa9DZXiUV QdHQyB6Sa8Pv9VpzTaq7XHTnN0hUYy+psQgmGywqVY/oePhIO5qzp6aB6gJoyu9oUZIQCZIkC+2E VnMrulUp8R6DrtIznORbACqRaLCS93CNQB/BHHR5DMQZKlyq0kAPQbqQu6oo+XmDj1A4SJA+fPig QTK7rblvPqoODURDFdHLZEDL2Vn8TWmK6T0pL3cMWOMuoKIRBcr66LnJ3Yoj0GV6jiGCJu8SPMi9 pIHQMjofjQ0aRA1U3ip5DkMijj67+6X7PRQcGncIzmjfBwVdXV5PxepGz/GnPrGf+4hUZ8C3u6lS qWQ/mVUGxCYb6eFA23IvbdAXPGlmk2g2SZIUD2Br9Bc4TwPx9OeXQp15OX6Iqk0VfqqINfoF7t57 mBkD3hMARsovFVR8a4DczOp0AaxFXg8dvXQpFaicT6AVvyEB2KXPnTP1SqiDplxC2AWiGp1RwXCv veaQdHKulb8/TNVbNRX1lMa0ZuS1JOhAtqOAX4b4iFGuJFZaCbinH+NxAu47+TeIc1HaXA8KUoGb PIZO6hUQJ6YRg5w+SnNraKdzeXaref3FxFMPcn/fi5IWW7mdapwK8W564C4noH45MdnWdvZQzoDK rwyFKMHz+MW5JFn+k1d3SRonOs2C79GEXSURVXw2RqIgw1Fx8UNdRvMmsr75XqkjpVXOqMosDYAS kaTu0n0NG1Nu9uzXiLtG/xFgE50K+87nCcfFvJ7dOa16AMfDf/pZPW9zbRYo73qod7SZzsbPf8rG DuUoYY4I3i+vRTLnh4ahsNrDqLR5pmsyDOb5774HvT7fTSOYHpyZNlVCYvGjIE9xppyGwFrgwUi8 mwf15W/9YPr6tz6sKsgnk1VeTbDjNXi5UKHn4Zb6ZdIZiommgPkr89OnP04cn+LIyfTmy9eyuRIM J8PVzXz73nJ1p3dCydi8uj49QtNIMAhxvJuGq8MYj/IAde9q4pEoqMnLNPMFKdDUNu9py1xqAAbq dX5vXne0G6NsMEnuVTllL/JtEM2t8ISvJ0u0Gebzb4nXRtevQ4qXlfsxBtiXg7ebn1N+tg9wyZQO l7PLAkqNg5nDtJJ/fBaHe5LS2lKCgmc0vKFImkAalOSaVWnz3Iru5bG0Mc/VN14eVBZNY8aAzzGC s1KNwNlelggJnCUepxB42aAmohnYBCnEnbZJINTvvZ/g5l4qAXkf/NY2NuWaXrrxYtpWEoSikN1L 6Z1G8cXw4Oc0wGUqmWEndKhRCO59K7qyMVoa6j75iVemNz4RTmCyYE0wo2yT8lfW5XmGwTDueUIN HvJhqSjks2Osl4PqfjI/88Wf/HxKd69M/9+/9+sJTL40ffWr355+8IMPpt/7+KvTj8b5vxb04vmZ 4UF5XpEzvJWAej9/piNabfI8z60ERz/5Rz4bZxSJp1z7VdPF8jx1wHt25Q7m61FKqU/CBedMVAQ4 bRJqL0fZ5uaN60XBz6duQdFpX+OLR6CgGToO4070YJW+Hkv6anTOM3kB+VAM8CvFuxjaoBGnWSul wGrUkh4bVIQXSY5Mp5I4Ccx7LHNeihrUYYyGVXsOdUCjHIQPVoKH/q/+K//U9HICD43NktNf+bVv T3//7/xWAsT3pv/wb/3j6cfTtILOY1pcoI++32FKuAeHaUBDb4oKjYBhP0jD4IuPRk2ygkdKvTVU ktKF6ef+0o9Nf+Sn32lwgUdrnPtxUCAmcScSXj/xo2+lmTgd8voYhrWcfvqnPz792T/zmZnzG3zn 73//3vT/+c9/I1rBt4LuHkQm8GZ+9uPT669dTyUs5VwOJbSQ73zrQXiGQUGzd//4z3xi+mN/9JNN Kr3v5z73RisU/+l/+uvTv/vv/HzH8169/tL0F/7yj+eeP5bEeqn0gv/m5393+oX/8kvTt776nenf /bdfBMnenH7yRz8WmzNQEvYVunch93I53fE/9Uc+maDxO9OtBIlf+eq704/8yJs9k87Y03iyr3zl vQTEH7IEWYvPTJ/+zOt5NvRjSWstR8Xl/vSbv/YNpn762Kc+Nj2MPftBqi6/8RvfmD7+yVf6XAVO tcFFcjzL2PasS4OWEQ8Puz37//J9BY7ZIyPIpehgIFBsU/4uCW4AkmcLrSz9jc2S/OSrVMPcxK// 2rcSWD9Ms9uNUlW+9Y1vT7/+q9+c/spf/ana+NEX4FOHRr8mX3/983/5i9Of+Cc+O/Zmvpzrr2Tw xN//278xPbh3a/p//8e/NP30H/t0KiXvTP+b//3/YFQycl238ln/wd/6xem977073Xzlpelf/lf+ 3HQ9SS6KyKUE1T+S5wAo6H7P/RhB/mtB/SVxr771ynQ3dMOvfuV7eQ7vR8r1ShWXAALnvQ4NgGZO WLDIy0GVzxLQKG+f692q9lpaleCxqBqdhdPS5JG0tAblD7WvY8jHs7Mg6oADUmuoLtS8wv0dflql Kz1F+3sN6FQoKkHKh/bLWdZ/wPel4jVL0Bv0598kxSqchsCp6iYmDftCvwWQJsE0SkH0Sp3DTiyc +XI3okILwKIf3PJ7/g1P9uaNV4J+Pgllabd2yl0JxvgFn6lx/RxldF8oFf7pnH9vLcs712woyJcM de/POLe5T0EURLL7t0UvmwL6LahMEAq0akAygnIJG01nDXKmlm5tbcbXXw4Qtz29ESRaz8DjyN39 5u98bfpq9PKBVjdSBYEwqzZKbDqsKbxrDl5CUDoBf4lKnERpiDeghojV2MuxTwqgoG6EV+6xV8fa unqf9P5UnQbVLfaZUsaozrC/48ysJMHYTyCqaZo/p+DC9j1QGQ0KjNO+k2puz+Ks3+Ri4olTNM58 mUR6kJhlKZ8jLmJv+VMD88w04eU7nwT1FNUhn2G4jx6slYBC+OoPU9V5jMJn7kOC+eBz9YGUggAy qnmnCZr9mfzs66HZ3Mw1rWbdjrMO90ibxl/fDZB1SPs8IN/lBPSvB9i8cfNG4or1QUFSoc59t7cu HZDUwV7MgmtKQDOz2/P2XHzltOVerFknMbJ4ub8nSZA98zZAC83EAHlQ0OzGN+JXYAbflj+3QpJr td6DkjYanItss4X2mS3WhC7nC5B6TvGF1gvonQlWEW1M03EnmQ5lpwbsgusaimZif6ASADnjvJUc bDTB9JhOpMFkBMzCvkbvric3/hHPbnTi1Ih3kMFHdTSZyMhK/jCCPTIHMDv0h7C3OxsDYTaDqrqJ W3mQX/76u5EG+k6QzpXpiyHFv/3atenmtWt1Movzowvf4YTmLEY+iQTWvfCtNYQ5mDJL94QziFqC auFQC4i2sqmMTEZ1eS9ybPd0bMfwL4UXepTsnEZ3A0dLlYfVoQ2uWnIwQ/kpnbgP6ILgt5QQmWsW HdLM9TP+/bc8fCUgzX6uYSP3naJxyPGZUKihwgPKtaJKQCMEKYKQYyj6jHagSWEVTUSgRM5vFJia WbVJJY2aHgWFDo22G0GUBahPgzhByhyEJ4xBNp2fN7mx8m463xPcMZN1dvnF6B+Go3UchRLUFlq0 EIVWPOydsFrImAlmTTOEei3hYeW+WB98tc3wSV/kulAKoC7Qctzs3dzPk5TqDlNWx5NegcAnMFXK ITR/OcjvVrh99oVM90I0MOdrMPOVbHszB/ti/q7Z84hR0ESS/WrYy9Pn4aPrlM/PLeXnmF/6noK2 9yLnhP7wavbR//h/9OenP/snfmz68u/8/vT1aLwyLI/C331xazf7/2nH8L7x1s2UNTV2JSC+cWV6 89XL5YdzaJBEz6zjgU3fi0ESYAiQn+WZQc04M418DAmOPMOvoWgz1A8H8gjikGCzhxlSohrUcu84 i4LlR+HstRkUoij6+qhRdBjnc8qBMpn0GP2iwvskqNq8NqZSdVQ8x6w5sj5wJE8dUHQeYOf7JKNe RFMV0j1MmeaTpelP/clPT59O0Ka5DFr7s3/2R6rC8o/+/q9M3/zmh9M3v/V+6B3XR1Oen8z/RtO0 sz+SKuiavTGGpYx3b+OSBK/bDnJ/YfrRH39r+mf+2S92WIuAhcM+oL/q3vI+0KCHoeMMmtIIDV95 bTv0nreLhnNAutoFKz7mb/7Nv5+1TjCdZOmv/MUfS6n7rfIGjxIgfvc7t6d/69/6helbX/9BHO21 6V/8F/7o9Ef/+KeqRuTwQ6O+FeT77/3d309gvRebcWX6n/1rf276p/+ZL57b5+6BH0ugLbn4L/6T fzx9/5vvT//13//d6fNRWEEXGo2oI3B1j/S2fzgB3/XsqTu3P5i+9FvfnX7uL/5EA3UvQTX4vchY HURjfS1TRX/qi5+stBdnQfJNEvT1BN6/9zvfbmnyL/3ln5p+73e/N/383/3HRXj/4s99sXrCzzPF repOhjAwKizYrJo4TPR4Do2JfDA0Optj5sO6rn0VOBNylEY0lcoyIYuyE7dTmh5BCHt4P+X3f/QP fy8/dZpA+DMN9P9P//sfTL/xq99IkH1n+sKPvD4qJ+OdP/oM7u2Hksj89/+ZPzpog4muXDP6leDs P/p//FeRY3swfTtVjy9+8Z2s14/1WqzHV1ON+nt/50sJrsN7TdL1T/25H8tAsWtB40K5MhI+e45E nU+j2f27v/296Xs581cyrOif/ef+eJ7Vr0+//Ru/GzrTt6Y/9jOfrs68s4tf3cZRib996w/jf730 gTbbY4OyBjluA1554ANIOqeQD98xQyrtLO+XR6JCQzC3yN2scjES3sEP7fhqKG7d8GjIdH6GRC4k HsI6yuqjmTW2TlAuuIC3dS3Z+FGFBDqUimcaXt5DcOCBD/WNgchSgWLLxmdADtGxSNMNuoeGd9d9 eSc9MXi9rRDTth6UUYmXVZIcqLj1jFYEZnDtVR8F/AOJR+2YcbC78cZ+HEpjHIBgNp+vssK4eA1a I/vFAzb4U7XMvwkIyb62OW9QtvrMEwzxfezCj0W9463Q0BrY85u5j7WV9XLfu5/1N82a7Kug5DrY sRndaFwflQ50lhHEjThKYIjmMXSkGwjm4Rdsm6H1Lsa5QUPhX4E1HS4VlOxx/PRc4hPNtq5db9l9 PSfxAVX4yD2MuAqCKnAXB4yGc+fuSfzRduzHLG+u+sxukst7odOeJaCXAhswJ8DeT9ANMDhOkrl0 J70JQbL50U5sFK/kenHw2YKlqMiYI+B5V+I0gNaVABwUky7fuJrKf5rWgW/2Wu75dbKSQCR9UwGH KLOo4vN/7U/ofh0DlVql6FMc6jx98DOgh+1tQ6e9UH81wCR72H4TswyKV+LR/Lt4Vdw6/yIV8gbi +vZmie2sslBAeBY8n9u//u5RiV9ngfZ5H5OqWWOZGYDQ+C2vlTy7ctSWxmLiXnGKSjMoHdm/F9AS 0oCkS/HwIhah2dU5t2tE+XWKuTnGygFhgIaRHQG0g2w9KFbU8Ijw8x8jNbSJR3mFmbpQnvfzOJcH 5f6S81ku/zojjlPG+eXf+lp+3wsquDH9xI+8Pf34j4ypVfejIPBoL06uDiOUgWRHF+OM5hz+LGZH NCuxhHdErN79HAQZ28+X0a8M9pXtlL2uh1ssSI4h5Ea/8b33pp88+MS0kRLGWdQe3L2GnKGFaJxx ArxkoQwHROMgGeVeDDaKRSclKpEmeNFNXYpDHDGxdLTY+7kP462X8tlLMtM0GBKqJxmFz7uu4z8H yoRIxmlQMgjBD67r8wR9gu6LL0KX2UwQ6tNyDdG+bwPOchtUl9PQQQKMATZyPQfh8sq09/TB9O77 DxNIJHiOVFLeqjKCZL3ICdGoxAO/mD3QIQ055AfZNE9w/3JPfMdLQfchmh6uJr8iOrh2CXgY4pZz 8rlb2RcLbXgISoQDmetYp5OapkD6pnjtGkEE0RCgh0E+9oNS7+be1wPXrkdJAlJJM3UzP+cgGHG/ k0PMuzy+dy/PPg2EuNYzvVIG/Hn0O3WBX8oeIDE1V7RgpiqQz1rbwse8mOmB98PPf9hKxtuvvzx9 Kgj2F8OT/fDW/Ui1RQeb/FgChYMgAYBvQajpYvYdjuuVXJ+9Rc8aj45jFzhDC0hmCXC30pTisyRa y2krpvaxnO/dCddbI8n16zdTpszziDFba5Na5BxnTqdSblVDEWQGNfz/kfUfgJqeV3ku/EyfPXvv 6b1KGpVRL5ZcJNtyw71gbLCBmF6SkITAIeSckwM/AXKSEEIglNBMx8a9yrjJVrWs3nsbjUbTe+9z rutez7tH5N/yeGbv/X3v975PWc9a97rXvRh7iydEQSqFrPyYCSuLsotuY0vfOv0ZezliHpL6tlwz ZAENDymyHBIikp0vKIowpL0HRM+9q6Y3uBDcTJ3wCprdu3tYmy8RuJowG5tMK/dlc0n1LYyNEBU6 xJrJYq+8Xop/J7PGeJq23xa0p6xKd2411J2+4aFk8auyWUFK+5eHpR0lk/aWrqR28ZxC/6PGwT0p ydUbZfguEbo5qHlU0ys+k3GcjQ0Yn2ca1XxitRO2g9k07neeBzT/zSdYW7LkPpzr58PRPvuc5eF3 HqG5hEH1ZApZn12/s70ITcaxuOLqte173nE58pZ0F0N5RPvpAT1KkeU733tVu+3Wx9rOzZtw4Na3 LfD2V8HDTNEU9+BhoDMmynXRhSva5di1r39lY3vwgefaRmgrV6Ac4xxv2ril3U9HWQtk1l28Ckf8 nAS9aSokIssevPfup0AOd7bVZ69p10ORsV33jV/9Dsj10+059NOvuebcGivXgDY6QUgFOtNBOKei i19UoEKGyl/U3mtd5IGW45vzLkWA2FdSX4Pk1JiIUZyGso86g3IUn3zimfbg/c/xnhlxri++ZE37 2F99o216cWM43+esXRQbd9o6EG1EAq2+ZpKZcUnZHMkgaUpbwXOtoG6h7qekwqbTCMW1qiM0g2eZ gxxnJCBzVOP8MT4bQaOP0VjLPWp9SfTeVUIAMLid+ziFbOeqc9a1d733mraVebzv7vvbXXSRe+lD 17VLCL5OHh0KCKvoSVQrI5jzXnCjVHac03ymqC8HfKl7qDeNA6pHrLoW4++9pvNe5sDsFqjxRPa3 Cu2SrNZBducKlwbgrHkwrR/w3DGKKhSfC+Lcc8XZywYCOsNHAXYGMMixLqm2ajjluWtQmRoOnXhV j+x/0J1eHWwBjfpkn6y6fIZCkuBL4MhW4ChuiHxjB9MR9zTnHut6OAuCUOr88/44+KCT0ifMitsx L4iwllIAQOdeTqv71J9zfbPo0TN3Vhmc4zQAqy6Hqmz4/sQxGS9tvfOvc2QtlVKG2qXBPznOeEwm G+nAL6C4dTHqYPLhnZMEHewT97OZZO24Y+CYafesT3JP6hCn5JbvzeDEUbPg0Eyz9lYXMbbWhWLN BmexvpV9P8ws8NqZyOOOAgDuwendzR+XrPcdXr4gXoCIKm7UsVTT33NHAQeb+KVIT9vItZTFW4rN 0w9zDbqextgrk6Qi6ccJtKRniPfrM8lZNqugqta29uAjT5HBsQkX7eppoX7hgpUE+/PaPJgBsQs8 k3Z6/ty5+BycU5yDIrYqMNmrY2YajHXVDQNQ7GsiwCmc2yKS6pnpCDMcR+iZoLSx0oVTaDRmxkga UhrCkLUy2B6KGUMh0rnvwExQfl9nNljfVFuTrJxUjfi+2ZRpPNgb+sCxzTnpHnBMbQao/ZQaWu/X lanV7VnhXnD9Sy86qQwac2Cmz+610enXdxWkUg4y4Jdqca4Jznzmd5r2IQExwbDUieoiVYiGize6 j0LmfoBGOfau0ofZaPUUWczpNBbtSJyRpEsqXe3vK8LvHGwHVEeQDaizGPTYaNKJ4z+lt6yk9TVW ufuQOjm7+KNDfhUKCwvQrl4EF9pFqFP9HJJmFrXZctgBNFoxlXqIrksOZqrLGcjDpNpiCXmO/TjL Oyl8HF28IIUhkt/VfF6/cS8NP1gsHIxPrt/cHgGBu5wqX4sp9+AQy1lyBnTi0yVK51jOGmouNpc4 gcN8/DiTAGG+VEIqPWr1rpN2EL6i/oa0Fx2wUdN+jJXcaIX5T6lNLFotchzEg3snENRA6lRbICgC PpL0FA/Cv5XikqIS5J+fu2DsFqZu60EQat87Tfk6/j3CwpUXvQNKwxQCgMUaR8ZfXdBJFI+OpbEA DiTjZYWxlfsn7FBkUeApmrrw+dN22lxjpK3iOVTOSLWvRoNn1cnUMbNzpHI8drk6RHpoN46YzvV+ Wuja1OW8dSvaCpA320GbmpmjcDwGcgmprP1E1hbwKOE0FyfexTEKumtaVB1Jec1mJjR2rgv5YjFg MfhG0zbmoavWCM1DZlKxPKskDt11prtEOqPgwLjPVU7Orc+btsKJ2226m+svIcOxGtmkkplkTBk7 X1dUmNxSR/VEFTTcjA//KXkVQyZnms9RKWB8bE4+yzU63dbzcM7C/bIZkk0ZqA9wHYukTjPCV/JM YxH0plDduLRucKuduQl5sFYjmxo1Us/NZZMXxzXpfDuMGWX3vSeiFMPUEUYdZdVjeLQcYkF8CH76 9s6YRCnDFJg875RP1J42lW4AmTQy9yg6/OzT8Jif3uLRF6rTEg6sQYd5OJjjwPuKbEOddWkelfqu gEDEvn7fyS5xCO/4ztO5Lw1Y1rloHf+y9mDdumXIOxFoSzMStehozsA5PXBQtQKLZE+A7j7fbrr5 8bSvnoYTdhZ722Pbg007JJIij7gQZYvhSI+CiC88MS+ok2N4mAPqOegWchWd9/MvXI5KwUxQIb43 XS39hjmzW+DylfP5jEU415spVtxL1fy+tu685dnDVbTN4Y/t2YvdW4J6xjWvPB86yT3wmzeHGqJz 7dw89dSW9ujDG3i2Ge1Vr74ApG1J1pQ0uL3sma/f9HD7xtfuzRieC51p3YUrY58WLF5EXcD2dsft j1NceX5spunh0mbOosmwpziUPzHx/aAplRIP6ZJ0TEfPrCWzQaV+IdJm4blrc6A+yEHO4ReQZlK7 /dZHkc/c3ZaRin/FNRe0s89e1C5CdWLTSy+0225+qL2VwGQedkSNaIuQK4taK0ZVgt2gzV57Bk6I 58UT9CH4Ls+DxcUuzKfAcmEoZgbnJ1GzCV1RhLGOqaxri20tClU1ydPIVPEIRYPa/YdoHnZvApep BCAXoN9+DlmHde2TH5sXzv8TUEOuvOqCCt5A6mtP1uqMYx3nqTK8lZV1qRQCm7hWZ5vfJyDm0Y7r JLuHnP+oo1Ukk79CzSwqRMnxdWCt7+F8nvPg/nGNJtXtOdrBLOfQ9zthvD8UneytQsbd04WIy61X zk9nrygtadndMzvWUWlMIjEXpLWcFp1h/47tCHJbygpm2BJAcEaJ5ulHmG7VYTJrKhghxVCUlJEp 59rVxrW0OZEV1LWWlhrnRTNV1Mus1yJTV8DNs6elm/fRx0L7Hj9Fq9LnQ/BApzrOaTJ/zpcOcM1/ N6qR3x1kdVNY77MRbNgnoa7v3MpHL2UcC8DjvDLGKs1of49NBR3Xocqa1yfyTkTJVT4p0C++Um66 5sJ1EVoHv1P9SNvmuk2zNHwoM2QisGaUHWdtaj6D9yrRtwTlrACV2FDvx+L3UXwRldRmEtyMqO7G ej9FVsEzWfBr5iybKpFNicJ+0TXz5/Satnbd6tgnfRQpRfM445XlG4lksM+BL+j68E+Crf5+wUbu X/R+EtnZ06FHSQPi3GXcpgKSGTgdw4mP88u57jxof10Nk8hIaScC5yZbWf5iwmJr/bJWas/5lTPI tWBAGe67a7PG2f2hbdKJCZgm0Ja1Xii3gKfrSnEK90dkDvO51Uym6njqjPcRp7i/9E95/wjggFJt oYCFPu15Vdm/SHumRNGxMK6oQMrvoQT1SJQPl7IQTU7eK4FbozFFTkGZgIoScvh4sTNpaHlYZay7 JqHGI/B5XpmFUfrQVdDlIi7Uuha9ToSVuxfRstx2xla176D44IWXtrSdSsex+NLBCOcsxHIGZhco pxMgNSBOA5tBhEAea7p1MQHzIc2b6dpEdGb18xjvn0NqIpmpHJgavtoAFrrMISKbD1/27nuebN+4 6YF2yY++BXWKeZG8O6RzLGeO68k1lUfmop7BvcqrEnGOsgc0gAP7KtWTtsfK4jD6T5OudNFazDEq 3YYxsgDBtAtv5jqS+kHUlCAK5lxpxFMGPFkMxdMT0T+OPvMRDLWNS1TXmA6iJsorOS2ZSyY2GpSi xiIj/N7iDbmz8vR0brS7M/m34+oBtJCUj5HoOHz0mSyoAxQpjEPtEFnbxX1vxwE9AAJx/7Pb2nMU nC3i9Y6lbZl1LF3Is3iGEyxWVTlcuaflbc+Y3cbgWq6kwES1j2XLFxEd45SDQCZ9zM8nyY1nPSzF 0V7a19+geTnVLk+sEVP3p0CiRcL1dKfhPM+bOSfcraTV5JYxPqnABs1yDQ+d7TwMRIE9SPxMUTK7 Xh2XqM747yJ4kpKhHrL6xbN5rl1opRuMzCfdOQpHzIh/N+h6ITUEBemaWA7VNHiCqtLsI3BT8sdi Wj9rx86dKaI1szBnnIJSW9RrdnX2uc4W1qXOvjSYSHzpvFAcqLF1f6g4EsS5Z4SCjLmHVFRx75CG EllQjik7NFSdOng19omsywQUGhIjUrtSutQBHEupKiJh0Srm0+I0RYFE9MemEx7iZdQ0qrug8Hzh 8/eEKpPDmfm4DQ7t/d+tgrArQFZXo8hjMFiRSAXo+9nHS5eM05zIdtFkiDiIozTUrUvsqeg0HONQ Kk2jMq//+KW729e+fOdEwB65o9ja0+19H7yunUXthZkN7yUIEle88RsPtQ1o1lejHl7JPn+JjM2z T7/E76e2N6HK8XroHh42M2YRvELJmWUqWGw9WToPw7JVQZitUUCq1MdRzzqap9gpdbRHeR6pRidH ad8LbajUlnBYCEjnkbmKo858ya90bbqO4qBakMUaCVeZ9XjN1ecybsvbc08/AxL9TPu+9786h+3D Dz+P7dkNV3Fle+11F+Xw242qjBKcDz/1fPvzv/jH9uiDBCBTUCu4bBUFtAsBG+ZSMLgW9HpT+/a3 H2zv/+Brci8VZDkmg1NnXQa27GWOqQpKwYJ0nPVuegHXxDRZe6OKBHShQkRFgQpsCZ1AGwVQ8BL0 uttw/P351Tj360Dn5cZf+/pL2re/eXd7KAj9LoIFsgNmsKwrYd9kkHFEbvjSne0Rnt3xM+3tfLzw PJSjx57HyRlp3/f917VXvuq8rIVBRvAI+t+7ceZdW77PbTGCjVvCWjXAErElXE8DGtGn2299kGLa LUhpLmA9XIYZnpUg54KLzm4P3HMfBbpPtne++1XQFSm4jhOhs1PDN8Fm6sGEtAvXxSgo7rQxma2e E9Dw+JzZBM0aXLvoui+LK1vFbhEQYC/6Om2TmTz3wrDGq/BfNM7tV2dsUHn+1u+M2oGvcc4MqA2W RW+H7A9v8blFWnMGw02ODF4MiL/rD8MHuH2KVsG51c/ZyjBrhXR7vFLZbVvaD85NUUL5fDMqNuvi 3yLmFs2dmlbawn7ZhMTxCzWUvX4CBFq5vdy96ww7IcKcltXanK5N7Hsz5vEZvAczoeVDxFbo61Rk mMBl4MO6rjzjawxrzUe/OOaj+MZx5yIlGb8sdjBUPK/fX5/9Gu/Qc8aaKcZQlqgIJ89j8TY7qcbU lxkcZY/5Wd1f8ufcX4r5tef+xwTOknI6z7uo813Fi6DX8YsqQFR9ybF1btUXX4xzrVPoB5bzW61Q /F4EVfpIZTuqQNwtFeqhFFdekzl1b5BFlS65ePka/nh6egc+KI6yQYZ/7Iug829gwB6aCAhz/86b 6HoBSnGMMyYCcqwHUGo/SCDHYI2nKHTZezWD4zgoN2h2JfMg8FByjbHzCTJ1hqs2yIJ7g5cEiX1O M0fSR/rfjrnzaYFnfAIbIdrm3fDLz2TNufdck1knnpO5ViHYkQHVcISKpoCAwKYqJJnZus+AaGaL at2bMRgdHa+xcV+acWI90wFbzeaKhi2yKTmY+p6sYDrlJY2mw9wh+1pCOhbVAl1uU3HA3HT9td2J rs2b0coH+wB2JjS9FA/f1/O9UdcCjJg6v5vRqN2Lo1IHEB3ucFwk40u8t4hJ52d0TEeGtLStPEVH TZPwvZOcrlsMskVufg0IvBNrgQNLk59hAECjLcrQoV4Ad9cCH9FUOyw+9PBzEPL3tnMWkfJyQ8Th 6KgDh4fp713ckwPqhkvBp5+VcNt1DV2EZ5lu0Z+KGabGuP/R3k1rOuNwQKPKRtVZMlUhCuMGT4MU DXMOX66p0SL9MgPO88hJoijyK4ekqbgok0KzYYvONKkXrmc6aBoOtWiEaKcH1246NMqPPYoR375n X5tDwDAd52IpdJFl8JqXqiOdNAzRMAMlbWYev8v9UN1rm9Z9IMtyHW2Ru/m5nTgQO7KwpqjHzNhZ xTwP5N8Fq1KG+s0zKQxZSIAyDsptN8IRjIO0nSM8e6qieb8rTlmo0vNUVqcMwgnmyDjbBRQdTqNc UC453NMxCnKJnZc0WjE9xww4nyIn4dobnVr0wiZzM031QNCw9FSnxs2q7Z0Easo7WoRosBkkTiPK NfcgHxRBqqD8tO/G4Jh+LlUcFXPksBkYKbrf9TpVEGGcDfY0IB5Uohx2fdQ5L845n7v7COojC3LP kYJKyr5SXdogHec6PKq5hJ8Z0XyeTcNj8VHxNz0ANTxV2OHPZmgYNEiOngdMkKt+QHkOYTyUuIvS T7ioVuD3fe8pq9FOYVU5A1X4MRnpwl3tD3/vSxWpazhNN6qgAJJ72dUXt4/89JtAI0farqf3TRji UJvCjZNaVBX4pVBUKPHwpaNWikMdzeaepJssojtimnpol9xvomD8bjFcfLnW06OGMqQVWnse2c3n n3mxX7Z7EXzOArJV3/fBa9uHP3RtWwZF4xiFtjmYcJQtakrath9SaXxi4CfS5CEuqhYUrwcyeZ26 uNZNKC9VtDqdXyThoacVMjgcgCWdVmnF2CRtZQ6mOkTPO39ZuwoH+7mnn20PPPAsfOUDBMizwv0V bZI2cunla3Ae91FXAFLufBHYbH9pdxzgMYq2Rglen3h8Y7JYq6gJkHj6GCovD8DHfvNbLi+U2ofo 91BDX/UjOTj6gRWEhwPR1gdZg/2ZgwSGMlCqE5UpcFzK2YsDFtBlcruH+36GYEbVj9WrF4ZKs3kT hU0EJPMXLABV39LuvfPZ9uY3Xwmdj6yPWSWbOvR7eeaxF9szONKDc1J/T8YJWNw+ABf7h3/kTfD/ R4K2aVfc4zoGZrgSQOR53Dd2+1UxplQnrOUxY/nY48+hEnIfc3SEtXBWHIT7Hn46BZYr0Z5/4J5p 7Y7bHiVTsQXpwXNqHcj7dRq9x75s89hZG1U0lVWhbQj/GLujgwJAkHb2Imy+O5uyj1f2uUiXa6L2 mmPpIxQNscZ24o8OucFNX1v6277ZNZxGOEH/dT76vYjs5jOxKZ4l2ol+DzqotQL88s60O7U/q15K l/2ffsUypdpL57TenSLp+LaFcjoWQWy5D2kLXlc6wAkCsvIF6rWxXUHqa8wyrDgjkzNvg5Nad1cy j9rDuiPvI3fXTUjsY851/QwvVftt+Kp/+WxlA/NZiQm7f9JfWPvduahgwrNdtNL1pb0zYC+Zwurf kCJUHcn4R9pa/uS95RMUmq6PqSNcAhGlQ66Shf0oONOhR+iERbmNLLt0rKJ8lHJUiv/NLqhGJjiB Xaq6ibIjyULks8qmDpkNx8QMXJBn7k3Ou1ktC1YrqJcvbhGhw1BZldNQmtz7mScdZTMq0k71LhOD 1POEPqid80zSrnBAe3+n5X93mxDRQOclNT+lApOzKBnZWtO1ZwRcFUXolCHf0zPOWWq5s7L9RU+s dVmrt3/lowqNd97OmLkKTKsvy5m1nucw2OMdZS/8KprWxL/dXJzHZpziS3gO8F+6Weoz59kF7KAk J2Cv8Y84CJdk3OV7cTM6HbbeDtdH9MHq8EprDZPo34OD7d9OvGn5bPQ+8BlA/6+nuHwiv3eSM19x vrv4SZ7PnHMtco9/GyU8+cz68IrOodp7yQKI/Tykus/zIMU7SArU65Ck7z2oQNQ1lFvL4NZuc9KO gHS68G2Je8ACARZDZIh8HX/7fDrnUxgs37sDiZ7JvH7ZkoXwuQ/QIGJTWzG+JpOjrE3ammP8ZuNA Kkd1AMNuAZ+OsTKASb/x6YIGR49NShHNKWgXpzCy86F+WDzppi3OpEWBVViZlSCgxAHg/ZnW9+c6 YglaaKwRqUPGQeefDAyKCywwe5nyTHKB1RA9oNY0G0PetEGJKlLhsjFWG3fRhIINvQPViiknpre1 XNcKaQvwVq1akmKDLVt3gbbCBwcxHYe6MX3qnEhJWRUsWnUAKsZLNOLZAi9xI8oGtgEXld0LKufB u1DZtDmz4WWNtnMuWg1SSdoWVFSKRMlJ4QSb0mEs5V8ddwy4D1Nj+1V84Xemyly0LmDHXMggurUi CnaFM33P51msZ0WwhiVGiT86k3bp0kGfwh+1WDtUUgWXpvVMd/O5IpXTqA7fO5nOjwd9RtBxgi1l mjQUUWdxM9NMIY5zdyTcwM6LjRTMWGStccqYxViApqk/kwZk0Z3XlKYSg8iYimQdtXiI7MROgpVd OPSqI4wxdzqpth8WuVJ+q4I20TblxEqPOtqu8vVMrzH/qg+4Lqz492hxT8hHTL1DEIAhy2QKbPjO w0xtXoKn+YVoxQhLP7LIRIdvwnCpPGCBZunPu5p8jnOhN7hGbESikZ+Lw3TJ5We1NyOxtvb8pSki 8qPLaStUIGNvgSz/Nmtkd8A03jATocEyne566Mixzolr/UM/+DoKGq8NL137UVq6BAXSU1j3I2Ra woW3QLI8nfaKV65DVeOC7Jc9VKx//Wv3w11+ieed3d7znmtQ/Tg7DW5UCPHzVDzRwVPSSpTda3gA JKDQlGUZSp2jmyPNYdKyHmdBHrVf/rycK5GcGNXI/20l1eoFlAKdS+ML1432yOcOxYe/q+aALm5k 4K4Fmf7qDXe2Z5AwfPKpzWkoo7M8ZWopiliM/czzmwEgUA2gZmKE9XKIQmCN734oWH+Fgskn//62 XHcv9svn2MeevRvFjre//eqgZvv2gp5mLmt+TMtPYg0GafNwi+/NGgnoPxzg/Xjz0NMOhbdoOrWC oGqeogNh5hiOOvvzVlDrgxaecpVPfPzm9pUv35NzJZQuqGl+fefWR9r2rW9t5503e+LQrhPzVHvz 21+DnvXFcRrkg34Fne1dO7ejzjKfAtqLCdhHI3GmozzzBFq5FqhjW9WvHpzrdBbmQSx6t8mPiiGO tyn0Rx5FeeqxF3J/z9FB7t/9H3+ef7tmdiDTJlnxhee3tfvueTZFr5Gw60VxGZcJ57rQ2Kxrx4R/ VndHHa7ihhqkp9Ar9JHikCYNnT0yFCtWgFtfhSI7r0NHyPzU/WLGR830PJtOfDlyZvdE0lRZiLti YK3d9ucJVuvfOhReutDVCtgLAAukHLclDpB0E6/dz/+Czv2KZzXx/iDonvGCcfoScYxqbxvQFxLJ GJx2XixurPPfy3k7KdoWPcx/Ie5k/gdOsbrccXq8jk5cf2VsSzInFRTWqHXfI05S2bX4HzpRE050 BYC+OE5Y/JMhOOyj3+fBT9ZOWgh7woZooQB4fzqS2mHqFaY7l/2Mcvz0e0LKr7kZhB7i2OmcBbio +/JPKLgGJH40HXLHRheV48pr9BGq2Yk0nczaBO2opqLWXpzqiXnw0OfnZDXjUEJV9dwMiGUNEvZc tY+MF3tfxzhazSlYLeEKxyXNXcywaActbu3gSoaO/0vXQwvTOY8OoypiBgwvJIiuWef0JDToMJsS Ool7H2feZnUvDxr7+SCoVI571eqV71tFjoKFsf2dUlTnSv/ynxNr2bXmuuu0og70xo7XlFc2uweP 6RbrPnSt1mVqWANT173Uc8q1rz4c5vXU1tbndM6OE2Ql7hDM8o97kCZ+J+3qeRRnzFRPFplnX0Cr QpOjc6rXb1TW7+7l6LW34O/kLBdPrBb0xCJ3v/rJIh4pGip0u9L1FdVkg+n48LNtdLXbTkW4zrBO c/E76agGqiyS6CFmMdj0/aCbGhlRM7k1OEN2LfM6KfqS86C6Br+38GceDp8Ogl8HSadqa3S2TDNo eFV3kKe0e/u+yJ9dDc/uIdVJ7n22zWWzj1N8YHe73YegD+Awe/DOQTVhHij6zFl8hohrxNYpXuCg ztTwzHKPjzF54ylEsFmLih+kntXxxkEakXfF75R7cuFt3rItSLYtSfUVpspD5F7TCcnPdcES6R7d fyLi7CfYQIdBMXcitTcdJ165wt3I1o1hEAxO1BHW+T/GGO/CIZkNHWMpnM2FcDwvumwl9060BXpn 4LNl2w46Wu5Mh6mF0DhscpLGK6SgnYNIsuEorzgHzvSaZe3VBhRWDTOPR2xawPqZR/HhCBQTjdAi HGurrqVCyO09yQGuEoSOUcD92EY3gvxZxkqOt/QgHIYUv8obA12V7DGJxaqBMIBSIuownHpVWE6c oBBXnVbpLgkE3Yqg9hRcTSc9e5jC1aTo+2aSD2hFdlqs87Mx+NzquY5hJJeBpu0EkTftvxl01mr/ OQRRR0GYXTMjFFMqe6axlfKgKokOuOt2JxKDixbMbcu4l71wws26yA03iJpEZ8+t23eHhhLuJ4Zm J47drbc93G668S6c0XOR8ru0XXf1halid7/rAGjELYYNgiqvkf8OebgzlgMyYOChwREVDsc61BIP Rg1YL8B1NcYolT3PNpZ/ynzozKcoKQVWqqiwHj3EmJdwxdMh1YmKKebPKbjEi9pv/OZHaBqzHGdn V55nBgiinbyCJfFBphsXL6LIk5/7ZpVgJnFILiSYOXbYphSMJcW/jz68Ca35PdmXFsq4R3WSVLPp HxolnzUgn1HscL1wL2Y9ghJo1Prcn9HqP9muvPqc9nP/5p3ZPzazGGc9/+HvfC5o9pdvuA/VihXR Yvdg0clVmcNi6EPITXXzGmcz6hrMSdLAfJ5AxMUEjfNRvtm6aX+7765nkNvb2C5YB5daFR9toZKW rOnHH9zQNlBM6LitoXHKyhV0gTVIkwOYQi5DGJUfRFSqxfFr4FSfCzXugXseQq7uCRz5OeznPW01 EnHXXbcu68kAZNQMGGv22ae3QWvYyWXI4KFsdBgZzn3sV8cpSCmO5/Ej+9s9FDZufGkXHPUVHQiu 0ysFjRwUqj8UVaDssQMbu49zdoBIflBhGQ6ndOLDbqWjLj+09sR5kdqghvnDqJvci+2UITtjFAtq sTqKTwNSb4B26NhUpC838JxPpnhKKscuUPnihLZ2OYorH0HHWsqT3Tn9oL/78y+1p+lxcOu3n2yX XXwuNrjAFukzqReBajYOSFA8fu/HgrvDgATY6ekEQ1vXl+PInzv43F12xmUfSCXcDi8+2drMD/Ni pgl+/i3ffgjZwNemZbYdVOOMDjSNvlo8cKdOtubC4ANnAxDBwHqMWpFjUqAsuOZcmmIL+DhV3YHt ge1AsQxKODg+OsfuadHo2rRZIyKfSqLlGnEsqxhZUCa1TJ0SUxrkLzuLfV2QzQp2/UxrWywIdX9r D4r2oi2wkTZfrlf50wl6ixrinwTk5ZLH3hgz2/V4crolusQKLa+Oxn6ZIdLJq6JExzDcdPnL3Wmr V2mjuuPb3xsHSzRWnrf/lkqWrROvqpz/upH6kUYhz1P7K05r7Fe57/43OOTa1iz3TpcaHPAhS+B7 B3nS03qLbg6zn1IykgmUamNBv0PVtfLz8Wc+IxkEMRHRTlu7S/PkDqTthHut74AtEuWVijeGHR1o QwKnGaseDGd9MBaCTa4Ts7AhVMQPrCDL7GkV+WlTKniw4VWy+gb21C+QeK3x4znsPmyGwhqgadPM yNbvihmPoy1nXt9JPNJ54HkKa67syGRRfccCqtYJsyf8qYyAQGHRFwM6egz1ouo6j8UT696Tjc05 bfAhiMSfevgcOxPP6NUcz4zHsLiGAKtUtSrJVgFb+ZbW3VUWJb8XkOpBy0SgEx91CBhrLH19gjDv J/fpWvNhvL7PVtzwAQAT9KoW9UrwlbLcVCVzEnFzoUDu3RHxwwYHuKofq1I6t95dfAckX33yXVYT BY15mEpDhohPk4WJRT3hYHvzpdepJMzDDz+VQqX5OGkOyPPw4aw6tkJWQ2+nNBfxDCgBOjr7TdmT 4nAj+2Aa9mxAvle0fzIbUhrIKI5x0VdAbXwEo3Lu7RAdGI9yFtlGVFb6IZxhUdF1dC7bT2He7d95 oL2EtvZb4Ameg1PhPW1FQ3b9Czui/xgEnCGzVbfjuQM+6lYLBnkenUadWxUQplG8t2c/BZun6FCE EzyKs7oUVCpZAherNIgK2GMkIr0mqmHUnlCx9JINfI6KxGtI2aTHeJi98r1Q9TjF/T5PJz0dxHGl 6nCaJ3PQn8agq8wxF33M1WcvbWtB+hZzmNncZBup550UY50GwauUHjrG/G423Eg5godEiHXoqK5W Zm8Km3QWjpOHu1qbOosGPCOz56WARdRWbrNV1hYM6ZDsNdjgHucvWkyBJtxHKQ0aWSNlDZPrjoc/ wXid9LC2cE/dTVPyFnf6fG4+xkn3zSBnCoj9UduOMmDTCUQsyq3sSFExRE5PwdeTPuGhkDS3qVSl gUBPDMC2g+h5yJpxsIB2GW1q59FKeguKNXKr5SGPqVtMAwU7+M2fbRcuKqUTpFUHSpFAaR/PUQDr e+R8io7tJEB0XRvg7KIl7mbWzDmoHCzBAZf6s5xmKt/zlle389au5DPGknbbhSrOqKg1AU8C1Dpp ElknNaYEl2PkGSeFRC40a/wkqVad4ApsyzBEfi/cx36kJPVah6H/59HnLqninUplRW3EjmVmAvhe Cahw95gjKTZBFTw0+AzR21V065sZrj/ri8+L5jqv1/EyqLLN9Nq1y9rt34ZKsm1Xu/2mJyjoW9YW ki3RQdj04p72lS/dC+9WB3QazU5WwyVEJjMIWu404xxpLztvWqSps8CvlaY6QPBiMDEHp3ISSixB T2sDZV413NKt3Pvvfd81Uae497v3t899+rZ2OcWCb3nb5ZHoC7KGAbZ247DUqXBVPZ2L3uazHBed Yp41ypciqXcNTvCXP7u5Pf7Ic+2P6TD5r37+PRQlovTiWiZQvPe+Z9rf/83Nbf/eXRxMY+21SLrN QwnIOU0dS9L/OG/sgQSMdvXj+qvp4vnKV17QHkQd6eabHw7Nw6+rUfu46KI14djOg2plIKm2/E00 Pzl6eC8d0Fa2f/fvP0g3uUWRudLZNAX8j1+5p33ib79JvcdGChsfZT6WRKc4Db60xtyvihsnSCN1 IJRQ1mxIoYHe28wZFgXlRNHQxwkXgLTY1yRDMpjJrFjvAFDByX0XzvyG5zfyuxntJ3/63eEtH0Cb 3J4BOq6P0pXyz//oBhrwbG/fgprx2jdcGJspX7QOzVPU2uxrT6ObbhBs1u/t77kKCb/H2pOPPNa+ 9Jk7oZNcDQd9XTIfzsvxKagM0VxqzhyKg6V1eRX2/NatW7jXY0jtLWQ/FC/22ec2wqd+nJ8fpi3z he0XfuED4c8fZRAsFves+Ju/uBHO+h3tXjpAPovk37WvvrCntGOizwC5Eyu1pGljuy0SlBlsIWMU h1i/rAulwSI5p1MVWo0OQRVTDWepc1v3XnB4nF3OAX3Ok3aC41nHWNMdhM5oOZtxrvnjdYbeFXl/ dyqkKMlpzvdB5opGMQPnOo6Y57s2wb0jtcyPj10A6JBKAphR7aHLFg0gW67EzTB9HQX3ur7Pn3fd XwEPs4+xa1xYB787xlXjZVZ72PNl80Lf87livz3LWZOiwoIz7s14cLVVHYFiLPu9DiCXUJEkwUeN wfAnTlZeVvtZxNGfxV3URmZy61JD4yIpmPohydTrJ3DWRtqUawhM+Aw6r/GZevY62KGIs/l47sXz cBbn38BPn2IDGJH97nMVh9odZgBetJwUlHbbHWqdjVKkefT9OPQ68HkKqyznPaor7OnUoYim8ktb m9ty9HgC6GIrxE5q/7Hxk1UWMdjpYg2+N5m4ZDMr6I7CDXM1UXRrfUwCBQvKqS/xPHc9pOCwq6Xk wFIZxEC8suDJ78unp0g4DrvMB+fc+fB3cWiH86rmMQ52RqgCzcG5DvqcrEplKAbKU2RCk9zpr+1v 8zvHqgpNyzEP3SO/d10Pa6qyDH6mNRHOcS/7rr3p7/g7e8U9G9pfrRuvn/2vbJmTaQSVoJH3pYue 7SLlRieFVXFMj1V5Z/GJPPhq4OqqdXi/bBAcEjcSr88hLqE8hRuVbvYgV/lATtNO+Ms2h5kDR3cB SLPR2wFSfF5a5NmNZYXu1NM4X3KJgxYYLsvxogvSjj3whqsb1UG7l8nBrQAkxSs61FNSpKBxIcWr oyJix+vHGAOf4Hy0jEULR3HSV8AT3kTx3TEUHnaBBi2Zp54nKUU2ySb0j204YRJCIzlmgIKTtxEU bhsNKUYRVp+BE3XAn0MfWcj3hzCwLtTdIKNHj9gBi2Vk8Rj34wFiCmg6r7OC2g0rVSLGDOOrAzMO Um4Kd+oJKAEoT0zj4DrhIXgAbe8eES46Na/NwUFxU2hslf9TWucw15kDWj1GUdMB54AI+kD43BoF nEAc5jmMsRW+ZiGU1DuokzpaTSryM/lUrA0RGSNn6S0e5FI9pkOBmWpBEuPjASlSM854qiOblcb7 9tpKvkedogpHOKF9TlUepK3M5vMtYpHfZFewpFYSfIjEltyfi1yDZMpdpyDFGVNYP8yxB5qFp7ug W0zHMbcDlHzHaH9qFOVN6XKx4UyDHSIwUzvZgj7HeAZRu8jpUtRC5nYnWu3QIzgjQ4McETg7Ux3j XqqQxEPPbprSHEDd03AFlCxOt6L2dRhaY+DhssN7g4JiUepydHXVXrcr5bO0Wg+vLfxElBLSxrVS 7O4q0dzwMTV8jJX62iIX0aBlfFJ4IdXDw10Hoe/DshM9+8S/S3i/DsYYv3C1K0Kf4ECWfYiRdl8n Taixz1WrK6k8Z6UC0zyEHx/VFkS3vQydQayo/pvg+X79q/fSpXFD+9jf3ogSxpZ26RVrgpY+cN9z caxYwCC7a+EEX5JgRie6VA7qGW/85oNBPR37eq5SDtHh975f9/qL23vf/8o0Rigr1AteeMBktk4f bGvOWdze/wOvodX4Bri+m9tfffTGdhYycPKSLVqdilyTzRoMJOvQVo3DQ5RUdvZo1XNov6Q8fegH XxsliWeeeKJ9BsrDS3QQvRJZvnEc/W1QRW675ZH2DMWGUn6+521Xtre+9dJw1yU3xvFhEXpQKvel kU+BEc83hnP46mvPa5/99HzudX0OEWsUXkdw79jsJWjTcfRz7r7zKZqfWER6sl10yar2/R98behq e2gwYmGlAYNz8NUb7ml7d21v3/3OE9Brruc6KjH5NQnndk/7s/91A0g8TR3iXRfKlN8y5z/8kTdT cLiiBxwAIATif/c330TB5ZHSya3VxGursOrtONGXU0h587ceQL5zT1sCl/k9FGZe99qLocjtT9Gw GYHVaxe3b/OaXds3tTtpfvPSJlB1giv3TZ0i0KxA0+fadlq7jx258qpz2wc+fH377d/Y1NY/Q1Dz B1/GYZ6FvOH84idjL0dGXDPVtjtrmPW+lYzc5m0v0Gp5OdmlZTl7vvzVG1EDeSF3/+a3XNV+8MNv TOH5kWjXUmTGv/fQcU5Fk22bt0JxeaS9EjWRSM5io2KT+kGaD+L7yN/1GpIgtNg8A33lQItiJDeZ vWSGIENcZ2o5uzr0OkKCRGdkKF/Ony28MHVW/C0dq1Lg0R3PhBVt0I60BohVr6NzXg7zqWSrylkw tkoGxTM/qF3RD1KrJCqvI67R7ih3basKrl2TcVByctV/qbP0HRYQRqWj35JnXNBTg+KiTHYZgxrD /JHGVgFNSYbKc5ZzXetQ2x86RX10oeH8e3AwCSUKrX7Z2s0zBdkX/Kr7HgDBwUfx9cH+deo6Gjsg lsOc+r1IsMFqNYPpfHIzN6yFNLWK8ynIY4Fa2da0otfJ7gitn2+hu5KqAkCOrcXzBllmVodmP8kQ hHNdmUO5z452uv55PakhOb9KrSX3q03vdj0D7PjIE9YRDxAJ4Cgv3JHldUfQa47/ZCARIKNzlIdz NgFVBUUqvSjzaL1T7gP0fjIBotDFQLtx3lMEKtiH7yT4mUAjc1Yrxa/KnBYlKIX5rNepOu/9DIot cYK7Q9uNVF9I9fmlv1+a1Tqqfps4MddOHqHQY/nrqUswMHMeChzKWsp/IPYRQChQOYh23UDWmM/n V4HKOvayHEqJq5xvfmYww7ykgJ0fpeaj7w3vPT6DB6weRyD0OEO80rGRlO+H6phYaZnXaUjrgBZh UoHCQR7HENairU2WvdWjS8d5KIjU2fHAi3yKEjxyZFko23btDn/5/LVntfk4Nm4Y22gvsJgRh0ke 5CacZ1v0HsF4HmGBKpvmp2kgLMyyNfpF560iqp8ZPq9H7HQm3fS8BlajtghnU31GqMHVeciNyWtX r1iWSu6LSDXqmD5JscssHN1Xw808dQzOLdxBJepELlevXpGK/J0798YZC/KEgdDZlNO5jeK4cRAn 0862/gS4yKF3HC7zSRySEzqfrIq9kw+2Y6TLI41ENG4zCYUI1etl5XMuV6etKaBylup6yCu/dQQO 6YH9jKHK8DhzOwhI9tk2lO+PMCdjaPmKGs4mjakk2kKKvrbi1M0CmdmvvBgI60E27bzpk9pKkK4l jO1stGHHURhI69soS3AvOFA6juNqhzPnprSdBxF0RextIrHXdrfc+0H4x9Nw+sdYLxZj6qgYyY1z yOvoqmRzmHlzTuSpiagbbBxko8/geXWMRkGnpL5IyxB1GzPrwdqwMG9IiwWRDnqpccNpNUhjjuWD KwGoZOImqDFydV2Horejo7NjYI4dq/WSZkMGJTypVc2xTRwAOnLTGZN5c+a2KfPkTevkH22LaF3u QS9VaTOtrg9BwTHwOMmzj9Ip0UNpBNm+BQQuy5fS/RNlkSBvrGk5p2etossoTsJB7m8TertHddjk Ko/zHqgoItaqyixCU30eOqJ219oHamcgNxf1FO9Lh8ltuXgJ6L90BgIT15solz8vecvizCnbmB36 sr0YI1ybMs/qBtdx9nCYGmRL9ICaAjM7/rZzaumhm4yMii06t/Z+FEU+rPoKn+U+1BGOWhDzLb/c g03eq4fb6153Yfv5X3x/+xMcofXPbWhf+8ot/KkjtvC2EYr0Lm8//uNvbpejdKEzomG0MFd6wCme 8/Zb7uPPPRnT+ir70811Aq13vecVMYQ65la6h37RIQj5ru6N6990MU7vZe2rn7+p3f2d+9vf/+2y 9q/+9Tsqlc8fg4VBekxd1jwnf0Sp0gKbjZxsF3biCgKEX/zl9+Kkj0HhoO377Xfz594ynKE1UDy5 cCHo+NXtI//sdfCjF8S2esDaptvUvZmBA3E2B1fXezjeLsFRXnv+irbjNjsynqaD54XtqivPyv0l k8AMHeM5v/Wth1Dk2Mj309srrz4vhd4HKMY7CB9X9RLR5NVkF86/YEW7+47n261obj9GkeAq9rxj 5jPu3bMd2bkv9vlwbPtJlbmhQJUupedfsJo16D1ac7IX1PirE2Nf8+B7SpJSapBdRm9Bacnrn4dU 4XQkwB5/6rmcE6L2BhTqgF9GkeDdt97X1j+9ntc/2s4+d1mpu+RatkGeRqbHGoZgOaF+ve3tV7bb UD+55cbb21e/eEtbc9b89jP/4q1kIJDe5F7SoY3X2njHa3jeqZCwnlbvR8kqnb36Ys6faXzeYzy7 xZbzQaQvyH1JqVGvXjTNPf0KOj+uorDxmSc3wxe/s334h9+IROdCzpGSjHv54Z/DnuXp2RGbQ5t1 VRCOUF8hADELdFjFpkMUT1a9iSik19AJcwjr38YE4XX3AK8kMVlTKhKFF6+zKGqm2oMqUr5XJ0sj VlS3KgzkfTrU7m3PWp1lU+7SA6R5xInhD5+XQnCdAgNoHaKMZAXoHbzm9eWAluxZdRuMc+q9WMgW kItnElkOqueZVTROHS19jBT8Cof4nnSr8v6GFVS8VScvijb8mcJ+szB3QKSt0zitMRLgiR0r+tpJ W8J3h1CHMZl3/ZVuKswgJxSI0+RwCfiVY6qt0tcI19gA1yApAYW/87QiK8qYGaQaWJupdNxEsQUj rTvRNlTgX3unwIrhuTq33J91EFAwJUZWP0QON9QJ94Qm2pqZyvyXDJxr1mckjxzbUWGN414F7jr8 otTR7s8DOu4dHPD84rrW5+RXXfhA59p+EQ7LQVQwRJlH8WsS/CcQKzqHtAe5qRYaK/8bffGogBka 6BxXAW8c07Bw9eWqr4hcbffvtNRzlKLV0NskXim+TShPkft03L1914CfXc+W6RucXc98V2b/edGL hrEYPGzXk+vasS+lGgO9jJd8acc1KLnrCwlFC+EBVUTTSyFK2swZ/9abimpM5mLIJtQQO/7u1dQW OP7us6DvFcjVrTE/Fs+5kGaOK+qOF+QL2TB676o1JDJhgE0r7APtCy8I59EbkdaQaFkk25RBIAQH uypd5d/4QR58091oEwioD4ORUZ1EB52Hli83f47ODjxhVBn27MOpwNGyeCepGGX25IEnKHKxWmhF MYvdC2l7rjqGHR7V4J3VOaqihRVB8tw6kThwTktSa0FkKb4xJauCAa2Fp+L4Tef1C3Ce5/Isa0nT zsKob6eb3xGLnnAWLTZbeu7ZvUGJi1uNT9uvn2ir4ebuwdkN35H72osDKco5TqBw5KI9FBoehRZy oLi0jm+k8igIo8241FZTZiptTOe+ZlrEKE+bsTmCs+Lh6rwcncrCn0XUZVqRZx5bOI925zqtbCJT +3BZl4GK2sp1BJRqmjJ5SNZNhYoywuKcOZvDlfleAQViEaiYB7qpXpFg70Vax3Q6XGVck87DpeK5 dsD99JlEl7Zt244TuJ/5sogPTiWbyJRO0rHofDufrq9EhzG8LFwzQSL0ScNR6AfCcpqmKuIZU11v rCUbayn8L0I7JemkktYbYa5ipCOlJ0qsDE7JFZmidMFLI5k1e3ZbyH7S4VPRQ9TawsZUjifdVlxU D6OFC2elDatOju2ARdy1L4aS0e4U4Ycv7sE5DjfbIM5CrchLmXplDHfuLG7lEuT7Fi1ayn3OCTdc IyNKMTo2N6iHvDW7xYlYH8IB8hCeosMvHYjrLqJpkk1kLNA8xHsV2dfQ6cDG0PCM+zmkR7jXMfao 2uOOh/OdjW63RXeqxgiesat5ig0UuH4hZ2Yoiu+Z9ruR1tKozokx0HgcQ1UhhYheJ4hS56vxWfKe 300h4AUUKy7FUbRDoIeK9iKUJsYzRXqiDt6uaUgcshECVAsSz4GOcNutj7dnKdKz0M5iRNvGn3/B ctL7V7QLccLsEqdvZcx4xRVntw9+CL6thcYdXUsqMgY31jNrQaT51a+6AF7xqbYWytOHf+jNqYl4 BR1cLZCUcuSBf4KAaCn75Kd+4s2hGKh8M4c1dYwC4DF44XGOWIOj2JN34MAth+KxDEdqGRQp120K dHgwbbA6ud7TW956Bdzt1e2OW59AWegFWnzvyd4ZAWFeJb3jmvPbtWhwj5FxKlCjCphPSKsAwdZx mgFlJJF+VqdqTafQj5/f/tlH3oJTvSTzcrXdGwmW5a1LIdB+2w1zlOLo93wfyizwv68nQ2CQexQb Nw3+s4ebko4LoOD8+I9/D5z1RaxFqHGMlwHpe991dTsXHrgBfLTMuZfqwFuHtM6pcpKXXnxW5uM1 rzqH8XlraCpxI+T0e4CZefJw6WjT+eu4Z8bnHayVwwcvbW/8nktZ91JbqtGYaJ18a+lk7/++1wCW 0KEVezgfrWs7kF522er2oR99Z1L/V7/ibOx9HaiRq8PGrl6zoP3sz70TdY9FUHgOx557flbhKfeN PVWd6J3vfVU794KloO6L057++c3Yr/2bWA+zXfXtQp7r+z70buZ3UbuEzzwObUS6WBBTnuwgAcIa dNB/8mffDRVlLdeYl30fZzhjVR3r/CrNavWCXJaeS3XontTOSCXSgNooSY4xJV+DlG0ySnE2y5kq jWQ5o91Zdq/a8U1ASyfTM4z/VKwScPDztQ3VMMc1xV8GwDi5aXcvWh5nuTsMgmc9dR2ATF+Az/Jc Vi1CByHXxggmcZ85lTqhY6fEqvaENeZ5jY3RlrnvDwgs8dE6ej6vyKXv93t/H2SXP9bZhIoQvlsh hCqXxIHS2QIRDR3teGmbh6Pt2IrM6IhrB+JZ8+yeLdjs1C10brkAgI5c+iH47AlEBs51BRpnnGv9 FG+jlHqMB9yXcYnk6NqURz+IF0Ufnl+pia+ShnHBNLMA0nlwsjPwOueOgVkoaXTsH5/PzKKfEVqB L5CP7HsZB/enSjWe67EpCYJqPZzqbbvr+YuSo6/luLm3M6tx4Cso8gZ9jprUCqSmSav0rNXVzFsd i9xEnE7nJ3KNWfN255TnrKPalVrc37SWN6BxfUcRqPt3Q8ZCRHxQKdEfC03as8kautxjjWnuLAGk UyKVBnDIPcuz5Xx2T4VjVgHbQShkPoq3b02VP5PKKUXPa/tC/QL3hdcSzMt55TnIa9NMTqk950Tq qmvEvchHCqxFEQx/Mw16/He2kAvUbFxlZHIvzHryoI6d55pj6S8MVH0mX6MfzHcjzr2BSfevfd3U JTSykDYhJ2gEnU+XlNGsCHP0Nx18Nq3R2cF0riMtaQqWq4zaHYubtXI+UXKH7ZNaciLxllwABqui QI5YtD3jnBhZVRHACJvV1NWWbZt6g4JTQWH2o+Ns5D53zjiHwWIoIzYeMb1SkzdEr+EZmcpwQztO PLDOcOmGojsMKpzohF+KJGTBuZi9HhSNvaBRafSynYgUx3wWnG8Rwy37QFYdtKkcTBya+3nf/gQ5 HJg48Rr8KQhejvB6EbJRWibPDI2GtA+H0wIGWoqDPKOjFOFp04zMbL+rHI4OrEi6PxNxtABGZCGV 10ZrOkKMu9SLbHQW4kkOYCkQPktpX8rtMTCqQKIKXPhg/8cfVTWm01I8AQ6baTZIkotgOg7FsaMW UnJ9NziHm/xfZQ1PTEebFZrGMX52iA3m7w/RfnkG0m9HjtBu+amXmKud7VJSuePncQBTQKgDccpu X3yoh6jOclJgzK12K6iUnKzuMOpoz1VMPmlIDnZeP8OOPF09IeoM0iQcM4t0OqLgGIr0ngD5SVGF 44QBHrGCFx7bXAX2dfbkunEvrpVKr2rnNFY2LpiUDXwYVMuVKr96lsEagclBAkgLIUWf7LY3mRb1 yujNYQ3Omzs/hVfRzca4W2SnLNwcONvjoNOu5/0EIo6bhnEGRZVOxEFaYU6e7B+ll9CU5r4MRPdG TYHMBqi1G3bn3r1pHXycf8sp3wFiLW9bI3iQz9u2Zxd7CgUXgjVrB3SaTXu5Zk/DQ0+Q4WHlEk0a s4r/YthMaZuy7Wm60gnNMsp+yGHYnXQNnWtMh9xxnAvS+BM/8aYEkpXB4n+gy6OsXa8/EkNeB1Vp hcYyRebQJkqvv/4SUOyLQfMPBBHWMM5Usx7bMd29qeUSVeuHxvVvvBgqxLqk6qPOoiNtG+U8Rkn1 uZ5ESUw1WvBrgeUv/dL3JsMzHfnQ06LNpLA81C2Umcw6v/KyNfDcaR5jypxfzyDwTCGkyD9r3IzH 99PK/AMffBUZj9JcDm//ZQ6Qo+WeMQ24HDm/7/vwte09H3h1iiGl7xiAziWwHcd5dxwPyynlJnRS sibQgncArV8Q/YoKi8FCagJMXZ6CTnNVexV8Yn2hOazDEeZXbr8DrBNuHccP/NAb20/8zHt4drVk QaFUIvHeDNBVnsFpF2V83/te3d5JC3BtvlQ4s2E//bNvy74T+zCd7WEilUf1EZ0D5SfnsJ5nMQYn KAh885svbG9926U4wfOC9Dh4jv9h9pApZotRh32hBvxrXnNRnGz3nvJ6Oj06HO5pD0gD7KtB2y+9 9Kxam65X1syb33RZe9MbLs33zrMNNapeoqiJOlzX8/tr0LcOH5Tf6fxExpL37ATYmEFA91P//G2h h8wko6TZ2QjtxEHaAG1vdOR4+8iPvaX90I+8oa7p+aV9iDyKjY3IRLJPZhGk/OAPvaF9gGJGnRWp XQbiSd17hoW6UMWpJdOmgeHcwbkLBc37dmKZh4PKd5JhmEVrbfdPmLhJvevAitaKnBZfuorrOlVB 6VFvS5TQMefnwexOlOpIeNLGZu45nXOd2zgs2oGunFCuQv8qOygFKbuepWePhKJDFJXGDEEWZOBO peZ0sFA6ojhpAzVQT9Aq3tqRyy88N7VRNv/RGA2OoMDEFKXksq60+1JtChGP31FeYV0/1teP0Ybr YOlwWxRXY5NAP68vSbmqFainUQ5vBJlHz8/I1fUaBtexoF5JAMb7qLkJwt/Hwo3FV5zOILGCNFWc W6pGggYW7FVTItehTYROMrdBUHX0WSs2j3NtiorqWZ7k3j3fDL5CN5BP4R2wFsM31vGUbgsYGXUh 1a6SGWSvOmmxb865qK7nIfVFccRLClBTURxqNaUFpCrgClZSs5Y17bzqz3ESx4fzGbXJUUrz/a5N XmQ9itSTynzWmnPfpAhQeqqRa+auivVmho5RfmieC+TX/VlZU9a4gZmBSXy+vm+HcRap1knnM7yu TVrCSU8mxb/Lvum7ZTnGc9V+F53Dxnt+nyJUBwJJYn0kg7djyjxa55DfVbZjOs9rvZ09OJzb1BWZ TUkw5h72XgtMqFXi/Sqq4KN5MJKhcNz4NvPNj052jfQ0nvG9PpuABn7YDHwz7XzWM//nkpg6hw2i 8+I3vl6D7MJ2AJJa57DQwXMC0gbS1IVpLX4/BpLr6/ciwxJjiNOZRdX5e26qkvCyDa2fUdSS2Bxu eATt5jya7+GaR4MqlkO+YI6Vyr5mRkT45f66YT0YjfTCA3eBBkUpJK4qa0srecpkubFFmDe6SRV4 IseC+uVspitSngfDhjPj4hPZ8RmPQgexzenx6PJWRJVq7Cyk2qiJTkmHnsTh1Kgq7+bzpUr9YLVd PsTPRfFPUNhmeknZMDf/iM1beH0cRVOBjE2cVJ1vm4SYYlRDlzGYOZ00DmMTrrN9aEROat/meV0s og5ZAFmARlRVAJE0Ey8VaT0F8up3XisUk0x6bcxqzoOWMyoYIuc6CG6a3fugv7BA5ZCLvB1MS27Q eJw+C9OCwlMolKA2n1S8qkrpFJ+r2oz6QW6gigw9LKpg1nVXnD8AjDTZ0GEzPWUqUKdKVDOcKpUB GDfXgGMWJFaHWeBKYyxiwcJ3exlMxHHyU7lW6E94+Rm2IL4osBDw+NyTp0AdYZ1pVA8d3k2Tjn0Z yxLZdxPXhtbh9n5N66vbmmIQPkAD4zgfwin3y7Xt+3WypXdYKKjRN0gprlp3bPshE2kqncA45OXM q7e7G55q1CwYa/daeJtB1EvdI6Y1KE1MQL6PwTXSMSJnveh41z1ZjJMIo7SYu4OQa2QPlVUo41B7 a7Jpvxz6zIV61zi77oEjUCXiOogm8wbXqUYyzq5jMXF4a8Rw8OHnunbngN77J21+ec1+KDAGpWlX H4NZKdY0xpHXKLLCszmP1M7UnnMdqPLTuZDRkDfYxHCmoxiLQcfOgHTgEQf5kKfY0W/XUIIP9zk2 QjChUDM4+BYe2RCKcdehDZfcfdJRpGrPG6C7GuXwJTVsHlJ7p08TZNSmTM2HDk/OCP5zvzpWVVHe U4keQN2OZGXygrStxp7Z2CkqOEGlKuviuLg2tCO2t1dVZ9s2qQdk9bgHA+x9HpQ85wwC5cyRBy2B jF86pDoytkc33RtVAv5zbeoQiPycNJvmXsGhi5SejX2YLxWVDIpyqPIIATmcJ+ZBZZ2ZBKHuS+dN g5lDGidLeor7wHkMPZD3R4rOwDegQA+g1H/nfXE8DCJYB6EQlnkq5y37GpTIouLMQ2Vd3BPD69wK FsBPQb3DA/MgAM05a5bnPs28up6nggjPNGBx7bAnddRig/2cbrcqcLMxlvUMHLTW8aDQ5PjroAgy 1ZzUuo/agWvYBe9c9lN24D0PYgB1SA/ekKlnVfqE6CogNvuRZ3OsdEg62pxByIFeB7/zJ/LrGJXK idmBCpQUBfDA94FS81TvqnXcA8WMqXzbPnDZ//11w/1XwZZIuA4cIAEZ1M10/TQQXYXeeJRZ5Nt6 v95e7rfmOUWP/DC0Fu8jIYWboRz74WtA7X1tCutqB8We+lVBSg8cnOfevKaK0Pr45L5rPQxKJIMj nnOnz0WGru+/nFZp1iWwoHJHBRW1znxhSuNiz5RarVGsvZ0b7OMWxLpLzeVM4nvVcxzntO1WLz4g H0Aka87vY5d8n5rQfZ5i17FFbJey532/DEFI9m74yfzKbKjnaHm5E2s//46/KD+5sqt1T4yLRbGZ o5wS3U/jNj3D+H6g2sTu5/NrMYQWEdpEBToOXwE0ydPk2WSNKZeXTEHOENeLZxF/Mp6FtA8Z0dx7 OSvV7j7njXNcfRpkJLieq06veNKefwFUBILtk6HMch/H8un0Mc26Tw8gJSjqXvVMryC2xjwZjQQM Z9ZhOfO1TAYvZgjG6mnrlwlc8hz19BlvUxlSGd2DOY+HlV1AVxApHQadUY3OwOOZDponX/ggSOuU aaJQIL3+XucEI6xknE7XrJM4WnEUlfWpyGSi+jkRYS3KurkySIlW4mgU59F/axCcCh87HbH4t+nd BNMOHoO5D36vqGOlAmtSnOukOUTauMbozNn5mZ2BTnfFCVEU07slCWjnuapsnSEvmEk+QuV47R2j tjr8Ei3CwzUtYu5MY2ujCXlablIL+Ix093M/Ola2/dRgyx11ge3n7/1M+LgtuUH60gUvUjX1nJNT tetBoMNTjlo4zIy3LYFn4DOkaM4BcdyG9KP3kR91WUMjQFFrf6YDwfU0unI0XQhVgFgi9V4n0m46 nOFuObZ1CMv3fWHT9rRYXU4xpxvN7MEIiLrzvgdZL7WgdT4WL5hDunphutxJ4Ywjr3Fj/CLpNqSH nKcgNXpHtTDPpEbLEAx/PDA0MEFwvCcdQu5Z6opvVjLMgOdUmrNUhsB1oCOUNGYOjq4dyoGVNcjz uZakR1Sr9qpCtwBz4eiCiuZt1eohbwAFQqxyjRudmsg2Pk2lmTIUouqF0BSFRudPQX8/Q0dE3n6Q VdaZDtthAiuN06zJOF58TnHA6nnPBCBdAYSbMpMxDj3EfaScnxkl9Y8XLVyEcaF4VGk8ncdkkgrF sTh0kgFxnr8cfefVh5TTpnNdtlIERgdARJsoW7RvKCbxjVkGg3kpAxEz2TmQOl2iHRn34b9uSIau aGJfxdkrw2UCL4GDAYgUFZ3YZCSqoY3UkjrUfA6zNNURrFAGf96r350jTRw/SxMW9lioVxYVkR1z HuQRO66uu+MgwEdNFXrd/h5rO4bg2M/TsRxnPn2vBjs8/ex51pTBcZw9ri/87xoNDacyYzkMEkSX vroFlgbEnnU6XVOwGTHodhRjnHPIyoXP/jhTsDbhWMch4cI57C1gNjvn/VQ6VJqVcloqySg/J91p H8pGu8gmbd+xO+vcgMEgbly9/9jBeFYx9ipV+JWAInbT32njCtFJ0CXfF6siVU+K22FrXTjQZ8+e k+t6mKTLqfxSHVxl3OSNss9E8hMAWKjEPOmwekjOIkvm+EdxyLnp+yeBv+NiEEaWTMc388Q4+TP3 ZDIksXEVpA8Srpmj0BbrmeKAGoDUq2vh5p9TAAr2to2bt8GVXk7x41yeZXYO5TQCkWIWB93C/OL6 ptCqr+k494IcAgPxmf0F65L1kU63qXco5C06+NoFN5qIdH9P2TsBgHJWjopqdzvpfqzgt6TXcvZw LcdIZz+OYoL6crT8yjMHhTS9XcXMglbaCc8h242nsNLsYAc4hj09MSxeit8FV+lOlE/2v7+u9LMF nwiclJLFzp+7hscLONb3mY53UNTBlgyuSDmlPlNKPBxnz/r/zSGsgs5y4IZmIZmTiZnMnfV700YU eBSud3eknfuhg+2wHnzdoQ5+TAQn0VF2LsvRy3hqV/hGTWf9hgH4yf4QJfY8wWkcnFEfJs75MCc4 rO7pKL9kX1VmQ/qoa9wMqJ/qnE5T7pLrmpE8qsIZ15pFZsWzwqc0ADWDNhWAsha2IFXNvwi3wJCa 36Gr94BpcAfPLPraA45pwByAqgI6B3S2IJiicLL28EsikBy/Z1jLSibyloxTBdsn6eBaHmUHMP2M DnZoY0qlxEC9gNSs++7zxW/xbBrWWHmmZ9Zb8DbnuNaCwdhs/A2nQPaCdSnS1awJ8ww/RsGnwUuc a8crewhKL3tX+zSDc919HpQ741ea4bWa6xwsz29Y/46XPy1wKi/q4+u8S7GaqW/QxzU1v7ykch9+ Vd8Vz4ConwXNq9dMPULaTwNloY0FTW2vDq18GGWolPNicXQU6USidhGlEn0XyfaPKfGgjzrdXHhK 9TQtuoOGx02abmcZVb4rBzByM7FmhYZohIcvebBSJSpyKXkjq7k1dDp6RiUim47JmaiuEMRjPIsO mQdlNWuogQyvqRfIncDR0AGdaNShHJ9rum9uHVALFfPlM/HeGQzyNKH/nrqKmkMORjYK0ZafZcGg aJiItLzn2aZCVRlhEpz4OJCi7xpZu4mZJjTY8HBxo3OIp9qff2fTYnUchzgsUV0xgq0gpWx2j6b6 4jXdr+NscY6pWg+AqH1wb5UOL/RPtDKIEuOn+oMI4EtbdrRHntpIa/OxdhF8Up0CkWzXwB64sntw IH3WGaQC5atHnzMRW6HncrCGzINORMY+dzgckr6+0Jocj869xjXmqzZ4DgnGq6qda8N5+Lq2inNV G9U6z8Eo1LY5c81BRz0LHON1igKGQp+lIZSUnhGnBvUIwZrFh25YsyQ201nJHBjUTEdBJOi3ByQL 7wgOW3WjsrizuLdeN8o3nb+V4NGULGOUDc17PVRr3CpVOoxRDp1+WOhMJLjlmT04XT9KbkVDmPcY KB3A4bZduutiQO5F4XIwZAy6kXIwhoOzFn8hQiHF6RTqoKhO0lPC/Z6GvTfslXI+hsNtcGA8lFyL HYniTdlDohYvQ6Vio/he1No9JeUo/MAghC9zFvoaiAJRDltTd0PTpDLW7ossdtOWrGEbFsRR1OEt kxK7o5GU7+660XlLpk2Ops6cCjMi8XF2rCuXQlEd5Ayu5BgXolQHiNJxOrVDEc0kZafiAQfMzfMm i8X8pfqeufW5PAgqY6MT4D0VqqojZebMwqRyEqpGpZzS4s5GS5c3SS2RKyiqpAJuaFNmsJQzs1EK mQv3rvO3GIk599IoAW/2CtkVW1AfVy+PvV5Iebd/AhoJDru9jeqASiUEF6rQ4Cx7kamTqR3gNQdA an2tAVqa9rAWJwEW+BU6RDjkZCWsmHcdSwszK4EzYMByiIKsqTSxiARqPrv2f325gStDciYwrwya Os411LVStO8pKq0flXrJxLrsP8xla15LilJ+t2uhskRJ74enaRMo7tN51mZ1FH3QwC1b45phTElU pQtxAIsKrCKVx/Uq28g15N52h6GcGO8xoWA5GZ53/txzgv9El31RaHrMsevgWagWG2jOZUHwugtX pt161quBRncEs+5qyOLgpjrCfd3Bq+LmFsLoNg9tpY90nbXeQyH/HqJxDuLQVCA88GNzHGu5up/k njlg9pVxmQ/aMB963CHOI8GkPdhOg9IoXw32x2sZGCV7VYFztrgOVCxZfdW/yjZpW3WSh/00rNma /zrn2LTl0KXo0zPQQMIiYMfJztKd1qCKVNDJsogDklvz5887qMdYHINr7/NlLHSo+JM9mecv3nj1 TvBR5JCfGaf8ME5UaelbJyAFo4rvzZq6Zovuk+6HoQUaiNTDq1CVs8A/GfRCx6OQ5ee7L3NQJoSb CPLjbPt753GwozVp+X4ImJwXfTU/odbFxCvyOh1Og4r0Q2ANRiignxkZIwv8craolNKDTj8mx8wQ ADvmvk/wruQ4Y4uH9RPbV2Ne7xnuo1zdrIfsEV/lXpB/LmW2kOk9ZM3tzO2YLnOEOqB0mABFX7FQ 9a5mxf1bmxUePs9RWuEpJpjYB2dAIZ3ojqi7U+PzDQ/nXq/sWRREuDfPCR8sVKEhezCxL6XamFGn JkH7k3NQu4atSNTIB2nkdhPpb6NwzYFfs2IFNzcThORgUqVC8X6Wk6shnzp5PA8xRMhGDZEjETXT aQ5aNfAi+83yelNiEwhZxro2nzSFwxpjHDZ5ekajIb5rGMMt1rjb8AAUmGpXA4A4dLxZ59ACARFK jakKIbZkz6EAsi5akOg63CWc3TjZkOG7bFwqYkFri7LCKzHkvhf2XUWAbA4j3PCbg36rRjEYg6Iv RG+X5z5Ew4ND3LN81AWgu2qPOnWzMKo+Q1LUoiVqZ4oK8h/HWoyeHeL8mobR9fk0nIOW5TR5ZENa 1gXsws1mrw0a+T2RVx00DZ4qJqJwOuwgXXKZPKAOMZ86IAZM1W5cjViezxQv/55DythCxXEKg0Jj 4NoWoW3asieLbuVKiu9IM5t6cX6PUuRh6texqTU4OGOVwpJ3pjt1Mh2uagwrgOkogJumcyoNpLwH gwsjVrs66gjFoQzaWVtAx6oqjY2yawAKzCi6iQMTg+v1gi4X+hjaSAooNF4EXiKTIDMHj6PBiyPh mpGiYJQsjmcwcoj70CkuSlLxb72WwZ2fp1b6AZFWnbSgFzwP41766jYm4dpcw+9ndO3v0KM8jnRy NOhxtECFOcQsrJwaxIOiIcYhQR7r12scVeOVz0gKUTQ9/OJCcbV6her11CHjJvVD5RW5tumeRpbE g0pU1tTxKEWzgwM9YX29UoaqMk5D568JC/UyM+3FpLi4njx8gjWLimSdFi9StNrnnGUQ5trQkPtL 7z8IQSkMWHxTh2wVCVfRjweWRVRqk4P69UyEcyj1gQWaYEuHKAch/5VMn1kU5Sp5XuWzNMQqLJjh SXV9BVqVwuwHuHvbWe8/c3xzSOewZFLlfGaUC9HJIPGVlucixT1DUGu0fuc70+XWlL9OuPstxp// dSqDhthLaXOns6d0dlWmOQQtzYB94cL5UcSRCneQdbFt5w7GhHoFigvno3ktL9C9P5Ng0GzJHuTy 7NCaYM/9loC1eOp+ruPtP1S7EdlKoA8YMQtVndPInDrn4+jxDm3Z076b8dSmiMj5+wEptPBPe2PD KL+0lTaccA7JE6T5Ukm81RyLGOukV3ChA2PtC9/oiLBXLXQUEbffwAs4m7t2H4hq05qz6CBL4elR smZBGys6L1sTi6DD65h3egjzY5ZwxeLFaRamypOAwx6KsKNawRyko69nSF+TdZZ4MBaCrBtksJ3M RDqCGqCXA+JzBl3mv4mC0I6m1tSX43MmdYyzJbLVg7VQe7j2PuzqZz717fbxv/t6exxpwNkUqf74 T727/fS/fHcCTOfT3VI+SR3wrsnjHv6HLUaUZgg106Ivx9AXupa6usXg2GeBDQGqTkVfuwlIJ+6y zp4gjsNXd5R83knImdnYbfZMakbQPg8YxtoJaGZYDBpbC7s7ixMdZLqX3meqzv7uyOg/5NYMdIqO Opl9OjiOg85z9mkGYVDz0Hm1yZYAHLYBlHpQ04hzfFJJWGmeBKcEd0FW41x75thoSxdFH6XGy73l 5q5ak6p3qmwvDh/zZtv2yKQaIKWouECfciZ7DwZ+X82UpBqJYAsoQgVhvJOJJdiACBCAbci0aucG wHEGmSk7LsuVHwK+cuS629eDI8/H0C1e5lzn8OvzVqCbc8znpVLPexx8rgqwhhVaZ7bnhn5brf3M Dv+XM1aOtM5pAoHy0+p6rpqqHaj57OAOAxIMxLEJd7rWUig/2vqce3V/dZ2+T3LvIuelECN4peqY 2WNdYEFQ2QpBkZMBgDoifRImhQFnirGt4+F3KcrmBmQ8+LmRdsz99j2UJyw/tsIWQU32kzSgcKoF Hvy3RZ4V3GTlBWQTSHIfFuBWXzAYEozUXhoCQb9TUyUTHEpFonoL8GxyYLpqehq1iEwch8Msf1hH YARnRYMTXuzxXrGJ4Tdlr5OmA5yoKZtGjl0Va5QDYMqagXax1PIspyzOq4gdBoMN64OYqs+BLZpp 1acD5bX8bCs7B6NthBirWBOXZjgOsMUJajWabkzK0dSwGqEeOsPCKzOoMfM95bgUqqeudlpa9kUe Rz9BT/HKj1sImZRnTaTp/IwlC0SjXqluDzCce7Sp3bB+Vopawq0qmooFV4mQOzQRiRs5UkeLmpLC HVOqKUrgTyK4iSWdf/vMEw0ERNgNUpJudBFVpbWPbDRcHFppFrj1FvDwO5/fRhorl88DxVMRZFdS 3Y6Fut+L0csWUVmNioFp0VTMuwk4pMfgjg0FIS65QfA+XMjMh2kvm/3I1ewScoxvFXO5JqpIqHZl 8W2DTlnEkFVTacxy1kqBRN5p8aUr3ZjF7rrqB67FR863Tot/HPMoW+gv5XDnMOezZlI0ouFVNmsP WYcpppZEuPjctDnnoLe1+TiOccbS1K1BG+Mrj9egstA9nX2Lq+oQLU3b0tQO15MHGNEQ8Hsd0koj lpZ0DJJODejuEJxozHRECp2tdLGcb9e0WZ2pGtTQDwqBi7/BOOholtRURfUJKPmAKg4dkGj3YKX3 y8gNhqLbC57eMfPXQe7Ndrzs0B0Ov6BhidZr7KV4ODeDtNcpU4+o2zh32VfeT+34YiboLAzolr/r yEZ49FzbNTagcSlM1eiH/0ugz3szn1wn68Xx5AUpruGwOAqqVQWs9ScOk3PfnYnhngebYDA3FBKn 2EynlDFz3GMXdIwMAjSkyYJUpq6yb2I1hdJ07LKbWqlcRQM5aQdSM0fZ44UyprusxU9kw5Lf86Dm Z6KCFlNN4eenTqpZ7c7RyaNwnOebOcPOsCPtAM7mXQ8+QXbpYLvo3JUAIovyWaoNTLZAtN9neTB1 wIQOlM8WkJBvLKhhUCndSkrbkTZ9zpw8+0zsWfl1ZX8cc9e7tk9HIpQjg6lOUcgxy2caXIlGc/Hs TdfsYa57+AiSpjYqcq4cv6y9nhXkGT1XnnlyY/s4jW+++fW7aTC0HS77WHvDm69pP4PDefY5S0NL K3TwZV+Dp9OPUH8jRU97LB/cx1eZJ2hzf680rmrfXC2t0yqah5Uu4vP4HgusPXDTiTJBX9EA/v8+ X6ci+6AyL451OSBlu/xe21WcbRrdoFSwY+fO9r9+9wvtT//4s8iP7nLk+HsLevDfoOnQZe1KFG8O u/cMnjpHO3bO4sZI2roOyqkYsq3auJrz+jPIug1Or3+HbtcdjOz67ku/zFfoP3Rth+USSkhQfl6s fKq/UFnn9AydvKKpOZ+FjA/2oJ6+DEyfq84RnujC2F8x2BPtYPkNLrlyeDzXMgYiw9rUHhwJLJgh du8JAoWC5lljQSVnZ6RjY7u6gyeVL+uzg1I60J4h0r7cXc6rGaSAHtXi2vP6EDSEtLSONHFHOGNf ax/ny/k3YEtQU0W41oVImY3YwlHR7SrIDCKeWhIPgx4s5BrVa0Sfw94NA8+5wI0CJga1iqwsx7R/ fF9luZ/YeP6rwKyrQwniyVfQVurQuwJif+vZfZTY3q5GNGHF4r90SbvBeff1E59bdtwLFO+fK+ex 6vuqTePX2rHu4A90k3pfPUcyMM6HWR1YAf7KugqV38ZQtHJ+Qxlm7AxYfEI7agsAOG/RCddW59nq WdKjoT9cgPuXLcc6BeohCuopiCU3n59XUaSPXGPtBJefFjQ8DbR6Jo3fqwh3BDBkmJMKahnr00Fk HBRleJAMg+IhHUSNYpEKSeI+jNw/OblHp1KZyebeg3KIV4imM4tyiOY1wjPgEmUSdfh0ZFOkVIeu N54F0J2KAcFzFnSaPcxEFeT9lVOVWt5ot9qsIj5YX9xFaK+DX2RhmptFY8mB7rDFocgA10Eu70s7 lcYQRIkefMVb7nxdN7SvEwWIdrWpBlsD9/RDX7iiLnGAjXBScKQyAlXKfJSO6PSp81KtOyD4Goc9 tPZNM5HwEuueRY8d84oKuR87KrrRu1EtTpo3nxWTw/iIVfIY1sRYbsiOTI1YzMK1jMJEspKiyuFf DpUDMYODzRR4aDbhZPEa7ukAaJfOxEF5qtzrth372/2PfgeH+CTc6rF2FXrfq1fSXh6joFPr2Bor 7YeXaWOJKTZg4doDyp4KfzjmohCRgGNkkjY2mnPcNFSdZOchIPI0hWrhQZfSdeV8jswslYBkQDqK Gf6ZrkyoR2wMbUJ3VjLVPH/Sr13zVuOZoj6G4ASG1WI+D8vdzId60upSB7XXeeP9FvFZWRmtTjIU u9AVt/ui3eVShMva1NlWozmcNsZ2lA3vXDrO0fTkw1Qi8Z7t2Gga6+Wc8Bxa8uc9ALMnaqN7Dzol riWzDtFwpZGPgaXO7hzu1SzBkaMDb9edUQjrmdQvm533i0zLGYwTHeUUAzapLBXQxHBMnKj5+Imv +GJxnAvN8cDosejEOVnGqoz5QJ3I+Cf9564uhNGiuxhfDj2fLYYwRTY9fRi3tGcaDMD4hcH8kK3y mqnz6EhTihtFQUTouYcK5KQ1dWPp71xnOsgebLlHHeue/uP60qxST2E2hHtVCUC0NBxr14dOSqec OI61zOpQDjAS5KiyRUNhTKFhGbgMTQIHXjzN4E4EyIxDZFcL2ZbuESoIx3m0nXmTGbdDFNkeNypj IGxypNKA0pMGZAcIAEdG57cFc5GG4/6fXb+hffYr32lbaQbzvW9/FTQ0bTfoGYWE2pphsry3qhcp SlN44L3TWpLRnh3SPLC5+3E6Z5FxmUaBooG1CkYCLfKpdVzMoHh4jRIIqh6S5h8+B+MfHmcCnfo7 KLPeGV9mhYIUxg7XeeNDizR5YNq59JGHnm2/8St/2W744q01JtiF7du2tKeeWJ/Oub/+X34sBeHh 1wci8qsoALX26vsEAThFx+iGa9GsxVU+k45o6icYkD179lb2Dpu2B+nX9HjAKTPToy0TqZoNv10F rQRkIlmWfXHvAV7MzvRgb6CphAKQQS/nIus+26QypWk4Bvprxuzjf/uP7Y/+4FNkvva6wvnjOpiC 7OuO9jTUvKuuPj/PFE68h7WAjFk3Ll+Zg2qqZVfYoXFLACO59thd94xrpiQDa4CKAlIOdi3Vf+Jx 9PF82V8J0D2Ty4aq+LL/KEXgPMcslcW49j54/zknOffCf3du3YPhOPdz1391tHLwRwewM/Y7AUTI BBN2zP3meOe8lwjh2e3PmCd9jAK1ulOMk6XNKCCHCzLW42Nz8tQJPDr45Q9iKzND2nztipnAoIw1 StozQYLIH1azO3/uGDi+2jZ7PJyxndWg7DBBh1z3ZE11rnXqtWf6B9YkpalJ1cGkK2SQ3Ap0Q5MN w7XqwtJwR9BzWE2hllRxuaTr4bPPAB5nUOV6hLJ501yr2gE11fXy+MvzMHU7CeS1BT0YYBsJPgje xaoli++0uXZz1bw/v42Nq9/7JQUvgG73VeJrZQ1wfYOtgJPlx4VAFLtcNUJxRAMOubfcNwJWFUA7 5mOjRaNVnasQ+QJwIkqQMaz95f1Ey7qvOcfPb5zboNQJqoeCw6yMBK05jzqQVA/UAR8/x2fj3gOg 5VkL2U5dU1gadf/lmxiglw3yZ6q+cOZUh8PoHbNw1H+Wq6gxDJeECG7XbhpiEHUfQFvUA2vb9t1t K/SROTQqaY20pdzsRC4dueLvEOnr0/NgxR+uhT0RJTgJDrgHn4bI1K2Hp4ewXBpeXG0zpX6oAMAB GHSsnItK1dRiCmk9C6ZI8Tp1ldJT2LwKPDSu03ViM9jSTDyA63UWH/gM4XtywIq0ho8lpSJOah2q HrZRJ3ASjFaDRtO9TD4yzqr8ap3YySwMnS+1LuUC7Xfi46jUmVcIaikWRHvYa7OAjnpwaLRT8IAU z0hPK/WFNIUxioi6B3uQvooWI9auceXZDsFJNbMQh49XiJrEsDDOaoFX18NqI+tciAa5813Upls8 vDZs3Mmho9O9Mm1b1fzdS2v1PTTr8UD0mTyEdNDrMBnmtZ5vQGAr5Ue6N1xnnR4dwU5hkFOqIxYU t6K9oK2Mk47mOIebBv0oTkXQe+YlvPWeWQli5pbpa6XQor6RlPDU0OYgrwAo0bNdfYik5UjpfCpB eFBdXzRzlU+Td6pD6B6YCVLsHG3btSsHcLSvu1On8ahIupAj23+7bj1kRI8dF5Eqn23hwgUTh3HO //6sMeJJh7qNi3tqkCrC5iFvYaxrcUDYkpbMnqigqYqoSq+zGE1SKapQzGt4CA1Ot+lNA2Sd8xRB 8n6fZTjsXm4ssxdz2JkGK1Q2mZS+n8uEVQagUOHa1SUlVrzmUCIMUPr+GOgFvvOkAVcc7pLwigOh 4+eYxoKX3RgaPpRkE3doGt8MLgdVUqr8PEWK0lx0PiLh5aEoelaFSAN6V8FBqbgc53AMQqxKBt8b MDoFlXGT9lBBodct4y0vtD4/67efKnHmPBzze+elXuOzTcipaUP4cPnWrruJLFi3QUnHep+9uNix 1fbsVeuVA3E+a3LcoJgP2EkGZDb1AyMzcMKhXIjmvOYVF4dSd9n5dDhkvj0wvMdC8h3G2k+FqFX1 /SAll3Hkuu5j0cnDp9QILmUhKSg7aZJUXOXiwOs8p+Mbd+Y+dNaTwcRuDdk+531YB+WUKd8pRc8A 2qZS6hGf4df6ee6Zbcjk/Y//9ikc65uytqoc1k+wwOtou/Ebd7Uf/Mgb6GB5UZB2EeX4a5HU6qd8 9njZwsjXaaf5Pq2r00SqMp9z586puU5GS1UUikYTgEmlc+4JahnTadMKbAg9yWCVeYzSTEe2a9X7 VY5H/2etXdeAeyFOdu1Vm0TZ4fMbX7uXzphfZA5FrNG/x86kCN57Zc0p1ZrCWAMyz6uoHFUQoY8w MkUkuQ75KvCuYm3BMLs3RkItdrX2VgXfla31PhOXOFb+5T7st+5fE05j9r/jOMgOluqENtd9Floa 14jknTSVl6GWsck528shnEDxk4EpOz9QOsPF9gYcK/8SLPA/bZt7mT/SJQTdIl3nHpfqZcCv49xt 1SyootmHhwsBnWY21c+KkTrzXAm2+/PqSKZ9uXPungkdrVzAoaZFqtIYKkSRKuV3OtcnAHa856H2 yczHAWyr3Xz1H6xHyhrH5qZlfexGqQ/FodPh08mME1zOrLZOmPM010gPh67SEydU2ysgNXhPcQZf 5jfVxMWpqOLZol8OheaRiNMm83OfI+ICFsVb16Tal9nPfm6GZ8y/U7jXMwVDp+D4La6C8iDrjHdl +v7BWfbIzdoa6gLK78jzKVLhPus0tcE5HpxfW7CHOOL5yD1m34ZF4LOITAtJiH1p9wtwK5CSYKuD jz67lJDBqR/Wf4X4tRaGOqqqwan9kSOsvIf86USXKvgMolLjF8C3VzWWTGiBnp5vpQJWr82818GG McWB0XlNepuLbaVRiGmN2ciRbd8JRYA3b6Ur4X7keJRfW0T3OI2+3uIxkGC5oQswHm6GOLPcqmhI VYFWK+IgpdxgFdhZ4V8SSC5qHRKdOrVvhy5SVZhQRX6TlXXq6cdalLWekjbm3yKAbmSbs8yAa5nq UduH8rCDIP2AOIgMnlYn0wNCxzbIqA59mRnR4CG1oWErI1SG0s8s5QsH0ihdlLMWssi5zTsy6Upo mLbm3aYrFtGxrSp4HYPiluoQHcaYaqB0wo/JtWQevKdoRXcpqiESdSHL4zVMFH1Kty8DEZ07EJo0 dMiY6fgTIHQD5MHo/XtfNinx8+025VI9QJcmUTLnZD4rbMNLO9sWmmzo1K1Ax3feIho8yIXxYAWx VYPZBTYFtGkcgzaD9VEtePtm518DpcAiklKx6F23YiyHoKec8kjPwW7PxmcNxUnlwBAZmwm/L/rQ bipPzRhm0UafpfRhq2iyomC/il8qx1FepOoGIMEcksEBRGIweKW/OyNSUnZMPIZiQYnKq4piECAq vz/pntlzx5E9mxGVBls4S7OItGCHcoNwsPGP83kvoAN7mMYkztGalYvges7J+hSZS0Yl71X7vIIz uaAqEiilJkKkrrBOi01rnNddp3fzM4sa657cK0fQnbWK2vtfsGA+HR53tkceXk+3vh3oBq9t552/ PIU/crw9kHzW6noFn37GgjgkkTZkeaYwmWcZtMejqiK/Vn449+H+DALMoR3FC8ZD46u/YCCh4koC 2qKQd0e2I0B5nXvGoE8DXHxjp0kbk0JpuJHZ69pqlUPc1xaZmtKE5xjn3+XM34cO8Sdt4KkcN1sW Y0sQJDc1KHXtIcdYnWY74M3GWRodHYfaszcHXQIO1oeZB7XCZ81C1z3FvOr/lPPkQvL5dHJMdye7 xFiLjEXaKpJ1cGali/CVomCNaahfrr0KGMxcHTqMgoxzxniLTPo+TYf3GC10HtzgzKoEi/9mWBjI Ot2AYs9uisWWLZrTRlHk8bxcv3Fre+iJ51CP2d4uv+RkW8bPz0Jizs6eJ1h72jL9aTn7Gn/l6BxL jwrKhBjTQo/kV5oyt7ZlZDpoblKxVVCmtN44zp9r8wAa63twrrdQ5Lxi2aK2YumS8KkNziweq7Qv dlNFHAMLU918RUqO9+tERCYywVNppovAh2/Knjl8SmekpA89Lz71Dze2L3z6W3mv+/DKV5yX9XvP XXRXxB5EyWjDtvbq116S4Dd8Wq7l/pkCmTWcYx1g/rOHgAVkhSCJNrp/QKUN1JnX2awJja/r1nqd 0NL4XvR8rsBIgn1vpcAZx1SnIMWlPMvMAB7Vglx7bk8D15VOrXNbMmQ6o+VAxanl2UXd1z+3pf3J H32uvfD803zA9PbOd7++XYje95/8wecYc8ErKZl1LsWm+p+LRhMrusi/Z4VaU+DNAeUSeW1JBFa3 VIMP7UfOg26Xq5ZBjnllLlyzUw0woobjRxUXvsxoN6beoY6LtUw6+RRpAxVN1CW4FlI8G51hUcoq 8B5sRQK72G3XY3GWU+DsOuB1jpcKEDrR8mX93NOct5VRVtu6em3EP0izpZLltH4hdI7BS+YjBoAu 6j58X/LCRY+rbH/QrP5o9Xw2BXOvO94G0gaXnh2CAjYmsWZgnCZIY/Q/CAWN/0JBGzLeZrm4rDVS ypSWxrc/6G3SBQv8IObMIkTtp7r7fp0IxaeU0PQRSmVpCAY6ci3qnWkvOz2wFk4bEARRc5x6sOTo 6ZMwtxVw1B6Mg21A4vnnujTgpDdHGAvS7iJtKLUB+6UN9yzNnA1KYiWXVwGshroC2ARDNbUTmurS 8YaMvH7X0RPOcYFQUt9Mf0abWhpFpPQspKaGTnWVZEmUIO5sBAep7wFtRjL8PNMRfE+zM/qC/j5S goI6hnI9E3DSZ3ZUBcOYV4OWOiMqQBqohhUQFMCmvpt+oGe1Pm3AYK7iOJYQgc9ewZyqPNJ+crbx /AcPFXMjSlysjTpDsLHHjtl02170peOZokHRLQeUAdToe1h5CCottxuZMquVVy5dmD9xFEB37Vy4 YB7d+nD8RLp1SIXbVSZIOlLdxXDbfGw0q8MBLak0v1JYxyI4FXmocpxF4Ix+o2wgaqDsWVA0N20d 3qJFWWFGTxpzr5WBqdSEBqUkliqdoVE6eQrZPJ1ckQt/zmdJIzBy8lpRtNCaGS1yWKZJQQ76auFb BtuDtRACb8ZKfvWI/QwPGBdytFB5gfxGO6dNZVGnq2iPyDWEXkPjNdODVo6fgQL3np71XMMDyM/0 8CwUoJJFSVtHJcIuYDhQkUctZLNkotTeNp1RDSv8Oo6kjhGfPxvBMGi4tu7Y3nbtOgxKrGOJTi6L ZOO2vW0fcz2OJvFpKBI7SKHOm0tTFTtiMncGQYfIJGjkdVCMSCOkn1SQ811GIs+eoKTSpEafNUMe vE5yGYQcqM6ZAYeGpxubRJURaHfe6+D22n6UwZ7vE6HwNZF149kNjCzuch0Pigwal4E7Gzw2jp8b lfFh3cwZw5kNt4z1wfvSiYw/xyjYkhyvg7V40aKkqSzikrLihhORs2hERyppp9Nb0IHdiXHe25Yu npvCTCkhHiBTGLt0QOQmdVpFRA5j3P/ub77ebvzmfVkTH/yB19Os4xWMKUglDX6cjzjH3RgdncS6 YlwP8H4dHXmXf/UX32h//RdfQT5wV3vzW17b/p9f+xECOTpyJiApzqJzPpWDUa1Q99sRqTWmULLH u5HwTLLoFQPj1Dhmvr9UJAh6sA3DPvQgsKFFoTE2LylkbUBGqpFNoR/JYHFB08qnoBoULzSNkNMA I8le5kMHK6i1hl5+YtJ5hcAO6gFx2wsuL31fD7wgX/3gx24ZULsWpUf4R2N5kqyDiKUyl6IV6j4n lXnA+hKdl971M+vCzJEHkTx6NelFwLQfld6UkpJuaXlGT75OQxChxomdIuKkg9R5xzmT3JfaDSXc sGOu8ehnZ+27H3qK1LVvFpH71H74GxH5w9iJXdCYDkBdmTbdPUwLcQqOXeN79+6JFv0B1qbdHR3n +BDxI+ogsNHQScbJ9C5Z16DkUp5ct+FSU0x7hCYhoogGnCXZWTrUG5/fDAVgRluKKknZEJ3z0vvX kdD58qCfEmTRbrIUpceJww7azS8DUAVSka0TSWUsQotyjPmMJx7f0P7+r7/GfoJqyFi/6S1Xt9/8 rZ/I2fKzP/Lf26OP7K4Mj8EPl4vDl2YXADSkMpKd0ZFK9sI1Vzr4vrbw18rqGTi7rnTWpbTpeOhs J9jjkVNMLXjBvDiH8s91uqcjTZTAMCauzhH3sOurENzuZWiRXCNxEApkCALNs7oeXHv/eMMd7cav 3Rm7fcG689r//as/knv5k9//XOyizYvmQe9xkRSvX8T/DMIZlE8nIbUWRV+b4bmU5jw414JE3EMc FVeQiJtOzUn+YN8GpM17nqGjwNFQNRIlS1fe4BmvNes1VIFA4fEVtMGhO/Gd5B1JijpvUcNJgIoT nCxNz+rYe0BgzKJ7AzNxTZw614cZEmUmBcc8GwyW8372QeQzgyx7j9qckr6slpI+m2eLS7VEDcpv CBQWkYG4gz1Y9rlCV8lxUzYjcpvcs8BgMgb4QgG+RKitJ2L+wemic62tzbkphSn1BmTBZXdkHPSn navSXz+io6jT7ppjTUnrcUWkV0BWY53T3q/Ota6vrzme9ts+RG3goaAzVBHXnbPQz1KfPdlK/SmD rzxs+Smu+Zwb/XzVf9CJHvZsqSVhc/TBwq7s8q02E+hjJoZc3YzFCA1WnZ0B/y0QUqDLj9VHOW59 lgAFzz+a/hwCKDrqZTNKEa2onPo8MgUCaLrXAgDpNxBImXFyT3mWsy4crQCwXHPYtwKDqd1Q8tZ5 tCune6X7Zc6b7rXMaQEjC1bLdyuwqShl2uSqB6t1BQiiqldYAUNtRvkzrvXK3pZzXcGHiPdQDwhN qtvSwU7o800VidFZcNJ24ThPhiOqI63sjtHmxs2gKBTMjHIg2YFnGQf3XOggK9BBVk9Q45LqZC7m Z3rYpgiPmxDdGgysKavx8YoG4t3zlYI6i+58VB5e59Q01wEcmKFYKGLoPLxI3QyQzBNo2KY9e1J/ 3agxoS6CdEvqB7ATpl7tUGCRVEuiOFAlndgccUN6JT2IIrSeRRTSOguQyS8kyGtXFDrRBSiv63SW pHp0ogu1yr3EUDHBONQa9ANWzgeVqLbUWTCmSLgXnVydMNtxS7dIdCRSJsLU07FuaFGUndAyfL2R fuZNo8frdcg0KtVUx81OwBMuXy3OpPQSdeu0F6fUlKrPtgWKz6Zte9oy2vwuQPVk5ZK5KIQc5kBH 5WLUjAIHEOMZlJCUujJRA/dQfvwkCjaYmJKp09HOWFf6qZoLTeX+pFjU4TQDpMnDJnzWvlhDzyG4 GSTr/Ps49JY8S2+R6s26AbLO9BJ4bzqJ2jSkFz9KyVnAOM4DNY48ENeR2uSmEdHywIyTTqfLHLr8 XKTW3VypNlej82T6utpC24kx0o/sh7FJSMolQCwEVtQqyAp7Y82KJeECH+Lg9YB3TiNvqaHo82nA 4ME8HaT8u3c81n7/9z7dNm/akLV4gL13CSiWhTaibJEBYz51/OVuu3ZGgmRX973bbnqoffSPv9w2 bXoh83zXXU+0l17aBpppt8hTbR/UAufOr6mM0zGLwaRpMCYaGos+XddxvulCmoIc93PGqjJNOjKu 2zK0HVlx92iQHXvWfNBPDbZOcd8jBtZOuChZeG3IOjmZQ8DjmKSbGa+Pw+Ma0wBmDs5kr9J+WOc3 tRii8XJ5W2oYNGDTcc50JnT+DYiOsy5mgUCqde9Y79q7u+1VMsx9FKSRFC684fUbt7f1G3YiObmS YsA1bSFd5w6RxThCK/UhoDCjpBZ9pP0kTLNlRqgv8Abs9OoaiHa6tkHkz1nQ2BuYqcahJjzOkrZP LVaf05/7eptiuX4FHFxjxRkFdmC8Vy9dTJZwR9tBBkn5y1mg2/MIfq+7el0bYV3Ph9ZQ1BMOe7iv p+aUI+Maqop5u93p5Bk84Li4ooN6VsZgSvad61CU2acoO+YcVnFsdW8zc6O9O8ieS4ZNaTod2Sgp ZDNXUOn/dABEHXsWIXJhWZWFdJmq1Rk/DMruD70Xiw11nr76pTvaww88k/sY50z5gR98U7vm0gvb izu2RkFD922MM2clbdyr/kVHmnUrUqZfEQeyHM1w9lVf8jOY88iPMm/u1ZMe3pmvKm7TREdJKG3J q0Ygspl9f2sjdS6rmK9sjWvBdepzhaKIdxRETC6wqjUezv1YSlLV9czPdAieeXpj+9xnbuYzdnPf o3TZfFO76prz2kf/9MtBvhwYm3etXrO41nyn3hTgUyDF4GwMdIjCliqYda5S+KyN5e/gPjkDay+W I9YzSD0Tqz21HiFNoALO9EySn6WPR7dTA+nK1tWfKGd1dNAOegx8ENkg9KKfrjXrkWwN7RnXHa3q G1FcZvtkOJeuC/fNXgA8reoCdNWrhXk5jtof9/fAufUcKiqFTk53QPPvjtgK7MTediWOjKoXy/+X sx0AgTXDvaS/gQpgeNEzUUfzzc67ma3x02RPsSVSBCdPds+4bquRUvauxs7FrbvAsxyytizgm10/ T7e9Zv5U7PCDs95QE3MssxcLNDiWuo3SQjfDZ8Lba2d9Chby4lDinOchMPDM7NfMSdTHw/NRZ3nQ 3p5M0JxHd48KVDpGrt24JnU+hxqVgCUXn6AyDbVOcU7NBOU6XXHFYFpnWTUmLm1WyXot95tnoah/ 9T2xsRZZYLti87dSk7melCv2iq/x3qXURvFIPXW7D3cKVjjukeYTJa9OvNmfLLYq9K99EaBj8AGT XSrFlgIyyu9LRtsx73t7OHeGmoRQdIe9jsFIZtoAR6pyv+bgLyaoMcjs/lZqiwKM5gSoc0FH3n+6 uXQ4pSJo0I+9uJVChUPpOKjOsYfo6MictnzJghRkzJ0zty0kXZ4CFSNiBntv77ZWDl53ZLnBwOt8 WqVkS3DeqCVGynbL3NDQaWc2CKIR6lEiSJ0bDyV54zojRdsQ8cSR5U+A//KEypn1ym4cDzcMlc60 cH/xpIxuKr2kAfYNqTJVTkm0g4Uy9LaP1A7XEq1OJG3FvNycHF71lfbjfmaix0qry5HVkSmnsDSQ wwnj89MIhc9KdMM9yM3SaTfVIV/d6yg7p0NVJiBxVSEQHnD8l8ia90QpQiMerm8ZJsfGtsM2LdFx cBHH6dPA6pBC91F8Xl5a+MB+/oE9ieRXcJAbkJhy3bh5B81LuMaBo23Vivmk30mrj/OH6w0Rsily rUmyAEFzCgEup8zDqtD3cqpLMi9Fn3yGRtPuXuGl8zpboOqkmLqpKmnHvET3RWvcIM7TJPyQGR7e Rvn8fIYR94jFPSBuFjogS3VKHWI+eKZOIHd4UNRJtAFDNxQfHEZtwY0fyT3G3jE6oUOgEyzCrCQZ iGCKTifQVjsvUkjG926goUjWVP9QAS2FRGmt+ThoToiR+Vzax3s/O8ni7IBOtWix3beqsn6QCHzq yQ041tu523IgNry4jXoGahlIRWog/LzgHK6pqESUxKJo/e4de9snPn4jjvVm3msq36YdtG+3bTqS mi5X58WMh4VZGpgDIGRHoAGJkjjes3TeU+NQyi8GD46L4+/nut90/k7S9j6cPRdmovhaoVVRWHvC Ofdn4YjygoryCyX15wmiepq2/t3/uH+lMTmv4buTEcDpk8vrNYdaDj/0uBxGOiv5ka6lMQJKD8ET xyxGZZw8yAi8PSv8vTq8/nG+ly6aDw2H5gRcR1rNJji+d975WK6/BLk7O46auRPdkYNdxTimfOk8 mOIxaxhctyphSPWoopuZ1EXoSGhDs868D9al3Rt9Jvdm6SqjPEA2yP2pIZfa4tjbFMuK/GkUgTv2 ZoNGRtiTgArPvEgxLUHVioVz26qzVlBAOIcNYJreTn44Y9y7mtizp1VzlATN7h/smSo+CX7Y7zn/ +Zm22GdKA6LYraJ2eI5UUXf9HbSZ/3kvC0FRg6B7PW22Dl/mvBQwpHmlNXuKpnS+yi6LxknHG5Ai i/h8WzjN/D7F59zb+uc2ta988Q4+uzJRF19ybnvVay80t0Vh36b20sYdue6q1UtwOpfEDlZhF2Or spXjnjbVBk8FHEgvE5JyrkSeQ21irbt+rLMJL5Z5jdOf86DbW4Mi+eH87ghzIk1HDfnYZJ16ZeIy Riox2awnyfaMwylsl4He6Z55de6re6MFsdJLjrXbb3mo3c2a8+uii85tb33nq4Pq3f3dx1h3OteT 2oqVS9s5a5cjF8s6Mxtghqg3iRJA8BkGSTNtqzY3jqPnmQEC4yCYkAJtA+BeOJ4QanDEs1m5N9Wy u5OWwfC86tcaeLXSfgY6m6mmcKA9h6diG7iGqGVAIs7JmIOcwcrhdVWOrKdy8pKtCIJJVoM1qNjt UOM13cZggmaehTpjBorYv3QORlrStSxYMguQrxwbPcTOQ85Z3O1QHqgy0lnjzl6AuFqfQbB1MM0w ddtlFjQBSgazskUi6Sry2FBtCmf0JOsKtJPaAqgtQ52Iz+o54tjvP7ifup1RpGznBFSxEZj3EJEG Mxh8vP0KvH8RcJ8tRd74RtYAxe56H5mdyijkm3qkiT9peBWnuvah/xtqXaIqkuAxk1E2WFQ4TlLP 3ovYar61wS4Kf+Vaie0csh6FkicR4Bj63g4wRiHJzGK6+xkE+iycTfENyvYmSElxv/QbznjtDPPg GRuwVH8TBzTSqdjS1LWxIqojsBS94uvbcEeKT5rseW6RgR1sVabT4IDPEiQ+QWSiP6A/cVJ7kKyR mQkZBEVP8/SImk4HRos2JaOgiy84DgYhsg96MGuBeBGsZC8UsDAUaFbWqjIX2n+z+hPZeA/700h6 zeUAPnvlskT4OllPrd+SyVk0n4ObMbRt8TmrVwTRkP8kjeTFjS/FeM2janzz9h2JXO3e50OJoLhY ZsJ7rH72FVEW4gI3SYMcs+XNlbdfbZhL1szFFgNI/3qn0EM7hXmusW4Espv7xBcCWtGradXj4dKV SomIg4ea92HxTAr9uJ/SxCwJmUzURHql7kw0xkFLSiXRbqHEpeZRfK6BnzfByXYhd2RkCBqcGA2e YuumuFQriS61AL7GH0Nq9bWHgD8fZMAiAWW6SZTAlBuTPAYNYxZOgs8g8uhnGBnOlc6AwTJTEHmp 7uAPnD8NcKgaIgVwofbYhRDDuAxqz+oVi3M43/vwC+3BxzcGHbzumrVt3doVmYMxtGaTYOXZRKDH RgvpGtQDNm/bkWhZ58UOgyl66WiPzsVpUoGmb+QCBnEWOZWzamQYZ5OiokkgF+bZQnVxoch36nQB ZCCn2M2S1yuvVQLx5QxIyxD1U/s8BYadexgJJqxntM/lZOlIpNjL4squBoLRlIJwiJT4DtPu+w60 ccZStFF0xq5aOaBPFQfZMS8jhrFXYcK0YXdC7eRlmsoDVuRihDELOrH9dNu+e1fbjjJJUEGewfU9 B43irXTXKwtZnHWLdg+A4IjCenAaXGoERPjGRg9BBWDs4aJ7yH/r6/e2b914V3+/Y3ainX3uUrSS DZD3hlue4IxgITUHXF9HbidFqbsIhMcwbufTuc6DR8fp8GGDylLFiayRBkknrQeokVZjvEV4hhqG KIEwlyc55FwPUefovDTnXQQrwYF23gM5+6cc8VTpG5AFdfCF5Ri4FnRw/RKtnMtBlfbqvMbDrahc rofW7r/nufYYlALHbOmyBe21b7i0LUOHXWDA1vFy5D3wqnOrvE5b2VPAC4dqKdmZy+Wo47CNY7N0 mizmnUp1egJI7tF1E7qQqDV7PWcZ9zvwvUU6UgcCq9kDW0qc6y+cWX43whjuh++t1vk0aBiuoTpk ShrRWgmpBRZ4TrHbLYeN6I1Og8Vvy9OwBYcLfvXy5aty/8cYM4uePaRE05NRUdGA+z8WKkB9xTLG 0SkanZ85qKNMYj/1xEJl1xxM3ulh6Ff8LJwP0+UryVB6+DtflVEr5Z1qT06QygebqbFZjHbHz3N9 V+dU94wIah3sZjYcx1oTxSF94L5noH081+36tPbq6y6BS74MhO9Iu+lb97dNLxk8Tm+XX3FeWwzV yuxC7JhONet2Gvveewmq5v2ryGDmJdn1AlZKbrPocgIO2rERXmsWVEQ5UnyOwTEDekCgnnGROzv4 Nx7+s6YqAVnjNcVAimdyjXg2CTA98/Sm9p3bHkvArFN21SsvaldefW4kBrdt3d2+8dW7sdn7eJ4Z 7XVvuKJdcvFZbTM1Lo88/Hz27yTs++VXnkeQPqd9955H2603P9B200RjweL57Xpev+6is/KZlaqu hkJOVjLFZgxzlFbhValkDHSSM6jtwOJ1gUQhRalBi0NzBA6OVq2drKLu3E04zTxrsoQGxIyvzZam WzwIk2VoaFPNhcrJmCSVkf/yfs98LxvEVhTSJkYCTBbpzmzHOGdzZjoXPlpOHe9BxF3tWuuUfK4s o8xvZa892/rCj8NdGTKdpIHGU5KnxX+vs6UKl1P3pT/CXKsnHyqdgFbQSHyXnlkf1Ce0g6mZCJgm 6Ie6DH/7nt3Sz+ay3ngeg2/BDb9i97mrw71g3aGtepZSp5GiKqCj3TErGdlQkVT/tpakUxnKTTEI GPzsIZDwkSzi62PgAOnXxQb7w1oHBYwIbwqC6CeV4tLgOxWYUgBBii/5PoACWbfKGFUGPHMj8i3C K5/bvcUfAdGhtktbfQAQNVlXwCff4z4YbKoT5vy5XgvFxvYx3lIyMgfxy/AZOAtDwaIuKkXIMhIi aFH7IOPr6JqJ6Rktf+bnJqPlesEOh2qSfaojXFTSytIJQMq0YIysk3A/60dBhbEgOqi3t5lMg3vF fep57Z+yZQKJM8gQRg6ZzwmgInJuM4OkjrgBZZdWL7OYDrSGlrAiSCuXi1aPYOAXtPmk2x0QDftu 6AmbcKoc0Jkgsgcxei6GUuKoyCYHqg4QN6bBHSpwdb4tXEwXRrmTGmQGTbRYIz6KA+mXv4v8Gc6O Ri9NZXhf2uwmqir+VkWptdCyvvw2aRZ1dkvreXoi36FS1QpTJpLoeyh6CEMnA+mCcXEb6bhBTGPW whwkx8q4u8mrkDHVxkHRO+7co8RK3RXfr1IcRuCmZpT4U+Kpipu8c6NYF0OE410AsZtOVufGRv2g OMiOsYiiaV2DFpEojY3jOs4cetDvh4ZSC0lHqaTMomARHiFSWgRJzHTmx/teArJ35WU2wxnL5647 d1VoDjHUSZfoIRWtJjJbOS8r2NAhSLU66yAUjBzEtTlz+Ggweb/GCjc1Riza0CpyEOyIZkvV0MDE qWGDjVBxPZkU/ClOycMgBWwXflVpnhS8GZxowPmvHIeSyTIdF/TUVLdzmIiViJO94GGfRiVuEoOm WigxPDqTpfRQihsa/6nITkolqOZFoNw8i5Sc0xzMrp+jFE2JMNr10WtqJHWM9xPI2XxpDvxV19/C +XPb7j1KmMl/x2nmmVNwVifNYBET9TofOtNlwzxe5FOS6mW+Eokzblto6POlz9zRdmzbye8NfByv 0fbGN1+JY7I0EoruAxHbwxxge17aHmdK5Ny9PUb2U5mmFJ/xt8bkuHtB3fZkX7psJmOhg1wnb61/ 10H43DqI7mme/6jdAHmJSIT78GT00aUJyTEup85CyXDceR591/A8+2GXgltbNqUTqZmL4uy5pXdC WXK+daBC4SFj4ch86hM3tz/6/S+2zbS31shNxfH54R97a/v5X3p/kD5rJeah2z7Ow1bXT9YZz6nb blBwLkjwWctW8JqZBCyo8iSgYB67Q5UaAj7Hwy8FxqJF/Mgg1HuLSgyrTLlE7WG4i85WAuFiJ2rz DARDGUuGTH6+Mm8e/EVrUupTB6NaIlemR+M8itN41qoKbueg1jN9Kvze8CnLSZw02eYd/dBkoDx4 pkLzyrr2RoMQOm0V3LgAhpqMIR2cqtY439256odzQIocGlNBywsVd2sOPEPdlzMAg5dgXAdHrqCu iVUdOkE/CL0X9bGrqJF0Maj8rd9+KPKDjt4CMgivvvZCdPPH2n2PPdpu+MIdPPNB1D0WEzhdHDtj 9iVok4fmy5A5M56Vn4/XlbXjWvNrKAivLq2pBCkAY6aSgTXeScELplBkKwIeipF2S8ctDmYFgSnO 0rGMPa/eDWZ9n336pfabv/pX7Ub0uU+dFoVu7axzzm6/9T9+rr3j3a/G8X4sNDDHcN78he3a118K IDK3feP+e9vzz73Ez09CTVrarn/j5e32Wx9u/8fP/y5Umcfzeoth3/imV7Xf+cN/C6q9NEWBWr44 W7m5Qi4V1k9BXZyj7tzmDruT7Jj52xQadjCLfyTQ6mBIpdrP8KWnsu6GPgHO6kTGKWhonWcW/Bw5 WsowUZbIONV5l9cwTHE63McGO+yB0B55r+dR7LUAXO7T8ZQa6flXihaeZ/kZ9z7xXP25y12s98Xd cR06IMmSaY6KdhEXM3bMZyjv3ODYPhaesQYryey49nm20DHZuzaj0Q+KZF2oNN2hk4JjQ5g8c1FQ rLGxaFeqnONk5lHU1L0pcGLNRzWxKT653OzEMPyfIIZjMV2KCtcLwJhMmXRYxgtQwzNMGk6ey/2c mR8cbdavPy9fOjVok5TNzTMXaFcFfyVFqu91UJUwfh2ZUk+bjtSW5F3ZjihahcZr8NZ7bOSey0ZM Jot2gkBYG5Az3PPf/7hmxBYAecawX7lXLpomU+wxt6kBYbjrdn41a5BzWOpaUWnLnypt/WROu4Nr g6qS7S3WRTL57Fnvc2QyVBSBPKjFBo0J+LsfagYpPU5C9+vn7uArWs3JvVddoOul6gXij0jh9TyW 5+HSCahbf/x/18xh6mAsWC9/E59MSp48Z19xiHSxC2gunLflUAWWLVoQFHQ1yIWTrPKH0fteitv2 HdgX7d+MF+O+h8pyD0BTnUMqoNLDpc6QBc2HRCOVB7WQxgPV1Ikp9xRpgIjiGnXO4AyQ5v3hXmuM TbG7sXWuk5YTkeDho9WqM+qCi3EvflI2mc6bVf1Oposjg2LhXDnm8scnkeZSD1Vg6oxj3XmDIKXy M01HZTISpdUGzWfFEa9FdMLDlNcMmq5BURIx1sAXCKCwu4UBFJbhAFs4Y/GPXGwX/UyQLcfjgHrZ olo6pvJtmQOfw83uYp3JgSCSZLDh2MUIabhSVT0lSF+UJihyku9qMZLBj4tQ6TGVIry/pQsXw0ud SuoKJQXmfTVZi3UXnNuuufxgGgd5fzqUhw7qTIhElxnzGRJMyGHS6DFvK5QMTJRdCGy2BAtwKOxK EaKbuHMYY/tyaOksiYKBvjMOs9TodQOniJNUUwoxMdyqW+AAiPwVYlU0m7R3Zy6UQ4wMma8+BJrA vGWdRD0lE8/6xWnTIOVPIa0xojpKvne8HFLXhxHwfvaDEoV7d+8PCjWHNRhaC/c2irGYjaKHh3CK JeJ4VnDj9fZT9f/s85tAH8co8p0TDrSpQpvAmJFRAcQo/tYFj+UQcg3Xl4EKDXsonjTg0Kj3cK2j gifDb/vm1+4B1XtAC9o3+bF29Suvau965+vbyjWLQuXy2ZRr24IDrqa3Y+9eVj5zPoWU1fHRdJsN moqOENTBNW8QIUrBIKatt4GHUnGMaclf9Zg9ht4g2vGt+dVkkfir4Ie/rcdwfDSQpnvTKOpEoZ/Z GwY0cbJNMcv9I0vGWDvPjz/1fLvx1gfaU48/3/aA4I0SrKwieJjL33//0W/gWItqlhLEiROH2i2M yZvfdllbdc4Svoe/SYF10vfc3F6e1wyP9+5+WkSzJNdbJDfNNLl2mTvtmAdfDmXshqtihGzJCOMg An0YBZDp7AvpcToo/uwYB7AOw0zpCPxMJH3Xnt3ROrfQeSbr+ADgwwmcLgMr9/RhePxR5yAT4dch vm8jINlxxjmQRsZZJ9Xkqbqr9iDV7ADp2HDP2SvyIYMyewizZ5w3KQ3hcOqsJy1f2bJ4J0ziNA9e fm/Q6jXE3ktlqGhmJd9YdD8djBwmBvQEUVEcwBYGlXTd9yxHFahbCFZroorqSk98yPJp+0ZUKQp/ /yRNYrZAkxgcyFPtvAtWoe98Hndzsn0JqsgjD6moMalddMk57QrUQ0J7MKXttTUoOso9wB9Q+uo4 J3pdXWOrs2KnJnA1bWdxdpVg1K4VJ7bk2Aw+S/bLYvugT+Hcss/NhgbRrDVqdsLnmgEIoN0TZf/G 177T97EF2CehvDzb7r7j8fZGCjTv/u7jBMNSwBqKPme1K6/iefjv5m8/yJm6J8958aXn4jyvav/9 v/49jrX727XhHj/SvvudB9vDDz7bzj1vBXaPoF4lCEEm/yvPpRB9zzfPDTNNPQjJr+NLFD0rqX/R uiQSynaVs1HeWf1ep7tkzqpOoigkjrdOcVLzCV9KtvbgZMQQeoYpPCOddD4rWQG7Kdod2K57vF9V lnnpPovMLxQ2qS6DUo9+g+dV/AXrKNgr1hXoXLuW9uN7pPPwECzGyfQc7i50/IDKLhmyRzYty95N MFChXKOeYSV36IMNNMaBI1+ywcrUHm178EWi1sG5Ib0pHPXwi6tHhftY4EhfqpxKm/ygRkaAbLdT x+GoCkasvXGyj46riKzOZTKizKM0Rs9nVZM8D0v+sVTMovzCvKZlOfekFF0JK4jmdwfPM86RyN72 gZXQLADHzzuJP5PgyO95j1JxnmUWUFtbV1n7OsMNOvi4BBOu82opboDU+xPoWHdwy89xhNPMh3me BlNhbFyKEDVENk0CtNFWumf3ch5Js03wKj0kVESen7HzrA2CD+2nviqAnciCd3tTNWNdHMN1xvfp xC1Fy3sXeODdhgNpbsRX1QZVpknH3fjP/X884KTATKm+BDRibU1hT0/ReYfRUSovSn8WsKTfWdmS osZq81yTu6ntmU2PGP0mnXtZBVNFydxMOl2HeOAZx2ZQRDIbusCCGCLRSO/ElIdp/W3QP6zwdaNk ATI5Hube+GwuLArkZ2uQdFpcIEERPYl87JqJLFwHz82bKNEnVs9R5yqUDQ96Jf2I8GaqyezDn+ko lNHJHAzczo4wuIQ8RxzIGIVCN7PB3HRc8UQi90rVpD03f6ZCP8kA8p8TYS1AnD/l4KID6WIrPtnQ lvQE16vW0+XEDTre1Xq4DrYomxhkJCNW/L8UTAaUrGI/uSJxUNi4poYToXk4pKpfA1CdJh08Dye/ NK7hsOcgIVAxSOG1OtN+L/LlQtF5ShGSwYabJE0mLGKwMNHxLUOpwTLd56IQqaqCVDd5Vc6rLuBz 6CSljTGFmtWNz4pbDyLmCSmjgZs+yB6GXgBPSnQgmrEc0NEzdjVzTxFgN6J24abtqAt2iFk1unV/ zoEoiPSYoQg2XMMMo1GrqK6HhZvBVBvrTo3ozI9Dl1ZJNXZxENygFtRUFz4Ry6pAlipiNgWHkLHY c2RPUAR56w62NjpZD64zQ01ruN7SLcTV5Tarae3zRX+Wv4vKNKktnDMfp3lxni3IDdccHweNZmyO BpmP35N7THrMg8wNqjSdEmLypzmUNm/a2T7/qVs4kHfzDteCiOj0HOBrzl4RY+w+lVueLl1mKWwf L2+TD9dxNJDxevPG1SovykWcPMYvqgqdamC3yqDVbjP+34JTHdFkI+RqowfseKcbaeffi4wk8Mz3 lVWqjFXtJ6+UIkf/c574yVDkqfSV1WczZ4jiNqhme9oDj25oD9z7VNuFtv48kM19FKIuIW2+dy+v jWPd55e/He/nN25rULApjFKtRXTYDEmlCbUFQxe06aQ6s3ZYH9NZUxrxaoKU6UpjFPeqe1ZnS9ks b8rAVNuiwS6kR9mmaj7jHtuLs7BH9Q4OlpGDqMzg4E+jzXzWTuxSd1rkn+aPlB2yFTgmHjravzgG 2IFIzCkFyj60LXNsBZ9oZ8XIGOhcc0D6FaUHniHNWnRQcBxzy7FLJRFY6Gs53YX8sieDWnkIFxrs ZYS3CjiowK9oBm6uaqrgg0QRptu8qKrESSkUO3+7MlMfU4FWOSF1uFe9xjSaw7zUXtqwNc/kcXjp Zee1s5cvb48++1z74mduY60aFM5ub37HK9rCReNdUcZgLAMZ1HBA2GNP+HEOSMfaq/qadOjlbvh1 nD0DStuFZ6K1BSUBmZoR10ov+I4DHjlB8dTiL+csUQGB99rd1c+Mk831t29xP7qPdaxzWuTvEepW dlIfcfstD/N9Nca5mGDhnNXL25PPv9Buu/l+rm3QOdre/ParoX6NtBc3QMmccBFym8UdTQOvGq0o knRbOaBwKao1W9cd6cyDZ632PwNSe62CnTqvoiTS14mvz9B6XmuL+f4Y9logIzUZOi48d6h+afzV A7fUJAhCFe/UWY5DbvbKMcOWqgMdiUzOnKh6MSUnDBoT7BT9L2dB6Ac6+9DkpGxYbM21j7oXk2Up e1KZaeeislRpXd+dHc+VrLR+juQf1oB4XvB8yQa7RjKGhegmwE6W1X/XvGctMz4CfLWmGEtf727h OingD4KLDcn9FF/jGM7YUa41PZlbizFxHLU9nQPsXp1h/RW8UO1y6hF4X6hrPGfpJReA4f1Yo9aq JjDPPGaWP70Y5P2XvGl8KveVtQ6e6nwvr93M4Uz9kZxbfa5zHXTtsSkGPRZs1jlZDmQC5e4zhT6R /V9nZzI/oe92gCrX0npIteVdOF/OYWUI6hnSit6ALeh5Le0J1Q5eJz1ISUkL1CefJMMIqq7NEsRK t+7xEoqQkup96utM1OLEWSjKkZ/hOkzwY6/5KcUfT3du1mW8u74H/D7rmt9Np1NlaC2dDlhAQQXo 2q5DZGakBrutwkTIUFRWOcGL6819lyxN7RtVaKYeYeK86HwOARE14ZiDRGouYqO2XXRgMsLcx6Fh SuJULyIJJysGR/rIsaTALY5T7eIoKRCF1DVUib5EGSMLV5Mj6XyS3GAWxng4oVWkcAIqSjW2MH1o GtwqbhZrd+QjL+MkGZGIsgibgyTEeMeJ5n78DAslXQRsDqPiuGoOitxGD4Gcqg5MOdyiIROawOF8 mgIpVDScag2txXadMubfSf+qDes9wd3zmtXVye6AvX26h6XRshtXp8WuVrzuIAVVu+G+GukbkXsP ieJ4nAFp0enTeZlyQj1flSrkaxrBgkCTRtVZGMOBjoPNZ27etjX6nzptHtKzWYjuKBehi0jD5DyP k2KKXjKdtgQjdBSnTQephRelzFyAIP47DHKbQ3/W7Gxo+Y05AkXDdNJ5EJU3dET9zPCgEjh56FZa bHCshsPctNdBkD7fP2oDIh3YUH2mJCUcdEyek44BSPNxinwm00BgPAU6aI/i4KoD7tgEleK5o7Zw Gi43d6uTZ5OctEU9Lp1Cg1xFFOG4R2ox0znhZKTYtaO1GlTH0zmdCz1mEs6y2RyfU158DAuvt+HD 5k1b8nzSaHTURJQPHTwalZ21Z9G9bg76w3buwsndvmNXPt+Nr7OtU3kSqpOBjY6ZUn1uVA3ptu27 kEbk9a57HeooKkinAMfC2Hzt3gfa3Wj/1mDn+GtrzyXj8Jrz0ao/kGK9GGFTmvL64IDPVXGBH+4j pV4eXhUwi8jr8A4dpsJ7Y424TgY5x2REpCo4/zqGrL84XFnvrBArvAn4YkSVw5K/yDwaqIiimu7U 2A585xQQxw8qYxhtefZ9aGWMsfQHu36aJRDNVV98oVrP3IOa4wZ8L4F4uh5rI8eN84nbmgupGYEz 7SE3F0qIB4rzMjpe6cPwoXVm45jqCBSPz3mUOyqPUjBhfIRAAxtkwOizu9cOc0AkaAWdkJdnVsHn NFvnZ1tIuhdb+fyGTdF+XkHx91zABgOu1JHkVC9d5emM4VyyGq7pAXOYh4xe5A95rpgoAzSCrqAq On3q/LJwdVariLoKxuRm6jRoA1XyqTExlSmf1QOFORbN8lRTbxxnJAiXLmNS36WME+eZ90ZWMwXj hWZrl822pGCN5zUAD+WLnxtEOg9p9hFHpx+4dQu838PcQKGrKGlXkHbVAZ3CPD/y4Ab0+f2eklzW ttrWzt0n/+Hb7eGHnsqeuBhe/Nvefk0F8VKDcnAW1cashFmAqt/gf/xMB8ZiT8EiHTaRd23KoPfu z2ZDbxRA0EnU7lazlXJkVCLw57F53IH7Vx5onEfHq59BeY/OCXtMvfpXXHMRwNJ81psFmDmG2Zfr 2hvedFXbhDJN8cpFAscIIta2WUiv/OOXvtMef8yfQyE5azW86ss5g6e28y9c3b59o460jYT8mgqN 5Kp2yWVnBXF27/rlkiqfxyxcBRPpMcEPddrOyLb1graJ95jd1aPujd10qPg+OJ8ZZ53KeEHlDGVe s2ML/EiRuU6F56JoKuvY7KF0K/89qIqkvbbtrHnd2FjxpvdQ17IZqtd69NO99QWM3XwUUlxXAnZH DbxP4mtgw+Uu+6xmk8yyOYdpjy61UlpBB7Wce53T8i/qvHVdVvBbErDT4MQWl9m9VAGY68nXeF5O jWwcz9WDrKg0uQ+goQpADm3NvbYDn8DCmQaF81Okj2ljKnvp+nQvVCG6diUgTg/cDNRjYwFHRLjt MVISpTlAa2K5evXTqIxEYBfReSkIIq5xOFTgqUWQnWqA4XMYLPrk+mfuU+fWtQFQZtYqbd7ZmwtA 0YvONQRgFVzn47od8U68hgCZPpV+SAIVMd2+z0vxqIJoz5x9nEFBnVmDOrfWZGnmZ4/PLQldxjnF qoyBVEA70zr/FmIfUZrYZnZkAWaJIE8GiErdUzWW82/HLIoj+o34ZbFHPFsAFP7t62bSsGroUBrf j/txXqLeoq85ZAL7eA/KM6LiJeVcYyF92TM0IEgC69qRlR2pP9ZBzVC1SSdevXf+Ts3JYZ1PHBl7 tc9kwHWCj7l4uYq80+M4ypNBXlwkh3V8MTBj0znwGaCdINaiZsvRQJ0H2j0PRyM81xTt8UGgh8qt GZWket6IrRP23RzWYEZfOouic4LkP/Eg4e6wtlId7oJ3weikutGDWBYSngnPQujpLu/RqE7yvAUT USuoTRfCQgZ6UAQpLm7aC3sAJmIxmilkwKphzxxRUeWXMqgmmzTwiTTlPrpwK72qZIy8Vp2EUEl0 ArUviZCL71Mb2ghZDpYGirEnqJGHrEHQIQsa7ybOnrLgjLFjcWvcqmNeocmRf8oCs0K8N+SY2BZZ HuW4pyK5Dp7wFLmGm1B0bCZNYE6g+23q0ftVLWMOn6tyQp6TxWgaMEWoPG/4sBYIGCWim206a8YI ncegE7lBUlzUG2l4OPtMbjQdMB0taS9ubhuzRAe8H8wam+M4wToEIvAWDqStr8Zvpjw0EVw3UQU9 KVAp81pPHDSiULog3QQ1Nd/VPMP1mMRhf3nJVlGEECeEsTZzEEPjOiA44bAPH4xDQwrFgAykoIU9 4880oPLshmf3wJaqozHWqfLDDkzdHwQ8NQeitdzLEQMIxlOlC7m71ntkwzMvcvPcM0ESTXUlIsaR IF22ffve9tlP38p+8g1mMiy4mIY29ivb2vOWt30U8ClXZCGk9C5pCqYfPZhSYIgigwfAHGkpovT8 O5JxyvWdJq0bZE45p0rxJ2s9IhAAAP/0SURBVJuR8bF4rhDMk0JOPe1b+8B9wRrhdaKCodpggJNl yvXV1LbGwAOqNElTcd2RAU9JbYuH3BhI+kycuD17LRRC8xd+9YU8l2th67axrD/X8mZ02KdSVDsD w6uTPJdi63WXrmlveccV7awVC5Gqmw/PfV4+zwyEh9rAjdRJDy7A/6moYa2JweYBDLz3Gt6ziAX3 tVf0GXpGNTjALrnudLpEZKUuMXczMbx7du1vG3CqvcYRWpabBl28YGGUEKbxPAaQkwjs3LfJ5KVu pFKRqbnwnDT74g8MXF3KjMcpg1Qd1CDNqnLoWBeikhjJVcO+cAaGrMzQxOA0qGH0uuMd6Z7xmbyp kGxh3Gq/PiDYJgAKcdFLqTWnjUoHULNfUespp62aYch15PpG6LylswZyvdhrHVH3mOMtBsJnBzhh +fgZB+n++vijz/M5FRAsXDSPAsDz20PPPNc+94lvs5b2MT6z2/s/+Pp27vkrox7jXKdTXfwJ0aKy gRlIx4srxamI2SzucHVnrb+to5GGZFCorZdD6u/S6TVvLoQuuunaU9Z5GsPIj9fp0K6k4Lp/GS/J Oebrbe9+Tfu1//yz7dvfuDO61atXL2sf+IE3Qte6qP3pH30e9HpPXrdo8bx28WVnty27drQvfeE7 PNdefjrS3g4v+7x1q/IoP/yj35NM2n13P5Kg8qKLz2nfj2zfohR0SuurID/BPveQlLhOpbVTMXDa MVFlbXEF7aVsVeskhYf9zM35CNRtkxi/Mnrx2svJ08oGke1rbJA99GPCg9W5Di+4NIR9gHI8RVRd X8UDH585hk06Rb3HeNu2YwcONgACe/mgyO0BAAZl1pJdkn9cEptgtKEoVJFd0e7Ssj71BPEAc49D l70En92hzpmbtY8N8NxFSi/paN/bHaSgtJ41GSvXFDvUl7imcNZ8VpWCTkExy1i4T/trh66Ek5Mm V01HJLT6eFhPk0JtswLet+NNgOkFRO41fhlefmkwpI9TaGv5EBljuddq7vSATkpuIalV3yASJ1Jf qGnt2aDFBn1cPOh4dyT7xGY8os7nFOusSmcxKM5/PYiqqGXiuoNfVpRA94ABla/1fWUztEAnlfXV hjBWQ/+BNH7BRuQM46wSWEmRZ+63/Jj4mNKvGKNpFHUXrUPRCeU0ay1r+zglYvsLga7sszVxvmY6 vpH3po3Vn1LjXHS5so4q9ijVC5Aykywu1LlygoviNqiuTdBHtSk5H9xPmfD4c3kmWShx8AcQoYp6 U2DKM5nP0U4ZADuGeLE0umBB7999IKiTm08uomL2UzgY5BROwvDvwBg+/cKmcAiXITkm33XDS7tB aCajv3p5VbXy3t1Epmo3WqwiV9aFsxsnPNxOnLn5cHIWUDznAX1aOoYHDQspaSEMjSijSiMaBp1y DyYjA6vtRSkqiMMYeJBrWHqXqCkYiEOHukOm0imf5wFoaioDx9N6L7gScXTSmEMCvhuBRXDw8H6c gmqioRKE9xE0jbEYoSNXpWQNAqrQ5YjGrafCkkring7gOJhsFiHTq47BigOeXcSzOB5HwymbO3+c Ire9jM2uoLTjHMiRtGKBVNRcKhHKQe2GkzcLRyKFJdz3OGi3EXQKRFD+0AEdk8fOAi0UtKd8PUB7 FJaDlPFSSznRmcj4CVFsBfRxatG7M6Fx9Fg1YHFcRYotiHNxSoGw8MAmP6IL8UdFNNlYcmXHGWON Y/iqLLZwpfAS/Nls3itKKu3IBihRGcC5m4umaQpZHU8cmXCgTBu6v93BPKsfpNqIjvFUFvxs5mO6 yI2HqcGWgLkLPFG9u8L387uARzpWok2gqD3NP3D9NXI6n6VlrXatQRGbNH626bQqqDNVJdduqCCP LFaKPEqdRHRcQ6GjdRDketeendAuykFz1bmJXVdTeF06XdnoRAQYx2UM9FKqR6GvdYCp87sAx8wg Nx0B9VryeZPaDZ+8td0GB7m+vPpxOJjntXe86xr4XrOC9GowjtrIw31skMlzKdEoN9c5qCr0Xrxr sQ3zdBAO9iEQVW2JtzF5ugG3xhKjSObkMEFyKAA80zEdFgedLzVbNeInbf0Lmi//3LWvLFO4dYzr Kaz5SZpwzJoFgqs0og1NQjWw2U8VOU+SQgZvf4waAJ1C9fBnz54H+jy9XXrhmrb+4pXhjZty2wuq /exzW9sTT26kgyBKIMzheajavOH1F7V1562MAyw9QnR6Khq9M1izqTLnvtIgIGdyNQERRKmkE3sN RFqGqzKF5mgEEY7oeImQmpnxgDQoPo6SC/c/xpoAd2knQatfePqZ9sQTz8cRP/e8s5FTW9HGyWCo 3rFPxQ/mfbrFvjN1XczSeRDq3FXzFdeySFAQIj9LiSsd4u6EexgFWe0OknYvnGMPYRtP+MgiUozp gH7FP+LnKRL39+EvKpDXnRIPO22qYArNWwyopKRpZ3UGjpE1kjplc7DjKmuQ6vaQG1FyChsl+j6Z 4iE7XB6lgPY4a6g0fnW+yVyiceszBFlzW0pr4aNHPVtYHy8+u4FCvk0e6VlLq89a1haD9v/5n9zQ Hnv0mSzEiy49p73lbVfluu4t/Qd7ERS1phxCG4tVE4qqUTlkoMgzWhRfVf2OUTmJo3aTdQ/GKZGO wy6xlkOnzSyCzgP/HUU5p2gHVYA6kiLa8jmD4vagaIrqRvxMruzsOSPtX/yr720/9JHvyZgYNM+n 8Zb2865IPlbnSp9x9dol7es33t3uu6cKHNesXdne9/2va2OAU2ZLROv/719diQ77pjznNNaxZ4Hq CwE1goayn1lTuija0ahMkK3z7HRtx36E/16NV4K4+XxRd5B2WAHWRGFqzp5uWbrD5lsKlawiPz9L W+hXaUVrt8iWpq7J+hPOJKVWk/nSxjhWBQRpXHzrXAL/kSWLQaxnpTGSf156ic62PLfnss85Wfur XZZjDR3VzxDFNhN2kjNEClu6y3JPSgGGR+/+5LlUeAhl0mxLMkMl4WbjJbCs/oC1HkTFVenRT0iA a2Tj1nT15TypLp4FjvXfawe9ikdTApGq04nAgJrh/GCE7IR7LRRJ9pB7UypcaHo6hYzF8XRt7X0W WEdREzOQ8LMcZ/ZNHDf9JBe+zp7rmOccMesbZzr4cZBqb90zMr1FuOlZAgoGO36GTiZTEDUm3nOk c7lVM5rZgxSf30Zb+jZRo4m/Vo5yUb2KapPw1YCmBzEORYrWE2SA4jp/aPKHOpT1Ma2twt8z+3CE a9NYBV+HPgycR8ePH8xrZiJDaq1Duv7SMM5MmWv0MHZFFS7PtMx9InjWAp1ljx41u84YQq0ZGytg MY3HyFCMoQLmea07YCxs9nILdOYxsvmLuJdZyYZQPKpE4iTHvZ4ssryKLbhHyGDpy9hgy2yfGaxJ 1MTMwC9O4xpkfUPX5ZxxvYUOxfPbb+SkRZ5mMoyyI+kk+skC9rB1YxhJBvIGwZNW4ODkIKxS/9A5 Llu3OgV0Qv0nMR4uTtv2OqZJXYiCsbCsiF9Im94ZGG4PeLUqffBjgSDCZIpzvQ9n2uYQFqctpLWz p4P/eaOnphm92kSkujbp0FZHHh4kjm/MX+eFVWTfCWTlGMTBHmI0HoH3zmIiq9IXJ8nJc0KM8nmv m+UozsCR3tVQgxXOVFI1hf4eMjVtRJuIWYWK0jE+TpRsJFt8suLxpWUvk2CRppHmTMbBwsZwkhmG HbSxFl0bwVD5vPVeN6c8a9svV7t4Dcm0KZUWdMEBKuapcn8pssGYorBRut0u+iq8FAeIAgOFOskg 4Py4OCJbyOclbc91pAI5tkMFtNfWsVYC0CHdzn0adCi7Zxth18cUgoMjpHtTEATKnLa8ILs+m2l9 x+3pFze1DbQH3wxFwoYYszGQIvZpDc0zJWXP+08oExaelwiDBs4zQKS9EBU5Zq5VUeBKWtdXSe0V whiOuMhUUDWDis4b08F2LmY4Z1WoekrtWnmtnfNTeqBFNaoItVLCoYxENF80waxFpchcOztBYQya NIyJYLme68M5TKtonQAO8VH3lulB3mMBobrFHorDV3HGqkg3SHMc2dIb3gA39TOfvg1DsZeXl0KI vLL3vu917ZWvviSHrc8j2htZLv6MQG9wHi0M2ksXTgPmuXBXDYyjyS56oVOVw7CoUSIkctqlL+wA IfbQ0y4sgOc8b854BXW5xzqtNe6l+KO+cGVydlMEeujgrgS4c+dJ78J4GbhnLyATGZmqKsCVD+6c 7CPo274dTWoyG97zkqXzaFS1NIGe1JuoBvCJZldE9x9/kpbvqKDoxKylyGsVxZp2oDSYOcwpatG0 vpUFuVtpkGSlvvtahG0MysgY+u1z5kJ5MjiEUxddfe7lEPe1C13ygxTGjmC0I/vIs+qMiH7sgrYz mbldwf3tBTR4/rkXg8pcdMEa7nWsLVwyP40n9lPkvY3r7KerouO7bNn8jIXBhk5P7druz3iQu+xc b0R3aXzkHLAXt9DW3rlasHAcB45uqAk8q2al/r/2QJwnflIIi4hcqRLUGhLFKjmq7ag8WXBpgDWX 9Tc2OjdggohZqcSknRYO/qT2EpJy+w/s5L5nEvBQ/Nk1lu3au+klgnScj4ULGMtRzgCUc0qJQ8ff Ggy14w8mqPN+UxxnIME96j88+dR60NxdfelPa2efvbQ9/vBz7TMf/wb3DPVr6tz2/u9/bVt51qKc P8UrFtwI43UiVbwdOcuD+48SHNE8auHs0PDi+GkTJjjTNdA7yDBs27IrtRhLkG40w+DhPYn1t2fn Ptb7PmTwyPiooS9AYCqcsdyKOo9Ux8XIN1qjUJ3zqoAshdxcTzrWPuoARK7mz2dMOB91hrYgtff0 Ey/mufXcliN7aj3IFz9zK46jFJKR9p73XUcgAeXDQI61Ygbk4AFAJfbvMjIxOshqpCd4Yv3PwNk+ dpx1DCVpoFZt4nMsjl+NHrjr+BQKNNr640SP2qpabN0x7uhkbGq+dJrrfDzzVWdmnDL+rzTqa9Um WfWy1+q0pU7KA8KzM68v8EM7WI3dijZUDmUpS2k7dZJTU8Iaj932DOOzRlXaSO1JOZk6RNoW14I2 UefLIMcVFWAkfOYqSKtsUFcCc9SHzxbdTHazHMH+IFkbefru0NbT8RozNdhYg9zqCl3BSALXPlDJ 1HjW8rPoKbOWVH2KnruZDvn6yZwW8i3vOes4jmeNrWdC7jHBjzdTgfOQwQ7lxf2uTK9+kxuIn4UH 3usZCnmtTJj36rmsH+XXUKyZJil8b8+I6TyXkpMvn3XnumpK/Gi1o33QsiVee+h+mdCk88IzVt57 AomySGEJxKZVfYcU36n4RPpYcsrnACDVmVpyvsrsavPNltfjF+M7PPhQ3qrAs/6cJPMBCIudziMz OPuwtek2G2ACUNMgI63US2HONSZ1K0okjI3+SdVmdY62YJO+QGcGlL3Krsg8GTClFi70yOLQ+5xB xQnaQieTsz4EpTx3miclBcYLnQg9+3QKYzHoHMbzF9LnhubDd5xD9z5loZLm4OHlrk2NXE2pGkyG RxclELz/eXzwTB7KgfYscQEdpRgpEQbvTnTd0WdHMkoCPV036NzKqfPhQiuRpsD7QhkJbaRS5iGI iFZ6INkWMykBF7OLrJsOF2F3gquoqkfeLgwG+CS0C8dhF41V/NK5taubyL2d1NKAIU5I6bZGR9Vq bOo4dQZMExcaUumlIOQ834TWtA4IkdJsonVRcjfHDg4Wi4+cSMdetRY7NIpCgKllIfvsLigj7EH6 SQOWVE0cvzpAUvyp0915b3G6nXDGJOnwbOLeEIc3nSCyqg6EVbUselU0Bjpl2TSIBTNjBoVY8pzR gA4Vx2ACR+XFjZsJgA7hXCxqo6vsumkL4CNQhPbyfHMqPcPnec/jduWEO7UB3fRP3XA7yiQH2tqz F7c1KtCkzXg1BzBdBHwZhz9FZH2TavwSYGggRW9F4ZMB7mkZ5zGWYPi+/vYO6kAodGUYr8GYSSeI U6IxcwMZ9afpSU6PmNZs7/y7ilUlH+l4hPKj4eC9KYzqIvjOxyyQMQMKL2wRigY1qceO9IpYhBLj AclmVbnD2oRCrl2T7gN4hyD7QyGkxY8GJzd+/X40gZ/I/dQIHyONvK697/tel4B196a9vTlOrVPv cf36l6Iqcsu37mtPIRW29tyV7af/+XvaylULsjbnoWIyyLKJWBoEyx28C8mwr3/l7iBu+/Yexgkd Jb19QfvA97+xXXbVWt5j+hKjaIrQweuFo9txYu+47RHQ9YdoALKxLVu+sP3YT70jGsVHDMhwkkX7 iFfDeTVAk8Ly8MPr22c++a12D5+3c9cBnIYZ7aqrzufZXtuufe0l4bw5VzrS8icfeeDR9umP39Qe oKvfihWL2i/+8g8QOECBSaHLyfDfdGDuuvPRdtON98DtfY79tjvIxhg2TJrB1a+5uF2NprLqKjrN zonqHA89+FT7o//+yfY8DX7e/M7r2r/+pQ8TANC0B3Wkr3zu1vbFz9/U9u062K6//lKCmrWpAVh3 /gqUds5K0GuXu0cfX9/+8St3tTtRiti6ZWf4lZddcU577/uvb69/8xWlPtG5sRPhYc76SsHrwPm+ v/jTL7Uvf+7mcNBf94ar2i/++x8C5UQDmgxFDtN+EGVF5EBKCVR1mjXIM51ugMlh+vBjG9oNX74T Lu99FMxtx4mb2q646tz2gQ9e35RwrA6SKjBZBDilPQJl4z/+x79iPJ5s733vde3/+pUfoih3PCpE n/jY7e2Tn7iJ2oAD7QMfeH37hV/6/lCccshok2g65IE8baAK5Iwu++iXAZwNYg6gquN6rgLaye1L n7utPfHYs/xsarservI73/ua7MTjAD1lr0pK1X+Len/thjvat755b1v//BbGd237uX/7/UHAzaao I59ElkABa24XB/Lv/fYn2hc/d1Obg4LP//UrP4pE3mvirD7x2Pr2+7/zyXbndx9pr3zVxe3n/92H oynt+XTTN+9pf/R7n0Kneld73wfe2H72596HIy8A4p6tNPaWTbvbx/766+2bX7+TedvRPvRDb2v/ 9pc/nE7GBoCbeiMcUbyF0ELuQAv7tpvv9aRhT17QvveDb4iKhMjm/fc+2T7+t99sd93+cM6YX/5/ fqS953tfxxlh8yO7tCrlqcQka5yz6y7UVr7xj3dy74/hkB/kHq8Peq50pzUUqSlIIFx2rZDqcnxd Iy6jmpSJ/6tv+8/TwTCOXDmVQyFof9eEk1lyZxVEDY5jydzqENbna2uHFuaudYObccbIn2mPPHcN 5r3HNLUzQ9l9zZJwNENhTRiNsKYInBSdNOdT1lYBddrtgCP6JDlD6jyIi+o6dK94X6GvDMBbObDd ze7DUQGhjlc18Kmakjj8BlUil6FqdJ6v5xf+gUCLtRHSCwXVzN5WIGHtwkDf7PfhXcdpP+Ns/9Mg p9eGTcxJzeHggKYo1XMsjnLtsaGwT4BmOAuH5mCzzNKEylATXCF+7c9QwoYv/QTHNWukxrQk6Prd xf+v91aRe3GNXVtR9PKz1U/vWbiaFOyDy47XTLduQufZS7geCUoLEPT9w6dU0BJwzcxUMuPVpTEI M8ZmL5kNaUbzAEpW07dhNH5F1ZedorGVz7d48ZK2BIbFKbKirjEXsr5E1px+Is9np1B7bgwZmSHI cVytS5uFH+MM2bXWUZjFetQnVNzDNSjNrPyM8tt80VSjiIiVq58sJNd9Cg9ojbMcUl+orJW82THS TjoBR2w9bLtkPmjQo/amS91CfduKxuoMqNSkX6n2xTCZwguq0p0Xo86xqUQXHDz+3I0VxDl8L4vS 5EIzKTiBpo6qiUhFPg7Y4JClyUSPogutrq+XG/fB0S7pONeAsjVVOFHFdyKLDF7vEDUgBsUvLYNt 1BOkm3tLoQX3L80gPNYUBZVT5x3oPI9wmHlve0HoDF5M6em4Z3PwqoM417mvvjmq0MY0EQcLP6+I 1M8Vna20qI6e83Y8VBKjK4s2CC6CEspjqq5vxc+rTeL9JCOosexSNX2SHKWgHKUOgjMp8gDRJTxN /hNdXkQGQiUSWzBXe2H5sYWaVlQYXcP83nT6cy9sbrfc+Uh7lDT+muXz2/lnr4pjnshVfcw8c3H9 J0EfKPkk0bvieQoh6eSnKAXx7wRNZhe6Qz1kJHJQdEMZlRbWsSm9pMsSSQ9WYXBERFwrBTcYs6A3 sRdaqzLMpYktXaEaEk1wGn1XtDhL59bP9wAYOpJG0ihpSaNvVaBsdlMV9o6qBslishwg+dDKfujo ncm0VNbiuec2t8+jnnCIrAeryR3Hc81s73jnq9oFF67CwFSbc9fjaZvqYFjuvfvp9oc4Bd/GsT5+ zPedak8+/kwckXPWLoKnPLt9iEP4KiTBlNISIXaTfuXL321/+D8+3Z4BWSz1g7q3B+9/tN1711Pt N/7rT7erXnU+GZMyotJhTjL3OsYf/bOvtG994x7S4nLCT6IG8TTOxQ660a1GXm+0ffifvRUnfV1l SUTzcSK/gazgb//Xj7UH7jdwGD7vNE7d4+0OHIZf+40fb6+9/iKej/3EOD6G0/erv/oXFLwp4QaS DDq8HWTx+EUro2TheG3kMz/+d7fisH+zbd+qGsVwXff75DjnX/j0ze3yV5zf3vuhN7a3UDC3+JwV WTNf/uQt7ZtfvonXoZ70mZPtbTh4jtHN37iv/Q/uc+fOUnLY+CKI7vxZ7XWvWxfDHjSaffjdu55p v/s/Ptduu+UBXmfRZR2aTzyKQ0WHvl/59Z9qH/yB68OZrPqEl9soZpdgS+rWH/zOp9sf/O7HWaOO JXQjilzf9d7XQjtZzeeoFlKHc+1Np6k7UCJzPmWPcj3Y77n98fY7v/WZ9u2b7ud11WbbrwcefJT1 8UD7P//DD7V3v/ea6KPnkORa//N/fgp+/zd41cH2qU+dwgG8tr36mnXtc5/9TvtPv/FxUGfH4VT7 i48eotju4vbKay8A3S26T1BO9kYKKXPoV7GY61Pn0DP0hRe2ls46v/OgfOzRF9vWzUrVHeEgXNN+ giBQ2bl9rO3KYkEpwYF3uL75zfsYn39o3+bv09QKZK09/mx74dnN7Zxzl7UlBO8/9pPvJqOxCltc 6iwP3v9M++Tff4Nx3Iizi3P+zKZQul7auBPpu4+1z37i63nWrZu2Ief4yvbKyy9qt93/QPvt//Qx 9tJ9mYPPMOzveu+14UyfSEF+nUGf4Lr/5df/kudynx1D0/rScsD4z/0mOOSXjqq67Z//zE044VuY o9H2fay/yy8/N87Gdrq5/t5/+4f2+U9/tc/RpPYUGZrDR68uhR0DJRx0+cgi9h/76xvbX//Zl9qz z6zn5zpSJ9vzz27JXhSBf+VrLm0f5PpKxJWtK9tnOjDFexWV5ef/1KGrnwSdM4D232SIU/jW105/ Uzmk2vCsRU1IObPDZw1ytb5NGk+dvdpkaUXS3aRzeJZxbmIzpZ1JFy35xOquGzoEa/442UbXp8FV NT7yHCvENJSO7gSmNqQ/a2VudTpDjK2XuFXzfP7I++jBhhf0shPdWPqZ6bN5v7HplSX3+6G4P5pH xRzJeOl4c6uMsfdeDmI01PUzfF8v+qy9Up9tNiyhQTLjNR2FFA9jWf/0ZylWjhM6ONbFuU8/DcQU pG7WnisfqxxUgSwcU7452f0YrxwHOXPXxyk/7H4C//YOhiPxzKqYuK38Y+ADpN7BNWLw0kkkaazC q6LLnjGrepEqlq6rV6vxnocTEfeeOz0nvndfbAkAGMcxQEpBTp9HgNJgpgqUyw9MliHIuvei0EEB c9I1TiN+IJh35oytByzQsvbHMC5FhYqzFHpdGhgF9KzMhF/pwGodSGzUUPEhnYeAywg4GsH8IoVP tpPm0yx2E/nTCRoDUp+JosTgn4hWz4i3LGVDuRylcQYupag0AuUc6EqCpQ0197GYFr6RYpEH68Gi 08F/1QmupE+8aZGstAE1GvKwVFFDR99UNgbCtPKw6EoNhGg30nHK1kkvENnuKZakYGJLsgTCdSxf IcY6bXKdaZ5F1FHEN8Ut/EwkRo5ppdVEw6sIJG2ApaXouXGxochC1DjpHZ2kHHTd+WAzmtaWE2vB 2Q4MqBGPUXtpbg+V9HOy8XQeh+rhESpeo69qQWLQ3dIgFdFIy1HuP81Peochi3CC7hhgyKCOUcFo GUVmoRRHTY7wFIoBcFujIepvEtHxZVAVzrvGinvz30k1E4WahlyLM5jKZiui+X24SKTNllDUKqJw iPsfhfJhcLJh09b21xwkd937RLsItPDVV5/frrj4/CDUu5GS8/3Or6O1jwg0zMasIyk/8iDtOmkh pQUhjr9Et0oN+zWxQQYHo2/Cit5FA0RXS9g9/HcNk6i+ht6NGBNQ/MrhWgO6Fl5nbywwGdlB58XI 3rWRQ8LAJEZTpNFW1mUo6n2VplSKKcFDfPahkry4YT5X1E2UuqztnPfq6EY1g0Ajm5fXieg9cJ/8 zIH+dKKtu/A8KCHXsnQVzEdnuSv+eOh8+1sPtv/8G3/THsKJrGub9kLGCMP/2CNP8echxmUE/eC1 7fWvvSIHt6j11792Fw7kP7QN61/on+V9iEgaxB7FAX64fZKW6+dfvDrcMoMNs0W33HF/+0+//rft 3nseHswgH6sBnNqeefJ5/qj80NqKVUujV+xhL4L8HVDu3/i1v25PPqH6ic/m57m+PECOEgw81T72 d99u17z6QpRC5sZhfBwE9pmnN/bXT4bfvLxdwP3MxG6MzZ4KtWRP+/3f/Tz0ghsZ0ZJBnDQJfXGc VtvwDtx2D74H7r63Pfnos+1Z5P7+/a/+WBtlnz7+qM/uXI4VLQOd8CefHkH+8GYcIxvWyMw2iCT9 j1P9iivXBYDQUXz4kRfab//Wp2gW8mAfBwMdqAosuONkxza9uL791Z9+uV3zqotSgGqWYgK55m6j ZY8N/vu/+Wr7iz//HO/RcSwK2EXsm7POWdr1jTshqjsLOX5j44aDuNQvVFy5446Hcfz+AT3ph3iR Fly6QDXikfL0wgsb2h/8/mfb/IWorZy1OPZ3N8h8KdK4BuFOc10lsTaD0P71X34Tx9qAxZ/LiT3Y NiNDV9zQAht0qmPfsUWCKDplOqOl8z/a9hw43F58sZr/mNj33Hng/qcZ70PM8Qh0kOtR2bgsjT0s 1NbmTYWm4nW/+Nnb26/9h48S/JWaiPM5haYzOkh336WSzp0cpLPbuovPRppySc6FAxSZ3sf+2bVr D6+Hd22nWxR03Muf/vi3aFZzS57RZ/IQHrF4+OCe9sd/8Hkc60f4uTSsOjQKMKnxd6+Z6buNToon obL4usnUrqxD7cMaGqw2zvWmHkR4bk1OVkib6Rq65PJL2/fxrMmOsv43UcN03z2Oe82TmcxVqxdX No/zZ4y6gLn8TKTud/7zPySzceTwvv56UeoRAvDDZJ1u42eHCG43tte+/rIEKdV0I7M+AUzEifKx smz62ul/5ydxkgY7m7fna3DHHYMe0hXwMPHasqehF+n08Tt5+HKyhyYecdM9y+z22L1d7fToLPn9 1Qo84ATZboOKoLHdWVRutvL2nf/r+/u5HmfNIjTtSXeKg8gOKdUczYXXlpN3xvaXY+WA+JT6CqxP nd44jKWUFT3tnO+dt5/rWqskqk0GXN+J88fXSNMxqElPCF8fP6fTYww2vdcejOSs9uzGZsZbSWa6 Rrc6C/ZR52fT6DDsPeYpyjeu32ccygqkIDD+Qp157jXH8ZB0CV4Xpz90lq6m4vkaND7hboKdUMsG ZzNzW7NfTx9vKl+6WadE+HFe0wU1wKo+XgVJTHzsg/SPE9AwrQ+V0xwlOfnxEi90+OXMS+lyvC2Y 7GBWAqT02uD6QXZhObDfp7NPp01fALgxp6iz+KWRCmYudKin90DG5x2aFXpvKsql7icBXmW4iy1R CkqZI8ZHXy/UFe7vBOt0smvSe2BdCloMDnYFbmfGZxinqYMk0YRWplFXd0LckFI1RGQl6yujdjic r+LnJmUnF9K12wPHcBRZKN68iObho/Du2D8ntukEF29MSN0J8vC1EE8HwwjkwP494ePopJpudeUo VafBd+HoEB20Ih+OVi1yAgLpK70IwOr2YzjDclGnWHDjhBm1pSWqTz+kjixMqgLH0tQWCbQAZECj a0Hb1lVnXXQu6Z8c+lUJqsHQIXFULSIMahiujc51Ics6sa5HJdB20QQjElwWnzBJBgr3Pfpc+KlX UA1+1qrlVYSiQybqgzG17aj7u7oGGfHKie1C7tlV2Uv5ilaw1dZx1mNiEgx4B7WHPMiGGLAWkM80 izbdVuLacMQ5GTpVeR8pZu0L7RSVts54jZctsot/ZnHimEVKoNnyZuUh61ibrrnrvkdJRz/fFlC8 +dY3XNkupnlCOmyxllxDdqn0y/ErvVU5u/1oSeU568tIkc/VQMRI8Hu57UO0XIayG9cYogpqhmcV va+ArLhvSdt0ntqErm8MRw1kD+Qnvs+aUDw/PLcyLMMfN56oyLQ0HCo+fObDNTcENzF2bG6zDqLV 3IeAvAU7swjgVMg481Va495KdTsDZX3keVLZt4a/Whq6SgXpgLy+XUrBV8T3GRcb1Mwnq3DHbQ+1 //Qf/5oGHDoFVdBy8aXr2rvec220dm+/7UF+ZsGqNJc6XDX+L6zf0v78j27Asd7Q3zcFusDV7e3v enXQ7Ju/dWeu9Si82J079rXxsyksxao+DCL4W//v3+FYP+DqyWsuoBnR2979qrzWjnXl0JY+vPZC 51rlk7/9i690x7oKxq4CGX0393nXnU+0r/3jd1mzx0DuXuS1++AsLwyv9XEQTtH9WiUNFBHNYNBc 0Tzn9ZMfvxk+682OeD530eJF7Qd++K3h9H720ze1O24VhZzc1p5/dgKDRx98qP39X34m+/d6tMJ3 putlpZDnL5qDisWcdgut5u++S+dUDmOtE4OL1bROl+Ob4jrQts999rvcew8wcGCve91V7b0fuB6n ekf7q49+kYZEmwkYnk83vwuoV5mqjGgPFCMfxQHxVagOUhT27vY+Kktx9trz2r/5pR9Eom1N8Y+z Vsvg+q9hVQa1yfmqUhNykVu2Q+G4CcfaIKsO7UsuP6e9nm6He/ccal/+/F04hzvbRmgiu3ccaW+8 fnWKxx/avx60tboM+rUEHvmaNSvaDV+8s913rxmDakjhl7Z7DQ2o5s9a0I5Ng5bj5rCQLVkd7ZI3 xGyw3o/oLBOsb0TGcvPmXfw2L07wfhhbIzp81TVXth/8yBvhPVtjUiCC6V+TjP/4pe++zLEu3f9X vury9oa3XNVu/NrdrMF6zkirYQOkXk2lHmQvdTyPs48CL/J50o6cu4ehC/3NR7+K/RmCGFHzhdCZ FoAe35Kgtt7jPFCkyPwIigzOjPtGmb1nn7aZkWvmVIr1L4ECpPrTIYpCt6BLX2oX1oAgtQnn22sp yffBH3wz9JPVVUTGcD7zlOi9v3edHW/nkZW69IpzC3kmczMun5Sg7s//+Ib2F3/yhdS5+LmzqN15 13tf1xZRB/Dxv/4GwdFuZybrIvaLNRZwZvhy0ZQ/kDnQCc5p3p2niZd1MMHvh9/FmnWnb1h/Qfz6 a7Sjla0rlDYG3XWZ9SDgU6o4ros0StG5dnQCoJSzo+MUMMv1HceqCrD9DHW39x3QQdTp7eodwYGG M6A43QJPJZVWfsDL6Q+pr8n9FqBR/66dNDir/Ylyjnr/CabkLAvu8NPyBQpJ75eIv3P8OKprAme9 RsozK83TDJByfhokVN1TnkjkXG52bLEPUnNy5p7yr/wk06bfMXRe9D48/3rQkVPPMy4vFoSqv8Pn 9qree7LqPUOFLTaPqqCCHUmzVzOmqgLZklzVDs6h9NgQgqt7qZ1ff+e4E/UOX1t0nr3nY6kSkhuw aLwAMT0Xi7xPA5wIPrnnHT/dKD9a5z+UHVH5oAUGSoXKS0+O+ACovP6a82aRf4Gx0mYBEQV1PSe5 1ggF1QKFnv+q30m1TOYhNU4lT5y57mPmvJgdjwNvLZ/MCrnZfI7XOElE4FkvbdqgI527+ZqOcl58 vsxBAQpDrdzU7SCIPuAoNzJOoZnV4cp7FYkc+T2Q57FZVU076AzugV97APRBjpiDOo302qSDxb9U L9v0t8ZlPmiTRXsu7n3w61yE3qhdyBz3VKTmc+U1n247tpueLoUPdWTTlpM3BXqP09R1pcN7qgIL kQ2LH4yUdGiKaqJfKyJZUWKQ66Q9Kv0QykWsixMpGb34golIUmVtNbzVq7UQHXiffYj4KmLxotXt UeTqiAWgDIYOtI69sar0kCNUlaYIgvfIB3I61cWW076Xltj7UGGJgySHL+kc1UYKrfJ+Z+K4HmTS pvO37502DWTTKI5/60wnVRHeuCmf4ns7/mmnbjGfHaXU2+b5o+ARo+Vmrk5MRqsZG+49tBMNcbhT VcBRCYoycn5vEJT25Eq5WZznM/Ga/QZeBD06jFZ2b9y0K4V+ryTleR0Fd1ddAv2ABb1jx84gPhbC +v6Bmy6HvlrAF40iyg6OhikZO/3FQNuytuYxvLNseF6sw+/7slFYJwkkNCa1FmLAjFA7jSNoSoo7 ypMfnPNydAY0x0NCmSSdZkV2BspTl/pTKon7NwsRZ56bTptUqR/eXw+wKu1IIQ7yeXLtp4FIpyGQ a4XAxhTXcMx5kKf5DD9xPFyHX7vhbjjJqieUA+q6u+JKeJrvf134eyfg37oe3TPPPL2h/S584Uce Gpyp1l5z3RXt1//fn24X4pg99KDXKQRLZEgJO42OXM4vfeH29p3bdbwrAL3o4rXt//ebP95e9epL k8K/+Vt35LNrT7lnKHgjjf/Hf/A5HHr5o3V/l16+jvf9ZLuSLMV/+OU/5ic6Fo4ZfNOFc2KsReNv uenB9o2v+r5ySs5eu6b9n7/yw1BdXtn+62/+Q/u6znUdbZlHy6K28HkP0aVO7pxjNpOA7iqQcLNv zvv9Dz/dPvUP32LOTMMrMznSfvQn3t3+9S9+AKdnLkVs8yku29C2b9uc+pGf+8UfaLd+62I4rl9o //C3X6QL3iNtJ81q6llOtXPPhcNH9fm34LQeQvu/gpuag3kUrY3D0d610+Y289oTT+1o37754awZ HanLmaP/+J9/ur3x2qvb42QC7vjOA+2u72wM4p1iUg89U+4UOHqwjwIiPP7E+vY/4QWvf+45rqGt wKGiGc6//oUPt+99z/UplBYJizPTYaM62IcDtlKWGnfpFxs37Gy331yKFI7XlVdf0v7zb/1kexWa zJtoG//4wy+B6G7PXlswf2lbNP8cXkfnxI33Y5v29WedjCO6uD0Lvesv/vorZKf28nPUCnJcnyJ4 0fGG5yz+ROCfHgDqzNvNzq3pK93PFDpHHQXg48i+jSDezlEdvrX+T8KfX9n+zf/xAbo0XlBBGJky dhiFobvbP97wXTjTn8QBtWtjFUa+9e3Xtd/8bz+bdXXbLff351TS0QL62TkvtFm7KWR8GlraMHcW 52rfP/5XX2PPrOfH5ah7zfPOX90O7T/S/ubPvgyH2QBnmPPJbd68cdZaZfLqrifB136B9aRD7IQc I7uwkr1zVtbrMezhHmz8GVCj3wJ74ppXvYLM03U5qFUIOXTicLufmoqjgFFDkHoltKW1dGxUOzc2 mXPly1+5vf0piPoRNO1dZ2aVf/Kfv6/93C+8H9rW0+2v/uQrw4dE9m+cdV4Fd+Venslu6AH1752f OAXDXExcYgJkCM2orOmEc51R0NZ6Fg+/8/fJSuusYws9Iz2oRUV1uHWWPE96Wn2CQuK5yM+Ua60+ EwARKEFYmJb6odAlyhkOZ7zXOZnR1N7G5eX91aWvlDI6XpJ7HigYoU32Ar16yqIxvJzKEsQ+n6VZ 10nsNijATFECMh86YMyljvyI3YQ9p63N4vONx8xMKqmopnT5JjqwXqyPczKm3ZFOEFCgZH3VWL98 fDLcvN+25XHNEyCVUx4wT+ApBclFV4j8bJxsX1Pypzq9p0GY7ZxoZt4xitdhABHHvNgFyThF057v q4wozm6NWBmg4h7kJiurmwU1hAH9EXpw7ftT8Mk8ureV6Dwep73A2oCCPLryjAkEnNHQgTr9JShz yeSOjRDIE8ikg7ZzQSfc6mZZAJgFvV7Bs1t1lDQYSiZAFB8N7vgzAsKd2RB3rublzB6o+oE0hAP8 CxDrCwKSdRUvxyDZGOYi/qG/PkNRRi2E6CEyeKbOac/JgSSanOpbPlykeMqUPfHmZ8AbdtA3bdqR g9WrzZs3mu5Z0j8sdDvIYa/Oo6mucTb+OAegLSHHRhCJ79WgXlcnwkEUFRfJldqQgqXwbCuSHQG1 SJfH6EJTaUqK2ohKnq8DGwF4Rb7D85b/6+tMPbqYauCGxRCHLamkcsCGZi0ue9FaJ8tUSiqcjXy4 f51Fi6SOHi0HqZwo560qWA8FxbWDEqg+rzWyUf1gFqlNJ86D0NSQq30FOq4u1K0c3k6axY0XkRp2 lhegyesEulRF/i1o8r1uYGkHjpfjEF5yT9dowFyk1a2s71efzc3PLYZjbbV7DJo0mSrgqPRHBSqO /xE2qp89cMmk2GjcRGUUcjcSrehbDrQbgfGCJhFOvA6raiUsNsfAqnmNVxpc8LnLly1ql148v11+ 0bm1yflE3+e92zDA4oQKmIiSKQbzMFZX3bmOLGSc6M5jYjqrSFFahgS3uN4Tc5zZdo5qr/eiUooD k+6qtaHjEf1UNwOIYzQz03WobMJg8+pSQ2CnZJuZjTOHi7/X1k8iVW2hp1QbHcDi03WNaCvGleNx H2nwg1yUYfL5joJEuZxmoeBxxrlWL9XDhGAOxYKHH3q+3fClO1IMW2l4aFIUM30fqPXK1QuTCXJO 076d8fg8POKvf02EuRzks85e3f7Vz38ABPUSeJhPQs94KT/385T8U7nA+9qJUoLc2+HAdu+9DSf3 0ivPpavaPpwMs0j+mdYuA/lc0Lvl3fiNe0H3bu33P6ktZb7/1S98AA7zK+LMPBGKRT210pMrVy0J Crd56472za/e1R01EVVQ4zde2V77usvZG+q9a+D9vFPtgotWteUgiX69sH4rxXhSEuprIY2HLgW5 jiQV83DrzQ+1557xGcthv+IV69oH4Jz6PPsJYi++5Gycn+U4Qy+2Zym4tKDy1//LzwTx+7M/+nRb /6zBh/NRwabO1O03PdAl02wsYMAXd7GtXrUQ9Qi0rCnyU3rwzjufAvXvn81B9q73XNdec+3FCeB2 U/h3gM/3npbyWctXLsy1nAfXmYfBTjJYf/B7n8FJFOlPCTJ/SobUYj2r+w8TCLm4Q7lgvcWcCXl6 EHWpLteWGQ+DmYfufx4qhzzmOkjeQTbhbW+8lu+Yg9O7EtQ79nbkXbJyHnfnoX0aqcPNAU8yDsqn Lpodbvx3CRB0bCu1XQ7myjUL21yc1TiTHobuMZqHFAVAh5p7NNXMvUYmUWd5q4oljkePEHjvNBCg N37P1TidcLc5G0TWd+zYzDM8SxbjboK7e5g3n8WDU7m6C9u/p8jymksubLfc9WB7Fr517aMTyG3N i3KI3WDd9y8RHG6Gh1+fd6otpvvw3fCSb/iSyLTWsvbWFGzQYlD6b371bjIVZiBs3CMgUynjxTir o2SapEl5OItc3n/fU9VBL19T24UXnQNViZoSs3rYN8GIuq9ylrz3MQq/v/8H3wJdY2WcSc+DPcz/ wxTo1peBfNG25kAD2U+thbU1Zpc++r++0PnulUX58A+/neDxgxQnj0H3ep4z1qCozj7vYw7n81Bj 5M/O0B76R/2Tv4Z7/Ke/q0xgdwK7xxqHOQ5o/T3Iodbu6P/n2eN7tY3qpMdpFaFUO7ocP+1jfuhb DL50WAQ+lEPjPZFk5ddBNPlnlI1wCmO74yeYKS/aiedWqTkVneF/D2qKXqAtLkAp9QUCX/3zzzx1 ASxxyjzLRKnt9Mfrk0E1E9HPC+25Wt7lWfE/zm1pP/oRopwWwwXVZB1mHIPDdEQ+91hBzVDLU/dT r6matY5o9/Xj7wPkOZdyifu1ovST1xc4FZqJ6ikdlPKcqmmpDHSUVmz85igFbCzRhlAk82yFig/A ZpzRXDguS92X3/DaZLvzw6ofi/XtTruvs6B4Cpx9524m19TfSADCLQmRWX+WLAZOv3KJCWz8L47+ QP2xg2rVPAXpD6ItA6EKHePXmK3CFpuRdB4ORpZT5TOLSLm26m92sha0BBxMUWcHFoeVn6ZmjlHm wLVbbIUCG+3bAqiJXYleP7+WHuJ6m9WV2kKRdgda7GrluXN+8JDGAAd4OlrMOMWzQRZd8lac7gQ5 0NkaheMi8rIB5/p5DJYavaYyR0BaD2IsD4JO752K7JWHvZxSpVEmUYXOg4ef2aWYggDzMx0JnZKk VXGgq7uR1bfyeLhhrq0k1Qlb+sagiWSqjEGkry4y10gjEiMaPivUEn4eTWbTiVk61U3OhVBUkoq2 XGTVxpMjhb8PQN0QActGMCKNZqIFZ0ovxSrFwGWT842DeDRtpLmXdJc6HEfF+5nl58W+Veem6JLO rfEo/UtjIFCpcJNHk1o9yvuDiNveW963Thuph2mnpeCUsxz6iotXtQY5xUbqoUrXRpwoluDqFcUV zaVa0NYBoYPuQTcFJCm0GmUWWXDj48iSSZ+Q4sK1DS7ywbxXaaHDICtpEy7NQsk1r8VrPViUnVLj cWy0xNaVulE+7nxQl4ULFuS+drCGXNBLFy4OWrqd1OVheKhK9VnZ7kI+yb0dZlyDAGuM2PvZXNnI biiM3SBT6NNolDQoGkv/yyFQdKFUFuvcEvQU91NjXhs3Ro45cr0naLKquRu5Qfy/nOsqdEhwgclI NbSfFSCIg8BAhnXrmnNdpOMhWrPuG4Myx2aoeHfM/IX3KZdLANnbGAW9rq86YI5hOP33QZRZbqCD 2yMPDUidvz0BsrYKZ/nSGCjXpWnzeagfPPvsS+2LoM9HDotoqcAwI87UhZesbM89/yLFgQ9TBKWD UavfGog1a5YmgFXt4IXndAzra5S1cM2rcQx5Jtfg+RQLrj3vgnb2Oava+z90fbj3G6E63AD/9WAU duoZ3oWqxPVvvCzjuh41hxexEXXQn6D1+1z4o8iEQWnZtmVvOLZ1L661UbrPnZ39YdB9AanydRee n6YZ3/9DrwfBNNg8kXbZuykIGxyVs85amiDDiu19ew/CS3+Kz65UuU2o3vimK9tynGClI6UrzWD9 jeMMOz7KNz2AMsPr33RF++Ef+x6c/9H2Jzi3L6wvPrfG8SXkzR7E4TlGN9OFS1ck6H2RAjW/zqNY 7oJ1dNpj724jG/PgA0+xVQyCkBsFTLj6lRfiss1uL+18sf3ln36Be5cjPA0Kwysp8FybI86DxwJG g+S/+cuvgJ5/paPyhcz6dQAd7adQLrnuusuD+FdWyTUMUqJ1z0HQ/4Qbb50BARP7647bHu3Xa6hn jIOorsnrn3j2ifbfQMifRp/bZ33NtaimMI57D+1JanQ9QYwV+Y6TB5O0lgfvfTqFseesvSAB4WN0 HBTsOYs1ZMbT6ybY1b7G4SoJNuW8LBgvJ4zQheXwEupBFioOTmDt2Untztsfa//yJ383/EmD7y2c MwYHdgeuOS8JylkANv+MRitXXn1eO3hyf3uSLoc7cNiHdbEKbv9yaETyKxXX3rZpT9Drcq7th3C0 fenztzPXL0E3WkEWYi4Flc+GdvcUmY0t0GlOYKPOO39duuluekk9bmQHcdrNzOk0G0Tv3nMAmtJ6 7r3QRjMllxIIef/K06awPkXjNZfl7J1or7r2yjSNiW/Ca2xksZlM3zMEfHWPJ9rS5Uva+ResjN2J U8qLb/v2Q+1WMj4VfJ1ol0D3+pl/+d62aunStmn7du79xf4ZjtX0toK50Q7X+VuOVJym7rBMONr6 GN1pPkOPG4oPy1GfoE3Egg1P1J+t0y/KMdMTLgqHnxlgJw6oS6OKyOOsdP31ATBJTQuvHUXDWKfO DJdp/2PHOVN4bTLH3PcxpFprPHT+ylGMAxRKaGW0poJ4R+Wjr7sBmc79JGPpAxcNZnBkBwd7eO3w fTntJY2qQlLUrULb5FlFwfkMeeORidNZhAp0EL/Azx5XHQnlnNSEQXELt57zPWMjD9sgtdtA7zt0 xe7Y1mSVk5dss3vEYITpGAOgiOOXiXA+6ywc1r+rLWi+x5xUSsCKNKDSVgTBLbtbPO9agyG+4BHL +S4ZW/nw3Ldz1p3vUIv9WFkBmYNaCDqp0y3Y1PHNXRSSrVyfq0ctfwPv1BolSMHXiy+n02rdnl28 BQqZZ+a91FNqncTH4VqRXoSKqq20dCa0y5zZApLWn9Uamawjr6oXwJd8WLW7PXs95xLsS2NmfZp5 T7A0AGD6ZclIVGZ3CIA8A+0+OjLCXNtAy0P3BOwL2QP8zs69pwLmlm9agUEFGFNtkqHTo/N1EqPx 6PObo+axhMN3LhX+IsMesFNJX+6kGG8OE3vWygV84CR0Q/ek09IeeC46aeM4F0Ys8zFWUiN20iTl EAj3Pvh7qhPMJUWlAztLyTwOzMk0LHFViPx5czp03pqOifJ+fp7yZSlW5GFcnDrOOumTiehdxE6w KXQ75WlE5DdPpoBlBsWAiWCINNTslq4x0FoOHbS4Ameag9YF/jjp9Keef6lde/WFtK0eaydN8bho WIQlvVeFDN6rEyDasB+jaxOLoyyAEYyjjpWGVKdnLwM8CwfETeA9pGUwA3PggGhtVa+filxWBRI6 VJaLaiy81+NcJ813vD7O+1iKxwrNsnAtSIRcO7SnPUzdaDOg5rjxde7lqQfxjfFxA9ThJfXkENdz 4ply0GKWZ+TN6KzJfxoQHRxRfx2kQfVFo+TiD6INDz2OvpGcC180LwhG5zJnsxdnK4oivNbunAYE DqoNTTTuFjKeSvEGAYiIvIZGRC7Ig68th9ogS6Pp50fdJba7EC8daHmVbjyNq++Rk5jgABqNgYtj HWed6yd4k9etMTENxXV0Hibk/9zEHWl2E/plQacGzs0oD1CurQbGQDJ3yT3pTInOSN1x/nVMfMak vzQsqiJosPiZqdGkwHj3GPJb46GFDFkWD2OvM709eN8zcGK/U5mYpKYLeVixalFbs5omJeylQ+kS WajffaiDKCk2GFgP1muuuyDUIVtz63zrsA/o3YLFcxK87ENyUidY5Kzug5bu7HuL29IBlPl+x7te 1S679GwQyvEgZM7nI6Dqd39X/q1zeAKUbFmUFBbYYIrsw6aN2IXdOlCFei3F2VkYhJPMF8Vs23Gw 63cnCQ7GoAQszPOpYf3a11/aVv3ZvwsffSGoqfJH2FX42S9WJqgb1XUXr8prpKMdOURWCNWQOvZF yue0a0COlddzrdr96xRj6SE+BGDWO+yzwRXNa97ytqvbLTc+gMOlg+LaOtXuRebs0CEbYM1qbwFV 3QHX/MXnN+SZV+HYy98TOdsNyqrO8DD2c5EuNDC/6fa72h//0Wfapz/xNebpIJSZV7Qf+fF3YQfH 0OI+mIZIOw/ua5/62LdRv/gY87mTMWfsz15JALInKKRKE/fe80T4uQN6koZQiQ+rW+gETS0Hc+31 bVtpbvOCRYOOR601EfxbvvtA+93f/lT7AhJ/Zgcuv/Kq9lP//N3YZzq1mo0jENm62WfJER3bdMtN D2ccpqHmZCfCzTi9jzyEuguFgWvOXhYELGoA7k8P4IhEY9dTiCach02QnmZhMeQ19bPtWjqsRT9L 2/U0drgc/squDfdQTvVQzHsc2siV7Z04pyPsLXXEzZJYcDsg4SvIkMxHF9wNqov/0uat2Yv1exQ4 WEcW4nvNd73vtaF16Fxrc++56/EUn86YMdbe9D1XhSq06aUX43gvXjo/Qatgg/r0258kKH3eALKc 54XQgy6+5KyggIWgVmfZYV24T0bHZrd385lnrVrWDsiZ1iviz3Ool2wJH9s9eLydDyc/sovInAoe 7CC7dMMXb+e+3VOlX/wOgllbpav5b3D59FOuTb/oHMs5ezYKODoWOn+D8pTN19IK3nnh1iJR1x26 gQ4xoKaxwaEW/lPnO46eK01HsafdC8DW9vesqGeU4ITIr5aca3g+Os9BWaN9f0bC1rPE4n0SNBlN m4QoiqO9yP3Z7SkOeoEn3R3sYIl2Wmk0aHLWJ+k8EbTqWEWRxnOON3u+JUPMjUWAoCubvRzBjoSk cyZFQVBKVS210HlPegFQBxUlE2e1RxlF/etBCJ9kHONrBQYLgfc91SJ+Sq/B8QRI63HBHmlzMZNy kjnfRYkTANQp2OOeuJM+iXRONebj6Poeeyk4nT2AiRPb16SBQEBCKaECsZ7VAYfclxZblmKLczFk d1UyKsqrWYVOLYlTbiDjPdXVE9zwc4g83Ev5C1GHSeDRO8729T3NRmxmGMlMTrORmDROneGe+Y1v wQPMMLMcRaFCuNPwrtN8jrPHy0dBClOfifcKmszEfqeTrKAkn+GcT0WowcZdp9I1GRAQu1YOc+dU D7J7ocH2M0G+HU82fF9z7HrT6a4xTQ+BgvFj81xzoa7mXGF9WISbNzJPC+fNjh7xPg5qK+O3I21l q+81y0mtUVFtdGMxVbro2braD+D3RkJOzF46Zz1LUYfp9qVw37ZyAO3nQZaBOi2ZvwhUYH6bz/ss uIqyBe+vZgQqUeAYSTfASGcxMkgn7OLHvagzLYXiiIYMOkpaq/N4crEVBDddOoLmtq0zhwY0aZmM A+7BqNC3TqH/PhjtYB1YC1dPInnEoQqHcgz1DgfjOTphrecZLqQwSofY6xnRBBHH+SzOaG2eFAZm IRtFVpGjK80BtyhAqT0BaJ3txfD+1C+1S+B2gpADICbatHHR/pFejcr7adzGsxc9QDrECTilRslB GPgw0XODiziZRnRSB5hQUyAaH50+20bTHTxOhA6dC9PrpXJXQ+ZGMFUbrlQVJaZogA1jFGka158P RsLn5+lBVShQ5NmPTvHwcrEVMpsiUg2DaHJPrQ1R5oAOawhc6JVqqfdIv/GeRPwMmqpTXqERg7Pu ZteiGPA5h3abGiJ1n73kvc4UzjghGsiIyHcjN4X1mNNDR9brmS0xAOjv9/qJdI2gPdzD42dM2RiR A/RwMOAjUPGBdcK9hgeKv7NFbzikoWVYvS5a0KkkrDmNpQai2qVzzxYjcZ/TqYTP3Ohou0eV/LNe IFxd0/tUmRMg3kDx1uMUg9ZBWlG5a3nXjgNc73SbTcfDqow+Gm3dm2+6L41LyvGcHLrEUpwBgzCp SjtpkOHYDQfmeaSkF+AMGPiZprcDXjkBrjf5ytYfIEeHY656wrpL1uSQT9EG/z1wz1MdUdTpwRng kD9r7dIYFa/z4oZtPL8OTKGFi5bOhSNOfQKc0p279oWOVJ9H0TLXnzefzIlBHOvDgPQCrjekBeXi P4sushSBQglLwvBiCoGlUTk/CWxp/DI4OuocyynXGffAtXh2P1SHCiIcd5qoQPuYQzC9Y9dO7mkX z+P4VZrK/aXygkV26y6+tL0fjeq/+ugN+d6U/VLk3rQ3+6HLbN+pkz4EElMoUj7QfvNXPhqO+MaN 63NPl1/xivYrcNFfg/KJSv+zCYj27Nvd/uQPv8ifz+HA6RhNb299x7XtIzjgv/vfPoaj92Ce90mC JiUHLa4UDTLAk4b13NMvJuAxkxCz5IFpgMh+OUATEhuE1fjXPf3X3/xYCkk3bnBdnYbic0X7D7/2 Y1Ax1uVwUL95wwsvdCUPR6nGwQ5nqk9cdsXl7W3veFV49o7DNIKOVaugFnF9cnjhbtqxTLAlh5Dp 29ABMuTZT6oD7NppdsVxLo1rn0uHvUBPZdZUcqIhEjZ+HueTRYF2/K1rUCj6+suh96zI648DFjxF IWA55DoiOPwEltYBHaYj7lHW2QuhEvn7KuosDfkj8PzPhsJ0dfszqBau4dOnVaVyH7KeKcq9CmT8 FvaVTvF0ENV5ZDcG1Nel+8wzG0HE9+SajqcSgKvQTR94tfLenZv60mqepMnLcvTRL4zN0d6lERX/ PYsCTjn8fk0GNV8DHWpR2SBesxFKyL13y5+vTNDSZUvQPr8S+VqCIv5zTDe/ODjnJzKmasAH2eVL 6tEzz2xLweQ11MCkUVmcin/6NSC3NWdVd6LdqZ8PTrb/7hgl69HnTOYxiK5mcqBaVFFdnD5RWc8Y 7TGvzVrwDDFjrUOSrAsnUCTPNI8CN92B9P3+1z+/sorlyJdTPyh5lNPr7wyAihftGVPcXK+nbKrU tJme69xDwC4FD4LXdE64O7Q/g9l5lYZyq44+H1AUwfqcxCgCNx2h9zfhlscNrtEf4fxVEyMNtwBP RGq9RKi+ZqNVguEzBLu47dyn/xvCy/5xebagwq4dUWGfm8/yfPfeBGt9jeeSjnsdu2ek7yZkiu16 iAeoT1NOvUGL+vHdxwmt026f1fhO2kjocHnsM5SN+NrOg9Bg2pt6ZtfvJ9OYKkWGzrV2gX+r3iEL c5L1F3xGwuXIKyaEqsy/SnH5LOyc9XoCYKGrON7VNEkVp0NQb5Jv1hfo/sDg70jXzKLgq5TD6j69 vjWFznvECKRueK73ryFrU9/WaIv8C8okyMg1q+dCNMT7PPtS76t/YO0Bn0enZB8duw6AJOzdx0HK w82ePZN0PS26OXgiF4fRtgL5AAZ9BwUaCzi4xuyIxeEkquTfs0HSPMQ3wG3bQTHMOAfmWSvg64Eg nTiu7JGydpLsS/tRx1ynxAcMbzARXG3a0BuSUipDInq7R9qJ3QN53ewx1AOQfpsDV9CvffxOqkGa czB4M8g9hrutYjkr0B4eTthxOOUlxVYNMES8dSRWgKrp3C7B2ZDXneY2OlnynZNOK0du+BIBSvej cfW3OVi4v9KRNuKm0yQI4U4QMXnoc0iZjqhkwB0oETiL8ZwDqjCbnw9FkqIbGj8Lpw9xKB7hWYK+ 4lTPxjmfDT82ckYqqLhQOjk/xQ8G9FIVjBg9yPgvCxD0NCmTEzYRqNcV2uDCL8OQuMBI1pXg3siO HlCJ2qlVhFGUHK+RosdE9FVYkq/+V/6Z61Xqcfjev4dCvzRUYSNPFCyoZz3RUrckHd1McbxxBl38 Fq26JtKanj8xcD29lqLDXnh7+rTpIalIUj2q4DPGLtfDsFksqEHqTU9SfFVWtQbARzR95YBY6Opa lKN3nHXozxlHnb8YLz5XX9XDPhyw3Hd1HksEHasvEl6ogMUjGjIDCzfmCSWm+NtufnLSRHv9Mhp/ 8L5n25e/+B2+K4fA9XYhiNgLaNg+/NCT7e/+7qvtx37iben4t5QC4uc2bIwWdr2+Oq2ejWybh5fr YMcOaBqhM8SEZd2vXLkkDRz27esSXd0YxaAYFERJxwpqo/Fqs+xEj7DvHwW1vu3mBycm3j27au3i UI2sj3A/yv/sxxF/Tw5fdSYUGDuYWYUen68bsHymYx8jWWiXGSv3qGn4F0Fg//D3Pgu/VaS80HVT rmetRc5OOhWH1TGCcgP0fgLkABW9qyCYTBlUAtF0AxHfP4Ui5tk432bIRH93gQzaKGZiLeQfojbT 4U+/DlWHc1D82Z2fuZ7mYdd8llxL0GA4AXkwlXfuuft+fgdnenxBe8tbX9P+xb/9IHSAi/rRNKk9 9Phz0RP/u7/5CjZDp97GKde2X/tPP00gc1b75Me+3scPRJ7gZzf3t5a26gdALteThfj8Z2+Dh3wv TUb+GfSIC3LghDaXZxOdkb40HM90EGRO7r/3Ia4p53dBe/P3vKb9zL95XyhG0Rnm9Y8/voFx/jyo tOix41xOxDAO8vBXr15A1kHuswGfmrOVbVTBx1bCT+Kcf+Ifvkmx4TXtFRS3HsPWGhAYiHh3rvPd BFe1Nk5lDj/yo29v/+t/foZanhfJmJzTPvThN7azzloZKb2j7Ldf/rd/1PY/aVB0Kgfu+etWJhMp TWbr1p2hzQwOrmtrEZ0ULagPzxLt7U3hW3cjl+epf9tEZhWZoM1I4J2Z97Jb173+ihRyinj5etPV ob+xnqwN0jY89oiqKjr9NU6+fjZZGDOxvk4a0SI43OXU11wsRE1k2Yr5PAnNjpQ9ZR0+9dxGEHKL kCuwU8P+nLUroEhAFwRokarzPJzyrUG2XeNHCQxWUOy4PPbenzkGVYxb3tJCM88U3XrW2hdiN1mk P/jvn4tdvebVyBxasB/nusbinzoW2rVyLiaUOnqENDjdZ17v2VggQYIjz4w+HjqYw5f0IJHkfOWY 6fQUFSK67c21+zTVp/fv81c50xYw2pGxzhyFAuq8GQra9cK8jmhtiheFa8O9re6Ic+NYk83iAkND G8+qQYItL/T8EqmMA6YMr/SiWKmg8bkvgw3/FkTBjh9mndZj8PmOg+dg/qtnEKX1PVLU0mU5NkOF CzsV0kXQbC376aAUkly+zuI8S/ctcm+MwUElkgXK+Lk+TxRC+JXj4vgrYaxfI1qu/GqpmBVFw+PO pikeRgmI5BF3Prg1dV5fSpMBkv7HZLjSh9nDQ6ZgOCd9qDj61jSVe5F58LODimceizriurDx4PEI KlQTwdjN+HeuMc/oygxow8z0es6LCgveqUjmueuYeJ30+fBcAlixt4Rjbn2Fz+O4Olmee4JzUQeL v1mqI/k+c1Pne2XBa50OAWQdheUXWOQ5rM+cUQkOu6+Q9V7/rte69mvO/TP1RbSId8IdWwRCMIvB XYYIvxFMVDB4yMUYlHnwYg+RnvRQ3ksaTsd6GajsPHjZ02zXCrrlz0TqfM3zL25J6/CDpL0mYUdP EI5NwWC4CF0o8kSVsdP4uDEPH7aCnm6FSLS46XSoLDZKpyYcVWF9uZj7oXNUh0Y5kwcSWTn4NuMY eJL+3grddCbU0Uok5QTU65xAU6Djp0aiPy3JXidDI7QEfrAbbs+BfWmHLaqisR74gtnwotnMn6iM Ue2Jk6NZnL5WxY7ZaJHu2E0RGJuo+tMfxREfbSuXUsTk4uCexjkgbJXsAkgE1heKHOZ9GOv9aR0+ NS3gpbvk2tJ2+JPUK/NebVz523WsoXJaE0XWXA/or8qzIncuPK8zirOeOQiv22gs+6lHZWcc7drH RdEpBKFvFKNa3+NnYxCm96zDUL2dRZbqbe+i7kknSV65HcSewRHchLOwAyTNjXIOnNizQL/mzZ2f 6NbnMsKMbigHS55bVJkPjNQgkb7o8f/H3nkAWFqV5/9Mn+29UHeX3WXpTXqTooAiKpb4t2tiTTQm mmKi0cTExN5j712xISAK0qWD9A4Luwts77vTy//5Pe85d+4OMzuzIKLhXhx35t7vft8573nPe563 k1ociV2xYdxMyGErHE7UhSXeEyBOMmeMnURIW0dQMJyRWLT3iJUvLysIHARSzghxsaBDHmGd4EaE gBCalDdkuLTkylKddf5tUSKpN/C4OEzwRjRS0YYNjjDBU9AoYC3gOFUWW9xanWrKAg+vUZ3mn6qR SVQ3YExddu+e+eJjVdXiIrl+706f/vj39PlDAmMHpv323kMH6yNqswyACOCJ63pX01RNmfTMK2+6 U40mSjxnuIInyCtFnBx0iATUMnvCl9pcInIX1dgl9InyY4R5ocDeooojX/ncuVIAiJkO0NCgihpY gUMe9QukPaiSbaUOMfOqF6iY7EpCuECxllckkuiBa3+t9gz8HM0htPfYv9qvd6kG9WcFQn/xk0ty LfagCYllhKhQno+DtV2xjlQwKfcNyzgHqjw+EudtssxfqSYua1dH+EarZE9dS70Bs3NDlCyDQpFP 7UyMLoEc1RM/81h7zKhpzFx8bmicE5qmeKxbJZfaO8ItWF6zZu9syyKW3lOfe1TaZfoM2bg70yqV 5Lzikltk/VXy4qU36nL4uUWNcg5L//HhN8jCvUAhI50CRhgOYj1RCilzufjhRxQrfEU69+wr0mUX 3WiFAX50ghYHcJViTFfNMU6WLaIey+qu6nh5gKzjhyvU50jVpp8sysgbIi/hZRferFKMZ6ub541x OFaq0zCjLnUSXJCe/6Kj7YUhCZ65IjfCwyUFWO/c/dDi9L73fjldokZCz1CHTXrDaseFwu2mMrqT 1mWjvQehCM7eaYrCiY5M16hE5KOP4plIamhzTDrmiGP83Cuuo1wgdI95oGxNk4eUKiK92p/XK1GX +P6gFXxDmBbjUdyz/qNb6G03P5D5ojB5t0DvLHc3xbgEQB/gRykf4ycrFv9AW/JLp9TSeW58vVq9 t2xJl1xykyr5XJN5cgDQ2ugi+iEf7lUMNc1qjJMc50qeR7ReJh5/Xd+6dMFF15vuV16GhTx4H0/O bCXx6vSpKEz3qSRleLeCJ6h4whmJPNmknINL1VCnS3ug7EkqrUzVuT2pcUJavmGtrfPf+cYv0sHP 2D9t0nk/ZVp815UOsiWZ8RXLdUngLpb6gZhkX1Xhc36JkJv4rnNYHEYZfSE4LAxlsIAKpFle6Bp7 lWW17BQtsMAWEInSEeAmZHYk+gVwc3MRhyngyQxDXB3GM+R7Ng6ErA5jECV7yYdYr8o0Pvfl8Sbh dvkqxfOLBydI6ZiiXARALOdTNLALg1KxXFPUgOZI0W2S0Qew85mYx+gEfH1oEKz1cbtzna0YYAys fe5Hbhh5OM6PEk7B6sxNKdCwpU3yVbIar72rXHkeWXUyAAwFw2PQD/KodI5GycT6a4OiRtAhY99k yUeHkOo/G360zqWjJPKC63RM2bpNiAmP4PzFAF0MbgGMS9hEXl/zCxgkxsStqKOBgQvlyeASS7cN bGXMCqXlGVo3x5qLP6iqYoObfqcEr+uGoMM4XyqqsAV5oveDexRorTG0gS9YK3Ak+8zlJhVSZKyB N5pdJJqEMTHiyCPePoeWZW9MmYPDbHVdqU4S8w9LNIY8V1JjPg6BCjXDfA5+yJVg6sAVvk8+QZDL gFOsaTMVJz1FB+5UgWwsxVQJIRNz2bLlAkIb3cr84L2pHtBm0EiptdVrtioxamLq06G2SdYaDrQu WcCJy4ZxXSAHi4UeNM5tngXoNHXH0NDIIMt9YtQAQQh6rscyCAPBHAYC2e3JpBCuxOvaBc+N9V3K ujFRFoHEQhitGc6BCJqsw1EMpCBwn8NKrDFq8Z2covfHyA1O1zwLCnAV/1lIBPgIq0K4GRBvjlXS Ijt+mB/F+LCBEXq7SRno1KYE3HH4MIdphLW4JpVCQAR+zOBY6LKrDPfVZikwK1avk1LTodjviREj LLpbC8vaGoqDJpgTPEWDAno16NK4gWvUPNbzIJwhXHGEuMhKSow1lla919VeSu3FhvWsLcvC3QIo J/4bq2tYf6FCJC6VGqIu52duDiBZEXoWigNgB7d9NGCAYSnyHxvTTM0GtpWUsCGb021JINYS2hOf GUwdIRTEPzK5OqnMzI9QmBBgEboB3XlQvb0uxLFFSFDZ2OwANqR5iP80V1xzHIo+BLxRwopc4vHK hrbiIEFRYt+ZM/VmsaR392ApwUIRNAyBHxu3uBJd01afRdMhuQOpyOLYc2hRr9CHxT4U7G3Ir6OO 2V+toI9wgtp9ap6xQa7o78vi+QvVc6YMGXHKq221gi6hrU+UAnfYIfsKeC8RiLtN4RAb9RnPifg8 LJkkmV5w/g2qY31tdofzeVhxr7/6HoUBLNAhLKVbQHSV3MnnnHtl+sG3L1KHw4FGF/E8QoyU8CVA SGjG2eomuUKl3gII8FKsv/Ig1qzZkK5R18XvfoPawlGNgjGt0/s3XHN3erbqTGMRZg9uVOWhiy74 vap4nK0qIIBQ6BElKqEprmQSOWfLSnmfFIfzfnGtaEN4QNByuZ5/w3V3qh32jNQytkHJcrepnNtV jqfluQeqjft+qh5C/DPeobFjHrFbe4BnMQS0pOeefnQ6cL8F6Xo38Ql5Q5OCe2TlXX/C5nSDFJdP f/xHCoPBc1DiglXGb9Hu6X0feH3af+Heer8rPbpuTbpBCZRna81+rSoVjz7K9cy/weEJ//r+16Xj FEu8WbkgJHAF0OelFrtSIL7/zQv0nZUCUTdqDoBNSn8iU2LvFgXQB772IuB8ngwld99ZmsH0pT1V Zu596nh50J7769ttadmqR9NNSiw99+yr0vmK71+xHJDKHAYUTZ5D+bzTRIfDDtov/f62eyvWHtqS 3yPFbr2METfdfFf6qDod/vrci7U/BWxziI5LqTq2Frd1oxUpFIWyjoTP7Sol7iCVnTtP333owQfV EfLSdKia8yAnCbfpaC+0iLwReE2+g7Rizf3pZ2ddnqt1hBeBeuNtevZahdz8/OzL0ic+9MMcR1/c v6xhnyz3h6RDD9tTPHajlP4SPsNnvemAg/dMzzh8kUJV1tpgxDoRhnObykDeftc96eLLbjBf3n5b aX4UhypeqMnad/I7qvTiHQrt+bH215X5oOb51JNf7j2316LV6eyzLxc/XCKr9ENVdCecUWeePMHy Z8ogtS798rzfOQEzXnGuYXCKRLexqt1+hdrA35B5l8+VgyCDVbsUyoceXq4mQT9J3/zK2aLNBskJ ndtq5T5TORdRFi8svcUSXeQ355y7KRu4Rczx0K+B8LySw+J72EoIII4EXJi0cu9sMXRda+VEhfVP /+qaqA7FKyyj/q08mj8lu2xx54zO3+MaB2EY/MT5Qc7MilWr0lWqff6g28/XSyYq+VsGB4oy0NX2 EDUaoscEtwXQFYXC8bNZUQg8Qnk4lNewTAJAfbJlgG+FgTPNGX94jsPLSfMUH/maJ+Gu3ZkG9oZj QcULq0OQ6jqUY0SOm9sy+C05U0VxMKwjll/fB0kxBroHozDwmT2unOsC65vb8NwS/hHgOmKFo5M0 YwRvTaFsrjAGXiCrDbqW0x3PDJP07QwuIwkTrOhzMutWca6BeUlmDGOV5ZEwVoSHxDraou3ckDBW OecMLzT0YGyuO47c0j+6PQDaRR38HCmiMiIQUeH5Y+AyX2UFxOsQezTObFAkGEvXA3TDDRDe5czr PMRNaHQNhtxy1oYsDX517fC8xlEAIfOW7gnI5sZhhQ8PTCUsBBbNALtx/m67pLELZZ0mxCMfeIDN GYqVxj1w7zIlQsmCvdf8uWmhSntRGWHFilXpuqX3pbt0mM2cNUmuQsUfqnVuo0D27rvOTgvmznHs M5FAWBtZEMqtkJTnsnokNhBrq9hRACcEKE1S0GZJSuMVLaSV+WsGiEoiBnU59hMgTVzdWAFbMrVh DUIJXG6NoP8SB+PJ4gai1FRoIg2NAKdwGQBuiFMkoYJFnqhkSf4l1tOLBfNWhYV4U/Ff3lwkHWGN M+NCd/1HAhyL4oxXMwKhAiR0kAVLxQ65h3BH5bmxGZerpe2jK2VJU5jArOmy+zAmHSa4HgHyxP9C y25t9soYrEDwM6AMIHOQZ2iijitWdivgHNcJblnoNIY4ZpgCQkPTrIkGgIi5WZFAwcDN7Phy0RAN Lgeg2aoBk7q1e7h4eHaJqctw25sLJWFKC9bLKWn/vdh8YaEIYBugHlccbtxS+g/NFLp2qFOdkxeU yIDGCs3CGo9WKkXFQDysMAgpStfVo+XSmltjxQrOetnNpfm4dA/dPh3rrI3vyhsB8COchSoOKHCi tQAERzmHEBuR+/Q6ZARLJ4XpFZvGurDWuLLwLCA8dF/41zHKWIftGhfP0ySGO+ZwFOpck2sQVn61 1fZBwBgQeF1p+sxZ6RlHqD3y2Pp01PF7GaCtd4c8hRBtXZ+WKgkursV2CMAACGxVDekbbL3+rcrl XS4rW7EUMjcUyh+rHvQN19+jjnF36JmP5HvEc4m1/tbXz3diKUBjk0LBuN9551yu5C8AGA1kWqPq CbtcHobfqxTdpbJ+3nXbknTuz67Q+wCiGA+vc3/xu3S36jjfLIv3UlUvKe/zL7GmdMqbIoXyyGP2 dZOaizXuXwtUPLzsQa2rOtNNme7kw4iJVQyxFIArpDQgt37644s1visVl7tBnwWI2aTQtK9+/lzv yakqA/jNr5zvFtnw99Sps9Kb33xGOuHwA82XjmLkQKTCjiUEnNsj0LsgveT/naSYSQFwgXBinXlh 2frON85X+MRilWy7Q7HPWPF5lfmq+c8t97pL5n4Hzk+b5KW5S3HTN6uO8dIl0JrnBLDmOR2qEX/3 XQ+lg0VrPAo3K6TmVjU4Kfdcu2ajmp2cp1GhkPDiQBonK/T+kr+yPud40og9jLCasfI4nvjsw9OF v7pW/B7rdJsqmnzkv77nxiTEcN+tShe33nRPWqqck4ExlSQ1nmPYkXafNzedcsZhjstkv5HkzWfI xe9889duSU8i4ANORlQjltm7KTyCRN04rDnusJyxj9Yrrp1E9LL+hEaM11mxQB1cm5omaH03uPHQ 3a8/LR247wE6hybZoLJxI7wpcC4r5K8UMjWhdZKUvcvSZZdQurB4DcS7Uky/9+0L0iUX/V5K2U1S GAiHYl0yIhD0naaKRS/5ixPT1DGTXaUj6qbzAuw0pxPkcZi38+y0Rp0n3RtBtIM3fvT9C3XP36uk 5cOSyUWZDWszsv2eu5ak31x0nRoTLZHy+2uB8dv83AZ1Rw0DTZNCO9amD/77150096DCewb2SVFE tX+Vm3P1Fbel8U3j0m9+e0364fd+lR7ROVwSGbnPHbc8mH561iVpj7k7p499+HuKpS6lCCOUjKon 7/+3r6g8rjpIXiKrdjfeAsr7zROwnmx5HaXbyjkW9Cl/8zvylBCKPuVKFOoh36thNu9zRmEg4X6R xxKA3Ylezl8ivI9YV7wdhGYGGMSjV9z2JawqcnoCkAVdw0rsMyp7ZlC+PX4DxqAbVwe2DNBDFR5C w+i1QU7jBvHNOu3D5dpLExSeBl9Nk0GRML7wuJP3FYmeA0pHxNwyjoo31uGQYWjDrMnz3T2S7ta8 r6GGFzUausUWijwn1ELONMa5SZiB71HEYQyhqErWIx8Jzwdg1qE1DscIxSFuFGdTsaqb3gBx57JB +8A99vrx4/BE6BL9K7gZBlOPUR9sIEdNhhO8eMyb8Disx+OFP6ygcc6LluOEZezd1qMo+VnKcIaF NwxHlOw1BuUc51HZoOe1ATOow7fvAcBltMYoEVrqMoGiY4fO7U0yfhAXX/ohQKPoGk0EAV27rVXp PpGc3kNYqc5ZIhBKCBO09woZ84TSYeUgjqIAw/zgYQLD2CsR4NkhiQBrK1V4wgT0jS2DJ4v1mmE0 yJseEQMRrmplL2MaeEPG1gaX5eoUw65WmSs04lYnJyoxAwuwAMps1QUldnq5LF3tcluwiLvsNE1V Nh6WVXurXcJkwgIU5uwyW58py1nWvPsWL03LHl3lZLyD9lU4hCzGjn/xIqFdMskAa7QG5aBznI0Z JBi9LCQEI4GrNJ6J2Kbs7rdbJpLf6BTYpIM/QNSAtgGhSRK0BSW7JBwnBvjxggus0FYzfxahCGie cQ8X4g8FL8IKAITa+JF0mLtNuVskJeQ0Lh1CPMffNeAGCKJNKQRGAAslg5CTsXRBUvINoSVrtflJ 9pwq7XqiknkIZ3CJGpjR3Qup8xwWVZcEtIYVYD5KDDIPNDvD3CgVhMbG4YB26BCKsOzShiYSCuJb JkyWUhYEeTOWzeHOkZqrGTdbgqGFK4oAUIr0rYjhuB2v4pZCUDjeONckhVkBzGwMYs7QtDsVQmRL aAbrdr/YOh5dt5iZS+j4h7hlwG8JDWEzUX5Q9JFgcst0m9vzGptGukPWnh0SgfJjC32ElVg465nE rKFQ9NsqnhunSPOPJJlI/ESIIJBbWvBaKDaNGpoO/QgA5uRHJfVZs87hKhE3Fi1iEQbEZNIIYtsj C0aL+pmnnH5oWqhSeKtU0eDAw+and/zjS9LVlwHoHnFlB8I1iNmnMsc6HRwWvpKJ5/zyclnPbrG1 uLOTZDgSGCcLAC01/W9W/PLN6qBZBHarKquwFwDWMPoD9y8RCPimuj5OdOgSzVIATmPHTVPt6Gel rcrP+NlPLvK1HOZXX3G7QlWWqT7xZoH+DSrlOcNx3VjOWSeqMdx5B6EicUCwR4nx26LmOnz/YQG8 D3/wWwaL7bI8rpQCr5oskhWT0ited7orinzrK+pyuDHqba+RIvoBgQd4Zc1qAFS/wTD3fvABQmDU VOaGO9O//cMKr+UjSlju60OpbU2vePUp6gR5nBs/bNKer2/Ai0W8f94ABr/N6fkvPCYdqKQ2cYca xUyWV2qa78+c7737fv1guSQRtEWgZW/TnZbtvGjC8oPvnJvqvqs9b3d4iW8NUL37HIVoKK73CtXR fmTZA+kD7/2KlKCbVXt8erpOVVjuEr0CfJd8jxKy0iwL9Jx05l+clF788hNU3jASK/3yQRdxlIDC 0557TDrv51cqNvt3ns+GDRs0pnPSD78bcmlgTKFQ7D53N8Vv7y2F6zbFIUNT9l5zerZirfc5cF7a 0t+exilOfZK8c+V1/71qb38voBoA36AkyWeIR1+eDn/Gvk60QzYBQEodX6osUQovXipfKWtiqwwP VB2hMc+qlZtcFYbwowOVSLrngl2ldMyXJyLCpDgTvi3gev6vrtJ7a6UobjaYx2MIj7Hdr7wCZbLQ u3gTDL/006sY+MPSM084xCNg7w+gxS4ppHPTiScfJEtck8MuKGH4KLhWc1ulWPNVKxgH9CoVTIKf odUVUmLvuO0BlQVcJzm2Vjw+Rev0bO+hb6jtPZ0gyT16WKFxAwp0UbLK+MhN6k5f/cLP7Z165GHW QXQfP9PhlZ2ueS+QvnJ1+o9/+5JlbwDrJnlL9jDfrdZnG/Tvz8660PONCTYo1vrg9M53v1zn88y0 RfvctsVqpOyZRNy+lQIArQ0X274MRCryPmhjq6INMhG2UhLbbLXOxijDZSyWGB84k7IsdZMoey99 F10fgyoUMXnzM13uDGOVr6OHARgKoETgbz4T6fAo2UmY57GHE67abWVyqfhlpeThZCmwc3eZlXZV UihecEroAUYJKQxQH2ErUbghPOmGm8Uy62dzxsS+8XcyWPRciANnApVDEdpErDj3wMhHeT466xKy ALjGAEP7cM9f9yux6z6vKmeq/brGZTzTVTnsBcCbG2Gf4COstshcogTCCq67Bso227m+M4Yyhfm1 deoeOUeI8bixlXipLC/YgYpffq5pwG0K7olVCuBulKIlwJAX889kiURUQlNYL9MkQGi9aBheDTwd hF5IhqjQNWNlfi6D6yocXhIm7nk1qXhD6F7wAlVHouCE49h1f4fPml/IBEFNYa1YjpiV1SU+R6GQ odKhS4YJJZwlMF2EImkMzM08WTZL3Md/5bcqS83UmK8+aFy9foMsv42KTVrvkITNciVNV4m60mIa TYrYalzzN8sdTMzrQsWALlLCFIh9s2KixykBcmKOX5qm75Jc9MiKFekaWUVu04E7UXHDlGXbZdYU My2aUmiHDCGKgNdrgWyFdDwOhGbT5MLdApg0p+GQn6SxtKrmIOB2gizMBpLEaQOKKdenCiIccp0w Vw60hwAcQBRfN9dovlhScOXQYamPjolKCNogcEsZNLTeNs2LcY6R1cQCx/gzNh/gNpwPYUWfpDkD lmAUtM9S5cJhKIB+MRvhAlhOW3WPtnpcndTFxmKuDHV9Z7XAy4pVGw1WKVmGW9/1HyVoKQdHp0sL Iz2VebLW7rwoRsdjgCvFMUAwsTZYt+kR2ixgDuZBG8TiimtG+rbmLbBRNq8VjNgUuIwc+4qxQcl8 ANAoJh/aLx08LVZskQ+6xL+xD8orbyMD1g2KkXdCSI7vi65JgDm6H6ltqcNkYkeW+Kd4Jt0Eo/yd Qy8c3xehG8ViANCmAgf0ZvM7u1j/ujWt/nNtU4f3RPw26xSxhrE72PhRySZqX/sAwLIt67dj5cST HQJhfA9LOvSgFXIcCFGPnLKSW9XsITKbiStWOS+NGyUTGjfJWuIGM5pPyVLGHTZv3s5p3txdVBFC pc287cOayRyPOU6l2177LJW5C6st3p8XnrlbevGZJ8kyq/tqHJu0Jwg5eEDWtO9+7ULVKH4IDvE4 H3GilsIO5i1M7/rnVwnszkj/+PefVbkzQOFALeWdd94l/dWbT/d6fP3L5wm0RF1fSsG1tXGPsLrN mbMwveqvnquuh6e4LTmt2aN+M016unNiWKNA/Kz06jecpvrJBwg0fl0JkID4UIyQkjPVkvy1b3iu Y2dJVFy2BEu2nidQ/tBiLPFwYaPiTpXc9spT1X3uJekhNYc556eXC1yTTBfWk1Url/p+EyfPdNOW l7/2FB+iH/7P76rdddAzLO2xV5tbJqW/+H+npLf87QtVuaQprdN6kbBGjCsd/ciFCLDcIwC7d3rl K05WNQblCmh/TpH1e78DF6qZyuX6fKCk4ZgxM9IZZx6f/ubv/sLy4wOKOb7x+lvyHGBnruXlneUG Iic/+xnpjW99oVq3L0ifVCjFZz6h0Ip1j6afn3Wu51Oujd+jwktTi2qBq/Pfyc85UqBZpRHVYpsw hHbJrXKIxckpGoufqUqwuwDru/7l1Upa3SJFAytqBi0cYpUXYyLG+KD0l3/9ApdEfNtffkxrieVc vLNg7/SSV50iK99Uf3u6ElP3U9fVKy6+LtMqLLdj1P78OSqP99a/fZG6gu6nETc6EYqXGz74N8Wc So6TP1N4Ybzjhlvcdny2OmiuWrlcvLTVyYLdqq0/edK09Pq/PF3hK/dmvmwUn6jM4Fb4oEm1u/dJ //TuV1n+/d07Pi3QCRKOEBHoR1lDwM6ypfBYh3hudnqh8hemq5Y7sp+GMrHnNvn6o485QCEqCxwr Pnvn6e5setcdhASVajryII6dlF4ky/dWhbic84uLJQ/4TPNt3yRFCc/TWJU4PFy8e0p63euf6zC/ u2XVvvRClJwCxqFIk5rhzFfFksPTVYoNv/4awp8CzK5fv0o/siQ2TRLYP1og/UQrXd/66jmSu8F/ a9Vkx+FBUkDPUDWbN7z1+fL2XK1E2R/o/VJ6kLvJGn/yYemf1AH10MP2kreXJmzRxM1lxaCW0QrA IIcR6F+DG6x4xQKbryvAOUNIh+lFOdMwvpSYXWZoa6qTz0l2xqI4EJvqxG+zLBbiiO0lBLHct3pc MDmUy/A7Ax88qVGSzeA6w9Aip8EY02UUxHBD6BcJqWAQQvHgZ8IN7Fm0XZlqJUGHEsaHRbbToZ3C J80aI5ZZgz7CUvQNH57hoeTMLVZ4V/Ky8lXAGNZskE7+vs4lzqMWeUkMBnUvh3ooqc/W0zhmfb5Y YjrhP+7F2YKntClb2KmshMEKg1Ik+FFGt164TBWZtM/ckyLwq5/ls91rkpMRdV/C3Gwkc9KfvD8Z 3PL8wIGBDMrx7hwmK0yxiwG5Nr6hkNiYGGMNTg8DKAe4Iy/9GUgX0uXQDkSWaq2Cj9ypOZ/fbiFP qTss+BhaOcsJCzGABYjEv+4qTRgOhna8IxpPMyV67UWOTrEhgWIeNMOGZjEfcADjyWZt070oETFG kJGr9qPI+DtVKwttmaUBUdDDwBzD27JHVrkhC1ZT6jXzQ5ka3BaEhWxQPNp9ytYfrwNolUr1jRX4 fFBltigzd+A+C2U5k9tI/xGgDtBsEKBYp7JWWxVXN1MH0qGKa5qhTmq7qSg+Jei6qUeMW8ggQ9qi 42tIDpOWKCLSgMSaqLVYCKPpaORkPJOoRQk+QDFW7GbcB3ouhCJchZfBkKwOuDgAONEmOypHYDGG 4GTYNisJy6XsVMsRJiKrFhcYrl/KBmKVttsJazExRLgODAzzJiZkgnhnjdPVTxw0HxuGF9+zy4gk Oo0F0ItmRImsdbIqoIBMmhgx3iuVdHG7LHwrlMy2p+oLE0MOeEO7hU4TZN0ZN0ZWPjX6cf1UdYB0 8wESGGA0C4agG9ZpXKMbZSGKBj39WtuNZn4AxHjNLVx38JNVLDNpaMHxt2PCNN8u146O2KTCtNZY 8sby82BEgHHeKN479g8FC1pQQQ8rJgOhNA0ULs4eA1umETIaY0k+iBJQ4f5zB0c8GdlyzkGGEZvx w0PRcjRa5KK1N6lwv63Rrp8O2EajjXaoCCHWjSoQEV8ftcyx0DQ5MZHEvbBk1+vfsYrFL40OuB8u 9ojFJukisAzxfXCZPTByqZVMdXiqJWeJE7NJkXy3MtY8WsULbfoeJeied+YxAmR3Kx6yWAsbBFCe kf7lva9Mhx+xj76TVJEnCupTO5UxEzM5TWEUrP0G7dW+U9WyXOXDvvC/P1VVDVnwdC3d5o4/4cD0 Yh3MdEAcKyVt8QOPpk9+/PsCMetcnu6Io/ZxtYZTVZIMgblAcbk//N4FavLygMIsUADrXdLvyGP2 UWfIE9LB6qCHxflgHdLvVXv0z3/6LMVgP2iLwowZu6Wj1Q3y2BP3SwcfvkDjme+ayZ/8iJRt1bYm Y35vNTJ5jUDwX7zyWXbJ7rrrTD3vt0qAvN+JblhV6GJ4xFH7iS7HCaDvLfBM/kFDevVfnZ6+8/Xz 5OpX6JTGQFMaWmU/+7QjlNx5iC2EyI/p09Rx8YtnK0nudoUR5FKC6vT4Eqy9LzvJ9YhJLMI136RW 2S269z6KkX62Ev0o24Zb8rWveXZatOfOkmxUfuAAbVYC3LHparWIJ5SCxiMHqoPlKc87Wi3bj05z dt3Z3qgJSoL7/rfOT5RGpMoHllZCjHbeZZrHerzGedzxB6TdNG+AwRv/+oWOKT5XcdirV+l6eD4f 1sTdzpkzSyB8D1Ua2V/AaG+BxZkuDYbiiQGAklqlWQZ7zyXHbD0kF6BT1vH908f+912KldeYfnu9 QvrWe0xjdCjPltJ2sNrHn6hY98O1vtRQ75Z19NQzjpSS87ABwKv/8jQ1K5lrMBZd0PrTs577DFm3 b093KgZ5qgwBxEs/94yjFIZysNcOIwid9ZBPViSxSuWKQFQ1wZBRXiTVcgxPltdztryht94ccoO6 7BsV5jNdYWTPO+No9xX44ud/7oomgJddNfaTVXv8la84ReUN97cy+YAaIf3vZ3+q82eju04+6xQp MW9+vtf0P1QacZ3k66tf87x02rOO1BOcOpcOVuLlMcceqA6bt6UDD9wzvfavnqNqThOVINvpMqqE Bd0qKzpdiQlBOkBhPi94yYnpzBedYJ5G7l2qJFDieCnrSJ1r+PHZSmSlmsd4avKmCeld736FKgTh MbpXicytadGi3dLJpx7miiX7LJqbfnPBdekjH+wVCF/mw3y69jf8dbKA9/EnHJT2kDHruOMO0J5p dojVKvEKfLVo793SGS88Pr3wJcenBVKmCNN8aPGKdPEFN9ibu7PK8Z3+gqPTK157qvb2blbGsOoa 5Oh/KBgOJ8rhFQUYWYwju+05zADJh00Avoornd/xhjphMTeIwfuHMkvlrkozF6wdeICJc42iBJzt JcTIDb0AspzXkfjjM6dYDwugCUttALtIHAzvpYGoPnNBAwN0qUPuFSFDFs3JqDSmcU2Sl5BwEBIY Y7+QvJhDHfO5VuS9zxTGSUnabDQx+A4clUNTYoycJaX0H4eouwBnNOrQh5iRgSzXEzYKmHVCnBu8 YL3VTw6DCaNXgMM4lwdqr9j7nENqmATJjYTfdGqMbe147OM8ZI8zDoe8gblQlNiHePS1rmAd1pgz sY7wTte3lp+EpjiUWtZ3eSv8+vHKcCHO9Xy2E/fNWV7yikhQLdcamFP9QP/j3C0dIx0SYut65DfZ f274gWefSmfiDUo1E+opa7brW+vsoxuumw/a8xZg2VENhH52Bb8S0tEpLxtyBxzG2eE+IV44yjRT gU6KB4mU+ow78bKXHwWhylIIKzr0xryIUhEx1oY+Xlf4Pnv6faNiBdf3rtcheuShCyRIBOB0qDhm WcKbeN2tGgCl91bKojpeljdiQx2nStiGrDwTJ0+RBUjgmjAFNFcAn8DFJMVHNo+ZqDjthd5EvRow oZIUsEeDc8cfLWYjmhEEIDYVEO3QA/q1w7hRVqXE0cRmkyWRFuy0lSVuG+0AUCSBU9ck8CzA2kEi kOJ2oEeHDlAAqjc4BxbxRNJe2WAGQiIMmwe9BkahDTkhMcTqtjSr/B3ATPzd3i1LYI4dc01mgW0s +jCuNTbcCnL/k6XLJuQZAHdCbDo71TFS4G3S+EbFy96Rvvmji1wX92C1kT5NHeRwd69bt0p1dtcq YWhO2mvB7vIksPEj/gnNE6GwXjW5N3NoiY4IFATGJrVUXq/EjJU6TNao/jHWYcAErYvJciZJk1Ad YhZRdA7TwXCAkrNwhbnqBnOwpSs0rw4pKFSE4I8H1L3sDsXIElZx5MGL0r77LBLbqMyYrDVsVG8U Z1XDZcrCLrFvlAnS+hT+jFi1iP+OWqiYB/ocR9XjDULyAd2SFC5i/TJCMDgAmvUMAEKX4vlbWydY o0SIwW/hYchleMQIKERsCkIzAAGsqyNbbW6IRIserOU+IHKsHh6AHCZTJ4GDAGtQ+aux+mH8UYaR zRJhR/RyJvaWzbZR1kAEEglZCC0qoQBpEJZWujTONgk9ugK2UtC+T4olCoOqhJDJTDgEloUuMftp ArZ4PkhW26hM/gXqzHaGQhL2U+OWLRup0YowjW6mvS1saLqUKmFJ/BAlpMTb2hfPVtvxRSpTttTW s+RwLsIG8CyRwY0AeqWA7T777a6E5DXi90mqFzzT7a1xfaFcvvBFx6sO716y9K12nWRKWwLSZ6pO NSUu4b0uJUuxL/fcZ5f0ureenjrb1G1U9N9FgBHwhyfF1hd1F33py09Leyycm+64/YG0QQBp1k6T 0+GH7mnvB40ijj/50HTQofsoDGS9Q0/AhTNkXZq981SDeA6N1avW2Jv0itc9Kx1zwv6q+LHBwG2B 9spOsrRi/eQA3NqxxYfYs08+XM9Y5PrHWJOpDjRvroCHqmOwVznIaVfLi2Ql5kQlk3fLun/mC46H A9Nee+7k/U8FIDdNkkw59JC90v9++Z/TcoWYTFXN451VUm2CYos5PDZt2uS1OGj/OWn397w8vfI1 z5KBAm+HHGUyTPBs2qxPFADD67ZWXQdZz3lqx/6e/3pdetErnqlwgVVpk1qlcxBhKaft+86iKRZ+ LFQlT4H9EIm2sX8Ic7JY1xoWNyrAhgZavRrTMw7ZQ2DuL9PDbzndyg4AmupOU2eq7bnWlmpJQM0u 7W0OmDe86XR1hNzHFi/is8f4gJNhApe39slRh++VPv35v1Vpw1VKnJysmtBzLTtZK0I+GBbRBA75 067uVlc91yOXMmOed9x8jBmvnUwj4j3NWbKwvKgQAmBlPZGlr3nNc6S0HahwpUcNplBW5u+xa5qo qkuyw6YGFah/+ztfnI5+5v7i/+VSXnYSEF6Ypo+fKutju5S6eald67HfPiSxwu8KMdQQ9lZJuy98 6Z1pmXIddpWyNlf82ylgTedV9vvpLzhSfLaL64QTtrKLQp1I3MUYNEmK4qe+8A55b5Zo/Te78s8c redUzYNwDaxta+WNIdzgOJU8nPe1d6dHtK9oWgTdZwgIUzULmXeyLMsLF+yWVijnBrrTwn0nrT8x +EDgbhlWyGd6z/tfn17+6tOkYK6xV3X3ubPMJ5yXGyW/4af//vibFV//LIc54hmbq2Y0KIgPynqP HCanyNUa7G2NMDhAhptl6G8ssZzLNkQAOA1YMmJig2J7Qa56j4cs4sDFk8prq868PhU0rlfVFt+X BjC6nETXJrWY3yK5tUzhLuzhnWfPsleXkAFKxG1VcqxDEeztoORcGBUoc0qzO8IIKdUGTnEJScI/ ATcYLDCOCTQDhAJwdSpsdYOr7UyR55zqOuMJQ3JHZPg0gJ2t0JnxSuhAyady/wnvLwCUriMW14YU FAVhDec+Eg/OsRJd/Ep4TCnT5l2aDUPqxVdpTIci3YflBJoC2pxIGQqyk/r0UxI8MdKUPgCEtwKS 2Ds9NOLj3GFMhEoC8jEMYXOmOhrKERjHngXoFFW0iCV3zhBdB3V9h6odsVvhCQx7DkHlyDOQDxDL 5z6hgQziadNIt27R2rfK6h4qGOdr0JMfcsSRB+4xkUM8iFIgpNcRK9ZAyLkCB0ZYEXHVnN22FQJk fW7LYKaQqk7xEriK77M2yBXWMMI0g8/6KXeL1xt+1BneLpp0qQmWrfXgKUr32qofGLRNZzflj5kM +I0+L8yDs5lEzcmqANdMrxF7aDDo6dkcDmYeDKian8INbUwPTcG80jhLxeZ3Iu7TIIHA/62OTe60 da5XFoUALQS1T1B5Fw7bKergNkWHkeNkMNfrc+oukphkTQSLpFYAYMHG3ao4bWKJi1Yc4SARxxOa KdpqhAw4zosYPZIZ6XCUwZljgEVyNA6sf9wLVz1lq+wm0eZjqmg4NAoZS6kWF7fXuCFOTk6k1TYH FUld4QIKK2sIlYjX6VANYi8Umgxrrx82Lki7k8xfXUM2K0KFmZC8ac9Z0YwUz7ZSJb/uVMesVars sHDeLunYg/dVaMsWKSprPLeddLBRBohKKDNkadtrj960315zZAlSYw9p2QgzBA4vt9K2QCEhMdaF ihK036XM0FqB6xWKt12ruNv1OpSgxCRZ5GZMH59mz5ym++tg12G9k8AWyRwwK4DN7iGYGNcH4BfA jMBAC7XGRpIXzxXoBriIJCgL1qlJMEVhhZescfJvhKiY59DE2YTZChEtbDUfHfiuOKK16UfZwo1I C3YlpjbL44BXwcJagIVYslJir6eH5j7E1ZNcGWEermBC/DPjzXFXth7YuhJx6u4Y5cRCwkPQI+A1 q9E+QGy5ILwlu31cL9xCA6sC1j9VzQHYMims5CSr6GAhjjcESXbzAsat+SPAApCx8XDD0Uq5nXCT LML53cJd9wJocGAc/cx903HPPDAaBOEJouyllCc2dNQDjcYGbudKfJ3nzn4g/l77laQhzWlnWR8X qDU3xfgRmjRTwhVPyH2dkoUBT89QlYSD6wC4JICK9oyN+t12Ndaru90ktR5XCJcTWbGESBhRDlPV gJgXz6GhVLcsDLur0sNuOwMokAeRwBstZRVKo+v5/iGHLHJTmOXaE5SoJMyns40EIGq6orCMNdBP 9bvYcm1FSPNxyIP+I7HY+RTjlbuhpD/GjczAcscBiueNZF/4DR4hyXmi6vQfdtgiONX5BbxQ31DM WVcDZklwJyzri+zpmSp9OfOYqbqSqkftkoOEDMUBHC2PG1TlYfe0j0IF+gXK8WRwyDsBW5/1UzoS 2SNZus8+c2VgCI+IhS1NbsTvKOfINx+AeEn099ixmtchC9KhauZiw5JPleKej1A0ci+iayqeHFyl ASiqwYAnycuHWwh59g+lTrFK7SnL5SJ1/ovzj2Sz8MJQAtRnAnTQuCZIdpBYGlZKKnREwl94t8Lw QbjE3m70g3Vae1PNOJCpgffx0gUgAYE5hlL1crNU8D3zQH09UshJ5rlqAZ9F46wIJxCVDbjm77Zz WqAEfPaHoIGfI+lkDxt8RIvj42Th70zyrqiyDGsvyWm5dtiBNO9hRFIiCPGABrGD06IFc/Qzz6F+ XQLdLiuq96EFCWiHql63lX5ALoAvK2Tw0GyB4F1Uu5q4/Jg5Lnkd1trfePyIa2WPjm+tS/N1Duwp hZDxO/Fa+6RdnswyjvkC8fvuM9/PZixOfs/twm0pFj8SInjQIQu1FgttcWWfhJeWvcIaqhuqwlnw 6pSmUexfKlGxnvYWA1yzt9AlR/N+wLDFvrLxQWsMjCxVa0qIgs9ofz/4sqwk9ClJ9fbYkqhLyJ/H 1+MmQBjtdlOc8yrldp2vhFNY5SSF4ewq5QDgy5qPU4lcjDMRrhGhCw4t0e8uudYrYAVXcV7bexzj 8RywFiPTdaa4u5/GB0CldwWJ9OSPcU88yHi1Oeea3MY6uLE6mbPsr9hOGFiw/g4kYEIP71NRPYoB hOHG4RMZMAZ3FU5HiGCeCguu1xjLJ2NEeSHnA/6x1xgsHPlSYZkX17H34EAMW4TZAEThSb3vUpw8 ExALGNXZjBJgfgfUE16r+8SZSJho9gjAU4539uz9LMAhwJW1dH4V3gHXMOecKb1IkAU+TP1cDJAA TnsVPOUcJprnTmUO5Fo3VnlIVjwhJglW8/iekyEZtSFZeMW9rrmMYSMyFtAq+ccc8OKWPLTwrEdE BPHrhNiUEFR7BALJZ28MoZ5hOKOCCbS1VTrLVHRB+IsqR5gBkEMt4IdGaMq/dJKMfhoRc8OiBl3j pOYtrQttujeo7NUmWTwhFGEbrXLdsDiAl7lqJQtTTVbNzCmTdIDiptBgAbR8zov9iYDeIsupNVW9 h3bZ3TPBi71O2iMuNhNDT4+41FgYiIEwY9C8zyuAasQAR5mUYGIYkDJOpbnFRj0P0MnBSi1u2Btr Hl0bVZ8kt8ZUfJUOTZg1DicOCzKWqT4Rmy0qgWRAbSajvaiKtcvyDbhkrOMF0BHeuCWKUCnCAyFO /OxYaVKuFSmGWd21wa2leZY7JhIWoMnuJ2vHPgvnpGcdd0iaJEBBEt+c3ZsEfGek8bKKOjYLqzrh EPoP4YQVms6MtNmeNllWeh9WUd6Gz7GYt+nwbad1ut4jtGfqJMXBa20nie64h0hudPUPzXSrvuMM WzNYuElwoUxWvDrW4n79fsCiSWnhbrv6/o4vhk56bgvrTliNs79ZE8Uh40VwVnVscmRNxFbRchZ3 FK6IcNmonLCFmtsTAm5wUVHFRODOXgqZk0pjlwgDifJabkDksAhZP8RHzsbGiupQD9U/V61gEiOJ uW+kCU+uBEO5JzYljNbdAJCOQx6BxCEXBwubhP+VY44hooD0yTVNCE+XY/R47hopS9B9d1nGqOqy XiE+XitCS1BQ2A8aN5ourkfGuVphP/epSgSHFZURDPR14UR5OPCAoBCuU2MN+BisvnaDrJoaymTF 8k9VSMRYhW94/A5byWWGMhhiLqWEFKPnGkq3iWnCkuE4fRoIhNLQhbAEYlihpVb7GFlz1OlU/OPG QyjFrLdpTqIxFRhkydN9XRpSa4TXhGunaGyzZ5CQS633OPighcOt9ByAZJcAPTQBBE9QaNPk8Trk NOc2KWnsXZRe+Hlz7xaH3ESCLIIrkm/9N7H0ZNBrzKxrkyx/bs6jZ26WMgnPjcnhZYBeFHBAS4s8 Bnh+2uwtEWDTelF6irFhDLAyyH0R/FhZlfCoB2QXajQ5sLXKh0DEWobyGXwfsZcaj4S9mzFo/Cg+ WOL4DkYFJt8sucGB5Xr4yLXiN0Wqsa64KQUomkjE9bwHKhJEvkDQwge4/sVi5cQpAEjeV2XPlMZU XO5YUr4GT2qPdXdve9hjqeSdksHPH1zPuruMWAHpfrI3iMeHVyKMHVwf1Y8ihyKS5wJWB3AI922E v/W1wB9Rd7a8euiQpyoW/b2qAp4bKfGgWeoLgKWSPRpmlXBrey2yFdAlXV1uM9OxPgwm8F2/SrFS P7cYdGgRbotbfnAAWM9A/wUwZp8wz4gFzs8VIdvrI4zFTjoO4Dx3yz7xADzqkBl9l/XnLm5ggnUY oGMNQucPVvq20igrKjqQb+LqFyixMmtupZ5v5gsDap9NQXt42A1LuIfPzuzuBxDFVWFttEKDuz+S 3pplMZ4wQfsyV1tC8XbXPRLC/YyBhPDCe5WqCeGC8nUGu+BYZLxP7AwsbATiHow8jB7sB4xCVIbB Y3b5tXcr7HFjOvSg+ZJp49JKdSy+8ebF6VElib5AITQH7T3PNAKE4Vk10DL4zHuCc9k5OJwlHoTp 5FBA/YengXHRcITnYjAAVFOBCDoD3l05yl5tecQ0WAM632ogpKHClzm5vfztdWe+ed/xPsA+MAq5 VpR7LeBTY22I8JZSe94gDCDHntW/bphiI05YgaWFm3bODaL5nefHD3eNHhe0N+T7Pq6QC2XdkSlc D7YC6bIXfdZFLLINADZYRZm9qITF/ojHwO8oGX3qUGrPqw2IUo7oZIrBBVeFZBb08jmSLc4O+NS0 uqg17sopoexEuUD2AAgmzie+QuxzzCjkDB4HYAOWZOQxa0G4iqWNvlPG4i95U/ARHUvjPOxxlRrk dcGHwS/E7TeB8xTJwPlHODGhfuAI9hs34u8wMGjvyeva41J/wU/cg3LUvMzpeLj1e+xVwmLBQVHB DuXPHkQp5SWWHSyFUtd4nzq3wYwAMEI/puhAn0RrcVldeA/AiCUKtwpxbO7eRuIBK+Pf0eQj5giA ZUYxX2SgJWLYemgwXcBXWEkLxUJoschB2GijGosfh1skQThhgvgk/e5kQBjMCwxZWPxoZ4kGQYmb OJSDGWwrz0PzpsKtolieUpUC8RTaYrTFhl60hG6X9S1CGcKaFhZTJbXkBYMxYVyXsdFnWKtalGG/ 59xGacuK3dbCTFc5oK0oHrr/AsVQ7i0L0uwZMxRzK5BCYqMWdoxc7mjsbFKX1sobzpVTCFWRYMT1 jgvGSXG2IAYNnJxnomfBbsIGw/lgE82wkDF2ACHAshMLo963BdSgBTeJNpddUeqAJ1A+VS5V7tEh 0NHZpXESo4p7V7c2o9FW1gdHaJB+HELWa4XrKVxc/pFVr7tXvl+vM4kPJFZECSEnTwJK8Jmx1llI +SDOjUGi3J6+nLXoiHHDOqIDC+ufvoe1t9JxkbXO1mkDDv4DF8UJEIIV4cTGzx1Cy/7Nezh4Tpej UADa4U42Eh6EiK+LLnGsj63pWjMErd1DKDLkA1iRi9bsLQJhbGpWCoE/VXWaqbnO395nolenXP5j pEzB66HAcEgCGPWj9+ulRLTSScv8HHvIe7Hq5QOTmCn4qKT1M6iKlMrsgUz33kQ5jH2FACaJxRyk +4RbLiykRRkNi6YOQYHXCZIVXVhlNb5QClGiivsxgDXPIEOecbXAQ4yfQ19zGE/deuJSxSydCr9i mBwQAH+2nTuLWeDmbe528eRNoACzoLGprRgZXcS6FstPASHBm5GDEBAKUKffnewb4CQq5OB5w5sY 1QICpAbpbFjIdC4HDBbZ6F6aBTteN1zqxKBaEPNZ/lJ+TowkwGd8HAMvFrLybxl7Acj+2yFoGdSU +zJse/6KwSKAd/m4sEYovJW/ssyIvwtVKvTKlxWLpSsPBBEeA0ZsDPE6s/ZVcj0/DrKi8LS1brGB hZCwIAot5iPhE97e7BbyvFRNZe7sKJNWZkHdXYP6WIywNPGenmdRN2B9MhuHqKjQvvyaI2i8lzEK OdErb42YH1IUU1yAR7u1q8iWHz+wprrGSiRNPZx3FFWAXA4OK7G6lpqnJd8oWceOgHdo7gnf0MCj QajCyecG2GH/DLbWCMz6QdNI5ILQ+e98DkSlqPJ5gFHC3VxjmsoZ4klbNwWsSrMsZOfAeg6sWaWq BPeDhhWraPSrCBwNZbIC6OMXmYhRJMIFmZcNb1LAUaqLh3epwogeVd7Wa15yXHqJkl/btfbX3ni3 9zt198cJf5BnsMvsmfK8TvDZslGlGxlra4vC9WRkgCZ46RxXbKqwYLGj4V2AGkosZyNWfuMOb9Yo tUluSKOaR3Gesh+CXwfio5n0QGJinBXlFaI0M4MVDNaQcw/Vr/QdHLzrYm85bMTDLXKKcyLPgPXy +gX4w3jBCx7iErwNjjfW+QE9O7JlP5RfvTIu8Uzw4AqoYzALuZ2VAIof2Jqrs9se96gEh1ev1DoH HHMWFqWNEpWepc+IqOXtuGTkUJ4Ks3LkNMoaMts5IJz34jnkEiDbGDCHgZjaodhWSivCpzbf5XAg ALrlTBjFvJ9twc8lHPG8u4NwLuvoecZ3XBJSBp1+4Zzo0xFeZKrZ2djA+aHf3LmSNVQuDRESxWod yjmGiAhthT0YF544vOT2pMvAQlnjHskx8FREYkgJF7/jJUD+c8437rdw1zRP1unJCvVAq5lQAu01 GBKgACiEINCJEYBDvB6WOzYSQr4DyymJY/oPixUVNtC2sVi59iCxO3pglGvLgtBDyQKZf+3OCWAY sgPQA9dECRVic105BC2EAHQtGvebpnCHaWZawDYlY+jOpc5EAiXjNBdADQe/AZcZMYB+q933Ef8L mGa5cYkxPmQC2jkMQfWAMbqW1vAQDVeTe8rrXlTvsGVC95ugQ4Ai52z6LhCB5g7oJtPdyofeR4ue r1JX05XcuYvCM2AG4sFp3zzW4TXYVpgXNR1J8MSLwKZU2IlCWXifsdIJrriDqdXt2DS7Y4LhTVW0 OaxbxOKKFgh13PoIsXGEvuhZbaqF3MpB1wi401gIDdDGoqIKVi7WukVuEFzfKF/RRlfCSgcPoLxN 73ViZdH4xkyQZ8DlfIowQqARmweAwjqtRE6FxPgQo0wP1+FKJ2MXIISrylAnBLVVBTaBNOKIuZem 6NCAcA0Wb4YtUQhWa+AhvbzVsTCysbMA9C7J3oUAVxlKeAPrd/PlAGjxRrNlM9mdSCdR6LBWVmrG QTt6Dl1iB9GKsQRZ2OPKt8ITMap4PrgPJSifofJX7rSJ8oRFlvJJttCyYfvEF9O0PrLU6cazZ0w3 HVB23G0SBQlFhme4JWe10A+6xeGSjwHkN4KZ+SEbLUTCJWhPDfNT3VHWlASbbtUM5dRuVbgGNwkF IbK+cRuTEBq1a+MzvDf8sG72rLitfOxB6ElVAEZE0qHdzhrhbHmPogV2bpyjde3OQrE5K+TZQ50t jOJ/hKqVoRCwKPlWbhizhkwoGDImLM+yNrSrDKCU4THE40uOIYfcwITDATCu6zrzQ+LADYL5fOVZ PMQClTfI4oe/osxYPsaCzwqfAuhsACDnJDrPwnhYcpFZ4aZmfUIRM3/mZxRAV7GMx03LSga9DSXC MuYVZo9XHciRLxKvAqwHg+PKBY/5JVtEq96vBt8Gd6y3xu3fs8Uq6znb3M20FEA0KIzRmKB90mZj /eIw7OpS9QbF90/SWfPIw7xPp10AtXIQqHqjRkXIfMpCLli4i/N7BM+8vqaDSR+AyIpP7PaQG0EE 83ElfKWA0cfMPd8rljuPeGDkYYeNc6ELL0XlAeVaW2vi5cM8DB2cMw1an16D6wBfgYPjYmTZODU0 chOKzHMczk0c0NyKcAyj6eAxmCv/Fn9m3ilaAzaJftO98g3vL4tZgIf2YRRsKeFDWfbCkSSsEQPt jncBhss5WZqnRSIXk9D3XNkw9oHjgC0fUOABPpHPEslxZhaPFfkAwB3T2p9ecOrhtlr//vbFxg/T FZd+5nOPdA+NCy+6Qc3qVioxdVF6hirRhEyR91F7NwxNnHHau2x63ddnWk4MhL/ABowrKlsQvSkZ I08zFlo8bLaM6kzu1SQcX06vBCvn4W2oACvzWBhHKp4Z83T5j8t1vT1PmUMYGxTORiGoHeEx2ZrM lc7xyftffxPX7C2TDYPsb3vCHJZHbpj6McQpGPcWmSMcG+UgQG6UrgurpM+vzB/E+Tt/wvSJ3CbO J0AzQQ6cR45H1l8YhTggbBTNBRx4v8gBrNnsAcdt25IcBshi1CnVw+AvLMjRXCc8ehixOKe7JT9K aCaxzIDsuCqAPjIMiE9CnM0BGSTHlGJ3hycolDaHsOZzQxuNJsp6P3gXajksxuA3Ig4ozoElHmNH o+Y7UQYhViwqxQXIjxEFz6LQEZ5GOCAlkrGOYzglNMZavNeC0GG6hivEUWccQBrsi/HVZz64GLx8 zKF7KWZytg8pl+fRAzZu3hjMq8QuYot75GLg4XbDAyAJhLfVONd3FlAiaZCFxByOe7dfcWYu1Ya7 IHejC303NjhJOAbVFcGNFSK61wWnhHUMFuSgd6kezY+N5WYP2gG0ZUYhINaPmDO3JGdSGTg7/lPK QAduEjQSNqdcytRxLEkcRTDZOO3Dz54Qg5xmLdpYCUMqoPBdFk0ho+F2dp3KqKfYrJABKi/UyWJt jdEuDjEuC4GVX8s5WePaSfFmk7Ugrq2JtotbNtc7dm1GEaM1F1BHYvUqVhY4YgGI+1rPAzTYwp8P 4nBVWZpVwE+H5kycLQDf9SXJ3FEMInjXRz3rgvDXTwvapubXLiQT2daRzOruQ05wifj26KTElg8A 5aB+mrJ4FwDC5Rr2GjHibAnIFnUA9Dg9g0OEdeKwcpF2XMUAUn2jDxcU4I+4Sx8+8bwQGqyfWSIE jh7pzpDS5O0+ImEKN4xd/NmdDfCxoIhOYy7In4FJMFi8itYeTuCBUxRlBwHGugLgaRDx4JLlired n/ZSHXfa1NKqntKQaL4UwOdgR8mCIj3E7cuay9qNkRcAlxEKCZVjvIZWEqX0ZIWNuGusx/Bdo0Nj UCYiWcNgnEQL3LkSXNSiLmDKVhfmYetpnlTGXAE4cuiAXXYwgNFgWOy0P9pVKhCLMsCagxB+ItGl HB7seWQDhy9KIjRlD1Lhh+RXFC+6eLLHnXTnrYuSgXVIssAHZLdKS45x2FK7aMLwWqR4cba1Ka66 0+CXRGb2gHan5QLVg7hXJFyF4IsGVKWiELXgHW+JMNN9CRODxpQmGysaR2dTKWZSCl1Vxt4GvGsR xxlgRfzkw9QIrsIBAR7iIDSLmy0HrMEDXgPNwxVoIjG72x1iicwlcUn7A8HOvnDYVNA9nsO6hcCJ oyYMsFn65WM11jOO8nhFnF/ZB+XdwssRelVeQ/F75UMkwWP2Q/WTgpmYV+zDUEQLk1XHe/sAtFU/ 7Nu8rNx6D2bDcp4IdbxnzJqWEtUZ9aLqxaoN69OdaqKz5AGq5fSlhQLWe+0118+08uFpYmmK+Zv2 oVmXUxHK+MmhUGMCiH1R/Sp/V2bphS1W4gE6QxYAcAAsB/1VtlZQpZwa/CrwoTJtHOCQh5rAAE2u A8LgNbTUxd2urxF210uIEHtQ/xEmBIblbLMxJYMPkwv2rJpAAdfuz1CYddvRhCzFYEAFCBRsy0Dm ESFOxnj605WwMDJlZdMVXQxOInywosBQickGjSxcyrmjf5FVlv6c5XmcRQll04AJGibH/Uj8ploV DZ3uvndJuubmu9OC3XdOJ6kR0lq1n5+qpOtdZXTCaAVvUcM/6sMHWOZcIZGNaU+RJ9gx3wZwgTP8 wjCmZ0VjNprCSDZ0ZLxhYAhoCj4mTt/KkN6zFxJwy/7O4HoAcWUCV61Dma35EPnhszSHyRQejZMq uMVgOM7UBuKakcP53AQIO/LGRicqrNCQLIcwObwM+UnVq0hgBtjhSeXeBvSsAz/6LM6BkCuE2DKf sgs438p2tyfQ2yeHoIFXzCcRggY1I/kPwwUHUPUuKodMzKvshuorisAy3nPIRigfveAH81Y2ZAK2 WbYcU0/IYie8lvnenkLTLrZ6dOYIZadfCcx4eSw/HX8O70bocLvy0raQe5aVO7AbZwEhkBTtcPgQ ERAhSCNJs9Ak4p5iH6EcCFz3qBa4lQIpVWCcJhkJKLEbsD8XYWDSmQ/sSdHvjTOVjMHhCWLnoLcL XZuFxSGupGy0iG9V2EJ289i6C9GYIDfNLkGLHT2HQzUO44gNZoPYCuR6lJnh8mBMQN4srj0KtGdG iWuDRYDFlH0hIcVOBH2vmXvK3dGlMizGZFogkqYAb8GM1CQOLRtQ3N8nUNAotxFVPZTFH5Y8P3pA gGbjoGso6hm49FqlTUrbsPt+iyz5HJadqhBAXDVx07vutLNjOsOCEfFFhDo0Nka5G17cp0el/xAZ kdVPx6boOujQDD3PQi+zEN9De0RQwKJO9PNpFYP1mOP/QpExEwrgoa0iSFA2nDEs+phpJNzxeOrC LYA63EtjREmNq6VegE/vu6Sibu74KP206AuMwTFqWCqdACiLP9U8ZGk1oCD2W/eKetiRrYz2Ggkb IfCmTZ6aFS+XOxkYsxUtTrNskcpgyRsSqwRuGN0vYqtzSJCTxAAzETMOIdwBDGHhxkEocfFRHYeH yv6ZbFnTt0Dkv7IZTMvYHOUFXzdoM+GxWKdShheqk+FdSlBtkUVkkapf4K1Zr4ofY2WVphK6q6aw ufleFlrO+pYLEoVl3Xq1HVbsNWtKacqJ1NnV/LaqOx9uwJZWar3jFUDhCuUBEEvWPfN3WAYhOVly FRFnfZ1xF8mZhaZj/RAGGeyUQ4AZWnjl63xA6Zn9TVRo4ZQv8b5YC8ISFAA+W02hNZnrxPa5RFIo ISQ6o0gYBBMXjXuyklsR6wFvIJRsEdOztsgtTJUNWybEI1bQRG+XYLK7Nax9Lq9JqAV1cjX4kEFS UsiZIMaVgzF7lqysSCGCZk7yQjGx+5PkFUI15FHj4NB/lkSVJc82En1meUBYB7QwuLZU89wGjpYM Hn2wIZcCsHdbKeXqsGYzfsLcitLnMJ18IHvZuHM+JOPuAweySe97xX8l5KkoVoOBtPk5H1ylkkiF oR/zy8CcykfMu9yzbIUBJS6IFWw2EKYXfwWfeOTFg2RaFWDnGzuucsr0CWmhytBddjF7t04t6x9O //KPX9a/S5V0t1HvNal84MEqY7er5CRGlIElCsoE84ZSHWdA9TX83g8fV32veurlnEHpjMhv3gkr limitXBt52x1x20cyU+xxcpZVfAc47FRy2dURWUKwANt8tpzd7crd6WNkBOmJVay2F1WbKs9AwPS KM+gENkIGZpy18wvVZO03qF72evnvVVmCqghfI2ck0jg55mekzGFnk+YCmeEPid5urSxjhAGDpgB 2ck5wnd7pTRbzmPVtGc0zvsmCg3YOqrGTkuWWBGfoeoyE6Ro33Prcnfjnbv79PQylbgk7JQa615f 9qxcnjTcIb+gXZ5ju+e1Nm4k5rFU7UQPLRuMHPMeipE7/+kVScDQIJLlUdDJCcP4VBR3K3E2wpRd GHK1AMhqHtqWnwJiVUaTFauqoySsreZZzmRNxN5y/oU/4jh3boHG3EUHS52d9KYgj8viAvBJ2CTy OI/JuCwryI7jrjoDXMaOswIFUTQozdEYJPjAoaHc0+dUnK+u5yxPNT5kKyAoKYTMgaHQlPOQy9wr dOG5nB/ZmlzO1SLjirIYXgiMNhFWy3ltA5JlcVCwCV5ijl4Gjb1sAK8lSmuMw/1D2DqZjvFtzi28 7hEqslWeMHe6zLLYOVuEiLA39D6hXNDH+VLEhnsPBE2Nu8ATlGCk8m1u8EqBB+bd2YU3IJocckbC i5xJ7B8AvHmOqIbxY5VEB7NRv1crTShIo9oNt4gA42SZbKNsUl7QcJ+EluTW5q5tqU2qxcR6Q9Z8 1FSEGDCrwBGNUARqcf0CjL2I+QDwQsTp4gGhmUSCBYdaZkYfGNQjhEqAKGJZKdeCuyjKrXEfH8Am ZLi/mxTrRokstxhVHLTd1gBCNlm28uHCQtDEARb87k2MUDTDE/YSzsdWgQkS48jsnWAtP5csEnFt ySbepjfK5jk2lTgeTY6yMv2ATiyABtGRBU72PkkWdp+RjSq6o01bIZFgIx7JgBGXkpBu8JnmTVgO mcB5s1poI/Ps9qettn4HxOueLj2nn07NoU0KgUUpZQv1BWpfr1dSyQolUY6j9qesAX2aC673MWxM fd/1u4tQcGKEsr/xGhAywb3kOunrA2STkQ0AD7DFHEiMjU6MSA/oKE2vndh8Kk6gbYpxlXSEtmzQ KG0dx57nUxGd1SbYABgBuFmkchxVH0HxeViq432iuQzmecXpOEho6q5e87hnAO8A9hH2JACopEbM PZRRw2uAdRQ6sQZYeduxujqhCa9GHASsK64iBCJ0oCkQB44TXAUe2aTwMUIwBD4WCUpNRTgT4NKx /7ZkQfJoC18UtZgQLx+PwcAMn7kDCHP8d9AitP3SutWNHvLhyzMbCdfQHoaPi0UyqBBWPfMkHS8t YLE4S1F1VQWqF2iOrmVLBYxQuigByfzc5hj5QMgQ89Xcxkre8C8AHC+YBRv7hX3ONAgho0oQXJD3 rOOnEVbaz3iLmpqiCQPfIVGYF+MgRpeDAX7kM8JwDDJxhSJMSZzOVnArqlgdc26dVy+fkI7DzwdX HLCR5FKU/EL5wjNO0vUaRQgaVn34DlANwDQIYi/imbM1JmQML8s/G2A4XLFwBoiuPtQN6g3Wwopf Dn3+rY4V9DGfT/WRwXUARU87y19zU/YUeEfk+1d/HpfGeMrL+zK4MObkn+IdC7e5LYRU0RG9Dz9y 7/Tj709SY6QNiqndnL7xtXM9f6q07LTLnPS8Fxwj9+0E1floq9yzyGfvG2htZs/AtLLdYwS2asYo B0BPDDuPHYLrHt5byIwIcYyDIECOEwl9VsXGAujkb5etlm+X47J9Jop+HPjwmf5hnM7hyfPHEAK8 sPuc840x5K3rc8vDr5ZnmZ75rezIy3MKJspLmMc28G0MGuRs0GEWMFPOnbAEhtXa3fg0pshvih1f 4a28/gZ05stQP+K6kL0ITvOIzxadA5JryCmq9wBkxsqz3C9kQvLyw4+sVjnDzW7Ytqca+7Sqq+0j y1cnGWWV4D/XCdGUIQVIOpeIMFLoJc/WVinMAMIJuh/yEa8h3isMgPU6571sudqYuyIj66wkZXRg OmX/kPk25mzRkK3WzN2KZd5rIVIHFNpYiYG9Ys7if1aSBjwOccQMKLn+UgG/j11aP9OWZM4QXYes dR1nYIqVFcImovuic5UUwkdoLoafEqIRKxLyh5eTaa1QkdyH+InKLyEfokKKQyV0Rruai9aKknPw b4ZGsbamB28G5/vHlhn95PAQz9c8Hgg0wHVFlGaihbVywEgRtcllm7Ghjz1gzmeueQD2oljOYKjF A0ROD+dT4CWMT9FPIs4jMGyp/c3cp09V6C20jdipwH8YPm0s4dwNoxWGJVe6y7LORp0cYmzvjb4X eWOiE/tG4+UMCr6xOhxyRtdZIdIziyfBwV64ZFvViYzDn0oT7Z2b1ZWMLGgd7hlchVAvLiPdAOBI 7I74l8MTTaBNVQqIFwY0cMgDELEc9gp09whICVpae7fWFRLYqlswBRs8Z36bYWHQsJZWkhIhioRF q2rk4kJw5rwtfcR3SqMFx9mqquxgacwQoEdxOYzPpfZ0vxKjTJme2EB5HIFBBgRWOWhxIWEF10cR jREHXIvG0DKh0Z0pXSlBdNqqcke4ICaqckm9mpQAbLmNDwIMm1kxYQERFgBX7NdcR5UMLNsdMB3V PDRXrNowK8lsLGNofObTANQVIsbfPrS9H8JbAKasV0wQFooA6liCwsoEiMGNvlmCcFe9v0ulogqA 2CZfJz26vIz4gtjiOtESXuX8INLEz0FZyODVlTlc6J11VIiBgTD1OFXlZass/KKEDxz0Y2udZDxz CsEnhSlz3JsFVGTuQ2/qHPeqWyQWci8ZjK7BRCmf2NCOc7RSpqdkoedDn2uYc17zCngpYDv2tokY xy20zK4zvTFBVT1OfebBFtp0/HKJJ81zumr7IhipUMNesLLnsmYRSgEfADixzhKmAI9ihaEbZ2vT ZicDRgkq8RBd6/QsSpoFQOfgI84em2skDBO2RSgOe7SAH4ZtV6ZBYJXiwPqg2Nl7AA0i8TgOWZJB APPkSMgNKZ7oUMIqhyIMhKJkMA59tD6upyqyF4syGfnkHpBgQ2wjB2Gb5oWC2arSl3QOZB925EZG NExol5UKVIHnhzGQqLRRtYFpDsWB2S8+caMoW6lRjAN8l+Qi6oYXwEgiJe53APt60ZZ5kwBFtRUy 3KkJi4KIB4ezAHoS5sbBa3epJtOmvwnPQsmDR0r1DSupgA0sYNATuWTgHwr1Ni8UX2SZxoL3oVeh QRxS5Kcgn2iGgM7VRAkwDgFK+xV5YxMl3qY49M2bFkAhlyIUI1s3iyzKhxfMXg2MWSeEfx31aPFg mXcYaxZo2446/zVwj3iDa4v9NoM2jcNOJtMhDtUYSoat1gwiOjQgtDeOf+P/HbID6NH4XIFAhyMJ yMc9c790/DMPSef+8re6kv1iaKDrx6dXvfa56ZnHHkSgWYCBytgzEQxeAsAwDqv58HplbNvOJg84 vxl0NjAUnXwY8zcgzGQHTAXti5u/KFRxTuT1KWPymzEgqxcsYVYK7Qhj+iZGyCUMDV3KmeE8a6YE nJaYg528oKifiwJSIWMhZ+XfbGrwmZFJXUWf/J5pn+lDzgbym3PGQMCTKxBokMyI75iumUn5JxL+ 2boDsbjhheH89ScGN8146LDmtasng6qDrdu0wWFR4IIlqqnf0aY8Ht37vsWPutnOoQfsmfbcY46/ S53h5ZtWGxBTu5v68FtUZSRq+AcvI/+wRrp8IR4p0XeSygTjFezV2JhfjD28GXZSQocMvlytJmMN wtfGN4yNsr65UVmpThY0Cp7wduRsyrxWWfasWJqTsifKMgt6mUeq5LB+Z21NKQAZ+IGSdJmHWdNI 2I4wNQNm/eWO085xC0+iMRJhrhistM+5xsoFB3L2TjrsRzfmfj1KjEdekUgf53EYaEwYjdRJ8rIk R3I+XktkfngZijLvME8bSCNGu8cRBcE/5qvs1aO3CQY9nmEqaEgFfDoG2sYbedQlt6Etnm5XO1Nv EMKj7CF0TDRN/BQTbdlHy3nxrdkxxkT1mwjVwDOCp1QjlmWjJDY3yN3RLOMrRRCadPbCK+ApW6Ot TOBhx8LMGSevu3sdUD2OUrSRzwPgNv8g1wlntpErcvIiVNSbPIN01puyfma0wB4aL+c0P42lJnAw o7L+CXmgRI/+btfGaNZBAQNHclDURfUCVJgZZqIMjYS7EuywZpKAQL1iBXXamulGLzo0Ad62oRkI 5Y0rP1k9C5jjqKmGQUUE50HBKABDLNVoLzCWJGnEBIcQKC00ESAsKs1oyAlxYXl+dBvCE7jWJaBs 0Ytt4uPEsU4BUCLEIjYUX+E5MIMVNX8UDXCwdrl3ITGiumYs9XYRXvqXrFTc3naXs9FhDKxZEj5F eDm+VPd0S222BlZizQ1rQmZdb57oPBjWJNvPtcCu/aowmMor1jrOEDZQ/sOWkOzqY/LUZUTwG5To v52mTUtjta7ce5Ks11j7OEQB0T4QHENaQBtjR0hHlns5SO36JhbMVgzoAZ3LAR1HbBNuVTHemGbN L4MbqOLkE5iR7k35UHKpLfiHNdQm6hQgg2bE8qPYhUst3D5swPAp0PY1Egqhp63ACHvNowi5IizK wR9SN5RKhyIFV4bWrp8os6Y7y+JP4xRKIBILGI7feNEd1G3SteGcyKcvD8Ts4caj6H3EXGJ9jrJD KKxkLkfyJ25SElUBuW1KhHAnSucEhMvJ9XbJvuYwJrQBhczhVdvGy5Y4NvaEK3xgedPYg98iV4LN 7jwK5mkFRPNUPCJjHKNMfHic2vCuf+vQIMWlISDsPgylg3XkFwtVlEHHuUcZMgQPe9z1Py2KQwGJ YyVa7NpqQB5rFmTBK4AS0cJduRgd9apDaULg14vGJDI5pIyNy/P5oQQbCjNWBuLBCcHJoTQxV5X5 0zWsE0RwRzjoxpamqgyj8roEprVlnXAXbp7Bki3YPljz/uLh5WDNYDjcjuH2dSOsuLx8wZ/Bf25O gAXdDVQseSyXkHsuKZcBX2xfvlMF5Lmn5QDNkTh0wwMYIhJrChuTeIPyYORmxCeGhTkOJ3+a/41p xR7NT/S8LbEwaLDm2WIV1ZvYbb5E10RYlu/B/3HA5Wn7rnl/4ca1fGYqZPozB53vu+6+U/qHf36l wFJXuvG6m13dYfKUqenlr3h2+vt3vESdfMdKEVSIIntxgJT2kObI1gBdHm8kttrDx/V6Ron7LrPb RiWyPC90wVeGzIo1NyDO4QVlDQd2/MDSlqmacvCW/nVdYPJT8LzAq5nnAS8+nH1YZXhsfhs4d2Kd BtYm1ik8kpn9/EiDp7zm1e9XjydUMs4BEgpDUXSIE3tFX3IJUkCED/zg26K8W3lFTvkQKesdQDB4 KGJ04U17p73oOZxMdAP4QT8SwFs6m9Ja1bO+e/HydI8a/9BYbYr6ZJAw36K67shFcibIm8IANkGl Yx0rLVm4Ub02AL5UuOK50A8jgL1kBjvgCORL5PzUk+xvPFLF35wNjNEeifw+vKGLSvUv5LzPEr1v i6XZIHjKexlpiazJoWeVc6SK1w2w8eSyD5E/kn+8Sggj7xt3iFgkx7G/KgYPK+6xJ6LiS3jbkZOc kIQE8r7xmMqcsjzIdmLZUVpJImyQES/0cIx+cVZE3xDOSCaEcZCOi9GpOqpu6XnEyVPwQPdqRj7l 3C9jjSzbMBCEMppDNtl/HkOE3ZBvVpLkzSHQ33fnfAkFtU5e+BJrbdCvTwG6cF0kPkb7eCdO6zOf DXmf2GOJaLP8lozHAg+4pkyeDUc662XFjwmF0Q6DrEsW4rkgrhoFgewH5RIQt+9QIcSFfqdeeCjX hHKSIxRnNuceoTnNkmsus2kDHjQOxTxKDYYxEKMAOUdRbS2UDC7m/G/kYGRSRbPr0kMsvPVAV8dA 40NzpOh9bqZRiM+cnMgobbNJAxnXS9KcDjR3/iOBIuIWsWSNlYXOYRFsXhYQ874GwgLYAk05GROR 8AuIA+NnSwKUg2hAKTFFd+kWZbmICTcvqV0gAH/9EOvGX8Q1UUZG/2K2Z69F7C1WwpysZ6EMkelx EoxkIUJskhGXwJpAohNVzHihfHQRc8P3DHaSQRjwuF2EpopKJBSGNufEUJg1b15osEWJaUhC4nQA F011lA8koRDKokUFUHXJwXzA1qM9GiBXzvkKc/lbJlMJvQmh4tD9fOiX7Njp6q45W3HQsAufdzIP 0SzKSOlirMaq9RE1tXN4hWmHoM508GkUh5trpTI/W+djQxqLIPy0CONUC9lxuLkubVTXYHyy3Mia 45hqQmdUbnA8dbn1XTcEAgbpD5oyILAcoyiiAqBoec9Yp07Cgiwtn9J8Aqm4i8aoQyhdp4itYyxO FMVtScMFAS/+jaSYGKuVB/8d1vY2taRGSDUowYTs4eBZJANiz9SPUA0AjwEp1nIO7rBkcni2aU3h /yaqV+hg6JZLtKFRyY16FhY84oPpKspaM1cs2G4HTFk6J37iXo44+LE6sABM7EmSfXyConhqPA6J slIq2kTtrkppNmLQsADTNIGas/ApyZQTZCEYL5p0aq60AgdMAUYdoyewM5aa4VqHDoO/bMnjy7CG QX643AIQEwIjOeDqM1FDFnMijafCqitrspQDDg1X29F3OGxhgB5iDLGiyBrO3uV6miJt0lh3U0vx aUoYdSyc1rSLqj3E/AO4aZ6ja/EQOGfEeyUatHTSqVWx3YxpopURebusPMLb5BOIVwm5qQJvxTtW FBToa+t9RooVa04GZsWKXsAz+9xJtvnAZi+ESz1aQrP/2dt0/4sYa/Yq4WLhAeAzqjsEfg+lsVin w4oaViQnlzF+lKjsnfFxBkhir8OzxLs6ZpBnBLQcDK49OxT1LEiCo8OQYImVD9EADfk9+N4sMHB4 8gVkddCBpdW/+ZA1zSJs2ooo4KFZSfLEvh599EHpC1/+x3T1Fbe6cdle+8xRuMgiVV5qUR3+zR4H yo9BKcogwMCyJMAPMgGFlYozRGAWvSY+D2EXQDQOfHtvbEX35vC6NpHsa3BZQBXAg7WJ3BYb1D2Q klwfc6+88q8FWFkRAOTke9KRNXIaqKSN1SsauHidsjWPe0XFqgG3fniiImyh+uUqPgaA274/8FcY kyJoL6ynTiRDJuueUakhXpXENe17yzHkscEC4ifOZAOIXD86qBjKumWlxxzjpLKC44UVQocspP59 sxLOkNmMqFWGpfsfWObk1XaVt7319vuVdzJZCf5T05Fq9DR7mva47kbTNOq9A6oZE+PuUO1zjCuT VAaY/cyZSjfeCOVhk4bFP8YaVl4Y0bCHsLTsyWFekexH1aGwwgc9s2XeaxzzC0AZ+wG5iIz1Wnpd Bmjoe3h/0zUYBVoyjhBOMY5zzlzuEI9X5N0gmzjbSznhqIEdeCRCCXh2Nqgp5p+E8zCQENaDxTZC 8zB62Xug+zr8BaOn/uMZ8CtGUbBVE+cW8l3FDVhfe3oFxh2m57niQcFoFj/Bl3kvGwNFBSgMPg5R gT+IRCBEMH8f+vBs+DkqQ0HnOP+C2mGoZNzerygzDufQnFA2tCdb5eGA2pwN3IFExTDwsefD80JI LoqLFUftIxsm+IvzKhsh+/k+W1fPQSZZZuisM+hlLALT/QovZgzggjpXSIu8Lofy6r6E/WLoxJsE YO4EH1gQID8Ac/l3W1Wi4ANeS6I2fBZx5ulejTTBCk0tmKj6R3d2sXMzmjFesYaYfHmLys4kYD1J JngWP+L1Sp3P7EY1A0YsYlhZ2IyxeSMbNDY6m9WJcxycWHFzSTMGTw1UvkP1AR5NpQ2sxi4ezvcR lo4BCiFZrzhgR03alYVbAu0SYoeFw9Y7rssmfo/BAje79lgcNB5rpGEhNYQwk4TQsgYNmM9M6Pqk CGIDbe5d6k+DMyJxJCRX3MNZzQLsZAEDOnvQvrPFyAuJNSiT2Yubf3eyVEbIA6swsCSsfa/m4fmG 8l15xUES1o9u0dshKd7cofDY5ZMPBu8IvWyx95kaYzB4y6DatGR98R0XqwxrarpmQZ21X2hjzVEA M1yobEBoTPMShRQITLXTSEO/96i6xngpHA5FccF/1lFCjIOULo65tbCr22htt27dYpdT1JoOYYkH hlALrgngQW3uyBC3wqPLovFDvOzOynFmUMnhQxJObqJCd0yaEpB8SoIqQJ5YNXckjcZL5jszUhy/ pqceasDI3b2JEKAcsqrBmuOrCbFoUwyha4zqCjoDEkaCAuDscW1Sl4xE+fAhCO+TkERYURzU7qCX 3ZsIEoSnrTKAao2Rfzkgxk8QoHXDiChnhceiQ/QjHAQAjYUEpZAXSuVEtQqmU6sPXes4wXHeZ5lv +BdLEpYS71UJTCrmEL6DYLNAtwJJlnYcBk2iH9Z6rLZbBOzZ21QqieYgPbJcbVJn042utU6ZS2Ly UdgRpA4z0pw2EX6j+3Lw2hKlVycKE+MD6GK5Ff06RU8Ulm4OEadbRO0HK1L8ZzbNhymWOR9a+Z2K 7AuBHXMPGlTHPpfnV5iJ6+ABfz8UeTwyPnAsZwlZi6pCrI1LTGU6x3EU+zCeNbDL3QUtHD2Va0r1 kBhehKz5twwW/HuWtXkKlWH67paD4Unj+wFItH64sDX2qG3umVfu67+Ym+sLo3gHoI6rspyARiGQ /b6rqfgzjCOST/VdaQ91LFw0bw5X+i5t/W1psxsZZQWf7+VPB4YQ97MSzH7Aw8PewYMBfTynMpag lZV9DltyWTgFoK0NlUGrANxlhnw5eyCsOGZrc9xyiFd0J47k8yj3GBVCorMo3h2DL49h2/ylwkPV Ny1jda2RQTwXHp08zsIW24zIgtpzo+yZExJFV+cgoUzaCxTVerw/NLuB5wWwND3MEyFH4dPBoLLw jX0EtsqLlzF8+NxkjnRGbFH1jxkGHAfsPTf99pKb02bFVHcrR+JRtXi/f+natMtO65XEqORu1bdG MUWp75LVsY0Eb6oPkSStcQKqisW9KIveG9mDV+g0eHGq36+mZQDrXPaOs9l0LudV8EoFvBNNKTo5 PCKvc+SQhLedXDOvPWGpGlK0jAfsE98b9MUy7YyifA6FOcLkr+xu0ziPwlW6UL5EC4eyAdYwaGCc dJglBo+sQCP/7RUUHlEIaAltIJfJs8LQRiSBFYvANS5Tx9N4joB6k0BlxDaUtQ984/BeuCXjA0c/ WIYBtPMELC/DKBIzyC99jiwNjBDGSkqrumuoMYHOUM4yZD5nto1z8CUe7WygQ1nimchMc62DriLM Rf9GNSlZmi0HIjHTtd01XsLkwhuBLCGctRgkNXN7t8PLVKqgobh0d6nCCJ5BGyfi7OiRx4B8OMJI OIPgO4xVvWpYFcYg7XmMT3irMv/b4ymaCmDnw9vMEOW6oo1xWJjYJCxEJBriRsMaDGMXQYpgDfcf wC6aw4TLwuRnUUU4AJQDwg1+Amj7HPBJkRdTX0VYlmYtpYh4uE41FoFRlrJXB3i0BQXUASS5ZVgM zTRYSQSw6/UdW1ohpjVC4HW47H3w5+cb7NrMH2Axkjwi1htGp4YuB6WTw6yxxEYsLxYpqn8g1QDS aJcRgsH13LdUzmB8vM1YbV2SuwKw0Yf2hiXQoQphYakG1+V3bl79dLPzwPkbQ7L0C6sCr8AP247Z mh1Mn6FEuUXFQpdvQ0hL2fVFW0UJyY8IkGzgmC3qJk8Gk9ni7Tg0hsJasQX1Z4TxhELUzCbqUaKK wO+GtWvTIytWWHMEkM2eMU01UScZjDZSS5KYKK31RDpmytK7WbG7K1etdIMWl71T3C4baqsAI+Dc pfI49KSFoq06c56HEgsrPoguWxy2Zl7PtVG0aVD8ghNDJDPZqLY66HqsJ+785s5sWGOxdjOV4L+g d+YVaIwM0wWAfWjE9xCQ48ZhjR6rZEl1GdRn4wVkGaeL3gexspUuvDiA8C4ByhZtcuKcSzwi16NE lIoivUqq7e9X624DXKzf4Yok5puygsX9yR7bpBhGEgzH4nHRohDTiLWZPcp+3UScpDsoFrFfOD4O UTw/fELoRcQCoihGTHM3Floc5srMQRihMEQmt1pB6xkRcw8zs4dxS3KoEndONZVpAtbqTinwH00V NC418bHioPm1b25XO+UttnDNUBlM6EsIii1eerar9pDYpL23RXkQ8AkeAuLb3RoY0OjkoNgWxTJh QV7ZTvBCKETlNaBcZM8N12YQHDGXIRuQa3bh4+HJWy86Zcb1CHqSclm7KDWIIl1Bd5VRRIhG5qks l1h3Wz/znt4WXGe+YyTIK+/LeA0G1tzAeQLIZAvieE4AONYkLFsGJUZd28oPy3gOJ75XLKKZePBL dYKcn69176pYQYml1CGlA8pGBuR2loljpSRb1kIvzhy4RLIAhbyjJNdj9fJRHmM0WDY3IZ+Zaw6J 4L1AGB4/y1lkbz69Mm1YN97h/8LjaYogvvVutjMMQYOQHQEoAbTq8QAfaE2hgesZF6VZZxVgl/tX FCCuq1KggpcGFPFYMx+QlevCW1S49LFrEtdmoCZPiBVzYlOd6Ke5IV8IfwLM5vCs0sykcH8xsvk5 Mv4YNuW9UkYEQ5nfNfWQjaEgWjkVkelKOlWycrKqgDDKXWfPSqeefKi6QW+WXOlMy5TgOEb79AB1 ZtxNIBwZhkLeYbnfIhmnRHvt2yifp6pXucwnoRLIgRLTa2lrQhX+jX8jfGWAPvE7tBt438luelnd zvewPNelnAEGczYEhqfdpUJzBjQcwjnI5HzuyAhggwbFBuBnfnQO4sUDp9jzqbDZboxMRa74WOS6 fMQahxQvsEjreBF+xOMGyRE22qP8mBIaGBbvmGfY4LgfPBnGH1unKQkKvtH6ODcEKzbAmV4SWj/G lVM/s/EpFG7OSsoP06HXewrrscvEipfYSIBJhwSKPxxuEnzq/8q56r0dsdyu/w+u1IuZYCCFzHZA eO+iMOMxxtMV4Uf2WupsD4/6gHxmlZ33ZSwanlQn8FpusA5UropExw1tKi2t8x9auJU5PTPEQw06 m5gjhiVCNOk50iDaTFIncgpYsO5dGP30GXNqpaIaRjcNxJVUMNJZ9rFmzBEsHPyHfVHX5vaNvAG4 zjGWFrBMrrKrMtPCcCEjvLns9ipuNFOKQyQsVD5ILNsUdiCLBJR0fGG2MDpZ0cSPexss6xqXg7OW F4cD38FqY0FrsJqfHYOIF4xtwKjPsWAR+5atrNFGOw43XMHYYgj1xeDFhrF1DWsft8PKkzcVY+Ce +SQL4eQf5h+btIRIIGCZRsQ0ZQLn3xyfXW6TBR/buiRBOIGm1L7LtGBKcZf4pbydnQjlk23/rZCj bI5B4Dozp2/JUlWEEhsmC+QskEKTxrrM4KsfE5bYfBp5bO6Sli+KA4L5hrvIYTNZ0PmcLqeWrvGh aEGPwKSkosKJ9IPlcs2GdWnlmvVOfFun0nU7zZzhduA8nQQJyrahsOBSx90ThyAWWcWQ0cxDG8IH iFtLd6sZUL3a7k7QfBrTRm2YLe0CXTRNsfBmwLjMQiGMBIkshB3znztJogT5QAyA7xavmo9j8szz xRLOgc9GC4Ec9ThxPdUpgVTNMlassddimuJMXV0WJTbXx4a/KEpPElxUyaHyBxYx8TAlFuXWoxpF mA6yB8VAMR8ueo/5Ej6CYuiqAYRrSNHgx9U5ECbaj4SlsMfZd7Rc3yggOnXy+DRTya3QFqs/TaFM 88oahtXHoRl4BTR/xmqrqoSon+Ukmki6xCtD3OmK1SsjqRABmCZHcqcOiTgA5GmgIZG+P0ElCpsm cnjKHazxRvlPrSEhIY05s133oLFSg9pSk8cBzRxOo8F0cAh4jrFWHVnB6FGsZ8UaZ2kO+AlrzTav vOnM4fZaDXishtp07JNy0MWKIB9EMQ5OWgZ7hSOECDZwhQbYjfe8xzIIzofStsfHgAAo+z88aiW4 C5pX0tsqAMiYqFqOeE4xsQI47MrF24bFiPPJii7gI75bkhH9zW3uVZFKlXtVrOzluRksVH8PXgTM Ocvf+z7yZiwrslyCfninouNtWKI8ZqxetGOW1ZN7AmSIY0VBcllI6tsBWnw2iNo5PKscdIw4q6tZ joZAiyq7PD8MRPHizAqwHlINYLmNAKxig1DHkAE+m1hPzgAMSEVwmh/1JA787GEpNyiGjPJ3ATTF KBKVSoL+gz0ZxRPG+4NHV0rKMYaIuQ6LJcdphBjmcwHZzE/VjAoNytohP8LYFLxTkvI9V/8tMJmr BXGneh2sPjkwTHjs4f2cNn9KWrDHblZ2qdyzcvVah4LNVMMsvE+WDQLbY8eP8Vk5QQnKrkkMcUV/ EuvhoS53VWZPxhyKJbucPxX+9oHLegzwq9WvPNnYs7F+xXsTaxnKSznHouJVhIyUfBcrlSYI+xmw hScqQlIcOouJNtPWYRt4FYknr2duEd4VnTADj5jbiqLlMI28BwXYwgobXsFcEc7nVXTtpbdHGEWZ W4+9tIHhsAq7Oo//JtxU99L3aCcB9jEohHeG4G3jHJRAvB7IyVw5LHgg71eRLhQH7Uutow2K8Bbn qb6Jp6ESCYGHH+M0MjCHhVTzXIBxfU6YCJ7t2Ezh6ZN52oZRlAuNuXiHvUez3AA6OSICaWrFm/Lm EVrkfAO9b+e6z9ooMclVRErYA5yjJrp1vgRTBfahCzfh0NGICEU157GIPo6jzyKDng316odig5Mj ODR2PbCxaIDV7ha7FpwhyiwjSx9BXKnH6oMgyOM23A5QzwxpvsqMHfvCYIx/0SKs7WGpydogVEWr htPaBDwQmHRWcvc4lx4jmUFaiL6G5aJYYyJGFtCSrc2QLsdhkVWKMKPkF+Mqgf5WzxgHli7Ngdq0 vXY5MA8s7MZYcbhQV9I8G3GtocXHnEtTk7AWRsv0EMMwEL9bFasILSshsZfMJEWcxT2zIOdzy4s4 mYpI4DtVZ2MkKQ4l67d5r+oGg75fhA1KcYDrcnjGHMrneUVjPPmVr85HTwhOa2tV1vwKyCsHLXfQ 7xEvRl1yYl+zZQFPCHQWWES7bm6ZoMQmwjW6JXTXq2Pb8rR8lQD2Q486fm93NTuapvhqYrMeWbHc Hotdd9kp7SyriN2vlLkT/7jihC2XvemBB5emO+9b6hnstceuaeedda0Og3Gy4lo7zqDG/Mhcg3W9 hMQD47UgFpnEQ1xPAEU35uH+CEp4ygmwEsLMkdWyGzaOaAA343X8ljK/H3p4Zbro8psVZ9qRdlNT ofm7z0jzdp0uHlcTohwL5vJ47iIWTXIcNkU8GBtaeKOL+yHgNc5wYeWwCQ8/x+aqnjsuW0CnY7I1 T+dPsIcIswCgtwrsKyRlraqX3HzHAxbGixbsnqYozGuiwr02F6tDOZHM+wGuy17jI6zL8HS4/sMN 6VAohI3GagCtexFnTbzkOB2crEErFmQOB+3lNjqVigbU/0Zx4p4kVhFy4jRokXWrqgpwiE2eMtmV WDpUpouDmXCfcfLAoZQ430Pj5OxAhvB3WINCEhbZ5NwAK5TB9xXwmbeO5QaHT8VlFN8th3f1v5Uk U2+moqQiIWMvO+ZWCj98DRBsxIJZMYdacuo6BE+Uy7JRw4gzAES8LD2qAG2WKchXA4W4KouUynVV NxjiPcAo98Gzlq3YdkmGJ6+0ja5a/urbDQAXH9L5sMtgxvRFaOcvM92o8BMhCjiQwuqTTxJdagsf +4iqGrheMxgtnkHeM3jNyiRxmLiQcW2HLApaFms/g/Xe8cFraGUauvIC54OBWwCTkLfx/yH7Mj0r 724z9ao/Ik+FdUMBgGeaZcHmOXQqhcdoRkYp2p5c9nFbHsoAt5ybnJZedkYQ618BNRnMukNtteze BkDy6KC9Y4AJtdQ5FcCLWvkxNucumA4R+jjwCgHoCipWtjCAsee5Ig5Qj99WxjBAUCKT68o5Z2Bq WRSywgYqJaIHyFdVIHkndtlZJfqwFIo2VMMi1BOvHHlLKJ2WWbkCRdACRbAQg2GUvZnBWJ5AZY8y B+RGZSXzelaAc4QqMMriSeCKCG0NvuTHZdjsOQfEorDHHJiSvc9Ogo4Qm7JPDCLtqSjGGo2DhE+s qlaOI6bfK4zyk//jBnWSEeRfUE2M+2HAiLycmK+TtPVDngzr6jwv0Ym9QUI/dKO2OCUQS9y8i0Jg vBI2cUdQkuQJbXE0guZroBN7xPSDvfJuwbvbPI6zz+bkbNPB6hxekACdYLpqHsLgCg+wNhGPz9r5 uizL3ZnY1v3w9FWQMtjNln8HaoZVHz6D7pwp3IGz10pFREsMmEhCCBrX4G3WjAhLGisPSMn/o/IJ Sl2Xzg4JYrldCU0hFl45QkRx+Ks6q51fGOtL1S5Hc6DkEBrk3LFIKuWc4mVPqWU3lnOiJchtwjzu LxZrXLjq+7PbIJIQIz61HKwVpgVHIIhd4SGs0MGgIbC5j+WXfiEuG6YMTSq0YWL7HKhBQwqRTY1v XMe6VaCiqwENMGIIx2gD0j0YAIO1M2IE+U6OobYwYSNTTkUTAwyLuWhf6Y1jNIpFIyySLFCL4pOo aEIpGLulSRrgKseY5RhwbBtoXM100oowE4RRuOSx5kVMqV3tag4DALOWly2YWjJvqiYdmq4FDqNR L5vFIQ2HxfXCUs8Y0T8g1ou8zGdmFh0F0Mafgz8rF6GrhXOzCInQ0OMV7/ZoLiRfhYaetXV/Wq4t YilAycAxWO5aPteoXb0kFIptYxR5P+LroRtCyI1GRG/HKztOfeDYc9yYRg5A3n2XGWmn6VMUNrHF LXKJECfXeMOmtbkVuEIkJKSpohHVNzhEqbscZRcRYBNaFbMr9yIA7+77l6dVa7eoBFR32ksNKugY 2EEMNhZohGbFomC57YYuWCG6Vc+5UfcEpOJ96ZflxNZa6phzUGsOjkxjqlShcDhRJFGE6zWqfOC4 YeNNVevnXWdPFXjeKEBNl0vRRLwIoIxC/vounU5dISUSUopiYgUQL4djS8Pywp5zgwSsZ7jecwIi zYsAsLZWO1QjEjnNZboWJeH+JcvS6vXrLaAQyHOkpMySl8CWHEJglJQUcbPBaXGgRK0YWJ6xcshG m1u6UZJtHbXZnehDgqmUIhIMJyvEg85qrVozkh7pTEdJwRDr8XyUD1t5sEiK3igQXd2qqKNnjBco x6pt66eeC5AG1GAFczIVMXZOGmIPR7IqdKL2tbPOraTErsGF7dqsWJ3ywQ3n+nCxKQAXqCV+AOy8 daBd+K1iR9hKKpo4kZHDj3fZxyiMAARbniJ2GU8C34RuLm6h65sl1CJ2klqvAVTC7Z9BoZWbcmjx L/s1LEJ5sDGSQJb+10ZT3afLWfRlrDHiajc5D8HrEzI9XKkhUcJCFCA9wPCA9Y/3B6ROgInwAnru GbgUZonk4BwySCtleV0IgQtjTDAU+Ia96iZMOUSIe4aHJeqfW2GRDBk3LhK/vC4sNOcASaGWLYB2 7TXJaWRuzCRqTBcKBojhfIjxlvCrOJ6L3Iv7xw+lQ7FvF9kZdHzMy4e+eFdx5I63LZ3k3MQpOAov VKv2eT7+A8RwHmQjU3hAgkcjH6jwZoDUAlS53lWs8qvaMhsjD9CIzG0hmUuj6aQZlj6DRi0u7Ult L1z5fGHgOXFLAEs8HyaIvKOy7sic8NiFJ4s1g0o5RhialvErvj0AIYBUShFHAOBRc2xVCNxY/Ufe RckNGScPGaF/DZJbLrUmWWJcAm8SOw4fMiQMaDyUIgVgAoCB94V95ObPsD4HD0Q4QSifrkCU+Tny PwLTDFjyYw+aF3m5IVlUQ8Ejx31D4YtVjMThANdhgBSfuHQeIYWS7XhiPRYIgyJYlLxgQANDKyWx xsYwpnfk/EQLdT4NMB+hDzovNNVOef0cpoLVVbQiesAhKfrbNbE1ptY+KVJY/XX+kFDNUzx/YzKa dpGIGZW3zO/myYDV5gGMJLxH+JD5uNCWRUbWAeAlizFQ5uINTmbUWGN/Iz+5LvMrOENz8PlGLwLF pDj23cZVEvfxtOY1Mq3CQBHREUED+wLBXD4DOQWzcaJqU4IDON8Di5Qf9oDOqSZVq5EFGqBMmGhR SAgnbRVeYDx4dDnrTUuq3I2bZCUQbOgGeuQDuIQrhQhyMim8AebNzmt4qNFl6qCD/sH9EQlXWDJY Uw47SsCw8JENGgcILr0Q8gA5Lav+juBwXt7cBpgB3mAU4lOZqGOPBZqhvt1kPE+Ddnk9+FnvtcE4 WSumKH8n2aB5seA1BHIJz/DAeeXDwK2NJcSJ9bS2w4b2aQXQjgOA+XSoDuTWnja70GE0u6t9KKGJ EZOkZjHSCgHgjiGFlAgSGEcbyIe4+T4nP2oADSQuaHAc9Aa4FjDhzoJlXXWF0BdJd1rKd9ntCaCS VdHjDJdKnk6sS/4p74UoKdt7gKMGxG12rep5Qzi9kU5m/PBElAMx1nMAQPMBbj82XKyVDzT/fwie IpC8IbOwCeFeSo1la3/UvbHl1YKkB2ECDYJPOrUOuAQBH5XkRb0/RRbqsWOmpDFTxun6nrR+w5r0 8PJH08MKqQAYzZHFeqqy0ttVP3uLeIYST2yEyYqxpo0wSTEMfeqUKelZxx2WDttfVk9ApIDMGjXQ cfY0ySJOYEA4hRZfWqk2ZAs7SY3MmAQvH5NYKTh0TKIQkuYxgwYAhDaY7uMECSqcm7d0cJCwqu9P Hj8tzZ29q0IiZJEQnyC0KVfoOp9YoHWtaydHQJXGxMEE0/O7fiqlDmPto/MVH0eojEtA6ttRH1y8 SNiA1tHChATQ7Cpes25DuuXOB7wW81Ua7ZADFqVdpk634N0sC0hH1ybPyYoj3BumK69wAIMAAdSJ zsdaVgZ0SR5raf6Elt8tkL1FGdVbZTHgeoAQJaJQLAnxYFwb1VRkqw6kGdNlyVd5wDZ1r9y4kbUK C/bUiZNTl1x3NJHAao2EIRmUEJK14mfHuBJ2ocEBoFEsIqcEaaG8D5Qp/TiUAIMAZ8/A6M3zAYbg 4vjXYSF55iGDquhg8RqyyO55+CDvBl/lgyoAcgm7wHKCQo+lzjIOhQhLCUlvmmeTuscaNzqh20Kt Ap6jkgkWsEiaKgmDoYiHclCAt20GfnYAw21DEJhJtjbaEMLODnngyk2WRVEGjUOwGE2sdJX7FZro WiphWCHNZwJ0s7wzH0S1CsLoiNUkEUh9MPQsrDsRMoVXx8mdGDYwCmgNQxkKeWhwZ2Upe4NwwbMH 9T2vCR4wfdbcIuun9tKA8zZySgbkWgzaq8xBXQmpKSucRZ2vCiub8wZCAI7w4p7BN72mXeVJPiHj kM9rwTXIm/xfUWxsFY0EItEq6B8/eRYZ/DRi6Bm0DvG0uJq1piJGUh3hPht7Mgi2EkrDl4Fcm5LQ aCtmPlkq/Mo+oIKN+TpOmKBd/JTQic52yTLkKWesw30inKCMKcAR5y4VoOj0HDWnKbeHEh2el4wN 4AnnUoFHCHEzs4gudEiOmvWml3kxcItDVwr/ShZUukaHpmlvecCcUCQDYIbiF2F+MEPx4oQCV/HG GhzqWTQNIzQF70pWOEKRJ3dBCdY6h8irQWaR0E1oXKtzS1AQdQ9jIOS87m8rsB7J8ZENkuZH1i2H FbhJGeNHQrkhTJyXluEaL83kWAt3HtT9UEgc4sc17pjJfgkDDI14dDKYzq6cQRilQRTygfM4wIzB vb1H4QmiDTsheT3kwui7AHb3vSDGmb8dlkWnWzAQIDxQmfmoAlJYuygBiDLEmYlCRDIi4RkMA3jK 98ilI47aqMnyi2Fl5T/j1CiCEeElPAReBlfEqxo7FURkCOxYbstbXdXcQHlpGRYIaaEcMlZqzYKk engaudKjH9fQ5izVYDD6YjjzXCknaws1v6PU6L58Ri6gftgLyLXGf3/P161CecENEoowDkEbbtTQ 6IrlIwR4sarweABYCPIQdpX/C5BmMJ41NG/UsIyEmyAzL9/139kqwW/50Cjl6zIF86E1YEOKm8Qz LY5ob0QMbRaQvk/e7AEOONRy3WzM/Pqcg5nFgrkBIszRSXRWNEjUAnznKhAW9kEfCzM/OazfPMYb hAM+x3RaO/YgCbQPzYwDxEBbX3D5lyysquME81fin/ygMg3GUnmxefMf/OsqBbhiqi4ZuDYO4Vju WG8nIDGnAQJ7rH4nC2biteJ4yBa6ykCC7gOvsqviIC6gAxbnDngeHBvpQyS7DXO5uMq1uh0WR5g9 7IhqEy432AYBrXUbldGrXTpTiY5cQ2KerVdsTAQaVSc0H4cUYamhjieuMNZFI9iquM0tm5QMJ1ck 1tKSwOtjI2S2XjleDAFDDkLWkqstfxaY8KwFcfDwgBsdC0QGao6hQzA5FdjfKU0FOOjsWpXwsVfH AjhbQfP62qoIn+TXNpTOTGCF07wVCXIwp0M0cpKlBagGaTclri49Y4uUmYceXuGi+zTGmSqr8jhi H/V9GsKEuzB7fnw2VzNc7Czzg60RsafgjrCqhSWvgEHXrNU9oZlpqF+IC3RGPJYsuYM5MNyyVuOm Sgh04hDeCnjWWKgzTlJmqdldDnc3ALDVKJ4X5cZif9qlqcO7WKiKghDhAFiWUJRCXY0dGoCqYgnm LzxsnmcswMC+y3u/kAV+8JkS7we4zvuWeeOBwC0s3vehzB7MnjzAK59xwJWk7JCZnkrsw8w7URIy yzl/WNTtuDaU3hAIAb4z4+TDe2Cfht0nxhvCxUdP4LCgCcClKlG3jGHgHrGe+ZuV5xeZWECskY2X PT4pQCKMNuyfAAPhCYgkyWgMFYMv6xFW0WIFK7IoxszbpcRXKHvx46t95sRpbfmVaTKgNsWMtpWX ZWG5Q7Xponr28fvA3qiWIYUKA3cOzii0jf1SAHZ+u7LLth1L+Vbca7CtuYzIfJrvGS2x42/fK8sq g9I826iOlUeQp5vVQe9rXlYfTbqBERU5WPYEwC7CKQY8oNueJpG0Cxu4WhCWVscER7iFS9dhZMte YMI6kbk8EhkBv5T6zPG9wBRQL7BEjM3nM3KIuXv/cI/MQxXKwythTY7QpbDShmJc+Lns8yBK1LtH ZsR3grOCR52MrDFRdpVwPTxpjIEKHBhOKuUPMb7k8KGIVw/ZUM7dkCtZcfFyxZ6v5CWU/asLscxG 2bqwWnOpaWL5l71C+eyFKBGGYoFQsYhX8Fxhc/MBCx78EK9ofBRAP87EgR4jke/D+Fw22XgDejKN 4O14sb+R95oLdQgZZ47Ljv0e1nA/0Vb0AfyXv17hQSY6SKQFX2ZZV81z1fuH2PASAsQNbOzFck+y POHPlDf2mYnigcIUydSxxqInZyl8qv8ijjvqxUMnih04gooobsKBwI9WkMSzn/7YDzIhCkEzTbb5 pwy1WmAE4coiFEJu+3f1TbZ3/6Geub1xjHSvweOsvtdgoTfABANjj80zIKIHj2V79w+mLBtwgEbD jaH6+tHS4c/puuFoFcJj+69qKFksP+U71Z+Vu1TzRfX6VT+nem0Gf2+ozwqfV/P6SPxX1nSoPTLU jAu/DUeN4T4fTNvBvF2RnJnW1bzO7wU0lANj8PXV498Rnhtqjw03h6FkSHmvGtSUMTKO6nFX03rw GAfzQ/Xn1ffbkbntqCwo14+G3wfTYvB4q+81FM8Pd/0Tmd/25NYf4r6D6VIte4eSD9WfV9PjD7We j3d9/xC0+GPeYyi5XE3vHTnbR5Ljg+VgAV+D5cRQMn2o83l7fD54LKOR1UPRfUfuU42PhpNBg+c6 mrUePPbtrc9wsq3sr2rZPtyzB89juL24vb22PV54vGsxGlrtyDXVazH4jBnqPCnz3d6eKbQawBCC 6qqYUHkNxQAjge6hGGC474xE+MGH/0iLMdz9RvrejizEH/ra4QDQH/o5T9X9hhIAhWFH4qURAEMx lVRkddUBYLKOct09xDzOx3xle7y7PbBWBjXUYTDKcf2xl2wbeo52bYYaZDVwHu3eHwokDcEnZa22 u7a6aDDZPcw/UboPu85DCe8nwhQjgZ6R+HlHaLi9sQ+1OCNd/1Sv3R96LUYCNDuyzqOhzZAbYtBD hpPVo5HXOzLeHb12R2i/vTkMBZSqeXpH8MMAaNp2NoPOoOoPK8s0mvXaURqN5vqR9tiQg33sjUe1 HKO6KJ+7g+VOFQ2HlNsjrfFoabEj8mw099z+NWEH3+Y10t+DbzgUg44k1IcaVPV3yu+P5z7Dbagn Tqw/3B2Gmusf7u5/OnfaUV4qIx/FulcD5MrXRvG9Edl3e/cY6f7DretI3/sTWLFqoL3Dw3k8/Ly9 PT4EvUY7vm2++mdA98fQ+o855tE8azTXjHbf7og82JHn7jDDjvILfwpjGOmsHGkqo53DH+ocH2k8 o/18tOOuvt9ovzPSdcN9voM0qlw+0vNGS5PHc91onz3CdaO6zaguygB7e+v2RM7gkWg02jGOdJ+R P8/FgUa+sHZFjQI1CtQoUKNAjQI1CtQoUKNAjQI1CmyfAjVwXeOQGgVqFKhR4P8aBZzdVcrxyVpD Rr3r2dZeNQrUKFCjQI0CTzYFauD6yaZw7f41CtQoUKPAH5MCBtZdqVm1W6dPneIqGutUfnLrFnXB LDVn/5jjqT2rRoEaBWoUeJpRoAaun2YLXptujQI1CvwfpgAlpHo70/RZs9J73/NX6dRTjkzXX39X +vgnv5tu+f1dNXD9f3jpa1OrUaBGgT8dCtTA9Z/OWtRGUqNAjQI1CjwxCigUZPbOO6cPfODN6XWv eV66+urb0g9+cH668/bFUQy69qpRoEaBGgVqFHjSKVAD1086iWsPGHWJvMGk2l6FCFzfbk6Ry/hw be5oNyTFR1umb6gvj1SponoMo1nuJ/N6l+SkkUKhi/4GVD2mKtDggUJLruX9UWZU7+g8tkeb0Zba 2xH6jubacs1Iazzaez0RmjxRGqjhQ7MaK73udc9PJ514aPrkZ36YPvOp76VHHl6u0avTIH3Xh3tV nk189mgnW3Wd92LuQMP33e0hGm/s8Ovx0NDsXiULduShfI2uDzzXYx/NftnOA3Z0/DtyPdcW2ccQ isx7vPy7o3K0THtHxuyl2c7aPB7ZPNJ8h+RHePLxMOSOMFPt2hoFggI1cF3jhCeXAiRV9dPKt7QE Hs3jEIACA2pBvg0oRD7TbUoNU6PHHdfBwvpXnd0igQvrnN5T29mKIPUY+E50hRz9K9/f4xjC6pdj W2Nu1dcOI8A9fq5lLPzB2LcDenzol7Hzh8bh9utDzMAtN8scy9bOdDHY5j09q5ou5TZuhQtdGRsA TM+hm9ZwL19fTU/GpZ/Hc25V1rQzr+ngh5abMi5AD3wxzNi8HoXXhmpIMdyEypyfgDh0+znmAB3d 4J22cqNjNY+7mq+HogF0yLxN59ehaKBLmrVu115/e7ro4uvS9df8HobTuowdPplxG5qxGEPsu+3y QaF39V6EF0tXUY21Dr7bDrAv9zfQq+Zj0a9eba9HUgzdwbQj32UYHh9qDpU14/t5/FYQ6JbJF/Ts 4fbbUPeryAP2BvdjX1TJocHfqciDLD/quH4IOlWSU4vc45rch9L7lsEWWTIKnqvsOZ5bZGZ+bkWO 5vsNnr+/y3fg9WqZtJ3Nr86xIVsYZ16fSptS5lTk4ei2S0VGDR6b17P6rMkyo6ypxws/DkPn0T6+ dl2NAqOgwCh24ijuUrukRoGhKCDA19LSlI48+rA0e/ZUtShHyG4fgdHCtampId1337J00413C1tK IFPlwIKzQ0UPWtI+e+2d9tl/ftptt9lp4oSxbvu6SclaK5avSXfdtTjdfvv9qUvt0g349PWW1uZ0 1FGHpZmzpwnD0Gp5YLDVbb23aZ8KUFH72gcfXJ5+f/2dqUtttrc5+PKBt3CvBemgg/b0+X/Tzfel e/V8C/ChAIEOwp13nZ0OO3zfNGZsa3rgvofTjdffpjmKLhwUg1+6fvz48emo445OUyZOSJddemNa uXLNoHFw2MWhO33WjHTA/numBQt3SzNmTJahsjG1tXWmFSvXprs1rjtEl7atm/Lhkp+XLVf7H7hX 2v+AhenRR9eka66+JXW0M98hQGz0ME77HrBP2l9r0KX28zfeeE9a8sDSDER2EGFrjjNmT0+Hiybj lIBH2/rqdaD97ma1q1+xYnV6eNlK/b4xzmiDrkHjE68sWDQvHXDAnm5N7FbwI/BbU1Nj2iLeufaa W9Oa1WsDDO3oy8pbr3hy73SgaLh+w6Z09VW3po0bNo8MKs1HfWmPPeemQw5eZLxCO+EBKva7DfyG 9ZvT8kdXp6XLVqTuzq2iwSAFkjGLHls2b0n33rPU43jWKc9M12heWzbr+qFemYd332O3dPih+6ZG 7bvbb38g3X7Lvdxs+/HZPaFcTZsxQ88Sz+25e5o+fbL2e7NbQK9duyktfvCRdNut96ZHsZz30A94 BNpKkZw2Y6r26gFp0uTx6abf35PuvI2xDKNMMCfxC3vpmOOPlIyZlu69d1m64bo73Yp4u8mbbgnd naZNn54OO2y/tGjveWny5Ampp6snPfLoqnTzzfekW0WHPsWvh+I4Al/T/lurtv/B+6b9tC/atX+u v/6OtOyhhzUOlIQh9pLGMGePXfX8fdO6tRvT7353S+rqHLTvzFud4ufWtGivRWnffRek3XefnSZM GOfW0Rs2bk5LlizX3r5P8mSZ6EzS6hB7o6y/FWOAcUPaY/5cjXVRmjtvZ819nK/YtGlrWsb97ngg 3X33EtFXSku1cUH7dcr0KenYYw9MY8a0ms+XLdX6Mr+haKTxT5g0IR3/zEPSWK3TDaLJgw+IJnWi iRTh+QvmpgPF97QJp2X7SPsVHt26pSNdd+1tafUq9muWYwbwXWnK1OmSSwvTnnvNkQycmlp1/vSI 99av35QefOjRdPut96UlDz0S/GhwvoPyakdlQ+36py0FauD6abv0f4SJ9wscTpykxKrXpSMP399y rHEEax5AuaGhLn3n+79Ob3nLh1Jnm0Byn74oS+keEsRveONL0unPOSrtvddcgfBt2Rfcd+99S2S1 uz797+fOSnfdcY+F9dRp09N//89b02GH7KNDty+8vxh19QvApVfgplEu86ampoHG9fqcKgs/+8Wl 6a/f+j8CXhqHrUX5JUA7bsL49M53viK96uWn+s0f/ujC9Hfv/HjaqgPKFtbql925vQKR+6QvfuFf BJrHpFtvvT+97W8/KvAuC2M/FpVqQc8Au9Kuu0xP//7eN6R999kjveRl704rf/OoaKGuqoD3bCkb JwD+4pecnF7+8uekgw5YYJCxzaNFmPsXP5yuvOq29M1v/DJddtn1Olx0iDeifHCg9aaXveyU9Hd/ +zJZPe9Ir3rN+9NygbiBNuNVd5NlaOr0qen973tDeq7Woae7N335q79I//aez6bOTlmNuOdoX6ZJ twDD/PSxD/9t2nXXGTqj6zOPhAZkcL2lTUrFunT/A4+kSy6+IZ1zzqU6IHVA9+tAL2DYYTB96bRT j07ve+9fpVYpVChp3G97XudGKRBLlq5Mb3zjf6aLL87hE6MdP9d5Dh1p3vz56SMfels6QSDi/sWP iIbvSxvXr48xbu8AN/170inPPiL9z3/9tXiu3nzNuEHa3B7FbuPGrWn58rXpzrseTOf/+sp0wa+v SuvXrdvWCpeVxjNfeGL6r/98U3rkkdXpzBf/oxQ+KSTVvFvh4d7UJAXyjW94Yfrbv/4Lg+tzzvtd +tu3fyStWrlSyz9maEoIFDU1N6bnv+CU9Fd/+fz0jEP2SjNnTn3MtWvXbUq3Cax/4xvnpB//6Nep owOguh2AjVKhkIxXaj+96EUnpkukTL7pTR9MSx+S4lYnwDiYjgaePel5ZxyXPvHxd6YxWvN//tf/ Tddfe8vQvFtGaG9Qb3rmSUelv3/HK9KxxxyYpk2btM347xCdzzrrovT5//1RBnHbsUDzTd2zUYrF K15xanrbX7/UcuX7P7wgvfvdn02bN24QLas7IWe+0bofd+xB6ZOfeKeVmpf+v39Na6REVvYdXhhZ Xffdb5/02teekZ71rMPSXovmCNSKFlWvzVIO77r7wfTrX1+dvvOdc9P990rB7x/COpu9W7vN3S29 RvH4Z5x+XNpHSsUEGSiqX21tHemee5ak3/z22vQ17e2B+4knBfQXSnn/+EfekWbNmpre8tcfST/4 nkB9HxbpIYCq9vduu81IH/+YrhePvOsfPy1wrfU033elZ59yePrAf7xFIFj7VTK4Xvy/vf3K/lj2 sPbrm/87XXQBMgqQLmAt3jjtuSelN73xhekIKSs77zzjMfy4QXIZOn/ve+en733nnLQZpbNxW1ru yNavXVujwPYoUAPXNf54cimgA3/KpIkGk1gObr3lPiCDLYtDver662ToaTDw7Ofw5EAVsN51953T hz70t+mlLz5ZVqHO9NOfXpxu/P3dthICoGfMmJKOkPXz9Occk/Z6y5w0d+4u6e1v/3B68P77ZIXt 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 EQCVe+QrLz4uzw7pHmuc6tetJBN+f48jZNcZ0KdSqgz6jXnG+eJII4958oQPJAPGlPxkR1p8WGDg E53kUTh02ax47XXqVJRJE0Zrhc/E6HiTJ//Uk91x3XaSGdx/A3sQdE/8/V1JD2oT6TuOtDq1K8rv v7+PiHeE5LAxVx25xsP8jM3IdUBAgOzZs0cLApQrV86hRfhhdtq8l/MWYBLajh07tOBElSpV7C7I Fy9elCNHjqgqSFIkRTn/BOY3HtQCly5dkgMHDmg1TW9v7wQvxwWYZbWZFFejRg3l75rN/S2A0tSI AF7Uapr2ylMTWO/evVudbHA30yzAJkjLlSv7Aw2+hU6VVZxlwFNPmT9xG8G2LWkze51khHv79h16 JF+3bl091vdK4NmYuLxz505EGvPY3DcyAjx55XbcNrSDsw4K7Z8zu7OWs2eJe38nqI6vlLejV2H1 SP5YNzoxGTMmXb95L4JXZ+zP7zARke816aPMnzGcbFt2IO87Q/rbkNU7KMWKF4ce9T3OtcO2wVzN i0i1dcuAMU1o3sV37Rx4h/jjDi1eWgg2VzYH/UR3eFSzj7CABjoInOxFOwydXEcScEzLuocFOOZx Bf/j67kx/ohco8oyQkZmSzUWcPSdtloDdN1INQZIww/CKpGG/rUj88B6H3Bk30jDpnWrRzfmgCOd DkOkOJz5Aq7I6HXkhqnkMzbBNZOhGjdurBrJjhwdphJbpOrHYOSRSi8cT0fGlNFqRrnT8nFwapsQ 0L3WCJQjY8o5UqFCBRzJlnW56kxqs6s7PQ9PIsuUKePQHOA8YcSaQRZH5ow72SGt9tVqTB2aA9nB xW7UqJHSyBzZN9KqXd3puTmmDRs21PF0ZEyJA7hvOEIndSc7JHVfbYJrGtzUr01q0z/86zszplxM HeHlPvynMO+YWAvwvbaX3W19bXMOJNbSKfd73CCd2SRdLeeZci2TdnrmzJjytMuZfSPtWNF9n9TZ MTXxYOLG2lQLSZzdzG+ZFjAtYFrAtIBpAdMCpgVMC5gWuM8CGYKDg/V4yPRO0+bsoHoAq7lx/J2J aKRNa6XOp6aCCH+oX26eVqTOMbb3VFwDuBawIIQjR8X2rmf+3f0swORFjr1Zx8D9xs4VPSYPm3PA xIOusCaSTefOnRtduXJlD2aPmxura4zqTldh+VJmg4Nbqxxbs6U9C5w5c0aVYWrVqiVFijimwZv2 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 wJLA/wPGPBhJLj2fdQAAAABJRU5ErkJggg== ------=_NextPart_000_007C_01D1F22A.7DE5DEA0-- From chingimleong@yahoo.com.sg Tue Aug 9 10:45:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BB5CA7CA0 for ; Tue, 9 Aug 2016 10:45:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 893D4304062 for ; Tue, 9 Aug 2016 08:45:50 -0700 (PDT) X-ASG-Debug-ID: 1470757547-0bf57b369d53e460001-NocioJ Received: from nm15-vm4.bullet.mail.sg3.yahoo.com (nm15-vm4.bullet.mail.sg3.yahoo.com [106.10.149.51]) by cuda.sgi.com with ESMTP id RJ6nhR0pfrFBEbEf (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 09 Aug 2016 08:45:48 -0700 (PDT) X-Barracuda-Envelope-From: chingimleong@yahoo.com.sg X-ASG-Whitelist: Sender X-Barracuda-Effective-Source-IP: nm15-vm4.bullet.mail.sg3.yahoo.com[106.10.149.51] X-Barracuda-Apparent-Source-IP: 106.10.149.51 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com.sg; s=s2048; t=1470757546; bh=w8ofFpKvLLKj+id0/7ZLdaPTGc/Pcay62fjjkZOjQu0=; h=Date:From:Reply-To:To:In-Reply-To:References:Subject:From:Subject; b=QaRmzK6V78b5JPcDDFpLFfDvzfxWQzIYaN0P0VGcx/OM4P0Xb5JoSOFn0cYoKqWriGwurarojxfK7OBBZB2WZeBIaYlZ9iSR8KcOqtG8txQhtBSzAqnThwX6sForjqbesS5li77EEfdMeE7fvdHwBO2Gj/z4VwcjdCrP83ZK1LsSlbazai1N9c03Wjw8K69im0A6N6ER3N/SoZAbxiDADNJO7HgUZuNfgaOpDyonAf4BlnCnfrfgPTliGlXGpuPans15EvDFffNmb84a2d9OpCE9qSC8rckBgR6Asix87gCHKcmrkEbb6Q2lVYxMTTCkHP0mA8bZyfaUcG5ZGasQDg== Received: from [106.10.166.121] by nm15.bullet.mail.sg3.yahoo.com with NNFMP; 09 Aug 2016 15:45:46 -0000 Received: from [106.10.151.252] by tm10.bullet.mail.sg3.yahoo.com with NNFMP; 09 Aug 2016 15:45:46 -0000 Received: from [127.0.0.1] by omp1001.mail.sg3.yahoo.com with NNFMP; 09 Aug 2016 15:45:46 -0000 X-Yahoo-Newman-Property: ymail-3 X-Yahoo-Newman-Id: 447347.14667.bm@omp1001.mail.sg3.yahoo.com X-YMail-OSG: 79QAfGwVM1lYJjZ4KBauWq0RBwvrerXsCtauY91qVrKa2wiA4Bh19RUxiXlcRgl 55QE1My5JOOCye2U5.JXdXcdtfNZObPH7aZUpeXFE8EOcdSxhrkYs12wv0jG1u3OBXpCyGUQ1Ygr WZ4Sb84TK.nEnk9URmSKpG2csjzTuKqj1r90HkqW._CzD_mLSOss0h.wRbJFb7ZRVKTFWffMIkXF EZmmsCoGBLR8jL_jBkxelRTXui6Zr3StSWjL44O4UdwvDGkNHSx9.9xhschvMGHYGs6u8SpPEwpT n3rN_T8VWrnN4ZRdLVgOOTK3pphwB7U6OGS31chWgFc6HPKWj8yzt5xz_UwrixyaxqkSpdDeKTo2 DkqZMgT3FQQsu.GWs7BUigkDd4ilx_LrboXomNFdKk87Hsq4jb1dUPAey6TaqUzP8GuNkQetS_1f ofbZJw.HTEWO5yTojYmtuWT_8AphzoFzsDcaz6xy99wURS.c9NSXQzcJtaMhMIa_W4jZqfdZc5Ox 2Qh5HG6Mwqf9iqYySVfqLDNLuQ3uFEaI- Received: from jws10969.mail.sg3.yahoo.com by sendmailws117.mail.sg3.yahoo.com; Tue, 09 Aug 2016 15:44:06 +0000; 1470757446.199 Date: Tue, 9 Aug 2016 15:43:03 +0000 (UTC) From: Gim Leong Chin Reply-To: Gim Leong Chin To: "Carlos E. R." , XFS mail list Message-ID: <291675510.10842010.1470757383533.JavaMail.yahoo@mail.yahoo.com> In-Reply-To: <7faf941c-2188-589d-b624-9fedb22dee40@telefonica.net> References: <5787852A.7030900@st-andrews.ac.uk> <20160808161132.1d76eb5c@harpe.intellique.com> <1470670691.8958.11.camel@filmlight.ltd.uk> <20160808174427.24d8272c@harpe.intellique.com> <592673683.10446004.1470715375850.JavaMail.yahoo@mail.yahoo.com> <7faf941c-2188-589d-b624-9fedb22dee40@telefonica.net> Subject: Re: Advice needed with file system corruption MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Advice needed with file system corruption Content-Type: multipart/alternative; boundary="----=_Part_10842009_715577767.1470757383530" X-Barracuda-Connect: nm15-vm4.bullet.mail.sg3.yahoo.com[106.10.149.51] X-Barracuda-Start-Time: 1470757548 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4525 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ------=_Part_10842009_715577767.1470757383530 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 2016-08-09 06:02, Gim Leong Chin wrote: >> Drives connected to RAID controllers with battery backed cache should >> have their caches "disabled" (they are really set to write through mode >> instead).=C2=A0 By the way, I found out in lab testing that 7200 RPM SAT= A >> drives suffer a big performance loss when doing sequential writes in >> cache write through mode.< > If you disable the disk internal cache, as a consequence you also > disable the disk internal write optimizations. It has to be much slower > at writing. It seems to me obvious. > --=20 > Cheers / Saludos, =C2=A0> =C2=A0 =C2=A0=C2=A0=C2=A0 Carlos E. R. =C2=A0> =C2=A0 =C2=A0=C2=A0=C2=A0 (from 13.1 x86_64 "Bottle" at Telcontar) The drop in sequential write data rate for 3.5" 7200 RPM SATA drives was ar= ound 50%, I cannot remember the exact numbers, that is not obvious to me. As a reminder, the drive cache is really set to write through mode, it is n= ot possible to disable the cache, as an application engineer from HGST told= me, so the drive internal write optimizations are still there, just that t= he IO command is reported to be completed only when the data has been write= n to the drive platter. 10k and 15k RPM SAS drives connected to LSI Internal RAID controllers have = their drive cache "disabled" automatically, I wonder how much is the data r= ate drop compared to drive cache "enabled", considering that LSI IR control= lers do not have cache. GL ------=_Part_10842009_715577767.1470757383530 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
On 2016-08-09 06:02= , Gim Leong Chin wrote:



=
>> Drives connected to RAID controllers with batte= ry backed cache should
>> have their caches "disabl= ed" (they are really set to write through mode
>> i= nstead).  By the way, I found out in lab testing that 7200 RPM SATA>> drives suffer a big performance loss when doing se= quential writes in
>> cache write through mode.<=

> If you disable the disk internal cache, as a = consequence you also
> disable the disk internal write= optimizations. It has to be much slower
> at writing.= It seems to me obvious.

> --
> Cheers / Saludos,

&= nbsp;>       Carlos E. R.
 >     &= nbsp; (from 13.1 x86_64 "Bottle" at Telcontar)


The drop in sequential write data rate for 3.5" 7200 RPM SATA d= rives was around 50%, I cannot remember the exact numbers, that is not obvi= ous to me.

As a reminder, the drive cache is really= set to write through mode, it is not possible to disable the cache, as an = application engineer from HGST told me, so the drive internal write optimiz= ations are still there, just that the IO command is reported to be complete= d only when the data has been writen to the drive platter.

10k and 15k RPM SAS drives connected to LSI Internal RAID controlle= rs have their drive cache "disabled" automatically, I wonder how much is th= e data rate drop compared to drive cache "enabled", considering that LSI IR= controllers do not have cache.

GL
=
------=_Part_10842009_715577767.1470757383530-- From felix.janda@posteo.de Tue Aug 9 12:42:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D10237CA0 for ; Tue, 9 Aug 2016 12:42:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A19098F8049 for ; Tue, 9 Aug 2016 10:41:58 -0700 (PDT) X-ASG-Debug-ID: 1470764515-0bf57c13684bf570001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id vHuc0doi0fMz8QdR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 10:41:55 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id C922B20B69 for ; Tue, 9 Aug 2016 19:41:53 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s81mw6jYhzysV; Tue, 9 Aug 2016 19:41:52 +0200 (CEST) Date: Tue, 9 Aug 2016 19:41:05 +0200 From: Felix Janda To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE Message-ID: <20160809174105.GA5907@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE References: <20160809073611.GC25647@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809073611.GC25647@infradead.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470764515 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1043 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Thanks for reviewing the patch series! > Does this also error out for libraries that don't support large > off_t at all? I think that would be helpful to add if not there yet. I do not quite understand. Do you refer to libraries using libxfs or the external libraries used by xfsprogs? For the latter, none of them exports interfaces using off_t. libblkid has its own blkid_loff_t, which is defined as int64_t. For the former, patch 13 forces any user of libxfs to enable transparent LFS, by for example adding AC_SYS_LARGEFILE. The approach of libblkid is the same as what I was suggesting in a previous patch, but maybe it is good to break applications using libxfs and not transparent LFS. For example this seems to be the case for ceph. It has not enabled transparent LFS but mixes off_t and off64_t. So it is likely that it has some LFS related runtime bugs on 32bit systems. If the xfs header included the off_t size check, building ceph on 32bit systems would lead to a less subtle compile failure. Felix From felix.janda@posteo.de Tue Aug 9 12:42:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DAFB57CA4 for ; Tue, 9 Aug 2016 12:42:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9B3C0304048 for ; Tue, 9 Aug 2016 10:42:50 -0700 (PDT) X-ASG-Debug-ID: 1470764566-0bf8157e6b607240001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id xIjIcvHJiXW8nsp6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 10:42:48 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 71B6B2045A for ; Tue, 9 Aug 2016 19:42:46 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s81nx5jpYzyZw; Tue, 9 Aug 2016 19:42:45 +0200 (CEST) Date: Tue, 9 Aug 2016 19:41:58 +0200 From: Felix Janda To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs Message-ID: <20160809174158.GA4476@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs References: <20160809074010.GM25647@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809074010.GM25647@infradead.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470764568 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1087 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Christoph Hellwig wrote: > On Sun, Aug 07, 2016 at 08:24:40AM +0200, Felix Janda wrote: > > For this it was necessary to change a workaround for missing > > f_brsize on Mac OS X. > > If we can get rid of that it'd be fine, but can you explain a bit > more why we can get rid of it? Since we are using transparent LFS, statvfs64 is the same as statvfs, if statvfs64 is defined at all. In commit b35b4eb8f91d13a326213f989e it was noticed that OS X is missing statvfs64, and a define was added to darwin.h. The same commit also fixes the absense of the f_brsize field in struct statfs on OS X by adding code conditional on the statvfs64 define. (Notice that this condition might have false positives. Indeed, on linux with musl libc, statvfs64 is also a define.) This patch removes the usage of statvfs64 and thus one of the problems for Mac OS X. The other problem is solved by giving a suitable definition of f_brsize. Note that this might collide with other uses of f_brsize (if they exist). It might be cleaner to just check for Mac OS X in xfs_fsr.c. Felix From felix.janda@posteo.de Tue Aug 9 13:04:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D49C57CA2 for ; Tue, 9 Aug 2016 13:04:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95B958F8037 for ; Tue, 9 Aug 2016 11:04:12 -0700 (PDT) X-ASG-Debug-ID: 1470765848-0bf8157e6a60b4e0001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id DZ3dXJg3SUebqygI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 11:04:10 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id A452620B3B for ; Tue, 9 Aug 2016 20:04:08 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s82Gc12ysz104j; Tue, 9 Aug 2016 20:04:08 +0200 (CEST) Date: Tue, 9 Aug 2016 20:03:20 +0200 From: Felix Janda To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 13/14] xfs.h: require transparent LFS Message-ID: <20160809180320.GB4476@nyan> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 13/14] xfs.h: require transparent LFS References: <3be2b10b0037406374a415fda2318cbf95a67546.1470555003.git.felix.janda@posteo.de> <20160809074138.GO25647@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809074138.GO25647@infradead.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470765849 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 984 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Since our interfaces depend on the consistent use of a 64bit offset type, force downstreams to use transparent LFS (_FILE_OFFSET_BITS=64), so that it becomes impossible for them to use 32bit interfaces. Signed-off-by: Felix Janda --- Christoph Hellwig wrote: > > +extern int xfs_assert_largefile[sizeof(off_t)-8]; > > Please add a comment on why we have this declaration, otherwise this > looks fine to me: > > Reviewed-by: Christoph Hellwig A simple comment is added. --- include/xfs.h | 5 ++ 1 file changed, 5 insertions(+) diff --git a/include/xfs.h b/include/xfs.h index 7bed957..37c95fe 100644 --- a/include/xfs.h +++ b/include/xfs.h @@ -47,6 +47,11 @@ # error unknown platform... have fun porting! #endif +/* + * make sure that any user of the xfs headers has a 64bit off_t type + */ +extern int xfs_assert_largefile[sizeof(off_t)-8]; + /* * sparse kernel source annotations */ -- 2.7.3 From felix.janda@posteo.de Tue Aug 9 13:07:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5C7DD7CA2 for ; Tue, 9 Aug 2016 13:07:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1EF96304048 for ; Tue, 9 Aug 2016 11:06:57 -0700 (PDT) X-ASG-Debug-ID: 1470766013-0bf8157e6b60bcc0001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id E2hz358YVFpzbLbD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 11:06:54 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 58D1420464 for ; Tue, 9 Aug 2016 20:06:53 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s82Km6c5Jzydk for ; Tue, 9 Aug 2016 20:06:52 +0200 (CEST) Date: Tue, 9 Aug 2016 20:06:05 +0200 From: Felix Janda To: xfs@oss.sgi.com Subject: [PATCH xfsprogs] fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise Message-ID: <20160809180605.GA7664@nyan> X-ASG-Orig-Subj: [PATCH xfsprogs] fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1470766014 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 574 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31875 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- also fixes a compile failure on FreeBSD Signed-off-by: Felix Janda --- overlooked this one... --- io/fadvise.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io/fadvise.c b/io/fadvise.c index d59d1ff..46174f3 100644 --- a/io/fadvise.c +++ b/io/fadvise.c @@ -103,7 +103,7 @@ fadvise_f( return command_usage(&fadvise_cmd); } - if (posix_fadvise64(file->fd, offset, length, advise) < 0) { + if (posix_fadvise(file->fd, offset, length, advise) < 0) { perror("fadvise"); return 0; } -- 2.7.3 From david@fromorbit.com Tue Aug 9 16:26:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 215E57CA0 for ; Tue, 9 Aug 2016 16:26:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6446AC001 for ; Tue, 9 Aug 2016 14:26:22 -0700 (PDT) X-ASG-Debug-ID: 1470777971-0bf8157e6b621760001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ZslnHApBFRrAFalI for ; Tue, 09 Aug 2016 14:26:11 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AokOAG9Jqld5LDUCIGdsb2JhbABdg0VWfKQeBoxiihskhXMCAgEBAoFNTQEBAQEBAQcBAQEBAQE4QIRfAQUBATgcIxAIAxgJJQ8FExIDBxoTiDAPwTUBAQEHAgEkHoVEhRWCX4EtGoVYHQWZOYYdiGOPTYw0g3iCZhyBXioyhywBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 10 Aug 2016 06:56:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bXEXH-0005pX-Ch; Wed, 10 Aug 2016 07:26:07 +1000 Date: Wed, 10 Aug 2016 07:26:07 +1000 From: Dave Chinner To: "Carlos E. R." Cc: XFS mail list Subject: Re: Advice needed with file system corruption Message-ID: <20160809212607.GH19025@dastard> X-ASG-Orig-Subj: Re: Advice needed with file system corruption References: <5787852A.7030900@st-andrews.ac.uk> <20160808161132.1d76eb5c@harpe.intellique.com> <1470670691.8958.11.camel@filmlight.ltd.uk> <20160808174427.24d8272c@harpe.intellique.com> <592673683.10446004.1470715375850.JavaMail.yahoo@mail.yahoo.com> <7faf941c-2188-589d-b624-9fedb22dee40@telefonica.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <7faf941c-2188-589d-b624-9fedb22dee40@telefonica.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470777971 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1390 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31883 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 09, 2016 at 02:40:26PM +0200, Carlos E. R. wrote: > On 2016-08-09 06:02, Gim Leong Chin wrote: > > > Drives connected to RAID controllers with battery backed cache should > > have their caches "disabled" (they are really set to write through mode > > instead). By the way, I found out in lab testing that 7200 RPM SATA > > drives suffer a big performance loss when doing sequential writes in > > cache write through mode. > > If you disable the disk internal cache, as a consequence you also > disable the disk internal write optimizations. It has to be much slower > at writing. It seems to me obvious. This is why decent HW RAID controllers have a large non volatile write cache - the caching is done in the controller where it is safe from power loss, not in the drive where it is unsafe. Write optimisations happen at the RAID controller level, not at the individual drive level. As for 10/15krpm SAS drive performance, they generally are only slower in microbenchmark situations (e.g. sequential single sector writes) when the write cache is disabled. These sorts of loads aren't typically seen in the real world, so for most people there is little difference in performance on high end enterprise SAS drives when changing the cache mode.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 9 16:49:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 08FC27CA2 for ; Tue, 9 Aug 2016 16:49:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81460AC002 for ; Tue, 9 Aug 2016 14:49:15 -0700 (PDT) X-ASG-Debug-ID: 1470779351-0bf57c136a4da840001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 9F946TSam1B3er3V for ; Tue, 09 Aug 2016 14:49:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvsNAGhPqld5LDUCIGdsb2JhbABdg0WBUoZynSwGjGKGD4QMhhcEAgKBTU0BAQEBAQEHAQEBAQEBOECEXwEFOhwjEAgDDgoJJQ8FJQMHGhOIMMFNAQEIAiUehUSFFYobBZk5jwCBX41ujDSDeIRgKjKHLAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 10 Aug 2016 07:19:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bXEta-0005vP-QX; Wed, 10 Aug 2016 07:49:10 +1000 Date: Wed, 10 Aug 2016 07:49:10 +1000 From: Dave Chinner To: Mike Frysinger Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs] libxcmd: link against used libs Message-ID: <20160809214910.GI19025@dastard> X-ASG-Orig-Subj: Re: [PATCH xfsprogs] libxcmd: link against used libs References: <20160809144343.2228-1-vapier@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809144343.2228-1-vapier@gentoo.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470779352 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 573 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 09, 2016 at 10:43:43PM +0800, Mike Frysinger wrote: > Since this lib uses symbols from libxfs (platform_findsizes) and many > symbols from libblkid, link against both. Otherwise, the resulting > shared lib has missing symbols which makes linking against annoying. libxcmd is an internal library, linked directly into the xfsprogs binaries. It is never shipped or used outside xfsprogs, so what is trying to use libxcmd as a shared library that doesn't also link against libblkid or libxfs? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 9 17:36:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E4C087CA0 for ; Tue, 9 Aug 2016 17:36:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 56442AC001 for ; Tue, 9 Aug 2016 15:36:17 -0700 (PDT) X-ASG-Debug-ID: 1470782172-0bf57c13674e2c00001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id oDr3PZuphCjwzoYN for ; Tue, 09 Aug 2016 15:36:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiUOANFZqld5LDUCIGdsb2JhbABDGg6DN1Z8jUmWVQaMYoobJoVxBAICgU1NAQEBAQEBBwEBAQEBAThAhF4BAQQBOhwjBQsIAxgJJQ8FJQMHGhOIKQcPLcEaAQslHoVEhRWCX4FNhW8FmTmGHYhjgXWEW4h9jDSDeIQTTSoyAYVngUQBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 10 Aug 2016 08:05:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bXFbz-00060Z-Kj; Wed, 10 Aug 2016 08:35:03 +1000 Date: Wed, 10 Aug 2016 08:35:03 +1000 From: Dave Chinner To: Wei Lin Cc: xfs@oss.sgi.com Subject: Re: Question on migrating data between PVs in xfs Message-ID: <20160809223503.GJ19025@dastard> X-ASG-Orig-Subj: Re: Question on migrating data between PVs in xfs References: <20160809145046.GB5583@ic> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809145046.GB5583@ic> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470782173 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2042 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31886 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 BSF_SC0_SA085 Custom Rule SA085 On Tue, Aug 09, 2016 at 03:50:47PM +0100, Wei Lin wrote: > Hi there, > > I am working on an xfs based project and want to modify the allocation > algorithm, which is quite involved. I am wondering if anyone could help > with this. > > The high level goal is to create xfs agains multiple physical volumes, > allow user to specify the target PV for files, and migrate files > automatically. So, essentially tiered storage with automatic migration. Can you describe the storage layout and setup you are thinking of using and how that will map to a single XFS filesystem so we have a better idea of what you are thinking of? > I plan to implement the user interface with extended attributes, but am > now stuck with the allocation/migration part. Is there a way to make xfs > respect the attribute, i.e. only allocate blocks/extents from the target > PV specified by user? Define "PV". XFS separates allocation by allocation group - it has no concept of underlying physical device layout. If I understand what you , you have multiple "physical volumes" set up in a single block device (somehow - please describe!) and now you want to control how data is allocated to those underlying volumes, right? So what you're asking about is how to define and implement user controlled allocation policies, right? Sorta like this old prototype I was working on years ago? http://oss.sgi.com/archives/xfs/2009-02/msg00250.html And some more info from a later discussion: http://oss.sgi.com/archives/xfs/2013-01/msg00611.html And maybe in conjunction with this, which added groupings of AGs together to form independent regions of "physical separation" that the allocator could then be made aware of: http://oss.sgi.com/archives/xfs/2009-02/msg00253.html These were more aimed at defining failure domains for error and corruption isolation: http://xfs.org/index.php/Reliable_Detection_and_Repair_of_Metadata_Corruption#Failure_Domains Cheers, Dave. -- Dave Chinner david@fromorbit.com From info19@carbra.us Tue Aug 9 19:51:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 97D887CA0 for ; Tue, 9 Aug 2016 19:51:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 58A018F8037 for ; Tue, 9 Aug 2016 17:51:33 -0700 (PDT) X-ASG-Debug-ID: 1470790288-0bf8157e6d63f780001-NocioJ Received: from carbra.us ([115.211.206.144]) by cuda.sgi.com with SMTP id 2aYtMcQ4BXAkHMeQ for ; Tue, 09 Aug 2016 17:51:28 -0700 (PDT) X-Barracuda-Envelope-From: info19@carbra.us X-Barracuda-Effective-Source-IP: UNKNOWN[115.211.206.144] X-Barracuda-Apparent-Source-IP: 115.211.206.144 Sender: info19@carbra.us Received: from SKY-20151020JUL[127.0.0.1] by SKY-20151020JUL[127.0.0.1] (SMTPD32); Wed, 10 Aug 2016 08:49:49 +0800 From: "a@carbra.us" Subject: Stay Cool With Us - Automatic car sunshade To: xfs@oss.sgi.com X-ASG-Orig-Subj: Stay Cool With Us - Automatic car sunshade MIME-Version: 1.0 Reply-To: a@carbra.us Date: Wed, 10 Aug 2016 08:49:49 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[115.211.206.144] X-Barracuda-Start-Time: 1470790288 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1409 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31889 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160810005132.B03E9D80079@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMC4wMC45MjAwLjE3NDU3Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQPkhlbGxvIHRo ZXJlLDwvUD4NCjxQPkkgYW0gQW1pbHksIG5vdGljZWQgeW91ciBjb21wYW55IGlzIGluIGJ1c2lu ZXNzIG9mIGF1dG8gYWNjZXNzb3JpZXMsIHNvIHNlbmQgDQp5b3UgdGhpcyBlbWFpbCBhYm91dCBu ZXdlc3QgcHJvZHVjdHMsIHdoaWNoIGFyZSBpbnN0YWxsZWQgb24gdGhlIHRvcCBvZiBjYXIsIA0K ZWZmZWN0aXZlbHkgcmVkdWNlIGNhciB0ZW1wZXJhdHVyZSBkdXJpbmcgc3VtbWVyLjwvUD4NCjxQ PlByb2R1Y3QgRmVhdHVyZXM6PEJSPjEuIENvb2xlciBJbnNpZGUgQ2FyIFRlbXBlcmF0dXJlIDMw 4oSDPEJSPjIuIA0KVVYtcHJvb2YoOTglKTsgQW50aS1hZ2luZzsgQW50aS1pZ25pdGlvbjsgRWNv LWZyaWVuZGx5IDxCUj4zLiBTaW1wbGUgUmVtb3RlIA0KQ29udHJvbDogT25seSA2IHNlY29uZHMg T3BlbiAmYW1wOyBDbG9zZSA8QlI+NC4gQ04sVS5TLiZhbXA7IEVVIEludmVudGlvbiANClBhdGVu dHM8QlI+NS4gUXVpY2sgSW5zdGFsbGF0aW9uICg1IG1pbnV0ZXMpPEJSPjYuIEF3ZXNvbWUgRGVz aWduPEJSPjcuIFVuYWJsZSANCnRvIEJlIFN0b2xlbjxCUj44LiBObyBEYW1hZ2VzIHRvIENhcjwv UD4NCjxQPkV2ZXJ5IGNhciBvd25lciBuZWVkIGEgY2FyIGNvdmVyIHRvIHByb3RlY3QgaGlzIGNh ciBpbiBob3Qgc3VtbWVyLiBBbmQgb3VyIA0KcHJvZHVjdHMgYXJlIHBvcHVsYXIgaW4gb3ZlciAz MCBjb3VudHJpZXMgYW5kIDIwMCBjaXRpZXMgaW4gdGhlIHdvcmxkLiBBbmQgd2UgDQp3b3VsZCBs aWtlIHRvIGNvcnBvcmF0ZSB3aXRoIHlvdSBpbiB0aGlzIGxpbmUuPC9QPg0KPFA+UGxlYXNlIGxl dCBtZSBrbm93IGhvdyBkbyB5b3UgbGlrZSB0aGUgcHJvZHVjdHMgb3Igbm90LCB0aGF0IG1lYW5z IGEgbG90IHRvIA0KdXMuPC9QPg0KPFA+V2FpdGluZyBmb3IgeW91ciBlYXJseSByZXBseS48L1A+ DQo8UD5CZXN0IHJlZ2FyZHMsPC9QPg0KPFA+U3VuY2xvc2UgQ2FyIEFjY2Vzc29yeSBGYWN0b3J5 PEJSPkFtaWx5IEZhbjxCUj5TYWxlcyANCm1hbmFnZXI8QlI+VGVsL1doYXRzYXBwL1dlY2hhdDor ODYtMTUwODgyODE4MjA8QlI+UVE6MTYzNDAzNTI2NDxCUj5Ta3lwZTphbWlseS5mYW48QlI+RW1h aWw6YUBjYXJicmEudXM8QlI+QWRkLjogDQpOby4gNDEsIFlvbmdqaW4gQXZlbnVlLCBZaXd1IGNp dHksIFpoZWppYW5nLCBDaGluYTwvUD48L0JPRFk+PC9IVE1MPg0KDQo= From donotreply@maltesas.org Tue Aug 9 19:55:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A1AEA7CA0 for ; Tue, 9 Aug 2016 19:55:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 63CF2304032 for ; Tue, 9 Aug 2016 17:55:54 -0700 (PDT) X-ASG-Debug-ID: 1470790543-0bf57b369e585710001-NocioJ Received: from list14.ebuzzz.com ([110.4.40.191]) by cuda.sgi.com with ESMTP id xQ1HocydhLqxSYEt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 17:55:46 -0700 (PDT) X-Barracuda-Envelope-From: donotreply@maltesas.org X-Barracuda-Effective-Source-IP: UNKNOWN[110.4.40.191] X-Barracuda-Apparent-Source-IP: 110.4.40.191 Received: from list14eb by list14.ebuzzz.com with local (Exim 4.86_1) (envelope-from ) id 1bXHo6-0001ky-HC for xfs@oss.sgi.com; Wed, 10 Aug 2016 08:55:42 +0800 To: Subject: =?utf-8?Q?[CFP]_Advancement_Research_in_Circuits_and_Systems_In?= =?utf-8?Q?ternational_Conference_(ARECAS)_,Progress_in_Computer_Sciences_and_I?= =?utf-8?Q?nformation_Technology_International_Conference_(PROCSIT),_Internatio?= =?utf-8?Q?nal_Symposium_on_Technology_Management_and_Emerging_Technologies_(IS?= =?utf-8?Q?TMET),_20_=E2=80=93_22_Dec._2016_in_Langkawi_Island,_Kedah,_Malaysi?= =?utf-8?Q?a._Publish_in_SCOPUS_Journal_indexed._Deadline_31st_August_2016?= X-PHP-Script: list14.ebuzzzz.com/admin/process.php for 110.4.40.190 X-ASG-Orig-Subj: =?utf-8?Q?[CFP]_Advancement_Research_in_Circuits_and_Systems_In?= =?utf-8?Q?ternational_Conference_(ARECAS)_,Progress_in_Computer_Sciences_and_I?= =?utf-8?Q?nformation_Technology_International_Conference_(PROCSIT),_Internatio?= =?utf-8?Q?nal_Symposium_on_Technology_Management_and_Emerging_Technologies_(IS?= =?utf-8?Q?TMET),_20_=E2=80=93_22_Dec._2016_in_Langkawi_Island,_Kedah,_Malaysi?= =?utf-8?Q?a._Publish_in_SCOPUS_Journal_indexed._Deadline_31st_August_2016?= From: MALTESAS Conferences Date: Wed, 10 Aug 2016 08:33:52 +0800 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="_=_swift-66963917457aa7670e55524.26000196_=_" Content-Transfer-Encoding: 7bit X-mid: eGZzQG9zcy5zZ2kuY29tICwgYzI4ICwgbTU3ICwgczI5 X-Mailer: ACEM X-Sender: List-Unsubscribe: Message-ID: <20160810005542.23759.1505554591.swift@list14.ebuzzzz.com> X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - list14.ebuzzz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [501 498] / [47 12] X-AntiAbuse: Sender Address Domain - maltesas.org X-Get-Message-Sender-Via: list14.ebuzzz.com: authenticated_id: list14eb/only user confirmed/virtual account not confirmed X-Authenticated-Sender: list14.ebuzzz.com: list14eb X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/list14eb/public_html/admin/process.php X-Source-Dir: list14.ebuzzzz.com:/public_html/admin X-Barracuda-Connect: UNKNOWN[110.4.40.191] X-Barracuda-Start-Time: 1470790545 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 37456 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085b, BSF_SC5_MJ1963, HTML_MESSAGE, INFO_TLD, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31889 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.40 BSF_SC0_SA085b Custom Rule SA085b 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 --_=_swift-66963917457aa7670e55524.26000196_=_ Content-Type: text/plain; charset=utf-8 We apologize if you receive multiple copies of this message. Please disseminate this CFP to your colleagues & contacts. =============================================== **Call for Papers**   **Advancement Research in Circuits and Systems International Conference (ARECAS)** **Progress in Computer Sciences and Information Technology International Conference (PROCSIT)** **International Symposium on Technology Management and Emerging Technologies (ISTMET)** 20 – 22 December 2016 | Langkawi Island, Kedah, Malaysia **Deadline Submission : 31st August 2016!!!** Universiti Teknikal Malaysia Melaka (UTeM) and Universiti Teknologi Malaysia (UTM) together with Malaysia Technical Scientist Association (MALTESAS), are pleased to announce that it will be hosting a Parallel Conferences , ARECAS and PROCSIT. These conferences offers a platform to local and foreign researchers, academicians, engineers and end-users of research to formulate new research collaborations through candid discussions during paper presentation and discussion. It also offers an opportunity to strengthen existing collaborations for gaining tangible research outputs in short time frame. Prospective authors are invited to submit full papers of no more than SIX (6) pages including results, figures and references according to standard formatting in the website. Submission is through the conference website and must adhere to guidelines available at the website. ======================================================================================================================================================================================================================= ** ** **Advancement Research in Circuits and Systems International Conference (ARECAS)** Official Website: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=522&l=-http--arecas.org (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=522&l=-http--arecas.org/) Submit – http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=521&l=-http--edas.info/N22705 (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=521&l=-http--edas.info/N22705) ALL ACCEPTED and REGISTERED PAPERS WILL BE PUBLISHED IN **Journal of Telecommunication, Electronic and Computer Engineering (JTEC)-Scopus Indexed** (ISSN 2180-1843, e-ISSN 2289-8131) Search using Sourcerecord id "21100332206†in: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=519&l=-https--www.elsevier.com/__data/assets/excel_doc/0015/91122/title_list.xlsx (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=519&l=-https--www.elsevier.com/__data/assets/excel_doc/0015/91122/title_list.xlsx) **Progress in Computer Sciences and Information Technology International Conference (PROCSIT)** Official Website: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=525&l=-http--procsit.com (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=525&l=-http--procsit.com/) SUBMIT: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=524&l=-http--edas.info/N22620 (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=524&l=-http--edas.info/N22620) **All Accepted and Registered paper will be published in** **International Journal of Engineering** **(E-ISSN: 17359244)** **(SCOPUS Q3)** **SCOPUS indexed (Q3 Journal Rank by SCIMAGOR)** http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=518&l=-http--www.scimagojr.com/journalsearch.php--Q-q--E-17359244--A-tip--E-iss (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=518&l=-http--www.scimagojr.com/journalsearch.php--Q-q--E-17359244--A-tip--E-iss) **** **International Symposium on Technology Management and Emerging Technologies (ISTMET)** **Official Website: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=533&l=-https--istmet.org/** Submit: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=532&l=-http--edas.info/N22764 (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=532&l=-http--edas.info/N22764)  **** **ALL ACCEPTED PAPERS WILL BE INCLUDED IN ADVANCED SCIENCE LETTERS** **ISSN: 1936-6612 (Print): EISSN: 1936-7317 (Online)** **Copyright © 2000-2016 American Scientific Publishers.** **All Rights Reserved.** **SCOPUS Indexed (Q3/Q4 Journal Rank by SCIMAGOR)** http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=531&l=-http--www.scimagojr.com/journalsearch.php--Q-q--E-19700181106--A-tip--E-sid--A-clean--E-0 (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=531&l=-http--www.scimagojr.com/journalsearch.php--Q-q--E-19700181106--A-tip--E-sid--A-clean--E-0) **** **Our Rules (MALTESAS set of rules) of Submission for Scopus Journal Indexed:******a. **Similarity score must be checked using Plagscan Plagiarism software or Turnitin  software and MUST NOT EXCEED 20% (including REFERENCES) similarity score.** b. **Minimum Page = 4 and Maximum Pages = 6 Pages (For Seven and  above = MYR 400 per additional page)** c. **The article must be in English (Visit conference website under Submit for more details)** **** ARECAS COVERS: **Track 1: General Electronic and Computer Engineering** * **Telecommunication Engineering** * **Electronic Engineering** * **Computer Engineering** * **Analog Signal Processing** * **Digital Signal Processing** * Multimedia Systems and Applications * Power and Energy Circuits and Systems * **Electrical and Control Systems** * **Sensory Systems** **Track 2: Specific Electronic and Computer Engineering** * **Biomedical Circuits and Systems** * **Cellular Neural Networks and Array Computing** * **Circuits and Systems for Communications** * **Circuits and Systems for Video Technology** * **Computer Aided Network Design** * **Education in Circuits and Systems** * **Life Science Systems and Applications** * **Nanoelectronics and Gigascale Systems** * **Neural Systems and Applications** * **Nonlinear Circuits and Systems** * **Visual Signal Processing and Communications** * **VLSI Systems and Applications** **(Visit – http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=526&l=-https--arecas.org/submit/)** Submit – http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=521&l=-http--edas.info/N22705 (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=521&l=-http--edas.info/N22705)   PROCSIT COVERS: **Track 1: High Performance Computing and Communication -----------------------------------------------------------------------** Parallel Computing Bioinformatics Cluster, Cloud and Grid Computing Distributed Computing Interconnection Network and Architecture Load Balancing, Scheduling and Resource Management Operating System for High Performance Computing Quantum Computing Scalable Servers and Systems Scientific/Engineering/Commercial Application and Workloads Surface Computing Ad-hoc Networks Computer Networks Network Security and Privacy High Performance Networks Information and System Security Mobile Computing Multimedia Signal Processing Network Security and Privacy Reliable Computing RFID Applications Trusted Computing Wireless Sensor Networks   **Track 2: Image Compression & Multimedia Processing** **-----------------------------------------------------------------------** Audio Video System Biometrics and Human Computer Interaction Data / Image Compression Digital Image Processing Image / Video Coding and Transmission Image Enhancement Image Formation Image Restoration Internet and Web Applications Machine Learning and Data Mining Medical Imaging Multimedia Applications Pattern Recognition and Analysis Statistical and Structural Pattern Recognition Video on Demand Wavelet Transforms Approximation Algorithms Computational Biology Computational Geometry Data Compression Algorithm Parallel and Distributed Algorithms Exponential Algorithm External-Memory Algorithms Game Theory Graph Algorithms Network Algorithms On-line Algorithms Optimization Algorithms Parameterized Algorithms Pattern Matching Algorithm Randomized Algorithms Streaming Algorithms String Algorithms  **** **Track 3: Databases, Data Mining and Software Engineering** **-----------------------------------------------------------------------** Clustering Databases and Data Mining Applications Database Tuning Distributed Databases Feature Selection and Feature Extraction High Performance Data Mining Algorithms Information Retrieval Knowledge Discovery in Database Knowledge Management Query Optimization Search Engine Optimization Sequential Data Mining Social Network Mining Stream Data Mining Temporal and Spatial Data Mining Text, Graph, Video, Multimedia Data Mining Web Mining Computational Business Intelligence Software Testing Software Reuse Software Metrics Software Architecture Requirement Engineering Unified Modeling Language Software Quality Management Software Project Management Maintenance and Reverse Engineering Component Based Development Formal Methods and Theories Empirical Studies, Benchmarking, and Industrial Best Practices Pervasive, Ubiquitous, Service-Oriented Computing Evolutionary Computing Swarm Intelligence Artificial Immune System Fuzzy Logic Support Vector Machine Artificial Neural Networks Hybrid Intelligent System Machine Learning Genetic Algorithm Pattern Recognition    (Visit – http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=530&l=-https--procsit.com/submit/ (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=527&l=-https--avareit.com/submit/)) SUBMIT: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=524&l=-http--edas.info/N22620 (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=524&l=-http--edas.info/N22620) ISTMET Conference Tracks: **Track 01: Technology Management****Track 02: Emerging Technologies** Submit: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=532&l=-http--edas.info/N22764 (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=532&l=-http--edas.info/N22764) **Deadline Submission : 31st August 2016!!!** Looking forward to your support, participation & contribution in ARECAS, PROCSIT and ISTMET!   **Conference Chair** **Advancement Research in Circuits and Systems International Conference (ARECAS)** Email : admin@maltesas.org (mailto:admin@maltesas.org) | Website: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=522&l=-http--arecas.org (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=522&l=-http--arecas.org/) **Progress in Computer Sciences and Information Technology International Conference (PROCSIT)** Email : admin@maltesas.org (mailto:admin@maltesas.org) | Website: http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=529&l=-http--www.procsit.com (http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=529&l=-http--www.procsit.com/) **International Symposium on Technology Management and Emerging Technologies (ISTMET)** Email : admin@maltesas.org (mailto:admin@maltesas.org) | Website: **http://list14.ebuzzzz.com/lt.php?c=28&m=57&nl=8&s=ce79e166cd2753269bec4c3b585d061f&lid=533&l=-https--istmet.org/** **** Click here to unsubscribe from future mailings: http://list14.ebuzzzz.com/proc.php?nl=8&c=28&m=57&s=ce79e166cd2753269bec4c3b585d061f&act=unsub --_=_swift-66963917457aa7670e55524.26000196_=_ Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable

We apologize if you receive multiple copies of this mes= sage.
Please disseminate= this CFP to your colleagues & contacts.

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D

Call for Papers

=C2=A0

Advancement Research in C= ircuits and Systems International Conference (ARECAS)

Progress = in Computer Sciences and Information Technology International Confer= ence (PROCSIT)

International Symposium on Technology Ma= nagement and Emerging Technologies (ISTMET)


20 =E2=80=93 22 December 2016 | Langkawi Island, Kedah, M= alaysia

<= strong>Deadline Submission : 31st August 2016!!!

=

Universiti Teknikal = Malaysia Melaka (UTeM) and Universiti Teknologi Malaysia (UTM) toget= her with Malaysia Technical Scientist Association (MALTESAS), are pl= eased to announce that it will be hosting a Parallel Conferences , A= RECAS and PROCSIT. These conferences offers a platform to local and = foreign researchers, academicians, engineers and end-users of resear= ch to formulate new research collaborations through candid discussio= ns during paper presentation and discussion. It also offers an oppor= tunity to strengthen existing collaborations for gaining tangible re= search outputs in short time frame. Prospective authors are invited = to submit full papers of no more than SIX=C2=A0(6) pages including r= esults, figures and references according to standard formatting in t= he website. Submission is through the conference website and must ad= here to guidelines available at the website.


=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D

=C2=A0

Advancement Research in Circuits and Systems International Confer= ence (ARECAS)

Official Website:=C2=A0http://areca= s.org
Submit =E2=80=93=C2=A0http://edas.info/N22705

ALL ACCEPTED and REGISTERED PAPERS WILL BE PUBLISHED IN
Jour= nal of Telecommunication, Electronic and Computer Engineering (JTEC)= -Scopus Indexed
(ISSN 2180-1843, e-ISSN 2289-8131)
Searc= h using Sourcerecord id "21100332206=E2=80=9D in:
https://www.els= evier.com/=5F=5Fdata/assets/excel=5Fdoc/0015/91122/title=5Flist.xlsx=



Progress in Computer S= ciences and Information Technology International Conference (PROCSIT= )

Official Website:=C2=A0http= ://procsit.com

SUBMIT:=C2=A0http://edas.info/N22620

All Accepted a= nd Registered paper will be published in

Internation= al Journal of Engineering

(E-ISSN: 17359244)

(SCOPUS Q3)

SCOPUS indexed (Q3 Journal Rank= by SCIMAGOR)

http://www.scimagojr.com/journalsearch.php=3Fq=3D= 17359244&tip=3Diss


<= p style=3D"text-align: center;" align=3D"center">

International Symposium = on Technology Management and Emerging Technologies (ISTMET)

Official Website: https://istmet.org/

=

Subm= it:=C2=A0http://edas.info/N22764=C2=A0

=

ALL ACCEPTED PAPERS WILL BE INCLUDED IN ADVANCE= D SCIENCE LETTERS
ISSN: 1936-6612 (Pr= int): EISSN: 1936-7317 (Online)
Copyr= ight =C2=A9 2000-2016 American Scientific Publishers.
All Rights Reserved.

SCOPUS Indexed (Q3/Q4 Journal Rank by SCI= MAGOR)
http= ://www.scimagojr.com/journalsearch.php=3Fq=3D19700181106&tip=3Dsid&c= lean=3D0


Our Rules (MALTESAS set of rules) of Submission for Scopus Journ= al Indexed:
a.=C2=A0Similarity score= must be checked using Plagscan Plagiarism software or Turniti= n=C2=A0 software and MUST NOT EXCEED 20% (including REFERENCES) simi= larity score.
b.=C2=A0Minimum Page =3D 4 and Maximum Pages= =3D 6=C2=A0Pages (For Seven and =C2=A0above =3D MYR 400=C2=A0per ad= ditional page)
c.=C2=A0The article must be in English (Visi= t conference website under Submit for more details)<= /p>


ARECAS=C2=A0COVERS:

Track 1: General= Electronic and Computer Engineering

  • Telecommunication Engineering<= /span>
  • Electronic Eng= ineering
  • C= omputer Engineering
  • Analog Signal Processing
  • Digital Signal Processing
  • =
  • Multimedia Systems and Applic= ations
  • Power and = Energy Circuits and Systems
  • Electrical and Control Systems
  • <= span style=3D"font-size: 12pt;">Sensory Systems
  • =

Track 2: Specifi= c=C2=A0Electronic and Computer Engineering

    =
  • Biomedical Circuits and Syst= ems
  • Cellul= ar Neural Networks and Array Computing
  • Circuits and Systems for Communications=
  • Circuits = and Systems for Video Technology
  • Computer Aided Network Design
  • Education in Circuits = and Systems
  • <= i>Life Science Systems and Applications
  • Nanoelectronics and Gigascale Systems<= /i>
  • Neural Sys= tems and Applications
  • Nonlinear Circuits and Systems
  • Visual Signal Processing and Commun= ications
  • V= LSI Systems and Applications

(Visit =E2=80=93=C2=A0https://arecas.org/s= ubmit/)

Submit= =E2=80=93=C2=A0http://edas.info/N22705

=C2=A0

PROCSIT CO= VERS:

Track 1: = High Performance Computing and Communication
-------------------= ----------------------------------------------------

=

Parallel Computing

=

Bioinformatics

=

Cluster, Cloud and Grid Computi= ng

Distributed Com= puting

Interconnec= tion Network and Architecture

Load Balancing, Scheduling and Resource Management

Operating System for Hi= gh Performance Computing

Quantum Computing

Scalable Servers and Systems

Scientific/Engineering/Commercial Application and = Workloads

Surface = Computing

Ad-hoc N= etworks

Computer N= etworks

Network Se= curity and Privacy

High Performance Networks

Information and System Security

Mobile Computing

Multimedia Signal Processing

Network Security and Privacy

Reliable Computing

RFID Applications

Trusted Computing

Wireless Sensor Networ= ks

=C2=A0

Track 2: Image Compress= ion & Multimedia Processing

---------------------------------------------------= --------------------

Audio Video System

Biometrics and Human Computer Interaction

<= span style=3D"font-size: 12pt;">Data / Image Compression

=

Digital Image Processing

Image / Video Coding a= nd Transmission

Im= age Enhancement

Im= age Formation

Imag= e Restoration

Inte= rnet and Web Applications

Machine Learning and Data Mining

Medical Imaging

Multimedia Applications

Pattern Recognition and Analysis=

Statistical and Structur= al Pattern Recognition

Video on Demand

Wavelet Transforms

Approximation Algorithms

Computational Biology

Computational Geometry

Data Compression Algorithm

<= span style=3D"font-size: 12pt;">Parallel and Distributed Algorithms<= /span>

Exponential Algori= thm

External-Memor= y Algorithms

Game = Theory

Graph Algor= ithms

Network Algo= rithms

On-line Alg= orithms

Optimizati= on Algorithms

Para= meterized Algorithms

Pattern Matching Algorithm

Randomized Algorithms

Streaming Algorithms

String Algorithms

=C2=A0

Track 3: Databases= , Data Mining and Software Engineering

----------------------------------------= -------------------------------

Clustering

Databases and Data Mining Applications

<= span style=3D"font-size: 12pt;">Database Tuning

Distributed Databases

Feature Selection and Feature Extr= action

High Perfor= mance Data Mining Algorithms

Information Retrieval

Knowledge Discovery in Database

Knowledge Management

<= span style=3D"font-size: 12pt;">Query Optimization

= Search Engine Optimization

Sequential Data Mining

Social Network Mining=

Stream Data Minin= g

Temporal and Spa= tial Data Mining

T= ext, Graph, Video, Multimedia Data Mining

Web Mining

Computational Business Intelligence

<= p>Software Testing

Software Reuse

Software Metrics

Software Architecture

Requirement Engineering

=

Unified Modeling Language

Software Quality Man= agement

Software P= roject Management

= Maintenance and Reverse Engineering

Component Based Development

Formal Methods and Theories

=

Empirical Studies, Benchmarkin= g, and Industrial Best Practices

Pervasive, Ubiquitous, Service-Oriented Computing

Evolutionary Computin= g

Swarm Intelligen= ce

Artificial Immu= ne System

Fuzzy Lo= gic

Support Vector= Machine

Artificia= l Neural Networks

= Hybrid Intelligent System

Machine Learning

Genetic Algorithm

Pattern Recognition

=C2=A0

=C2=A0(Visit =E2=80=93=C2=A0https:/= /procsit.com/submit/)

SUBMIT:=C2=A0http://edas.info/N2= 2620

ISTMET Conference Tracks:=
Track 01: Technology Management
Track 02: Emerging Technologies

Submit:=C2=A0http://edas.inf= o/N22764

Deadline Submission : 31st August 2016= !!!

Looking forward to your support, participation & contribution = in ARECAS, PROCSIT and ISTMET!

=C2=A0

Advancement Research in Circuits and= Systems International Conference (ARECAS)

Email :=C2=A0admin@maltesas.org=C2=A0| Website= :=C2=A0http://arecas.org

Progress in Computer Sciences and Inf= ormation Technology International Conference (PROCSIT)

Email :=C2=A0<= a href=3D"mailto:admin@maltesas.org" target=3D"=5Fblank">admin@malte= sas.org=C2=A0| Website:=C2=A0http://w= ww.procsit.com

I= nternational Symposium on Technology Management and Emerging Technol= ogies (ISTMET)

Email :=C2=A0admin@maltesas.org=C2=A0| Website:=C2=A0https://istmet.= org/


Click here to unsubscribe fr= om future mailings.
--_=_swift-66963917457aa7670e55524.26000196_=_-- From vapier@gentoo.org Tue Aug 9 20:52:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8C6987CA0 for ; Tue, 9 Aug 2016 20:52:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 51CCF8F8035 for ; Tue, 9 Aug 2016 18:52:41 -0700 (PDT) X-ASG-Debug-ID: 1470793957-0bf57c136a4f7c70001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id CmkXqOrfgAN9KlUg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 09 Aug 2016 18:52:38 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Effective-Source-IP: smtp.gentoo.org[140.211.166.183] X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from vapier.lan (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with SMTP id 8126D340A22; Wed, 10 Aug 2016 01:52:36 +0000 (UTC) Date: Wed, 10 Aug 2016 09:52:36 +0800 From: Mike Frysinger To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs] libxcmd: link against used libs Message-ID: <20160810015236.GD30544@vapier.lan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs] libxcmd: link against used libs References: <20160809144343.2228-1-vapier@gentoo.org> <20160809214910.GI19025@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="3uo+9/B/ebqu+fSQ" Content-Disposition: inline In-Reply-To: <20160809214910.GI19025@dastard> X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1470793958 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1022 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31891 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --3uo+9/B/ebqu+fSQ Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On 10 Aug 2016 07:49, Dave Chinner wrote: > On Tue, Aug 09, 2016 at 10:43:43PM +0800, Mike Frysinger wrote: > > Since this lib uses symbols from libxfs (platform_findsizes) and many > > symbols from libblkid, link against both. Otherwise, the resulting > > shared lib has missing symbols which makes linking against annoying. >=20 > libxcmd is an internal library, linked directly into the xfsprogs > binaries. It is never shipped or used outside xfsprogs, so what is > trying to use libxcmd as a shared library that doesn't also link > against libblkid or libxfs? shouldn't internal libs still have coherent linkage ? otherwise you cause problems even internally for xfs -- any other libs or progs that link against libxcmd have to list all the libs that libxcmd happen to use itself. it also means that you get correct link order which is otherwise not guaranteed. e.g. just because you say libxfs needs to use libblkid doesn't mean the linker must put that after libxcmd in the link list. -mike --3uo+9/B/ebqu+fSQ Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJXqojjAAoJEEFjO5/oN/WBqM4QAJBg08Gb7wPrSh/eas/fKCgf Fd23anmhIvmn11Aal7BnvdFs5szHWkyurW+hv7IhlorqrCGnTeF9q0ikxsU0HrH8 H1RKka9E2r7ao99eZ0qVlEiIMjBLfNAP8k3kYj+25oskR2R884VwzsSiP9zQGmp+ cmkqCw4pzOlG2AaYX1013YXu8h9YIzsakhzaKbOSiBDjEZl6vGxipEm7JlE1CMWg oabMPNdxXZM4LupjpudNp99tEsGALQIYja61kzXTrMqQYUV0k2hdUH//ooiOc80f /X9VFDxcIr8BhmCycik9wYgd/AZ80cU8rnR7t8Vm0MyhXoEA9fFGDrD6FeLZTVMk JhIIsHggllxxxvanMg0mJwO5anDXMX6rcv3LviewUsHbLI5PPvcj10vdAWfHrQgQ WgykA2tZNqojUrOXWp4pwmjPpsAYfgt/cOpGX7yJ5cz57S8WFYy6eytBKD6hm+Td plNN3aD5qQ2sLRh+Zw/lHQzzBh5S68RdqT1fB6frlo4N3Q5Uk2zJqeIZ56VXjRMA jKCYTBOqUT/ui8G7Wg4vkNofktPgflADK6t16NOZtQ8P8H4eyl7wJiDD6SVnCVA5 kle30lG/2pRzZOHDRiJBdPGgBzv9lNVFZ5yAdFSazWoGEc0GBIW7ojoqG4UGUaeo IiHsCkI+BgZ6W3d43odR =OmHM -----END PGP SIGNATURE----- --3uo+9/B/ebqu+fSQ-- From david@fromorbit.com Tue Aug 9 21:20:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7DE757CA1 for ; Tue, 9 Aug 2016 21:20:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 518C5304051 for ; Tue, 9 Aug 2016 19:20:34 -0700 (PDT) X-ASG-Debug-ID: 1470795630-0bf57c136a4fa830001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 5Uw7JfA6OGdFQNSl for ; Tue, 09 Aug 2016 19:20:31 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D1DgDtjqpXIAI1LHldg0WBUoZynScBAQEBAQEGjGKGD4QMhhcEAgKBVU0BAQEBAQEHAQEBAQEBNwFAhF4BAQQBOhwjBQsIAw4KCSUPBSUDBxoTiCkHwXkBAQEHAiUehUSFFYQnhXQFmTmJGYVnj02MNIN4hGAqMoVogUQBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail07.adl2.internode.on.net with ESMTP; 10 Aug 2016 11:49:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bXJ70-0006Nc-W3; Wed, 10 Aug 2016 12:19:19 +1000 Date: Wed, 10 Aug 2016 12:19:18 +1000 From: Dave Chinner To: Mike Frysinger Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs] libxcmd: link against used libs Message-ID: <20160810021918.GK19025@dastard> X-ASG-Orig-Subj: Re: [PATCH xfsprogs] libxcmd: link against used libs References: <20160809144343.2228-1-vapier@gentoo.org> <20160809214910.GI19025@dastard> <20160810015236.GD30544@vapier.lan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160810015236.GD30544@vapier.lan> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1470795630 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3068 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31891 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 10, 2016 at 09:52:36AM +0800, Mike Frysinger wrote: > On 10 Aug 2016 07:49, Dave Chinner wrote: > > On Tue, Aug 09, 2016 at 10:43:43PM +0800, Mike Frysinger wrote: > > > Since this lib uses symbols from libxfs (platform_findsizes) and many > > > symbols from libblkid, link against both. Otherwise, the resulting > > > shared lib has missing symbols which makes linking against annoying. > > > > libxcmd is an internal library, linked directly into the xfsprogs > > binaries. It is never shipped or used outside xfsprogs, so what is > > trying to use libxcmd as a shared library that doesn't also link > > against libblkid or libxfs? > > shouldn't internal libs still have coherent linkage ? otherwise you > cause problems even internally for xfs -- any other libs or progs that > link against libxcmd have to list all the libs that libxcmd happen to > use itself. AFAIK, only if the libs or progs actually call the functions that result in those dependencies being needed, right? i.e. it's not dynamically linked, so functions that aren't called are culled by the linker and so the undefined references to libxfs and libblkid are culled and don't need to be resolved. Hence the program only needs to be linked against libblkid/libxfs if they are required, right? See, for example, xfs_quota. quota/Makefile defines: LLDLIBS = $(LIBXCMD) LTDEPENDENCIES = $(LIBXCMD) LLDFLAGS = -static and the built binary: $ ldd quota/xfs_quota linux-vdso.so.1 (0x00007ffc0dae6000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdf92114000) /lib64/ld-linux-x86-64.so.2 (0x00005640768d0000) $ i.e. it has no link-time or run-time dependency on libxfs or libblkid, because it doesn't use any functions from libxcmd that require those libraries to be linked in. > otherwise not guaranteed. e.g. just because you say libxfs needs to > use libblkid doesn't mean the linker must put that after libxcmd in > the link list. No, but link order is defined by the order of libraries on the linker command line and we control that directly. See the ld man page: ... -l namespec .... The linker will search an archive only once, at the location where it is specified on the command line. If the archive defines a symbol which was undefined in some object which appeared before the archive on the command line, the linker will include the appropriate file(s) from the archive. However, an undefined symbol in an object appearing later on the command line will not cause the linker to search the archive again. See the -( option for a way to force the linker to search archives multiple times. ..... -( archives -) ..... The specified archives are searched repeatedly until no new undefined references are created. [....] ..... So we can define the link order exactly as we need it on the linker command line, or we can just say "just search everything" if we have cyclic dependencies that need to be resolved. Cheers, Dave. -- Dave Chinner david@fromorbit.com From Sales.52@fashion-business.com Wed Aug 10 00:51:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 159037CA1 for ; Wed, 10 Aug 2016 00:51:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DD36E8F8035 for ; Tue, 9 Aug 2016 22:51:41 -0700 (PDT) X-ASG-Debug-ID: 1470808293-0bf57b369d59f890001-NocioJ Received: from fashion-business.com ([14.218.90.112]) by cuda.sgi.com with SMTP id 7LAGPREOtXJkDAca for ; Tue, 09 Aug 2016 22:51:34 -0700 (PDT) X-Barracuda-Envelope-From: Sales.52@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.90.112] X-Barracuda-Apparent-Source-IP: 14.218.90.112 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Wed, 10 Aug 2016 13:30:19 +0800 From: "angelbervogue@sina.com" Subject: Re:The fashion design of bag for 2016 market To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re:The fashion design of bag for 2016 market MIME-Version: 1.0 Sender: Sales.52@fashion-business.com Reply-To: angelbervogue@sina.com Date: Wed, 10 Aug 2016 13:30:19 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.90.112] X-Barracuda-Start-Time: 1470808293 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5599 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31894 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160810055140.EA73764005F@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIA0Kc3R5bGU9IlRFWFQt QUxJR046IGxlZnQ7IFBBRERJTkctQk9UVE9NOiAwcHQ7IE1BUkdJTjogMHB0IDBwdCAxMHB0OyBQ QURESU5HLUxFRlQ6IDBwdDsgUEFERElORy1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1 LDI1NSwyNTUpOyBQQURESU5HLVRPUDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFu IiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJB Q0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6 IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IFRhaG9tYTsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2Io MjU1LDI1NSwyNTUpIj5EZWFyJm5ic3A7UHVyY2hhc2luZyZuYnNwO01hbmFnZXIsPC9TUEFOPjxT UEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUs MjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogVGFob21hOyBtc28tZm9udC1r ZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+PC9v OnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IFBBRERJTkctQk9U VE9NOiAwcHQ7IE1BUkdJTjogMHB0IDBwdCAxMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElO Ry1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDog MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1 NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IFRhaG9tYTsgbXNvLWZvbnQta2Vy bmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5XZSZuYnNwO2Fy ZSZuYnNwO3Byb2Zlc3Npb25hbCZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogVGFob21hOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsMCww KTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KTsgbXNvLWFz Y2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNv LWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5iYWdzIA0Kc3VwcGxpZXImbmJzcDtpbiZuYnNwO0No aW5hPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDog cmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogVGFob21h OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1 NSkiPi4gDQp0aGUgZGV0YWlscyBvZiBvdXIgY29tcGFueSBhcyBiZWxvdzo8L1NQQU4+PC9QPg0K PFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTUFSR0lO OiAwcHQgMHB0IDEwcHQ7IFBBRERJTkctTEVGVDogMHB0OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJB Q0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFBBRERJTkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0 aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigw LDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTogVGFob21hOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsg bXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjE2MCZuYnNwO3dvcmtlcnMsJm5ic3A7MTAw MCZuYnNwO21vbnRobHkmbmJzcDtjYXBhYmlsaXR5LCZuYnNwOzEwJm5ic3A7eWVhcnPigJkmbmJz cDtleHBlcmllbmNlLCZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJp YWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj5zYW1wbGVzJm5ic3A7c2VydmljZSZuYnNwO3Byb3Zp ZGVkLCZuYnNwO09FTSZhbXA7T0RNJm5ic3A7b3JkZXJzJm5ic3A7YWNjZXB0ZWQsJm5ic3A7b25l Jm5ic3A7aG91ciZuYnNwO3JlYWNoJm5ic3A7U2hlbnpoZW4mbmJzcDtwb3J0LCZuYnNwO3RoaXMm bmJzcDtpcyZuYnNwO2hvdyZuYnNwO3dlJm5ic3A7a2VlcCZuYnNwO2dvb2QmbmJzcDtxdWFsaXR5 Jm5ic3A7YW5kJm5ic3A7cmVsaWFibGUmbmJzcDtjb29wZXJhdGlvbiZuYnNwO2ZvciZuYnNwO2ds b2JhbCZuYnNwO3ZhbHVlZCZuYnNwO2N1c3RvbWVycy48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+ PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsg TUFSR0lOOiAwcHQgMHB0IDEwcHQ7IFBBRERJTkctTEVGVDogMHB0OyBQQURESU5HLVJJR0hUOiAw cHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFBBRERJTkctVE9QOiAwcHQ7IG1zby1w YWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9 IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPkFsbCZuYnNwO291ciZu YnNwO3Byb2R1Y3Rpb25zJm5ic3A7aGF2ZSZuYnNwO2JlZW4mbmJzcDtJU08mbmJzcDs5MDAxLENF LCZuYnNwO1JvSFMsJm5ic3A7RU1DJm5ic3A7Y2VydGlmaWVkJm5ic3A7YW5kJm5ic3A7Z2V0Jm5i c3A7YSZuYnNwO2hpZ2gmbmJzcDtyZXB1dGF0aW9uJm5ic3A7YW5kJm5ic3A7aG90Jm5ic3A7bWFy a2V0Jm5ic3A7aW4mbmJzcDtFdXJvcGUmbmJzcDthbmQmbmJzcDtOb3J0aCZuYnNwO0FtZXJpY2Es Jm5ic3A7YW5kJm5ic3A7b3RoZXImbmJzcDtjb3VudHJpZXM8L1NQQU4+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+LjwvU1BBTj48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48bzpwPjwv bzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTElORS1IRUlHSFQ6IDE1MCUiIGNsYXNzPU1zb05v cm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TIj5Qcm9kdWN0cyZuYnNwO21haW5seSZuYnNwO2luY2x1ZGUgDQpMYWRpZXMgaGFuZGJhZywg TWVuJiMzOTtzIGJyaWVmY2FzZSwgdG90ZSBiYWdzIGFuZCB3YWxsZXQgZXRjLiZuYnNwOzwvU1BB Tj48L1A+DQo8UCBzdHlsZT0iTElORS1IRUlHSFQ6IDE1MCUiIGNsYXNzPU1zb05vcm1hbD48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj5QbHMm bmJzcDtmZWVsJm5ic3A7ZnJlZSZuYnNwO3RvJm5ic3A7Y29udGFjdCZuYnNwO3dpdGgmbmJzcDtt ZSZuYnNwO2lmJm5ic3A7eW91Jm5ic3A7d291bGQmbmJzcDtsaWtlJm5ic3A7dG8mbmJzcDtrbm93 Jm5ic3A7bW9yZSwgDQpJJm5ic3A7d2lsbCBzZW5kIHRoZSBjYXRhbG9nIHRvIHlvdSBzb29uLiA8 L1NQQU4+PC9QPg0KPFAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxNTAlIiBjbGFzcz1Nc29Ob3JtYWw+ PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+ PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMnB0 OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZMiPkIud2lzaGVzPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsg Rk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZMiPiE8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAg c3R5bGU9IkxJTkUtSEVJR0hUOiAxNTAlIiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+QW5nZWxvJm5ic3A7SHVh bmc8L1NQQU4+PC9QPg0KPFAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxNTAlIiBjbGFzcz1Nc29Ob3Jt YWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9 kyI+U2t5cGU6IA0KZGF2aWUxODE4MTg8L1NQQU4+PC9QPjwhLS1FbmRGcmFnbWVudC0tPjwvQk9E WT48L0hUTUw+DQoNCg== From sales02@rds-light.pw Wed Aug 10 01:29:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C510F7CA1 for ; Wed, 10 Aug 2016 01:29:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 95CB7304032 for ; Tue, 9 Aug 2016 23:29:33 -0700 (PDT) X-ASG-Debug-ID: 1470810570-0bf57c136950bcc0001-NocioJ Received: from server1.domain.com (server1.rds-light.pw [47.88.76.54]) by cuda.sgi.com with ESMTP id wak8s8CQkt2G4wEA for ; Tue, 09 Aug 2016 23:29:31 -0700 (PDT) X-Barracuda-Envelope-From: sales02@rds-light.pw X-Barracuda-Effective-Source-IP: server1.rds-light.pw[47.88.76.54] X-Barracuda-Apparent-Source-IP: 47.88.76.54 Received: from RDS-07 (172.87.25.28) by server1.domain.com id hlb4so0e97c3 for ; Wed, 10 Aug 2016 14:29:28 +0800 (envelope-from ) From: "Sales08rds03@gmail.com" Subject: Re:Re:Re:To be Your Partner To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re:Re:Re:To be Your Partner MIME-Version: 1.0 Sender: sales02@rds-light.pw Reply-To: Sales08rds03@gmail.com Date: Wed, 10 Aug 2016 14:29:29 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: server1.rds-light.pw[47.88.76.54] X-Barracuda-Start-Time: 1470810570 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 24466 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.34 X-Barracuda-Spam-Status: No, SCORE=0.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, SARE_SXLIFE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31894 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 SARE_SXLIFE BODY: Talks about your sex life 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20160810062933.D49481940062@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE3NTE0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIA0Kc3R5bGU9IlRFWFQt QUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAyMDAlOyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46 IDBwdDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1BVVRPU1BBQ0U6IGlkZW9n cmFwaC1udW1lcmljOyBtc28tcGFyYS1tYXJnaW4tcmlnaHQ6IDAuMDAwMGdkOyBtc28tcGFyYS1t YXJnaW4tbGVmdDogMC4wMDAwZ2Q7IG1zby1jaGFyLWluZGVudC1jb3VudDogMC4wMDAwOyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPXA+PFNQQU4gDQpzdHlsZT0iTElORS1I RUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUs MjU1KTsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPkRlYXI8 L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlh bDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZP TlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1m b250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRp bmc6IHJnYigyNTUsMjU1LDI1NSkiPiZuYnNwO01hbmFnZXIsPC9TUEFOPjxTUEFOIA0Kc3R5bGU9 IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigy NTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCw1MSwxMDIpOyBGT05ULVNJWkU6IDExcHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUp Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBM SU5FLUhFSUdIVDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IEJBQ0tHUk9V TkQ6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtQVVUT1NQQUNFOiBpZGVvZ3JhcGgtbnVtZXJpYzsg bXNvLXBhcmEtbWFyZ2luLXJpZ2h0OiAwLjAwMDBnZDsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAu MDAwMGdkOyBtc28tY2hhci1pbmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IHdp ZG93LW9ycGhhbiIgDQpjbGFzcz1wPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBG T05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiBy Z2IoMCw1MSwxMDIpOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4w MDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5IYXZlIA0KYSBuaWNlIGRheT88 L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlh bDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZP TlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1m b250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRp bmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9 IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAyMDAlOyBURVhULUlOREVOVDogMHB0OyBN QVJHSU46IDBwdDsgVEVYVC1BVVRPU1BBQ0U6IGlkZW9ncmFwaC1udW1lcmljOyBtc28tcGFyYS1t YXJnaW4tcmlnaHQ6IDAuMDAwMGdkOyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMC4wMDAwZ2Q7IG1z by1jaGFyLWluZGVudC1jb3VudDogMC4wMDAwOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFu IiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAwJTsgRk9O VC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdi KDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAw MHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+VGhpcyANCmlzIEFsaWNlIGZyb20g UnVpZGlzaSBsaWdodCw8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZP TlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJn YigwLDUxLDEwMik7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPm1hbnVmYWN0dXJpbmcgDQo8L1NQ QU4+PEI+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlh bDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZP TlQtU0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzog MC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5MRUQ8L1NQQU4+PC9CPjxC PjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEJB Q0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCw1MSwxMDIpOyBGT05ULVNJ WkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAw MHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+Jm5ic3A7PC9TUEFOPjwvQj48Qj48 U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNL R1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpF OiAxMXB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPmhpZ2ggDQpiYXkgbGlnaHQ8L1NQQU4+ PC9CPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogQXJpYWw7 IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCw1MSwxMDIpOyBGT05U LVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5n OiByZ2IoMjU1LDI1NSwyNTUpIj4mbmJzcDthbmQgDQo8L1NQQU4+PEI+PFNQQU4gDQpzdHlsZT0i TElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1 NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZPTlQtU0laRTogMTFwdDsgRk9OVC1X RUlHSFQ6IGJvbGQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5n OiByZ2IoMjU1LDI1NSwyNTUpIj5mbG9vZCANCmxpZ2h0PC9TUEFOPjwvQj48U1BBTiANCnN0eWxl PSJMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2Io MjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMXB0OyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1 KSI+Jm5ic3A7d2l0aCANCjwvU1BBTj48Qj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAw JTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xP UjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1 NSkiPlNBQTwvU1BBTj48L0I+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQt RkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigw LDUxLDEwMik7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPiZuYnNwO2NlcnRpZmljYXRlIA0KYW5k IGNvbXBldGl0aXZlIHByaWNlLjwvU1BBTj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAw JTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xP UjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PG86cD48L286cD48L1NQ QU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDIwMCU7 IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwy NTUpOyBURVhULUFVVE9TUEFDRTogaWRlb2dyYXBoLW51bWVyaWM7IG1zby1wYXJhLW1hcmdpbi1y aWdodDogMC4wMDAwZ2Q7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZDsgbXNvLWNoYXIt aW5kZW50LWNvdW50OiAwLjAwMDA7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xh c3M9cD48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IEFyaWFs OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsgRk9O VC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGlu ZzogcmdiKDI1NSwyNTUsMjU1KSI+V2UgDQpwcm92aWRlIDUgeWVhcnMgd2FycmFudHkgZm9yIGFs bCBvZiBvdXIgcHJvZHVjdHMsT0VNIG9yIE9ETSBpcyANCmFjY2VwdGFibGUuPC9TUEFOPjxTUEFO IA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9V TkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCw1MSwxMDIpOyBGT05ULVNJWkU6IDEx cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1 LDI1NSwyNTUpIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdO OiBsZWZ0OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7 IFRFWFQtQVVUT1NQQUNFOiBpZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLXJpZ2h0 OiAwLjAwMDBnZDsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28tY2hhci1pbmRl bnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1N c29Ob3JtYWw+PEI+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiBBcmlhbDsgTEVUVEVS LVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYigzMSw3MywxMjUpOyBGT05ULVNJWkU6IDExcHQ7IEZP TlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij5X ZSANCmludHJvZHVjZSA8L1NQQU4+PC9CPjxCPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAy MDAlOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlM WTogQXJpYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoMzEsNzMsMTI1KTsgRk9O VC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJu aW5nOiAwLjAwMDBwdCI+b25lIA0Kb2Ygb3VyPC9TUEFOPjwvQj48Qj48U1BBTiANCnN0eWxlPSJM SU5FLUhFSUdIVDogMjAwJTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1h bDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBMRVRURVItU1BBQ0lORzogMHB0OyBDT0xPUjogcmdiKDMx LDczLDEyNSk7IEZPTlQtU0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsg bXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPiZuYnNwO2xlZCANCmZsb29kIGxpZ2h0IGZlYXR1 cmVzOjwvU1BBTj48L0I+PEI+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQt VFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiBBcmlhbDsg TEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYigzMSw3MywxMjUpOyBGT05ULVNJWkU6IDEx cHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1m YXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAw MHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L0I+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjog bGVmdDsgTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBU RVhULUFVVE9TUEFDRTogaWRlb2dyYXBoLW51bWVyaWM7IG1zby1wYXJhLW1hcmdpbi1yaWdodDog MC4wMDAwZ2Q7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZDsgbXNvLWNoYXItaW5kZW50 LWNvdW50OiAwLjAwMDA7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBURVhULVRSQU5TRk9STTog bm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlMWTogQXJpYWw7IExFVFRFUi1TUEFD SU5HOiAwcHQ7IENPTE9SOiByZ2IoMzEsNzMsMTI1KTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdF SUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij4xLiAN CjQwMFctMTAwMFcgYXZhaWxhYmxlLHRvdGFsIDMgbW9kZWxzIG9wdGlvbmFsLjwvU1BBTj48U1BB TiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQt U1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBMRVRURVItU1BBQ0lORzogMHB0OyBD T0xPUjogcmdiKDMxLDczLDEyNSk7IEZPTlQtU0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IG5vcm1h bDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+PG86cD48L286cD48L1NQ QU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDIwMCU7 IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBURVhULUFVVE9TUEFDRTogaWRlb2dyYXBo LW51bWVyaWM7IG1zby1wYXJhLW1hcmdpbi1yaWdodDogMC4wMDAwZ2Q7IG1zby1wYXJhLW1hcmdp bi1sZWZ0OiAwLjAwMDBnZDsgbXNvLWNoYXItaW5kZW50LWNvdW50OiAwLjAwMDA7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkxJ TkUtSEVJR0hUOiAyMDAlOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFs OyBGT05ULUZBTUlMWTogQXJpYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoMzEs NzMsMTI1KTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij4yLiANCkhpZ2ggcG93ZXIsOTVsbS93LFBGJmd0 OzAuOTUsNSB5ZWFycyB3YXJyYW50eS48L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6 IDIwMCU7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFN SUxZOiBBcmlhbDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYigzMSw3MywxMjUpOyBG T05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQt a2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRF WFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAyMDAlOyBURVhULUlOREVOVDogMHB0OyBNQVJH SU46IDBwdDsgVEVYVC1BVVRPU1BBQ0U6IGlkZW9ncmFwaC1udW1lcmljOyBtc28tcGFyYS1tYXJn aW4tcmlnaHQ6IDAuMDAwMGdkOyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMC4wMDAwZ2Q7IG1zby1j aGFyLWluZGVudC1jb3VudDogMC4wMDAwOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiAN CmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1U UkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBM RVRURVItU1BBQ0lORzogMHB0OyBDT0xPUjogcmdiKDMxLDczLDEyNSk7IEZPTlQtU0laRTogMTFw dDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdCI+My4gDQpMRUQgRmxvb2QgbGlnaHQgSVAgcmF0aW5nIGlzIHVwIHRvIElQNjUuPC9TUEFO PjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBURVhULVRSQU5TRk9STTogbm9uZTsg Rk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlMWTogQXJpYWw7IExFVFRFUi1TUEFDSU5HOiAw cHQ7IENPTE9SOiByZ2IoMzEsNzMsMTI1KTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDog bm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFt aWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpw PjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDog MjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFRFWFQtQVVUT1NQQUNFOiBpZGVv Z3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLXJpZ2h0OiAwLjAwMDBnZDsgbXNvLXBhcmEt bWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28tY2hhci1pbmRlbnQtY291bnQ6IDAuMDAwMDsgbXNv LXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHls ZT0iTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBu b3JtYWw7IEZPTlQtRkFNSUxZOiBBcmlhbDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJn YigzMSw3MywxMjUpOyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mb hem7kTsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjQuIA0KRWZmaWNpZW50IGNvcHBlciBo ZWF0IHBpcGUsaGVhdCB0cmFuc2ZlciByYXRlIGZhc3Rlci48L1NQQU4+PFNQQU4gDQpzdHlsZT0i TElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBub3Jt YWw7IEZPTlQtRkFNSUxZOiBBcmlhbDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYigz MSw3MywxMjUpOyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7 kTsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQ IA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAyMDAlOyBURVhULUlOREVO VDogMHB0OyBNQVJHSU46IDBwdDsgVEVYVC1BVVRPU1BBQ0U6IGlkZW9ncmFwaC1udW1lcmljOyBt c28tcGFyYS1tYXJnaW4tcmlnaHQ6IDAuMDAwMGdkOyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMC4w MDAwZ2Q7IG1zby1jaGFyLWluZGVudC1jb3VudDogMC4wMDAwOyBtc28tcGFnaW5hdGlvbjogd2lk b3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDog MjAwJTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1J TFk6IEFyaWFsOyBMRVRURVItU1BBQ0lORzogMHB0OyBDT0xPUjogcmdiKDMxLDczLDEyNSk7IEZP TlQtU0laRTogMTFwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3ll cyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1r ZXJuaW5nOiAwLjAwMDBwdCI+NS4gDQpMdW1pbm91cyBlZmZpY2llbmN5IGlzIGluY3JlYXNlZCBi eSA1MCUuPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBURVhULVRSQU5T Rk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlMWTogQXJpYWw7IExFVFRF Ui1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoMzEsNzMsMTI1KTsgRk9OVC1TSVpFOiAxMXB0OyBG T05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0 Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBM SU5FLUhFSUdIVDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFRFWFQtQVVU T1NQQUNFOiBpZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLXJpZ2h0OiAwLjAwMDBn ZDsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28tY2hhci1pbmRlbnQtY291bnQ6 IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+ PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBG T05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiBBcmlhbDsgTEVUVEVSLVNQQUNJTkc6IDBw dDsgQ09MT1I6IHJnYigzMSw3MywxMjUpOyBGT05ULVNJWkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBu b3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjYuIA0KVG9wIHF1 YWxpdHksc2VjdXJpdHksbG9uZyBsaWZlIHNwYW4uPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUt SEVJR0hUOiAyMDAlOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBG T05ULUZBTUlMWTogQXJpYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoMzEsNzMs MTI1KTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1z by1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0 eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBw dDsgTUFSR0lOOiAwcHQ7IFRFWFQtQVVUT1NQQUNFOiBpZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBh cmEtbWFyZ2luLXJpZ2h0OiAwLjAwMDBnZDsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdk OyBtc28tY2hhci1pbmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7 IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiBB cmlhbDsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYigzMSw3MywxMjUpOyBGT05ULVNJ WkU6IDExcHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2Vybmlu ZzogMC4wMDAwcHQiPkFwcGxpY2F0aW9uczpzdGFkaXVtLHdoYXJmLGdvbGYgDQpjb3Vyc2UscHVi bGljIHNxdWFyZSxleGhpYml0aW9uIGhhbGwuPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJ R0hUOiAyMDAlOyBURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05U LUZBTUlMWTogQXJpYWw7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoMzEsNzMsMTI1 KTsgRk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1m b250LWtlcm5pbmc6IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxl PSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsg TUFSR0lOOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtQVVUT1NQQUNF OiBpZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFyZ2luLXJpZ2h0OiAwLjAwMDBnZDsgbXNv LXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28tY2hhci1pbmRlbnQtY291bnQ6IDAuMDAw MDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1wPjxCPjxTUEFOIA0Kc3R5 bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJn YigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCw1MSwxMDIpOyBGT05ULVNJWkU6IDExcHQ7IEZP TlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+QXJlIA0KeW91IGludGVyZXN0ZWQgaW4gaXQ/PC9TUEFO PjwvQj48Qj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IEFy aWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsg Rk9OVC1TSVpFOiAxMXB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3ll cyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5n OiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+PC9vOnA+PC9T UEFOPjwvQj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDog MjAwJTsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUs MjU1LDI1NSk7IFRFWFQtQVVUT1NQQUNFOiBpZGVvZ3JhcGgtbnVtZXJpYzsgbXNvLXBhcmEtbWFy Z2luLXJpZ2h0OiAwLjAwMDBnZDsgbXNvLXBhcmEtbWFyZ2luLWxlZnQ6IDAuMDAwMGdkOyBtc28t Y2hhci1pbmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIg DQpjbGFzcz1wPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAyMDAlOyBGT05ULUZBTUlMWTog QXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCw1MSwxMDIp OyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1z aGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5QbHMgDQo8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElO RS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwy NTUsMjU1KTsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28t Zm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPmZl ZWwgDQpmcmVlIHRvIGNvbnRhY3QgdXMgZGlyZWN0bHk8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElO RS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwy NTUsMjU1KTsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28t Zm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPiwg DQo8L1NQQU4+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6IDIwMCU7IEZPTlQtRkFNSUxZOiBB cmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDUxLDEwMik7 IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFz dC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNo YWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPndlIA0Kc2VuZCB5b3UgdGhlIGNhdGFsb2d1ZSBzb29u LjwvU1BBTj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IEFy aWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsg Rk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDIwMCU7IFRFWFQtSU5ERU5UOiAwcHQ7 IE1BUkdJTjogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUFVVE9TUEFD RTogaWRlb2dyYXBoLW51bWVyaWM7IG1zby1wYXJhLW1hcmdpbi1yaWdodDogMC4wMDAwZ2Q7IG1z by1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZDsgbXNvLWNoYXItaW5kZW50LWNvdW50OiAwLjAw MDA7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9cD48U1BBTiANCnN0eWxl PSJMSU5FLUhFSUdIVDogMjAwJTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2Io MjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMXB0OyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1 KSI+VGhhbmsgDQp5b3UgdmVyeSBtdWNoITwvU1BBTj48U1BBTiANCnN0eWxlPSJMSU5FLUhFSUdI VDogMjAwJTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUp OyBDT0xPUjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PG86cD48L286 cD48L1NQQU4+PC9QPg0KPFA+Jm5ic3A7PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7 IE1BUkdJTjogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05v cm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2FsaWJyaTsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IFZlcmRhbmE7IG1zby1oYW5zaS1mb250LWZhbWlseTog VmVyZGFuYSI+VGhhbmtzIA0KJmFtcDsgQmVzdCByZWdhcmRzPC9TUEFOPjxGT05UIGZhY2U9Q2Fs aWJyaT48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog5a6L5L2TOyBDT0xPUjogcmdiKDAsMCww KTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmkiPiw8L1NQ QU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmk7IEZPTlQtU0laRTogMTAuNXB0 OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OyI+PG86cD48L286cD48L1NQQU4+PC9GT05UPjwvUD4N CjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxMnB0OyBNQVJHSU46 IDcuNXB0IDcuNXB0IDcuNXB0IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpj bGFzcz1Nc29Ob3JtYWw+PEZPTlQgZmFjZT1DYWxpYnJpPjxCPjxTUEFOIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiDlvq7ova/pm4Xpu5E7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7 IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhh bnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmki IA0KY2xhc3M9MTU+QWxpY2U8L1NQQU4+PC9CPjxCPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZ OiBDYWxpYnJpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdI VDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZh bWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCIgDQpjbGFzcz0x NT4mbmJzcDsvIDwvU1BBTj48L0I+PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGli cmk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBib2xk OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl vq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0IiANCmNsYXNzPTE1Pk1hbmFn ZXI8L1NQQU4+PC9CPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVNJ WkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWJpZGktZm9u dC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsiPjxvOnA+PC9vOnA+PC9TUEFOPjwv Rk9OVD48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMTJw dDsgTUFSR0lOOiA3LjVwdCA3LjVwdCA3LjVwdCAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1v cnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxCPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBD YWxpYnJpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDog Ym9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWls eTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+U2hlbnpoZW4gDQpS dWlkaXNpIExpZ2h0aW5nIENPLixMVEQ8L1NQQU4+PC9CPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBDYWxpYnJpOyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAx LjAwMDBwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsi PjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJ TkUtSEVJR0hUOiAxMnB0OyBNQVJHSU46IDcuNXB0IDcuNXB0IDcuNXB0IDBwdDsgbXNvLXBhZ2lu YXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PEI+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7 IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0 Ij5QaG9uZTogDQorODYtMTwvU1BBTj48L0I+PEZPTlQgZmFjZT1DYWxpYnJpPjxCPjxTUEFOIA0K c3R5bGU9IkZPTlQtRkFNSUxZOiDlvq7ova/pm4Xpu5E7IENPTE9SOiByZ2IoMCwwLDApOyBGT05U LVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTogQ2Fs aWJyaTsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYXNjaWktZm9udC1mYW1p bHk6IENhbGlicmkiPjM2NzAyMjE1NTY8L1NQQU4+PC9CPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBDYWxpYnJpOyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAx LjAwMDBwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsi PjxvOnA+PC9vOnA+PC9TUEFOPjwvRk9OVD48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBs ZWZ0OyBMSU5FLUhFSUdIVDogMTJwdDsgTUFSR0lOOiA3LjVwdCA3LjVwdCA3LjVwdCAwcHQ7IG1z by1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxCPjxTUEFOIA0K c3R5bGU9IkZPTlQtRkFNSUxZOiBDYWxpYnJpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpF OiAxMnB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAw LjAwMDBwdCI+VGVsOiANCis4NiA3NTUgMjg5MDk1MjM8L1NQQU4+PC9CPjxCPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtRkFNSUxZOiBDYWxpYnJpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAx MnB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5b6u6L2v6ZuF6buROyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdCI+PG86cD48L286cD48L1NQQU4+PC9CPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046 IGxlZnQ7IExJTkUtSEVJR0hUOiAxMnB0OyBNQVJHSU46IDcuNXB0IDcuNXB0IDcuNXB0IDBwdDsg bXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PEI+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJ WkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0Ij5Ta3lwZTogDQo8L1NQQU4+PC9CPjxGT05UIGZhY2U9Q2FsaWJyaT48Qj48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTog5b6u6L2v6ZuF6buROyBDT0xPUjogcmdiKDAsMCwwKTsg Rk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdIVDogYm9sZDsgbXNvLXNwYWNlcnVuOiAmIzM5O3ll cyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6 IENhbGlicmk7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWFzY2lpLWZvbnQt ZmFtaWx5OiBDYWxpYnJpIj5zYWxlczA4LnJkczwvU1BBTj48L0I+PEI+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7 IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0 Ij48bzpwPjwvbzpwPjwvU1BBTj48L0I+PC9GT05UPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJ R046IGxlZnQ7IExJTkUtSEVJR0hUOiAxMnB0OyBNQVJHSU46IDcuNXB0IDcuNXB0IDcuNXB0IDBw dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PEI+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05U LVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5p bmc6IDAuMDAwMHB0Ij5odHRwOi8vd3d3LnJkcy1sZWQuY29tLzwvU1BBTj48L0I+PEI+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJ WkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L0I+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1B TElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDEycHQ7IE1BUkdJTjogNy41cHQgNy41cHQgNy41cHQg MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48Qj48 U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2FsaWJyaTsgQ09MT1I6IHJnYigwLDAsMCk7IEZP TlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2Vy bmluZzogMC4wMDAwcHQiPkFkZDogDQozL0YgU2lsaWNvbiBWYWxsZXkgUG93ZXIgSW5kdXN0cmlh bCBQYXJrLDwvU1BBTj48L0I+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmk7IEZP TlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYmlk aS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OyI+PG86cD48L286cD48L1NQ QU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDEycHQ7 IE1BUkdJTjogNy41cHQgNy41cHQgNy41cHQgMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuIiANCmNsYXNzPU1zb05vcm1hbD48Qj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2Fs aWJyaTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IGJv bGQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOW+rui9r+mbhem7kTsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPiZuYnNwOzwvU1BBTj48 L0I+PEZPTlQgDQpmYWNlPUNhbGlicmk+PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOW+ rui9r+mbhem7kTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlH SFQ6IGJvbGQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzog MC4wMDAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktZm9udC1m YW1pbHk6IENhbGlicmk7IG1zby1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaSI+Jm5ic3A7Jm5i c3A7PC9TUEFOPjwvQj48Qj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2FsaWJyaTsgQ09M T1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mb hem7kTsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPiZuYnNwO0xvbmdodWEgDQpCYW8mIzM5 O2FuIERpc3RyaWN0LHNoZW56aGVuLGNoaW5hPC9TUEFOPjwvQj48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTogQ2FsaWJyaTsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vybmlu ZzogMS4wMDAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYj Mzk7Ij48bzpwPjwvbzpwPjwvU1BBTj48L0ZPTlQ+PC9QPjwhLS1FbmRGcmFnbWVudC0tPjwvQk9E WT48L0hUTUw+DQoNCg== From sales02@hardware.net Wed Aug 10 03:17:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=HTML_MESSAGE, HTML_OBFUSCATE_05_10,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5B2517CA1 for ; Wed, 10 Aug 2016 03:17:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 11AFC304039 for ; Wed, 10 Aug 2016 01:17:15 -0700 (PDT) X-ASG-Debug-ID: 1470817028-0bf8151be21ec70001-NocioJ Received: from mail.port25.com ([121.12.40.149]) by cuda.sgi.com with ESMTP id B9ZsR5Y7fOD4u89J for ; Wed, 10 Aug 2016 01:17:10 -0700 (PDT) X-Barracuda-Envelope-From: sales02@hardware.net X-Barracuda-Effective-Source-IP: UNKNOWN[121.12.40.149] X-Barracuda-Apparent-Source-IP: 121.12.40.149 Received: from H6IL3G15LNYF88P (127.0.0.1) by mail.port25.com for ; Wed, 10 Aug 2016 16:18:44 +0800 (envelope-from ) From: "sales5@wellwayltd.com" Subject: New experience of mixing bowl To: xfs@oss.sgi.com X-ASG-Orig-Subj: New experience of mixing bowl MIME-Version: 1.0 Sender: sales02@hardware.net Reply-To: sales5@wellwayltd.com Date: Wed, 10 Aug 2016 16:18:44 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline Message-ID: <0.0.0.1BD.1D1F2DFCFB77AAD.0@mail.port25.com> X-Barracuda-Connect: UNKNOWN[121.12.40.149] X-Barracuda-Start-Time: 1470817030 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1590 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, HTML_OBFUSCATE_05_10, MIME_HTML_ONLY, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31896 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_OBFUSCATE_05_10 BODY: Message is 5% to 10% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC45NjAwLjE4Mzc3Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIGNsYXNzPU1z b05vcm1hbCANCnN0eWxlPSJNQVJHSU46IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdIVDogMjVwdDsg bXNvLWxpbmUtaGVpZ2h0LXJ1bGU6IGV4YWN0bHkiPjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxl PSYjMzk7Rk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYj Mzk7PkhlbGxvIA0KU2lyLDxCUj5OaWNlIHRvIGVtYWlsIHlvdS4gVGhpcyBpcyA8QSBocmVmPSJo dHRwOi8vd3d3LndlbGx3YXktaGsuY29tLyI+PEZPTlQgDQpjb2xvcj0jMDAwMGZmPldFTExXQVkg RU5URVJQUklTRSBERVZFTE9QTUVOVCBMSU1JVElEPC9GT05UPjwvQT48QlI+UGxlYXNlIG5vdGUg DQp0aGF0IHdlIHNwZWNpYWxpemVkIGluIG1hbnVmYWN0dXJpbmcgSE9VU0VXQVJFLCBLSVRDSEVO V0FSRSwgQkVSV0FSRSBhbmQgQkFSV0FSRSANCm92ZXIgMzAgeWVhcnMgZXhwZXJpZW5jZS48QlI+ UGxlYXNlIGxldCBtZSBrbm93IHdoYXQgeW91IG5lZWQuPEJSPlRoYW5rcyAmYW1wOyANCndhaXRp bmcgZm9yIHlvdXIgYW5zd2VyIHNvb24uPEJSPkJlc3QgcmVnYXJkcyE8QlI+TGluZGE8QlI+PC9T UEFOPjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiAxMHB0OyBGT05U LUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiBibGFjazsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6ICJBcmlhbCBVbmljb2RlIE1TIiYjMzk7PkUtbWFpbDwvU1BBTj48U1BBTiAN CnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogIkFyaWFsIFVuaWNvZGUg TVMiLCJzYW5zLXNlcmlmIjsgQ09MT1I6IGJsYWNrOyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFy aWFsOyBtc28taGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTog QXJpYWwmIzM5Oz7vvJo8L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTIHN0eWxlPSYjMzk7Rk9OVC1T SVpFOiAxMHB0OyBGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiImIzM5Oz48QSANCmhy ZWY9Im1haWx0bzpzYWxlczVAd2VsbHdheS5jb20iPjxTUEFOIA0Kc3R5bGU9JiMzOTttc28tZmFy ZWFzdC1mb250LWZhbWlseTogIkFyaWFsIFVuaWNvZGUgTVMiJiMzOTs+PEZPTlQgDQpjb2xvcj0j MDAwMGZmPnNhbGVzNUB3ZWxsd2F5LmNvbTwvRk9OVD48L1NQQU4+PC9BPjw/eG1sOm5hbWVzcGFj ZSBwcmVmaXggPSAibyIgDQpucyA9ICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpv ZmZpY2UiIA0KLz48bzpwPjwvbzpwPjwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From faranks@zoho.com Wed Aug 10 04:22:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 634B07CA3 for ; Wed, 10 Aug 2016 04:22:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C8514AC001 for ; Wed, 10 Aug 2016 02:22:22 -0700 (PDT) X-ASG-Debug-ID: 1470820939-0bf57c1369521110001-NocioJ Received: from 587173.com (587173.com [23.238.158.23]) by cuda.sgi.com with ESMTP id DTC2FsRzUotS9eCF for ; Wed, 10 Aug 2016 02:22:20 -0700 (PDT) X-Barracuda-Envelope-From: faranks@zoho.com X-Barracuda-Effective-Source-IP: 587173.com[23.238.158.23] X-Barracuda-Apparent-Source-IP: 23.238.158.23 To: xfs@oss.sgi.com Subject: USB Flash Drives from us Message-ID: <01374f1cc6dd3ed951534d5d5e3ac007@carbonspeedcycle.com> X-ASG-Orig-Subj: USB Flash Drives from us Date: Wed, 10 Aug 2016 11:21:04 +0200 From: "Stacy Williams" Reply-To: derinquern@aliyun.com MIME-Version: 1.0 X-Mailer-LID: 3 X-Mailer-RecptId: 4686092 X-Mailer-SID: 1688 X-Mailer-Sent-By: 1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: 587173.com[23.238.158.23] X-Barracuda-Start-Time: 1470820939 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1507 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, We wanted to check to see if you need any LOGO promotional products for your business? Are you the correct person to speak with, if not could you please direct me? Our company manufactures USB Flash Drives that are custom printed with your logo. They make the perfect marketing tool for your business or organization. Looking for other items with your logo? We can supply anything with your logo°≠ Most Popular Items right now: - Phone Chargers with your logo - T-shirts, Hoodies - USB Flash Drives - Table Covers printed with your brand - Pens - Water Bottles - Banners - You name it we can make it and print on it for you! Our USB Pricing is at an ALL TIME LOW. We offer low minimum quantities and all memory sizes. Over 150 Stock Models as well as 100 % custom shaped USB drives in the shape of your Logo or product or just about anything else you can imagine! We are always running a promotion, just ask! 1-888-776-5496 We can pre-load your media files, images, presentations and files onto the drives for you. These are ideal handouts for trade shows, branding, corporate gifts and employees. * Please reply back and let me know what quantity and memory size you need for a Fast Quote! Are you a school or nonprofit? Please let us know for even further discounts. Let us send you a quote! We will EARN your business! Regards, Stacy Williams National Sales Rep Printed Logo Products 1- 888-776-5496 Email: wokingkof@sina.com From olivia@leadadvise.com Wed Aug 10 05:32:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID, T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3D32F7CA3 for ; Wed, 10 Aug 2016 05:32:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0CB728F804B for ; Wed, 10 Aug 2016 03:32:15 -0700 (PDT) X-ASG-Debug-ID: 1470825130-0bf57c136a528170001-NocioJ Received: from vps.reachinleads.com (unknown.servercentral.net [50.31.146.28]) by cuda.sgi.com with ESMTP id jQiMK1MSiGnGr832 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 10 Aug 2016 03:32:10 -0700 (PDT) X-Barracuda-Envelope-From: olivia@leadadvise.com X-Barracuda-Effective-Source-IP: unknown.servercentral.net[50.31.146.28] X-Barracuda-Apparent-Source-IP: 50.31.146.28 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=leadadvise.com; s=default; h=Content-Type:MIME-Version:Message-ID:Date: Subject:To:From:Sender:Reply-To:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=vzIFCwS5MdbXtNrNic2I3FN6Jy+aCJb2jMWlfeA8xns=; b=ixo0C295h60rg9IEB30wj2pfyg KtpGFYfj7/aFHruB2CiN/ppjaa4K44d4cSk84eBNVJW81KeG28IyEMqnu5L33R8Yi6/91s2xSFfhM Pbnoyb2DkHfsPZ5dkp7BX+6COmLCsl8jrTR287Q8IJZXg/DkyIbszEidgnc6ub40ui0OUXPUyer+1 HdGtkzCovgX83G7OW4W2rM0Fxbw71SARBDQQe6GKVZAEOMqKWFuGorzB04/R/ij7jBrd6vTU8iNZc sshDy1OXDkbphG518ojgMMaAb+WWiGrDlx7ReOvSlMHAnIGgheNqZLh4C/WjgeLDXOsrjo6riG54M fVRiYxlg==; Received: from [123.201.152.83] (port=53772 helo=adminPC) by vps.reachinleads.com with esmtpsa (TLSv1:ECDHE-RSA-AES256-SHA:256) (Exim 4.87) (envelope-from ) id 1bXQnx-0004xW-8D for xfs@oss.sgi.com; Wed, 10 Aug 2016 05:32:10 -0500 Return-Receipt-To: "Olivia" From: "Olivia" To: Subject: Scotwood Interiors Limited Date: Wed, 10 Aug 2016 16:02:03 +0530 X-ASG-Orig-Subj: Scotwood Interiors Limited Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0496_01D1F320.8A891E00" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdHy8m4qYwzLkbIVRRmx88Ymvl8nGQ== Content-Language: en-us x-cr-hashedpuzzle: AOu/ AaU4 Ao+V A4Em C3BI DEtS EUFs EvFt F+II GCuq Hunz Iwfw LChw LvvI L0tt L54V;1;eABmAHMAQABvAHMAcwAuAHMAZwBpAC4AYwBvAG0A;Sosha1_v1;7;{95D41DDC-908F-428A-9D97-CEB6654452F5};bwBsAGkAdgBpAGEAQABsAGUAYQBkAGEAZAB2AGkAcwBlAC4AYwBvAG0A;Wed, 10 Aug 2016 10:32:01 GMT;UwBjAG8AdAB3AG8AbwBkACAASQBuAHQAZQByAGkAbwByAHMAIABMAGkAbQBpAHQAZQBkAA== x-cr-puzzleid: {95D41DDC-908F-428A-9D97-CEB6654452F5} Disposition-Notification-To: "Olivia" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.reachinleads.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - leadadvise.com X-Get-Message-Sender-Via: vps.reachinleads.com: authenticated_id: olivia@leadadvise.com X-Authenticated-Sender: vps.reachinleads.com: olivia@leadadvise.com X-Barracuda-Connect: unknown.servercentral.net[50.31.146.28] X-Barracuda-Start-Time: 1470825130 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7588 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message This is a multipart message in MIME format. ------=_NextPart_000_0496_01D1F320.8A891E00 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hello, While Going through Your Company Website I came to know that your company specialized in Design, Shop fitting, Joinery Manufacture, Interior Fit-out AS we are Global Database Provider we have a complete contact details and verified e-mail address of key decision makers like Architects, Contractors, Consultants, House Builders, Engineers, Financiers, Interior Designers, Suppliers and Distributors, Developers , Building & Construction Machinery, Equipment & Tools, and many more across worldwide. Our list includes :- Name, Job title, Company Name, E-mail address, Phone number, Physical address and many more. Please send me your exact criteria in the below mentioned format, So that I can give you counts and samples for your review. Target Industry : _______ (Any) Target Geography: ________ (Worldwide) Target Job titles: ________ (ex, CEO, VP, And Any Decision Makers) Best Regards, Victoria James Business Development Executive E: Victoria@access-leads.com List Reach: USA, Canada, UK, Europe, Australia, Singapore, Ireland, South Africa, ASIA Pacific etc. ............................................................................ ......................................... We respect your privacy. If you want to stop receiving emails from us, please send a reply with the email subject line as "Leave out". ------=_NextPart_000_0496_01D1F320.8A891E00 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hello,

 

While Going through Your Company Website I came to know that your company = specialized in Design, Shop fitting, Joinery Manufacture, Interior = Fit-out

 

AS we are Global Database Provider we have = a complete contact details and verified e-mail address of key decision = makers like Architects, Contractors, Consultants, House = Builders, Engineers, Financiers, Interior Designers, Suppliers and Distributors, Developers , Building & Construction Machinery, Equipment & = Tools, and many more across worldwide.

 

Our list includes :- Name, Job = title, Company Name, E-mail address, Phone number, Physical address and many = more.

 

Please send me your exact criteria in the below mentioned format, So that I can = give you counts and samples for your review.

 

Target Industry      : = _______ (Any)

Target Geography: ________ = (Worldwide)

Target Job titles: ________ (ex, CEO, VP, And = Any Decision Makers)

 

Best = Regards,

Victoria = James

Business = Development Executive

E: Victoria@access-leads.com

List Reach: = USA, Canada, UK, Europe, Australia, Singapore, Ireland, South Africa, ASIA Pacific = etc.

………………R= 30;…………………………= …………………………= 230;…………………………= ;…………………………&#= 8230;………...............................................= ..................

We = respect your privacy. If you want to stop receiving emails from us, please send a = reply with the email subject line as "Leave out".

 

 

 

 

 

 

 

------=_NextPart_000_0496_01D1F320.8A891E00-- From david@fromorbit.com Wed Aug 10 05:56:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1AE697CA3 for ; Wed, 10 Aug 2016 05:56:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B66468F8039 for ; Wed, 10 Aug 2016 03:56:45 -0700 (PDT) X-ASG-Debug-ID: 1470826601-0bf8151be22ffa0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id nuOXRN55Ln0LqB9N for ; Wed, 10 Aug 2016 03:56:42 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DACwBqB6tXIAI1LHldDoM3VnyCeaEnBoxiihskhXMEAgKBW00BAQEBAQEHAQEBAQEBNwFAhF4BAQQBOhwjBQsIAxgJJQ8FJQMHGhOIKQcPwTkBAQgCJR6FRIQSgQOCX4FNhW8FmTyGHYhrgXWEW4MyhUuMNIN4gmYcgRFNKjIBhWeBRAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Aug 2016 20:26:40 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bXRBf-0006w4-DQ; Wed, 10 Aug 2016 20:56:39 +1000 Date: Wed, 10 Aug 2016 20:56:39 +1000 From: Dave Chinner To: Wei Lin Cc: xfs@oss.sgi.com Subject: Re: Question on migrating data between PVs in xfs Message-ID: <20160810105639.GR16044@dastard> X-ASG-Orig-Subj: Re: Question on migrating data between PVs in xfs References: <20160809145046.GB5583@ic> <20160809223503.GJ19025@dastard> <20160810092313.GA16193@ic> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160810092313.GA16193@ic> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1470826602 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5519 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31898 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Wei, Please keep the discussion on the list unless there's good reason not to. I've readded the list cc... On Wed, Aug 10, 2016 at 10:23:14AM +0100, Wei Lin wrote: > Hi Dave, > > Thank you very much for the reply. Comment inline. > > On 16-08-10 08:35:03, Dave Chinner wrote: > > On Tue, Aug 09, 2016 at 03:50:47PM +0100, Wei Lin wrote: > > > Hi there, > > > > > > I am working on an xfs based project and want to modify the allocation > > > algorithm, which is quite involved. I am wondering if anyone could help > > > with this. > > > > > > The high level goal is to create xfs agains multiple physical volumes, > > > allow user to specify the target PV for files, and migrate files > > > automatically. > > > > So, essentially tiered storage with automatic migration. Can you > > describe the storage layout and setup you are thinking of using and > > how that will map to a single XFS filesystem so we have a better > > idea of what you are thinking of? > > > Yes, but the migration is triggerd by user specifying a device, instead > of kernel monitoring the usage pattern. That's not migration - that's an allocation policy. Migration means moving data at rest to a different physical location, such as via a HSM, automatic teiring or defragmentation. Deciding where to write when the first data is written is the job of the filesystem allocator, so what you are describing here is user-controlled allocation policy. > By "PV" I meant physical volumes of LVM. Currently I have two physical > volumes, one based on two SSDs and the other six HDDs. That's what I thought, but you still need to describe everything in full rather than assume the reader understands your abbreviations. > The XFS was > created as follows: > > mdadm --create /dev/md1 --raid-devices=2 --level=10 -p f2 --bitmap=internal --assume-clean /dev/nvme?n1 > mdadm --create /dev/md2 --raid-devices=6 --level=5 --bitmap=internal --assume-clean /dev/sd[c-h] > pvcreate /dev/md1 > pvcreate /dev/md2 > vgcreate researchvg /dev/md1 /dev/md2 > lvcreate -n hsd -l 100%FREE researchvg > mkfs.xfs -L HSD -l internal,lazy-count=1,size=128m /dev/mapper/researchvg-hsd It's a linear concatenation of multiple separate block devices, so the physical boundaries are hidden from the filesystem by the LVM layer. Have you lookd at using dm-cache instead of modifying the filesystem? > > > I plan to implement the user interface with extended attributes, but am > > > now stuck with the allocation/migration part. Is there a way to make xfs > > > respect the attribute, i.e. only allocate blocks/extents from the target > > > PV specified by user? > > > > Define "PV". > > > > XFS separates allocation by allocation group - it has no concept of > > underlying physical device layout. If I understand what you , you have > > multiple "physical volumes" set up in a single block device (somehow > > - please describe!) and now you want to control how data is > > allocated to those underlying volumes, right? > > I thought about storing the mapping between the physical volumes and the > logical volume in a special file, probably including metainfo like IOPS, > access time as well. And consulting this file on the fly to determine if > the allocated extent is within the target device. How does the filesystem determine whether an allocated extent is on a specific device when it has no knowledge of the underlying physical device boundaries? > > So what you're asking about is how to define and implement user > > controlled allocation policies, right? Sorta like this old > > prototype I was working on years ago? > > > > http://oss.sgi.com/archives/xfs/2009-02/msg00250.html > > > > And some more info from a later discussion: > > > > http://oss.sgi.com/archives/xfs/2013-01/msg00611.html > > > > And maybe in conjunction with this, which added groupings of AGs > > together to form independent regions of "physical separation" that > > the allocator could then be made aware of: > > > > http://oss.sgi.com/archives/xfs/2009-02/msg00253.html > > I am not sure if allocation(s) group would be a good unit of "physical > separation". There is no other construct in XFS designed for that purpose. > Since the underlying physical devices (thus the physical > volumes) have quite different characteristics, physical volumes seem > naturally a good choice. XFS knows nothing about those boundaries - you have to tell it where the boundaries are. e.g. size your allocation groups to fit the smallest physical boundary you have, then assign a different policy to the user of that allocation group. THat's the point of the patch set that allowed mkfs to define sets of AGs that lay in specific domains so that the allocator could target them based on the requirements supplied from the user in the allocation policy (which was the first patch set I pointed to). > On the other hand an allocation group may span > multiple physical volumes, providing quite different QoS. This is why I > planned to let users specify target "PV" instead of target allocation > group. Any ideas? Go read the code in the patches I pointed to first - they answer both the questions you are asking right now as these were the problems that I was looking to solve all that time ago. They will also answer many questions you haven't yet realised you need to ask, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 10 06:02:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4EC257CA3 for ; Wed, 10 Aug 2016 06:02:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2DC638F8052 for ; Wed, 10 Aug 2016 04:02:38 -0700 (PDT) X-ASG-Debug-ID: 1470826942-0bf57b369b5c8300001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8HetdNp6cH06zWUK for ; Wed, 10 Aug 2016 04:02:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C9CwCYCKtXIAI1LHldg0VWfIJ5g3mdLgaMYoYPhAwchXsEgWBNAQEBAQEBBwEBAQEBATcBQIUMLzskNAUlAwctiDChPaAuDh6FRIweC4MHBZk8hh2Ia4F1jVYCFIZQiUiCFQwBgj4qMoVnKoEbAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Aug 2016 20:32:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bXRHB-0006xJ-3Y for xfs@oss.sgi.com; Wed, 10 Aug 2016 21:02:21 +1000 Date: Wed, 10 Aug 2016 21:02:21 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: for-next branch updated to 9694212 Message-ID: <20160810110221.GL19025@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: for-next branch updated to 9694212 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="zhXaljGHf11kAtnf" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1470826942 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7265 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31898 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --zhXaljGHf11kAtnf Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Folks, The for-next branch of the xfsprogs repository at: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git has just been updated. This is an update with the initial libxfs sync from the 4.8-rc1 kernel code. It contains all the libxfs support for reverse mapping but none of the tool support, so it is not active yet. I'm pushing this out quickly so that Darrick can rebase the tool support patchset on top of it, and we can get that reviewed and merged ASAP so we can enable wider testing of the new rmap feature. -Dave. The new head of the master branch is commit: 9694212 xfs: move (and rename) the deferred bmap-free tracepoints New Commits: Christoph Hellwig (3): [1faa1a8] xfs: kill xfs_dir2_sf_off_t [d8bf9c6] xfs: kill xfs_dir2_inou_t [34f7aca] xfs: remove __arch_pack Darrick J. Wong (45): [0b90dda] libxfs: add more list operations [2cf6d22] xfs: convert list of extents to free into a regular list [730e2a1] xfs: refactor btree maxlevels computation [6c668fd] xfs: fix attr shortform structure alignment on cris [a62ed6d] xfs: fix locking of the rt bitmap/summary inodes [cff8bf9] xfs: set *stat=3D1 after iroot realloc [d3cd7a2] xfs: during btree split, save new block key & ptr for futur= e insertion [a3c9cb1] xfs: add function pointers for get/update keys to the btree [13e831e] xfs: support btrees with overlapping intervals for keys [5d3b7fe] xfs: introduce interval queries on btrees [f31736b] xfs: refactor btree owner change into a separate visit-bloc= ks function [a18e1f7] xfs: move deferred operations into a separate file [30ad7d6] xfs: add tracepoints for the deferred ops mechanism [31a6b02] xfs: enable the xfs_defer mechanism to process extents to f= ree [f944d3d] xfs: rework xfs_bmap_free callers to use xfs_defer_ops [6f530e9] xfs: change xfs_bmap_{finish,cancel,init,free} -> xfs_defer= _* [f33cea1] xfs: rename flist/free_list to dfops [a9da40d] xfs: add tracepoints and error injection for deferred exten= t freeing [513ec1c] xfs: increase XFS_BTREE_MAXLEVELS to fit the rmapbt [e37838e] xfs: introduce rmap btree definitions [d2aaeae] xfs: add rmap btree stats infrastructure [ef5340c] xfs: rmap btree add more reserved blocks [85aec44] xfs: add owner field to extent allocation and freeing [631ac87] xfs: introduce rmap extent operation stubs [b3a96b4] xfs: define the on-disk rmap btree format [e4ce00b] xfs: rmap btree transaction reservations [b8a8d6e] xfs: rmap btree requires more reserved free space [936ca68] xfs: add rmap btree operations [634b234] xfs: support overlapping intervals in the rmap btree [890e117] xfs: teach rmapbt to support interval queries [631bda2] xfs: add an extent to the rmap btree [ae81ebf] xfs: remove an extent from the rmap btree [7faf209] xfs: convert unwritten status of reverse mappings [b26675c] xfs: add rmap btree insert and delete helpers [e2d7f10] xfs: create rmap update intent log items [589b52d] xfs: enable the xfs_defer mechanism to process rmaps to upd= ate [d7f8032] xfs: propagate bmap updates to rmapbt [966d818] xfs: add rmap btree geometry feature flag [e365af6] xfs: don't update rmapbt when fixing agfl [2fc5f0e] xfs: enable the rmap btree functionality [64dbe04] xfs: remove the get*keys and update_keys btree ops pointers [ae01cb8] xfs: remove unnecesary lshift/rshift key initialization [e635802] xfs: in btree_lshift, only allocate temporary cursor when n= eeded [f1ade4e] xfs: remove the extents array from the rmap update done log= item [9694212] xfs: move (and rename) the deferred bmap-free tracepoints Dave Chinner (3): [8e51de5] patch libxfs-apply-formatting [fca3ed9] libxfs: fix set-but unused warning in dir2 code [2a6da3b] xfs: separate freelist fixing into a separate helper Eric Sandeen (1): [2d066e1] xfs: make several functions static Hou Tao (1): [2873bdf] xfs: remove the magic numbers in xfs_btree_block-related le= n macros Kaho Ng (1): [dcaff8a] xfs: indentation fix in xfs_btree_get_iroot() Code Diffstat: db/dir2.h | 4 +- db/dir2sf.c | 11 +- db/faddr.c | 6 +- db/field.c | 8 +- fs/xfs/xfs_rmap_item.c | 0 fs/xfs/xfs_rmap_item.h | 0 include/libxfs.h | 4 +- include/list.h | 76 ++- include/xfs.h | 7 + include/xfs_arch.h | 7 - include/xfs_mount.h | 6 + include/xfs_trace.h | 46 +- libxfs/Makefile | 6 + libxfs/init.c | 7 +- libxfs/libxfs_api_defs.h | 6 +- libxfs/libxfs_priv.h | 4 +- libxfs/list_sort.c | 141 +++++ libxfs/rdwr.c | 2 +- libxfs/util.c | 34 +- libxfs/xfs_alloc.c | 246 +++++++-- libxfs/xfs_alloc.h | 59 +- libxfs/xfs_alloc_btree.c | 12 - libxfs/xfs_attr.c | 71 +-- libxfs/xfs_attr_leaf.c | 4 +- libxfs/xfs_attr_leaf.h | 3 - libxfs/xfs_attr_remote.c | 19 +- libxfs/xfs_bmap.c | 256 ++++----- libxfs/xfs_bmap.h | 54 +- libxfs/xfs_bmap_btree.c | 32 +- libxfs/xfs_btree.c | 941 ++++++++++++++++++++++++++------ libxfs/xfs_btree.h | 90 +++- libxfs/xfs_da_btree.c | 6 +- libxfs/xfs_da_btree.h | 4 +- libxfs/xfs_da_format.c | 31 +- libxfs/xfs_da_format.h | 44 +- libxfs/xfs_defer.c | 463 ++++++++++++++++ libxfs/xfs_defer.h | 97 ++++ libxfs/xfs_dir2.c | 15 +- libxfs/xfs_dir2.h | 8 +- libxfs/xfs_dir2_sf.c | 38 +- libxfs/xfs_format.h | 197 +++++-- libxfs/xfs_fs.h | 1 + libxfs/xfs_ialloc.c | 43 +- libxfs/xfs_ialloc.h | 2 +- libxfs/xfs_ialloc_btree.c | 18 +- libxfs/xfs_inode_buf.c | 1 + libxfs/xfs_log_format.h | 63 ++- libxfs/xfs_rmap.c | 1397 +++++++++++++++++++++++++++++++++++++++++= +++++++ libxfs/xfs_rmap.h | 209 ++++++++ libxfs/xfs_rmap_btree.c | 509 ++++++++++++++++++ libxfs/xfs_rmap_btree.h | 68 +++ libxfs/xfs_rtbitmap.c | 2 +- libxfs/xfs_sb.c | 9 + libxfs/xfs_shared.h | 2 + libxfs/xfs_trans_resv.c | 62 ++- libxfs/xfs_trans_resv.h | 10 - libxfs/xfs_types.h | 4 +- mkfs/proto.c | 56 +- mkfs/xfs_mkfs.c | 16 +- repair/phase6.c | 94 ++-- tools/libxfs-apply | 158 +++++- 61 files changed, 4899 insertions(+), 890 deletions(-) create mode 100644 fs/xfs/xfs_rmap_item.c create mode 100644 fs/xfs/xfs_rmap_item.h create mode 100644 libxfs/list_sort.c create mode 100644 libxfs/xfs_defer.c create mode 100644 libxfs/xfs_defer.h create mode 100644 libxfs/xfs_rmap.c create mode 100644 libxfs/xfs_rmap.h create mode 100644 libxfs/xfs_rmap_btree.c create mode 100644 libxfs/xfs_rmap_btree.h --=20 Dave Chinner david@fromorbit.com --zhXaljGHf11kAtnf Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXqwm8AAoJEK3oKUf0dfodZ1sP/ipoDqF8Xm1ql1wL9JfN6jc6 QlVvKDR5+UeUbHqRVFTaWEKDaQIVFlBMYdnDRi5+yNQnV/mP0vWpMS8TTTJptP+a KlYCeJk1+FMmiiQw2pmMrvDbDao23IW6UZj2JuIY4yM452Z1LUjCBArPqhh73TAV McKL+9EppGNisODH9iWRvVw0Z95FkG+eQB0M7G6+TWQ5tWtO/Og3FA4bj0ri4rIS PDjdrkyTGZCvfyS5FPqOEplp9NEkcB+FfYKMZOXLCUGmoOYZ1Du09YXmKhjNFt1m pwR1yoxATO4Ow1SWQ5ItcYrEiPnzf5YrZTWTWTTHcTbYf//S0MH2ZNVGX8Dqtpdn XXFsEReS4V1SxgQgu926IGRzEqh0qH+F0gzG0VIdIbqsg4F2MuwJo7UDuIwoyipq ErjgQjkNGIvaZU75iKjPQ187oAQCt/JaNpXivzs56eYOfbaCceENJCaakGZTxXOW CFoez4w2CMnIzvGZTK3ggHU5IGTaSQW2P/nyNqWaaUXrxWWYJtZPfJOImCv5ltcy 2aGUgoKZjIX1esAbmfKF/Wz5bLBHEHC6zBmiKfsrkmA8LTGp69gMT8+PRWYweaC0 BRNycBbSIYurUEgX618P/xqMgxAtsRXy0LRnI0gQdP/5PnvB+mflgJBfqh8ve+Bj S6lqgCzbPH8FHcWUv+/8 =xnNR -----END PGP SIGNATURE----- --zhXaljGHf11kAtnf-- From eflorac@intellique.com Wed Aug 10 11:31:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 54AF37CA3 for ; Wed, 10 Aug 2016 11:31:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 263908F8049 for ; Wed, 10 Aug 2016 09:31:31 -0700 (PDT) X-ASG-Debug-ID: 1470846688-0bf57b369b5f2dd0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id oJNxEHz5tjA0w86w (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 10 Aug 2016 09:31:29 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Effective-Source-IP: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 37E3F547E9F; Wed, 10 Aug 2016 12:31:28 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id 20D96547C34; Wed, 10 Aug 2016 12:31:27 -0400 (EDT) Date: Wed, 10 Aug 2016 18:31:32 +0200 From: Emmanuel Florac To: Dave Chinner Cc: Wei Lin , xfs@oss.sgi.com Subject: Re: Question on migrating data between PVs in xfs Message-ID: <20160810183132.0b9ae8e4@harpe.intellique.com> X-ASG-Orig-Subj: Re: Question on migrating data between PVs in xfs In-Reply-To: <20160810105639.GR16044@dastard> References: <20160809145046.GB5583@ic> <20160809223503.GJ19025@dastard> <20160810092313.GA16193@ic> <20160810105639.GR16044@dastard> Organization: Intellique X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1470846688 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 751 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31903 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Wed, 10 Aug 2016 20:56:39 +1000 Dave Chinner =C3=A9crivait: > Have you lookd at using dm-cache instead of modifying the > filesystem? >=20 Or bcache, fcache, or EnhanceIO. So far from my own testing bcache is significantly faster and dm-cache by far the slowest of the bunch, but bcache needs some more loving (his main developer is busy writing some new tiered, caching filesystem instead). --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From david@fromorbit.com Wed Aug 10 16:51:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 34D067CA3 for ; Wed, 10 Aug 2016 16:51:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 07989304039 for ; Wed, 10 Aug 2016 14:51:54 -0700 (PDT) X-ASG-Debug-ID: 1470865910-0bf57b369d610660001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id EqDlgAbE02kXsBFz for ; Wed, 10 Aug 2016 14:51:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C+DQBXoatXIAI1LHldg0WBUoJ5g3mdMQaMYoobhhMEAgIBAQKBXj0QAQEBAQEBAQYBAQEBAQE3AUCEXwEFMgEjIxAIAw4KCSUPBSUDBxoTiDDCFQEBCAIlHoVEhRWKGwWGDZMvjBOCdY9NjDSDeDWEKyoyh1EBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 11 Aug 2016 07:21:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bXbPh-0008Qg-8X; Thu, 11 Aug 2016 07:51:49 +1000 Date: Thu, 11 Aug 2016 07:51:49 +1000 From: Dave Chinner To: Emmanuel Florac Cc: Wei Lin , xfs@oss.sgi.com Subject: Re: Question on migrating data between PVs in xfs Message-ID: <20160810215149.GM19025@dastard> X-ASG-Orig-Subj: Re: Question on migrating data between PVs in xfs References: <20160809145046.GB5583@ic> <20160809223503.GJ19025@dastard> <20160810092313.GA16193@ic> <20160810105639.GR16044@dastard> <20160810183132.0b9ae8e4@harpe.intellique.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160810183132.0b9ae8e4@harpe.intellique.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1470865911 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 837 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31916 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 10, 2016 at 06:31:32PM +0200, Emmanuel Florac wrote: > Le Wed, 10 Aug 2016 20:56:39 +1000 > Dave Chinner écrivait: > > > Have you lookd at using dm-cache instead of modifying the > > filesystem? > > > > Or bcache, fcache, or EnhanceIO. So far from my own testing bcache is > significantly faster and dm-cache by far the slowest of the bunch, but > bcache needs some more loving (his main developer is busy writing > some new tiered, caching filesystem instead). Yeah, the problem with bcache is that it is effectively an orphaned driver. If there are obvious and reproducable performance differentials between bcache and dm-cache, you should bring them to the attention of the dm developers to see if they can fix them... Cheers, Dave. -- Dave Chinner david@fromorbit.com From pallavi.webdesign1@outlook.com Thu Aug 11 02:29:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLYTO,HTML_MESSAGE,PRICES_ARE_AFFORDABLE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 022E37CA3 for ; Thu, 11 Aug 2016 02:29:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C609F8F8035 for ; Thu, 11 Aug 2016 00:29:31 -0700 (PDT) X-ASG-Debug-ID: 1470900568-0bf57c136a578ff0001-NocioJ Received: from SNT004-OMC1S18.hotmail.com (snt004-omc1s18.hotmail.com [65.55.90.29]) by cuda.sgi.com with ESMTP id eqeHCbYQjhDYiBN4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 00:29:28 -0700 (PDT) X-Barracuda-Envelope-From: pallavi.webdesign1@outlook.com X-Barracuda-Effective-Source-IP: snt004-omc1s18.hotmail.com[65.55.90.29] X-Barracuda-Apparent-Source-IP: 65.55.90.29 Received: from IND01-MA1-obe.outbound.protection.outlook.com ([65.55.90.7]) by SNT004-OMC1S18.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.23008); Thu, 11 Aug 2016 00:29:27 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=k28JQV2/uIvmB6tfG5T4I2m8VgjFPqOaeRqNLAajEic=; b=Ocs2Xt1bhd2Esk+d7ZYgDiN5OkqfYrl0G2uRR9uiXwOXw5J21lPgylrhEaCr5Fo0tqdSa3KTuZUGdoANJir14QU5j1R1nEumUqBQ7/tX7Bizrj0fNdqB4RE5GzY2sBca4xFabzLkc7XyaTbV51wlQ26PQAI+8zY8lmB92YfyZ+0TMBfWcYzGd0TX2WtSBGbnf4nc+XmUsdxxJk/ABBuHmY95XSR8dVJlXqgIv/iOvyO6W0EjwGTCbEopJWj8CVAzLtQHsyZllRQrZLU37pmPrj3eMv6FNiT1aErd2KRGTEHDmFIGZsJXVtrIpfOzHieAcZFSjP/YN+YUmug7Hu4f1g== Received: from MA1IND01FT009.eop-IND01.prod.protection.outlook.com (10.152.200.51) by MA1IND01HT003.eop-IND01.prod.protection.outlook.com (10.152.200.128) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.557.8; Thu, 11 Aug 2016 07:29:24 +0000 Received: from PN1PR01MB0127.INDPRD01.PROD.OUTLOOK.COM (10.152.200.57) by MA1IND01FT009.mail.protection.outlook.com (10.152.200.130) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.567.7 via Frontend Transport; Thu, 11 Aug 2016 07:29:24 +0000 Received: from PN1PR01MB0127.INDPRD01.PROD.OUTLOOK.COM ([10.164.139.16]) by PN1PR01MB0127.INDPRD01.PROD.OUTLOOK.COM ([10.164.139.16]) with mapi id 15.01.0549.025; Thu, 11 Aug 2016 07:29:23 +0000 From: pallavi sain To: "xfs@oss.sgi.com" Subject: 1st to 10th position in Google rankings Thread-Topic: 1st to 10th position in Google rankings X-ASG-Orig-Subj: 1st to 10th position in Google rankings Thread-Index: AdHzlRvkAJaGFlEQRIeBebMNUNTtuQ== Date: Thu, 11 Aug 2016 07:29:22 +0000 Message-ID: Reply-To: "marketingcompany411@gmail.com" Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=softfail (sender IP is 10.152.200.57) smtp.mailfrom=outlook.com; oss.sgi.com; dkim=none (message not signed) header.d=none;oss.sgi.com; dmarc=fail action=none header.from=outlook.com; received-spf: SoftFail (protection.outlook.com: domain of transitioning outlook.com discourages use of 10.152.200.57 as permitted sender) x-ms-exchange-messagesentrepresentingtype: 1 x-eopattributedmessage: 0 x-forefront-antispam-report: CIP:10.152.200.57;IPV:NLI;CTRY:;EFV:NLI;SFV:NSPM;SFS:(10019020)(98900003);DIR:OUT;SFP:1102;SCL:1;SRVR:MA1IND01HT003;H:PN1PR01MB0127.INDPRD01.PROD.OUTLOOK.COM;FPR:;SPF:None;LANG:en; x-microsoft-exchange-diagnostics: 1;MA1IND01HT003;6:bo0/F9iLErbMINfK2fS+nUFQhH6YuZsRm1OywuUi+5/i6mCo6TmqIKEhByD+qmFFqU91TXgU8zsQsMP5hGqp4XmQqNG0bOcWku0k9th7XNOFVtDXkmYAsA60D7eWcFmZGVLooJnFf0fPgdUvdeQK+UaYlmcE8qRld6bLkTnipJlhYEbB5j4vHiVwNFckANtIJfSD9U7OAb227MVSz06RU5sRhABuBKNkJxpd9NietnEIlMvZeL/L01ZlSDCTLiZpmzczwVGlF2ZkMKZ3lB/7hmkNFaS/QpGlg/piGiVUMByw0xce7stfsYcCSart5E40;5:dgj/12v+joTs/YKA+cCOFd1mfI0eHIhd1ug9bN0Z2+JV8aVomiVXrSBAZI7wJWxN//ud834jlr6xBi/QZ7wMf9baVZNjnYLTNvQt2UkoLGeHYxei1wl8++B2liVnKNbkmQ393aMu+1LAK82Dm1feUw==;24:FltbV6kMiQ2YyRlFJELdYYugyHIunojiaqDvxIjENZ0iYwK3QOSjrX2/3xjFAwjlMS/Mqw6M7jU4++wt9a6gEpDDL/HaIRzZ98J1GPk517E=;7:ZW4VdiGjme8f/dz9CL1oP00yB2KaoiiHKRxCemueB5bsHK5FhzxseYbu+ZpmuNpRPVaD63/FBDcwEZOS8zBbNvThpg8nuw/A6xdzRF9H/4VQ9C2oYBwIYrCC1vujTcgkwbw+s4gUhPQKygH4Y9pCVRg/8YoJiVufZXmRYAd5ORPe6ttMxpCSCXXCZHM9CS9sGXdIzLJpxCeB/dB+ULKuwjA2QRnWsCC6Qy6DGjTr6kIAfV7dxefz1EPkCKYhq+/+ x-ms-office365-filtering-correlation-id: 394b3b32-7728-4294-3221-08d3c1b93414 x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(1601124038)(1601125047);SRVR:MA1IND01HT003; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(432015012)(82015046);SRVR:MA1IND01HT003;BCL:0;PCL:0;RULEID:;SRVR:MA1IND01HT003; x-forefront-prvs: 0031A0FFAF spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: multipart/alternative; boundary="_000_PN1PR01MB012799175BE5BC7010F20B8CCE1E0PN1PR01MB0127INDP_" MIME-Version: 1.0 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-originalarrivaltime: 11 Aug 2016 07:29:22.9744 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-Transport-CrossTenantHeadersStamped: MA1IND01HT003 X-OriginalArrivalTime: 11 Aug 2016 07:29:27.0945 (UTC) FILETIME=[17C45790:01D1F3A2] X-Barracuda-Connect: snt004-omc1s18.hotmail.com[65.55.90.29] X-Barracuda-Start-Time: 1470900568 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12158 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.52 X-Barracuda-Spam-Status: No, SCORE=0.52 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0646, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, PRICES_ARE_AFFORDABLE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31927 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 PRICES_ARE_AFFORDABLE BODY: Message says that prices aren't too expensive 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0646 Custom rule MV0646 --_000_PN1PR01MB012799175BE5BC7010F20B8CCE1E0PN1PR01MB0127INDP_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hello & Good Day! I am Marketing Manager for an international marketing company based in Indi= a. Make your website visible on Search Engines!! Improve your business website ranking!! What this would cost!! Want more clients? If you want your website to appear on first page of Google then please let = me know. We can provide you 1st to 10th position in Google rankings at very affordab= le prices. Email us back to get a full proposal. Best Regards Marketing Manager Note: - If this is something you are interested, please respond to this ema= il. If this is not your interest, don't worry, we will not email you again. --_000_PN1PR01MB012799175BE5BC7010F20B8CCE1E0PN1PR01MB0127INDP_ Content-Type: text/html; charset="us-ascii" Content-ID: <1B54B164C1F04C41A131D77E9D1952D6@INDPRD01.PROD.OUTLOOK.COM> Content-Transfer-Encoding: quoted-printable

H= ello & Good Day!

I= am Marketing Manager for an international marketing company based in India= .

M= ake your website visible on Search Engines!!

I= mprove your business website ranking!!

W= hat this would cost!!

W= ant more clients?

I= f you want your website to appear on first page of Google then please let m= e know.

W= e can provide you 1st to 10t= h position in Google rankings at very affordable prices.

E= mail us back to get a full proposal.

&= nbsp;

&= nbsp; Best Regards

M= arketing Manager 

 

 

Note: - If this is something you are interested, please resp= ond to this email. If this is not your interest, don't worry, we will not e= mail you again.

 

 

--_000_PN1PR01MB012799175BE5BC7010F20B8CCE1E0PN1PR01MB0127INDP_-- From lin.wei15@imperial.ac.uk Thu Aug 11 04:04:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1D7157CA3 for ; Thu, 11 Aug 2016 04:04:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D1AF88F8035 for ; Thu, 11 Aug 2016 02:04:43 -0700 (PDT) X-ASG-Debug-ID: 1470906279-0bf8151be18dc90001-NocioJ Received: from smtp1.cc.ic.ac.uk (smtp1.cc.ic.ac.uk [155.198.5.155]) by cuda.sgi.com with ESMTP id Ltnz0rGDiZKbsOUE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 02:04:40 -0700 (PDT) X-Barracuda-Envelope-From: lin.wei15@imperial.ac.uk X-Barracuda-Effective-Source-IP: smtp1.cc.ic.ac.uk[155.198.5.155] X-Barracuda-Apparent-Source-IP: 155.198.5.155 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=imperial.ac.uk; s=main01; h=In-Reply-To:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date; bh=ZLTY6DKaLNwpv84OcWYm8vMpZB7x5EwKCkCJwMdahZw=; b=Vh73fhPpU4CUO+gMWcogzNdhQB IX/UEP/Xo+ah6KhhLK+kynNraz7Vkrjgsd1GLxgRG8ZAvGwO1mWP3QX/unSOaJfF78q9cPlwh1oN1 ffG5aoodh+12bGMUOc1txQHe9TmunyREzZqtiY2qJDwnZKolTPGSnLNxX3u1GKilvKUE=; Received: from cloud-vm-46-210.doc.ic.ac.uk ([146.169.46.210] helo=ic) by smtp1.cc.ic.ac.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86) (envelope-from ) id 1bXluo-00026i-A7; Thu, 11 Aug 2016 10:04:38 +0100 Date: Thu, 11 Aug 2016 10:04:09 +0100 From: Wei Lin To: Dave Chinner Cc: Wei Lin , xfs@oss.sgi.com Subject: Re: Question on migrating data between PVs in xfs Message-ID: <20160811090409.GA3448@ic> X-ASG-Orig-Subj: Re: Question on migrating data between PVs in xfs References: <20160809145046.GB5583@ic> <20160809223503.GJ19025@dastard> <20160810092313.GA16193@ic> <20160810105639.GR16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160810105639.GR16044@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-IC-MsgID: 1bXluo-00026i-A7 X-Barracuda-Connect: smtp1.cc.ic.ac.uk[155.198.5.155] X-Barracuda-Start-Time: 1470906280 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 518 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31928 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Dave, Now I see your point. Initially I wanted to store the linear concat layout in a special file, read this file during allocation to compute on the fly if an extent falls into a physical volume. But now I do agree that from the perspective of OS engineering, filesystems should not know the underlying layout, at least not in such an "ad-hoc" way. Aligning AGs to physical volumes and applying allocation policy might be the best approach. Thank you very much for the help. Cheers, -- Wei Lin From lin.wei15@imperial.ac.uk Thu Aug 11 04:26:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8E11D7CA3 for ; Thu, 11 Aug 2016 04:26:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C9938F8035 for ; Thu, 11 Aug 2016 02:26:39 -0700 (PDT) X-ASG-Debug-ID: 1470907596-0bf8151be48ed10001-NocioJ Received: from smtp2.cc.ic.ac.uk (smtp2.cc.ic.ac.uk [146.179.32.42]) by cuda.sgi.com with ESMTP id tZk8BX52yhhFGflr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 02:26:37 -0700 (PDT) X-Barracuda-Envelope-From: lin.wei15@imperial.ac.uk X-Barracuda-Effective-Source-IP: smtp2.cc.ic.ac.uk[146.179.32.42] X-Barracuda-Apparent-Source-IP: 146.179.32.42 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=imperial.ac.uk; s=main01; h=In-Reply-To:Content-Transfer-Encoding: Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=Gk0+7cqweykFH5yIGN9vCHRuu5r+OSrJTwC/DKjk9jQ=; b=Syd33SJBcMaBXgTyx8HqBetyYS dEgQ1xpRZ5vdMyCjrYtAXp2uYpHOK3U+aehTgc2HWNyhu0RoiW8VJu6kP6oGFz6cqWwkDpPT3uG/n /mp5cmFGzs2KuE/Vt167q0bSXBrYoKwQR06UZq6YnwxF3J049zcY5oHeopKUTUYAtdzo=; Received: from cloud-vm-46-210.doc.ic.ac.uk ([146.169.46.210] helo=ic) by smtp2.cc.ic.ac.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86) (envelope-from ) id 1bXmG1-0000oF-KX; Thu, 11 Aug 2016 10:26:33 +0100 Date: Thu, 11 Aug 2016 10:26:04 +0100 From: Wei Lin To: Dave Chinner Cc: Emmanuel Florac , Wei Lin , xfs@oss.sgi.com Subject: Re: Question on migrating data between PVs in xfs Message-ID: <20160811092604.GA4615@ic> X-ASG-Orig-Subj: Re: Question on migrating data between PVs in xfs References: <20160809145046.GB5583@ic> <20160809223503.GJ19025@dastard> <20160810092313.GA16193@ic> <20160810105639.GR16044@dastard> <20160810183132.0b9ae8e4@harpe.intellique.com> <20160810215149.GM19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160810215149.GM19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-IC-MsgID: 1bXmG1-0000oF-KX X-Barracuda-Connect: smtp2.cc.ic.ac.uk[146.179.32.42] X-Barracuda-Start-Time: 1470907597 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1163 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31929 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 16-08-11 07:51:49, Dave Chinner wrote: > On Wed, Aug 10, 2016 at 06:31:32PM +0200, Emmanuel Florac wrote: > > Le Wed, 10 Aug 2016 20:56:39 +1000 > > Dave Chinner écrivait: > > > > > Have you lookd at using dm-cache instead of modifying the > > > filesystem? > > > > > > > Or bcache, fcache, or EnhanceIO. So far from my own testing bcache is > > significantly faster and dm-cache by far the slowest of the bunch, but > > bcache needs some more loving (his main developer is busy writing > > some new tiered, caching filesystem instead). > > Yeah, the problem with bcache is that it is effectively an orphaned > driver. If there are obvious and reproducable performance > differentials between bcache and dm-cache, you should bring them to > the attention of the dm developers to see if they can fix them... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com Software like dm-cache and bcache seem to use SSDs merely as caches instead of aggregating the capacity of all devices. However I just found aufs and overlayfs, which conceptually suit the purpose better. Cheers, -- Wei Lin From eflorac@intellique.com Thu Aug 11 05:45:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 745847CA3 for ; Thu, 11 Aug 2016 05:45:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 381B4304039 for ; Thu, 11 Aug 2016 03:45:01 -0700 (PDT) X-ASG-Debug-ID: 1470912298-0bf8151be3968c0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id huU7Jaj4MALKpf0h (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 03:44:58 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Effective-Source-IP: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id E12D0547A2A; Thu, 11 Aug 2016 06:44:57 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail1.g1.pair.com (Postfix) with ESMTPSA id 29775547995; Thu, 11 Aug 2016 06:44:57 -0400 (EDT) Date: Thu, 11 Aug 2016 12:44:59 +0200 From: Emmanuel Florac To: Dave Chinner Cc: Wei Lin , xfs@oss.sgi.com Subject: Re: Question on migrating data between PVs in xfs Message-ID: <20160811124459.57f9a352@harpe.intellique.com> X-ASG-Orig-Subj: Re: Question on migrating data between PVs in xfs In-Reply-To: <20160810215149.GM19025@dastard> References: <20160809145046.GB5583@ic> <20160809223503.GJ19025@dastard> <20160810092313.GA16193@ic> <20160810105639.GR16044@dastard> <20160810183132.0b9ae8e4@harpe.intellique.com> <20160810215149.GM19025@dastard> Organization: Intellique X-Mailer: Claws Mail 3.13.2 (GTK+ 2.24.30; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1470912298 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1421 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31929 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Thu, 11 Aug 2016 07:51:49 +1000 Dave Chinner =C3=A9crivait: > On Wed, Aug 10, 2016 at 06:31:32PM +0200, Emmanuel Florac wrote: > > Le Wed, 10 Aug 2016 20:56:39 +1000 > > Dave Chinner =C3=A9crivait: > > =20 > > > Have you lookd at using dm-cache instead of modifying the > > > filesystem? > > > =20 > >=20 > > Or bcache, fcache, or EnhanceIO. So far from my own testing bcache > > is significantly faster and dm-cache by far the slowest of the > > bunch, but bcache needs some more loving (his main developer is > > busy writing some new tiered, caching filesystem instead). =20 >=20 > Yeah, the problem with bcache is that it is effectively an orphaned > driver. If there are obvious and reproducable performance > differentials between bcache and dm-cache, you should bring them to > the attention of the dm developers to see if they can fix them... Good idea. Well bcache may be orphaned of its main developer, however others still submit quite a lot of stability patches (among them Christoph Hellwig which is also active here IIRC). --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From whissi@gentoo.org Thu Aug 11 07:43:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B616F7CA3 for ; Thu, 11 Aug 2016 07:43:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 87DF98F8035 for ; Thu, 11 Aug 2016 05:43:11 -0700 (PDT) X-ASG-Debug-ID: 1470919386-0bf57c136a585c10001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id doROzdNyNX4otyuq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 05:43:07 -0700 (PDT) X-Barracuda-Envelope-From: whissi@gentoo.org X-Barracuda-Effective-Source-IP: smtp.gentoo.org[140.211.166.183] X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from [IPv6:2003:81:6f37:f112:e0dd:34e9:2242:2c11] (p200300061517B312E0DD34E922422C11.dip0.t-ipconnect.de [IPv6:2003:6:1517:b312:e0dd:34e9:2242:2c11]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: whissi) by smtp.gentoo.org (Postfix) with ESMTPSA id A55E2340B19 for ; Thu, 11 Aug 2016 12:43:05 +0000 (UTC) To: xfs@oss.sgi.com From: Thomas Deutschmann Subject: xfsprogs-4.7.0 are conflicting with glibc's MS_RDONLY definition Message-ID: <2608952f-e6c4-0f20-8f49-818d67896dd3@gentoo.org> X-ASG-Orig-Subj: xfsprogs-4.7.0 are conflicting with glibc's MS_RDONLY definition Date: Thu, 11 Aug 2016 14:42:50 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1470919387 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1556 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Hi, collectd [1] now longer builds against xfsprogs-4.7.0 due to a conflict with MS_RDONLY definition in sys/mount.h by glibc vs exposed kernels header by xfsprogs due to the include of linux/fs.h. Upstream bug: https://github.com/collectd/collectd/issues/1877 Gentoo-Bug: https://bugs.gentoo.org/590998 I am bringing this to your attention to ask if you want to do anything to fix this in xfsprogs or do you consider that as a bug in collectd. Thanks! [1] https://collectd.org/ - -- Regards, Thomas -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.1 iQJ8BAEBCgBmBQJXrHK/XxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9w ZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQzM0M1ODQ4MkM0MDIyOTJEMkUzQzVDMDY5 NzA5RjkwQzNDOTZGRkM4AAoJEJcJ+Qw8lv/IDqoQALTIBw+n+P8ZAW1mksVrY15d PjYFnPl50ZYbm5KXedOdY9iaEzvTG12bAPGm7HGnmURdC/yRcs50JMua6fNWTYi0 r6gwdxijynMmUv0omgp1LDl+d/d7od5DkFZrQ0fP0TUHrbW4D+8FFHETPTWigtk2 YOi1VsGYuRuSflSCWDvUjVeJVjkozYYZO/9Moz7V1Cvaw3ghvGz74AqCdHZDVnKB iCDndcxmNNUBp+ouzrgwJVcQYGBjeAyNfByw4EN5i2doYA/flqP6epgG21y6+YFk h6/ZTCZV68BkXVu6N2VOjMY2GaQC2wPb8CkDxYFqV8dDszb+bI1XJ7vEEMzl3mRp 3LbiK5fATOc6mSSzYyMmqZq2TyLVDnHxsO5agTLlVaOjAufCrADpUD/T7jGgDVnV K4TJ6P+oa0GoYvuCstglwFj2beqpldIQFwOJICNrV7IqpduuNgUG0d+lO19Yws3g uu/2RNd2s7MUqiodEtFfADSm6p5W/Wrdc7tR9O+O5UqlQAJWHz/G8ZjTytZ0eJ+X Gun2bsAsRAirXpqGltgEMFj81O6isKGyAnVLibQRMsAFPJdUrbATF1L8ZK9yrGN0 TM0GC2kvgroNVetT/S1aNw2spTsC8eXe2v+guEa1syzeIXElMASdQSj5BcBDmOv3 ccalRiV+rhJU8/Y+wTO/ =K3bt -----END PGP SIGNATURE----- From hch@lst.de Thu Aug 11 11:03:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 057E57CA1 for ; Thu, 11 Aug 2016 11:03:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BF90C304043 for ; Thu, 11 Aug 2016 09:03:55 -0700 (PDT) X-ASG-Debug-ID: 1470931432-0bf57b369b636d50001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id oAOc5Qki4WQI9ERb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 09:03:53 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 3AA9470686; Thu, 11 Aug 2016 18:03:52 +0200 (CEST) Date: Thu, 11 Aug 2016 18:03:52 +0200 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix bogus space reservation in xfs_iomap_write_allocate Message-ID: <20160811160352.GA23283@lst.de> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix bogus space reservation in xfs_iomap_write_allocate References: <1470245586-14068-1-git-send-email-hch@lst.de> <20160805000354.GD16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805000354.GD16044@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1470931433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1039 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 05, 2016 at 10:03:54AM +1000, Dave Chinner wrote: > I don't think this part of the fix is correct. nres feeds into > args->total which is then used during the AGFL fixup checks. If this > is not set correctly, then we'll select AGs we have enough space in > the AG to fix up the AGFL, but not enough space to allocate all the > BMBT blocks we require. That then leads to ABBA deadlocks on AGF > locks near ENOSPC - see commit dbd5c8c ("xfs: pass total block > res. as total xfs_bmapi_write() parameter") for the full details. I've been going forth and back between both versions and both have tested fine - I couldn't really convince me which one is more correct. > I've been testing a local version of this fix since you pointed out > the problem that still passed nres into xfs_bmapi_write() and I > haven't seen any problems, so I think it is correct to keep nres > here. I'm going to drop this hunk from this patch for the moment in > my tree. Ok, sounds fine. If you want a real resend let me know. From BATV+d7a49962a47fb612189d+4736+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 11 12:10:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 467017CA1 for ; Thu, 11 Aug 2016 12:10:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D2AE98F8040 for ; Thu, 11 Aug 2016 10:10:29 -0700 (PDT) X-ASG-Debug-ID: 1470935425-0bf57c136758dc10001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LMT1MQsuTZ4E1YTX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 11 Aug 2016 10:10:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d7a49962a47fb612189d+4736+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from pat.hitachigst.com ([199.255.44.5] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bXtUu-0001UO-NV; Thu, 11 Aug 2016 17:10:24 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com, peterz@infradead.org Subject: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Date: Thu, 11 Aug 2016 10:10:23 -0700 X-ASG-Orig-Subj: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-Id: <1470935423-12329-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470935425 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 22794 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31937 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This patch drops the XFS-own i_iolock and uses the VFS i_rwsem which recently replaced i_mutex instead. This means we only have to take one looks instead of two in many fast path operations, and we can also shrink the xfs_inode structure. Thanks to the xfs_ilock family there is very little churn as well. There is one major issue with this change though: lockdep currently doesn't have a facility to assert a rw_sempahore is held exclusively, which means we lose the nice ability to assert locking context in XFS. Peter, I think you mentioned this would be fairly easy to add to lockdep and the rw_semaphore code. Any chance to come up with a proof of concept? Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_dir2_readdir.c | 2 - fs/xfs/xfs_file.c | 95 ++++++++++++++++------------------------------- fs/xfs/xfs_icache.c | 6 +-- fs/xfs/xfs_inode.c | 79 ++++++++++++++++----------------------- fs/xfs/xfs_inode.h | 7 +--- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_iops.c | 14 +++---- fs/xfs/xfs_pnfs.c | 7 +--- fs/xfs/xfs_pnfs.h | 4 +- fs/xfs/xfs_super.c | 2 +- fs/xfs/xfs_symlink.c | 7 ++-- 11 files changed, 83 insertions(+), 142 deletions(-) diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index f44f799..7662140 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -676,7 +676,6 @@ xfs_readdir( args.dp = dp; args.geo = dp->i_mount->m_dir_geo; - xfs_ilock(dp, XFS_IOLOCK_SHARED); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_getdents(&args, ctx); else if ((rval = xfs_dir2_isblock(&args, &v))) @@ -685,7 +684,6 @@ xfs_readdir( rval = xfs_dir2_block_getdents(&args, ctx); else rval = xfs_dir2_leaf_getdents(&args, ctx, bufsize); - xfs_iunlock(dp, XFS_IOLOCK_SHARED); return rval; } diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ed95e5b..b604dc7 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -47,40 +47,6 @@ static const struct vm_operations_struct xfs_file_vm_ops; /* - * Locking primitives for read and write IO paths to ensure we consistently use - * and order the inode->i_mutex, ip->i_lock and ip->i_iolock. - */ -static inline void -xfs_rw_ilock( - struct xfs_inode *ip, - int type) -{ - if (type & XFS_IOLOCK_EXCL) - inode_lock(VFS_I(ip)); - xfs_ilock(ip, type); -} - -static inline void -xfs_rw_iunlock( - struct xfs_inode *ip, - int type) -{ - xfs_iunlock(ip, type); - if (type & XFS_IOLOCK_EXCL) - inode_unlock(VFS_I(ip)); -} - -static inline void -xfs_rw_ilock_demote( - struct xfs_inode *ip, - int type) -{ - xfs_ilock_demote(ip, type); - if (type & XFS_IOLOCK_EXCL) - inode_unlock(VFS_I(ip)); -} - -/* * Clear the specified ranges to zero through either the pagecache or DAX. * Holes and unwritten extents will be left as-is as they already are zeroed. */ @@ -279,10 +245,10 @@ xfs_file_dio_aio_read( * IO case of no page cache pages to proceeed concurrently without * serialisation. */ - xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); + xfs_ilock(ip, XFS_IOLOCK_SHARED); if (mapping->nrpages) { - xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); - xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); + xfs_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_ilock(ip, XFS_IOLOCK_EXCL); /* * The generic dio code only flushes the range of the particular @@ -298,7 +264,7 @@ xfs_file_dio_aio_read( if (mapping->nrpages) { ret = filemap_write_and_wait(mapping); if (ret) { - xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); + xfs_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } @@ -311,7 +277,7 @@ xfs_file_dio_aio_read( WARN_ON_ONCE(ret); ret = 0; } - xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); } data = *to; @@ -321,7 +287,7 @@ xfs_file_dio_aio_read( iocb->ki_pos += ret; iov_iter_advance(to, ret); } - xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_iunlock(ip, XFS_IOLOCK_SHARED); file_accessed(iocb->ki_filp); return ret; @@ -344,13 +310,13 @@ xfs_file_dax_read( if (!count) return 0; /* skip atime */ - xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); + xfs_ilock(ip, XFS_IOLOCK_SHARED); ret = dax_do_io(iocb, inode, &data, xfs_get_blocks_direct, NULL, 0); if (ret > 0) { iocb->ki_pos += ret; iov_iter_advance(to, ret); } - xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_iunlock(ip, XFS_IOLOCK_SHARED); file_accessed(iocb->ki_filp); return ret; @@ -366,9 +332,9 @@ xfs_file_buffered_aio_read( trace_xfs_file_buffered_read(ip, iov_iter_count(to), iocb->ki_pos); - xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); + xfs_ilock(ip, XFS_IOLOCK_SHARED); ret = generic_file_read_iter(iocb, to); - xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_iunlock(ip, XFS_IOLOCK_SHARED); return ret; } @@ -429,9 +395,9 @@ xfs_file_splice_read( goto out; } - xfs_rw_ilock(ip, XFS_IOLOCK_SHARED); + xfs_ilock(ip, XFS_IOLOCK_SHARED); ret = generic_file_splice_read(infilp, ppos, pipe, count, flags); - xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED); + xfs_iunlock(ip, XFS_IOLOCK_SHARED); out: if (ret > 0) XFS_STATS_ADD(ip->i_mount, xs_read_bytes, ret); @@ -488,15 +454,18 @@ restart: if (error <= 0) return error; - error = xfs_break_layouts(inode, iolock, true); + error = xfs_break_layouts(inode, iolock); if (error) return error; - /* For changing security info in file_remove_privs() we need i_mutex */ + /* + * For changing security info in file_remove_privs() we need i_rwsem + * exclusively. + */ if (*iolock == XFS_IOLOCK_SHARED && !IS_NOSEC(inode)) { - xfs_rw_iunlock(ip, *iolock); + xfs_iunlock(ip, *iolock); *iolock = XFS_IOLOCK_EXCL; - xfs_rw_ilock(ip, *iolock); + xfs_ilock(ip, *iolock); goto restart; } /* @@ -521,9 +490,9 @@ restart: spin_unlock(&ip->i_flags_lock); if (!drained_dio) { if (*iolock == XFS_IOLOCK_SHARED) { - xfs_rw_iunlock(ip, *iolock); + xfs_iunlock(ip, *iolock); *iolock = XFS_IOLOCK_EXCL; - xfs_rw_ilock(ip, *iolock); + xfs_ilock(ip, *iolock); iov_iter_reexpand(from, count); } /* @@ -630,7 +599,7 @@ xfs_file_dio_aio_write( iolock = XFS_IOLOCK_EXCL; else iolock = XFS_IOLOCK_SHARED; - xfs_rw_ilock(ip, iolock); + xfs_ilock(ip, iolock); /* * Recheck if there are cached pages that need invalidate after we got @@ -638,9 +607,9 @@ xfs_file_dio_aio_write( * we were waiting for the iolock. */ if (mapping->nrpages && iolock == XFS_IOLOCK_SHARED) { - xfs_rw_iunlock(ip, iolock); + xfs_iunlock(ip, iolock); iolock = XFS_IOLOCK_EXCL; - xfs_rw_ilock(ip, iolock); + xfs_ilock(ip, iolock); } ret = xfs_file_aio_write_checks(iocb, from, &iolock); @@ -673,7 +642,7 @@ xfs_file_dio_aio_write( if (unaligned_io) inode_dio_wait(inode); else if (iolock == XFS_IOLOCK_EXCL) { - xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); iolock = XFS_IOLOCK_SHARED; } @@ -696,7 +665,7 @@ xfs_file_dio_aio_write( iov_iter_advance(from, ret); } out: - xfs_rw_iunlock(ip, iolock); + xfs_iunlock(ip, iolock); /* * No fallback to buffered IO on errors for XFS, direct IO will either @@ -730,7 +699,7 @@ xfs_file_dax_write( } else { iolock = XFS_IOLOCK_SHARED; } - xfs_rw_ilock(ip, iolock); + xfs_ilock(ip, iolock); ret = xfs_file_aio_write_checks(iocb, from, &iolock); if (ret) @@ -748,7 +717,7 @@ xfs_file_dax_write( } if (iolock == XFS_IOLOCK_EXCL && !unaligned_io) { - xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); + xfs_ilock_demote(ip, XFS_IOLOCK_EXCL); iolock = XFS_IOLOCK_SHARED; } @@ -762,7 +731,7 @@ xfs_file_dax_write( iov_iter_advance(from, ret); } out: - xfs_rw_iunlock(ip, iolock); + xfs_iunlock(ip, iolock); return ret; } @@ -779,7 +748,7 @@ xfs_file_buffered_aio_write( int enospc = 0; int iolock = XFS_IOLOCK_EXCL; - xfs_rw_ilock(ip, iolock); + xfs_ilock(ip, iolock); ret = xfs_file_aio_write_checks(iocb, from, &iolock); if (ret) @@ -820,7 +789,7 @@ write_retry: current->backing_dev_info = NULL; out: - xfs_rw_iunlock(ip, iolock); + xfs_iunlock(ip, iolock); return ret; } @@ -886,7 +855,7 @@ xfs_file_fallocate( return -EOPNOTSUPP; xfs_ilock(ip, iolock); - error = xfs_break_layouts(inode, &iolock, false); + error = xfs_break_layouts(inode, &iolock); if (error) goto out_unlock; diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index fb39a66..cc5e7b2 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -69,8 +69,6 @@ xfs_inode_alloc( ASSERT(!xfs_isiflocked(ip)); ASSERT(ip->i_ino == 0); - mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); - /* initialise the xfs inode */ ip->i_ino = ino; ip->i_mount = mp; @@ -387,8 +385,8 @@ xfs_iget_cache_hit( xfs_inode_clear_reclaim_tag(pag, ip->i_ino); inode->i_state = I_NEW; - ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); - mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + ASSERT(!rwsem_is_locked(&inode->i_rwsem)); + init_rwsem(&inode->i_rwsem); spin_unlock(&ip->i_flags_lock); spin_unlock(&pag->pag_ici_lock); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e08eaea..e2b94bf 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -118,31 +118,31 @@ xfs_ilock_attr_map_shared( } /* - * The xfs inode contains 3 multi-reader locks: the i_iolock the i_mmap_lock and - * the i_lock. This routine allows various combinations of the locks to be - * obtained. + * In addition to i_rwsem in the VFS inode, the xfs inode contains 2 + * multi-reader locks: i_mmap_lock and the i_lock. This routine allows + * various combinations of the locks to be obtained. * * The 3 locks should always be ordered so that the IO lock is obtained first, * the mmap lock second and the ilock last in order to prevent deadlock. * * Basic locking order: * - * i_iolock -> i_mmap_lock -> page_lock -> i_ilock + * i_rwsem -> i_mmap_lock -> page_lock -> i_ilock * * mmap_sem locking order: * - * i_iolock -> page lock -> mmap_sem + * i_rwsem -> page lock -> mmap_sem * mmap_sem -> i_mmap_lock -> page_lock * * The difference in mmap_sem locking order mean that we cannot hold the * i_mmap_lock over syscall based read(2)/write(2) based IO. These IO paths can * fault in pages during copy in/out (for buffered IO) or require the mmap_sem * in get_user_pages() to map the user pages into the kernel address space for - * direct IO. Similarly the i_iolock cannot be taken inside a page fault because + * direct IO. Similarly the i_rwsem cannot be taken inside a page fault because * page faults already hold the mmap_sem. * * Hence to serialise fully against both syscall and mmap based IO, we need to - * take both the i_iolock and the i_mmap_lock. These locks should *only* be both + * take both the i_rwsem and the i_mmap_lock. These locks should *only* be both * taken in places where we need to invalidate the page cache in a race * free manner (e.g. truncate, hole punch and other extent manipulation * functions). @@ -167,10 +167,13 @@ xfs_ilock( (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0); - if (lock_flags & XFS_IOLOCK_EXCL) - mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); - else if (lock_flags & XFS_IOLOCK_SHARED) - mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); + if (lock_flags & XFS_IOLOCK_EXCL) { + down_write_nested(&VFS_I(ip)->i_rwsem, + XFS_IOLOCK_DEP(lock_flags)); + } else if (lock_flags & XFS_IOLOCK_SHARED) { + down_read_nested(&VFS_I(ip)->i_rwsem, + XFS_IOLOCK_DEP(lock_flags)); + } if (lock_flags & XFS_MMAPLOCK_EXCL) mrupdate_nested(&ip->i_mmaplock, XFS_MMAPLOCK_DEP(lock_flags)); @@ -216,10 +219,10 @@ xfs_ilock_nowait( ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_SUBCLASS_MASK)) == 0); if (lock_flags & XFS_IOLOCK_EXCL) { - if (!mrtryupdate(&ip->i_iolock)) + if (!down_write_trylock(&VFS_I(ip)->i_rwsem)) goto out; } else if (lock_flags & XFS_IOLOCK_SHARED) { - if (!mrtryaccess(&ip->i_iolock)) + if (!down_read_trylock(&VFS_I(ip)->i_rwsem)) goto out; } @@ -247,9 +250,9 @@ out_undo_mmaplock: mrunlock_shared(&ip->i_mmaplock); out_undo_iolock: if (lock_flags & XFS_IOLOCK_EXCL) - mrunlock_excl(&ip->i_iolock); + up_write(&VFS_I(ip)->i_rwsem); else if (lock_flags & XFS_IOLOCK_SHARED) - mrunlock_shared(&ip->i_iolock); + up_read(&VFS_I(ip)->i_rwsem); out: return 0; } @@ -286,9 +289,9 @@ xfs_iunlock( ASSERT(lock_flags != 0); if (lock_flags & XFS_IOLOCK_EXCL) - mrunlock_excl(&ip->i_iolock); + up_write(&VFS_I(ip)->i_rwsem); else if (lock_flags & XFS_IOLOCK_SHARED) - mrunlock_shared(&ip->i_iolock); + up_read(&VFS_I(ip)->i_rwsem); if (lock_flags & XFS_MMAPLOCK_EXCL) mrunlock_excl(&ip->i_mmaplock); @@ -321,7 +324,7 @@ xfs_ilock_demote( if (lock_flags & XFS_MMAPLOCK_EXCL) mrdemote(&ip->i_mmaplock); if (lock_flags & XFS_IOLOCK_EXCL) - mrdemote(&ip->i_iolock); + downgrade_write(&VFS_I(ip)->i_rwsem); trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); } @@ -345,9 +348,11 @@ xfs_isilocked( } if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) { - if (!(lock_flags & XFS_IOLOCK_SHARED)) - return !!ip->i_iolock.mr_writer; - return rwsem_is_locked(&ip->i_iolock.mr_lock); + /* + * XXX: we'd need something like a rwsem_is_write_locked + * helper for the XFS_IOLOCK_EXCL case.. + */ + return rwsem_is_locked(&VFS_I(ip)->i_rwsem); } ASSERT(0); @@ -397,11 +402,7 @@ xfs_lock_inumorder(int lock_mode, int subclass) if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { ASSERT(subclass <= XFS_IOLOCK_MAX_SUBCLASS); - ASSERT(xfs_lockdep_subclass_ok(subclass + - XFS_IOLOCK_PARENT_VAL)); class += subclass << XFS_IOLOCK_SHIFT; - if (lock_mode & XFS_IOLOCK_PARENT) - class += XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT; } if (lock_mode & (XFS_MMAPLOCK_SHARED|XFS_MMAPLOCK_EXCL)) { @@ -453,8 +454,6 @@ xfs_lock_inodes( XFS_ILOCK_EXCL)); ASSERT(!(lock_mode & (XFS_IOLOCK_SHARED | XFS_MMAPLOCK_SHARED | XFS_ILOCK_SHARED))); - ASSERT(!(lock_mode & XFS_IOLOCK_EXCL) || - inodes <= XFS_IOLOCK_MAX_SUBCLASS + 1); ASSERT(!(lock_mode & XFS_MMAPLOCK_EXCL) || inodes <= XFS_MMAPLOCK_MAX_SUBCLASS + 1); ASSERT(!(lock_mode & XFS_ILOCK_EXCL) || @@ -689,7 +688,6 @@ xfs_lookup( if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return -EIO; - xfs_ilock(dp, XFS_IOLOCK_SHARED); error = xfs_dir_lookup(NULL, dp, name, &inum, ci_name); if (error) goto out_unlock; @@ -698,14 +696,12 @@ xfs_lookup( if (error) goto out_free_name; - xfs_iunlock(dp, XFS_IOLOCK_SHARED); return 0; out_free_name: if (ci_name) kmem_free(ci_name->name); out_unlock: - xfs_iunlock(dp, XFS_IOLOCK_SHARED); *ipp = NULL; return error; } @@ -1179,8 +1175,7 @@ xfs_create( if (error) goto out_release_inode; - xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | - XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); + xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); unlock_dp_on_error = true; xfs_defer_init(&dfops, &first_block); @@ -1216,7 +1211,7 @@ xfs_create( * the transaction cancel unlocking dp so don't do it explicitly in the * error path. */ - xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); unlock_dp_on_error = false; error = xfs_dir_createname(tp, dp, name, ip->i_ino, @@ -1289,7 +1284,7 @@ xfs_create( xfs_qm_dqrele(pdqp); if (unlock_dp_on_error) - xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); + xfs_iunlock(dp, XFS_ILOCK_EXCL); return error; } @@ -1430,11 +1425,10 @@ xfs_link( if (error) goto std_return; - xfs_ilock(tdp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, tdp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL); /* * If we are using project inheritance, we only allow hard link @@ -2528,10 +2522,9 @@ xfs_remove( goto std_return; } - xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); /* @@ -2912,12 +2905,6 @@ xfs_rename( * whether the target directory is the same as the source * directory, we can lock from 2 to 4 inodes. */ - if (!new_parent) - xfs_ilock(src_dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); - else - xfs_lock_two_inodes(src_dp, target_dp, - XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); - xfs_lock_inodes(inodes, num_inodes, XFS_ILOCK_EXCL); /* @@ -2925,9 +2912,9 @@ xfs_rename( * we can rely on either trans_commit or trans_cancel to unlock * them. */ - xfs_trans_ijoin(tp, src_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, src_dp, XFS_ILOCK_EXCL); if (new_parent) - xfs_trans_ijoin(tp, target_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, target_dp, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); if (target_ip) xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index e1a411e..dc8806f 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -55,7 +55,6 @@ typedef struct xfs_inode { /* Transaction and locking information. */ struct xfs_inode_log_item *i_itemp; /* logging information */ mrlock_t i_lock; /* inode lock */ - mrlock_t i_iolock; /* inode IO lock */ mrlock_t i_mmaplock; /* inode mmap IO lock */ atomic_t i_pincount; /* inode pin count */ spinlock_t i_flags_lock; /* inode i_flags lock */ @@ -316,7 +315,7 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) * IOLOCK values * * 0-3 subclass value - * 4-7 PARENT subclass values + * 4-7 unused * * MMAPLOCK values * @@ -331,10 +330,8 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) * */ #define XFS_IOLOCK_SHIFT 16 -#define XFS_IOLOCK_PARENT_VAL 4 -#define XFS_IOLOCK_MAX_SUBCLASS (XFS_IOLOCK_PARENT_VAL - 1) +#define XFS_IOLOCK_MAX_SUBCLASS 3 #define XFS_IOLOCK_DEP_MASK 0x000f0000 -#define XFS_IOLOCK_PARENT (XFS_IOLOCK_PARENT_VAL << XFS_IOLOCK_SHIFT) #define XFS_MMAPLOCK_SHIFT 20 #define XFS_MMAPLOCK_NUMORDER 0 diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 96a70fd..29e0471 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -639,7 +639,7 @@ xfs_ioc_space( return error; xfs_ilock(ip, iolock); - error = xfs_break_layouts(inode, &iolock, false); + error = xfs_break_layouts(inode, &iolock); if (error) goto out_unlock; diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ab820f8..36ac28c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -953,15 +953,13 @@ xfs_vn_setattr( if (iattr->ia_valid & ATTR_SIZE) { uint iolock = XFS_IOLOCK_EXCL; - xfs_ilock(ip, iolock); - error = xfs_break_layouts(d_inode(dentry), &iolock, true); - if (!error) { - xfs_ilock(ip, XFS_MMAPLOCK_EXCL); - iolock |= XFS_MMAPLOCK_EXCL; + error = xfs_break_layouts(d_inode(dentry), &iolock); + if (error) + return error; - error = xfs_setattr_size(ip, iattr); - } - xfs_iunlock(ip, iolock); + xfs_ilock(ip, XFS_MMAPLOCK_EXCL); + error = xfs_setattr_size(ip, iattr); + xfs_iunlock(ip, XFS_MMAPLOCK_EXCL); } else { error = xfs_setattr_nonsize(ip, iattr, 0); } diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index 0f14b2e..94c8faa 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -32,8 +32,7 @@ int xfs_break_layouts( struct inode *inode, - uint *iolock, - bool with_imutex) + uint *iolock) { struct xfs_inode *ip = XFS_I(inode); int error; @@ -42,12 +41,8 @@ xfs_break_layouts( while ((error = break_layout(inode, false) == -EWOULDBLOCK)) { xfs_iunlock(ip, *iolock); - if (with_imutex && (*iolock & XFS_IOLOCK_EXCL)) - inode_unlock(inode); error = break_layout(inode, true); *iolock = XFS_IOLOCK_EXCL; - if (with_imutex) - inode_lock(inode); xfs_ilock(ip, *iolock); } diff --git a/fs/xfs/xfs_pnfs.h b/fs/xfs/xfs_pnfs.h index e8339f7..b587cb9 100644 --- a/fs/xfs/xfs_pnfs.h +++ b/fs/xfs/xfs_pnfs.h @@ -8,10 +8,10 @@ int xfs_fs_map_blocks(struct inode *inode, loff_t offset, u64 length, int xfs_fs_commit_blocks(struct inode *inode, struct iomap *maps, int nr_maps, struct iattr *iattr); -int xfs_break_layouts(struct inode *inode, uint *iolock, bool with_imutex); +int xfs_break_layouts(struct inode *inode, uint *iolock); #else static inline int -xfs_break_layouts(struct inode *inode, uint *iolock, bool with_imutex) +xfs_break_layouts(struct inode *inode, uint *iolock) { return 0; } diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 24ef83e..f32b95e 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -939,7 +939,7 @@ xfs_fs_destroy_inode( trace_xfs_destroy_inode(ip); - ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); + ASSERT(!rwsem_is_locked(&inode->i_rwsem)); XFS_STATS_INC(ip->i_mount, vn_rele); XFS_STATS_INC(ip->i_mount, vn_remove); diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 58142ae..f2cb45e 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -238,8 +238,7 @@ xfs_symlink( if (error) goto out_release_inode; - xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | - XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); + xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); unlock_dp_on_error = true; /* @@ -287,7 +286,7 @@ xfs_symlink( * the transaction cancel unlocking dp so don't do it explicitly in the * error path. */ - xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); unlock_dp_on_error = false; /* @@ -412,7 +411,7 @@ out_release_inode: xfs_qm_dqrele(pdqp); if (unlock_dp_on_error) - xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); + xfs_iunlock(dp, XFS_ILOCK_EXCL); return error; } -- 2.1.4 From bfoster@redhat.com Thu Aug 11 12:11:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E8F6C7CA1 for ; Thu, 11 Aug 2016 12:11:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 912E4304051 for ; Thu, 11 Aug 2016 10:11:11 -0700 (PDT) X-ASG-Debug-ID: 1470935469-0bf8151be4a6520001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DcnKkxZslCn8EdC9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 10:11:10 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BEFDC81254 for ; Thu, 11 Aug 2016 17:11:09 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-69.bos.redhat.com [10.18.41.69]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7BHB9Ti003828 for ; Thu, 11 Aug 2016 13:11:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1235B120194; Thu, 11 Aug 2016 13:11:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: don't warn on buffers not being recovered due to LSN Date: Thu, 11 Aug 2016 13:11:05 -0400 X-ASG-Orig-Subj: [PATCH 3/5] xfs: don't warn on buffers not being recovered due to LSN Message-Id: <1470935467-52772-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1470935467-52772-1-git-send-email-bfoster@redhat.com> References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 11 Aug 2016 17:11:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470935470 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6191 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The log recovery buffer validation function is invoked in cases where a buffer update may be skipped due to LSN ordering. If the validation function happens to come across directory conversion situations (e.g., a dir3 block to data conversion), it may warn about seeing a buffer log format of one type and a buffer with a magic number of another. This warning is not valid as the buffer update is ultimately skipped. This is indicated by a current_lsn of NULLCOMMITLSN provided by the caller. As such, update xlog_recover_validate_buf_type() to only warn in such cases when a buffer update is expected. XXX: other issues here? better to not validate in such cases? Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 59 ++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 283bb7e..cc46db7 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2367,6 +2367,7 @@ xlog_recover_validate_buf_type( __uint32_t magic32; __uint16_t magic16; __uint16_t magicda; + char *warnmsg = NULL; /* * We can only do post recovery validation on items on CRC enabled @@ -2405,31 +2406,27 @@ xlog_recover_validate_buf_type( bp->b_ops = &xfs_rmapbt_buf_ops; break; default: - xfs_warn(mp, "Bad btree block magic!"); - ASSERT(0); + warnmsg = "Bad btree block magic!"; break; } break; case XFS_BLFT_AGF_BUF: if (magic32 != XFS_AGF_MAGIC) { - xfs_warn(mp, "Bad AGF block magic!"); - ASSERT(0); + warnmsg = "Bad AGF block magic!"; break; } bp->b_ops = &xfs_agf_buf_ops; break; case XFS_BLFT_AGFL_BUF: if (magic32 != XFS_AGFL_MAGIC) { - xfs_warn(mp, "Bad AGFL block magic!"); - ASSERT(0); + warnmsg = "Bad AGFL block magic!"; break; } bp->b_ops = &xfs_agfl_buf_ops; break; case XFS_BLFT_AGI_BUF: if (magic32 != XFS_AGI_MAGIC) { - xfs_warn(mp, "Bad AGI block magic!"); - ASSERT(0); + warnmsg = "Bad AGI block magic!"; break; } bp->b_ops = &xfs_agi_buf_ops; @@ -2439,8 +2436,7 @@ xlog_recover_validate_buf_type( case XFS_BLFT_GDQUOT_BUF: #ifdef CONFIG_XFS_QUOTA if (magic16 != XFS_DQUOT_MAGIC) { - xfs_warn(mp, "Bad DQUOT block magic!"); - ASSERT(0); + warnmsg = "Bad DQUOT block magic!"; break; } bp->b_ops = &xfs_dquot_buf_ops; @@ -2452,16 +2448,14 @@ xlog_recover_validate_buf_type( break; case XFS_BLFT_DINO_BUF: if (magic16 != XFS_DINODE_MAGIC) { - xfs_warn(mp, "Bad INODE block magic!"); - ASSERT(0); + warnmsg = "Bad INODE block magic!"; break; } bp->b_ops = &xfs_inode_buf_ops; break; case XFS_BLFT_SYMLINK_BUF: if (magic32 != XFS_SYMLINK_MAGIC) { - xfs_warn(mp, "Bad symlink block magic!"); - ASSERT(0); + warnmsg = "Bad symlink block magic!"; break; } bp->b_ops = &xfs_symlink_buf_ops; @@ -2469,8 +2463,7 @@ xlog_recover_validate_buf_type( case XFS_BLFT_DIR_BLOCK_BUF: if (magic32 != XFS_DIR2_BLOCK_MAGIC && magic32 != XFS_DIR3_BLOCK_MAGIC) { - xfs_warn(mp, "Bad dir block magic!"); - ASSERT(0); + warnmsg = "Bad dir block magic!"; break; } bp->b_ops = &xfs_dir3_block_buf_ops; @@ -2478,8 +2471,7 @@ xlog_recover_validate_buf_type( case XFS_BLFT_DIR_DATA_BUF: if (magic32 != XFS_DIR2_DATA_MAGIC && magic32 != XFS_DIR3_DATA_MAGIC) { - xfs_warn(mp, "Bad dir data magic!"); - ASSERT(0); + warnmsg = "Bad dir data magic!"; break; } bp->b_ops = &xfs_dir3_data_buf_ops; @@ -2487,8 +2479,7 @@ xlog_recover_validate_buf_type( case XFS_BLFT_DIR_FREE_BUF: if (magic32 != XFS_DIR2_FREE_MAGIC && magic32 != XFS_DIR3_FREE_MAGIC) { - xfs_warn(mp, "Bad dir3 free magic!"); - ASSERT(0); + warnmsg = "Bad dir3 free magic!"; break; } bp->b_ops = &xfs_dir3_free_buf_ops; @@ -2496,8 +2487,7 @@ xlog_recover_validate_buf_type( case XFS_BLFT_DIR_LEAF1_BUF: if (magicda != XFS_DIR2_LEAF1_MAGIC && magicda != XFS_DIR3_LEAF1_MAGIC) { - xfs_warn(mp, "Bad dir leaf1 magic!"); - ASSERT(0); + warnmsg = "Bad dir leaf1 magic!"; break; } bp->b_ops = &xfs_dir3_leaf1_buf_ops; @@ -2505,8 +2495,7 @@ xlog_recover_validate_buf_type( case XFS_BLFT_DIR_LEAFN_BUF: if (magicda != XFS_DIR2_LEAFN_MAGIC && magicda != XFS_DIR3_LEAFN_MAGIC) { - xfs_warn(mp, "Bad dir leafn magic!"); - ASSERT(0); + warnmsg = "Bad dir leafn magic!"; break; } bp->b_ops = &xfs_dir3_leafn_buf_ops; @@ -2514,8 +2503,7 @@ xlog_recover_validate_buf_type( case XFS_BLFT_DA_NODE_BUF: if (magicda != XFS_DA_NODE_MAGIC && magicda != XFS_DA3_NODE_MAGIC) { - xfs_warn(mp, "Bad da node magic!"); - ASSERT(0); + warnmsg = "Bad da node magic!"; break; } bp->b_ops = &xfs_da3_node_buf_ops; @@ -2523,24 +2511,21 @@ xlog_recover_validate_buf_type( case XFS_BLFT_ATTR_LEAF_BUF: if (magicda != XFS_ATTR_LEAF_MAGIC && magicda != XFS_ATTR3_LEAF_MAGIC) { - xfs_warn(mp, "Bad attr leaf magic!"); - ASSERT(0); + warnmsg = "Bad attr leaf magic!"; break; } bp->b_ops = &xfs_attr3_leaf_buf_ops; break; case XFS_BLFT_ATTR_RMT_BUF: if (magic32 != XFS_ATTR3_RMT_MAGIC) { - xfs_warn(mp, "Bad attr remote magic!"); - ASSERT(0); + warnmsg = "Bad attr remote magic!"; break; } bp->b_ops = &xfs_attr3_rmt_buf_ops; break; case XFS_BLFT_SB_BUF: if (magic32 != XFS_SB_MAGIC) { - xfs_warn(mp, "Bad SB block magic!"); - ASSERT(0); + warnmsg = "Bad SB block magic!"; break; } bp->b_ops = &xfs_sb_buf_ops; @@ -2557,6 +2542,16 @@ xlog_recover_validate_buf_type( xfs_blft_from_flags(buf_f)); break; } + + /* + * A NULL current LSN indicates the buffer update is skipped due to LSN + * ordering. Don't warn in such cases, we skip the update for a reason + * (it's no longer valid)! + */ + if (warnmsg && current_lsn != NULLCOMMITLSN) { + xfs_warn(mp, warnmsg); + ASSERT(0); + } } /* -- 2.5.5 From bfoster@redhat.com Thu Aug 11 12:11:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2561A7CAE for ; Thu, 11 Aug 2016 12:11:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E1E818F8050 for ; Thu, 11 Aug 2016 10:11:11 -0700 (PDT) X-ASG-Debug-ID: 1470935469-0bf57b369c6386b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id p7KWbBIZeQmmICjP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 10:11:10 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 95E2B8553E for ; Thu, 11 Aug 2016 17:11:09 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-69.bos.redhat.com [10.18.41.69]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7BHB94A009725 for ; Thu, 11 Aug 2016 13:11:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D164B1200A6; Thu, 11 Aug 2016 13:11:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: pass current lsn to log recovery buffer validation Date: Thu, 11 Aug 2016 13:11:04 -0400 X-ASG-Orig-Subj: [PATCH 2/5] xfs: pass current lsn to log recovery buffer validation Message-Id: <1470935467-52772-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1470935467-52772-1-git-send-email-bfoster@redhat.com> References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 11 Aug 2016 17:11:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470935470 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2134 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The current LSN must be available to the buffer validation function to provide the ability to update the metadata LSN of the buffer. Pass the current_lsn value down to xlog_recover_validate_buf_type() in preparation. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 97a0af9..283bb7e 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2360,7 +2360,8 @@ static void xlog_recover_validate_buf_type( struct xfs_mount *mp, struct xfs_buf *bp, - xfs_buf_log_format_t *buf_f) + xfs_buf_log_format_t *buf_f, + xfs_lsn_t current_lsn) { struct xfs_da_blkinfo *info = bp->b_addr; __uint32_t magic32; @@ -2569,7 +2570,8 @@ xlog_recover_do_reg_buffer( struct xfs_mount *mp, xlog_recover_item_t *item, struct xfs_buf *bp, - xfs_buf_log_format_t *buf_f) + xfs_buf_log_format_t *buf_f, + xfs_lsn_t current_lsn) { int i; int bit; @@ -2642,7 +2644,7 @@ xlog_recover_do_reg_buffer( /* Shouldn't be any more regions */ ASSERT(i == item->ri_total); - xlog_recover_validate_buf_type(mp, bp, buf_f); + xlog_recover_validate_buf_type(mp, bp, buf_f, current_lsn); } /* @@ -2685,7 +2687,7 @@ xlog_recover_do_dquot_buffer( if (log->l_quotaoffs_flag & type) return false; - xlog_recover_do_reg_buffer(mp, item, bp, buf_f); + xlog_recover_do_reg_buffer(mp, item, bp, buf_f, NULLCOMMITLSN); return true; } @@ -2773,7 +2775,7 @@ xlog_recover_buffer_pass2( */ lsn = xlog_recover_get_buf_lsn(mp, bp); if (lsn && lsn != -1 && XFS_LSN_CMP(lsn, current_lsn) >= 0) { - xlog_recover_validate_buf_type(mp, bp, buf_f); + xlog_recover_validate_buf_type(mp, bp, buf_f, NULLCOMMITLSN); goto out_release; } @@ -2789,7 +2791,7 @@ xlog_recover_buffer_pass2( if (!dirty) goto out_release; } else { - xlog_recover_do_reg_buffer(mp, item, bp, buf_f); + xlog_recover_do_reg_buffer(mp, item, bp, buf_f, current_lsn); } /* -- 2.5.5 From bfoster@redhat.com Thu Aug 11 12:11:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 052057CA6 for ; Thu, 11 Aug 2016 12:11:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BC138304043 for ; Thu, 11 Aug 2016 10:11:11 -0700 (PDT) X-ASG-Debug-ID: 1470935469-0bf57b369d6386b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AjKxIAqLuXHneOBd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 10:11:10 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9216246203 for ; Thu, 11 Aug 2016 17:11:09 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-69.bos.redhat.com [10.18.41.69]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7BHB9a7008725 for ; Thu, 11 Aug 2016 13:11:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 95F561201B5; Thu, 11 Aug 2016 13:11:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/5] fix log recovery for v5 superblocks Date: Thu, 11 Aug 2016 13:11:02 -0400 X-ASG-Orig-Subj: [PATCH 0/5] fix log recovery for v5 superblocks Message-Id: <1470935467-52772-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 11 Aug 2016 17:11:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470935470 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2795 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This series addresses a problem with log recovery on v5 superblocks where log recovery doesn't update the metadata LSN of buffers it writes out. The v5 superblock metadata LSN recovery ordering logic helps prevent transient corruption states and works fine in most cases. Since recovery doesn't update the metadata LSN of buffers it writes out, however, it introduces the possibility of ordering problems if the recovery happens to repeat from the beginning (e.g., system crash after recovery I/O has completed but before the log tail is pushed forward). This tends to manifest as reports of directory corruption during log recovery and commonly reproduces in situations where a system is restarted frequently (e.g., constant/frequent reboot tests). It can be reproduced fairly easily on demand by running fsstress in a simple (non-log forcing) shutdown loop, e.g.: while [ true ]; do fsstress -d -p 4 & sleep $((RANDOM % 5)) xfs_io -xc shutdown umount mount || break done The problem is that the log attempts to replay a buffer update that is no longer valid due to subsequent, already replayed updates. This results in a corruption error when, in fact, the filesystem is perfectly fine. The problem is addressed by updating the metadata LSN of buffers submitted for I/O by log recovery. This bit is implemented in patch 4. Updating metadata LSNs in this manner uncovered another issue in which log recovery would incorrectly skip modifications from independent transactions if they happen to share an LSN with a previous transaction that modified the same buffer (which had already updated the LSN). This particular problem is addressed in patch 2, which modifies log recovery to submit buffers on current LSN boundaries rather than transaction boundaries. The remaining patches fix up some minor issues, refactor a bit and add some tracepoints. This has survived a single xfstests run so far but still requires more regression testing. It has also survived several thousand iterations of a shutdown test similar to the above that normally reproduces problems within tens of iterations (xfstests test tbd). Brian Brian Foster (5): xfs: rework log recovery to submit buffers on LSN boundaries xfs: pass current lsn to log recovery buffer validation xfs: don't warn on buffers not being recovered due to LSN xfs: update metadata LSN in buffers during log recovery xfs: log recovery tracepoints to track current lsn and buffer submission fs/xfs/xfs_log_priv.h | 3 +- fs/xfs/xfs_log_recover.c | 188 +++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_trace.h | 31 +++++++- 3 files changed, 163 insertions(+), 59 deletions(-) -- 2.5.5 From bfoster@redhat.com Thu Aug 11 12:11:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 022A17CA1 for ; Thu, 11 Aug 2016 12:11:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BB09C304043 for ; Thu, 11 Aug 2016 10:11:12 -0700 (PDT) X-ASG-Debug-ID: 1470935470-0bf57c136958dc60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DA5ikwVOXHHNM5EY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 10:11:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C447D3DEF0 for ; Thu, 11 Aug 2016 17:11:10 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-69.bos.redhat.com [10.18.41.69]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7BHB99a003834 for ; Thu, 11 Aug 2016 13:11:10 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 24E0412116B; Thu, 11 Aug 2016 13:11:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: update metadata LSN in buffers during log recovery Date: Thu, 11 Aug 2016 13:11:06 -0400 X-ASG-Orig-Subj: [PATCH 4/5] xfs: update metadata LSN in buffers during log recovery Message-Id: <1470935467-52772-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1470935467-52772-1-git-send-email-bfoster@redhat.com> References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 11 Aug 2016 17:11:10 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470935471 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4453 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Log recovery is currently broken for v5 superblocks in that it never updates the metadata LSN of buffers written out during recovery. The metadata LSN is recorded in various bits of metadata to provide recovery ordering criteria that prevents transient corruption states reported by buffer write verifiers. Without such ordering logic, buffer updates can be replayed out of order and lead to false positive transient corruption states. This is generally not a corruption vector on its own, but corruption detection shuts down the filesystem and ultimately prevents a mount if it occurs during log recovery. This requires an xfs_repair run that clears the log and potentially loses filesystem updates. This problem is avoided in most cases as metadata writes during normal filesystem operation update the metadata LSN appropriately. The problem with log recovery not updating metadata LSNs manifests if the system happens to crash shortly after log recovery itself. In this scenario, it is possible for log recovery to complete all metadata I/O such that the filesystem is consistent. If a crash occurs after that point but before the log tail is pushed forward by subsequent operations, however, the next mount performs the same log recovery over again. If a buffer is updated multiple times in the dirty range of the log, an earlier update in the log might not be valid based on the current state of the associated buffer after all of the updates in the log had been replayed (before the previous crash). If a verifier happens to detect such a problem, the filesystem claims corruption and immediately shuts down. This commonly manifests in practice as directory block verifier failures such as the following, likely due to directory verifiers being particularly detailed in their checks as compared to most others: ... Mounting V5 Filesystem XFS (dm-0): Starting recovery (logdev: internal) XFS (dm-0): Internal error XFS_WANT_CORRUPTED_RETURN at line ... of \ file fs/xfs/libxfs/xfs_dir2_data.c. Caller xfs_dir3_data_verify ... ... Update log recovery to update the metadata LSN of recovered buffers. Since metadata LSNs are already updated by write verifer functions via attached log items, attach a dummy log item to the buffer during validation and explicitly set the LSN of the current transaction. This ensures that the metadata LSN of a buffer is updated based on whether the recovery I/O actually completes, and if so, that subsequent recovery attempts identify that the buffer is already up to date with respect to the current transaction. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index cc46db7..0c0b743 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -44,6 +44,7 @@ #include "xfs_error.h" #include "xfs_dir2.h" #include "xfs_rmap_item.h" +#include "xfs_buf_item.h" #define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) @@ -381,6 +382,15 @@ xlog_recover_iodone( SHUTDOWN_META_IO_ERROR); } } + + /* + * On v5 supers, a bli could be attached to update the metadata LSN. + * Clean it up. + */ + if (bp->b_fspriv) + xfs_buf_item_relse(bp); + ASSERT(bp->b_fspriv == NULL); + bp->b_iodone = NULL; xfs_buf_ioend(bp); } @@ -2552,6 +2562,27 @@ xlog_recover_validate_buf_type( xfs_warn(mp, warnmsg); ASSERT(0); } + + /* + * We must update the metadata LSN of the buffer as it is written out to + * ensure that older transactions never replay over this one and corrupt + * the buffer. This can occur if log recovery is interrupted at some + * point after the current transaction completes, at which point a + * subsequent mount starts recovery from the beginning. + * + * Write verifiers update the metadata LSN from log items attached to + * the buffer. Therefore, initialize a bli purely to carry the LSN to + * the verifier. We'll clean it up in our ->iodone() callback. + */ + if (bp->b_ops && current_lsn != NULLCOMMITLSN) { + struct xfs_buf_log_item *bip; + + ASSERT(!bp->b_iodone || bp->b_iodone == xlog_recover_iodone); + bp->b_iodone = xlog_recover_iodone; + xfs_buf_item_init(bp, mp); + bip = bp->b_fspriv; + bip->bli_item.li_lsn = current_lsn; + } } /* -- 2.5.5 From bfoster@redhat.com Thu Aug 11 12:11:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8F8BF7CB0 for ; Thu, 11 Aug 2016 12:11:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5BB66304043 for ; Thu, 11 Aug 2016 10:11:11 -0700 (PDT) X-ASG-Debug-ID: 1470935469-0bf57c136a58dc60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xIBTboTwWsXtQbNE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 10:11:10 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C5AE346211 for ; Thu, 11 Aug 2016 17:11:09 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-69.bos.redhat.com [10.18.41.69]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7BHB92X005923 for ; Thu, 11 Aug 2016 13:11:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1E9E71204F9; Thu, 11 Aug 2016 13:11:08 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: log recovery tracepoints to track current lsn and buffer submission Date: Thu, 11 Aug 2016 13:11:07 -0400 X-ASG-Orig-Subj: [PATCH 5/5] xfs: log recovery tracepoints to track current lsn and buffer submission Message-Id: <1470935467-52772-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1470935467-52772-1-git-send-email-bfoster@redhat.com> References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 11 Aug 2016 17:11:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470935470 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4211 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Log recovery has particular rules around buffer submission along with tricky corner cases where independent transactions can share an LSN. As such, it can be difficult to follow when/why buffers are submitted during recovery. Add a couple tracepoints to post the current LSN of a record when a new record is being processed and when a buffer is being skipped due to LSN ordering. Also, update the recover item class to include the LSN of the current transaction for the item being processed. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 2 ++ fs/xfs/xfs_trace.h | 31 +++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 0c0b743..ad63ec0 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2801,6 +2801,7 @@ xlog_recover_buffer_pass2( */ lsn = xlog_recover_get_buf_lsn(mp, bp); if (lsn && lsn != -1 && XFS_LSN_CMP(lsn, current_lsn) >= 0) { + trace_xfs_log_recover_buf_skip(log, buf_f); xlog_recover_validate_buf_type(mp, bp, buf_f, NULLCOMMITLSN); goto out_release; } @@ -4316,6 +4317,7 @@ xlog_recover_process_data( if (xlog_header_check_recover(log->l_mp, rhead)) return -EIO; + trace_xfs_log_recover_record(log, rhead, pass); while ((dp < end) && num_logops) { ohead = (struct xlog_op_header *)dp; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 551b7e2..d5a8abd 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1985,6 +1985,29 @@ DEFINE_EVENT(xfs_swap_extent_class, name, \ DEFINE_SWAPEXT_EVENT(xfs_swap_extent_before); DEFINE_SWAPEXT_EVENT(xfs_swap_extent_after); +TRACE_EVENT(xfs_log_recover_record, + TP_PROTO(struct xlog *log, struct xlog_rec_header *rhead, int pass), + TP_ARGS(log, rhead, pass), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_lsn_t, lsn) + __field(int, len) + __field(int, num_logops) + __field(int, pass) + ), + TP_fast_assign( + __entry->dev = log->l_mp->m_super->s_dev; + __entry->lsn = be64_to_cpu(rhead->h_lsn); + __entry->len = be32_to_cpu(rhead->h_len); + __entry->num_logops = be32_to_cpu(rhead->h_num_logops); + __entry->pass = pass; + ), + TP_printk("dev %d:%d lsn 0x%llx len 0x%x num_logops 0x%x pass %d", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->lsn, __entry->len, __entry->num_logops, + __entry->pass) +) + DECLARE_EVENT_CLASS(xfs_log_recover_item_class, TP_PROTO(struct xlog *log, struct xlog_recover *trans, struct xlog_recover_item *item, int pass), @@ -1993,6 +2016,7 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class, __field(dev_t, dev) __field(unsigned long, item) __field(xlog_tid_t, tid) + __field(xfs_lsn_t, lsn) __field(int, type) __field(int, pass) __field(int, count) @@ -2002,15 +2026,17 @@ DECLARE_EVENT_CLASS(xfs_log_recover_item_class, __entry->dev = log->l_mp->m_super->s_dev; __entry->item = (unsigned long)item; __entry->tid = trans->r_log_tid; + __entry->lsn = trans->r_lsn; __entry->type = ITEM_TYPE(item); __entry->pass = pass; __entry->count = item->ri_cnt; __entry->total = item->ri_total; ), - TP_printk("dev %d:%d trans 0x%x, pass %d, item 0x%p, item type %s " - "item region count/total %d/%d", + TP_printk("dev %d:%d tid 0x%x lsn 0x%llx, pass %d, item 0x%p, " + "item type %s item region count/total %d/%d", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->tid, + __entry->lsn, __entry->pass, (void *)__entry->item, __print_symbolic(__entry->type, XFS_LI_TYPE_DESC), @@ -2069,6 +2095,7 @@ DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel_add); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_cancel_ref_inc); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_recover); +DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_skip); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_inode_buf); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_reg_buf); DEFINE_LOG_RECOVER_BUF_ITEM(xfs_log_recover_buf_dquot_buf); -- 2.5.5 From bfoster@redhat.com Thu Aug 11 12:11:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D0D87CB7 for ; Thu, 11 Aug 2016 12:11:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E31A8AC003 for ; Thu, 11 Aug 2016 10:11:11 -0700 (PDT) X-ASG-Debug-ID: 1470935469-0bf8151be1a6510001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9u2TsQTKX1wq5l0f (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 10:11:10 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B2568821C7 for ; Thu, 11 Aug 2016 17:11:09 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-69.bos.redhat.com [10.18.41.69]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7BHB9Qr008727 for ; Thu, 11 Aug 2016 13:11:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 03B711202A2; Thu, 11 Aug 2016 13:11:07 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: rework log recovery to submit buffers on LSN boundaries Date: Thu, 11 Aug 2016 13:11:03 -0400 X-ASG-Orig-Subj: [PATCH 1/5] xfs: rework log recovery to submit buffers on LSN boundaries Message-Id: <1470935467-52772-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1470935467-52772-1-git-send-email-bfoster@redhat.com> References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 11 Aug 2016 17:11:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470935470 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7804 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The fix to log recovery to update the metadata LSN in recovered buffers introduces the requirement that a buffer is submitted only once per current LSN. Log recovery currently submits buffers on transaction boundaries. This is not sufficient as the abstraction between log records and transactions allows for various scenarios where multiple transactions can share the same current LSN. If independent transactions share an LSN and both modify the same buffer, log recovery can incorrectly skip updates and leave the filesystem in an inconsisent state. In preparation for proper metadata LSN updates during log recovery, update log recovery to submit buffers for write on LSN change boundaries rather than transaction boundaries. Explicitly track the current LSN in a new struct xlog field to handle the various corner cases of when the current LSN may or may not change. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_priv.h | 3 +- fs/xfs/xfs_log_recover.c | 82 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 765f084..2b6eec5 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -413,7 +413,8 @@ struct xlog { /* log record crc error injection factor */ uint32_t l_badcrc_factor; #endif - + /* log recovery lsn tracking (for buffer submission */ + xfs_lsn_t l_recovery_lsn; }; #define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index e8638fd..97a0af9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3846,14 +3846,13 @@ STATIC int xlog_recover_commit_trans( struct xlog *log, struct xlog_recover *trans, - int pass) + int pass, + struct list_head *buffer_list) { int error = 0; - int error2; int items_queued = 0; struct xlog_recover_item *item; struct xlog_recover_item *next; - LIST_HEAD (buffer_list); LIST_HEAD (ra_list); LIST_HEAD (done_list); @@ -3876,7 +3875,7 @@ xlog_recover_commit_trans( items_queued++; if (items_queued >= XLOG_RECOVER_COMMIT_QUEUE_MAX) { error = xlog_recover_items_pass2(log, trans, - &buffer_list, &ra_list); + buffer_list, &ra_list); list_splice_tail_init(&ra_list, &done_list); items_queued = 0; } @@ -3894,15 +3893,14 @@ out: if (!list_empty(&ra_list)) { if (!error) error = xlog_recover_items_pass2(log, trans, - &buffer_list, &ra_list); + buffer_list, &ra_list); list_splice_tail_init(&ra_list, &done_list); } if (!list_empty(&done_list)) list_splice_init(&done_list, &trans->r_itemq); - error2 = xfs_buf_delwri_submit(&buffer_list); - return error ? error : error2; + return error; } STATIC void @@ -4085,7 +4083,8 @@ xlog_recovery_process_trans( char *dp, unsigned int len, unsigned int flags, - int pass) + int pass, + struct list_head *buffer_list) { int error = 0; bool freeit = false; @@ -4109,7 +4108,8 @@ xlog_recovery_process_trans( error = xlog_recover_add_to_cont_trans(log, trans, dp, len); break; case XLOG_COMMIT_TRANS: - error = xlog_recover_commit_trans(log, trans, pass); + error = xlog_recover_commit_trans(log, trans, pass, + buffer_list); /* success or fail, we are now done with this transaction. */ freeit = true; break; @@ -4191,10 +4191,12 @@ xlog_recover_process_ophdr( struct xlog_op_header *ohead, char *dp, char *end, - int pass) + int pass, + struct list_head *buffer_list) { struct xlog_recover *trans; unsigned int len; + int error; /* Do we understand who wrote this op? */ if (ohead->oh_clientid != XFS_TRANSACTION && @@ -4221,8 +4223,39 @@ xlog_recover_process_ophdr( return 0; } + /* + * Recovered buffers are submitted for I/O on current LSN change + * boundaries. This is necessary to accommodate metadata LSN ordering + * rules of v5 superblock filesystems. + * + * Store the new current LSN in l_recovery_lsn as we cannot rely on + * either record boundaries or transaction boundaries alone to track LSN + * changes. This has several contributing factors: + * + * - Metadata LSNs are updated at buffer submission time. Thus, buffers + * can only be submitted safely once per current LSN value. + * - The current LSN is defined as the start cycle/block of the first + * record in which a transaction appears. + * - A record can hold multiple transactions. Thus, a transaction change + * does not guarantee a change in current LSN. + * - A transaction can span multiple records. Thus, a record change does + * not guarantee a change in current LSN. Consider the case where a + * record holds one small transaction and a subsequent that carries + * over to the next record. Both transactions share the same LSN as + * per the definition of the current LSN. + * + * In summary, this means we must track the current LSN independently + * and submit buffers for the previous LSN only when it has changed. + */ + if (log->l_recovery_lsn != trans->r_lsn) { + error = xfs_buf_delwri_submit(buffer_list); + if (error) + return error; + log->l_recovery_lsn = trans->r_lsn; + } + return xlog_recovery_process_trans(log, trans, dp, len, - ohead->oh_flags, pass); + ohead->oh_flags, pass, buffer_list); } /* @@ -4240,7 +4273,8 @@ xlog_recover_process_data( struct hlist_head rhash[], struct xlog_rec_header *rhead, char *dp, - int pass) + int pass, + struct list_head *buffer_list) { struct xlog_op_header *ohead; char *end; @@ -4262,7 +4296,7 @@ xlog_recover_process_data( /* errors will abort recovery */ error = xlog_recover_process_ophdr(log, rhash, rhead, ohead, - dp, end, pass); + dp, end, pass, buffer_list); if (error) return error; @@ -4685,7 +4719,8 @@ xlog_recover_process( struct hlist_head rhash[], struct xlog_rec_header *rhead, char *dp, - int pass) + int pass, + struct list_head *buffer_list) { int error; __le32 crc; @@ -4732,7 +4767,8 @@ xlog_recover_process( if (error) return error; - return xlog_recover_process_data(log, rhash, rhead, dp, pass); + return xlog_recover_process_data(log, rhash, rhead, dp, pass, + buffer_list); } STATIC int @@ -4793,9 +4829,11 @@ xlog_do_recovery_pass( char *offset; xfs_buf_t *hbp, *dbp; int error = 0, h_size, h_len; + int error2 = 0; int bblks, split_bblks; int hblks, split_hblks, wrapped_hblks; struct hlist_head rhash[XLOG_RHASH_SIZE]; + LIST_HEAD (buffer_list); ASSERT(head_blk != tail_blk); rhead_blk = 0; @@ -4981,7 +5019,7 @@ xlog_do_recovery_pass( } error = xlog_recover_process(log, rhash, rhead, offset, - pass); + pass, &buffer_list); if (error) goto bread_err2; @@ -5012,7 +5050,8 @@ xlog_do_recovery_pass( if (error) goto bread_err2; - error = xlog_recover_process(log, rhash, rhead, offset, pass); + error = xlog_recover_process(log, rhash, rhead, offset, pass, + &buffer_list); if (error) goto bread_err2; @@ -5025,10 +5064,17 @@ xlog_do_recovery_pass( bread_err1: xlog_put_bp(hbp); + /* + * Submit buffers that have been added from the last record processed, + * regardless of error status. + */ + if (!list_empty(&buffer_list)) + error2 = xfs_buf_delwri_submit(&buffer_list); + if (error && first_bad) *first_bad = rhead_blk; - return error; + return error ? error : error2; } /* -- 2.5.5 From BATV+d7a49962a47fb612189d+4736+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 11 12:46:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E39007CA1 for ; Thu, 11 Aug 2016 12:46:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5D1BFAC004 for ; Thu, 11 Aug 2016 10:46:20 -0700 (PDT) X-ASG-Debug-ID: 1470937576-0bf57c136758e900001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GYS7Nx8xnBHUXG1O (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 11 Aug 2016 10:46:17 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d7a49962a47fb612189d+4736+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bXu3a-0000PY-98; Thu, 11 Aug 2016 17:46:14 +0000 Date: Thu, 11 Aug 2016 10:46:14 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, eguan@redhat.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, dedekind1@gmail.com, mfasheh@suse.de Subject: Re: [PATCH v2] generic: test accurate shared extent reporting Message-ID: <20160811174614.GB31540@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] generic: test accurate shared extent reporting References: <20160805072147.GG25565@birch.djwong.org> <20160805080251.GI25565@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160805080251.GI25565@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470937577 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31940 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+d7a49962a47fb612189d+4736+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 11 12:48:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DA5FB7CA2 for ; Thu, 11 Aug 2016 12:48:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9E0298F8052 for ; Thu, 11 Aug 2016 10:48:58 -0700 (PDT) X-ASG-Debug-ID: 1470937736-0bf8151be2aa110001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gIN0yq9Q5kgBJ6of (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 11 Aug 2016 10:48:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d7a49962a47fb612189d+4736+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bXu6B-0000tb-7z; Thu, 11 Aug 2016 17:48:55 +0000 Date: Thu, 11 Aug 2016 10:48:55 -0700 From: Christoph Hellwig To: Eryu Guan Cc: "Darrick J. Wong" , david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: Re: [PATCH v2] xfs: test attr_list_by_handle cursor iteration Message-ID: <20160811174855.GD31540@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: test attr_list_by_handle cursor iteration References: <20160802235251.GB8586@birch.djwong.org> <20160803225150.GC25565@birch.djwong.org> <20160804042448.GR27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160804042448.GR27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470937737 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 259 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31939 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 04, 2016 at 12:24:48PM +0800, Eryu Guan wrote: > I have to replace false/true with 0/1 to build it on RHEL6. I can fix it > at commit time if there's no other major updates. Simply including would fix that on RHEL6, wouldn't it? From peterz@infradead.org Thu Aug 11 16:54:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 500F47CA1 for ; Thu, 11 Aug 2016 16:54:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 069778F8040 for ; Thu, 11 Aug 2016 14:54:51 -0700 (PDT) X-ASG-Debug-ID: 1470952486-0bf8151be1b6090001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id TtlArhS0AknXIQC5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 11 Aug 2016 14:54:46 -0700 (PDT) X-Barracuda-Envelope-From: peterz@infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from j217100.upc-j.chello.nl ([24.132.217.100] helo=twins.programming.kicks-ass.net) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bXxw5-0005ny-IC; Thu, 11 Aug 2016 21:54:45 +0000 Received: by twins.programming.kicks-ass.net (Postfix, from userid 1000) id 8B50F1256AAA6; Thu, 11 Aug 2016 23:54:44 +0200 (CEST) Date: Thu, 11 Aug 2016 23:54:44 +0200 From: Peter Zijlstra To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-ID: <20160811215444.GY30192@twins.programming.kicks-ass.net> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead References: <1470935423-12329-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470935423-12329-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.23.1 (2014-03-12) X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470952486 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7173 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31947 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 11, 2016 at 10:10:23AM -0700, Christoph Hellwig wrote: > There is one major issue with this change though: lockdep currently > doesn't have a facility to assert a rw_sempahore is held exclusively, > which means we lose the nice ability to assert locking context in > XFS. > > Peter, I think you mentioned this would be fairly easy to add to > lockdep and the rw_semaphore code. Any chance to come up with a proof > of concept? Sure, find below. Not been near a compiler. --- include/linux/lockdep.h | 17 +++++++++++++++-- kernel/locking/lockdep.c | 41 +++++++++++++++++++++++++---------------- 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index eabe0138eb06..7f0098d3a7d7 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -338,9 +338,14 @@ extern void lock_acquire(struct lockdep_map *lock, unsigned int subclass, extern void lock_release(struct lockdep_map *lock, int nested, unsigned long ip); -#define lockdep_is_held(lock) lock_is_held(&(lock)->dep_map) +extern int _lock_is_held(struct lockdep_map *lock, int read); -extern int lock_is_held(struct lockdep_map *lock); +static inline int lock_is_held(struct lockdep_map *lock) +{ + return _lock_is_held(lock, -1); +} + +#define lockdep_is_held(lock) lock_is_held(&(lock)->dep_map) extern void lock_set_class(struct lockdep_map *lock, const char *name, struct lock_class_key *key, unsigned int subclass, @@ -372,6 +377,14 @@ extern void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie); WARN_ON(debug_locks && !lockdep_is_held(l)); \ } while (0) +#define lockdep_assert_held_exclusive(l) do { \ + WARN_ON(debug_locks && !_lockdep_is_held(l, 0));\ + } while (0) + +#define lockdep_assert_held_read(l) do { \ + WARN_ON(debug_locks && !_lockdep_is_held(l, 1));\ + } while (0) + #define lockdep_assert_held_once(l) do { \ WARN_ON_ONCE(debug_locks && !lockdep_is_held(l)); \ } while (0) diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index 589d763a49b3..abec578378e7 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -3188,7 +3188,7 @@ print_lock_nested_lock_not_held(struct task_struct *curr, return 0; } -static int __lock_is_held(struct lockdep_map *lock); +static int __lock_is_held(struct lockdep_map *lock, int read); /* * This gets called for every mutex_lock*()/spin_lock*() operation. @@ -3329,7 +3329,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, } chain_key = iterate_chain_key(chain_key, class_idx); - if (nest_lock && !__lock_is_held(nest_lock)) + if (nest_lock && !__lock_is_held(nest_lock, -1)) return print_lock_nested_lock_not_held(curr, hlock, ip); if (!validate_chain(curr, lock, hlock, chain_head, chain_key)) @@ -3390,10 +3390,17 @@ print_unlock_imbalance_bug(struct task_struct *curr, struct lockdep_map *lock, return 0; } -static int match_held_lock(struct held_lock *hlock, struct lockdep_map *lock) +static int match_held_lock(struct held_lock *hlock, struct lockdep_map *lock, int read) { - if (hlock->instance == lock) - return 1; + if (hlock->instance == lock) { + if (read == -1) + return 1; + + if (hlock->read == read) + return 1; + + return 0; + } if (hlock->references) { struct lock_class *class = lock->class_cache[0]; @@ -3420,6 +3427,8 @@ static int match_held_lock(struct held_lock *hlock, struct lockdep_map *lock) if (hlock->class_idx == class - lock_classes + 1) return 1; + + /* XXX do we want @read stuff for nested locks !? */ } return 0; @@ -3452,7 +3461,7 @@ __lock_set_class(struct lockdep_map *lock, const char *name, */ if (prev_hlock && prev_hlock->irq_context != hlock->irq_context) break; - if (match_held_lock(hlock, lock)) + if (match_held_lock(hlock, lock, -1)) goto found_it; prev_hlock = hlock; } @@ -3523,7 +3532,7 @@ __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) */ if (prev_hlock && prev_hlock->irq_context != hlock->irq_context) break; - if (match_held_lock(hlock, lock)) + if (match_held_lock(hlock, lock, -1)) goto found_it; prev_hlock = hlock; } @@ -3576,7 +3585,7 @@ __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) return 1; } -static int __lock_is_held(struct lockdep_map *lock) +static int __lock_is_held(struct lockdep_map *lock, int read) { struct task_struct *curr = current; int i; @@ -3584,7 +3593,7 @@ static int __lock_is_held(struct lockdep_map *lock) for (i = 0; i < curr->lockdep_depth; i++) { struct held_lock *hlock = curr->held_locks + i; - if (match_held_lock(hlock, lock)) + if (match_held_lock(hlock, lock, read)) return 1; } @@ -3603,7 +3612,7 @@ static struct pin_cookie __lock_pin_lock(struct lockdep_map *lock) for (i = 0; i < curr->lockdep_depth; i++) { struct held_lock *hlock = curr->held_locks + i; - if (match_held_lock(hlock, lock)) { + if (match_held_lock(hlock, lock, -1)) { /* * Grab 16bits of randomness; this is sufficient to not * be guessable and still allows some pin nesting in @@ -3630,7 +3639,7 @@ static void __lock_repin_lock(struct lockdep_map *lock, struct pin_cookie cookie for (i = 0; i < curr->lockdep_depth; i++) { struct held_lock *hlock = curr->held_locks + i; - if (match_held_lock(hlock, lock)) { + if (match_held_lock(hlock, lock, -1)) { hlock->pin_count += cookie.val; return; } @@ -3650,7 +3659,7 @@ static void __lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie cookie for (i = 0; i < curr->lockdep_depth; i++) { struct held_lock *hlock = curr->held_locks + i; - if (match_held_lock(hlock, lock)) { + if (match_held_lock(hlock, lock, -1)) { if (WARN(!hlock->pin_count, "unpinning an unpinned lock\n")) return; @@ -3769,7 +3778,7 @@ void lock_release(struct lockdep_map *lock, int nested, } EXPORT_SYMBOL_GPL(lock_release); -int lock_is_held(struct lockdep_map *lock) +int lock_is_held(struct lockdep_map *lock, int read) { unsigned long flags; int ret = 0; @@ -3781,7 +3790,7 @@ int lock_is_held(struct lockdep_map *lock) check_flags(flags); current->lockdep_recursion = 1; - ret = __lock_is_held(lock); + ret = __lock_is_held(lock, read); current->lockdep_recursion = 0; raw_local_irq_restore(flags); @@ -3908,7 +3917,7 @@ __lock_contended(struct lockdep_map *lock, unsigned long ip) */ if (prev_hlock && prev_hlock->irq_context != hlock->irq_context) break; - if (match_held_lock(hlock, lock)) + if (match_held_lock(hlock, lock, -1)) goto found_it; prev_hlock = hlock; } @@ -3961,7 +3970,7 @@ __lock_acquired(struct lockdep_map *lock, unsigned long ip) */ if (prev_hlock && prev_hlock->irq_context != hlock->irq_context) break; - if (match_held_lock(hlock, lock)) + if (match_held_lock(hlock, lock, -1)) goto found_it; prev_hlock = hlock; } From david@fromorbit.com Thu Aug 11 18:43:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A5CB47CA1 for ; Thu, 11 Aug 2016 18:43:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 28777AC002 for ; Thu, 11 Aug 2016 16:43:39 -0700 (PDT) X-ASG-Debug-ID: 1470959017-0bf8151be3b8630001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cZjw34HYUM2wjCMq for ; Thu, 11 Aug 2016 16:43:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtUPACMNrVd5LDUCIGdsb2JhbABeg0WBUoJ5g3mdMAaMZYYPhAyGFwQCAoFjTQEBAQEBAQcBAQEBAQE4QIRfAQU6HCMQCAMOCgklDwUlAwcaE4gwwGUBAQgCJR6FRIUVihsFjhiLJI8Kj01Ii22DeIJmHIFeKjKHKwEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Aug 2016 09:13:37 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bXzdP-0002mA-Mz; Fri, 12 Aug 2016 09:43:35 +1000 Date: Fri, 12 Aug 2016 09:43:35 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, peterz@infradead.org Subject: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-ID: <20160811234335.GX16044@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead References: <1470935423-12329-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470935423-12329-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470959017 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1296 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31948 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 11, 2016 at 10:10:23AM -0700, Christoph Hellwig wrote: > This patch drops the XFS-own i_iolock and uses the VFS i_rwsem which > recently replaced i_mutex instead. This means we only have to take > one looks instead of two in many fast path operations, and we can > also shrink the xfs_inode structure. Thanks to the xfs_ilock family > there is very little churn as well. > > There is one major issue with this change though: lockdep currently > doesn't have a facility to assert a rw_sempahore is held exclusively, > which means we lose the nice ability to assert locking context in > XFS. > > Peter, I think you mentioned this would be fairly easy to add to > lockdep and the rw_semaphore code. Any chance to come up with a proof > of concept? I saw prototype patches with a writer field in the rswem to track who holds it for optimisitic spinning support. I was waiting for that to land before completely removing the mrlock abstraction from the XFS code, then changing the iolock to use the VFS inode. Regardless, if the rwsem code can be made to check for exclusive or shared locking, we can get rid of the mrlock abstraction. Can we do that first, Christoph, then make this lock change? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 11 19:37:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EE44A7CA1 for ; Thu, 11 Aug 2016 19:37:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BA3F5304039 for ; Thu, 11 Aug 2016 17:37:17 -0700 (PDT) X-ASG-Debug-ID: 1470962232-0bf57b369d643520001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id AIpoDDtjJFauWb0Y for ; Thu, 11 Aug 2016 17:37:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtkPAN8YrVd5LDUCIGdsb2JhbABeg0VWfIJ5oSkGjGWKGySFL0QEAgKBY00BAQEBAQEHAQEBAQEBOECEXwEFOhwjEAgDDgoJJQ8FJQMHGhMbiBUPwF0BAQgCIAUehUSFFYobBYYNky+GHoV2gnaPTUiLbYN4gmUdgV4qMocrAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Aug 2016 10:07:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bY0TH-0002qM-8H; Fri, 12 Aug 2016 10:37:11 +1000 Date: Fri, 12 Aug 2016 10:37:11 +1000 From: Dave Chinner To: Thomas Deutschmann Cc: xfs@oss.sgi.com Subject: Re: xfsprogs-4.7.0 are conflicting with glibc's MS_RDONLY definition Message-ID: <20160812003711.GY16044@dastard> X-ASG-Orig-Subj: Re: xfsprogs-4.7.0 are conflicting with glibc's MS_RDONLY definition References: <2608952f-e6c4-0f20-8f49-818d67896dd3@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2608952f-e6c4-0f20-8f49-818d67896dd3@gentoo.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1470962233 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2390 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31949 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 11, 2016 at 02:42:50PM +0200, Thomas Deutschmann wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > Hi, > > collectd [1] now longer builds against xfsprogs-4.7.0 due to a > conflict with MS_RDONLY definition in sys/mount.h by glibc vs exposed > kernels header by xfsprogs due to the include of linux/fs.h. > > Upstream bug: https://github.com/collectd/collectd/issues/1877 > > Gentoo-Bug: https://bugs.gentoo.org/590998 > > > I am bringing this to your attention to ask if you want to do anything > to fix this in xfsprogs or do you consider that as a bug in collectd. XFS grabs structure definitions that are exposed by the kernel from linux/fs.h because they are used in the XFS ioctl API definitions, as well as other syscalls that aren't supported by glibc. So we kind of need it to make sure we pick up the system definition of what is supported and what isn't. That userspace unconditionally redefines the kernel mount API flags with the same names and values seems like a bug in whatever provides those definitions. My current userspace doesn't even have a sys/mount.h file - I can only find a platform specific header: /usr/include/x86_64-linux-gnu/sys/mount.h Which contains a stale, partial copy of /usr/include/linux/fs.h. That platform header should pull the definitions from linux/fs.h if it exists, and only if it doesn't should it define it's own. Esepcially as the only userspace component is 3 function prototypes at the bottom of the file. However, I'm probably not the best person to ask how this should all be structured properly - it seems pretty obvious to me that libraries should include system definitions of interfaces, and system libraries should include the kernel definitions of kernel interfaces. So for collectd I'm not sure what the solution is right now - this is only going to get more problematic as we push lots of new kernel API support into xfsprogs over the next few months that glibc will not support directly for some time, if ever. People using XFS interfaces usually want to compile programs that will work on kernels that support those functions (i.e. they use runtime support checks, not compile time), so from the xfsprogs perspective we are kind of stuck between a rock and a hard place here.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From export03@blueraypacking.com Thu Aug 11 20:18:25 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 06E147CA1 for ; Thu, 11 Aug 2016 20:18:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 049B48F8066 for ; Thu, 11 Aug 2016 18:18:19 -0700 (PDT) X-ASG-Debug-ID: 1470964694-0bf8151be3ba5a0001-NocioJ Received: from out4433.biz.mail.alibaba.com (out4433.biz.mail.alibaba.com [47.88.44.33]) by cuda.sgi.com with ESMTP id Ki3GGqafLB7z1RpV for ; Thu, 11 Aug 2016 18:18:14 -0700 (PDT) X-Barracuda-Envelope-From: export03@blueraypacking.com X-Barracuda-Effective-Source-IP: out4433.biz.mail.alibaba.com[47.88.44.33] X-Barracuda-Apparent-Source-IP: 47.88.44.33 X-Alimail-AntiSpam:AC=CONTINUE;BC=0.3525603|-1;FP=3493965584666776694|9|1|4|8387580550966962135|17|1|5;HT=e01l10436;MF=export03@blueraypacking.com;NM=1;PH=DS;RN=1;RT=1;SR=0;TI=SMTPD_----58mgkFk_1470964688; Received: from lily(mailfrom:export03@blueraypacking.com ip:106.6.181.168) by smtp.aliyun-inc.com(10.147.42.135); Fri, 12 Aug 2016 09:18:09 +0800 Date: Fri, 12 Aug 2016 09:18:07 +0800 From: "export03@blueraypacking.com" To: xfs Subject: Fw: feed/fertilizer/grain/sugar packing and weighing program X-Priority: 3 X-ASG-Orig-Subj: Fw: feed/fertilizer/grain/sugar packing and weighing program X-Has-Attach: yes X-Mailer: Foxmail 7, 2, 6, 40[cn] Mime-Version: 1.0 Message-ID: <2016081209180748431751@blueraypacking.com> Content-Type: multipart/mixed; boundary="----=_001_NextPart328743454411_=----" X-Barracuda-Connect: out4433.biz.mail.alibaba.com[47.88.44.33] X-Barracuda-Start-Time: 1470964694 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1484 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31951 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_001_NextPart328743454411_=---- Content-Type: multipart/alternative; boundary="----=_002_NextPart845422587134_=----" ------=_002_NextPart845422587134_=---- Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 DQpEZWFyIEN1c3RvbWVyLA0KIA0KV2Ugc2VhcmNoZWQgeW91ciBjb250YWN0IGluZm8gb24gdGhl IGludGVybmV0LldlIGFyZSBhIHByb2Zlc3Npb25hbCBiYWcgcGFja2luZyBtYWNoaW5lLGFuZCB3 ZSB0aGluayB3ZSBtYXkgZ2l2ZSB5b3Ugc3VwcG9ydCBpbiB0aGUgYmFnIHBhY2tpbmcgYXJlYS4g bW9yZSBkZXRhaWxzIGFyZSBzaG93biBpbiBteSBhdHRhY2hlZCBmaWxlLg0KIA0KQ29udGFjdCBt ZSBmb3IgbW9yZSBkZXRhaWxzLg0KDQp3YWl0IGZvciB5b3VyIGZlZWRiYWNrLA0KU3RlcGhlbg0K V2UgY2hhdC93aGF0c2FwcDowMDg2IDE1MiA3MDAyIDQzMzENCg== ------=_002_NextPart845422587134_=---- Content-Type: text/html; charset="GB2312" Content-Transfer-Encoding: quoted-printable =0A

=0A
Dear Customer,
 
We searched your contact info on the internet.We= are a professional bag packing machine,and we think we may give you suppo= rt in the bag packing area. more details are shown in my attached file.
 
Contact me for more details.

=
wait for your feedback,
Stephen
We chat/whatsapp:= 0086 152 7002 4331
=0A
=0A
<= /blockquote>=0A ------=_002_NextPart845422587134_=------ ------=_001_NextPart328743454411_=---- Content-Type: application/octet-stream; name="Blue Ray bag packing profile by Stephen 160804finalized.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Blue Ray bag packing profile by Stephen 160804finalized.pdf" JVBERi0xLjcNCiWhs8XXDQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIgPj4N CmVuZG9iag0KMiAwIG9iag0KPDwvVHlwZS9QYWdlcy9Db3VudCAxMC9LaWRzWyA0IDAgUiAgMTUg MCBSICAyMCAwIFIgIDI1IDAgUiAgMzAgMCBSICAzNSAwIFIgIDQwIDAgUiAgNDUgMCBSICA1MCAw IFIgIDU1IDAgUiBdPj4NCmVuZG9iag0KMyAwIG9iag0KPDw+Pg0KZW5kb2JqDQo0IDAgb2JqDQo8 PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSIC9NZWRpYUJveFsgMCAwIDcyMCA1NDBdL1Jlc291cmNl cyAxMSAwIFIgL0NvbnRlbnRzIDE0IDAgUiA+Pg0KZW5kb2JqDQo1IDAgb2JqDQo8PC9UeXBlL1hP YmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCA3MDgvSGVpZ2h0IDUzMS9Db2xvclNwYWNlL0Rldmlj ZVJHQi9CaXRzUGVyQ29tcG9uZW50IDgvRmlsdGVyL0RDVERlY29kZS9MZW5ndGggMTAxMzQyL0lu dGVycG9sYXRlIHRydWU+PnN0cmVhbQ0K/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYG BQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/ 2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo KCgoKCgoKCgoKCj/wAARCAITAsQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQF BgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi 4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl 8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP0 9fb3+Pn6/9oADAMBAAIRAxEAPwD6h1C7jsbOS4lDFEGSF61hf8Jjp/8Azzn/AO+R/jV7xZ/yALv6 D+YryjUr2HTtPuL25LCCBDI5UZOAMnivUwWFpVabnU6HwfFHEGNy3FwoYW1pRT2vrdo9J/4THT/+ ec//AHyP8aP+Ex0//nnP/wB8j/GvneL4z+D5JET7TdLuIG5rcgD3NeiW08Vzbxz28iyQyKHR1OQw PQiuqGCwtT4Hf5nh4rifPsHb6xDlvteNj0T/AITHT/8AnnP/AN8j/Gj/AITHT/8AnnP/AN8j/GvP 6K0/s2h5/ecf+u2ad4/cegf8Jjp//POf/vkf40f8Jjp//POf/vkf414xoPjbSNd1ibTtMN1NJEWD TeQwiypwcP0rp6mOX4eavHVeptX4uznDy5KqUX2cT0D/AITHT/8AnnP/AN8j/Gj/AITHT/8AnnP/ AN8j/GvP6Kr+zaHmY/67Zp3j9x6B/wAJjp//ADzn/wC+R/jR/wAJjp//ADzn/wC+R/jXmmrX8Wl6 dPe3CyvFCu5liQuxHso5NP068j1Cwt7uFZFinQSKJFKsARnkHoaX9nYe9uvqX/rlm3J7TS17X5ep 6R/wmOn/APPOf/vkf40f8Jjp/wDzzn/75H+Nef0U/wCzaHmR/rtmneP3HoH/AAmOn/8APOf/AL5H +NH/AAmOn/8APOf/AL5H+Nef1X1C7isLG4u7gkQwIZHKjJwBk8Unl2Hirv8AMceNc1k0k43f909I /wCEx0//AJ5z/wDfI/xo/wCEx0//AJ5z/wDfI/xry7w/rFpr2j22p6eXa1uAShddp4JHT8KwfFvx C0HwrqKWWryXCzugkAjhLDB9/wAKieBw0FzSdl6nTS4pzytVdCnFOavoo66bnt//AAmOn/8APOf/ AL5H+NH/AAmOn/8APOf/AL5H+NeJ+EfiB4f8V3ktppNzIblF3+XLGULDuR64/rXWVUcvw81zR1Xq RiOLc6ws/Z10oy7ONj0D/hMdP/55z/8AfI/xo/4THT/+ec//AHyP8a8/oqv7NoeZh/rtmneP3HoH /CY6f/zzn/75H+NH/CY6f/zzn/75H+Nef0Uf2bQ8w/12zTvH7j0D/hMdP/55z/8AfI/xpV8YWBYA Rz88fdH+NefU6L/WJ9RSeW0PMceNs0bteP3HsYOQD60UifcX6UtfPH7EtUebat8aPB+land6fd3d wLm1kMUqrCThh1+tVP8Ahe/gn/n5vP8AwHavnP4k6bBL421+Qp8zXshJBx3rkG04KRskdfxpXGfY dl8a/CF7HcvbT3bLbp5kmYCML6+9UE/aD8BuoK3l6Qf+nVq+avBls6Wuv75Cf9CJA/OuJ0/mFaSd 2wPsyX9oHwJEUD3d6N5wv+itya04vjL4UlRXjlu2VhkfuDXxdFbpc6tpkLtgPOFx68V6Hp1sPsdu Rx8nB9KU5OKuhrU+in+NXhFJY42mvA8hwo+znmkn+NXhOBSztflR1KWzN/Kvmm8jxrOng93P/oJr WkgXacDGRUe0Y7HuP/DQfgMMVa7vlYdQ1o4pf+GgfAeR/pl3zwP9Gavm23tRNrGpIwDYjjAyM9jX K3VhGuuXELouRIgAHHXFWp3Dl1PsAfHrwQel1eH/ALdmpD8fPA4Yr9pvcjqPsrV8qjShbszhAVwR hzkf/rqnp9pv8xmVnCylWOeSKFUTDkZ9ZN+0D4EU4a6vh/26NR/w0F4D/wCfy8/8BWr5Glhk/tFI MBY8tz1Kj+tOe3VYDI8kQxwUfh6pNMTTR9cD9oLwF/z/AF0PrbsKjH7Q/gA9L28/8BWr49uLOF8b j5eeS392stFKkfWmI+5bf44eDrlA0M94wJwP9Hakl+OPg6Jisst8pHBzatXzL4RiU28IZc5l/qK2 JLeJ5H68n/2as3OzA+ibb40eD7kfubyVu2DHg/rV3/hafh0puD3BHtHmvl+fR4JgCUjYnvjHrVaH TZIFJt57iFgcfI+R+Ro57gfVDfFXw4oyzXI/7ZVVm+MvhSH/AFk10P8AtiTXzGs+roG2XUUwX+GZ ME/iKxtV1K6Kq01sqg942zRzSA+rJ/jl4Mgt3nluLsRJ1P2dqrRftAeBZmCxXV67HgAWrEmvknUt TtZ9FlhDSJOcYVkODz61B4Ob/if2Y6fvF/mK0A+6dP8AHmmX9uk8EF2qP90SR7G/InNXh4otTjEE /PT7v+NeKWl3JaW8DSKw3Fic/p+NbUGrjcmG4/8A11i5yA9Pl8VWkSkvBOAPp/jXPat8XPDekvi/ +3IP7y25YfmK43UdbRYyAdzEdK8x8U38U04JkXfnjngc0RnJsLnuUPxx8GTyJHFc3TM/T/Rz+vpW hbfFzwrcrujupAu7bl028/jXyP4h2WXiGYRTwzLsV3YLgZ9AB3qleXG+wDQuyEOPk65Hc+2OBW1m Rzan3GPF+lNB5y3NuY+P+XiPPPQYz1rmJ/jP4SgvHtZJrsTIjOwEBI2r1Oa+XLsR3+l3M9hNFeRz MhkZSRJAQOV2n1qkZrNzqUllcyQy4SO3t5BklDxJuJ6CktR8x9reBvGej+NtMmv9Bllkt4pTC5kj KENgHofZhXR141+zBaR2PhTW7aGRJUj1I4kjOVb91GeK9lplIytY1y20qaOO4SRi67htANZ//CY6 f/zzn/75H+NZXxC/4/rX/rmf515d4x8b6N4Re2XWXnQ3AJTy4i/Trn869ijhKDoqpU0v5n5tmnEe a08yqYLBpSs9Fy3e1z2b/hMdP/55z/8AfI/xo/4THT/+ec//AHyP8a8K8M/Ezw14j1VNO0+6lW6k BKLNEUDkdgfX29q3bbxHp9z4lutBiaQ6hbRCaQFCF2nGMH8RW0cFhZJNPfzOCtxNn1CThVhZpXd4 9Nr+h6x/wmOn/wDPOf8A75H+NH/CY6f/AM85/wDvkf415/RWn9m0PM4/9ds07x+49A/4THT/APnn P/3yP8aP+Ex0/wD55z/98j/GvP653xj4x0nwjFbSay8yLcMVTy4y/I61E8BhoLmlovU1ocX5xiJq lSSlJ7JR1PYv+Ex0/wD55z/98j/Gj/hMdP8A+ec//fI/xrwbQPin4W1zVIbC0u5UuJjiPzoigY+m fWu5ohgMNNXi7r1NMTxVneEkoYiKi33jY9A/4THT/wDnnP8A98j/ABo/4THT/wDnnP8A98j/ABrz +ir/ALNoeZzf67Zp3j9x6B/wmOn/APPOf/vkf40f8Jjp/wDzzn/75H+NebalfWum2M15fzpBbQru eRzgKK5DQPij4X13VY9Ps7yRLiXiPzoiiufQE9zWbwOFjJQb1fmdVHinPK8JVaUeaMd2o3SPeP8A hMdP/wCec/8A3yP8aP8AhMdP/wCec/8A3yP8a8rudbtrfXbXSXjuTc3KF0dYWMYAz95+gPFalWsu w72/Mwnxlm0EnKyvqvd6HoH/AAmOn/8APOf/AL5H+NH/AAmOn/8APOf/AL5H+Nef0U/7NoeZH+u2 ad4/cegf8Jjp/wDzzn/75H+NH/CY6f8A885/++R/jXn9FH9m0PMP9ds07x+49A/4THT/APnnP/3y P8aP+Ex0/wD55z/98j/GvP6KP7NoeYf67Zp3j9x6B/wmOn/885/++R/jR/wmOn/885/++R/jXn9F H9m0PMP9ds07x+49c068jv7NLiEMEfoG61ZrH8I/8gC2/H+dbFeDWioVJRXRn6xl1eWIwlKtPeUU 36tBRRRWZ2GR4s/5AF39B/MV4r45/wCRN1r/AK9JP/QTXtXiz/kAXf0H8xXkWu2H9q6Ne2Ak8r7T C0W/GduRjOO9e1gYuWGnFbu/5H5ZxpNQzWjKWyS/9KZ4HoSeLtW8B2uk2HhHT5LG4g8pL99u7aT9 85bt9K6XULTW9I8QeCfCVhrU9lG9i0dw8HIJAbJAPfjg9uK9O8IaMfD3huw0oz/aDax7PN27d3PX GTis/V/Cp1Dxxo3iEXgjGnRvH5Hl58zcCM7s8dfSuhYVx5Xdt6X9PkefPPqVXEVIuMVT/eNaN3k0 1FtO/wCSRy2pzazceLdO8FWGtXcEUNobq61EkG4l5OADjA5x+H0qXw/e6wuv6/4P1HVZ7jybYTW2 ogATorevGCRnrW74s8HNq2sWmtaRqT6VrdspjW5WISq6H+FlPXqe/epPCfhD+xbnUNQv9Ql1LWb8 bZ7p0CDA6BUHQU/ZVHJ/PruuiOaWOwrwt7q/Kvd5fe5+a7le1rW6X8uU8d8N6rqPhX4c3GoWGoXT zXmoNZRxModITuy0qr1LkDH411vgjX9Zi8ZWdiH8RahpF3GVml1WyMbQyAEgqw42ngYNb1r8NLdf Bc2gXd/JIxumu4bqJNjRSZyCBk9P84rV8N+HNbs9UW917xRc6p5cflxQJELeL3Z1BO8+hNRRo1YS jfZJflqt+5347NMBXhWa5XKTlumm7pcrXu9PNx+dzy/xB4l1i18TapD4i1zWdBf7TssGhtw9qYwe C3duMZxnrXQ/ETxBrMNr4euLa+u/7Bmh8y81HSIssWA6jOdq98H+lbeveBta1Fr63t/FlwmlXhPm W1zbrcMgPVUkY5UemOlXr3wZdW+m6Za+GNdu9J+wx+SqsonilXnJeM4BbnrSVKtyta9PX8/8iXmG X3oz926umuV8q921/gunf/Gr6nJad4lnm+GPiO60/wATSalNbJvhleLy7m3BPAfsT7iptQ8SazPo ngbRrC8aG/1yBWnv2wXRQqliP9o5PPtWvZ/DfytC8Q291qhuNV1oYuLzyAirg5AWMHA/Orep+AIr 3w5odkl/Jb6poyILS/jQZVlAGSpPIOAcZ7dav2dW2vaPXs3fr2t/mZyxmWqrdNNc7d3Ha8LJ2UVd KetrJvexm6Ze6v4Y+INj4evtUn1fT9RgeWOS5A82J168jqOOnvWBozeI/EB8YP8A8JPfWkGm3Mnk JEFLZAJALEZ28dBXb+HfBtxaeIDrviDV5NX1ZYzDE/krDHEh9EHfrz70/wAOeDjo0PiNDfCb+15X lB8rb5W4EY689fak6NSVr3t73X0sjJ5hhaak4uLnywV+XRtS95pOOnu6XsrnIW3iq61P4b6Feap4 kj0SS4maKe4WItNMEYjCAdCccnHf3qj4V8Qahf23jjSrq9v7yytbNpIH1CLZOMpyGHYen/163k+F 01voeg21lrZg1LR5pZYbo2wdGDnJBjJ+ner2lfD65s77Xbu51x7yfWLTyJ3kgAIkxjcMHAX0X9am pSrSb06Nb/3fXv5HXLGZXGnUVOS1k2ly7e+mre7f4e8vKyLnwa/5Jpof/XNv/Q2rifiJPqdv8XbF 9E0qDVbz+zyBbTY2kZOTyR0r0/wXoZ8N+GbHSDcfaTbKV83Zt3ZYnpk46+tcz428AX+v+JYdZ0vx BLpFxHB5AMURLYyc/MGFbYinOVOCitU127eZwYLHYaOZ161SS5J89m1Kzu9LpanIeHpr2T4saVde LdJj0K7Nq8dlDbINkzfNkswJ6An9Ko+K/FV7YLPqWmeL73Ub6O7AaG0tiLGJdwGxiRjkZ7nNdr4e +Glxba7FqniTxFea3NboyW6ygqI9wIJ5Y+vtVD/hU17/AGDPoY8TyjR/MM1vALRAVbdkb2zlwPTj nmuf2Vfkslrq99d1vqkevHMcseIjOpNNRUVblfLa8rpc0ZS6rR2u766WNDxprGq32veGvD2mXr6c dSjNxcXMWN6qBnauelU/DVzrlh8XJdC1HWrjULGLT/MjEgC56YLAdW6896PipBa6bH4cu7m7vrDU LMiOPVba086KPgAiRM5weoAz+NZvw1ifVfiZfa3bXt1qlolmIpdQmgMKyynGVRcDAAHSteb9/wAv W769Ldjmo0qf9nSqpLk5JLWP2ubRqVu1kle/l1PZqKKK7z4sKdF/rE+optOi/wBYn1FD2HH4kexJ 9xfpS0ifcX6UtfHH9IR2R8Y/EBc+Ltd/6/JP51yUvBX6/wBa7Px8ufFmu/8AX3J/OuQmHA+v9ayu M1PCIzDrw/6cW/ma8+00ZhX6V6J4MXcNdX/pxb+dee6QMxCqjuxssrKlte2ExVjIk4ZSG46d67+x 1BLa3s0nV9kkYZXUZxnsa851BcSWv/XT+leraREzaJZRFz5RRWaMqME49etTV2QR3M29kjn1fTJL ckxtIQCRj+E1tspqpru5tf0lSeFcqoHQDYcAVpsntWXRDZzumKD4i1Qf7EX8jXP63EF8QqxHWeIE 102lpnxHq/H8MX8q5zxE2PEaIASwmiP6in1K6nTNZLLA5+XPXBHQ1R0HTgYLolfm889PoK37ZSYn 3Jg4596h8NIDDe5OP35/DgVK2G2czdaeDrsfybQVcAe+BWXr1kbS0y4O7OD7c8V2lzGf+EitQhBP lv178CsnxlbMlg5kGSxUFu3XpVReqFfQ5i0nSQplQRtIORXMgcD610F3ZhUBjdo/92sCLnb+FdCd zM9G8KyBYIcnBEn9a2d4JPv/AI1yujJdSQxyWrQlQeFbjnNXhLfRv89sWHfY3vWTSvuBvByIxgj/ ADmow58onPeshtRaNAJIZk9QVPpSR6vblMeaASejcUcoGis5V2Bx0P8AKsbVgjwxcDuanN1HICVd Txjg1nalOFWMEjp/WhJoChrZVfD8wAGS6DP4mszwsiz6ksbk7WXBwcH86ua3IG0hwO7rVLwu5i1N TgnII461sI9Qt/D3iKK1t20261QwsNwR2DpjtjNd7p2hXsUEf2rUGlkxkkQhcE9at317qGnWmmJY aVNfo8SCQpKqeWMdea1YppAqGSIKrnAZnAz9KwbbHY8/8V3MWms1u858wFMoyEs+7oQByRVLS7+D R5Gll0S91d5GBRreIMIwB6MB1rttOaK+1+/v41DW6RrbI5H3ypO5h7ZOPwNXNc/tOK1U6DbWk9wT 8wnfYAPbFVJ20EktzxjUvD9zqN39rlt309tSllEMM8eWyBuxgdOKkufhDqIs5rttYhUBd4iSM7vo CT1r2BdFju77T9S1NB/aFohASKQmJHI5IB6kdjU3iRxDoN2xIACgZPuaXMx2R5Dp3h228OaXcm7u HlguGUyNBjduAwFwf51Tji8Lo0x+yanKZUMb7pVGQfwrd8RTA6NcEdcAH864pH+au/C0YVIOUjzs XiKlKaUD6l/ZyGmL4R1BdGsHsrdb0go0m/c3lp838q9Xrx79mI58F6l/1/t/6LSvYayqxUZtI7KE nOmpM4X4hf8AH9a/9cz/ADr51+M8l5D4x8IyaZYx394rSmK2kxtkOOhzX0V8Qv8Aj+tf+uZ/nXjn xC8EXXiq+0y8sNZfSrix3FJI4yzZPcEMMV7MISnhYKG91+fmflGMxFLDcRValdpR1Wt2tYW1trb0 PPLm41Sfxv4VuPGWgw6BaQ3JEElogPmynG1WIJwMgfrWxfzy2vxN8cT28jRTRaLvR16qQFwRWnpn wwv21ixvPEviq+1mCzkE0VvKpA3gjBJLNxXQt4Kjl8W61rFxd74NTs/sb24jwVHHO7PPT0o+r1XG yVtW/PWLXTz7Cr5pglK0ZJpQaslLlvzqVlza7XvfQ43WPEGrxfAnT9Wj1C4XUn2brkN85zIQefpU vj7xXqEOr6Jolvc6lbwzWYurmbToPOuHOOAo7DI5PvUlx8KdTufDY0KfxXM+mQuHtofsigJyThjn LdfUc103iPwXJqF1peo6Tqkmmazp8QhS5WISK6Y5DITz37960lCtJPRrb/g9f1IWKyynVT5oy96o /hdlzJcl7x6eSduiM74T63q9/Jqthq0eoyW9s4a0u762MMssbZ4bsSMdfesn45Pcxal4SewtUvLp bwmK3k+7I2BhT9a7zwpot9pEFw2razdateXD73klGyNPQJGDhR9Kq+LPCx1/VdCvRdiD+zLn7Rs8 vd5nTjORjp71pUpTnRUOt1+f6Hn0cdhqWa/WVZQs9r2b5Wuyer8lv0PKbdtV8a+MbDSNV03SdAud LuFupI0UrNIowfl7MOB0Peuv+IuqGPXjbHxVeWJjt98Wm6XbmS5kY92PIxgZxxxzW7418FDX9V0z VtPvf7O1awcMtwI9+9f7rDI/n3NU9V8CX03iq51rSNffTXvYlhu0W2WQsAMHYxPyHH1wazdGoouK V3fe/lo91/Wup3LMcHXnSqOSgoxfu2bSldX1cZ6S3Ts2ttNzi7PxTr8vw60PxNJfTu2n3/k3qrwJ 4NwGXHcjjn3Ndla6rea58U3trC8lXR9LtFedYz8k0r8qD+BB/Cs660nSvAHw31DSNdv5LqyvHljh KQHzCXUkLxnngndwKt/Bnw9c6L4Iaa/Ekd/f5mcsCXVQuEB75A5x706fPzqLeyTfra1v1KxlTCvD 1cTTikuaUYaWTUmndafZXMvK6Nr4n6VFrfg680+W9t7J5SvlSTuEQuDkKSfWvMtYmutNt7CLx94S hj06ynjWPU9McJhxxvOOSO+OORXc6V4Tn13wHPpHiy5u7l5bh5Ip5jiZFz8jYOdpx2PrWNF8Jb26 kt4PEPi3UNT0qFgwsyGUHHQZLHAxxwPypVKdSclOMd7drfNeXkTluKwmDhKhXrK0ZPZSvsleEota u1rS0NTXtYvoviv4fsLa8lXT7ixlleFT8rkKxBP5CuL0e48Uap4B1nXn8U30TWE0vkxIF+bbjIc4 yR6DtzXp2peEhd+NdL15LsRJY2z24t/Lzu3AjO7PGM+naqOj+BG07wNqvh7+0BIb55X8/wAnGzfj +HPOMetTKjVk5b/atr1urGdDMcHRo01G3N7id432lPm3XZq/cwda8Waxe+F/BsNjOLS+15lSa5QD MYAG4qOxOa1oofEHg2z8Qahf6s2saVb2xmtluf8AXeYF5BIwAuamvfh9FdeENG0n+0JIb/SdrWt9 GmCrjvtJ6dOM9qk0XwTcrc6pc+JdcuNYl1CD7NIgjEEXl4x9wEjPXn3rWUKjnJrfo76bdvXyM54r A+ycYOKjeV48t3Jc91Z2093TdW7anmemeL/Egi07Vre48RahezSq9xavp5+xtGTyIyOmBjB+tfQK NuRWAIBGea8+0fwHrOnG0sh4uvToVrJujtYohHKV5wjSg5I9sflXoVaYaE4xfN/X4s5c9xWFxE4/ VlGyvqk1pfRP3Y7fP1YUUUV0nghRRRQB6b4R/wCQBbfj/Otisfwj/wAgC2/H+dbFfKYj+LL1Z/QG T/7hQ/wR/JBRRRWJ6RkeLP8AkAXf0H8xXlOo3kOn2M95dMVggQyOQCSAOTwK9W8Wf8gC7+g/mK8V 8c/8ibrX/XpJ/wCgmvawE3DDTkul/wAj8r41pqpmlGEtnFL/AMmZzUXxg8GSSIg1KVSxAy1vIAPq ccV30Esc8KSwuskTqGV1OQwPQg185aKviHVPAttpVj4Hs5obiHyo9SZF3EE/fz/Wu51dLnwxoXh7 RZ/FUWkCC1/eLbxGW5uHAxhBg/Lk46cmuiliZ2cprTTy/M8/Mciw0JxpYaVpXas5KeiW9oK67Wa/ I9XorybwP431FvAXiXUdQla+k0mSRYJJY/LeRQMrvA6Grfhmy8a3cGh62uvpcJdnzbuzniVYo425 wmOc1vHEKVuVN3s/S55VXJalB1FWqRjyu2t9Xbm007d7aux3GneIdO1HWtQ0q1lZr2w2+ehQgLnp gng/hTtY1yy0i4sYL1pRJey+TDsiZwW46kDgc9TXhmv+K5/DPj7xjHY/u72/eKGO4YZS3H8UjfTI ruPFl9q/h6TwPZw6zcXLXd8sd1O239+CVyOnA5OMdqxp4vnhfrdJ/OVv6/pHdVyDkqUrP3akbpN6 u0OZu9mkk9O/5np9FeV3V14i1j4p6zodhrsmn6fDapKdsSuy/d+5noSTz7ZrItfHeu2PgfWlmnS7 1S01IadDdOoGdxOGI6ZGD+laLFxs20+v4OxywyCtUjHknFt8jtrop7N6W9bNntdFeOeI5fFfhfVP CcM3iWa+ttQvY0nDQqrZJXK5A5XBPvXsLusaM7nCqMknsK2p1Oe91azt+Cf6nDjMA8LGE1NSU72a v0duqRyus/EHw3o+qvp19fFbmPAl2RM6xZ6bmAwv411MMqTRJLC6vG6hlZTkEHoRXzdrWozXOp61 qekfarXwbrVwlre3ckSvzn5mQdQPr617j4G1nSdV0jydAklls7Ai1EjoQG2jqCev1rDDYh1W1L+v +Btr5nqZtk0cHh4Vaad/tdUnZaPT3XdtWu3bUteKPE2k+F7JbrWrtbeNztQYLM59lHJqDwp4w0Tx Ukx0S8EzQn542Uo4HrtPOPeuV+KOg3uo69omqaOlhf3unh2fTbth++QjqFPU9R+XpWV4JvLA/EKA 6t4dufD3iGe1ZUjjYC3mQZ/hA64H6UlXn7Xlltfz/Pb5CpZXhqmA9tFt1LNuzjpZ7OL961lfmT07 Hr9FeSWV14r8aS+IL3R9abTVsLlrWztEjUpIVPJdjzzWx421DUbKz0eDUvE9noszoWuDbQmSadwO kSnPGa0WITjz2dvl1+ZyyyeUasaLqR53ulzNrS+yWvyvqdtrWqWui6XcajqDmO1t13SMFLEDOOg5 qTTb2DUtPtr20Ytb3EayxsQQSpGRweleJweIr/W/hf44t9QupbxbFvLhnni8uVkLD769jV3W/Fd5 o/hfwTpFjcT2f26yjea6gg86VEVF4RPU+tZLFrV9LK3zb/yO18O1LeyT/ec7XlZQUr2te9n69LHt HWgcdK80+F3iTUr/AFnUdLvpb69s4kEtte3doYJG5+ZWGMcZ4+lel11U6iqRUkeLjsHPBVnRqO70 enn66/eFFFFWcgU6L/WJ9RTadF/rE+ooew4/Ej2JPuL9KWkT7i/Slr44/pCOyPjL4g3Kx+LteDEc Xcn865KW4THNfTnxA+Gvhy90DUdZNoy6kzGQyCQ4LFwCSK+XrrTIlnnTLDbIyjB9DScVa4X1sdB8 P3E1zrqr/wBA9z+tcBoQyhBrv/hrZCO/1o7mOdPcYz71wvh1Ms49KiL1ZTI9U4a2PpN/SvWtCYSa PYvjrGv8q8l1kfLCM4Pn8HrivQvD11fxaNZKbTzYwgEciHG4e47UVNgSNHU1U6tpBxnbMefX5TW2 6LzxXJajfT/2rYMbaRdku7B6ng9K121gZO+CZR7oayaGVNHA/wCEi1n0xF/6DXOeIFH/AAlZ5/ih 4/4FWvo18BrOrTbSI3MeCeOgrB16dZPErTHcEzDggE5w3NOxS3PRLcfu2X2qp4ZYC3vSRz9pbn8B UltfQEECZPzqt4Xmge2u8ypk3Unf6VC2Bjp8DxFZM2ATFJ/IVQ8fug0BiGyfNQfrVq5nt08R2Y81 PlikAJP0ql42mtv7Dl8uRZHMiHjn+KnFO6E7WORvwBb5/wA9K5KH7yenFdPqd1G0SqhGfT8K5q2B LJ9RXRHYg9I8Lqi2cYCKMsT096v2cBBuJJp5MbsRQADj3LentWd4eZRZICwBBJ/Wt2zga4C+WFJJ A5YDJrCW40V5iMnI7f0qjMkbxAGFW4/u108nhfXXZsaZPg+o6Ug8H+IGQAaZNnHShCOE+yW7Fw9q EwcA5xu9+KzNVsY0CmIyDIz97Nd5qXhXWdPTzLyxaJGOFLHrXM3Wn3l7OlvY20tzPjHlwqWbNWpA cZfCaOILLMWiLD5SOa9H+Fngi01CwHiDXNZsdN0+ac2Vrvbc7TdwV6Djpmr2k/BPxJrYQ6g8OlQE hmMx3ykeyDp+Ne5/Dj4cab4O0m5shJJqK3MizP8Aa1VlEijAZF/hPvWt7CNLSPCWnWOx3NxeTIoA kuJSV6cHaDiqN/oer6n4Ylg8QNYy3kEwlhayQopQdRg9CRmu0C4qlqer6dpDWv8Aad7Bam5k8qES tjzGx0H4UPUEeCeLI5PDel219cYcXjsIoIXJIVT82e3HvWLbeINEtLGO61CW6jjlcoixuN4bvkZ6 e9d98UUUQX2gzQxqryi4hndjldwxlB3z3z6V41deDV+wPapM/nJL5schwQCRgjipTS3Bq52dvr2i xgSWrawqt8wKygfjT9X8R6bqVsYbiLVZIscp9oVQ59+K4jT7KWxhNvNL5sisfm5q2VIHNe7TwFGU U5LX1Pm62ZV4TcYy0T7G14rTTLCz0rzY75Y7qDzipm3lTnucc1yxi06TcbS9cMASElTk+2a6T4jl VvvDUMhHlLaRlgen41yl6I21m7e2w0QDEFeQeO1cFJcq0fc9Sq+d+8ux9L/stvv8E6mf+og3/otK 9lrxT9lFi3gTU9yspGosPmGP+WaV7XWFV3m2dlBWppHC/EL/AI/rX/rmf515x4n8U6R4ZjgbV7ny 2nbbHGiF3f1woyce9ej/ABC/4/rX/rmf515f4uk0DRNvibWoYvtNkhSGU8vzn5VHqcmvew8nHDRk ml6n43nlOFTPKsKkXK72ju3ZWX3+T9C1oninR9a0ibU7G9Q2kG4TNIChi29dwPI455qp4d8c6B4h vzZ6ZeM9zt3qkkTR+Yvqu4DcPpXjl2moyfDrxr4nuImso9cuYTFCOP3Xmcn8d2M9/wAa6zxSiWXi D4YNafu2UpANv/PMqgI+lOOJm7Nr+W//AG87GlTIsNGUoKTbbklqtHGCk09NdXy6W2udx4k8b6D4 cvEtNUu2W4Zd5SOJpCi+rbQcD61c1XxPo+l6JHq13exiwlx5UifN5megUDkn6VwHhlVu/G/xGa6+ dhH5A3do9h4+lcjpEN9J4F8G6utvPfWWj6lKZoolLsI942sB3xil9Znb119Fe2vfuTDI8NLli5NN cvNqteaDkktNNVy633ue1aD4q0jXdOuL3TbrzYrfPnKVKvHjPVTyOlWvDut2PiHSotR0uRpbSQkK zIVJwcHg815X4O1D+1vi54lmtbW4tbK800OY5o9jPjaA7Kemctj611vwVtzbfDjS0PJJlJ/7+MP6 VrQrSqNX7P707HHmWV0cJSlNXT9yybWilGTaemrTW+nodzRRRXUeABGetFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFAHpvhH/kAW34/wA62Kx/CP8AyALb8f51sV8piP4svVn9AZP/ALhQ/wAEfyQU UUViekZHiz/kAXf0H8xXkWv2Dapol9YJII2uYWiDkZC5GM4r13xZ/wAgC7+g/mK8i13VIdF0e71K 6WRoLaMyOsYBYgemcV7eXcrw8ufbW/3H5Vxvz/2nR9n8XKrevM7FXwbozeHvDOn6VJMs7WsewyKu 0Nz6Vz/irwZf6h4ttfEOh6rFY30VubdhPbiZducgqCeDyf8AOa0/BXjTTPF2m3V7pyzwxWz7JBcK FI4zngnjFVvBHj/S/GN5eW2mQXkb2qhnM6KAQSRxhj6V3P2U1GF/NfI+cjHMcPWrYjl96Px3Sa97 unpqVPC/gEaTpviDTtRvjqFpq0hkZmTbJlgdxY5wSTzwKo6b4A1u3fTLS48Uzto+my+ZBFDF5cpA zhWcHkYOOlekUVSw8Fay2Mf7ZxblKTkm5b6Le1rrTR20urHCr4Ahn1rxRd6hPHPba1GsflCPDRY7 7s+uD+FVD4B1GfT/AArb3urxTSaHciUSeSQZYwRtXrwQBjNdR4o8T2fhx9NW+jnc39wLaLylBwx7 nJHHNbtTGjS2XS34PmRo8yx9OEajej20XSPJp8tH3OV03wtJZ+P9T8Rm6Ro7y3WAQBMFcY5znnp6 Vx+u+C7XRPB/ic6vcXFzBe3n21Hs7fc9u2ThsZ5Azz04r0fStVOoXl/bnT7+1+ySBPMuYtiTdeYz n5hx1rSIBBBGQe1J0ITh7vn+Lu/xFDM8Vhqq53tybW2jZx1s/wCtz56FxL4o8SeEIbfxC+v3NrdL I4itDDHbxLtJZ/VjjGc9q+hJY1ljeNxlHBUj1BpI4Y4yTHGik91UCn1dGl7NNN3u7/p59iczzJY3 kUI8sYJ226u/RRX3I8uf4a6tDpd1oVh4iWLw3cSFjbSWoeVFJBKq+fyrpfh/4Rk8H2dzZJqc15Ys +6CKRADF68jrk1oah4ms7HxPp2hSxzm7vkaSN1UbAF65Oc/pW5SpUacXzQ6abv7isXmWOqUfZ137 s/e+GKv05rpXvpa+5xXj3wOfEd5Z6npuoy6XrVoNkV1GM5UnoRx6nH1qj4S+Ht1p/iKPXPEmuXGs 6jAhjty4KrGCMHgk5PJ/OvQ6Kf1enz89td/n6GUM3xcKH1ZS92zWyvZ7q9r28rnm9/8AD3VIbrV1 8OeIDp2naqxkuYGg3srH7xRsgrnNTax4Bvn1HRtR0bW2i1DTrf7N517CLjzF/vHOOea9CopfVqdr fq/wLWdYtNPmWmnwx10trprpprc81tfhxdwaN4psJNZFwdaKv58sPzo+csWwcHPtir+p+A5bjSfD 32HUzaa1okSxwXax7lYAAMGUnocetd3RQsPTSsl2/C7X5iec4yUudy1vfZfy8u1rWcVZrY53wro+ rafLdXOu63LqdzOQAioI4YlH91PX1NdFRRW0YqKsjgrVpV5uc7X8kkvuWgUUUUzIKdF/rE+optOi /wBYn1FD2HH4kexJ9xfpS0ifcX6UtfHH9IR2RwPjXWltvCd1byWV3tY7fO2DYP3nXOa+UbkiS7um HQysf/Hq+t/iAnmeAbhT3kX/ANGV8kzJ/pl4o7TMP/HqUvhF9o3Ph2udW1Rf71jJXn3hZMzTD0J/ nXovw7/5D96vc2Uorg/ByZvLoejH+dZR3ZbMrWxho89PPr1Pwpn/AIR7T9w5EY615h4jA8xO3+kV 6p4Shln8NWksZDbAFIx15p1fhHHcj1JQ2r6aT/z3H8jXQ/Zmk3+XGzhepArC1BWOs6YoA3G4C/jy K66ZLnTWxvjZZM/w55H1rLco4rQ7eKXXNaDICuYuGHT5a5vW7JY/FskcW6OPMBVVPy5LYPFdr4Ws prnWdfkiK4Ros54z8hNc9ra+Z4pxzgNBj/vui9iupswadmVlZYCPXYaytAXS5Li8tLybbcxTOx3N sXbkAY9a7ex06eWKS4jCGJCc5ODx1rjPCYjHizV/M2Y2sRux/fFTHYchWg0ePxLZRB4ZI5InyhkD Ddxj6d6XxxY2MehNLbeV5ySR7fLYAkE8jirWqxWs3i/RRJHC0R8zqBg/KaXxtbWkehh4beBCZowG VQD1qluiHex5rqltBJEZbYkKCwJHcgVk6em4qce9bDFf7OcA/wDLSWqOnx5gYjnC1vDYh7mk7GOz W4t5SZGP3DwK9ej+GVvHoGmXlz4njhuLyOFlgEDEqZCAvOemT19q8y0W2truDSotQDtaM53Ih2lu eBnsPWvUdEm8V3XxA0zQvEF1awWpijMdrIqrvt4iXiCMOpPB9euaI7CaPebKC5trK3gvZY5buGNY 5nj+6zAYz+OKlyap23lWdvbzbxskwJW6cnufx4p13fwQZ3MARVIRU8TadHqmlNHIMtEfMTHt1H4j NR6fomnaTGG0+GKEMoIZBy2R61j6x440vTTtmuoxJ2jB3MfwFci3ji+sphFe+GNUbTHumghn85Y2 XgHBXqAAT19KFDnlaO4pTUIuUnZI9MS+jjU8YI6k1RvPEkds3GWZRuwveuG1O78N6uiNfabqcixy CQJ9sKjcOhOOtTQa14etohHHpF4VGT89zk8+5rq/s7FP7P5Hnf2zgV/y8/P/ACO10rUJv7RvLu/1 2wl0q5CyWlsECSW47qxzzVy71Hw9dkJfTWVx5RDr5wDhT6rXHw+PNOgjSOHS50RF2KodcAflST+P rKWJo20+52MCCBKoyD26Vf8AZuJ/k/In+28D/wA/Pwf+RS+JuteHNXgtbiw1eyku4CUdMkFozzxk djXmo1PTn+7eQD2LYrs9W17QY7Jns/CrXM642xtc7cjPPb0rI+Jkum2HhrRNUsdCjtzdQPI9uWDM fmwASaxqYOtSaU42udFHMMNiE5Upp2MVU0+S5ErukhYY2xuDn3rTm0/SpbZmEF5Cyrne0DkfoOa4 eDWtMk2l9LXOBlSi8flXQ6V47TTojFaxPGMYGQWC/QZxXXGriIQUeXbzOSeHw85uXNv5Ff4nAJ4g 08rHK6pYxoSoPp6dq57S54V1BDvMICNtLgA59h3Naur+LLORnuru7vHuGOWfYTx2GBwKy01d7yMl fmjbpuAyK8+pVlCPs5Rsd8aUZy54vQ+m/wBna4+0eE9QPOFvSoLdT+7TrXqleQfsykt4N1In/n/b /wBFpXr9Z0/hR0nC/EL/AI/rX/rmf514j8SfAeo+MNV0+4h1WC2tbMbkt5YDIrPnJYjOD2GK9u+I X/H9a/8AXM/zrlK+mw1KNTDwUj8WzzG1cFndatQdpJ9k94rucdB4Y1XUdE1LSfFeqW1/aXMQjiFv aiEw47jk5x8uPpVHw/4EvrfWtMvde1hdRj0mIw2ESwCPYMYy5z8xwBXf0V0+whzKXVHjrNcSoyjF pKXaKW6s7aaXWjta/U4LxD4GvbjW7/UvD2rrpsmpQ+Reo8AlDjGNy8jDY71JqPgFf+EX0nTNF1Ga wudLkWW3uByGYHJ3qMZzXc0Uvq9PXTf/AIfTtqNZvi0oLm+G1tF0VlfTWy01vpocl4X8Jz6Vcapq Wo6h9t13UVCy3QjCKiqMKFXsBx+VaXg7S7/RtDis9V1E6jdKzEz7NuQTkDHtW3RVxpxhsYVsdWrq SqNO9ui6KyS00SXRaBRRRVnIFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHpvhH/kAW34/wA6 2Kx/CP8AyALb8f51sV8piP4svVn9AZP/ALhQ/wAEfyQUUUViekZHiz/kAXf0H8xXhXxO/wCSf69/ 16tXuviz/kAXf0H8xXj/AIj0pNc0K+0ySVoUuojGZFGSue4FezgYueGnFbu/5H5dxjUjSzehUnsl Fv5SZ8+6TqL+FvDbRwlgdf0ZRCOxmDmM499p/Sun+HFrF4e8XeNLf7QlnFZ2UWZ2XIiwudxHfHX3 rsLr4a2NzZ+GbeW8mP8AYbAo2wZmAIOG9Bx+tXj4FspdW8R3lzcTSx63CIJocBdigY+U+taxw1SM lJdL2+5/qzmxWd4OtTqRu7zvfTe048vl8Cb19Dyk6zPY6t4evtE1nxLfpdXgjuLu+DJazbicokZ6 H9B2rrXg1Dxt418TWUutahp1rpQENtHZTmL5yPvvjlh7VdX4V7rXT4rnxHqU/wDZ0iPZh1XZCF7b e+eOT0xWrr/gFL/WbnVNK1e90i6u4/Kuvs4BWYdOQeh96pUalrNXV9r+X+ZFfM8DKa9lNKXK0pct 7e8mvsr7N1otNrW1OM+Jljqdv4f8FWd7qoutRGoIn25EHUkYbHfHqeuK1LFb7wx8XNN0eLWNSv7D UrR5ZUvZvM2uoY5X06dBjrW7cfDmwbSNC063vLmKHSrkXKljvMjAg4Oeg47dK1b/AMKw3njbTfEj XUizWULQrAFG1gwYZJ6/xfpVxoTVTn8116cqX5nK81wzo+wcrrlq/Ztq3eGnTXXR2R5Xqesamukf Etl1G8DW15EsBE7ZiBY5C8/KPpVrV01Xw0PBusp4g1S8udQmhiuYp5swsrKOidBwevJ712Nz8OLa e08S251CcDW5kmkIQfuipJwPXrWh4g8FwazYaDayXksS6TJHIjKoJk2ADB9OlZ0sPUSTluuXr2bv +B0f2vglKMU1yt+97vT2cY9v5k/zOE8a61qOqfEC+0hU8Qvp9hChEWiMEkLsM73b05xiuz+FN3rt x4elh8S293Fc28xjikuk2ySxYBUt6ntn2qXxF4JXUtdGtaXql3pGptH5Ms1uAwlTsCDxn3rZ8MaJ HoGlJZpc3N2+S8k9xIXeRz1PPT6Ct6FKpGo3Lz+eun4HnY3H4WpgIUaSV0o6Wd018Tvtr879bWOc 8R2DzfFPwpdBGMccFyGYKcA7RjJruaw9T0F77xJpmqrqN1AlkGBtYziObP8AeGe1blb048t/NnlY usqtOjFO/LG3p70n+oUUUVocQUUUUAFFFFABRRRQAUUUUAFOi/1ifUU2nRf6xPqKHsOPxI9iT7i/ SlpE+4v0pa+OP6QjsjjvGIZvBNxuAwJFx/38r5KnUDUL4ek7/wDoVfXfi9d3ga7z0X5j+Ema+TPE ts2keIr22upEMjt5o29AG5H1ol8AvtGl8PjjxRMP71tKP0rhvCtxHBqd0jk8u44H+1XYeBZGXxOJ VUmIxyIX7ZIrgdHONbugf+ezj/x41nFe8y3sReJWzLk9rivTvCTOugWQywO3nBx3ry7xLtUuf+nk c+1d14N1BP7Kt0Vsx5bbnrjNFRXQI3NRP/E107n/AJbjn866SSRn++7MB03EmuJ1y+NvqlgMKD52 V3N1A6mtq31uCfydtxG3mMVAUdx1FZNMu43w27DW9cCO6rviztYjPy1g62xXxiqgkh5rdQOw5zWz 4amjPiDWoS6+a7Rsqg8kBeTWVrETN40hypKC4t+R2OTU9TVLU7yzkmUywrJIsbHkA4BrB8HWMSX+ uSFFO64wNwzjnpXT26L5z5II4/Cs3RrdNPs9Wu57q2MQuskLJubBPXHt39K7Mr5VXTk9Dzc3UnhZ KmrvTb1NE21uWVjbxEr0OwZH0oktoJV2ywRumc4ZQRmorfULa5ANvIXUruB2kDH41OsoboRX1ihC Sulc+DlUq03aTaZynjy2sbTRo2FrAimQltsYBIwc150xtHsp/sUQSTZuAbIGK9C+I+2extoCxCuz 5I+ledw2cNra3LeerCRCq4Hf0r5/MUlWaXkfYZM5SwylLW7ZUa5li0W1aKRSQThB95fXJrTuvEd3 Pc2Oq287DV7No3AlYtgoeHTPbHBUenvWFNM8+jraGNV8o4Vs8tXruo654Sj1fTltBZXGmTHT2vme LPlNH9/bx0PIYdya4IbHqvc1vDXxGvNXswNZks7We4GGLzAJLzyVTqpOeAM9Ks6k11q8oigfUpox 8oCnywR7965ixsvBnhnx9f6ytrFrGkSr9o0zeCjRSFsgbT1C44P09K3bn4m6hfXHl6ZbRWETk5kR PmP/AAI0/ZylsZTrQg9Tc0XwNer+8EMViG+84GXI92OTWn4j0ePStAs7ZJGk8y5eVmbudoFeP+Od c8RaTfo8Ws3UVwjjzWjm3hcjIHoRXoPw5tvFPxA0G31fUvECS2i3Msf2YWgyuMfdYdc+9dGE5aFe M5vY48dGWLw06dNav/MgbCrgVVkNehy/DuZv+X2Zfrb1CfhvL1N/J/4Dn/Gvoo5lhv5vwZ8fLI8c 9ofiv8zz0imsK9C/4Vy+f+Qi3425/wAaafhvIf8AmJj/AL8Gr/tPDfzfg/8AIyeQ47+T8V/meeYy aX4xPt8OeHIPSwU/99SGuz1X4a6sscbaTqdo0gb51nhYBlx2I6HNcr8ZdEvpJ9M0+CSETW1jCjM4 O04JJx+JrixePoVJR5Xtf8j2MrynE4eM/aK3Nbr2Z5DGORTmI38ntW4PCt2D/wAfEX/fJpx8K3Z5 E8X/AHya5/rNL+Y9L6rV/lOT1l9tgecciq+g3whm8tz8jfzre8Q+Grq2s1kllgeEyKpUggk/WoEs dDsP3l15UWOD85J59hXlY2pGpUvHU9PCU5U6dpbn1N+zMP8AijNRwc5v2/8ARaV69Xj37MVxZ3Hg rUTp4cRLfsvzjGT5aV7DWcFaKOk4X4hf8f1r/wBcz/OuUrq/iF/x/Wv/AFzP865SvqcD/AifhnFP /I2r+q/JBRRRXUeAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHpvhH/k AW34/wA62Kx/CP8AyALb8f51sV8piP4svVn9AZP/ALhQ/wAEfyQUUUViekZHiz/kAXf0H8xXmNen eLP+QBd/QfzFeY172Vfwn6n5Lx7/AL/T/wAC/NhRRRXpnw4UUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFOi/1ifUU2nRf6xPqKHsOPxI9iT7i/SlpE+4v0pa+OP6Qjsj53+I Wt6qk19bS6vNDYJM4Cp0CgngjvXj+q6eLudr/UtTuyZcbZHCjcPxrpPiJql9P4q1i0MatBFeSbQB 1Ga871+eWZo7d5X8uNCVjb+E/wBaGCRpWaNpurpc6bdXE4iyp8zBTntgVzunORqk8jgBnlZiB0GT Wh4a1VXs47eQAeVuyRwTn1rO0dEuNeghct5ctwFO084PpSW9xsfqUKXkk8chIAbcMeoq34XufLto kXgKxAH41bvtKEN7cGAFovMZAS2Twcc1m+WumzQKgIVs8ZzSumOxr65pL6jqDXH9rWkJKgIkjEFf UVk3Fg2lpFKNStnKShtsTEnHtTtRvVGqIyrl1xnPTkVnyX8lzMx8hApcZI/h57UktA6miutXFvqN xq0c6RMjjyxJwXHcY9MV1Og6tp/inxW4SVjGyLJsztYMgz+WayfAdzJaa5q0jaY1/FIMD5dxAXk4 GDmvZbLRtd1Gyt5dF8IWtvJGhZ3+0xRSMDyO3pXdhaFFyjUqSW+qs9jy8wxOK5Z0qFN7aSTW7+d9 DNmtrOCynKQKZEjL5LnJxzXFaV4thW3ubWLRYBbvHJM+6Yk4OC2DWl4n8UXfh2V4Ne0K7gJXJAlR wwP07Gs3Q9b0rU72O3i8O3FsJgV82WEKgGMkE+hr3eTDP/d7J+n/AAD5mlLHU4v69GUo6P4l09GW LzxJayR+VC0xj4Eac/KMdM961PDl2JMna6+xNYdpr+lXE0qWeg3jvCfn8uAfLzgE89zXSWst21u0 sPh/WEUdQbcA/lmr9tTT96aIlh67jaFKX4f5mZ4+mDSWakZARyR+VcU9vZtp1zDHFgsD5fbD/wB4 ZrpNXGoanfRkaZqcYj4JntWT5c9BUE+nTRR+YbWcqCAR5ZJyTgV8/mMk6zkmnfsfVZRCVPDRpyTV u+nU5G6SOHRrG2ns4Q3mfvblB85J4AYAndjrniqEcz3t0Y7Isfl8tlC8Mo7/AFyM10Pi7Tpo9PSV IWVEnMbuV2qpXhgSe4qn8P8ASrq71sW9tGs1w6EJGkilm7nAzk8Vwra56Zp2V5e3GnwJcwslxCPK 3yryV9c0W1pqTxrPsdLSMFlYv8zAemeK7b/hFdaDBX06cEnABWuu0zwfb2uiTw+I9LVtTditmyuX JUjuBwoU9Se1aRqvqc08OnseTzahqHjSNbWx0JYpLaMtJJEcF0HXI/WvbdH0a48I/Bm7shKYrgym UNC+CoZl6GpPBXhnSNB2XCXHm3AGA7Dbx9K3PHlxG/gq78tlaNnTkdPvVMpym3KTNYU4wVoo+a4/ FPiCK4/ea7rPlq3zLHckHHoD612xudX0LVdOS68TeKNQn1C3WaKxgkBeEHosjHjcRzxiuOitTd6n D9nha4lMq/uYxuMgyOMCva9f8E2d54kv9e8R6otlpEqRKsKvsfaqjCE9sHpjJqYeZTZQsda1+91S K2gtvGMHPys5XZJx3Pb8a7fyn8Pxw6p4q8WXtrbqP+PSSdQHbsCf4vw4rl7P4jaPA7aP4Sj+z2sI zJcMpZj24U8kn1Nc9bab4f8AGus3rajFfaldxqVIv2Owc4ynOPyovHmcU9UOztdnQ+Lvide31rc2 /g+eytpgdq3EkiTHHrhWwv61594nvdY077M3jDXhLqEwULPMdi+X1yMfWut/4QbS9Ct5XsrKK2BH OzvU3xC0Sx1W58LQ6rbR3F7BaDzFflQpPy5Hc4qJXYzzvR77+1NQltoLxpNufLmSQlJAO4B7Vbtp T/arq326aJB/r3YLD05wvU/U1d8GaW0ni0gKixrK8hIUAJEo6DHQVM6RzSXUsClYWZ2Qf7OTisXd bDueLeINU1bWtTuWl+1C2Mp8uFQ2xAOBj396m8PabdvPKBaytvQjLIQM9jn1rvpI7to9u4RA87lc k49qyNOlvbm7uRNJIq5G1Q5IA/xrT2mmxJ9F/sqwzW3gfU4bmQPKmoEH5NmP3cfFe0141+y8JD4S 1uZw2yXVHKMf4gI4x/MGvZa3jsBwvxC/4/rX/rmf515b4t1DW7K8sl0eBZoWO6bEJcoo4JJyOMsp wOeDzXqXxC/4/rX/AK5n+dcpX02Ei5YeKTsfiXENVUs5rTlFSV9n6I5W81HX4/E9rawwRtpzACSY QMVUtg8nOf4W5HA3LnNZng7xNqV94y1vTdTZGtVmlWyKoFwIyAykjqfnU/hXe15c1hqenWmoavaa dcy31nrk88UAQ7poZFVG2juOc/hVT5oTTu2tX+X5bnNgnRxNOdOUIp2ST876O/rZPyNrTfEd/e/E m50wOn9kJbv5Y2Dc0iMAxz6ZbFSzfEXRotRNv5OotbrN5DXy2rG2V87cF/rx9ap6Fo13p/izRWeC UomkyiabaSomeQOwJ9ck/gK8/wBd07VtRsbmC+0XxNfa7DcmXz5GIs4FDgkwKpAbIA+XBP5VnKpU pxS663+89GhgMFiqyUtIqMVo0urXM7+ib167M9V17xvpekam2nSLdzXCKGme3gMiWwI+VpSPujHP 0FUNN8bw2nhDR7/V/PvL++VikFlB5kkuCclUHYDGTVSa51Hw/r+sImg32pRayUlt54EBVW8sIUlJ +4AQOT2J9K5W58P6ra6F4Wvnh1+BLazktriLRjsuY2L5Hykcrxz+BpSrVE21+W2v4kYfL8HOEIz0 vy68yu/dk2u8fe087W3PWfDuuWev2BurHzVCuY5IpkKSROOqsp6Gsm/8TQ6RqGvy6hcyPZafFBI0 SQcxh++7PzZ/DFUvhdpktnZ6jdzRawn2yZXVtWlV7hwq4yygDb9CT0rL8XaXe3U/jLyrKeVLmGzW LbGSJcEbgPXHetp1J8kZLf8A4DOKnhMMsZUot+5p1XWUb6+Sb1379UdJ4e8a6ZruptYW8N9bzmMy xfarcxCdAeWQnqOR+dX/ABbrP9g6FcX6wmeZdqRRA43uxAUZ+prP1S0nbxp4auI7eQwww3CSSKvy plVwCe2SP0q1430mfWPD00FkVF7G6XFvu4BkRgwB+uMfjVNz5Jd0czp4X6xRaVoSs2m7295p66dF f5mDs8e2LR6hPc6dqMZYGbTIIfLKqTzskJ5K+/Wl1HxwujeJtWtL+K7uYYkhaC3s7fzJVDKS7Nj+ EHHJ9ahn8W+INUg/s3SvDOq6fq8mEa5u4l+zQf3mD5w+OwxzWtodjcQ+MvENxcQuVlgtkWcpgSlU O7B+vasrt29k3v116M75QjFSljKcLqLsotJ/FG2113s92r301Jf+EhhutS0KSxvM2N/bzThBDnzQ qgg7s/KRnpjms/TPiVoeo3dpDDFqKRXTiJLqS1Kw+Yc/IX6ZyKx/Dul38EfhESWVxGLe1vUkDRke WW+6D6Z7VINKu1+GGgWi2M4uobmB2hEZ3piXJJHbjmiNSo3fp/wxUsFgotQlrryp3St71RXemuy/ 4axua54/0rSNRntHt9SujbY+0y2lq0kcHGcO3bA5+ldTbTxXVtFPA4eGVQ6MOhBGQa8b8ZWWpX+p a/ZajpHiPVJpnb7AkEnl2CLt+RyVI+cc5znPTvXofh6+bTfDvhm1vLa68+5jjtzmPBjcRkneDgj7 pqqNWUm+fy/Ewx2XUaeGpzo6ze+qd/dvdde/RfMwLjVfEes+I9RstK1vS9H+yTGCKznhEk04ChjI QTnac8YHQVut4nfSPDVve+KbVrbUHcw/ZbYea00mSAIwOuQMiud8RX+NRmg8U+B7rVnjdha3mn2g nVoj0ySco3Yj2zVaHTtb0rRfD2qT6bc3n9m3Uz/YA3m3EVu4KoBk/M6jHGf5VnGco3s3+PddP8tD rlhqVWFNTjGK0tblTfuvaSd3d2vzLRvfobeo+Norzwhq1/o3n21/ZbQ8F5BskiJYYLIexB4q7rHj fTNKv1sJlu57lY1edreAyJbBhw0pH3R3+grlNTg1PxDZ+JdZTRb2yS5tIbW3tp4sXEpSTczFBnHX A9hWnLcaj4c8Q6sqaDfalFq/lvBNbqGVHEYQpKT9xQQDn0J9KHVqb/o/Pp56EfUcLblSu1d25le9 oac3XlvJ/L1Om8Dalcav4U0+/vHWSedCzMgAB+YgYA9gK3a5r4b2txZeCNJtryBre4jjIeJlKlTu PGDXS12Q+FXPDxyjHE1FDbmdrbWuem+Ef+QBbfj/ADrYrH8I/wDIAtvx/nWxXy2I/iy9Wfu2T/7h Q/wR/JBRRRWJ6RkeLP8AkAXf0H8xXmNeneLP+QBd/QfzFeTatPNbabcT2yo00aFlVlLA47YHJNe7 ljtRk33/AEPyfjuLlmFOK6xX5st0VxEGt+I28Kz3L2Ua6mr+UsLRNvJPAOOnUqc5xjOa6Xw9dXV7 pMFxfRrFO4yUClSvsQe/r2r0Y1FJ2R8hXwc6EXKTTs7aP+tDSori/G/iq60XU7SCwiSaKBfteokj JjttwXI98nP0U1t674l03RIbSW/lYRXRIiaNC4Yhd3b1HT1pe1hq29v6/wCB6j+oV+WElG/Pe1t9 PL019DZorim+Jnh9bA3JN7lXKywi1bzYcDO51/hXHc1r634s0rR9PtLyeZ5ku8G2S2jMjzDGcqo6 gDmj20LN3HLLsXGSjKm7vRab2N6iuXj8caVLoU2qQx30kUMohlgW2YzRsexTqOOazW+INhqWl6wd La7s7qwhErvd2bYjyQBlep+lJ14Lr5/qVDK8XK/7tpJ2emz0Wv3o7qiuQ1fx9o+j3bWN2bya9jjS R47e2ZztYZ3cdquan4z0bT9IsdReeSeG+ANslvGZJJRjJ2qOeB19Kftoa67Ef2divd/dv3ttN+un y1OjorD8LeKNN8TxXL6U8rC3cRyiSMoVYjOMHuO9R+I/Ful+HrmO31FpvPljMkccURdpMEDCgdTz 09AabqQUeZvQj6niHV9hyPn7W177HQUVzH/Cc6H/AGFHq5uJBaNN9nYGM745MH5WXqDx0+lQXnj/ AEe0sbO4lj1DzLsM8dqtqxn2AkFynULkdT6ik61NfaRostxcnZU3vbbqt0ddRXOXPjPRIPD9vrBu WktbghIVjQtI7/3AnXcOcjtisjTfHdvc32s3Tu39kWVtDLt8kiZGYkMGU856cUOtBO1/6tccMtxU 4ykoOy02e90ret2d1RWfcata29/p9nIX86+DmHC5HyruOT24NYWp/EDQtO1aSwnkuGaFxHPPHAzQ wsezuOBjjPpmnKpCO7MqWCxFZ2pwb0voul7fnodbRXnf/CeNc3fiu3haS2XTo1eCaW0ZlXHDE8/N kngdxzW3rXjfStDa2gvGubi7khEzR2lu0jKpH3mA+6D71Kr02r30/wCH/wAjonlWKjJQ5G2+iT7J /kzqaK5nVfG+h6bZaddy3Ek0GoKzWzQRmTzMAHAA5zz0q/4a8Q2HiOykudOaUCNzHJHNGUkjYdmU 9OOapVIuXKnqc88FiIU/bSg1Ha9tO356GvTov9Yn1FNp0X+sT6irexzx+JHsSfcX6UtIn3F+lLXx x/SEdkfEfxI/5HXxAOVcXjlfzriL2Rpj5nJljHOf4lr1bxdouk6x461tLrV7yyZJ5GaWOBXVTu6H LDj6Vx9x4e8OLfCG18daaJV6rdW7xA/8CGRQM86tpjDcyCP5WbOATwauabb3kqxzQxTB16OnXI6E VNqmk26Xcyw69o7RxPlWWRjv9xx0+tdB4X0TW309bmxijuLWRiUkVsA4OOKLgY9zc6quI5Y5FCjG GIzn+8festWuDKrXLkkHgsa7PWfCniK7uRL9i2nbgkGs6bw/fWluwm02ea5UZO6Msn5d6WgGBfzZ vCVPIAq/4V8mbXrK1urdJI5pAh3MeuMg4qMaTe3cxabS54OODHbsKuWmjXVrcQXFra3olgcOrMh6 j2xQ9rDR7T8JtQ03w140LXkVvAL23KQXABLxuTjyx7N612XxO1W21HUtFhs5/NmikcOEJBBJGCT6 da8A1i01u919lt4JXtnKxs4/gBABHtjJr6U+G/hDw/b2mr3GZL69t/LjPnniAiMEBADxnIJqqUml YicU2eafGAieyjExA8xhG7EbDt34wfoBVjV9PsE1a9jtGjKIUjibfuJAjXnrz3rC+Lbm5GoS3DNI yodu48A54q94ZhWXSbOS4VZJyiku4BYnHrX0OVUXzc/kfJ8SYpRoqCunf9P+CJ4OsLax8U39hC5G LOKUByWZysoZj9TmvaLWX7Raw3O0osqh8HJxntXMeArCyuYtRuprKA3SXHk+fg72TaDgn0zXB/FL XdTsPFV7YWF/cW1oioRFE+ACVBJ/OvNxzj7eVl1PYyrmeEpuTu2k/vPXjrmmxyeU2p2iydNplFcx 8Qtt5qnhnSGZo0u7xriZ4jtYxRRkkcdQSRXznqFtELG6n/jCEkk13/gjxK91aeAtNlc3eoA3MauW 3SIhAA3HsBzXFzHpcvU5/wAf+LLPTPGWo2E+nx3E1iDb+YkSqjnGS5ToW56mtP4dp4ckhsb621JL HVbJWuI5WgDSZUE4z39K5D4sWDf8Lk1yMRzBJLjJcA4OVGMGtzQvhL4mvrqM6fpdxblertMiqB78 mnz20YOPY6qb4r+IZ7OZbm9lMcbb99uipI/ohb+EfQZqPwv8WNSkabdcSXMaOolhugGZAxwGVx1X tzT5fAGq6frU2lTxC/aGzW6njscZTexUcN948VyOuWFpoF61n9muLGWcK873SfOVByFCDoM85PWo 0HqfRnh7WoNZtTKigOvDoccVPr1pFf6Y1vPOttAHV3cgYABz34rjfhSIrnR5L61mMsTuY9xGMsOv FbXj5wPDwVujToDn8ai+lyjmdU8caF4YuPsXh+zWS6dSWuWUAY6Zz1P04Fcr4p1yx1TRU1jVrts2 x2OpbLFmPykL6fSsvxHa6fNdRzzaxYWuE2ESMCTznisuO60CGF7eXWre4hbqoi3g/mKy1l6D0DS9 c0TVNaji0+C5knUB9zYBPTJIA6dK+k9M/snT9KMs89rBGkWWeSVVA+tfOuna/wCHNMLJplu0jkYZ oLYKxH1qxd2mi6l4otrTWPLE9y0cRhLkMVPQY7HFV70bXTsF09me6W0tn4nuIBp9wl1p6y/vriM5 jAXkjd0rzDVPHelan4z1SYXLK0c/lBDGSEVflUfpUPjfTofC8FhYeH5Lq0tJN7vCLhihIPp0pfBt halTcNawNO+53kKAsxxnJJolJXsBJaalb6b4fv7y2nhF3fg26whw8gQnljj7vfik0lTJbeWvBddo x78Vw7zK07bQBlz0GO9d1oDALCeh3Lz+NRuBx+sWN1DqM9uLubbA3lEE8nHc1ZsrOOysppiSSFZ2 J6k4qTV7hH12/wB7/M07E54zyam1JQ+liFGBa4dIRz6nn9KhAe//ALO8Yi8AKn2ZIJPOLOy5/eEq p3H35x+FeoV5t8CLMWXhe9jWWaRfthx5r7tvyKMD24r0mumOwHC/EL/j+tf+uZ/nXJllDBSwDHoM 8mus+IX/AB/Wv/XM/wA68W1yPVv+FqaPJDd2y2QtJm8toiW2ApvGfUnGD2xX02Eny0Iab/8ABPxb PsMsRnGIi5Wtd/dFOx31NkkSJd0jqi+rHArzUeJPFf8AZf8AwlJSw/sDd5n2AKfP8jO3fv6bsfNj 8K7Lxfpy614V1GzAyZoCY+OQwGVP1yBW/tbwcorY8argHQqQjVkrN2bWtmrXT81f07M15JEj2+Y6 puOBuOMn0pWdVZVZlDN90E8n6V5b4iaTxfp2lRx+Z51rph1TCn/luMBB9dwatqwvF1/xZpF8RmCx 0v7X7CSbj8wFP50vbe81/XW/5M2llbhT55S1XNdW2t8P/gTO6oJABJOAK8zXxJ4rGlr4pZbD+wSw kNgFPniDO3fv6bsfNj8Kvy6lr+p+IdctLea0h0jTyBIXiJklVot21TnA+p9aTxCtomJ5TVi3zSjZ Xvrs00mtt7teWu53aOroGRgynkEHINCOjlgjKxU4ODnB9K8v8P6lrcui+HND8NNZ20504Xc1zcoX VU3FQoUdye/tW78M2uXPiNr6JIrr+05BKqHK7tq5IPoetVCtzy5Uv6QYjK3QhOcpL3enW17Xa6X+ f5HZiRDIUDqXUZK55A+lOritHA/4Wt4hOOfsNt/Nq7Wrpz54383+DaOLE0PYSjG97qL+9J/qFFFF Wc4UUUUAFMeNHZGdFZkOVJGSpxjI9KfRQCdgooooAKKKKACiiigD03wj/wAgC2/H+dbFY/hH/kAW 34/zrYr5TEfxZerP6Ayf/cKH+CP5IKKKKxPSMjxZ/wAgC7+g/mK8xr07xZ/yALv6D+YrzGveyr+E /U/JePf9/p/4F+bCqd/qCWU9rG8NxJ9ocoGijLqmFLZYjoOMfXFXKYZEBYF1yvXnpXpPyPiYWvqr nmdj4Pv/ABMdQ1q+1jVtKbVGK/Y4cKBAuVRXDDOSMnH+1Uel2l+JfDOmX9pcSvoupPB57RHa8QjP lyZxjoQM+or1FHVx8jK30OaUkKMkgD1NYLDxjZp9vnZp/wBerPXec1ZXjKKt0W3Lo4rW13o7a+Rx EVlN/bfjqQ2smJ4I1jYxn95iAjCnvz6Vzup/2lYeGPBgki1qGwjtFW6Glw5uVk2LtU8blUgODjHO PavWqKHQ0sn/AFdv9SKWauEk5QTSt+EOT/g+p4r4ev8AUfCuieJJ9N0LVka5u4vscM8TzSIjJ/rG 7t0yVzwcA1opdwXvgjXNN07Ste+3vB501xfWbI1zIWGTnnJ9F7CvWaKn6s7cvNpa2x0VM6jUl7R0 veunfmevLa1++3fd3OP8OWckfjLXLiW3dVe0tUWRkIDYQ5APfB61yukJeeH7LwvrE+k311bWkFza zQwQlpoN8mVYJ1IO3B9iK9arB8UeGYNfNvIb2/0+7t8iO5sZzFIFPVc8gg4HanUpP4o76/i7meGz KLqWrK0Wknu9FBx/G/y7PYwPhldtqGq+Kr1rGWxE95GwhlAVwPLHLDsTwce9QeMr86V8RNHvv7On 1BIbCbetum+WMFgNyr39DjnBrrvDWg2vh+xe3tZJ5nlcyzXFxJvlmc9WZu54FSy6RBLr9vqzPILi GBrdVBG0qxBJPGc8U/ZS5IxT1QSx1D65OsleDi4pa/y8vqedrYXl/GuqSaZcW8Woa/b3SW0kfzpG q7fMdR93JGTnpWzr17N4a8azaxNpV9f2N5ZpbrJZQ+bJE6Mx2leuCDnPtXeUU1Q5V7r13/CxnLNe eXvwvGzVrvbS2vlZa9ep5PBZalp9tp/iOXRp2iTU7i9k0+JQ00UUqhQwXuwxkjrzTbi31DxA/jK6 ttHurT7dYwG2SePY8xXJ+bsDx06161RU/VlblT0/4FjX+2pX5/Zrm6O70XMpWt11W+9jzex1a78Q eKfC88ei6lZ2lqs6yy3cJjO8xgYA9Pc9ahstV1Dw3DqOgr4dv77UJrqaW3mWHdbTrI5YNI/8OM4I PpXp1FV7F3vza/52/wAjN5nTfu+yXIltd7ptp33+07r8jy3XlvBN41sHsLt5ry0hlhkigZon2oFZ Vb1z0HXFWm1Cfwl4ivby70XUb221G2t/KlsoPNZGjTa0bjqo7/jXpFFL2DvzJ6/8P/mH9qpx5J07 xas9Wr6RXy+Fd+p5l4e0a9tL3wi17YGF1mvrl4lXctt5nKqSOAecV0vhi3lh8VeKpHheOKaeFkYq QH/dAEg9+mK6iiqhRULW6f5WMsRmU6/NzL4lb/yfn/4AU6L/AFifUU2nRf6xPqK2ex50fiR7En3F +lLSJ9xfpS18cf0hHZHwZ8bQLrxJr8FrEzTDUHLYHoa8plsZYT/pBWL2Y817J8QpsePPEash/wCP 2QD868v8UFZb9jvVRxj8q0kla5Mb3sZSLbocmYn6LX0p8BPiJoT2Hh7wZPo929+8jQrd5XyyWYtk jqABXzSq26n5pHb/AHVruvhRqOm2PjGyvryeW0S1DSJKRuUtjgEAZ/Gsmros+4JdFslPEaYqrcaX ZRoztEqxqCzEDPA615Vb+OdAdxIdfsZWzwkpZPzzina54006y0u4v7fUoJ1iwfKspwztk44XdzWV guUvil8TND8NWUUXh0Qajqk43fMCEgXplgcHcey/jWb8JvG1z4ltr668UDSrKxhdYreRVKNJJ1YY 5yAK5Lxj4TuvGvie/vYDJGslnbTxTyH5SzDBXPQnGMjtWn4Y0LVfD1qLG7tNN/soAsUnlTcZD1kD Hn8KpxVtB3Oo0HxLo8Op6pp15DcxhJ5J1uVXdG6MeAMcj8a2NA8dLbS6jZWHJncsXNttM6BQAzOR 94DAx6CuTvLvwqkTjU7zR8SEM8fnb9xHQkL6dqfouqeGry5Nt4f8hpQhZjDAygD/AHjXVgaaqV4w ktGzgzSvKhhKlWm9UtDH8dJcXlpdyeSduxnc5645xiszwx4qv7jyrKKwtdwCIhaRlGScc+ldn4hX /iRahx/yxb+VeUaZPcabcm5tYVnYLgwupZX+oAOa+hxNN4SP7h209fzPk8trwzZf7bFS1t2/Kx7f 4C8TX01hHaaToyzXt2ZL1vMuMR7FfY2MDIPHSuD+MVymn63qN3q8sUeoyqHjtIEdxgBRguQAD34z Xnd3Nq8LNNZR6jp4B4NrHKu0dwCccH0qO58ReItQ099O1XVLy4sCo3RXjcHByOTznNfOTqSm3Ke7 PtKVGFKKpw2Wi9D1/QvhZda14ctNQXU7eOO9hV/KkiLbcjOMjrVvwh8OJPh9q1x4j1y6gvLazhMd utsCGBc4YsD19ua800H4oeJNGt0soNaLW8YCRo2G2DsBx0ra1T4j+I9S0a40/VLiRY53Vg8dshIU HJGcVy0pVvaS9oly/Zte/wA/+AauKt7p6nr/AIZg8cLb61o9wIbhhs2TrjlTwa8B1e+ltdUlX+0V e4V2jMltvRgV45wa9I+EniDxVql8dD8P6hps7Rq1yDdQBQqAjOSOScnpW7B8Br06hcXtzq9lDNO7 SSeTG7DLHJxnFbtpiSaPJYvGXii1Cy6fquoiedFgklBy/lp91cnnuax7yfV9SvZbjUor64u3bLyy fOX+rGvou1+ClhHzda3dyHuI4lT+ea1Lf4T+GoOZft9wR/fnwP0ApDuY3wn1bRtN8Madoj36NqTO xKhCA7uc4H06VtfEkhfDrg93x/46a0tP8G+H9KuI7ix0yNLiI7klZmZlPqMmue+Ltz9n8P257vPg D1+U1E9gR8t6/GBfxhlz82OQKtx2Pm3flwopw2OOlOms9T1XVFe20q6aNGLBmQqGOfeuz0vw3fLf Gd4o4o2O7azcj24pqThHQTSZ2/hjwhpkPg6y1K6tv+JiZeWViFI3cZH0FctcQPL8XrPfaybxcw7j 5Z+UADBJxxXfxahs0G104DBiwWfsTz/jUX2uQ3CTLMyMnTZxn3Pqahz1uxpW2KHxYkP9qaaioz7o m+6M96seGY1t7JluMwy+S7BZFKk/KfWr0WozRXAuFnkFwF2iTPzAegrO1jXraGRDqlvc3skgOHEn Kj8ahNOQzyVTe+dvNhdj5ic7ODzXZ6XrcEMKrOlzCRjkxHitAar4b6m31OH6OD/Wnz6vojWcwtLi 98/adiypwT6Zq7ATP4k0uUHzJIZD6ywnP8qwtXu7DUNRsYluYLeFd0ryQgpgjgDNZt3qN7IpWKGI H+83FZ0iTST+bIVLbduF6YosgPp39m+dJvCmq+VPPOqagy75Tk/6tOntXrVeO/swhh4M1PcAP+Jg 3T/rmlexVpHYDhfiF/x/Wv8A1zP868z1vQ7u88RaTqtjexwfZFeKaKSLeJY3IyAc8HjrXpnxC/4/ rX/rmf5153rniKy0a4tobtbgvcMFQxxFgTg9+546DJ5HFfS4Xl+rw5j8Vz51lnVf2CvL0vo42f4H LDwFqXlnSf8AhIH/AOEW83f9i8gebszu8vzP7ufbpxXoIAAAAwBxisWfxNYwaxBpjpd/aZl3KPIb /Z9sn73UcDBzjFRaB4rsdb1rVdMtknjudOfZJ5igB+cErgnIH4dRW8PZwfLF6v8AT/I8rEvG4mHt KsdIq+yW7tzOyV23a7epD4S8LL4futVlM4nW8lzEuzHkxjJCdeeWY/jSeC/Cq+G4dQja4+0i5myh K42RAYVOvYZ5q3D4mspvFs3h6NJjeRQCdn2jy8Z6ZznP4VtGRA+wuu/+7nmnCFOycemhGIxOL95V X/EUW/NLZnn6+AtS8saS3iBz4WEu8WXkDzdmd3l+Z/dz7dOK6Wx0Jra916fz1YamVKqFx5eI9vPP PrWjb3wlvry2ME8Qt9n72RcJJuGflOecdDVkyxhXbeuE5bnpSjSppaDr4/FVPdm9+ySvezu7LVuy u931OIbwXqFrY6O+i6yLLVrC3+ytOYA8c0ZOcFCex5HNbPg7w9J4fh1BZr1ryS7uWuWldcMSQM5/ EVo6Jq1trGkw6jbFlt5QSN+ARgkc8+1SalfrZafLdrDNdBMfu7cBnbJA4GfemqcIPnQ62LxdW+Hq bt2eive97XtfR9L2RWttLeHxHealm32XEMcQCw4kypP3n7jngdq1aYZUAyzKv1OKcSFBLEADua0S UVZHDUnKo05dkvu0FopFZXXKsGHqDms681i2tdT06xYO8t8ZFjZMFVKLuOefShtLcUKcpu0V3/BX f4GlRSMQoJYgAdSazYdZtpdcuNLUP50MC3DSHGwqxIGDnrxQ2lZMIU5TTcVtqadFIWAxkjnpz1qC 9u0tbWaba0pjRm8uPBd8DOFHc0NpK7JUXJ2RYoqC3uUmtYpmDQ+Yivsl4ZcjoR2NTFlC7iwC9c54 pg4tOzFopqurfdYHvwadQIKKKKAPTfCP/IAtvx/nWxWP4R/5AFt+P862K+UxH8WXqz+gMn/3Ch/g j+SCiiisT0jI8Wf8gC7+g/mK8b8Vaynh/wAP3upyJ5gt03BM43HOAM9hk9a9k8Wf8gC7+g/mK8g8 RaTDrui3em3LOkVwm0snVTnII+hAr28v5vq8uTf/AIB+V8a+zWaUfbfDyq/pzO/4Hn/hzx1qFzrN tp95qnh6/e/DJB/Z7uWt5ApYbwfvKemR6e9cPLoOtTaFqV/M+kNLf6qLS5kxNvl/f7Sp5xs3Y4HO BXqHhrwlq9lq0Fzqt/pjw2+Si2VgkLSHGMu2M++Bjmpv+EQuP7AOn/a4t/8Aav8AaG/YcbfO8zb9 ccZrWVCdRLn8/wA1+l/kccMzwuErf7O4pNxvZPo230W2nTz3MLS74+E7XW7TT9NshexTWlnDHCWV JZnjA5LE/KCT+FW9bm8UWvhjW18UW+kXtt9l3pJbb1XduA2OpIJz1yD2rV1Lwe9++us175Ml7PDc 20sa/NBJEoCk54PI/KqUvhHXtTstR/t7W4bi7ntjawLDEY4YwSCWK55bjGfSrcKlmrPZ9rdf6/pn LHFYWco1Zyje8XJtScto/C+lne+v36Gb4k8b3dpq39mabqOg6WLWGMyvqbN+8ZlBCoo6ADHJ9far 93401C88JaHqehW9rJeX94to0UjFow2WVsMO2Vzn0p2u+CtQk1Rr/RbvTklniRLmO/sxOpZFChk7 rx1H0rUbwvMNM0K1F4sj6feJdSyNEE8zG7ICrgD73H0qlGs3JPv+vT5Ezq5cqdJxSbW+/Z3vp1la 2r8rGTb+KtZ0Vddg8URWVxdWFsl3E9kGRZQxKhcNyDuHX3q1YzeO0WR7+LR5Emgdoxb7t1vJtyoY E/OCeDj61e1fwourarqk11MBa31gtnsQfOhDFtwPTuPyqlpeia3Z3kN/4o8QR3NlpsbNGkMRiDfL gvKc/MQBnHTOaOWpe0m7d7+b3+VjH2uFnBygoKTtdNPflVlFLRe9e+3TdaEln4oudTj8Lrp6R+dq IaW63KSI40X58c8HeQB+NdNpi3y27DU3t3n8xypgUhdmTtBz3xjPvXE/DaxtptY1zWrCZ5tMmmMV iWBChCd8mzPYuT+VdhoR1BrOQ6qUM/nSBdqbf3e87OM/3cVtRk5JSl1+7p/w/wB5yZlTp0pOnSSS Vr33u7u3/bqfK/NGjRRRWx5QUUUUAFFFFABRRRQAUUUUAFFFFABTov8AWJ9RTadF/rE+ooew4/Ej 2JPuL9KWkT7i/Slr44/pCOyPz9+MLMvjLxUVZh/p0nQ+9eYEg/eY16f8YiP+Ew8Vj/p+f+deYbQO oJq5iiKpjHVWb6nFaukzSRzxm3ULK7CNRjcDntzWUrqvRAfrzV2Jp9q+SrE5/wCWY6VBR32qeE9c sVY3lvBFg87pkH9awXnitpB58kAYejg1kRaLq1+2+SOZs/xSEk1oweC7+THDA+6U0yeUmu/GF9Da pZ2mo362qE4iSQLGAefl79c1Lp/iq7hhO5YL6Nj0vFDFT7HGa6nRvh1pl5p8SX800F/jDNj5Cc8V Zk+E99AAdM1G3lT+66EE1PMrjt0OWTxfdhz5en6cvp5dv/8AWr0n4Kare+JvGtvpupQ+XZOuTsXb nkdK5yH4d+JQ22VIS3qjbVA/AZr0z4KeDr7QvHljdX0qMHBQKueD17n2row0+Womn3/I48fSjOhK DWjsvxR0/wAYNLsdG8yw0+AoslmZGZnJPUj+leC3r3FlYyz2VzJaXAwBNH95QeuK+i/jIEl8Sski GRRZBSqnk5LcCvPLDQ7e7uRFNpZS3Izuk55Fd9KvOph5uo29/wAjx6+Ho4fGwhRiop20XqeJTvf3 xIutX1W7z2MrY/LNPg8OXUpXydJupyf4pM/4V9LWXhmygt0lMmmWkR6eZIAf++RzUzLoNucSak02 Oq2luf8A0Jq8fmPpD56tfBWtSAbLCKIH+92/nW1pfgbUYJ1luZIiv8Ue3qPrxivZZ9V0iLBs9OuZ yO9zPgfktUZvEFwD/otrY2o/2Idx/Ns1LkMm+DWhWuleKbi4ihigP2R1JXjqR3r1DUdc0uzz9ovo VI7A7j+leNTX93PnzbiRgeoBwP0qscEc9aOewj0y98d6VFn7Ok859htH61i3PxAlbIgsEUdi75ri HkRTjcM+nerNrpmp3pH2PT7mX0PlkD8zScpMDSvfGWrTghZI4Qf7i1z17fXN44a6nklI6bjnH0rp bfwNrcwBn+y2inrvfe35Cs/xV4abRLa2c3jTvK5VsJtAAHapd0rsDHgSa4lEcKl3PQZq3cWF1Z4+ 1tBAO5eVePqBWE8RBO5iR7mqn2dGmACgk1i6i6DOnvbOa2jicuHjlGUcAgN+dZ0txJGxUAEj1NdX 4sms7aHSkmuYUSKE7gWHtXHX11bzXsskUqtA7EpsXt2rTrYBr39x6hR7CqNxKZ8GVt5Hc9qq33iS 0sJTGmmm5kB5aeUhT+AqXT9atdUuAbsQ6eoH/LOMkfl61dhN2IjEG6LUbWxJ+VRXQWl14eW4CXY1 B4Sf9Ym1T/3zXa6Z4U8Oa3AZdF1SdnAyYLqHyiPxJxRqLm8jydrdx98YqIxqPvHj0xXp994X0qCM i4vxbzLni3c3Ab26ACuUvNK8jB3GRW/iIx+HNLmsXY9p/ZqCjwfqWzp9vb/0WleuV5Z+z1GsXhTU AoIH20/+gJXqdax1QjhfiF/x/Wv/AFzP864bUdJsNSeN761jnaMEIXGduSDx6cgc+1dz8Qv+P61/ 65n+dcpX1GCSeHjc/DuJpyhm9aUXZ3X5Ioy6RYTX6XstrG12hUrMR8w25Awf+BH868y0iWPR9but dlIS3XWbuyuXPZHVCpP0dR+det1lzeH9KmsbuylsYXtbuUzzxkcSOcZY+/A/KtKlJuSlHRq/33X+ Rw4LHqipQrXakkvl1tfyenmcL4WjceOtNvJ1xPf6bcXkn/A5VKj/AL521wWvRRy2jeJbWGztZTfA xXNzfvLfT/vMAKq4VMAEYIPFfQA02zF/Fei3QXUURgSTusZIO0e3ArGk8DeGZbu5uZNFs2nuc+a5 T72Tkn2Oe4rKeGbSUel/zPVwme0aVX2s09ktOybbW60s0tb7bdVxPjKMzxeOY97IZG09dynlc7eR V2TwppGi+L7fT7C3dLLVNPuEvImldhOV2kMxJznk8jHWu6n0LTJxdCazicXXlmbOfn2fcz9MCrUt hazX0N5LAjXUKskch6qrdR+OKf1W7bdv6v8A5nKs45YKnBtKzuu75IxT36ON126anjNvZ6bH4B8N aZa2K3J1C4kkkga+NvDIy5z5rck4GCFGOlVNJjaw8O+ONMWWyeC2ktiq2Lu0CMWG4LuJOeOfevWZ PBfh2Swlsn0m2a1lm+0PGQcGT+914P0qW38JaDbW01vb6XbRQTRpFIiLgOqHK59cHv1qPq0m76bW /C3Y7/7focsk+Z3lza/41K/xb293Rer6LjJ/CmleJPGHit9Yie4WGO3EUfmMqo3lffwCMn61j65e Xt14D8F2siC+hu2MVxFNdfZ1uNqnarydgSOnfGK9dh0+0hubq4igRZroKJnHV9owM/QcVWl0DSpt FGkS2MD6aBtFuwyoGc8fjVSwzs0uv463OKlnSjKHtE2o8tl2tBxdtVbWz0avbdM8gtDf6RoPie2t YbfSLMQQubaz1H7S1uGkCvIDyVyuT+Ga3rPSfD+jeO/C0PhqZQkyTyyQxzGRW/djEhyTgnp749q9 A0fw/pOjWUlnpen29vbSkmSNV4fPHOetV9J8J6DpEscmm6XbW0kbtIrIuCGYYJ/KnHDyTT00t+d/ 6/q2tXO6VT2luZXvttK8OW8rtvR6rV7vXvi/EtIbltAsdSmaHR7u+8u8IkKK42MVRiOzMAK4y+sd N0+48a2Why77KDSI9sayGRYTuJKqTnjvjPevX9T0+01Sxls9Rt47i2lGHjkGQap6X4c0fSkZdP06 3gVovIYIvDJknB9eSaKmHc5Nq2t/X4bf8E58HmsMPQVN3uuityv3lK789Lbbdehyd/qVlda/4Eht rmKWU75NqMCQvk9TjpWVDoVjcReN9YuYjLfW893HbuzHEKmPnaM4ycnnFd3pfhLQdKkjfTtKtrd4 5DKjIuCGIwTn6VeXSbFIL2FbaMRXrM9wvaQsMMT9RROhKpdytd3/ABSX6D/tSlStGhzJWt0TfvuT 2fVOx5va+HNO8SeJtNg1iN57WPw/bt5HmMqs27gtgjOKoWscFxpXh/QtWuZBoZ1O7tpA8pUSLGSY o2brj8e1esWul2VrcrcW9skcywLbK46iNei/QVzvi7w9NJov2TQtO0y5t3maa4srwEJMW5JDDlWB 5zUzocqckr738/eT/I6KGbqrUVOUmo6Wu7crtJXXRPVNPTVK7W5jfDqx0vTfG/iez0KbfYxR24VB IZFiOGyoJJ4Hp2r0iuL+HXhm50P7fdXtrY2Ml0UVLOzyY4UQY+8eSSSSTXaV0UIuNNJq3/DnmZvV jVxTlGXNZRV97tRSf4+vq9wooorU8w9N8I/8gC2/H+dbFY/hH/kAW34/zrYr5TEfxZerP6Ayf/cK H+CP5IKKKKxPSMjxZ/yALv6D+Yryu8uY7S2eecsI0GW2oXP5AEmvVPFn/IAu/oP5ivLLqCO6t5YJ l3RSKUcZxkHqK93LL+xlbe/6H5Px3b+0KfNtyr82Ycfi/SpNEk1VWuPsyA5/cMTwCeuMdjznA7kV r6bfQajaJc2pcxN0LoVP5H+fSqqaBpcdg9ilnGtm8glaEZ2FgQen1A4q5ZWtvp9rFa2qCKBBtjTP QegzXox57+8fIVnhnF+xUr3622/zOTv/AIh2NrqN3Zx6Pr121tKYZJLWyMke4YyAwPuK6TQtUTWN NjvI7a7tVckeVdxGOQYPdTXnul6br93qniGTSPFcekW39pyj7O1lHNltqZbcxzzxx7VqeMbeez8K afeTakLvxDYzL9kuEjCfaZiceWUU4wwOCPbNc8Ks1Hnkvy/DVnq4jA4VyhRpNKTsvtNq66pxStfe zdvM7DV9Tt9Jtknu9+x5o4FCDJLOwUfqavV41qmi6XqvgSwvdQZ7q+n1SI3sju0bLK0gSRCAeAo+ UDsBmui1fw/Zaz8QrewvfNfT7fSkkWBZWVXZZcKWIOTj0q1Wk3stX38r9jOeWUIxs5tNc3M+X+W2 yv59bHodIwDKVYAgjBB718/XUepapJq2snRWmv7e6mSPVDri2/2TYxCqIicAKAOD1znvXY/2HB4q 8W30WutJJD/ZdrK8MMxRGlIPzZU845x2qI4lzV1Hf/Jvt5f8E0rZJCguapV0S1sk2mrbJS8+vK/I 9PjRI0CRqqIOAqjAFOrxaw0xY/DvhbxI11eSayb+C2Nw87HMJkKeWVzjG3vjNZepxahq+oa7qjaK 91e2l3NHFqR1xbb7GI2O0CMngLgHnrnPeh4qy+H/AIbR9vP08y4ZDGc2va6JtNtJe8nb7Ulded7/ AN099oqloc01xothNdlDcSQRvIUIKlioJwRwRmvGrfTNLn8Ka5rk+pzprOnXdx9lZbgp9mYOSqKu cHcfUHOa1rVXTdrX0b+63+Z5+Dy5YhyU5Ws0tFfV3S6rS63/AOGPcqK8zsdJj1nxpqd7qayyzWVt aXMNv5jKiz+XncQDycgDBrhNMGqTWVt4kg0fbqbyrI2sy66gDEvgq0RIAH8G3rjis3iGnZx79+jt 2/rudtHI41br2tmlHeyV5K6V3JXXdpN9os+h6qQ3yy6lcWQguFaFFcytHiNt3ZW7kY5rzifSNG8S a34lu/FV1Mk2mz+XCguWi+yxBAwdQCOScnJz0qK7Jv28RpY6uYFn0uzWG9u3Me4EkAucDBYcZwOt DxDte34+T+7YzhlUHo5u9lf3dFdxtZ3d9H2Xlfc9WJwCfT0qtpd6uoWMV0kM8CyZxHOmxxg45Hbp XmfwziGi69c6VPpFzpNzcWfniJL8XVvLtODIMklGORxnoKp6ZbW+tWPhHRdauZU0q4t7mZ4hK0Yu JUk+VSwIPAJbGe1H1hu1lv8A527foVLJ4RlKLnorO9k9OWTdkpNP4f5vmtT2KivF9Ut0i0bXNB02 +nOl2uqWcVs4kLNBvILor5ycH34zXUeH9EtPC/xBFjpBnjs7ywaaWKSZpAZFfG/5iecGqhXcpJW0 /wCBczq5VCnTcvaa2bS5d0lGWrvo7S2s9Vv1PQKKKK6DxQp0X+sT6im06L/WJ9RQ9hx+JHsSfcX6 UtIn3F+lLXxx/SEdkfCHxU0C+vfGniXyBFtlvZCCzYwM1ytl4FdcG6nDeyCvY/GdszeLtZIHW6kP 61lx2UnbFNu4WOJtvC9vDgCJT7sM1u6dpUNrgpEoz2AFb62Jx84zV2wt4IbhGuY2khXlkU4Le1K4 ypYwLxuhbb/s8Vu2VhBK4EUTt7AFz+ldLBqtrbQxmy0PTIHKBtzo0p/8eNJP4k1WRSq3jQp/cgUR j/x0CockAyDw5cOgP2CRUP8AHIBGP/HsVaTRra3/AOPnVtPth3UOZWH4KP61z9zcSTMWmkeRvV2J qDfipuFzqfO0G1BzeahdtnpFGIl/M5NFv4pttOuFn0vS0WdM7JbmZpCv0HArk2kNRu+Bmmrp6Euz 0Ztat4hv9TvGurp4/PYY3rGAQB0FZcl1NJnzJXb6tVOe6igVmmcKFGWz2FV9N1CDVLw21o2WClyz AhcCrUJuN7Oxk6kFLlbV2XiwznjNLvq1HpwOd8xJ9FGKspZWyL/q9x9WOaz0NbMzBICcDLH0AzT/ ACJ5B8sLY/2uK1kZF4VAB7UvDLlQSfakOw/wt4Xl1y8liluhbJGm8lU3E84xXa23gHRrfBuDc3bD r5j4B/AVR8Cypp9zdz3zC3iMIVWk4yc1qah400qAkRO87ekY4/OtIrQTsjStNK06xAFnY20OO6xj P51bYnHU4/SvO9R8f3LEiztEjHZpDk1zN/4k1W9J868dV9E+UVRPMj1jUNSsrNCbq5ijA9W5ryn4 m+M9GeC2jjllkMZY4RM7unSsC4m3nMjF29Sc1yniRoPNhLAMTkAAbj+QqWubRhzmZqPjhixWx04r /tzvn9BWLL4h1G5bDXLR+0QCitu38J6rrLhrXTnji/56zL5a/rW3YfDOKFg+q6mo/wCmdsu4/meK ShGPQE2zndZm+0fZCWJO3kk5rQ02OeW8AsYZpVAxtjUsK7yx8P6PbbBFYCd14D3Lbz+XSt0+ZHGI 4VCDoFRdqj8qmUooqzZ53/wheo39x5syx2ytz+9bLfkK3dO8C2sODPJNO3ovyD/GuwtrKYL5rMNv 8RNVL/xXoOjP/puowCRT/qkO9/yFZOq+hagWNI8KKuDbWkMX+0VyfzNbsmgQQAfbLxI89N1cnY/F C2v72a1sDFCwGIZJXB88+iqOh+tTTjVPEEyLJ507dAq8AfgKylKT3L5Ui9JaWdi87Ta758UilUSG 3yyA9QCP61gX0DXcyQWiyrGrZAmxkn+ld7p2k+I7WXTrCaWOFbsPHFHIgbaAuea1fD/hG88KKudO tb+FMkHzTuHc/epySSTQLsbPwc0y60vw7dR3kRjaS5Mi57jYoyPyrvax/DOrx6xZyvHbSWxhk8po 3xwcA8Y7c1sV10/hRD3OF+IX/H9a/wDXM/zrzLxxrN9o2izzaXYPdXIikkDkgRwhVyWc/wAgOtem /EL/AI/rX/rmf515/wCLIZLjwtrEMEbSSyWcyIiDJYlCAAPWvpaF/qi5XrZn4nnrgs9qe0V1zLR7 bI53xT4ju9P+HtlqUd3Da3t0LdftEqApGXK7mK+w3HFHw21a51gXk0niiz12FMIFgs/s7RN6kHkg /Snail9Z+DNCki0WLU2sxC9xZyx5lVVTkxg/8tFPQfWofCaXOseMLnxA2jXOj2i2gtFjuoxHNO24 MWZR2HQH3rZuXt/+H7b9tzLko/U6qUUtZe97vdWjZrm9LNL11OrvtWt7LU7CxnEglvS6xOF+TKjJ BPYkdKzr/wAX6XYjVDcGbGnyJDIVTd5kjjKxoByzcgY96h+Ilu7eHWv7cD7Vpki30WTjOzlhn3XI rkdW8Paje+AdOvIEu/t7Xn9q3SWUgSc7wxPlk/xAMMDvjFKpVnFyUVt+T/p/cc+CweGrQhOrK13y vW2t739Laeup2Oh+MdN1aG9do7ywks082aG/gMMix/38HqvB59qq6L4+0vVtUgsktdUtWuc/Z5rq 1Mcc+Bn5GPXI5HtXH+G9K1WU6xqOmx+KVvF0+S2tpdfmTeZCQQqJjpwDuJxntWdo2nXVx4o8M30O h+J1ktZwl5f6u7M5Uq2FC5xsBJ+YAY4z1qFXqNx899POx6TynBXq67LT3lo+VvXyb0XXpbqegRfE HR5HvMR34gs1cz3Btz5SFTjZuzyxOMAetW/DvjCx12S5ihtdRtLmCPzTb3luYpHT+8o7jIxWHpOl zJ4A1i0u9Ge7aa6uHaydjC0ymTOQfXHI9eKzvhzFqlvrMzwR+JY9DitSHh1wKX8wH5RD32gZpwq1 OaKl1V9vI5qmBwcqVaVPRwdleSs9vnd+ltrPc9I027W/sILtIpoVmQOI502OuezL2NWap6Rfpqml 2t9FFLElxGJAkowyg9iPWrlda1R8/UjyzcbWs9uwUUUUyAooooAKKKKACiiigAooooAKKKKAPTfC P/IAtvx/nWxWP4R/5AFt+P8AOtivlMR/Fl6s/oDJ/wDcKH+CP5IKKKKxPSMjxZ/yALv6D+YrzGvT vFn/ACALv6D+YryLWtVttHsvtd7vEG9IyyrnaWYAE+2SK93K2lSbfc/J+OoSqZjThFXbivzZfqre afa3lxaT3MIkltJDLCxJ+RiCM/kTVNfEGnt4hm0USn7dFALh1x8oQn19fasm+8e6NaWFjdf6ZP8A bVMkMMFuzylAcFyo6Lnv7ivQlUha7f8ASf8AmfIUsJinJezg7vt2af5q/wAg1P4d+FNUv572/wBH jmup23ySGWQbj64DYq/pnhPQ9LSzSx0+OJLOR5YF3MwjdhhmGSecd+3aqkviW3vINButLvFW2vrs QkNAWZuDlD02MCOSemKqap8SfD2m3lxBPJdOsDeW88VuzxB/7m8cbvas06EHeyX3eT/yO7kzSslR TnK1/dvLS3u7fh+BtXvhjRr231CC5sI3hv3ElymWAkcYw3B4PA5GM1bttJsbW6iuYIAs8duLVX3E kRA5C8n1/GuSv/HcOkeI9Rt9Q86W1SKCS3htrcyS/MpLMQOw457ZrYvtfims9CvNNvEFrqF1HGrG Ev5isD8vbaeOp6YpxnTvpunb8bGVTDY2MYqbfLLbe2sU/wAlb5eQah4J8N6jrA1S90i3mvgQ3mHP JHQlQcH8RWxFptpFqE19HAq3U0axSSAn5lXoMdOMmuWufiT4ft72W2ka8zDObeeRbZjHCwOPnboB V/xF400jQbqK2u2uJp3TzWS2hMpjT+++OgpRnQS5k1YJ4bMp8tKam7rRO+2m3lt+BoL4f0tdNtdP Fmgs7aVZoY9zYR1bcD1z15qlqngnw5qurLqeoaTbz3oIPmHI3EdMgHB/EGpdM8U6fqdhp15ZC5lt 76YwxOsJOCM8t/dHynk+1btacsJrZP8Ar/IwlWxeGm7ylGWvVp76/itRFAVQqgAAYAHauG8NeA9O UJea7pVrJqkN1LJFKTu+UuWXOODwe+cV3VFOVOMpKTW3/A/yM6OLq0IShSlbmtdq6el/w11KsGn2 sF/c3sUIW6uQqyyZOWCjC/lWMPBHhsa5/a40i2/tDf5nm843eu3O3PvjrzXR0U3CLtdbEwxVandw m1dWdm9V29PIwNb8H+H9c1CK+1XS4Lm6iACyNkEgdAcHDfjmrsuhaZM920tlE/2uJYJwRkOi9Fx0 wM9q0qKXs49g+tV3FR53ZbavTrp8zD8O+E9D8Oef/YunRWpm4kZSzFh6ZJJx7UX3hLQr7RYdJu9N hl0+E7o4mJ+Q5zkHOR1Petyij2cLctlYbxmIc/aupLm3vd3utnfyMa28MaLbaTDplvp8MdjFIsqR LkfODkMTnJOfWr7afatqaag0IN4kRhWXJyEJyR6datUVXKl0IlXqybcpN3v1fXf7+vcKKKKZkFOi /wBYn1FNp0X+sT6ih7Dj8SPYk+4v0paRPuL9KWvjj+kI7I+ZfEyofE2qYIB+0vn86z/3Q65z6Cr3 iZceJtVIBJ+0v/OqCsuQABupDDcp4CkH6U4gc5AHFABLdCa6Pwromr3l6k2n2khwCPMdRtGRjqeK TdtQM6Q42j0UfyqHcWbaoLMegUZNeqjwjoulo134lngjQqMRmUnnHPPU1i6n4+0vS08jwpo0BZeB cTJtA9wOpqLdQeh59Kki53RyADrlSMfnUUZ81QyMpQ9CDnNR+JfGdxrGqQadrmsRtc3DDy7NVCrz 0yAPyyawPFmuy+FXsrS3tRPLcIWjQAnABxjA570Rs3YjY6hYhwWDH68V1/wztoZvEw3wRMFgdhuG 4Z49a868PXWvauq3E+hS2VqeHa4PkhfcFuSPwr0PwVqNhoupzzG6S6lERTy7dSQCSOrHAraK5Xci UlJW21X5nI/FlMeI/EEgGMusYIHoFrlPAqBNWdlzI5iIx1rT+I/ixrvVNVVNHDsZQ371yVbkc4Ha uHTVPEc+FtttpGf4bZBHx9etdntUsOoev5nm+xvi3V81+SPZjFNHGJLnZbx4zumcIP1rJu/EGiWj BXv3uZSceXaRl+fTccCuD0rS7yW5VtYkklgP3sybnH0zW+1hp6N/o9sf9+VtzGvHqYilT63Z9bgs izDGNONPlj3lp/wfwJr7xm8ORZaFIcfx3bk/+Or/AI1jz+NNblLB7gWaH+GKMRj8+v61r0lxpOr6 hAF0jTlmd+POmwsae+T1rGljJVJcqievmHC1HCUnWniGoruvw0a1E8J6kl5DdNNO0zB8lmYsenqa vz6lEhOF49TVPQPAzaN5j6vrsEbSHLxW67zn69K2D/Ydg2YtOmvXHSW6fgn/AHa75zUFeR8nhsJV xVRUqKu36L8zIW7kvJNltDNM3YRLmr6eH9SkG+4EVlGf4riTn8hzVt/EVyU8uFVtov7kChaWxBvg 0jFvlPV2yTWKxNOTtF3O3EZLjMLTdWtDlivNf5kC6LpsfNxc3F4392IbFP49auWlvHEQLCwt7f8A 2tu9/wAzVkW8aDJkFWLbzJP+PMCQf3gRiqc29jhUUiS306a4YNcOzf7xq0NIjkU75B8p9ap30moQ wny3jV/9oE1xupXWrSuwZkbPYOQPyrOSl1KujqtTm0zTFJN0ruP4Y/mP6UzQfE+iG6/4mqXK22P9 ZFgn647ivP2S/LruhcBTngg5qy0TwxuRCRlSMbehqbMLnpOqeB9M8b25k0Px3M6LndaSBVAHpgYI /HNcLdfDHwNbObfU/EGordqSGWCFAPrnoawhv8wNBvR/7ynaa1xd3rweXcXCkYxllBb86vkb20K5 2Ph+Gfga1lS5tPEd22052zKUb8GXOK9l8LeNPC+kafb2ke8tCu0TMQ7P7k4Ga8LIgibOSzepNJLq 0MI/dqHf0Wk6bYuY9x8QeObS41rS7/TVMy2glGG4yWWud1nxrqerEo0pij/uxAj9a8ybWpLk2zMD EIARsQfLLn+97+9alpr0GxQ8bqfQdqcqTsgUj3n4NMW8P3rMSSbs9ev3Vrvq87+CN3HeeHL14gQF uypz/uLXolbwVkkSzhfiF/x/Wv8A1zP865JnVCu5gu44GTjJ9K634hf8f1r/ANcz/OvLvFfhg67e Wk6XIgMHJGCfMOeAeRgYLdOeevFfT4RtYePKrn4lxDCnPOa0asuVX3tfojpC6hwhYBiCQM8kD/8A WKHdEKh2VSxwuTjJ9BXL3nhMT+JLfVFnCRQhVMHzEOO5JzkH5Uxjj5ec5rh/iX4i0+fxLPBJq0Vn caFEtxaoxI827PzAHAPAUY/4HWlSv7NXkranBg8sWMqRp0ZN6Xej06fPVq76bnpXiLw/aa+tql/L dCGCTzDFFKUSX/ZcD7y+1a6gKoVQAAMADtXGeIPFdx/whOna3oMaSy3csASJ+Qd5wVJ7eme1Uxrf iTRry6steksLiSawnvLWa3QqI3jGSjKeo5BzTlVhBvT5/IUcBiatJRcl7rklFvXT4rLy6/8AAPQK jE8JxiWM5bYPmHLen1rzvTtf8VwQaLrGsDTzpWoyQwPaxqRLD5mAsm7oecEr23Y7VT0qUQy2C+TB Jv8AEtyMyJkpw3K+h96Xt1dK39XS/Uv+x5RT5pJ27aq6vddNrfjoeqUhAIIIyD1zXjN38T7pbq4v o9Y0aK1hlZV0qRHM8iK2Dl8YDHBIHTpXW3OseItZ1y7i8NtYQWOnrE0v2lSzXLOgfYMfcGCBn3pR xUJq8df6/rzCrkeJo2dW0Va93dJWtpt3a2uvPRnbW/leSgt9nkgYUR42gDsMU4OpZlDAsvUA8iuV +FZLeBNMLJ5bESEp/dPmNxXNQahq+g+IvG+qXc9tdwW8cREEcRVnYg+UN3bAOD65zVutypSa3V/w M1lrnWrUYy1g7L+8+ZR/U9RorhLDUvFWk6tpa+JXsLqz1OTyQLWMo1tIVLAEn7w4Iz7V3daQnzI5 MThZYdq8lJPZrVdvzCiiiqOYKKKKACiiigAooooAKKKKAPTfCP8AyALb8f51sVj+Ef8AkAW34/zr Yr5TEfxZerP6Ayf/AHCh/gj+SCiiisT0jI8Wf8gC7+g/mK8e8T6cNW8P39jxumhZVJ7N1U/mBXsP iz/kAXf0H8xXmNe5lsVKhKL6v9D8o45qSp5jSnHdRT/8mZ43dWmtTaLFr0enXC6ze3Elk6eWwdIn QRB2GM4G0N+NWPGejXej65Z3UEniGLTvsEdmsmiKHkV0JO11xnaQc5Hf8K9b3Lt3bht65zxS11vD Jrft+Vv1Z4Mc9nGafIrK6t5PZf8AbvQ8q0XSbuCx0CX7PqredrRu3a+w0wQxkb3CjCZx0PTPJrJ1 2+u9G8C6r4YutBvnuRJIftYiBtmRpNwkMnrz065r2oMGzgg44OD0ri3+Huly37yHUNWNgZvObTPt Z+yl87uU69ecZqZ4eSVoddPwS/Q6MLm9KdTnxSsk1JJX3TbXVd7dn3RJ4bs5I/Ges3Mlu6o9laok rJw2FOQD35rD0uwu4/CvhCE2lwrwaqGdDGQY0DSckdhgjmvTQMDA6UVs6Kbvf+r3PNWZyTvy/wAv /ksXH9TzhdNn/wCEA8XwfYpfOuLu7dY/KO6TJ4IHU57U0Xt34X126vLjRNR1CLU7S3WJ7OHzGR0T aUcfwjJzk+9ek1y3iHwZbaxqLX0ep6tptxIgSY2FyYhMo6Bhg5xzWc6Mopcm6SX3Jr9Tpw+ZU6kp QxKtGV77v+XTTVfCu/bzWR8NNRSx8GaKlxbSo97dSxIkK7ljYs7fMew4IzXoFUNM0ix03T7SytLd VgtBiEH5ipx1ye/J596v1vTi4xSf9aHn4+vTxFedWCtzNv727fgFFFFWcYUUUisGGVII9RQAtFIz BRliAPeloAKKKKACiiigAooooAKdF/rE+opgIYZBBHqKfF/rE+ooexUfiR7En3F+lLSJ9xfpS18c f0fHZHzX4kU/8JHqmA3Nw/061f8ACvhO/wBdl3wRqlspw9xJwo9h6mq/iHc3iDUlXgm5cZ+rV7Xq Tr4e8FSyWSKhtLX92McBsdfzOaQzCNr4P8Ixhb1oZbxQCQw3uT9Ogrldb+J17dubXQoY7OHO0PgN IR7DoK+ffGHirW7rxHf2VtcLHDCUMkoXdLK7jOMnjPX6AVQ0Wd7PUBc373Fy38atI2GH936UrNmV StGn8R6xqOoLJcSTapdO8+fmad8HP41lv4j06J8LHPc4/htYixP4kYrpdH+JHhS8VE1zwvaI2Avn WqAEY+v+NXtf174eRabJd2t7fNLj5bSOPDE+nQAfXNCh3JdZNXi0eIvpT3PiWTVodHuJ7tpvOSS7 lI2Ht8q46cV6Jo1t4quGUpFKZWGxRFGqY7nBxmuYfxTrN65XRrEWsWeGIBx+JpJLPXNSZW1nX71l UYEUMhVQD1HGP5VnUxFOn8TO/B5Rj8fZ0oO3fZfe/wBD0GbRYLNlfxX4hs7NzyyNcCRx+Ayf0q1p 2r+D9OaSS0Gp6o5GNxj8mNvxbn9K8+s9K0/TxvihjVu8khyx/E10FlpFzdxCYNDFbn/lpJIAK5JY 2c3alE+ko8KYbCpVMwrJeS0/F7/JF7xFr9vq1s1tb6NY2cRbd5igtL/30a56KFVbEaDcfQcmuijs dKtuZ55rx/7sQ2L+Z5qddUFuNunWkFqOm4LuY/ian2Fer/ElZHSs3ynLv9ypc0u9rfi9fwM600DU blQ/k+TH/fmOwf41cXS9KtOb2+a4cf8ALO3HH0zVa6uZ7k5uJpJD/tNxVR2VBz+VaxwtGmry19Tz q3EWY42apUPdvsorX7/8rE2oNZvcxvZ23kwoMFXbO4+pp9zqV5cKEedhGBgInyqB9BWW7l2Gemel TvPGpxuGfQU8PUhJy5FZGed4XFYenRWKqc0mnp2269Xrqx4FDfMpVulVvtBY5Tj61WuLh0Bzk/Wr 9rCTcHuedPBYjDUqeLXwvVNdHf8ABkzDBIyDTo5HjbdGxU+xrEmupArfPjPGKonUZ4X3JJx6EcVx Swbu3Bn1FDiyEoRp4qnfTV6fkbGrJqNwC0F2xH/PMnArkrvU9RsnKN5scg7ciujtNdt5MLcfunPc citGaG3vYcSKk0Z6Hr+RpxxNSjpURVXJMBmcXVy+ai+3T7t1+XkcGni/WYsgXlyB7tkU5PGWqBgW lSU/7aCtjU/C4ILWT5H/ADzc/wAjXNzaU8TlZYmRx2Irvp1YVfhZ8rjcsxOBlavGy79H8zes/HNw rDzrKF/90la6bSvHljuH2iznT3UhhXnsenkY61citGAHBrVRSOA9gg8ZeGZ7OZZJFWUxttEkPOcc civNjqrOAsanPq1VILAA7sDJ9avRWqBeUFOwEEm+XBkfPsKckYBwBV5YIsDGc1MsBHb86YFNYjgH FSxxk9yP61Y2MjHjNO69UFAHvn7PC7fCeoAnP+mn/wBASvU68t/Z7AHhXUMf8/p/9ASvUqAOF+IX /H9a/wDXM/zrlK6v4hf8f1r/ANcz/OuSd1QZdlUepOK+nwX8CJ+GcUf8jav6r8kK+4o2wgNjgnpm sHw34bt9K0zyrtYby8lkee4uHiGZJGOSec4HQAegp8HiOG4aVYLS7kMV+bB9qA7WHVzz9z3/AEra 3rs37l2+ueK3XLP3l/XU8l+2w8XTeidvw2/M8y8XeHG0vwxNYLdt9hudXhltljXa1sHcEgHvhskV pT+G9QtbLWNU1/WDql3Hp80FtiERLEhUknA6scDJ9q7p3jBUOyZPQEjmldlUfOVAPqaxeGjZ/d6a WO3+1q/Iovu23ZXd7dbXV7a236nnPhDwpqNxYaBJf65JcaJbRxXNvYmFQwcKCod+rKpJwPYelbNv 4QkiktGN4h8jVZdRP7v7wcH5OvbPWurEsQ2gOg3fdGRz9Ko3erxWlzdx3EM6Q21v9oe4KjyyOcqD n73HSqdOnDV/1s/0Qp5jisRNuOl+iS638ld66vdnIHwHqUF1JBpuurbaNJIZDCbNHnQMcsqSnkck 444zWjqvhTUG1p77Qtbk01LpEjvYzEJPMCjAZCfuvt4z9Kt+GPFqeIHi8nSdUtYZULpNcxBUYDHc E9c8V0ayIzlFdSw6gHkUo0qco6berKxGNxtGpy1rcyVn7sXf101d1u9bq5k+ENGPh7w9aaWZvP8A s4YeZjGcsT6n1rJ1DwjJfaxrMk18P7K1W3WKe2Efzq6jCur54x6YrodW1GHTNPurufLLbxNMyJjc QBk4H4VPZXC3dnBcxghJo1kUN1AIzz+daOEJe4+n/DHLHFYmEpYlPWb1dlvdS+TvZ6HIaR4S1Yap Y3PiLXzqcGnEtaQrbrFhsbQzkfeIH6k12tUtM1Bb62MzQTWuJHTZOArHacZ69D1FW0dXXcjBl9Qc 06cYxXu9SMXXrVp/vbaaaJJL5Ky3HUVmXGs20OsWGnYd5bxZGR0wVGwAnJz71o712hty7T0OeKpN PYwlTlBJyW+q/L80x1FNMiBwhdQ56LnmqMur20euQaUxP2qWB5x0wFUqOff5v0NF0Eacp6RXn8ka FFUdT1FLG1Mywy3R3KPLtwGfBIGcZ6DPNXHkRCA7qpPQE4zRdCcJJKVtx1FNeRIxmR1UH+8cUpZQ RkgZ6c9aZNhaKKKAPTfCP/IAtvx/nWxWP4R/5AFt+P8AOtivlMR/Fl6s/oDJ/wDcKH+CP5IKKKKx PSMjxZ/yALv6D+YrybVrVr3Tbi3RtryIQrFmUBuxypB6+hr1nxZ/yALv6D+YrzGvdyxJ0ZJ9/wBD 8n47k4ZhTkt1FfmzioPBk0fhefSGvizySDFxlxhDwRtBxnBYehyCQa6Tw/p76ZpMFrNIJZUHzyAs Qx9eScfToO1aNU72O9e5s2s54o4EkJuFdNxkTBwFPY5wc16ChGDul5HyNTGVsSnCpLRu/wA7eX5b HnWiXMug6/resO7HSrjVZLW9BPEB2p5co9skq31B7VYh1W40geIJ7Pyy8viBIDvGRtcRg9+uK6zS tAW3ttat71o7iDUbqWcpt4COqrtP5Vz1v4CuI/DOqaW2qF557wXdtclMtGV27A3rjaAfWudQnBJR Wy/yuj2VjMJVk3Vf8q2eqVtflaz7q1tjoJtVuU8awaUBH9lexa4J2/NvDgdfTFcVF4u8WDR7PXnt tNk0xrgWzWw3LNKTIUDg5wozjg+nvXR6D4a1a38SJrWt6tFe3P2RrZkji8tF+bI2jP5570g8Izjw dZ6L9ri82C6S4Muw7SFm8zGM+nFNxqSs9Vv+en4GVKeCotQlyy+FN2e3vczWz7a79jN/4SzWtBuN ag8Tx2M72lkL+F7PcqkFtuxt3Oc45qj4X8e3k+v2FnqWqaDfx37GNI9OZvMt3xkbs/eHbIrp9c8J LrOs39xdT4tLvTvsJRB86nfu3A9Kz/DvhHV7PVbefU9S0+S3tuUW0sEheU4wN7Y/HAxzSUaymu3/ AAXvr2sbQrZdOhOU0lNrzWtumj1vvqvuKFh4s8Rf2Jea7dw2MljGzW1vaxqyyzTeb5aksThVJPvW jpureJ9M1i1svFC6dPHfo/kTWSsvlSIpYq4bqCAeR6e9XLfwgG8Fz6Dd3R3SSPIs8IwUYyb1Iz3B x+VQaN4a1p9YttQ8U6xDfmzRltoreDylDMNrO3qccD6miMaqstdl/wAG5nOtgpqpZRSvK2ju1b3O X573tpvdaEZ8T6h/wgOmaziD7ZcyxI42HbhpNpwM+nvWX438aappXih9NtLnSdOhihWVH1IOFuie qq44XHTn1zTx4C1n7DHpja9G2kWt0txaw+RhsCTftds84ycfhWp4u8M61q17I2n6pZrZzJte3vrR ZxGcYJjPbI6+9TL2zhdJp6fl69zWk8up19XFxbk9nZJ25V8L1Svpa3nezOrs5mudOhmkVFeSMMyo 4dQSOgYcEe9eY2OvXuifD7QFsLrS7NrhpQ1xfucLh2ICovzOT046V6NoWlRaNodnplu7PFbQiJWf qQB1NcdJ4H1O3sNDbS9Rs49S01ZY/Mnt/MjZXfdkKeQwIXn61rXjNu8e36o48BUwsZThUa5eZNXT s0lO19+rXf0epztx4rvfEXgS5luYop7yy1S3iHko0Qm+dSvyvyvXHPpmuoi8R67oepS2/iuOxlhl tJryCSy3Db5Yy0bBupwRzVVPh/qMml6rbXusrPc6heQXjXIiKsrJjcAM47fL7da07HwnqF3f3F14 q1RNQJt5LSCOGHylSN+GY+rEYFZRjWWqvf5W2PQxFfL3GUYuPJdu1nfVRtyuyS9699tOmyKFnr/i uzbTdT1y3046PqEscXkW+7zrbzD8hYnhsZAOPWtCDVPEGoeNNQ0+yNjFpenyxedJKjGR1dM7VwcZ 68n2qnp/g7WzNp9rrOupd6Lp8qywQpBslkKH92JGzyB146kCum0nSJLHXNav3lV0v3iZUAwU2Jt5 9a1hGbave1/06/P+rHHia2EhzOCi5crtZO3xK2j+0o31/NlPxjq+oWT6dp2hxwPqmoSMkT3BPlxK o3M7AcnA7D1rJu9Z8VaRpRg1K10+51a5uY7WymgYrC5cE5ZTyNuDn1xW14t0K41dLO40y8+w6pYy GS3nKb15GGVl7qRWK/gzU73TrmXU9caTXXmjuILmOPbFA0edgVM9Dk57nJpTVTmdr/htp+O5GElh FRh7Rx31um5Xvo7r7NrX176XsxIPEHiLR5dQsvEFtaXt6ljJfWj2IZVlCcNGQec5I575rM8HeLNb 15bqFdS0C5mktWki8nekltIOiyRtyR16dMe9bemeFtXkurvUNe1vztTe2a0t5bSIRLboTksAc5Yn HX0FV9B8G6lH4hg1XXr+wuJrZJFhNpaCFnZxhmkP8XH6mo5ara3tr+v6W/q51e1wCp1L8vNZapOz dvspra9r6rro1oWPhIL8eCbM6jLBJuZzEYlIwu4/ez1Oc12sX+sT6iud8FaPfaDpLaffXcN1FHIx t2jjKlYyScN6nJPNdFF/rE+orqh8CuePj6kauMnUg005Nq22rPYk+4v0paRPuL9KWvkT+g47I+fN bQHxBfEYJ+1N1/3q9Z+IR2+ANRx1MKj/AMeWvKtckSLW79pGjQC4c5Y+jVa8QfEeTUdDn0yS3ik8 wAebHlcYIPQ/Ssp1YU17zO3C4DE4t2oQb/L79j511dja+I9Skz8xuyvzD0jH+NXbO4lvWCjT0n90 BT9eldlqVpbarcwSXNpFJJD/AKsBeh9T6n61ow6TcC2MvlrDCrKpzxjJwOK5njHPSlG56kuE4Qaq 5hXVNdlv+P6JnKpoETxo5kmhc/ejOGA+hq/DptlbAMY0JH8UnNdBqXh28khI02/hWQcHzIzjPsa4 TWPDPiSOQtcW8l0ufvRvuB/Co9lXq/HKyNPr2T5V/uVB1JL7Uv8Ag/okbz6laocCQN/uc4rjtU8a zC0kuNPELRtIbeBCpLu/qe2PpnqKqTWt7b7kmtp4mII+ZCMVisZJrrQS0gm8qcxOwi8sB8jgj196 6KOCpR3VziqcU5ji21dQXaP+b1/I6+HTIItMbUPFrXWqXC7S0AJ8qHd90EDHNdP4f1Kxlhki0+K3 hSFyjxQYKoR7jg565FcRqOieIUmvJ3Vb6dFEbrvzkNyuBxnA49q6v4eeGtXkF0E0wpNO4YQW65WM Y6egreSSVoo8mdSVRudR3fdnURSh+lT7TgcViTaodJvGjntpN8bFJEb5SD34Peuo8Ma/4b1G423t rdlVX50kTcv1+Wn7GoldoxVem3ZMrWdhd6lMYdOt3uJB1CY4+pqtrukX2kXCR6jD5LyLuUbskivS LjRfDOp2EcmhXNvFqO4fZ1eVlVCDyWXg8DJx7V5hcveahqAjluXv7gv5UcmMb+cAAdh7VxY1xjT5 bas+q4VoVJ4t1oytCK1877L9fkVCrFCwUlRxnFYtzJ8rK8hBP4V7b4i8EWem+G7dWkEdzFHmaUth Sx5OT6dq8M1rxHpVjJJGZVu5FONsQ3D8+lb4XAuMb31Z52f59HMKyjGPuwbSd907a/gael7fIYI+ 8A4yTU90F8hi6lgBnjrXBW/jV0vECWkUduXy6pyW49e1d5aTpdWscy/dcZx6e1efi6E6FTne3kfX cP4+hjsF9Sj8Sj1Wmrf320uc+20k5PP1ppiRj8wIIrUuVd52Ekcfy/dOMcVFJPFEvyqrv0OK7oe8 ro+BrUpUpypz0admZbafk5jb68VNbebatlZdvsO/4VKZ2l6DYPQf40RWzHJ3ZBOcVryJqzFTqTpy U4OzXVF+21XecTRkf7S8/pV2SOC7jw6rIvb2rLWEqpAHJqaFWTkHB9RXLUwUXrTdmfTYPiitCPss XFVI/j/k/wCtRsmkKhJgOR/daoxa7DyuDWlFM38Yz7ipiFcc4NQq9ahpVV13OmWVZdmi58BPkn/K /wDLf7roylhVh0470eQB0JrQa3X+Him7drYOBXZTrQqr3WfN43LcTgZWrxt59PvKkcZU/Kc/WrC7 qlIA+tNwOx5rU4RuSDSMc8FM+4pSe/alVx360Ae7fs/ADwrf4z/x+nr/ALiV6hXmPwCYN4X1DHa9 P/oCV6dQBwvxC/4/rX/rmf514j4ssdM1nx9baf4ncHTVsDNbwSTGOOSXeQzcEZIGO/evbviF/wAf 1r/1zP8AOuB13QdL16BIdYsYLyONt6CVc7T7GvosPDnw8P1+Z+M5ziVhs7rzba6XW6ulqv8Ah0eX 6J5H2C2FpcPc2w8V7Y5XO4uoBA578d+9aN2gWS58DqSgudQDoq9rN8yvj8VdfxFd/HoOlRoiR2MC IlwLpVVcASgYDj3xVhtNs31NNRa2jN8kZhWfHzBCckZ9K0hh3FJN9r+llf8AFfccdTOKcpuSi+62 +Jaxfy1v6nievW02q+JfEDXWkWN89pOYYZbnVfsrWkYUbdicYH8W7ua6S/sz4gtfANtrcq3K3Cyf aDFKSs4EfTcOoOBnHWu41nwpoWtXkd3qul2t1cxgBZJF5wOx9fxrRl0+0mntJpLeMy2mfIbH+ryM HH4cUoYVpNS1u1+Dv2/zNKueQlCnyRacU/k+Vx0959ddFH5s8Z8aaHbWuu6hcQW1hqdlZwoiQjUD bXOmCNAcR84OfvDg81t6qlrrlzrL3ELyW0/hyKcJMfmzlmXdjuDiu61fwpoWsX8d7qel2tzdoAFl decA5GfX8auy6TYSzzzSWsbSTwfZpGx96Pn5fpyal4WTUlprf8U1+vmEs7g6dNPmcoq1/wDwHbXy 3ST73ep5bp1tHokWjHR4fJkHh24uVVctmUhSW57k9qwfDVvc291oWp2enabaXU9xD5mo/wBs+ZLd Bz86sh6lsk4xwR7V7hBpNhBPbTQ2saS20P2eFgOUj4+Ue3AqjY+EtAsNWbU7PSbSG+YsxmVOcnqR 2H4VX1Z86knt/n6f5GkM+pqM1KLbkvPXWWj95aa9eb0PMNUsNFu9A8V6xq92yeI4bi5iV2nIkhAJ EcSpnBUqRxjnca9b8Pf8gDTf+vaL/wBAFVb/AMK6FqGpNf3ul2s14yGMysnzFSCD+hIz1rXgiSCG OKFQkcahFUdAAMAVpQoune9tl+F9fmedmGYQxVKMI30d9dlolaPkrafl38ah0yDV7Xw3ZXm/7NLr N75ioxUuvzfLkc4Pep9Us4/Dll4v0rSZJrLSkks3IjkbNvHIQJSpOSOMk16fDoWmQG3MVlEht5Xm iwPuO/3mHucmpv7MsvtF3ObaIy3aqk5Zc+YoGAD68VksK1G2l/8A7VK33o7Hni59m4b26X5+a/a9 tL/oea22k6DpHjvRbXwzIixSWd1JJbxTGRASgAfknBPT3x7VWOp2R+F3hu1FzEblryCMRBgX3LNz x1GMGvRdI8K6Ho8kUmmaZbWzxlmRo1wQWADc+4AqNfCHh9bqe5XSLQTzuJJHCcswO4H2554pqhJb W/pr+v6sN5vQlKLqOcuXld3a7act9f73ntbzPKvFlnHZ+JNX1uaK01aGG5En2qDUDDeWW0jMaqTh sdhjua7C+0zSbj4oaVqMtugupdNknR3chi6lAvGeoUkYrp73wnoN9qy6nd6VazX6kMJmTnI6E9jV zUNF07Ub2zu720imubMloJGHMZOM4/IUQwzjvbe/56/195NTOYTjBLmTUZRb9Ukla9rXWtuX0ueT 2WhWNr8NINWWMtqV1NEktwzEkoLgYUDOABgdKp+I4J9Y8VeIWvNJstQktZ/KhlutV+ytaoFBUonb u27ufpXsf9iab/Zaab9ji+wowZYcfKCG3A/nzVXWvCmha3dx3WraXbXVxGMLJIvOPQ+v41MsI2ko 9P67G1HP4RqyqVE3dys9bpNxslaUeita6XrseX69YXOt2nhue+fStanj08ebp9xfGIPkkCdHBAJ4 AJrufAx07WPDGh3M0EqyWbutuLqfzHSRdyHDDG8Yzg+lbWt+GdF1yOCPVtNtrlIOIg6/cHoMdvan y6FYsdKEUMcUemyb4ERQAvyFcD04NawouM3LTX/Pf5f1Y5sTmtLEYeNLWLTb02SfNorO2t7bJ23b NWiiiuk8A9N8I/8AIAtvx/nWxWP4R/5AFt+P862K+UxH8WXqz+gMn/3Ch/gj+SCiiisT0jI8Wf8A IAu/oP5ivMa9O8Wf8gC7+g/mK8V8bxvN4U1KKLUItOkki2LcyvsVCSByewPT8a9zLpctCUuz/Q/K eN6ftczpQva8Uv8AyZm5RmvGvBskfha71C1vdKutJkfTZLgiz1AXUUwjHzSAEko/PHOKyNJsZdK8 T+E9Tit7awbULkRyKdSe5urlWB3O/wDBtOVJAHBIrrWJvyq2/rprbt+djxf7BTlNKpoleLtH3tG+ kn23XNbrY98qnZXy3VxdwrBcRG2kEZaWPasnGcoe456151dgot14IR2RrjUR5YBORZvmVyPptkX8 qoeJIDcQ+JLZZZIVfXLSMNGxDIMKOD2oeIe6X/D6afK5lRyeMnyynvZp2+y3FKW/W708j2CjIrz3 RNGtvCvjuWy0RZktbrTWuHheZpA0qvgN8xPJBxXE32k6RN4Es/EsuozN4hu7iIzTG5bMrmUBoimc YAHQDjbTeIaW3rr527ahRyinVmkqj5ZcqT5dbyvuubRKz1u/8veKKQMCxUEbh1GelLXSeEFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFISAMkgD3rLvdesLTIMvmuP4Y+f8A61ZVq9OguapJJeZ6GXZT jczqeywVKVSX91N/f2+Zq0eYkRV5HVFBGSxwK4648TXl0/l6fb7c9CBvb/Co4tE1bU5Va8kKAnrK 2cfhXlTzhVPdwtNzffZfeffYfw3qYNKtn+Lp4WP8ralN+kU/yb9D2DWvidoGmL5dvJJfzgY2wD5Q fdj/AEzXBan8S/EWtTfZ9GgFsH4CwIZJD+Pr9K7PQvhTotmqSahJNfyYBwx2J+Q5/Wu403TLHTIv K0+0gtk9I0C5r5t08RU+J8q8j9pji8pwS/cU3Vl3lt93/APmVtM1C6uZGvWKzbjvMzfNnvketX7f RLdCPOdpG/Ja6DXBGdYviRlvPf8AnVML228H0q4YSnHVq78znxPEWNrLljLkj2jp+O4yO1jhCiKN EPqBUOrYg0uXz8xiSSLaSDyA3J+lWwhwQWK/hUXie5udWgT7cwm8tQM7Qu4Dscda6oJI8OpKVR3k 7vzGSPJBIIkRw7DI3IRx680kaz5zI+frxUizy3UMBdtwjQJGh/gX0HoKBGw++mfoelTYRGbcNzJs PqCM1nXmgaVdMZDaw+b2YRjIPqPetqGFp2VVGW6DA5rrdG8HvdBZLjIHoKXPyO4cvNozzRdIuXYB SHIGPu1ftdH8R24D2Ftcj/r3fB/KvbtL8MWlpgmNSRW7FbxwjEaKv0FdNDHV6S5YJW80cOJy2hiX zVL38mz5Z8Q2l1PctNr9nci4fhpJkKs2PfvVbRobPTZpJbYbi4AKuen0r6g8R6Jaa/pM1jeqCjj5 WxyjdmFfM/ijw7e6Dqk1ldthkOVZeA69mFd0cxjJWq018tDglk84O9Gq166lrUJ1FpDc22YZ2lYH BySNpB/QkVyl/wCLpvCd9bT6bBDPqABaPzQWWPsGx3PpV6EMkQV2LYJP503S9H0m8v57jWRcPJkb IkO1XHoW6/hXz7nDEYp1Uvcjsj9HnCeTZLDCSl++q/E/Lr+Gn3nCa5rvi3xteBdRvL2+dj8sCA7R 9EXimjwLqEAU6gotyf4GOW/IdK9hGrQaVbtBpFrDZRHqIlwx+p6mubv9QaVm+7vPc/Ma7XWnPTZH yUaMIbHK2/h6xtUBCBnB5aStjSp44pfIGQjdCeOaU28jksWzkfWhLPLBxlSDnJrGpSVSLizvwGMl gsRGvDp+K6on1eB5YQ0Z5Xgj1FZaWrdGJroh8yYb0wagW3CHOQc+tc2Cm0nSluj3uJsLGUoY6j8N Rfj0+9fkZ6whB1qaOLoSeO3vVzy1btzTgqDI613HypAEA4P8qdtypAGBUx9lHNHU4PAoArKwDEE9 PapE5GcmpGK5+7RkA4CjFA02ndChz6cUpCOMHB9jQeB7/WmFeegJ/lXJUwcJO8dGfQYPiPE0Y+zr r2kOz3+//O4GLA+U8e9QkHJz2qym8n2FPK+orP2tah/EV13Op4HLcz1wc/Zz/le3y/4F/QrpDu96 sJAmORk04MBjj8qkdQw3A5/GuqnWhVXus8LG5bicDLlrxt59H8z2v4DoE8M34UED7Yf/AEBK9Krz b4Ert8M3+P8An8P/AKAlek1qcJwvxC/4/rX/AK5n+dcpXV/EL/j+tf8Armf51ylfT4H+BE/DOKf+ RtX9V+SCiiiuo8AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPTfCP/IA tvx/nWxWP4R/5AFt+P8AOtivlMR/Fl6s/oDJ/wDcKH+CP5IKKKKxPSMjxZ/yALr6D+Yryy7toby2 lt7qJJYJVKujjIYHsa9nnhjniaOZA8bdVPQ1T/sbTf8Anyh/75r0cJjIUIOEle58ZxFwzXzbExr0 qijZW1v3b6ep4XoPhDQNA+0f2TpkFv8AaF2ynliy+nzE8e1VdP8AAHhbTp1mstGt4plkWVXBYsrK cggk8deg4Ne/f2Npv/PlD/3zR/Y2m/8APlD/AN810f2jR09zb0PI/wBT80bk/rWst9Za22v3PHH0 qxfV49Ua2jOoRxGFZ/4ghOSKgm8P6XM05ks0Yzzpcycn5pFxtbr2wK9q/sbTf+fKH/vmj+xtN/58 of8Avmq/tOl/J+RkuB8fHbELt9rbf8zx59Ptm1FdQ8pftqxGFZechCc4x0615ZL4H1TUdd3XugaL bSPcLJPq8EpzIqsGO2E8KzAAZ+tfWn9jab/z5Q/980f2Npv/AD5Q/wDfNZzx9GbTcXp6HVg+Esxw d3TrRu1bXm0+633O68jx+HT7WDULm+ihVbu5VVlkycuFztH4ZNWq9W/sbTf+fKH/AL5o/sbTf+fK H/vmtVmlNbRZwy4CxkneVaL+88por1b+xtN/58of++aP7G03/nyh/wC+aP7Vh/Kyf9QMV/z9j+J5 TRXq39jab/z5Q/8AfNH9jab/AM+UP/fNH9qw/lYf6gYr/n7H8TymivVv7G03/nyh/wC+aP7G03/n yh/75o/tWH8rD/UDFf8AP2P4nlNFerf2Npv/AD5Q/wDfNZGs3PhfRUJ1JrKEj+A8t+Q5pPN6cVdo 0p+HeNqy5adRN+Sf+RwFFT3vjeyvZTb+FvDTX0pOBI8ZC/kP61Xi8FeLPETiTVZrfS7c/wDLKMYP /fK9/wAa53n1N6U4OT/D7z16fhNjYWljMRClHzu5fKK1/IoXusWNnkTTqX/ur8xrEn8Tz3DGPTLV mJ4DMMn8hXqOi/CvQbEh7wS38nfzThT/AMBFdXB4e0iBAkOnWyKOypiuSeYYqu7N8kfLV/ez6HDc I5DlceanTeKqd6jcYf8AgMU2/Rs+fRpWs6md19MYoz/Cx/8AZRWnZ+F7KHBnLzt/tHA/IV7p/Y2m /wDPlD/3zR/Y2m/8+UP/AHzTpRwcHzzg5y7yd/8AgCx9XiTE0/q+GxEMPS6RpRcF96978TySC3ht 02wRpGvooxU8f+sT6ivVP7G03/nyh/75oGjacDkWcOf92vSWZ04qyjY+JnwLjak/aVK6be7d2y8n 3F+lLQOBRXiH6elZHhWsx51a+IPPnvx+NU1UYOT/AN816feeArW5uZpmvbhTI5cgKuBk1Afh3aHp qFyP+ArSGeatlEJUMfQE1XEpclSrZPQelenn4b2hxnUbrH+6tWLf4e6fEcvczyfUAUAeS2m4SeWe ueO34Vsw6ZezDCRkAV6jL4O0ySFI/LxtOc4GTWjDo1tFjbuzUty6Ieh5HZWlzYXaSTKQM4PFeqaB cRPbAgqOOcnmnXnh+3uQQ0jrn0AqlB4UEDZi1G5X8BUOMm7jutjpFdWGVII9qiuLqK3TdKwUe5xW XJot35RWDVp4mPVhEpNc3qXw4GpyGS/1/Upn9W28fQVfvMWht6n4otbRSfMTI985ryn4j+IbfWba MNGDPG37uTuB3H0rsE+FFqhGNZvyPQqprzDW9NW58XHSNJlkuQJRbo7ADc38R47Dn8q5sS3The+r 2PayLBrFYpOfwQ95/L+vuucrfzrZwQzyZ2GTaQB2xzWbDqUupZNnG4iB+/jFe/T/AAU0m4gSObUb s4O5sKuCfWlh+C2lwpsh1O8RfZE/wroo0o0qait+vqcmaY+WPxU6z22Xotv8zw9YZ3UCRzg9QO9P S0jUcEmvcl+D1gP+Ytef98J/hQPg7p4Of7WvP++E/wAK0PPPFAir3GfSkkVScn/9de1N8GtPb/mL 3uf9xP8ACm/8KZ0/Of7Xvf8Av2n+FAHjAGBwOKQqCa9r/wCFOaf31a9/74T/AArzXxx4bfwxrbWT O8tuyh4ZWGC69/xBrgxK9lUVZfM+tyWoswwlTLKj13j/AF5P8GznxjuDn2ppwOCMmvXtF+Fulavp NrfWusXvkzxhwNiceo6Vc/4U1p46atef98J/hXemmro+UnCUJOMlZo8XIHX9KjZuflYY969sb4NW BH/IYvR/2zT/AApn/Cl9Pzk6xen/ALZp/hQSeJF35BH5UnmhRhhg17iPgzpw6ateZ/3E/wAKD8Gt Ob72q3h/7Zp/hQB4csys3HJ9+1W4lDLwcmvYz8FtNJ+bVr0/REH9Kk/4U1p4HyavfL/wFP8ACgDx 1VCcEAsffpTA4LEAdPWvYh8F9PB/5DF9/wB8J/hQfgxY4wNavh/2zT/CgDx5th443eopoyo3KePW vYB8FbESFxrd+Cf+maf4VP8A8KcsCPm1e8P/AGzT/CuaphYTd1o/I9nB57icPH2c3zw7S1/r8vIw PhZ430/QLaew1RHjSabzROoyo4AwR17da9psL211C3WeynjnhbkPG2RXC2vwo0SLS5bWeSeeZnLp c8K6cAbeOCOM/jXKXngnxT4QuWvPDd29zAOSIuGI/wBpDw34VHPWo/EuZeW51uhluY60Jexn2l8L 9H0/rQ7zxxY3V1eWzW0EkqiMglRnHNc1/Y+o/wDPlP8A98Gn+G/itH5gtPE1q1pOp2tMinaD/tL1 Fel2F7bahbLcWU8c8LdHjbIr2MLm9qahBJ2PzjPfDzmxc8RiZSjzdrNbdGeY/wBj6j/z5T/98Gj+ x9R/58p/++DXq1FdP9qz/lR4n+oGF/5+y/A8p/sfUf8Anyn/AO+DR/Y+o/8APlP/AN8GvVqKP7Vn /Kg/1Awv/P2X4HlP9j6j/wA+U/8A3waP7H1H/nyn/wC+DXq1FH9qz/lQf6gYX/n7L8Dyn+x9R/58 p/8Avg0f2PqP/PlP/wB8GvVqKP7Vn/Kg/wBQML/z9l+B5T/Y+o/8+U//AHwaP7H1H/nyn/74NerU Uf2rP+VB/qBhf+fsvwPKf7H1H/nyn/74NH9j6j/z5T/98GvVqKP7Vn/Kg/1Awv8Az9l+B5T/AGPq P/PlP/3waP7H1H/nyn/74NerUUf2rP8AlQf6gYX/AJ+y/A8p/sfUf+fKf/vg0f2PqP8Az5T/APfB r1aij+1Z/wAqD/UDC/8AP2X4HlP9j6j/AM+U/wD3waP7H1H/AJ8p/wDvg16tRR/as/5UH+oGF/5+ y/A8p/sfUf8Anyn/AO+DR/Y+o/8APlP/AN8GvVqKP7Vn/Kg/1Awv/P2X4HlP9j6j/wA+U/8A3waP 7H1H/nyn/wC+DXq1FH9qz/lQf6gYX/n7L8DK8MQyQaLbxzIySDOVYYI5rVoorzak+eTk+p9thcOs NQhQi7qKS+5WCiiioOgKKK5fxfGYrq2v5b65traGNldI+EYkjlqAOoorjD9peIS2t9NGmMjJz+Iq 5a3F3hQL55MdSyDk+hp2A6ekZgoJYgAdSayrO9kaM+fMN7dML92srxS6XOkG2uJDiRlQv0xk9aT0 A1LrxFpluxUXKzSA42Q/Oc/hwKmS9eRkxhS+MJ1PPqa4rT9Mk0t2028ng8onzLa4GB/wFh3+tXHv NW07UDcSWQuEVNq+W2Fx6j3pK/USv1O6FBrO0nVFv4I3MflO4zsLAkVPqV9Dp1lJc3BIjQdup9qY zjtX1PXItYuhZXY8m2IZrZ4Bkr6q3cVv6Fr6ajII5FVHZdyEH73qPrXAx+LmvPFSPOFXMJXav8K7 uOe9btxLBpIN3KyRRbw4duit7VyqbjJ66HRycySS1Z3tBOBk9K8/ufibYMBFpdpcX92eNsYwgP8A vHt+FYGoN4t8Q3Hl3t1Fplu3/LGH5iB7n/69VLExXw6nVHLKq1rtU1/e3+7V/gegeIPFmk6HAz3N 0jyAZWKNgWavLNT8e3Wv3zJb6bLIFGIUhcg/Vj+FaGs+DtE0HSLi7u5JbuZF3M8jFuo6gD+tcJou oSWGii/ZvLe9LBAoxsjDEAfU1k6lWT7L7zopRwNN8sU6kvP3V9yu/wAUbMcPiKaeeUXjWRf5Xjgk JYA9uD0/GtrTfDFha2tzetZnVLqE5YXbE4/4COo+tL4OCRK091uk8wfMAfu966fSNQRr1pbNB+++ Qq5wuenNaQoQestX5ixOZ4im/ZUmoR7RVvx3fzZe0TWv+Jc32eC1tlVQEWFMCrGtW91qGnrdWusX 1gygFvKAwx9MGjUIo7aKCOCGKN3JDLF93dXN+IfEsVjrdvoz27yx2q+bM4cYDdefzrofKlqeLOpZ 80ma/he21C01y3S81m8vmkjdnilI2qB0P513NcF8Ob2DxHqGpa7EjL5bGyj7qVBySPxrvaIu+w+Z SV0FGaKRmVQSxAA7k0wForL1TXtO021luLm7hCxqWKq4LHHoK52z+JWgXVgtykspO4q0aruKkepH FJtLcDtqQsB1NcDefEePyWfT9Ku5gBkPINq/pmuM1j4la9cgraSWVio6lVLt+tZSxFKPxSFc9vMq Dqf0qJr23VtpkAP0NfM+p+J9avsG71u9kAO4CL5B+lb/AMKr651DxfKlxdXM221dh5shbuO1Yzx1 LaLuxrU98W4iYcNn8DSNdQqcF8fgaxre92NscYx61fSaOQdqzWMbXQ1dNIsC9tz/AMtB+RpReW5/ 5aCqzQQyjoKrS2CDlCfzqniZpXsgUIs1DcRAZLjFZE/izQ7eZ4Zr9FkQ4ZdjHH6VBdRvFG245XHr XhXiW5MOtXLQy5zJyCaKeLcm00V7ONtz3eTxp4eiGZNSRR/1zf8AwqA+PvDAGTqseP8Arm//AMTX zlqetI7BJnAIHbvTbe/gmj8stgYzn1rV4hIThC5714o+ImjRaBdvpN8s96yFIlCMPmPGeQOnWvPP hbqnh/Q7251XxBqMcFwo2QqyOxGfvNwD9K4ESfKWZvkz8ufSse8kRLomSUNG3Ydq894hzqKUuh9F VtluXKivjravyj0Xz/zPqe3+JPhG4AMOtRMDz/q5B/7LVmPx54akXcmqRsM44jf/AOJr5ENzGkhM T4A561uaBqsS2s3nybXH3TWn16otbI+ZaSPp6bx74ahx5upquen7mT/4mn6b448OanqUWn2OppNe S52RiNwTgZPJGK+YLnxQrjyZ2DBeARwa3vhFcpP8SdGaNvveYSM5/hraji5TlaSFofUpOASelVX1 C1TO6XH1U/4VNcsEt5WJwFQkn04rnBdJcx/IYrhD1Gdrfka7ZSs7AkbcGp2c+fKnUkdsEH8q5H4p 6NDr/hx5Lc7r6zzLEAOWH8S/l/KrclpBM42MY5B0V+CPoakQ3lr/AKweag/vf4/41nUtOLi+p0YT ETwtaNaG8Xc4v4H+IVRbnRLp8cma3z/48v8AX869a+0RD+P9K+efEsL+FvGMWo6ejJA0nnRg9P8A aT+f517bY3cV/aW9zbsGhmQOp9jXPhqjSdOW6PZz+hCc4Y6j8FVX+fX+u9zY+0w/3x+Rp3nx/wB7 9KzTgcnj3pgkU8DmurnZ89Y1PtEX98UfaIv7/wChrN3ev/6qUHPI5NHOwsaRniHVv0phu4B1kA/A 1QccDn9agdc8UKTA1ftlv/z0H5Gs7XfE+j6DYG91e9W2tQ6oZGRiAx6DgGqzDA9R+tcB8Z/Ok8GL HbxpLLJeRLiT7uOfve1E5uMWxwXNJROwj+Jng+RtsetxN8wXIikxk9BnbippPiH4Vjt5531eNYYH 8uRjHJhW/wC+f1r5j00XZ1nUGsIYvs9laRwxiVcIJM5L47n0PtTNYlu4bWEXVxPLfX0ZhEITCtzn d7DvmuH65O9rI7fqsLXufUEXxC8LyzJFHqqmV/ur5MgJ/wDHac3j7wwsoiOrR7yCceW/Y4PO2vmC 0mFlDYXVnLLeWkUTW01zk7t5PzBT04/GrlxB/ZbmKPzZZmYysrRguIyoPB7jHWk8bNdECwse57p4 m1v4ea1cxWeqX1q15LgRtGj+ZkjP3lHH4158/k6BeG68FeJftC5JMHlurYHqCu1h9cVxbyXIkj1q 8sBChKJAobeCmeCuOrH0qO6vbm81SSYE2NtgqYzwZcnjIHQ+1Y1Krm72Sfc9LCYythY8kZc0P5Xq vu/yPavCvxctbhUi1+IQt0+0wjch+o6j8K6uP4ieFZVDJq8ZzIIgPKkyW9ANua+f4bGxt3ttpWSM w5IjPJ2gk7vQk9zUFlBcSrDcWuR5jL5bYxtJGRkmnDG1Yq2/qbTwmAxbvB+yl23j9+6/I+i4/Hvh qUyeXqYYRttZhDJgH67cVYsfGGg399HZ2mopJcScKgRxn8SMV82C8ujf2u4xpZoCjKqn5m6bjzg4 NdZ8NoN3iTSmDgpHNsDmPiTAPIzyOelaRx05NKyPPxWVTwyvUTt0e6fzPoYnHWs/VNZ0/SzGL+5W IyfdGCxP4AGr7/drkb6CDUtYusgPJCRGQRyBXqHkGoPFeinpej/v2/8AhT/+El0j/n9X/vhv8Kzk 0CLGQij8KDoERPKL+VAGj/wk2kYz9sX/AL4b/Cg+JtIH/L6v/fDf4VnjQox/APypf7EReij8qANI eINMIyLnj/rm3+FL/wAJBpf/AD9D/vhv8KzP7HDN0wKX+xk7rQBo/wDCQ6WTgXY/74b/AAo/4SHS /wDn6H/fDf4VnDR0HGKX+x19KANAeIdLPS5/8ht/hT/7d03GftQx/ut/hWX/AGQnpSroqegoA1P7 b07/AJ+R/wB8t/hR/benf8/I/wC+W/wrLfR0XrUZ0gZAUZzQBr/25p2cfaR/3w3+FA1zTj0uR/3w 3+FZQ0celJ/Y49KANR9f0xBlrpR/wFv8KsWGp2eoFxZzCQpyRgjH51zk+koudwyKveGYo4rmcIAD tH86AOhooooAKKKKACmyxpKhSRVdGGCrDINOooAwZrSNJJoY0VIkX5VA6d+KrGHyNxVgu4Zw39Pr VfX7g2/iHZ5hG+IMAD0HQ1cslWa3WNpUYBskt1CjnrTAbBA3mnbnJ+9j1qp4ljWHSrqS4O2OOJnJ J6Grkusli8elQxzBchrmQ7Yh9O7fh+dctqsE2sO6aheySxY2lIlEa/T1P41DlfZG3sOX43b8/uW3 zsGlSJrelCJgJHixtXPIVh61q6fcz6UVtp3VrcDMbODlT3WvIvC0aReI7izm1A28bybACxHcgc/X Fdk9jr0ErJLfXZyu6OQ4kjYrwc56DGPzrVRbVxONNO3N+H+V/wAj0iXUbS0tVupnihBGQxwNwPpX E+O/F9vc6c2naFcfa7mdG3tEpbaB19s1lyGWDy9S1zTPtygABAxeOP2Kdj70/wAVzm0u/CuqWvkf ZZhKjmJQFyRkLx+VYTUntp/X9dzWUaNKHM05fgvwu/8A0lnlnhy0vYdTuEa8lkuVbLSOBkbuQB2r 0RNHSazmmvYp7wKP3c80hbYcdNvQVyt9MY/Eeuy7AjOYZQoHT2rU0q51WK/nljjkNjdnDKuGBGOu O1cigua8tTopY+pyL2fuLy0/Hd/NnNazqDae3yjCA8gDBHvXrXw6v5dQ0S3nkQ3FxjC8/eX1P0ry rxnpE86usIBkztwR0NegeDRe+H/ANpb29u1xqe3mNSASSeme1awWppiXzRXc7DXPDFzq5jJ1AWwU 5eNU3K49DXB/FPw0LDw9C1km2OzYEYHYnnivTrG6mitEa8PzbckZzjjpmvP/ABZ4s0rUFdTcKtqC YJHJyjMeME9jnFVKEUcuHhKM+aJX8HzhNNsbp1IiQhivcgdfxqh/wkVxJfXFx4ftQ6tKzNE+flA6 AehzzWjp9vqOlW1mtpHvlZsw/db5e7D1rD8YT+I4taguLDS5LdnAZyIiQ7Dg8DjB616GDppq7S+b ObMKl52izfu/EusHSzILWdruORX3CPKK3ceo55rm7f8A4mLa1POoaa5uTmWToygfMPzFdtqCyXEN naoNjyKryqP7xHeuVuLmzsNJvbaRY7YWYkz5kmC7k84rnxdRNpJWPOneNk3c9A+ClgLTwpJMhfyb m4Z4lbgKg4GB6ZBr0Cs3w2tumgacLIKtt9nQoFORggGtKpirJI7IpRSSCvC/iVqFzH4s1KLMxgUo ADIQmNi9BXuleD/EK63fEO6t9g8tCrSSuvyKuxSQT61yY/n9muTuVa+hxXiPUUsNFupdVhzZyKEE UeQ8u7oAey8cmsf4deKNDzbWd4sVhBBIXaNnPlsOSMHqRnGfas740eLDrstnY22FtoRuVE6BBwv5 9afo+m2P9j6fE1sjOkQY+YoJLHnNZ1owpYePOr6lSjbRHpsnjjV0lLRXUflNgqICCm3tt7Usj2Xi yKRViFtrqRl0YABbnAzhgO+O9cIk0ojEEC7n+UKEHf0rt9L+weDbT+0tTmWfXpEKwWinKwZHVz61 51OpOq3zax8zM4aeU7jvbJxx7H0rs/gUS3jWbf1+yScf8CWvP5ZYyWc53bifbnqa774CSrN45uVH azkH/jy1zU25TRS3PeJbZH6jmq+0wNgfdq9JGy5INcp4k8RHSV/e27MT0IrqqJRZrqzee4EcTNnB 7Vi32tSW0Q5O5uPpXBan8QLeRdjRyrIOgArjbr4kXMDyCWESJnAU8YpO8tmZuTR2ni/xlqlhby7J YymOOOa8Zu/EUsjyS3PLuc5pfEHiaXWJNzfu0PRa5LUHc5zyPWtYRaE5to0muxcs0gYk+lTabJNd 3UdsudpOWPoO9YVm5XOMZNdXogOn6XPf3IG88IPUdvzNVNuKPQyrDLFYhRqfBH3pPyW/+QnifUPL kSzgOAgBbHr2FYZlkc4kJIqGa4aWQvLy5OSaf9pBXCDOOtTGNkZ5jjZY3ESrPZ7LsuiGyMwJChj7 1Ys5mUEEHNVzqQRdoQZqsL9g2cd6rlfY4rl+4i3srBsM3GDXpPwViEPxN0SMyqzBZGwO/wAteTXF 0ZGycj6V6B8A5kk+K+iZyXxKMn/cNaUo2mvUVz7LmAaFwwBBUgg1zN1otrL8yAwv22niuml/1T/Q 1mcY45A/WvTmi0zAe11W0B2NHeQD+GTqP61EuuQQSeVdLNYvnGJRujP49q6QcDHT3qO4t4rldk8a SL6MM1A7nKeM9Gj8Q+G5jCsbzxDzYJIjkE9x+IrmPhVrM7Ws2l5PmQHzI1bupPIx7H+dd5deHYct JYTzWMh6GI4GfpXlPiPT77wl4nt9TmZZIppCxeL5d/8AeHsSDXNVvCaq/f6H0WVzWMw9TLpPV+9D /Eunz/zPXZb5RGokBRj19KlQlgMDPfINYmna9YagqCKUMzgFUnG1vwNauPKBZCY2PZuh/GutPsfO Si76ljLdT0qRCccdKqxyvu/erwf4h0p32xPu22JX746CmxItluOetKzDbisSxs9Rj1SW71DUvOR1 2x2kabUjHr7mtOZ9oz0BpJDbGyMM/wBa4j4qxG48LBdzLH9qjMzL1Cc5x79q652z7VyXxMhe68H3 MKMyq0iGTb1KDkgflSr6UpBQd6qPGrK3a1j0eK51CETTSGOaEHkxhiQM98cCr1wyx6WI5YpZbp90 cQlOWVC3GSOorJurhhpFq1xbxGbyDL5u3mOPOM/j/Orunw3tzeWl9qEiG0lhCRWytgSOQQGJ7jFe LJdWewnrYi1O4WS3jsLG5iDRqTuRcLFt5JA6ZJHHrV+6vohHbatcWV407cAv124wzMOgB7UmmaQI 7ea2Nv8AvGYOhhkDLuzjg9yF7etaiW7y2ywRys+fkKyxg/MGB5PoBxUuSGloZFpZQRWf2W6vJkvl jE8CQruiQE5zjscd6qJaS2hne7YvdXZeSBZEIMOP7ue/vWpqCJplpqUzQxhJBtIV8ui524z269Kz 7fbcWcaefP8A2paDdvuZMhYy2Bz9O1Cb3CwSwsfD88VlCqXjBC9xIceWij5gT3OSTinTMb/SrT+z /Oga9wjPIwICr95wO3TiotJhkXVdVm1TVXeK5LL5EQyFAHYdzVPw/pyTbdVt7W5GpR72aGWXahQc DC98jnFVpuI373E1xi1miJ8jeMtuVI843Be7Hnn3rS8NW1+df04aBM8d1MXePzU2hdvQMDWRdxaR BrE0kdsxhaATSXKMdyrkKsar6H+ldD4QlR/G3hezafZLFK26OPLAlVOMt7g/nSgrzSOinjKuHi+R 6dU9U/k9D0208d3OmTrZ+NNNk0+XOBdRgtC/vntT7K/jm1m9urSVJreSTKuhyCMV3F5bQXdu0N1D HNE3BR1yDXkFz4cNrqtzL4fun05/MbEX3oiM9CK9tKpD+8vxOFvCYr/p1L5uP+a/E9XtZQ8YI7ip s151pPi650h1g8UWT2yHgXcI3xH3PpXdWd3De26z2k0c0LdHjYEGtITjLY5a+Eq0LOa0ezWqfo1o W6M+lMBpw4qzmAnBpc0xwSf88000WAl4NGOOKjJwBzShjigB2OlAJzjGBSjk0knCnmkAkwBUAmmx njHekY7lX1BpyrjknmmA7oKjL+gqSjFAFC9DOtN0GHy7ic55Kj+dT3n3abo5/wBIl/3R/OkBq0UU UAFFFFABRRRQB5V8STcS+Jk+yzGNoIV4H8WTmueN1qc+TJMn2IMVwDjzD/hUvxRBm168nW5mtpIG CAp0YYHWvOw15FOFTV4yiD7qtnI9cdqlLmlY2/hw9p1ei/V/id/e+IruJCqsYlHAVTx7AVw3iXxL dNa+Sl7KshyGION2T396x9Slm2MLjUyQCC25u1YD/Y1lkxdl3x9xRmvQpUo7tHBUk2belr9ut45H lcT2rbSxGdwPPNe4eHX1C40WJ478yxYDhG6BumPpXgGj6klqk9vauFSQB904I3OvYH9K9N8D+I20 5UjngaS3nw6GN8+WayndSaiaLZXPX9CR7eaSJxttpDuAzkKe9c98VbFLOwtbixVhEbgPJCi5XP8A fA7H19atr4gtZLJpYre5aWEZPAyw9azdW8aJLi1UM5KnG8cL9a5505NamsJ20W3U4XUo45tbnEpW NZYYzuZuW6+lYN7eanZakiadq0cUDMFVJF4J+tY3ifVDB4rjgSXKtAXVvo3T9a6bSdU0m9sVi1Mx IyjhnQdfX2rgk3e51+zVP3f68vwOv0O3u9VkU6nCr4A23MAyqY6iT8eldbZ7YbMqo5WQjJrD8J22 mRWqy6VceYG+aQJJldx7kevFbd2NsRVFzj5q2htcTk3o9jO8SatIknkrvCmPGccHNeYokR1BNLs9 OhGneaZJMplTITknaeSc16Bdy/aBiRcleBVOw04RuZPlAznBFJu50Qnyo6oWMVxp9pEJGikiAaKR eqn/AA9qZrXjNNLSKz12Ewyk7YpwCVk/3T3+lORzHDACQQy1ZvLe01XThb6hBHPEDna6g7T6j3ra nNL4tjiqQvqtzG8MeJ9FudQuppJ2CW3zS70ORWL4+8YeGJbN1Fv9qN0wywgBJXNQXzarpN3NZ2/h yzlt5HBM6Efvk9TnuPSsLUrnXJ542GlWEURbD8gMqdse9dkoU7X/AFRxvmbs/wAj6B8KxpF4c01I 0EcYgTao6AY4FatVtLXZplooOcRIM/gKs1zI3CvF/ifbRz6neq6M6mdd4AwGGxRjNe0V4V8TLy6i 8Y3UUMe6IsF292YovTscVzYp2hoVDc+fPi3p6aReaZPaWyQ/aA8UqDqWU8HGfQ1oeFVuNY8MRXcT yCXTZPKkCddvUe5rpvFMS39xDp91BEI7n5EumYFkP8RHo/oa6bw5b6RZeF59H0a4e3urdw6zhFka Ru/meuR78dqz9opUEmXZt3OO0fxGsJeZRGbgghePuj1+vtVbUp90ZmnYtJI3LE9fel1bw1Kb55oH iXB2lY8hWHUn2rnb+eZLVoLh5JHU/fzlQOvOf6Vw1KCm7QehlKPY0ZXbDnJAZQMHpmvRf2eJf+Lh TbeUGnyZ+u5a8qMqi2jLPhXwNwORWh4Z1rVdA1y4udAuja3TL5ZkKhvk4yMH3xWVGnadjGpVjRi5 z2R9jai8skbld6hR2rxvxBqOpajqE1uiSMiHAYiuNPxT8exg/wDEzhlX0e2U1my/FbXUl/4mlnZz qT8zRKY2/wAK1qYVuV0yaecYequWLLPitJ9Ojjl3Av3FcDqF+1wzSvyx7Cuh8S+ILfVYEnhhnj38 YZgc1x7yA5DIVB7g5pQotbBLF0lpzELTEvnmrcUyyIEKk5qykNq0UYiR2fqS3ANW7e2KgeXFtz2C 1ryN6HJXzOjS63KdrYLLdxwxZ3OcfT1Na/iSZt8VlboTDCADju1aekWksKySumJSMIG/nTJdDnaI zSSqVJwTjvVQw06jbtojtxWdxy7L4QStUr+8/KCfu/8AgTu/RI4m6kMTsrLhwcEelVRMQWxxmrWr xqb+4VGyu7hvWs54yhByaVknYcHzRT7iSKyfMTkGmRSZfDmpyh4JPHpUUkYDZ7U0+hVibzPnwOle jfAFf+Lt6EwPH73j/gBrzEqSMqa9G/Z6LH4uaCMnA83j/gBqqa95Atz7bk/1bfQ1m4HU/lWlJ/q2 +hrM3KTy2Ce1d8zRCjHoc5o9elKDjlWHuTUcsgVc4yagAkfCntXM+LtMTXNDuLQgeb9+Jj2YdP8A CtSeR2y2Dt6VXDMeBir9mnFp9R08ROjUjUp6NO6OF+Ht1BqGmTaTqkKNcWbELuGGCZ6Z9jXTx6Rc wAtpeoSRqf8AllN86VyPiq2fw14qtNbiQi1uG2TgdMng/mOfwr0WB18pWT5kYBgfUGsqGidOW6/L oenm8YznHGUvgqq/pL7S+/X5mO93e2wiTUbNxGSd0ludyn6ip4721mObaVAw6BeCPqpq/LKRcWqj uW/lTLnR7W+O6eBd395flYfjWyVjyW77DIHuC5JIkA/A1Ya5Q8OxVum1uKqNpV5aMTZXfmIB/q5+ fyNUp7yZQEv7SQDONyjcv59aa1E1Y1XYHqa5L4mybPCqv5hjUXcQLA44yeM1r2/73m0mBH91jkVj /EaKaXwjhibdluYn3gbhgH07/SoxH8KRWHv7VHkt5HDeSOXZ4lt5vs91EwPCgZ25HY1c00Q6jb21 ubBXnsUkjElw5jV+eAB7Z6+gqPS2Et7rEVzPLJC3+kPMYtqMnfHvjio7qIXOiafeTM7tetIduSAq k8ZP0Arw2eyvIu2sq2F2GW1mMM0RiM6jgnkbl/uqBn3p2o20WmRR2VhPIbm9AaFpDlVwdzMfw5qe 5uHurtGAhjigRIRI4JhfK/Mij+9jH40axbQsIntEh5gVmcgmURg5IHsMc1knd6lsp6zHaXF15dkP tU6xB3cn5HG4Ydu2euBUItobqeQpJJLfTJ5SMyHEannLds8cVY00W/2FZUuzG10zRHKDcUQZLBf4 R2FO1C48mzgkdzawuiLHCDztJwC5988ir1SsJGJqCmwn01zMJ4oFeRY1HzNkYGT9TyTUX2nUvtsj K9vDNHEJLhAxJQMeNo7tjPHpVmey+xajDp1zcWywBGE0rEs0inJICj+H/ColewDHVYZna1S4Mcof 5TjGFAb8uKu+xPmX7/V0uFjtNGiW5VH3zyIoUgj+Ak/nW/8ADVpn8YaK7Ils0jiV0ZhuY/MOPbFe faHcWtq1xp8ObeyeVmllZ9z/ADHg+uc12/gO3tbH4l+H4UjWKcOUeRyXZsKcKCfUc1cFaoku5MtY s+nW6VwMPz3k5OM+c38675ulee6VIJLmUNjPmuc/ia908g1vKVoyrKrIeoPINZqeGIoXNzoF1LpN 4eSIuYn/AN5Dx+VbCjgY5qeDKg54A5JJ4AqZQUt0bUcRUoX9m7X3XR+q2fzMqLX7/SyE8R2OyMcf brTLxH3Zeq/yrpbO6hu4FmtpUmibo6MCDWaur6YZPKGpWJkPGzz1J/nVeXQoFmNzpksmnXLHcWgx sk/3k+6f5+9HLKPn+Zo50K265H5ar7t18r+h0PemEVjJqV9ZALqtuHjH/L1agsv/AAJOq/qPetW3 uIrqFZbeVJYz0ZDkVSlcxnSlDV7d1sOooYYNNY4NUZj1bFPLhl4rK1u4urfSrmexNuJ4kMg+0Z2Y Ayc45rz7w5c6rc61bXFxdajYwaipurl5IgsblRwqE/dGO/fFc1av7OcYKLd/uXqddDCOtTlU5kkv +H/I9TXApS3pXN6l418Nab5v2rWbMPGu5kR97Y6cAdTTPDXjfQfEa3R0y95tUMkyzIY2VP72D296 6lTlbmtocXPG9rnThjnmng143qHxdvru9uF8LaEb2ztgWeeTcSVH8WF+6PrXZ/Dnxvb+MbS4PkfZ r62x5sW7cpU9GU+laTw9SEeZozjXhKXKmdLeZxz0pui/6+X/AHR/On3Z+Q0zRj/pEo/2R/OsDY16 KKKACiiigAooooA8P+IqFtb1RS+0rIr4PXbxzjvXIx6YJN5ks9Oltzws0akNnvkV6T47tlm8RXsc 1usweJdpIyV46iuV0uCUwMsENlGYjtKbmQ/Uj3qVpI2muekvJ/g7fqvyMG70uJjug020OOfmNRSR QxfLBYopHdYx1rvfs8Xlp5kUYbHIVuBUEziBT5NuOP8AZrqhOxyuB4x4kNrDqxW8KqXAIz0HsPSk trG3yptZpYV6jy3yBWh42uDN4nk+3RIqiBAVK4GPWsxbK2ZTsX5T12tg/pWUp2k7FNaI9E0nxRfW dpDC7mZ412eY45Ye9PSeO5d3un3u3OOuPwrlNNsbMsiSGbIHH7w10VlYWtmjSxqV4xncSx9qyk1v cqEXJpJanL61p0V340jnkQiC1tctx/eOP6VVuZIoJikljJLCcqpChwR6111kmb+8875pCVVsjnGM 4+nNWJtDWSXfbqQAOinpXJfudlVqUtHtZfcrGr8LLmw/s25t7KI28scgMqMu04xgH6V2V7MBHwTn HUdK8l8DazJD4hFs9iYxcSNAsm8kEDON3oeOld7qE3OwvtOOeea2T90mKuyC8maPIXlm6CpbCCac LuGAOTVGGOMHzmJOOgJ61K940a7zLsjHXBqOp1NaaG/LcDzVUchBgYrThkAQHP3xkCuPsr1riX5c BRXQK+NgB4AqznkjTkRLmIxSD5TyD/dPrXC69e21pdm0uJoku9wVYc/NyeuK7KGXPcZFUPEWkR6p El3bwRm/jKqX2jc6Z9fari7aMyqQ6o9UtRi2hHT5B/KpKZANsEa+igfpT60MAr59+Ld3b2/jG6O5 /PVl3MmTsBRcAj1719BVhaj4Y0TUNQN5e6ZbTXW4N5rrzkDAP5cVnVp+0jyjTtqfKPiDQbq+8ueN zcGJy6RKcZz1z7960dN8Pzw7ri2nlgd1KPHtwnvjHX611/xvsl0fxBpi6Qgs4ZYmLJCMAkHqa5zw fcs3iGxgndnhlk2ujE4NclPD1Iv2cmbwaUOcqzWk0Nw8UbNLIEErq0gA2D1PrxXF+PYftGnRX6xr DbqxiZFbJAPIPuPevsaLwvoTh5DpFmXlXbIxjzuHvTLrwV4auw4udCsJFdQjBouCo6DHpW9PC+zu YKavofCq3P2eKKF9vly8lNw6dq634cWcmqazO0phigitnPmTuACNwAJ9+1fVlz8NfBEgUS+GNMJA wpEWCB7HtXiEVppfwp+JGp6fewLeaRcW4ljmePzHiRjny3/L9BXHjlUw1KVairyWxE6EMUnSk7KW ha/4RhUnMF5qGm2s524UOHzuOAeKZqvgPS48RXmtRGSQsn7qIuAV65rb0y50u+sYb+1k01t5Ox5r Q/JzwOtaclwEs5Vv9f0yKRmDRNBb8Kc5Yn3NfMVs3zVz5LP0UPy91nBTyDCU/su/q/8ANHmq/DwC +WGzv7aSIsFEsqOAM/7OKj1b4f6ha37WojimtxIYjcgfJvC5wfSvSdP8ZaRY3nmNquo6kUDL5Ytw iE1hSeMLnUGlUkwRySFniwCRz1z+VerlLzKvV5sRFqCXVWu312T0+7Uzlh8ti7Smub/F/wAE5rT/ AADfw+VHiELIPklUFlDd0PvW5pvhr+z0ubq/liuDb9Qh+Rf8a0z4hnkIEk8xjU7ggAAJ/qaqajrH 2sLatcRxWbuJJ1Me0Db7jnmvalCdNX1OzAYDK8TVs3Fpay1ekVvu/wCtCtFo0/2OO8lUqLgF0xjg D19Ktarb6bb+BN0yMNQmeQ70fhUX+L6noK0tc1HTpvDc32K8gmIXBSN/mAHoO9ed3d28ujeW5OWI 4PGEHQY+tTiMRKFKNKlLVtL79zedOjjMRUxFWjG3Lp1skrRj6JWWnY8+nhLM0p6bulRtbtIeFxWv KAylSvIqGMHdx1qJUmm1caVtDMksJEUP1Heq0yCQbFB3GuhVjjBxiqtpB516fLA+XrUqi97lKOlz I/s+SOM9Qe9d/wDs+QFfi3oTZ6CX/wBANYU8edw6mus+BkBj+LWhkfd/e/8AoFaU42krslH2RL/q n/3TWK+3g4BrWvpUgsriaQ4SONnY+wGTXnB8e+Hi8aJqMbburAHC+xrsk1fVg5JbnYB1B6YFMaVB /FmuNuPHei215HBeTywpKMwzlcxSj2Pr7V0NrLFfQRzwMWjkGVJ4yPWhJMXPfYmv9QtLWHfdzJDE Tjc/AzWOfFGg29wEe+jwRuDqcpj1zR4suLCy0wpqCpL5uRHG/Ksw7E182eN2u4Li2vGsLey84FQl q/ynB6MPWs5TV+VPUTvvY+i9S1PSfF9he6TZSrM68FipAB6hlPQ81S+HmoSzabJpd7n7dp7mJlPU p2NePfD3xjrD6xa2Fxczpb9FxtQKvqc9a9J1nULTTvEltremXCzRS/uLxFOCfRv/AK9ZSfJJT+T9 P+AetgZPE0Z4Ke796P8AiXT/ALeWnrY7825/texneRxgOvl5+Xp1+tahYLyMZrKCGS905ufmV24O R0FaWwJ1Aro3PM2I3Z3PShIyR7d6mVdxHT255qUgJ1wPqaL2FYqNplqxDGELJ/fTg1wfxninh8FB ba42M13Eolc4EQOcsSO2K9I3KRwy8+9effG63uJPA4EA5N1GX56KDyfesar9xtm9H40eUW/9nWwY w6hczR2/7vJXETs4wFU/xKTyam0eZbqxXTpYJbmzS4a2gkiBwHC7j7YzwKhGnzTafbf2SY58SkQL dN5cYcZ3keufSt2xa6s9b063NwLezkG6SKMjy5HYYwvsGrxm+p6oyyhFpM8TFGaDc0fmqW2Meu8d uBjNLo9sk8TS2lyGkMG75F+eMljvxnr1/KnandSQajc2t1cKkz2z5uRwAR0H1NUvDMY0nTVF/feS blHkUbD8iN1B75FZra7K6kE32WDUkWG2htr6aBlQySZyin/WD0zzxU+oGW7vLDz43jneMxpIi70C AcPj+92HpWNpdhdXBne28lPJvIwk2wnIU5PJ6A+lWPHE0S6sl9BLN+5lAMQYlS56AAdBnk1e7SJM meaKwu2ttM+0wz7fLnuHXLyt2GT/AAkntVqIafp/lXeqxSSBR5aWKw7y0+P9Yc8e4rU1G9Wz03yl hha5upAIZJsmTzu4b+6o7Vji/sirTWtvPqF/FGmZHzhZO4HbnmriyWYukWcms65cTwWiWdvI5MX2 rhmkAyzsfYdBXU/D+S31D40aJPHcrMsGV+Q71RsEbT7nkk1j65bve2UYa6n0+OVh5uCGKIeoHfdn jPet34d2drYeOfC4tLcW8P2xoVScYlYhCS/uG963pu80zOa91n1Y33TXmWksUupwcY81iD9Sa9Mk +430rzLTFEsjMeWEhwfxr2jyjp4JAwHSvKPiiuratrWqwXEt5beGNHto55Vth81yz+nY8+vAFemQ hkYY4rN+ILF/h9r+OR9kb+YrWhLlmmZ1Y80WeQeA/AujeNtP1FrFrvTLi0ZVRpXWZX3AkbgAMdO1 P8M+Ktc+Hfih9H1ySSXTo5BHPA7FwinpJGTyB3x0Nb/7Ocqxaf4geV1SNXiJZjgDg96xvjzPZ3ni KzuIvMGbLazGPHmYPBGe3XmvRdVOtKhU1X3vY5IUJOkq0NGuuy/yPf7q+tbK0N3dXUMFoAG86Rwq 4PI5NY2m6r4e1q8YaHq9qb/q32WQBm+q9G/nXger3174k1/w54fvXL28K29ui54G4AliOhbHc1d+ Lfh6z8D+INLbw8GgWSJpVZmy6urYyG68+lciwrk1B7vbY7ViI07yU9FvZN/nY9I1X4u6fpOqXGnX Vjd3FzbymKRkTZ09j1P0rnYvjNq99fNZ2Hh6Brqc+VbR+YxYSdtw7/SuNsW+2fFewUgqk97ExYff G4A5DeuTVwq0Hxy8iA/vk1QKk0h3HOOretbxowgrOF3a+/8AwxhOoqjvGolrbZr8r/5G/wCEPiB4 nk8dRaH4naKWK4mNrPbmIIYWIPQj0rnfAVzdX/ju8ivrq4uQLS9jCzSFwAFIxg06Rvs/xt825dDL Hqu6QRqcdOdo6n6VH8OmRfibeAkKrR3uN3HG1q2Xs7ScVZuNzCcKkWuZ3XNa97r+vLcrfCvQNO13 UNUh1KAyrb6dJPEFO3DjoeOtZnhR5EsvEDRMQ7aU4JBwcbhmut+BltcJrepyvbXAik06VFcxNtY5 4AOOTWp8KPAWt2OvPda/pXk6ZPaS28iyyLuIbp8orSpWjGU+Z9rHPCk5KNl3NL4AyWsPhfxLJMY0 ZWzJkjPliM4z7dazv2eo3bxBq92OLVYBGWJwCzPlR9cCtG7+DNtDduLXxHLa2cxC+SyfOV/u5z83 4132keE9G0bRoNNtrdnhhkE5d2+Z5P7zEdfpXHWr07T5Xfmt8jppUal48yso3+ZvXx2p059qZom4 3MxYbflHH40TSBoy0nCj+JuAPxql4c1nTb7WLqzsr6C4uYohJIkLb9gzjkjjPtXAk3sdzaW501FF FIYUUUUAFFFFAHB+L4yPEQdSMtCODz+lYl7bvtjmFtbtMh4cfxDuGHcVt+NCr60pQglIwGGenesh LgYAYgj3p8vMUpOLuivJqFqhMc+nwQTj7iu3yufZu/8AOqc+tSCRhJBAAoJJXjHoDnpWfrur4uXt CsTIHAI2ZG1hx+tYNjczG8gVzLDG0bAqoyAwP+1nrVxpz7XJdWhN2TcX96/z/M4r4jzLd+NbhZHV ne3j3xHqvH61Qh0SUgyWd15RODyM9PX1rS8RvbXev6gJSkt0pA3twSMcAEdDWDLc3kRDW7GE9DuU t+uax5pJvQ2dOm9XNfJP/Jfmb2mHUYtYCzspsxHxjB+bH5121g6giSQqzj7q54Hv9a8zs9WviEJe 2J77lIzWmmvXUSSlpIFVUYjamT09aiXvPUOeMFamvm9/+B/Wpo2t/NM0t5axNIWnfOD2zW1beJ5b YH7TBNH06pk/hXAeEL+9svD0EwQzLKpkUjnJLciurtvFChEiuIJg7jI2jIrmnuXG1jqbPxPpzzW6 uSjM/AaIjJpPF7NDqsMsZIOzCiqkWsWokiicMXBAy0edpOP8a0vFPly3FuWIG1s7vanTejNYaMqX Nwm1PIkd42HLMMfN3FZWoXsi2jqpyehzWvNe/wBpIbZYJECKXEj4AUfh61ixhLi5jjlHG8A1UfeV zWE7o6jw1Dss43bg7RkmtqO6BGQeKy9Sm+waNNImBjCj8awV1tIo/mbgDnNWZ8t9TvIroADb8zHs K0Irkwbeeeua818P63Jq12xglCRBsbh1P0rtTKwCK7Hdjg5600wcT0/Q70XlkpJy68GtGuG8F3T/ AG8RE/KynNdzWsXdHFOPK7BUbH5jUleTeKviHcad43u9Gjt8wwbd0hPcqD/WtIq7IZiftDhUvNFl 7kOteY+G5seJtNfPSdf51sfFLxLceINYtleLy7WAERknlieprlLKUxX8Lr95HDD8DWentDWP8PlP sm3x5K/Sptorx4/EPUbS3gZ7aF49oy27mrU3xViijUm1ZmIydrdK3aXc5rvsenXLDzQv8WOK+Q9Z 1W41vxHrWp3LJJJJdyR4PaNPlAFdb4s+Keq6jqcSaVIsAXqfT/GvKEBW91XzZ9lwk7O0ecZDHJbF c+IimlEuEpxfPHSyZq6RcS6e0v2dnMbEb4ifl/D0raS4RyrbW2t15zXM2St80ruvynGScD86kuL0 Q2kxF0+VxtEMWTkkdM8Vo68KTsz5JZVicbLmWl+r0X6X+R10Vu0sge2QPGDh3JwBXR23hvy1eV9o MgwNxw+PT2+nPvXGyeH5Lt7R4fEdxa2kuSB9oVPs64zl1bkMT2xWNbR217Z2sMfiEMhLm5vpbg71 ZXwEGWG3I6cEHmuXFPEVtKcuVelz1aHDXs95xb/rudVq9tfWrhI97ov8X8S56kj+o4qqVdgCGUqv D7j96suy06zmaN7XxnegsMLHKRJw3BPXt3H41Ppml3aXV7aQ6kdT8uDz1YxgHbuZCpx6kZH1pc8o LmrO9v10NK+UVMNhZQpfFPfzitbJ+bs36Ibc+XZp5zkNKwJRF6KvvWt4slktfC+iac0XlyMWlYkA E5Gev41RCoI1WWMrMdu4ScFQOoq/4uuJ9avbGSYIFitdqFU27hnqfU+9TUkuaPn+hz5HRcnUTVmr L5X/AOAcBeEx4OetRKwIznmresQNHGxPGKybJiJRjnJq6m9z6Jx1sXHiY7csQDWtYpDEMJ949TVO 7QqIz3xSRblPtWMrtFVI6JIdeBYbggsMGuu+CJx8WdDGcg+b/wCgVw92gc7mJNdp8Dgp+LGgkHn9 7x/wCimtVchxtsfWfi0lfCusleospiP+/Zr4kXW7m2vWjlREJj+QKOD7/Wvtbxs7x+DNfePO9dPu GXHqI2xXwbcXn9owI20R3iD5o2+ViO4Fb1oc0lfY5qkHJo3JPGXlNDC5FygOAr/dXPp6GtKXxVqd uGQvdyaTJjaFlKsD3CkdvauNsbS3vCttBbs9zu3Nk42AVsapLJpNotksqw7sEmfkD3FYOnFWjEul Rekknba72Om16/1vUdCiWEyi1TAgQy73Xuc1z9uTJMbfXriS1uI1B2S989D/AI0mn6qQIHfUxkPv kX7u4Y4//VXQHSP7eRri6VY5EP8Ao7CMvJMT/T61EVJvlt8+v4np06MeRycrK5xN9M8GohEnFwUY KHBIBPt7V0GjaqE1QLLvnml+Vl3kqD9K0rb4a3KzhpI7m4y24o2EUH/e612Wk6BeaWgFpp9tFg4B UAtn/ePNeh9VclZnNLEpWcd1qn2ZYk8WeK57Gy0/R4gjWq7Rck4IB4we/Suo8Paj4htXM+saokny 4Marn/Jrm54NWtpvtUhigJxG7Lz1PU1aGi6lcMDc3TMpOSEGOKVHDxTtJ6rzHjrTksRDaevo+q+/ VeTRujWbe1vvtonuJLtFKhnkyFB7belOfxJJdtw7nHUk1lwaCuAQBkfxMev1qvf+HblgxtpfvcDH FdUYQWxwts6e21dJHWMTfvDxwetVPHbvL4MvRNPJGgkj+brjrjr6nFed31vrWkuHwfl/i64rWsdS PiLwvqFnqUTFIbiBiS2AeW5P5VjjIpUZPyNcNrViZ01+hht4BbEC2eKWTfJ8qNjoT2J7Cr15JEPF sSXEb3EklvktGvyQcZyvasljBdRTW1whMAgH22dVK5Ib5T7kcD6VaN5d6bfSR3FvHKpeGBnbhXRl O5s9uMYr5trU9zobgu9OvYm07UwGmRTIAxyZB0HzdselV2vCVhisStxcMQ86yYZRGh+fGfQDOO9Y 6zadZaWZ7W13NcMbaUuS+EXOTnt2H1NOit5ZL6a7uLCa0H2cC3R2KsVONwOOny/iaSir3FcW91Zt Rt5v7Ha+1CRpVNvuURxBc4O0DqcVVv4orFHu50m/f3ceYXHVlPJAHPp1qzCkem3lnDZusLNPHNGk vBWIZGAPU9geavTFJ0u2lmnW4MjNM8rfciAztz0XPQ0lo79BvaxVt9S+zXOrQGFrxZmEkEkgyNx7 L9OpNUdJvba1jv47pDdXkpaJIo4/kiGTkufUnnNMhn+2wabaQJKzS/vXljO0RKT8qg+hx+Jqzqyx wafaQRSrDeTO0U8bxlyy9i3+0cVa8xPyMDQrACC7EtxEAwEaSwMZA5B6ZNdp4EutPHxH0iJbeVpX nCvLcHcQ4UgBPbrXKKLax06yuEkmuLi8Q/ZbZ1CLE/IIIH6E10vwusZZPF2hXQjkuGWYGUzc+WcM CQfWtofGm+5lL4Wj6il/1T/Q15hoLATyD1kOa9On/wBTJ/un+VeYaQdkxPGGavcPKOnAUqMc1g+P pI4/A+tpLIqGS2ZFz3Ppj8CfwraiIIX61h3th/wkNhqIecwxXCvbQOEDbY+jMAe7evYUKVpIuMFK LlLZf0keU/CPW9A0Wz1e412cIiGNoYjlmmYA/dToT9elZ7rqXxU8etLbwNFbEqhPVbWBfU9Nx5/E 126fDTwfo37zVrrULoRbSyucLg9M7R0/Gu406/0vTNIaHw/YKkMWN1vEoTbnoW7nNdssVRpylOnr J9Wc31avXjGM1aK6LY8y+JfhXVdD8ZweItBs5rmzVopF8pN5idABtZRzggdah1Gx8Q/FTxTZ3N5p Uml6XAojd5FIVFzliCQCzHsB0r2d9RvPs1k9vYyvNMu6VVB/dLyPxOccelQvda0lp/pMNhDIsYzN cT4Ut3O0dBULGtJaXaVkxvA3bvKyb1V0edQfDrWT8Rxrka2sGmQXqyxo8vztGoAGABxwK21+HETe P5PEdxrAFwbv7UlpFGOg6BiTmtC58XadYz7tV8T6ZBFHLuENviRpEA6HGep/HiuW1j4j+CvtdzOi 6nfzTZJESeWvIxjJIOOKaqYmp8MXtbboT7LDU21OXnprr+B1Fz4V8LWfittVvlupNYnlN2js7BFI 7rjA4qwtr4etrkTaDaxLqKDcDBAXEgY87/UHPXqK4d/ifqWptEugeDGnMSlYZJw0mwEYIAAx096c dQ+KWqphRaaPERwAEjIHpzk1jXjKCviKkYr+87fqa0cRSh/Ci2+ttn+B6ZFqmpzXstvbWCILeMGS ORguGIOMN/dOOCP8ao6l4ja0ZxqGraPpiqoJJlErk552qDnpx0rzK+8Da9eWs1zrniea6lVMmOIu 5x1IBOB+HSrlp4B8G6aYZby8kuJGwym4uljDZ9hz+tePUzrK6N+fEc3lBOX5HVKFdxU6dJJPv0f9 f5dDXv8A4oaFaXDHT4dQ129IwjmMIvX+HIzj6CqreIfiPr4H9maXa6JbOf8AXTfex9X5/IV2GnWl lp6BdNs7a1GOsSAEj/e61YLZOWJJ9TXzuL49w1L3cFQ5n3m/0X+Y45dWqa1p29DzufwBqGpEyeKP FV/fFjloYCQv0yf8K7v4W+HtJ0G7vV0m08lnjUPI7l3fnuTS3BABzWp4KJN9dZ/55j+dcmVcT5hm WNp0607Rb+FJJbP5/ia1MDRowcorXu9WdfRRRX6AcIUUUUAFI7BEZm4VRk0teWfH7x1qXgfQ9Nm0 u2tbj7bO8Eq3AONuwnjFKTUVdkykoq7Od8TeJY5NQnMF3CLp3ZhBjczD6DkcVgXvie9DBYNG1KQn +7btj+VdN8LNUtF05r2x0TTbG4uz50hUMzu5/wBpiT+FXfi18QfEvhPQ7a/0i2sJgZAkvmqxCgjj ofWt6OKpUtXG5GIw85R5lKyPJb7xHrhuJNml3yjPQ27Z/lT7ObxLfyIo066t4ycl5YWA9scVoJ+0 N4j+wWMz2GlGfzSl1EFfIXs68+navTvh/wDE688UxM5gt0VWK7gCM4+tdTzeDXLCCTOOlgITlpUb +Z4RrPhnxFJcTCHw5qdw4PzP5BGT161lf8IN47vJWhg8N6mrom4grtGD05Jr6Q+KfjnxD4b8PLqu hW9lcLHIFmSVWPB6EYNcr8M/ip438V38pu9M02306L5Xl2urFuwUE815nPHY9HafJ1OOsP2ePGMt pFJNrlnC8iqzRvuLRHuvHBxXT+HP2dVtruafxfr8l9YJGf3Nruj3eu4+nsK9V1/xNqOn6NPdW8du 88UZfawOGwOlVLDVj4m+HZ1XU7eNpxaSTmNGZEJCk4POcUXXQtp9T5/vH0fThLFpB+y6QkhS3gnb L7B3Oaz/AO27Lb/x9RcHgEg0zw94l0zUNVjfU/B+hyxyRs3mAyn9ScV614dtvC+q6ejy+FNDEhH3 UjP+Nc3s1J3ubrTQ870PW4LrULe1Xy5ZZXHRc59ziu0vbkPqsSyFCq53FhxVjUrnTfC1/bQWHhfS bewujjz8MCG7qTn8q3EXw7dRmWTRrIs3U7mx/OqjTS0uaLvY43xL4hgisfs1uwwepAxmvNfD+tah LrQhWKSaNpQflXJQZ6/SvY9aTwlb2jTHw7YTSZwvzvj3J5q94VsvD0kTvaeHdOjM4AfaXO4A5Her SSVkXzWVkjF8WPjQ5VDAYZSTntmvJPEF3cSqYbcsWb5VUdWJ4Fe7eMWhtruwto/C1le2Fy22dt77 l54GM/rWkPDfhCyuY7geHrFZYjuRizHafzoSEp8q1RyvgjQU0bRLcTKPOCDd/vVvcOAcYxzj0rbl 1PR9oC6fbux4VVJ5NUdV1nTbCzeY6XbDYMtv3AD9adiPaXNrwla6jlbuzhQq+V3yHAHvjvXfWwlW BBOytKB8xUYBNeceF/F76nZ28eiC0ihWdUYbWYEE8ge9el1pCzV0c1VNPUK8Y+Ivh2O+8T3c9s+y 6dlLEDn7gH9K9nryrxBqlvbeMNTSRTvDoM/8AWuTHVZUoKUe5nr0PJtf8M3gulMjlscc1T/sELID vIYDmu88WyTzEzW+NoGcVxNrqEjuTOPmJxiuKGKqTXMb005aFTW7tbewELzyGQcYFZkS2oiD3N2/ I6bqXxczQyH931HFczJO1zbEZxtr0fbJ2drmTTTN6BtHiuTI8pNMns7DWPE80oCLCYFCdiSByT65 rkhbTToCoyN23Na+yaG/mkUqsW5Itp68DtRXq6WSN6Cj8cu6X33Nrw60+lax9n1ayjvoHOFZuiD1 X/Cut1Z7TULYWN3axpb7gf8AU7Qce9craxNO+y4kZS3+rnU5H0Irs/DmrXcDR22sG2vLEnZlv9Yv oR61487yle9j00kk9LkFv4d0+Yy3Gn6fYzShPmilQNv9wTnBqBU0lm23VhBBInWOSJQ34cc/hXTS WtpFcC405ZYJVOQm8EOM9P8A61XJ/KuZoZpNKleRXALKQcA9T0/Ssq+Dq1d5W9GeFjsrpYmXPTk4 vrvYwrHw5aa6N0mnW0FmpyN0Kh3+pxx9K3x4etNLZ7rRbZVunUJIB/y0X3q/9oljgDQWMshyV8v7 uB65xV20mjMUUtxEyyA/6kgnaffHWsKtKVOnZvT1uevl9CnhI8lK7vvfqc5c6LHqenyXepJDbWi5 Mk5GCmOv1PtXAyMTcxWvmHyYxsjdhg+WTkZ+tdn4vZle7Mkt8Y3IlS3iQhAT/eHb61xCB5objzI2 NwrAYYYNb5dOMZ2expj4Kk/aRtr/AJXQ/WPDLX9uWtrlXA61gaD4SuLvXPsckyQovPmEdfpXcaZq awQxRGwPPD1Pe3mlm3eSVDDcqfkC96+j9rhZR5jynPqzL1DwPKbeSUTb1j4XaOTXOw+ENbcEm1dV 65bjivT/AA7NE+lR3c+oKrA58rPH5VfvfECzxSytKkcaLgY715OIxkKM7NaG8E6iueXab4I1G7iZ 3jJjXkgdTXefCnQba38d6VPsEU0IcAAYydtULTxyljKywx7o2GMH1rW+GWpwXfjvTQc/aHaQkeny murDYp80otKzencxnKMrWPbPHbtH4I8QuhIddOuCCOx8pq+ANP1GAWspljaWaTBO89T657V9/wDj vA8EeIcnA/s64yf+2TV+eq20kimWOSN41A3Mvbj0rrmk9zBpPRnVeC/Dmt6nLqdzpEH2m3tow88i jr/srnqR6Vj+ItReX9zNM0rL0DqMr6ivpnwPOmieFtMtbMCNDCrnaMB3YZJNfPnxXiis/HOoxND8 juJwBwBuHOKt0krSe5pDFz5fZdDb+HmmW0+iyT29vBJezyhGknXcLWNerAeprvv7XsNGUW9tOrSb epI3t/tMew9q8+8CLfXXhu7j05/IRJhtRl/1pI/ve1Pu/Dmuyys72ttuJySz5JrNTcJ3a09TXlVS O56FF4vsY4wbrU4R6qmXI/KmP8QtMRsIbq4IbjZAQD+decLpusWj/PpyyKP+eRFQ32peSv8ApFtL A2MAMpxRLETeyHHDQ7nq934yiltpEGlX88ci4wwVM5qrH46ltYIkn0q7lKqPmSRfyPvXk+jeKp3m +ysss0h4TYpYkfSt9brVJ1Kppl2x6g7MVnKpVUr2N6dOn7OVOT03Xr/wV+h3Y+IismV0K+J7jzF6 VFJ8Q75n/c+H5R7tOOBXHF9XiHz6bPxzxzVaTWLhFPmWlyje8Zo9vV7GPsKf9M7W98fQmGP+17Br JXbb5m/zMZ/vDsK2FisG8Gatc215EIbl4Q00ZyuQTxxyK8J8Q6nJfyRxSJIiE7WLKRmu98Bww2Hg 3xLHKJJbdpLbbGGOA2W5FOtVk6DjLdhChGNRSj0Ovt7SOaCFpZ2uLJS0exflDluQc919D61m+Jb+ 6C7DDC6OjBJkO75CQF49QarX17dWOiq1lZtZy+eqeQW3JGvUYz97P6VSvNQuAJLmeYEQxi3eAjJb f22gcda8VLqd9zQ8OWiafNc6dLJNI4/0hspktx8wHpzgitm4up4IpbdWQuWV97kyNDG3AZ/73OOn as2zmijutQdnuJ0nVbaFY1Pykjqx9QePfFRrHJosdvcKGTVblHScyNvGzPX0B/xpNa3YJkq2CCTz NVuFuJ7QlBFnHzKpIk+nNRaZd27WN1LqSSWVkZItskrYib/YcdTzz702xjtruTzrm1neKYSeaZZA iIFGRL6kdsVbht4dds5BdXCSR2si3DMIyqlQPkCk8HPrT6agyrYtanTk1Ca2klhjVY9gbAAVuMe2 cHFMvba/ubZtTvLhBLhmTZGCeD/Dj/Z/KrF1f3Wy5mEEMEdzIIrW2VMsx4DE/l9Kt6gsimL7HdM9 uis7McJ5TY2mMAfic0a7iMDxG7rqdnJayIbG308XUajCmRieVyecZ9K6n4YXkkfifw/p8siLKZfP JifMbbgSVH0rlNZWzuLmxu7CVb2ARGCUyDCxqnzEDHfrXS+BLqWTxp4eiFq0dt9sBilJ5Mew47cA 1rDWUfVfmRLZn01euI7KdyCQsbMQPYV4T4X8eeGtRmgWLVEhkdvuXClCD6E9K94uhm2mH+wf5V8/ y+GND1FGS50m1y5IMkS7HHPXI716GLzPDYFpYm65tmtdu55kaNSp/Dtp3Op1Xxx4bgsp449ctHuW jZY1iYsS2DjpWOfiz4VsbSKC3e8ujEiqRFDtGcc9feqMXgbw5a28n2bSlaYIfLaSRmIbHBra0jT9 NjtYZLTTbCMlBllgXOe/X3rzKnFWWU/fipy6bJfmzqWDxEqNrpa/pp+piT/F43qGLSfCt5dBuB55 yp/AA0R+LPiPfqf7I8NWmnRvj52iAI/FiP5V2cczqNitsUdlG0fpXCfELxtdaFqttplgIY5ZUWSW 7uFLiNScfKvfHU1jhuK5Y6usPgcKnLV+9LotW9F/XQwq4N0oc9Wq7eSJpdL+I2qr/wATPxNFZI33 khk5/wDHB/WoV+FqT4k1zxBf3Z77QcH8XNW/h3rGq6pqV0moa1pWpWygFFtxtlXnhtuB8priNJvb q68eeI/Oup5Y4re/Cq0hKqApAwOlZvO83q1K9KE4U/ZR5nyxbvfp72t/VEeww0Ywk05cztq/8jvt K8BeEInZYLb7fJHgOHud+M9MhcAVWvPFng7w5PNBp+mwzS2/Eps7UOIz05dvf3rn/gfG66H4jeBc SFEVcDkt5bVxvhfVJrDS9Wisrp4dRmWNY4Vt/NabDZdMY4PfJpPD42visVRxGJnNUXBWT5E+a12+ VOyWvR+Yva04U6cqdNR5r9L7f5n0D4e16DX9IhvrKSZbZyVKyDYUI6gjpXlGrfEvWzdTT2EdvHpU V15SsItzyKOcEnuQDXQ6DNr03wwvcQ3Vxq9y7xQrIoRgrcZwcYAGawtO+F2pzaEsdzqC2tyZQ/2R vmjXHG4kdWxXkZdhsrwmJrzzGUWlPkSbctLvmasrvSyUmkjor1MRVpwVFNO13bT0/wCGOw+J1/n4 ezXdjM6LcGEo8bEHaxB6ivG9WggSz0+4n08xQzly115m5rgDAIUHhdte2L4Rjk8E22gaveyTQ25D NNCNhKqcheew6VJpHhbSJdG06O7sIrkW4cw+d820Mc/jkAVnk2fYTJqLjG8rVJarS8XGy7dVezTS 3tex0YjBVcVCTel+Xfvrc6SxCLZWyxZEYiQJu642jGfepyahRfLCoo2qoAAHQD0qXJ9K+Dm7ybPR SskiG45GMVq+Cf8Aj+uv+uY/nWTOcA1q+CDm/u8/88x/OvouGP8AkYUvV/kznxX8NnY0UUV+wHih RRRQAV5P+0L4M1XxloukQaMkTyW1y0rh328FCOK9Yrn/ABjfmwtrZwrHc5BwM44qZpONmHs1U9x9 Tx7wD4V1/RLW1XWIGi8hiNkfz7l7HIqj8WdcSbTLzSbq2nj8wKY5HjIjPPr2r1S08QRyDJYfSpLq 7tLwCC4iilV+odQwx+NZNJqyZ1crUORrS1j5c0TwLq2u6DJqOh2QutkvltEBhiMfeUnhh9K6rS9P 8UeEvBV1eXGlXdtc2d0kiRmLcJIz94cdvevSX8YW+kyPbwWA2RvsiS2YDIzgYX1+ld1p2oS3a7YW yQPm3jIz6VjT9nJtReq3MlgZYf3rdDzfStba78Kp4gunWPS7kcrtJMfOMEd+am8GXe6J3uXErykk OqhRjtwPaugGlSC+ls9QCrbXSsmwYCtnrgUWHgPS7BovstxenyySvmSbgfr7Vok2dU0ota3MXxNq slne254Fs+NuejN3H4V1nhySO90O9ibmKZXRgvHDDBxWdq2k2d3EbPUAksYlEirnG0joQe1XdBhi slvba3QJEq5VQc44q0Z1klseJWXwmu9D1edYL1LjQ5ImVA7Ykiyc9P6ivTvC9msNkbK0gijS3UKr sp5/Hv8AWtnSMyxq8gOT2I7Vq3pxbYHGO4pKL3QRUYaHN6pocWp6PLY3uwyE5RmGdrdmxXlWq+G/ E+jx3sVpAb+WRdsJ88YPuQelejax4s0myuCbq7VZ4vkZP4iewx61wGtxz6v4rinvpWdVIkSNDswF 6DPrUSlbZXOlU293a5k/8Il4veKKC+ntxP5QYqqMVQf7TYxmvTfDlm+mrCGjL5RUaQDAJxycdq6X QdYTU7QeZbS2zgYMMoGSK4nRdbeGe5VyZpHmfzMsPkAPCgetXoZRTV0bfjbVm0XSPthRS6EFQxwG qppKN4htree7Jj5D7B39jVz7DH4k0/y9WtQEBDKm/Ow9ufWsDxBqlx4WiW1t4POnk/1RP3cerYp7 avYHHm0S1OV+IGjXaKZdA8Qys0DbJdPMeyQgnGUYdRVLQLTVvEfhi70mO+ZJIrzyWlny2FXBI9SK fqWs29tpiX2t6tDHcRy+YIFTMjkHgL3rgPGXxJ1nxE7RRsNP07oILf5Gb3dhyTVUITq3urIzrKFL Z3O9vvEFv4Y8Y6F4e8NSm4u5L6FNQvE+6AWH7tR0z6mvrevgD4X6Rb6j410e5lvorSO3vombfJl5 G3cKF759a+/62moxfLE55cztKXUK8a8bQBfFupS5B3OnH/AFr2WvLvGgjTxDcPKQqO6KcDJztGDX m5k2qSt3MpX6GJDarfxzpOxQRx7gB/EfSsGLw9b+bJKsTbm6ZPSuhM6WuoK8jDymGWPcGppdSshA xGASTurw+dpWQ/aNaGFqGh2Opw5uIhv2BMgVR/4QfSJJI/JhbMSbWB4yfWunsJreaVQScBfunt6V OZzBNJGSG3DO4dvaiNSa6iTfU5O08F6cn7uKAllbO3+tef8Aj7TY9M1lI4R8uAzkHkAk4OP0r2fT 9XVGuYSMcYMuPvCvIPixdg+Ml+yLlRBHl16Y56100JylLe5tQlaSi9U2vw6hpjTyWJWC4SJ1gH2a ViuyOXLBmbuCAQehzxW/ZtqlzdwteXFtbRSSKJCrplVdMO3tsZcj/frjdNMUhyY8MfSt62EaKcqO ldixSilHlPWlgpTvKLv6f5HU2EupQW9zZXd9a3SpbubO8R1WR5TnCuP768Dd0NSyJqwtryO1vGeT 7BAkDibC+cCPM53cH1PftXn+rXN2s260nvkG1QIkg3L15Jb6dqnh1O6a4TY+srFlgwwMsMfKQe30 q51XF7L5HmurNScVTm7eR6LHFeG2Vxdz/a/sEKHfdg/6QJv3nQ4+539PenTS6iNPiUFpJRDJBI5u B8rGbIkHPzEJ0rz65uNUEUbWNxrJkJ+cMoIx7Y716Ho8MtzZWz3V0I5/LBbzVJIOOQAO/v1rlr41 00pJI68LD2smqicbf102+f3GFqkE0mpi5jvQtuk0rzedPudlK4QADOcdwfWqvhTRxqltLIk22Yzu pz7DIrc8QoIrUqlusEX+wm0yH1OecVN8M7QHSr25JZiJshAOpx1FcCxUqz5tFZGuPp2pc3mvysZk 3h2cI2JSOcZzUn9gQNbr5CNK4GJC39K7zV4RFboqRZK7Wdj6HsawpHSSZIYHMTRZaTP8XsKFVdrH juUk9DAt/ClorQtceYjHnANVrvwpm5ZYZXEBPQmummvXEakFcbsAkZ21Xtr+MRma4c4O5FyejU3J uV27lOvJq1jFv/CVqnkPEOEGW9zW58PtAS18eafdbgrqG+T6rUM9zIbXfLIQgBKNjgAd62vh7qCX PiKxREOTvJY9Tx1rooVpOpFdLoj2jZ6N4/8A+RE8R/8AYNuf/RTV+dUEhS2AXgnGcd6/Rbx9z4F8 R9/+Jbc/+imr865o5FCPIoUsOw9q+k30Li+h9NQ6vaPoOmyR3MLTvaI6Irj5mC/d9umK8H8ea1Pr viBr67gWF9nlmNedoX1ru/hyLCfwVGY7eE3cLussj/eHcfhXIXywDXrqF4T+8AZBIeWJ4PPpWk78 iZjSS55RtqbHhLxNOkFnb3Moi4xHwArAeldw3iBljQsFfnHHYVylp4Dt5PLbUboiNABFBEfmHuT2 rVPhUxOotL6UKf4H54+tcNVQTvBnfRTqJJqx0Nnq9vJFvmj+Z/mJP8qg1Oa2ltpJliQqo6EhjXN3 mj67AS0LRSoBwq8flWBq17ewwyJc2s8bEYOFOKycakmdMXSgrQ1fd/5f53PR9Bh0+2jM9qipLKNz SoFy344q9NeKp+WaXp6j/CvKPBEHiS8RlsFC6ep4efIA+nrXWtoevN1vYR9FJolSmtP1J9v6fcv8 jqBduVALK2R0Ix/Kj7ZD0miwR7Zz+NcwNL8QQE4ktpsdOSCaq3lzrNsCJbB2x3Vs0uWoh+0pz+JL 5af8D8Cfxxc2Eli8bQLvxlSF6f8A16peCbPUNM8OahBOSf7QeF1Vj9xEJyp9zn8MVX0gnWb2SbU4 ZYYrQ52sMB27flXTvfRLCrcbK05vd5ZkThyNOD0KrXWpRwW8McQaOAMFUNxuPRue9ZEWt6nDcCca UZYvLaKVgwG9cYJzjrnoa3JL9dkhQZOM9e9ZXnSy21uEkVBGufLbozZ71NOhRe6/MidWp0KM1/fT KXg0S8hSWZZm/wBIyQB0AGPr+ddHo/iGzQmI2MsKnKi2lQl5N3UBunXvVZdWmMQM4iEvop4xTE1+ OG4jkdUO3nPoamVKlezX4lKU2tDUsrCW3W+mkRpDOmIYN5URD+7nuD3qDw7q63Znt57KS2vLZlJj mfcAB6e3pUh8TnUEO9ETacLjvWJc6panWfMiUvd7fLYpzx6UnRpS6fmJTqLS50cstxNaw2YvDCqy mSJlUZXnOM9etQahqlnpl3BbysrSTxOpbvIeu5h9eK5tY/EN7qgk+yeXBGMRqzYz7muhl8O2l/bW 8urW/wDpa/KGDcjNH1WHVWD20u5heB7i/uDO9lpawGWXMT71RFB4JII5r17wDpt1a+KrBruZLpN4 GTjcuAcYPoPQVx1l8OtQ0232afqRjRsMqyDJX2rs/A2karaeJ9Ma5uElRZRuw3bB6V1Rw1G/NbU5 ZV6u19D3K5/49pf90/yrxrT8lW9d39a9muP9RJ/un+VeNaZnLjodx/nXynF2kafz/Q68F1NEe9Vb fFrctCeIpmLRH0Y8lf6iroBGe9MniWaJkkXKN/n86+BjNap7M9OEktHsx3Q5xXI+MdM17VNStzp9 tpF5pqKN0V2i793cFjztPtXRC4ksxtug0kI6TgdB/tD+tXIyjqGRgVPQjoa6MPXng6irRin2vqv0 af3NGdehzxs9n1RyPw/8DyeHtUm1S+nga7dWSOG3B2RAnJ5PX0FTXvw40W61S5vfOv4TcMzSRwy7 VJb7wzjOD6V1sTHdzU3U4AJqq+e5hPESxDqtTkknbTRbIxhg6Kgocui1KOi6ZY6JYpZ6XbiCBTuw DksfUnuatpDBDI0sUMMcjcs6oASfrTiCM5B49qUA46V5VSrUqSc5ybb3be/qdCjGKSS0Q4sW5Jya AcYP6Uw5Xk9B3NU/tb3DNHYqW7Gcj5F+nqamNNy22NIwctiW/b7S32GM/fAMzD+BP8T0FXwVH3QA BwAO1V7OBLePYmSWO5mY5LH1JqzjNTUktIx2RUpXXLHZATk0obHvSYxSkccVmSQzng1reB/+P+6/ 65j+dZE6jb71r+Bxi+uv+uY/nX0fDH/Iwper/JnLiv4bOxooor9gPFCiiigArH8SSCO3h3KWBYjg e1bFc94xm8mC1J6GQ5P4UpbF01eSOfe3tZyTJaqD7DBqlqsun6XZSXM4KCNcjnH61om6DwgqASf4 vSknSy1CE295bpNGR8yvyDWL8jsjHuct4M0/RdflfWbmyWG5t2zE3mhlAI+8D0rTsNXhtNRmhsY5 LuxkYkzpxsPoQf5irD+H4PJEOmXCwwY4tz0H0NZ2sW88VqtkkxtpJPlSVB9xuxrFJxSv950txnfX 5Gx4h26npoEUrxled6nDKO+Pel0O8FtYxQfaGuUC7Vkc5Y/WvGNa+Kt14TurjTdesi+o2y4UjIWc dm+leMX/AMRdXbU7gWspgs5JPMSIOcR55IB9ParTb2OeUqcLRkz7IsdIjju96TSzRclVkbdgk5P1 q3Z/Jql6mOqA/XiuK+DeuJqHgy3me5824Q/vAQcrnkda6rSdSgv9fvUgdWaFFRwD0NWtjGq76ot6 X500YJTYoJ28daj1/UIrG3b7bIlupHDucCuW8IeLbYXM2k3cs63Ynkw7qSv3uma2fHogm0eJbm2+ 0Roxc5524HB9+aXNdGltddjwq50O1s9c1zxNf6xBeSEmWKKIEheMDOelcQ3jvVLyZnWEFoDhZQ3X 610knh/W9R8CXNvZWcs17qF2zSSuwVY0DE8n8hiqfh34c6xImpaeZNOW7ni22sf2gAs/pk9zU6dW RJtPTRGhoXxqvbIGK8tBKEUEsh6fSqum/EI6hql9fadaC2keTcFY+YN2Ou0dzUngv4E+LX8RRweJ rWPTdL25nnklVgVH8Iwepr3KPT9H0V7dNCi0iSyHyGWJApyOPTk+9E1y7jw/PUsr6nM/Ci/1Bbaa O8t7gi5YzG5fOSx7EHpXYalo82tXcRu2EFrFycfff/Cq+qeLbHSoppPMQmNSWC8nj0ArwzWPi3q3 ie7vorV5bHToUOFiGHb3JpKTex0T5afxbnq/ihfAsNhNYalaW0yjKnj94p9Q3UGvlzxPFDY6rPBp 9z5truJiLH5ivbPvVVrm7vLOa7uZZXRTjLP94+9UFkW/vUWYqi4xuVfugVvRlKm99Diq1FVS0sdT 8Nm8vxd4edgN8upQ/OeuN3QV+jFfnH4IJtPiH4ejhcy2jX8BUSc/xiv0craU1LVGFraBXjHxEvok 8UXySxFSoVRIGxztU9K9nr5y+L12bfxnqZZSy74wGx90bFrz8fHmppeYmMuru3RXTzclfunP3/UV UkuLaWRUDNuRTIqdicd/euemu2WULGqMsy5LH19arPdSxSI4R8tySw5BryXSJOq0vWZLS5l85lbc uAv9Ks3Gsvc3JVR5YCnd7KR1+tcmLp5bOJhH5blznd1q3G4yzvKBuXYR64p+ySdhK5qz615Gl7AS 02RjPVh61xnjC5+06hPNKw+a2ijQdDvB+6B9K37lwj27RqkoUHBP/oJrF1cWzR6zLdW0LzpApglA JwcZ2it8NRbnp2ZpTmoSUmZWkTp9rW3nkNrIxwpnTaCfrW/f3c+ixq1/ZH5nCB8FUOe+7piuF0Xx Fc2qGK4CvauPmUxiQr+DV3ngHXjfeIbLSxPbXWnyFnaymtiFOFPIBJxVyw7T947I5jTqQapytLpc jXXLsorWj6Thm2hHuMn8aY+u39um4XGi43BWVH3Fc9/pXp0XhvQFVt+kwK5OSfI3VbtfCmhPKFXT YckZy1rgY+tZOFtkcbjmMt5v7/8AgHmNt4lv4XVBfaD82TjzCB19a6Tw54tS41hdOv3tMlGcyWch YDHYmu8h8I6QjACwshx/zwFZnjG20zwxo1ncqunWy/aiDJMhHJU8DaM/hXPUw/Onob4d4ulNSrT9 1b63MTxPPHJE0ol2R9I4lUgufdmqx8OdaTT7C6t5xG21/Nd1B7jkfhXm/irxmZ52i09luVA5njjK J9Bu5pnhHUWjtNwlDSOwaVQc45NYUsJUhBuStc3xWZUK69jSd2j2rVdf8y3aBRhyR8p7nqP0rnNS 1J4trhI4nfC5649SfSubvLqWO8E0gkO47o/M4Zh7Cq11czTxkhJFbBMhbuM9DTVLqzz22bEl3Miy rJIGYPlQOpWpZ7qCIxzXASYThWAXgZ6Z/A9awNQleT7KynIZcgY55HSopp5WgWMoD5ZR1I6AnsK0 UExHRvODFE0kge3ZTGYt3B77vwroPho8MvinTfsYdoo2fLdumM15npiXN5MUlkBiLsBjsuNx+ldn 8KZmTx3pFsuUAWRj78dDV0Ir2kUu6/ML3PdvG2P+EM1/PT+z7j/0W1fAGozRLaqMAyDDJx09RX35 4+OPAviMjqNNuf8A0U1fnlEwkiVpAC5AOSa+jcLtMJQu0z0f4aW8dzoV44AUiUKT7Y5qh4xzG0N4 sWGX9yxA7djW/wDDiKKDwbLMnBmnYsfXAxXL+MJX8gLHJjMp4b0rp5U6VjDepYfp/iYWd0sFy7AE Aq55z7V1dv4jiVI5WlXDkgZPpUfh3QtMsbaC4uliu9QlQEseVjHYAetXNasdPntNv2eLc33R05/y K8+rCnKdos9jDzajKLWrX/B/HY17HW4ZBztbPvRrN1Zxae80pQjqUP8AEK5y28JRx2vmWV5LBI/I XOVHtWfq51bSoS81sl5txsZf6ipcZRlZO5MXGSu9DsLfXV8hPsyosAACBegFS/22ecrk1xPhrwXq 5tTdX189k0xLragZ2g+ta58L6mmdmpAj3XmnJNPclWZ0EeqIxBOT6YqaO6imON/1zXKHQtcgG6G6 hf8A2SMVXnuNV07m7smZcctEc0lcdkavjKGS2jtru0Ix5gVx2IJ5rkrSHWtQjKW1uViJKq0h7dq0 tL1ObXtRS3eN0tIf3jl+MleQB+NdJBq0JZlG1WU4AFRKaT1R06xpKPm3+RiW/hLV2gTffRq/fjgU N4O1XA/4mUR54+Wur+3kIuDnIpqaiOevFL2q7GT5n1OSl8J6xji8hP1U1CPBmqlsveRDPYJXZvqg GMKajfWSgBCZ+po9rHohe/3MGHwVPJbFGv5UkxjcopPC2mPoeqSafesju6742IyJPcH1roLDxGt2 z25hVNvfOSay/Eeo2sk1qvL3sTb4xHywHfNWqqeiRDjK/vGzrGqJp7WO1PMlllCBV9O9U9YkvbzV rSSzkRbK2fzJB3cjt9Kwby1urrWLe81BmWwZfLTYeYyfX61dnhvNIgtdOsle5jmm+WQ8lUPUGq5X 1IbS2PZNLvk1XTbW8CD96gbb6e1bPh+Nf7bs2VMfvP6GuS8PW0tlp32aR8m3kMYPTjqK6fw5NIdd sVL5Bk/Pg1tazOdO6PTphmJx7GvGLVSJXUMVIc/zr2iT7jfSvGYRmeXBGRIe/vXyfFvwUvn+h3YL eRooDjrThn8KaoAH3hn6in7l9R+Yr89Z6IY9apPYIHMlqz279zGflP1Xp/KrrDPRh+dKowOo/OiM 5Q1iyoTlHZmFd65Lpd1JbziO4eNBI+xGDbT09qTV76bUdMktkW4s2e4SDzoZVLq+Qdg9yOPxrbkh Cmae3SD7Y0e1XfoSPuhj6ZrBW21sb7hrLTJb3zFdXkbaMhTk4HGc4APXFdtF0JNTUUpK27tr6bW/ qxpOtStyyhf+vJoy1u3E+6w1TUTFbRsWjmlVsgZ3MSfQkflVjTLfWrzTo3i1xoY40ZZZWG4vnB3d MAgDqPWr7Wd9+9SLR9LVGUIhaY8qTmQPjsSSRVqxXUreJYk060hRwMhZ9ypyQQfXjGMepzXVUxEO W8FG/nyv+t/v+RDnQXwQf4/5lBLO41UQsuqXckU2WV3gKxMuQcpzjOARzkYNT6bPHayNfSa+11YC RrdYjGAqMxyF4547H0oW0u1W1MOj2qMcrdK1zhQp4IiAPXvzQLHUYri3aOw0zYZT5pRSCsanEZA6 E4J+lZynGacXJW/7d877beT/AMxTqU5O75rf18vwNd9bsIlDSXC7WcxqUG7LAZIGPatFZAwVgDhh kZ4rndH0+ZldNV06xiRW8yMQE8O33uPTGOa6KFFChQMKBgD0rx8XTo03y09X6pr8ClKMknG/zH5z RnFKRg0cda4xkMxwprX8D/8AH9d/9cx/OsmcAjNa/gkYvrr/AK5j+dfR8Mf8jCl6v8mcuK/hSOwo oor9gPFCiiigArhPivqD6dZaa6jKtOwYe22u7ryv483bW1roAQBme6cYPf5DUz+FlQdpI53TvFFg 03kmdVZvu5OMH0rZuprhIvOgJL9vQ18w/GA3Fp4i0+Xe0NvcQ52KdvIPJq3afEDxJ4W0222O93ph GCk3JUH0auez0OlVWm7n0voF/wDbTJ5w2SRsV47jHrVzWhbXFlJb3N0bd5FxHJuG9T2I+lfMll8V 475zHc3l3p0R7RdD9SK6bw/rHhprlbsaiJrhjzLLIWYfnUSTjLmd/TobRqwl1PMdW0/U5PHes2Wt 3Ml1dW+5fMmJyy9iPauIeJfsshZgJFfGM9a+ifiTotprVuniHQNQhi1SNPKdnbIuEHQf7wrxqHwj czys11PFG7HcQMu2foKftoR3djjxMo0XaR7n8DtUhj+HT3m4tJao8coHt93NdT4J121tJri6SWIP cfM4b1rwbSLC60OHybe/u2t5D80Wdie5xnmu00iTEa8V4uZ4ualGdCWi/H1PPxmLvGCpv1O01nWt J0OSW9lVGt3lBmI7Fj94HtXWQ+ItK1PQhHNqUMMVwPLjkZvmKnuB3NeN+MIftfh69gPRkz+RrzbS J3068tZZfNnSDpGX4x6D0rXK8TKpRfO7u5tg8baFqmp9o+INM0nS9JitbaRMBBsjj6nI+8fr1rwn xjpeo73ktY1G35lOTkY6Gui8F+KF8Q6Ms6o8MlqwgkVm3HH8JP8AKuhltFvF/fyCKI8l84wO4+td FWpKc7JHrUlD2fPc6G0TVfEPgbw7qE5V7lrUedFISFZxwHOOv0rkdU8C3+pzZ1TUJWjHHlw/IAPT itbxb8TNP8L6Va2di8bTqoSOHqdo9h61Rj+IdtqT2NxckWSxIZZ0L8biOF98da9GMVJ69OvT5HD9 a5PdTPFvjVY3fhjVrPSdKleLS5YhcFCxLSPnB3HqR7VxGjXb2rXjtAjm6Xa2OAPUiu1+KXiSHxX4 na7gH+iwRiCHPcDqfxNceSqjgUn2R5dXHz53yFWNGg06WxQKYJTuO4c59jVGxgt7O9824DeVtI9Q DV6aQY9qz7l9wI7Gmmwo4ipdXdzR+Hs0TfETQkxmI6jCV9vnFfpJX5peAAF+Ifh4Dtfw/wDoYr9L a3SPRvfUK+X/AIvEt8SNXVwWiVo2wD38tf1r6gr5i+LhYfEjVihDMSigH+E+WtceOdqa9RM5OIrL Cqs20jLK3XPfBq1E8eUZduMfXe/bNZ8b+ZxkAqQ3HG0jg8VNFt/0h2wIo8Ajv+VeXdoVixNM84bc dskrhiV4HHWobm3kbaqlgV7dafcTZWGVCpG0/MRz+NaOoXgUWvmIkLvGoYk9v/r0+dMaRnRTp5wk aX5VUj5Rgj04rF1zUEisNWgkgIecARSK/AwADuXGf5VoiJg4c7UKts/Hr0+lVL3T2aJg0hxI4BPc g+vr9fStqVXkd0Tda3OGSBgiMZIgH6HfXcfDGAx+NtOlWWJo3WVUIbgkJzz6VDeaUwtpE8tWeXAB XAWMDv71WtYLvTZo5rTdHNbhmjcDuw6EelbTxCnFxW559HDunUjNrZnvBMockRSY42kXGA34dqa9 2qTBHLo3obzGc14k2o6vegSam26aRsyuo2jGPlx6fSlaS5Sa2ZoIrmNE2qFY55zyw61yRjJv3pHr yzKSb5af3/8ADHvNlqRQypB5GQQWD3W7accVx/xtlnm8HQfaCu0XsePLlLdjXBRC/i1KSQRRjziG Cgbgy46f571V1VNY1KIWd3cTG0h/eRxNgA46ZHqM4BojBxqX5tEZVcdOvQnB07Nq39bHNbR13SfT PFdZ4SnxDHujWWMEptJxWVa6LKscUksbMHztUHj8fStdNGe28yJ5dsLEOrA859CK0xE1ONkeXl1C pRm3PZq36mu88TO0kl05Zl4I+chugXnoD0FbVpYiSxPny+TG7AXUYOWDdsA+g5rAjgENq12iqsgO 1g4ztx0/H+tSx3ErOrTXDM1yMF35Ibvk9q4pQdrJnp7Fq7MbfZ1tp1eOEOGmJwzAHjjt1qG9mRrl lhZVYOqFB0k9WFVLnTpoHkkUhY4sk45GD29/rVYwvE6KkhWRUDI69VzzVezuwsdvBa2dtpkzvJE1 1IjJEgIAGSB+B46mpvhTJC3jjSknBe6RpUDEEYwvXP8AQ159HdTtd4IZ5ChV5CMED1Getdf8J33f EbRjHISkzSSMdxIyEx09TWmHpctSMn3QH0L48GfA/iIDknTrj/0U1fAul+G729jxDbTyyFflKodv 51+hOtqr6Nfq4BU28gIPcbTXjUUaRW6CCJUQDhVGBivor2K1PK9F0ubQfB0MGpMlsU3ySBm55NUv DmneHvE0zfaLsvPGSFgVsbl6lq6Lxn4Pv9d1B5xdj7I2P3Le1N8MeE4tDuPMCIkjkBnVMbV71pKp eNiFSV3J7nL+FtK1m7j1y5ggkOkWCyFHI4Lg4VQahmXVkQLeWLSLw2YjkV9OvpVofC0umWkSwW7Q lQE9Tzu/E14rp2pwSmSGTCywsYnB7MpxXPV5b8yRvRk2rHO6f4gVWWK4V4nHZ1xW3PfI0UdxEQWh O/bjIf2rSlsrO/j8uVEYNwWI5FcvrvhueNkj8OzTRuTjZIcqfU+1crpL7LO1Voy/iR17o1YvEMd0 xcOuT1B4I/CnrrCM2Cwz9aztP8IG2DNfXtxPcNy2HIQeyj0q9/wjtrswHmU+ocis3FrqUvY939y/ zNKHUEKDceO9StILgEBAFPGW/wAK5S60i9glxpl28mDys3zA/jUf9o6lph/0+2baP44/mH5ULn9Q bpL4Vr5/5f5tjPGS3GkR+dYouGOOF5IPb86w/DegeIZCLu5nSLj5Y5Bk4966e61/T9TurCOKVXdT vZT2wOBitBtSwMrtGa09ooq1jNucndsyL9dWisyXSGNUAy+7qaxLQa7cTbVKoGzgkZB/Guh1TVJo 41KQLOhPzqT2qvo17Lm4kaNYUkYFIyelXCMORyaMpSnzJJ6Fb+z9fwB5lvmoLjT9eQkkQOvpnrXU i+A4wpP1p6ahEw2yAjvkVjzR7Gl5HKaVYaozsJdkIPBK9ataHpS6JrgaaR57e6ztlk5ZG/uk11ge 2MLPHNGzDnGeTWLNcpPILdNrkyb9v0q1UUfhJacviJ/EF5BAyWuN7SNnYozxVjRL5oruzGowmKWW 7jhiUnIYE8EVzMkNzp3iJLq8kM1vdsArEcp/s10t28U3izwxYM21DepKT6Y6VrFaruYz+F27HpFg T/bfiGKXJjjuvk56fKMit/QGhOt2IVTu83g/ga5W4uWtzqF60ZU3GpSJ16gADNanhG9E3iLTwUIz Lx+RrZrUwjsexnpXwr418IavL4u1u4h066MUl5K6OZ2VSCx5Az0r7pbpXxx4+8V3Nt4k1aAyYWG6 kReewaiy502r6P8AQq10cEPCGvFtqwbD7zt/jUd54Z8RWhChtzeiSE4/WtW11jVNTZzDNsjXqzd/ p61r2aTA4mmlkYnqaJyS2RUYXOU0nwn4q1O+it1uRbCQ43yTHAHr1r3jwb8KNAsBaz6reahrNyv3 1e4KRMSOuwfwj61geG5Io518yCJFUbWd2wW/xr0bw/dRkSSmUM6YCKvHH0PaknfoDVjkNf8A2fI7 iSWTQvF9/bMzbxDcDzEUE8AEEGvPNX+BvxEstxtLyPUQJNqi3nbcy4+9g9K+mo5x5Ssg/dsQGfPG e1akEzBg0bAswySOKenYk+HNQ8JeN9OuWgu4LlJl6ozkH+dZ72Hiy1bMlldH/voj+dfeV7a2Ooxv HqFpFMQcfvFBI/HqK8/8V/C+SbTnl8G6hLb3+4uILqUtGw/ug9val8kPQ+R0udUgvbf7fY3MYMqc lnUfeHvX2uDwh7bR/IV8w3njPVtL1U6X4gsjFdwyhHini5HzYyM9frXr/ijxvd6LdwW1tBbXRaLz GMpMTAdiRXyXEuWV8xq0aWHinL3tNu3XY7cNONGEpy2Vj0AHke1WVYY9K8Wn+JOsXMUscEVhaFkI DIDI2SOMdvx7V6P4LvPtvhTSpzK8rmAK8jkks44Y5PXnvXyGa8OYzLKMa2JSV3ayd+l+mh0YfG06 8nGn0OjzRk+lRhug708MQea+dsdlyOXLKe1bHgj/AI/7v/rmP51jyvwetbHgf/j/ALr/AK5j+dfR cMr/AIUKXq/yZzYr+EzsaKKK/YDxQooooAK8K/aluWsofBlyGZVj1Nt+P7pjOa91rw/9qe3e40Pw /t27Uu5C2T28s1E3aLMq9T2VNz7HkXxU8KR+KPDdtrGizfaJrYnIMoO9D1C+464rzbTb+6t7CTT9 QjW7tGjaJVYfMhHfNalvdTw6b9miuJVtzD5hRG2jcD96nGGItIQo4kR2OOzDnFcyulbocdfNXOSl SVn1OEOksvTJHHPsa6Lwt4X+0qLy/wB32fdtSJDhpWHXPovvWjNYotmSzgP80YTuSOQa7fw7DHML KSHOHgXbt746jHrmuTG4mdKBFLESqX5irHpE0sUMcSFIIhhIkyFUf1q/HpC28PmTP5ajsV6+1djH ZTrCMZ56c1l6pbTsmy4WQY+ZcKTgjvXz/NVm1zXS9BunOWsr29Dnr6z/AOJZOzQxxuBwM5P/ANak 0o4RRml1K3uIo2ExIdsEKDkEe/vUml2s0qboY8gf7QGPzpTpycLW+4wrQaWxNfKZYGQ9GGKzbrwf IkZlaKORcdjitiSCXd5bFFfbnlhwK6oxSz6dbCJUSNwA+5uX9h6VvgIuN1LQ9DLaEKqkprXoeVnT fEmjSSvov2izMihX8vAVsdM5rLnXxTcyl7/UZ3PfzLoAfkK93kWGaLy761JXGAwG4fmK5PXfDWll JJbPyRKASVz1/A969L2soR0VzsrYOVON4Sv5HjevWFza+XeRXEssUh2Pl9zI3pu7is6IzsuCXIHb PFd9q8FpDBFp0gLSO3nOq/wYHH5ZzWa2lMqF4ds0ePlYYJb6DpXZhqrqQuz5/EYqMJWObVJCue1D QuRk5x61ueV820Llx2HzH8+g/nTDHvc469yvOPq3T8q6NjnVcwZLY9WzVOa2I610hjUhtvP+7/Vj VSW3ySAAfXb0/E0XN4V2ip4Fhx4/8Okjn+0IP/QxX6R1+evgm1/4rjw+ygEC/h6DgfOO9foVW9OV 0evhqntIhXzV8UNPif4ha3OVc3LyRBPmyCBEnHtX0rXzx8Q7ct8S9R3yfu5WVQnv5S965MwbVNW7 /ozpRxiwKbqImJhLnc6NwCw7fQ0sLNHdyv8AZY0mYld68eYOpODVcGQyvyWSPKMh6/XPoKfcyxp8 6ybZlj2pMRnj27e1eRdoV7Mle3t5BFJ8yBiEZHH3ST+X0qK8sI7iVZH3usLMj85BA+7VS4lmWJZ5 3KbuSg6D3rQtJY7eYOMtCy4w386jmbYX1sRahBFLNbC2j8tQAHVucZHH1qKJH+zt5pXch4J5JGev +FaV0sck9xLOc7QGXnHUdqktLGLzZTJIRbxxLvbu7Y5FWp3aQ+SyuYbCRpsxZQOSoPUbR7/4VBO6 NcxrJsCb8FQSfbJro74wma3efItSm1QowSPYdvrVKfRUkDfZUyq8NI56d8VPtNSXBszo1AZwB/o+ 4qyZz06MKkupzBL5aoqdDvAycfWr72kh02J3YxXBBUlRxtqjFCrX7w7hnaIvMB4J65o9oPlJfPR1 Xyhl1TAx1weo/Op0kX78qEpt2Ab859TTYGSK8vIJwRNFGNjEdQBnLf4VVsYprgfa3ZUJztXbyT3O O1NTaDR7jhPCyeTH5n2deT/eznuavNcHz9wEUm7jYBgsvuahSNkeZsLscbVUcEDuapLahWa4i6Ic nninzWuJkskmwTAlZbgA4I4A4+7j+tT2pBaJGG1F2qVA4Pc/j71pP9nOm7XCkthfM6sg68etYfW7 WJR5SE7WbPAPrScrrQGrF1Qstwd8pRFOzC8hjnpVnUXWFHFkqbgwWQsPbkY7fWooLUKPKZMsoIJz x7mqcAaG/bzitwpBGM/e/wB6jmAgDiQh1KSwxpg4GGXJ+79a6z4T7E+I+jZGQyyBF24Cnbzj1rm2 eX7HIk0MawFshAmCPxrt/hlAq/EDSGMgKeW2yL+6dvPNa0Z/vI27oFqe/wCsDOkXw9YH/wDQTXjC ACMKH6DpXtGqjOl3g/6Yv/6Ca8fSNQCW56V78mUkV22HHzkHp0qSPyg6CXLLuAP51ZEcQ+bA6ZxS SRxnLFM+uKi5Z0uo3Qs7q0t2AEVy2xT/AHQBn8q8C+Inw11zRvFV7qtjcM+l3sxlEsQz5RPUMP61 6ld+KrIeI9Pt9Qhlt7WC3c+Y4yu48Dn6V2Gm6jbzxCLzIbiylXCuDuHPY+1appmKbgz5uWfU9JCt cD7TD/fi+8PqKh1XxWsdukttdRgoSWQ8FvY19B6h8PdHuVk8jzYCx3AKchfoPSvJPGXwZvWvPtKG OexQ7nMK/vCPTFYujGW50RqrqYGh+LrHUflEpSQAZD8DPse9dHHOXUEuGPqORWVHoulmEQR2qoiD G1lwwqNfD0apm1nnh9AjcVyOK+yzov3Ol08qQ3mYIHoKmlgt5l2Iwyx71ytvbazpkxeOZb2A9Y34 b8DRL4ks4nK3LSW755DqRj8aNYitfYy/FfhJ57r7TphjtbpeBITtB/xqLT/Cep/Zk+3akRP/ABKn QVS1vxXZxalZzee00MbZcK2eD7V10N6lzCk0Tko43KwPBFa8zt7yFqnozFPhOb5tuoTkn1FVX8N6 nCy+Tf71/wBta6ZrlxjByO+acl6cEOvX0NLnXYd5dzkJNP1+Fc4hmA6AHFVXu9Xg4l0+Qt6oc13k l6hhhjEWCpJd+7DsKY0kZ5OMUe490HPJHJaXFqN+5IT7NkY3MOcfSuj0rQra2lF0oZJ1+VwWzmtK zVScqODz06U24mRZ2Rn2+YoFapRtZIxlKTd2cnrt7LrGopY20TrBbyAyPjGSPT2rovDHh691Txnb XZLPZ2yZWTpub2+laq2qXMYjZVE4wBIByR2r1Dw7pcWkWFrbRgbgmWfHJY9a2pQSd+xjVqO1u5je JzCthZW8sLRO0rOob+I9zUfhABfFWmhTwJf6GoPF0kV9qyJuylr8q4P8Xc1d8HY/4STTuBxL/Q1M pNy0CKSie0H+tfE3izQUn8ceJPtcXnB7+V1YE/INx4r7Zbp+NeLXWj2NtrOs3kwwXuJDtbkdeSad R8uqKgrnlVp4f+z2kdzMdsfG3AAGKqX0kcTFYvunjHc/jWr4m1JXdolykSKVVV4A9K45pgbgM4LL joT3rBXepsdXo6Jc+X9pUwwk4Dc/Lg849TXXRec9xmFi0GepG0hR0P1rjYjcWdnaYnR1ZfMC5yFP piurg1EkWkRiZEXl9j5JJHc+lapGbOwsLp5riO3m/wBHIwoB6Off/GulhnZFZG2bkGWYc8VxseqQ ugiISKMNldx3En61uwq/lsZFiMSjJ8sHkY9fSqRBvx3G5DtVTkZ54NS28ha4w7rEB0zWBa3DyKoV WO4Ebs9avpKYYw0zfu3H3sZ20wKnjHwh4e8XHzNd06O6uIhiKfJV1I6cj0rjrvwPpN1cvNcy3ssz nLM8oOfxxXfzXOYmUMVULnJ7VhpKGHPBr5DirE18PKlKhJxb5ttOx24SKkpKSvsYNr4P0K2ztsBK 3czOWB/DgV0UDKiIiqqIoAVVGAB6AdqTg80EDPNfDV69TEa1pOXq2zvjFR+FWLYkHtUgOTkc1SDc cVNBLg9a8+dO2qLTJZEJBrY8Ef8AH9d/9cx/Osh3yCfatfwQ2b+74/5Zj+de7wz/AMjCl6/oznxX 8JnY0UUV+vHjBRRRQAV4l+1Fc/ZtG8O5QMHvmUg5/uHkY/rXtteGftVBDpHhjfn/AJCDYOCcfIfT +tRU+FnLjbewlfseCNbQ3cEt3bShyitGAoBDH0+tUGeQRujKULW6ttbjBU9x/wDXpbG8eERi2kTy pLpkkCgSDH1HAralWz1CAyRPG0iBoSyNkj2I6E+9c2x8sm6Tt0X+ZzeoOT5pXONyzAD3GDwMfzNO 8O64+mzPZuvmW4fcE3YIz3U9jVuW2C/Z4rlWEjxGEhxnp0PHyisa6tFuBAN4EjoVUq2SGX3Hyisq 1ONWPKzto1Unv8/69Ge1aB4ztJI0VnQkADEvySfn0P14rXn1KK7kBgfYGwcsf09K+c7fVLmx8sXa eajdGXkjHXOOM1v6d4nsmA2XPln03YrysRQrJWauu6/r9D2fr9dw5ZK67o9Qmslurhli+ZQcuRzj /Z+tWLXRYGJMm5R9K4S08SsnMOole/3xWini+9C7RqvH1FeXLDNO2qX9ehwTlGW52raNbELHbhvN 7MR0NbFjGskPlSK3mwfJIhONp9QfSvMm8ZXo66sV+jAVlX/i2Fsm61JpSf70mc1vh4SpXtFtv+vM 6sHjFhr8sbtnqWp6pbacrg3Ue/oqJ8x/SuI8QeJd0ZkkYRxpnDtjdz6Vw1z4pWRhHYRGR3yF9z6D 3qosFxePHcalKiq3zRxuclx3UL13D3rvhha1Z+/7qFiswq1Fao7LsWY5pdQuGuNjCKQ7U8w7VPPb uW9u9WQjpt7bDlXPyIPUoo5PuKVViWON1dW3gYkuPvuB/dXs4+lCkbhIGDbyD51w3MmP7q/wuPpz XrwjGEVGOx4c587/AK/r+tVvbQ+3xTWyx3tnHLCQC02NpbH8SDv9OtNexSeNWtp45PM+aNJW2hh6 gDvVONlb96rb9xz9ouGxvI/ur/C49Mc0wESkyxkSZP8Ax8znYpI/ur/C/t3p7bGbja1nb+v68/Lt HcWzICzodqHBaX5EX8P8g1A0RZS2Nyjgu/yoPwrWj1aeWARoYrhVJDXE6hFb/ZPofrUkUNjqCyzx ToHj4w5wqH0wcce1O/caqSjv/X+X9aEXgyHd4y0Jtpk230WWb5VHzDpX3lXw74VtZI/GOgedulk+ 2xbSnEY+YdD/AEr7iral1PdyqfNCQV88fEWVYvH+rSujDbKgV88A+UtfQ9fPfxJ8P+INQ8c6s1no 9/NZvJG6TRxEq+I1B5+oxXLmMZSprlXX9GerexykixF90L5eblsdKzbawea9VZirRoSY1zxxziuh m8P+Jiu2Dw3qauRg5gOPzqMeD/Exww0K/WcdGMRIFeOoT6xYpasw7m0a4Z5TsEDnfsHcD+VSySqS mYiqjglTnA7V0M3hLxGyMkWkagHVcbzAQGz1rOn8FeJpdwOh6io4xiI4qvZyW6f3A/IqJdee7xtj bgMWPt0FW57tPsgDMDKzZwF+9UU3hDxP5ixQ6Bqgixhm8g81al8G+KJjAyaHexxHBcGI7hiolSnf 3YspPSxjyXs5jclPMcJ8pI4UVJBeKunpHNICsrAsAemK0bjwn4lmuTnw/qYQDC4hOMUDwX4j5/4k Wogg7t3kHn6UKlK/wslszZL2V7WW1VF27gyHPNMWFPOhl2HIPIHY1qxeD/Eskh36BqCIOh8k5rQt fCniK3X5dF1FyVOcwnmn7KbfwlLQyBCn22aNhl5UIeU9+OlMS1aKPzICcKO3QDtWyfCfiQOkw0bU N2DlPKOKvW3hnxAtvFjRb0bwRIrxHg/Sl7Oafwv7hLU4nzd6OzKxbo4zgGi6kia2iihTLNgAgfpX Qv4M8RlJITo18Yy2ciE5wetVJPBniSN0RNE1NlXowtzxVeyna3KwsZpfKRNMhAOckdiKjYLtV0cT PncylehrpZPCPiKC0aJdF1CYSYbIhOR9fSnHwv4lCLGNDv8AAXBItzQsPPsxXuzGN3LeQhok3TuN u1Rjn1qpcQSBY7eVgs7cbV6fXNbJ8I+IpbgCLQ9Whj75hPX1FWU8Ia+t1Ez6Pqkqsfm/ckYFHsJ2 2YWbMW3RtqJK4MGf3gPQCuv+Fckc3jrT22Ald6qzdR8vasPUfB3iJZ5IbbQtSKTdXERIQfWun+HH hvXtP8caZPeaZew2kYcNJJCQB8vc1rQpT9pG62Y+p7pqnGmXZ/6Yv/6Ca8nQBxjAHevWNTt3u9Nu 7aOTypJonjWTGdpIIBx7ZrytfhZrgA/4qo8f9O//ANevdnfohOTWyGeUmR/L1prRjaW3e2PSp/8A hV2u8/8AFVEZ6/6P/wDXpB8LNcHTxUf/AAH/APr1n73b8he0f8pmXNpHMPnXcO+7msObRbu0kWXR bk2smdwAGVPsRXXH4V62Tz4qP/gP/wDXo/4VXrZGD4qOP+vb/wCvVXl/L+Qud/ylTS/iA2nKsPia ymtQOBcRgun19QPavQNMv7XUrRLrTrmK4hccPGcg/wCFcPP8J9ZnhMcnijKnrm2z/WqumfBnVdJm eXS/Fctq0hy4SHhj6kZxRzS7fkDl/dOy1nwzpmsbjd2yrMRjzY/lYGuQuvhzPEcWOoRsv92VcH86 2B4B8UAAHxgx/wC3f/69H/CAeJz18Xk/9u3/ANeiS5t4/l/mEalSOyORvfCGu26k/YhOo/ihcNn8 K5PXNHYxul5ZyI3fzIyK9ZHw/wDEwOR4vYf9u/8A9eh/h94lkXbJ4t3j0a1B/rWXstbpP8DRYifW J8h+ItLB1JbWyiLzyNtVFHJrrNH8IahY2caDUJUY/eRTlQfaveZfgzdy3gu31q1+0jgSCzAP86R/ gzeucnX0H0tyP/Zq0lzNWS/IPbu9+U8Om0DV1csdX8uNem7+tQwrqkMrKLtJiuMARM+/8hXvlv8A B+/tyDHrsBYHIL2gY/qa0U+HfiKP/V+KUQf7NoB/WhLT3o/l/mJ159E/wPDdItvE2pS+VB4eurgD /lqo8tB9d1Wp9O1NHZLvRtQgaM85hJH4Eda9rPw/8THr4ubHp9n/APr00/D3xMRg+L2x/wBe/wD9 ejkj/K/wF7er/L/X3njdst8ibobS8uGH3YkjOTSReH5LnW4559agtJJMBrW9haJox/skjBr2Fvhv 4hbr4rOfX7N/9eoZvhdrk6FZ/FCyjp+8tQ38zRFcu0X+BMqtSXQybex0HRBb3V/qkDPGMsGlUAke 1bLa7bS6Y+p2RMsEi7IJOgc+1YJ+AjM8bSa3E+w5CtbZGfzrVf4Taw8SRf8ACUbYYxhI1tsKo9hm tOeSVlH+vvIvJu7RzIBJJb7xOd3vW74MDf8ACSadx/y05/I1MPhBqwGP+EoP/gP/APXrT8N/DTU9 I1yxvpvEP2iK3k3tF5GN4wRjOeOtZrm6o0U32PUG6fjXzD47+KVgniPV9KuI4Y2tbqSIt5hBOD9O tfTzZI4614p4y+Beiaz4iu9TFlJP9sczSj7RsIkPX8KWJqqjDncHLyWrNYK7tex4Xca1YXZZormL 5uceYDk1WDRzSBgV2jqQwNeuN+zjofbS7j/wOqF/2eNPQkQ6XdY/7CAFcEcyi/8AlxU/8BNeSX8y POLaaNDGysdytkAnIFdKdXidGOYd0/8ArAoI2/T3rZuv2fXcAWtpcwfKwP8ApoYkkfKeT29O9Nt/ 2fLlUkEguWLLhWF0o2HHUc8854PrW6x0LX9nP/wFk8j7r7zLiurYO3l3IjiByqM2T+JrrLXxRp0O mNEdSdGIO2POVX1z9aoS/AAts8u2vIypBbF+DvGOnt61HH+z64EQlhvZdqkPm+Ubz2PXjHtSWPjv 7Kf/AICHs33X3luDxnpFpEA92WcegPFXZPin4ejt0EjzOw4IQAfzrKj/AGfIfMZpLC6K4ACG/GM+ uc0q/s+W4XP9mzk5z818KX9oJf8ALqf/AICDpP8AmX3lbVfitp88Jt7NTHvYKJHcAgE9OK7RbtPl GecZFcWv7PLecrmC6+VgwH2qPsc111/8NtZvZLpnhljFzGkcix3SLwowAD2B7jvXiZ1ReYOnywku W/2X1sb4eXsr3a+8nF0uM7hj609btGz8w/Osif4Va1Np1pYvG7Q2oAhJnj3LxjrU9p8NdetL+S6S BnZ4jCVM8YGD3OOp968R5HOztGV/8LOj6wvL7zTW8jUkFunrVmKdGIBb6Gubi+FviS3bTzBNM8Vo rL5U06MJM54bkAgZrT07wJ4jsrGC1WAyJEu0NJcIWP61jVyCrb3FJ/8Abr/r/hxrELr+ZuZOMdQe 4re8Ef8AH/d/9cx/OuXtfDviuD5DZo8Z7+egI/Wuv8G6bqNncXEmo26QhkCriQMSc+1a5Lk+KwuP p1JwfKm9bPsya9aEqbSZ1VFFFfpJ5YUUUUAFVr7T7PUFRb+0t7lUO5RNGrhT6jI4qzRQDV9zJXw1 oSjC6LpgGd2Bax9fXpTl8O6Imduj6cueTi1QZ/StSilYnki+hmtoGjt97SdPP1tk/wAKZH4b0ONC kei6YiE52raxgZ9elatFFkHJHsZCeGNBjQpHomlqhOSq2kYGfyqP/hEfDf8A0L2j/wDgFF/8TW3R TsNRSMZfCnh1fu6DpI+lnH/hS/8ACL6B/wBAPSv/AAEj/wAK2KKVkHKuxjnwt4fPXQtKP/bnH/hT P+ES8N5z/wAI/pGfX7FH/wDE1t0UWQWRkL4X0BcbdD0sYO4YtIxg+vSnN4b0N2BfRtMYg7gTaxnB 9enWtWiiwuSPYypPDehyEGTRtMYg7gWtYzz69KJfDehy483RtNfByN1qhwfXpWrRTsHJHsZUvhzR JhiXRtNkGc/NaoefXpSy+HdElGJdH01xnOGtUP8AStSilYOSK6GVJ4c0OVCkmjaa6nqGtUI/lQ3h zQ3Qq2jaaynqDaoQf0rVop2Dkj2M6HQ9JhKGHS7GMocqUt0G0+3HFaNFFA1FLYKKKKBhRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFAHnuqeItUg1O7iiutscczqo8tDgBiB2qr/AMJPq/8Az9/+Qk/wqnrX/IZv/wDr 4k/9CNc7Zy6i+pzpOAtsAQjmLAbaT0+bIzvTrnPltgLkZ+j5KMIwvTvfyX4n4rHE5jiq1fkxTiqf NKznJXSe0d7vyOu/4SfV/wDn7/8AISf4Uf8ACT6v/wA/f/kJP8K46wn1N4rxrkCMhd0W6DOeABgB s9UZthOf3i/N2FnRpL2W3c6gnlyBzhCoyASWHIOCAGVeg5RvvdaVN0JtJU979F0NsVDNMNTqVHju bkUW0qk23zbW7tbS/lej1Oo/4SfV/wDn7/8AISf4Uf8ACT6v/wA/f/kJP8KxqK6fq1H+Rfcjw/7Z zH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M 2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCf v/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6 v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8A Csaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3 IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4 HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X /wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH /CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDk JP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR /kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/o In/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8A hJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yE n+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9 /wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsai j6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7Z zH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M 2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCf v/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6 v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8A Csaij6tR/kX3IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3 IP7ZzH/oIn/4HL/M2f8AhJ9X/wCfv/yEn+FH/CT6v/z9/wDkJP8ACsaij6tR/kX3IP7ZzH/oIn/4 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 47889u1W7Ww1q4vrQ6zc2b2tpIJl+zq2+d1+6XzwOfmOO/HuLS6bMND1Kz3R+bcyXDocnAEnTPH5 1fJipr3XJKzte172X4X/AKsc9bE5HhZOp7OjOeitHncORzVnq0+fk5r9lZv3rmruBTegLAjcvuOo rlvDniC91W9i3/2c1tMGPkwykXEGBnLq2M9MHA756V06IRbRx7irLEqbh2IUDIzXM2+hX8msW1zq A0vFtMs4uYIStxMyfd3noAepx6YHt04t4jnpunfzS+W7+/p9zPKyGOSqWOp4tw5deSUrtpe98MVb m+y/iUrpWTTlaYajrl273WmWljJpySMixySMJpwjEMVP3VyQQM+melSXt9rFze3UehwWfk2jeW73 ZbMjlQ2FC9MAjOT/ABD0NRNpesw+bY2F5aQ6ZI7sJCjefAHJJVMHBwSSCTnn2FS3lhrFte3T6FNZ i3umDsl3uLRuFC5UjrkAZz6D1Nc6+s2XNz762t5/D5Xt+HmejH+x+ZeydC/J+75vab+5f2z25rc9 la3Ntpyj7rW5TpulXljaNK17MIvs7H5gfmBXdwOGXG48Y5xUUWsXtgL6LXY7Xzre2N2kloW8uRAQ pXDfMGyR+B9uW6jp72tl4fsLS5ZJYrxQlwy5JfDsWK56Fiflz0OM96dFo15fxag+uy2wuLm3Nqi2 inZChIYkFuSdwHXpt9+IU8XKbUb8yt25fh1v8/63N5UOH6eFdWSh7GU6tn7/ALVpSXs/Z36Lrza8 vxa2K+l+ILp9Ttob+fR5YrpxEiWVxvkidvuhucMM/KSOMnPSujtvtH777T5X+sPleXn/AFeBjdn+ LO7px0rndK0K8i1G3lu7fRIordg4ktLULLKV6ZyMJnqSvI6DHUdFbfaP332nyv8AWHyvLz/q8DG7 P8Wd3TjpXXgPb8v76++l/Tr/AF+B4/F39k+0X9lcluV35b7cy5bX+1bfW/L8ST3mooor0j4QKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKALutf8hm/wD+viT/ANCNZs1zDDLDHLIqyTMVjU9WIBJ/QVpa1/yG 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 yD/hGNI/59P/ACK/+NH/AAjGkf8APp/5Ff8Axooo+s1v5397D+xsu/6B4f8AgEf8g/4RjSP+fT/y K/8AjR/wjGkf8+n/AJFf/Giij6zW/nf3sP7Gy7/oHh/4BH/IP+EY0j/n0/8AIr/40f8ACMaR/wA+ n/kV/wDGiij6zW/nf3sP7Gy7/oHh/wCAR/yD/hGNI/59P/Ir/wCNH/CMaR/z6f8AkV/8aKKPrNb+ d/ew/sbLv+geH/gEf8g/4RjSP+fT/wAiv/jR/wAIxpH/AD6f+RX/AMaKKPrNb+d/ew/sbLv+geH/ AIBH/IP+EY0j/n0/8iv/AI0f8IxpH/Pp/wCRX/xooo+s1v5397D+xsu/6B4f+AR/yD/hGNI/59P/ ACK/+NH/AAjGkf8APp/5Ff8Axooo+s1v5397D+xsu/6B4f8AgEf8g/4RjSP+fT/yK/8AjR/wjGkf 8+n/AJFf/Giij6zW/nf3sP7Gy7/oHh/4BH/IP+EY0j/n0/8AIr/40f8ACMaR/wA+n/kV/wDGiij6 zW/nf3sP7Gy7/oHh/wCAR/yD/hGNI/59P/Ir/wCNH/CMaR/z6f8AkV/8aKKPrNb+d/ew/sbLv+ge H/gEf8g/4RjSP+fT/wAiv/jR/wAIxpH/AD6f+RX/AMaKKPrNb+d/ew/sbLv+geH/AIBH/IP+EY0j /n0/8iv/AI0f8IxpH/Pp/wCRX/xooo+s1v5397D+xsu/6B4f+AR/yD/hGNI/59P/ACK/+NFFFH1m t/O/vYf2Nl3/AEDw/wDAI/5H/9kNCmVuZHN0cmVhbQ0KZW5kb2JqDQo2IDAgb2JqDQo8PC9UeXBl L0ZvbnQvU3VidHlwZS9UeXBlMC9CYXNlRm9udC9BQkNERUYrQXJpYWwtQm9sZE1UL0VuY29kaW5n L0lkZW50aXR5LUgvRGVzY2VuZGFudEZvbnRzWyA4IDAgUiBdL1RvVW5pY29kZSA3IDAgUiA+Pg0K ZW5kb2JqDQo3IDAgb2JqDQo8PC9MZW5ndGggMzQ0L0ZpbHRlci9GbGF0ZURlY29kZT4+c3RyZWFt DQp4nF3SzW6DMAwH8HufwsfuUEFoC6uEkChtJQ770NgegCamQxohCvTA2y/EpprGAfQjdsSfOCjK U6nbEYJ328sKR2harSwO/d1KhCveWg0rEYFq5bjQP2RXG1gFrr+ahhG7Ujc9pGnw4RaH0U6wzlV/ xScI3qxC2+obrEuFemzHyb2s7sb8YOcMYZaBwmbe7KU2r3WHEPjezVK/+SqqPyWfk0GI6IWgj5K9 wsHUEm2tbwirNHRXBunFXRmsUKv/FVFCnddGfteWOoTrCMPd3DEz8kz2zC0xYu48o5C5p9WFsWe8 bJUQd8xn4pZ5oN5lNaedn5lHKj4xC6JgnohL8Zl4YF6IZ6IIiZxIUN6EiwXljRZS3jhmUt64YHJe jiA4b8LkvPyvBOc9MjlvzqS8CScSnDenc1vOZz5CP3KPIZF3a918+Mn0c+GG1E0vPqbX9Mb38e0X 5NS9qQ0KZW5kc3RyZWFtDQplbmRvYmoNCjggMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL0NJ REZvbnRUeXBlMi9CYXNlRm9udC9BQkNERUYrQXJpYWwtQm9sZE1UL0NJRFN5c3RlbUluZm8gMTIg MCBSIC9Gb250RGVzY3JpcHRvciA5IDAgUiAvV1sgMSAxIDc3NyAyIDIgNjEwIDMgMyAzODkgNCA0 IDI3NyA1IDcgNjEwIDggOCA1NTYgOSAxMCAzMzMgMTEgMTEgODg5IDEyIDEyIDU1NiAxMyAxMyA2 MTAgMTQgMTQgMjc3IDE1IDE1IDYxMCAxNiAxNyA1NTYgMTggMTkgMzMzIDIwIDIwIDI3NyAyMSAy MSA1NTYgMjIgMjMgNjEwIDI0IDI0IDU1NiAyNSAyNSA1MDAgMjYgMjYgNjEwIDI3IDI3IDI3N10+ Pg0KZW5kb2JqDQo5IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0FCQ0RF RitBcmlhbC1Cb2xkTVQvRmxhZ3MgMjYyMTc2L0ZvbnRCQm94WyAtNjI3IC0zNzYgMjAwMCAxMDEw XS9JdGFsaWNBbmdsZSAwL0FzY2VudCA5MDUvRGVzY2VudCAtMjExL0NhcEhlaWdodCAwL1N0ZW1W IDU2L0ZvbnRGaWxlMiAxMCAwIFIgPj4NCmVuZG9iag0KMTAgMCBvYmoNCjw8L0xlbmd0aCAyMjY1 OS9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQ0KeJzEvQd8XMXVODr1btFKWq26LNkrF8m2bEvb tSDwyipgjAu4YAHGXksrabGklaWVCwnYoZveO6GEDgnGptiU4JACqUAoSUgIJECABAcnMd1evTNz 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 +tlMidKrWZQKdglP2ROZCt2QRRf9csNdouTi6/4VQumei69ns8TXfnbYN9w21HpkLPGIQ65+DD/4 +B42u8SXU6cy4ptdWRGTxkZXNiVekdvxFeZlzcnECmuRKptZceSZN3lSljvyiSzc7io3rOYWuJFu qeDmHiGGdMP1ZES6YY5qfiHg8AtIBT9PMwkpv5CnWfk5qPQr3TGSiZJhKJ8gIXeUz50gecgHKwZs ohQKKS/ToBnpRTOmoTp2UDXEOVwiXLlQPNephjhVwUTfA5dg3aV/y6VfxdLoAx9e89l1YNNn1wH4 hP+fn9mRMC0fWjh/W/6GI2cmZyE5ceXsaZ9YnDKM0vmF+q8+Qrmp6dNST86KBXM2Ic6bCaN06PYj qm/L6kNmokRuJycypdvWbMI+ZB1KmpOJbHn4eCa+LdblrViZ449o7LhsLCNjDccfUR2X1cMyVlzG istYw9awipU8I9d9OlNyk5EsdtRKl9kOD9Zwzh/IjrTr+SG5oFeOBXzn/e84CH2T7AhnRZM5Ipoh sioSj8RlFb5nsqpF/hqrXuU7fyzgf4e+Wa/SUdxqjpDN1BLplBL94ykRwC5YLhVhTT56zubkR1X7 SPJMAj84n1eCfw97krlHfuYf9VlYWJiTh4XwHCEp0XMqJZ4YR09cLoTKJbIoe3yzTNNUWamxMVnZ qKIyjE7QeRlOWmEaRgYtj/yT8azoLLqY3CrMlzu7Yi/cwh38AgT7OHbO7lP7ZXauvC8o9y/z5b7+ msb+VGq7MxBDhPIAUKmDNW21RmAsBZciSwPFYDFSHHCi9MYyCvmyvJXafcsamQ/PbSYC5nwWyUa3 ZLyv23u7VOCiNMLhbHiOqnz9z2TTzaRvJXau3uqcan5+c0Jq5XOk5lyrDC9sQgt1RFUuKEQF/C9X eyozDQplbmRzdHJlYW0NCmVuZG9iag0KMTEgMCBvYmoNCjw8L1hPYmplY3Q8PC9GWFgxIDUgMCBS ID4+L0ZvbnQ8PC9GWEYxIDYgMCBSID4+L0V4dEdTdGF0ZTw8L0ZYRTEgMTMgMCBSID4+Pj4NCmVu ZG9iag0KMTIgMCBvYmoNCjw8L1JlZ2lzdHJ5KEFkb2JlKS9PcmRlcmluZyhJZGVudGl0eSkvU3Vw cGxlbWVudCAwPj4NCmVuZG9iag0KMTMgMCBvYmoNCjw8L0JNL05vcm1hbC9TTWFzay9Ob25lL0NB IDEvY2EgMS9BSVMgZmFsc2U+Pg0KZW5kb2JqDQoxNCAwIG9iag0KPDwvTGVuZ3RoIDQ2Ni9GaWx0 ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQ0KeJytVN9P2zAQzn51m4dWxuD9HlOkunbsy49XWpiEtEnQ SEMCHqYs3YKaVk0R/Pu7uBAunSLxgK0o99nfd77PUW4FCtAqiHQiE4QhGveucvHzEBZiNMnviiw/ /3YE2Rq0m+tsQaJ7MBKDGL4/JggUqSkg6ezwP6GiWQsDOKXnBlDGYGWISlkoRUAoekBzEelI6ha2 hO0WRhNKiw0djdnAOlcD0IHwCTxlaSH4K4ZKBlDbJ24pyI5Lmjyc4aBuxI68BRvyjLsfT513BdPx D1hBiIFDNk4gQImgXaVZCaOTiwsNkyWciZU4SrduUDU3SLwTDSZUkM5ASYWbvccgLSEKI9BKxxGk k0vfezWg8qJ6aN97PRhqqbVWse+9Gag61Bp97y0nvesg9dj6exbzpB+Ib2kgxR/rpIaGtb53teDo 0yatiineYRIuv6pY3s+8wD7b2GUKXuwXtr7Hj25Z/cp3uI/+czy1iup1qFvnca/9juvsFPDvwuN9 LmjVxCvfeTkXBx1frNdR4O7gOj0Vx6k46/w16sZweU3gt+sPSiasxYzO8/mv2+IuHy/ny6oo89uq yKAqqLEU9Q9xrOHPGkwsDQKqkLSlQOoSDZyLqfgHP0zxCQ0KZW5kc3RyZWFtDQplbmRvYmoNCjE1 IDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSIC9NZWRpYUJveFsgMCAwIDcyMCA1NDBd L1Jlc291cmNlcyAxNyAwIFIgL0NvbnRlbnRzIDE5IDAgUiA+Pg0KZW5kb2JqDQoxNiAwIG9iag0K PDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggNzIyL0hlaWdodCA1NDAvQ29sb3JT cGFjZS9EZXZpY2VSR0IvQml0c1BlckNvbXBvbmVudCA4L0ZpbHRlci9EQ1REZWNvZGUvTGVuZ3Ro IDkxMTE5L0ludGVycG9sYXRlIHRydWU+PnN0cmVhbQ0K/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD AAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8t MC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAIcAtIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT 1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6 goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6d/srT/8AnwtP+/K/4Uf2Vp//AD4Wn/flf8Ku UUAU/wCytP8A+fC0/wC/K/4Uf2Vp/wDz4Wn/AH5X/CrlFAFP+ytP/wCfC0/78r/hR/ZWn/8APhaf 9+V/wq5RQBT/ALK0/wD58LT/AL8r/hR/ZWn/APPhaf8Aflf8KuUUAU/7K0//AJ8LT/vyv+FH9laf /wA+Fp/35X/CrlFAFP8AsrT/APnwtP8Avyv+FH9laf8A8+Fp/wB+V/wq5RQBT/srT/8AnwtP+/K/ 4Uf2Vp//AD4Wn/flf8KuUUAU/wCytP8A+fC0/wC/K/4Uf2Vp/wDz4Wn/AH5X/CrlFAFP+ytP/wCf C0/78r/hR/ZWn/8APhaf9+V/wq5RQBT/ALK0/wD58LT/AL8r/hR/ZWn/APPhaf8Aflf8KuUUAU/7 K0//AJ8LT/vyv+FH9laf/wA+Fp/35X/CrlFAFP8AsrT/APnwtP8Avyv+FH9laf8A8+Fp/wB+V/wq 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 n/tt/wCjnqo7l0tzsKKKK0NwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigD5S8Sn/io9S/6+H/nVAVc8SnHiPUv+vl/51RB54qDl6syPFNvFd2SQzorqzcg 9fwrn7HUb7w+3ly777Tc9/8AWRD29RW94lW4eOE2rJuVuUbo1ZljNHfBlcGOQAqyNxgj0qHoyUdX pt/bahaieymWWM9SO3sferIUjlRz3rlfh/biPT7xkGC8xxiuna6ihliimlRHkJWNWP3iPSqGS8Oo 2jnPQ9q3fDPiCbQpdvMlk5+ZDyV91rF2nk8596cOfvcN2pjTse4afeQX9olxZyCSJuc+nsasCvHN A1q60W48yL54T/roT0b3HvXq2kalbarZpc2bhkP3lPVPag1iy9S5po680tA7jwaXNMFPoGGaXPFN 60YxQA4GhTweRSUdKLgKaT60maM0wsLRTSeKQn5e1IB2eTTQaSkagQMeaaTSmmE0AB6+9ee+Or/7 TqK2atmG3HJHQt3rtdWvV0+wuLlmAKrhfr2rymdnkLO5y7Hcx+vWkRJ20K7E4ycD0rhPHNqkviDR 5XGV3KAPxrZ13V3TxDpmk2YZ5HkDz4/hWs34iiVJ7F4CFcPjJ/hpXMztbuYTSfulHlLwHHRj3x9K qvg5wPwqSCFINKs4YydoUYLdvemciQnBPfHrQG5PsNpbmSdtgcZUkcVjHzTk4QBjxU1tr+pareTW 93pkdtZxA4kLZOR04prH24PP0qRyRCfN9U/KvpD4P5/4V1pO4gn990/67PXznX0b8If+SeaT/wBt v/Rz1cdy6W52NFFFaG4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQB8m+Jv+Ri1T/r4eqK/dGK0PE3/ACMWqf8AXw/86zkPTNZ3OXqylqnMkQPoax9Gt1nj vA4BwzYz2rV1Rh9oQZ/hqj4bOLG8fPOHas2Qiz4H/wCQO/TDStyBVzxFYQ6jDDFKCNuSHH3lPse1 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 Vq3ZmgjaQYcqCR71FcfvHSEdGO5v90f/AF6sjpQAUYoooGGKKKKADFFFFABRRRQAUUUUAFFFFABR jmiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCG9aZLOdrWNZbhY2McbHAZscAntk153 p/jbxN9l1261bw/aW1rpKSLK0d0HJlVFcKB6EMOa9KrzPU4nbwl8SlMbHfcz4GPvD7PH09aAO7sd b0690x7+C9tpLSMHzZVkBRCOoJ7YrM8T+JDY+GE1XQ44NSeaWKK3USgJI0jhB83pzXm/iTRfsmn+ J7TR4hY2SSaZPKI4PMRUA/eN5fRuACR3xTrCS2074XSagL6W8sBrcN0ZxZ+QuwTx7ikY/h4J496A OysfF8tnp+tz+J7D+z9R0yNZZYEkDrIjA+X5bd8tlfrUem+NdQt49THivRX0ya1sm1KNIn80SQr9 4ZHAcHAI965zXJ5PFlt4l17w/BNcWsNraRQboyv2owzGZwgPXjj61up44t/E+naudA0qTVLO2sS8 yzIY/NdusAB77AxPvgUAbHhLX9X1K7kg1vRG04tCLm3lSUSxvGTgKSOjjjIrdTVrCTVJNNS8t21C NN7W4cb1X1I69685+GWp6f8A2xcQ+F5NRn8NtbLI/wBp3sttcFsbFZuQNvVegwKzlilg+JWp2elv Hd3dy11KyzWpjnsy0R2usv8AFGWwAD0yMUAeof8ACQ6P5FxP/adn5NvJ5Mz+aMRv/dJ7Gok160X7 fc3N1ZxadbrHItx5wwVdd2W9OvHqK8H8K6TBdJaW8909+Fn062vbU6cLeOM+fkq5A+dhg5J7V0nx BspF1PVzFILLT7bUbJ5pfsonSOMWxCkxngqGx9KQz1y71vS7OG1mu9QtYYrpgsDvIAJSegU96fqe sadpXlf2lfW9r5xIj86QLvIGTjPXivDNTt4dP8I+Hb2K9N25iuEtYL7TT5N3vk3BAoGYmP8ACR29 q3PjBJZQKZNfs2eO40KWCzTyzJ5V1uBIB7HG3n0U0xHra6jZMQFuoSTL5A+ccyYzt+uOcVXttd0q 6uru2t9RtZbi0Ba4jSQFogOpYdq8sttRih8WWWiSR3Av28QC+A8s7PIa24fd0wSMfWsHwlc/bPEW pzJDBbj+yL+E2tvaGMQOHBCM55dyASfTtSGeua3400fT/D91q0F7a3VvbSxwyGOUEKzsqjJ7fezT b3xZb2Gp2VrdtbKt7f8A2KB1mB/5ZeYCfQk4GPceteY6hpNjpvh27SKwWOzOh6Xc3EaRZDMs+WYj uQoOe+K2rhbUeJre6uYN1qviddjmMkLvsgqH2G4rzQB3+qeK9Is7bVmS+tprnTLd7ie3SUb1CjPI 7dh+NGjeIoNRktyJrUQXVvDNAVmBZ2cMSMemF4Pfn0rxOzb+0/EerLHawRE6fqls1lBZlPLfnary Hl3YAtjp6V0kSLNaz6ppFuznTtJ02/tURCu7yjKXQD1K7lx70AerXWtaZaIXur+2hUTfZ8vIB+84 +T68jil1LWtN0sxDUr62tTL9zzpAu7kDjPXkj868Q8a6ZPb6dod9q959ggvLe6uLiRrEXX+kTMrb Np+623Cg/wCzitTx6dK04eG4vEEM14g0K5ghMsBZ/OKxBSV7MensTTA9auNa0y31OHTp7+2jv5hm O3aQB3+gqO+1uyg/tCGK5glvrK3a4ktg43hQCRkdQDivFdbmmXxzo1nexwQ3dpcaY85W1LzXOFTf I0v8KKfl46nr1ra0ttLOs6zZtp1w/iW3/tOS5uVUqFickpvP8YZSgUdsUhHodt4jju9M06WBrb7X cLbSS27zAGNZsY/Hk4HfFaOna1pmoyzx2F/a3LwYMqxSBimemcdOhrxrwZZy6foVvYX2+41X+1dK vJbkoQZYXMflj2CbSuO2PeptB0b7NpNg2k2v2e/vdC1MSOi7TJJ5ildx9cscZ9aYz2DS9Y07Vldt Mvbe7EeNxhkDbc5xnH0P5Utrq+nXd1d21te28txaHE8aSAtF/vDtXnnwfuNIudc16Tw/bfZ7T7LY qyeUY8uEcMcH8Bn1BrlbGCWNPFml6YVvRFYXBkmNoYbmE+aCYXPSTcu7B68UCPY5fE2hx6YuoPq1 ktizmNZzMuwsOCM+vFV9P8S2sw1qW6kht7PTpxEbhnARlMaPuz6fPXj3iXUtBm02OXw1psdjpt7c zIl7cWbTL5ghUYhiPAZj8uSMEqTUNvbXEnw+RzM1pb2+p2kl1M9t5wjRbONSWjP3gHwD6fhSGe7X euaXZ21rcXWoWsUF0wWCR5AFkJ6BT3p+raxp2jwJNqt7b2kTttVppAoJ9BmvDNRt4LDwZ4evYr/7 Sdt0trFe6b+5u98gYRhQP3RJHykdq6L4yXJTTdCt5bW3t5bm0nQTS2puXifYmIY16b2PGT/dpiPT rrXNLtLi3gutQtYZrjb5KPIAZN3TA75xVHxD4mtNJv8AT7ASwyX11cxQ/Z/MAdUdtu/HXAry7W9M t7/RTcT2nnT23hC3MDlSWjkDk/KezAqPfirOvvZL8RIYLy1eTWpdZsLi2m8onbbCMKfn7AMHBHq1 IZ1vi3xJ4o0rxFaWGlaDaXlteMY7aaS6CFmEZdgR2wFNa+ieKLe91m/0q7e3ttRtpRGsHmAtJ+6R 2IHcAuR+FReKFY+KvB5CkhbyfJA6f6NJ1rjL/S4D4rvtS+yD7cviezRbgL84j8mMEA/3fmbP1piP T4dTsZ9QmsYbuB72EBpIFcF0B6EjtVDRtdjvtGvNRuVW2htp7iNyTwFidlLH8FzXlXgSxki+JgS8 1GU6pBcXkstotgFIR2OC8/VlIKkZ/pWzoGs2Gp6J4j8I285GtzS6kqwtGwHMkhBzjGMEUAbfhrxp qN/qdqmr6HJp2najE8un3Hmby4UbsSAfdJT5h9Kn8JeLdT1q9tWudCkttJ1BGksrtZA/yqM/vQPu Ejp+VUPCnjldaSy0rS9OnbUre0Zr2K4jMYtnRdojJPdn4HsCaxfh3f2LeK7SLwxDqFrHOkp1fTpt xhs5APlC54U78gBeCMmgD1GbVbCDUoNOmvIEvp1LRQM4DuB1IHemjWNNNxeQC+tjNZrvuE8wZiXG csOwrzXxMFs/ixaPbtHdXd5LbZsri1JZUXgywzDptAyQeOvrXHabYSx3WvRXOoTSarb2Gpm4tE08 IVD7sb5gMuD8pWkM9ysdctr++cWdzaT2KwGTzo5gTuDFWBHoMdfWpRr+knSX1QajaHTk4a5Eo8sc 45P1ry/xFozw6fqNhoVt9nz4ZhCpDH/02JfA7nGeO9YlnaWMng/VL9ddkazj1OGX7V/ZIS2V1jKk GEDDLyATjg4oEen+MvGUejR6KmnC1vLrVZxHbq84RWTaWLA9+AAPcitHSPEtldaLo97fTwWcmpIr RRSSAFmIztGetcNbW66ho/gC5vNLtoZluJ2CRxnYg8mYqyg8qDhWAPTiuevFs4tA01dYsZJ5Lvw5 Ha6Z+4LlbrLZA/utkxnPovtTGe3pf2kjbUuImbe0eAwzuX7y/Ud6guta0200+O/ub62ispACk7yA I2QSMH6AmvGvGFvrWm+JWNtJ89msV5GfJLnzbrFu+0jqQylj/vZru/F2iWv2DwbpU1utxaQanChR lypCQS4JH1AoEdXY6zpt+062V/bTtAqtKI5AdgYZBPoCOajGv6QdKbUxqVodOU4Nx5o2A5xjP1rx Wy0aYeFryLSbZobq58NguUj+Zz9obOR/EduePTiobee1svCV9dwXlvqFpPqsEbXVxpflW9qRGQZF iUYYgYHpnGaQHuE3iDSILG1vZtStEtLohYJmlAWQnoFPerL6jZozq91CGSRYmBccO2Cq/U5GB714 HIiWvw88NXc06rdW5vYUt7vT98NwzTMQjKB+6YjBGOgNbmpaiLbxEdKurW4gv73VNMvIohGWURiO MN83TCshX8qBnqZ8S6J9nef+1bLyUkWFn85cBz0XPqfSnXfiPRrK5kt7vVLOGeNDI0bygMqgAkke mCD+NeF6xpUVj4S8K3Typpenvb3JuZjYC5DTuRjcpH3iNwDfhWvpnh20k1Gz+22jXUv9q2MDzXMO HkiWx4DDsM4yPWmB7Hc6zptrYwXtzfW0VpOVEUzyAI+77uD3zSXmtaZZXkFpd39tDczkCKJ5AGfJ IGB3zg14b4gtHj8HeDJru7/s/S4bS5id3shdKsjEbV2EcEqGANaniDRIZNPuXuIJbq5svC1r9nuJ osSq4lc5x/C3AOKBHqeh+ILXWNU1qyt2TzdLuBbyqGyclA2cdhyR+Bq1aa5pd5bXVxa6haywWpKz yJICsZHUMe1cp4ahtjrXj20ELxXUtyskhjTDsj26hWB78h8e9ee6M8a+GdWi2w32j2Mtibq7iszB JLGkv7yKVOjMoAJI6jrQB7Tc+I9GttNt9QuNUs47K4wIZ2lASTPoe/SobbXoZNY1i1m8uK30+KGY 3DN8rLIrHOewG2vGvGV5pknhuwXQtNSw0+++3Naz3NmbhiSRhYYzwvmHkZ6AcVd1G1u7rwvq4tmk jUWWjPK/k+ZiNATIdh+9gA5HtSA9fXxDo7fYdup2Z+3f8euJR++/3fWpdW1nTdHSJ9Uvra0WVtiG aQLuPoM1886XDBY38V9YX41eW/uQLe1udL8qK4xINxtyB+7IJJ4wDXZ/Hu4w0FmsNuktxYXIjuXt DcSO/GIYx0DNnqfTimM9UbV9OXUPsJvrcXmwyeT5g37QMk49MEHNJbarZ3umy3unXMN3Agb54nDK SvUZFeU3OkPf6X40ubC3zqb6VZxQzhNz7PIBZV9cjPHetL4TQwf2V4kuLPUGv4ZSqblsRaRhljwQ qgYJ5AJ9RSEdbY+J473QtPu4Tare3MNvO9tJMFMaSsBn9Tj1IrXtdZ0261CWxtr62lvIgTJAkgLr g4OR9eK8R8H2cun+EpbG+3z6pNPpV99oKEF7dpIwiY7bCrDH410GkaVHD4ksL21tRFqE+tasjzhc MwKS7dx9MquPoKBncQeLtOm8RXenw3Ns9vaWjXE9wsoIiZX2lW9Mda3LC/tNRso7uxuIri1kGUlj YMrD614FpUWk31pqNvaxz2EttoUMWo3CWhYi4juQz7lI+fkEt6g123h37ZqXwm11bCCASyrcpbSW kRiS6XbgSKh+6W5GPUUwNzxP46s7GHShos1jqF1qN6LOJTcqq5H3zn1HTHqRWnY+JrSfxLqOizyw Q3VvIiQxtIN8wMYckD2z+leYaVbaRqnjLRtQ0TTVTSFu7eJS1uUAmSCYvgHuP3YJ9QPStXWtMgfx bq2om0Bvo9d0xY7jZ86ptjBAPpgtn60CPQY9ftLfT1utXu7KzR53gRjOCrEMQBn1wOR2OarSeLLC HxNHpdxPbxRz2sVxbzNIAJi7soVfXpn8a8t15rC00C2n8QWrT6aX1mFUMRfE7zN5Zx6lQ4B96k1j S7e90Zp57QTTW3hC1a3kKZMb7icqex4H5Uhnq/i7xBbeGtFbUb0qIhLHFlm2gF3C5J9BnP4Vd/tS wXUI7A3kH22SPzUg3jeyf3gPSuA+IVhqEfh7Vb3WtQW/0XzrWaOy+yrm3RZkLksOW+XPWuau7Jm+ Ln+majJDNNqcFzaW8dgHaSFY1wRNjKpwwI7UCPTvEXiqx0uzvJIbi3uJ7OWCO4hEozEJJFTLemNx P4VtadfWuo2cd3YXEVzbSZKSxMGVu3BFeEvDpF7p1zpraVPJrsEwi1WfYQh3X8Z2v/fLdQewBr0j wW1nokmuWmwW1tJrbwW0arhdzRo2FHYE7jTA6K88R6NZXUttd6pZw3ESF5I3lAZVABJI7cEH8amu NZ023itJbi+to47shbdmkAEpIyNvrXmGpaJZXnji6mu9PjmebxBFG7vHndGLHO0/7OfwzXH6/Yt/ YXhlr68ew099F+yxn7ALotKZDlFBHyPjbg9ePagZ9By6lZRajDYSXcCXsyl44C4DuB1IFZXhPxPZ 6/bSbJoEvYmkEtssgLxqsjIGI7Z25/GuDi/sy38fpZaxY3V5rsl3aTWUyoQyQrAFLs3ZQwk3L6mq mh6bBYHSb6304Nczx6ybkKhBuP3hIVj3zjigR6jb+I9Fuba5uLfVLOSC2YJNIsoKxknADHtzUv8A bml/2R/av9oWv9m4z9p8weXjOPvdOteAeHhHqukeIN8dvLb3UGmKYLazMESYuhvjHd9uQCx55rrr 22sdKS7N5Z48O2PiR5biERFo0RrZdrbf7okbP1NAHr8Msc8KSwuskTgMrKchgehBrB1fxTZWtq0l hNBeSRXsNnMkcgJiaRwvOOhGc1zHgXS9eXSkubbUTb6LIlybXS3tlVlVncxHefmXgqcV5v4WsXji RVv5ri/tzZQXVuuni3EMn2lTh3A+dwQ3J7HNAH0JaapY3c91Ba3kE0tq22dEcExH0b0rGvPGOkxX Oipb3ltcRapdvaRypKCodUYke5yoGPU1414W026FjrsCahNPq9vo9xDdWqWAh2MZAWDyD77HDY9Q TXSafP4autT0DU9E0uSDSf7aCCVoSI2lNsyBkX+H5tqk/wB4ZpDPTI9etLrUbW3066s7lWkeObbM NyEKSAB3PHTsKv2upWV3d3Nra3cEtzbECaJHBaMnpuHavMPB2nRWY8DSQWoikmu76SdgmCzFZeWq b4UPpR1b7PDp866/Z20sWp3W0qm8zE7W/vMSCwPp9aYj1SiiigAooooAKKKKAGyusaM7sFRQSSew FMt5IriBJoWV4pVDqy8hgRkGoNYdotJvZExuSB2GRkZCntXlM/iHxNHHa39nqNvFp9hpum3U9n9n X/SGmJVxn+EY6Y7+1AHrsUkUzSCNkco2x8HOD6H86k2LjG0Y9McV41c6rrHh3TfEslpd3E01/wCJ HtYPItRLJbgpuZlT+M4GMH0quPFnjC+0qW6ju20yTSEh+1RXNmoe88ycoH2n7nyL0Hc0Ae2hVAwA APSs8xKsot5p0VMF0iX5WZRjJPsMgVwM2sa5D4f8R6rfeIobSH+0pLOz/wBEDm3RJ2QAAcu7cAZ4 4rE8HanrWreJdJ1DUL+dntbLUYJYpbVY5Jwk0YXev8B5XIH933oCx60s1vNp6fYPLeKdP3RjHykH v9KuxoFVc4LAAFscmvKNP8T6pY6HbNNLG95qmlQNp22JVC3DN5bIABjALo2PQGnab4v8Qz/EM2ax X0+lxXradKosgIQFXmbzv727+HpigLHq+xRnCjnnpQVBBBAOetebXeteIIfHNzINRjOiW+qW2nfY fJXc3nRr82/rwzA/TPtVWx1XxRd2CD+2o0uNY1SaztJBbLiyiiabJxj52IQDnigD0+4eG3t3muCi QxKXZm4CgDk1U1axt9b0S6s5GJt7yBoy6ddrLjI/A15X4j1nxDrXhy40y31GG1ubWx1B7+byAy3Y hcxbQD90Nycitjw54h1E2mhxmdTE+qS2bLsHMKQMyr9cqOetAHoZMFnbIZWRI41VN74HsOasBV5+ UflXi+uTeKNX8EXV7datbLaal9kubVUiUSWh+0oAmP4xggknuPeugOv6xb/EmLT9R1CS0sC6W9vF LaAw3uY8lllHIkzn5enFAHpG1fQUbV9B+VedeI9e1vTtd8UXsV4p0rRdPjmWxEILTSujkZbrgFQc CsHT/FPi+Twrq26HVJLqKW38u7fThHMqSZ8wpD0fZjj1B9qAPYwqg5CjP0oCqOgA+leM63431v8A sjQ4NEvrm/uZYJ7iS8tNO81pTG4QI8Z+5knDHt2qzP4x1lvGmiRJfyJFcT20N3piWYKW3mR7iJZj yJM5IA7YoCx66VUjBAI9xWV9jsr7X01FJhJc2McloyKQQu8oxB9/lX868+0vU/Fd/pNlH/bkSXut X08VtMLVSLOKLzDjGPmYhB1rP8M3viaw8QyXt3f2bW9xrMNje2cMYZZJHt0BlV+o5CkAcdaAPZiq k5KjPrioUnt2u5LdXjNwiq7oD8wU5wT7HB/KvJNC8ea/ca9qF1Na30ukbLwrG1mEihEAbYVl/jLb CD7kVs/DZdW/4SnVJdd1CO/ubjTLKdZEiEe1WMp2YHHBJwfSgD0jaPQVBfWsV5ZT2su4RTRtGxRi rAEYOCOQa8hi8Z6ynibV4o9YN/aLYX0qbbIRwQywgbRHIeXI754q7ZeIPE9lo2q22o6nBd6i9vYz Wt0sAQQNcsY8FejBSMjPWgDsvBPh+x0T+0Ta39xqN1LMEuLi4k3uCigLGfTaD+tdAk9u13JbpJGb hFDvGPvBTkAn64P5VwngWa80bw94vn1O4W/u7PULmWSVUCebtiQg4HAJAHSuNOs+IdBbVb68vjqG rX1npyQy29qC0Qmkk4EY4Yrzj14zQM9z2LgDauB0GKCq7TwMd+K8t0TxlrFnptjf+IluI7RWurWV rm3ELyuiiSGQr/CWAZcdM1leFvGPiu78U2ltfRXs1stwLK6jWyAhXKbjIZezKWA29MD1oEew2k1v eW0U9s8c0DjcjrypHqKmKqeoBx6147pWqa3H4V0e30O+isk07Rf7Um3xCT7QAzARc/dHyNkjnkVo eG/Eev3fiO2vru/STRb3UZbCKwEKhov3XmKxfqcYI+hoA9S2r6CoFnt3u3txJGblEDsn8SqScH6c H8q8m0Px5r0/iK/uZbW+l0Yfa8RtZhIoVhDbSs38Zbbgj1Na3w2XVj4s1GbXtQjv7m40u0nV0iEe xWaQ7MDrjPWgD0W1uILyETW0qTRZKh0ORkEg/kQRUu0egrxvwjd+IdOsnhh1FJYNRj1NrC3WBc20 sUzEEk/e3Z5B711/grxTPrmmaxrEhLWUITyYlUAgrAryDPruYj220AdrtGc4GfWkCKDkKAfXFeTW PibxJZ6r4Zh1LUYbmPXpIblQkCp9njI+aL3GGXB65BrQtdY8Q6trOiWltqkdrFJdaibk+QrGSOCd VRB6cHBNAHpQVQSQACevHWgKoJIABPXA61534l17WrfXdSu7K8ji0rRZbaKezMQY3Xm7dx3dVwHG Mdwc1i3vj/VLPU5dKaRnuo4bi1Y+QNxuzKRAR2xs5x7igD17aM5wM+tG1ck4GT1OK8x1TWfEln4v upE1SFtIsLyxs5LMwLmbzlUM2/qCGYEfjWv4qvvEE3iYWPh69trRLC3ivZ0nQFboPIy+WWP3BhG5 HOSKAO3wPSjYu3G0Y9McV5ufEGtjXG1E3kf9jvqUmkrYeUNylVbEu/rncvTpiua0/wAQeM0tbO8u 9dgmj8ix1CSIWiDek83leVnHAAy2eufagD23aMYxRtXjgcdPavKD4i8Q2mr6heXms2q6VJe31hBF JbgLbGJWdJWYcsBsII9CKy9J8V+Jb7StRtrbWZHuf7Ssbe2vrqwWI+XOfmIjxyuOVJoA9r2juBRg eleXN4t1jRtCtLvVrqO4Fnf3em3kwjCLMyK/lSH+78yqDjj5q9B8ONdSaBpz6i5e8e3jaZioUlyo J4HTmgCDT/EWjajqM1hYalaT3sORJBG4Lrg4PHsa1ti4xtGPTFeH+ErW+h8Q6Ff3enWNnpg1W+ii v4WzPPJI8yqrj0zn/vkV2vw/8RalrerS2t7Lk6faeTeLsAzciZ1ycdPlQHHT5qAO8Kqeqj16VDcz 28Dwid0R5X8uPd1ZsE4Hvwa860vxRrdxpumSxst1dT6Jd3nlBAPNnR0CdOnUjFZ2i+J9Tm06wF3q ZvL1NSWOdLmyEE9vmCR9jLjA5UYYc4zQB64UUjBUEemKNo9BXjGneI/FyWdlYXmswS3+uW1nPbXa 2qj7GZWIcbejDA4z3NddoGsaoPh9qd5q2p2w1Czlu4mvXixGojkZQxUewHFAHcsqkYKgj0xUNtcW 90rPbyJKqs0bFTnDKcEfga8i0HxX4gvdG1KyTVJ3vJNStbOz1C5sViZFlUMX8vGCMA7c9cirHhnX L3wtpST6tcpPaNdalFcOqBQ1ysjOrD03BXGPUigD1vaM5xzRsUAgKMHqMda8c1bxR4h03W9Bt5tZ MlyXs0vbGGxDKomcBjLJj5OuFx6CtXRde8Qx+KfO1DUIrnSLq91C0js1gCtCINzI28ckkIQc+ooA 9O2LgDaMDpx0pHKRozNhVAySegFeQ3XibxZp3hgapcXkd2usi2ayS2tw01mZWOVCf8tAFxgnvSjX fFOseHrHTluZdN1GU3hkuruzVWnhhUbcxnhS29c4/unFAHrNtJBc28U9uySQuoeN15BUjIIqUqpx kA46Zrya+1DXLbwZ4HttA1FNPefTGlmkMKy5EVsHAAb1P6VAvjDxHp/hzWJ7y6F7eyLYSWpgtgTB 9p6qFH39uOM8k0AewAAdABQFCjCgAe1eOT+K/EP/AAh0Ju9QvNN1AXklvFI+mhrq9VU3Lth6KeTn 6cVLq/i7Xv8AhF/Ceo/a5dPtrqyF1e38dmJ0V8L8si/wIcnJFIZ69tX0H5VDLPBDNBFJIiSzErGp 6uQCTj8ATXDP4k1I3kqpcxtGNetbJSqDBheFGYD6lic9eaytB1fX5JNIvdU1GG6S+vb5YoxbqvkR xRzBQDjOTsUk0xHqmxeflHPXjrTJpIreB5ZWWOKNSzMeAoHJNeRaP4q8Tafod5caxqEGoTXGiRan bMsAj+zu7bNuB94ZZTz6Gt3Sb7XbTRPGtrrepRald6XGfJnECoCDbB/mUcHkmgD0CIxyRJJFtaNg GUr0IPeknkigTfMyIpYLljjknAH54ryvTtf8SDXYLptRgbR1vrXTzYfZ1UnzbdGL7xyMM2QOmKwL 7V9f1yA2V/rEtlqf9pWkwsprEI9sPtAUGM9JI+nJyeBQM9U8YeFYPE0EUct7e2WwMjG1l2+ZG33k YdDnHXrW9aWsNpaQ21vGEhhjWNFHZQMAflXnEms+IYl1/UX1SM2sWsR6fa2wgUeWnnxqxLdSSGIp mta34iu7ySw0vVI7KRtZuLUTGBX2Qx2olwAe+c8mgR6gQCMEZFJtXIOBkdDXkmk+MPEFh4f1vUtW uor+RdHt9Vtoo4QgiaTePL45YZUHnnk1V0/xH4wvNJSxN1dWd5LqlvbR6he6esTNHIjlwI+nyleD 7j3oA9haSFJkiZkEsmSqnq2Ov5U24tYbgxGVc+VIJV/3h0P615ZpN1reo+JvDF5c3qSXdpaanb3C JEFW6eKRUz/s7iFPHTFaPw88RapfWesDWdTxqEMH2hrW8tPIazJDen34+OG68GgD0jaPQUjBApLB dq88jpXh+leLfEt+l7Z2euvM8tzYJbX0+nrEoSZ3Vyi4+ZMLwTW6+seJb/StP0aLVIYNX+1XsE9/ 9nUrKttkfc6Ddlc46YOKAPS47y0lht7iOaJ47jAhkBGHyMjB75FPtbi3uldraRJBG7RsUOdrA4I+ oNeWpb3c/hP4WfZLw2pW5ty+EDbh9nckc+wI/Gk8K3usaZ4olY3kUmiX+r6hALLygGjZd8m/f1JJ QjHTBFAHrARQMBQPwrHk8TaEmsf2S+qWQ1IuI/sxkG8sRkDHriuF+F/i3X9e1pv7ThvW0+7tmuY2 lsxDHAwYYRH/AOWgKnr6isi/sb3V/EfiTTbDw2szyazE41pmUC22pCx/2sgA9PWgD2S2uYLnzfs8 iSeU5ifac7WHVT71Stdb0m61afTba+tZdQhG6W3RwXXHqPxFYHhaSSHT/F8sP+tTVLtl4zyFXFZX gzw/oP8AwjvhDVQ8cWosEuFuoyFe5mkQmRWI+9nLZHt7UAejhV5OBk9T60bFAwFGPTFec3mu+IE1 TWNZt7q3Oh6ZLPayac6AO5ji3+YH6lt3G30NZl5rfivT7Ceyl1eCbUrpLK5trr7MoWBZrgRvGV/i AzwevrQB6q8kUckaOyK8hwgJ5Y4ycfhUgUAkgAE9a8ktZtb1DxH4Uhv9UV7rTdXvbWedIVH2pEh3 AkdFJU4OPrU9hqnii80yD/idRpcazqc1rayC2UiziiaXJxj5mIjA54oA9QNzCLsWplT7QU8wR5+b bnGcemTUtec+DtQutS8Y2kuoMj3kOm3NrLIi7VkaK6CFgO2ducV6NQAUUUUAFFFFAEV3AtzazQPn ZKjIcdcEYNc5/wAIXpxsZ7TfP5c1rbWjc87IDlPx9a2tdnltdE1C4twWnit5JIwO7BSR+tef2/xG fSfCnhyXU9Oml1C509Ly6Tz0UxxAAGXJ+8T1CjnrQB0l74IsLmPVl+0XkRv7pb0NHKQbecLjfGex PcVwni7wHfte6Vp2k219PbkRpLqDXnDYm8xmnXq+Dkrj1IrrNb8cIt89jY2F1PaPGI31GL/VwSyR F4wR1ORjJ7ZFc/oPxKu4PDmnx3nh/UJdUeK0SCNpF3XaygqJQew3Kcg+uaQHaal4Psr7QrnTPPuY VlvGvlmifbJFKZDJlT7EmqNj4B0/TGtprW5vTLbeewZ5dxk80AuHPfLKG+tRv49Z9D025sdEvLrU 7x5YzpyuFeIxHEu5jx8p49yR61Vh8XxpqOr6qpnuLA6fZS21sv3meVpFCgdmJ2j8KYG9a+FNLaz8 PKyPINHw9ozNyDs28+vr9QKjXwbZL4oGtx3N6h3mZrRZj5DTEbTIV9cfh3rNg8ayweHJJ20W5Grx 3gsf7L8wb/Nb5gA3TGw7s+gNFv8AES1bSLS/u7GW0W4gu5fLkcble3OGjPuQCfwoAZZeDFn8e6pr t+9yqi7jmt4Vl/dSlYVUOy+qnditW78HWNzoC6UJrmER3D3UNxE+2WKVnZiyke7kfSovHurX1h8O dT1XT4XS/W0EqRhhuRjjPPTjJ/KuetPGV9p/jW9tdQ0y8axmexjeXeCllJLEAEI75fgkeoNAGvq/ w40nUtHsdOE99bRWySRF4ZyHmSTl1dv4tx5PvUln8PtMtPEkGsQXF4HgfzUt/N/ciQx+Wz7fUjGa S08fWdx4wbRPszLEZntI7syqQ86Alk2feAAB+boSDTdO8dG78T3GlyaPcwWqXE9rFfO4KSzRDJQD qMqCc+xoAjh+GmkRW+qw/aL51vlEaFpiTaoJPMCxf3QH5/AVpyeELSTxFbatNd3shh2uLZpSYWlV dolK/wB7FYlp8Q7q70Oyvbfw1evdXzt9ks/NXfLEoBaXOMADPA75HrVHx348kfQY10Gzu5Rc2sN1 JeRsF+yK8gVdw65JDA46YNAHcS+H7Ka51eWdWkGqQpBcIx4KqrKAPThjWLZeBLW00e+sRqeqySXT o4unuCZYtn3Ah7Afrnmrg8WRG5EP2WTJ1b+yc7h97yy+/wCnGMVyPin4hXk3h/XG0nSb2F4ohJYX ZI23SiZY3KnHy9eM9Qc0AdBe/D7TrnR7KyivNQtpbYODdwTlZpRIcybz33Hk/pQ3w90w6/HqiXV8 hjmiuEthMTEJY1CB9p6kqMc/XrUsfjGSTxTHo0WkzSBFjF3Msqn7NI67gpTqw5GWHHNZE3i660j4 h6rY3Nld3OmST2cP2pWHl2rSptUY6nLYzjpkUAbd/wCCbG68O2+kx3N5bLbTNPDcwSbZY2ZmJwff ew+ho0zwNpWmWUFpZ+akEN5Feou7OHjQKPwO3J9zWbqnxAm07XbjT5tAuhEqTtBMZlBnMSlmwnUA hThu+Pep/EHj+00uQR21q15JJDDJBtlVFkeUtsQseF+VWbJ7CkBbsvBGn2muXGoJPePDKsgFk8xM EZk/1jKv+1z+ZxTvB3gyz8LT3U1pdXlzJcJHEzXMu8qiZ2KPQANj8KhfxzZ/8ISviGKBnDOIBbGR QfO37PLLdB83GeneltvGDNHai80qe0uJbO4u3ieQHZ5JXKgjhs7uCKYFO1+G2l213czrd37CWO4h SJ5tyQxzZ8xEHbJOc9eK1Lrwdp91bXsMjThbqzhsmKtgosRJRlPZgWzn2FZ+q+PFs4NKkt9Ju7z7 VbR3twsJBNrA5A3n+9yTwP7prO+H/i+5udSOj6lZXYE1zei1v5GBSfy5mygHUYUjB74PpQB0/hfw vaeH9KurCKW4u0upnnne5fe8juAGJPvisXTfhppVlZX9v9r1Gf7UkSCWWcl4RESYtjdRtzx9Km1z x9Z6T4oTSZLZnhRokubrzVUQNKcINp5bPGSOmRSDx7Akt3Hc2MkTWMdxJeASBvJ8t9qAcfMXyCKQ FuPwTpreGo9FvpLq+gW4W6eW4lLSSShw+4n6jGOmOKc3g6xPihdajub2Nt/nNaLMRA8u3b5hX1xj 24rEuPiQ9tpoN1oN1b6u1w0A0+aZUJAUOX8w/LjaQfqcVmJ4mm1XVRd6fdyixuNQ0vykz0SRCXX8 SOfpTGdHe/D3Srqx0y1M17FHZRfZiYpihngzkxyY6qTVPwn4KSy8S6jrN21ysgvp5La28zMIVgqr IF7NtGKhuvilY29zqimxle3tYrh7eZZlJumhB3oF6r0OCeuKqa5461K48JX89no13ZavZ3tpDJaP Iu4xySIVIbGPmU49s0COmsvBOn2mv3GpJPeNHMJcWTzEwI0n+sZV9+fbmjwd4LsvC1zdT2l1e3Mk 8aQk3Mu/aiE7FX0ADYqXxb4mk0GztTb6XcajqFzuMdnAwDEKu5zk8cD8yQK5W28czW/jG83WN7Po 139gxcE7Vs/OTChlPOSxGfSgDZ0rwba+FLi/1fTBfahc7JXgs5JsqrO5dxHnhSzYq58O9GbSPCkc FzaJaz3Mst1PbghhG0rlime+AQPwrObx88WuXlhe6Jc2scVvcXEErzLumEI+b5ByoPYnrVO++I17 ZeG7XWZfC16kMsTXEiyXCJ5UIxhsnqxBzsHNAFsfDLR1tLiEXOob2ZDaym4JezCNuVYiegBz+eK1 /D3g+w0P+zvsslw5sVuFjMr7i3nOHcse5yKwPHPj6TS7e9h0zSry68u2zJdxY220skZaIEd+xJ7Z FQyfEf8AsfRtD/tLTpXu5bGO7vR56A28Z438/fJIJwO2aAOj1bwbp2qa/Fqs8l0rAoZoElKxXBQ5 jLr32n/69Lc+DtNuNZk1OQz+fJeQ3zKH+UyRRmNfwweR7Vi3/jE3eo3dmum3sdlZ39tbfbo5gqyy O8ZCgYyRhwT7cd6i1rx1dT6f4pTSdLnKWFtciC+WVSDNEpDAr1XBBIz1x70AdLeeF7K7uL2aVpQ9 3c290+D0eHbtx7fKM1X8UeC9P8R6lZ3l7NdRmEBJYoZNqXCBgwSQdwGGax9P8V/Y7S6vL+1vPtke n2Tta+YH3Syl1VF/2i3U+49KWf4hyx6dYFNAujq9zNLC+nPMsbRmLG8hjw3VcY65oA1v+EK07/hI 5NX8y63MzS/ZvNPkrMy7TKF6btpx+tNXwRpq2aWwefy1tbW0Hzc7IJPMT8c9al8V+JbjRdKt7uz0 e4v3lUu0fmLCIlC5Jdm4B7Y7msx/iAkk2iR6fpVxeHULSO+lCSKrwRPwDtP3z1yB6UAUdI+HtvcX +vXmstdn7bc3ipb+cfKVJTjzFHZivGa09I+H+n6cjE3l/dSvcW9zJLcS72d4T8hz2GMDA9KzNZ8X XWg/EC/hmsbu70ryLTzZo2Gy03u67yO+TtzjsKluPGn9kaQr2WmX2qXEt5eL5AlG9Y4XbzHyR90c AD3AoAd408OPcaI+hWGnNe22sagZ7uZ3AW2BkWRmx36EAV21ra/Z57qTzpHEzhgjH5Y8KBhfQcZ+ przZvHlxaeKPtTadeT6Pd6fYXErK422ImZxuI/iJJUHHYZrsPFHimDw6ZzdW8kiR2Ut4pRhmQoVB RR3PzCgDK0z4eWOn60mo/b9RuY4biS7gs5ZswxyuWO4L7bmx9asfD/TbiCXXdX1DThpt5q155zW+ 4MyqqKikkdztJ/GotX8eQWNnczQ2TXDrPFa26CZUE8rxiQjceF2g8k1RXx5YygatFDduBpkk32cS AqZFnWPy8f395Cg9MGkBoaN8PdK0nU7q7gmvXWeGW2WB5iUhikYMyoP4eefxp2neA7C0hQS3d7dz i4Fwbi4k3yMQjIqk+gDnFc3qnjnVLqLSrm10O+ivrfV3sZtMEq7pWFuz43dNvIOfatObx1aC3XW4 7a9dV0eS9NtvAHyyqrIR/fDZGfamAeMPB4i8Pxf2VbXN5c2trBZxpFOIpRHE24OjdnB/Cp/BfhN0 +G76HrqSIb3z3mj8zc8YldmwX7sMjJ9arn4iz/Y2T/hHL7+2UuvIbTfMXzAnl+Z5m7pjZjj1OK0L /wAbtD4S0PWbPSLi8m1Z444bNHAcM6MwyTxxt5oAjt/h3YQ6RqFk1/qUst60Usl282ZhLH9yRW7E AAY6cVbtvAukReGotDmE9zZx3X2wGWQlzJv35J75Oc+xqpF47a5m8Pw2WjXM0uqRySSjzAv2QRsq Sb/XaSRx1xTfD/xG0/Vr68ieBra3igku7edpVbz4Yzh22jlSOuD25pAWNa8Bafq3iE6tNd30UhaG VoY5cRNLEQY5CvcjH0rStvC9lb3NtOhkLW91cXagngvNuDg+3zGudt/GZ1YWou9K1LTJBqNqkas4 Hmxy7ijk91O05XqKiufHS6jZamV028i06CdI4r2Cdf3pE6oQR1Tk9D1GaYF2y+GukW1tfxfaL+Q3 GwRSPOd9oqMWRYj/AAhWOakuvh5YXWg2mmy3+pb4JXlN4Jz50nmAiQM3owOMewqb/hNE/wCEmbTf 7OuPsAnNmNR3Dyzchd3l46+2fXiovA3jn/hKLryJtIutNMtuLu1MzBhPFu2lhjpg449waANJvCdi 1lpNrulEem2r2kPPOxo/LOffAqE+CtNaxu7Vmn8u4t7e3LB9rJ5AxGykdGHXNY3xBvtSXxj4S060 ivRYSyy3FxJayhS/lpkIR1I7471HH8SykOqf2hok1nd2iwtFbvcITN5rlEDEcRnI5z0oAuzfDuxl 0qztH1LVTPbzyTm8+0HzpDIMOC3oRgYHpU974CsLjRNM0qO8v7e0sY/IUQzbTLD/AM8n9RgAevFU LbxNq974y8NW7aVcWlrd2d09zE8ikROjIA2R94c8Edd/tVzWvHJ0zxU2lHSLmW0h8g3V+rgRwCZi qEjqeRg/WkBJdeANLn8S2+srLdwvDLFOLaOXELSRrtVyvrt+Wr1v4TsYINOiR5dtjJPJFz1MwcNn /v4cVm3PjdrTxbFpF7pM9tZyu8cd9JKoDMiFyRH97bhT81YWq+PXvNINzLZ3eiwQXllOJ52AWa0k lA35HTIByvX86YG/qnhGCDQ547GBruePSf7Migkk2iSMHIyeze9ZPw18MXkHh7X4taiu7f8AteVg Y7mfzZwnlCPLP0ycHGOgxVvUPH11B4YtdZt/Dt1PFcLJMqvOsQSBfuuzHgFhghevNGs/ENbCSyNp o93fWssFvcXE8bhRaidgsYYHqTkn2xQBsQ+ELCJQqvNgXcN7yf44kVFH0worMk+HOnSi98291F3n dGhdpyWtAsgkCxnsNwHX0rHtfiKmnQWUCaRqN3ZrDHPc3jSqxgjeZ4wW4+bBXoO30rcu/HBg8XQ6 RHpFzLZvdrYnUVceWs5jMhQjrwAOfU0Aad14T0+60bVdNmMpg1Gd7mRg2GSRiDuU9iCoI+lUtF8C 2GlRQKlzd3EkVzLdmWeTc7ySReWxJ+lP13xcdO8S2mj2umzX0ros1w0ciqYY2baGCnl+hyB0Aqro /jn+0PE02ly6TcWtqs1xbQ3zuCk0kP3lA6j5QTn2I7UAaFp4O0yC1ktnWSWCTT4tNdHb70Ue7HTv 855qtpPgez0+KISX1/eSx3iXomuZi7bkUqq/7oBNZuk/E7Tb0ajLcW0lrbW1s97BIZFc3ECnBbaO VOSOD6ii0+I6XOi3U66TKdWhuIrddOSdHaRpeY8OOOQGJ9NpoA2YfB9jDe2F1FLcLJZzXMqgPw4n JZ0Ydxkgj6Cm6N4LsdMj1JHuLy9+2xG3ZrmUu0cPP7tT2X5j+dM+Geo3OqeF/td6Jkne7uQY5j80 YEzgIfoBj8Ky/Enji5jm1+w0rTJ5vsFtKGvI5V/dziIuAUPOOnzdKALGi/DnTtLeOQXuoXMqvA5e 4l3k+SxMY9gMkYHrVrVvAun6lYm3NxeW7G8lvPOgk2ODLnzFyP4SCRWLb+Pb3T7Dw6NS0G6Ed3Fa pcXTToAkkuFG0dX5IJx0zSeGPFl4db1bSL6zuhE19fR2t+7jYzRkt5QHXhc4PsR2oA6WTwnZPoui 6aktxHHpEkUttIj4cGMFQCe4IJB+tSQeFrKG5t5kaTdBez3ygnjfKGDD6fMa4+1+IceheG/DqX0M t7PJp0V5ezeaqmKI8b8Ny5zngc8Guu8UeJG0iCyFhp82qX16T9ntoWCl1UbmbJ4AA/mBQBF4b8HW WgancXdpc3siunlw280xeO3QnJVAenNa+l6XDp0+oSwFi17cG5k3HoxVV49sKK467+JUMV1ZC20i 7ubGW2hu7i6DBRaxyOU+YdSVZTkD0PpV288e2lt4wTRDbM0XnpaSXYlUBJ3AKJs+8c5HPQEigCey 8FxWfiefWLfVdSVZp2uJLIS/uGdhg5X8qi0P4f6Xo2upqNrPetHCZGtrOSYtDbs/3mQHpnJ+mTWf B8Qb+60KXU7XwveOnnvFCHuERZFQkNIWPCjKkDPWsa+8bXN/frcJa3kei3GiQXuYplVopHuNuOnX tn0FAHXz+BdLuPE8us3D3MnmBibQyfuPMZPLMm3+8VyM+9Rab4A0yxtpYhcXs5eaCQSTzF2RIX3x xqT0UH86rD4hRedfNJpdyljHBcTWd0zDbeeQCZFUdV6HGeoBNaPgnxW3iX7XHc6Xc6XdW4jk8mdg xaKRSUfI9cEEdiKAHyeELFr6C7SW4jnh1F9SVkfHzuu1lPqpHakvPBtjceHo9JE1zCsM73MFxFJt likZ2fcpHu7DHpWR8QPEV/4f8S6LJY2N1qMbW108trA4XIXyzvOfQZ/OrN34ssbe7m1FftMkA0VL 9FDYV1ZztUL/AHycDPuKANbRPC9ho1zazWfm7re1a1G9924M+9mYnksW5z71vV5PfePdWuL/AEuS 38PX8d9b3s1rPpYmXdKfs3mA7umBnOa9I8P6rDrmiWWp2odYbqJZVVxhlyOh9x0oA0KKKKACiiig CvqEBurG4tw20yxtGD6ZBFeV6t4C1e80zQZJNP0O+1K0sF0yaO8BeONVb5ZU98Dkd8162xCqWYgA DJJ7VT/tbTvI877faeTv8vzPOXbv/u5z15HFAHFXXhzxFBrlzFpE9lDot8ElunI/eblh8sxqvQK2 1Oeo5qMeDNS+3+GZt8GzTbazim+bkmIsWx+YxXTt4gJ1q90+G13tay2yM7ShQRNk5GfTHTvS6/4n sNL0q+u4poLuSz2+bBFMu5cuF59OvegDmp/DWvWEdve6MbJ9Tgvb11juCdjQ3Em7qOjDCn8CKjTw Je22nXNta3EBkS0sVtpXBwZ7eRpCWHZSSPzrsLvWY40gls/Ju7ZxKWljmXC7ELcf3uRjjpWQ/jWC DRbbVLy3WC1uY7NkLTLkNO2MH0C5znvQByXiXT73SNCOva3cWNtrsuqRXgBZ/sqFY/LCMw5xsB+b 1Irnp9PttW+G3hexu5xBrWoai0tuVU5kjeZvNIz0UxsTz2xXteoXNu6m2dbe4DkI6SMu3JxgNnuc jA71XkTTkv7WLULiy+2gYtoWZVZR0+RevtTEZmsW194j8JeINNjSK3mcPb2rHO1htBUt+PBrOn8M 6rdnUJ5/s6T3lzp1wVVyVUw7DIPzU4rtIL6znuHt4Lq3knjGXiSQFlGccgcjms618QWt34ll0i1a OYxW32h5Y5AwU7yhQgdDxmkM5DSfBFzp3j+TUUsNHaxe6mvTfGMm7LSZ/d/gSefTiqnhjStY1DxR qEs32VdFstXvriI8iVpmBQKR02/MxzXoN9q0EUVwLOS3urqBkWSATqrJuYD5vTrnnrjFPGqaTC0i /b7GNlf5x5yDDE4556kigZxzeG9d07QfDL6MbJ9Y0m3a2aOcny3V1UMQR3BVT74IrK1jwLrsFhb6 foc1lJbz2MFneyTkqwMUpk3IP9re456cV6bJf2cd0ltJdW6XL/diaQB2+gzk1m6N4itb/SBf3LR2 UZuJbcedIACySMnU467elAjlZfDGvr4xSSGSybQP7VGrMWJE28xFCmOmAefxqmPCfil9B1bQ3urF NMhgeLTkXJMzeb5itKf4cAbePUmvTpJY4omlkdEjUbi7HAA9SaqvqunR2sdzJf2i28nKStMoRvoc 4NIDidV8K6nqPjbSdVa206BIjFPNeRMy3ClB80PHDoT69Aau6v4Yvby/1maJotl3e2FxHlv4YGQv n3+U4rrpb21hlhiluYEkm/1SNIAZP90d/wAKjk1PT4zMJL61UwDMoaVR5Yzj5ueOfWmB5xpngfVo PiO2t3UNhJapeXEv2guzTyxSoyhOeFVAR8o60lx8Np4/C7WmLLUbuDUftkMN2p8qWJFMccTemEPX sa7PU/FNlaXdhbQSQ3Mt9DPNblZlCv5Sg4DdOScfgfStaDULdmt4pZoI7uaMSCAygsRjnA7getAH JweG7uP4c/2QdP0c3hBkaz8vFqSX3bMenbPrzXO/8IT4ksdC08aQ9it+sd3BLbzSO8UEU+CAjHk7 Coxn1r1C2vrO6mkitrq3mlj++kcgZl+oHSpnmijdEeRFd87VLAFscnFAHn134c8S2cmiv4fuLOKY abDpl7LLyYVRgd8Y6MeXGD7Ve0XwvfWd7oUsrxFbK6v5pMNyRMzFMe/IzW74j1620bR5r7KTiPy2 MayAEq7hA3056+1WH1NGNi1kYbqC5lMZlSZcKACcj+9yMYH9KAOH8QeCLm68ef2ta2Gj3NvdSwST 3F3GWmtvLGD5frkAfQ02fwZq11Prs87wJJrkMq3ID5Ebo3+jEccgKMHp1rrte8SWWlW4mEkM+26h tZlWVf3JkYLlvTGc81a1bV4LHw7eavCUu4Le3e4HlOCJAqk4BHHagDz3XPCXibxBp1rf67b6Lf6r bTyNFp0wJtkjZFTAbGd2V3ZPrir2n+C9QtngJ+xRql1p85SAbEAhUhwq9hk8Cu3tdYsJ9MF99stV tgBvk85dqHHILZwCM1PDf2c8DTQ3VvJCq72dJAVAxnJI7UAeUP8ADe/iuNZt7Wx0VbeeG68m/wBh FzI8pJCsewG4gnuMV0eveFtTuU8QyWTW/n3bWMtsJGO0tAQSG9ASMV2q3tq90bZbmBrkLvMQkBfb 646496Wa8toZ4oJriGOebPlxu4DPjrgdT+FAHL+NdN1y5Olal4cFn/a1n5ibLliI9siYYgjuCFI+ lUJvCeqSjUjPcxXE1zLp0hlb5fMMBUyEgDjODgV0Oj+JbPUE1IF4opbGeeKSIygvtiYqXx1AOKdo /ibTNQ0LTtVa7treC+QPEJZlGc/w5zyR6UAedWPw+1uPxBqV7cR6efNS/iF0JGaacTg7C5PQLwu0 cc5qx498Bavr1lpFrbLYTxQ6YbGQXTtsglIA85VHDHjAz0616P8A2pFFPeretBbQQMqrNJMoD5UN z/d79euM1Ylv7KG1S5mu7eO3kxslaRQjZ6YOcHNAHn+reGfE019dQaXc2drp2qW8QvpX+eSNkiMZ RR0IYBRntzWbrPgPVr9NHupNO0K8v0sYrC5W8UukGxiRJH68E8fSvQfFPiG08P6Y1zM8UkuV8uDz QryAuq5UHrjdms7V/Gdlp91q9vsEk2mtaiVfMAOJ3Cg+wGcmgClP4WvWtr+JGhHna1BqCc4AiTys j6/uzx9Kyb7wNqN74m1q6WLT7KC4tLqFLi3LK90ZkKjzk6HaT97qcV6J/aFkLH7b9stvseM+f5q+ XjpndnFSPdW8duLh54lgwD5hcBcHpz0oA8/m8Ka1cadeyyfZI9Se0sDEoYmMXFuzNg/7JJAqDxH4 Z8Sa94Xt49Vg0i/1R5pXeOQlFtFfhfJkHzZQDr1Oa9D/ALRsvsP237ZbfY8Z8/zV8vH+9nFPF3bE ZFxCRtD53j7p6H6H1oA4Hx34Q1PVtI8P2dmbbUFsVMVxHeuypMTGEEjAfeIIJ2nrms3U/Aeq3Oj+ GLBINOMthaxWsl9uZJ7YxkfPER1BA+6eK9Re6t0SV3niVIjtkYuAEPoT26iorbU7C6kSO2vbWaR1 LqscqsWUHBIAPTPegDlPEfhi91K68QyW7RBb+C0ji3NjBikLNn8DXIeOUufCWmWtx9rsYL5ptS2f aAxRop2LYBA++PkwvfkV62dRsQbgG8ts24zMPNX91/vc8fjUFze6Rcact1c3NhLYbgVmkkRot2cD DHjOaAOCs/Ceo3vhiRV2Rvd6PptuqSHBV4SWcMO3Wuj8f+Fx4mTSF2RMttepJOJCRvgP+sQY7n5T +FdL9rtsE/aIeCoPzjgt90fjkY9ajGoWTGcLeWxMAzKBKv7sf7XPHQ9aAPN5fh7cjwFpmntb6dea lZXRvGguMmCdiGXaf+AlefVaq6v4XudK8MNdXv8AZ9ittpflstshEUU/2lJU+Uc7AVAJ+pr1B9U0 +O2juJL60W3l+5K0yhX+hzg0+O7s7qKfy7i3mjjJSXa4YKe4b0+hoA8v+H0OoeI2XWpmtWCa9LdP JAT5Tp9mEX7snlgDxnvg1abwLqn9iva77fzG0y4swd3G97nzB+G2u/hv9JttOjmhu7GGw5COkiLF 74OcetV7fX7OfxLLosbo1xHaR3mQ4O5HZgMDv93OfcUAed/ERbjw3rk3iBLuyt5ppx9nN1u8sp9n 2SAkDhshSo74xT7qHVrf4dfD5NOijGqx3VsVjuAQpbyJMhscjP6V6TcXWlXTS2tzPYzNEN8kMjox QDuVPTHrTm1DTHS3druzZZJNsLGVSGccYU55I5HFAHLeGvC97p93o0948LNDZ3S3Xln/AJbTyrId vsDuH5Vh+Evh5Ppkuo2d1ZaPBYPZS2Ud5bRkXFwH43P6YHX1NdzrviC10q60+1LRy3N3dR24hEgD oHz8+3rgYrUjuYJPLCTRMXBKbXB3Y649cUAcBpmg+Krm1sF1+axH2K+tHhhtz8qxQhgz5PJZsjjt isu78A6rc61qlzHBp1lHIw2NbMy/bMzpJulToGUIeepJrvNa8T6bpa2xe5gk869jsTtlX93I+cbu eOnStS9v7OwVDfXdvbBztUzSKm4+gyeaAOJPhbVz4kMfmWn9gf2gdXD8+d5xB/d46Y3Hdn04p2i+ H9S0KLTbtvIkk07RJLQruOGl3Kw/D5a7Rr+zW7W1a7txct92EyLvPGeFznpSRahZS3EkEV3bvPGC XjWRSygHBJGcigDA1jSr7WLvQr6NltpILe48055R5Ydox9DXCeGvh7rOnafqgutO0SSW4sooPIdm lS4eOQsWlZuSXyef4cCvV01bTXMYTULNjI/loBMp3NjO0c8nBHFT/arfZv8APi2b/L3bxjdnG365 4xQBwHhPwnq+i3Xh6Ym28uAXaXUHms4gSZkdVjY8kKUxz61S1vS9X1j4h6zY2X2UaRMmntfNJkSK qM7jZ2OduPau11bxLY2mnG7tJYL5VuYbZ1gmVtrSSKnJGcY3Zx7Vq3U9pYq1xdSwW6sQrSyMEB9A SaAPL5vAGq3Pj2fVLqOxks2vJJhcmRjcGGSIx+WM8Kq7s4HXFWIvCPiLVvD40fxM2ny6dBLZwxW0 XKvDDIC7sTzuZQBt6DFekveWq3Uds9xCtzINyRFwHYeoHUism+8UaZbatpmni6t5Jr6doF2SqdjK jPg89Ttxj3oA4DxF4F1/VNE0XT3WwvEsRc2uy6kYxiJvlhlKj7zKgA2nvzWN4uN5o11YaLbzWhur 22022urdgzSu0UgwYeMEEZz6Yrv9W8by2V1pFlDpsc+oX0Us7w/bEUQxp/Fu75P9fSuoeWxku7QX JtRfFS8KOVMg4529/wAqQzz+HwNqiaFqlmXt/NubCC2Q7uNyTyOc+2HFZGoXcy/FK00exntpbV9a W/lh2t9oRxbkMT28vhTu9TivRtY8V6TpqQE3ltMZLuKzYJMp8t3OBu546GtMPp51QoGtDqSx8gFf NCfzxTEcb8QPCl94g1rTZrK3sQiFA16xZLm12uGzGR94HptPFZXg3SdW1DxHdT3Rtl0Oz1TUJYSu RM0jloyCOmAGY59xXpU+oWdvdRW093bxXEv+rieRVd/oCcmmw3diLtrSG4thc5LGFXXf7kr170Ae XaF8NLiCw1jSrmy0W1tJbFrGG7toj51xkgh5PQcDI71Y03wZrNpoU8ttpuhafqsN9Bd2tvaArFJ5 YIPmN15DN9K7l/EFqfE9vosDRzTSQyyyMkgPlFCg2sByCd/6VlxeOtOknt1zGsL6hPYSTPMoWJol Ylm9M7eB70AN8H2mr6HYabYaklvLPdXN1NdSQk7U3M0g2+2SBzWL4m8E6hrHi6a7hhsLW3eN830R ZZ33RFPKkUcMuTnJr0Oe+tLeOJ57qCJJSFjZ5AocnoAT1rK8Qa8dKvbS1jtvPluYJ5kzIEUeUoOC T0zu69qAPNr/AMAeI9Q1LTLm6h0yRreGyO95WJt2gYFkiHQb8fe6jNdBpfhfXk8UTSXzWX9jxXl5 f2pRj5peYFQrDpgBmOfceld8l5bm4FsZ4ftRTf5O8b9vrjrj3pq6jYus7LeWzLA22UiVSIz6Nzwf rQB5Zqvw61CW30NorHRb+6h06HTrj7chYQbDnzI/Xq3Hfiuz8WaVqskmlaj4e+yNqOnb0WK5ysbo 6hW5HQjAI+mK3m1TT1sheNfWgsycCczL5ZPTG7OKknvbS3ERuLmCISkLHvkC7yegGev4UAeRTeF9 ZXWx4dsJLWS0bSrWLUZpAVIBnld2j/8AHhg+orcuvBFyvxDOr21ho89pcXcd5Ld3EebmEooXYn12 gg9smuk8ZeI4/Dg08w2kd3qGo3KWkMXmrEW6kncewAP4ketbi39mz3CC7ty9v/rlEgzH/vc8fjQB 5vrPgnV7jwjoGmwx2V29lcSyXFrcSMsMocvtJx97buBweDUEfgPW4NIsbCNrJlTSo9PmO4rhopxI rL7EZ47cV6a2p2C2gumvrUWxJAmMq7CR1G7OOx/Kli1GylExivLZxCA0m2VTsBGQW54455oA87bw XrckVxp80ll/Zlnb3iac65EkjzqwHmdgFDEcdetbiWGo6HPqepwRxTu9lZ28Ue48tGWD/o/FdH/b Ol/ZRc/2lZfZiSol89dhI6jOcVZa6t0BLTxKAnmHLgYX+99PegDB8Q6Lc3+u2d5AyCKGyurdtx53 SBNv4fKa5PW/DM1j4cmlv54oobfw/DYmRQW2zRvuDEDkrnGfbNdVB4shn8ZX+iRxR/Z7C2We5vDO oEbN0Xb16c5rZOqaa9ibo31m1kTtM3nKYyemN2cUAeX/AA4j1LxHrMmv3D2jpHqcrvJbE+U4NqsX 7snlgG4J+teh+C9Mn0bwrpunXZQz28WxyhyM5PSmadrWmLrGo6Nb/Z7c6ekLsoZVXEuSMD8vzFal xqFnbIz3F3bxIrbGZ5FUBsZwcnrjtQBZorLt9ZtxbGXUZbayzK8aCSdcMFbaCD78cds4q3c39nay Rx3V3bwySfcWSQKW+gJ5oAs0UZooAo65n+xb/HX7PJ/6Ca8L8T6Laaf4V8FxrLY6VpDac8srXNo0 8bXLRx8kAg7yN2CfTivoFwCMEZB4xUUltBLEIpYI3iGMIygqMdOKAPH7aCWO8t0lkluHW70MNM6F S+FPzEdvp2rhfPsrsa3cRW1nbW0mmSrNZ2kL74sXMWVlc8u5UE47V9NmKMsWMaFsg52jOR0P4VH9 jtgWxbQjcSx/djknqfrQO547o62D6jDJoCKNDa/vjZiNCqAfYsOVBHAL7vxzVO8t7V/D6vqcKvaR 2GgvL5iFgFEh3Ej2Gc17ilvDGqqkEaqudoCgAZ64qtqT2tlYyzT24eFVVWVItxIzgDHcDNAjzzXd PuP+FuaPBEhOm6gV1FmC/KHto2XB+u+LH0rn/iNcW8nxMt4lgsre7trywfzXid7i4BYZKN0jRR1P fmvUF0Jo/GH9tTX1xOGj8iC2YDy7ZduW24GcsVBOfStuS2gklMkkETybdu9kBOPTPpQwTPItF0qC y8Q2Wp2NuINSutT1aOW4AILjEhUN7ZVSPpTvg+dGbxOP7FiCXC6JEuoEIy5ufNO/dnq2c5r05Zbe 6WUxQEfZbgo26Pbk8ZI9Rz171YW3itrrzYYY083iQqoBJzwTQFzwgxw2uo6zZW/2XUZTMsk12kLR 3MB+2RERz9nznhvalvfDmmPp17dPpsbXElhrN07FTlpUucRsfcAnHpnIr3KxlsL2S9NrHE7xzeTc EIMmRQDg+uMipLuCJkSIQx/vG2kbR0Jyw/HHNA7niuuDT18fSCZd3iWb+yjYsyklTuJcqegwAc+x qp4rt9+jaKb28tbLS1uNU3veWrTx+aZzt+UEYbbuwfyr2WLRbeDxLPqmN8tyqDDKD5flqQCvpnca 1ZLaCSHypIIniJzsZAVz1zih6iTOD12JofhdpEd9NLdWcf2P7dI0ZVpbcMu8so5A29R6Vwd8/hcS abLqcMR8JNqV+bJGibygv2deVXGdpffjtkjHavc9UvLbT7GS4vmC24KoxIzncQoGPckCql/oVpea hplzIihLASBIdg2MHUDke2OKAPC9ds7yS+0QavqkNhOdLsVs/Os2mmL7ju8oggK+cZzzz6V0OtW2 m6b4d8SajcaZZTXF34gaGWe7VvLUbwFeTHJReuOhNeuRSW15dTRmDdLZyBd0kfAYqDlCfYjkVYkt 4ZInikhjeNzl0ZQQx9SO9AXPnzTYLJfDujPcrDK6xa5DbSrbmNd5GU2KfuAjcQPStsCyGs28U0f/ ABU7Xentp7mNtwthHFv2nGAoHm5+vPavZzbQEYMERAO4AoODjGfy4p3kxeYsnlR+Yi7VbaMqPQHs KAPJvAemWWl6z4e1C1thbzXkeqG7lUEGULOCu71xzj9K6H4nXDN4UtNe0mRJDCwMb7SQ0U6+Vkd8 fvFb8K6B9a0pdEvdSyFtLJpopXCcoUYq+B9RWpaW0EFhBaxRj7NHGqIpGRtA4oA8XtdMml+Hmvw6 kiyC0kttFVVB/wBXDOobB6kEsefatiw06DTPEMNjp9uILK38SN5MSA7Iw1kWOPQFiT9TXpmp3Fnp uny3F7sS2UgtlcgszADj1LEUyxvLK+ur2K3VTLZziOY7ekmwHr/usOaAPDrS28P6jptraR2s8ust PaRa2QrCN3+1DKyer53Ef7Oe1dnaWkdl8NPHFhaxGK1t5tQighXOETaSFUenJr0hbWBWcrBEC7B2 IQfMw7n1PvT/ACo9rr5abXyWGOGz1z60AeGa1aaZ4dtNVtINNs00+VtMO25Dm3gkZJA0zqPvcKMj ucZqr4UsrhND0uwtVMlv4iklsLiSKExrGIp2fft/hDQlwAenFe8y20EqsksEbq+AysgIOOmfpVO+ 1Kx027traUBZrnzHjREyW2Jubp3xSHc8g0a0cfFx2n1S3h1FdUmYWq2bGd7fZhQZc7fL27e3BHrW l8QPsg8Uast6mdckSz/sJijFgwb5/LIGBhuW9uvFemaZfWGpXEstqgNzCqCQtHtdA6hwpzz0IOK0 GhjeRJHjVpI87GKglc9cHtTEeK6FHpU3jm9gsYB/bR1PVP7Q/dtue2KsFBJ4KlvLx7g+9cx4nm0z /hAPDdjaWmnxMdFlaO4ngeRvNVsNDEg4EhfOW6jrX0csEEcxlWKJJX4LhQGPOcZ+tJ9ktvkzbQ/u ySnyD5SepHpmgLnkeo6fb6rqrW99bi4tZtZ0wujjKuPsff1FYPiKzWLw7oVvNd2thotrd6lDm8tn nhQiQiJdoPHy7gp7flXviwQrjbDGMEEYUcEDA/IUkltBJEYpYIniJyUZAVJ65xQFzwXxNFp8FlZw 6+7XupHTtOXSJ5IWV2xN+8IH8J+6Tk9MVveM7HT59e8a281shuboaVvGwhpIfOVW5HbOAa9Vke1m 1IWstuHnji81WeLKhScYDevHSl822m1Ka2aDdPHEjs7R8FSxwA3fBXOO3FAHjHifTlstDu7G0e20 7RbbxK/mieBpbeKMwBgCg/g8xs46Amtk2KS/BKys5rj+0baW6gUSeU0QeJrtcAKTkKFOB7CvVngi dJEeGNkk5dSoIb6jvS+TH5Qj8tNgxhNvAx04oA8P8Taallod7Y2j22n6LbeJH80TwNLbxRmBWAKD +Defpk1WvdPu08JeHrewvEvYNThktjM0LRKyRSNPGAOoUBWAyen1r2yzurHUjqEEKJIIJzb3Csgw X2qSD68MtXPJj2KnlpsT7q7RheMcCgdzy67hfUfgzqF5fL5kuryLdTKF25V5kAGOv3Aoqp4X0Sx0 3xxZy2Nklu66xf2wZFxiIQZVB6LnnHrXrpjQx+WY1MYAG3HHtxVW7ubOymtFnCJLczeVD8vLSFST +in8qBHzhbBbBLy51C7sb69VXS/sHtJI9padcPcyZ+ZVOCOOR7VrWdtanwB5k+o6dHa22t3Dp51k 32KcFBtUx9VU5+U+vNfQDWlu5lLW8TGUYkJQfOPf1pGtLZojE1vCYjjKFAVOOnHtgUDueHQ6rbxG Oyu7R9PvdSutHuLazwz/ACKUBIY9htPXpxWhqmjpF8P9eurGOK1nu9ckN9cvEX3QrdHJdRyyAdh2 zXrOqzWNhatfagkSxwADzGQErkgAD8cVdESbGTYoRs5XHBz1zQK54DZ6NY3ujabHLNb6vYq2qT27 RWrRQIwhGAiEn5Q2SO2enSr0emvZ+CvFkGjxm2aXTdNlcqhbJZMysQOWJXOe5r0G08aaBL4g/sG1 tbo3EUzWuUsz5KMPvDfjAHrXXJEiZ2RquQAcADIHQUhnhfhvRdO1KLSrSa5s9Z0mXXWYRwWjQWyk WjZCqScjOCe2a2fhVDZweJ7fzogt4dGEVu7qSxjjuZlKhj6DYPpivT7mWw0tLVZEihWSdYYVVAB5 jZxjHTPNGk3NjqETT2SJthlkt92wAqyuVcD2yDTA8F1saXJeeKI9OiH9vi91Q3rKh3tamIjBPTbu 2YHqK6Lxlp+haQ62V5ZpFbjRSmjRLGxC3ZYk7MdJCTGc9evvXpNjp1jok8qGNppdUvJZC5j3YL5c qT2Xg9av61dWem6bLf6iq/Z7QeaWK7imO496BHkF8LFfHtimrRh/FP8AbFk0cmw7vs3kDPIGNu7f +Jqx4O1CKbXND0m0Z11bTrbU0njZCPJdpQVBJGOeCPavWL2S1gkt5prffLLIsKOsW5gTyMnsPepp Ut7YTXTRRqyqXeQKNxAHPP0FAHglknhSaw0aWG0drm3u7D+2JXiYxCbe4O/I5k3ZyfQiug+P01sz 29nLb2KzyWM7xXV1C8xyMYiiQceYSevYV6ppjWOoabDd2kMRtbxVuB+7A37gCCR69KWynstXtoby BY54gzCN2TOCGKkjPTkGgDxeRtLk8aKCqt4keXSWspCpLbPLHmYPQDbvz9al8O/2UfF90ulxqusr easdQZUO4wHdsyehG7y8e4PvXrdhodrZ6xf6iihpbry+CoxFsTYAvpkVU8HWunR2d6+nN5we9ufM kdQG3+axdc+gbIpDPHJNM0TSdBtIp7JYbq50G2k0nbGxY3pyXZSB/rN3lnPXA9K6nV7W4h1++0i5 spJ9OjR/ETquQJGERUxAjoTKC3HPNerNBCfKzDGfKOY8qPk7celV2v7Uaummsf8AS3ga4C4/gDBT z9SKYjwTwg8U1vrclotisM0ujyCKwgaOKM/aDuXJ++y8AtXovxZfSI7nRW8VIJPD+LlZkZSymUxj y+B3xvx7kV3iWltGoWO2hVR0CxgDrn+fNPnhiuE2TxJKgIO11DDPrzSGeCJaF/iDYGXUhYzfaLE2 EF1ZtJeNAI0+USZwo++G/HPatfQdH0eybwXfT2MMck+s3rSTNGSWlPnCPJ9c4x+FeyNBE8ySvEjS pkK5UFlB64PagwRFVXyY9qtuUbRgH1HvTFc8Km0u2l8PabdS2aNdx+G9TCyFPmXDjAz/AMCb8zW1 fPoieNSmt29xPrBezfSxCreYIhD82D0CbhJu+v0r0/Vbqx0uyE95GiwbkgGEB5kYKB9CSKuGCLzV mMUZlQbVfaNyj0B9KBnzHpLaTea3Z3tzbabHp5ks5Jbe3t3225FwQVkY/fcZGT2zXYaPayn4vySX Oq28WojVZ3FqtmxuHt9h2hpc48vbt7dR617QLK0ClRawBSSSPLGMnr/IflUnkRfaPO8pPO27fM2j dj0z1xSC54j8Ubi3k+IUMKwWUF3b3WnyedJE8lxcKZRnyz0jRR1P51qppNpF4sfWI7ULqZ8VeQbk AhjEbcZX/dNega3rOj6bdTDUVTz4bX7Q7GMMRFvCdf8AeI4ra8qPr5aZ3b87R971+tMR438OBpn/ AAn1gsEYGvJa3w1ZwjAmXz0xvJ4J7j2plhouj6jqNpplxYQyw/8ACS37XcDRkAt5chUt68bSPwr2 J47a2E100cURALyShQDgDkk9egptg9reWsN9bIhS4VZ0faAWDLwfrjFAHz94htmk8O+FxqOoW9jp sem3EUT3lq9wPNEu0BQCCH2gbSfTiu0+IkUq6NpCSvJcSLol8ryMmC58mPkjsT6V6i9tBJEsckET RqdwQoCAfUCnvFHL/rI1fgj5lzweooHc8lsjpR8b3kc0U7+MhdzNbSRKcpbm3Hllz08vGBj+9XEa Hp0cnhvWopNRgu5JLC3iv7S3s3hIkNwmfNYn5pB84yOec+le5x+I9GLG6AKnJhM/ldxN5Ozd/v8A b8a2xbQAyYgiHmHdJhB859T60CPFPE2k6fp9rq1uktlp2mWWt+ZFb3du0to5a1QlGUfdyxJB6Ak1 Q8dRte23h2a/mttDsn0XEEVzbPc+XMWGVjIIIfGzBPP617lqUthAYIb1Ij9smESIyBhJJtJGfwU/ lTbG7sdZhkaJEmjt7h4TvQHbIhwcZ9D3oC5ynivTLe6uvAbX8KXc8F+n72WPnPkSEnHbLKp+oFed bbKXRL6KyjP9sLo+oJrxCMGZzjbvJHJLZIx26cV78yKxUsoYqcqSOh9RTPs8OZT5MeZf9Z8o+fjH PrQBwXijw7pR03wdo/8AZ0P9ljUUzbBfk/1Mh5H15PrXCaXb2ei+Gr27GmJOs3hyKa5hbconf7Qw y5HOAMfgMV746K23KKSpyuR0PtUf2eHaV8mPaV2EbRjb6fT2oC54H4L0fTdb1C0sr6Cxv9NbV7mQ Jb25it2H2JcFVPbORnuRmnX+pQaX4Vi/tJpVN94YNnbFkZjLIsrfJn1AK9e1e8xW0EW3y4Ik2jC7 UAwPaqdnPp+pPdQQxRSfYZjA6tGMI+0E4/BhQO55hr1vYaZ/wnmpSaVbXEjWuniQSAqr5xkuV52g gE+y1zGito8OlZ8RPaz+GP7WuvN8i2aO3Z2t08srH1AzvA7E819CNDE4dWijIcYcFQdw9D61StW0 29N3bQQwSC1lEMqeWMK4UMBjHYMKAueP3kWnW0XiKa3tJ0mGn6TcqJoyZ/s0bqWLHuQFGfpVy0Gl +LNUt5fKW90ufxTLIu9DskC2XDYPUZHfg17E0MbMztGhYrsJKjJX0+ntTY7eCJVWKCNFQ5UKgGDj HH4cUgueMtoljq8llb6nZLcQRtrkio6nAbzQAfrzx+dZXi1tObSNObxCnm38ujaZ/ZbyKzMJPMBl wex+4TntXvohiBBESDr/AAjv1/OuW8T+Codf1S0nm1C6hso9gmso9vlzBG3KOmV564IyKYHW0UmP eigRU1l2j0i+dCQywSEEdjtNeI6TZ3tmthdf25qk0kK6Rd4knyHkuX2Sbh3XaAAPxr3eeJJoXilU NG6lWU9wRgisKw0rw7ewN9hhs7iKIw27GJ9wU25zGhweqHtQB5vPqHiCb4kX12rvBY2uofYmka9V UFuIwzKISMs3JYHOTj0rn9MuNXvjqkGlTah9nvba2uvLvdRVZrlGlYMysOImYdF9K9tuPC2iXOvx 63PpsEmqxrtW4YEkDBHTpnBIzjNZ1v8ADzwnb2dxaw6JbJBcKVlUFvmGQcZzkcgYx07UhnCw68F0 mYx315BFH4evVQXsoEiyxzbcE5wzL0yO1LqYu2HibVf7Svlls7ewihiWUiNfMSIu2PU5r0DUfA/h rUdNsbC+0i2ms7EFbeNs4jBGCM5yc981ck0bRnNzZyW1uWvVRpYi3Mqx7VU4z0XCj8qYjz3Vorxf Hl7qsWqXiNba1ZWMdvvzCIpYoxJlfU7s59qg8N3F5/wnunX0+pXVxLf3GorPY+b8sYiO1MJ2wB+t ejXNlpEl3OPskdxctcR3MwQ5ImQLsZueCAFxXG6D4TvbT4h3HiG9trUIPNKSW0ZWWdpMD94CcDao xx16mhBczb+G48SaqulyapfW9rPrt7CzQSFW2JbghM9gGrN1i/1S58O+GNU1G4u7ixtrHzrh7O5W OZJVcKJmQ/6xcAZH1r1bS9K0rK3kMEBnS5luDIjZ2zMNsh69ccGqf/CHaBd21gl1pcDw2EheyU5H lAnOOvIzzg5FAHm402W6nvra1v720GqeKmS4kjmwwXySxVR2B/wpLTVrs+FbRE1RpJ4vDN++RJmR JEdFV25+8OefrXrI8PaRHfy34sYVupJ1unkyeZVUoH64ztJFZ1t4S8KQajfPb6dZJeajFKtwFb5p Y3I38Z6E4zjvQB53o1ldaX40sVXWNSnjttRhtlSebcHWa18yTd6/MAR6VD4R1HxHPc6hqV3I8cF5 ZXry+ZfK5ZkyIykWAU24wf1r12TQNLkm842cfnCZLkSDORKibFb6heKz7PwvoFnqOo35022iv7uM x3MwB/eo3XjPGe+KAPKb7TZU8J32mXmrahc213YaZqLvNNl0lecK5VuwIA49q6i4ku9P+KMEl/Ne NZyTx2dnLb3IaJQY/wDVzRdQSQTu9xXYXXh3TNStZbZtOhFpLapZvvzl4VOVQDPQE9etPtPDOj/2 0mrPYQnVrdfIW55ztAwOM4JwcZ60Bc4zxU2q3o8UWthM7hdUto2hF15DPCYEZkjc/dJPPvzWJq+o XM2i+HtTjn1V9Gs7eR5Al0sd3DIkpXe69JQu3HXsT3r1bUvDWj6nbX0F/YRTRXzrJcAkjzGUAK2Q cggADjFQXfg7w9dw6bDc6XbvFpuPsq8jy8fQ8jjoc0Aeaax4mvbTSBPY3zSXyX2rFY9/zYWOQrlf RcqfbiotJOtx6HdabqdzPa2N5e2cJkGorPNCkpJkbzABsDYGM+pxXpqeFvDTeI7nVE06zOsEfvpA cthlK8rnA3LkdOabbeCPDVpo99pVvpFumn3zb7mEbsSHjGTnPGBjnjtSGcNawpb/AAT8Uwx3bzpH Nfoty7BmIEzDcT0J9/aoxdz+G9M1Sa01C5vtO0K+trt5ppvMLQyRDzlyOoG7djtXpNt4a0e10GXR LfT4Y9JlDK9sM7GDHLZ+pJrD1nweLfwnNoPhC3sbC1vJSLsSBmHlvxIV65bHAzxTEYfiWzkvfgfC mp3E4lmS2mlkEmGy8yMee33vw4rPFpNY+ObvVrXULtGGvW1gYN/7p4ngjDbl7seDn2r07UbDTNQ0 59Dv44Z7aaDa1q7ctGMDoOcdOaij0fRmmkjjt4GljniuZFDZZZVUBHPPXaox9KAPNPAV74ivPHZv bsslndXF3FMJL1WDLGzBFSHGVK4H4HmrHmzy+P7e/fVbpLh9clsDYed+7MCW7FTs+vzZ/wBr6V3t v4d0Cx8TPq0Nlaxa1dKwM2fnccbiBnHpkgfWqGr+DbG58V6Z4gtLaCLUobkSXNwc7pIxE6BR2z8y /gKAPOLnXy+haIs2p3z+do+2VLKUedJI1xGgXJ6E5K5PvUHhi6u10vSJLh5fPtbrVogXn8541WA4 G/vg16g3w+8KMb8nRLXN9n7RjcN+WDHvx8wB4xzU+j+E9CsbRba10yCKK3kl2KM8b12sevdcA0Ae baBb3MeleKtYsbq5l1RI9OvCjTHD7IIpG4/2gGHvXbeFL671L4fX2q2lyFuL83V1ayzN8qKzN5R5 6AALT9V0eKw0q7Ph5NNstauYo9PWW6YhGRRhRjPJC5xWvpUFjpug2+jQSwT/AGW1SExZBLLjaCV9 CQaLBc8r8H3ht9Y0iw1Ga+glivz9oju7sTRkvbSNuSQdQxXOD0Iqkbq41HR9Ku5ddvLd7bQZ9RgC T7fPmSf5C397jAx/tV6fN4G8MWvhqfTP7JthYNIJ2Qlv9Z2fdnIx9aoy+BPD974h01mtbGXTdOsQ ltaKxzExl3q4AP3eD14NAHKeINR8R3fxAEtkGiisWsghe9WGNBKFMgaMj592So56jjmrdk0ujWM/ i241G9lhg1m4W7jlkJjjtvNePAXttyrfhXoWqeF9E1TV7TVNQ06C4v7QgwzPnKkHI46HB5GelNu4 vD1pbSaNeNYxRXu92tJpAPO3t8x2k5OWb8zQB5dqR1+5txDHcSme9s4b2e2N15BKy3EhMaOfutt2 AfQ1JZ69cto2qtY32oQxRWFpbq1ywMtvm6kikYnpuVf4v9kGvTte0DQ9Qtrl9atLeSFoFhleVioE atuAzkYwcnNJHoOg2Fp5As7WK3ngSx2seJIwTtj5PPLN7nNAzzibT5bm9tvC8WtakdLi1nyFuEuM ytGbNpDEX7gN+NbX9p37/Bq3nlvJftUgS0kuwcOqGcRNJnsQuTn8a7DS/DGjaXbWVvp+nwwRWUrT QBSTsdlKlsk5JIJHNWf7F00aJJpH2OL+zZEaNrfnaVYncPxyaBHjVwl5p2hXuj6HcXN/FceJJLZ5 PtgjkeMW6tsM2Dg5AGepxim3r6nPp9k2r63cWt5YaLc3ka294rCaWKcCPcw4cgYBx1zXpVp4c8HH w/f6Na2untpMcpa7hSXIjkAGSxzlWAA5zniqC+B/D2r6jpN5Da2F1oNnY+VZxRtuRX8wMGUg4I49 Tk0Acn4u1S5fx1pc1tLqQuIbrT47jNyI7eASlcxrH1kZgTnPTNINGF7qekahfalfySy+KrhVUz4S NYzOERR2HGPfNelaj4P0DUdaGr32lwTakAoE7E5+U5XvjIxwetSyaJol0hsmtbeQQXQvjEG5jmLF xJwcgkkn86BnjNzaX0ljeXp1zVVkks9Q1Aqs+FV7e52xKB2Ubjkd60rzUfEdx42v72JnS2t7o2m5 75UTyRCGKiHGSxJ3A5z+FerN4a0cwtC2nwmNoZYCvPMcrb5F69Gbk1Fc+EtBudbj1e40yCTUo4/L Wc5yF27emcZ28Z60gPHbywni8GX9jd6tf3UGoaLY6jK08uWSYzAMVPYEY49q96tESGCOGNy4jRVB ZskgDgk1kXWgaDJGthc2dsVntPsKwseXgTnYBnoM5rRsdOtLGSR7WERs6JGxBJyqDCjn0FMRwfge 010avrV7HqkH9ipqt7mw+zZdjuP/AC0z/e56VyM97fW/h2a8t9bvZrvWNGnu7oGYN9mmVkCsgH3M biuPb1r2T/iV6BbyO721jDcXBdmkcIHlc5PJPUntVGHwf4fhbUjFpVup1Hi7xn96M5x14GecDFAH M+M9At7fQvCWnPeXjxwazbnz3m/eOSXJLN35NYfhmK50vxNFqNvfXTjUNR1WGW0ZsxBYzI6bV7Hc vXvuNeqavpVjrFotrqVslxAsiyhGyMOpypGO4IqCz0vSS8U9nBAzW880qOjZ2SuSJD16kls0AeJe B9S8SnxV4Zm1CeRLPVfMuJ0e/WYyyeTIQwQAFF7Y6Agd66a3sZIfgLfzzX93dXV/YfaJJp5NxVmA Hy+gHHFdtb+D/C+kX82sRaXaWtzvM73JJG04IJ5OFGGbgcc1q/2PpraGNJFrGdM8oRCDnbs7D6UA ebWX2vRNQOjRaleXFtb63YhHnk3PtliLOhPdd3OPeqehSzyeIIb6XVbqWfUrXU5LqyebKRGNwqYT +HA4r1OTQ9Mku2uZLONp2mjnL85MkYwjfUDiuI0PwVJpfjTUfEGtPpUdvIksfmQqY2uDKy5MuTgH ACgDqTmgCr8JLSfSrqzsft93dW17ocF8yTvu8uTdt+T0GMDHtXKLDf2ngzw1pOivd3EV9dX89wBf CBtyOdq+YQcAfe298V7fZaPYWMsMlpaxxSQ262kbLn5YlOQn0BrI1Lwj4YfR57LUNOtV06S5N06O 5VfOc8tnPBJPb1oA4bz77UpNMfXfETaXc6dp1pdLJDKrRTTPIyuSB/rAQoXjj5qzEiutKk1DUrTU bxTf3GswyQb/AN2gRJXQqOzBkzn3NeoXfhfw3d6jpf2jTrN7zS4w1mnQwoCACFB6AgdR1FXJPDmk SxeXJYxMm+aTBz96UMJD1/iDNn60AeT2cF3aXNp4dm1zUW0/U1s57m5kmxIjSRSl1V/4Q7Rr+fFT 22q31rDeXcN1Jc3Vho2oxW9y5DM6x3Kqj56HgdfavSbjw74f1eznjls7a5tpo0tpMMSCsRIVcg8b SW6cirNvoek2EcZhs4IY7e2a1XjCrCSCy/TIyaAPMp1ksIb/AEC21q9uNMuLjT1e7a4DSQidn80B +2din231JFqdzoPgdNZXUJ7610fWblZppJNxktt7x5JH3sZU/hXVax4Lsl8HXek+F7LToYbmRZnh nDNFOMgkMQcjOBgjpjis2DwTqlt8P7bw3bS2Ci5nZtRO07EjdyzrEPboM/WgZX8RNNb/AA38OWl7 NqUl7eNFGY7WcRvPKyM5VpD91QQST1+WuTtRqGs+G9Gkm1fULaW00S9vAYLjO+WKbEe5v4wAMZ71 6/4l03Qdasv7O16O1ngieOTypJNuxiSqHggjJyB69KWDwzolpbeVDp8EUCwSW+0ZAETnc69eATzQ I8u8VSy6xfR3t9qM8EtodJ8i1WQLHP5sis7FP4ueM9tlaHxbu9dfxPb2mjmRY7WwN6ji9W2VJfMK h2yDvAAHy9Pmrtr7wv4Y1KbT9Uu7Gzma0jjS1uC5wiAgpg5wecYqx4k8P6Dr89nFr1nbXc0ZMluk rYbjG7AB5HTI6dKAPPNJ1G+t7vxCBdPK2iWNxLZAMzCV3+Z/r5bDYOvWs3WBeWOlWulaLrd1rQ1K 7he5ia7Ecke6BnYedggB2UED8B1r1u08N6PZvbtbWEUbW6yrGRngSnMg685I71mWPgrwn/wj0+l2 Ol2Z0m5k8ySONiQzg4zuznIxjg8Uhnmt9Jfy6FI2ryLLejQHV3WUS5AvQFy44J2gZPrmtTxVeeIZ viZN/ZxZLfTprOONnvlhjVZMGTMZHz7skA56jivRU8KaElmlqmmW626W4tFjAIAi3btn03DP1pL/ AMN6DrOq2er3dhbXV9aH9zOTnYVPHQ4ODnr0NMR5haw3SXU1y+qX0yas2r2s0EkmUSOPeY9g/hIx 1963Dbi2+Ffg/S4L25itL1rS2nuVmxIsbrubD9skBfxxXexaFpkTQtHZRBoXlkj6/K0ufMP/AALJ z9az77RPDdt4et/D19BaQ6TMwhhtJZNodt24KuTknPIwaAPP9D1SWzs9OSfV5JYVttZVbiaYfvfL mARiehIFY/ibVLkw+Hpba51OS+tbHTp5XF0IoIfMZRkr1kdvT0r0bTPh/pB8OQ6RrWn2t3bW93PP bx87Y1eRioHQ/dbBFWtS8JeE7q6tpr/T7Jp7SOOziLuRsX+BMZ688Z59KBnlmuRG90+TT5rmeG0a 4kkYRybMN/a+3d9cGuzlu72D4m2/h8zy/Zpp11SM7yS0KwFGXPoJAvH+1XTDw/4Y1KGa2W1s7iOW JlkRXzmN5S56HoZATn1BqOz0O+bxfd6nfta/Y4bT7FYRxA71RiC5cnvlVAxQBR+I1lDf6j4NaSeR FTWEZTFJtDfupCPr0H5muW8OQ3GneLl1K3vrphf6zqNtLaFsw7FV3XC9juTOfc16MvhzT5NG07Tb 2BbmGxaOSHeT8rp91hznirEeiabFNFLHaRrJHcSXSMM/LK4Id/qdx/OgR414Pu/Fl1Zandm5WB9Q 0yW4D3GoK4M24bXVMDygBlfQcd6We+1FfCkOiadHqguG1ZbS7t7i/UOoMJk2pcYPysQMHr2r1Oy8 K+GrHUtQa106zjvdQiP2lerSRk88E8Lk9sDNEXgvw7F4fk0RNKhGlu/mNBljlv727Oc++aQzi72X U5/hjoUOrak9rczanBazXMFyrMIjOVx5g4J24BPrVazhuNQuPDmlNqd+1naXmoxrJHN891HAR5YZ v4h/PFdb4o8MaTP4ZstDiSytdKs54J5Ld22oIFfJHqM88+vet3TvD+ladDp0djZRQpp6NHahc/ul b7wHPf3piPH/AO0L610eC5h1q8mm17TzNf7pQ32RzLEhdBj5MLI6/wDAfatXwuY9F1aC1g1KWazH iSeFpppgxdfseQrN3wcflXoUHhDQLf8AtTytKtl/tQFbwYP70HqDzwOTwMVWTwT4WGjy6EmlWv2A yLcPbBj9/s/XIPy9c9qAPPYrqXWdE0mG98Q3Gl2sWn3OoJepKAGlS4wpb+8qrzt75qSfTrv7H4zf R7qSW5u9ZhE8ZuvIMkfkxsRGx+4zbvyGK9Cu/BPhu80/TrG50e2ks9OYvaRHO2Inrjnp7HipNR8N +H7uW+hvrK2aTVtpuEZiDP5Y4IGeqjuKBnMJq9v/AMKglujc6vHFGDbk5U3QIl8vy93QnPy7vTmu S8IQXuqX2l6TeXuo2lvBq16GhW8819qQwusbSDqNzEke5FevP4e0l/Dx0NrGI6UY/KNtzt2+mevv nrUGjeFND0ZoG0vTYbZoCxjKk5UsoVjyepAAJ9qBHnPhy+8Q3fxJe8cslm2oXFo/mXy7WhQMFRYM ZDAgNnOT9K9jrAg8O6B/wlEusRWVqdcRdskwOXUMOpGcAkDrjPFb9ABRRRQBBfpLJZXCW0ohnaNh HIV3bGxw2O+DzivA7fWtU8H/AA60T7FrFtHdNbyXrwQ6eZJLk+Ycl8HCqBjLnv8ASvoNhkEevFcD qXwysL62srddS1G2hgszYyrC4X7RCWLBXOOxJPFADNS8VX1neXmnFk+2tewvbnbz9laPzHOO+0Ry rn1xXOXniXxcn9iWy6lZLceI2imtZPs3FnGxG5CM/PgMpB45Br0pvDljJrtlq8waS9tbRrNGPQox BJI9eP1NYem/DuwsryC4a/v7n7LOklqk8gYW6ISREnH3cn9BSGc5q/jXWrPx6umWy3Nza2UlvbXE cVgzicuFLuZBwm0MCB9am8F3eran48sNV1O6hmtb3TLqW0iSLa1unnxAIT/FwFOfXNdXqXg+G98S Rasmo6hbLvSS4tIZdsNyyfdLjrxx9cCofDnge10LxDNqsN/ezkxyQw28zgx28buHKoOw3D9aBHKG +1PSfiRrt/FcxLo7anaWdxbmLLSGSBAHDdtpK8dxmtjw34rvNQ8WnRp5UVrSS7+0lk2l0Vk8k4/h yr599pqxceDbebxXJ4i+2XrKbtJ5LEN+5d40EauV9VAzT/Cem/bfF/iLxDdaV9ia5EVlEZCGadIt x8zg8A7gAOvy0wOU8M3+r6bqU8cl3A+k6he6mIbdYsPG8TNJuLdwcMCPpVyz1bxbdaNocA1e0TVN QtH1Rp/suVSNVj2whc8klxlvrW/pHw7sNN1y81FL2+lFwJ9lvJJmKBpjl2QdielP1XwZb6jZaVp8 F/fWLaTAIY7q2cLIyFQrIT6ELzQBw+v+NNTe50C+j1KJFuorSZ9JjtjLhZXCs0knRByQD3rR8I/2 hqvjrTtT1KeF7S80+7ls4oo9j2yiaMBSc/Nxg59c10Op/DiwvL+KeDUL+0t1hghe0hcCOXyDmItx k7fSrfh7wPa6J4il1aK/vZyUliht5XBjt0kcOyoOw3DNF2Bl6X4m1WS+0uCUpJ5+o6hbHC48xIRJ sHscqK5q08capF4Z1vUL+4WfVYBEY7KSyaOayeSTYBs/5aKM8MOuPeuyTwBZW/ic63De3p2Sy3EV kZP3Ecki7ZGA65bOaLHwHZm01H7VqOoXj30SxRzTSAyWsatvRI2x/C2CCc9KAOVtvFXie/8ADdnb Wk5t9Vm1dLBL28sjF5kJjZzJ5R7jGPqK1dA17VB8QrjStSvhBHveKKzntSn2gKoPnRy9GJ6lewPt W3oXhGKHTrAXmo3t/d2979ua6uH3PI4VkAPYKAeg9Ksr4Sh/4StdalvryZIy0kFlI4MMMrLtaRR1 BIJ745NAHKX/AIr1K3+KFlpkWqRXFnLd/ZZbKK0JWFTEWBeboHJGdvpVbw74t8Q21lLqGuXNteW9 zpd1qMEcUWwwGB8bSf4twZT7EGuoPgK1PiltZGpX4X7WL5bPePJWfbsL4xkkrke2auWfgzT7a3s4 C8skVtZz2QVj96OVgWz78UDOa8D/ANr2mr+K5tav7S41AWVpMLgR+XGB5chG4egOefQVzeleM/Ed +LqxsdZhuppbuzjt7+SwMSBZi4bapPzqNvDd69A8OeBbXRrPVrebUL/UP7ShW3mkunDNsVSgAPsr Yqponw5tdNlgll1XUL2aKSBw9w4JxCT5ajA4ADEYpAc+njXW1+ISaXGLm5sre6j0+dUsCUclFLzG UcLhj930rW8beMLzw3rT2u5SksltLFuiyBDlhNyO/wAo/wC+hW7P4Phk8UJrCajqEMXmCeWwjlxB LKF2h2HrgD64qbxN4UsvEFxDPdSSxyR209qCh6rKoBP1GMj0piOSbxXdwrNqjpG4/si9voN0QDhR OoiXPptIJ9aw5NY1zwpB4rm1C7S91ia4sLdbm3tc48yPG7yweSvzcd8CvSpPCdhKI0fzDEmmtpew nrE23J+vyisjTvh5a2mlajazatqd1c3rxSm9llHnRyRACNlOOCMD8qAOb0DV9V12+8PTXazR6jFH qVvFNPbGEy4SLZJ5Z6ZyOPY1teE/Ft9ruk6vqB2xraWERCbfu3Hls0mT7HAx/jWpZ+GodBt7O9a5 v9TvLBbhw8zhpLh5duc9s/KAB0FU/h9p8djoeoDUtNOmyateT3k1pJghBIcbSRxnaB+dGoGRqviz XI9KL2amWdtFs7s+TB5jo8sm2SQJ/Fgc7fauXuviLrUc1vDpV62qPbwC4mktdNdzdtvZPLdf+WRw vPXmu3074fW2mwXcdprWqPNdwJbQTNNlrWONiyCM9gufxp//AArWzS3tlt9X1S3mBY3k8MoV74Ft zCUgdyTyMdTQBh67PqOreM9PuWlgXRrXXYLP7I0X7zzBAWL7s+r4x7VqeMdVudLvPFMmnR2yXNnp ttPBI0fIkaSRfmPccDj61dvPCNtdeLItat7m/KRTpc/ZEkAtzMqFN+O528Z9qvax4fg1KXVJL9Z4 hqFtFaysjZCrGzMCPxY0ahdHPT3msyeE/GGmazewz32nK6reQxbQyvBvXK9sE46+9c2LjX9EuodS s7+2f7BoWnyXqvDg3S73G0c/JwTzzzXq66DaO+tOzO6auAJxnjHl+Xx+FYdv4JtVsLqwur26nMtj FZNNIw3NHGxZTn1+Yg/hQBz95431f/hZL6dZxXMmnQXkdjJAlkzqQyqWkMo4UqW6elVvFlveWvxG 1bVJJrW4jis9PjghltgxiEl0VOGz7MfxHpXV3nhuCfxOurWd9qW3zBNLZRS7baaVV2q7e+AM49Oa vX/hu21i6u7m7eSOeVLeKRUPA8mUyrj6lqLMLo8t8ceNdWvLnxNYJFcS6WpuLBolsm2IFU/vTN0+ 8MY9DW94ju9V1DxJYKl1Aui6fq9hatbGL53kKhy4fPGNyjH1rpNW+H1pqWoX00mp6lHZ3gkaSxSX EPmuu0yY9cfhnmptQ8CWl74lttXN/fRiKSGdrRHAhkliGFdh644/CgZleDPEmp6h401Kx1W7WAgy +Xpk1sY3jRHwJI5OkqkdfTNFlr+tza7BeSXcH9jX9/PpkFqIfnhaPzAshbPOTGcj0xW/pnhKCy8S zavJfXl0cOLa3ncNHabyC/l9+cdzTLPwZaWviZtXW8vHjEjzx2TOPIilcEPIq46nJ/M0CPPbHSr+ 2+BPiXF/CL+4kvJZLlbcKXAlYMGGeScNz2z7VMninVtG8VWGg6fFLLY6c1rZzw22nExy71UvJvHE e3dkD616KPC9oPCt3oPmS/ZbkTBnz8w8xmY4/FjVW+8Gw3PiGDVI9S1C3QMjz2kMu2G5ZAAhcdeM D64FAHBQ/EfWBrerTmG4m0yMXapH9iZY4TDuCP53RtxUgjtkV0nw2i1SHxJ4lGvXcN5fGOzZpoov LBBjYgY9uRWmngW0GrXlzJqGoSWNwkoGnNL/AKPG0ud7Kvqcn6ZNQ6R4Ll0HT9QXT9X1C5v7x7ct c3MgZwsZAAzjptyKAKHxK1vXbO7uIvD13BanT9NfUp/Oh3+cN20IOeOjHP0qnca7rq2HiTUp9csr Cxt7wWVt5lsXMf3MtxyzHdgLTPjFoOq61dWsWkWN65nt2tXuLadUTDMPlmB5KDG7jnORXT3/AILt b3Q7ywF3c28lxeLfi4hI3xTAqQVzxwVFIZxmieLtUu9L025umSa6jGqJ50tt5Uh8lMoSh+4T3FdF 8O9V124vJbLxFdW15JJY2+oxSwx+XsEuQYyO+CvX3q5Y+AbG1tkha8vJypumMsz7ndrhQJCT3OQT +NWp/DP2a3uJNLuZ4r06fFp8UgIBURklW+vzHNMRjfEvT57/AMR+C1FxEtkmoPJNBJCJBIVidgeT xwrAe5B7Vl23jDW7CwbVdTnt7q21LTZtRsoEi2G3KbcIxz8wIcEn1zXoWoaTFf3el3M7sJLCUzIB 0YmNkOfbDGsHTPAGnWT34lur27triB7WK3nkBS2hc5ZI+OMkD8hSGYM+teJLCO70K61K2l1mS4tI 7e/W2wsazls5TPO3y3xzzkVufCpLmLwxMl86SXa6heCV41wrN575IHbPWmxeALddEvLOXVtTmvbi WOYajJIDPE0Z/d7TjA2/1PrV3QvDT+H4NLs7C9uZLWCeea4MzgtOZAx+b1+ds0xHHfEHUdfv7HxS 9jNa/wBiWSS2FxayJh3zAGMob1BZQF7jNNn8V6/4e8Pa1balPDeajavZpb3Fvbk4Fxxjyx94oQce vFdJ4h+Hlhrur3N5c318kFwuXs45MQmXYUEuP7wU4/CtK+8I2V5/aZea4jkvkgHmRthomhzsdD2I JzQB58PFniq+0XTo7a5NndebeCW6urExtPFDEJFYRk8E52n8au2viLW5fD2svq0tpdSr/Z11Cohw sa3DrmMj+Lb2NdVZ+B7eK0to7rUb+9niFxvuLh9zymZNjE/QAYA9Kl/4Qux+xXNt502yeK0iY55A tyCn545oGZlpqniG88RX15b3FkNCguJ7FreVdrI0a583d3+YEEenNcPF4n1DW9J8Q2V9qS6pbRfY LiK4W0MCZe5AITP31+UYavRpPAllL4lutVlvL1oZw7fYfMxAkjpseQD+8V4/E1R0r4a2djaXEM2q 6jeGaKGDfcOCUjhkDxouBwAcj3zQBD8QNc1DSdR1VtM+zrcw6Os0MkkeSHM4Xk/3eelVDrXiSCyu tEm1C2bW11WGwj1EQfJskjE24x56hcr19K63X/CtprdxczXMsqNPaCzYIeiiQSZ+uRUGs+D7bU01 Mi7urW4vbiG6WeBgHgkjVVVk/Bf1NAjz3wrr+r6V4V1+IywmewBmDKnBle8mVz9DjgVZ8aeItXfV vE2lS3y6fB9jnhtbae1O24XyC3mxy9C2c/J7VtS/CjTWtbaCPU9TiRFK3G2Xm7HmmVfM9cOSfxNb OreCLTVdalvL2+vZLSRW/wBALgwpIUKGRR1DYJ745oGc7pFx4oknjsLTVIPK0/Q4J2H2YFp5nSQL jngDaPyrf+HviS48Tpe3rYW0VLdI0A+7IYg0gJ9QzYx2xVvStCXw3bz3kD3epXSWMVttdhvmEW8q Ow3HcR+VZPgnQLzT/D9kYYG0qa51OXUrq0VgdiyMx8pjznAK9PSgRQ8T3L2fi3WZokjZzFpUeJF3 DDXTA8evPHvUTa5r1x4o3Pd250G7ur6xFp5WJE8iJ/m355yyE49MV1+q+FrTUr66uppZVe4FsGCn geRIZFx9Sea4e08NapcfFRrqSyvbbS4ZLmdmedWt2MsRj3RKOQ7Zy2eBg4oA5hJvEf8Awg9jo9xq dsFls9NvbSWOD/UKbhI/LIz838LZ9iK9L8bapc6XqlkYBCZF02/nEjJkh440Ix6DPUU+98BWNzps Vot3dQmKwisI5Y2w6CORZEcf7QZRWtrfh231eWGS5llDRWs9qCp6rKoViffigZ57Z+IPFu6HRbnU rM6rqH2Sa3vVt/lhSVJHdCmeceUQDnndTvB+salpvhqG2Dxb4tH1G9YheDOlwQCPbk8V1uqeBrS+ jJjvby0uVhtooriBgHi8kttZT6kOwNZ978MtPuNC0/TYdS1G2+yRTW7XEMuJJ4ZSWeNz3BJz+FAG bL4q1YeLNEguLxbCyngtioltS0V68o+YCUfcYHoves3wfL4jhsPDOl2mrQqL291CWeV7fJEUcudg GepJbn/a9q7a88FW11qGmTvf3q2lmsW6yDjyZ2ix5bsD3BAPGOgqbR/CFrpd5bXEd1dS/ZprqaFJ WBCCcgsg9gRkfU0CMnwd4l1DVfET6XdsofT47hbvC/ekE22M+2UGffPtVL4hwzp488M6i88TWNja 3t0bZ4Q5LxopyCTweRg9se9WND0a/ub7xLrKWUui32o3cCICyl2jhwC7EZGG+bj0rrdR0W21HUrO 8uNxa2imhCfwssoAbP4LQB5No/jvxPfaBqkq+YLl0tZrW5uLBoY4WlnRGi5++AGBB71oWP8Aa2la /r7X+oQ6gzarpdud1sFG4iMM4GTg4PHoa6mw8AW1ta3VvPqup3kUjw+SLiXd9njikDrGntlRz1q/ d+ELW51m7v2urkfaZra4eEN8gkgYFWA9SAAfYUhnBeFdRmtvDeoRxX1vpa2ulpcC9aESGP8A0ifd kZG4YXAHqaq3/jLxZp3hzw9DeySLrF7HPeyPDp5mbylYeUjRg/KSGGT2rr9S+GenXujzaet9ewLI kK+ZGwDDypWlX/x5z+Qqze+BXvNIs7aXxFrAv7YyAaisgWZ0cjcjEDBHA/KmBX8Katrut+KJpJ5k tNMt7O2kksWh/emWWMsQT22kdKvePrvWUn0Ow8PXkNlc39y8TzyxeYFURO/A9flFWZfDn2O11VtI ubiG7vIYYVffkp5a7VIJ9utUviB4fvPEFx4eitbi6tBBdPJJd2rhZIf3LgMCfcgfjQI5M+IbieWH W3vLawvP+EeIkupkLRxuLlUdto5PIOB6kVBbeMvEE3giWZbq4aWPVmspNRGnHzIoQgYSNBnPU4+h zXZ3/wAP9NutMSyWe5hRLBLBHRhuULIsgfn+LcoNNg8Bi20S4srbXdWiup7n7W1+so8/zSoVjnGC CB0xSA4u91K/e91vWk1Czvbc+HrVtiw7opWMrgOM9BwTjHfHauyg1HxBfeL55bGa1/sOzvf7PntZ FxI37pXMof1BZQF7jNPf4e6b5BgguLqG3bTxp8kSMNsgD7w5/wBrJb/vo1YufBltL4rGuG9vAAwm +wq+IDOEKCUj+8F4pgVfifrGpaRpdk2mSS2qTT7Li+jtTc/ZkCk5KDsSME9q5Rte1DTL/wAUeJVv oL2BdEsZI4oIyUkkYuFdT1xnJxjvjtXc3vhy71Tw1Y2Vzq9/aajAqlr22cCQnGGB4wcjrxUMPgTT IRLFFJcJZy6emnyWwbCMqElZPZxuPPvQBwg8fa9B4TuftH2w3rX8VpBetpjIzK6FmYQ/xFdrD8q2 fDmrXutar4Lu9UglivANQiYywmEyBQoD7DyMjBrdi8CoNEuLK51vVrm8knFymoSy5nidRhdpxgAD PbnJrQ0rwrBYNpEj3l3dXGnibE1w+55mlxuZz68UDORu/FepQfFGy0yPVIrizlujay2cVoSsI8ss C83Tfxnb6VU8O+L/ABDa6fNf65cW15Bc6RPqdukUWwwmJwoU8/MCGU57EGupHgK1HihtZXUr8D7X 9uSz3jyVmK7WfGOSVyOfWrdn4M0+2t7SAtLJDb2EunbWP3o5CpbPv8opAYnw1h1WDxN4nXXryG9v THZMZoovLBBjc4x7HI969CrmPBfhGLwu19Iuo32oXF55Ykmu3DNiNSqgewBx+FdPTEFFFFABXEa9 8RdGtPD2s6hpl5FdyaYyLKgBON0gTI45HJ5HGRXYahC9xY3EMTbXkjZFb0JGAa8WnsdQvdAmSLQb y3fSNISxnRogDdSrLEx8v++MRsc/7VAHfaT450+48V32h3d1FHdeci2cZBBkRoUfk9ASS2AfSrr+ N/DyNqatqkIOmjdcnnCDOCR6gE4OM4Ncpc6ZPc6rd3qadMDL4gsLlHaLDCIRRZP0HzA+nNcPa+Fr 6OC9sp7bxDdXtnBJGwnANr886HEXGW3Abu+MHNAz2n/hILa4/se5s7uL7Fe+aw3owaVVQt8vHGMZ 57VHovjXw/rVlfXem6nFNb2SeZO+CoRMbt3PUYB5HpVPxlZTS6voBtbd2jhF2GMa8Jm3cD6ZJArh 59CvU0WO3tdNlWVvC9vE0ax7dzpJuaM/7WMjHvQI6/wt43sNSbUZVuEbS0vYrS0nCkF3kRTtYHkH cxFaGr+JdE0q0lv5dQW3RLlrV8IzbpV6rtHPHqK4KOafUdL1/V7TQ7yGJNas74WLQ7ZpIo1iDlU9 eDx7VUnhupvD7am+n69Y3Mer3dxbfZYQ80Sy52iSM/eVgBmgDtNN+JGkSz+IDf3Mdva6XcRQeaAW Vw6KQc45yxIGPSr0Hi3TraPV9Qv9QgTT4mhaPCMHAeMFQRjJJ6gDmuE0XTdUdZ7PVNJYXP8Aa+m3 UzRw/uXULGHxjj5SpyO1P8ZaNf3Gq63dxx6nFbW2qW05fT1/fNGLcqTGCOdpYZH1p9wPRL/xnoFh Z6fd3OpRC3vz/o7qCwb3OOgHcnpXQoQVBBBB6EV4df6Rdaf4X0G50q18RRak8c6QmSJZyxkk37Ll OgVjznjFeyaPcvc2f72F4ZYmMLhl2gsvBK+q56GkBeqvZcQsvZHZR9AasVXs+Y5COhkYj86ACy4W UdhIwHtzViqUcht5JEnUorSFlfsc/wAqu5BHWmwCiiikAUUUUAFFFFABRRRQBBdKzKrINzIwYL60 sUkdxHkYYdww6H0IqY1WuLfLGWJvLlA69j7GgB0VrFDKzxrtJGCAeKSYGaUQgkIBufHcdhUkD+ZB G7DBZQcVHZ/Mjyf89GJ/DoP0FAidVVVAUAAdAKUgEYxxRRQMrIPIlCDPlyH5R/dPp9KfPbxTbfNU NtNJeKTAxH3k+dfqKkLgx715BGRQA2V47eIcYUcBVHX2Aptqjje8gAaQ7tvpxgVHaxmQLcSkNIwB X0QHsKt0CCiiigYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUYoooAKMUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUEUUUAJijB9aWigBCKgizLcPJn5V+Rf6n+n4VLOxSF2HUAkU21ULbxgf3QaAEn to5uWBVx0dThh+NLBD5SkbizE5LHqalqtfSMkICnBZgue4zR5CEtSTLcAEbBJxj6DP605cx3bqek gDD6jg/0qWONY0CqMAcVFermAyZIaP51I9afUCcfWlFIpyoPtRmkMZcSeVC74yQOB6ntSQJ5MCIf 4RyajkO+7jRvuhd+PU0t9xayAdxj8zigRK22RcHDKfxBqsqG2mjVGzC527T/AAnGePakksoo1Zod 8JAziNsA/WobFnlumErswiHy596dgNOig0wOSxHHFIY+iignAoAKKzLG5le62O2VZS2COhrTotYA ooooAKbIcRsfY06myfdb6GgCG1P+gwnH/LNePwpbH/j0h/3B/Kiz/wCPKD/rmv8AKksP+PSL2GKb AsUUUUgGuMowJwMGorPmziB/uAfpT5ziGQ/7JpkAxaRgdox/KjoAlgc2sfsMfgOKsVBZf8esP/XN f5VPQwCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooA//ZDQplbmRzdHJlYW0NCmVuZG9iag0KMTcgMCBvYmoNCjw8L1hPYmplY3Q8PC9GWFgx IDE2IDAgUiA+Pi9Gb250PDwvRlhGMSA2IDAgUiA+Pi9FeHRHU3RhdGU8PC9GWEUxIDE4IDAgUiA+ Pj4+DQplbmRvYmoNCjE4IDAgb2JqDQo8PC9CTS9Ob3JtYWwvU01hc2svTm9uZS9DQSAxL2NhIDEv QUlTIGZhbHNlPj4NCmVuZG9iag0KMTkgMCBvYmoNCjw8L0xlbmd0aCA3MjgvRmlsdGVyL0ZsYXRl RGVjb2RlPj5zdHJlYW0NCnicdVVdb1MxDC3fcEEwBOLZj+2kZXbi5Cav+0KaBNK2SkyaeEClg6J2 07pp/H2c3PXGHdqtpuUc2Y597CRXgOAZoaVkkoct78r/5bT5tgkXzfbe9HY2mR5/3oHJNVD5XU8u xOkvOONthC+rABbFWxbier75nyPKLztaOJS/P+BNBDbBIzIsGiuovUPzpqXW0BpmwXwPexcM+97c O9fBHKsHvoBQQY2yhuB3s4XGrmwXGVEbybaFkoV4ZI5stF442TLEjkP0yKlwnnJkMWMXnC1U5I5y jjqraMh3lPfMIRaKXSpUJOwcowkpCEUGk49UmESpMIw+OsidEuvCtC5QKoz1nQYYLfrCSCaFYRdd Z8M29jqldQ0V5GCVdWYiRRWxJakksNo1M5xYZZaZiKyyz3OGMakKM+M4KBky44PWKjOtD0rQMq/o leoygAbJqd4Upo2qg5nRk1OgGqw7BzY2RrYqqDPJWYxqY5n+GKxTybksQ/SqAGsSVyYXaU0IGLQQ 0hhkTkosaygSKT3JpORaJTmJCB5JtSWPQGtV58gE2cH2raW+yNx3jbq5qPar2elDrsar7roawT6x 1ZT2qfeTXMvr571q0J+KKlR/dqqa9YhVzetRrJ2pR7b2rxzq2mB9xufNub6ldk/KHYVwsvsVriB4 yvdgJjjKVQR5hjzIYEsoB5MFbB+cnhLsXcJRc9XsjO/deNjfeGJ3QOKOMD4HKaUL2i/GC4iiHCG2 DsZ7Z8PBo5Gk2eaPhoPHoy2SUgnjcPBklKuWzw8HT7XRhwycfMzDwRuxYvm8eLxU61fa6PkDYd8r h7Ut3mrwuvPAeG+7TyrqxkORtMM75fBCrdccnj2Qq65hTYG1XD9qsDH6Pj5s9sfN0YOtzw/U2XcB P8s7hSapp277eDr/cTO7ne5ezi+Xs8X0ZjmbwHImD9wsN3qf4Nc1MOfmylGRYZO3LfkK581J8w/o OnkXDQplbmRzdHJlYW0NCmVuZG9iag0KMjAgMCBvYmoNCjw8L1R5cGUvUGFnZS9QYXJlbnQgMiAw IFIgL01lZGlhQm94WyAwIDAgNzIwIDU0MF0vUmVzb3VyY2VzIDIyIDAgUiAvQ29udGVudHMgMjQg MCBSID4+DQplbmRvYmoNCjIxIDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9X aWR0aCA2MzgvSGVpZ2h0IDQ2NC9Db2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50 IDgvRmlsdGVyL0RDVERlY29kZS9MZW5ndGggNDk4OTYvSW50ZXJwb2xhdGUgdHJ1ZT4+c3RyZWFt DQr/2P/gABBKRklGAAEBAAABAAEAAP/bAEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4PDBAXFBgY FxQWFhodJR8aGyMcFhYgLCAjJicpKikZHy0wLSgwJSgpKP/bAEMBBwcHCggKEwoKEygaFhooKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKP/AABEIAdACfgMB IgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUE BAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1 Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOk paanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAf AQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQF ITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdI SUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1 tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AOk+ J9tPd/EnUbe1ieaeQxBI0GSx8lOlY3/CJ+If+gLff9+zWp8V/EbeEfiHqmvx24umsPKlELNtD5iR ev8AwLNc2f2qdQDqjeFYgzYwDckZz07V9DVzCeFp0oRSd4pngU8BHFVKkpO1pMv/APCJ+Ic/8gW+ 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 L0ZYWDEgMjEgMCBSID4+Pj4NCmVuZG9iag0KMjMgMCBvYmoNCjw8L0JNL05vcm1hbC9TTWFzay9O b25lL0NBIDEvY2EgMS9BSVMgZmFsc2U+Pg0KZW5kb2JqDQoyNCAwIG9iag0KPDwvTGVuZ3RoIDQx NS9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQ0KeJx1k99LwzAQx+ePFyOoD/54vcdtsCxpck37 6n4IAwVdQUH2ILXTyrqxbui/76Vbu3RiQul90vveXZLrEgSgFmBkyEOEDqrinSfsuQ1z1u0n32mc PN3dQrwCWcxVPCfRDyiOXgD3ZQBPkJoMkk7bf4SCphV6MKLnC5AHoLmPQmjImEdktjRjRhoua6yJ 9R6j8rnGyh2V2qCNVQEW4O9gF6VG8Mk6gnulb7aNEtYzlOiJWv4C9V75smIbakdFGl3HKtSULdlt tHd4ojo8Z7033q6Pew/QHb4MJShfQDQFwQVuvpVGlIGPGkKjFET912bjoEVpjR2y2ThsdSSXUoqg 2ThqCWtKic3Gset04zhdkJOmgWRfOfaJFSgaWu+pXS9Xfek61eDMhXMn+bVjH/+rqJXiZjzdbFAE 2lY1iUZsELFH9t/B2m59nRC8F00reOj0ffcpmb2t0++kt5gt8jRL1nkaQ55St6f2SgYSPlagPG5A B5qumbqKWqWkGRsz+xstwfeosYqcGg03CIq2iCB9riDObKgXCf0FPLJfv1u/qw0KZW5kc3RyZWFt DQplbmRvYmoNCjI1IDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSIC9NZWRpYUJveFsg MCAwIDcyMCA1NDBdL1Jlc291cmNlcyAyNyAwIFIgL0NvbnRlbnRzIDI5IDAgUiA+Pg0KZW5kb2Jq DQoyNiAwIG9iag0KPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggNTAyL0hlaWdo dCA0ODEvQ29sb3JTcGFjZS9EZXZpY2VSR0IvQml0c1BlckNvbXBvbmVudCA4L0ZpbHRlci9EQ1RE ZWNvZGUvTGVuZ3RoIDQ3NDg2L0ludGVycG9sYXRlIHRydWU+PnN0cmVhbQ0K/9j/4AAQSkZJRgAB AQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYW ICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAHhAfYDASIAAhEBAxEB/8QAHwAA AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpT VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5 usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAA AAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEI FEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVm Z2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6pooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAyfEmsf2JZxT+R5/mS+Xt37cfKzZ6H+7+tcYfihiMN/ZHUZ/wCPn/7Ctz4l8aHbn0nJ /wDIUleMSnEAHsKmTsI76X4veWSP7Ez/ANvf/wBhVWX40iJwDoBweh+2f/YV5ldH52qqih54c/3x UOTA9Vm+NTJs8vw4zhm2E/bMANjgfcPWiX417GwPD5I9TeY/9p15j4lUf2Sybtm+U/N0x8vX9a4i LTZyP3WqFh/v5zWkdUS5M+gx8bQf+YBz/wBfv/2unD41gnnQMf8Ab5/9rrwm3s7yLnzt341bjjuF 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 8Dfh2VwfD3H/AF/XP/xynn4JfD0xrH/wj/yLyB9tuOP/ACJXFV5WkoaWNlUvJynqz588G3TN4Cji jiEjCV4wM7cc568jpXMXICzuPQ19daZ8KvBumQyQ2OkNFFIdzJ9snYE+uC5qF/hD4Hdy7aJlj1P2 uf8A+LrFxZPMj5V1VzNpWl+QwQorKcDjAJP9aqxJIJlZwslvjorHexx2H196+uY/hT4LjtjAujfu ic4N1OefqXzTJPhJ4IkVVbQ1wpyMXMw/9n5pez1HznyABK0YUgvJu+UDqal1Xwe0kBniVZcjO5Dt cfUd6+uF+EPgZZo5RomHjOVP2ufA4x034q8nw18Jou1dKwvp9pm/+LpKnJap2ZrCvyaWun3PhCTw 9OqvnzSRx/qjmrOmO3h64inVJFmwcNnBBOBn8s/nX3G/wy8IupVtJJB9bqb/AOLqhL8G/AcrFpNB DEjac3c/T/vv2reE5qSlN3sKc6UlaMeX8T4qt7mS3na6ji34yrDHZuuD2P8AjU76rE8kklzZhmMP lqpT5U68jjofT619lv8ABbwA/wB7QSf+324/+OUz/hSPw9/6F8/+Btx/8crariXUlz8qv6sqEqUY cjk7ei/zPia/v4ZrSGCGFItiqpx1OO545rPUXDkmCTaM9M191H4J/D4jDeHgw/2ry4P85KhPwK+H B/5lwfhe3A/9qVk53jy2MZ8ifutv5W/VnxajIODgn60OglnjVewyOa+0h8CvhyOnh3/yeuf/AI5U n/CkPh5/0L+Ppe3H/wAcrLlFznS/DUY+HXhUemlWo/8AIK10dVtMsbfTNNtLCxj8q0tYkghTcW2o oCqMkknAA5PNWasgKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9kNCmVuZHN0 cmVhbQ0KZW5kb2JqDQoyNyAwIG9iag0KPDwvRm9udDw8L0ZYRjEgNiAwIFIgPj4vRXh0R1N0YXRl PDwvRlhFMSAyOCAwIFIgPj4vWE9iamVjdDw8L0ZYWDEgMjYgMCBSID4+Pj4NCmVuZG9iag0KMjgg MCBvYmoNCjw8L0JNL05vcm1hbC9TTWFzay9Ob25lL0NBIDEvY2EgMS9BSVMgZmFsc2U+Pg0KZW5k b2JqDQoyOSAwIG9iag0KPDwvTGVuZ3RoIDQwOC9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQ0K eJx1k99LwzAQx+sv1CAqiOLjPXaDZUmT64/XbSoMFHQFBfFBaqeVdWPdmP++l26r6WQJpfdJ7nuX H5cpCEAtIJARjxBaqMp/kbLnJoxZu5cusiR9uutAMgNZ9lkyJtEPKI5eCPfrAJ4gNRkkHTb/CQV1 I/SgT983IA9Bcx+F0JAzjyhY0YgFMuCyxppYbzAqn2us3FGpJZpYFWAJ/h/8RakRfLGW4B6Y7ZNv zmg7ZdBolaNEWYlL5w2snIdsyjrxxhGI6gis8e5gNT7oPkD79uVWgvIFxEMQXOBybm3EOfioIQqU grj36jo7DUobmCZdZ7fRklxKKULX2WsIY0qJrrNvOx1YTqf2xJU1UVNcGFDUtHadc4qrqWFYtw+3 qe18J5bgyLKvLbu2pjNLvHV9l9vUx/WFv8V9dhOzR7bt8E1dvr4RfJTlKXhkVXj7KR29z7NF2p2M JkWWp/MiS6DIqK4zc203Ej5noDwegA41lQJVtA4qGrEBMw9mCugbNjm1F3GJEHIErc2LS3IT6UVC bwKP7BdhD7nsDQplbmRzdHJlYW0NCmVuZG9iag0KMzAgMCBvYmoNCjw8L1R5cGUvUGFnZS9QYXJl bnQgMiAwIFIgL01lZGlhQm94WyAwIDAgNzIwIDU0MF0vUmVzb3VyY2VzIDMyIDAgUiAvQ29udGVu dHMgMzQgMCBSID4+DQplbmRvYmoNCjMxIDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9J bWFnZS9XaWR0aCA2ODkvSGVpZ2h0IDQzMi9Db2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29t cG9uZW50IDgvRmlsdGVyL0RDVERlY29kZS9MZW5ndGggNTAwMjcvSW50ZXJwb2xhdGUgdHJ1ZT4+ c3RyZWFtDQr/2P/gABBKRklGAAEBAAABAAEAAP/bAEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4P DBAXFBgYFxQWFhodJR8aGyMcFhYgLCAjJicpKikZHy0wLSgwJSgpKP/bAEMBBwcHCggKEwoKEyga FhooKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKP/AABEI AbACsQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMD AgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUm JygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaX mJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4 +fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncA AQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6 Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeo qaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhED EQA/APqmiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiqr3e12XZnBx1ppvsf8ALP8A8ep2AuUVR+3/APTP/wAe/wDrUh1D/pl/ 49/9aiwF+iqH9o/9Mv8Ax7/61H9o/wDTL/x7/wCtRZgX6Kz/AO0v+mX/AI9/9ak/tP8A6Y/+Pf8A 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 6XWNWuvs7Rx332SXPyyoqsD7EEHFeYeIbzxE+f8Aior+QE5H7zbGR7bAK63/AIQ7xVIwzomqj/t1 cf0q1ZfDfxOzbotKuYsnLJNEQjfUdvrU27DueSyxzu6rcyyzyMM/vGZs/ia3LHUtXGiSacZ5Rp0c qyxwGQ7N2eSPTvxXuL+ALK00m1kvvD2pT3+f3kdsjsv6Dp9azofh/O95J5fh67tLQhZETYxBJ+8j rj/OetQ2xHlUWhz3vkXX2cyNE42Eg5B6/wBK2HgvLQAXttNBu6M6EA/Q16haeH/EKagp0fTBYRqp G2W0l25HGcn9BXWS6Lql3aeVeJM+QNy/Z2Kk+wNXGUhOx4Pd6Tcalot2sEe8BCwbdjleR/KneDPK v7CGKxkebYNpyuCvfH0GcZ9q9sfw5cIpEWn3A7YEBx/Ko7fw/d2pZrfTJkz1225XI/KtOtwRyNp4 cJIaeVNnop5rTTw5YEYPmscdCa6M6XfNj/iW3akdxC3+FOGl34GTYXTH/ri4P8qYz0bw/GsOg6bE n3UtolH0CCr9VdJVk0qzR1ZWWFAVYYIO0cGrVZEhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/2Q0KZW5kc3RyZWFt DQplbmRvYmoNCjMyIDAgb2JqDQo8PC9Gb250PDwvRlhGMSA2IDAgUiA+Pi9FeHRHU3RhdGU8PC9G WEUxIDMzIDAgUiA+Pi9YT2JqZWN0PDwvRlhYMSAzMSAwIFIgPj4+Pg0KZW5kb2JqDQozMyAwIG9i ag0KPDwvQk0vTm9ybWFsL1NNYXNrL05vbmUvQ0EgMS9jYSAxL0FJUyBmYWxzZT4+DQplbmRvYmoN CjM0IDAgb2JqDQo8PC9MZW5ndGggNzE3L0ZpbHRlci9GbGF0ZURlY29kZT4+c3RyZWFtDQp4nHVV WWsbMRB2L2iW0hZ60L7p0QlE0UgzOl5zFQItJDE0EPJQXKd1sWPihPTvd6TNrmZTosVY37dzz2h1 rYwiNCpA0onUNrnyv54137fUVbOzP7ubT2cnX3bV9EZBeW6mV6z0VzlNNqqvnQFrWJs3rHq59Z+i 4ScrWnXEvz+KdFSoPRmDatlYRuEeLZoAQcMAI2N8gMl5jdSLk3MtzLZ6QAX4CqqVAVK/m22jbSe7 zAhCBBsKxRvWyBzYaIk5duljyxlDBlPhCLJlFkPnnS1UxJZyDlqpqIFaigjRx0KhS4WKYFrFqH3y TIE2iSIUJkEqDBqKTuVOsXRhgvOQCmOprYGJ1lBhOJLCoIuulUEb+zqlYQ0FRG+FdGYiRGExAGfi UXjNDCYUkWUmGhTR5zkzMYkMM+PQizJkhrysVWYCeVHQMq+GRNV5ALUBJ3pTmBBFBzMjJ6dAMVj3 CqhtjGiFUaeTsyYKxzz90VsngnO5DJFEAlYnrExO0mrvjZeF4MYYxCSKZTVEAFFP0Cm5IEoOXAQy INqSRyBY0TnQnj3YvrXQJ5n7LlE7F1W+m53eZDde1Ws3gn1g3ZT2ofeTXNPr573WoD8VtVD92anV rEes1rwexdqZemRr/8qhrg2WZ3zRXDbXze7kwafK9J8qwe+d3vOne9/UzuHZISjnjZpcKo6N2nfd ZrJUwQeVUhbYPx+Pnmyy25AXjEdPN7eBQwcTx6NnmzkLXjQePZdC7zJwvBDHo7cshbzogcaGFHot 1d9LMHjz+VFrA/8vRJCvhMJLsf8k9gMfb4TyR7EfePjwmPbGMPWLyVFzMGmOm8eake+T8wsGP8u1 YnQSN9POyWzx43Z+N9tbLVbr+XJ2u55P1XrO99E8t/EA1K8bxV8ZRwoT8YDmu4hQ4EVz2uTL7lp5 tF2L0dj8znFuxDdn3k+X2eAZqP2VOm7+AaMgdPMNCmVuZHN0cmVhbQ0KZW5kb2JqDQozNSAwIG9i ag0KPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUiAvTWVkaWFCb3hbIDAgMCA3MjAgNTQwXS9SZXNv dXJjZXMgMzcgMCBSIC9Db250ZW50cyAzOSAwIFIgPj4NCmVuZG9iag0KMzYgMCBvYmoNCjw8L1R5 cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDU0MS9IZWlnaHQgNDcxL0NvbG9yU3BhY2Uv RGV2aWNlUkdCL0JpdHNQZXJDb21wb25lbnQgOC9GaWx0ZXIvRENURGVjb2RlL0xlbmd0aCA2OTYx My9JbnRlcnBvbGF0ZSB0cnVlPj5zdHJlYW0NCv/Y/+AAEEpGSUYAAQEAAAEAAQAA/9sAQwAGBAUG BQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAl KCko/9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo KCgoKCgoKCgoKCgoKCgo/8AAEQgB1wIdAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAAB AgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNC scEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY 2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//E ALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoW JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWG h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp 6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+iPD9pa3cV3Jc20Er+fgNJGGONi8c15t49+KOn+E/Fd9 ov8AwiVpd/Ztn77zlj3bo1f7vlnGN2OvavUPC3/Htef9fB/9ASvlz49tj4r65xn/AFH/AKIjprVm VSTiro7OT466ckbN/wAITaZAJx9qX/41XoXw68X6T418IprlvoNtbfO0UkB2vsdeo3bBnqOcV8kT 58pz/sn+Ve8/svNv+Fd4Dni/l/8AQUoe4UpOSdz0ew8RWF3rEth/wj9omyMuHypzggYxs96o6z4v tNMn8uTwvasvZt6j/wBkrH0Q58aTjPIgf/0Ja2/EumR31oWI+bHUetQ2y7mUfiJYAceFbT/v6v8A 8bqF/iVZAceErQ/9t1/+N1x9zaGCVo36j9arvD7VHNLuNHZv8T7Nf+ZOtf8Av+v/AMbqB/ivZL/z Jtr/AN/1/wDjVcb9nyDxVd7UYzWbnO+5SR2zfFyxH/Mm2v8A4EL/APGqif4w2S/8yXaH/t5X/wCN VwzwjpgVmam0VrA7uAABT559x2R2+q/H3SNM8sXHgq3LP0VLhScev+qp0Xx50tzz4IhX92ZOZ14G Oh/dV4bcsbi6ad3+UDcwHYDtWfFf/vLp2lZF8lmUFM8EVSlN9QaSV2fQ1j8ddKurtIf+ENs13Z5+ 1KegJ6eV7UH466WJ0T/hDbIqwLBhdKcgDP8Azyr5+8PapDPqsUcQmnlEchwqYHEbGtXwz4e8QaxF PFDoGo7CrNFI0DKFJGMAkAd/0rVKVtzJy1se0wfHjTJmKr4Ls920kAXanJAzj/VVA3x+01G/eeCL JF7E3i//ABmvMdF+DvjuS4imOnRwhWBH2m6RABnuASela2p/AbWILK5v77V9PiWJS5jjDyMQOnOA BUWn3Kv5HZSftE6JGMnwZaN/u3Sn/wBo1X/4aQ0lmIi8CW7YBPN2o/8AaNeSt8OLsZ8vUbZvqjD/ ABqCL4f6vBISstnIpBHEhHb3FNX7iue96B8cdO1eGGT/AIQm1h8xgMfaVbGTj/nkK92XT9POf+Jf af8Afpf8K+NPCfh290y2hjuUj3K4ZtsgPfNfX+n+IdHvHSO11K1kkfhUD8k+wNXcC9/Zun/9A+0/ 78r/AIUf2bp//Phaf9+V/wAKtUUDKp07TwP+Qfaf9+l/wrkPHXiHT/CtvPL/AGBaXXlW7T4+WPOM 8fcPp1ruG6V5T8aGjFrMZwDF9ik38duc1MnYa1OCH7QunH/mRbT/AMDF/wDjNKf2hNOH/MiWn/gY v/xmvJI18Oyn5fLU/VhU8FhonnpJDMN6nIBkyD+B60udk6nq0H7QOny3EcX/AAgloN7Bc/bF4z/2 xrqIvitpzqD/AMIjaAnt5y//ABuvnxtGso7pJ4Lhi4cME3AjrXaafaMy7z0ApObvoNXW52HiT476 fotzFF/wg9pP5ils/alXH/kE1kD9pHTz08AWn/gcv/xmvN/G2kyajqkRjkRPLjx8wPPNc0fDF4vK vC34kf0pqYan2b4O8XaH4p0S21Ox0i0WOZfmQhSY3H3lPy9Qa6FZNPP/ADCbT/vhf/ia+S/hDrOo +D9dMN5tOj3hAnAfPlt2kA/Q+30r6ktZFljV0IIIyCKu5N3ck1y7WwmhSz8M218rxLISjRqykk8b dpJ6da5x/G1lCVNz4TSOMsVLYHBHXqgH61V+KEiLqVir2scjGyjIlO8MvzNxkHGPw71ysOp+RgWU +oWhJyyx3O9Pc4IHP1rWKTRhKpJSdmd+fG/hp3gWLS4hvbEhlhVRGMdflDZ5qK58W2Mbj7Nomh3c bMFXyrxVfJ9VaIY+tcI98QMGS3nVmJxc2i5BPJ5GT196pyG3dCstpExOfmhmZf0OR+lHKhOrLuei XPiw2yb5fBCCPpvVldfzWMis2T4j6ehIbwrahh2Mqg/+i64eNIoxmFrmFwcjGMZ/DFPmvb+SPY94 869cS/N/6FmhxF7WXc7h/iVosdo8j+Go/NA4QbNpP128flWcPitYHb/xSFp8ylv9evbP/TP2rjLh 4po2F8scSbTiSGEZLY+UYBAwTjmsIL++tgeMhl/P/wDXU2CVWXRnq0HxQ0+bRdVv18JWm6xRX8vz l/eZ3d/L4+76HrWHZ/G/TrllH/CFWihv+nlT/wC0q5Hw3EZ9C8SRY5a0Q4/4ER/7NXnuiNnySOuV NDQKrKy1PojxX8VNP0DRNC1EeErS4GqIW2eeqeVwDjPlnPX2qp4T+MGn+INctdO/4Q60t/PJUSfa FfBAJ6eUPT1ryn4jataX/hDwvZW3nNc2DMk5MRCKSvADdCeO1UPhc5TxxopJ4+0AH8QR/WovqbOb setL8bdOMsiHwXaAoxU/6SvY4/55V0Hgj4lad4o8T2ej/wDCLWlr9oD/AL3zVfbtUt93yxnp6187 XkZt9a1KFs5S6lX/AMfNdx8FnC/FDQ/dpR/5CersrGSqS5krnd/EH4w6f4P159NPg21vAoz5v2hY /wBPKP8AOs/RvjjZaobVYfAtvumZhgXKttAIBY/uunNcp8WrVJ/H9/HIoZWjXIP1NcLcWN1pUuj2 1pJJ9gkvd0ijocumM+veiFm9S6k5LY90ufjLpMQRY/CdnNNg+YEnXYvoA3lfN+WPrVa9+NVjaxhz 4JtGBbaP9KUds/8APKvCbJ57zVriztRPLOJWVY4k3sfmI6AVr+JNKv8ATbK2/tGWPzJJDiHcpkT5 erBen40nvoJTlbVnsd18aNPgnMZ8F2hwFOftK9wD/wA8veuk8PePrXV/Depay3hG3ghtGCIPMVhK cHOD5YxjHoetfO2rjGoyj0Cj/wAdFelfD9X/AOFUeJ3Z2x9oURjccD5Dn9aUtC4ScmdFJ8ZNJRiv /CI27e4lGP8A0VUR+NGl5wPB9of+3hf/AI1XkolkWMBz5jf3VO0fn1pHnuTjECR46beD+ZrllVlf Q1SPXf8AhcVkOZPBdnGvq90o/Tys0x/jTpYOI/B1q/v56gf+iq8hkCA7pd0jnqFGf1NNi8tpMxWo SQcKW5/+tSVWb6gz2FfjNYlio8FWxYdQJxx/5CpT8ZLFZFVvBlkAep+1Lkfh5VeRXLoxmaSRj+8O duaoAw7ixLlP9psCm6ku5N3Y+kfAvj7TPFmutpsfhm3ttsDTGUsrdCBjGweteiLY2B/5htp/36X/ AArwH9nLyZvFmpmJ0byrLoo6ZkXv+FfRKjAreDbV2CuZGrf2dp1uLiTS7MwKSZnKKPLUAnPTk5wA PevF9Q+N9pAxez8C2tzaNIyQzfalTzdpwxx5RwM5HXnFdL+0xqE1l8Oplt5XjaVwp2nGeQP6mvlK PxBP/Y8GnzZMVqrCAKAMZJJyfqaTb6Duz6f8D/FrS/EurNp114TtNPnK7o/3yyh/Uf6sYNekJc6e 3/MHtP8Avlf/AImvjfTnm07w/FqMMjLdxJ56y9ww5Br6O+GHjG28ZeGIL+Pal2n7q6hB/wBXIBz+ B6j2NOLb3J5mdbq2rWNhCzroNpLgZx8q/wDsprU8Ltp+u6FbaidJtLczb/3WxX27XK9do9PSsHUo RNAQea6PwRD9n8M2kYGMNJ+sjGnd3HFtsd4W/wCPa8/6+D/6AlfLfx6/5KxrnH/PDn/thHX1J4W/ 49rz/r4P/oCV8tfHs4+LGuf9sP8A0RHVrcirsjz9/uMPY17t+y0T/wAK01Nc526hJ+qJXhTHIIr3 b9mhDb+B9ZjJ/wCX4t+ca1LZNF3uiXVvEdp4Y8VwXmoZW0nc28kg/wCWe7ox9gRzXp8ZWaEbSGRh lWByCD3FfPfxz+exKgc+ep/nWz+z741mntz4c1WQv5Cg2kzHkL/zzP07fl6VmbbHeeJtIzmSMfMP 1rj2QgkEYr128hWeE5HNcDr2mmKRpFUgd6TQznJGSKNnkYKijJY8ACojsljDIQykZBHQip7yN3t3 WJQzMNuGbbwevPrVaxtmtNOt7eRt7RIELYxnFQy1H3blS5AjVmPAFcJ4junuJNgb5AMkCur1eVrh zDDkqvUj1rlrrTmEgZwQDxRbQm+pj3emXWpaQUtbm3tmBUFpH25HU4xzWIsNzBqFpFKzAtarvUnI Jzg/XODXV6l4rbRbBYLLRtNNynAnuI2kL+pxnGa6n4D3t74z8cTS61a2DQ2WnyvEwtVjVWYquBgY PU9aqF73Dc98uLSC0sPKtLW1tlDoCI4VXjePQVq5Z2O5ifqa5jw80j+God8krsdQ8vdLndjzhxzW t4hmlsraWe2lZXibgYBVhjoa6OhFtWawQMhVs4IwcHFY3jDH/CNaoB/zwatHSrhrvS7S5kwHliV2 A6ZI5rI8XXEf/CPanHgkmFqlgeKiEZOCeTzzSmBskq5HNW5bhYNOuGUorbTsJAzu7dfxqrBeQtp1 q7XLNetNsliMY27OzAispVeW1+ptSw/tU9UvUekUn9+uj8IP9n1/SpJn+RZVLH0G6uf06+STUZbe 5MSQKSFfZ3zxnnitS2uYmngaEKCJ1j6npR7W7sX9UcYe0bX3nu8nibTEz++Zv91TVK48Z2UQJjhm f8hXn6vzzUVxIBGarmMbHfWni83jlYrTYPVnzXE/GC5a60i7Z1AIsZRgfQ0vh6ceZyQDmq/xOcSa NdjI/wCPGXn8DU3uHofLUIG4cDmtS3QZSVFUNGcgkVmQDJUVtWoxAwxzjrTWpktELZRxPqEMhRfM Mm4kDvmvVNMiZ7QiMFmOPlHJrzuxjTyo32Df645r0rwJ91alK7GrpHOa78OPFviDV1m0m02wLGAW kuVi5yexNPtfgr4/ZcedZxHPV70HH5A19BeHc7JPYAV0EROK05R3Pm61+B/jc/67VtJTPXc7P/Ja 9r+H3hfUtE0CCx1nUoru4h43xIcBewyeTiutU01Z443cSSRpjGdzAfzotYDF8VxgXlsu5cC3UfMO vJrnZdMtpv8AWRWrH124NSeJrnWLj4raXYaQ0Uunz6bFJdbxuWNfMlw688Fumeeg9K7EaG+OTHmt U9DGUW2eez+HrRgdmIz/ALLn+tY7aCft3kpOMbdwLDNenajpT28W8ojL0+XFcyY1GqJ+5ySvoKtM lxOdbwvdjmMxP9GI/nVWfQr6JTvtZCPVQG/lXqVhpguYyyxLgcHNXG0NccRr+dHMHs7ngmr2zJbl XjKkHOCpXpWGyf6RB3xJj+Vew/EHTVTRptsZVkOcn8a8hlDbs+jg/oaT1IlGxr+AYA93q1sRkPa7 cfSVK8o0VdssadwwH61674Pjxrepx5Kh7SfkcEYKt/SvKlt5LbVrxNuNlzIi/g5GaVm9hL4TsviN bxSfCbwwyhY9t45YgY3E+YOcd/lArkfAcJg8W6LKsxGLqMkbuB82MHNdp40UyfBPSpCCDFqGP/H5 R/WuG8LkrrVgw6i5iI/77FZ9TolsaXiiHyvGOtx+l7L/AOhE10nwi+T4maAfWZh/5Desfx6nl/EL X16Zui35gGtb4XNt+I/h0+t1j81atOhzR+NFr4xSyW3xCuTFbSz7ohkR4yPmNYNtrVtFHG13oupT TI+URlxGOhBOOT9OK7D4srj4i3X/AFwH/oZrFeLBU4781nex0SV2Y7eLRaW8scNkNPtWy0kdtbtC GyeSxAy34k1i6vqmn6pbwDTlIKPl25wcjjrXW3EayW7K6gqUwQe/NcZqOixaXdO9uSIZ5flU/wAJ HX+dJR1uNvSxc1sY1W59mH8hXq3wnWDU/hvqdm6Oo/taO2lIb74ZVPH4NivKddP/ABOLwf8ATTH6 CvQ/Al5Povwd1/UbRVNwmq+fEGGQWSKPAP4iqnsKluP1/wAFw6VqM1uqsoB+RwfvLWDc+HwASrOf UmvaZXt/GPhSy1e1jMc0kQkMZPzRtjlD/n0rgb9GgaRpSBGq4I77s1zOCOk831u1/s213iT5zwij qxrD0P8AtLVr029hb3F5PGVaQW8bMAM9TjOB9a6PxHa3D3Yubm3lmiVTtt4fvMPT/GvRfgN4cXTd IuNTaymsLjVJWhNu8okCwxeWF5HQ7nY4/wAKdOCbM5M4S1+HfjrUlG3SRZrIpLm5uFj2ntxkn9O9 c3q/hHxNY309pLPpxlgbY+2Rm574JWvrayunkbUFIBFvKEXHBIKg8/nXh3iW6aTXL6RItxe4kLcj 1OK1cIroC7Gp+zqY/Dl/errc0a3l4iQRmMF9x3njIHHUV9Gnivl3Qbp0voCYXjlWUMjqRwAcj8a7 PUdVuJIyZbmd8nvIT/Wi9gasO/ahkgbwraQzzGNHlGSq7jncO34V8ynTLN4mZL/oOMwkV7H8ebsT +FtKRQw3Sr1+jGvKLG3DLGrjI5NJktm5rluYPBjK8kcavGsQZjgDOKz/AIVeIZvBniaK6F5ayadc Yju4kmGSmeGA9V6/TIr3T4YaTZ39jA2oWltdDbnE8Qce3BGK9D1F/DHhqw+16nDo+nW46O9vGpY+ igDLH2GacVYEWbUpd2ySwESRSKGVlGQQeQRXT6HH5WlwoQRgtwRj+I15nb/FzSFEfl6bqIU5A3mK MDH1fgV6L4V1qHxDoFrqlshjiuNxVWYMRhivJHHaqKiReFf+Pa8/6+D/AOgJXyz8fP8AkrGu5/6Y f+iI6+pvCv8Ax7Xn/Xwf/QEr5Z+Pn/JWdcx1/cf+iI6pbk1fhPPw1e//ALO8MUfhLWlhLlftYJ3t k52Cvn8n5e1e7/szTGfwx4hH927TH/fuoluKk9znPjDbxPHItw7pGJQSyDJ9q5z4dW9vF4gzaOwd oRkYx34P1rqvjNxayHv5q5/Otj4T+BbGbSLHXHu7nz7iM7ogFCrhiPr2rNo03Z2fgrxNFqrS6fdO BqNuuSp/5aJ03D+RrY1a0WVDwOao6X8PtBi8QWuqn7ab2BiUcXBUc9QQOo9q6bxNClrGPJyvyk88 0Iqx5Pqtq1pcEYOwniuc1q/W3hKhgHI656V02sXc07MsrKVz/dANcpqeh2uoHM0k685+R8f0qGAz RVimiO10eQnLAMCR9ah121CR5AxipAI9IZRaQCRm+XH8RHoMVQur68uLhhd2DW1vtIEzBsFscDmq T0Ja1Mu+tNLQpHcaK88hVZN0t4QrZ53DaOn4+1er/Cm2t5YdWaBtKhMVsiGK0lZ2TdkgNnjPy14L 4f1ieXWbvRtRVhbSTv8AYrhukLk/dJ/uN+h57mvfPhNodxp/hzX5b4JBPLIqhNysxCr7H1Y8GhJp lxabOh8HjPhvT0+fnVMfP14kJ/pWv4kAk0m793asjwSwHh3TVIbcNTdjv64Bc/0rGttUml1bxYL2 4KWAaIWgmlARuGLMme3T8q6FsQ92dr4SbzfC9g3cR7fyJH9KzPFqAaHqGRyYmpngvWraLwnaojpc XJmkijt4pFLudxPr0xzmpvGjf8U/fNjB8o8elSwPFLoQqjNc7BGnJL9BVJZdJblLiz/CRR/Wn+Ki Bod9kDBiNeo+F/gb4Q1fwvpF/c/2kLi5tIppClwANzICcDb6mp5RXd9Dy+OHTSCUmhz3Kzf/AF61 dKgVLuAqzlVcMMtkVu/FP4M+HPC/gnU9Z0qfUTcWyoVjlkVkOXCnPyg9DXNeG2zHZdeQv8hUyjYa bvZndK59ajnf5DSR8nikuT8hpFCaPG8t2CgOBT/Hqt/YV5u6/ZJh/wCOmrPho4lJxxTPiAuNHvCf 4rWY/wDjtID5ls42Z0wOa3o4ysZA/Gs7TsBlPtWrvAU+9XsZPUs2AHkpzkjrXpHgX7g45zXjVyzx vvhkZGHcGuk8J+PptGlVNQtRcwZ+9Edrj+h/SizuXfSx9Q+H2/cucdx/KtxXCqWYgKBkk8AD3rxt PjJ4Y03RGmtmnu7xz8tpsMbA4/iY8AfTNee23izxL8TvGMGmXV9DZ6XIrsLO2JEYCjPzd3P1/Kqu Ja7Hq/jj42aJonm2uhbNY1BDtLI+IIz/ALT/AMX0X868gm8RWHijWk1bxTqMM+qF1SONSBEiA8KF APcn1zmvNbrR7iO8uEQo22VlAzjoTXR/D/Rof7YN5rGyK1tRlXkQSR+aQdu4eg6/XFZTqKMXJ9DS MU9EfSEVydN8ZaOFRkx4VtAFCkbdsjdR2xn8K66PxPdrwyqeO5/rXC+JbiKbxzoDvLIxm8NI++PI 3fvMjp2PPFaMcsUcwhjK48vAVlIyeeOR7V4OYYzE0q16TfLZdNDopU4Ne9ubdz4zS7soX2OUlIAG OCT2z0JqlDcRTXittIcKSFOcmua0qC7j0e1t71USSHAaPzF4wTjbVqymaC/iju1MauWSHdwW+XJ/ r61yyzbFSbjGXft+Br9XpbtHdaZrjQLIscRIXG4HOR/kVpL4lQzxW5jPnSgsoA6gYz/OuFtp4mku csdnBVtpAPHOeO3vUrzxjWNKkaWMlPNQvuGVJT0P0PrSjmOOV7327eXoL2VLodHrkCazYzwSeZCr ttLD5sfhXj/i3RRoWpLaiVpkeJZEdl2k8kHj8K9etLqBskTfPv4GfvD1968++L2TrlhKGLRvafLk nGQ5zgHp2rryjGYyvXtWb5fT/gHNiacFH3UYXhckeJpB/wA9LaZR+MRNcPfLKnirWo47OadI785K R5C/Pu9D6123hPD+LtPQ/wAYI/ONhXHeJNYk03xfr9p9lguIp50uB5hYYYwp6Edq+qjNw1R56imt TZ8QqJPgHgAhrfUQrA9QRIQc+n3q880JxFf20jHCpKjE/RhXfT3drL8E/EFnvQXZv/tYjUHGxnQj B/A15rHKIo8vnGPTNYt3d2ataHb/ABOAX4iaqw6OY3B+qLU3w3kx8QfDh/6fox+eRVX4jOG8WJKy jEtpbucHrlKZ4Dl2+OfDpVQrfb4QGyTjLAZxWl9Dn+2js/i9x8Qp2H/Puf8A0I1C2mObfU5PMXFg ql8j72TgYqf4pW9zP8Qpwg84pas7sAFCqJMZOTjGSOfeub1XUdZnjlGjrJ5V9CpuZZEPlh+eWAB+ UflnrxWS1OqW53/jfT7Kw8O6RJZ2cSzyqN20cyZVep79Scetec39guq6lo9t9lMd3PK8bhSNzEAF V/8A1+tejeI9YW+8OeGb7Rp5vMtyUE4QAiWNEyR1HWvOfGWu3cev6bqF+zX92SzyNKdhf5QoHygY wB2pJ6lNWVmjE8SRNDr2oxyLtdJ2RlznBBwRnvXoPhk7vgVqCkn95qroMdcYjH9a8x1a4MurXsjD BaZmIznHPrXoNmZbf9ne7dEfdJqM7qR6AqP6VUnoTTWp6V4f1vwjourXmjaLPqF7fwxi1ZI28yNm T05ALLnBI9cV534r1+xmvimqQ31rKWL7WCxYI7N81cB4Z1W40jw7c6gZhFBFdgSeZuwFZQMqB/Fn H8+1c7r3irS9Vt75L6C8e4lk3w3MchOBjnIJ79cdOawhJSk01oux1Ok+Xmujr/FfiQEW/wC8UhZY 1kjaEglWByvU5JxkH2r1nwh4nsoPBtvNatM1vY20qtdTcBpHkDcDPG3AHr2rx34Z+EX8f6bfX0cy WVppd3FJKpXczIsbHanQAgA9eOa1LGcrpeo+HNBn/wCJVdv5xluIMMrEqSDgnH3a6aUFzWZyVeaM XKPQ9n+GOp6nqdvqcs5s2sEZFWWJmkeVwgHLHjoMnHOSO1ed2Go+F4fFD3HjfT5b3TpIJPKVIHmC ymReTt6fKD+dYXgO+8Ufa7jSNC1UDLFktpmZIc85PHqFq3qFlqWmabcvqcFrIySGMyWUhKJIH2sP mGTjOPwok0ghd6mhbXGgXXjS5l8I2ktpo7LGscckTx5cKSxAbnqR+Va2sapb2JUT54wcDGT9K5i2 8QweG9ON1eWhuCzgKyEbhntz2rD8ZX0t49tf2csLWtzGSAGJePg4GMc88HHStKKoN/vWKcar+BG7 8YNVs9X0zQ5rGUSQM5Y+qkLgqR2IzXnF3Kwj+RipHIKnFU01BLnSrWErIt2sskkqN0GcBcfgKVxI YlbY+09Dg81nUhySaFr1Op0T4peI9B0yS0svsjOV2x3EkWXjHsPuk/UVW8TaVea7Ho+q6jqdxPcX Fgs9xPcSlipZ36DGAuAOBjpXKFTv5B/Kt9YDcaKs89zckxqyQQByFKjk5Hf5j0+tQyz3z4H6NJe+ HY/skkdtY2rOnl+UJPOxgl2Y85Oe3SvbfDgQaNAIypQFwNuMffPpXxfFbCWxSCG4urZNgYiCYqMk c5HSvqf4HAr8LtFVpZJShnXfI25iBPIBz+FKGxpazOh8K/8AHtef9fB/9ASvlj4+4Pxa1wf9cP8A 0RHX1N4U/wCPa7/6+D/6AlfK/wAff+St67/2w/8AREdaIzq/CcC5Ud+a9v8A2X5B/YPiYDoLmM/+ OGvDGyeTXtf7KzZ0nxQDz+/iPP8AutUyHS1uVPjId1rN6CRf510PgjxRp/hf4TWeqavN5dtAHUKO Wkbe2EUdyawPjUNtlcMuOGU/rXjWp6jNfWNpaXX723tAwgjYnam45JwO5J61mXoel6X8W9av5H1H VNQu9OsJ2nmghs4kISKPGVLFSS2WHP8AjXd6bf8AiTxNpL38OoXyQzwS+Uly4SRGIxH8mM4zzzXj XhuUy+CpVaCFIba/BjIzwSqkrj3Kg/hXo1nrmpWFvNrOqRiG+vrlUQyDZmNF+YhfTcV6DqDXO68U 3GzN/Z3SaMjUrLxPpwH9p6oxfn7pRv6VyE/iLVoNcNtcanOtuEyClurkt2HTius8W63f6pBLMn7o lcJII920/TjNchpejXWrw30zXSLdxKWH7shWwOhrWg6dTWcrL8SHCb0irsunXi13CY9b2TAKV86F VIfvgjjr0qrea1qVzfQW2oX0twjPu2k8ZHfFefa7Bf2Jtm1BEAuQWXafugHHI7Vv+H0kk1i2imcy eTGTv9eK3rQpLWk7oyXPF2qLUoTaw516a0FkkrGZo1zIV5z1r1zwH8Qr37PceGxY2wvM5DSuS0w2 9mHVgAOMcge1eMMn/FZ56f6Y38639JhkPj/STtcK2p2+Gx9BVQgmkZzk0/d7H0lo109n4c0+2hZt yXjPMs0bI0eUYsQecrk4BxzmuC1nRofED36va2dhCjFoZGiCPIT13Zxkeld74xswnhbW5FCMqW5H K89PWvnywjj+0OSqnbE5HHfbXTUoxhBy7HJQxU6s1DueyfBPwboUV/LfC0tZNR0xhG0qzu5MhBPm ADCgc7QOcYP1rv8Ax0Wfw7qPlqxxEST2FcZ8L/iF4W03wbp+mNcTJfwRA3IEDEeYx5Oe/atvxN4l s9T0O+hsJJWkmiKoDGRuNczi0dinHZs8k18PN4avxjMiRE/UDmux8L/tEabpHhvTNPn0K7ke0t44 GdJ1wxVQMgEd8VzMUV0knzxkjowyDVO+sfJlO+BAhOFOwYrNSsWdF8SPjvpPivwTqWjW+k3tvPcq oWSSRCq4YNzj6VkeGZMiwz3C9PpWcsNuCu+OHk4GVHJrq9A0kTRRXW/aFbhQPSmk56IG1HVnRx/r Wbq8ssTKRIUiK7iSuB+fetcxbYWKAtJ1xnrXD+K70Flt0L4K8gnO0elejgsKm25nJiKzWkRE8VXV g0jWTqwXkGQZB55GK3tW8T2niPw5PJB+7uY7SUTQnqpK9R6j3rzC4uYk3EgECsi01WS3us25G+ZW jKE43BgRj/PpWmLwcFG8dCaNeWz1RUtzjbxVx/XtWZFIQwwelWVlIGCfwrylE6FuNujkEY6Vnyr8 uRVySQkkDFVJT8tDQ02+pVlXgV3PwL/d/ErSf+mglT842ri8hhgitzw1ePpeqWV/bsyTW8qygqcE 4PI/EZH40W0CL0OmvNL0/wC26hOkGoSGO6kjl8tlO1tx7dQD2JqG9ayZI9OCXSpDLvO1lIZz3b1x 0rM1zxjqX9t3N1Y2wWWUtI0ixfMAT6jt9apabHPdXA8xjBNIBJgDpk+lY1FKKukdEVD7R7L431q2 0bxN4KluXkgjXw1ApmUE7dx46ZP8LfnV7R7+w1G9EmnXomQ5wqy5bv8Ajmuc+NOm24sPBcs0jXF9 LoNvaxwRsECFVLeY3OSuC3HT5evWvM9V0C50rw9H4jiuYprCSRUjmspQ4Vj/AMs2IIKuO4I/GuLF 5ZHEvnvZl067p6JaHvqHEsgMRJIGA7nA/Amsn+2bHUNW0wafewyyQ3TRSJ5m5lJVhwuc5yMdMV4x pHj3WNPUeTqfmI3A+0rv/U85H1rmp4JHmMyyB5GJfcDySTknIrgpZHJN88vQ3eJTPrdJpMzBhMSo z6Y+vSi4kVNf0C4kXcrGWJJGfkMyZGDnvgivmXSPG3ifRAwt9QlliIAKXI85cemTyPwNek6J41+0 Jod1rgnnt2njm8i2YL5bKMArx0z2rhqZPUpSV5KzuuvVGsJ+00ij6AtpXjeQEvncGwDwAfWvPPjT KReaVOwflHi+b8+tdF4b8SeHvEFrJdrrM9lKnD2siBWAHTmRMnr2OKr6y/hq9khk1u/t7m2tizoL qcFUJ4zhAO3rXbleWVcHWU5yVvX/AIBzVX7RcqR5t4WvNvi/Q3z96ZB+bEf1rivHUX2bxcyqcmW1 gbPqTGAf1Fd3rtlp2j+I/D2q6PeR3GhzXiLHKCwETK67kJb8SPb161xfxbTyPFNoHG0mzRW3ccq7 ivpr3R5/I1dMo2EP2m1mj86aLzQYX2NxjIPT1zj8q5/TYZdQ1COwju3eZpDEA23HBwTiu28E6RLr dhceVOsZhkGd4JJBHt9Km034Zahp+pz3sWqW/mP5mz9w3yFs89e2ahsuK0I/iKyPrdjJFjy2sIQu PQZH9KpeD38vxj4ffONuoW5/8iLVrx5ZSadLotvLL5rxWQiaTGNxVjzj8ayvD8u3xHozf3b6A/8A kRa06HO/jPRvi7rMGi/E+0e/tXu9PuIZYbmFH270zwCfTdtP4VzmkX9teaI0S362EssTq00z7CEk LohQZydqsM4x0rc+NuhL4g+JFhp73JtVZJ5PMC7vuEEDGRWVqHgG2uI7ZZNYCGKJY+I1+bHfG6se h1tPmucKuueX5dupnaOP5f3JKqT0JVffGfel1e4a4uLQFbhFVyVWcfNg4xXVp4E0+C4WQ62rGM7g vyLkjpzu45rnmU3UkjXUwe4iY5YsGOAeD9K56ldUndo9DD4OeN5rOzKOpArqV2D2mYfqa9annNj8 BtKkllbDTyEEHOAXAAryyaLzJXllZsuxJcj7xPJrWW/vrjTYtPmvp5LCL/V25PyL9BWM8bGS0R2U skqQd5SRqaLeCaxuY5wHCOGw4DAjg9MY7V5L8RjE3jTVzbqiQ+edqooUD2AHFdiuqw6dpssdpcRG 5aUhkc5+UHjmvN9Tkku7y6nbLMXLyN2BJ/xrPAU5e2nUezOLFRUbJO56r+zRJHceJrrTL+9kh0y4 RmnjW4MQbCEZJyPpxzW19ntbbx7qFvpR22axlgivuXO7A5/OvMvBmhtMgvpJGC7lAiXgt83BB+or tvG1+i6BpU8KSK7SbgQNrcA+lexTk4zvbRI8zELmhyxlZt2Ov8WWcvhzVYLfRb+8gWwXMLHaWQyZ Z+3OSx61x3jXUNRvfDXhq6tBdTtbahdm6kAO15N6sS2313H9a6vw7DEYbDVdUutPvLcWRM8D36GW aVlGHYEZ3Dn5S35Vm6h4ksY9G1HRrTT5PJYtJYxyJiNXLZbLA5BIz3NcntNdTqVOU3aKuUrzxB4c s7K3uJtQmnuSuZ9PghJKMemJWwMfgTXJQam2p3UsxXZGNwiReir3ye56VzV5bSOWlk43t25APpWl CEsdOTPLqDznr36V7uWxoublFaruZYqlUpwXN1IYJ5otYhuLUN5ivvXYMnjr/WvU7a8uZIVk+0SI G5AO08dj0ryG2cpJGwZg6qWypxtz3/KvQ9DvoptCsmeVA3lBSCwzkcf0rDM4Wan3M4mzNfSoObwE +6qf6ViXviZbdgvnySPnGEjXrVqS4t9n34s/UVx+uN5upCSBDs67jwCR1x+leQ3Y68NSVSVpGzde ILtQHSbZn+ExqfzOK+tvgNNJcfCjQpZnDyN55LAAZ/fydhXw9eXcwYMV29xn0r7a/Z5z/wAKd8O5 BBKznB955KulfqbYqlGnblVjqvCn/Htd/wDXwf8A0BK+Vfj8xHxd10D/AKYf+k8dfVXhT/j2u/8A r4P/AKAlfKX7QLY+Lmvjv+4/9J466FuedVV4nBiTGBgY9a9k/ZUYfYvFa7ufOi4/B68T34Xk8V7/ APs56EljpWvNOjh53ikD5IyCpP5c/rSmx0upjfG2Vf7NvtrAsCp4/wB4V4MZScYavoX4radG9vew xpksvy9TzXip8NXHy7d27HI2Hk1g5JbluF9jqvh6kGo+F9T0+9jKW5mUeaDwznJUH3GKyLO31jQt ZUSCS5cgoolJdXXPQHtXV/Di0NpbQ6fcIN7332h/90REAfnmsv4rJeXOiSQWsTN9nuQXKnDFSSow PqR+deW8RGdeVF6eZ6cEo0k2uhi6r4tjIaH7H5JBIZRITz+NU/DvjmDSXvo7hZ3hnAZVUZww/HpX GS6fqFvIUns7pHHUPGwIqlNkt0wRwa76OEhFaO/zMqmJ1ThGx2OteJtJ1UPLPFcC4Ztw+QED0HXp R4FlvdZ8SpaabaG6u5EdgplWP5QOTk8fhXDP1r1n9mEIfigpfb8thP19TtH9a6Y0lFWRz1Kjqu8j f8LfDTVD4gvrrX/K0m0BLrcSqJRkkcjaeMYOTWl4t8GHRmt76y1yyvfLYNFNb5BDDkEHkA17h4hh iPhnWX8qM7LZ8NtHoa+Ybq4MUqREt5MsnIDdCFHIFClZXRNOEZvlbt+Rrprmr6pZ6jZR6zqNxNIi q1vKqNvGcY34GP61z15pd/Y2cs10s1uNpU5Abg8cEcVs6Daqsd1cxThz5iIAO+SOo6gitbxbcf8A EnnU/KwZQR2PPWu2lH20G7nm4pvCVIpxV3/WjOO07TNQtrqdbVQZhsMiOBle4HX0Nat5rXinTneO 0sZpCv8AC9qzc/UUuk6dqFrfaDqVzYXJ0lb8MuoOn7qRSMck9h/SvZvhY6y+FISx8xwxDbjkj0rj deotLnV9XpS1cTxnQb3WrhGN/pcyzMWfakLD5QCSefYE10F5qOnXnhywut6rcF3jXbkEtjOG98dq 9EuL9r34jX3h4xW4sYNJW6zs+fzWkwPm9Mdq4fxzp1pFp0drCoi1OK5M7IZDsYldobH04rF3e50+ 6lZIwoB55Rj8xU5HtW7Yau+lxPI8hS2UbpON2AOpArJ01FgVfM5bHOBxmpNXxcaXeQwqTJLEyIMd yOKqM3HVEcqejN3T/Hekahex2kN9JHLLwjSwlE3dhk1T8V6Nf3+m3E8d4i6hGfldgBHJjsQBxmvO LXRdWtmif7DFJsYN/rQAcHoa7m51/fpnmXtq8E6gl41cMo/4F0xQ8TXv7jOqjQw6TU0mee2IvLrT 9Va8tniu7RDJ1xGQOoPfPpik+H1ymp6hqAureI+VbNNE38SMARx+dbVyv9sWc15KyxwyDy0gRssx z1auPuLT7BLvtgY85C7Sc+9ejThicTTlKo7I5K0aFFpU1qW434HrU6tjrTvDWn/2xcm3+1JBOF3K GXO8d8e9dZa+BpFmjeW+R0DAsnln5h6da5KlqbszFRctUcgwAHFRP9yu+l8CiSV2W+CIxyFEX3fb rTf+EBBGDqJ/79f/AF6y9ohqnI89dehFW7ZiuOa7T/hX8Y66g5/7ZD/Gl/4QaGNeb+Q/9sx/jT50 P2T7D/D+220Ca4b793KIVP8Asryf1x+VYlxK0Xitdv3WjXcfx6/rXXNoyDT7K0Sd1S2Dc7R8xY5J qqfDls0k0jzsXkXaWwMge3480nJNFaotfHi8FtrHhJWhhkH/AAjlofmX5hkyA4PWvO/OsL3TnsJp 9Qgt2lE4hSUGLzMbQxBHXHGfSvRPj3pq3OoeEixdnTw7aL5inBODJzivKn0yeMfupBIPRuD+tWg0 GWnhq9uYbyXT3SeG3XdKHUr8vqeo7etdt8OotCk8L32n3L3dnrMsn7lp4I5rKZ2IVELMuYyM53Bh xn0rgjNNaynz0dO3K1qaPqi2f2gx21rMl1H5ciTxh1PoQOzA9CKobZ2viX4aalo0d9LG51fT7WVY ft9p8qmQqCRsOdwGQCQetcbbXFzZyL5EzR+S5CrIBhT9D0P41asde1PRZhceGtRvNMkIAeOG5dUb 3xnHvgg1J4f0fXNRj/tDT5rW4uUnZzb3MiOSxOSxRhgg5PWplFSVmhxk46xZcj8U6hki7DSqAFOx 8Ypuo+IoZrJ0IlV3GNrD+tc+0Mq3EqToiSrIQ6L91WzyB7CprmNWg2FBuByroenrle9cUsvot8yV jSFaUGmaGi/EW7sLKfTLyHzrKTbGwUg/KD/dbg9/T2Iq1448R6Rrmo6ZJpEk/kQ2ggIuEKupDEgH k54PXNZ6aLY3dkslpqME95ux9mkhaJj9GOVqhLo0trBaajJZTCzmdljlKHynKnDDPTI9K7dlYzk1 Lc6fw7PKLOQW0kgzJz5bEHoPSsK10/xHcatdN5WrPAGkKEyOqk87eprsNFD2GnFNLIZyTM21gAwK /LtYcEHBGe3NdLGIbiwiOqB/MdQHiMhZc+nA55rNsEjkdae5k8M+Fpb1WW5NvKkgYEEMH6EGszTZ Nmr6c3926hP/AJEWum8fyRy6bpLw52LLOnJySciuOjcreWr9lmjb8mFbJ3RySXvnpP7R9pc3vieP 7JGzmLzWcg42rleTXmF9JHItktvKjzxW0aHyzuIYLyOK928eTW4+J9jBeWz3Ed5I8KqBkKSAcn0H FbA0TTozmOxtxj/ZzXO52ujt5OZpny/9h1Z5AZoQEYE/Muc5rvPDdt/xIITcQRxeUSrSZzkA5BOO cDd39q9oNnbL921t8/8AXJf8K4vxqpiuIggCK6kDYuMce34Vy4h80T1csvCtvucjr9nbvaiW3Qo6 k5xzkfT1rlnDqwWQsECkA525OPSujmkSNWDylvNXcBz0/pXNXM6DmG3fYvBLDAFckEfQVZSs4ozI fC2rXYM6wSqXJbYYnyP0qzpXg7Wj4d1kNpl2Lq48tYYzGQTtcMTz0GM17H4fu4bvT7Zll3P5Y3AH JBx3qTVdd0nSkB1G+S3DfKN+ck/QCvTjN2PjpQd3cx9J0R9M8N2dlHaTG6jiVmk3KNsm0AqB3Gc1 jeKtA1PUbayjhgQvECDmQAAYropPGugomTelgRuGIm6evSqms+KrCwkiWYTEypvXYmePf0pUYShz SWtzOooSaUnsYS6JfpbIjxQZUAfO4P8AKomtHe0bfMkTxthjGuc9OCfTmp7nxtYsSsdpeSfRB/jX OJq5upJ54A6RSFiFPYgD/CuV0fZvmiejhJxlLlepl6hZSWNxPxvt25VgOnasObz7llCqwjAxlu9d X4hlLIqlwiMgPPrXP2bKYSu7dtYgH2r6TAY6pX9yp2OXH4SFD34Fa8YQw+THw0nL11PgBh9k8zkt E7KB9cGuNujlpXbucCt7wFdMurw2OT5dxIN2B6A5+nAqswbnF+RxQjodxqFwIrWZ9vIU1yEdyjwh NoIEROD65FTapr8JmmtA85cExkbBtOffNY0LbImBJ/1eBj614bTPRwnuxkyrqcxkYgkfT0r7l/Z+ JPwf8OluuyXt286SvhG8BMzEAV96fAoRD4U6CIMBAsvTpnznz+ua2grE4tttHQ+FP+PW7/6+D/6A lfJ/7Qf/ACV3Xv8At3/9J46+sPCn/Hrd/wDXwf8A0BK+T/2g+fi9r3/bv/6Tx1qcM9jzpj2xxX0N 8AZ7qbTdWjuLiRkVIih6YGDx9OBXz2wwD6EV9Cfs+lZLLViokAEUQO8d8Hp7VlVm1KK7/wCRdCDl CUuxD49he5vJYhO0ZYY3gZIryy5N1DcvGL2QbDglgK9a8WTQQ60Xum2QqSWPtg149r1wkniO7hVG VeGUt/Ep6GuCs5/WEvs2/E66VKUqTqJbGp4b1B7XXLczy+dnd83TnHStnXy8q3ixKC08bbQw/iwG H6rXAwSeRq0IU/cBau7uLhSsMueiLJ+R5/TNeVjopVOZGzfuRV/6uUPEmpLf2CStAu3ylIbHXgcf pXieplft1yFGB5jEfnXsN1IyaRLAeRbzNGOe244/QivG7077yZvWRv516OULWVjkqKSXvO5Vfoa0 PD2u3/h6/F9pUwiuApQlkDAqeoIPHYVnN1IPSpLO2a7uEgSSKMvn55X2qMDPJr2mZH1N8OV8TeOf DRt4by0tppocTlt6jBH90ZGcEVz/AI58Ay6CsawziV0Pzlm746g/nXdfs3zzGPEgMlq8JAuEAKM6 hRjPXOBTviu4DyjOfmJqLaEt63R4j4du7qPVbnT/ADAofZJgDI4P/wCviuzvtHvNetXsLC3eediG wjKp45J+YgelcToDK/jGfuAg/nXsPgR/L8UKVPyvbuSPTBX/ABruUIxw7ktzyvrU3i4Up2cez2v5 dvlY5nVrnWtP8KaX4YuNMaBrMh/NkkXLAk88Z6Vj6D4v1/QIriK0t45Ywf8AVOCTuA9Riu7+JUvm 6/gD7sKD69a4K/2hSXHykj868dnvSqc+iSXp/Vzpfh9rM2u/EPXNTvbcW8z6XDHtBOAVYZx+deSf GyaY/EvWS7tkMm3noNi4rsdF1afSPFlgkefLvAbeXAHCll5/PFcz8eIJG+I92IoWYvDCw2IST8gr aFnuYs6Hwxr9lqrRWcnmw3LRApIRuV2x0x2zWrq9tqukeV9vs/klXfFNH8yOMZ498dqwvhNqOk6b K76hNEk5iCD5STH6hvSvZdU+LnhPTdHtzYumqX6xhUhRCqowGMlmHH4ZNP2Ep2sinJRZx95o01tp bX08vkWyR+a7yLwq4zXkOrazPrFykUeUty3ypjBI9TXQ/EX4nan4005bOSC3srSNizQ25OJG7bs+ nauO0lvNuxsG0hTjmvXwGDjTkpT3OerVurI6mBfKtjtAXjrWHq8nzHjORgVrac7ywSyudwkJCDsF HA/xrC1Z1FyBnvgV7Vd2jY41pKxWsbqWyvYLiMsrxsD8vX3r1JZCywt9vlHnY8sbsbuM8V5N5chv lihDNIWAQKcEntivRNKQ3NrC1/E0d7Zvja3Ve4/nXzGZR2fU76T7m2YJ8/8AH5P/AN9Gk+zSH/l6 mx/vGgXBNVrvUfs8ZbG49hXnOyWpqk27Iivpo7LPn3U+QN2ASeKhF3Ay7hcTEEe9YOqXTyRzzyHc xGMH+VaFns8iNncABB1+lYSqvdHqwwUXpLctyXNsMspkAPbnk1F54cxqqv8AOwUZNQKgnk+X5lB6 DvTL64e2vLXCjaDub1Has41ZSkbSwVKMW0rs3vj7fX1hqfg1bTa0P/CMWWVZc87pP/rVwFtr5ltL lpbfyJI0xuzkZPHFeqfGySE3Hg4TW6OH8OWeHkZgvV+OOK80vVs7ZMTxxRRoNzrjcGY/wgH6V6Z8 899ixYyWV5bqltco5xgrnJ/75NMm0WMklF2H1Q4/Q8Vlppmk6hIgjjmtLlxuVV6/XHP9KsfYtd0/ /jzvEu4h/BL1/X/GmmK3YJdNuYuI2WT2b5T+vH61TbzraT5klhb1IwK0I/EkluQmr6dNB6ugyv6/ 41pWmoabfDFtdJk/wE7T/wB8mmF2jmTIcEsvPqh6/hUqXjlQqkNnjDcGt650mFzlUAPqnyH8ulZt zpMq/wCrdfpKuP1HFBV0yslyg+VlZee44q5DdSNC8HnP9nc5MYY7CfXHTNZM8NzCMTo6ejL8y/mK ZC8i8qVYeqnBpXHynX6Dqj6chhVWkjwFUk/cGScfmSa021iG7whmIXOcElTkVxttPNljt3g9R0NX La5gdsSsI2PaQYBqXBMLtHVeJiy+FtLLHP8ApcuCDngjI/lXNqwaWIFggLr8x6LyOafqEo+xLEjt 5KvvChiVzjqBWS92ShGMMOh7U9kZShzO6PoDx7JL/wAJbHdRrtmhBMbYyQSAM/59ayJtY1UqS97O oAyTkCn3+t2/iG6ivtJl+0RsgUllYEMANwxjPBpkNjczMvnASMOcYwo/D/GuaW52xNjxDeSWtppk UMjlpLVJJJGYlmZhkn9a87l124vNWW0m2NsUuWGfXgZPtXo2oWcl9JaP90QwLEwbuQPrXJeJLCW3 nSaaSGSNiRhBgKMHr9Tis5pcrOig2qkbdzmmEoW38pA5QsjZ44z71gagLqUskjIFB/h7/gK6GWRI PMEYKLuJyTnn8a5+5nDOxJY555NcikfRtKy0NWyvxBp8JU+XMCVZxwcdunX9a7PVmj8QeEpVaKKe 6hizb3UZAkgceoyMjGeM8+led6Z9kuPNS8m8oDBXOcNWvb3OmWVlLHDq9wjSNyqxMxI789h7V6FO XunzGKShVkmULi2kuLXZKVkl42sItuD61J4nffq0QlidQkSiJCB8xz1PPQHtTo7/AEtWAV7t8dP3 eM1W1i/jvdUhn8uUKgUbcDnBz1zXRTklCSPMq2dSLXmRSPdoCBED+NPtFknhkEkaq/P/AKCak+3h ydlo34vn+lONw2Mw2k7yEHIRSRn2rmq6qyPSwUoxqXk7Iz9YIMEe4I0gUA4rm0YojlRg5wMVtX1n rV0Ts0y4wfVMVl3Fleacv+nW5hZuUBIOa68u/d1LyNsfWp1IcsXczJ8swU9ua6P4d27P4lSbkRwQ yOxPT7hAH61jyWE39mm7wSCc/hnGa1vCsUl3azW6E5Vs8eh//VXXiaylFqJ5q0HXWhP50t1Jer94 ybNvJ5zjrVaXbHEwdR91VI/Wuri8MvImWmx77eRUM/hG25M1xO5JyeQK806KWIVNNNHCTSqzcEZr 7y+AbRt8JNAMPEYWYD8JpBXx5N4a0+BWcLIxUZ+Zq+v/ANnvA+EGgbRgYnx/4ESVcdyKtX2jOp8K f8et3/18H/0BK+Tv2gzj4v6/6/6P/wCk8dfWPhT/AI9bv/r4P/oCV8tfHuKJ/izrrSD/AJ4f+iI6 KtZUVzMdDCyxT5Inl7NhTX038F7NrbRZWZQFlt4pFIHqCa+dyLVcARM2fRc1qw+JtVskVLG9vrcB QoCzMowOgwDXFUxalKLWy/yPUpZTVhGUXJano/xVjEkV4jSCMHHzntzXidzcyQXYka4+0eWmxN39 3rWzf6xqmoq63t3POjD5g7Fs/Ws5YXA+SAE+pTNZTrKc+ZHVRwNWFJ0uZWZUW7+0yibgMRg47c13 Vu+62sQ75DRgMD6Hj+tckLe4ZceUoz1+UCi4W9EBAkYBRgKr4xXLWh7V6ETy5qPxbG3rF2tnZXZn 43wiQd/mA2n9VFeREkgk9TXcarJcQeHzFfEOs+5Q6tzkYP8AUVxEmAeK9TLqPs4u55OJg4NRZE/a mt92nM2RiljjLyIg6sQBXezlPT/AXxF1DwlpEEdjJN9mlYrIqSY8txwWAIPUY49q6/UNY1LxMyK9 4V8w4y4DYz34xmuB0PwwLayE11JHc20gEvlAFSCPeu40ua2W6QRAhJG/d8Z9sfhXHXdXmiqezaub wVN053+Jar9f0M+60Q6AbnVbeQXEscYLLIcBv8K2PBHjq0tdUW61WP7JEI2QncXBJII6D2qTxbsX QLrON5XA/OvLXmQW0iNks7Ar6ACvRxU3H92tjxsHRhWftp7p/oe06xqdx4p1W3u9N0q9NncIqrO2 3YqgE72OeF61labZ3OqtenToGuPscvky7OcNjP8AKr2meHdU17wrotlcaZeRWJswI7iz1FYgVI6u nQ/Q10vwp8L33g7Tdag1MR/6ReedCUcPmMLgE46H2rg5HY9W6TPL7TR9Qu/iBpY1CKW1tIZBJvZc DA5xn3Ir1nxzp4vrWC6tcSGIbXKckDtk1n+NJYbbTY5TdWxSSVRlWAzgHnFN8A6tbul1HBPBI24A qHBzx6VhRqSnFOcbPsVJO9zx/wAQ/wChzypLEIk5/eY++D6VwolwTgkjPFdV4x8Q3c91fWTqjI8h XI7DrXKNA5bGRx6CvWo4pQglIlYedZ3iiq7srHYSMnNdJ4fgaaKeWNTnhNwHC5rE+wyHG3DV1Okw vZ2PlRtmSQ5Y54FengKqrSvHoYYmlKkrS0J5FKbLZHyqAAkewrBvWEmrgKcqD+tbV5ItvExUjcR1 rBssNcNK2flGa76zvZHLH+ZkUkzRagZFOGR9w/Cuz0HVJbvUZIrgIsskO/CcAYPAA7cGuGUGa+GO ctWvpV2IPFFu275QwiJ9iMfzrzcXRjOlKTWpvTlZpHoiE85qteIHjcAckEVZHWoZjnIPFfOSOxOz ORRDOXjkHB4Ye9X7OOb+z0kGJdrGPHfjgGor+RLLUhIkZlEgw4Bxg54qWzu9zz26xNuLFwy/dx35 9q5pK59DQfPGM+415ZQhLiVB9cCs6e7RI2kLPvONgLZzUt7cz3IMceUgBwpb7xrKuIwjDLMfcjH4 UoxszpSuelfGfUhHeeBY3h3ed4TsWZg3GD5nBHQivOm3T3XmpMpc8IkqZVWxwRjPPHcV6Z8YZdLj s/Bq3Yb7Y3hGw8lsEjgSY+nNebeErMajqdwolMLRp5iyqueeByD9a9JbHylTRs6rQdKgt4cJMsl1 NzJMzY/U9BXLaxdWSapO9pdXR5w08bYDkdTtPb/OKZcXN3HNKkMyyxxsQHA+8B3qKfU7NbP/AEy2 juZVO0KwAb8xQkZJdTXN5NaWkCjyrmVxuKSEIzg9MCq/2XStRci606ezl4GVQrz9Rxj3xVcajo+p vuu1CPgALKmQvsGFaenWcUK77BzInYLIJAv07ihtodisNH1G1P8AxKNWLqORFNyP6/yFb1ncFYY1 1BJYZQAHfy90ZPcgrnA+orPsLUJrK3t8jTxwj93FFjdn1YEj9K2JtZ0yTzRFDdw3MaFwssZVeP0q bsOUY1ibiaWVUP2ZPkDLwC3c1n3GhW053JtLDuDg/mKiik0MyCeDXLUzNhnjvINybu+MgYrSXW7R SsTxacYupksZUJb8DgihOwWZhXOiXMQzbybh6SD+oqhILi1X/SLeRU7kLvU139tcaVep/ol+iv8A 3GP+NQzR2wYhpoHPqjjP6VaYXaOEMy3JVUMSKP8AnmNv5jpT3spvK8yP54QcFyMAGulv/D1rOC+1 Qx53Dg/mKrWCTaS4UkS2Qz5kcgB+XuQe1JtjR02neIBpXhKC1sLdLe4hVBNNJhwxL849Qck/l6VT bxJrNxJmC+by1/55AKBUWjLa3mkrDcASJG7bUz0TcSucexq7o+gzxaix0ooylGkVZOShA4A9Tzxn 0rFoJ8zasypJe6nf/J9q1G5wclEjdufbAxUsGi68UK2mkamwOP8AWRBR1zgbiMV6D4Gv9UtIb5/F NzHbqzr5KyzDpg5PX6VvXHibRogd+owH/dy38hS5U9zSnKUJc0XqeQS+CPFd+AJbZIF/6aTIMfkT U9r8J9TfH2vU7eIdxGCx/kK9C1PxNBb3ltMjTPZNExYKnVsjaefYGs6bx/Yr/q7S4f6lV/xpKEVs jd4mrLeRjWnwvtLZw8uoXErD0AArQj8BaQv30mkP+1IR/Kq9z8QGP+psYx/vyE/yFZl1491HH7qK 2Q+yE/zNUkYSk5O8tTpl8J6NAARYRkjuxJp40jT4z+7srdf+2YrzbUvGXiGfPlX5hX0jiQfriudu 9X1+4yJdVvmB7CUj+WKtR8zJtdj2W4giiUlY0jx6KBWFPeWsV0pkmiVugO8f415FLDdzN+/luJGP 99yf5miLTyCG27W7GhwXcdz1u81OxMWBdpn0Bya4Dx3cwXBtmhk37QwJ/Ks2WK6jiLIskn+ynJrK 1AkrGStzuxl1eIgKfr3q6ejE9TYt9QhXQ/s7I7MYivbGeapeFtWfS7iVljWTegGGOOQajtraSe1U wqckcZHFMstNuhdbZYHAA644NW2rWA6qTxlebcRQ26fUFv61nv4j1a8l8tJYwx6ABV/nSxaaABvX B9xUV3oyTFSjlCOvGc1ndArdTUtf7X2E3UEU0bDBEkmP5V9efs+xPD8IdBjkADD7RkDoP9IkNfEv 2LULPm1unA9FYj9Olfa37OzzyfBzw+10xab/AEgMT7XEo/lTig9DrPCf/Hrd/wDXwf8A0BK+YPjw x/4Wrrg3EY8jgHH/ACwjr6f8J/8AHrd/9fB/9ASvl3498/FfXBj/AJ4f+iI658d8C9T1Mo/jP0/V HBM7r03fnUckrBgSufrTm3Lj5sevNRvMVPUGvKsfSpocJ2OdiZb3qdZysYCpl+5NUZbsxkbuQevF SrdiNS2flNOzQybzHycjk9sVrQWRSymml5byiQOw4qjbeVcQ+YrDOMj2rC1HXb+xjaOSQgyAqEPP FVThKctDnxM404NzINckS5sYIw25okdyqn7pPqPoK42Tg9a3tLlZ3u3JyTBJn/vk1g7PMkRP75C/ ma9ylDkgfIVa7rVG+xZurGS0Fu0wKmaPfgjpz/hj86s+Ho/P1q3UruA3Nj6KcV2XxfsVsr+3SPJj R3jBx1wq1m/DbS7u41Jb+2jO2GVUDn7uTn+XFKVRKF2CV3odlb2839hRQeW3mtCAEIwaIrC9sruz +T91JcjEb/wHPUH0xXbazpMjTeZCfOnPJjJAPHp/P8a5+K9ka/hgmQZD/dPVf0rhhjJqcYzju0OV JJSnF62Y3xqHj8O3LO3JAAx65rydoXb+LFeqeM83GmzqDlIBvb/ePQfgMn8RXm7r6V6+L+O6PKwD 5IM9R8OeNvEthpFjbRGzNrFAkaB1yVAGOwrRk8f+I5CYkk03JHBeM5rhNMM8dvGQXAKD7y5FaEl6 8aDMUf1Br5qeKqxm0np6n0ChFq7RD4lt9S12GBb27txJCSQQhC4444+lYMnhubeGtLhZWAyWGV59 jXU2upRSbY5LcSyE4Ul8D8cdaytd1O8kkZ7IxJCp2kxkDaR/SuqlVUle53UnOSXKc1cwm080Tw7Z EOCM5yadFCzMCVCgjPPWrTxz3NkJbqJgJiQXK4DH1zVPTZ2ZBFN/rIztye9fT0MBhq0YyXbueXVz HEUZyj+n5E8Plwzorj5nBIz2xV4ypFEWzwKzr9El2HIVlOVNUb+8IQxpnJ6ntXp0adPCw5YaI86v WqYqfNUYajcmQ9ck/wAqjLGG3Cx4aaTgCqYYsQQNx71swW6squPvepohLnZEkoIgtLUWcDzykNIB n6VlCQrIJOdwO7Na2rOFgEfvk1lqmY8+9Y4izfKuhVO+7PRL2Py7ry453eLgq+4/MCAc/rW3aaVY vZ75I2d/Uua5rwvFHqGkR+bMwkhPlkDk47fpXVArBbbFY7QO/WvmZpQk4s7N0mcsLKO/1r7Oh2RI xb8jgUktjIDeRpIzhXKoucYHpV7Q7i3TUbhpmAkKfLkf7VQxyq97ehSP9ZkY78Vw3u7Hv05aJL+t CK2gW1tQZV2yYPDcmsTUfnZn3DI5NbGpsWjCdSDk5Nc9cKwzuYDPcVUVqdEHy7HqvxU0qa9j8BzL Z29wg8K2CnzHKkHDnqD71x9vNd6Wy2MGmW8ckqlvkcEuB6kkZNdz8TjCLTwL5jTk/wDCL2H+rcqO j+lcI/2EtueCZ2HQs5J/nXbc+UqyfO7mWmiX5bBtRGQSA7yAYHvzVK78I3EkrObu1TP96QcVubra Nsrahk7hzkj6GiS+tolLJp8JCjJLKKFISkzlh4blW4khN9YgqAdxkO059Dik/sK+gbfBc2pYdDFP g1q6fqMluZD9nhaSVy7FgM+wHoBW3Bq02P8AVwqfaqciuZnMQX2v2pCsrXSjja6+Z+o5rSj1WSRB FqOl3iRycEKrMD9B1raOrXRHysq+wFV5b69kPFw4+lTzBczns0kP/Eri0kekdzbNG4/Fsj9azr6X WtPBM1jDBH08yO2Qr+DAEVuSia4ULPJPIv8AdycflT7dZbfIt1nXPULnn8KLjOQOu356XLL/ALqg fyFRvqt633rqf/vs12LWhlbM2nRSA/xFAp/Oq9zolnLFJsiS3kxxvKkZ+oP9KpSQHJNql2Du+1TA jvurudTm+16VBmMW73EKM4P8PAz+Z5x71zaaCTcIXeDygw3BCTkVr6kHumL7ht7YBx+FEn2GXdGv FW1s2YATQt5D7RgOnY/Wt6XUVQ/Jvrk9PIS6iDgCMdQPWuheS0jIDjLY5XvWMnqBKuo+Y5AjAJ6V FNM5z8pJrPur1Fk/0ZFU/Sr+m6hFJhLghX/vdjU6sEyu7XkhRTvO3Oweg74pot5z975a2J7N5rmK aG6aNFx+72A/Xn3q15K7idtCKMGOwdupJqxHpoJ+atpIjnOKnC4HbNO4rGMulxnqKX+zIAPuj61q sCe4qNhTuwsZUunxt9PpVKbTVP3V4rcYVFIMYyOtFxMxooBHxtxip1xjkVedQw+7UTQAHrTuJkOw EdBik8tScYyanVQp71MiAnmgllSW1cRhyh2sCQcdR0rPuJIoIzJMwVM43Gu78OXcBD2F2SqMS8Mi jJjbv+B9Kr+IrG1vLKeBraCW4wCGQY3Kf4hirjFPcuMHLY4V7uAJ8jBx7V9efACQS/CPQXUYB+0c f9vElfJGq+D5Y7SO50qTJx80D8MD7Hv+NfWv7PcM9v8ACDQI7uMxzDzyyntm4kI/TFdDjBK8WTyu LszqfCf/AB63f/Xwf/QEr5b/AGgrwj4p6zDEImdTCCrLk4MEZr6k8J/8el3/ANfB/wDQEr54+Nem lviLrd9L5ZCCERIigO37mMHLVx4tXgenlMuWs35fqjy/TrS8kX980McfV8oMgf0qW6soZCz2v3R2 Pf3q/ptqJkfzDiMNnZuJ59z3qa7jURlEGFxj5a8txdz6D2imrnFXHmJJ5cibiTztHAqJ5BsdFOcc kd8e1W722eNzIgZ9gwoBz+OKpRi5J5O0ns1bJJo3TilcUSSwshgkKqcZU/1p1xo8l3IZpmjO7nLN 0FIqMrhpWTI5AArbttAl1O3W4t1DFzg7n2gYrejozxM2qOcUkYFzpyWNtcTLNCx8tl2L3yMVzejQ Jc6zaRSsVQyAsQM4A5/pXpsXgO6uIJElmtomJ4KFmwPf3qXSPhYlrdpcXGqF2XPypDgfzruU/dsz wErNsy/inq9nrFoGgRklFx5uG9xg103w2nXRvB8AuIVjnZ2k2O2CwJ4OPpV6bwBo87xPdvcSlDkA MFB+tbFt4b0m1BCwM5bqZZCx+n0rixFH20FBO1nc2jNwd0jDPiD9+0s9wiomdiAgnucA/wD16xbL V4by9RbdpTOx/dlk43erH0xmu8j0TSYG3R6baA9cmMH+dW1jhhX91DFGP9lAKxpYVwkpOV7DnNSg 423OJ1m3uTotxAkDSu3LMuSWOeTiuPTw9q04zFYTYP8AeGP517FM5YYxxVcY7V6dXEObvaxw0cGq atc8/tvD+sLGgCGHAGR53/1zVpvDmqSld9+sYB5Gd/H5V2TkmoH3Y4rzXShe9j0k9LHKDQpLWTzZ LvzMfw+XjP45q3Y29tJpwYQ25fYMl1HOKvairhMjrXOWlyfJli3EMpZQfTrWcoqDVj08DPmUoeRd 1tra6aP7SzAAAKEzj6fSuWvtMWO8d7cgKwyVPrW20hnggZcNxznrUktmHXe7Z9gRitcPja2Hl7kt Ox2V8JQrRvNas4W9t7jbkuGwcfKM1Rgs2eSQOSNp79663UkjiB2FBk85NYCN/pLKzq2Rxtr18Jja larH2jueTi8DClTk6aFghCDAAFWLdgvHalcKqju3rURPHHevoU+x867tlHU38yTAPFRldsAWm3YI l54HYU5ui5NclV3bZvFWSSOh8DXGzUZLdiNsqZH+8Of5ZrupQBE2fSvKbCZrXUbeZOqOG/xr0fTr ptSuxaqvlhgTu614mLh7/Mup1Uoxe5yss3kaq6g+oyfrUmnzAahcFT12kH8Kq6wrJrUked22R1zj rim2fy6gwzy0Y4/GuFpJ2PapSTil/Wxr3reYTyPyrmZrh2JztAzjpW677idylQfWudl+WdhxtBIw f501GzN6U37K6Wp7J8UrmOKz8Bq27cfCtgeEJ7PXC/aA3RJfb5MV3PxSlYWXgPYgIPhWwPJ9nrgX mkB6Jj61u9z5uprJhJK2P9WR9aqNOJV2spwrdjgE1LI0jLgAHNVgZRwkA/75pkonRoSQfIBPu5qd GYn5IYvyJNQJHdEcDA9lAp40+d8kHk9fmpASLPJLJIiiMbMZwgHNTJI6cm4CZ7blFV002UH5tn51 ai04Y5K/980XHoDSRjLSXJJ9pCf5VHLdRFE8hpJCWAYc8DvV+K0RcAyEVZjsomOcFh9aQ9DNSKGR c+XIAexWpEgjQ5W3LjB4JFbcVvEi8Rr+NS+XGB9wHFFwOc8kCPZHaeWuMZzj9eaimtS6ANEmF6AO a6G9szdIBwAO1ZzWcikqpAA60uYDEnWQAIqRgDgYHSratld7cvjknvT5rZt/ANKsG0/N0obERRR+ Y/3cfSnNbMhLA8VajCp0JzTywY45xSuItaVe7IxHKeB0J61riYED37iuaChCSDz2qzZ3ZhO1zuU9 vSmWpG6s7ZxipPmYdahiwyqynKkZB9anHFIu40qQeTSEZpzZPJpgNArhtB4ppjB7U/3o5NMREUA4 xxUTQjPSrXQ0EDvQJlJotv0poBHSrpQEVC67egoJZFHI8cqSRsUkQhlYdiK6e01GDVJiuBa3jpgj apDsPQnt7Vyzgk1BKuOtUpWHGTjsegxaWIotzj983LhT8ufpXu3wqjWLwHpiJnaDNjP/AF2evlrw 5LfG4cCWSSELgBnPDZ+vSvqb4Vrt8BaWMkn97kn/AK6vWyd0Ntvc0PCf/Hpd/wDXwf8A0BK8K+Mc 6x+OdYB2kgRHB/64pXuvhP8A49Lv/r4P/oCVt1Fan7RWvY6MLiPq8+e1z4nku2eB3K4IGAAazJ76 UxEYZOMfe5z9MV910VzLB2+0eh/a/wDc/H/gHwBcecyRjEjknr6fWqEsVwLiYAEZXK+lfodRTWEt 1/Aylmbk/h/H/gH52SxSM4L5A2gcnvXfeDpP+JaVXkK9fatFaRoNdTnr4v2qta3zPlG0LGU/SrSl /MXrjNfUlFX7LzOM+W7rcGUj1qZzuIHpX09RS9l5miml0Pmdhx70xgNtfTdFHsvMXMux8sysOfSo fMUCvqyih0vManbofJzyL6ioXnQDrX1vRU+w8yva+R8a6lewKg3zRDvywri/PT7dOYWV0LZBU561 9/UVMsMpK1zehjHRlzWufn9Zyk2BG5lCsRknHetezm8yxKpLkYIyM/1r7qoqfqnmdCzNq3u/j/wD 86rxcxncGJLYGazo4mE6yE7VB9OvFfpNRXRTg6clJPYjEZjKunG1k/P/AIB+cjMGAyRgUIvTpX6N 0V639of3fx/4B47pdmfmnejM3H0qpcuQwx+NfpvRWMsXzdC1Cx+YokLdTXY/C97h/FEaOzGPynPJ zzxX6E0Vz1antFaxadj8/b3DeIpSSMG4cZ/E1VnhEWrAKAf3fUfWv0MorjdBvqd8MdyxS5f6+4/P aRuSNwOBkA9cViXMSGR38xQCc9K/SSin7HzLhmLhHlUT5A+JiJ9h8CEgEDwtYAE/R64nanYLX3rR Vund7nmSV22fBLFe46UinJwK+96KPZ+YWPgsJ83OcVMnHAFfd1FHs/MXKfCaR7zkDin7QOCOK+6a KXs/MOU+F4ygPKg1OJeMIDmvuGij2fmHKz4jSTAO/g9s0LIXOARX25RR7LzHY+KxKqrjPNNeNHX+ 8T7V9rUUey8xnxC0AH3049qheBW9cV9yUUvZeYrHwi8QToDimDI6ivvGin7LzCx8ESDnOeKjaPjI Jr77oo9n5hY+ENN1BrYlZstEfTqDW/DNHcRq8bZU19oUUez8xrQ+NOScdqTGDX2ZRT9mO58ZNkDI oXJr7Noo9mFz40x60navsyij2Yj4xzUUmTX2nRR7MVj4n5HB61YsI7BhK2pPIAuCoTv619oUUezC x8g2VzaxQudLgJQsBk55PqR1FfSXwpBHgHS9z72/ektjH/LV66yirSKb7HkV54utdJ1a4sdM1eaP VtytLZyrG8JJUYwCQ4yuOhq3feM7/UbE2xhjgdgAZIJZFbP+ztII/OvE/i/pEUvjG9u4YmjvSUdZ lfBysaYI/SvXNF8Z2M2n2ZudEuLWby1Yy2TbCCQMnjH5HNSpptoJU5K3mWtPvPEDW8VoLu92sTsM 0m12/wCBtgn860prLX7VkN9f3sMLdZEeSYJ/vbc4qtf+MrKK1bzLoXcY6QX9srE/8CXH6g1zM3xG WLV7C10O1lsvMfEq/aC8eD6IwIH6UOtBO1ylhKjTk07HeQ2F5MEnsNZudVhA/eRw3piYH26/kSKu fbIkaKGHU73SrwHiLUgXWU+mWOD/AMBaucmv7vVfLEllbNeHhbqGNo5SfZgRVyWLV2t1tdWvGigd cf6WflI/2mAIz9TWpjotje1DULmKykh160uIrZhze6bMxUe/ykOn6j3qj/bE+lwpJaapbavZbciK d9lwB7MOGP8AvAH3qjFoqwoPtb3DWYHyTWqedHj8CSP++aIbbS7W182RIb+2bOJre5Ace/lsRz9C fpSsHMw1jXopJRfaRfajbagVANtLmSBvYoTgH3X9aNQ8RX+o6Nsl0+5tt2M3MM7wBW7ENxxnsTg9 6e+p2FnbbYfseoWjj5o2hMM4H+8BtJHvj60f8JB5Uka6U11dWzna1tdrvGD2V8lvwOadhX7sd53i 2206MzSKIQAGmCCVwP7xC5yPpVCz0fxFbW82oaX4jk1RXbKxCZnwvfG9iM+1WvP1O11CJ9Lsm01J Cc288uIX+itjafZcZ9Ke+n6jHqxuru7tdKnk+UyxRnZLn1P3S315osMzdN1LXtS1Im21eD7bEDEb aZjHnv8A6sjBb9R9KnluPGD6smwxm7twQYBIFV0P8RQkBvYjpUt94btpNSgm1vUryO/BPlXIK7GI Bx82OMdcHHtWXcXAi1e2tr7X5vMQ5huUYSorYOTnOV46j+fWgRbutX8Vz38JFnIs9k+Xig3YcEdH UN8w7g/ketVta8U6/cxiM2FxbTW0iuTbiVT/ALrgdQR6/WrEgvJdWiePxJaG4iU+VcuoAKn7yk9j 7H6iuZ1LxlrWn/Emx0ciOe8uodkd7CUMbAknDgD7ox949M0C1NrVPH+oXNhLbvZGzmOMSxzOjIw5 Hb9O9Pb4lM1gYJbN95jKGWO62tnGMjjrUq3fidrl9TghtJXCNFLgp8wU903DJHOD6VUmvtcWZtUm 0O3liliVSWt90ZGeGxk884osDk+4aL8SpLbT4oby2nupVHzS+aPm/OjS/iMLQXC3cV7OryFo8yBi qknAyT6VmXt3cx3/ANou/CtsFkUJ5LWjomeeRx1P9Kzbi9sReNLceHLdIyoXyQ8kYB9c9fT8qLC5 33NmT4iwvqs7zf2kLIqAsSTMGBxychhiub8WeMFuWt49D1HxDaXHmBiWv5drJ0IxvPtVS5u9Fa8L tpLJGy48uO8bg+uTn8q5/V2tJdWgNhbzQRrgFZJfMzkjnOBSsS5uxKnivxELOMnXtWzvIz9skz0H vV7xx4i8R2vhbSbu31vVYg8dsrSJeSKWYrKTnB5zgfkK5mT/AI8o/wDrof8A0Gtj4hTxHwBpVtuH nr9jm2dwpjcZ/Om0ZwbuzM0Txd4mmuYA/iLWWHnRAg30pyC4B/iq58YPFfiOx8eTW9j4g1i2gW3j PlwXsqLk5ycBsVzPhsZvrcdCZY8f9/FNX/jeMfEm6HpbQ/yqJF027Fa18X+KW0rUHbxLr7OqRbW/ tCX5CZUB/i7gkfjXX+PvFPiC1svDDW2varCZrLdIUvJFLt8vLYPJ968704Z0TVOeNsIP/f5K6n4m Z/snwew6GzYf+g1cdkKVyqPGfibaP+Kk1n/wOl/+Kr2P4Pazqt/8P9eu77U766nju9iSzXDuyDy1 OAScgc188Ifl617z8E+PhRrret83/otKGTR+Lc8Yn8beLG8by20fibWxCZ3VY/t8oQcN/tYFX9M8 c69bWN1IfFOr31zCELf6fMYo8k992W/l9az4dPhutQuJ2UeastwVb8G61jaJomoLpmtWttbTXM8g hWJIULlvmbPSqg1Yc/evr2/M3/8AhYHiaSXzG8Sa2dzZIS7lA/AA4r7E8D3El34K8P3M8kkss2n2 8jvISWZjGpJJPJJr4003wlNbKra7eR2pHJtrfE830ODtX8T+FfZfglUTwZoCwh1iXT7cKHILAeWu M471l1Naaszx74+a7q+meLrWDTNVv7OJtPRylvcPGpYySDOARzwOfavM/H3i3xNaeMHW28RazDbz WttcJHHfSqo3QqTgBsdc13f7RQz47svT+zY//RsteY/EuI/bvDd0R/x8aPDn3KFk/oKpGDk+eSN3 wh4w8Ry65pi3Ov6tLEbyMOj3khDK2Rg5bkdOKZ8YfFfiXTfH8tvZeIdYtrcwROIob2VEBwc8Bsdq 5nQZ2truK4QbmhkSQLnGSDnFHxavr7UfE9lf6pYLpslxaIY4fM3koGYBicDrzxU9TSm3Y6jWfF/i IeAPC97H4g1dJnmuIZpFvZA0hDZG47uePWsqHxp4nK8+I9ZP/b9L/wDFVE6i6+Dlk4wTa6u6g+zJ msC2JAx1FNGU32PevgH4g1bVdT1+DUtVv7vZZo8YnuHk2HcQSMk4PIry34neJ/F8Hi+6h03xDrcU Kf8ALOG/lRRwOgDV3H7N7/8AFW6vH/f04n8nX/GuM+IkIXxze8dVBoZrCTUEcrpPjbxk2rJbTeJP ELO6OojOoTEk7DjA3dc9K7DSfFGv6ZbWs+peJNdklR3zanUZZCxIHyyMWO3HXHJFZFtpsVzcxSEb ZowxRxwQdrCuXeKbS/DBW4JWSO/Cg5+8GjH+Fa05WV1v/wAMZSvN2/rqdzqnjTxjq91G8PiTULGN AQsNvO4GPc7ssfc1X07xj4nZNQ3+JNaYooIzfS8fOBx81UdA8PatfW8dyVlsLU/8vN3J5SEe27lv wBqpYx+XNrCbg+xGG4dDiQcis23J3ZWysdDZeL/E8t3BGviLWGZ5FUA3spyScf3q9L+Kmp67p7ae sWsajZZtV8ww3Dgs+B2U9c5614ghII2khuxHUGvYvi/FJ9i8OSREeYbSIsWY8/IKicuVXNKabTOc tPHer2zh01nVWfbgie7kYfXBOKhn8b67Mzs+t6qXPQRXkiD8gaxHm2Eb42mI9MKv+Jpq3D7iYoDE ZOMoP61yzqSkdEYpG4PFPiAqS2va3CPV758f+hUkPi/WUVjL4j1uY9kju5F/MlqwXgtwSZpvm7hM sfz6VJB5KJMkQZ9yA4Y5yNw7CpTfcbRsHx54lUbYNT1FAOpN7JI36n+lLD4y8SyoW/tjVVHdpL10 A/8AHqxp1ljBEbxRDHCjg/pUESMVyW3t3VR/U01JisfWHgKW4uPB2jT3NzLcTSWyu8rSFy5PfJ5N dHkhScngVheAI9ngnQVxjFlFx/wEVvyHZGzY6AmutbCsfN/jXxLrXgrRdVuJdY1K41jW591nbNcy OtpbqPlKrnCknLHHbaO9ZXwO+I2sag76FreqX08+4y21xPO7O/8AeQsTk46j2yK5DxT4t+2+O/Ex 1qPzjIptLcg4WLawJ69jj9BWb4ake6u5bm2KxGzkUxPH/e65rNsTPsi1nnMabppCcdSxrkvHkuqQ oJ7PULyEL1WOZlGPwNSfDLxZa+MPDcV/AQtxGxguYs8xyL1/A9R7GtrXrUXNo6kZBBFW9USePSa7 roP/ACGtTH0un/xqtP4g18D5db1Qf9vcn+NS6pbm1uZI242E8njis2NjNHHgYL4wCen41lZlX0KO r+KvEkUeyDW9Ye4b7qreS/0NZw1j4hSwNINV16ONRksbmVQB65Zq66DWY9LiWGezYkfeaGZHyfXq DUOqeLbCfTriKOG8850KqrQnqeOoyKvk8yLmJC/juKX/AEjxRq0bccNqMrfoCRT7yfxoZR5Xi/VN oXJY3cw59MBuR71oapr0T3BaKBiOMVlzavcOTsgx6ZFVypBzM3NOv9biAZ9f12Vx1MmoTEE/Tdiv e/h3czXfg7T57meSeVvM3SSOWY4kYck/TFfMy3upyJhFCj6V9G/CTzf+Fe6V9oOZf3uT/wBtXqkO DbZ494z022uPFs0l95R3MpjVZOwReX9DnIAHUc1nQi4kErNISpb5Rv4Iqt8TDcDxfdGORYRujVBC AHfKLlmxycYI5pumx2OrWh8q8je4HDeU4DZ9wP8ACuadBzvY9mjjoUEotdNyW+t3Ec0zEERjJya5 nRrmU+JILj5lKPkMP4feruoWOq2hfarT27H5sHn8qxItVTR53vZo96wjeYicbv8AZP16VzKm4TV0 ddSvCrCXKz1JvH+p3AiiF5bX0Dkg+dErbcHFadhreqpA0sF7LHbnIKxPlM+w5x+FeFadfaVrAlW+ kksFYTTRLklVc8qo7HuOa9V+EkRn8KToT91wSCM9R/8AWr1kfMu6N8app8ME013rMMAHzyK7GMY7 k5wP0qfTPEHha7iNzp9496FOHQ9GPs6Zx+NcjqY0mDWJl15VeBo8CLqGPYsPSqPw9sdMtbLUZdMl QX0sxkMWzBVQuFIU8Yznp7Zp2BLS56nba3Zs4Ol6Q8+/78M8YkwO+1hz+YNacGoavLDJ9l04fYB8 rQ3B81U/kw+nNc3p1vrl3p1vdz6lt+TegT5WA+oA/nVWCY3jTl4r+5nRtrOz5U49eCf1p2Fc6xZb 2KAx3OsWUVjP0UMJ1XPbByQP0qt5umLC1ldazdyoq/KkOWiYZ6YHNYkV7ZxTMItPtuFwVlZpcH1z kVbh1K92Itu3llOUMECq2fcjmiwXNaD7E1uJrHQry4lXg+eC8R567iRj8vwrSMt5DIgTTtKsLeQH 93eTKynPpgcfTNc3N/aT+bPNHfSKV+cyTMufc4xn6VYtNIu2WJhBaQlf4jCZCfqGyKVikxf3dvLK 0d7pN03QWS2jSgH/AGCMk+3NcLocsGoeL9evZIbVfKRbOKKQSJ5eTlioGcYI5DV6Bf2c1hpN3cXe o3Yt7eNpykY8tRgE9uleGR2viU2+lNobxC81KR5C0xK7mY8Atg8nHFS2WloerzfZGZEFtZ71wWaO 9Kh/b5hwaqPHagkrBcpGR0S7RjnP0rpYvC0X2OFboTi58tRKyP8AKXwNxGe2c1BN4Tix8ksoH+1t NO6M3E5i4cheLnUo2U5X5wQPQ8Ec1Wkvbz5WXUr/AHAYG9m4B/4FW9H4cdruSETxDaAeV9fpUj+F LgA7Z7c/8DIqk0Q4s4u6vL9ptxvJGyMZY5JH41iXkyzXEa+URPHI3mS7siTO0jjHGOa72+8N36HK pG/+7KDXA3sbQ3sqyDDBxmkyWmjLI3WY9pf6Gt/4hWcY+HFpdbB5wXT493fbtkOKxlTNk/tMP5NX SfEeUj4XWluLeUrssJWnx8g4ZQmf73U/SkKC3PPfDkLTXcMUblHd0UOOqksBkfTNR/FbTX0rx3c2 kE09ztghLT3Ll5JGK5JJ/p2q54OIOraeD1a6gA+nmLmpvjO7D4lXg3N8tvAw56HYOahmtPSJy9ob 1dLvQEjMR8oP1znzBt/UV2nj8vL4U8FvIoVzavuHoflrmLFj/Zd4CSd7wZz/ANdBXV/ELB8KeDye nlSD/wBBqlsRI4xEwte9/BobfhFq59dQf/0BK8IT7vNe8/CPj4O6kfXUJP8A0FKb2Io/EeJWdzfQ Xczw2MFxAZZgBJKV3ZJBzjmrU+p+ILmHyUW2trc5/c27mNPxCjn8San0obrItgH55P8A0I1ZC7CB gcKay5naxb3OS1KXV7SEShY2HcK7HH6+1fbHw5laf4e+F5ZAA8ml2rsB2JiU18lvhmj2jPyEn8j/ AI19c+BVC+CPDygAAadbjA7fuloika05XPHP2ikU+KNMcD5habSfbe2P5GvMPiQm7w54KuvSC4tj /wABlyP516l+0AN3im2/2bKI/wDkSYf4V5344ha5+GGgSIMvb6nPGfoy7q0RzP8AiyOU0hwjNJ2Q K35MtdT+0VCjeItHmcHm2dFwM5IfPP4NXHWqvHDIMchCeT1OOK7v9oNN1t4auv74cZ+qRtSaaepp T2MLR0jb4Qa0kbZMOpQTMu3G3I2/j0rBtRkVueDszfD/AMawYyUignH4OawrI5UCnExq7nqv7PL7 PiFIn/PWwlX9UP8ASuZ+LwuIfG8ptIklZk+YM23jJrb+A8mz4naeuf8AWQzp/wCOE/0qD4vxmPx4 OPvRt+jUpmtN/uzj9M1G+t5EebSZpEHLCKVckd8ZrUTxVPaqFsNCeyCnO9oBPID0zvbofoBUmnru jbj+GrYXEhGP4l/nUXdrCVk7mFc+LoGuBLrCSszHmSZHJPtzmqenuktzq7wj928Luv03Ait3VNPg v7fyLlNyMWHuOKw9MhFtdajbjkR2sig+uAKVOKTuVJ3RTlcxxO6gZVSwz6ivoy+0KDxlpOgfaGaK SXRobqPaeA5VOPpya+c5PmjceqkV7hrfi6XwV4c+Hmo+V51sbC3t7uMdWiMYyV9wQCPXGO9OaLo9 TlLjws1pLJGryRyK2GDDJBrOudFuU+7IT717f4s0uG9t4tV08iSKVA+5R95SMg1wV4pjWVpUAjXG 0/3uP8a5ZQOlM801jztMjUsgd3OFUEZPqearW95PdQf6NDLPjClYYyxPOe1S+KPLeS6uNXuXsrcJ tRlQs34AA19DfC7S18PeC7GzgmMwig+1b2TYxMqrIVI7Y34HtVU6dyZM8BGgeJbmxkvE8OagltEp Z5JYWjGP+BYz1rFMWsS3CQyaVfxxswUuANoHr8tfWPi67SbwVdTMpHn2wYDrjOO/414lLcW8bN8k hw2Punkcc/qfyq3TUQinLRH0X4GMQ8I6NDFKkhhs4Y3CsCVIQcH0Na18cWc59I2P6GvHfAmtvptl drp7oUkdSWZOcgV0dl4iu7uW7jubslfLbChQO3sK05gasfKHibRLu78SapLEsbCS6kIIlX+8eozW 14JsJrOwukmiKvvLEdeAKwrhRNr+pvgf8fMrAj13mvSfhhpMV+s9hOW8p+WMZ2k5qDK5wnwf8WXv gjxgLi6iuF0i+by7xdhwoJ+WT6rn8ia+y1C3EAZWDo4yrA5BB7iuK074LeDYAoFtqUmOz6hKf5EV 0mna54T0W0XTLS/gEVlmDy1Z5ihXqpPOcfWtEVucV460cLJ9oUcdG+leezLaMzRz3McSocbc4J/C vXPiJ4r8NWWl7bq7jglnQtH5kDrvA4J+72r518Wa5cX9rHbeC5FuLqdyZJYGwY1Aznnpn19qIqN/ eCzeiOy03SrO+kZbd/MK9TjpWoPD0cYzx+VeTfAnXNZX4gf2VeyXE8FxHKZkmO4xsozuyeRyMfjX 0RcIqj7orZxj0Jd1ozi20hFPTj2FOh0mPcCVroZMZPApsUeT0qeUlspQ6fAg+4K9i8CIsfhSxVRh Rv4/7aNXmYgyABXqPg1NnhuzU9t//obU5KyHT3Pnn4g29xL4pvioJQYZSwAA/dKMAn3/AJmvIzoG qW8qtDdW0Lr91jdIhH0+bNem/EvVJ7XxhqMSSBov3eYpBuQ/u17H+lcYX029Dfe06cc7h+8i/LqP 1qeW2prKS6HRafaeOdBVX16zSS0wGL3CyBtvqGVCD+NT3Gp+GdaLW0jRSuwwUKY59MnGa7n4e2er aheQwL4uvbWOWMbfLd5A5Cg8Fjgda6OX4KaVFBcyJdPc3EituF1EjKSe44yp68g0Dt1PA9V8MWUE 5j0+V4yiqWSUZVC3QE9h71Xspdb8NzmS1muLUnq0TZRx7jofxrWn0zWZPEl0NImtorYISElRnURL 8oL7QSB0+mak07XEh055NRtpPIibZMFUuIv9odynv1Hf1pkNGHqOrT6neyXl84eZwASowOPatfwT diHxTprk/IZAje4b5cfrV86HpGt2/wBq0q4iZTzvhbI/EdvxrCvtBv8ATzuRfNUchk4NVdkWPrHS 9Iih8OwLKyBUi5LdAKzvC2mW9xY332aZZE89seW/TgdRXzxp/wASPE+m2htI9Tn4jMaecNzxAnna T0PGMnPtVLw3rt6uszPLrH2ETK0jXLNJvZ8cAleuemaVykk9j6I8N+HoXvrnzo8spHUA12kelRRr hCw+mBXz7oXjfxFoBE4vLa/tpAMpO4kJH+8CGFeh6P8AGPRpwE1a3msZONzofNQflyPypcylsPkt uddrViFspx85yh70tpCpgQ4foO5qa01rStesnbS7+2u1KnIikBYfVeo/EVoWECfZozz90d6B2PN/ i8zDwqmm2wcXWrXUVlHz2Zst+g/Wpr7w1ZLdQQzWaTWa7VjRxkZVeDj2xWp4v06K88Z+H5GDPHp0 c120eeMnCKevXJ/SqfiHURo+nG7mRpI4JBndnIz3J59a4q+Po0JqE3qzaFGU1oQpa3+m+LdPstJ0 Rm0i6i/fTG4YxxsDy2052kD0+9uHpXX3mn+TEX2IcVzbeILhNb0tIMCN7aaTGeG/1eD+tS33ii5Z bqIQK3kOqEjjJIB6H/erl/tvCrq/u87FrC1GLap/xM5fkTlR1NdRb6erRqx2gkZ4FcfbXxM7sFRX K5z261fh1i6eOPMoUnPynjH8q5KnEuFi9E393+ZX1Oa3NrUbTyoxtZeTjpXzl4uQR+IL1R1EuT+t e4abq11qNu0s0nluJ3iKgfwqxXP6VzvxLsrRfBuq3ZihWYbSsqwjzC28AZYf55pUuJKVXELDwg9X a+hlUwrSbbPHVUC0m9pR/Nq7Px+iP8GI95wqmwyfwNcaozZzZ/vqf1P+Ndn47Ct8FF3NtQvYBj0w NwBP5Zr6ROz1OGHU868L2Ij17SQCG3XkHBHQcN/QCq/xp/5KZfj0t4P/AEWK1rC1srLxDo66ZcxT M+pW4BFx5jFS+MlQAOnPXtWX8bAF+KWqKP4YYB/44KKsoyd4qxpFWjYwbE/8S+cdjJAP/H6634gc +DfCBH92T+lcRA7b7dQx2tIu4DocdM12fjp1fwX4W+bBXzBjFJbIykcnGfkr3f4VMF+DF8fXUJf5 LXgalQi5k6jPAzivbvhrO6fBu4WOIuhv5vnLBecLxinJ6E0fiPOtIhKaLBOSCsskqAd8gg5/UV3H hnRVs/HUunXwhufIt2Zsrlc/L2P1rgbS/RPCkZLqHtG3rGp+Zi7ck57DaO1dD8MvFNxqXi691vxL d29tbTW7wqRjDy7l6hehx24rPl0uaKzbRd+I4kfxH5GmWxkmCKPLRCflCZ4VQT1xnjpX0d4KWRPB ugrMhSUWFuHUggqfLXIweR+NfOXivV9Q0jx1eXWkXj2lzGBGJY1VjtKrkYYEdq+kfCdxNd+FdGuL qVpriayhkkkYDLsUBJOOOTSVjWG5438esnxXGB/0DY2/KZ64TWG3/CbUTxutNShkHGcBgBXc/HY/ 8Vtbp3bTAP8Ax+WuKaMXXwq8ZIOXRbeUewBbn9K1Tscsl+8ZxSTrLZuhgmUG3ALlOOGye1dr8dQs /gXwrdqMKWT8N0I/+JrmW8Swana+X9luhNJH5WBdEJnYQOMYwTXR/EMw3HwK8M7Jo3mtnhSVQ2WD bWU5HUHp+lFSo57mkEo7HOfDL97p/i+1P/LbSXYD1KnP9a5yxbKr710HwkfPiO5t8ZFzp88WP+A5 /pXN2LoFAZGGF4AbPPvSjsZVEehfByfyfifoBz96V0/ONxWv8b4wnjSB+53r+orlPhzcCL4geHGj Xa/26NQS2QMnHI/Guw+PKSx+KLRpTGf3jjKAjsPU+1TM0pL3LHN6LEWtbibI2Qhcj13HFdl4f0SJ fE+mWupLHPFdW63AUEgYKFlB9xxXGaPK8NtLBcBoYLlWYMyEbmjUsqg+5x+davgvxXNc+K9Hm1Ro 4rWyH2eeeXC+TEEYRjA5Y9OcVKWlyorWxf8AHiWmleIp4ba2QQgjCqVUJwvAz14JP/665Sz043d7 4jvLaOWRbeJywQDCoyfePsK9E8Uatd6P43vbjTWtS0kaKTPAJVKlVPQ4x0Fecw6r/Z+qeIrKRZjL eo3zQsEQZUsQV7rz0FES2lY5p+B+Fex+N4v7S8FfDmEyeX9ritoTIFDbQw25wa8aDBhz0Ir074hX str8IPAN1A7pPFbQMrqMFSAcEH64omFJbnrek32g6JFqelJ4gF7LblY2tjHkQyBRlQVHU8EjPB9K 8x1fVdOvrxDb6isbLmZYFjJ3AfUdK86+H3i628O6/DfGwnmj8phOsbKDLJtJD5PPU5Pr3zVmXxPa a/4qj1J4ZhPAJHHIRSMHnr05/SsG7nQaniLXIjqVoI2to4pX8t5RMCI+MqSfr1A5HWvadS8TRJp8 9zpZlmWSeOOIbcGVFWMMq5HGcEDP1rwjTfBF74o0mLxFPPBa6PDdzSNcTEkDaFUAqATgknnFXNQv bnUfCem6JbW8Mo0M/PcCU/vUC8HkDP4V0UIp7mNaUoLmS0PaLrU5tS+FYurqyazHlLEqM4diAwUs dvA54x7Vwegad4Tv9Fv7rWfF82matHNMBai9jjChfu/IwJ5/XNUdF8V+LdY8IDSYtHTVLSCNYsWT JEY0XGC2T7DnvWfd2cPnQxz2Zju5dxaOeIE8Y5z0PWlJpMqKcuh1HgmV59DilkYtI6qWJ7naM1vQ XUen2t/dzoSFXANcx4c1WwtLhNJmmEd9K+Y4dh5GOOQMdj+VXPEut6aW/sSSfMl7Cw2J1OOT+WBU xcU05aorlb0R5hq2m2llHPcW5dpHcu5ZgQSxJ/rT/BPj/wD4RbUXa+sTd25IyYWCOMfXg/pXI6/N erraxS33nWMbZQqNu4EZAYDjIPH4VTuGDSEiuvFU4qScItLzOWClHSTuz1W8+J+ufEPXRopuzoej 3qvbwxWrFX81lPlmSTqRuwCBgYNWfhjdvpUtp4cutHl1jU5Zf37SEiO2U8bFI4Xoc8dc15/4StoJ LxZXwogXzSfcfdH/AH1il1LxHd21zYXKXdw7vCWlLysvmsWO7dg/N1PXPWuaNKdWShDc7KLgrua0 /rsejfFfxDY30b6Ro9jHHbwZghYMAGGeSvHQnJ61ysutf8IxZafaWUcT3ip510CMgMRhY/wHJ92r jrnXLi6neR7llyMYDE4HpVITqThG3dzXt4LKmnzV/uOatWV7U/vNZfFV9a+K7fW2O64V8yCMCPzE J+ZeOx/wr3bw74m0jxLZNPpl5IWTHmwyDDxk+o/PkcV883SWMYUyySyyFeUQY2HPQk9exrV+GN59 i+IGnQR3GIbxWhYf3sqdoYeu4CrxtKFrxVreRnFuS1PfJXjV87yQKWO/gQjJNJLaMWOajOn5bpzX kdSzWgv4DggmvU/CTiTw9aOvQ7//AEM15DBZqoHavW/Ba7fDVmPTf/6G1E9iqe58k/F6c/8ACwtV jxwPK/8ARSVxNzN5UBBP3yPyFdt4/hGo/GbWrS5kMVlFHHLLIvVR5MeOvuRXF+MrSCx1Z4LOcz2q AGOQkHOR3xx1zWftI83J1NvZStzdD6X+HEFjJ4c8PpclcuonChPvfu85L54+7j1AFdl4m12bTiYN LuVkimhOGly+wnjIPUjp3NeCeBvG01v4fsdIe1tpYVgbbI+4NnYykdR/C7U68mlsZ57/AEVby5tH kCuZFcyLJjuCMkep6UaXsN3tc6fwnbnQvGVnqWoeZJYwxOrtANzbuCp29xmuW8HmxXxfqdtq73LW MrzbI4eZFySVyvp6jpW3pF7qt+S4sd9uoDGRm8psk9AG+9XN+N9Zu9I1uGW2tIR5Kgl5E+Z89cYP Tp+tTzq9r6i5Ha5kavpVnFctcaaZbG9VhmW0bYSD1yvQ4pdP1zxFbsI72yGqR8DfBgSn/gP8R/AV c1JLm5SK5+zS2sxHmHnfGSec7scdehxVCSLUZbZ3tQUnXqgGc+6Hpg+lSqya91lOk1o0WdQ1Cx1G G18u3KyySskiXMZRk2jkYPfJFZd3opGWt3I/2W5FS6gTqkTQajHLfXsEUauPKJKZBJO7PynnGPas mR9T02crp3niDqtvesGwPQNwacaibsyXSdrj45r3TpldC8JX+JDx+dXZ9amviFvJn+Zk3yAbjtB5 xk9fxxUUPiG0kxFq8DWch43k7oz9GFWJdKtrlBLaSqVPIZGBB/KrcU3cSujttG8O22sq1z4Xv0lu IEJMIl23LkDOVjOG9uCfavUPCeo+MtIsVaSIa5Y7QQBJmWLjoejA+xBr5sNrdWUgdMkryGU4YH2r tvC3xX8QaCkkQuReIRjbdgsV+h601tYo9Pi+JujS32p3GqR3NpdTOsEI2lhHGg7kcj5iSeKb4k1v TtW8L3Qtbi3lW4KQAxyhtrFgBkdQD61wdv4w8NXvhq2sdSs7g38TEs7xq8bd+G+8MsScDHWsd/Dk 2pWovdAsLtn3/L5bb1x1yD94EenP1rysXg6eIqqTTuuvT80dFOpynqF7dx2ninT1KQxoLSZQqHH8 UXXj06VpBYhd3cnmzSNcMJdoThMKowCeCOP1ryC9vvFXh3U4ptTWW6ljhxi4G8KjMowW4IOVUVua b8UNOupf+JlDcWTY27l/eJ7dBnH5185j8qxKs4RTsrO3+R20q9Pqz0G0uvs+qmBHEolhaYtICoXD ABcenWtSzkZI4kzG5GWU4PXPt9a82u/Etld69atp92l15FozvNETwWYfKP8Avnp9K6HRPFNvIll9 sWW3ZlO7IJUemCOmfevJqYWtGF+TXro79TaSUlzp6HT+GZpZdNWVUEAe6mZVl+dj+8bqRjOfzqL4 m8fD3VjKQxwhAVcYPmL7/pVXwbdKdOubdVbMN1KYcd4y5KsPrk8DmrfjWzvdU8IanZWdhftcSwny g0ZjBOc4JbGK7MvoYiGLU/Ze7fez79zhrWaep4ikg+xTH3X+YrrPiBdmT4Qy2iwny0trCVpM9y2M Y/rWLqvhXV9G8Oy3+oxRJGyx5VJQ7RsWUYYDp39a0fFcjN8KbxSflOn2bEe4K1+hHlxg4t3PLNIu pbOaCW2z5yYZMNghgcgg9iDSeN9SudT8QHU7u1nMlzDGrNuBG9RgjNVtJcPc2ysDndgEelM8ZSTf ZbRYUc4mJ4XPaoY4LQzYpil1FJ5LgqwbaSMH8a9B8ZBh4L8MLIMP87Ef3cjOP1rgvD0dxNqdt9ti uWtYSZXXy2+YKM46d67PxXdyXvhLRLiaN4neeU7XUqRknt2qomdRWOXB+Wvb/hw+Pgq+epv5z/6D XhoI217V8P22/Bge97cf0onsKjuefeG3hVyi3cbiO1iuGZ8E79wxEM+xNM8XT3Hn6fcTW5htY45I jKuEPnrISC/dhs2jB9OtczaWF0+kNcWtvc+aZ0ZGRT0VSAwPpml1OHxLqu5tSj1G6LOZCZFJyxGM n8hUS6G9JunJyReuPEt3qd/LNc6rieXLPI4A3H8uK+1Ph+/m+A/Dcm7fv022bd65iXmvhSTTI7Ui 2u7eRbsoWbLcKe3Hevuj4dZHw+8MBuv9l2ueMf8ALJaiEottI2lQlTSk9meQfHxwnj3TeeWsEB/7 +Sf4muQ8Msbjwr4vsiQfN08EA+qtj/2au0/aD0TUbjxFbavaKstrb2kUckan94p8yX5sd15A4PHf iuD8ByFdS1mBiCJdPl4+jo38ga0U1flvqcU6clPmtoeY6fJ/o6n1IJ/KtuT7de6LcWazRPFcbZES RSNrr7j1xiuctJDDK8RwQjFCD7Gus0yKeTT7eSC3mYHIBCE9/pRIEmmP+DfnTeMoZJREIoEdHKA/ eYbQP1/SsFk8q6nj/uSuuPoxFb/g1NU0m4hRNNvSZ9U8yVzCwCRq2Bk46ck1ka4vk+ItTT+7cyfq xP8AWriyai1L/hec23irQ5wfuX8DH/v4teoftIYh1W2lJAHn8k9gVOf5V43bzeTd20oODHKj/kwN ew/tTIslgJO3mxkY98/40pouirxZyFrr+ma5BolyupSvq7TrY3CMm1I7dRtVxxjOwHnOeKn8VJf3 en2Xlxh7CKYtK0j+X5kbpsUqx7BkYkDj5sVx3hfwpr0Op2kslgqW0bbwDMmQcEAnnnrXo3ivwxYX mlILZ54VIQvF5rOEfqce2ecdM15uNxqw3Kns7/oehhILmc72tY5bVta1FLtJdV1cF3AQy5DABQAB wPQAVjQTm516WXeJPMiPzj+L92ef0qnqWlyLP5EErS4O5mmODVjRYmi8QRQzkF1hkdypz/yzatsJ UdSCk3cxxMYqVoPQpqxKjHpXsvi28+3/AAq8FzyJEyy2cZ2FPlHUcD8K8T3/ALr8K9t8X2Rm+Hfg q1tpljVLSNi20DK85AA6da2qPQzpLc4W2t4A3FnbDPfyf/r1LdwR28Bkt7DTy3Rv3JBIPbg1Rj0z UYre8afUkYpAxjCjb82RjmqkVxfGJDHcSuCOCOSa4Z1lTdmethcvnioOUGker/DGKbxH4en8Py3I stNe1kuGgtIAAMSdMnpnGc1yHhXTXutX1TQ1udsO9YElK5KeZxn8MCuctNU1Gy5tNQmgOzyzsO35 c52/nVb+27vQZk1GzvRDOW3glAQ7gZXcO/Nb4fGQUrWZGMyivCk2pKy39PuO81C/1HwndaxaaV/Z wglgaylAhZVbauwyDB4Y8kn1NZeq69Nd/FfT9Nt3kuNNuNMthapHtHllo1+fnGenIyP0rpk8PXl8 2p3XiCK6isZYFkiucjeZGOXLBc8c8YFYeseKtM07R9GudPskutRssWcUKqRiMLhZDnnPUZHrVKWt mcbOuvfhjdt597rEulwmLCrcPNjKYznJI29ehrz7xbY6fonkm3u7G5l2kiW1fzPLUnGN2Tgnniuz /aI8OS2+mQ+JbJbsW0oBvog4wkpChGKn16HHcV4vdy502GIY3uUDf1r1cqw3tavPJe7H8yMTOMKW j95/kQXKG6vltxLHCm4b5n+6o9f5VRgv30bU45EFvdQMPmR1Dow7jnofeq+qyst08IY+UpVtvvtx n8qSy0qXVboRRTRRMsZctIcDr0/WvVxST5nPY5Ka2PUNLu7e7s1ns4LNYZQCR9nA/Aj2rkvF0iPr VuJIYWVI8bFXavPtXS6Ylvp2k29r58TeUgUsD1Pc/nXEeMZVbU0ZWzmMqQO2K+Wn8Xus9bBW9pqS eG7O2l8UQRMqmBUeRldd4+Vc9DUCqhdmRAuWLcDpk1V8OzPDdvKh2sYJFz7HAq4GCqTX02TSnKMp zd+mpw5lyqraKsjPuWBkc+pqnpc6weILa4kZ0WCVJBs+8SpBwD26dakuW5JB4JqjZuDdBmI25zzz /SozSs4xSiPCUVN2ke/wfE57oll0kKGPBLN/PFX18egoS9iVkx8o8zg/U44ryW0urfygluJiMc/I w/XIq211MxjTyJ9p+UMUz17k7v1r5Z4qqnoe2stoNXdz1qPxhazKrBmQkcqRnB+or3b4c3aX3gzT riJtyP5mD9JGH9K+NZnuG8mGxeJ7h3KlWBQYGOjHjn1r65+DMLQfDXRont0tnUTBokbcFPnPnn9a 6qVWdT4kefiMNCjrFnzP8UNQl07xn4xtUt7eOXUmtUF3NwwiWBdyL7FsZ+leZ6tthWJVuEmJUklA SF9s16h8XJIp/HGq2tzGWTMW0kgAHyk5z2rhBoIEboL9GVu7KeB/Wo9qubXodXsb0Ur72NjwfqkU GkwvFFGk6DYzLH8xI7lj/Sulj8R3CrukuSq+jI38wa53SNNsLa0JeT7Y6/L7A+mBVe7WIE+cywA9 I05b/AVzSm3K6O+EYKKUtzefxKxYuZZBz/exV5PFDalbrZ3Nt9sGQqgoGYfQ9q4F3sTkQ2glb1kY sfyFb+jKLR4/tEkVoHX5Ej6t+Of0rGs0lzPdGFTlcWmjrJtc1LSAq2lpJeRxrgBGGVx2wetSWKSa tYG9s9Mu7dpCWZmPlsxzycHg8+1ZtjMocRLc+Y75KFxghv8AA0unX+p3F1MkAYuvDJkIiH1xyfWu OpQk/wB9QtG++tvkcSnFLkkI8Op6c7Xctv5cJ+9NGI2LqT3xz1+tMkuGntw7PHcq3AjVMlPfGM4+ orUTTtakjkMl6nlyZ3RRWzvkHqcnANcvJC32nZHguh++AdzLzgLjvmu7DSnWi+d6rqrmUpJPRaG5 YaV9t06RluY0upcqtvDAsnmgDvkZFZN7pV1osyR3sraZ9oQmIxRRNlh6j0/HNWbM3tldGRxCYdrb rndg4HoRzuzgCtsXOj3MDC7S7u5SAXt7hw4PfIIwQc1UZ1U9HzIbUHraxzUNvr0EUctybbUrFmVW ubGZN0eTjLxsAw6+lQ3kcVxIfMCDcx2qepXt+Ndr/wAI1ZW2m/at0kEN3OsVusKFo4geZWGcvlU7 YxXKeOdC0HRJBbadqseswSDzYbo7o5bNs/dBDYJPfjp6V6EJO2pzuKvoYtxpboN9s7Ff7rc/rUdj qup6JL5ltcXFs2esbHafr2NQ6fqN8qNbh1muEJ2NKMLL/ssR0Po351ND4hsLiQwahHJp9yDtZZhx n/e6fnVbiWhv6r47vfEcdnHrL72tVZYpFHBJxyy5wcEZHSue8bXV1qeqw6hpVlDDbR2yRyRWf3N4 5dvL6qCTnA4FWZ9GgmUSQnGeVeI8H8OhrMazvrZyV/fAcgoMN+X+FIe5ofDjTNS8V63JZ6fId0cL S7oyqzAjsFLLv9eDnAPHFXHv9XsrhonSeYqcoJ4yhdf7yg4JHT86wYL6M3ollDR3EfKyBijqfXII ORXbSePp762kg8RaXZ6vH5KRRyKxhljCKQuMAjHOcYGayqUadVWmrlRk47My38UlrZ1aOSKYjAKn IH49RVzw/wDGvxDoheyv1GrWKthPtEjeYoxj5WOePYiuQS5QW+b1JrcMrBXVBKrP1APTaO3HPtVK CaG78zdHnbxjb/WooYWnh2+TqW6rlHlZ7lD8cNH1e0awvbSWCC5XypY58bMHjIYdCOuara7NDL8K 9YFrOLmC3jS1jnwB5qK4wSASMjpwcHrXh8+mo8pEYZQx+XHNQrbXlrHLFFcSIrfLJGGKhvYjv+Nd VzF2ZuaMpN7bgtxu/Lg13WtfElNIgtwdLaXd8mROF6D6VwnhW2u57+2z8434YKMlAeMnH511F34e 0jWJIop5buQxliFiKjNQ2Qo2LK/FZFSNrjTxB5i71DTliR+C+1N8aasuueFtK1BE2CWdsDJOMAjv 9KqXvgqzlhCW9hMrRpiOR5uSc/dIPGMd+tL4jsm03wPpVtIgR47hhtBzjO49aIJXJq7HJlsCvavA j4+CqZ73lz/OvD5W+WvY/B0oj+CcGTjN3c/zrSWxlSWp5lp3im50/wAOW/lW8L+VK0A3E8gANn65 NOb4hT7Ri3t1PfcGP9aji8I6te2McNsls0QJmwu4nLAcn8hRF8OdTbIlhck+ny4/OobibxXcrP4l Os30TXUKmTI8tYQevcYPXIr7l8BMjeBfDjR52HTbYrkY48pcV8daD4Qn0fUo5rpEjyCisdrEE9xj vjPNfZXgxBH4P0JAchbCAA+v7tayppe0djsqSboxu+p5V8fvEd1YXyaXHI0dnLaLNOc8MN7gAD1+ WvGvDtxc2V8mpqA5mjkR4mJAMbgqRkdDjkH1rtf2n9WgsvHun290GaM6bG+FHP8ArZR/SvKoPEkc 0yLgRwLztPoO1eXiFXjWdSP9IG4Kgotasy9U0i9hvriZIyYnkZwV5OCSa7jwp4tfTvDlraG18xoi y5Mm3+Inpj3qjDqttOThwD71l3Ootca0ttaHdGB821N348VpQxtWpLllEwVCMrtO1jSf4s3X9rfY l0eEDzhEWack9cZ6VQ8ap5Xi/UwOhkD/AJqDVseDbOW5e9+yXtzdH51WRjGu7t0AqH4hqY/FLEjD S28TH64x/SvWgcdZLoc9cSbYmPoM17d+0O4vPB0E3XfDbyfmB/jXhl0cxN7qa9z8fR/2r4G0CP5S 1xZWmNx4J+Qc05uyCitzyPQfHGtz6tZWr3EQheQIQsKg4+tel+D9Uk1Hwct3dTK9wZXR8gLkg9sc dCKxz8OLgmPy2SxdDndbqAfzbNbNv4HdNEh0xL0xQxsX3gEuWPUk9Ow7dq8rMcP9ZpqEVrfc7aDU Z3k9LHnPi+Z4bqZreRllP9w5NV/CkrzX9zNMxaX7Ky7j15+WvQI/hTY+YJZ9VupHBzyorStvh7p1 vcSS/bLo+YioVVVUABs/rWuFj7CCgwxHLJ+4eOAgqPpXqvieN7r4X/DpfnI8mEuVbBChmyc1fi+G +gRr8wvpcf3psfyFdBcaRZTaRp+lzW/m2Nggit42Y/Ko6ZPU9e9bzqJmVOLR84aFpupSa5bGVJxE 021nJIIB4zzXq620UemRQiz2NGpUSHPzsRjnPTJBPFdXcaBpkETvDp1sHA3BiuSD+NYOpap9rsIY w23BUNnPXBFedinzNM+kyiTjFx8/0PPNVSaykCsvJ78nNZd79ovYY4Yrd5SrEkIhY+2f1rc1+SKG QpJO7ODhsZGP0o8Hala215dvcSrBGQoDSHbu5PrRh1ZpnTmcpOhKNi9Fb3D26IbCd/bYyCrH2G8k VUWwnB3KdxdcDnr1rRn8SaPGSHv4yR1C5P8AIVnv4o0Sa5hiX7TO0hAUpExTk4GT0q4YVRlzXZ86 6l9D1H4uaxpvibSLLTobuXYJCzRlSqs2MKST1xzgeprwDUNLkttSKm6V49xICrggA4/CvVfiJ4X1 HS9CS+JhMcU0akRMSQScegrym8lZ1DsTuG7P5mvZyuvUjiORPR7/AHDxNKEsLzdV/mc5eSeZdyP2 LcfSt/wTdeVr/KhleJkwfwP9K5mY7Seeat6XejT7mC5ZXcITkIcE5BHFeziLzpyXkeXFWsem6ley mO4WO0ciOMOhBAEjZ+6PQ8frXCeNb59Q1b7ZcKonmBeQKMAMTk1fsfELaleWdo1vKY5544WBlCnD MBnj61r6/wCH5NWigi06GHfbTTxynhABuG0/Tg4/Gvm3puepRkoO5w2nXJhBAwdysvPbNWDOStat 94PuYIJHtLiCcwgGXkqASM7RnqRx6da5qJ9yZr6DK60I0nG+tzixa56nMRXEhLYHpSW1mxYHAOK1 vBtimqeKbWGVQ0K7pXB7hVJx+eK7HQ7WD/hJQi+XND5Q525BO3nr71x4+o6kklsFOfs9UZWiWcE9 iZVkAZfvA/Kw/AipZrOd0k8vftTkNlTgfTr+ldWiouo3ShQI1SPCgcAndn+lNuVQJkIn4jrXjSw7 ve53080nHSSMO1gl/suzi1K6QRGXFvCowztks0jE84Ck8cA8V9e/CCFbf4daTFGcoPOK854MzkDP 0NfJuqIL+OJpEUzRjy0fGSqk84z/AJ4r6w+Dkfk/DfRo/MaTYJRubGT+9f0ropwad7nPWxPtnZKy PmL4t3N6vxC1eO2i3KvlYOzOf3Sd81xpk1U/NNDMO3G0D9a6/wCLt8IPiDqyeW7EGLnfgf6pPeuO E17c8QwKo/vNzXNO3M7o9aknyR5eyLtgVmtbhZ5RHcnhIgQrE9juB/TFVBDBEitdyRs3BILZH5Dq fqaQQ3UTKxubXeDnaV5qaaS2t3aZbfzLi4YttCZVM9lWpSvsaS93WTHRXbMMWdtLIP8AZXav6U2e 4uVAW4sJWRweUzlfx7U5ri6ZkSW4jtg3Ch2Ck/gOasm1ZdKuZ3M0xWRY9qnl1PVl5PA9TitoUpXu 1ocdbEU7WT1+8ydPWQXkc0NlrkjLIGX98AeD057V6BdxXc1jLJZWl8uoXYWKe2jmEYK4yd3PsMEG vNobWdsL9ivHAGctfbfz4rt/D9vPHp/l3WnJa2dxu3yNfGV2OAAOen0HrXarHlt3L8UVvBLbWb6R K0+3DCfVHVf54I9gapaiyxXMhQIZFI2gN8wyefw/rjFLBpht55mTTdDTb8sfnXc24Ln72N3XFPu5 DBqE6QupCsN3lrl4+O+Rg/h0zUyYkZciAXswiT/j6QvNlHdmbuAAcAfkea0NG0+7ku4JjbKqBwWV pCoKjtsQAfmc1PDcfZpUuLcoYn+VhjIB+lb9rdysVOV2n0UCocrbDsbNzpVrf2apGGspVJK+U7GP kYxsJP6Gs+w8LafbrKniPS/7Qt9ytHcQFt0eM5zjDYORkdOK0Le7Y+/1q9HeXHAQqB+NRctaEfiv SNF1vw6n9iw2sT2URVEi+QNH1KNjkHqQx5B+pryPVVsL2zt43gC3KqVZzyHAxhiOq5zjrjjtnFek eIoBJbzXPmG2nVSfMgTJPruHeuKXTkFr5htYN9xH5gnhJZSD32k5FFxnFrZXulyFrCaa05OY870O PUenvWtp2uzSypBqNqpZjgSwHK/Ug8itB50WMMRFND9wyxoSsZ/2hnP6UlzHZ28AuphGP4cxJjAI 6gA+n86rmuAyOC01iKR90MrBiNgPKDPAyOaqT6TPASYW3L/dc/1/xpsFtp+qzkpBPZXcQzvi+UqM 9yO/sauk6pYqHikj1S2/2sJLj2I4amiWZa3t7YPgM8QPBVxuRvqDkGoLu9W4nDx21vbNtwyxJtRz 69cA/TArbi1LTrxjBKTa3B6wTrsJ/Pg1Be6NH1iBj/3On5H+lUCZkG7UxYmUAfTIpsD4DEEMCejc /wD16J7CWLdhN4HXy+fzXrWW8qhiY8hgeQvH6UAdBo14thcS84DqSHAy6OB8pB64zwR3BrsLaXTP tEd3AsLyopCsh5QHqMV5nDdgnk5I68YP5VaimVnDI5yBkEcGk43Jd0d/qGtSPHcIpkAxhW2jGOOf zzVXxdd/avCtk7Ek/aMZIxnhq5VL+YfLIqzRHqrcH8xV/XNWhvNAgto0kjljmDlGHGMHofxojFxZ EldGI53JivXPCjA/Bu3Q/wDPzc/zNeP7/l5r1jw3hvhZYKhKIZZi4B6ncQT+PpTm9BU1Zmd8J5NX N7fHVrhPswhQRrtVcnPr7CvRXaLqZU/76FeafZW2AYGAKt+G7eN/EmnpNGHQShmXGRxyM/jiuWWp umkbviWUJJbFGG4SDjNfSXgli/gzQWbqdPtyf+/a18meILqSbW5CxIXzcYA4yPWvrDwEc+BvDp9d Otv/AEUtXRVmzao70l6v9Dwr9pKDQLjx3YpqiXsl+dNj2Jbtj5PNlwe/fNeD6haaPb6pbwtd3Fpa ysyPLNEzmEgZycBcjkdBxXrP7Wc7xfETTlB+U6VGSP8AttNXhcgScgsXXHTncK6LHLylrU4X069k t7XULW6TcAtxbOWjcHuM4I+hANdD4S0oSWWopeNKk/nCNyj44Xng/wBa5EwElUWUYPqNoz+tdHon mRwrA9/D5a/cRW6evpWcopaopt8tj0GTWhZ2G1DkxgKobLE9BXN/ERxLqOl3SnPnWanOMdCf8ajW 1lJDRsW988Uvjkn+zfD8jDDCKSI/gRRTZhNaHNS/MnSvbNSL3Xwt8MSxkiT7DGA3oVYDP6V4mWBT rivZ4jHdfCjw+VXEa27r5e44yGYHn0J5xVTegUdDr5tRsYz+8vIM+u8c/lUMGrWE91FbW03mzysE RUUnJPTtXApbKFLO+0AcknArU8InyvFGmSxcok65dhwe3Hr161ys6UdVfata2M0kM7gSIcMARxWN qHjjSrONmaTewXcEU5LD24rN1iFZ9Xv1Z0QrI+5nxgA9zXA6ppiJfTSC8EjqwEfGEPHQe2PSiwzv rX4i2d1qum6dHBJ9ov5FjjIUlQWOBycfyrG8T+OtXtvFD6NYJbqYwC8zLuByAfwAz+Nc34c0iZvG nhedHVooLyLcS3PBH51d8a6LLL46vr6O68rcIxtC5zhAOadolJuxvTa/qVsqPNd/ao2wCHRVOfov GKxrh2MJYcAssg6/3jxx9azprS+lUxrlgehwePetUQY0iOG7J80IV6cnBBzXNiUkk0erljblJPsc 54g80X0zxxKQcMpPQnisLYZpHa5ZVAZWx+YwPc5ro9ekVnI5XHGQvWueDKbmOMsAGZSSeOhzUUHd o9HMI3pS9DTMjwjEdpgj0XFQWsDz6rZ7bVoi08YYpwCN46it57ywMhWOdpPopqSyv7QXMcscUheN 1YZwASDmuy58qe2/FJw3gucM2AbiLkf71fMesSCO6mSNm2BiMH6mvWvE3i+/1PRpLaaCMwl1fZEh ZyQcjnNeLam84vCssDid25Q8EE12Zc4xrucuxvVmvqygt7mXcMS/NT4VzGrEhSQCR2FO1Kxu7NEl uIgodtuM9DjvXQ+G/Dw1axhuXJCtkEdsg4r06mKpJPU4lFlmw0jR9Lvbe6S5klnt5VmTcwxuU5GQ B0rcbxFCbYRmJZVDs4bBDZYknnjuasJ4Vt41BkkdvyFMfSrOEY8kYH945rwWr7m/OzPk1mKSIqkJ jHoDwfrXHaiy/bZtqxorchYxhRx2FdNdGOO5mjiEa4xtBHFctrBYXZLbchRnFb4dcrsjOTctxfB+ oHTNeiuREZiI5V2BsE7kI6+2c11XgGaRdXjEplnknGyPPcke/SuW8MG2GpmQ75ZgSIYAhbfkdT/h XqHg3TLzWGub3VrdrayhJzIyBXdh1AH9a0ndsuKTWqOt8PeFWv5rye/aa3iLBRtUY4GPvdD+Fcv4 hhXS9RexnlXzMbk5xvX1Fek6JAXsPtFz8m9Qsa5+4g6fj71yvxN0h7zRkvUQStaMQSq5JQ9eB+B/ Ok46EVIKLsjiFkAcDqMjp9a+sfg0/mfDbR39fO/9HPXxUPKGWU4YjGQccZr7H/Z//wCSR6DyT/r+ Sc/8vElTEmK1ufOHxakkHxE1YRQKceVmQp/0yTueK5hN1zkSXCkf3FOQPywK3/jDBaj4katLdy+b u8opAAWIxCnb/wCtWDYvAQuLd41PcxE4/oKj2EW7s6nj6kYqMehSupLuO9a2sLMPtxmVjhRn2GP5 1Yt4JTvS4vt0jADZHgY59BVLV1Vr4h9TaG0xwiElm9elWbNIE2i1sXZQfvuB+eOn51tGnGOyOede pUj7zJX3rexpDaLPMqhd0n3VXt7ZrobLTTf2s6TxTFJozESr4RMkcjjrxXM6k9ubmNJp5EB6op5J /lXWeHJYYQpka4RFGUQdD7H/APVinIyi9CCDwBp3mAFXkI9XJ/Pmukt/DOnQ2FvZm3hMMEjSoGDE h2ADN177R+VXYb23ODHLgnqcYzVpboMMBgax5jUxpbK3S+23UEUrBcLI6Z47f4VYit42UybBuZiS ccmrOpBZrc8gunI56juKz7A3UsBgjmSCBD/rANzkHngUm7jRW1WxtSjyeasEjDB9H9iO/wDOo9Hl KTfZ5w4baGXcCMj2z1rXgtbW2kDxgyS95Zfmb/634VzXizU/M1CGC2dVMS7mlB5ye2fakXGN9Dq1 ureIlXuIlZcZBYcVdSQ44Y49q8N1KYQzAwMCzjGc5Of612+ja/PDp7PLN50aKEjXaOMDHX3pWBqz szt7lmeGQFicqRz9K8ogvCnhxYY2y7TtuUddoA7emf5V3La9FFcwQ3bIokQszg5CnH9azb7RtBnC 7LoW7YyuyXgZ9jQCPPby7uDcQW9tI6S/fiVc8E8VpSzuzwQ3W/z0IwV4w/T6daNX8Pz6dexXljdw 3CI4YSqw3KR03DmtPwzpd1da6t/fLbG2KMGG5WEjEY4HpnmnoO5p2MNhZaXLFtaRwrF1BAeZu4z/ AJ4rjdPuA2oLbWpuLSRmwIxl0x6FW6fWrOqRr/aF2bbfBGJGCIM7RjgiqUniowzQoLdJTECju33l 7YVqqKuJmpfX9nPNJHe2IuLdfkW5ixJt9mA5XmohZ6jap5uhXy3NuOtvcHOPYE9P0qKzl0e+kV7Z vst0TnJPlsT9fut+laV7b3ckcdtbssLsQDMeCg7sB1P0FJtoLFnSzLqFtm7tRBdAkGHdlh7j2+lV tT06CbaOJJWJUdipHXJ68e9dGIdOuUWK2voXmRQCJCNxI746g1iYktpmlS2ZbFiV84wmZQ2fmJwQ Rz3o5hNHNXmjyw8hQy+jf41S2rE22ZXRu2eD+BrvYozP/wAe9xBdKcZ8tSAB7kmq1/piFCs8JVT6 jK1cZCbOOhmeNsqRIvo/B/OrElw3kgtE8Snpu6H6GrV1obKSbZyo64+8v+NZFzBPb5EyuEPUqSVP 1FaXFo9iFp2Vvlxj0rs/DPjBINBh0Kezc4mZ0mRt2dx6Fa5K3tkuWCW/L4yTngVp+GFhsdX8y9ja RkGERf7x9fbGeRUSaGrHoK2lw6s/mSNGeAPur+mM1o6HGbLULaVlCxRvlgg9q5PWPFV99sTyjDAj Qq6x7Q2zOcAfQYqkPEerswJu8DGANox+Vc3KyXNJ2N/XsreySEqY5JNw5IIr60+HpDeAPDLDgHTL Yj/v0tfFcup3D28n2yQSysQE2L90dyfevtT4ebf+EA8M+WCE/sy22g+nlLVUr8zudM7eyjb1PmT9 rx9vxK04b1X/AIlERwf+u01eIKWxnAI/2TmvaP2xJSnxL0xccf2REf8AyNNXhqyxE5dRn1xXUjO1 0WxKFb5gV9M1IrBj1yaignQHrnP945/nUo8uR8tHER7cfyoJ5TUsS8eGR5Y8d1bANP1a+uLqKGC4 naSKElowwGVJ681Ttlto2LSC8A7CGUH9GFMlR5pj5Rk2djIAD+OKWhDi0K0w2YwR+Oa9T8Fait78 OUsEWVpbO5dGYrwRJlgF9x/UV5U9vMqZwGXuw7V3vw+1m70jTptPaKJ0uZPNikDDMbbfmz9VX8Kz nsOKR1UelM5j85Gd15HmMWI/CtqwsfsssdwZFVkIZSzdCDmvLf8AhItQvYlja+YPj5wgCfyqpK83 CyPO277qAMxP4CsLE+1V7JHqWrX3h9Zpn1KWKaZj84RdxOfpXJaxrOk6fMINFkPkkZJAJKnPQEjO KzbPw5rF4V+yaLfSL1LTYhX82P8AStiH4ca7dSK8x02xXHQyNMw/IAfrQoj55PZGVpHiVLS/hlW2 MkySh0bGMHPc1oar4jubmU3K2sAZ+DnJxit2x+F8Mbq99q9xKwP3YI1jH5nJrqLDwjo1kwZLXzZB /HM5c/rS5Rpz6nl6ajqt0NsJAz/zyi3Vdn0zxDfFRBp52CMJvnO0n1PbrXrS28ca7YkVVHZRgVVu LyztRm5uYIv99wKiVNS3OmhWnRu4vc8k/wCFc67ePuur20tlPUKS5q3Z/Cq3hcPd6rPM3okYUfrm uz1XxroVghzPJOewgiLfrwK47UvipEu4WGkzSHs00gUfkAf51cadtgqYmc/ika0PgzSbM7lSaRh3 eQ/0p0Wm2Nrdr5NvFHweozn864G9+Iev3ZYQJaWqn+5HuP5sTWNLqmtXjh59QuHwegbaPyGKbpvu YXR7DqMscEAPmxx+hyBXkPjCWP8A4STzo3DqTGxI9v8A9VQXl1dQwmWUyMOnyqSaxL+4ja7Ui485 cD5tpXHqOa1orleopam74t1OK5sUihVuZQdze2an8P8AiO40/SIre3SH5Sx3MCTyaxbjTLy6Ctbg MvXYeP1rW0zR51ijEybSByPSnJq1hC33iXWLnOLt0X+7GAo/Sq+mubyUPcazHFJnpIW3Z+p4rdTT VUfMqmqMnh60O7asiknP3qi6H6mnJpk91LHML9blkAHzAYYeny1heINF8nzZ2vLZGY5MbyYP4Co7 rw7PGM2zsT6Ftv61FH4abg3EoDHqBz+tXCXKJxTd7lz4ZW9gfGtgs9wzH5mXYNo3KNwG73xivoW9 DCxitWIDzkISOw6mvJfhv4UtX12O9dA62bLIoJxl+x/DGa9di8u9uvPUnZBlVBPJbua1i7msHbXs XbghLMRpwBgfhVYOdvXj0p9w2EOcYxnk1nG7CRbQCXxxVGDZ578QvD8NqrahYxhUZgJogPlBP8Q9 Pevo/wDZ/wD+SRaDkAf6/gf9fEleOXxWe3lhuF3xyAqwPcV7b8E7T7D8M9Htg24IZ8H1BnkI/nUW s7hE+X/iw9mvxM1jy4GmvT5O7eSVH7lMYA9sdqxoHuV2+atuV7od36KK6T4qJdzfEPWI441t4AYv 3wABl/dJ+eOlc/bWTRcrPKT2Gad0jOe5h6lNG+tmOOwMtzgYDfdStm3tJ5NrTzhcfw8BRVgQMJHZ IiXP3mI5NSxwPJ3BYdQDnFS6nYXSxCLSJLoTYWSRRtDY6CrkbuW4OT6VYhtCyhcc9+KsJZmM9qzc rjSGQM5yM4xV2IuF5NNhh+b1qdlOOmak0QByO9UrrUEsnbEsauBkK3p6HFN1RpY7cFS6ZYAsoyR9 BXMJNFPctsjaRF4ZicBf9onv9KaKRfvtfnmdBcuLWybILx8sxHYDrk5qhLcmOWERR5ySywzDLqD0 yO1NsobCJ3uC91JcoQRNuGR9BjirgvPL3SpPIJOSGeNDz7kDNNjuYWrwotxPNIio4HzBR0Pc/WtW xsLdIFiS4nMTD5RgHrT9V+xXNjawW2CFJMrEYZ89e31qaCSGCzigSXZ5a7dzR5bb7kUrlPVENtZx Wd3Iy3LAAcO68K3sAea0dPu5IjI6TWgMpBZJVOeBjPXjNUQsbN/rUIHQYNWI/syrlivuSDSFY1Gl 80gvb6dJ7g4/pWfNp6NdPMNPjEZTG2Cbad2fvD/Cgz2YH+tiH1OKjcxOMxyIf91hQMaNLtn3EQXx UnlRMp5rB1Xw3pqPEI49QhlmkCgFVbPrgDqa2JGZMlJSmeuD1rLvXuTcLIk0haIEK2ecnrimm0Bm XnhIqpNpduxH8E9uyH8xkVUgutZ0b5cNJCD9xxvT8PSuos9SvI1+eZif9pat/wBrXJXllPsVqubu IwIfEVhfPGL+FYJUIKmQblB7EHqKfL9q0wtdQa1qUcDtu8yKHzIufoxA/EVoXtz9qA8+0tZsf34x xWcIDbyCTTU+xP38qRsH/gJ4paDIodYgM3nNqNuZic+ats8Lf+OnB/Ktuy8WIBsu7u1nT+9ypP6Y rGutPtb4E3VusM3/AD2tgFyfUp0P4YrCu9Eu4STAVuYx3j+8Pqp5FWkmJncSa1psrZQqhP8AdkUj 8qSR7Sdcs6AnplhyK82dZIziRWUjsRikErrwGYfQ1XKLkO4lsUhl86zkCv2ZGGael4wv7CSYCOVd ySOQAGUjrj61k+EbovbXdtJEXVNsiyZ+51BU+x/pUkk7R6rHMUVoD+6Knpg96hoVmb15o9teZdJG WZgMNnK8Dj8Kp6dbSw3LQXVvLIFBciME5UDsewzjJ7VYs5Bb3clur5jxvQk9PUVqW2ptbTb0ERO0 p84DAg9QRWdzJ76h4ebQ9Y15LGbRYd7K25wz8YHqWr7O8Iwx23hTRYIFCRRWUCIo7ARqAK+NrbWf s1x51paafFPyN6w88++a+xfA8zXHgvQJpMb5NPt3bAwMmNTVw3NE7nzp+1PbJN8QNPLMuRpcYwQD n97NXismkwPndDEf93KmvYP2sL6K0+Iung3FzFKdKj+WNFZSPOm65714l/bUpb79uVHd8KT+VVrc b5ug99Ci/hMqfQhv8KrvobqT5dxj/fQir0OsiZTthJcHGUy2foKu2l6Wb/SImiXszDb/ADNO7Byk jnW02/Q5jw+P7jikJ1GEfPFLj3TNdVNqmlR8vcI5/wBkbqjjvtPu3C20i7z0UttJ/Ci4udvdGVpX iH7DHsubVZhuyckgj+ldNYm3GqvDbE/Y7u3FygA+4TlTj0yDXNa3K0E6osSsoXLbhuzWh4Zu42uE JUgNGIkBPEYGTgexqJLqNvQ0rnRY4ZFnsWYheXRuc47j/Ct57rxJYSW9lpdpMjPsZjCN3UAlmZRy TnPPSqrSxouWcAfnT5vEdy8flyXlxKgGANxAA9KyuRFWZ7LJqNtbRg3dzDEwAzvcA5+lZV14x0eF gouGmYnH7tDj8zgV5Gb4yp8q89z1NQSSuw2hSSe9Juxoj0TVfFD6dq15NDDG/mxphJJeRtBycD6i sO78e6rLkRPBbj/YjyfzOa5D7NczSbSTvx39O1Sx2DbsOcn0FK4y/d+Ib+7yLi9uJAeo3kD8hVAu 8h4B571eg05cjIx9a0YLAKRxRcNTnW095TyDTk0AuOQK6xbdU5OKccdhzS5iuU5Y6Ci4wnIpH0tl wAMH2rpyPWoWRSelFwsjDtoAnXcT71ZEMTY3Ih+qg1dkhQnI4JqPySD1p3CwwxrjgUqxqRwDUiLt /iqwgHtQJlKaEooLDaG5GR1rNvb23tHVZ2KlhleOK9H0Ke0vbP7LcNDHdwLiKSQDbIn9xvp2NYfi rRrO/jiC2SBo5f3mwHcv0A4I/wDrVtTjG/vbFRpuekThrnVQR/owRv8AeyaSDUWcAXMGzP8AEhyP yq9q3ge9trpTo1z50bngNhSv17VpWfhe4gu4oL+6t5WcKHFup3KTnOc9uP16V1SjR5fdMGpI6fwJ AbfSLm5A+e5ZTCvdhyP5/wAq62Kza2togjneowx6ZPc1Do8EcUqIoXEMYXp0PoPwrUmhZx8kmBnu M1nFWNL6WM6fKIS459T3rDZszvjeewC1s32nMELiSSQnsxrnrmU2QleYGNe7NQ2ZtDL2WCBcyszH rgnrXv8A8Gpxc/DfSZVAAYz8D2nkFfJeu635o8uBtznqR2r6o+AcbxfCXQVkxuxOTj3nkNK9xRR4 N8TUH/Ca6k/Qkx8/9s1rAgdY1AUBj3JGa2/ig7DxvqIwMZj/APRa1z1v8q8HPue1Yyepk9WaQZmH zIfqBSx25c52BF68YH8qqCZweGJqxDK3ctj3NIpalkpLGP3bAD3p0bTMOW6e1MjkOfmAA9c1L5q5 +WgtCkOcfMQaXa3djUZkGckikaZV6HNAyDUpPLtnkY4C1yukaVdxxI8n7uTGOBjI966YM15Ju2gx IflHYn1qyyYPCmi5SdzG+z3A6uCfcD/CoJoZ/wCNYm+qD/Cuh2A9RzULxjHSncdjmXikz/qY/wAB U0UMrD57dMdjz/jWyyIpztpyMv0ouFjPht3QZCr+OaLgO8RUog+h/wDrVqFkxwTmopGUDkipGZxk J+9CPzBqtI0feDH4CtJ9hGTioHjif+EGgDIunj2EJiMnuRiq6tjGydc+z1rzWsDggrx9aqNp8HVS wpgVmuJEHzXH/jwNEly4aNBIjFzjopxU39nxk8M1RvpZB+VwfYincByiUk/Ijf8AAKUqzD/Uxfhk VENOY9dv6ipVtJlXCs+PZzSuBHJGgGZEdQOpD/41XMcSnfm4U9jgGppbG4ZHTzJTG4+ZSQamit7l VAOW9NyUXEUmaCX5Z3Einjc8RVh+I6/jWJcaRG0rCC5jYDjDLg/jXUPbyD7yofqpqCUZZme0Uk9W VRVKYXsZVnCbKxMKspZ23OVOM+n4VTZG88GTOCc8EGtcxBXZ/LkyRjscVSeEBv3jnHpspp3BMs6a WuZHYDG35RnrVpraQkgY3A4ODWZbzrbz5Db0PGMc1cN3OznJx+FTJO+gmkK8UsUg3Y/Ovuj4d/8A JP8Awz/2C7X/ANFLXwZPPK/385r7w+G3/JOvCuev9lWv/olauCsJI+ZP2v5bKP4l6b9pglml/siL AEm1cedN+NeHf2mif8e9laxe5XefzNfQH7WNxGnxC06OW3tpgdKjP7yME/66bvXiDR2U5wNLAJ7w uw/SquXdWMqXVbyTrOyj0T5f5VUaV3OWYsfc5roBpMDNj7Hdp9SP61I2iW4XJljQ+j8/yNHMgukc wWatXwvEJdWEkh2xwI0hPv0H86s/2VEzhTNH/wABHWrtnZxWayeUzsz4GeBSctAbRHeXCvJIoj3M /fHI9MVDp6yLKYZAwYYOD25qWRYxL/tD1bP8qSSJo51lG5X4JB7io6Es6eK2dkLZ4Ap8lnGiFpJM fSqbXbRW6fZ2y5HzH0qrM0rjO/ORzk81gkyW0iwl6sEgVELAnk1t2ckM0e5GBHfjpXKrE+3OC3vU 1u7xuGQlW9apoXNY6UWU5vxMLseTnIQJzt/u5z+taCxjcfl5qrp9wkqKW4kx+Bq8HHrg1NjVO5Ik RPPQ1ZwEABNU1uGDbetTLlhyeaRRKWWmscCmlQvelGO1FhicnoKYyEjBGKlB5oyKYrkBi9TTGjbs RVo4OKUIPTmgTKRiIpwO2rLKDnNQ7NvqaYh1pcNa3Uc8OPMQ52tyGHcH2NdVbTW+pCZtOCRzkBmh dPmJ9M9x7iuQfnoKYHkiYPE7xyL910OCKuLsUpNHoh0pIbYKwfDDLLnO32BrG0nR4bPVLq8WaWVp Au4ydABnGB6+/sKo+HtW1GZpormeWZdo2MW/i9P6/hW23yhLdWLSTcu3+z3P9K3jqLVsuWOdplJx 5h3Y9u1LcecWxbBie7MflpW2gEDgAcVmXrhYzjOR71Zk3qZ+uzNYjNxeRo56KMkn8K4TU5rzU5wj TyyRA/KDkD8q2NakVZWkdkyD2OTz2rnzd3NzOlvYrtklOxcDn6+1YzaWrFdvRCWsGy48uCJpWVvm IXOT6Zr67+CKNH8MNGV1CsDPkA5x+/kr5xtY49JEdvARhVAZmUHce55r6Z+EzB/h/pTDv5v/AKNe uDCY76xWcIrS3+Ru6fLC55brvwu1jxVr1/qmn3Onxwu6oFnkcNkRqDwEI/WqsfwP8SKMG90f/v7J /wDG69t8H/8AHjdf9fB/9AWt2vRcFcw5EfPS/BTxEq4F7pGf+usn/wAbp3/ClfEWP+P3Sf8Av7J/ 8br6DopciHyo+fh8F/Efe90n/v7J/wDG6ePgz4hxj7bpP/f2T/4ivfqKfIh8qPAP+FMeIsY+26T/ AN/ZP/jdNm+C/iFoSiXmkBj3MsnH/kOvoGilyIOVHgMPwZ8QxIFW90rA/wCmsn/xFS/8Ke8Q4/4/ NKz/ANdZP/iK95oo5EM8FPwf8R4wLvSf+/sn/wAbqJ/g14jYf8fuk/8Af2T/AON17/RRyID58/4U v4k73ukEf9dpP/jdH/Cl/Efa90j/AL+yf/G6+g6KORAfPy/BfxEB/wAfmk5/66yf/G6a/wAFvEbZ xeaP/wB/ZP8A43X0HRRyID51PwP8RnOb3SP+/sn/AMbpn/CjfEoPF9o+P+usv/xuvo2ijkQHze3w M8TH/l+0b/v9L/8AG6F+BfiUDDX2jf8Af6X/AON19IUUciA+cB8DPEo6X2jf9/Zf/jdDfAzxKf8A l+0b/v8AS/8Axuvo+ijkQHzf/wAKL8S/8/2j/wDf6X/43R/wovxL2v8ARx/22l/+N19IUUciA+c1 +BviQfev9IP/AG1k/wDjdSL8EPEY/wCX3SMf9dZP/jdfRFFHIgPnc/BHxERzeaOf+2sn/wAbqGT4 G+JWQqt5oq59Jpf/AI3X0dRRyIVj5f8A+GfvFYJxqei49DNL/wDG6ZL+z54qf/l+0LPvNL/8ar6j op8iCx8o/wDDOPirdn7foP8A3/m/+NVJ/wAM7+LtuP7R0L/v/N/8ar6qoo5UM+Uj+zp4uPXUtBP/ AG2l/wDjVfTHhLTpdH8K6Nply0bT2VlDbSNGSVLIgUkZAOMj0rVoppWA8U+Nnws8QeOPFVrqWi3W kwwRWSW7C7Zw5YPI3G1G4w47+tefv+z140cgHVtDVQP4Z5h/7Sr6roosB8o/8M4+LT9/VNEb63E3 /wAbpU/Zv8Tg83+h/hNL/wDGq+raKXKgPlwfs8+JQci58PAgAA+bKT+sVR/8M9eK1cst34fye5uJ j/7Sr6noo5EB8sD9njxWCWF/4fDe0kv/AMbqOb9nbxhIpH9qaJg9jPN/8ar6roo5EB8sw/s8+LI0 C/2joRH/AF2l/wDjVIf2ePFbMSdQ0L/v/L/8ar6nopciFyo+YYv2fvE6Lg3+i/8Af6X/AON0Sfs/ eJ2+7f6L+M0v/wAbr6eoo9mhcqPmOL4B+K4zxqGiY9ppf/jdaMHwR8UBf399oxPqs0vP/kOvouij 2cSlpsfPa/BXxEv/AC+6R/39k/8AjdTD4NeIQP8Aj80n/v7J/wDEV79RS9lEd2eBH4N+Ij1vNJ/7 +yf/ABumj4NeIv8An90n/v7J/wDG69/oo9nELs8CHwa8Q97zSf8Av7J/8RR/wprxCTk3mlf9/ZP/ AIivfaKfs4hc8DPwb8Q/8/mlf9/ZP/iKX/hTniH/AJ/NK/7+yf8AxFe90UeziFzwX/hTviH/AJ/N K/7+yf8AxFNb4N+IT/y+aT/39k/+Ir3yij2aC54B/wAKY8Q55vNJ/wC/sn/xFMb4K+IHODfaSo9p JD/7JX0FRR7NCPFdK+EmqadGwS7sJHbqWdx+XyVYt/hfrKNJLJdacZnPOJHwB2A+SvYqKpK2w7nj 7/DPXD0utO/7+P8A/EVRuvhT4glRgt3pYJ7mWT/4ivbqKdyeVHzlefA3xJOflvdGx7yyf/G6l0H4 Ha/p800093pBkYbU2SyHC9+sfevoiisqtGNWLhLZjiuV3R86al8EPFM1489tqmlc9Ekmlx/6Aa9o +HeiXfhzwbp2lajJDJdW/mb2gYsh3SMwwSAejDtXR0VnRwtOi7wHd7HyZ428Sa3pvxLntrHWdStb P7XbZghunSPBjTPyg4571N8RfEniHTPEqXkev6tDZQwArCl7KqSylm2qQGwR3PsPeud+KTbPiTqD /wBye2b8kSuX8d+Jz4k1x5YmItEYpEueg7k+5rfqZX1Ow8EeMPEt9aeI45vEWsSSLYNLEz3spKMD 1X5uOvasO18b+KmRSfE2uHjvfy//ABVL8KsP4gurbjE9lNH+mf6VztkMKFPUcVaMajsddB418UC4 hLeI9aKiRSQb6XBGR/tV6n+0Nr2saVZLNpuralZLkE/Zbl4zjB/ukV4VJwhPpzXtf7Rsfn+FYJR/ HDG35r/9ehoKLvc+erz4j+L3cLB4u8QqvBB/tObP/oVSDx94zOjO48X+ITItwBu/tObOCvT71cW0 RULkcEA1et4ydDviP4JYm/PcKqKOqWiXyNg/ELxv/wBDf4j/APBnP/8AFV1fhvxz4tmNn53ijXn3 KQd2oTHJwf8AargbTRiltHe6tI9lYvzH8uZZ/wDrmv8A7MePrXR6DNbzXlk9pAbe33bFRn3nGSMk 9yevpQ1YipK60Okfxv4sEZx4n13OP+ghL/8AFV7F408R6tZeDNPms9U1GN5rIL5gupN+4qDuLZyT wefevBjHnI+or1zxIom+FWg3MflhdixnJ2qD0P8AX6mo6ozTvFmNbeK/EkkEf/FQ6sGdQATeyckj /eqh4W8ReLjcPNf+JdbFqoYB5r+YqzdOBuy34Vxlz4mt7Tybd4pXSBlzJtH3l6EA+mM81rWutWz2 wv2nmkW4YoDMpJXb1HHQVnKPLuXFya0Oy1Xx3rumaXd3FtrOqO0cTN5k91I3OOMLuwOfXJrx6b4j eN5pGkbxd4gVmOSE1GZQPoA2BXV69cQ6npL21tc28bykfffAYDtXmWq6Xd6VLHHdqo3ruRkcMrDp wRVxldWLjGzN4fELxsf+Zw8R/wDgzn/+Kq1D8QPGZ02Vz4u8RblnQZ/tKbOCDx96sLRtGv8AV51g 0y0nu5z/AAwoWx9cdK9B0v4YT29ow8T6hbaXHJIj+UrCWYgZ42jgHmtEKcrI9e/t/wAST+JSTqd/ DZlQ3l/an7xA9M4HJzSeH9T8Q3dhBcLq+ryeYm7c95Jj9T0pP7YspH8yxhVpNqp5spycKoUYHbgV i+IXvbu2bfeypEB/q0G0fpXRLG04RSSuzgWDqSk23ZXOku/FL6bn+0fE+oySD/ljbXLufpnOBWLd /E7WZf3WkT3cCdPMnuXlf9Tj+defy2pTpKf+Bc1NbWlwOZpBFF/eCnJ+griqYudTyOunhowO68Oe JfEdxrMKvruoMoDPKJbp9uwDLHGcV3nwo1TUrrwz4gbUtUvrhor0R+dLO7tGhC5KknIABJ9utcL4 Bs1mWaDT7Z2e5TbNcXJyNozkBR0H867LwDqtxpXh7UnaCzS4mvZR+8yqNsjXHy9STwMZopp7nTSi 5TUYnb6Rd6jJcxWMrzuIpdwmMuWMScYfB53HGD/EMkgV4z8YPEGuWXxA1K3stc1a0gVYiscF5IiL mNScKDgc16NbSatc2su6O5igzICLZFsrfBUbW3nBPOc89q8h+K81pc+OLqWK7S6UQwIXhcOhZY1D fMOvINFV6G+Jpeza1V/IxovF/iGM5/4SXXZJB2bUJQP/AEKmTeOvFQBzrmsKvqt5If13Vjs8UTEp sGexGajMrSMdsRb3AwK5tTlNf/hNPFjjKa9rIHq19KP/AGanDxZ4mYfvPFmsD2S+l/nurCeKaRts qKF9TyBUD2cO8bpCx9FbAp3YHU2PjPXheQxf8JPrTl2xhtQlOf8Ax6odN8Z+KHlXf4k1oj0N9Kf/ AGasTTYjFfwBIVClxnjp+NN0xf3yit6Rz1WeiQeKfEG0Z13VTn/p8k/xr6Y8KSyT+FtGlmkeSWSy hZ3c5ZiUBJJPU18pW4+QCvqvwd/yKOh/9eMH/ota2kiaG7PE/wBoXxBrGleM7ODTNX1CyhbT0cx2 9y8alvMkGcKRzgDn2rymXxl4owceJtbH0v5f/iq9M/aOgWXxvYllB/4lyDn/AK6y14/c2cYzgEfQ 1g3qdiRPdeMfFo1CMR+KNcCSRowH9oTADI5/i9RWzb+MfEtuqsviPWricdGkvpdg/wCA7vm/H8q5 GWAq9o2ScxFef9lj/jWrHbuAMNn6incVjXj8ceMomLDxDqT5OcPcuR/OrcHxK8VRODPqF9KB6XTj +tYHkyjPANRtG46xmosWdePipqki7bu91VB3Ed1Iv6hgaij+I1zDJvsvEmvxyn+CS6edf++XzXGT oMcqfyrKitxJqJ5wueSOtVFEtnpI+KnimRmU6lK4x8r7nQ/iA2Kkh1/xrfGS5/tnWgh+YlbqRB/w FQefwFcfEhiT/R8RN/fHLfmen4YoS41G3OYb2b8Wz/OrvYm19z03TdSv3VC/ju9+3bgfs99dXECf Tllb/PSusuvEGtSWXlapa38ttji40bVmLfX7yP8Aqa8Lm8V6vDbsJjFNGMBldM5yaqw6ld3TCS0i W1Yck2uUH44OKE7laI9mg8VT2LeVpPi/VInbJFrrsbP+UjbW/wDHjWdf/FC/laWzv5Z3TH+v0u/k QMfYnBH4E159a+Vf3AOr6wqHPWQtIfwPQfnXT6bB4ftIG+0wW+oZyBNFe7HX6KwCg/jVE3GWPjDx Ss7rpWsaqLWc+Wgvb0zbT7SyY5rc+x+ObZ4ptR1rxDJZMNztp1607L+G8Z/AGq8njW3jtmgsryS5 gUbfsmoWUco+gZMce/NYi6rdXsiroNg+n3bckafK4U/8A+7+YoFY7a01q+jmP9heM7iWXHzWOryy 78/UkMD+BFVdY8c3Ev8AoOtz6xp9wPmWbT9Scr+aEH8GFc1eWGoahJs8Q6jHayR/cW8UqCfYhdv4 5qOS20TT4401A3EdznInikjuIj9VHOPqPxp2GaFl458UrcG103VNS1WDHyecWEo+rKeR7nFRT6t4 rl1YnWfE2paKrAABrqZYz7LhtufxqlN4gt7tkgXT7S9CjbBPaI1vID6AKT+hpPP1zL2l/efYrZ+Q b/58A9gxBz+NFibm+ms67obG5vdX1jVLUcieDVJTtHvGWAP4E1n3XjbUbQibRPE2qzl+fslzPLN1 7Bicj6HNYJsdLsV8jVbiZXOTG8Lq8S++0fMPxAq5p14s+bTTNHS6EeGjntUMDA+pYkkfXNFhXNLV PEnizVfIhj1DVdKkYbo5ptRlgVvwBwfoc0yXXvHeh2arN4kuLiBRlrlZXmAJPIZjyPx496qj+1Z7 KeDU9Us4MZbyLobpdufVht/Gq0TaI8Ma2w1HVLiEmPyLhTJEx6AfKQFHocn6UWC5fi1/xMdL8+08 czzISW2NcusnXnG9s/QflVSfWvECWJu4vH17KSN/k/bZUfHptL9fal1fSGfyS2mab4fyg2vcSgqf baoPP1INZF7cgSLAE0uWKM5N7a2Tspx3OOOehGKZJNrXifxBZaLPe2vjy+uJo4w6wG9nUnpx97rV LS/GXiW80Vb648X6zb3Jzi1+1zkkZ+8DuxyOa5rxNfLfLDZIbVPOmALQ25TC9/qB6VsG7jT5lks1 Kr5aoLAbSB0PPGfekD0Rr3HizWUgLxeOtdkkxwgnnAP4lqhuPGGsLCTH428SPIBkL58qgn0z5n9K x5L1ldnSWElsAgWaAD6DGPyqs11Nltsi5Y5P7hR/SnYm5uHxvrATP/CXeKi2O12wGf8Av5UB8da4 FGfFHiovjnGouB/OsPzp8kbzyc8IBUTh2zkk59qLCubH/Ce+JBkf8JN4kJz1/tSSvrH4Fahdap8K 9FvNQubi6uZDPumuJTJI2J5AMseTgAD8K+LWXGclh+FfY/7O3/JHdA+tz/6Uy1LLg9T51+K7EeP9 bKkggwHI/wCucdZHxP0aHw/ZaD9khj3TxOZWA6t8p4/lWv8AFX/koOvDu0cf5iFD/SpfjUol8NeF rkchlx+can+lQ9wXxHM/Ci+P/Cd6VG0W3eXjJHfKt1qq8fk6hdxf3JnX8mNJ4ClEHjDSJPS5QZ+p x/Wr3iJBb+K9Xi/u3Un6nP8AWrRlW1K8wzE/0Ne5fGwfaPhvpkw532EDf+OrXhxYFSPWvc/iD/pX wW0OYd9Mi/RR/hTZNHqfKsKh3RSO2K7Xw9b6bZzOlwon2unnZT5VG7HGepGep4rh5BsX5g6nP0Nd rYWM9zd6qYZ5EiaM5eQ4jjJKkc+vtWlF2dy68nayf9aHd+P/AA5ZaroAls7eVBbkM73BIIOPzJwR 044715raWp064tVUIQG3oN33vm/xr0HW/F013bC3tVjnk2LGZJlIiOBtzt6t+PHtXF3hvJLq0fUJ I5HU7UKLtCqCOAOg/CtMXOE53gyKbajYsFcSPkY+Y8fjXpNrIbz4NxxzFnMF6wG7nAypA/CvPbzC 31yPSRv516H4Yjlk+FWp5Q7VvMxkjAPyr3+orkNYankd9osVzcOWj6nJIJqS2V4bSCxtQ/yOWAX5 mYk8jH4V0sQtUVkuZsneThDwRnpmta119LCMx6XDBYKessCgyn6ucmm6sF8WoKnNrR2OeHgPVNTe O51J00iBfmWW6YIR9E+8a6L+wPCI+zrOsusTwKVG/wDcQZJyeByeaz3Y3cjTzSXDOeS8pz+pNMhk hjdi9wWA6CNeT+J4rCVZN+6rG0YNKzdzsIr+4WD7NZR29laDgQ2gEa498cmq0lvbfM94rBepJBNc u13uOILVWIP3nfefy4FSJfXbxtucxADGXfH6CspSlLdlqKWx0a6da3TBdNs7xn/vKdg/xrVvPBGs Q6TNqLG6W0gQySJIQCQOw717X4IsbZPDelTQQxh5bWJ2dVwWJUEn1q94utJbrwtqdvAheWWEoi+p JGBVqn1Yz5m+Gr/8JJa6ndtpv2e3gKQwOJMtNO/RMkdh8xPYfWux0/wM014kd7OWYctg5/CvOPiH LL4f0vSvCnh6SQxaWwe5u4Tjzbs4ZiD9cY9lWvW/hP4mbxLYiW8Aj1SEBbmPpk9nA9D+hpqKFcvv bDwYwubGzaeJk2bjzsznPH9a4mXxTrdjBPDo9wlkk0zTFhGrSAkAcMQcdO2K9pvrdbqyeN1DAjoR XjWvaZ9jvpIiOM5X6VbbSsiVucZrMusaq2/Vb65vj/03lZsfhnFYr2bhxkMqjsG4rtngU1XXS5r1 mjt9gIHLP0FZWbHscgsm0HyvLjA7snX8ar/aZ5WKm5hBzwEIruLX4ewE7ru7ZyTk7Vz+p/wp8Phr Tra1jfy97EspLt3DEdBj0qlSZLkcBJNsfY8Tuf7zPxVu1stRuceRbFV9Qn+NdnPZ6YjAmK2DAYB2 jipf7Qs4kP73c3sM1Sp9xcxi6b4Yvgy3E8qqsR3lS/XHPQcVz+n/APHxz2JrvE12IxtEkcjFxtyR jHavP9Pf/TSp7EitoJLRGFV3Oyt8bAe9fVPg/wD5FLRP+vGD/wBFrXyra8IK+qvB/wDyKWif9eMH /ota0nsLD7s8N/aKVj42sdrKP+JenBIB/wBZLXk8sUxOSM/SvqX4grfG+RraO4kgEA3hI7WRc7m6 iUbvyOP1rnovDUl9HE80OmOxG6SOTSrcEewYYz+VZNHWj51mtZDaW0jKQVllT/x1Wq1A7FAShr1z 4g+HbW20q1e1sEss3DblS28pSTGRkevSrejeFNMvNDsJn0u23SQIxZZLyMk7eTkKy/lxSsB44ZVX 7yn8qRZo26GvY5/BGhnO62aM+1+R/wChwCs+bwNoiBj500WB2u7Z/wBCVJpco7nlUgQjqKzI7cf2 gxAyvGa9im+HlruQC5vo1cZ3vbRMoHqSsv8ASsPWvAx0qaTFys8M0IeOVYio4kUHjJP8XarURNnI LaJjgY+hprWfHDGu+k+Ht9EDtu7Uj/b86L/0OMVVj8F6nKSIPJkIOCBOg/LJGaOUVzzu/sz5FwCc jy84x6MDVy0gb7LGAoKBeBXb6p8PtdtLWWa8sZY4RG+WODj5Sex9q5zxJZXug+FY9RaMIs7vDAzc glep/Dn8qaQM888Y6fLdagP3jJbQpgoOPm6/j2p/hixZxGHlYoASC/JHtWRFcyT6nBJd+bOJnHm4 OWKA84z+NdPoV2BK7QLFsUkJGeuzPH6UW1G2uXTc22gMK7rcruHdgG/TpVW48S30kotJHtX2cYMS gp9PSpb3V1Fvtjtdk7nZuk/1ag9WJHJHt3rkNSS0N6S00c0BVRIsI8skcnpk+v6UyTqhqVxJblZb 2aWDOCqSFwPbriqOry2d7oV1Ha+ftcBS5XGOQSBzzn6VneF5bZLC4tnnRJS2UDnG7r/9arerOYdD hiRdvyhh79c1cI8wmO8Dreadpt0lq8ItZm3mO62EZHGQG71vx3FuIo47nU7m6gb71vb7lx/30MGu U06C5k8q6gsGuI9u94wSTjOD056itGHULea/AR59NiVMuGUgg9unWpemgmm9joYJFhizbaXAsLMP LurtirKfcg4/KnXl9JdDZqOrvLLER5f2SAHd/wBtOCKwRF9pvhFYyrMDnL5yT9a37Tw47qGnaRvY DH86ZBWOoWsM0U8FhE8g4c38v2gk+u3HFSLrl/PDNbRXN19nb7sNsBHF+RyQPatVNHggGRbrkd3O ai0y2wknCD943b3pAZcNvcBo3iitoGQY3Sfvj/49kflipmsnlDC5urmVWOSikqmf90cVuGIAffA+ gqpfSR21tLPI7bIlLt9AM0ijyO7S7utaEGn7Vkiby0LnAySeM+teg2OjLHY263kaNcCMeY+4gFsc 1meC9KS9sJrq/t/M+0yGYA5xkHj+v512viHwR4h8N3Wi/ZtDkb+0JPKVUnMikkdGA3beuc+x96Bt XMB9Ktf7qj6MapjToBebMOV254z1r03xh4K1HwvY2s+ovaN57FAsTk4IGTnIFcJkm/HKjj60EtEQ 0m2OP3Uv/fRpTokLDiJx9ZK9K8BeHtC1ayubjXtY+xNHIESMMq7xjOeQT1rrf7A+HNsP32q3E5Hp Ix/9BWjUOU+e73QoliduRgE/fJr6i/Z6G34P6AP+vj/0okrwvxPDaSahfjSI5HsfMYQZJJK9uvP5 1718BY3i+FGhpKjI4NxlWGCP9IkqOZN2vqVFNM+bvii3/FytW+kY/wDIC1V+JOs6df8AgXQLK2uV lv7R1E0Sg5jGwjk9PSrXxOGfidqQ9XhH/kJKm8YWED/BnT57eNI55LqOSWToWO50yT6dKHuZr4me d6BKYdXspemyeNv/AB4V1HxEiNv8QNWB4V3WQfiori7OGQDzlkICEfxDOevT8K9A+Ka58YLMOk9n DID68EU0TUZzoIK9a961IfavgBobdcWLJ/3yWH9K8FVflFe96GPtX7P+nr18s3EX/j7f402iaT1a PB10yHULRUmXqvDDqOKV4byPxCIJ5JHtPsbLFn7oIhzwPqKZYX1xGigWFxIq8BkI5rdi1u3iEbto V9Pc7dpM/wDqxxg4VTk8epohLlHKNzldAe61SRYLJbiec4+SFN5/lWx4h06801bQX8kRlZmPlq6s ydPvBeh9qvyeKZobQwrZtaWajJht7cwR4+i9fxzWNqeq6fqVvF/Z6FWjYlzgjOR7/Ss+a8ti3HS5 b1TjUrj3fP5ivTfh+Zbn4X+JIXlcpDKpiUtwuVOf1FeZav8A8hCQ/wB5Ub81FejfB+4W58M+L9Pd CPJWCfcD94NvBB/L9ac9iqW5xCu4jHmbXPomB+ppfMkJDLaqpXoeCf1r0LxP4FtdKvc26OLeQZjf PI9jXOz+HwAdrPn3rikmjpRzzhGO6fczHnA5P50+1EYlBiibJyPn5A4NS6tZf2fas4f5+iL3JrI0 RNT1a7WLTLW6v5IwfMFtGzAA9CccAZ6ZNOEW2DsaLuqwr++ZQRwEHFVw8aJukl693OB+VdBZ/DLx 5f243WNtZBckNc3Kr+ark1yg8Na/9pQy3FkYgw3BWOSM89RV+zYrn2P8O2WXwL4flUhg1jFgjp90 Vp+IpJIdB1CSFtkqwOVYdjiuc+FGqWl14TsNOt2JuNPtkjmXaQB1Awe/Sug8QzQto1/F5se8wPhd wz09K36EnwvD4kuFtru1vDv33D3PmBfnLnggn04FdL4c1278MaVaeILX95cJhpUPAlQtgqfqPyOK 5p7TTpLm4Aku1Ku4OUXrk+9dJcacbjwL5UXnSKwVFEcRd/vD+EdagR9O+GtbsfEWh2uqaXL5lrcJ uX1U91I7EHg1zvjjSvOhM0a5dOfrXl3wI/t/w7rBsW07V59GvmG4NYSoIZOgkyRgDsfwPavoq60y W4t3UxZ47kVQ0fPUwdZz12bfbGc/nVRpJmz5EEivn/WLK65/AECuq8babLp140caKCTuHIOK8313 xra6TqAs7q6meZGXzPJjUrGO4PfOOwrSlS5uqRM3Y3Uh1hzhb69QenmE4/PNH9mXXkrHJLK4ySSx 5JJyT+td3pS217pVpd2ciy280SvG4/iBHWkuLZB1quURwaaGWbnJ+prVtPDce0FgK3khUPwKvJD8 oxTUSXYw10GGOF2HVVJGB7V5HY/8hKT3Zv51741u5gk4/gP8q8FtABqkoHq386q1jKex19qf3aiv qzwd/wAijof/AF4wf+i1r5SteY1+lfVvg7/kUdD/AOvGD/0WtE9hUN2eZ/Gb4iXnhLxJa6faWNtN 5los5lkLZ5d1xweny/rXFWPxpZ5v+JpoVtOD1aOQhv8Ax4Gqf7U1zHD8QNOVyQx0uM8H/prLXitx eoyHYWB7c1xyqyjKx7tLD05U02tT6E1v4m+EtY0qOBbe6s7lZVf7qMuBnOSvPf0r0n4et4f1bw5p 62F/DLOsQDRpKu9SPVeor4WkvXaRvMXGT2HStDTtUltpEe3uXjkU5Uq3IPtWymczoLZH3+2gIZs/ aJ/KK4KCRhz9QRU39jRLAsSSyeWvOJGL5/EnP618caR8XPGGnqix63cSRr0WUh//AEIGupt/j74p XHmy2rY/vWwwfyp8yIdCR9Lt4fG1gl3Mgf7yg8H8DXI+NvC6QWXnRSRlmjkj2+Wq5JXcOgGfu968 euv2g/Es6pFBDYQt/E6RHP4biRWRqvxf8Q6pAsNzduUBJwERexHYehNNSD6vI+pNP8P28MSO8Sea ygsB8oBxzjbitO3s1ijKZbaTnbuJA/E84r5PsfjH4mt0K/2hIwxj5wpxVuy+M+uwXImluZJDjGCQ R+R4o5g+ryPp3WbKOXSrqNYA7PEyA9SMgjvXyz8XLsy2WlaNMAqQrczRj+8WZc/kAa6qL416tewP 9nlhVwOQ0IyBXgnxC1e7vvEk11JMxmwpVhxxjtRGabsRKm46syUjP2gLCNxgZldcZOxuh/A5H5Vu yfDnX777HdaWyTT3KJ5VuiyLJ0HQ7dp6+tYmnXCpLbamRxGzLIi9dvQjP0Oa7C6gga1juYLh5EIB jbOdvuD2/KpnVjGST6jjSbVyK+8LeNvClmLvxPpk6WAIDSvEz4z0BZRgfjWQLzStRlCCMqx/v/IT 9K+gvCHh/wCH+oacg1uLUxlF8x575pbcEjuyYCn/AHgMeteW/EPw7pOmeMtS03Q0jS1aRUtnD+YE 3gAEHn+8asi1jz7+zhMFaAlQ4yofofx9ailF3bp5UvmCL+6Tlfwq9pujzwarfWS3VwxtHZZFEZdM qcEnHK/UZ+lWLnU2sZjDqVuZbc/duYRuUj3HUUJ2JOv+EXijw/pl6IvFltM9msJjR4GOQ27IJGR7 im/EzUdO1HVtQvPBd0WtYYlKiTiRY8fPjdznOPfFcl9m07UE8yxmQk/3DyPqKy73S54cuGDqO+cY piLmkadePfSxSzwWM8ZBzcSeUckZ+9n0xz713Ph7xLf6FqSJqQtvEFn0McUxfH/A0+YH615db3d1 YXAeFmilU8HFbVx4y1eeKKI3QiZG3l40Cl/ZsdRRcVj1vxL8QvCl61oLHS7nTSFZZgSZBu4x3z69 ql8EWcfiW/W00q5tpZZXYgZ5A5PIPNeU6NNHresodbvIhEqbRJdN8ilj69cD2r1PTvhJrFhJHrOk ahH9hif95LZ75ZYhj76DguB3AJOOmaaYcup6X/wqu+WJmlu4UCjJIHp+deIfEiUJZx6fZTMXvJhb kMRzyDngcCvV/tnxS0nR/O0m5tfE2mTxExTRESttIxnBw+fbmvn7UPEbXPii3uNYhaI2gYbEBJWT pkg1zV3UVnDz/wCAawjD7R12nXFvYXH9mop3RIMAHoMfnWvrPjTW7i50cPqV4wS4JXMzDpE46Z46 muJh1Cwv/E0dxDcEqLcjIO07s9/wqzdTLHrGlRBZFAkkclhyTsP9CK8x4jE33tpf8zp5KfQ3dQ8R 3V7C8k5lmEblAzuXGc47n+VU47n/AEmMsAC2RkHiqcMLRJMs00ZZpGfKgkEFs4poc2t7AXdWE0m1 Qn8PH4VzSxVWbspGipQXQ1o7yUSshkKqBwVHeq+oX1xFaI8Uh3tIiMB6FgCf1piM63DybUUFQMFv c9MA1X1KTENrGEZi1xHt8tt2DnJ3DHTAPrWMefmWv4r/ADHddjdjVWuEILSgA5Gc19K/CAY+Hekj G3/Xcen756+aoGnW7Db4V+TH8TDr+FfS3wiUr8PNJBKn/XHKjA/1z1rlKtXevT9UZYh3gfLfxScx /E3VWH3g0JA9T5KVqasBc/AmbbyIJD/47cD/AOKqt8S0tz8RdRMzgMZoRgPg7fIT29f51o2Uf2j4 Ha0hOXRZiR6EMjV9ROnypSvueZF3kzx60JKgeorv/iOwlk8NXX/PfTIwfqP/ANdee2Z+VK9B8YkT eD/Btx3WGSEn6Ef4VlEmojAiPy17x8Oj9p+CE0f/ADyvZ0/PB/rXgcTfJXunwbm874V6/Bn/AFV/ ux/vRr/hVS2IpbnkOjj5VU9QxH64rZ2bWB28ZI/SsrTEP2+SEcf6SyD2+eumTT5ZLLUbhXTbYuqy A5yxJIyPyrI0sZcqq0JBA/1Z/mK5jVtJgsnkubZdiSFQU7A4J4r2TxRp9ha+CLC6tLSFJ2VGLAYL koTgt6ZrzjXk36dGLu0aCbz0AZhg+WTg4yPp7UIvl0MvVTm5hI/it4j/AOOiu++CgOPGC87ZNPi/ SRv/AIquO8X6fLpepW9tMhjItY2UFgSVOcE49R2rrfgVLnW/EEGciTSmbHuJF/xqpbCpq0jv/h3r r+NPCjWetoqarbM0W7GPOC9JAPXBGR+NZGr2MlhcMkzbFTJbI+8MVleFPE/hfwtp+jpdaa99rEt5 LK4jdh5JDsqsx6AkDAXvyTxV34ja9OsB1C60wNp0qB0X7QDwT04Fc8jpOP16zmuXiuyFeEHKRFto P1Pauv8AgfpcllFeXs1vaW8t/L5Oy1csgjRNwBz3yc8V554o1rGl+VAJIopYDNEIpMbF27sgYyD7 5rsfhB4qiuLJ4YbPy7qyDX1wxbPmB4wobHpx+B4xVU4tvQmUlHc9yt7iRzqCEA+RIFXjHylQef1r 5+1HUYrS4eOWW1hJzt82UKep5wev/wBau/8AhPqtzqsmpzjUVbTIkjVYWjCHec4yx5bAyemOR6Vy 2g+Jz4Y1m/uW0GDWYrhBFiSVY/LKux43Kc5DfpVyj3CMuqL3hHUTKkjROhRlA3QyZV/y/Gum0m5c 3l0ipuDREE+lcX4ZvGvdW1S5a0SzW5ne4W3RgyxBnJCggAfpW9FFqEFzI0VxF5MuQSRh1B7ehA9e DSSXV2LSc3otTw+TTpIL2+eQcee/5bjXsvwQkV5Cbdw22TA2Hpx+leTeJ9XlbUGhmTbK8joT6hTj IHp0wa5gzzW8zvaTywO4KlonKEg9QcdqudNRejujF3Tsz6n8f/GTQfCqtaW8/wDaOqHKhYjuiiI4 Jdh1IP8ACOfpS6V4s8ZapbQz2/8AZwikjWQxhVjkVSO6szEduor52tLqwHhzTYZrZ57y1M2FWMsM MwYE44A5PX0r1Xwp8RrDw34VitbnQr681CTP+kRBWAUnPLZ3cCs76miV0Yvxa1zXIvFltBHdwrHN bJMytCrbCVBIBwM85rgdb8PaDN4dj1C4nkt9TvGa4Qhd7SgsQcjOAMg1teIvGWneJdQl1G1ilRoo VhVZlXnaAvHXk5J9K4e+uZLjy0mkZ9g2Rg9FXk4A6DuePWvUwGD9veUtEjKdXkdkeyfB/VkufB1v ptqB5mnDypAzcnJLBgPQ5I/CutuTLznYPxr5ptDf6Xdi7s5mtrqPldr4fHXp3Ht3r3vw/f8A9u+H 7LUo8fv4wWAPCsOGH5g0sRSjTfu7EJ3NFJgp+d1zWnb3EJUDzFJ+tYT2LMeeKntbFg3WudDZ1Mcs LQyAEfdP8q+cbcbdXnH/AE0f+Zr6AtIcBgT2rwEkDXbgd/Nf+ZpvcznsdVaNiMZr6u8G/wDIoaH/ ANeMH/ota+TrY/IK+sfBn/In6F/14Qf+i1pT2Chuz5i/a1hMnxJ03DEf8SmLgKT/AMtpq8cWy4G4 Tn/gNew/tb3j23xL0xVCYOkxH5j/ANNpq8fi1aYgfNb/AJGvPqp81z6HDSXIkRtZxK2HVl/3gRmm mygI5zz71Nc6m8tvIshh+6dpGevasr7e2eSgojewVWk7FlrAowMczbO69DTZ0wFEEsiuM5MnIPp9 Ki/tHHV1P4U2a/EgwU57MB0rRXMpONtBAt15qsWDbc9Gx2qdRcHJaYDPX5v8Kqfaicfdz3BFSJNO /wAqKeegAxVXIikW0R2ZUVmeRj+FTtbpuOLg4z0x09qpW9tcpKZdwDEEcnp+VKYJweJoh7Urmyjp do6nSruysbRjudpCctk5JHaud8XX8N7NFcQIVYDYxJzu9DULw3zJiFVcnjCnJ/AVk3ySRqxuN4Yn 7pUiinFKXMY1/htYbZXbQTDDHyz95c8Gu20vWLc6ILFEkBjHUnIxnNefRkFwCeK6rTZo5YURBINq /dxkf/Wq6sYtpy6GFCM5pqJ7z4M8RS+HNPOo21hHOsLC3E08hj2I+eCMlcHIJznmuY8U6jYXfiqa 7tfIhxOJrcR4CK2MjGBg/TFcXaXBazW0u5wtvtxIoOWcjOOc8f8A1qjhtLVUjF1ctPChztjG0nj1 zSdSNtynQqX2NyKOey1u81S3lXzbos04K/3uTtHSsTxBeGRhceWqJOC2NwznOD06HrWvd3Nrf2k8 UTi2Z124xweAPX27eprn9J0mOMzJNctFlsoUwykemD1rD6xG/M76CdFx919TK+xWKOJpGljHaSJ9 rA/57VbcXE1ssVrdDUUZt6h8RvheoJJweoq62lrCj+ageOReRGeQfXB7/Q1Qhs7bHlSzyCJR8rAf NnJJJ4rSNZT96DMnTadmVxe2spMVwphl6FZRj9elMm09SN0J6+lPu7GOSRUMvmbuEWTcfy/wqJtN nsGb99Nbd9phYqfz6VrGomRKDRVaGWJuQfwrpfCHjjX/AApLu0XU7m1XOWiVvkb6oeD+VVGhuYrN Z7qMSRMMh4F3/mATiqKvaXWRESxHBG3BH4Zq009iWmj1C0+NurRvdC4s7X7Nexsl5Fb5iWViMeaA DhX9SuA3cd64Cz1aylW6a/t2kubmcyFmxtC9hz+PPFY89t5ZIRzkdQR0qu6yJyynHqOaipTU9ylN o35NHN/NcfYbcRlQrJH5wIxz65J6djxVXydT0+4tm3OZwGdFJDADHPXisuG5aNsxuyH1U4rSOomc xEmEFQVYhTGzA4zkg46Ajt1NZ+zltJ3X9eY+Zbo0bbxZJE/+mWibmA+aJQpA+n/160hrNheT2LJc BGSTLKQUIG05z7Vy2p3kZ0f7Munqt0Jci4UHJj/unk9OOfSsRJiRg4JHr0NYSwFKWq0ZaryW+p2N r42C3EontB5LMdrRnkL24Pf8a2J/EWnXUNjLb3Y8yG4jYxMu18dDwTg9fWuU/wCEcvn8PrrDxRpa lS2GbawXOMgHGQT6EmsR4QBkHqcYpSy6k3daAq8up73vWKeNlmXeykFt3YemeK+kvhA274d6Sdwb /WjIIOf3z9xX5+6bq2o6SzfYrl41b7ykBlb6g5r7w/Z91ObWPhDoF9dJBHNKJwywRiNPlnkXhRwO lZ4PL1hZ8/NfS2wVK3OrWPCPiaNGHjHUHeazS8Xy2m87exB8tdvCnjjFWPA8f2r4deObdG3QxyTr EAuBgxZ4zz1Fcd8XWx8Ttbz6Rcev7mOqvhzxBeaeZYolke1uEMVxsfGRjAJGeT2+lelY5OrOMsWz Eld/qki3Hwz0Vtwzb3sievXJrz9RJbM1vJaSiReDlgPxrt7SNm+FUpZdu3UQ6jOeCAP55oQprQxo mXYpLjnsByK9j+B103/CK+LLWFPN+eGUknbtyrD8eleKxdDXrPwCny3iu2P8dpE/1wzD+tU9jKmv eOMhaWLXL8xxszw3LvgKWxg7u1WtR169tnlg0399BqCRvMSMJvPIycfKASe/NXLZwuueIbG8Mw06 5uA0ohwH3qgKEE9styO4qbSHuLS3jeMu86FhIF+6keSoP/fLc9elcv1ilGTg3r2On2M9JW0Orur+ LUfhhYxJN519ZeRDd7VICyFW6Hv0rj/Hutarqmkpc6zf3F7NCyrEZgo2DcCfuqOuBXFy6ldaW50q W5czCQJcfZ5W2SOpIDtz15/CtbX4IP8AhHJJ4JrmSTcFZXkDLjP3uefypSrKMlFrc2lR+Jwd0irr 2qHUpbW6aEQb4duxXLAYYjqf5V2fwHMjeMr8xxlkOkzqxHruQj+VecSj/QLFuoxIo/Bv/r13/wAC JCvjiSPccSWE4Iz1wua3lsc0PiOK1a31KPWdTijt28qWZtx2bgV3HGPzrU1fWPFWqw26XOJxDCkI HlKMKqgAH6Y69aNYuvL1y/Vld9szjAY+veqltqTzTMs9sUiCnBzmuD2958ljv+ry5OfobOh6LP4j 8W29lqckttZSQPAbk7PlzGegPuMVq6tb2vhbxI+keH5ZreRI1tbi4W4z9pj2g9McHnpkiuSsIWh1 CVow3CnAIIK89Oa7r4m6no2oaboA0pIEmiji85li8v5xgtzjk1006iUrN2MXTvF6XOf0/RfJ18iG 4uorONooHvNy5hLglcg/Rj+FdN4i0+Hw9a3fma5Jdqtylr5l4q/vJHVXG0r04JGfaq2tX+gT+GrL a9o12ZpPNO394y/wZ/pWJN4fvdc8M6xpEMf2QW1xBexrLEVZmwyuFHU8bTV1Kic2k9BU6LjTjJxa bXVWNW7udR04p/YrRC43YmWUD7v4+9Ta54q1eVITaJFZxRuDJudWZ0/iAIHBNWLTx3pXhbStKOpe Gor99rQi7WXL4AG5MsOWBwSD2PQVzvizx7aeLruO00zT102wgzJJvwzyt0XOBwBk8DPNb4bCyrzS fwhKfs9Vuc5qPlan4rDkrapc4XPL7QMke5J/ma0f+EWhIy2pg/7ts1cvqEkto0FyG3S27I2fUDGa 6m58SbreXygUbZuVvX061tmdKOHknBWQYanLFSfcu6fpdtY29xF9smfzlCFhBjA545P0/Kpjc2Vj GsDNduAgUERDgAY55rlNSv3lsVVnYyPh5G7AdhS3Gq+dpCyyHMw+TP8AeI/+tXlRqcx21cFKilZ3 uYbzR2U0iCNwvJUKvJHrTIy8rNNMu0KDsXPT61oNNDbxhXkVriYfN69OnsKqzYWFgO9fWZbiZYil qrW0POx2HWHmkne5Tmdg28sSwHBJ5r1b4ceMdE0TwdYaffSzm6DSO4ji3KpZyQM59MV5Jdg7Oehq PRwsd1uaOR0HXaDXDmdTlasVhKKqO0j6IbxvobDKG6cnsEA/rVjT/GmjTzSRu0ttsAKvLjD/AJE4 /GvG7e4kYHyraXYRgYcnP4GtDTks1Vpb03bHlVgiiG7OOufSvFjipN7HqTy2EY3uz2qDxPowGf7Q jP0DH+leJzsB4iuQOhmfFaFpbCSyLz3MEEchJSWL5pDgHC4zhSeOtZE7bdflznPmHP5V006jnueV i6CpaI621b92v0r618F/8idoX/XhB/6LWvkK2lxGOa+vPBJz4M0A+un2/wD6LWtJ7HNQ3Z8x/tap A3xL0wyrlv7JiH4edNXkVstuXCgIPqK9T/bAEh+JumeWpI/siLnP/TaavFoornggDP1rgqxuz6DC ytFaGpq0EKRny5YVKjJB6ke1YwaP+Jv0FX7iynniHnbceuM1U+w2yHEkmT6Dr+lKm1axeIi3K/Qj zADnd/KkS4i8zGWx681N9lswf9XIfqDTlW1Q5Fv+YFaXOe2ouyGbbhwHByueo/OpLg3IiyqltmWZ hznp0HWqzosyHbEyg/3H6Vdg1k2tk1lLbxR5XAn2ne3uT60tTZNWsZqtd3HKRsR6u2P0qdbK5bBY RgUxGuJVzGSU/vMdoqZLSdj87RhT/Fjn8jQ2RGDZsWRtbTa0IkjY/fb75/SpL7UIXm2xSeZGAPmK Yye9ZkNnDA3747ieDk7f0ovXtDIphhZF/iwAaiWp0Q21EvLazvAd0apL2kQAH8R3rMja4tJPKMTN zgMi5B+lXGltRkbZD+Qpx1PgIjSBV7M2B+lNN2syHGKd46MvLFdCISSDyhjozc/kKqyzXL42cqP4 icD86U3MzWayf6xC+F3HP5fT3qF42f5riX8B0/WoSNp1L6IWBpGnCvKuScYjJYn9K1DHC8RtDFJH G/GTn73rmsuOeGEYik2Nn7/X8PpTodRvDNsxasrZHzTgAj19qfJNyTicNedtGdJB9jW0Ec1vI4Qb S8rnLH1zWVcnTZFf7NvS6XgFNxz7GppsRqLqWGCX5QJMuCA3qD0OasSXLvabcWSI+NoSclvwGKiO FlCV4/mc7r3VmZUMskcizFPMKHO4cEHt7fpWoNUtbhP3kJu5XGCsjYOfpnBFZZaS1lkACsG5wWwC fw6f/rqOWYSTtMkcROAFwuBjHPXA/E1vKlzPYhVOVGndWc0d6t1YSw6fMuCkLj7x/vDAI9K1Nfh1 bUtMlm8R6BarNERm/SMRvg9DlCN2enSk8Lq8kUTW18IXY5YSSLIp28gEADjIHfFXvFF9dvaRRT23 losgkkktZN0bY5Hy9jn1Fawi4aNmcpKWxwMjzGCeQIkc0bgNDMSrtn0B9KbBcxTBgwKlRyD1H+Ir b1y81rxdcLKIkuJoEPyoFUhSevvWTdaBdWV3bJfyJayTEFX3ZRf94jpzjP1rS5m0RtaxzLvjKuD0 INVJbR0OFP4H/GrWraPe6bcgsv2ad8kBGBSQdyp/pVRNTnj+W6iDj+8vBpiBJ5rb725B+hp0vkXK ndEgk/vLxmrUM9tdDEUgDH+E8H8qbJZL/CNv+7/hQM1fDWr3lgsSTSrcaXFcLK9izDJI4BVT1HPT 1GTRqNxpl6bm9tJIbSRnZ2tTHhQo6ALjbnH65rAMU0TEJh/YdR+FMJDcMMH8jQO5MsKmNMtudv4E 5IP8iPoa+4/2aQB8E/DgH/Tz/wClMtfDcUduRiR5I+fvIAf04r7n/ZuQR/Bfw6qyiUD7ThwCM/6T L60AfMHxkfb8UNa7jMII/wC2KViaTtMdxhjgYPIrU+NDEfFPWj15h4/7Yx1X8CzWcd3dnU0RoTGM BlLYOfSlIzkjmPE0z/2vFsIUvGqjP1IFd79qgm8Ma1YW3KWccJyB1YH5j+eas6j4q8L6bKge13SE ZUpaA8fU1JH4ksfEGlanbWlvNETaPKPMVV3DpkAH1pRYprS5xEbcV6T8CJtviXWIf+eumsf++XU/ 1rzCJvlH0rvPglcbPH6pniWynT68A/0q2Zw+I0tKs1vPiVr1ncFRatbR3DEkZDAgDGfUZ/Kue8V6 Va2l7Psmll6qo3EAe5wOa1bt2i+LojQkLc2bK3HXblh+q1V8W3JdXX0PavnMZzQxS5eqR7FGvUjT SizkLbRZ9xvFaJ0j/eBDkk+ladzey6haRx3MVqPkHKLgjPU/WuXOr38GpItvvaMEIAM4IP6V0f2H y7sWq5XDbQ5ORj3rrr391s7stp05qUZK7K5RnghgUKI4ixXnJ+Y5Ofyq/o097o16t7p101pdBGQS oBu2sMMOfUVWvIrqyx5q/IeAyjINRLcs8qluRt7Vn7Wo+p6ccHQjqoL7i9b3JE05lZp53cu7sOcH vn65qo8jrcuIJWU+U5PPUAZI/SrsbSiGY6ZbzyyyLtQbNwAOCeenrVGz0HxNPeq7acVTBDEsFyCM H+dXTpv2vM9j5/ESUr8vnodeJZrzR7e9AP2mYA5zyWIB/WsnWbS4l8otCjLCznrjapx1/Gul0TTd VtbeGCa1tFhhUeWXm3NuAABIA9hUt3Z3FvP9s1GeFwQEZY1IJyepP/1qqq7u1vmVhJOFRSR55JbO 6kxFG2fPuQ7lGO9aR8c6419BcS3kTSRBkLfZ1BIPBzjvzWjqTKqTLBGijtxxwTXDakyiUtuQHPOK ilue5XjCcbyVz3f4S6Vb33gDULC5sINWtzfO8lreOTuOxSCh/hbnr+tedePtP0jS9RiGkeH7nRkc ssjyySsHYfwqH4GPUetbei3Fzp1gIbORrSGQ7zHBIwBJA5PvWH46N0yWn20XG1yxRpt3OAOmfrXt 5dUca0UfJ1o+6zhNRuDLMIeGZhgAGuq0PT4b3TLNbuXY/RG4IIHtXLvGkcryBfmPerOl3jT6T9lj 5uLeQycnqpYf1Ndub+/SXqPL3y1UzX1ayhtIndrmWY5Iw2OufSubiZiY1k5VnJ5rR1OZ5YQvO7c2 fbkGs1B82T823j6V4EFY+hlO6sVi6i7baMBHOAeuKvNIHGKy/KeScJCpd2OFA6mpEkdT8wNfRZZV UKbieBjouU7k9x8wA96l02Dy3JZfk7kZP6Vc8PRJd6zaRyY2ncxB74Umus0OKBNUmUKkiFflJXjp XJmD55mdGbp7GfJaIkKSQOMsOMHH9KbZWV8NSha2n8l2B+cDeEBGC3tiujtgu2ZcDiZwPpmopvkc snB+leWqDi73O7+0ZNWkrh4abTpfNltCr+W7Fd55cZwGPvlc9utc1qEpGvzlsbvNOfrW/plvEt7K 5XsuBk4HXPHSuS1SXbrlwR0EldFKLj1OCvUdXc6m2n/divs3wIc+B/Dp9dOt/wD0UtfDNtckp1r7 i+Hp3eAPDLeumWx/8hLW0mYUlZs+Yv2vJhH8TdMBAz/ZER6/9Npq8bt75UZcqp5r179sONX+KGll mx/xJ4v/AEdPXicduu0kMp+ua5qkbnsYebSSsdNLfwSW21kYA9SnXHeuYuJGSd0tvnXPBToRWxY2 JeDOI3z23HJouXitBs2FXHVSMEVhD3dDsrLnSk3YxAl6/wDBtz61NHZTsR5zgqeMKcVJNf5bC9fQ dadbtcnJEZGem44rW9jmSTfcihhEMhT98rqSDhxjP41PIplKrJtKjPL44OPao3t8vuuLl2kJyVXt SSWhdSEkmB7buRQVqlYebhIQqRgyyjgZ7VLbTTrHJviL3Dfdw3CD3pluIreHLqVUD5j3J9PamNdy 3B2WyiOMdzxU2uXz2GzW7F99zdKrnnAOantrSAo8nmiTGPmY4/Cqz2WBuMmW754H+NWrW2IgcFsr 97g54oloh0VeQGWBT8uCR/dTP60jXTP8sUTsfXAFBUIoZICV/vODj/D9adC/mgL5qAeif/W/xoUZ PZBOrTj8TGRiZS29CgcYyJOh7HFIRAsgUhriUDkknH5Uj+eZ3SGAKqnBlc8U5kKQOzybwRhvLGOf WtY0X1OWpi4pe5qOKeariW3hVFUuw28gAZzWXDJDHJ/y4HaerQsf6VvaaoKoojkgQ8EEbiRTItDv FbH2sj6IK0SUDknUdTVmla3EN5bQRwm0ZYoMyxJCyqG3nDAEYI5X3yTVJzidQ81uJ84MUdu6ge+c Yz9K1ms7orGFu5VURhHARfmPdvxqKWOZmEf2h49vZeM+9PmRnYo7I5ZZo2YrJn5jtBI9Mf40WcFv JKwuhmWM/LuG4Y9R6VcktElBY5BySCOo+lULkTQSI8i5ION4HDD396m4NHQ2flRoBHgKPatCGZR1 YYrCtZPMjUjiriMOAaQy7LBaNIZYWNtN3eEhc/UdDWN4gkubmy8p3SURtvWVV5H1H09K0GMYXt+V U5HMZLR4+hFMRyd0sksUW3fMkaYDq5KKPzpXtNyMZUJkx9/OB+IHWrcPlS3t0jKY7pTkNH8oI9xV WeaEy7AiuCcGQDbg/wAjVXEUpdMkJ+WMt8u7I4OPWize5hJUuzRoOVYcj0q7ayr5rhvLnUcB1GCv 4elF/OocJbKgIXLH09zTuIgtr+AL5VyjRvnksO9W2hjmUMjBl+uf1qG3LXVs7XMSPEvRiME1XjtU J36dclG/uE0wJZbQjO0kfXkfnX3B+zWpT4KeHFOMj7T0/wCvmWvhwX1xBxdxZX++lfcv7N8iS/Bf w68f3T9ox/4Ey0Aj5W+OdxH/AMLR1VVBDKsKt7nylP8AIisPwysl3NOkSkkRgk5wByOprd+NsLw/ FLVbhoZNrmIoSpCviFAcHofwpmnQx/ZTHakLLcBXEgl8xHC9QOOCM9KiTHJKxT1fwpPfywySXdtb pGpDZO4nPoBWp4Y0aKyv5fKupZttq1u26PCsDg5U+2Ku6LFJbNP9qNu6s37tQg3Ae57npWjDqaSX XkLtGG2Y3DOfpUKWpm72sebocKB6cV1PwpuPI+IelHON/mx/nG1cvMvl3U8efuyMP1NavgWXyPHO hvn/AJelX88j+tbPYzirM7zVbeS48aTNaRK939lKI/OUBLBsfgay3+Hl5dv/AKTqE6qf4cr/APXr a1CJ4/iJp0yymFFEokOcArjoa6mXV9NgP7y8iz6Kd38q4ZwXNzdTuhUnFWT0OP0/4b2loik30+Qd wKjkGoNdtItNDW8Zd2CkiRvvHoev512qavaz2VxcwF2hhIVmK45PpmuH8SajFf3CNErKANvPGe39 ayqq6O7A1OWrr1MlZ55YpIWC+WRxkVz966xAq8oxn7o4xVx528m3kc4wSpyT1/yKy7ySCKV1ijLS 5+8w61jGJ7U3c9A8C3kTaLH5kyxpE5QbmwMdR/OuqjntywCSB27AHJrxvQpY4mbz41ZguAHGcfga 1LXVFstSieJ/KRTkYGR78V1xjdXPn8TFQqyR2l94w022vpLRY7qS5j4dBHjH5kH9Kw9Q8WNrDTWC WMkGIzJvdwScY6AUeMTDrFnYXkqxSNAxVZYZCjEN2I69vWsO0iUXHmQqFKxMoBORg/8A6qpU4t2Z j7WUdUG9mSdWJOY3H6muXumPlkLDye5rrLldhZ2OBgggd+lc7dFWLc8Vy03Zn0Uk+Wx6h8DLnFnq 6PlsTrje244K+p/lUPx2uFWfRETIPlytjPA5Xt2qn8NtUstKtJpJpAvnFSQoySRkdKrfFbUrfXIb CWyjlLWxdWZlxlWx0H1Feng5JVos+arbNHnU9ycHvVrwfGZLjU5P4Y7RmbnkfMuP5VlT5KnaCcDJ x2FafhWCSZbpreVlkIEbIDjKnnn16V6OOknTaMqD5ZKRcvCqyt82FJz83c4rNmBUMF4z2rqm8KXN +pNzchFJzhF/xpw8KW1tHs+0TucdSRgV4cY2PXeMhexyeklY9RikkyAmTketXNaSEfvoUjjDfwxj jPr9TVmTTTYXq7nV4yDjIqrrhkNkudgAYcL3rppuzPPxElOWhlaXdGy1WC4VSxRw20d/avQPAumX VzM829SN20xu+2QgjqAew9a43wyjSahttIJJ78AtEFxhQBy3PevYdE0m4tLO0S8IOoXb/vGH/LNO pUY746mtZaszhG7sWvEOhWun6U11ppeZ0zJMitu3Z6sPpXDNqtu74xInfLLx+lewyrC22PBX5dpx 029MV5H4q0K50a8ldYxJYO37qUHpn+FvQ1MkZkEGpwRzSMJQBx1HWuT1R9+qzMpyC+QRWkGPmH5e 1ZV7/wAfjnGOlKIWLcMu3Ir7z+HBz8PPC59dKtf/AEStfAUZzmvvz4a/8k68K/8AYKtf/RK1bElZ ny3+2OjyfFHSwo4/seLJP/XeevFoLFiPvD9a9t/bDmWP4oaWGwD/AGPEef8ArtPXi9veDjkYz2rn qNno4dRsrmnYWksaArIQByOTT9Tga7lR5zsAG07e/wCNWrPUF8pVCo2Kbq11FJYSIsJLN2BrjUnz HqShH2eiMgm3t2KW0asw6sTwKrTXq/xyFz6JwtRR2VxOfm/dp7/4VdW0tbQBpCGb1bn8hXRdI4bT e+iKULXE0gMMRVOnHFWHhuVBIUbvVpDSy3uwN5YCDHVuv5VVW6VgCULt3LZOaerDmS0Rq3E9lNow jXzTcggytKR8uP7uOozWZHLI4226YHTe3ArQ+zW7Wu+Z4Y5MDao6sD+GMVSh8xxujA2r1kfhR9PX 8KqKvsTUlyu7Y82ZcAyysSfTp+tMENvaku19Kr/xBCOnerFsySTokayXLZ/eSMMIg78dPzqVI9QW clbG1uVz8rBcZFaxg1uctSvF/CafiyTTpoNGuY3lkiFotvFtXAl8s43EHoao2+/ALQBEPoeQPxrY 8TR3MUGlG3ihtla2DTK3/LFyTuUd+eD071iW7JvGJ38zPXcQDWpyspSiFr9wxnlb+GLoF+tWWYR2 8hKCEAdQc/n3pqRXMl1MzMI4SeoGC9W/IiEZXLNnqD0pNpCQuiSqCpWabY33mIzXSxzRcNGwya51 WIwBxjjAqzGz/Ss5O5aNzzFPQD8Kq3sY2+anDL1+lVUdwOpp3mt0JyKkq4kU2YwiRPJMPvY4A/Gk +zyyk+fIFXukf9TUaTi33Bidg9P51A+piWQxWamWTuegX60wI5LldMuJIeZARvQA8g+hquviN1kI khUKD69BVKRjNcM7yKHfklhx6VmTq/nncBlep7GnYTt0O/juY5gfKkVwDg47Uj+9cnbXhFo2wgOe uOtW01T99CLfcVUfOrcZosTcgu5Da6reuVO1k2qenJA5rKdtqEkjGMj611n22KbMbW7uwGWUAOBV G6s9OlzlZLdj32kD8jTuBg2cDSq0yA5XjAPc1PDieQK4Xaf4zwPXrTmtXtmZbe4RopB13YH4+lbO j2htrOUTtHJ5h3lRhhgDpTAFuYFtyqIC4XCRg8H/AOtXOu3z4niIbqGX5TUrDkkHaDlgvtQb1Y4v LZFkIP3W5ApoRZR3ggGSZWbkK+ASK+4f2bGDfBXw6VQxg/aflIxj/SZa+GvOtrsjzPlbsG4x9DX3 N+zeuz4L+HVBJA+09Tn/AJeZaAPmf426jfTePNV06W8uGsImiaO3ZsohMKElQenPJx1ritGvJtPn QMweEFmUY+6zYBP5Cul+NblfifrWAT/qen/XGOuMimTzOf1ptXLa0OrfUTLnbNHk9s4qbTWIv4HK hW3gk7ev41ywAkbnk1oWqPF86yTRkcgqeKy9nYzkVtX/AHWt3yHjEzfqc1Z8NypH4l0mSTdtF3F9 04Odwx+tUdTJkvJJnkLyPyWPU1WjnMcsUiEq8bq4PuDmtBKPVHsXi2EvrbF2yx3DI7D6VlPCkYGW Jbso5J+gqxe6vaeIb/7RpUkjRlsH5CrA4yQc1Ja6XjcVXaScsd38ya5ZLU2Rd00OPDGpo/B8xH2j twR/Suav/IFvvWYNKclUBz78+nSurDWdhbPHPeQRpJjeC4+bHSud1TWNOuopILGLciDLORgZ6DH1 rOWxtQ/iKxgRIJfMWQZUSFgGGQc88VS1DIkIVSB64Aqe5uksid7KQBgBW9vSufudS86UlUY+nfNc 8ISlsfQupGCtJmnp6pJeRxMVAfK5zjmtaTTbCMH7TcR47jdk1iaXomsaswNpZSbP77jArtLHwFdG Nftk8cZxyEGTXTFNI8PG1ITnzQMmW50SKCERPc3LoPubSFQ+xJ5/Koo9WiLeWlmEU9WDZbHoBXcW XgjS4ADKj3B/224/IVuQaZaWYAtraGP/AHUGas5Yt3uzySax1nUFC2enzBTkl3+Uc/WmR+BtWl+a 7uYYB/dBLGvU9S1Cy09C19dwQD0kcA/l1rj9V8c6RGSLbz7ph/cTap/E1MadtkdE8XUnuxmheF4L SHDzSswJzjAzVu6sokSREizwcFjmuYHjW6Z28i3WJT03NuNULrW9Rv5dgdmkfog4z+FWou5zN3Mj RPJXUXW4KiNkZWz0607wxqMej6vOSrSRMGQAHBODxWfblmum5IbkYpBBN9sUvE4DNwQMg10y13JR 2134zudhW1t4ovdsuf6ViHV9Qv5wtxfLCD/fOxf0FT21jkZZPzqSbS4JihcMGX+6cVhoUXltXuLV Ym1KOVQcgJt6/XrVLVNOQQKl5eQRheVYnBP4VXl0JWGY3cD3wagi0CQkmdwAOy85FOOjuDVzV+Gb WUXi8RMwmmkjZLeTaQFbuRnuV3V7MrA6ooznyo8j6k15z8OtKtrfUpbsJ+8gX5SR0znP6CvQbC5j ljaaT5ZZDn/gPYCtU7lLRNmhK2XzVa+EUkDRTKrxuNrKwyCKZNNtGVB471QmuC43ncewxVmR5l4g 06TTNWkiJ/ct80RA6rn+Yrnr3BnYjpxXqGvxxT2v+lIu0HILHkfSvMr/AG+e+z7vaoS1ERxcGvv3 4a/8k68K/wDYKtf/AEStfAKnFff3w1/5Jz4V/wCwVaf+iVqmCPlj9snyv+Fp6V5pP/IHi+n+vnrx 22FqBxXsf7Zcat8T9LZ2AH9jxAf9/wCevFLWzTtJ+RrGpsd2Guuh1GmR2u0cHHrxWg9nbsuYny3o RWJplsMfNNgehrYSzkP3JV/E4rzp7ntU9YmJrUptP3aYDHq392sMTPKx8pSzHq7V1WqaY8m03ZYo mSB0HPr61zU8u2UxWyDAOM9hXTRs1ZHBiU4y5pOyGiFIl8ydtxFLBLJcAiNQseeXJwPzP9Kchgjk Uz5uJT0UD5R+HereqRxNb23mMY2yS4K4IHGMDtXVGHc8+WIs7QKjmFWRLdftc2OFGdo59O9XTI0V jMt7hpXAGEP3Bnp6D8KqxzOymLTIQkfRpW/qanYta2WwZuDI4ySOregrRJI55SctWTWvnzCPEawW wI2qPvN+H9akGl+dfSvDLc2pLksEbhTUdnBcmZLi6f50OVjU/Kp9z3+laHmylm3MAXYsT6k9aGxF jWraKcWO+Sac20IjZ348xsk7jyT39arxxhgQNoHvS+aMYJyaYj547VLkxjntTgndu9hQkQBBPB9K lV09WFSoY8Hg8+tQxpDRbDrnmhYyG5pCnzZUkCnEEDrSGSMDiql3I0UJZcZ9W6CpvmA+9UNy2IyW +6OTTGY8spmn2mYk47Hgn047VFDbzOd0m3yujRxuAxHoTUdospLsEyGJB9+e1T+WiqQUdQevOapI limBDJumaRIx0Xy+B+OTUN/avHbCZhtEh+Vc8insB0jlI9QwpJZJZVVZGVwpyKBE1qXeCORlQqw5 LAcetIfKWUuIwFIxhRgmm+Y+3DRhvwNKrKxJ2MD9c0AxYJAjFvMmjboNpzgdgc9auJcSEDFwrD/b T/Cqiso6qwHrin+dD3YD60mImuA80LqYrdiwwGU4I96gEMIVVa2ljfHLRt1o+RuUIP0NMbdtI3HB 7Gi4CNbw7dvmyqvo8fSqN1YxDLpcxuSenINXvtEyDAbIHrVe6uHeSMyKrbfmK9vxpq4yq2mXS/dR ZB6owNfdP7MqsvwQ8Nq4KsPtOQRj/l5lr4kjuIHOWtwp/wBmvuL9nIq3wZ8PFM7f9Ixn/r4lqr3A +TfjiyD4p62GHP7nn/thHXFxTIM5w2f73NeofF+0Sb4iauzBCT5XDLn/AJZJXDy6PA+cRhf9xsfo adylNGYGQnITH+6xFWoJVU/vbm5RewCBx/MUPoZHMcsgPuuf5GqsunXkR+SVH/HH86LlXix0rSTS NtO8djjGfwqNlcELtOTTSt7FndCT7gVqaZf2XlpbahA43HBc9Bk/mKTYtjptB1Uad4YltrS3aO+R HlllkAI6jGPzH5VnXuqXt+4Rr1pF/uKcA/gKXT4UkhvLOVuIXMe8DBZTgj+VMk0kwSedZMzAZO09 QfUVg9WZzu9h1pptzdSBILG5upScYiUtj6noK6Gz8Ca3dJteO2sIiQT5shZz/wABX+ppy2/iNNWt LaKJ4rKCRS5Vv3UagjgE4H49TXoV54k0u0z5l0rsP4YhvP6cUrDj7uqOVsvhjYJhtRvri5busaiJ f6n9a3tI8P6BYu/9n2Nv5kLbHdl3sG64y2fWsy48eW/nKkFqwjJwZJT099o/xrl9X8Qzpc3n2O+d PNk3t5YAUnAHB69KRV29z1KaeG3j3TyRxIO7sFFYV94s0m2JCTNO3pEuR+Z4ryee8knfdK7yue7E mmL5sh4BxTsB3OoePpACLK0jX/akbcfyGK5DV/EetakWD386Rnjy4jsX9KWCwZzlq0INNQfeGfrQ mkG5xx0+SWTJyWPduTVlNKdT8w49q7JbWNBgKBQYE6hRT52Oxy0dntb7masnSLS4IaeFWfGMgkVt tbqeoqM25XpzU8wWM+20TT4ZAyW6hh0OSf61fSCJOAgFPCPn0qdBk84NF2wIlg3cKuT9KryhUVyR naCSB1rasZvstwkwVX29UYZDA9QfqK6a4OnyW6zRiKW3cA7HUb4u2PcZpxVylG+x5U+sQlMQHn/a FRw3l3ks2x0PYriumn8I2t5HOkiGC53lo2hxtI/3f/1dap2nhiLTYQ1/qEhleVY0ij6ZJ759a6/3 VtEKdNxdjoPBKvJa3L+WyPcERrk8DHU/qa7CWKKKKNcKNgxxxWXpMS2n2eFUChVLY9zWw91GP9av A7kcVktAb0sZs9yNpChiPUjFVGmVId2Tu6AelWNR1iz8sq8RZR3DfyridZ1syv5Ono6r/EX6n6UO RDRD4kv2lm8hWLOTjjt7VyepRmG7liZgxQ7SQMZres4cXiPLJmbknIzg1h6sS+pTk4zu5xRFhYrI 2CM1+gHw0/5Jx4V/7BNp/wCiVr8/jx1r9Afhn/yTfwp/2CbT/wBEpVsGj5c/bJBPxN0z5Gb/AIk8 WMf9dp68Ht1cbzyCFyK96/bG8z/hZ2meWcf8SeLv/wBNp68JVpVbDEkUrIfO+g+21GeFxiPd7Amt aDxC0bgSQSHtsSTk/pWKtxOh/wBWG/CtGy1iW3kBktFkIOQq5B/lU+zg90WsRVjtJnYabqA1dLmF Lf7OIoCzRyS+Yzg9TwBjtiuTWzdlPSC3HAYjlh9Otdfo3iFNRnhsf7JtrHep3SoR5jYGecKP1Nc1 qCTzTzNeHyoEcqAON2DVqnGHwk1K86q993KkcwtwUsIZZSD8z4yf/rfhTtSa2W2iWYMtxuLOpIJP 1IpbeX5/KtYJUjP3nAwT+JqdrCKa8M0a5iGMbhxnH60GRRiE94qhR9nthwuByfoO9aI2pCkbbiif dB659SaslAoJDjOOpNUHlXedzjcP4c9KVwaLAlORxgU4FmfgZzVYMWk5yB6VbEgRRtJz3qWwQ4xk dsH1pFGGwKQzbhznNOjYnkAVJQ7b604HFBUnB703BzQUSiTAwKDJmm4xxSEUAO8we9V5XM7eWBlR y3v7VIxCqzHsKjtwVTdkgtzQBIVGOn6U0xg1Jn1pN685pjKktuG7CqzWmT0rQZx2qJjnoTmgllRL ZkOQ5H41KsJ9TmpQWB5wacGHdaVxFVxIp5Ix7iolyoO5QwJzwauHrzUbYbpii4is4iP3o8fhTfkH CsR7Zqy0a9xg1C8Gf4vzFAEEpKjIJJqEkE/Mv15qeSBx901EVmHUZH0qkMFEY6bh+tfc37NmP+FK +HcEkf6T1/6+Za+FyxH8Ir7n/ZqOfgp4cP8A18/+lMtMDyvx78Ote1rxjfalaf2abKXYIxLKyPwi g5AU9we/SshfhLrLDlrFW/2bhj/NaKKfKhWGt8JNdAzHPYk+jSsP/ZaF+E+vlSHk08H2mY/+yUUU WQcqIpfhBrrjh9N/7+sP/ZaoXfwW8RyRkRSaVuP9+ZyAP++KKKOVDWhY034Q+J7Zm82bSiHOWKzO TnGO6Voj4V+IB0msP+/rf/E0UUnBMVh9z8NPFNwoE13ZSkf37hyP/QarSfCnxI4AE2mgf9dW/wDi aKKXIhleT4Q+JX4+0aaB/wBdX/8AiaiX4M+IDgPcafgekrf/ABNFFHs4gWY/g/rif8tNO+vmt/8A E1bi+FOtJ1ksD/20b/4miij2aC5ZT4Y6ypzvsv8Av43/AMTTz8NtbPR7If8AbRv/AImiij2cR3EP w01s/wDLSy/7+N/8TTT8M9c/56WX/f1v/iaKKPZxDmY0/DLXeMS2Pv8AvW/+JpP+FY67n/W2P/f1 v/iaKKPZxC7EPwx14/8ALSw/7+t/8TQvww10HPm2P/f1v/iaKKPZxC5KPhprmOZLH/v63/xNaele BtbtIZLa4NlLbP8AMB5hJRvUZXH4UUUKCQKTRdj8E3/nl5milXGQGflW9jjpUF94DvbmSOQRWm9D kOznI+nFFFVZDcmx6eC9VEzuxtjnAX5z0/KpH8G6k4G8QMB0XzSB/KiiiyJMvVvAev3QCWjafbxd 8Odx/HbWRD8KNaRy7SWLMe5lb8/u0UUOKYrGjafDK/t4PLC2rEnJdpic/wDjtJL8L7q5B+02unlj 3WQ//E0UVyfUqd+a7v6s1VRpWMef4Qawci3j0lFOMkyvnH/fNfRvhjVodJ8NaTp0ttP5lnaQ27eX tK5RApwSwOOKKK6IUow2CVRySj0PFvj74E1v4g+MLPVNCezgtYbBLZlvHKuXEkjEjaGGMOO/rXmx +BPi0qM3GilveaT/AOIoorQzHR/ArxUGy02j/wDAbmQf+061tM+CviCGXdcXtmg7+XKX/QoKKKYG 1dfDHxFHaiLT7iwyerSEIcfVY81zk/wS8T3VxvurrTSnXAnfJPp9zgUUUN3FYuj4O+I9gVptN2jo gmfH/oPNRzfBzxO54uNLC+nnP/8AEUUUgsRD4L+Jx/y86X/3+f8A+IpT8FvEZ5MulZ9fNf8A+Ioo pWQWD/hS3iM43S6Wcf8ATZ//AIinf8KY8Sdp9LA/66v/APEUUUWQxw+DPiMf8t9M/wC/rf8AxFO/ 4U54k7T6Z/3+f/4iiijlQC/8Ke8S4x5+mf8Af5//AIigfBzxIP8Alvpv/f5//iKKKOVAJ/wpzxJn In0z/v8AP/8AEUf8Kc8SnrPpn/f5/wD4iiijlQDJvg14meMqJ9Lyf+mz/wDxFOX4OeJQoHn6ZwP+ ez//ABFFFHKguDfBvxKwwZ9M/wC/z/8AxFM/4Ux4l/576Z/3+f8A+Iooo5UFxp+C/iU/8vGl/wDf 5/8A4imn4LeJu1xpn/f5/wD4iiijlQB/wpbxPnm50v8A7/P/APEU4fBfxKP+W+l/9/n/APiKKKOV AB+C/ib/AJ76X/3+f/4imH4KeJj/AMvGlD/ts/8A8RRRS5UAxvgl4nPS50v/AL/P/wDEUo+CfifH /Hzpf/f5/wD4iiinyoBp+CXif/n40r/v8/8A8RSf8KR8Uf8APzpX/f5//iKKKOVANPwP8Uf8/Gk/ 9/n/APiK+jPhLv8AB3w+0rQtSiaW7tPN3vbkNGd0ruMEkHow7daKKdgP/9kNCmVuZHN0cmVhbQ0K ZW5kb2JqDQozNyAwIG9iag0KPDwvWE9iamVjdDw8L0ZYWDEgMzYgMCBSID4+L0ZvbnQ8PC9GWEYx IDYgMCBSID4+L0V4dEdTdGF0ZTw8L0ZYRTEgMzggMCBSID4+Pj4NCmVuZG9iag0KMzggMCBvYmoN Cjw8L0JNL05vcm1hbC9TTWFzay9Ob25lL0NBIDEvY2EgMS9BSVMgZmFsc2U+Pg0KZW5kb2JqDQoz OSAwIG9iag0KPDwvTGVuZ3RoIDQwNS9GaWx0ZXIvRmxhdGVEZWNvZGU+PnN0cmVhbQ0KeJyNk11L wzAUhusXaBD1xuHlueyEZUmbs7a3+xIGCtsKDoYXUjutrBvbRP++J9nWpZOBCW3P05z3TZqTLkAA KgGBjHiEUEPfPJcpe76HGau30+8sSQcPTUhWIE1fJTMS/YDP0QvhcWvgCVJTQNLJ/R+hoK6FHvTo +gTkISjeQCEU5MwjCjY0ZYEMuCyxIlZ7jH6DKyzS0ffXqL0KQAONHexcSgQfrCa4t83NNy5ReYYt eqI0v0G1t3xZsLbakZlGlbGwmtj71hqaXRMwbD3BAjAIuW9YIX0/AolCukvuISQ51LujkYT2HPps wZrxXgVEUQHK60oSC4gnILjA9dg2iHMIGgFEkU5oj13nqEprDHSTrnNcrUkupRSh65xUhQ6lRNc5 tZMqB5IuKVbUkN5f2YJrS1ByOrMGbPW5Fd/9x7VyaIbbQ+oLDT41pVznpvoS91gnZv2DBdIHe/xC 8GbOt+CR9YvUB+n09Sv7Tlvz6XyZ5enXMktgmdGPkemCdCS8r8CnAiOoCDmaI+jZPGVD9gusDr82 DQplbmRzdHJlYW0NCmVuZG9iag0KNDAgMCBvYmoNCjw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIg L01lZGlhQm94WyAwIDAgNzIwIDU0MF0vUmVzb3VyY2VzIDQyIDAgUiAvQ29udGVudHMgNDQgMCBS ID4+DQplbmRvYmoNCjQxIDAgb2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0 aCA1OTkvSGVpZ2h0IDMxMy9Db2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50IDgv RmlsdGVyL0RDVERlY29kZS9MZW5ndGggNDY5MDcvSW50ZXJwb2xhdGUgdHJ1ZT4+c3RyZWFtDQr/ 2P/gABBKRklGAAEBAAABAAEAAP/bAEMABgQFBgUEBgYFBgcHBggKEAoKCQkKFA4PDBAXFBgYFxQW FhodJR8aGyMcFhYgLCAjJicpKikZHy0wLSgwJSgpKP/bAEMBBwcHCggKEwoKEygaFhooKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKP/AABEIATkCVwMBIgAC EQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAA AX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4 OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaan qKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQAD AQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEG EkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpT VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4 ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APqmiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8U/aS1rWNIPhz+xdTubEy/afMEE7R eZjysZx1xk9fWva68G/alAY+GAUif/j64c4P/LLoaUthrc8cn8ZeKB80niLxBCf7y38pX/0Iiqh8 c+MFZinifVpU2kgi/lH/ALNis24YQrnNxb+5G9fz/wDr1jahMI4ZJG8lyVOHTg5xWZRqQeOfF99q 6xDxZ4hht0+aQrqUxx7ferro/GHisDKeJNVmX/r/AJQf1b+tcV4bszZWYkkdorif523LwR2rX8os dxhVv9qE4NU2I228X+JA3zeJdfgc9nvpSP1apl8YeKkgdv8AhItXlOQOL6Xp+LVgB2HypOT/ALEo /wA/ypxkjhti8se1VbcQnI6YHSpYWNK98c+JLeEQxeJdaW4kIb5r6VsD8W4H0/rVeH4ieLbaRBJr urys5CqFvpGDH0wW4rmbq580PLMyTIOc5wQPp/hV3RrA5+0zKQ7j92rf8s0P9T/L61WyFuzuYfHW uyttn1vWUKnO5byXB/8AHuaq3mt+LJo3On+LdYcNztOoSgj6HdWM6ADFQohhAEYO0dADyKzKJR4o 8aWqiC48R+IkY5LSNfzHvwFO7qf0roJfE3iyKLbD4j1eUf3Jb2QN+Dg/zzWPHfSINrkOvdXFW47y 3k4Y+WffpSuCRpW3i7xBbW6xXXiHWUkLHDSX0pBz0AbdVrTvFHiJri4Z/EGrsoACg3shHP8AwKsv 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 c3RyZWFtDQplbmRvYmoNCjQyIDAgb2JqDQo8PC9YT2JqZWN0PDwvRlhYMSA0MSAwIFIgPj4vRm9u dDw8L0ZYRjEgNiAwIFIgPj4vRXh0R1N0YXRlPDwvRlhFMSA0MyAwIFIgPj4+Pg0KZW5kb2JqDQo0 MyAwIG9iag0KPDwvQk0vTm9ybWFsL1NNYXNrL05vbmUvQ0EgMS9jYSAxL0FJUyBmYWxzZT4+DQpl bmRvYmoNCjQ0IDAgb2JqDQo8PC9MZW5ndGggNDAxL0ZpbHRlci9GbGF0ZURlY29kZT4+c3RyZWFt DQp4nH2Sy2vCQBDG7QvapbS9tPQ4RxVcd7K7eVx9FYQW1EAF8VDS2KYYxQf23+9stHFjsbuEzI/9 vpnNZBYgQCsBHgY80FDTMnsvY/ZahRmrt+JNEsX9pwZEK8Bsr6IZmb5Bcu348PybwBHkpoCsk6pt bA5IYvag+QIOdOn5ggW4vuSuzg4USh6Ao7kGV3NfQ5RCvTMcIrTm0PtzCWMxlyApKMohhIKUOUTe jqbMQ49jgRWxOmAtXa50LtdSbtHkykFn4O5hn6VA8MlqgjtgWkjalFFLsqTBrkaGmJsz8QHm4glb sEZ48Oki//Rj7aWudRCkKyCcgOBi2988CFPwXA+CwAhao3LppEJlPbOwXDqt1JAjovDLpbOKMCGi LpfObZF9cGMfXNKBoqXJfWfFBfeFVeLaEtnmRysuVLi1zA9WXKhwf8x9ZUDSUspccBx2WTtkvX8n dTQmeM8GVtCE7me+3o+nb+tkEzfn0/kySeP1MolgmdB0JuYntBE+ViB9LjWogAbbzIODrsVTNmA/ bqS4Iw0KZW5kc3RyZWFtDQplbmRvYmoNCjQ1IDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIg MCBSIC9NZWRpYUJveFsgMCAwIDcyMCA1NDBdL1Jlc291cmNlcyA0NyAwIFIgL0NvbnRlbnRzIDQ5 IDAgUiA+Pg0KZW5kb2JqDQo0NiAwIG9iag0KPDwvVHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2Uv V2lkdGggNTQxL0hlaWdodCA0MDQvQ29sb3JTcGFjZS9EZXZpY2VSR0IvQml0c1BlckNvbXBvbmVu dCA4L0ZpbHRlci9EQ1REZWNvZGUvTGVuZ3RoIDQ2NjI3L0ludGVycG9sYXRlIHRydWU+PnN0cmVh bQ0K/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAGUAh0D ASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0 NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKj pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QA HwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEE BSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0 tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6 mnmS3gkmmbbHGpdjjOABk1jf8JXov/P5/wCQn/wq/rn/ACBdQ/695P8A0E15BQNI9Q/4SzRf+f3/ AMhP/wDE0f8ACWaL/wA/v/kJ/wD4mvLiBTcUCPU/+Es0T/n9/wDIT/8AxNJ/wluif8/v/kJ//ia8 sIppFAHqv/CXaJ/z+/8AkJ//AImk/wCEv0P/AJ/v/IT/APxNeUkc0wjmgD1j/hMNC/5/v/IMn/xN J/wmOhf8/wB/5Bk/+JryYjion6UAeunxpoA/5f8A/wAgyf8AxNNPjfw8Ouof+QZP/ia8bmYKKzbi 7VM5YCk5JDSue6f8Jz4d/wCgj/5Ak/8AiaT/AITvw3/0Ef8AyBJ/8TXz3LqaLkluAcZpq6lEeC3N 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 RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAf/2Q0KZW5kc3RyZWFtDQplbmRvYmoNCjQ3IDAgb2JqDQo8PC9YT2JqZWN0PDwvRlhYMSA0NiAw IFIgPj4vRm9udDw8L0ZYRjEgNiAwIFIgPj4vRXh0R1N0YXRlPDwvRlhFMSA0OCAwIFIgPj4+Pg0K ZW5kb2JqDQo0OCAwIG9iag0KPDwvQk0vTm9ybWFsL1NNYXNrL05vbmUvQ0EgMS9jYSAxL0FJUyBm YWxzZT4+DQplbmRvYmoNCjQ5IDAgb2JqDQo8PC9MZW5ndGggNzIwL0ZpbHRlci9GbGF0ZURlY29k ZT4+c3RyZWFtDQp4nHVVW29TMQwuNwFHCHgZAp7y2E5aFid2Lq+7IU0CaVslJk17QKWDonbVumn8 fZycnRN3qKmqxl/9OfFnJ7lRRhEaFSDpRGqHXPldTZvv2+q62T2Y3s8m09Mve2pyq6B8bifXTPqr nCYb1dcugDXM5glTr7b/Ixr+ZKJVx/z9o0hHhdqTMagWjWUrPFjzJkDQsGYj2/jIJuc1Uu9OzrVm jtUbVAxfjRplzVK/mx2jbee7yBaECDYUiCfMyBjYaIkxXtLHFjOGDKaCEeTI7IbOO1ugiC3kHLRe UQO1EBGijwVClwoUwbTEqH3yDIE2iSIUJEEqCBqKTuVKsXdBgvOQCmKp1cBEa6ggvJOCoIuu9UEb e53SuobCRG+Fd0YiRBExAGfiUayaEUwodpaRaFDsPveZiUlkmBGHXsiQEfJSq4wE8kLQ0q+GhOrc gNqAE7UpSIiighmRnVNM0VgPBNQ2RrQiqNPJWRPFwtz90VsnNueyDJFEAlYnrEhO0mrvjZdCcGEM YhJiWQ0RQOgJOiUXhOTAIpABUZbcAsGKyoH2vILtSwt9krnu0mr7ovp3vdOH7Nqrrtq1YL+xrkv7 rfedXNPr+71q0J+KKlR/dqqa9YhVzetRrJWpR7bWrxzqWmB5xufNlbyl9s/KHWXU2f43daMoclGL jcjb5HW4h0ghsZaThdo9Oj8HdbBUJ81Nszd+dN2Z/rpjvyNgrlHjK8V5UPtfNxkvVPBBpZQdDi6G gycj3mLIA4aDp6Md4DTBxOHg2ShnzIOGg+fS6bNwkoQ3TEAe9Ij8OpMdD8Th4NN6rC3Bkfx3Iu5L MV8jv9iw+Csx/yjmbyVZrvBh0wpbm9hrOb0fXY6Pm8Nxc7KxvPkRurhk42d5i4xO4jnbPZ3Of9zN 7qf7y/lyNVtM71aziVrN+BGb5Xoegvp1q/hq4qbARNzV+QGLJOx5c9b8A5k9dOANCmVuZHN0cmVh bQ0KZW5kb2JqDQo1MCAwIG9iag0KPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUiAvTWVkaWFCb3hb IDAgMCA3MjAgNTQwXS9SZXNvdXJjZXMgNTIgMCBSIC9Db250ZW50cyA1NCAwIFIgPj4NCmVuZG9i ag0KNTEgMCBvYmoNCjw8L1R5cGUvWE9iamVjdC9TdWJ0eXBlL0ltYWdlL1dpZHRoIDU3NS9IZWln aHQgNDQ4L0NvbG9yU3BhY2UvRGV2aWNlUkdCL0JpdHNQZXJDb21wb25lbnQgOC9GaWx0ZXIvRENU RGVjb2RlL0xlbmd0aCA2MDk0Ni9JbnRlcnBvbGF0ZSB0cnVlPj5zdHJlYW0NCv/Y/+AAEEpGSUYA AQEAAAEAAQAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwW FiAsICMmJykqKRkfLTAtKDAlKCko/9sAQwEHBwcKCAoTCgoTKBoWGigoKCgoKCgoKCgoKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo/8AAEQgBwAI/AwEiAAIRAQMRAf/EAB8A AAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUS ITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4 ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEA AAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKB 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 C58car8HviA8wjg8O+ZABkML23ByfrJTdO+Dvj6zmWRPDTbgc5+3W/8A8cr7JoreFRwVkZygpO7P kbU/hV49vrFYm8Nv52cM7X1vyP8Av5WDJ8CvHjj/AJF8g+17b/8AxyvteiipUdR3YQgoKyPh4/Ab 4hAkroIPpm9t/wD45V7w98FfiJZ6wZpvD6pEy7SzXtucDjsHJr7ToqG7qzKSs7ny/L8KfFgsp/K0 ZjcbD5Za5g4bHGPnx+daunfDfxXHYxJNpeJQoDZuYjz9d1fRdFRyIvmPnh/h34rx8ulnP/XxF/8A FVWl+HHi9umkg/8AbzEP/Z6+kKKORBzM5r4b6ZeaP4L06x1KHybuLzN8e4NjMjMOQSOhFdLRRVEn /9kNCmVuZHN0cmVhbQ0KZW5kb2JqDQo1MiAwIG9iag0KPDwvWE9iamVjdDw8L0ZYWDEgNTEgMCBS ID4+L0ZvbnQ8PC9GWEYxIDYgMCBSID4+L0V4dEdTdGF0ZTw8L0ZYRTEgNTMgMCBSID4+Pj4NCmVu ZG9iag0KNTMgMCBvYmoNCjw8L0JNL05vcm1hbC9TTWFzay9Ob25lL0NBIDEvY2EgMS9BSVMgZmFs c2U+Pg0KZW5kb2JqDQo1NCAwIG9iag0KPDwvTGVuZ3RoIDQyMS9GaWx0ZXIvRmxhdGVEZWNvZGU+ PnN0cmVhbQ0KeJx1k99r2zAQx72fdNrY9rJ1sJd7dApRTpbOsl+btIXCBm0MK5Q+DM/ZPOKGJKX9 93tSGkdOsYTt+4j7fk+2fEtAIINgVS5zgiFp/1xV4tcR3IrRpLqvy+ry7BjKNSg/1+Utix5AS0oy +LE1SJDVHLB0dvRMiDydMIFzvv4DyQyMTAnRQCMSJvtEc2GVlarDhtnsMelUGmrTSesNOq8WyEO6 g51Lh+CfGKJMtrnNk0verbDFBDv1PZq97auWndWOfBnTxdZqFn638dR/NYTp+CcsgWzCKr9gTCoV AasyvudSQ9nA6PTqSsFkARdiKY6LvRPA9gQ471SxFqGYAUrcWLZB0YBNLeS5S5hcx9GLAe/RuqHi 6OVgqKRSCrM4ejVAFypFcfQ6TPrep3i/UWBm4ugwWH8bxB2nMOkDiw0P4vhrn+BNj+AgiL8F8cdQ /CkQ91b40qd+50DzMPx2nwc3xbk4KcRF74m6Tri+YfjjGwJlHvTU6LKa/76r76vxYr5Y1U11t6pL WNXcSbU7wRMFf9egM6kJTE6S/D9rKeC5mIpH0xrHLA0KZW5kc3RyZWFtDQplbmRvYmoNCjU1IDAg b2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSIC9NZWRpYUJveFsgMCAwIDcyMCA1NDBdL1Jl c291cmNlcyA1NyAwIFIgL0NvbnRlbnRzIDU4IDAgUiA+Pg0KZW5kb2JqDQo1NiAwIG9iag0KPDwv VHlwZS9YT2JqZWN0L1N1YnR5cGUvSW1hZ2UvV2lkdGggNzE0L0hlaWdodCA1MjkvQ29sb3JTcGFj ZS9EZXZpY2VSR0IvQml0c1BlckNvbXBvbmVudCA4L0ZpbHRlci9EQ1REZWNvZGUvTGVuZ3RoIDMw NDcxL0ludGVycG9sYXRlIHRydWU+PnN0cmVhbQ0K/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYE BQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0o MCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo KCgoKCgoKCgoKCgoKCgoKCj/wAARCAIRAsoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAA AAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEI I0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlq c3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW 19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL /8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLR ChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn 6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6pooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAPSm5px6U2gAzRmiigAzRmii gAzRmiigAzRmiuVuPHei2es3Om38strNA+wu6ZQ8A9Rn171cKcp/Crkyko7nVZozVaxv7TUIvMsb qG4T1icN/KrNS01oyr3DNGaKKQBmjNFFABmjNFFABmjNFFACjrS0i9aWgAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAD0ptOPSm0AFFFFABRRTJTiJyOCFP8qAH4oxX53T/EjxsJpAPFmuYDH/l9k9frUf8A wsnxt/0Nmuf+Bsn+Nez/AGNU/mRn7RH6K187/EP/AJHbV/8ArqP/AEEV8/aP8WPHGmapa3q+JdUu fIkD+Tc3LyRSDurKTyDXst34hi8WTnXoIXgjvwsvlOclDgAjPfkHn0rfDYGeFqXk7po58TJSigtG uI5w9m0yzDkGEkNx345rp9J+IXiDTiEe6W8jXqlyu4/99DBp/wAJv+R5s/8ArlL/AOg17TqGi6Zq IIvtPtZ893jBP59ajF4mnCfJUhdGdGlKUeaLsU/CXiay8S2HnWp8u4TAmgY/NGf6j0NbtcpD4F0m y1CO+0hrrTrlDwYZcqR3BVsgg+lU/EnjC/8AC96qarpkc9nKT5Fxby7SwHUFT0I+uK8p0o1Z2ofc zrU3BfvDt6KyPC+vW3iPTDe2ccscYkMZWUAEEAeh9616xlFxfLLc0TTV0FFFFSMKKKKAFXrS0i9a WgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAD0ptOPSm0AFFFFABTJv9TJ/un+VPpk3+pk/3T/KgD8xL j/j4l/3j/Oo6kuP+PiX/AHj/ADqOvu1scoV7z4BOfB2l/wDXM/8AoRr2T9nPw7od/wDB3Qbm+0bT Lm4fzt0s1qju2JnAySMniuY8dW1vZeLtTt7OCK3t45AEiiQIijaOgHArzY41VqsqVrcv/DGeIjaK Zo/Cj/kerH/cl/8AQDXveK+b/ClvdXeoXdvp+77bLp92kGxtp8wwsFwexyRzXzbd+I/FNndS213r WtQ3ELmOSN7uVWRgcEEZ4INctfBPFVdJWsl+pWHlywP0ixXmPxyH+gaQfSaQf+OiviX/AISzxF/0 H9X/APA2T/4qvtL4wEt4e8PMxJJJySev7sVhHBPC16d3e9/yNKsuamzZ+C5/4pGb/r7f/wBBWu9r z/4K/wDIrXX/AF9t/wCgrXoFcGL/AI8vUuj/AA0FFFFcxqFFFFACr1paRetLQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAB6U2nHpTaACiiigApk3+pk/3T/Kn0yb/Uyf7p/lQB+Ylx/wAfEv8AvH+dR1Jc f8fEv+8f51HX3a2OU+8f2Zv+SKeHv+2//o564j4h/wDI7av/ANdR/wCgiu4/ZmB/4Up4e4/57/8A o965zxz4d1m78XapPa6VeTQSSgpIkRIYbR0NfOYaSjiqjbtv+YYhNwViv8KP+R6sf+ucv/oBr50+ Ov8AyV/xX/1+t/IV9DaDpfijRNTS+stEuzcIrKvmQkgbhjNfPPx2BHxe8U7uv2sk/iqmvRoWlieZ O/u/qRS0hZnB19kfErUrqfV4rCWXNpawQtFHgDaWjUk5718b1+iln4N0y71JNZv0N1NJDDsik/1a bUUZx/EeO9LH1oUZwnNdH+hUoOceVFD4MxSR+FJmkjdBJdMyFgRuG1eR6iu9pAAoAAAA4AHalr5u rU9rNz7nTCPLFRCiiisygooooAVetLSL1paACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAPSm049KbQA UUUUAFMm/wBTJ/un+VPpk3+pk/3T/KgD8xLj/j4l/wB4/wA6jqS4/wCPiX/eP86jr7tbHKX7bWNS tYVhttRvIYl6JHOyqPoAamXxHrajC6zqQHtdSf41lUVLhF9Auax8S66RzrWp/wDgXJ/jWbPNLcTP LcSvLK5yzuxZmPuTUdFNRS2QBX6c6Z/yDbT/AK4p/wCgivzGr9OdM/5Btp/1xT/0EV4ed/Y+f6Gt LqWaKKK8E1CiiigAooooAVetLSL1paACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAPSm049KbQAUUUUA FMlBMTgdSpH6U+igD4Hm+CfxEaZ2Hhi5wWJH76L1/wB+mf8ACkfiL/0K9z/3+i/+Lr77or1/7Zrd l+P+Zn7NHwJ/wpH4i/8AQr3P/f6L/wCLo/4Uj8Rf+hXuf+/0X/xdffdFH9s1uy/H/MPZo+BP+FI/ EX/oV7n/AL/Rf/F0f8KR+Iv/AEK9z/3+i/8Ai6++6KP7Zrdl+P8AmHs0fAn/AApH4i/9Cvc/9/ov /i6+9LBGjsbaNxh1iVSPQgCp6K5MVjZ4q3Olp2KjFRCiiiuMoKKKKACiiigBV60tIvWloAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKAA9KjZlX7zKPqakPSoJbeGYgzQxyEcAuoOKAHh0JwHUn606sfXrCxG j3bvbwxlYyyuqhSD2wfrVDwHNdzWE4uGd4VYCJn5+oB9OlAHSllBwWUH0zShlJwGBPsa5Xx/DH9g gmCKJfN27wOSMHjNaPhGCKPQrSRI1EjqSzActyepoA2qbvX+8v506uD+IEMcd9bPGio0kbFioxuO epoA7rcpBIYYHU5oDKTgMCfY1BaW0MVmkUcUaxlBlQoweO/rVDQbS3guNSaGFEYXLKCB0XapwPbm gDYpOnWlpCAwIYAg8EHvQAm9P76/mKUEMMqQfoaqnTLE9bK2/wC/YrkPGKLpWoWs2mn7NKyEsIuB weDigDuqKitHeS1heUbZGRWYehI5qtrNy9rp8rQAtcP+7iUdS56f4/hQBdUhhlSCPUUtcp4Cv/Nt JbKQ5eE70z/dPX9f511dADd6f31/OjcuM7hj1zXCeM9LFldx3trGqwyEBlA+VXHt6GuiN9bXPh+K SGCJzOBHHBtGPMPbHscn6CgDbRgScEH6GnVQ0bTodMs0giA3AfO+OXPqav0AFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFAAelYfi92j0C4aNmVgV5U4P3hW4elZusab/acHkSXEkUJwWVAPmIPqaAOe0HTYNV 8OO13vebc4WQuSVx0707wPqlzcyS2dw5kSOPejHqvOMfStS10E2tk9pBqFykDkkgKueeuDjirula Va6XEyWiEFvvOxyzfU0DMb4gf8gmD/ruP/QTWj4V/wCResf9w/zNLrWjjVgqT3MqRKdwRAOvrnFF rpU1pZrbW+ozpEowvyISB9cUAXY7qOS9ltUyXiRWc9hnOB9eM1x/xEBF1ZHt5bfzFdPpGlppguCs 0szztvd5CCSafq+l22q2wiugflOVdTgqfagRatyGt4iOhQH9Ko6Py+osOhu2wfoFB/UVDa6Ve28C 266tL5CjaP3S7wPQNWlaW0dpbpDACEX1OST3JPcmgDI1i+1m3vSmn2CT2+0EOR37jrWppslxNYwy XkYiuGGXQdjVmkYEqQp2kjg+lAHFXd9eP4vNkLydLdpQm1Gxgbe1UoZG0zxNt1sfaQDtEsvzbR/C 4ro28Mo2ofbjfXH2nfv37V6/TFWtY0SDVooRcyOJYuPNQAEjuDQM1QQQCDkHuKx7uaabWkFvbG4j s1ywDhcSMOOvoufzq7p1k1jZC2W4klVRhGcDKj096ZpuntYvMftUswlcyOHVeWPfIHt0oEcXM8mh +KEuZITBFI28puDfI33uR7816ECCAQcg8g1j6zoMerSo9zcyqEyEVFUYz745q/p1q1napAZ3mVBh WcDIHpxQMTVraO7025hmGUZCfoRyDXI/D8eZdT7ySIk3ICeFLcEj3wBXZXsD3EDRJM0O4YLKATj8 aytJ8PJpU5ltbub5gAysqkMPTpQBur1paRetLQIKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAA9KbTj0r P1vT7TVdIu7LUoBPZzRlZYixXcOuMjBHSmvMDL8T+NvDfha5ht/EOs2mnzTJ5kaTMQWXOMj8a6CJ 1ljSSMhkcBlI7g9DXxbo+n+E/ijda5JBoV34f/sTSpr3ZaX/AJy3BQ9G8xCR16itvwv4g8F6j8Ov E3iG88FWlvLo5t4YYf7RnP2l5CQATkY6Z4HrXozwCitL366Lrt1I5j6V8NeOfDPifUJrHQNZtb67 hQySRRE5VQQCeR6kD8a6SviT4bWPh3Tb6e58Q+GLiae5TbBZXWswWxVSc7yrmN+wA6gg59K+tvh5 ZwWPheCK20OTQoi7sLKS4Wcrk/e3qzAg9etY4vDRoP3X+X+f6DjK50UsscIUyyJGGIUFmAyT0H1q DVL+10rTri/1GdLezt0Mksr/AHUUdSa5n4iX9l/Zz6RqnhvWtbsr+JlkFhaCZUHTk5G1u4PtmvmL +37vwPoXizwp4h1bX549T094tN0++smV0LHCSEsx2Dgghcgn6UqGFdZXv/wwOVj6w8LeLtA8Vpct 4d1S21BbYqJjCSdhbOM59cH8qvW2saZdTrBbalZTTtnEcc6Mxx14BzXxl8O9a1LwBZa/4S1Rb/Q9 Y1t7dA4szNOkZDjEabl+dt4AJPH1r2b4TaL4d8CTRjTPBfjKXU5yIZNSvdOXKgkA4w2ETucdhyTW tfBRpN2d108xKVz3asfxN4m0bwvaRXXiHUYNPt5X8tJJiQGbBOPyBrYr4z/alk0rTPEUfh/Tra/N whW9lubjU5p1O8N8giclV7HI+lY4PDrEVFBjk7K59aXPifRLXQYNbutUtINInVGju5ZAkbBvu4J9 apP478Jx6bDqD+JNIWymfy45zdptZskYBz7Gvk/xDrHhkfBH+yLd9TtvEywWTz215cSyRyxna3mQ qWKKpDA4AUgHGKx/GOlWFt8AvAmowWNtHf3N3dLNcrEBJKA7YDN1IGB1rshl0XbmbV3bbyuTzn3J p1/Z6naJdaddQXds/wB2aCQOjfQjirDEKMsQAO5rj/g6oX4U+EgoAH9mQHgY/gFUfj5kfB7xSQcH 7L/7Oted7O9X2a72Lvpc71GVxlCGHqDmuc8OeOvDHiXUpdP0LWrW+vYkMjwxEllUEAnp6kD8a+Yv 2f7S3uvCd891oHjHVHF6wE2j3zQxKNifKwEyZbvnB4I5rkvgZbwT+PdSSfSdf1FFtZSINIuTDOn7 xOWYSJlR0I3dSK9D+z4rnTl8Pp/n/kTz7H3dkbtuRuxnGeaWviHxQir8fdDtEs9bsLVruyjNrq1y 0s21nXcCxd/lOTxu719vYxwOlcmJw3sFF3vdXGncVetLSL1pa5SgooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAD0qrf3VrZWklxqFxDb2qD55ZnCIoPHJPA61aPSq19Z21/avbX1tDc20n34pow6NznkHg801 a+oHxhoviD7H8V/E2kaFd+H9J0WX7db+abOJ4poFDlYy2V3BtoGd351R8P8Aja40jwPc67plt4Vt LuHU4oV077AGdj5bETjc5I28rkD+I819kf8ACIeGsY/4RzRsen2GL/4mj/hEPDec/wDCO6Pn1+wx f/E16jx9N7w7fgRys+QfiX4x1TxF4g8KWevazpGqWF3a2tzKYrOFRatMfnQtliGUdeR7ivsrQH0w 6Rax6FNbTadAgghNtIroqoNoUEccYxVMeEPDQzjw7o3PX/QYv/ia09PsLTTbZbbTrS3tLdSSIoIh GgJ6nAGK5sTiIVYxjFWsNJoTVNRs9JsJr7U7qG1s4V3STTOFVR9TXzFJ4R1r4xfGNPFD6fcWHhG2 kiWKe7QxtcQxHICKeTvOTnGAD6jFfT11YWl3LFLdWsM0kRzG0iBth9RnoferPNZ0a7oXcVq9PQbV z44+P88Vr+0jp1xdOsMEUlhI8jnCqoYEsT6DB/KvfbD4w+GdU+Itr4Y0q/iu1mgZhdQhpEebI2xK V4+7uYseOAM9a7TWvDWh646PrWjadqDoNqtc2ySFR6AkdKNG8N6JobM2jaNp1gzDDNbWyRkj0JAr apiadSnGMou8VYSTTNavjn9pjwdf2kk/jPXJhHe6rqItoLJCGEFukZC7m7uQgJA4GTya+xsVma9o Gk+ILeO313TLTUYI38xI7mISKrYxkA98E1lhMS8PUUwkro+bfG0B1v4L+A/C3h3TRfeJtTs7SSQQ xgvHbon3pH/hXcRjcQOD6Vn/ALQ3hp/CHwd8A6HK6yS2csiyun3TIy7mx7ZJxX1VpumWWl26wabZ wWkKqqBIYwgCqMAcdgOBTdW0nT9Ytfs2rWFrfW2c+VcxLIufXBHWt4Y7knF20Tb+8TieXfs9ePdJ 8ReG9P8AD2nO5utH0u2WYuhXc+3a+OMYU4Gc8k8DAzXfePvDp8WeDdV0IXP2U30Pleds37OQc4yM 9PWtDRdE0vQ7doNF02z0+FjlktYVjDH1OBzWhiuWpUTqc9NW6lJaWZ458PPgk3hPSJ7I+MdeXzZz N/xLpvssfKqOV+bLcdc+npXzz8Cjpdv8RtUj13xJd+HYBbyoLuK8Fs7uJF+RnIxyMnHqK+6cVg6h 4N8M6jO8+oeHdIuZ3OXklso2Zj6kkZNdVLHySmqmvN6EuPY+ZPHOm+CdN8cWHitPiO+sz209vLHZ 8Xs8zRsDtaVSAq8dSOB69K+tLaUT20UylSJEDgqSRyM8Zx/KsfTPB/hvSpxPpnh/SbSZeRJDZxow +hAzW7zWGIrqqorXTvb9BpWFXrS0g60tcxQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFZ/iHV7fQtGutTvEmeC3Xe6wruYjOOB+PetCiqg4qScldCd7 aHnXjbWH1az8KLo39prPqc63Aitp2t5Wt1XdID86jOMDk49DWgt/J4d8H/27DbXd1FKqXE8F1fSS NBEf7hfeSQCCRkA8nPQVp6h4X+2eIF1hdZ1O3uo4jDEsXkFI0OMgBo26kZycn3xxTV8I2xt1t7jU NSurdkkS4inlVlud7bi0g29QcYIxgADpxXq+3w/s4U7+6tWtddW7dOlkvO/Q4vZVedye9rJ6ff16 3+Vhtx4luklitoNJMl9duTZwtOFEkIVWMshwfLALbcYJzj14qS+NHGpWelw6csurMYReWi3ILW+8 ZbG0HdsHJJ2ryOcnFW4vCEMJ06SHVNUS5soWt1uPMjLyRHb8jZQjA2joAe+c81bsPDsNhqlzd217 fLHcyieW1MimNpAoXdnbv6KON2D3FZ82DS2vp5rW/wCVtfXqtirYh9bfd2/NP8OjZxHiO7vLi58U zWN9ex+bcW2j2KR3MiqLglTI6gNgEZHTH3Wz1Od6PxhGmpf2VpUA1BLNZIrm4kuiDEY0zuf5W+Us Au5iCTkgNipI/ANjGYMalqv7m7e9X96n32zn+D/ab5vvDPXgYtQ+D7eHTb7T49S1NbG6EoEIkQCL zCS+07Mn7x+8Wxn1roqV8JKKi9beq6JX09L28384jTrKfMtL/wCbf+S+XqY+gfEM6rgPpD2p/syT UizzgoFViAMhc4OM7sfQHrVpfFN9YfDqbxJrFtEs7R/aIbeNiQFcjylPAI6jPXufYXLrwTp1w+on 7RexJe2aWLRxyKFjiQYAT5fTPXI56Vb1nQYrvwlNo3lfbEaERKtxMY9xBGCWVTtweeFxxgDHFZTq YJzjyRsnJX326q7fnb5FU4YhL35bJ/fZW2+b+ZyOrvqmkHwlM+oXs+vajfRLcRmZvJaMr+8URfcC qCOQM985ravfGj22panZjT0ka1u7azhK3H+vkmxx9z5So5PWqfhPTtYh1KK48Q6VdXWrQj7OmoS3 cLW6RcbmjVQrKW54KFjwCwGcXz4C046kL03moeaL5r8DzEwHYYYD5c4xgdcjAwRitqs8Mpctezst 1s3e9lZ7Jaa93psY01WcXKndN9/R669b/khzeL2l12GysbAT2sl6bD7SZ9p8xVLSEJtOVUAjOR83 HHWuZsNRu5723eOe+mg1nW3+yhL90MUEB5IUhgYztcsoK5BUfTo4fAdjDexXMeoaoDC07RIJUCp5 xLNj5M9T1znsSRxTrHwLZWQ04RahqhFjE8MQMqD5WxnogwflH3cZwc5y2ZjWwVNNQ7efn+vLt5ou VOvN+9tfy9Pyb+5GboXjXUbu5tnvNOiW11KaeOyeOcbFWFWzuJUElip5wBjHoc9vp08t1p9tPcQG 3mliV3hLbjGxGSue+OlchpnhUpNp+myQXcWmaNMZLe4knRzdho9u0qoG0DcwIwM4zzuNdvXJj3Q5 l7FJenq7dXra1/PzubYZVbfvH/XXpsnt6+gUUUVwHUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFYM3ie2Oo3Fnp9pe6lLanF01oqFIDx8rM7KC3P3V3Hg8Vr2Nyl7ZQXUSuscyLIoddrAEZ GR2Nazozgk5KxCqRk7Jk9FFFZFhRRWdqWrwWUd1tSa7ubaITPa2qeZMVJwML6nBxnrg+lVGEpu0U JtJXZo0VnahrEFnFdFY57q5t4RM9rbJ5k20nA+X1ODgHrg+laKnKg4Iz2NDhKKu0JSTdkFFFcz4h 8YW+iam9jLpuo3UqWrXrNbCJgIl+83zODx9Oe2aulRnWly01dinOMFzSOmoqvp15DqFhbXlq2+3u I1ljbGMqwyP503S737faCf7Nc23zunl3Mex/lYrnHocZHqCKhwkr3Ww1JOzXUtUUUVJQUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAQ3sL3FnPDFM8EkkbIsqfeQkYDD3FZ/hfS7rR9Dh sb3U59TuI92bqcfM2SSOpJ4zjkmtairVSSg6fRu/9PclwTkpdUef/Drz9A0aTSLrTr46v9rlaRvs 7iGYs2RJ52Nm3bjqd3BGCcA0LHTtRv8AxGmoXtndLfWmoTXM9xJEw8uBA6RW8LEDeGHzHZkc88kV 6fRXc8xfPOoo6z3+e/y8vTVrQ5/qq5VBvRP+vn5/rqeG2HhrVYFW9FnqEDxWN1qP2eCJkHnTkqsC gdwo5A5HA9KX+xTepb6dFpk9xdWWjJYRl4HGLmbktI2MIqL82HwQGxjdxXuNZ2laLY6VcXk9kkyy 3jiScyXEkm9umcMxA444xwAOwrtWdyd5SWvS3r18tX9/zOd5elaz9fw/VI4aLSbrU/FQttbF41tp 88P2RRZuVdY0UiQTk7FyxJYDDnaBnHFYtzoxvxdSXOgXXnajr++ZzYksluhyADjjdtHzcL+8OT97 HslFc0M1nB3S6Ly2/wA3Z/I0lgYyTTff8mvwTZ43c6Mb9bmS58P3Qm1HX98zmxO5LdDlQDjjdtHz cL+8OT97Gtc6Pq9k3iWWys7qb7LePqOnyPKXaSU24TaoyWYAsevHygDOTj06inLNpvTl07a+X6K3 oNYKN+a+v/7X/wAkcf4A0mKyS81Bmupby5EaTSzWj22/YD/A5Llskku2SSeDjgYtlo7eLfE/iK7v 21ews5I47OOM2zQfaLcctlpI8gM2eFIPr1FelUVgsfNTnUXxSSV+1reXkuxf1WPLGHRO78/xPMNU 8Nwvd+IdQ/sm4mg021jtNMtCsrCRkjzlUJwyZZRjBBKk4zzUOk6HAw07Rtb0rUbjSItOjW1hFvII 3ndm82RyMeW/QjeVKhj0Jr1Witf7VqcvK/K2r0srafj97JeChfmX5eadvTRI878M6dcan4pOpa5H dreWdxOYIjZvGkKcoo85jh128hUwMsSwPWvRKKK48TiHiJKTVklZLsb0qSpJ26hRRRXOahRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFYfiPxNZeH7rTIL2K6kfUJxbxGGPcFY4+9z79sn2q6dKdW XJBXZM5xhFyk7I3KK831e9nl+I95JAmsXOm6VZo11FZ3vlx+c2WUsrSouAgyQO/WqfhTxANB8K2+ o6pdXVzqGrvLLaW95fSOFiUkqo3Fj0xjarMxYDB7eh/Zk3TUou7dtPVN9+yv6HK8WlNxa0V9fS36 u3qeqUVxF144uY1jWLRi1wgt0u4pLnaYJpyAkQwp3EZy3TAx16C0viy6l1PWIYdHIstL3rNdy3SK oZY9+NoBPOQOM4HJAPFYPAV0rtfivLz81bvfQ1WJpt2T/B9b+Xk79ranW0V5Ze+JNcv7LRIbw2+n xX6PqV3LDcMjw2aYbaCEypKkcg5Jz90HjQsvFQbwdrMqR3T6fY2YFvfvdmSS4dlOFLqB+8BKglWb BOM5BraWV1oxT31tp62/Pp8zOOMpylb+tr/lqeh0V57o974hikl0G2eKSfTtNVprq5naSSW7kQlA dw6AhuM9NvP8NQeENftrPQJNT1DUr9W06I2+p2V3MXdbrKjcN543YIABCc9Ad1KWXTSbTvta2u+3 pfS3qgji4u11a/6Wv92v3Psek0Vwv/CdXht7VodBa4e8vGtrXyrtdk6qm7erMFJBwQONvGd2MZvD xZc/br2xbRpVvbVbVmiM6nf5z7WKkdQvr39BWUsvrx3S+9d7d++haxVJ7P8AB/5HWUVwHh/xRcS2 8j21nNd6hqV7Oba2e93xCOPCs4coNkWRwNpJJ9+L0vjRxqVnpcOnLLqzGEXlotyC1vvGWxtB3bBy Sdq8jnJxVSy+upOKW3mum/XZPS+1wWKp2u3+f9Xe9tzsaKKK4ToCiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAoIyCM49xRRQBya+CYhZatbHWtWYao/mXTkwb2JXaQD5XAIwMDpjjHOb I8JwI+mSW+o38E9hbG0SWLygZIiQdrApj+EcqAfeujorqeMrPd/gu1vyMfq9Pt+fe/56nJ3Pgawu NSN4b7Ukzdre+Usq7fMCBM5KluQBzuyDypBq7J4YtD4d1LSRLcmO/aWSeUOoldpCS3OMew46ACt+ ik8ZWlZOW1rfLYaoU020t/6/U4LR/Ck2qW98/iG2ltFuLBNOjgM6SSxIMs7b1G3ljxgYwo4HQbmo eFo9R0cafe6pqUw82OXzmaPflDlRjZsxkA/d575roaKqeOqzlzJ2tqvL0vft8+pMcNCMeV69PU5i HwZZRXV1cLe6kZZ5kuMmcZWRV2qQcZOMA4bcOPQkFr+CrGSC8E95fS3l1cRXT3rNGJQ8WNmAECAD HTb3NdTRS+u1735u34f8Mh/V6b6d/wAb/wCb+9mRDoMS6lZX9xd3d3c2kciI07KQS+Nz4CgBsKB8 uBgnjmnT6BYzazLqriX7c8Atw4c4RRu5C9N3zHkgn06nOrRWft6l736W+W9vQtU4rp5nK2Xgm0sU 077HqWpwzWUTwLMrxlnjYqSjApjHyjkAHOTnJJq/YeHYbDVLm7tr2+WO5lE8tqZFMbSBQu7O3f0U cbsHuK26KuWLrTvzSvf/ADv+f3dCVQpx2X9Wt+WnoFFFFcxqFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFAHkv7QVxNp1p4XvLa/1a0Mus29pcCwu7iMyQNuLrsiYbiccYBbsKyPCt/qE0/wATIINW 1T+xLa2L2Nvf3kov7d/KJLYdvPjQkArvxngjvXe/Ebwff+LZNENpq1rp8el30Woqstk05kljJKgk SpheeRjPuKzrX4c3Z1XxNrWpa3Fc65rNkbBZY7IxQW0W0DAi8wsx4zkvXsUcRRjhfZyl72vfumul uj1vor9xP40/T83f8P8AIz/AfjkaZ4E8AJrceqX95rqi3S7DLJ+9yceYzuG5HfB6Gtmw+KGjXnhr +10tNSQtqP8AZUVk6R+fNc5A2LhynryWA4PNZ6fDK7i8J+EtLi1yAXvhu7W5t7lrAmOUKGAV4/NB /iHIcdOlZv8AwphZfCD6Lea1FcTJrB1i3nawBRXP3o5Yi5EiEZGMr1/Auf1GpNylK15Pvtd+Xb5m UVOKivL8bP8AWx6V4b1y18Qab9ss1lj2yyQSwzACSGVGKujYJGQQeQSD1BI5rwrWNY07SfHXxCst f17xNbWlutsmmeTqd6EhmliZiN4fy0y2MeaQvB7A163pXgHQIbCKLVdD8O3k0bs6mLSIoYoyccRo dxXoCcsST3xgDEi+Gclzr3iu717UrLUNP8RxRxXVmlg0RTy1KxsjmVsMM5zjqARis8NVw9GdRuTs 1p3+JPR69L727dTRXtqupd8J6j4i8PfDvRf+Evsr/WPELsIJItPjWaT5mO0u+QgwuNzlgM9yTzBJ 8V9KTw5b60uk6y9o9+2mzgRwhrScOEAlJlChSSMMCV9SDxVa3+H3iSHwXp3h4eM1aOxnjZJjpzAz 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 KHV7Wwj0+7jvvnsWmMkqZxz5q4Xk5GCfcV2UcZTToc89r82j7u3Ttpp6BKN727fjr/mv6Rzdnql/ 4S+OFn4Ujv72+0LWrJrqKK9uHuZLWVQ2dsjkvsIj6MSMscV67XG6L4KaLxjJ4q8Qagup655H2S3M Vv8AZ4LaHqQkZZ23ElssWP3sDArsq8/F1IVHDk1aSTfd6/pZfIaWrfT/AIH+YUUUVyFBRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQBieKvFWi+FLezn8QX6WUV3craQsyM2+Vs4Hyg46Hk8Dua2zw M1458T/D2t+OPGc2m22jwT6Tp2lSxLNf3ElrG1zcgrviYRSB2jRfbBfqKpFL7Wj4L1Px14d1K7so NNuLW6szYS3Bi1AMirMYgpIDKj7ZMYXd94ZBpX0v/XX/AC/FA9H/AF5fo/wZ6vZ+J9HvPCreJLa7 36KsD3JuPKcfu0zubaRu42njGeK0rG7hv7K3vLR/Mt7iNZY3wRuVhkHB5HB718v6P4XvYPBNxF4l 8MaveXMvhtrfRoxp8sz2lwHnMi8A+S7bojuJXcBgE4xXsMs9q3gO30HXfDWvX8EGj2cs8VvbN+9O VXylIZW8xSu5l4wPyq2ld+v+f+Qm7Nf1/L/md1q+p2ej6dPf6lOsFpCMu7AnqcAADksSQAACSSAA Sa56X4ieGItMF899P5ZkliMIspzcI0QzJvgCeYoUYLFlAAK5PIzU+MOl3eq+CgunxXUr217aXjxW vMzRxTI7hB1LhQSAOSRxzivKrnStdOqNq15H4vfQUTUrPSpIBeHUIg3lPD5gB+0bTIkgBfsEDYUi oT3+f5L8Xsl6lJbf13/LdntOreOPDulG0+2akoW6iSdHhikmRYnYKskjIpEaEnAdyqnnng1e8R+I 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 FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAU10rT11ZtUWwtBqbReQ14IV84x5 zsL43bcjOM4q5RRQBk6x4a0LWrmC41nRdM1C4gGIpbu1jlaPnPylgSOeeK1qKKACiiigAqMwQtcJ cNFGZ0UoshUblUkEgHrgkDj2FSUUAFFFFABRRRQAUUUUAV9QsrXUrKaz1G2gu7SZdskE8YkRx6Mp 4I+tQ6PpGm6JZ/ZNF06z0+13F/JtIFiTcep2qAM8davUUAFFFFABRRRQAUUUUAFFFFABUdzBDdW8 kFzFHNBIpV45FDKwPUEHgipKKACiiigAqvqFla6lZTWeo20F3aTLtkgnjEiOPRlPBH1qxRRuBR0f SNN0Sz+yaLp1np9ruL+TaQLEm49TtUAZ461eIBBBAIPBBoooeu4bDLeGK2gjgt40ihjUIkcahVVQ MAADgAelPoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACufvPGGiWeqvp89zMJo3WOWVLWZ4IXbGEknVTHGxyvDMD8y/3h noK88hvjo2m6roFx4dv9SvZ7q5eGD7G7Wt6k0rOC84VokGHIYSEEbT8pyu4W9g6HodVdV1C10nTL rUNQl8qztYmmmk2ltqKMk4AJPA7CvLdL0pk8UwNFo17D4jTULyTUdSNq6JNZsJfLT7QRtlX5rcLG GJXZ0Xaa5+bwS6eCLS2tPDpW5vvCFwt+n2PDT3ii3MQlyMmUN5m3d8wOcdKcVf8Aryb/AELjG8kn /Wv9M98UhlBHQ8iquq6ha6Tpl1qGoS+VZ2sTTTSbS21FGScAEngdhXjOvWL3XijSptD8Mmzayu9N +zznRrgzG03RbjHMdqWqKrujQ4LHDEqvJB4j8P2GoaJ4osbrwpf3vi6cagTe/wBnuVkQ72hzOfkk Xb5QWMMxVguEUplS3X1/C3+fysTBXav1t+J7gpDKCOh5FYVp4t0O70vV9Rt9QRrPSZZoL6Qoy+Q8 QzICCMnA9M57ZqXQU0xEtxp2n/ZWFlCq/wCgvb7YRu2R8qMbfm/d9VzyBnnzPR9G1W1neyGmXv2L Xb68N43lELAIbyaVWcHtNGyoD3AWlPS9hR1ipPy/I9Z0nUbXV9Ls9R06XzrK7hSeGTaV3owBU4IB GQRwRmrFxNFbwST3EiRQxqXeR2CqqgZJJPQAV5f4V8PPPN8Ohq+lSPHp/h9i63NuStvcqbXZuBGF kGHxnkYOOlegam1vqXhq7Mllc3lpc2rhrTyzFLMjKcptcqVYg4wxXGe1VUXLfl8/za/QcVqkzMt/ HOgzWt7cNPeW8Vnbtdy/a9PuLcmFfvOiyRqZFHGSgOMj1GemUhlBHQ8ivGNVtL7WfCfiDSNNfxFr WkyaRcAW2vaW0UkM4AMCxNJFG8p+9yfMIKKSwJG6tNpN2/jGCW0sTbKJ7NtKkTw1O00FoEjzGlx5 qR2yDEoaJ1U4LfK24AlldL+v6/TUT+G/r+n9foe3uwRSzHCgZNVtLv7bVdMtNQsJPNtLqJZoZNpX cjDIOCARwe4rx7whaQXOswTaZpF2msRaxqbXuom1ZUktPNuFEfnkbXG8x4iDZBXdgYycuTwpqGme GPDg0PRXtJ7jQUGsbdPZ2nKy2m5J0Uo0jeX548ssGI3qOuKSV/69f8vkU46tdv8AO39fI9/qrquo Wuk6ZdahqEvlWdrE000m0ttRRknABJ4HYV5Bovhpr+PRLS70wXOgtrkkhtP7Dk0+1ji+xyg4tpHd ljMuPvhQXJIByCdxtLvU+CniXS4rG4SYR6nBaWiwkN5fmzCFUTGduzZtAHTGOKduoRjdpPZ/5v8A yPQbvUrS0uLCC4l2S30pht12k73CM5HA4+VGPOOnrVyvONU8NavBr/hKaTXdb1iGO8k8yO5gthHC DaTqHJhgRhyQvJx83risDw8dQitNCRNB1iWbR/C13Y3ETwS2okuR9m/cpIQMltjYdMg9VJwcJpf1 6N/ovvFFc1vP/M9mor588O+F3vPF9nbzeHYl8MzXNvM9vFoc1jaki3vVfzIpSSxDCFS7Bd3yHbyC ehg0mG103SYvEuhXV5oNpPqcMNkmnyTiB/tJ+zMI1UlVEQYI+AqgjkAiiS5VcGv69b/5a9j2KiuW +Fmf+Fb+GtwcE6fCfnfefuDq3f6966miS5W0IKKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFAEVrbQWkRjtYIoIy7SFY0CgszFmbA7kkknuSTUtFFABRRRQAUUUUAFZ eueHdE18QjXdH03UxBkxfbbVJvLzjO3cDjOB09BWpRQAiqFUKoAUDAA6CloooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA4XTfGl x/wmHi3TdVitorDS18y0lTcHkVIY3m35JHy+dHjGOG6cVV8M+PdQn8MafPq2i3F5r1xJeLJY6Qq4 RIJmjZsyyKOPkH3sktwOuL2p+AhfahcXY1OSFp9WTUXCQg7ohDHE9u2TyriMEnjtxxmmp4K1CwWC fQ9agtdRilviZrix8+NormczFdgkU7lO3DbscHKnPB9ld7L77f56P0ZTt07/AIf1r8yvN8RootYu Gisbm+0BNMtdS+22kQ/cRStLukl3up2hUU7VUv8Ae4OOJR44EXjXUdNuXiXTLGC5mnlMDK6eUlq4 wQ7bxi4Yk7VPQAcZaKf4fXcUclppWum20y40230q5jmtvOmaKPzNzJJvULIwkI3FWAxnB4w67+G9 tea1rd3c3xNrqlvc2z26wAGNZoraPIYkg4+zZ5XB3+3NaXfo/wDgArN6+X6f8Evz+Mm/sTVphpV7 YaraQLLDZagIw0xkysJBjdxhnG3GdwI5AyM5uqeNNTsbPR2+zWj3H2mVdUGGCxwRSiKSRPm4wXRv myNue+KTw98N49LYGR9DiBuLeWSPStFjsUlWEl134ZmLb9rZLbfkACjJJ2pfCEU+qeIrm4vHkt9X thbC38sAW+VKyMp7lsITnoU96l6a/wBabff1J30/rXf7ugSeKHt0vZXs5bzN+1jYW1mo864KL8/M jKnDLLySownUnroW/iKyl8OT61MJra2t0ka4jlT95CY8iRGVc5ZSpHykg44JBBPO6r8Po9S8I6Np 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 B3fLtaX4Jk0Ma3JoGs3tvd6hcxTxyXss18sYSNE2OsshLg7DlgVbBABAUVGPCOtw6fcxWfiG0jn1 CSaTUPM0sPDK0gA3Rx+YChCqANzuDyWDE5pN9uy+/T/g/wCTQ+qDX/FmtWWk+Hru20Ex/wBoTWS3 j3UqhbQTSxo0e0He0g38cBRgknI2nt6wNT8NRXXh3TdHt52ggsZrOSNmXeStvIjhTyOSI8Z7Zzg9 K36p21t3f3aW/UmN7K+9goooqRhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcH8VZJxJ4Xt4ItXuI7nUmjlttKvTaTTqLaZ tokEsfAKqxBcfd79Kv6Fc2/h/wAPy3N1pfiezjM2DBeyzatc5IABHlyXDBfYHA5JAzzseIfD+n+I IrZNSW5zbS+fDJbXcttJG+1lyHiZW+6zDr3qTRNGtdFgkhs5b+RHbeTeX892wOMcNM7ED2BxQtmO Wtv67nC6n4w8Q/a9SuNOXS10201S001Ybm2mE8n2hYMOTvGzaZwSpQkgY+U81Hf+MtdtIL+ykvtG TVrG8kt2kTS7m5NyohilBjtIpGkwPOUM28hcZx83HczeHdKm+1eZa7vtV5FfzfvHG6eLy9j9eMeV HwODt5Byc07/AMF6FfX8l7PaTC6llMskkN3NEZCyRoytscbkKxRgocqdoyDQ17tlv/w363+8d1e7 /rc4Ox8W3ut+NvCDxmS1t7+2sruSJJ5Nreba3zlGUttwDGp+6CSBknC49G1vU5dA8KXup3wW7nsb V55BBG0YlZVJO1csQDjpliPeq9l4N0Gyu9PubWwEc2nxRQWzCaQ+WkSSIgxuwcLNIOc/e56DGt/Z 9s2lnTpozcWbRGB0uXabzEIwQ5cktkdck5qqrUr8gaXV9rL/AIJ5hL8RNc0vS7vUL+yF7a2Rikmf +ybrSzKsm5PLiFycF0cIxOSGVjwpHPQXer+KGv8AQtJtZ9Di1C90+e9uLh7eWaFDG0QCookUsD5u NxbtnH8Naem+BvD+n3cN1FaTzXMJykt3eT3LL8jIBmV2+UK7gL0G5iACTVK/+HekXd1pAzcQadpt nPZw2sFzNEwWRozxKjhwoEZXbnGGxwBip6/12f62/Ulb6mJpXjzWdUsYtdhg06HRY7iztJ7R1Zp3 adYsuk24IArTrhdjbgp+YFgBX/tvxPquueGbldQ0+00+XX7uyNtFaylpI4VuVPmP5wDZEWQNuA21 ucYPa/8ACGaANUt79LDy5YPLKRRTSJAWjXbGzQqwjZlAAVmUkbVwRtGLB8MaR5FpEts6La3r6hCU nkVkndnZm3Bs4JkfKk7SGIxjirTW/wDXT/g/fYd9Gv62f/A1OBV766vtPv01fVLe61fWb/SZliuX KRQotwqGKJ8xo6+Qh3hMklskg1Jaapd6AfE9paNqVsEns7Wyi1e5e9kSWdzH9oDtI+YjlSE35Hlv kKW57G58FaBdahd3lzYtNJdK6yxyTyNDl1CsyxFtiOQMF1UMeeeTUUvgvTU0O80+we6t5biRJ/tk txJcziaMqY3LyszMFKrhScYBHQmovpb+v6/zCTvK6/rf/gL0R5x9tvoLe31exl1lDc2s+pWup3eu SSrLFEm9mns2AhjWTKALGOFfIMZAFb2na/4ht9X1vUHktW0hdXtLaSyuN7TxiaG2XEb79qBXk3bd h3Zb7pIJrRfD3UjPAjaVosDQ5RNQGrXs6Im4NhbFx5YTKqVhMpRDgjdjB7aPwXoo1VdTmhuJ78yp cSSSXMmyaZUVFleEMIiwCrg7PlIyMGqi7O/T/g/qvS3QT8v6/rvqc54L8RX7X0GnTyC4jmbWZzJM WeQGC+CRqCT90K5GMdlxjFZcnxI1iXT9JltLPfdNpNtqdzBBo95eC5aUE+TG8ORB9xgGff8AeHHB z3Nz4M0K4it43tJVWCaaZPKupoyTM++VWKsCyMxyUbKnjjAFQ3PgPw5c21lbvYypBaWy2SRw3c0S vAv3YpQrjzUHPyybhy3HJyr/ANff/mvuKbTbfr+f+Rz9v4t1u48N3Oqy3ej2Il1CWytIpLGeaVRF NKh/dI++eRhGMRoEIwxycYqPTPiFfHw7aarqFtA0c0N5CqpDJC8l5BIyqgSQ7lEgRiEb5lIwSa6y 48IaLPpkVh9mmht4rmS7iNtdSwSRyuzl2WRGDrkyPwCBhiOnFVJfBlkBo9nZpawaLYXjagbRoDI7 zlmdWWRn+QB2ZiNpJOMFRwVp/Xp/T9RN9V/W/wDwPx+eH/wlPiSC8v5bs6ObDTNRtdOuYo4JBLO0 yQbnRzJhNrT5CkNuAxkHkufxtewePLbTHnsbvTbm5ntQlpY3DGBo4nf5ronyWf8AdsGiADKT1OCT sWvgbTU8Tajrd4ZLm5ubxLyOPzJEijKxJGu6MPskIKFlZlypbjBGat23gzQrfV01OK0l+1x3D3UW 66maOKVw4dkjLFE3eY+7aACTk5IBo6L0/Gy/W4aK6/rr/wAD+t+L1vX/ABMPBljr97LaCxu7jT7i ODTIpkuYle5izCTuPnbkYqSAmTxtIbiXWfGWo2VtFqyJaSs2g6hqkMatKEXy2gKRuu/DEbiGYqCD kDbyD1Ft4B8OW8oeOxlOx0eJHu5nSDZIsqrEjOViXeiHagVTtAIIAFWbrwdoV19q8+x3C5iuIZV8 6QApcFWmAAbC7iik4xzkjBJzSa/P8VZDTV1f+v67HLv4m8Sw+ID4blm0d9VuDBJBeLZSiCGORJ2Y PH5pLsPs7AEOgO8cDGDq2Hii/j8C6zrOp29rJe6bJeRmO2LCOQwO6Dk7iM7RnrjPtU/i/wAIR61H JLp8lvZ6jL5KvdTLO5CRFygTypomRgZG+ZWBIJByDxL4a8H2WkeH4tLuGN4m2cTqdywzec26QGIs QRk4G8swGcsSWJnoxbW+X/B/Ep3uo+J9G0OaTUpNGu72ee3t7SW3t5YY0eWRYz5kZdyQpYNkON3T CdTiJ4p8VT+JpfDMMuhpqNrHcST3zWkrROEW3dNsImDKSLjaQXPK7gSDiuptvBGg2+n3tkLW4mhv FRJWubyeeTCHKBZJHLoFJJXaRtPIwean0nwlo2lTxz2drILhElj8+W4lmkcSlC5d3Ys5PlpyxJAU AEDih9fn+Wn3P7wWm5geCvFOsarf6L/aq6eLbWtJOp28VtE6vbbTFlHdnIkz5w5Cpjb0Oa7ysrT/ AA9penNprWdr5badaGxtf3jHy4TsyvJ5/wBWnJyeOvJrVqpNdPP83b8LCCiiipAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAoqrqd/baXYTXt9L5VvCu5mwWPoAAMliTgAAEkkAAk1k2vjHRbi2km8+5g8ueG3eO7sp7eV XlcJHmORFfazHAbG3g88HAtdEB0FFFFABRRRQAUUUUAFFFI7BFLMcKBk0bALRVXS7+21XTLTULCT zbS6iWaGTaV3IwyDggEcHuKtU2raMAoqppeo2uqWzXFhL5sKyyQFtpX543KOMEDoykfhxVukAUVU vdRtbK5sbe5l2TXspgt12k73CM5GQOPlRjzjpVugAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAw/GsFrc+GruO/tNQu7b5GZNP3faE2uGEke0htyEBvly3y8AnAPnmpJr2raDdWun3ut 6jarfaa9rearpJguIpRdKZMxeXEXjRQj7igHLfOcHb6/RQtHf0Hc8m1KxvrHStNbTrOS11u5km0O 8kA2mRpeTdgsf3gBXzAeThmHUEDLj0uxXxbrNnpei3Laza61ZJYXkVqxjtLdILYyKJ8FYh5YcFSQ X3AANnj2ObT7Ka/t76azt5L23VlhuHiUyRBvvBWxkA4GcdcVLBbQQSTyQQRRvO/mSsiBTI2Au5iO pwqjJ7ADtTh7rv8A1un/AJ/fbzE9b/1/XRfI8h8O6XqkfxG+0XcJj1AahcvcXEegzK8tqd/lrJfG bypI9piwiqWUqo2DaSLHibTLZ/Fmg3mkaPNKES0jtraXRZlSGIS5LQ3CbfsjKpbeknDhVXb6+t0U o6cvkN638zyKxivI9Q0XTG0zUhLYa/qV1cTG0kWBIpUvGjYSkBWDCRfuk4JwcEgHC8E2FxceErSf wbpd5Yam3hmRL27e2aD7XdMkZgIkbb5zDEhDhiEDYJXOB70QCCCAQeCDUVrbwWltFbWkMcFvCgSO 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 PcqPoK0aKXSxL11OAt9JLyQG/adw8T/a9lnOS8h8wKRlOgEre+VWptKsXg1CyubtpnKqz3W2znPm S5fZjKdAJW9DwtdzRWjqX/r+v6sciwaVrPb18vPy/F92cBb6UY5rZmacrHcEP/oc+TbqUKIPk65i TI6YJ56Vo6jfXM2sxT2trMJYrW4jRpLWcx5Zo9mT5fopJAzjGM9666ijn7lLDOKai7Xt07a9zhtN 0/7ALK0j85rC0ujPG32KZZCGjcMCBHjO9sg+hxxjnKu5L2SyFmLK6eC10+e0hkSxud0hYKqbg0Y2 khe24dSSOK9Oop+01uyHg9Eou1vL8N/JHEwJdQ3NjAsZNhbXb3fmNbXBlbcHO3b5eBgued3IHQVa uLu+j1B72xtwZbiBIZUmhudsRUsQy4i+cfOePl6Dn06yilz+RawzirKX4bHFwRzrcwwSK/2CC6lu 0lFrcGV2feQhUx4UAuedxyAOBmpdLi+yf2P5gnP2Owe1k22k/LHy8EfJ0+Q/pXX0Uufp/XVfqNYd p3v/AFdPv5Gb4bga10DT7eQ5eGBI2O1l5AweGAPbuBWlRRUyd3c3hHkioroFFFFIoKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooA//ZDQplbmRzdHJlYW0NCmVuZG9iag0KNTcgMCBvYmoNCjw8L1hPYmplY3Q8PC9GWFgxIDU2 IDAgUiA+Pj4+DQplbmRvYmoNCjU4IDAgb2JqDQo8PC9MZW5ndGggMjEzL0ZpbHRlci9GbGF0ZURl Y29kZT4+c3RyZWFtDQp4nGWQT2vCQBDF7/sp3lnIOPtnssnVSAVBoXqo9xBppbFYQb++k9VGkzIs u7/lvbe8PYEhgRFtSaUgE5/238Z8THA003lz+aqbzWKG+gyb5lwf1XSFJ3EFVn8BjtWtB7XuJ/+M rNMZHZa6DhAqECgX5oDWOKX4oG8TbSQ74KAcRiw+pyC9XLy/Y5fVgyTIn/BMGRA+Tcbk0NVXbWu0 TgotH28ktL05iUfYi/ev7att6s7YVmucENkTS7oQzdSvLkgEJRXM7FG3mL7tdhbzH7ybG8bdVwkN CmVuZHN0cmVhbQ0KZW5kb2JqDQp4cmVmDQowIDU5DQowMDAwMDAwMDAwIDY1NTM2IGYNCjAwMDAw MDAwMTcgMDAwMDAgbg0KMDAwMDAwMDA2NiAwMDAwMCBuDQowMDAwMDAwMTk1IDAwMDAwIG4NCjAw MDAwMDAyMTggMDAwMDAgbg0KMDAwMDAwMDMyMyAwMDAwMCBuDQowMDAwMTAxODQzIDAwMDAwIG4N CjAwMDAxMDE5ODEgMDAwMDAgbg0KMDAwMDEwMjM5NyAwMDAwMCBuDQowMDAwMTAyNzI1IDAwMDAw IG4NCjAwMDAxMDI5MTggMDAwMDAgbg0KMDAwMDEyNTY1MiAwMDAwMCBuDQowMDAwMTI1NzQ4IDAw MDAwIG4NCjAwMDAxMjU4MjAgMDAwMDAgbg0KMDAwMDEyNTg4NSAwMDAwMCBuDQowMDAwMTI2NDI0 IDAwMDAwIG4NCjAwMDAxMjY1MzAgMDAwMDAgbg0KMDAwMDIxNzgyNyAwMDAwMCBuDQowMDAwMjE3 OTI0IDAwMDAwIG4NCjAwMDAyMTc5ODkgMDAwMDAgbg0KMDAwMDIxODc5MCAwMDAwMCBuDQowMDAw MjE4ODk2IDAwMDAwIG4NCjAwMDAyNjg5NzAgMDAwMDAgbg0KMDAwMDI2OTA2NyAwMDAwMCBuDQow MDAwMjY5MTMyIDAwMDAwIG4NCjAwMDAyNjk2MjAgMDAwMDAgbg0KMDAwMDI2OTcyNiAwMDAwMCBu DQowMDAwMzE3MzkwIDAwMDAwIG4NCjAwMDAzMTc0ODcgMDAwMDAgbg0KMDAwMDMxNzU1MiAwMDAw MCBuDQowMDAwMzE4MDMzIDAwMDAwIG4NCjAwMDAzMTgxMzkgMDAwMDAgbg0KMDAwMDM2ODM0NCAw MDAwMCBuDQowMDAwMzY4NDQxIDAwMDAwIG4NCjAwMDAzNjg1MDYgMDAwMDAgbg0KMDAwMDM2OTI5 NiAwMDAwMCBuDQowMDAwMzY5NDAyIDAwMDAwIG4NCjAwMDA0MzkxOTMgMDAwMDAgbg0KMDAwMDQz OTI5MCAwMDAwMCBuDQowMDAwNDM5MzU1IDAwMDAwIG4NCjAwMDA0Mzk4MzMgMDAwMDAgbg0KMDAw MDQzOTkzOSAwMDAwMCBuDQowMDAwNDg3MDI0IDAwMDAwIG4NCjAwMDA0ODcxMjEgMDAwMDAgbg0K MDAwMDQ4NzE4NiAwMDAwMCBuDQowMDAwNDg3NjYwIDAwMDAwIG4NCjAwMDA0ODc3NjYgMDAwMDAg bg0KMDAwMDUzNDU3MSAwMDAwMCBuDQowMDAwNTM0NjY4IDAwMDAwIG4NCjAwMDA1MzQ3MzMgMDAw MDAgbg0KMDAwMDUzNTUyNiAwMDAwMCBuDQowMDAwNTM1NjMyIDAwMDAwIG4NCjAwMDA1OTY3NTYg MDAwMDAgbg0KMDAwMDU5Njg1MyAwMDAwMCBuDQowMDAwNTk2OTE4IDAwMDAwIG4NCjAwMDA1OTc0 MTIgMDAwMDAgbg0KMDAwMDU5NzUxOCAwMDAwMCBuDQowMDAwNjI4MTY3IDAwMDAwIG4NCjAwMDA2 MjgyMTYgMDAwMDAgbg0KdHJhaWxlcg0KPDwNCi9Sb290IDEgMCBSDQovSW5mbyAzIDAgUg0KL1Np emUgNTkvSURbPDMwNkMzMTFDQzdCNjRGRkUzN0UzRURFRTVBMEYwNzlDPjwzMDZDMzExQ0M3QjY0 RkZFMzdFM0VERUU1QTBGMDc5Qz5dPj4NCnN0YXJ0eHJlZg0KNjI4NTAyDQolJUVPRg0K ------=_001_NextPart328743454411_=------ From hch@lst.de Thu Aug 11 21:50:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4B94E7CA1 for ; Thu, 11 Aug 2016 21:50:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3587304051 for ; Thu, 11 Aug 2016 19:50:30 -0700 (PDT) X-ASG-Debug-ID: 1470970227-0bf57b369e646a70001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id J1Z4s2WfOrf3uFt0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 19:50:28 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 8851268C43; Fri, 12 Aug 2016 04:50:26 +0200 (CEST) Date: Fri, 12 Aug 2016 04:50:26 +0200 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com, peterz@infradead.org Subject: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-ID: <20160812025026.GA975@lst.de> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead References: <1470935423-12329-1-git-send-email-hch@lst.de> <20160811234335.GX16044@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160811234335.GX16044@dastard> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1470970227 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 363 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 12, 2016 at 09:43:35AM +1000, Dave Chinner wrote: > Regardless, if the rwsem code can be made to check for exclusive or > shared locking, we can get rid of the mrlock abstraction. Can we do > that first, Christoph, then make this lock change? I was going to do that next, but if you want the patch order switched around I can do that as well. From BATV+d7eafe90ba11a10ce864+4737+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 11 21:56:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 01F207CA2 for ; Thu, 11 Aug 2016 21:56:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B3521304043 for ; Thu, 11 Aug 2016 19:56:27 -0700 (PDT) X-ASG-Debug-ID: 1470970584-0bf57b369d646cd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id yvMbXA5hauMbsAiH (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 11 Aug 2016 19:56:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d7eafe90ba11a10ce864+4737+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bY2dy-00042r-LH; Fri, 12 Aug 2016 02:56:22 +0000 Date: Thu, 11 Aug 2016 19:56:22 -0700 From: Christoph Hellwig To: Felix Janda Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 13/14] xfs.h: require transparent LFS Message-ID: <20160812025622.GB10701@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 13/14] xfs.h: require transparent LFS References: <3be2b10b0037406374a415fda2318cbf95a67546.1470555003.git.felix.janda@posteo.de> <20160809074138.GO25647@infradead.org> <20160809180320.GB4476@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809180320.GB4476@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470970584 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+d7eafe90ba11a10ce864+4737+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 11 21:57:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 012757CA2 for ; Thu, 11 Aug 2016 21:57:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C5511304048 for ; Thu, 11 Aug 2016 19:57:05 -0700 (PDT) X-ASG-Debug-ID: 1470970623-0bf57c136959b850001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id hBygfjwloKDpL3G8 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 11 Aug 2016 19:57:04 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d7eafe90ba11a10ce864+4737+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bY2ed-00043p-5a; Fri, 12 Aug 2016 02:57:03 +0000 Date: Thu, 11 Aug 2016 19:57:03 -0700 From: Christoph Hellwig To: Felix Janda Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs Message-ID: <20160812025703.GC10701@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs References: <20160809074010.GM25647@infradead.org> <20160809174158.GA4476@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809174158.GA4476@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470970623 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 488 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 09, 2016 at 07:41:58PM +0200, Felix Janda wrote: > This patch removes the usage of statvfs64 and thus one of the problems > for Mac OS X. The other problem is solved by giving a suitable > definition of f_brsize. Note that this might collide with other uses > of f_brsize (if they exist). It might be cleaner to just check for Mac > OS X in xfs_fsr.c. Yes, that's probably better. Or simply not build fsr on MacOS given that there is no kernel XFS support anyway.. From BATV+d7eafe90ba11a10ce864+4737+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 11 21:57:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 560607CA1 for ; Thu, 11 Aug 2016 21:57:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 17229304043 for ; Thu, 11 Aug 2016 19:57:56 -0700 (PDT) X-ASG-Debug-ID: 1470970673-0bf8151be4bc740001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rR3Rm6L4VAxmQfVj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 11 Aug 2016 19:57:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d7eafe90ba11a10ce864+4737+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bY2fR-00044g-Px; Fri, 12 Aug 2016 02:57:53 +0000 Date: Thu, 11 Aug 2016 19:57:53 -0700 From: Christoph Hellwig To: Felix Janda Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE Message-ID: <20160812025753.GD10701@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE References: <20160809073611.GC25647@infradead.org> <20160809174105.GA5907@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809174105.GA5907@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1470970674 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 500 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31952 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 09, 2016 at 07:41:05PM +0200, Felix Janda wrote: > Thanks for reviewing the patch series! > > > Does this also error out for libraries that don't support large > > off_t at all? I think that would be helpful to add if not there yet. > > I do not quite understand. Do you refer to libraries using libxfs or > the external libraries used by xfsprogs? I meant C libraries, sorry. E.g. uclibc used to not support LFS many years ago, although they probably fixed it up by now. From eguan@redhat.com Thu Aug 11 22:14:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 23E467CA0 for ; Thu, 11 Aug 2016 22:14:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 24E11AC001 for ; Thu, 11 Aug 2016 20:14:03 -0700 (PDT) X-ASG-Debug-ID: 1470971642-0bf8151be1bce90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mLbtU1GyeI7DhI2E (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 11 Aug 2016 20:14:03 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3FE5285376; Fri, 12 Aug 2016 03:14:02 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7C3E1Sb004452; Thu, 11 Aug 2016 23:14:01 -0400 Date: Fri, 12 Aug 2016 11:14:00 +0800 From: Eryu Guan To: Christoph Hellwig Cc: "Darrick J. Wong" , david@fromorbit.com, linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: test attr_list_by_handle cursor iteration Message-ID: <20160812031400.GR27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: test attr_list_by_handle cursor iteration References: <20160802235251.GB8586@birch.djwong.org> <20160803225150.GC25565@birch.djwong.org> <20160804042448.GR27776@eguan.usersys.redhat.com> <20160811174855.GD31540@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160811174855.GD31540@infradead.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 12 Aug 2016 03:14:02 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1470971643 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 674 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 11, 2016 at 10:48:55AM -0700, Christoph Hellwig wrote: > On Thu, Aug 04, 2016 at 12:24:48PM +0800, Eryu Guan wrote: > > I have to replace false/true with 0/1 to build it on RHEL6. I can fix it > > at commit time if there's no other major updates. > > Simply including would fix that on RHEL6, wouldn't it? Yes, including fixes the build failure on RHEL6, another option is to replace all bool with int, as mentioned in my first review email. And Darric chose the "int" way in v2 but only updated the function definition and forgot to update the callers (still passing true/false, not 1/0). Thanks for the review! Eryu From jentai-sales01@oak-bond.com Fri Aug 12 01:30:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C87A57CA0 for ; Fri, 12 Aug 2016 01:30:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BF8C304043 for ; Thu, 11 Aug 2016 23:30:56 -0700 (PDT) X-ASG-Debug-ID: 1470983450-0bf57c136a59ff60001-NocioJ Received: from smtpbguseast2.qq.com (smtpbguseast2.qq.com [54.204.34.130]) by cuda.sgi.com with ESMTP id wYK6LuzCAUmk2DD5 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 11 Aug 2016 23:30:52 -0700 (PDT) X-Barracuda-Envelope-From: jentai-sales01@oak-bond.com X-Barracuda-Effective-Source-IP: smtpbguseast2.qq.com[54.204.34.130] X-Barracuda-Apparent-Source-IP: 54.204.34.130 X-QQ-GoodBg: 0 X-QQ-SSF: 00100000000000F0 X-QQ-FEAT: yGNZ4f+HfTC1zrzJ7Rn9iuBlxdGwBLDpEa2u7d965LpBebV4coj0i7kro9xAx GwH0K+mCFOxZ+AcnODpL5rJF9dbqf2/LitA1orOM7YXYm3JO7niFaXSr8N4ateDWL05unw6 /NLL9b1jZ2bI0enXOb0aeVmSnL5CRa7CAAlevFL6+xXKELvBq8Z9kID7U3YN9DS9L/IJ0yX 2FuSPoIzMEQyD+d3Xt+XVPdTUyal2DZrbbLJfzlzDSoIV5eMFB/x9vYm/FE6ZtxVE9i1YNB YcbWCwdAnYT1QaflRNYURezpk= X-QQ-BUSINESS-ORIGIN: 2 X-Originating-IP: 49.72.162.60 X-QQ-STYLE: X-QQ-mid: bizmailfree71t1470983447t2236 From: "=?utf-8?B?5YiY6YC45Y2O?=" Subject: JENTAI---Professional Manufactory in Hot melt glue sticks and Hot melt colloidal particles Mime-Version: 1.0 X-ASG-Orig-Subj: JENTAI---Professional Manufactory in Hot melt glue sticks and Hot melt colloidal particles Content-Type: multipart/alternative; boundary="----=_NextPart_57AD6D17_09B23340_65CF4C96" Content-Transfer-Encoding: 8Bit Date: Fri, 12 Aug 2016 14:30:47 +0800 X-Priority: 3 Message-ID: X-QQ-MIME: TCMime 1.0 by Tencent X-Mailer: QQMail 2.x X-QQ-Mailer: QQMail 2.x X-QQ-SENDSIZE: 520 To: "=?gb18030?B?eGZz?=" X-QQ-Bgrelay: 1 X-Barracuda-Connect: smtpbguseast2.qq.com[54.204.34.130] X-Barracuda-Start-Time: 1470983451 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7408 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, BSF_SC0_MV0587, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 1.50 BSF_SC0_MV0587 Custom rule MV0587 This is a multi-part message in MIME format. ------=_NextPart_57AD6D17_09B23340_65CF4C96 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBTaXIgLyBNYWRhbQ0KDQogVGhpcyBpcyBTaGFuZ2hhaSBKRU5UQUkgTmFubyBUZWNo bm9sb2d5IENvLixMdGQuDQogT3VyIGNvbXBhbnkgaXMgcHJvZmVzc2lvbmFsIG1hbnVmYWN0 dXJlIGluIEhvdCBtZWx0IGdsdWUgc3RpY2tzIGFuZCBIb3QgbWVsdCBjb2xsb2lkYWwgcGFy dGljbGVzIG92ZXIgMjAgeWVhcnMuDQogSGVyZSBpcyBvdXIgY29tcGFueSB3ZWJzaXRlIGFk ZHJlc3M6ICAgaHR0cDovL2VuLm9hay1ib25kLmNvbS8NCiANCiBUaGUgcHJpY2Ugd2UgY2Fu IG9mZmVyIHRvIHlvdSBhcyBmb2xsb3dpbmc6DQoNCiBIb3QgbWVsdCBnbHVlIHN0aWNrcyA6 ICAgICAgICAgICAgICBVU0QxLjk0L2tnDQoNCkhvdCBtZWx0IGNvbGxvaWRhbCBwYXJ0aWNs ZXMgOiAgICBVU0QgMS41Mi9rZw0KDQoNCg0KDQpXZSBjYW4gb2ZmZXIgeW91IGZyZWUgc2Ft cGxlcyB0byBsZXQgeW91IHRlc3QuDQoNCiBJZiB5b3UgaGF2ZSBhbnkgaW50ZXJlc3RlZCwg cGxlYXNlIGNvbnRhY3Qgd2l0aCB1cy4NCg0KV2Ugd2lsbCBnaXZlIHlvdSBtb3JlIGluZm9y bWF0aW9uLg0KDQoNCg0KIA0KSG9wZSB0byBoZWFyIGZyb20geW91IHNvb24uDQoNCi0tLS0t LS0tLS0tLS0tLS0tLQ0KDQpTaG5hZ2FoaSBKRU5UQUkgTmFubyBUZWNobm9sb2d5IENvLiwg THRkTm8uMTM5IFhpbmppYW4gYnJhbmNoIHJvYWQsIFNoaXBhaSBpbmR1c3RyaWFsIGFyZWEs IEt1bnNoYW4gY2l0eSwgSmlhbmdzdSBQcm92aW5jZQ0KDQpFeHBvcnQgU2FsZXMNCuWKiemA uOiPryBJdmFuIExpdQ0KRS1tYWlsOiBqZW50YWktc2FsZXMwMUBvYWstYm9uZC5jb20NCldl Y2hhdDogaXZhbmxpdTAyMjI= ------=_NextPart_57AD6D17_09B23340_65CF4C96 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGRpdj48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTogaW5p dGlhbDsgYmFja2dyb3VuZC1hdHRhY2htZW50OiBpbml0aWFsOyBiYWNrZ3JvdW5kLXNpemU6 IGluaXRpYWw7IGJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyBiYWNrZ3JvdW5kLWNsaXA6 IGluaXRpYWw7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWw7IGJhY2tncm91bmQtcmVw ZWF0OiBpbml0aWFsOyI+PHNwYW4gbGFuZz0iRU4tVVMiPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsgbGluZS1oZWlnaHQ6IDE1Ljc1cHQ7IGZvbnQt c2l6ZTogOXB0OyI+RGVhciBTaXIgLyBNYWRhbTwvc3Bhbj48L3NwYW4+PC9wPjxwIGNsYXNz PSJNc29Ob3JtYWwiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiBpbml0aWFsOyBiYWNrZ3Jv dW5kLWF0dGFjaG1lbnQ6IGluaXRpYWw7IGJhY2tncm91bmQtc2l6ZTogaW5pdGlhbDsgYmFj a2dyb3VuZC1vcmlnaW46IGluaXRpYWw7IGJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgYmFj a2dyb3VuZC1wb3NpdGlvbjogaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWw7 Ij48c3BhbiBsYW5nPSJFTi1VUyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5h LCBzYW5zLXNlcmlmOyBsaW5lLWhlaWdodDogMTUuNzVwdDsgZm9udC1zaXplOiA5cHQ7Ij4N ClRoaXMgaXMgPC9zcGFuPjwvc3Bhbj48YiBzdHlsZT0ibGluZS1oZWlnaHQ6IDE1Ljc1cHQ7 Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9IiBmb250LXNpemU6OS4wcHQgOyA7IDsgOztj b2xvcjpyZWQgIj5TaGFuZ2hhaSBKRU5UQUkgTmFubyBUZWNobm9sb2d5IENvLixMdGQuPC9z cGFuPjwvYj48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxNS43NXB0 OyBmb250LXNpemU6IDlwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7Ij48 YnI+DQpPdXIgY29tcGFueSBpcyBwcm9mZXNzaW9uYWwgbWFudWZhY3R1cmUgaW4gPC9zcGFu PjxiIHN0eWxlPSJsaW5lLWhlaWdodDogMTUuNzVwdDsiPjxzcGFuIGxhbmc9IkVOLVVTIiBz dHlsZT0iIGZvbnQtc2l6ZTo5LjBwdCA7IDsgOyA7O2NvbG9yOnJlZCAiPkhvdCBtZWx0DQpn bHVlIHN0aWNrczwvc3Bhbj48L2I+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJsaW5lLWhl aWdodDogMTUuNzVwdDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiByZWQ7Ij4mbmJzcDs8L3Nw YW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJsaW5lLWhlaWdodDogMTUuNzVwdDsgZm9u dC1zaXplOiA5cHQ7Ij5hbmQ8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4mbmJzcDs8Yj5Ib3Qg bWVsdCBjb2xsb2lkYWwgcGFydGljbGVzPC9iPjwvc3Bhbj4mbmJzcDtvdmVyIDIwIHllYXJz Ljxicj4NCkhlcmUgaXMgb3VyIGNvbXBhbnkgd2Vic2l0ZSBhZGRyZXNzOiZuYnNwOyAmbmJz cDs8L3NwYW4+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJsaW5lLWhlaWdodDogMTUuNzVw dDsiPjxhIGhyZWY9Imh0dHA6Ly9lbi5vYWstYm9uZC5jb20vIiB0YXJnZXQ9Il9ibGFuayI+ PHNwYW4gc3R5bGU9IiBmb250LXNpemU6OS4wcHQgOyA7IDsgOztjb2xvcjp3aW5kb3d0ZXh0 ICI+aHR0cDovL2VuLm9hay1ib25kLmNvbS88L3NwYW4+PC9hPjwvc3Bhbj48c3BhbiBsYW5n PSJFTi1VUyIgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxNS43NXB0OyBmb250LXNpemU6IDlwdDsg Zm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7Ij48YnI+DQo8YnI+DQpUaGUgcHJp Y2Ugd2UgY2FuIG9mZmVyIHRvIHlvdSBhcyBmb2xsb3dpbmc6PC9zcGFuPjwvcD48cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTogaW5pdGlhbDsgYmFja2dy b3VuZC1hdHRhY2htZW50OiBpbml0aWFsOyBiYWNrZ3JvdW5kLXNpemU6IGluaXRpYWw7IGJh Y2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyBiYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IGJh Y2tncm91bmQtcG9zaXRpb246IGluaXRpYWw7IGJhY2tncm91bmQtcmVwZWF0OiBpbml0aWFs OyI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJsaW5lLWhlaWdodDogMTUuNzVwdDsgZm9u dC1zaXplOiA5cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmOyI+DQpIb3Qg bWVsdCBnbHVlIHN0aWNrcyA6ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg PC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0ibGluZS1oZWlnaHQ6IDE1Ljc1cHQ7 IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogcmVkOyI+Jm5ic3A7ICZuYnNwOzxiPlVTRDEuOTwv Yj48L3NwYW4+PGIgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxNS43NXB0OyI+PHNwYW4gbGFuZz0i RU4tVVMiIHN0eWxlPSIgZm9udC1zaXplOjkuMHB0IDsgOyA7IDs7bXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6DQpQTWluZ0xpVTtjb2xvcjpyZWQgIj40PC9zcGFuPjwvYj48YiBzdHlsZT0i bGluZS1oZWlnaHQ6IDE1Ljc1cHQ7Ij48c3BhbiBsYW5nPSJFTi1VUyIgc3R5bGU9IiBmb250 LXNpemU6OS4wcHQgOyA7IDsgOztjb2xvcjpyZWQgIj4va2c8L3NwYW4+PC9iPjxzcGFuIGxh bmc9IkVOLVVTIiBzdHlsZT0ibGluZS1oZWlnaHQ6IDE1Ljc1cHQ7IGZvbnQtZmFtaWx5OiBW ZXJkYW5hLCBzYW5zLXNlcmlmOyI+PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPSJN c29Ob3JtYWwiIHN0eWxlPSJiYWNrZ3JvdW5kLWltYWdlOiBpbml0aWFsOyBiYWNrZ3JvdW5k LWF0dGFjaG1lbnQ6IGluaXRpYWw7IGJhY2tncm91bmQtc2l6ZTogaW5pdGlhbDsgYmFja2dy b3VuZC1vcmlnaW46IGluaXRpYWw7IGJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgYmFja2dy b3VuZC1wb3NpdGlvbjogaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWw7Ij48 c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB4OyI+SG90IG1lbHQgY29sbG9pZGFsIHBhcnRp Y2xlczwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMnB4OyI+Jm5ic3A7PC9zcGFu PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsgZm9udC1z aXplOiAxMnB4OyBsaW5lLWhlaWdodDogMS41OyI+OiAmbmJzcDsgPGZvbnQgY29sb3I9IiNm ZjAwMDAiPjxiPiBVU0QgMS41Mi9rZzwvYj48L2ZvbnQ+PC9zcGFuPjwvcD48cCBjbGFzcz0i TXNvTm9ybWFsIiBzdHlsZT0iYmFja2dyb3VuZC1pbWFnZTogaW5pdGlhbDsgYmFja2dyb3Vu ZC1hdHRhY2htZW50OiBpbml0aWFsOyBiYWNrZ3JvdW5kLXNpemU6IGluaXRpYWw7IGJhY2tn cm91bmQtb3JpZ2luOiBpbml0aWFsOyBiYWNrZ3JvdW5kLWNsaXA6IGluaXRpYWw7IGJhY2tn cm91bmQtcG9zaXRpb246IGluaXRpYWw7IGJhY2tncm91bmQtcmVwZWF0OiBpbml0aWFsOyI+ PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmOyBmb250LXNp emU6IDlwdDsiPjxicj48L3NwYW4+PC9wPjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJi YWNrZ3JvdW5kLWltYWdlOiBpbml0aWFsOyBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGluaXRp YWw7IGJhY2tncm91bmQtc2l6ZTogaW5pdGlhbDsgYmFja2dyb3VuZC1vcmlnaW46IGluaXRp YWw7IGJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgYmFja2dyb3VuZC1wb3NpdGlvbjogaW5p dGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWw7Ij48c3BhbiBzdHlsZT0iZm9udC1m YW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyI+V2UgY2FuIG9m ZmVyIHlvdSBmcmVlIHNhbXBsZXMNCnRvIGxldCB5b3UgdGVzdC48L3NwYW4+PC9wPjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJsaW5lLWhlaWdodDogMTUuNzVwdDsgYmFja2dyb3Vu ZC1pbWFnZTogaW5pdGlhbDsgYmFja2dyb3VuZC1hdHRhY2htZW50OiBpbml0aWFsOyBiYWNr Z3JvdW5kLXNpemU6IGluaXRpYWw7IGJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyBiYWNr Z3JvdW5kLWNsaXA6IGluaXRpYWw7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWw7IGJh Y2tncm91bmQtcmVwZWF0OiBpbml0aWFsOyI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJm b250LXNpemU6IDlwdDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7Ij4NCklm IHlvdSBoYXZlIGFueSBpbnRlcmVzdGVkLCBwbGVhc2UgY29udGFjdCB3aXRoIHVzLjwvc3Bh bj48L3A+PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImxpbmUtaGVpZ2h0OiAxNS43NXB0 OyBiYWNrZ3JvdW5kLWltYWdlOiBpbml0aWFsOyBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQ6IGlu aXRpYWw7IGJhY2tncm91bmQtc2l6ZTogaW5pdGlhbDsgYmFja2dyb3VuZC1vcmlnaW46IGlu aXRpYWw7IGJhY2tncm91bmQtY2xpcDogaW5pdGlhbDsgYmFja2dyb3VuZC1wb3NpdGlvbjog aW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWw7Ij48c3BhbiBzdHlsZT0iZm9u dC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBsaW5lLWhl aWdodDogMTUuNzVwdDsiPldlIHdpbGwgZ2l2ZSB5b3UNCm1vcmUgaW5mb3JtYXRpb24uPC9z cGFuPjwvcD48cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibGluZS1oZWlnaHQ6IDE1Ljc1 cHQ7IGJhY2tncm91bmQtaW1hZ2U6IGluaXRpYWw7IGJhY2tncm91bmQtYXR0YWNobWVudDog aW5pdGlhbDsgYmFja2dyb3VuZC1zaXplOiBpbml0aWFsOyBiYWNrZ3JvdW5kLW9yaWdpbjog aW5pdGlhbDsgYmFja2dyb3VuZC1jbGlwOiBpbml0aWFsOyBiYWNrZ3JvdW5kLXBvc2l0aW9u OiBpbml0aWFsOyBiYWNrZ3JvdW5kLXJlcGVhdDogaW5pdGlhbDsiPjxzcGFuIHN0eWxlPSJm b250LWZhbWlseTogVmVyZGFuYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiA5cHQ7IGxpbmUt aGVpZ2h0OiAxNS43NXB0OyI+PGJyPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJsaW5lLWhlaWdodDogMTUuNzVwdDsgYmFja2dyb3VuZC1pbWFnZTogaW5p dGlhbDsgYmFja2dyb3VuZC1hdHRhY2htZW50OiBpbml0aWFsOyBiYWNrZ3JvdW5kLXNpemU6 IGluaXRpYWw7IGJhY2tncm91bmQtb3JpZ2luOiBpbml0aWFsOyBiYWNrZ3JvdW5kLWNsaXA6 IGluaXRpYWw7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWw7IGJhY2tncm91bmQtcmVw ZWF0OiBpbml0aWFsOyI+PHNwYW4gbGFuZz0iRU4tVVMiIHN0eWxlPSJmb250LXNpemU6IDlw dDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIHNhbnMtc2VyaWY7Ij5Ib3BlIHRvIGhlYXIgZnJv bSB5b3Ugc29vPC9zcGFuPjxzcGFuIGxhbmc9IkVOLVVTIiBzdHlsZT0iZm9udC1zaXplOiA5 cHQ7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBzYW5zLXNlcmlmOyI+bi48L3NwYW4+PC9wPjwv ZGl2PjxkaXY+PHNpZ24gc2lnbmlkPSIwIj48ZGl2IHN0eWxlPSJjb2xvcjojOTA5MDkwO2Zv bnQtZmFtaWx5OkFyaWFsIE5hcnJvdztmb250LXNpemU6MTJweCI+LS0tLS0tLS0tLS0tLS0t LS0tPC9kaXY+PGRpdiBzdHlsZT0iZm9udC1zaXplOjE0cHg7Zm9udC1mYW1pbHk6VmVyZGFu YTtjb2xvcjojMDAwOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMjU1KTsiPjxp bWcgc3R5bGU9IndpZHRoOiAxNjFweDsgaGVpZ2h0OiA4MnB4OyIgc3JjPSJodHRwOi8vZXht YWlsLnFxLmNvbS9jZ2ktYmluL3ZpZXdmaWxlP3R5cGU9c2lnbmF0dXJlJmFtcDtwaWNpZD1a WDAxMTItM29mUmVYZ2FqcWt0dENoX3AlN0VCaFk2aiZhbXA7dWluPTI2MTk4MDE5NDUiPjxi cj48L3NwYW4+PGZvbnQgY29sb3I9IiMwMDAwODAiIHN0eWxlPSJsaW5lLWhlaWdodDogMjFw eDsiPlNobmFnYWhpIEpFTlRBSSBOYW5vIFRlY2hub2xvZ3kgQ28uLCBMdGQ8L2ZvbnQ+PGRp diBzdHlsZT0ibGluZS1oZWlnaHQ6IDIxcHg7Ij48Zm9udCBjb2xvcj0iIzAwMDA4MCI+Tm8u MTM5IFhpbmppYW4gYnJhbmNoIHJvYWQsIFNoaXBhaSBpbmR1c3RyaWFsIGFyZWEsIEt1bnNo YW4gY2l0eSwgSmlhbmdzdSBQcm92aW5jZTwvZm9udD48L2Rpdj48ZGl2IHN0eWxlPSJsaW5l LWhlaWdodDogMjFweDsiPjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDI1NSk7Ij48 YnI+PC9zcGFuPjxkaXY+PGZvbnQgY29sb3I9IiMwMDAwZmYiPkV4cG9ydCBTYWxlczwvZm9u dD48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDI1NSk7Ij7lionp gLjoj68gSXZhbiBMaXU8L3NwYW4+PC9kaXY+PGRpdj48c3BhbiBzdHlsZT0iY29sb3I6IHJn YigwLCAwLCAyNTUpOyI+RS1tYWlsOiBqZW50YWktc2FsZXMwMUBvYWstYm9uZC5jb208L3Nw YW4+PC9kaXY+PGRpdj48ZGl2PjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDI1NSk7 Ij5XZWNoYXQ6IGl2YW5saXUwMjIyPC9zcGFuPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjwvZGl2 PjwvZGl2Pg0KPC9kaXY+PC9zaWduPjwvZGl2PjxkaXY+Jm5ic3A7PC9kaXY+PGRpdj48dGlu Y2x1ZGV0YWlsPjwvdGluY2x1ZGV0YWlsPjwvZGl2PjwhLS08IVtlbmRpZl0tLT4= ------=_NextPart_57AD6D17_09B23340_65CF4C96-- From david@fromorbit.com Fri Aug 12 04:58:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1C5CC7CA0 for ; Fri, 12 Aug 2016 04:58:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D3CD08F804B for ; Fri, 12 Aug 2016 02:58:19 -0700 (PDT) X-ASG-Debug-ID: 1470995896-0bf8151be4c5750001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id CWWceqCjjjmNqI6g for ; Fri, 12 Aug 2016 02:58:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoUTAO2crVd5LDUCIGdsb2JhbABeg0WBUoJ5g3mdLQMGjGWGD4QMhhcEAgKBR00BAQEBAQEHAQEBAQEBOECEXwEFOhwjEAgDDgoJJQ8FJQMHGhOIMMB8AQEIAiUehUSFFYobAQSZPIkchW+BX41uSIttg3iCZhyBXioyhysBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 12 Aug 2016 19:28:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bY9ED-0003cY-N3; Fri, 12 Aug 2016 19:58:13 +1000 Date: Fri, 12 Aug 2016 19:58:13 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, peterz@infradead.org Subject: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-ID: <20160812095813.GZ16044@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead References: <1470935423-12329-1-git-send-email-hch@lst.de> <20160811234335.GX16044@dastard> <20160812025026.GA975@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160812025026.GA975@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1470995897 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 593 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 12, 2016 at 04:50:26AM +0200, Christoph Hellwig wrote: > On Fri, Aug 12, 2016 at 09:43:35AM +1000, Dave Chinner wrote: > > Regardless, if the rwsem code can be made to check for exclusive or > > shared locking, we can get rid of the mrlock abstraction. Can we do > > that first, Christoph, then make this lock change? > > I was going to do that next, but if you want the patch order switched > around I can do that as well. Yeah, I'd prefer we remove te abstraction first, then switch to the vfs inode lock. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sales03@topa.site Fri Aug 12 06:28:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 624CF7CA0 for ; Fri, 12 Aug 2016 06:28:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 16C758F8050 for ; Fri, 12 Aug 2016 04:28:30 -0700 (PDT) X-ASG-Debug-ID: 1471001307-0bf8151be3c8290001-NocioJ Received: from server1.topa.site (host12.dfhgjhhh.com [47.88.15.216]) by cuda.sgi.com with ESMTP id 2NfH9zErfj4qj0Iz for ; Fri, 12 Aug 2016 04:28:27 -0700 (PDT) X-Barracuda-Envelope-From: sales03@topa.site X-Barracuda-Effective-Source-IP: host12.dfhgjhhh.com[47.88.15.216] X-Barracuda-Apparent-Source-IP: 47.88.15.216 Received: from LB-201603072005 (218.18.171.161) by server1.topa.site id hlmpdo0e97ci for ; Fri, 12 Aug 2016 19:28:26 +0800 (envelope-from ) From: "hongmypcb5@126.com" Subject: PCB:support the electrict world----xfs To: xfs@oss.sgi.com X-ASG-Orig-Subj: PCB:support the electrict world----xfs MIME-Version: 1.0 Sender: sales03@topa.site Reply-To: hongmypcb5@126.com Date: Fri, 12 Aug 2016 19:28:28 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: host12.dfhgjhhh.com[47.88.15.216] X-Barracuda-Start-Time: 1471001307 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3367 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.34 X-Barracuda-Spam-Status: No, SCORE=0.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA038b Custom Rule SA038b Message-Id: <20160812112830.8C82ED8007E@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC42MDAxLjIzNTg4Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJNQVJHSU46 IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBWZXJkYW5h OyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAxLjAwMDBwdCI+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIHN0eWxlPSJNQVJHSU46 IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBWZXJkYW5h OyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAxLjAwMDBwdCI+SGV5IA0KR3V5LDwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFS R0lOOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVmVy ZGFuYTsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZvbnQta2VybmluZzogMS4wMDAwcHQiPkhvbmdteSANClBDQiBoZXJlLGV4cG9ydGluZyBQQyBi b2FyZCB3aXRoIGdvb2QgcXVhbGl0eSBhbmQgbG93IHByaWNlIGluIFVTLjwvU1BBTj48L1A+DQo8 UCBzdHlsZT0iTUFSR0lOOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTogVmVyZGFuYTsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPkNhbGwgDQptZSxsZXQmIzM5O3Mg dGFsayBkZXRhaWxzLjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwcHQiIGNsYXNzPU1z b05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVmVyZGFuYTsgRk9OVC1TSVpFOiAx MC41cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4w MDAwcHQiPlJnZHMsPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBWZXJkYW5hOyBGT05ULVNJWkU6IDEw LjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAw MDBwdCI+Jm5ic3A7PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBWZXJkYW5hOyBGT05ULVNJWkU6IDEw LjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAw MDBwdCI+TmljazwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOOiAwcHQiIGNsYXNzPU1zb05v cm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVmVyZGFuYTsgRk9OVC1TSVpFOiAxMC41 cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAw cHQiPkhvbmdteSANCkludGVybmF0aW9uYWwmbmJzcDsgQ08uLCBMVEQ8L1NQQU4+PC9QPg0KPFAg c3R5bGU9Ik1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1G QU1JTFk6IFZlcmRhbmE7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48L1NQQU4+Jm5ic3A7PC9QPg0KPFAg c3R5bGU9Ik1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1G QU1JTFk6IFZlcmRhbmE7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij5BZGRyZXNzOmI0L2I1IA0KYnVpbGRp bmcsIHlhbmNodWFuIG5vcnRoIDwvUD4NCjxESVY+aW5kdXN0cmlhbCBwYXJrICwgNTE4MDAwIDwv RElWPg0KPERJVj5zb25nZ2FuZywgU2hlbnpoZW4gLCBDaGluYSZuYnNwOyZuYnNwOyA8L0RJVj48 L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFZlcmRhbmE7IEZPTlQtU0laRTogMTAu NXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAw MHB0Ij48bzpwPjwvbzpwPjwvU1BBTj4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBWZXJkYW5hOyBGT05ULVNJWkU6IDEw LjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAw MDBwdCI+VGVsOjxGT05UIA0Kc2l6ZT0zPjAwODYgMDc1NSAyNjk1NDA4NC02MDU8L0ZPTlQ+PC9T UEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxGT05UIHNp emU9Mz48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVmVyZGFuYTsgRk9OVC1TSVpFOiAxMC41 cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAw cHQiPldoYXRzYXBwL21vYjowMDg2MTM3MjU1NjQ1MjE8L1NQQU4+PC9GT05UPjwvUD4NCjxQIHN0 eWxlPSJNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiDlrovkvZM7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IFZl cmRhbmE7IG1zby1oYW5zaS1mb250LWZhbWlseTogVmVyZGFuYSI+PG86cD4mbmJzcDs8L286cD48 L1NQQU4+PCEtLUVuZEZyYWdtZW50LS0+PC9QPg0KPFA+Jm5ic3A7PC9QPg0KPFA+VGhhbmsgeW91 IGZvciB5b3VyIHBhdGllbmNlIGFuZCBjb25zaWRlcmF0aW9uLiBJIGhhdmUgcHJlcGFyZWQgd2Vs bCB0byBzZXJ2ZSANCnlvdSBhdCBhbnl0aW1lIHdpdGggYW55IGluc3RydWN0aW9ucyEgTG9vayBm b3J3YXJkIHRvIGhlYXJpbmcgZnJvbSB5b3UhPC9QPg0KPFA+PEEgaHJlZj0ibWFpbHRvOiNVbnN1 YnNjcmliZU1haWwjIj5JZiB5b3Ugd2lzaCB0byB1bnN1YnNjcmliZSB0byB0aGlzIGFuZCBhbGwg DQpmdXR1cmUgZW1haWxzICxwbGVhc2UgY2xpY2sgaGVyZTwvQT4gPC9QPjwvQk9EWT48L0hUTUw+ DQoNCg== From bfoster@redhat.com Fri Aug 12 07:13:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 50D267CA0 for ; Fri, 12 Aug 2016 07:13:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BBF1EAC001 for ; Fri, 12 Aug 2016 05:13:34 -0700 (PDT) X-ASG-Debug-ID: 1471004012-0bf57c136a5a7fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WFZbSbTPEoAY9qCa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 05:13:33 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 571B78E251; Fri, 12 Aug 2016 12:13:32 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-69.bos.redhat.com [10.18.41.69]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7CCDVGu002033; Fri, 12 Aug 2016 08:13:32 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E0E78120194; Fri, 12 Aug 2016 08:13:30 -0400 (EDT) From: Brian Foster To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] tests/xfs: test log recovery metadata LSN ordering Date: Fri, 12 Aug 2016 08:13:30 -0400 X-ASG-Orig-Subj: [PATCH] tests/xfs: test log recovery metadata LSN ordering Message-Id: <1471004010-52985-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Fri, 12 Aug 2016 12:13:32 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471004013 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4511 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 XFS had a bug that lead to a possible out-of-order log recovery situation (e.g., replay a stale modification from the log over more recent metadata in destination buffer). This resulted in false corruption reports during log recovery and thus mount failure. This condition is caused by system crash or filesystem shutdown shortly after a successful log recovery. Add a test to run a combined workload, fs shutdown and log recovery loop known to reproduce the problem on affected kernels. Signed-off-by: Brian Foster --- This test reproduces the problem described and addressed in the following patchset: http://oss.sgi.com/pipermail/xfs/2016-August/050840.html It runs anywhere from 50-100s in the couple of environments I've tested on so far and reproduces the problem for me with 100% reliability. Note that the bug only affects crc=1 kernels. Brian tests/xfs/999 | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/999.out | 2 ++ tests/xfs/group | 1 + 3 files changed, 90 insertions(+) create mode 100755 tests/xfs/999 create mode 100644 tests/xfs/999.out diff --git a/tests/xfs/999 b/tests/xfs/999 new file mode 100755 index 0000000..f9dd7f7 --- /dev/null +++ b/tests/xfs/999 @@ -0,0 +1,87 @@ +#! /bin/bash +# FS QA Test No. 999 +# +# Test XFS log recovery ordering on v5 superblock filesystems. XFS had a problem +# where it would incorrectly replay older modifications from the log over more +# recent versions of metadata due to failure to update metadata LSNs during log +# recovery. This could result in false positive reports of corruption during log +# recovery and permanent mount failure. +# +# To test this situation, run frequent shutdowns immediately after log recovery. +# Ensure that log recovery does not recover stale modifications and cause +# spurious corruption reports and/or mount failures. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + killall -9 fsstress > /dev/null 2>&1 + _scratch_unmount > /dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux + +_require_scratch + +rm -f $seqres.full + +echo "Silence is golden." + +_scratch_mkfs_xfs >> $seqres.full 2>&1 +_scratch_mount || _fail "mount failed" + +for i in $(seq 1 50); do + ($FSSTRESS_PROG -d $SCRATCH_MNT -n 999999 -p 4 >> $seqres.full &) \ + > /dev/null 2>&1 + + # purposely include 0 second sleeps to test shutdown immediately after + # recovery + sleep $((RANDOM % 3)) + $XFS_IO_PROG -xc shutdown $SCRATCH_MNT + + ps -e | grep fsstress > /dev/null 2>&1 + while [ $? == 0 ]; do + killall -9 fsstress > /dev/null 2>&1 + wait > /dev/null 2>&1 + ps -e | grep fsstress > /dev/null 2>&1 + done + + # quit if mount fails so we don't shutdown the host fs + _scratch_cycle_mount || _fail "cycle mount failed" +done + +# success, all done +status=0 +exit diff --git a/tests/xfs/999.out b/tests/xfs/999.out new file mode 100644 index 0000000..d254382 --- /dev/null +++ b/tests/xfs/999.out @@ -0,0 +1,2 @@ +QA output created by 999 +Silence is golden. diff --git a/tests/xfs/group b/tests/xfs/group index 6905a62..aad41b5 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -308,3 +308,4 @@ 325 auto quick clone 326 auto quick clone 327 auto quick clone +999 auto log metadata -- 2.5.5 From domb@andrew.cmu.edu Fri Aug 12 07:21:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BC5EE7CA0 for ; Fri, 12 Aug 2016 07:21:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2C119AC001 for ; Fri, 12 Aug 2016 05:21:29 -0700 (PDT) X-ASG-Debug-ID: 1471004484-0bf57b369c6551f0001-NocioJ Received: from gateway20.websitewelcome.com ([192.185.46.107]) by cuda.sgi.com with ESMTP id EyxYlzvbzYyNt5wQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 05:21:25 -0700 (PDT) X-Barracuda-Envelope-From: domb@andrew.cmu.edu X-Barracuda-Effective-Source-IP: UNKNOWN[192.185.46.107] X-Barracuda-Apparent-Source-IP: 192.185.46.107 Received: from cm2.websitewelcome.com (cm2.websitewelcome.com [192.185.178.13]) by gateway20.websitewelcome.com (Postfix) with ESMTP id 8DDF511A2797E for ; Fri, 12 Aug 2016 07:12:09 -0500 (CDT) Received: from aerostar.websitewelcome.com ([192.185.2.217]) by cm2.websitewelcome.com with id WCC81t00e4gviuw01CC9JR; Fri, 12 Aug 2016 07:12:09 -0500 Received: from [84.47.169.46] (port=36729 helo=hlrku.com) by aerostar.websitewelcome.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_1) (envelope-from ) id 1bYBJn-00092v-Kz; Fri, 12 Aug 2016 07:12:07 -0500 From: Daniele Cappellazzo To: "underground-restaurant" , "Tse-Sung Wu" , "dinesh bhunia" , "Jrg-Volker Peetz" , "xfs" Subject: awesome! Date: Fri, 12 Aug 2016 15:11:52 +0300 X-ASG-Orig-Subj: awesome! Message-ID: <0000afc45309$eaa1f63f$da6f659d$@andrew.cmu.edu> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0001_411CC8D8.2FEC123F" X-Mailer: Microsoft Outlook 15.0 Thread-Index: AdH7u+YuP1Lxe9zX9YJa0JxiNpev5g== Content-Language: ru X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - aerostar.websitewelcome.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - andrew.cmu.edu X-BWhitelist: no X-Source-IP: 84.47.169.46 X-Exim-ID: 1bYBJn-00092v-Kz X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: (hlrku.com) [84.47.169.46]:36729 X-Source-Auth: analytics@houstoninfertilityspecialist.com X-Email-Count: 381 X-Source-Cap: ZnNoaXZmMztwcmVtbG9ibzthZXJvc3Rhci53ZWJzaXRld2VsY29tZS5jb20= X-Barracuda-Connect: UNKNOWN[192.185.46.107] X-Barracuda-Start-Time: 1471004484 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2497 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.12 X-Barracuda-Spam-Status: No, SCORE=0.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, HTML_MESSAGE, RDNS_NONE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31959 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain This is a multipart message in MIME format. ------=_NextPart_000_0001_411CC8D8.2FEC123F Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Dear, Have you ever seen something like that? That is something really new and awesome, more information here See you soon, Daniele Cappellazzo ------=_NextPart_000_0001_411CC8D8.2FEC123F Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

<= span lang=3DEN-US>Dear,

 

Have you ever seen something like that? That is somethi= ng really new and awesome, more information here http://trust.sweetaftonbar.com/lniibpq

&= nbsp;

&nb= sp;

See you so= on, Daniele Cappellazzo

------=_NextPart_000_0001_411CC8D8.2FEC123F-- From eguan@redhat.com Fri Aug 12 09:04:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 68DE67CA0 for ; Fri, 12 Aug 2016 09:04:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 39B76304043 for ; Fri, 12 Aug 2016 07:04:18 -0700 (PDT) X-ASG-Debug-ID: 1471010656-0bf57c13675aca50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OCdmzLG1RJZgF9o4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 07:04:17 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 53B2E81110 for ; Fri, 12 Aug 2016 14:04:16 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7CE4F1x013442 for ; Fri, 12 Aug 2016 10:04:15 -0400 Date: Fri, 12 Aug 2016 22:04:14 +0800 From: Eryu Guan To: xfs@oss.sgi.com Subject: XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 on 4.8-rc1 kernel Message-ID: <20160812140414.GV27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 on 4.8-rc1 kernel MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Fri, 12 Aug 2016 14:04:16 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471010657 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6188 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, I hit oops while building kernel on XFS, 4.8-rc1 kernel, hit twice in six kernel builds. I'm not sure if it's a regression since 4.7 kernel yet, will do more testings. The host is a x86_64 kvm guest running RHEL7.2 with upstream 4.8-rc1 kernel. Detailed console log and XFS info and memory & cpu info please see the end of this mail. Actually I was bisecting an issue caused by generic/224, I saw the following message flooding dmesg. ... [ 92.394306] XFS (sda6): page discard on page ffffea000204c9c0, inode 0x2e4, offset 84959232. [ 92.401061] XFS (sda6): page discard on page ffffea000204ca00, inode 0x2e4, offset 84963328. [ 92.406592] XFS (sda6): page discard on page ffffea000204ca40, inode 0x2e4, offset 84967424. [ 92.409813] XFS (sda6): page discard on page ffffea000204ca80, inode 0x2e4, offset 84971520. ... I'll send another email once I get bisect result. Thanks, Eryu Host information: [root@dhcp-66-86-11 ~]# xfs_info /dev/sdb1 meta-data=/dev/sdb1 isize=256 agcount=4, agsize=6553536 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 spinodes=0 data = bsize=4096 blocks=26214144, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=12799, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@dhcp-66-86-11 ~]# df -h /dev/sdb1 Filesystem Size Used Avail Use% Mounted on /dev/sdb1 100G 47G 54G 47% /root/workspace [root@dhcp-66-86-11 ~]# free -m total used free shared buff/cache available Mem: 7982 111 7660 8 211 7594 Swap: 8063 0 8063 [root@dhcp-66-86-11 ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 4 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 13 Model name: QEMU Virtual CPU version (cpu64-rhel6) Stepping: 3 CPU MHz: 2892.421 BogoMIPS: 5785.49 Hypervisor vendor: KVM Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 4096K NUMA node0 CPU(s): 0-3 Console log: [ 505.226162] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 [ 505.226796] ------------[ cut here ]------------ [ 505.227010] kernel BUG at fs/xfs/xfs_message.c:113! [ 505.227010] invalid opcode: 0000 [#1] SMP [ 505.227010] Modules linked in: btrfs xor raid6_pq ppdev i2c_piix4 parport_pc sg parport i2c_core virtio_balloon pcspkr acpi_cpufreq nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c sd_mod ata_generic pata_acpi virtio_scsi ata_piix libata serio_raw virtio_pci 8139too virtio_ring 8139cp virtio mii floppy [ 505.227010] CPU: 3 PID: 57 Comm: kswapd0 Not tainted 4.8.0-rc1 #17 [ 505.227010] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007 [ 505.234430] task: ffff880215cde680 task.stack: ffff880210ad0000 [ 505.234430] RIP: 0010:[] [] assfail+0x22/0x30 [xfs] [ 505.234430] RSP: 0018:ffff880210ad3a00 EFLAGS: 00010246 [ 505.234430] RAX: 0000000000000000 RBX: ffff88011ec02ad8 RCX: 0000000000000000 [ 505.234430] RDX: ffff880210ad3908 RSI: 000000000000000a RDI: ffffffffa016eb95 [ 505.234430] RBP: ffff880210ad3a00 R08: 0000000000000000 R09: 0000000000000000 [ 505.234430] R10: 000000000000000a R11: f000000000000000 R12: ffff88011ec02a80 [ 505.234430] R13: ffff8802107c1998 R14: ffff8802107c1900 R15: 0000000000000000 [ 505.234430] FS: 0000000000000000(0000) GS:ffff88021fd80000(0000) knlGS:0000000000000000 [ 505.234430] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 505.234430] CR2: 0000000001137000 CR3: 00000000447a7000 CR4: 00000000000006e0 [ 505.234430] Stack: [ 505.234430] ffff880210ad3a38 ffffffffa0123332 ffff880201026c00 ffff880201026d24 [ 505.234430] ffff88011ec02a80 ffff8802107c1900 0000000000000000 ffff880210ad3a88 [ 505.234430] ffffffffa012e05d 0000000008405eae ffff88011ec02a80 00000000ec38fc98 [ 505.234430] Call Trace: [ 505.234430] [] xfs_buf_rele+0x2f2/0x380 [xfs] [ 505.234430] [] xfs_reclaim_inode+0x38d/0x3a0 [xfs] [ 505.234430] [] xfs_reclaim_inodes_ag+0x223/0x360 [xfs] [ 505.234430] [] ? try_to_wake_up+0x58/0x390 [ 505.234430] [] ? wake_up_process+0x15/0x20 [ 505.234430] [] xfs_reclaim_inodes_nr+0x33/0x40 [xfs] [ 505.234430] [] xfs_fs_free_cached_objects+0x19/0x20 [xfs] [ 505.234430] [] super_cache_scan+0x181/0x190 [ 505.234430] [] shrink_slab+0x237/0x400 [ 505.234430] [] shrink_node+0x303/0x310 [ 505.234430] [] kswapd+0x302/0x6f0 [ 505.234430] [] ? mem_cgroup_shrink_node+0x180/0x180 [ 505.234430] [] kthread+0xd8/0xf0 [ 505.234430] [] ret_from_fork+0x1f/0x40 [ 505.234430] [] ? kthread_park+0x60/0x60 [ 505.234430] Code: 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 f1 41 89 d0 48 c7 c6 30 a9 17 a0 48 89 fa 31 c0 48 89 e5 31 ff e8 ae f8 ff ff <0f> 0b 66 90 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 [ 505.234430] RIP [] assfail+0x22/0x30 [xfs] [ 505.234430] RSP [ 505.251864] ---[ end trace d6c2d984ee03a700 ]--- [ 505.252246] Kernel panic - not syncing: Fatal exception [ 505.252662] Kernel Offset: disabled [ 505.252929] ---[ end Kernel panic - not syncing: Fatal exception From eguan@redhat.com Fri Aug 12 09:47:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E007D7CA0 for ; Fri, 12 Aug 2016 09:47:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B1BE88F804C for ; Fri, 12 Aug 2016 07:47:55 -0700 (PDT) X-ASG-Debug-ID: 1471013274-0bf57c13685b3000001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FNhIKyE3J3knBOEt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 07:47:54 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 115A7C030701 for ; Fri, 12 Aug 2016 14:47:54 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7CElqeZ028031 for ; Fri, 12 Aug 2016 10:47:53 -0400 Date: Fri, 12 Aug 2016 22:47:52 +0800 From: Eryu Guan To: xfs@oss.sgi.com Subject: Re: XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 on 4.8-rc1 kernel Message-ID: <20160812144752.GW27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 on 4.8-rc1 kernel References: <20160812140414.GV27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160812140414.GV27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 12 Aug 2016 14:47:54 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471013274 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3926 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 12, 2016 at 10:04:14PM +0800, Eryu Guan wrote: > Hi, > > I hit oops while building kernel on XFS, 4.8-rc1 kernel, hit twice in > six kernel builds. I'm not sure if it's a regression since 4.7 kernel > yet, will do more testings. Just hit again on 4.8-rc1 kernel, I was doing # clean partial builds from previous run and build again make clean make -j 8 Seems I have to do kernel build on 4.7 kernel to finish the bisect. Thanks, Eryu [ 2515.752039] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 [ 2515.752649] ------------[ cut here ]------------ [ 2515.752949] kernel BUG at fs/xfs/xfs_message.c:113! [ 2515.753010] invalid opcode: 0000 [#1] SMP [ 2515.753010] Modules linked in: btrfs xor raid6_pq ppdev i2c_piix4 parport_pc sg pcspkr i2c_core parport virtio_balloon acpi_cpufreq nfsd auth_rpcgss nfs_acl lockd grace sunrp c ip_tables xfs libcrc32c sd_mod ata_generic pata_acpi virtio_scsi serio_raw ata_piix virtio_pci 8139too floppy libata virtio_ring virtio 8139cp mii [ 2515.753010] CPU: 1 PID: 57 Comm: kswapd0 Not tainted 4.8.0-rc1 #17 [ 2515.753010] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007 [ 2515.753010] task: ffff880215cde680 task.stack: ffff880210a98000 [ 2515.753010] RIP: 0010:[] [] assfail+0x22/0x30 [xfs] [ 2515.753010] RSP: 0000:ffff880210a9ba00 EFLAGS: 00010246 [ 2515.753010] RAX: 0000000000000000 RBX: ffff8801289fb9d8 RCX: 0000000000000000 [ 2515.753010] RDX: ffff880210a9b908 RSI: 000000000000000a RDI: ffffffffa017ab95 [ 2515.753010] RBP: ffff880210a9ba00 R08: 0000000000000000 R09: 0000000000000000 [ 2515.753010] R10: 000000000000000a R11: f000000000000000 R12: ffff8801289fb980 [ 2515.753010] R13: ffff88020f701c98 R14: ffff88020f701c00 R15: 0000000000000000 [ 2515.753010] FS: 0000000000000000(0000) GS:ffff88021fc80000(0000) knlGS:0000000000000000 [ 2515.753010] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 2515.753010] CR2: 00002ab2aa17d000 CR3: 0000000208cd6000 CR4: 00000000000006e0 [ 2515.753010] Stack: [ 2515.753010] ffff880210a9ba38 ffffffffa012f332 ffff880103b4b000 ffff880103b4b124 [ 2515.753010] ffff8801289fb980 ffff88020f701c00 0000000000000000 ffff880210a9ba88 [ 2515.753010] ffffffffa013a05d 0000000008405ead ffff8801289fb980 000000009df3522a [ 2515.753010] Call Trace: [ 2515.753010] [] xfs_buf_rele+0x2f2/0x380 [xfs] [ 2515.753010] [] xfs_reclaim_inode+0x38d/0x3a0 [xfs] [ 2515.753010] [] xfs_reclaim_inodes_ag+0x223/0x360 [xfs] [ 2515.753010] [] ? try_to_wake_up+0x58/0x390 [ 2515.753010] [] ? wake_up_process+0x15/0x20 [ 2515.753010] [] xfs_reclaim_inodes_nr+0x33/0x40 [xfs] [ 2515.753010] [] xfs_fs_free_cached_objects+0x19/0x20 [xfs] [ 2515.753010] [] super_cache_scan+0x181/0x190 [ 2515.753010] [] shrink_slab+0x237/0x400 [ 2515.753010] [] shrink_node+0x303/0x310 [ 2515.753010] [] kswapd+0x302/0x6f0 [ 2515.753010] [] ? mem_cgroup_shrink_node+0x180/0x180 [ 2515.753010] [] kthread+0xd8/0xf0 [ 2515.753010] [] ret_from_fork+0x1f/0x40 [ 2515.753010] [] ? kthread_park+0x60/0x60 [ 2515.753010] Code: 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 f1 41 89 d0 48 c7 c6 30 69 18 a0 48 89 fa 31 c0 48 89 e5 31 ff e8 ae f8 ff ff <0f> 0b 66 90 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 [ 2515.753010] RIP [] assfail+0x22/0x30 [xfs] [ 2515.753010] RSP [ 2515.773793] ---[ end trace d8064b1e521d0bfb ]--- [ 2515.774123] Kernel panic - not syncing: Fatal exception [ 2515.774534] Kernel Offset: disabled [ 2515.774774] ---[ end Kernel panic - not syncing: Fatal exception From felix.janda@posteo.de Fri Aug 12 11:55:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 46A0F7CA1 for ; Fri, 12 Aug 2016 11:55:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AEA68AC003 for ; Fri, 12 Aug 2016 09:55:42 -0700 (PDT) X-ASG-Debug-ID: 1471020935-0bf57c13685b8b30001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id 1StLj8WFtREndgMV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 09:55:36 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 211DC20850 for ; Fri, 12 Aug 2016 18:55:34 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s9rc60VdLzysV; Fri, 12 Aug 2016 18:55:33 +0200 (CEST) Date: Fri, 12 Aug 2016 18:54:40 +0200 From: Felix Janda To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE Message-ID: <20160812165440.GA367@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE References: <20160809073611.GC25647@infradead.org> <20160809174105.GA5907@nyan> <20160812025753.GD10701@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160812025753.GD10701@infradead.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471020936 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1457 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31963 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Christoph Hellwig wrote: > On Tue, Aug 09, 2016 at 07:41:05PM +0200, Felix Janda wrote: > > Thanks for reviewing the patch series! > > > > > Does this also error out for libraries that don't support large > > > off_t at all? I think that would be helpful to add if not there yet. > > > > I do not quite understand. Do you refer to libraries using libxfs or > > the external libraries used by xfsprogs? > > I meant C libraries, sorry. E.g. uclibc used to not support LFS > many years ago, although they probably fixed it up by now. Thaks for clarifying. If a libc does not support LFS, with this patch series the build will fail soon, because of the off_t size check in xfs.h. The support of transparent LFS in different c libraries on linux seems to be the following: glibc: since version 2.2 (2000) uClibc: since version 0.9.11 (2002) dietlibc: since version 0.8 (2001) klibc: AFAICS since beginning only transparent LFS musl: since beginning only transparent LFS bionic: In 2015 _FILE_OFFSET_BITS was implemented "mostly"... newlib: (except on cygwin) does not seem to have support for transparent LFS Note that LFS can be configured out of uClibc. However its headers error out when it is configured out and an application sets _FILE_OFFSET_BITS. (So in the case of xfsprogs it would have errored out in this situation already earlier.) So it seems that this patch series breaks newlib support... Felix From felix.janda@posteo.de Fri Aug 12 12:04:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3DF027CA0 for ; Fri, 12 Aug 2016 12:04:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6BCAAC001 for ; Fri, 12 Aug 2016 10:04:33 -0700 (PDT) X-ASG-Debug-ID: 1471021470-0bf57c13695b8f80001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id kXsGWpD804TEdj1Z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 10:04:31 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 233132008F for ; Fri, 12 Aug 2016 19:04:30 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3s9rpP4dDTzytk; Fri, 12 Aug 2016 19:04:29 +0200 (CEST) Date: Fri, 12 Aug 2016 19:03:36 +0200 From: Felix Janda To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs Message-ID: <20160812170336.GB367@nyan> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 11/14] replace statvfs64 by equivalent statvfs References: <20160809074010.GM25647@infradead.org> <20160809174158.GA4476@nyan> <20160812025703.GC10701@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160812025703.GC10701@infradead.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471021471 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 739 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31963 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Christoph Hellwig wrote: > On Tue, Aug 09, 2016 at 07:41:58PM +0200, Felix Janda wrote: > > This patch removes the usage of statvfs64 and thus one of the problems > > for Mac OS X. The other problem is solved by giving a suitable > > definition of f_brsize. Note that this might collide with other uses > > of f_brsize (if they exist). It might be cleaner to just check for Mac > > OS X in xfs_fsr.c. > > Yes, that's probably better. Or simply not build fsr on MacOS given > that there is no kernel XFS support anyway.. That second option sounds interesting. If fsr was not built on Mac OS X, then commit 7141fc5b04905e (add *mntent abstraction) can basically be reverted, simplifying the platform headers a bit. Felix From bfoster@redhat.com Fri Aug 12 12:07:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E60817CA0 for ; Fri, 12 Aug 2016 12:07:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D1DD304048 for ; Fri, 12 Aug 2016 10:07:21 -0700 (PDT) X-ASG-Debug-ID: 1471021637-0bf8151be3dbd60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9vANMWNS9jo84jfJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 10:07:17 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1407285543 for ; Fri, 12 Aug 2016 17:07:17 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-69.bos.redhat.com [10.18.41.69]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7CH7GiH028526; Fri, 12 Aug 2016 13:07:16 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 50E3D120194; Fri, 12 Aug 2016 13:07:15 -0400 (EDT) Date: Fri, 12 Aug 2016 13:07:15 -0400 From: Brian Foster To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 on 4.8-rc1 kernel Message-ID: <20160812170714.GA64450@bfoster.bfoster> X-ASG-Orig-Subj: Re: XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 on 4.8-rc1 kernel References: <20160812140414.GV27776@eguan.usersys.redhat.com> <20160812144752.GW27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160812144752.GW27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Fri, 12 Aug 2016 17:07:17 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471021637 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4623 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 12, 2016 at 10:47:52PM +0800, Eryu Guan wrote: > On Fri, Aug 12, 2016 at 10:04:14PM +0800, Eryu Guan wrote: > > Hi, > > > > I hit oops while building kernel on XFS, 4.8-rc1 kernel, hit twice in > > six kernel builds. I'm not sure if it's a regression since 4.7 kernel > > yet, will do more testings. > > Just hit again on 4.8-rc1 kernel, I was doing > > # clean partial builds from previous run and build again > make clean > make -j 8 > > Seems I have to do kernel build on 4.7 kernel to finish the bisect. > > Thanks, > Eryu > > [ 2515.752039] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 This is commit 9c7504aa7 ("xfs: track and serialize in-flight async buffers against unmount"). The assert is actually incorrect, as Dave had previously pointed out[1]. A patch was posted[2] to fix it, but hasn't been merged yet. Brian [1] http://oss.sgi.com/pipermail/xfs/2016-August/050613.html [2] http://oss.sgi.com/pipermail/xfs/2016-August/050634.html > [ 2515.752649] ------------[ cut here ]------------ > [ 2515.752949] kernel BUG at fs/xfs/xfs_message.c:113! > [ 2515.753010] invalid opcode: 0000 [#1] SMP > [ 2515.753010] Modules linked in: btrfs xor raid6_pq ppdev i2c_piix4 parport_pc sg pcspkr i2c_core parport virtio_balloon acpi_cpufreq nfsd auth_rpcgss nfs_acl lockd grace sunrp > c ip_tables xfs libcrc32c sd_mod ata_generic pata_acpi virtio_scsi serio_raw ata_piix virtio_pci 8139too floppy libata virtio_ring virtio 8139cp mii > [ 2515.753010] CPU: 1 PID: 57 Comm: kswapd0 Not tainted 4.8.0-rc1 #17 > [ 2515.753010] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2007 > [ 2515.753010] task: ffff880215cde680 task.stack: ffff880210a98000 > [ 2515.753010] RIP: 0010:[] [] assfail+0x22/0x30 [xfs] > [ 2515.753010] RSP: 0000:ffff880210a9ba00 EFLAGS: 00010246 > [ 2515.753010] RAX: 0000000000000000 RBX: ffff8801289fb9d8 RCX: 0000000000000000 > [ 2515.753010] RDX: ffff880210a9b908 RSI: 000000000000000a RDI: ffffffffa017ab95 > [ 2515.753010] RBP: ffff880210a9ba00 R08: 0000000000000000 R09: 0000000000000000 > [ 2515.753010] R10: 000000000000000a R11: f000000000000000 R12: ffff8801289fb980 > [ 2515.753010] R13: ffff88020f701c98 R14: ffff88020f701c00 R15: 0000000000000000 > [ 2515.753010] FS: 0000000000000000(0000) GS:ffff88021fc80000(0000) knlGS:0000000000000000 > [ 2515.753010] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > [ 2515.753010] CR2: 00002ab2aa17d000 CR3: 0000000208cd6000 CR4: 00000000000006e0 > [ 2515.753010] Stack: > [ 2515.753010] ffff880210a9ba38 ffffffffa012f332 ffff880103b4b000 ffff880103b4b124 > [ 2515.753010] ffff8801289fb980 ffff88020f701c00 0000000000000000 ffff880210a9ba88 > [ 2515.753010] ffffffffa013a05d 0000000008405ead ffff8801289fb980 000000009df3522a > [ 2515.753010] Call Trace: > [ 2515.753010] [] xfs_buf_rele+0x2f2/0x380 [xfs] > [ 2515.753010] [] xfs_reclaim_inode+0x38d/0x3a0 [xfs] > [ 2515.753010] [] xfs_reclaim_inodes_ag+0x223/0x360 [xfs] > [ 2515.753010] [] ? try_to_wake_up+0x58/0x390 > [ 2515.753010] [] ? wake_up_process+0x15/0x20 > [ 2515.753010] [] xfs_reclaim_inodes_nr+0x33/0x40 [xfs] > [ 2515.753010] [] xfs_fs_free_cached_objects+0x19/0x20 [xfs] > [ 2515.753010] [] super_cache_scan+0x181/0x190 > [ 2515.753010] [] shrink_slab+0x237/0x400 > [ 2515.753010] [] shrink_node+0x303/0x310 > [ 2515.753010] [] kswapd+0x302/0x6f0 > [ 2515.753010] [] ? mem_cgroup_shrink_node+0x180/0x180 > [ 2515.753010] [] kthread+0xd8/0xf0 > [ 2515.753010] [] ret_from_fork+0x1f/0x40 > [ 2515.753010] [] ? kthread_park+0x60/0x60 > [ 2515.753010] Code: 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 f1 41 89 d0 48 c7 c6 30 69 18 a0 48 89 fa 31 c0 48 89 e5 31 ff e8 ae f8 ff ff <0f> 0b 66 90 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 > [ 2515.753010] RIP [] assfail+0x22/0x30 [xfs] > [ 2515.753010] RSP > [ 2515.773793] ---[ end trace d8064b1e521d0bfb ]--- > [ 2515.774123] Kernel panic - not syncing: Fatal exception > [ 2515.774534] Kernel Offset: disabled > [ 2515.774774] ---[ end Kernel panic - not syncing: Fatal exception > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+d7eafe90ba11a10ce864+4737+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 12 15:23:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2A2E67CA2 for ; Fri, 12 Aug 2016 15:23:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D702430404E for ; Fri, 12 Aug 2016 13:23:57 -0700 (PDT) X-ASG-Debug-ID: 1471033434-0bf57b369d66d640001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id SWS6aiK4xMYbcH8n (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 12 Aug 2016 13:23:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+d7eafe90ba11a10ce864+4737+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYIzg-0000eC-LT; Fri, 12 Aug 2016 20:23:52 +0000 Date: Fri, 12 Aug 2016 13:23:52 -0700 From: Christoph Hellwig To: Felix Janda Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE Message-ID: <20160812202352.GA2085@infradead.org> X-ASG-Orig-Subj: Re: [PATCH xfsprogs 01/14] configure: use AC_SYS_LARGEFILE References: <20160809073611.GC25647@infradead.org> <20160809174105.GA5907@nyan> <20160812025753.GD10701@infradead.org> <20160812165440.GA367@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160812165440.GA367@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471033435 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 916 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31968 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 12, 2016 at 06:54:40PM +0200, Felix Janda wrote: > glibc: since version 2.2 (2000) > uClibc: since version 0.9.11 (2002) > dietlibc: since version 0.8 (2001) > klibc: AFAICS since beginning only transparent LFS > musl: since beginning only transparent LFS > bionic: In 2015 _FILE_OFFSET_BITS was implemented "mostly"... > newlib: (except on cygwin) does not seem to have support for transparent LFS > > Note that LFS can be configured out of uClibc. However its headers > error out when it is configured out and an application sets > _FILE_OFFSET_BITS. (So in the case of xfsprogs it would have errored > out in this situation already earlier.) > > > So it seems that this patch series breaks newlib support... I think that's fine, newlib hasn't every really been a supported config. The point I tried to make is that we should aim to error out during ./configure for this case. From sandeen@redhat.com Fri Aug 12 18:07:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5DB287CA0 for ; Fri, 12 Aug 2016 18:07:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16ABF304048 for ; Fri, 12 Aug 2016 16:07:03 -0700 (PDT) X-ASG-Debug-ID: 1471043222-0bf8151be2e62a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NKKDqlHE6pyyka0f (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 16:07:02 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 01CBBC04B334 for ; Fri, 12 Aug 2016 23:07:02 +0000 (UTC) Received: from [IPv6:::1] (ovpn03.gateway.prod.ext.phx2.redhat.com [10.5.9.3]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7CN71Eu023955 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 12 Aug 2016 19:07:01 -0400 To: xfs-oss From: Eric Sandeen Subject: [PATCH] xfs_quota: wire up XFS_GETQSTATV Message-ID: X-ASG-Orig-Subj: [PATCH] xfs_quota: wire up XFS_GETQSTATV Date: Fri, 12 Aug 2016 18:07:00 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 12 Aug 2016 23:07:02 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471043222 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8037 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The new XFS_GETQSTATV quotactl, available since kernel v3.12, was never implemented in xfs_quota, and the "state" command continues to use XFS_GETQSTAT, which cannot report both group & project quota on newer formats. The new call has room for all 3 quota types (user, group, and quota), vs just two, where previously project and quota overlapped. So: First, try XFS_GETQSTATV. If it passes, we have all the information we need, and we print it. state_qfilestat() is modified to take the newer structure. If it fails, try XFS_GETQSTAT. If that passes, we are on an older kernel with neither XFS_GETQSTATV nor the on-disk project quota inode. We copy the available information into the newer statv structure, carefully determining wither group or project (or neither) is actually active, and print it with the same state_qfilestat routine. Signed-off-by: Eric Sandeen --- I probably could have done some memcpy()'s in state_stat_to_statv(), but opted for the explicit copy-out; the structures aren't identical, although the newer one only differs by padding on the end. If memcpy() is preferable I could send a V2... diff --git a/include/xqm.h b/include/xqm.h index c084b2d..78262c3 100644 --- a/include/xqm.h +++ b/include/xqm.h @@ -32,6 +32,7 @@ #define Q_XGETQSTAT XQM_CMD(5) /* get quota subsystem status */ #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */ #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */ +#define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */ #define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage */ /* @@ -149,4 +150,30 @@ typedef struct fs_quota_stat { __u16 qs_iwarnlimit; /* limit for num warnings */ } fs_quota_stat_t; +/* + * Some basic information about 'quota files' for Q_XGETQSTATV command + */ +struct fs_qfilestatv { + __u64 qfs_ino; /* inode number */ + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ + __u32 qfs_nextents; /* number of extents */ + __u32 qfs_pad; /* pad for 8-byte alignment */ +}; + +struct fs_quota_statv { + __s8 qs_version; /* version for future changes */ + __u8 qs_pad1; /* pad for 16bit alignment */ + __u16 qs_flags; /* FS_QUOTA_.* flags */ + __u32 qs_incoredqs; /* number of dquots incore */ + struct fs_qfilestatv qs_uquota; /* user quota information */ + struct fs_qfilestatv qs_gquota; /* group quota information */ + struct fs_qfilestatv qs_pquota; /* project quota information */ + __s32 qs_btimelimit; /* limit for blks timer */ + __s32 qs_itimelimit; /* limit for inodes timer */ + __s32 qs_rtbtimelimit;/* limit for rt blks timer */ + __u16 qs_bwarnlimit; /* limit for num warnings */ + __u16 qs_iwarnlimit; /* limit for num warnings */ + __u64 qs_pad2[8]; /* for future proofing */ +}; + #endif /* __XQM_H__ */ diff --git a/quota/linux.c b/quota/linux.c index 74dba01..4f1f3c4 100644 --- a/quota/linux.c +++ b/quota/linux.c @@ -55,6 +55,8 @@ xcommand_to_qcommand( return Q_XSETQLIM; case XFS_GETQSTAT: return Q_XGETQSTAT; + case XFS_GETQSTATV: + return Q_XGETQSTATV; case XFS_QUOTARM: return Q_XQUOTARM; case XFS_QSYNC: diff --git a/quota/state.c b/quota/state.c index 8186762..5d63579 100644 --- a/quota/state.c +++ b/quota/state.c @@ -111,12 +111,12 @@ remove_help(void) static void state_qfilestat( - FILE *fp, - fs_path_t *mount, - uint type, - fs_qfilestat_t *qfs, - int accounting, - int enforcing) + FILE *fp, + struct fs_path *mount, + uint type, + struct fs_qfilestatv *qfs, + int accounting, + int enforcing) { fprintf(fp, _("%s quota state on %s (%s)\n"), type_to_string(type), mount->fs_dir, mount->fs_name); @@ -142,39 +142,94 @@ state_timelimit( time_to_string(timelimit, VERBOSE_FLAG | ABSOLUTE_FLAG)); } +/* + * fs_quota_stat holds a subset of fs_quota_statv; this copies + * the smaller into the larger, leaving any not-present fields + * empty. This is so the same reporting function can be used + * for both XFS_GETQSTAT and XFS_GETQSTATV results. + */ static void -state_quotafile_mount( - FILE *fp, - uint type, - fs_path_t *mount, - uint flags) +state_stat_to_statv( + struct fs_quota_stat *s, + struct fs_quota_statv *sv) { - fs_quota_stat_t s; - char *dev = mount->fs_name; + memset(sv, 0, sizeof(struct fs_quota_statv)); + + /* shared information */ + sv->qs_version = s->qs_version; + sv->qs_flags = s->qs_flags; + sv->qs_incoredqs = s->qs_incoredqs; + sv->qs_btimelimit = s->qs_btimelimit; + sv->qs_itimelimit = s->qs_itimelimit; + sv->qs_rtbtimelimit = s->qs_rtbtimelimit; + sv->qs_bwarnlimit = s->qs_bwarnlimit; + sv->qs_iwarnlimit = s->qs_iwarnlimit; + + /* Always room for uquota */ + sv->qs_uquota.qfs_ino = s->qs_uquota.qfs_ino; + sv->qs_uquota.qfs_nblks = s->qs_uquota.qfs_nblks; + sv->qs_uquota.qfs_nextents = s->qs_uquota.qfs_nextents; + + /* + * If we are here, XFS_GETQSTATV failed and XFS_GETQSTAT passed; + * that is a very strong hint that we're on a kernel which predates + * the on-disk pquota inode; both were added in v3.12. So, we do + * some tricksy determination here. + * gs_gquota may hold either group quota inode info, or project + * quota if that is used instead; which one it actually holds depends + * on the quota flags. (If neither is set, neither is used) + */ + if (s->qs_flags & XFS_QUOTA_GDQ_ACCT) { + /* gs_gquota holds group quota info */ + sv->qs_gquota.qfs_ino = s->qs_gquota.qfs_ino; + sv->qs_gquota.qfs_nblks = s->qs_gquota.qfs_nblks; + sv->qs_gquota.qfs_nextents = s->qs_gquota.qfs_nextents; + } else if (s->qs_flags & XFS_QUOTA_PDQ_ACCT) { + /* gs_gquota actually holds project quota info */ + sv->qs_pquota.qfs_ino = s->qs_gquota.qfs_ino; + sv->qs_pquota.qfs_nblks = s->qs_gquota.qfs_nblks; + sv->qs_pquota.qfs_nextents = s->qs_gquota.qfs_nextents; + } +} - if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { - if (flags & VERBOSE_FLAG) - fprintf(fp, _("%s quota are not enabled on %s\n"), - type_to_string(type), dev); - return; +static void +state_quotafile_mount( + FILE *fp, + uint type, + struct fs_path *mount, + uint flags) +{ + struct fs_quota_stat s; + struct fs_quota_statv sv; + char *dev = mount->fs_name; + + if (xfsquotactl(XFS_GETQSTATV, dev, type, 0, (void *)&sv) < 0) { + if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { + if (flags & VERBOSE_FLAG) + fprintf(fp, + _("%s quota are not enabled on %s\n"), + type_to_string(type), dev); + return; + } + state_stat_to_statv(&s, &sv); } if (type & XFS_USER_QUOTA) - state_qfilestat(fp, mount, XFS_USER_QUOTA, &s.qs_uquota, - s.qs_flags & XFS_QUOTA_UDQ_ACCT, - s.qs_flags & XFS_QUOTA_UDQ_ENFD); + state_qfilestat(fp, mount, XFS_USER_QUOTA, &sv.qs_uquota, + sv.qs_flags & XFS_QUOTA_UDQ_ACCT, + sv.qs_flags & XFS_QUOTA_UDQ_ENFD); if (type & XFS_GROUP_QUOTA) - state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &s.qs_gquota, - s.qs_flags & XFS_QUOTA_GDQ_ACCT, - s.qs_flags & XFS_QUOTA_GDQ_ENFD); + state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &sv.qs_gquota, + sv.qs_flags & XFS_QUOTA_GDQ_ACCT, + sv.qs_flags & XFS_QUOTA_GDQ_ENFD); if (type & XFS_PROJ_QUOTA) - state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &s.qs_gquota, - s.qs_flags & XFS_QUOTA_PDQ_ACCT, - s.qs_flags & XFS_QUOTA_PDQ_ENFD); + state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &sv.qs_pquota, + sv.qs_flags & XFS_QUOTA_PDQ_ACCT, + sv.qs_flags & XFS_QUOTA_PDQ_ENFD); - state_timelimit(fp, XFS_BLOCK_QUOTA, s.qs_btimelimit); - state_timelimit(fp, XFS_INODE_QUOTA, s.qs_itimelimit); - state_timelimit(fp, XFS_RTBLOCK_QUOTA, s.qs_rtbtimelimit); + state_timelimit(fp, XFS_BLOCK_QUOTA, sv.qs_btimelimit); + state_timelimit(fp, XFS_INODE_QUOTA, sv.qs_itimelimit); + state_timelimit(fp, XFS_RTBLOCK_QUOTA, sv.qs_rtbtimelimit); } static void From sandeen@redhat.com Fri Aug 12 18:30:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 96AF27CA2 for ; Fri, 12 Aug 2016 18:30:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E547AC001 for ; Fri, 12 Aug 2016 16:30:06 -0700 (PDT) X-ASG-Debug-ID: 1471044604-0bf57c13675c35a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ScyCr2ECcGUX37JM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 16:30:05 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8005443A2C for ; Fri, 12 Aug 2016 23:30:04 +0000 (UTC) Received: from [IPv6:::1] (ovpn03.gateway.prod.ext.phx2.redhat.com [10.5.9.3]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7CNU3YF019073 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 12 Aug 2016 19:30:04 -0400 To: xfs-oss From: Eric Sandeen Subject: [PATCH V4] xfs_db: add crc manipulation commands Message-ID: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> X-ASG-Orig-Subj: [PATCH V4] xfs_db: add crc manipulation commands Date: Fri, 12 Aug 2016 18:30:03 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 12 Aug 2016 23:30:04 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471044605 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6637 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This adds a new "crc" command to xfs_db for CRC-enabled filesystems. If a structure has a CRC field, we can validate it, invalidate/corrupt it, or revalidate/rewrite it: xfs_db> sb 0 xfs_db> crc -v crc = 0x796c814f (correct) xfs_db> crc -i Metadata CRC error detected at block 0x0/0x200 crc = 0x796c8150 (bad) xfs_db> crc -r crc = 0x796c814f (correct) (-i and -r require "expert" write-capable mode) This requires temporarily replacing the write verifier with a dummy which won't recalculate the CRC on the way to disk. It also required me to write a new flist function, which is totally foreign to me, so hopefully done right - but it seems to work here. Signed-off-by: Eric Sandeen --- I found this very useful when working with a filesystem image which was consistent except for a corrupt CRC; the ability to rewrite the correct CRCs and run repair to validate the fs was very handy... V2: Fix whitespace damage, clarify write_cur() changes a bit w/ code & comments. V3: Be a bit more verbose with command output V4: Rebase patch to current tree diff --git a/db/Makefile b/db/Makefile index 8260da3..ba4b1a8 100644 --- a/db/Makefile +++ b/db/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND = xfs_db HFILES = addr.h agf.h agfl.h agi.h attr.h attrshort.h bit.h block.h bmap.h \ - btblock.h bmroot.h check.h command.h convert.h debug.h \ + btblock.h bmroot.h check.h command.h convert.h crc.h debug.h \ dir2.h dir2sf.h dquot.h echo.h faddr.h field.h \ flist.h fprint.h frag.h freesp.h hash.h help.h init.h inode.h input.h \ io.h logformat.h malloc.h metadump.h output.h print.h quit.h sb.h \ diff --git a/db/command.c b/db/command.c index 3c17a1e..1848d64 100644 --- a/db/command.c +++ b/db/command.c @@ -49,6 +49,7 @@ #include "write.h" #include "malloc.h" #include "dquot.h" +#include "crc.h" cmdinfo_t *cmdtab; int ncmds; @@ -124,6 +125,7 @@ init_commands(void) bmap_init(); check_init(); convert_init(); + crc_init(); debug_init(); echo_init(); frag_init(); diff --git a/db/flist.c b/db/flist.c index 84065a2..2530baf 100644 --- a/db/flist.c +++ b/db/flist.c @@ -411,6 +411,40 @@ flist_split( return v; } +/* + * Given a set of fields, scan for a field of the given type. + * Return an flist leading to the first found field + * of that type. + * Return NULL if no field of the given type is found. + */ +flist_t * +flist_find_ftyp( + const field_t *fields, + fldt_t type) +{ + flist_t *fl; + const field_t *f; + const ftattr_t *fa; + + for (f = fields; f->name; f++) { + fl = flist_make(f->name); + fl->fld = f; + if (f->ftyp == type) + return fl; + fa = &ftattrtab[f->ftyp]; + if (fa->subfld) { + flist_t *nfl; + nfl = flist_find_ftyp(fa->subfld, type); + if (nfl) { + fl->child = nfl; + return fl; + } + } + flist_free(fl); + } + return NULL; +} + static void ftok_free( ftok_t *ft) diff --git a/db/flist.h b/db/flist.h index 5c9fba0..3f4b312 100644 --- a/db/flist.h +++ b/db/flist.h @@ -37,3 +37,4 @@ extern int flist_parse(const struct field *fields, flist_t *fl, void *obj, int startoff); extern void flist_print(flist_t *fl); extern flist_t *flist_scan(char *name); +extern flist_t *flist_find_ftyp(const field_t *fields, fldt_t type); diff --git a/db/io.c b/db/io.c index 91cab12..56b4414 100644 --- a/db/io.c +++ b/db/io.c @@ -27,6 +27,7 @@ #include "output.h" #include "init.h" #include "malloc.h" +#include "crc.h" static int pop_f(int argc, char **argv); static void pop_help(void); @@ -473,12 +474,14 @@ xfs_verify_recalc_crc( void write_cur(void) { + int skip_crc = (iocur_top->bp->b_ops->verify_write == xfs_dummy_verify); + if (iocur_sp < 0) { dbprintf(_("nothing to write\n")); return; } - if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf) { + if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf && !skip_crc) { libxfs_dinode_calc_crc(mp, iocur_top->data); iocur_top->ino_crc_ok = 1; } @@ -489,6 +492,19 @@ write_cur(void) write_cur_bbs(); else write_cur_buf(); + + /* If we didn't write the crc automatically, re-check validity */ + if (iocur_top->ino_buf && skip_crc) { + xfs_dinode_t *dip; + xfs_ino_t ino; + + dip = iocur_top->data; + ino = iocur_top->ino; + iocur_top->ino_crc_ok = xfs_verify_cksum((char *)dip, + mp->m_sb.sb_inodesize, + XFS_DINODE_CRC_OFF); + } + } void diff --git a/db/write.h b/db/write.h index 31e2665..664ddcc 100644 --- a/db/write.h +++ b/db/write.h @@ -20,5 +20,5 @@ struct field; extern void write_init(void); extern void write_block(const field_t *fields, int argc, char **argv); -extern void write_string(const field_t *fields, int argc, char **argv); extern void write_struct(const field_t *fields, int argc, char **argv); +extern void write_string(const field_t *fields, int argc, char **argv); diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index ff8f862..894a94e 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -87,16 +87,14 @@ or .I filename read-only. This option is required if the filesystem is mounted. It is only necessary to omit this flag if a command that changes data -.RB ( write ", " blocktrash ) +.RB ( write ", " blocktrash ", " crc ) is to be used. .TP .B \-x Specifies expert mode. This enables the -.B write -and -.B blocktrash -commands. +.RB ( write ", " blocktrash ", " crc +invalidate/revalidate) commands. .TP .B \-V Prints the version number and exits. @@ -422,6 +420,25 @@ conversions such as .I agb .BR fsblock . .TP +.B crc [\-i|\-r|\-v] +Invalidates, revalidates, or validates the CRC (checksum) +field of the current structure, if it has one. +This command is available only on CRC-enabled filesystems. +With no argument, validation is performed. +Each command will display the resulting CRC value and state. +.RS 1.0i +.TP 0.4i +.B \-i +Invalidate the structure's CRC value (incrementing it by one), +and write it to disk. +.TP +.B \-r +Recalculate the current structure's correct CRC value, and write it to disk. +.TP +.B \-v +Validate and display the current value and state of the structure's CRC. +.RE +.TP .BI "daddr [" d ] Set current address to the daddr (512 byte block) given by .IR d . From eguan@redhat.com Sat Aug 13 01:51:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3F3627CA0 for ; Sat, 13 Aug 2016 01:51:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B013DAC002 for ; Fri, 12 Aug 2016 23:50:59 -0700 (PDT) X-ASG-Debug-ID: 1471071058-0bf8151be1f1040001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TnLU2nT6sKxHRzDS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 12 Aug 2016 23:50:58 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0F63467325 for ; Sat, 13 Aug 2016 06:50:58 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7D6ouNj013200; Sat, 13 Aug 2016 02:50:57 -0400 Date: Sat, 13 Aug 2016 14:50:56 +0800 From: Eryu Guan To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 on 4.8-rc1 kernel Message-ID: <20160813065056.GX27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 on 4.8-rc1 kernel References: <20160812140414.GV27776@eguan.usersys.redhat.com> <20160812144752.GW27776@eguan.usersys.redhat.com> <20160812170714.GA64450@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160812170714.GA64450@bfoster.bfoster> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Sat, 13 Aug 2016 06:50:58 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471071058 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1334 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 12, 2016 at 01:07:15PM -0400, Brian Foster wrote: > On Fri, Aug 12, 2016 at 10:47:52PM +0800, Eryu Guan wrote: > > On Fri, Aug 12, 2016 at 10:04:14PM +0800, Eryu Guan wrote: > > > Hi, > > > > > > I hit oops while building kernel on XFS, 4.8-rc1 kernel, hit twice in > > > six kernel builds. I'm not sure if it's a regression since 4.7 kernel > > > yet, will do more testings. > > > > Just hit again on 4.8-rc1 kernel, I was doing > > > > # clean partial builds from previous run and build again > > make clean > > make -j 8 > > > > Seems I have to do kernel build on 4.7 kernel to finish the bisect. > > > > Thanks, > > Eryu > > > > [ 2515.752039] XFS: Assertion failed: bp->b_flags & XBF_ASYNC, file: fs/xfs/xfs_buf.c, line: 118 > > This is commit 9c7504aa7 ("xfs: track and serialize in-flight async > buffers against unmount"). The assert is actually incorrect, as Dave had > previously pointed out[1]. A patch was posted[2] to fix it, but hasn't > been merged yet. > > Brian > > [1] http://oss.sgi.com/pipermail/xfs/2016-August/050613.html > [2] http://oss.sgi.com/pipermail/xfs/2016-August/050634.html Thanks for the reminder, I had impression of this thread and patch, but didn't realize I was hitting the same problem. I don't have to do bisect then :) Thanks, Eryu From eguan@redhat.com Sat Aug 13 02:38:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6BDB97CA2 for ; Sat, 13 Aug 2016 02:38:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2F59B304043 for ; Sat, 13 Aug 2016 00:38:45 -0700 (PDT) X-ASG-Debug-ID: 1471073920-0bf57b369e67a4a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MTXRECtbqQCXadqe (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 00:38:41 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 84A734E335 for ; Sat, 13 Aug 2016 07:38:40 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7D7cd6E031311 for ; Sat, 13 Aug 2016 03:38:40 -0400 Date: Sat, 13 Aug 2016 15:38:39 +0800 From: Eryu Guan To: xfs@oss.sgi.com Subject: generic/224 triggers infinite "page discard on page xxx" on 512 block size XFS with 4.8-rc1 kernel Message-ID: <20160813073839.GY27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: generic/224 triggers infinite "page discard on page xxx" on 512 block size XFS with 4.8-rc1 kernel MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Sat, 13 Aug 2016 07:38:40 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471073921 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2085 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, I've hit generic/224 flooding dmesg on 512 block size XFS, 4.8-rc1 kernel, with the following message: ... [ 98.146091] XFS (sda6): page discard on page ffffea0002f7e780, inode 0xe3a87, offset 1085214720. [ 98.147431] XFS (sda6): page discard on page ffffea00023c3800, inode 0xe3a87, offset 1085218816. [ 98.148743] XFS (sda6): page discard on page ffffea0002247700, inode 0xe3a87, offset 1085222912. [ 98.150136] XFS (sda6): page discard on page ffffea0002f8d000, inode 0xe3a87, offset 1085227008. [ 98.151496] XFS (sda6): page discard on page ffffea0002c58840, inode 0xe3a87, offset 1085231104. [ 98.152794] XFS (sda6): page discard on page ffffea0002e65340, inode 0xe3a87, offset 1085235200. ... The inode number is always the same, only the page address and offset are changing. This is triggered by this dd command in generic/224: dd if=/dev/zero of=$SCRATCH_MNT/testfile.$i bs=4k conv=notrunc and it won't return until you kill it. With 4.7 kernel I can see similar messages in dmesg, but only a few lines are printed on different inodes, I don't see this infinite loop on same inode. And I bisected to this commit: commit 68a9f5e7007c1afa2cf6830b690a90d0187c0684 Author: Christoph Hellwig Date: Tue Jun 21 09:53:44 2016 +1000 xfs: implement iomap based buffered write path Convert XFS to use the new iomap based multipage write path. This involves implementing the ->iomap_begin and ->iomap_end methods, and switching the buffered file write, page_mkwrite and xfs_iozero paths to the new iomap helpers. With this change __xfs_get_blocks will never be used for buffered writes, and the code handling them can be removed. Based on earlier code from Dave Chinner. Signed-off-by: Christoph Hellwig Reviewed-by: Bob Peterson Signed-off-by: Dave Chinner I was testing on x86_64 kvm guest with 8G memory and 4vcpus. If more information is needed please let me know. Thanks, Eryu From felix.janda@posteo.de Sat Aug 13 12:24:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E41187CA0 for ; Sat, 13 Aug 2016 12:24:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5133304051 for ; Sat, 13 Aug 2016 10:24:32 -0700 (PDT) X-ASG-Debug-ID: 1471109062-0bf57c13675d7bc0001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id cORfdHBu2T6d0gYK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:24:24 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 8A9F8209F3 for ; Sat, 13 Aug 2016 19:24:22 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTBs5FbKz104L for ; Sat, 13 Aug 2016 19:24:21 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:23:24 +0200 Resent-Message-ID: <20160813172324.GA3830@nyan> Resent-To: xfs@oss.sgi.com Message-Id: From: Felix Janda Date: Sat, 13 Aug 2016 19:04:18 +0200 Subject: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109064 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3209 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This patch series does several things related to large file support. Patches 1-3 enable transparent LFS in the build system and make it mandatory. Patches 4-9 and 12 replace *64 function and structure aliases. Patches 10 and 11 disable fsr on Mac OS X and do cleanup to enable Patch 12. Further cleanup of the portability code is possible later. Patch 13 makes tranparent LFS also mandatory for all users of libxfs. Patch 14 finally replaces off64_t by off_t. In comparison to v1: Patches 1, 3 and 14 are identical to previous patches. Patches 4-8 are identical to previous patches, except that some of them are merged. Patch 9 was previously send separately from the patch series. Patch 13 is identical to a previous patch except for the commit message. The other patches are new, grown out of review by Christoph Hellwig. Felix Janda (14): configure: use AC_SYS_LARGEFILE configure: error out when LFS does not work remove unecessary definitions of _FILE_OFFSET_BITS replace [fl]stat64 by equivalent [fl]stat replace ftruncate64 by equivalent ftruncate replace lseek64 by equivalent lseek replace pread64/pwrite64 by equivalent pread/pwrite replace sendfile64 by equivalent sendfile fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise Makefile: disable fsr for Mac OS X fsr: remove workaround for statvfs on Mac OS X replace statvfs64 by equivalent statvfs xfs.h: require transparent LFS for all users platform: remove use of off64_t Makefile | 6 ++++- configure.ac | 3 +++ copy/xfs_copy.c | 22 ++++++++--------- fsr/xfs_fsr.c | 62 +++++++++++++++++++++-------------------------- include/builddefs.in | 2 +- include/darwin.h | 9 ------- include/freebsd.h | 7 ------ include/irix.h | 2 +- include/linux.h | 2 +- include/xfs.h | 5 ++++ io/copy_file_range.c | 10 ++++---- io/fadvise.c | 2 +- io/open.c | 18 +++++++------- io/pread.c | 16 ++++++------ io/pwrite.c | 10 ++++---- io/seek.c | 6 ++--- io/sendfile.c | 10 ++++---- io/truncate.c | 2 +- libxcmd/paths.c | 4 +-- libxfs/darwin.c | 8 +++--- libxfs/freebsd.c | 8 +++--- libxfs/init.c | 12 ++++----- libxfs/init.h | 6 ++--- libxfs/irix.c | 8 +++--- libxfs/linux.c | 20 +++++++-------- libxfs/rdwr.c | 10 ++++---- logprint/log_misc.c | 4 +-- logprint/logprint.c | 2 +- m4/package_libcdev.m4 | 25 ++++++++++++------- mdrestore/xfs_mdrestore.c | 12 ++++----- mkfs/proto.c | 4 +-- mkfs/xfs_mkfs.c | 8 +++--- po/de.po | 28 ++++++++++----------- po/pl.po | 32 ++++++++++++------------ repair/prefetch.c | 2 +- repair/sb.c | 6 ++--- repair/xfs_repair.c | 4 +-- rtcp/xfs_rtcp.c | 18 +++++++------- 38 files changed, 205 insertions(+), 210 deletions(-) -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:24:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0201B7CA4 for ; Sat, 13 Aug 2016 12:24:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B8B9B8F8039 for ; Sat, 13 Aug 2016 10:24:38 -0700 (PDT) X-ASG-Debug-ID: 1471109072-0bf8151be3100f20001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id Uur7patVciFhuI7l (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:24:35 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 0A2CD2097C for ; Sat, 13 Aug 2016 19:24:32 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTC33gwhz1048 for ; Sat, 13 Aug 2016 19:24:31 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:23:34 +0200 Resent-Message-ID: <20160813172334.GB3830@nyan> Resent-To: xfs@oss.sgi.com Message-Id: In-Reply-To: References: From: Felix Janda Date: Sun, 7 Aug 2016 07:21:20 +0200 Subject: [PATCHv2 xfsprogs 01/14] configure: use AC_SYS_LARGEFILE To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 01/14] configure: use AC_SYS_LARGEFILE X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109074 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 601 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The autoconf macro AC_SYS_LARGEFILE defines _FILE_OFFSET_BITS=64 where necessary to ensure that off_t and all interfaces using off_t are 64bit, even on 32bit systems. Signed-off-by: Felix Janda --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index 1bb5fef..8fa96a5 100644 --- a/configure.ac +++ b/configure.ac @@ -107,6 +107,8 @@ AC_PACKAGE_UTILITIES(xfsprogs) AC_MULTILIB($enable_lib64) AC_RT($enable_librt) +AC_SYS_LARGEFILE + AC_PACKAGE_NEED_UUID_H AC_PACKAGE_NEED_UUIDCOMPARE -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E1C6C7CA0 for ; Sat, 13 Aug 2016 12:25:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 89466304043 for ; Sat, 13 Aug 2016 10:25:28 -0700 (PDT) X-ASG-Debug-ID: 1471109125-0bf8151be2101040001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id I2XPcxEQvR2MS9So (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:26 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 47C0520449 for ; Sat, 13 Aug 2016 19:25:25 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTD45J7lz104L for ; Sat, 13 Aug 2016 19:25:24 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:28 +0200 Resent-Message-ID: <20160813172428.GA3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <3dc24ff681ee0f831f2902bdb800547f0b63a30e.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sun, 7 Aug 2016 07:28:16 +0200 Subject: [PATCHv2 xfsprogs 03/14] remove unecessary definitions of _FILE_OFFSET_BITS To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 03/14] remove unecessary definitions of _FILE_OFFSET_BITS X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109126 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2970 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- now that we use AC_SYS_LARGEFILE, there is no need to explicitly define _FILE_OFFSET_BITS. Signed-off-by: Felix Janda --- include/builddefs.in | 2 +- m4/package_libcdev.m4 | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/include/builddefs.in b/include/builddefs.in index 7153d7a..d406615 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -114,7 +114,7 @@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl ifeq ($(PKG_PLATFORM),linux) -PCFLAGS = -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 $(GCCFLAGS) +PCFLAGS = -D_GNU_SOURCE $(GCCFLAGS) ifeq ($(HAVE_UMODE_T),yes) PCFLAGS += -DHAVE_UMODE_T endif diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 6c94475..0999c8b 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -5,7 +5,6 @@ AC_DEFUN([AC_HAVE_FADVISE], [ AC_MSG_CHECKING([for fadvise ]) AC_TRY_COMPILE([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ posix_fadvise(0, 1, 0, POSIX_FADV_NORMAL); @@ -22,7 +21,6 @@ AC_DEFUN([AC_HAVE_MADVISE], [ AC_MSG_CHECKING([for madvise ]) AC_TRY_COMPILE([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ posix_madvise(0, 0, MADV_NORMAL); @@ -39,7 +37,6 @@ AC_DEFUN([AC_HAVE_MINCORE], [ AC_MSG_CHECKING([for mincore ]) AC_TRY_COMPILE([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ mincore(0, 0, 0); @@ -56,7 +53,6 @@ AC_DEFUN([AC_HAVE_SENDFILE], [ AC_MSG_CHECKING([for sendfile ]) AC_TRY_COMPILE([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ sendfile(0, 0, 0, 0); @@ -106,7 +102,6 @@ AC_DEFUN([AC_HAVE_FALLOCATE], [ AC_MSG_CHECKING([for fallocate]) AC_TRY_LINK([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include #include ], [ @@ -124,7 +119,6 @@ AC_DEFUN([AC_HAVE_FIEMAP], [ AC_MSG_CHECKING([for fiemap]) AC_TRY_LINK([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include #include ], [ @@ -142,7 +136,6 @@ AC_DEFUN([AC_HAVE_FIEMAP], AC_DEFUN([AC_HAVE_PREADV], [ AC_MSG_CHECKING([for preadv]) AC_TRY_LINK([ -#define _FILE_OFFSET_BITS 64 #define _BSD_SOURCE #include ], [ @@ -177,7 +170,6 @@ AC_DEFUN([AC_HAVE_SYNC_FILE_RANGE], [ AC_MSG_CHECKING([for sync_file_range]) AC_TRY_LINK([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ sync_file_range(0, 0, 0, 0); @@ -194,7 +186,6 @@ AC_DEFUN([AC_HAVE_SYNCFS], [ AC_MSG_CHECKING([for syncfs]) AC_TRY_LINK([ #define _GNU_SOURCE -#define _FILE_OFFSET_BITS 64 #include ], [ syncfs(0); -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9DAE47CA0 for ; Sat, 13 Aug 2016 12:25:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22A9FAC002 for ; Sat, 13 Aug 2016 10:25:35 -0700 (PDT) X-ASG-Debug-ID: 1471109130-0bf8151be4101050001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id 5TgPS9lgydrLE2Zj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:31 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id D517320449 for ; Sat, 13 Aug 2016 19:25:29 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTD86rrKz1048 for ; Sat, 13 Aug 2016 19:25:28 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:32 +0200 Resent-Message-ID: <20160813172432.GB3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:43 +0200 Subject: [PATCHv2 xfsprogs 04/14] replace [fl]stat64 by equivalent [fl]stat To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 04/14] replace [fl]stat64 by equivalent [fl]stat X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109130 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 22890 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Felix Janda --- copy/xfs_copy.c | 8 ++++---- fsr/xfs_fsr.c | 34 +++++++++++++++++----------------- include/darwin.h | 5 +---- include/freebsd.h | 2 -- io/copy_file_range.c | 6 +++--- io/open.c | 18 +++++++++--------- io/sendfile.c | 6 +++--- libxcmd/paths.c | 4 ++-- libxfs/darwin.c | 8 ++++---- libxfs/freebsd.c | 8 ++++---- libxfs/init.c | 12 ++++++------ libxfs/init.h | 6 +++--- libxfs/irix.c | 8 ++++---- libxfs/linux.c | 20 ++++++++++---------- mdrestore/xfs_mdrestore.c | 6 +++--- mkfs/proto.c | 4 ++-- mkfs/xfs_mkfs.c | 4 ++-- po/de.po | 8 ++++---- po/pl.po | 8 ++++---- repair/xfs_repair.c | 4 ++-- rtcp/xfs_rtcp.c | 18 +++++++++--------- 21 files changed, 96 insertions(+), 101 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 3c8998c..55a9e2c 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -28,7 +28,7 @@ #define rounddown(x, y) (((x)/(y))*(y)) #define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) -extern int platform_check_ismounted(char *, char *, struct stat64 *, int); +extern int platform_check_ismounted(char *, char *, struct stat *, int); int logfd; char *logfile_name; @@ -560,7 +560,7 @@ main(int argc, char **argv) extern int optind; libxfs_init_t xargs; thread_args *tcarg; - struct stat64 statbuf; + struct stat statbuf; progname = basename(argv[0]); @@ -641,7 +641,7 @@ main(int argc, char **argv) die_perror(); } - if (fstat64(source_fd, &statbuf) < 0) { + if (fstat(source_fd, &statbuf) < 0) { do_log(_("%s: couldn't stat source \"%s\"\n"), progname, source_name); die_perror(); @@ -792,7 +792,7 @@ main(int argc, char **argv) for (i = 0; i < num_targets; i++) { int write_last_block = 0; - if (stat64(target[i].name, &statbuf) < 0) { + if (stat(target[i].name, &statbuf) < 0) { /* ok, assume it's a file and create it */ do_out(_("Creating file %s\n"), target[i].name); diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index d75990a..36e0705 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -174,12 +174,12 @@ aborter(int unused) * of that. */ static char * -find_mountpoint_check(struct stat64 *sb, struct mntent *t) +find_mountpoint_check(struct stat *sb, struct mntent *t) { - struct stat64 ms; + struct stat ms; if (S_ISDIR(sb->st_mode)) { /* mount point */ - if (stat64(t->mnt_dir, &ms) < 0) + if (stat(t->mnt_dir, &ms) < 0) return NULL; if (sb->st_ino != ms.st_ino) return NULL; @@ -188,7 +188,7 @@ find_mountpoint_check(struct stat64 *sb, struct mntent *t) if (strcmp(t->mnt_type, MNTTYPE_XFS) != 0) return NULL; } else { /* device */ - if (stat64(t->mnt_fsname, &ms) < 0) + if (stat(t->mnt_fsname, &ms) < 0) return NULL; if (sb->st_rdev != ms.st_rdev) return NULL; @@ -198,7 +198,7 @@ find_mountpoint_check(struct stat64 *sb, struct mntent *t) * Make sure the mountpoint given by mtab is accessible * before using it. */ - if (stat64(t->mnt_dir, &ms) < 0) + if (stat(t->mnt_dir, &ms) < 0) return NULL; } @@ -206,7 +206,7 @@ find_mountpoint_check(struct stat64 *sb, struct mntent *t) } static char * -find_mountpoint(char *mtab, char *argname, struct stat64 *sb) +find_mountpoint(char *mtab, char *argname, struct stat *sb) { struct mntent_cursor cursor; struct mntent *t = NULL; @@ -230,7 +230,7 @@ find_mountpoint(char *mtab, char *argname, struct stat64 *sb) int main(int argc, char **argv) { - struct stat64 sb; + struct stat sb; char *argname; int c; char *mntp; @@ -327,7 +327,7 @@ main(int argc, char **argv) for (; optind < argc; optind++) { argname = argv[optind]; - if (lstat64(argname, &sb) < 0) { + if (lstat(argname, &sb) < 0) { fprintf(stderr, _("%s: could not stat: %s: %s\n"), progname, argname, strerror(errno)); @@ -335,9 +335,9 @@ main(int argc, char **argv) } if (S_ISLNK(sb.st_mode)) { - struct stat64 sb2; + struct stat sb2; - if (stat64(argname, &sb2) == 0 && + if (stat(argname, &sb2) == 0 && (S_ISBLK(sb2.st_mode) || S_ISCHR(sb2.st_mode))) sb = sb2; @@ -405,7 +405,7 @@ initallfs(char *mtab) struct mntent *mnt= NULL; int mi; char *cp; - struct stat64 sb; + struct stat sb; /* malloc a number of descriptors, increased later if needed */ if (!(fsbase = (fsdesc_t *)malloc(fsbufsize * sizeof(fsdesc_t)))) { @@ -427,7 +427,7 @@ initallfs(char *mtab) int rw = 0; if (strcmp(mnt->mnt_type, MNTTYPE_XFS ) != 0 || - stat64(mnt->mnt_fsname, &sb) == -1 || + stat(mnt->mnt_fsname, &sb) == -1 || !S_ISBLK(sb.st_mode)) continue; @@ -502,7 +502,7 @@ fsrallfs(char *mtab, int howlong, char *leftofffile) char *ptr; xfs_ino_t startino = 0; fsdesc_t *fsp; - struct stat64 sb, sb2; + struct stat sb, sb2; fsrprintf("xfs_fsr -m %s -t %d -f %s ...\n", mtab, howlong, leftofffile); @@ -510,11 +510,11 @@ fsrallfs(char *mtab, int howlong, char *leftofffile) fs = fsbase; /* where'd we leave off last time? */ - if (lstat64(leftofffile, &sb) == 0) { + if (lstat(leftofffile, &sb) == 0) { if ( (fd = open(leftofffile, O_RDONLY)) == -1 ) { fsrprintf(_("%s: open failed\n"), leftofffile); } - else if ( fstat64(fd, &sb2) == 0) { + else if ( fstat(fd, &sb2) == 0) { /* * Verify that lstat & fstat point to the * same regular file (no links/no quick spoofs) @@ -1027,7 +1027,7 @@ fsr_setup_attr_fork( xfs_bstat_t *bstatp) { #ifdef HAVE_FSETXATTR - struct stat64 tstatbuf; + struct stat tstatbuf; int i; int diff = 0; int last_forkoff = 0; @@ -1054,7 +1054,7 @@ fsr_setup_attr_fork( /* attr2 w/ fork offsets */ - if (fstat64(tfd, &tstatbuf) < 0) { + if (fstat(tfd, &tstatbuf) < 0) { fsrprintf(_("unable to stat temp file: %s\n"), strerror(errno)); return -1; diff --git a/include/darwin.h b/include/darwin.h index 45e0c03..8708324 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,8 +141,6 @@ typedef u_int64_t xfs_ino_t; typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; -#define stat64 stat -#define fstat64 fstat #define lseek64 lseek #define pread64 pread #define pwrite64 pwrite @@ -222,8 +220,7 @@ static inline int timer_gettime (timer_t timerid, struct itimerspec *value) # include #include #include -#define statvfs64 statfs -#define lstat64 lstat +#define statvfs64 statfs #define _PATH_MOUNTED "/etc/mtab" struct mntent diff --git a/include/freebsd.h b/include/freebsd.h index 6e77427..f7ab8fa 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -34,10 +34,8 @@ #define __LITTLE_ENDIAN LITTLE_ENDIAN /* FreeBSD file API is 64-bit aware */ -#define fstat64 fstat #define ftruncate64 ftruncate #define lseek64 lseek -#define stat64 stat #define pwrite64 pwrite #define pread64 pread #define fdatasync fsync diff --git a/io/copy_file_range.c b/io/copy_file_range.c index eddc634..7ba42b6 100644 --- a/io/copy_file_range.c +++ b/io/copy_file_range.c @@ -60,10 +60,10 @@ copy_file_range(int fd, loff_t *src, loff_t *dst, size_t len) static off64_t copy_src_filesize(int fd) { - struct stat64 st; + struct stat st; - if (fstat64(fd, &st) < 0) { - perror("fstat64"); + if (fstat(fd, &st) < 0) { + perror("fstat"); return -1; }; return st.st_size; diff --git a/io/open.c b/io/open.c index 2303527..d4ec13c 100644 --- a/io/open.c +++ b/io/open.c @@ -52,10 +52,10 @@ static long extsize; off64_t filesize(void) { - struct stat64 st; + struct stat st; - if (fstat64(file->fd, &st) < 0) { - perror("fstat64"); + if (fstat(file->fd, &st) < 0) { + perror("fstat"); return -1; } return st.st_size; @@ -90,7 +90,7 @@ stat_f( { struct dioattr dio; struct fsxattr fsx, fsxa; - struct stat64 st; + struct stat st; int verbose = (argc == 2 && !strcmp(argv[1], "-v")); printf(_("fd.path = \"%s\"\n"), file->name); @@ -102,8 +102,8 @@ stat_f( file->flags & IO_APPEND ? _(",append-only") : "", file->flags & IO_NONBLOCK ? _(",non-block") : "", file->flags & IO_TMPFILE ? _(",tmpfile") : ""); - if (fstat64(file->fd, &st) < 0) { - perror("fstat64"); + if (fstat(file->fd, &st) < 0) { + perror("fstat"); } else { printf(_("stat.ino = %lld\n"), (long long)st.st_ino); printf(_("stat.type = %s\n"), filetype(st.st_mode)); @@ -574,10 +574,10 @@ static int set_extsize(const char *path, int fd, long extsz) { struct fsxattr fsx; - struct stat64 stat; + struct stat stat; - if (fstat64(fd, &stat) < 0) { - perror("fstat64"); + if (fstat(fd, &stat) < 0) { + perror("fstat"); return 0; } if ((xfsctl(path, fd, FS_IOC_FSGETXATTR, &fsx)) < 0) { diff --git a/io/sendfile.c b/io/sendfile.c index 21ab444..c082acf 100644 --- a/io/sendfile.c +++ b/io/sendfile.c @@ -133,10 +133,10 @@ sendfile_f( goto done; } } else { - struct stat64 stat; + struct stat stat; - if (fstat64(fd, &stat) < 0) { - perror("fstat64"); + if (fstat(fd, &stat) < 0) { + perror("fstat"); goto done; } count = stat.st_size; diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 71af25f..bd91ae0 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -43,9 +43,9 @@ fs_device_number( const char *name, dev_t *devnum) { - struct stat64 sbuf; + struct stat sbuf; - if (stat64(name, &sbuf) < 0) + if (stat(name, &sbuf) < 0) return errno; /* * We want to match st_rdev if the path provided is a device diff --git a/libxfs/darwin.c b/libxfs/darwin.c index 017e190..bc552ba 100644 --- a/libxfs/darwin.c +++ b/libxfs/darwin.c @@ -27,13 +27,13 @@ int platform_has_uuid = 1; extern char *progname; int -platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) +platform_check_ismounted(char *name, char *block, struct stat *s, int verbose) { return 0; } int -platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) +platform_check_iswritable(char *name, char *block, struct stat *s, int fatal) { int fd, writable; @@ -69,9 +69,9 @@ void platform_findsizes(char *path, int fd, long long *sz, int *bsz) { __uint64_t size; - struct stat64 st; + struct stat st; - if (fstat64(fd, &st) < 0) { + if (fstat(fd, &st) < 0) { fprintf(stderr, _("%s: cannot stat the device file \"%s\": %s\n"), progname, path, strerror(errno)); diff --git a/libxfs/freebsd.c b/libxfs/freebsd.c index 6c9f089..1f1b5b9 100644 --- a/libxfs/freebsd.c +++ b/libxfs/freebsd.c @@ -27,14 +27,14 @@ int platform_has_uuid = 1; extern char *progname; int -platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) +platform_check_ismounted(char *name, char *block, struct stat *s, int verbose) { - struct stat64 st; + struct stat st; int cnt, i; struct statfs *fsinfo; if (!s) { - if (stat64(block, &st) < 0) + if (stat(block, &st) < 0) return 0; s = &st; } @@ -66,7 +66,7 @@ platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) } int -platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) +platform_check_iswritable(char *name, char *block, struct stat *s, int fatal) { int cnt, i; struct statfs *fsinfo; diff --git a/libxfs/init.c b/libxfs/init.c index e04b6e0..2057320 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -65,9 +65,9 @@ static struct dev_to_fd { static int check_isactive(char *name, char *block, int fatal) { - struct stat64 st; + struct stat st; - if (stat64(block, &st) < 0) + if (stat(block, &st) < 0) return 0; if ((st.st_mode & S_IFMT) != S_IFBLK) return 0; @@ -104,7 +104,7 @@ libxfs_device_open(char *path, int creat, int xflags, int setblksize) dev_t dev; int fd, d, flags; int readonly, dio, excl; - struct stat64 statb; + struct stat statb; readonly = (xflags & LIBXFS_ISREADONLY); excl = (xflags & LIBXFS_EXCLUSIVELY) && !creat; @@ -124,7 +124,7 @@ retry: exit(1); } - if (fstat64(fd, &statb) < 0) { + if (fstat(fd, &statb) < 0) { fprintf(stderr, _("%s: cannot stat %s: %s\n"), progname, path, strerror(errno)); exit(1); @@ -199,9 +199,9 @@ check_open(char *path, int flags, char **rawfile, char **blockfile) int readonly = (flags & LIBXFS_ISREADONLY); int inactive = (flags & LIBXFS_ISINACTIVE); int dangerously = (flags & LIBXFS_DANGEROUSLY); - struct stat64 stbuf; + struct stat stbuf; - if (stat64(path, &stbuf) < 0) { + if (stat(path, &stbuf) < 0) { perror(path); return 0; } diff --git a/libxfs/init.h b/libxfs/init.h index 112febb..baf2f68 100644 --- a/libxfs/init.h +++ b/libxfs/init.h @@ -18,12 +18,12 @@ #ifndef LIBXFS_INIT_H #define LIBXFS_INIT_H -struct stat64; +struct stat; extern int platform_check_ismounted (char *path, char *block, - struct stat64 *sptr, int verbose); + struct stat *sptr, int verbose); extern int platform_check_iswritable (char *path, char *block, - struct stat64 *sptr, int fatal); + struct stat *sptr, int fatal); extern int platform_set_blocksize (int fd, char *path, dev_t device, int bsz, int fatal); extern void platform_flush_device (int fd, dev_t device); extern char *platform_findrawpath(char *path); diff --git a/libxfs/irix.c b/libxfs/irix.c index 65aaa7e..a3bd832 100644 --- a/libxfs/irix.c +++ b/libxfs/irix.c @@ -25,13 +25,13 @@ extern char *progname; extern __int64_t findsize(char *); int -platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) +platform_check_ismounted(char *name, char *block, struct stat *s, int verbose) { return 0; } int -platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) +platform_check_iswritable(char *name, char *block, struct stat *s, int fatal) { return 1; } @@ -51,9 +51,9 @@ platform_flush_device(int fd, dev_t device) void platform_findsizes(char *path, int fd, long long *sz, int *bsz) { - struct stat64 st; + struct stat st; - if (fstat64(fd, &st) < 0) { + if (fstat(fd, &st) < 0) { fprintf(stderr, _("%s: cannot stat the device file \"%s\": %s\n"), progname, path, strerror(errno)); diff --git a/libxfs/linux.c b/libxfs/linux.c index c9f2baf..7da6dd6 100644 --- a/libxfs/linux.c +++ b/libxfs/linux.c @@ -49,14 +49,14 @@ static int max_block_alignment; #define PROC_MOUNTED "/proc/mounts" int -platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) +platform_check_ismounted(char *name, char *block, struct stat *s, int verbose) { /* Pad ust; pre-2.6.28 linux copies out too much in 32bit compat mode */ struct ustat ust[2]; - struct stat64 st; + struct stat st; if (!s) { - if (stat64(block, &st) < 0) + if (stat(block, &st) < 0) return 0; if ((st.st_mode & S_IFMT) != S_IFBLK) return 0; @@ -74,11 +74,11 @@ platform_check_ismounted(char *name, char *block, struct stat64 *s, int verbose) } int -platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) +platform_check_iswritable(char *name, char *block, struct stat *s, int fatal) { int sts = 0; FILE *f; - struct stat64 mst; + struct stat mst; struct mntent *mnt; char mounts[MAXPATHLEN]; @@ -89,7 +89,7 @@ platform_check_iswritable(char *name, char *block, struct stat64 *s, int fatal) return fatal; } while ((mnt = getmntent(f)) != NULL) { - if (stat64(mnt->mnt_fsname, &mst) < 0) + if (stat(mnt->mnt_fsname, &mst) < 0) continue; if ((mst.st_mode & S_IFMT) != S_IFBLK) continue; @@ -125,11 +125,11 @@ platform_set_blocksize(int fd, char *path, dev_t device, int blocksize, int fata void platform_flush_device(int fd, dev_t device) { - struct stat64 st; + struct stat st; if (major(device) == RAMDISK_MAJOR) return; - if (fstat64(fd, &st) < 0) + if (fstat(fd, &st) < 0) return; if (S_ISREG(st.st_mode)) @@ -141,11 +141,11 @@ platform_flush_device(int fd, dev_t device) void platform_findsizes(char *path, int fd, long long *sz, int *bsz) { - struct stat64 st; + struct stat st; __uint64_t size; int error; - if (fstat64(fd, &st) < 0) { + if (fstat(fd, &st) < 0) { fprintf(stderr, _("%s: " "cannot stat the device file \"%s\": %s\n"), progname, path, strerror(errno)); diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index a22efc2..26d61eb 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -197,7 +197,7 @@ usage(void) exit(1); } -extern int platform_check_ismounted(char *, char *, struct stat64 *, int); +extern int platform_check_ismounted(char *, char *, struct stat *, int); int main( @@ -208,7 +208,7 @@ main( int dst_fd; int c; int open_flags; - struct stat64 statbuf; + struct stat statbuf; int is_target_file; progname = basename(argv[0]); @@ -244,7 +244,7 @@ main( /* check and open target */ open_flags = O_RDWR; is_target_file = 0; - if (stat64(argv[optind], &statbuf) < 0) { + if (stat(argv[optind], &statbuf) < 0) { /* ok, assume it's a file and create it */ open_flags |= O_CREAT; is_target_file = 1; diff --git a/mkfs/proto.c b/mkfs/proto.c index 5f7f0b4..7de0a99 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -782,9 +782,9 @@ static long filesize( int fd) { - struct stat64 stb; + struct stat stb; - if (fstat64(fd, &stb) < 0) + if (fstat(fd, &stb) < 0) return -1; return (long)stb.st_size; } diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 8b02983..8b98a8a 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -794,7 +794,7 @@ check_device_type( bool force_overwrite, const char *optname) { - struct stat64 statbuf; + struct stat statbuf; if (*isfile && (no_size || no_name)) { fprintf(stderr, @@ -808,7 +808,7 @@ check_device_type( usage(); } - if (stat64(name, &statbuf)) { + if (stat(name, &statbuf)) { if (errno == ENOENT && *isfile) { if (create) *create = 1; diff --git a/po/de.po b/po/de.po index fc62525..61a60f3 100644 --- a/po/de.po +++ b/po/de.po @@ -13873,8 +13873,8 @@ msgstr "%s: Dateien zum Kopieren müssen angegeben werden\n" #: .././rtcp/xfs_rtcp.c:86 #, c-format -msgid "%s: stat64 of %s failed\n" -msgstr "%s: stat64 von %s fehlgeschlagen\n" +msgid "%s: stat of %s failed\n" +msgstr "%s: stat von %s fehlgeschlagen\n" #: .././rtcp/xfs_rtcp.c:93 #, c-format @@ -13883,8 +13883,8 @@ msgstr "%s: letztes Argument ist kein Verzeichnis\n" #: .././rtcp/xfs_rtcp.c:140 #, c-format -msgid "%s: failed stat64 on %s: %s\n" -msgstr "%s: stat64 auf %s fehlgeschlagen: %s\n" +msgid "%s: failed stat on %s: %s\n" +msgstr "%s: stat auf %s fehlgeschlagen: %s\n" #: .././rtcp/xfs_rtcp.c:161 #, c-format diff --git a/po/pl.po b/po/pl.po index a950f77..9d5128f 100644 --- a/po/pl.po +++ b/po/pl.po @@ -13005,8 +13005,8 @@ msgstr "%s: trzeba podać pliki do skopiowania\n" #: .././rtcp/xfs_rtcp.c:84 #, c-format -msgid "%s: stat64 of %s failed\n" -msgstr "%s: stat64 na %s nie powiodło się\n" +msgid "%s: stat of %s failed\n" +msgstr "%s: stat na %s nie powiodło się\n" #: .././rtcp/xfs_rtcp.c:91 #, c-format @@ -13015,8 +13015,8 @@ msgstr "%s: ostatni argument nie jest katalogiem\n" #: .././rtcp/xfs_rtcp.c:138 #, c-format -msgid "%s: failed stat64 on %s: %s\n" -msgstr "%s: nie udało się wykonać stat64 na %s: %s\n" +msgid "%s: failed stat on %s: %s\n" +msgstr "%s: nie udało się wykonać stat na %s: %s\n" #: .././rtcp/xfs_rtcp.c:159 #, c-format diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 50a1ac9..361bace 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -668,9 +668,9 @@ main(int argc, char **argv) /* -f forces this, but let's be nice and autodetect it, as well. */ if (!isa_file) { int fd = libxfs_device_to_fd(x.ddev); - struct stat64 statbuf; + struct stat statbuf; - if (fstat64(fd, &statbuf) < 0) + if (fstat(fd, &statbuf) < 0) do_warn(_("%s: couldn't stat \"%s\"\n"), progname, fs_name); else if (S_ISREG(statbuf.st_mode)) diff --git a/rtcp/xfs_rtcp.c b/rtcp/xfs_rtcp.c index 3044350..705e958 100644 --- a/rtcp/xfs_rtcp.c +++ b/rtcp/xfs_rtcp.c @@ -35,7 +35,7 @@ int main(int argc, char **argv) { int c, i, r, errflg = 0; - struct stat64 s2; + struct stat s2; int extsize = - 1; progname = basename(argv[0]); @@ -80,8 +80,8 @@ main(int argc, char **argv) * which really exists. */ if (argc > 2) { - if (stat64(argv[argc-1], &s2) < 0) { - fprintf(stderr, _("%s: stat64 of %s failed\n"), + if (stat(argv[argc-1], &s2) < 0) { + fprintf(stderr, _("%s: stat of %s failed\n"), progname, argv[argc-1]); exit(2); } @@ -115,7 +115,7 @@ rtcp( char *source, char *target, int fextsize) int remove = 0, rtextsize; char *sp, *fbuf, *ptr; char tbuf[ PATH_MAX ]; - struct stat64 s1, s2; + struct stat s1, s2; struct fsxattr fsxattr; struct dioattr dioattr; @@ -134,8 +134,8 @@ rtcp( char *source, char *target, int fextsize) *sp = '\0'; } - if ( stat64(source, &s1) ) { - fprintf(stderr, _("%s: failed stat64 on %s: %s\n"), + if ( stat(source, &s1) ) { + fprintf(stderr, _("%s: failed stat on %s: %s\n"), progname, source, strerror(errno)); return( -1); } @@ -144,7 +144,7 @@ rtcp( char *source, char *target, int fextsize) * check for a realtime partition */ snprintf(tbuf, sizeof(tbuf), "%s", target); - if ( stat64(target, &s2) ) { + if ( stat(target, &s2) ) { if (!S_ISDIR(s2.st_mode)) { /* take out target file name */ if ((ptr = strrchr(tbuf, '/')) != NULL) @@ -165,14 +165,14 @@ rtcp( char *source, char *target, int fextsize) * check if target is a directory */ snprintf(tbuf, sizeof(tbuf), "%s", target); - if ( !stat64(target, &s2) ) { + if ( !stat(target, &s2) ) { if (S_ISDIR(s2.st_mode)) { snprintf(tbuf, sizeof(tbuf), "%s/%s", target, basename(source)); } } - if ( stat64(tbuf, &s2) ) { + if ( stat(tbuf, &s2) ) { /* * create the file if it does not exist */ -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 63BB47CB0 for ; Sat, 13 Aug 2016 12:25:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B907BAC005 for ; Sat, 13 Aug 2016 10:25:36 -0700 (PDT) X-ASG-Debug-ID: 1471109133-0bf57c13685d7db0001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id sJQqPfUio2eJwBzJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:34 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 739EC2097C for ; Sat, 13 Aug 2016 19:25:33 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDD6PkDz1048 for ; Sat, 13 Aug 2016 19:25:32 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:36 +0200 Resent-Message-ID: <20160813172436.GC3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <49056a950fa3548694e074995bd7368c4fc0c54d.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:49 +0200 Subject: [PATCHv2 xfsprogs 05/14] replace ftruncate64 by equivalent ftruncate To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 05/14] replace ftruncate64 by equivalent ftruncate X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109134 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3687 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Felix Janda --- copy/xfs_copy.c | 2 +- fsr/xfs_fsr.c | 2 +- include/darwin.h | 1 - include/freebsd.h | 1 - io/copy_file_range.c | 4 ++-- io/truncate.c | 2 +- mdrestore/xfs_mdrestore.c | 2 +- mkfs/xfs_mkfs.c | 2 +- 8 files changed, 7 insertions(+), 9 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 55a9e2c..f038c2e 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -832,7 +832,7 @@ main(int argc, char **argv) if (write_last_block) { /* ensure regular files are correctly sized */ - if (ftruncate64(target[i].fd, mp->m_sb.sb_dblocks * + if (ftruncate(target[i].fd, mp->m_sb.sb_dblocks * source_blocksize)) { do_log(_("%s: cannot grow data section.\n"), progname); diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 36e0705..d87d020 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1451,7 +1451,7 @@ packfile(char *fname, char *tname, int fd, } } } - if (ftruncate64(tfd, statp->bs_size) < 0) { + if (ftruncate(tfd, statp->bs_size) < 0) { fsrprintf(_("could not truncate tmpfile: %s : %s\n"), fname, strerror(errno)); goto out; diff --git a/include/darwin.h b/include/darwin.h index 8708324..5c149a0 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -144,7 +144,6 @@ typedef int64_t xfs_daddr_t; #define lseek64 lseek #define pread64 pread #define pwrite64 pwrite -#define ftruncate64 ftruncate #define fdatasync fsync #define memalign(a,sz) valloc(sz) diff --git a/include/freebsd.h b/include/freebsd.h index f7ab8fa..f5e7fa9 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -34,7 +34,6 @@ #define __LITTLE_ENDIAN LITTLE_ENDIAN /* FreeBSD file API is 64-bit aware */ -#define ftruncate64 ftruncate #define lseek64 lseek #define pwrite64 pwrite #define pread64 pread diff --git a/io/copy_file_range.c b/io/copy_file_range.c index 7ba42b6..88203e9 100644 --- a/io/copy_file_range.c +++ b/io/copy_file_range.c @@ -72,9 +72,9 @@ copy_src_filesize(int fd) static int copy_dst_truncate(void) { - int ret = ftruncate64(file->fd, 0); + int ret = ftruncate(file->fd, 0); if (ret < 0) - perror("ftruncate64"); + perror("ftruncate"); return ret; } diff --git a/io/truncate.c b/io/truncate.c index f2df168..20bada8 100644 --- a/io/truncate.c +++ b/io/truncate.c @@ -38,7 +38,7 @@ truncate_f( return 0; } - if (ftruncate64(file->fd, offset) < 0) { + if (ftruncate(file->fd, offset) < 0) { perror("ftruncate"); return 0; } diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 26d61eb..1540dcd 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -124,7 +124,7 @@ perform_restore( if (is_target_file) { /* ensure regular files are correctly sized */ - if (ftruncate64(dst_fd, sb.sb_dblocks * sb.sb_blocksize)) + if (ftruncate(dst_fd, sb.sb_dblocks * sb.sb_blocksize)) fatal("cannot set filesystem image size: %s\n", strerror(errno)); } else { diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 8b98a8a..5d5fcb7 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2815,7 +2815,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), * code will succeed. */ if (xi.disfile && xi.dsize * xi.dbsize < dblocks * blocksize) { - if (ftruncate64(xi.dfd, dblocks * blocksize) < 0) { + if (ftruncate(xi.dfd, dblocks * blocksize) < 0) { fprintf(stderr, _("%s: Growing the data section failed\n"), progname); -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E875A7CB9 for ; Sat, 13 Aug 2016 12:25:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B974E304043 for ; Sat, 13 Aug 2016 10:25:41 -0700 (PDT) X-ASG-Debug-ID: 1471109136-0bf57b369d688060001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id Rzo7JjLWFEiDrEJ2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:38 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 9FADF20449 for ; Sat, 13 Aug 2016 19:25:36 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDH715Nz104L for ; Sat, 13 Aug 2016 19:25:35 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:39 +0200 Resent-Message-ID: <20160813172439.GD3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <5579d796a9131b28e13b271a041728bf0154aa12.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:50 +0200 Subject: [PATCHv2 xfsprogs 06/14] replace lseek64 by equivalent lseek To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 06/14] replace lseek64 by equivalent lseek X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109138 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11607 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Felix Janda --- copy/xfs_copy.c | 10 +++++----- fsr/xfs_fsr.c | 10 +++++----- include/darwin.h | 1 - include/freebsd.h | 1 - io/pread.c | 6 +++--- io/seek.c | 6 +++--- libxfs/rdwr.c | 2 +- logprint/log_misc.c | 4 ++-- logprint/logprint.c | 2 +- po/de.po | 16 ++++++++-------- po/pl.po | 16 ++++++++-------- repair/sb.c | 6 +++--- 12 files changed, 39 insertions(+), 41 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index f038c2e..cc5207d 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -162,7 +162,7 @@ check_errors(void) if (target[i].err_type == 0) do_log(_("write error")); else - do_log(_("lseek64 error")); + do_log(_("lseek error")); do_log(_(" at offset %lld\n"), target[i].position); } } @@ -192,7 +192,7 @@ do_write( buf = &w_buf; if (target[args->id].position != buf->position) { - if (lseek64(args->fd, buf->position, SEEK_SET) < 0) { + if (lseek(args->fd, buf->position, SEEK_SET) < 0) { error = target[args->id].err_type = 1; } else { target[args->id].position = buf->position; @@ -263,7 +263,7 @@ handler(int sig) target[i].position); } else { do_warn( - _("%s: lseek64 error on target %d \"%s\" at offset %lld\n"), + _("%s: lseek error on target %d \"%s\" at offset %lld\n"), progname, i, target[i].name, target[i].position); } @@ -388,9 +388,9 @@ read_wbuf(int fd, wbuf *buf, xfs_mount_t *mp) } if (source_position != buf->position) { - lres = lseek64(fd, buf->position, SEEK_SET); + lres = lseek(fd, buf->position, SEEK_SET); if (lres < 0LL) { - do_warn(_("%s: lseek64 failure at offset %lld\n"), + do_warn(_("%s: lseek failure at offset %lld\n"), progname, source_position); die_perror(); } diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index d87d020..98390e7 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -1318,7 +1318,7 @@ packfile(char *fname, char *tname, int fd, fsrprintf(_("could not trunc tmp %s\n"), tname); } - if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { + if (lseek(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { fsrprintf(_("could not lseek in tmpfile: %s : %s\n"), tname, strerror(errno)); goto out; @@ -1338,7 +1338,7 @@ packfile(char *fname, char *tname, int fd, " %s\n"), tname); goto out; } - if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { + if (lseek(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { fsrprintf(_("could not lseek in tmpfile: %s : %s\n"), tname, strerror(errno)); goto out; @@ -1346,7 +1346,7 @@ packfile(char *fname, char *tname, int fd, } } /* end of space allocation loop */ - if (lseek64(tfd, 0, SEEK_SET)) { + if (lseek(tfd, 0, SEEK_SET)) { fsrprintf(_("Couldn't rewind on temporary file\n")); goto out; } @@ -1366,12 +1366,12 @@ packfile(char *fname, char *tname, int fd, for (extent = 0; extent < nextents; extent++) { pos = outmap[extent].bmv_offset; if (outmap[extent].bmv_block == -1) { - if (lseek64(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { + if (lseek(tfd, outmap[extent].bmv_length, SEEK_CUR) < 0) { fsrprintf(_("could not lseek in tmpfile: %s : %s\n"), tname, strerror(errno)); goto out; } - if (lseek64(fd, outmap[extent].bmv_length, SEEK_CUR) < 0) { + if (lseek(fd, outmap[extent].bmv_length, SEEK_CUR) < 0) { fsrprintf(_("could not lseek in file: %s : %s\n"), fname, strerror(errno)); goto out; diff --git a/include/darwin.h b/include/darwin.h index 5c149a0..850d733 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,7 +141,6 @@ typedef u_int64_t xfs_ino_t; typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; -#define lseek64 lseek #define pread64 pread #define pwrite64 pwrite #define fdatasync fsync diff --git a/include/freebsd.h b/include/freebsd.h index f5e7fa9..784e287 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -34,7 +34,6 @@ #define __LITTLE_ENDIAN LITTLE_ENDIAN /* FreeBSD file API is 64-bit aware */ -#define lseek64 lseek #define pwrite64 pwrite #define pread64 pread #define fdatasync fsync diff --git a/io/pread.c b/io/pread.c index b98355f..cafead0 100644 --- a/io/pread.c +++ b/io/pread.c @@ -233,7 +233,7 @@ read_random( int ops = 0; srandom(seed); - end = lseek64(fd, 0, SEEK_END); + end = lseek(fd, 0, SEEK_END); offset = (eof || offset > end) ? end : offset; if ((bytes = (offset % buffersize))) offset -= bytes; @@ -279,8 +279,8 @@ read_backward( long long cnt = *count; int ops = 0; - end = lseek64(fd, 0, SEEK_END); - off = eof ? end : min(end, lseek64(fd, off, SEEK_SET)); + end = lseek(fd, 0, SEEK_END); + off = eof ? end : min(end, lseek(fd, off, SEEK_SET)); if ((end = off - cnt) < 0) { cnt += end; /* subtraction, end is negative */ end = 0; diff --git a/io/seek.c b/io/seek.c index 35a369e..d06375d 100644 --- a/io/seek.c +++ b/io/seek.c @@ -147,7 +147,7 @@ seek_f( * decide if we want to display that type of entry. */ if (flag & SEEK_HFLAG) { - offset = lseek64(file->fd, start, SEEK_HOLE); + offset = lseek(file->fd, start, SEEK_HOLE); if ((start == offset) || !(flag & SEEK_DFLAG)) { /* * this offset is a hole or are only displaying holes. @@ -162,7 +162,7 @@ seek_f( /* The offset is not a hole, or we are looking just for data */ current = DATA; - offset = lseek64(file->fd, start, SEEK_DATA); + offset = lseek(file->fd, start, SEEK_DATA); found_hole: /* @@ -202,7 +202,7 @@ found_hole: current ^= 1; /* alternate between data and hole */ start = offset; - offset = lseek64(file->fd, start, seekinfo[current].seektype); + offset = lseek(file->fd, start, seekinfo[current].seektype); } return 0; } diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 0ec38c5..cb74b3c 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -88,7 +88,7 @@ libxfs_device_zero(struct xfs_buftarg *btp, xfs_daddr_t start, uint len) fd = libxfs_device_to_fd(btp->dev); start_offset = LIBXFS_BBTOOFF64(start); - if ((lseek64(fd, start_offset, SEEK_SET)) < 0) { + if ((lseek(fd, start_offset, SEEK_SET)) < 0) { fprintf(stderr, _("%s: %s seek to offset %llu failed: %s\n"), progname, __FUNCTION__, (unsigned long long)start_offset, strerror(errno)); diff --git a/logprint/log_misc.c b/logprint/log_misc.c index e6ee832..8a687d5 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -887,8 +887,8 @@ xlog_print_lseek(struct xlog *log, int fd, xfs_daddr_t blkno, int whence) offset = BBTOOFF64(blkno+log->l_logBBstart); else offset = BBTOOFF64(blkno); - if (lseek64(fd, offset, whence) < 0) { - fprintf(stderr, _("%s: lseek64 to %lld failed: %s\n"), + if (lseek(fd, offset, whence) < 0) { + fprintf(stderr, _("%s: lseek to %lld failed: %s\n"), progname, (long long)offset, strerror(errno)); exit(1); } diff --git a/logprint/logprint.c b/logprint/logprint.c index a5c9b32..37b8cb9 100644 --- a/logprint/logprint.c +++ b/logprint/logprint.c @@ -80,7 +80,7 @@ logstat(xfs_mount_t *mp) x.dname, strerror(errno)); exit(1); } - lseek64(fd, 0, SEEK_SET); + lseek(fd, 0, SEEK_SET); if (read(fd, buf, sizeof(buf)) != sizeof(buf)) { fprintf(stderr, _(" read of XFS superblock failed\n")); exit(1); diff --git a/po/de.po b/po/de.po index 61a60f3..ff1930e 100644 --- a/po/de.po +++ b/po/de.po @@ -45,8 +45,8 @@ msgid "write error" msgstr "Schreibfehler" #: .././copy/xfs_copy.c:146 -msgid "lseek64 error" -msgstr "lseek64-Fehler" +msgid "lseek error" +msgstr "lseek-Fehler" #: .././copy/xfs_copy.c:147 #, c-format @@ -70,8 +70,8 @@ msgstr "%s: Schreibfehler auf Ziel %d »%s« bei Versatz %lld\n" #: .././copy/xfs_copy.c:260 #, c-format -msgid "%s: lseek64 error on target %d \"%s\" at offset %lld\n" -msgstr "%s: lseek64-Fehler auf Ziel %d »%s« bei Versatz %lld\n" +msgid "%s: lseek error on target %d \"%s\" at offset %lld\n" +msgstr "%s: lseek-Fehler auf Ziel %d »%s« bei Versatz %lld\n" #: .././copy/xfs_copy.c:266 #, c-format @@ -104,8 +104,8 @@ msgstr "Aufruf: %s [-bd] [-L Protokolldatei] Quelle Ziel [Ziel ...]\n" #: .././copy/xfs_copy.c:386 #, c-format -msgid "%s: lseek64 failure at offset %lld\n" -msgstr "%s: lseek64-Fehlschlag bei Versatz %lld\n" +msgid "%s: lseek failure at offset %lld\n" +msgstr "%s: lseek-Fehlschlag bei Versatz %lld\n" #: .././copy/xfs_copy.c:401 #, c-format @@ -6472,8 +6472,8 @@ msgstr "DQUOT: Magische 0x%hx Markierungen 0%ho\n" #: .././logprint/log_misc.c:821 #, c-format -msgid "%s: lseek64 to %lld failed: %s\n" -msgstr "%s: lseek64 auf %lld fehlgeschlagen: %s\n" +msgid "%s: lseek to %lld failed: %s\n" +msgstr "%s: lseek auf %lld fehlgeschlagen: %s\n" #: .././logprint/log_misc.c:864 #, c-format diff --git a/po/pl.po b/po/pl.po index 9d5128f..33a9d81 100644 --- a/po/pl.po +++ b/po/pl.po @@ -44,8 +44,8 @@ msgid "write error" msgstr "błąd zapisu" #: .././copy/xfs_copy.c:146 -msgid "lseek64 error" -msgstr "błąd lseek64" +msgid "lseek error" +msgstr "błąd lseek" #: .././copy/xfs_copy.c:147 #, c-format @@ -69,8 +69,8 @@ msgstr "%s: błąd zapisu przy celu %d \"%s\" pod offsetem %lld\n" #: .././copy/xfs_copy.c:241 #, c-format -msgid "%s: lseek64 error on target %d \"%s\" at offset %lld\n" -msgstr "%s: błąd lseek64 przy celu %d \"%s\" pod offsetem %lld\n" +msgid "%s: lseek error on target %d \"%s\" at offset %lld\n" +msgstr "%s: błąd lseek przy celu %d \"%s\" pod offsetem %lld\n" #: .././copy/xfs_copy.c:247 #, c-format @@ -103,8 +103,8 @@ msgstr "Składnia: %s [-bdV] [-L plik_logu] źródło cel [cel ...]\n" #: .././copy/xfs_copy.c:367 #, c-format -msgid "%s: lseek64 failure at offset %lld\n" -msgstr "%s: niepowodzenie lseek64 pod offsetem %lld\n" +msgid "%s: lseek failure at offset %lld\n" +msgstr "%s: niepowodzenie lseek pod offsetem %lld\n" #: .././copy/xfs_copy.c:382 #, c-format @@ -6394,8 +6394,8 @@ msgstr "" #: .././logprint/log_misc.c:863 #, c-format -msgid "%s: lseek64 to %lld failed: %s\n" -msgstr "%s: lseek64 na %lld nie powiodło się: %s\n" +msgid "%s: lseek to %lld failed: %s\n" +msgstr "%s: lseek na %lld nie powiodło się: %s\n" #: .././logprint/log_misc.c:909 #, c-format diff --git a/repair/sb.c b/repair/sb.c index a8170ba..ad1a29f 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -138,7 +138,7 @@ __find_secondary_sb( /* * read disk 1 MByte at a time. */ - if (lseek64(x.dfd, off, SEEK_SET) != off) { + if (lseek(x.dfd, off, SEEK_SET) != off) { done = 1; } @@ -512,7 +512,7 @@ write_primary_sb(xfs_sb_t *sbp, int size) } memset(buf, 0, size); - if (lseek64(x.dfd, 0LL, SEEK_SET) != 0LL) { + if (lseek(x.dfd, 0LL, SEEK_SET) != 0LL) { free(buf); do_error(_("couldn't seek to offset 0 in filesystem\n")); } @@ -551,7 +551,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) /* try and read it first */ - if (lseek64(x.dfd, off, SEEK_SET) != off) { + if (lseek(x.dfd, off, SEEK_SET) != off) { do_warn( _("error reading superblock %u -- seek to offset %" PRId64 " failed\n"), agno, off); -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 071E57CBB for ; Sat, 13 Aug 2016 12:25:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B0CA2304048 for ; Sat, 13 Aug 2016 10:25:43 -0700 (PDT) X-ASG-Debug-ID: 1471109140-0bf8151be4101060001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id UvitGqEJf9PKEGYg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:41 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id E1FD52097C for ; Sat, 13 Aug 2016 19:25:39 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDM1yJPz104L for ; Sat, 13 Aug 2016 19:25:39 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:42 +0200 Resent-Message-ID: <20160813172442.GE3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <721b38cd2dd2f0cfa7fd7976a1d941be3429478e.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 12:45:52 +0200 Subject: [PATCHv2 xfsprogs 07/14] replace pread64/pwrite64 by equivalent pread/pwrite To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 07/14] replace pread64/pwrite64 by equivalent pread/pwrite X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109140 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7761 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Felix Janda --- copy/xfs_copy.c | 2 +- include/darwin.h | 2 -- include/freebsd.h | 2 -- io/pread.c | 10 +++++----- io/pwrite.c | 10 +++++----- libxfs/rdwr.c | 8 ++++---- mdrestore/xfs_mdrestore.c | 4 ++-- mkfs/xfs_mkfs.c | 2 +- po/de.po | 4 ++-- po/pl.po | 8 ++++---- repair/prefetch.c | 2 +- 11 files changed, 25 insertions(+), 29 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index cc5207d..816ab29 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -860,7 +860,7 @@ main(int argc, char **argv) off = mp->m_sb.sb_dblocks * source_blocksize; off -= sizeof(lb); - if (pwrite64(target[i].fd, lb, sizeof(lb), off) < 0) { + if (pwrite(target[i].fd, lb, sizeof(lb), off) < 0) { do_log(_("%s: failed to write last block\n"), progname); do_log(_("\tIs target \"%s\" too small?\n"), diff --git a/include/darwin.h b/include/darwin.h index 850d733..fb13915 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -141,8 +141,6 @@ typedef u_int64_t xfs_ino_t; typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; -#define pread64 pread -#define pwrite64 pwrite #define fdatasync fsync #define memalign(a,sz) valloc(sz) diff --git a/include/freebsd.h b/include/freebsd.h index 784e287..df924ef 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -34,8 +34,6 @@ #define __LITTLE_ENDIAN LITTLE_ENDIAN /* FreeBSD file API is 64-bit aware */ -#define pwrite64 pwrite -#define pread64 pread #define fdatasync fsync #define memalign(a,sz) valloc(sz) diff --git a/io/pread.c b/io/pread.c index cafead0..3395503 100644 --- a/io/pread.c +++ b/io/pread.c @@ -214,7 +214,7 @@ do_pread( ssize_t buffer_size) { if (!vectors) - return pread64(fd, buffer, min(count, buffer_size), offset); + return pread(fd, buffer, min(count, buffer_size), offset); return do_preadv(fd, offset, count, buffer_size); } @@ -254,7 +254,7 @@ read_random( if (bytes == 0) break; if (bytes < 0) { - perror("pread64"); + perror("pread"); return -1; } ops++; @@ -296,7 +296,7 @@ read_backward( if (bytes == 0) return ops; if (bytes < 0) { - perror("pread64"); + perror("pread"); return -1; } ops++; @@ -314,7 +314,7 @@ read_backward( if (bytes == 0) break; if (bytes < 0) { - perror("pread64"); + perror("pread"); return -1; } ops++; @@ -345,7 +345,7 @@ read_forward( if (bytes == 0) break; if (bytes < 0) { - perror("pread64"); + perror("pread"); return -1; } ops++; diff --git a/io/pwrite.c b/io/pwrite.c index 67631ce..7c0bb7f 100644 --- a/io/pwrite.c +++ b/io/pwrite.c @@ -101,7 +101,7 @@ do_pwrite( ssize_t buffer_size) { if (!vectors) - return pwrite64(fd, buffer, min(count, buffer_size), offset); + return pwrite(fd, buffer, min(count, buffer_size), offset); return do_pwritev(fd, offset, count, buffer_size); } @@ -137,7 +137,7 @@ write_random( if (bytes == 0) break; if (bytes < 0) { - perror("pwrite64"); + perror("pwrite"); return -1; } ops++; @@ -175,7 +175,7 @@ write_backward( if (bytes == 0) return ops; if (bytes < 0) { - perror("pwrite64"); + perror("pwrite"); return -1; } ops++; @@ -193,7 +193,7 @@ write_backward( if (bytes == 0) break; if (bytes < 0) { - perror("pwrite64"); + perror("pwrite"); return -1; } ops++; @@ -228,7 +228,7 @@ write_buffer( if (bytes == 0) break; if (bytes < 0) { - perror("pwrite64"); + perror("pwrite"); return -1; } ops++; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index cb74b3c..8e9d86a 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -915,7 +915,7 @@ __read_buf(int fd, void *buf, int len, off64_t offset, int flags) { int sts; - sts = pread64(fd, buf, len, offset); + sts = pread(fd, buf, len, offset); if (sts < 0) { int error = errno; fprintf(stderr, _("%s: read failed: %s\n"), @@ -1083,16 +1083,16 @@ __write_buf(int fd, void *buf, int len, off64_t offset, int flags) { int sts; - sts = pwrite64(fd, buf, len, offset); + sts = pwrite(fd, buf, len, offset); if (sts < 0) { int error = errno; - fprintf(stderr, _("%s: pwrite64 failed: %s\n"), + fprintf(stderr, _("%s: pwrite failed: %s\n"), progname, strerror(error)); if (flags & LIBXFS_B_EXIT) exit(1); return -error; } else if (sts != len) { - fprintf(stderr, _("%s: error - pwrite64 only %d of %d bytes\n"), + fprintf(stderr, _("%s: error - pwrite only %d of %d bytes\n"), progname, sts, len); if (flags & LIBXFS_B_EXIT) exit(1); diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 1540dcd..0d399f1 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -134,7 +134,7 @@ perform_restore( off64_t off; off = sb.sb_dblocks * sb.sb_blocksize - sizeof(lb); - if (pwrite64(dst_fd, lb, sizeof(lb), off) < 0) + if (pwrite(dst_fd, lb, sizeof(lb), off) < 0) fatal("failed to write last block, is target too " "small? (error: %s)\n", strerror(errno)); } @@ -146,7 +146,7 @@ perform_restore( print_progress("%lld MB read", bytes_read >> 20); for (cur_index = 0; cur_index < mb_count; cur_index++) { - if (pwrite64(dst_fd, &block_buffer[cur_index << + if (pwrite(dst_fd, &block_buffer[cur_index << tmb.mb_blocklog], block_size, be64_to_cpu(block_index[cur_index]) << BBSHIFT) < 0) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 5d5fcb7..e038d48 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1111,7 +1111,7 @@ zero_old_xfs_structures( off = 0; for (i = 1; i < sb.sb_agcount; i++) { off += sb.sb_agblocks; - if (pwrite64(xi->dfd, buf, new_sb->sb_sectsize, + if (pwrite(xi->dfd, buf, new_sb->sb_sectsize, off << sb.sb_blocklog) == -1) break; } diff --git a/po/de.po b/po/de.po index ff1930e..fab2667 100644 --- a/po/de.po +++ b/po/de.po @@ -5893,8 +5893,8 @@ msgstr "%s: lesen fehlgeschlagen: %s\n" #: .././libxfs/rdwr.c:502 #, c-format -msgid "%s: pwrite64 failed: %s\n" -msgstr "%s: pwrite64 fehlgeschlagen: %s\n" +msgid "%s: pwrite failed: %s\n" +msgstr "%s: pwrite fehlgeschlagen: %s\n" #: .././libxfs/rdwr.c:509 #, c-format diff --git a/po/pl.po b/po/pl.po index 33a9d81..49209f3 100644 --- a/po/pl.po +++ b/po/pl.po @@ -5940,13 +5940,13 @@ msgstr "%s: błąd - odczytano tylko %d z %d bajtów\n" #: .././libxfs/rdwr.c:878 #, c-format -msgid "%s: pwrite64 failed: %s\n" -msgstr "%s: pwrite64 nie powiodło się: %s\n" +msgid "%s: pwrite failed: %s\n" +msgstr "%s: pwrite nie powiodło się: %s\n" #: .././libxfs/rdwr.c:884 #, c-format -msgid "%s: error - pwrite64 only %d of %d bytes\n" -msgstr "%s: błąd - wykonano pwrite64 tylko %d z %d bajtów\n" +msgid "%s: error - pwrite only %d of %d bytes\n" +msgstr "%s: błąd - wykonano pwrite tylko %d z %d bajtów\n" #: .././libxfs/rdwr.c:920 #, c-format diff --git a/repair/prefetch.c b/repair/prefetch.c index b4f20d9..175594c 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -565,7 +565,7 @@ pf_batch_read( /* * now read the data and put into the xfs_but_t's */ - len = pread64(mp_fd, buf, (int)(last_off - first_off), first_off); + len = pread(mp_fd, buf, (int)(last_off - first_off), first_off); /* * Check the last buffer on the list to see if we need to -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 764B47CBC for ; Sat, 13 Aug 2016 12:25:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A57A304048 for ; Sat, 13 Aug 2016 10:25:47 -0700 (PDT) X-ASG-Debug-ID: 1471109144-0bf8151be1101060001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id mBvZexGpprrszPNx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:45 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 2B36B2098D for ; Sat, 13 Aug 2016 19:25:44 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDR4KKtz104W for ; Sat, 13 Aug 2016 19:25:43 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:46 +0200 Resent-Message-ID: <20160813172446.GF3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <4606f95e95d055534c17ed8a998351824298f627.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 6 Aug 2016 13:03:16 +0200 Subject: [PATCHv2 xfsprogs 08/14] replace sendfile64 by equivalent sendfile To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 08/14] replace sendfile64 by equivalent sendfile X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109145 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 598 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Felix Janda --- io/sendfile.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/io/sendfile.c b/io/sendfile.c index c082acf..edd31c9 100644 --- a/io/sendfile.c +++ b/io/sendfile.c @@ -56,11 +56,11 @@ send_buffer( *total = 0; while (count > 0) { - bytes = sendfile64(file->fd, fd, &off, bytes_remaining); + bytes = sendfile(file->fd, fd, &off, bytes_remaining); if (bytes == 0) break; if (bytes < 0) { - perror("sendfile64"); + perror("sendfile"); return -1; } ops++; -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A31BD7CB8 for ; Sat, 13 Aug 2016 12:25:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 19DD5AC003 for ; Sat, 13 Aug 2016 10:25:50 -0700 (PDT) X-ASG-Debug-ID: 1471109147-0bf57b369c688070001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id K8hBJMtDsAUdBiqb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:48 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 5B16620449 for ; Sat, 13 Aug 2016 19:25:47 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDV6DKfz104d for ; Sat, 13 Aug 2016 19:25:46 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:50 +0200 Resent-Message-ID: <20160813172450.GG3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <94800ca4e791ebca9ad6503afba31ebdfad672f7.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 13 Aug 2016 18:03:16 +0200 Subject: [PATCHv2 xfsprogs 09/14] fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 09/14] fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109148 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 547 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- also fixes a compile failure on FreeBSD Signed-off-by: Felix Janda --- io/fadvise.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io/fadvise.c b/io/fadvise.c index d59d1ff..46174f3 100644 --- a/io/fadvise.c +++ b/io/fadvise.c @@ -103,7 +103,7 @@ fadvise_f( return command_usage(&fadvise_cmd); } - if (posix_fadvise64(file->fd, offset, length, advise) < 0) { + if (posix_fadvise(file->fd, offset, length, advise) < 0) { perror("fadvise"); return 0; } -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8D9767CCD for ; Sat, 13 Aug 2016 12:25:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D4BDAC002 for ; Sat, 13 Aug 2016 10:25:52 -0700 (PDT) X-ASG-Debug-ID: 1471109150-0bf8151be4101080001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id 6Fe0zB9uEwnSAPrR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:51 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 2B69A20449 for ; Sat, 13 Aug 2016 19:25:50 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDY4hcjz104J for ; Sat, 13 Aug 2016 19:25:49 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:53 +0200 Resent-Message-ID: <20160813172453.GH3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <7b393c92e885edd551cdd0c46b21807f653c8c1d.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 13 Aug 2016 18:17:41 +0200 Subject: [PATCHv2 xfsprogs 10/14] Makefile: disable fsr for Mac OS X To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 10/14] Makefile: disable fsr for Mac OS X X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109151 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 838 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Since its kernel does not support XFS anyway this utility is not useful, and with its removal the portability framework can be simplified. Signed-off-by: Felix Janda --- Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7bdc670..84dc62c 100644 --- a/Makefile +++ b/Makefile @@ -45,9 +45,13 @@ HDR_SUBDIRS = include libxfs DLIB_SUBDIRS = libxlog libxcmd libhandle LIB_SUBDIRS = libxfs $(DLIB_SUBDIRS) -TOOL_SUBDIRS = copy db estimate fsck fsr growfs io logprint mkfs quota \ +TOOL_SUBDIRS = copy db estimate fsck growfs io logprint mkfs quota \ mdrestore repair rtcp m4 man doc debian +ifneq ("$(PKG_PLATFORM)","darwin") +TOOL_SUBDIRS += fsr +endif + ifneq ("$(XGETTEXT)","") TOOL_SUBDIRS += po endif -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:25:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E15447CCF for ; Sat, 13 Aug 2016 12:25:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 61CF0AC003 for ; Sat, 13 Aug 2016 10:25:56 -0700 (PDT) X-ASG-Debug-ID: 1471109153-0bf57c13675d7e50001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id spiqLhphJfiDx28c (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:54 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 4B88420449 for ; Sat, 13 Aug 2016 19:25:53 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDc5nMnz104J for ; Sat, 13 Aug 2016 19:25:52 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:56 +0200 Resent-Message-ID: <20160813172456.GI3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <16eb2ae9106fd3c5cc921b6be45a96a593d7a308.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 13 Aug 2016 18:20:47 +0200 Subject: [PATCHv2 xfsprogs 11/14] fsr: remove workaround for statvfs on Mac OS X To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 11/14] fsr: remove workaround for statvfs on Mac OS X X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109154 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1040 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- It can be removed since fsr is no longer built on Mac OS X. Signed-off-by: Felix Janda --- fsr/xfs_fsr.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 98390e7..9cffa1b 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -945,11 +945,7 @@ fsrfile_common( fname, strerror(errno)); return -1; } -#ifndef statvfs64 bsize = vfss.f_frsize ? vfss.f_frsize : vfss.f_bsize; -#else - bsize = vfss.f_bsize; -#endif if (statp->bs_blksize * statp->bs_blocks > vfss.f_bfree * bsize - minimumfree) { fsrprintf(_("insufficient freespace for: %s: " @@ -1717,11 +1713,7 @@ xfs_getrt(int fd, struct statvfs64 *sfbp) close(fd); return -1; } -#ifndef statvfs64 bsize = (sfbp->f_frsize ? sfbp->f_frsize : sfbp->f_bsize); -#else - bsize = sfbp->f_bsize; -#endif factor = fsgeom.blocksize / bsize; /* currently this is == 1 */ sfbp->f_bfree = (cnt.freertx * fsgeom.rtextsize) * factor; return 0; -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:26:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4EEA87CD2 for ; Sat, 13 Aug 2016 12:26:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C49C3AC002 for ; Sat, 13 Aug 2016 10:25:59 -0700 (PDT) X-ASG-Debug-ID: 1471109157-0bf8151be2101080001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id GHL5XaohaXy5q3sL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:25:58 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 0444920470 for ; Sat, 13 Aug 2016 19:25:57 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDh3hQjz104J for ; Sat, 13 Aug 2016 19:25:56 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:24:59 +0200 Resent-Message-ID: <20160813172459.GJ3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: In-Reply-To: References: From: Felix Janda Date: Sat, 13 Aug 2016 18:22:27 +0200 Subject: [PATCHv2 xfsprogs 12/14] replace statvfs64 by equivalent statvfs To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 12/14] replace statvfs64 by equivalent statvfs X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109157 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1886 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Felix Janda --- fsr/xfs_fsr.c | 8 ++++---- include/darwin.h | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 9cffa1b..517b75f 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -89,7 +89,7 @@ static void fsrallfs(char *mtab, int howlong, char *leftofffile); static void fsrall_cleanup(int timeout); static int getnextents(int); int xfsrtextsize(int fd); -int xfs_getrt(int fd, struct statvfs64 *sfbp); +int xfs_getrt(int fd, struct statvfs *sfbp); char * gettmpname(char *fname); char * getparent(char *fname); int fsrprintf(const char *fmt, ...); @@ -888,7 +888,7 @@ fsrfile_common( xfs_bstat_t *statp) { int error; - struct statvfs64 vfss; + struct statvfs vfss; struct fsxattr fsx; unsigned long bsize; @@ -940,7 +940,7 @@ fsrfile_common( * Note that xfs_bstat.bs_blksize returns the filesystem blocksize, * not the optimal I/O size as struct stat. */ - if (statvfs64(fsname ? fsname : fname, &vfss) < 0) { + if (statvfs(fsname ? fsname : fname, &vfss) < 0) { fsrprintf(_("unable to get fs stat on %s: %s\n"), fname, strerror(errno)); return -1; @@ -1700,7 +1700,7 @@ xfs_getgeom(int fd, xfs_fsop_geom_v1_t * fsgeom) * Get xfs realtime space information */ int -xfs_getrt(int fd, struct statvfs64 *sfbp) +xfs_getrt(int fd, struct statvfs *sfbp) { unsigned long bsize; unsigned long factor; diff --git a/include/darwin.h b/include/darwin.h index fb13915..495b44b 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -216,7 +216,6 @@ static inline int timer_gettime (timer_t timerid, struct itimerspec *value) # include #include #include -#define statvfs64 statfs #define _PATH_MOUNTED "/etc/mtab" struct mntent -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:26:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 959617CA0 for ; Sat, 13 Aug 2016 12:26:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 589888F8033 for ; Sat, 13 Aug 2016 10:26:03 -0700 (PDT) X-ASG-Debug-ID: 1471109160-0bf8151be4101090001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id v32BBlSOikDQ8xms (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:26:01 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id D52DC20449 for ; Sat, 13 Aug 2016 19:25:59 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDl2Dzlz104L for ; Sat, 13 Aug 2016 19:25:59 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:25:02 +0200 Resent-Message-ID: <20160813172502.GK3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <663326cb534467d534360d23acb02dc535caa909.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sat, 13 Aug 2016 18:03:16 +0200 Subject: [PATCHv2 xfsprogs 13/14] xfs.h: require transparent LFS for all users To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 13/14] xfs.h: require transparent LFS for all users X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109160 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 693 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Since our interfaces depend on the consistent use of a 64bit offset type, force downstreams to use transparent LFS (_FILE_OFFSET_BITS=64), so that it becomes impossible for them to use 32bit interfaces. Signed-off-by: Felix Janda --- include/xfs.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/xfs.h b/include/xfs.h index 7bed957..0a294f0 100644 --- a/include/xfs.h +++ b/include/xfs.h @@ -48,6 +48,11 @@ #endif /* + * make sure that any user of the xfs headers has a 64bit off_t type + */ +extern int xfs_assert_largefile[sizeof(off_t)-8]; + +/* * sparse kernel source annotations */ #ifndef __user -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:26:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 33EBE7CD7 for ; Sat, 13 Aug 2016 12:26:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED34D8F8033 for ; Sat, 13 Aug 2016 10:26:05 -0700 (PDT) X-ASG-Debug-ID: 1471109163-0bf57c136a5d7eb0001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id OdIAUJyYMY4XMD85 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:26:04 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 69C8F20068 for ; Sat, 13 Aug 2016 19:26:03 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTDp6cgrzydk for ; Sat, 13 Aug 2016 19:26:02 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:25:06 +0200 Resent-Message-ID: <20160813172506.GL3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: <8c3a172343f01752db2510c3374a904591708728.1471107858.git.felix.janda@posteo.de> In-Reply-To: References: From: Felix Janda Date: Sun, 7 Aug 2016 07:52:09 +0200 Subject: [PATCHv2 xfsprogs 14/14] platform: remove use of off64_t To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 14/14] platform: remove use of off64_t X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109164 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1877 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Since we force transparent LFS it can be replaced by off_t. Signed-off-by: Felix Janda --- include/darwin.h | 1 - include/freebsd.h | 1 - include/irix.h | 2 +- include/linux.h | 2 +- 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/include/darwin.h b/include/darwin.h index 495b44b..418d90a 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -134,7 +134,6 @@ typedef signed long long int __s64; #define __uint16_t u_int16_t #define __uint32_t u_int32_t #define __uint64_t u_int64_t -#define off64_t off_t typedef off_t xfs_off_t; typedef u_int64_t xfs_ino_t; diff --git a/include/freebsd.h b/include/freebsd.h index df924ef..93a9204 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -41,7 +41,6 @@ #define EFSBADCRC 991 /* Bad CRC detected */ typedef off_t xfs_off_t; -typedef off_t off64_t; typedef __uint64_t xfs_ino_t; typedef __uint32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; diff --git a/include/irix.h b/include/irix.h index b92e01b..a212505 100644 --- a/include/irix.h +++ b/include/irix.h @@ -43,7 +43,7 @@ #define __int16_t short #define __uint8_t unsigned char #define __uint16_t unsigned short -typedef off64_t xfs_off_t; +typedef off_t xfs_off_t; typedef __int64_t xfs_ino_t; typedef __int32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; diff --git a/include/linux.h b/include/linux.h index 5614719..ed388ea 100644 --- a/include/linux.h +++ b/include/linux.h @@ -137,7 +137,7 @@ platform_discard_blocks(int fd, uint64_t start, uint64_t len) #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ #define EFSBADCRC EBADMSG /* Bad CRC detected */ -typedef off64_t xfs_off_t; +typedef off_t xfs_off_t; typedef __uint64_t xfs_ino_t; typedef __uint32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; -- 2.7.3 From felix.janda@posteo.de Sat Aug 13 12:26:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 669C17CAF for ; Sat, 13 Aug 2016 12:26:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 38B45304048 for ; Sat, 13 Aug 2016 10:26:34 -0700 (PDT) X-ASG-Debug-ID: 1471109191-0bf57b369d6880c0001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id mTjhqz4UGalIFF8z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 10:26:32 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 1D9C320449 for ; Sat, 13 Aug 2016 19:26:30 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sBTFK4SNBz104L for ; Sat, 13 Aug 2016 19:26:29 +0200 (CEST) Resent-From: Felix Janda Resent-Date: Sat, 13 Aug 2016 19:25:33 +0200 Resent-Message-ID: <20160813172533.GM3858@nyan> Resent-To: xfs@oss.sgi.com Message-Id: In-Reply-To: References: From: Felix Janda Date: Sat, 13 Aug 2016 18:50:28 +0200 Subject: [PATCHv2 xfsprogs 02/14] configure: error out when LFS does not work To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCHv2 xfsprogs 02/14] configure: error out when LFS does not work X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471109191 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1103 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Felix Janda --- configure.ac | 1 + m4/package_libcdev.m4 | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/configure.ac b/configure.ac index 8fa96a5..ed75d62 100644 --- a/configure.ac +++ b/configure.ac @@ -108,6 +108,7 @@ AC_MULTILIB($enable_lib64) AC_RT($enable_librt) AC_SYS_LARGEFILE +AC_NEED_LFS AC_PACKAGE_NEED_UUID_H AC_PACKAGE_NEED_UUIDCOMPARE diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 7a847e9..6c94475 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -265,3 +265,19 @@ AC_DEFUN([AC_HAVE_MREMAP], ) AC_SUBST(have_mremap) ]) + +# +# Check if transparent LFS is enabled +# +AC_DEFUN([AC_NEED_LFS], + [ AC_MSG_CHECKING([whether large file support works]) + AC_TRY_COMPILE([ +#include + ], [ + int i[sizeof(off_t)-8]; + ], AC_MSG_RESULT(yes), + [AC_MSG_RESULT(no) + echo + echo 'FATAL ERROR: C library does not support transparent LFS.' + exit 1]) + ]) -- 2.7.3 From david@fromorbit.com Sat Aug 13 18:04:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 600777CA0 for ; Sat, 13 Aug 2016 18:04:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DA89BAC001 for ; Sat, 13 Aug 2016 16:04:52 -0700 (PDT) X-ASG-Debug-ID: 1471129488-0bf8151be1109b50001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 6po1zAnMo5EZfgzG for ; Sat, 13 Aug 2016 16:04:49 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AncSACemr1d5LDUCEGdsb2JhbABeg0SBUoZynTsGjGaKG4YXBAICgTVNAgEBAQEBAgYBAQEBAQEBATdAhF8BBTocIxAIAw4KCRoLDwUlAwcaE4gwwE0BAQEBAQEEAQEBAQEiHoVEhRWHbIIvBZk+jwyPTYw3g3iDGYFHKjKHDAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 14 Aug 2016 08:34:27 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bYhyd-0006gb-2y; Sun, 14 Aug 2016 09:04:27 +1000 Date: Sun, 14 Aug 2016 09:04:27 +1000 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: generic/224 triggers infinite "page discard on page xxx" on 512 block size XFS with 4.8-rc1 kernel Message-ID: <20160813230426.GC16044@dastard> X-ASG-Orig-Subj: Re: generic/224 triggers infinite "page discard on page xxx" on 512 block size XFS with 4.8-rc1 kernel References: <20160813073839.GY27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160813073839.GY27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471129489 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1351 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Aug 13, 2016 at 03:38:39PM +0800, Eryu Guan wrote: > Hi all, > > I've hit generic/224 flooding dmesg on 512 block size XFS, 4.8-rc1 > kernel, with the following message: > > ... > [ 98.146091] XFS (sda6): page discard on page ffffea0002f7e780, inode 0xe3a87, offset 1085214720. > [ 98.147431] XFS (sda6): page discard on page ffffea00023c3800, inode 0xe3a87, offset 1085218816. > [ 98.148743] XFS (sda6): page discard on page ffffea0002247700, inode 0xe3a87, offset 1085222912. > [ 98.150136] XFS (sda6): page discard on page ffffea0002f8d000, inode 0xe3a87, offset 1085227008. > [ 98.151496] XFS (sda6): page discard on page ffffea0002c58840, inode 0xe3a87, offset 1085231104. > [ 98.152794] XFS (sda6): page discard on page ffffea0002e65340, inode 0xe3a87, offset 1085235200. > ... > > The inode number is always the same, only the page address and offset > are changing. > > This is triggered by this dd command in generic/224: > > dd if=/dev/zero of=$SCRATCH_MNT/testfile.$i bs=4k conv=notrunc > > and it won't return until you kill it. It's not infinite. It just does it for every page and 1000 processes all trying to write 256,000 pages is a lot.... We have a fix pending for it and I'm aiming to get it to Linus later this week. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 13 18:43:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E7A0C7CA0 for ; Sat, 13 Aug 2016 18:43:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9E0ED30404E for ; Sat, 13 Aug 2016 16:43:08 -0700 (PDT) X-ASG-Debug-ID: 1471131787-0bf8151be110b330001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id jRZu3bVD0JSDCfGq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 13 Aug 2016 16:43:07 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [107.17.164.165] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYia2-0006LD-EX; Sat, 13 Aug 2016 23:43:06 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Dave Chinner Subject: [PATCH 3/7] iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag Date: Sat, 13 Aug 2016 16:42:57 -0700 X-ASG-Orig-Subj: [PATCH 3/7] iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag Message-Id: <1471131781-14107-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471131781-14107-1-git-send-email-hch@lst.de> References: <1471131781-14107-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471131787 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 908 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 From: Dave Chinner The flag is checked as supported, but then we do an unconditional sync of the file, regardless of whether the flag is set or not. Make the sync conditional on having the FIEMAP_FLAG_SYNC flag set. Signed-off-by: Dave Chinner --- fs/iomap.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/fs/iomap.c b/fs/iomap.c index 74712e2..56c19e6 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -467,9 +467,11 @@ int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, if (ret) return ret; - ret = filemap_write_and_wait(inode->i_mapping); - if (ret) - return ret; + if (fi->fi_flags & FIEMAP_FLAG_SYNC) { + ret = filemap_write_and_wait(inode->i_mapping); + if (ret) + return ret; + } while (len > 0) { ret = iomap_apply(inode, start, len, 0, ops, &ctx, -- 2.1.4 From BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 13 18:43:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6B7217CA2 for ; Sat, 13 Aug 2016 18:43:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D695AAC002 for ; Sat, 13 Aug 2016 16:43:08 -0700 (PDT) X-ASG-Debug-ID: 1471131785-0bf57c13675e1dd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id bFL6CtogqO4WLUB5 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 13 Aug 2016 16:43:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [107.17.164.165] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYia0-0006L5-VH for xfs@oss.sgi.com; Sat, 13 Aug 2016 23:43:05 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/7] iomap: remove superflous mark_page_accessed from iomap_write_actor Date: Sat, 13 Aug 2016 16:42:55 -0700 X-ASG-Orig-Subj: [PATCH 1/7] iomap: remove superflous mark_page_accessed from iomap_write_actor Message-Id: <1471131781-14107-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471131781-14107-1-git-send-email-hch@lst.de> References: <1471131781-14107-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471131785 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 631 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This catches up with commit 2457ae ("mm: non-atomically mark page accessed during page cache allocation where possible"), which moved the initial access marking into the pagecache allocator. Signed-off-by: Christoph Hellwig --- fs/iomap.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fs/iomap.c b/fs/iomap.c index 48141b8..f39c318 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -199,7 +199,6 @@ again: pagefault_enable(); flush_dcache_page(page); - mark_page_accessed(page); status = iomap_write_end(inode, pos, bytes, copied, page); if (unlikely(status < 0)) -- 2.1.4 From BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 13 18:43:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 16D0C7CA1 for ; Sat, 13 Aug 2016 18:43:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF0FF304051 for ; Sat, 13 Aug 2016 16:43:08 -0700 (PDT) X-ASG-Debug-ID: 1471131787-0bf8151be310b340001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QrJL6xub5Cj1q7h7 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 13 Aug 2016 16:43:07 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [107.17.164.165] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYia3-0006LG-63; Sat, 13 Aug 2016 23:43:07 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Dave Chinner Subject: [PATCH 4/7] iomap: prepare iomap_fiemap for attribute mappings Date: Sat, 13 Aug 2016 16:42:58 -0700 X-ASG-Orig-Subj: [PATCH 4/7] iomap: prepare iomap_fiemap for attribute mappings Message-Id: <1471131781-14107-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471131781-14107-1-git-send-email-hch@lst.de> References: <1471131781-14107-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471131787 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 794 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 From: Dave Chinner By bassing through an -ENOENT, similar to the old XFS implementation of FIEMAP_FLAG_XATTR. Signed-off-by: Dave Chinner [hch: split from a larger patch] Signed-off-by: Christoph Hellwig --- fs/iomap.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/iomap.c b/fs/iomap.c index 56c19e6..d9d1f50 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -476,6 +476,9 @@ int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, while (len > 0) { ret = iomap_apply(inode, start, len, 0, ops, &ctx, iomap_fiemap_actor); + /* inode with no (attribute) mapping will give ENOENT */ + if (ret == -ENOENT) + break; if (ret < 0) return ret; if (ret == 0) -- 2.1.4 From BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 13 18:43:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E3F87CA0 for ; Sat, 13 Aug 2016 18:43:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11D22AC004 for ; Sat, 13 Aug 2016 16:43:10 -0700 (PDT) X-ASG-Debug-ID: 1471131784-0bf57c13685e1dd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wEsGUtxg18s4HGTF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 13 Aug 2016 16:43:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [107.17.164.165] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYia0-0006L1-6V for xfs@oss.sgi.com; Sat, 13 Aug 2016 23:43:04 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: first set of iomap fix Date: Sat, 13 Aug 2016 16:42:54 -0700 X-ASG-Orig-Subj: first set of iomap fix Message-Id: <1471131781-14107-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471131785 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 391 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This contains various fixes for the iomap path for 4.8, but it skips the changes to the delalloc path (which aren't really about the iomap path itself anyway). Two fixes to make the iomap buffered write path catch up with changes to the filemap one. Then I've cherry picked the FIEMAP_FLAG_SYNC patch from Dave, and added my version of re-implementing FIEMAP_FLAG_XATTR as well. From BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 13 18:43:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A54117CA1 for ; Sat, 13 Aug 2016 18:43:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 784FC8F8064 for ; Sat, 13 Aug 2016 16:43:10 -0700 (PDT) X-ASG-Debug-ID: 1471131788-0bf57b369d691ff0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Yt6LdAtu7UpJAPMD (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 13 Aug 2016 16:43:09 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [107.17.164.165] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYia3-0006LN-U7 for xfs@oss.sgi.com; Sat, 13 Aug 2016 23:43:08 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 5/7] iomap: mark ->iomap_end as optional Date: Sat, 13 Aug 2016 16:42:59 -0700 X-ASG-Orig-Subj: [PATCH 5/7] iomap: mark ->iomap_end as optional Message-Id: <1471131781-14107-6-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471131781-14107-1-git-send-email-hch@lst.de> References: <1471131781-14107-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471131788 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 816 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 No need to implement it for read-only mappings. Signed-off-by: Christoph Hellwig --- fs/iomap.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/iomap.c b/fs/iomap.c index d9d1f50..0342254 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -84,8 +84,11 @@ iomap_apply(struct inode *inode, loff_t pos, loff_t length, unsigned flags, * Now the data has been copied, commit the range we've copied. This * should not fail unless the filesystem has had a fatal error. */ - ret = ops->iomap_end(inode, pos, length, written > 0 ? written : 0, - flags, &iomap); + if (ops->iomap_end) { + ret = ops->iomap_end(inode, pos, length, + written > 0 ? written : 0, + flags, &iomap); + } return written ? written : ret; } -- 2.1.4 From BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 13 18:43:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D6F87CA3 for ; Sat, 13 Aug 2016 18:43:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1FCF88F8064 for ; Sat, 13 Aug 2016 16:43:11 -0700 (PDT) X-ASG-Debug-ID: 1471131789-0bf8151be410b350001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 6akhNyKC4A9C5rRF (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 13 Aug 2016 16:43:09 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [107.17.164.165] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYia5-0006Lb-Ds for xfs@oss.sgi.com; Sat, 13 Aug 2016 23:43:09 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 7/7] xfs: (re-)implement FIEMAP_FLAG_XATTR Date: Sat, 13 Aug 2016 16:43:01 -0700 X-ASG-Orig-Subj: [PATCH 7/7] xfs: (re-)implement FIEMAP_FLAG_XATTR Message-Id: <1471131781-14107-8-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471131781-14107-1-git-send-email-hch@lst.de> References: <1471131781-14107-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471131789 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2788 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Use a special read-only iomap_ops implementation to support fiemap on the attr fork. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_iomap.h | 1 + fs/xfs/xfs_iops.c | 9 ++++++++- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 1cce760..697c8fd 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -1106,3 +1106,48 @@ struct iomap_ops xfs_iomap_ops = { .iomap_begin = xfs_file_iomap_begin, .iomap_end = xfs_file_iomap_end, }; + +static int +xfs_xattr_iomap_begin( + struct inode *inode, + loff_t offset, + loff_t length, + unsigned flags, + struct iomap *iomap) +{ + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); + xfs_fileoff_t end_fsb = XFS_B_TO_FSB(mp, offset + length); + struct xfs_bmbt_irec imap; + int nimaps = 1, error = 0; + unsigned lockmode; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + lockmode = xfs_ilock_data_map_shared(ip); + + /* if there are no attribute fork or extents, return ENOENT */ + if (XFS_IFORK_Q(ip) || !ip->i_d.di_anextents) { + error = -ENOENT; + goto out_unlock; + } + + ASSERT(ip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL); + error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, + &nimaps, XFS_BMAPI_ENTIRE | XFS_BMAPI_ATTRFORK); +out_unlock: + xfs_iunlock(ip, lockmode); + + if (!error) { + ASSERT(nimaps); + xfs_bmbt_to_iomap(ip, iomap, &imap); + } + + return error; +} + +struct iomap_ops xfs_xattr_iomap_ops = { + .iomap_begin = xfs_xattr_iomap_begin, +}; diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index e066d04..fb8aca3 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -35,5 +35,6 @@ void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *, struct xfs_bmbt_irec *); extern struct iomap_ops xfs_iomap_ops; +extern struct iomap_ops xfs_xattr_iomap_ops; #endif /* __XFS_IOMAP_H__*/ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ab820f8..b24c310 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1009,7 +1009,14 @@ xfs_vn_fiemap( int error; xfs_ilock(XFS_I(inode), XFS_IOLOCK_SHARED); - error = iomap_fiemap(inode, fieinfo, start, length, &xfs_iomap_ops); + if (fieinfo->fi_flags & FIEMAP_FLAG_XATTR) { + fieinfo->fi_flags &= ~FIEMAP_FLAG_XATTR; + error = iomap_fiemap(inode, fieinfo, start, length, + &xfs_xattr_iomap_ops); + } else { + error = iomap_fiemap(inode, fieinfo, start, length, + &xfs_iomap_ops); + } xfs_iunlock(XFS_I(inode), XFS_IOLOCK_SHARED); return error; -- 2.1.4 From BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 13 18:43:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A75C07CAE for ; Sat, 13 Aug 2016 18:43:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6DED68F8066 for ; Sat, 13 Aug 2016 16:43:08 -0700 (PDT) X-ASG-Debug-ID: 1471131786-0bf57c136a5e1de0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wpdIXDbjpesuU9cp (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 13 Aug 2016 16:43:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [107.17.164.165] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYia1-0006L9-Mt for xfs@oss.sgi.com; Sat, 13 Aug 2016 23:43:05 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/7] iomap: remove superflous pagefault_disable from iomap_write_actor Date: Sat, 13 Aug 2016 16:42:56 -0700 X-ASG-Orig-Subj: [PATCH 2/7] iomap: remove superflous pagefault_disable from iomap_write_actor Message-Id: <1471131781-14107-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471131781-14107-1-git-send-email-hch@lst.de> References: <1471131781-14107-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471131786 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 668 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 iov_iter_copy_from_user_atomic disableѕ page fauls internal, no need to do it around the call. This also brings the iomap code in line with the original filemap version. Signed-off-by: Christoph Hellwig --- fs/iomap.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/fs/iomap.c b/fs/iomap.c index f39c318..74712e2 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -194,9 +194,7 @@ again: if (mapping_writably_mapped(inode->i_mapping)) flush_dcache_page(page); - pagefault_disable(); copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes); - pagefault_enable(); flush_dcache_page(page); -- 2.1.4 From BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org Sat Aug 13 18:43:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A70ED7CA7 for ; Sat, 13 Aug 2016 18:43:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29AD2AC004 for ; Sat, 13 Aug 2016 16:43:11 -0700 (PDT) X-ASG-Debug-ID: 1471131788-0bf57c13695e1de0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id pOepNsX2nuujrCmA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 13 Aug 2016 16:43:09 -0700 (PDT) X-Barracuda-Envelope-From: BATV+fd833f2f3672df8437a5+4738+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [107.17.164.165] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bYia4-0006LX-M8 for xfs@oss.sgi.com; Sat, 13 Aug 2016 23:43:08 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 6/7] xfs: simplify xfs_file_iomap_begin Date: Sat, 13 Aug 2016 16:43:00 -0700 X-ASG-Orig-Subj: [PATCH 6/7] xfs: simplify xfs_file_iomap_begin Message-Id: <1471131781-14107-7-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471131781-14107-1-git-send-email-hch@lst.de> References: <1471131781-14107-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471131789 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1622 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31992 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 We'll never get nimap == 0 for a successful return from xfs_bmapi_read, so don't try to handle it. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 14 ++++---------- fs/xfs/xfs_trace.h | 1 - 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 2114d53..1cce760 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -1037,20 +1037,14 @@ xfs_file_iomap_begin( return error; trace_xfs_iomap_alloc(ip, offset, length, 0, &imap); - xfs_bmbt_to_iomap(ip, iomap, &imap); - } else if (nimaps) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); - trace_xfs_iomap_found(ip, offset, length, 0, &imap); - xfs_bmbt_to_iomap(ip, iomap, &imap); } else { + ASSERT(nimaps); + xfs_iunlock(ip, XFS_ILOCK_EXCL); - trace_xfs_iomap_not_found(ip, offset, length, 0, &imap); - iomap->blkno = IOMAP_NULL_BLOCK; - iomap->type = IOMAP_HOLE; - iomap->offset = offset; - iomap->length = length; + trace_xfs_iomap_found(ip, offset, length, 0, &imap); } + xfs_bmbt_to_iomap(ip, iomap, &imap); return 0; } diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 551b7e2..7e88bec 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1298,7 +1298,6 @@ DEFINE_IOMAP_EVENT(xfs_get_blocks_alloc); DEFINE_IOMAP_EVENT(xfs_get_blocks_map_direct); DEFINE_IOMAP_EVENT(xfs_iomap_alloc); DEFINE_IOMAP_EVENT(xfs_iomap_found); -DEFINE_IOMAP_EVENT(xfs_iomap_not_found); DECLARE_EVENT_CLASS(xfs_simple_io_class, TP_PROTO(struct xfs_inode *ip, xfs_off_t offset, ssize_t count), -- 2.1.4 From zlang@redhat.com Sat Aug 13 22:15:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 566DF7CA0 for ; Sat, 13 Aug 2016 22:15:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2D714AC008 for ; Sat, 13 Aug 2016 20:15:46 -0700 (PDT) X-ASG-Debug-ID: 1471144540-0bf57b369b695e10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id H8VDHLVx9V8gkyDR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 13 Aug 2016 20:15:41 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 63B95C05681B for ; Sun, 14 Aug 2016 03:15:40 +0000 (UTC) Received: from localhost (dhcp-12-196.nay.redhat.com [10.66.12.196]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7E3FdYv008401; Sat, 13 Aug 2016 23:15:39 -0400 Date: Sun, 14 Aug 2016 11:15:38 +0800 From: Zorro Lang To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH V4] xfs_db: add crc manipulation commands Message-ID: <20160814031538.GB32013@zlang.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH V4] xfs_db: add crc manipulation commands References: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Sun, 14 Aug 2016 03:15:40 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471144541 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7779 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 12, 2016 at 06:30:03PM -0500, Eric Sandeen wrote: > This adds a new "crc" command to xfs_db for CRC-enabled filesystems. > > If a structure has a CRC field, we can validate it, invalidate/corrupt > it, or revalidate/rewrite it: > > xfs_db> sb 0 > xfs_db> crc -v > crc = 0x796c814f (correct) > xfs_db> crc -i > Metadata CRC error detected at block 0x0/0x200 > crc = 0x796c8150 (bad) > xfs_db> crc -r > crc = 0x796c814f (correct) > > (-i and -r require "expert" write-capable mode) > > This requires temporarily replacing the write verifier with > a dummy which won't recalculate the CRC on the way to disk. > > It also required me to write a new flist function, which is > totally foreign to me, so hopefully done right - but it seems > to work here. > > Signed-off-by: Eric Sandeen > --- > > I found this very useful when working with a filesystem image > which was consistent except for a corrupt CRC; the ability to > rewrite the correct CRCs and run repair to validate the fs was > very handy... Hi Eric, I agree that this feature is very useful when some hardware or software problems make a bad CRC value. But is this patch a completed patch? For example, flist_find_ftyp is created by this patch, by I can't find where is it called in this patch. I checked your original V1 patch: https://www.marc.info/?l=linux-xfs&m=142662442506252&w=3 It has more content than this. Should I read/merge this patch with other patches together? Thanks, Zorro > > V2: Fix whitespace damage, clarify write_cur() changes > a bit w/ code & comments. > > V3: Be a bit more verbose with command output > > V4: Rebase patch to current tree > > diff --git a/db/Makefile b/db/Makefile > index 8260da3..ba4b1a8 100644 > --- a/db/Makefile > +++ b/db/Makefile > @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs > LTCOMMAND = xfs_db > > HFILES = addr.h agf.h agfl.h agi.h attr.h attrshort.h bit.h block.h bmap.h \ > - btblock.h bmroot.h check.h command.h convert.h debug.h \ > + btblock.h bmroot.h check.h command.h convert.h crc.h debug.h \ > dir2.h dir2sf.h dquot.h echo.h faddr.h field.h \ > flist.h fprint.h frag.h freesp.h hash.h help.h init.h inode.h input.h \ > io.h logformat.h malloc.h metadump.h output.h print.h quit.h sb.h \ > diff --git a/db/command.c b/db/command.c > index 3c17a1e..1848d64 100644 > --- a/db/command.c > +++ b/db/command.c > @@ -49,6 +49,7 @@ > #include "write.h" > #include "malloc.h" > #include "dquot.h" > +#include "crc.h" > > cmdinfo_t *cmdtab; > int ncmds; > @@ -124,6 +125,7 @@ init_commands(void) > bmap_init(); > check_init(); > convert_init(); > + crc_init(); > debug_init(); > echo_init(); > frag_init(); > diff --git a/db/flist.c b/db/flist.c > index 84065a2..2530baf 100644 > --- a/db/flist.c > +++ b/db/flist.c > @@ -411,6 +411,40 @@ flist_split( > return v; > } > > +/* > + * Given a set of fields, scan for a field of the given type. > + * Return an flist leading to the first found field > + * of that type. > + * Return NULL if no field of the given type is found. > + */ > +flist_t * > +flist_find_ftyp( > + const field_t *fields, > + fldt_t type) > +{ > + flist_t *fl; > + const field_t *f; > + const ftattr_t *fa; > + > + for (f = fields; f->name; f++) { > + fl = flist_make(f->name); > + fl->fld = f; > + if (f->ftyp == type) > + return fl; > + fa = &ftattrtab[f->ftyp]; > + if (fa->subfld) { > + flist_t *nfl; > + nfl = flist_find_ftyp(fa->subfld, type); > + if (nfl) { > + fl->child = nfl; > + return fl; > + } > + } > + flist_free(fl); > + } > + return NULL; > +} > + > static void > ftok_free( > ftok_t *ft) > diff --git a/db/flist.h b/db/flist.h > index 5c9fba0..3f4b312 100644 > --- a/db/flist.h > +++ b/db/flist.h > @@ -37,3 +37,4 @@ extern int flist_parse(const struct field *fields, flist_t *fl, void *obj, > int startoff); > extern void flist_print(flist_t *fl); > extern flist_t *flist_scan(char *name); > +extern flist_t *flist_find_ftyp(const field_t *fields, fldt_t type); > diff --git a/db/io.c b/db/io.c > index 91cab12..56b4414 100644 > --- a/db/io.c > +++ b/db/io.c > @@ -27,6 +27,7 @@ > #include "output.h" > #include "init.h" > #include "malloc.h" > +#include "crc.h" > > static int pop_f(int argc, char **argv); > static void pop_help(void); > @@ -473,12 +474,14 @@ xfs_verify_recalc_crc( > void > write_cur(void) > { > + int skip_crc = (iocur_top->bp->b_ops->verify_write == xfs_dummy_verify); > + > if (iocur_sp < 0) { > dbprintf(_("nothing to write\n")); > return; > } > > - if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf) { > + if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf && !skip_crc) { > libxfs_dinode_calc_crc(mp, iocur_top->data); > iocur_top->ino_crc_ok = 1; > } > @@ -489,6 +492,19 @@ write_cur(void) > write_cur_bbs(); > else > write_cur_buf(); > + > + /* If we didn't write the crc automatically, re-check validity */ > + if (iocur_top->ino_buf && skip_crc) { > + xfs_dinode_t *dip; > + xfs_ino_t ino; > + > + dip = iocur_top->data; > + ino = iocur_top->ino; > + iocur_top->ino_crc_ok = xfs_verify_cksum((char *)dip, > + mp->m_sb.sb_inodesize, > + XFS_DINODE_CRC_OFF); > + } > + > } > > void > diff --git a/db/write.h b/db/write.h > index 31e2665..664ddcc 100644 > --- a/db/write.h > +++ b/db/write.h > @@ -20,5 +20,5 @@ struct field; > > extern void write_init(void); > extern void write_block(const field_t *fields, int argc, char **argv); > -extern void write_string(const field_t *fields, int argc, char **argv); > extern void write_struct(const field_t *fields, int argc, char **argv); > +extern void write_string(const field_t *fields, int argc, char **argv); > diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 > index ff8f862..894a94e 100644 > --- a/man/man8/xfs_db.8 > +++ b/man/man8/xfs_db.8 > @@ -87,16 +87,14 @@ or > .I filename > read-only. This option is required if the filesystem is mounted. > It is only necessary to omit this flag if a command that changes data > -.RB ( write ", " blocktrash ) > +.RB ( write ", " blocktrash ", " crc ) > is to be used. > .TP > .B \-x > Specifies expert mode. > This enables the > -.B write > -and > -.B blocktrash > -commands. > +.RB ( write ", " blocktrash ", " crc > +invalidate/revalidate) commands. > .TP > .B \-V > Prints the version number and exits. > @@ -422,6 +420,25 @@ conversions such as > .I agb > .BR fsblock . > .TP > +.B crc [\-i|\-r|\-v] > +Invalidates, revalidates, or validates the CRC (checksum) > +field of the current structure, if it has one. > +This command is available only on CRC-enabled filesystems. > +With no argument, validation is performed. > +Each command will display the resulting CRC value and state. > +.RS 1.0i > +.TP 0.4i > +.B \-i > +Invalidate the structure's CRC value (incrementing it by one), > +and write it to disk. > +.TP > +.B \-r > +Recalculate the current structure's correct CRC value, and write it to disk. > +.TP > +.B \-v > +Validate and display the current value and state of the structure's CRC. > +.RE > +.TP > .BI "daddr [" d ] > Set current address to the daddr (512 byte block) given by > .IR d . > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From root@accordenaccouds.eu Sun Aug 14 00:35:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=HTML_IMAGE_ONLY_08, HTML_MESSAGE,MIME_HTML_MOSTLY,MPART_ALT_DIFF autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 05E267CA0 for ; Sun, 14 Aug 2016 00:35:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C6CF28F8068 for ; Sat, 13 Aug 2016 22:35:47 -0700 (PDT) X-ASG-Debug-ID: 1471152945-0bf57b369b699110001-NocioJ Received: from accordenaccouds.eu (52.194.37.104.in-addr.arpa [104.37.194.52]) by cuda.sgi.com with ESMTP id 6kOJkwENsZs6fnCL for ; Sat, 13 Aug 2016 22:35:45 -0700 (PDT) X-Barracuda-Envelope-From: root@accordenaccouds.eu X-Barracuda-Effective-Source-IP: 52.194.37.104.in-addr.arpa[104.37.194.52] X-Barracuda-Apparent-Source-IP: 104.37.194.52 Received: from crditagrolaisation (unknown [104.37.194.225]) by accordenaccouds.eu (Postfix) with SMTP id 8560B5D218 for ; Sun, 14 Aug 2016 05:20:15 +0000 (UTC) X-GEPFBL: eGZzQG9zcy5zZ2kuY29t Organization: accordenaccouds.eu Reply-To: root@accordenaccouds.eu Message-ID: From: "Accord" To: Subject: Les achats par C.B. Date: Sun, 14 Aug 2016 05:20:14 -0000 X-ASG-Orig-Subj: Les achats par C.B. MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_983890D" X-Barracuda-Connect: 52.194.37.104.in-addr.arpa[104.37.194.52] X-Barracuda-Start-Time: 1471152945 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 705 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.53 X-Barracuda-Spam-Status: No, SCORE=2.53 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_IMAGE_ONLY_08, HTML_IMAGE_ONLY_08_2, HTML_MESSAGE, MIME_HTML_MOSTLY, MPART_ALT_DIFF, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31998 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_MOSTLY BODY: Multipart message mostly text/html MIME 0.00 HTML_IMAGE_ONLY_08 BODY: HTML: images with 400-800 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 1.78 HTML_IMAGE_ONLY_08_2 HTML: images with 400-800 bytes of words 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=SPLITOR00A_001_983890D Content-Type: text/plain; charset="WINDOWS-1252" Content-Transfer-Encoding: quoted-printable ------=SPLITOR00A_001_983890D Content-Type: text/html; charset="WINDOWS-1252" Content-Transfer-Encoding: quoted-printable
3D""
3D""
3D""
------=SPLITOR00A_001_983890D-- From david@fromorbit.com Sun Aug 14 01:33:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EA27C7CA0 for ; Sun, 14 Aug 2016 01:33:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD4E58F807A for ; Sat, 13 Aug 2016 23:33:34 -0700 (PDT) X-ASG-Debug-ID: 1471156408-0bf57c13695e9c80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 3sV9PLMFOVNOH7mJ for ; Sat, 13 Aug 2016 23:33:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvUWAP8PsFd5LDUCEGdsb2JhbABeg0WBUoJ5g3mdNQEBAQEBAQaMZoobhhcEAgKBKk0CAQEBAQECBgEBAQEBAQEBN0CEXwEFOhwjEAgDDgoJJQ8FJQMHGhOIMMBVAQEIAgEkHoVEhRWHbIIvAQSZPo8Mj02MN4N4hGAqMoZyAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 14 Aug 2016 16:03:27 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bYoz8-00075z-OS; Sun, 14 Aug 2016 16:33:26 +1000 Date: Sun, 14 Aug 2016 16:33:26 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: first set of iomap fix Message-ID: <20160814063326.GD16044@dastard> X-ASG-Orig-Subj: Re: first set of iomap fix References: <1471131781-14107-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471131781-14107-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471156408 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 855 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.31999 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Aug 13, 2016 at 04:42:54PM -0700, Christoph Hellwig wrote: > This contains various fixes for the iomap path for 4.8, but it skips > the changes to the delalloc path (which aren't really about the iomap > path itself anyway). > > Two fixes to make the iomap buffered write path catch up with changes > to the filemap one. Then I've cherry picked the FIEMAP_FLAG_SYNC patch > from Dave, and added my version of re-implementing FIEMAP_FLAG_XATTR > as well. Thanks for the quick turnaround on these, Christoph. Your change for handling xattr mappings is simpler than the one I have - the optional ioend handling is definitely an improvement. At first glance I can't see anything obvious wrong with the patches - I'll give them a spin through QA and see what falls out... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Sun Aug 14 10:40:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B32F07CA2 for ; Sun, 14 Aug 2016 10:40:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7687D8F8094 for ; Sun, 14 Aug 2016 08:40:54 -0700 (PDT) X-ASG-Debug-ID: 1471189251-0bf57b369c6ad650001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 0Zyt7UGRSGZVMn2W for ; Sun, 14 Aug 2016 08:40:51 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [IPv6:2607:fb90:b28:69d1:c5b0:fc7a:2ca8:c4ca] (unknown [172.56.14.100]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8DD5F4440; Sun, 14 Aug 2016 10:40:50 -0500 (CDT) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (1.0) Subject: Re: [PATCH V4] xfs_db: add crc manipulation commands From: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH V4] xfs_db: add crc manipulation commands X-Mailer: iPhone Mail (13G35) In-Reply-To: <20160814031538.GB32013@zlang.usersys.redhat.com> Date: Sun, 14 Aug 2016 10:40:48 -0500 Cc: Eric Sandeen , xfs-oss Content-Transfer-Encoding: quoted-printable Message-Id: References: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> <20160814031538.GB32013@zlang.usersys.redhat.com> To: Zorro Lang X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471189251 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8569 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, INFO_TLD, MIME_QP_LONG_LINE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32006 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars > On Aug 13, 2016, at 10:15 PM, Zorro Lang wrote: >=20 >> On Fri, Aug 12, 2016 at 06:30:03PM -0500, Eric Sandeen wrote: >> This adds a new "crc" command to xfs_db for CRC-enabled filesystems. >>=20 >> If a structure has a CRC field, we can validate it, invalidate/corrupt >> it, or revalidate/rewrite it: >>=20 >> xfs_db> sb 0 >> xfs_db> crc -v >> crc =3D 0x796c814f (correct) >> xfs_db> crc -i >> Metadata CRC error detected at block 0x0/0x200 >> crc =3D 0x796c8150 (bad) >> xfs_db> crc -r >> crc =3D 0x796c814f (correct) >>=20 >> (-i and -r require "expert" write-capable mode) >>=20 >> This requires temporarily replacing the write verifier with >> a dummy which won't recalculate the CRC on the way to disk. >>=20 >> It also required me to write a new flist function, which is >> totally foreign to me, so hopefully done right - but it seems >> to work here. >>=20 >> Signed-off-by: Eric Sandeen >> ---=20 >>=20 >> I found this very useful when working with a filesystem image >> which was consistent except for a corrupt CRC; the ability to >> rewrite the correct CRCs and run repair to validate the fs was >> very handy... >=20 > Hi Eric, >=20 > I agree that this feature is very useful when some hardware or > software problems make a bad CRC value. But is this patch a completed > patch? >=20 > For example, flist_find_ftyp is created by this patch, by I can't find > where is it called in this patch. >=20 Argh somehow guilt did not pick up the new files. I will resend. Thanks, Eric > I checked your original V1 patch: > https://www.marc.info/?l=3Dlinux-xfs&m=3D142662442506252&w=3D3 >=20 > It has more content than this. Should I read/merge this patch with > other patches together? >=20 > Thanks, > Zorro >=20 >>=20 >> V2: Fix whitespace damage, clarify write_cur() changes >> a bit w/ code & comments. >>=20 >> V3: Be a bit more verbose with command output >>=20 >> V4: Rebase patch to current tree >>=20 >> diff --git a/db/Makefile b/db/Makefile >> index 8260da3..ba4b1a8 100644 >> --- a/db/Makefile >> +++ b/db/Makefile >> @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs >> LTCOMMAND =3D xfs_db >>=20 >> HFILES =3D addr.h agf.h agfl.h agi.h attr.h attrshort.h bit.h block.h bma= p.h \ >> - btblock.h bmroot.h check.h command.h convert.h debug.h \ >> + btblock.h bmroot.h check.h command.h convert.h crc.h debug.h \ >> dir2.h dir2sf.h dquot.h echo.h faddr.h field.h \ >> flist.h fprint.h frag.h freesp.h hash.h help.h init.h inode.h input.h \= >> io.h logformat.h malloc.h metadump.h output.h print.h quit.h sb.h \ >> diff --git a/db/command.c b/db/command.c >> index 3c17a1e..1848d64 100644 >> --- a/db/command.c >> +++ b/db/command.c >> @@ -49,6 +49,7 @@ >> #include "write.h" >> #include "malloc.h" >> #include "dquot.h" >> +#include "crc.h" >>=20 >> cmdinfo_t *cmdtab; >> int ncmds; >> @@ -124,6 +125,7 @@ init_commands(void) >> bmap_init(); >> check_init(); >> convert_init(); >> + crc_init(); >> debug_init(); >> echo_init(); >> frag_init(); >> diff --git a/db/flist.c b/db/flist.c >> index 84065a2..2530baf 100644 >> --- a/db/flist.c >> +++ b/db/flist.c >> @@ -411,6 +411,40 @@ flist_split( >> return v; >> } >>=20 >> +/* >> + * Given a set of fields, scan for a field of the given type. >> + * Return an flist leading to the first found field >> + * of that type. >> + * Return NULL if no field of the given type is found. >> + */ >> +flist_t * >> +flist_find_ftyp( >> + const field_t *fields, >> + fldt_t type) >> +{ >> + flist_t *fl; >> + const field_t *f; >> + const ftattr_t *fa; >> + >> + for (f =3D fields; f->name; f++) { >> + fl =3D flist_make(f->name); >> + fl->fld =3D f; >> + if (f->ftyp =3D=3D type) >> + return fl; >> + fa =3D &ftattrtab[f->ftyp]; >> + if (fa->subfld) { >> + flist_t *nfl; >> + nfl =3D flist_find_ftyp(fa->subfld, type); >> + if (nfl) { >> + fl->child =3D nfl; >> + return fl; >> + } >> + } >> + flist_free(fl); >> + } >> + return NULL; >> +} >> + >> static void >> ftok_free( >> ftok_t *ft) >> diff --git a/db/flist.h b/db/flist.h >> index 5c9fba0..3f4b312 100644 >> --- a/db/flist.h >> +++ b/db/flist.h >> @@ -37,3 +37,4 @@ extern int flist_parse(const struct field *fields, f= list_t *fl, void *obj, >> int startoff); >> extern void flist_print(flist_t *fl); >> extern flist_t *flist_scan(char *name); >> +extern flist_t *flist_find_ftyp(const field_t *fields, fldt_t type);= >> diff --git a/db/io.c b/db/io.c >> index 91cab12..56b4414 100644 >> --- a/db/io.c >> +++ b/db/io.c >> @@ -27,6 +27,7 @@ >> #include "output.h" >> #include "init.h" >> #include "malloc.h" >> +#include "crc.h" >>=20 >> static int pop_f(int argc, char **argv); >> static void pop_help(void); >> @@ -473,12 +474,14 @@ xfs_verify_recalc_crc( >> void >> write_cur(void) >> { >> + int skip_crc =3D (iocur_top->bp->b_ops->verify_write =3D=3D xfs_dumm= y_verify); >> + >> if (iocur_sp < 0) { >> dbprintf(_("nothing to write\n")); >> return; >> } >>=20 >> - if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf) { >> + if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf && !skip_= crc) { >> libxfs_dinode_calc_crc(mp, iocur_top->data); >> iocur_top->ino_crc_ok =3D 1; >> } >> @@ -489,6 +492,19 @@ write_cur(void) >> write_cur_bbs(); >> else >> write_cur_buf(); >> + >> + /* If we didn't write the crc automatically, re-check validity */= >> + if (iocur_top->ino_buf && skip_crc) { >> + xfs_dinode_t *dip; >> + xfs_ino_t ino; >> + >> + dip =3D iocur_top->data; >> + ino =3D iocur_top->ino; >> + iocur_top->ino_crc_ok =3D xfs_verify_cksum((char *)dip, >> + mp->m_sb.sb_inodesize, >> + XFS_DINODE_CRC_OFF); >> + } >> + >> } >>=20 >> void >> diff --git a/db/write.h b/db/write.h >> index 31e2665..664ddcc 100644 >> --- a/db/write.h >> +++ b/db/write.h >> @@ -20,5 +20,5 @@ struct field; >>=20 >> extern void write_init(void); >> extern void write_block(const field_t *fields, int argc, char **argv);= >> -extern void write_string(const field_t *fields, int argc, char **argv= ); >> extern void write_struct(const field_t *fields, int argc, char **argv)= ; >> +extern void write_string(const field_t *fields, int argc, char **argv= ); >> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 >> index ff8f862..894a94e 100644 >> --- a/man/man8/xfs_db.8 >> +++ b/man/man8/xfs_db.8 >> @@ -87,16 +87,14 @@ or >> .I filename >> read-only. This option is required if the filesystem is mounted. >> It is only necessary to omit this flag if a command that changes data >> -.RB ( write ", " blocktrash ) >> +.RB ( write ", " blocktrash ", " crc ) >> is to be used. >> .TP >> .B \-x >> Specifies expert mode. >> This enables the >> -.B write >> -and >> -.B blocktrash >> -commands. >> +.RB ( write ", " blocktrash ", " crc >> +invalidate/revalidate) commands. >> .TP >> .B \-V >> Prints the version number and exits. >> @@ -422,6 +420,25 @@ conversions such as >> .I agb >> .BR fsblock . >> .TP >> +.B crc [\-i|\-r|\-v] >> +Invalidates, revalidates, or validates the CRC (checksum) >> +field of the current structure, if it has one. >> +This command is available only on CRC-enabled filesystems. >> +With no argument, validation is performed. >> +Each command will display the resulting CRC value and state. >> +.RS 1.0i >> +.TP 0.4i >> +.B \-i >> +Invalidate the structure's CRC value (incrementing it by one), >> +and write it to disk. >> +.TP >> +.B \-r >> +Recalculate the current structure's correct CRC value, and write it to d= isk. >> +.TP >> +.B \-v >> +Validate and display the current value and state of the structure's CRC.= >> +.RE >> +.TP >> .BI "daddr [" d ] >> Set current address to the daddr (512 byte block) given by >> .IR d . >>=20 >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >=20 > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs >=20 From prt@realitymod.com Sun Aug 14 11:06:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8ABB87CA2 for ; Sun, 14 Aug 2016 11:06:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0FD27AC00C for ; Sun, 14 Aug 2016 09:06:07 -0700 (PDT) X-ASG-Debug-ID: 1471190765-0bf8151be4125f30001-NocioJ Received: from www.realitymod.com (a2.33.374a.static.theplanet.com [74.55.51.162]) by cuda.sgi.com with ESMTP id I2DW5siWymS6BcRO (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 14 Aug 2016 09:06:05 -0700 (PDT) X-Barracuda-Envelope-From: prt@realitymod.com X-Barracuda-Effective-Source-IP: a2.33.374a.static.theplanet.com[74.55.51.162] X-Barracuda-Apparent-Source-IP: 74.55.51.162 Received: from www.realitymod.com (realitymod.com [127.0.0.1]) by www.realitymod.com (8.13.8/8.13.8) with ESMTP id u7EG4htD008729 for ; Sun, 14 Aug 2016 11:04:43 -0500 Received: (from apache@localhost) by www.realitymod.com (8.13.8/8.13.8/Submit) id u7EG4hGW008727; Sun, 14 Aug 2016 11:04:43 -0500 Date: Sun, 14 Aug 2016 11:04:43 -0500 X-Authentication-Warning: www.realitymod.com: apache set sender to prt@realitymod.com using -f To: xfs@oss.sgi.com Subject: Make $2500 a day Using mobile binary Tech From: "Project Reality Tournament Forums" X-ASG-Orig-Subj: Make $2500 a day Using mobile binary Tech Auto-Submitted: auto-generated Message-ID: <20160814160442.2427bfeae395@tournament.realitymod.com> MIME-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit X-Priority: 3 X-Mailer: vBulletin Mail via PHP X-Barracuda-Connect: a2.33.374a.static.theplanet.com[74.55.51.162] X-Barracuda-Start-Time: 1471190765 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 602 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.19 X-Barracuda-Spam-Status: No, SCORE=1.19 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=EARN_PER_WEEK X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32007 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.19 EARN_PER_WEEK Contains 'earn $something per week' Friend, This is a message from Rone Hwarris ( mailto: ) from the Project Reality Tournament Forums ( http://tournament.realitymod.com/ ). The message is as follows: Friend, Over 4,000 People Can't Be Wrong... This is Real... This is Honest... >> https:www.payzeno.com/a/profx/61 People Are Earning $2500 per day and more from home... No experience is necessary! Get all the information here: >> https:www.payzeno.com/a/profx/61 Have a great week, Rone Hwarris Project Reality Tournament Forums takes no responsibility for messages sent through its system. From sandeen@sandeen.net Sun Aug 14 19:30:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3813B7CA2 for ; Sun, 14 Aug 2016 19:30:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0ABD48F80D1 for ; Sun, 14 Aug 2016 17:30:55 -0700 (PDT) X-ASG-Debug-ID: 1471221051-0bf57c136960e6d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id MbbpQxcJ0lK5WGJK for ; Sun, 14 Aug 2016 17:30:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A530F4440 for ; Sun, 14 Aug 2016 19:30:51 -0500 (CDT) Subject: [PATCH V5] xfs_db: add crc manipulation commands To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH V5] xfs_db: add crc manipulation commands References: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> From: Eric Sandeen Message-ID: <0bb88897-3dfc-de4e-05fb-b737221f0d80@sandeen.net> Date: Sun, 14 Aug 2016 19:30:51 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471221052 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12460 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32016 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This adds a new "crc" command to xfs_db for CRC-enabled filesystems. If a structure has a CRC field, we can validate it, invalidate/corrupt it, or revalidate/rewrite it: xfs_db> sb 0 xfs_db> crc -v crc = 0x796c814f (correct) xfs_db> crc -i Metadata CRC error detected at block 0x0/0x200 crc = 0x796c8150 (bad) xfs_db> crc -r crc = 0x796c814f (correct) (-i and -r require "expert" write-capable mode) This requires temporarily replacing the write verifier with a dummy which won't recalculate the CRC on the way to disk. It also required me to write a new flist function, which is totally foreign to me, so hopefully done right - but it seems to work here. Signed-off-by: Eric Sandeen --- I found this very useful when working with a filesystem image which was consistent except for a corrupt CRC; the ability to rewrite the correct CRCs and run repair to validate the fs was very handy... V2: Fix whitespace damage, clarify write_cur() changes a bit w/ code & comments. V3: Be a bit more verbose with command output V4: Rebase patch to current tree V5: SEND ALL THE FILES diff --git a/db/Makefile b/db/Makefile index 8260da3..ba4b1a8 100644 --- a/db/Makefile +++ b/db/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/include/builddefs LTCOMMAND = xfs_db HFILES = addr.h agf.h agfl.h agi.h attr.h attrshort.h bit.h block.h bmap.h \ - btblock.h bmroot.h check.h command.h convert.h debug.h \ + btblock.h bmroot.h check.h command.h convert.h crc.h debug.h \ dir2.h dir2sf.h dquot.h echo.h faddr.h field.h \ flist.h fprint.h frag.h freesp.h hash.h help.h init.h inode.h input.h \ io.h logformat.h malloc.h metadump.h output.h print.h quit.h sb.h \ diff --git a/db/command.c b/db/command.c index 3c17a1e..1848d64 100644 --- a/db/command.c +++ b/db/command.c @@ -49,6 +49,7 @@ #include "write.h" #include "malloc.h" #include "dquot.h" +#include "crc.h" cmdinfo_t *cmdtab; int ncmds; @@ -124,6 +125,7 @@ init_commands(void) bmap_init(); check_init(); convert_init(); + crc_init(); debug_init(); echo_init(); frag_init(); diff --git a/db/crc.c b/db/crc.c new file mode 100644 index 0000000..468b61c --- /dev/null +++ b/db/crc.c @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2016 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation. + */ + +#include "libxfs.h" +#include "addr.h" +#include "command.h" +#include "type.h" +#include "faddr.h" +#include "fprint.h" +#include "field.h" +#include "flist.h" +#include "io.h" +#include "init.h" +#include "output.h" +#include "bit.h" +#include "print.h" + +static int crc_f(int argc, char **argv); +static void crc_help(void); + +static const cmdinfo_t crc_cmd = + { "crc", NULL, crc_f, 0, 1, 0, "[-i|-r|-v]", + N_("manipulate crc values for V5 filesystem structures"), crc_help }; + +void +crc_init(void) +{ + if (xfs_sb_version_hascrc(&mp->m_sb)) + add_command(&crc_cmd); +} + +static void +crc_help(void) +{ + dbprintf(_( +"\n" +" 'crc' validates, invalidates, or recalculates the crc value for\n" +" the current on-disk metadata structures in Version 5 filesystems.\n" +"\n" +" Usage: \"crc [-i|-r|-v]\"\n" +"\n" +)); + +} + +static int +crc_f( + int argc, + char **argv) +{ + const struct xfs_buf_ops *stashed_ops = NULL; + extern char *progname; + const field_t *fields; + const ftattr_t *fa; + flist_t *fl; + int invalidate = 0; + int recalculate = 0; + int validate = 0; + int c; + + if (cur_typ == NULL) { + dbprintf(_("no current type\n")); + return 0; + } + + if (cur_typ->fields == NULL) { + dbprintf(_("current type (%s) is not a structure\n"), + cur_typ->name); + return 0; + } + + if (argc) while ((c = getopt(argc, argv, "irv")) != EOF) { + switch (c) { + case 'i': + invalidate = 1; + break; + case 'r': + recalculate = 1; + break; + case 'v': + validate = 1; + break; + default: + dbprintf(_("bad option for crc command\n")); + return 0; + } + } else + validate = 1; + + if (invalidate + recalculate + validate > 1) { + dbprintf(_("crc command accepts only one option\n")); + return 0; + } + + if ((invalidate || recalculate) && + ((x.isreadonly & LIBXFS_ISREADONLY) || !expert_mode)) { + dbprintf(_("%s not in expert mode, writing disabled\n"), + progname); + return 0; + } + + fields = cur_typ->fields; + + /* if we're a root field type, go down 1 layer to get field list */ + if (fields->name[0] == '\0') { + fa = &ftattrtab[fields->ftyp]; + ASSERT(fa->ftyp == fields->ftyp); + fields = fa->subfld; + } + + /* Search for a CRC field */ + fl = flist_find_ftyp(fields, FLDT_CRC); + if (!fl) { + dbprintf(_("No CRC field found for type %s\n"), cur_typ->name); + return 0; + } + + /* run down the field list and set offsets into the data */ + if (!flist_parse(fields, fl, iocur_top->data, 0)) { + flist_free(fl); + dbprintf(_("parsing error\n")); + return 0; + } + + if (invalidate) { + struct xfs_buf_ops nowrite_ops; + flist_t *sfl; + int bit_length; + int parentoffset; + int crc; + + sfl = fl; + parentoffset = 0; + while (sfl->child) { + parentoffset = sfl->offset; + sfl = sfl->child; + } + ASSERT(sfl->fld->ftyp == FLDT_CRC); + + bit_length = fsize(sfl->fld, iocur_top->data, parentoffset, 0); + bit_length *= fcount(sfl->fld, iocur_top->data, parentoffset); + crc = getbitval(iocur_top->data, sfl->offset, bit_length, + BVUNSIGNED); + /* Off by one.. */ + crc = cpu_to_be32(crc + 1); + setbitval(iocur_top->data, sfl->offset, bit_length, &crc); + + /* Temporarily remove write verifier to write a bad CRC */ + stashed_ops = iocur_top->bp->b_ops; + nowrite_ops.verify_read = stashed_ops->verify_read; + nowrite_ops.verify_write = xfs_dummy_verify; + iocur_top->bp->b_ops = &nowrite_ops; + } + + if (invalidate || recalculate) { + if (invalidate) + dbprintf(_("Invalidating CRC:\n")); + else + dbprintf(_("Recalculating CRC:\n")); + + write_cur(); + if (stashed_ops) + iocur_top->bp->b_ops = stashed_ops; + /* re-verify to get proper b_error state */ + iocur_top->bp->b_ops->verify_read(iocur_top->bp); + } else + dbprintf(_("Verifying CRC:\n")); + + /* And show us what we've got! */ + flist_print(fl); + print_flist(fl); + flist_free(fl); + return 0; +} diff --git a/db/crc.h b/db/crc.h new file mode 100644 index 0000000..98c20a7 --- /dev/null +++ b/db/crc.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2016 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation. + */ + +struct field; + +extern void crc_init(void); +extern void crc_struct(const field_t *fields, int argc, char **argv); diff --git a/db/flist.c b/db/flist.c index 84065a2..e11acbf 100644 --- a/db/flist.c +++ b/db/flist.c @@ -411,6 +411,41 @@ flist_split( return v; } +/* + * Given a set of fields, scan for a field of the given type. + * Return an flist leading to the first found field + * of that type. + * Return NULL if no field of the given type is found. + */ +flist_t * +flist_find_ftyp( + const field_t *fields, + fldt_t type) +{ + flist_t *fl; + const field_t *f; + const ftattr_t *fa; + + for (f = fields; f->name; f++) { + fl = flist_make(f->name); + fl->fld = f; + if (f->ftyp == type) + return fl; + fa = &ftattrtab[f->ftyp]; + if (fa->subfld) { + flist_t *nfl; + + nfl = flist_find_ftyp(fa->subfld, type); + if (nfl) { + fl->child = nfl; + return fl; + } + } + flist_free(fl); + } + return NULL; +} + static void ftok_free( ftok_t *ft) diff --git a/db/flist.h b/db/flist.h index 5c9fba0..3f4b312 100644 --- a/db/flist.h +++ b/db/flist.h @@ -37,3 +37,4 @@ extern int flist_parse(const struct field *fields, flist_t *fl, void *obj, int startoff); extern void flist_print(flist_t *fl); extern flist_t *flist_scan(char *name); +extern flist_t *flist_find_ftyp(const field_t *fields, fldt_t type); diff --git a/db/io.c b/db/io.c index 91cab12..240b129 100644 --- a/db/io.c +++ b/db/io.c @@ -27,6 +27,7 @@ #include "output.h" #include "init.h" #include "malloc.h" +#include "crc.h" static int pop_f(int argc, char **argv); static void pop_help(void); @@ -473,12 +474,15 @@ xfs_verify_recalc_crc( void write_cur(void) { + int skip_crc = (iocur_top->bp->b_ops->verify_write == xfs_dummy_verify); + if (iocur_sp < 0) { dbprintf(_("nothing to write\n")); return; } - if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf) { + if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf && + !skip_crc) { libxfs_dinode_calc_crc(mp, iocur_top->data); iocur_top->ino_crc_ok = 1; } @@ -489,6 +493,19 @@ write_cur(void) write_cur_bbs(); else write_cur_buf(); + + /* If we didn't write the crc automatically, re-check validity */ + if (iocur_top->ino_buf && skip_crc) { + xfs_dinode_t *dip; + xfs_ino_t ino; + + dip = iocur_top->data; + ino = iocur_top->ino; + iocur_top->ino_crc_ok = xfs_verify_cksum((char *)dip, + mp->m_sb.sb_inodesize, + XFS_DINODE_CRC_OFF); + } + } void @@ -496,7 +513,7 @@ set_cur( const typ_t *t, __int64_t d, int c, - int ring_flag, + int ring_flag, bbmap_t *bbmap) { struct xfs_buf *bp; diff --git a/db/write.h b/db/write.h index 31e2665..664ddcc 100644 --- a/db/write.h +++ b/db/write.h @@ -20,5 +20,5 @@ struct field; extern void write_init(void); extern void write_block(const field_t *fields, int argc, char **argv); -extern void write_string(const field_t *fields, int argc, char **argv); extern void write_struct(const field_t *fields, int argc, char **argv); +extern void write_string(const field_t *fields, int argc, char **argv); diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index ff8f862..894a94e 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -87,16 +87,14 @@ or .I filename read-only. This option is required if the filesystem is mounted. It is only necessary to omit this flag if a command that changes data -.RB ( write ", " blocktrash ) +.RB ( write ", " blocktrash ", " crc ) is to be used. .TP .B \-x Specifies expert mode. This enables the -.B write -and -.B blocktrash -commands. +.RB ( write ", " blocktrash ", " crc +invalidate/revalidate) commands. .TP .B \-V Prints the version number and exits. @@ -422,6 +420,25 @@ conversions such as .I agb .BR fsblock . .TP +.B crc [\-i|\-r|\-v] +Invalidates, revalidates, or validates the CRC (checksum) +field of the current structure, if it has one. +This command is available only on CRC-enabled filesystems. +With no argument, validation is performed. +Each command will display the resulting CRC value and state. +.RS 1.0i +.TP 0.4i +.B \-i +Invalidate the structure's CRC value (incrementing it by one), +and write it to disk. +.TP +.B \-r +Recalculate the current structure's correct CRC value, and write it to disk. +.TP +.B \-v +Validate and display the current value and state of the structure's CRC. +.RE +.TP .BI "daddr [" d ] Set current address to the daddr (512 byte block) given by .IR d . From Sales.33@fashion-business.com Sun Aug 14 19:47:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28ACF7CA2 for ; Sun, 14 Aug 2016 19:47:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EC86B8F80CF for ; Sun, 14 Aug 2016 17:47:28 -0700 (PDT) X-ASG-Debug-ID: 1471222044-0bf57b369b6c5a40001-NocioJ Received: from fashion-business.com ([14.218.88.111]) by cuda.sgi.com with SMTP id F7NdU7FJLsrag4nP for ; Sun, 14 Aug 2016 17:47:25 -0700 (PDT) X-Barracuda-Envelope-From: Sales.33@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.88.111] X-Barracuda-Apparent-Source-IP: 14.218.88.111 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Mon, 15 Aug 2016 08:45:27 +0800 From: "angelbervogue@sina.com" Subject: FW: Ladies handbags To: xfs@oss.sgi.com X-ASG-Orig-Subj: FW: Ladies handbags MIME-Version: 1.0 Sender: Sales.33@fashion-business.com Reply-To: angelbervogue@sina.com Date: Mon, 15 Aug 2016 08:45:27 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.88.111] X-Barracuda-Start-Time: 1471222044 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5688 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32016 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160815004728.02B046430F4@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFs OyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1T SVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+SGkmbmJzcDtmcmllbmQs PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcu ODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0Niwy NDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdi KDI0NiwyNDYsMjQ2KSI+RnJvbSANCnRoZSBpbnRlcm5ldCwgSSBrbm93IHlvdSBhcmUgdGhlIGJp ZyBjaGFpbiBzdG9yZXMgZm9yIHRoZSBUb3AgRGVzaWduIGJ1c2luZXNzLiANClRvIGRpc3R1cmIg eW91ciAxMCBtaW51dGVzIHRvIHJlYWQgdGhpcyBtYWlsLCB0aGFua3MmbmJzcDthIGxvdCE8L1NQ QU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2 LDI0NiwyNDYpIj5IZXJlIA0KaXMgQW5nZWxvIHdobyBjb21lcyBmcm9tIEFuZ2VsYmVyIFZvZ3Vl IENvLiwgTHRkOyZuYnNwO291ciBjb21wYW55IGlzIA0KYSZuYnNwO3Byb2Zlc3Npb25hbCBtYW51 ZmFjdHVyZXIgaW4gYmFncyBmaWVsZC4gVGhlIGJyYW5kIG9mIHVzIGlzIEFOR0VMQkVSLCB3ZSAN CmFjY2VwdCB0byB3b3JrIHdpdGggY3VzdG9tZXIgaW4gT0VNICZhbXA7IE9ETSBzdHlsZS48L1NQ QU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2 LDI0NiwyNDYpIj5PdXIgDQphZHZhbnRhZ2VzOjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1B TElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1v cnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlh bDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPjEuIA0KV2UgYXJlIGJh Z3MgZXhwZXJ0LjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1I RUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdi KDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNo YWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPiZuYnNwOyZuYnNwOyZuYnNwOyANCjE1MCBhcmUgb3Vy IGZlYXR1cmVkIHByb2R1Y3RzLCBhbmQgdGhpcyBxdWFudGl0eSBpcyBhbHdheXMgaW5jcmVhc2Vk LCB0aGUgbWFpbmx5IA0KcHJvZHVjdHMgaW5jbHVkZSBsYWRpZXMgaGFuZGJhZ3MsIG1lbiYjMzk7 cyBicmllZmNhc2UsIHRvdGVzIGJhZywgd2FsbGV0IA0KZXRjLjwvU1BBTj48L1A+DQo8UCBzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9u OiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPjIuIA0K R29vZCBxdWFsaXR5IHdpdGggY29tcGV0aXRpdmUgcHJpY2U8L1NQQU4+PC9QPg0KPFAgc3R5bGU9 IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0OyBtc28tcGFnaW5hdGlvbjog d2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IENPTE9SOiByZ2IoMCwwLDAp OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQt a2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2LDI0NiwyNDYpIj4mbmJzcDsm bmJzcDsmbmJzcDsgDQpXZSBkbyB3aG9sZXNhbGVzIGFuZCBvdXIgb2ZmZXIgaXMgYWx3YXlzIGJl dHRlciB0aGFuIG90aGVycy4gQnVsayBxdWFudGl0eSBjYW4gDQpiZSBncmFudGVkIGEgYmlnZ2Vy IGRpc2NvdW50LiBQcm9kdWN0cyBwYXNzIElTTzkwMDEsIENFLCBGQ0MsIFJvSFMgDQp0ZXN0aW5n OzwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3 Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxT UEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYs MjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJn YigyNDYsMjQ2LDI0NikiPjMuIA0KT0VNIHNlcnZpY2UgYXZhaWxhYmxlLjwvU1BBTj48L1A+DQo8 UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJn YigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0Niki PiZuYnNwOyZuYnNwOyZuYnNwOyANCldlIHNldCBtaW5pdW0gcXVhbnRpdHkgZm9yIHRoZSBPRU0s IGlmIHlvdXIgcXVhbnRpdHkgbWVldHMgd2l0aCBpdCwgT0VNIGlzIGZyZWUuIA0KRGVsaXZlcnkg ZGF0ZSBmb3Igc2FtcGxlcyBvcmRlciBpcyBpbiAyMCBkYXlzLCBmb3IgbWFzcyBxdWFudGl0eSBv cmRlciBpcyBpbiANCjMwfjQ1IGRheXMuPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdO OiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhh biIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBC QUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpF OiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAu MDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+SWYgDQp5b3UgYXJlIGludGVy ZXN0ZWQgaW4gb3VyIHByb2R1Y3RzLCBwbGVhc2UgY29udGFjdCBtZSBmcmVlbHksIEkgd2lsbCBz ZW5kIHRoZSANCmNhdGFsb2cgdG8geW91LjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElH TjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsg QkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAw LjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPlRoYW5rcyANCmFuZCBiZXN0 IHJlZ2FyZHMhPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhF SUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29O b3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2Io MjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+QW5nZWxvIA0KSHVhbmc8L1NQQU4+PC9QPg0KPFAgc3R5 bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0OyBtc28tcGFnaW5hdGlv bjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZv bnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2LDI0NiwyNDYpIj5Ta3lw ZTogDQpkYXZpZTE4MTgxODwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From eguan@redhat.com Mon Aug 15 00:29:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AD4DF7CA1 for ; Mon, 15 Aug 2016 00:29:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 62EFB8F8094 for ; Sun, 14 Aug 2016 22:29:37 -0700 (PDT) X-ASG-Debug-ID: 1471238975-0bf8151be216c1c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Lz4u6NUmmhSraQLY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 14 Aug 2016 22:29:35 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 704F78AE72; Mon, 15 Aug 2016 05:29:35 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7F5TYOs029506; Mon, 15 Aug 2016 01:29:34 -0400 Date: Mon, 15 Aug 2016 13:29:33 +0800 From: Eryu Guan To: Brian Foster Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] tests/xfs: test log recovery metadata LSN ordering Message-ID: <20160815052933.GE27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] tests/xfs: test log recovery metadata LSN ordering References: <1471004010-52985-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471004010-52985-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 15 Aug 2016 05:29:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471238975 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3845 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 12, 2016 at 08:13:30AM -0400, Brian Foster wrote: > XFS had a bug that lead to a possible out-of-order log recovery > situation (e.g., replay a stale modification from the log over more > recent metadata in destination buffer). This resulted in false > corruption reports during log recovery and thus mount failure. > > This condition is caused by system crash or filesystem shutdown shortly > after a successful log recovery. Add a test to run a combined workload, > fs shutdown and log recovery loop known to reproduce the problem on > affected kernels. > > Signed-off-by: Brian Foster > --- > > This test reproduces the problem described and addressed in the > following patchset: > > http://oss.sgi.com/pipermail/xfs/2016-August/050840.html > > It runs anywhere from 50-100s in the couple of environments I've tested > on so far and reproduces the problem for me with 100% reliability. Note > that the bug only affects crc=1 kernels. Looks good overall, and tested with the above patchset applied and test passed without problems. Some minor issues inline > > Brian > > tests/xfs/999 | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/999.out | 2 ++ > tests/xfs/group | 1 + > 3 files changed, 90 insertions(+) > create mode 100755 tests/xfs/999 > create mode 100644 tests/xfs/999.out > > diff --git a/tests/xfs/999 b/tests/xfs/999 > new file mode 100755 > index 0000000..f9dd7f7 > --- /dev/null > +++ b/tests/xfs/999 > @@ -0,0 +1,87 @@ > +#! /bin/bash > +# FS QA Test No. 999 > +# > +# Test XFS log recovery ordering on v5 superblock filesystems. XFS had a problem > +# where it would incorrectly replay older modifications from the log over more > +# recent versions of metadata due to failure to update metadata LSNs during log > +# recovery. This could result in false positive reports of corruption during log > +# recovery and permanent mount failure. > +# > +# To test this situation, run frequent shutdowns immediately after log recovery. > +# Ensure that log recovery does not recover stale modifications and cause > +# spurious corruption reports and/or mount failures. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > + killall -9 fsstress > /dev/null 2>&1 We need a '_require_command "$KILLALL_PROGA" killall' and use $KILLALL_PROG in the test. > + _scratch_unmount > /dev/null 2>&1 > +} > + > +# get standard environment, filters and checks > +. ./common/rc > + > +# Modify as appropriate. > +_supported_fs xfs I'm wondering if this test can be made generic by adding a "_require_scratch_shutdown"? Like generic/042 to generic/051 Thanks, Eryu From mollet@univ-corse.fr Mon Aug 15 04:26:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=T_DKIM_INVALID,URI_NOVOWEL autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 619AB7CA2 for ; Mon, 15 Aug 2016 04:26:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E77D3AC035 for ; Mon, 15 Aug 2016 02:26:35 -0700 (PDT) X-ASG-Debug-ID: 1471253184-0bf8151be1178750001-NocioJ Received: from lotus.univ-corse.fr (lotus.univ-corse.fr [193.48.28.200]) by cuda.sgi.com with ESMTP id AIpL8wHnCRGNE3pF; Mon, 15 Aug 2016 02:26:24 -0700 (PDT) X-Barracuda-Envelope-From: mollet@univ-corse.fr X-Barracuda-Effective-Source-IP: lotus.univ-corse.fr[193.48.28.200] X-Barracuda-Apparent-Source-IP: 193.48.28.200 Received: from localhost (localhost [127.0.0.1]) by lotus.univ-corse.fr (Postfix) with ESMTP id D01AA2884288; Mon, 15 Aug 2016 11:22:28 +0200 (CEST) Received: from lotus.univ-corse.fr ([127.0.0.1]) by localhost (lotus.univ-corse.fr [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id YAI5PyeL2IBl; Mon, 15 Aug 2016 11:22:28 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lotus.univ-corse.fr (Postfix) with ESMTP id 2327F288413E; Mon, 15 Aug 2016 11:22:28 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.8.4 lotus.univ-corse.fr 2327F288413E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=univ-corse.fr; s=5B827196-1833-11E6-9968-E912EFAC61FA; t=1471252948; bh=Anj9PQsbpbxY+Ry/31XaLoynKJjdEenVJ8YJ/WwyFy8=; h=Date:From:Message-ID:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding; b=a2Ww9TGQsypFaFmS9BCGqtFkVktuGXbU/afIOcDi1N/9p00KB2w0ZMf0YfzcxgdHP nQEiQSQfqbJ1gQx5qN+VYdTMwJnk3QH5JRJl2QTHmbci8WDORvhmTEpzDKJoBRPVMQ uepuncnkH2zrbboNEh/Z4eDV4Y4Lt/LKIRM3RMbc= X-Virus-Scanned: amavisd-new at univ-corse.fr Received: from lotus.univ-corse.fr ([127.0.0.1]) by localhost (lotus.univ-corse.fr [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id 5PM1zk_e1-Kr; Mon, 15 Aug 2016 11:22:27 +0200 (CEST) Received: from lotus.univ-corse.fr (lotus.univ-corse.fr [127.0.1.1]) by lotus.univ-corse.fr (Postfix) with ESMTP id 0AA0D2884184; Mon, 15 Aug 2016 11:22:27 +0200 (CEST) Date: Mon, 15 Aug 2016 11:22:26 +0200 (CEST) From: "@ADMIN ZIMBRA" Message-ID: <667826149.5916191.1471252946827.JavaMail.zimbra@univ-corse.fr> Subject: 24 horas a bloqueado MIME-Version: 1.0 X-ASG-Orig-Subj: 24 horas a bloqueado Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [196.207.187.23] X-Mailer: Zimbra 8.0.6_GA_5922 (zclient/8.0.6_GA_5922) Thread-Topic: 24 horas a bloqueado Thread-Index: tnQzkbkEzpvO7oVVocQIm/hFUKUa1A== X-Barracuda-Connect: lotus.univ-corse.fr[193.48.28.200] X-Barracuda-Start-Time: 1471253184 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 620 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.97 X-Barracuda-Spam-Status: No, SCORE=1.97 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA717, DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS, RCVD_ILLEGAL_IP, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE, URI_NOVOWEL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32022 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.50 URI_NOVOWEL URI: URI hostname has long non-vowel sequence 0.00 TO_CC_NONE No To: or Cc: header 0.00 BSF_SC0_SA717 Custom Rule BSF_SC0_SA717 To: undisclosed-recipients:; Querido , Su cuenta de correo electr=C3=B3nico se cerrar=C3=A1 si no para aumentar la= capacidad de almacenamiento. Amablemente Haga clic aqu=C3=AD para aumentar= su capacidad de almacenamiento en 30.00GB libre .. http://jdkdkdba.tripod.com/ Haga clic aqu=C3=AD y rellena de a=C3=B1adir hasta 20 GB de almacenamiento = gratuito. http://jdkdkdba.tripod.com/ Si no es recibido de usted en las pr=C3=B3ximas 24 horas, vamos a cerrar su= cuenta de correo electr=C3=B3nico, Hasta despu=C3=A9s de la verificaci=C3=B3n correcta antes de poder acceder = a su cuenta de correo electr=C3=B3nico Una vez m=C3=A1s .... !!! Gracias. La seguridad de dominio de 2016. From bfoster@redhat.com Mon Aug 15 06:46:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CBC1A7CA2 for ; Mon, 15 Aug 2016 06:46:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D92B3040FD for ; Mon, 15 Aug 2016 04:46:53 -0700 (PDT) X-ASG-Debug-ID: 1471261611-0bf57c1367635a90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hVkOqzjcNYhfyzzQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 04:46:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7D0A785541; Mon, 15 Aug 2016 11:46:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-27.bos.redhat.com [10.18.41.27]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FBkovC025666; Mon, 15 Aug 2016 07:46:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 04F24120194; Mon, 15 Aug 2016 07:46:49 -0400 (EDT) Date: Mon, 15 Aug 2016 07:46:49 -0400 From: Brian Foster To: Eryu Guan Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] tests/xfs: test log recovery metadata LSN ordering Message-ID: <20160815114649.GA14796@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] tests/xfs: test log recovery metadata LSN ordering References: <1471004010-52985-1-git-send-email-bfoster@redhat.com> <20160815052933.GE27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160815052933.GE27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 15 Aug 2016 11:46:51 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471261612 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4181 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 15, 2016 at 01:29:33PM +0800, Eryu Guan wrote: > On Fri, Aug 12, 2016 at 08:13:30AM -0400, Brian Foster wrote: > > XFS had a bug that lead to a possible out-of-order log recovery > > situation (e.g., replay a stale modification from the log over more > > recent metadata in destination buffer). This resulted in false > > corruption reports during log recovery and thus mount failure. > > > > This condition is caused by system crash or filesystem shutdown shortly > > after a successful log recovery. Add a test to run a combined workload, > > fs shutdown and log recovery loop known to reproduce the problem on > > affected kernels. > > > > Signed-off-by: Brian Foster > > --- > > > > This test reproduces the problem described and addressed in the > > following patchset: > > > > http://oss.sgi.com/pipermail/xfs/2016-August/050840.html > > > > It runs anywhere from 50-100s in the couple of environments I've tested > > on so far and reproduces the problem for me with 100% reliability. Note > > that the bug only affects crc=1 kernels. > > Looks good overall, and tested with the above patchset applied and test > passed without problems. Some minor issues inline > > > > > Brian > > > > tests/xfs/999 | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/xfs/999.out | 2 ++ > > tests/xfs/group | 1 + > > 3 files changed, 90 insertions(+) > > create mode 100755 tests/xfs/999 > > create mode 100644 tests/xfs/999.out > > > > diff --git a/tests/xfs/999 b/tests/xfs/999 > > new file mode 100755 > > index 0000000..f9dd7f7 > > --- /dev/null > > +++ b/tests/xfs/999 > > @@ -0,0 +1,87 @@ > > +#! /bin/bash > > +# FS QA Test No. 999 > > +# > > +# Test XFS log recovery ordering on v5 superblock filesystems. XFS had a problem > > +# where it would incorrectly replay older modifications from the log over more > > +# recent versions of metadata due to failure to update metadata LSNs during log > > +# recovery. This could result in false positive reports of corruption during log > > +# recovery and permanent mount failure. > > +# > > +# To test this situation, run frequent shutdowns immediately after log recovery. > > +# Ensure that log recovery does not recover stale modifications and cause > > +# spurious corruption reports and/or mount failures. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > +# > > + > > +seq=`basename $0` > > +seqres=$RESULT_DIR/$seq > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -f $tmp.* > > + killall -9 fsstress > /dev/null 2>&1 > > We need a '_require_command "$KILLALL_PROGA" killall' and use > $KILLALL_PROG in the test. > Ok. > > + _scratch_unmount > /dev/null 2>&1 > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > + > > +# Modify as appropriate. > > +_supported_fs xfs > > I'm wondering if this test can be made generic by adding a > "_require_scratch_shutdown"? Like generic/042 to generic/051 > Hmm, probably. I'll give it a try, thanks! Brian > Thanks, > Eryu From bfoster@redhat.com Mon Aug 15 07:05:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D73957CA3 for ; Mon, 15 Aug 2016 07:05:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F4D2AC03E for ; Mon, 15 Aug 2016 05:05:47 -0700 (PDT) X-ASG-Debug-ID: 1471262745-0bf8151be2182980001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Rbc8huqzLzgbjBXv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 05:05:45 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 83712C04B317; Mon, 15 Aug 2016 12:05:45 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-27.bos.redhat.com [10.18.41.27]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FC5jdg006931; Mon, 15 Aug 2016 08:05:45 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1772D120194; Mon, 15 Aug 2016 08:05:44 -0400 (EDT) From: Brian Foster To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH v2] tests/generic: test xfs log recovery metadata LSN ordering Date: Mon, 15 Aug 2016 08:05:44 -0400 X-ASG-Orig-Subj: [PATCH v2] tests/generic: test xfs log recovery metadata LSN ordering Message-Id: <1471262744-19668-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 15 Aug 2016 12:05:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471262745 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4411 X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 XFS had a bug that lead to a possible out-of-order log recovery situation (e.g., replay a stale modification from the log over more recent metadata in destination buffer). This resulted in false corruption reports during log recovery and thus mount failure. This condition is caused by system crash or filesystem shutdown shortly after a successful log recovery. Add a test to run a combined workload, fs shutdown and log recovery loop known to reproduce the problem on affected kernels. Signed-off-by: Brian Foster --- v2: - Use $KILLALL_PROG for killall command. - Convert to generic test. v1: http://marc.info/?l=linux-xfs&m=147100402211629&w=2 tests/generic/999 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/999.out | 2 ++ tests/generic/group | 1 + 3 files changed, 91 insertions(+) create mode 100755 tests/generic/999 create mode 100644 tests/generic/999.out diff --git a/tests/generic/999 b/tests/generic/999 new file mode 100755 index 0000000..f3257e4 --- /dev/null +++ b/tests/generic/999 @@ -0,0 +1,88 @@ +#! /bin/bash +# FS QA Test No. 999 +# +# Test XFS log recovery ordering on v5 superblock filesystems. XFS had a problem +# where it would incorrectly replay older modifications from the log over more +# recent versions of metadata due to failure to update metadata LSNs during log +# recovery. This could result in false positive reports of corruption during log +# recovery and permanent mount failure. +# +# To test this situation, run frequent shutdowns immediately after log recovery. +# Ensure that log recovery does not recover stale modifications and cause +# spurious corruption reports and/or mount failures. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + $KILLALL_PROG -9 fsstress > /dev/null 2>&1 + _scratch_unmount > /dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_command "$KILLALL_PROG" + +rm -f $seqres.full + +echo "Silence is golden." + +_scratch_mkfs_xfs >> $seqres.full 2>&1 +_scratch_mount || _fail "mount failed" + +for i in $(seq 1 50); do + ($FSSTRESS_PROG -d $SCRATCH_MNT -n 999999 -p 4 >> $seqres.full &) \ + > /dev/null 2>&1 + + # purposely include 0 second sleeps to test shutdown immediately after + # recovery + sleep $((RANDOM % 3)) + $XFS_IO_PROG -xc shutdown $SCRATCH_MNT + + ps -e | grep fsstress > /dev/null 2>&1 + while [ $? == 0 ]; do + $KILLALL_PROG -9 fsstress > /dev/null 2>&1 + wait > /dev/null 2>&1 + ps -e | grep fsstress > /dev/null 2>&1 + done + + # quit if mount fails so we don't shutdown the host fs + _scratch_cycle_mount || _fail "cycle mount failed" +done + +# success, all done +status=0 +exit diff --git a/tests/generic/999.out b/tests/generic/999.out new file mode 100644 index 0000000..d254382 --- /dev/null +++ b/tests/generic/999.out @@ -0,0 +1,2 @@ +QA output created by 999 +Silence is golden. diff --git a/tests/generic/group b/tests/generic/group index 4acae99..605a244 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -375,3 +375,4 @@ 370 auto quick richacl 371 auto quick enospc prealloc 372 auto quick clone +999 auto log metadata -- 2.5.5 From eguan@redhat.com Mon Aug 15 07:29:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0252A7CA1 for ; Mon, 15 Aug 2016 07:29:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3421CAC03E for ; Mon, 15 Aug 2016 05:29:40 -0700 (PDT) X-ASG-Debug-ID: 1471264179-0bf8151be4188c50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lgCAAjGM1cXvcWKg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 05:29:39 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 03FCD796F2; Mon, 15 Aug 2016 12:29:39 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FCTboW009915; Mon, 15 Aug 2016 08:29:38 -0400 Date: Mon, 15 Aug 2016 20:29:37 +0800 From: Eryu Guan To: Brian Foster Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2] tests/generic: test xfs log recovery metadata LSN ordering Message-ID: <20160815122937.GJ27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2] tests/generic: test xfs log recovery metadata LSN ordering References: <1471262744-19668-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471262744-19668-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 15 Aug 2016 12:29:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471264179 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5153 X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 15, 2016 at 08:05:44AM -0400, Brian Foster wrote: > XFS had a bug that lead to a possible out-of-order log recovery > situation (e.g., replay a stale modification from the log over more > recent metadata in destination buffer). This resulted in false > corruption reports during log recovery and thus mount failure. > > This condition is caused by system crash or filesystem shutdown shortly > after a successful log recovery. Add a test to run a combined workload, > fs shutdown and log recovery loop known to reproduce the problem on > affected kernels. > > Signed-off-by: Brian Foster > --- > > v2: > - Use $KILLALL_PROG for killall command. > - Convert to generic test. > v1: http://marc.info/?l=linux-xfs&m=147100402211629&w=2 > > tests/generic/999 | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/generic/999.out | 2 ++ > tests/generic/group | 1 + > 3 files changed, 91 insertions(+) > create mode 100755 tests/generic/999 > create mode 100644 tests/generic/999.out > > diff --git a/tests/generic/999 b/tests/generic/999 > new file mode 100755 > index 0000000..f3257e4 > --- /dev/null > +++ b/tests/generic/999 > @@ -0,0 +1,88 @@ > +#! /bin/bash > +# FS QA Test No. 999 > +# > +# Test XFS log recovery ordering on v5 superblock filesystems. XFS had a problem > +# where it would incorrectly replay older modifications from the log over more > +# recent versions of metadata due to failure to update metadata LSNs during log > +# recovery. This could result in false positive reports of corruption during log > +# recovery and permanent mount failure. > +# > +# To test this situation, run frequent shutdowns immediately after log recovery. > +# Ensure that log recovery does not recover stale modifications and cause > +# spurious corruption reports and/or mount failures. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > + $KILLALL_PROG -9 fsstress > /dev/null 2>&1 > + _scratch_unmount > /dev/null 2>&1 > +} > + > +# get standard environment, filters and checks > +. ./common/rc > + > +# Modify as appropriate. > +_supported_fs xfs "xfs" should be "generic"? > +_supported_os Linux > + > +_require_scratch Missed a "_require_scratch_shutdown"? > +_require_command "$KILLALL_PROG" > + > +rm -f $seqres.full > + > +echo "Silence is golden." > + > +_scratch_mkfs_xfs >> $seqres.full 2>&1 If this is a generic test, _scratch_mkfs should be used here. > +_scratch_mount || _fail "mount failed" > + > +for i in $(seq 1 50); do > + ($FSSTRESS_PROG -d $SCRATCH_MNT -n 999999 -p 4 >> $seqres.full &) \ > + > /dev/null 2>&1 > + > + # purposely include 0 second sleeps to test shutdown immediately after > + # recovery > + sleep $((RANDOM % 3)) > + $XFS_IO_PROG -xc shutdown $SCRATCH_MNT > + > + ps -e | grep fsstress > /dev/null 2>&1 > + while [ $? == 0 ]; do Better to use "-eq" for integers. Thanks, Eryu > + $KILLALL_PROG -9 fsstress > /dev/null 2>&1 > + wait > /dev/null 2>&1 > + ps -e | grep fsstress > /dev/null 2>&1 > + done > + > + # quit if mount fails so we don't shutdown the host fs > + _scratch_cycle_mount || _fail "cycle mount failed" > +done > + > +# success, all done > +status=0 > +exit > diff --git a/tests/generic/999.out b/tests/generic/999.out > new file mode 100644 > index 0000000..d254382 > --- /dev/null > +++ b/tests/generic/999.out > @@ -0,0 +1,2 @@ > +QA output created by 999 > +Silence is golden. > diff --git a/tests/generic/group b/tests/generic/group > index 4acae99..605a244 100644 > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -375,3 +375,4 @@ > 370 auto quick richacl > 371 auto quick enospc prealloc > 372 auto quick clone > +999 auto log metadata > -- > 2.5.5 > > -- > To unsubscribe from this list: send the line "unsubscribe fstests" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From bfoster@redhat.com Mon Aug 15 07:56:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A8CEC7CA1 for ; Mon, 15 Aug 2016 07:56:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7BBCA8F8109 for ; Mon, 15 Aug 2016 05:56:30 -0700 (PDT) X-ASG-Debug-ID: 1471265788-0bf57c136763f060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4DDRsTyG7d79LbRV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 05:56:28 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0F83813852; Mon, 15 Aug 2016 12:56:28 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-27.bos.redhat.com [10.18.41.27]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FCuRhN009131; Mon, 15 Aug 2016 08:56:27 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A79B9120194; Mon, 15 Aug 2016 08:56:26 -0400 (EDT) From: Brian Foster To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH v3] tests/generic: test xfs log recovery metadata LSN ordering Date: Mon, 15 Aug 2016 08:56:26 -0400 X-ASG-Orig-Subj: [PATCH v3] tests/generic: test xfs log recovery metadata LSN ordering Message-Id: <1471265786-24970-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 15 Aug 2016 12:56:28 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471265788 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4526 X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 XFS had a bug that lead to a possible out-of-order log recovery situation (e.g., replay a stale modification from the log over more recent metadata in destination buffer). This resulted in false corruption reports during log recovery and thus mount failure. This condition is caused by system crash or filesystem shutdown shortly after a successful log recovery. Add a test to run a combined workload, fs shutdown and log recovery loop known to reproduce the problem on affected kernels. Signed-off-by: Brian Foster --- v3: - More generic test fixups. v2: http://marc.info/?l=linux-xfs&m=147126275528704&w=2 - Use $KILLALL_PROG for killall command. - Convert to generic test. v1: http://marc.info/?l=linux-xfs&m=147100402211629&w=2 tests/generic/999 | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/999.out | 2 ++ tests/generic/group | 1 + 3 files changed, 92 insertions(+) create mode 100755 tests/generic/999 create mode 100644 tests/generic/999.out diff --git a/tests/generic/999 b/tests/generic/999 new file mode 100755 index 0000000..57bb39c --- /dev/null +++ b/tests/generic/999 @@ -0,0 +1,89 @@ +#! /bin/bash +# FS QA Test No. 999 +# +# Test XFS log recovery ordering on v5 superblock filesystems. XFS had a problem +# where it would incorrectly replay older modifications from the log over more +# recent versions of metadata due to failure to update metadata LSNs during log +# recovery. This could result in false positive reports of corruption during log +# recovery and permanent mount failure. +# +# To test this situation, run frequent shutdowns immediately after log recovery. +# Ensure that log recovery does not recover stale modifications and cause +# spurious corruption reports and/or mount failures. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + $KILLALL_PROG -9 fsstress > /dev/null 2>&1 + _scratch_unmount > /dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc + +# Modify as appropriate. +_supported_fs generic +_supported_os Linux + +_require_scratch +_require_scratch_shutdown +_require_command "$KILLALL_PROG" + +rm -f $seqres.full + +echo "Silence is golden." + +_scratch_mkfs >> $seqres.full 2>&1 +_scratch_mount || _fail "mount failed" + +for i in $(seq 1 50); do + ($FSSTRESS_PROG -d $SCRATCH_MNT -n 999999 -p 4 >> $seqres.full &) \ + > /dev/null 2>&1 + + # purposely include 0 second sleeps to test shutdown immediately after + # recovery + sleep $((RANDOM % 3)) + $XFS_IO_PROG -xc shutdown $SCRATCH_MNT + + ps -e | grep fsstress > /dev/null 2>&1 + while [ $? -eq 0 ]; do + $KILLALL_PROG -9 fsstress > /dev/null 2>&1 + wait > /dev/null 2>&1 + ps -e | grep fsstress > /dev/null 2>&1 + done + + # quit if mount fails so we don't shutdown the host fs + _scratch_cycle_mount || _fail "cycle mount failed" +done + +# success, all done +status=0 +exit diff --git a/tests/generic/999.out b/tests/generic/999.out new file mode 100644 index 0000000..d254382 --- /dev/null +++ b/tests/generic/999.out @@ -0,0 +1,2 @@ +QA output created by 999 +Silence is golden. diff --git a/tests/generic/group b/tests/generic/group index 4acae99..605a244 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -375,3 +375,4 @@ 370 auto quick richacl 371 auto quick enospc prealloc 372 auto quick clone +999 auto log metadata -- 2.5.5 From debbugs@buxtehude.debian.org Mon Aug 15 08:04:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3B0CE7CA1 for ; Mon, 15 Aug 2016 08:04:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3140AC03F for ; Mon, 15 Aug 2016 06:04:00 -0700 (PDT) X-ASG-Debug-ID: 1471266234-0bf8151be118a5b0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id 0gGnGmYNDLgTGcFN (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 15 Aug 2016 06:03:55 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1bZHYW-0004nm-8R; Mon, 15 Aug 2016 13:03:52 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#834416: xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument Reply-To: Marcel Meckel , 834416@bugs.debian.org X-ASG-Orig-Subj: Bug#834416: xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument Resent-From: Marcel Meckel Resent-To: debian-bugs-dist@lists.debian.org Resent-CC: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Mon, 15 Aug 2016 13:03:48 +0000 Resent-Message-ID: X-Debian-PR-Message: report 834416 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by submit@bugs.debian.org id=B.147126595515716 (code B); Mon, 15 Aug 2016 13:03:48 +0000 Received: (at submit) by bugs.debian.org; 15 Aug 2016 12:59:15 +0000 Received: from mailly.debian.org ([2001:41b8:202:deb:6564:a62:52c3:4b72]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=mailly.debian.org,EMAIL=hostmaster@mailly.debian.org (verified) by buxtehude.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1bZHU3-00045A-7j for submit@bugs.debian.org; Mon, 15 Aug 2016 12:59:15 +0000 Received: from bommel.foobar0815.de ([136.243.146.119]) by mailly.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1bZHU0-00078q-Fz for bugs@debian.org; Mon, 15 Aug 2016 12:59:12 +0000 Received: from bimbo.thermoman.de (cookie.lan [172.25.219.252]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by bommel.foobar0815.de (Postfix) with ESMTPSA id C3F3E331B4D for ; Mon, 15 Aug 2016 14:59:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=thermoman.de; s=20150622; t=1471265951; bh=97ppp+pZzOrlu3br644DJrWxGCcejwtCg9DNOdsgsh0=; h=MIME-Version:Content-Type:Date:From:To:Subject:Message-ID:From; b=hfGSnDQUz7eI2V4E7CVIFBQEUos8NkoLYqVv1MGotG2M3wGmImqjL1KKz/LDZBy0C x0Wid5ak2Hu8L8Ddx6AJyM5Vl9z9uY9C0VUkJNgxYIjtPNrSSo/jhxT1M05F3eH3GW ZyFEIuyJcNxn1x/mHpkiegOZsgN9T4ISzTzvyMeM= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Mon, 15 Aug 2016 14:59:11 +0200 From: Marcel Meckel To: bugs@debian.org Message-ID: X-Sender: debian@thermoman.de User-Agent: Webmail Delivered-To: bugs@debian.org Delivered-To: submit@bugs.debian.org X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1471266235 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 23087 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32024 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Package: xfsprogs Version: 3.2.1 Severity: important xfs_growfs did corrupt a filesystem on a up2date Debian Jessie system. Might be a kernel problem and not xfsprogs related. % pvresize /dev/vda2 % xfs_growfs /dev/mapper/vg0-home meta-data=/dev/mapper/vg0-home isize=256 agcount=109, agsize=229376 blks = sectsz=512 attr=2, projid32bit=0 = crc=0 finobt=0 data = bsize=4096 blocks=24878080, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument data blocks changed from 24878080 to 37985280 % dmesg [ 806.321683] XFS (dm-2): bad magic number [ 806.321699] XFS (dm-2): metadata I/O error: block 0x9680000 ("xfs_trans_read_buf_map") error 22 numblks 1 [ 806.322715] XFS (dm-2): error 22 reading secondary superblock for ag 86 [ 806.323088] XFS (dm-2): bad magic number [ 806.323096] XFS (dm-2): metadata I/O error: block 0x9840000 ("xfs_trans_read_buf_map") error 22 numblks 1 [ 806.324175] XFS (dm-2): error 22 reading secondary superblock for ag 87 [ 806.324697] XFS (dm-2): bad magic number [ 806.324705] XFS (dm-2): metadata I/O error: block 0x9a00000 ("xfs_trans_read_buf_map") error 22 numblks 1 [ 806.325727] XFS (dm-2): error 22 reading secondary superblock for ag 88 [ 806.326075] XFS (dm-2): bad magic number [ 806.326082] XFS (dm-2): metadata I/O error: block 0x9bc0000 ("xfs_trans_read_buf_map") error 22 numblks 1 [ 806.327061] XFS (dm-2): error 22 reading secondary superblock for ag 89 [..] % umount /home % xfs_repair /dev/mapper/vg0-home xfs_repair /dev/mapper/vg0-home Phase 1 - find and verify superblock... - reporting progress in intervals of 15 minutes Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... zeroing unused portion of secondary superblock (AG #9) zeroing unused portion of secondary superblock (AG #64) zeroing unused portion of secondary superblock (AG #66) zeroing unused portion of secondary superblock (AG #61) zeroing unused portion of secondary superblock (AG #58) zeroing unused portion of secondary superblock (AG #62) zeroing unused portion of secondary superblock (AG #59) zeroing unused portion of secondary superblock (AG #63) bad magic number bad on-disk superblock 86 - bad magic number primary/secondary superblock 86 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 86 bad magic number bad on-disk superblock 87 - bad magic number primary/secondary superblock 87 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 87 zeroing unused portion of secondary superblock (AG #60) bad magic number bad magic number bad magic number bad on-disk superblock 90 - bad magic number primary/secondary superblock 90 conflict - AG superblock geometry info conflicts with filesystem geometry zeroing unused portion of secondary superblock (AG #90) non-null project quota inode field in superblock 90 reset bad sb for ag 90 bad on-disk superblock 88 - bad magic number primary/secondary superblock 88 conflict - AG superblock geometry info conflicts with filesystem geometry zeroing unused portion of secondary superblock (AG #88) non-null project quota inode field in superblock 88 reset bad sb for ag 88 bad on-disk superblock 89 - bad magic number primary/secondary superblock 89 conflict - AG superblock geometry info conflicts with filesystem geometry zeroing unused portion of secondary superblock (AG #89) non-null project quota inode field in superblock 89 reset bad sb for ag 89 bad magic number bad on-disk superblock 91 - bad magic number primary/secondary superblock 91 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 91 bad magic number bad magic number bad on-disk superblock 93 - bad magic number primary/secondary superblock 93 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 93 bad magic number bad on-disk superblock 95 - bad magic number primary/secondary superblock 95 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 95 bad on-disk superblock 94 - bad magic number primary/secondary superblock 94 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 94 bad magic number bad on-disk superblock 96 - bad magic number primary/secondary superblock 96 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 96 bad magic number bad on-disk superblock 97 - bad magic number primary/secondary superblock 97 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 97 bad magic number bad magic number bad on-disk superblock 99 - bad magic number primary/secondary superblock 99 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 99 bad magic number bad magic number bad on-disk superblock 98 - bad magic number primary/secondary superblock 98 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 98 bad magic number bad on-disk superblock 100 - bad magic number primary/secondary superblock 100 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 100 bad on-disk superblock 103 - bad magic number primary/secondary superblock 103 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 103 bad on-disk superblock 102 - bad magic number primary/secondary superblock 102 conflict - AG superblock geometry info conflicts with filesystem geometry zeroing unused portion of secondary superblock (AG #102) non-null project quota inode field in superblock 102 reset bad sb for ag 102 bad magic number bad magic number bad on-disk superblock 105 - bad magic number primary/secondary superblock 105 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 105 bad on-disk superblock 106 - bad magic number primary/secondary superblock 106 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 106 bad magic number bad on-disk superblock 108 - bad magic number primary/secondary superblock 108 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 108 bad magic number bad magic number bad on-disk superblock 101 - bad magic number primary/secondary superblock 101 conflict - AG superblock geometry info conflicts with filesystem geometry zeroing unused portion of secondary superblock (AG #101) non-null project quota inode field in superblock 101 reset bad sb for ag 101 bad magic number bad magic number bad on-disk superblock 92 - bad magic number primary/secondary superblock 92 conflict - AG superblock geometry info conflicts with filesystem geometry zeroing unused portion of secondary superblock (AG #92) non-null project quota inode field in superblock 92 reset bad sb for ag 92 zeroing unused portion of secondary superblock (AG #65) bad on-disk superblock 104 - bad magic number primary/secondary superblock 104 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 104 bad on-disk superblock 107 - bad magic number primary/secondary superblock 107 conflict - AG superblock geometry info conflicts with filesystem geometry reset bad sb for ag 107 - 13:51:46: scanning filesystem freespace - 166 of 166 allocation groups done - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - 13:51:46: scanning agi unlinked lists - 166 of 166 allocation groups done - process known inodes and perform inode discovery... - agno = 45 - agno = 165 - agno = 30 - agno = 150 - agno = 120 - agno = 15 - agno = 60 - agno = 105 - agno = 0 - agno = 90 - agno = 75 - agno = 135 - agno = 61 - agno = 91 - agno = 46 - agno = 92 - agno = 106 - agno = 16 - agno = 62 - agno = 31 - agno = 1 - agno = 136 - agno = 76 - agno = 121 - agno = 47 - agno = 63 - agno = 93 - agno = 107 - agno = 48 - agno = 17 - agno = 137 - agno = 151 - agno = 32 - agno = 77 - agno = 64 - agno = 2 - agno = 94 - agno = 95 - agno = 78 - agno = 122 - agno = 108 - agno = 18 - agno = 65 - agno = 33 - agno = 96 - agno = 152 - agno = 138 - agno = 123 - agno = 109 - agno = 79 - agno = 49 - agno = 19 - agno = 66 - agno = 139 - agno = 124 - agno = 80 - agno = 153 - agno = 110 - agno = 97 - agno = 67 - agno = 50 - agno = 20 - agno = 140 - agno = 34 - agno = 68 - agno = 125 - agno = 51 - agno = 154 - agno = 81 - agno = 111 - agno = 35 - agno = 98 - agno = 21 - agno = 126 - agno = 69 - agno = 3 - agno = 82 - agno = 52 - agno = 155 - agno = 141 - agno = 36 - agno = 156 - agno = 22 - agno = 112 - agno = 127 - agno = 70 - agno = 157 - agno = 53 - agno = 142 - agno = 99 - agno = 128 - agno = 71 - agno = 83 - agno = 158 - agno = 54 - agno = 37 - agno = 23 - agno = 72 - agno = 84 - agno = 55 - agno = 143 - agno = 100 - agno = 24 - agno = 113 - agno = 159 - agno = 85 - agno = 38 - agno = 129 - agno = 101 - agno = 73 - agno = 56 - agno = 144 - agno = 114 - agno = 130 - agno = 39 - agno = 160 - agno = 86 - agno = 57 - agno = 102 - agno = 115 - agno = 131 - agno = 87 - agno = 132 - agno = 88 - agno = 74 - agno = 116 - agno = 40 - agno = 58 - agno = 103 - agno = 145 - agno = 161 - agno = 41 - agno = 146 - agno = 162 - agno = 104 - agno = 117 - agno = 59 - agno = 147 - agno = 133 - agno = 118 - agno = 163 - agno = 42 - agno = 89 - agno = 134 - agno = 164 - agno = 43 - agno = 148 - agno = 119 - agno = 149 - agno = 44 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - 13:51:47: process known inodes and inode discovery - 6592 of 6592 inodes done - process newly discovered inodes... - 13:51:47: process newly discovered inodes - 166 of 166 allocation groups done Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - 13:51:47: setting up duplicate extent list - 166 of 166 allocation groups done - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 10 - agno = 9 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 11 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 43 - agno = 44 - agno = 45 - agno = 42 - agno = 47 - agno = 48 - agno = 49 - agno = 50 - agno = 51 - agno = 52 - agno = 53 - agno = 54 - agno = 55 - agno = 56 - agno = 57 - agno = 58 - agno = 59 - agno = 60 - agno = 61 - agno = 62 - agno = 63 - agno = 64 - agno = 65 - agno = 66 - agno = 67 - agno = 68 - agno = 69 - agno = 70 - agno = 71 - agno = 72 - agno = 73 - agno = 74 - agno = 75 - agno = 76 - agno = 77 - agno = 78 - agno = 79 - agno = 80 - agno = 81 - agno = 82 - agno = 83 - agno = 84 - agno = 85 - agno = 86 - agno = 87 - agno = 88 - agno = 89 - agno = 90 - agno = 91 - agno = 92 - agno = 93 - agno = 94 - agno = 95 - agno = 96 - agno = 97 - agno = 98 - agno = 99 - agno = 100 - agno = 101 - agno = 102 - agno = 103 - agno = 104 - agno = 105 - agno = 106 - agno = 107 - agno = 108 - agno = 109 - agno = 110 - agno = 111 - agno = 112 - agno = 113 - agno = 114 - agno = 115 - agno = 116 - agno = 117 - agno = 118 - agno = 119 - agno = 120 - agno = 121 - agno = 122 - agno = 123 - agno = 124 - agno = 125 - agno = 126 - agno = 127 - agno = 128 - agno = 129 - agno = 130 - agno = 131 - agno = 132 - agno = 133 - agno = 134 - agno = 135 - agno = 136 - agno = 137 - agno = 138 - agno = 139 - agno = 140 - agno = 141 - agno = 142 - agno = 143 - agno = 144 - agno = 145 - agno = 146 - agno = 147 - agno = 148 - agno = 149 - agno = 150 - agno = 151 - agno = 152 - agno = 153 - agno = 154 - agno = 155 - agno = 156 - agno = 157 - agno = 158 - agno = 159 - agno = 160 - agno = 161 - agno = 162 - agno = 163 - agno = 164 - agno = 165 - agno = 46 - 13:51:47: check for inodes claiming duplicate blocks - 6592 of 6592 inodes done Phase 5 - rebuild AG headers and trees... - 13:51:47: rebuild AG headers and trees - 166 of 166 allocation groups done - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done from /etc/lvm/archive/ # Generated by LVM2 version 2.02.111(2) (2014-09-01): Mon Aug 15 13:41:33 2016 contents = "Text Format Volume Group" version = 1 description = "Created *before* executing 'pvresize /dev/vda2'" creation_host = "vm1" # Linux vm1 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64 creation_time = 1471261293 # Mon Aug 15 13:41:33 2016 vg0 { id = "yeRSXo-fBdl-z8d6-3yMk-dike-v5mM-09xXJJ" seqno = 84 format = "lvm2" # informational status = ["RESIZEABLE", "READ", "WRITE"] flags = [] extent_size = 8192 # 4 Megabytes max_lv = 0 max_pv = 0 metadata_copies = 0 physical_volumes { pv0 { id = "60303N-3FAj-4O2L-2exc-hVsP-P4M8-aSGzpo" device = "/dev/vda2" # Hint only status = ["ALLOCATABLE"] flags = [] dev_size = 209516544 # 99.9053 Gigabytes pe_start = 2048 pe_count = 25575 # 99.9023 Gigabytes } } logical_volumes { root { id = "3CKcsA-bIDm-0efT-3uvC-Tcbw-a7pZ-F4A9HL" status = ["READ", "WRITE", "VISIBLE"] flags = [] segment_count = 1 segment1 { start_extent = 0 extent_count = 768 # 3 Gigabytes type = "striped" stripe_count = 1 # linear stripes = [ "pv0", 0 ] } } var_log { id = "G0mPki-Ebz1-cEmP-ggvV-L3Ci-7fHn-AnRcK1" status = ["READ", "WRITE", "VISIBLE"] flags = [] segment_count = 1 segment1 { start_extent = 0 extent_count = 512 # 2 Gigabytes type = "striped" stripe_count = 1 # linear stripes = [ "pv0", 768 ] } } home { id = "fIdpcN-5hEp-7Zv1-zKxj-QqbX-fUTN-32tUkM" status = ["READ", "WRITE", "VISIBLE"] flags = [] segment_count = 1 segment1 { start_extent = 0 extent_count = 24295 # 94.9023 Gigabytes type = "striped" stripe_count = 1 # linear stripes = [ "pv0", 1280 ] } } } } # Generated by LVM2 version 2.02.111(2) (2014-09-01): Mon Aug 15 13:41:52 2016 contents = "Text Format Volume Group" version = 1 description = "Created *before* executing 'lvresize /dev/vg0/home -l +100%FREE'" creation_host = "vm1" # Linux vm1 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2+deb8u3 (2016-07-02) x86_64 creation_time = 1471261312 # Mon Aug 15 13:41:52 2016 vg0 { id = "yeRSXo-fBdl-z8d6-3yMk-dike-v5mM-09xXJJ" seqno = 85 format = "lvm2" # informational status = ["RESIZEABLE", "READ", "WRITE"] flags = [] extent_size = 8192 # 4 Megabytes max_lv = 0 max_pv = 0 metadata_copies = 0 physical_volumes { pv0 { id = "60303N-3FAj-4O2L-2exc-hVsP-P4M8-aSGzpo" device = "/dev/vda2" # Hint only status = ["ALLOCATABLE"] flags = [] dev_size = 314374144 # 149.905 Gigabytes pe_start = 2048 pe_count = 38375 # 149.902 Gigabytes } } logical_volumes { root { id = "3CKcsA-bIDm-0efT-3uvC-Tcbw-a7pZ-F4A9HL" status = ["READ", "WRITE", "VISIBLE"] flags = [] segment_count = 1 segment1 { start_extent = 0 extent_count = 768 # 3 Gigabytes type = "striped" stripe_count = 1 # linear stripes = [ "pv0", 0 ] } } var_log { id = "G0mPki-Ebz1-cEmP-ggvV-L3Ci-7fHn-AnRcK1" status = ["READ", "WRITE", "VISIBLE"] flags = [] segment_count = 1 segment1 { start_extent = 0 extent_count = 512 # 2 Gigabytes type = "striped" stripe_count = 1 # linear stripes = [ "pv0", 768 ] } } home { id = "fIdpcN-5hEp-7Zv1-zKxj-QqbX-fUTN-32tUkM" status = ["READ", "WRITE", "VISIBLE"] flags = [] segment_count = 1 segment1 { start_extent = 0 extent_count = 24295 # 94.9023 Gigabytes type = "striped" stripe_count = 1 # linear stripes = [ "pv0", 1280 ] } } } } -- System Information: Debian Release: 8.5 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 3.16.0-4-amd64 (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to en_US.UTF-8) Shell: /bin/sh linked to /bin/bash Init: sysvinit (via /sbin/init) Versions of packages xfsprogs depends on: ii libblkid1 2.25.2-6 ii libc6 2.19-18+deb8u4 ii libreadline5 5.2+dfsg-2 ii libuuid1 2.25.2-6 xfsprogs recommends no packages. Versions of packages xfsprogs suggests: pn acl pn attr pn quota pn xfsdump -- no debconf information Some more info The system in question is a virtual machine (KVM), the host being Debian Jessie, too. The VM had a 100G xfs filesystem mounted on /home with only appr. 450MB free disk space and was shut down to do the resizing of the underlying "physical disk" (/dev/vg_HOST/vm_1 on the Host). The VM was shut down and after that lvresize was used on the HOST to resize the VMs assigned block device. The VMs "disk" changed from 100G to 150G and the partitions changed from ------snip------ Disk /dev/vg_HOST/vm_1: 150 GiB, 161061273600 bytes, 314572800 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x13cd7000 Device Boot Start End Sectors Size Id Type /dev/vg_HOST/vm_1p1 * 2048 196607 194560 95M 83 Linux /dev/vg_HOST/vm_1p2 196608 209715199 209518592 99.9G 8e Linux LVM ------snip------ to ------snip------ Device Boot Start End Sectors Size Id Type /dev/vg_HOST/vm_1p1 * 2048 196607 194560 95M 83 Linux /dev/vg_HOST/vm_1p2 196608 314572799 314376192 149.9G 8e Linux LVM ------snip------ The VM was then started. Inside the VM the above mentioned commands were issued. Just for reference: the hosts logical volume is assigned to the VM in question in the following manner (using libvirt syntax): From billodo@redhat.com Mon Aug 15 08:44:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 861D97CA2 for ; Mon, 15 Aug 2016 08:44:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DD694AC045 for ; Mon, 15 Aug 2016 06:44:05 -0700 (PDT) X-ASG-Debug-ID: 1471268643-0bf57c1368642190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id s0eyrIOg2P0opxrY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 06:44:04 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 68C9581112 for ; Mon, 15 Aug 2016 13:44:03 +0000 (UTC) Received: from redhat.com (vpn-56-109.rdu2.redhat.com [10.10.56.109]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FDi0eI019043 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 15 Aug 2016 09:44:02 -0400 Date: Mon, 15 Aug 2016 08:44:00 -0500 From: "Bill O'Donnell" To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_quota: wire up XFS_GETQSTATV Message-ID: <20160815134400.GA16987@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: wire up XFS_GETQSTATV References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Mon, 15 Aug 2016 13:44:03 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471268643 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8751 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 12, 2016 at 06:07:00PM -0500, Eric Sandeen wrote: > The new XFS_GETQSTATV quotactl, available since kernel v3.12, > was never implemented in xfs_quota, and the "state" command > continues to use XFS_GETQSTAT, which cannot report both > group & project quota on newer formats. > > The new call has room for all 3 quota types (user, group, and > quota), vs just two, where previously project and quota > overlapped. > > So: > > First, try XFS_GETQSTATV. > If it passes, we have all the information we need, and we print > it. state_qfilestat() is modified to take the newer structure. > > If it fails, try XFS_GETQSTAT. If that passes, we are on an > older kernel with neither XFS_GETQSTATV nor the on-disk project > quota inode. We copy the available information into the newer > statv structure, carefully determining wither group or project > (or neither) is actually active, and print it with the same > state_qfilestat routine. > > Signed-off-by: Eric Sandeen Reviewed-by: Bill O'Donnell > --- > > I probably could have done some memcpy()'s in > state_stat_to_statv(), but opted for the explicit copy-out; > the structures aren't identical, although the newer one > only differs by padding on the end. If memcpy() is preferable > I could send a V2... > > > diff --git a/include/xqm.h b/include/xqm.h > index c084b2d..78262c3 100644 > --- a/include/xqm.h > +++ b/include/xqm.h > @@ -32,6 +32,7 @@ > #define Q_XGETQSTAT XQM_CMD(5) /* get quota subsystem status */ > #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */ > #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */ > +#define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */ > #define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage */ > > /* > @@ -149,4 +150,30 @@ typedef struct fs_quota_stat { > __u16 qs_iwarnlimit; /* limit for num warnings */ > } fs_quota_stat_t; > > +/* > + * Some basic information about 'quota files' for Q_XGETQSTATV command > + */ > +struct fs_qfilestatv { > + __u64 qfs_ino; /* inode number */ > + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ > + __u32 qfs_nextents; /* number of extents */ > + __u32 qfs_pad; /* pad for 8-byte alignment */ > +}; > + > +struct fs_quota_statv { > + __s8 qs_version; /* version for future changes */ > + __u8 qs_pad1; /* pad for 16bit alignment */ > + __u16 qs_flags; /* FS_QUOTA_.* flags */ > + __u32 qs_incoredqs; /* number of dquots incore */ > + struct fs_qfilestatv qs_uquota; /* user quota information */ > + struct fs_qfilestatv qs_gquota; /* group quota information */ > + struct fs_qfilestatv qs_pquota; /* project quota information */ > + __s32 qs_btimelimit; /* limit for blks timer */ > + __s32 qs_itimelimit; /* limit for inodes timer */ > + __s32 qs_rtbtimelimit;/* limit for rt blks timer */ > + __u16 qs_bwarnlimit; /* limit for num warnings */ > + __u16 qs_iwarnlimit; /* limit for num warnings */ > + __u64 qs_pad2[8]; /* for future proofing */ > +}; > + > #endif /* __XQM_H__ */ > diff --git a/quota/linux.c b/quota/linux.c > index 74dba01..4f1f3c4 100644 > --- a/quota/linux.c > +++ b/quota/linux.c > @@ -55,6 +55,8 @@ xcommand_to_qcommand( > return Q_XSETQLIM; > case XFS_GETQSTAT: > return Q_XGETQSTAT; > + case XFS_GETQSTATV: > + return Q_XGETQSTATV; > case XFS_QUOTARM: > return Q_XQUOTARM; > case XFS_QSYNC: > diff --git a/quota/state.c b/quota/state.c > index 8186762..5d63579 100644 > --- a/quota/state.c > +++ b/quota/state.c > @@ -111,12 +111,12 @@ remove_help(void) > > static void > state_qfilestat( > - FILE *fp, > - fs_path_t *mount, > - uint type, > - fs_qfilestat_t *qfs, > - int accounting, > - int enforcing) > + FILE *fp, > + struct fs_path *mount, > + uint type, > + struct fs_qfilestatv *qfs, > + int accounting, > + int enforcing) > { > fprintf(fp, _("%s quota state on %s (%s)\n"), type_to_string(type), > mount->fs_dir, mount->fs_name); > @@ -142,39 +142,94 @@ state_timelimit( > time_to_string(timelimit, VERBOSE_FLAG | ABSOLUTE_FLAG)); > } > > +/* > + * fs_quota_stat holds a subset of fs_quota_statv; this copies > + * the smaller into the larger, leaving any not-present fields > + * empty. This is so the same reporting function can be used > + * for both XFS_GETQSTAT and XFS_GETQSTATV results. > + */ > static void > -state_quotafile_mount( > - FILE *fp, > - uint type, > - fs_path_t *mount, > - uint flags) > +state_stat_to_statv( > + struct fs_quota_stat *s, > + struct fs_quota_statv *sv) > { > - fs_quota_stat_t s; > - char *dev = mount->fs_name; > + memset(sv, 0, sizeof(struct fs_quota_statv)); > + > + /* shared information */ > + sv->qs_version = s->qs_version; > + sv->qs_flags = s->qs_flags; > + sv->qs_incoredqs = s->qs_incoredqs; > + sv->qs_btimelimit = s->qs_btimelimit; > + sv->qs_itimelimit = s->qs_itimelimit; > + sv->qs_rtbtimelimit = s->qs_rtbtimelimit; > + sv->qs_bwarnlimit = s->qs_bwarnlimit; > + sv->qs_iwarnlimit = s->qs_iwarnlimit; > + > + /* Always room for uquota */ > + sv->qs_uquota.qfs_ino = s->qs_uquota.qfs_ino; > + sv->qs_uquota.qfs_nblks = s->qs_uquota.qfs_nblks; > + sv->qs_uquota.qfs_nextents = s->qs_uquota.qfs_nextents; > + > + /* > + * If we are here, XFS_GETQSTATV failed and XFS_GETQSTAT passed; > + * that is a very strong hint that we're on a kernel which predates > + * the on-disk pquota inode; both were added in v3.12. So, we do > + * some tricksy determination here. > + * gs_gquota may hold either group quota inode info, or project > + * quota if that is used instead; which one it actually holds depends > + * on the quota flags. (If neither is set, neither is used) > + */ > + if (s->qs_flags & XFS_QUOTA_GDQ_ACCT) { > + /* gs_gquota holds group quota info */ > + sv->qs_gquota.qfs_ino = s->qs_gquota.qfs_ino; > + sv->qs_gquota.qfs_nblks = s->qs_gquota.qfs_nblks; > + sv->qs_gquota.qfs_nextents = s->qs_gquota.qfs_nextents; > + } else if (s->qs_flags & XFS_QUOTA_PDQ_ACCT) { > + /* gs_gquota actually holds project quota info */ > + sv->qs_pquota.qfs_ino = s->qs_gquota.qfs_ino; > + sv->qs_pquota.qfs_nblks = s->qs_gquota.qfs_nblks; > + sv->qs_pquota.qfs_nextents = s->qs_gquota.qfs_nextents; > + } > +} > > - if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > - if (flags & VERBOSE_FLAG) > - fprintf(fp, _("%s quota are not enabled on %s\n"), > - type_to_string(type), dev); > - return; > +static void > +state_quotafile_mount( > + FILE *fp, > + uint type, > + struct fs_path *mount, > + uint flags) > +{ > + struct fs_quota_stat s; > + struct fs_quota_statv sv; > + char *dev = mount->fs_name; > + > + if (xfsquotactl(XFS_GETQSTATV, dev, type, 0, (void *)&sv) < 0) { > + if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > + if (flags & VERBOSE_FLAG) > + fprintf(fp, > + _("%s quota are not enabled on %s\n"), > + type_to_string(type), dev); > + return; > + } > + state_stat_to_statv(&s, &sv); > } > > if (type & XFS_USER_QUOTA) > - state_qfilestat(fp, mount, XFS_USER_QUOTA, &s.qs_uquota, > - s.qs_flags & XFS_QUOTA_UDQ_ACCT, > - s.qs_flags & XFS_QUOTA_UDQ_ENFD); > + state_qfilestat(fp, mount, XFS_USER_QUOTA, &sv.qs_uquota, > + sv.qs_flags & XFS_QUOTA_UDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_UDQ_ENFD); > if (type & XFS_GROUP_QUOTA) > - state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &s.qs_gquota, > - s.qs_flags & XFS_QUOTA_GDQ_ACCT, > - s.qs_flags & XFS_QUOTA_GDQ_ENFD); > + state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &sv.qs_gquota, > + sv.qs_flags & XFS_QUOTA_GDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_GDQ_ENFD); > if (type & XFS_PROJ_QUOTA) > - state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &s.qs_gquota, > - s.qs_flags & XFS_QUOTA_PDQ_ACCT, > - s.qs_flags & XFS_QUOTA_PDQ_ENFD); > + state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &sv.qs_pquota, > + sv.qs_flags & XFS_QUOTA_PDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_PDQ_ENFD); > > - state_timelimit(fp, XFS_BLOCK_QUOTA, s.qs_btimelimit); > - state_timelimit(fp, XFS_INODE_QUOTA, s.qs_itimelimit); > - state_timelimit(fp, XFS_RTBLOCK_QUOTA, s.qs_rtbtimelimit); > + state_timelimit(fp, XFS_BLOCK_QUOTA, sv.qs_btimelimit); > + state_timelimit(fp, XFS_INODE_QUOTA, sv.qs_itimelimit); > + state_timelimit(fp, XFS_RTBLOCK_QUOTA, sv.qs_rtbtimelimit); > } > > static void > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From debbugs@buxtehude.debian.org Mon Aug 15 10:09:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 991827CA2 for ; Mon, 15 Aug 2016 10:09:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 34A2930410D for ; Mon, 15 Aug 2016 08:09:15 -0700 (PDT) X-ASG-Debug-ID: 1471273748-0bf8151be1196210001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [206.12.19.147]) by cuda.sgi.com with ESMTP id grKGMe4nheBTOJTA (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 15 Aug 2016 08:09:09 -0700 (PDT) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Effective-Source-IP: buxtehude.debian.org[206.12.19.147] X-Barracuda-Apparent-Source-IP: 206.12.19.147 Received: from debbugs by buxtehude.debian.org with local (Exim 4.84_2) (envelope-from ) id 1bZJVi-0000kS-Jq; Mon, 15 Aug 2016 15:09:06 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#834416: Acknowledgement (xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument) Reply-To: Marcel Meckel , 834416@bugs.debian.org X-ASG-Orig-Subj: Bug#834416: Acknowledgement (xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument) Resent-From: Marcel Meckel Resent-To: debian-bugs-dist@lists.debian.org Resent-CC: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Mon, 15 Aug 2016 15:09:04 +0000 Resent-Message-ID: X-Debian-PR-Message: followup 834416 X-Debian-PR-Package: xfsprogs X-Debian-PR-Keywords: X-Debian-PR-Source: xfsprogs Received: via spool by 834416-submit@bugs.debian.org id=B834416.14712736082372 (code B ref 834416); Mon, 15 Aug 2016 15:09:04 +0000 Received: (at 834416) by bugs.debian.org; 15 Aug 2016 15:06:48 +0000 Received: from bommel.foobar0815.de ([136.243.146.119]) by buxtehude.debian.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1bZJTU-0000c0-9V for 834416@bugs.debian.org; Mon, 15 Aug 2016 15:06:48 +0000 Received: from bimbo.thermoman.de (cookie.lan [172.25.219.252]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by bommel.foobar0815.de (Postfix) with ESMTPSA id 878CC331B4D for <834416@bugs.debian.org>; Mon, 15 Aug 2016 17:01:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=thermoman.de; s=20150622; t=1471273274; bh=GpBJYosWa5yOk+RnMjqPZ+6Bq8cnZ4sL0ecP11lnOck=; h=MIME-Version:Content-Type:Date:From:To:Subject:Message-ID:From; b=dvyYIND7OUEM17MKX/RX7jp3+WDeId3lT0LY2F7fGCooPHt51N6h4nTt6QgFHhZBo T8NcqiCISFKfT8l6tjmEzxRrYMJBogV129VXVnGmRGa4f9awscmj9sH5ZyJq5jlrt6 wcyvUh8+ZzALiESPCYJZhLuQ/gGYZlevSCBzp0Jg= MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Mon, 15 Aug 2016 17:01:14 +0200 From: Marcel Meckel To: 834416@bugs.debian.org In-Reply-To: References: Message-ID: <40a2c05a782734f022a89ee0e83be0e6@thermoman.de> X-Sender: debian@thermoman.de User-Agent: Webmail X-Greylist: delayed 330 seconds by postgrey-1.35 at buxtehude; Mon, 15 Aug 2016 15:06:47 UTC X-Barracuda-Connect: buxtehude.debian.org[206.12.19.147] X-Barracuda-Start-Time: 1471273749 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1383 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA085, DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.10 BSF_SC0_SA085 Custom Rule SA085 Just had a chat in #xfs on freenode and it might be that a previous xfs_growfs under an older kernel didn't zero enough. When I recall it correctly the XFS filesystem in question was resized in the past under then stable Debian Wheezy (might even have been resized under Debian Squeeze). Chat for reference: < bfoster> strange, seems like it is running a verifier on the secondary sb's < bfoster> e.g., commit 1375cb65e, but that fix seems to go way back < bfoster> did growfs run and fail prior to the run with these reported errors? < thermoman> bfoster: never had problems before < thermoman> but the FS might have been created with an older xfsprogs and it has been definately be resized before < bfoster> or hmm, perhaps its remnants from a previous growfs < bfoster> ok, I think that makes more sense, you went from 109 ags to 160 some odd ags < bfoster> and grow/repair is complaining about ags below that 109 threshold < bfoster> which suggests the previous grows didn't zero enough, or whatever that old problem was < bfoster> I think the kernel you're on now should "do the right thing" Might be related: http://xfs.org/index.php/XFS_FAQ#Q:_I.27m_getting_.22Internal_error_xfs_sb_read_verify.22_errors_when_I_try_to_run_xfs_growfs_under_kernels_v3.10_through_v3.12 From zlang@redhat.com Mon Aug 15 11:39:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2262B7CA2 for ; Mon, 15 Aug 2016 11:39:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5CD9AC04E for ; Mon, 15 Aug 2016 09:39:03 -0700 (PDT) X-ASG-Debug-ID: 1471279141-0bf8151be219b840001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 82MHxFD9VoECUQ4v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 09:39:02 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8D9C3C04D2B0 for ; Mon, 15 Aug 2016 16:39:01 +0000 (UTC) Received: from localhost (dhcp12-196.nay.redhat.com [10.66.12.196] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FGd0E7009981; Mon, 15 Aug 2016 12:39:00 -0400 Date: Tue, 16 Aug 2016 00:38:59 +0800 From: Zorro Lang To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_quota: wire up XFS_GETQSTATV Message-ID: <20160815163859.GA7193@zlang.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: wire up XFS_GETQSTATV References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 15 Aug 2016 16:39:01 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471279142 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10581 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 12, 2016 at 06:07:00PM -0500, Eric Sandeen wrote: > The new XFS_GETQSTATV quotactl, available since kernel v3.12, > was never implemented in xfs_quota, and the "state" command > continues to use XFS_GETQSTAT, which cannot report both > group & project quota on newer formats. > > The new call has room for all 3 quota types (user, group, and > quota), vs just two, where previously project and quota > overlapped. > > So: > > First, try XFS_GETQSTATV. > If it passes, we have all the information we need, and we print > it. state_qfilestat() is modified to take the newer structure. > > If it fails, try XFS_GETQSTAT. If that passes, we are on an > older kernel with neither XFS_GETQSTATV nor the on-disk project > quota inode. We copy the available information into the newer > statv structure, carefully determining wither group or project > (or neither) is actually active, and print it with the same > state_qfilestat routine. > > Signed-off-by: Eric Sandeen > --- > > I probably could have done some memcpy()'s in > state_stat_to_statv(), but opted for the explicit copy-out; > the structures aren't identical, although the newer one > only differs by padding on the end. If memcpy() is preferable > I could send a V2... > > > diff --git a/include/xqm.h b/include/xqm.h > index c084b2d..78262c3 100644 > --- a/include/xqm.h > +++ b/include/xqm.h > @@ -32,6 +32,7 @@ > #define Q_XGETQSTAT XQM_CMD(5) /* get quota subsystem status */ > #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */ > #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */ > +#define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */ > #define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage */ > > /* > @@ -149,4 +150,30 @@ typedef struct fs_quota_stat { > __u16 qs_iwarnlimit; /* limit for num warnings */ > } fs_quota_stat_t; > > +/* > + * Some basic information about 'quota files' for Q_XGETQSTATV command > + */ > +struct fs_qfilestatv { > + __u64 qfs_ino; /* inode number */ > + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ > + __u32 qfs_nextents; /* number of extents */ > + __u32 qfs_pad; /* pad for 8-byte alignment */ > +}; > + > +struct fs_quota_statv { > + __s8 qs_version; /* version for future changes */ > + __u8 qs_pad1; /* pad for 16bit alignment */ > + __u16 qs_flags; /* FS_QUOTA_.* flags */ > + __u32 qs_incoredqs; /* number of dquots incore */ > + struct fs_qfilestatv qs_uquota; /* user quota information */ > + struct fs_qfilestatv qs_gquota; /* group quota information */ > + struct fs_qfilestatv qs_pquota; /* project quota information */ > + __s32 qs_btimelimit; /* limit for blks timer */ > + __s32 qs_itimelimit; /* limit for inodes timer */ > + __s32 qs_rtbtimelimit;/* limit for rt blks timer */ > + __u16 qs_bwarnlimit; /* limit for num warnings */ > + __u16 qs_iwarnlimit; /* limit for num warnings */ > + __u64 qs_pad2[8]; /* for future proofing */ > +}; > + > #endif /* __XQM_H__ */ > diff --git a/quota/linux.c b/quota/linux.c > index 74dba01..4f1f3c4 100644 > --- a/quota/linux.c > +++ b/quota/linux.c > @@ -55,6 +55,8 @@ xcommand_to_qcommand( > return Q_XSETQLIM; > case XFS_GETQSTAT: > return Q_XGETQSTAT; > + case XFS_GETQSTATV: > + return Q_XGETQSTATV; > case XFS_QUOTARM: > return Q_XQUOTARM; > case XFS_QSYNC: > diff --git a/quota/state.c b/quota/state.c > index 8186762..5d63579 100644 > --- a/quota/state.c > +++ b/quota/state.c > @@ -111,12 +111,12 @@ remove_help(void) > > static void > state_qfilestat( > - FILE *fp, > - fs_path_t *mount, > - uint type, > - fs_qfilestat_t *qfs, > - int accounting, > - int enforcing) > + FILE *fp, > + struct fs_path *mount, > + uint type, > + struct fs_qfilestatv *qfs, > + int accounting, > + int enforcing) > { > fprintf(fp, _("%s quota state on %s (%s)\n"), type_to_string(type), > mount->fs_dir, mount->fs_name); > @@ -142,39 +142,94 @@ state_timelimit( > time_to_string(timelimit, VERBOSE_FLAG | ABSOLUTE_FLAG)); > } > > +/* > + * fs_quota_stat holds a subset of fs_quota_statv; this copies > + * the smaller into the larger, leaving any not-present fields > + * empty. This is so the same reporting function can be used > + * for both XFS_GETQSTAT and XFS_GETQSTATV results. > + */ > static void > -state_quotafile_mount( > - FILE *fp, > - uint type, > - fs_path_t *mount, > - uint flags) > +state_stat_to_statv( > + struct fs_quota_stat *s, > + struct fs_quota_statv *sv) > { > - fs_quota_stat_t s; > - char *dev = mount->fs_name; > + memset(sv, 0, sizeof(struct fs_quota_statv)); > + > + /* shared information */ > + sv->qs_version = s->qs_version; > + sv->qs_flags = s->qs_flags; > + sv->qs_incoredqs = s->qs_incoredqs; > + sv->qs_btimelimit = s->qs_btimelimit; > + sv->qs_itimelimit = s->qs_itimelimit; > + sv->qs_rtbtimelimit = s->qs_rtbtimelimit; > + sv->qs_bwarnlimit = s->qs_bwarnlimit; > + sv->qs_iwarnlimit = s->qs_iwarnlimit; > + > + /* Always room for uquota */ > + sv->qs_uquota.qfs_ino = s->qs_uquota.qfs_ino; > + sv->qs_uquota.qfs_nblks = s->qs_uquota.qfs_nblks; > + sv->qs_uquota.qfs_nextents = s->qs_uquota.qfs_nextents; > + > + /* > + * If we are here, XFS_GETQSTATV failed and XFS_GETQSTAT passed; > + * that is a very strong hint that we're on a kernel which predates > + * the on-disk pquota inode; both were added in v3.12. So, we do > + * some tricksy determination here. > + * gs_gquota may hold either group quota inode info, or project > + * quota if that is used instead; which one it actually holds depends > + * on the quota flags. (If neither is set, neither is used) > + */ > + if (s->qs_flags & XFS_QUOTA_GDQ_ACCT) { > + /* gs_gquota holds group quota info */ > + sv->qs_gquota.qfs_ino = s->qs_gquota.qfs_ino; > + sv->qs_gquota.qfs_nblks = s->qs_gquota.qfs_nblks; > + sv->qs_gquota.qfs_nextents = s->qs_gquota.qfs_nextents; > + } else if (s->qs_flags & XFS_QUOTA_PDQ_ACCT) { > + /* gs_gquota actually holds project quota info */ > + sv->qs_pquota.qfs_ino = s->qs_gquota.qfs_ino; > + sv->qs_pquota.qfs_nblks = s->qs_gquota.qfs_nblks; > + sv->qs_pquota.qfs_nextents = s->qs_gquota.qfs_nextents; > + } > +} > > - if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > - if (flags & VERBOSE_FLAG) > - fprintf(fp, _("%s quota are not enabled on %s\n"), > - type_to_string(type), dev); > - return; > +static void > +state_quotafile_mount( > + FILE *fp, > + uint type, > + struct fs_path *mount, > + uint flags) > +{ > + struct fs_quota_stat s; > + struct fs_quota_statv sv; > + char *dev = mount->fs_name; > + When I tested on XFS with crc=1, I got below result: [root@dhcp-13-149 xfsprogs-dev]# mount /dev/mapper/testvg-scratchdev /mnt/scratch -o gquota,pquota [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "state" /mnt/scratch User quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: OFF Enforcement: OFF Inode: #101 (1 blocks, 1 extents) Group quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: ON Enforcement: ON Inode: #99 (1 blocks, 1 extents) Project quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: ON Enforcement: ON Inode: #0 (0 blocks, 0 extents) Blocks grace time: [7 days] Inodes grace time: [7 days] Realtime Blocks grace time: [7 days] I got project quota inode number is #0, when I mount gquota and pquota together. That's incorrect, because: [root@dhcp-13-149 xfsprogs-dev]# xfs_db -r -c "sb 0" -c "p" /dev/mapper/testvg-scratchdev|grep quot uquotino = 101 gquotino = 99 pquotino = 100 >From the result of strace, we can see: quotactl(0x5808 /* Q_??? */|USRQUOTA, "/dev/mapper/testvg-scratchdev", 0, 0x7ffdbbda94c0) = -1 EINVAL (Invalid argument) quotactl(Q_XGETQSTAT|USRQUOTA, "/dev/mapper/testvg-scratchdev", 0, {version=1, ...}) = 0 So the first call for XFS_GETQSTATV return EINVAL. In linux kernel quota_getxstatev() function, the logic is: /* If this kernel doesn't support user specified version, fail */ switch (fqs.qs_version) { case FS_QSTATV_VERSION1: break; default: return -EINVAL; } So we need to set qa_version to FS_QSTATV_VERSION1, before we call XFS_GETQSTATV. And as we talked on IRC, it test passed if I set sv.qs_version = 1; at here. So maybe a V2 patch is needed to fix this problem:) Thanks, Zorro > + if (xfsquotactl(XFS_GETQSTATV, dev, type, 0, (void *)&sv) < 0) { > + if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > + if (flags & VERBOSE_FLAG) > + fprintf(fp, > + _("%s quota are not enabled on %s\n"), > + type_to_string(type), dev); > + return; > + } > + state_stat_to_statv(&s, &sv); > } > > if (type & XFS_USER_QUOTA) > - state_qfilestat(fp, mount, XFS_USER_QUOTA, &s.qs_uquota, > - s.qs_flags & XFS_QUOTA_UDQ_ACCT, > - s.qs_flags & XFS_QUOTA_UDQ_ENFD); > + state_qfilestat(fp, mount, XFS_USER_QUOTA, &sv.qs_uquota, > + sv.qs_flags & XFS_QUOTA_UDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_UDQ_ENFD); > if (type & XFS_GROUP_QUOTA) > - state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &s.qs_gquota, > - s.qs_flags & XFS_QUOTA_GDQ_ACCT, > - s.qs_flags & XFS_QUOTA_GDQ_ENFD); > + state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &sv.qs_gquota, > + sv.qs_flags & XFS_QUOTA_GDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_GDQ_ENFD); > if (type & XFS_PROJ_QUOTA) > - state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &s.qs_gquota, > - s.qs_flags & XFS_QUOTA_PDQ_ACCT, > - s.qs_flags & XFS_QUOTA_PDQ_ENFD); > + state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &sv.qs_pquota, > + sv.qs_flags & XFS_QUOTA_PDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_PDQ_ENFD); > > - state_timelimit(fp, XFS_BLOCK_QUOTA, s.qs_btimelimit); > - state_timelimit(fp, XFS_INODE_QUOTA, s.qs_itimelimit); > - state_timelimit(fp, XFS_RTBLOCK_QUOTA, s.qs_rtbtimelimit); > + state_timelimit(fp, XFS_BLOCK_QUOTA, sv.qs_btimelimit); > + state_timelimit(fp, XFS_INODE_QUOTA, sv.qs_itimelimit); > + state_timelimit(fp, XFS_RTBLOCK_QUOTA, sv.qs_rtbtimelimit); > } > > static void > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@redhat.com Mon Aug 15 11:43:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 94F527CA2 for ; Mon, 15 Aug 2016 11:43:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 66F8A8F80C0 for ; Mon, 15 Aug 2016 09:43:13 -0700 (PDT) X-ASG-Debug-ID: 1471279391-0bf57c136764b3d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id evls1uBrJBrZxdmm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 09:43:12 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A0FBAC04B317 for ; Mon, 15 Aug 2016 16:43:11 +0000 (UTC) Received: from [IPv6:::1] (ovpn03.gateway.prod.ext.phx2.redhat.com [10.5.9.3]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FGhADV026023 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 15 Aug 2016 12:43:11 -0400 Subject: Re: [PATCH] xfs_quota: wire up XFS_GETQSTATV To: Zorro Lang X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: wire up XFS_GETQSTATV References: <20160815163859.GA7193@zlang.usersys.redhat.com> Cc: xfs-oss From: Eric Sandeen Message-ID: Date: Mon, 15 Aug 2016 11:43:10 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160815163859.GA7193@zlang.usersys.redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Mon, 15 Aug 2016 16:43:11 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471279392 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1389 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 8/15/16 11:38 AM, Zorro Lang wrote: > From the result of strace, we can see: > quotactl(0x5808 /* Q_??? */|USRQUOTA, "/dev/mapper/testvg-scratchdev", 0, 0x7ffdbbda94c0) = -1 EINVAL (Invalid argument) > quotactl(Q_XGETQSTAT|USRQUOTA, "/dev/mapper/testvg-scratchdev", 0, {version=1, ...}) = 0 > > So the first call for XFS_GETQSTATV return EINVAL. > > In linux kernel quota_getxstatev() function, the logic is: > /* If this kernel doesn't support user specified version, fail */ > switch (fqs.qs_version) { > case FS_QSTATV_VERSION1: > break; > default: > return -EINVAL; > } > > So we need to set qa_version to FS_QSTATV_VERSION1, before > we call XFS_GETQSTATV. And as we talked on IRC, it test passed if I set > > sv.qs_version = 1; > > at here. > > So maybe a V2 patch is needed to fix this problem:) Yep, kernel commit said: | Callers of the new quotactl command have to set the version of the data | structure being passed, and kernel will fill as much data as requested. | If the kernel does not support the user-space provided version, EINVAL | will be returned. User-space can reduce the version number and call the same | quotactl again. but this isn't documented anywhere else, AFAICT; this call still isn't documented in the quotactl manpage. o_O I'll fix it up, thanks for catching it! -Eric From billodo@redhat.com Mon Aug 15 13:38:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CD7B97CA3 for ; Mon, 15 Aug 2016 13:38:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 925D18F8138 for ; Mon, 15 Aug 2016 11:38:48 -0700 (PDT) X-ASG-Debug-ID: 1471286327-0bf57c136964f200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xlQlXuYhdV0b4TWr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 11:38:47 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 075CB8535A for ; Mon, 15 Aug 2016 18:38:47 +0000 (UTC) Received: from localhost.localdomain.com (vpn-56-109.rdu2.redhat.com [10.10.56.109]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FIcjrn018199 for ; Mon, 15 Aug 2016 14:38:46 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfs_quota: changes to accomodate hoisted ioctl defs Date: Mon, 15 Aug 2016 13:38:30 -0500 X-ASG-Orig-Subj: [PATCH 2/3] xfs_quota: changes to accomodate hoisted ioctl defs Message-Id: <1471286311-2730-3-git-send-email-billodo@redhat.com> In-Reply-To: <1471286311-2730-1-git-send-email-billodo@redhat.com> References: <1471286311-2730-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 15 Aug 2016 18:38:47 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471286327 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3387 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The kernel commit to make the ioctl promotion (334e580a6f) moved the definitions for the XFS ioctl to uapi/linux/fs.h for the following reason: Hoist the ioctl definitions for the XFS_IOC_FS[SG]SETXATTR API from fs/xfs/libxfs/xfs_fs.h to include/uapi/linux/fs.h so that the ioctls can be used by all filesystems, not just XFS. This enables (initially) ext4 to use the ioctl to set project IDs on inodes. This means we now need to handle this change in userspace as the uapi/linux/fs.h file may not contain the definitions (i.e. new xfsprogs/ old linux uapi files) xfsprogs needs to build. Hence we need to massage the definition in xfs_fs.h to take the values from the system header if it exists, otherwise keep the old definitions for compatibility and platforms other than linux.. This patch was originally submitted by Dave Chinner (http://oss.sgi.com/archives/xfs/2016-02/msg00108.html) Resubmitting with changes to accomodate upstream changes since initial submission. Signed-off-by: Dave Chinner Signed-off-by: Bill O'Donnell --- libxfs/xfs_fs.h | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 085ea6f..6ecb7f2 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -35,10 +35,41 @@ struct dioattr { }; #endif +/* check whether we have to define FS_IOC_FS[GS]ETXATTR ourselves */ +#ifndef FS_IOC_FSGETXATTR +struct fsxattr { + __u32 fsx_xflags; /* xflags field value (get/set) */ + __u32 fsx_extsize; /* extsize field value (get/set)*/ + __u32 fsx_projid; /* project identifier (get/set) */ + unsigned char fsx_pad[12]; +}; + +/* + * Flags for the fsx_xflags field + */ +#define FS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */ +#define FS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */ +#define FS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */ +#define FS_XFLAG_APPEND 0x00000010 /* all writes append */ +#define FS_XFLAG_SYNC 0x00000020 /* all writes synchronous */ +#define FS_XFLAG_NOATIME 0x00000040 /* do not update access time */ +#define FS_XFLAG_NODUMP 0x00000080 /* do not include in backups */ +#define FS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */ +#define FS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */ +#define FS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */ +#define FS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */ +#define FS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */ +#define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ +#define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ +#define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ + +#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) +#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) + +#endif + /* - * Flags for the bs_xflags/fsx_xflags field in XFS_IOC_FS[GS]ETXATTR[A] - * These are for backwards compatibility only. New code should - * use the kernel [4.5 onwards] defined FS_XFLAG_* definitions directly. + * Flags for the bs_xflags/fsx_xflags field in FS_IOC_FS[GS]ETXATTR[A] */ #define XFS_XFLAG_REALTIME FS_XFLAG_REALTIME #define XFS_XFLAG_PREALLOC FS_XFLAG_PREALLOC -- 2.7.4 From billodo@redhat.com Mon Aug 15 13:38:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 139EC7CA4 for ; Mon, 15 Aug 2016 13:38:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BDB7030411C for ; Mon, 15 Aug 2016 11:38:48 -0700 (PDT) X-ASG-Debug-ID: 1471286327-0bf8151be31a55f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FwX0oFCNpC5R7yNo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 11:38:47 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 833AC3B72D for ; Mon, 15 Aug 2016 18:38:47 +0000 (UTC) Received: from localhost.localdomain.com (vpn-56-109.rdu2.redhat.com [10.10.56.109]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FIcjro018199 for ; Mon, 15 Aug 2016 14:38:47 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH 3/3] xfs_quota: additional changes to allow use on ext4 Date: Mon, 15 Aug 2016 13:38:31 -0500 X-ASG-Orig-Subj: [PATCH 3/3] xfs_quota: additional changes to allow use on ext4 Message-Id: <1471286311-2730-4-git-send-email-billodo@redhat.com> In-Reply-To: <1471286311-2730-1-git-send-email-billodo@redhat.com> References: <1471286311-2730-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Mon, 15 Aug 2016 18:38:47 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471286327 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2372 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Further changes to allow xfs_quota to be used on foreign filesystem(s) (e.g. ext4) for project quota testing in xfstests. Add CMD_FLAG_GENERIC to enable generic xfs_quota commands (help and quit) when xfs_quota is run on foreign filesystems. Use CMD_FLAG_FOREIGN_OK on commands suitable for foreign filesystems. Signed-off-by: Bill O'Donnell --- include/command.h | 1 + libxcmd/help.c | 3 ++- libxcmd/quit.c | 3 ++- quota/init.c | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/command.h b/include/command.h index 81d5a4d..1c2898a 100644 --- a/include/command.h +++ b/include/command.h @@ -22,6 +22,7 @@ #define CMD_FLAG_GLOBAL (1<<31) /* don't iterate "args" */ #define CMD_FLAG_FOREIGN_OK (1<<30) /* command not restricted to XFS */ +#define CMD_FLAG_GENERIC (1<<29) /* command is generic (help, quit) */ typedef int (*cfunc_t)(int argc, char **argv); typedef void (*helpfunc_t)(void); diff --git a/libxcmd/help.c b/libxcmd/help.c index fad0ab9..be26765 100644 --- a/libxcmd/help.c +++ b/libxcmd/help.c @@ -88,7 +88,8 @@ help_init(void) help_cmd.cfunc = help_f; help_cmd.argmin = 0; help_cmd.argmax = 1; - help_cmd.flags = CMD_FLAG_GLOBAL; + help_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | + CMD_FLAG_GENERIC; help_cmd.args = _("[command]"); help_cmd.oneline = _("help for one or all commands"); diff --git a/libxcmd/quit.c b/libxcmd/quit.c index 0183b8f..2a27c89 100644 --- a/libxcmd/quit.c +++ b/libxcmd/quit.c @@ -38,7 +38,8 @@ quit_init(void) quit_cmd.cfunc = quit_f; quit_cmd.argmin = -1; quit_cmd.argmax = -1; - quit_cmd.flags = CMD_FLAG_GLOBAL; + quit_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | + CMD_FLAG_GENERIC; quit_cmd.oneline = _("exit the program"); add_command(&quit_cmd); diff --git a/quota/init.c b/quota/init.c index c46ce0f..3b2fd61 100644 --- a/quota/init.c +++ b/quota/init.c @@ -104,7 +104,8 @@ init_check_command( const cmdinfo_t *ct) { if (fs_path && - !(ct->flags & CMD_FLAG_FOREIGN_OK) && + !((ct->flags & CMD_FLAG_FOREIGN_OK) && foreign_allowed) && + !(ct->flags & CMD_FLAG_GENERIC) && (fs_path->fs_flags & FS_FOREIGN)) { fprintf(stderr, _("foreign mount active, %s command is for XFS filesystems only\n"), -- 2.7.4 From billodo@redhat.com Mon Aug 15 13:38:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B2EC07CA2 for ; Mon, 15 Aug 2016 13:38:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 686BD30411C for ; Mon, 15 Aug 2016 11:38:48 -0700 (PDT) X-ASG-Debug-ID: 1471286326-0bf8151be41a55f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zgFgBE40apyo6Myr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 11:38:46 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7BD0DC05680F for ; Mon, 15 Aug 2016 18:38:46 +0000 (UTC) Received: from localhost.localdomain.com (vpn-56-109.rdu2.redhat.com [10.10.56.109]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FIcjrm018199 for ; Mon, 15 Aug 2016 14:38:46 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfs_quota: add capabilities for use on ext4 Date: Mon, 15 Aug 2016 13:38:29 -0500 X-ASG-Orig-Subj: [PATCH 1/3] xfs_quota: add capabilities for use on ext4 Message-Id: <1471286311-2730-2-git-send-email-billodo@redhat.com> In-Reply-To: <1471286311-2730-1-git-send-email-billodo@redhat.com> References: <1471286311-2730-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 15 Aug 2016 18:38:46 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471286326 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11612 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This allows xfs_quota to be used on ext4 for project quota testing in xfstests. This patch was originally submitted by Dave Chinner (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html) Resubmitting with the following change: quota/init.c: correct logic error in loop contained in init_args_command() function (lines 85-91). Signed-off-by: Dave Chinner Signed-off-by: Bill O'Donnell --- include/command.h | 3 ++- include/path.h | 1 + io/init.h | 2 +- libxcmd/paths.c | 7 +++---- quota/free.c | 2 ++ quota/init.c | 27 ++++++++++++++++++++++++++- quota/init.h | 1 + quota/path.c | 5 +++-- quota/project.c | 1 + quota/quot.c | 1 + quota/quota.c | 2 ++ quota/report.c | 11 +++++++++-- quota/state.c | 4 +++- quota/util.c | 1 + 14 files changed, 56 insertions(+), 12 deletions(-) diff --git a/include/command.h b/include/command.h index 7b9fc28..81d5a4d 100644 --- a/include/command.h +++ b/include/command.h @@ -20,7 +20,8 @@ #include -#define CMD_FLAG_GLOBAL ((int)0x80000000) /* don't iterate "args" */ +#define CMD_FLAG_GLOBAL (1<<31) /* don't iterate "args" */ +#define CMD_FLAG_FOREIGN_OK (1<<30) /* command not restricted to XFS */ typedef int (*cfunc_t)(int argc, char **argv); typedef void (*helpfunc_t)(void); diff --git a/include/path.h b/include/path.h index 46a887e..39c1a95 100644 --- a/include/path.h +++ b/include/path.h @@ -29,6 +29,7 @@ #define FS_MOUNT_POINT (1<<0) #define FS_PROJECT_PATH (1<<1) +#define FS_FOREIGN (1<<2) typedef struct fs_path { char *fs_name; /* Data device for filesystem */ diff --git a/io/init.h b/io/init.h index d773b1b..bb25242 100644 --- a/io/init.h +++ b/io/init.h @@ -18,7 +18,7 @@ #define CMD_NOFILE_OK (1<<0) /* command doesn't need an open file */ #define CMD_NOMAP_OK (1<<1) /* command doesn't need a mapped region */ -#define CMD_FOREIGN_OK (1<<2) /* command not restricted to XFS files */ +#define CMD_FOREIGN_OK CMD_FLAG_FOREIGN_OK extern char *progname; extern int exitcode; diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 71af25f..7c8c673 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -113,6 +113,9 @@ fs_table_insert( goto out_nodev; } + if (!platform_test_xfs_path(dir)) + flags |= FS_FOREIGN; + /* * Make copies of the directory and data device path. * The log device and real-time device, if non-null, @@ -301,8 +304,6 @@ fs_table_initialise_mounts( return errno; while ((mnt = getmntent(mtp)) != NULL) { - if (strcmp(mnt->mnt_type, "xfs") != 0) - continue; if (!realpath(mnt->mnt_dir, rmnt_dir)) continue; if (!realpath(mnt->mnt_fsname, rmnt_fsname)) @@ -360,8 +361,6 @@ fs_table_initialise_mounts( return errno; for (i = 0; i < count; i++) { - if (strcmp(stats[i].f_fstypename, "xfs") != 0) - continue; if (!realpath(stats[i].f_mntfromname, rmntfromname)) continue; if (!realpath(stats[i].f_mntonname, rmntonname)) diff --git a/quota/free.c b/quota/free.c index e9e0319..b9be954 100644 --- a/quota/free.c +++ b/quota/free.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include "init.h" #include "quota.h" @@ -371,6 +372,7 @@ free_init(void) free_cmd.args = _("[-bir] [-hn] [-f file]"); free_cmd.oneline = _("show free and used counts for blocks and inodes"); free_cmd.help = free_help; + free_cmd.flags = CMD_FLAG_FOREIGN_OK; add_command(&free_cmd); } diff --git a/quota/init.c b/quota/init.c index 52f7941..c46ce0f 100644 --- a/quota/init.c +++ b/quota/init.c @@ -24,6 +24,7 @@ char *progname; int exitcode; int expert; +bool foreign_allowed = false; static char **projopts; /* table of project names (cmdline) */ static int nprojopts; /* number of entries in name table. */ @@ -83,15 +84,36 @@ init_args_command( do { fs_path = &fs_table[index++]; + if (fs_path->fs_flags & FS_PROJECT_PATH) + continue; + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + continue; } while ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count); if (fs_path->fs_flags & FS_PROJECT_PATH) return 0; + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + return 0; if (index > fs_count) return 0; return index; } +static int +init_check_command( + const cmdinfo_t *ct) +{ + if (fs_path && + !(ct->flags & CMD_FLAG_FOREIGN_OK) && + (fs_path->fs_flags & FS_FOREIGN)) { + fprintf(stderr, + _("foreign mount active, %s command is for XFS filesystems only\n"), + ct->name); + return 0; + } + return 1; +} + static void init( int argc, @@ -104,7 +126,7 @@ init( bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - while ((c = getopt(argc, argv, "c:d:D:P:p:t:xV")) != EOF) { + while ((c = getopt(argc, argv, "c:d:D:fP:p:t:xV")) != EOF) { switch (c) { case 'c': /* commands */ add_user_command(optarg); @@ -112,6 +134,8 @@ init( case 'd': add_project_opt(optarg); break; + case 'f': + foreign_allowed = true; case 't': mtab_file = optarg; break; @@ -140,6 +164,7 @@ init( init_commands(); add_args_command(init_args_command); + add_check_command(init_check_command); /* * Ensure that global commands don't end up with an invalid path pointer diff --git a/quota/init.h b/quota/init.h index 71706cb..6879855 100644 --- a/quota/init.h +++ b/quota/init.h @@ -19,6 +19,7 @@ extern char *progname; extern int exitcode; extern int expert; +extern bool foreign_allowed; extern void edit_init(void); extern void free_init(void); diff --git a/quota/path.c b/quota/path.c index bdb8c98..a623d25 100644 --- a/quota/path.c +++ b/quota/path.c @@ -42,6 +42,7 @@ printpath( if (number) { printf(_("%c%03d%c "), braces? '[':' ', index, braces? ']':' '); } + printf("%s ", (path->fs_flags & FS_FOREIGN) ? "(F)" : " "); printf(_("%-19s %s"), path->fs_dir, path->fs_name); if (path->fs_flags & FS_PROJECT_PATH) { prj = getprprid(path->fs_prid); @@ -127,7 +128,7 @@ path_init(void) path_cmd.cfunc = path_f; path_cmd.argmin = 0; path_cmd.argmax = 1; - path_cmd.flags = CMD_FLAG_GLOBAL; + path_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; path_cmd.oneline = _("set current path, or show the list of paths"); print_cmd.name = "print"; @@ -135,7 +136,7 @@ path_init(void) print_cmd.cfunc = print_f; print_cmd.argmin = 0; print_cmd.argmax = 0; - print_cmd.flags = CMD_FLAG_GLOBAL; + print_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; print_cmd.oneline = _("list known mount points and projects"); if (expert) diff --git a/quota/project.c b/quota/project.c index fb8b9e1..e4e7a01 100644 --- a/quota/project.c +++ b/quota/project.c @@ -355,6 +355,7 @@ project_init(void) project_cmd.argmax = -1; project_cmd.oneline = _("check, setup or clear project quota trees"); project_cmd.help = project_help; + project_cmd.flags = CMD_FLAG_FOREIGN_OK; if (expert) add_command(&project_cmd); diff --git a/quota/quot.c b/quota/quot.c index 2e583e5..ccc154f 100644 --- a/quota/quot.c +++ b/quota/quot.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include #include diff --git a/quota/quota.c b/quota/quota.c index e0da7c0..d09e239 100644 --- a/quota/quota.c +++ b/quota/quota.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include #include @@ -469,6 +470,7 @@ quota_init(void) quota_cmd.args = _("[-bir] [-g|-p|-u] [-hnNv] [-f file] [id|name]..."); quota_cmd.oneline = _("show usage and limits"); quota_cmd.help = quota_help; + quota_cmd.flags = CMD_FLAG_FOREIGN_OK; add_command("a_cmd); } diff --git a/quota/report.c b/quota/report.c index 70220b4..604f50d 100644 --- a/quota/report.c +++ b/quota/report.c @@ -15,7 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include #include "command.h" #include #include @@ -618,6 +618,8 @@ report_any_type( if (type & XFS_USER_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_USER_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -629,6 +631,8 @@ report_any_type( if (type & XFS_GROUP_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_GROUP_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -640,6 +644,8 @@ report_any_type( if (type & XFS_PROJ_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_PROJ_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -754,16 +760,17 @@ report_init(void) dump_cmd.args = _("[-g|-p|-u] [-f file]"); dump_cmd.oneline = _("dump quota information for backup utilities"); dump_cmd.help = dump_help; + dump_cmd.flags = CMD_FLAG_FOREIGN_OK; report_cmd.name = "report"; report_cmd.altname = "repquota"; report_cmd.cfunc = report_f; report_cmd.argmin = 0; report_cmd.argmax = -1; - report_cmd.flags = CMD_FLAG_GLOBAL; report_cmd.args = _("[-bir] [-gpu] [-ahnt] [-f file]"); report_cmd.oneline = _("report filesystem quota information"); report_cmd.help = report_help; + report_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; if (expert) { add_command(&dump_cmd); diff --git a/quota/state.c b/quota/state.c index 8186762..d134580 100644 --- a/quota/state.c +++ b/quota/state.c @@ -15,7 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include #include "command.h" #include "init.h" #include "quota.h" @@ -527,6 +527,7 @@ state_init(void) off_cmd.args = _("[-gpu] [-v]"); off_cmd.oneline = _("permanently switch quota off for a path"); off_cmd.help = off_help; + off_cmd.flags = CMD_FLAG_FOREIGN_OK; state_cmd.name = "state"; state_cmd.cfunc = state_f; @@ -535,6 +536,7 @@ state_init(void) state_cmd.args = _("[-gpu] [-a] [-v] [-f file]"); state_cmd.oneline = _("get overall quota state information"); state_cmd.help = state_help; + state_cmd.flags = CMD_FLAG_FOREIGN_OK; enable_cmd.name = "enable"; enable_cmd.cfunc = enable_f; diff --git a/quota/util.c b/quota/util.c index e3c5398..cafd45f 100644 --- a/quota/util.c +++ b/quota/util.c @@ -17,6 +17,7 @@ */ #include +#include #include #include #include -- 2.7.4 From billodo@redhat.com Mon Aug 15 13:38:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8FEAE7CA3 for ; Mon, 15 Aug 2016 13:38:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 47D598F8138 for ; Mon, 15 Aug 2016 11:38:47 -0700 (PDT) X-ASG-Debug-ID: 1471286326-0bf8151be11a55e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nMkt8cf4wNF21tfj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 15 Aug 2016 11:38:46 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D98AF81110 for ; Mon, 15 Aug 2016 18:38:45 +0000 (UTC) Received: from localhost.localdomain.com (vpn-56-109.rdu2.redhat.com [10.10.56.109]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7FIcjrl018199 for ; Mon, 15 Aug 2016 14:38:45 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH 0/3] xfs_quota: allow operation on ext4 for project quotas Date: Mon, 15 Aug 2016 13:38:28 -0500 X-ASG-Orig-Subj: [PATCH 0/3] xfs_quota: allow operation on ext4 for project quotas Message-Id: <1471286311-2730-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Mon, 15 Aug 2016 18:38:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471286326 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 542 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello - This is a resubmission of Dave Chinner's original 2-patch series to enable using xfs_quota for project quotas on foreign filesystems (e.g. ext4). Original series: http://oss.sgi.com/archives/xfs/2016-02/msg00107.html Updated series: Patch 1: initial capabilities to enable xfs_quota use on foreign filesystems. Patch 2: userspace changes to accomodate hoisted ioctl defs in kernel Patch 3: additional changes to accomodate xfs_quota use on foreign filesystems. Questions and comments are welcome. Thanks- Bill From jgibson@spscommerce.com Mon Aug 15 18:36:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 041067CA2 for ; Mon, 15 Aug 2016 18:36:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6EC09AC003 for ; Mon, 15 Aug 2016 16:36:20 -0700 (PDT) X-ASG-Debug-ID: 1471304177-0bf57c0d0107b50001-NocioJ Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0075.outbound.protection.outlook.com [104.47.36.75]) by cuda.sgi.com with ESMTP id Wbz5EYZVXi2QJTRc (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 15 Aug 2016 16:36:17 -0700 (PDT) X-Barracuda-Envelope-From: jgibson@spscommerce.com X-Barracuda-Effective-Source-IP: mail-sn1nam02on0075.outbound.protection.outlook.com[104.47.36.75] X-Barracuda-Apparent-Source-IP: 104.47.36.75 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spscommerce.onmicrosoft.com; s=selector1-spscommerce-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=XbWSi+jSpZG8nEybSpy+3ondftya8Q/uOHexHwbYRE8=; b=RGRHVq9ncQVM2jvj7Nag2GSjlutoaY+EK8SGLyoJGEkAW13ebcri6AdAwiJri4CQeyNjnP0fMZUpCx4bWcLdAUkOaAGcR7MbhrVw6UdEGudKZPMvPaBxjE1a8d38HMUGzyN6rqSrMPzXDEvcLfndqmUWG14zWMxiKMeUhJXkqEU= Received: from CY1PR04MB2010.namprd04.prod.outlook.com (10.166.191.23) by CY1PR04MB2010.namprd04.prod.outlook.com (10.166.191.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Mon, 15 Aug 2016 23:36:14 +0000 Received: from CY1PR04MB2010.namprd04.prod.outlook.com ([10.166.191.23]) by CY1PR04MB2010.namprd04.prod.outlook.com ([10.166.191.23]) with mapi id 15.01.0549.027; Mon, 15 Aug 2016 23:36:14 +0000 From: Jeff Gibson To: "xfs@oss.sgi.com" Subject: XFS on top of LVM span in AWS. Stripe or are AG's good enough? Thread-Topic: XFS on top of LVM span in AWS. Stripe or are AG's good enough? X-ASG-Orig-Subj: XFS on top of LVM span in AWS. Stripe or are AG's good enough? Thread-Index: AQHR90Aa/Ibw35Nk+k2bm9/FclSkbA== Date: Mon, 15 Aug 2016 23:36:14 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=jgibson@spscommerce.com; x-originating-ip: [25.161.247.4] x-ms-office365-filtering-correlation-id: f7b5b570-23dd-4b3a-b1c9-08d3c564f288 x-microsoft-exchange-diagnostics: 1;CY1PR04MB2010;6:pJGee8VuutzI5gbKJjpc8aIGcGFCT7Z6dzg7si0wS1aA8jtDUhC9ZbdVaHP2PGN9pyCPyfjuj5GDwZXduTtNgHLiRVfQe5BVFzbdLlZN+6muczMkaXLP6AWJNmW/vpO7X2F9HUoBF/CtuofpyKqYCoQlS0Py+E7YQZ/zOBCJWy9fc0fM9fWQ5FewpL/Kz5o4876EvMh/8Q0jS72nIDx9BvMlefv6q7LppyjHgRQlafoBUqzkgS75yLUD1DmYLc5x1BlL2gXy3sR9/vSAWEPi+wFw+IcNf2mc2GPtAfAjHKs=;5:/Opj2E8fQblj3t91Wel3Ah81nO1ro0mYUx1sm+cixt5mTjPuta9yg5UA0wsZK1G4lEfdvWJ5ClVHfSOZHfa4wdsG9noXksEoXwSr8+/Fy2Wv1oEwm1dLMippbJFxT2lIkRcew7q0W8AWqSwFWunKdg==;24:HMI2o45wj1VBt5MX19xmc2Lri7ciPI/R3ZxXL7hsRQ703Nb9SKHGKH4+aW3we5ruIkEtlghlmZc+uplrLEQRYQOpHCBAsXlxQ9whqA6FYJQ=;7:6TZWrxgl8OLyAoC2p4EKHk7xi2pV97wyXMvCSaX1IM4fhW42auVx1LPVUc8j/C0to4XAv75VsPrLtkZlPb1RxgDgzop+Q2uANG+ZJMMNVe+V+Zhx6G4QGnVmj/wqviPU2T1Sqqu4db+G51oPeR8H7a4rpK3pvtPDWXX21F3QYq5WQuEDMl0H6fxOyyK1dJ/OPhYoMUXGmsezhM9VtzDRqN8AiQBACBnYvnhS2n9n5U3kQPYKQDpxF9s7zKihUSct x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR04MB2010; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(159839258108289); x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046);SRVR:CY1PR04MB2010;BCL:0;PCL:0;RULEID:;SRVR:CY1PR04MB2010; x-forefront-prvs: 0035B15214 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(7916002)(199003)(189002)(3280700002)(102836003)(11100500001)(10400500002)(7906003)(3660700001)(7846002)(68736007)(586003)(2906002)(50986999)(7736002)(101416001)(2900100001)(54356999)(9686002)(77096005)(106116001)(8676002)(15975445007)(19580395003)(8936002)(122556002)(87936001)(5002640100001)(7696003)(1730700003)(106356001)(6116002)(81156014)(74316002)(81166006)(2351001)(229853001)(19617315012)(450100001)(107886002)(99286002)(105586002)(2501003)(3846002)(66066001)(76576001)(16236675004)(19627405001)(19625215002)(97736004)(189998001)(92566002)(86362001)(110136002)(33656002);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR04MB2010;H:CY1PR04MB2010.namprd04.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; received-spf: None (protection.outlook.com: spscommerce.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: multipart/alternative; boundary="_000_CY1PR04MB20100FE6C3039717BD27825AAC120CY1PR04MB2010namp_" MIME-Version: 1.0 X-OriginatorOrg: spscommerce.com X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Aug 2016 23:36:14.2765 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 925b3535-30d6-4f8f-b70f-a7aa7e1b3445 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR04MB2010 X-Barracuda-Connect: mail-sn1nam02on0075.outbound.protection.outlook.com[104.47.36.75] X-Barracuda-Start-Time: 1471304177 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3611 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --_000_CY1PR04MB20100FE6C3039717BD27825AAC120CY1PR04MB2010namp_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable So I'm creating an LVM volume with 8 AWS EBS disks that are spanned (linear= ) per Redhat's documentation for Gluster (https://access.redhat.com/documen= tation/en-US/Red_Hat_Storage/3.1/html/Deployment_Guide_for_Public_Cloud/ch0= 2s03.html#Provisioning_Storage_for_Three-way_Replication_Volumes). 2 questions- 1. Will XFS's Allocation Groups essentially stripe the data for me or shou= ld I stripe the underlying volumes with LVM? I'm not worried as much about= data integrity with a stripe/span since Gluster is doing the redundancy wo= rk. 2. AWS volumes sometimes have inconsistent performance. If I understand t= hings correctly, AG's run in parallel. In a non-striped volume, if some of= the AGs are temporarily slower to respond than others due to one of the un= derlying volumes being slow, will XFS prefer the quicker responding AGs or = is I/O always evenly distributed? If XFS prefers the more responsive AG's = it seems to me that it would be better NOT to stripe the underlying disk si= nce all AG's that are distributed in a stripe will continuously hit all com= ponent volumes, including the slow volume (unless if XFS compensates for th= is?) Thank you --_000_CY1PR04MB20100FE6C3039717BD27825AAC120CY1PR04MB2010namp_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
So I'm creating an LVM volume with 8 AWS EBS disks that are spanned (l= inear) per Redhat's documentation for Gluster (https://access.redhat.= com/documentation/en-US/Red_Hat_Storage/3.1/html/Deployment_Guide_for_Publi= c_Cloud/ch02s03.html#Provisioning_Storage_for_Three-way_Replication_Volumes= ).  

2 questions-

1.  Will XFS's Allocation Groups essentially stripe the data=  for me or should I stripe the underlying volumes with LVM?  I'm no= t worried as much about data integrity with a stripe/span since Gluster is = doing the redundancy work.

2.  AWS volumes sometimes have inconsistent performance.  If= I understand things correctly, AG's run in parallel.  In a non-stripe= d volume, if some of the AGs are temporarily slower to respond than others = due to one of the underlying volumes being slow, will XFS prefer the quicker responding AGs or is I/O always evenly distrib= uted?  If XFS prefers the more responsive AG's it seems to me that it = would be better NOT to stripe the underlying disk since all AG's that = are distributed in a stripe will continuously hit all component volumes, including the slow volume (unless if XFS compe= nsates for this?)

Thank you
--_000_CY1PR04MB20100FE6C3039717BD27825AAC120CY1PR04MB2010namp_-- From david@fromorbit.com Mon Aug 15 19:59:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4A29C7CA2 for ; Mon, 15 Aug 2016 19:59:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F3EF28F8039 for ; Mon, 15 Aug 2016 17:59:35 -0700 (PDT) X-ASG-Debug-ID: 1471309172-0bf81563e40b1f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 129P9EiFhBaxRA2i for ; Mon, 15 Aug 2016 17:59:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C9EAABZLJXEAI1LHleg0VWfIJ5oUQGjGaKGx+EbgGBCQQCAoFPTQIBAQEBAQIGAQEBAQEBAQE3QIReAQEEATocIwULCAMOCgklDwUlAwcaE4gpBw++NgEBAQEGAQEBAR4FHoVEhRWCaIFEg0CCLwWZQIYeiG+PTYw3g3iEYCoyAQGFZAElBIEbAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl6.internode.on.net with ESMTP; 16 Aug 2016 10:29:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bZSj5-0003Mw-GF; Tue, 16 Aug 2016 10:59:31 +1000 Date: Tue, 16 Aug 2016 10:59:31 +1000 From: Dave Chinner To: Jeff Gibson Cc: "xfs@oss.sgi.com" Subject: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? Message-ID: <20160816005931.GD19025@dastard> X-ASG-Orig-Subj: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1471309172 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2116 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC1_TG070 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32041 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.50 BSF_SC1_TG070 Custom Rule TG070 On Mon, Aug 15, 2016 at 11:36:14PM +0000, Jeff Gibson wrote: > So I'm creating an LVM volume with 8 AWS EBS disks that are > spanned (linear) per Redhat's documentation for Gluster > (https://access.redhat.com/documentation/en-US/Red_Hat_Storage/3.1/html/Deployment_Guide_for_Public_Cloud/ch02s03.html#Provisioning_Storage_for_Three-way_Replication_Volumes). > > 2 questions- > > 1. Will XFS's Allocation Groups essentially stripe the data for > me No. XFS does not stripe data. It does, however, *distribute* data different AGs according to locality policy (e.g. inode32 vs inode64), so it uses all the AGs as the directory structure grows. > or should I stripe the underlying volumes with LVM? No, you're using EBS. Forget anything you know about storage layout and geometry, because EBS has no guaranteed physical layout you can optimise for. > I'm not > worried as much about data integrity with a stripe/span since > Gluster is doing the redundancy work. > > 2. AWS volumes sometimes have inconsistent performance. If I > understand things correctly, AG's run in parallel. Define "run". AGs can allocate/free blocks in parallel. If IO does not require allocation, then AGs play no part in the IO path. > In a > non-striped volume, if some of the AGs are temporarily slower to > respond than others due to one of the underlying volumes being > slow, will XFS prefer the quicker responding AGs No, it does not. > or is I/O always > evenly distributed? No, it is not. > If XFS prefers the more responsive AG's it > seems to me that it would be better NOT to stripe the underlying > disk since all AG's that are distributed in a stripe will > continuously hit all component volumes, including the slow volume > (unless if XFS compensates for this?) I think you have the wrong idea about what allocation groups do. They are for maintaining allocation concurrency and locality of related objects on disk - they have no influence on where IO is directed based on IO load or response time. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Aug 15 22:17:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 00BC67CA2 for ; Mon, 15 Aug 2016 22:17:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 793B1AC05A for ; Mon, 15 Aug 2016 20:17:24 -0700 (PDT) X-ASG-Debug-ID: 1471317440-0bf81563e70dc80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8ElwmUSCxXpvhUrj for ; Mon, 15 Aug 2016 20:17:20 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 36DE74454 for ; Mon, 15 Aug 2016 22:17:20 -0500 (CDT) Subject: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV References: From: Eric Sandeen Message-ID: <2ca2dc3b-53d2-0791-644f-c9cd5abef89f@sandeen.net> Date: Mon, 15 Aug 2016 22:17:19 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471317440 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8274 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32042 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The new XFS_GETQSTATV quotactl, available since kernel v3.12, was never implemented in xfs_quota, and the "state" command continues to use XFS_GETQSTAT, which cannot report both group & project quota on newer formats. The new call has room for all 3 quota types (user, group, and quota), vs just two, where previously project and quota overlapped. So: First, try XFS_GETQSTATV. If it passes, we have all the information we need, and we print it. state_qfilestat() is modified to take the newer structure. If it fails, try XFS_GETQSTAT. If that passes, we are on an older kernel with neither XFS_GETQSTATV nor the on-disk project quota inode. We copy the available information into the newer statv structure, carefully determining wither group or project (or neither) is actually active, and print it with the same state_qfilestat routine. Signed-off-by: Eric Sandeen --- I probably could have done some memcpy()'s in state_stat_to_statv(), but opted for the explicit copy-out; the structures aren't identical, although the newer one only differs by padding on the end. If memcpy() is preferable I could send a V2... V2: set sv.qs_version = FS_QSTATV_VERSION1; before calling the quotactl (thanks Zorro!) diff --git a/include/xqm.h b/include/xqm.h index c084b2d..5b6934a 100644 --- a/include/xqm.h +++ b/include/xqm.h @@ -32,6 +32,7 @@ #define Q_XGETQSTAT XQM_CMD(5) /* get quota subsystem status */ #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */ #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */ +#define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */ #define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage */ /* @@ -149,4 +150,35 @@ typedef struct fs_quota_stat { __u16 qs_iwarnlimit; /* limit for num warnings */ } fs_quota_stat_t; + +#ifndef FS_QSTATV_VERSION1 +#define FS_QSTATV_VERSION1 1 /* fs_quota_statv.qs_version */ +#endif + +/* + * Some basic information about 'quota files' for Q_XGETQSTATV command + */ +struct fs_qfilestatv { + __u64 qfs_ino; /* inode number */ + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ + __u32 qfs_nextents; /* number of extents */ + __u32 qfs_pad; /* pad for 8-byte alignment */ +}; + +struct fs_quota_statv { + __s8 qs_version; /* version for future changes */ + __u8 qs_pad1; /* pad for 16bit alignment */ + __u16 qs_flags; /* FS_QUOTA_.* flags */ + __u32 qs_incoredqs; /* number of dquots incore */ + struct fs_qfilestatv qs_uquota; /* user quota information */ + struct fs_qfilestatv qs_gquota; /* group quota information */ + struct fs_qfilestatv qs_pquota; /* project quota information */ + __s32 qs_btimelimit; /* limit for blks timer */ + __s32 qs_itimelimit; /* limit for inodes timer */ + __s32 qs_rtbtimelimit;/* limit for rt blks timer */ + __u16 qs_bwarnlimit; /* limit for num warnings */ + __u16 qs_iwarnlimit; /* limit for num warnings */ + __u64 qs_pad2[8]; /* for future proofing */ +}; + #endif /* __XQM_H__ */ diff --git a/quota/linux.c b/quota/linux.c index 74dba01..4f1f3c4 100644 --- a/quota/linux.c +++ b/quota/linux.c @@ -55,6 +55,8 @@ xcommand_to_qcommand( return Q_XSETQLIM; case XFS_GETQSTAT: return Q_XGETQSTAT; + case XFS_GETQSTATV: + return Q_XGETQSTATV; case XFS_QUOTARM: return Q_XQUOTARM; case XFS_QSYNC: diff --git a/quota/state.c b/quota/state.c index 8186762..9f6616e 100644 --- a/quota/state.c +++ b/quota/state.c @@ -111,12 +111,12 @@ remove_help(void) static void state_qfilestat( - FILE *fp, - fs_path_t *mount, - uint type, - fs_qfilestat_t *qfs, - int accounting, - int enforcing) + FILE *fp, + struct fs_path *mount, + uint type, + struct fs_qfilestatv *qfs, + int accounting, + int enforcing) { fprintf(fp, _("%s quota state on %s (%s)\n"), type_to_string(type), mount->fs_dir, mount->fs_name); @@ -142,39 +142,96 @@ state_timelimit( time_to_string(timelimit, VERBOSE_FLAG | ABSOLUTE_FLAG)); } +/* + * fs_quota_stat holds a subset of fs_quota_statv; this copies + * the smaller into the larger, leaving any not-present fields + * empty. This is so the same reporting function can be used + * for both XFS_GETQSTAT and XFS_GETQSTATV results. + */ static void -state_quotafile_mount( - FILE *fp, - uint type, - fs_path_t *mount, - uint flags) +state_stat_to_statv( + struct fs_quota_stat *s, + struct fs_quota_statv *sv) { - fs_quota_stat_t s; - char *dev = mount->fs_name; + memset(sv, 0, sizeof(struct fs_quota_statv)); + + /* shared information */ + sv->qs_version = s->qs_version; + sv->qs_flags = s->qs_flags; + sv->qs_incoredqs = s->qs_incoredqs; + sv->qs_btimelimit = s->qs_btimelimit; + sv->qs_itimelimit = s->qs_itimelimit; + sv->qs_rtbtimelimit = s->qs_rtbtimelimit; + sv->qs_bwarnlimit = s->qs_bwarnlimit; + sv->qs_iwarnlimit = s->qs_iwarnlimit; + + /* Always room for uquota */ + sv->qs_uquota.qfs_ino = s->qs_uquota.qfs_ino; + sv->qs_uquota.qfs_nblks = s->qs_uquota.qfs_nblks; + sv->qs_uquota.qfs_nextents = s->qs_uquota.qfs_nextents; + + /* + * If we are here, XFS_GETQSTATV failed and XFS_GETQSTAT passed; + * that is a very strong hint that we're on a kernel which predates + * the on-disk pquota inode; both were added in v3.12. So, we do + * some tricksy determination here. + * gs_gquota may hold either group quota inode info, or project + * quota if that is used instead; which one it actually holds depends + * on the quota flags. (If neither is set, neither is used) + */ + if (s->qs_flags & XFS_QUOTA_GDQ_ACCT) { + /* gs_gquota holds group quota info */ + sv->qs_gquota.qfs_ino = s->qs_gquota.qfs_ino; + sv->qs_gquota.qfs_nblks = s->qs_gquota.qfs_nblks; + sv->qs_gquota.qfs_nextents = s->qs_gquota.qfs_nextents; + } else if (s->qs_flags & XFS_QUOTA_PDQ_ACCT) { + /* gs_gquota actually holds project quota info */ + sv->qs_pquota.qfs_ino = s->qs_gquota.qfs_ino; + sv->qs_pquota.qfs_nblks = s->qs_gquota.qfs_nblks; + sv->qs_pquota.qfs_nextents = s->qs_gquota.qfs_nextents; + } +} - if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { - if (flags & VERBOSE_FLAG) - fprintf(fp, _("%s quota are not enabled on %s\n"), - type_to_string(type), dev); - return; +static void +state_quotafile_mount( + FILE *fp, + uint type, + struct fs_path *mount, + uint flags) +{ + struct fs_quota_stat s; + struct fs_quota_statv sv; + char *dev = mount->fs_name; + + sv.qs_version = FS_QSTATV_VERSION1; + + if (xfsquotactl(XFS_GETQSTATV, dev, type, 0, (void *)&sv) < 0) { + if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { + if (flags & VERBOSE_FLAG) + fprintf(fp, + _("%s quota are not enabled on %s\n"), + type_to_string(type), dev); + return; + } + state_stat_to_statv(&s, &sv); } if (type & XFS_USER_QUOTA) - state_qfilestat(fp, mount, XFS_USER_QUOTA, &s.qs_uquota, - s.qs_flags & XFS_QUOTA_UDQ_ACCT, - s.qs_flags & XFS_QUOTA_UDQ_ENFD); + state_qfilestat(fp, mount, XFS_USER_QUOTA, &sv.qs_uquota, + sv.qs_flags & XFS_QUOTA_UDQ_ACCT, + sv.qs_flags & XFS_QUOTA_UDQ_ENFD); if (type & XFS_GROUP_QUOTA) - state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &s.qs_gquota, - s.qs_flags & XFS_QUOTA_GDQ_ACCT, - s.qs_flags & XFS_QUOTA_GDQ_ENFD); + state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &sv.qs_gquota, + sv.qs_flags & XFS_QUOTA_GDQ_ACCT, + sv.qs_flags & XFS_QUOTA_GDQ_ENFD); if (type & XFS_PROJ_QUOTA) - state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &s.qs_gquota, - s.qs_flags & XFS_QUOTA_PDQ_ACCT, - s.qs_flags & XFS_QUOTA_PDQ_ENFD); + state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &sv.qs_pquota, + sv.qs_flags & XFS_QUOTA_PDQ_ACCT, + sv.qs_flags & XFS_QUOTA_PDQ_ENFD); - state_timelimit(fp, XFS_BLOCK_QUOTA, s.qs_btimelimit); - state_timelimit(fp, XFS_INODE_QUOTA, s.qs_itimelimit); - state_timelimit(fp, XFS_RTBLOCK_QUOTA, s.qs_rtbtimelimit); + state_timelimit(fp, XFS_BLOCK_QUOTA, sv.qs_btimelimit); + state_timelimit(fp, XFS_INODE_QUOTA, sv.qs_itimelimit); + state_timelimit(fp, XFS_RTBLOCK_QUOTA, sv.qs_rtbtimelimit); } static void From retoboutgo@mail333.com Mon Aug 15 22:58:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.9 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, TVD_FROM_1 autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3ABB77CA2 for ; Mon, 15 Aug 2016 22:58:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 87BB4AC007 for ; Mon, 15 Aug 2016 20:58:07 -0700 (PDT) X-ASG-Debug-ID: 1471319881-0bf57c0d000e510001-NocioJ Received: from mx.qip.ru ([185.57.172.31]) by cuda.sgi.com with ESMTP id SPMuWAXMHtCHy6s7 for ; Mon, 15 Aug 2016 20:58:02 -0700 (PDT) X-Barracuda-Envelope-From: retoboutgo@mail333.com X-Barracuda-Effective-Source-IP: UNKNOWN[185.57.172.31] X-Barracuda-Apparent-Source-IP: 185.57.172.31 MIME-Version: 1.0 Date: Tue, 16 Aug 2016 06:58:03 +0300 Message-ID: <170137452.20160816065803@EBMPCAQXPF> Subject: =?utf-8?B?0JrQsNC6INC30LDRidC40YLQuNGC0Ywg0YbQtdC70L7RgdGC0L3QvtGB0YLRjCDQutC+0L3RhNC40LTQtdC90YbQuNCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUg0LIg0LrQvtC80L/QsNC90LjQuD8=?= From: "=?utf-8?B?0KPRgNC+0LLQtdC90Ywg0LfQsNGJ0LjRgtGLINC40L3RhNC+0YDQvNCw0YbQuNC+0L3QvdC+0Lkg0LHQtdC30L7Qv9Cw0YHQvdC+0YHRgtC4Lg==?=" X-ASG-Orig-Subj: =?utf-8?B?0JrQsNC6INC30LDRidC40YLQuNGC0Ywg0YbQtdC70L7RgdGC0L3QvtGB0YLRjCDQutC+0L3RhNC40LTQtdC90YbQuNCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUg0LIg0LrQvtC80L/QsNC90LjQuD8=?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=----------8BF99E11AB3A7FFA X-Barracuda-Connect: UNKNOWN[185.57.172.31] X-Barracuda-Start-Time: 1471319881 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 18489 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32044 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------------8BF99E11AB3A7FFA Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 KjI1INCw0LLQs9GD0YHRgtCwIHwg0LMuINCc0L7RgdC60LLQsChjIDEwOjAwINC00L4gMTc6MzAp Kg0K0J/RgNC+0LzQvtC60L7QtDogKjQqKjkzKg0KDQoNCirQn9Ce0JvQmNCi0JjQmtCQINCY0J3Q pNCe0KDQnNCQ0KbQmNCe0J3QndCe0Jkg0JHQldCX0J7Qn9CQ0KHQndCe0KHQotCYLiDQodCe0JfQ lNCQ0J3QmNCVINCg0JXQltCY0JzQkCDQmtCe0JzQnNCV0KDQp9CV0KHQmtCe0Jkg0KLQkNCZ0J3Q qy4NCtCX0JDQqdCY0KLQkCDQn9CV0KDQodCe0J3QkNCb0KzQndCr0KUg0JTQkNCd0J3Qq9ClINCh 0JLQntCY0JzQmCDQodCY0JvQkNCc0JgqDQoNCirQlNC70Y8g0LrQvtCz0L4g0L/RgNC10LTQvdCw 0LfQvdCw0YfQtdC9OioNCtGA0YPQutC+0LLQvtC00LjRgtC10LvQtdC5ICjQv9C10YDQstGL0YUg 0LvQuNGGKSDQutC+0LzQv9Cw0L3QuNC5OyDQvNC10L3QtdC00LbQtdGA0L7QsiDRgdGA0LXQtNC9 0LXQs9C+INC4INCy0YvRgdGI0LXQs9C+INC30LLQtdC90LA7DQrRgNGD0LrQvtCy0L7QtNC40YLQ tdC70LXQuSDQuCDRgdC+0YLRgNGD0LTQvdC40LrQvtCyINCh0LvRg9C20LEg0LjQvdGE0L7RgNC8 0LDRhtC40L7QvdC90L7QuSDQsdC10LfQvtC/0LDRgdC90L7RgdGC0Lgg0Lgg0LjQvdGL0YUg0LHQ uNC30L3QtdGBDQotINGB0YLRgNGD0LrRgtGD0YAuDQoNCg0KKtCm0LXQu9GMOirQpNC+0YDQvNC4 0YDQvtCy0LDQvdC40LUg0YMg0YHQu9GD0YjQsNGC0LXQu9C10Lkg0YHQuNGB0YLQtdC80L3Qvi3R htC10LvQvtGB0YLQvdC+0LPQviDQstC40LTQtdC90LjRjyDQv9GA0L7QsdC70LXQvA0K0L7QsdC1 0YHQv9C10YfQtdC90LjRjyDQuNC90YTQvtGA0LzQsNGG0LjQvtC90L3QvtC5INCx0LXQt9C+0L/Q sNGB0L3QvtGB0YLQuCDQutC+0LzQv9Cw0L3QuNC4LCDRg9C80LXQvdC40Lkg0L7RgNCz0LDQvdC4 0LfQsNGG0LjQuCDQuA0K0L7QsdC10YHQv9C10YfQtdC90LjRjw0K0Y3RhNGE0LXQutGC0LjQstC9 0L7Qs9C+INGE0YPQvdC60YbQuNC+0L3QuNGA0L7QstCw0L3QuNGPINGB0LjRgdGC0LXQvCDQuNC9 0YTQvtGA0LzQsNGG0LjQvtC90L3QvtC5INCx0LXQt9C+0L/QsNGB0L3QvtGB0YLQuCDQsg0K0LrQ vtC80L/QsNC90LjQuCwg0L/QvtC90LjQvNCw0L3QuNGPDQrQv9GA0LjRgNC+0LTRiyDQstC+0LfQ vdC40LrQvdC+0LLQtdC90LjRjyDRg9Cz0YDQvtC3INC40L3RhNC+0YDQvNCw0YbQuNC+0L3QvdC+ 0Lkg0LHQtdC30L7Qv9Cw0YHQvdC+0YHRgtC4INC4INC/0YDQsNC60YLQuNGH0LXRgdC60L7QuQ0K 0YDQtdCw0LvQuNC30LDRhtC40LgNCtC80LXRgNC+0L/RgNC40Y/RgtC40Lkg0LfQsNGJ0LjRgtGL INC+0YIg0L3QuNGFLg0KDQoNCirQnNC10YHRgtC+INC/0YDQvtCy0LXQtNC10L3QuNGPOiAq0YPQ uy4g0JHQsNGD0LzQsNC90YHQutCw0Y8sINC0LjYsINGB0YLRgC4yLCDQkS7Qpi4gItCS0LjQutGC 0L7RgNC40Y8g0J/Qu9Cw0LfQsCIuDQoNCirQn9C+0LTRgNC+0LHQvdCw0Y8g0LjQvdGE0L7RgNC8 0LDRhtC40Y8g0Lgg0YDQtdCz0LjRgdGC0YDQsNGG0LjRjyDQvdCwINC30LDQvdGP0YLQuNC1INC/ 0L4g0YLQtdC7LjoqIDggINC60L7QtCDQs9C+0YDQvtC00LANCtCc0L7RgdC60LLRiyAgKDQ5NSkg INGC0LXQuzogNzI1IC0gMDQgLSA0OCAgKNC80L3QvtCz0L7QutCw0L3QsNC70YzQvdGL0LkpDQoN Cg0KICrQkiDQv9GA0L7Qs9GA0LDQvNC80LU6Kg0KDQoqMS4qICAg0JfQsNC60L7QvdC+0LTQsNGC 0LXQu9GM0YHRgtCy0L4g0KDQvtGB0YHQuNC50YHQutC+0Lkg0KTQtdC00LXRgNCw0YbQuNC4INCy INC+0LHQu9Cw0YHRgtC4INC30LDRidC40YLRiyDQuNC90YTQvtGA0LzQsNGG0LjQuC4NCtCc0LXQ ttC00YPQvdCw0YDQvtC00L3Ri9C1DQogICAgICDRgdGC0LDQvdC00LDRgNGC0Ysg0LHQtdC30L7Q v9Cw0YHQvdC+0YHRgtC4INC40L3RhNC+0YDQvNCw0YbQuNC+0L3QvdGL0YUg0YHQuNGB0YLQtdC8 LiDQkNC80LXRgNC40LrQsNC90YHQutCw0Y8g0LrQvtC90YbQtdC/0YbQuNGPDQrRgdC40YHRgtC1 0LzQvdC+0LPQvg0KICAgICAg0L/QvtC00YXQvtC00LAg0Log0L7QsdC10YHQv9C10YfQtdC90LjR jiDQt9Cw0YnQuNGC0Ysg0LrQvtC90YTQuNC00LXQvdGG0LjQsNC70YzQvdC+0Lkg0LjQvdGE0L7R gNC80LDRhtC40LggKE9QU0VDDQpPcGVyYXRpb24NCiAgICAgIFNlY3VyaXR5KS4NCioyLiogICDQ odC70YPQttCx0LAg0LjQvdGE0L7RgNC80LDRhtC40L7QvdC90L7QuSDQsdC10LfQvtC/0LDRgdC9 0L7RgdGC0LggKNCh0JjQkSkg0L3QsCDQv9GA0LXQtNC/0YDQuNGP0YLQuNC4LiDQoNCw0LfQtNC1 0LvQtdC90LjQtQ0K0YTRg9C90LrRhtC40Lkg0LzQtdC20LTRgw0KICAgICAg0KHQmNCRLCDQodCR INC4INCYVC3Qv9C+0LTRgNCw0LfQtNC10LvQtdC90LjQtdC8LiDQnNC10L3QtdC00LbQvNC10L3R giDQuNC90YTQvtGA0LzQsNGG0LjQvtC90L3QvtC5INCx0LXQt9C+0L/QsNGB0L3QvtGB0YLQuC4N CtCf0L7RgNGP0LTQvtC6DQogICAgICDQv9GA0L7QstC10LTQtdC90LjRjyDQsNGD0LTQuNGC0LAg 0LjQvdGE0L7RgNC80LDRhtC40L7QvdC90L7QuSDQsdC10LfQvtC/0LDRgdC90L7RgdGC0Lgg0LIg 0L7RgNCz0LDQvdC40LfQsNGG0LjQuC4NCiozLiogICDQntGB0L3QvtCy0L3Ri9C1INC90LDQv9GA 0LDQstC70LXQvdC40Y8g0LfQsNGJ0LjRgtGLINC60L7QvdGE0LjQtNC10L3RhtC40LDQu9GM0L3Q vtC5INC40L3RhNC+0YDQvNCw0YbQuNC4LiDQodC40YHRgtC10LzQvdGL0LkNCtC/0L7QtNGF0L7Q tCDQug0KICAgICAg0LfQsNGJ0LjRgtC1INC40L3RhNC+0YDQvNCw0YbQuNC4LiDQnNC10YLQvtC0 0LjQutCwINGA0LDQt9GA0LDQsdC+0YLQutC4INC/0L7Qu9C40YLQuNC60Lgg0LjQvdGE0L7RgNC8 0LDRhtC40L7QvdC90L7QuQ0K0LHQtdC30L7Qv9Cw0YHQvdC+0YHRgtC4DQogICAgICDQv9GA0LXQ tNC/0YDQuNGP0YLQuNGPLg0KKjQuKiAgINCf0YDQsNCy0L7QstGL0LUsINC+0YDQs9Cw0L3QuNC3 0LDRhtC40L7QvdC90YvQtSwg0YDQtdC20LjQvNC90YvQtSDQuCDQuNC90LbQtdC90LXRgNC90L4t 0YLQtdGF0L3QuNGH0LXRgdC60LjQtQ0K0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQv9C+INC30LDR idC40YLQtQ0KICAgICAg0LrQvtC90YTQuNC00LXQvdGG0LjQsNC70YzQvdC+0Lkg0LjQvdGE0L7R gNC80LDRhtC40LguINCh0L7Qt9C00LDQvdC40LUg0LLQvdGD0YLRgNC40L7QsdGK0LXQutGC0L7Q stC+0LPQviDQuA0K0LrQvtC90YLRgNC+0LvRjNC90L4t0L/RgNC+0L/Rg9GB0LrQvdC+0LPQvg0K ICAgICAg0YDQtdC20LjQvNC+0LIg0L3QsCDQv9GA0LXQtNC/0YDQuNGP0YLQuNC4LiDQpNC40LfQ uNGH0LXRgdC60LDRjyDQt9Cw0YnQuNGC0LAg0L7RhdGA0LDQvdGP0LXQvNGL0YUg0LjQvdGE0L7R gNC80LDRhtC40L7QvdC90YvRhQ0K0YDQtdGB0YPRgNGB0L7Qsi4NCio1LiogICDQmFQg0LzQtdGA 0L7Qv9GA0LjRj9GC0LjRjyDQv9C+INC30LDRidC40YLQtSDQutC+0L3RhNC40LTQtdC90YbQuNCw 0LvRjNC90L7QuSDQuNC90YTQvtGA0LzQsNGG0LjQuC4g0JfQsNGJ0LjRgtCwDQrQutC+0LzQv9GM 0Y7RgtC10YDQvdGL0YUg0YHQtdGC0LXQuS4NCiAgICAgINCf0YDQuNC80LXQvdC10L3QuNC1INGB 0YDQtdC00YHRgtCyINC60YDQuNC/0YLQvtCz0YDQsNGE0LjRh9C10YHQutC+0Lkg0LfQsNGJ0LjR gtGLINC40L3RhNC+0YDQvNCw0YbQuNC4Lg0KKjYuKiAgINCX0LDQutC+0L3QvtC00LDRgtC10LvR jNGB0YLQstC+INCg0KQg0L4g0LrQvtC80LzQtdGA0YfQtdGB0LrQvtC5INGC0LDQudC90YsuINCf 0L7QvdGP0YLQuNC1INGA0LXQttC40LzQsA0K0LrQvtC80LzQtdGA0YfQtdGB0LrQvtC5INGC0LDQ udC90YsuDQogICAgICDQpNC+0YDQvNC40YDQvtCy0LDQvdC40LUg0L/QtdGA0LXRh9C90Y8g0YHQ stC10LTQtdC90LjQuSwg0YHQvtGB0YLQsNCy0LvRj9GO0YnQuNGFINC60L7QvNC80LXRgNGH0LXR gdC60YPRjiDRgtCw0LnQvdGDLg0K0KHQvtC30LTQsNC90LjQtQ0KICAgICAg0LrQvtC90YTQuNC0 0LXQvdGG0LjQsNC70YzQvdC+0LPQviDQtNC10LvQvtC/0YDQvtC40LfQstC+0LTRgdGC0LLQsC4N Cio3LiogICDQn9GA0LDQstC+0LLRi9C1LCDRgNC10LbQuNC80L3Ri9C1LCDRgtC10YXQvdC40YfQ tdGB0LrQuNC1INC4INCY0KIg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQv9C+INC30LDRidC40YLQ tQ0K0LrQvtC80LzQtdGA0YfQtdGB0LrQvtC5INGC0LDQudC90YsuDQogICAgICDQodC+0LfQtNCw 0L3QuNC1INC60L7RgNC/0L7RgNCw0YLQuNCy0L3QvtC5INC/0YDQsNCy0L7QstC+0Lkg0LHQsNC3 0Ysg0LTQu9GPINGE0YPQvdC60YbQuNC+0L3QuNGA0L7QstCw0L3QuNGPINGA0LXQttC40LzQsA0K 0LrQvtC80LzQtdGA0YfQtdGB0LrQvtC5DQogICAgICDRgtCw0LnQvdGLLg0KKjguKiAgINCS0LjQ tNGLINGO0YDQuNC00LjRh9C10YHQutC+0Lkg0L7RgtCy0LXRgtGB0YLQstC10L3QvdC+0YHRgtC4 INC30LAg0YDQsNC30LPQu9Cw0YjQtdC90LjQtSDQutC+0LzQvNC10YDRh9C10YHQutC+0Lkg0YLQ sNC50L3RiywNCtCwINGC0LDQutC20LUg0LfQsA0KICAgICAg0L3QtdC30LDQutC+0L3QvdC+0LUg 0L/QvtC70YPRh9C10L3QuNC1INGN0YLQvtC5INC40L3RhNC+0YDQvNCw0YbQuNC4LiDQndC10L7Q sdGF0L7QtNC40LzRi9C1INC4INC00L7RgdGC0LDRgtC+0YfQvdGL0LUNCtGD0YHQu9C+0LLQuNGP INC00LvRjyDQtdC1DQogICAgICDQvdCw0YHRgtGD0L/Qu9C10L3QuNGPLg0KKjkuKiAgINCX0LDQ utC+0L3QvtC00LDRgtC10LvRjNGB0YLQstC+INCg0KQg0L4g0LfQsNGJ0LjRgtC1INC/0LXRgNGB 0L7QvdCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUuINCe0YHQvdC+0LLQvdGL0LUNCtGC0YDQtdCx 0L7QstCw0L3QuNGPDQogICAgICDRhNC10LTQtdGA0LDQu9GM0L3QvtCz0L4g0LfQsNC60L7QvdCw ICLQniDQv9C10YDRgdC+0L3QsNC70YzQvdGL0YUg0LTQsNC90L3Ri9GFIiDQuCDQv9GA0LDQstC+ 0LLRi9GFINCw0LrRgtC+0LINCtGA0LXQs9GD0LvRj9GC0L7RgNC+0LIg0LIg0YfQsNGB0YLQuA0K ICAgICAg0LfQsNGJ0LjRgtGLINC/0LXRgNGB0L7QvdCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUu DQoqMTAuKiDQntGA0LPQsNC90LjQt9Cw0YbQuNC+0L3QvdGL0LUsINC/0YDQsNCy0L7QstGL0LUg 0Lgg0YLQtdGF0L3QuNGH0LXRgdC60LjQtSDRgtGA0LXQsdC+0LLQsNC90LjRjyDQv9C+INC+0LHR gNCw0LHQvtGC0LrQtQ0K0L/QtdGA0YHQvtC90LDQu9GM0L3Ri9GFDQogICAgICDQtNCw0L3QvdGL 0YUuINCQ0LvQs9C+0YDQuNGC0LzRiyDQuCDQv9C+0YjQsNCz0L7QstGL0LUg0LTQtdC50YHRgtCy 0LjRjyDQv9GA0LXQtNC/0YDQuNGP0YLQuNGPINC/0L4g0LLRi9C/0L7Qu9C90LXQvdC40Y4NCtGC 0YDQtdCx0L7QstCw0L3QuNC5DQogICAgICDQt9Cw0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC0LLQ sCDQsiDQvtCx0LvQsNGB0YLQuCDQvtCx0YDQsNCx0L7RgtC60Lgg0L/QtdGA0YHQvtC90LDQu9GM 0L3Ri9GFINC00LDQvdC90YvRhS4NCioxMS4qINCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0L7QsdGA 0LDQsdC+0YLQutC4INC/0LXRgNGB0L7QvdCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUsINC+0YHR g9GJ0LXRgdGC0LLQu9GP0LXQvNC+0Lkg0LHQtdC3DQrQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjR jw0KICAgICAg0YHRgNC10LTRgdGC0LIg0LDQstGC0L7QvNCw0YLQuNC30LDRhtC40LguINCf0L7Q tNCz0L7RgtC+0LLQutCwINC+0YDQs9Cw0L3QuNC30LDRhtC40L7QvdC90L4t0YDQsNGB0L/QvtGA 0Y/QtNC40YLQtdC70YzQvdC+0LkNCtC00L7QutGD0LzQtdC90YLQsNGG0LjQuCDQvdCwDQogICAg ICDQv9GA0LXQtNC/0YDQuNGP0YLQuNC4INC/0L4g0LfQsNGJ0LjRgtC1INC/0LXRgNGB0L7QvdCw 0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUuDQoqMTIuKiDQntGB0L7QsdC10L3QvdC+0YHRgtC4INC+ 0LHRgNCw0LHQvtGC0LrQuCDQv9C10YDRgdC+0L3QsNC70YzQvdGL0YUg0LTQsNC90L3Ri9GFLCDQ vtGB0YPRidC10YHRgtCy0LvRj9C10LzQvtC5INCyDQrQuNC90YTQvtGA0LzQsNGG0LjQvtC90L3R i9GFDQogICAgICDRgdC40YHRgtC10LzQsNGFINC/0LXRgNGB0L7QvdCw0LvRjNC90YvRhSDQtNCw 0L3QvdGL0YUuINCi0YDQtdCx0L7QstCw0L3QuNGPINC6INGD0YDQvtCy0L3RjiDQt9Cw0YnQuNGC 0Ysg0L/QtdGA0YHQvtC90LDQu9GM0L3Ri9GFDQrQtNCw0L3QvdGL0YUg0LINCiAgICAgINC30LDQ stC40YHQuNC80L7RgdGC0Lgg0L7RgiDRgtC40L/QsCDRg9Cz0YDQvtC3Lg0KKjEzLiog0JPQvtGB 0YPQtNCw0YDRgdGC0LLQtdC90L3Ri9C5INC60L7QvdGC0YDQvtC70Ywg0LfQsCDQvtCx0YDQsNCx 0L7RgtC60L7QuSDQsiDQutC+0LzQv9Cw0L3QuNGP0YUg0L/QtdGA0YHQvtC90LDQu9GM0L3Ri9GF DQrQtNCw0L3QvdGL0YUuDQogICAgICDQkNC00LzQuNC90LjRgdGC0YDQsNGC0LjQstC90YvQuSDR gNC10LPQu9Cw0LzQtdC90YIg0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3QvtC5INGE0YPQvdC6 0YbQuNC4LiDQn9GA0LDQstCwINC4DQrQvtCx0Y/Qt9Cw0L3QvdC+0YHRgtC4DQogICAgICDQtNC+ 0LvQttC90L7RgdGC0L3Ri9GFINC70LjRhiwg0L7RgdGD0YnQtdGB0YLQstC70Y/RjtGJ0LjRhSDQ s9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdGL0Lkg0LrQvtC90YLRgNC+0LvRjCDQuCDQu9C40YYs INCyDQrQvtGC0L3QvtGI0LXQvdC40LgNCiAgICAgINC60L7RgtC+0YDRi9GFINC+0YHRg9GJ0LXR gdGC0LLQu9GP0Y7RgtGB0Y8g0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQv9C+INC60L7QvdGC0YDQ vtC70Y4uINCf0YHQuNGF0L7Qu9C+0LPQuNGH0LXRgdC60LjQtQ0K0L/RgNC40LXQvNGLINC+0LHR idC10L3QuNGPINGBDQogICAgICDQv9GA0L7QstC10YDRj9GO0YnQuNC80LguDQoNCg0KKtCj0YfQ sNGB0YLQuNC1OiAqMTE4MDAg0YDRg9CxLg0K0JLRhdC+0LTQuNGCINC80LXRgtC+0LTQuNGH0LXR gdC60LjQuSDQvNCw0YLQtdGA0LjQsNC7LCDQvtCx0LXQtNGLLCDQutC+0YTQtS3Qv9Cw0YPQt9GL Lg0K0J/QviDQvtC60L7QvdGH0LDQvdC40Y4g0LfQsNC90Y/RgtC40Y8g0JLQsNC8INC/0YDQtdC0 0L7RgdGC0LDQstC70Y/QtdGC0YHRjyDRgdC10YDRgtC40YTQuNC60LDRgi4NCtCY0L3QvtCz0L7R gNC+0LTQvdC40Lwg0YPRh9Cw0YHRgtC90LjQutCw0Lwg0L/QvtC80L7Qs9Cw0LXQvCDQsiDQsdGA 0L7QvdC40YDQvtCy0LDQvdC40Lgg0LPQvtGB0YLQuNC90LjRhtGLLg0K ------------8BF99E11AB3A7FFA Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PHRhYmxlIGJvcmRlcj0iMSIgYmdjb2xvcj0iIzAwMDBGRiIgd2lkdGg9 IjczNCIgc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+PHRi b2R5Pjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMSIgYmdjb2xvcj0iI0Y3RjRGNCIgY2VsbHNwYWNp bmc9IjAiIHN0eWxlPSJib3JkZXItd2lkdGg6NHB4Ij48dGJvZHk+PHRyPjx0ZCBiZ2NvbG9yPSIj REREMEQwIiBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1bSI+wqA8 L3RkPjx0ZCBiZ2NvbG9yPSIjREREMEQwIiBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVy LXdpZHRoOm1lZGl1bSI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjREREMEQwIiBzdHlsZT0iYm9yZGVy LXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1bSI+wqA8L3RkPjwvdHI+PHRyPjx0ZCBiZ2Nv bG9yPSIjREREMEQwIiBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1 bSI+wqA8L3RkPjx0ZCBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1 bSI+PHRhYmxlIGJvcmRlcj0iMyI+PHRib2R5Pjx0cj48dGQ+PHAgYWxpZ249ImNlbnRlciI+PGI+ PGZvbnQgY29sb3I9IiMwMDAwQ0MiIHNpemU9IjQiIGZhY2U9IkNhbWJyaWEiPjxicj48L2ZvbnQ+ PGZvbnQgZmFjZT0iQ2FtYnJpYSIgc2l6ZT0iNCI+PHNwYW4gbGFuZz0iZW4tdXMiPjI1wqA8L3Nw YW4+0LDQstCz0YPRgdGC0LA8L2ZvbnQ+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGZvbnQgc2l6ZT0i NCI+wqB8INCzLiDQnNC+0YHQutCy0LA8YnI+PC9mb250PihjIDEwOjAwINC00L4gMTc6MzApPGZv bnQgY29sb3I9IiMwMDAwQ0MiPjxicj48L2ZvbnQ+PC9mb250PjwvYj48Zm9udCBmYWNlPSJDYW1i cmlhIj48YnI+0J/RgNC+0LzQvtC60L7QtDxzcGFuIGxhbmc9ImVuLXVzIj46wqA8dT40PC91Pjwv c3Bhbj48dT45MzwvdT48YnI+PGJyPjwvZm9udD48Zm9udCBjb2xvcj0iIzgwMDAwMCI+PGI+PGZv bnQgc2l6ZT0iNCIgZmFjZT0iQ2FtYnJpYSI+0J/QntCb0JjQotCY0JrQkCDQmNCd0KTQntCg0JzQ kNCm0JjQntCd0J3QntCZINCR0JXQl9Ce0J/QkNCh0J3QntCh0KLQmC4g0KHQntCX0JTQkNCd0JjQ lSDQoNCV0JbQmNCc0JDCoDxicj7QmtCe0JzQnNCV0KDQp9CV0KHQmtCe0Jkg0KLQkNCZ0J3Qqy4g 0JfQkNCp0JjQotCQINCf0JXQoNCh0J7QndCQ0JvQrNCd0KvQpSDQlNCQ0J3QndCr0KUg0KHQktCe 0JjQnNCYINCh0JjQm9CQ0JzQmDwvZm9udD48L2I+PC9mb250PjwvcD48cCBhbGlnbj0ibGVmdCI+ PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGZvbnQgY29sb3I9IiMzMzMzOTkiPjxiPtCU0LvRjyDQutC+ 0LPQviDQv9GA0LXQtNC90LDQt9C90LDRh9C10L06PC9iPjwvZm9udD48Zm9udCBjb2xvcj0iIzgw MDA4MCI+wqA8YnI+PC9mb250PtGA0YPQutC+0LLQvtC00LjRgtC10LvQtdC5ICjQv9C10YDQstGL 0YUg0LvQuNGGKSDQutC+0LzQv9Cw0L3QuNC5OyDQvNC10L3QtdC00LbQtdGA0L7QsiDRgdGA0LXQ tNC90LXQs9C+INC4INCy0YvRgdGI0LXQs9C+INC30LLQtdC90LA7wqA8YnI+0YDRg9C60L7QstC+ 0LTQuNGC0LXQu9C10Lkg0Lgg0YHQvtGC0YDRg9C00L3QuNC60L7QsiDQodC70YPQttCxINC40L3R hNC+0YDQvNCw0YbQuNC+0L3QvdC+0Lkg0LHQtdC30L7Qv9Cw0YHQvdC+0YHRgtC4INC4INC40L3R i9GFINCx0LjQt9C90LXRgSAtINGB0YLRgNGD0LrRgtGD0YAuPGJyPjxicj48Yj48Zm9udCBjb2xv cj0iIzMzMzM5OSI+0KbQtdC70Yw6PGJyPjwvZm9udD48L2I+0KTQvtGA0LzQuNGA0L7QstCw0L3Q uNC1INGDINGB0LvRg9GI0LDRgtC10LvQtdC5INGB0LjRgdGC0LXQvNC90L4t0YbQtdC70L7RgdGC 0L3QvtCz0L4g0LLQuNC00LXQvdC40Y8g0L/RgNC+0LHQu9C10LzCoDxicj7QvtCx0LXRgdC/0LXR h9C10L3QuNGPINC40L3RhNC+0YDQvNCw0YbQuNC+0L3QvdC+0Lkg0LHQtdC30L7Qv9Cw0YHQvdC+ 0YHRgtC4INC60L7QvNC/0LDQvdC40LgsINGD0LzQtdC90LjQuSDQvtGA0LPQsNC90LjQt9Cw0YbQ uNC4INC4INC+0LHQtdGB0L/QtdGH0LXQvdC40Y/CoDxicj7RjdGE0YTQtdC60YLQuNCy0L3QvtCz 0L4g0YTRg9C90LrRhtC40L7QvdC40YDQvtCy0LDQvdC40Y8g0YHQuNGB0YLQtdC8INC40L3RhNC+ 0YDQvNCw0YbQuNC+0L3QvdC+0Lkg0LHQtdC30L7Qv9Cw0YHQvdC+0YHRgtC4INCyINC60L7QvNC/ 0LDQvdC40LgsINC/0L7QvdC40LzQsNC90LjRj8KgPGJyPtC/0YDQuNGA0L7QtNGLINCy0L7Qt9C9 0LjQutC90L7QstC10L3QuNGPINGD0LPRgNC+0Lcg0LjQvdGE0L7RgNC80LDRhtC40L7QvdC90L7Q uSDQsdC10LfQvtC/0LDRgdC90L7RgdGC0Lgg0Lgg0L/RgNCw0LrRgtC40YfQtdGB0LrQvtC5INGA 0LXQsNC70LjQt9Cw0YbQuNC4wqA8YnI+0LzQtdGA0L7Qv9GA0LjRj9GC0LjQuSDQt9Cw0YnQuNGC 0Ysg0L7RgiDQvdC40YUuwqA8YnI+PGJyPjxiPtCc0LXRgdGC0L4g0L/RgNC+0LLQtdC00LXQvdC4 0Y86PHNwYW4gbGFuZz0iZW4tdXMiPsKgPGJyPjwvc3Bhbj48L2I+0YPQuy4g0JHQsNGD0LzQsNC9 0YHQutCw0Y8sINC0LjYsPHNwYW4gbGFuZz0iZW4tdXMiPsKgPC9zcGFuPtGB0YLRgC4yLCDQkS7Q pi7CoDxzcGFuIGxhbmc9ImVuLXVzIj4mcXVvdDs8L3NwYW4+0JLQuNC60YLQvtGA0LjRjyDQn9C7 0LDQt9CwPHNwYW4gbGFuZz0iZW4tdXMiPiZxdW90Ozwvc3Bhbj4uPGJyPjxiPjxicj7Qn9C+0LTR gNC+0LHQvdCw0Y8g0LjQvdGE0L7RgNC80LDRhtC40Y8g0Lgg0YDQtdCz0LjRgdGC0YDQsNGG0LjR jyDQvdCwINC30LDQvdGP0YLQuNC1INC/0L4g0YLQtdC7Ljo8L2I+wqA8Zm9udCBzaXplPSI0Ij44 PC9mb250PsKgwqA8Zm9udCBzaXplPSIyIj7QutC+0LQg0LPQvtGA0L7QtNCwINCc0L7RgdC60LLR izwvZm9udD7CoMKgPGZvbnQgc2l6ZT0iNCI+KDQ5NSk8L2ZvbnQ+wqDCoDxmb250IHNpemU9IjIi PtGC0LXQuzwvZm9udD48c3BhbiBsYW5nPSJlbi11cyI+PGZvbnQgc2l6ZT0iMiI+OjwvZm9udD48 L3NwYW4+wqA8Zm9udCBzaXplPSI0Ij43MjUgLSAwNCAtIDQ4PC9mb250PsKgwqA8Zm9udCBzaXpl PSIyIj4o0LzQvdC+0LPQvtC60LDQvdCw0LvRjNC90YvQuSk8L2ZvbnQ+PGJyPsKgPC9mb250Pjwv cD48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxwPjxmb250IGZhY2U9IkNhbWJyaWEiPsKgPC9m b250PjxiPjxmb250IGZhY2U9IkNhbWJyaWEiIHNpemU9IjQiPtCSINC/0YDQvtCz0YDQsNC80LzQ tTxzcGFuIGxhbmc9ImVuLXVzIj46PC9zcGFuPjwvZm9udD48L2I+PGZvbnQgZmFjZT0iQ2FtYnJp YSI+PGJyPjxicj48Zm9udCBjb2xvcj0iIzMzMzM5OSI+PGI+MS48L2I+PC9mb250PsKgPHNwYW4g bGFuZz0iZW4tdXMiPsKgwqA8L3NwYW4+0JfQsNC60L7QvdC+0LTQsNGC0LXQu9GM0YHRgtCy0L4g 0KDQvtGB0YHQuNC50YHQutC+0Lkg0KTQtdC00LXRgNCw0YbQuNC4INCyINC+0LHQu9Cw0YHRgtC4 INC30LDRidC40YLRiyDQuNC90YTQvtGA0LzQsNGG0LjQuC4g0JzQtdC20LTRg9C90LDRgNC+0LTQ vdGL0LXCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoMKgPC9zcGFuPtGB0YLQsNC9 0LTQsNGA0YLRiyDQsdC10LfQvtC/0LDRgdC90L7RgdGC0Lgg0LjQvdGE0L7RgNC80LDRhtC40L7Q vdC90YvRhSDRgdC40YHRgtC10LwuINCQ0LzQtdGA0LjQutCw0L3RgdC60LDRjyDQutC+0L3RhtC1 0L/RhtC40Y8g0YHQuNGB0YLQtdC80L3QvtCz0L7CoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDC oMKgwqDCoMKgPC9zcGFuPtC/0L7QtNGF0L7QtNCwINC6INC+0LHQtdGB0L/QtdGH0LXQvdC40Y4g 0LfQsNGJ0LjRgtGLINC60L7QvdGE0LjQtNC10L3RhtC40LDQu9GM0L3QvtC5INC40L3RhNC+0YDQ vNCw0YbQuNC4IChPUFNFQyBPcGVyYXRpb27CoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKg wqDCoMKgPC9zcGFuPlNlY3VyaXR5KS48YnI+PGZvbnQgY29sb3I9IiMzMzMzOTkiPjxiPjIuPC9i PjwvZm9udD7CoDxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgPC9zcGFuPtCh0LvRg9C20LHQsCDQuNC9 0YTQvtGA0LzQsNGG0LjQvtC90L3QvtC5INCx0LXQt9C+0L/QsNGB0L3QvtGB0YLQuCAo0KHQmNCR KSDQvdCwINC/0YDQtdC00L/RgNC40Y/RgtC40LguINCg0LDQt9C00LXQu9C10L3QuNC1INGE0YPQ vdC60YbQuNC5INC80LXQttC00YPCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqA8L3Nw YW4+wqA8c3BhbiBsYW5nPSJlbi11cyI+wqA8L3NwYW4+0KHQmNCRLCDQodCRINC4INCYVC3Qv9C+ 0LTRgNCw0LfQtNC10LvQtdC90LjQtdC8LiDQnNC10L3QtdC00LbQvNC10L3RgiDQuNC90YTQvtGA 0LzQsNGG0LjQvtC90L3QvtC5INCx0LXQt9C+0L/QsNGB0L3QvtGB0YLQuC4g0J/QvtGA0Y/QtNC+ 0LrCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoMKgPC9zcGFuPtC/0YDQvtCy0LXQ tNC10L3QuNGPINCw0YPQtNC40YLQsCDQuNC90YTQvtGA0LzQsNGG0LjQvtC90L3QvtC5INCx0LXQ t9C+0L/QsNGB0L3QvtGB0YLQuCDQsiDQvtGA0LPQsNC90LjQt9Cw0YbQuNC4Ljxicj48Zm9udCBj b2xvcj0iIzMzMzM5OSI+PGI+My48L2I+PC9mb250PsKgPHNwYW4gbGFuZz0iZW4tdXMiPsKgwqA8 L3NwYW4+0J7RgdC90L7QstC90YvQtSDQvdCw0L/RgNCw0LLQu9C10L3QuNGPINC30LDRidC40YLR iyDQutC+0L3RhNC40LTQtdC90YbQuNCw0LvRjNC90L7QuSDQuNC90YTQvtGA0LzQsNGG0LjQuC4g 0KHQuNGB0YLQtdC80L3Ri9C5INC/0L7QtNGF0L7QtCDQusKgPGJyPjxzcGFuIGxhbmc9ImVuLXVz Ij7CoMKgwqDCoMKgwqA8L3NwYW4+0LfQsNGJ0LjRgtC1INC40L3RhNC+0YDQvNCw0YbQuNC4LiDQ nNC10YLQvtC00LjQutCwINGA0LDQt9GA0LDQsdC+0YLQutC4INC/0L7Qu9C40YLQuNC60Lgg0LjQ vdGE0L7RgNC80LDRhtC40L7QvdC90L7QuSDQsdC10LfQvtC/0LDRgdC90L7RgdGC0LjCoDxicj48 c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoMKgPC9zcGFuPtC/0YDQtdC00L/RgNC40Y/RgtC4 0Y8uPGJyPjxmb250IGNvbG9yPSIjMzMzMzk5Ij48Yj40LjwvYj48L2ZvbnQ+wqA8c3BhbiBsYW5n PSJlbi11cyI+wqDCoDwvc3Bhbj7Qn9GA0LDQstC+0LLRi9C1LCDQvtGA0LPQsNC90LjQt9Cw0YbQ uNC+0L3QvdGL0LUsINGA0LXQttC40LzQvdGL0LUg0Lgg0LjQvdC20LXQvdC10YDQvdC+LdGC0LXR hdC90LjRh9C10YHQutC40LUg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQv9C+INC30LDRidC40YLQ tcKgPGJyPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgwqA8L3NwYW4+0LrQvtC90YTQuNC0 0LXQvdGG0LjQsNC70YzQvdC+0Lkg0LjQvdGE0L7RgNC80LDRhtC40LguINCh0L7Qt9C00LDQvdC4 0LUg0LLQvdGD0YLRgNC40L7QsdGK0LXQutGC0L7QstC+0LPQviDQuCDQutC+0L3RgtGA0L7Qu9GM 0L3Qvi3Qv9GA0L7Qv9GD0YHQutC90L7Qs9C+wqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDC oMKgwqDCoDwvc3Bhbj7RgNC10LbQuNC80L7QsiDQvdCwINC/0YDQtdC00L/RgNC40Y/RgtC40Lgu INCk0LjQt9C40YfQtdGB0LrQsNGPINC30LDRidC40YLQsCDQvtGF0YDQsNC90Y/QtdC80YvRhSDQ uNC90YTQvtGA0LzQsNGG0LjQvtC90L3Ri9GFINGA0LXRgdGD0YDRgdC+0LIuPGJyPjxmb250IGNv bG9yPSIjMzMzMzk5Ij48Yj41LjwvYj48L2ZvbnQ+wqA8c3BhbiBsYW5nPSJlbi11cyI+wqDCoDwv c3Bhbj7QmFQg0LzQtdGA0L7Qv9GA0LjRj9GC0LjRjyDQv9C+INC30LDRidC40YLQtSDQutC+0L3R hNC40LTQtdC90YbQuNCw0LvRjNC90L7QuSDQuNC90YTQvtGA0LzQsNGG0LjQuC4g0JfQsNGJ0LjR gtCwINC60L7QvNC/0YzRjtGC0LXRgNC90YvRhSDRgdC10YLQtdC5LsKgPGJyPjxzcGFuIGxhbmc9 ImVuLXVzIj7CoMKgwqDCoMKgwqA8L3NwYW4+0J/RgNC40LzQtdC90LXQvdC40LUg0YHRgNC10LTR gdGC0LIg0LrRgNC40L/RgtC+0LPRgNCw0YTQuNGH0LXRgdC60L7QuSDQt9Cw0YnQuNGC0Ysg0LjQ vdGE0L7RgNC80LDRhtC40LguPGJyPjxmb250IGNvbG9yPSIjMzMzMzk5Ij48Yj42LjwvYj48L2Zv bnQ+wqA8c3BhbiBsYW5nPSJlbi11cyI+wqDCoDwvc3Bhbj7Ql9Cw0LrQvtC90L7QtNCw0YLQtdC7 0YzRgdGC0LLQviDQoNCkINC+INC60L7QvNC80LXRgNGH0LXRgdC60L7QuSDRgtCw0LnQvdGLLiDQ n9C+0L3Rj9GC0LjQtSDRgNC10LbQuNC80LAg0LrQvtC80LzQtdGA0YfQtdGB0LrQvtC5INGC0LDQ udC90YsuwqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoDwvc3Bhbj7QpNC+0YDQ vNC40YDQvtCy0LDQvdC40LUg0L/QtdGA0LXRh9C90Y8g0YHQstC10LTQtdC90LjQuSwg0YHQvtGB 0YLQsNCy0LvRj9GO0YnQuNGFINC60L7QvNC80LXRgNGH0LXRgdC60YPRjiDRgtCw0LnQvdGDLiDQ odC+0LfQtNCw0L3QuNC1wqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoDwvc3Bh bj7QutC+0L3RhNC40LTQtdC90YbQuNCw0LvRjNC90L7Qs9C+INC00LXQu9C+0L/RgNC+0LjQt9Cy 0L7QtNGB0YLQstCwLjxicj48Zm9udCBjb2xvcj0iIzMzMzM5OSI+PGI+Ny48L2I+PC9mb250PsKg PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqA8L3NwYW4+0J/RgNCw0LLQvtCy0YvQtSwg0YDQtdC20LjQ vNC90YvQtSwg0YLQtdGF0L3QuNGH0LXRgdC60LjQtSDQuCDQmNCiINC80LXRgNC+0L/RgNC40Y/R gtC40Y8g0L/QviDQt9Cw0YnQuNGC0LUg0LrQvtC80LzQtdGA0YfQtdGB0LrQvtC5INGC0LDQudC9 0YsuwqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoDwvc3Bhbj7QodC+0LfQtNCw 0L3QuNC1INC60L7RgNC/0L7RgNCw0YLQuNCy0L3QvtC5INC/0YDQsNCy0L7QstC+0Lkg0LHQsNC3 0Ysg0LTQu9GPINGE0YPQvdC60YbQuNC+0L3QuNGA0L7QstCw0L3QuNGPINGA0LXQttC40LzQsCDQ utC+0LzQvNC10YDRh9C10YHQutC+0LnCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDC oMKgPC9zcGFuPtGC0LDQudC90YsuPGJyPjxmb250IGNvbG9yPSIjMzMzMzk5Ij48Yj44LjwvYj48 L2ZvbnQ+wqA8c3BhbiBsYW5nPSJlbi11cyI+wqDCoDwvc3Bhbj7QktC40LTRiyDRjtGA0LjQtNC4 0YfQtdGB0LrQvtC5INC+0YLQstC10YLRgdGC0LLQtdC90L3QvtGB0YLQuCDQt9CwINGA0LDQt9Cz 0LvQsNGI0LXQvdC40LUg0LrQvtC80LzQtdGA0YfQtdGB0LrQvtC5INGC0LDQudC90YssINCwINGC 0LDQutC20LUg0LfQsMKgPGJyPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgwqA8L3NwYW4+ 0L3QtdC30LDQutC+0L3QvdC+0LUg0L/QvtC70YPRh9C10L3QuNC1INGN0YLQvtC5INC40L3RhNC+ 0YDQvNCw0YbQuNC4LiDQndC10L7QsdGF0L7QtNC40LzRi9C1INC4INC00L7RgdGC0LDRgtC+0YfQ vdGL0LUg0YPRgdC70L7QstC40Y8g0LTQu9GPINC10LXCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+ wqDCoMKgwqDCoMKgPC9zcGFuPtC90LDRgdGC0YPQv9C70LXQvdC40Y8uPGJyPjxmb250IGNvbG9y PSIjMzMzMzk5Ij48Yj45LjwvYj48L2ZvbnQ+wqA8c3BhbiBsYW5nPSJlbi11cyI+wqDCoDwvc3Bh bj7Ql9Cw0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC0LLQviDQoNCkINC+INC30LDRidC40YLQtSDQ v9C10YDRgdC+0L3QsNC70YzQvdGL0YUg0LTQsNC90L3Ri9GFLiDQntGB0L3QvtCy0L3Ri9C1INGC 0YDQtdCx0L7QstCw0L3QuNGPwqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoDwv c3Bhbj7RhNC10LTQtdGA0LDQu9GM0L3QvtCz0L4g0LfQsNC60L7QvdCwICZxdW90O9CeINC/0LXR gNGB0L7QvdCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUmcXVvdDsg0Lgg0L/RgNCw0LLQvtCy0YvR hSDQsNC60YLQvtCyINGA0LXQs9GD0LvRj9GC0L7RgNC+0LIg0LIg0YfQsNGB0YLQuMKgPGJyPjxz cGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgwqA8L3NwYW4+0LfQsNGJ0LjRgtGLINC/0LXRgNGB 0L7QvdCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUuPGJyPjxmb250IGNvbG9yPSIjMzMzMzk5Ij48 Yj4xMC48L2I+PC9mb250PsKg0J7RgNCz0LDQvdC40LfQsNGG0LjQvtC90L3Ri9C1LCDQv9GA0LDQ stC+0LLRi9C1INC4INGC0LXRhdC90LjRh9C10YHQutC40LUg0YLRgNC10LHQvtCy0LDQvdC40Y8g 0L/QviDQvtCx0YDQsNCx0L7RgtC60LUg0L/QtdGA0YHQvtC90LDQu9GM0L3Ri9GFwqA8YnI+PHNw YW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoDwvc3Bhbj7QtNCw0L3QvdGL0YUuINCQ0LvQs9C+ 0YDQuNGC0LzRiyDQuCDQv9C+0YjQsNCz0L7QstGL0LUg0LTQtdC50YHRgtCy0LjRjyDQv9GA0LXQ tNC/0YDQuNGP0YLQuNGPINC/0L4g0LLRi9C/0L7Qu9C90LXQvdC40Y4g0YLRgNC10LHQvtCy0LDQ vdC40LnCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoMKgPC9zcGFuPtC30LDQutC+ 0L3QvtC00LDRgtC10LvRjNGB0YLQstCwINCyINC+0LHQu9Cw0YHRgtC4INC+0LHRgNCw0LHQvtGC 0LrQuCDQv9C10YDRgdC+0L3QsNC70YzQvdGL0YUg0LTQsNC90L3Ri9GFLjxicj48Zm9udCBjb2xv cj0iIzMzMzM5OSI+PGI+MTEuPC9iPjwvZm9udD7CoNCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0L7Q sdGA0LDQsdC+0YLQutC4INC/0LXRgNGB0L7QvdCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUsINC+ 0YHRg9GJ0LXRgdGC0LLQu9GP0LXQvNC+0Lkg0LHQtdC3INC40YHQv9C+0LvRjNC30L7QstCw0L3Q uNGPwqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoDwvc3Bhbj7RgdGA0LXQtNGB 0YLQsiDQsNCy0YLQvtC80LDRgtC40LfQsNGG0LjQuC4g0J/QvtC00LPQvtGC0L7QstC60LAg0L7R gNCz0LDQvdC40LfQsNGG0LjQvtC90L3Qvi3RgNCw0YHQv9C+0YDRj9C00LjRgtC10LvRjNC90L7Q uSDQtNC+0LrRg9C80LXQvdGC0LDRhtC40Lgg0L3QsMKgPGJyPjxzcGFuIGxhbmc9ImVuLXVzIj7C oMKgwqDCoMKgwqA8L3NwYW4+0L/RgNC10LTQv9GA0LjRj9GC0LjQuCDQv9C+INC30LDRidC40YLQ tSDQv9C10YDRgdC+0L3QsNC70YzQvdGL0YUg0LTQsNC90L3Ri9GFLjxicj48Zm9udCBjb2xvcj0i IzMzMzM5OSI+PGI+MTIuPC9iPjwvZm9udD7CoNCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0L7QsdGA 0LDQsdC+0YLQutC4INC/0LXRgNGB0L7QvdCw0LvRjNC90YvRhSDQtNCw0L3QvdGL0YUsINC+0YHR g9GJ0LXRgdGC0LLQu9GP0LXQvNC+0Lkg0LIg0LjQvdGE0L7RgNC80LDRhtC40L7QvdC90YvRhcKg PGJyPjxzcGFuIGxhbmc9ImVuLXVzIj7CoMKgwqDCoMKgwqA8L3NwYW4+0YHQuNGB0YLQtdC80LDR hSDQv9C10YDRgdC+0L3QsNC70YzQvdGL0YUg0LTQsNC90L3Ri9GFLiDQotGA0LXQsdC+0LLQsNC9 0LjRjyDQuiDRg9GA0L7QstC90Y4g0LfQsNGJ0LjRgtGLINC/0LXRgNGB0L7QvdCw0LvRjNC90YvR hSDQtNCw0L3QvdGL0YUg0LLCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoMKgPC9z cGFuPtC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDRgtC40L/QsCDRg9Cz0YDQvtC3Ljxicj48 Zm9udCBjb2xvcj0iIzMzMzM5OSI+PGI+MTMuPC9iPjwvZm9udD7CoNCT0L7RgdGD0LTQsNGA0YHR gtCy0LXQvdC90YvQuSDQutC+0L3RgtGA0L7Qu9GMINC30LAg0L7QsdGA0LDQsdC+0YLQutC+0Lkg 0LIg0LrQvtC80L/QsNC90LjRj9GFINC/0LXRgNGB0L7QvdCw0LvRjNC90YvRhSDQtNCw0L3QvdGL 0YUuwqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoDwvc3Bhbj7QkNC00LzQuNC9 0LjRgdGC0YDQsNGC0LjQstC90YvQuSDRgNC10LPQu9Cw0LzQtdC90YIg0LPQvtGB0YPQtNCw0YDR gdGC0LLQtdC90L3QvtC5INGE0YPQvdC60YbQuNC4LiDQn9GA0LDQstCwINC4INC+0LHRj9C30LDQ vdC90L7RgdGC0LjCoDxicj48c3BhbiBsYW5nPSJlbi11cyI+wqDCoMKgwqDCoMKgPC9zcGFuPtC0 0L7Qu9C20L3QvtGB0YLQvdGL0YUg0LvQuNGGLCDQvtGB0YPRidC10YHRgtCy0LvRj9GO0YnQuNGF INCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC90YvQuSDQutC+0L3RgtGA0L7Qu9GMINC4INC70LjR hiwg0LIg0L7RgtC90L7RiNC10L3QuNC4wqA8YnI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKg wqDCoDwvc3Bhbj7QutC+0YLQvtGA0YvRhSDQvtGB0YPRidC10YHRgtCy0LvRj9GO0YLRgdGPINC8 0LXRgNC+0L/RgNC40Y/RgtC40Y8g0L/QviDQutC+0L3RgtGA0L7Qu9GOLiDQn9GB0LjRhdC+0LvQ vtCz0LjRh9C10YHQutC40LUg0L/RgNC40LXQvNGLINC+0LHRidC10L3QuNGPINGBwqA8YnI+PHNw YW4gbGFuZz0iZW4tdXMiPsKgwqDCoMKgwqDCoDwvc3Bhbj7Qv9GA0L7QstC10YDRj9GO0YnQuNC8 0LguPC9mb250PjwvcD48ZGl2IGFsaWduPSJjZW50ZXIiPjx0YWJsZSBib3JkZXI9IjEiIGJnY29s b3I9IiNGMUVERUQiIHN0eWxlPSJib3JkZXItd2lkdGg6MHB4Ij48dGJvZHk+PHRyPjx0ZCBiZ2Nv bG9yPSIjREREMEQwIiBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1 bSI+PHAgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGI+PGZvbnQgY29sb3I9 IiMwMDAwRkYiPjxicj48L2ZvbnQ+0KPRh9Cw0YHRgtC40LU6wqA8L2I+MTE4MDAg0YDRg9CxLjxi cj7QktGF0L7QtNC40YIg0LzQtdGC0L7QtNC40YfQtdGB0LrQuNC5INC80LDRgtC10YDQuNCw0Lss INC+0LHQtdC00YssINC60L7RhNC1LdC/0LDRg9C30YsuPGJyPtCf0L4g0L7QutC+0L3Rh9Cw0L3Q uNGOINC30LDQvdGP0YLQuNGPINCS0LDQvCDQv9GA0LXQtNC+0YHRgtCw0LLQu9GP0LXRgtGB0Y8g 0YHQtdGA0YLQuNGE0LjQutCw0YIuPGJyPtCY0L3QvtCz0L7RgNC+0LTQvdC40Lwg0YPRh9Cw0YHR gtC90LjQutCw0Lwg0L/QvtC80L7Qs9Cw0LXQvCDQsiDQsdGA0L7QvdC40YDQvtCy0LDQvdC40Lgg 0LPQvtGB0YLQuNC90LjRhtGLLjxicj7CoDwvZm9udD48L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90 YWJsZT48L2Rpdj48L3RkPjx0ZCBiZ2NvbG9yPSIjREREMEQwIiBzdHlsZT0iYm9yZGVyLXN0eWxl Om5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1bSI+wqA8L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIj REREMEQwIiBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1bSI+wqA8 L3RkPjx0ZCBiZ2NvbG9yPSIjREREMEQwIiBzdHlsZT0iYm9yZGVyLXN0eWxlOm5vbmU7Ym9yZGVy LXdpZHRoOm1lZGl1bSI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjREREMEQwIiBzdHlsZT0iYm9yZGVy LXN0eWxlOm5vbmU7Ym9yZGVyLXdpZHRoOm1lZGl1bSI+wqA8L3RkPjwvdHI+PC90Ym9keT48L3Rh YmxlPjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+DQo= ------------8BF99E11AB3A7FFA-- From ceutalsbarco@nm.ru Tue Aug 16 02:00:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 315657CA2 for ; Tue, 16 Aug 2016 02:00:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8180AAC05B for ; Tue, 16 Aug 2016 00:00:53 -0700 (PDT) X-ASG-Debug-ID: 1471330845-0bf57c0d0115590001-NocioJ Received: from mx.qip.ru ([198.50.219.118]) by cuda.sgi.com with ESMTP id qKml5GAigP1EYxxM for ; Tue, 16 Aug 2016 00:00:47 -0700 (PDT) X-Barracuda-Envelope-From: ceutalsbarco@nm.ru X-Barracuda-Effective-Source-IP: UNKNOWN[198.50.219.118] X-Barracuda-Apparent-Source-IP: 198.50.219.118 MIME-Version: 1.0 Date: Tue, 16 Aug 2016 10:00:47 +0300 Message-ID: <653307646.20160816100047@NYJQLYILCITU> Subject: =?utf-8?B?0KPRh9Cw0YHRgtC90LjQutCw0Lwg0LLQvdC10YjQvdC10Y3QutC+0L3QvtC80LjRh9C10YHQutC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4?= From: "=?utf-8?B?0KLQsNC80L7QttC90Y8=?=" X-ASG-Orig-Subj: =?utf-8?B?0KPRh9Cw0YHRgtC90LjQutCw0Lwg0LLQvdC10YjQvdC10Y3QutC+0L3QvtC80LjRh9C10YHQutC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=----------5530CA8B83D24A7 X-Barracuda-Connect: UNKNOWN[198.50.219.118] X-Barracuda-Start-Time: 1471330845 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 21849 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32046 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------------5530CA8B83D24A7 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 KjI5INCw0LLQs9GD0YHRgtCwKg0KKiDQsy4g0JzQvtGB0LrQstCwKg0KDQoNCg0KDQoNCirQktCQ 0JvQrtCi0J3QntCVINCg0JXQk9Cj0JvQmNCg0J7QktCQ0J3QmNCVINCYINCS0JDQm9Cu0KLQndCr 0Jkg0JrQntCd0KLQoNCe0JvQrCDQkiDQoNCkINChINCj0KfQldCi0J7QnCDQn9Ce0KHQm9CV0JTQ ndCY0KUNCtCY0JfQnNCV0J3QldCd0JjQmSDQl9CQ0JrQntCd0J7QlNCQ0KLQldCb0KzQodCi0JLQ kNCf0YDQvtC80L7QutC+0LQ6ICo0OTQNCg0KKioqDQoNCirQktGA0LXQvNGPINC/0YDQvtCy0LXQ tNC10L3QuNGPOiAq0YEgMTA6MDAg0LTQviAxNzozMA0KDQoNCirQnNC10YDQvtC/0YDQuNGP0YLQ uNC1INGB0L7RgdGC0L7QuNGC0YHRjzogKtC8LiDQkdCw0YPQvNCw0L3RgdC60LDRjywg0YPQuy4g 0JHQsNGD0LzQsNC90YHQutCw0Y8sINC0LjYsINCx0LjQt9C90LXRgSDRhtC10L3RgtGADQoi0JLQ uNC60YLQvtGA0LjRjyDQn9C70LDQt9CwIi4NCg0KDQoNCirQktGB0Y8g0L/QvtC00YDQvtCx0L3Q sNGPINC40L3RhNC+0YDQvNCw0YbQuNGPINC4INGA0LXQs9C40YHRgtGA0LDRhtC40Y8g0L3QsCDQ t9Cw0L3Rj9GC0LjRjyDQv9C+INGC0LXQuy46ICo4ICDQutC+0LQg0LPQvtGA0L7QtNCwDQrQnNC+ 0YHQutCy0YsgICg0OTUpICDRgtC10Ls6ICA5NjEgLSAwMCAtIDM4ICAo0LzQvdC+0LPQvtC60LDQ vdCw0LvRjNC90YvQuSkNCg0KDQoNCiog0JIg0L/RgNC+0LPRgNCw0LzQvNC1OioNCioxLiogKtCd 0L7QstC+0LUg0LIg0YHQuNGB0YLQtdC80LUg0LLQsNC70Y7RgtC90L7Qs9C+INGA0LXQs9GD0LvQ uNGA0L7QstCw0L3QuNGPINCyINCg0KQuKg0K0J3QvtGA0LzQsNGC0LjQstC90L4t0L/RgNCw0LLQ vtCy0LDRjyDQsdCw0LfQsCDQstCw0LvRjtGC0L3QvtCz0L4g0YDQtdCz0YPQu9C40YDQvtCy0LDQ vdC40Y8g0LIg0KDQvtGB0YHQuNC50YHQutC+0Lkg0KTQtdC00LXRgNCw0YbQuNC4Lg0K0JDQutGC 0YPQsNC70YzQvdGL0LUg0LjQt9C80LXQvdC10L3QuNGPINCy0LDQu9GO0YLQvdC+0LPQviDQt9Cw 0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC0LLQsCDQoNCkINC4INC40YUg0L/QvtGB0LvQtdC00YHR gtCy0LjRjyDQsg0K0L/RgNCw0LrRgtC40LrQtQ0K0LLQvdC10YjQvdC10Y3QutC+0L3QvtC80LjR h9C10YHQutC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4INC60L7QvNC/0LDQvdC40LkuDQrQ lNC10LnRgdGC0LLQuNC1INGE0LXQtNC10YDQsNC70YzQvdC+0LPQviDQt9Cw0LrQvtC90LAgItCe INCy0LDQu9GO0YLQvdC+0Lwg0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40Lgg0Lgg0LLQsNC70Y7R gtC90L7QvCDQutC+0L3RgtGA0L7Qu9C1Ig0KMTczLdCk0JcNCijRgSDQuNC30LzQtdC90LXQvdC4 0Y/QvNC4LCDQstGB0YLRg9C/0LjQstGI0LjQvNC4INCyINGB0LjQu9GDINCyIDIwMTUg0LPQvtC0 0YMg0Lgg0LLRgdGC0YPQv9Cw0Y7RidC40LzQuCDQsiDRgdC40LvRgyDQsiAyMDE2DQrQsykuDQrQ n9GA0L7QtdC60YLRiyDQsdGD0LTRg9GJ0LjRhSDQuNC30LzQtdC90LXQvdC40Lkg0KTQtdC00LXR gNCw0LvRjNC90L7Qs9C+INC30LDQutC+0L3QsCAi0J4g0LLQsNC70Y7RgtC90L7QvCDRgNC10LPR g9C70LjRgNC+0LLQsNC90LjQuA0K0Lgg0LLQsNC70Y7RgtC90L7QvCDQutC+0L3RgtGA0L7Qu9C1 Ii4NCioyLiDQktCw0LvRjtGC0L3QvtC1INC30LDQutC+0L3QvtC00LDRgtC10LvRjNGB0YLQstC+ INCg0L7RgdGB0LjQudGB0LrQvtC5INCk0LXQtNC10YDQsNGG0LjQuC4qDQrQkdCw0LfQvtCy0YvQ tSDQv9C+0L3Rj9GC0LjRjyDQuCDQv9GA0LjQvdGG0LjQv9GLINCy0LDQu9GO0YLQvdC+0LPQviDR gNC10LPRg9C70LjRgNC+0LLQsNC90LjRjyDQuCDQuNGFINC/0YDQsNC60YLQuNGH0LXRgdC60L7Q tQ0K0L/RgNC40LzQtdC90LXQvdC40LUuDQrQntGB0L3QvtCy0L3Ri9C1INC/0L7Qu9C+0LbQtdC9 0LjRjyDQstCw0LvRjtGC0L3QvtCz0L4g0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40Y8g0Lgg0LjR hSDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtSDQsiDQv9GA0LDQutGC0LjQutC1DQrRjdC60L7Q vdC+0LzQuNGH0LXRgdC60L7QuSDQtNC10Y/RgtC10LvRjNC90L7RgdGC0Lgg0LrQvtC80L/QsNC9 0LjQuSDQuCDQuNC90LTQuNCy0LjQtNGD0LDQu9GM0L3Ri9GFINC/0YDQtdC00L/RgNC40L3QuNC8 0LDRgtC10LvQtdC5Lg0K0J7RgdC+0LHQtdC90L3QvtGB0YLQuCDQv9GA0L7QstC10LTQtdC90LjR jyDQstCw0LvRjtGC0L3Ri9GFINC+0L/QtdGA0LDRhtC40Lkg0YDQtdC30LjQtNC10L3RgtCw0LzQ uCDQuCDQvdC10YDQtdC30LjQtNC10L3RgtCw0LzQuC4NCtCf0L7RgNGP0LTQvtC6INC+0YLQutGA 0YvRgtC40Y8g0Lgg0LLQtdC00LXQvdC40Y8g0YHRh9C10YLQvtCyINGA0LXQt9C40LTQtdC90YLQ vtCyINC30LAg0L/RgNC10LTQtdC70LDQvNC4INGC0LXRgNGA0LjRgtC+0YDQuNC4INCg0KQuDQrQ oNC10LbQuNC8INC30LDRgNGD0LHQtdC20L3Ri9GFINGB0YfQtdGC0L7QsiDQuCDQv9GA0LDQstC4 0LvQsCDQvtGB0YPRidC10YHRgtCy0LvQtdC90LjRjyDRgNC10LfQuNC00LXQvdGC0LDQvNC4INCy 0LDQu9GO0YLQvdGL0YUNCtC+0L/QtdGA0LDRhtC40Lkg0LfQsA0K0YHRh9C10YIg0YHRgNC10LTR gdGC0LIsINC90LDRhdC+0LTRj9GJ0LjRhdGB0Y8g0L3QsCDRgdGH0LXRgtCw0YUg0LIg0LHQsNC9 0LrQsNGFINC30LAg0YDRg9Cx0LXQttC+0LwuDQrQoNC10L/QsNGC0YDQuNCw0YbQuNGPINCy0LDQ u9GO0YLQvdC+0Lkg0LLRi9GA0YPRh9C60Lg6INC/0YDQsNCy0LjQu9CwLCDQvtGB0L7QsdC10L3Q vdC+0YHRgtC4LCDQv9GA0LDQutGC0LjQutCwINC4DQrQvtGC0LLQtdGC0YHRgtCy0LXQvdC90L7R gdGC0Ywg0LfQsA0K0L3QsNGA0YPRiNC10L3QuNGPLiDQntGB0L7QsdC10L3QvdC+0YHRgtC4INGC 0YDQtdCx0L7QstCw0L3QuNGPINGA0LXQv9Cw0YLRgNC40LDRhtC40Lgg0L/RgNC4INGE0LjQvdCw 0L3RgdC+0LLRi9GFINC+0L/QtdGA0LDRhtC40Y/RhS4NCg0KKjMuINCS0LDQu9GO0YLQvdGL0Lkg 0LrQvtC90YLRgNC+0LvRjCDQv9GA0Lgg0L7RgdGD0YnQtdGB0YLQstC70LXQvdC40Lgg0LLQsNC7 0Y7RgtC90YvRhSDQvtC/0LXRgNCw0YbQuNC5LCDRgdCy0Y/Qt9Cw0L3QvdGL0YUNCtGBINCy0L3Q tdGI0L3QtdGC0L7RgNCz0L7QstC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtGM0Y4sINC/0L7Q u9GD0YfQtdC90LjQtdC8INC4INC/0YDQtdC00L7RgdGC0LDQstC70LXQvdC40LXQvCDQutGA0LXQ tNC40YLQvtCyINC4DQrQt9Cw0LnQvNC+0LIuKg0K0J/QsNGB0L/QvtGA0YIg0YHQtNC10LvQutC4 OiDQv9GA0LDQstC40LvQsCDQvtGC0LrRgNGL0YLQuNGPLCDQvtGE0L7RgNC80LvQtdC90LjRjywg 0LLQtdC00LXQvdC40Y8sINC/0LXRgNC10LLQvtC00LAg0Lgg0LfQsNC60YDRi9GC0LjRjy4NCtCU 0L7RgdGM0LUg0L/Qvg0K0L/QsNGB0L/QvtGA0YLRgyDRgdC00LXQu9C60LguDQrQodC/0YDQsNCy 0LrQsCDQviDQstCw0LvRjtGC0L3Ri9GFINC+0L/QtdGA0LDRhtC40Y/RhTog0L7RgdC+0LHQtdC9 0L3QvtGB0YLQuCDQtdC1INGE0L7RgNC80LjRgNC+0LLQsNC90LjRjywg0YHRgNC+0LrQuCDQuCDQ v9GA0LDQstC40LvQsA0K0LXQtQ0K0L/RgNC10LTRgdGC0LDQstC70LXQvdC40Y8g0LIg0YPQv9C+ 0LvQvdC+0LzQvtGH0LXQvdC90YvQuSDQsdCw0L3QuiDQv9GA0Lgg0L7RgdGD0YnQtdGB0YLQstC7 0LXQvdC40Lgg0L7Qv9C10YDQsNGG0LjQuSDQsg0K0LjQvdC+0YHRgtGA0LDQvdC90L7QuSDQuA0K 0L3QsNGG0LjQvtC90LDQu9GM0L3QvtC5INCy0LDQu9GO0YLQtS4NCtCh0L/RgNCw0LLQutCwINC+ INC/0L7QtNGC0LLQtdGA0LbQtNCw0Y7RidC40YUg0LTQvtC60YPQvNC10L3RgtCw0YUg0L/RgNC4 INC+0YHRg9GJ0LXRgdGC0LLQu9C10L3QuNC4INCy0L3QtdGI0L3QtdGC0L7RgNCz0L7QstC+0LkN CtC00LXRj9GC0LXQu9GM0L3QvtGB0YLQuC4NCtCf0L7QtNGC0LLQtdGA0LbQtNCw0Y7RidC40LUg 0LTQvtC60YPQvNC10L3RgtGLLCDRgdGC0LDRgtC40YHRgtC40YfQtdGB0LrQsNGPINGE0L7RgNC8 0LAg0YPRh9C10YLQsCDQv9C10YDQtdC80LXRidC10L3QuNGPINGC0L7QstCw0YDQvtCyIC0NCtC/ 0L7RgNGP0LTQvtC6INC/0YDQtdC00YHRgtCw0LLQu9C10L3QuNGPINCw0LPQtdC90YLQsNC8INCy 0LDQu9GO0YLQvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPLg0K0J7RgdC+0LHQtdC90L3QvtGB0YLQ uCDQstCw0LvRjtGC0L3QvtCz0L4g0LrQvtC90YLRgNC+0LvRjyDQsiDQvdC10YLQvtGA0LPQvtCy 0L7QvCDQvtCx0L7RgNC+0YLQtS4NCtCS0LXQtNC+0LzQvtGB0YLRjCDQsdCw0L3QutC+0LLRgdC6 0L7Qs9C+INC60L7QvdGC0YDQvtC70Y8NCio0LiDQntGB0L7QsdC10L3QvdC+0YHRgtC4INCy0LDQ u9GO0YLQvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPLCDQvtGB0YPRidC10YHRgtCy0LvRj9C10LzQ vtCz0L4g0YEg0YPRh9Cw0YHRgtC40LXQvCDRgtCw0LzQvtC20LXQvdC90YvRhQ0K0L7RgNCz0LDQ vdC+0LIuKg0K0KLQtdGF0L3QvtC70L7Qs9C40Lgg0YLQsNC80L7QttC10L3QvdC+LdCx0LDQvdC6 0L7QstGB0LrQvtCz0L4g0LLQsNC70Y7RgtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8gKNCi0JHQ ktCaKS4NCtCY0L3RhNC+0YDQvNCw0YbQuNC+0L3QvdGL0Lkg0L7QsdC80LXQvSDQvNC10LbQtNGD INCk0KLQoSDQoNCkINC4INGD0L/QvtC70L3QvtC80L7Rh9C10L3QvdGL0LzQuCDQsdCw0L3QutCw 0LzQuC4NCtCS0LfQsNC40LzQvtC00LXQudGB0YLQstC40LUg0YEg0LTRgNGD0LPQuNC80Lgg0L7R gNCz0LDQvdCw0LzQuCDQuCDQsNCz0LXQvdGC0LDQvNC4INCy0LDQu9GO0YLQvdC+0LPQviDQutC+ 0L3RgtGA0L7Qu9GPLg0KDQoqNS4g0JrQu9Cw0YHRgdC40YTQuNC60LDRhtC40Y8g0Lgg0YHQvtC0 0LXRgNC20LDQvdC40LUg0L/RgNCw0LLQvtC90LDRgNGD0YjQtdC90LjQuSDQstCw0LvRjtGC0L3Q vtCz0L4g0LfQsNC60L7QvdC+0LTQsNGC0LXQu9GM0YHRgtCy0LAg0YENCtGD0YfQtdGC0L7QvCDQ v9C+0YHQu9C10LTQvdC40YUg0LjQt9C80LXQvdC10L3QuNC5INC90L7RgNC80LDRgtC40LLQvdC+ 0Lkg0L/RgNCw0LLQvtCy0L7QuSDQsdCw0LfRiy4qDQrQntGA0LPQsNC90Ysg0Lgg0LDQs9C10L3R gtGLINCy0LDQu9GO0YLQvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPOiDQvtGB0L7QsdC10L3QvdC+ 0YHRgtC4INC00LXRj9GC0LXQu9GM0L3QvtGB0YLQuCDQuCDQvtGA0LPQsNC90LjQt9Cw0YbQuNGP DQrQstC30LDQuNC80L7QtNC10LnRgdGC0LLQuNGPOw0K0J7RgNCz0LDQvdC40LfQsNGG0LjRjyDQ s9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdC+0LPQviDRhNC40L3QsNC90YHQvtCy0L7Qs9C+INC6 0L7QvdGC0YDQvtC70Y8g0LfQsCDQvtGB0YPRidC10YHRgtCy0LvQtdC90LjQtdC8DQrQstCw0LvR jtGC0L3Ri9GFDQrQvtC/0LXRgNCw0YbQuNC5INGA0LXQt9C40LTQtdC90YLQsNC80Lgg0Lgg0L3Q tdGA0LXQt9C40LTQtdC90YLQsNC80Lgg0LIg0YHQstGP0LfQuCDQuCDQuNC30LzQtdC90LXQvdC4 0LXQvCDRgdGC0YDRg9C60YLRg9GA0YsNCtC90LDQtNC30L7RgNC90YvRhSDQvtGA0LPQsNC90L7Q sg0K0KDQpDsNCtCS0YvRj9Cy0LvQtdC90LjQtSDQuCDQv9GA0LXRgdC10YfQtdC90LjQtSDQvdCw 0YDRg9GI0LXQvdC40Lkg0LLQsNC70Y7RgtC90L7Qs9C+INC30LDQutC+0L3QvtC00LDRgtC10LvR jNGB0YLQstCwINCg0L7RgdGB0LjQudGB0LrQvtC5DQrQpNC10LTQtdGA0LDRhtC40Lgg0LgNCtCw 0LrRgtC+0LIg0L7RgNCz0LDQvdC+0LIg0LLQsNC70Y7RgtC90L7Qs9C+INGA0LXQs9GD0LvQuNGA 0L7QstCw0L3QuNGPLg0K0J/QvtC90Y/RgtC40LUg0YHQvtC80L3QuNGC0LXQu9GM0L3Ri9GFINC+ 0L/QtdGA0LDRhtC40LksINC40YUg0LrQu9Cw0YHRgdC40YTQuNC60LDRhtC40Y8sINC90L7RgNC8 0LDRgtC40LLQvdC+0LUg0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40LUNCtC4DQrQvdC10L7QsdGF 0L7QtNC40LzQvtGB0YLRjCDRg9GH0LXRgtCwINCyINC/0YDQsNC60YLQuNC60LUg0LLQvdC10YjQ vdC10Y3QutC+0L3QvtC80LjRh9C10YHQutC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4Lg0K 0JjQt9C80LXQvdC10L3QuNGPINC90L7RgNC80LDRgtC40LLQvdC+LdC/0YDQsNCy0L7QstC+0Lkg 0LHQsNC30Ysg0LLQsNC70Y7RgtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8gKNCT0YDQsNC20LTQ sNC90YHQutC40Lkg0LrQvtC00LXQutGBDQrQoNC+0YHRgdC40LnRgdC60L7QuSDQpNC10LTQtdGA 0LDRhtC40LgsINCa0L7QtNC10LrRgSDQoNC+0YHRgdC40LnRgdC60L7QuSDQpNC10LTQtdGA0LDR htC40Lgg0L7QsSDQsNC00LzQuNC90LjRgdGC0YDQsNGC0LjQstC90YvRhQ0K0L/RgNCw0LLQvtC9 0LDRgNGD0YjQtdC90LjRj9GFLCDQo9Cz0L7Qu9C+0LLQvdGL0Lkg0LrQvtC00LXQutGBINCg0L7R gdGB0LjQudGB0LrQvtC5INCk0LXQtNC10YDQsNGG0LjQuCwg0LIg0KTQtdC00LXRgNCw0LvRjNC9 0YvQuSDQt9Cw0LrQvtC9DQrihJYgMTczLdCk0JcNCiLQniDQstCw0LvRjtGC0L3QvtC8INGA0LXQ s9GD0LvQuNGA0L7QstCw0L3QuNC4INC4INCy0LDQu9GO0YLQvdC+0Lwg0LrQvtC90YLRgNC+0LvQ tSIsINCk0LXQtNC10YDQsNC70YzQvdGL0Lkg0LfQsNC60L7QvSDihJYgMTY0LdCk0JcNCiLQntCx DQrQvtGB0L3QvtCy0LDRhSDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdC+0LPQviDRgNC10LPR g9C70LjRgNC+0LLQsNC90LjRjyDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLQvtC5INC00LXRj9GC 0LXQu9GM0L3QvtGB0YLQuCIg0LgNCtC00YDRg9Cz0LjQtQ0K0L3QvtGA0LzQsNGC0LjQstC90YvQ tSDQv9GA0LDQstC+0LLRi9C1INCw0LrRgtGLKSwg0LAg0YLQsNC6INC20LUg0L/Qu9Cw0L3QuNGA 0YPQtdC80YvQtSDQuNC30LzQtdC90LXQvdC40Y8g0YPQutCw0LfQsNC90L3Ri9GFDQrQvdC+0YDQ vNCw0YLQuNCy0L3Ri9GFDQrQsNC60YLQvtCyLg0KDQoqNi4g0J7RgtCy0LXRgtGB0YLQstC10L3Q vdC+0YHRgtGMINC30LAg0L3QsNGA0YPRiNC10L3QuNGPINCy0LDQu9GO0YLQvdC+0LPQviDQt9Cw 0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC0LLQsCDQuCDQsNC60YLQvtCyINC+0YDQs9Cw0L3QvtCy DQrQstCw0LvRjtGC0L3QvtCz0L4g0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40Y8uKg0K0J/RgNCw 0LLQuNC70LAg0L/RgNC10LTRgdGC0LDQstC70LXQvdC40Y8g0L7RgNCz0LDQvdCw0LzQuCDQuCDQ sNCz0LXQvdGC0LDQvNC4INCy0LDQu9GO0YLQvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPINCyDQrR g9C/0L7Qu9C90L7QvNC+0YfQtdC90L3Ri9C5DQrQn9GA0LDQstC40YLQtdC70YzRgdGC0LLQvtC8 INCg0L7RgdGB0LjQudGB0LrQvtC5INCk0LXQtNC10YDQsNGG0LjQuCDQvtGA0LPQsNC9INCy0LDQ u9GO0YLQvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPINC90LXQvtCx0YXQvtC00LjQvNGL0YUNCtC0 0L7QutGD0LzQtdC90YLQvtCyDQrQuCDQuNC90YTQvtGA0LzQsNGG0LjQuC4NCtCe0YLQtNC10LvR jNC90YvQtSDQstC+0L/RgNC+0YHRiyDQuNGB0L/QvtC70YzQt9GD0LXQvNGL0YUg0LIg0YHRhNC1 0YDQtSDQstCw0LvRjtGC0L3QvtCz0L4g0LrQvtC90YLRgNC+0LvRjyDQuNC90YTQvtGA0LzQsNGG 0LjQvtC90L3Ri9GFDQrRgtC10YXQvdC+0LvQvtCz0LjQuS4NCtCc0LjQvdC40LzQuNC30LDRhtC4 0Y8g0YDQuNGB0LrQvtCyLCDRgdCy0Y/Qt9Cw0L3QvdGL0YUg0YEg0L/RgNC+0LLQtdC00LXQvdC4 0LXQvCDQstCw0LvRjtGC0L3Ri9GFINC+0L/QtdGA0LDRhtC40Lkg0L/RgNC4DQrQvtGB0YPRidC1 0YHRgtCy0LvQtdC90LjQuA0K0LLQvdC10YjQvdC10Y3QutC+0L3QvtC80LjRh9C10YHQutC+0Lkg 0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4Lg0K0J/RgNC10LTRg9C/0YDQtdC20LTQtdC90LjQtSDQ v9GA0LDQstC+0L3QsNGA0YPRiNC10L3QuNC5INCy0LDQu9GO0YLQvdC+0LPQviDQt9Cw0LrQvtC9 0L7QtNCw0YLQtdC70YzRgdGC0LLQsCDQoNC+0YHRgdC40LnRgdC60L7QuQ0K0KTQtdC00LXRgNCw 0YbQuNC4INC4DQrQsNC60YLQvtCyINC+0YDQs9Cw0L3QvtCyINCy0LDQu9GO0YLQvdC+0LPQviDR gNC10LPRg9C70LjRgNC+0LLQsNC90LjRjy4g0J3QvtGA0LzRiyDQsNC00LzQuNC90LjRgdGC0YDQ sNGC0LjQstC90L7QuSDQuCDRg9Cz0L7Qu9C+0LLQvdC+0LkNCtC+0YLQstC10YLRgdGC0LLQtdC9 0L3QvtGB0YLQuC4NCtCa0L7QvNC/0LvQtdC60YEg0LzQtdGAINC/0L4g0YHQvtC30LTQsNC90LjR jiDQstC90YPRgtGA0LjRhNC40YDQvNC10L3QvdC+0Lkg0YHQuNGB0YLQtdC80Ysg0LLQsNC70Y7R gtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8uINCc0LXRgdGC0L4NCtCy0L3Rg9GC0YDQuNGE0LjR gNC80LXQvdC90L7QuSDRgdC40YHRgtC10LzRiyDQstCw0LvRjtGC0L3QvtCz0L4g0LrQvtC90YLR gNC+0LvRjyDQsiDQvtGA0LPQsNC90LjQt9Cw0YbQuNC+0L3QvdC+0Lkg0YHRgtGA0YPQutGC0YPR gNC1DQrQv9GA0LXQtNC/0YDQuNGP0YLQuNGPDQoo0L7RgNCz0LDQvdC40LfQsNGG0LjQuCkuDQrQ otGA0LXQsdC+0LLQsNC90LjRjyDQt9Cw0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC0LLQsCDQuiDR g9GB0LvQvtCy0LjRj9C8INC30LDQutC70Y7Rh9Cw0LXQvNGL0YUg0LLQviDQstC90LXRiNC90LXR gtC+0YDQs9C+0LLQvtC5DQrQtNC10Y/RgtC10LvRjNC90L7RgdGC0LgNCtC00L7Qs9C+0LLQvtGA 0L7QsiAo0LrQvtC90YLRgNCw0LrRgtC+0LIpLg0KKjcuINCf0YDQsNC60YLQuNGH0LXRgdC60LjQ tSDQstC+0L/RgNC+0YHRiyDQstCw0LvRjtGC0L3QvtCz0L4g0YDQtdCz0YPQu9C40YDQvtCy0LDQ vdC40Y8g0Lgg0LLQsNC70Y7RgtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8g0LIg0KDQpC4qDQrQ kNC90LDQu9C40Lcg0YLQuNC/0LjRh9C90YvRhSDRgdC40YLRg9Cw0YbQuNC5INCyINGB0YTQtdGA 0LUg0LLQsNC70Y7RgtC90YvRhSDQvtC/0LXRgNCw0YbQuNC5Lg0K0KDQtdGI0LXQvdC40LUg0L/R gNCw0LrRgtC40YfQtdGB0LrQuNGFINCx0LjQt9C90LXRgS3QutC10LnRgdC+0LIuDQrQntCx0L7Q sdGJ0LXQvdC40LUg0L/RgNCw0LrRgtC40LrQuCDQstCw0LvRjtGC0L3QvtCz0L4g0YDQtdCz0YPQ u9C40YDQvtCy0LDQvdC40Y8g0Lgg0LLQsNC70Y7RgtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8u DQoNCiAgICAgICAgICAgICAgICAgICAgICAgKiAqICogKiAqICogKiAqICogKiAqICogKiAqICog KiAqICogKiAqICogKiAqICogKiAqDQoqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICog KiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICoNCiogKg0KDQoqICAgICAg ICAgICAgICAgICDQodGC0L7QuNC80L7RgdGC0Ywg0YPRh9Cw0YHRgtC40Y86ICoxMSA4MDAg0YDR g9CxLg0KKiAgICAgICAgICAgICAgICAg0KHQutC40LTQutC4ICooMiDRh9C10LvQvtCy0LXQutCw IOKAkyAqMTAlKiwgMyDRh9C10LvQvtCy0LXQutCwIOKAkyAqMTUlKiwgNA0K0YfQtdC70L7QstC1 0LrQsCDQuCDQsdC+0LvQtdC1IOKAkyAqMjAlKi4NCiopICAgICAgICAgICAgICAgICAq0JIg0YHR gtC+0LjQvNC+0YHRgtGMINCy0YXQvtC00LjRgiDQvNC10YLQvtC00LjRh9C10YHQutC40Lkg0LzQ sNGC0LXRgNC40LDQuywg0L7QsdC10LTRiywNCtC60L7RhNC1LdC/0LDRg9C30YssINGB0LXRgNGC 0LjRhNC40LrQsNGCLg0KICAgICAgICAgICAgICAgICDQmNC90L7Qs9C+0YDQvtC00L3QuNC8INGD 0YfQsNGB0YLQvdC40LrQsNC8INC/0L7QvNC+0LPQsNC10Lwg0LIg0LHRgNC+0L3QuNGA0L7QstCw 0L3QuNC4INCz0L7RgdGC0LjQvdC40YbRiy4NCg== ------------5530CA8B83D24A7 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PHRhYmxlIGJvcmRlcj0iNiIgYmdjb2xvcj0iI0Y5RjhGNyIgd2lkdGg9 IjY5NCIgc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+PHRi b2R5Pjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMiIgd2lkdGg9IjEwMCUiPjx0Ym9keT48dHI+PHRk PjxwIGFsaWduPSJjZW50ZXIiPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+PGJyPjwvZm9u dD48Yj48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iIGNvbG9yPSIjQ0MwMDY2Ij4yOSDQsNCy 0LPRg9GB0YLQsDwvZm9udD48L2I+PGZvbnQgY29sb3I9IiNDQzAwNjYiIGZhY2U9IlRpbWVzIE5l dyBSb21hbiI+PGI+wqA8c3BhbiBsYW5nPSJydSI+PGJyPtCzLiDQnNC+0YHQutCy0LA8L3NwYW4+ PC9iPjwvZm9udD48Zm9udCBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPjxiPjxmb250IHNpemU9IjQi Pjxmb250IGNvbG9yPSIjQ0MwMDAwIj48YnI+PC9mb250Pjxicj48L2ZvbnQ+PC9iPjxicj48Yj48 Zm9udCBjb2xvcj0iIzAwMDA4MCI+0JLQkNCb0K7QotCd0J7QlSDQoNCV0JPQo9Cb0JjQoNCe0JLQ kNCd0JjQlSDQmCDQktCQ0JvQrtCi0J3Qq9CZINCa0J7QndCi0KDQntCb0Kwg0JIg0KDQpCDQoSDQ o9Cn0JXQotCe0JzCoDxicj7Qn9Ce0KHQm9CV0JTQndCY0KUg0JjQl9Cc0JXQndCV0J3QmNCZINCX 0JDQmtCe0J3QntCU0JDQotCV0JvQrNCh0KLQktCQPC9mb250Pjxmb250IHNpemU9IjQiPjxzcGFu IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMTYsMjIwLDIyMikiPjxicj48YnI+PC9zcGFu PjwvZm9udD7Qn9GA0L7QvNC+0LrQvtC0OsKgPC9iPjxzcGFuIGxhbmc9ImVuLXVzIj40PC9zcGFu Pjk0PGI+PGZvbnQgc2l6ZT0iNCI+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6cmdiKDIx NiwyMjAsMjIyKSI+PGJyPjxicj48L3NwYW4+PC9mb250PjwvYj48c3BhbiBsYW5nPSJlbi11cyI+ PGZvbnQgc2l6ZT0iMSIgY29sb3I9IiMwMDAwQ0MiPioqKjwvZm9udD48L3NwYW4+PC9mb250Pjwv cD48cCBhbGlnbj0ibGVmdCI+PGZvbnQgZmFjZT0iVGltZXMgTmV3IFJvbWFuIj48Yj7QktGA0LXQ vNGPINC/0YDQvtCy0LXQtNC10L3QuNGPPHNwYW4gbGFuZz0iZW4tdXMiPjo8L3NwYW4+wqA8L2I+ 0YEgMTA6MDAg0LTQviAxNzozMDwvZm9udD48L3A+PHAgYWxpZ249ImxlZnQiPjxmb250IGZhY2U9 IlRpbWVzIE5ldyBSb21hbiI+PGI+0JzQtdGA0L7Qv9GA0LjRj9GC0LjQtSDRgdC+0YHRgtC+0LjR gtGB0Y86wqA8YnI+PC9iPtC8LiDQkdCw0YPQvNCw0L3RgdC60LDRjywg0YPQuy4g0JHQsNGD0LzQ sNC90YHQutCw0Y8sINC0LjYsINCx0LjQt9C90LXRgSDRhtC10L3RgtGAICZxdW90O9CS0LjQutGC 0L7RgNC40Y8g0J/Qu9Cw0LfQsCZxdW90Oy48Yj48YnI+PC9iPjxicj48Yj7QktGB0Y8g0L/QvtC0 0YDQvtCx0L3QsNGPINC40L3RhNC+0YDQvNCw0YbQuNGPINC4INGA0LXQs9C40YHRgtGA0LDRhtC4 0Y8g0L3QsCDQt9Cw0L3Rj9GC0LjRjyDQv9C+INGC0LXQuy46wqA8YnI+PGJyPjwvYj48Zm9udCBz aXplPSI0Ij44PC9mb250PsKgwqA8Zm9udCBzaXplPSIyIj7QutC+0LQg0LPQvtGA0L7QtNCwINCc 0L7RgdC60LLRizwvZm9udD7CoMKgPGZvbnQgc2l6ZT0iNCI+KDQ5NSk8L2ZvbnQ+wqDCoDxmb250 IHNpemU9IjIiPtGC0LXQuzwvZm9udD48c3BhbiBsYW5nPSJlbi11cyI+PGZvbnQgc2l6ZT0iMiI+ OjwvZm9udD48L3NwYW4+wqDCoDxzcGFuIGxhbmc9ImVuLXVzIj48Zm9udCBzaXplPSI0Ij45NjE8 L2ZvbnQ+PC9zcGFuPjxmb250IHNpemU9IjQiPsKgLSAwPHNwYW4gbGFuZz0iZW4tdXMiPjA8L3Nw YW4+wqAtwqA8c3BhbiBsYW5nPSJlbi11cyI+Mzwvc3Bhbj44PC9mb250PsKgwqA8Zm9udCBzaXpl PSIyIj4o0LzQvdC+0LPQvtC60LDQvdCw0LvRjNC90YvQuSk8L2ZvbnQ+PGJyPsKgPC9mb250Pjwv cD48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjxwPjxmb250IGZhY2U9IlRpbWVzIE5ldyBSb21h biI+PGI+PHNwYW4gbGFuZz0iZW4tdXMiPsKgPC9zcGFuPjxmb250IHNpemU9IjQiPtCSINC/0YDQ vtCz0YDQsNC80LzQtTwvZm9udD48c3BhbiBsYW5nPSJlbi11cyI+PGZvbnQgc2l6ZT0iNCI+Ojwv Zm9udD48L3NwYW4+PGJyPjwvYj48YnI+PGI+PGZvbnQgc2l6ZT0iNCIgY29sb3I9IiMwMDMzOTki PjEuPC9mb250PjwvYj7CoDxiPtCd0L7QstC+0LUg0LIg0YHQuNGB0YLQtdC80LUg0LLQsNC70Y7R gtC90L7Qs9C+INGA0LXQs9GD0LvQuNGA0L7QstCw0L3QuNGPINCyINCg0KQuPC9iPjxicj7QndC+ 0YDQvNCw0YLQuNCy0L3Qvi3Qv9GA0LDQstC+0LLQsNGPINCx0LDQt9CwINCy0LDQu9GO0YLQvdC+ 0LPQviDRgNC10LPRg9C70LjRgNC+0LLQsNC90LjRjyDQsiDQoNC+0YHRgdC40LnRgdC60L7QuSDQ pNC10LTQtdGA0LDRhtC40LguPGJyPtCQ0LrRgtGD0LDQu9GM0L3Ri9C1INC40LfQvNC10L3QtdC9 0LjRjyDQstCw0LvRjtGC0L3QvtCz0L4g0LfQsNC60L7QvdC+0LTQsNGC0LXQu9GM0YHRgtCy0LAg 0KDQpCDQuCDQuNGFINC/0L7RgdC70LXQtNGB0YLQstC40Y8g0LIg0L/RgNCw0LrRgtC40LrQtcKg PGJyPtCy0L3QtdGI0L3QtdGN0LrQvtC90L7QvNC40YfQtdGB0LrQvtC5INC00LXRj9GC0LXQu9GM 0L3QvtGB0YLQuCDQutC+0LzQv9Cw0L3QuNC5Ljxicj7QlNC10LnRgdGC0LLQuNC1INGE0LXQtNC1 0YDQsNC70YzQvdC+0LPQviDQt9Cw0LrQvtC90LAgJnF1b3Q70J4g0LLQsNC70Y7RgtC90L7QvCDR gNC10LPRg9C70LjRgNC+0LLQsNC90LjQuCDQuCDQstCw0LvRjtGC0L3QvtC8INC60L7QvdGC0YDQ vtC70LUmcXVvdDsgMTczLdCk0JfCoDxicj4o0YEg0LjQt9C80LXQvdC10L3QuNGP0LzQuCwg0LLR gdGC0YPQv9C40LLRiNC40LzQuCDQsiDRgdC40LvRgyDQsiAyMDE1INCz0L7QtNGDINC4INCy0YHR gtGD0L/QsNGO0YnQuNC80Lgg0LIg0YHQuNC70YMg0LIgMjAxNiDQsykuwqA8YnI+0J/RgNC+0LXQ utGC0Ysg0LHRg9C00YPRidC40YUg0LjQt9C80LXQvdC10L3QuNC5INCk0LXQtNC10YDQsNC70YzQ vdC+0LPQviDQt9Cw0LrQvtC90LAgJnF1b3Q70J4g0LLQsNC70Y7RgtC90L7QvCDRgNC10LPRg9C7 0LjRgNC+0LLQsNC90LjQuMKgPGJyPtC4INCy0LDQu9GO0YLQvdC+0Lwg0LrQvtC90YLRgNC+0LvQ tSZxdW90Oy7CoDxicj48Yj48Zm9udCBzaXplPSI0IiBjb2xvcj0iIzAwMzM5OSI+Mi48L2ZvbnQ+ wqDQktCw0LvRjtGC0L3QvtC1INC30LDQutC+0L3QvtC00LDRgtC10LvRjNGB0YLQstC+INCg0L7R gdGB0LjQudGB0LrQvtC5INCk0LXQtNC10YDQsNGG0LjQuC48L2I+PGJyPtCR0LDQt9C+0LLRi9C1 INC/0L7QvdGP0YLQuNGPINC4INC/0YDQuNC90YbQuNC/0Ysg0LLQsNC70Y7RgtC90L7Qs9C+INGA 0LXQs9GD0LvQuNGA0L7QstCw0L3QuNGPINC4INC40YUg0L/RgNCw0LrRgtC40YfQtdGB0LrQvtC1 INC/0YDQuNC80LXQvdC10L3QuNC1Ljxicj7QntGB0L3QvtCy0L3Ri9C1INC/0L7Qu9C+0LbQtdC9 0LjRjyDQstCw0LvRjtGC0L3QvtCz0L4g0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40Y8g0Lgg0LjR hSDQuNGB0L/QvtC70YzQt9C+0LLQsNC90LjQtSDQsiDQv9GA0LDQutGC0LjQutC1wqA8YnI+0Y3Q utC+0L3QvtC80LjRh9C10YHQutC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4INC60L7QvNC/ 0LDQvdC40Lkg0Lgg0LjQvdC00LjQstC40LTRg9Cw0LvRjNC90YvRhSDQv9GA0LXQtNC/0YDQuNC9 0LjQvNCw0YLQtdC70LXQuS7CoDxicj7QntGB0L7QsdC10L3QvdC+0YHRgtC4INC/0YDQvtCy0LXQ tNC10L3QuNGPINCy0LDQu9GO0YLQvdGL0YUg0L7Qv9C10YDQsNGG0LjQuSDRgNC10LfQuNC00LXQ vdGC0LDQvNC4INC4INC90LXRgNC10LfQuNC00LXQvdGC0LDQvNC4LsKgPGJyPtCf0L7RgNGP0LTQ vtC6INC+0YLQutGA0YvRgtC40Y8g0Lgg0LLQtdC00LXQvdC40Y8g0YHRh9C10YLQvtCyINGA0LXQ t9C40LTQtdC90YLQvtCyINC30LAg0L/RgNC10LTQtdC70LDQvNC4INGC0LXRgNGA0LjRgtC+0YDQ uNC4INCg0KQuwqA8YnI+0KDQtdC20LjQvCDQt9Cw0YDRg9Cx0LXQttC90YvRhSDRgdGH0LXRgtC+ 0LIg0Lgg0L/RgNCw0LLQuNC70LAg0L7RgdGD0YnQtdGB0YLQstC70LXQvdC40Y8g0YDQtdC30LjQ tNC10L3RgtCw0LzQuCDQstCw0LvRjtGC0L3Ri9GFINC+0L/QtdGA0LDRhtC40Lkg0LfQsMKgPGJy PtGB0YfQtdGCINGB0YDQtdC00YHRgtCyLCDQvdCw0YXQvtC00Y/RidC40YXRgdGPINC90LAg0YHR h9C10YLQsNGFINCyINCx0LDQvdC60LDRhSDQt9CwINGA0YPQsdC10LbQvtC8LsKgPGJyPtCg0LXQ v9Cw0YLRgNC40LDRhtC40Y8g0LLQsNC70Y7RgtC90L7QuSDQstGL0YDRg9GH0LrQuDog0L/RgNCw 0LLQuNC70LAsINC+0YHQvtCx0LXQvdC90L7RgdGC0LgsINC/0YDQsNC60YLQuNC60LAg0Lgg0L7R gtCy0LXRgtGB0YLQstC10L3QvdC+0YHRgtGMINC30LDCoDxicj7QvdCw0YDRg9GI0LXQvdC40Y8u INCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0YLRgNC10LHQvtCy0LDQvdC40Y8g0YDQtdC/0LDRgtGA 0LjQsNGG0LjQuCDQv9GA0Lgg0YTQuNC90LDQvdGB0L7QstGL0YUg0L7Qv9C10YDQsNGG0LjRj9GF Ljxicj48Yj48Zm9udCBzaXplPSI0IiBjb2xvcj0iIzAwMzM5OSI+My48L2ZvbnQ+wqDQktCw0LvR jtGC0L3Ri9C5INC60L7QvdGC0YDQvtC70Ywg0L/RgNC4INC+0YHRg9GJ0LXRgdGC0LLQu9C10L3Q uNC4INCy0LDQu9GO0YLQvdGL0YUg0L7Qv9C10YDQsNGG0LjQuSwg0YHQstGP0LfQsNC90L3Ri9GF INGBwqA8YnI+0LLQvdC10YjQvdC10YLQvtGA0LPQvtCy0L7QuSDQtNC10Y/RgtC10LvRjNC90L7R gdGC0YzRjiwg0L/QvtC70YPRh9C10L3QuNC10Lwg0Lgg0L/RgNC10LTQvtGB0YLQsNCy0LvQtdC9 0LjQtdC8INC60YDQtdC00LjRgtC+0LIg0Lgg0LfQsNC50LzQvtCyLjwvYj48YnI+0J/QsNGB0L/Q vtGA0YIg0YHQtNC10LvQutC4OiDQv9GA0LDQstC40LvQsCDQvtGC0LrRgNGL0YLQuNGPLCDQvtGE 0L7RgNC80LvQtdC90LjRjywg0LLQtdC00LXQvdC40Y8sINC/0LXRgNC10LLQvtC00LAg0Lgg0LfQ sNC60YDRi9GC0LjRjy4g0JTQvtGB0YzQtSDQv9C+wqA8YnI+0L/QsNGB0L/QvtGA0YLRgyDRgdC0 0LXQu9C60LguPGJyPtCh0L/RgNCw0LLQutCwINC+INCy0LDQu9GO0YLQvdGL0YUg0L7Qv9C10YDQ sNGG0LjRj9GFOiDQvtGB0L7QsdC10L3QvdC+0YHRgtC4INC10LUg0YTQvtGA0LzQuNGA0L7QstCw 0L3QuNGPLCDRgdGA0L7QutC4INC4INC/0YDQsNCy0LjQu9CwINC10LXCoDxicj7Qv9GA0LXQtNGB 0YLQsNCy0LvQtdC90LjRjyDQsiDRg9C/0L7Qu9C90L7QvNC+0YfQtdC90L3Ri9C5INCx0LDQvdC6 INC/0YDQuCDQvtGB0YPRidC10YHRgtCy0LvQtdC90LjQuCDQvtC/0LXRgNCw0YbQuNC5INCyINC4 0L3QvtGB0YLRgNCw0L3QvdC+0Lkg0LjCoDxicj7QvdCw0YbQuNC+0L3QsNC70YzQvdC+0Lkg0LLQ sNC70Y7RgtC1Ljxicj7QodC/0YDQsNCy0LrQsCDQviDQv9C+0LTRgtCy0LXRgNC20LTQsNGO0YnQ uNGFINC00L7QutGD0LzQtdC90YLQsNGFINC/0YDQuCDQvtGB0YPRidC10YHRgtCy0LvQtdC90LjQ uCDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLQvtC5wqA8YnI+0LTQtdGP0YLQtdC70YzQvdC+0YHR gtC4Ljxicj7Qn9C+0LTRgtCy0LXRgNC20LTQsNGO0YnQuNC1INC00L7QutGD0LzQtdC90YLRiywg 0YHRgtCw0YLQuNGB0YLQuNGH0LXRgdC60LDRjyDRhNC+0YDQvNCwINGD0YfQtdGC0LAg0L/QtdGA 0LXQvNC10YnQtdC90LjRjyDRgtC+0LLQsNGA0L7QsiAtwqA8YnI+0L/QvtGA0Y/QtNC+0Log0L/R gNC10LTRgdGC0LDQstC70LXQvdC40Y8g0LDQs9C10L3RgtCw0Lwg0LLQsNC70Y7RgtC90L7Qs9C+ INC60L7QvdGC0YDQvtC70Y8uPGJyPtCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0LLQsNC70Y7RgtC9 0L7Qs9C+INC60L7QvdGC0YDQvtC70Y8g0LIg0L3QtdGC0L7RgNCz0L7QstC+0Lwg0L7QsdC+0YDQ vtGC0LUuPGJyPtCS0LXQtNC+0LzQvtGB0YLRjCDQsdCw0L3QutC+0LLRgdC60L7Qs9C+INC60L7Q vdGC0YDQvtC70Y88YnI+PGI+PGZvbnQgc2l6ZT0iNCIgY29sb3I9IiMwMDMzOTkiPjQuPC9mb250 PsKg0J7RgdC+0LHQtdC90L3QvtGB0YLQuCDQstCw0LvRjtGC0L3QvtCz0L4g0LrQvtC90YLRgNC+ 0LvRjywg0L7RgdGD0YnQtdGB0YLQstC70Y/QtdC80L7Qs9C+INGBINGD0YfQsNGB0YLQuNC10Lwg 0YLQsNC80L7QttC10L3QvdGL0YUg0L7RgNCz0LDQvdC+0LIuPC9iPjxicj7QotC10YXQvdC+0LvQ vtCz0LjQuCDRgtCw0LzQvtC20LXQvdC90L4t0LHQsNC90LrQvtCy0YHQutC+0LPQviDQstCw0LvR jtGC0L3QvtCz0L4g0LrQvtC90YLRgNC+0LvRjyAo0KLQkdCS0JopLjxicj7QmNC90YTQvtGA0LzQ sNGG0LjQvtC90L3Ri9C5INC+0LHQvNC10L0g0LzQtdC20LTRgyDQpNCi0KEg0KDQpCDQuCDRg9C/ 0L7Qu9C90L7QvNC+0YfQtdC90L3Ri9C80Lgg0LHQsNC90LrQsNC80LguPGJyPtCS0LfQsNC40LzQ vtC00LXQudGB0YLQstC40LUg0YEg0LTRgNGD0LPQuNC80Lgg0L7RgNCz0LDQvdCw0LzQuCDQuCDQ sNCz0LXQvdGC0LDQvNC4INCy0LDQu9GO0YLQvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPLjxicj48 Yj48Zm9udCBzaXplPSI0IiBjb2xvcj0iIzAwMzM5OSI+NS7CoDwvZm9udD7QmtC70LDRgdGB0LjR hNC40LrQsNGG0LjRjyDQuCDRgdC+0LTQtdGA0LbQsNC90LjQtSDQv9GA0LDQstC+0L3QsNGA0YPR iNC10L3QuNC5INCy0LDQu9GO0YLQvdC+0LPQviDQt9Cw0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC 0LLQsCDRgSDRg9GH0LXRgtC+0LzCoDxicj7Qv9C+0YHQu9C10LTQvdC40YUg0LjQt9C80LXQvdC1 0L3QuNC5INC90L7RgNC80LDRgtC40LLQvdC+0Lkg0L/RgNCw0LLQvtCy0L7QuSDQsdCw0LfRiy48 L2I+wqA8YnI+0J7RgNCz0LDQvdGLINC4INCw0LPQtdC90YLRiyDQstCw0LvRjtGC0L3QvtCz0L4g 0LrQvtC90YLRgNC+0LvRjzog0L7RgdC+0LHQtdC90L3QvtGB0YLQuCDQtNC10Y/RgtC10LvRjNC9 0L7RgdGC0Lgg0Lgg0L7RgNCz0LDQvdC40LfQsNGG0LjRj8KgPGJyPtCy0LfQsNC40LzQvtC00LXQ udGB0YLQstC40Y87PGJyPtCe0YDQs9Cw0L3QuNC30LDRhtC40Y8g0LPQvtGB0YPQtNCw0YDRgdGC 0LLQtdC90L3QvtCz0L4g0YTQuNC90LDQvdGB0L7QstC+0LPQviDQutC+0L3RgtGA0L7Qu9GPINC3 0LAg0L7RgdGD0YnQtdGB0YLQstC70LXQvdC40LXQvCDQstCw0LvRjtGC0L3Ri9GFwqA8YnI+0L7Q v9C10YDQsNGG0LjQuSDRgNC10LfQuNC00LXQvdGC0LDQvNC4INC4INC90LXRgNC10LfQuNC00LXQ vdGC0LDQvNC4INCyINGB0LLRj9C30Lgg0Lgg0LjQt9C80LXQvdC10L3QuNC10Lwg0YHRgtGA0YPQ utGC0YPRgNGLINC90LDQtNC30L7RgNC90YvRhSDQvtGA0LPQsNC90L7QssKgPGJyPtCg0KQ7wqA8 YnI+0JLRi9GP0LLQu9C10L3QuNC1INC4INC/0YDQtdGB0LXRh9C10L3QuNC1INC90LDRgNGD0YjQ tdC90LjQuSDQstCw0LvRjtGC0L3QvtCz0L4g0LfQsNC60L7QvdC+0LTQsNGC0LXQu9GM0YHRgtCy 0LAg0KDQvtGB0YHQuNC50YHQutC+0Lkg0KTQtdC00LXRgNCw0YbQuNC4INC4wqA8YnI+0LDQutGC 0L7QsiDQvtGA0LPQsNC90L7QsiDQstCw0LvRjtGC0L3QvtCz0L4g0YDQtdCz0YPQu9C40YDQvtCy 0LDQvdC40Y8uPGJyPtCf0L7QvdGP0YLQuNC1INGB0L7QvNC90LjRgtC10LvRjNC90YvRhSDQvtC/ 0LXRgNCw0YbQuNC5LCDQuNGFINC60LvQsNGB0YHQuNGE0LjQutCw0YbQuNGPLCDQvdC+0YDQvNCw 0YLQuNCy0L3QvtC1INGA0LXQs9GD0LvQuNGA0L7QstCw0L3QuNC1INC4wqA8YnI+0L3QtdC+0LHR hdC+0LTQuNC80L7RgdGC0Ywg0YPRh9C10YLQsCDQsiDQv9GA0LDQutGC0LjQutC1INCy0L3QtdGI 0L3QtdGN0LrQvtC90L7QvNC40YfQtdGB0LrQvtC5INC00LXRj9GC0LXQu9GM0L3QvtGB0YLQuC48 YnI+0JjQt9C80LXQvdC10L3QuNGPINC90L7RgNC80LDRgtC40LLQvdC+LdC/0YDQsNCy0L7QstC+ 0Lkg0LHQsNC30Ysg0LLQsNC70Y7RgtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8gKNCT0YDQsNC2 0LTQsNC90YHQutC40Lkg0LrQvtC00LXQutGBwqA8YnI+0KDQvtGB0YHQuNC50YHQutC+0Lkg0KTQ tdC00LXRgNCw0YbQuNC4LCDQmtC+0LTQtdC60YEg0KDQvtGB0YHQuNC50YHQutC+0Lkg0KTQtdC0 0LXRgNCw0YbQuNC4INC+0LEg0LDQtNC80LjQvdC40YHRgtGA0LDRgtC40LLQvdGL0YXCoDxicj7Q v9GA0LDQstC+0L3QsNGA0YPRiNC10L3QuNGP0YUsINCj0LPQvtC70L7QstC90YvQuSDQutC+0LTQ tdC60YEg0KDQvtGB0YHQuNC50YHQutC+0Lkg0KTQtdC00LXRgNCw0YbQuNC4LCDQsiDQpNC10LTQ tdGA0LDQu9GM0L3Ri9C5INC30LDQutC+0L0g4oSWIDE3My3QpNCXwqA8YnI+JnF1b3Q70J4g0LLQ sNC70Y7RgtC90L7QvCDRgNC10LPRg9C70LjRgNC+0LLQsNC90LjQuCDQuCDQstCw0LvRjtGC0L3Q vtC8INC60L7QvdGC0YDQvtC70LUmcXVvdDssINCk0LXQtNC10YDQsNC70YzQvdGL0Lkg0LfQsNC6 0L7QvSDihJYgMTY0LdCk0JcgJnF1b3Q70J7QscKgPGJyPtC+0YHQvdC+0LLQsNGFINCz0L7RgdGD 0LTQsNGA0YHRgtCy0LXQvdC90L7Qs9C+INGA0LXQs9GD0LvQuNGA0L7QstCw0L3QuNGPINCy0L3Q tdGI0L3QtdGC0L7RgNCz0L7QstC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtC4JnF1b3Q7INC4 INC00YDRg9Cz0LjQtcKgPGJyPtC90L7RgNC80LDRgtC40LLQvdGL0LUg0L/RgNCw0LLQvtCy0YvQ tSDQsNC60YLRiyksINCwINGC0LDQuiDQttC1INC/0LvQsNC90LjRgNGD0LXQvNGL0LUg0LjQt9C8 0LXQvdC10L3QuNGPINGD0LrQsNC30LDQvdC90YvRhSDQvdC+0YDQvNCw0YLQuNCy0L3Ri9GFwqA8 YnI+0LDQutGC0L7Qsi48YnI+PGI+PGZvbnQgc2l6ZT0iNCIgY29sb3I9IiMwMDMzOTkiPjYuwqA8 L2ZvbnQ+0J7RgtCy0LXRgtGB0YLQstC10L3QvdC+0YHRgtGMINC30LAg0L3QsNGA0YPRiNC10L3Q uNGPINCy0LDQu9GO0YLQvdC+0LPQviDQt9Cw0LrQvtC90L7QtNCw0YLQtdC70YzRgdGC0LLQsCDQ uCDQsNC60YLQvtCyINC+0YDQs9Cw0L3QvtCyINCy0LDQu9GO0YLQvdC+0LPQvsKgPGJyPtGA0LXQ s9GD0LvQuNGA0L7QstCw0L3QuNGPLjwvYj48YnI+0J/RgNCw0LLQuNC70LAg0L/RgNC10LTRgdGC 0LDQstC70LXQvdC40Y8g0L7RgNCz0LDQvdCw0LzQuCDQuCDQsNCz0LXQvdGC0LDQvNC4INCy0LDQ u9GO0YLQvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPINCyINGD0L/QvtC70L3QvtC80L7Rh9C10L3Q vdGL0LnCoDxicj7Qn9GA0LDQstC40YLQtdC70YzRgdGC0LLQvtC8INCg0L7RgdGB0LjQudGB0LrQ vtC5INCk0LXQtNC10YDQsNGG0LjQuCDQvtGA0LPQsNC9INCy0LDQu9GO0YLQvdC+0LPQviDQutC+ 0L3RgtGA0L7Qu9GPINC90LXQvtCx0YXQvtC00LjQvNGL0YUg0LTQvtC60YPQvNC10L3RgtC+0LLC oDxicj7QuCDQuNC90YTQvtGA0LzQsNGG0LjQuC7CoDxicj7QntGC0LTQtdC70YzQvdGL0LUg0LLQ vtC/0YDQvtGB0Ysg0LjRgdC/0L7Qu9GM0LfRg9C10LzRi9GFINCyINGB0YTQtdGA0LUg0LLQsNC7 0Y7RgtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8g0LjQvdGE0L7RgNC80LDRhtC40L7QvdC90YvR hcKgPGJyPtGC0LXRhdC90L7Qu9C+0LPQuNC5Ljxicj7QnNC40L3QuNC80LjQt9Cw0YbQuNGPINGA 0LjRgdC60L7Qsiwg0YHQstGP0LfQsNC90L3Ri9GFINGBINC/0YDQvtCy0LXQtNC10L3QuNC10Lwg 0LLQsNC70Y7RgtC90YvRhSDQvtC/0LXRgNCw0YbQuNC5INC/0YDQuCDQvtGB0YPRidC10YHRgtCy 0LvQtdC90LjQuMKgPGJyPtCy0L3QtdGI0L3QtdGN0LrQvtC90L7QvNC40YfQtdGB0LrQvtC5INC0 0LXRj9GC0LXQu9GM0L3QvtGB0YLQuC48YnI+0J/RgNC10LTRg9C/0YDQtdC20LTQtdC90LjQtSDQ v9GA0LDQstC+0L3QsNGA0YPRiNC10L3QuNC5INCy0LDQu9GO0YLQvdC+0LPQviDQt9Cw0LrQvtC9 0L7QtNCw0YLQtdC70YzRgdGC0LLQsCDQoNC+0YHRgdC40LnRgdC60L7QuSDQpNC10LTQtdGA0LDR htC40Lgg0LjCoDxicj7QsNC60YLQvtCyINC+0YDQs9Cw0L3QvtCyINCy0LDQu9GO0YLQvdC+0LPQ viDRgNC10LPRg9C70LjRgNC+0LLQsNC90LjRjy4g0J3QvtGA0LzRiyDQsNC00LzQuNC90LjRgdGC 0YDQsNGC0LjQstC90L7QuSDQuCDRg9Cz0L7Qu9C+0LLQvdC+0LnCoDxicj7QvtGC0LLQtdGC0YHR gtCy0LXQvdC90L7RgdGC0LguPGJyPtCa0L7QvNC/0LvQtdC60YEg0LzQtdGAINC/0L4g0YHQvtC3 0LTQsNC90LjRjiDQstC90YPRgtGA0LjRhNC40YDQvNC10L3QvdC+0Lkg0YHQuNGB0YLQtdC80Ysg 0LLQsNC70Y7RgtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8uINCc0LXRgdGC0L7CoDxicj7QstC9 0YPRgtGA0LjRhNC40YDQvNC10L3QvdC+0Lkg0YHQuNGB0YLQtdC80Ysg0LLQsNC70Y7RgtC90L7Q s9C+INC60L7QvdGC0YDQvtC70Y8g0LIg0L7RgNCz0LDQvdC40LfQsNGG0LjQvtC90L3QvtC5INGB 0YLRgNGD0LrRgtGD0YDQtSDQv9GA0LXQtNC/0YDQuNGP0YLQuNGPwqA8YnI+KNC+0YDQs9Cw0L3Q uNC30LDRhtC40LgpLjxicj7QotGA0LXQsdC+0LLQsNC90LjRjyDQt9Cw0LrQvtC90L7QtNCw0YLQ tdC70YzRgdGC0LLQsCDQuiDRg9GB0LvQvtCy0LjRj9C8INC30LDQutC70Y7Rh9Cw0LXQvNGL0YUg 0LLQviDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLQvtC5INC00LXRj9GC0LXQu9GM0L3QvtGB0YLQ uMKgPGJyPtC00L7Qs9C+0LLQvtGA0L7QsiAo0LrQvtC90YLRgNCw0LrRgtC+0LIpLsKgPGJyPjxi Pjxmb250IHNpemU9IjQiIGNvbG9yPSIjMDAzMzk5Ij43LjwvZm9udD7CoNCf0YDQsNC60YLQuNGH 0LXRgdC60LjQtSDQstC+0L/RgNC+0YHRiyDQstCw0LvRjtGC0L3QvtCz0L4g0YDQtdCz0YPQu9C4 0YDQvtCy0LDQvdC40Y8g0Lgg0LLQsNC70Y7RgtC90L7Qs9C+INC60L7QvdGC0YDQvtC70Y8g0LIg 0KDQpC48L2I+PGJyPtCQ0L3QsNC70LjQtyDRgtC40L/QuNGH0L3Ri9GFINGB0LjRgtGD0LDRhtC4 0Lkg0LIg0YHRhNC10YDQtSDQstCw0LvRjtGC0L3Ri9GFINC+0L/QtdGA0LDRhtC40LkuPGJyPtCg 0LXRiNC10L3QuNC1INC/0YDQsNC60YLQuNGH0LXRgdC60LjRhSDQsdC40LfQvdC10YEt0LrQtdC5 0YHQvtCyLjxicj7QntCx0L7QsdGJ0LXQvdC40LUg0L/RgNCw0LrRgtC40LrQuCDQstCw0LvRjtGC 0L3QvtCz0L4g0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40Y8g0Lgg0LLQsNC70Y7RgtC90L7Qs9C+ INC60L7QvdGC0YDQvtC70Y8uwqA8YnI+PGJyPjxzcGFuIGxhbmc9ImVuLXVzIj48Zm9udCBzaXpl PSIxIj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqICogKiAq ICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICog KiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAq ICogKiAqICogKjwvZm9udD48L3NwYW4+PGJyPjxicj48Yj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCDQodGC0L7QuNC80L7RgdGC0Ywg0YPRh9Cw0YHRgtC40Y86wqA8L2I+MTEgODAw INGA0YPQsS48Yj48YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg0KHQutC40LTQ utC4wqA8L2I+KDIg0YfQtdC70L7QstC10LrQsCDigJPCoDxiPjEwJTwvYj4sIDMg0YfQtdC70L7Q stC10LrQsCDigJPCoDxiPjE1JTwvYj4sIDQg0YfQtdC70L7QstC10LrQsCDQuCDQsdC+0LvQtdC1 IOKAk8KgPGI+MjAlPC9iPi48Yj4pPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqA8L2I+0JIg0YHRgtC+0LjQvNC+0YHRgtGMINCy0YXQvtC00LjRgiDQvNC10YLQvtC00LjRh9C1 0YHQutC40Lkg0LzQsNGC0LXRgNC40LDQuywg0L7QsdC10LTRiywg0LrQvtGE0LUt0L/QsNGD0LfR iywg0YHQtdGA0YLQuNGE0LjQutCw0YIuPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgINCY0L3QvtCz0L7RgNC+0LTQvdC40Lwg0YPRh9Cw0YHRgtC90LjQutCw0Lwg0L/QvtC80L7Q s9Cw0LXQvCDQsiDQsdGA0L7QvdC40YDQvtCy0LDQvdC40Lgg0LPQvtGB0YLQuNC90LjRhtGLLjxi cj7CoDwvZm9udD48L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj4NCg== ------------5530CA8B83D24A7-- From agruenba@redhat.com Tue Aug 16 06:03:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CE7E77CA2 for ; Tue, 16 Aug 2016 06:03:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1B91AC00B for ; Tue, 16 Aug 2016 04:03:20 -0700 (PDT) X-ASG-Debug-ID: 1471345396-0bf57b64af1aa70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HaljUKqq6OxkCnnu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:19 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5E1A4635C3; Tue, 16 Aug 2016 11:03:16 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34FT006464; Tue, 16 Aug 2016 07:03:10 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 01/22] vfs: Add IS_ACL() and IS_RICHACL() tests Date: Tue, 16 Aug 2016 13:02:42 +0200 X-ASG-Orig-Subj: [PATCH v25 01/22] vfs: Add IS_ACL() and IS_RICHACL() tests Message-Id: <1471345383-15334-2-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 16 Aug 2016 11:03:16 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345399 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4089 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The vfs does not apply the umask for file systems that support acls. The test used for this used to be called IS_POSIXACL(). Switch to a new IS_ACL() test to check for either posix acls or richacls instead. Add a new MS_RICHACL flag and IS_RICHACL() test for richacls alone. The IS_POSIXACL() test is still needed in some places like nfsd. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger Reviewed-by: Steve French Reviewed-by: Jeff Layton --- fs/Kconfig | 3 +++ fs/namei.c | 6 +++--- include/linux/fs.h | 12 ++++++++++++ include/uapi/linux/fs.h | 3 ++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/fs/Kconfig b/fs/Kconfig index 2bc7ad7..4906f69 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -67,6 +67,9 @@ endif # BLOCK config FS_POSIX_ACL def_bool n +config FS_RICHACL + def_bool n + config EXPORTFS tristate diff --git a/fs/namei.c b/fs/namei.c index adb0414..045d0eb 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -3129,7 +3129,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, * O_EXCL open we want to return EEXIST not EROFS). */ if (open_flag & O_CREAT) { - if (!IS_POSIXACL(dir->d_inode)) + if (!IS_ACL(dir->d_inode)) mode &= ~current_umask(); if (unlikely(!got_write)) { create_error = -EROFS; @@ -3723,7 +3723,7 @@ retry: if (IS_ERR(dentry)) return PTR_ERR(dentry); - if (!IS_POSIXACL(path.dentry->d_inode)) + if (!IS_ACL(path.dentry->d_inode)) mode &= ~current_umask(); error = security_path_mknod(&path, dentry, mode, dev); if (error) @@ -3794,7 +3794,7 @@ retry: if (IS_ERR(dentry)) return PTR_ERR(dentry); - if (!IS_POSIXACL(path.dentry->d_inode)) + if (!IS_ACL(path.dentry->d_inode)) mode &= ~current_umask(); error = security_path_mkdir(&path, dentry, mode); if (!error) diff --git a/include/linux/fs.h b/include/linux/fs.h index 3523bf6..e133fa3 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1858,6 +1858,12 @@ struct super_operations { #define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE) #define IS_POSIXACL(inode) __IS_FLG(inode, MS_POSIXACL) +#ifdef CONFIG_FS_RICHACL +#define IS_RICHACL(inode) __IS_FLG(inode, MS_RICHACL) +#else +#define IS_RICHACL(inode) 0 +#endif + #define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD) #define IS_NOCMTIME(inode) ((inode)->i_flags & S_NOCMTIME) #define IS_SWAPFILE(inode) ((inode)->i_flags & S_SWAPFILE) @@ -1876,6 +1882,12 @@ static inline bool HAS_UNMAPPED_ID(struct inode *inode) } /* + * IS_ACL() tells the VFS to not apply the umask + * and use check_acl for acl permission checks when defined. + */ +#define IS_ACL(inode) __IS_FLG(inode, MS_POSIXACL | MS_RICHACL) + +/* * Inode state bits. Protected by inode->i_lock * * Three bits determine the dirty state of the inode, I_DIRTY_SYNC, diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 3b00f7c..f9c41ef 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -120,7 +120,7 @@ struct inodes_stat_t { #define MS_VERBOSE 32768 /* War is peace. Verbosity is silence. MS_VERBOSE is deprecated. */ #define MS_SILENT 32768 -#define MS_POSIXACL (1<<16) /* VFS does not apply the umask */ +#define MS_POSIXACL (1<<16) /* Supports POSIX ACLs */ #define MS_UNBINDABLE (1<<17) /* change to unbindable */ #define MS_PRIVATE (1<<18) /* change to private */ #define MS_SLAVE (1<<19) /* change to slave */ @@ -130,6 +130,7 @@ struct inodes_stat_t { #define MS_I_VERSION (1<<23) /* Update inode I_version field */ #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ #define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ +#define MS_RICHACL (1<<26) /* Supports richacls */ /* These sb flags are internal to the kernel */ #define MS_NOSEC (1<<28) -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:03:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DB87E7CA3 for ; Tue, 16 Aug 2016 06:03:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2699DAC061 for ; Tue, 16 Aug 2016 04:03:24 -0700 (PDT) X-ASG-Debug-ID: 1471345391-0bf57c0cfe1de50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id y0qj4Bin3DqEGlEU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:12 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9DE79C04D280; Tue, 16 Aug 2016 11:03:10 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34FS006464; Tue, 16 Aug 2016 07:03:04 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 00/22] Richacls (Core and Ext4) Date: Tue, 16 Aug 2016 13:02:41 +0200 X-ASG-Orig-Subj: [PATCH v25 00/22] Richacls (Core and Ext4) Message-Id: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 16 Aug 2016 11:03:11 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345392 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4484 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Here is another update of the richacl patches. Changes since the last posting (https://lwn.net/Articles/695289/): * Rebase on top of the 4.8-rc2 kernel. As always, the complete patch queue is available here: git://git.kernel.org/pub/scm/linux/kernel/git/agruen/linux-richacl.git \ richacl-2016-08-16 The richacl user-space utilitites, man pages, and test suite are available here: https://github.com/andreas-gruenbacher/richacl Changes to other user-space packages for richacl: https://github.com/andreas-gruenbacher/coreutils https://github.com/andreas-gruenbacher/e2fsprogs https://github.com/andreas-gruenbacher/samba https://github.com/andreas-gruenbacher/xfsprogs-dev https://github.com/andreas-gruenbacher/nfs-utils Please see the richacl homepage for more information: http://www.bestbits.at/richacl/ Thanks, Andreas Andreas Gruenbacher (20): vfs: Add IS_ACL() and IS_RICHACL() tests vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags vfs: Make the inode passed to inode_change_ok non-const vfs: Add permission flags for setting file attributes richacl: In-memory representation and helper functions richacl: Permission mapping functions richacl: Permission check algorithm richacl: Compute maximum file masks from an acl vfs: Cache base_acl objects in inodes vfs: Add get_richacl and set_richacl inode operations vfs: Cache richacl in struct inode richacl: Update the file masks in chmod() richacl: Check if an acl is equivalent to a file mode richacl: Create-time inheritance richacl: Automatic Inheritance richacl: xattr mapping functions richacl: Add richacl xattr handler vfs: Add richacl permission checking vfs: Move check_posix_acl and check_richacl out of fs/namei.c Aneesh Kumar K.V (2): ext4: Add richacl support ext4: Add richacl feature flag drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/9p/acl.c | 8 +- fs/Kconfig | 3 + fs/Makefile | 1 + fs/attr.c | 81 +- fs/ext4/Kconfig | 11 + fs/ext4/Makefile | 1 + fs/ext4/ext4.h | 6 +- fs/ext4/file.c | 3 + fs/ext4/ialloc.c | 11 +- fs/ext4/inode.c | 5 +- fs/ext4/namei.c | 5 + fs/ext4/richacl.c | 134 ++++ fs/ext4/richacl.h | 40 + fs/ext4/super.c | 49 +- fs/ext4/xattr.c | 7 + fs/f2fs/acl.c | 4 +- fs/inode.c | 43 +- fs/jffs2/acl.c | 6 +- fs/namei.c | 114 +-- fs/nfs/nfs3acl.c | 14 +- fs/posix_acl.c | 97 ++- fs/richacl.c | 937 ++++++++++++++++++++++++ fs/richacl_xattr.c | 222 ++++++ include/linux/acl.h | 15 + include/linux/fs.h | 65 +- include/linux/posix_acl.h | 24 +- include/linux/richacl.h | 218 ++++++ include/linux/richacl_xattr.h | 31 + include/uapi/linux/Kbuild | 2 + include/uapi/linux/fs.h | 3 +- include/uapi/linux/richacl.h | 152 ++++ include/uapi/linux/richacl_xattr.h | 44 ++ include/uapi/linux/xattr.h | 2 + 34 files changed, 2197 insertions(+), 163 deletions(-) create mode 100644 fs/ext4/richacl.c create mode 100644 fs/ext4/richacl.h create mode 100644 fs/richacl.c create mode 100644 fs/richacl_xattr.c create mode 100644 include/linux/acl.h create mode 100644 include/linux/richacl.h create mode 100644 include/linux/richacl_xattr.h create mode 100644 include/uapi/linux/richacl.h create mode 100644 include/uapi/linux/richacl_xattr.h -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:03:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 992D97CA2 for ; Tue, 16 Aug 2016 06:03:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B4898F8165 for ; Tue, 16 Aug 2016 04:03:23 -0700 (PDT) X-ASG-Debug-ID: 1471345401-0bf57b64ac1aa80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id eP484cSBtsXPUvYH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:22 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7E76F8F227; Tue, 16 Aug 2016 11:03:21 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34FU006464; Tue, 16 Aug 2016 07:03:16 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 02/22] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Date: Tue, 16 Aug 2016 13:02:43 +0200 X-ASG-Orig-Subj: [PATCH v25 02/22] vfs: Add MAY_CREATE_FILE and MAY_CREATE_DIR permission flags Message-Id: <1471345383-15334-3-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 16 Aug 2016 11:03:21 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345402 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7333 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Richacls distinguish between creating non-directories and directories. To support that, add an isdir parameter to may_create(). When checking inode_permission() for create permission, pass in an additional MAY_CREATE_FILE or MAY_CREATE_DIR mask flag. Add may_replace() to allow checking for delete and create access when replacing an existing file in vfs_rename(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger Reviewed-by: Steve French Reviewed-by: Jeff Layton --- fs/namei.c | 49 +++++++++++++++++++++++++++++++++---------------- include/linux/fs.h | 2 ++ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 045d0eb..6cd7a10 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -463,7 +463,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * this, letting us set arbitrary permissions for filesystem access without * changing the "normal" UIDs which are used for other things. * - * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask. + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or + * MAY_CREATE_DIR are set. That way, file systems that don't support these + * permissions will check for MAY_WRITE instead. */ int inode_permission(struct inode *inode, int mask) { @@ -2765,7 +2767,8 @@ EXPORT_SYMBOL(__check_sticky); * 11. We don't allow removal of NFS sillyrenamed files; it's handled by * nfs_async_unlink(). */ -static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +static int may_delete_or_replace(struct inode *dir, struct dentry *victim, + bool isdir, int mask) { struct inode *inode = d_backing_inode(victim); int error; @@ -2777,7 +2780,7 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, MAY_WRITE | MAY_EXEC); + error = inode_permission(dir, mask); if (error) return error; if (IS_APPEND(dir)) @@ -2800,6 +2803,18 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) return 0; } +static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +{ + return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); +} + +static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) +{ + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; + + return may_delete_or_replace(dir, victim, isdir, mask | MAY_WRITE | MAY_EXEC); +} + /* Check whether we can create an object with dentry child in directory * dir. * 1. We can't do it if child already exists (open has special treatment for @@ -2809,9 +2824,11 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) * 4. We should have write and exec permissions on dir * 5. We can't do it if dir is immutable (done in permission()) */ -static inline int may_create(struct inode *dir, struct dentry *child) +static inline int may_create(struct inode *dir, struct dentry *child, bool isdir) { + int mask = isdir ? MAY_CREATE_DIR : MAY_CREATE_FILE; struct user_namespace *s_user_ns; + audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); if (child->d_inode) return -EEXIST; @@ -2821,7 +2838,7 @@ static inline int may_create(struct inode *dir, struct dentry *child) if (!kuid_has_mapping(s_user_ns, current_fsuid()) || !kgid_has_mapping(s_user_ns, current_fsgid())) return -EOVERFLOW; - return inode_permission(dir, MAY_WRITE | MAY_EXEC); + return inode_permission(dir, MAY_WRITE | MAY_EXEC | mask); } /* @@ -2871,7 +2888,7 @@ EXPORT_SYMBOL(unlock_rename); int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool want_excl) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -3664,7 +3681,7 @@ EXPORT_SYMBOL(user_path_create); int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -3758,7 +3775,7 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, d int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, true); unsigned max_links = dir->i_sb->s_max_links; if (error) @@ -3814,7 +3831,7 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, umode_t, mode) int vfs_rmdir(struct inode *dir, struct dentry *dentry) { - int error = may_delete(dir, dentry, 1); + int error = may_delete(dir, dentry, true); if (error) return error; @@ -3936,7 +3953,7 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) { struct inode *target = dentry->d_inode; - int error = may_delete(dir, dentry, 0); + int error = may_delete(dir, dentry, false); if (error) return error; @@ -4070,7 +4087,7 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; @@ -4153,7 +4170,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de if (!inode) return -ENOENT; - error = may_create(dir, new_dentry); + error = may_create(dir, new_dentry, false); if (error) return error; @@ -4357,14 +4374,14 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, return error; if (!target) { - error = may_create(new_dir, new_dentry); + error = may_create(new_dir, new_dentry, is_dir); } else { new_is_dir = d_is_dir(new_dentry); if (!(flags & RENAME_EXCHANGE)) - error = may_delete(new_dir, new_dentry, is_dir); + error = may_replace(new_dir, new_dentry, is_dir); else - error = may_delete(new_dir, new_dentry, new_is_dir); + error = may_replace(new_dir, new_dentry, new_is_dir); } if (error) return error; @@ -4627,7 +4644,7 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna int vfs_whiteout(struct inode *dir, struct dentry *dentry) { - int error = may_create(dir, dentry); + int error = may_create(dir, dentry, false); if (error) return error; diff --git a/include/linux/fs.h b/include/linux/fs.h index e133fa3..99bbd6c 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -84,6 +84,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, #define MAY_CHDIR 0x00000040 /* called from RCU mode, don't block */ #define MAY_NOT_BLOCK 0x00000080 +#define MAY_CREATE_FILE 0x00000100 +#define MAY_CREATE_DIR 0x00000200 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:03:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C97987CA4 for ; Tue, 16 Aug 2016 06:03:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25154AC066 for ; Tue, 16 Aug 2016 04:03:29 -0700 (PDT) X-ASG-Debug-ID: 1471345407-0bf57b64af1aaa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4dwXrKUpIm7hkwTS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:27 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1CAC9C0096D3; Tue, 16 Aug 2016 11:03:27 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34FV006464; Tue, 16 Aug 2016 07:03:21 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 03/22] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags Date: Tue, 16 Aug 2016 13:02:44 +0200 X-ASG-Orig-Subj: [PATCH v25 03/22] vfs: Add MAY_DELETE_SELF and MAY_DELETE_CHILD permission flags Message-Id: <1471345383-15334-4-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 16 Aug 2016 11:03:27 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345407 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3507 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Normally, deleting a file requires MAY_WRITE access to the parent directory. With richacls, a file may be deleted with MAY_DELETE_CHILD access to the parent directory or with MAY_DELETE_SELF access to the file. To support that, pass the MAY_DELETE_CHILD mask flag to inode_permission() when checking for delete access inside a directory, and MAY_DELETE_SELF when checking for delete access to a file itself. The MAY_DELETE_SELF permission overrides the sticky directory check. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Steve French Reviewed-by: Jeff Layton --- fs/namei.c | 20 +++++++++++++------- include/linux/fs.h | 2 ++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 6cd7a10..4292c33 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -463,9 +463,9 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * this, letting us set arbitrary permissions for filesystem access without * changing the "normal" UIDs which are used for other things. * - * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, or - * MAY_CREATE_DIR are set. That way, file systems that don't support these - * permissions will check for MAY_WRITE instead. + * MAY_WRITE must be set in @mask whenever MAY_APPEND, MAY_CREATE_FILE, + * MAY_CREATE_DIR, or MAY_DELETE_CHILD are set. That way, file systems that + * don't support these permissions will check for MAY_WRITE instead. */ int inode_permission(struct inode *inode, int mask) { @@ -2780,14 +2780,20 @@ static int may_delete_or_replace(struct inode *dir, struct dentry *victim, BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, mask); + error = inode_permission(dir, mask | MAY_WRITE | MAY_DELETE_CHILD); + if (!error && check_sticky(dir, inode)) + error = -EPERM; + if (error && IS_RICHACL(inode) && + inode_permission(inode, MAY_DELETE_SELF) == 0 && + inode_permission(dir, mask) == 0) + error = 0; if (error) return error; if (IS_APPEND(dir)) return -EPERM; - if (check_sticky(dir, inode) || IS_APPEND(inode) || - IS_IMMUTABLE(inode) || IS_SWAPFILE(inode) || HAS_UNMAPPED_ID(inode)) + if (IS_APPEND(inode) || IS_IMMUTABLE(inode) || + IS_SWAPFILE(inode) || HAS_UNMAPPED_ID(inode)) return -EPERM; if (isdir) { if (!d_is_dir(victim)) @@ -2805,7 +2811,7 @@ static int may_delete_or_replace(struct inode *dir, struct dentry *victim, static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) { - return may_delete_or_replace(dir, victim, isdir, MAY_WRITE | MAY_EXEC); + return may_delete_or_replace(dir, victim, isdir, MAY_EXEC); } static int may_replace(struct inode *dir, struct dentry *victim, bool isdir) diff --git a/include/linux/fs.h b/include/linux/fs.h index 99bbd6c..907869d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -86,6 +86,8 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, #define MAY_NOT_BLOCK 0x00000080 #define MAY_CREATE_FILE 0x00000100 #define MAY_CREATE_DIR 0x00000200 +#define MAY_DELETE_CHILD 0x00000400 +#define MAY_DELETE_SELF 0x00000800 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:03:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 88B0B7CA2 for ; Tue, 16 Aug 2016 06:03:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 41DB98F8165 for ; Tue, 16 Aug 2016 04:03:34 -0700 (PDT) X-ASG-Debug-ID: 1471345413-0bf57b64ae1aab0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UUiJ8FEbmtehrnmP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:33 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AA7CB796F4; Tue, 16 Aug 2016 11:03:32 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34FW006464; Tue, 16 Aug 2016 07:03:27 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 04/22] vfs: Make the inode passed to inode_change_ok non-const Date: Tue, 16 Aug 2016 13:02:45 +0200 X-ASG-Orig-Subj: [PATCH v25 04/22] vfs: Make the inode passed to inode_change_ok non-const Message-Id: <1471345383-15334-5-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 16 Aug 2016 11:03:32 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345413 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1502 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We will need to call iop->permission and iop->get_acl from inode_change_ok() for additional permission checks, and both take a non-const inode. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Andreas Dilger Reviewed-by: Steve French Reviewed-by: Jeff Layton --- fs/attr.c | 2 +- include/linux/fs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index 42bb42b..a4b7d2f 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -28,7 +28,7 @@ * Should be called as the first thing in ->setattr implementations, * possibly after taking additional locks. */ -int inode_change_ok(const struct inode *inode, struct iattr *attr) +int inode_change_ok(struct inode *inode, struct iattr *attr) { unsigned int ia_valid = attr->ia_valid; diff --git a/include/linux/fs.h b/include/linux/fs.h index 907869d..0d6ac2c 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3010,7 +3010,7 @@ extern int buffer_migrate_page(struct address_space *, #define buffer_migrate_page NULL #endif -extern int inode_change_ok(const struct inode *, struct iattr *); +extern int inode_change_ok(struct inode *, struct iattr *); extern int inode_newsize_ok(const struct inode *, loff_t offset); extern void setattr_copy(struct inode *inode, const struct iattr *attr); -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:03:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AD5DA7CA2 for ; Tue, 16 Aug 2016 06:03:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1351FAC00B for ; Tue, 16 Aug 2016 04:03:40 -0700 (PDT) X-ASG-Debug-ID: 1471345418-0bf57b64ad1aad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZyGRxMAFuHb1rEuC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:38 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 30116635C6; Tue, 16 Aug 2016 11:03:38 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34FX006464; Tue, 16 Aug 2016 07:03:33 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 05/22] vfs: Add permission flags for setting file attributes Date: Tue, 16 Aug 2016 13:02:46 +0200 X-ASG-Orig-Subj: [PATCH v25 05/22] vfs: Add permission flags for setting file attributes Message-Id: <1471345383-15334-6-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 16 Aug 2016 11:03:38 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345418 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4668 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Richacls support permissions that allow to take ownership of a file, change the file permissions, and set the file timestamps. Support that by introducing new permission mask flags and by checking for those mask flags in inode_change_ok(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Steve French Reviewed-by: Jeff Layton --- fs/attr.c | 79 +++++++++++++++++++++++++++++++++++++++++++++--------- include/linux/fs.h | 3 +++ 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/fs/attr.c b/fs/attr.c index a4b7d2f..6b175e8 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -17,6 +17,65 @@ #include /** + * inode_extended_permission - permissions beyond read/write/execute + * + * Check for permissions that only richacls can currently grant. + */ +static int inode_extended_permission(struct inode *inode, int mask) +{ + if (!IS_RICHACL(inode)) + return -EPERM; + return inode_permission(inode, mask); +} + +static bool inode_uid_change_ok(struct inode *inode, kuid_t ia_uid) +{ + if (uid_eq(current_fsuid(), inode->i_uid) && + uid_eq(ia_uid, inode->i_uid)) + return true; + if (uid_eq(current_fsuid(), ia_uid) && + inode_extended_permission(inode, MAY_TAKE_OWNERSHIP) == 0) + return true; + if (capable_wrt_inode_uidgid(inode, CAP_CHOWN)) + return true; + return false; +} + +static bool inode_gid_change_ok(struct inode *inode, kgid_t ia_gid) +{ + int in_group = in_group_p(ia_gid); + if (uid_eq(current_fsuid(), inode->i_uid) && + (in_group || gid_eq(ia_gid, inode->i_gid))) + return true; + if (in_group && inode_extended_permission(inode, MAY_TAKE_OWNERSHIP) == 0) + return true; + if (capable_wrt_inode_uidgid(inode, CAP_CHOWN)) + return true; + return false; +} + +/** + * inode_owner_permitted_or_capable + * + * Check for permissions implicitly granted to the owner, like MAY_CHMOD or + * MAY_SET_TIMES. Equivalent to inode_owner_or_capable for file systems + * without support for those permissions. + */ +static bool inode_owner_permitted_or_capable(struct inode *inode, int mask) +{ + struct user_namespace *ns; + + if (uid_eq(current_fsuid(), inode->i_uid)) + return true; + if (inode_extended_permission(inode, mask) == 0) + return true; + ns = current_user_ns(); + if (ns_capable(ns, CAP_FOWNER) && kuid_has_mapping(ns, inode->i_uid)) + return true; + return false; +} + +/** * inode_change_ok - check if attribute changes to an inode are allowed * @inode: inode to check * @attr: attributes to change @@ -47,22 +106,18 @@ int inode_change_ok(struct inode *inode, struct iattr *attr) return 0; /* Make sure a caller can chown. */ - if ((ia_valid & ATTR_UID) && - (!uid_eq(current_fsuid(), inode->i_uid) || - !uid_eq(attr->ia_uid, inode->i_uid)) && - !capable_wrt_inode_uidgid(inode, CAP_CHOWN)) - return -EPERM; + if (ia_valid & ATTR_UID) + if (!inode_uid_change_ok(inode, attr->ia_uid)) + return -EPERM; /* Make sure caller can chgrp. */ - if ((ia_valid & ATTR_GID) && - (!uid_eq(current_fsuid(), inode->i_uid) || - (!in_group_p(attr->ia_gid) && !gid_eq(attr->ia_gid, inode->i_gid))) && - !capable_wrt_inode_uidgid(inode, CAP_CHOWN)) - return -EPERM; + if (ia_valid & ATTR_GID) + if (!inode_gid_change_ok(inode, attr->ia_gid)) + return -EPERM; /* Make sure a caller can chmod. */ if (ia_valid & ATTR_MODE) { - if (!inode_owner_or_capable(inode)) + if (!inode_owner_permitted_or_capable(inode, MAY_CHMOD)) return -EPERM; /* Also check the setgid bit! */ if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid : @@ -73,7 +128,7 @@ int inode_change_ok(struct inode *inode, struct iattr *attr) /* Check for setting the inode time. */ if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) { - if (!inode_owner_or_capable(inode)) + if (!inode_owner_permitted_or_capable(inode, MAY_SET_TIMES)) return -EPERM; } diff --git a/include/linux/fs.h b/include/linux/fs.h index 0d6ac2c..cb15cb2 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -88,6 +88,9 @@ typedef int (dio_iodone_t)(struct kiocb *iocb, loff_t offset, #define MAY_CREATE_DIR 0x00000200 #define MAY_DELETE_CHILD 0x00000400 #define MAY_DELETE_SELF 0x00000800 +#define MAY_TAKE_OWNERSHIP 0x00001000 +#define MAY_CHMOD 0x00002000 +#define MAY_SET_TIMES 0x00004000 /* * flags in file.f_mode. Note that FMODE_READ and FMODE_WRITE must correspond -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:03:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3E75E7CBA for ; Tue, 16 Aug 2016 06:03:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 104208F8172 for ; Tue, 16 Aug 2016 04:03:46 -0700 (PDT) X-ASG-Debug-ID: 1471345423-0bf57b64ae1aaf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YTgzplh1kyhcKa2g (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:43 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1A2744E337; Tue, 16 Aug 2016 11:03:43 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34FY006464; Tue, 16 Aug 2016 07:03:38 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 06/22] richacl: In-memory representation and helper functions Date: Tue, 16 Aug 2016 13:02:47 +0200 X-ASG-Orig-Subj: [PATCH v25 06/22] richacl: In-memory representation and helper functions Message-Id: <1471345383-15334-7-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 16 Aug 2016 11:03:43 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345423 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12620 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A richacl consists of an NFSv4 acl and an owner, group, and other mask. These three masks correspond to the owner, group, and other file permission bits, but they contain NFSv4 permissions instead of POSIX permissions. Each entry in the NFSv4 acl applies to the file owner (OWNER@), the owning group (GROUP@), everyone (EVERYONE@), or to a specific uid or gid. As in the standard POSIX file permission model, each process is the owner, group, or other file class. A richacl grants a requested access only if the NFSv4 acl in the richacl grants the access (according to the NFSv4 permission check algorithm), and the file mask that applies to the process includes the requested permissions. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Jeff Layton --- fs/Makefile | 1 + fs/richacl.c | 65 ++++++++++++++++ include/linux/richacl.h | 179 +++++++++++++++++++++++++++++++++++++++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/richacl.h | 99 ++++++++++++++++++++++++ 5 files changed, 345 insertions(+) create mode 100644 fs/richacl.c create mode 100644 include/linux/richacl.h create mode 100644 include/uapi/linux/richacl.h diff --git a/fs/Makefile b/fs/Makefile index ed2b632..0004fc5 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -50,6 +50,7 @@ obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o obj-$(CONFIG_FS_IOMAP) += iomap.o +obj-$(CONFIG_FS_RICHACL) += richacl.o obj-y += quota/ diff --git a/fs/richacl.c b/fs/richacl.c new file mode 100644 index 0000000..bcc6591 --- /dev/null +++ b/fs/richacl.c @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_alloc - allocate a richacl + * @count: number of entries + */ +struct richacl * +richacl_alloc(int count, gfp_t gfp) +{ + size_t size = sizeof(struct richacl) + count * sizeof(struct richace); + struct richacl *acl = kzalloc(size, gfp); + + if (acl) { + atomic_set(&acl->a_refcount, 1); + acl->a_count = count; + } + return acl; +} +EXPORT_SYMBOL_GPL(richacl_alloc); + +/** + * richacl_clone - create a copy of a richacl + */ +struct richacl * +richacl_clone(const struct richacl *acl, gfp_t gfp) +{ + int count = acl->a_count; + size_t size = sizeof(struct richacl) + count * sizeof(struct richace); + struct richacl *dup = kmalloc(size, gfp); + + if (dup) { + memcpy(dup, acl, size); + atomic_set(&dup->a_refcount, 1); + } + return dup; +} + +/** + * richace_copy - copy an acl entry + */ +void +richace_copy(struct richace *to, const struct richace *from) +{ + memcpy(to, from, sizeof(struct richace)); +} diff --git a/include/linux/richacl.h b/include/linux/richacl.h new file mode 100644 index 0000000..edb8480 --- /dev/null +++ b/include/linux/richacl.h @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __RICHACL_H +#define __RICHACL_H + +#include + +struct richace { + unsigned short e_type; + unsigned short e_flags; + unsigned int e_mask; + union { + kuid_t uid; + kgid_t gid; + unsigned int special; + } e_id; +}; + +struct richacl { + atomic_t a_refcount; + unsigned int a_owner_mask; + unsigned int a_group_mask; + unsigned int a_other_mask; + unsigned short a_count; + unsigned short a_flags; + struct richace a_entries[0]; +}; + +#define richacl_for_each_entry(_ace, _acl) \ + for (_ace = (_acl)->a_entries; \ + _ace != (_acl)->a_entries + (_acl)->a_count; \ + _ace++) + +#define richacl_for_each_entry_reverse(_ace, _acl) \ + for (_ace = (_acl)->a_entries + (_acl)->a_count - 1; \ + _ace != (_acl)->a_entries - 1; \ + _ace--) + +/** + * richacl_get - grab another reference to a richacl handle + */ +static inline struct richacl * +richacl_get(struct richacl *acl) +{ + if (acl) + atomic_inc(&acl->a_refcount); + return acl; +} + +/** + * richacl_put - free a richacl handle + */ +static inline void +richacl_put(struct richacl *acl) +{ + if (acl && atomic_dec_and_test(&acl->a_refcount)) + kfree(acl); +} + +/** + * richace_is_owner - check if @ace is an OWNER@ entry + */ +static inline bool +richace_is_owner(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_OWNER_SPECIAL_ID; +} + +/** + * richace_is_group - check if @ace is a GROUP@ entry + */ +static inline bool +richace_is_group(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_GROUP_SPECIAL_ID; +} + +/** + * richace_is_everyone - check if @ace is an EVERYONE@ entry + */ +static inline bool +richace_is_everyone(const struct richace *ace) +{ + return (ace->e_flags & RICHACE_SPECIAL_WHO) && + ace->e_id.special == RICHACE_EVERYONE_SPECIAL_ID; +} + +/** + * richace_is_unix_user - check if @ace applies to a specific user + */ +static inline bool +richace_is_unix_user(const struct richace *ace) +{ + return !(ace->e_flags & RICHACE_SPECIAL_WHO) && + !(ace->e_flags & RICHACE_IDENTIFIER_GROUP); +} + +/** + * richace_is_unix_group - check if @ace applies to a specific group + */ +static inline bool +richace_is_unix_group(const struct richace *ace) +{ + return !(ace->e_flags & RICHACE_SPECIAL_WHO) && + (ace->e_flags & RICHACE_IDENTIFIER_GROUP); +} + +/** + * richace_is_inherit_only - check if @ace is for inheritance only + * + * ACEs with the %RICHACE_INHERIT_ONLY_ACE flag set have no effect during + * permission checking. + */ +static inline bool +richace_is_inherit_only(const struct richace *ace) +{ + return ace->e_flags & RICHACE_INHERIT_ONLY_ACE; +} + +/** + * richace_is_inheritable - check if @ace is inheritable + */ +static inline bool +richace_is_inheritable(const struct richace *ace) +{ + return ace->e_flags & (RICHACE_FILE_INHERIT_ACE | + RICHACE_DIRECTORY_INHERIT_ACE); +} + +/** + * richace_is_allow - check if @ace is an %ALLOW type entry + */ +static inline bool +richace_is_allow(const struct richace *ace) +{ + return ace->e_type == RICHACE_ACCESS_ALLOWED_ACE_TYPE; +} + +/** + * richace_is_deny - check if @ace is a %DENY type entry + */ +static inline bool +richace_is_deny(const struct richace *ace) +{ + return ace->e_type == RICHACE_ACCESS_DENIED_ACE_TYPE; +} + +/** + * richace_is_same_identifier - are both identifiers the same? + */ +static inline bool +richace_is_same_identifier(const struct richace *a, const struct richace *b) +{ + return !((a->e_flags ^ b->e_flags) & + (RICHACE_SPECIAL_WHO | RICHACE_IDENTIFIER_GROUP)) && + !memcmp(&a->e_id, &b->e_id, sizeof(a->e_id)); +} + +extern struct richacl *richacl_alloc(int, gfp_t); +extern struct richacl *richacl_clone(const struct richacl *, gfp_t); +extern void richace_copy(struct richace *, const struct richace *); + +#endif /* __RICHACL_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index 185f8ea..c983a6c 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -356,6 +356,7 @@ header-y += reboot.h header-y += reiserfs_fs.h header-y += reiserfs_xattr.h header-y += resource.h +header-y += richacl.h header-y += rfkill.h header-y += rio_cm_cdev.h header-y += rio_mport_cdev.h diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h new file mode 100644 index 0000000..08856f8 --- /dev/null +++ b/include/uapi/linux/richacl.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + +#ifndef __UAPI_RICHACL_H +#define __UAPI_RICHACL_H + +/* a_flags values */ +#define RICHACL_WRITE_THROUGH 0x40 +#define RICHACL_MASKED 0x80 + +/* e_type values */ +#define RICHACE_ACCESS_ALLOWED_ACE_TYPE 0x0000 +#define RICHACE_ACCESS_DENIED_ACE_TYPE 0x0001 + +/* e_flags bitflags */ +#define RICHACE_FILE_INHERIT_ACE 0x0001 +#define RICHACE_DIRECTORY_INHERIT_ACE 0x0002 +#define RICHACE_NO_PROPAGATE_INHERIT_ACE 0x0004 +#define RICHACE_INHERIT_ONLY_ACE 0x0008 +#define RICHACE_IDENTIFIER_GROUP 0x0040 +#define RICHACE_SPECIAL_WHO 0x4000 + +/* e_mask bitflags */ +#define RICHACE_READ_DATA 0x00000001 +#define RICHACE_LIST_DIRECTORY 0x00000001 +#define RICHACE_WRITE_DATA 0x00000002 +#define RICHACE_ADD_FILE 0x00000002 +#define RICHACE_APPEND_DATA 0x00000004 +#define RICHACE_ADD_SUBDIRECTORY 0x00000004 +#define RICHACE_READ_NAMED_ATTRS 0x00000008 +#define RICHACE_WRITE_NAMED_ATTRS 0x00000010 +#define RICHACE_EXECUTE 0x00000020 +#define RICHACE_DELETE_CHILD 0x00000040 +#define RICHACE_READ_ATTRIBUTES 0x00000080 +#define RICHACE_WRITE_ATTRIBUTES 0x00000100 +#define RICHACE_WRITE_RETENTION 0x00000200 +#define RICHACE_WRITE_RETENTION_HOLD 0x00000400 +#define RICHACE_DELETE 0x00010000 +#define RICHACE_READ_ACL 0x00020000 +#define RICHACE_WRITE_ACL 0x00040000 +#define RICHACE_WRITE_OWNER 0x00080000 +#define RICHACE_SYNCHRONIZE 0x00100000 + +/* e_id values */ +#define RICHACE_OWNER_SPECIAL_ID 0 +#define RICHACE_GROUP_SPECIAL_ID 1 +#define RICHACE_EVERYONE_SPECIAL_ID 2 + +#define RICHACL_VALID_FLAGS ( \ + RICHACL_WRITE_THROUGH | \ + RICHACL_MASKED ) + +#define RICHACE_VALID_FLAGS ( \ + RICHACE_FILE_INHERIT_ACE | \ + RICHACE_DIRECTORY_INHERIT_ACE | \ + RICHACE_NO_PROPAGATE_INHERIT_ACE | \ + RICHACE_INHERIT_ONLY_ACE | \ + RICHACE_IDENTIFIER_GROUP | \ + RICHACE_SPECIAL_WHO ) + +#define RICHACE_INHERITANCE_FLAGS ( \ + RICHACE_FILE_INHERIT_ACE | \ + RICHACE_DIRECTORY_INHERIT_ACE | \ + RICHACE_NO_PROPAGATE_INHERIT_ACE | \ + RICHACE_INHERIT_ONLY_ACE ) + +/* Valid RICHACE_* flags for directories and non-directories */ +#define RICHACE_VALID_MASK ( \ + RICHACE_READ_DATA | RICHACE_LIST_DIRECTORY | \ + RICHACE_WRITE_DATA | RICHACE_ADD_FILE | \ + RICHACE_APPEND_DATA | RICHACE_ADD_SUBDIRECTORY | \ + RICHACE_READ_NAMED_ATTRS | \ + RICHACE_WRITE_NAMED_ATTRS | \ + RICHACE_EXECUTE | \ + RICHACE_DELETE_CHILD | \ + RICHACE_READ_ATTRIBUTES | \ + RICHACE_WRITE_ATTRIBUTES | \ + RICHACE_WRITE_RETENTION | \ + RICHACE_WRITE_RETENTION_HOLD | \ + RICHACE_DELETE | \ + RICHACE_READ_ACL | \ + RICHACE_WRITE_ACL | \ + RICHACE_WRITE_OWNER | \ + RICHACE_SYNCHRONIZE ) + +#endif /* __UAPI_RICHACL_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:03:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 968CD7CCD for ; Tue, 16 Aug 2016 06:03:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 69AF7304179 for ; Tue, 16 Aug 2016 04:03:50 -0700 (PDT) X-ASG-Debug-ID: 1471345428-0bf57c0d001df00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pRU286OUHr2A6jrG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:49 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 41FE546203; Tue, 16 Aug 2016 11:03:48 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34FZ006464; Tue, 16 Aug 2016 07:03:43 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 07/22] richacl: Permission mapping functions Date: Tue, 16 Aug 2016 13:02:48 +0200 X-ASG-Orig-Subj: [PATCH v25 07/22] richacl: Permission mapping functions Message-Id: <1471345383-15334-8-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 16 Aug 2016 11:03:48 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345428 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6631 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 We need to map from POSIX permissions to NFSv4 permissions when a chmod() is done, from NFSv4 permissions to POSIX permissions when an acl is set (which implicitly sets the file permission bits), and from the MAY_READ/MAY_WRITE/MAY_EXEC/MAY_APPEND flags to NFSv4 permissions when doing an access check in a richacl. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Jeff Layton --- fs/richacl.c | 112 +++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 2 + include/uapi/linux/richacl.h | 44 +++++++++++++++++ 3 files changed, 158 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index bcc6591..2072cf4 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -63,3 +63,115 @@ richace_copy(struct richace *to, const struct richace *from) { memcpy(to, from, sizeof(struct richace)); } + +/* + * richacl_mask_to_mode - compute the file permission bits from mask + * @mask: %RICHACE_* permission mask + * + * Compute the file permission bits corresponding to a particular set of + * richacl permissions. + * + * See richacl_masks_to_mode(). + */ +static int +richacl_mask_to_mode(unsigned int mask) +{ + int mode = 0; + + if (mask & RICHACE_POSIX_MODE_READ) + mode |= S_IROTH; + if (mask & RICHACE_POSIX_MODE_WRITE) + mode |= S_IWOTH; + if (mask & RICHACE_POSIX_MODE_EXEC) + mode |= S_IXOTH; + + return mode; +} + +/** + * richacl_masks_to_mode - compute file permission bits from file masks + * + * When setting a richacl, we set the file permission bits to indicate maximum + * permissions: for example, we set the Write permission when a mask contains + * RICHACE_APPEND_DATA even if it does not also contain RICHACE_WRITE_DATA. + * + * Permissions which are not in RICHACE_POSIX_MODE_READ, + * RICHACE_POSIX_MODE_WRITE, or RICHACE_POSIX_MODE_EXEC cannot be represented + * in the file permission bits. Such permissions can still be effective, but + * not for new files or after a chmod(); they must be explicitly enabled in the + * richacl. + */ +int +richacl_masks_to_mode(const struct richacl *acl) +{ + return richacl_mask_to_mode(acl->a_owner_mask) << 6 | + richacl_mask_to_mode(acl->a_group_mask) << 3 | + richacl_mask_to_mode(acl->a_other_mask); +} +EXPORT_SYMBOL_GPL(richacl_masks_to_mode); + +/** + * richacl_mode_to_mask - compute a file mask from the lowest three mode bits + * @mode: mode to convert to richacl permissions + * + * When the file permission bits of a file are set with chmod(), this specifies + * the maximum permissions that processes will get. All permissions beyond + * that will be removed from the file masks, and become ineffective. + */ +unsigned int +richacl_mode_to_mask(umode_t mode) +{ + unsigned int mask = 0; + + if (mode & S_IROTH) + mask |= RICHACE_POSIX_MODE_READ; + if (mode & S_IWOTH) + mask |= RICHACE_POSIX_MODE_WRITE; + if (mode & S_IXOTH) + mask |= RICHACE_POSIX_MODE_EXEC; + + return mask; +} + +/** + * richacl_want_to_mask - convert the iop->permission want argument to a mask + * @want: @want argument of the permission inode operation + * + * When checking for append, create file, create dir, or delete child access, + * MAY_WRITE is also set in @want. + */ +static unsigned int +richacl_want_to_mask(unsigned int want) +{ + unsigned int mask = 0; + + if (want & MAY_READ) + mask |= RICHACE_READ_DATA; + if (want & MAY_DELETE_SELF) + mask |= RICHACE_DELETE; + if (want & MAY_TAKE_OWNERSHIP) + mask |= RICHACE_WRITE_OWNER; + if (want & MAY_CHMOD) + mask |= RICHACE_WRITE_ACL; + if (want & MAY_SET_TIMES) + mask |= RICHACE_WRITE_ATTRIBUTES; + if (want & MAY_EXEC) + mask |= RICHACE_EXECUTE; + /* + * differentiate MAY_WRITE from these request + */ + if (want & (MAY_APPEND | + MAY_CREATE_FILE | MAY_CREATE_DIR | + MAY_DELETE_CHILD)) { + if (want & MAY_APPEND) + mask |= RICHACE_APPEND_DATA; + if (want & MAY_CREATE_FILE) + mask |= RICHACE_ADD_FILE; + if (want & MAY_CREATE_DIR) + mask |= RICHACE_ADD_SUBDIRECTORY; + if (want & MAY_DELETE_CHILD) + mask |= RICHACE_DELETE_CHILD; + } else if (want & MAY_WRITE) + mask |= RICHACE_WRITE_DATA; + return mask; +} diff --git a/include/linux/richacl.h b/include/linux/richacl.h index edb8480..70923f8 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -175,5 +175,7 @@ richace_is_same_identifier(const struct richace *a, const struct richace *b) extern struct richacl *richacl_alloc(int, gfp_t); extern struct richacl *richacl_clone(const struct richacl *, gfp_t); extern void richace_copy(struct richace *, const struct richace *); +extern int richacl_masks_to_mode(const struct richacl *); +extern unsigned int richacl_mode_to_mask(umode_t); #endif /* __RICHACL_H */ diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h index 08856f8..1ed48ac 100644 --- a/include/uapi/linux/richacl.h +++ b/include/uapi/linux/richacl.h @@ -96,4 +96,48 @@ RICHACE_WRITE_OWNER | \ RICHACE_SYNCHRONIZE ) +/* + * The POSIX permissions are supersets of the following richacl permissions: + * + * - MAY_READ maps to READ_DATA or LIST_DIRECTORY, depending on the type + * of the file system object. + * + * - MAY_WRITE maps to WRITE_DATA or RICHACE_APPEND_DATA for files, and to + * ADD_FILE, RICHACE_ADD_SUBDIRECTORY, or RICHACE_DELETE_CHILD for directories. + * + * - MAY_EXECUTE maps to RICHACE_EXECUTE. + * + * (Some of these richacl permissions have the same bit values.) + */ +#define RICHACE_POSIX_MODE_READ ( \ + RICHACE_READ_DATA | \ + RICHACE_LIST_DIRECTORY) +#define RICHACE_POSIX_MODE_WRITE ( \ + RICHACE_WRITE_DATA | \ + RICHACE_ADD_FILE | \ + RICHACE_APPEND_DATA | \ + RICHACE_ADD_SUBDIRECTORY | \ + RICHACE_DELETE_CHILD) +#define RICHACE_POSIX_MODE_EXEC RICHACE_EXECUTE +#define RICHACE_POSIX_MODE_ALL ( \ + RICHACE_POSIX_MODE_READ | \ + RICHACE_POSIX_MODE_WRITE | \ + RICHACE_POSIX_MODE_EXEC) + +/* + * These permissions are always allowed no matter what the acl says. + */ +#define RICHACE_POSIX_ALWAYS_ALLOWED ( \ + RICHACE_SYNCHRONIZE | \ + RICHACE_READ_ATTRIBUTES | \ + RICHACE_READ_ACL) + +/* + * The owner is implicitly granted these permissions under POSIX. + */ +#define RICHACE_POSIX_OWNER_ALLOWED ( \ + RICHACE_WRITE_ATTRIBUTES | \ + RICHACE_WRITE_OWNER | \ + RICHACE_WRITE_ACL) + #endif /* __UAPI_RICHACL_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:03:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 26DF27CD4 for ; Tue, 16 Aug 2016 06:03:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84ED2AC066 for ; Tue, 16 Aug 2016 04:03:58 -0700 (PDT) X-ASG-Debug-ID: 1471345433-0bf57b64ac1ab50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WaOwQqDz9iZLRClJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:54 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6A2009B0F6; Tue, 16 Aug 2016 11:03:53 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fa006464; Tue, 16 Aug 2016 07:03:48 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 08/22] richacl: Permission check algorithm Date: Tue, 16 Aug 2016 13:02:49 +0200 X-ASG-Orig-Subj: [PATCH v25 08/22] richacl: Permission check algorithm Message-Id: <1471345383-15334-9-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Tue, 16 Aug 2016 11:03:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345434 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5317 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 A richacl roughly grants a requested access if the NFSv4 acl in the richacl grants the requested permissions according to the NFSv4 permission check algorithm and the file mask that applies to the process includes the requested permissions. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Jeff Layton --- fs/richacl.c | 128 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 129 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 2072cf4..b7e96d0 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -175,3 +175,131 @@ richacl_want_to_mask(unsigned int want) mask |= RICHACE_WRITE_DATA; return mask; } + +/** + * richacl_permission - richacl permission check algorithm + * @inode: inode to check + * @acl: rich acl of the inode + * @want: requested access (MAY_* flags) + * + * Checks if the current process is granted @want flags in @acl. + */ +int +richacl_permission(struct inode *inode, const struct richacl *acl, + int want) +{ + const struct richace *ace; + unsigned int mask = richacl_want_to_mask(want); + unsigned int requested = mask, denied = 0; + int in_owning_group = in_group_p(inode->i_gid); + int in_owner_or_group_class = in_owning_group; + + /* + * A process is + * - in the owner file class if it owns the file, + * - in the group file class if it is in the file's owning group or + * it matches any of the user or group entries, and + * - in the other file class otherwise. + * The file class is only relevant for determining which file mask to + * apply, which only happens for masked acls. + */ + if (acl->a_flags & RICHACL_MASKED) { + if ((acl->a_flags & RICHACL_WRITE_THROUGH) && + uid_eq(current_fsuid(), inode->i_uid)) { + denied = requested & ~acl->a_owner_mask; + goto out; + } + } else { + /* + * When the acl is not masked, there is no need to determine if + * the process is in the group class and we can break out + * earlier of the loop below. + */ + in_owner_or_group_class = 1; + } + + /* + * Check if the acl grants the requested access and determine which + * file class the process is in. + */ + richacl_for_each_entry(ace, acl) { + unsigned int ace_mask = ace->e_mask; + + if (richace_is_inherit_only(ace)) + continue; + if (richace_is_owner(ace)) { + if (!uid_eq(current_fsuid(), inode->i_uid)) + continue; + goto entry_matches_owner; + } else if (richace_is_group(ace)) { + if (!in_owning_group) + continue; + } else if (richace_is_unix_user(ace)) { + if (!uid_eq(current_fsuid(), ace->e_id.uid)) + continue; + if (uid_eq(current_fsuid(), inode->i_uid)) + goto entry_matches_owner; + } else if (richace_is_unix_group(ace)) { + if (!in_group_p(ace->e_id.gid)) + continue; + } else + goto entry_matches_everyone; + + /* + * Apply the group file mask to entries other than owner@ and + * everyone@ or user entries matching the owner. This ensures + * that we grant the same permissions as the acl computed by + * richacl_apply_masks(). + * + * Without this restriction, the following richacl would grant + * rw access to processes which are both the owner and in the + * owning group, but not to other users in the owning group, + * which could not be represented without masks: + * + * owner:rw::mask + * group@:rw::allow + */ + if ((acl->a_flags & RICHACL_MASKED) && richace_is_allow(ace)) + ace_mask &= acl->a_group_mask; + +entry_matches_owner: + /* The process is in the owner or group file class. */ + in_owner_or_group_class = 1; + +entry_matches_everyone: + /* Check which mask flags the ACE allows or denies. */ + if (richace_is_deny(ace)) + denied |= ace_mask & mask; + mask &= ~ace_mask; + + /* + * Keep going until we know which file class + * the process is in. + */ + if (!mask && in_owner_or_group_class) + break; + } + denied |= mask; + + if (acl->a_flags & RICHACL_MASKED) { + /* + * The file class a process is in determines which file mask + * applies. Check if that file mask also grants the requested + * access. + */ + if (uid_eq(current_fsuid(), inode->i_uid)) + denied |= requested & ~acl->a_owner_mask; + else if (in_owner_or_group_class) + denied |= requested & ~acl->a_group_mask; + else { + if (acl->a_flags & RICHACL_WRITE_THROUGH) + denied = requested & ~acl->a_other_mask; + else + denied |= requested & ~acl->a_other_mask; + } + } + +out: + return denied ? -EACCES : 0; +} +EXPORT_SYMBOL_GPL(richacl_permission); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 70923f8..beeec35 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -177,5 +177,6 @@ extern struct richacl *richacl_clone(const struct richacl *, gfp_t); extern void richace_copy(struct richace *, const struct richace *); extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); +extern int richacl_permission(struct inode *, const struct richacl *, int); #endif /* __RICHACL_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A68507CCF for ; Tue, 16 Aug 2016 06:04:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25063AC068 for ; Tue, 16 Aug 2016 04:04:00 -0700 (PDT) X-ASG-Debug-ID: 1471345438-0bf81563e51b6a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nW9ED5pixGJqHpI2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:03:59 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8AC263DE43; Tue, 16 Aug 2016 11:03:58 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fb006464; Tue, 16 Aug 2016 07:03:53 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 09/22] richacl: Compute maximum file masks from an acl Date: Tue, 16 Aug 2016 13:02:50 +0200 X-ASG-Orig-Subj: [PATCH v25 09/22] richacl: Compute maximum file masks from an acl Message-Id: <1471345383-15334-10-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 16 Aug 2016 11:03:58 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345439 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6858 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Compute upper bound owner, group, and other file masks with as few permissions as possible without denying any permissions that the NFSv4 acl in a richacl grants. This algorithm is used when a file inherits an acl at create time and when an acl is set via a mechanism that does not provide file masks (such as setting an acl via nfsd). When user-space sets an acl via setxattr, the extended attribute already includes the file masks. Setting an acl also sets the file mode permission bits: they are determined by the file masks; see richacl_masks_to_mode(). Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Jeff Layton --- fs/richacl.c | 157 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 158 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index b7e96d0..0443090 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -303,3 +303,160 @@ out: return denied ? -EACCES : 0; } EXPORT_SYMBOL_GPL(richacl_permission); + +/* + * Note: functions like richacl_allowed_to_who(), richacl_group_class_allowed(), + * and richacl_compute_max_masks() iterate through the entire acl in reverse + * order as an optimization. + * + * In the standard algorithm, aces are considered in forward order. When a + * process matches an ace, the permissions in the ace are either allowed or + * denied depending on the ace type. Once a permission has been allowed or + * denied, it is no longer considered in further aces. + * + * By iterating through the acl in reverse order, we can compute the same + * result without having to keep track of which permissions have been allowed + * and denied already. + */ + +/** + * richacl_allowed_to_who - permissions allowed to a specific who value + * + * Compute the maximum mask values allowed to a specific who value, taking + * everyone@ aces into account. + */ +static unsigned int richacl_allowed_to_who(struct richacl *acl, + struct richace *who) +{ + struct richace *ace; + unsigned int allowed = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace)) + continue; + if (richace_is_same_identifier(ace, who) || + richace_is_everyone(ace)) { + if (richace_is_allow(ace)) + allowed |= ace->e_mask; + else if (richace_is_deny(ace)) + allowed &= ~ace->e_mask; + } + } + return allowed; +} + +/** + * richacl_group_class_allowed - maximum permissions of the group class + * + * Compute the maximum mask values allowed to a process in the group class + * (i.e., a process which is not the owner but is in the owning group or + * matches a user or group acl entry). This includes permissions granted or + * denied by everyone@ aces. + * + * See richacl_compute_max_masks(). + */ +static unsigned int richacl_group_class_allowed(struct richacl *acl) +{ + struct richace *ace; + unsigned int everyone_allowed = 0, group_class_allowed = 0; + int had_group_ace = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace) || + richace_is_owner(ace)) + continue; + + if (richace_is_everyone(ace)) { + if (richace_is_allow(ace)) + everyone_allowed |= ace->e_mask; + else if (richace_is_deny(ace)) + everyone_allowed &= ~ace->e_mask; + } else { + group_class_allowed |= + richacl_allowed_to_who(acl, ace); + + if (richace_is_group(ace)) + had_group_ace = 1; + } + } + /* + * If the acl doesn't contain any group@ aces, richacl_allowed_to_who() + * wasn't called for the owning group. We could make that call now, but + * we already know the result (everyone_allowed). + */ + if (!had_group_ace) + group_class_allowed |= everyone_allowed; + return group_class_allowed; +} + +/** + * richacl_compute_max_masks - compute upper bound masks + * + * Computes upper bound owner, group, and other masks so that none of the + * permissions allowed by the acl are disabled. + * + * We don't make assumptions about who the owner is so that the owner can + * change with no effect on the file masks or file mode permission bits; this + * means that we must assume that all entries can match the owner. + */ +void richacl_compute_max_masks(struct richacl *acl) +{ + unsigned int gmask = ~0; + struct richace *ace; + + /* + * @gmask contains all permissions which the group class is ever + * allowed. We use it to avoid adding permissions to the group mask + * from everyone@ allow aces which the group class is always denied + * through other aces. For example, the following acl would otherwise + * result in a group mask of rw: + * + * group@:w::deny + * everyone@:rw::allow + * + * Avoid computing @gmask for acls which do not include any group class + * deny aces: in such acls, the group class is never denied any + * permissions from everyone@ allow aces, and the group class cannot + * have fewer permissions than the other class. + */ + +restart: + acl->a_owner_mask = 0; + acl->a_group_mask = 0; + acl->a_other_mask = 0; + + richacl_for_each_entry_reverse(ace, acl) { + if (richace_is_inherit_only(ace)) + continue; + + if (richace_is_owner(ace)) { + if (richace_is_allow(ace)) + acl->a_owner_mask |= ace->e_mask; + else if (richace_is_deny(ace)) + acl->a_owner_mask &= ~ace->e_mask; + } else if (richace_is_everyone(ace)) { + if (richace_is_allow(ace)) { + acl->a_owner_mask |= ace->e_mask; + acl->a_group_mask |= ace->e_mask & gmask; + acl->a_other_mask |= ace->e_mask; + } else if (richace_is_deny(ace)) { + acl->a_owner_mask &= ~ace->e_mask; + acl->a_group_mask &= ~ace->e_mask; + acl->a_other_mask &= ~ace->e_mask; + } + } else { + if (richace_is_allow(ace)) { + acl->a_owner_mask |= ace->e_mask & gmask; + acl->a_group_mask |= ace->e_mask & gmask; + } else if (richace_is_deny(ace) && gmask == ~0) { + gmask = richacl_group_class_allowed(acl); + if (likely(gmask != ~0)) + /* should always be true */ + goto restart; + } + } + } + + acl->a_flags &= ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED); +} +EXPORT_SYMBOL_GPL(richacl_compute_max_masks); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index beeec35..700888b 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -178,5 +178,6 @@ extern void richace_copy(struct richace *, const struct richace *); extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); extern int richacl_permission(struct inode *, const struct richacl *, int); +extern void richacl_compute_max_masks(struct richacl *); #endif /* __RICHACL_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E2E457CD0 for ; Tue, 16 Aug 2016 06:04:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 620BCAC068 for ; Tue, 16 Aug 2016 04:04:06 -0700 (PDT) X-ASG-Debug-ID: 1471345444-0bf81563e41b6b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YKaJueXgms6hRBI0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:04 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2EC7D635C4; Tue, 16 Aug 2016 11:04:04 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fc006464; Tue, 16 Aug 2016 07:03:58 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Dilger Subject: [PATCH v25 10/22] vfs: Cache base_acl objects in inodes Date: Tue, 16 Aug 2016 13:02:51 +0200 X-ASG-Orig-Subj: [PATCH v25 10/22] vfs: Cache base_acl objects in inodes Message-Id: <1471345383-15334-11-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 16 Aug 2016 11:04:04 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345444 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 17796 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 POSIX ACLs and richacls are both objects allocated by kmalloc() with a reference count which are freed by kfree_rcu(). An inode can either cache an access and a default POSIX ACL, or a richacl (richacls do not have default acls). To allow an inode to cache either of the two kinds of acls, introduce a new base_acl type and convert i_acl and i_default_acl to that type. In most cases, the vfs then doesn't care which kind of acl an inode caches (if any). Signed-off-by: Andreas Gruenbacher Cc: Andreas Dilger --- drivers/staging/lustre/lustre/llite/llite_lib.c | 2 +- fs/9p/acl.c | 8 +-- fs/f2fs/acl.c | 4 +- fs/inode.c | 32 +++++++++++- fs/jffs2/acl.c | 6 ++- fs/namei.c | 33 ++++++------ fs/nfs/nfs3acl.c | 14 ++--- fs/posix_acl.c | 69 +++++++------------------ fs/richacl.c | 4 +- include/linux/fs.h | 39 ++++++++++++-- include/linux/posix_acl.h | 19 ++++--- include/linux/richacl.h | 9 ++-- 12 files changed, 137 insertions(+), 102 deletions(-) diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index 546063e..a29bfb4 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c @@ -1031,7 +1031,7 @@ void ll_clear_inode(struct inode *inode) #ifdef CONFIG_FS_POSIX_ACL if (lli->lli_posix_acl) { - LASSERT(atomic_read(&lli->lli_posix_acl->a_refcount) == 1); + LASSERT(base_acl_refcount(&lli->lli_posix_acl->a_base) == 1); posix_acl_release(lli->lli_posix_acl); lli->lli_posix_acl = NULL; } diff --git a/fs/9p/acl.c b/fs/9p/acl.c index 5b6a174..2de24a8 100644 --- a/fs/9p/acl.c +++ b/fs/9p/acl.c @@ -87,14 +87,14 @@ int v9fs_get_acl(struct inode *inode, struct p9_fid *fid) static struct posix_acl *v9fs_get_cached_acl(struct inode *inode, int type) { - struct posix_acl *acl; + struct base_acl *base_acl; /* * 9p Always cache the acl value when * instantiating the inode (v9fs_inode_from_fid) */ - acl = get_cached_acl(inode, type); - BUG_ON(is_uncached_acl(acl)); - return acl; + base_acl = get_cached_acl(inode, type); + BUG_ON(is_uncached_acl(base_acl)); + return posix_acl(base_acl); } struct posix_acl *v9fs_iop_get_acl(struct inode *inode, int type) diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c index 4dcc9e2..525a927 100644 --- a/fs/f2fs/acl.c +++ b/fs/f2fs/acl.c @@ -266,7 +266,7 @@ static struct posix_acl *f2fs_acl_clone(const struct posix_acl *acl, sizeof(struct posix_acl_entry); clone = kmemdup(acl, size, flags); if (clone) - atomic_set(&clone->a_refcount, 1); + base_acl_init(&clone->a_base); } return clone; } @@ -278,7 +278,7 @@ static int f2fs_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) umode_t mode = *mode_p; int not_equiv = 0; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { diff --git a/fs/inode.c b/fs/inode.c index 7e3ef3a..cc081dd 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -240,14 +240,42 @@ void __destroy_inode(struct inode *inode) #ifdef CONFIG_FS_POSIX_ACL if (inode->i_acl && !is_uncached_acl(inode->i_acl)) - posix_acl_release(inode->i_acl); + base_acl_put(inode->i_acl); if (inode->i_default_acl && !is_uncached_acl(inode->i_default_acl)) - posix_acl_release(inode->i_default_acl); + base_acl_put(inode->i_default_acl); #endif this_cpu_dec(nr_inodes); } EXPORT_SYMBOL(__destroy_inode); +#ifdef CONFIG_FS_POSIX_ACL +struct base_acl *__get_cached_acl(struct base_acl **p) +{ + struct base_acl *base_acl; + + for (;;) { + rcu_read_lock(); + base_acl = rcu_dereference(*p); + if (!base_acl || is_uncached_acl(base_acl) || + atomic_inc_not_zero(&base_acl->ba_refcount)) + break; + rcu_read_unlock(); + cpu_relax(); + } + rcu_read_unlock(); + return base_acl; +} + +void __forget_cached_acl(struct base_acl **p) +{ + struct base_acl *old; + + old = xchg(p, ACL_NOT_CACHED); + if (!is_uncached_acl(old)) + base_acl_put(old); +} +#endif + static void i_callback(struct rcu_head *head) { struct inode *inode = container_of(head, struct inode, i_rcu); diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index bc2693d..6c11909 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c @@ -292,13 +292,15 @@ int jffs2_init_acl_post(struct inode *inode) int rc; if (inode->i_default_acl) { - rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, inode->i_default_acl); + rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_DEFAULT, + posix_acl(inode->i_default_acl)); if (rc) return rc; } if (inode->i_acl) { - rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, inode->i_acl); + rc = __jffs2_set_acl(inode, JFFS2_XPREFIX_ACL_ACCESS, + posix_acl(inode->i_acl)); if (rc) return rc; } diff --git a/fs/namei.c b/fs/namei.c index 4292c33..ae205ea 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -260,25 +260,28 @@ void putname(struct filename *name) static int check_acl(struct inode *inode, int mask) { #ifdef CONFIG_FS_POSIX_ACL - struct posix_acl *acl; - if (mask & MAY_NOT_BLOCK) { - acl = get_cached_acl_rcu(inode, ACL_TYPE_ACCESS); - if (!acl) + struct base_acl *base_acl; + + base_acl = rcu_dereference(inode->i_acl); + if (!base_acl) return -EAGAIN; /* no ->get_acl() calls in RCU mode... */ - if (is_uncached_acl(acl)) + if (is_uncached_acl(base_acl)) return -ECHILD; - return posix_acl_permission(inode, acl, mask & ~MAY_NOT_BLOCK); - } - - acl = get_acl(inode, ACL_TYPE_ACCESS); - if (IS_ERR(acl)) - return PTR_ERR(acl); - if (acl) { - int error = posix_acl_permission(inode, acl, mask); - posix_acl_release(acl); - return error; + return posix_acl_permission(inode, posix_acl(base_acl), + mask & ~MAY_NOT_BLOCK); + } else { + struct posix_acl *acl; + + acl = get_acl(inode, ACL_TYPE_ACCESS); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + int error = posix_acl_permission(inode, acl, mask); + posix_acl_release(acl); + return error; + } } #endif diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c index 720d92f5..2b70944 100644 --- a/fs/nfs/nfs3acl.c +++ b/fs/nfs/nfs3acl.c @@ -16,28 +16,28 @@ * caching get_acl results in a race-free way. See fs/posix_acl.c:get_acl() * for explanations. */ -static void nfs3_prepare_get_acl(struct posix_acl **p) +static void nfs3_prepare_get_acl(struct base_acl **p) { - struct posix_acl *sentinel = uncached_acl_sentinel(current); + struct base_acl *sentinel = uncached_acl_sentinel(current); if (cmpxchg(p, ACL_NOT_CACHED, sentinel) != ACL_NOT_CACHED) { /* Not the first reader or sentinel already in place. */ } } -static void nfs3_complete_get_acl(struct posix_acl **p, struct posix_acl *acl) +static void nfs3_complete_get_acl(struct base_acl **p, struct posix_acl *acl) { - struct posix_acl *sentinel = uncached_acl_sentinel(current); + struct base_acl *sentinel = uncached_acl_sentinel(current); /* Only cache the ACL if our sentinel is still in place. */ posix_acl_dup(acl); - if (cmpxchg(p, sentinel, acl) != sentinel) + if (cmpxchg(p, sentinel, &acl->a_base) != sentinel) posix_acl_release(acl); } -static void nfs3_abort_get_acl(struct posix_acl **p) +static void nfs3_abort_get_acl(struct base_acl **p) { - struct posix_acl *sentinel = uncached_acl_sentinel(current); + struct base_acl *sentinel = uncached_acl_sentinel(current); /* Remove our sentinel upon failure. */ cmpxchg(p, sentinel, ACL_NOT_CACHED); diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 59d47ab0..f7e1a29 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -21,7 +21,7 @@ #include #include -static struct posix_acl **acl_by_type(struct inode *inode, int type) +static inline struct base_acl **acl_by_type(struct inode *inode, int type) { switch (type) { case ACL_TYPE_ACCESS: @@ -33,51 +33,23 @@ static struct posix_acl **acl_by_type(struct inode *inode, int type) } } -struct posix_acl *get_cached_acl(struct inode *inode, int type) +struct base_acl *get_cached_acl(struct inode *inode, int type) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *acl; - - for (;;) { - rcu_read_lock(); - acl = rcu_dereference(*p); - if (!acl || is_uncached_acl(acl) || - atomic_inc_not_zero(&acl->a_refcount)) - break; - rcu_read_unlock(); - cpu_relax(); - } - rcu_read_unlock(); - return acl; + return __get_cached_acl(acl_by_type(inode, type)); } EXPORT_SYMBOL(get_cached_acl); -struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type) -{ - return rcu_dereference(*acl_by_type(inode, type)); -} -EXPORT_SYMBOL(get_cached_acl_rcu); - void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl) { - struct posix_acl **p = acl_by_type(inode, type); - struct posix_acl *old; + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *old; - old = xchg(p, posix_acl_dup(acl)); + old = xchg(p, &posix_acl_dup(acl)->a_base); if (!is_uncached_acl(old)) - posix_acl_release(old); + base_acl_put(old); } EXPORT_SYMBOL(set_cached_acl); -static void __forget_cached_acl(struct posix_acl **p) -{ - struct posix_acl *old; - - old = xchg(p, ACL_NOT_CACHED); - if (!is_uncached_acl(old)) - posix_acl_release(old); -} - void forget_cached_acl(struct inode *inode, int type) { __forget_cached_acl(acl_by_type(inode, type)); @@ -93,25 +65,24 @@ EXPORT_SYMBOL(forget_all_cached_acls); struct posix_acl *get_acl(struct inode *inode, int type) { - void *sentinel; - struct posix_acl **p; + struct base_acl **p = acl_by_type(inode, type); + struct base_acl *sentinel, *base_acl; struct posix_acl *acl; + if (!IS_POSIXACL(inode)) + return NULL; + /* * The sentinel is used to detect when another operation like * set_cached_acl() or forget_cached_acl() races with get_acl(). * It is guaranteed that is_uncached_acl(sentinel) is true. */ - acl = get_cached_acl(inode, type); - if (!is_uncached_acl(acl)) - return acl; - - if (!IS_POSIXACL(inode)) - return NULL; + base_acl = __get_cached_acl(p); + if (!is_uncached_acl(base_acl)) + return posix_acl(base_acl); sentinel = uncached_acl_sentinel(current); - p = acl_by_type(inode, type); /* * If the ACL isn't being read yet, set our sentinel. Otherwise, the @@ -151,7 +122,7 @@ struct posix_acl *get_acl(struct inode *inode, int type) * Cache the result, but only if our sentinel is still in place. */ posix_acl_dup(acl); - if (unlikely(cmpxchg(p, sentinel, acl) != sentinel)) + if (unlikely(cmpxchg(p, sentinel, &acl->a_base) != sentinel)) posix_acl_release(acl); return acl; } @@ -163,7 +134,7 @@ EXPORT_SYMBOL(get_acl); void posix_acl_init(struct posix_acl *acl, int count) { - atomic_set(&acl->a_refcount, 1); + base_acl_init(&acl->a_base); acl->a_count = count; } EXPORT_SYMBOL(posix_acl_init); @@ -196,7 +167,7 @@ posix_acl_clone(const struct posix_acl *acl, gfp_t flags) sizeof(struct posix_acl_entry); clone = kmemdup(acl, size, flags); if (clone) - atomic_set(&clone->a_refcount, 1); + base_acl_init(&clone->a_base); } return clone; } @@ -418,7 +389,7 @@ static int posix_acl_create_masq(struct posix_acl *acl, umode_t *mode_p) umode_t mode = *mode_p; int not_equiv = 0; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { @@ -473,7 +444,7 @@ static int __posix_acl_chmod_masq(struct posix_acl *acl, umode_t mode) struct posix_acl_entry *group_obj = NULL, *mask_obj = NULL; struct posix_acl_entry *pa, *pe; - /* assert(atomic_read(acl->a_refcount) == 1); */ + /* assert(base_acl_refcount(&acl->a_base) == 1); */ FOREACH_ACL_ENTRY(pa, acl, pe) { switch(pa->e_tag) { diff --git a/fs/richacl.c b/fs/richacl.c index 0443090..57a4048 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -31,7 +31,7 @@ richacl_alloc(int count, gfp_t gfp) struct richacl *acl = kzalloc(size, gfp); if (acl) { - atomic_set(&acl->a_refcount, 1); + base_acl_init(&acl->a_base); acl->a_count = count; } return acl; @@ -50,7 +50,7 @@ richacl_clone(const struct richacl *acl, gfp_t gfp) if (dup) { memcpy(dup, acl, size); - atomic_set(&dup->a_refcount, 1); + base_acl_init(&dup->a_base); } return dup; } diff --git a/include/linux/fs.h b/include/linux/fs.h index cb15cb2..50114fb 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -579,17 +579,21 @@ static inline void mapping_allow_writable(struct address_space *mapping) #define i_size_ordered_init(inode) do { } while (0) #endif +struct base_acl { + atomic_t ba_refcount; + struct rcu_head ba_rcu; +}; struct posix_acl; #define ACL_NOT_CACHED ((void *)(-1)) -static inline struct posix_acl * +static inline struct base_acl * uncached_acl_sentinel(struct task_struct *task) { return (void *)task + 1; } static inline bool -is_uncached_acl(struct posix_acl *acl) +is_uncached_acl(struct base_acl *acl) { return (long)acl & 1; } @@ -610,9 +614,9 @@ struct inode { kgid_t i_gid; unsigned int i_flags; -#ifdef CONFIG_FS_POSIX_ACL - struct posix_acl *i_acl; - struct posix_acl *i_default_acl; +#if defined(CONFIG_FS_POSIX_ACL) + struct base_acl *i_acl; + struct base_acl *i_default_acl; #endif const struct inode_operations *i_op; @@ -3210,4 +3214,29 @@ static inline bool dir_relax_shared(struct inode *inode) extern bool path_noexec(const struct path *path); extern void inode_nohighmem(struct inode *inode); +static inline void base_acl_get(struct base_acl *acl) +{ + if (acl) + atomic_inc(&acl->ba_refcount); +} + +static inline void base_acl_put(struct base_acl *acl) +{ + if (acl && atomic_dec_and_test(&acl->ba_refcount)) + kfree_rcu(acl, ba_rcu); +} + +static inline void base_acl_init(struct base_acl *acl) +{ + atomic_set(&acl->ba_refcount, 1); +} + +static inline int base_acl_refcount(struct base_acl *acl) +{ + return atomic_read(&acl->ba_refcount); +} + +extern struct base_acl *__get_cached_acl(struct base_acl **); +extern void __forget_cached_acl(struct base_acl **); + #endif /* _LINUX_FS_H */ diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index d5d3d74..eafb358 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -43,8 +43,7 @@ struct posix_acl_entry { }; struct posix_acl { - atomic_t a_refcount; - struct rcu_head a_rcu; + struct base_acl a_base; /* must be first, see posix_acl_release() */ unsigned int a_count; struct posix_acl_entry a_entries[0]; }; @@ -59,8 +58,7 @@ struct posix_acl { static inline struct posix_acl * posix_acl_dup(struct posix_acl *acl) { - if (acl) - atomic_inc(&acl->a_refcount); + base_acl_get(&acl->a_base); return acl; } @@ -70,10 +68,16 @@ posix_acl_dup(struct posix_acl *acl) static inline void posix_acl_release(struct posix_acl *acl) { - if (acl && atomic_dec_and_test(&acl->a_refcount)) - kfree_rcu(acl, a_rcu); + BUILD_BUG_ON(offsetof(struct posix_acl, a_base) != 0); + base_acl_put(&acl->a_base); } +static inline struct posix_acl * +posix_acl(struct base_acl *base_acl) +{ + BUILD_BUG_ON(offsetof(struct posix_acl, a_base) != 0); + return container_of(base_acl, struct posix_acl, a_base); +} /* posix_acl.c */ @@ -97,8 +101,7 @@ extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, extern int simple_set_acl(struct inode *, struct posix_acl *, int); extern int simple_acl_create(struct inode *, struct inode *); -struct posix_acl *get_cached_acl(struct inode *inode, int type); -struct posix_acl *get_cached_acl_rcu(struct inode *inode, int type); +struct base_acl *get_cached_acl(struct inode *inode, int type); void set_cached_acl(struct inode *inode, int type, struct posix_acl *acl); void forget_cached_acl(struct inode *inode, int type); void forget_all_cached_acls(struct inode *inode); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 700888b..d535206 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -31,7 +31,7 @@ struct richace { }; struct richacl { - atomic_t a_refcount; + struct base_acl a_base; /* must be first, see richacl_put() */ unsigned int a_owner_mask; unsigned int a_group_mask; unsigned int a_other_mask; @@ -56,8 +56,7 @@ struct richacl { static inline struct richacl * richacl_get(struct richacl *acl) { - if (acl) - atomic_inc(&acl->a_refcount); + base_acl_get(&acl->a_base); return acl; } @@ -67,8 +66,8 @@ richacl_get(struct richacl *acl) static inline void richacl_put(struct richacl *acl) { - if (acl && atomic_dec_and_test(&acl->a_refcount)) - kfree(acl); + BUILD_BUG_ON(offsetof(struct richacl, a_base) != 0); + base_acl_put(&acl->a_base); } /** -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2FE2C7CBD for ; Tue, 16 Aug 2016 06:04:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 006A38F8165 for ; Tue, 16 Aug 2016 04:04:10 -0700 (PDT) X-ASG-Debug-ID: 1471345449-0bf57b64af1abb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qKdkwZ9qth2q38Au (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:10 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 56C273B70C; Tue, 16 Aug 2016 11:04:09 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fd006464; Tue, 16 Aug 2016 07:04:04 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 11/22] vfs: Add get_richacl and set_richacl inode operations Date: Tue, 16 Aug 2016 13:02:52 +0200 X-ASG-Orig-Subj: [PATCH v25 11/22] vfs: Add get_richacl and set_richacl inode operations Message-Id: <1471345383-15334-12-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 16 Aug 2016 11:04:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345450 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1230 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 These operations are similar to the get_acl and set_acl operations for POSIX ACLs. The distinction between access and default ACLs doesn't exist for richacls. Signed-off-by: Andreas Gruenbacher Reviewed-by: Steve French --- include/linux/fs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/fs.h b/include/linux/fs.h index 50114fb..fbb57f9 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1732,6 +1732,7 @@ struct inode_operations { const char * (*get_link) (struct dentry *, struct inode *, struct delayed_call *); int (*permission) (struct inode *, int); struct posix_acl * (*get_acl)(struct inode *, int); + struct richacl * (*get_richacl)(struct inode *); int (*readlink) (struct dentry *, char __user *,int); @@ -1762,6 +1763,7 @@ struct inode_operations { umode_t create_mode, int *opened); int (*tmpfile) (struct inode *, struct dentry *, umode_t); int (*set_acl)(struct inode *, struct posix_acl *, int); + int (*set_richacl)(struct inode *, struct richacl *); } ____cacheline_aligned; ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E9647CDC for ; Tue, 16 Aug 2016 06:04:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11350AC061 for ; Tue, 16 Aug 2016 04:04:16 -0700 (PDT) X-ASG-Debug-ID: 1471345454-0bf81563e61b6d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TmCvWKoahI1hedca (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:14 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 797C8635C3; Tue, 16 Aug 2016 11:04:14 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fe006464; Tue, 16 Aug 2016 07:04:09 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 12/22] vfs: Cache richacl in struct inode Date: Tue, 16 Aug 2016 13:02:53 +0200 X-ASG-Orig-Subj: [PATCH v25 12/22] vfs: Cache richacl in struct inode Message-Id: <1471345383-15334-13-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 16 Aug 2016 11:04:14 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345454 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5837 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Cache richacls in struct inode so that this doesn't have to be done individually in each filesystem. This is similar to POSIX ACLs. Signed-off-by: Andreas Gruenbacher --- fs/inode.c | 13 +++++--- fs/richacl.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 5 ++- include/linux/richacl.h | 11 +++++++ 4 files changed, 105 insertions(+), 5 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index cc081dd..618bf5d4 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -181,8 +181,11 @@ int inode_init_always(struct super_block *sb, struct inode *inode) inode->i_private = NULL; inode->i_mapping = mapping; INIT_HLIST_HEAD(&inode->i_dentry); /* buggered by rcu freeing */ -#ifdef CONFIG_FS_POSIX_ACL - inode->i_acl = inode->i_default_acl = ACL_NOT_CACHED; +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) + inode->i_acl = ACL_NOT_CACHED; +# if defined(CONFIG_FS_POSIX_ACL) + inode->i_default_acl = ACL_NOT_CACHED; +# endif #endif #ifdef CONFIG_FSNOTIFY @@ -238,17 +241,19 @@ void __destroy_inode(struct inode *inode) atomic_long_dec(&inode->i_sb->s_remove_count); } -#ifdef CONFIG_FS_POSIX_ACL +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) if (inode->i_acl && !is_uncached_acl(inode->i_acl)) base_acl_put(inode->i_acl); +# if defined(CONFIG_FS_POSIX_ACL) if (inode->i_default_acl && !is_uncached_acl(inode->i_default_acl)) base_acl_put(inode->i_default_acl); +# endif #endif this_cpu_dec(nr_inodes); } EXPORT_SYMBOL(__destroy_inode); -#ifdef CONFIG_FS_POSIX_ACL +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) struct base_acl *__get_cached_acl(struct base_acl **p) { struct base_acl *base_acl; diff --git a/fs/richacl.c b/fs/richacl.c index 57a4048..731c468 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -20,6 +20,87 @@ #include #include +void set_cached_richacl(struct inode *inode, struct richacl *acl) +{ + struct base_acl *old; + + old = xchg(&inode->i_acl, &richacl_get(acl)->a_base); + if (!is_uncached_acl(old)) + base_acl_put(old); +} +EXPORT_SYMBOL_GPL(set_cached_richacl); + +void forget_cached_richacl(struct inode *inode) +{ + __forget_cached_acl(&inode->i_acl); +} +EXPORT_SYMBOL_GPL(forget_cached_richacl); + +struct richacl *get_richacl(struct inode *inode) +{ + struct base_acl *sentinel, *base_acl; + struct richacl *acl; + + if (!IS_RICHACL(inode)) + return NULL; + + /* + * The sentinel is used to detect when another operation like + * set_cached_richacl() or forget_cached_richacl() races with + * get_richacl(). + * It is guaranteed that is_uncached_acl(sentinel) is true. + */ + + base_acl = __get_cached_acl(&inode->i_acl); + if (!is_uncached_acl(base_acl)) + return richacl(base_acl); + + sentinel = uncached_acl_sentinel(current); + + /* + * If the ACL isn't being read yet, set our sentinel. Otherwise, the + * current value of the ACL will not be ACL_NOT_CACHED and so our own + * sentinel will not be set; another task will update the cache. We + * could wait for that other task to complete its job, but it's easier + * to just call ->get_acl to fetch the ACL ourself. (This is going to + * be an unlikely race.) + */ + if (cmpxchg(&inode->i_acl, ACL_NOT_CACHED, sentinel) != ACL_NOT_CACHED) + /* fall through */ ; + + /* + * Normally, the ACL returned by ->get_richacl will be cached. + * A filesystem can prevent that by calling + * forget_cached_richacl(inode) in ->get_richacl. + * + * If the filesystem doesn't have a ->get_richacl function at all, + * we'll just create the negative cache entry. + */ + if (!inode->i_op->get_richacl) { + set_cached_richacl(inode, NULL); + return NULL; + } + + acl = inode->i_op->get_richacl(inode); + if (IS_ERR(acl)) { + /* + * Remove our sentinel so that we don't block future attempts + * to cache the ACL. + */ + cmpxchg(&inode->i_acl, sentinel, ACL_NOT_CACHED); + return acl; + } + + /* + * Cache the result, but only if our sentinel is still in place. + */ + richacl_get(acl); + if (unlikely(cmpxchg(&inode->i_acl, sentinel, &acl->a_base) != sentinel)) + richacl_put(acl); + return acl; +} +EXPORT_SYMBOL_GPL(get_richacl); + /** * richacl_alloc - allocate a richacl * @count: number of entries diff --git a/include/linux/fs.h b/include/linux/fs.h index fbb57f9..89df251 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -584,6 +584,7 @@ struct base_acl { struct rcu_head ba_rcu; }; struct posix_acl; +struct richacl; #define ACL_NOT_CACHED ((void *)(-1)) static inline struct base_acl * @@ -614,9 +615,11 @@ struct inode { kgid_t i_gid; unsigned int i_flags; -#if defined(CONFIG_FS_POSIX_ACL) +#if defined(CONFIG_FS_POSIX_ACL) || defined(CONFIG_FS_RICHACL) struct base_acl *i_acl; +# if defined(CONFIG_FS_POSIX_ACL) struct base_acl *i_default_acl; +# endif #endif const struct inode_operations *i_op; diff --git a/include/linux/richacl.h b/include/linux/richacl.h index d535206..207fe06 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -70,6 +70,17 @@ richacl_put(struct richacl *acl) base_acl_put(&acl->a_base); } +static inline struct richacl * +richacl(struct base_acl *base_acl) +{ + BUILD_BUG_ON(offsetof(struct richacl, a_base) != 0); + return container_of(base_acl, struct richacl, a_base); +} + +extern void set_cached_richacl(struct inode *, struct richacl *); +extern void forget_cached_richacl(struct inode *); +extern struct richacl *get_richacl(struct inode *); + /** * richace_is_owner - check if @ace is an OWNER@ entry */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 936D77CE1 for ; Tue, 16 Aug 2016 06:04:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 36FBE8F8165 for ; Tue, 16 Aug 2016 04:04:21 -0700 (PDT) X-ASG-Debug-ID: 1471345459-0bf81563e41b6d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id coxdaMeRsdvhE1kL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:20 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9941083F47; Tue, 16 Aug 2016 11:04:19 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Ff006464; Tue, 16 Aug 2016 07:04:14 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 13/22] richacl: Update the file masks in chmod() Date: Tue, 16 Aug 2016 13:02:54 +0200 X-ASG-Orig-Subj: [PATCH v25 13/22] richacl: Update the file masks in chmod() Message-Id: <1471345383-15334-14-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 16 Aug 2016 11:04:19 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345460 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3996 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Doing a chmod() sets the file mode, which includes the file permission bits. When a file has a richacl, the permissions that the richacl grants need to be limited to what the new file permission bits allow. This is done by setting the file masks in the richacl to what the file permission bits map to. The richacl access check algorithm takes the file masks into account, which ensures that the richacl cannot grant too many permissions. It is possible to explicitly add permissions to the file masks which go beyond what the file permission bits can grant (like the RICHACE_WRITE_ACL permission). The POSIX.1 standard calls this an alternate file access control mechanism. A subsequent chmod() would ensure that those permissions are disabled again. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Acked-by: Jeff Layton --- fs/richacl.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 72 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 731c468..a199245 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -541,3 +541,74 @@ restart: acl->a_flags &= ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED); } EXPORT_SYMBOL_GPL(richacl_compute_max_masks); + +/** + * __richacl_chmod - update the file masks to reflect the new mode + * @acl: access control list + * @mode: new file permission bits including the file type + * + * Return a copy of @acl where the file masks have been replaced by the file + * masks corresponding to the file permission bits in @mode, or returns @acl + * itself if the file masks are already up to date. Takes over a reference + * to @acl. + */ +static struct richacl * +__richacl_chmod(struct richacl *acl, umode_t mode) +{ + unsigned int x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + unsigned int owner_mask, group_mask, other_mask; + struct richacl *clone; + + owner_mask = richacl_mode_to_mask(mode >> 6) & ~x; + group_mask = richacl_mode_to_mask(mode >> 3) & ~x; + other_mask = richacl_mode_to_mask(mode) & ~x; + + if (acl->a_owner_mask == owner_mask && + acl->a_group_mask == group_mask && + acl->a_other_mask == other_mask && + (acl->a_flags & RICHACL_MASKED) && + (acl->a_flags & RICHACL_WRITE_THROUGH)) + return acl; + + clone = richacl_clone(acl, GFP_KERNEL); + richacl_put(acl); + if (!clone) + return ERR_PTR(-ENOMEM); + + clone->a_flags |= (RICHACL_WRITE_THROUGH | RICHACL_MASKED); + clone->a_owner_mask = owner_mask; + clone->a_group_mask = group_mask; + clone->a_other_mask = other_mask; + + return clone; +} + +/** + * richacl_chmod - filesystem chmod helper + * @inode: inode whose file permission bits to change + * @mode: new file permission bits including the file type + * + * Helper for filesystems to use to perform a chmod on the richacl of an inode. + */ +int +richacl_chmod(struct inode *inode, umode_t mode) +{ + struct richacl *acl; + int retval; + + if (S_ISLNK(mode)) + return -EOPNOTSUPP; + if (!inode->i_op->set_richacl) + return -EOPNOTSUPP; + acl = get_richacl(inode); + if (IS_ERR_OR_NULL(acl)) + return PTR_ERR(acl); + acl = __richacl_chmod(acl, mode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + retval = inode->i_op->set_richacl(inode, acl); + richacl_put(acl); + + return retval; +} +EXPORT_SYMBOL(richacl_chmod); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 207fe06..3cd5e53 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -189,5 +189,6 @@ extern int richacl_masks_to_mode(const struct richacl *); extern unsigned int richacl_mode_to_mask(umode_t); extern int richacl_permission(struct inode *, const struct richacl *, int); extern void richacl_compute_max_masks(struct richacl *); +extern int richacl_chmod(struct inode *, umode_t); #endif /* __RICHACL_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DB6C47CE4 for ; Tue, 16 Aug 2016 06:04:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA7768F8165 for ; Tue, 16 Aug 2016 04:04:26 -0700 (PDT) X-ASG-Debug-ID: 1471345465-0bf57c0d011dfa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id G3JW4ex3su0CEfRA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:25 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E924637E62; Tue, 16 Aug 2016 11:04:24 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fg006464; Tue, 16 Aug 2016 07:04:20 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 14/22] richacl: Check if an acl is equivalent to a file mode Date: Tue, 16 Aug 2016 13:02:55 +0200 X-ASG-Orig-Subj: [PATCH v25 14/22] richacl: Check if an acl is equivalent to a file mode Message-Id: <1471345383-15334-15-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 16 Aug 2016 11:04:25 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345465 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4394 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 ACLs are considered equivalent to file modes if they only consist of owner@, group@, and everyone@ entries, the owner@ permissions do not depend on whether the owner is a member in the owning group, and no inheritance flags are set. This test is used to avoid storing richacls if the acl can be computed from the file permission bits. Signed-off-by: Andreas Gruenbacher Reviewed-by: J. Bruce Fields Reviewed-by: Jeff Layton --- fs/richacl.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + 2 files changed, 105 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index a199245..1022983 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -612,3 +612,107 @@ richacl_chmod(struct inode *inode, umode_t mode) return retval; } EXPORT_SYMBOL(richacl_chmod); + +/** + * richacl_equiv_mode - compute the mode equivalent of @acl + * + * An acl is considered equivalent to a file mode if it only consists of + * owner@, group@, and everyone@ entries and the owner@ permissions do not + * depend on whether the owner is a member in the owning group. + */ +int +richacl_equiv_mode(const struct richacl *acl, umode_t *mode_p) +{ + umode_t mode = *mode_p; + + /* + * The RICHACE_DELETE_CHILD flag is meaningless for non-directories, so + * we ignore it. + */ + unsigned int x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + struct { + unsigned int allowed; + unsigned int defined; /* allowed or denied */ + } owner = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | + RICHACE_POSIX_OWNER_ALLOWED | x, + }, group = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | x, + }, everyone = { + .defined = RICHACE_POSIX_ALWAYS_ALLOWED | x, + }; + const struct richace *ace; + + if (acl->a_flags & ~(RICHACL_WRITE_THROUGH | RICHACL_MASKED)) + return -1; + + richacl_for_each_entry(ace, acl) { + if (ace->e_flags & ~RICHACE_SPECIAL_WHO) + return -1; + + if (richace_is_owner(ace) || richace_is_everyone(ace)) { + x = ace->e_mask & ~owner.defined; + if (richace_is_allow(ace)) { + unsigned int group_denied = + group.defined & ~group.allowed; + + if (x & group_denied) + return -1; + owner.allowed |= x; + } else /* if (richace_is_deny(ace)) */ { + if (x & group.allowed) + return -1; + } + owner.defined |= x; + + if (richace_is_everyone(ace)) { + x = ace->e_mask; + if (richace_is_allow(ace)) { + group.allowed |= + x & ~group.defined; + everyone.allowed |= + x & ~everyone.defined; + } + group.defined |= x; + everyone.defined |= x; + } + } else if (richace_is_group(ace)) { + x = ace->e_mask & ~group.defined; + if (richace_is_allow(ace)) + group.allowed |= x; + group.defined |= x; + } else + return -1; + } + + if (group.allowed & ~owner.defined) + return -1; + + if (acl->a_flags & RICHACL_MASKED) { + if (acl->a_flags & RICHACL_WRITE_THROUGH) { + owner.allowed = acl->a_owner_mask; + everyone.allowed = acl->a_other_mask; + } else { + owner.allowed &= acl->a_owner_mask; + everyone.allowed &= acl->a_other_mask; + } + group.allowed &= acl->a_group_mask; + } + + mode = (mode & ~S_IRWXUGO) | + (richacl_mask_to_mode(owner.allowed) << 6) | + (richacl_mask_to_mode(group.allowed) << 3) | + richacl_mask_to_mode(everyone.allowed); + + /* Mask flags we can ignore */ + x = S_ISDIR(mode) ? 0 : RICHACE_DELETE_CHILD; + + if (((richacl_mode_to_mask(mode >> 6) ^ owner.allowed) & ~x) || + ((richacl_mode_to_mask(mode >> 3) ^ group.allowed) & ~x) || + ((richacl_mode_to_mask(mode) ^ everyone.allowed) & ~x)) + return -1; + + *mode_p = mode; + return 0; +} +EXPORT_SYMBOL_GPL(richacl_equiv_mode); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 3cd5e53..a865f37 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -190,5 +190,6 @@ extern unsigned int richacl_mode_to_mask(umode_t); extern int richacl_permission(struct inode *, const struct richacl *, int); extern void richacl_compute_max_masks(struct richacl *); extern int richacl_chmod(struct inode *, umode_t); +extern int richacl_equiv_mode(const struct richacl *, umode_t *); #endif /* __RICHACL_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3D6AA7CE7 for ; Tue, 16 Aug 2016 06:04:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 021638F8165 for ; Tue, 16 Aug 2016 04:04:32 -0700 (PDT) X-ASG-Debug-ID: 1471345470-0bf57c0d011dfb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6ECamGwC4DiQi7AU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:30 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 14B8183F3B; Tue, 16 Aug 2016 11:04:30 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fh006464; Tue, 16 Aug 2016 07:04:25 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 15/22] richacl: Create-time inheritance Date: Tue, 16 Aug 2016 13:02:56 +0200 X-ASG-Orig-Subj: [PATCH v25 15/22] richacl: Create-time inheritance Message-Id: <1471345383-15334-16-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 16 Aug 2016 11:04:30 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345470 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5805 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When a new file is created, it can inherit an acl from its parent directory; this is similar to how default acls work in POSIX ACLs. As with POSIX ACLs, if a file inherits an acl from its parent directory, the intersection between the create mode and the permissions granted by the inherited acl determines the file masks and file permission bits, and the umask is ignored. Signed-off-by: Andreas Gruenbacher Reviewed-by: Jeff Layton --- fs/richacl.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 2 + 2 files changed, 153 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 1022983..8051181 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -716,3 +716,154 @@ richacl_equiv_mode(const struct richacl *acl, umode_t *mode_p) return 0; } EXPORT_SYMBOL_GPL(richacl_equiv_mode); + +static inline bool +ace_inherits_to_directory(const struct richace *ace) +{ + if (ace->e_flags & RICHACE_DIRECTORY_INHERIT_ACE) + return true; + if ((ace->e_flags & RICHACE_FILE_INHERIT_ACE) && + !(ace->e_flags & RICHACE_NO_PROPAGATE_INHERIT_ACE)) + return true; + return false; +} + +/** + * richacl_inherit - compute the inherited acl of a new file + * @dir_acl: acl of the containing directory + * @isdir: inherit by a directory or non-directory? + * + * A directory can have acl entries which files and/or directories created + * inside the directory will inherit. This function computes the acl for such + * a new file. If there is no inheritable acl, it will return %NULL. + */ +struct richacl * +richacl_inherit(const struct richacl *dir_acl, int isdir) +{ + const struct richace *dir_ace; + struct richacl *acl = NULL; + struct richace *ace; + int count = 0; + + if (isdir) { + richacl_for_each_entry(dir_ace, dir_acl) { + if (!ace_inherits_to_directory(dir_ace)) + continue; + count++; + } + if (!count) + return NULL; + acl = richacl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + ace = acl->a_entries; + richacl_for_each_entry(dir_ace, dir_acl) { + if (!ace_inherits_to_directory(dir_ace)) + continue; + richace_copy(ace, dir_ace); + if (dir_ace->e_flags & RICHACE_NO_PROPAGATE_INHERIT_ACE) + ace->e_flags &= ~RICHACE_INHERITANCE_FLAGS; + else if (dir_ace->e_flags & RICHACE_DIRECTORY_INHERIT_ACE) + ace->e_flags &= ~RICHACE_INHERIT_ONLY_ACE; + else + ace->e_flags |= RICHACE_INHERIT_ONLY_ACE; + ace++; + } + } else { + richacl_for_each_entry(dir_ace, dir_acl) { + if (!(dir_ace->e_flags & RICHACE_FILE_INHERIT_ACE)) + continue; + count++; + } + if (!count) + return NULL; + acl = richacl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + ace = acl->a_entries; + richacl_for_each_entry(dir_ace, dir_acl) { + if (!(dir_ace->e_flags & RICHACE_FILE_INHERIT_ACE)) + continue; + richace_copy(ace, dir_ace); + ace->e_flags &= ~RICHACE_INHERITANCE_FLAGS; + /* + * RICHACE_DELETE_CHILD is meaningless for + * non-directories, so clear it. + */ + ace->e_mask &= ~RICHACE_DELETE_CHILD; + ace++; + } + } + + return acl; +} + +/* + * richacl_inherit_inode - compute inherited acl and file mode + * @dir_acl: acl of the containing directory + * @mode_p: mode of the new inode + * + * The file permission bits in @mode_p must be set to the create mode by the + * caller. + * + * If there is an inheritable acl, the maximum permissions that the acl grants + * are computed and the file masks of the new acl are set accordingly. + */ +static struct richacl * +richacl_inherit_inode(const struct richacl *dir_acl, umode_t *mode_p) +{ + struct richacl *acl; + umode_t mode = *mode_p; + + acl = richacl_inherit(dir_acl, S_ISDIR(mode)); + if (acl) { + if (richacl_equiv_mode(acl, &mode) == 0) { + *mode_p &= mode; + richacl_put(acl); + acl = NULL; + } else { + richacl_compute_max_masks(acl); + /* + * Ensure that the acl will not grant any permissions + * beyond the create mode. + */ + acl->a_flags |= RICHACL_MASKED; + acl->a_owner_mask &= + richacl_mode_to_mask(mode >> 6); + acl->a_group_mask &= + richacl_mode_to_mask(mode >> 3); + acl->a_other_mask &= + richacl_mode_to_mask(mode); + } + } else + *mode_p &= ~current_umask(); + + return acl; +} + +/** + * richacl_create - filesystem create helper + * @mode_p: mode of the new inode + * @dir: containing directory + * + * Compute the inherited acl for a new inode. If there is no acl to inherit, + * apply the umask. Use when creating a new inode on a richacl enabled file + * system. + */ +struct richacl *richacl_create(umode_t *mode_p, struct inode *dir) +{ + struct richacl *dir_acl, *acl = NULL; + + if (S_ISLNK(*mode_p)) + return NULL; + dir_acl = get_richacl(dir); + if (dir_acl) { + if (IS_ERR(dir_acl)) + return dir_acl; + acl = richacl_inherit_inode(dir_acl, mode_p); + richacl_put(dir_acl); + } else + *mode_p &= ~current_umask(); + return acl; +} +EXPORT_SYMBOL_GPL(richacl_create); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index a865f37..6354ef0 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -191,5 +191,7 @@ extern int richacl_permission(struct inode *, const struct richacl *, int); extern void richacl_compute_max_masks(struct richacl *); extern int richacl_chmod(struct inode *, umode_t); extern int richacl_equiv_mode(const struct richacl *, umode_t *); +extern struct richacl *richacl_inherit(const struct richacl *, int); +extern struct richacl *richacl_create(umode_t *, struct inode *); #endif /* __RICHACL_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C2F27CD5 for ; Tue, 16 Aug 2016 06:04:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F210230417A for ; Tue, 16 Aug 2016 04:04:36 -0700 (PDT) X-ASG-Debug-ID: 1471345475-0bf57b64ad1abf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XdkL95QutSHYMlNu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:35 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 34ED38553F; Tue, 16 Aug 2016 11:04:35 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fi006464; Tue, 16 Aug 2016 07:04:30 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 16/22] richacl: Automatic Inheritance Date: Tue, 16 Aug 2016 13:02:57 +0200 X-ASG-Orig-Subj: [PATCH v25 16/22] richacl: Automatic Inheritance Message-Id: <1471345383-15334-17-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 16 Aug 2016 11:04:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345475 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6274 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Automatic Inheritance (AI) allows changes to the acl of a directory to propagate down to children. This is mostly implemented in user space: when a process changes the permissions of a directory and Automatic Inheritance is enabled for that directory, the process must propagate those changes to all children, recursively. The kernel enables this by keeping track of which permissions have been inherited at create time. In addition, it makes sure that permission propagation is turned off when the permissions are set explicitly (for example, upon create or chmod). Automatic Inheritance works as follows: - When the RICHACL_AUTO_INHERIT flag in the acl of a file or directory is not set, the file or directory is not affected by AI. - When the RICHACL_AUTO_INHERIT flag in the acl of a directory is set and a file or subdirectory is created in that directory, the inherited acl will have the RICHACL_AUTO_INHERIT flag set, and all inherited aces will have the RICHACE_INHERITED_ACE flag set. This allows user space to distinguish between aces which have been inherited and aces which have been explicitly added. - When the RICHACL_PROTECTED acl flag in the acl of a file or directory is set, AI will not modify the acl. This does not affect propagation of permissions from the file to its children (if the file is a directory). Linux does not have a way of creating files or directories without setting the file permission bits, so all files created inside a directory with RICHACL_AUTO_INHERIT set will have the RICHACL_PROTECTED flag set. This effectively disables Automatic Inheritance. Protocols which support creating files without specifying permissions can explicitly clear the RICHACL_PROTECTED flag after creating a file and reset the file masks to "undo" applying the create mode; see richacl_compute_max_masks(). They should set the RICHACL_DEFAULTED flag. (A mechanism that would allow to indicate to the kernel to ignore the create mode in the first place when there are inherited permissions would be nice to have.) Signed-off-by: Andreas Gruenbacher Reviewed-by: Jeff Layton --- fs/richacl.c | 20 +++++++++++++++++++- include/linux/richacl.h | 12 ++++++++++++ include/uapi/linux/richacl.h | 11 ++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/fs/richacl.c b/fs/richacl.c index 8051181..4edce8b 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -567,7 +567,8 @@ __richacl_chmod(struct richacl *acl, umode_t mode) acl->a_group_mask == group_mask && acl->a_other_mask == other_mask && (acl->a_flags & RICHACL_MASKED) && - (acl->a_flags & RICHACL_WRITE_THROUGH)) + (acl->a_flags & RICHACL_WRITE_THROUGH) && + (!richacl_is_auto_inherit(acl) || richacl_is_protected(acl))) return acl; clone = richacl_clone(acl, GFP_KERNEL); @@ -579,6 +580,8 @@ __richacl_chmod(struct richacl *acl, umode_t mode) clone->a_owner_mask = owner_mask; clone->a_group_mask = group_mask; clone->a_other_mask = other_mask; + if (richacl_is_auto_inherit(clone)) + clone->a_flags |= RICHACL_PROTECTED; return clone; } @@ -794,6 +797,14 @@ richacl_inherit(const struct richacl *dir_acl, int isdir) ace++; } } + if (richacl_is_auto_inherit(dir_acl)) { + acl->a_flags = RICHACL_AUTO_INHERIT; + richacl_for_each_entry(ace, acl) + ace->e_flags |= RICHACE_INHERITED_ACE; + } else { + richacl_for_each_entry(ace, acl) + ace->e_flags &= ~RICHACE_INHERITED_ACE; + } return acl; } @@ -822,6 +833,13 @@ richacl_inherit_inode(const struct richacl *dir_acl, umode_t *mode_p) richacl_put(acl); acl = NULL; } else { + /* + * We need to set RICHACL_PROTECTED because we are + * doing an implicit chmod + */ + if (richacl_is_auto_inherit(acl)) + acl->a_flags |= RICHACL_PROTECTED; + richacl_compute_max_masks(acl); /* * Ensure that the acl will not grant any permissions diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 6354ef0..737513b 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -81,6 +81,18 @@ extern void set_cached_richacl(struct inode *, struct richacl *); extern void forget_cached_richacl(struct inode *); extern struct richacl *get_richacl(struct inode *); +static inline int +richacl_is_auto_inherit(const struct richacl *acl) +{ + return acl->a_flags & RICHACL_AUTO_INHERIT; +} + +static inline int +richacl_is_protected(const struct richacl *acl) +{ + return acl->a_flags & RICHACL_PROTECTED; +} + /** * richace_is_owner - check if @ace is an OWNER@ entry */ diff --git a/include/uapi/linux/richacl.h b/include/uapi/linux/richacl.h index 1ed48ac..8849a53 100644 --- a/include/uapi/linux/richacl.h +++ b/include/uapi/linux/richacl.h @@ -18,6 +18,9 @@ #define __UAPI_RICHACL_H /* a_flags values */ +#define RICHACL_AUTO_INHERIT 0x01 +#define RICHACL_PROTECTED 0x02 +#define RICHACL_DEFAULTED 0x04 #define RICHACL_WRITE_THROUGH 0x40 #define RICHACL_MASKED 0x80 @@ -31,6 +34,7 @@ #define RICHACE_NO_PROPAGATE_INHERIT_ACE 0x0004 #define RICHACE_INHERIT_ONLY_ACE 0x0008 #define RICHACE_IDENTIFIER_GROUP 0x0040 +#define RICHACE_INHERITED_ACE 0x0080 #define RICHACE_SPECIAL_WHO 0x4000 /* e_mask bitflags */ @@ -60,6 +64,9 @@ #define RICHACE_EVERYONE_SPECIAL_ID 2 #define RICHACL_VALID_FLAGS ( \ + RICHACL_AUTO_INHERIT | \ + RICHACL_PROTECTED | \ + RICHACL_DEFAULTED | \ RICHACL_WRITE_THROUGH | \ RICHACL_MASKED ) @@ -69,13 +76,15 @@ RICHACE_NO_PROPAGATE_INHERIT_ACE | \ RICHACE_INHERIT_ONLY_ACE | \ RICHACE_IDENTIFIER_GROUP | \ + RICHACE_INHERITED_ACE | \ RICHACE_SPECIAL_WHO ) #define RICHACE_INHERITANCE_FLAGS ( \ RICHACE_FILE_INHERIT_ACE | \ RICHACE_DIRECTORY_INHERIT_ACE | \ RICHACE_NO_PROPAGATE_INHERIT_ACE | \ - RICHACE_INHERIT_ONLY_ACE ) + RICHACE_INHERIT_ONLY_ACE | \ + RICHACE_INHERITED_ACE ) /* Valid RICHACE_* flags for directories and non-directories */ #define RICHACE_VALID_MASK ( \ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 80B2E7CEC for ; Tue, 16 Aug 2016 06:04:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 362818F8172 for ; Tue, 16 Aug 2016 04:04:43 -0700 (PDT) X-ASG-Debug-ID: 1471345480-0bf81563e41b700001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YeONH7vwO8GpT70a (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:40 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5E560CDFBA; Tue, 16 Aug 2016 11:04:40 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fj006464; Tue, 16 Aug 2016 07:04:35 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 17/22] richacl: xattr mapping functions Date: Tue, 16 Aug 2016 13:02:58 +0200 X-ASG-Orig-Subj: [PATCH v25 17/22] richacl: xattr mapping functions Message-Id: <1471345383-15334-18-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Tue, 16 Aug 2016 11:04:40 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345480 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9969 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Map between "system.richacl" xattrs and the in-kernel representation. Signed-off-by: Andreas Gruenbacher Reviewed-by: Jeff Layton --- fs/Makefile | 2 +- fs/richacl_xattr.c | 161 +++++++++++++++++++++++++++++++++++++ include/linux/richacl_xattr.h | 29 +++++++ include/uapi/linux/Kbuild | 1 + include/uapi/linux/richacl_xattr.h | 44 ++++++++++ include/uapi/linux/xattr.h | 2 + 6 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 fs/richacl_xattr.c create mode 100644 include/linux/richacl_xattr.h create mode 100644 include/uapi/linux/richacl_xattr.h diff --git a/fs/Makefile b/fs/Makefile index 0004fc5..163ec8c 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -50,7 +50,7 @@ obj-$(CONFIG_SYSCTL) += drop_caches.o obj-$(CONFIG_FHANDLE) += fhandle.o obj-$(CONFIG_FS_IOMAP) += iomap.o -obj-$(CONFIG_FS_RICHACL) += richacl.o +obj-$(CONFIG_FS_RICHACL) += richacl.o richacl_xattr.o obj-y += quota/ diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c new file mode 100644 index 0000000..dc1ad36 --- /dev/null +++ b/fs/richacl_xattr.c @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include +#include +#include +#include +#include + +/** + * richacl_from_xattr - convert a richacl xattr into the in-memory representation + */ +struct richacl * +richacl_from_xattr(struct user_namespace *user_ns, + const void *value, size_t size, int invalid_error) +{ + const struct richacl_xattr *xattr_acl = value; + const struct richace_xattr *xattr_ace = (void *)(xattr_acl + 1); + struct richacl *acl; + struct richace *ace; + int count; + + if (size < sizeof(*xattr_acl) || + xattr_acl->a_version != RICHACL_XATTR_VERSION || + (xattr_acl->a_flags & ~RICHACL_VALID_FLAGS)) + goto invalid; + size -= sizeof(*xattr_acl); + count = le16_to_cpu(xattr_acl->a_count); + if (count > RICHACL_XATTR_MAX_COUNT) + goto invalid; + if (size != count * sizeof(*xattr_ace)) + goto invalid; + + acl = richacl_alloc(count, GFP_NOFS); + if (!acl) + return ERR_PTR(-ENOMEM); + + acl->a_flags = xattr_acl->a_flags; + acl->a_owner_mask = le32_to_cpu(xattr_acl->a_owner_mask); + if (acl->a_owner_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + acl->a_group_mask = le32_to_cpu(xattr_acl->a_group_mask); + if (acl->a_group_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + acl->a_other_mask = le32_to_cpu(xattr_acl->a_other_mask); + if (acl->a_other_mask & ~RICHACE_VALID_MASK) + goto put_invalid; + + richacl_for_each_entry(ace, acl) { + ace->e_type = le16_to_cpu(xattr_ace->e_type); + ace->e_flags = le16_to_cpu(xattr_ace->e_flags); + ace->e_mask = le32_to_cpu(xattr_ace->e_mask); + + if (ace->e_flags & ~RICHACE_VALID_FLAGS) + goto put_invalid; + if (ace->e_flags & RICHACE_SPECIAL_WHO) { + ace->e_id.special = le32_to_cpu(xattr_ace->e_id); + if (ace->e_id.special > RICHACE_EVERYONE_SPECIAL_ID) + goto put_invalid; + } else if (ace->e_flags & RICHACE_IDENTIFIER_GROUP) { + u32 id = le32_to_cpu(xattr_ace->e_id); + + ace->e_id.gid = make_kgid(user_ns, id); + if (!gid_valid(ace->e_id.gid)) + goto put_invalid; + } else { + u32 id = le32_to_cpu(xattr_ace->e_id); + + ace->e_id.uid = make_kuid(user_ns, id); + if (!uid_valid(ace->e_id.uid)) + goto put_invalid; + } + if (ace->e_type > RICHACE_ACCESS_DENIED_ACE_TYPE || + (ace->e_mask & ~RICHACE_VALID_MASK)) + goto put_invalid; + + xattr_ace++; + } + + return acl; + +put_invalid: + richacl_put(acl); +invalid: + return ERR_PTR(invalid_error); +} +EXPORT_SYMBOL_GPL(richacl_from_xattr); + +/** + * richacl_xattr_size - compute the size of the xattr representation of @acl + */ +size_t +richacl_xattr_size(const struct richacl *acl) +{ + size_t size = sizeof(struct richacl_xattr); + + size += sizeof(struct richace_xattr) * acl->a_count; + return size; +} +EXPORT_SYMBOL_GPL(richacl_xattr_size); + +/** + * richacl_to_xattr - convert @acl into its xattr representation + * @acl: the richacl to convert + * @buffer: buffer for the result + * @size: size of @buffer + */ +int +richacl_to_xattr(struct user_namespace *user_ns, + const struct richacl *acl, void *buffer, size_t size) +{ + struct richacl_xattr *xattr_acl = buffer; + struct richace_xattr *xattr_ace; + const struct richace *ace; + size_t real_size; + + real_size = richacl_xattr_size(acl); + if (!buffer) + return real_size; + if (real_size > size) + return -ERANGE; + + xattr_acl->a_version = RICHACL_XATTR_VERSION; + xattr_acl->a_flags = acl->a_flags; + xattr_acl->a_count = cpu_to_le16(acl->a_count); + + xattr_acl->a_owner_mask = cpu_to_le32(acl->a_owner_mask); + xattr_acl->a_group_mask = cpu_to_le32(acl->a_group_mask); + xattr_acl->a_other_mask = cpu_to_le32(acl->a_other_mask); + + xattr_ace = (void *)(xattr_acl + 1); + richacl_for_each_entry(ace, acl) { + xattr_ace->e_type = cpu_to_le16(ace->e_type); + xattr_ace->e_flags = cpu_to_le16(ace->e_flags); + xattr_ace->e_mask = cpu_to_le32(ace->e_mask); + if (ace->e_flags & RICHACE_SPECIAL_WHO) + xattr_ace->e_id = cpu_to_le32(ace->e_id.special); + else if (ace->e_flags & RICHACE_IDENTIFIER_GROUP) + xattr_ace->e_id = + cpu_to_le32(from_kgid(user_ns, ace->e_id.gid)); + else + xattr_ace->e_id = + cpu_to_le32(from_kuid(user_ns, ace->e_id.uid)); + xattr_ace++; + } + return real_size; +} +EXPORT_SYMBOL_GPL(richacl_to_xattr); diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h new file mode 100644 index 0000000..0efa14b --- /dev/null +++ b/include/linux/richacl_xattr.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#ifndef __RICHACL_XATTR_H +#define __RICHACL_XATTR_H + +#include +#include + +extern struct richacl *richacl_from_xattr(struct user_namespace *, const void *, + size_t, int); +extern size_t richacl_xattr_size(const struct richacl *); +extern int richacl_to_xattr(struct user_namespace *, const struct richacl *, + void *, size_t); + +#endif /* __RICHACL_XATTR_H */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index c983a6c..5c88a3a 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -357,6 +357,7 @@ header-y += reiserfs_fs.h header-y += reiserfs_xattr.h header-y += resource.h header-y += richacl.h +header-y += richacl_xattr.h header-y += rfkill.h header-y += rio_cm_cdev.h header-y += rio_mport_cdev.h diff --git a/include/uapi/linux/richacl_xattr.h b/include/uapi/linux/richacl_xattr.h new file mode 100644 index 0000000..20da204 --- /dev/null +++ b/include/uapi/linux/richacl_xattr.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2006, 2010 Novell, Inc. + * Copyright (C) 2015 Red Hat, Inc. + * Written by Andreas Gruenbacher + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + +#ifndef __UAPI_RICHACL_XATTR_H +#define __UAPI_RICHACL_XATTR_H + +#include +#include + +struct richace_xattr { + __le16 e_type; + __le16 e_flags; + __le32 e_mask; + __le32 e_id; +}; + +struct richacl_xattr { + __u8 a_version; + __u8 a_flags; + __le16 a_count; + __le32 a_owner_mask; + __le32 a_group_mask; + __le32 a_other_mask; +}; + +#define RICHACL_XATTR_VERSION 0 +#define RICHACL_XATTR_MAX_COUNT \ + ((XATTR_SIZE_MAX - sizeof(struct richacl_xattr)) / \ + sizeof(struct richace_xattr)) + +#endif /* __UAPI_RICHACL_XATTR_H */ diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h index 1590c49..1996903 100644 --- a/include/uapi/linux/xattr.h +++ b/include/uapi/linux/xattr.h @@ -73,5 +73,7 @@ #define XATTR_POSIX_ACL_DEFAULT "posix_acl_default" #define XATTR_NAME_POSIX_ACL_DEFAULT XATTR_SYSTEM_PREFIX XATTR_POSIX_ACL_DEFAULT +#define XATTR_RICHACL "richacl" +#define XATTR_NAME_RICHACL XATTR_SYSTEM_PREFIX XATTR_RICHACL #endif /* _UAPI_LINUX_XATTR_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6A87F7CEF for ; Tue, 16 Aug 2016 06:04:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0D2DAC068 for ; Tue, 16 Aug 2016 04:04:47 -0700 (PDT) X-ASG-Debug-ID: 1471345485-0bf57b64ae1ac00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KLTHvQjecbORaRLL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:46 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 89482C057FA9; Tue, 16 Aug 2016 11:04:45 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fk006464; Tue, 16 Aug 2016 07:04:40 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 18/22] richacl: Add richacl xattr handler Date: Tue, 16 Aug 2016 13:02:59 +0200 X-ASG-Orig-Subj: [PATCH v25 18/22] richacl: Add richacl xattr handler Message-Id: <1471345383-15334-19-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 16 Aug 2016 11:04:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345486 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4342 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add richacl xattr handler implementing the xattr operations based on the get_richacl and set_richacl inode operations. Signed-off-by: Andreas Gruenbacher Reviewed-by: Jeff Layton --- fs/richacl.c | 22 ++++++++++++++++ fs/richacl_xattr.c | 61 +++++++++++++++++++++++++++++++++++++++++++ include/linux/richacl.h | 1 + include/linux/richacl_xattr.h | 2 ++ 4 files changed, 86 insertions(+) diff --git a/fs/richacl.c b/fs/richacl.c index 4edce8b..1945691 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -543,6 +543,28 @@ restart: EXPORT_SYMBOL_GPL(richacl_compute_max_masks); /** + * set_richacl - set the richacl of an inode + * @inode: inode whose richacl to set + * @acl: access control list + */ +int +set_richacl(struct inode *inode, struct richacl *acl) +{ + if (!IS_RICHACL(inode)) + return -EOPNOTSUPP; + if (!inode->i_op->set_richacl) + return -EOPNOTSUPP; + + if (!uid_eq(current_fsuid(), inode->i_uid) && + inode_permission(inode, MAY_CHMOD) && + !capable(CAP_FOWNER)) + return -EPERM; + + return inode->i_op->set_richacl(inode, acl); +} +EXPORT_SYMBOL(set_richacl); + +/** * __richacl_chmod - update the file masks to reflect the new mode * @acl: access control list * @mode: new file permission bits including the file type diff --git a/fs/richacl_xattr.c b/fs/richacl_xattr.c index dc1ad36..5eb4aba 100644 --- a/fs/richacl_xattr.c +++ b/fs/richacl_xattr.c @@ -18,7 +18,9 @@ #include #include #include +#include #include +#include /** * richacl_from_xattr - convert a richacl xattr into the in-memory representation @@ -159,3 +161,62 @@ richacl_to_xattr(struct user_namespace *user_ns, return real_size; } EXPORT_SYMBOL_GPL(richacl_to_xattr); + +static bool +richacl_xattr_list(struct dentry *dentry) +{ + return IS_RICHACL(d_backing_inode(dentry)); +} + +static int +richacl_xattr_get(const struct xattr_handler *handler, + struct dentry *unused, struct inode *inode, + const char *name, void *buffer, size_t buffer_size) +{ + struct richacl *acl; + int error; + + if (*name) + return -EINVAL; + if (!IS_RICHACL(inode)) + return -EOPNOTSUPP; + if (S_ISLNK(inode->i_mode)) + return -EOPNOTSUPP; + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl == NULL) + return -ENODATA; + error = richacl_to_xattr(current_user_ns(), acl, buffer, buffer_size); + richacl_put(acl); + return error; +} + +static int +richacl_xattr_set(const struct xattr_handler *handler, + struct dentry *unused, struct inode *inode, + const char *name, const void *value, size_t size, + int flags) +{ + struct richacl *acl = NULL; + int ret; + + if (value) { + acl = richacl_from_xattr(current_user_ns(), value, size, + -EINVAL); + if (IS_ERR(acl)) + return PTR_ERR(acl); + } + + ret = set_richacl(inode, acl); + richacl_put(acl); + return ret; +} + +struct xattr_handler richacl_xattr_handler = { + .name = XATTR_NAME_RICHACL, + .list = richacl_xattr_list, + .get = richacl_xattr_get, + .set = richacl_xattr_set, +}; +EXPORT_SYMBOL(richacl_xattr_handler); diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 737513b..7530920 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -205,5 +205,6 @@ extern int richacl_chmod(struct inode *, umode_t); extern int richacl_equiv_mode(const struct richacl *, umode_t *); extern struct richacl *richacl_inherit(const struct richacl *, int); extern struct richacl *richacl_create(umode_t *, struct inode *); +extern int set_richacl(struct inode *, struct richacl *); #endif /* __RICHACL_H */ diff --git a/include/linux/richacl_xattr.h b/include/linux/richacl_xattr.h index 0efa14b..6c6adb1 100644 --- a/include/linux/richacl_xattr.h +++ b/include/linux/richacl_xattr.h @@ -26,4 +26,6 @@ extern size_t richacl_xattr_size(const struct richacl *); extern int richacl_to_xattr(struct user_namespace *, const struct richacl *, void *, size_t); +extern struct xattr_handler richacl_xattr_handler; + #endif /* __RICHACL_XATTR_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 188317CA2 for ; Tue, 16 Aug 2016 06:04:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE70B8F8172 for ; Tue, 16 Aug 2016 04:04:52 -0700 (PDT) X-ASG-Debug-ID: 1471345491-0bf57b64af1ac10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nuxesuCzl0wJPGdx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:51 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0B2733B71E; Tue, 16 Aug 2016 11:04:51 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fl006464; Tue, 16 Aug 2016 07:04:45 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 19/22] vfs: Add richacl permission checking Date: Tue, 16 Aug 2016 13:03:00 +0200 X-ASG-Orig-Subj: [PATCH v25 19/22] vfs: Add richacl permission checking Message-Id: <1471345383-15334-20-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 16 Aug 2016 11:04:51 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345491 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2668 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hook the richacl permission checking function into the vfs. Signed-off-by: Andreas Gruenbacher Reviewed-by: Jeff Layton --- fs/namei.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index ae205ea..63feb3c 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -257,7 +258,43 @@ void putname(struct filename *name) __putname(name); } -static int check_acl(struct inode *inode, int mask) +static int check_richacl(struct inode *inode, int mask) +{ +#ifdef CONFIG_FS_RICHACL + if (mask & MAY_NOT_BLOCK) { + struct base_acl *base_acl; + + base_acl = rcu_dereference(inode->i_acl); + if (!base_acl) + goto no_acl; + /* no ->get_richacl() calls in RCU mode... */ + if (is_uncached_acl(base_acl)) + return -ECHILD; + return richacl_permission(inode, richacl(base_acl), + mask & ~MAY_NOT_BLOCK); + } else { + struct richacl *acl; + + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + int error = richacl_permission(inode, acl, mask); + richacl_put(acl); + return error; + } + } +no_acl: +#endif + if (mask & (MAY_DELETE_SELF | MAY_TAKE_OWNERSHIP | + MAY_CHMOD | MAY_SET_TIMES)) { + /* File permission bits cannot grant this. */ + return -EACCES; + } + return -EAGAIN; +} + +static int check_posix_acl(struct inode *inode, int mask) { #ifdef CONFIG_FS_POSIX_ACL if (mask & MAY_NOT_BLOCK) { @@ -295,11 +332,24 @@ static int acl_permission_check(struct inode *inode, int mask) { unsigned int mode = inode->i_mode; + /* + * With POSIX ACLs, the (mode & S_IRWXU) bits exactly match the owner + * permissions, and we can skip checking posix acls for the owner. + * With richacls, the owner may be granted fewer permissions than the + * mode bits seem to suggest (for example, append but not write), and + * we always need to check the richacl. + */ + + if (IS_RICHACL(inode)) { + int error = check_richacl(inode, mask); + if (error != -EAGAIN) + return error; + } if (likely(uid_eq(current_fsuid(), inode->i_uid))) mode >>= 6; else { if (IS_POSIXACL(inode) && (mode & S_IRWXG)) { - int error = check_acl(inode, mask); + int error = check_posix_acl(inode, mask); if (error != -EAGAIN) return error; } -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:04:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3886A7CDC for ; Tue, 16 Aug 2016 06:04:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E25A88F8173 for ; Tue, 16 Aug 2016 04:04:57 -0700 (PDT) X-ASG-Debug-ID: 1471345496-0bf81563e71b730001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Cgo3FHyBRH9BV3HI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:04:56 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3C85985547; Tue, 16 Aug 2016 11:04:56 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fm006464; Tue, 16 Aug 2016 07:04:51 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: Andreas Gruenbacher , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org Subject: [PATCH v25 20/22] vfs: Move check_posix_acl and check_richacl out of fs/namei.c Date: Tue, 16 Aug 2016 13:03:01 +0200 X-ASG-Orig-Subj: [PATCH v25 20/22] vfs: Move check_posix_acl and check_richacl out of fs/namei.c Message-Id: <1471345383-15334-21-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 16 Aug 2016 11:04:56 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345496 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6469 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 By moving those functions into fs/posix_acl.c and fs/richacl.c, the ifdefs can be moved into include/linux/posix_acl.h and include/linux/richacl.h. This may be seen as a small improvement. Suggested-by: Jeff Layton Signed-off-by: Andreas Gruenbacher --- fs/namei.c | 72 ++++------------------------------------------- fs/posix_acl.c | 28 ++++++++++++++++++ fs/richacl.c | 28 ++++++++++++++++++ include/linux/posix_acl.h | 5 ++++ include/linux/richacl.h | 8 ++++++ 5 files changed, 74 insertions(+), 67 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 63feb3c..3830ef1 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -258,73 +258,6 @@ void putname(struct filename *name) __putname(name); } -static int check_richacl(struct inode *inode, int mask) -{ -#ifdef CONFIG_FS_RICHACL - if (mask & MAY_NOT_BLOCK) { - struct base_acl *base_acl; - - base_acl = rcu_dereference(inode->i_acl); - if (!base_acl) - goto no_acl; - /* no ->get_richacl() calls in RCU mode... */ - if (is_uncached_acl(base_acl)) - return -ECHILD; - return richacl_permission(inode, richacl(base_acl), - mask & ~MAY_NOT_BLOCK); - } else { - struct richacl *acl; - - acl = get_richacl(inode); - if (IS_ERR(acl)) - return PTR_ERR(acl); - if (acl) { - int error = richacl_permission(inode, acl, mask); - richacl_put(acl); - return error; - } - } -no_acl: -#endif - if (mask & (MAY_DELETE_SELF | MAY_TAKE_OWNERSHIP | - MAY_CHMOD | MAY_SET_TIMES)) { - /* File permission bits cannot grant this. */ - return -EACCES; - } - return -EAGAIN; -} - -static int check_posix_acl(struct inode *inode, int mask) -{ -#ifdef CONFIG_FS_POSIX_ACL - if (mask & MAY_NOT_BLOCK) { - struct base_acl *base_acl; - - base_acl = rcu_dereference(inode->i_acl); - if (!base_acl) - return -EAGAIN; - /* no ->get_acl() calls in RCU mode... */ - if (is_uncached_acl(base_acl)) - return -ECHILD; - return posix_acl_permission(inode, posix_acl(base_acl), - mask & ~MAY_NOT_BLOCK); - } else { - struct posix_acl *acl; - - acl = get_acl(inode, ACL_TYPE_ACCESS); - if (IS_ERR(acl)) - return PTR_ERR(acl); - if (acl) { - int error = posix_acl_permission(inode, acl, mask); - posix_acl_release(acl); - return error; - } - } -#endif - - return -EAGAIN; -} - /* * This does the basic permission checking */ @@ -344,6 +277,11 @@ static int acl_permission_check(struct inode *inode, int mask) int error = check_richacl(inode, mask); if (error != -EAGAIN) return error; + if (mask & (MAY_DELETE_SELF | MAY_TAKE_OWNERSHIP | + MAY_CHMOD | MAY_SET_TIMES)) { + /* File permission bits cannot grant this. */ + return -EACCES; + } } if (likely(uid_eq(current_fsuid(), inode->i_uid))) mode >>= 6; diff --git a/fs/posix_acl.c b/fs/posix_acl.c index f7e1a29..6415675 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -374,6 +374,34 @@ check_perm: return -EACCES; } +int check_posix_acl(struct inode *inode, int mask) +{ + if (mask & MAY_NOT_BLOCK) { + struct base_acl *base_acl; + + base_acl = rcu_dereference(inode->i_acl); + if (!base_acl) + return -EAGAIN; + /* no ->get_acl() calls in RCU mode... */ + if (is_uncached_acl(base_acl)) + return -ECHILD; + return posix_acl_permission(inode, posix_acl(base_acl), + mask & ~MAY_NOT_BLOCK); + } else { + struct posix_acl *acl; + + acl = get_acl(inode, ACL_TYPE_ACCESS); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + int error = posix_acl_permission(inode, acl, mask); + posix_acl_release(acl); + return error; + } + } + return -EAGAIN; +} + /* * Modify acl when creating a new inode. The caller must ensure the acl is * only referenced once. diff --git a/fs/richacl.c b/fs/richacl.c index 1945691..ece9d0b 100644 --- a/fs/richacl.c +++ b/fs/richacl.c @@ -385,6 +385,34 @@ out: } EXPORT_SYMBOL_GPL(richacl_permission); +int check_richacl(struct inode *inode, int mask) +{ + if (mask & MAY_NOT_BLOCK) { + struct base_acl *base_acl; + + base_acl = rcu_dereference(inode->i_acl); + if (!base_acl) + return -EAGAIN; + /* no ->get_richacl() calls in RCU mode... */ + if (is_uncached_acl(base_acl)) + return -ECHILD; + return richacl_permission(inode, richacl(base_acl), + mask & ~MAY_NOT_BLOCK); + } else { + struct richacl *acl; + + acl = get_richacl(inode); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + int error = richacl_permission(inode, acl, mask); + richacl_put(acl); + return error; + } + } + return -EAGAIN; +} + /* * Note: functions like richacl_allowed_to_who(), richacl_group_class_allowed(), * and richacl_compute_max_masks() iterate through the entire acl in reverse diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index eafb358..07225c1 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -94,6 +94,7 @@ extern struct posix_acl *get_posix_acl(struct inode *, int); extern int set_posix_acl(struct inode *, int, struct posix_acl *); #ifdef CONFIG_FS_POSIX_ACL +extern int check_posix_acl(struct inode *, int); extern int posix_acl_chmod(struct inode *, umode_t); extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, struct posix_acl **); @@ -112,6 +113,10 @@ static inline void cache_no_acl(struct inode *inode) inode->i_default_acl = NULL; } #else +static inline int check_posix_acl(struct inode *inode, int mask) { + return -EAGAIN; +} + static inline int posix_acl_chmod(struct inode *inode, umode_t mode) { return 0; diff --git a/include/linux/richacl.h b/include/linux/richacl.h index 7530920..368e918 100644 --- a/include/linux/richacl.h +++ b/include/linux/richacl.h @@ -207,4 +207,12 @@ extern struct richacl *richacl_inherit(const struct richacl *, int); extern struct richacl *richacl_create(umode_t *, struct inode *); extern int set_richacl(struct inode *, struct richacl *); +#ifdef CONFIG_FS_RICHACL +extern int check_richacl(struct inode *, int); +#else +static inline int check_richacl(struct inode *inode, int mask) { + return -EAGAIN; +} +#endif /* CONFIG_FS_RICHACL */ + #endif /* __RICHACL_H */ -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:05:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 685917CE1 for ; Tue, 16 Aug 2016 06:05:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38D748F8173 for ; Tue, 16 Aug 2016 04:05:04 -0700 (PDT) X-ASG-Debug-ID: 1471345502-0bf57b64af1ac30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1NVP3E75brB5hzFc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:05:02 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A05F73B72D; Tue, 16 Aug 2016 11:05:01 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fn006464; Tue, 16 Aug 2016 07:04:56 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: "Aneesh Kumar K.V" , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Gruenbacher Subject: [PATCH v25 21/22] ext4: Add richacl support Date: Tue, 16 Aug 2016 13:03:02 +0200 X-ASG-Orig-Subj: [PATCH v25 21/22] ext4: Add richacl support Message-Id: <1471345383-15334-22-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 16 Aug 2016 11:05:01 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345502 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11555 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: "Aneesh Kumar K.V" Support the richacl permission model in ext4. The richacls are stored in "system.richacl" xattrs. Richacls need to be enabled by tune2fs or at file system create time. Signed-off-by: Aneesh Kumar K.V Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- fs/ext4/Kconfig | 11 +++++ fs/ext4/Makefile | 1 + fs/ext4/file.c | 3 ++ fs/ext4/ialloc.c | 11 ++++- fs/ext4/inode.c | 5 +- fs/ext4/namei.c | 5 ++ fs/ext4/richacl.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/ext4/richacl.h | 40 ++++++++++++++++ fs/ext4/xattr.c | 7 +++ include/linux/acl.h | 15 ++++++ 10 files changed, 228 insertions(+), 4 deletions(-) create mode 100644 fs/ext4/richacl.c create mode 100644 fs/ext4/richacl.h create mode 100644 include/linux/acl.h diff --git a/fs/ext4/Kconfig b/fs/ext4/Kconfig index e38039f..72acd01 100644 --- a/fs/ext4/Kconfig +++ b/fs/ext4/Kconfig @@ -22,6 +22,17 @@ config EXT3_FS_POSIX_ACL This config option is here only for backward compatibility. ext3 filesystem is now handled by the ext4 driver. +config EXT4_FS_RICHACL + bool "Ext4 Rich Access Control Lists" + depends on EXT4_FS + select FS_RICHACL + help + Richacls are an implementation of NFSv4 ACLs, extended by file masks + to cleanly integrate into the POSIX file permission model. To learn + more about them, see http://www.bestbits.at/richacl/. + + If you don't know what Richacls are, say N. + config EXT3_FS_SECURITY bool "Ext3 Security Labels" depends on EXT3_FS diff --git a/fs/ext4/Makefile b/fs/ext4/Makefile index 354103f..c65d2675 100644 --- a/fs/ext4/Makefile +++ b/fs/ext4/Makefile @@ -12,3 +12,4 @@ ext4-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o page-io.o \ ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o +ext4-$(CONFIG_EXT4_FS_RICHACL) += richacl.o diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 261ac37..79db060 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -30,6 +30,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "richacl.h" /* * Called when an inode is released. Note that this is different @@ -717,6 +718,8 @@ const struct inode_operations ext4_file_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, .fiemap = ext4_fiemap, }; diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 9e66cd1..8ce6051 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c @@ -27,6 +27,7 @@ #include "ext4_jbd2.h" #include "xattr.h" #include "acl.h" +#include "richacl.h" #include @@ -729,6 +730,14 @@ out: return ret; } +static inline int +ext4_new_acl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + if (IS_RICHACL(dir)) + return ext4_init_richacl(handle, inode, dir); + return ext4_init_acl(handle, inode, dir); +} + /* * There are two policies for allocating an inode. If the new inode is * a directory, then a forward search is made for a block group with both @@ -1093,7 +1102,7 @@ got: if (err) goto fail_drop; - err = ext4_init_acl(handle, inode, dir); + err = ext4_new_acl(handle, inode, dir); if (err) goto fail_free_drop; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3131747..e0f9702 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -37,10 +37,10 @@ #include #include #include +#include #include "ext4_jbd2.h" #include "xattr.h" -#include "acl.h" #include "truncate.h" #include @@ -5212,8 +5212,7 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) ext4_orphan_del(NULL, inode); if (!rc && (ia_valid & ATTR_MODE)) - rc = posix_acl_chmod(inode, inode->i_mode); - + rc = acl_chmod(inode); err_out: ext4_std_error(inode->i_sb, error); if (!error) diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 34c0142..2ca3efa 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c @@ -38,6 +38,7 @@ #include "xattr.h" #include "acl.h" +#include "richacl.h" #include /* @@ -3888,6 +3889,8 @@ const struct inode_operations ext4_dir_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, .fiemap = ext4_fiemap, }; @@ -3899,4 +3902,6 @@ const struct inode_operations ext4_special_inode_operations = { .removexattr = generic_removexattr, .get_acl = ext4_get_acl, .set_acl = ext4_set_acl, + .get_richacl = ext4_get_richacl, + .set_richacl = ext4_set_richacl, }; diff --git a/fs/ext4/richacl.c b/fs/ext4/richacl.c new file mode 100644 index 0000000..0c316ff --- /dev/null +++ b/fs/ext4/richacl.c @@ -0,0 +1,134 @@ +/* + * Copyright IBM Corporation, 2010 + * Copyright (C) 2015 Red Hat, Inc. + * Author: Aneesh Kumar K.V , + * Andreas Gruenbacher + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#include +#include +#include + +#include "ext4.h" +#include "ext4_jbd2.h" +#include "xattr.h" +#include "acl.h" +#include "richacl.h" + +struct richacl * +ext4_get_richacl(struct inode *inode) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + void *value = NULL; + struct richacl *acl = NULL; + int retval; + + retval = ext4_xattr_get(inode, name_index, "", NULL, 0); + if (retval > 0) { + value = kmalloc(retval, GFP_NOFS); + if (!value) + return ERR_PTR(-ENOMEM); + retval = ext4_xattr_get(inode, name_index, "", value, retval); + } + if (retval > 0) + acl = richacl_from_xattr(&init_user_ns, value, retval, -EIO); + else if (retval != -ENODATA && retval != -ENOSYS) + acl = ERR_PTR(retval); + kfree(value); + + return acl; +} + +static int +__ext4_remove_richacl(handle_t *handle, struct inode *inode) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + int retval; + + retval = ext4_xattr_set_handle(handle, inode, name_index, "", + NULL, 0, 0); + if (!retval) + set_cached_richacl(inode, NULL); + return retval; +} + +static int +__ext4_set_richacl(handle_t *handle, struct inode *inode, struct richacl *acl) +{ + const int name_index = EXT4_XATTR_INDEX_RICHACL; + umode_t mode = inode->i_mode; + int retval, size; + void *value; + + if (richacl_equiv_mode(acl, &mode) == 0) { + inode->i_ctime = ext4_current_time(inode); + inode->i_mode = mode; + ext4_mark_inode_dirty(handle, inode); + return __ext4_remove_richacl(handle, inode); + } + + mode &= ~S_IRWXUGO; + mode |= richacl_masks_to_mode(acl); + + size = richacl_xattr_size(acl); + value = kmalloc(size, GFP_NOFS); + if (!value) + return -ENOMEM; + richacl_to_xattr(&init_user_ns, acl, value, size); + inode->i_mode = mode; + retval = ext4_xattr_set_handle(handle, inode, name_index, "", + value, size, 0); + kfree(value); + if (retval) + return retval; + + set_cached_richacl(inode, acl); + + return 0; +} + +int +ext4_set_richacl(struct inode *inode, struct richacl *acl) +{ + handle_t *handle; + int retval, retries = 0; + +retry: + handle = ext4_journal_start(inode, EXT4_HT_XATTR, + ext4_jbd2_credits_xattr(inode)); + if (IS_ERR(handle)) + return PTR_ERR(handle); + + if (acl) + retval = __ext4_set_richacl(handle, inode, acl); + else + retval = __ext4_remove_richacl(handle, inode); + + ext4_journal_stop(handle); + if (retval == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) + goto retry; + return retval; +} + +int +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + struct richacl *acl = richacl_create(&inode->i_mode, dir); + int error; + + error = PTR_ERR(acl); + if (!IS_ERR_OR_NULL(acl)) { + error = __ext4_set_richacl(handle, inode, acl); + richacl_put(acl); + } + return error; +} diff --git a/fs/ext4/richacl.h b/fs/ext4/richacl.h new file mode 100644 index 0000000..6fe9a92 --- /dev/null +++ b/fs/ext4/richacl.h @@ -0,0 +1,40 @@ +/* + * Copyright IBM Corporation, 2010 + * Copyright (C) 2015 Red Hat, Inc. + * Author Aneesh Kumar K.V + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser General Public License + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef __FS_EXT4_RICHACL_H +#define __FS_EXT4_RICHACL_H + +#include + +#ifdef CONFIG_EXT4_FS_RICHACL + +extern struct richacl *ext4_get_richacl(struct inode *); +extern int ext4_set_richacl(struct inode *, struct richacl *); + +extern int ext4_init_richacl(handle_t *, struct inode *, struct inode *); + +#else /* CONFIG_EXT4_FS_RICHACL */ + +#define ext4_get_richacl NULL +#define ext4_set_richacl NULL + +static inline int +ext4_init_richacl(handle_t *handle, struct inode *inode, struct inode *dir) +{ + return 0; +} + +#endif /* CONFIG_EXT4_FS_RICHACL */ +#endif /* __FS_EXT4_RICHACL_H */ diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index 39e9cfb..c7e8519 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c @@ -55,6 +55,7 @@ #include #include #include +#include #include "ext4_jbd2.h" #include "ext4.h" #include "xattr.h" @@ -97,6 +98,9 @@ static const struct xattr_handler *ext4_xattr_handler_map[] = { #ifdef CONFIG_EXT4_FS_SECURITY [EXT4_XATTR_INDEX_SECURITY] = &ext4_xattr_security_handler, #endif +#ifdef CONFIG_EXT4_FS_RICHACL + [EXT4_XATTR_INDEX_RICHACL] = &richacl_xattr_handler, +#endif }; const struct xattr_handler *ext4_xattr_handlers[] = { @@ -109,6 +113,9 @@ const struct xattr_handler *ext4_xattr_handlers[] = { #ifdef CONFIG_EXT4_FS_SECURITY &ext4_xattr_security_handler, #endif +#ifdef CONFIG_EXT4_FS_RICHACL + &richacl_xattr_handler, +#endif NULL }; diff --git a/include/linux/acl.h b/include/linux/acl.h new file mode 100644 index 0000000..3c3b5ce --- /dev/null +++ b/include/linux/acl.h @@ -0,0 +1,15 @@ +#ifndef __LINUX_ACL_H +#define __LINUX_ACL_H + +#include +#include + +static inline int +acl_chmod(struct inode *inode) +{ + if (IS_RICHACL(inode)) + return richacl_chmod(inode, inode->i_mode); + return posix_acl_chmod(inode, inode->i_mode); +} + +#endif -- 2.7.4 From agruenba@redhat.com Tue Aug 16 06:05:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 59DD97CA6 for ; Tue, 16 Aug 2016 06:05:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 11ECF8F8173 for ; Tue, 16 Aug 2016 04:05:09 -0700 (PDT) X-ASG-Debug-ID: 1471345507-0bf81563e61b760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YuvhxuE79cKTRYvH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 04:05:07 -0700 (PDT) X-Barracuda-Envelope-From: agruenba@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 80E1AC04B30A; Tue, 16 Aug 2016 11:05:07 +0000 (UTC) Received: from nux.redhat.com (vpn1-4-81.ams2.redhat.com [10.36.4.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GB34Fo006464; Tue, 16 Aug 2016 07:05:02 -0400 From: Andreas Gruenbacher To: Alexander Viro Cc: "Aneesh Kumar K.V" , Christoph Hellwig , "Theodore Ts'o" , Andreas Dilger , "J. Bruce Fields" , Jeff Layton , Trond Myklebust , Anna Schumaker , Dave Chinner , linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, linux-api@vger.kernel.org, Andreas Gruenbacher Subject: [PATCH v25 22/22] ext4: Add richacl feature flag Date: Tue, 16 Aug 2016 13:03:03 +0200 X-ASG-Orig-Subj: [PATCH v25 22/22] ext4: Add richacl feature flag Message-Id: <1471345383-15334-23-git-send-email-agruenba@redhat.com> In-Reply-To: <1471345383-15334-1-git-send-email-agruenba@redhat.com> References: <1471345383-15334-1-git-send-email-agruenba@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 16 Aug 2016 11:05:07 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471345507 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5602 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 From: "Aneesh Kumar K.V" This feature flag selects richacl instead of POSIX ACL support on the filesystem. When this feature is off, the "acl" and "noacl" mount options control whether POSIX ACLs are enabled. When it is on, richacls are automatically enabled and using the "noacl" mount option leads to an error. Signed-off-by: Aneesh Kumar K.V Signed-off-by: Andreas Gruenbacher Reviewed-by: Andreas Dilger --- fs/ext4/ext4.h | 6 ++++-- fs/ext4/super.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index ea31931..a019d92 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -1114,7 +1114,7 @@ struct ext4_inode_info { #define EXT4_MOUNT_UPDATE_JOURNAL 0x01000 /* Update the journal format */ #define EXT4_MOUNT_NO_UID32 0x02000 /* Disable 32-bit UIDs */ #define EXT4_MOUNT_XATTR_USER 0x04000 /* Extended user attributes */ -#define EXT4_MOUNT_POSIX_ACL 0x08000 /* POSIX Access Control Lists */ +#define EXT4_MOUNT_ACL 0x08000 /* Access Control Lists */ #define EXT4_MOUNT_NO_AUTO_DA_ALLOC 0x10000 /* No auto delalloc mapping */ #define EXT4_MOUNT_BARRIER 0x20000 /* Use block barriers */ #define EXT4_MOUNT_QUOTA 0x80000 /* Some quota option set */ @@ -1698,6 +1698,7 @@ static inline void ext4_clear_state_flags(struct ext4_inode_info *ei) #define EXT4_FEATURE_INCOMPAT_LARGEDIR 0x4000 /* >2GB or 3-lvl htree */ #define EXT4_FEATURE_INCOMPAT_INLINE_DATA 0x8000 /* data in inode */ #define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000 +#define EXT4_FEATURE_INCOMPAT_RICHACL 0x20000 #define EXT4_FEATURE_COMPAT_FUNCS(name, flagname) \ static inline bool ext4_has_feature_##name(struct super_block *sb) \ @@ -1812,7 +1813,8 @@ EXT4_FEATURE_INCOMPAT_FUNCS(encrypt, ENCRYPT) EXT4_FEATURE_INCOMPAT_MMP | \ EXT4_FEATURE_INCOMPAT_INLINE_DATA | \ EXT4_FEATURE_INCOMPAT_ENCRYPT | \ - EXT4_FEATURE_INCOMPAT_CSUM_SEED) + EXT4_FEATURE_INCOMPAT_CSUM_SEED | \ + EXT4_FEATURE_INCOMPAT_RICHACL) #define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT4_FEATURE_RO_COMPAT_GDT_CSUM| \ diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 1c593aa..cc5f819 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1386,6 +1386,28 @@ static ext4_fsblk_t get_sb_block(void **data) return sb_block; } +static int enable_acl(struct super_block *sb) +{ + sb->s_flags &= ~(MS_POSIXACL | MS_RICHACL); + if (test_opt(sb, ACL)) { + if (EXT4_HAS_INCOMPAT_FEATURE(sb, + EXT4_FEATURE_INCOMPAT_RICHACL)) { +#ifdef CONFIG_EXT4_FS_RICHACL + sb->s_flags |= MS_RICHACL; +#else + return -EOPNOTSUPP; +#endif + } else { +#ifdef CONFIG_EXT4_FS_POSIX_ACL + sb->s_flags |= MS_POSIXACL; +#else + return -EOPNOTSUPP; +#endif + } + } + return 0; +} + #define DEFAULT_JOURNAL_IOPRIO (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, 3)) static char deprecated_msg[] = "Mount option \"%s\" will be removed by %s\n" "Contact linux-ext4@vger.kernel.org if you think we should keep it.\n"; @@ -1532,9 +1554,9 @@ static const struct mount_opts { MOPT_NO_EXT2 | MOPT_DATAJ}, {Opt_user_xattr, EXT4_MOUNT_XATTR_USER, MOPT_SET}, {Opt_nouser_xattr, EXT4_MOUNT_XATTR_USER, MOPT_CLEAR}, -#ifdef CONFIG_EXT4_FS_POSIX_ACL - {Opt_acl, EXT4_MOUNT_POSIX_ACL, MOPT_SET}, - {Opt_noacl, EXT4_MOUNT_POSIX_ACL, MOPT_CLEAR}, +#if defined(CONFIG_EXT4_FS_POSIX_ACL) || defined(CONFIG_EXT4_FS_RICHACL) + {Opt_acl, EXT4_MOUNT_ACL, MOPT_SET}, + {Opt_noacl, EXT4_MOUNT_ACL, MOPT_CLEAR}, #else {Opt_acl, 0, MOPT_NOSUPPORT}, {Opt_noacl, 0, MOPT_NOSUPPORT}, @@ -1582,6 +1604,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, #endif switch (token) { case Opt_noacl: +#ifdef CONFIG_EXT4_FS_RICHACL + if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RICHACL)) { + ext4_msg(sb, KERN_ERR, "Mount option \"%s\" incompatible " + "with richacl feature", opt); + return -1; + } +#endif case Opt_nouser_xattr: ext4_msg(sb, KERN_WARNING, deprecated_msg, opt, "3.5"); break; @@ -3364,8 +3393,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) set_opt(sb, NO_UID32); /* xattr user namespace & acls are now defaulted on */ set_opt(sb, XATTR_USER); -#ifdef CONFIG_EXT4_FS_POSIX_ACL - set_opt(sb, POSIX_ACL); +#if defined(CONFIG_EXT4_FS_POSIX_ACL) || defined(CONFIG_EXT4_FS_RICHACL) + set_opt(sb, ACL); #endif /* don't forget to enable journal_csum when metadata_csum is enabled. */ if (ext4_has_metadata_csum(sb)) @@ -3448,8 +3477,9 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sb->s_iflags |= SB_I_CGROUPWB; } - sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | - (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); + err = enable_acl(sb); + if (err) + goto failed_mount; if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV && (ext4_has_compat_features(sb) || @@ -4778,8 +4808,9 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) if (sbi->s_mount_flags & EXT4_MF_FS_ABORTED) ext4_abort(sb, "Abort forced by user"); - sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | - (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); + err = enable_acl(sb); + if (err) + goto restore_opts; es = sbi->s_es; -- 2.7.4 From info99@pcb2.com Tue Aug 16 08:21:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B63357CA0 for ; Tue, 16 Aug 2016 08:21:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 87E7830418D for ; Tue, 16 Aug 2016 06:21:49 -0700 (PDT) X-ASG-Debug-ID: 1471353702-0bf57c0cff21a90001-NocioJ Received: from pcb2.com ([14.155.107.134]) by cuda.sgi.com with SMTP id Z1BAPW4B7OPXvAXX for ; Tue, 16 Aug 2016 06:21:44 -0700 (PDT) X-Barracuda-Envelope-From: info99@pcb2.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.155.107.134] X-Barracuda-Apparent-Source-IP: 14.155.107.134 Sender: info99@pcb2.com Received: from XP-20151123CUNH[127.0.0.1] by XP-20151123CUNH[127.0.0.1] (SMTPD32); Tue, 16 Aug 2016 21:21:03 +0800 From: "market8@hqtcircuit.com" Subject: Re:Precision PCB,halogen free,impedance control... To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re:Precision PCB,halogen free,impedance control... MIME-Version: 1.0 Reply-To: market8@hqtcircuit.com Date: Tue, 16 Aug 2016 21:21:03 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.155.107.134] X-Barracuda-Start-Time: 1471353703 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3894 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.94 X-Barracuda-Spam-Status: No, SCORE=1.94 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, COMMA_SUBJECT, HTML_MESSAGE, MARKETING_SUBJECT, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32052 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160816132149.304E61940063@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC42MDAxLjIzNTIwIj48L0hFQUQ+DQo8Qk9EWT4NCjxESVY+DQo8RElWPg0KPERJ ViBzdHlsZT0iRk9OVC1TSVpFOiAxMXB0Ij4NCjxESVY+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVNJWkU6IDEycHQ7 IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6ICYj Mzk7QEFyaWFsIFVuaWNvZGUgTVMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog JiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDEuMDAwMHB0Ij4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8RElWPg0K PERJVj4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8 RElWPg0KPERJVj4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8RElWIHN0eWxlPSJGT05U LVNJWkU6IDExcHQiPg0KPERJVj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJB Q0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogJiMzOTtAQXJpYWwgVW5p Y29kZSBNUyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJn YigyNTUsMjU1LDI1NSkiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5l dyBSb21hbiYjMzk7OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4w MDAwcHQiPg0KPERJVj4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8RElWPg0KPERJVj4N CjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8RElWPg0KPERJVj4NCjxESVY+DQo8RElWPg0K PERJVj4NCjxESVY+SGksZnJpZW5kLCA8QlI+TmljZSBkYXkgdG8geW91ISA8QlI+SSYjMzk7bSBE YXJyZW4sbWFya2V0aW5nIG1hbmFnZXIgb2YgSFFUIA0KY2lyY3VpdC48QlI+Jm5ic3A7PEJSPjxG T05UIGNvbG9yPSMwMDAwZmY+V2UgcHJvZHVjZSAyLTI2IGxheWVycyBQQ0IgYW5kIA0KUmlnaWQt ZmxleCBjaXJjdWl0LjxCUj5NYXRlcmlhbDpGUjQsUm9nZXJzLEFsdW1pbnVtLFBJLEhhbG9nZW4g DQpmcmVlLjxCUj5CbGluZC9idXJpZWQgdmlhLGhhbGYgaG9sZSwwLjFtbSB2aWEsMC40bW0gYm9h cmQuPEJSPkhhcmQgDQpnb2xkLEVOSUcsSEFTTCBMRixPU1AuZXRjLjxCUj48L0ZPTlQ+Jm5ic3A7 PEJSPjxGT05UIGNvbG9yPSMwMDAwZmY+SW1tZWRpYXRlbHkgDQpzb2x2ZSB5b3VyIHByb2JsZW1z Jm5ic3A7PC9GT05UPjwvRElWPg0KPERJVj48Rk9OVCBjb2xvcj0jMDAwMGZmPkVmZmljaWVudGx5 IGNyZWF0ZSB2YWx1ZSBmb3IgeW91ITwvRk9OVD48L0RJVj48L0RJVj4NCjxESVY+Jm5ic3A7PC9E SVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+DQo8RElWPjwvU1BBTj48L1NQQU4+PEZPTlQgc2l6 ZT0zPg0KPEhSIHN0eWxlPSJXSURUSDogMjEwcHg7IEhFSUdIVDogMXB4IiBhbGlnbj1sZWZ0IGNv bG9yPSNiNWM0ZGYgU0laRT0xPg0KPC9GT05UPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElW PjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwv RElWPg0KPERJVj48U1BBTiBpZD1fRm94RlJPTU5BTUU+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6IOWui+S9kzsgQ09MT1I6ICMwMDAwMDA7IEZPTlQtU0laRTogMTAuNXB0Ij4NCjxESVYgc3R5 bGU9IkZPTlQtU0laRTogMTBwdCI+DQo8RElWIHN0eWxlPSJMSU5FLUhFSUdIVDogMjFweDsgRk9O VC1GQU1JTFk6IFRhaG9tYTsgRk9OVC1TSVpFOiAxNHB4Ij4NCjxESVYgc3R5bGU9IkxJTkUtSEVJ R0hUOiAyMXB4OyBGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDE0cHgiPg0KPERJViBz dHlsZT0iTElORS1IRUlHSFQ6IDIxcHg7IEZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0laRTog MTRweCI+DQo8RElWIHN0eWxlPSJGT05ULUZBTUlMWTogVGltZXMgTmV3IFJvbWFuOyBGT05ULVNJ WkU6IDEycHQiPg0KPERJVj4NCjxESVY+PEZPTlQgDQpmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPldl bGNvbWUmbmJzcDt5b3VyJm5ic3A7aW5xdWlyeSEmbmJzcDsmbmJzcDsmbmJzcDs8L0ZPTlQ+PC9E SVY+DQo8RElWPjxGT05UIA0KZmFjZT0iVGltZXMgTmV3IFJvbWFuIj5UaGFua3MmbmJzcDsmYW1w OyZuYnNwO1JlZ2FyZHMmbmJzcDsmbmJzcDs8L0ZPTlQ+PC9ESVY+DQo8RElWIHN0eWxlPSJGT05U LVdFSUdIVDogYm9sZCI+PEZPTlQgDQpmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPkRhcnJlbiZuYnNw O1BlbmcmbmJzcDs8L0ZPTlQ+PC9ESVY+DQo8RElWIHN0eWxlPSJGT05ULVdFSUdIVDogYm9sZCI+ PEZPTlQgDQpmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPk1hcmtldGluZyZuYnNwO01hbmFnZXImbmJz cDs8L0ZPTlQ+PC9ESVY+DQo8RElWIHN0eWxlPSJGT05ULVdFSUdIVDogYm9sZCI+PEZPTlQgDQpm YWNlPSJUaW1lcyBOZXcgUm9tYW4iPkhRVCZuYnNwO0NpcmN1aXQmbmJzcDsoc2hlbnpoZW4pJm5i c3A7TGltaXRlZCZuYnNwOzwvRk9OVD48L0RJVj4NCjxESVY+PEZPTlQgDQpmYWNlPSJUaW1lcyBO ZXcgUm9tYW4iPkFkZDombmJzcDtSb29tJm5ic3A7Tm8uJm5ic3A7MjA4fjIxNSwmbmJzcDtaaGlm dSZuYnNwO0J1aWxkaW5nLCZuYnNwO1BlbmdkYSZuYnNwO1JvYWQsJm5ic3A7PC9GT05UPjwvRElW Pg0KPERJVj48Rk9OVCANCmZhY2U9IlRpbWVzIE5ldyBSb21hbiI+TG9uZ2dhbmcmbmJzcDtEaXN0 cmljdCwmbmJzcDtTaGVuemhlbixDaGluYS4mbmJzcDs8L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05U IA0KZmFjZT0iVGltZXMgTmV3IFJvbWFuIj5Nb2JpbGU6MDA4NiZuYnNwOzE4NTg4NDUwMjU3Jm5i c3A7PC9GT05UPjwvRElWPg0KPERJViBzdHlsZT0iRk9OVC1XRUlHSFQ6IGJvbGQiPjxGT05UIA0K ZmFjZT0iVGltZXMgTmV3IFJvbWFuIj5XaGF0c0FwcDombmJzcDswMDg2Jm5ic3A7MTg1ODg0NTAy NTcmbmJzcDs8L0ZPTlQ+PC9ESVY+DQo8RElWPjxGT05UIA0KZmFjZT0iVGltZXMgTmV3IFJvbWFu Ij5UZWw6Jm5ic3A7MDA4NiZuYnNwOzc1NSZuYnNwOzgzMzkzMzc4PC9GT05UPjwvRElWPg0KPERJ Vj48Rk9OVCANCmZhY2U9IlRpbWVzIE5ldyBSb21hbiI+RmF4OiZuYnNwOzAwODYmbmJzcDs3NTUm bmJzcDs4MzQyMjk5MDwvRk9OVD48L0RJVj48L0RJVj48L0RJVj48L1NQQU4+PC9TUEFOPjwvRElW PjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwv RElWPjwvRElWPjwvU1BBTj48L1NQQU4+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9E SVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+PC9ESVY+ PC9CT0RZPjwvSFRNTD4NCg0K From billodo@redhat.com Tue Aug 16 09:16:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C2F027CA1 for ; Tue, 16 Aug 2016 09:16:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 609AB304101 for ; Tue, 16 Aug 2016 07:16:55 -0700 (PDT) X-ASG-Debug-ID: 1471357013-0bf81563e421b90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aNQetku6HaHl9XBu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 07:16:54 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BD193C04B320 for ; Tue, 16 Aug 2016 14:16:53 +0000 (UTC) Received: from localhost.localdomain.com (vpn-57-220.rdu2.redhat.com [10.10.57.220]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GEGp7h012243 for ; Tue, 16 Aug 2016 10:16:53 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v2 2/3] xfs_quota: changes to accomodate hoisted ioctl defs Date: Tue, 16 Aug 2016 09:16:37 -0500 X-ASG-Orig-Subj: [PATCH v2 2/3] xfs_quota: changes to accomodate hoisted ioctl defs Message-Id: <1471356998-2876-3-git-send-email-billodo@redhat.com> In-Reply-To: <1471356998-2876-1-git-send-email-billodo@redhat.com> References: <1471356998-2876-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 16 Aug 2016 14:16:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471357014 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3387 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The kernel commit to make the ioctl promotion (334e580a6f) moved the definitions for the XFS ioctl to uapi/linux/fs.h for the following reason: Hoist the ioctl definitions for the XFS_IOC_FS[SG]SETXATTR API from fs/xfs/libxfs/xfs_fs.h to include/uapi/linux/fs.h so that the ioctls can be used by all filesystems, not just XFS. This enables (initially) ext4 to use the ioctl to set project IDs on inodes. This means we now need to handle this change in userspace as the uapi/linux/fs.h file may not contain the definitions (i.e. new xfsprogs/ old linux uapi files) xfsprogs needs to build. Hence we need to massage the definition in xfs_fs.h to take the values from the system header if it exists, otherwise keep the old definitions for compatibility and platforms other than linux.. This patch was originally submitted by Dave Chinner (http://oss.sgi.com/archives/xfs/2016-02/msg00108.html) Resubmitting with changes to accomodate upstream changes since initial submission. Signed-off-by: Dave Chinner Signed-off-by: Bill O'Donnell --- libxfs/xfs_fs.h | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 085ea6f..6ecb7f2 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -35,10 +35,41 @@ struct dioattr { }; #endif +/* check whether we have to define FS_IOC_FS[GS]ETXATTR ourselves */ +#ifndef FS_IOC_FSGETXATTR +struct fsxattr { + __u32 fsx_xflags; /* xflags field value (get/set) */ + __u32 fsx_extsize; /* extsize field value (get/set)*/ + __u32 fsx_projid; /* project identifier (get/set) */ + unsigned char fsx_pad[12]; +}; + +/* + * Flags for the fsx_xflags field + */ +#define FS_XFLAG_REALTIME 0x00000001 /* data in realtime volume */ +#define FS_XFLAG_PREALLOC 0x00000002 /* preallocated file extents */ +#define FS_XFLAG_IMMUTABLE 0x00000008 /* file cannot be modified */ +#define FS_XFLAG_APPEND 0x00000010 /* all writes append */ +#define FS_XFLAG_SYNC 0x00000020 /* all writes synchronous */ +#define FS_XFLAG_NOATIME 0x00000040 /* do not update access time */ +#define FS_XFLAG_NODUMP 0x00000080 /* do not include in backups */ +#define FS_XFLAG_RTINHERIT 0x00000100 /* create with rt bit set */ +#define FS_XFLAG_PROJINHERIT 0x00000200 /* create with parents projid */ +#define FS_XFLAG_NOSYMLINKS 0x00000400 /* disallow symlink creation */ +#define FS_XFLAG_EXTSIZE 0x00000800 /* extent size allocator hint */ +#define FS_XFLAG_EXTSZINHERIT 0x00001000 /* inherit inode extent size */ +#define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ +#define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ +#define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ + +#define FS_IOC_FSGETXATTR _IOR ('X', 31, struct fsxattr) +#define FS_IOC_FSSETXATTR _IOW ('X', 32, struct fsxattr) + +#endif + /* - * Flags for the bs_xflags/fsx_xflags field in XFS_IOC_FS[GS]ETXATTR[A] - * These are for backwards compatibility only. New code should - * use the kernel [4.5 onwards] defined FS_XFLAG_* definitions directly. + * Flags for the bs_xflags/fsx_xflags field in FS_IOC_FS[GS]ETXATTR[A] */ #define XFS_XFLAG_REALTIME FS_XFLAG_REALTIME #define XFS_XFLAG_PREALLOC FS_XFLAG_PREALLOC -- 2.7.4 From billodo@redhat.com Tue Aug 16 09:16:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 982737CA1 for ; Tue, 16 Aug 2016 09:16:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 69E30304101 for ; Tue, 16 Aug 2016 07:16:56 -0700 (PDT) X-ASG-Debug-ID: 1471357014-0bf57c0d0124890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LO3QuKRt6RfrLOCs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 07:16:55 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6E16A81112 for ; Tue, 16 Aug 2016 14:16:54 +0000 (UTC) Received: from localhost.localdomain.com (vpn-57-220.rdu2.redhat.com [10.10.57.220]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GEGp7i012243 for ; Tue, 16 Aug 2016 10:16:53 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 Date: Tue, 16 Aug 2016 09:16:38 -0500 X-ASG-Orig-Subj: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 Message-Id: <1471356998-2876-4-git-send-email-billodo@redhat.com> In-Reply-To: <1471356998-2876-1-git-send-email-billodo@redhat.com> References: <1471356998-2876-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 16 Aug 2016 14:16:54 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471357014 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2372 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Further changes to allow xfs_quota to be used on foreign filesystem(s) (e.g. ext4) for project quota testing in xfstests. Add CMD_FLAG_GENERIC to enable generic xfs_quota commands (help and quit) when xfs_quota is run on foreign filesystems. Use CMD_FLAG_FOREIGN_OK on commands suitable for foreign filesystems. Signed-off-by: Bill O'Donnell --- include/command.h | 1 + libxcmd/help.c | 3 ++- libxcmd/quit.c | 3 ++- quota/init.c | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/include/command.h b/include/command.h index 81d5a4d..1c2898a 100644 --- a/include/command.h +++ b/include/command.h @@ -22,6 +22,7 @@ #define CMD_FLAG_GLOBAL (1<<31) /* don't iterate "args" */ #define CMD_FLAG_FOREIGN_OK (1<<30) /* command not restricted to XFS */ +#define CMD_FLAG_GENERIC (1<<29) /* command is generic (help, quit) */ typedef int (*cfunc_t)(int argc, char **argv); typedef void (*helpfunc_t)(void); diff --git a/libxcmd/help.c b/libxcmd/help.c index fad0ab9..be26765 100644 --- a/libxcmd/help.c +++ b/libxcmd/help.c @@ -88,7 +88,8 @@ help_init(void) help_cmd.cfunc = help_f; help_cmd.argmin = 0; help_cmd.argmax = 1; - help_cmd.flags = CMD_FLAG_GLOBAL; + help_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | + CMD_FLAG_GENERIC; help_cmd.args = _("[command]"); help_cmd.oneline = _("help for one or all commands"); diff --git a/libxcmd/quit.c b/libxcmd/quit.c index 0183b8f..2a27c89 100644 --- a/libxcmd/quit.c +++ b/libxcmd/quit.c @@ -38,7 +38,8 @@ quit_init(void) quit_cmd.cfunc = quit_f; quit_cmd.argmin = -1; quit_cmd.argmax = -1; - quit_cmd.flags = CMD_FLAG_GLOBAL; + quit_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | + CMD_FLAG_GENERIC; quit_cmd.oneline = _("exit the program"); add_command(&quit_cmd); diff --git a/quota/init.c b/quota/init.c index d5d80c2..85931bf 100644 --- a/quota/init.c +++ b/quota/init.c @@ -104,7 +104,8 @@ init_check_command( const cmdinfo_t *ct) { if (fs_path && - !(ct->flags & CMD_FLAG_FOREIGN_OK) && + !((ct->flags & CMD_FLAG_FOREIGN_OK) && foreign_allowed) && + !(ct->flags & CMD_FLAG_GENERIC) && (fs_path->fs_flags & FS_FOREIGN)) { fprintf(stderr, _("foreign mount active, %s command is for XFS filesystems only\n"), -- 2.7.4 From billodo@redhat.com Tue Aug 16 09:16:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 14B207CA1 for ; Tue, 16 Aug 2016 09:16:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA10F304101 for ; Tue, 16 Aug 2016 07:16:53 -0700 (PDT) X-ASG-Debug-ID: 1471357012-0bf57c0cfe24870001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iEWeye21rBFDPG2R (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 07:16:52 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4431A4E32F for ; Tue, 16 Aug 2016 14:16:52 +0000 (UTC) Received: from localhost.localdomain.com (vpn-57-220.rdu2.redhat.com [10.10.57.220]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GEGp7f012243 for ; Tue, 16 Aug 2016 10:16:51 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v2 0/3] xfs_quota: allow operation on ext4 for project quotas Date: Tue, 16 Aug 2016 09:16:35 -0500 X-ASG-Orig-Subj: [PATCH v2 0/3] xfs_quota: allow operation on ext4 for project quotas Message-Id: <1471356998-2876-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 16 Aug 2016 14:16:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471357012 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 823 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello - I'm submitting a version 2 to clarify patch 1 loop logic correction. This is a resubmission of Dave Chinner's original 2-patch series to enable using xfs_quota for project quotas on foreign filesystems (e.g. ext4). Original series: http://oss.sgi.com/archives/xfs/2016-02/msg00107.html Updated series: Patch 1: initial capabilities to enable xfs_quota use on foreign filesystems. Patch 2: userspace changes to accomodate hoisted ioctl defs in kernel Patch 3: additional changes to accomodate xfs_quota use on foreign filesystems. History: ----- v1: http://oss.sgi.com/archives/xfs/2016-08/msg00435.html v2: patch 1: slight logic modification to clarify loop in init_args_command (functional equivalent) ----- Again, questions and comments are welcome. Thanks- Bill From billodo@redhat.com Tue Aug 16 09:16:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A8AF97CA0 for ; Tue, 16 Aug 2016 09:16:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B5A1304118 for ; Tue, 16 Aug 2016 07:16:55 -0700 (PDT) X-ASG-Debug-ID: 1471357013-0bf57b64ae20e10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5rkeWUWxLvyurvOC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 07:16:53 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 299033113 for ; Tue, 16 Aug 2016 14:16:53 +0000 (UTC) Received: from localhost.localdomain.com (vpn-57-220.rdu2.redhat.com [10.10.57.220]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7GEGp7g012243 for ; Tue, 16 Aug 2016 10:16:52 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 Date: Tue, 16 Aug 2016 09:16:36 -0500 X-ASG-Orig-Subj: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 Message-Id: <1471356998-2876-2-git-send-email-billodo@redhat.com> In-Reply-To: <1471356998-2876-1-git-send-email-billodo@redhat.com> References: <1471356998-2876-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 16 Aug 2016 14:16:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471357013 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11645 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This allows xfs_quota to be used on ext4 for project quota testing in xfstests. This patch was originally submitted by Dave Chinner (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html) Resubmitting with the following change: quota/init.c: correct logic error in loop contained in init_args_command() function (lines 85-91). Signed-off-by: Dave Chinner Signed-off-by: Bill O'Donnell --- include/command.h | 3 ++- include/path.h | 1 + io/init.h | 2 +- libxcmd/paths.c | 7 +++---- quota/free.c | 2 ++ quota/init.c | 29 +++++++++++++++++++++++++++-- quota/init.h | 1 + quota/path.c | 5 +++-- quota/project.c | 1 + quota/quot.c | 1 + quota/quota.c | 2 ++ quota/report.c | 11 +++++++++-- quota/state.c | 4 +++- quota/util.c | 1 + 14 files changed, 57 insertions(+), 13 deletions(-) diff --git a/include/command.h b/include/command.h index 7b9fc28..81d5a4d 100644 --- a/include/command.h +++ b/include/command.h @@ -20,7 +20,8 @@ #include -#define CMD_FLAG_GLOBAL ((int)0x80000000) /* don't iterate "args" */ +#define CMD_FLAG_GLOBAL (1<<31) /* don't iterate "args" */ +#define CMD_FLAG_FOREIGN_OK (1<<30) /* command not restricted to XFS */ typedef int (*cfunc_t)(int argc, char **argv); typedef void (*helpfunc_t)(void); diff --git a/include/path.h b/include/path.h index 46a887e..39c1a95 100644 --- a/include/path.h +++ b/include/path.h @@ -29,6 +29,7 @@ #define FS_MOUNT_POINT (1<<0) #define FS_PROJECT_PATH (1<<1) +#define FS_FOREIGN (1<<2) typedef struct fs_path { char *fs_name; /* Data device for filesystem */ diff --git a/io/init.h b/io/init.h index d773b1b..bb25242 100644 --- a/io/init.h +++ b/io/init.h @@ -18,7 +18,7 @@ #define CMD_NOFILE_OK (1<<0) /* command doesn't need an open file */ #define CMD_NOMAP_OK (1<<1) /* command doesn't need a mapped region */ -#define CMD_FOREIGN_OK (1<<2) /* command not restricted to XFS files */ +#define CMD_FOREIGN_OK CMD_FLAG_FOREIGN_OK extern char *progname; extern int exitcode; diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 71af25f..7c8c673 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -113,6 +113,9 @@ fs_table_insert( goto out_nodev; } + if (!platform_test_xfs_path(dir)) + flags |= FS_FOREIGN; + /* * Make copies of the directory and data device path. * The log device and real-time device, if non-null, @@ -301,8 +304,6 @@ fs_table_initialise_mounts( return errno; while ((mnt = getmntent(mtp)) != NULL) { - if (strcmp(mnt->mnt_type, "xfs") != 0) - continue; if (!realpath(mnt->mnt_dir, rmnt_dir)) continue; if (!realpath(mnt->mnt_fsname, rmnt_fsname)) @@ -360,8 +361,6 @@ fs_table_initialise_mounts( return errno; for (i = 0; i < count; i++) { - if (strcmp(stats[i].f_fstypename, "xfs") != 0) - continue; if (!realpath(stats[i].f_mntfromname, rmntfromname)) continue; if (!realpath(stats[i].f_mntonname, rmntonname)) diff --git a/quota/free.c b/quota/free.c index e9e0319..b9be954 100644 --- a/quota/free.c +++ b/quota/free.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include "init.h" #include "quota.h" @@ -371,6 +372,7 @@ free_init(void) free_cmd.args = _("[-bir] [-hn] [-f file]"); free_cmd.oneline = _("show free and used counts for blocks and inodes"); free_cmd.help = free_help; + free_cmd.flags = CMD_FLAG_FOREIGN_OK; add_command(&free_cmd); } diff --git a/quota/init.c b/quota/init.c index 52f7941..d5d80c2 100644 --- a/quota/init.c +++ b/quota/init.c @@ -24,6 +24,7 @@ char *progname; int exitcode; int expert; +bool foreign_allowed = false; static char **projopts; /* table of project names (cmdline) */ static int nprojopts; /* number of entries in name table. */ @@ -83,15 +84,36 @@ init_args_command( do { fs_path = &fs_table[index++]; - } while ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count); + if (!(fs_path->fs_flags & FS_PROJECT_PATH)) + break; + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + continue; + } while (index < fs_count); if (fs_path->fs_flags & FS_PROJECT_PATH) return 0; + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + return 0; if (index > fs_count) return 0; return index; } +static int +init_check_command( + const cmdinfo_t *ct) +{ + if (fs_path && + !(ct->flags & CMD_FLAG_FOREIGN_OK) && + (fs_path->fs_flags & FS_FOREIGN)) { + fprintf(stderr, + _("foreign mount active, %s command is for XFS filesystems only\n"), + ct->name); + return 0; + } + return 1; +} + static void init( int argc, @@ -104,7 +126,7 @@ init( bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - while ((c = getopt(argc, argv, "c:d:D:P:p:t:xV")) != EOF) { + while ((c = getopt(argc, argv, "c:d:D:fP:p:t:xV")) != EOF) { switch (c) { case 'c': /* commands */ add_user_command(optarg); @@ -112,6 +134,8 @@ init( case 'd': add_project_opt(optarg); break; + case 'f': + foreign_allowed = true; case 't': mtab_file = optarg; break; @@ -140,6 +164,7 @@ init( init_commands(); add_args_command(init_args_command); + add_check_command(init_check_command); /* * Ensure that global commands don't end up with an invalid path pointer diff --git a/quota/init.h b/quota/init.h index 71706cb..6879855 100644 --- a/quota/init.h +++ b/quota/init.h @@ -19,6 +19,7 @@ extern char *progname; extern int exitcode; extern int expert; +extern bool foreign_allowed; extern void edit_init(void); extern void free_init(void); diff --git a/quota/path.c b/quota/path.c index bdb8c98..a623d25 100644 --- a/quota/path.c +++ b/quota/path.c @@ -42,6 +42,7 @@ printpath( if (number) { printf(_("%c%03d%c "), braces? '[':' ', index, braces? ']':' '); } + printf("%s ", (path->fs_flags & FS_FOREIGN) ? "(F)" : " "); printf(_("%-19s %s"), path->fs_dir, path->fs_name); if (path->fs_flags & FS_PROJECT_PATH) { prj = getprprid(path->fs_prid); @@ -127,7 +128,7 @@ path_init(void) path_cmd.cfunc = path_f; path_cmd.argmin = 0; path_cmd.argmax = 1; - path_cmd.flags = CMD_FLAG_GLOBAL; + path_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; path_cmd.oneline = _("set current path, or show the list of paths"); print_cmd.name = "print"; @@ -135,7 +136,7 @@ path_init(void) print_cmd.cfunc = print_f; print_cmd.argmin = 0; print_cmd.argmax = 0; - print_cmd.flags = CMD_FLAG_GLOBAL; + print_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; print_cmd.oneline = _("list known mount points and projects"); if (expert) diff --git a/quota/project.c b/quota/project.c index fb8b9e1..e4e7a01 100644 --- a/quota/project.c +++ b/quota/project.c @@ -355,6 +355,7 @@ project_init(void) project_cmd.argmax = -1; project_cmd.oneline = _("check, setup or clear project quota trees"); project_cmd.help = project_help; + project_cmd.flags = CMD_FLAG_FOREIGN_OK; if (expert) add_command(&project_cmd); diff --git a/quota/quot.c b/quota/quot.c index 2e583e5..ccc154f 100644 --- a/quota/quot.c +++ b/quota/quot.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include #include diff --git a/quota/quota.c b/quota/quota.c index e0da7c0..d09e239 100644 --- a/quota/quota.c +++ b/quota/quota.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include #include @@ -469,6 +470,7 @@ quota_init(void) quota_cmd.args = _("[-bir] [-g|-p|-u] [-hnNv] [-f file] [id|name]..."); quota_cmd.oneline = _("show usage and limits"); quota_cmd.help = quota_help; + quota_cmd.flags = CMD_FLAG_FOREIGN_OK; add_command("a_cmd); } diff --git a/quota/report.c b/quota/report.c index 70220b4..604f50d 100644 --- a/quota/report.c +++ b/quota/report.c @@ -15,7 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include #include "command.h" #include #include @@ -618,6 +618,8 @@ report_any_type( if (type & XFS_USER_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_USER_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -629,6 +631,8 @@ report_any_type( if (type & XFS_GROUP_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_GROUP_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -640,6 +644,8 @@ report_any_type( if (type & XFS_PROJ_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_PROJ_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -754,16 +760,17 @@ report_init(void) dump_cmd.args = _("[-g|-p|-u] [-f file]"); dump_cmd.oneline = _("dump quota information for backup utilities"); dump_cmd.help = dump_help; + dump_cmd.flags = CMD_FLAG_FOREIGN_OK; report_cmd.name = "report"; report_cmd.altname = "repquota"; report_cmd.cfunc = report_f; report_cmd.argmin = 0; report_cmd.argmax = -1; - report_cmd.flags = CMD_FLAG_GLOBAL; report_cmd.args = _("[-bir] [-gpu] [-ahnt] [-f file]"); report_cmd.oneline = _("report filesystem quota information"); report_cmd.help = report_help; + report_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; if (expert) { add_command(&dump_cmd); diff --git a/quota/state.c b/quota/state.c index 8186762..d134580 100644 --- a/quota/state.c +++ b/quota/state.c @@ -15,7 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include #include "command.h" #include "init.h" #include "quota.h" @@ -527,6 +527,7 @@ state_init(void) off_cmd.args = _("[-gpu] [-v]"); off_cmd.oneline = _("permanently switch quota off for a path"); off_cmd.help = off_help; + off_cmd.flags = CMD_FLAG_FOREIGN_OK; state_cmd.name = "state"; state_cmd.cfunc = state_f; @@ -535,6 +536,7 @@ state_init(void) state_cmd.args = _("[-gpu] [-a] [-v] [-f file]"); state_cmd.oneline = _("get overall quota state information"); state_cmd.help = state_help; + state_cmd.flags = CMD_FLAG_FOREIGN_OK; enable_cmd.name = "enable"; enable_cmd.cfunc = enable_f; diff --git a/quota/util.c b/quota/util.c index e3c5398..cafd45f 100644 --- a/quota/util.c +++ b/quota/util.c @@ -17,6 +17,7 @@ */ #include +#include #include #include #include -- 2.7.4 From auteejay@dra.dragcoverage.com Tue Aug 16 09:36:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 145BD7CA0 for ; Tue, 16 Aug 2016 09:36:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D972D30419B for ; Tue, 16 Aug 2016 07:36:37 -0700 (PDT) X-ASG-Debug-ID: 1471358195-0bf57c0cff26670001-NocioJ Received: from dra.dragcoverage.com (dra.dragcoverage.com [162.144.254.125]) by cuda.sgi.com with ESMTP id SVmDdNLmKPIdIA5l (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 07:36:36 -0700 (PDT) X-Barracuda-Envelope-From: auteejay@dra.dragcoverage.com X-Barracuda-Effective-Source-IP: dra.dragcoverage.com[162.144.254.125] X-Barracuda-Apparent-Source-IP: 162.144.254.125 Received: from auteejay by dra.dragcoverage.com with local (Exim 4.87) (envelope-from ) id 1bZfTn-0002on-3j for xfs@oss.sgi.com; Tue, 16 Aug 2016 09:36:35 -0500 To: xfs@oss.sgi.com Subject: Make $2500 a day Using mobile binary Tech X-PHP-Script: www.dragcoverage.com/forums/index.php for 121.54.58.246 X-ASG-Orig-Subj: Make $2500 a day Using mobile binary Tech From: "DragCoverage.com Speed Forums" Auto-Submitted: auto-generated Message-ID: <20160816143634.95f455ead8f2@www.dragcoverage.com> MIME-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit X-Priority: 3 X-Mailer: vBulletin Mail via PHP Date: Tue, 16 Aug 2016 09:36:35 -0500 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - dra.dragcoverage.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [502 500] / [47 12] X-AntiAbuse: Sender Address Domain - dra.dragcoverage.com X-Get-Message-Sender-Via: dra.dragcoverage.com: authenticated_id: auteejay/from_h X-Authenticated-Sender: dra.dragcoverage.com: webmaster@dragcoverage.com X-Source: /usr/bin/php X-Source-Args: /usr/bin/php /home/auteejay/public_html/forums/index.php X-Source-Dir: dragcoverage.com:/public_html/forums X-Barracuda-Connect: dra.dragcoverage.com[162.144.254.125] X-Barracuda-Start-Time: 1471358196 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 604 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.19 X-Barracuda-Spam-Status: No, SCORE=1.19 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=EARN_PER_WEEK X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.19 EARN_PER_WEEK Contains 'earn $something per week' Friend, This is a message from Rone Hwarris ( mailto: ) from the DragCoverage.com Speed Forums ( http://www.dragcoverage.com/forums/ ). The message is as follows: Friend, Over 4,000 People Can't Be Wrong... This is Real... This is Honest... >> https://www.payzeno.com/a/profx/9892 People Are Earning $2500 per day and more from home... No experience is necessary! Get all the information here: >> https://www.payzeno.com/a/profx/9892 Have a great week, Rone Hwarris DragCoverage.com Speed Forums takes no responsibility for messages sent through its system. From info@forex-strategy.com Tue Aug 16 10:19:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 942DA7CA0 for ; Tue, 16 Aug 2016 10:19:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 657C0304133 for ; Tue, 16 Aug 2016 08:19:19 -0700 (PDT) X-ASG-Debug-ID: 1471360754-0bf57c0d0029b90001-NocioJ Received: from jupiter.cleverdot.com (jupiter-mx3.cleverdot.com [208.38.186.237]) by cuda.sgi.com with ESMTP id qMmvhp4ELmm4fYk1 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 16 Aug 2016 08:19:15 -0700 (PDT) X-Barracuda-Envelope-From: info@forex-strategy.com X-Barracuda-Effective-Source-IP: jupiter-mx3.cleverdot.com[208.38.186.237] X-Barracuda-Apparent-Source-IP: 208.38.186.237 Received: from [127.0.0.1] (port=21077 helo=jupiter.cleverdot.com) by jupiter.cleverdot.com with smtp (Exim 4.87) (envelope-from ) id 1bZg94-0000wz-Vs for xfs@oss.sgi.com; Tue, 16 Aug 2016 11:19:15 -0400 X-SG-User: bsez177 X-SG-Opt: SCRIPT_FILENAME=/home/bsez177/public_html/newsletter/admin/mailings/mailings_send4.php REQUEST_URI=/newsletter/admin/mailings/mailings_send4.php?code=5e7e9047eea7b9263c164f532af8dc81&serial=1471355576&id=7 PWD=/home/bsez177/public_html/newsletter/admin/mailings REMOTE_ADDR=50.115.18.173 Date: Tue, 16 Aug 2016 11:19:14 -0400 To: xfs@oss.sgi.com From: FS Team Subject: A gratis super bonus gift for you! Message-ID: <6722d945108f8077d7931121bbcb8a83@forex-strategy.com> X-ASG-Orig-Subj: A gratis super bonus gift for you! X-Priority: 3 X-Mailer: PHPMailer [version 1.72] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/html; charset="UTF-8" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - jupiter.cleverdot.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - forex-strategy.com X-Get-Message-Sender-Via: jupiter.cleverdot.com: acl_c_authenticated_local_user: bsez177 X-Authenticated-Sender: jupiter.cleverdot.com: bsez177 X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: jupiter-mx3.cleverdot.com[208.38.186.237] X-Barracuda-Start-Time: 1471360755 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 20813 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.55 X-Barracuda-Spam-Status: No, SCORE=1.55 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, BSF_SC7_SA578_CH, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32054 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH



 






 














   
 
"Instantly Download This Pro Level Trading


  System For Zero Cost And You Could Put


  Hundreds Of Dollars In Your Pocket Today"




 
  Today is your lucky day, and it's a special day because
  you can instantly download your copy of The Mechanical
  Cash Builder...





 
  A professional grade trading system that takes full
  advantage of a secret hedge fund technique that is not
  only easy to use, it could put hundreds if not
  thousands of dollars in your pocket today.




 
Click display images to see chart




  Get instant access to your premium trading gift here! 
 

 




  And there is ZERO CATCH! That's right, no hoops to jump
  through, nothing!




 
  This is a gift to our community! Plain and simple!
  There is absolutely nothing for sale and you could put
  money in your pocket today.
 




  This is completely different to anything you've seen
  before and is yours today for absolutely ZERO cost.
  This has been responsible for many trading beginners
  finally making the breakthrough you've been looking
  for!
 





  You will be supplied with everything you need - for
  zero cost
- to start making hundreds of dollars today,
  including:
 

  •   The Secret Report containing the full system rules,
      the secret code and the instant cash-making strategies.




     
      The custom indicators that take advantage of this
      secret hedge fund technique, finely tuned to where the
      easy money is waiting.




     
      Plus a killer video that shows you how to use this
      information to line your pockets with a ton of easy
      money.





     
      This system is a wealth generating machine that
      practically prints money for you... Day after day? Year
      after year,

  •  


 
Click display images to see chart
 



  Download your gratis system and watch the video here
  instantly!
 
 




  That familiar face above belongs to none other than
  veteran trading superstar Russ Horn, one of the most
  generous professionals out there!





 
  He's one of the world's foremost authorities when it
  comes to making huge sums of cash trading Forex
  however, just in case you are new and you haven't heard
  of Russ, here is why this is your lucky day: 
 

  •   A professional trader for over 16 years trading at
      the highest levels, Russ enjoys giving back to our
      community and he has a long track record of sharing top
      secret trading strategies, asking for nothing in
      return.




     
      He is responsible for teaching over 3,000 regular
      people how to generate thousands of dollars, trading
      from home.




     
      Russ is one of the most trusted trading gurus out
      there, and the last time he gave away a system for
      nothing, thousands of people made profits with it.
     




      His Facebook account shows he has over 44,000 fans,
      and I think you'd struggle to find anyone who would say
      a bad word about him.


 
  Before you can download your zero cost system (you
  could make hundreds of dollars today with this) there's
  only ONE THING you have to do?





 
 
Click this link, watch the video and look for


  the instant download button!
 

 




  To your trading success,




 
  Adrian Jones


  "Next Generation Trading"




 
  P.S. There really is zero cost and no catch. There's
  not even anything to buy! Russ simply wants to help
  even more people like you make the extra cash you need
  to become more financially secure and to experience the
  comfort that being able to generate instant cash could
  bring you.




 
  Download this full system, get the secret report and
  watch the video here?
 

 
 



=================================

Information, charts or examples contained in this email is for illustration and educational purposes only. It should not be considered as advice or an endorsement to purchase or sell any security or financial instrument. We do not and cannot give any kind of financial advice. No employee or persons associated with us is registered or authorized to give financial advice. We do not trade on anyone's behalf, and we do not recommend or receive any payments from any broker. On certain occasions, we
have a material link to the product or service mentioned in the email. This may be in the form of compensation or remuneration.

=================================









From tdm@sgi.com Tue Aug 16 10:31:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F27757CA0 for ; Tue, 16 Aug 2016 10:31:53 -0500 (CDT) Received: from xmail.sgi.com (pv-excas3-dc21.corp.sgi.com [137.38.106.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5A150AC00A for ; Tue, 16 Aug 2016 08:31:50 -0700 (PDT) Received: from P-EXMB4-DC21.corp.sgi.com ([169.254.6.189]) by pv-excas3-dc21.corp.sgi.com ([137.38.106.11]) with mapi id 14.03.0224.002; Tue, 16 Aug 2016 10:31:49 -0500 From: Troy McCorkell To: "xfs@oss.sgi.com" CC: Troy McCorkell Subject: suspending bugzilla on oss.sgi.com Thread-Topic: suspending bugzilla on oss.sgi.com Thread-Index: AdH30uXxVBl8wQYDRxefR9LD3jam0A== Date: Tue, 16 Aug 2016 15:31:49 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [128.162.233.129] Content-Type: multipart/alternative; boundary="_000_DF733A1EC32F124D86BC1188068FECB101A72E40B0PEXMB4DC21cor_" MIME-Version: 1.0 --_000_DF733A1EC32F124D86BC1188068FECB101A72E40B0PEXMB4DC21cor_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable bugzilla on oss.sgi.com has come under a spam attack. We will suspend bugzilla on oss.sgi.com while we determine the best method to block this spam attack. Thanks, Troy McCorkell --_000_DF733A1EC32F124D86BC1188068FECB101A72E40B0PEXMB4DC21cor_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
bugzilla on oss.sgi.com has come under a spam attack.
We will suspend bugzilla on oss.sgi.com while we determine the
best method to block this spam attack.

Thanks,
Troy McCorkell
--_000_DF733A1EC32F124D86BC1188068FECB101A72E40B0PEXMB4DC21cor_-- From jgibson@spscommerce.com Tue Aug 16 12:05:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 46A737CA0 for ; Tue, 16 Aug 2016 12:05:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 161AC30407F for ; Tue, 16 Aug 2016 10:05:30 -0700 (PDT) X-ASG-Debug-ID: 1471367118-0bf57b64ae28f10001-NocioJ Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0081.outbound.protection.outlook.com [104.47.36.81]) by cuda.sgi.com with ESMTP id A2bXmgwzmxsr8dYw (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 16 Aug 2016 10:05:24 -0700 (PDT) X-Barracuda-Envelope-From: jgibson@spscommerce.com X-Barracuda-Effective-Source-IP: mail-sn1nam02on0081.outbound.protection.outlook.com[104.47.36.81] X-Barracuda-Apparent-Source-IP: 104.47.36.81 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spscommerce.onmicrosoft.com; s=selector1-spscommerce-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=hBw3hr3IvCtCxvoxHEpsns4/HIBCiPZCYlO+F9qTSrs=; b=iHyjb/wVvaDnckZUQobkAhP7UnITeUnIql9BI3RjlOUrgntzB9g2iR5Pfrobu/pD90NjVduFFvKhJIrf99gnUd5N5HcTU1uTBgxG/VF+YyMQJNUvqxN592Yn7pqQTVLhjDsQPXYpeLU65g0ZyrdpJlE47iv3aqL+FTjApuOZnBY= Received: from CY1PR04MB2010.namprd04.prod.outlook.com (10.166.191.23) by CY1PR04MB2011.namprd04.prod.outlook.com (10.166.191.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Tue, 16 Aug 2016 17:05:11 +0000 Received: from CY1PR04MB2010.namprd04.prod.outlook.com ([10.166.191.23]) by CY1PR04MB2010.namprd04.prod.outlook.com ([10.166.191.23]) with mapi id 15.01.0549.027; Tue, 16 Aug 2016 17:05:11 +0000 From: Jeff Gibson To: "xfs@oss.sgi.com" Subject: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? Thread-Topic: XFS on top of LVM span in AWS. Stripe or are AG's good enough? X-ASG-Orig-Subj: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? Thread-Index: AQHR90Aa/Ibw35Nk+k2bm9/FclSkbKBKxGSAgADnOvg= Date: Tue, 16 Aug 2016 17:05:11 +0000 Message-ID: References: ,<20160816005931.GD19025@dastard> In-Reply-To: <20160816005931.GD19025@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=jgibson@spscommerce.com; x-originating-ip: [25.161.247.4] x-ms-office365-filtering-correlation-id: 85482d14-9ab3-4edf-1cc5-08d3c5f77bcd x-microsoft-exchange-diagnostics: 1;CY1PR04MB2011;6:fuhgBV5+5+ozQH3RXzHQ0dmJHmK81JIXXfV5IQtUfUqcgpEdySEGFtvSW53iOYfqFsTpRWxp5aeEJ9QpxKSgPcD/KcWzkBXbgdHoXd3ccHAKBa4DqphzldUyYco1EVqaY7uoFgSOmHNeSR1y8B9bbn+Z+TnImnmIPa86oeJnaHGyMuDD9V8cxz7tIAjZQCQ2hbDC02HO1HHoAO1+bvyZ0FDPNq4AlbB/khJ1UXOTbBK8mXOucQgr0xvV6YoP+mrAvDoLBgUwvSNBSiPIOSeUCADOs+0+DGeIwnwMb1qxS3I=;5:41P/qyCwo1PBRsASlCCAw7XiIp+HcIja6ym7HLJANHk3J1DVPFuIEXpraDRYxq43/r9UG6/DmPwfGugOgsInWe6VM61yhAeKJq+hHBez3oQVjUwOnyTJ6BOlheeRhkZh0sMznKACiTA8yDdlJkrpHg==;24:bqSAK8WtBx7O0Wu+HsuDRnlwgDZeCP76gcFdp9Na+7/8754W5Ukbmgt0pIkN3q7tB8romZvv7ZKcpznXJE1pyvPywr3rmHhtVjD+NurYUOA=;7:4oChDvtlLx3TLeinKWCEW0PINjFu7IDZI4CJdAkJss2joSnoXFtOVg6IPDOVShWgQxiLJTO6LH3bXk8Zoy8vI1ZNLX9CM4nWhGCRV+h5trHiNXhO0foq00d5muAcwJSvpWiXHYh0m5hUilbg6e+AbbrBOaWpm/M+by0CMDRg8q0j6cipXz+hXm8Z0KUBp9mc9QdqCvraBAuY7SFL41/7f1rvfz/w6QC38aKpeo8s4mRQgm1iEJHRfIel4nyU/wBc x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR04MB2011; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(159839258108289)(17755550239193); x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001);SRVR:CY1PR04MB2011;BCL:0;PCL:0;RULEID:;SRVR:CY1PR04MB2011; x-forefront-prvs: 0036736630 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(6009001)(7916002)(189002)(199003)(45984002)(174864002)(24454002)(1730700003)(7736002)(8676002)(9686002)(66066001)(305945005)(7696003)(81156014)(2900100001)(76576001)(5002640100001)(3660700001)(97736004)(74316002)(99286002)(7846002)(110136002)(33656002)(3280700002)(81166006)(92566002)(101416001)(8936002)(11100500001)(6116002)(450100001)(107886002)(3846002)(19580395003)(68736007)(102836003)(106356001)(106116001)(2950100001)(189998001)(2501003)(86362001)(10400500002)(15975445007)(122556002)(77096005)(2351001)(586003)(87936001)(2906002)(76176999)(54356999)(105586002)(50986999);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR04MB2011;H:CY1PR04MB2010.namprd04.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; received-spf: None (protection.outlook.com: spscommerce.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: spscommerce.com X-MS-Exchange-CrossTenant-originalarrivaltime: 16 Aug 2016 17:05:11.1123 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 925b3535-30d6-4f8f-b70f-a7aa7e1b3445 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR04MB2011 X-Barracuda-Connect: mail-sn1nam02on0081.outbound.protection.outlook.com[104.47.36.81] X-Barracuda-Start-Time: 1471367124 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3771 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32057 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature >On Mon, Aug 15, 2016 at 11:36:14PM +0000, Jeff Gibson wrote: >> So I'm creating an LVM volume with 8 AWS EBS disks that are >> spanned (linear) per Redhat's documentation for Gluster >> (https://access.redhat.com/documentation/en-US/Red_Hat_Storage/3.1/html/= Deployment_Guide_for_Public_Cloud/>ch02s03.html#Provisioning_Storage_for_Th= ree-way_Replication_Volumes). >>=20 >> 2 questions- >>=20 >> 1.=A0 Will XFS's Allocation Groups essentially stripe the data for >> me > >No. XFS does not stripe data. It does, however, *distribute* data >different AGs according to locality policy (e.g. inode32 vs >inode64), so it uses all the AGs as the directory structure grows. Poor wording on my part. By "essentially stripe" I mean distribute data th= roughout all of the EBS subvolumes instead of just using one EBS subvolume = at a time until full. I do plan on using inode64. >> or should I stripe the underlying volumes with LVM? > >No, you're using EBS. Forget anything you know about storage layout >and geometry, because EBS has no guaranteed physical layout you can >optimise for. Right. However there could still be some gains from striping due to IOP li= mits for single volumes. - That is the combined IOPS for all the volumes st= riped together can be higher than they are for a single volume.=20 >> I'm not >> worried as much about data integrity with a stripe/span since >> Gluster is doing the redundancy work. >>=20 >> 2.=A0 AWS volumes sometimes have inconsistent performance.=A0 If I >> understand things correctly, AG's run in parallel. > >Define "run". AGs can allocate/free blocks in parallel. By run I meant read/write data to/from the AGs. >If IO does >not require allocation, then AGs play no part in the IO path. Can you explain this a bit please? From my understanding data is written a= nd read from space inside of AGs, so I don't see how it couldn't be part of= the IO path. Or do you simply mean reads just use inodes and don't care a= bout the AGs? >> In a >> non-striped volume, if some of the AGs are temporarily slower to >> respond than others due to one of the underlying volumes being >> slow, will XFS prefer the quicker responding AGs > >No, it does not. > >> or is I/O always >> evenly distributed? > >No, it is not. > >> If XFS prefers the more responsive AG's it >> seems to me that it would be better NOT to stripe the underlying >> disk since all AG's that are distributed in a stripe will >> continuously hit all component volumes, including the slow volume >> (unless if XFS compensates for this?) > >I think you have the wrong idea about what allocation groups do. I'm reading the XFS File System Structure doc on xfs.org. It says, "XFS fi= lesystems are divided into a number of equally sized chunks called Allocati= on Groups. Each AG can almost be thought of as an individual filesystem." s= o that's where most of my assumptions are coming from. >They are for maintaining allocation concurrency and locality of >related objects on disk - they have no influence on where IO is >directed based on IO load or response time. I understand that XFS has locality as far as trying to write files to the s= ame AG as the parent directory. Are there other cases? I get that it's probably not measuring the responsiveness of each AG. I gue= ss what I'm trying to ask is - will XFS *indirectly* compensate if one subv= olume is busier? For example, if writes to a "slow" subvolume and resident= AGs take longer to complete, will XFS tend to prefer to use other less-bus= y AGs more often (with the exception of locality) for writes? What is the = basic algorithm for determining where new data is written? In load-balance= r terms, does it round-robin, pick the least busy, etc? Thank you very much! JG = From tdm@sgi.com Tue Aug 16 12:07:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5B3507CA0 for ; Tue, 16 Aug 2016 12:07:23 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay3.corp.sgi.com (Postfix) with ESMTP id A9EBDAC00C for ; Tue, 16 Aug 2016 10:07:19 -0700 (PDT) Received: from P-EXMB4-DC21.corp.sgi.com ([169.254.6.189]) by PV-EXCAS1-DC21.corp.sgi.com ([137.38.106.7]) with mapi id 14.03.0224.002; Tue, 16 Aug 2016 12:07:19 -0500 From: Troy McCorkell To: "xfs@oss.sgi.com" Subject: RE: suspending bugzilla on oss.sgi.com Thread-Topic: suspending bugzilla on oss.sgi.com Thread-Index: AdH30uXxVBl8wQYDRxefR9LD3jam0AADZNCp Date: Tue, 16 Aug 2016 17:07:18 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [128.162.233.129] Content-Type: multipart/alternative; boundary="_000_DF733A1EC32F124D86BC1188068FECB101A72E41C0PEXMB4DC21cor_" MIME-Version: 1.0 --_000_DF733A1EC32F124D86BC1188068FECB101A72E41C0PEXMB4DC21cor_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable The web server for oss.sgi.com is up and running. oss.sgi.com/bugzilla has= been disabled. Thanks, Troy McCorkell ________________________________ From: Troy McCorkell Sent: Tuesday, August 16, 2016 10:31 AM To: xfs@oss.sgi.com Cc: Troy McCorkell Subject: suspending bugzilla on oss.sgi.com bugzilla on oss.sgi.com has come under a spam attack. We will suspend bugzilla on oss.sgi.com while we determine the best method to block this spam attack. Thanks, Troy McCorkell --_000_DF733A1EC32F124D86BC1188068FECB101A72E41C0PEXMB4DC21cor_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
The web server for oss.sgi.com is up and running.  oss.sgi.com/= bugzilla has been disabled.

Thanks,
Troy McCorkell

From: Troy McCorkell
Sent: Tuesday, August 16, 2016 10:31 AM
To: xfs@oss.sgi.com
Cc: Troy McCorkell
Subject: suspending bugzilla on oss.sgi.com

bugzilla on oss.sgi.com has come under a spam attack.
We will suspend bugzilla on oss.sgi.com while we determine the
best method to block this spam attack.

Thanks,
Troy McCorkell
--_000_DF733A1EC32F124D86BC1188068FECB101A72E41C0PEXMB4DC21cor_-- From sandeen@sandeen.net Tue Aug 16 12:37:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5A3B07CA0 for ; Tue, 16 Aug 2016 12:37:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 24D8C304048 for ; Tue, 16 Aug 2016 10:37:34 -0700 (PDT) X-ASG-Debug-ID: 1471369052-0bf57b64ad29c30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fLk47N9Il1cS5y4y for ; Tue, 16 Aug 2016 10:37:32 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D54C24423 for ; Tue, 16 Aug 2016 12:37:31 -0500 (CDT) Subject: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? References: <20160816005931.GD19025@dastard> From: Eric Sandeen Message-ID: <6ec8fbba-27ff-7386-e72a-d9f8e81f9252@sandeen.net> Date: Tue, 16 Aug 2016 12:37:31 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471369052 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3733 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32058 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/16/16 12:05 PM, Jeff Gibson wrote: >> On Mon, Aug 15, 2016 at 11:36:14PM +0000, Jeff Gibson wrote: ... >> Define "run". AGs can allocate/free blocks in parallel. > By run I meant read/write data to/from the AGs. > >> If IO does >> not require allocation, then AGs play no part in the IO path. > Can you explain this a bit please? From my understanding data is > written and read from space inside of AGs, so I don't see how it > couldn't be part of the IO path. Or do you simply mean reads just use > inodes and don't care about the AGs? I think Dave just means that IO to already-allocated blocks simply addresses the block and goes. There is no AG locking or concurrency or anything else that comes into play w.r.t. the specific AG the block under IO happens to live in. >>> In a >>> non-striped volume, if some of the AGs are temporarily slower to >>> respond than others due to one of the underlying volumes being >>> slow, will XFS prefer the quicker responding AGs >> >> No, it does not. >> >>> or is I/O always >>> evenly distributed? >> >> No, it is not. >> >>> If XFS prefers the more responsive AG's it >>> seems to me that it would be better NOT to stripe the underlying >>> disk since all AG's that are distributed in a stripe will >>> continuously hit all component volumes, including the slow volume >>> (unless if XFS compensates for this?) >> >> I think you have the wrong idea about what allocation groups do. > I'm reading the XFS File System Structure doc on xfs.org. It says, > "XFS filesystems are divided into a number of equally sized chunks > called Allocation Groups. Each AG can almost be thought of as an > individual filesystem." so that's where most of my assumptions are > coming from. Well, the above quote is correct, but it doesn't say anything about IO time, latency, responsiveness, or anything like that. Each AG does indeed include its own structures to track allocation, but that's unrelated to any notion of "fast" or "slow." >> They are for maintaining allocation concurrency and locality of >> related objects on disk - they have no influence on where IO is >> directed based on IO load or response time. > I understand that XFS has locality as far as trying to write files to > the same AG as the parent directory. Are there other cases? In general, new directories go to a new AG. Inodes within that directory tend to stay in the same AG as their parent, and data blocks associated with those inodes tend to stay nearby as well. That's the high-level goal, but of course fragmented freespace and near-full conditions can cause that to not remain true. > I get that it's probably not measuring the responsiveness of each AG. It is *definitely* not measuring the responsiveness of each AG :) > I guess what I'm trying to ask is - will XFS *indirectly* compensate > if one subvolume is busier? For example, if writes to a "slow" > subvolume and resident AGs take longer to complete, will XFS tend to > prefer to use other less-busy AGs more often (with the exception of > locality) for writes? What is the basic algorithm for determining > where new data is written? In load-balancer terms, does it > round-robin, pick the least busy, etc? xfs has no notion of fast vs slow regions. See above for the basic algorithm; it's round-robin for new directories, keep inodes and blocks near their parent if possible. There are a few other smaller-granularity heuristics related to stripe geometry as well. -Eric > Thank you very much! > JG > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Tue Aug 16 18:37:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E3F47CA0 for ; Tue, 16 Aug 2016 18:37:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E59BC8F819A for ; Tue, 16 Aug 2016 16:37:07 -0700 (PDT) X-ASG-Debug-ID: 1471390624-0bf57b64ac395b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DBzTp8WdTcCwjarq for ; Tue, 16 Aug 2016 16:37:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BFCgCHorNXEAI1LHleg0VWfIZynU0BAQaMZ4YPgg+BfRyFewSBXjkUAgEBAQEBAQEGAQEBAQEBAQE3QEEQhDsvOyQ0BSUDBxsSiDC/Ow4ehUSMHgtYgi8Fk3yFR4YeiHGBdYgOhUoCkDAegnuBRyoygg6EUwEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Aug 2016 09:07:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bZnul-0005zs-L4; Wed, 17 Aug 2016 09:36:59 +1000 Date: Wed, 17 Aug 2016 09:36:59 +1000 From: Dave Chinner To: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: [ANNOUNCE] xfs: master branch updated to v4.8-rc2, for-next branch updated to d25ed4d Message-ID: <20160816233659.GE19025@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: master branch updated to v4.8-rc2, for-next branch updated to d25ed4d MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="IiVenqGWf+H9Y6IX" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1471390625 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2325 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32070 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --IiVenqGWf+H9Y6IX Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, I've just updated the master branch of hte XFS kernel repository to v4.8-rc2. If you have outstanding patches, can you check they apply to this updated branch, and if not rebase your patches and resend them? I've also updated with the for-next branch with the fixes I intend to send to Linus at the end of the week. This does not include Christoph's delayed allocation rework - that still needs more testing before merging. Full details of the commits merged are below. -Dave. The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. The new head of the for-next branch is commit: d25ed4d Merge branch 'iomap-fixes-4.8-rc3' into for-next New Commits: Brian Foster (1): [4dd3fd7] xfs: don't assert fail on non-async buffers on ioacct decre= ment Christoph Hellwig (6): [0af32fb] xfs: fix bogus space reservation in xfs_iomap_write_allocate [97dd8c9] iomap: remove superflous mark_page_accessed from iomap_writ= e_actor [274c887] iomap: remove superflous pagefault_disable from iomap_write= _actor [f20ac7a] iomap: mark ->iomap_end as optional [b95a212] xfs: simplify xfs_file_iomap_begin [1d4795e] xfs: (re-)implement FIEMAP_FLAG_XATTR Darrick J. Wong (1): [f32866fd] xfs: store rmapbt block count in the AGF Dave Chinner (4): [8b2180b] xfs: don't invalidate whole file on DAX read/write [8896b8f] iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag [ac2dc05] iomap: prepare iomap_fiemap for attribute mappings [d25ed4d] Merge branch 'iomap-fixes-4.8-rc3' into for-next Code Diffstat: fs/iomap.c | 21 ++++++++------ fs/xfs/libxfs/xfs_alloc.c | 1 + fs/xfs/libxfs/xfs_format.h | 11 ++++++-- fs/xfs/libxfs/xfs_rmap_btree.c | 6 ++++ fs/xfs/xfs_buf.c | 1 - fs/xfs/xfs_file.c | 13 ++++++++- fs/xfs/xfs_fsops.c | 1 + fs/xfs/xfs_iomap.c | 69 ++++++++++++++++++++++++++++++++++++--= ------- fs/xfs/xfs_iomap.h | 1 + fs/xfs/xfs_iops.c | 9 +++++- fs/xfs/xfs_trace.h | 1 - 11 files changed, 106 insertions(+), 28 deletions(-) --=20 Dave Chinner david@fromorbit.com --IiVenqGWf+H9Y6IX Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXs6ObAAoJEK3oKUf0dfod7pgP/R4rSXWGpF40YH5b/c+wPtZM pJrZRD7iHqJfCB47JHVzcNtBTxT9RdhqrzKJkOiaNt+XHwcQYhRBmvNAQ1oL7L0J 74Ktx1Dv5RQ9YNswiyu4jPGSpukoHd9s9oqN6gABgxis01ZBtFc5wrEiR2NNFjG9 xvjRETuUqkgGY+zpKES4Fr47ciycqlcYsihujPJ5SYBX+9Vap5Scx35s361DDGVE vXFkj5xTpY9G7D+NvG6Bmi+gJjnjf/BQ9fwyVLtgKA47KbnywEBDvqr5rPWF/K4i 48MY+hkg8auugViv90RrpioMXkpX9FD1e9LG9FZDqA1ICY9kG7T7ILS/AAiNFCbl wBLuHLVq7mA6snB87cKTsqPX5okPklcIrFajDQRYEB1fi2Kvl5MXPWvce2cxnR9F fGPTfh1RwE+cGJluFXi6QPUPTIbSqp9tOps8tx3iLZyRsE6CdngP+G9qUXLrV+2u ZoZOaOOlNnY6iZgxT+6mbgSilQrTSVaSksIGEvoh/Rulo7U9FoGtuJ7rWllKlXsu YdX6mAC5Jva002wNob3i9+NZks3uD7SUjurCb3llweIxeBprTY09Nc0yfIyNU91n D5Ewj/SdrFVk/vjsZRm4p+GAqR2S3JhYCXt9edxd29dJ0ZDeeDQQD7tH5FiZb2Fi 8W+Wks2oFgjdabAn3SVK =TljM -----END PGP SIGNATURE----- --IiVenqGWf+H9Y6IX-- From darrick.wong@oracle.com Tue Aug 16 19:34:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6E50B7CA0 for ; Tue, 16 Aug 2016 19:34:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFB80AC01B for ; Tue, 16 Aug 2016 17:34:02 -0700 (PDT) X-ASG-Debug-ID: 1471394039-0bf57b64ad3a900001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id YhqDWHL1GglVIXpM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 17:34:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7H0XwsS000682 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 17 Aug 2016 00:33:58 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7H0Xv1f032104 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 17 Aug 2016 00:33:58 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7H0XuuF010849; Wed, 17 Aug 2016 00:33:57 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 16 Aug 2016 17:33:56 -0700 Date: Tue, 16 Aug 2016 17:33:50 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: Re: [ANNOUNCE] xfs: master branch updated to v4.8-rc2, for-next branch updated to d25ed4d Message-ID: <20160817003350.GA8268@birch.djwong.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: master branch updated to v4.8-rc2, for-next branch updated to d25ed4d References: <20160816233659.GE19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160816233659.GE19025@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1471394040 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2815 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 17, 2016 at 09:36:59AM +1000, Dave Chinner wrote: > Hi folks, > > I've just updated the master branch of hte XFS kernel repository to > v4.8-rc2. If you have outstanding patches, can you check they apply > to this updated branch, and if not rebase your patches and resend > them? I think this is missing "xfs: remove OWN_AG rmap when allocating a block from the AGFL", a.k.a. the fix for the generic/299 crash you were seeing. --D > > I've also updated with the for-next branch with the fixes I intend > to send to Linus at the end of the week. This does not include > Christoph's delayed allocation rework - that still needs more testing > before merging. Full details of the commits merged are below. > > -Dave. > > The for-next branch of the xfs kernel repository at > > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git > > has just been updated. > > The new head of the for-next branch is commit: > > d25ed4d Merge branch 'iomap-fixes-4.8-rc3' into for-next > > New Commits: > > Brian Foster (1): > [4dd3fd7] xfs: don't assert fail on non-async buffers on ioacct decrement > > Christoph Hellwig (6): > [0af32fb] xfs: fix bogus space reservation in xfs_iomap_write_allocate > [97dd8c9] iomap: remove superflous mark_page_accessed from iomap_write_actor > [274c887] iomap: remove superflous pagefault_disable from iomap_write_actor > [f20ac7a] iomap: mark ->iomap_end as optional > [b95a212] xfs: simplify xfs_file_iomap_begin > [1d4795e] xfs: (re-)implement FIEMAP_FLAG_XATTR > > Darrick J. Wong (1): > [f32866fd] xfs: store rmapbt block count in the AGF > > Dave Chinner (4): > [8b2180b] xfs: don't invalidate whole file on DAX read/write > [8896b8f] iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag > [ac2dc05] iomap: prepare iomap_fiemap for attribute mappings > [d25ed4d] Merge branch 'iomap-fixes-4.8-rc3' into for-next > > > Code Diffstat: > > fs/iomap.c | 21 ++++++++------ > fs/xfs/libxfs/xfs_alloc.c | 1 + > fs/xfs/libxfs/xfs_format.h | 11 ++++++-- > fs/xfs/libxfs/xfs_rmap_btree.c | 6 ++++ > fs/xfs/xfs_buf.c | 1 - > fs/xfs/xfs_file.c | 13 ++++++++- > fs/xfs/xfs_fsops.c | 1 + > fs/xfs/xfs_iomap.c | 69 ++++++++++++++++++++++++++++++++++++--------- > fs/xfs/xfs_iomap.h | 1 + > fs/xfs/xfs_iops.c | 9 +++++- > fs/xfs/xfs_trace.h | 1 - > 11 files changed, 106 insertions(+), 28 deletions(-) > -- > Dave Chinner > david@fromorbit.com > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Aug 16 20:11:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 692A57CA0 for ; Tue, 16 Aug 2016 20:11:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2FBA98F81A5 for ; Tue, 16 Aug 2016 18:10:58 -0700 (PDT) X-ASG-Debug-ID: 1471396254-0bf57c0cfe399e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id wp57BCb4TqTEJZiu for ; Tue, 16 Aug 2016 18:10:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BGCgDSuLNXEAI1LHleg0WBUoZynU0BAQaMZ4YPgg+BfYYXBAICgVo5FAIBAQEBAQEBBgEBAQEBAQEBN0BBDIQSAQU6HCMQCAMYCSUPBSUDBxoTiDC/KQEBAQcCASQehUSFFYdsgi8FmUOPD49PjDiDeB6Ce4FHKjKDCINZAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Aug 2016 10:40:53 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bZpNd-00069H-4k; Wed, 17 Aug 2016 11:10:53 +1000 Date: Wed, 17 Aug 2016 11:10:53 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: Re: [ANNOUNCE] xfs: master branch updated to v4.8-rc2, for-next branch updated to d25ed4d Message-ID: <20160817011053.GF19025@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: master branch updated to v4.8-rc2, for-next branch updated to d25ed4d References: <20160816233659.GE19025@dastard> <20160817003350.GA8268@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160817003350.GA8268@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1471396254 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 667 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 16, 2016 at 05:33:50PM -0700, Darrick J. Wong wrote: > On Wed, Aug 17, 2016 at 09:36:59AM +1000, Dave Chinner wrote: > > Hi folks, > > > > I've just updated the master branch of hte XFS kernel repository to > > v4.8-rc2. If you have outstanding patches, can you check they apply > > to this updated branch, and if not rebase your patches and resend > > them? > > I think this is missing "xfs: remove OWN_AG rmap when allocating a block from > the AGFL", a.k.a. the fix for the generic/299 crash you were seeing. Oh, I might have merged one patch short. Thanks for the head's up. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 16 20:50:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 88E297CA0 for ; Tue, 16 Aug 2016 20:50:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 598F8304132 for ; Tue, 16 Aug 2016 18:50:21 -0700 (PDT) X-ASG-Debug-ID: 1471398617-0bf57c0cff3a3d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id kTZuJDN8Lr0IzpUS for ; Tue, 16 Aug 2016 18:50:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CvCgBkwrNXEAI1LHleg0WBUoZynU0BAQaMZ4YPgg+BfYYXAgIBAQKBWzkUAgEBAQEBAQEGAQEBAQEBAQE3QEEQhA4BBVYjEAgDFAQJJQ8FJQMHGhOIML8hAQEBBwIBFg4ehUSFFYRghTsFmUOPD49PjDiDeB6CSBwXgUcqMoIOhFMBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Aug 2016 11:19:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bZpz1-0006Cv-3d; Wed, 17 Aug 2016 11:49:31 +1000 Date: Wed, 17 Aug 2016 11:49:31 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: Re: [ANNOUNCE] xfs: master branch updated to v4.8-rc2, for-next branch updated to d25ed4d Message-ID: <20160817014931.GG19025@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: master branch updated to v4.8-rc2, for-next branch updated to d25ed4d References: <20160816233659.GE19025@dastard> <20160817003350.GA8268@birch.djwong.org> <20160817011053.GF19025@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="ABTtc+pdwF7KHXCz" Content-Disposition: inline In-Reply-To: <20160817011053.GF19025@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1471398617 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1081 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32074 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --ABTtc+pdwF7KHXCz Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, Aug 17, 2016 at 11:10:53AM +1000, Dave Chinner wrote: > On Tue, Aug 16, 2016 at 05:33:50PM -0700, Darrick J. Wong wrote: > > On Wed, Aug 17, 2016 at 09:36:59AM +1000, Dave Chinner wrote: > > > Hi folks, > > >=20 > > > I've just updated the master branch of hte XFS kernel repository to > > > v4.8-rc2. If you have outstanding patches, can you check they apply > > > to this updated branch, and if not rebase your patches and resend > > > them? > >=20 > > I think this is missing "xfs: remove OWN_AG rmap when allocating a bloc= k from > > the AGFL", a.k.a. the fix for the generic/299 crash you were seeing. >=20 > Oh, I might have merged one patch short. Thanks for the head's up. Alright - I did merge one patch short. Fixed and force-pushed. Top commit of the for-next branch should now be: commit 32438cf9d54bd53b531f6d98814e84dd278360c1 Merge: a03f1a6 1d4795e Author: Dave Chinner Date: Wed Aug 17 11:13:37 2016 +1000 Merge branch 'iomap-fixes-4.8-rc3' into for-next -Dave. --=20 Dave Chinner david@fromorbit.com --ABTtc+pdwF7KHXCz Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXs8KqAAoJEK3oKUf0dfodL6MQALRaY/hkoa4TLgmCMxiDOe/0 pWUZOSbg2s8VcVWda9FqYdSb953mizD2X+fTzk0UXV5+NWeK8S4crkjg6j6e3t5s 6aGd8EEk1Meqb7wUyExD5v9kgAbvp0ob0K2es7i1YaIekdlfD5kPO4Bwsdgoafd2 cWVFhRak/9R3A5At07mF7lY+F7l9L0OBowDHBRorUHX3XaRANQAeOVesbKsWOMC1 MkRaBlYJ+mwiqb/zgpXJG5ebOLc+qQ0Z2NeqZGckqOkGGPJjrEstFR9bhD3JGSW9 rGuYqE4DmZFPeMDqKJvADDyq8WpfQ0DtMUSgRnkLZyvHQ11j6ek3sBlFZtIi9Pm+ 26qIOXWE//FGoLT8eGJPwqQY+RUYhqd8F73vr/qzv1KzNEFuHr1RfKhcHnwfZDaP HG/+XJOoiiObR162x8Uts1jcAv61TqKdwOKeLiIRfoFzlveMQ7rQhO+xHCBkqOmm 6jpFpBretedqMXG2Uc738ihjMXyJcNpN882jLfk7SlHBm5nxCD8TRDwZWYtRbwc7 W9hFbOHvBNQBewdu71qmqWUdP0jMiBt/i0FpPMbkOwH/I11/gR3ki5bhxZVSQh+m gAoY7fP3ljiEFhMGyEw0w+lk6FNTcAfvO7aYMintVjnXH1J6en31Zh3gKG7UVap6 7z3r0KbQ9rxwz9Ajd8DD =oBFi -----END PGP SIGNATURE----- --ABTtc+pdwF7KHXCz-- From darrick.wong@oracle.com Tue Aug 16 22:13:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 46F6C7CA0 for ; Tue, 16 Aug 2016 22:13:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 09F553040D0 for ; Tue, 16 Aug 2016 20:13:29 -0700 (PDT) X-ASG-Debug-ID: 1471403607-0bf57c0d003bc50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id HQM95YRNI9ui4grH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 16 Aug 2016 20:13:28 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7H3CxaF029253 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 17 Aug 2016 03:12:59 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7H3CwW9029451 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 17 Aug 2016 03:12:59 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7H3Cvak000371; Wed, 17 Aug 2016 03:12:58 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 16 Aug 2016 20:12:57 -0700 Date: Tue, 16 Aug 2016 20:12:56 -0700 From: "Darrick J. Wong" To: Dave Chinner , Christoph Hellwig Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: XFS rmap, reflink, and online scrub git trees updated Message-ID: <20160817031256.GB8268@birch.djwong.org> X-ASG-Orig-Subj: XFS rmap, reflink, and online scrub git trees updated MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1471403607 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 939 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32077 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi everyone, I've just rebased the rmap, reflink, and online scrub repositories against kernel 4.8-rc2 and the xfsprogs dev branch: https://github.com/djwong/linux/tree/djwong-experimental [766b9c8ffeb] https://github.com/djwong/xfsprogs/commits/djwong-experimental [556a18344] These development branches should be the most recent of the various dev trees floating around out there. Online scrub should be more or less finished, including the kernel ioctls to check a btree and cross-reference it with other btrees. The copy on write code incorporates all of Christoph's changes in his xfs-nfsd-clone.4 branch to make it work with the new iomap code. ----- I have also produced a for-next branch with only the rmap userspace support: https://github.com/djwong/xfsprogs/commits/for-dave-for-4.8 [298f89e628] I'm letting it run tests overnight; if it's clean I'll send it to the mailing list tomorrow. --D From info75@gsmold.com Tue Aug 16 23:38:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.9 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E5ABC7CA0 for ; Tue, 16 Aug 2016 23:38:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 97C0A8F8185 for ; Tue, 16 Aug 2016 21:38:45 -0700 (PDT) X-ASG-Debug-ID: 1471408719-0bf81563e741280001-NocioJ Received: from gsmold.com ([14.217.203.246]) by cuda.sgi.com with SMTP id 0bH48nHjxChVIeHg for ; Tue, 16 Aug 2016 21:38:39 -0700 (PDT) X-Barracuda-Envelope-From: info75@gsmold.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.217.203.246] X-Barracuda-Apparent-Source-IP: 14.217.203.246 Sender: info75@gsmold.com Received: from lenovo-PC[127.0.0.1] by LENOVO-PC[127.0.0.1] (SMTPD32); Wed, 17 Aug 2016 12:33:47 +0800 From: "gsmold160801@163.com" Subject: PE WPC Profile Extrusion Mould To: xfs@oss.sgi.com X-ASG-Orig-Subj: PE WPC Profile Extrusion Mould MIME-Version: 1.0 Reply-To: gsmold160801@163.com Date: Wed, 17 Aug 2016 12:33:47 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.217.203.246] X-Barracuda-Start-Time: 1471408719 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9016 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32078 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160817043845.AA789D80079@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC4xMDU4Ni40OTQiPjwvSEVBRD4NCjxCT0RZPg0KPERJViANCnN0eWxl PSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06 IG5vbmU7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZPTlQ6IDEycHgvMThweCBBcmlhbDsgTEVUVEVS LVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVY VC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij5IZWxsbyANClBy b2plY3QgTWFuYWdlciwmbmJzcDs8L0RJVj4NCjxESVYgDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5v cm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdi KDAsMCwyNTUpOyBGT05UOiAxMnB4LzE4cHggQXJpYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7 IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IC13 ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PEJSPjwvRElWPg0KPERJViANCnN0eWxlPSJX SElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5v bmU7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZPTlQ6IDEycHgvMThweCBBcmlhbDsgTEVUVEVSLVNQ QUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1J TkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48QlI+PC9ESVY+DQo8 RElWIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhU LVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMjU1KTsgRk9OVDogMTJweC8xOHB4IEFy aWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1 NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgi PkluIA0Kb3JkZXIgdG8gc2F2ZSB5b3VyIGV4dHJ1c2lvbiBtb2xkIGNvc3QsIHdvdWxkIHlvdSBs aWtlIHRvIG91dHNvdXJlIGl0IHRvIHVzIHdpdGggDQpkZXRhaWxzIGFzIGZvbGxvd2luZz8mbmJz cDs8L0RJVj4NCjxESVYgDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5H OiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwyNTUpOyBGT05UOiAx MnB4LzE4cHggQXJpYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6 IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Ut d2lkdGg6IDBweCI+PEJSPjwvRElWPg0KPERJViANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFs OyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCww LDI1NSk7IEZPTlQ6IDEycHgvMThweCBBcmlhbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFD S0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtp dC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij4xLCANClRoaXMga2luZCBvZiBtb2xkIGlzIHVzZWQg Zm9yIG1ha2luZyBQVkMgd29uZG93c3dpbGwgcHJvZmlsZXMuIEl0IGNvbnNpc3RzIG9mIA0KZGll IGhlYWQsIGNhbGlicmF0b3IgYW5kIHdhdGVydGFuay4mbmJzcDs8L0RJVj4NCjxESVYgDQpzdHls ZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JN OiBub25lOyBDT0xPUjogcmdiKDAsMCwyNTUpOyBGT05UOiAxMnB4LzE4cHggQXJpYWw7IExFVFRF Ui1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRF WFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+TW91bGQgDQpt YXRlcmlhbDogUzEzNkgsIGhhcmRuZXNzOiAzMi0zNkhSQyB3aXRoIGZpbmUgcG9saXNoaW5nIHN1 cmZhY2UuJm5ic3A7PC9ESVY+DQo8RElWIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdP UkQtU1BBQ0lORzogMHB4OyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMjU1 KTsgRk9OVDogMTJweC8xOHB4IEFyaWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JP VU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRl eHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxCUj48L0RJVj4NCjxESVYgDQpzdHlsZT0iV0hJVEUtU1BB Q0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xP UjogcmdiKDAsMCwyNTUpOyBGT05UOiAxMnB4LzE4cHggQXJpYWw7IExFVFRFUi1TUEFDSU5HOiBu b3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAw cHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+MiwgDQpMZW5ndGggb2Ygd29uZG93 IHN0aWxsIGJvYXJkIG1vdWxkOiAzMDBtbSwgMzUwbW0sIDQwMG1tLCA1MDBtbSwgNjAwbW0gYW5k IHNvIG9uLiANClRoZSB3aW5kb3cgc2lsbCBjYW4gYmUgUFZDIG9ubHkgb3IgUFZDIHdpdGggY29s b3IgZXh0cnVzaW9uLiZuYnNwOzwvRElWPg0KPERJViANCnN0eWxlPSJXSElURS1TUEFDRTogbm9y bWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2Io MCwwLDI1NSk7IEZPTlQ6IDEycHgvMThweCBBcmlhbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsg QkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdl YmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48QlI+PC9ESVY+DQo8RElWIA0Kc3R5bGU9IldI SVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhULVRSQU5TRk9STTogbm9u ZTsgQ09MT1I6IHJnYigwLDAsMjU1KTsgRk9OVDogMTJweC8xOHB4IEFyaWFsOyBMRVRURVItU1BB Q0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlO REVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjMsJm5ic3A7PFNQQU4g DQpzdHlsZT0iV0lET1dTOiAxOyBMSU5FLUhFSUdIVDogMjFweDsgQkFDS0dST1VORC1DT0xPUjog d2luZG93Ij5EaWUgaGVhZDogDQombmJzcDtzaGFwaW5nIHRoZSBtb3ZpbmcgbWVsdCBwbGFzdGlj IHdpdGggaGlnaCZuYnNwOyANCnRlbXBlcmF0dXJlLiZuYnNwOzwvU1BBTj48L0RJVj4NCjxQIA0K c3R5bGU9IldPUkQtV1JBUDogYnJlYWstd29yZDsgQk9SREVSLVRPUDogMHB4OyBCT1JERVItUklH SFQ6IDBweDsgVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyBXSElURS1TUEFDRTogbm9ybWFsOyBX T1JELVNQQUNJTkc6IDBweDsgQk9SREVSLUJPVFRPTTogMHB4OyBURVhULVRSQU5TRk9STTogbm9u ZTsgQ09MT1I6IHJnYigwLDAsMjU1KTsgUEFERElORy1CT1RUT006IDBweDsgUEFERElORy1UT1A6 IDBweDsgRk9OVDogMTJweC8xOHB4IEFyaWFsOyBQQURESU5HLUxFRlQ6IDBweDsgQk9SREVSLUxF RlQ6IDBweDsgV0lET1dTOiAxOyBNQVJHSU46IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsg UEFERElORy1SSUdIVDogMHB4OyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBU RVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHg7IGZvbnQtc3Ry ZXRjaDogaW5oZXJpdCI+PFNQQU4gDQpzdHlsZT0iQk9SREVSLVRPUDogMHB4OyBCT1JERVItUklH SFQ6IDBweDsgVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyBCT1JERVItQk9UVE9NOiAwcHg7IFBB RERJTkctQk9UVE9NOiAwcHg7IFBBRERJTkctVE9QOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBC T1JERVItTEVGVDogMHB4OyBNQVJHSU46IDBweDsgTElORS1IRUlHSFQ6IDIxcHg7IFBBRERJTkct UklHSFQ6IDBweDsgZm9udC1zdHJldGNoOiBpbmhlcml0Ij5DYWxpYnJhdG9yOiANCiZuYnNwO2Nv b2xpbmcgdGhlIHBsYXN0aWMgZXh0cnVkZWQgcHJvZHVjdCBmcm9tIHRoZSBkaWUgaGVhZCB3aXRo IHdhdGVyIGNvb2xpbmcgDQphbmQgdmFjdXVtIGZvcm1pbmcuPC9TUEFOPjwvUD4NCjxQIA0Kc3R5 bGU9IldPUkQtV1JBUDogYnJlYWstd29yZDsgQk9SREVSLVRPUDogMHB4OyBCT1JERVItUklHSFQ6 IDBweDsgVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyBXSElURS1TUEFDRTogbm9ybWFsOyBXT1JE LVNQQUNJTkc6IDBweDsgQk9SREVSLUJPVFRPTTogMHB4OyBURVhULVRSQU5TRk9STTogbm9uZTsg Q09MT1I6IHJnYigwLDAsMjU1KTsgUEFERElORy1CT1RUT006IDBweDsgUEFERElORy1UT1A6IDBw eDsgRk9OVDogMTJweC8xOHB4IEFyaWFsOyBQQURESU5HLUxFRlQ6IDBweDsgQk9SREVSLUxFRlQ6 IDBweDsgV0lET1dTOiAxOyBNQVJHSU46IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgUEFE RElORy1SSUdIVDogMHB4OyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhU LUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHg7IGZvbnQtc3RyZXRj aDogaW5oZXJpdCI+PFNQQU4gDQpzdHlsZT0iQk9SREVSLVRPUDogMHB4OyBCT1JERVItUklHSFQ6 IDBweDsgVkVSVElDQUwtQUxJR046IGJhc2VsaW5lOyBCT1JERVItQk9UVE9NOiAwcHg7IFBBRERJ TkctQk9UVE9NOiAwcHg7IFBBRERJTkctVE9QOiAwcHg7IFBBRERJTkctTEVGVDogMHB4OyBCT1JE RVItTEVGVDogMHB4OyBNQVJHSU46IDBweDsgTElORS1IRUlHSFQ6IDIxcHg7IFBBRERJTkctUklH SFQ6IDBweDsgZm9udC1zdHJldGNoOiBpbmhlcml0Ij5XYXRlciANCnRhbms6ICZuYnNwO2Nvb2xp bmcgdGhlIHBsYXN0aWMgZXh0cnVkZWQgcHJvZHVjdCBhZ2FpbiB3aXRoIHB1cmUgd2F0ZXIgYW5k IHRvIA0Kc2hhcGUgdGhlIGV4dHVkZWQgcHJvZHVjdCBwZXJmZWN0bHkgYWdhaW4gd2l0aCB0YW5r cGxhdGVzLjwvU1BBTj48L1A+DQo8RElWIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdP UkQtU1BBQ0lORzogMHB4OyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMjU1 KTsgRk9OVDogMTJweC8xOHB4IEFyaWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JP VU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRl eHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxCUj48L0RJVj4NCjxESVYgDQpzdHlsZT0iV0hJVEUtU1BB Q0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xP UjogcmdiKDAsMCwyNTUpOyBGT05UOiAxMnB4LzE4cHggQXJpYWw7IExFVFRFUi1TUEFDSU5HOiBu b3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAw cHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+RW5jbG9zZWQgDQpwbGVhc2Uga2lu ZGx5IHNlZSBpdHMgcGhvdG9zLiBGb3IgYW55IGlucXVpcmllcywgcGxlYXNlIHNlbmQgYW5kIHNl ZSBob3cgd2UgY2FuIA0KYmVuZWZpdCBmb3IgeW91ITwvRElWPg0KPERJViANCnN0eWxlPSJXSElU RS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7 IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZPTlQ6IDEycHgvMThweCBBcmlhbDsgTEVUVEVSLVNQQUNJ Tkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRF TlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48QlI+PC9ESVY+DQo8RElW IA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhULVRS QU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMjU1KTsgRk9OVDogMTJweC8xOHB4IEFyaWFs OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwy NTUpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxC Uj48L0RJVj4NCjxESVYgDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5H OiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwyNTUpOyBGT05UOiAx MnB4LzE4cHggQXJpYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6 IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Ut d2lkdGg6IDBweCI+PEJSPjwvRElWPg0KPERJViANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFs OyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCww LDI1NSk7IEZPTlQ6IDEycHgvMThweCBBcmlhbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFD S0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtp dC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij4NCjxIUiBzdHlsZT0iQk9YLVNJWklORzogYm9yZGVy LWJveDsgSEVJR0hUOiAxcHg7IFdJRFRIOiAyMTBweCIgYWxpZ249bGVmdCANCmNvbG9yPSNiNWM0 ZGYgU0laRT0xPg0KDQo8RElWPg0KPERJViANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9O VC1GQU1JTFk6IOWui+S9kzsgUE9TSVRJT046IHN0YXRpYyAhaW1wb3J0YW50OyBDT0xPUjogcmdi KDAsMCwwKTsgTElORS1IRUlHSFQ6IDEuNSI+DQo8RElWIHN0eWxlPSJGT05ULVNJWkU6IDEwLjVw dDsgUE9TSVRJT046IHN0YXRpYyAhaW1wb3J0YW50OyBMSU5FLUhFSUdIVDogMS41Ij4NCjxESVYg c3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBQT1NJVElPTjogc3RhdGljICFpbXBvcnRhbnQ7IExJ TkUtSEVJR0hUOiAxLjUiPg0KPERJViBzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IFBPU0lUSU9O OiBzdGF0aWMgIWltcG9ydGFudDsgTElORS1IRUlHSFQ6IDEuNSI+DQo8RElWIA0Kc3R5bGU9IkZP TlQtU0laRTogMTAuNXB0OyBNQVJHSU4tVE9QOiAxMHB4OyBQT1NJVElPTjogc3RhdGljICFpbXBv cnRhbnQ7IE1BUkdJTi1MRUZUOiAxMHB4OyBNQVJHSU4tUklHSFQ6IDEwcHgiPg0KPERJViBzdHls ZT0iUE9TSVRJT046IHN0YXRpYyAhaW1wb3J0YW50Ij48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAx MC41cHQiPjxGT05UIA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgRk9OVC1GQU1JTFk6IFZlcmRh bmEiIGNvbG9yPSMwMDAwZmY+V2FybSBhbmQgDQp0ZW5kZXImbmJzcDtyZWdhcmRzLDwvRk9OVD48 U1BBTiBzdHlsZT0iRk9OVC1GQU1JTFk6IFZlcmRhbmEiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0la RTogMTBwdCI+DQo8RElWIHN0eWxlPSJGT05ULVNJWkU6IDEwcHQiPiZuYnNwOzwvRElWPg0KPERJ Vj48Rk9OVCBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0IiBjb2xvcj0jMDAwMGZmPjwvRk9OVD4mbmJz cDs8L0RJVj4NCjxESVY+PEZPTlQgc3R5bGU9IkZPTlQtU0laRTogMTBwdCIgY29sb3I9IzAwMDBm Zj48L0ZPTlQ+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMHB0OyBDT0xPUjogcmdiKDAsMCwy NTUpOyBMSU5FLUhFSUdIVDogMS41OyBCQUNLR1JPVU5ELUNPTE9SOiB3aW5kb3ciPkFuaXRhIA0K WmhlbmcoSW50ZXJuYXRpb25hbCBTYWxlcyk8L1NQQU4+PC9ESVY+DQo8UCBjbGFzcz1Nc29Ob1Nw YWNpbmcgc3R5bGU9Ik1BUkdJTjogMHB4IDBjbSI+PFNQQU4gbGFuZz1FTi1VUz48Rk9OVCANCnN0 eWxlPSJGT05ULVNJWkU6IDEwcHQiIGNvbG9yPSMwMDAwZmY+R1MgTWFjaGluaW5nIGZyb20gRG9u Z2d1YW4sIA0KQ2hpbmE8L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vU3BhY2luZyBz dHlsZT0iTUFSR0lOOiAwcHggMGNtIj48Rk9OVCBjb2xvcj0jMDAwMGZmPjxCIA0Kc3R5bGU9Ik1B UkdJTi1CT1RUT006IDBweDsgTUFSR0lOLVRPUDogMHB4Ij48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTBwdCI+TWFudWZhY3R1cmVyIG9mJm5ic3A7ZXh0cnVzaW9uIA0KbW91 bGQ8L1NQQU4+PC9CPjwvRk9OVD48L1A+DQo8UCBjbGFzcz1Nc29Ob1NwYWNpbmcgc3R5bGU9Ik1B UkdJTjogMHB4IDBjbSI+PEZPTlQgY29sb3I9IzAwMDBmZj48U1BBTiANCmxhbmc9RU4tVVMgc3R5 bGU9IkZPTlQtU0laRTogMTBwdCI+V2Vic2l0ZTogZ3MtbWFjaGluaW5nLmNvbTwvU1BBTj48U1BB TiANCmxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog5a6L 5L2TOyBDT0xPUjogc2lsdmVyIj48P3htbDpuYW1lc3BhY2UgcHJlZml4ID0gDQoibyIgLz48bzpw IA0Kc3R5bGU9IkZPTlQtU0laRTogMTBwdDsgTUFSR0lOLUJPVFRPTTogMHB4OyBGT05ULUZBTUlM WTogVmVyZGFuYTsgTUFSR0lOLVRPUDogMHB4Ij48L286cD48L1NQQU4+PC9GT05UPjwvUD4NCjxQ IGNsYXNzPU1zb05vU3BhY2luZyBzdHlsZT0iTUFSR0lOOiAwcHggMGNtIj48Rk9OVCBjb2xvcj0j MDAwMGZmPjxTUEFOIA0KbGFuZz1FTi1VUz48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMHB0Ij5U ZWw6ICs4Ni03NjktODExMjQxNjcmbmJzcDsmbmJzcDsmbmJzcDsgDQpGYXg6IA0KKzg2LTc2OS04 OTAzMjExOS0wODExPC9TUEFOPjwvU1BBTj48L0ZPTlQ+PC9QPjwvU1BBTj48L1NQQU4+PC9TUEFO PjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvRElWPjwvQk9EWT48 L0hUTUw+DQoNCg== From zlang@redhat.com Wed Aug 17 03:33:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2AC887CA0 for ; Wed, 17 Aug 2016 03:33:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EFC718F8033 for ; Wed, 17 Aug 2016 01:33:44 -0700 (PDT) X-ASG-Debug-ID: 1471422822-0bf57b64af4eb60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AUSl28Y4FZocrICN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 17 Aug 2016 01:33:43 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 8C99183F43; Wed, 17 Aug 2016 08:33:42 +0000 (UTC) Received: from localhost (dhcp12-196.nay.redhat.com [10.66.12.196] (may be forged)) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7H8Xe80021413; Wed, 17 Aug 2016 04:33:41 -0400 Date: Wed, 17 Aug 2016 16:33:40 +0800 From: Zorro Lang To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV Message-ID: <20160817083340.GB7193@zlang.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV References: <2ca2dc3b-53d2-0791-644f-c9cd5abef89f@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2ca2dc3b-53d2-0791-644f-c9cd5abef89f@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 17 Aug 2016 08:33:42 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471422823 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11109 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 15, 2016 at 10:17:19PM -0500, Eric Sandeen wrote: > The new XFS_GETQSTATV quotactl, available since kernel v3.12, > was never implemented in xfs_quota, and the "state" command > continues to use XFS_GETQSTAT, which cannot report both > group & project quota on newer formats. > > The new call has room for all 3 quota types (user, group, and > quota), vs just two, where previously project and quota > overlapped. > > So: > > First, try XFS_GETQSTATV. > If it passes, we have all the information we need, and we print > it. state_qfilestat() is modified to take the newer structure. > > If it fails, try XFS_GETQSTAT. If that passes, we are on an > older kernel with neither XFS_GETQSTATV nor the on-disk project > quota inode. We copy the available information into the newer > statv structure, carefully determining wither group or project > (or neither) is actually active, and print it with the same > state_qfilestat routine. > > Signed-off-by: Eric Sandeen > --- Hi Eric, This's what I tried to explain to you: [root@dhcp-13-149 ~]# mount /dev/mapper/testvg-scratchdev /mnt/scratch -o pquota,gquota,uquota [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "limit bsoft=100m bhard=200m fsgqa" /mnt/scratch [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "limit -g bsoft=100m bhard=200m fsgqa" /mnt/scratch [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "state" /mnt/scratch User quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: ON Enforcement: ON Inode: #101 (2 blocks, 2 extents) Group quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: ON Enforcement: ON Inode: #99 (2 blocks, 2 extents) Project quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: ON Enforcement: ON Inode: #100 (1 blocks, 1 extents) Blocks grace time: [7 days] Inodes grace time: [7 days] Realtime Blocks grace time: [7 days] [root@dhcp-13-149 xfsprogs-dev]# umount /mnt/scratch [root@dhcp-13-149 xfsprogs-dev]# mount /dev/mapper/testvg-scratchdev /mnt/scratch -o pquota [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "state" /mnt/scratch User quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: OFF Enforcement: OFF Inode: #0 (0 blocks, 0 extents) Group quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: OFF Enforcement: OFF Inode: #0 (0 blocks, 0 extents) Project quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) Accounting: ON Enforcement: ON Inode: #100 (1 blocks, 1 extents) Blocks grace time: [7 days] Inodes grace time: [7 days] Realtime Blocks grace time: [7 days] [root@dhcp-13-149 ~]# xfs_db -r -c "sb 0" -c "p" /dev/mapper/testvg-scratchdev|grep quot uquotino = 101 gquotino = 99 pquotino = 100 If I someone quota isn't enable, "state" command will print that inode number, blocks and extents as 0. Do you think this's a problem should be fixed? If it's a bug, maybe we can fix it on another patch later, because it's another bug? Thanks, Zorro > > I probably could have done some memcpy()'s in > state_stat_to_statv(), but opted for the explicit copy-out; > the structures aren't identical, although the newer one > only differs by padding on the end. If memcpy() is preferable > I could send a V2... > > V2: set sv.qs_version = FS_QSTATV_VERSION1; before calling > the quotactl (thanks Zorro!) > > diff --git a/include/xqm.h b/include/xqm.h > index c084b2d..5b6934a 100644 > --- a/include/xqm.h > +++ b/include/xqm.h > @@ -32,6 +32,7 @@ > #define Q_XGETQSTAT XQM_CMD(5) /* get quota subsystem status */ > #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */ > #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */ > +#define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */ > #define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage */ > > /* > @@ -149,4 +150,35 @@ typedef struct fs_quota_stat { > __u16 qs_iwarnlimit; /* limit for num warnings */ > } fs_quota_stat_t; > > + > +#ifndef FS_QSTATV_VERSION1 > +#define FS_QSTATV_VERSION1 1 /* fs_quota_statv.qs_version */ > +#endif > + > +/* > + * Some basic information about 'quota files' for Q_XGETQSTATV command > + */ > +struct fs_qfilestatv { > + __u64 qfs_ino; /* inode number */ > + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ > + __u32 qfs_nextents; /* number of extents */ > + __u32 qfs_pad; /* pad for 8-byte alignment */ > +}; > + > +struct fs_quota_statv { > + __s8 qs_version; /* version for future changes */ > + __u8 qs_pad1; /* pad for 16bit alignment */ > + __u16 qs_flags; /* FS_QUOTA_.* flags */ > + __u32 qs_incoredqs; /* number of dquots incore */ > + struct fs_qfilestatv qs_uquota; /* user quota information */ > + struct fs_qfilestatv qs_gquota; /* group quota information */ > + struct fs_qfilestatv qs_pquota; /* project quota information */ > + __s32 qs_btimelimit; /* limit for blks timer */ > + __s32 qs_itimelimit; /* limit for inodes timer */ > + __s32 qs_rtbtimelimit;/* limit for rt blks timer */ > + __u16 qs_bwarnlimit; /* limit for num warnings */ > + __u16 qs_iwarnlimit; /* limit for num warnings */ > + __u64 qs_pad2[8]; /* for future proofing */ > +}; > + > #endif /* __XQM_H__ */ > diff --git a/quota/linux.c b/quota/linux.c > index 74dba01..4f1f3c4 100644 > --- a/quota/linux.c > +++ b/quota/linux.c > @@ -55,6 +55,8 @@ xcommand_to_qcommand( > return Q_XSETQLIM; > case XFS_GETQSTAT: > return Q_XGETQSTAT; > + case XFS_GETQSTATV: > + return Q_XGETQSTATV; > case XFS_QUOTARM: > return Q_XQUOTARM; > case XFS_QSYNC: > diff --git a/quota/state.c b/quota/state.c > index 8186762..9f6616e 100644 > --- a/quota/state.c > +++ b/quota/state.c > @@ -111,12 +111,12 @@ remove_help(void) > > static void > state_qfilestat( > - FILE *fp, > - fs_path_t *mount, > - uint type, > - fs_qfilestat_t *qfs, > - int accounting, > - int enforcing) > + FILE *fp, > + struct fs_path *mount, > + uint type, > + struct fs_qfilestatv *qfs, > + int accounting, > + int enforcing) > { > fprintf(fp, _("%s quota state on %s (%s)\n"), type_to_string(type), > mount->fs_dir, mount->fs_name); > @@ -142,39 +142,96 @@ state_timelimit( > time_to_string(timelimit, VERBOSE_FLAG | ABSOLUTE_FLAG)); > } > > +/* > + * fs_quota_stat holds a subset of fs_quota_statv; this copies > + * the smaller into the larger, leaving any not-present fields > + * empty. This is so the same reporting function can be used > + * for both XFS_GETQSTAT and XFS_GETQSTATV results. > + */ > static void > -state_quotafile_mount( > - FILE *fp, > - uint type, > - fs_path_t *mount, > - uint flags) > +state_stat_to_statv( > + struct fs_quota_stat *s, > + struct fs_quota_statv *sv) > { > - fs_quota_stat_t s; > - char *dev = mount->fs_name; > + memset(sv, 0, sizeof(struct fs_quota_statv)); > + > + /* shared information */ > + sv->qs_version = s->qs_version; > + sv->qs_flags = s->qs_flags; > + sv->qs_incoredqs = s->qs_incoredqs; > + sv->qs_btimelimit = s->qs_btimelimit; > + sv->qs_itimelimit = s->qs_itimelimit; > + sv->qs_rtbtimelimit = s->qs_rtbtimelimit; > + sv->qs_bwarnlimit = s->qs_bwarnlimit; > + sv->qs_iwarnlimit = s->qs_iwarnlimit; > + > + /* Always room for uquota */ > + sv->qs_uquota.qfs_ino = s->qs_uquota.qfs_ino; > + sv->qs_uquota.qfs_nblks = s->qs_uquota.qfs_nblks; > + sv->qs_uquota.qfs_nextents = s->qs_uquota.qfs_nextents; > + > + /* > + * If we are here, XFS_GETQSTATV failed and XFS_GETQSTAT passed; > + * that is a very strong hint that we're on a kernel which predates > + * the on-disk pquota inode; both were added in v3.12. So, we do > + * some tricksy determination here. > + * gs_gquota may hold either group quota inode info, or project > + * quota if that is used instead; which one it actually holds depends > + * on the quota flags. (If neither is set, neither is used) > + */ > + if (s->qs_flags & XFS_QUOTA_GDQ_ACCT) { > + /* gs_gquota holds group quota info */ > + sv->qs_gquota.qfs_ino = s->qs_gquota.qfs_ino; > + sv->qs_gquota.qfs_nblks = s->qs_gquota.qfs_nblks; > + sv->qs_gquota.qfs_nextents = s->qs_gquota.qfs_nextents; > + } else if (s->qs_flags & XFS_QUOTA_PDQ_ACCT) { > + /* gs_gquota actually holds project quota info */ > + sv->qs_pquota.qfs_ino = s->qs_gquota.qfs_ino; > + sv->qs_pquota.qfs_nblks = s->qs_gquota.qfs_nblks; > + sv->qs_pquota.qfs_nextents = s->qs_gquota.qfs_nextents; > + } > +} > > - if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > - if (flags & VERBOSE_FLAG) > - fprintf(fp, _("%s quota are not enabled on %s\n"), > - type_to_string(type), dev); > - return; > +static void > +state_quotafile_mount( > + FILE *fp, > + uint type, > + struct fs_path *mount, > + uint flags) > +{ > + struct fs_quota_stat s; > + struct fs_quota_statv sv; > + char *dev = mount->fs_name; > + > + sv.qs_version = FS_QSTATV_VERSION1; > + > + if (xfsquotactl(XFS_GETQSTATV, dev, type, 0, (void *)&sv) < 0) { > + if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > + if (flags & VERBOSE_FLAG) > + fprintf(fp, > + _("%s quota are not enabled on %s\n"), > + type_to_string(type), dev); > + return; > + } > + state_stat_to_statv(&s, &sv); > } > > if (type & XFS_USER_QUOTA) > - state_qfilestat(fp, mount, XFS_USER_QUOTA, &s.qs_uquota, > - s.qs_flags & XFS_QUOTA_UDQ_ACCT, > - s.qs_flags & XFS_QUOTA_UDQ_ENFD); > + state_qfilestat(fp, mount, XFS_USER_QUOTA, &sv.qs_uquota, > + sv.qs_flags & XFS_QUOTA_UDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_UDQ_ENFD); > if (type & XFS_GROUP_QUOTA) > - state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &s.qs_gquota, > - s.qs_flags & XFS_QUOTA_GDQ_ACCT, > - s.qs_flags & XFS_QUOTA_GDQ_ENFD); > + state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &sv.qs_gquota, > + sv.qs_flags & XFS_QUOTA_GDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_GDQ_ENFD); > if (type & XFS_PROJ_QUOTA) > - state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &s.qs_gquota, > - s.qs_flags & XFS_QUOTA_PDQ_ACCT, > - s.qs_flags & XFS_QUOTA_PDQ_ENFD); > + state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &sv.qs_pquota, > + sv.qs_flags & XFS_QUOTA_PDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_PDQ_ENFD); > > - state_timelimit(fp, XFS_BLOCK_QUOTA, s.qs_btimelimit); > - state_timelimit(fp, XFS_INODE_QUOTA, s.qs_itimelimit); > - state_timelimit(fp, XFS_RTBLOCK_QUOTA, s.qs_rtbtimelimit); > + state_timelimit(fp, XFS_BLOCK_QUOTA, sv.qs_btimelimit); > + state_timelimit(fp, XFS_INODE_QUOTA, sv.qs_itimelimit); > + state_timelimit(fp, XFS_RTBLOCK_QUOTA, sv.qs_rtbtimelimit); > } > > static void > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From Vicky16@compressor.com Wed Aug 17 04:37:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FROM_LOCAL_DIGITS,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 30ED57CA0 for ; Wed, 17 Aug 2016 04:37:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA0228F80AD for ; Wed, 17 Aug 2016 02:37:40 -0700 (PDT) X-ASG-Debug-ID: 1471426656-0bf81563e44d550001-NocioJ Received: from compressor.com ([58.23.19.254]) by cuda.sgi.com with SMTP id mibZbuEPiPUEWuaF for ; Wed, 17 Aug 2016 02:37:36 -0700 (PDT) X-Barracuda-Envelope-From: Vicky16@compressor.com X-Barracuda-Effective-Source-IP: UNKNOWN[58.23.19.254] X-Barracuda-Apparent-Source-IP: 58.23.19.254 Received: from no07[127.0.0.1] by NO07[127.0.0.1] (SMTPD32); Wed, 17 Aug 2016 17:38:28 +0800 From: "18850525834@163.com" <18850525834@163.com> Subject: FW: Industrial air compressor Manufacturer from China To: xfs@oss.sgi.com X-ASG-Orig-Subj: FW: Industrial air compressor Manufacturer from China MIME-Version: 1.0 Sender: Vicky16@compressor.com Reply-To: 18850525834@163.com Date: Wed, 17 Aug 2016 17:38:28 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[58.23.19.254] X-Barracuda-Start-Time: 1471426656 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4476 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.48 X-Barracuda-Spam-Status: No, SCORE=1.48 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, FROM_LOCAL_DIGITS, FROM_LOCAL_HEX, FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32084 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 FROM_LOCAL_DIGITS From: localpart has long digit sequence 0.00 FROM_LOCAL_HEX From: localpart has long hexadecimal sequence 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160817093740.37F0CD80079@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTAuMDAuOTIwMC4xNzYwOSI+PC9IRUFEPg0KPEJPRFk+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9 IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMt c2VyaWYmIzM5OyI+SGVsbG8sPEJSPjxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgDQpHbGFkIHRvIGhlYXIgdGhhdCB5b3UmIzM5O3JlIG9uIHRoZSBtYXJrZXQg Zm9yIGNvbXByZXNzb3IgDQppdGVtcy48QlI+PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyBUaGlzIGlzIFZpY2t5LCBmcm9tIA0KWGlhbWVuIEhpZ2hRIENvbXBy ZXNzb3IgQ28uIEx0ZC4gV2Ugc3BlY2lhbGl6ZWQgaW4gcHJvZHVjaW5nJm5ic3A7Y29tcHJlc3Nv cnMgDQpvdmVyIDEwIHllYXJzLCZuYnNwOyBub3cgd2UgYXJlIGxvb2tpbmcgZm9yIGNvbXByZXNz b3IgcGFydG5lciBpbiB5b3VyIGNvdW50cnkhIA0KT3VyIHNjcmV3IGFpciBjb21wcmVzc29yIHdp dGggUm90b3Jjb21wIEFpci1lbmQmbmJzcDssIFNjaG5laWRlciBDb250cm9sbGVyIGFuZCANCm90 aGVyJm5ic3A7ZmFtb3VzIGJyYW5kIGNvbXBvbmVudHMuPC9TUEFOPjwvUD48U1BBTiBsYW5nPUVO LVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5 OywmIzM5O3NhbnMtc2VyaWYmIzM5OyI+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFD S0dST1VORDogd2hpdGU7IExBWU9VVC1HUklELU1PREU6IGJvdGg7IFRFWFQtQUxJR046IGp1c3Rp Znk7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBM SU5FLUhFSUdIVDogMTUuNzVwdDsgVEVYVC1JTkRFTlQ6IDIycHQ7IG1zby1sYXlvdXQtZ3JpZC1h bGlnbjogYXV0bzsgbXNvLWNoYXItaW5kZW50LWNvdW50OiAyLjAiPjxTUEFOIA0KbGFuZz1FTi1V UyANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYj Mzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby10 aGVtZWNvbG9yOiB0ZXh0MSI+MS5IYXZlIA0KeW91IGV2ZXIgbWVldCBhIGN1c3RvbWVyIHdobyBj YW7igJl0Jm5ic3A7IGFjY2VwdCB0aGUgcHJpY2Ugb2YgeW91ciBkaXN0cmlidXRpbmcgDQpicmFu ZD88bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFD S0dST1VORDogd2hpdGU7IExBWU9VVC1HUklELU1PREU6IGJvdGg7IFRFWFQtQUxJR046IGp1c3Rp Znk7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBM SU5FLUhFSUdIVDogMTUuNzVwdDsgVEVYVC1JTkRFTlQ6IDIycHQ7IG1zby1sYXlvdXQtZ3JpZC1h bGlnbjogYXV0bzsgbXNvLWNoYXItaW5kZW50LWNvdW50OiAyLjAiPjxTUEFOIA0KbGFuZz1FTi1V UyANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYj Mzk7OyBDT0xPUjogYmxhY2s7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby10 aGVtZWNvbG9yOiB0ZXh0MSI+Mi5Xb3VsZCANCnlvdSBiZSBpbnRlcmVzdGVkIGluIGhhdmluZyBh bm90aGVyIGNvbXByZXNzb3IgYnJhbmQgd2hpY2ggaXMmbmJzcDt0cnVseSANCnJlbGlhYmxlIGFu ZCBsb3cgY29zdCB0byZuYnNwOyBhcyBhbiAyPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+bmQgb3B0aW9uIA0KZm9yIHlvdXIgY3VzdG9t ZXI/PFNQQU4gDQpzdHlsZT0iQ09MT1I6IGJsYWNrOyBtc28tdGhlbWVjb2xvcjogdGV4dDEiPjxv OnA+PC9vOnA+PC9TUEFOPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0i QkFDS0dST1VORDogd2hpdGU7IExBWU9VVC1HUklELU1PREU6IGJvdGg7IFRFWFQtQUxJR046IGp1 c3RpZnk7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBo OyBMSU5FLUhFSUdIVDogMTUuNzVwdDsgVEVYVC1JTkRFTlQ6IDIycHQ7IG1zby1sYXlvdXQtZ3Jp ZC1hbGlnbjogYXV0bzsgbXNvLWNoYXItaW5kZW50LWNvdW50OiAyLjAiPjxTUEFOIA0KbGFuZz1F Ti1VUyANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJp ZiYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj4zLldvdWxkIA0KeW91IGxp a2UgdG8gaGF2ZSB5b3VyIG93biBicmFuZCBvZiBjb21wcmVzc29yPyBXZSBhcmUgZnVsbCBvZiBw cm9mZXNzaW9uYWwgDQpleHBlcmllbmNlIGluIE9FTS48L1NQQU4+PEJSPjxCUj4mbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQpIb3BpbmcgdG8gaGVhciB5b3VyIGlu dGVyZXN0aW5nISBDYW4geW91IHBsZWFzZSBnaXZlIG1lIHlvdXIga2luZCANCnJlcGx5PzxvOnA+ PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20g MGNtIDEwcHQiPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05U LUZBTUlMWTogJiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYjMzk7Ij4mbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgDQo8L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5z LXNlcmlmJiMzOTsiPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0la RTogMTJwdDsgRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5 OyI+QmVzdCANClJlZ2FyZHMsPG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxl PSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5z LXNlcmlmJiMzOTsiPjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwvUD48U1BBTiANCmxhbmc9RU4t VVMgc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMz OTsiPjxvOnA+DQo8RElWIA0Kc3R5bGU9Ik1BUkdJTi1CT1RUT006IDBweDsgV0hJVEUtU1BBQ0U6 IG5vcm1hbDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IFdPUkQtU1BBQ0lORzogMHB4OyBDT0xPUjog cmdiKDAsMCwwKTsgRk9OVDogMTRweCDlrovkvZM7IE1BUkdJTi1UT1A6IDBweDsgTEVUVEVSLVNQ QUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1J TkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48Rk9OVCANCnN0eWxl PSJGT05ULUZBTUlMWTogQXJpYWwiIGNvbG9yPSMzMzMzNjY+Vmlja3k8L0ZPTlQ+PC9ESVY+DQo8 RElWIA0Kc3R5bGU9Ik1BUkdJTi1CT1RUT006IDBweDsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgVEVY VC1UUkFOU0ZPUk06IG5vbmU7IFdPUkQtU1BBQ0lORzogMHB4OyBDT0xPUjogcmdiKDAsMCwwKTsg Rk9OVDogMTRweCDlrovkvZM7IE1BUkdJTi1UT1A6IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1h bDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsg LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij5Db21wYW55IA0KU2t5cGU6PFNQQU4gY2xh c3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48QSANCnN0eWxlPSJURVhULURF Q09SQVRJT046IG5vbmUgIWltcG9ydGFudCIgaHJlZj0ibWFpbHRvOlZpbmNlbnRAaHFjb21wLmNv bSIgDQp0YXJnZXQ9X2JsYW5rPlZpbmNlbnRAaHFjb21wLmNvbTwvQT48L0RJVj48L286cD48L1NQ QU4+DQo8UD48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From Sales.75@fashion-business.com Wed Aug 17 05:58:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=DATE_IN_PAST_06_12, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 00ADC7CA1 for ; Wed, 17 Aug 2016 05:58:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85EC83040CA for ; Wed, 17 Aug 2016 03:58:22 -0700 (PDT) X-ASG-Debug-ID: 1471431498-0bf81563e44f3c0001-NocioJ Received: from fashion-business.com ([14.218.97.12]) by cuda.sgi.com with SMTP id wzg0oqSKST2MY0yj for ; Wed, 17 Aug 2016 03:58:19 -0700 (PDT) X-Barracuda-Envelope-From: Sales.75@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.97.12] X-Barracuda-Apparent-Source-IP: 14.218.97.12 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Wed, 17 Aug 2016 09:25:57 +0800 From: "angelbervogue@sina.com" Subject: Luxury bag for your checking To: xfs@oss.sgi.com X-ASG-Orig-Subj: Luxury bag for your checking MIME-Version: 1.0 Sender: Sales.75@fashion-business.com Reply-To: angelbervogue@sina.com Date: Wed, 17 Aug 2016 09:25:57 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.97.12] X-Barracuda-Start-Time: 1471431498 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2529 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.85 X-Barracuda-Spam-Status: No, SCORE=1.85 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_PAST_06_12, DATE_IN_PAST_06_12_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_06_12 Date: is 6 to 12 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.10 DATE_IN_PAST_06_12_2 DATE_IN_PAST_06_12_2 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160817105821.EF653D80079@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJNQVJHSU4t Qk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog 5a6L5L2TOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28taGFu c2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWwiPkhpJm5i c3A7ZnJpZW5kLDwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFz cz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpF OiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBB cmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5XZSANCmFyZSBwcm9mZXNzaW9uYWwg c3VwcGxpZXIgZm9yIHZvZ3VlIGJhZ3MgaW4gQ2hpbmEuIE5pY2UgdG8gaW50cm9kdWNlIG91ciBu ZXcgDQpwcm9qZWN0IHRvIHlvdSBmcm9tIGhlcmUuPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJH SU4tQk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTog5a6L5L2TOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28t aGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWwiPk9u ZSANCmtpbmRzIG9mIG5ldyBzdHlsZSBiYWcgd2lsbCBiZSBzaG93biBpbiBFdXJvcGUgbWFya2V0 LCB0aGlzIGRlc2lnbiB3aWxsIGJlIG1hZGUgDQpieSB0aGUgZmlyc3QgbGF5ZXIgZ2VudWluZSBs ZWF0aGVyLCBhbmQgdGhlIGxvZ28gd2lsbCBiZSBtYWRlIGJ5IHN0YWlubGVzcyBzdGVlbCANCmZp bmlzaGVkIGJ5IHJlYWwgZ29sZGVuIHdhdGVyIHBsYXRpbmcuPC9TUEFOPjwvUD4NCjxQIHN0eWxl PSJNQVJHSU4tQk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFs OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJp YWwiPklmIA0KeW91IGFyZSBpbnRlcmVzdGVkIHdpdGggdGhpcywgSSB3aWxsIHNlbmQgdGhlIGNh dGFsb2cgdG8geW91IGZvciANCmNoZWNraW5nLjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lO LUJPVFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IOWui+S9kzsgRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhh bnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5UaGFu a3MgDQphbmQgYmVzdCByZWdhcmRzITwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRP TTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9 kzsgRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZv bnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5BbmdlbG8gDQpI dWFuZzwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFzcz1Nc29O b3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1TSVpFOiAxMC41 cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsg bXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsIj5Ta3lwZTogDQpkYXZpZTE4MTgxODwvU1BBTj48 L1A+PC9CT0RZPjwvSFRNTD4NCg0K From Sales.33@fashion-business.com Wed Aug 17 06:00:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BEFE17CA1 for ; Wed, 17 Aug 2016 06:00:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 72DC63040CA for ; Wed, 17 Aug 2016 04:00:29 -0700 (PDT) X-ASG-Debug-ID: 1471431625-0bf81563e44f560001-NocioJ Received: from fashion-business.com ([14.218.97.12]) by cuda.sgi.com with SMTP id LppaGBo8DmVRapbq for ; Wed, 17 Aug 2016 04:00:25 -0700 (PDT) X-Barracuda-Envelope-From: Sales.33@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.97.12] X-Barracuda-Apparent-Source-IP: 14.218.97.12 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Wed, 17 Aug 2016 16:50:03 +0800 From: "angelbervogue@sina.com" Subject: FW: Hot brand bags -- ANGELBER To: xfs@oss.sgi.com X-ASG-Orig-Subj: FW: Hot brand bags -- ANGELBER MIME-Version: 1.0 Sender: Sales.33@fashion-business.com Reply-To: angelbervogue@sina.com Date: Wed, 17 Aug 2016 16:50:03 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.97.12] X-Barracuda-Start-Time: 1471431625 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5688 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160817110028.E8051D80071@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFs OyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1T SVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+SGkmbmJzcDtmcmllbmQs PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcu ODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0Niwy NDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdi KDI0NiwyNDYsMjQ2KSI+RnJvbSANCnRoZSBpbnRlcm5ldCwgSSBrbm93IHlvdSBhcmUgdGhlIGJp ZyBjaGFpbiBzdG9yZXMgZm9yIHRoZSBUb3AgRGVzaWduIGJ1c2luZXNzLiANClRvIGRpc3R1cmIg eW91ciAxMCBtaW51dGVzIHRvIHJlYWQgdGhpcyBtYWlsLCB0aGFua3MmbmJzcDthIGxvdCE8L1NQ QU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2 LDI0NiwyNDYpIj5IZXJlIA0KaXMgQW5nZWxvIHdobyBjb21lcyBmcm9tIEFuZ2VsYmVyIFZvZ3Vl IENvLiwgTHRkOyZuYnNwO291ciBjb21wYW55IGlzIA0KYSZuYnNwO3Byb2Zlc3Npb25hbCBtYW51 ZmFjdHVyZXIgaW4gYmFncyBmaWVsZC4gVGhlIGJyYW5kIG9mIHVzIGlzIEFOR0VMQkVSLCB3ZSAN CmFjY2VwdCB0byB3b3JrIHdpdGggY3VzdG9tZXIgaW4gT0VNICZhbXA7IE9ETSBzdHlsZS48L1NQ QU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2 LDI0NiwyNDYpIj5PdXIgDQphZHZhbnRhZ2VzOjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1B TElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1v cnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlh bDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPjEuIA0KV2UgYXJlIGJh Z3MgZXhwZXJ0LjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1I RUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdi KDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNo YWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPiZuYnNwOyZuYnNwOyZuYnNwOyANCjE1MCBhcmUgb3Vy IGZlYXR1cmVkIHByb2R1Y3RzLCBhbmQgdGhpcyBxdWFudGl0eSBpcyBhbHdheXMgaW5jcmVhc2Vk LCB0aGUgbWFpbmx5IA0KcHJvZHVjdHMgaW5jbHVkZSBsYWRpZXMgaGFuZGJhZ3MsIG1lbiYjMzk7 cyBicmllZmNhc2UsIHRvdGVzIGJhZywgd2FsbGV0IA0KZXRjLjwvU1BBTj48L1A+DQo8UCBzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9u OiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPjIuIA0K R29vZCBxdWFsaXR5IHdpdGggY29tcGV0aXRpdmUgcHJpY2U8L1NQQU4+PC9QPg0KPFAgc3R5bGU9 IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0OyBtc28tcGFnaW5hdGlvbjog d2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IENPTE9SOiByZ2IoMCwwLDAp OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQt a2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2LDI0NiwyNDYpIj4mbmJzcDsm bmJzcDsmbmJzcDsgDQpXZSBkbyB3aG9sZXNhbGVzIGFuZCBvdXIgb2ZmZXIgaXMgYWx3YXlzIGJl dHRlciB0aGFuIG90aGVycy4gQnVsayBxdWFudGl0eSBjYW4gDQpiZSBncmFudGVkIGEgYmlnZ2Vy IGRpc2NvdW50LiBQcm9kdWN0cyBwYXNzIElTTzkwMDEsIENFLCBGQ0MsIFJvSFMgDQp0ZXN0aW5n OzwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3 Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxT UEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYs MjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJn YigyNDYsMjQ2LDI0NikiPjMuIA0KT0VNIHNlcnZpY2UgYXZhaWxhYmxlLjwvU1BBTj48L1A+DQo8 UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJn YigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0Niki PiZuYnNwOyZuYnNwOyZuYnNwOyANCldlIHNldCBtaW5pdW0gcXVhbnRpdHkgZm9yIHRoZSBPRU0s IGlmIHlvdXIgcXVhbnRpdHkgbWVldHMgd2l0aCBpdCwgT0VNIGlzIGZyZWUuIA0KRGVsaXZlcnkg ZGF0ZSBmb3Igc2FtcGxlcyBvcmRlciBpcyBpbiAyMCBkYXlzLCBmb3IgbWFzcyBxdWFudGl0eSBv cmRlciBpcyBpbiANCjMwfjQ1IGRheXMuPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdO OiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhh biIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBC QUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpF OiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAu MDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+SWYgDQp5b3UgYXJlIGludGVy ZXN0ZWQgaW4gb3VyIHByb2R1Y3RzLCBwbGVhc2UgY29udGFjdCBtZSBmcmVlbHksIEkgd2lsbCBz ZW5kIHRoZSANCmNhdGFsb2cgdG8geW91LjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElH TjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsg QkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAw LjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPlRoYW5rcyANCmFuZCBiZXN0 IHJlZ2FyZHMhPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhF SUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29O b3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2Io MjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+QW5nZWxvIA0KSHVhbmc8L1NQQU4+PC9QPg0KPFAgc3R5 bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0OyBtc28tcGFnaW5hdGlv bjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZv bnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2LDI0NiwyNDYpIj5Ta3lw ZTogDQpkYXZpZTE4MTgxODwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From scarlett.lowe@askeventz.com Wed Aug 17 06:29:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3BD1F7CA3 for ; Wed, 17 Aug 2016 06:29:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 098853041B6 for ; Wed, 17 Aug 2016 04:29:55 -0700 (PDT) X-ASG-Debug-ID: 1471433392-0bf57c0d014b9e0001-NocioJ Received: from askeventz.com ([198.57.191.88]) by cuda.sgi.com with ESMTP id nvaTcFOjFbhcNuEv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 17 Aug 2016 04:29:53 -0700 (PDT) X-Barracuda-Envelope-From: scarlett.lowe@askeventz.com X-Barracuda-Effective-Source-IP: UNKNOWN[198.57.191.88] X-Barracuda-Apparent-Source-IP: 198.57.191.88 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=askeventz.com; s=default; h=Content-Type:MIME-Version:Message-ID:Date: Subject:To:From:Sender:Reply-To:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=X75wN8lazQpiYa6zOovnJSgGggt84ag1gBu+fYGPoUI=; b=OXCcxOf6aQOpCQUtx2pQV2x/pi fQC/8GI0nz9qrs2ixHraV0FaHxFqlFq8+PbAbNcLhznNpE/dQB+7hOsCzO/XI053hecVKOQRpZZid U0v65OKkAapOeSnHwk3HjTtXY2b1FUlkZG/viJg4GK8mEHvBntvasgLzoSMZruSR9shO1FHp1a6to KglT5VRVCyAhW41L7upN6DgLK2DYEz1N4/zcAoBZxqpxC401KnHD0e1a364+A86W/p4mOu75Yo6nO Pqdy5dMcJddw5gXbenSG/7Q7EN+0ki4UIbOBr7GSwGHS2WozgKYh8aIYCLwxHbbs58niE6j2jdhVs FX4/xTTw==; Received: from [122.167.170.84] (port=49483 helo=adminPC) by 198-57-182-13.webhostbox.net with esmtpsa (TLSv1:ECDHE-RSA-AES256-SHA:256) (Exim 4.87) (envelope-from ) id 1bZpDl-00039G-Hp for xfs@oss.sgi.com; Wed, 17 Aug 2016 01:00:42 +0000 Return-Receipt-To: "Scarlett Lowe" From: "Scarlett Lowe" To: Subject: Interested in the VMworld US 2016 Attendees File? Date: Tue, 16 Aug 2016 19:59:44 -0500 X-ASG-Orig-Subj: Interested in the VMworld US 2016 Attendees File? Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_701C_01D1F7F8.D780AF20" X-Mailer: Microsoft Outlook 14.0 Thread-Index: AdH4IoYi66PC2q8SSEucWuqfyCf4uw== Content-Language: en-us X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - 198-57-182-13.webhostbox.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - askeventz.com X-Get-Message-Sender-Via: 198-57-182-13.webhostbox.net: authenticated_id: scarlett.lowe@askeventz.com X-Authenticated-Sender: 198-57-182-13.webhostbox.net: scarlett.lowe@askeventz.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: UNKNOWN[198.57.191.88] X-Barracuda-Start-Time: 1471433393 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5307 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.61 X-Barracuda-Spam-Status: No, SCORE=0.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, HTML_MESSAGE, RDNS_NONE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32086 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multipart message in MIME format. ------=_NextPart_000_701C_01D1F7F8.D780AF20 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Good Day! I hope this isn't a bad time, however, would you be interested in the "VMworld US 2016 Attendees List/File" to connect and discuss your services & offerings? Here are the details for your review: Counts- 6000 Records Information fields: Name, Title/Specialty, Company Name, Website, Mailing Address, Phone, Permission based E-mail Addresses etc... Usage: Unlimited. Cost / Contact: 0.60 cents [Total: $3600] Best Price before 22nd August 2016: 2999 USD Let me know if we can engage further & provide you with more information for your review. Appreciate your time & for any questions that you may have! Thank you. Regards Scarlett Lowe Sr. Data Analyst To Unsubscribe, Please reply with "Remove" in the subject line ------=_NextPart_000_701C_01D1F7F8.D780AF20 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

 

Good Day! I hope this = isn’t a bad time, however, would you be interested in the = “VMworld US 2016 Attendees List/File” to connect and = discuss your services & offerings?

 

Here are the details for = your review:

 

Counts- 6000 = Records

Information = fields: Name, Title/Specialty, Company Name, Website, Mailing Address, = Phone, Permission based E-mail Addresses etc...

Usage: Unlimited.

 

Cost / = Contact: 0.60 cents [Total: $3600]

Best Price before = 22nd August 2016: 2999 USD

 

Let me know if we can engage further & = provide you with more information for your review. Appreciate your time = & for any questions that you may have!

Thank you.

 

Regards

Scarlett Lowe

Sr. Data Analyst

 

To Unsubscribe, Please reply with = “Remove” in the subject line

 

------=_NextPart_000_701C_01D1F7F8.D780AF20-- From sandeen@sandeen.net Wed Aug 17 09:43:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7CE977CA0 for ; Wed, 17 Aug 2016 09:43:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F07C3040CD for ; Wed, 17 Aug 2016 07:43:40 -0700 (PDT) X-ASG-Debug-ID: 1471445016-0bf57c0cff52af0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id smzPvPbtXoKE7Eh3 for ; Wed, 17 Aug 2016 07:43:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D7E2E4456 for ; Wed, 17 Aug 2016 09:43:36 -0500 (CDT) Subject: Re: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV References: <2ca2dc3b-53d2-0791-644f-c9cd5abef89f@sandeen.net> <20160817083340.GB7193@zlang.usersys.redhat.com> From: Eric Sandeen Message-ID: <82f3c5f9-204d-845f-16cf-c267085242ac@sandeen.net> Date: Wed, 17 Aug 2016 09:43:36 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160817083340.GB7193@zlang.usersys.redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471445017 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11242 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32089 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/17/16 3:33 AM, Zorro Lang wrote: > Hi Eric, > > This's what I tried to explain to you: > > [root@dhcp-13-149 ~]# mount /dev/mapper/testvg-scratchdev /mnt/scratch -o pquota,gquota,uquota > [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "limit bsoft=100m bhard=200m fsgqa" /mnt/scratch > [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "limit -g bsoft=100m bhard=200m fsgqa" /mnt/scratch > [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "state" /mnt/scratch > User quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > Accounting: ON > Enforcement: ON > Inode: #101 (2 blocks, 2 extents) > Group quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > Accounting: ON > Enforcement: ON > Inode: #99 (2 blocks, 2 extents) > Project quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > Accounting: ON > Enforcement: ON > Inode: #100 (1 blocks, 1 extents) > Blocks grace time: [7 days] > Inodes grace time: [7 days] > Realtime Blocks grace time: [7 days] And that's all correct, right. > [root@dhcp-13-149 xfsprogs-dev]# umount /mnt/scratch > [root@dhcp-13-149 xfsprogs-dev]# mount /dev/mapper/testvg-scratchdev /mnt/scratch -o pquota Now you have only pquota... > [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "state" /mnt/scratch > User quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > Accounting: OFF > Enforcement: OFF > Inode: #0 (0 blocks, 0 extents) > Group quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > Accounting: OFF > Enforcement: OFF > Inode: #0 (0 blocks, 0 extents) > Project quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > Accounting: ON > Enforcement: ON > Inode: #100 (1 blocks, 1 extents) > Blocks grace time: [7 days] > Inodes grace time: [7 days] > Realtime Blocks grace time: [7 days] And pquota is properly shown, but user and group show inode 0. > [root@dhcp-13-149 ~]# xfs_db -r -c "sb 0" -c "p" /dev/mapper/testvg-scratchdev|grep quot > uquotino = 101 > gquotino = 99 > pquotino = 100 > > > If I someone quota isn't enable, "state" command will print that inode > number, blocks and extents as 0. *nod* > Do you think this's a problem should be fixed? > If it's a bug, maybe we can fix it on another patch later, because > it's another bug? This is a bug in the kernel, because it does not fill in inode information for inactive quota types, and fills in 0 instead (so we don't even get NULLFSINO). I did send a patch for this, [PATCH] quota: fill in Q_XGETQSTAT inode information for inactive quotas to the linux-fsdevel list (it is in common vfs quota code, but I probably should have cc'd the xfs list as well). Jan has indicated that he has merged it. With that patch and this one, it should all work as expected. Thanks, -Eric > Thanks, > Zorro > >> >> I probably could have done some memcpy()'s in >> state_stat_to_statv(), but opted for the explicit copy-out; >> the structures aren't identical, although the newer one >> only differs by padding on the end. If memcpy() is preferable >> I could send a V2... >> >> V2: set sv.qs_version = FS_QSTATV_VERSION1; before calling >> the quotactl (thanks Zorro!) >> >> diff --git a/include/xqm.h b/include/xqm.h >> index c084b2d..5b6934a 100644 >> --- a/include/xqm.h >> +++ b/include/xqm.h >> @@ -32,6 +32,7 @@ >> #define Q_XGETQSTAT XQM_CMD(5) /* get quota subsystem status */ >> #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */ >> #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */ >> +#define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */ >> #define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage */ >> >> /* >> @@ -149,4 +150,35 @@ typedef struct fs_quota_stat { >> __u16 qs_iwarnlimit; /* limit for num warnings */ >> } fs_quota_stat_t; >> >> + >> +#ifndef FS_QSTATV_VERSION1 >> +#define FS_QSTATV_VERSION1 1 /* fs_quota_statv.qs_version */ >> +#endif >> + >> +/* >> + * Some basic information about 'quota files' for Q_XGETQSTATV command >> + */ >> +struct fs_qfilestatv { >> + __u64 qfs_ino; /* inode number */ >> + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ >> + __u32 qfs_nextents; /* number of extents */ >> + __u32 qfs_pad; /* pad for 8-byte alignment */ >> +}; >> + >> +struct fs_quota_statv { >> + __s8 qs_version; /* version for future changes */ >> + __u8 qs_pad1; /* pad for 16bit alignment */ >> + __u16 qs_flags; /* FS_QUOTA_.* flags */ >> + __u32 qs_incoredqs; /* number of dquots incore */ >> + struct fs_qfilestatv qs_uquota; /* user quota information */ >> + struct fs_qfilestatv qs_gquota; /* group quota information */ >> + struct fs_qfilestatv qs_pquota; /* project quota information */ >> + __s32 qs_btimelimit; /* limit for blks timer */ >> + __s32 qs_itimelimit; /* limit for inodes timer */ >> + __s32 qs_rtbtimelimit;/* limit for rt blks timer */ >> + __u16 qs_bwarnlimit; /* limit for num warnings */ >> + __u16 qs_iwarnlimit; /* limit for num warnings */ >> + __u64 qs_pad2[8]; /* for future proofing */ >> +}; >> + >> #endif /* __XQM_H__ */ >> diff --git a/quota/linux.c b/quota/linux.c >> index 74dba01..4f1f3c4 100644 >> --- a/quota/linux.c >> +++ b/quota/linux.c >> @@ -55,6 +55,8 @@ xcommand_to_qcommand( >> return Q_XSETQLIM; >> case XFS_GETQSTAT: >> return Q_XGETQSTAT; >> + case XFS_GETQSTATV: >> + return Q_XGETQSTATV; >> case XFS_QUOTARM: >> return Q_XQUOTARM; >> case XFS_QSYNC: >> diff --git a/quota/state.c b/quota/state.c >> index 8186762..9f6616e 100644 >> --- a/quota/state.c >> +++ b/quota/state.c >> @@ -111,12 +111,12 @@ remove_help(void) >> >> static void >> state_qfilestat( >> - FILE *fp, >> - fs_path_t *mount, >> - uint type, >> - fs_qfilestat_t *qfs, >> - int accounting, >> - int enforcing) >> + FILE *fp, >> + struct fs_path *mount, >> + uint type, >> + struct fs_qfilestatv *qfs, >> + int accounting, >> + int enforcing) >> { >> fprintf(fp, _("%s quota state on %s (%s)\n"), type_to_string(type), >> mount->fs_dir, mount->fs_name); >> @@ -142,39 +142,96 @@ state_timelimit( >> time_to_string(timelimit, VERBOSE_FLAG | ABSOLUTE_FLAG)); >> } >> >> +/* >> + * fs_quota_stat holds a subset of fs_quota_statv; this copies >> + * the smaller into the larger, leaving any not-present fields >> + * empty. This is so the same reporting function can be used >> + * for both XFS_GETQSTAT and XFS_GETQSTATV results. >> + */ >> static void >> -state_quotafile_mount( >> - FILE *fp, >> - uint type, >> - fs_path_t *mount, >> - uint flags) >> +state_stat_to_statv( >> + struct fs_quota_stat *s, >> + struct fs_quota_statv *sv) >> { >> - fs_quota_stat_t s; >> - char *dev = mount->fs_name; >> + memset(sv, 0, sizeof(struct fs_quota_statv)); >> + >> + /* shared information */ >> + sv->qs_version = s->qs_version; >> + sv->qs_flags = s->qs_flags; >> + sv->qs_incoredqs = s->qs_incoredqs; >> + sv->qs_btimelimit = s->qs_btimelimit; >> + sv->qs_itimelimit = s->qs_itimelimit; >> + sv->qs_rtbtimelimit = s->qs_rtbtimelimit; >> + sv->qs_bwarnlimit = s->qs_bwarnlimit; >> + sv->qs_iwarnlimit = s->qs_iwarnlimit; >> + >> + /* Always room for uquota */ >> + sv->qs_uquota.qfs_ino = s->qs_uquota.qfs_ino; >> + sv->qs_uquota.qfs_nblks = s->qs_uquota.qfs_nblks; >> + sv->qs_uquota.qfs_nextents = s->qs_uquota.qfs_nextents; >> + >> + /* >> + * If we are here, XFS_GETQSTATV failed and XFS_GETQSTAT passed; >> + * that is a very strong hint that we're on a kernel which predates >> + * the on-disk pquota inode; both were added in v3.12. So, we do >> + * some tricksy determination here. >> + * gs_gquota may hold either group quota inode info, or project >> + * quota if that is used instead; which one it actually holds depends >> + * on the quota flags. (If neither is set, neither is used) >> + */ >> + if (s->qs_flags & XFS_QUOTA_GDQ_ACCT) { >> + /* gs_gquota holds group quota info */ >> + sv->qs_gquota.qfs_ino = s->qs_gquota.qfs_ino; >> + sv->qs_gquota.qfs_nblks = s->qs_gquota.qfs_nblks; >> + sv->qs_gquota.qfs_nextents = s->qs_gquota.qfs_nextents; >> + } else if (s->qs_flags & XFS_QUOTA_PDQ_ACCT) { >> + /* gs_gquota actually holds project quota info */ >> + sv->qs_pquota.qfs_ino = s->qs_gquota.qfs_ino; >> + sv->qs_pquota.qfs_nblks = s->qs_gquota.qfs_nblks; >> + sv->qs_pquota.qfs_nextents = s->qs_gquota.qfs_nextents; >> + } >> +} >> >> - if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { >> - if (flags & VERBOSE_FLAG) >> - fprintf(fp, _("%s quota are not enabled on %s\n"), >> - type_to_string(type), dev); >> - return; >> +static void >> +state_quotafile_mount( >> + FILE *fp, >> + uint type, >> + struct fs_path *mount, >> + uint flags) >> +{ >> + struct fs_quota_stat s; >> + struct fs_quota_statv sv; >> + char *dev = mount->fs_name; >> + >> + sv.qs_version = FS_QSTATV_VERSION1; >> + >> + if (xfsquotactl(XFS_GETQSTATV, dev, type, 0, (void *)&sv) < 0) { >> + if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { >> + if (flags & VERBOSE_FLAG) >> + fprintf(fp, >> + _("%s quota are not enabled on %s\n"), >> + type_to_string(type), dev); >> + return; >> + } >> + state_stat_to_statv(&s, &sv); >> } >> >> if (type & XFS_USER_QUOTA) >> - state_qfilestat(fp, mount, XFS_USER_QUOTA, &s.qs_uquota, >> - s.qs_flags & XFS_QUOTA_UDQ_ACCT, >> - s.qs_flags & XFS_QUOTA_UDQ_ENFD); >> + state_qfilestat(fp, mount, XFS_USER_QUOTA, &sv.qs_uquota, >> + sv.qs_flags & XFS_QUOTA_UDQ_ACCT, >> + sv.qs_flags & XFS_QUOTA_UDQ_ENFD); >> if (type & XFS_GROUP_QUOTA) >> - state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &s.qs_gquota, >> - s.qs_flags & XFS_QUOTA_GDQ_ACCT, >> - s.qs_flags & XFS_QUOTA_GDQ_ENFD); >> + state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &sv.qs_gquota, >> + sv.qs_flags & XFS_QUOTA_GDQ_ACCT, >> + sv.qs_flags & XFS_QUOTA_GDQ_ENFD); >> if (type & XFS_PROJ_QUOTA) >> - state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &s.qs_gquota, >> - s.qs_flags & XFS_QUOTA_PDQ_ACCT, >> - s.qs_flags & XFS_QUOTA_PDQ_ENFD); >> + state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &sv.qs_pquota, >> + sv.qs_flags & XFS_QUOTA_PDQ_ACCT, >> + sv.qs_flags & XFS_QUOTA_PDQ_ENFD); >> >> - state_timelimit(fp, XFS_BLOCK_QUOTA, s.qs_btimelimit); >> - state_timelimit(fp, XFS_INODE_QUOTA, s.qs_itimelimit); >> - state_timelimit(fp, XFS_RTBLOCK_QUOTA, s.qs_rtbtimelimit); >> + state_timelimit(fp, XFS_BLOCK_QUOTA, sv.qs_btimelimit); >> + state_timelimit(fp, XFS_INODE_QUOTA, sv.qs_itimelimit); >> + state_timelimit(fp, XFS_RTBLOCK_QUOTA, sv.qs_rtbtimelimit); >> } >> >> static void >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From zlang@redhat.com Wed Aug 17 09:58:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3201D7CA0 for ; Wed, 17 Aug 2016 09:58:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E80AA3040CD for ; Wed, 17 Aug 2016 07:58:14 -0700 (PDT) X-ASG-Debug-ID: 1471445892-0bf57b531300880001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bnw9ef3fXpZCtT2v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 17 Aug 2016 07:58:13 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 529747F0A1; Wed, 17 Aug 2016 14:58:12 +0000 (UTC) Received: from localhost (dhcp-12-196.nay.redhat.com [10.66.12.196]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7HEwAuq003143; Wed, 17 Aug 2016 10:58:11 -0400 Date: Wed, 17 Aug 2016 22:58:10 +0800 From: Zorro Lang To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV Message-ID: <20160817145810.GD7193@zlang.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV References: <2ca2dc3b-53d2-0791-644f-c9cd5abef89f@sandeen.net> <20160817083340.GB7193@zlang.usersys.redhat.com> <82f3c5f9-204d-845f-16cf-c267085242ac@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <82f3c5f9-204d-845f-16cf-c267085242ac@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Wed, 17 Aug 2016 14:58:12 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471445893 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12306 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 17, 2016 at 09:43:36AM -0500, Eric Sandeen wrote: > On 8/17/16 3:33 AM, Zorro Lang wrote: > > > Hi Eric, > > > > This's what I tried to explain to you: > > > > [root@dhcp-13-149 ~]# mount /dev/mapper/testvg-scratchdev /mnt/scratch -o pquota,gquota,uquota > > [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "limit bsoft=100m bhard=200m fsgqa" /mnt/scratch > > [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "limit -g bsoft=100m bhard=200m fsgqa" /mnt/scratch > > [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "state" /mnt/scratch > > User quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > > Accounting: ON > > Enforcement: ON > > Inode: #101 (2 blocks, 2 extents) > > Group quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > > Accounting: ON > > Enforcement: ON > > Inode: #99 (2 blocks, 2 extents) > > Project quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > > Accounting: ON > > Enforcement: ON > > Inode: #100 (1 blocks, 1 extents) > > Blocks grace time: [7 days] > > Inodes grace time: [7 days] > > Realtime Blocks grace time: [7 days] > > And that's all correct, right. > > > [root@dhcp-13-149 xfsprogs-dev]# umount /mnt/scratch > > [root@dhcp-13-149 xfsprogs-dev]# mount /dev/mapper/testvg-scratchdev /mnt/scratch -o pquota > > Now you have only pquota... > > > [root@dhcp-13-149 xfsprogs-dev]# xfs_quota -xc "state" /mnt/scratch > > User quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > > Accounting: OFF > > Enforcement: OFF > > Inode: #0 (0 blocks, 0 extents) > > Group quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > > Accounting: OFF > > Enforcement: OFF > > Inode: #0 (0 blocks, 0 extents) > > Project quota state on /mnt/scratch (/dev/mapper/testvg-scratchdev) > > Accounting: ON > > Enforcement: ON > > Inode: #100 (1 blocks, 1 extents) > > Blocks grace time: [7 days] > > Inodes grace time: [7 days] > > Realtime Blocks grace time: [7 days] > > And pquota is properly shown, but user and group show inode 0. > > > [root@dhcp-13-149 ~]# xfs_db -r -c "sb 0" -c "p" /dev/mapper/testvg-scratchdev|grep quot > > uquotino = 101 > > gquotino = 99 > > pquotino = 100 > > > > > > If I someone quota isn't enable, "state" command will print that inode > > number, blocks and extents as 0. > > *nod* > > > Do you think this's a problem should be fixed? > > If it's a bug, maybe we can fix it on another patch later, because > > it's another bug? > > This is a bug in the kernel, because it does not fill in inode information > for inactive quota types, and fills in 0 instead (so we don't even > get NULLFSINO). > > I did send a patch for this, > > [PATCH] quota: fill in Q_XGETQSTAT inode information for inactive quotas > > to the linux-fsdevel list (it is in common vfs quota code, but I probably > should have cc'd the xfs list as well). Jan has indicated that he has > merged it. > > With that patch and this one, it should all work as expected. Wow, sorry I didn't notice that patch(It's not in xfs cc list). So now everything works well, I have no objection with this patch now. Please allow me to ack this patch:) I'll test both patches together later. Thanks, Zorro > > Thanks, > -Eric > > > Thanks, > > Zorro > > > >> > >> I probably could have done some memcpy()'s in > >> state_stat_to_statv(), but opted for the explicit copy-out; > >> the structures aren't identical, although the newer one > >> only differs by padding on the end. If memcpy() is preferable > >> I could send a V2... > >> > >> V2: set sv.qs_version = FS_QSTATV_VERSION1; before calling > >> the quotactl (thanks Zorro!) > >> > >> diff --git a/include/xqm.h b/include/xqm.h > >> index c084b2d..5b6934a 100644 > >> --- a/include/xqm.h > >> +++ b/include/xqm.h > >> @@ -32,6 +32,7 @@ > >> #define Q_XGETQSTAT XQM_CMD(5) /* get quota subsystem status */ > >> #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */ > >> #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */ > >> +#define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */ > >> #define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage */ > >> > >> /* > >> @@ -149,4 +150,35 @@ typedef struct fs_quota_stat { > >> __u16 qs_iwarnlimit; /* limit for num warnings */ > >> } fs_quota_stat_t; > >> > >> + > >> +#ifndef FS_QSTATV_VERSION1 > >> +#define FS_QSTATV_VERSION1 1 /* fs_quota_statv.qs_version */ > >> +#endif > >> + > >> +/* > >> + * Some basic information about 'quota files' for Q_XGETQSTATV command > >> + */ > >> +struct fs_qfilestatv { > >> + __u64 qfs_ino; /* inode number */ > >> + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ > >> + __u32 qfs_nextents; /* number of extents */ > >> + __u32 qfs_pad; /* pad for 8-byte alignment */ > >> +}; > >> + > >> +struct fs_quota_statv { > >> + __s8 qs_version; /* version for future changes */ > >> + __u8 qs_pad1; /* pad for 16bit alignment */ > >> + __u16 qs_flags; /* FS_QUOTA_.* flags */ > >> + __u32 qs_incoredqs; /* number of dquots incore */ > >> + struct fs_qfilestatv qs_uquota; /* user quota information */ > >> + struct fs_qfilestatv qs_gquota; /* group quota information */ > >> + struct fs_qfilestatv qs_pquota; /* project quota information */ > >> + __s32 qs_btimelimit; /* limit for blks timer */ > >> + __s32 qs_itimelimit; /* limit for inodes timer */ > >> + __s32 qs_rtbtimelimit;/* limit for rt blks timer */ > >> + __u16 qs_bwarnlimit; /* limit for num warnings */ > >> + __u16 qs_iwarnlimit; /* limit for num warnings */ > >> + __u64 qs_pad2[8]; /* for future proofing */ > >> +}; > >> + > >> #endif /* __XQM_H__ */ > >> diff --git a/quota/linux.c b/quota/linux.c > >> index 74dba01..4f1f3c4 100644 > >> --- a/quota/linux.c > >> +++ b/quota/linux.c > >> @@ -55,6 +55,8 @@ xcommand_to_qcommand( > >> return Q_XSETQLIM; > >> case XFS_GETQSTAT: > >> return Q_XGETQSTAT; > >> + case XFS_GETQSTATV: > >> + return Q_XGETQSTATV; > >> case XFS_QUOTARM: > >> return Q_XQUOTARM; > >> case XFS_QSYNC: > >> diff --git a/quota/state.c b/quota/state.c > >> index 8186762..9f6616e 100644 > >> --- a/quota/state.c > >> +++ b/quota/state.c > >> @@ -111,12 +111,12 @@ remove_help(void) > >> > >> static void > >> state_qfilestat( > >> - FILE *fp, > >> - fs_path_t *mount, > >> - uint type, > >> - fs_qfilestat_t *qfs, > >> - int accounting, > >> - int enforcing) > >> + FILE *fp, > >> + struct fs_path *mount, > >> + uint type, > >> + struct fs_qfilestatv *qfs, > >> + int accounting, > >> + int enforcing) > >> { > >> fprintf(fp, _("%s quota state on %s (%s)\n"), type_to_string(type), > >> mount->fs_dir, mount->fs_name); > >> @@ -142,39 +142,96 @@ state_timelimit( > >> time_to_string(timelimit, VERBOSE_FLAG | ABSOLUTE_FLAG)); > >> } > >> > >> +/* > >> + * fs_quota_stat holds a subset of fs_quota_statv; this copies > >> + * the smaller into the larger, leaving any not-present fields > >> + * empty. This is so the same reporting function can be used > >> + * for both XFS_GETQSTAT and XFS_GETQSTATV results. > >> + */ > >> static void > >> -state_quotafile_mount( > >> - FILE *fp, > >> - uint type, > >> - fs_path_t *mount, > >> - uint flags) > >> +state_stat_to_statv( > >> + struct fs_quota_stat *s, > >> + struct fs_quota_statv *sv) > >> { > >> - fs_quota_stat_t s; > >> - char *dev = mount->fs_name; > >> + memset(sv, 0, sizeof(struct fs_quota_statv)); > >> + > >> + /* shared information */ > >> + sv->qs_version = s->qs_version; > >> + sv->qs_flags = s->qs_flags; > >> + sv->qs_incoredqs = s->qs_incoredqs; > >> + sv->qs_btimelimit = s->qs_btimelimit; > >> + sv->qs_itimelimit = s->qs_itimelimit; > >> + sv->qs_rtbtimelimit = s->qs_rtbtimelimit; > >> + sv->qs_bwarnlimit = s->qs_bwarnlimit; > >> + sv->qs_iwarnlimit = s->qs_iwarnlimit; > >> + > >> + /* Always room for uquota */ > >> + sv->qs_uquota.qfs_ino = s->qs_uquota.qfs_ino; > >> + sv->qs_uquota.qfs_nblks = s->qs_uquota.qfs_nblks; > >> + sv->qs_uquota.qfs_nextents = s->qs_uquota.qfs_nextents; > >> + > >> + /* > >> + * If we are here, XFS_GETQSTATV failed and XFS_GETQSTAT passed; > >> + * that is a very strong hint that we're on a kernel which predates > >> + * the on-disk pquota inode; both were added in v3.12. So, we do > >> + * some tricksy determination here. > >> + * gs_gquota may hold either group quota inode info, or project > >> + * quota if that is used instead; which one it actually holds depends > >> + * on the quota flags. (If neither is set, neither is used) > >> + */ > >> + if (s->qs_flags & XFS_QUOTA_GDQ_ACCT) { > >> + /* gs_gquota holds group quota info */ > >> + sv->qs_gquota.qfs_ino = s->qs_gquota.qfs_ino; > >> + sv->qs_gquota.qfs_nblks = s->qs_gquota.qfs_nblks; > >> + sv->qs_gquota.qfs_nextents = s->qs_gquota.qfs_nextents; > >> + } else if (s->qs_flags & XFS_QUOTA_PDQ_ACCT) { > >> + /* gs_gquota actually holds project quota info */ > >> + sv->qs_pquota.qfs_ino = s->qs_gquota.qfs_ino; > >> + sv->qs_pquota.qfs_nblks = s->qs_gquota.qfs_nblks; > >> + sv->qs_pquota.qfs_nextents = s->qs_gquota.qfs_nextents; > >> + } > >> +} > >> > >> - if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > >> - if (flags & VERBOSE_FLAG) > >> - fprintf(fp, _("%s quota are not enabled on %s\n"), > >> - type_to_string(type), dev); > >> - return; > >> +static void > >> +state_quotafile_mount( > >> + FILE *fp, > >> + uint type, > >> + struct fs_path *mount, > >> + uint flags) > >> +{ > >> + struct fs_quota_stat s; > >> + struct fs_quota_statv sv; > >> + char *dev = mount->fs_name; > >> + > >> + sv.qs_version = FS_QSTATV_VERSION1; > >> + > >> + if (xfsquotactl(XFS_GETQSTATV, dev, type, 0, (void *)&sv) < 0) { > >> + if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > >> + if (flags & VERBOSE_FLAG) > >> + fprintf(fp, > >> + _("%s quota are not enabled on %s\n"), > >> + type_to_string(type), dev); > >> + return; > >> + } > >> + state_stat_to_statv(&s, &sv); > >> } > >> > >> if (type & XFS_USER_QUOTA) > >> - state_qfilestat(fp, mount, XFS_USER_QUOTA, &s.qs_uquota, > >> - s.qs_flags & XFS_QUOTA_UDQ_ACCT, > >> - s.qs_flags & XFS_QUOTA_UDQ_ENFD); > >> + state_qfilestat(fp, mount, XFS_USER_QUOTA, &sv.qs_uquota, > >> + sv.qs_flags & XFS_QUOTA_UDQ_ACCT, > >> + sv.qs_flags & XFS_QUOTA_UDQ_ENFD); > >> if (type & XFS_GROUP_QUOTA) > >> - state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &s.qs_gquota, > >> - s.qs_flags & XFS_QUOTA_GDQ_ACCT, > >> - s.qs_flags & XFS_QUOTA_GDQ_ENFD); > >> + state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &sv.qs_gquota, > >> + sv.qs_flags & XFS_QUOTA_GDQ_ACCT, > >> + sv.qs_flags & XFS_QUOTA_GDQ_ENFD); > >> if (type & XFS_PROJ_QUOTA) > >> - state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &s.qs_gquota, > >> - s.qs_flags & XFS_QUOTA_PDQ_ACCT, > >> - s.qs_flags & XFS_QUOTA_PDQ_ENFD); > >> + state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &sv.qs_pquota, > >> + sv.qs_flags & XFS_QUOTA_PDQ_ACCT, > >> + sv.qs_flags & XFS_QUOTA_PDQ_ENFD); > >> > >> - state_timelimit(fp, XFS_BLOCK_QUOTA, s.qs_btimelimit); > >> - state_timelimit(fp, XFS_INODE_QUOTA, s.qs_itimelimit); > >> - state_timelimit(fp, XFS_RTBLOCK_QUOTA, s.qs_rtbtimelimit); > >> + state_timelimit(fp, XFS_BLOCK_QUOTA, sv.qs_btimelimit); > >> + state_timelimit(fp, XFS_INODE_QUOTA, sv.qs_itimelimit); > >> + state_timelimit(fp, XFS_RTBLOCK_QUOTA, sv.qs_rtbtimelimit); > >> } > >> > >> static void > >> > >> _______________________________________________ > >> xfs mailing list > >> xfs@oss.sgi.com > >> http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From zlang@redhat.com Wed Aug 17 10:02:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F5777CA0 for ; Wed, 17 Aug 2016 10:02:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4788AAC03E for ; Wed, 17 Aug 2016 08:02:28 -0700 (PDT) X-ASG-Debug-ID: 1471446146-0bf57c55b201550001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TIxwwzLmdNu4ci6s (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 17 Aug 2016 08:02:26 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E3EF9C04D280; Wed, 17 Aug 2016 15:02:25 +0000 (UTC) Received: from localhost (dhcp12-196.nay.redhat.com [10.66.12.196] (may be forged)) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7HF2OK4018918; Wed, 17 Aug 2016 11:02:25 -0400 Date: Wed, 17 Aug 2016 23:02:24 +0800 From: Zorro Lang To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV Message-ID: <20160817150224.GE7193@zlang.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfs_quota: wire up XFS_GETQSTATV References: <2ca2dc3b-53d2-0791-644f-c9cd5abef89f@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2ca2dc3b-53d2-0791-644f-c9cd5abef89f@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 17 Aug 2016 15:02:25 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471446146 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9097 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 15, 2016 at 10:17:19PM -0500, Eric Sandeen wrote: > The new XFS_GETQSTATV quotactl, available since kernel v3.12, > was never implemented in xfs_quota, and the "state" command > continues to use XFS_GETQSTAT, which cannot report both > group & project quota on newer formats. > > The new call has room for all 3 quota types (user, group, and > quota), vs just two, where previously project and quota > overlapped. > > So: > > First, try XFS_GETQSTATV. > If it passes, we have all the information we need, and we print > it. state_qfilestat() is modified to take the newer structure. > > If it fails, try XFS_GETQSTAT. If that passes, we are on an > older kernel with neither XFS_GETQSTATV nor the on-disk project > quota inode. We copy the available information into the newer > statv structure, carefully determining wither group or project > (or neither) is actually active, and print it with the same > state_qfilestat routine. > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Zorro Lang Everything looks good to me now, all problems I can find have been resolved. Thanks, Zorro > > I probably could have done some memcpy()'s in > state_stat_to_statv(), but opted for the explicit copy-out; > the structures aren't identical, although the newer one > only differs by padding on the end. If memcpy() is preferable > I could send a V2... > > V2: set sv.qs_version = FS_QSTATV_VERSION1; before calling > the quotactl (thanks Zorro!) > > diff --git a/include/xqm.h b/include/xqm.h > index c084b2d..5b6934a 100644 > --- a/include/xqm.h > +++ b/include/xqm.h > @@ -32,6 +32,7 @@ > #define Q_XGETQSTAT XQM_CMD(5) /* get quota subsystem status */ > #define Q_XQUOTARM XQM_CMD(6) /* free disk space used by dquots */ > #define Q_XQUOTASYNC XQM_CMD(7) /* delalloc flush, updates dquots */ > +#define Q_XGETQSTATV XQM_CMD(8) /* newer version of get quota */ > #define Q_XGETNEXTQUOTA XQM_CMD(9) /* get disk limits and usage */ > > /* > @@ -149,4 +150,35 @@ typedef struct fs_quota_stat { > __u16 qs_iwarnlimit; /* limit for num warnings */ > } fs_quota_stat_t; > > + > +#ifndef FS_QSTATV_VERSION1 > +#define FS_QSTATV_VERSION1 1 /* fs_quota_statv.qs_version */ > +#endif > + > +/* > + * Some basic information about 'quota files' for Q_XGETQSTATV command > + */ > +struct fs_qfilestatv { > + __u64 qfs_ino; /* inode number */ > + __u64 qfs_nblks; /* number of BBs 512-byte-blks */ > + __u32 qfs_nextents; /* number of extents */ > + __u32 qfs_pad; /* pad for 8-byte alignment */ > +}; > + > +struct fs_quota_statv { > + __s8 qs_version; /* version for future changes */ > + __u8 qs_pad1; /* pad for 16bit alignment */ > + __u16 qs_flags; /* FS_QUOTA_.* flags */ > + __u32 qs_incoredqs; /* number of dquots incore */ > + struct fs_qfilestatv qs_uquota; /* user quota information */ > + struct fs_qfilestatv qs_gquota; /* group quota information */ > + struct fs_qfilestatv qs_pquota; /* project quota information */ > + __s32 qs_btimelimit; /* limit for blks timer */ > + __s32 qs_itimelimit; /* limit for inodes timer */ > + __s32 qs_rtbtimelimit;/* limit for rt blks timer */ > + __u16 qs_bwarnlimit; /* limit for num warnings */ > + __u16 qs_iwarnlimit; /* limit for num warnings */ > + __u64 qs_pad2[8]; /* for future proofing */ > +}; > + > #endif /* __XQM_H__ */ > diff --git a/quota/linux.c b/quota/linux.c > index 74dba01..4f1f3c4 100644 > --- a/quota/linux.c > +++ b/quota/linux.c > @@ -55,6 +55,8 @@ xcommand_to_qcommand( > return Q_XSETQLIM; > case XFS_GETQSTAT: > return Q_XGETQSTAT; > + case XFS_GETQSTATV: > + return Q_XGETQSTATV; > case XFS_QUOTARM: > return Q_XQUOTARM; > case XFS_QSYNC: > diff --git a/quota/state.c b/quota/state.c > index 8186762..9f6616e 100644 > --- a/quota/state.c > +++ b/quota/state.c > @@ -111,12 +111,12 @@ remove_help(void) > > static void > state_qfilestat( > - FILE *fp, > - fs_path_t *mount, > - uint type, > - fs_qfilestat_t *qfs, > - int accounting, > - int enforcing) > + FILE *fp, > + struct fs_path *mount, > + uint type, > + struct fs_qfilestatv *qfs, > + int accounting, > + int enforcing) > { > fprintf(fp, _("%s quota state on %s (%s)\n"), type_to_string(type), > mount->fs_dir, mount->fs_name); > @@ -142,39 +142,96 @@ state_timelimit( > time_to_string(timelimit, VERBOSE_FLAG | ABSOLUTE_FLAG)); > } > > +/* > + * fs_quota_stat holds a subset of fs_quota_statv; this copies > + * the smaller into the larger, leaving any not-present fields > + * empty. This is so the same reporting function can be used > + * for both XFS_GETQSTAT and XFS_GETQSTATV results. > + */ > static void > -state_quotafile_mount( > - FILE *fp, > - uint type, > - fs_path_t *mount, > - uint flags) > +state_stat_to_statv( > + struct fs_quota_stat *s, > + struct fs_quota_statv *sv) > { > - fs_quota_stat_t s; > - char *dev = mount->fs_name; > + memset(sv, 0, sizeof(struct fs_quota_statv)); > + > + /* shared information */ > + sv->qs_version = s->qs_version; > + sv->qs_flags = s->qs_flags; > + sv->qs_incoredqs = s->qs_incoredqs; > + sv->qs_btimelimit = s->qs_btimelimit; > + sv->qs_itimelimit = s->qs_itimelimit; > + sv->qs_rtbtimelimit = s->qs_rtbtimelimit; > + sv->qs_bwarnlimit = s->qs_bwarnlimit; > + sv->qs_iwarnlimit = s->qs_iwarnlimit; > + > + /* Always room for uquota */ > + sv->qs_uquota.qfs_ino = s->qs_uquota.qfs_ino; > + sv->qs_uquota.qfs_nblks = s->qs_uquota.qfs_nblks; > + sv->qs_uquota.qfs_nextents = s->qs_uquota.qfs_nextents; > + > + /* > + * If we are here, XFS_GETQSTATV failed and XFS_GETQSTAT passed; > + * that is a very strong hint that we're on a kernel which predates > + * the on-disk pquota inode; both were added in v3.12. So, we do > + * some tricksy determination here. > + * gs_gquota may hold either group quota inode info, or project > + * quota if that is used instead; which one it actually holds depends > + * on the quota flags. (If neither is set, neither is used) > + */ > + if (s->qs_flags & XFS_QUOTA_GDQ_ACCT) { > + /* gs_gquota holds group quota info */ > + sv->qs_gquota.qfs_ino = s->qs_gquota.qfs_ino; > + sv->qs_gquota.qfs_nblks = s->qs_gquota.qfs_nblks; > + sv->qs_gquota.qfs_nextents = s->qs_gquota.qfs_nextents; > + } else if (s->qs_flags & XFS_QUOTA_PDQ_ACCT) { > + /* gs_gquota actually holds project quota info */ > + sv->qs_pquota.qfs_ino = s->qs_gquota.qfs_ino; > + sv->qs_pquota.qfs_nblks = s->qs_gquota.qfs_nblks; > + sv->qs_pquota.qfs_nextents = s->qs_gquota.qfs_nextents; > + } > +} > > - if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > - if (flags & VERBOSE_FLAG) > - fprintf(fp, _("%s quota are not enabled on %s\n"), > - type_to_string(type), dev); > - return; > +static void > +state_quotafile_mount( > + FILE *fp, > + uint type, > + struct fs_path *mount, > + uint flags) > +{ > + struct fs_quota_stat s; > + struct fs_quota_statv sv; > + char *dev = mount->fs_name; > + > + sv.qs_version = FS_QSTATV_VERSION1; > + > + if (xfsquotactl(XFS_GETQSTATV, dev, type, 0, (void *)&sv) < 0) { > + if (xfsquotactl(XFS_GETQSTAT, dev, type, 0, (void *)&s) < 0) { > + if (flags & VERBOSE_FLAG) > + fprintf(fp, > + _("%s quota are not enabled on %s\n"), > + type_to_string(type), dev); > + return; > + } > + state_stat_to_statv(&s, &sv); > } > > if (type & XFS_USER_QUOTA) > - state_qfilestat(fp, mount, XFS_USER_QUOTA, &s.qs_uquota, > - s.qs_flags & XFS_QUOTA_UDQ_ACCT, > - s.qs_flags & XFS_QUOTA_UDQ_ENFD); > + state_qfilestat(fp, mount, XFS_USER_QUOTA, &sv.qs_uquota, > + sv.qs_flags & XFS_QUOTA_UDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_UDQ_ENFD); > if (type & XFS_GROUP_QUOTA) > - state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &s.qs_gquota, > - s.qs_flags & XFS_QUOTA_GDQ_ACCT, > - s.qs_flags & XFS_QUOTA_GDQ_ENFD); > + state_qfilestat(fp, mount, XFS_GROUP_QUOTA, &sv.qs_gquota, > + sv.qs_flags & XFS_QUOTA_GDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_GDQ_ENFD); > if (type & XFS_PROJ_QUOTA) > - state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &s.qs_gquota, > - s.qs_flags & XFS_QUOTA_PDQ_ACCT, > - s.qs_flags & XFS_QUOTA_PDQ_ENFD); > + state_qfilestat(fp, mount, XFS_PROJ_QUOTA, &sv.qs_pquota, > + sv.qs_flags & XFS_QUOTA_PDQ_ACCT, > + sv.qs_flags & XFS_QUOTA_PDQ_ENFD); > > - state_timelimit(fp, XFS_BLOCK_QUOTA, s.qs_btimelimit); > - state_timelimit(fp, XFS_INODE_QUOTA, s.qs_itimelimit); > - state_timelimit(fp, XFS_RTBLOCK_QUOTA, s.qs_rtbtimelimit); > + state_timelimit(fp, XFS_BLOCK_QUOTA, sv.qs_btimelimit); > + state_timelimit(fp, XFS_INODE_QUOTA, sv.qs_itimelimit); > + state_timelimit(fp, XFS_RTBLOCK_QUOTA, sv.qs_rtbtimelimit); > } > > static void > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From andreas.gruenbacher@gmail.com Wed Aug 17 10:37:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2069D7CA0 for ; Wed, 17 Aug 2016 10:37:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB5118F809E for ; Wed, 17 Aug 2016 08:37:38 -0700 (PDT) X-ASG-Debug-ID: 1471448254-0bf8155c74015b0001-NocioJ Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by cuda.sgi.com with ESMTP id wHZQqmVGLBV9ZXuw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 17 Aug 2016 08:37:36 -0700 (PDT) X-Barracuda-Envelope-From: andreas.gruenbacher@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f66.google.com[74.125.82.66] X-Barracuda-Apparent-Source-IP: 74.125.82.66 Received: by mail-wm0-f66.google.com with SMTP id i138so25251046wmf.3 for ; Wed, 17 Aug 2016 08:37:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=FrXpPb9xkyrD8b9tDsd++TV2CH13+pwDuGCdVGBBh1U=; b=RYcXzMxYev9Fmc7wywtTvW6mA0/54rHpI7fkQ5/Z6CLOZrjGOVeT1qqY/jL5l1drsD zgpEGCKlYPxGOkxwd05r9HRRA6gakK8F377BFpfdxsI8UgoA+bz60VSniARAMNgtU/RP n5qBXnJZRgDxmHi0PhJD1Aj0fF7vMVm35mkktlPdba3I/Ru9OpejL1ea1L0h3DFrON0c g9zehzb3AAPY0H444vT+BQCTU3Y3daDgk4nizRg1Yv//FyhdaCtswrhXLB9BEHQyT62r 2iRapIRsNsLuQrkFDkWRRt0HRtel0GpFFeRu0zzyU2CEygo2aR+t8+1dDFI4DSh5t5Mb Rz3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=FrXpPb9xkyrD8b9tDsd++TV2CH13+pwDuGCdVGBBh1U=; b=iMVJbOsebNbN6zY72vtaBMyX/UY1eCZJyrRlIjJZPDSdoF4KSL+s+2fbgCxeXP1xig gwFAKMA5DH8BcBHvYQjxIGm5080XGooZsGdOjAafm843d5J++IbTM/+2k3SdiGgP0zOb AmvDGvYyggv2ezqUFK9jWE+uxflLW91QjKPAanZAdJOcLStxhI0gB/gbl+b2q7Yza1Og HzHSaj21lo9OfmGfCa8zhkkNkgmUF4JitqAcVlVnJQFx+vBSL11drxSiAhFAaQISFJ6o hlm7qQa3Uf2XXdM7eWkPE+g7moZn/3aEX5je/KKQ7Rur3XKhqGYuN1h0lb2z+qvBmyvp NlcQ== X-Gm-Message-State: AEkoout7AgBuj2aELrEvjtWGZlfWhTWZgkE13oLASKm/VVwGKFMdTaeNSIlS5OLSgXpYdxPtQIe9pousmvOeLA== X-Received: by 10.28.104.137 with SMTP id d131mr26909825wmc.7.1471448254282; Wed, 17 Aug 2016 08:37:34 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.74.17 with HTTP; Wed, 17 Aug 2016 08:37:33 -0700 (PDT) In-Reply-To: <20160531095031.GA5912@quack2.suse.cz> References: <20160511155951.GF42410@bfoster.bfoster> <5738576B.4010208@profihost.ag> <20160515115017.GA6433@laptop.bfoster> <57386E84.3090606@profihost.ag> <20160516010602.GA24980@bfoster.bfoster> <57420A47.2000700@profihost.ag> <20160522213850.GE26977@dastard> <574BEA84.3010206@profihost.ag> <20160530223657.GP26977@dastard> <20160531010724.GA9616@bbox> <20160531095031.GA5912@quack2.suse.cz> From: =?UTF-8?Q?Andreas_Gr=C3=BCnbacher?= Date: Wed, 17 Aug 2016 17:37:33 +0200 Message-ID: Subject: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) To: Jan Kara X-ASG-Orig-Subj: Re: shrink_active_list/try_to_release_page bug? (was Re: xfs trace in 4.4.2 / also in 4.3.3 WARNING fs/xfs/xfs_aops.c:1232 xfs_vm_releasepage) Cc: Minchan Kim , Stefan Priebe - Profihost AG , Brian Foster , Linux Kernel Mailing List , "xfs@oss.sgi.com" , linux-mm@kvack.org, Lukas Czerner , Steven Whitehouse Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f66.google.com[74.125.82.66] X-Barracuda-Start-Time: 1471448255 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8882 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32090 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi Jan, 2016-05-31 11:50 GMT+02:00 Jan Kara : > On Tue 31-05-16 10:07:24, Minchan Kim wrote: >> On Tue, May 31, 2016 at 08:36:57AM +1000, Dave Chinner wrote: >> > [adding lkml and linux-mm to the cc list] >> > >> > On Mon, May 30, 2016 at 09:23:48AM +0200, Stefan Priebe - Profihost AG wrote: >> > > Hi Dave, >> > > Hi Brian, >> > > >> > > below are the results with a vanilla 4.4.11 kernel. >> > >> > Thanks for persisting with the testing, Stefan. >> > >> > .... >> > >> > > i've now used a vanilla 4.4.11 Kernel and the issue remains. After a >> > > fresh reboot it has happened again on the root FS for a debian apt file: >> > > >> > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x0 size 0x12b990 >> > > ------------[ cut here ]------------ >> > > WARNING: CPU: 1 PID: 111 at fs/xfs/xfs_aops.c:1239 >> > > xfs_vm_releasepage+0x10f/0x140() >> > > Modules linked in: netconsole ipt_REJECT nf_reject_ipv4 xt_multiport >> > > iptable_filter ip_tables x_tables bonding coretemp 8021q garp fuse >> > > sb_edac edac_core i2c_i801 i40e(O) xhci_pci xhci_hcd shpchp vxlan >> > > ip6_udp_tunnel udp_tunnel ipmi_si ipmi_msghandler button btrfs xor >> > > raid6_pq dm_mod raid1 md_mod usbhid usb_storage ohci_hcd sg sd_mod >> > > ehci_pci ehci_hcd usbcore usb_common igb ahci i2c_algo_bit libahci >> > > i2c_core mpt3sas ptp pps_core raid_class scsi_transport_sas >> > > CPU: 1 PID: 111 Comm: kswapd0 Tainted: G O 4.4.11 #1 >> > > Hardware name: Supermicro Super Server/X10SRH-CF, BIOS 1.0b 05/18/2015 >> > > 0000000000000000 ffff880c4dacfa88 ffffffffa23c5b8f 0000000000000000 >> > > ffffffffa2a51ab4 ffff880c4dacfac8 ffffffffa20837a7 ffff880c4dacfae8 >> > > 0000000000000001 ffffea00010c3640 ffff8802176b49d0 ffffea00010c3660 >> > > Call Trace: >> > > [] dump_stack+0x63/0x84 >> > > [] warn_slowpath_common+0x97/0xe0 >> > > [] warn_slowpath_null+0x1a/0x20 >> > > [] xfs_vm_releasepage+0x10f/0x140 >> > > [] ? page_mkclean_one+0xd0/0xd0 >> > > [] ? anon_vma_prepare+0x150/0x150 >> > > [] try_to_release_page+0x32/0x50 >> > > [] shrink_active_list+0x3ce/0x3e0 >> > > [] shrink_lruvec+0x687/0x7d0 >> > > [] shrink_zone+0xdc/0x2c0 >> > > [] kswapd+0x4f9/0x970 >> > > [] ? mem_cgroup_shrink_node_zone+0x1a0/0x1a0 >> > > [] kthread+0xc9/0xe0 >> > > [] ? kthread_stop+0x100/0x100 >> > > [] ret_from_fork+0x3f/0x70 >> > > [] ? kthread_stop+0x100/0x100 >> > > ---[ end trace c9d679f8ed4d7610 ]--- >> > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x1000 size >> > > 0x12b990 >> > > XFS (md127p3): ino 0x41221d1 delalloc 1 unwritten 0 pgoff 0x2000 size >> > ..... >> > >> > Ok, I suspect this may be a VM bug. I've been looking at the 4.6 >> > code (so please try to reproduce on that kernel!) but it looks to me >> > like the only way we can get from shrink_active_list() direct to >> > try_to_release_page() is if we are over the maximum bufferhead >> > threshold (i.e buffer_heads_over_limit = true) and we are trying to >> > reclaim pages direct from the active list. >> > >> > Because we are called from kswapd()->balance_pgdat(), we have: >> > >> > struct scan_control sc = { >> > .gfp_mask = GFP_KERNEL, >> > .order = order, >> > .priority = DEF_PRIORITY, >> > .may_writepage = !laptop_mode, >> > .may_unmap = 1, >> > .may_swap = 1, >> > }; >> > >> > The key point here is reclaim is being run with .may_writepage = >> > true for default configuration kernels. when we get to >> > shrink_active_list(): >> > >> > if (!sc->may_writepage) >> > isolate_mode |= ISOLATE_CLEAN; >> > >> > But sc->may_writepage = true and this allows isolate_lru_pages() to >> > isolate dirty pages from the active list. Normally this isn't a >> > problem, because the isolated active list pages are rotated to the >> > inactive list, and nothing else happens to them. *Except when >> > buffer_heads_over_limit = true*. This special condition would >> > explain why I have never seen apt/dpkg cause this problem on any of >> > my (many) Debian systems that all use XFS.... >> > >> > In that case, shrink_active_list() runs: >> > >> > if (unlikely(buffer_heads_over_limit)) { >> > if (page_has_private(page) && trylock_page(page)) { >> > if (page_has_private(page)) >> > try_to_release_page(page, 0); >> > unlock_page(page); >> > } >> > } >> > >> > i.e. it locks the page, and if it has buffer heads it trys to get >> > the bufferheads freed from the page. >> > >> > But this is a dirty page, which means it may have delalloc or >> > unwritten state on it's buffers, both of which indicate that there >> > is dirty data in teh page that hasn't been written. XFS issues a >> > warning on this because neither shrink_active_list nor >> > try_to_release_page() check for whether the page is dirty or not. >> > >> > Hence it seems to me that shrink_active_list() is calling >> > try_to_release_page() inappropriately, and XFS is just the >> > messenger. If you turn laptop mode on, it is likely the problem will >> > go away as kswapd will run with .may_writepage = false, but that >> > will also cause other behavioural changes relating to writeback and >> > memory reclaim. It might be worth trying as a workaround for now. >> > >> > MM-folk - is this analysis correct? If so, why is >> > shrink_active_list() calling try_to_release_page() on dirty pages? >> > Is this just an oversight or is there some problem that this is >> > trying to work around? It seems trivial to fix to me (add a >> > !PageDirty check), but I don't know why the check is there in the >> > first place... >> >> It seems to be latter. >> Below commit seems to be related. >> [ecdfc9787fe527, Resurrect 'try_to_free_buffers()' VM hackery.] >> >> At that time, even shrink_page_list works like this. >> >> shrink_page_list >> while (!list_empty(page_list)) { >> .. >> .. >> if (PageDirty(page)) { >> .. >> } >> >> /* >> * If the page has buffers, try to free the buffer mappings >> * associated with this page. If we succeed we try to free >> * the page as well. >> * >> * We do this even if the page is PageDirty(). >> * try_to_release_page() does not perform I/O, but it is >> * possible for a page to have PageDirty set, but it is actually >> * clean (all its buffers are clean). This happens if the >> * buffers were written out directly, with submit_bh(). ext3 >> * will do this, as well as the blockdev mapping. >> * try_to_release_page() will discover that cleanness and will >> * drop the buffers and mark the page clean - it can be freed. >> * .. >> */ >> if (PagePrivate(page)) { >> if (!try_to_release_page(page, sc->gfp_mask)) >> goto activate_locked; >> if (!mapping && page_count(page) == 1) >> goto free_it; >> } >> .. >> } >> >> I wonder whether it's valid or not with on ext4. > > Actually, we've already discussed this about an year ago: > http://oss.sgi.com/archives/xfs/2015-06/msg00119.html > > And it was the last drop that made me remove ext3 from the tree. ext4 can > also clean dirty buffers while keeping pages dirty but it is limited only > to metadata (and data in data=journal mode) so the scope of the problem is > much smaller. So just avoiding calling ->releasepage for dirty pages may > work fine these days. > > Also it is possible to change ext4 checkpointing code to completely avoid > doing this but I never got to rewriting that code. Probably I should give > it higher priority on my todo list... we're seeing the same (releasepage being called for dirty pages) on GFS2 as well. Right now, GFS2 warns about this case, but we'll remove that warning and wait for ext4 and releasepage to be fixed so that we can re-add the warning. Maybe this will help as an argument for fixing ext4 soon :) Thanks, Andreas From jgibson@spscommerce.com Wed Aug 17 11:24:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 48DF67CA0 for ; Wed, 17 Aug 2016 11:24:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E324B3040E0 for ; Wed, 17 Aug 2016 09:23:59 -0700 (PDT) X-ASG-Debug-ID: 1471451033-0bf8155c7602ca0001-NocioJ Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0043.outbound.protection.outlook.com [104.47.36.43]) by cuda.sgi.com with ESMTP id 4XWwohOaLdS2NAEt (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 17 Aug 2016 09:23:54 -0700 (PDT) X-Barracuda-Envelope-From: jgibson@spscommerce.com X-Barracuda-Effective-Source-IP: mail-sn1nam02on0043.outbound.protection.outlook.com[104.47.36.43] X-Barracuda-Apparent-Source-IP: 104.47.36.43 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=spscommerce.onmicrosoft.com; s=selector1-spscommerce-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=nG6ujlZ1BlER6Jh08Fj6YiMbLenNZiyWxurzSOlrNGE=; b=ronS6qfbdqJfcaJj5mBoLokn+HCByeKT+vKaZjZq04BIlg9r0d9H8NoZroHK9i9YswyZWqCOWU9ygOhZS9jXtlK+lDbLfmfvcsKBt/YsQA74kMjC2cO0ZzsqTX1D8KtCFhG8Rn0yY9N64N65NplqnCkoOiWnoaHKO8kBX2/oDho= Received: from CY1PR04MB2010.namprd04.prod.outlook.com (10.166.191.23) by CY1PR04MB2012.namprd04.prod.outlook.com (10.166.191.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Wed, 17 Aug 2016 16:23:51 +0000 Received: from CY1PR04MB2010.namprd04.prod.outlook.com ([10.166.191.23]) by CY1PR04MB2010.namprd04.prod.outlook.com ([10.166.191.23]) with mapi id 15.01.0549.027; Wed, 17 Aug 2016 16:23:51 +0000 From: Jeff Gibson To: "xfs@oss.sgi.com" Subject: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? Thread-Topic: XFS on top of LVM span in AWS. Stripe or are AG's good enough? X-ASG-Orig-Subj: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? Thread-Index: AQHR9+TkMWWTjAmAcUOJYmyXQ/kkw6BNVz5h Date: Wed, 17 Aug 2016 16:23:51 +0000 Message-ID: References: <20160816005931.GD19025@dastard> ,<6ec8fbba-27ff-7386-e72a-d9f8e81f9252@sandeen.net> In-Reply-To: <6ec8fbba-27ff-7386-e72a-d9f8e81f9252@sandeen.net> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=jgibson@spscommerce.com; x-originating-ip: [25.161.247.4] x-ms-office365-filtering-correlation-id: a40379ed-a765-4826-6e1b-08d3c6bae037 x-microsoft-exchange-diagnostics: 1;CY1PR04MB2012;6:evZ8SmwewCLJbRo7sVvU/4TVNHoVwKzwuch5rXWQd2jxhdohhuKHuv+lyKCio05rzeLmLMmZaSKcV9GqiNlY3G9POHqSSlZFqikKzQL0BUE7V/SeLVVC7BEEi15umym7asbuAdcBCJbQjg9RKGuLXm0QOAISSk/K/XsllzTgagqeZLBB1K+uDI7e4xBaZ6sDOaZ5JjovZ/IB78keFpu19hQ95cr50YcI6G6Q5+RRojINYpzs8tz4VDF6DfYHp7nhbX+SEU8ApAzcaJ/tU3ZRLKgAQ3sjvcnZAz2Oyk81Ltw=;5:hkPg/lNSr9UIkZRQMdekX4Byoxk3Olpn+9ZQS5eI63QVBRtZZ5fKHfa3t5wXwbOmXNXAQZEwB7TzhE/1RU+o9xT++vThu7uVfH4qHustPlIpfCGmgycMdaBj7WPSi7JNKM34LY/36HWAS9djfP2tng==;24:CusYKn+pJx0/uC+BF2r+jISY7t33M5KAN+EbkAEvjCUh+lFy9J1GNo5jkv8Pxs6OfeXouAWydrNTe1Mwf880R70UfcCO3LVybxeuJjkqc34=;7:sZyLk+zGopiIfFBdOw2QPfexYblghGFnu95ZQv7B3uEKhE8wZvcdcDH6Ab0Oe3VPTykAL20DEYoXhbfY8PGGZgVRrPedBv8UiNzBw7HGVFmDH1npBRXEvKClTb+B/Vv/yoIrQrA5EZ3a/cgASLq3Aru0zXyKASyanWZcNTKp6upkHjCxVrDXhbSoHCBecij1lykhEKnTR/HV8rEsFXKqUxJO52h28nHrQv8VhmcgXsC8m2zebZGkulgTVytGpufj x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR04MB2012; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046);SRVR:CY1PR04MB2012;BCL:0;PCL:0;RULEID:;SRVR:CY1PR04MB2012; x-forefront-prvs: 0037FD6480 x-forefront-antispam-report: SFV:NSPM;SFS:(10009020)(6009001)(7916002)(51914003)(189002)(199003)(54356999)(5002640100001)(68736007)(76176999)(9686002)(2950100001)(86362001)(3660700001)(76576001)(122556002)(66066001)(10400500002)(106356001)(2501003)(33656002)(305945005)(77096005)(101416001)(50986999)(2900100001)(106116001)(7846002)(189998001)(102836003)(586003)(2906002)(93886004)(81166006)(97736004)(7736002)(8676002)(81156014)(6116002)(3846002)(99286002)(105586002)(1730700003)(3280700002)(8936002)(92566002)(110136002)(2351001)(450100001)(11100500001)(74316002)(7696003)(87936001)(107886002);DIR:OUT;SFP:1101;SCL:1;SRVR:CY1PR04MB2012;H:CY1PR04MB2010.namprd04.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; received-spf: None (protection.outlook.com: spscommerce.com does not designate permitted sender hosts) spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: spscommerce.com X-MS-Exchange-CrossTenant-originalarrivaltime: 17 Aug 2016 16:23:51.5506 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 925b3535-30d6-4f8f-b70f-a7aa7e1b3445 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR04MB2012 X-Barracuda-Connect: mail-sn1nam02on0043.outbound.protection.outlook.com[104.47.36.43] X-Barracuda-Start-Time: 1471451034 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1229 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32090 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Thanks for the great info guys. Sorry to beat a dead horse here. =A0Just to be absolutely clear- > > I guess what I'm trying to ask is - will XFS *indirectly* compensate > > if one subvolume is busier? =A0For example, if writes to a "slow" > > subvolume and resident AGs take longer to complete, will XFS tend to > > prefer to use other less-busy AGs more often (with the exception of > > locality) for writes? =A0What is the basic algorithm for determining > > where new data is written? =A0In load-balancer terms, does it > > round-robin, pick the least busy, etc? >=A0 > xfs has no notion of fast vs slow regions. =A0See above for the basic > algorithm; it's round-robin for new directories, keep inodes and blocks > near their parent if possible. =A0 So if one EBS LVM subvolume has subpar performance it will basically slow d= own writes to the whole XFS volume. =A0XFS doesn't have any notion of a que= ue per AG or any other mechanism for compensating uneven performance of AGs= . > There are a few other smaller-granularity > heuristics related to stripe geometry as well. Oh, cool. =A0Since I'm considering stripe vs. linear for the LVM volume, I'= d be very interested in what these are. Thank you again, JG From sandeen@sandeen.net Wed Aug 17 12:26:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=COMPENSATION autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AB1907CA0 for ; Wed, 17 Aug 2016 12:26:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2F076AC044 for ; Wed, 17 Aug 2016 10:26:29 -0700 (PDT) X-ASG-Debug-ID: 1471454787-0bf8155c7707880001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mXL2KyEZEqVaiipK for ; Wed, 17 Aug 2016 10:26:27 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 44E204420 for ; Wed, 17 Aug 2016 12:26:27 -0500 (CDT) Subject: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: XFS on top of LVM span in AWS. Stripe or are AG's good enough? References: <20160816005931.GD19025@dastard> <6ec8fbba-27ff-7386-e72a-d9f8e81f9252@sandeen.net> From: Eric Sandeen Message-ID: <4bcdb01b-8920-c88c-a607-20a56688f6d2@sandeen.net> Date: Wed, 17 Aug 2016 12:26:26 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471454787 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3075 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32092 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/17/16 11:23 AM, Jeff Gibson wrote: > Thanks for the great info guys. > > Sorry to beat a dead horse here. Just to be absolutely clear- > >>> I guess what I'm trying to ask is - will XFS *indirectly* compensate >>> if one subvolume is busier? For example, if writes to a "slow" >>> subvolume and resident AGs take longer to complete, will XFS tend to >>> prefer to use other less-busy AGs more often (with the exception of >>> locality) for writes? What is the basic algorithm for determining >>> where new data is written? In load-balancer terms, does it >>> round-robin, pick the least busy, etc? >> >> xfs has no notion of fast vs slow regions. See above for the basic >> algorithm; it's round-robin for new directories, keep inodes and blocks >> near their parent if possible. > So if one EBS LVM subvolume has subpar performance it will basically > slow down writes to the whole XFS volume. XFS doesn't have any > notion of a queue per AG or any other mechanism for compensating > uneven performance of AGs. It will slow down writes to blocks in that block device. If those blocks gate other IO (i.e. core metadata structures, maybe the log), then it could conceivably have an fs-wide impact. i.e. - If file "foo" has 100 blocks allocated in a slow-responding volume, writing to those 100 blocks would only slow down that write. If the log is allocated in a slow-responding volume and a workload is log-bound, then it could have an fs-wide impact. Again, xfs has no fast/slow notion. There is no compensation. IO queues are below the filesystem; there is no IO queue per AG. >> There are a few other smaller-granularity >> heuristics related to stripe geometry as well. > Oh, cool. Since I'm considering stripe vs. linear for the LVM volume, I'd be very interested in what these are. Simply things like allocating files on stripe boundaries if possible. So if you have a 64k stripe, it would try (IIRC) to allocate files (at least larger files, not remembering details for sure) on 64k boundaries. If you're keen to look at code, m_dalign is the stripe unit for the fs. You'll find things like: /* * Round up the allocation request to a stripe unit * (m_dalign) boundary if the file size is >= stripe unit * size, and we are allocating past the allocation eof. * * If mounted with the "-o swalloc" option the alignment is * increased from the strip unit size to the stripe width. */ or for inode allocation: /* * Set the alignment for the allocation. * If stripe alignment is turned on then align at stripe unit * boundary. * If the cluster size is smaller than a filesystem block * then we're doing I/O for inodes in filesystem block size * pieces, so don't need alignment anyway. */ -Eric From jisaidie@ncck.org Wed Aug 17 13:38:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1D3507CA0 for ; Wed, 17 Aug 2016 13:38:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A35ABAC04B for ; Wed, 17 Aug 2016 11:38:55 -0700 (PDT) X-ASG-Debug-ID: 1471459123-0bf8155c750ccf0001-NocioJ Received: from mail.ncck.org (mail.ncck.org [41.139.152.59]) by cuda.sgi.com with ESMTP id PfLkD6DyfXEcSaVf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 17 Aug 2016 11:38:46 -0700 (PDT) X-Barracuda-Envelope-From: jisaidie@ncck.org X-Barracuda-Effective-Source-IP: mail.ncck.org[41.139.152.59] X-Barracuda-Apparent-Source-IP: 41.139.152.59 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.ncck.org (Postfix) with ESMTP id A27CE4289BD9E; Wed, 17 Aug 2016 21:34:38 +0300 (EAT) Received: from mail.ncck.org ([127.0.0.1]) by localhost (mail.ncck.org [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id cNIGLSw8B-XK; Wed, 17 Aug 2016 21:34:33 +0300 (EAT) Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.ncck.org (Postfix) with ESMTP id E161242892921; Wed, 17 Aug 2016 21:34:28 +0300 (EAT) X-Virus-Scanned: amavisd-new at ncck.org Received: from mail.ncck.org ([127.0.0.1]) by localhost (mail.ncck.org [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id Rwi0UFqjUIGS; Wed, 17 Aug 2016 21:34:28 +0300 (EAT) Received: from mail.ncck.org (mail.ncck.org [41.139.152.59]) by mail.ncck.org (Postfix) with ESMTP id ED99342855C3E; Wed, 17 Aug 2016 21:34:26 +0300 (EAT) Date: Wed, 17 Aug 2016 21:34:26 +0300 (EAT) From: "Lendico S.A (Pty) Ltd. " Reply-To: lendicofin@outlook.com Message-ID: <1640198038.1856263.1471458866947.JavaMail.zimbra@ncck.org> Subject: Lendico Loan Offer at 3.5% MIME-Version: 1.0 X-ASG-Orig-Subj: Lendico Loan Offer at 3.5% Content-Type: multipart/mixed; boundary="----=_Part_1856260_2108899.1471458866944" X-Originating-IP: [41.139.152.59] X-Mailer: Zimbra 8.6.0_GA_1153 (zclient/8.6.0_GA_1153) Thread-Topic: Lendico Loan Offer at 3.5% Thread-Index: xJI3+Y/hiyE491EOYPz/SweEGjABiw== X-Barracuda-Connect: mail.ncck.org[41.139.152.59] X-Barracuda-Start-Time: 1471459126 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 491 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.23 X-Barracuda-Spam-Status: No, SCORE=1.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32093 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; ------=_Part_1856260_2108899.1471458866944 Content-Type: multipart/alternative; boundary="----=_Part_1856261_158868184.1471458866944" ------=_Part_1856261_158868184.1471458866944 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Dear Valued Customer, Please view attached LENDICO Finance Loan Services for details. Thank you, Mrs. Kate Nelson Loan Application Coordinator ------=_Part_1856261_158868184.1471458866944 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit
Dear Valued Customer,

Please view attached LENDICO Finance Loan Services for details.

Thank you,
Mrs. Kate Nelson
Loan Application Coordinator
------=_Part_1856261_158868184.1471458866944-- ------=_Part_1856260_2108899.1471458866944 Content-Type: application/pdf; name="Lendico Loan Offers.pdf" Content-Disposition: attachment; filename="Lendico Loan Offers.pdf" Content-Transfer-Encoding: base64 JVBERi0xLjMKJeLjz9MKMiAwIG9iago8PAovQ3JlYXRpb25EYXRlIChEOjIwMTYwODE3MTYzOTEw KzAwJzAwJykKL01vZERhdGUgKEQ6MjAxNjA4MTcxNjM5MTArMDAnMDAnKQovUHJvZHVjZXIgKEJD TCBlYXN5UERGIDcuMDAgXCgwMzU1XCkpCi9DcmVhdG9yIChlYXN5UERGIFNESyA3LjApCj4+CmVu ZG9iagoKNyAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWzY5Ljc1 IDczMC43IDIyMC45NCA3MTUuN10KL0JvcmRlciBbMCAwIDBdCi9BIDw8IC9TIC9VUkkgL1VSSSAo aHR0cHM6Ly9jb250ZW50LmxlbmRpY28uY29tL2Ntcy96YS9uY3JfbGljZW5jZS5wZGYpID4+Cj4+ CmVuZG9iagoKOCAwIG9iago8PCAvVHlwZSAvQW5ub3QKL1N1YnR5cGUgL0xpbmsKL1JlY3QgWzY5 Ljc1IDU0OC4yMSAyMDcuNzggNTMzLjgxXQovQm9yZGVyIFswIDAgMF0KL0EgPDwgL1MgL1VSSSAv VVJJIChodHRwOi8vdHJhY2suYWZmaWxpYXRlbmV0d29yay5jby56YS9hZmZfYz9vZmZlcl9pZD0z OSZhZmZfaWQ9MTAzNiZmaWxlX2lkPTM1MykgPj4KPj4KZW5kb2JqCgo5IDAgb2JqCjw8IC9UeXBl IC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbNjkuNzUgNTMzLjgxIDE1NS40NCA1MTkuNDFd Ci9Cb3JkZXIgWzAgMCAwXQovQSA8PCAvUyAvVVJJIC9VUkkgKGh0dHA6Ly90cmFjay5hZmZpbGlh dGVuZXR3b3JrLmNvLnphL2FmZl9jP29mZmVyX2lkPTM5JmFmZl9pZD0xMDM2JmZpbGVfaWQ9MzUz KSA+Pgo+PgplbmRvYmoKCjEwIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawov UmVjdCBbNjkuNzUgNTE5LjQxIDE1NS44OSA1MDUuMDFdCi9Cb3JkZXIgWzAgMCAwXQovQSA8PCAv UyAvVVJJIC9VUkkgKGh0dHA6Ly90cmFjay5hZmZpbGlhdGVuZXR3b3JrLmNvLnphL2FmZl9jP29m ZmVyX2lkPTM5JmFmZl9pZD0xMDM2JmZpbGVfaWQ9MzUzKSA+Pgo+PgplbmRvYmoKCjExIDAgb2Jq Cjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbNjkuNzUgNTA1LjAxIDE3Ni44 MiA0OTAuNjFdCi9Cb3JkZXIgWzAgMCAwXQovQSA8PCAvUyAvVVJJIC9VUkkgKGh0dHA6Ly90cmFj ay5hZmZpbGlhdGVuZXR3b3JrLmNvLnphL2FmZl9jP29mZmVyX2lkPTM5JmFmZl9pZD0xMDM2JmZp bGVfaWQ9MzUzKSA+Pgo+PgplbmRvYmoKCjEyIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlw ZSAvTGluawovUmVjdCBbNjkuNzUgNDkwLjYxIDUyNS41NSA0NzYuMjFdCi9Cb3JkZXIgWzAgMCAw XQovQSA8PCAvUyAvVVJJIC9VUkkgKGh0dHA6Ly90cmFjay5hZmZpbGlhdGVuZXR3b3JrLmNvLnph L2FmZl9jP29mZmVyX2lkPTM5JmFmZl9pZD0xMDM2JmZpbGVfaWQ9MzUzKSA+Pgo+PgplbmRvYmoK CjEzIDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBbNjkuNzUgNDc2 LjIxIDUyNS41NSA0NjEuODFdCi9Cb3JkZXIgWzAgMCAwXQovQSA8PCAvUyAvVVJJIC9VUkkgKGh0 dHA6Ly90cmFjay5hZmZpbGlhdGVuZXR3b3JrLmNvLnphL2FmZl9jP29mZmVyX2lkPTM5JmFmZl9p ZD0xMDM2JmZpbGVfaWQ9MzUzKSA+Pgo+PgplbmRvYmoKCjE0IDAgb2JqCjw8IC9UeXBlIC9Bbm5v dAovU3VidHlwZSAvTGluawovUmVjdCBbNjkuNzUgNDYxLjgxIDUyNS41NSA0NDcuNDFdCi9Cb3Jk ZXIgWzAgMCAwXQovQSA8PCAvUyAvVVJJIC9VUkkgKGh0dHA6Ly90cmFjay5hZmZpbGlhdGVuZXR3 b3JrLmNvLnphL2FmZl9jP29mZmVyX2lkPTM5JmFmZl9pZD0xMDM2JmZpbGVfaWQ9MzUzKSA+Pgo+ PgplbmRvYmoKCjE1IDAgb2JqCjw8IC9UeXBlIC9Bbm5vdAovU3VidHlwZSAvTGluawovUmVjdCBb NjkuNzUgNDQ3LjQxIDEzMC45IDQzMy4wMV0KL0JvcmRlciBbMCAwIDBdCi9BIDw8IC9TIC9VUkkg L1VSSSAoaHR0cDovL3RyYWNrLmFmZmlsaWF0ZW5ldHdvcmsuY28uemEvYWZmX2M/b2ZmZXJfaWQ9 MzkmYWZmX2lkPTEwMzYmZmlsZV9pZD0zNTMpID4+Cj4+CmVuZG9iagoKMTcgMCBvYmoKWwowIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA3 NTAgNzUwCjI3OCAzMzMgNDc0IDc1MCA3NTAgNzUwIDc1MCA3NTAgMzMzIDMzMyA3NTAgNzUwIDI3 OCA3NTAgMjc4IDc1MAo1NTYgNzUwIDU1NiA3NTAgNTU2IDU1NiA1NTYgNTU2IDc1MCA1NTYgMzMz IDc1MCA3NTAgNzUwIDc1MCA3NTAKNzUwIDcyMiA3NTAgNzIyIDcyMiA2NjcgNzUwIDc3OCA3NTAg Mjc4IDU1NiA3NTAgNjExIDgzMyA3MjIgNzc4CjY2NyA3NTAgNzIyIDY2NyA2MTEgNzUwIDc1MCA3 NTAgNzUwIDY2NyA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MAo3NTAgNTU2IDc1MCA1NTYgNjExIDU1 NiAzMzMgNjExIDc1MCAyNzggNzUwIDU1NiAyNzggODg5IDYxMSA2MTEKNzUwIDc1MCAzODkgNTU2 IDMzMyA2MTEgNTU2IDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwCjc1MCA3NTAg NzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MAo3 NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1 MCA3NTAKMjc4IDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUw IDc1MCA3NTAgNzUwCjc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAg NzUwIDc1MCA3NTAgNzUwIDc1MAo3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3 NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAKNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1 MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwCjc1MCA3NTAgNzUwIDc1MCA3NTAgNzUw IDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MAo3NTAgNzUwIDc1MCA3NTAg NzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAKXQplbmRvYmoK CjIwIDAgb2JqClsKMCA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3 IDUwNyAwIDUwNyA1MDcKNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUw NyA1MDcgNTA3IDUwNyA1MDcgNTA3CjIyNiAzMjYgNDM4IDUwNyA1MDcgNzI5IDcwNSA1MDcgMzEy IDMxMiA1MDcgNDk4IDI1OCA1MDcgMjY3IDUwNwo1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcg NTA3IDUwNyA1MDcgMjc2IDUwNyA1MDcgNTA3IDUwNyA1MDcKODk4IDYwNiA1NjEgNTI5IDYzMCA0 ODggNDU5IDUwNyA1MDcgMjY3IDUwNyA1MDcgNDIzIDg3NCA2NTkgNjc2CjUzMiA1MDcgNTYzIDUw NyA0OTUgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNwo1MDcgNDk0 IDUzNyA0MTggNTM3IDUwMyAzMTYgNTA3IDUzNyAyNDYgNTA3IDQ4MCAyNDYgODEzIDUzNyA1MzgK NTM3IDUwNyAzNTUgMzk5IDM0NyA1MzcgNDczIDc0NSA0NTkgNDc0IDM5NyA1MDcgNTA3IDUwNyA1 MDcgNTA3CjUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUw NyA1MDcgNTA3IDUwNwo1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3 IDUwNyA1MDcgNTA3IDUwNyA1MDcKMjI2IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcg NTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3CjUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1 MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNwo1MDcgNTA3IDUwNyA1MDcgNTA3IDUw NyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcKNTA3IDUwNyA1MDcgNTA3 IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3CjUwNyA1MDcg NTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNwo1 MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUw NyA1MDcKXQplbmRvYmoKCjIyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMgovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxlZWYzZTI+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoyNCAw IG9iagpbCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDIyOCAyMjgKMjI4IDIyOCAyOTEgMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4 IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4CjIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjgg MjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOAoyMjggMjI4IDIyOCAyMjggNTkyIDIyOCAy MjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggNjgzIDIyOCAyMjgKMjI4IDIyOCAyMjggMjI4IDIy OCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4CjIyOCA0NTYgMjI4 IDIyOCA0NTYgNDU2IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOAoyMjgg MjI4IDI3MyAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAy MjgKMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIy OCAyMjggMjI4CjIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4 IDIyOCAyMjggMjI4IDIyOAoyMjggMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw CjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCl0KZW5kb2JqCgoyNyAwIG9i agpbCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDIyOCAyMjgKMjI4IDI3MyAzODkgMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIy OCAyMjggMjI4IDIyOCAyMjggMjI4CjIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4 IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOAoyMjggNTkyIDIyOCA1OTIgNTkyIDU0NyAyMjgg MjI4IDIyOCAyMjggMjI4IDIyOCA1MDEgNjgzIDIyOCA2MzgKMjI4IDIyOCA1OTIgNTQ3IDUwMSA1 OTIgNTQ3IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4CjIyOCAyMjggMjI4IDIy OCA1MDEgMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOCAyMjggMjI4IDIyOAoyMjggMjI4 IDMxOSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MApdCmVuZG9iagoKMzAgMCBvYmoKWwowIDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcg NTA3IDUwNyA1MDcgNTA3IDAgNTA3IDUwNwo1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3 IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcKMjI2IDMyNiA0MDEgNTA3IDUwNyA1MDcg NTA3IDUwNyAzMDMgMzAzIDUwNyA1MDcgMjUwIDUwNyAyNTIgNTA3CjUwNyA1MDcgNTA3IDUwNyA1 MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNwo1MDcgNTc5IDU0 NCA1MzMgNjE1IDQ4OCA1MDcgNTA3IDUwNyAyNTIgNTA3IDUwNyA0MjAgODU1IDY0NiA2NjIKNTE3 IDUwNyA1NDMgNDU5IDQ4NyA1MDcgNTA3IDg5MCA1MDcgNDg3IDUwNyA1MDcgNTA3IDUwNyA1MDcg NTA3CjUwNyA0NzkgNTI1IDQyMyA1MjUgNDk4IDMwNSA0NzEgNTI1IDIzMCA1MDcgNDU1IDIzMCA3 OTkgNTI1IDUyNwo1MjUgNTI1IDM0OSAzOTEgMzM1IDUyNSA0NTIgNzE1IDQzMyA0NTMgMzk1IDUw NyA1MDcgNTA3IDUwNyA1MDcKNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3 IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3CjUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcg NTA3IDUwNyA1MDcgNTA3IDUwNyA1MDcgNTA3IDUwNwoyMjYgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCl0K ZW5kb2JqCgozMyAwIG9iagpbCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEwMDAgMTAwMAoyNDEgMzMxIDQxMiAxMDAwIDEwMDAgMTAw MCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwCjEwMDAg MTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEw MDAgMTAwMCAxMDAwIDQ3OQoxMDAwIDY3MSA2NTQgNjQyIDc0OSAxMDAwIDU5OSAxMDAwIDgxNSAx MDAwIDEwMDAgMTAwMCA2MDQgOTI3IDc2NyAxMDAwCjYxMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEw MDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMAoxMDAw IDUwNCA1NjAgNDU0IDU3NCA0ODMgMzI1IDEwMDAgMTAwMCAyOTMgMTAwMCA1MzYgMjg2IDg4MSA1 OTEgNTM5CjU3MSAxMDAwIDQxMCA0MzIgMzQ1IDU3NSAxMDAwIDczNyAxMDAwIDQ5MiAxMDAwIDEw MDAgMTAwMCAxMDAwIDEwMDAgMTAwMAoxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAw IDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwCjEwMDAgMTAwMCAx MDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAw MCAxMDAwIDEwMDAKMjQxIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMApdCmVuZG9iagoKMzYgMCBvYmoKWwow IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCA3NTAgNzUwCjI3OCAyNzggMzU1IDc1MCA3NTAgNzUwIDc1MCA3NTAgMzMzIDMzMyA3NTAgNzUw IDI3OCA3NTAgNzUwIDc1MAo3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAg NzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAKNzUwIDc1MCA3NTAgNzUwIDcyMiA3NTAgNzUwIDc1MCA3 NTAgNzUwIDc1MCA3NTAgNzUwIDgzMyA3NTAgNzUwCjc1MCA3NTAgNzUwIDc1MCA2MTEgNzUwIDc1 MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MAo3NTAgNTU2IDc1MCA1MDAgNTU2 IDU1NiAyNzggNTU2IDU1NiAyMjIgNzUwIDc1MCAyMjIgNzUwIDU1NiA1NTYKNzUwIDc1MCAzMzMg NTAwIDI3OCA1NTYgNzUwIDc1MCA3NTAgNTAwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwCjc1MCA3 NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1 MAo3NTAgNzUwIDIyMiA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUw IDc1MCA3NTAKMjc4IDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAg NzUwIDc1MCA3NTAgNzUwCjc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3 NTAgNzUwIDc1MCA3NTAgNzUwIDc1MAo3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1 MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAKNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUw IDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwCjc1MCA3NTAgNzUwIDc1MCA3NTAg NzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MAo3NTAgNzUwIDc1MCA3 NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAKXQplbmRv YmoKCjM5IDAgb2JqClsKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgNzc4IDc3OAoyNTAgMzMzIDU1NSA3NzggNzc4IDc3OCA3NzggNzc4 IDc3OCA3NzggNzc4IDc3OCAyNTAgNzc4IDI1MCA3NzgKNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAg NTAwIDUwMCA1MDAgNTAwIDc3OCA3NzggNzc4IDc3OCA3NzggNzc4Cjc3OCA3MjIgNzc4IDc3OCA3 NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDY2NyA5NDQgNzIyIDc3OAo3NzggNzc4IDcy MiA3NzggNjY3IDcyMiA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzgKNzc4 IDUwMCA1NTYgNzc4IDU1NiA0NDQgNzc4IDc3OCA1NTYgNzc4IDc3OCA3NzggMjc4IDgzMyA1NTYg NTAwCjU1NiA3NzggNDQ0IDM4OSAzMzMgNTU2IDc3OCA3NzggNzc4IDUwMCA3NzggNzc4IDc3OCA3 NzggNzc4IDc3OAo3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3 OCA3NzggNzc4IDc3OCA3NzgKNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4 IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4CjI1MCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3Nzgg Nzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OAo3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3 NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzgKNzc4IDc3OCA3NzggNzc4IDc3 OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4Cjc3OCA3NzggNzc4 IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OAo3Nzgg Nzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3 NzgKNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3 OCA3NzggNzc4Cl0KZW5kb2JqCgo0MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNDEKL1dpZHRoIDM1NQovSGVpZ2h0IDgxCi9CaXRzUGVyQ29tcG9uZW50 IDgKL0NvbG9yU3BhY2UgL0RldmljZVJHQgovTGVuZ3RoIDUwMDgKL0ZpbHRlciAvRENURGVjb2Rl Cj4+CnN0cmVhbQr/2P/gABBKRklGAAEBAAABAAEAAP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsM GRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0N GDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/A ABEIAFEBYwMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAAC AQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZ GiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOU lZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T1 9vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAAB 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 Af/ZCmVuZHN0cmVhbQplbmRvYmoKCjQyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW00MgovV2lkdGggMTIzOQovSGVpZ2h0IDkKL0JpdHNQZXJDb21wb25l bnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyNiA8ZmZmZmZmZmZmZmZlZmRm ZGZiZjVmOGVlZjNmN2ViZjVmOGVmZWRmM2UzZWJmMWRlZjdmOWYyZWVmM2UyZWNmMmRmZmVmZmZl ZmJmY2Y5ZjBmNWU3ZWJmMmRlZmJmY2Y4ZjRmN2VjZWRmM2UxZmVmZWZlZWRmM2UyZmVmZWZkZjlm YmY2ZWVmNGUzZjJmNmVhZWNmMmUwZjdmYWYyZWVmM2UzPl0KL0xlbmd0aCAxMDAKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja7dfHEYNQEERBPAiElRAm/0B1/Smw1R3CHF7tZlkiL8oK 4NnSqhV10wI8XHKqda/eHkCYrA3vcbIGECdr87LaAoiTta3+WAKIk7Xv/vN/AnGylu/HaQYgjuEa b4BA/pT1fWgKZW5kc3RyZWFtCmVuZG9iagoKNDMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQzCi9XaWR0aCAxMjg2Ci9IZWlnaHQgMTUKL0JpdHNQZXJD b21wb25lbnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNTIgPDliYmI1OTlh YmE1OTlhYjk1ODk5Yjg1Nzk4Yjc1Nzk3YjY1Njk2YjU1Njk2YjU1NTk1YjQ1NTk1YjM1NTk0YjM1 NTk0YjI1NDkzYjI1NDkzYjE1NDkyYjA1NDkyYjA1MzkxYWY1MzkxYWU1MzkwYWU1MjkwYWQ1Mjhm YWQ1MThmYWM1MThlYWI1MThkYWE1MDhjYTk1MDhjYTg1MDhiYTg1MDhiYTg0ZjhiYTc0ZjhhYTc0 ZjhhYTY0ZjhhYTY0ZTg5YTY0ZTg5YTU0ZTg4YTU0ZTg4YTQ0ZTg4YTQ0ZDg3YTQ0ZDg3YTM0ZDg2 YTM0ZDg2YTM0Yzg2YTI0Yzg1YTI0Yzg1YTE0Yzg0YTE0Yjg0YTA0YjgzYTA0YTgzOWY0YTgyOWY0 OTgyOWU0OTgyOWQ0OTgxOWQ0OTgxOWQ0ODgxOWM0ODgwOWM0ODgwOWI0ODdmOWI0ODdmOWE0ODdm OWE0NzdlOWE0NzdlOTk0NzdlOTg0NzdkOTg0NzdkOTg0NjdkOTc0NjdjOTc0NjdjOTY0NjdiOTY0 NjdiOTU0NjdiOTU0NTdhOTU0NTdhOTQ0NTdhOTM0NTc5OTM0NTc5OTM0NDc5OTI0NDc4OTI0NDc4 OTE0Mzc3OTE0Mzc3OTA0Mzc3OTA0Mjc2OTA0Mjc2OGY0Mjc1OGU0Mjc1OGU0MTc0OGQ0MTc0OGQ0 MDczOGM0MDczOGMzZjcyOGIzZjcxOGEzZjcxOGEzZTcwODkzZTZmODgzZTZlODczZTZlODczZDZk ODYzZDZkODUzZDZjODUzYzZjODQzYzZiODMzYjZiODIzYjZhODIzYTZhODEzYTZhODAzYTY5ODAz YTY5ODAzOTY5N2YzOTY4N2YzOTY4N2UzODY3N2UzODY3N2QzODY3N2QzNzY2N2QzNzY2N2MzNzY1 N2IzNzY1N2IzNjY0N2EzNjYzNzkzNjYzNzkzNTYyNzgzNTYxNzczNTYxNzczNDYwNzYzNDYwNzYz MzVmNzUzMzVmNzUzMjVlNzQzMjVlNzMzMjVkNzMzMjVkNzIzMjVjNzIzMTVjNzEzMTViNzEzMTVi NzAzMTViNmYzMDVhNmYzMDVhNmUyZjU5NmUyZjU5NmQyZTU4NmMyZTU3NmIyZDU2NmEyZDU1Njky ZDU1NjkyYzU0NjgyYzUzNjcyYzUzNjcyYjUyNjYyYjUyNjUyYjUxNjUyYTUxNjQyYTUwNjMyOT5d Ci9MZW5ndGggOTk0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42u3bjVcMURjH8Sii pES0KbFJrRWKQon0JqUoKdlKKlrkpYiUJO9R8s6f6+6Mc++cO8/M3Jl7Z3Zmdz5/xPf85jl3UlI4 rRNuvXipwqUJt4HLRkg6YJOxzbIMQCZkiyzL0FZINiDH0Lb/cgHbITtkedp26tilLV9DIBAokO0m CrEibA9RLNmL7IMEg8ES2X6sFDtAlGHlslAodBASDocPqVRgh7EjtKNIpUpV1THiOFItqcFOECcl p5BarK7uNK2+/gx2FmmQnCMasSZJM9JCtLaep7S1XUDasY4OFzYrNTmblW6tWTrJyuBKVhZrstib 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 A/DpMHX7NhTS/TQq0QyIc71BrsmnxU7OGPU0XaBPCylsQgPAfwN7Qi/HxRvA9h2HPrJWLkMoG1uc ypu4U1UiJ9r+ZEJGAswoNiHuTuUe79BBGW/rWh2XbgBHG+EHx9Mo7LLleRQARH8lOeS8eppsAE+T DWCMDAqylBjYGqhdS/Gkfbrcj5z+Eal8OrV5BijTTg8FoE+9M+gyawC7QadTUp1BkUTwVIDcKwF2 efTMfF+efc+AscQR970zmA/JW3FyYwi6bLQI/Nmp0Y6OCJ7uvLpm5+FZxSTh3PnDuZRbIP+ZS4n7 9pI1KKxlyZaU7JYuR9+TZrPdW8wZOXj/YuUmcpcZTTtSgB3FEByHQOk1pVzMmil7hAB5+D1TYhWc wQlhYCrTD0bVigb7Ahvjk+OBNTm6OUB73dv5rMEjmlOddEX3eYvUxwZS+XOel1vvecTf7Dy8VU6Q p0XA+6GHQabzjbl2BXxSSNDK4tTXwnQqL2Rdyvj+N4RH7pNva0sKAbDTo9bLZ+UFSrMAFle2O5We mYYKl4VWCueFAVwuGpDgivWcGHF3OjybJjEGNrp4U3nx55ZDTBwD2Lqd/fI3OYsqeL4+vMmtLo9c wpyji1JeVQZ4dIWSoOr2CSpyvadwdQR4J1iCW+foUuvf//31Pz///R9wuzJnCmVuZHN0cmVhbQpl bmRvYmoKCjYgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA0IDAgUgovTWVkaWFCb3ggWyAw IDAgNTk1LjUgODQyLjI1IF0KL1Jlc291cmNlcyA8PAovRm9udCA8PAovRjE1IDE2IDAgUgovRjE2 IDE5IDAgUgovRjE3IDIzIDAgUgovRjE4IDI2IDAgUgovRjE5IDI5IDAgUgovRjIwIDMyIDAgUgov RjIxIDM1IDAgUgovRjIyIDM4IDAgUgo+PgovWE9iamVjdCA8PAovSW0yMiAyMiAwIFIKL0ltNDEg NDEgMCBSCi9JbTQyIDQyIDAgUgovSW00MyA0MyAwIFIKPj4KL1Byb2NTZXQgWy9QREYgL1RleHQg L0ltYWdlQiAvSW1hZ2VDXSA+PgovQ29udGVudHMgNDQgMCBSCi9Bbm5vdHMgWwo3IDAgUgo4IDAg Ugo5IDAgUgoxMCAwIFIKMTEgMCBSCjEyIDAgUgoxMyAwIFIKMTQgMCBSCjE1IDAgUgpdCj4+CmVu ZG9iagoKNCAwIG9iago8PAovVHlwZSAvUGFnZXMKL0tpZHMgWwo2IDAgUgpdCi9Db3VudCAxCj4+ CmVuZG9iagoKNDUgMCBvYmoKPDwKL0xlbmd0aDEgMzc3MDgKL0xlbmd0aCAxNTg1NwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtvQl4lEXWMFpV797r2/uSdLo7nXQnaUK2TkIgkjdk EYhAWE3QSFjCoo4kyiYqxIXVDUfFXeIGiM7QdAATliHu2zjgjs74mVEUdWRkHERHSfc99XYHcWa+ //7fvf//3Of/bqpSdWo7tZxz6tSp6k6CMEJIhwoRgzZNmlpQbLp43qdQ8nsIrXN/Nbu9+TLLdQjh YQiR5+YuW+L7afRjHyLEnERImDm/fcGvxC/25SCkvQAh7v0Fl189P+vlR7oQMmUhVHT5wrbZ81xr r/8zQmM2QX9lC6HAvEofgfwrkM9a+KslK37ymxsg/zVCgU2XL547u+PNzqsQmn8tQu4Dv5q9ot2G zWUIXT8C2vvaF1+1JJGH3od8k5q/sq39b+M/s0N+BYz5FmKYd8gBxCGRu58rgVmnJSHzJppPzCJH tAJLqGP7UV6iD62ogV4kCGjahBofAs8r3NvxybhEGI1jCsKJRAIhNsjto6MhFmImFdIRpRtCX0MO UvhbqD0C+UK1nYwyUS4ahoZDvhiVo5GoGtWh89F41IimoWY0Gy1Ai9BitAx14SJeoaMAXs5ZjAiq AIwawBiHLkBTVIy5gHEZunIQI/Hp/6Sfm3j8TDQ12/+Swzw6i4YJAQH45wZACpZTk1odQkZkQhZk Qw6ny43SPck2WSgYykF5aFg+KigsKi5BpWXltLwy1Uctqj9/7LjxsMqJkxonT0Fo+owLm5rR/3rH /M83ffec9H87roIsp6thG0pngyDHKHFsMMQXJY7ROgrJV8BgTzKkXAw9jd7HOdiHuvGPyIF+wC5c BGth0fdA3p1oAN2NrECJzdgMfLej6WgcZqFNGN2CH0gsS3yJzkO/Ro8mnsE3JHZA/e3oJfQDzOA/ WAzUnAjtp6M29CXzGWpO3I9EtA5p0Sg0BduBTu+B/w7mcCe6C/0OX5v4AUa1ohugv0qgaXXi2cQZ kLJb2E3cUWkPugPtxzzQaBHKAJ5tJOHEe4mPURAo/hh6GuYUxn3sWOQHyq9B92IX8xKk7kaPozjW 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 xt1FS1c9X9cWqGsN1LVBaI3evGyhM9o5x+fbtWoprfBFmWDrnLkLKZzdFl0aaKuNrgrU+nYVPf9v qp+n1UWB2l3o+bppTbueV9pqY0VKUV1gdm1zd1VlU/Uvxtpwdqymyn/TWSXtrImOVVX9b6qraXUV HauajlVNx6pSqtSx6hZRuW9s2iWiMc01FydhN9FqQIZb0/zNY+xy+2gq0L2j/M5VaftYhLcjbbg5 qguMieoh0Kr86vxqWgX7jFYZoNiYqnKuGuVP24e3p6pkKDYFxqCz/3iLNqJ/hLUh6p86s4mKSlSZ /e95dhV1arUT1S2qhR/IL1ED+HNboqv+rVvy79zSpUuvotHS8FUINUTzpjZEy+ifhBUEGKq1thnK hg+WMYxatkuS6noSfVAZhkngJXQ4mgpj+m8FFA3cugTSxXcJhF4VlnS7PcWLD8IJvhoC3OPI8liB en0my7szs+n9ZUl3QWkSwnWVwpjbX0z/rmg5oFKYnYSKKR8Sm7I35W8q78ruyu8q5+nf4d8Khd6t 9CiNFWxl0JLwVYOEgOSSZpT8bwcw3iOxdI86cBdNhMPN4avUPyqI/pXYeJDoS34mfwqq3S8ZZEiy /KpUJ8CJ5OhLB9GWppDUyqUqUrKTZO5s9LODHEL/Fwta+VwKZW5kc3RyZWFtCmVuZG9iagoKMTgg MCBvYmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Bc2NlbnQgOTA1Ci9DYXBIZWlnaHQgNzg4 Ci9EZXNjZW50IC0yMTIKL0ZsYWdzIDMyCi9Gb250QkJveCBbMCAtMjEyIDI2MjggOTA1XQovSXRh bGljQW5nbGUgMAovU3RlbVYgMAovRm9udEZpbGUyIDQ1IDAgUgovRm9udE5hbWUgL1NLS09VRitB cmlhbC1Cb2xkTVQKPj4KZW5kb2JqCgoxNiAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAv VHJ1ZVR5cGUKL0Jhc2VGb250IC9TS0tPVUYrQXJpYWwtQm9sZE1UCi9FbmNvZGluZyAvV2luQW5z aUVuY29kaW5nCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMjU1Ci9Gb250RGVzY3JpcHRvciAxOCAw IFIKL1dpZHRocyAxNyAwIFIKPj4KZW5kb2JqCgo0NiAwIG9iago8PAovTGVuZ3RoMSA0NTUyNAov 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 q1aROKvhVOGiRrXSreSmRZRsZURZo5ypZK9UYk4ZjjZySn92Y41ipmKBgt2pwJwimNv4oWxExnAy uPChdETKjEgxYrEHY4Q1AKwEZLMPG92N7GOYLD8JEcZXoe5Qa1I80tk6JGmfO4QvHQp0kU+uY86Q 6NIh1DNnbu8ejK/oI7+83T1kaO2YQ+Nbd+xAztrWIWdXb4LdtctZ29c6tIWccxx/PkLOEWTpC81f u37t2nWhtSH4AJq/FlLWrYc/HjB8Aq5fR66sW4sgS+hLDpJjLYH1fKa16xeshzLgAiSv5ZNJbD6f JfS/4Vj7n3w4Dk0e/6HDsmD+/wPDrH1BCmVuZHN0cmVhbQplbmRvYmoKCjIxIDAgb2JqCjw8Ci9U eXBlIC9Gb250RGVzY3JpcHRvcgovQXNjZW50IDk1MgovQ2FwSGVpZ2h0IDczMQovRGVzY2VudCAt MjY5Ci9GbGFncyAzMgovRm9udEJCb3ggWzAgLTI2OSAxNzU5IDk1Ml0KL0l0YWxpY0FuZ2xlIDAK L1N0ZW1WIDAKL0ZvbnRGaWxlMiA0NiAwIFIKL0ZvbnROYW1lIC9TS0tPVUcrQ2FsaWJyaS1Cb2xk Cj4+CmVuZG9iagoKMTkgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1RydWVUeXBlCi9C YXNlRm9udCAvU0tLT1VHK0NhbGlicmktQm9sZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwov Rmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3IgMjEgMCBSCi9XaWR0aHMg MjAgMCBSCj4+CmVuZG9iagoKNDcgMCBvYmoKPDwKL0xlbmd0aDEgOTY4MAovTGVuZ3RoIDQ4NTMK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja7Vl9eFTFuX9nzjl7zmaT7Nlks9nNBvYs hwTJJiaEb4zkkOwGYQVCPsgusmGTEBI0mCBgWbSYqIAmKFFABe2TWL+orXI2eHETtcT2qu3Tot6n 1n7oFWvl2ts2hRY07VOTve85GxBuuV5vn9un/zCzvzMz7/ubmXfemTmZyQECAMlQBAz0rqguLN74 YsSHkh8jVjVtbOioP737EACZiril6dYt0s2PL9kOQB8BYBvXd7Rs7Fhw+88BDJ9j+XhLW2T99roH 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 aSoWdFWq9m1zQmXfcY3bOUQOT6hEFFtwL084Huo3b8bfli3n063nQ/3meo9HeyZymo5s3bL50p+m 3rLZg9icaE6lvtYYTfa1qkpPWJVkr2rQBCkTgimydzPAfwHo0TfOCmVuZHN0cmVhbQplbmRvYmoK CjI1IDAgb2JqCjw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovQXNjZW50IDkyMgovQ2FwSGVpZ2h0 IDc5MAovRGVzY2VudCAtMjEwCi9GbGFncyAzMgovRm9udEJCb3ggWzAgLTIxMCAxMTgyIDkyMl0K L0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAKL0ZvbnRGaWxlMiA0NyAwIFIKL0ZvbnROYW1lIC9TS0tP VUgrQXJpYWxOYXJyb3cKPj4KZW5kb2JqCgoyMyAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlw ZSAvVHJ1ZVR5cGUKL0Jhc2VGb250IC9TS0tPVUgrQXJpYWxOYXJyb3cKL0VuY29kaW5nIC9XaW5B bnNpRW5jb2RpbmcKL0ZpcnN0Q2hhciAwCi9MYXN0Q2hhciAyNTUKL0ZvbnREZXNjcmlwdG9yIDI1 IDAgUgovV2lkdGhzIDI0IDAgUgo+PgplbmRvYmoKCjQ4IDAgb2JqCjw8Ci9MZW5ndGgxIDEyMTky Ci9MZW5ndGggNjc3NwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtegt4VNW18Np7 n+ecZHImj2FCgDnDQHgkIeGdSDAHkhkIqSRAkDwYmIRHALUmQFDApulVBAKaKL4Qe6G/oLTVchIU JgFLVGqv3r8XKlb0+oDWFHzcCKWAFs3MXXsSKNje3nt7v/+73/99nj1rP9Zae+219l577X3ON0AA IAaygEFL8ZzMMd/9aF0RYv4vwq2L7qiq/dVLH94MQIYgrFy0ZrVxX+2MwQD0CQChY2ltzR2zPtB1 ALkU20drbl+79MDW97ejQBfCG8uWVC3eMfaZMICrC+VNWIYI+xLxS4DkAdgesuyO1XdPPyA+h20T QPzw9jsXVR1Z/tJDAG4D22PuqLq7Vp6qLUVWlA9G7Z2rVkdGwmPYXh1tr1xSu/ixDi7qEQAtBgjz 0sNoiSI+KY5F9LbekmqwlMYrItVkiVLKqIC4jQAKXH1Kb8k3gKeV4onwLBIrryH7UIWdp072MVAg 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 1K+qr8fmAsyuh7S0aG010leRVatXcVZs1POifhWvrL6W/h0IkHJtCmVuZHN0cmVhbQplbmRvYmoK CjI4IDAgb2JqCjw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovQXNjZW50IDkzMwovQ2FwSGVpZ2h0 IDc5MAovRGVzY2VudCAtMjEwCi9GbGFncyAzMgovRm9udEJCb3ggWzAgLTIxMCAxMTM3IDkzM10K L0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAKL0ZvbnRGaWxlMiA0OCAwIFIKL0ZvbnROYW1lIC9TS0tP VUkrQXJpYWxOYXJyb3ctQm9sZAo+PgplbmRvYmoKCjI2IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9T dWJ0eXBlIC9UcnVlVHlwZQovQmFzZUZvbnQgL1NLS09VSStBcmlhbE5hcnJvdy1Cb2xkCi9FbmNv ZGluZyAvV2luQW5zaUVuY29kaW5nCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMjU1Ci9Gb250RGVz Y3JpcHRvciAyOCAwIFIKL1dpZHRocyAyNyAwIFIKPj4KZW5kb2JqCgo0OSAwIG9iago8PAovTGVu Z3RoMSA0NTkwNAovTGVuZ3RoIDE1NjgwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2u29B3wcxd0/PLN7vfcqXdHp7nQ69S5Zlk5Wb5YlW7ZkW7ZkuYNxx8YFmw4GQjMQU00SSmLK6dxk DMEkTggkpoUSEiCQRjW92kj6/2ZnR5YbD8+TvO/ned+/dvW973dmy+38ZuY3v9ldnxFGCGlQDuLR 9W1Ts/O+fX1wPeT8AdDbv6xvxZpzVyUhhDMQ4j/sP3+NL3774RcRkjoASQtXLFr21VetGoRUBQgp XYvOvWDhFEfqxQiZpyBU9KvFC/rmHwi/X45QkwXOV7QYMrQPyWHfphZIpy5etmb901ttt0N6BUKh knOX9/f9bfVnbyC04gGEPNOW9a1f4S9KvRehH30H+/tWLF+9ZsSNLkfouiQhvWrBiq+P9z8NafiO VAviJVF8PZIihXSHNB+u2kOZfx5dziEF4vRSjuMkPCd5C3EjMfTgCJyFlB+1TvX5UAzEThkaRviw /C4u5EP4brKN3y/VkW8DC6FRJNHjsA5SoLhjSII+I2WC/SSwIqRFKSiCMlAWykOFqBY1oiloGpqB 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 iclMtDLRwkQzE01MNDLRwEQ9E3VM1DJRw0Q1E5OYqGIixkQlExVMTGSinIkJTJQxUcpECRPFTBQx UchEARP5TOQxkctEDhPZTGQxkclEBhNRJtKZiDCRxkSYiRATQSZSmQgwkcKEnwkfE14mPEwkM5HE hJsJFxNOJhxM2JmwMWFlwsKEmQkTE0YmDEzomdAxoWVCw4SaCRUTSiYUTMiZkDEhZULCBM8ExwRm AokCjzAxzMQQE98xcZyJY0x8y8Q3THzNxFdMfMnEF0x8zsRnTHzKxCdMfMzER0wcZeJDJj5g4n0m 3mPiXSbeYeJfTPyTiX8w8Xcm/sbE20y8xcRfmXiTiTeYeJ2JvzDxZyZeY+JPTLzKxCtMvMzES0z8 kYkXmXiBieeZeI6JZ5k4wsQfmPg9E88w8TQTv2PiKSZ+y8RvmDjMxK+Z+BUTTzJxiIknmPglE48z 8RgTB5l4lIkDTAwysZ+JfUzsZWIPE7uZSDAxwESciUeYeJiJh5h4kIldTPyCiZ8z8QAT9zNxHxP3 MvEzJn7KxE+YuIeJnUzczcRdTNzJxB1M3M7EbUzsYOLHTNzKxC1M3MzEdiZuYuJGJm5g4nomrmPi R0xcy8Q1TFzNxDYmrmLiSiauYOJyJi5jgoU9mIU9mIU9mIU9mIU9mIU9mIU9mIU9mIU9mIU9mIU9 mIU9mIU9mIU9mIU9mIU9mIU9mIU9eBUTLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7B LP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7BLP7B LP7BLP7BLOzBLOzBLOzBLNrBLNrBLNrBLNrBLNrBLNrBLNrBLNrBLNrB1buJgKg54anwQsyc8FiB LqapixKeMqCtNLWF0oUJjwZoM01torSR0gZKFySSq4DWJ5KrgdZROp/SWrptDU2tprSKZq5MJE8C WkFpOaXz6C7LKJ1L6ZxEUi3QUkpLKC2mtIjSwkRSDdACmppPqZ/SPEp9lHopzaU0hx7XQ1OzKc2i NJNSN6UuSjMoTafUSWkapamUOii1U5pCqY3SZEqtlFooNVNqSrgbgRopNSTcTUD1lOoS7mag2oS7 BaiGUjWlSXRbFT0uRqmSHldBaSKlcrrnBEpl9PBSSiWUiikVUSqkJyuglE/Pkkcpl1IOPVk2pSx6 XCalDEpRSumUIpTSKIXpqUOUgvScqZQClFLoqf2UfPQ4LyUPpWRKSZTclFwJ12QgJyVHwtUGZKdk o5lWShaaaaZkomSk2wyU9DRTR0lLSUO3qSmpKCnpNgUlOSVZwjkFSJpwtgNJKPE0k6MpTAkJhEco DQu74CGa+o7ScUrH6LZvaeobSl9T+orSlwnHNKAvEo6pQJ/T1GeUPqX0Cd32MU19ROkopQ/ptg8o vU8z36P0LqV3KP2L7vJPmvoHTf2dpv5G6W1Kb9Ftf6X0Js18g9LrlP5C6c90l9do6k+UXk3YZwC9 krBPB3qZ0ks084+UXqT0AqXn6S7PUXqWZh6h9AdKv6f0DN3laUq/o5lPUfotpd9QOkzp13TPX9HU k5QOUXqCbvslpcdp5mOUDlJ6lNIBSoN0z/00tY/SXkp7KO1O2CqBEgnbLKABSnFKj1B6mNJDlB6k tIvSLxI28Nf45/QsD1C6n267j9K9lH5G6aeUfkLpHko7Kd1NT3YXPcudlO6g226ndBulHZR+TA+4 laZuoXQzpe102030LDdSuoFuu57SdZR+ROlaStfQPa+mqW2UrqJ0JaUrKF2esPYBXZawzgO6lNIl CetCoIspXZSwdgJtTVjBGeMtCWsR0IWUNtPDN9HjNlLakLDOB7qAHr6e0jpK51NaS2kNpdX01Kvo 4SsprUhY+4GW05OdR/dcRulcSudQWkppCT1uMaVF9MoW0sMXUJpP9+ynNI9SH6VeSnMpzaGF7qFX NpvSLFromfTU3fSLuijNoJc7nX5RJz3LNEpTKXVQak9YYkBTEhbyDW0JC2nekxOWS4BaE5ZMoBa6 SzOlpoQF4gLcSFMNlOppZl3CciFQbcJyBVBNwrIFqDph2Qo0KWGqA6qiFKNUSakiYYLxHU+kqfKE sRtoAqWyhJE0jVJKJQljPVBxwtgFVJQwzgQqpNsKKOUnjBlAeXTP3ISRFCwnYSR9M5tSFj08k35D BqUoPVk6pQg9WRqlMKUQpWDCSKyUSilAz5lCz+mnJ/PRs3gpeehxyZSSKLkpuSg5E4YeIEfCMAfI njDMBbJRslKyUDJTMtEDjPQAA83UU9JR0lLS0D3VdE8VzVRSUlCSU5LRPaV0TwnN5ClxlDAlFBvR z/MSDOv7vUP6+d7vQB8HHAN8C3nfQN7XgK8AXwK+gPzPAZ/Btk8h/QngY8BHgKOQ/yHgA9j2PqTf A7wLeAfwL90i7z91i73/APwd8DfA25D3FvBfAW8C3oD068B/AfwZ8BrgT9pzvK9qc72vAL+sPdf7 kjbk/SPgRdAvaKPe5wHPAZ6F7Ucg7w/aZd7fg34G9NOgf6dd6n1Ku8T7W+1i72+0i7yH4dhfw/l+ BXgSEBs5BJ9PAH4JeFyz0vuYZpX3oGa191HNGu8BwCBgP+TvA+yFbXtg227ISwAGAHHAI+oLvA+r N3gfUm/yPqje7N2lvtD7C8DPAQ8A7gfcB7hXnen9GfBPAT+BY+4B3qk+x3s36LtA3wm4A/TtcK7b 4Fw74Fw/hrxbAbcAbgZsB9wEuBGOuwHOd71qsvc6VZv3R6pF3mtV93qvUd3vvYwPei/lS7yX4BLv xZ1bOy/atbVzS+fmzgt3be5Ub8bqze7NzZs3bt61+S+bYyaZalPnhs6NuzZ0XtC5rnP9rnWdj3KX o4XcZbHyzvN3re2UrLWsXbOW/2It3rUW16zFOWsxh9Ya1vrW8po1nas6V+9a1YlWTVm1dVV8lWRC fNVbqzi0CqvIf2qwyu2pIz/5v2mV1lC3snN554pdyzvPW7iscylc4JKSRZ2Ldy3qXFgyv3PBrvmd /SXzOvtKejvnlvR0ztnV0zm7ZGbnrF0zO7tLujpnwP7TS6Z1du6a1jm1pL2zY1d7Z1vJ5M7JkN9a 0tzZsqu5s6mkobNxV0NnfUldZy0UHiUZknxJvIFcwOQkuBLkxpNy3DH3W+5P3BLkjrsPuXmT3uV1 cRG9E1e3OfFy5xbndU5e73jOwcUckYw6vf05+1/tH9sl5pg9klWHbAabz8ZbSdlsrdPqBK6soZxb KJS11RYI1emtWG/1WrlarxUj41vGT4y89QnDcwZOr8d6/Yiei+lhd73Oq+PIx4iOj+lyi+v0Wq+W Ix8jWt4W00IOOWNYM2VanV7tVXOdleo2NRdTV1bXxdSZOXWIxz6METYA8QrYdw+2euv4xzF54CNF GF+PpkWbBxWoozmumDIrjq+MB6eSz1j7zLjsyjjqnDmrawDjH3UPYK56WtzS3D6Tpi+79lqUPKk5 njy1K8Hv3Jk8qbs5vpXoWEzQI0Qj2KU7Omf12tXR6Jo58DFn9Zqo8AcpvJakoiST/K1eA2myrhXS KPq9C90NaO5qWNawzDXR/08vODq+/JvLAIJ22lU1wl2K5nOXAC4GXATYCtgCuBCwGbAJsBGwAXAB YD1gHeB8wFrAGsBqwErACsBywHmAZYBzAecAlgKWABYDFgEWAhYA5gP6AfMAfYBewFzAHEAPYDZg FmAmoBvQBZgBmA7oBEwDTAV0ANoBUwBtgMmAVkALoBnQBGgENADqAXWAWkANoBowCVAFiAEqARWA iYBywARAGaAUUAIoBhQBCgEFgHxAHiAXkAPIBmQBMgEZgCggHRABpAHCgBAgCEgFBAApAD/AB/AC PIBkQBLADXABnAAHwA6wAawAC8AMMAGMAANAD9ABtAANQA1QAZQABUAOkAGkAEnVCHzyAA6AAQjN x5CHhwFDgO8AxwHHAN8CvgF8DfgK8CXgC8DngM8AnwI+AXwM+AhwFPAh4APA+4D3AO8C3gH8C/BP wD8Afwf8DfA24C3AXwFvAt4AvA74C+DPgNcAfwK8CngF8DLgJcAfAS8CXgA8D3gO8CzgCOAPgN8D ngE8Dfgd4CnAbwG/ARwG/BrwK8CTgEOAJwC/BDwOeAxwEPAo4ABgELAfsA+wF7AHsBuQAAwA4oBH AA8DHgI8CNgF+AXg54AHAPcD7gPcC/gZ4KeAnwDuAewE3A24C3An4A7A7YDbADsAPwbcCrgFcDNg O+AmwI2AGwDXA64D/AhwLeAawNWAbYCrAFcCrgBcDrgMza/aiqH/Y+j/GPo/hv6Pof9j6P8Y+j+G /o+h/2Po/xj6P4b+j6H/Y+j/GPo/hv6Pof9j6P94FQB8AAYfgMEHYPABGHwABh+AwQdg8AEYfAAG H4DBB2DwARh8AAYfgMEHYPABGHwABh+AwQdg8AEYfAAGH4DBB2DwARh8AAYfgMEHYPABGHwABh+A wQdg8AEY+j+G/o+h/2Po+xj6Poa+j6HvY+j7GPo+hr6Poe9j6PsY+v74SPBvLd3jJvi3FsfcOf8H VQx8mwplbmRzdHJlYW0KZW5kb2JqCgozMSAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IK L0FzY2VudCA5NTIKL0NhcEhlaWdodCA3MzEKL0Rlc2NlbnQgLTI2OQovRmxhZ3MgMzIKL0ZvbnRC Qm94IFswIC0yNjkgMTc0MyA5NTJdCi9JdGFsaWNBbmdsZSAwCi9TdGVtViAwCi9Gb250RmlsZTIg NDkgMCBSCi9Gb250TmFtZSAvU0tLT1VKK0NhbGlicmkKPj4KZW5kb2JqCgoyOSAwIG9iago8PAov VHlwZSAvRm9udAovU3VidHlwZSAvVHJ1ZVR5cGUKL0Jhc2VGb250IC9TS0tPVUorQ2FsaWJyaQov RW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1NQovRm9u dERlc2NyaXB0b3IgMzEgMCBSCi9XaWR0aHMgMzAgMCBSCj4+CmVuZG9iagoKNTAgMCBvYmoKPDwK L0xlbmd0aDEgMTc4NDgKL0xlbmd0aCAxMDUyNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNrtfHmcFNW976ml96Wq972ruqune3qZqZ7unpmehemCWWGAGYYBZoCBGVkExDAKuANjcAIO GlGeiMYFBZwrucHGAIKaBJfrXXKNiGZ90ZiEp4lxjNePJkbtnnfO6QU0Mfl8ct/n/XNTNXXqd9aq +v7Wc6p6AAEA0II4oMDenoViopPd+0dY8p/wWLzqypHR535LNgNABODxyKprtvCZt2fBKvLfYP61 taOXX6n45O17AaDvB0A2dfnG69cq+0LtAKhvAyD23ro1I6vbsl89CkD9TbBT3TpYwHQr4BXrT8B8 YN2VW6677zFlDOZ/Avuv3rhp1UjzsZqXAZgBr0kfvXLkulHZN+R3AjDzN7A9P7pp85bp+WANALOU OH/1mtGPQ+khmK8EgPo6IKhxYi+QAaXsPlkStvhG4Ux6wRqyj6ZIWkbK4EFRsGwXuGSbt5DngQR4 cFCuy7eBFxWLiWd5AB4qNyABgc9miBOkCCc85KBYCM8kidp8foOVFC0Df2Xzg0BFMATCIAozYrwG JL/Yoq29o7NrNgBzwfye3gV9C8GixUsGwFKwHPw/3qi/rxsNdsPUC1g4gB4+Twa0gQ7QBeaDXrAW rAejYCu4FlwPDk5PI47B+pm4fi6sH4H1V4CrS/XTv/7SfVUZ6C/d5FqUyvbAewD0J/BKpRusQTT1 I+BGuek3cPornL4JAOQ16vUJpE7/dxFUFo+/fyMu+7u6fQB+CM5CNF+Bx8vgX8Ez4F54dIDXwU/B C2AGWA02YeG8CgyCPtj+WnAlGIYceALsBJtBHwEIPSx9BvwH6Aad4H5wJ+QRUvJOclnxCs/DkkVg FdgAtoEnCJ7gIfd64ehn4VU6wHfBu3AMIxGF3LwRfBU0gtlgoNj6QfA78AdCTbCkm1wBrPBOj4Ff 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 4wLB/Jz7eebnPT+nuVfEVzKv9Lyy8pVNr8i5c+K5zLmec/R/fp/lXnrZyf0AHviTu5dNjrrH7g9x 993v5L4Bz/ffFeLuuJdgH+Qf3PsgxT948EESf3D5IGw3uV/J3XMgxB3Y7+Duhsf+e3ju7NsEqjcf ilXXHbpLyf0v2H8fPO6EB6qovEsI1knPqPR1w0+PPj32NMU/de4pUnpKzdSxZ4jhM6Nnxs78/sz7 Z2SoseO0SlsnPdn75N4nKXCKYE5xp0hwkth7El9DfVKjr9vxW2LHWzh7/FdOru7NY+8fI48d4bjX jji4w0cSHLt3717y1YMO7mF4jB0kwFHx6KajB4/S4DL2MvKhHxPcL0Z/QT7/bScHvk0wz3LPkme/ 4+S+B4/vwuPEdzzcd7a7uD0TIncrPCa2i9zucSW3a7yLe/wB4oFxJ/e1cT93y84GTpXZ2bOTbN45 nuR+CIvHxveOk78YJ8a3u7lzbxNfHRO40bGxMfLm7XO4Hdv93LbtMYzHw9v9FXVgOzG8fXT7+9up WBUTieorw0wwpA9UMH5Bz/sYL6d3uT06u8Ops1htOqPJrFPII5zDHuGslghnMkY4mgpzLBPhGNag 1er0WpVao5UrlFqKlmkBQWo5r+glOTkhyjPyHjnFMCKTYXoYOqPt1ZI9FCGCDOgBmwDtalJyTKOS oxqUHEgrud4kkTV2g+7+WVkTAc8LZ2WT0e7TStCXTUS7s6reZQPHCeLrg7A0S+4+TYD+LL37NAlP xtalywZOEw5UPY5/Pg6p08TY+O23u47TRWpwMOrJru5eOJAd9QxmE4jY6xnEC5ebC1v0S7bjr9Po V+Uj2deFtuNvvI5/YZ59Q2jL/rp9fVbak6Xah7O/hlUqdJur+2YRm7egbluim6NbtkajKzavgLmt F8eD1Zu34OttLjTbjPJbUBqFaXEtdUvxtLV8X/get6JWAPxfgJaz9QplbmRzdHJlYW0KZW5kb2Jq CgozNCAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0FzY2VudCA5MTcKL0NhcEhlaWdo dCA3ODEKL0Rlc2NlbnQgLTIxOQovRmxhZ3MgMzQKL0ZvbnRCQm94IFswIC0yMTkgMTM0MCA5MTdd Ci9JdGFsaWNBbmdsZSAwCi9TdGVtViAwCi9Gb250RmlsZTIgNTAgMCBSCi9Gb250TmFtZSAvU0tL T1VLK0dlb3JnaWEKPj4KZW5kb2JqCgozMiAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAv VHJ1ZVR5cGUKL0Jhc2VGb250IC9TS0tPVUsrR2VvcmdpYQovRW5jb2RpbmcgL1dpbkFuc2lFbmNv ZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3IgMzQgMCBSCi9X aWR0aHMgMzMgMCBSCj4+CmVuZG9iagoKNTEgMCBvYmoKPDwKL0xlbmd0aDEgMzE3NzIKL0xlbmd0 aCAxMTE3NwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtfQl4VEW28Km6t+/tvW8v 6T3p7nTSCelAICuBSG5IAmhkCZsJJpIAUVYhBBQUNIwiGFEZx30Dd9yGTghMQGbIqOOMC8K4zRsd BRXXeRHGx+Ca9DtV3UFwnPfe/33/+97//i9VOVWnqs69Vfdsdep2kgYCAEYYCQJsnTojL18ZtX4r 9ryC0DR/WfOKEVOP/xsAyQWg0+dftir4gP9PfwUQ2gGkmRevuGTZK2vr7wbQvYHtSy9ZuvZijbj9 LQClCiA0YmFL8wLjwoPZAKNW4f2KF2KHrcBUiO2nsJ2xcNmqNdct08/A9mGA8Naly+c3t6ZdKQHM agLw7l/WvGaFbaUxC2CFH+mDK5a3rYrnwO3YLuPtlS0rMt+afADbDQCG34AgbCZbQQNazd2aAly1 L1ELf4SLqU2roQZJpCyJRyEn3gtrKvEuOgSYObkyCCoEgx7N6wO1pEAeR7pUIPF4HECMaJ5hs4GI pZAEPzC+AXRjCzGyD0fvxHY6p6NYD4NcqILJMBOaYREsheWwGtbCdjJKUoMedl+kzD6DZj7SXAor z6SJf/hP8vz4w9/Hjt6XXMN/kgjyc5CQUIqC/DEBPpKo4ajBCGD5J/fJGkRGJqqSMwerYMLESeee V3M+wFSonY4SnH1BHfY3wP/lJPyA7vlPSN88A/9/VjqafeBB8GoeA48YATdA/BOET1k9sCj+KRtn Nf0ciXuSALADniaL4Gk4AM+SE3jVTtiLuvgHcOGK74V1cCtsAgnmYM/1MB2zBvtvJZ54N+TBA8jE B+Ag0l4AV8E+cBJ3/DO4GjYKr+NVG8GE/KmAaciTG8n58dUowyPiNSju85EDK0h7vC5+U/yW+MPw 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 Oi1uzIwOgtq0BN3dCbpMvB7pMliFdDodZHK6TJ2O04mE0XW2ZVRXdWZkcBpXENo4TZsreCbNS5lI k5nJaZzt8BKnecnZzmhi4ziJ348kaX5OQrzg5yR+4uUks38gyUuSXH+a5Ho+k0B+oPEnaExHB2lM R5Em+l9NLeOjUbJrbP38BvZlbE3h6haEptgNly10x9rnBYOd8+uT39IWaZo3fyGrm1ti9eGWqtj8 cFWwc2zDTww3sOGx4apOaKieWdfZoLZUdY1Vx1aHm6vqd02cVlhy1lzXn56rcNpP3Gwau1khm2ti yU8Ml7DhiWyuEjZXCZtrojqRzwVcx6fVdWphfH1lQ6LeRQ161NcmX6h+vFNZMY4r79iQ+yrfPoxW doAhWh8zhsfHTAhsaHjF8Ao2hDbFhszsG/eSQ+6rxoZ8+8iO5JCC3dbweIiuWt22GtzVi6oSP22Y sGvVasbwRBlt+2cJx6pjanNV2yqAmljOjJpYee2cuk5Zxt4m9kixMYN9BkN1T7w30TkCO8ewTkE4 Tcj6ylifTpck/Ef5r07W/H9ltdNndhE1jayCtnohllYzk6IrmJn8arN9GEux7aGtHh+wjURJ2+A9 ksuORpP/oRDYMw/CqtVJLMmLVck6cSVe0jbIktOJMSt6mmOr8Ibw75Fymv8KZW5kc3RyZWFtCmVu ZG9iagoKMzcgMCBvYmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Bc2NlbnQgOTA1Ci9DYXBI ZWlnaHQgNzg4Ci9EZXNjZW50IC0yMTIKL0ZsYWdzIDMyCi9Gb250QkJveCBbMCAtMjEyIDI2NjUg OTA1XQovSXRhbGljQW5nbGUgMAovU3RlbVYgMAovRm9udEZpbGUyIDUxIDAgUgovRm9udE5hbWUg L1NLS09VTCtBcmlhbE1UCj4+CmVuZG9iagoKMzUgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5 cGUgL1RydWVUeXBlCi9CYXNlRm9udCAvU0tLT1VMK0FyaWFsTVQKL0VuY29kaW5nIC9XaW5BbnNp RW5jb2RpbmcKL0ZpcnN0Q2hhciAwCi9MYXN0Q2hhciAyNTUKL0ZvbnREZXNjcmlwdG9yIDM3IDAg UgovV2lkdGhzIDM2IDAgUgo+PgplbmRvYmoKCjUyIDAgb2JqCjw8Ci9MZW5ndGgxIDQwMjI4Ci9M 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 Avsv20QbAmkm2rdk6UoKFy9PbxKXt6UvE9sC+yd3/5vmbto8WWzbj7rb53Xv75aWt2UmS5PbxcVt PUOzr6sf+Mazbjn7rPrr/k1n19HO6umzZg/8m+YB2jybPmuAPmuAPmu2NFt+1szzpuCZXd37VWgK /WMLMhwiWg1IS58n2DPFzvc3yaIzKei81nOYRfhxpE30pHXilLQeIm0qbylvoU0g0rTJANXGYpPz 2klBz2H8eLGJh2qTOAVtdLavaoN/G+DauPFyuIDGGzYURarQsDHRLrcDwkbIbZQvwIQ8jRvk2mL7 RnT511ciUcBFGxKt3fs7O9udq9rkP8ZO/e5EzwaUSBQemEggeCbMWnb07bKjr1XYa37T+afOzzuZ YdnDPwbxhOzhD4N3fwziCfDw/cxw07GmE03McOexzhOA+96x9068xwyXHys/Uc7UFUewQf6jjDDC r8PliQ2Xb5D/1JQ8W3nehV+O3ggZOuszZNggN2yUCQNXoV6+NQEdJc7envg6s6HQeLl8S6F2w9c8 DA20+42X/xv+LtaCCv5/ACYLVAUKZW5kc3RyZWFtCmVuZG9iagoKNDAgMCBvYmoKPDwKL1R5cGUg L0ZvbnREZXNjcmlwdG9yCi9Bc2NlbnQgODkxCi9DYXBIZWlnaHQgNzg0Ci9EZXNjZW50IC0yMTYK L0ZsYWdzIDM0Ci9Gb250QkJveCBbMCAtMjE2IDI1NTggODkxXQovSXRhbGljQW5nbGUgMAovU3Rl bVYgMAovRm9udEZpbGUyIDUyIDAgUgovRm9udE5hbWUgL1NLS09VTStUaW1lc05ld1JvbWFuUFMt Qm9sZE1UCj4+CmVuZG9iagoKMzggMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1RydWVU eXBlCi9CYXNlRm9udCAvU0tLT1VNK1RpbWVzTmV3Um9tYW5QUy1Cb2xkTVQKL0VuY29kaW5nIC9X aW5BbnNpRW5jb2RpbmcKL0ZpcnN0Q2hhciAwCi9MYXN0Q2hhciAyNTUKL0ZvbnREZXNjcmlwdG9y IDQwIDAgUgovV2lkdGhzIDM5IDAgUgo+PgplbmRvYmoKCjUgMCBvYmoKbnVsbAplbmRvYmoKCnhy ZWYKMCA1MwowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMTcxODggMDAwMDAgbiAKMDAwMDAwMDAx NSAwMDAwMCBuIAowMDAwMDE3MjE5IDAwMDAwIG4gCjAwMDAwNTgzNzQgMDAwMDAgbiAKMDAwMDE2 MDQzMiAwMDAwMCBuIAowMDAwMDU3OTc2IDAwMDAwIG4gCjAwMDAwMDAxNzcgMDAwMDAgbiAKMDAw MDAwMDM1MSAwMDAwMCBuIAowMDAwMDAwNTU0IDAwMDAwIG4gCjAwMDAwMDA3NTcgMDAwMDAgbiAK MDAwMDAwMDk2MSAwMDAwMCBuIAowMDAwMDAxMTY1IDAwMDAwIG4gCjAwMDAwMDEzNjkgMDAwMDAg biAKMDAwMDAwMTU3MyAwMDAwMCBuIAowMDAwMDAxNzc3IDAwMDAwIG4gCjAwMDAwNzQ1NzkgMDAw MDAgbiAKMDAwMDAwMTk4MCAwMDAwMCBuIAowMDAwMDc0MzgyIDAwMDAwIG4gCjAwMDAwOTA3NTYg MDAwMDAgbiAKMDAwMDAwMjk2NSAwMDAwMCBuIAowMDAwMDkwNTU5IDAwMDAwIG4gCjAwMDAwMDQw MDYgMDAwMDAgbiAKMDAwMDA5NjA3MSAwMDAwMCBuIAowMDAwMDA0MjE0IDAwMDAwIG4gCjAwMDAw OTU4NzUgMDAwMDAgbiAKMDAwMDEwMzMxNSAwMDAwMCBuIAowMDAwMDA1MDA5IDAwMDAwIG4gCjAw MDAxMDMxMTQgMDAwMDAgbiAKMDAwMDExOTQ1OSAwMDAwMCBuIAowMDAwMDA1NzEyIDAwMDAwIG4g CjAwMDAxMTkyNjcgMDAwMDAgbiAKMDAwMDEzMDQzOSAwMDAwMCBuIAowMDAwMDA2NTYzIDAwMDAw IG4gCjAwMDAxMzAyNDcgMDAwMDAgbiAKMDAwMDE0MjA3MSAwMDAwMCBuIAowMDAwMDA3NDU1IDAw MDAwIG4gCjAwMDAxNDE4NzkgMDAwMDAgbiAKMDAwMDE2MDI0NSAwMDAwMCBuIAowMDAwMDA4NDQw IDAwMDAwIG4gCjAwMDAxNjAwMzggMDAwMDAgbiAKMDAwMDAwOTQyNSAwMDAwMCBuIAowMDAwMDE0 NjE0IDAwMDAwIG4gCjAwMDAwMTUwNzUgMDAwMDAgbiAKMDAwMDAxNzI2OSAwMDAwMCBuIAowMDAw MDU4NDM0IDAwMDAwIG4gCjAwMDAwNzQ3NTYgMDAwMDAgbiAKMDAwMDA5MDkzMyAwMDAwMCBuIAow MDAwMDk2MjQ3IDAwMDAwIG4gCjAwMDAxMDM0OTYgMDAwMDAgbiAKMDAwMDExOTYzMSAwMDAwMCBu IAowMDAwMTMwNjExIDAwMDAwIG4gCjAwMDAxNDIyNDMgMDAwMDAgbiAKdHJhaWxlcgo8PAovU2l6 ZSA1MwovUm9vdCAzIDAgUgovSW5mbyAyIDAgUgovSURbPDQ1NzFjODE5MTk3YmU3YTM5Y2Q2ZTcw ZmM4YjM4MmVjPjw0NTcxYzgxOTE5N2JlN2EzOWNkNmU3MGZjOGIzODJlYz5dCj4+CnN0YXJ0eHJl ZgoxNjA0NTMKJSVFT0YK ------=_Part_1856260_2108899.1471458866944-- From reinhard.probst@t-online.de Wed Aug 17 18:17:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE,MISSING_MIMEOLE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 263917CA0 for ; Wed, 17 Aug 2016 18:17:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DB49F8F804C for ; Wed, 17 Aug 2016 16:17:14 -0700 (PDT) X-ASG-Debug-ID: 1471475831-0bf57b531315620001-NocioJ Received: from mailout08.t-online.de (mailout08.t-online.de [194.25.134.20]) by cuda.sgi.com with ESMTP id RXnKUNZjTXdRim8U (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 17 Aug 2016 16:17:12 -0700 (PDT) X-Barracuda-Envelope-From: reinhard.probst@t-online.de X-Barracuda-Effective-Source-IP: mailout08.t-online.de[194.25.134.20] X-Barracuda-Apparent-Source-IP: 194.25.134.20 Received: from fwd15.aul.t-online.de (fwd15.aul.t-online.de [172.20.27.63]) by mailout08.t-online.de (Postfix) with SMTP id DDFDC41DCAAA; Thu, 18 Aug 2016 01:17:10 +0200 (CEST) Received: from spica14.aul.t-online.de (b7eWL+ZJZhAiFNTSW62TYLsZQhHVt8AB8h+xbLvY2Ifyi6sA807nLlPSmAQ7h8lQOb@[172.20.102.135]) by fwd15.aul.t-online.de with esmtp id 1baA57-1Cw6L20; Thu, 18 Aug 2016 01:17:09 +0200 Received: from 197.242.117.87:58456 by cmpweb06.aul.t-online.de with HTTP/1.1 (Lisa V4-4-5-0.13555 on API V5-0-3-0) Received: from 172.20.102.128:14131 by spica14.aul.t-online.de:8080; Thu, 18 Aug 2016 01:17:09 +0200 (MEST) Date: Thu, 18 Aug 2016 01:17:09 +0200 (MEST) From: Adrianus Edem Sender: Adrianus Edem Reply-To: "adrianusedem5@hotmail.com" To: "adrianusedemm@hotmail.com" Message-ID: <1471475829589.2958459.dcc401ee31f465ad0b13d8df7eb5977a686c5345@spica.telekom.de> Subject: Ik wacht MIME-Version: 1.0 X-ASG-Orig-Subj: Ik wacht Content-Type: multipart/alternative; boundary="----=_Part_3327783_759138098.1471475829590" Importance: normal X-MSMail-Priority: normal X-Priority: 3 X-UMS: email X-ID: b7eWL+ZJZhAiFNTSW62TYLsZQhHVt8AB8h+xbLvY2Ifyi6sA807nLlPSmAQ7h8lQOb@t-dialin.net X-TOI-MSGID: a5c1113a-ecba-4ada-a906-a92c1b7247e3 X-Barracuda-Connect: mailout08.t-online.de[194.25.134.20] X-Barracuda-Start-Time: 1471475832 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2849 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.40 X-Barracuda-Spam-Status: No, SCORE=1.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, K2_MISSING_MIMEOLE, MISSING_MIMEOLE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32104 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 MISSING_MIMEOLE Message has X-MSMail-Priority, but no X-MimeOLE 1.19 K2_MISSING_MIMEOLE Message has X-MSMail-Priority, but no X-MimeOLE ------=_Part_3327783_759138098.1471475829590 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Beste vriend, Ik heb u eerder zonder een reactie per e-mail. Ik vertelde over mijn=20 overleden cli=C3=ABnt van wie familieleden ik kan niet in contact met komen= ,=20 jullie beiden hebben dezelfde achternaam dus het zal makkelijk te maken=20 word je zijn erfgenaam zijn. Als u ge=C3=AFnteresseerd bent laat het me weten zodat dat de documentatie = in uw=20 naam worden verwerkt. Gelieve te antwoorden zo spoedig mogelijk, zodat ik= =20 je Uitgebreide informatie kan geven. Gelieve herbevestigen hieronder uw gegevens in: Voornaam: Achternaam voornaam: Land Oorsprong: Met vriendelijke groet, Adrianus Edem =20 =EF=BB=BF ------=_Part_3327783_759138098.1471475829590 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

Ik heb u eerder zonder een reactie per e-mail. Ik vertelde over = mijn overleden cliënt van wie familieleden ik kan niet in contact met = komen, jullie beiden hebben dezelfde achternaam dus het zal makkelijk te ma= ken word je zijn erfgenaam zijn.

Als u geïnteresseerd bent laat het me weten zodat dat de do= cumentatie in uw naam worden verwerkt. Gelieve te antwoorden zo spoedig mog= elijk, zodat ik je Uitgebreide informatie kan geven.

Gelieve herbevestigen hieronder uw gegevens in:

Voornaam:
Achtern= aam voornaam:
Land Oorsprong= :

Met vriendelijke groet,
=
Adrianus Edem

 <= /p>=EF=BB=BF ------=_Part_3327783_759138098.1471475829590-- From umtgy@shris.com.cn Wed Aug 17 21:26:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=HTML_MESSAGE, HTML_OBFUSCATE_05_10,WEIRD_PORT autolearn=no version=3.3.1 X-Original-To: xfs@OSS.SGI.com Delivered-To: xfs@OSS.SGI.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 50BE97CA0 for ; Wed, 17 Aug 2016 21:26:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 20378304048 for ; Wed, 17 Aug 2016 19:26:28 -0700 (PDT) X-ASG-Debug-ID: 1471487117-0bf57c55b11abe0001-ps1ADW Received: from mailserver.SHRIS.local ([220.248.3.218]) by cuda.sgi.com with ESMTP id SIGDr4BwSneJ0opm for ; Wed, 17 Aug 2016 19:25:48 -0700 (PDT) X-Barracuda-Envelope-From: umtgy@shris.com.cn X-Barracuda-Effective-Source-IP: UNKNOWN[220.248.3.218] X-Barracuda-Apparent-Source-IP: 220.248.3.218 Received: from yahoo2.com.cn ([60.173.3.213]) by mailserver.SHRIS.local with Microsoft SMTPSVC(6.0.3790.4675); Thu, 18 Aug 2016 10:25:12 +0800 Reply-To: <86478@qq.com> Date: Thu, 18 Aug 2016 10:25:06 +0800 From: "Sercue" To: Subject: =?utf-8?B?6LSm5Y+35a+G56CB6L+H5pyf5o+Q6YaS44CC?= Message-ID: <20160818102513836762@shris.com.cn> X-ASG-Orig-Subj: =?utf-8?B?6LSm5Y+35a+G56CB6L+H5pyf5o+Q6YaS44CC?= X-mailer: Foxmail 6, 13, 102, 15 [cn] Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="=====003_Dragon308001324588_=====" X-OriginalArrivalTime: 18 Aug 2016 02:25:12.0426 (UTC) FILETIME=[BF8574A0:01D1F8F7] X-Barracuda-Connect: UNKNOWN[220.248.3.218] X-Barracuda-Start-Time: 1471487147 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3429 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.10 X-Barracuda-Spam-Status: No, SCORE=1.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0113c, BSF_SC5_MJ1963, HTML_MESSAGE, HTML_OBFUSCATE_05_10, RDNS_NONE, WEIRD_PORT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32109 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.50 WEIRD_PORT URI: Uses non-standard port number for HTTP 0.00 HTML_OBFUSCATE_05_10 BODY: Message is 5% to 10% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. --=====003_Dragon308001324588_===== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 eGZzQE9TUy5TR0kuY29tLOaCqOWlve+8geivt+azqOaEj+Wvhueggei/h+acn+eahOeUqOaIt+WQ jeOAgg0K5oKo55qE5Z+f6LSm5Y+35a+55bqU55qE5a+G56CB5bey57uP6L+H5pyfIDMg5aSp5LqG 6K+35rOo5oSP44CC5Li65LqG5LiN5b2x5ZON5oKo55qE55m75b2V5Lul5Y+K5L2/55So55u45YWz 5bqU55So57O757uf77yM6YC+5pyf5LiN5pu05pS557O757uf5bCG5Zue5pS2LOivt+WwveW/q+S/ ruaUueWvhuegge+8jOiwouiwouaCqOeahOeQhuino+WSjOmFjeWQiO+8mueCueatpOeri+WNs+ab tOaWsOWvhueggTpodHRwOi8vcHpxa2JoLnJhY2luZzoxMDAxDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIA== --=====003_Dragon308001324588_===== Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjYwMDEuMTg3MDIiPjwvSEVBRD4NCjxCT0RZPjxTUEFOIHN0eWxlPSJG T05ULVNJWkU6IDEzcHgiIGNsYXNzPVNUWUxFMTA+PFNUUk9ORz4NCjxQIA0Kc3R5bGU9IlRFWFQt VFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhU LUlOREVOVDogMHB4OyBGT05UOiAxNHB4IOW+rui9r+mbhem7kTsgV0hJVEUtU1BBQ0U6IG5vcm1h bDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lO RzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9U1RZTEUyPjxT UEFOIHN0eWxlPSJGT05ULVNJWkU6IDEzcHgiIGNsYXNzPVNUWUxFMTA+PEZPTlQgDQpzaXplPTM+ PFNUUk9ORz54ZnNAT1NTLlNHSS5jb20sPC9TVFJPTkc+5oKo5aW977yBPEZPTlQgY29sb3I9ZGFy a3JlZCANCnNpemU9Mj7or7fms6jmhI/lr4bnoIHov4fmnJ/nmoTnlKjmiLflkI08L0ZPTlQ+44CC PC9GT05UPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgQkFD S0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgRk9OVDog MTRweCDlvq7ova/pm4Xpu5E7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBu b3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0 LXN0cm9rZS13aWR0aDogMHB4IiANCmNsYXNzPVNUWUxFMj48U1BBTiBzdHlsZT0iRk9OVC1TSVpF OiAxM3B4IiBjbGFzcz1TVFlMRTEwPjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEz cHgiIGNsYXNzPVNUWUxFMTA+5oKo55qE5Z+f6LSm5Y+35a+55bqU55qE5a+G56CB5bey57uP6L+H 5pyfPC9TUEFOPjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BB Tj48U1BBTiANCnN0eWxlPSJDT0xPUjogcmdiKDI1NSw1MSwwKTsgRk9OVC1TSVpFOiB4LWxhcmdl OyBGT05ULVdFSUdIVDogYm9sZCIgDQpjbGFzcz1zdHlsZTE+MzwvU1BBTj48U1BBTiBzdHlsZT0i Rk9OVC1TSVpFOiAxM3B4IiBjbGFzcz1TVFlMRTEwPjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVy dGVkLXNwYWNlPiZuYnNwOzwvU1BBTj7lpKnkuobor7fms6jmhI/jgILkuLrkuobkuI3lvbHlk43m gqjnmoTnmbvlvZXku6Xlj4rkvb/nlKjnm7jlhbPlupTnlKjns7vnu5/vvIw8U1BBTiANCnN0eWxl PSJDT0xPUjogcmdiKDI1NSw1MSwwKTsgRk9OVC1TSVpFOiB4LWxhcmdlOyBGT05ULVdFSUdIVDog Ym9sZCIgDQpjbGFzcz1zdHlsZTE+PEZPTlQgDQpzaXplPTM+6YC+5pyf5LiN5pu05pS557O757uf 5bCG5Zue5pS2LDwvRk9OVD48L1NQQU4+6K+35bC95b+r5L+u5pS55a+G56CB77yM6LCi6LCi5oKo 55qE55CG6Kej5ZKM6YWN5ZCI77yaPC9TUEFOPjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVk LXNwYWNlPueCueatpOeri+WNs+abtOaWsOWvhueggTo8QSANCmhyZWY9Imh0dHA6Ly9wenFrYmgu cmFjaW5nOjEwMDEiPmh0dHA6Ly9wenFrYmgucmFjaW5nOjEwMDE8L0E+PC9TUEFOPjxCUj4mbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1A+DQo8UCANCnN0eWxlPSJURVhULVRSQU5TRk9S TTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6 IDBweDsgRk9OVDogMTRweCDlvq7ova/pm4Xpu5E7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRF Ui1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsg LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4IiANCmNsYXNzPVNUWUxFMj48L1NUUk9ORz48 L1NQQU4+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9QPjwvQk9EWT48L0hU TUw+DQo= --=====003_Dragon308001324588_=====-- From Sales.46@besttop.com Thu Aug 18 03:02:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C70717CA0 for ; Thu, 18 Aug 2016 03:02:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96FA88F8037 for ; Thu, 18 Aug 2016 01:02:48 -0700 (PDT) X-ASG-Debug-ID: 1471507297-0bf57c55b424330001-NocioJ Received: from besttop.com ([218.87.48.206]) by cuda.sgi.com with SMTP id kOWgbgABbSnny4Gr for ; Thu, 18 Aug 2016 01:02:07 -0700 (PDT) X-Barracuda-Envelope-From: Sales.46@besttop.com X-Barracuda-Effective-Source-IP: UNKNOWN[218.87.48.206] X-Barracuda-Apparent-Source-IP: 218.87.48.206 Sender: Sales.46@besttop.com Received: from tina-PC[127.0.0.1] by TINA-PC[127.0.0.1] (SMTPD32); Thu, 18 Aug 2016 16:01:34 +0800 From: "sales007@montarycompany.com" Subject: Re: floor tile polished tile To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: floor tile polished tile MIME-Version: 1.0 Reply-To: sales007@montarycompany.com Date: Thu, 18 Aug 2016 16:01:34 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[218.87.48.206] X-Barracuda-Start-Time: 1471507327 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9969 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160818080248.380F81940060@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTEuMDAuOTYwMC4xNzA0MSI+PC9IRUFEPg0KPEJPRFk+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLW1h cmdpbi10b3AtYWx0OiBhdXRvOyBtc28tbWFyZ2luLWJvdHRvbS1hbHQ6IGF1dG87IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIDEycHQ7 IEZPTlQtRkFNSUxZOiA/QXJpYWw/LD9zYW5zLXNlcmlmPzsgDQptc28tZmFyZWFzdC1mb250LWZh bWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48Rk9OVCBmYWNlPUFyaWFs PkRlYXIgDQo8L0ZPTlQ+PEEgbmFtZT1PTEVfTElOSzI+PC9BPjxBIG5hbWU9T0xFX0xJTksxPjxT UEFOIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksyIj48U1BBTiBzdHlsZT0iQ09MT1I6 IGJsYWNrIj48Rk9OVCANCmZhY2U9QXJpYWw+bWFuYWdlciw8L0ZPTlQ+PC9TUEFOPjwvU1BBTj48 L0E+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksxIj48L1NQQU4+ PFNQQU4gDQpzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzIiPjxTUEFOIGxhbmc9RU4tVVMg DQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog5a6L5L2TOyBtc28tZm9udC1r ZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiPjxvOnA+PC9vOnA+PC9T UEFOPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjog bGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLW1hcmdpbi10b3AtYWx0OiBhdXRvOyBtc28t bWFyZ2luLWJvdHRvbS1hbHQ6IGF1dG87IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0K YWxpZ249bGVmdD48Rk9OVCBmYWNlPUFyaWFsPjxTUEFOIHN0eWxlPSJtc28tYm9va21hcms6IE9M RV9MSU5LMiI+PFNQQU4gDQpsYW5nPUVOLVVTIDEycHQ7IEZPTlQtRkFNSUxZOiA/QXJpYWw/LD9z YW5zLXNlcmlmPzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IA0KQ09MT1I6IGJsYWNrOyDlrovk vZMmIzM5Oz5Hb29kIGRheSE8L1NQQU4+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9Im1zby1ib29rbWFy azogT0xFX0xJTksyIj48U1BBTiBsYW5nPUVOLVVTID9BcmlhbD8sP3NhbnMtc2VyaWY/OyANCm1z by1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IENPTE9SOiBibGFjazsgbXNvLWJpZGktZm9u dC1zaXplOiANCjEwLjVwdCYjMzk7PjxvOnA+PC9vOnA+PC9TUEFOPjwvU1BBTj48L0ZPTlQ+PC9Q Pg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjog MGNtIDBjbSAwcHQ7IG1zby1tYXJnaW4tdG9wLWFsdDogYXV0bzsgbXNvLW1hcmdpbi1ib3R0b20t YWx0OiBhdXRvOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PEZP TlQgZmFjZT1BcmlhbD48U1BBTiBzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzIiPjxTUEFO IA0KbGFuZz1FTi1VUyAxMnB0OyBGT05ULUZBTUlMWTogP0FyaWFsPyw/c2Fucy1zZXJpZj87IG1z by1mYXJlYXN0LWZvbnQtZmFtaWx5OiANCkNPTE9SOiBibGFjazsg5a6L5L2TJiMzOTs+V2UgYXJl IHRoZSBwcm9mZXNzaW9uYWwgY29tcGFueSBvZiBhcnRpZmljaWFsIA0Kc3RvbmUuPC9TUEFOPjwv U1BBTj48U1BBTiBzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzIiPjxTUEFOIGxhbmc9RU4t VVMgDQo/QXJpYWw/LD9zYW5zLXNlcmlmPzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9 kzsgQ09MT1I6IGJsYWNrOyANCm1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0JiMzOTs+PG86cD48 L286cD48L1NQQU4+PC9TUEFOPjwvRk9OVD48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLW1hcmdpbi10b3At YWx0OiBhdXRvOyBtc28tbWFyZ2luLWJvdHRvbS1hbHQ6IGF1dG87IG1zby1wYWdpbmF0aW9uOiB3 aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48Rk9OVCBmYWNlPUFyaWFsPjxTUEFOIHN0eWxlPSJt c28tYm9va21hcms6IE9MRV9MSU5LMiI+PFNQQU4gDQpsYW5nPUVOLVVTIDEycHQ7IEZPTlQtRkFN SUxZOiA/QXJpYWw/LD9zYW5zLXNlcmlmPzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IA0KQ09M T1I6IGJsYWNrOyDlrovkvZMmIzM5Oz5PdXIgbmV3IEUtY2F0YWxvZ3VlIHdpbGwgYmUgc2VudCB0 byB5b3UsaWYgeW91IGFyZSANCmludGVyZXN0aW5nLjwvU1BBTj48L1NQQU4+PFNQQU4gc3R5bGU9 Im1zby1ib29rbWFyazogT0xFX0xJTksyIj48U1BBTiBsYW5nPUVOLVVTIA0KP0FyaWFsPyw/c2Fu cy1zZXJpZj87IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IENPTE9SOiBibGFjazsg DQptc28tYmlkaS1mb250LXNpemU6IDEwLjVwdCYjMzk7PjxvOnA+PC9vOnA+PC9TUEFOPjwvU1BB Tj48L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxl ZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1tYXJnaW4tdG9wLWFsdDogYXV0bzsgbXNvLW1h cmdpbi1ib3R0b20tYWx0OiBhdXRvOyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFs aWduPWxlZnQ+PFNQQU4gc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksyIj48U1BBTiBsYW5n PUVOLVVTIDEycHQ7IA0KRk9OVC1GQU1JTFk6ID9BcmlhbD8sP3NhbnMtc2VyaWY/OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTogQ09MT1I6IGJsYWNrOyANCuWui+S9kyYjMzk7PjxGT05UIGZhY2U9 QXJpYWw+VGhhbmtzIGZvciB5b3VyIHZhbHVhYmxlIHRpbWUuPC9GT05UPiANCjxESVY+PEEgaHJl Zj0iIyIgDQp4ZnMmbmJzcDsyMDE2LTA4LTE4IDE2OjAxOjM0OzUyN0U0NUY2LTBFNzctNEIwNi04 NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjREOTY7NTI3 RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0NUY2LTBFNzctNEIwNi04NDlE LTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjREOTY7NTI3RTQ1 RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2PjxTUEFOIA0Kc3R5bGU9IlZJU0lCSUxJVFk6 IGhpZGRlbiI+PEZPTlQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+ PEEgaHJlZj0iIyIgDQp4ZnMmbmJzcDsyMDE2LTA4LTE4IDE2OjAxOjM0OzUyN0U0NUY2LTBFNzct NEIwNi04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjRE OTY7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0NUY2LTBFNzctNEIw Ni04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjREOTY7 NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2PjxTUEFOIA0Kc3R5bGU9IlZJU0lC SUxJVFk6IGhpZGRlbiI+PC9TUEFOPjwvQT48L0RJVj48RElWPjxBIGhyZWY9IiMiIHhmcyZuYnNw OzIwMTYtMDgtMTggMTY6MDE6MzQ7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2 OzUyN0U0NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYt ODQ5RC01QkVCRTkyNjREOTY7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUy N0U0NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5 RC01QkVCRTkyNjREOTY+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PC9TUEFOPjwv QT48L0RJVj48QlI+DQo8RElWPjxBIGhyZWY9IiMiIA0KeGZzJm5ic3A7MjAxNi0wOC0xOCAxNjow MTozNDs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjREOTY7NTI3RTQ1RjYtMEU3Ny00 QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2NEQ5 Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjREOTY7NTI3RTQ1RjYtMEU3Ny00QjA2 LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2NEQ5Nj48 U1BBTiANCnN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIGZhY2U9QXJpYWw+PC9GT05U PjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9IiMiIA0KeGZzJm5ic3A7MjAxNi0wOC0x OCAxNjowMTozNDs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjREOTY7NTI3RTQ1RjYt MEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0NUY2LTBFNzctNEIwNi04NDlELTVCRUJF OTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjREOTY7NTI3RTQ1RjYtMEU3 Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2 NEQ5Nj48U1BBTiANCnN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjwvU1BBTj48L0E+PC9ESVY+ PERJVj48QSBocmVmPSIjIiB4ZnMmbmJzcDsyMDE2LTA4LTE4IDE2OjAxOjM0OzUyN0U0NUY2LTBF NzctNEIwNi04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTky NjREOTY7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0NUY2LTBFNzct NEIwNi04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01QkVCRTkyNjRE OTY7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2PjxTUEFOIHN0eWxlPSJWSVNJ QklMSVRZOiBoaWRkZW4iPjwvU1BBTj48L0E+PC9ESVY+PEJSPjxGT05UIGZhY2U9QXJpYWw+QmVz dCANClJlZ2FyZHMsPG86cD48L286cD48L0ZPTlQ+PC9TUEFOPjwvU1BBTj4gDQo8RElWPjxBIGhy ZWY9IiMiIA0KeGZzJm5ic3A7MjAxNi0wOC0xOCAxNjowMTozNDs1MjdFNDVGNi0wRTc3LTRCMDYt ODQ5RC01QkVCRTkyNjREOTY7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUy N0U0NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5 RC01QkVCRTkyNjREOTY7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0 NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2NEQ5Nj48U1BBTiANCnN0eWxlPSJWSVNJQklMSVRZ OiBoaWRkZW4iPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9IiMiIHhmcyZuYnNwOzIw MTYtMDgtMTggMTY6MDE6MzQ7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUy N0U0NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5 RC01QkVCRTkyNjREOTY7NTI3RTQ1RjYtMEU3Ny00QjA2LTg0OUQtNUJFQkU5MjY0RDk2OzUyN0U0 NUY2LTBFNzctNEIwNi04NDlELTVCRUJFOTI2NEQ5Njs1MjdFNDVGNi0wRTc3LTRCMDYtODQ5RC01 QkVCRTkyNjREOTY+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PC9TUEFOPjwvQT48 L0RJVj48UD48Rk9OVCBmYWNlPUFyaWFsPjwvRk9OVD48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwg DQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2lu YXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIHN0eWxlPSJtc28tYm9va21h cms6IE9MRV9MSU5LMiI+PFNQQU4gbGFuZz1FTi1VUyAxMnB0OyANCkZPTlQtRkFNSUxZOiA/QXJp YWw/LD9zYW5zLXNlcmlmPzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IENPTE9SOiBibGFjazsg DQrlrovkvZMmIzM5Oz48bzpwPjxGT05UIGZhY2U9QXJpYWw+Jm5ic3A7PC9GT05UPjwvbzpwPjwv U1BBTj48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046 IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4i IA0KYWxpZ249bGVmdD48Rk9OVCBmYWNlPUFyaWFsPjxGT05UIGNvbG9yPSMwMDAwZmY+PFNQQU4g DQpzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzIiPjxTUEFOIGxhbmc9RU4tVVMgMTJwdDsg Rk9OVC1GQU1JTFk6IA0KP0FyaWFsPyw/c2Fucy1zZXJpZj87IG1zby1mYXJlYXN0LWZvbnQtZmFt aWx5OiBDT0xPUjog5a6L5L2TJiMzOTsgDQpibHVlOz5UaW5hPC9TUEFOPjwvU1BBTj48U1BBTiBz dHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzIiPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0i Rk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog5a6L5L2TOyBDT0xPUjogYmx1ZTsgbXNvLWJp ZGktZm9udC1mYW1pbHk6IOWui+S9kyI+Jm5ic3A7PC9TUEFOPjwvU1BBTj48U1BBTiANCnN0eWxl PSJtc28tYm9va21hcms6IE9MRV9MSU5LMiI+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05U LVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiDlrovkvZM7IENPTE9SOiBibGFjazsgbXNvLWJpZGkt Zm9udC1mYW1pbHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+PC9TUEFOPjwvRk9OVD48L0ZP TlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1B UkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249 bGVmdD48U1BBTiBzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzIiPjxTUEFOIGxhbmc9RU4t VVMgMTJwdDsgDQpGT05ULUZBTUlMWTogP0FyaWFsPyw/c2Fucy1zZXJpZj87IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiBDT0xPUjogYmxhY2s7IA0K5a6L5L2TJiMzOTs+PG86cD48Rk9OVCBjb2xv cj0jMDAwMGZmIA0KZmFjZT1BcmlhbD4mbmJzcDs8L0ZPTlQ+PC9vOnA+PC9TUEFOPjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lO OiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0 PjxTUEFOIHN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMiI+PFNQQU4gbGFuZz1FTi1VUyAx MnB0OyANCkZPTlQtRkFNSUxZOiA/QXJpYWw/LD9zYW5zLXNlcmlmPzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IENPTE9SOiDlrovkvZMmIzM5OyANCmJsdWU7PjxGT05UIGZhY2U9QXJpYWw+PEZP TlQgY29sb3I9IzAwMDBmZj5OQU4gQ0hBTkcgTU9OVEFSWSBJTkRVU1RSSUFMIA0KQ08uLExURDxv OnA+PC9vOnA+PC9GT05UPjwvRk9OVD48L1NQQU4+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05v cm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gc3R5bGU9Im1zby1i b29rbWFyazogT0xFX0xJTksyIj48U1BBTiBsYW5nPUVOLVVTIDEycHQ7IA0KRk9OVC1GQU1JTFk6 ID9BcmlhbD8sP3NhbnMtc2VyaWY/OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogQ09MT1I6IOWu i+S9kyYjMzk7IA0KYmx1ZTs+PEZPTlQgZmFjZT1BcmlhbD48Rk9OVCBjb2xvcj0jMDAwMGZmPlRl bCBsaW5lMTowMDg2LTc5MS04ODg1NzE5NjxTUEFOIA0Kc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVz Ij4mbmJzcDsmbmJzcDsmbmJzcDsgDQo8L1NQQU4+PG86cD48L286cD48L0ZPTlQ+PC9GT05UPjwv U1BBTj48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046 IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4i IA0KYWxpZ249bGVmdD48Rk9OVCBmYWNlPUFyaWFsPjxGT05UIGNvbG9yPSMwMDAwZmY+PFNQQU4g DQpzdHlsZT0ibXNvLWJvb2ttYXJrOiBPTEVfTElOSzIiPjxTUEFOIGxhbmc9RU4tVVMgMTJwdDsg Rk9OVC1GQU1JTFk6IA0KP0FyaWFsPyw/c2Fucy1zZXJpZj87IG1zby1mYXJlYXN0LWZvbnQtZmFt aWx5OiBDT0xPUjog5a6L5L2TJiMzOTsgYmx1ZTs+VGVsIGxpbmUyOiANCjAwODYtNzkxLTg4ODU3 MTE2IDwvU1BBTj48L1NQQU4+PFNQQU4gc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksyIj48 U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog 5a6L5L2TOyBDT0xPUjogYmxhY2s7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiPjxvOnA+ PC9vOnA+PC9TUEFOPjwvU1BBTj48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1h bCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFn aW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gc3R5bGU9Im1zby1ib29r bWFyazogT0xFX0xJTksyIj48U1BBTiBsYW5nPUVOLVVTIDEycHQ7IA0KRk9OVC1GQU1JTFk6ID9B cmlhbD8sP3NhbnMtc2VyaWY/OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogQ09MT1I6IOWui+S9 kyYjMzk7IA0KYmx1ZTs+PEZPTlQgZmFjZT1BcmlhbD48Rk9OVCBjb2xvcj0jMDAwMGZmPkZheDog DQo4Ni03OTEtODg4NTcxMDk8bzpwPjwvbzpwPjwvRk9OVD48L0ZPTlQ+PC9TUEFOPjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lO OiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0 PjxGT05UIGZhY2U9QXJpYWw+PEZPTlQgY29sb3I9IzAwMDBmZj48U1BBTiANCnN0eWxlPSJtc28t Ym9va21hcms6IE9MRV9MSU5LMiI+PFNQQU4gbGFuZz1FTi1VUyAxMnB0OyBGT05ULUZBTUlMWTog DQo/QXJpYWw/LD9zYW5zLXNlcmlmPzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IENPTE9SOiDl rovkvZMmIzM5OyANCmJsdWU7PlNreXBlOm1vbnRhcnlzZWxsMDc8L1NQQU4+PC9TUEFOPjxTUEFO IA0Kc3R5bGU9Im1zby1ib29rbWFyazogT0xFX0xJTksyIj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgQ09MT1I6IGJsYWNrOyBt c28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TIj48bzpwPjwvbzpwPjwvU1BBTj48L1NQQU4+PC9G T05UPjwvRk9OVD48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjog bGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIg DQphbGlnbj1sZWZ0PjxTUEFOIHN0eWxlPSJtc28tYm9va21hcms6IE9MRV9MSU5LMiI+PFNQQU4g bGFuZz1FTi1VUyAxMnB0OyANCkZPTlQtRkFNSUxZOiA/QXJpYWw/LD9zYW5zLXNlcmlmPzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IENPTE9SOiDlrovkvZMmIzM5OyANCmJsdWU7PjxGT05UIGZh Y2U9QXJpYWw+PEZPTlQgDQpjb2xvcj0jMDAwMGZmPjxvOnA+PC9vOnA+PC9GT05UPjwvRk9OVD48 L1NQQU4+PC9TUEFOPiZuYnNwOzwvUD48U1BBTiANCnN0eWxlPSJtc28tYm9va21hcms6IE9MRV9M SU5LMiI+PC9TUEFOPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20g MHB0Ij48U1BBTiBsYW5nPUVOLVVTPjxvOnA+PEZPTlQgDQpjb2xvcj0jMDAwMGZmIGZhY2U9QXJp YWw+Jm5ic3A7PC9GT05UPjwvbzpwPjwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From Sales.47@besttop.com Thu Aug 18 03:02:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C204E7CAF for ; Thu, 18 Aug 2016 03:02:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D5EEAC001 for ; Thu, 18 Aug 2016 01:02:50 -0700 (PDT) X-ASG-Debug-ID: 1471507298-0bf57c55b324330001-NocioJ Received: from besttop.com ([218.87.48.206]) by cuda.sgi.com with SMTP id 1iHC69qVdfxz6wy5 for ; Thu, 18 Aug 2016 01:02:09 -0700 (PDT) X-Barracuda-Envelope-From: Sales.47@besttop.com X-Barracuda-Effective-Source-IP: UNKNOWN[218.87.48.206] X-Barracuda-Apparent-Source-IP: 218.87.48.206 Sender: Sales.47@besttop.com Received: from tina-PC[127.0.0.1] by TINA-PC[127.0.0.1] (SMTPD32); Thu, 18 Aug 2016 16:01:35 +0800 From: "sales007@montarycompany.com" Subject: Re: Artifical stone countertop2016-08-18 16:01:35 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Artifical stone countertop2016-08-18 16:01:35 MIME-Version: 1.0 Reply-To: sales007@montarycompany.com Date: Thu, 18 Aug 2016 16:01:35 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[218.87.48.206] X-Barracuda-Start-Time: 1471507328 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10270 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.24 X-Barracuda-Spam-Status: No, SCORE=1.24 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HOTEL, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.50 HOTEL BODY: hotel 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160818080250.763C41940062@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTEuMDAuOTYwMC4xODEyNSI+PC9IRUFEPg0KPEJPRFk+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxGT05UIGZhY2U9QXJpYWw+PFNQ QU4gbGFuZz1FTi1VUyAxMnB0OyBGT05ULUZBTUlMWTogDQo/QXJpYWw/LD9zYW5zLXNlcmlmPzsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogDQowcHQm IzM5Oz5EZWFyIE1hbmFnZXIsPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1T SVpFOiAxMnB0OyBGT05ULUZBTUlMWTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1z by1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiPjxvOnA+PC9vOnA+PC9TUEFOPjwvRk9OVD48L1A+ DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAw Y20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxT UEFOIGxhbmc9RU4tVVMgMTJwdDsgRk9OVC1GQU1JTFk6ID9BcmlhbD8sP3NhbnMtc2VyaWY/OyAN Cm1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYj Mzk7PjxvOnA+PEZPTlQgDQpmYWNlPUFyaWFsPiZuYnNwOzwvRk9OVD48L286cD48L1NQQU4+PC9Q Pg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjog MGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48 Rk9OVCBmYWNlPUFyaWFsPjxTUEFOIGxhbmc9RU4tVVMgMTJwdDsgRk9OVC1GQU1JTFk6IA0KP0Fy aWFsPyw/c2Fucy1zZXJpZj87IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1m b250LWtlcm5pbmc6IDBwdCYjMzk7PndlIA0KYXJlIGEgbGVhZGluZyBDaGluZXNlIG1hbnVmYWN0 dXJlciBmb3ImbmJzcDtxdWFydHogc3RvbmUgYW5kIGNvdW50ZXIgdG9wLHRoZSANCkhJTFRPTiBI T1RFTCBpcyBvdXIgY3VzdG9tZXIuIDwvU1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZP TlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0 OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TIj4mbmJzcDs8bzpwPjwvbzpwPjwvU1BBTj48 L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7 IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxp Z249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1G QU1JTFk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWls eTog5a6L5L2TIj48Rk9OVCANCmZhY2U9QXJpYWw+Jm5ic3A7PG86cD48L286cD48L0ZPTlQ+PC9T UEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBN QVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWdu PWxlZnQ+PEZPTlQgZmFjZT1BcmlhbD48U1BBTiBsYW5nPUVOLVVTIDEycHQ7IEZPTlQtRkFNSUxZ OiANCj9BcmlhbD8sP3NhbnMtc2VyaWY/OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz5XZSANCmNhbiZuYnNwO3N1cHBseSB5b3UmbmJz cDtwcm9kdWN0cyB3aXRoIGdvb2QgcXVhbGl0eSBhbmQmbmJzcDtjb21wZXRpdGl2ZSANCnByaWNl LjwvU1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1G QU1JTFk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWls eTog5a6L5L2TIj48bzpwPjwvbzpwPjwvU1BBTj48L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1w YWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIDEy cHQ7IEZPTlQtRkFNSUxZOiA/QXJpYWw/LD9zYW5zLXNlcmlmPzsgDQptc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpwPjxGT05UIA0K ZmFjZT1BcmlhbD4mbmJzcDs8L0ZPTlQ+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05v cm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PEZPTlQgZmFjZT1BcmlhbD48 U1BBTiBsYW5nPUVOLVVTIDEycHQ7IEZPTlQtRkFNSUxZOiANCj9BcmlhbD8sP3NhbnMtc2VyaWY/ OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiANCjBw dCYjMzk7PlNhbXBsZXMmbmJzcDtjYW4gYmUgc2VudCB0byB5b3UgYXMgeW91ciByZXF1ZXN0Ljwv U1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1J TFk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog 5a6L5L2TIj48bzpwPjwvbzpwPjwvU1BBTj48L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFs IA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgbXNvLWZvbnQta2Vybmlu ZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TIj48Rk9OVCANCmZhY2U9QXJpYWw+ Jm5ic3A7PG86cD48L286cD48L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCAN CnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5h dGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PEZPTlQgZmFjZT1BcmlhbD48U1BBTiBs YW5nPUVOLVVTIDEycHQ7IEZPTlQtRkFNSUxZOiANCj9BcmlhbD8sP3NhbnMtc2VyaWY/OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiANCjBwdCYjMzk7 PkxldCYjMzk7cyB0YWxrIG1vcmUgaWYgeW91IGhhdmUgaW50ZXJlc3RzLjwvU1BBTj48U1BBTiBs YW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TIj48bzpw PjwvbzpwPjwvU1BBTj48L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRF WFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRv dy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIDEycHQ7IEZPTlQtRkFNSUxZ OiA/QXJpYWw/LD9zYW5zLXNlcmlmPzsgDQptc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpwPjxGT05UIA0KZmFjZT1BcmlhbD4mbmJz cDs8L0ZPTlQ+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJU RVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lk b3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PEZPTlQgZmFjZT1BcmlhbD48U1BBTiBsYW5nPUVOLVVT IDEycHQ7IEZPTlQtRkFNSUxZOiANCj9BcmlhbD8sP3NhbnMtc2VyaWY/OyBtc28tZmFyZWFzdC1m b250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiANCjBwdCYjMzk7PkJlc3QgUmVn YXJkcyw8L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZP TlQtRkFNSUxZOiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC1m YW1pbHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+PC9GT05UPjwvUD4NCjxQIGNsYXNzPU1z b05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBt c28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1V UyAxMnB0OyBGT05ULUZBTUlMWTogP0FyaWFsPyw/c2Fucy1zZXJpZj87IA0KbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+PG86cD48Rk9O VCANCmZhY2U9QXJpYWw+Jm5ic3A7PC9GT05UPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1N c29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsg bXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4t VVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog5a6L5L2TOyBtc28tZm9u dC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiPjxGT05UIA0KZmFj ZT1BcmlhbD4mbmJzcDs8bzpwPjwvbzpwPjwvRk9OVD48L1NQQU4+PC9QPjxTUEFOIGxhbmc9RU4t VVMgMTJwdDsgDQpGT05ULUZBTUlMWTogP0FyaWFsPyw/c2Fucy1zZXJpZj87IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IA0KbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTsgQ09MT1I6 IGJsdWU7Pg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1B UkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249 bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1J TFk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTog 5a6L5L2TIj48Rk9OVCANCmZhY2U9QXJpYWw+Jm5ic3A7PG86cD48L286cD48L0ZPTlQ+PC9TUEFO PjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJH SU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxl ZnQ+PEZPTlQgZmFjZT1BcmlhbD48Rk9OVCBjb2xvcj0jMDAwMGZmPjxTUEFOIGxhbmc9RU4tVVMg MTJwdDsgDQpGT05ULUZBTUlMWTogP0FyaWFsPyw/c2Fucy1zZXJpZj87IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiBtc28tZm9udC1rZXJuaW5nOiANCkNPTE9SOiBibHVlOyDlrovkvZMmIzM5OyAw cHQ7PlRpbmE8L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7 IEZPTlQtRkFNSUxZOiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9u dC1mYW1pbHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+PC9GT05UPjwvRk9OVD48L1A+DQo8 UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20g MGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFO IGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiDlrovkvZMiPjxG T05UIA0KZmFjZT1BcmlhbD48Rk9OVCBjb2xvcj0jMDAwMGZmPiZuYnNwOzxvOnA+PC9vOnA+PC9G T05UPjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQt QUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1v cnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIDEycHQ7IEZPTlQtRkFNSUxZOiA/ QXJpYWw/LD9zYW5zLXNlcmlmPzsgDQptc28tZmFyZWFzdC1mb250LWZhbWlseTogbXNvLWZvbnQt a2VybmluZzogQ09MT1I6IGJsdWU7IOWui+S9kyYjMzk7IDBwdDs+PEZPTlQgDQpmYWNlPUFyaWFs PjxGT05UIGNvbG9yPSMwMDAwZmY+TkFOIENIQU5HIE1PTlRBUlkgSU5EVVNUUklBTCANCkNPLixM VEQ8bzpwPjwvbzpwPjwvRk9OVD48L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1h bCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFn aW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyAxMnB0 OyBGT05ULUZBTUlMWTogP0FyaWFsPyw/c2Fucy1zZXJpZj87IA0KbXNvLWZhcmVhc3QtZm9udC1m YW1pbHk6IG1zby1mb250LWtlcm5pbmc6IENPTE9SOiBibHVlOyDlrovkvZMmIzM5OyAwcHQ7PjxG T05UIA0KZmFjZT1BcmlhbD48Rk9OVCBjb2xvcj0jMDAwMGZmPlRlbCBsaW5lMTowMDg2LTc5MS04 ODg1NzE5NjxTUEFOIA0Kc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4mbmJzcDsmbmJzcDsmbmJz cDsgDQo8L1NQQU4+PG86cD48L286cD48L0ZPTlQ+PC9GT05UPjwvU1BBTj48L1A+DQo8UCBjbGFz cz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBw dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxGT05UIGZhY2U9 QXJpYWw+PEZPTlQgY29sb3I9IzAwMDBmZj48U1BBTiBsYW5nPUVOLVVTIDEycHQ7IA0KRk9OVC1G QU1JTFk6ID9BcmlhbD8sP3NhbnMtc2VyaWY/OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogbXNv LWZvbnQta2VybmluZzogDQpDT0xPUjogYmx1ZTsg5a6L5L2TJiMzOTsgMHB0Oz5UZWwgbGluZTI6 IDAwODYtNzkxLTg4ODU3MTE2IDwvU1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQt U0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0OyBt c28tYmlkaS1mb250LWZhbWlseTog5a6L5L2TIj48bzpwPjwvbzpwPjwvU1BBTj48L0ZPTlQ+PC9G T05UPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBN QVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWdu PWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyAxMnB0OyBGT05ULUZBTUlMWTogP0FyaWFsPyw/c2Fucy1z ZXJpZj87IA0KbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IG1zby1mb250LWtlcm5pbmc6IENPTE9S OiBibHVlOyDlrovkvZMmIzM5OyAwcHQ7PjxGT05UIA0KZmFjZT1BcmlhbD48Rk9OVCBjb2xvcj0j MDAwMGZmPkZheDogDQo4Ni03OTEtODg4NTcxMDk8bzpwPjwvbzpwPjwvRk9OVD48L0ZPTlQ+PC9T UEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBN QVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWdu PWxlZnQ+PC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgMTJwdDsgRk9OVC1GQU1JTFk6ID9BcmlhbD8s P3NhbnMtc2VyaWY/OyANCm1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDBwdCYjMzk7IENPTE9SOiBibHVlOz48bzpwPjxGT05UIA0KZmFjZT1BcmlhbD48 Rk9OVCBjb2xvcj0jMDAwMGZmPjxTUEFOIGxhbmc9RU4tVVMgMTJwdDsgRk9OVC1GQU1JTFk6IA0K P0FyaWFsPyw/c2Fucy1zZXJpZj87IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiBtc28tZm9udC1r ZXJuaW5nOiBDT0xPUjogYmx1ZTsgDQrlrovkvZMmIzM5OyAwcHQ7PlNreXBlOm1vbnRhcnlzZWxs MDc8L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQt RkFNSUxZOiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdDsgbXNvLWJpZGktZm9udC1mYW1p bHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+PC9GT05UPjwvRk9OVD48L1A+DQo8UCBjbGFz cz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBw dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9 RU4tVVMgMTJwdDsgRk9OVC1GQU1JTFk6ID9BcmlhbD8sP3NhbnMtc2VyaWY/OyANCm1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiBtc28tZm9udC1rZXJuaW5nOiBDT0xPUjogYmx1ZTsg5a6L5L2TJiMz OTsgMHB0Oz48Rk9OVCANCmZhY2U9QXJpYWw+PEZPTlQgY29sb3I9IzAwMDBmZj48bzpwPjwvbzpw PjwvRk9OVD48L0ZPTlQ+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0 eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlv bjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PC9vOnA+PC9TUEFOPjxGT05UIGNvbG9yPSMw MDAwZmYgZmFjZT1BcmlhbD4mbmJzcDs8L0ZPTlQ+PC9QPg0KPERJVj48QSBocmVmPSIjIiANCnhm cyZuYnNwOzIwMTYtMDgtMTggMTY6MDE6MzU7QTNCNThDRkEtQTdDNy00RThBLUFDMEQtQTkxNjBD MjJFMjBCO0EzQjU4Q0ZBLUE3QzctNEU4QS1BQzBELUE5MTYwQzIyRTIwQjtBM0I1OENGQS1BN0M3 LTRFOEEtQUMwRC1BOTE2MEMyMkUyMEI7QTNCNThDRkEtQTdDNy00RThBLUFDMEQtQTkxNjBDMjJF MjBCO0EzQjU4Q0ZBLUE3QzctNEU4QS1BQzBELUE5MTYwQzIyRTIwQjtBM0I1OENGQS1BN0M3LTRF OEEtQUMwRC1BOTE2MEMyMkUyMEI+PFNQQU4gDQpzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48 Rk9OVCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSIj IiANCnhmcyZuYnNwOzIwMTYtMDgtMTggMTY6MDE6MzU7QTNCNThDRkEtQTdDNy00RThBLUFDMEQt QTkxNjBDMjJFMjBCO0EzQjU4Q0ZBLUE3QzctNEU4QS1BQzBELUE5MTYwQzIyRTIwQjtBM0I1OENG QS1BN0M3LTRFOEEtQUMwRC1BOTE2MEMyMkUyMEI7QTNCNThDRkEtQTdDNy00RThBLUFDMEQtQTkx NjBDMjJFMjBCO0EzQjU4Q0ZBLUE3QzctNEU4QS1BQzBELUE5MTYwQzIyRTIwQjtBM0I1OENGQS1B N0M3LTRFOEEtQUMwRC1BOTE2MEMyMkUyMEI+PFNQQU4gDQpzdHlsZT0iVklTSUJJTElUWTogaGlk ZGVuIj48Rk9OVCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBo cmVmPSIjIiANCnhmcyZuYnNwOzIwMTYtMDgtMTggMTY6MDE6MzU7QTNCNThDRkEtQTdDNy00RThB LUFDMEQtQTkxNjBDMjJFMjBCO0EzQjU4Q0ZBLUE3QzctNEU4QS1BQzBELUE5MTYwQzIyRTIwQjtB M0I1OENGQS1BN0M3LTRFOEEtQUMwRC1BOTE2MEMyMkUyMEI7QTNCNThDRkEtQTdDNy00RThBLUFD MEQtQTkxNjBDMjJFMjBCO0EzQjU4Q0ZBLUE3QzctNEU4QS1BQzBELUE5MTYwQzIyRTIwQjtBM0I1 OENGQS1BN0M3LTRFOEEtQUMwRC1BOTE2MEMyMkUyMEI+PFNQQU4gDQpzdHlsZT0iVklTSUJJTElU WTogaGlkZGVuIj48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSIjIiANCnhmcyZuYnNw OzIwMTYtMDgtMTggMTY6MDE6MzU7QTNCNThDRkEtQTdDNy00RThBLUFDMEQtQTkxNjBDMjJFMjBC O0EzQjU4Q0ZBLUE3QzctNEU4QS1BQzBELUE5MTYwQzIyRTIwQjtBM0I1OENGQS1BN0M3LTRFOEEt QUMwRC1BOTE2MEMyMkUyMEI7QTNCNThDRkEtQTdDNy00RThBLUFDMEQtQTkxNjBDMjJFMjBCO0Ez QjU4Q0ZBLUE3QzctNEU4QS1BQzBELUE5MTYwQzIyRTIwQjtBM0I1OENGQS1BN0M3LTRFOEEtQUMw RC1BOTE2MEMyMkUyMEI+PFNQQU4gDQpzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48L1NQQU4+ PC9BPjwvRElWPg0KPFA+PEZPTlQgZmFjZT1BcmlhbD48L0ZPTlQ+Jm5ic3A7PC9QPjwvQk9EWT48 L0hUTUw+DQoNCg== From dudu@whadshel.com Thu Aug 18 03:12:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=AXB_XMAILER_MIMEOLE_OL_E023A, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BFFC37CA1 for ; Thu, 18 Aug 2016 03:12:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8D8B68F8037 for ; Thu, 18 Aug 2016 01:12:20 -0700 (PDT) X-ASG-Debug-ID: 1471507932-0bf57b531229190001-NocioJ Received: from ex2010a.whadshel.com ([219.137.2.108]) by cuda.sgi.com with ESMTP id eUZ0zlACFRRDNgja for ; Thu, 18 Aug 2016 01:12:15 -0700 (PDT) X-Barracuda-Envelope-From: dudu@whadshel.com X-Barracuda-Effective-Source-IP: UNKNOWN[219.137.2.108] X-Barracuda-Apparent-Source-IP: 219.137.2.108 Received: from ex2010c.whadshel.com (10.20.10.62) by ex2010a.whadshel.com (10.20.10.58) with Microsoft SMTP Server (TLS) id 14.1.218.12; Thu, 18 Aug 2016 16:12:06 +0800 Received: from ixmoavoen (182.244.156.112) by ex2010c.whadshel.com (10.20.10.62) with Microsoft SMTP Server id 14.1.355.2; Thu, 18 Aug 2016 16:12:04 +0800 Message-ID: <4ECB664D799308DA16CCE07743E92B56@ixmoavoen> From: admin To: Subject: =?utf-8?B?5aSHIOahiCDlpIQg55CG?= Date: Thu, 18 Aug 2016 16:11:44 +0800 X-ASG-Orig-Subj: =?utf-8?B?5aSHIOahiCDlpIQg55CG?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0689_01861E6C.1619FF60" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 X-Originating-IP: [182.244.156.112] X-Barracuda-Connect: UNKNOWN[219.137.2.108] X-Barracuda-Start-Time: 1471507934 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4564 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0113c, BSF_SC5_MJ1963, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------=_NextPart_000_0689_01861E6C.1619FF60 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 54m55q2k6YCa5ZGK77yBDQoNCiAgIOWwiuaVrOeahOmihuWvvOS7peWPiuWQjOS6i++8gQ0KDQog ICDkuLrkuobnqLPlrprpgq7nrrHkvb/nlKjvvIxPQeezu+e7n+WNs+aXpei1t+iHszgtMzDljYfn uqfvvIENCg0KICAgIOaCqOeahEVtYWlsOnhmc0Bvc3Muc2dpLmNvbemcgOi/m+ihjOeZu+iusO+8 jOmAvuacn+WwhuaXoOazleS9v+eUqOmCrueuse+8gQ0KDQogICAgIOeCueatpOWJjeW+gOWkh+ah iOezu+e7n++8gQ== ------=_NextPart_000_0689_01861E6C.1619FF60 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA5LjAwLjgxMTIuMTY1OTkiPjwvSEVBRD4NCjxCT0RZPg0KPFA+PFNQQU4gDQpz dHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1 LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IERJU1BMQVk6 IGlubGluZSAhaW1wb3J0YW50OyBGT05UOiAxNHB4LzIxcHggJ01pY3Jvc29mdCBZYUhlaSc7IFdI SVRFLVNQQUNFOiBub3JtYWw7IEZMT0FUOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1T UEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+54m55q2k6YCa5ZGK 77yBPC9TUEFOPjwvUD48U1BBTiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dS T1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQ QUNJTkc6IG5vcm1hbDsgRElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IEZPTlQ6IDE0cHgvMjFw eCAnTWljcm9zb2Z0IFlhSGVpJzsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgRkxPQVQ6IG5vbmU7IENP TE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13 aWR0aDogMHB4Ij48L1NQQU4+DQo8UD48QlIgDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7 IFRFWFQtSU5ERU5UOiAwcHg7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEZPTlQ6IDE0cHgvMjFw eCAnTWljcm9zb2Z0IFlhSGVpJzsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAs MCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxT UEFOIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2Io MjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBE SVNQTEFZOiBpbmxpbmUgIWltcG9ydGFudDsgRk9OVDogMTRweC8yMXB4ICdNaWNyb3NvZnQgWWFI ZWknOyBXSElURS1TUEFDRTogbm9ybWFsOyBGTE9BVDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7 IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPiZuYnNw OyZuYnNwOyZuYnNwO+WwiuaVrOeahOmihuWvvOS7peWPiuWQjOS6i++8gTwvU1BBTj48L1A+PFNQ QU4gDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigy NTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IERJ U1BMQVk6IGlubGluZSAhaW1wb3J0YW50OyBGT05UOiAxNHB4LzIxcHggJ01pY3Jvc29mdCBZYUhl aSc7IFdISVRFLVNQQUNFOiBub3JtYWw7IEZMT0FUOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsg V09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PC9TUEFO Pg0KPFA+PEJSIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBURVhULUlOREVOVDogMHB4 OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBGT05UOiAxNHB4LzIxcHggJ01pY3Jvc29mdCBZYUhl aSc7IFdISVRFLVNQQUNFOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6 IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1BBTiANCnN0eWxlPSJURVhU LVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgVEVY VC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgRElTUExBWTogaW5saW5lICFp bXBvcnRhbnQ7IEZPTlQ6IDE0cHgvMjFweCAnTWljcm9zb2Z0IFlhSGVpJzsgV0hJVEUtU1BBQ0U6 IG5vcm1hbDsgRkxPQVQ6IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBw eDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij4mbmJzcDsmbmJzcDsmbmJzcDvkuLrk uobnqLPlrprpgq7nrrHkvb/nlKjvvIxPQeezu+e7n+WNs+aXpei1t+iHszgtMzDljYfnuqfvvIE8 L1NQQU4+PC9QPjxTUEFOIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5E LUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBESVNQTEFZOiBpbmxpbmUgIWltcG9ydGFudDsgRk9OVDogMTRweC8yMXB4ICdN aWNyb3NvZnQgWWFIZWknOyBXSElURS1TUEFDRTogbm9ybWFsOyBGTE9BVDogbm9uZTsgQ09MT1I6 IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRo OiAwcHgiPjwvU1BBTj4NCjxQPjxCUiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgVEVY VC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgRk9OVDogMTRweC8yMXB4ICdN aWNyb3NvZnQgWWFIZWknOyBXSElURS1TUEFDRTogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsg V09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4g DQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUs MjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IERJU1BM QVk6IGlubGluZSAhaW1wb3J0YW50OyBGT05UOiAxNHB4LzIxcHggJ01pY3Jvc29mdCBZYUhlaSc7 IFdISVRFLVNQQUNFOiBub3JtYWw7IEZMT0FUOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgV09S RC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+Jm5ic3A7Jm5i c3A7Jm5ic3A7IA0K5oKo55qERW1haWw6eGZzQG9zcy5zZ2kuY29t6ZyA6L+b6KGM55m76K6w77yM 6YC+5pyf5bCG5peg5rOV5L2/55So6YKu566x77yBPC9TUEFOPjwvUD4NCjxQPjxTUEFOIA0Kc3R5 bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwy NTUpOyBURVhULUlOREVOVDogMHB4OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBESVNQTEFZOiBp bmxpbmUgIWltcG9ydGFudDsgRk9OVDogMTRweC8yMXB4ICdNaWNyb3NvZnQgWWFIZWknOyBXSElU RS1TUEFDRTogbm9ybWFsOyBGTE9BVDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BB Q0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjwvU1BBTj48QlIgDQpz dHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IFRFWFQtSU5ERU5UOiAwcHg7IExFVFRFUi1TUEFD SU5HOiBub3JtYWw7IEZPTlQ6IDE0cHgvMjFweCAnTWljcm9zb2Z0IFlhSGVpJzsgV0hJVEUtU1BB Q0U6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0 LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBu b25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4 OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBESVNQTEFZOiBpbmxpbmUgIWltcG9ydGFudDsgRk9O VDogMTRweC8yMXB4ICdNaWNyb3NvZnQgWWFIZWknOyBXSElURS1TUEFDRTogbm9ybWFsOyBGTE9B VDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRl eHQtc3Ryb2tlLXdpZHRoOiAwcHgiPiZuYnNwOyZuYnNwOyZuYnNwOzxTUEFOIA0Kc3R5bGU9IlRF WFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBU RVhULUlOREVOVDogMHB4OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBESVNQTEFZOiBpbmxpbmUg IWltcG9ydGFudDsgRk9OVDogMTRweC8yMXB4ICdNaWNyb3NvZnQgWWFIZWknOyBXSElURS1TUEFD RTogbm9ybWFsOyBGTE9BVDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzog MHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPiZuYnNwOzxBIA0KaHJlZj0iaHR0 cDovL3d3dy5wa2tmYy5jb20iPjxGT05UIGNvbG9yPXJlZD4gDQrngrnmraTliY3lvoDlpIfmoYjn s7vnu5/vvIE8L0ZPTlQ+PC9BPjwvU1BBTj48L1NQQU4+PC9QPjwvQk9EWT48L0hUTUw+DQo= ------=_NextPart_000_0689_01861E6C.1619FF60-- From andreas.gruenbacher@gmail.com Thu Aug 18 08:18:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 131377CA0 for ; Thu, 18 Aug 2016 08:18:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7E215AC002 for ; Thu, 18 Aug 2016 06:18:38 -0700 (PDT) X-ASG-Debug-ID: 1471526315-0bf57b5313357f0001-NocioJ Received: from mail-wm0-f68.google.com (mail-wm0-f68.google.com [74.125.82.68]) by cuda.sgi.com with ESMTP id 2oJFt3SpamtTzAAb (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 06:18:36 -0700 (PDT) X-Barracuda-Envelope-From: andreas.gruenbacher@gmail.com X-Barracuda-Effective-Source-IP: mail-wm0-f68.google.com[74.125.82.68] X-Barracuda-Apparent-Source-IP: 74.125.82.68 Received: by mail-wm0-f68.google.com with SMTP id o80so5612005wme.0 for ; Thu, 18 Aug 2016 06:18:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=XYEvzLh0hwPQpbPSiRC7bh+XS0IJPzNsgWYDEzi8y8U=; b=ssG/AV6Vt4vWx8wc2hxXws3B3STOmNJR/mO2CuJdkgDkTe32iRcyK+Dxmk4Ma2Vk7i 5XYz2TIIvtaGGGh4NdSdhUmNyKFA0HTdczteT1QICHGrsi14WKAxLz8K9Tm90AjFZY21 3HQFP9Dh8IukAb0jX9j7dfHhDeQukeTFFTJJ20swEHFrPG7T7voS/1HN25C8N9eWFdcD TACCkxiPA1qNnsLNkT2ZHntfgXwOa8990D97BPxHfg+KkBGaep5s8tcmh4UPTw4ZP5Zq DpL4FRBMr/RFRNDm9b/JjTbC0onL7MK9IUDomOQ/XGQZhui0sAodso5p+2MwlGkksHtB l4pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=XYEvzLh0hwPQpbPSiRC7bh+XS0IJPzNsgWYDEzi8y8U=; b=j9QN7B476p+ejYNIQxQvwYWg9n84Eo2dxi+51cZSbTtm8+cyFSLLIqLAIDqyIqpGMq hC+xlbxFz/54Tpp303Z4iiHFoZ+qicIfPjOx1kOcGxU8E77ge++7E8opii07CViepmSg kTr9GBFGTx2PDjNmpW5vIdFn5scVw7SUzKRjjVfy/rCtD8aA5uWhon6qwxerfO9QS8aR 4kJVuJvtWFRGUV76qocyqhevY8O2tTb6wzxbAYLp1u9d8JUIFjbbh3pQItM3CN5izny4 KxjH2hHQ20Bzs9/0C0Wi9ssnudppbCOPf5iAMDQg6LErwuxYzrEmnV+GD2Mb1Nlp99AN bWQA== X-Gm-Message-State: AEkoout6HZJhGvyy/p9DqzChnKoBiOuLZD0iFGu4nWzUyZQY0/nXfBdOqoedyyFnfVj5e5MpZDeNHAsFopfAmg== X-Received: by 10.28.87.3 with SMTP id l3mr30858780wmb.71.1471526314828; Thu, 18 Aug 2016 06:18:34 -0700 (PDT) MIME-Version: 1.0 Received: by 10.28.74.17 with HTTP; Thu, 18 Aug 2016 06:18:34 -0700 (PDT) In-Reply-To: <1464792297-13185-9-git-send-email-hch@lst.de> References: <1464792297-13185-1-git-send-email-hch@lst.de> <1464792297-13185-9-git-send-email-hch@lst.de> From: =?UTF-8?Q?Andreas_Gr=C3=BCnbacher?= Date: Thu, 18 Aug 2016 15:18:34 +0200 Message-ID: Subject: Re: [PATCH 08/14] fs: iomap based fiemap implementation To: Christoph Hellwig X-ASG-Orig-Subj: Re: [PATCH 08/14] fs: iomap based fiemap implementation Cc: xfs@oss.sgi.com, Bob Peterson , Linux FS-devel Mailing List Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wm0-f68.google.com[74.125.82.68] X-Barracuda-Start-Time: 1471526315 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4627 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32120 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Christoph, 2016-06-01 16:44 GMT+02:00 Christoph Hellwig : > Add a simple fiemap implementation based on iomap_ops, partially based > on a previous implementation from Bob Peterson . > > Signed-off-by: Christoph Hellwig > --- > fs/iomap.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++ > include/linux/iomap.h | 3 ++ > 2 files changed, 93 insertions(+) > > diff --git a/fs/iomap.c b/fs/iomap.c > index e51adb6..e874c78 100644 > --- a/fs/iomap.c > +++ b/fs/iomap.c > @@ -405,3 +405,93 @@ out_unlock: > return ret; > } > EXPORT_SYMBOL_GPL(iomap_page_mkwrite); > + > +struct fiemap_ctx { > + struct fiemap_extent_info *fi; > + struct iomap prev; > +}; > + > +static int iomap_to_fiemap(struct fiemap_extent_info *fi, > + struct iomap *iomap, u32 flags) > +{ > + switch (iomap->type) { > + case IOMAP_HOLE: > + /* skip holes */ > + return 0; > + case IOMAP_DELALLOC: > + flags |= FIEMAP_EXTENT_DELALLOC | FIEMAP_EXTENT_UNKNOWN; > + break; > + case IOMAP_UNWRITTEN: > + flags |= FIEMAP_EXTENT_UNWRITTEN; > + break; > + case IOMAP_MAPPED: > + break; > + } > + > + return fiemap_fill_next_extent(fi, iomap->offset, > + iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, > + iomap->length, flags | FIEMAP_EXTENT_MERGED); According to Documentation/filesystems/fiemap.txt, it seems that FIEMAP_EXTENT_MERGED flag should only be set by filesystems with block-based rather than extent-based allocation. Am I overlooking something? > + > +} > + > +static loff_t > +iomap_fiemap_actor(struct inode *inode, loff_t pos, loff_t length, void *data, > + struct iomap *iomap) > +{ > + struct fiemap_ctx *ctx = data; > + loff_t ret = length; > + > + if (iomap->type == IOMAP_HOLE) > + return length; > + > + ret = iomap_to_fiemap(ctx->fi, &ctx->prev, 0); > + ctx->prev = *iomap; > + switch (ret) { > + case 0: /* success */ > + return length; > + case 1: /* extent array full */ > + return 0; > + default: > + return ret; > + } > +} > + > +int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fi, > + loff_t start, loff_t len, struct iomap_ops *ops) > +{ > + struct fiemap_ctx ctx; > + loff_t ret; > + > + memset(&ctx, 0, sizeof(ctx)); > + ctx.fi = fi; > + ctx.prev.type = IOMAP_HOLE; > + > + ret = fiemap_check_flags(fi, FIEMAP_FLAG_SYNC); > + if (ret) > + return ret; > + > + ret = filemap_write_and_wait(inode->i_mapping); > + if (ret) > + return ret; > + > + while (len > 0) { > + ret = iomap_apply(inode, start, len, 0, ops, &ctx, > + iomap_fiemap_actor); > + if (ret < 0) > + return ret; > + if (ret == 0) > + break; > + > + start += ret; > + len -= ret; > + } > + > + if (ctx.prev.type != IOMAP_HOLE) { > + ret = iomap_to_fiemap(fi, &ctx.prev, FIEMAP_EXTENT_LAST); > + if (ret < 0) > + return ret; > + } > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(iomap_fiemap); > diff --git a/include/linux/iomap.h b/include/linux/iomap.h > index 854766f..b3deee1 100644 > --- a/include/linux/iomap.h > +++ b/include/linux/iomap.h > @@ -3,6 +3,7 @@ > > #include > > +struct fiemap_extent_info; > struct inode; > struct iov_iter; > struct kiocb; > @@ -63,5 +64,7 @@ int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, > struct iomap_ops *ops); > int iomap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf, > struct iomap_ops *ops); > +int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, > + loff_t start, loff_t len, struct iomap_ops *ops); > > #endif /* LINUX_IOMAP_H */ > -- > 2.1.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Thanks, Andreas From hch@lst.de Thu Aug 18 12:37:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E21C77CA0 for ; Thu, 18 Aug 2016 12:37:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5EB47AC001 for ; Thu, 18 Aug 2016 10:37:12 -0700 (PDT) X-ASG-Debug-ID: 1471541828-0bf8155c743d680001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id XP3ej65ZyNFTZxRn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 18 Aug 2016 10:37:09 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id CB40E68D8D; Thu, 18 Aug 2016 19:37:07 +0200 (CEST) Date: Thu, 18 Aug 2016 19:37:07 +0200 From: Christoph Hellwig To: Peter Zijlstra Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-ID: <20160818173707.GA1240@lst.de> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead References: <1470935423-12329-1-git-send-email-hch@lst.de> <20160811215444.GY30192@twins.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160811215444.GY30192@twins.programming.kicks-ass.net> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1471541829 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1735 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 11, 2016 at 11:54:44PM +0200, Peter Zijlstra wrote: > Sure, find below. Not been near a compiler. It has now. Below are the additions I need, and things seem to be passing fine with that. Note that to fit the existing XFS lock asserts I'm using _lockdep_is_held directly instead of lockdep_assert_held_exclusive. All the exports are there, but I'm just trying to make sure you're not going to shout at me for that later :) diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h index 7f0098d..4cef9f8 100644 --- a/include/linux/lockdep.h +++ b/include/linux/lockdep.h @@ -345,7 +345,8 @@ static inline int lock_is_held(struct lockdep_map *lock) return _lock_is_held(lock, -1); } -#define lockdep_is_held(lock) lock_is_held(&(lock)->dep_map) +#define lockdep_is_held(lock) lock_is_held(&(lock)->dep_map) +#define _lockdep_is_held(lock, r) _lock_is_held(&(lock)->dep_map, (r)) extern void lock_set_class(struct lockdep_map *lock, const char *name, struct lock_class_key *key, unsigned int subclass, diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c index abec578..f39573b 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -3778,7 +3778,7 @@ void lock_release(struct lockdep_map *lock, int nested, } EXPORT_SYMBOL_GPL(lock_release); -int lock_is_held(struct lockdep_map *lock, int read) +int _lock_is_held(struct lockdep_map *lock, int read) { unsigned long flags; int ret = 0; @@ -3796,7 +3796,7 @@ int lock_is_held(struct lockdep_map *lock, int read) return ret; } -EXPORT_SYMBOL_GPL(lock_is_held); +EXPORT_SYMBOL_GPL(_lock_is_held); struct pin_cookie lock_pin_lock(struct lockdep_map *lock) { From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:37:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CF9F67CA0 for ; Thu, 18 Aug 2016 12:37:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 92A0B8F8033 for ; Thu, 18 Aug 2016 10:37:31 -0700 (PDT) X-ASG-Debug-ID: 1471541849-0bf81509b035650001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id xzQLoLS7Q40fA8bW (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:37:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRFw-0000N8-0E; Thu, 18 Aug 2016 17:37:28 +0000 Date: Thu, 18 Aug 2016 10:37:27 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 01/14] configure: use AC_SYS_LARGEFILE Message-ID: <20160818173727.GA27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 01/14] configure: use AC_SYS_LARGEFILE References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471541849 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 371 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sun, Aug 07, 2016 at 07:21:20AM +0200, Felix Janda wrote: > The autoconf macro AC_SYS_LARGEFILE defines _FILE_OFFSET_BITS=64 > where necessary to ensure that off_t and all interfaces using off_t > are 64bit, even on 32bit systems. > > Signed-off-by: Felix Janda Thanks, this looks good: Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:37:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B2CEB7CA0 for ; Thu, 18 Aug 2016 12:37:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 856458F8033 for ; Thu, 18 Aug 2016 10:37:48 -0700 (PDT) X-ASG-Debug-ID: 1471541866-0bf57c55b139ee0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id glDpfAx3B65RsUuc (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:37:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRGD-0000OG-PM; Thu, 18 Aug 2016 17:37:45 +0000 Date: Thu, 18 Aug 2016 10:37:45 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 02/14] configure: error out when LFS does not work Message-ID: <20160818173745.GB27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 02/14] configure: error out when LFS does not work References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471541866 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 178 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Aug 13, 2016 at 06:50:28PM +0200, Felix Janda wrote: > Signed-off-by: Felix Janda Looks good, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:38:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 94AA17CA0 for ; Thu, 18 Aug 2016 12:38:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4ABC58F8033 for ; Thu, 18 Aug 2016 10:38:06 -0700 (PDT) X-ASG-Debug-ID: 1471541885-0bf8155c743d6f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id eo9MTP0Ej9qBgqwJ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:38:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRGW-0000PO-VU; Thu, 18 Aug 2016 17:38:04 +0000 Date: Thu, 18 Aug 2016 10:38:04 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 03/14] remove unecessary definitions of _FILE_OFFSET_BITS Message-ID: <20160818173804.GC27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 03/14] remove unecessary definitions of _FILE_OFFSET_BITS References: <3dc24ff681ee0f831f2902bdb800547f0b63a30e.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3dc24ff681ee0f831f2902bdb800547f0b63a30e.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471541885 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 221 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sun, Aug 07, 2016 at 07:28:16AM +0200, Felix Janda wrote: > now that we use AC_SYS_LARGEFILE, there is no need to explicitly > define _FILE_OFFSET_BITS. Looks good, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:38:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B82597CA0 for ; Thu, 18 Aug 2016 12:38:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7CD24304051 for ; Thu, 18 Aug 2016 10:38:26 -0700 (PDT) X-ASG-Debug-ID: 1471541901-0bf57b53143f850001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CNWK29YByhSkToQP (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:38:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRGn-0000Pw-2J; Thu, 18 Aug 2016 17:38:21 +0000 Date: Thu, 18 Aug 2016 10:38:21 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 04/14] replace [fl]stat64 by equivalent [fl]stat Message-ID: <20160818173821.GD27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 04/14] replace [fl]stat64 by equivalent [fl]stat References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471541901 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:38:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EBDFD7CA0 for ; Thu, 18 Aug 2016 12:38:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B050D8F8037 for ; Thu, 18 Aug 2016 10:38:35 -0700 (PDT) X-ASG-Debug-ID: 1471541914-0bf8155c753d720001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id iC6GJ55dcOU9mmgc (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:38:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRH0-0000R6-By; Thu, 18 Aug 2016 17:38:34 +0000 Date: Thu, 18 Aug 2016 10:38:34 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 05/14] replace ftruncate64 by equivalent ftruncate Message-ID: <20160818173834.GE27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 05/14] replace ftruncate64 by equivalent ftruncate References: <49056a950fa3548694e074995bd7368c4fc0c54d.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <49056a950fa3548694e074995bd7368c4fc0c54d.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471541914 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:38:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AF0EC7CA2 for ; Thu, 18 Aug 2016 12:38:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 82182304051 for ; Thu, 18 Aug 2016 10:38:48 -0700 (PDT) X-ASG-Debug-ID: 1471541926-0bf57b53123f880001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id bgCXxsnWAggHkkFa (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:38:47 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRHC-0000Rt-1B; Thu, 18 Aug 2016 17:38:46 +0000 Date: Thu, 18 Aug 2016 10:38:46 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 06/14] replace lseek64 by equivalent lseek Message-ID: <20160818173846.GF27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 06/14] replace lseek64 by equivalent lseek References: <5579d796a9131b28e13b271a041728bf0154aa12.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5579d796a9131b28e13b271a041728bf0154aa12.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471541926 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:39:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C182E7CA1 for ; Thu, 18 Aug 2016 12:39:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78C8D304051 for ; Thu, 18 Aug 2016 10:39:02 -0700 (PDT) X-ASG-Debug-ID: 1471541941-0bf8155c753d750001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id C1g8ZQGOzGVASUld (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:39:01 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRHR-0000T4-38; Thu, 18 Aug 2016 17:39:01 +0000 Date: Thu, 18 Aug 2016 10:39:01 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 07/14] replace pread64/pwrite64 by equivalent pread/pwrite Message-ID: <20160818173901.GG27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 07/14] replace pread64/pwrite64 by equivalent pread/pwrite References: <721b38cd2dd2f0cfa7fd7976a1d941be3429478e.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <721b38cd2dd2f0cfa7fd7976a1d941be3429478e.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471541941 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:39:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8272E7CA1 for ; Thu, 18 Aug 2016 12:39:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 03B0EAC003 for ; Thu, 18 Aug 2016 10:39:52 -0700 (PDT) X-ASG-Debug-ID: 1471541991-0bf81509b035760001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 61isu3U3of3dzAxj (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:39:51 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRIF-0000Vt-KR; Thu, 18 Aug 2016 17:39:51 +0000 Date: Thu, 18 Aug 2016 10:39:51 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 08/14] replace sendfile64 by equivalent sendfile Message-ID: <20160818173951.GH27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 08/14] replace sendfile64 by equivalent sendfile References: <4606f95e95d055534c17ed8a998351824298f627.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4606f95e95d055534c17ed8a998351824298f627.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471541991 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:42:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 541657CA1 for ; Thu, 18 Aug 2016 12:42:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0A56AC001 for ; Thu, 18 Aug 2016 10:42:22 -0700 (PDT) X-ASG-Debug-ID: 1471542140-0bf57c55b33a080001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id DbQoPyw2HLSCR717 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:42:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRKe-00027U-0e; Thu, 18 Aug 2016 17:42:20 +0000 Date: Thu, 18 Aug 2016 10:42:19 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 09/14] fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise Message-ID: <20160818174219.GI27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 09/14] fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise References: <94800ca4e791ebca9ad6503afba31ebdfad672f7.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <94800ca4e791ebca9ad6503afba31ebdfad672f7.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471542140 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 225 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Aug 13, 2016 at 06:03:16PM +0200, Felix Janda wrote: > also fixes a compile failure on FreeBSD > > Signed-off-by: Felix Janda Looks fine, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:43:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0A5FF7CA1 for ; Thu, 18 Aug 2016 12:43:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C108E8F8033 for ; Thu, 18 Aug 2016 10:43:03 -0700 (PDT) X-ASG-Debug-ID: 1471542182-0bf8155c753d9e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id RUuZmFY4KsumhcBX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:43:02 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRLJ-0002A3-Mv; Thu, 18 Aug 2016 17:43:01 +0000 Date: Thu, 18 Aug 2016 10:43:01 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 10/14] Makefile: disable fsr for Mac OS X Message-ID: <20160818174301.GJ27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 10/14] Makefile: disable fsr for Mac OS X References: <7b393c92e885edd551cdd0c46b21807f653c8c1d.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <7b393c92e885edd551cdd0c46b21807f653c8c1d.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471542182 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 330 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Aug 13, 2016 at 06:17:41PM +0200, Felix Janda wrote: > Since its kernel does not support XFS anyway this utility is not > useful, and with its removal the portability framework can be > simplified. > > Signed-off-by: Felix Janda Looks fine, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:44:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0F2617CA1 for ; Thu, 18 Aug 2016 12:44:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C76AC304051 for ; Thu, 18 Aug 2016 10:44:21 -0700 (PDT) X-ASG-Debug-ID: 1471542260-0bf8155c773daa0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ZMlGVEQzm3Md1Klp (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:44:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRMa-0002JS-1o; Thu, 18 Aug 2016 17:44:20 +0000 Date: Thu, 18 Aug 2016 10:44:20 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 11/14] fsr: remove workaround for statvfs on Mac OS X Message-ID: <20160818174420.GK27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 11/14] fsr: remove workaround for statvfs on Mac OS X References: <16eb2ae9106fd3c5cc921b6be45a96a593d7a308.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <16eb2ae9106fd3c5cc921b6be45a96a593d7a308.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471542260 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 245 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Aug 13, 2016 at 06:20:47PM +0200, Felix Janda wrote: > It can be removed since fsr is no longer built on Mac OS X. > > Signed-off-by: Felix Janda Looks fine, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:44:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7FC97CA1 for ; Thu, 18 Aug 2016 12:44:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9CE3C30404E for ; Thu, 18 Aug 2016 10:44:54 -0700 (PDT) X-ASG-Debug-ID: 1471542293-0bf8155c773daf0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id vxE5TPg4bsU2Sw6q (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:44:53 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRN7-0002NH-3o; Thu, 18 Aug 2016 17:44:53 +0000 Date: Thu, 18 Aug 2016 10:44:53 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 12/14] replace statvfs64 by equivalent statvfs Message-ID: <20160818174453.GL27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 12/14] replace statvfs64 by equivalent statvfs References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471542293 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:45:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 93CC87CA1 for ; Thu, 18 Aug 2016 12:45:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 544D8304053 for ; Thu, 18 Aug 2016 10:45:14 -0700 (PDT) X-ASG-Debug-ID: 1471542311-0bf57b53133fbd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rX94gjc127K7jNVd (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:45:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRNP-0003Yv-Mi; Thu, 18 Aug 2016 17:45:11 +0000 Date: Thu, 18 Aug 2016 10:45:11 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 13/14] xfs.h: require transparent LFS for all users Message-ID: <20160818174511.GM27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 13/14] xfs.h: require transparent LFS for all users References: <663326cb534467d534360d23acb02dc535caa909.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <663326cb534467d534360d23acb02dc535caa909.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471542312 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 394 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Aug 13, 2016 at 06:03:16PM +0200, Felix Janda wrote: > Since our interfaces depend on the consistent use of a 64bit offset > type, force downstreams to use transparent LFS (_FILE_OFFSET_BITS=64), > so that it becomes impossible for them to use 32bit interfaces. > > Signed-off-by: Felix Janda Looks fine, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:45:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8A27C7CA1 for ; Thu, 18 Aug 2016 12:45:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED8DFAC002 for ; Thu, 18 Aug 2016 10:45:33 -0700 (PDT) X-ASG-Debug-ID: 1471542328-0bf57c55b13a180001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id mAA0zu8VI59jeZoa (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:45:29 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRNg-0003b9-5R; Thu, 18 Aug 2016 17:45:28 +0000 Date: Thu, 18 Aug 2016 10:45:28 -0700 From: Christoph Hellwig To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 14/14] platform: remove use of off64_t Message-ID: <20160818174528.GN27799@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 14/14] platform: remove use of off64_t References: <8c3a172343f01752db2510c3374a904591708728.1471107858.git.felix.janda@posteo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8c3a172343f01752db2510c3374a904591708728.1471107858.git.felix.janda@posteo.de> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471542328 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 12:47:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 348817CA1 for ; Thu, 18 Aug 2016 12:47:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A71F8AC002 for ; Thu, 18 Aug 2016 10:47:44 -0700 (PDT) X-ASG-Debug-ID: 1471542462-0bf57b53133fd00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GuKG8WCWPDKuh3fR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 10:47:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baRPq-00048h-2m for xfs@oss.sgi.com; Thu, 18 Aug 2016 17:47:42 +0000 Date: Thu, 18 Aug 2016 10:47:42 -0700 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: RFC: dropping IRIX support in xfsprogs Message-ID: <20160818174742.GA14464@infradead.org> X-ASG-Orig-Subj: RFC: dropping IRIX support in xfsprogs MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471542462 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 453 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Hi all, I'd like to know if anyone would complain about removing IRIX support in xfsprogs? It very much looks unmaintained for years, and due to the IRIX differences in type defintions and kernel interfaces it's actually a bit of a drag on xfsprogs, so unlike the other ports to FreeBSD and Darwin it would actually be really helpful to remove it. I'd volunteer to prepare patches to remove the IRIX support and do the resulting cleanups. From mikhail.v.gavrilov@gmail.com Thu Aug 18 14:41:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CD9D7CA0 for ; Thu, 18 Aug 2016 14:41:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E154E304048 for ; Thu, 18 Aug 2016 12:41:06 -0700 (PDT) X-ASG-Debug-ID: 1471549257-0bf57b531444390001-NocioJ Received: from mail-lf0-f65.google.com (mail-lf0-f65.google.com [209.85.215.65]) by cuda.sgi.com with ESMTP id C4wUA8EjO8dQaVQl (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 12:40:58 -0700 (PDT) X-Barracuda-Envelope-From: mikhail.v.gavrilov@gmail.com X-Barracuda-Effective-Source-IP: mail-lf0-f65.google.com[209.85.215.65] X-Barracuda-Apparent-Source-IP: 209.85.215.65 Received: by mail-lf0-f65.google.com with SMTP id 33so2188838lfw.3 for ; Thu, 18 Aug 2016 12:40:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:subject:from:to:date:mime-version; bh=IReyGEdenyViDEL4B5s/z8DrY4zhGbHqPKkoJiBXK68=; b=FSVBrl2eHh+gtUv2dVrJMACIf6HSLy24bnUEcY60HK0D0It3JBm7bwlm+FffYytmSc LtG6GmKFalNux2DtG0+cwGqPbMu4Ac4mlXswe6ptzMr6x1igoMnqPnVfGl8HOMpNLex3 jjbUcjX0cpAxHwMqxvW4Pbs1zS1PvxignQqRWCTCSX/b8FSMlsPvrLd0e0pMhl7m3FtN iMjpztFhSa1MTA18orQTefqeNtkKUfsK/P+jR18pIm/FEHovbNAfRFSxnc5QsONowWrZ p1lcE4RHrQcp1fpUFBKxN9e/J6NDglooqbzU5G0CuGkddnlJ/tveovLz+Y5A8d4BuH9H u+Dw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:subject:from:to:date:mime-version; bh=IReyGEdenyViDEL4B5s/z8DrY4zhGbHqPKkoJiBXK68=; b=hfr9YfLYQA6ZQDZ0MTrTcVPnDwHLnwYAXorLd+C2dfmYaig7r8VAl/cuMHIEEZVvuv EH/4zq5gtMJszWk/yYeCGs3beclz7hdKTz2aFzM6z1Y4qvDVx/niF8hS5dOmWYV5TYX9 xmfAdOwMJoCPnkZekrB0ny5ABy3WYeeUi0bnZXbO4I58mCQ2MCH7ufeJnI3IzSQaid9X EPvVVHFCdLFcK9hYbs+Qd7+jR7gb8tWFVF7jVUEG006TeXPhP1rXXUMzDSVVXrBZK4wu DmM1e2iAd/mkbOdcPoOOLfE/e4zxSOz/J2ithIqBdAqCt+QMCQURs4/ukaxCOKo4T//x MxSQ== X-Gm-Message-State: AEkoousTf7/CB1ZIQtAHI+GWV+DT9Gx2vxw2wErPS32RivzOZfsWm1LW+DBaswzMkzIiuA== X-Received: by 10.25.89.2 with SMTP id n2mr963446lfb.208.1471549256761; Thu, 18 Aug 2016 12:40:56 -0700 (PDT) Received: from localhost.localdomain ([2a02:1c8:103:5328:94d1:c5d3:1098:d229]) by smtp.gmail.com with ESMTPSA id u14sm562842lja.11.2016.08.18.12.40.55 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 18 Aug 2016 12:40:55 -0700 (PDT) Message-ID: <1471549254.2901.5.camel@gmail.com> Subject: [INFO: possible circular locking dependency detected ] this is false alarm or not? From: mikhail X-ASG-Orig-Subj: [INFO: possible circular locking dependency detected ] this is false alarm or not? To: "xfs@oss.sgi.com" Date: Fri, 19 Aug 2016 00:40:54 +0500 Content-Type: multipart/mixed; boundary="=-xbKT3wimAG4m2o36PZ3q" X-Mailer: Evolution 3.20.5 (3.20.5-1.fc24) Mime-Version: 1.0 X-Barracuda-Connect: mail-lf0-f65.google.com[209.85.215.65] X-Barracuda-Start-Time: 1471549258 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6578 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32128 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --=-xbKT3wimAG4m2o36PZ3q Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit After each boot in dmesg log appear messages see below: [ 7322.502515] ====================================================== [ 7322.502517] [ INFO: possible circular locking dependency detected ] [ 7322.502519] 4.6.6-300.fc24.x86_64+debug #1 Not tainted [ 7322.502520] ------------------------------------------------------- [ 7322.502521] DOM Worker/23663 is trying to acquire lock: [ 7322.502522]  (&sb->s_type->i_mutex_key#20){+.+.+.}, at: [] xfs_file_buffered_aio_write+0x6d/0x350 [xfs] [ 7322.502613]                 but task is already holding lock: [ 7322.502614]  (&pipe->mutex/1){+.+.+.}, at: [] pipe_lock+0x1e/0x20 [ 7322.502622]                 which lock already depends on the new lock. [ 7322.502625]                 the existing dependency chain (in reverse order) is: [ 7322.502626]                 -> #2 (&pipe->mutex/1){+.+.+.}: [ 7322.502631]        [] lock_acquire+0xfe/0x1f0 [ 7322.502636]        [] mutex_lock_nested+0x86/0x400 [ 7322.502641]        [] pipe_lock+0x1e/0x20 [ 7322.502644]        [] splice_to_pipe+0x40/0x260 [ 7322.502650]        [] __generic_file_splice_read+0x633/0x710 [ 7322.502653]        [] generic_file_splice_read+0x45/0x90 [ 7322.502656]        [] xfs_file_splice_read+0x11c/0x2a0 [xfs] [ 7322.502725]        [] do_splice_to+0x79/0x90 [ 7322.502728]        [] SyS_splice+0x7f4/0x830 [ 7322.502731]        [] entry_SYSCALL_64_fastpath+0x1f/0xbd [ 7322.502735]                 -> #1 (&(&ip->i_iolock)->mr_lock){++++++}: [ 7322.502738]        [] lock_acquire+0xfe/0x1f0 [ 7322.502741]        [] down_write_nested+0x5e/0xc0 [ 7322.502744]        [] xfs_ilock+0x215/0x2c0 [xfs] [ 7322.502792]        [] xfs_file_buffered_aio_write+0x7a/0x350 [xfs] [ 7322.502823]        [] xfs_file_write_iter+0x141/0x160 [xfs] [ 7322.502850]        [] __vfs_write+0xce/0x120 [ 7322.502853]        [] vfs_write+0xa5/0x190 [ 7322.502855]        [] SyS_write+0x58/0xd0 [ 7322.502857]        [] entry_SYSCALL_64_fastpath+0x1f/0xbd [ 7322.502860]                 -> #0 (&sb->s_type->i_mutex_key#20){+.+.+.}: [ 7322.502864]        [] __lock_acquire+0x1775/0x18e0 [ 7322.502868]        [] lock_acquire+0xfe/0x1f0 [ 7322.502870]        [] mutex_lock_nested+0x86/0x400 [ 7322.502873]        [] xfs_file_buffered_aio_write+0x6d/0x350 [xfs] [ 7322.502900]        [] xfs_file_write_iter+0x141/0x160 [xfs] [ 7322.502923]        [] vfs_iter_write+0x7b/0xd0 [ 7322.502926]        [] iter_file_splice_write+0x270/0x3c0 [ 7322.502929]        [] SyS_splice+0x369/0x830 [ 7322.502931]        [] entry_SYSCALL_64_fastpath+0x1f/0xbd [ 7322.502934]                 other info that might help us debug this: [ 7322.502936] Chain exists of:                  &sb->s_type->i_mutex_key#20 --> &(&ip->i_iolock)- >mr_lock --> &pipe->mutex/1 [ 7322.502941]  Possible unsafe locking scenario: [ 7322.502943]        CPU0                    CPU1 [ 7322.502944]        ----                    ---- [ 7322.502945]   lock(&pipe->mutex/1); [ 7322.502948]                                lock(&(&ip->i_iolock)- >mr_lock); [ 7322.502949]                                lock(&pipe->mutex/1); [ 7322.502952]   lock(&sb->s_type->i_mutex_key#20); [ 7322.502954]                  *** DEADLOCK *** [ 7322.502957] 2 locks held by DOM Worker/23663: [ 7322.502958]  #0:  (sb_writers#16){.+.+.+}, at: [] __sb_start_write+0xb4/0xf0 [ 7322.502963]  #1:  (&pipe->mutex/1){+.+.+.}, at: [] pipe_lock+0x1e/0x20 [ 7322.502968]                 stack backtrace: [ 7322.502971] CPU: 1 PID: 23663 Comm: DOM Worker Not tainted 4.6.6- 300.fc24.x86_64+debug #1 [ 7322.502973] Hardware name: Gigabyte Technology Co., Ltd. Z87M- D3H/Z87M-D3H, BIOS F11 08/12/2014 [ 7322.502974]  0000000000000086 00000000f800081a ffff880095f0ba90 ffffffff81458cb5 [ 7322.502978]  ffffffff82b0e9a0 ffffffff82b1a590 ffff880095f0bad0 ffffffff8110ff4e [ 7322.502981]  0000000000000002 ffff8807dd994000 0000000000000002 ffff8807dd994958 [ 7322.502984] Call Trace: [ 7322.502988]  [] dump_stack+0x86/0xc1 [ 7322.502992]  [] print_circular_bug+0x1be/0x210 [ 7322.502994]  [] __lock_acquire+0x1775/0x18e0 [ 7322.502997]  [] lock_acquire+0xfe/0x1f0 [ 7322.503021]  [] ? xfs_file_buffered_aio_write+0x6d/0x350 [xfs] [ 7322.503025]  [] mutex_lock_nested+0x86/0x400 [ 7322.503049]  [] ? xfs_file_buffered_aio_write+0x6d/0x350 [xfs] [ 7322.503071]  [] ? xfs_file_buffered_aio_write+0x6d/0x350 [xfs] [ 7322.503092]  [] xfs_file_buffered_aio_write+0x6d/0x350 [xfs] [ 7322.503095]  [] ? mark_held_locks+0x76/0xa0 [ 7322.503099]  [] ? mutex_lock_nested+0x288/0x400 [ 7322.503102]  [] ? trace_hardirqs_on_caller+0xf5/0x1b0 [ 7322.503122]  [] xfs_file_write_iter+0x141/0x160 [xfs] [ 7322.503125]  [] vfs_iter_write+0x7b/0xd0 [ 7322.503128]  [] iter_file_splice_write+0x270/0x3c0 [ 7322.503131]  [] SyS_splice+0x369/0x830 [ 7322.503134]  [] ? trace_hardirqs_on_caller+0xf5/0x1b0 [ 7322.503136]  [] entry_SYSCALL_64_fastpath+0x1f/0xbd And system freeze for while time. It possible find who is culprit from my log? Best regards, Mikhail Gavrilov --=-xbKT3wimAG4m2o36PZ3q Content-Disposition: attachment; filename="dmesg.txt" Content-Transfer-Encoding: base64 Content-Type: text/plain; name="dmesg.txt"; charset="UTF-8" WyAgICAwLjAwMDAwMF0gbWljcm9jb2RlOiBtaWNyb2NvZGUgdXBkYXRlZCBlYXJseSB0byByZXZp c2lvbiAweDIwLCBkYXRlID0gMjAxNi0wMy0xNgpbICAgIDAuMDAwMDAwXSBMaW51eCB2ZXJzaW9u IDQuNi42LTMwMC5mYzI0Lng4Nl82NCtkZWJ1ZyAobW9ja2J1aWxkQGJrZXJuZWwwMi5waHgyLmZl ZG9yYXByb2plY3Qub3JnKSAoZ2NjIHZlcnNpb24gNi4xLjEgMjAxNjA2MjEgKFJlZCBIYXQgNi4x LjEtMykgKEdDQykgKSAjMSBTTVAgV2VkIEF1ZyAxMCAyMDo0NzowOSBVVEMgMjAxNgpbICAgIDAu MDAwMDAwXSBDb21tYW5kIGxpbmU6IEJPT1RfSU1BR0U9L2Jvb3Qvdm1saW51ei00LjYuNi0zMDAu ZmMyNC54ODZfNjQrZGVidWcgcm9vdD1VVUlEPWMzOWViODY1LTJiMDYtNGNiOS04ZWQ5LTU3Njlk OTNmNjI4OSBybyByaGdiIHF1aWV0IExBTkc9ZW5fVVMuVVRGLTgKWyAgICAwLjAwMDAwMF0geDg2 L2ZwdTogeHN0YXRlX29mZnNldFsyXTogIDU3NiwgeHN0YXRlX3NpemVzWzJdOiAgMjU2ClsgICAg MC4wMDAwMDBdIHg4Ni9mcHU6IFN1cHBvcnRpbmcgWFNBVkUgZmVhdHVyZSAweDAwMTogJ3g4NyBm bG9hdGluZyBwb2ludCByZWdpc3RlcnMnClsgICAgMC4wMDAwMDBdIHg4Ni9mcHU6IFN1cHBvcnRp bmcgWFNBVkUgZmVhdHVyZSAweDAwMjogJ1NTRSByZWdpc3RlcnMnClsgICAgMC4wMDAwMDBdIHg4 Ni9mcHU6IFN1cHBvcnRpbmcgWFNBVkUgZmVhdHVyZSAweDAwNDogJ0FWWCByZWdpc3RlcnMnClsg ICAgMC4wMDAwMDBdIHg4Ni9mcHU6IEVuYWJsZWQgeHN0YXRlIGZlYXR1cmVzIDB4NywgY29udGV4 dCBzaXplIGlzIDgzMiBieXRlcywgdXNpbmcgJ3N0YW5kYXJkJyBmb3JtYXQuClsgICAgMC4wMDAw MDBdIHg4Ni9mcHU6IFVzaW5nICdlYWdlcicgRlBVIGNvbnRleHQgc3dpdGNoZXMuClsgICAgMC4w MDAwMDBdIGU4MjA6IEJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoKWyAgICAwLjAwMDAw MF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAwMDAwMDAwMC0weDAwMDAwMDAwMDAwNTdmZmZd IHVzYWJsZQpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDAwMDU4MDAw LTB4MDAwMDAwMDAwMDA1OGZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBb bWVtIDB4MDAwMDAwMDAwMDA1OTAwMC0weDAwMDAwMDAwMDAwOWVmZmZdIHVzYWJsZQpbICAgIDAu MDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDAwMDlmMDAwLTB4MDAwMDAwMDAwMDA5 ZmZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAw MDEwMDAwMC0weDAwMDAwMDAwODllZWFmZmZdIHVzYWJsZQpbICAgIDAuMDAwMDAwXSBCSU9TLWU4 MjA6IFttZW0gMHgwMDAwMDAwMDg5ZWViMDAwLTB4MDAwMDAwMDA4OWVmMWZmZl0gQUNQSSBOVlMK WyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDA4OWVmMjAwMC0weDAwMDAw MDAwOGE5YzdmZmZdIHVzYWJsZQpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAw MDAwMDhhOWM4MDAwLTB4MDAwMDAwMDA4YWYyMGZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0g QklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDA4YWYyMTAwMC0weDAwMDAwMDAwOWQ1YWNmZmZdIHVz YWJsZQpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDlkNWFkMDAwLTB4 MDAwMDAwMDA5ZDY0NGZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVt IDB4MDAwMDAwMDA5ZDY0NTAwMC0weDAwMDAwMDAwOWQ2OGJmZmZdIHVzYWJsZQpbICAgIDAuMDAw MDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDlkNjhjMDAwLTB4MDAwMDAwMDA5ZDc0N2Zm Zl0gQUNQSSBOVlMKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDA5ZDc0 ODAwMC0weDAwMDAwMDAwOWVmZmVmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJT1MtZTgy MDogW21lbSAweDAwMDAwMDAwOWVmZmYwMDAtMHgwMDAwMDAwMDllZmZmZmZmXSB1c2FibGUKWyAg ICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDA5ZjgwMDAwMC0weDAwMDAwMDAw ZGY5ZmZmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAw MDAwZjgwMDAwMDAtMHgwMDAwMDAwMGZiZmZmZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSBC SU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMGZlYzAwMDAwLTB4MDAwMDAwMDBmZWMwMGZmZl0gcmVz ZXJ2ZWQKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDBmZWQwMDAwMC0w eDAwMDAwMDAwZmVkMDNmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21l bSAweDAwMDAwMDAwZmVkMWMwMDAtMHgwMDAwMDAwMGZlZDFmZmZmXSByZXNlcnZlZApbICAgIDAu MDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMGZlZTAwMDAwLTB4MDAwMDAwMDBmZWUw MGZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDBm ZjAwMDAwMC0weDAwMDAwMDAwZmZmZmZmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJT1Mt ZTgyMDogW21lbSAweDAwMDAwMDAxMDAwMDAwMDAtMHgwMDAwMDAwODFmNWZmZmZmXSB1c2FibGUK WyAgICAwLjAwMDAwMF0gTlggKEV4ZWN1dGUgRGlzYWJsZSkgcHJvdGVjdGlvbjogYWN0aXZlClsg ICAgMC4wMDAwMDBdIGU4MjA6IHVwZGF0ZSBbbWVtIDB4ODliY2IwMTgtMHg4OWJkYjA1N10gdXNh YmxlID09PiB1c2FibGUKWyAgICAwLjAwMDAwMF0gZTgyMDogdXBkYXRlIFttZW0gMHg4OWJiYTAx OC0weDg5YmNhODU3XSB1c2FibGUgPT0+IHVzYWJsZQpbICAgIDAuMDAwMDAwXSBleHRlbmRlZCBw aHlzaWNhbCBSQU0gbWFwOgpbICAgIDAuMDAwMDAwXSByZXNlcnZlIHNldHVwX2RhdGE6IFttZW0g MHgwMDAwMDAwMDAwMDAwMDAwLTB4MDAwMDAwMDAwMDA1N2ZmZl0gdXNhYmxlClsgICAgMC4wMDAw MDBdIHJlc2VydmUgc2V0dXBfZGF0YTogW21lbSAweDAwMDAwMDAwMDAwNTgwMDAtMHgwMDAwMDAw MDAwMDU4ZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSByZXNlcnZlIHNldHVwX2RhdGE6IFtt ZW0gMHgwMDAwMDAwMDAwMDU5MDAwLTB4MDAwMDAwMDAwMDA5ZWZmZl0gdXNhYmxlClsgICAgMC4w MDAwMDBdIHJlc2VydmUgc2V0dXBfZGF0YTogW21lbSAweDAwMDAwMDAwMDAwOWYwMDAtMHgwMDAw MDAwMDAwMDlmZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSByZXNlcnZlIHNldHVwX2RhdGE6 IFttZW0gMHgwMDAwMDAwMDAwMTAwMDAwLTB4MDAwMDAwMDA4OWJiYTAxN10gdXNhYmxlClsgICAg MC4wMDAwMDBdIHJlc2VydmUgc2V0dXBfZGF0YTogW21lbSAweDAwMDAwMDAwODliYmEwMTgtMHgw MDAwMDAwMDg5YmNhODU3XSB1c2FibGUKWyAgICAwLjAwMDAwMF0gcmVzZXJ2ZSBzZXR1cF9kYXRh OiBbbWVtIDB4MDAwMDAwMDA4OWJjYTg1OC0weDAwMDAwMDAwODliY2IwMTddIHVzYWJsZQpbICAg IDAuMDAwMDAwXSByZXNlcnZlIHNldHVwX2RhdGE6IFttZW0gMHgwMDAwMDAwMDg5YmNiMDE4LTB4 MDAwMDAwMDA4OWJkYjA1N10gdXNhYmxlClsgICAgMC4wMDAwMDBdIHJlc2VydmUgc2V0dXBfZGF0 YTogW21lbSAweDAwMDAwMDAwODliZGIwNTgtMHgwMDAwMDAwMDg5ZWVhZmZmXSB1c2FibGUKWyAg ICAwLjAwMDAwMF0gcmVzZXJ2ZSBzZXR1cF9kYXRhOiBbbWVtIDB4MDAwMDAwMDA4OWVlYjAwMC0w eDAwMDAwMDAwODllZjFmZmZdIEFDUEkgTlZTClsgICAgMC4wMDAwMDBdIHJlc2VydmUgc2V0dXBf ZGF0YTogW21lbSAweDAwMDAwMDAwODllZjIwMDAtMHgwMDAwMDAwMDhhOWM3ZmZmXSB1c2FibGUK WyAgICAwLjAwMDAwMF0gcmVzZXJ2ZSBzZXR1cF9kYXRhOiBbbWVtIDB4MDAwMDAwMDA4YTljODAw MC0weDAwMDAwMDAwOGFmMjBmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIHJlc2VydmUgc2V0 dXBfZGF0YTogW21lbSAweDAwMDAwMDAwOGFmMjEwMDAtMHgwMDAwMDAwMDlkNWFjZmZmXSB1c2Fi bGUKWyAgICAwLjAwMDAwMF0gcmVzZXJ2ZSBzZXR1cF9kYXRhOiBbbWVtIDB4MDAwMDAwMDA5ZDVh ZDAwMC0weDAwMDAwMDAwOWQ2NDRmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIHJlc2VydmUg c2V0dXBfZGF0YTogW21lbSAweDAwMDAwMDAwOWQ2NDUwMDAtMHgwMDAwMDAwMDlkNjhiZmZmXSB1 c2FibGUKWyAgICAwLjAwMDAwMF0gcmVzZXJ2ZSBzZXR1cF9kYXRhOiBbbWVtIDB4MDAwMDAwMDA5 ZDY4YzAwMC0weDAwMDAwMDAwOWQ3NDdmZmZdIEFDUEkgTlZTClsgICAgMC4wMDAwMDBdIHJlc2Vy dmUgc2V0dXBfZGF0YTogW21lbSAweDAwMDAwMDAwOWQ3NDgwMDAtMHgwMDAwMDAwMDllZmZlZmZm XSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSByZXNlcnZlIHNldHVwX2RhdGE6IFttZW0gMHgwMDAw MDAwMDllZmZmMDAwLTB4MDAwMDAwMDA5ZWZmZmZmZl0gdXNhYmxlClsgICAgMC4wMDAwMDBdIHJl c2VydmUgc2V0dXBfZGF0YTogW21lbSAweDAwMDAwMDAwOWY4MDAwMDAtMHgwMDAwMDAwMGRmOWZm ZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSByZXNlcnZlIHNldHVwX2RhdGE6IFttZW0gMHgw MDAwMDAwMGY4MDAwMDAwLTB4MDAwMDAwMDBmYmZmZmZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAw MF0gcmVzZXJ2ZSBzZXR1cF9kYXRhOiBbbWVtIDB4MDAwMDAwMDBmZWMwMDAwMC0weDAwMDAwMDAw ZmVjMDBmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIHJlc2VydmUgc2V0dXBfZGF0YTogW21l bSAweDAwMDAwMDAwZmVkMDAwMDAtMHgwMDAwMDAwMGZlZDAzZmZmXSByZXNlcnZlZApbICAgIDAu MDAwMDAwXSByZXNlcnZlIHNldHVwX2RhdGE6IFttZW0gMHgwMDAwMDAwMGZlZDFjMDAwLTB4MDAw MDAwMDBmZWQxZmZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gcmVzZXJ2ZSBzZXR1cF9kYXRh OiBbbWVtIDB4MDAwMDAwMDBmZWUwMDAwMC0weDAwMDAwMDAwZmVlMDBmZmZdIHJlc2VydmVkClsg ICAgMC4wMDAwMDBdIHJlc2VydmUgc2V0dXBfZGF0YTogW21lbSAweDAwMDAwMDAwZmYwMDAwMDAt MHgwMDAwMDAwMGZmZmZmZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSByZXNlcnZlIHNldHVw X2RhdGE6IFttZW0gMHgwMDAwMDAwMTAwMDAwMDAwLTB4MDAwMDAwMDgxZjVmZmZmZl0gdXNhYmxl ClsgICAgMC4wMDAwMDBdIGVmaTogRUZJIHYyLjMxIGJ5IEFtZXJpY2FuIE1lZ2F0cmVuZHMKWyAg ICAwLjAwMDAwMF0gZWZpOiAgQUNQST0weDlkNzE0MDAwICBBQ1BJIDIuMD0weDlkNzE0MDAwICBT TUJJT1M9MHhmMDRjMCAgTVBTPTB4ZmQ0NTAgClsgICAgMC4wMDAwMDBdIFNNQklPUyAyLjcgcHJl c2VudC4KWyAgICAwLjAwMDAwMF0gRE1JOiBHaWdhYnl0ZSBUZWNobm9sb2d5IENvLiwgTHRkLiBa ODdNLUQzSC9aODdNLUQzSCwgQklPUyBGMTEgMDgvMTIvMjAxNApbICAgIDAuMDAwMDAwXSBlODIw OiB1cGRhdGUgW21lbSAweDAwMDAwMDAwLTB4MDAwMDBmZmZdIHVzYWJsZSA9PT4gcmVzZXJ2ZWQK WyAgICAwLjAwMDAwMF0gZTgyMDogcmVtb3ZlIFttZW0gMHgwMDBhMDAwMC0weDAwMGZmZmZmXSB1 c2FibGUKWyAgICAwLjAwMDAwMF0gZTgyMDogbGFzdF9wZm4gPSAweDgxZjYwMCBtYXhfYXJjaF9w Zm4gPSAweDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSBNVFJSIGRlZmF1bHQgdHlwZTogdW5jYWNo YWJsZQpbICAgIDAuMDAwMDAwXSBNVFJSIGZpeGVkIHJhbmdlcyBlbmFibGVkOgpbICAgIDAuMDAw MDAwXSAgIDAwMDAwLTlGRkZGIHdyaXRlLWJhY2sKWyAgICAwLjAwMDAwMF0gICBBMDAwMC1CRkZG RiB1bmNhY2hhYmxlClsgICAgMC4wMDAwMDBdICAgQzAwMDAtQ0ZGRkYgd3JpdGUtcHJvdGVjdApb ICAgIDAuMDAwMDAwXSAgIEQwMDAwLURGRkZGIHVuY2FjaGFibGUKWyAgICAwLjAwMDAwMF0gICBF MDAwMC1GRkZGRiB3cml0ZS1wcm90ZWN0ClsgICAgMC4wMDAwMDBdIE1UUlIgdmFyaWFibGUgcmFu Z2VzIGVuYWJsZWQ6ClsgICAgMC4wMDAwMDBdICAgMCBiYXNlIDAwMDAwMDAwMDAgbWFzayA3ODAw MDAwMDAwIHdyaXRlLWJhY2sKWyAgICAwLjAwMDAwMF0gICAxIGJhc2UgMDgwMDAwMDAwMCBtYXNr IDdGRTAwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIDIgYmFzZSAwMEMwMDAwMDAw IG1hc2sgN0ZDMDAwMDAwMCB1bmNhY2hhYmxlClsgICAgMC4wMDAwMDBdICAgMyBiYXNlIDAwQTAw MDAwMDAgbWFzayA3RkUwMDAwMDAwIHVuY2FjaGFibGUKWyAgICAwLjAwMDAwMF0gICA0IGJhc2Ug MDA5RjgwMDAwMCBtYXNrIDdGRkY4MDAwMDAgdW5jYWNoYWJsZQpbICAgIDAuMDAwMDAwXSAgIDUg YmFzZSAwODFGODAwMDAwIG1hc2sgN0ZGRjgwMDAwMCB1bmNhY2hhYmxlClsgICAgMC4wMDAwMDBd ICAgNiBiYXNlIDA4MUY2MDAwMDAgbWFzayA3RkZGRTAwMDAwIHVuY2FjaGFibGUKWyAgICAwLjAw MDAwMF0gICA3IGRpc2FibGVkClsgICAgMC4wMDAwMDBdICAgOCBkaXNhYmxlZApbICAgIDAuMDAw MDAwXSAgIDkgZGlzYWJsZWQKWyAgICAwLjAwMDAwMF0geDg2L1BBVDogQ29uZmlndXJhdGlvbiBb MC03XTogV0IgIFdDICBVQy0gVUMgIFdCICBXQyAgVUMtIFdUICAKWyAgICAwLjAwMDAwMF0gZTgy MDogdXBkYXRlIFttZW0gMHg5ZjgwMDAwMC0weGZmZmZmZmZmXSB1c2FibGUgPT0+IHJlc2VydmVk ClsgICAgMC4wMDAwMDBdIGU4MjA6IGxhc3RfcGZuID0gMHg5ZjAwMCBtYXhfYXJjaF9wZm4gPSAw eDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSBmb3VuZCBTTVAgTVAtdGFibGUgYXQgW21lbSAweDAw MGZkNzQwLTB4MDAwZmQ3NGZdIG1hcHBlZCBhdCBbZmZmZjg4MDAwMDBmZDc0MF0KWyAgICAwLjAw MDAwMF0gU2Nhbm5pbmcgMSBhcmVhcyBmb3IgbG93IG1lbW9yeSBjb3JydXB0aW9uClsgICAgMC4w MDAwMDBdIEJhc2UgbWVtb3J5IHRyYW1wb2xpbmUgYXQgW2ZmZmY4ODAwMDAwOTcwMDBdIDk3MDAw IHNpemUgMjQ1NzYKWyAgICAwLjAwMDAwMF0gVXNpbmcgR0IgcGFnZXMgZm9yIGRpcmVjdCBtYXBw aW5nClsgICAgMC4wMDAwMDBdIEJSSyBbMHgwMzJlZjAwMCwgMHgwMzJlZmZmZl0gUEdUQUJMRQpb ICAgIDAuMDAwMDAwXSBCUksgWzB4MDMyZjAwMDAsIDB4MDMyZjBmZmZdIFBHVEFCTEUKWyAgICAw LjAwMDAwMF0gQlJLIFsweDAzMmYxMDAwLCAweDAzMmYxZmZmXSBQR1RBQkxFClsgICAgMC4wMDAw MDBdIEJSSyBbMHgwMzJmMjAwMCwgMHgwMzJmMmZmZl0gUEdUQUJMRQpbICAgIDAuMDAwMDAwXSBC UksgWzB4MDMyZjMwMDAsIDB4MDMyZjNmZmZdIFBHVEFCTEUKWyAgICAwLjAwMDAwMF0gQlJLIFsw eDAzMmY0MDAwLCAweDAzMmY0ZmZmXSBQR1RBQkxFClsgICAgMC4wMDAwMDBdIFJBTURJU0s6IFtt ZW0gMHgzZWU0ZjAwMC0weDNmZmZhZmZmXQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBFYXJseSB0YWJs ZSBjaGVja3N1bSB2ZXJpZmljYXRpb24gZGlzYWJsZWQKWyAgICAwLjAwMDAwMF0gQUNQSTogUlNE UCAweDAwMDAwMDAwOUQ3MTQwMDAgMDAwMDI0ICh2MDIgQUxBU0tBKQpbICAgIDAuMDAwMDAwXSBB Q1BJOiBYU0RUIDB4MDAwMDAwMDA5RDcxNDA4MCAwMDAwN0MgKHYwMSBBTEFTS0EgQSBNIEkgICAg MDEwNzIwMDkgQU1JICAwMDAxMDAxMykKWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUCAweDAwMDAw MDAwOUQ3MjBFMjAgMDAwMTBDICh2MDUgQUxBU0tBIEEgTSBJICAgIDAxMDcyMDA5IEFNSSAgMDAw MTAwMTMpClsgICAgMC4wMDAwMDBdIEFDUEk6IERTRFQgMHgwMDAwMDAwMDlENzE0MTkwIDAwQ0M4 RCAodjAyIEFMQVNLQSBBIE0gSSAgICAwMDAwMDA4OCBJTlRMIDIwMDkxMTEyKQpbICAgIDAuMDAw MDAwXSBBQ1BJOiBGQUNTIDB4MDAwMDAwMDA5RDc0NjA4MCAwMDAwNDAKWyAgICAwLjAwMDAwMF0g QUNQSTogQVBJQyAweDAwMDAwMDAwOUQ3MjBGMzAgMDAwMDkyICh2MDMgQUxBU0tBIEEgTSBJICAg IDAxMDcyMDA5IEFNSSAgMDAwMTAwMTMpClsgICAgMC4wMDAwMDBdIEFDUEk6IEZQRFQgMHgwMDAw MDAwMDlENzIwRkM4IDAwMDA0NCAodjAxIEFMQVNLQSBBIE0gSSAgICAwMTA3MjAwOSBBTUkgIDAw MDEwMDEzKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBTU0RUIDB4MDAwMDAwMDA5RDcyMTAxMCAwMDA1 MzkgKHYwMSBQbVJlZiAgQ3B1MElzdCAgMDAwMDMwMDAgSU5UTCAyMDEyMDcxMSkKWyAgICAwLjAw MDAwMF0gQUNQSTogU1NEVCAweDAwMDAwMDAwOUQ3MjE1NTAgMDAwQUQ4ICh2MDEgUG1SZWYgIENw dVBtICAgIDAwMDAzMDAwIElOVEwgMjAxMjA3MTEpClsgICAgMC4wMDAwMDBdIEFDUEk6IE1DRkcg MHgwMDAwMDAwMDlENzIyMDI4IDAwMDAzQyAodjAxIEFMQVNLQSBBIE0gSSAgICAwMTA3MjAwOSBN U0ZUIDAwMDAwMDk3KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBIUEVUIDB4MDAwMDAwMDA5RDcyMjA2 OCAwMDAwMzggKHYwMSBBTEFTS0EgQSBNIEkgICAgMDEwNzIwMDkgQU1JLiAwMDAwMDAwNSkKWyAg ICAwLjAwMDAwMF0gQUNQSTogU1NEVCAweDAwMDAwMDAwOUQ3MjIwQTAgMDAwMzZEICh2MDEgU2F0 YVJlIFNhdGFUYWJsIDAwMDAxMDAwIElOVEwgMjAxMjA3MTEpClsgICAgMC4wMDAwMDBdIEFDUEk6 IFNTRFQgMHgwMDAwMDAwMDlENzIyNDEwIDAwMzRFMSAodjAxIFNhU3NkdCBTYVNzZHQgICAwMDAw MzAwMCBJTlRMIDIwMDkxMTEyKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBCR1JUIDB4MDAwMDAwMDA5 RDcyNThGOCAwMDAwMzggKHYwMCBBTEFTS0EgQSBNIEkgICAgMDEwNzIwMDkgQU1JICAwMDAxMDAx MykKWyAgICAwLjAwMDAwMF0gQUNQSTogRE1BUiAweDAwMDAwMDAwOUQ3MjU5MzAgMDAwMEE4ICh2 MDEgSU5URUwgIEhTVyAgICAgIDAwMDAwMDAxIElOVEwgMDAwMDAwMDEpClsgICAgMC4wMDAwMDBd IEFDUEk6IExvY2FsIEFQSUMgYWRkcmVzcyAweGZlZTAwMDAwClsgICAgMC4wMDAwMDBdIE5vIE5V TUEgY29uZmlndXJhdGlvbiBmb3VuZApbICAgIDAuMDAwMDAwXSBGYWtpbmcgYSBub2RlIGF0IFtt ZW0gMHgwMDAwMDAwMDAwMDAwMDAwLTB4MDAwMDAwMDgxZjVmZmZmZl0KWyAgICAwLjAwMDAwMF0g Tk9ERV9EQVRBKDApIGFsbG9jYXRlZCBbbWVtIDB4ODFmNWU0MDAwLTB4ODFmNWZhZmZmXQpbICAg IDAuMDAwMDAwXSBab25lIHJhbmdlczoKWyAgICAwLjAwMDAwMF0gICBETUEgICAgICBbbWVtIDB4 MDAwMDAwMDAwMDAwMTAwMC0weDAwMDAwMDAwMDBmZmZmZmZdClsgICAgMC4wMDAwMDBdICAgRE1B MzIgICAgW21lbSAweDAwMDAwMDAwMDEwMDAwMDAtMHgwMDAwMDAwMGZmZmZmZmZmXQpbICAgIDAu MDAwMDAwXSAgIE5vcm1hbCAgIFttZW0gMHgwMDAwMDAwMTAwMDAwMDAwLTB4MDAwMDAwMDgxZjVm ZmZmZl0KWyAgICAwLjAwMDAwMF0gICBEZXZpY2UgICBlbXB0eQpbICAgIDAuMDAwMDAwXSBNb3Zh YmxlIHpvbmUgc3RhcnQgZm9yIGVhY2ggbm9kZQpbICAgIDAuMDAwMDAwXSBFYXJseSBtZW1vcnkg bm9kZSByYW5nZXMKWyAgICAwLjAwMDAwMF0gICBub2RlICAgMDogW21lbSAweDAwMDAwMDAwMDAw MDEwMDAtMHgwMDAwMDAwMDAwMDU3ZmZmXQpbICAgIDAuMDAwMDAwXSAgIG5vZGUgICAwOiBbbWVt IDB4MDAwMDAwMDAwMDA1OTAwMC0weDAwMDAwMDAwMDAwOWVmZmZdClsgICAgMC4wMDAwMDBdICAg bm9kZSAgIDA6IFttZW0gMHgwMDAwMDAwMDAwMTAwMDAwLTB4MDAwMDAwMDA4OWVlYWZmZl0KWyAg ICAwLjAwMDAwMF0gICBub2RlICAgMDogW21lbSAweDAwMDAwMDAwODllZjIwMDAtMHgwMDAwMDAw MDhhOWM3ZmZmXQpbICAgIDAuMDAwMDAwXSAgIG5vZGUgICAwOiBbbWVtIDB4MDAwMDAwMDA4YWYy MTAwMC0weDAwMDAwMDAwOWQ1YWNmZmZdClsgICAgMC4wMDAwMDBdICAgbm9kZSAgIDA6IFttZW0g MHgwMDAwMDAwMDlkNjQ1MDAwLTB4MDAwMDAwMDA5ZDY4YmZmZl0KWyAgICAwLjAwMDAwMF0gICBu b2RlICAgMDogW21lbSAweDAwMDAwMDAwOWVmZmYwMDAtMHgwMDAwMDAwMDllZmZmZmZmXQpbICAg IDAuMDAwMDAwXSAgIG5vZGUgICAwOiBbbWVtIDB4MDAwMDAwMDEwMDAwMDAwMC0weDAwMDAwMDA4 MWY1ZmZmZmZdClsgICAgMC4wMDAwMDBdIEluaXRtZW0gc2V0dXAgbm9kZSAwIFttZW0gMHgwMDAw MDAwMDAwMDAxMDAwLTB4MDAwMDAwMDgxZjVmZmZmZl0KWyAgICAwLjAwMDAwMF0gT24gbm9kZSAw IHRvdGFscGFnZXM6IDgxMTE2NjYKWyAgICAwLjAwMDAwMF0gICBETUEgem9uZTogNjQgcGFnZXMg dXNlZCBmb3IgbWVtbWFwClsgICAgMC4wMDAwMDBdICAgRE1BIHpvbmU6IDI0IHBhZ2VzIHJlc2Vy dmVkClsgICAgMC4wMDAwMDBdICAgRE1BIHpvbmU6IDM5OTcgcGFnZXMsIExJRk8gYmF0Y2g6MApb ICAgIDAuMDAwMDAwXSAgIERNQTMyIHpvbmU6IDk5ODcgcGFnZXMgdXNlZCBmb3IgbWVtbWFwClsg ICAgMC4wMDAwMDBdICAgRE1BMzIgem9uZTogNjM5MTI1IHBhZ2VzLCBMSUZPIGJhdGNoOjMxClsg ICAgMC4wMDAwMDBdICAgTm9ybWFsIHpvbmU6IDExNjY5NiBwYWdlcyB1c2VkIGZvciBtZW1tYXAK WyAgICAwLjAwMDAwMF0gICBOb3JtYWwgem9uZTogNzQ2ODU0NCBwYWdlcywgTElGTyBiYXRjaDoz MQpbICAgIDAuMDAwMDAwXSB0Ym9vdDogbm9uLTAgdGJvb3RfYWRkciBidXQgaXQgaXMgbm90IG9m IHR5cGUgRTgyMF9SRVNFUlZFRApbICAgIDAuMDAwMDAwXSBSZXNlcnZpbmcgSW50ZWwgZ3JhcGhp Y3Mgc3RvbGVuIG1lbW9yeSBhdCAweDlmYTAwMDAwLTB4YzE5ZmZmZmYKWyAgICAwLjAwMDAwMF0g QUNQSTogUE0tVGltZXIgSU8gUG9ydDogMHgxODA4ClsgICAgMC4wMDAwMDBdIEFDUEk6IExvY2Fs IEFQSUMgYWRkcmVzcyAweGZlZTAwMDAwClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAo YWNwaV9pZFsweGZmXSBoaWdoIGVkZ2UgbGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBJT0FQSUNb MF06IGFwaWNfaWQgOCwgdmVyc2lvbiAzMiwgYWRkcmVzcyAweGZlYzAwMDAwLCBHU0kgMC0yMwpb ICAgIDAuMDAwMDAwXSBBQ1BJOiBJTlRfU1JDX09WUiAoYnVzIDAgYnVzX2lycSAwIGdsb2JhbF9p cnEgMiBkZmwgZGZsKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJTlRfU1JDX09WUiAoYnVzIDAgYnVz X2lycSA5IGdsb2JhbF9pcnEgOSBoaWdoIGxldmVsKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJUlEw IHVzZWQgYnkgb3ZlcnJpZGUuClsgICAgMC4wMDAwMDBdIEFDUEk6IElSUTkgdXNlZCBieSBvdmVy cmlkZS4KWyAgICAwLjAwMDAwMF0gVXNpbmcgQUNQSSAoTUFEVCkgZm9yIFNNUCBjb25maWd1cmF0 aW9uIGluZm9ybWF0aW9uClsgICAgMC4wMDAwMDBdIEFDUEk6IEhQRVQgaWQ6IDB4ODA4NmE3MDEg YmFzZTogMHhmZWQwMDAwMApbICAgIDAuMDAwMDAwXSBzbXBib290OiBBbGxvd2luZyA4IENQVXMs IDAgaG90cGx1ZyBDUFVzClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1v cnk6IFttZW0gMHgwMDAwMDAwMC0weDAwMDAwZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0 ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4MDAwNTgwMDAtMHgwMDA1OGZmZl0KWyAgICAwLjAw MDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDAwMDlmMDAwLTB4MDAw OWZmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0g MHgwMDBhMDAwMC0weDAwMGZmZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3Nh dmUgbWVtb3J5OiBbbWVtIDB4ODliYmEwMDAtMHg4OWJiYWZmZl0KWyAgICAwLjAwMDAwMF0gUE06 IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDg5YmNhMDAwLTB4ODliY2FmZmZdClsg ICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHg4OWJjYjAw MC0weDg5YmNiZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5 OiBbbWVtIDB4ODliZGIwMDAtMHg4OWJkYmZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVy ZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDg5ZWViMDAwLTB4ODllZjFmZmZdClsgICAgMC4wMDAw MDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHg4YTljODAwMC0weDhhZjIw ZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4 OWQ1YWQwMDAtMHg5ZDY0NGZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZl IG1lbW9yeTogW21lbSAweDlkNjhjMDAwLTB4OWQ3NDdmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBS ZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHg5ZDc0ODAwMC0weDllZmZlZmZmXQpbICAg IDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4OWYwMDAwMDAt MHg5ZjdmZmZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTog W21lbSAweDlmODAwMDAwLTB4ZGY5ZmZmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVk IG5vc2F2ZSBtZW1vcnk6IFttZW0gMHhkZmEwMDAwMC0weGY3ZmZmZmZmXQpbICAgIDAuMDAwMDAw XSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4ZjgwMDAwMDAtMHhmYmZmZmZm Zl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweGZj MDAwMDAwLTB4ZmViZmZmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBt ZW1vcnk6IFttZW0gMHhmZWMwMDAwMC0weGZlYzAwZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVn aXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4ZmVjMDEwMDAtMHhmZWNmZmZmZl0KWyAgICAw LjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweGZlZDAwMDAwLTB4 ZmVkMDNmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFtt ZW0gMHhmZWQwNDAwMC0weGZlZDFiZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBu b3NhdmUgbWVtb3J5OiBbbWVtIDB4ZmVkMWMwMDAtMHhmZWQxZmZmZl0KWyAgICAwLjAwMDAwMF0g UE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweGZlZDIwMDAwLTB4ZmVkZmZmZmZd ClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHhmZWUw MDAwMC0weGZlZTAwZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVt b3J5OiBbbWVtIDB4ZmVlMDEwMDAtMHhmZWZmZmZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lz dGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweGZmMDAwMDAwLTB4ZmZmZmZmZmZdClsgICAgMC4w MDAwMDBdIGU4MjA6IFttZW0gMHhkZmEwMDAwMC0weGY3ZmZmZmZmXSBhdmFpbGFibGUgZm9yIFBD SSBkZXZpY2VzClsgICAgMC4wMDAwMDBdIEJvb3RpbmcgcGFyYXZpcnR1YWxpemVkIGtlcm5lbCBv biBiYXJlIGhhcmR3YXJlClsgICAgMC4wMDAwMDBdIGNsb2Nrc291cmNlOiByZWZpbmVkLWppZmZp ZXM6IG1hc2s6IDB4ZmZmZmZmZmYgbWF4X2N5Y2xlczogMHhmZmZmZmZmZiwgbWF4X2lkbGVfbnM6 IDE5MTA5Njk5NDAzOTE0MTkgbnMKWyAgICAwLjAwMDAwMF0gc2V0dXBfcGVyY3B1OiBOUl9DUFVT OjEwMjQgbnJfY3B1bWFza19iaXRzOjggbnJfY3B1X2lkczo4IG5yX25vZGVfaWRzOjEKWyAgICAw LjAwMDAwMF0gcGVyY3B1OiBFbWJlZGRlZCA0ODMgcGFnZXMvY3B1IEBmZmZmODgwN2ZlYzAwMDAw IHMxOTM4MzI4IHI4MTkyIGQzMTg0OCB1MjA5NzE1MgpbICAgIDAuMDAwMDAwXSBwY3B1LWFsbG9j OiBzMTkzODMyOCByODE5MiBkMzE4NDggdTIwOTcxNTIgYWxsb2M9MSoyMDk3MTUyClsgICAgMC4w MDAwMDBdIHBjcHUtYWxsb2M6IFswXSAwIFswXSAxIFswXSAyIFswXSAzIFswXSA0IFswXSA1IFsw XSA2IFswXSA3IApbICAgIDAuMDAwMDAwXSBCdWlsdCAxIHpvbmVsaXN0cyBpbiBOb2RlIG9yZGVy LCBtb2JpbGl0eSBncm91cGluZyBvbi4gIFRvdGFsIHBhZ2VzOiA3OTg0ODk1ClsgICAgMC4wMDAw MDBdIFBvbGljeSB6b25lOiBOb3JtYWwKWyAgICAwLjAwMDAwMF0gS2VybmVsIGNvbW1hbmQgbGlu ZTogQk9PVF9JTUFHRT0vYm9vdC92bWxpbnV6LTQuNi42LTMwMC5mYzI0Lng4Nl82NCtkZWJ1ZyBy b290PVVVSUQ9YzM5ZWI4NjUtMmIwNi00Y2I5LThlZDktNTc2OWQ5M2Y2Mjg5IHJvIHJoZ2IgcXVp ZXQgTEFORz1lbl9VUy5VVEYtOApbICAgIDAuMDAwMDAwXSBQSUQgaGFzaCB0YWJsZSBlbnRyaWVz OiA0MDk2IChvcmRlcjogMywgMzI3NjggYnl0ZXMpClsgICAgMC4wMDAwMDBdIE1lbW9yeTogMzE1 NjcyNjRLLzMyNDQ2NjY0SyBhdmFpbGFibGUgKDkwNDdLIGtlcm5lbCBjb2RlLCAxNTE5SyByd2Rh dGEsIDM0NjRLIHJvZGF0YSwgMzU5NksgaW5pdCwgMTYyODBLIGJzcywgODc5NDAwSyByZXNlcnZl ZCwgMEsgY21hLXJlc2VydmVkKQpbICAgIDAuMDAwMDAwXSBTTFVCOiBIV2FsaWduPTY0LCBPcmRl cj0wLTMsIE1pbk9iamVjdHM9MCwgQ1BVcz04LCBOb2Rlcz0xClsgICAgMC4wMDAwMDBdIFJ1bm5p bmcgUkNVIHNlbGYgdGVzdHMKWyAgICAwLjAwMDAwMF0gSGllcmFyY2hpY2FsIFJDVSBpbXBsZW1l bnRhdGlvbi4KWyAgICAwLjAwMDAwMF0gCVJDVSBsb2NrZGVwIGNoZWNraW5nIGlzIGVuYWJsZWQu ClsgICAgMC4wMDAwMDBdIAlCdWlsZC10aW1lIGFkanVzdG1lbnQgb2YgbGVhZiBmYW5vdXQgdG8g NjQuClsgICAgMC4wMDAwMDBdIAlSQ1UgcmVzdHJpY3RpbmcgQ1BVcyBmcm9tIE5SX0NQVVM9MTAy NCB0byBucl9jcHVfaWRzPTguClsgICAgMC4wMDAwMDBdIFJDVTogQWRqdXN0aW5nIGdlb21ldHJ5 IGZvciByY3VfZmFub3V0X2xlYWY9NjQsIG5yX2NwdV9pZHM9OApbICAgIDAuMDAwMDAwXSBrbWVt bGVhazogS2VybmVsIG1lbW9yeSBsZWFrIGRldGVjdG9yIGRpc2FibGVkClsgICAgMC4wMDAwMDBd IE5SX0lSUVM6NjU3OTIgbnJfaXJxczo0ODggMTYKWyAgICAwLjAwMDAwMF0gCU9mZmxvYWQgUkNV IGNhbGxiYWNrcyBmcm9tIGFsbCBDUFVzClsgICAgMC4wMDAwMDBdIAlPZmZsb2FkIFJDVSBjYWxs YmFja3MgZnJvbSBDUFVzOiAwLTcuClsgICAgMC4wMDAwMDBdIENvbnNvbGU6IGNvbG91ciBkdW1t eSBkZXZpY2UgODB4MjUKWyAgICAwLjAwMDAwMF0gY29uc29sZSBbdHR5MF0gZW5hYmxlZApbICAg IDAuMDAwMDAwXSBMb2NrIGRlcGVuZGVuY3kgdmFsaWRhdG9yOiBDb3B5cmlnaHQgKGMpIDIwMDYg UmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKWyAgICAwLjAwMDAwMF0gLi4uIE1BWF9MT0NLREVQ X1NVQkNMQVNTRVM6ICA4ClsgICAgMC4wMDAwMDBdIC4uLiBNQVhfTE9DS19ERVBUSDogICAgICAg ICAgNDgKWyAgICAwLjAwMDAwMF0gLi4uIE1BWF9MT0NLREVQX0tFWVM6ICAgICAgICA4MTkxClsg ICAgMC4wMDAwMDBdIC4uLiBDTEFTU0hBU0hfU0laRTogICAgICAgICAgNDA5NgpbICAgIDAuMDAw MDAwXSAuLi4gTUFYX0xPQ0tERVBfRU5UUklFUzogICAgIDMyNzY4ClsgICAgMC4wMDAwMDBdIC4u LiBNQVhfTE9DS0RFUF9DSEFJTlM6ICAgICAgNjU1MzYKWyAgICAwLjAwMDAwMF0gLi4uIENIQUlO SEFTSF9TSVpFOiAgICAgICAgICAzMjc2OApbICAgIDAuMDAwMDAwXSAgbWVtb3J5IHVzZWQgYnkg bG9jayBkZXBlbmRlbmN5IGluZm86IDg2NzEga0IKWyAgICAwLjAwMDAwMF0gIHBlciB0YXNrLXN0 cnVjdCBtZW1vcnkgZm9vdHByaW50OiAyNjg4IGJ5dGVzClsgICAgMC4wMDAwMDBdIGNsb2Nrc291 cmNlOiBocGV0OiBtYXNrOiAweGZmZmZmZmZmIG1heF9jeWNsZXM6IDB4ZmZmZmZmZmYsIG1heF9p ZGxlX25zOiAxMzM0ODQ4ODI4NDggbnMKWyAgICAwLjAwMDAwMF0gaHBldCBjbG9ja2V2ZW50IHJl Z2lzdGVyZWQKWyAgICAwLjAwMDAwMF0gdHNjOiBGYXN0IFRTQyBjYWxpYnJhdGlvbiB1c2luZyBQ SVQKWyAgICAwLjAwMDAwMF0gc3B1cmlvdXMgODI1OUEgaW50ZXJydXB0OiBJUlE3LgpbICAgIDAu MDAwMDAwXSB0c2M6IERldGVjdGVkIDMzOTIuMzM2IE1IeiBwcm9jZXNzb3IKWyAgICAwLjAwMDA0 OV0gQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAoc2tpcHBlZCksIHZhbHVlIGNhbGN1bGF0ZWQgdXNp bmcgdGltZXIgZnJlcXVlbmN5Li4gNjc4NC42NyBCb2dvTUlQUyAobHBqPTMzOTIzMzYpClsgICAg MC4wMDAwNTJdIHBpZF9tYXg6IGRlZmF1bHQ6IDMyNzY4IG1pbmltdW06IDMwMQpbICAgIDAuMDAw MDY0XSBBQ1BJOiBDb3JlIHJldmlzaW9uIDIwMTYwMTA4ClsgICAgMC4wMjM0MDldIEFDUEk6IDUg QUNQSSBBTUwgdGFibGVzIHN1Y2Nlc3NmdWxseSBhY3F1aXJlZCBhbmQgbG9hZGVkCgpbICAgIDAu MDIzODE4XSAtLS1bIFVzZXIgU3BhY2UgXS0tLQpbICAgIDAuMDIzODIwXSAweDAwMDAwMDAwMDAw MDAwMDAtMHgwMDAwMDAwMDAwMDU4MDAwICAgICAgICAgMzUySyAgICAgUlcgICAgICAgICAgICAg ICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyMzgyNF0gMHgwMDAwMDAwMDAwMDU4MDAwLTB4MDAwMDAw MDAwMDA1OTAwMCAgICAgICAgICAgNEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRl ClsgICAgMC4wMjM4MjZdIDB4MDAwMDAwMDAwMDA1OTAwMC0weDAwMDAwMDAwMDAwOWYwMDAgICAg ICAgICAyODBLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDIzODMw XSAweDAwMDAwMDAwMDAwOWYwMDAtMHgwMDAwMDAwMDAwMTAwMDAwICAgICAgICAgMzg4SyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyMzgzMl0gMHgwMDAwMDAwMDAw MTAwMDAwLTB4MDAwMDAwMDAwMDIwMDAwMCAgICAgICAgICAgMU0gICAgIFJXICAgICAgICAgICAg ICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjM4MzZdIDB4MDAwMDAwMDAwMDIwMDAwMC0weDAwMDAw MDAwMDEwMDAwMDAgICAgICAgICAgMTRNICAgICBSVyAgICAgICAgIFBTRSAgICAgICAgIHggIHBt ZApbICAgIDAuMDIzODM5XSAweDAwMDAwMDAwMDEwMDAwMDAtMHgwMDAwMDAwMDAxODAwMDAwICAg ICAgICAgICA4TSAgICAgUlcgICAgICAgICBQU0UgICAgIEdMQiB4ICBwbWQKWyAgICAwLjAyMzg0 NV0gMHgwMDAwMDAwMDAxODAwMDAwLTB4MDAwMDAwMDAwMWEwMDAwMCAgICAgICAgICAgMk0gICAg IFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjM4NDhdIDB4MDAwMDAwMDAw MWEwMDAwMC0weDAwMDAwMDAwMDMyMDAwMDAgICAgICAgICAgMjRNICAgICBSVyAgICAgICAgIFBT RSAgICAgICAgIHggIHBtZApbICAgIDAuMDIzODU0XSAweDAwMDAwMDAwMDMyMDAwMDAtMHgwMDAw MDAwMDAzNDAwMDAwICAgICAgICAgICAyTSAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBw dGUKWyAgICAwLjAyMzg3N10gMHgwMDAwMDAwMDAzNDAwMDAwLTB4MDAwMDAwMDAzZWUwMDAwMCAg ICAgICAgIDk1NE0gICAgIFJXICAgICAgICAgUFNFICAgICAgICAgeCAgcG1kClsgICAgMC4wMjM4 ODJdIDB4MDAwMDAwMDAzZWUwMDAwMC0weDAwMDAwMDAwM2YwMDAwMDAgICAgICAgICAgIDJNICAg ICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDIzODg3XSAweDAwMDAwMDAw M2YwMDAwMDAtMHgwMDAwMDAwMDYzNDAwMDAwICAgICAgICAgNTgwTSAgICAgUlcgICAgICAgICBQ U0UgICAgICAgICB4ICBwbWQKWyAgICAwLjAyMzg5Ml0gMHgwMDAwMDAwMDYzNDAwMDAwLTB4MDAw MDAwMDA2MzYwMDAwMCAgICAgICAgICAgMk0gICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAg cHRlClsgICAgMC4wMjM4OTddIDB4MDAwMDAwMDA2MzYwMDAwMC0weDAwMDAwMDAwODcwMDAwMDAg ICAgICAgICA1NzBNICAgICBSVyAgICAgICAgIFBTRSAgICAgICAgIHggIHBtZApbICAgIDAuMDIz OTAzXSAweDAwMDAwMDAwODcwMDAwMDAtMHgwMDAwMDAwMDg3MjAwMDAwICAgICAgICAgICAyTSAg ICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyMzkwNl0gMHgwMDAwMDAw MDg3MjAwMDAwLTB4MDAwMDAwMDA4OWEwMDAwMCAgICAgICAgICA0ME0gICAgIFJXICAgICAgICAg UFNFICAgICAgICAgeCAgcG1kClsgICAgMC4wMjM5MTVdIDB4MDAwMDAwMDA4OWEwMDAwMC0weDAw MDAwMDAwODllZWIwMDAgICAgICAgIDUwMzZLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHgg IHB0ZQpbICAgIDAuMDIzOTE4XSAweDAwMDAwMDAwODllZWIwMDAtMHgwMDAwMDAwMDg5ZWYyMDAw ICAgICAgICAgIDI4SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAy MzkyM10gMHgwMDAwMDAwMDg5ZWYyMDAwLTB4MDAwMDAwMDA4YTIwMDAwMCAgICAgICAgMzEyOEsg ICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjM5MjZdIDB4MDAwMDAw MDA4YTIwMDAwMC0weDAwMDAwMDAwOGE4MDAwMDAgICAgICAgICAgIDZNICAgICBSVyAgICAgICAg IFBTRSAgICAgICAgIHggIHBtZApbICAgIDAuMDIzOTMyXSAweDAwMDAwMDAwOGE4MDAwMDAtMHgw MDAwMDAwMDhhYTAwMDAwICAgICAgICAgICAyTSAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4 ICBwdGUKWyAgICAwLjAyMzkzNV0gMHgwMDAwMDAwMDhhYTAwMDAwLTB4MDAwMDAwMDA4YWUwMDAw MCAgICAgICAgICAgNE0gICAgIFJXICAgICAgICAgUFNFICAgICAgICAgeCAgcG1kClsgICAgMC4w MjM5NDBdIDB4MDAwMDAwMDA4YWUwMDAwMC0weDAwMDAwMDAwOGIwMDAwMDAgICAgICAgICAgIDJN ICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDIzOTQ0XSAweDAwMDAw MDAwOGIwMDAwMDAtMHgwMDAwMDAwMDhlNjAwMDAwICAgICAgICAgIDU0TSAgICAgUlcgICAgICAg ICBQU0UgICAgICAgICB4ICBwbWQKWyAgICAwLjAyMzk3Ml0gMHgwMDAwMDAwMDhlNjAwMDAwLTB4 MDAwMDAwMDA4ZmUwMDAwMCAgICAgICAgICAyNE0gICAgIFJXICAgICAgICAgICAgICAgICBHTEIg eCAgcHRlClsgICAgMC4wMjM5NzZdIDB4MDAwMDAwMDA4ZmUwMDAwMC0weDAwMDAwMDAwOTAwMDAw MDAgICAgICAgICAgIDJNICAgICBSVyAgICAgICAgIFBTRSAgICAgICAgIHggIHBtZApbICAgIDAu MDIzOTg3XSAweDAwMDAwMDAwOTAwMDAwMDAtMHgwMDAwMDAwMDkwODAwMDAwICAgICAgICAgICA4 TSAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyMzk5MV0gMHgwMDAw MDAwMDkwODAwMDAwLTB4MDAwMDAwMDA5YTgwMDAwMCAgICAgICAgIDE2ME0gICAgIFJXICAgICAg ICAgUFNFICAgICAgICAgeCAgcG1kClsgICAgMC4wMjM5OTddIDB4MDAwMDAwMDA5YTgwMDAwMC0w eDAwMDAwMDAwOWFhMDAwMDAgICAgICAgICAgIDJNICAgICBSVyAgICAgICAgICAgICAgICAgR0xC IHggIHB0ZQpbICAgIDAuMDI0MDAwXSAweDAwMDAwMDAwOWFhMDAwMDAtMHgwMDAwMDAwMDljNjAw MDAwICAgICAgICAgIDI4TSAgICAgUlcgICAgICAgICBQU0UgICAgICAgICB4ICBwbWQKWyAgICAw LjAyNDAwNV0gMHgwMDAwMDAwMDljNjAwMDAwLTB4MDAwMDAwMDA5YzgwMDAwMCAgICAgICAgICAg Mk0gICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQwMDldIDB4MDAw MDAwMDA5YzgwMDAwMC0weDAwMDAwMDAwOWQyMDAwMDAgICAgICAgICAgMTBNICAgICBSVyAgICAg ICAgIFBTRSAgICAgICAgIHggIHBtZApbICAgIDAuMDI0MDE2XSAweDAwMDAwMDAwOWQyMDAwMDAt MHgwMDAwMDAwMDlkNWFkMDAwICAgICAgICAzNzY0SyAgICAgUlcgICAgICAgICAgICAgICAgIEdM QiB4ICBwdGUKWyAgICAwLjAyNDAyMF0gMHgwMDAwMDAwMDlkNWFkMDAwLTB4MDAwMDAwMDA5ZDY0 NTAwMCAgICAgICAgIDYwOEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAg MC4wMjQwMjJdIDB4MDAwMDAwMDA5ZDY0NTAwMC0weDAwMDAwMDAwOWQ2OGMwMDAgICAgICAgICAy ODRLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0MDI2XSAweDAw MDAwMDAwOWQ2OGMwMDAtMHgwMDAwMDAwMDlkNzQ4MDAwICAgICAgICAgNzUySyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDAyOF0gMHgwMDAwMDAwMDlkNzQ4MDAw LTB4MDAwMDAwMDA5ZDgwMDAwMCAgICAgICAgIDczNksgICAgIFJXICAgICAgICAgICAgICAgICBH TEIgeCAgcHRlClsgICAgMC4wMjQwMzFdIDB4MDAwMDAwMDA5ZDgwMDAwMC0weDAwMDAwMDAwOWVl MDAwMDAgICAgICAgICAgMjJNICAgICBSVyAgICAgICAgIFBTRSAgICAgICAgIHggIHBtZApbICAg IDAuMDI0MDM3XSAweDAwMDAwMDAwOWVlMDAwMDAtMHgwMDAwMDAwMDlmMDAwMDAwICAgICAgICAg ICAyTSAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDA0MF0gMHgw MDAwMDAwMDlmMDAwMDAwLTB4MDAwMDAwMDA5ZjgwMDAwMCAgICAgICAgICAgOE0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcG1kClsgICAgMC4wMjQwNDRdIDB4MDAwMDAwMDA5ZjgwMDAw MC0weDAwMDAwMDAwZGZhMDAwMDAgICAgICAgIDEwMjZNICAgICBSVyAgICAgUENEIFBTRSAgICAg ICAgIHggIHBtZApbICAgIDAuMDI0MDQ4XSAweDAwMDAwMDAwZGZhMDAwMDAtMHgwMDAwMDAwMGY4 MDAwMDAwICAgICAgICAgMzkwTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWQKWyAg ICAwLjAyNDA1MF0gMHgwMDAwMDAwMGY4MDAwMDAwLTB4MDAwMDAwMDBmYzAwMDAwMCAgICAgICAg ICA2NE0gICAgIFJXICAgICBQQ0QgUFNFICAgICAgICAgeCAgcG1kClsgICAgMC4wMjQwNTNdIDB4 MDAwMDAwMDBmYzAwMDAwMC0weDAwMDAwMDAwZmVjMDAwMDAgICAgICAgICAgNDRNICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBtZApbICAgIDAuMDI0MDU1XSAweDAwMDAwMDAwZmVjMDAw MDAtMHgwMDAwMDAwMGZlYzAxMDAwICAgICAgICAgICA0SyAgICAgUlcgICAgIFBDRCAgICAgICAg IEdMQiB4ICBwdGUKWyAgICAwLjAyNDA1OV0gMHgwMDAwMDAwMGZlYzAxMDAwLTB4MDAwMDAwMDBm ZWQwMDAwMCAgICAgICAgMTAyMEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsg ICAgMC4wMjQwNjFdIDB4MDAwMDAwMDBmZWQwMDAwMC0weDAwMDAwMDAwZmVkMDQwMDAgICAgICAg ICAgMTZLICAgICBSVyAgICAgUENEICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0MDY0XSAw eDAwMDAwMDAwZmVkMDQwMDAtMHgwMDAwMDAwMGZlZDFjMDAwICAgICAgICAgIDk2SyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDA2NV0gMHgwMDAwMDAwMGZlZDFj MDAwLTB4MDAwMDAwMDBmZWQyMDAwMCAgICAgICAgICAxNksgICAgIFJXICAgICBQQ0QgICAgICAg ICBHTEIgeCAgcHRlClsgICAgMC4wMjQwNzBdIDB4MDAwMDAwMDBmZWQyMDAwMC0weDAwMDAwMDAw ZmVlMDAwMDAgICAgICAgICA4OTZLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpb ICAgIDAuMDI0MDcxXSAweDAwMDAwMDAwZmVlMDAwMDAtMHgwMDAwMDAwMGZlZTAxMDAwICAgICAg ICAgICA0SyAgICAgUlcgICAgIFBDRCAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDA3N10g MHgwMDAwMDAwMGZlZTAxMDAwLTB4MDAwMDAwMDBmZjAwMDAwMCAgICAgICAgMjA0NEsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQwNzhdIDB4MDAwMDAwMDBmZjAw MDAwMC0weDAwMDAwMDAxMDAwMDAwMDAgICAgICAgICAgMTZNICAgICBSVyAgICAgUENEIFBTRSAg ICAgICAgIHggIHBtZApbICAgIDAuMDI0MDgyXSAweDAwMDAwMDAxMDAwMDAwMDAtMHgwMDAwMDAw ODAwMDAwMDAwICAgICAgICAgIDI4RyAgICAgUlcgICAgICAgICBQU0UgICAgICAgICB4ICBwdWQK WyAgICAwLjAyNDA4Nl0gMHgwMDAwMDAwODAwMDAwMDAwLTB4MDAwMDAwMDgxZjYwMDAwMCAgICAg ICAgIDUwMk0gICAgIFJXICAgICAgICAgUFNFICAgICAgICAgeCAgcG1kClsgICAgMC4wMjQwOTFd IDB4MDAwMDAwMDgxZjYwMDAwMC0weDAwMDAwMDA4NDAwMDAwMDAgICAgICAgICA1MjJNICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBtZApbICAgIDAuMDI0MDk1XSAweDAwMDAwMDA4NDAw MDAwMDAtMHgwMDAwMDA4MDAwMDAwMDAwICAgICAgICAgNDc5RyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwdWQKWyAgICAwLjAyNDA5N10gMHgwMDAwMDA4MDAwMDAwMDAwLTB4ZmZmZjgw MDAwMDAwMDAwMCAgIDE3MTc5NzM3NjAwRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw Z2QKWyAgICAwLjAyNDA5OV0gLS0tWyBLZXJuZWwgU3BhY2UgXS0tLQpbICAgIDAuMDI0MTAwXSAw eGZmZmY4MDAwMDAwMDAwMDAtMHhmZmZmODgwMDAwMDAwMDAwICAgICAgICAgICA4VCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwZ2QKWyAgICAwLjAyNDEwMV0gLS0tWyBMb3cgS2VybmVs IE1hcHBpbmcgXS0tLQpbICAgIDAuMDI0MTA0XSAweGZmZmY4ODAwMDAwMDAwMDAtMHhmZmZmODgw MDAwMjAwMDAwICAgICAgICAgICAyTSAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiBOWCBwdGUK WyAgICAwLjAyNDExMV0gMHhmZmZmODgwMDAwMjAwMDAwLTB4ZmZmZjg4MDA0MDAwMDAwMCAgICAg ICAgMTAyMk0gICAgIFJXICAgICAgICAgUFNFICAgICBHTEIgTlggcG1kClsgICAgMC4wMjQxMTRd IDB4ZmZmZjg4MDA0MDAwMDAwMC0weGZmZmY4ODAwODAwMDAwMDAgICAgICAgICAgIDFHICAgICBS VyAgICAgICAgIFBTRSAgICAgR0xCIE5YIHB1ZApbICAgIDAuMDI0MTE4XSAweGZmZmY4ODAwODAw MDAwMDAtMHhmZmZmODgwMDg5ZTAwMDAwICAgICAgICAgMTU4TSAgICAgUlcgICAgICAgICBQU0Ug ICAgIEdMQiBOWCBwbWQKWyAgICAwLjAyNDEyMl0gMHhmZmZmODgwMDg5ZTAwMDAwLTB4ZmZmZjg4 MDA4OWVlYjAwMCAgICAgICAgIDk0MEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgTlggcHRl ClsgICAgMC4wMjQxMjVdIDB4ZmZmZjg4MDA4OWVlYjAwMC0weGZmZmY4ODAwODllZjIwMDAgICAg ICAgICAgMjhLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0MTI4 XSAweGZmZmY4ODAwODllZjIwMDAtMHhmZmZmODgwMDhhMDAwMDAwICAgICAgICAxMDgwSyAgICAg UlcgICAgICAgICAgICAgICAgIEdMQiBOWCBwdGUKWyAgICAwLjAyNDEzMV0gMHhmZmZmODgwMDhh MDAwMDAwLTB4ZmZmZjg4MDA4YTgwMDAwMCAgICAgICAgICAgOE0gICAgIFJXICAgICAgICAgUFNF ICAgICBHTEIgTlggcG1kClsgICAgMC4wMjQxMzZdIDB4ZmZmZjg4MDA4YTgwMDAwMC0weGZmZmY4 ODAwOGE5YzgwMDAgICAgICAgIDE4MjRLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIE5YIHB0 ZQpbICAgIDAuMDI0MTQwXSAweGZmZmY4ODAwOGE5YzgwMDAtMHhmZmZmODgwMDhhYTAwMDAwICAg ICAgICAgMjI0SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDE0 Ml0gMHhmZmZmODgwMDhhYTAwMDAwLTB4ZmZmZjg4MDA4YWUwMDAwMCAgICAgICAgICAgNE0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1kClsgICAgMC4wMjQxNDRdIDB4ZmZmZjg4MDA4 YWUwMDAwMC0weGZmZmY4ODAwOGFmMjEwMDAgICAgICAgIDExNTZLICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0MTQ3XSAweGZmZmY4ODAwOGFmMjEwMDAtMHhmZmZm ODgwMDhiMDAwMDAwICAgICAgICAgODkySyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiBOWCBw dGUKWyAgICAwLjAyNDE1MV0gMHhmZmZmODgwMDhiMDAwMDAwLTB4ZmZmZjg4MDA5ZDQwMDAwMCAg ICAgICAgIDI5Mk0gICAgIFJXICAgICAgICAgUFNFICAgICBHTEIgTlggcG1kClsgICAgMC4wMjQx NTZdIDB4ZmZmZjg4MDA5ZDQwMDAwMC0weGZmZmY4ODAwOWQ1YWQwMDAgICAgICAgIDE3MTZLICAg ICBSVyAgICAgICAgICAgICAgICAgR0xCIE5YIHB0ZQpbICAgIDAuMDI0MTYwXSAweGZmZmY4ODAw OWQ1YWQwMDAtMHhmZmZmODgwMDlkNjQ1MDAwICAgICAgICAgNjA4SyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDE2Ml0gMHhmZmZmODgwMDlkNjQ1MDAwLTB4ZmZm Zjg4MDA5ZDY4YzAwMCAgICAgICAgIDI4NEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgTlgg cHRlClsgICAgMC4wMjQxNjZdIDB4ZmZmZjg4MDA5ZDY4YzAwMC0weGZmZmY4ODAwOWQ4MDAwMDAg ICAgICAgIDE0ODhLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0 MTY4XSAweGZmZmY4ODAwOWQ4MDAwMDAtMHhmZmZmODgwMDllZTAwMDAwICAgICAgICAgIDIyTSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWQKWyAgICAwLjAyNDE3Ml0gMHhmZmZmODgw MDllZTAwMDAwLTB4ZmZmZjg4MDA5ZWZmZjAwMCAgICAgICAgMjA0NEsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQxNzNdIDB4ZmZmZjg4MDA5ZWZmZjAwMC0weGZm ZmY4ODAwOWYwMDAwMDAgICAgICAgICAgIDRLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIE5Y IHB0ZQpbICAgIDAuMDI0MTc4XSAweGZmZmY4ODAwOWYwMDAwMDAtMHhmZmZmODgwMGMwMDAwMDAw ICAgICAgICAgNTI4TSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWQKWyAgICAwLjAy NDE3OV0gMHhmZmZmODgwMGMwMDAwMDAwLTB4ZmZmZjg4MDEwMDAwMDAwMCAgICAgICAgICAgMUcg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVkClsgICAgMC4wMjQxODFdIDB4ZmZmZjg4 MDEwMDAwMDAwMC0weGZmZmY4ODA4MDAwMDAwMDAgICAgICAgICAgMjhHICAgICBSVyAgICAgICAg IFBTRSAgICAgR0xCIE5YIHB1ZApbICAgIDAuMDI0MTg1XSAweGZmZmY4ODA4MDAwMDAwMDAtMHhm ZmZmODgwODFmNjAwMDAwICAgICAgICAgNTAyTSAgICAgUlcgICAgICAgICBQU0UgICAgIEdMQiBO WCBwbWQKWyAgICAwLjAyNDE5MF0gMHhmZmZmODgwODFmNjAwMDAwLTB4ZmZmZjg4MDg0MDAwMDAw MCAgICAgICAgIDUyMk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1kClsgICAgMC4w MjQxOTRdIDB4ZmZmZjg4MDg0MDAwMDAwMC0weGZmZmY4ODgwMDAwMDAwMDAgICAgICAgICA0NzlH ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1ZApbICAgIDAuMDI0MTk2XSAweGZmZmY4 ODgwMDAwMDAwMDAtMHhmZmZmYzkwMDAwMDAwMDAwICAgICAgIDY2MDQ4RyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwZ2QKWyAgICAwLjAyNDE5N10gLS0tWyB2bWFsbG9jKCkgQXJlYSBd LS0tClsgICAgMC4wMjQxOThdIDB4ZmZmZmM5MDAwMDAwMDAwMC0weGZmZmZjOTAwMDAwMDEwMDAg ICAgICAgICAgIDRLICAgICBSVyAgICAgUENEICAgICAgICAgR0xCIE5YIHB0ZQpbICAgIDAuMDI0 MjAxXSAweGZmZmZjOTAwMDAwMDEwMDAtMHhmZmZmYzkwMDAwMDAyMDAwICAgICAgICAgICA0SyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDIwM10gMHhmZmZmYzkw MDAwMDAyMDAwLTB4ZmZmZmM5MDAwMDAwMzAwMCAgICAgICAgICAgNEsgICAgIFJXICAgICAgICAg ICAgICAgICBHTEIgTlggcHRlClsgICAgMC4wMjQyMDZdIDB4ZmZmZmM5MDAwMDAwMzAwMC0weGZm ZmZjOTAwMDAwMDQwMDAgICAgICAgICAgIDRLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHB0ZQpbICAgIDAuMDI0MjA3XSAweGZmZmZjOTAwMDAwMDQwMDAtMHhmZmZmYzkwMDAwMDA2MDAw ICAgICAgICAgICA4SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiBOWCBwdGUKWyAgICAwLjAy NDIxMV0gMHhmZmZmYzkwMDAwMDA2MDAwLTB4ZmZmZmM5MDAwMDAwODAwMCAgICAgICAgICAgOEsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQyMTJdIDB4ZmZmZmM5 MDAwMDAwODAwMC0weGZmZmZjOTAwMDAwMGMwMDAgICAgICAgICAgMTZLICAgICBSVyAgICAgICAg ICAgICAgICAgR0xCIE5YIHB0ZQpbICAgIDAuMDI0MjE1XSAweGZmZmZjOTAwMDAwMGMwMDAtMHhm ZmZmYzkwMDAwMDEwMDAwICAgICAgICAgIDE2SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwdGUKWyAgICAwLjAyNDIxN10gMHhmZmZmYzkwMDAwMDEwMDAwLTB4ZmZmZmM5MDAwMDAxZDAw MCAgICAgICAgICA1MksgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgTlggcHRlClsgICAgMC4w MjQyMjJdIDB4ZmZmZmM5MDAwMDAxZDAwMC0weGZmZmZjOTAwMDAyMDAwMDAgICAgICAgIDE5MzJL ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0MjI2XSAweGZmZmZj OTAwMDAyMDAwMDAtMHhmZmZmYzkwMDQwMDAwMDAwICAgICAgICAxMDIyTSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwbWQKWyAgICAwLjAyNDIzMF0gMHhmZmZmYzkwMDQwMDAwMDAwLTB4 ZmZmZmM5ODAwMDAwMDAwMCAgICAgICAgIDUxMUcgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcHVkClsgICAgMC4wMjQyMzJdIDB4ZmZmZmM5ODAwMDAwMDAwMC0weGZmZmZlYTAwMDAwMDAw MDAgICAgICAgMzMyODBHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnZApbICAgIDAu MDI0MjMzXSAtLS1bIFZtZW1tYXAgXS0tLQpbICAgIDAuMDI0MjM0XSAweGZmZmZlYTAwMDAwMDAw MDAtMHhmZmZmZWEwMDAyODAwMDAwICAgICAgICAgIDQwTSAgICAgUlcgICAgICAgICBQU0UgICAg IEdMQiBOWCBwbWQKWyAgICAwLjAyNDIzN10gMHhmZmZmZWEwMDAyODAwMDAwLTB4ZmZmZmVhMDAw NDAwMDAwMCAgICAgICAgICAyNE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1kClsg ICAgMC4wMjQyNDBdIDB4ZmZmZmVhMDAwNDAwMDAwMC0weGZmZmZlYTAwMjA4MDAwMDAgICAgICAg ICA0NTZNICAgICBSVyAgICAgICAgIFBTRSAgICAgR0xCIE5YIHBtZApbICAgIDAuMDI0MjQ0XSAw eGZmZmZlYTAwMjA4MDAwMDAtMHhmZmZmZWEwMDQwMDAwMDAwICAgICAgICAgNTA0TSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwbWQKWyAgICAwLjAyNDI0OF0gMHhmZmZmZWEwMDQwMDAw MDAwLTB4ZmZmZmVhODAwMDAwMDAwMCAgICAgICAgIDUxMUcgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcHVkClsgICAgMC4wMjQyNTBdIDB4ZmZmZmVhODAwMDAwMDAwMC0weGZmZmZmZjAw MDAwMDAwMDAgICAgICAgMjA5OTJHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnZApb ICAgIDAuMDI0MjUxXSAtLS1bIEVTUGZpeCBBcmVhIF0tLS0KWyAgICAwLjAyNDI1Ml0gMHhmZmZm ZmYwMDAwMDAwMDAwLTB4ZmZmZmZmODAwMDAwMDAwMCAgICAgICAgIDUxMkcgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcGdkClsgICAgMC4wMjQyNTZdIDB4ZmZmZmZmODAwMDAwMDAwMC0w eGZmZmZmZmVmMDAwMDAwMDAgICAgICAgICA0NDRHICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHB1ZApbICAgIDAuMDI0MjU3XSAtLS1bIEVGSSBSdW50aW1lIFNlcnZpY2VzIF0tLS0KWyAg ICAwLjAyNDI1OF0gMHhmZmZmZmZlZjAwMDAwMDAwLTB4ZmZmZmZmZmU4MDAwMDAwMCAgICAgICAg ICA2MkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVkClsgICAgMC4wMjQyNjFdIDB4 ZmZmZmZmZmU4MDAwMDAwMC0weGZmZmZmZmZlYTlhMDAwMDAgICAgICAgICA2NjZNICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBtZApbICAgIDAuMDI0MjYzXSAweGZmZmZmZmZlYTlhMDAw MDAtMHhmZmZmZmZmZWE5YTA4MDAwICAgICAgICAgIDMySyAgICAgUlcgICAgICAgICAgICAgICAg IEdMQiB4ICBwdGUKWyAgICAwLjAyNDI2Nl0gMHhmZmZmZmZmZWE5YTA4MDAwLTB4ZmZmZmZmZmVh OWE1ZjAwMCAgICAgICAgIDM0OEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsg ICAgMC4wMjQyNjhdIDB4ZmZmZmZmZmVhOWE1ZjAwMC0weGZmZmZmZmZlYTlhOWYwMDAgICAgICAg ICAyNTZLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0MjcyXSAw eGZmZmZmZmZlYTlhOWYwMDAtMHhmZmZmZmZmZWE5YWYyMDAwICAgICAgICAgMzMySyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDI3Nl0gMHhmZmZmZmZmZWE5YWYy MDAwLTB4ZmZmZmZmZmVhOWUwMDAwMCAgICAgICAgMzEyOEsgICAgIFJXICAgICAgICAgICAgICAg ICBHTEIgeCAgcHRlClsgICAgMC4wMjQyODBdIDB4ZmZmZmZmZmVhOWUwMDAwMC0weGZmZmZmZmZl YWE0MDAwMDAgICAgICAgICAgIDZNICAgICBSVyAgICAgICAgIFBTRSAgICAgICAgIHggIHBtZApb ICAgIDAuMDI0Mjg1XSAweGZmZmZmZmZlYWE0MDAwMDAtMHhmZmZmZmZmZWFhNjAwMDAwICAgICAg ICAgICAyTSAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDI4OF0g MHhmZmZmZmZmZWFhNjAwMDAwLTB4ZmZmZmZmZmVhYWEwMDAwMCAgICAgICAgICAgNE0gICAgIFJX ICAgICAgICAgUFNFICAgICAgICAgeCAgcG1kClsgICAgMC4wMjQyOTNdIDB4ZmZmZmZmZmVhYWEw MDAwMC0weGZmZmZmZmZlYWFiNWMwMDAgICAgICAgIDEzOTJLICAgICBSVyAgICAgICAgICAgICAg ICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0Mjk4XSAweGZmZmZmZmZlYWFiNWMwMDAtMHhmZmZmZmZm ZWFhY2Q3MDAwICAgICAgICAxNTE2SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUK WyAgICAwLjAyNDMwMF0gMHhmZmZmZmZmZWFhY2Q3MDAwLTB4ZmZmZmZmZmVhYWQxOTAwMCAgICAg ICAgIDI2NEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQzMDNd IDB4ZmZmZmZmZmVhYWQxOTAwMC0weGZmZmZmZmZlYWFkMjkwMDAgICAgICAgICAgNjRLICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0MzA1XSAweGZmZmZmZmZlYWFk MjkwMDAtMHhmZmZmZmZmZWFhZDVjMDAwICAgICAgICAgMjA0SyAgICAgUlcgICAgICAgICAgICAg ICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDMwOF0gMHhmZmZmZmZmZWFhZDVjMDAwLTB4ZmZmZmZm ZmVhYWQ2OTAwMCAgICAgICAgICA1MksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRl ClsgICAgMC4wMjQzMTBdIDB4ZmZmZmZmZmVhYWQ2OTAwMC0weGZmZmZmZmZlYWFkYzcwMDAgICAg ICAgICAzNzZLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0MzEz XSAweGZmZmZmZmZlYWFkYzcwMDAtMHhmZmZmZmZmZWFhZGUwMDAwICAgICAgICAgMTAwSyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDMxNV0gMHhmZmZmZmZmZWFh ZGUwMDAwLTB4ZmZmZmZmZmVhYWUzOTAwMCAgICAgICAgIDM1NksgICAgIFJXICAgICAgICAgICAg ICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQzMTldIDB4ZmZmZmZmZmVhYWUzOTAwMC0weGZmZmZm ZmZlYWFlNGYwMDAgICAgICAgICAgODhLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0 ZQpbICAgIDAuMDI0MzIxXSAweGZmZmZmZmZlYWFlNGYwMDAtMHhmZmZmZmZmZWFhZWJmMDAwICAg ICAgICAgNDQ4SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDMy NF0gMHhmZmZmZmZmZWFhZWJmMDAwLTB4ZmZmZmZmZmVhYWVmMDAwMCAgICAgICAgIDE5NksgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQzMjZdIDB4ZmZmZmZmZmVh YWVmMDAwMC0weGZmZmZmZmZlYWFmNjYwMDAgICAgICAgICA0NzJLICAgICBSVyAgICAgICAgICAg ICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0MzI5XSAweGZmZmZmZmZlYWFmNjYwMDAtMHhmZmZm ZmZmZWFhZjk0MDAwICAgICAgICAgMTg0SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw dGUKWyAgICAwLjAyNDMzMV0gMHhmZmZmZmZmZWFhZjk0MDAwLTB4ZmZmZmZmZmVhYWZiMDAwMCAg ICAgICAgIDExMksgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQz MzVdIDB4ZmZmZmZmZmVhYWZiMDAwMC0weGZmZmZmZmZlYWIwOWQwMDAgICAgICAgICA5NDhLICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0MzM3XSAweGZmZmZmZmZl YWIwOWQwMDAtMHhmZmZmZmZmZWFiMGEwMDAwICAgICAgICAgIDEySyAgICAgUlcgICAgICAgICAg ICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDM0MF0gMHhmZmZmZmZmZWFiMGEwMDAwLTB4ZmZm ZmZmZmVhYjBhMzAwMCAgICAgICAgICAxMksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cHRlClsgICAgMC4wMjQzNDJdIDB4ZmZmZmZmZmVhYjBhMzAwMC0weGZmZmZmZmZlYWIwYTQwMDAg ICAgICAgICAgIDRLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0 MzQ1XSAweGZmZmZmZmZlYWIwYTQwMDAtMHhmZmZmZmZmZWFiMGE4MDAwICAgICAgICAgIDE2SyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDM0Nl0gMHhmZmZmZmZm ZWFiMGE4MDAwLTB4ZmZmZmZmZmVhYjBhOTAwMCAgICAgICAgICAgNEsgICAgIFJXICAgICAgICAg ICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQzNTFdIDB4ZmZmZmZmZmVhYjBhOTAwMC0weGZm ZmZmZmZlYWIxZDYwMDAgICAgICAgIDEyMDRLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHB0ZQpbICAgIDAuMDI0MzUyXSAweGZmZmZmZmZlYWIxZDYwMDAtMHhmZmZmZmZmZWFiMWQ3MDAw ICAgICAgICAgICA0SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAy NDM1Nl0gMHhmZmZmZmZmZWFiMWQ3MDAwLTB4ZmZmZmZmZmVhYjFkOTAwMCAgICAgICAgICAgOEsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQzNTddIDB4ZmZmZmZm ZmVhYjFkOTAwMC0weGZmZmZmZmZlYWIyMDIwMDAgICAgICAgICAxNjRLICAgICBSVyAgICAgICAg ICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0MzYxXSAweGZmZmZmZmZlYWIyMDIwMDAtMHhm ZmZmZmZmZWFiMjJmMDAwICAgICAgICAgMTgwSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwdGUKWyAgICAwLjAyNDM2Ml0gMHhmZmZmZmZmZWFiMjJmMDAwLTB4ZmZmZmZmZmVhYjIzMDAw MCAgICAgICAgICAgNEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4w MjQzNjZdIDB4ZmZmZmZmZmVhYjIzMDAwMC0weGZmZmZmZmZlYWIyNjkwMDAgICAgICAgICAyMjhL ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0MzY3XSAweGZmZmZm ZmZlYWIyNjkwMDAtMHhmZmZmZmZmZWFiMjZhMDAwICAgICAgICAgICA0SyAgICAgUlcgICAgICAg ICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDM3MV0gMHhmZmZmZmZmZWFiMjZhMDAwLTB4 ZmZmZmZmZmVhYjJiZjAwMCAgICAgICAgIDM0MEsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcHRlClsgICAgMC4wMjQzNzJdIDB4ZmZmZmZmZmVhYjJiZjAwMC0weGZmZmZmZmZlYWIyYzAw MDAgICAgICAgICAgIDRLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAu MDI0Mzc2XSAweGZmZmZmZmZlYWIyYzAwMDAtMHhmZmZmZmZmZWFiMzc5MDAwICAgICAgICAgNzQw SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDM3OF0gMHhmZmZm ZmZmZWFiMzc5MDAwLTB4ZmZmZmZmZmVhYjQxZjAwMCAgICAgICAgIDY2NEsgICAgIFJXICAgICAg ICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQzODJdIDB4ZmZmZmZmZmVhYjQxZjAwMC0w eGZmZmZmZmZlYWI0NjYwMDAgICAgICAgICAyODRLICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHB0ZQpbICAgIDAuMDI0MzgzXSAweGZmZmZmZmZlYWI0NjYwMDAtMHhmZmZmZmZmZWFiNDZh MDAwICAgICAgICAgIDE2SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAw LjAyNDM4OF0gMHhmZmZmZmZmZWFiNDZhMDAwLTB4ZmZmZmZmZmVhYjU1YTAwMCAgICAgICAgIDk2 MEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQzOTBdIDB4ZmZm ZmZmZmVhYjU1YTAwMC0weGZmZmZmZmZlYWI1Y2IwMDAgICAgICAgICA0NTJLICAgICBSVyAgICAg ICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0MzkzXSAweGZmZmZmZmZlYWI1Y2IwMDAt MHhmZmZmZmZmZWFiNjBhMDAwICAgICAgICAgMjUySyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwdGUKWyAgICAwLjAyNDM5Nl0gMHhmZmZmZmZmZWFiNjBhMDAwLTB4ZmZmZmZmZmVhYjcx NTAwMCAgICAgICAgMTA2OEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAg MC4wMjQ0MDBdIDB4ZmZmZmZmZmVhYjcxNTAwMC0weGZmZmZmZmZlYWI3YmEwMDAgICAgICAgICA2 NjBLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NDAyXSAweGZm ZmZmZmZlYWI3YmEwMDAtMHhmZmZmZmZmZWFiODc0MDAwICAgICAgICAgNzQ0SyAgICAgUlcgICAg ICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDQwNV0gMHhmZmZmZmZmZWFiODc0MDAw LTB4ZmZmZmZmZmVhYjg4NDAwMCAgICAgICAgICA2NEsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcHRlClsgICAgMC4wMjQ0MDddIDB4ZmZmZmZmZmVhYjg4NDAwMC0weGZmZmZmZmZlYWI4 YjgwMDAgICAgICAgICAyMDhLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAg IDAuMDI0NDEwXSAweGZmZmZmZmZlYWI4YjgwMDAtMHhmZmZmZmZmZWFiOGM1MDAwICAgICAgICAg IDUySyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDQxMl0gMHhm ZmZmZmZmZWFiOGM1MDAwLTB4ZmZmZmZmZmVhYjkyMzAwMCAgICAgICAgIDM3NksgICAgIFJXICAg ICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQ0MTZdIDB4ZmZmZmZmZmVhYjkyMzAw MC0weGZmZmZmZmZlYWI5M2MwMDAgICAgICAgICAxMDBLICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHB0ZQpbICAgIDAuMDI0NDE3XSAweGZmZmZmZmZlYWI5M2MwMDAtMHhmZmZmZmZmZWFi OTk1MDAwICAgICAgICAgMzU2SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAg ICAwLjAyNDQyMV0gMHhmZmZmZmZmZWFiOTk1MDAwLTB4ZmZmZmZmZmVhYjlhYjAwMCAgICAgICAg ICA4OEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQ0MjNdIDB4 ZmZmZmZmZmVhYjlhYjAwMC0weGZmZmZmZmZlYWJhYzMwMDAgICAgICAgIDExMjBLICAgICBSVyAg ICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0NDI3XSAweGZmZmZmZmZlYWJhYzMw MDAtMHhmZmZmZmZmZWFiYWYxMDAwICAgICAgICAgMTg0SyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwdGUKWyAgICAwLjAyNDQyOF0gMHhmZmZmZmZmZWFiYWYxMDAwLTB4ZmZmZmZmZmVh YmIwZjAwMCAgICAgICAgIDEyMEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsg ICAgMC4wMjQ0MzJdIDB4ZmZmZmZmZmVhYmIwZjAwMC0weGZmZmZmZmZlYWJiNTAwMDAgICAgICAg ICAyNjBLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NDM0XSAw eGZmZmZmZmZlYWJiNTAwMDAtMHhmZmZmZmZmZWFiYjgyMDAwICAgICAgICAgMjAwSyAgICAgUlcg ICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDQzN10gMHhmZmZmZmZmZWFiYjgy MDAwLTB4ZmZmZmZmZmVhYmJiMjAwMCAgICAgICAgIDE5MksgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcHRlClsgICAgMC4wMjQ0MzldIDB4ZmZmZmZmZmVhYmJiMjAwMC0weGZmZmZmZmZl YWJjNDcwMDAgICAgICAgICA1OTZLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpb ICAgIDAuMDI0NDQyXSAweGZmZmZmZmZlYWJjNDcwMDAtMHhmZmZmZmZmZWFiYzU3MDAwICAgICAg ICAgIDY0SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDQ0NF0g MHhmZmZmZmZmZWFiYzU3MDAwLTB4ZmZmZmZmZmVhYmM4YTAwMCAgICAgICAgIDIwNEsgICAgIFJX ICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQ0NDddIDB4ZmZmZmZmZmVhYmM4 YTAwMC0weGZmZmZmZmZlYWJjOTcwMDAgICAgICAgICAgNTJLICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NDQ5XSAweGZmZmZmZmZlYWJjOTcwMDAtMHhmZmZmZmZm ZWFiY2Y0MDAwICAgICAgICAgMzcySyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUK WyAgICAwLjAyNDQ1M10gMHhmZmZmZmZmZWFiY2Y0MDAwLTB4ZmZmZmZmZmVhYmQwZDAwMCAgICAg ICAgIDEwMEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQ0NTVd IDB4ZmZmZmZmZmVhYmQwZDAwMC0weGZmZmZmZmZlYWJkNjcwMDAgICAgICAgICAzNjBLICAgICBS VyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0NDU4XSAweGZmZmZmZmZlYWJk NjcwMDAtMHhmZmZmZmZmZWFiZDdkMDAwICAgICAgICAgIDg4SyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwdGUKWyAgICAwLjAyNDQ2MF0gMHhmZmZmZmZmZWFiZDdkMDAwLTB4ZmZmZmZm ZmVhYmRlZTAwMCAgICAgICAgIDQ1MksgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRl ClsgICAgMC4wMjQ0NjNdIDB4ZmZmZmZmZmVhYmRlZTAwMC0weGZmZmZmZmZlYWJkZjEwMDAgICAg ICAgICAgMTJLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NDY1 XSAweGZmZmZmZmZlYWJkZjEwMDAtMHhmZmZmZmZmZWFiZTkzMDAwICAgICAgICAgNjQ4SyAgICAg UlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDQ2OV0gMHhmZmZmZmZmZWFi ZTkzMDAwLTB4ZmZmZmZmZmVhYmVhNzAwMCAgICAgICAgICA4MEsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcHRlClsgICAgMC4wMjQ0NzJdIDB4ZmZmZmZmZmVhYmVhNzAwMC0weGZmZmZm ZmZlYWMwMTMwMDAgICAgICAgIDE0NTZLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0 ZQpbICAgIDAuMDI0NDc1XSAweGZmZmZmZmZlYWMwMTMwMDAtMHhmZmZmZmZmZWFjMDE2MDAwICAg ICAgICAgIDEySyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDQ3 N10gMHhmZmZmZmZmZWFjMDE2MDAwLTB4ZmZmZmZmZmVhYzBjMDAwMCAgICAgICAgIDY4MEsgICAg IFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQ0ODBdIDB4ZmZmZmZmZmVh YzBjMDAwMC0weGZmZmZmZmZlYWMwY2MwMDAgICAgICAgICAgNDhLICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NDgyXSAweGZmZmZmZmZlYWMwY2MwMDAtMHhmZmZm ZmZmZWFjMTM0MDAwICAgICAgICAgNDE2SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBw dGUKWyAgICAwLjAyNDQ4Nl0gMHhmZmZmZmZmZWFjMTM0MDAwLTB4ZmZmZmZmZmVhYzEzZDAwMCAg ICAgICAgICAzNksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQ0 ODhdIDB4ZmZmZmZmZmVhYzEzZDAwMC0weGZmZmZmZmZlYWMyNjEwMDAgICAgICAgIDExNjhLICAg ICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0NDkyXSAweGZmZmZmZmZl YWMyNjEwMDAtMHhmZmZmZmZmZWFjMjY5MDAwICAgICAgICAgIDMySyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDQ5NF0gMHhmZmZmZmZmZWFjMjY5MDAwLTB4ZmZm ZmZmZmVhYzM0NTAwMCAgICAgICAgIDg4MEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAg cHRlClsgICAgMC4wMjQ0OTddIDB4ZmZmZmZmZmVhYzM0NTAwMC0weGZmZmZmZmZlYWMzNTEwMDAg ICAgICAgICAgNDhLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0 NDk5XSAweGZmZmZmZmZlYWMzNTEwMDAtMHhmZmZmZmZmZWFjNDAwMDAwICAgICAgICAgNzAwSyAg ICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDUwM10gMHhmZmZmZmZm ZWFjNDAwMDAwLTB4ZmZmZmZmZmVhYzYwMDAwMCAgICAgICAgICAgMk0gICAgIFJXICAgICAgICAg UFNFICAgICAgICAgeCAgcG1kClsgICAgMC4wMjQ1MDddIDB4ZmZmZmZmZmVhYzYwMDAwMC0weGZm ZmZmZmZlYWM3NTEwMDAgICAgICAgIDEzNDhLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHgg IHB0ZQpbICAgIDAuMDI0NTExXSAweGZmZmZmZmZlYWM3NTEwMDAtMHhmZmZmZmZmZWFjNzU3MDAw ICAgICAgICAgIDI0SyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAy NDUxM10gMHhmZmZmZmZmZWFjNzU3MDAwLTB4ZmZmZmZmZmVhYzg5MDAwMCAgICAgICAgMTI1Mksg ICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQ1MTddIDB4ZmZmZmZm ZmVhYzg5MDAwMC0weGZmZmZmZmZlYWM4OWMwMDAgICAgICAgICAgNDhLICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NTE5XSAweGZmZmZmZmZlYWM4OWMwMDAtMHhm ZmZmZmZmZWFjOTg5MDAwICAgICAgICAgOTQ4SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4 ICBwdGUKWyAgICAwLjAyNDUyM10gMHhmZmZmZmZmZWFjOTg5MDAwLTB4ZmZmZmZmZmVhYzk4YTAw MCAgICAgICAgICAgNEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4w MjQ1MjRdIDB4ZmZmZmZmZmVhYzk4YTAwMC0weGZmZmZmZmZlYWM5OTAwMDAgICAgICAgICAgMjRL ICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0NTI3XSAweGZmZmZm ZmZlYWM5OTAwMDAtMHhmZmZmZmZmZWFjOTkxMDAwICAgICAgICAgICA0SyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDUzMF0gMHhmZmZmZmZmZWFjOTkxMDAwLTB4 ZmZmZmZmZmVhY2FlMjAwMCAgICAgICAgMTM0OEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIg eCAgcHRlClsgICAgMC4wMjQ1MzNdIDB4ZmZmZmZmZmVhY2FlMjAwMC0weGZmZmZmZmZlYWNhZWMw MDAgICAgICAgICAgNDBLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAu MDI0NTM2XSAweGZmZmZmZmZlYWNhZWMwMDAtMHhmZmZmZmZmZWFjYjhmMDAwICAgICAgICAgNjUy SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDUzOV0gMHhmZmZm ZmZmZWFjYjhmMDAwLTB4ZmZmZmZmZmVhY2I5OTAwMCAgICAgICAgICA0MEsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQ1NDFdIDB4ZmZmZmZmZmVhY2I5OTAwMC0w eGZmZmZmZmZlYWNjMWMwMDAgICAgICAgICA1MjRLICAgICBSVyAgICAgICAgICAgICAgICAgR0xC IHggIHB0ZQpbICAgIDAuMDI0NTQ0XSAweGZmZmZmZmZlYWNjMWMwMDAtMHhmZmZmZmZmZWFjYzFm MDAwICAgICAgICAgIDEySyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAw LjAyNDU0Nl0gMHhmZmZmZmZmZWFjYzFmMDAwLTB4ZmZmZmZmZmVhY2MyNDAwMCAgICAgICAgICAy MEsgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQ1NDldIDB4ZmZm ZmZmZmVhY2MyNDAwMC0weGZmZmZmZmZlYWNjMjkwMDAgICAgICAgICAgMjBLICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NTUxXSAweGZmZmZmZmZlYWNjMjkwMDAt MHhmZmZmZmZmZWFjY2Y4MDAwICAgICAgICAgODI4SyAgICAgUlcgICAgICAgICAgICAgICAgIEdM QiB4ICBwdGUKWyAgICAwLjAyNDU1NV0gMHhmZmZmZmZmZWFjY2Y4MDAwLTB4ZmZmZmZmZmVhY2Nm ZTAwMCAgICAgICAgICAyNEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAg MC4wMjQ1NTZdIDB4ZmZmZmZmZmVhY2NmZTAwMC0weGZmZmZmZmZlYWNkMGUwMDAgICAgICAgICAg NjRLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0NTU5XSAweGZm ZmZmZmZlYWNkMGUwMDAtMHhmZmZmZmZmZWFjZDE5MDAwICAgICAgICAgIDQ0SyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDU2Ml0gMHhmZmZmZmZmZWFjZDE5MDAw LTB4ZmZmZmZmZmVhY2UwMDAwMCAgICAgICAgIDkyNEsgICAgIFJXICAgICAgICAgICAgICAgICBH TEIgeCAgcHRlClsgICAgMC4wMjQ1NjZdIDB4ZmZmZmZmZmVhY2UwMDAwMC0weGZmZmZmZmZlYjZl MDAwMDAgICAgICAgICAxNjBNICAgICBSVyAgICAgICAgIFBTRSAgICAgICAgIHggIHBtZApbICAg IDAuMDI0NTcwXSAweGZmZmZmZmZlYjZlMDAwMDAtMHhmZmZmZmZmZWI2Zjk5MDAwICAgICAgICAx NjM2SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDU3NF0gMHhm ZmZmZmZmZWI2Zjk5MDAwLTB4ZmZmZmZmZmViNmY5YzAwMCAgICAgICAgICAxMksgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQ1NzVdIDB4ZmZmZmZmZmViNmY5YzAw MC0weGZmZmZmZmZlYjZmYTQwMDAgICAgICAgICAgMzJLICAgICBSVyAgICAgICAgICAgICAgICAg R0xCIHggIHB0ZQpbICAgIDAuMDI0NTc5XSAweGZmZmZmZmZlYjZmYTQwMDAtMHhmZmZmZmZmZWI2 ZmE3MDAwICAgICAgICAgIDEySyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAg ICAwLjAyNDU4MF0gMHhmZmZmZmZmZWI2ZmE3MDAwLTB4ZmZmZmZmZmViNmZiMDAwMCAgICAgICAg ICAzNksgICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQ1ODNdIDB4 ZmZmZmZmZmViNmZiMDAwMC0weGZmZmZmZmZlYjZmYjMwMDAgICAgICAgICAgMTJLICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NTg1XSAweGZmZmZmZmZlYjZmYjMw MDAtMHhmZmZmZmZmZWI2ZmJjMDAwICAgICAgICAgIDM2SyAgICAgUlcgICAgICAgICAgICAgICAg IEdMQiB4ICBwdGUKWyAgICAwLjAyNDU4OF0gMHhmZmZmZmZmZWI2ZmJjMDAwLTB4ZmZmZmZmZmVi NmZiZTAwMCAgICAgICAgICAgOEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsg ICAgMC4wMjQ1OTBdIDB4ZmZmZmZmZmViNmZiZTAwMC0weGZmZmZmZmZlYjcwMDAwMDAgICAgICAg ICAyNjRLICAgICBSVyAgICAgICAgICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0NTkzXSAw eGZmZmZmZmZlYjcwMDAwMDAtMHhmZmZmZmZmZWI4YzAwMDAwICAgICAgICAgIDI4TSAgICAgUlcg ICAgICAgICBQU0UgICAgICAgICB4ICBwbWQKWyAgICAwLjAyNDU5N10gMHhmZmZmZmZmZWI4YzAw MDAwLTB4ZmZmZmZmZmViOGMyYjAwMCAgICAgICAgIDE3MksgICAgIFJXICAgICAgICAgICAgICAg ICBHTEIgeCAgcHRlClsgICAgMC4wMjQ2MDFdIDB4ZmZmZmZmZmViOGMyYjAwMC0weGZmZmZmZmZl YjhjYjkwMDAgICAgICAgICA1NjhLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpb ICAgIDAuMDI0NjA1XSAweGZmZmZmZmZlYjhjYjkwMDAtMHhmZmZmZmZmZWI4ZmFkMDAwICAgICAg ICAzMDI0SyAgICAgUlcgICAgICAgICAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDYxMF0g MHhmZmZmZmZmZWI4ZmFkMDAwLTB4ZmZmZmZmZmViOTE0ODAwMCAgICAgICAgMTY0NEsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQ2MTJdIDB4ZmZmZmZmZmViOTE0 ODAwMC0weGZmZmZmZmZlYjkyMDAwMDAgICAgICAgICA3MzZLICAgICBSVyAgICAgICAgICAgICAg ICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0NjE2XSAweGZmZmZmZmZlYjkyMDAwMDAtMHhmZmZmZmZm ZWJhODAwMDAwICAgICAgICAgIDIyTSAgICAgUlcgICAgICAgICBQU0UgICAgICAgICB4ICBwbWQK WyAgICAwLjAyNDYyMV0gMHhmZmZmZmZmZWJhODAwMDAwLTB4ZmZmZmZmZmViYWEwMDAwMCAgICAg ICAgICAgMk0gICAgIFJXICAgICAgICAgICAgICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQ2Mjdd IDB4ZmZmZmZmZmViYWEwMDAwMC0weGZmZmZmZmZlZmVjMDAwMDAgICAgICAgIDEwOTBNICAgICBS VyAgICAgUENEIFBTRSAgICAgICAgIHggIHBtZApbICAgIDAuMDI0NjMxXSAweGZmZmZmZmZlZmVj MDAwMDAtMHhmZmZmZmZmZWZlYzAxMDAwICAgICAgICAgICA0SyAgICAgUlcgICAgIFBDRCAgICAg ICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDYzNV0gMHhmZmZmZmZmZWZlYzAxMDAwLTB4ZmZmZmZm ZmVmZWQwMDAwMCAgICAgICAgMTAyMEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRl ClsgICAgMC4wMjQ2MzddIDB4ZmZmZmZmZmVmZWQwMDAwMC0weGZmZmZmZmZlZmVkMDQwMDAgICAg ICAgICAgMTZLICAgICBSVyAgICAgUENEICAgICAgICAgR0xCIHggIHB0ZQpbICAgIDAuMDI0NjQw XSAweGZmZmZmZmZlZmVkMDQwMDAtMHhmZmZmZmZmZWZlZDFjMDAwICAgICAgICAgIDk2SyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDY0MV0gMHhmZmZmZmZmZWZl ZDFjMDAwLTB4ZmZmZmZmZmVmZWQyMDAwMCAgICAgICAgICAxNksgICAgIFJXICAgICBQQ0QgICAg ICAgICBHTEIgeCAgcHRlClsgICAgMC4wMjQ2NDZdIDB4ZmZmZmZmZmVmZWQyMDAwMC0weGZmZmZm ZmZlZmVlMDAwMDAgICAgICAgICA4OTZLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0 ZQpbICAgIDAuMDI0NjQ3XSAweGZmZmZmZmZlZmVlMDAwMDAtMHhmZmZmZmZmZWZlZTAxMDAwICAg ICAgICAgICA0SyAgICAgUlcgICAgIFBDRCAgICAgICAgIEdMQiB4ICBwdGUKWyAgICAwLjAyNDY1 M10gMHhmZmZmZmZmZWZlZTAxMDAwLTB4ZmZmZmZmZmVmZjAwMDAwMCAgICAgICAgMjA0NEsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4wMjQ2NTRdIDB4ZmZmZmZmZmVm ZjAwMDAwMC0weGZmZmZmZmZmMDAwMDAwMDAgICAgICAgICAgMTZNICAgICBSVyAgICAgUENEIFBT RSAgICAgICAgIHggIHBtZApbICAgIDAuMDI0NjU3XSAweGZmZmZmZmZmMDAwMDAwMDAtMHhmZmZm ZmZmZjgwMDAwMDAwICAgICAgICAgICAyRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw dWQKWyAgICAwLjAyNDY1OV0gLS0tWyBIaWdoIEtlcm5lbCBNYXBwaW5nIF0tLS0KWyAgICAwLjAy NDY2MF0gMHhmZmZmZmZmZjgwMDAwMDAwLTB4ZmZmZmZmZmY4MTAwMDAwMCAgICAgICAgICAxNk0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1kClsgICAgMC4wMjQ2NjFdIDB4ZmZmZmZm ZmY4MTAwMDAwMC0weGZmZmZmZmZmODM0MDAwMDAgICAgICAgICAgMzZNICAgICBSVyAgICAgICAg IFBTRSAgICAgR0xCIHggIHBtZApbICAgIDAuMDI0NjY3XSAweGZmZmZmZmZmODM0MDAwMDAtMHhm ZmZmZmZmZmMwMDAwMDAwICAgICAgICAgOTcyTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwbWQKWyAgICAwLjAyNDY2OF0gLS0tWyBNb2R1bGVzIF0tLS0KWyAgICAwLjAyNDY3MV0gMHhm ZmZmZmZmZmMwMDAwMDAwLTB4ZmZmZmZmZmZmZjAwMDAwMCAgICAgICAgMTAwOE0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcG1kClsgICAgMC4wMjQ2NzJdIC0tLVsgRW5kIE1vZHVsZXMg XS0tLQpbICAgIDAuMDI0NjczXSAweGZmZmZmZmZmZmYwMDAwMDAtMHhmZmZmZmZmZmZmMjAwMDAw ICAgICAgICAgICAyTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWQKWyAgICAwLjAy NDY3NV0gMHhmZmZmZmZmZmZmMjAwMDAwLTB4ZmZmZmZmZmZmZjIwMjAwMCAgICAgICAgICAgOEsg ICAgIFJXICAgICAgICAgICAgICAgICBHTEIgTlggcHRlClsgICAgMC4wMjQ2ODJdIDB4ZmZmZmZm ZmZmZjIwMjAwMC0weGZmZmZmZmZmZmY1N2IwMDAgICAgICAgIDM1NTZLICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAuMDI0NjgzXSAweGZmZmZmZmZmZmY1N2IwMDAtMHhm ZmZmZmZmZmZmNTdjMDAwICAgICAgICAgICA0SyAgICAgcm8gICAgICAgICAgICAgICAgIEdMQiBO WCBwdGUKWyAgICAwLjAyNDY4N10gMHhmZmZmZmZmZmZmNTdjMDAwLTB4ZmZmZmZmZmZmZjVmYjAw MCAgICAgICAgIDUwOEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlClsgICAgMC4w MjQ2ODhdIDB4ZmZmZmZmZmZmZjVmYjAwMC0weGZmZmZmZmZmZmY1ZmQwMDAgICAgICAgICAgIDhL ICAgICBSVyBQV1QgUENEICAgICAgICAgR0xCIE5YIHB0ZQpbICAgIDAuMDI0NjkyXSAweGZmZmZm ZmZmZmY1ZmQwMDAtMHhmZmZmZmZmZmZmNjAwMDAwICAgICAgICAgIDEySyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwdGUKWyAgICAwLjAyNDY5M10gMHhmZmZmZmZmZmZmNjAwMDAwLTB4 ZmZmZmZmZmZmZjYwMTAwMCAgICAgICAgICAgNEsgVVNSIHJvICAgICAgICAgICAgICAgICBHTEIg TlggcHRlClsgICAgMC4wMjQ2OTldIDB4ZmZmZmZmZmZmZjYwMTAwMC0weGZmZmZmZmZmZmY4MDAw MDAgICAgICAgIDIwNDRLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZQpbICAgIDAu MDI0NzAwXSAweGZmZmZmZmZmZmY4MDAwMDAtMHgwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICA4 TSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWQKWyAgICAwLjAyNDgwOF0gU2VjdXJp dHkgRnJhbWV3b3JrIGluaXRpYWxpemVkClsgICAgMC4wMjQ4MDldIFlhbWE6IGJlY29taW5nIG1p bmRmdWwuClsgICAgMC4wMjQ4MjJdIFNFTGludXg6ICBJbml0aWFsaXppbmcuClsgICAgMC4wMjQ4 NTVdIFNFTGludXg6ICBTdGFydGluZyBpbiBwZXJtaXNzaXZlIG1vZGUKWyAgICAwLjAyODU3OV0g RGVudHJ5IGNhY2hlIGhhc2ggdGFibGUgZW50cmllczogNDE5NDMwNCAob3JkZXI6IDEzLCAzMzU1 NDQzMiBieXRlcykKWyAgICAwLjAzMzkwN10gSW5vZGUtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVz OiAyMDk3MTUyIChvcmRlcjogMTIsIDE2Nzc3MjE2IGJ5dGVzKQpbICAgIDAuMDM1NjA3XSBNb3Vu dC1jYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDY1NTM2IChvcmRlcjogNywgNTI0Mjg4IGJ5dGVz KQpbICAgIDAuMDM1NjY3XSBNb3VudHBvaW50LWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogNjU1 MzYgKG9yZGVyOiA3LCA1MjQyODggYnl0ZXMpClsgICAgMC4wMzY2MDFdIENQVTogUGh5c2ljYWwg UHJvY2Vzc29yIElEOiAwClsgICAgMC4wMzY2MDNdIENQVTogUHJvY2Vzc29yIENvcmUgSUQ6IDAK WyAgICAwLjAzNjYwOF0gbWNlOiBDUFUgc3VwcG9ydHMgOSBNQ0UgYmFua3MKWyAgICAwLjAzNjYy OF0gQ1BVMDogVGhlcm1hbCBtb25pdG9yaW5nIGVuYWJsZWQgKFRNMSkKWyAgICAwLjAzNjY0MF0g cHJvY2VzczogdXNpbmcgbXdhaXQgaW4gaWRsZSB0aHJlYWRzClsgICAgMC4wMzY2NDNdIExhc3Qg bGV2ZWwgaVRMQiBlbnRyaWVzOiA0S0IgMTAyNCwgMk1CIDEwMjQsIDRNQiAxMDI0ClsgICAgMC4w MzY2NDNdIExhc3QgbGV2ZWwgZFRMQiBlbnRyaWVzOiA0S0IgMTAyNCwgMk1CIDEwMjQsIDRNQiAx MDI0LCAxR0IgNApbICAgIDAuMDM2OTM4XSBGcmVlaW5nIFNNUCBhbHRlcm5hdGl2ZXMgbWVtb3J5 OiAyOEsgKGZmZmZmZmZmODIzMDAwMDAgLSBmZmZmZmZmZjgyMzA3MDAwKQpbICAgIDAuMDY0NzAx XSBmdHJhY2U6IGFsbG9jYXRpbmcgMzA0ODggZW50cmllcyBpbiAxMjAgcGFnZXMKWyAgICAwLjA3 Mjk3MF0gc21wYm9vdDogTWF4IGxvZ2ljYWwgcGFja2FnZXM6IDIKWyAgICAwLjA3Mjk3Ml0gc21w Ym9vdDogQVBJQygwKSBDb252ZXJ0aW5nIHBoeXNpY2FsIDAgdG8gbG9naWNhbCBwYWNrYWdlIDAK WyAgICAwLjA3Mjk3OV0gRE1BUjogSG9zdCBhZGRyZXNzIHdpZHRoIDM5ClsgICAgMC4wNzI5ODFd IERNQVI6IERSSEQgYmFzZTogMHgwMDAwMDBmZWQ5MDAwMCBmbGFnczogMHgwClsgICAgMC4wNzMw MDddIERNQVI6IGRtYXIwOiByZWdfYmFzZV9hZGRyIGZlZDkwMDAwIHZlciAxOjAgY2FwIGMwMDAw MDIwNjYwNDYyIGVjYXAgZjAxMDFhClsgICAgMC4wNzMwMDhdIERNQVI6IERSSEQgYmFzZTogMHgw MDAwMDBmZWQ5MTAwMCBmbGFnczogMHgxClsgICAgMC4wNzMwMTJdIERNQVI6IGRtYXIxOiByZWdf YmFzZV9hZGRyIGZlZDkxMDAwIHZlciAxOjAgY2FwIGQyMDA4MDIwNjYwNDYyIGVjYXAgZjAxMGRh ClsgICAgMC4wNzMwMTNdIERNQVI6IFJNUlIgYmFzZTogMHgwMDAwMDA5ZWU4MzAwMCBlbmQ6IDB4 MDAwMDAwOWVlOTFmZmYKWyAgICAwLjA3MzAxNF0gRE1BUjogUk1SUiBiYXNlOiAweDAwMDAwMGRm ODAwMDAwIGVuZDogMHgwMDAwMDBkZjlmZmZmZgpbICAgIDAuMDczMDE2XSBETUFSLUlSOiBJT0FQ SUMgaWQgOCB1bmRlciBEUkhEIGJhc2UgIDB4ZmVkOTEwMDAgSU9NTVUgMQpbICAgIDAuMDczMDE3 XSBETUFSLUlSOiBIUEVUIGlkIDAgdW5kZXIgRFJIRCBiYXNlIDB4ZmVkOTEwMDAKWyAgICAwLjA3 MzAxOF0gRE1BUi1JUjogUXVldWVkIGludmFsaWRhdGlvbiB3aWxsIGJlIGVuYWJsZWQgdG8gc3Vw cG9ydCB4MmFwaWMgYW5kIEludHItcmVtYXBwaW5nLgpbICAgIDAuMDczMjU0XSBETUFSLUlSOiBF bmFibGVkIElSUSByZW1hcHBpbmcgaW4geDJhcGljIG1vZGUKWyAgICAwLjA3MzI1NV0geDJhcGlj IGVuYWJsZWQKWyAgICAwLjA3MzI2Ml0gU3dpdGNoZWQgQVBJQyByb3V0aW5nIHRvIGNsdXN0ZXIg eDJhcGljLgpbICAgIDAuMDczODM2XSAuLlRJTUVSOiB2ZWN0b3I9MHgzMCBhcGljMT0wIHBpbjE9 MiBhcGljMj0tMSBwaW4yPS0xClsgICAgMC4wODM4NDddIFRTQyBkZWFkbGluZSB0aW1lciBlbmFi bGVkClsgICAgMC4wODM4NTBdIHNtcGJvb3Q6IENQVTA6IEludGVsKFIpIENvcmUoVE0pIGk3LTQ3 NzAgQ1BVIEAgMy40MEdIeiAoZmFtaWx5OiAweDYsIG1vZGVsOiAweDNjLCBzdGVwcGluZzogMHgz KQpbICAgIDAuMDgzODYwXSBQZXJmb3JtYW5jZSBFdmVudHM6IFBFQlMgZm10MissIDE2LWRlZXAg TEJSLCBIYXN3ZWxsIGV2ZW50cywgZnVsbC13aWR0aCBjb3VudGVycywgSW50ZWwgUE1VIGRyaXZl ci4KWyAgICAwLjA4Mzg3OF0gLi4uIHZlcnNpb246ICAgICAgICAgICAgICAgIDMKWyAgICAwLjA4 Mzg3OV0gLi4uIGJpdCB3aWR0aDogICAgICAgICAgICAgIDQ4ClsgICAgMC4wODM4ODBdIC4uLiBn ZW5lcmljIHJlZ2lzdGVyczogICAgICA0ClsgICAgMC4wODM4ODBdIC4uLiB2YWx1ZSBtYXNrOiAg ICAgICAgICAgICAwMDAwZmZmZmZmZmZmZmZmClsgICAgMC4wODM4ODFdIC4uLiBtYXggcGVyaW9k OiAgICAgICAgICAgICAwMDAwZmZmZmZmZmZmZmZmClsgICAgMC4wODM4ODJdIC4uLiBmaXhlZC1w dXJwb3NlIGV2ZW50czogICAzClsgICAgMC4wODM4ODJdIC4uLiBldmVudCBtYXNrOiAgICAgICAg ICAgICAwMDAwMDAwNzAwMDAwMDBmClsgICAgMC4wODUyMTldIE5NSSB3YXRjaGRvZzogZW5hYmxl ZCBvbiBhbGwgQ1BVcywgcGVybWFuZW50bHkgY29uc3VtZXMgb25lIGh3LVBNVSBjb3VudGVyLgpb ICAgIDAuMDg1NjMyXSB4ODY6IEJvb3RpbmcgU01QIGNvbmZpZ3VyYXRpb246ClsgICAgMC4wODU2 MzRdIC4uLi4gbm9kZSAgIzAsIENQVXM6ICAgICAgIzEgIzIgIzMgIzQgIzUgIzYgIzcKWyAgICAw LjUyMzE4Ml0geDg2OiBCb290ZWQgdXAgMSBub2RlLCA4IENQVXMKWyAgICAwLjUyMzE4NV0gc21w Ym9vdDogVG90YWwgb2YgOCBwcm9jZXNzb3JzIGFjdGl2YXRlZCAoNTQzOTMuMjEgQm9nb01JUFMp ClsgICAgMC41MzAzNzBdIGRldnRtcGZzOiBpbml0aWFsaXplZApbICAgIDAuNTMwNTYzXSB4ODYv bW06IE1lbW9yeSBibG9jayBzaXplOiAxMjhNQgpbICAgIDAuNTQxOTkxXSBQTTogUmVnaXN0ZXJp bmcgQUNQSSBOVlMgcmVnaW9uIFttZW0gMHg4OWVlYjAwMC0weDg5ZWYxZmZmXSAoMjg2NzIgYnl0 ZXMpClsgICAgMC41NDE5OTNdIFBNOiBSZWdpc3RlcmluZyBBQ1BJIE5WUyByZWdpb24gW21lbSAw eDlkNjhjMDAwLTB4OWQ3NDdmZmZdICg3NzAwNDggYnl0ZXMpClsgICAgMC41NDIxODddIGNsb2Nr c291cmNlOiBqaWZmaWVzOiBtYXNrOiAweGZmZmZmZmZmIG1heF9jeWNsZXM6IDB4ZmZmZmZmZmYs IG1heF9pZGxlX25zOiAxOTExMjYwNDQ2Mjc1MDAwIG5zClsgICAgMC41NDIzNTFdIGF0b21pYzY0 X3Rlc3Q6IHBhc3NlZCBmb3IgeDg2LTY0IHBsYXRmb3JtIHdpdGggQ1g4IGFuZCB3aXRoIFNTRQpb ICAgIDAuNTQyMzU0XSBwaW5jdHJsIGNvcmU6IGluaXRpYWxpemVkIHBpbmN0cmwgc3Vic3lzdGVt ClsgICAgMC41NDI1MzFdIFJUQyB0aW1lOiAxMToyNDoxNywgZGF0ZTogMDgvMTgvMTYKWyAgICAw LjU0MzQ3OV0gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxNgpbICAgIDAuNTQ2MzI0 XSBjcHVpZGxlOiB1c2luZyBnb3Zlcm5vciBtZW51ClsgICAgMC41NDY0NjddIEFDUEkgRkFEVCBk ZWNsYXJlcyB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBQQ0llIEFTUE0sIHNvIGRpc2FibGUg aXQKWyAgICAwLjU0NjQ3OF0gQUNQSTogYnVzIHR5cGUgUENJIHJlZ2lzdGVyZWQKWyAgICAwLjU0 NjQ3OV0gYWNwaXBocDogQUNQSSBIb3QgUGx1ZyBQQ0kgQ29udHJvbGxlciBEcml2ZXIgdmVyc2lv bjogMC41ClsgICAgMC41NDY2MzhdIFBDSTogTU1DT05GSUcgZm9yIGRvbWFpbiAwMDAwIFtidXMg MDAtM2ZdIGF0IFttZW0gMHhmODAwMDAwMC0weGZiZmZmZmZmXSAoYmFzZSAweGY4MDAwMDAwKQpb ICAgIDAuNTQ2NjQwXSBQQ0k6IE1NQ09ORklHIGF0IFttZW0gMHhmODAwMDAwMC0weGZiZmZmZmZm XSByZXNlcnZlZCBpbiBFODIwClsgICAgMC41NDY2NDRdIHBtZF9zZXRfaHVnZTogQ2Fubm90IHNh dGlzZnkgW21lbSAweGY4MDAwMDAwLTB4ZjgyMDAwMDBdIHdpdGggYSBodWdlLXBhZ2UgbWFwcGlu ZyBkdWUgdG8gTVRSUiBvdmVycmlkZS4KWyAgICAwLjU0NjcwNF0gUENJOiBVc2luZyBjb25maWd1 cmF0aW9uIHR5cGUgMSBmb3IgYmFzZSBhY2Nlc3MKWyAgICAwLjU0NjcyOV0gY29yZTogUE1VIGVy cmF0dW0gQkoxMjIsIEJWOTgsIEhTRDI5IHdvcmtlZCBhcm91bmQsIEhUIGlzIG9uClsgICAgMC41 NTQ2MDldIEh1Z2VUTEIgcmVnaXN0ZXJlZCAxIEdCIHBhZ2Ugc2l6ZSwgcHJlLWFsbG9jYXRlZCAw IHBhZ2VzClsgICAgMC41NTQ2MTFdIEh1Z2VUTEIgcmVnaXN0ZXJlZCAyIE1CIHBhZ2Ugc2l6ZSwg cHJlLWFsbG9jYXRlZCAwIHBhZ2VzClsgICAgMC41NTUyNzhdIEFDUEk6IEFkZGVkIF9PU0koTW9k dWxlIERldmljZSkKWyAgICAwLjU1NTI4MF0gQUNQSTogQWRkZWQgX09TSShQcm9jZXNzb3IgRGV2 aWNlKQpbICAgIDAuNTU1MjgxXSBBQ1BJOiBBZGRlZCBfT1NJKDMuMCBfU0NQIEV4dGVuc2lvbnMp ClsgICAgMC41NTUyODNdIEFDUEk6IEFkZGVkIF9PU0koUHJvY2Vzc29yIEFnZ3JlZ2F0b3IgRGV2 aWNlKQpbICAgIDAuNTU2NjA5XSBBQ1BJOiBFeGVjdXRlZCAxIGJsb2NrcyBvZiBtb2R1bGUtbGV2 ZWwgZXhlY3V0YWJsZSBBTUwgY29kZQpbICAgIDAuNTcxMjk5XSBbRmlybXdhcmUgQnVnXTogQUNQ STogQklPUyBfT1NJKExpbnV4KSBxdWVyeSBpZ25vcmVkClsgICAgMC41NzMwNTddIEFDUEk6IER5 bmFtaWMgT0VNIFRhYmxlIExvYWQ6ClsgICAgMC41NzMwNjldIEFDUEk6IFNTRFQgMHhGRkZGODgw N0ZBQUU5QzAwIDAwMDNEMyAodjAxIFBtUmVmICBDcHUwQ3N0ICAwMDAwMzAwMSBJTlRMIDIwMTIw NzExKQpbICAgIDAuNTc1MjA4XSBBQ1BJOiBEeW5hbWljIE9FTSBUYWJsZSBMb2FkOgpbICAgIDAu NTc1MjE5XSBBQ1BJOiBTU0RUIDB4RkZGRjg4MDdGQUQ2QTAwMCAwMDA1QUEgKHYwMSBQbVJlZiAg QXBJc3QgICAgMDAwMDMwMDAgSU5UTCAyMDEyMDcxMSkKWyAgICAwLjU3NzU1OF0gQUNQSTogRHlu YW1pYyBPRU0gVGFibGUgTG9hZDoKWyAgICAwLjU3NzU2OF0gQUNQSTogU1NEVCAweEZGRkY4ODA3 RkFENjRDMDAgMDAwMTE5ICh2MDEgUG1SZWYgIEFwQ3N0ICAgIDAwMDAzMDAwIElOVEwgMjAxMjA3 MTEpClsgICAgMC41ODI4MjBdIEFDUEk6IEludGVycHJldGVyIGVuYWJsZWQKWyAgICAwLjU4Mjg2 Ml0gQUNQSTogKHN1cHBvcnRzIFMwIFMzIFM0IFM1KQpbICAgIDAuNTgyODYzXSBBQ1BJOiBVc2lu ZyBJT0FQSUMgZm9yIGludGVycnVwdCByb3V0aW5nClsgICAgMC41ODI5MDldIFBDSTogVXNpbmcg aG9zdCBicmlkZ2Ugd2luZG93cyBmcm9tIEFDUEk7IGlmIG5lY2Vzc2FyeSwgdXNlICJwY2k9bm9j cnMiIGFuZCByZXBvcnQgYSBidWcKWyAgICAwLjYwNzg3MF0gQUNQSTogUG93ZXIgUmVzb3VyY2Ug W0ZOMDBdIChvZmYpClsgICAgMC42MDgxNjRdIEFDUEk6IFBvd2VyIFJlc291cmNlIFtGTjAxXSAo b2ZmKQpbICAgIDAuNjA4MzkwXSBBQ1BJOiBQb3dlciBSZXNvdXJjZSBbRk4wMl0gKG9mZikKWyAg ICAwLjYwODYyNV0gQUNQSTogUG93ZXIgUmVzb3VyY2UgW0ZOMDNdIChvZmYpClsgICAgMC42MDg4 NTRdIEFDUEk6IFBvd2VyIFJlc291cmNlIFtGTjA0XSAob2ZmKQpbICAgIDAuNjExNDgzXSBBQ1BJ OiBQQ0kgUm9vdCBCcmlkZ2UgW1BDSTBdIChkb21haW4gMDAwMCBbYnVzIDAwLTNlXSkKWyAgICAw LjYxMTQ4OF0gYWNwaSBQTlAwQTA4OjAwOiBfT1NDOiBPUyBzdXBwb3J0cyBbRXh0ZW5kZWRDb25m aWcgQVNQTSBDbG9ja1BNIFNlZ21lbnRzIE1TSV0KWyAgICAwLjYxMTk5OF0gYWNwaSBQTlAwQTA4 OjAwOiBfT1NDOiBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IFtQQ0llSG90cGx1ZyBQTUVdClsg ICAgMC42MTIzOTddIGFjcGkgUE5QMEEwODowMDogX09TQzogT1Mgbm93IGNvbnRyb2xzIFtBRVIg UENJZUNhcGFiaWxpdHldClsgICAgMC42MTIzOTldIGFjcGkgUE5QMEEwODowMDogRkFEVCBpbmRp Y2F0ZXMgQVNQTSBpcyB1bnN1cHBvcnRlZCwgdXNpbmcgQklPUyBjb25maWd1cmF0aW9uClsgICAg MC42MTM2MTFdIFBDSSBob3N0IGJyaWRnZSB0byBidXMgMDAwMDowMApbICAgIDAuNjEzNjEzXSBw Y2lfYnVzIDAwMDA6MDA6IHJvb3QgYnVzIHJlc291cmNlIFtpbyAgMHgwMDAwLTB4MGNmNyB3aW5k b3ddClsgICAgMC42MTM2MTRdIHBjaV9idXMgMDAwMDowMDogcm9vdCBidXMgcmVzb3VyY2UgW2lv ICAweDBkMDAtMHhmZmZmIHdpbmRvd10KWyAgICAwLjYxMzYxNV0gcGNpX2J1cyAwMDAwOjAwOiBy b290IGJ1cyByZXNvdXJjZSBbbWVtIDB4MDAwYTAwMDAtMHgwMDBiZmZmZiB3aW5kb3ddClsgICAg MC42MTM2MTddIHBjaV9idXMgMDAwMDowMDogcm9vdCBidXMgcmVzb3VyY2UgW21lbSAweDAwMGQw MDAwLTB4MDAwZDNmZmYgd2luZG93XQpbICAgIDAuNjEzNjE4XSBwY2lfYnVzIDAwMDA6MDA6IHJv b3QgYnVzIHJlc291cmNlIFttZW0gMHgwMDBkNDAwMC0weDAwMGQ3ZmZmIHdpbmRvd10KWyAgICAw LjYxMzYxOV0gcGNpX2J1cyAwMDAwOjAwOiByb290IGJ1cyByZXNvdXJjZSBbbWVtIDB4MDAwZDgw MDAtMHgwMDBkYmZmZiB3aW5kb3ddClsgICAgMC42MTM2MjBdIHBjaV9idXMgMDAwMDowMDogcm9v dCBidXMgcmVzb3VyY2UgW21lbSAweDAwMGRjMDAwLTB4MDAwZGZmZmYgd2luZG93XQpbICAgIDAu NjEzNjIxXSBwY2lfYnVzIDAwMDA6MDA6IHJvb3QgYnVzIHJlc291cmNlIFttZW0gMHhkZmEwMDAw MC0weGZlYWZmZmZmIHdpbmRvd10KWyAgICAwLjYxMzYyMl0gcGNpX2J1cyAwMDAwOjAwOiByb290 IGJ1cyByZXNvdXJjZSBbYnVzIDAwLTNlXQpbICAgIDAuNjEzNjU4XSBwY2kgMDAwMDowMDowMC4w OiBbODA4NjowYzAwXSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMC42MTM5MzldIHBjaSAw MDAwOjAwOjAyLjA6IFs4MDg2OjA0MTJdIHR5cGUgMDAgY2xhc3MgMHgwMzAwMDAKWyAgICAwLjYx Mzk1MV0gcGNpIDAwMDA6MDA6MDIuMDogcmVnIDB4MTA6IFttZW0gMHhmNzgwMDAwMC0weGY3YmZm ZmZmIDY0Yml0XQpbICAgIDAuNjEzOTU5XSBwY2kgMDAwMDowMDowMi4wOiByZWcgMHgxODogW21l bSAweGUwMDAwMDAwLTB4ZWZmZmZmZmYgNjRiaXQgcHJlZl0KWyAgICAwLjYxMzk2NF0gcGNpIDAw MDA6MDA6MDIuMDogcmVnIDB4MjA6IFtpbyAgMHhmMDAwLTB4ZjAzZl0KWyAgICAwLjYxNDIzNV0g cGNpIDAwMDA6MDA6MDMuMDogWzgwODY6MGMwY10gdHlwZSAwMCBjbGFzcyAweDA0MDMwMApbICAg IDAuNjE0MjQ0XSBwY2kgMDAwMDowMDowMy4wOiByZWcgMHgxMDogW21lbSAweGY3ZTE0MDAwLTB4 ZjdlMTdmZmYgNjRiaXRdClsgICAgMC42MTQ0NzVdIHBjaSAwMDAwOjAwOjE0LjA6IFs4MDg2Ojhj MzFdIHR5cGUgMDAgY2xhc3MgMHgwYzAzMzAKWyAgICAwLjYxNDQ5M10gcGNpIDAwMDA6MDA6MTQu MDogcmVnIDB4MTA6IFttZW0gMHhmN2UwMDAwMC0weGY3ZTBmZmZmIDY0Yml0XQpbICAgIDAuNjE0 NTY4XSBwY2kgMDAwMDowMDoxNC4wOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQzaG90IEQzY29sZApb ICAgIDAuNjE0NzE1XSBwY2kgMDAwMDowMDoxNC4wOiBTeXN0ZW0gd2FrZXVwIGRpc2FibGVkIGJ5 IEFDUEkKWyAgICAwLjYxNDgwN10gcGNpIDAwMDA6MDA6MTYuMDogWzgwODY6OGMzYV0gdHlwZSAw MCBjbGFzcyAweDA3ODAwMApbICAgIDAuNjE0ODI2XSBwY2kgMDAwMDowMDoxNi4wOiByZWcgMHgx MDogW21lbSAweGY3ZTFjMDAwLTB4ZjdlMWMwMGYgNjRiaXRdClsgICAgMC42MTQ5MDBdIHBjaSAw MDAwOjAwOjE2LjA6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDNob3QgRDNjb2xkClsgICAgMC42 MTUwOTVdIHBjaSAwMDAwOjAwOjFiLjA6IFs4MDg2OjhjMjBdIHR5cGUgMDAgY2xhc3MgMHgwNDAz MDAKWyAgICAwLjYxNTExMF0gcGNpIDAwMDA6MDA6MWIuMDogcmVnIDB4MTA6IFttZW0gMHhmN2Ux MDAwMC0weGY3ZTEzZmZmIDY0Yml0XQpbICAgIDAuNjE1MTc5XSBwY2kgMDAwMDowMDoxYi4wOiBQ TUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQzaG90IEQzY29sZApbICAgIDAuNjE1MjkzXSBwY2kgMDAw MDowMDoxYi4wOiBTeXN0ZW0gd2FrZXVwIGRpc2FibGVkIGJ5IEFDUEkKWyAgICAwLjYxNTM4M10g cGNpIDAwMDA6MDA6MWMuMDogWzgwODY6OGMxMF0gdHlwZSAwMSBjbGFzcyAweDA2MDQwMApbICAg IDAuNjE1NDU3XSBwY2kgMDAwMDowMDoxYy4wOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQzaG90 IEQzY29sZApbICAgIDAuNjE1NjkwXSBwY2kgMDAwMDowMDoxYy4wOiBTeXN0ZW0gd2FrZXVwIGRp c2FibGVkIGJ5IEFDUEkKWyAgICAwLjYxNTc4NF0gcGNpIDAwMDA6MDA6MWMuMjogWzgwODY6OGMx NF0gdHlwZSAwMSBjbGFzcyAweDA2MDQwMApbICAgIDAuNjE1ODYwXSBwY2kgMDAwMDowMDoxYy4y OiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQzaG90IEQzY29sZApbICAgIDAuNjE2MDc2XSBwY2kg MDAwMDowMDoxYy4yOiBTeXN0ZW0gd2FrZXVwIGRpc2FibGVkIGJ5IEFDUEkKWyAgICAwLjYxNjE2 OF0gcGNpIDAwMDA6MDA6MWMuMzogWzgwODY6OGMxNl0gdHlwZSAwMSBjbGFzcyAweDA2MDQwMApb ICAgIDAuNjE2MjQzXSBwY2kgMDAwMDowMDoxYy4zOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQz aG90IEQzY29sZApbICAgIDAuNjE2NDU3XSBwY2kgMDAwMDowMDoxYy4zOiBTeXN0ZW0gd2FrZXVw IGRpc2FibGVkIGJ5IEFDUEkKWyAgICAwLjYxNjU1MF0gcGNpIDAwMDA6MDA6MWMuNDogWzgwODY6 OGMxOF0gdHlwZSAwMSBjbGFzcyAweDA2MDQwMApbICAgIDAuNjE2NjMxXSBwY2kgMDAwMDowMDox Yy40OiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQzaG90IEQzY29sZApbICAgIDAuNjE2ODQ3XSBw Y2kgMDAwMDowMDoxYy40OiBTeXN0ZW0gd2FrZXVwIGRpc2FibGVkIGJ5IEFDUEkKWyAgICAwLjYx Njk0NV0gcGNpIDAwMDA6MDA6MWYuMDogWzgwODY6OGM0NF0gdHlwZSAwMCBjbGFzcyAweDA2MDEw MApbICAgIDAuNjE3MjMzXSBwY2kgMDAwMDowMDoxZi4yOiBbODA4Njo4YzAyXSB0eXBlIDAwIGNs YXNzIDB4MDEwNjAxClsgICAgMC42MTcyNDddIHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAweDEwOiBb aW8gIDB4ZjBiMC0weGYwYjddClsgICAgMC42MTcyNTVdIHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAw eDE0OiBbaW8gIDB4ZjBhMC0weGYwYTNdClsgICAgMC42MTcyNjJdIHBjaSAwMDAwOjAwOjFmLjI6 IHJlZyAweDE4OiBbaW8gIDB4ZjA5MC0weGYwOTddClsgICAgMC42MTcyNjldIHBjaSAwMDAwOjAw OjFmLjI6IHJlZyAweDFjOiBbaW8gIDB4ZjA4MC0weGYwODNdClsgICAgMC42MTcyNzddIHBjaSAw MDAwOjAwOjFmLjI6IHJlZyAweDIwOiBbaW8gIDB4ZjA2MC0weGYwN2ZdClsgICAgMC42MTcyODRd IHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAweDI0OiBbbWVtIDB4ZjdlMWEwMDAtMHhmN2UxYTdmZl0K WyAgICAwLjYxNzMyN10gcGNpIDAwMDA6MDA6MWYuMjogUE1FIyBzdXBwb3J0ZWQgZnJvbSBEM2hv dApbICAgIDAuNjE3NTE2XSBwY2kgMDAwMDowMDoxZi4zOiBbODA4Njo4YzIyXSB0eXBlIDAwIGNs YXNzIDB4MGMwNTAwClsgICAgMC42MTc1MzJdIHBjaSAwMDAwOjAwOjFmLjM6IHJlZyAweDEwOiBb bWVtIDB4ZjdlMTkwMDAtMHhmN2UxOTBmZiA2NGJpdF0KWyAgICAwLjYxNzU1M10gcGNpIDAwMDA6 MDA6MWYuMzogcmVnIDB4MjA6IFtpbyAgMHhmMDQwLTB4ZjA1Zl0KWyAgICAwLjYxODAwOF0gYWNw aXBocDogU2xvdCBbMV0gcmVnaXN0ZXJlZApbICAgIDAuNjE4MDE0XSBwY2kgMDAwMDowMDoxYy4w OiBQQ0kgYnJpZGdlIHRvIFtidXMgMDFdClsgICAgMC42MTgxNDhdIHBjaSAwMDAwOjAyOjAwLjA6 IFsxMGVjOjgxNjhdIHR5cGUgMDAgY2xhc3MgMHgwMjAwMDAKWyAgICAwLjYxODE2OV0gcGNpIDAw MDA6MDI6MDAuMDogcmVnIDB4MTA6IFtpbyAgMHhlMDAwLTB4ZTBmZl0KWyAgICAwLjYxODE5OV0g cGNpIDAwMDA6MDI6MDAuMDogcmVnIDB4MTg6IFttZW0gMHhmN2QwMDAwMC0weGY3ZDAwZmZmIDY0 Yml0XQpbICAgIDAuNjE4MjE4XSBwY2kgMDAwMDowMjowMC4wOiByZWcgMHgyMDogW21lbSAweGYw MDAwMDAwLTB4ZjAwMDNmZmYgNjRiaXQgcHJlZl0KWyAgICAwLjYxODMyM10gcGNpIDAwMDA6MDI6 MDAuMDogc3VwcG9ydHMgRDEgRDIKWyAgICAwLjYxODMyNF0gcGNpIDAwMDA6MDI6MDAuMDogUE1F IyBzdXBwb3J0ZWQgZnJvbSBEMCBEMSBEMiBEM2hvdCBEM2NvbGQKWyAgICAwLjYxODM5NF0gcGNp IDAwMDA6MDI6MDAuMDogU3lzdGVtIHdha2V1cCBkaXNhYmxlZCBieSBBQ1BJClsgICAgMC42MjA1 OTddIHBjaSAwMDAwOjAwOjFjLjI6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMl0KWyAgICAwLjYyMDYw MF0gcGNpIDAwMDA6MDA6MWMuMjogICBicmlkZ2Ugd2luZG93IFtpbyAgMHhlMDAwLTB4ZWZmZl0K WyAgICAwLjYyMDYwM10gcGNpIDAwMDA6MDA6MWMuMjogICBicmlkZ2Ugd2luZG93IFttZW0gMHhm N2QwMDAwMC0weGY3ZGZmZmZmXQpbICAgIDAuNjIwNjA4XSBwY2kgMDAwMDowMDoxYy4yOiAgIGJy aWRnZSB3aW5kb3cgW21lbSAweGYwMDAwMDAwLTB4ZjAwZmZmZmYgNjRiaXQgcHJlZl0KWyAgICAw LjYyMDczOV0gcGNpIDAwMDA6MDM6MDAuMDogWzgwODY6MjQ0ZV0gdHlwZSAwMSBjbGFzcyAweDA2 MDQwMQpbICAgIDAuNjIwODc1XSBwY2kgMDAwMDowMzowMC4wOiBzdXBwb3J0cyBEMSBEMgpbICAg IDAuNjIwODc2XSBwY2kgMDAwMDowMzowMC4wOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQxIEQy IEQzaG90IEQzY29sZApbICAgIDAuNjIwOTI3XSBwY2kgMDAwMDowMzowMC4wOiBTeXN0ZW0gd2Fr ZXVwIGRpc2FibGVkIGJ5IEFDUEkKWyAgICAwLjYyMTAxM10gcGNpIDAwMDA6MDA6MWMuMzogUENJ IGJyaWRnZSB0byBbYnVzIDAzLTA0XQpbICAgIDAuNjIxMTgzXSBwY2kgMDAwMDowMzowMC4wOiBQ Q0kgYnJpZGdlIHRvIFtidXMgMDRdIChzdWJ0cmFjdGl2ZSBkZWNvZGUpClsgICAgMC42MjEzMzld IHBjaSAwMDAwOjA1OjAwLjA6IFsxMTAyOjAwMTJdIHR5cGUgMDAgY2xhc3MgMHgwNDAzMDAKWyAg ICAwLjYyMTM2Ml0gcGNpIDAwMDA6MDU6MDAuMDogcmVnIDB4MTA6IFttZW0gMHhmN2MwNDAwMC0w eGY3YzA3ZmZmIDY0Yml0XQpbICAgIDAuNjIxMzc3XSBwY2kgMDAwMDowNTowMC4wOiByZWcgMHgx ODogW21lbSAweGY3YzAwMDAwLTB4ZjdjMDNmZmYgNjRiaXRdClsgICAgMC42MjE0ODVdIHBjaSAw MDAwOjA1OjAwLjA6IHN1cHBvcnRzIEQyClsgICAgMC42MjE1NDhdIHBjaSAwMDAwOjA1OjAwLjA6 IFN5c3RlbSB3YWtldXAgZGlzYWJsZWQgYnkgQUNQSQpbICAgIDAuNjIzNTk3XSBwY2kgMDAwMDow MDoxYy40OiBQQ0kgYnJpZGdlIHRvIFtidXMgMDVdClsgICAgMC42MjM2MDJdIHBjaSAwMDAwOjAw OjFjLjQ6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIDB4ZjdjMDAwMDAtMHhmN2NmZmZmZl0KWyAgICAw LjYyNTc2NF0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktBXSAoSVJRcyAzIDQgNSA2IDEw ICoxMSAxMiAxNCAxNSkKWyAgICAwLjYyNTg5MV0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtM TktCXSAoSVJRcyAzIDQgNSA2IDEwIDExIDEyIDE0IDE1KSAqMCwgZGlzYWJsZWQuClsgICAgMC42 MjYwMTddIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LQ10gKElSUXMgMyA0IDUgNiAxMCAq MTEgMTIgMTQgMTUpClsgICAgMC42MjYxNDJdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5L RF0gKElSUXMgMyA0IDUgNiAqMTAgMTEgMTIgMTQgMTUpClsgICAgMC42MjYyNjVdIEFDUEk6IFBD SSBJbnRlcnJ1cHQgTGluayBbTE5LRV0gKElSUXMgMyA0IDUgNiAxMCAxMSAxMiAxNCAxNSkgKjAs IGRpc2FibGVkLgpbICAgIDAuNjI2Mzg5XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xOS0Zd IChJUlFzIDMgNCA1IDYgMTAgMTEgMTIgMTQgMTUpICowLCBkaXNhYmxlZC4KWyAgICAwLjYyNjUx M10gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktHXSAoSVJRcyAqMyA0IDUgNiAxMCAxMSAx MiAxNCAxNSkKWyAgICAwLjYyNjY0NF0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktIXSAo SVJRcyAzIDQgNSA2IDEwIDExIDEyIDE0IDE1KSAqMCwgZGlzYWJsZWQuClsgICAgMC42Mjc0Mjdd IEFDUEk6IEVuYWJsZWQgNCBHUEVzIGluIGJsb2NrIDAwIHRvIDNGClsgICAgMC42Mjc4ODFdIHZn YWFyYjogc2V0dGluZyBhcyBib290IGRldmljZTogUENJOjAwMDA6MDA6MDIuMApbICAgIDAuNjI3 ODgyXSB2Z2FhcmI6IGRldmljZSBhZGRlZDogUENJOjAwMDA6MDA6MDIuMCxkZWNvZGVzPWlvK21l bSxvd25zPWlvK21lbSxsb2Nrcz1ub25lClsgICAgMC42Mjc4ODhdIHZnYWFyYjogbG9hZGVkClsg ICAgMC42Mjc4ODldIHZnYWFyYjogYnJpZGdlIGNvbnRyb2wgcG9zc2libGUgMDAwMDowMDowMi4w ClsgICAgMC42MjgwNzFdIFNDU0kgc3Vic3lzdGVtIGluaXRpYWxpemVkClsgICAgMC42MjgxNTRd IGxpYmF0YSB2ZXJzaW9uIDMuMDAgbG9hZGVkLgpbICAgIDAuNjI4MjA3XSBBQ1BJOiBidXMgdHlw ZSBVU0IgcmVnaXN0ZXJlZApbICAgIDAuNjI4MjcwXSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBp bnRlcmZhY2UgZHJpdmVyIHVzYmZzClsgICAgMC42MjgyOTBdIHVzYmNvcmU6IHJlZ2lzdGVyZWQg bmV3IGludGVyZmFjZSBkcml2ZXIgaHViClsgICAgMC42MjgzMzddIHVzYmNvcmU6IHJlZ2lzdGVy ZWQgbmV3IGRldmljZSBkcml2ZXIgdXNiClsgICAgMC42Mjg2OThdIFBDSTogVXNpbmcgQUNQSSBm b3IgSVJRIHJvdXRpbmcKWyAgICAwLjYzMDA5MF0gUENJOiBwY2lfY2FjaGVfbGluZV9zaXplIHNl dCB0byA2NCBieXRlcwpbICAgIDAuNjMwMTM3XSBlODIwOiByZXNlcnZlIFJBTSBidWZmZXIgW21l bSAweDAwMDU4MDAwLTB4MDAwNWZmZmZdClsgICAgMC42MzAxNDNdIGU4MjA6IHJlc2VydmUgUkFN IGJ1ZmZlciBbbWVtIDB4MDAwOWYwMDAtMHgwMDA5ZmZmZl0KWyAgICAwLjYzMDE0NF0gZTgyMDog cmVzZXJ2ZSBSQU0gYnVmZmVyIFttZW0gMHg4OWJiYTAxOC0weDhiZmZmZmZmXQpbICAgIDAuNjMw MTQ2XSBlODIwOiByZXNlcnZlIFJBTSBidWZmZXIgW21lbSAweDg5YmNiMDE4LTB4OGJmZmZmZmZd ClsgICAgMC42MzAxNDddIGU4MjA6IHJlc2VydmUgUkFNIGJ1ZmZlciBbbWVtIDB4ODllZWIwMDAt MHg4YmZmZmZmZl0KWyAgICAwLjYzMDE0OV0gZTgyMDogcmVzZXJ2ZSBSQU0gYnVmZmVyIFttZW0g MHg4YTljODAwMC0weDhiZmZmZmZmXQpbICAgIDAuNjMwMTUwXSBlODIwOiByZXNlcnZlIFJBTSBi dWZmZXIgW21lbSAweDlkNWFkMDAwLTB4OWZmZmZmZmZdClsgICAgMC42MzAxNTJdIGU4MjA6IHJl c2VydmUgUkFNIGJ1ZmZlciBbbWVtIDB4OWQ2OGMwMDAtMHg5ZmZmZmZmZl0KWyAgICAwLjYzMDE1 M10gZTgyMDogcmVzZXJ2ZSBSQU0gYnVmZmVyIFttZW0gMHg5ZjAwMDAwMC0weDlmZmZmZmZmXQpb ICAgIDAuNjMwMTU1XSBlODIwOiByZXNlcnZlIFJBTSBidWZmZXIgW21lbSAweDgxZjYwMDAwMC0w eDgxZmZmZmZmZl0KWyAgICAwLjYzMDYzNF0gTmV0TGFiZWw6IEluaXRpYWxpemluZwpbICAgIDAu NjMwNjM1XSBOZXRMYWJlbDogIGRvbWFpbiBoYXNoIHNpemUgPSAxMjgKWyAgICAwLjYzMDYzNl0g TmV0TGFiZWw6ICBwcm90b2NvbHMgPSBVTkxBQkVMRUQgQ0lQU092NApbICAgIDAuNjMwNjY4XSBO ZXRMYWJlbDogIHVubGFiZWxlZCB0cmFmZmljIGFsbG93ZWQgYnkgZGVmYXVsdApbICAgIDAuNjMw Nzc5XSBocGV0MDogYXQgTU1JTyAweGZlZDAwMDAwLCBJUlFzIDIsIDgsIDAsIDAsIDAsIDAsIDAs IDAKWyAgICAwLjYzMDc4M10gaHBldDA6IDggY29tcGFyYXRvcnMsIDY0LWJpdCAxNC4zMTgxODAg TUh6IGNvdW50ZXIKWyAgICAwLjYzMjgwMl0gYW1kX25iOiBDYW5ub3QgZW51bWVyYXRlIEFNRCBu b3J0aGJyaWRnZXMKWyAgICAwLjYzMjg0NF0gY2xvY2tzb3VyY2U6IFN3aXRjaGVkIHRvIGNsb2Nr c291cmNlIGhwZXQKWyAgICAwLjY2MTg4Ml0gVkZTOiBEaXNrIHF1b3RhcyBkcXVvdF82LjYuMApb ICAgIDAuNjYxOTEyXSBWRlM6IERxdW90LWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogNTEyIChv cmRlciAwLCA0MDk2IGJ5dGVzKQpbICAgIDAuNjYyMjgzXSBwbnA6IFBuUCBBQ1BJIGluaXQKWyAg ICAwLjY2MjUyM10gc3lzdGVtIDAwOjAwOiBbbWVtIDB4ZmVkNDAwMDAtMHhmZWQ0NGZmZl0gaGFz IGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2MjU2Nl0gc3lzdGVtIDAwOjAwOiBQbHVnIGFuZCBQbGF5 IEFDUEkgZGV2aWNlLCBJRHMgUE5QMGMwMSAoYWN0aXZlKQpbICAgIDAuNjYyOTM0XSBzeXN0ZW0g MDA6MDE6IFtpbyAgMHgwNjgwLTB4MDY5Zl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2Mjkz Nl0gc3lzdGVtIDAwOjAxOiBbaW8gIDB4ZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2 MjkzOF0gc3lzdGVtIDAwOjAxOiBbaW8gIDB4ZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAw LjY2Mjk0MF0gc3lzdGVtIDAwOjAxOiBbaW8gIDB4ZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAg ICAwLjY2Mjk0MV0gc3lzdGVtIDAwOjAxOiBbaW8gIDB4MWMwMC0weDFjZmVdIGhhcyBiZWVuIHJl c2VydmVkClsgICAgMC42NjI5NDNdIHN5c3RlbSAwMDowMTogW2lvICAweDFkMDAtMHgxZGZlXSBo YXMgYmVlbiByZXNlcnZlZApbICAgIDAuNjYyOTQ0XSBzeXN0ZW0gMDA6MDE6IFtpbyAgMHgxZTAw LTB4MWVmZV0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2Mjk0Nl0gc3lzdGVtIDAwOjAxOiBb aW8gIDB4MWYwMC0weDFmZmVdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC42NjI5NDldIHN5c3Rl bSAwMDowMTogW2lvICAweDE4MDAtMHgxOGZlXSBjb3VsZCBub3QgYmUgcmVzZXJ2ZWQKWyAgICAw LjY2Mjk1MF0gc3lzdGVtIDAwOjAxOiBbaW8gIDB4MTY0ZS0weDE2NGZdIGhhcyBiZWVuIHJlc2Vy dmVkClsgICAgMC42NjI5NTVdIHN5c3RlbSAwMDowMTogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmlj ZSwgSURzIFBOUDBjMDIgKGFjdGl2ZSkKWyAgICAwLjY2MzAxNl0gcG5wIDAwOjAyOiBQbHVnIGFu ZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMGIwMCAoYWN0aXZlKQpbICAgIDAuNjYzMTMyXSBz eXN0ZW0gMDA6MDM6IFtpbyAgMHgxODU0LTB4MTg1N10gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAw LjY2MzEzN10gc3lzdGVtIDAwOjAzOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgSU5U M2YwZCBQTlAwYzAyIChhY3RpdmUpClsgICAgMC42NjM0MDhdIHN5c3RlbSAwMDowNDogW2lvICAw eDBhMDAtMHgwYTBmXSBoYXMgYmVlbiByZXNlcnZlZApbICAgIDAuNjYzNDEwXSBzeXN0ZW0gMDA6 MDQ6IFtpbyAgMHgwYTMwLTB4MGEzZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2MzQxMV0g c3lzdGVtIDAwOjA0OiBbaW8gIDB4MGEyMC0weDBhMmZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAg MC42NjM0MTVdIHN5c3RlbSAwMDowNDogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBO UDBjMDIgKGFjdGl2ZSkKWyAgICAwLjY2MzkzMl0gcG5wIDAwOjA1OiBbZG1hIDAgZGlzYWJsZWRd ClsgICAgMC42NjQwMDNdIHBucCAwMDowNTogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURz IFBOUDA1MDEgKGFjdGl2ZSkKWyAgICAwLjY2NDYwNV0gcG5wIDAwOjA2OiBbZG1hIDAgZGlzYWJs ZWRdClsgICAgMC42NjQ4MzFdIHBucCAwMDowNjogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwg SURzIFBOUDA0MDAgKGFjdGl2ZSkKWyAgICAwLjY2NDk1MF0gc3lzdGVtIDAwOjA3OiBbaW8gIDB4 MDRkMC0weDA0ZDFdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC42NjQ5NTVdIHN5c3RlbSAwMDow NzogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDBjMDIgKGFjdGl2ZSkKWyAgICAw LjY2NTg5MF0gc3lzdGVtIDAwOjA4OiBbbWVtIDB4ZmVkMWMwMDAtMHhmZWQxZmZmZl0gaGFzIGJl ZW4gcmVzZXJ2ZWQKWyAgICAwLjY2NTg5Ml0gc3lzdGVtIDAwOjA4OiBbbWVtIDB4ZmVkMTAwMDAt MHhmZWQxN2ZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2NTg5NV0gc3lzdGVtIDAwOjA4 OiBbbWVtIDB4ZmVkMTgwMDAtMHhmZWQxOGZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2 NTg5N10gc3lzdGVtIDAwOjA4OiBbbWVtIDB4ZmVkMTkwMDAtMHhmZWQxOWZmZl0gaGFzIGJlZW4g cmVzZXJ2ZWQKWyAgICAwLjY2NTg5OF0gc3lzdGVtIDAwOjA4OiBbbWVtIDB4ZjgwMDAwMDAtMHhm YmZmZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2NTkwMF0gc3lzdGVtIDAwOjA4OiBb bWVtIDB4ZmVkMjAwMDAtMHhmZWQzZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY2NTkw Ml0gc3lzdGVtIDAwOjA4OiBbbWVtIDB4ZmVkOTAwMDAtMHhmZWQ5M2ZmZl0gY291bGQgbm90IGJl IHJlc2VydmVkClsgICAgMC42NjU5MDRdIHN5c3RlbSAwMDowODogW21lbSAweGZlZDQ1MDAwLTB4 ZmVkOGZmZmZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC42NjU5MDZdIHN5c3RlbSAwMDowODog W21lbSAweGZmMDAwMDAwLTB4ZmZmZmZmZmZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC42NjU5 MDhdIHN5c3RlbSAwMDowODogW21lbSAweGZlZTAwMDAwLTB4ZmVlZmZmZmZdIGNvdWxkIG5vdCBi ZSByZXNlcnZlZApbICAgIDAuNjY1OTA5XSBzeXN0ZW0gMDA6MDg6IFttZW0gMHhmN2ZkZjAwMC0w eGY3ZmRmZmZmXSBoYXMgYmVlbiByZXNlcnZlZApbICAgIDAuNjY1OTExXSBzeXN0ZW0gMDA6MDg6 IFttZW0gMHhmN2ZlMDAwMC0weGY3ZmVmZmZmXSBoYXMgYmVlbiByZXNlcnZlZApbICAgIDAuNjY1 OTE1XSBzeXN0ZW0gMDA6MDg6IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElEcyBQTlAwYzAy IChhY3RpdmUpClsgICAgMC42NjY0NDddIHBucDogUG5QIEFDUEk6IGZvdW5kIDkgZGV2aWNlcwpb ICAgIDAuNjc1NDI2XSBjbG9ja3NvdXJjZTogYWNwaV9wbTogbWFzazogMHhmZmZmZmYgbWF4X2N5 Y2xlczogMHhmZmZmZmYsIG1heF9pZGxlX25zOiAyMDg1NzAxMDI0IG5zClsgICAgMC42NzU0NzNd IHBjaSAwMDAwOjAwOjFjLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMV0KWyAgICAwLjY3NTQ4M10g cGNpIDAwMDA6MDA6MWMuMjogUENJIGJyaWRnZSB0byBbYnVzIDAyXQpbICAgIDAuNjc1NDg1XSBw Y2kgMDAwMDowMDoxYy4yOiAgIGJyaWRnZSB3aW5kb3cgW2lvICAweGUwMDAtMHhlZmZmXQpbICAg IDAuNjc1NDg5XSBwY2kgMDAwMDowMDoxYy4yOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGY3ZDAw MDAwLTB4ZjdkZmZmZmZdClsgICAgMC42NzU0OTJdIHBjaSAwMDAwOjAwOjFjLjI6ICAgYnJpZGdl IHdpbmRvdyBbbWVtIDB4ZjAwMDAwMDAtMHhmMDBmZmZmZiA2NGJpdCBwcmVmXQpbICAgIDAuNjc1 NDk4XSBwY2kgMDAwMDowMzowMC4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDRdClsgICAgMC42NzU1 MThdIHBjaSAwMDAwOjAwOjFjLjM6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMy0wNF0KWyAgICAwLjY3 NTUyOF0gcGNpIDAwMDA6MDA6MWMuNDogUENJIGJyaWRnZSB0byBbYnVzIDA1XQpbICAgIDAuNjc1 NTMyXSBwY2kgMDAwMDowMDoxYy40OiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGY3YzAwMDAwLTB4 ZjdjZmZmZmZdClsgICAgMC42NzU1NDBdIHBjaV9idXMgMDAwMDowMDogcmVzb3VyY2UgNCBbaW8g IDB4MDAwMC0weDBjZjcgd2luZG93XQpbICAgIDAuNjc1NTQxXSBwY2lfYnVzIDAwMDA6MDA6IHJl c291cmNlIDUgW2lvICAweDBkMDAtMHhmZmZmIHdpbmRvd10KWyAgICAwLjY3NTU0Ml0gcGNpX2J1 cyAwMDAwOjAwOiByZXNvdXJjZSA2IFttZW0gMHgwMDBhMDAwMC0weDAwMGJmZmZmIHdpbmRvd10K WyAgICAwLjY3NTU0M10gcGNpX2J1cyAwMDAwOjAwOiByZXNvdXJjZSA3IFttZW0gMHgwMDBkMDAw MC0weDAwMGQzZmZmIHdpbmRvd10KWyAgICAwLjY3NTU0NF0gcGNpX2J1cyAwMDAwOjAwOiByZXNv dXJjZSA4IFttZW0gMHgwMDBkNDAwMC0weDAwMGQ3ZmZmIHdpbmRvd10KWyAgICAwLjY3NTU0NV0g cGNpX2J1cyAwMDAwOjAwOiByZXNvdXJjZSA5IFttZW0gMHgwMDBkODAwMC0weDAwMGRiZmZmIHdp bmRvd10KWyAgICAwLjY3NTU0Nl0gcGNpX2J1cyAwMDAwOjAwOiByZXNvdXJjZSAxMCBbbWVtIDB4 MDAwZGMwMDAtMHgwMDBkZmZmZiB3aW5kb3ddClsgICAgMC42NzU1NDddIHBjaV9idXMgMDAwMDow MDogcmVzb3VyY2UgMTEgW21lbSAweGRmYTAwMDAwLTB4ZmVhZmZmZmYgd2luZG93XQpbICAgIDAu Njc1NTQ4XSBwY2lfYnVzIDAwMDA6MDI6IHJlc291cmNlIDAgW2lvICAweGUwMDAtMHhlZmZmXQpb ICAgIDAuNjc1NTQ5XSBwY2lfYnVzIDAwMDA6MDI6IHJlc291cmNlIDEgW21lbSAweGY3ZDAwMDAw LTB4ZjdkZmZmZmZdClsgICAgMC42NzU1NTBdIHBjaV9idXMgMDAwMDowMjogcmVzb3VyY2UgMiBb bWVtIDB4ZjAwMDAwMDAtMHhmMDBmZmZmZiA2NGJpdCBwcmVmXQpbICAgIDAuNjc1NTUxXSBwY2lf YnVzIDAwMDA6MDU6IHJlc291cmNlIDEgW21lbSAweGY3YzAwMDAwLTB4ZjdjZmZmZmZdClsgICAg MC42NzU2MTJdIE5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMgpbICAgIDAuNjc2Mzg3 XSBUQ1AgZXN0YWJsaXNoZWQgaGFzaCB0YWJsZSBlbnRyaWVzOiAyNjIxNDQgKG9yZGVyOiA5LCAy MDk3MTUyIGJ5dGVzKQpbICAgIDAuNjc3MTQ5XSBUQ1AgYmluZCBoYXNoIHRhYmxlIGVudHJpZXM6 IDY1NTM2IChvcmRlcjogMTAsIDUyNDI4ODAgYnl0ZXMpClsgICAgMC42NzkxNTVdIFRDUDogSGFz aCB0YWJsZXMgY29uZmlndXJlZCAoZXN0YWJsaXNoZWQgMjYyMTQ0IGJpbmQgNjU1MzYpClsgICAg MC42Nzk1MjBdIFVEUCBoYXNoIHRhYmxlIGVudHJpZXM6IDE2Mzg0IChvcmRlcjogOSwgMzE0NTcy OCBieXRlcykKWyAgICAwLjY4MDg4MF0gVURQLUxpdGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAxNjM4 NCAob3JkZXI6IDksIDMxNDU3MjggYnl0ZXMpClsgICAgMC42ODIwNDBdIE5FVDogUmVnaXN0ZXJl ZCBwcm90b2NvbCBmYW1pbHkgMQpbICAgIDAuNjgyMDYwXSBwY2kgMDAwMDowMDowMi4wOiBWaWRl byBkZXZpY2Ugd2l0aCBzaGFkb3dlZCBST00gYXQgW21lbSAweDAwMGMwMDAwLTB4MDAwZGZmZmZd ClsgICAgMC42ODI1NzJdIFBDSTogQ0xTIDY0IGJ5dGVzLCBkZWZhdWx0IDY0ClsgICAgMC42ODI3 NTRdIFVucGFja2luZyBpbml0cmFtZnMuLi4KWyAgICAwLjkwNjQ3OV0gRnJlZWluZyBpbml0cmQg bWVtb3J5OiAxODA5NksgKGZmZmY4ODAwM2VlNGYwMDAgLSBmZmZmODgwMDNmZmZiMDAwKQpbICAg IDAuOTE3Njg1XSBETUEtQVBJOiBwcmVhbGxvY2F0ZWQgNjU1MzYgZGVidWcgZW50cmllcwpbICAg IDAuOTE3Njg3XSBETUEtQVBJOiBkZWJ1Z2dpbmcgZW5hYmxlZCBieSBrZXJuZWwgY29uZmlnClsg ICAgMC45MTc3ODZdIFBDSS1ETUE6IFVzaW5nIHNvZnR3YXJlIGJvdW5jZSBidWZmZXJpbmcgZm9y IElPIChTV0lPVExCKQpbICAgIDAuOTE3Nzg4XSBzb2Z0d2FyZSBJTyBUTEIgW21lbSAweDg1YmJh MDAwLTB4ODliYmEwMDBdICg2NE1CKSBtYXBwZWQgYXQgW2ZmZmY4ODAwODViYmEwMDAtZmZmZjg4 MDA4OWJiOWZmZl0KWyAgICAwLjkxODAxNl0gUkFQTCBQTVU6IEFQSSB1bml0IGlzIDJeLTMyIEpv dWxlcywgNCBmaXhlZCBjb3VudGVycywgNjU1MzYwIG1zIG92ZmwgdGltZXIKWyAgICAwLjkxODAx N10gUkFQTCBQTVU6IGh3IHVuaXQgb2YgZG9tYWluIHBwMC1jb3JlIDJeLTE0IEpvdWxlcwpbICAg IDAuOTE4MDE4XSBSQVBMIFBNVTogaHcgdW5pdCBvZiBkb21haW4gcGFja2FnZSAyXi0xNCBKb3Vs ZXMKWyAgICAwLjkxODAxOV0gUkFQTCBQTVU6IGh3IHVuaXQgb2YgZG9tYWluIGRyYW0gMl4tMTQg Sm91bGVzClsgICAgMC45MTgwMjBdIFJBUEwgUE1VOiBodyB1bml0IG9mIGRvbWFpbiBwcDEtZ3B1 IDJeLTE0IEpvdWxlcwpbICAgIDAuOTE5NjM3XSBTY2FubmluZyBmb3IgbG93IG1lbW9yeSBjb3Jy dXB0aW9uIGV2ZXJ5IDYwIHNlY29uZHMKWyAgICAwLjkxOTk3MF0gY3J5cHRvbWdyX3Rlc3QgKDg3 KSB1c2VkIGdyZWF0ZXN0IHN0YWNrIGRlcHRoOiAxNDM0NCBieXRlcyBsZWZ0ClsgICAgMC45MjA2 NTldIGZ1dGV4IGhhc2ggdGFibGUgZW50cmllczogMjA0OCAob3JkZXI6IDYsIDI2MjE0NCBieXRl cykKWyAgICAwLjkyMDc1N10gYXVkaXQ6IGluaXRpYWxpemluZyBuZXRsaW5rIHN1YnN5cyAoZGlz YWJsZWQpClsgICAgMC45MjA4MDNdIGF1ZGl0OiB0eXBlPTIwMDAgYXVkaXQoMTQ3MTUxOTQ1Ny45 MDI6MSk6IGluaXRpYWxpemVkClsgICAgMC45MjE4OTddIEluaXRpYWxpc2Ugc3lzdGVtIHRydXN0 ZWQga2V5cmluZwpbICAgIDAuOTIyMTgwXSB3b3JraW5nc2V0OiB0aW1lc3RhbXBfYml0cz0zNCBt YXhfb3JkZXI9MjMgYnVja2V0X29yZGVyPTAKWyAgICAwLjkyODUyNl0gemJ1ZDogbG9hZGVkClsg ICAgMC45MzAzMzJdIEtleSB0eXBlIGJpZ19rZXkgcmVnaXN0ZXJlZApbICAgIDAuOTMwMzM2XSBT RUxpbnV4OiAgUmVnaXN0ZXJpbmcgbmV0ZmlsdGVyIGhvb2tzClsgICAgMC45NTY1NDhdIGNyeXB0 b21ncl90ZXN0ICg5MCkgdXNlZCBncmVhdGVzdCBzdGFjayBkZXB0aDogMTMyMDAgYnl0ZXMgbGVm dApbICAgIDAuOTYxNTk5XSBjcnlwdG9tZ3JfdGVzdCAoMTEzKSB1c2VkIGdyZWF0ZXN0IHN0YWNr IGRlcHRoOiAxMjQ0MCBieXRlcyBsZWZ0ClsgICAgMC45NjI1ODBdIE5FVDogUmVnaXN0ZXJlZCBw cm90b2NvbCBmYW1pbHkgMzgKWyAgICAwLjk2MjYwM10gS2V5IHR5cGUgYXN5bW1ldHJpYyByZWdp c3RlcmVkClsgICAgMC45NjI2MTVdIEFzeW1tZXRyaWMga2V5IHBhcnNlciAneDUwOScgcmVnaXN0 ZXJlZApbICAgIDAuOTYyNzE5XSBCbG9jayBsYXllciBTQ1NJIGdlbmVyaWMgKGJzZykgZHJpdmVy IHZlcnNpb24gMC40IGxvYWRlZCAobWFqb3IgMjQ5KQpbICAgIDAuOTYyODE2XSBpbyBzY2hlZHVs ZXIgbm9vcCByZWdpc3RlcmVkClsgICAgMC45NjI4MzBdIGlvIHNjaGVkdWxlciBkZWFkbGluZSBy ZWdpc3RlcmVkClsgICAgMC45NjI5MjhdIGlvIHNjaGVkdWxlciBjZnEgcmVnaXN0ZXJlZCAoZGVm YXVsdCkKWyAgICAwLjk2MjkzMV0gc3RhcnQgcGxpc3QgdGVzdApbICAgIDAuOTYzNzYzXSBlbmQg cGxpc3QgdGVzdApbICAgIDAuOTY0OTAxXSBwY2lfaG90cGx1ZzogUENJIEhvdCBQbHVnIFBDSSBD b3JlIHZlcnNpb246IDAuNQpbICAgIDAuOTY0OTEzXSBwY2llaHA6IFBDSSBFeHByZXNzIEhvdCBQ bHVnIENvbnRyb2xsZXIgRHJpdmVyIHZlcnNpb246IDAuNApbICAgIDAuOTY0OTY5XSBlZmlmYjog cHJvYmluZyBmb3IgZWZpZmIKWyAgICAwLjk2NDk4M10gZWZpZmI6IGZyYW1lYnVmZmVyIGF0IDB4 ZTAwMDAwMDAsIG1hcHBlZCB0byAweGZmZmZjOTAwMDQwMDAwMDAsIHVzaW5nIDMwNzJrLCB0b3Rh bCAzMDcyawpbICAgIDAuOTY0OTg0XSBlZmlmYjogbW9kZSBpcyAxMDI0eDc2OHgzMiwgbGluZWxl bmd0aD00MDk2LCBwYWdlcz0xClsgICAgMC45NjQ5ODRdIGVmaWZiOiBzY3JvbGxpbmc6IHJlZHJh dwpbICAgIDAuOTY0OTg1XSBlZmlmYjogVHJ1ZWNvbG9yOiBzaXplPTg6ODo4OjgsIHNoaWZ0PTI0 OjE2Ojg6MApbICAgIDAuOTY1NDkxXSBDb25zb2xlOiBzd2l0Y2hpbmcgdG8gY29sb3VyIGZyYW1l IGJ1ZmZlciBkZXZpY2UgMTI4eDQ4ClsgICAgMC45NjY0NzFdIGZiMDogRUZJIFZHQSBmcmFtZSBi dWZmZXIgZGV2aWNlClsgICAgMC45NjY0ODZdIGludGVsX2lkbGU6IE1XQUlUIHN1YnN0YXRlczog MHg0MjEyMApbICAgIDAuOTY2NDg3XSBpbnRlbF9pZGxlOiB2MC40LjEgbW9kZWwgMHgzQwpbICAg IDAuOTY3Mzc3XSBpbnRlbF9pZGxlOiBsYXBpY190aW1lcl9yZWxpYWJsZV9zdGF0ZXMgMHhmZmZm ZmZmZgpbICAgIDAuOTY3NTgzXSBpbnB1dDogUG93ZXIgQnV0dG9uIGFzIC9kZXZpY2VzL0xOWFNZ U1RNOjAwL0xOWFNZQlVTOjAwL1BOUDBDMEM6MDAvaW5wdXQvaW5wdXQwClsgICAgMC45Njc2MDld IEFDUEk6IFBvd2VyIEJ1dHRvbiBbUFdSQl0KWyAgICAwLjk2NzcwNF0gaW5wdXQ6IFBvd2VyIEJ1 dHRvbiBhcyAvZGV2aWNlcy9MTlhTWVNUTTowMC9MTlhQV1JCTjowMC9pbnB1dC9pbnB1dDEKWyAg ICAwLjk2NzcwN10gQUNQSTogUG93ZXIgQnV0dG9uIFtQV1JGXQpbICAgIDAuOTcwMjQyXSB0aGVy bWFsIExOWFRIRVJNOjAwOiByZWdpc3RlcmVkIGFzIHRoZXJtYWxfem9uZTAKWyAgICAwLjk3MDI0 NV0gQUNQSTogVGhlcm1hbCBab25lIFtUWjAwXSAoMjggQykKWyAgICAwLjk3MDk1OV0gdGhlcm1h bCBMTlhUSEVSTTowMTogcmVnaXN0ZXJlZCBhcyB0aGVybWFsX3pvbmUxClsgICAgMC45NzA5NjFd IEFDUEk6IFRoZXJtYWwgWm9uZSBbVFowMV0gKDMwIEMpClsgICAgMC45NzEwNjFdIEdIRVM6IEhF U1QgaXMgbm90IGVuYWJsZWQhClsgICAgMC45NzExODJdIFNlcmlhbDogODI1MC8xNjU1MCBkcml2 ZXIsIDMyIHBvcnRzLCBJUlEgc2hhcmluZyBlbmFibGVkClsgICAgMC45OTE4NDRdIDAwOjA1OiB0 dHlTMCBhdCBJL08gMHgzZjggKGlycSA9IDQsIGJhc2VfYmF1ZCA9IDExNTIwMCkgaXMgYSAxNjU1 MEEKWyAgICAwLjk5NTkxNV0gTm9uLXZvbGF0aWxlIG1lbW9yeSBkcml2ZXIgdjEuMwpbICAgIDAu OTk1OTc5XSBMaW51eCBhZ3BnYXJ0IGludGVyZmFjZSB2MC4xMDMKWyAgICAwLjk5ODAwMV0gYWhj aSAwMDAwOjAwOjFmLjI6IHZlcnNpb24gMy4wClsgICAgMC45OTgyODVdIGFoY2kgMDAwMDowMDox Zi4yOiBBSENJIDAwMDEuMDMwMCAzMiBzbG90cyA2IHBvcnRzIDYgR2JwcyAweGQgaW1wbCBTQVRB IG1vZGUKWyAgICAwLjk5ODI4OF0gYWhjaSAwMDAwOjAwOjFmLjI6IGZsYWdzOiA2NGJpdCBuY3Eg bGVkIGNsbyBwaW8gc2x1bSBwYXJ0IGVtcyBhcHN0IApbICAgIDEuMDAzODg1XSBzY3NpIGhvc3Qw OiBhaGNpClsgICAgMS4wMDQyMzddIHNjc2kgaG9zdDE6IGFoY2kKWyAgICAxLjAwNDQ3NV0gc2Nz aSBob3N0MjogYWhjaQpbICAgIDEuMDA0Nzc2XSBzY3NpIGhvc3QzOiBhaGNpClsgICAgMS4wMDUw NzVdIHNjc2kgaG9zdDQ6IGFoY2kKWyAgICAxLjAwNTM2NV0gc2NzaSBob3N0NTogYWhjaQpbICAg IDEuMDA1NTA0XSBhdGExOiBTQVRBIG1heCBVRE1BLzEzMyBhYmFyIG0yMDQ4QDB4ZjdlMWEwMDAg cG9ydCAweGY3ZTFhMTAwIGlycSAyNgpbICAgIDEuMDA1NTA2XSBhdGEyOiBEVU1NWQpbICAgIDEu MDA1NTA3XSBhdGEzOiBTQVRBIG1heCBVRE1BLzEzMyBhYmFyIG0yMDQ4QDB4ZjdlMWEwMDAgcG9y dCAweGY3ZTFhMjAwIGlycSAyNgpbICAgIDEuMDA1NTA4XSBhdGE0OiBTQVRBIG1heCBVRE1BLzEz MyBhYmFyIG0yMDQ4QDB4ZjdlMWEwMDAgcG9ydCAweGY3ZTFhMjgwIGlycSAyNgpbICAgIDEuMDA1 NTA5XSBhdGE1OiBEVU1NWQpbICAgIDEuMDA1NTEwXSBhdGE2OiBEVU1NWQpbICAgIDEuMDA1Nzg3 XSBsaWJwaHk6IEZpeGVkIE1ESU8gQnVzOiBwcm9iZWQKWyAgICAxLjAwNTk4N10gZWhjaV9oY2Q6 IFVTQiAyLjAgJ0VuaGFuY2VkJyBIb3N0IENvbnRyb2xsZXIgKEVIQ0kpIERyaXZlcgpbICAgIDEu MDA1OTk1XSBlaGNpLXBjaTogRUhDSSBQQ0kgcGxhdGZvcm0gZHJpdmVyClsgICAgMS4wMDYwMjBd IG9oY2lfaGNkOiBVU0IgMS4xICdPcGVuJyBIb3N0IENvbnRyb2xsZXIgKE9IQ0kpIERyaXZlcgpb ICAgIDEuMDA2MDI1XSBvaGNpLXBjaTogT0hDSSBQQ0kgcGxhdGZvcm0gZHJpdmVyClsgICAgMS4w MDYwNDVdIHVoY2lfaGNkOiBVU0IgVW5pdmVyc2FsIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2Ug ZHJpdmVyClsgICAgMS4wMDYzNDFdIHhoY2lfaGNkIDAwMDA6MDA6MTQuMDogeEhDSSBIb3N0IENv bnRyb2xsZXIKWyAgICAxLjAwNjc2MV0geGhjaV9oY2QgMDAwMDowMDoxNC4wOiBuZXcgVVNCIGJ1 cyByZWdpc3RlcmVkLCBhc3NpZ25lZCBidXMgbnVtYmVyIDEKWyAgICAxLjAwODExOF0geGhjaV9o Y2QgMDAwMDowMDoxNC4wOiBoY2MgcGFyYW1zIDB4MjAwMDc3YzEgaGNpIHZlcnNpb24gMHgxMDAg cXVpcmtzIDB4MDAwMDk4MTAKWyAgICAxLjAwODEyMl0geGhjaV9oY2QgMDAwMDowMDoxNC4wOiBj YWNoZSBsaW5lIHNpemUgb2YgNjQgaXMgbm90IHN1cHBvcnRlZApbICAgIDEuMDA4NDM4XSB1c2Ig dXNiMTogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJvZHVjdD0wMDAy ClsgICAgMS4wMDg0MzldIHVzYiB1c2IxOiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9Mywg UHJvZHVjdD0yLCBTZXJpYWxOdW1iZXI9MQpbICAgIDEuMDA4NDQwXSB1c2IgdXNiMTogUHJvZHVj dDogeEhDSSBIb3N0IENvbnRyb2xsZXIKWyAgICAxLjAwODQ0MV0gdXNiIHVzYjE6IE1hbnVmYWN0 dXJlcjogTGludXggNC42LjYtMzAwLmZjMjQueDg2XzY0K2RlYnVnIHhoY2ktaGNkClsgICAgMS4w MDg0NDJdIHVzYiB1c2IxOiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MTQuMApbICAgIDEuMDA5MTY0 XSBodWIgMS0wOjEuMDogVVNCIGh1YiBmb3VuZApbICAgIDEuMDA5MjM2XSBodWIgMS0wOjEuMDog MTQgcG9ydHMgZGV0ZWN0ZWQKWyAgICAxLjAyMDg1OV0geGhjaV9oY2QgMDAwMDowMDoxNC4wOiB4 SENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDEuMDIxMDA4XSB4aGNpX2hjZCAwMDAwOjAwOjE0LjA6 IG5ldyBVU0IgYnVzIHJlZ2lzdGVyZWQsIGFzc2lnbmVkIGJ1cyBudW1iZXIgMgpbICAgIDEuMDIx MTAwXSB1c2IgdXNiMjogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJv ZHVjdD0wMDAzClsgICAgMS4wMjExMDJdIHVzYiB1c2IyOiBOZXcgVVNCIGRldmljZSBzdHJpbmdz OiBNZnI9MywgUHJvZHVjdD0yLCBTZXJpYWxOdW1iZXI9MQpbICAgIDEuMDIxMTAzXSB1c2IgdXNi MjogUHJvZHVjdDogeEhDSSBIb3N0IENvbnRyb2xsZXIKWyAgICAxLjAyMTEwNF0gdXNiIHVzYjI6 IE1hbnVmYWN0dXJlcjogTGludXggNC42LjYtMzAwLmZjMjQueDg2XzY0K2RlYnVnIHhoY2ktaGNk ClsgICAgMS4wMjExMDVdIHVzYiB1c2IyOiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MTQuMApbICAg IDEuMDIxNTYxXSBodWIgMi0wOjEuMDogVVNCIGh1YiBmb3VuZApbICAgIDEuMDIxNjAwXSBodWIg Mi0wOjEuMDogNiBwb3J0cyBkZXRlY3RlZApbICAgIDEuMDI1MDA4XSB1c2Jjb3JlOiByZWdpc3Rl cmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIHVzYnNlcmlhbApbICAgIDEuMDI1MDIxXSB1c2Jjb3Jl OiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIHVzYnNlcmlhbF9nZW5lcmljClsgICAg MS4wMjUwODFdIHVzYnNlcmlhbDogVVNCIFNlcmlhbCBzdXBwb3J0IHJlZ2lzdGVyZWQgZm9yIGdl bmVyaWMKWyAgICAxLjAyNTEzN10gaTgwNDI6IFBOUDogTm8gUFMvMiBjb250cm9sbGVyIGZvdW5k LiBQcm9iaW5nIHBvcnRzIGRpcmVjdGx5LgpbICAgIDEuMDI1NjE3XSBzZXJpbzogaTgwNDIgS0JE IHBvcnQgYXQgMHg2MCwweDY0IGlycSAxClsgICAgMS4wMjU2NjZdIHNlcmlvOiBpODA0MiBBVVgg cG9ydCBhdCAweDYwLDB4NjQgaXJxIDEyClsgICAgMS4wMjYxOTBdIG1vdXNlZGV2OiBQUy8yIG1v dXNlIGRldmljZSBjb21tb24gZm9yIGFsbCBtaWNlClsgICAgMS4wMjY3NDRdIHJ0Y19jbW9zIDAw OjAyOiBSVEMgY2FuIHdha2UgZnJvbSBTNApbICAgIDEuMDI3MTQ0XSBydGNfY21vcyAwMDowMjog cnRjIGNvcmU6IHJlZ2lzdGVyZWQgcnRjX2Ntb3MgYXMgcnRjMApbICAgIDEuMDI3MTc2XSBydGNf Y21vcyAwMDowMjogYWxhcm1zIHVwIHRvIG9uZSBtb250aCwgeTNrLCAyNDIgYnl0ZXMgbnZyYW0s IGhwZXQgaXJxcwpbICAgIDEuMDI3Mjk4XSBkZXZpY2UtbWFwcGVyOiB1ZXZlbnQ6IHZlcnNpb24g MS4wLjMKWyAgICAxLjAyNzU4NV0gZGV2aWNlLW1hcHBlcjogaW9jdGw6IDQuMzQuMC1pb2N0bCAo MjAxNS0xMC0yOCkgaW5pdGlhbGlzZWQ6IGRtLWRldmVsQHJlZGhhdC5jb20KWyAgICAxLjAyNzgz OV0gSW50ZWwgUC1zdGF0ZSBkcml2ZXIgaW5pdGlhbGl6aW5nLgpbICAgIDEuMDU3MDE0XSBoaWRy YXc6IHJhdyBISUQgZXZlbnRzIGRyaXZlciAoQykgSmlyaSBLb3NpbmEKWyAgICAxLjA1NzEwMl0g dXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciB1c2JoaWQKWyAgICAxLjA1 NzEwM10gdXNiaGlkOiBVU0IgSElEIGNvcmUgZHJpdmVyClsgICAgMS4wNTcyNDZdIGRyb3BfbW9u aXRvcjogSW5pdGlhbGl6aW5nIG5ldHdvcmsgZHJvcCBtb25pdG9yIHNlcnZpY2UKWyAgICAxLjA1 NzQwN10gaXBfdGFibGVzOiAoQykgMjAwMC0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0KWyAgICAx LjA1NzQ5OV0gSW5pdGlhbGl6aW5nIFhGUk0gbmV0bGluayBzb2NrZXQKWyAgICAxLjA1ODA0Ml0g TkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxMApbICAgIDEuMDU4NzY4XSBtaXA2OiBN b2JpbGUgSVB2NgpbICAgIDEuMDU4Nzg1XSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5 IDE3ClsgICAgMS4wNTk2MDJdIG1pY3JvY29kZTogQ1BVMCBzaWc9MHgzMDZjMywgcGY9MHgyLCBy ZXZpc2lvbj0weDIwClsgICAgMS4wNTk2MzJdIG1pY3JvY29kZTogQ1BVMSBzaWc9MHgzMDZjMywg cGY9MHgyLCByZXZpc2lvbj0weDIwClsgICAgMS4wNTk2ODBdIG1pY3JvY29kZTogQ1BVMiBzaWc9 MHgzMDZjMywgcGY9MHgyLCByZXZpc2lvbj0weDIwClsgICAgMS4wNTk2ODhdIG1pY3JvY29kZTog Q1BVMyBzaWc9MHgzMDZjMywgcGY9MHgyLCByZXZpc2lvbj0weDIwClsgICAgMS4wNTk3MTJdIG1p Y3JvY29kZTogQ1BVNCBzaWc9MHgzMDZjMywgcGY9MHgyLCByZXZpc2lvbj0weDIwClsgICAgMS4w NTk3NDJdIG1pY3JvY29kZTogQ1BVNSBzaWc9MHgzMDZjMywgcGY9MHgyLCByZXZpc2lvbj0weDIw ClsgICAgMS4wNTk3OTBdIG1pY3JvY29kZTogQ1BVNiBzaWc9MHgzMDZjMywgcGY9MHgyLCByZXZp c2lvbj0weDIwClsgICAgMS4wNTk4MDRdIG1pY3JvY29kZTogQ1BVNyBzaWc9MHgzMDZjMywgcGY9 MHgyLCByZXZpc2lvbj0weDIwClsgICAgMS4wNTk5MjBdIG1pY3JvY29kZTogTWljcm9jb2RlIFVw ZGF0ZSBEcml2ZXI6IHYyLjAxIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+LCBQZXRlciBP cnViYQpbICAgIDEuMDU5OTQ0XSBBVlgyIHZlcnNpb24gb2YgZ2NtX2VuYy9kZWMgZW5nYWdlZC4K WyAgICAxLjA1OTk0NV0gQUVTIENUUiBtb2RlIGJ5OCBvcHRpbWl6YXRpb24gZW5hYmxlZApbICAg IDEuMDg2OTY4XSByZWdpc3RlcmVkIHRhc2tzdGF0cyB2ZXJzaW9uIDEKWyAgICAxLjA4Njk4MF0g TG9hZGluZyBjb21waWxlZC1pbiBYLjUwOSBjZXJ0aWZpY2F0ZXMKWyAgICAxLjA4OTYxNl0gYWxn OiBObyB0ZXN0IGZvciBwa2NzMXBhZChyc2Esc2hhMjU2KSAocGtjczFwYWQocnNhLWdlbmVyaWMs c2hhMjU2KSkKWyAgICAxLjA5MDIzOF0gTG9hZGVkIFguNTA5IGNlcnQgJ0ZlZG9yYSBrZXJuZWwg c2lnbmluZyBrZXk6IDI2NzczYWRmYjkyMmY0YThjYzViYjgxYjRlYjhmYTg2ZjQ1MjI5NmQnClsg ICAgMS4wOTAzNDBdIHpzd2FwOiBsb2FkZWQgdXNpbmcgcG9vbCBsem8vemJ1ZApbICAgIDEuMDkx OTgxXSAgIE1hZ2ljIG51bWJlcjogMTI6OTAzOjQyOApbICAgIDEuMDkyMTYxXSBydGNfY21vcyAw MDowMjogc2V0dGluZyBzeXN0ZW0gY2xvY2sgdG8gMjAxNi0wOC0xOCAxMToyNDoxOCBVVEMgKDE0 NzE1MTk0NTgpClsgICAgMS4wOTI0NDFdIFBNOiBIaWJlcm5hdGlvbiBpbWFnZSBub3QgcHJlc2Vu dCBvciBjb3VsZCBub3QgYmUgbG9hZGVkLgpbICAgIDEuMzA5NDMwXSBhdGE0OiBTQVRBIGxpbmsg dXAgNi4wIEdicHMgKFNTdGF0dXMgMTMzIFNDb250cm9sIDMwMCkKWyAgICAxLjMwOTU1OV0gYXRh MTogU0FUQSBsaW5rIHVwIDYuMCBHYnBzIChTU3RhdHVzIDEzMyBTQ29udHJvbCAzMDApClsgICAg MS4zMDk1OTldIGF0YTM6IFNBVEEgbGluayB1cCA2LjAgR2JwcyAoU1N0YXR1cyAxMzMgU0NvbnRy b2wgMzAwKQpbICAgIDEuMzEwMTM4XSBhdGExLjAwOiBBVEEtODogT0NaLVZFQ1RPUjE1MCwgMS4y LCBtYXggVURNQS8xMzMKWyAgICAxLjMxMDE0MF0gYXRhMS4wMDogNDY4ODYyMTI4IHNlY3RvcnMs IG11bHRpIDE6IExCQTQ4IE5DUSAoZGVwdGggMzEvMzIpLCBBQQpbICAgIDEuMzE0MjEyXSBhdGEz LjAwOiBBVEEtOTogU1Q0MDAwTk0wMDMzLTlaTTE3MCwgU04wNiwgbWF4IFVETUEvMTMzClsgICAg MS4zMTQyMTRdIGF0YTMuMDA6IDc4MTQwMzcxNjggc2VjdG9ycywgbXVsdGkgMTY6IExCQTQ4IE5D USAoZGVwdGggMzEvMzIpLCBBQQpbICAgIDEuMzE1MzczXSBhdGEzLjAwOiBjb25maWd1cmVkIGZv ciBVRE1BLzEzMwpbICAgIDEuMzE3OTIyXSBhdGExLjAwOiBjb25maWd1cmVkIGZvciBVRE1BLzEz MwpbICAgIDEuMzE5MzY2XSBzY3NpIDA6MDowOjA6IERpcmVjdC1BY2Nlc3MgICAgIEFUQSAgICAg IE9DWi1WRUNUT1IxNTAgICAgMS4yICBQUTogMCBBTlNJOiA1ClsgICAgMS4zMzE2OTBdIHNkIDA6 MDowOjA6IFtzZGFdIDQ2ODg2MjEyOCA1MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDI0MCBHQi8y MjQgR2lCKQpbICAgIDEuMzMyMDUzXSBzZCAwOjA6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMg c2cwIHR5cGUgMApbICAgIDEuMzMyMTI3XSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBQcm90ZWN0 IGlzIG9mZgpbICAgIDEuMzMyMTQwXSBzZCAwOjA6MDowOiBbc2RhXSBNb2RlIFNlbnNlOiAwMCAz YSAwMCAwMApbICAgIDEuMzMyMjQ5XSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBjYWNoZTogZW5h YmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUEKWyAg ICAxLjMzMzE0NF0gc2NzaSAyOjA6MDowOiBEaXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBTVDQw MDBOTTAwMzMtOVpNIFNOMDYgUFE6IDAgQU5TSTogNQpbICAgIDEuMzM1NDE4XSAgc2RhOiBzZGEx IHNkYTIgc2RhMyBzZGE0ClsgICAgMS4zMzY2MzVdIHNkIDA6MDowOjA6IFtzZGFdIEF0dGFjaGVk IFNDU0kgZGlzawpbICAgIDEuMzQ3MjUwXSBzZCAyOjA6MDowOiBbc2RiXSA3ODE0MDM3MTY4IDUx Mi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoNC4wMCBUQi8zLjY0IFRpQikKWyAgICAxLjM0NzM4NF0g c2QgMjowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMSB0eXBlIDAKWyAgICAxLjM0NzYw Nl0gc2QgMjowOjA6MDogW3NkYl0gV3JpdGUgUHJvdGVjdCBpcyBvZmYKWyAgICAxLjM0NzYxMF0g c2QgMjowOjA6MDogW3NkYl0gTW9kZSBTZW5zZTogMDAgM2EgMDAgMDAKWyAgICAxLjM0NzY5OV0g c2QgMjowOjA6MDogW3NkYl0gV3JpdGUgY2FjaGU6IGVuYWJsZWQsIHJlYWQgY2FjaGU6IGVuYWJs ZWQsIGRvZXNuJ3Qgc3VwcG9ydCBEUE8gb3IgRlVBClsgICAgMS4zNjY4NTZdIHNkIDI6MDowOjA6 IFtzZGJdIEF0dGFjaGVkIFNDU0kgZGlzawpbICAgIDEuMzcyODYyXSB1c2IgMS05OiBuZXcgaGln aC1zcGVlZCBVU0IgZGV2aWNlIG51bWJlciAyIHVzaW5nIHhoY2lfaGNkClsgICAgMS4zODY2NDZd IGF0YTQuMDA6IEFUQS05OiBTVDQwMDBOTTAwMzMtOVpNMTcwLCBTTjA2LCBtYXggVURNQS8xMzMK WyAgICAxLjM4NjY0OF0gYXRhNC4wMDogNzgxNDAzNzE2OCBzZWN0b3JzLCBtdWx0aSAxNjogTEJB NDggTkNRIChkZXB0aCAzMS8zMiksIEFBClsgICAgMS4zODc4ODBdIGF0YTQuMDA6IGNvbmZpZ3Vy ZWQgZm9yIFVETUEvMTMzClsgICAgMS4zODgzNDBdIHNjc2kgMzowOjA6MDogRGlyZWN0LUFjY2Vz cyAgICAgQVRBICAgICAgU1Q0MDAwTk0wMDMzLTlaTSBTTjA2IFBROiAwIEFOU0k6IDUKWyAgICAx LjM5NjE1Nl0gc2QgMzowOjA6MDogW3NkY10gNzgxNDAzNzE2OCA1MTItYnl0ZSBsb2dpY2FsIGJs b2NrczogKDQuMDAgVEIvMy42NCBUaUIpClsgICAgMS4zOTYyMzFdIHNkIDM6MDowOjA6IFtzZGNd IFdyaXRlIFByb3RlY3QgaXMgb2ZmClsgICAgMS4zOTYyMzNdIHNkIDM6MDowOjA6IFtzZGNdIE1v ZGUgU2Vuc2U6IDAwIDNhIDAwIDAwClsgICAgMS4zOTYyODBdIHNkIDM6MDowOjA6IFtzZGNdIFdy aXRlIGNhY2hlOiBlbmFibGVkLCByZWFkIGNhY2hlOiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQg RFBPIG9yIEZVQQpbICAgIDEuMzk2MzA4XSBzZCAzOjA6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVy aWMgc2cyIHR5cGUgMApbICAgIDEuNDQzNjYwXSAgc2RjOiBzZGMxClsgICAgMS40NDQwODRdIHNk IDM6MDowOjA6IFtzZGNdIEF0dGFjaGVkIFNDU0kgZGlzawpbICAgIDEuNDQ1NzcyXSBGcmVlaW5n IHVudXNlZCBrZXJuZWwgbWVtb3J5OiAzNTk2SyAoZmZmZmZmZmY4MWY3ZDAwMCAtIGZmZmZmZmZm ODIzMDAwMDApClsgICAgMS40NDU3NzNdIFdyaXRlIHByb3RlY3RpbmcgdGhlIGtlcm5lbCByZWFk LW9ubHkgZGF0YTogMTQzMzZrClsgICAgMS40NDY1NTVdIEZyZWVpbmcgdW51c2VkIGtlcm5lbCBt ZW1vcnk6IDExNzZLIChmZmZmODgwMDAxOGRhMDAwIC0gZmZmZjg4MDAwMWEwMDAwMCkKWyAgICAx LjQ0NzYyNl0gRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogNjMySyAoZmZmZjg4MDAwMWQ2 MjAwMCAtIGZmZmY4ODAwMDFlMDAwMDApClsgICAgMS40NTg5NDJdIHJhbmRvbTogc3lzdGVtZCB1 cmFuZG9tIHJlYWQgd2l0aCAzMCBiaXRzIG9mIGVudHJvcHkgYXZhaWxhYmxlClsgICAgMS40NjY5 NTZdIHN5c3RlbWRbMV06IHN5c3RlbWQgMjI5IHJ1bm5pbmcgaW4gc3lzdGVtIG1vZGUuICgrUEFN ICtBVURJVCArU0VMSU5VWCArSU1BIC1BUFBBUk1PUiArU01BQ0sgK1NZU1ZJTklUICtVVE1QICtM SUJDUllQVFNFVFVQICtHQ1JZUFQgK0dOVVRMUyArQUNMICtYWiArTFo0ICtTRUNDT01QICtCTEtJ RCArRUxGVVRJTFMgK0tNT0QgK0lETikKWyAgICAxLjQ2NzM4Ml0gc3lzdGVtZFsxXTogRGV0ZWN0 ZWQgYXJjaGl0ZWN0dXJlIHg4Ni02NC4KWyAgICAxLjQ2NzM4Nl0gc3lzdGVtZFsxXTogUnVubmlu ZyBpbiBpbml0aWFsIFJBTSBkaXNrLgpbICAgIDEuNDY3NDE5XSBzeXN0ZW1kWzFdOiBTZXQgaG9z dG5hbWUgdG8gPGxvY2FsaG9zdC5sb2NhbGRvbWFpbj4uClsgICAgMS41MTAwOTldIHN5c3RlbWRb MV06IExpc3RlbmluZyBvbiB1ZGV2IENvbnRyb2wgU29ja2V0LgpbICAgIDEuNTEwMTY0XSBzeXN0 ZW1kWzFdOiBSZWFjaGVkIHRhcmdldCBMb2NhbCBGaWxlIFN5c3RlbXMuClsgICAgMS41MTAxOTld IHN5c3RlbWRbMV06IExpc3RlbmluZyBvbiB1ZGV2IEtlcm5lbCBTb2NrZXQuClsgICAgMS41MTAy OTVdIHN5c3RlbWRbMV06IExpc3RlbmluZyBvbiBKb3VybmFsIFNvY2tldCAoL2Rldi9sb2cpLgpb ICAgIDEuNTEwMzUzXSBzeXN0ZW1kWzFdOiBMaXN0ZW5pbmcgb24gSm91cm5hbCBTb2NrZXQuClsg ICAgMS41MTAzNjddIHN5c3RlbWRbMV06IFJlYWNoZWQgdGFyZ2V0IFN3YXAuClsgICAgMS41MTA0 NjBdIHN5c3RlbWRbMV06IExpc3RlbmluZyBvbiBKb3VybmFsIEF1ZGl0IFNvY2tldC4KWyAgICAx LjUxMDQ3MF0gc3lzdGVtZFsxXTogUmVhY2hlZCB0YXJnZXQgU29ja2V0cy4KWyAgICAxLjUxMDQ3 OV0gc3lzdGVtZFsxXTogUmVhY2hlZCB0YXJnZXQgVGltZXJzLgpbICAgIDEuNTExNjYyXSBzeXN0 ZW1kWzFdOiBDcmVhdGVkIHNsaWNlIFN5c3RlbSBTbGljZS4KWyAgICAxLjUyMzAzMF0gc3lzdGVt ZFsxXTogU3RhcnRpbmcgU2V0dXAgVmlydHVhbCBDb25zb2xlLi4uClsgICAgMS41MjMwNDVdIHN5 c3RlbWRbMV06IFJlYWNoZWQgdGFyZ2V0IFNsaWNlcy4KWyAgICAxLjUyNDMxMV0gc3lzdGVtZFsx XTogU3RhcnRpbmcgQ3JlYXRlIGxpc3Qgb2YgcmVxdWlyZWQgc3RhdGljIGRldmljZSBub2RlcyBm b3IgdGhlIGN1cnJlbnQga2VybmVsLi4uClsgICAgMS41MjU4OTddIHN5c3RlbWRbMV06IFN0YXJ0 aW5nIGRyYWN1dCBjbWRsaW5lIGhvb2suLi4KWyAgICAxLjUyNzc2M10gc3lzdGVtZFsxXTogU3Rh cnRpbmcgSm91cm5hbCBTZXJ2aWNlLi4uClsgICAgMS41Mjk2NjVdIHN5c3RlbWRbMV06IFN0YXJ0 aW5nIEFwcGx5IEtlcm5lbCBWYXJpYWJsZXMuLi4KWyAgICAxLjUzNDI5M10gc3lzdGVtZFsxXTog U3RhcnRlZCBDcmVhdGUgbGlzdCBvZiByZXF1aXJlZCBzdGF0aWMgZGV2aWNlIG5vZGVzIGZvciB0 aGUgY3VycmVudCBrZXJuZWwuClsgICAgMS41MzQ0MDhdIGF1ZGl0OiB0eXBlPTExMzAgYXVkaXQo MTQ3MTUxOTQ1OC45NDA6Mik6IHBpZD0xIHVpZD0wIGF1aWQ9NDI5NDk2NzI5NSBzZXM9NDI5NDk2 NzI5NSBzdWJqPWtlcm5lbCBtc2c9J3VuaXQ9a21vZC1zdGF0aWMtbm9kZXMgY29tbT0ic3lzdGVt ZCIgZXhlPSIvdXNyL2xpYi9zeXN0ZW1kL3N5c3RlbWQiIGhvc3RuYW1lPT8gYWRkcj0/IHRlcm1p bmFsPT8gcmVzPXN1Y2Nlc3MnClsgICAgMS41MzUxNzldIHN5c3RlbWRbMV06IFN0YXJ0ZWQgQXBw bHkgS2VybmVsIFZhcmlhYmxlcy4KWyAgICAxLjUzNTIwMF0gYXVkaXQ6IHR5cGU9MTEzMCBhdWRp dCgxNDcxNTE5NDU4Ljk0MTozKTogcGlkPTEgdWlkPTAgYXVpZD00Mjk0OTY3Mjk1IHNlcz00Mjk0 OTY3Mjk1IHN1Ymo9a2VybmVsIG1zZz0ndW5pdD1zeXN0ZW1kLXN5c2N0bCBjb21tPSJzeXN0ZW1k IiBleGU9Ii91c3IvbGliL3N5c3RlbWQvc3lzdGVtZCIgaG9zdG5hbWU9PyBhZGRyPT8gdGVybWlu YWw9PyByZXM9c3VjY2VzcycKWyAgICAxLjUzODIzN10gdXNiIDEtOTogTmV3IFVTQiBkZXZpY2Ug Zm91bmQsIGlkVmVuZG9yPTIxMDksIGlkUHJvZHVjdD0yODEyClsgICAgMS41MzgyNDBdIHVzYiAx LTk6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0wLCBQcm9kdWN0PTEsIFNlcmlhbE51bWJl cj0wClsgICAgMS41MzgyNDJdIHVzYiAxLTk6IFByb2R1Y3Q6IFVTQiAyLjAgSFVCCiAgICAgICAg ICAgICAgICAgICAgIApbICAgIDEuNTM5NTY1XSBodWIgMS05OjEuMDogVVNCIGh1YiBmb3VuZApb ICAgIDEuNTM5ODUxXSBodWIgMS05OjEuMDogNCBwb3J0cyBkZXRlY3RlZApbICAgIDEuNTQyNjQ5 XSBzeXN0ZW1kWzFdOiBTdGFydGluZyBDcmVhdGUgU3RhdGljIERldmljZSBOb2RlcyBpbiAvZGV2 Li4uClsgICAgMS41NDgxNTBdIHN5c3RlbWRbMV06IFN0YXJ0ZWQgQ3JlYXRlIFN0YXRpYyBEZXZp Y2UgTm9kZXMgaW4gL2Rldi4KWyAgICAxLjU0ODIwM10gYXVkaXQ6IHR5cGU9MTEzMCBhdWRpdCgx NDcxNTE5NDU4Ljk1NDo0KTogcGlkPTEgdWlkPTAgYXVpZD00Mjk0OTY3Mjk1IHNlcz00Mjk0OTY3 Mjk1IHN1Ymo9a2VybmVsIG1zZz0ndW5pdD1zeXN0ZW1kLXRtcGZpbGVzLXNldHVwLWRldiBjb21t PSJzeXN0ZW1kIiBleGU9Ii91c3IvbGliL3N5c3RlbWQvc3lzdGVtZCIgaG9zdG5hbWU9PyBhZGRy PT8gdGVybWluYWw9PyByZXM9c3VjY2VzcycKWyAgICAxLjU4MTE0Ml0gc3lzdGVtZFsxXTogU3Rh cnRlZCBTZXR1cCBWaXJ0dWFsIENvbnNvbGUuClsgICAgMS41ODExODNdIGF1ZGl0OiB0eXBlPTEx MzAgYXVkaXQoMTQ3MTUxOTQ1OC45ODc6NSk6IHBpZD0xIHVpZD0wIGF1aWQ9NDI5NDk2NzI5NSBz ZXM9NDI5NDk2NzI5NSBzdWJqPWtlcm5lbCBtc2c9J3VuaXQ9c3lzdGVtZC12Y29uc29sZS1zZXR1 cCBjb21tPSJzeXN0ZW1kIiBleGU9Ii91c3IvbGliL3N5c3RlbWQvc3lzdGVtZCIgaG9zdG5hbWU9 PyBhZGRyPT8gdGVybWluYWw9PyByZXM9c3VjY2VzcycKWyAgICAxLjU4ODMwMF0gc3lzdGVtZFsx XTogU3RhcnRlZCBKb3VybmFsIFNlcnZpY2UuClsgICAgMS41ODgzNThdIGF1ZGl0OiB0eXBlPTEx MzAgYXVkaXQoMTQ3MTUxOTQ1OC45OTQ6Nik6IHBpZD0xIHVpZD0wIGF1aWQ9NDI5NDk2NzI5NSBz ZXM9NDI5NDk2NzI5NSBzdWJqPWtlcm5lbCBtc2c9J3VuaXQ9c3lzdGVtZC1qb3VybmFsZCBjb21t PSJzeXN0ZW1kIiBleGU9Ii91c3IvbGliL3N5c3RlbWQvc3lzdGVtZCIgaG9zdG5hbWU9PyBhZGRy PT8gdGVybWluYWw9PyByZXM9c3VjY2VzcycKWyAgICAxLjYxMjI1Nl0gYXVkaXQ6IHR5cGU9MTEz MCBhdWRpdCgxNDcxNTE5NDU5LjAxODo3KTogcGlkPTEgdWlkPTAgYXVpZD00Mjk0OTY3Mjk1IHNl cz00Mjk0OTY3Mjk1IHN1Ymo9a2VybmVsIG1zZz0ndW5pdD1kcmFjdXQtY21kbGluZSBjb21tPSJz eXN0ZW1kIiBleGU9Ii91c3IvbGliL3N5c3RlbWQvc3lzdGVtZCIgaG9zdG5hbWU9PyBhZGRyPT8g dGVybWluYWw9PyByZXM9c3VjY2VzcycKWyAgICAxLjYzODkzMV0gdXNiIDItNTogbmV3IFN1cGVy U3BlZWQgVVNCIGRldmljZSBudW1iZXIgMiB1c2luZyB4aGNpX2hjZApbICAgIDEuNjUwMzIwXSBh dWRpdDogdHlwZT0xMTMwIGF1ZGl0KDE0NzE1MTk0NTkuMDU2OjgpOiBwaWQ9MSB1aWQ9MCBhdWlk PTQyOTQ5NjcyOTUgc2VzPTQyOTQ5NjcyOTUgc3Viaj1rZXJuZWwgbXNnPSd1bml0PWRyYWN1dC1w cmUtdWRldiBjb21tPSJzeXN0ZW1kIiBleGU9Ii91c3IvbGliL3N5c3RlbWQvc3lzdGVtZCIgaG9z dG5hbWU9PyBhZGRyPT8gdGVybWluYWw9PyByZXM9c3VjY2VzcycKWyAgICAxLjY1MTY2NV0gdXNi IDItNTogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTIxMDksIGlkUHJvZHVjdD0wODEy ClsgICAgMS42NTE2NjddIHVzYiAyLTU6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0xLCBQ cm9kdWN0PTIsIFNlcmlhbE51bWJlcj0wClsgICAgMS42NTE2NjldIHVzYiAyLTU6IFByb2R1Y3Q6 IFVTQiAzLjAgSFVCCiAgICAgICAgICAgICAgICAgICAgIApbICAgIDEuNjUxNjcwXSB1c2IgMi01 OiBNYW51ZmFjdHVyZXI6IFZMSSBMYWJzLCBJbmMuIApbICAgIDEuNjUzNDA1XSBodWIgMi01OjEu MDogVVNCIGh1YiBmb3VuZApbICAgIDEuNjUzNTk4XSBodWIgMi01OjEuMDogNCBwb3J0cyBkZXRl Y3RlZApbICAgIDEuNjYzNzA5XSBhdWRpdDogdHlwZT0xMTMwIGF1ZGl0KDE0NzE1MTk0NTkuMDY5 OjkpOiBwaWQ9MSB1aWQ9MCBhdWlkPTQyOTQ5NjcyOTUgc2VzPTQyOTQ5NjcyOTUgc3Viaj1rZXJu ZWwgbXNnPSd1bml0PXN5c3RlbWQtdWRldmQgY29tbT0ic3lzdGVtZCIgZXhlPSIvdXNyL2xpYi9z eXN0ZW1kL3N5c3RlbWQiIGhvc3RuYW1lPT8gYWRkcj0/IHRlcm1pbmFsPT8gcmVzPXN1Y2Nlc3Mn ClsgICAgMS42ODAxNzRdIGF1ZGl0OiB0eXBlPTExMzAgYXVkaXQoMTQ3MTUxOTQ1OS4wODY6MTAp OiBwaWQ9MSB1aWQ9MCBhdWlkPTQyOTQ5NjcyOTUgc2VzPTQyOTQ5NjcyOTUgc3Viaj1rZXJuZWwg bXNnPSd1bml0PWRyYWN1dC1wcmUtdHJpZ2dlciBjb21tPSJzeXN0ZW1kIiBleGU9Ii91c3IvbGli L3N5c3RlbWQvc3lzdGVtZCIgaG9zdG5hbWU9PyBhZGRyPT8gdGVybWluYWw9PyByZXM9c3VjY2Vz cycKWyAgICAxLjgyMzg0NF0gdXNiIDEtOS4xOiBuZXcgaGlnaC1zcGVlZCBVU0IgZGV2aWNlIG51 bWJlciAzIHVzaW5nIHhoY2lfaGNkClsgICAgMS44MzQ2NjFdIEZVSklUU1UgRXh0ZW5kZWQgU29j a2V0IE5ldHdvcmsgRGV2aWNlIERyaXZlciAtIHZlcnNpb24gMS4wIC0gQ29weXJpZ2h0IChjKSAy MDE1IEZVSklUU1UgTElNSVRFRApbICAgIDEuODc2Njc3XSByODE2OSBHaWdhYml0IEV0aGVybmV0 IGRyaXZlciAyLjNMSy1OQVBJIGxvYWRlZApbICAgIDEuODc2Njg1XSByODE2OSAwMDAwOjAyOjAw LjA6IGNhbid0IGRpc2FibGUgQVNQTTsgT1MgZG9lc24ndCBoYXZlIEFTUE0gY29udHJvbApbICAg IDEuODc3Nzk5XSByODE2OSAwMDAwOjAyOjAwLjAgZXRoMDogUlRMODE2OGV2bC84MTExZXZsIGF0 IDB4ZmZmZmM5MDAwMzE1ODAwMCwgOTQ6ZGU6ODA6NmI6ZGQ6MjQsIFhJRCAwYzkwMDgwMCBJUlEg MjgKWyAgICAxLjg3NzgwMl0gcjgxNjkgMDAwMDowMjowMC4wIGV0aDA6IGp1bWJvIGZlYXR1cmVz IFtmcmFtZXM6IDkyMDAgYnl0ZXMsIHR4IGNoZWNrc3VtbWluZzoga29dClsgICAgMS44OTQzMTNd IFtkcm1dIEluaXRpYWxpemVkIGRybSAxLjEuMCAyMDA2MDgxMApbICAgIDEuODk2MzQ1XSBhdGFf aWQgKDM5MCkgdXNlZCBncmVhdGVzdCBzdGFjayBkZXB0aDogMTIwNDAgYnl0ZXMgbGVmdApbICAg IDEuOTAyODc1XSA4MDIxcTogODAyLjFRIFZMQU4gU3VwcG9ydCB2MS44ClsgICAgMS45MDkwMjNd IHVzYiAxLTkuMTogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFhNDAsIGlkUHJvZHVj dD0wMjAxClsgICAgMS45MDkwMjddIHVzYiAxLTkuMTogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczog TWZyPTAsIFByb2R1Y3Q9MSwgU2VyaWFsTnVtYmVyPTAKWyAgICAxLjkwOTAyOV0gdXNiIDEtOS4x OiBQcm9kdWN0OiBVU0IgMi4wIEh1YiBbTVRUXQpbICAgIDEuOTEzNDY2XSBodWIgMS05LjE6MS4w OiBVU0IgaHViIGZvdW5kClsgICAgMS45MTM2MzRdIGh1YiAxLTkuMToxLjA6IDcgcG9ydHMgZGV0 ZWN0ZWQKWyAgICAxLjkyMDg3MF0gdHNjOiBSZWZpbmVkIFRTQyBjbG9ja3NvdXJjZSBjYWxpYnJh dGlvbjogMzM5Mi4xNDQgTUh6ClsgICAgMS45MjA4NzRdIGNsb2Nrc291cmNlOiB0c2M6IG1hc2s6 IDB4ZmZmZmZmZmZmZmZmZmZmZiBtYXhfY3ljbGVzOiAweDMwZTU1MTdkNGU0LCBtYXhfaWRsZV9u czogNDQwNzk1MjYxNjY4IG5zClsgICAgMS45NDQzMTJdIHI4MTY5IDAwMDA6MDI6MDAuMCBlbnAy czA6IHJlbmFtZWQgZnJvbSBldGgwClsgICAgMS45ODk3OTVdIHVzYiAxLTkuNDogbmV3IGhpZ2gt c3BlZWQgVVNCIGRldmljZSBudW1iZXIgNCB1c2luZyB4aGNpX2hjZApbICAgIDIuMDAwMzY5XSBb ZHJtXSBNZW1vcnkgdXNhYmxlIGJ5IGdyYXBoaWNzIGRldmljZSA9IDIwNDhNClsgICAgMi4wMDAz ODNdIGNoZWNraW5nIGdlbmVyaWMgKGUwMDAwMDAwIDMwMDAwMCkgdnMgaHcgKGUwMDAwMDAwIDEw MDAwMDAwKQpbICAgIDIuMDAwMzg0XSBmYjogc3dpdGNoaW5nIHRvIGludGVsZHJtZmIgZnJvbSBF RkkgVkdBClsgICAgMi4wMDA1MTddIENvbnNvbGU6IHN3aXRjaGluZyB0byBjb2xvdXIgZHVtbXkg ZGV2aWNlIDgweDI1ClsgICAgMi4wMDI1MjldIFtkcm1dIFJlcGxhY2luZyBWR0EgY29uc29sZSBk cml2ZXIKWyAgICAyLjAxMDA0MF0gW2RybV0gU3VwcG9ydHMgdmJsYW5rIHRpbWVzdGFtcCBjYWNo aW5nIFJldiAyICgyMS4xMC4yMDEzKS4KWyAgICAyLjAxMDA0M10gW2RybV0gRHJpdmVyIHN1cHBv cnRzIHByZWNpc2UgdmJsYW5rIHRpbWVzdGFtcCBxdWVyeS4KWyAgICAyLjAxNjgxNV0gdmdhYXJi OiBkZXZpY2UgY2hhbmdlZCBkZWNvZGVzOiBQQ0k6MDAwMDowMDowMi4wLG9sZGRlY29kZXM9aW8r bWVtLGRlY29kZXM9aW8rbWVtOm93bnM9aW8rbWVtClsgICAgMi4wNDAzODJdIEFDUEk6IFZpZGVv IERldmljZSBbR0ZYMF0gKG11bHRpLWhlYWQ6IHllcyAgcm9tOiBubyAgcG9zdDogbm8pClsgICAg Mi4wNDMzMTFdIGFjcGkgZGV2aWNlOjYwOiByZWdpc3RlcmVkIGFzIGNvb2xpbmdfZGV2aWNlMTMK WyAgICAyLjA0NDc4MF0gaW5wdXQ6IFZpZGVvIEJ1cyBhcyAvZGV2aWNlcy9MTlhTWVNUTTowMC9M TlhTWUJVUzowMC9QTlAwQTA4OjAwL0xOWFZJREVPOjAwL2lucHV0L2lucHV0NQpbICAgIDIuMDQ1 NTM3XSBbZHJtXSBJbml0aWFsaXplZCBpOTE1IDEuNi4wIDIwMTYwMjI5IGZvciAwMDAwOjAwOjAy LjAgb24gbWlub3IgMApbICAgIDIuMDc2NzQwXSB1c2IgMS05LjQ6IE5ldyBVU0IgZGV2aWNlIGZv dW5kLCBpZFZlbmRvcj04NTY0LCBpZFByb2R1Y3Q9MTAwMApbICAgIDIuMDc2NzQzXSB1c2IgMS05 LjQ6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0xLCBQcm9kdWN0PTIsIFNlcmlhbE51bWJl cj0zClsgICAgMi4wNzY3NDRdIHVzYiAxLTkuNDogUHJvZHVjdDogTWFzcyBTdG9yYWdlIERldmlj ZQpbICAgIDIuMDc2NzQ1XSB1c2IgMS05LjQ6IE1hbnVmYWN0dXJlcjogSmV0Rmxhc2gKWyAgICAy LjA3Njc0Nl0gdXNiIDEtOS40OiBTZXJpYWxOdW1iZXI6IDM5ODg4MjE4MTIKWyAgICAyLjA4NTYz OF0gdXNiLXN0b3JhZ2UgMS05LjQ6MS4wOiBVU0IgTWFzcyBTdG9yYWdlIGRldmljZSBkZXRlY3Rl ZApbICAgIDIuMDg2MDIzXSBzY3NpIGhvc3Q2OiB1c2Itc3RvcmFnZSAxLTkuNDoxLjAKWyAgICAy LjA4NjUwN10gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciB1c2Itc3Rv cmFnZQpbICAgIDIuMDg4MzA2XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJp dmVyIHVhcwpbICAgIDIuMTAwMjEzXSBFWFQ0LWZzIChzZGExKTogbW91bnRlZCBmaWxlc3lzdGVt IHdpdGggb3JkZXJlZCBkYXRhIG1vZGUuIE9wdHM6IChudWxsKQpbICAgIDIuMTE0MjY1XSBzeXN0 ZW1kLWZzdGFiLWcgKDQzNSkgdXNlZCBncmVhdGVzdCBzdGFjayBkZXB0aDogMTE5MjggYnl0ZXMg bGVmdApbICAgIDIuMTcwODU1XSBmYmNvbjogaW50ZWxkcm1mYiAoZmIwKSBpcyBwcmltYXJ5IGRl dmljZQpbICAgIDIuMTc2NzkwXSB1c2IgMS05LjEuMTogbmV3IGZ1bGwtc3BlZWQgVVNCIGRldmlj ZSBudW1iZXIgNSB1c2luZyB4aGNpX2hjZApbICAgIDIuMjUxMzk1XSB1c2IgMS05LjEuMTogTmV3 IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTA0NmQsIGlkUHJvZHVjdD0wOGQ5ClsgICAgMi4y NTEzOTZdIHVzYiAxLTkuMS4xOiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9MCwgUHJvZHVj dD0wLCBTZXJpYWxOdW1iZXI9MApbICAgIDIuMzE0NzgwXSB1c2IgMS05LjEuMjogbmV3IGhpZ2gt c3BlZWQgVVNCIGRldmljZSBudW1iZXIgNiB1c2luZyB4aGNpX2hjZApbICAgIDIuMzE5ODg4XSBD b25zb2xlOiBzd2l0Y2hpbmcgdG8gY29sb3VyIGZyYW1lIGJ1ZmZlciBkZXZpY2UgMjQweDY3Clsg ICAgMi4zMjI1NjJdIGk5MTUgMDAwMDowMDowMi4wOiBmYjA6IGludGVsZHJtZmIgZnJhbWUgYnVm ZmVyIGRldmljZQpbICAgIDIuMzc3NzkyXSBzeXN0ZW1kLXVkZXZkICgzODApIHVzZWQgZ3JlYXRl c3Qgc3RhY2sgZGVwdGg6IDExMzY4IGJ5dGVzIGxlZnQKWyAgICAyLjM4ODcxM10gdXNiIDEtOS4x LjI6IE5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0xMmQxLCBpZFByb2R1Y3Q9MTUwNgpb ICAgIDIuMzg4NzE1XSB1c2IgMS05LjEuMjogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTEs IFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTAKWyAgICAyLjM4ODcxN10gdXNiIDEtOS4xLjI6IFBy b2R1Y3Q6IEhVQVdFSV9NT0JJTEUKWyAgICAyLjM4ODcxOF0gdXNiIDEtOS4xLjI6IE1hbnVmYWN0 dXJlcjogSFVBV0VJX01PQklMRQpbICAgIDIuNDY2ODY0XSB1c2Itc3RvcmFnZSAxLTkuMS4yOjEu MzogVVNCIE1hc3MgU3RvcmFnZSBkZXZpY2UgZGV0ZWN0ZWQKWyAgICAyLjQ2NzM3NF0gc2NzaSBo b3N0NzogdXNiLXN0b3JhZ2UgMS05LjEuMjoxLjMKWyAgICAyLjQ2OTUyNl0gdXNiLXN0b3JhZ2Ug MS05LjEuMjoxLjQ6IFVTQiBNYXNzIFN0b3JhZ2UgZGV2aWNlIGRldGVjdGVkClsgICAgMi40NzAy MDddIHNjc2kgaG9zdDg6IHVzYi1zdG9yYWdlIDEtOS4xLjI6MS40ClsgICAgMi41MzI3NTBdIHVz YiAxLTkuMS4zOiBuZXcgbG93LXNwZWVkIFVTQiBkZXZpY2UgbnVtYmVyIDcgdXNpbmcgeGhjaV9o Y2QKWyAgICAyLjYzMDQyM10gdXNiIDEtOS4xLjM6IE5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZl bmRvcj0wNDZkLCBpZFByb2R1Y3Q9YzMyNgpbICAgIDIuNjMwNDI2XSB1c2IgMS05LjEuMzogTmV3 IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTEsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTAKWyAg ICAyLjYzMDQyN10gdXNiIDEtOS4xLjM6IFByb2R1Y3Q6IFVTQiBLZXlib2FyZApbICAgIDIuNjMw NDI4XSB1c2IgMS05LjEuMzogTWFudWZhY3R1cmVyOiBMb2dpdGVjaApbICAgIDIuNjM3MTkyXSBp bnB1dDogTG9naXRlY2ggVVNCIEtleWJvYXJkIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDow MDoxNC4wL3VzYjEvMS05LzEtOS4xLzEtOS4xLjMvMS05LjEuMzoxLjAvMDAwMzowNDZEOkMzMjYu MDAwMS9pbnB1dC9pbnB1dDYKWyAgICAyLjY4OTIwMl0gaGlkLWdlbmVyaWMgMDAwMzowNDZEOkMz MjYuMDAwMTogaW5wdXQsaGlkcmF3MDogVVNCIEhJRCB2MS4xMCBLZXlib2FyZCBbTG9naXRlY2gg VVNCIEtleWJvYXJkXSBvbiB1c2ItMDAwMDowMDoxNC4wLTkuMS4zL2lucHV0MApbICAgIDIuNjk0 OTY0XSBpbnB1dDogTG9naXRlY2ggVVNCIEtleWJvYXJkIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAv MDAwMDowMDoxNC4wL3VzYjEvMS05LzEtOS4xLzEtOS4xLjMvMS05LjEuMzoxLjEvMDAwMzowNDZE OkMzMjYuMDAwMi9pbnB1dC9pbnB1dDcKWyAgICAyLjc0NjQyMV0gaGlkLWdlbmVyaWMgMDAwMzow NDZEOkMzMjYuMDAwMjogaW5wdXQsaGlkZGV2MCxoaWRyYXcxOiBVU0IgSElEIHYxLjEwIERldmlj ZSBbTG9naXRlY2ggVVNCIEtleWJvYXJkXSBvbiB1c2ItMDAwMDowMDoxNC4wLTkuMS4zL2lucHV0 MQpbICAgIDIuODA4NzM2XSB1c2IgMS05LjEuNDogbmV3IGZ1bGwtc3BlZWQgVVNCIGRldmljZSBu dW1iZXIgOCB1c2luZyB4aGNpX2hjZApbICAgIDIuODM2OTE5XSBzeXN0ZW1kLWpvdXJuYWxkWzIz NF06IFJlY2VpdmVkIFNJR1RFUk0gZnJvbSBQSUQgMSAoc3lzdGVtZCkuClsgICAgMi45MjEyMzFd IGNsb2Nrc291cmNlOiBTd2l0Y2hlZCB0byBjbG9ja3NvdXJjZSB0c2MKWyAgICAyLjk1NzI3NF0g U0VMaW51eDogMzI3NjggYXZ0YWIgaGFzaCBzbG90cywgMTA1MTQ3IHJ1bGVzLgpbICAgIDIuOTc4 NDg3XSBTRUxpbnV4OiAzMjc2OCBhdnRhYiBoYXNoIHNsb3RzLCAxMDUxNDcgcnVsZXMuClsgICAg My4wMjM1OTZdIFNFTGludXg6ICA4IHVzZXJzLCAxNCByb2xlcywgNTAzNCB0eXBlcywgMzA1IGJv b2xzLCAxIHNlbnMsIDEwMjQgY2F0cwpbICAgIDMuMDIzNTk5XSBTRUxpbnV4OiAgOTIgY2xhc3Nl cywgMTA1MTQ3IHJ1bGVzClsgICAgMy4wMjkwNTddIFNFTGludXg6ICBQZXJtaXNzaW9uIHZhbGlk YXRlX3RyYW5zIGluIGNsYXNzIHNlY3VyaXR5IG5vdCBkZWZpbmVkIGluIHBvbGljeS4KWyAgICAz LjAyOTEyMF0gU0VMaW51eDogdGhlIGFib3ZlIHVua25vd24gY2xhc3NlcyBhbmQgcGVybWlzc2lv bnMgd2lsbCBiZSBhbGxvd2VkClsgICAgMy4wMjkxMjVdIFNFTGludXg6ICBDb21wbGV0aW5nIGlu aXRpYWxpemF0aW9uLgpbICAgIDMuMDI5MTI2XSBTRUxpbnV4OiAgU2V0dGluZyB1cCBleGlzdGlu ZyBzdXBlcmJsb2Nrcy4KWyAgICAzLjA2MjkwNV0gc3lzdGVtZFsxXTogU3VjY2Vzc2Z1bGx5IGxv YWRlZCBTRUxpbnV4IHBvbGljeSBpbiAxMzIuNTYxbXMuClsgICAgMy4wOTAzMDVdIHNjc2kgNjow OjA6MDogRGlyZWN0LUFjY2VzcyAgICAgSmV0Rmxhc2ggVHJhbnNjZW5kIDMyR0IgICAxLjAwIFBR OiAwIEFOU0k6IDUKWyAgICAzLjA5MjMyNl0gc2QgNjowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5l cmljIHNnMyB0eXBlIDAKWyAgICAzLjA5MjU3Ml0gc2QgNjowOjA6MDogW3NkZF0gNjE3NDEwNTYg NTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6ICgzMS42IEdCLzI5LjQgR2lCKQpbICAgIDMuMDkyNzIz XSBzZCA2OjA6MDowOiBbc2RkXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpbICAgIDMuMDkyNzI1XSBz ZCA2OjA6MDowOiBbc2RkXSBNb2RlIFNlbnNlOiAyMyAwMCAwMCAwMApbICAgIDMuMDkyODcwXSBz ZCA2OjA6MDowOiBbc2RkXSBXcml0ZSBjYWNoZTogZGlzYWJsZWQsIHJlYWQgY2FjaGU6IGRpc2Fi bGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZVQQpbICAgIDMuMDk0NjM0XSAgc2RkOiBzZGQx IHNkZDIgc2RkMwpbICAgIDMuMDk2MTY2XSBzZCA2OjA6MDowOiBbc2RkXSBBdHRhY2hlZCBTQ1NJ IHJlbW92YWJsZSBkaXNrClsgICAgMy4wOTcxMjJdIHN5c3RlbWRbMV06IFJlbGFiZWxsZWQgL2Rl diBhbmQgL3J1biBpbiAxOC45NTltcy4KWyAgICAzLjA5NzE5Ml0gdXNiIDEtOS4xLjQ6IE5ldyBV U0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0wYTEyLCBpZFByb2R1Y3Q9MDAwMQpbICAgIDMuMDk3 MTk0XSB1c2IgMS05LjEuNDogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTAsIFByb2R1Y3Q9 MiwgU2VyaWFsTnVtYmVyPTAKWyAgICAzLjA5NzE5NV0gdXNiIDEtOS4xLjQ6IFByb2R1Y3Q6IEJU Mi4wClsgICAgMy4xNTQ2MjFdIGFuYWNvbmRhLWdlbmVyYSAoNTMyKSB1c2VkIGdyZWF0ZXN0IHN0 YWNrIGRlcHRoOiAxMDc2MCBieXRlcyBsZWZ0ClsgICAgMy4xNjA3MThdIHVzYiAxLTkuMS41OiBu ZXcgaGlnaC1zcGVlZCBVU0IgZGV2aWNlIG51bWJlciA5IHVzaW5nIHhoY2lfaGNkClsgICAgMy4y Mzc2MzZdIHVzYiAxLTkuMS41OiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MTNmZSwg aWRQcm9kdWN0PTM2MjMKWyAgICAzLjIzNzYzOV0gdXNiIDEtOS4xLjU6IE5ldyBVU0IgZGV2aWNl IHN0cmluZ3M6IE1mcj0xLCBQcm9kdWN0PTIsIFNlcmlhbE51bWJlcj0zClsgICAgMy4yMzc2NDBd IHVzYiAxLTkuMS41OiBQcm9kdWN0OiBzaWxpY29uLXBvd2VyClsgICAgMy4yMzc2NDFdIHVzYiAx LTkuMS41OiBNYW51ZmFjdHVyZXI6ICAgICAgICAgClsgICAgMy4yMzc2NDFdIHVzYiAxLTkuMS41 OiBTZXJpYWxOdW1iZXI6IDEwMDkwNTI2RTZBOTBFMDAwRjNCMDFGOApbICAgIDMuMjM4NDIwXSB1 c2Itc3RvcmFnZSAxLTkuMS41OjEuMDogVVNCIE1hc3MgU3RvcmFnZSBkZXZpY2UgZGV0ZWN0ZWQK WyAgICAzLjIzODcwN10gc2NzaSBob3N0OTogdXNiLXN0b3JhZ2UgMS05LjEuNToxLjAKWyAgICAz LjI2NzI0M10gRVhUNC1mcyAoc2RhMSk6IHJlLW1vdW50ZWQuIE9wdHM6IChudWxsKQpbICAgIDMu MzAwNzUzXSB1c2IgMS05LjEuNjogbmV3IGZ1bGwtc3BlZWQgVVNCIGRldmljZSBudW1iZXIgMTAg dXNpbmcgeGhjaV9oY2QKWyAgICAzLjMwNjE0NF0gUlBDOiBSZWdpc3RlcmVkIG5hbWVkIFVOSVgg c29ja2V0IHRyYW5zcG9ydCBtb2R1bGUuClsgICAgMy4zMDYxNDZdIFJQQzogUmVnaXN0ZXJlZCB1 ZHAgdHJhbnNwb3J0IG1vZHVsZS4KWyAgICAzLjMwNjE0N10gUlBDOiBSZWdpc3RlcmVkIHRjcCB0 cmFuc3BvcnQgbW9kdWxlLgpbICAgIDMuMzA2MTQ4XSBSUEM6IFJlZ2lzdGVyZWQgdGNwIE5GU3Y0 LjEgYmFja2NoYW5uZWwgdHJhbnNwb3J0IG1vZHVsZS4KWyAgICAzLjMzODEzNF0gSW5zdGFsbGlu ZyBrbmZzZCAoY29weXJpZ2h0IChDKSAxOTk2IG9raXJAbW9uYWQuc3diLmRlKS4KWyAgICAzLjM0 NzA0NF0gc3lzdGVtZC1qb3VybmFsZFs1NDhdOiBSZWNlaXZlZCByZXF1ZXN0IHRvIGZsdXNoIHJ1 bnRpbWUgam91cm5hbCBmcm9tIFBJRCAxClsgICAgMy4zNTgyOTddIHJhbmRvbTogbm9uYmxvY2tp bmcgcG9vbCBpcyBpbml0aWFsaXplZApbICAgIDMuMzc2OTY0XSB1c2IgMS05LjEuNjogTmV3IFVT QiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTA0NmQsIGlkUHJvZHVjdD1jNTJiClsgICAgMy4zNzY5 NjddIHVzYiAxLTkuMS42OiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9MSwgUHJvZHVjdD0y LCBTZXJpYWxOdW1iZXI9MApbICAgIDMuMzc2OTY4XSB1c2IgMS05LjEuNjogUHJvZHVjdDogVVNC IFJlY2VpdmVyClsgICAgMy4zNzY5NjldIHVzYiAxLTkuMS42OiBNYW51ZmFjdHVyZXI6IExvZ2l0 ZWNoClsgICAgMy40ODAxODFdIHNjc2kgNzowOjA6MDogQ0QtUk9NICAgICAgICAgICAgSFVBV0VJ ICAgTWFzcyBTdG9yYWdlICAgICAyLjMxIFBROiAwIEFOU0k6IDIKWyAgICAzLjQ4MTE3OV0gc2Nz aSA4OjA6MDowOiBEaXJlY3QtQWNjZXNzICAgICBIVUFXRUkgICBURiBDQVJEIFN0b3JhZ2UgIDIu MzEgUFE6IDAgQU5TSTogMgpbICAgIDMuNDg4MzIxXSBzciA3OjA6MDowOiBbc3IwXSBzY3NpLTEg ZHJpdmUKWyAgICAzLjQ4ODMyNF0gY2Ryb206IFVuaWZvcm0gQ0QtUk9NIGRyaXZlciBSZXZpc2lv bjogMy4yMApbICAgIDMuNTAxMjY4XSBzciA3OjA6MDowOiBBdHRhY2hlZCBzY3NpIENELVJPTSBz cjAKWyAgICAzLjUwMzQ5OF0gc3IgNzowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnNCB0 eXBlIDUKWyAgICAzLjUwNjU3Ml0gc2QgODowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNn NSB0eXBlIDAKWyAgICAzLjUwOTE0NV0gc2QgODowOjA6MDogW3NkZV0gQXR0YWNoZWQgU0NTSSBy ZW1vdmFibGUgZGlzawpbICAgIDMuNTc5NDg3XSBsb2dpdGVjaC1kanJlY2VpdmVyIDAwMDM6MDQ2 RDpDNTJCLjAwMDU6IGhpZGRldjAsaGlkcmF3MjogVVNCIEhJRCB2MS4xMSBEZXZpY2UgW0xvZ2l0 ZWNoIFVTQiBSZWNlaXZlcl0gb24gdXNiLTAwMDA6MDA6MTQuMC05LjEuNi9pbnB1dDIKWyAgICAz LjU5NDEyMl0gc3IgNzowOjA6MDogW3NyMF0gdGFnIzAgRkFJTEVEIFJlc3VsdDogaG9zdGJ5dGU9 RElEX09LIGRyaXZlcmJ5dGU9RFJJVkVSX1NFTlNFClsgICAgMy41OTQxMjRdIHNyIDc6MDowOjA6 IFtzcjBdIHRhZyMwIFNlbnNlIEtleSA6IE1lZGl1bSBFcnJvciBbY3VycmVudF0gClsgICAgMy41 OTQxMjZdIHNyIDc6MDowOjA6IFtzcjBdIHRhZyMwIEFkZC4gU2Vuc2U6IFVucmVjb3ZlcmVkIHJl YWQgZXJyb3IKWyAgICAzLjU5NDEyOF0gc3IgNzowOjA6MDogW3NyMF0gdGFnIzAgQ0RCOiBSZWFk KDEwKSAyOCAwMCAwMCAwMCA4ZCAwMCAwMCAwMCAzYyAwMApbICAgIDMuNTk0MTQyXSBibGtfdXBk YXRlX3JlcXVlc3Q6IGNyaXRpY2FsIG1lZGl1bSBlcnJvciwgZGV2IHNyMCwgc2VjdG9yIDE0NDM4 NApbICAgIDMuNjAwNTIxXSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBGQUlMRUQgUmVzdWx0OiBo b3N0Ynl0ZT1ESURfT0sgZHJpdmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgICAzLjYwMDUyNF0gc3Ig NzowOjA6MDogW3NyMF0gdGFnIzAgU2Vuc2UgS2V5IDogTWVkaXVtIEVycm9yIFtjdXJyZW50XSAK WyAgICAzLjYwMDUyNV0gc3IgNzowOjA6MDogW3NyMF0gdGFnIzAgQWRkLiBTZW5zZTogVW5yZWNv dmVyZWQgcmVhZCBlcnJvcgpbICAgIDMuNjAwNTI3XSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBD REI6IFJlYWQoMTApIDI4IDAwIDAwIDAwIDhkIDNjIDAwIDAwIDA0IDAwClsgICAgMy42MDA1Mjhd IGJsa191cGRhdGVfcmVxdWVzdDogY3JpdGljYWwgbWVkaXVtIGVycm9yLCBkZXYgc3IwLCBzZWN0 b3IgMTQ0NjI0ClsgICAgMy42MDY5MjNdIHNyIDc6MDowOjA6IFtzcjBdIHRhZyMwIEZBSUxFRCBS ZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAgIDMuNjA2 OTI1XSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBTZW5zZSBLZXkgOiBNZWRpdW0gRXJyb3IgW2N1 cnJlbnRdIApbICAgIDMuNjA2OTI3XSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBBZGQuIFNlbnNl OiBVbnJlY292ZXJlZCByZWFkIGVycm9yClsgICAgMy42MDY5MjhdIHNyIDc6MDowOjA6IFtzcjBd IHRhZyMwIENEQjogUmVhZCgxMCkgMjggMDAgMDAgMDAgOGQgMDAgMDAgMDAgMDIgMDAKWyAgICAz LjYwNjkyOV0gYmxrX3VwZGF0ZV9yZXF1ZXN0OiBjcml0aWNhbCBtZWRpdW0gZXJyb3IsIGRldiBz cjAsIHNlY3RvciAxNDQzODQKWyAgICAzLjYwNjk0OF0gQnVmZmVyIEkvTyBlcnJvciBvbiBkZXYg c3IwLCBsb2dpY2FsIGJsb2NrIDE4MDQ4LCBhc3luYyBwYWdlIHJlYWQKWyAgICAzLjYxMzU5MV0g c3IgNzowOjA6MDogW3NyMF0gdGFnIzAgRkFJTEVEIFJlc3VsdDogaG9zdGJ5dGU9RElEX09LIGRy aXZlcmJ5dGU9RFJJVkVSX1NFTlNFClsgICAgMy42MTM1OTNdIHNyIDc6MDowOjA6IFtzcjBdIHRh ZyMwIFNlbnNlIEtleSA6IE1lZGl1bSBFcnJvciBbY3VycmVudF0gClsgICAgMy42MTM1OTRdIHNy IDc6MDowOjA6IFtzcjBdIHRhZyMwIEFkZC4gU2Vuc2U6IFVucmVjb3ZlcmVkIHJlYWQgZXJyb3IK WyAgICAzLjYxMzU5Nl0gc3IgNzowOjA6MDogW3NyMF0gdGFnIzAgQ0RCOiBSZWFkKDEwKSAyOCAw MCAwMCAwMCA4ZCBmZSAwMCAwMCAwMiAwMApbICAgIDMuNjEzNTk3XSBibGtfdXBkYXRlX3JlcXVl c3Q6IGNyaXRpY2FsIG1lZGl1bSBlcnJvciwgZGV2IHNyMCwgc2VjdG9yIDE0NTQwMApbICAgIDMu NjE5ODQ4XSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBGQUlMRUQgUmVzdWx0OiBob3N0Ynl0ZT1E SURfT0sgZHJpdmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgICAzLjYxOTg1MF0gc3IgNzowOjA6MDog W3NyMF0gdGFnIzAgU2Vuc2UgS2V5IDogTWVkaXVtIEVycm9yIFtjdXJyZW50XSAKWyAgICAzLjYx OTg1MV0gc3IgNzowOjA6MDogW3NyMF0gdGFnIzAgQWRkLiBTZW5zZTogVW5yZWNvdmVyZWQgcmVh ZCBlcnJvcgpbICAgIDMuNjE5ODUyXSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBDREI6IFJlYWQo MTApIDI4IDAwIDAwIDAwIDhkIGZlIDAwIDAwIDAyIDAwClsgICAgMy42MTk4NTNdIGJsa191cGRh dGVfcmVxdWVzdDogY3JpdGljYWwgbWVkaXVtIGVycm9yLCBkZXYgc3IwLCBzZWN0b3IgMTQ1NDAw ClsgICAgMy42MTk4NTVdIEJ1ZmZlciBJL08gZXJyb3Igb24gZGV2IHNyMCwgbG9naWNhbCBibG9j ayAxODE3NSwgYXN5bmMgcGFnZSByZWFkClsgICAgMy42NzQyMTBdIHNyIDc6MDowOjA6IFtzcjBd IHRhZyMwIEZBSUxFRCBSZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZFUl9T RU5TRQpbICAgIDMuNjc0MjI2XSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBTZW5zZSBLZXkgOiBN ZWRpdW0gRXJyb3IgW2N1cnJlbnRdIApbICAgIDMuNjc0MjI3XSBzciA3OjA6MDowOiBbc3IwXSB0 YWcjMCBBZGQuIFNlbnNlOiBVbnJlY292ZXJlZCByZWFkIGVycm9yClsgICAgMy42NzQyMjldIHNy IDc6MDowOjA6IFtzcjBdIHRhZyMwIENEQjogUmVhZCgxMCkgMjggMDAgMDAgMDAgOGMgODAgMDAg MDAgM2MgMDAKWyAgICAzLjY3NDIzMF0gYmxrX3VwZGF0ZV9yZXF1ZXN0OiBjcml0aWNhbCBtZWRp dW0gZXJyb3IsIGRldiBzcjAsIHNlY3RvciAxNDM4NzIKWyAgICAzLjY4MDMxNV0gc3IgNzowOjA6 MDogW3NyMF0gdGFnIzAgRkFJTEVEIFJlc3VsdDogaG9zdGJ5dGU9RElEX09LIGRyaXZlcmJ5dGU9 RFJJVkVSX1NFTlNFClsgICAgMy42ODAzMTldIHNyIDc6MDowOjA6IFtzcjBdIHRhZyMwIFNlbnNl IEtleSA6IE1lZGl1bSBFcnJvciBbY3VycmVudF0gClsgICAgMy42ODAzMjFdIHNyIDc6MDowOjA6 IFtzcjBdIHRhZyMwIEFkZC4gU2Vuc2U6IFVucmVjb3ZlcmVkIHJlYWQgZXJyb3IKWyAgICAzLjY4 MDMyM10gc3IgNzowOjA6MDogW3NyMF0gdGFnIzAgQ0RCOiBSZWFkKDEwKSAyOCAwMCAwMCAwMCA4 YyBiYyAwMCAwMCAwNCAwMApbICAgIDMuNjgwMzI2XSBibGtfdXBkYXRlX3JlcXVlc3Q6IGNyaXRp Y2FsIG1lZGl1bSBlcnJvciwgZGV2IHNyMCwgc2VjdG9yIDE0NDExMgpbICAgIDMuNjg2NDM2XSBz ciA3OjA6MDowOiBbc3IwXSB0YWcjMCBGQUlMRUQgUmVzdWx0OiBob3N0Ynl0ZT1ESURfT0sgZHJp dmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgICAzLjY4NjQzOV0gc3IgNzowOjA6MDogW3NyMF0gdGFn IzAgU2Vuc2UgS2V5IDogTWVkaXVtIEVycm9yIFtjdXJyZW50XSAKWyAgICAzLjY4NjQ0MF0gc3Ig NzowOjA6MDogW3NyMF0gdGFnIzAgQWRkLiBTZW5zZTogVW5yZWNvdmVyZWQgcmVhZCBlcnJvcgpb ICAgIDMuNjg2NDQyXSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBDREI6IFJlYWQoMTApIDI4IDAw IDAwIDAwIDhjIDgwIDAwIDAwIDAyIDAwClsgICAgMy42ODY0NDNdIGJsa191cGRhdGVfcmVxdWVz dDogY3JpdGljYWwgbWVkaXVtIGVycm9yLCBkZXYgc3IwLCBzZWN0b3IgMTQzODcyClsgICAgMy42 ODY0NDVdIEJ1ZmZlciBJL08gZXJyb3Igb24gZGV2IHNyMCwgbG9naWNhbCBibG9jayAxNzk4NCwg YXN5bmMgcGFnZSByZWFkClsgICAgMy42OTI4NjZdIHNyIDc6MDowOjA6IFtzcjBdIHRhZyMwIEZB SUxFRCBSZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAg IDMuNjkyODcwXSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBTZW5zZSBLZXkgOiBNZWRpdW0gRXJy b3IgW2N1cnJlbnRdIApbICAgIDMuNjkyODcyXSBzciA3OjA6MDowOiBbc3IwXSB0YWcjMCBBZGQu IFNlbnNlOiBVbnJlY292ZXJlZCByZWFkIGVycm9yClsgICAgMy42OTI4NzVdIHNyIDc6MDowOjA6 IFtzcjBdIHRhZyMwIENEQjogUmVhZCgxMCkgMjggMDAgMDAgMDAgOGQgZmMgMDAgMDAgMDIgMDAK WyAgICAzLjY5Mjg3N10gYmxrX3VwZGF0ZV9yZXF1ZXN0OiBjcml0aWNhbCBtZWRpdW0gZXJyb3Is IGRldiBzcjAsIHNlY3RvciAxNDUzOTIKWyAgICAzLjcwMDEyNF0gc3IgNzowOjA6MDogW3NyMF0g dGFnIzAgRkFJTEVEIFJlc3VsdDogaG9zdGJ5dGU9RElEX09LIGRyaXZlcmJ5dGU9RFJJVkVSX1NF TlNFClsgICAgMy43MDAxMjddIHNyIDc6MDowOjA6IFtzcjBdIHRhZyMwIFNlbnNlIEtleSA6IE1l ZGl1bSBFcnJvciBbY3VycmVudF0gClsgICAgMy43MDAxMjhdIHNyIDc6MDowOjA6IFtzcjBdIHRh ZyMwIEFkZC4gU2Vuc2U6IFVucmVjb3ZlcmVkIHJlYWQgZXJyb3IKWyAgICAzLjcwMDEzMV0gc3Ig NzowOjA6MDogW3NyMF0gdGFnIzAgQ0RCOiBSZWFkKDEwKSAyOCAwMCAwMCAwMCA4ZCBmYyAwMCAw MCAwMiAwMApbICAgIDMuNzAwMTMzXSBibGtfdXBkYXRlX3JlcXVlc3Q6IGNyaXRpY2FsIG1lZGl1 bSBlcnJvciwgZGV2IHNyMCwgc2VjdG9yIDE0NTM5MgpbICAgIDMuNzAwMTM2XSBCdWZmZXIgSS9P IGVycm9yIG9uIGRldiBzcjAsIGxvZ2ljYWwgYmxvY2sgMTgxNzQsIGFzeW5jIHBhZ2UgcmVhZApb ICAgIDMuNzM0MDU2XSBwYXJwb3J0X3BjIDAwOjA2OiByZXBvcnRlZCBieSBQbHVnIGFuZCBQbGF5 IEFDUEkKWyAgICAzLjczNTQwOV0gcGFycG9ydDA6IFBDLXN0eWxlIGF0IDB4Mzc4LCBpcnEgNSBb UENTUFAsVFJJU1RBVEVdClsgICAgMy44MTA1OTldIHNocGNocDogU3RhbmRhcmQgSG90IFBsdWcg UENJIENvbnRyb2xsZXIgRHJpdmVyIHZlcnNpb246IDAuNApbICAgIDMuODgzOTk2XSBpODAxX3Nt YnVzIDAwMDA6MDA6MWYuMzogZW5hYmxpbmcgZGV2aWNlICgwMDAxIC0+IDAwMDMpClsgICAgMy44 ODQxOTRdIEFDUEkgV2FybmluZzogU3lzdGVtSU8gcmFuZ2UgMHgwMDAwMDAwMDAwMDBGMDQwLTB4 MDAwMDAwMDAwMDAwRjA1RiBjb25mbGljdHMgd2l0aCBPcFJlZ2lvbiAweDAwMDAwMDAwMDAwMEYw NDAtMHgwMDAwMDAwMDAwMDBGMDRGIChcX1NCLlBDSTAuU0JVUy5TTUJJKSAoMjAxNjAxMDgvdXRh ZGRyZXNzLTI1NSkKWyAgICAzLjg4NDE5OF0gQUNQSTogSWYgYW4gQUNQSSBkcml2ZXIgaXMgYXZh aWxhYmxlIGZvciB0aGlzIGRldmljZSwgeW91IHNob3VsZCB1c2UgaXQgaW5zdGVhZCBvZiB0aGUg bmF0aXZlIGRyaXZlcgpbICAgIDMuOTEyNTExXSBzbmRfaGRhX2ludGVsIDAwMDA6MDA6MDMuMDog ZW5hYmxpbmcgZGV2aWNlICgwMDAwIC0+IDAwMDIpClsgICAgMy45MTI5MjVdIHNuZF9oZGFfaW50 ZWwgMDAwMDowMDowMy4wOiBib3VuZCAwMDAwOjAwOjAyLjAgKG9wcyBpOTE1X2F1ZGlvX2NvbXBv bmVudF9iaW5kX29wcyBbaTkxNV0pClsgICAgMy45MTM0NDVdIHNuZF9oZGFfaW50ZWwgMDAwMDow MDoxYi4wOiBlbmFibGluZyBkZXZpY2UgKDAwMDAgLT4gMDAwMikKWyAgICAzLjkxNDEwOV0gc25k X2hkYV9pbnRlbCAwMDAwOjA1OjAwLjA6IGVuYWJsaW5nIGRldmljZSAoMDAwMCAtPiAwMDAyKQpb ICAgIDMuOTE0MjAyXSBzbmRfaGRhX2ludGVsIDAwMDA6MDU6MDAuMDogRGlzYWJsaW5nIE1TSQpb ICAgIDMuOTE0MjA1XSBzbmRfaGRhX2ludGVsIDAwMDA6MDU6MDAuMDogRm9yY2UgdG8gbm9uLXNu b29wIG1vZGUKWyAgICAzLjk5MTU4N10gc25kX2hkYV9jb2RlY19jYTAxMzIgaGRhdWRpb0MyRDE6 IGF1dG9jb25maWcgZm9yIENBMDEzMjogbGluZV9vdXRzPTEgKDB4ZC8weDAvMHgwLzB4MC8weDAp IHR5cGU6c3BlYWtlcgpbICAgIDMuOTkxNTkyXSBzbmRfaGRhX2NvZGVjX2NhMDEzMiBoZGF1ZGlv QzJEMTogICAgc3BlYWtlcl9vdXRzPTAgKDB4MC8weDAvMHgwLzB4MC8weDApClsgICAgMy45OTE1 OTRdIHNuZF9oZGFfY29kZWNfY2EwMTMyIGhkYXVkaW9DMkQxOiAgICBocF9vdXRzPTAgKDB4MC8w eDAvMHgwLzB4MC8weDApClsgICAgMy45OTE1OTZdIHNuZF9oZGFfY29kZWNfY2EwMTMyIGhkYXVk aW9DMkQxOiAgICBtb25vOiBtb25vX291dD0weDAKWyAgICAzLjk5MTU5N10gc25kX2hkYV9jb2Rl Y19jYTAxMzIgaGRhdWRpb0MyRDE6ICAgIGlucHV0czoKWyAgICAzLjk5MTYwMF0gc25kX2hkYV9j b2RlY19jYTAxMzIgaGRhdWRpb0MyRDE6ICAgICAgTWljPTB4MTIKWyAgICAzLjk5MzQ4Nl0gaW5w dXQ6IExvZ2l0ZWNoIFQ0MDAgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjE0LjAvdXNi MS8xLTkvMS05LjEvMS05LjEuNi8xLTkuMS42OjEuMi8wMDAzOjA0NkQ6QzUyQi4wMDA1LzAwMDM6 MDQ2RDo0MDI2LjAwMDYvaW5wdXQvaW5wdXQxMQpbICAgIDMuOTk4MjI3XSBzbmRfaGRhX2ludGVs IDAwMDA6MDU6MDAuMDogRGlyZWN0IGZpcm13YXJlIGxvYWQgZm9yIGN0ZWZ4LmJpbiBmYWlsZWQg d2l0aCBlcnJvciAtMgpbICAgIDQuMDA4MzE3XSBpbnB1dDogSERBIEludGVsIEhETUkgSERNSS9E UCxwY209MyBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDMuMC9zb3VuZC9jYXJkMC9p bnB1dDgKWyAgICA0LjAxMDgxOF0gbG9naXRlY2gtaGlkcHAtZGV2aWNlIDAwMDM6MDQ2RDo0MDI2 LjAwMDY6IGlucHV0LGhpZHJhdzM6IFVTQiBISUQgdjEuMTEgS2V5Ym9hcmQgW0xvZ2l0ZWNoIFQ0 MDBdIG9uIHVzYi0wMDAwOjAwOjE0LjAtOS4xLjY6MQpbICAgIDQuMDIyOTQyXSBpbnB1dDogSERB IEludGVsIEhETUkgSERNSS9EUCxwY209NyBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6 MDMuMC9zb3VuZC9jYXJkMC9pbnB1dDkKWyAgICA0LjAzMTk3OV0gbW9kcHJvYmUgKDY2NikgdXNl ZCBncmVhdGVzdCBzdGFjayBkZXB0aDogMTAwODggYnl0ZXMgbGVmdApbICAgIDQuMDM0MDAwXSBp bnB1dDogSERBIEludGVsIEhETUkgSERNSS9EUCxwY209OCBhcyAvZGV2aWNlcy9wY2kwMDAwOjAw LzAwMDA6MDA6MDMuMC9zb3VuZC9jYXJkMC9pbnB1dDEwClsgICAgNC4wNTU1MzhdIHNuZF9oZGFf Y29kZWNfcmVhbHRlayBoZGF1ZGlvQzFEMjogYXV0b2NvbmZpZyBmb3IgQUxDODkyOiBsaW5lX291 dHM9NCAoMHgxNC8weDE1LzB4MTYvMHgxNy8weDApIHR5cGU6bGluZQpbICAgIDQuMDU1NTQyXSBz bmRfaGRhX2NvZGVjX3JlYWx0ZWsgaGRhdWRpb0MxRDI6ICAgIHNwZWFrZXJfb3V0cz0wICgweDAv MHgwLzB4MC8weDAvMHgwKQpbICAgIDQuMDU1NTQ1XSBzbmRfaGRhX2NvZGVjX3JlYWx0ZWsgaGRh dWRpb0MxRDI6ICAgIGhwX291dHM9MSAoMHgxYi8weDAvMHgwLzB4MC8weDApClsgICAgNC4wNTU1 NDddIHNuZF9oZGFfY29kZWNfcmVhbHRlayBoZGF1ZGlvQzFEMjogICAgbW9ubzogbW9ub19vdXQ9 MHgwClsgICAgNC4wNTU1NDhdIHNuZF9oZGFfY29kZWNfcmVhbHRlayBoZGF1ZGlvQzFEMjogICAg ZGlnLW91dD0weDExLzB4MApbICAgIDQuMDU1NTUwXSBzbmRfaGRhX2NvZGVjX3JlYWx0ZWsgaGRh dWRpb0MxRDI6ICAgIGlucHV0czoKWyAgICA0LjA1NTU1NV0gc25kX2hkYV9jb2RlY19yZWFsdGVr IGhkYXVkaW9DMUQyOiAgICAgIEZyb250IE1pYz0weDE5ClsgICAgNC4wNTU1NTldIHNuZF9oZGFf Y29kZWNfcmVhbHRlayBoZGF1ZGlvQzFEMjogICAgICBSZWFyIE1pYz0weDE4ClsgICAgNC4wNTU1 NjFdIHNuZF9oZGFfY29kZWNfcmVhbHRlayBoZGF1ZGlvQzFEMjogICAgICBMaW5lPTB4MWEKWyAg ICA0LjA2NTg0NV0gQmx1ZXRvb3RoOiBDb3JlIHZlciAyLjIxClsgICAgNC4wNzI4NjddIE5FVDog UmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMzEKWyAgICA0LjA3Mjg3MV0gQmx1ZXRvb3RoOiBI Q0kgZGV2aWNlIGFuZCBjb25uZWN0aW9uIG1hbmFnZXIgaW5pdGlhbGl6ZWQKWyAgICA0LjA3Mjkz NF0gQmx1ZXRvb3RoOiBIQ0kgc29ja2V0IGxheWVyIGluaXRpYWxpemVkClsgICAgNC4wNzI5NDBd IEJsdWV0b290aDogTDJDQVAgc29ja2V0IGxheWVyIGluaXRpYWxpemVkClsgICAgNC4wNzMwMTBd IEJsdWV0b290aDogU0NPIHNvY2tldCBsYXllciBpbml0aWFsaXplZApbICAgIDQuMTQ2ODk0XSB1 c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIGJ0dXNiClsgICAgNC4xNTY2 NTBdIHJhaWQ2OiBzc2UyeDEgICBnZW4oKSAgODgwNCBNQi9zClsgICAgNC4xNzM2NDddIHJhaWQ2 OiBzc2UyeDEgICB4b3IoKSAgNTI0MiBNQi9zClsgICAgNC4xODMxMTBdIEFkZGluZyA2MjQ5NDcx Nmsgc3dhcCBvbiAvZGV2L3NkYTIuICBQcmlvcml0eTotMSBleHRlbnRzOjEgYWNyb3NzOjYyNDk0 NzE2ayBTU0ZTClsgICAgNC4xOTA2NDVdIHJhaWQ2OiBzc2UyeDIgICBnZW4oKSAxMDQ2MCBNQi9z ClsgICAgNC4yMDc2NDZdIHJhaWQ2OiBzc2UyeDIgICB4b3IoKSAgNzY4MSBNQi9zClsgICAgNC4y MTc5NDZdIG1lZGlhOiBMaW51eCBtZWRpYSBpbnRlcmZhY2U6IHYwLjEwClsgICAgNC4yMjQ2NDRd IHJhaWQ2OiBzc2UyeDQgICBnZW4oKSAxMTE2MCBNQi9zClsgICAgNC4yMjYwMDddIGlucHV0OiBI REEgSW50ZWwgUENIIEZyb250IE1pYyBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MWIu MC9zb3VuZC9jYXJkMS9pbnB1dDEyClsgICAgNC4yMjY5MDhdIGlucHV0OiBIREEgSW50ZWwgUENI IFJlYXIgTWljIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDoxYi4wL3NvdW5kL2NhcmQx L2lucHV0MTMKWyAgICA0LjIzNjUxNl0gaW5wdXQ6IEhEQSBJbnRlbCBQQ0ggTGluZSBhcyAvZGV2 aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MWIuMC9zb3VuZC9jYXJkMS9pbnB1dDE0ClsgICAgNC4y Mzc3NDFdIExpbnV4IHZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlOiB2Mi4wMApbICAgIDQuMjQxNjQ4 XSByYWlkNjogc3NlMng0ICAgeG9yKCkgIDgzMDggTUIvcwpbICAgIDQuMjQyMTE5XSBzY3NpIDk6 MDowOjA6IERpcmVjdC1BY2Nlc3MgICAgICAgICAgICAgIHNpbGljb24tcG93ZXIgICAgUE1BUCBQ UTogMCBBTlNJOiAwIENDUwpbICAgIDQuMjUwMTc2XSBpbnB1dDogSERBIEludGVsIFBDSCBMaW5l IE91dCBGcm9udCBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MWIuMC9zb3VuZC9jYXJk MS9pbnB1dDE1ClsgICAgNC4yNTU2MDZdIGdzcGNhX21haW46IHYyLjE0LjAgcmVnaXN0ZXJlZApb ICAgIDQuMjU4NjQ1XSByYWlkNjogYXZ4MngxICAgZ2VuKCkgMTgxNzEgTUIvcwpbICAgIDQuMjU5 NjIxXSBzZCA5OjA6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2c2IHR5cGUgMApbICAgIDQu MjU5OTk3XSBzZCA5OjA6MDowOiBbc2RmXSAzOTA3NTg0IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tz OiAoMi4wMCBHQi8xLjg2IEdpQikKWyAgICA0LjI2MTcxN10gc2QgOTowOjA6MDogW3NkZl0gV3Jp dGUgUHJvdGVjdCBpcyBvZmYKWyAgICA0LjI2MTcyMV0gc2QgOTowOjA6MDogW3NkZl0gTW9kZSBT ZW5zZTogMjMgMDAgMDAgMDAKWyAgICA0LjI2MzQxNF0gc2QgOTowOjA6MDogW3NkZl0gTm8gQ2Fj aGluZyBtb2RlIHBhZ2UgZm91bmQKWyAgICA0LjI2MzQxN10gc2QgOTowOjA6MDogW3NkZl0gQXNz dW1pbmcgZHJpdmUgY2FjaGU6IHdyaXRlIHRocm91Z2gKWyAgICA0LjI2MzUwNF0gaW5wdXQ6IEhE QSBJbnRlbCBQQ0ggTGluZSBPdXQgU3Vycm91bmQgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAw OjAwOjFiLjAvc291bmQvY2FyZDEvaW5wdXQxNgpbICAgIDQuMjY2MDQ1XSBnc3BjYV9tYWluOiBn c3BjYV96YzN4eC0yLjE0LjAgcHJvYmluZyAwNDZkOjA4ZDkKWyAgICA0LjI2ODE2NF0gaW5wdXQ6 IEhEQSBJbnRlbCBQQ0ggTGluZSBPdXQgQ0xGRSBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6 MDA6MWIuMC9zb3VuZC9jYXJkMS9pbnB1dDE3ClsgICAgNC4yNjkwODFdIGlucHV0OiBIREEgSW50 ZWwgUENIIExpbmUgT3V0IFNpZGUgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjFiLjAv c291bmQvY2FyZDEvaW5wdXQxOApbICAgIDQuMjc0NDczXSAgc2RmOiBzZGYxClsgICAgNC4yNzU2 NDRdIHJhaWQ2OiBhdngyeDIgICBnZW4oKSAyNDA0NiBNQi9zClsgICAgNC4yNzc2MTVdIGlucHV0 OiBIREEgSW50ZWwgUENIIEZyb250IEhlYWRwaG9uZSBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAw MDA6MDA6MWIuMC9zb3VuZC9jYXJkMS9pbnB1dDE5ClsgICAgNC4yODIzMTJdIHNkIDk6MDowOjA6 IFtzZGZdIEF0dGFjaGVkIFNDU0kgcmVtb3ZhYmxlIGRpc2sKWyAgICA0LjI4NTEyOV0gdXNiY29y ZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBvcHRpb24KWyAgICA0LjI4NTY2OF0g dXNic2VyaWFsOiBVU0IgU2VyaWFsIHN1cHBvcnQgcmVnaXN0ZXJlZCBmb3IgR1NNIG1vZGVtICgx LXBvcnQpClsgICAgNC4yODU4MDFdIG9wdGlvbiAxLTkuMS4yOjEuMDogR1NNIG1vZGVtICgxLXBv cnQpIGNvbnZlcnRlciBkZXRlY3RlZApbICAgIDQuMjg3ODcyXSB1c2IgMS05LjEuMjogR1NNIG1v ZGVtICgxLXBvcnQpIGNvbnZlcnRlciBub3cgYXR0YWNoZWQgdG8gdHR5VVNCMApbICAgIDQuMjkw MDMwXSBvcHRpb24gMS05LjEuMjoxLjE6IEdTTSBtb2RlbSAoMS1wb3J0KSBjb252ZXJ0ZXIgZGV0 ZWN0ZWQKWyAgICA0LjI5MjY0MF0gcmFpZDY6IGF2eDJ4NCAgIGdlbigpIDIzMzI0IE1CL3MKWyAg ICA0LjI5MjY0M10gcmFpZDY6IHVzaW5nIGFsZ29yaXRobSBhdngyeDIgZ2VuKCkgMjQwNDYgTUIv cwpbICAgIDQuMjkyNjQ1XSByYWlkNjogdXNpbmcgYXZ4MngyIHJlY292ZXJ5IGFsZ29yaXRobQpb ICAgIDQuMjkzMzUxXSB1c2IgMS05LjEuMjogR1NNIG1vZGVtICgxLXBvcnQpIGNvbnZlcnRlciBu b3cgYXR0YWNoZWQgdG8gdHR5VVNCMQpbICAgIDQuMjkzODQzXSB1c2Jjb3JlOiByZWdpc3RlcmVk IG5ldyBpbnRlcmZhY2UgZHJpdmVyIGNkY19uY20KWyAgICA0LjI5NTA5Ml0geG9yOiBhdXRvbWF0 aWNhbGx5IHVzaW5nIGJlc3QgY2hlY2tzdW1taW5nIGZ1bmN0aW9uOgpbICAgIDQuMzAxOTQ3XSB1 c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIGNkY193ZG0KWyAgICA0LjMw NDYzOF0gICAgYXZ4ICAgICAgIDogMzQ3MjguMDAwIE1CL3NlYwpbICAgIDQuMzIzNDI4XSBpbnRl bF9yYXBsOiBGb3VuZCBSQVBMIGRvbWFpbiBwYWNrYWdlClsgICAgNC4zMjM0MzJdIGludGVsX3Jh cGw6IEZvdW5kIFJBUEwgZG9tYWluIGNvcmUKWyAgICA0LjMyMzQzNF0gaW50ZWxfcmFwbDogRm91 bmQgUkFQTCBkb21haW4gdW5jb3JlClsgICAgNC4zMjM0MzZdIGludGVsX3JhcGw6IEZvdW5kIFJB UEwgZG9tYWluIGRyYW0KWyAgICA0LjM4MDY0NF0gQnRyZnMgbG9hZGVkClsgICAgNC4zODI3NjVd IEJUUkZTOiBkZXZpY2UgZnNpZCBhMjJkZDhiYy0yNGVmLTRmOTctYmI2Mi0wMWZjZDdjM2YxMWMg ZGV2aWQgMSB0cmFuc2lkIDI5IC9kZXYvc2RhNApbICAgIDQuNDA0MjM4XSBCVFJGUzogZGV2aWNl IGxhYmVsIGhvbWUgZGV2aWQgMSB0cmFuc2lkIDIzMzM0NTMgL2Rldi9zZGMxClsgICAgNC40MjIx MTBdIGh1YXdlaV9jZGNfbmNtIDEtOS4xLjI6MS4yOiBNQUMtQWRkcmVzczogMDA6MWU6MTA6MWY6 MDA6MDAKWyAgICA0LjQyMjExNF0gaHVhd2VpX2NkY19uY20gMS05LjEuMjoxLjI6IHNldHRpbmcg cnhfbWF4ID0gMTYzODQKWyAgICA0LjQyOTMxOV0gaHVhd2VpX2NkY19uY20gMS05LjEuMjoxLjI6 IE5EUCB3aWxsIGJlIHBsYWNlZCBhdCBlbmQgb2YgZnJhbWUgZm9yIHRoaXMgZGV2aWNlLgpbICAg IDQuNDMxMjA0XSBodWF3ZWlfY2RjX25jbSAxLTkuMS4yOjEuMjogY2RjLXdkbTA6IFVTQiBXRE0g ZGV2aWNlClsgICAgNC40Mzg2NzJdIHBwZGV2OiB1c2VyLXNwYWNlIHBhcmFsbGVsIHBvcnQgZHJp dmVyClsgICAgNC40Mzk4NTJdIGh1YXdlaV9jZGNfbmNtIDEtOS4xLjI6MS4yIHd3YW4wOiByZWdp c3RlciAnaHVhd2VpX2NkY19uY20nIGF0IHVzYi0wMDAwOjAwOjE0LjAtOS4xLjIsIEh1YXdlaSBD REMgTkNNIGRldmljZSwgMDA6MWU6MTA6MWY6MDA6MDAKWyAgICA0LjQzOTkwM10gdXNiY29yZTog cmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBodWF3ZWlfY2RjX25jbQpbICAgIDQuNDgz MzI3XSBpVENPX3ZlbmRvcl9zdXBwb3J0OiB2ZW5kb3Itc3VwcG9ydD0wClsgICAgNC40ODgyOTBd IGlUQ09fd2R0OiBJbnRlbCBUQ08gV2F0Y2hEb2cgVGltZXIgRHJpdmVyIHYxLjExClsgICAgNC40 ODg5MTNdIGlUQ09fd2R0OiB1bmFibGUgdG8gcmVzZXQgTk9fUkVCT09UIGZsYWcsIGRldmljZSBk aXNhYmxlZCBieSBoYXJkd2FyZS9CSU9TClsgICAgNC41NDY1NjNdIEJ1ZmZlciBJL08gZXJyb3Ig b24gZGV2IHNyMCwgbG9naWNhbCBibG9jayAxNzk4NCwgYXN5bmMgcGFnZSByZWFkClsgICAgNC41 NTk1MTRdIEJ1ZmZlciBJL08gZXJyb3Igb24gZGV2IHNyMCwgbG9naWNhbCBibG9jayAxODE3Mywg YXN5bmMgcGFnZSByZWFkClsgICAgNC42Nzk0NTddIGh1YXdlaV9jZGNfbmNtIDEtOS4xLjI6MS4y IHd3cDBzMjB1OXUxdTJpMjogcmVuYW1lZCBmcm9tIHd3YW4wClsgICAgNS4xMjU0NDddIGlucHV0 OiBnc3BjYV96YzN4eCBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MTQuMC91c2IxLzEt OS8xLTkuMS8xLTkuMS4xL2lucHV0L2lucHV0MjAKWyAgICA1LjEyNjQ4MV0gdXNiY29yZTogcmVn aXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBnc3BjYV96YzN4eApbICAgIDUuMTQ1Nzc2XSB1 c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIHNuZC11c2ItYXVkaW8KWyAg ICA1LjQ3ODYyNl0gU0dJIFhGUyB3aXRoIEFDTHMsIHNlY3VyaXR5IGF0dHJpYnV0ZXMsIG5vIGRl YnVnIGVuYWJsZWQKWyAgICA1LjUwOTYxMl0gWEZTIChzZGIpOiBNb3VudGluZyBWNSBGaWxlc3lz dGVtClsgICAgNS42Mzg1MzNdIFhGUyAoc2RiKTogRW5kaW5nIGNsZWFuIG1vdW50ClsgICAgNS45 NTI2NjNdIEJsdWV0b290aDogQk5FUCAoRXRoZXJuZXQgRW11bGF0aW9uKSB2ZXIgMS4zClsgICAg NS45NTI2NjZdIEJsdWV0b290aDogQk5FUCBmaWx0ZXJzOiBwcm90b2NvbCBtdWx0aWNhc3QKWyAg ICA1Ljk1MjY3M10gQmx1ZXRvb3RoOiBCTkVQIHNvY2tldCBsYXllciBpbml0aWFsaXplZApbICAg IDYuNDM1MjIxXSBpcDZfdGFibGVzOiAoQykgMjAwMC0yMDA2IE5ldGZpbHRlciBDb3JlIFRlYW0K WyAgICA2LjQ2Nzk3OV0gRWJ0YWJsZXMgdjIuMCByZWdpc3RlcmVkClsgICAgNi40ODYyMzhdIG5m X2Nvbm50cmFjayB2ZXJzaW9uIDAuNS4wICg2NTUzNiBidWNrZXRzLCAyNjIxNDQgbWF4KQpbICAg IDYuNjAyNDc1XSBicmlkZ2U6IGF1dG9tYXRpYyBmaWx0ZXJpbmcgdmlhIGFycC9pcC9pcDZ0YWJs ZXMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXBkYXRlIHlvdXIgc2NyaXB0cyB0byBsb2FkIGJyX25l dGZpbHRlciBpZiB5b3UgbmVlZCB0aGlzLgpbICAgIDYuNjI4MDY3XSBJUHY2OiBBRERSQ09ORihO RVRERVZfVVApOiBlbnAyczA6IGxpbmsgaXMgbm90IHJlYWR5ClsgICAgNi42MzUzNDNdIE5ldGZp bHRlciBtZXNzYWdlcyB2aWEgTkVUTElOSyB2MC4zMC4KWyAgICA2LjY0MTMzNl0gaXBfc2V0OiBw cm90b2NvbCA2ClsgICAgNi43NDI2NjldIHI4MTY5IDAwMDA6MDI6MDAuMCBlbnAyczA6IGxpbmsg ZG93bgpbICAgIDYuNzQyNzM0XSBJUHY2OiBBRERSQ09ORihORVRERVZfVVApOiBlbnAyczA6IGxp bmsgaXMgbm90IHJlYWR5ClsgICAgNi43NDM5NDJdIHI4MTY5IDAwMDA6MDI6MDAuMCBlbnAyczA6 IGxpbmsgZG93bgpbICAgIDkuMDUwMjM5XSByODE2OSAwMDAwOjAyOjAwLjAgZW5wMnMwOiBsaW5r IHVwClsgICAgOS4wNTAyNTNdIElQdjY6IEFERFJDT05GKE5FVERFVl9DSEFOR0UpOiBlbnAyczA6 IGxpbmsgYmVjb21lcyByZWFkeQpbICAgMTkuMTAzOTEyXSBmdXNlIGluaXQgKEFQSSB2ZXJzaW9u IDcuMjQpClsgICAyMS43NjE5MzhdIEJsdWV0b290aDogUkZDT01NIFRUWSBsYXllciBpbml0aWFs aXplZApbICAgMjEuNzYxOTQ5XSBCbHVldG9vdGg6IFJGQ09NTSBzb2NrZXQgbGF5ZXIgaW5pdGlh bGl6ZWQKWyAgIDIxLjc2MjAwMl0gQmx1ZXRvb3RoOiBSRkNPTU0gdmVyIDEuMTEKWyAgIDI4LjU5 OTY0NF0gRkFULWZzIChzZGYxKTogVm9sdW1lIHdhcyBub3QgcHJvcGVybHkgdW5tb3VudGVkLiBT b21lIGRhdGEgbWF5IGJlIGNvcnJ1cHQuIFBsZWFzZSBydW4gZnNjay4KWyAgIDI4LjYyMzQ4MV0g SVNPIDk2NjAgRXh0ZW5zaW9uczogTWljcm9zb2Z0IEpvbGlldCBMZXZlbCAzClsgICAyOC42Mjk4 MjRdIElTTyA5NjYwIEV4dGVuc2lvbnM6IFJSSVBfMTk5MUEKWyAgIDI4LjYzNTU4OF0gSVNPIDk2 NjAgRXh0ZW5zaW9uczogTWljcm9zb2Z0IEpvbGlldCBMZXZlbCAxClsgICAyOC42MzU4ODFdIElT TyA5NjYwIEV4dGVuc2lvbnM6IElFRUVfUDEyODIKWyAgIDM3LjUxNjM3MV0gdHVuOiBVbml2ZXJz YWwgVFVOL1RBUCBkZXZpY2UgZHJpdmVyLCAxLjYKWyAgIDM3LjUxNjM3NV0gdHVuOiAoQykgMTk5 OS0yMDA0IE1heCBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+ClsgICAzNy41NjkzMDJd IHZpcmJyMDogcG9ydCAxKHZpcmJyMC1uaWMpIGVudGVyZWQgYmxvY2tpbmcgc3RhdGUKWyAgIDM3 LjU2OTMwNl0gdmlyYnIwOiBwb3J0IDEodmlyYnIwLW5pYykgZW50ZXJlZCBkaXNhYmxlZCBzdGF0 ZQpbICAgMzcuNTY5NDI5XSBkZXZpY2UgdmlyYnIwLW5pYyBlbnRlcmVkIHByb21pc2N1b3VzIG1v ZGUKWyAgIDM3Ljc0MTEwMl0gdmlyYnIwOiBwb3J0IDEodmlyYnIwLW5pYykgZW50ZXJlZCBibG9j a2luZyBzdGF0ZQpbICAgMzcuNzQxMTA3XSB2aXJicjA6IHBvcnQgMSh2aXJicjAtbmljKSBlbnRl cmVkIGxpc3RlbmluZyBzdGF0ZQpbICAgMzcuODAyMDA3XSB2aXJicjA6IHBvcnQgMSh2aXJicjAt bmljKSBlbnRlcmVkIGRpc2FibGVkIHN0YXRlClsgICAzNy44MjI4MzhdIGRldmljZSB2aXJicjAt bmljIGxlZnQgcHJvbWlzY3VvdXMgbW9kZQpbICAgMzcuODIyODkyXSB2aXJicjA6IHBvcnQgMSh2 aXJicjAtbmljKSBlbnRlcmVkIGRpc2FibGVkIHN0YXRlClsgICA2NS41NDkyOTFdIERNQS1BUEk6 IGRlYnVnZ2luZyBvdXQgb2YgbWVtb3J5IC0gZGlzYWJsaW5nClsgIDQ5NC40MDc3ODRdIGt3b3Jr ZXIvZHlpbmcgKDE0OSkgdXNlZCBncmVhdGVzdCBzdGFjayBkZXB0aDogOTQ4MCBieXRlcyBsZWZ0 ClsgMTE0MC44OTIwMjZdIHBlcmY6IGludGVycnVwdCB0b29rIHRvbyBsb25nICgyNTA4ID4gMjUw MCksIGxvd2VyaW5nIGtlcm5lbC5wZXJmX2V2ZW50X21heF9zYW1wbGVfcmF0ZSB0byA3OTAwMApb IDE2NzguODE2NzExXSBwZXJmOiBpbnRlcnJ1cHQgdG9vayB0b28gbG9uZyAoMzE1MyA+IDMxMzUp LCBsb3dlcmluZyBrZXJuZWwucGVyZl9ldmVudF9tYXhfc2FtcGxlX3JhdGUgdG8gNjMwMDAKWyAy NTE5LjI2NTEyNl0ga3dvcmtlci9keWluZyAoMTAwNzUpIHVzZWQgZ3JlYXRlc3Qgc3RhY2sgZGVw dGg6IDkyNjQgYnl0ZXMgbGVmdApbIDI3NTUuMDU3NDY1XSBwZXJmOiBpbnRlcnJ1cHQgdG9vayB0 b28gbG9uZyAoNDAzOSA+IDM5NDEpLCBsb3dlcmluZyBrZXJuZWwucGVyZl9ldmVudF9tYXhfc2Ft cGxlX3JhdGUgdG8gNDkwMDAKWyAzNzgxLjc5NjMzOF0ga3dvcmtlci9keWluZyAoMTU0MzIpIHVz ZWQgZ3JlYXRlc3Qgc3RhY2sgZGVwdGg6IDkwMjQgYnl0ZXMgbGVmdApbIDQ0MTIuMDE4MTA0XSBw ZXJmOiBpbnRlcnJ1cHQgdG9vayB0b28gbG9uZyAoNTA1MiA+IDUwNDgpLCBsb3dlcmluZyBrZXJu ZWwucGVyZl9ldmVudF9tYXhfc2FtcGxlX3JhdGUgdG8gMzkwMDAKWyA1NDQ1LjUxMzg4MV0gbmZf Y29ubnRyYWNrOiBhdXRvbWF0aWMgaGVscGVyIGFzc2lnbm1lbnQgaXMgZGVwcmVjYXRlZCBhbmQg aXQgd2lsbCBiZSByZW1vdmVkIHNvb24uIFVzZSB0aGUgaXB0YWJsZXMgQ1QgdGFyZ2V0IHRvIGF0 dGFjaCBoZWxwZXJzIGluc3RlYWQuCgpbIDczMjIuNTAyNTE1XSA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KWyA3MzIyLjUwMjUxN10gWyBJTkZP OiBwb3NzaWJsZSBjaXJjdWxhciBsb2NraW5nIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgXQpbIDczMjIu NTAyNTE5XSA0LjYuNi0zMDAuZmMyNC54ODZfNjQrZGVidWcgIzEgTm90IHRhaW50ZWQKWyA3MzIy LjUwMjUyMF0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQpbIDczMjIuNTAyNTIxXSBET00gV29ya2VyLzIzNjYzIGlzIHRyeWluZyB0byBhY3F1 aXJlIGxvY2s6ClsgNzMyMi41MDI1MjJdICAoJnNiLT5zX3R5cGUtPmlfbXV0ZXhfa2V5IzIwKXsr LisuKy59LCBhdDogWzxmZmZmZmZmZmMwYjZkYzhkPl0geGZzX2ZpbGVfYnVmZmVyZWRfYWlvX3dy aXRlKzB4NmQvMHgzNTAgW3hmc10KWyA3MzIyLjUwMjYxM10gCiAgICAgICAgICAgICAgIGJ1dCB0 YXNrIGlzIGFscmVhZHkgaG9sZGluZyBsb2NrOgpbIDczMjIuNTAyNjE0XSAgKCZwaXBlLT5tdXRl eC8xKXsrLisuKy59LCBhdDogWzxmZmZmZmZmZjgxMmExNjFlPl0gcGlwZV9sb2NrKzB4MWUvMHgy MApbIDczMjIuNTAyNjIyXSAKICAgICAgICAgICAgICAgd2hpY2ggbG9jayBhbHJlYWR5IGRlcGVu ZHMgb24gdGhlIG5ldyBsb2NrLgoKWyA3MzIyLjUwMjYyNV0gCiAgICAgICAgICAgICAgIHRoZSBl eGlzdGluZyBkZXBlbmRlbmN5IGNoYWluIChpbiByZXZlcnNlIG9yZGVyKSBpczoKWyA3MzIyLjUw MjYyNl0gCiAgICAgICAgICAgICAgIC0+ICMyICgmcGlwZS0+bXV0ZXgvMSl7Ky4rLisufToKWyA3 MzIyLjUwMjYzMV0gICAgICAgIFs8ZmZmZmZmZmY4MTExM2FiZT5dIGxvY2tfYWNxdWlyZSsweGZl LzB4MWYwClsgNzMyMi41MDI2MzZdICAgICAgICBbPGZmZmZmZmZmODE4Y2QwOTY+XSBtdXRleF9s b2NrX25lc3RlZCsweDg2LzB4NDAwClsgNzMyMi41MDI2NDFdICAgICAgICBbPGZmZmZmZmZmODEy YTE2MWU+XSBwaXBlX2xvY2srMHgxZS8weDIwClsgNzMyMi41MDI2NDRdICAgICAgICBbPGZmZmZm ZmZmODEyZDE0MDA+XSBzcGxpY2VfdG9fcGlwZSsweDQwLzB4MjYwClsgNzMyMi41MDI2NTBdICAg ICAgICBbPGZmZmZmZmZmODEyZDJkZDM+XSBfX2dlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCsweDYz My8weDcxMApbIDczMjIuNTAyNjUzXSAgICAgICAgWzxmZmZmZmZmZjgxMmQzMjg1Pl0gZ2VuZXJp Y19maWxlX3NwbGljZV9yZWFkKzB4NDUvMHg5MApbIDczMjIuNTAyNjU2XSAgICAgICAgWzxmZmZm ZmZmZmMwYjZiM2ZjPl0geGZzX2ZpbGVfc3BsaWNlX3JlYWQrMHgxMWMvMHgyYTAgW3hmc10KWyA3 MzIyLjUwMjcyNV0gICAgICAgIFs8ZmZmZmZmZmY4MTJkMTc3OT5dIGRvX3NwbGljZV90bysweDc5 LzB4OTAKWyA3MzIyLjUwMjcyOF0gICAgICAgIFs8ZmZmZmZmZmY4MTJkNDExND5dIFN5U19zcGxp Y2UrMHg3ZjQvMHg4MzAKWyA3MzIyLjUwMjczMV0gICAgICAgIFs8ZmZmZmZmZmY4MThkMDk3Yz5d IGVudHJ5X1NZU0NBTExfNjRfZmFzdHBhdGgrMHgxZi8weGJkClsgNzMyMi41MDI3MzVdIAogICAg ICAgICAgICAgICAtPiAjMSAoJigmaXAtPmlfaW9sb2NrKS0+bXJfbG9jayl7KysrKysrfToKWyA3 MzIyLjUwMjczOF0gICAgICAgIFs8ZmZmZmZmZmY4MTExM2FiZT5dIGxvY2tfYWNxdWlyZSsweGZl LzB4MWYwClsgNzMyMi41MDI3NDFdICAgICAgICBbPGZmZmZmZmZmODExMGMwZWU+XSBkb3duX3dy aXRlX25lc3RlZCsweDVlLzB4YzAKWyA3MzIyLjUwMjc0NF0gICAgICAgIFs8ZmZmZmZmZmZjMGI3 YzNjNT5dIHhmc19pbG9jaysweDIxNS8weDJjMCBbeGZzXQpbIDczMjIuNTAyNzkyXSAgICAgICAg WzxmZmZmZmZmZmMwYjZkYzlhPl0geGZzX2ZpbGVfYnVmZmVyZWRfYWlvX3dyaXRlKzB4N2EvMHgz NTAgW3hmc10KWyA3MzIyLjUwMjgyM10gICAgICAgIFs8ZmZmZmZmZmZjMGI2ZTBiMT5dIHhmc19m aWxlX3dyaXRlX2l0ZXIrMHgxNDEvMHgxNjAgW3hmc10KWyA3MzIyLjUwMjg1MF0gICAgICAgIFs8 ZmZmZmZmZmY4MTI5N2JkZT5dIF9fdmZzX3dyaXRlKzB4Y2UvMHgxMjAKWyA3MzIyLjUwMjg1M10g ICAgICAgIFs8ZmZmZmZmZmY4MTI5ODQ5NT5dIHZmc193cml0ZSsweGE1LzB4MTkwClsgNzMyMi41 MDI4NTVdICAgICAgICBbPGZmZmZmZmZmODEyOTk5Njg+XSBTeVNfd3JpdGUrMHg1OC8weGQwClsg NzMyMi41MDI4NTddICAgICAgICBbPGZmZmZmZmZmODE4ZDA5N2M+XSBlbnRyeV9TWVNDQUxMXzY0 X2Zhc3RwYXRoKzB4MWYvMHhiZApbIDczMjIuNTAyODYwXSAKICAgICAgICAgICAgICAgLT4gIzAg KCZzYi0+c190eXBlLT5pX211dGV4X2tleSMyMCl7Ky4rLisufToKWyA3MzIyLjUwMjg2NF0gICAg ICAgIFs8ZmZmZmZmZmY4MTExMmY1NT5dIF9fbG9ja19hY3F1aXJlKzB4MTc3NS8weDE4ZTAKWyA3 MzIyLjUwMjg2OF0gICAgICAgIFs8ZmZmZmZmZmY4MTExM2FiZT5dIGxvY2tfYWNxdWlyZSsweGZl LzB4MWYwClsgNzMyMi41MDI4NzBdICAgICAgICBbPGZmZmZmZmZmODE4Y2QwOTY+XSBtdXRleF9s b2NrX25lc3RlZCsweDg2LzB4NDAwClsgNzMyMi41MDI4NzNdICAgICAgICBbPGZmZmZmZmZmYzBi NmRjOGQ+XSB4ZnNfZmlsZV9idWZmZXJlZF9haW9fd3JpdGUrMHg2ZC8weDM1MCBbeGZzXQpbIDcz MjIuNTAyOTAwXSAgICAgICAgWzxmZmZmZmZmZmMwYjZlMGIxPl0geGZzX2ZpbGVfd3JpdGVfaXRl cisweDE0MS8weDE2MCBbeGZzXQpbIDczMjIuNTAyOTIzXSAgICAgICAgWzxmZmZmZmZmZjgxMjk3 OWViPl0gdmZzX2l0ZXJfd3JpdGUrMHg3Yi8weGQwClsgNzMyMi41MDI5MjZdICAgICAgICBbPGZm ZmZmZmZmODEyZDIzMDA+XSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlKzB4MjcwLzB4M2MwClsgNzMy Mi41MDI5MjldICAgICAgICBbPGZmZmZmZmZmODEyZDNjODk+XSBTeVNfc3BsaWNlKzB4MzY5LzB4 ODMwClsgNzMyMi41MDI5MzFdICAgICAgICBbPGZmZmZmZmZmODE4ZDA5N2M+XSBlbnRyeV9TWVND QUxMXzY0X2Zhc3RwYXRoKzB4MWYvMHhiZApbIDczMjIuNTAyOTM0XSAKICAgICAgICAgICAgICAg b3RoZXIgaW5mbyB0aGF0IG1pZ2h0IGhlbHAgdXMgZGVidWcgdGhpczoKClsgNzMyMi41MDI5MzZd IENoYWluIGV4aXN0cyBvZjoKICAgICAgICAgICAgICAgICAmc2ItPnNfdHlwZS0+aV9tdXRleF9r ZXkjMjAgLS0+ICYoJmlwLT5pX2lvbG9jayktPm1yX2xvY2sgLS0+ICZwaXBlLT5tdXRleC8xCgpb IDczMjIuNTAyOTQxXSAgUG9zc2libGUgdW5zYWZlIGxvY2tpbmcgc2NlbmFyaW86CgpbIDczMjIu NTAyOTQzXSAgICAgICAgQ1BVMCAgICAgICAgICAgICAgICAgICAgQ1BVMQpbIDczMjIuNTAyOTQ0 XSAgICAgICAgLS0tLSAgICAgICAgICAgICAgICAgICAgLS0tLQpbIDczMjIuNTAyOTQ1XSAgIGxv Y2soJnBpcGUtPm11dGV4LzEpOwpbIDczMjIuNTAyOTQ4XSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbG9jaygmKCZpcC0+aV9pb2xvY2spLT5tcl9sb2NrKTsKWyA3MzIyLjUwMjk0OV0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2soJnBpcGUtPm11dGV4LzEpOwpbIDcz MjIuNTAyOTUyXSAgIGxvY2soJnNiLT5zX3R5cGUtPmlfbXV0ZXhfa2V5IzIwKTsKWyA3MzIyLjUw Mjk1NF0gCiAgICAgICAgICAgICAgICAqKiogREVBRExPQ0sgKioqCgpbIDczMjIuNTAyOTU3XSAy IGxvY2tzIGhlbGQgYnkgRE9NIFdvcmtlci8yMzY2MzoKWyA3MzIyLjUwMjk1OF0gICMwOiAgKHNi X3dyaXRlcnMjMTYpey4rLisuK30sIGF0OiBbPGZmZmZmZmZmODEyOWI5ZjQ+XSBfX3NiX3N0YXJ0 X3dyaXRlKzB4YjQvMHhmMApbIDczMjIuNTAyOTYzXSAgIzE6ICAoJnBpcGUtPm11dGV4LzEpeysu Ky4rLn0sIGF0OiBbPGZmZmZmZmZmODEyYTE2MWU+XSBwaXBlX2xvY2srMHgxZS8weDIwClsgNzMy Mi41MDI5NjhdIAogICAgICAgICAgICAgICBzdGFjayBiYWNrdHJhY2U6ClsgNzMyMi41MDI5NzFd IENQVTogMSBQSUQ6IDIzNjYzIENvbW06IERPTSBXb3JrZXIgTm90IHRhaW50ZWQgNC42LjYtMzAw LmZjMjQueDg2XzY0K2RlYnVnICMxClsgNzMyMi41MDI5NzNdIEhhcmR3YXJlIG5hbWU6IEdpZ2Fi eXRlIFRlY2hub2xvZ3kgQ28uLCBMdGQuIFo4N00tRDNIL1o4N00tRDNILCBCSU9TIEYxMSAwOC8x Mi8yMDE0ClsgNzMyMi41MDI5NzRdICAwMDAwMDAwMDAwMDAwMDg2IDAwMDAwMDAwZjgwMDA4MWEg ZmZmZjg4MDA5NWYwYmE5MCBmZmZmZmZmZjgxNDU4Y2I1ClsgNzMyMi41MDI5NzhdICBmZmZmZmZm ZjgyYjBlOWEwIGZmZmZmZmZmODJiMWE1OTAgZmZmZjg4MDA5NWYwYmFkMCBmZmZmZmZmZjgxMTBm ZjRlClsgNzMyMi41MDI5ODFdICAwMDAwMDAwMDAwMDAwMDAyIGZmZmY4ODA3ZGQ5OTQwMDAgMDAw MDAwMDAwMDAwMDAwMiBmZmZmODgwN2RkOTk0OTU4ClsgNzMyMi41MDI5ODRdIENhbGwgVHJhY2U6 ClsgNzMyMi41MDI5ODhdICBbPGZmZmZmZmZmODE0NThjYjU+XSBkdW1wX3N0YWNrKzB4ODYvMHhj MQpbIDczMjIuNTAyOTkyXSAgWzxmZmZmZmZmZjgxMTBmZjRlPl0gcHJpbnRfY2lyY3VsYXJfYnVn KzB4MWJlLzB4MjEwClsgNzMyMi41MDI5OTRdICBbPGZmZmZmZmZmODExMTJmNTU+XSBfX2xvY2tf YWNxdWlyZSsweDE3NzUvMHgxOGUwClsgNzMyMi41MDI5OTddICBbPGZmZmZmZmZmODExMTNhYmU+ XSBsb2NrX2FjcXVpcmUrMHhmZS8weDFmMApbIDczMjIuNTAzMDIxXSAgWzxmZmZmZmZmZmMwYjZk YzhkPl0gPyB4ZnNfZmlsZV9idWZmZXJlZF9haW9fd3JpdGUrMHg2ZC8weDM1MCBbeGZzXQpbIDcz MjIuNTAzMDI1XSAgWzxmZmZmZmZmZjgxOGNkMDk2Pl0gbXV0ZXhfbG9ja19uZXN0ZWQrMHg4Ni8w eDQwMApbIDczMjIuNTAzMDQ5XSAgWzxmZmZmZmZmZmMwYjZkYzhkPl0gPyB4ZnNfZmlsZV9idWZm ZXJlZF9haW9fd3JpdGUrMHg2ZC8weDM1MCBbeGZzXQpbIDczMjIuNTAzMDcxXSAgWzxmZmZmZmZm ZmMwYjZkYzhkPl0gPyB4ZnNfZmlsZV9idWZmZXJlZF9haW9fd3JpdGUrMHg2ZC8weDM1MCBbeGZz XQpbIDczMjIuNTAzMDkyXSAgWzxmZmZmZmZmZmMwYjZkYzhkPl0geGZzX2ZpbGVfYnVmZmVyZWRf YWlvX3dyaXRlKzB4NmQvMHgzNTAgW3hmc10KWyA3MzIyLjUwMzA5NV0gIFs8ZmZmZmZmZmY4MTEx MTJhNj5dID8gbWFya19oZWxkX2xvY2tzKzB4NzYvMHhhMApbIDczMjIuNTAzMDk5XSAgWzxmZmZm ZmZmZjgxOGNkMjk4Pl0gPyBtdXRleF9sb2NrX25lc3RlZCsweDI4OC8weDQwMApbIDczMjIuNTAz MTAyXSAgWzxmZmZmZmZmZjgxMTExM2M1Pl0gPyB0cmFjZV9oYXJkaXJxc19vbl9jYWxsZXIrMHhm NS8weDFiMApbIDczMjIuNTAzMTIyXSAgWzxmZmZmZmZmZmMwYjZlMGIxPl0geGZzX2ZpbGVfd3Jp dGVfaXRlcisweDE0MS8weDE2MCBbeGZzXQpbIDczMjIuNTAzMTI1XSAgWzxmZmZmZmZmZjgxMjk3 OWViPl0gdmZzX2l0ZXJfd3JpdGUrMHg3Yi8weGQwClsgNzMyMi41MDMxMjhdICBbPGZmZmZmZmZm ODEyZDIzMDA+XSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlKzB4MjcwLzB4M2MwClsgNzMyMi41MDMx MzFdICBbPGZmZmZmZmZmODEyZDNjODk+XSBTeVNfc3BsaWNlKzB4MzY5LzB4ODMwClsgNzMyMi41 MDMxMzRdICBbPGZmZmZmZmZmODExMTEzYzU+XSA/IHRyYWNlX2hhcmRpcnFzX29uX2NhbGxlcisw eGY1LzB4MWIwClsgNzMyMi41MDMxMzZdICBbPGZmZmZmZmZmODE4ZDA5N2M+XSBlbnRyeV9TWVND QUxMXzY0X2Zhc3RwYXRoKzB4MWYvMHhiZApbMTMwNDQuNTA2MzA3XSBwZXJmOiBpbnRlcnJ1cHQg dG9vayB0b28gbG9uZyAoNjMzMCA+IDYzMTUpLCBsb3dlcmluZyBrZXJuZWwucGVyZl9ldmVudF9t YXhfc2FtcGxlX3JhdGUgdG8gMzEwMDAKWzIwOTE4LjMzMDc0OF0ga3dvcmtlci9keWluZyAoNjYx MCkgdXNlZCBncmVhdGVzdCBzdGFjayBkZXB0aDogODgzMiBieXRlcyBsZWZ0ClsyNjcyMy44MDM3 ODZdIEJUUkZTIGluZm8gKGRldmljZSBzZGMxKTogZGlzayBzcGFjZSBjYWNoaW5nIGlzIGVuYWJs ZWQK --=-xbKT3wimAG4m2o36PZ3q-- From tdm@sgi.com Thu Aug 18 14:51:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C78A97CA0 for ; Thu, 18 Aug 2016 14:51:57 -0500 (CDT) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay3.corp.sgi.com (Postfix) with ESMTP id 23573AC002; Thu, 18 Aug 2016 12:51:57 -0700 (PDT) Received: from P-EXMB4-DC21.corp.sgi.com ([169.254.6.189]) by PV-EXCAS1-DC21.corp.sgi.com ([137.38.106.7]) with mapi id 14.03.0224.002; Thu, 18 Aug 2016 14:51:56 -0500 From: Troy McCorkell To: Christoph Hellwig , "xfs@oss.sgi.com" Subject: RE: dropping IRIX support in xfsprogs Thread-Topic: dropping IRIX support in xfsprogs Thread-Index: AQHR+XijJuKNcVh31UKFO6gALByNlaBPH15W Date: Thu, 18 Aug 2016 19:51:55 +0000 Message-ID: References: <20160818174742.GA14464@infradead.org> In-Reply-To: <20160818174742.GA14464@infradead.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [128.162.233.129] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 =0A= Christoph,=0A= =0A= No objections from SGI about removing IRIX support from xfsprogs.=0A= =0A= Thanks,=0A= Troy McCorkell=0A= =0A= =0A= ________________________________________=0A= From: xfs-bounces@oss.sgi.com [xfs-bounces@oss.sgi.com] on behalf of Christ= oph Hellwig [hch@infradead.org]=0A= Sent: Thursday, August 18, 2016 12:47 PM=0A= To: xfs@oss.sgi.com=0A= Subject: RFC: dropping IRIX support in xfsprogs=0A= =0A= Hi all,=0A= =0A= I'd like to know if anyone would complain about removing IRIX support=0A= in xfsprogs? It very much looks unmaintained for years, and due to=0A= the IRIX differences in type defintions and kernel interfaces it's=0A= actually a bit of a drag on xfsprogs, so unlike the other ports=0A= to FreeBSD and Darwin it would actually be really helpful to remove=0A= it.=0A= =0A= I'd volunteer to prepare patches to remove the IRIX support and do=0A= the resulting cleanups.=0A= =0A= _______________________________________________=0A= xfs mailing list=0A= xfs@oss.sgi.com=0A= http://oss.sgi.com/mailman/listinfo/xfs=0A= From david@fromorbit.com Thu Aug 18 15:59:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 55A397CA0 for ; Thu, 18 Aug 2016 15:59:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 160B2304039 for ; Thu, 18 Aug 2016 13:59:20 -0700 (PDT) X-ASG-Debug-ID: 1471553957-0bf8155c74437a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id QJG6FH9LeIXSld8t for ; Thu, 18 Aug 2016 13:59:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgoXACohtld5LDUCEGdsb2JhbABdg0OBUoZym1wBAQEBAQEGjG6GE4QMhhcEAgKBcU0CAQEBAQECBgEBAQEBAQEBN0CEXwEFOhwjEAgDDgoJJQ8FJQMHGhOIML1WAQEIAiUehUSFFYobBZlEjxSPU4w7g3iEYCoyhy0BAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 19 Aug 2016 06:29:15 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1baUPC-0002Ef-PG; Fri, 19 Aug 2016 06:59:14 +1000 Date: Fri, 19 Aug 2016 06:59:14 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: RFC: dropping IRIX support in xfsprogs Message-ID: <20160818205914.GI19025@dastard> X-ASG-Orig-Subj: Re: RFC: dropping IRIX support in xfsprogs References: <20160818174742.GA14464@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160818174742.GA14464@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471553957 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 765 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 18, 2016 at 10:47:42AM -0700, Christoph Hellwig wrote: > Hi all, > > I'd like to know if anyone would complain about removing IRIX support > in xfsprogs? It very much looks unmaintained for years, and due to > the IRIX differences in type defintions and kernel interfaces it's > actually a bit of a drag on xfsprogs, so unlike the other ports > to FreeBSD and Darwin it would actually be really helpful to remove > it. > > I'd volunteer to prepare patches to remove the IRIX support and do > the resulting cleanups. We dropped support for older irix only filesystems some time ago, so this seems like a natural progression from that. I have no objections to removing it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 16:56:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2BA1D7CA0 for ; Thu, 18 Aug 2016 16:56:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D3FA68F8035 for ; Thu, 18 Aug 2016 14:56:44 -0700 (PDT) X-ASG-Debug-ID: 1471557402-0bf8155c7444760001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Exjo0MSH3v8TZpYs (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 14:56:42 -0700 (PDT) X-Barracuda-Envelope-From: BATV+68bf78b2a436139ad507+4743+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baVIo-0004pw-6D; Thu, 18 Aug 2016 21:56:42 +0000 Date: Thu, 18 Aug 2016 14:56:42 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: RFC: dropping IRIX support in xfsprogs Message-ID: <20160818215642.GA17607@infradead.org> X-ASG-Orig-Subj: Re: RFC: dropping IRIX support in xfsprogs References: <20160818174742.GA14464@infradead.org> <20160818205914.GI19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160818205914.GI19025@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471557402 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 376 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 19, 2016 at 06:59:14AM +1000, Dave Chinner wrote: > We dropped support for older irix only filesystems some time ago, > so this seems like a natural progression from that. I have no > objections to removing it... Ok, I'll start sending patches once you're ok (or not ok) with the patches from Felix to turn on LFS support to avoid conflicting with those. From david@fromorbit.com Thu Aug 18 17:43:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 29E0F7CA0 for ; Thu, 18 Aug 2016 17:43:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EF2668F8035 for ; Thu, 18 Aug 2016 15:43:46 -0700 (PDT) X-ASG-Debug-ID: 1471560223-0bf57b531349200001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id hCuX6MFqYLjKlsyh for ; Thu, 18 Aug 2016 15:43:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwUANM5tld5LDUCEGdsb2JhbABeg0SBUoZym10BAQEBAQEGjG6GE4QMhhcEAgKBck0CAQEBAQECBgEBAQEBAQEBN0CEXwEFOhwjEAgDDgoJJQ8FJQMHGhOIML1CAQEIAiUehUSFFYobBZlFjxSPVIw9g3iEYCoyhy0BAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 19 Aug 2016 08:13:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1baW28-0002P0-TT; Fri, 19 Aug 2016 08:43:32 +1000 Date: Fri, 19 Aug 2016 08:43:32 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: RFC: dropping IRIX support in xfsprogs Message-ID: <20160818224332.GJ19025@dastard> X-ASG-Orig-Subj: Re: RFC: dropping IRIX support in xfsprogs References: <20160818174742.GA14464@infradead.org> <20160818205914.GI19025@dastard> <20160818215642.GA17607@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160818215642.GA17607@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471560223 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 872 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 18, 2016 at 02:56:42PM -0700, Christoph Hellwig wrote: > On Fri, Aug 19, 2016 at 06:59:14AM +1000, Dave Chinner wrote: > > We dropped support for older irix only filesystems some time ago, > > so this seems like a natural progression from that. I have no > > objections to removing it... > > Ok, I'll start sending patches once you're ok (or not ok) > with the patches from Felix to turn on LFS support to avoid > conflicting with those. I don't have any objections to them - I've jus tbeen busy with other stuff and haven't merged them yet. You may as well just build on top of them for the moment. I also don't want to force Darrick to have to constantly rebase his userspace patchset, so I'm trying to get all the rmap support merged before taking anything else into xfsprogs... Cheers, Dave. -- Dave Chinner david@fromorbit.com From scarlett.lowe@askeventz.com Thu Aug 18 19:15:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 803917CA0 for ; Thu, 18 Aug 2016 19:15:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 51572304048 for ; Thu, 18 Aug 2016 17:15:44 -0700 (PDT) X-ASG-Debug-ID: 1471565738-0bf57c55b443510001-NocioJ Received: from askeventz.com ([198.57.191.88]) by cuda.sgi.com with ESMTP id hea2dBTCYaneFwMS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 18 Aug 2016 17:15:39 -0700 (PDT) X-Barracuda-Envelope-From: scarlett.lowe@askeventz.com X-Barracuda-Effective-Source-IP: UNKNOWN[198.57.191.88] X-Barracuda-Apparent-Source-IP: 198.57.191.88 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=askeventz.com; s=default; h=Content-Type:MIME-Version:Message-ID:Date: Subject:To:From:Sender:Reply-To:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=V/f1QyKJYDxJUPLmu9o9B84bLcuT1iE2MpGgfR5vM10=; b=Fgqgi4csU1QCZpLJwgZh0JAjpP 2xiWpFBRjrHwC3qvkFMaMG2MAtok5xjAe+M92wxOI7Q9/kBbqFkELIC+ti3qqm0Szj63icwIv5GBZ AyBW6XROGBlIXsfjdfkdWUoAFZGOV+g6LVsVEBBcVSATyfP4AWYYyZkQlFxPGfGtZY41QYG1qwxB9 UVhm9BmQMt/YNOagUQnrjXS+XUw/jhjHmKPNf22QdI4cnF8CNsOo16EK1gKf3Nef/KzFlDapeQZ6P UC7NsvQTsntUhf+CzGwR7nC+m/QPuxGN5frVFN42ojxFg0/tOpcYL2VM17ndgkfbL/61KfSbeq/o5 WCK2zklg==; Received: from [106.51.47.49] (port=53530 helo=adminPC) by 198-57-182-13.webhostbox.net with esmtpsa (TLSv1:ECDHE-RSA-AES256-SHA:256) (Exim 4.87) (envelope-from ) id 1baUQ0-0000AD-I0 for xfs@oss.sgi.com; Thu, 18 Aug 2016 21:00:06 +0000 Return-Receipt-To: "Scarlett Lowe" From: "Scarlett Lowe" To: Subject: RE: Interested in the VMworld US 2016 Attendees File? Date: Thu, 18 Aug 2016 15:58:56 -0500 X-ASG-Orig-Subj: RE: Interested in the VMworld US 2016 Attendees File? Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_21217_01D1F969.8E207870" X-Mailer: Microsoft Outlook 14.0 Thread-Index: AdH5kylBCEupuvmRR1+MoUxeHz6P2w== Content-Language: en-us X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - 198-57-182-13.webhostbox.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - askeventz.com X-Get-Message-Sender-Via: 198-57-182-13.webhostbox.net: authenticated_id: scarlett.lowe@askeventz.com X-Authenticated-Sender: 198-57-182-13.webhostbox.net: scarlett.lowe@askeventz.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: UNKNOWN[198.57.191.88] X-Barracuda-Start-Time: 1471565738 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7468 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.61 X-Barracuda-Spam-Status: No, SCORE=0.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, HTML_MESSAGE, RDNS_NONE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32133 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multipart message in MIME format. ------=_NextPart_000_21217_01D1F969.8E207870 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Good day! Just checking if you had a chance to review my email below & if you would be interested in it for your marketing benefit? Regards, Scarlett Lowe _____ From: Scarlett Lowe [mailto:scarlett.lowe@askeventz.com] Sent: Tuesday, August 16, 2016 To: xfs@oss.sgi.com Subject: Interested in the VMworld US 2016 Attendees File? Hi, Good Day! I hope this isn't a bad time, however, would you be interested in the "VMworld US 2016 Attendees List/File" to connect and discuss your services & offerings? Here are the details for your review: Counts- 6000 Records Information fields: Name, Title/Specialty, Company Name, Website, Mailing Address, Phone, Permission based E-mail Addresses etc... Usage: Unlimited. Cost / Contact: 0.60 cents [Total: $3600] Best Price before 22nd August 2016: 2999 USD Let me know if we can engage further & provide you with more information for your review. Appreciate your time & for any questions that you may have! Thank you. Regards Scarlett Lowe Sr. Data Analyst To Unsubscribe, Please reply with "Remove" in the subject line ------=_NextPart_000_21217_01D1F969.8E207870 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

 

Good day! = Just checking if you had a chance to review my email below & if you = would be interested in it for your marketing = benefit?

 

Regards,

Scarlett = Lowe

 


 

From:= = Scarlett Lowe [mailto:scarlett.lowe@askeventz.com]
Sent: = Tuesday, August 16, 2016
To: = xfs@oss.sgi.com
Subject: Interested in the VMworld US 2016 = Attendees File?

 

Hi,

 

Good Day! I hope this = isn’t a bad time, however, would you be interested in the = “VMworld US 2016 Attendees List/File” to connect and = discuss your services & offerings?

 

Here are the details for = your review:

 

Counts- 6000 = Records

Information = fields: Name, Title/Specialty, Company Name, Website, Mailing Address, = Phone, Permission based E-mail Addresses etc...

Usage: Unlimited.

 

Cost / = Contact: 0.60 cents [Total: $3600]

Best Price before = 22nd August 2016: 2999 USD

 

Let me know if we can engage further & = provide you with more information for your review. Appreciate your time = & for any questions that you may have!

Thank you.

 

Regards

Scarlett Lowe

Sr. Data Analyst

 

To Unsubscribe, Please reply with = “Remove” in the subject line

 

------=_NextPart_000_21217_01D1F969.8E207870-- From BATV+4b5380e4d74e774732cc+4744+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 18 21:07:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 613997CA0 for ; Thu, 18 Aug 2016 21:07:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E461FAC004 for ; Thu, 18 Aug 2016 19:07:41 -0700 (PDT) X-ASG-Debug-ID: 1471572460-0bf8155c7549a20001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id E3pnp8V4E3PgScfV (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 18 Aug 2016 19:07:40 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4b5380e4d74e774732cc+4744+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1baZDf-0000Fq-Mw; Fri, 19 Aug 2016 02:07:39 +0000 Date: Thu, 18 Aug 2016 19:07:39 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: RFC: dropping IRIX support in xfsprogs Message-ID: <20160819020739.GA595@infradead.org> X-ASG-Orig-Subj: Re: RFC: dropping IRIX support in xfsprogs References: <20160818174742.GA14464@infradead.org> <20160818205914.GI19025@dastard> <20160818215642.GA17607@infradead.org> <20160818224332.GJ19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160818224332.GJ19025@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471572460 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 629 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 19, 2016 at 08:43:32AM +1000, Dave Chinner wrote: > I don't have any objections to them - I've jus tbeen busy with other > stuff and haven't merged them yet. You may as well just build on top > of them for the moment. I also don't want to force Darrick to have > to constantly rebase his userspace patchset, so I'm trying to get > all the rmap support merged before taking anything else into > xfsprogs... At least the patches from Felix shouldn't conflict at all with the rmap work. I'll just wait until both the rmap work and the largefile bits are merged and will prepare the IRIX removal after that. From david@fromorbit.com Fri Aug 19 00:15:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC0527CA0 for ; Fri, 19 Aug 2016 00:15:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2EF21AC001 for ; Thu, 18 Aug 2016 22:15:25 -0700 (PDT) X-ASG-Debug-ID: 1471583722-0bf81509b047c00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id bxbO3NOtLNHAnzTL for ; Thu, 18 Aug 2016 22:15:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BpDwB2lbZXEAI1LHleg0RWfIJ5g3mbYwaMboYThAwchXsEAoFsTQIBAQEBAQIGAQEBAQEBAQE3QIUMExwjGCQ0BSUDBy2IMLxXAQslHoVEiiGCYIIvBYgri1WFR4YgiHSBdYRcgzKFUQKGaIVVg3iEYCo0hy0BAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail07.adl2.internode.on.net with ESMTP; 19 Aug 2016 14:44:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bac8n-0003DJ-Qj; Fri, 19 Aug 2016 15:14:49 +1000 Date: Fri, 19 Aug 2016 15:14:49 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: [GIT PULL] xfs, iomap: fixes for 4.8-rc3 Message-ID: <20160819051449.GF22388@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs, iomap: fixes for 4.8-rc3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1471583722 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3267 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Can you please pull the fixes from the tag list below? This update contains fixes for most of the outstanding regressions introduced with the 4.8-rc1 XFS and iomap infrastructure merge. The only regression that isn't addressed by this pullreq is the aim7 write regression. I'm still testing Christophs patches that address the simple cases we've reproduced, but the cause of the aim7 regression is still not clear so there's more work to be done there. Still, that's no reason to hold up all the other issues we have tested fixes for. Thanks! -Dave. The following changes since commit 694d0d0bb2030d2e36df73e2d23d5770511dbc8d: Linux 4.8-rc2 (2016-08-14 19:11:36 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git tags/xfs-iomap-for-linus-4.8-rc3 for you to fetch changes up to 32438cf9d54bd53b531f6d98814e84dd278360c1: Merge branch 'iomap-fixes-4.8-rc3' into for-next (2016-08-17 11:13:37 +1000) ---------------------------------------------------------------- xfs, iomap: update for 4.8-rc3 Changes in this update - regression fixes for XFS changes introduce in 4.8-rc1 - buffer IO accounting assert failure - ENOSPC block accounting reservation issue - DAX IO path page cache invalidation fix - rmapbt on-disk block count in agf - correct classification of rmap block type when updating AGFL. - iomap support for attribute fork mapping - regression fixes for iomap infrastructure in 4.8-rc1 - fiemap: honor FIEMAP_FLAG_SYNC - fiemap: implement FIEMAP_FLAG_XATTR support to fix XFS regression - make mark_page_accessed and pagefault_disable usage consistent with other IO paths ---------------------------------------------------------------- Brian Foster (1): xfs: don't assert fail on non-async buffers on ioacct decrement Christoph Hellwig (6): xfs: fix bogus space reservation in xfs_iomap_write_allocate iomap: remove superflous mark_page_accessed from iomap_write_actor iomap: remove superflous pagefault_disable from iomap_write_actor iomap: mark ->iomap_end as optional xfs: simplify xfs_file_iomap_begin xfs: (re-)implement FIEMAP_FLAG_XATTR Darrick J. Wong (2): xfs: store rmapbt block count in the AGF xfs: remove OWN_AG rmap when allocating a block from the AGFL Dave Chinner (4): xfs: don't invalidate whole file on DAX read/write iomap: fiemap should honor the FIEMAP_FLAG_SYNC flag iomap: prepare iomap_fiemap for attribute mappings Merge branch 'iomap-fixes-4.8-rc3' into for-next fs/iomap.c | 21 ++++++++----- fs/xfs/libxfs/xfs_alloc.c | 14 +++++++++ fs/xfs/libxfs/xfs_format.h | 11 +++++-- fs/xfs/libxfs/xfs_rmap_btree.c | 6 ++++ fs/xfs/xfs_buf.c | 1 - fs/xfs/xfs_file.c | 13 +++++++- fs/xfs/xfs_fsops.c | 1 + fs/xfs/xfs_iomap.c | 69 ++++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_iomap.h | 1 + fs/xfs/xfs_iops.c | 9 +++++- fs/xfs/xfs_trace.h | 1 - 11 files changed, 119 insertions(+), 28 deletions(-) -- Dave Chinner david@fromorbit.com From rjevskiy@gmail.com Fri Aug 19 04:44:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C74527CA0 for ; Fri, 19 Aug 2016 04:44:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9863C304032 for ; Fri, 19 Aug 2016 02:44:17 -0700 (PDT) X-ASG-Debug-ID: 1471599853-0bf57b53115e0d0001-NocioJ Received: from mail-lf0-f68.google.com (mail-lf0-f68.google.com [209.85.215.68]) by cuda.sgi.com with ESMTP id NZeWjvLGUvyczaDr (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 19 Aug 2016 02:44:14 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Effective-Source-IP: mail-lf0-f68.google.com[209.85.215.68] X-Barracuda-Apparent-Source-IP: 209.85.215.68 Received: by mail-lf0-f68.google.com with SMTP id l89so2850351lfi.2 for ; Fri, 19 Aug 2016 02:44:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:in-reply-to:references:user-agent:cc:date :message-id:mime-version; bh=I3AQifNr7zEqeMDOmmITjVbgSDo0U0WMWmrtI3/lpPQ=; b=oXaghZkMX8oEmvVomDv5ejac8+NdIDgBI8dUS5s+Q9yegCPHOjJZyR2D5XGAyJtFiL EjYoQhfpxgTj4oCwP86iAz2cH3WzzsnYJ2pk11OBR2NvZVJcN/9pUEiAiAN6xKQ6PX4Q 9HxwKpmZyxzsWWI2392/cSOdrARScvTOm09dXXBizZ5zvnoa85ZIZMLutDSE5AUjBTPr Rf76Gi6dpgQEuuVKR45Zcu7ghZ/N7/5te0ZnwELSUMmjQ1C5/vWX7MdrugWRRYRFNKQ0 JiteQUc/Nttb/UbJYtKSJSeHk+S9jboX4gidtqZ41bcTD++mEIexK8Uecanbq3+ZsxTI lqUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:subject:in-reply-to:references :user-agent:cc:date:message-id:mime-version; bh=I3AQifNr7zEqeMDOmmITjVbgSDo0U0WMWmrtI3/lpPQ=; b=aoxL/sQ5b7bFPd0IP0exkNd7uICYhNIBGO9EXZpBJ7cenDtIV8zJpIAynWJ4/z9JQn djWk6S7n1ck2U6PNxh5p2RP/i7pxLXMKHcZz8NlJrSwO6LAIwrvgOqmL/pNyfjwkqi0I sP18LyD1q53DIHfzzzcGjPTt302VrUgZpSonr5z5v/GuGERO+2MsER3a9E4D5+gW65cX 62UnYry9jLFQ3tbpOV+iNMYvRfRJVRha75gZQWXm4aTVZaq0F1ZxSEwa9nNs5DPL1Wq8 pjoYE/bO8xTmYkhKqbtFdAgUDcTYQgcAfkCUEo/yW1IlC8qmAT1Z/VqFwx8GmCP/pa5i rrCw== X-Gm-Message-State: AEkoousSdIE/C/3RhWDPFkJxR1hBcGYdHU8WVGBjcoNLABFJ5ZTrB5vXshEv5sU6w4duCA== X-Received: by 10.25.163.205 with SMTP id m196mr1844121lfe.5.1471599852717; Fri, 19 Aug 2016 02:44:12 -0700 (PDT) Received: from smtp.gmail.com ([195.214.234.4]) by smtp.gmail.com with ESMTPSA id f69sm1065852lji.19.2016.08.19.02.44.11 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Aug 2016 02:44:12 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: xfs@oss.sgi.com Subject: Re: [PATCH] PING... mkfs.xfs: fix static-lib build In-Reply-To: <1470907976-2362-1-git-send-email-dmonakhov@openvz.org> X-ASG-Orig-Subj: Re: [PATCH] PING... mkfs.xfs: fix static-lib build References: <1470907976-2362-1-git-send-email-dmonakhov@openvz.org> User-Agent: Notmuch/0.18.1 (http://notmuchmail.org) Emacs/24.4.1 (x86_64-pc-linux-gnu) CC: david@fromorbit.com, billodo@redhat.com Date: Fri, 19 Aug 2016 12:44:07 +0300 Message-ID: <87bn0p6ql4.fsf@openvz.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Barracuda-Connect: mail-lf0-f68.google.com[209.85.215.68] X-Barracuda-Start-Time: 1471599854 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1994 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32147 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --=-=-= Content-Type: text/plain I'm just want to double check that this list is still alive, and not yet moved some where XXX-xfs@kernel.org :) Fellows, please take a look at the patch. This fix static build for mkfs.xfs and break xfstests-bld build. --=-=-= Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" --==-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Dmitry Monakhov writes: > Order is important for static libraries, libblkid depends on libuuid. > We have to pass libuuid after libblkid, otherwise it fails like this: > #make mkfs.xfs > [LD] mkfs.xfs > /bin/bash ../libtool --quiet --tag=3DCC --mode=3Dlink gcc -o mkfs.xfs= -static -L/devel/xfstests-bld.git/bld/lib -static-libtool-libs maxtrres.o= proto.o xfs_mkfs.o ../libxfs/libxfs.la ../libxcmd/libxcmd.la -luuid -lrt= -lpthread -lblkid > /devel/xfstests-bld.git/bld/lib/libblkid.a(probe.o): In function `set= _uuid': > /devel/xfstests-bld.git/e2fsprogs-libs/lib/blkid/probe.c:132: undefin= ed reference to `uuid_is_null' > /devel/xfstests-bld.git/e2fsprogs-libs/lib/blkid/probe.c:133: undefin= ed reference to `uuid_unparse' > /devel/xfstests-bld.git/bld/lib/libblkid.a(probe.o): In function `get= _ext2_info': > /devel/xfstests-bld.git/e2fsprogs-libs/lib/blkid/probe.c:156: undefin= ed reference to `uuid_is_null' > collect2: error: ld returned 1 exit status > ../include/buildrules:45: recipe for target 'mkfs.xfs' failed > make: *** [mkfs.xfs] Error 1 > > Signed-off-by: Dmitry Monakhov > --- > mkfs/Makefile | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/mkfs/Makefile b/mkfs/Makefile > index 170e3c1..c13b903 100644 > --- a/mkfs/Makefile > +++ b/mkfs/Makefile > @@ -10,7 +10,7 @@ LTCOMMAND =3D mkfs.xfs > HFILES =3D > CFILES =3D maxtrres.c proto.c xfs_mkfs.c >=20=20 > -LLDLIBS +=3D $(LIBXFS) $(LIBXCMD) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) $(LI= BBLKID) > +LLDLIBS +=3D $(LIBXFS) $(LIBXCMD) $(LIBRT) $(LIBPTHREAD) $(LIBBLKID) $(L= IBUUID) > LTDEPENDENCIES +=3D $(LIBXFS) $(LIBXCMD) > LLDFLAGS =3D -static-libtool-libs >=20=20 > --=20 > 2.1.4 --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAEBCgAGBQJXttTnAAoJELhyPTmIL6kBvQkH/0n3NAHetnJwcf50DUPQx8u6 4YdN6iO2VE3npZ76+T+qHmiR5sCYDVjS7dUlc5OgRrdb77mrlNYVBsv9B0qkbq3g y9uqv5czcRfezSIBF+t+ZOCpsdR0M0mTUbIEYPM07GckS1pX8X00YQ5br30O3Cxq 8Yhp3gdWOCydrU3XGz7hkNTQbXzxrdMEQ8cXe7aGf7bLNGwP1zE2+8n8o/DYO9Sw OXDsH5/kyqO2tHkcuStcu+EuWHuhdqmRDpMCLGhoaoIJGqJonQTumb6z3XYPTot2 m9UT+HXUSfoiTryL0DDy7HAKvoxvNJtgr8dPOEwrdxcHRGWW+J9c2RuoQp3ypYk= =KS8U -----END PGP SIGNATURE----- --==-=-=-- --=-=-=-- From david@fromorbit.com Fri Aug 19 05:29:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3B9C47CA0 for ; Fri, 19 Aug 2016 05:29:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BDB90AC002 for ; Fri, 19 Aug 2016 03:29:03 -0700 (PDT) X-ASG-Debug-ID: 1471602540-0bf81509b04ea20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id uDPorchSSWs6g8dM for ; Fri, 19 Aug 2016 03:29:01 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApQVAJTetld5LDUCEGdsb2JhbABeg0SBUoZym10BAQEBAQEGjG+GE4QMhhcEAgKBZk0CAQEBAQECBgEBAQEBAQEBN0CEXgEBBAE6HCMQCAMOCgklDwUlAwcaE4gpB71aAQslHoVFhRWEEhEBhXcFmUePFI9WjD2DeIRgKjSFd4E2AQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 19 Aug 2016 19:58:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bah2o-0003sC-EM; Fri, 19 Aug 2016 20:28:58 +1000 Date: Fri, 19 Aug 2016 20:28:58 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: xfs@oss.sgi.com, billodo@redhat.com, linux-xfs@vger.kernel.org Subject: Re: [PATCH] PING... mkfs.xfs: fix static-lib build Message-ID: <20160819102858.GK19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] PING... mkfs.xfs: fix static-lib build References: <1470907976-2362-1-git-send-email-dmonakhov@openvz.org> <87bn0p6ql4.fsf@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87bn0p6ql4.fsf@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471602540 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 961 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32148 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 19, 2016 at 12:44:07PM +0300, Dmitry Monakhov wrote: > > I'm just want to double check that this list is still alive, and > not yet moved some where XXX-xfs@kernel.org :) linux-xfs@vger.kernel.org is active and we'll be moving there soon - stay tuned. For the moment, I'll see any email you send there, at least ;P > > diff --git a/mkfs/Makefile b/mkfs/Makefile > > index 170e3c1..c13b903 100644 > > --- a/mkfs/Makefile > > +++ b/mkfs/Makefile > > @@ -10,7 +10,7 @@ LTCOMMAND = mkfs.xfs > > HFILES = > > CFILES = maxtrres.c proto.c xfs_mkfs.c > > > > -LLDLIBS += $(LIBXFS) $(LIBXCMD) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) $(LIBBLKID) > > +LLDLIBS += $(LIBXFS) $(LIBXCMD) $(LIBRT) $(LIBPTHREAD) $(LIBBLKID) $(LIBUUID) > > LTDEPENDENCIES += $(LIBXFS) $(LIBXCMD) > > LLDFLAGS = -static-libtool-libs I've already got a patch from Darrick to fix that in my queue. Cheers, Dave. -- Dave Chinner david@fromorbit.com From peterz@infradead.org Fri Aug 19 08:27:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 11B417CA0 for ; Fri, 19 Aug 2016 08:27:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BBEDD8F8033 for ; Fri, 19 Aug 2016 06:27:41 -0700 (PDT) X-ASG-Debug-ID: 1471613258-0bf81509b0560b0001-NocioJ Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by cuda.sgi.com with ESMTP id oEapYHjMmBy17mpB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 19 Aug 2016 06:27:39 -0700 (PDT) X-Barracuda-Envelope-From: peterz@infradead.org X-Barracuda-Effective-Source-IP: merlin.infradead.org[205.233.59.134] X-Barracuda-Apparent-Source-IP: 205.233.59.134 Received: from j217100.upc-j.chello.nl ([24.132.217.100] helo=twins.programming.kicks-ass.net) by merlin.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bajph-0000XA-CR; Fri, 19 Aug 2016 13:27:37 +0000 Received: by twins.programming.kicks-ass.net (Postfix, from userid 1000) id 21F3C12573B0D; Fri, 19 Aug 2016 15:27:36 +0200 (CEST) Date: Fri, 19 Aug 2016 15:27:36 +0200 From: Peter Zijlstra To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-ID: <20160819132736.GH10121@twins.programming.kicks-ass.net> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead References: <1470935423-12329-1-git-send-email-hch@lst.de> <20160811215444.GY30192@twins.programming.kicks-ass.net> <20160818173707.GA1240@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160818173707.GA1240@lst.de> User-Agent: Mutt/1.5.23.1 (2014-03-12) X-Barracuda-Connect: merlin.infradead.org[205.233.59.134] X-Barracuda-Start-Time: 1471613259 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 807 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32151 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 18, 2016 at 07:37:07PM +0200, Christoph Hellwig wrote: > On Thu, Aug 11, 2016 at 11:54:44PM +0200, Peter Zijlstra wrote: > > Sure, find below. Not been near a compiler. > > It has now. Below are the additions I need, and things seem to be > passing fine with that. > > Note that to fit the existing XFS lock asserts I'm using > _lockdep_is_held directly instead of lockdep_assert_held_exclusive. > All the exports are there, but I'm just trying to make sure you're > not going to shout at me for that later :) Hurm, if you're going to directly use that maybe we should pick a better name ;-) Also, be sure to check the debug_locks variable, if that's cleared the result of _lockdep_is_held() isn't reliable -- we stop tracking lock state when there's an error. Thanks! From service@confirmation.fr Fri Aug 19 12:48:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_HTML_ATTACH, T_REMOTE_IMAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 20FA37CA0 for ; Fri, 19 Aug 2016 12:48:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D80FD304043 for ; Fri, 19 Aug 2016 10:48:06 -0700 (PDT) X-ASG-Debug-ID: 1471628880-0bf57c55b367950001-NocioJ Received: from cicero3.cybercity.dk (cicero3.telenor.dk [212.242.43.248]) by cuda.sgi.com with ESMTP id VZdvCL7L4YDivRBd for ; Fri, 19 Aug 2016 10:48:00 -0700 (PDT) X-Barracuda-Envelope-From: service@confirmation.fr X-Barracuda-Effective-Source-IP: cicero3.telenor.dk[212.242.43.248] X-Barracuda-Apparent-Source-IP: 212.242.43.248 Received: from [185.8.49.139] (port41.ds1-hgs.adsl.cybercity.dk [212.242.224.12]) by cicero3.cybercity.dk (Postfix) with ESMTP id F26BA108976; Fri, 19 Aug 2016 19:47:58 +0200 (CEST) Content-Type: multipart/mixed; boundary="===============1053633467==" MIME-Version: 1.0 Subject: Votre compte PayPal est actuellement restreint. To: Recipients X-ASG-Orig-Subj: Votre compte PayPal est actuellement restreint. From: service@confirmation.fr Date: Fri, 19 Aug 2016 19:47:51 +0200 X-Barracuda-Connect: cicero3.telenor.dk[212.242.43.248] X-Barracuda-Start-Time: 1471628880 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 52 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.40 X-Barracuda-Spam-Status: No, SCORE=1.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA430_FR2, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, BSF_SC7_MJ5792, HTML_MESSAGE, MISSING_MID, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32157 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.25 BSF_SC7_MJ5792 Mismatched html tag text 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain 1.00 BSF_SC0_SA430_FR2 Custom Rule SA430_FR2 Message-Id: <20160819174806.4816C1940062@cuda.sgi.com> You will not see this in a MIME-aware mail reader. --===============1053633467== Content-Type: multipart/alternative; boundary="===============1511719110==" MIME-Version: 1.0 --===============1511719110== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body PayPal = = = Informations de compte PayPal: = Bonjour, Nous avons recemment d=E9termine que plusieurs ordinateurs sont connectes a= votre compte, et les =E9checs de passe beaucoup =E9taient pr=E9sents avant la connexion. = Par cons=E9quent, votre compte a =E9t=E9 limite. Pour r=E9cup=E9rer votre c= ompte PayPal, vous aurez besoin de mettre a jour vos informations de compte. = = Ce sera plus simple ! = T=E9l=E9charger le formulaire ci-joint et l'ouvrir a une fen=EAtre de navig= ateur s=E9curise. = Une fois ouvert, vous sera fournie avec des mesures pour r=E9tablir votre a= cc=E8s,puis suivez les instructions. Cordialement, =A9 1999-2016 PayPal, Inc. --===============1511719110== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body

 PayPal <= /FONT> <= /FONT>

 

Informations de compte = PayPal:&= nbsp;

Bonjour,

Nous avons recemment d=E9termine que plusieurs ordinateurs sont con= nectes a votre compte,
et les =E9checs de passe beaucoup =E9taient pr=E9se= nts avant la connexion. 
P= ar cons=E9quent, votre compte a =E9t=E9 limite. =

Pour r=E9cup=E9rer votre = compte PayPal, vous aurez besoin de mettre a jour vos informations de compt= e.

<= /TABLE>

Cordialement,

=A9 1999-2016 P= ayPal, Inc.

--===============1511719110==-- --===============1053633467== MIME-Version: 1.0 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="PP-958565-953.html" =EF=BB=BF PayPal compte --===============1053633467==-- From zlang@redhat.com Fri Aug 19 12:51:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CA3137CA2 for ; Fri, 19 Aug 2016 12:51:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F857AC004 for ; Fri, 19 Aug 2016 10:51:51 -0700 (PDT) X-ASG-Debug-ID: 1471629109-0bf57c55b268b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uAogkGNEgfuFrEAy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 10:51:50 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1E78F43A39; Fri, 19 Aug 2016 17:51:49 +0000 (UTC) Received: from localhost (vpn1-4-252.pek2.redhat.com [10.72.4.252]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7JHpll6002927; Fri, 19 Aug 2016 13:51:48 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH 1/2] common/rc: add functions to check or write objects under /sys/fs/$FSTYP Date: Sat, 20 Aug 2016 01:51:44 +0800 X-ASG-Orig-Subj: [PATCH 1/2] common/rc: add functions to check or write objects under /sys/fs/$FSTYP Message-Id: <1471629105-13359-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 19 Aug 2016 17:51:49 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471629110 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1800 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 XFS add more configurations in /sys/fs/xfs recently. For use them, this patch add some common functions for: 1. "require" a file/dir in /sys/fs/${FSTYP}. 2. write a file in /sys/fs/${FSTYP}. For common use, these functions can be used by other filesystems. Signed-off-by: Zorro Lang --- common/rc | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/common/rc b/common/rc index 51092a0..d5edfef 100644 --- a/common/rc +++ b/common/rc @@ -3556,6 +3556,48 @@ run_fsx() fi } +# Test for the existence of a sysfs entry at /sys/fs/$FSTYP/$DEV/$ENTRY +_require_fs_sysfs() +{ + local dev=$1 + local entry=$2 + local tmp_mnt=`mktemp -d` + + if [ ! -b "$dev" -o -z "$entry" ];then + _fail "Usage: _require_fs_sysfs " + fi + + local dname=$(_short_dev $dev) + _mount -t $FSTYP `_common_dev_mount_options` $dev $tmp_mnt + if [ $? -ne 0 ];then + rm -f $tmp_mnt + _fail "_require_fs_sysfs: could not mount, mkfs first in your test?" + elif [ ! -e /sys/fs/${FSTYP}/${dname}/${entry} ];then + $UMOUNT_PROG $tmp_mnt + rm -f $tmp_mnt + _notrun "/sys/fs/${FSTYP}/${dname}/${entry}: No such file or directory" + fi + $UMOUNT_PROG $tmp_mnt + rm -rf $tmp_mnt +} + +# Write "content" into /sys/fs/$FSTYP/$DEV/$ENTRY +_set_fs_sysfs_param() +{ + local dev=$1 + shift + local entry=$1 + shift + local content="$*" + + if [ ! -b "$dev" -o -z "$entry" -o -z "$content" ];then + _fail "Usage: _set_sys_fs_param " + fi + + local dname=$(_short_dev $dev) + echo "$content" > /sys/fs/${FSTYP}/${dname}/${entry} +} + init_rc ################################################################################ -- 2.5.5 From zlang@redhat.com Fri Aug 19 12:51:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A305F7CA2 for ; Fri, 19 Aug 2016 12:51:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 09D1FAC003 for ; Fri, 19 Aug 2016 10:51:54 -0700 (PDT) X-ASG-Debug-ID: 1471629112-0bf57c55b168bd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8jcZxlaQ90gZOQTs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 10:51:53 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 57B3E7F779; Fri, 19 Aug 2016 17:51:52 +0000 (UTC) Received: from localhost (vpn1-4-252.pek2.redhat.com [10.72.4.252]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7JHpoD9016725; Fri, 19 Aug 2016 13:51:51 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH 2/2] fstests: xfs EIO error handling test Date: Sat, 20 Aug 2016 01:51:45 +0800 X-ASG-Orig-Subj: [PATCH 2/2] fstests: xfs EIO error handling test Message-Id: <1471629105-13359-2-git-send-email-zlang@redhat.com> In-Reply-To: <1471629105-13359-1-git-send-email-zlang@redhat.com> References: <1471629105-13359-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Fri, 19 Aug 2016 17:51:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471629112 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6087 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Besides fail_at_unmount, all EIO error handling can stop umount hanging on IO error too. This case test EIO/max_retries and EIO/retry_timeout_seconds as below: 1) fail_at_unmount=0 && \ EIO/max_retries=1 && \ EIO/retry_timeout_seconds=0 2) fail_at_unmount=0 && \ EIO/max_retries=-1 && \ EIO/retry_timeout_seconds=1 Make sure when fail_at_unmount=0, umount won't hang there. Signed-off-by: Zorro Lang --- tests/xfs/263 | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/263.out | 21 +++++++++ tests/xfs/group | 1 + 3 files changed, 148 insertions(+) create mode 100755 tests/xfs/263 create mode 100644 tests/xfs/263.out diff --git a/tests/xfs/263 b/tests/xfs/263 new file mode 100755 index 0000000..2df139c --- /dev/null +++ b/tests/xfs/263 @@ -0,0 +1,126 @@ +#! /bin/bash +# FS QA Test 263 +# +# Test XFS EIO error handling configuration. Stop XFS from retrying +# to writeback forever when hit EIO. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + _dmerror_cleanup +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/dmerror + +# remove previous $seqres.full before test +rm -f $seqres.full + +# real QA test starts here +_supported_fs xfs +_supported_os Linux +_require_dm_target error +_require_scratch +_require_fs_sysfs error/fail_at_unmount +_require_fs_sysfs error/metadata/EIO/max_retries +_require_fs_sysfs error/metadata/EIO/retry_timeout_seconds + +_scratch_mkfs >> $seqres.full 2>&1 +_dmerror_init + +do_test() +{ + local attr="$1" + local num=0 + + _dmerror_mount + reset_xfs_sysfs_error_handling $DMERROR_DEV + # Disable fail_at_unmount before test EIO error handling + _set_fs_sysfs_attr $DMERROR_DEV error/fail_at_unmount 0 + echo -n "error/fail_at_unmount=" + _get_fs_sysfs_attr $DMERROR_DEV error/fail_at_unmount + + _set_fs_sysfs_attr $DMERROR_DEV $attr 1 + num=`_get_fs_sysfs_attr $DMERROR_DEV $attr` + echo "$attr=$num" + # _fail the test if we fail to set $attr to 1, because the test + # probably will hang in such case and block subsequent tests. + if [ "$num" != "1" ]; then + _fail "Failed to set $attr: 1" + fi + + # start a metadata-intensive workload, but no data allocation operation. + # Because uncompleted new space allocation I/Os may cause XFS to shutdown + # after loading error table. + $FSSTRESS_PROG -z -n 5000 -p 10 \ + -f creat=10 \ + -f resvsp=1 \ + -f truncate=1 \ + -f punch=1 \ + -f chown=5 \ + -f mkdir=5 \ + -f rmdir=1 \ + -f mknod=1 \ + -f unlink=1 \ + -f symlink=1 \ + -f rename=1 \ + -d $SCRATCH_MNT/fsstress >> $seqres.full 2>&1 + + # Loading error table without "--nolockfs" option. Because "--nolockfs" + # won't freeze fs, then some running I/Os may cause XFS to shutdown + # prematurely. That's not what we want to test. + _dmerror_load_error_table lockfs + _dmerror_unmount + + # Mount again to replay log after loading working table, so we have a + # consistent XFS after test. + _dmerror_load_working_table + _dmerror_mount + _dmerror_unmount +} + +#### Test EIO/max_retries #### +# Set EIO/max_retries a limited number(>-1), then even if fail_at_unmount=0, +# the test won't hang. +echo "=== Test EIO/max_retries ===" +do_test error/metadata/EIO/max_retries + +#### Test EIO/retry_timeout_seconds #### +# Set EIO/retry_timeout_seconds to a limited number(>0), then even if +# fail_at_unmount=0, the test won't hang. +echo "=== Test EIO/retry_timeout_seconds ===" +do_test error/metadata/EIO/retry_timeout_seconds + +# success, all done +status=0 +exit diff --git a/tests/xfs/263.out b/tests/xfs/263.out new file mode 100644 index 0000000..714350f --- /dev/null +++ b/tests/xfs/263.out @@ -0,0 +1,21 @@ +QA output created by 263 +=== Test EIO/max_retries === +error/fail_at_unmount=1 +error/metadata/default/max_retries=-1 +error/metadata/default/retry_timeout_seconds=0 +error/metadata/EIO/max_retries=-1 +error/metadata/EIO/retry_timeout_seconds=0 +error/metadata/ENOSPC/max_retries=-1 +error/metadata/ENOSPC/retry_timeout_seconds=0 +error/fail_at_unmount=0 +error/metadata/EIO/max_retries=1 +=== Test EIO/retry_timeout_seconds === +error/fail_at_unmount=1 +error/metadata/default/max_retries=-1 +error/metadata/default/retry_timeout_seconds=0 +error/metadata/EIO/max_retries=-1 +error/metadata/EIO/retry_timeout_seconds=0 +error/metadata/ENOSPC/max_retries=-1 +error/metadata/ENOSPC/retry_timeout_seconds=0 +error/fail_at_unmount=0 +error/metadata/EIO/retry_timeout_seconds=1 diff --git a/tests/xfs/group b/tests/xfs/group index 6905a62..ec3c022 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -260,6 +260,7 @@ 260 auto quick quota 261 auto quick quota 262 auto quick quota +263 auto quick mount 265 auto clone 266 dump ioctl auto quick 267 dump ioctl tape -- 2.7.4 From zlang@redhat.com Fri Aug 19 12:55:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3C44A7CA2 for ; Fri, 19 Aug 2016 12:55:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 008C78F8037 for ; Fri, 19 Aug 2016 10:55:15 -0700 (PDT) X-ASG-Debug-ID: 1471629313-0bf57b531173120001-NocioJ Received: from mx4-phx2.redhat.com (mx4-phx2.redhat.com [209.132.183.25]) by cuda.sgi.com with ESMTP id r3rxcANfxsHo2kD3 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 19 Aug 2016 10:55:13 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Apparent-Source-IP: 209.132.183.25 Received: from zmail21.collab.prod.int.phx2.redhat.com (zmail21.collab.prod.int.phx2.redhat.com [10.5.83.24]) by mx4-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id u7JHtC89021045; Fri, 19 Aug 2016 13:55:12 -0400 Date: Fri, 19 Aug 2016 13:55:12 -0400 (EDT) From: Zirong Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Message-ID: <618760559.2359845.1471629312793.JavaMail.zimbra@redhat.com> In-Reply-To: <1471629105-13359-1-git-send-email-zlang@redhat.com> References: <1471629105-13359-1-git-send-email-zlang@redhat.com> Subject: Re: [PATCH 1/2] common/rc: add functions to check or write objects under /sys/fs/$FSTYP MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH 1/2] common/rc: add functions to check or write objects under /sys/fs/$FSTYP Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [10.68.5.20] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - GC52 (Linux)/8.0.6_GA_5922) Thread-Topic: common/rc: add functions to check or write objects under /sys/fs/$FSTYP Thread-Index: KcQI8lVfuTNv96A6wFBISkR4ThftqA== X-Barracuda-Connect: mx4-phx2.redhat.com[209.132.183.25] X-Barracuda-Start-Time: 1471629313 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2615 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32157 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Sorry, I sent wrong patch. Please ignore this patch. This's not the real [PATCH 1/2]. I'll resend both patches later. Thanks, Zorro ----- =E5=8E=9F=E5=A7=8B=E9=82=AE=E4=BB=B6 ----- > =E5=8F=91=E4=BB=B6=E4=BA=BA: "Zorro Lang" > =E6=94=B6=E4=BB=B6=E4=BA=BA: fstests@vger.kernel.org > =E6=8A=84=E9=80=81: xfs@oss.sgi.com, "Zorro Lang" > =E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: =E6=98=9F=E6=9C=9F=E5=85=AD, 2016= =E5=B9=B4 8 =E6=9C=88 20=E6=97=A5 =E4=B8=8A=E5=8D=88 1:51:44 > =E4=B8=BB=E9=A2=98: [PATCH 1/2] common/rc: add functions to check or writ= e objects under /sys/fs/$FSTYP >=20 > XFS add more configurations in /sys/fs/xfs recently. For use > them, this patch add some common functions for: > 1. "require" a file/dir in /sys/fs/${FSTYP}. > 2. write a file in /sys/fs/${FSTYP}. >=20 > For common use, these functions can be used by other filesystems. >=20 > Signed-off-by: Zorro Lang > --- > common/rc | 42 ++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 42 insertions(+) >=20 > diff --git a/common/rc b/common/rc > index 51092a0..d5edfef 100644 > --- a/common/rc > +++ b/common/rc > @@ -3556,6 +3556,48 @@ run_fsx() > =09fi > } > =20 > +# Test for the existence of a sysfs entry at /sys/fs/$FSTYP/$DEV/$ENTRY > +_require_fs_sysfs() > +{ > +=09local dev=3D$1 > +=09local entry=3D$2 > +=09local tmp_mnt=3D`mktemp -d` > + > +=09if [ ! -b "$dev" -o -z "$entry" ];then > +=09=09_fail "Usage: _require_fs_sysfs " > + fi > + > +=09local dname=3D$(_short_dev $dev) > +=09_mount -t $FSTYP `_common_dev_mount_options` $dev $tmp_mnt > +=09if [ $? -ne 0 ];then > +=09=09rm -f $tmp_mnt > +=09=09_fail "_require_fs_sysfs: could not mount, mkfs first in your test= ?" > +=09elif [ ! -e /sys/fs/${FSTYP}/${dname}/${entry} ];then > +=09=09$UMOUNT_PROG $tmp_mnt > +=09=09rm -f $tmp_mnt > +=09=09_notrun "/sys/fs/${FSTYP}/${dname}/${entry}: No such file or direc= tory" > +=09fi > +=09$UMOUNT_PROG $tmp_mnt > +=09rm -rf $tmp_mnt > +} > + > +# Write "content" into /sys/fs/$FSTYP/$DEV/$ENTRY > +_set_fs_sysfs_param() > +{ > +=09local dev=3D$1 > +=09shift > +=09local entry=3D$1 > +=09shift > +=09local content=3D"$*" > + > +=09if [ ! -b "$dev" -o -z "$entry" -o -z "$content" ];then > +=09=09_fail "Usage: _set_sys_fs_param = " > +=09fi > + > +=09local dname=3D$(_short_dev $dev) > +=09echo "$content" > /sys/fs/${FSTYP}/${dname}/${entry} > +} > + > init_rc > =20 > ########################################################################= ######## > -- > 2.5.5 >=20 > -- > To unsubscribe from this list: send the line "unsubscribe fstests" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >=20 From zlang@redhat.com Fri Aug 19 12:56:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 86B467CA2 for ; Fri, 19 Aug 2016 12:56:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B7558F8037 for ; Fri, 19 Aug 2016 10:56:37 -0700 (PDT) X-ASG-Debug-ID: 1471629395-0bf57c55b269420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gDtw0CHDt6uDfns4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 10:56:36 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 716BE80F7B; Fri, 19 Aug 2016 17:56:35 +0000 (UTC) Received: from localhost (vpn1-4-252.pek2.redhat.com [10.72.4.252]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7JHuYpX006388; Fri, 19 Aug 2016 13:56:34 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH 1/2] xfs/006: move code about resetting error handling to common/rc Date: Sat, 20 Aug 2016 01:56:31 +0800 X-ASG-Orig-Subj: [PATCH 1/2] xfs/006: move code about resetting error handling to common/rc Message-Id: <1471629392-13661-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Fri, 19 Aug 2016 17:56:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471629395 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4173 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Nearly 1/3 code is used to reset the xfs error handling attributes, This part can be picked up, and used for other cases. So move them to a new function reset_xfs_sysfs_error_handling() in common/rc. Signed-off-by: Zorro Lang --- common/rc | 37 +++++++++++++++++++++++++++++++++++++ tests/xfs/006 | 27 +++++++-------------------- tests/xfs/006.out | 1 + 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/common/rc b/common/rc index 3fb0600..b038d8e 100644 --- a/common/rc +++ b/common/rc @@ -3888,6 +3888,43 @@ _get_fs_sysfs_attr() cat /sys/fs/${FSTYP}/${dname}/${attr} } + +# Reset all xfs error handling attributes, set them to original +# status. +# +# Only one argument, and it's necessary: +# - dev: device name, e.g. $SCRATCH_DEV +# +# Note: this function only works for XFS +reset_xfs_sysfs_error_handling() +{ + local dev=$1 + + if [ ! -b "$dev" -o "$FSTYP" != "xfs" ];then + _fail "Usage: reset_xfs_sysfs_error_handling " + fi + + _set_fs_sysfs_attr $dev error/fail_at_unmount 1 + echo -n "error/fail_at_unmount=" + _get_fs_sysfs_attr $dev error/fail_at_unmount + + # Make sure all will be configured to retry forever by default, except + # for ENODEV, which is an unrecoverable error, so it will be configured + # to not retry on error by default. + for e in default EIO ENOSPC; do + _set_fs_sysfs_attr $dev \ + error/metadata/${e}/max_retries -1 + echo -n "error/metadata/${e}/max_retries=" + _get_fs_sysfs_attr $dev error/metadata/${e}/max_retries + + _set_fs_sysfs_attr $dev \ + error/metadata/${e}/retry_timeout_seconds 0 + echo -n "error/metadata/${e}/retry_timeout_seconds=" + _get_fs_sysfs_attr $dev \ + error/metadata/${e}/retry_timeout_seconds + done +} + # Skip if we are running an older binary without the stricter input checks. # Make multiple checks to be sure that there is no regression on the one # selected feature check, which would skew the result. diff --git a/tests/xfs/006 b/tests/xfs/006 index 8910026..58f9348 100755 --- a/tests/xfs/006 +++ b/tests/xfs/006 @@ -57,31 +57,18 @@ _scratch_mkfs > $seqres.full 2>&1 _dmerror_init _dmerror_mount -# Enable fail_at_unmount, so XFS stops retrying on errors at unmount -# time. _fail the test if we fail to set it to 1, because the test -# probably will hang in such case and block subsequent tests. -_set_fs_sysfs_attr $DMERROR_DEV error/fail_at_unmount 1 +# Make sure all error handling attributes are original status +reset_xfs_sysfs_error_handling $DMERROR_DEV + +# Make sure fail_at_unmount is enabled, so XFS stops retrying on +# errors at unmount time. _fail the test if we fail to set it to 1, +# because the test probably will hang in such case and block +# subsequent tests. attr=`_get_fs_sysfs_attr $DMERROR_DEV error/fail_at_unmount` if [ "$attr" != "1" ]; then _fail "Failed to set error/fail_at_unmount: $attr" fi -# Make sure all will be configured to retry forever by default, except -# for ENODEV, which is an unrecoverable error, so it will be configured -# to not retry on error by default. -for e in default EIO ENOSPC; do - _set_fs_sysfs_attr $DMERROR_DEV \ - error/metadata/${e}/max_retries -1 - echo -n "error/metadata/${e}/max_retries=" - _get_fs_sysfs_attr $DMERROR_DEV error/metadata/${e}/max_retries - - _set_fs_sysfs_attr $DMERROR_DEV \ - error/metadata/${e}/retry_timeout_seconds 0 - echo -n "error/metadata/${e}/retry_timeout_seconds=" - _get_fs_sysfs_attr $DMERROR_DEV \ - error/metadata/${e}/retry_timeout_seconds -done - # start a metadata-intensive workload, but no data allocation operation. # Because uncompleted new space allocation I/Os may cause XFS to shutdown # after loading error table. diff --git a/tests/xfs/006.out b/tests/xfs/006.out index 393f411..3260b3a 100644 --- a/tests/xfs/006.out +++ b/tests/xfs/006.out @@ -1,4 +1,5 @@ QA output created by 006 +error/fail_at_unmount=1 error/metadata/default/max_retries=-1 error/metadata/default/retry_timeout_seconds=0 error/metadata/EIO/max_retries=-1 -- 2.7.4 From zlang@redhat.com Fri Aug 19 12:56:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8F9827CAE for ; Fri, 19 Aug 2016 12:56:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F0F54AC006 for ; Fri, 19 Aug 2016 10:56:40 -0700 (PDT) X-ASG-Debug-ID: 1471629398-0bf57b531173190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BSOln2raCQHNwsvo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 10:56:39 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C47C9C05678C; Fri, 19 Aug 2016 17:56:38 +0000 (UTC) Received: from localhost (vpn1-4-252.pek2.redhat.com [10.72.4.252]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7JHubhs012408; Fri, 19 Aug 2016 13:56:38 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH 2/2] fstests: xfs EIO error handling test Date: Sat, 20 Aug 2016 01:56:32 +0800 X-ASG-Orig-Subj: [PATCH 2/2] fstests: xfs EIO error handling test Message-Id: <1471629392-13661-2-git-send-email-zlang@redhat.com> In-Reply-To: <1471629392-13661-1-git-send-email-zlang@redhat.com> References: <1471629392-13661-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 19 Aug 2016 17:56:38 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471629399 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6087 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Besides fail_at_unmount, all EIO error handling can stop umount hanging on IO error too. This case test EIO/max_retries and EIO/retry_timeout_seconds as below: 1) fail_at_unmount=0 && \ EIO/max_retries=1 && \ EIO/retry_timeout_seconds=0 2) fail_at_unmount=0 && \ EIO/max_retries=-1 && \ EIO/retry_timeout_seconds=1 Make sure when fail_at_unmount=0, umount won't hang there. Signed-off-by: Zorro Lang --- tests/xfs/263 | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/263.out | 21 +++++++++ tests/xfs/group | 1 + 3 files changed, 148 insertions(+) create mode 100755 tests/xfs/263 create mode 100644 tests/xfs/263.out diff --git a/tests/xfs/263 b/tests/xfs/263 new file mode 100755 index 0000000..2df139c --- /dev/null +++ b/tests/xfs/263 @@ -0,0 +1,126 @@ +#! /bin/bash +# FS QA Test 263 +# +# Test XFS EIO error handling configuration. Stop XFS from retrying +# to writeback forever when hit EIO. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + _dmerror_cleanup +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/dmerror + +# remove previous $seqres.full before test +rm -f $seqres.full + +# real QA test starts here +_supported_fs xfs +_supported_os Linux +_require_dm_target error +_require_scratch +_require_fs_sysfs error/fail_at_unmount +_require_fs_sysfs error/metadata/EIO/max_retries +_require_fs_sysfs error/metadata/EIO/retry_timeout_seconds + +_scratch_mkfs >> $seqres.full 2>&1 +_dmerror_init + +do_test() +{ + local attr="$1" + local num=0 + + _dmerror_mount + reset_xfs_sysfs_error_handling $DMERROR_DEV + # Disable fail_at_unmount before test EIO error handling + _set_fs_sysfs_attr $DMERROR_DEV error/fail_at_unmount 0 + echo -n "error/fail_at_unmount=" + _get_fs_sysfs_attr $DMERROR_DEV error/fail_at_unmount + + _set_fs_sysfs_attr $DMERROR_DEV $attr 1 + num=`_get_fs_sysfs_attr $DMERROR_DEV $attr` + echo "$attr=$num" + # _fail the test if we fail to set $attr to 1, because the test + # probably will hang in such case and block subsequent tests. + if [ "$num" != "1" ]; then + _fail "Failed to set $attr: 1" + fi + + # start a metadata-intensive workload, but no data allocation operation. + # Because uncompleted new space allocation I/Os may cause XFS to shutdown + # after loading error table. + $FSSTRESS_PROG -z -n 5000 -p 10 \ + -f creat=10 \ + -f resvsp=1 \ + -f truncate=1 \ + -f punch=1 \ + -f chown=5 \ + -f mkdir=5 \ + -f rmdir=1 \ + -f mknod=1 \ + -f unlink=1 \ + -f symlink=1 \ + -f rename=1 \ + -d $SCRATCH_MNT/fsstress >> $seqres.full 2>&1 + + # Loading error table without "--nolockfs" option. Because "--nolockfs" + # won't freeze fs, then some running I/Os may cause XFS to shutdown + # prematurely. That's not what we want to test. + _dmerror_load_error_table lockfs + _dmerror_unmount + + # Mount again to replay log after loading working table, so we have a + # consistent XFS after test. + _dmerror_load_working_table + _dmerror_mount + _dmerror_unmount +} + +#### Test EIO/max_retries #### +# Set EIO/max_retries a limited number(>-1), then even if fail_at_unmount=0, +# the test won't hang. +echo "=== Test EIO/max_retries ===" +do_test error/metadata/EIO/max_retries + +#### Test EIO/retry_timeout_seconds #### +# Set EIO/retry_timeout_seconds to a limited number(>0), then even if +# fail_at_unmount=0, the test won't hang. +echo "=== Test EIO/retry_timeout_seconds ===" +do_test error/metadata/EIO/retry_timeout_seconds + +# success, all done +status=0 +exit diff --git a/tests/xfs/263.out b/tests/xfs/263.out new file mode 100644 index 0000000..714350f --- /dev/null +++ b/tests/xfs/263.out @@ -0,0 +1,21 @@ +QA output created by 263 +=== Test EIO/max_retries === +error/fail_at_unmount=1 +error/metadata/default/max_retries=-1 +error/metadata/default/retry_timeout_seconds=0 +error/metadata/EIO/max_retries=-1 +error/metadata/EIO/retry_timeout_seconds=0 +error/metadata/ENOSPC/max_retries=-1 +error/metadata/ENOSPC/retry_timeout_seconds=0 +error/fail_at_unmount=0 +error/metadata/EIO/max_retries=1 +=== Test EIO/retry_timeout_seconds === +error/fail_at_unmount=1 +error/metadata/default/max_retries=-1 +error/metadata/default/retry_timeout_seconds=0 +error/metadata/EIO/max_retries=-1 +error/metadata/EIO/retry_timeout_seconds=0 +error/metadata/ENOSPC/max_retries=-1 +error/metadata/ENOSPC/retry_timeout_seconds=0 +error/fail_at_unmount=0 +error/metadata/EIO/retry_timeout_seconds=1 diff --git a/tests/xfs/group b/tests/xfs/group index 6905a62..ec3c022 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -260,6 +260,7 @@ 260 auto quick quota 261 auto quick quota 262 auto quick quota +263 auto quick mount 265 auto clone 266 dump ioctl auto quick 267 dump ioctl tape -- 2.7.4 From darrick.wong@oracle.com Fri Aug 19 15:30:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3F0A07CA2 for ; Fri, 19 Aug 2016 15:30:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 121A88F8049 for ; Fri, 19 Aug 2016 13:30:35 -0700 (PDT) X-ASG-Debug-ID: 1471638629-0bf57b53128f0a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5rPrRPhs9KWaZEhS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 13:30:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7JKUSF8014923 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 19 Aug 2016 20:30:29 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7JKUSui000927 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 19 Aug 2016 20:30:28 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7JKUQVI026503; Fri, 19 Aug 2016 20:30:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 19 Aug 2016 13:30:26 -0700 Date: Fri, 19 Aug 2016 13:30:22 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH] xfs: don't perform lookups on zero-height btrees Message-ID: <20160819203022.GD8268@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs: don't perform lookups on zero-height btrees MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1471638630 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 739 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32157 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the caller passes in a cursor to a zero-height btree (which is impossible), we never set block to anything but NULL, which causes the later dereference of it to crash. Instead, just return -EFSCORRUPTED. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 64fd847..4bffea4 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -1814,6 +1814,10 @@ xfs_btree_lookup( XFS_BTREE_STATS_INC(cur, lookup); + /* No such thing as a zero-level tree. */ + if (cur->bc_nlevels == 0) + return -EFSCORRUPTED; + block = NULL; keyno = 0; From darrick.wong@oracle.com Fri Aug 19 15:32:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9529D7CA2 for ; Fri, 19 Aug 2016 15:32:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 598A5304048 for ; Fri, 19 Aug 2016 13:32:15 -0700 (PDT) X-ASG-Debug-ID: 1471638732-0bf8155c776efe0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id UgnHVMphLJRkPMTH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 13:32:13 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7JKWAfJ007836 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 19 Aug 2016 20:32:11 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7JKWA6v009146 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 19 Aug 2016 20:32:10 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7JKW9IC027154; Fri, 19 Aug 2016 20:32:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 19 Aug 2016 13:32:09 -0700 Date: Fri, 19 Aug 2016 13:32:07 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH] xfs: disallow mounting of realtime + rmap filesystems Message-ID: <20160819203207.GE8268@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs: disallow mounting of realtime + rmap filesystems MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1471638733 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 931 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32158 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since the kernel doesn't currently support the realtime rmapbt, don't allow such filesystems to be mounted. Support will appear in a future release. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_super.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 24ef83e..fd6be45 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1574,9 +1574,16 @@ xfs_fs_fill_super( } } - if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + if (mp->m_sb.sb_rblocks) { + xfs_alert(mp, + "EXPERIMENTAL reverse mapping btree not compatible with realtime device!"); + error = -EINVAL; + goto out_filestream_unmount; + } xfs_alert(mp, "EXPERIMENTAL reverse mapping btree feature enabled. Use at your own risk!"); + } error = xfs_mountfs(mp); if (error) From darrick.wong@oracle.com Fri Aug 19 16:54:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 04BAA7CA2 for ; Fri, 19 Aug 2016 16:54:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB647304039 for ; Fri, 19 Aug 2016 14:54:03 -0700 (PDT) X-ASG-Debug-ID: 1471643640-0bf57b531490b70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 9L8dj2uRXDnPxwgV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 14:54:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7JLrw22022908 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 19 Aug 2016 21:53:59 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7JLrvJj013901 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 19 Aug 2016 21:53:58 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7JLrufG021563; Fri, 19 Aug 2016 21:53:56 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 19 Aug 2016 14:53:56 -0700 Date: Fri, 19 Aug 2016 14:53:54 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: Eryu Guan , linux-btrfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 13/17] xfs: test swapext with reflink Message-ID: <20160819215354.GA15174@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 13/17] xfs: test swapext with reflink References: <146914477514.11762.3144320628851923350.stgit@birch.djwong.org> <146914485888.11762.1688573359701830686.stgit@birch.djwong.org> <20160808081359.GB27776@eguan.usersys.redhat.com> <20160808174132.GC11291@birch.djwong.org> <20160809062943.GF19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809062943.GF19025@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1471643641 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1126 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32160 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 09, 2016 at 04:29:43PM +1000, Dave Chinner wrote: > On Mon, Aug 08, 2016 at 10:41:32AM -0700, Darrick J. Wong wrote: > > On Mon, Aug 08, 2016 at 04:13:59PM +0800, Eryu Guan wrote: > > > On Thu, Jul 21, 2016 at 04:47:38PM -0700, Darrick J. Wong wrote: > > > > Add a few tests to stress the new swapext code for reflink and rmap. > > > > +_reflink_range "$testdir/file1" 0 "$testdir/file2" 0 $bytes >> "$seqres.full" > > > > + > > > > +echo "Defrag the big file" > > > > +old_nextents=$(xfs_io -c 'stat -v' $testdir/file1 | grep 'nextents' | cut -d ' ' -f 3) > > > > > > There's a "_count_extents" helper, does that work for this case? > > > > It can, though stat -v reports GETFSXATTR results, which should be faster than > > _count_extents because the latter FIEMAPs the entire file and counts lines. > > Seeing as XFS records the extent count in the inode, we might as well use it. > > perhaps put a special xfs case in _count_extents() that does this > rather than FIEMAP? Ok. Seems simple enough to do. --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From tireman@shaw.ca Fri Aug 19 23:09:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.3 required=5.0 tests=FR_ALMOST_VIAG2,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C231B7CA2 for ; Fri, 19 Aug 2016 23:09:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 933F7304032 for ; Fri, 19 Aug 2016 21:09:22 -0700 (PDT) X-ASG-Debug-ID: 1471666157-0bf57c55b175ad0001-NocioJ Received: from smtp-out-so.shaw.ca (smtp-out-so.shaw.ca [64.59.136.138]) by cuda.sgi.com with ESMTP id zLr90Trcpmy30BHk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 21:09:17 -0700 (PDT) X-Barracuda-Envelope-From: tireman@shaw.ca X-Barracuda-Effective-Source-IP: smtp-out-so.shaw.ca[64.59.136.138] X-Barracuda-Apparent-Source-IP: 64.59.136.138 Received: from [192.168.0.3] ([50.70.105.8]) by shaw.ca with SMTP id axatbzDAXeXEcaxaubrfLT; Fri, 19 Aug 2016 22:09:17 -0600 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=shaw.ca; s=s20150330; t=1471666157; bh=98BGx0s7RS/SONu/I7ZcFd899s1nnH0tqoLeBEkLydo=; h=To:From:Subject:Date; b=hRhVtqDyz0NtfEDg46xtbfysvo2ZB8KDCiNiHXyAPu+0QS3UdTk4l11efkrBi2RyJ TbxqZkmMTwqeMvPjiLB0edBcLkgogQbB21ac5jh2ryrnyCUTw6wR9vA3CzouaN1dMx WXLkCvOpIRxdr6igcAiwAbM3DaQ2VtB57DdnVAwaY1KGJ6DtqiConVymsb3NpDlJwn wnFPzhL38K5H7LHe3lmSF8OyOD1h26gZW8s+EorBYIIO8gtHSUtYzAUNjsNs4YWNqc wUPWC3Qf4Izpu2i/wrYhawPLHEmNr6X2GlymhNhBEyeobetjo+w6zXXLf1pXmxwvp7 zvqHcIBSS6z7A== X-Authority-Analysis: v=2.2 cv=T/3OdLCQ c=1 sm=1 tr=0 a=hFmf2t65jKVyazJCeB0mLw==:117 a=hFmf2t65jKVyazJCeB0mLw==:17 a=r77TgQKjGQsHNAKrUKIA:9 a=FKsUyVpX8rhJkn-nS58A:9 a=gIFxhdQ1mKFjHsB-P0YA:9 a=At4fTC-6BRvAaja1:21 a=mjp2egygE2rnY5xk:21 a=fSF57LeGWTkmNyUK:21 To: xfs@oss.sgi.com From: Andrew Ryder Subject: IRQ Lock Inversion dependency detected? Message-ID: <6b41c73b-9894-3076-670a-18c7247752b8@shaw.ca> X-ASG-Orig-Subj: IRQ Lock Inversion dependency detected? Date: Sat, 20 Aug 2016 00:09:24 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------FCDEAA802FAAAEFEF4C84CC8" X-CMAE-Envelope: MS4wfFqtyI4Cn5M/8v83g0Zd9W9UUIZUON56379DEeYrqQAD+6QImQ14q6r3BkmpZgvsQxb2crc85Hu8X30Y1j4dG1yiH3BJuHjHjKRiQZncjIctzDQ/AQdf yI7xI31RofmnUmrRUnDEMOPpvP6YZlGFK2rjNcpS8KjXLSMvEUHI+2DJ X-Barracuda-Connect: smtp-out-so.shaw.ca[64.59.136.138] X-Barracuda-Start-Time: 1471666157 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2443 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is a multi-part message in MIME format. --------------FCDEAA802FAAAEFEF4C84CC8 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Had this pop up sometime in the last 24 hours but it didn't seem to cause me any problems? Thought I'd pass it along if its of use or ignore them in the future? I've attached the full dmesg output also. [20653.098044] ========================================================= [20653.098044] [ INFO: possible irq lock inversion dependency detected ] [20653.098044] 3.19.8 #6 Tainted: G O [20653.098044] --------------------------------------------------------- [20653.098044] kswapd0/513 just changed the state of lock: [20653.098044] (&xfs_dir_ilock_class){++++-+}, at: [] xfs_ilock+0xb0/0x130 [20653.098044] but this lock took another, RECLAIM_FS-unsafe lock in the past: [20653.098044] (&mm->mmap_sem){++++++} and interrupts could create inverse lock ordering between them. [20653.098044] other info that might help us debug this: [20653.098044] Possible interrupt unsafe locking scenario: [20653.098044] CPU0 CPU1 [20653.098044] ---- ---- [20653.098044] lock(&mm->mmap_sem); [20653.098044] local_irq_disable(); [20653.098044] lock(&xfs_dir_ilock_class); [20653.098044] lock(&mm->mmap_sem); [20653.098044] [20653.098044] lock(&xfs_dir_ilock_class); [20653.098044] *** DEADLOCK *** [20653.098044] 3 locks held by kswapd0/513: [20653.098044] #0: (shrinker_rwsem){++++..}, at: [] shrink_node_slabs+0x43/0x3b0 [20653.098044] #1: (&type->s_umount_key#36){.+.+.+}, at: [] grab_super_passive+0x3f/0x90 [20653.098044] #2: (&pag->pag_ici_reclaim_lock){+.+...}, at: [] xfs_reclaim_inodes_ag+0xa2/0x3c0 [20653.214021] the shortest dependencies between 2nd lock and 1st lock: [20653.214021] -> (&mm->mmap_sem){++++++} ops: 1132789158 { [20653.214021] HARDIRQ-ON-W at: [20653.214021] [] __lock_acquire+0x9a3/0x2090 [20653.214021] [] lock_acquire+0xc3/0x170 [20653.214021] [] down_write+0x55/0xc0 [20653.214021] [] do_execveat_common.isra.33+0x2e0/0x7a0 --------------FCDEAA802FAAAEFEF4C84CC8 Content-Type: text/plain; charset=UTF-8; name="aug20_dmes_xfs_irq" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="aug20_dmes_xfs_irq" WyAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgY3B1c2V0ClsgICAg MC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdQpbICAgIDAuMDAwMDAw XSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBjcHVhY2N0ClsgICAgMC4wMDAwMDBdIExp bnV4IHZlcnNpb24gMy4xOS44IChyb290QExpdHRsZU1vdXRoKSAoZ2NjIHZlcnNpb24gNC45 LjMgKEdlbnRvbyA0LjkuMyBwMS41LCBwaWUtMC42LjQpICkgIzYgU01QIFRodSBBdWcgMTgg MTk6MjE6MDggRURUIDIwMTYKWyAgICAwLjAwMDAwMF0gQ29tbWFuZCBsaW5lOiBhdXRvIEJP T1RfSU1BR0U9My4xOS44IHJvIHJvb3Q9ODAzIHBjaT1ub21zaSBwY2llX2FzcG09b2ZmIGNv bnNvbGU9dHR5UzAsMTE1MjAwIGNvbnNvbGU9dHR5MApbICAgIDAuMDAwMDAwXSBlODIwOiBC SU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBtYXA6ClsgICAgMC4wMDAwMDBdIEJJT1MtZTgy MDogW21lbSAweDAwMDAwMDAwMDAwMDAwMDAtMHgwMDAwMDAwMDAwMDljZmZmXSB1c2FibGUK WyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAwMDA5ZDAwMC0weDAw MDAwMDAwMDAwOWZmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21l bSAweDAwMDAwMDAwMDAwZTAwMDAtMHgwMDAwMDAwMDAwMGZmZmZmXSByZXNlcnZlZApbICAg IDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDAwMTAwMDAwLTB4MDAwMDAw MDBjZmZiZmZmZl0gdXNhYmxlClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAw MDAwMDAwY2ZmYzAwMDAtMHgwMDAwMDAwMGNmZmNkZmZmXSBBQ1BJIGRhdGEKWyAgICAwLjAw MDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDBjZmZjZTAwMC0weDAwMDAwMDAwY2Zm ZWZmZmZdIEFDUEkgTlZTClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAw MDAwY2ZmZjAwMDAtMHgwMDAwMDAwMGNmZmZmZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAw XSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMGZlYzAwMDAwLTB4MDAwMDAwMDBmZWMwMGZm Zl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDBm ZWNjMDAwMC0weDAwMDAwMDAwZmVjYzBmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJ T1MtZTgyMDogW21lbSAweDAwMDAwMDAwZmVlMDAwMDAtMHgwMDAwMDAwMGZlZTAwZmZmXSBy ZXNlcnZlZApbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMGZmZjAw MDAwLTB4MDAwMDAwMDBmZmZmZmZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gQklPUy1l ODIwOiBbbWVtIDB4MDAwMDAwMDEwMDAwMDAwMC0weDAwMDAwMDAxZmZmZmZmZmZdIHVzYWJs ZQpbICAgIDAuMDAwMDAwXSBOWCAoRXhlY3V0ZSBEaXNhYmxlKSBwcm90ZWN0aW9uOiBhY3Rp dmUKWyAgICAwLjAwMDAwMF0gU01CSU9TIDIuNiBwcmVzZW50LgpbICAgIDAuMDAwMDAwXSBE TUk6IFZJQSB0ZWNobm9sb2d5IEluYy4gVlg5MDAvRUlUWC0zMDAyLCBCSU9TIEkyMTAwMTAx IDAyLzE0LzIwMTIKWyAgICAwLjAwMDAwMF0gZTgyMDogdXBkYXRlIFttZW0gMHgwMDAwMDAw MC0weDAwMDAwZmZmXSB1c2FibGUgPT0+IHJlc2VydmVkClsgICAgMC4wMDAwMDBdIGU4MjA6 IHJlbW92ZSBbbWVtIDB4MDAwYTAwMDAtMHgwMDBmZmZmZl0gdXNhYmxlClsgICAgMC4wMDAw MDBdIEFHUDogTm8gQUdQIGJyaWRnZSBmb3VuZApbICAgIDAuMDAwMDAwXSBlODIwOiBsYXN0 X3BmbiA9IDB4MjAwMDAwIG1heF9hcmNoX3BmbiA9IDB4NDAwMDAwMDAwClsgICAgMC4wMDAw MDBdIE1UUlIgZGVmYXVsdCB0eXBlOiB1bmNhY2hhYmxlClsgICAgMC4wMDAwMDBdIE1UUlIg Zml4ZWQgcmFuZ2VzIGVuYWJsZWQ6ClsgICAgMC4wMDAwMDBdICAgMDAwMDAtOUZGRkYgd3Jp dGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIEEwMDAwLURGRkZGIHVuY2FjaGFibGUKWyAgICAw LjAwMDAwMF0gICBFMDAwMC1FRkZGRiB3cml0ZS10aHJvdWdoClsgICAgMC4wMDAwMDBdICAg RjAwMDAtRkZGRkYgd3JpdGUtcHJvdGVjdApbICAgIDAuMDAwMDAwXSBNVFJSIHZhcmlhYmxl IHJhbmdlcyBlbmFibGVkOgpbICAgIDAuMDAwMDAwXSAgIDAgYmFzZSAwMDAwMDAwMDAgbWFz ayBFMDAwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIDEgYmFzZSAyMDAwMDAw MDAgbWFzayBGRjAwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIDIgYmFzZSAw RDAwMDAwMDAgbWFzayBGRjAwMDAwMDAgdW5jYWNoYWJsZQpbICAgIDAuMDAwMDAwXSAgIDMg YmFzZSAwRTAwMDAwMDAgbWFzayBGRTAwMDAwMDAgdW5jYWNoYWJsZQpbICAgIDAuMDAwMDAw XSAgIDQgYmFzZSAwRDAwMDAwMDAgbWFzayBGRjAwMDAwMDAgdW5jYWNoYWJsZQpbICAgIDAu MDAwMDAwXSAgIDUgZGlzYWJsZWQKWyAgICAwLjAwMDAwMF0gICA2IGRpc2FibGVkClsgICAg MC4wMDAwMDBdICAgNyBkaXNhYmxlZApbICAgIDAuMDAwMDAwXSBQQVQgY29uZmlndXJhdGlv biBbMC03XTogV0IgIFdDICBVQy0gVUMgIFdCICBXQyAgVUMtIFVDICAKWyAgICAwLjAwMDAw MF0gZTgyMDogdXBkYXRlIFttZW0gMHhkMDAwMDAwMC0weGZmZmZmZmZmXSB1c2FibGUgPT0+ IHJlc2VydmVkClsgICAgMC4wMDAwMDBdIGU4MjA6IGxhc3RfcGZuID0gMHhjZmZjMCBtYXhf YXJjaF9wZm4gPSAweDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSBmb3VuZCBTTVAgTVAtdGFi bGUgYXQgW21lbSAweDAwMGZmNzgwLTB4MDAwZmY3OGZdIG1hcHBlZCBhdCBbZmZmZjg4MDAw MDBmZjc4MF0KWyAgICAwLjAwMDAwMF0gU2Nhbm5pbmcgMSBhcmVhcyBmb3IgbG93IG1lbW9y eSBjb3JydXB0aW9uClsgICAgMC4wMDAwMDBdIEJhc2UgbWVtb3J5IHRyYW1wb2xpbmUgYXQg W2ZmZmY4ODAwMDAwOTcwMDBdIDk3MDAwIHNpemUgMjQ1NzYKWyAgICAwLjAwMDAwMF0gaW5p dF9tZW1vcnlfbWFwcGluZzogW21lbSAweDAwMDAwMDAwLTB4MDAwZmZmZmZdClsgICAgMC4w MDAwMDBdICBbbWVtIDB4MDAwMDAwMDAtMHgwMDBmZmZmZl0gcGFnZSA0awpbICAgIDAuMDAw MDAwXSBCUksgWzB4MDJkY2YwMDAsIDB4MDJkY2ZmZmZdIFBHVEFCTEUKWyAgICAwLjAwMDAw MF0gQlJLIFsweDAyZGQwMDAwLCAweDAyZGQwZmZmXSBQR1RBQkxFClsgICAgMC4wMDAwMDBd IEJSSyBbMHgwMmRkMTAwMCwgMHgwMmRkMWZmZl0gUEdUQUJMRQpbICAgIDAuMDAwMDAwXSBp bml0X21lbW9yeV9tYXBwaW5nOiBbbWVtIDB4MWZmZTAwMDAwLTB4MWZmZmZmZmZmXQpbICAg IDAuMDAwMDAwXSAgW21lbSAweDFmZmUwMDAwMC0weDFmZmZmZmZmZl0gcGFnZSAyTQpbICAg IDAuMDAwMDAwXSBCUksgWzB4MDJkZDIwMDAsIDB4MDJkZDJmZmZdIFBHVEFCTEUKWyAgICAw LjAwMDAwMF0gaW5pdF9tZW1vcnlfbWFwcGluZzogW21lbSAweDFlMDAwMDAwMC0weDFmZmRm ZmZmZl0KWyAgICAwLjAwMDAwMF0gIFttZW0gMHgxZTAwMDAwMDAtMHgxZmZkZmZmZmZdIHBh Z2UgMk0KWyAgICAwLjAwMDAwMF0gaW5pdF9tZW1vcnlfbWFwcGluZzogW21lbSAweDAwMTAw MDAwLTB4Y2ZmYmZmZmZdClsgICAgMC4wMDAwMDBdICBbbWVtIDB4MDAxMDAwMDAtMHgwMDFm ZmZmZl0gcGFnZSA0awpbICAgIDAuMDAwMDAwXSAgW21lbSAweDAwMjAwMDAwLTB4Y2ZkZmZm ZmZdIHBhZ2UgMk0KWyAgICAwLjAwMDAwMF0gIFttZW0gMHhjZmUwMDAwMC0weGNmZmJmZmZm XSBwYWdlIDRrClsgICAgMC4wMDAwMDBdIGluaXRfbWVtb3J5X21hcHBpbmc6IFttZW0gMHgx MDAwMDAwMDAtMHgxZGZmZmZmZmZdClsgICAgMC4wMDAwMDBdICBbbWVtIDB4MTAwMDAwMDAw LTB4MWRmZmZmZmZmXSBwYWdlIDJNClsgICAgMC4wMDAwMDBdIEJSSyBbMHgwMmRkMzAwMCwg MHgwMmRkM2ZmZl0gUEdUQUJMRQpbICAgIDAuMDAwMDAwXSBCUksgWzB4MDJkZDQwMDAsIDB4 MDJkZDRmZmZdIFBHVEFCTEUKWyAgICAwLjAwMDAwMF0gQUNQSTogRWFybHkgdGFibGUgY2hl Y2tzdW0gdmVyaWZpY2F0aW9uIGRpc2FibGVkClsgICAgMC4wMDAwMDBdIEFDUEk6IFJTRFAg MHgwMDAwMDAwMDAwMEY5MzcwIDAwMDAyNCAodjAyIEFDUElBTSkKWyAgICAwLjAwMDAwMF0g QUNQSTogWFNEVCAweDAwMDAwMDAwQ0ZGQzAxMDAgMDAwMDU0ICh2MDEgMDIxNDEyIFhTRFQx NDE2IDIwMTIwMjE0IE1TRlQgMDAwMDAwOTcpClsgICAgMC4wMDAwMDBdIEFDUEk6IEZBQ1Ag MHgwMDAwMDAwMENGRkMwMjkwIDAwMDBGNCAodjAzIDAyMTQxMiBGQUNQMTQxNiAyMDEyMDIx NCBNU0ZUIDAwMDAwMDk3KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBEU0RUIDB4MDAwMDAwMDBD RkZDMDRCMCAwMDRFOEEgKHYwMSBJMjEwMCAgSTIxMDAxMDEgMDAwMDAxMDEgSU5UTCAyMDA1 MTExNykKWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUyAweDAwMDAwMDAwQ0ZGQ0UwMDAgMDAw MDQwClsgICAgMC4wMDAwMDBdIEFDUEk6IEFQSUMgMHgwMDAwMDAwMENGRkMwMzkwIDAwMDA4 MiAodjAxIDAyMTQxMiBBUElDMTQxNiAyMDEyMDIxNCBNU0ZUIDAwMDAwMDk3KQpbICAgIDAu MDAwMDAwXSBBQ1BJOiBNQ0ZHIDB4MDAwMDAwMDBDRkZDMDQyMCAwMDAwM0MgKHYwMSAwMjE0 MTIgT0VNTUNGRyAgMjAxMjAyMTQgTVNGVCAwMDAwMDA5NykKWyAgICAwLjAwMDAwMF0gQUNQ STogV0RSVCAweDAwMDAwMDAwQ0ZGQzA0NjAgMDAwMDQ3ICh2MDEgMDIxNDEyIE9FTVdEUlQg IDIwMTIwMjE0IE1TRlQgMDAwMDAwOTcpClsgICAgMC4wMDAwMDBdIEFDUEk6IE9FTUIgMHgw MDAwMDAwMENGRkNFMDQwIDAwMDA4MiAodjAxIDAyMTQxMiBPRU1CMTQxNiAyMDEyMDIxNCBN U0ZUIDAwMDAwMDk3KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBIUEVUIDB4MDAwMDAwMDBDRkZD QTRCMCAwMDAwMzggKHYwMSAwMjE0MTIgVklBIEhQRVQgMjAxMjAyMTQgTVNGVCAwMDAwMDA5 NykKWyAgICAwLjAwMDAwMF0gQUNQSTogTG9jYWwgQVBJQyBhZGRyZXNzIDB4ZmVlMDAwMDAK WyAgICAwLjAwMDAwMF0gTm8gTlVNQSBjb25maWd1cmF0aW9uIGZvdW5kClsgICAgMC4wMDAw MDBdIEZha2luZyBhIG5vZGUgYXQgW21lbSAweDAwMDAwMDAwMDAwMDAwMDAtMHgwMDAwMDAw MWZmZmZmZmZmXQpbICAgIDAuMDAwMDAwXSBOT0RFX0RBVEEoMCkgYWxsb2NhdGVkIFttZW0g MHgxZmZmZjcwMDAtMHgxZmZmZmFmZmZdClsgICAgMC4wMDAwMDBdICBbZmZmZmVhMDAwMDAw MDAwMC1mZmZmZWEwMDA3ZmZmZmZmXSBQTUQgLT4gW2ZmZmY4ODAxZjgyMDAwMDAtZmZmZjg4 MDFmZjVmZmZmZl0gb24gbm9kZSAwClsgICAgMC4wMDAwMDBdIFpvbmUgcmFuZ2VzOgpbICAg IDAuMDAwMDAwXSAgIERNQSAgICAgIFttZW0gMHgwMDAwMTAwMC0weDAwZmZmZmZmXQpbICAg IDAuMDAwMDAwXSAgIERNQTMyICAgIFttZW0gMHgwMTAwMDAwMC0weGZmZmZmZmZmXQpbICAg IDAuMDAwMDAwXSAgIE5vcm1hbCAgIFttZW0gMHgxMDAwMDAwMDAtMHgxZmZmZmZmZmZdClsg ICAgMC4wMDAwMDBdIE1vdmFibGUgem9uZSBzdGFydCBmb3IgZWFjaCBub2RlClsgICAgMC4w MDAwMDBdIEVhcmx5IG1lbW9yeSBub2RlIHJhbmdlcwpbICAgIDAuMDAwMDAwXSAgIG5vZGUg ICAwOiBbbWVtIDB4MDAwMDEwMDAtMHgwMDA5Y2ZmZl0KWyAgICAwLjAwMDAwMF0gICBub2Rl ICAgMDogW21lbSAweDAwMTAwMDAwLTB4Y2ZmYmZmZmZdClsgICAgMC4wMDAwMDBdICAgbm9k ZSAgIDA6IFttZW0gMHgxMDAwMDAwMDAtMHgxZmZmZmZmZmZdClsgICAgMC4wMDAwMDBdIElu aXRtZW0gc2V0dXAgbm9kZSAwIFttZW0gMHgwMDAwMTAwMC0weDFmZmZmZmZmZl0KWyAgICAw LjAwMDAwMF0gT24gbm9kZSAwIHRvdGFscGFnZXM6IDE5MDAzODAKWyAgICAwLjAwMDAwMF0g ICBETUEgem9uZTogNjQgcGFnZXMgdXNlZCBmb3IgbWVtbWFwClsgICAgMC4wMDAwMDBdICAg RE1BIHpvbmU6IDIxIHBhZ2VzIHJlc2VydmVkClsgICAgMC4wMDAwMDBdICAgRE1BIHpvbmU6 IDM5OTYgcGFnZXMsIExJRk8gYmF0Y2g6MApbICAgIDAuMDAwMDAwXSAgIERNQTMyIHpvbmU6 IDEzMjQ3IHBhZ2VzIHVzZWQgZm9yIG1lbW1hcApbICAgIDAuMDAwMDAwXSAgIERNQTMyIHpv bmU6IDg0NzgwOCBwYWdlcywgTElGTyBiYXRjaDozMQpbICAgIDAuMDAwMDAwXSAgIE5vcm1h bCB6b25lOiAxNjM4NCBwYWdlcyB1c2VkIGZvciBtZW1tYXAKWyAgICAwLjAwMDAwMF0gICBO b3JtYWwgem9uZTogMTA0ODU3NiBwYWdlcywgTElGTyBiYXRjaDozMQpbICAgIDAuMDAwMDAw XSBMb29rcyBsaWtlIGEgVklBIGNoaXBzZXQuIERpc2FibGluZyBJT01NVS4gT3ZlcnJpZGUg d2l0aCBpb21tdT1hbGxvd2VkClsgICAgMC4wMDAwMDBdIEFDUEk6IFBNLVRpbWVyIElPIFBv cnQ6IDB4ODA4ClsgICAgMC4wMDAwMDBdIEFDUEk6IExvY2FsIEFQSUMgYWRkcmVzcyAweGZl ZTAwMDAwClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDFdIGxhcGlj X2lkWzB4MDBdIGVuYWJsZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lk WzB4MDJdIGxhcGljX2lkWzB4MDJdIGVuYWJsZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6IExB UElDIChhY3BpX2lkWzB4MDNdIGxhcGljX2lkWzB4ODJdIGRpc2FibGVkKQpbICAgIDAuMDAw MDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA0XSBsYXBpY19pZFsweDgzXSBkaXNhYmxl ZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogSU9BUElDIChpZFsweDAzXSBhZGRyZXNzWzB4ZmVj MDAwMDBdIGdzaV9iYXNlWzBdKQpbICAgIDAuMDAwMDAwXSBJT0FQSUNbMF06IGFwaWNfaWQg MywgdmVyc2lvbiAzLCBhZGRyZXNzIDB4ZmVjMDAwMDAsIEdTSSAwLTIzClsgICAgMC4wMDAw MDBdIEFDUEk6IElPQVBJQyAoaWRbMHgwNF0gYWRkcmVzc1sweGZlY2MwMDAwXSBnc2lfYmFz ZVsyNF0pClsgICAgMC4wMDAwMDBdIElPQVBJQ1sxXTogYXBpY19pZCA0LCB2ZXJzaW9uIDMs IGFkZHJlc3MgMHhmZWNjMDAwMCwgR1NJIDI0LTQ3ClsgICAgMC4wMDAwMDBdIEFDUEk6IElO VF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDAgZ2xvYmFsX2lycSAyIGRmbCBkZmwpClsgICAg MC4wMDAwMDBdIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2ly cSA5IGxvdyBsZXZlbCkKWyAgICAwLjAwMDAwMF0gQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAw IGJ1c19pcnEgMTAgZ2xvYmFsX2lycSAxMCBsb3cgbGV2ZWwpClsgICAgMC4wMDAwMDBdIEFD UEk6IElSUTAgdXNlZCBieSBvdmVycmlkZS4KWyAgICAwLjAwMDAwMF0gQUNQSTogSVJROSB1 c2VkIGJ5IG92ZXJyaWRlLgpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJUlExMCB1c2VkIGJ5IG92 ZXJyaWRlLgpbICAgIDAuMDAwMDAwXSBVc2luZyBBQ1BJIChNQURUKSBmb3IgU01QIGNvbmZp Z3VyYXRpb24gaW5mb3JtYXRpb24KWyAgICAwLjAwMDAwMF0gQUNQSTogSFBFVCBpZDogMHgx MTA2ODIwMSBiYXNlOiAweGZlZDAwMDAwClsgICAgMC4wMDAwMDBdIHNtcGJvb3Q6IEFsbG93 aW5nIDQgQ1BVcywgMiBob3RwbHVnIENQVXMKWyAgICAwLjAwMDAwMF0gZTgyMDogW21lbSAw eGQwMDAwMDAwLTB4ZmViZmZmZmZdIGF2YWlsYWJsZSBmb3IgUENJIGRldmljZXMKWyAgICAw LjAwMDAwMF0gc2V0dXBfcGVyY3B1OiBOUl9DUFVTOjY0IG5yX2NwdW1hc2tfYml0czo2NCBu cl9jcHVfaWRzOjQgbnJfbm9kZV9pZHM6MQpbICAgIDAuMDAwMDAwXSBQRVJDUFU6IEVtYmVk ZGVkIDQ3OCBwYWdlcy9jcHUgQGZmZmY4ODAxZjdhMDAwMDAgczE5MTgyNzIgcjgxOTIgZDMx NDI0IHUyMDk3MTUyClsgICAgMC4wMDAwMDBdIHBjcHUtYWxsb2M6IHMxOTE4MjcyIHI4MTky IGQzMTQyNCB1MjA5NzE1MiBhbGxvYz0xKjIwOTcxNTIKWyAgICAwLjAwMDAwMF0gcGNwdS1h bGxvYzogWzBdIDAgWzBdIDEgWzBdIDIgWzBdIDMgClsgICAgMC4wMDAwMDBdIEJ1aWx0IDEg em9uZWxpc3RzIGluIE5vZGUgb3JkZXIsIG1vYmlsaXR5IGdyb3VwaW5nIG9uLiAgVG90YWwg cGFnZXM6IDE4NzA2NjQKWyAgICAwLjAwMDAwMF0gUG9saWN5IHpvbmU6IE5vcm1hbApbICAg IDAuMDAwMDAwXSBLZXJuZWwgY29tbWFuZCBsaW5lOiBhdXRvIEJPT1RfSU1BR0U9My4xOS44 IHJvIHJvb3Q9ODAzIHBjaT1ub21zaSBwY2llX2FzcG09b2ZmIGNvbnNvbGU9dHR5UzAsMTE1 MjAwIGNvbnNvbGU9dHR5MApbICAgIDAuMDAwMDAwXSBQQ0llIEFTUE0gaXMgZGlzYWJsZWQK WyAgICAwLjAwMDAwMF0gUElEIGhhc2ggdGFibGUgZW50cmllczogNDA5NiAob3JkZXI6IDMs IDMyNzY4IGJ5dGVzKQpbICAgIDAuMDAwMDAwXSBNZW1vcnk6IDczNzc3MDBLLzc2MDE1MjBL IGF2YWlsYWJsZSAoNzA0Mksga2VybmVsIGNvZGUsIDk5NEsgcndkYXRhLCAyODMySyByb2Rh dGEsIDI3OTJLIGluaXQsIDE0NDE2SyBic3MsIDIyMzgyMEsgcmVzZXJ2ZWQsIDBLIGNtYS1y ZXNlcnZlZCkKWyAgICAwLjAwMDAwMF0gU0xVQjogSFdhbGlnbj02NCwgT3JkZXI9MC0zLCBN aW5PYmplY3RzPTAsIENQVXM9NCwgTm9kZXM9MQpbICAgIDAuMDAwMDAwXSBIaWVyYXJjaGlj YWwgUkNVIGltcGxlbWVudGF0aW9uLgpbICAgIDAuMDAwMDAwXSAJUkNVIHJlc3RyaWN0aW5n IENQVXMgZnJvbSBOUl9DUFVTPTY0IHRvIG5yX2NwdV9pZHM9NC4KWyAgICAwLjAwMDAwMF0g UkNVOiBBZGp1c3RpbmcgZ2VvbWV0cnkgZm9yIHJjdV9mYW5vdXRfbGVhZj0xNiwgbnJfY3B1 X2lkcz00ClsgICAgMC4wMDAwMDBdIE5SX0lSUVM6NDM1MiBucl9pcnFzOjg2NCAxNgpbICAg IDAuMDAwMDAwXSBDb25zb2xlOiBjb2xvdXIgVkdBKyA4MHgyNQpbICAgIDAuMDAwMDAwXSBj b25zb2xlIFt0dHkwXSBlbmFibGVkClsgICAgMC4wMDAwMDBdIGNvbnNvbGUgW3R0eVMwXSBl bmFibGVkClsgICAgMC4wMDAwMDBdIExvY2sgZGVwZW5kZW5jeSB2YWxpZGF0b3I6IENvcHly aWdodCAoYykgMjAwNiBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgpbICAgIDAuMDAwMDAw XSAuLi4gTUFYX0xPQ0tERVBfU1VCQ0xBU1NFUzogIDgKWyAgICAwLjAwMDAwMF0gLi4uIE1B WF9MT0NLX0RFUFRIOiAgICAgICAgICA0OApbICAgIDAuMDAwMDAwXSAuLi4gTUFYX0xPQ0tE RVBfS0VZUzogICAgICAgIDgxOTEKWyAgICAwLjAwMDAwMF0gLi4uIENMQVNTSEFTSF9TSVpF OiAgICAgICAgICA0MDk2ClsgICAgMC4wMDAwMDBdIC4uLiBNQVhfTE9DS0RFUF9FTlRSSUVT OiAgICAgMzI3NjgKWyAgICAwLjAwMDAwMF0gLi4uIE1BWF9MT0NLREVQX0NIQUlOUzogICAg ICA2NTUzNgpbICAgIDAuMDAwMDAwXSAuLi4gQ0hBSU5IQVNIX1NJWkU6ICAgICAgICAgIDMy NzY4ClsgICAgMC4wMDAwMDBdICBtZW1vcnkgdXNlZCBieSBsb2NrIGRlcGVuZGVuY3kgaW5m bzogODY3MSBrQgpbICAgIDAuMDAwMDAwXSAgcGVyIHRhc2stc3RydWN0IG1lbW9yeSBmb290 cHJpbnQ6IDI2ODggYnl0ZXMKWyAgICAwLjAwMDAwMF0gLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tClsgICAgMC4wMDAwMDBdIHwgTG9ja2luZyBBUEkgdGVzdHN1aXRlOgpbICAgIDAuMDAw MDAwXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClsgICAgMC4wMDAwMDBdICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgc3BpbiB8d2xvY2sgfHJsb2NrIHxtdXRleCB8IHdz ZW0gfCByc2VtIHwKWyAgICAwLjAwMDAwMF0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpbICAg IDAuMDAwMDAwXSAgICAgICAgICAgICAgICAgICAgICBBLUEgZGVhZGxvY2s6ICBvayAgfCAg b2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAgICAg ICAgICAgICAgICAgQS1CLUItQSBkZWFkbG9jazogIG9rICB8ICBvayAgfCAgb2sgIHwgIG9r ICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgICAgICAgIEEtQi1CLUMt Qy1BIGRlYWRsb2NrOiAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwgIG9rICB8ICBvayAg fApbICAgIDAuMDAwMDAwXSAgICAgICAgICAgICAgQS1CLUMtQS1CLUMgZGVhZGxvY2s6ICBv ayAgfCAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBd ICAgICAgICAgIEEtQi1CLUMtQy1ELUQtQSBkZWFkbG9jazogIG9rICB8ICBvayAgfCAgb2sg IHwgIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgICAgQS1CLUMt RC1CLUQtRC1BIGRlYWRsb2NrOiAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwgIG9rICB8 ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgICAgICBBLUItQy1ELUItQy1ELUEgZGVhZGxv Y2s6ICBvayAgfCAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4w MDAwMDBdICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHVubG9jazogIG9rICB8ICBvayAg fCAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgICAg ICAgICAgICAgaW5pdGlhbGl6ZSBoZWxkOiAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwg IG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgICAgICAgICAgICAgIGJhZCB1bmxv Y2sgb3JkZXI6ICBvayAgfCAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwgIG9rICB8Clsg ICAgMC4wMDAwMDBdICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KWyAgICAwLjAwMDAwMF0gICAg ICAgICAgICAgICByZWN1cnNpdmUgcmVhZC1sb2NrOiAgICAgICAgICAgICB8ICBvayAgfCAg ICAgICAgICAgICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgICAgICAgIHJlY3Vyc2l2 ZSByZWFkLWxvY2sgIzI6ICAgICAgICAgICAgIHwgIG9rICB8ICAgICAgICAgICAgIHwgIG9r ICB8ClsgICAgMC4wMDAwMDBdICAgICAgICAgICAgIG1peGVkIHJlYWQtd3JpdGUtbG9jazog ICAgICAgICAgICAgfCAgb2sgIHwgICAgICAgICAgICAgfCAgb2sgIHwKWyAgICAwLjAwMDAw MF0gICAgICAgICAgICAgbWl4ZWQgd3JpdGUtcmVhZC1sb2NrOiAgICAgICAgICAgICB8ICBv ayAgfCAgICAgICAgICAgICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tClsgICAgMC4wMDAwMDBdICAgICAgaGFyZC1pcnFzLW9uICsgaXJxLXNhZmUt QS8xMjogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICBzb2Z0LWly cXMtb24gKyBpcnEtc2FmZS1BLzEyOiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAw MDAwXSAgICAgIGhhcmQtaXJxcy1vbiArIGlycS1zYWZlLUEvMjE6ICBvayAgfCAgb2sgIHwg IG9rICB8ClsgICAgMC4wMDAwMDBdICAgICAgc29mdC1pcnFzLW9uICsgaXJxLXNhZmUtQS8y MTogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgIHNpcnEtc2Fm ZS1BID0+IGhpcnFzLW9uLzEyOiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAw XSAgICAgICAgc2lycS1zYWZlLUEgPT4gaGlycXMtb24vMjE6ICBvayAgfCAgb2sgIHwgIG9r ICB8ClsgICAgMC4wMDAwMDBdICAgICAgICAgIGhhcmQtc2FmZS1BICsgaXJxcy1vbi8xMjog IG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgICAgc29mdC1zYWZl LUEgKyBpcnFzLW9uLzEyOiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAg ICAgICAgICBoYXJkLXNhZmUtQSArIGlycXMtb24vMjE6ICBvayAgfCAgb2sgIHwgIG9rICB8 ClsgICAgMC4wMDAwMDBdICAgICAgICAgIHNvZnQtc2FmZS1BICsgaXJxcy1vbi8yMTogIG9r ICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgIGhhcmQtc2FmZS1BICsgdW5z YWZlLUIgIzEvMTIzOiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAg c29mdC1zYWZlLUEgKyB1bnNhZmUtQiAjMS8xMjM6ICBvayAgfCAgb2sgIHwgIG9rICB8Clsg ICAgMC4wMDAwMDBdICAgICBoYXJkLXNhZmUtQSArIHVuc2FmZS1CICMxLzEzMjogIG9rICB8 ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgIHNvZnQtc2FmZS1BICsgdW5zYWZl LUIgIzEvMTMyOiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgaGFy ZC1zYWZlLUEgKyB1bnNhZmUtQiAjMS8yMTM6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAg MC4wMDAwMDBdICAgICBzb2Z0LXNhZmUtQSArIHVuc2FmZS1CICMxLzIxMzogIG9rICB8ICBv ayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgIGhhcmQtc2FmZS1BICsgdW5zYWZlLUIg IzEvMjMxOiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgc29mdC1z YWZlLUEgKyB1bnNhZmUtQiAjMS8yMzE6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4w MDAwMDBdICAgICBoYXJkLXNhZmUtQSArIHVuc2FmZS1CICMxLzMxMjogIG9rICB8ICBvayAg fCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgIHNvZnQtc2FmZS1BICsgdW5zYWZlLUIgIzEv MzEyOiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgaGFyZC1zYWZl LUEgKyB1bnNhZmUtQiAjMS8zMjE6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAw MDBdICAgICBzb2Z0LXNhZmUtQSArIHVuc2FmZS1CICMxLzMyMTogIG9rICB8ICBvayAgfCAg b2sgIHwKWyAgICAwLjAwMDAwMF0gICAgIGhhcmQtc2FmZS1BICsgdW5zYWZlLUIgIzIvMTIz OiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgc29mdC1zYWZlLUEg KyB1bnNhZmUtQiAjMi8xMjM6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBd ICAgICBoYXJkLXNhZmUtQSArIHVuc2FmZS1CICMyLzEzMjogIG9rICB8ICBvayAgfCAgb2sg IHwKWyAgICAwLjAwMDAwMF0gICAgIHNvZnQtc2FmZS1BICsgdW5zYWZlLUIgIzIvMTMyOiAg b2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgaGFyZC1zYWZlLUEgKyB1 bnNhZmUtQiAjMi8yMTM6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAg ICBzb2Z0LXNhZmUtQSArIHVuc2FmZS1CICMyLzIxMzogIG9rICB8ICBvayAgfCAgb2sgIHwK WyAgICAwLjAwMDAwMF0gICAgIGhhcmQtc2FmZS1BICsgdW5zYWZlLUIgIzIvMjMxOiAgb2sg IHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgc29mdC1zYWZlLUEgKyB1bnNh ZmUtQiAjMi8yMzE6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAgICBo YXJkLXNhZmUtQSArIHVuc2FmZS1CICMyLzMxMjogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAg ICAwLjAwMDAwMF0gICAgIHNvZnQtc2FmZS1BICsgdW5zYWZlLUIgIzIvMzEyOiAgb2sgIHwg IG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgaGFyZC1zYWZlLUEgKyB1bnNhZmUt QiAjMi8zMjE6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAgICBzb2Z0 LXNhZmUtQSArIHVuc2FmZS1CICMyLzMyMTogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAw LjAwMDAwMF0gICAgICAgaGFyZC1pcnEgbG9jay1pbnZlcnNpb24vMTIzOiAgb2sgIHwgIG9r ICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgICBzb2Z0LWlycSBsb2NrLWludmVyc2lv bi8xMjM6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAgICAgIGhhcmQt aXJxIGxvY2staW52ZXJzaW9uLzEzMjogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAw MDAwMF0gICAgICAgc29mdC1pcnEgbG9jay1pbnZlcnNpb24vMTMyOiAgb2sgIHwgIG9rICB8 ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgICBoYXJkLWlycSBsb2NrLWludmVyc2lvbi8y MTM6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAgICAgIHNvZnQtaXJx IGxvY2staW52ZXJzaW9uLzIxMzogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAw MF0gICAgICAgaGFyZC1pcnEgbG9jay1pbnZlcnNpb24vMjMxOiAgb2sgIHwgIG9rICB8ICBv ayAgfApbICAgIDAuMDAwMDAwXSAgICAgICBzb2Z0LWlycSBsb2NrLWludmVyc2lvbi8yMzE6 ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAgICAgIGhhcmQtaXJxIGxv Y2staW52ZXJzaW9uLzMxMjogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0g ICAgICAgc29mdC1pcnEgbG9jay1pbnZlcnNpb24vMzEyOiAgb2sgIHwgIG9rICB8ICBvayAg fApbICAgIDAuMDAwMDAwXSAgICAgICBoYXJkLWlycSBsb2NrLWludmVyc2lvbi8zMjE6ICBv ayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAgICAgIHNvZnQtaXJxIGxvY2st aW52ZXJzaW9uLzMyMTogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAg ICAgaGFyZC1pcnEgcmVhZC1yZWN1cnNpb24vMTIzOiAgb2sgIHwKWyAgICAwLjAwMDAwMF0g ICAgICAgc29mdC1pcnEgcmVhZC1yZWN1cnNpb24vMTIzOiAgb2sgIHwKWyAgICAwLjAwMDAw MF0gICAgICAgaGFyZC1pcnEgcmVhZC1yZWN1cnNpb24vMTMyOiAgb2sgIHwKWyAgICAwLjAw MDAwMF0gICAgICAgc29mdC1pcnEgcmVhZC1yZWN1cnNpb24vMTMyOiAgb2sgIHwKWyAgICAw LjAwMDAwMF0gICAgICAgaGFyZC1pcnEgcmVhZC1yZWN1cnNpb24vMjEzOiAgb2sgIHwKWyAg ICAwLjAwMDAwMF0gICAgICAgc29mdC1pcnEgcmVhZC1yZWN1cnNpb24vMjEzOiAgb2sgIHwK WyAgICAwLjAwMDAwMF0gICAgICAgaGFyZC1pcnEgcmVhZC1yZWN1cnNpb24vMjMxOiAgb2sg IHwKWyAgICAwLjAwMDAwMF0gICAgICAgc29mdC1pcnEgcmVhZC1yZWN1cnNpb24vMjMxOiAg b2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgaGFyZC1pcnEgcmVhZC1yZWN1cnNpb24vMzEy OiAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgc29mdC1pcnEgcmVhZC1yZWN1cnNpb24v MzEyOiAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgaGFyZC1pcnEgcmVhZC1yZWN1cnNp b24vMzIxOiAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgc29mdC1pcnEgcmVhZC1yZWN1 cnNpb24vMzIxOiAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQpbICAgIDAuMDAwMDAwXSAgIHwgV291bmQvd2FpdCB0ZXN0cyB8ClsgICAgMC4wMDAwMDBd ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tClsgICAgMC4wMDAwMDBdICAgICAgICAgICAgICAg ICAgIHd3IGFwaSBmYWlsdXJlczogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAw MF0gICAgICAgICAgICAgICAgd3cgY29udGV4dHMgbWl4aW5nOiAgb2sgIHwgIG9rICB8Clsg ICAgMC4wMDAwMDBdICAgICAgICAgICAgICBmaW5pc2hpbmcgd3cgY29udGV4dDogIG9rICB8 ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAgMC4wMDAwMDBdICAgICAgICAgICAgICAgIGxv Y2tpbmcgbWlzbWF0Y2hlczogIG9rICB8ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0g ICAgICAgICAgICAgICAgICBFREVBRExLIGhhbmRsaW5nOiAgb2sgIHwgIG9rICB8ICBvayAg fCAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwgIG9rICB8ICBvayAgfCAgb2sgIHwKWyAg ICAwLjAwMDAwMF0gICAgICAgICAgICBzcGlubG9jayBuZXN0IHVubG9ja2VkOiAgb2sgIHwK WyAgICAwLjAwMDAwMF0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQpbICAgIDAuMDAwMDAwXSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8YmxvY2sgfCB0cnkgIHxjb250ZXh0fApbICAgIDAuMDAwMDAwXSAgIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClsg ICAgMC4wMDAwMDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogIG9rICB8 ICBvayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdHJ5OiAgb2sgIHwgIG9rICB8ICBvayAgfApbICAgIDAuMDAwMDAwXSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYmxvY2s6ICBvayAgfCAgb2sgIHwgIG9rICB8ClsgICAg MC4wMDAwMDBdICAgICAgICAgICAgICAgICAgICAgICAgICBzcGlubG9jazogIG9rICB8ICBv ayAgfCAgb2sgIHwKWyAgICAwLjAwMDAwMF0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpbICAgIDAuMDAwMDAwXSBHb29kLCBhbGwg MjUzIHRlc3RjYXNlcyBwYXNzZWQhIHwKWyAgICAwLjAwMDAwMF0gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tClsgICAgMC4wMDAwMDBdIGhwZXQgY2xvY2tldmVudCByZWdp c3RlcmVkClsgICAgMC4wMDAwMDBdIHRzYzogRmFzdCBUU0MgY2FsaWJyYXRpb24gdXNpbmcg UElUClsgICAgMC4wMDAwMDBdIHRzYzogRGV0ZWN0ZWQgMTYwMC4wMTIgTUh6IHByb2Nlc3Nv cgpbICAgIDAuMDAyMDA4XSBDYWxpYnJhdGluZyBkZWxheSBsb29wIChza2lwcGVkKSwgdmFs dWUgY2FsY3VsYXRlZCB1c2luZyB0aW1lciBmcmVxdWVuY3kuLiAzMjAwLjAyIEJvZ29NSVBT IChscGo9MTYwMDAxMikKWyAgICAwLjAwMjQ2OF0gcGlkX21heDogZGVmYXVsdDogMzI3Njgg bWluaW11bTogMzAxClsgICAgMC4wMDI3MTJdIEFDUEk6IENvcmUgcmV2aXNpb24gMjAxNDEx MDcKWyAgICAwLjAyNTI0Nl0gQUNQSTogQWxsIEFDUEkgVGFibGVzIHN1Y2Nlc3NmdWxseSBh Y3F1aXJlZApbICAgIDAuMDI2MjgwXSBTZWN1cml0eSBGcmFtZXdvcmsgaW5pdGlhbGl6ZWQK WyAgICAwLjAyNjQ3OF0gU0VMaW51eDogIEluaXRpYWxpemluZy4KWyAgICAwLjAyNjc5Ml0g U0VMaW51eDogIFN0YXJ0aW5nIGluIHBlcm1pc3NpdmUgbW9kZQpbICAgIDAuMDMyNzI4XSBE ZW50cnkgY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAxMDQ4NTc2IChvcmRlcjogMTEsIDgz ODg2MDggYnl0ZXMpClsgICAgMC4wNDA1ODhdIElub2RlLWNhY2hlIGhhc2ggdGFibGUgZW50 cmllczogNTI0Mjg4IChvcmRlcjogMTAsIDQxOTQzMDQgYnl0ZXMpClsgICAgMC4wNDMzNzZd IE1vdW50LWNhY2hlIGhhc2ggdGFibGUgZW50cmllczogMTYzODQgKG9yZGVyOiA1LCAxMzEw NzIgYnl0ZXMpClsgICAgMC4wNDM3NTVdIE1vdW50cG9pbnQtY2FjaGUgaGFzaCB0YWJsZSBl bnRyaWVzOiAxNjM4NCAob3JkZXI6IDUsIDEzMTA3MiBieXRlcykKWyAgICAwLjA0NzQzM10g SW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgZnJlZXplcgpbICAgIDAuMDQ3Nzg0XSBDUFU6 IFBoeXNpY2FsIFByb2Nlc3NvciBJRDogMApbICAgIDAuMDQ3OTczXSBDUFU6IFByb2Nlc3Nv ciBDb3JlIElEOiAwClsgICAgMC4wNDgwMDldIG1jZTogQ1BVIHN1cHBvcnRzIDAgTUNFIGJh bmtzClsgICAgMC4wNDgyMDRdIExhc3QgbGV2ZWwgaVRMQiBlbnRyaWVzOiA0S0IgMCwgMk1C IDAsIDRNQiAwCiAgICAgICAgICAgICAgIExhc3QgbGV2ZWwgZFRMQiBlbnRyaWVzOiA0S0Ig MCwgMk1CIDAsIDRNQiAwLCAxR0IgMApbICAgIDAuMDQ5MzI2XSBGcmVlaW5nIFNNUCBhbHRl cm5hdGl2ZXMgbWVtb3J5OiAyNEsgKGZmZmZmZmZmODFmYjQwMDAgLSBmZmZmZmZmZjgxZmJh MDAwKQpbICAgIDAuMDUyMDAwXSAuLlRJTUVSOiB2ZWN0b3I9MHgzMCBhcGljMT0wIHBpbjE9 MiBhcGljMj0tMSBwaW4yPS0xClsgICAgMC4wNjIzMjVdIHNtcGJvb3Q6IENQVTA6IENlbnRh dXIgVklBIE5hbm8gWDIgTDQzNTAgQCAxLjYrIEdIeiAoZmFtOiAwNiwgbW9kZWw6IDBmLCBz dGVwcGluZzogMGMpClsgICAgMC4wNjMwMDBdIFBlcmZvcm1hbmNlIEV2ZW50czogbm8gUE1V IGRyaXZlciwgc29mdHdhcmUgZXZlbnRzIG9ubHkuClsgICAgMC4wNjUzMzhdIE5NSSB3YXRj aGRvZzogZGlzYWJsZWQgKGNwdTApOiBoYXJkd2FyZSBldmVudHMgbm90IGVuYWJsZWQKWyAg ICAwLjA2NjkzMl0geDg2OiBCb290aW5nIFNNUCBjb25maWd1cmF0aW9uOgpbICAgIDAuMDY3 MDA4XSAuLi4uIG5vZGUgICMwLCBDUFVzOiAgICAgICMxClsgICAgMC4wMDMwMDBdIG1jZTog Q1BVIHN1cHBvcnRzIDAgTUNFIGJhbmtzClsgICAgMC4wODAwMThdIHg4NjogQm9vdGVkIHVw IDEgbm9kZSwgMiBDUFVzClsgICAgMC4wODAyNDVdIC0tLS0tLS0tLS0tLS0tLS0KWyAgICAw LjA4MDM5M10gfCBOTUkgdGVzdHN1aXRlOgpbICAgIDAuMDgwNTQxXSAtLS0tLS0tLS0tLS0t LS0tLS0tLQpbICAgIDAuMDgwNzAxXSAgIHJlbW90ZSBJUEk6ICBvayAgfApbICAgIDAuMDg1 MjAxXSAgICBsb2NhbCBJUEk6ICBvayAgfApbICAgIDAuMDk3MDIwXSAtLS0tLS0tLS0tLS0t LS0tLS0tLQpbICAgIDAuMDk3MTgyXSBHb29kLCBhbGwgICAyIHRlc3RjYXNlcyBwYXNzZWQh IHwKWyAgICAwLjA5NzM4MF0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClsg ICAgMC4wOTc1ODBdIHNtcGJvb3Q6IFRvdGFsIG9mIDIgcHJvY2Vzc29ycyBhY3RpdmF0ZWQg KDY0MDAuMDQgQm9nb01JUFMpClsgICAgMC4xMDIzMTFdIGRldnRtcGZzOiBpbml0aWFsaXpl ZApbICAgIDAuMTA1ODI2XSB4b3I6IG1lYXN1cmluZyBzb2Z0d2FyZSBjaGVja3N1bSBzcGVl ZApbICAgIDAuMTE2MDA3XSAgICBwcmVmZXRjaDY0LXNzZTogIDU1NDguMDAwIE1CL3NlYwpb ICAgIDAuMTI2MDA3XSAgICBnZW5lcmljX3NzZTogIDQ2OTIuMDAwIE1CL3NlYwpbICAgIDAu MTI2MjAyXSB4b3I6IHVzaW5nIGZ1bmN0aW9uOiBwcmVmZXRjaDY0LXNzZSAoNTU0OC4wMDAg TUIvc2VjKQpbICAgIDAuMTI3NDgyXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5 IDE2ClsgICAgMC4xMzAwNTFdIGkyYy1jb3JlOiBkcml2ZXIgW2R1bW15XSByZWdpc3RlcmVk ClsgICAgMC4xMzcwNDVdIGNwdWlkbGU6IHVzaW5nIGdvdmVybm9yIGxhZGRlcgpbICAgIDAu MTQzMDMxXSBjcHVpZGxlOiB1c2luZyBnb3Zlcm5vciBtZW51ClsgICAgMC4xNDM0ODRdIEFD UEk6IGJ1cyB0eXBlIFBDSSByZWdpc3RlcmVkClsgICAgMC4xNDQyNzhdIFBDSTogTU1DT05G SUcgZm9yIGRvbWFpbiAwMDAwIFtidXMgMDAtZmZdIGF0IFttZW0gMHhlMDAwMDAwMC0weGVm ZmZmZmZmXSAoYmFzZSAweGUwMDAwMDAwKQpbICAgIDAuMTQ0NjYyXSBQQ0k6IG5vdCB1c2lu ZyBNTUNPTkZJRwpbICAgIDAuMTQ0ODMzXSBQQ0k6IFVzaW5nIGNvbmZpZ3VyYXRpb24gdHlw ZSAxIGZvciBiYXNlIGFjY2VzcwpbICAgIDAuMjA0MDMxXSByYWlkNjogc3NlMngxICAgIDMy NjEgTUIvcwpbICAgIDAuMjIxMDI1XSByYWlkNjogc3NlMngyICAgIDMyODEgTUIvcwpbICAg IDAuMjM4MDIyXSByYWlkNjogc3NlMng0ICAgIDMyNjkgTUIvcwpbICAgIDAuMjM4MjAxXSBy YWlkNjogdXNpbmcgYWxnb3JpdGhtIHNzZTJ4MiAoMzI4MSBNQi9zKQpbICAgIDAuMjM4NDIy XSByYWlkNjogdXNpbmcgc3NzZTN4MiByZWNvdmVyeSBhbGdvcml0aG0KWyAgICAwLjIzODc1 N10gaTJjLWNvcmU6IGRyaXZlciBbc3gxNTB4XSByZWdpc3RlcmVkClsgICAgMC4yMzkwMjRd IEFDUEk6IEFkZGVkIF9PU0koTW9kdWxlIERldmljZSkKWyAgICAwLjIzOTIyMl0gQUNQSTog QWRkZWQgX09TSShQcm9jZXNzb3IgRGV2aWNlKQpbICAgIDAuMjM5NDI1XSBBQ1BJOiBBZGRl ZCBfT1NJKDMuMCBfU0NQIEV4dGVuc2lvbnMpClsgICAgMC4yMzk2MzhdIEFDUEk6IEFkZGVk IF9PU0koUHJvY2Vzc29yIEFnZ3JlZ2F0b3IgRGV2aWNlKQpbICAgIDAuMjc4NTY3XSBBQ1BJ OiBFeGVjdXRlZCAxIGJsb2NrcyBvZiBtb2R1bGUtbGV2ZWwgZXhlY3V0YWJsZSBBTUwgY29k ZQpbICAgIDAuMjk1MzE2XSBBQ1BJOiBJbnRlcnByZXRlciBlbmFibGVkClsgICAgMC4yOTU1 MjJdIEFDUEk6IChzdXBwb3J0cyBTMCBTNSkKWyAgICAwLjI5NTY5MF0gQUNQSTogVXNpbmcg SU9BUElDIGZvciBpbnRlcnJ1cHQgcm91dGluZwpbICAgIDAuMjk2MDUyXSBQQ0k6IE1NQ09O RklHIGZvciBkb21haW4gMDAwMCBbYnVzIDAwLWZmXSBhdCBbbWVtIDB4ZTAwMDAwMDAtMHhl ZmZmZmZmZl0gKGJhc2UgMHhlMDAwMDAwMCkKWyAgICAwLjI5NjYxNF0gUENJOiBNTUNPTkZJ RyBhdCBbbWVtIDB4ZTAwMDAwMDAtMHhlZmZmZmZmZl0gcmVzZXJ2ZWQgaW4gQUNQSSBtb3Ro ZXJib2FyZCByZXNvdXJjZXMKWyAgICAwLjI5ODI3MV0gUENJOiBVc2luZyBob3N0IGJyaWRn ZSB3aW5kb3dzIGZyb20gQUNQSTsgaWYgbmVjZXNzYXJ5LCB1c2UgInBjaT1ub2NycyIgYW5k IHJlcG9ydCBhIGJ1ZwpbICAgIDAuMzgxOTgzXSBBQ1BJOiBQQ0kgUm9vdCBCcmlkZ2UgW1BD STBdIChkb21haW4gMDAwMCBbYnVzIDAwLWZmXSkKWyAgICAwLjM4MjAyMF0gYWNwaSBQTlAw QTA4OjAwOiBfT1NDOiBPUyBzdXBwb3J0cyBbRXh0ZW5kZWRDb25maWcgU2VnbWVudHNdClsg ICAgMC4zODM1NzJdIGFjcGkgUE5QMEEwODowMDogX09TQzogbm90IHJlcXVlc3RpbmcgT1Mg Y29udHJvbDsgT1MgcmVxdWlyZXMgW0V4dGVuZGVkQ29uZmlnIEFTUE0gQ2xvY2tQTSBNU0ld ClsgICAgMC4zODU5NDJdIGFjcGkgUE5QMEEwODowMDogaWdub3JpbmcgaG9zdCBicmlkZ2Ug d2luZG93IFttZW0gMHgwMDBkMDAwMC0weDAwMGRmZmZmXSAoY29uZmxpY3RzIHdpdGggQWRh cHRlciBST00gW21lbSAweDAwMGNlODAwLTB4MDAwZDM3ZmZdKQpbICAgIDAuMzg2NTAyXSBQ Q0kgaG9zdCBicmlkZ2UgdG8gYnVzIDAwMDA6MDAKWyAgICAwLjM4NzAxNV0gcGNpX2J1cyAw MDAwOjAwOiByb290IGJ1cyByZXNvdXJjZSBbYnVzIDAwLWZmXQpbICAgIDAuMzg3MjU0XSBw Y2lfYnVzIDAwMDA6MDA6IHJvb3QgYnVzIHJlc291cmNlIFtpbyAgMHgwMDAwLTB4MGNmN10K WyAgICAwLjM4NzUxNV0gcGNpX2J1cyAwMDAwOjAwOiByb290IGJ1cyByZXNvdXJjZSBbaW8g IDB4MGQwMC0weGZmZmZdClsgICAgMC4zODc3NzldIHBjaV9idXMgMDAwMDowMDogcm9vdCBi dXMgcmVzb3VyY2UgW21lbSAweDAwMGEwMDAwLTB4MDAwYmZmZmZdClsgICAgMC4zODgwMDhd IHBjaV9idXMgMDAwMDowMDogcm9vdCBidXMgcmVzb3VyY2UgW21lbSAweGQwMDAwMDAwLTB4 ZGZmZmZmZmZdClsgICAgMC4zODgyOTRdIHBjaV9idXMgMDAwMDowMDogcm9vdCBidXMgcmVz b3VyY2UgW21lbSAweGYwMDAwMDAwLTB4ZmViZmZmZmZdClsgICAgMC4zODg3NDJdIHBjaSAw MDAwOjAwOjAwLjA6IFsxMTA2OjA0MTBdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAw LjM5MDA0MV0gcGNpIDAwMDA6MDA6MDAuMTogWzExMDY6MTQxMF0gdHlwZSAwMCBjbGFzcyAw eDA2MDAwMApbICAgIDAuMzkxMDc2XSBwY2kgMDAwMDowMDowMC4yOiBbMTEwNjoyNDEwXSB0 eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMC4zOTIwMTZdIHBjaSAwMDAwOjAwOjAwLjM6 IFsxMTA2OjM0MTBdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAwLjM5MjkzOV0gcGNp IDAwMDA6MDA6MDAuNDogWzExMDY6NDQxMF0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAg IDAuMzkzODgyXSBwY2kgMDAwMDowMDowMC41OiBbMTEwNjo1NDEwXSB0eXBlIDAwIGNsYXNz IDB4MDYwMDAwClsgICAgMC4zOTQ4MjFdIHBjaSAwMDAwOjAwOjAwLjY6IFsxMTA2OjY0MTBd IHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAwLjM5NTc2OF0gcGNpIDAwMDA6MDA6MDAu NzogWzExMDY6NzQxMF0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAgIDAuMzk2NzMyXSBw Y2kgMDAwMDowMDowMS4wOiBbMTEwNjo3MTIyXSB0eXBlIDAwIGNsYXNzIDB4MDMwMDAwClsg ICAgMC4zOTY3ODhdIHBjaSAwMDAwOjAwOjAxLjA6IHJlZyAweDEwOiBbbWVtIDB4ZmIwMDAw MDAtMHhmYmZmZmZmZl0KWyAgICAwLjM5NjgxN10gcGNpIDAwMDA6MDA6MDEuMDogcmVnIDB4 MTQ6IFttZW0gMHhmYzAwMDAwMC0weGZjZmZmZmZmXQpbICAgIDAuMzk2ODQ2XSBwY2kgMDAw MDowMDowMS4wOiByZWcgMHgxODogW21lbSAweGQwMDAwMDAwLTB4ZGZmZmZmZmYgcHJlZl0K WyAgICAwLjM5NjkzNV0gcGNpIDAwMDA6MDA6MDEuMDogcmVnIDB4MzA6IFttZW0gMHhmZThm MDAwMC0weGZlOGZmZmZmIHByZWZdClsgICAgMC4zOTcwNzNdIHBjaSAwMDAwOjAwOjAxLjA6 IHN1cHBvcnRzIEQxIEQyClsgICAgMC4zOTc4NzldIHBjaSAwMDAwOjAwOjAxLjE6IFsxMTA2 OjkxNzBdIHR5cGUgMDAgY2xhc3MgMHgwNDAzMDAKWyAgICAwLjM5NzkzM10gcGNpIDAwMDA6 MDA6MDEuMTogcmVnIDB4MTA6IFttZW0gMHhmZThlYzAwMC0weGZlOGVmZmZmXQpbICAgIDAu Mzk4MTk4XSBwY2kgMDAwMDowMDowMS4xOiBzdXBwb3J0cyBEMSBEMgpbICAgIDAuMzk5MDM5 XSBwY2kgMDAwMDowMDowMy4wOiBbMTEwNjphNDEwXSB0eXBlIDAxIGNsYXNzIDB4MDYwNDAw ClsgICAgMC4zOTkzNDddIHBjaSAwMDAwOjAwOjAzLjA6IFBNRSMgc3VwcG9ydGVkIGZyb20g RDAgRDNob3QgRDNjb2xkClsgICAgMC40MDAyOTddIHBjaSAwMDAwOjAwOjAzLjE6IFsxMTA2 OmI0MTBdIHR5cGUgMDEgY2xhc3MgMHgwNjA0MDAKWyAgICAwLjQwMDYwNF0gcGNpIDAwMDA6 MDA6MDMuMTogUE1FIyBzdXBwb3J0ZWQgZnJvbSBEMCBEM2hvdCBEM2NvbGQKWyAgICAwLjQw MTQzOF0gcGNpIDAwMDA6MDA6MDMuMjogWzExMDY6YzQxMF0gdHlwZSAwMSBjbGFzcyAweDA2 MDQwMApbICAgIDAuNDAxNzQ0XSBwY2kgMDAwMDowMDowMy4yOiBQTUUjIHN1cHBvcnRlZCBm cm9tIEQwIEQzaG90IEQzY29sZApbICAgIDAuNDAyNTgwXSBwY2kgMDAwMDowMDowMy4zOiBb MTEwNjpkNDEwXSB0eXBlIDAxIGNsYXNzIDB4MDYwNDAwClsgICAgMC40MDI4NjddIHBjaSAw MDAwOjAwOjAzLjM6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDNob3QgRDNjb2xkClsgICAg MC40MDM2ODNdIHBjaSAwMDAwOjAwOjAzLjQ6IFsxMTA2OmU0MTBdIHR5cGUgMDAgY2xhc3Mg MHgwNjAwMDAKWyAgICAwLjQwNDY2N10gcGNpIDAwMDA6MDA6MGYuMDogWzExMDY6OTAwMV0g dHlwZSAwMCBjbGFzcyAweDAxMDE4ZgpbICAgIDAuNDA0NzE5XSBwY2kgMDAwMDowMDowZi4w OiByZWcgMHgxMDogW2lvICAweGFjMDAtMHhhYzA3XQpbICAgIDAuNDA0NzUwXSBwY2kgMDAw MDowMDowZi4wOiByZWcgMHgxNDogW2lvICAweGE4ODAtMHhhODgzXQpbICAgIDAuNDA0Nzgw XSBwY2kgMDAwMDowMDowZi4wOiByZWcgMHgxODogW2lvICAweGE4MDAtMHhhODA3XQpbICAg IDAuNDA0ODEwXSBwY2kgMDAwMDowMDowZi4wOiByZWcgMHgxYzogW2lvICAweGE0ODAtMHhh NDgzXQpbICAgIDAuNDA0ODQwXSBwY2kgMDAwMDowMDowZi4wOiByZWcgMHgyMDogW2lvICAw eGE0MDAtMHhhNDBmXQpbICAgIDAuNDA1NzgxXSBwY2kgMDAwMDowMDoxMC4wOiBbMTEwNjoz MDM4XSB0eXBlIDAwIGNsYXNzIDB4MGMwMzAwClsgICAgMC40MDU5MjFdIHBjaSAwMDAwOjAw OjEwLjA6IHJlZyAweDIwOiBbaW8gIDB4YTA4MC0weGEwOWZdClsgICAgMC40MDYwODVdIHBj aSAwMDAwOjAwOjEwLjA6IHN1cHBvcnRzIEQxIEQyClsgICAgMC40MDYwOTNdIHBjaSAwMDAw OjAwOjEwLjA6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDEgRDIgRDNob3QgRDNjb2xkClsg ICAgMC40MDY4ODFdIHBjaSAwMDAwOjAwOjEwLjE6IFsxMTA2OjMwMzhdIHR5cGUgMDAgY2xh c3MgMHgwYzAzMDAKWyAgICAwLjQwNzA0M10gcGNpIDAwMDA6MDA6MTAuMTogcmVnIDB4MjA6 IFtpbyAgMHhhMDAwLTB4YTAxZl0KWyAgICAwLjQwNzE4NF0gcGNpIDAwMDA6MDA6MTAuMTog c3VwcG9ydHMgRDEgRDIKWyAgICAwLjQwNzE5Ml0gcGNpIDAwMDA6MDA6MTAuMTogUE1FIyBz dXBwb3J0ZWQgZnJvbSBEMCBEMSBEMiBEM2hvdCBEM2NvbGQKWyAgICAwLjQwNzk4MF0gcGNp IDAwMDA6MDA6MTAuMjogWzExMDY6MzAzOF0gdHlwZSAwMCBjbGFzcyAweDBjMDMwMApbICAg IDAuNDA4MTQyXSBwY2kgMDAwMDowMDoxMC4yOiByZWcgMHgyMDogW2lvICAweDljMDAtMHg5 YzFmXQpbICAgIDAuNDA4MjgzXSBwY2kgMDAwMDowMDoxMC4yOiBzdXBwb3J0cyBEMSBEMgpb ICAgIDAuNDA4MjkwXSBwY2kgMDAwMDowMDoxMC4yOiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQw IEQxIEQyIEQzaG90IEQzY29sZApbICAgIDAuNDA5MDk2XSBwY2kgMDAwMDowMDoxMC4zOiBb MTEwNjozMDM4XSB0eXBlIDAwIGNsYXNzIDB4MGMwMzAwClsgICAgMC40MDkyMzZdIHBjaSAw MDAwOjAwOjEwLjM6IHJlZyAweDIwOiBbaW8gIDB4OTg4MC0weDk4OWZdClsgICAgMC40MDkz NzddIHBjaSAwMDAwOjAwOjEwLjM6IHN1cHBvcnRzIEQxIEQyClsgICAgMC40MDkzODVdIHBj aSAwMDAwOjAwOjEwLjM6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDEgRDIgRDNob3QgRDNj b2xkClsgICAgMC40MTAyMDZdIHBjaSAwMDAwOjAwOjEwLjQ6IFsxMTA2OjMxMDRdIHR5cGUg MDAgY2xhc3MgMHgwYzAzMjAKWyAgICAwLjQxMDI2NF0gcGNpIDAwMDA6MDA6MTAuNDogcmVn IDB4MTA6IFttZW0gMHhmZThlYmMwMC0weGZlOGViY2ZmXQpbICAgIDAuNDEwNTE3XSBwY2kg MDAwMDowMDoxMC40OiBzdXBwb3J0cyBEMSBEMgpbICAgIDAuNDEwNTI0XSBwY2kgMDAwMDow MDoxMC40OiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQxIEQyIEQzaG90IEQzY29sZApbICAg IDAuNDExMzU5XSBwY2kgMDAwMDowMDoxMS4wOiBbMTEwNjo4NDEwXSB0eXBlIDAwIGNsYXNz IDB4MDYwMTAwClsgICAgMC40MTI0NDNdIHBjaSAwMDAwOjAwOjExLjc6IFsxMTA2OmEzNTNd IHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAwLjQxMzM4NV0gcGNpIDAwMDA6MDA6MTMu MDogWzExMDY6YjM1M10gdHlwZSAwMSBjbGFzcyAweDA2MDQwMQpbICAgIDAuNDE0Mzg2XSBw Y2kgMDAwMDowMDoxNC4wOiBbMTEwNjozMjg4XSB0eXBlIDAwIGNsYXNzIDB4MDQwMzAwClsg ICAgMC40MTQ0NDVdIHBjaSAwMDAwOjAwOjE0LjA6IHJlZyAweDEwOiBbbWVtIDB4ZmU4ZTQw MDAtMHhmZThlN2ZmZiA2NGJpdF0KWyAgICAwLjQxNDcwNF0gcGNpIDAwMDA6MDA6MTQuMDog UE1FIyBzdXBwb3J0ZWQgZnJvbSBEMCBEM2hvdCBEM2NvbGQKWyAgICAwLjQxNTk0M10gcGNp IDAwMDA6MDE6MDAuMDogWzExMDY6MzExOV0gdHlwZSAwMCBjbGFzcyAweDAyMDAwMApbICAg IDAuNDE2MDE1XSBwY2kgMDAwMDowMTowMC4wOiByZWcgMHgxMDogW2lvICAweGI4MDAtMHhi OGZmXQpbICAgIDAuNDE2MDYyXSBwY2kgMDAwMDowMTowMC4wOiByZWcgMHgxNDogW21lbSAw eGZlOWZmYzAwLTB4ZmU5ZmZjZmYgNjRiaXRdClsgICAgMC40MTYzNDddIHBjaSAwMDAwOjAx OjAwLjA6IHN1cHBvcnRzIEQxIEQyClsgICAgMC40MTYzNTRdIHBjaSAwMDAwOjAxOjAwLjA6 IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDEgRDIgRDNob3QgRDNjb2xkClsgICAgMC40MTY4 MTFdIHBjaSAwMDAwOjAwOjAzLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMV0KWyAgICAwLjQx NzAxOF0gcGNpIDAwMDA6MDA6MDMuMDogICBicmlkZ2Ugd2luZG93IFtpbyAgMHhiMDAwLTB4 YmZmZl0KWyAgICAwLjQxNzAzMl0gcGNpIDAwMDA6MDA6MDMuMDogICBicmlkZ2Ugd2luZG93 IFttZW0gMHhmZTkwMDAwMC0weGZlOWZmZmZmXQpbICAgIDAuNDE3NDM0XSBwY2kgMDAwMDow MjowMC4wOiBbMTEwNjozMTE5XSB0eXBlIDAwIGNsYXNzIDB4MDIwMDAwClsgICAgMC40MTc0 ODZdIHBjaSAwMDAwOjAyOjAwLjA6IHJlZyAweDEwOiBbaW8gIDB4YzgwMC0weGM4ZmZdClsg ICAgMC40MTc1MzJdIHBjaSAwMDAwOjAyOjAwLjA6IHJlZyAweDE0OiBbbWVtIDB4ZmVhZmZj MDAtMHhmZWFmZmNmZiA2NGJpdF0KWyAgICAwLjQxNzgxOF0gcGNpIDAwMDA6MDI6MDAuMDog c3VwcG9ydHMgRDEgRDIKWyAgICAwLjQxNzgyNV0gcGNpIDAwMDA6MDI6MDAuMDogUE1FIyBz dXBwb3J0ZWQgZnJvbSBEMCBEMSBEMiBEM2hvdCBEM2NvbGQKWyAgICAwLjQxODM0NV0gcGNp IDAwMDA6MDA6MDMuMTogUENJIGJyaWRnZSB0byBbYnVzIDAyXQpbICAgIDAuNDE4NTgxXSBw Y2kgMDAwMDowMDowMy4xOiAgIGJyaWRnZSB3aW5kb3cgW2lvICAweGMwMDAtMHhjZmZmXQpb ICAgIDAuNDE4NTk1XSBwY2kgMDAwMDowMDowMy4xOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAw eGZlYTAwMDAwLTB4ZmVhZmZmZmZdClsgICAgMC40MTg5NjZdIHBjaSAwMDAwOjAwOjAzLjI6 IFBDSSBicmlkZ2UgdG8gW2J1cyAwMy0wNF0KWyAgICAwLjQxOTAxN10gcGNpIDAwMDA6MDA6 MDMuMjogICBicmlkZ2Ugd2luZG93IFtpbyAgMHhkMDAwLTB4ZGZmZl0KWyAgICAwLjQxOTAz MV0gcGNpIDAwMDA6MDA6MDMuMjogICBicmlkZ2Ugd2luZG93IFttZW0gMHhmZTAwMDAwMC0w eGZlN2ZmZmZmXQpbICAgIDAuNDE5MDUxXSBwY2kgMDAwMDowMDowMy4yOiAgIGJyaWRnZSB3 aW5kb3cgW21lbSAweGY4MDAwMDAwLTB4ZjlmZmZmZmYgNjRiaXQgcHJlZl0KWyAgICAwLjQx OTQwNF0gcGNpIDAwMDA6MDA6MDMuMzogUENJIGJyaWRnZSB0byBbYnVzIDA1XQpbICAgIDAu NDIwMjE4XSBwY2kgMDAwMDowNjowMy4wOiBbMTA5NTozMTI0XSB0eXBlIDAwIGNsYXNzIDB4 MDEwNDAwClsgICAgMC40MjAyOTFdIHBjaSAwMDAwOjA2OjAzLjA6IHJlZyAweDEwOiBbbWVt IDB4ZmViNzdjMDAtMHhmZWI3N2M3ZiA2NGJpdF0KWyAgICAwLjQyMDMzNV0gcGNpIDAwMDA6 MDY6MDMuMDogcmVnIDB4MTg6IFttZW0gMHhmZWI3ODAwMC0weGZlYjdmZmZmIDY0Yml0XQpb ICAgIDAuNDIwMzY1XSBwY2kgMDAwMDowNjowMy4wOiByZWcgMHgyMDogW2lvICAweGVjMDAt MHhlYzBmXQpbICAgIDAuNDIwNDE5XSBwY2kgMDAwMDowNjowMy4wOiByZWcgMHgzMDogW21l bSAweGZlYjgwMDAwLTB4ZmViZmZmZmYgcHJlZl0KWyAgICAwLjQyMDU3OV0gcGNpIDAwMDA6 MDY6MDMuMDogc3VwcG9ydHMgRDEgRDIKWyAgICAwLjQyMTE1M10gcGNpIDAwMDA6MDA6MTMu MDogUENJIGJyaWRnZSB0byBbYnVzIDA2XSAoc3VidHJhY3RpdmUgZGVjb2RlKQpbICAgIDAu NDIxNDQ1XSBwY2kgMDAwMDowMDoxMy4wOiAgIGJyaWRnZSB3aW5kb3cgW2lvICAweGUwMDAt MHhlZmZmXQpbICAgIDAuNDIxNDU5XSBwY2kgMDAwMDowMDoxMy4wOiAgIGJyaWRnZSB3aW5k b3cgW21lbSAweGZlYjAwMDAwLTB4ZmViZmZmZmZdClsgICAgMC40MjE0NzldIHBjaSAwMDAw OjAwOjEzLjA6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4MDAwMC0weDBjZjddIChzdWJ0cmFj dGl2ZSBkZWNvZGUpClsgICAgMC40MjE0ODddIHBjaSAwMDAwOjAwOjEzLjA6ICAgYnJpZGdl IHdpbmRvdyBbaW8gIDB4MGQwMC0weGZmZmZdIChzdWJ0cmFjdGl2ZSBkZWNvZGUpClsgICAg MC40MjE0OTVdIHBjaSAwMDAwOjAwOjEzLjA6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIDB4MDAw YTAwMDAtMHgwMDBiZmZmZl0gKHN1YnRyYWN0aXZlIGRlY29kZSkKWyAgICAwLjQyMTUwM10g cGNpIDAwMDA6MDA6MTMuMDogICBicmlkZ2Ugd2luZG93IFttZW0gMHhkMDAwMDAwMC0weGRm ZmZmZmZmXSAoc3VidHJhY3RpdmUgZGVjb2RlKQpbICAgIDAuNDIxNTEwXSBwY2kgMDAwMDow MDoxMy4wOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGYwMDAwMDAwLTB4ZmViZmZmZmZdIChz dWJ0cmFjdGl2ZSBkZWNvZGUpClsgICAgMC40Mzc0OTFdIEFDUEk6IFBDSSBJbnRlcnJ1cHQg TGluayBbTE5LQV0gKElSUXMgMyA0IDUgNiA3IDEwIDExIDE0ICoxNSkKWyAgICAwLjQzODUz M10gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktCXSAoSVJRcyAzIDQgNSA2IDcgMTAg KjExIDE0IDE1KQpbICAgIDAuNDM5NTc4XSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xO S0NdIChJUlFzIDMgNCA1IDYgNyAqMTAgMTEgMTQgMTUpClsgICAgMC40NDA1NzJdIEFDUEk6 IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LRF0gKElSUXMgMyA0IDUgNiA3IDEwICoxMSAxNCAx NSkKWyAgICAwLjQ0MTYyMV0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktFXSAoSVJR cyAzIDQgNSA2IDcgMTAgMTEgMTQgMTUpICowLCBkaXNhYmxlZC4KWyAgICAwLjQ0Mjc0M10g QUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktGXSAoSVJRcyAzIDQgNSA2IDcgMTAgMTEg MTQgMTUpICowLCBkaXNhYmxlZC4KWyAgICAwLjQ0MzkwOF0gQUNQSTogUENJIEludGVycnVw dCBMaW5rIFtMTktHXSAoSVJRcyAzIDQgNSA2IDcgMTAgMTEgMTQgMTUpICowLCBkaXNhYmxl ZC4KWyAgICAwLjQ0NTA2Ml0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktIXSAoSVJR cyAzIDQgNSA2IDcgKjEwIDExIDE0IDE1KQpbICAgIDAuNDQ2MDY0XSBBQ1BJOiBFbmFibGVk IDMgR1BFcyBpbiBibG9jayAwMCB0byAwRgpbICAgIDAuNDQ4MDE4XSB2Z2FhcmI6IHNldHRp bmcgYXMgYm9vdCBkZXZpY2U6IFBDSTowMDAwOjAwOjAxLjAKWyAgICAwLjQ0ODAxOF0gdmdh YXJiOiBkZXZpY2UgYWRkZWQ6IFBDSTowMDAwOjAwOjAxLjAsZGVjb2Rlcz1pbyttZW0sb3du cz1pbyttZW0sbG9ja3M9bm9uZQpbICAgIDAuNDQ5MDc2XSB2Z2FhcmI6IGxvYWRlZApbICAg IDAuNDQ5MjIwXSB2Z2FhcmI6IGJyaWRnZSBjb250cm9sIHBvc3NpYmxlIDAwMDA6MDA6MDEu MApbICAgIDAuNDUwMTU0XSBTQ1NJIHN1YnN5c3RlbSBpbml0aWFsaXplZApbICAgIDAuNDUw NTMzXSBsaWJhdGEgdmVyc2lvbiAzLjAwIGxvYWRlZC4KWyAgICAwLjQ1MDUzM10gQUNQSTog YnVzIHR5cGUgVVNCIHJlZ2lzdGVyZWQKWyAgICAwLjQ1MTQ1Nl0gdXNiY29yZTogcmVnaXN0 ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciB1c2JmcwpbICAgIDAuNDUxNTgxXSB1c2Jjb3Jl OiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIGh1YgpbICAgIDAuNDUyMTU3XSB1 c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBkZXZpY2UgZHJpdmVyIHVzYgpbICAgIDAuNDUzMzEy XSBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgRHJpdmVyIEluaXRpYWxpemVk LgpbICAgIDAuNDUzNTYwXSBQQ0k6IFVzaW5nIEFDUEkgZm9yIElSUSByb3V0aW5nClsgICAg MC40NjgzMjhdIFBDSTogcGNpX2NhY2hlX2xpbmVfc2l6ZSBzZXQgdG8gNjQgYnl0ZXMKWyAg ICAwLjQ2ODU3OV0gZTgyMDogcmVzZXJ2ZSBSQU0gYnVmZmVyIFttZW0gMHgwMDA5ZDAwMC0w eDAwMDlmZmZmXQpbICAgIDAuNDY4NjA4XSBlODIwOiByZXNlcnZlIFJBTSBidWZmZXIgW21l bSAweGNmZmMwMDAwLTB4Y2ZmZmZmZmZdClsgICAgMC40NzExMTRdIE5ldExhYmVsOiBJbml0 aWFsaXppbmcKWyAgICAwLjQ3MTI0Ml0gTmV0TGFiZWw6ICBkb21haW4gaGFzaCBzaXplID0g MTI4ClsgICAgMC40NzE0NDBdIE5ldExhYmVsOiAgcHJvdG9jb2xzID0gVU5MQUJFTEVEIENJ UFNPdjQKWyAgICAwLjQ3MTgyNF0gTmV0TGFiZWw6ICB1bmxhYmVsZWQgdHJhZmZpYyBhbGxv d2VkIGJ5IGRlZmF1bHQKWyAgICAwLjQ3MjE5NV0gSFBFVDogMyB0aW1lcnMgaW4gdG90YWws IDAgdGltZXJzIHdpbGwgYmUgdXNlZCBmb3IgcGVyLWNwdSB0aW1lcgpbICAgIDAuNDcyNDg5 XSBocGV0MDogYXQgTU1JTyAweGZlZDAwMDAwLCBJUlFzIDIsIDgsIDAKWyAgICAwLjQ3Mjg0 Nl0gaHBldDA6IDMgY29tcGFyYXRvcnMsIDMyLWJpdCAxNC4zMTgxODAgTUh6IGNvdW50ZXIK WyAgICAwLjQ3NjMzM10gU3dpdGNoZWQgdG8gY2xvY2tzb3VyY2UgaHBldApbICAgIDAuNjI5 ODI2XSBwbnA6IFBuUCBBQ1BJIGluaXQKWyAgICAwLjYzMDY0MF0gc3lzdGVtIDAwOjAwOiBb bWVtIDB4ZTAwMDAwMDAtMHhlZmZmZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjYz MTE4MF0gc3lzdGVtIDAwOjAwOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5Q MGMwMSAoYWN0aXZlKQpbICAgIDAuNjMyMTQ3XSBwbnAgMDA6MDE6IFBsdWcgYW5kIFBsYXkg QUNQSSBkZXZpY2UsIElEcyBQTlAwYjAwIChhY3RpdmUpClsgICAgMC42Mzc1MzhdIHN5c3Rl bSAwMDowMjogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDBjMDIgKGFjdGl2 ZSkKWyAgICAwLjYzODc1Nl0gQUNQSTogSVJRIDMgb3ZlcnJpZGUgdG8gZWRnZSwgaGlnaApb ICAgIDAuNjM5NTY4XSBwbnAgMDA6MDM6IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElE cyBQTlAwNTAxIChhY3RpdmUpClsgICAgMC42NDA2MThdIHN5c3RlbSAwMDowNDogUGx1ZyBh bmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDBjMDIgKGFjdGl2ZSkKWyAgICAwLjY0MzI2 OV0gc3lzdGVtIDAwOjA1OiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMGMw MiAoYWN0aXZlKQpbICAgIDAuNjQ0MjMyXSBzeXN0ZW0gMDA6MDY6IFtpbyAgMHgwNGQwLTB4 MDRkMV0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY0NDUwMl0gc3lzdGVtIDAwOjA2OiBb aW8gIDB4MDgwMC0weDA4N2ZdIGNvdWxkIG5vdCBiZSByZXNlcnZlZApbICAgIDAuNjQ0Nzcw XSBzeXN0ZW0gMDA6MDY6IFtpbyAgMHgwNDAwLTB4MDQxZl0gaGFzIGJlZW4gcmVzZXJ2ZWQK WyAgICAwLjY0NTA3OF0gc3lzdGVtIDAwOjA2OiBbbWVtIDB4ZmVkMDEwMDAtMHhmZWQwMTNm Zl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY0NTM2OV0gc3lzdGVtIDAwOjA2OiBbbWVt IDB4ZmVkMDIwMDAtMHhmZWQwMmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY0NTY0 OF0gc3lzdGVtIDAwOjA2OiBbbWVtIDB4ZmVkMDMwMDAtMHhmZWQwM2ZmZl0gaGFzIGJlZW4g cmVzZXJ2ZWQKWyAgICAwLjY0NTkyOF0gc3lzdGVtIDAwOjA2OiBbbWVtIDB4ZmVkMDUwMDAt MHhmZWQwNWZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY0NjIyNl0gc3lzdGVtIDAw OjA2OiBbbWVtIDB4ZmZmMDAwMDAtMHhmZmZmZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAg ICAwLjY0NjUwN10gc3lzdGVtIDAwOjA2OiBbbWVtIDB4ZmVjYzAwMDAtMHhmZWNjMGZmZl0g Y291bGQgbm90IGJlIHJlc2VydmVkClsgICAgMC42NDY4MDVdIHN5c3RlbSAwMDowNjogUGx1 ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDBjMDIgKGFjdGl2ZSkKWyAgICAwLjY0 NzkyNV0gc3lzdGVtIDAwOjA3OiBbbWVtIDB4ZmVjMDAwMDAtMHhmZWMwMGZmZl0gY291bGQg bm90IGJlIHJlc2VydmVkClsgICAgMC42NDgyNzddIHN5c3RlbSAwMDowNzogW21lbSAweGZl ZTAwMDAwLTB4ZmVlMDBmZmZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMC42NDg1NjddIHN5 c3RlbSAwMDowNzogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDBjMDIgKGFj dGl2ZSkKWyAgICAwLjY0OTI0MF0gc3lzdGVtIDAwOjA4OiBbbWVtIDB4ZTAwMDAwMDAtMHhl ZmZmZmZmZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAwLjY0OTUzOF0gc3lzdGVtIDAwOjA4 OiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMGMwMiAoYWN0aXZlKQpbICAg IDAuNjUwNTU5XSBzeXN0ZW0gMDA6MDk6IFttZW0gMHgwMDAwMDAwMC0weDAwMDlmZmZmXSBj b3VsZCBub3QgYmUgcmVzZXJ2ZWQKWyAgICAwLjY1MDg2MV0gc3lzdGVtIDAwOjA5OiBbbWVt IDB4MDAwYzAwMDAtMHgwMDBjZmZmZl0gY291bGQgbm90IGJlIHJlc2VydmVkClsgICAgMC42 NTEyMDNdIHN5c3RlbSAwMDowOTogW21lbSAweDAwMGUwMDAwLTB4MDAwZmZmZmZdIGNvdWxk IG5vdCBiZSByZXNlcnZlZApbICAgIDAuNjUxNDk4XSBzeXN0ZW0gMDA6MDk6IFttZW0gMHgw MDEwMDAwMC0weGNmZmZmZmZmXSBjb3VsZCBub3QgYmUgcmVzZXJ2ZWQKWyAgICAwLjY1MTc5 MF0gc3lzdGVtIDAwOjA5OiBbbWVtIDB4ZmVjMDAwMDAtMHhmZmZmZmZmZl0gY291bGQgbm90 IGJlIHJlc2VydmVkClsgICAgMC42NTIxMDVdIHN5c3RlbSAwMDowOTogUGx1ZyBhbmQgUGxh eSBBQ1BJIGRldmljZSwgSURzIFBOUDBjMDEgKGFjdGl2ZSkKWyAgICAwLjY1Mjg3MF0gcG5w OiBQblAgQUNQSTogZm91bmQgMTAgZGV2aWNlcwpbICAgIDAuNjczMjc3XSBwY2kgMDAwMDow MDowMy4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDFdClsgICAgMC42NzM1MDldIHBjaSAwMDAw OjAwOjAzLjA6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4YjAwMC0weGJmZmZdClsgICAgMC42 NzM3NzldIHBjaSAwMDAwOjAwOjAzLjA6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIDB4ZmU5MDAw MDAtMHhmZTlmZmZmZl0KWyAgICAwLjY3NDEwMF0gcGNpIDAwMDA6MDA6MDMuMTogUENJIGJy aWRnZSB0byBbYnVzIDAyXQpbICAgIDAuNjc0MzI1XSBwY2kgMDAwMDowMDowMy4xOiAgIGJy aWRnZSB3aW5kb3cgW2lvICAweGMwMDAtMHhjZmZmXQpbICAgIDAuNjc0NTkyXSBwY2kgMDAw MDowMDowMy4xOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGZlYTAwMDAwLTB4ZmVhZmZmZmZd ClsgICAgMC42NzQ4OTRdIHBjaSAwMDAwOjAwOjAzLjI6IFBDSSBicmlkZ2UgdG8gW2J1cyAw My0wNF0KWyAgICAwLjY3NTE0MF0gcGNpIDAwMDA6MDA6MDMuMjogICBicmlkZ2Ugd2luZG93 IFtpbyAgMHhkMDAwLTB4ZGZmZl0KWyAgICAwLjY3NTQxMF0gcGNpIDAwMDA6MDA6MDMuMjog ICBicmlkZ2Ugd2luZG93IFttZW0gMHhmZTAwMDAwMC0weGZlN2ZmZmZmXQpbICAgIDAuNjc1 Njk3XSBwY2kgMDAwMDowMDowMy4yOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGY4MDAwMDAw LTB4ZjlmZmZmZmYgNjRiaXQgcHJlZl0KWyAgICAwLjY3NjA1Ml0gcGNpIDAwMDA6MDA6MDMu MzogUENJIGJyaWRnZSB0byBbYnVzIDA1XQpbICAgIDAuNjc2MzAyXSBwY2kgMDAwMDowMDox My4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDZdClsgICAgMC42NzY1MjZdIHBjaSAwMDAwOjAw OjEzLjA6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4ZTAwMC0weGVmZmZdClsgICAgMC42NzY3 OTRdIHBjaSAwMDAwOjAwOjEzLjA6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIDB4ZmViMDAwMDAt MHhmZWJmZmZmZl0KWyAgICAwLjY3NzEwOV0gcGNpX2J1cyAwMDAwOjAwOiByZXNvdXJjZSA0 IFtpbyAgMHgwMDAwLTB4MGNmN10KWyAgICAwLjY3NzExN10gcGNpX2J1cyAwMDAwOjAwOiBy ZXNvdXJjZSA1IFtpbyAgMHgwZDAwLTB4ZmZmZl0KWyAgICAwLjY3NzEyNV0gcGNpX2J1cyAw MDAwOjAwOiByZXNvdXJjZSA2IFttZW0gMHgwMDBhMDAwMC0weDAwMGJmZmZmXQpbICAgIDAu Njc3MTMyXSBwY2lfYnVzIDAwMDA6MDA6IHJlc291cmNlIDcgW21lbSAweGQwMDAwMDAwLTB4 ZGZmZmZmZmZdClsgICAgMC42NzcxMzldIHBjaV9idXMgMDAwMDowMDogcmVzb3VyY2UgOCBb bWVtIDB4ZjAwMDAwMDAtMHhmZWJmZmZmZl0KWyAgICAwLjY3NzE0N10gcGNpX2J1cyAwMDAw OjAxOiByZXNvdXJjZSAwIFtpbyAgMHhiMDAwLTB4YmZmZl0KWyAgICAwLjY3NzE1NF0gcGNp X2J1cyAwMDAwOjAxOiByZXNvdXJjZSAxIFttZW0gMHhmZTkwMDAwMC0weGZlOWZmZmZmXQpb ICAgIDAuNjc3MTYyXSBwY2lfYnVzIDAwMDA6MDI6IHJlc291cmNlIDAgW2lvICAweGMwMDAt MHhjZmZmXQpbICAgIDAuNjc3MTY5XSBwY2lfYnVzIDAwMDA6MDI6IHJlc291cmNlIDEgW21l bSAweGZlYTAwMDAwLTB4ZmVhZmZmZmZdClsgICAgMC42NzcxNzZdIHBjaV9idXMgMDAwMDow MzogcmVzb3VyY2UgMCBbaW8gIDB4ZDAwMC0weGRmZmZdClsgICAgMC42NzcxODRdIHBjaV9i dXMgMDAwMDowMzogcmVzb3VyY2UgMSBbbWVtIDB4ZmUwMDAwMDAtMHhmZTdmZmZmZl0KWyAg ICAwLjY3NzE5MV0gcGNpX2J1cyAwMDAwOjAzOiByZXNvdXJjZSAyIFttZW0gMHhmODAwMDAw MC0weGY5ZmZmZmZmIDY0Yml0IHByZWZdClsgICAgMC42NzcxOTldIHBjaV9idXMgMDAwMDow NjogcmVzb3VyY2UgMCBbaW8gIDB4ZTAwMC0weGVmZmZdClsgICAgMC42NzcyMDZdIHBjaV9i dXMgMDAwMDowNjogcmVzb3VyY2UgMSBbbWVtIDB4ZmViMDAwMDAtMHhmZWJmZmZmZl0KWyAg ICAwLjY3NzIxM10gcGNpX2J1cyAwMDAwOjA2OiByZXNvdXJjZSA0IFtpbyAgMHgwMDAwLTB4 MGNmN10KWyAgICAwLjY3NzIyMF0gcGNpX2J1cyAwMDAwOjA2OiByZXNvdXJjZSA1IFtpbyAg MHgwZDAwLTB4ZmZmZl0KWyAgICAwLjY3NzIyOF0gcGNpX2J1cyAwMDAwOjA2OiByZXNvdXJj ZSA2IFttZW0gMHgwMDBhMDAwMC0weDAwMGJmZmZmXQpbICAgIDAuNjc3MjM1XSBwY2lfYnVz IDAwMDA6MDY6IHJlc291cmNlIDcgW21lbSAweGQwMDAwMDAwLTB4ZGZmZmZmZmZdClsgICAg MC42NzcyNDJdIHBjaV9idXMgMDAwMDowNjogcmVzb3VyY2UgOCBbbWVtIDB4ZjAwMDAwMDAt MHhmZWJmZmZmZl0KWyAgICAwLjY3NzQ0NV0gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZh bWlseSAyClsgICAgMC42Nzk4NTRdIFRDUCBlc3RhYmxpc2hlZCBoYXNoIHRhYmxlIGVudHJp ZXM6IDY1NTM2IChvcmRlcjogNywgNTI0Mjg4IGJ5dGVzKQpbICAgIDAuNjg0NzQ3XSBUQ1Ag YmluZCBoYXNoIHRhYmxlIGVudHJpZXM6IDY1NTM2IChvcmRlcjogMTAsIDUyNDI4ODAgYnl0 ZXMpClsgICAgMC43MDA5MDJdIFRDUDogSGFzaCB0YWJsZXMgY29uZmlndXJlZCAoZXN0YWJs aXNoZWQgNjU1MzYgYmluZCA2NTUzNikKWyAgICAwLjcwMTQxOF0gVENQOiByZW5vIHJlZ2lz dGVyZWQKWyAgICAwLjcwMjE1M10gVURQIGhhc2ggdGFibGUgZW50cmllczogNDA5NiAob3Jk ZXI6IDcsIDc4NjQzMiBieXRlcykKWyAgICAwLjcwNTA2NF0gVURQLUxpdGUgaGFzaCB0YWJs ZSBlbnRyaWVzOiA0MDk2IChvcmRlcjogNywgNzg2NDMyIGJ5dGVzKQpbICAgIDAuNzA4MjE1 XSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDEKWyAgICAwLjcwODU1OV0gcGNp IDAwMDA6MDA6MDEuMDogVmlkZW8gZGV2aWNlIHdpdGggc2hhZG93ZWQgUk9NClsgICAgMC43 MDg1ODFdIHBjaSAwMDAwOjAwOjAzLjA6IGRpc2FibGluZyBEQUMgb24gVklBIFBDSSBicmlk Z2UKWyAgICAwLjcxNDczMV0gUENJOiBDTFMgMzIgYnl0ZXMsIGRlZmF1bHQgNjQKWyAgICAw LjcxNTU2OF0gUENJLURNQTogVXNpbmcgc29mdHdhcmUgYm91bmNlIGJ1ZmZlcmluZyBmb3Ig SU8gKFNXSU9UTEIpClsgICAgMC43MTU4NDNdIHNvZnR3YXJlIElPIFRMQiBbbWVtIDB4Y2Jm YzAwMDAtMHhjZmZjMDAwMF0gKDY0TUIpIG1hcHBlZCBhdCBbZmZmZjg4MDBjYmZjMDAwMC1m ZmZmODgwMGNmZmJmZmZmXQpbICAgIDAuNzE2NTg3XSBtaWNyb2NvZGU6IG5vIHN1cHBvcnQg Zm9yIHRoaXMgQ1BVIHZlbmRvcgpbICAgIDAuNzE4NzYwXSBTY2FubmluZyBmb3IgbG93IG1l bW9yeSBjb3JydXB0aW9uIGV2ZXJ5IDYwIHNlY29uZHMKWyAgICAwLjcyMDg5NV0gZnV0ZXgg aGFzaCB0YWJsZSBlbnRyaWVzOiAxMDI0IChvcmRlcjogNSwgMTMxMDcyIGJ5dGVzKQpbICAg IDAuNzIxNTQyXSBhdWRpdDogaW5pdGlhbGl6aW5nIG5ldGxpbmsgc3Vic3lzIChkaXNhYmxl ZCkKWyAgICAwLjcyMTk2Ml0gYXVkaXQ6IHR5cGU9MjAwMCBhdWRpdCgxNDcxNTYzMTAzLjcy MDoxKTogaW5pdGlhbGl6ZWQKWyAgICAwLjcyMzc2N10gSHVnZVRMQiByZWdpc3RlcmVkIDIg TUIgcGFnZSBzaXplLCBwcmUtYWxsb2NhdGVkIDAgcGFnZXMKWyAgICAwLjc1MjE1N10gVkZT OiBEaXNrIHF1b3RhcyBkcXVvdF82LjUuMgpbICAgIDAuNzUyODI0XSBWRlM6IERxdW90LWNh Y2hlIGhhc2ggdGFibGUgZW50cmllczogNTEyIChvcmRlciAwLCA0MDk2IGJ5dGVzKQpbICAg IDAuNzYxODQ4XSBTR0kgWEZTIHdpdGggc2VjdXJpdHkgYXR0cmlidXRlcywgbm8gZGVidWcg ZW5hYmxlZApbICAgIDAuNzY2NjM3XSBTRUxpbnV4OiAgUmVnaXN0ZXJpbmcgbmV0ZmlsdGVy IGhvb2tzClsgICAgMC43NzAwNjhdIGJvdW5jZTogcG9vbCBzaXplOiA2NCBwYWdlcwpbICAg IDAuNzcwNzI2XSBCbG9jayBsYXllciBTQ1NJIGdlbmVyaWMgKGJzZykgZHJpdmVyIHZlcnNp b24gMC40IGxvYWRlZCAobWFqb3IgMjUyKQpbICAgIDAuNzcxMTMyXSBpbyBzY2hlZHVsZXIg bm9vcCByZWdpc3RlcmVkIChkZWZhdWx0KQpbICAgIDAuNzcxMzUzXSBpbyBzY2hlZHVsZXIg ZGVhZGxpbmUgcmVnaXN0ZXJlZApbICAgIDAuNzcxNjA2XSBpbyBzY2hlZHVsZXIgY2ZxIHJl Z2lzdGVyZWQKWyAgICAwLjc3NjM3Ml0gcGNpX2hvdHBsdWc6IFBDSSBIb3QgUGx1ZyBQQ0kg Q29yZSB2ZXJzaW9uOiAwLjUKWyAgICAwLjc3NzI5N10gaW5wdXQ6IFNsZWVwIEJ1dHRvbiBh cyAvZGV2aWNlcy9MTlhTWVNUTTowMC9MTlhTWUJVUzowMC9QTlAwQzBFOjAwL2lucHV0L2lu cHV0MApbICAgIDAuNzc3Nzc4XSBBQ1BJOiBTbGVlcCBCdXR0b24gW1NMUEJdClsgICAgMC43 NzgzNDVdIGlucHV0OiBQb3dlciBCdXR0b24gYXMgL2RldmljZXMvTE5YU1lTVE06MDAvTE5Y U1lCVVM6MDAvUE5QMEMwQzowMC9pbnB1dC9pbnB1dDEKWyAgICAwLjc3ODcxM10gQUNQSTog UG93ZXIgQnV0dG9uIFtQV1JCXQpbICAgIDAuNzc5Mjg1XSBpbnB1dDogUG93ZXIgQnV0dG9u IGFzIC9kZXZpY2VzL0xOWFNZU1RNOjAwL0xOWFBXUkJOOjAwL2lucHV0L2lucHV0MgpbICAg IDAuNzc5NjE5XSBBQ1BJOiBQb3dlciBCdXR0b24gW1BXUkZdClsgICAgMC43ODIxODFdIFNl cmlhbDogODI1MC8xNjU1MCBkcml2ZXIsIDQgcG9ydHMsIElSUSBzaGFyaW5nIGVuYWJsZWQK WyAgICAwLjgwMzcyMV0gMDA6MDM6IHR0eVMwIGF0IEkvTyAweDI4MCAoaXJxID0gMywgYmFz ZV9iYXVkID0gMTE1MjAwKSBpcyBhIDE2NTUwQQpbICAgIDAuODEyOTgwXSBOb24tdm9sYXRp bGUgbWVtb3J5IGRyaXZlciB2MS4zClsgICAgMC44MTU5ODZdIFZJQSBSTkcgZGV0ZWN0ZWQK WyAgICAwLjgzMTE2OV0gYnJkOiBtb2R1bGUgbG9hZGVkClsgICAgMC44NDA5MThdIGxvb3A6 IG1vZHVsZSBsb2FkZWQKWyAgICAwLjg0NDMyNl0gcGF0YV92aWEgMDAwMDowMDowZi4wOiB2 ZXJzaW9uIDAuMy40ClsgICAgMC44NTg2OThdIHNjc2kgaG9zdDA6IHBhdGFfdmlhClsgICAg MC44NjIxMjNdIHNjc2kgaG9zdDE6IHBhdGFfdmlhClsgICAgMC44NjQ4MTZdIGF0YTE6IFBB VEEgbWF4IFVETUEvMTMzIGNtZCAweGFjMDAgY3RsIDB4YTg4MCBibWRtYSAweGE0MDAgaXJx IDIxClsgICAgMC44Njk4NzhdIGF0YTI6IERVTU1ZClsgICAgMC44NzI0MDFdIFZJQSBOZXR3 b3JraW5nIFZlbG9jaXR5IEZhbWlseSBHaWdhYml0IEV0aGVybmV0IEFkYXB0ZXIgRHJpdmVy IFZlci4gMS4xNQpbICAgIDAuODc3OTE0XSBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgVklB IE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuClsgICAgMC44ODI1NDNdIENvcHlyaWdo dCAoYykgMjAwNCBSZWQgSGF0IEluYy4KWyAgICAwLjg4NzQ0M10gZXRoMDogVklBIE5ldHdv cmtpbmcgVmVsb2NpdHkgRmFtaWx5IEdpZ2FiaXQgRXRoZXJuZXQgQWRhcHRlcgpbICAgIDAu ODkyMjY1XSBldGgwOiBFdGhlcm5ldCBBZGRyZXNzOiAwMDoxZjpmMjowNzowZTo0NgpbICAg IDAuOTA3ODk0XSBldGgxOiBWSUEgTmV0d29ya2luZyBWZWxvY2l0eSBGYW1pbHkgR2lnYWJp dCBFdGhlcm5ldCBBZGFwdGVyClsgICAgMC45MTI3MTZdIGV0aDE6IEV0aGVybmV0IEFkZHJl c3M6IDAwOjFmOmYyOjA3OjBlOjQ3ClsgICAgMC45Mjc5NTZdIHVzYmNvcmU6IHJlZ2lzdGVy ZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgdXNibHAKWyAgICAwLjkzMTk5MV0gdXNiY29yZTog cmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciB1c2Itc3RvcmFnZQpbICAgIDAuOTM2 ODk2XSBpODA0MjogUE5QOiBObyBQUy8yIGNvbnRyb2xsZXIgZm91bmQuIFByb2JpbmcgcG9y dHMgZGlyZWN0bHkuClsgICAgMC45NDI3NzBdIHNlcmlvOiBpODA0MiBLQkQgcG9ydCBhdCAw eDYwLDB4NjQgaXJxIDEKWyAgICAwLjk0NjQyMF0gc2VyaW86IGk4MDQyIEFVWCBwb3J0IGF0 IDB4NjAsMHg2NCBpcnEgMTIKWyAgICAwLjk1MTU5NF0gbW91c2VkZXY6IFBTLzIgbW91c2Ug ZGV2aWNlIGNvbW1vbiBmb3IgYWxsIG1pY2UKWyAgICAwLjk1Nzg3N10gcnRjX2Ntb3MgMDA6 MDE6IFJUQyBjYW4gd2FrZSBmcm9tIFM0ClsgICAgMC45NjE5NTddIHJ0Y19jbW9zIDAwOjAx OiBydGMgY29yZTogcmVnaXN0ZXJlZCBydGNfY21vcyBhcyBydGMwClsgICAgMC45NjY0MTNd IHJ0Y19jbW9zIDAwOjAxOiBhbGFybXMgdXAgdG8gb25lIHllYXIsIHkzaywgMTE0IGJ5dGVz IG52cmFtLCBocGV0IGlycXMKWyAgICAwLjk3MjUwNV0gbWQ6IHJhaWQ2IHBlcnNvbmFsaXR5 IHJlZ2lzdGVyZWQgZm9yIGxldmVsIDYKWyAgICAwLjk3NjM1OF0gbWQ6IHJhaWQ1IHBlcnNv bmFsaXR5IHJlZ2lzdGVyZWQgZm9yIGxldmVsIDUKWyAgICAwLjk4MDEzOV0gbWQ6IHJhaWQ0 IHBlcnNvbmFsaXR5IHJlZ2lzdGVyZWQgZm9yIGxldmVsIDQKWyAgICAwLjk4NDA5M10gaGlk cmF3OiByYXcgSElEIGV2ZW50cyBkcml2ZXIgKEMpIEppcmkgS29zaW5hClsgICAgMC45ODk1 NDNdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgdXNiaGlkClsg ICAgMC45OTM1MjBdIHVzYmhpZDogVVNCIEhJRCBjb3JlIGRyaXZlcgpbICAgIDEuMDAxMzk5 XSBOZXRmaWx0ZXIgbWVzc2FnZXMgdmlhIE5FVExJTksgdjAuMzAuClsgICAgMS4wMDUwNThd IG5mX2Nvbm50cmFjayB2ZXJzaW9uIDAuNS4wICgxNjM4NCBidWNrZXRzLCA2NTUzNiBtYXgp ClsgICAgMS4wMTAyMTZdIGN0bmV0bGluayB2MC45MzogcmVnaXN0ZXJpbmcgd2l0aCBuZm5l dGxpbmsuClsgICAgMS4wMTQ3ODNdIGlwX3RhYmxlczogKEMpIDIwMDAtMjAwNiBOZXRmaWx0 ZXIgQ29yZSBUZWFtClsgICAgMS4wMTg3NTBdIFRDUDogY3ViaWMgcmVnaXN0ZXJlZApbICAg IDEuMDIxNTczXSBJbml0aWFsaXppbmcgWEZSTSBuZXRsaW5rIHNvY2tldApbICAgIDEuMDI2 Nzk5XSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDEwClsgICAgMS4wMzM0MTdd IGlwNl90YWJsZXM6IChDKSAyMDAwLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbQpbICAgIDEu MDM3OTcwXSBzaXQ6IElQdjYgb3ZlciBJUHY0IHR1bm5lbGluZyBkcml2ZXIKWyAgICAxLjA0 MjY2MV0gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAxNwpbICAgIDEuMDQ1ODg2 XSBhdGExLjAwOiBBVEEtOTogV0RDIFdEMTBKUFZULTAwTVM4VDAsIDAxLjAxQTAxLCBtYXgg VURNQS8xMzMKWyAgICAxLjA0ODA1NV0gcmVnaXN0ZXJlZCB0YXNrc3RhdHMgdmVyc2lvbiAx ClsgICAgMS4wNTM3MjRdIGF0YTEuMDA6IDE5NTM1MjUxNjggc2VjdG9ycywgbXVsdGkgMTY6 IExCQTQ4IE5DUSAoZGVwdGggMC8zMikKWyAgICAxLjA1NTM3MF0gQUxTQSBkZXZpY2UgbGlz dDoKWyAgICAxLjA1NTM3Ml0gICBObyBzb3VuZGNhcmRzIGZvdW5kLgpbICAgIDEuMDYzMTI3 XSBhdGExLjAxOiBBVEFQSTogQVNVUyAgICBCVy0xMkIxU1QsIDEuMDMsIG1heCBVRE1BLzEw MApbICAgIDEuMDYzMTM3XSBhdGExLjAwOiBsaW1pdGVkIHRvIFVETUEvMzMgZHVlIHRvIDQw LXdpcmUgY2FibGUKWyAgICAxLjA2MzE0MV0gYXRhMS4wMTogbGltaXRlZCB0byBVRE1BLzMz IGR1ZSB0byA0MC13aXJlIGNhYmxlClsgICAgMS4wNjc4MjFdIGF0YTEuMDA6IGNvbmZpZ3Vy ZWQgZm9yIFVETUEvMzMKWyAgICAxLjA3MzMwN10gYXRhMS4wMTogY29uZmlndXJlZCBmb3Ig VURNQS8zMwpbICAgIDEuMDc4MDQ2XSBzY3NpIDA6MDowOjA6IERpcmVjdC1BY2Nlc3MgICAg IEFUQSAgICAgIFdEQyBXRDEwSlBWVC0wME0gMUEwMSBQUTogMCBBTlNJOiA1ClsgICAgMS4w ODE0OTZdIHNkIDA6MDowOjA6IFtzZGFdIDE5NTM1MjUxNjggNTEyLWJ5dGUgbG9naWNhbCBi bG9ja3M6ICgxLjAwIFRCLzkzMSBHaUIpClsgICAgMS4wODE1MDFdIHNkIDA6MDowOjA6IFtz ZGFdIDQwOTYtYnl0ZSBwaHlzaWNhbCBibG9ja3MKWyAgICAxLjA4MTgwM10gc2QgMDowOjA6 MDogW3NkYV0gV3JpdGUgUHJvdGVjdCBpcyBvZmYKWyAgICAxLjA4MTgwOV0gc2QgMDowOjA6 MDogW3NkYV0gTW9kZSBTZW5zZTogMDAgM2EgMDAgMDAKWyAgICAxLjA4MTkzNV0gc2QgMDow OjA6MDogW3NkYV0gV3JpdGUgY2FjaGU6IGVuYWJsZWQsIHJlYWQgY2FjaGU6IGVuYWJsZWQs IGRvZXNuJ3Qgc3VwcG9ydCBEUE8gb3IgRlVBClsgICAgMS4wODUxMTNdIHNkIDA6MDowOjA6 IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBzZzAgdHlwZSAwClsgICAgMS4xMTI1NTJdIHNjc2kg MDowOjE6MDogQ0QtUk9NICAgICAgICAgICAgQVNVUyAgICAgQlctMTJCMVNUICAgICAgICAx LjAzIFBROiAwIEFOU0k6IDUKWyAgICAxLjE2NjU0OF0gc3IgMDowOjE6MDogW3NyMF0gc2Nz aTMtbW1jIGRyaXZlOiA0OHgvNDh4IHdyaXRlciBkdmQtcmFtIGNkL3J3IHhhL2Zvcm0yIGNk ZGEgdHJheQpbICAgIDEuMTcyNjcyXSBjZHJvbTogVW5pZm9ybSBDRC1ST00gZHJpdmVyIFJl dmlzaW9uOiAzLjIwClsgICAgMS4xNzc5MjVdIHNyIDA6MDoxOjA6IEF0dGFjaGVkIHNjc2kg Q0QtUk9NIHNyMApbICAgIDEuMTc4ODI1XSBzciAwOjA6MTowOiBBdHRhY2hlZCBzY3NpIGdl bmVyaWMgc2cxIHR5cGUgNQpbICAgIDEuMjIwOTExXSAgc2RhOiBzZGExIHNkYTIgc2RhMwpb ICAgIDEuMjI2NTE0XSBzZCAwOjA6MDowOiBbc2RhXSBBdHRhY2hlZCBTQ1NJIGRpc2sKWyAg ICAxLjIyOTkyOF0gbWQ6IFdhaXRpbmcgZm9yIGFsbCBkZXZpY2VzIHRvIGJlIGF2YWlsYWJs ZSBiZWZvcmUgYXV0b2RldGVjdApbICAgIDEuMjM0NzU0XSBtZDogSWYgeW91IGRvbid0IHVz ZSByYWlkLCB1c2UgcmFpZD1ub2F1dG9kZXRlY3QKWyAgICAxLjI0MTc4Ml0gbWQ6IEF1dG9k ZXRlY3RpbmcgUkFJRCBhcnJheXMuClsgICAgMS4yNDQ3MTJdIG1kOiBTY2FubmVkIDAgYW5k IGFkZGVkIDAgZGV2aWNlcy4KWyAgICAxLjI0Nzg3OF0gbWQ6IGF1dG9ydW4gLi4uClsgICAg MS4yNDk4ODddIG1kOiAuLi4gYXV0b3J1biBET05FLgpbICAgIDEuMzE0ODYwXSBram91cm5h bGQgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgNSBzZWNvbmRzClsgICAgMS4zMTYxMjld IEVYVDMtZnMgKHNkYTMpOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCB3cml0ZWJhY2sgZGF0 YSBtb2RlClsgICAgMS4zMTYyNDVdIFZGUzogTW91bnRlZCByb290IChleHQzIGZpbGVzeXN0 ZW0pIHJlYWRvbmx5IG9uIGRldmljZSA4OjMuClsgICAgMS4zNjAzMDZdIGRldnRtcGZzOiBt b3VudGVkClsgICAgMS4zNjc3NzFdIEZyZWVpbmcgdW51c2VkIGtlcm5lbCBtZW1vcnk6IDI3 OTJLIChmZmZmZmZmZjgxY2ZhMDAwIC0gZmZmZmZmZmY4MWZiNDAwMCkKWyAgICAxLjM3MzM0 M10gV3JpdGUgcHJvdGVjdGluZyB0aGUga2VybmVsIHJlYWQtb25seSBkYXRhOiAxMjI4OGsK WyAgICAxLjM4MTI1OV0gRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogMTE0MEsgKGZm ZmY4ODAwMDE2ZTMwMDAgLSBmZmZmODgwMDAxODAwMDAwKQpbICAgIDEuMzg5MzcwXSBGcmVl aW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAxMjY0SyAoZmZmZjg4MDAwMWFjNDAwMCAtIGZm ZmY4ODAwMDFjMDAwMDApClsgICAgMS43MTgyMDJdIHRzYzogUmVmaW5lZCBUU0MgY2xvY2tz b3VyY2UgY2FsaWJyYXRpb246IDE2MDAuMDU2IE1IegpbICAgIDEuODQ3NzQ3XSByYW5kb206 IG5vbmJsb2NraW5nIHBvb2wgaXMgaW5pdGlhbGl6ZWQKWyAgICAyLjcyMjU1NV0gU3dpdGNo ZWQgdG8gY2xvY2tzb3VyY2UgdHNjClsgICAgNS4zNDI5OTldIHVkZXZkWzEwNDNdOiBzdGFy dGluZyB2ZXJzaW9uIDMuMS41ClsgICAgNi43MDY5MDBdIHZpYS12ZWxvY2l0eSAwMDAwOjAx OjAwLjAgZW5wMXMwOiByZW5hbWVkIGZyb20gZXRoMApbICAgIDYuNzE0MzUwXSB2aWEtdmVs b2NpdHkgMDAwMDowMjowMC4wIGVucDJzMDogcmVuYW1lZCBmcm9tIGV0aDEKWyAgICA2Ljg4 MzM0NV0gdnQ1OTZfc21idXMgMDAwMDowMDoxMS4wOiBWVDU5Nl9zbWJhID0gMHg0MDAKWyAg ICA2Ljg4MzgxM10gaTJjIGkyYy0wOiBhZGFwdGVyIFtTTUJ1cyBWaWEgUHJvIGFkYXB0ZXIg YXQgMDQwMF0gcmVnaXN0ZXJlZApbICAgIDYuODkwNzM0XSBBQ1BJOiBJUlEgMyBvdmVycmlk ZSB0byBlZGdlLCBoaWdoClsgICAgNy4xMjU5MjVdIGVoY2lfaGNkOiBVU0IgMi4wICdFbmhh bmNlZCcgSG9zdCBDb250cm9sbGVyIChFSENJKSBEcml2ZXIKWyAgICA3LjIxMTQ0MF0gc2F0 YV9zaWwyNCAwMDAwOjA2OjAzLjA6IHZlcnNpb24gMS4xClsgICAgNy4yMTE5MzVdIHNhdGFf c2lsMjQgMDAwMDowNjowMy4wOiBQQ0k6IERpc2FsbG93aW5nIERBQyBmb3IgZGV2aWNlClsg ICAgNy4yMTY2MDBdIHNjc2kgaG9zdDI6IHNhdGFfc2lsMjQKWyAgICA3LjIxNzI4MV0gc2Nz aSBob3N0Mzogc2F0YV9zaWwyNApbICAgIDcuMjE3ODk2XSBzY3NpIGhvc3Q0OiBzYXRhX3Np bDI0ClsgICAgNy4yMTg1NDJdIHNjc2kgaG9zdDU6IHNhdGFfc2lsMjQKWyAgICA3LjIxODkx Nl0gYXRhMzogU0FUQSBtYXggVURNQS8xMDAgaG9zdCBtMTI4QDB4ZmViNzdjMDAgcG9ydCAw eGZlYjc4MDAwIGlycSAxNgpbICAgIDcuMjE4OTI0XSBhdGE0OiBTQVRBIG1heCBVRE1BLzEw MCBob3N0IG0xMjhAMHhmZWI3N2MwMCBwb3J0IDB4ZmViN2EwMDAgaXJxIDE2ClsgICAgNy4y MTg5MzJdIGF0YTU6IFNBVEEgbWF4IFVETUEvMTAwIGhvc3QgbTEyOEAweGZlYjc3YzAwIHBv cnQgMHhmZWI3YzAwMCBpcnEgMTYKWyAgICA3LjIxODkzOV0gYXRhNjogU0FUQSBtYXggVURN QS8xMDAgaG9zdCBtMTI4QDB4ZmViNzdjMDAgcG9ydCAweGZlYjdlMDAwIGlycSAxNgpbICAg IDcuMjYzNzYzXSBlaGNpLXBjaTogRUhDSSBQQ0kgcGxhdGZvcm0gZHJpdmVyClsgICAgNy4y NjUwNjVdIGVoY2ktcGNpIDAwMDA6MDA6MTAuNDogRUhDSSBIb3N0IENvbnRyb2xsZXIKWyAg ICA3LjI2NzU3MF0gZWhjaS1wY2kgMDAwMDowMDoxMC40OiBuZXcgVVNCIGJ1cyByZWdpc3Rl cmVkLCBhc3NpZ25lZCBidXMgbnVtYmVyIDEKWyAgICA3LjI2Nzc3NF0gZWhjaS1wY2kgMDAw MDowMDoxMC40OiBkZWJ1ZyBwb3J0IDEKWyAgICA3LjI2ODI2M10gZWhjaS1wY2kgMDAwMDow MDoxMC40OiBpcnEgMjMsIGlvIG1lbSAweGZlOGViYzAwClsgICAgNy4yNzQwODhdIGVoY2kt cGNpIDAwMDA6MDA6MTAuNDogVVNCIDIuMCBzdGFydGVkLCBFSENJIDEuMDAKWyAgICA3LjI3 NTE5NV0gdXNiIHVzYjE6IE5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0xZDZiLCBp ZFByb2R1Y3Q9MDAwMgpbICAgIDcuMjc1MjA0XSB1c2IgdXNiMTogTmV3IFVTQiBkZXZpY2Ug c3RyaW5nczogTWZyPTMsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTEKWyAgICA3LjI3NTIx Ml0gdXNiIHVzYjE6IFByb2R1Y3Q6IEVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgNy4yNzUy MTldIHVzYiB1c2IxOiBNYW51ZmFjdHVyZXI6IExpbnV4IDMuMTkuOCBlaGNpX2hjZApbICAg IDcuMjc1MjI2XSB1c2IgdXNiMTogU2VyaWFsTnVtYmVyOiAwMDAwOjAwOjEwLjQKWyAgICA3 LjI3ODA2M10gaHViIDEtMDoxLjA6IFVTQiBodWIgZm91bmQKWyAgICA3LjI3ODIxMF0gaHVi IDEtMDoxLjA6IDggcG9ydHMgZGV0ZWN0ZWQKWyAgICA3LjMxNDkyNV0gaW5wdXQ6IFBDIFNw ZWFrZXIgYXMgL2RldmljZXMvcGxhdGZvcm0vcGNzcGtyL2lucHV0L2lucHV0NgpbICAgIDcu MzcxMDk1XSBzbmRfaGRhX2ludGVsIDAwMDA6MDA6MDEuMTogUENJOiBEaXNhbGxvd2luZyBE QUMgZm9yIGRldmljZQpbICAgIDcuMzcyMzYzXSBzbmRfaGRhX2ludGVsIDAwMDA6MDA6MTQu MDogUENJOiBEaXNhbGxvd2luZyBEQUMgZm9yIGRldmljZQpbICAgIDcuMzc0MDExXSBzbmRf aGRhX2ludGVsIDAwMDA6MDA6MDEuMTogQ09SQiByZXNldCB0aW1lb3V0IzEsIENPUkJSUCA9 IDAKWyAgICA3LjM5NDM4Ml0gdWhjaV9oY2Q6IFVTQiBVbml2ZXJzYWwgSG9zdCBDb250cm9s bGVyIEludGVyZmFjZSBkcml2ZXIKWyAgICA3LjM5NTMzOV0gdWhjaV9oY2QgMDAwMDowMDox MC4wOiBVSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDcuMzk3MTI5XSB1aGNpX2hjZCAwMDAw OjAwOjEwLjA6IG5ldyBVU0IgYnVzIHJlZ2lzdGVyZWQsIGFzc2lnbmVkIGJ1cyBudW1iZXIg MgpbICAgIDcuMzk3MjY2XSB1aGNpX2hjZCAwMDAwOjAwOjEwLjA6IGlycSAyMCwgaW8gYmFz ZSAweDAwMDBhMDgwClsgICAgNy4zOTc4MTddIHVzYiB1c2IyOiBOZXcgVVNCIGRldmljZSBm b3VuZCwgaWRWZW5kb3I9MWQ2YiwgaWRQcm9kdWN0PTAwMDEKWyAgICA3LjM5NzgyNl0gdXNi IHVzYjI6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0zLCBQcm9kdWN0PTIsIFNlcmlh bE51bWJlcj0xClsgICAgNy4zOTc4MzRdIHVzYiB1c2IyOiBQcm9kdWN0OiBVSENJIEhvc3Qg Q29udHJvbGxlcgpbICAgIDcuMzk3ODQxXSB1c2IgdXNiMjogTWFudWZhY3R1cmVyOiBMaW51 eCAzLjE5LjggdWhjaV9oY2QKWyAgICA3LjM5Nzg0OF0gdXNiIHVzYjI6IFNlcmlhbE51bWJl cjogMDAwMDowMDoxMC4wClsgICAgNy4zOTk0NDhdIGh1YiAyLTA6MS4wOiBVU0IgaHViIGZv dW5kClsgICAgNy4zOTk1MDhdIGh1YiAyLTA6MS4wOiAyIHBvcnRzIGRldGVjdGVkClsgICAg Ny40MDIzMDZdIHVoY2lfaGNkIDAwMDA6MDA6MTAuMTogVUhDSSBIb3N0IENvbnRyb2xsZXIK WyAgICA3LjQwNDU0NV0gdWhjaV9oY2QgMDAwMDowMDoxMC4xOiBuZXcgVVNCIGJ1cyByZWdp c3RlcmVkLCBhc3NpZ25lZCBidXMgbnVtYmVyIDMKWyAgICA3LjQwNDY2M10gdWhjaV9oY2Qg MDAwMDowMDoxMC4xOiBpcnEgMjIsIGlvIGJhc2UgMHgwMDAwYTAwMApbICAgIDcuNDA1OTg1 XSB1c2IgdXNiMzogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJv ZHVjdD0wMDAxClsgICAgNy40MDU5OTRdIHVzYiB1c2IzOiBOZXcgVVNCIGRldmljZSBzdHJp bmdzOiBNZnI9MywgUHJvZHVjdD0yLCBTZXJpYWxOdW1iZXI9MQpbICAgIDcuNDA2MDMwXSB1 c2IgdXNiMzogUHJvZHVjdDogVUhDSSBIb3N0IENvbnRyb2xsZXIKWyAgICA3LjQwNjAzOF0g dXNiIHVzYjM6IE1hbnVmYWN0dXJlcjogTGludXggMy4xOS44IHVoY2lfaGNkClsgICAgNy40 MDYwNDVdIHVzYiB1c2IzOiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MTAuMQpbICAgIDcuNDA5 NTUyXSBodWIgMy0wOjEuMDogVVNCIGh1YiBmb3VuZApbICAgIDcuNDA5NjQyXSBodWIgMy0w OjEuMDogMiBwb3J0cyBkZXRlY3RlZApbICAgIDcuNDEyMjIzXSB1aGNpX2hjZCAwMDAwOjAw OjEwLjI6IFVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgNy40MTQwOTFdIHVoY2lfaGNkIDAw MDA6MDA6MTAuMjogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNzaWduZWQgYnVzIG51bWJl ciA0ClsgICAgNy40MTQxNDhdIHVoY2lfaGNkIDAwMDA6MDA6MTAuMjogaXJxIDIxLCBpbyBi YXNlIDB4MDAwMDljMDAKWyAgICA3LjQxNzI3N10gdXNiIHVzYjQ6IE5ldyBVU0IgZGV2aWNl IGZvdW5kLCBpZFZlbmRvcj0xZDZiLCBpZFByb2R1Y3Q9MDAwMQpbICAgIDcuNDE3Mjg5XSB1 c2IgdXNiNDogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTMsIFByb2R1Y3Q9MiwgU2Vy aWFsTnVtYmVyPTEKWyAgICA3LjQxNzI5OF0gdXNiIHVzYjQ6IFByb2R1Y3Q6IFVIQ0kgSG9z dCBDb250cm9sbGVyClsgICAgNy40MTczMDVdIHVzYiB1c2I0OiBNYW51ZmFjdHVyZXI6IExp bnV4IDMuMTkuOCB1aGNpX2hjZApbICAgIDcuNDE3MzEyXSB1c2IgdXNiNDogU2VyaWFsTnVt YmVyOiAwMDAwOjAwOjEwLjIKWyAgICA3LjQxOTg5OF0gaHViIDQtMDoxLjA6IFVTQiBodWIg Zm91bmQKWyAgICA3LjQxOTk3MF0gaHViIDQtMDoxLjA6IDIgcG9ydHMgZGV0ZWN0ZWQKWyAg ICA3LjQyNTQxOF0gdWhjaV9oY2QgMDAwMDowMDoxMC4zOiBVSENJIEhvc3QgQ29udHJvbGxl cgpbICAgIDcuNDI2MTk5XSB1aGNpX2hjZCAwMDAwOjAwOjEwLjM6IG5ldyBVU0IgYnVzIHJl Z2lzdGVyZWQsIGFzc2lnbmVkIGJ1cyBudW1iZXIgNQpbICAgIDcuNDI2MjU4XSB1aGNpX2hj ZCAwMDAwOjAwOjEwLjM6IGlycSAyMywgaW8gYmFzZSAweDAwMDA5ODgwClsgICAgNy40MjY1 NzhdIHVzYiB1c2I1OiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MWQ2YiwgaWRQ cm9kdWN0PTAwMDEKWyAgICA3LjQyNjU4N10gdXNiIHVzYjU6IE5ldyBVU0IgZGV2aWNlIHN0 cmluZ3M6IE1mcj0zLCBQcm9kdWN0PTIsIFNlcmlhbE51bWJlcj0xClsgICAgNy40MjY1OTRd IHVzYiB1c2I1OiBQcm9kdWN0OiBVSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDcuNDI2NjAy XSB1c2IgdXNiNTogTWFudWZhY3R1cmVyOiBMaW51eCAzLjE5LjggdWhjaV9oY2QKWyAgICA3 LjQyNjYwOF0gdXNiIHVzYjU6IFNlcmlhbE51bWJlcjogMDAwMDowMDoxMC4zClsgICAgNy40 Mjg5MjJdIGh1YiA1LTA6MS4wOiBVU0IgaHViIGZvdW5kClsgICAgNy40Mjg5NzVdIGh1YiA1 LTA6MS4wOiAyIHBvcnRzIGRldGVjdGVkClsgICAgNy45Njk5NTRdIHBhZGxvY2tfYWVzOiBV c2luZyBWSUEgUGFkTG9jayBBQ0UgZm9yIEFFUyBhbGdvcml0aG0uClsgICAgOC4xOTc5NDVd IHNvdW5kIGhkYXVkaW9DMkQwOiBhdXRvY29uZmlnOiBsaW5lX291dHM9MSAoMHgyNC8weDAv MHgwLzB4MC8weDApIHR5cGU6bGluZQpbICAgIDguMTk3OTY0XSBzb3VuZCBoZGF1ZGlvQzJE MDogICAgc3BlYWtlcl9vdXRzPTAgKDB4MC8weDAvMHgwLzB4MC8weDApClsgICAgOC4xOTc5 NzNdIHNvdW5kIGhkYXVkaW9DMkQwOiAgICBocF9vdXRzPTEgKDB4MjgvMHgwLzB4MC8weDAv MHgwKQpbICAgIDguMTk3OTgwXSBzb3VuZCBoZGF1ZGlvQzJEMDogICAgbW9ubzogbW9ub19v dXQ9MHgwClsgICAgOC4xOTc5ODddIHNvdW5kIGhkYXVkaW9DMkQwOiAgICBkaWctb3V0PTB4 MmQvMHgwClsgICAgOC4xOTc5OTNdIHNvdW5kIGhkYXVkaW9DMkQwOiAgICBpbnB1dHM6Clsg ICAgOC4xOTgwMzZdIHNvdW5kIGhkYXVkaW9DMkQwOiAgICAgIEZyb250IE1pYz0weDI5Clsg ICAgOC4xOTgwNTFdIHNvdW5kIGhkYXVkaW9DMkQwOiAgICAgIFJlYXIgTWljPTB4MmIKWyAg ICA4LjE5ODA2MF0gc291bmQgaGRhdWRpb0MyRDA6ICAgICAgTGluZT0weDJhClsgICAgOC4y MjQ3NDhdIGlucHV0OiBIREEgVklBIFZUODJ4eCBGcm9udCBNaWMgYXMgL2RldmljZXMvcGNp MDAwMDowMC8wMDAwOjAwOjE0LjAvc291bmQvY2FyZDIvaW5wdXQ3ClsgICAgOC4yMjYxNzNd IGlucHV0OiBIREEgVklBIFZUODJ4eCBSZWFyIE1pYyBhcyAvZGV2aWNlcy9wY2kwMDAwOjAw LzAwMDA6MDA6MTQuMC9zb3VuZC9jYXJkMi9pbnB1dDgKWyAgICA4LjIyNzExNF0gaW5wdXQ6 IEhEQSBWSUEgVlQ4Mnh4IExpbmUgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjE0 LjAvc291bmQvY2FyZDIvaW5wdXQ5ClsgICAgOC4yMjgwMzNdIGlucHV0OiBIREEgVklBIFZU ODJ4eCBMaW5lIE91dCBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MTQuMC9zb3Vu ZC9jYXJkMi9pbnB1dDEwClsgICAgOC4yMjg5MzNdIGlucHV0OiBIREEgVklBIFZUODJ4eCBG cm9udCBIZWFkcGhvbmUgYXMgL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjE0LjAvc291 bmQvY2FyZDIvaW5wdXQxMQpbICAgIDguMjQ0NjM5XSBwYWRsb2NrX3NoYTogVXNpbmcgVklB IFBhZExvY2sgQUNFIGZvciBTSEExL1NIQTI1NiBhbGdvcml0aG1zLgpbICAgIDguNDYzNzg4 XSBpbnB1dDogSEQtQXVkaW8gR2VuZXJpYyBIRE1JL0RQLHBjbT0zIGFzIC9kZXZpY2VzL3Bj aTAwMDA6MDAvMDAwMDowMDowMS4xL3NvdW5kL2NhcmQxL2lucHV0MTIKWyAgICA4LjU2ODkx M10gVklBIEdyYXBoaWNzIEludGVncmF0aW9uIENoaXBzZXQgZnJhbWVidWZmZXIgMi40IGlu aXRpYWxpemluZwpbICAgIDguNTc1NTM0XSBpMmMgaTJjLTE6IGFkYXB0ZXIgW3ZpYWZiIGky YyBpb19wb3J0IGlkeCAweDI2XSByZWdpc3RlcmVkClsgICAgOC41NzU5NjNdIGkyYyBpMmMt MjogYWRhcHRlciBbdmlhZmIgaTJjIGlvX3BvcnQgaWR4IDB4MzFdIHJlZ2lzdGVyZWQKWyAg ICA4LjU3Njg2NF0gaTJjIGkyYy0zOiBhZGFwdGVyIFt2aWFmYiBpMmMgaW9fcG9ydCBpZHgg MHgyY10gcmVnaXN0ZXJlZApbICAgIDguNTc2OTQyXSB2aWFmYjogUHJvYmluZyBJMkMgYnVz IDB4MjYKWyAgICA4LjU3Njk1M10gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRy PTB4NTAsIGxlbj0xClsgICAgOC41NzY5NjJdIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMV0g UiwgYWRkcj0weDUwLCBsZW49MTI4ClsgICAgOC41Nzg5NTddIGkyYyBpMmMtMTogbWFzdGVy X3hmZXJbMF0gVywgYWRkcj0weDQwLCBsZW49MQpbICAgIDguNTc4OTY2XSBpMmMgaTJjLTE6 IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg0MCwgbGVuPTQKWyAgICA4LjU4MDI2Ml0gaTJj IGkyYy0xOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MDgsIGxlbj0xClsgICAgOC41ODAy NjldIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDA4LCBsZW49NApbICAg IDguNTgxNTM4XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgwOSwgbGVu PTEKWyAgICA4LjU4MTU0NV0gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4 MDksIGxlbj00ClsgICAgOC41ODI4MTldIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMF0gVywg YWRkcj0weDBhLCBsZW49MQpbICAgIDguNTgyODI2XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVy WzFdIFIsIGFkZHI9MHgwYSwgbGVuPTQKWyAgICA4LjU4NDEwN10gaTJjIGkyYy0xOiBtYXN0 ZXJfeGZlclswXSBXLCBhZGRyPTB4MGIsIGxlbj0xClsgICAgOC41ODQxMTRdIGkyYyBpMmMt MTogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDBiLCBsZW49NApbICAgIDguNTg2Mjc5XSBp MmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgwYywgbGVuPTEKWyAgICA4LjU4 NjI4OF0gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4MGMsIGxlbj00Clsg ICAgOC41ODgzMzZdIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDBkLCBs ZW49MQpbICAgIDguNTg4MzQ1XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9 MHgwZCwgbGVuPTQKWyAgICA4LjU4OTYxMl0gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclswXSBX LCBhZGRyPTB4MGUsIGxlbj0xClsgICAgOC41ODk2MTldIGkyYyBpMmMtMTogbWFzdGVyX3hm ZXJbMV0gUiwgYWRkcj0weDBlLCBsZW49NApbICAgIDguNTkwODgzXSBpMmMgaTJjLTE6IG1h c3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgwZiwgbGVuPTEKWyAgICA4LjU5MDg5MV0gaTJjIGky Yy0xOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4MGYsIGxlbj00ClsgICAgOC41OTIxNzRd IGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDM4LCBsZW49MQpbICAgIDgu NTkyMTgyXSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgzOCwgbGVuPTQK WyAgICA4LjU5MzQ0N10gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MjAs IGxlbj0xClsgICAgOC41OTM0NTRdIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMV0gUiwgYWRk cj0weDIwLCBsZW49MQpbICAgIDguNTk0NzE5XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzBd IFcsIGFkZHI9MHgyMSwgbGVuPTEKWyAgICA4LjU5NDcyNl0gaTJjIGkyYy0xOiBtYXN0ZXJf eGZlclsxXSBSLCBhZGRyPTB4MjEsIGxlbj0xClsgICAgOC41OTU5OTddIGkyYyBpMmMtMTog bWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDIwLCBsZW49MQpbICAgIDguNTk2MDExXSBpMmMg aTJjLTE6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgyMCwgbGVuPTEKWyAgICA4LjU5NzI3 N10gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MjEsIGxlbj0xClsgICAg OC41OTcyODRdIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDIxLCBsZW49 MQpbICAgIDguNTk4NTU0XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgy MCwgbGVuPTEKWyAgICA4LjU5ODU2Ml0gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclsxXSBSLCBh ZGRyPTB4MjAsIGxlbj0xClsgICAgOC41OTk4MjhdIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJb MF0gVywgYWRkcj0weDM4LCBsZW49MQpbICAgIDguNTk5ODM1XSBpMmMgaTJjLTE6IG1hc3Rl cl94ZmVyWzFdIFIsIGFkZHI9MHgzOCwgbGVuPTQKWyAgICA4LjYwMTExOF0gaTJjIGkyYy0x OiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MzksIGxlbj0xClsgICAgOC42MDExMjZdIGky YyBpMmMtMTogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDM5LCBsZW49NApbICAgIDguNjAy Mzk0XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgzYSwgbGVuPTEKWyAg ICA4LjYwMjQwMV0gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4M2EsIGxl bj00ClsgICAgOC42MDUyOThdIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0w eDNiLCBsZW49MQpbICAgIDguNjA1MzA4XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzFdIFIs IGFkZHI9MHgzYiwgbGVuPTQKWyAgICA4LjYwNjU3M10gaTJjIGkyYy0xOiBtYXN0ZXJfeGZl clswXSBXLCBhZGRyPTB4M2MsIGxlbj0xClsgICAgOC42MDY1ODFdIGkyYyBpMmMtMTogbWFz dGVyX3hmZXJbMV0gUiwgYWRkcj0weDNjLCBsZW49NApbICAgIDguNjA3ODU2XSBpMmMgaTJj LTE6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgzZCwgbGVuPTEKWyAgICA4LjYwNzg2NF0g aTJjIGkyYy0xOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4M2QsIGxlbj00ClsgICAgOC42 MDkxNDhdIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDNlLCBsZW49MQpb ICAgIDguNjA5MTU2XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgzZSwg bGVuPTQKWyAgICA4LjYxMDQ3Ml0gaTJjIGkyYy0xOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRy PTB4M2YsIGxlbj0xClsgICAgOC42MTA0ODBdIGkyYyBpMmMtMTogbWFzdGVyX3hmZXJbMV0g UiwgYWRkcj0weDNmLCBsZW49NApbICAgIDguNjExNzUxXSBpMmMgaTJjLTE6IG1hc3Rlcl94 ZmVyWzBdIFcsIGFkZHI9MHg3NSwgbGVuPTEKWyAgICA4LjYxMTc1OV0gaTJjIGkyYy0xOiBt YXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4NzUsIGxlbj0xClsgICAgOC42MTMwNTJdIGkyYyBp MmMtMTogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDc2LCBsZW49MQpbICAgIDguNjEzMDU5 XSBpMmMgaTJjLTE6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg3NiwgbGVuPTEKWyAgICA4 LjYxNDMyNl0gdmlhZmI6IFByb2JpbmcgSTJDIGJ1cyAweDMxClsgICAgOC42MTQzMzZdIGky YyBpMmMtMjogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDUwLCBsZW49MQpbICAgIDguNjE0 MzQzXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg1MCwgbGVuPTEyOApb ICAgIDguNjE1NjEyXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHg0MCwg bGVuPTEKWyAgICA4LjYxNTYxOV0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRy PTB4NDAsIGxlbj00ClsgICAgOC42MTc0ODBdIHZpYWZiOiBGb3VuZCBWVDE2MzYgTFZEUyBU cmFuc21pdHRlcgpbICAgIDguNjE3NDg4XSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcs IGFkZHI9MHgwOCwgbGVuPTEKWyAgICA4LjYxNzQ5NV0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZl clsxXSBSLCBhZGRyPTB4MDgsIGxlbj00ClsgICAgOC42MTkwNTddIGkyYyBpMmMtMjogbWFz dGVyX3hmZXJbMF0gVywgYWRkcj0weDA5LCBsZW49MQpbICAgIDguNjE5MDY1XSBpMmMgaTJj LTI6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgwOSwgbGVuPTQKWyAgICA4LjYyMDM0MF0g aTJjIGkyYy0yOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MGEsIGxlbj0xClsgICAgOC42 MjAzNDddIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDBhLCBsZW49NApb ICAgIDguNjIxNjIxXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgwYiwg bGVuPTEKWyAgICA4LjYyMTYyOF0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRy PTB4MGIsIGxlbj00ClsgICAgOC42MjI5MDBdIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMF0g VywgYWRkcj0weDBjLCBsZW49MQpbICAgIDguNjIyOTA4XSBpMmMgaTJjLTI6IG1hc3Rlcl94 ZmVyWzFdIFIsIGFkZHI9MHgwYywgbGVuPTQKWyAgICA4LjYyNDE5MV0gaTJjIGkyYy0yOiBt YXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MGQsIGxlbj0xClsgICAgOC42MjQxOThdIGkyYyBp MmMtMjogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDBkLCBsZW49NApbICAgIDguNjI1NDY0 XSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgwZSwgbGVuPTEKWyAgICA4 LjYyNTQ3MV0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4MGUsIGxlbj00 ClsgICAgOC42MjY3NDJdIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDBm LCBsZW49MQpbICAgIDguNjI2NzQ5XSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzFdIFIsIGFk ZHI9MHgwZiwgbGVuPTQKWyAgICA4LjYyODA3OV0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclsw XSBXLCBhZGRyPTB4MzgsIGxlbj0xClsgICAgOC42MjgwODddIGkyYyBpMmMtMjogbWFzdGVy X3hmZXJbMV0gUiwgYWRkcj0weDM4LCBsZW49NApbICAgIDguNjI5MzUwXSBpMmMgaTJjLTI6 IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgyMCwgbGVuPTEKWyAgICA4LjYyOTM1N10gaTJj IGkyYy0yOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4MjAsIGxlbj0xClsgICAgOC42MzA2 MjZdIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDIxLCBsZW49MQpbICAg IDguNjMwNjMzXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgyMSwgbGVu PTEKWyAgICA4LjYzMTkzMV0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4 MjAsIGxlbj0xClsgICAgOC42MzE5MzhdIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMV0gUiwg YWRkcj0weDIwLCBsZW49MQpbICAgIDguNjMzMjMyXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVy WzBdIFcsIGFkZHI9MHgyMSwgbGVuPTEKWyAgICA4LjYzMzIzOV0gaTJjIGkyYy0yOiBtYXN0 ZXJfeGZlclsxXSBSLCBhZGRyPTB4MjEsIGxlbj0xClsgICAgOC42MzQ1MTBdIGkyYyBpMmMt MjogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDIwLCBsZW49MQpbICAgIDguNjM0NTE3XSBp MmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgyMCwgbGVuPTEKWyAgICA4LjYz NTc4N10gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MzgsIGxlbj0xClsg ICAgOC42MzU3OTRdIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDM4LCBs ZW49NApbICAgIDguNjM3MTA3XSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9 MHgzOSwgbGVuPTEKWyAgICA4LjYzNzExNV0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclsxXSBS LCBhZGRyPTB4MzksIGxlbj00ClsgICAgOC42MzgzNzldIGkyYyBpMmMtMjogbWFzdGVyX3hm ZXJbMF0gVywgYWRkcj0weDNhLCBsZW49MQpbICAgIDguNjM4Mzg2XSBpMmMgaTJjLTI6IG1h c3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgzYSwgbGVuPTQKWyAgICA4LjYzOTY1MV0gaTJjIGky Yy0yOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4M2IsIGxlbj0xClsgICAgOC42Mzk2NThd IGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDNiLCBsZW49NApbICAgIDgu NjQwOTYwXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgzYywgbGVuPTEK WyAgICA4LjY0MDk2OF0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4M2Ms IGxlbj00ClsgICAgOC42NDIyNTddIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMF0gVywgYWRk cj0weDNkLCBsZW49MQpbICAgIDguNjQyMjY0XSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzFd IFIsIGFkZHI9MHgzZCwgbGVuPTQKWyAgICA4LjY0MzUyOV0gaTJjIGkyYy0yOiBtYXN0ZXJf eGZlclswXSBXLCBhZGRyPTB4M2UsIGxlbj0xClsgICAgOC42NDM1MzZdIGkyYyBpMmMtMjog bWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDNlLCBsZW49NApbICAgIDguNjQ0ODAxXSBpMmMg aTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgzZiwgbGVuPTEKWyAgICA4LjY0NDgw OF0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4M2YsIGxlbj00ClsgICAg OC42NDYwOTJdIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDc1LCBsZW49 MQpbICAgIDguNjQ2MDk5XSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg3 NSwgbGVuPTEKWyAgICA4LjY0NzM3MF0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclswXSBXLCBh ZGRyPTB4NzYsIGxlbj0xClsgICAgOC42NDczNzddIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJb MV0gUiwgYWRkcj0weDc2LCBsZW49MQpbICAgIDguNjQ4NjM5XSB2aWFmYjogUHJvYmluZyBJ MkMgYnVzIDB4MkMKWyAgICA4LjY0ODY0N10gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclswXSBX LCBhZGRyPTB4NTAsIGxlbj0xClsgICAgOC42NDg2NTVdIGkyYyBpMmMtMzogbWFzdGVyX3hm ZXJbMV0gUiwgYWRkcj0weDUwLCBsZW49MTI4ClsgICAgOC42NDk5NzldIGkyYyBpMmMtMzog bWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDQwLCBsZW49MQpbICAgIDguNjQ5OTg2XSBpMmMg aTJjLTM6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg0MCwgbGVuPTQKWyAgICA4LjY1MTI4 OV0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MDgsIGxlbj0xClsgICAg OC42NTEyOTZdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDA4LCBsZW49 NApbICAgIDguNjUyNTgwXSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgw OSwgbGVuPTEKWyAgICA4LjY1MjU4N10gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclsxXSBSLCBh ZGRyPTB4MDksIGxlbj00ClsgICAgOC42NTM5MzddIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJb MF0gVywgYWRkcj0weDBhLCBsZW49MQpbICAgIDguNjUzOTQ0XSBpMmMgaTJjLTM6IG1hc3Rl cl94ZmVyWzFdIFIsIGFkZHI9MHgwYSwgbGVuPTQKWyAgICA4LjY1NTI3N10gaTJjIGkyYy0z OiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MGIsIGxlbj0xClsgICAgOC42NTUyODRdIGky YyBpMmMtMzogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDBiLCBsZW49NApbICAgIDguNjU2 NjY4XSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgwYywgbGVuPTEKWyAg ICA4LjY1NjY3Nl0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4MGMsIGxl bj00ClsgICAgOC42NTc5NzZdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0w eDBkLCBsZW49MQpbICAgIDguNjU3OTg0XSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzFdIFIs IGFkZHI9MHgwZCwgbGVuPTQKWyAgICA4LjY1OTMwNl0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZl clswXSBXLCBhZGRyPTB4MGUsIGxlbj0xClsgICAgOC42NTkzMTRdIGkyYyBpMmMtMzogbWFz dGVyX3hmZXJbMV0gUiwgYWRkcj0weDBlLCBsZW49NApbICAgIDguNjYwNjIwXSBpMmMgaTJj LTM6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgwZiwgbGVuPTEKWyAgICA4LjY2MDYyN10g aTJjIGkyYy0zOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4MGYsIGxlbj00ClsgICAgOC42 NjE5MzVdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDM4LCBsZW49MQpb ICAgIDguNjYxOTQyXSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgzOCwg bGVuPTQKWyAgICA4LjY2MzI1Nl0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRy PTB4MjAsIGxlbj0xClsgICAgOC42NjMyNjNdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMV0g UiwgYWRkcj0weDIwLCBsZW49MQpbICAgIDguNjY0NTkyXSBpMmMgaTJjLTM6IG1hc3Rlcl94 ZmVyWzBdIFcsIGFkZHI9MHgyMSwgbGVuPTEKWyAgICA4LjY2NDU5OV0gaTJjIGkyYy0zOiBt YXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4MjEsIGxlbj0xClsgICAgOC42NjU4OTRdIGkyYyBp MmMtMzogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDIwLCBsZW49MQpbICAgIDguNjY1OTAx XSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgyMCwgbGVuPTEKWyAgICA4 LjY2NzIwN10gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MjEsIGxlbj0x ClsgICAgOC42NjcyMTRdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDIx LCBsZW49MQpbICAgIDguNjY4NTQ2XSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzBdIFcsIGFk ZHI9MHgyMCwgbGVuPTEKWyAgICA4LjY2ODU1NF0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclsx XSBSLCBhZGRyPTB4MjAsIGxlbj0xClsgICAgOC42Njk4NDVdIGkyYyBpMmMtMzogbWFzdGVy X3hmZXJbMF0gVywgYWRkcj0weDM4LCBsZW49MQpbICAgIDguNjY5ODUyXSBpMmMgaTJjLTM6 IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHgzOCwgbGVuPTQKWyAgICA4LjY3MTE1Ml0gaTJj IGkyYy0zOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4MzksIGxlbj0xClsgICAgOC42NzEx NTldIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDM5LCBsZW49NApbICAg IDguNjcyNDQ0XSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgzYSwgbGVu PTEKWyAgICA4LjY3MjQ1MV0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4 M2EsIGxlbj00ClsgICAgOC42NzM3NDJdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMF0gVywg YWRkcj0weDNiLCBsZW49MQpbICAgIDguNjczNzQ5XSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVy WzFdIFIsIGFkZHI9MHgzYiwgbGVuPTQKWyAgICA4LjY3NTA1OV0gaTJjIGkyYy0zOiBtYXN0 ZXJfeGZlclswXSBXLCBhZGRyPTB4M2MsIGxlbj0xClsgICAgOC42NzUwNjZdIGkyYyBpMmMt MzogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDNjLCBsZW49NApbICAgIDguNjc2MzU2XSBp MmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgzZCwgbGVuPTEKWyAgICA4LjY3 NjM2NF0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4M2QsIGxlbj00Clsg ICAgOC42Nzc2NTRdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDNlLCBs ZW49MQpbICAgIDguNjc3NjYxXSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9 MHgzZSwgbGVuPTQKWyAgICA4LjY3ODk0N10gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclswXSBX LCBhZGRyPTB4M2YsIGxlbj0xClsgICAgOC42Nzg5NTRdIGkyYyBpMmMtMzogbWFzdGVyX3hm ZXJbMV0gUiwgYWRkcj0weDNmLCBsZW49NApbICAgIDguNjgwMjYxXSBpMmMgaTJjLTM6IG1h c3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHg3NSwgbGVuPTEKWyAgICA4LjY4MDI2OF0gaTJjIGky Yy0zOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4NzUsIGxlbj0xClsgICAgOC42ODE1NTJd IGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDc2LCBsZW49MQpbICAgIDgu NjgxNTYwXSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg3NiwgbGVuPTEK WyAgICA4LjY4Mjg0MV0gdmlhZmI6IEZpbmlzaGVkIEkyQyBidXMgcHJvYmluZwpbICAgIDgu NjgyODUxXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHgwOCwgbGVuPTEK WyAgICA4LjY4Mjg1OV0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4MDgs IGxlbj0xClsgICAgOC42ODQxNDddIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMF0gVywgYWRk cj0weDA4LCBsZW49MQpbICAgIDguNjg0MTU0XSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzFd IFIsIGFkZHI9MHgwOCwgbGVuPTEKWyAgICA4LjY4NTQ0NF0gaTJjIGkyYy0zOiBtYXN0ZXJf eGZlclswXSBXLCBhZGRyPTB4MDgsIGxlbj0xClsgICAgOC42ODU0NTFdIGkyYyBpMmMtMzog bWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0weDA4LCBsZW49MQpbICAgIDguNjg2NzQwXSBpMmMg aTJjLTM6IG1hc3Rlcl94ZmVyWzBdIFcsIGFkZHI9MHg1MCwgbGVuPTEKWyAgICA4LjY4Njc0 OF0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4NTAsIGxlbj0xClsgICAg OC42ODgwNTBdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDUwLCBsZW49 MQpbICAgIDguNjg4MDU3XSBpMmMgaTJjLTM6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg1 MCwgbGVuPTEKWyAgICA4LjY4OTM4OF0gaTJjIGkyYy0zOiBtYXN0ZXJfeGZlclswXSBXLCBh ZGRyPTB4NTAsIGxlbj0xClsgICAgOC42ODkzOTVdIGkyYyBpMmMtMzogbWFzdGVyX3hmZXJb MV0gUiwgYWRkcj0weDUwLCBsZW49MQpbICAgIDguNjkwNjg5XSBpMmMgaTJjLTM6IG1hc3Rl cl94ZmVyWzBdIFcsIGFkZHI9MHg1MCwgbGVuPTEKWyAgICA4LjY5MDY5Nl0gaTJjIGkyYy0z OiBtYXN0ZXJfeGZlclsxXSBSLCBhZGRyPTB4NTAsIGxlbj0xClsgICAgOC42OTE5ODNdIGky YyBpMmMtMjogbWFzdGVyX3hmZXJbMF0gVywgYWRkcj0weDQwLCBsZW49MQpbICAgIDguNjkx OTkwXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg0MCwgbGVuPTEKWyAg ICA4LjY5MzEwNl0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZlclswXSBXLCBhZGRyPTB4NDAsIGxl bj0xClsgICAgOC42OTMxMTNdIGkyYyBpMmMtMjogbWFzdGVyX3hmZXJbMV0gUiwgYWRkcj0w eDQwLCBsZW49MQpbICAgIDguNjk0MjIyXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcs IGFkZHI9MHg0MCwgbGVuPTEKWyAgICA4LjY5NDIyOV0gaTJjIGkyYy0yOiBtYXN0ZXJfeGZl clsxXSBSLCBhZGRyPTB4NDAsIGxlbj0xClsgICAgOC42OTUzMzVdIGkyYyBpMmMtMjogbWFz dGVyX3hmZXJbMF0gVywgYWRkcj0weDQwLCBsZW49MQpbICAgIDguNjk1MzQzXSBpMmMgaTJj LTI6IG1hc3Rlcl94ZmVyWzFdIFIsIGFkZHI9MHg0MCwgbGVuPTEKWyAgICA5LjE4MjA0N10g TGludXggYWdwZ2FydCBpbnRlcmZhY2UgdjAuMTAzClsgICAgOS4zNTEwNzZdIGF0YTM6IFNB VEEgbGluayB1cCAzLjAgR2JwcyAoU1N0YXR1cyAxMjMgU0NvbnRyb2wgMCkKWyAgICA5LjM1 MTU0M10gYXRhMy4xNTogUG9ydCBNdWx0aXBsaWVyIDEuMSwgMHgxMDk1OjB4MzcyNiByMjMs IDYgcG9ydHMsIGZlYXQgMHgxLzB4OQpbICAgIDkuMzYwODMwXSBhdGEzLjAwOiBoYXJkIHJl c2V0dGluZyBsaW5rClsgICAgOS4zNzc3ODZdIFtkcm1dIEluaXRpYWxpemVkIGRybSAxLjEu MCAyMDA2MDgxMApbICAgIDkuNTczMDYxXSBpMmMgaTJjLTI6IG1hc3Rlcl94ZmVyWzBdIFcs IGFkZHI9MHg0MCwgbGVuPTEKWyAgICA5LjU3MzA2N10gaTJjIGkyYy0yOiBtYXN0ZXJfeGZl clsxXSBSLCBhZGRyPTB4NDAsIGxlbj0xClsgICAgOS41NzQzMThdIGkyYyBpMmMtMjogbWFz dGVyX3hmZXJbMF0gVywgYWRkcj0weDQwLCBsZW49MgpbICAgIDkuNTc5MDU1XSBDb25zb2xl OiBzd2l0Y2hpbmcgdG8gY29sb3VyIGZyYW1lIGJ1ZmZlciBkZXZpY2UgODB4MzAKWyAgICA5 LjY0MjYxNV0gdmlhX2Nocm9tZTk6IFVua25vd24gc3ltYm9sIG11dGV4X2xvY2sgKGVyciAw KQpbICAgIDkuNjQyNzM5XSB2aWFfY2hyb21lOTogVW5rbm93biBzeW1ib2wgbXV0ZXhfbG9j a19pbnRlcnJ1cHRpYmxlIChlcnIgMCkKWyAgICA5LjY2NjQ0NF0gYXRhMy4wMDogU0FUQSBs aW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMjApClsgICAgOS42NjY0 OTldIGF0YTMuMDE6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgICA5Ljk3MTQ0MF0gYXRhMy4w MTogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMDApClsg ICAgOS45NzE0OTBdIGF0YTMuMDI6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDEwLjI3NjQz MV0gYXRhMy4wMjogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJv bCAzMDApClsgICAxMC4yNzY0ODFdIGF0YTMuMDM6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAg IDEwLjU4MTQzMl0gYXRhMy4wMzogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEy MyBTQ29udHJvbCAzMDApClsgICAxMC41ODE0ODJdIGF0YTMuMDQ6IGhhcmQgcmVzZXR0aW5n IGxpbmsKWyAgIDEwLjg4NjQyNF0gYXRhMy4wNDogU0FUQSBsaW5rIGRvd24gKFNTdGF0dXMg MCBTQ29udHJvbCAzMjApClsgICAxMC44ODY1MDldIGF0YTMuMDU6IGhhcmQgcmVzZXR0aW5n IGxpbmsKWyAgIDExLjE5MTQzOF0gYXRhMy4wNTogU0FUQSBsaW5rIHVwIDEuNSBHYnBzIChT U3RhdHVzIDExMyBTQ29udHJvbCAzMjApClsgICAxMS4xOTc2MTJdIGF0YTMuMDA6IEFUQS04 OiBTQU1TVU5HIEhEMjA0VUksIDFBUTEwMDAxLCBtYXggVURNQS8xMzMKWyAgIDExLjE5NzYy MV0gYXRhMy4wMDogMzkwNzAyOTE2OCBzZWN0b3JzLCBtdWx0aSAxNjogTEJBNDggTkNRIChk ZXB0aCAzMS8zMikKWyAgIDExLjIwMzgyNl0gYXRhMy4wMDogY29uZmlndXJlZCBmb3IgVURN QS8xMDAKWyAgIDExLjIwNDQxMF0gYXRhMy4wMTogc3VwcG9ydHMgRFJNIGZ1bmN0aW9ucyBh bmQgbWF5IG5vdCBiZSBmdWxseSBhY2Nlc3NpYmxlClsgICAxMS4yMDQ0MjBdIGF0YTMuMDE6 IEFUQS04OiBTVDIwMDBOQzAwMC0xQ1gxNjQsIENFMDMsIG1heCBVRE1BLzEzMwpbICAgMTEu MjA0NDI3XSBhdGEzLjAxOiAzOTA3MDI5MTY4IHNlY3RvcnMsIG11bHRpIDE6IExCQTQ4IE5D USAoZGVwdGggMzEvMzIpClsgICAxMS4yMDUwNjFdIGF0YTMuMDE6IHN1cHBvcnRzIERSTSBm dW5jdGlvbnMgYW5kIG1heSBub3QgYmUgZnVsbHkgYWNjZXNzaWJsZQpbICAgMTEuMjA1MDc1 XSBhdGEzLjAxOiBjb25maWd1cmVkIGZvciBVRE1BLzEwMApbICAgMTEuMjA1ODE4XSBhdGEz LjAyOiBBVEEtODogU1QyMDAwREwwMDMtOVZUMTY2LCBDQzMyLCBtYXggVURNQS8xMzMKWyAg IDExLjIwNTgyNV0gYXRhMy4wMjogMzkwNzAyOTE2OCBzZWN0b3JzLCBtdWx0aSAwOiBMQkE0 OCBOQ1EgKGRlcHRoIDMxLzMyKQpbICAgMTEuMjA2Njg1XSBhdGEzLjAyOiBjb25maWd1cmVk IGZvciBVRE1BLzEwMApbICAgMTEuMjEyNzk5XSBhdGEzLjAzOiBBVEEtODogU0FNU1VORyBI RDIwNFVJLCAxQVExMDAwMSwgbWF4IFVETUEvMTMzClsgICAxMS4yMTI4MDddIGF0YTMuMDM6 IDM5MDcwMjkxNjggc2VjdG9ycywgbXVsdGkgMDogTEJBNDggTkNRIChkZXB0aCAzMS8zMikK WyAgIDExLjIxOTAzMV0gYXRhMy4wMzogY29uZmlndXJlZCBmb3IgVURNQS8xMDAKWyAgIDEx LjIxOTEyMF0gYXRhMzogRUggY29tcGxldGUKWyAgIDExLjIxOTQ5OV0gc2NzaSAyOjA6MDow OiBEaXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBTQU1TVU5HIEhEMjA0VUkgIDAwMDEgUFE6 IDAgQU5TSTogNQpbICAgMTEuMjIxNjAyXSBzZCAyOjA6MDowOiBbc2RiXSAzOTA3MDI5MTY4 IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMi4wMCBUQi8xLjgxIFRpQikKWyAgIDExLjIy MTkzMF0gc2QgMjowOjA6MDogW3NkYl0gV3JpdGUgUHJvdGVjdCBpcyBvZmYKWyAgIDExLjIy MTk0MF0gc2QgMjowOjA6MDogW3NkYl0gTW9kZSBTZW5zZTogMDAgM2EgMDAgMDAKWyAgIDEx LjIyMjExM10gc2QgMjowOjA6MDogW3NkYl0gV3JpdGUgY2FjaGU6IGVuYWJsZWQsIHJlYWQg Y2FjaGU6IGVuYWJsZWQsIGRvZXNuJ3Qgc3VwcG9ydCBEUE8gb3IgRlVBClsgICAxMS4yMjIz OTZdIHNkIDI6MDowOjA6IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBzZzIgdHlwZSAwClsgICAx MS4yMjM5ODZdIHNjc2kgMjoxOjA6MDogRGlyZWN0LUFjY2VzcyAgICAgQVRBICAgICAgU1Qy MDAwTkMwMDAtMUNYMSBDRTAzIFBROiAwIEFOU0k6IDUKWyAgIDExLjIyNjA3OF0gc2QgMjox OjA6MDogW3NkY10gMzkwNzAyOTE2OCA1MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDIuMDAg VEIvMS44MSBUaUIpClsgICAxMS4yMjYwODhdIHNkIDI6MTowOjA6IFtzZGNdIDQwOTYtYnl0 ZSBwaHlzaWNhbCBibG9ja3MKWyAgIDExLjIyNjMyOV0gc2QgMjoxOjA6MDogW3NkY10gV3Jp dGUgUHJvdGVjdCBpcyBvZmYKWyAgIDExLjIyNjMzOF0gc2QgMjoxOjA6MDogW3NkY10gTW9k ZSBTZW5zZTogMDAgM2EgMDAgMDAKWyAgIDExLjIyNjQ0MF0gc2QgMjoxOjA6MDogW3NkY10g V3JpdGUgY2FjaGU6IGVuYWJsZWQsIHJlYWQgY2FjaGU6IGVuYWJsZWQsIGRvZXNuJ3Qgc3Vw cG9ydCBEUE8gb3IgRlVBClsgICAxMS4yMjY2NzddIHNkIDI6MTowOjA6IEF0dGFjaGVkIHNj c2kgZ2VuZXJpYyBzZzMgdHlwZSAwClsgICAxMS4yMjg2MTFdIHNjc2kgMjoyOjA6MDogRGly ZWN0LUFjY2VzcyAgICAgQVRBICAgICAgU1QyMDAwREwwMDMtOVZUMSBDQzMyIFBROiAwIEFO U0k6IDUKWyAgIDExLjIzMDM5OV0gc2QgMjoyOjA6MDogW3NkZF0gMzkwNzAyOTE2OCA1MTIt Ynl0ZSBsb2dpY2FsIGJsb2NrczogKDIuMDAgVEIvMS44MSBUaUIpClsgICAxMS4yMzA2MzRd IHNkIDI6MjowOjA6IFtzZGRdIFdyaXRlIFByb3RlY3QgaXMgb2ZmClsgICAxMS4yMzA2NDRd IHNkIDI6MjowOjA6IFtzZGRdIE1vZGUgU2Vuc2U6IDAwIDNhIDAwIDAwClsgICAxMS4yMzA3 NDRdIHNkIDI6MjowOjA6IFtzZGRdIFdyaXRlIGNhY2hlOiBlbmFibGVkLCByZWFkIGNhY2hl OiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZVQQpbICAgMTEuMjMwOTIyXSBz ZCAyOjI6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2c0IHR5cGUgMApbICAgMTEuMjMz MjU5XSBzY3NpIDI6MzowOjA6IERpcmVjdC1BY2Nlc3MgICAgIEFUQSAgICAgIFNBTVNVTkcg SEQyMDRVSSAgMDAwMSBQUTogMCBBTlNJOiA1ClsgICAxMS4yMzUxMzNdIHNkIDI6MzowOjA6 IFtzZGVdIDM5MDcwMjkxNjggNTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6ICgyLjAwIFRCLzEu ODEgVGlCKQpbICAgMTEuMjM1NDk1XSBzZCAyOjM6MDowOiBbc2RlXSBXcml0ZSBQcm90ZWN0 IGlzIG9mZgpbICAgMTEuMjM1NTA2XSBzZCAyOjM6MDowOiBbc2RlXSBNb2RlIFNlbnNlOiAw MCAzYSAwMCAwMApbICAgMTEuMjM1NjE1XSBzZCAyOjM6MDowOiBbc2RlXSBXcml0ZSBjYWNo ZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBv ciBGVUEKWyAgIDExLjIzNTY2OF0gc2QgMjozOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmlj IHNnNSB0eXBlIDAKWyAgIDExLjI2MTY4Ml0gIHNkYjogc2RiMQpbICAgMTEuMjYzNDM2XSBz ZCAyOjA6MDowOiBbc2RiXSBBdHRhY2hlZCBTQ1NJIGRpc2sKWyAgIDExLjI3MjMzNV0gIHNk ZTogc2RlMQpbICAgMTEuMjczODE0XSBzZCAyOjM6MDowOiBbc2RlXSBBdHRhY2hlZCBTQ1NJ IGRpc2sKWyAgIDExLjI3NzgxN10gIHNkZDogc2RkMQpbICAgMTEuMjc5MTg5XSBzZCAyOjI6 MDowOiBbc2RkXSBBdHRhY2hlZCBTQ1NJIGRpc2sKWyAgIDExLjI4MjcyOF0gIHNkYzogc2Rj MQpbICAgMTEuMjg0MjQwXSBzZCAyOjE6MDowOiBbc2RjXSBBdHRhY2hlZCBTQ1NJIGRpc2sK WyAgIDEzLjM2OTA1OV0gYXRhNDogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEy MyBTQ29udHJvbCAwKQpbICAgMTMuMzY5NDM1XSBhdGE0LjE1OiBQb3J0IE11bHRpcGxpZXIg MS4xLCAweDEwOTU6MHgzODI2IHIyMywgNiBwb3J0cywgZmVhdCAweDEvMHg5ClsgICAxMy4z Nzg4MDFdIGF0YTQuMDA6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDEzLjY4NDQzNl0gYXRh NC4wMDogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMjAp ClsgICAxMy42ODQ0ODZdIGF0YTQuMDE6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDEzLjk4 OTQzN10gYXRhNC4wMTogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29u dHJvbCAzMDApClsgICAxMy45ODk0ODZdIGF0YTQuMDI6IGhhcmQgcmVzZXR0aW5nIGxpbmsK WyAgIDE0LjI5NDQ0MV0gYXRhNC4wMjogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVz IDEyMyBTQ29udHJvbCAzMDApClsgICAxNC4yOTQ0OTFdIGF0YTQuMDM6IGhhcmQgcmVzZXR0 aW5nIGxpbmsKWyAgIDE0LjU5OTQzNV0gYXRhNC4wMzogU0FUQSBsaW5rIHVwIDMuMCBHYnBz IChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMDApClsgICAxNC41OTk0ODVdIGF0YTQuMDQ6IGhh cmQgcmVzZXR0aW5nIGxpbmsKWyAgIDE0LjkwNDQzNV0gYXRhNC4wNDogU0FUQSBsaW5rIGRv d24gKFNTdGF0dXMgMCBTQ29udHJvbCAzMjApClsgICAxNC45MDQ1MjBdIGF0YTQuMDU6IGhh cmQgcmVzZXR0aW5nIGxpbmsKWyAgIDE1LjIwOTQ1Ml0gYXRhNC4wNTogU0FUQSBsaW5rIHVw IDEuNSBHYnBzIChTU3RhdHVzIDExMyBTQ29udHJvbCAzMjApClsgICAxNS4yMTAwOTFdIGF0 YTQuMDA6IHN1cHBvcnRzIERSTSBmdW5jdGlvbnMgYW5kIG1heSBub3QgYmUgZnVsbHkgYWNj ZXNzaWJsZQpbICAgMTUuMjEwMTAyXSBhdGE0LjAwOiBBVEEtODogU1QyMDAwTkMwMDAtMUNY MTY0LCBDRTAzLCBtYXggVURNQS8xMzMKWyAgIDE1LjIxMDExMF0gYXRhNC4wMDogMzkwNzAy OTE2OCBzZWN0b3JzLCBtdWx0aSAxOiBMQkE0OCBOQ1EgKGRlcHRoIDMxLzMyKQpbICAgMTUu MjEwNzQ1XSBhdGE0LjAwOiBzdXBwb3J0cyBEUk0gZnVuY3Rpb25zIGFuZCBtYXkgbm90IGJl IGZ1bGx5IGFjY2Vzc2libGUKWyAgIDE1LjIxMDc1OV0gYXRhNC4wMDogY29uZmlndXJlZCBm b3IgVURNQS8xMDAKWyAgIDE1LjIxMTM2M10gYXRhNC4wMTogc3VwcG9ydHMgRFJNIGZ1bmN0 aW9ucyBhbmQgbWF5IG5vdCBiZSBmdWxseSBhY2Nlc3NpYmxlClsgICAxNS4yMTEzNzJdIGF0 YTQuMDE6IEFUQS04OiBTVDIwMDBOQzAwMC0xQ1gxNjQsIENFMDMsIG1heCBVRE1BLzEzMwpb ICAgMTUuMjExMzc5XSBhdGE0LjAxOiAzOTA3MDI5MTY4IHNlY3RvcnMsIG11bHRpIDE6IExC QTQ4IE5DUSAoZGVwdGggMzEvMzIpClsgICAxNS4yMTIwMzFdIGF0YTQuMDE6IHN1cHBvcnRz IERSTSBmdW5jdGlvbnMgYW5kIG1heSBub3QgYmUgZnVsbHkgYWNjZXNzaWJsZQpbICAgMTUu MjEyMDQ0XSBhdGE0LjAxOiBjb25maWd1cmVkIGZvciBVRE1BLzEwMApbICAgMTUuMjEyNzIw XSBhdGE0LjAyOiBzdXBwb3J0cyBEUk0gZnVuY3Rpb25zIGFuZCBtYXkgbm90IGJlIGZ1bGx5 IGFjY2Vzc2libGUKWyAgIDE1LjIxMjcyOV0gYXRhNC4wMjogQVRBLTk6IFNUNDAwME5DMDAw LTFGUjE2OCwgQ0UwMywgbWF4IFVETUEvMTMzClsgICAxNS4yMTI3MzZdIGF0YTQuMDI6IDc4 MTQwMzcxNjggc2VjdG9ycywgbXVsdGkgMTogTEJBNDggTkNRIChkZXB0aCAzMS8zMikKWyAg IDE1LjIxMzQ5Nl0gYXRhNC4wMjogc3VwcG9ydHMgRFJNIGZ1bmN0aW9ucyBhbmQgbWF5IG5v dCBiZSBmdWxseSBhY2Nlc3NpYmxlClsgICAxNS4yMTM1MDldIGF0YTQuMDI6IGNvbmZpZ3Vy ZWQgZm9yIFVETUEvMTAwClsgICAxNS4yMTQxOTRdIGF0YTQuMDM6IHN1cHBvcnRzIERSTSBm dW5jdGlvbnMgYW5kIG1heSBub3QgYmUgZnVsbHkgYWNjZXNzaWJsZQpbICAgMTUuMjE0MjAz XSBhdGE0LjAzOiBBVEEtOTogU1Q0MDAwTkMwMDAtMUZSMTY4LCBDRTAzLCBtYXggVURNQS8x MzMKWyAgIDE1LjIxNDIxMF0gYXRhNC4wMzogNzgxNDAzNzE2OCBzZWN0b3JzLCBtdWx0aSAx OiBMQkE0OCBOQ1EgKGRlcHRoIDMxLzMyKQpbICAgMTUuMjE0OTU2XSBhdGE0LjAzOiBzdXBw b3J0cyBEUk0gZnVuY3Rpb25zIGFuZCBtYXkgbm90IGJlIGZ1bGx5IGFjY2Vzc2libGUKWyAg IDE1LjIxNDk2OF0gYXRhNC4wMzogY29uZmlndXJlZCBmb3IgVURNQS8xMDAKWyAgIDE1LjIx NTA4MV0gYXRhNDogRUggY29tcGxldGUKWyAgIDE1LjIxNTQzMF0gc2NzaSAzOjA6MDowOiBE aXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBTVDIwMDBOQzAwMC0xQ1gxIENFMDMgUFE6IDAg QU5TSTogNQpbICAgMTUuMjE2NzQzXSBzZCAzOjA6MDowOiBbc2RmXSAzOTA3MDI5MTY4IDUx Mi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMi4wMCBUQi8xLjgxIFRpQikKWyAgIDE1LjIxNjc1 Ml0gc2QgMzowOjA6MDogW3NkZl0gNDA5Ni1ieXRlIHBoeXNpY2FsIGJsb2NrcwpbICAgMTUu MjE3MTQzXSBzZCAzOjA6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2c2IHR5cGUgMApb ICAgMTUuMjE3MjE4XSBzZCAzOjA6MDowOiBbc2RmXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpb ICAgMTUuMjE3MjI5XSBzZCAzOjA6MDowOiBbc2RmXSBNb2RlIFNlbnNlOiAwMCAzYSAwMCAw MApbICAgMTUuMjE3NDUwXSBzZCAzOjA6MDowOiBbc2RmXSBXcml0ZSBjYWNoZTogZW5hYmxl ZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUEKWyAg IDE1LjIxNzc2Ml0gc2NzaSAzOjE6MDowOiBEaXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBT VDIwMDBOQzAwMC0xQ1gxIENFMDMgUFE6IDAgQU5TSTogNQpbICAgMTUuMjE5MDUyXSBzZCAz OjE6MDowOiBbc2RnXSAzOTA3MDI5MTY4IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMi4w MCBUQi8xLjgxIFRpQikKWyAgIDE1LjIxOTA2MV0gc2QgMzoxOjA6MDogW3NkZ10gNDA5Ni1i eXRlIHBoeXNpY2FsIGJsb2NrcwpbICAgMTUuMjE5MzQ5XSBzZCAzOjE6MDowOiBBdHRhY2hl ZCBzY3NpIGdlbmVyaWMgc2c3IHR5cGUgMApbICAgMTUuMjE5NDQxXSBzZCAzOjE6MDowOiBb c2RnXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpbICAgMTUuMjE5NDUyXSBzZCAzOjE6MDowOiBb c2RnXSBNb2RlIFNlbnNlOiAwMCAzYSAwMCAwMApbICAgMTUuMjE5NjcwXSBzZCAzOjE6MDow OiBbc2RnXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9l c24ndCBzdXBwb3J0IERQTyBvciBGVUEKWyAgIDE1LjIxOTk0MF0gc2NzaSAzOjI6MDowOiBE aXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBTVDQwMDBOQzAwMC0xRlIxIENFMDMgUFE6IDAg QU5TSTogNQpbICAgMTUuMjIxMjM1XSBzZCAzOjI6MDowOiBbc2RoXSA3ODE0MDM3MTY4IDUx Mi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoNC4wMCBUQi8zLjYzIFRpQikKWyAgIDE1LjIyMTI0 NF0gc2QgMzoyOjA6MDogW3NkaF0gNDA5Ni1ieXRlIHBoeXNpY2FsIGJsb2NrcwpbICAgMTUu MjIxNjQ4XSBzZCAzOjI6MDowOiBbc2RoXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpbICAgMTUu MjIxNjU4XSBzZCAzOjI6MDowOiBbc2RoXSBNb2RlIFNlbnNlOiAwMCAzYSAwMCAwMApbICAg MTUuMjIxNzkxXSBzZCAzOjI6MDowOiBbc2RoXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVh ZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUEKWyAgIDE1LjIy Mjk3Nl0gc2QgMzoyOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnOCB0eXBlIDAKWyAg IDE1LjIyNDM5MF0gc2NzaSAzOjM6MDowOiBEaXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBT VDQwMDBOQzAwMC0xRlIxIENFMDMgUFE6IDAgQU5TSTogNQpbICAgMTUuMjI1ODYxXSBzZCAz OjM6MDowOiBbc2RpXSA3ODE0MDM3MTY4IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoNC4w MCBUQi8zLjYzIFRpQikKWyAgIDE1LjIyNTg3MF0gc2QgMzozOjA6MDogW3NkaV0gNDA5Ni1i eXRlIHBoeXNpY2FsIGJsb2NrcwpbICAgMTUuMjI2MjE4XSBzZCAzOjM6MDowOiBbc2RpXSBX cml0ZSBQcm90ZWN0IGlzIG9mZgpbICAgMTUuMjI2MjI4XSBzZCAzOjM6MDowOiBbc2RpXSBN b2RlIFNlbnNlOiAwMCAzYSAwMCAwMApbICAgMTUuMjI2MzYwXSBzZCAzOjM6MDowOiBbc2Rp XSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBz dXBwb3J0IERQTyBvciBGVUEKWyAgIDE1LjIyODQxMl0gc2QgMzozOjA6MDogQXR0YWNoZWQg c2NzaSBnZW5lcmljIHNnOSB0eXBlIDAKWyAgIDE1LjI2OTI4M10gIHNkZjogc2RmMQpbICAg MTUuMjcwOTE2XSBzZCAzOjA6MDowOiBbc2RmXSBBdHRhY2hlZCBTQ1NJIGRpc2sKWyAgIDE1 LjI3MTY4N10gIHNkZzogc2RnMQpbICAgMTUuMjczMTczXSBzZCAzOjE6MDowOiBbc2RnXSBB dHRhY2hlZCBTQ1NJIGRpc2sKWyAgIDE1LjI3NTgxMV0gIHNkaDogc2RoMSBzZGgyClsgICAx NS4yNzc2MTldIHNkIDM6MjowOjA6IFtzZGhdIEF0dGFjaGVkIFNDU0kgZGlzawpbICAgMTUu MjkzOTc2XSAgc2RpOiBzZGkxIHNkaTIKWyAgIDE1LjI5NTg3OF0gc2QgMzozOjA6MDogW3Nk aV0gQXR0YWNoZWQgU0NTSSBkaXNrClsgICAxNy4zNjAwNThdIGF0YTU6IFNBVEEgbGluayB1 cCAzLjAgR2JwcyAoU1N0YXR1cyAxMjMgU0NvbnRyb2wgMCkKWyAgIDE3LjM2MDM3NF0gYXRh NS4xNTogUG9ydCBNdWx0aXBsaWVyIDEuMSwgMHgxMDk1OjB4NDcyNiByMzEsIDcgcG9ydHMs IGZlYXQgMHgxLzB4OQpbICAgMTcuMzcwNzgxXSBhdGE1LjAwOiBoYXJkIHJlc2V0dGluZyBs aW5rClsgICAxNy43NzUwODFdIGF0YTUuMDA6IGxpbmsgcmVzdW1lIHN1Y2NlZWRlZCBhZnRl ciAxIHJldHJpZXMKWyAgIDE3Ljg3NzQ2Nl0gYXRhNS4wMDogU0FUQSBsaW5rIGRvd24gKFNT dGF0dXMgMCBTQ29udHJvbCAzMTApClsgICAxNy44Nzc1NTFdIGF0YTUuMDE6IGhhcmQgcmVz ZXR0aW5nIGxpbmsKWyAgIDE4LjE4MjQ2OF0gYXRhNS4wMTogU0FUQSBsaW5rIHVwIDMuMCBH YnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMDApClsgICAxOC4xODI1MTldIGF0YTUuMDI6 IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDE4LjQ4NzQ1Nl0gYXRhNS4wMjogU0FUQSBsaW5r IHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMDApClsgICAxOC40ODc1MDVd IGF0YTUuMDM6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDE4Ljc5MjQ2Nl0gYXRhNS4wMzog U0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMDApClsgICAx OC43OTI1MTVdIGF0YTUuMDQ6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDE5LjA5NzQ2Nl0g YXRhNS4wNDogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAz MDApClsgICAxOS4wOTc1MTVdIGF0YTUuMDU6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDIw LjEwNDA5NV0gYXRhNS4wNTogZmFpbGVkIHRvIHJlc3VtZSBsaW5rIChTQ29udHJvbCAwKQpb ICAgMjAuMTA0Mzg5XSBhdGE1LjA1OiBTQVRBIGxpbmsgdXAgMy4wIEdicHMgKFNTdGF0dXMg MTIzIFNDb250cm9sIDApClsgICAyMC4xMDQ0MzddIGF0YTUuMDY6IGhhcmQgcmVzZXR0aW5n IGxpbmsKWyAgIDIwLjQwOTQ2NV0gYXRhNS4wNjogU0FUQSBsaW5rIHVwIDEuNSBHYnBzIChT U3RhdHVzIDExMyBTQ29udHJvbCAzMjApClsgICAyMC40MTA2NDldIGF0YTUuMDE6IEFUQS04 OiBIaXRhY2hpIEhEUzVDMzAyMEFMQTYzMiwgTUw2T0FBMTAsIG1heCBVRE1BLzEzMwpbICAg MjAuNDEwNjU4XSBhdGE1LjAxOiAzOTA3MDI5MTY4IHNlY3RvcnMsIG11bHRpIDA6IExCQTQ4 IE5DUSAoZGVwdGggMzEvMzIpClsgICAyMC40MTE4NDhdIGF0YTUuMDE6IGNvbmZpZ3VyZWQg Zm9yIFVETUEvMTAwClsgICAyMC40MTI5MzldIGF0YTUuMDI6IEFUQS04OiBIaXRhY2hpIEhE UzVDMzAyMEFMQTYzMiwgTUw2T0FBMTAsIG1heCBVRE1BLzEzMwpbICAgMjAuNDEyOTQ4XSBh dGE1LjAyOiAzOTA3MDI5MTY4IHNlY3RvcnMsIG11bHRpIDA6IExCQTQ4IE5DUSAoZGVwdGgg MzEvMzIpClsgICAyMC40MTQxMjNdIGF0YTUuMDI6IGNvbmZpZ3VyZWQgZm9yIFVETUEvMTAw ClsgICAyMC40MTUyMjBdIGF0YTUuMDM6IEFUQS04OiBIaXRhY2hpIEhEUzVDMzAyMEFMQTYz MiwgTUw2T0FBMTAsIG1heCBVRE1BLzEzMwpbICAgMjAuNDE1MjI3XSBhdGE1LjAzOiAzOTA3 MDI5MTY4IHNlY3RvcnMsIG11bHRpIDA6IExCQTQ4IE5DUSAoZGVwdGggMzEvMzIpClsgICAy MC40MTY0MDhdIGF0YTUuMDM6IGNvbmZpZ3VyZWQgZm9yIFVETUEvMTAwClsgICAyMC40MjAy NTldIGF0YTUuMDQ6IEFUQS04OiBXREMgV0QyMEVBUlMtMDBNVldCMCwgNTEuMEFCNTEsIG1h eCBVRE1BLzEzMwpbICAgMjAuNDIwMjY3XSBhdGE1LjA0OiAzOTA3MDI5MTY4IHNlY3RvcnMs IG11bHRpIDA6IExCQTQ4IE5DUSAoZGVwdGggMzEvMzIpClsgICAyMC40MjQ1NDNdIGF0YTUu MDQ6IGNvbmZpZ3VyZWQgZm9yIFVETUEvMTAwClsgICAyMC40MjQ2MjhdIGF0YTUuMDU6IHVu c3VwcG9ydGVkIGRldmljZSwgZGlzYWJsaW5nClsgICAyMC40MjQ2MzVdIGF0YTUuMDU6IGRp c2FibGVkClsgICAyMC40MjQ3MjhdIGF0YTU6IEVIIGNvbXBsZXRlClsgICAyMC40MjUwODJd IHNjc2kgNDoxOjA6MDogRGlyZWN0LUFjY2VzcyAgICAgQVRBICAgICAgSGl0YWNoaSBIRFM1 QzMwMiBBQTEwIFBROiAwIEFOU0k6IDUKWyAgIDIwLjQyNjc2Ml0gc2QgNDoxOjA6MDogW3Nk al0gMzkwNzAyOTE2OCA1MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDIuMDAgVEIvMS44MSBU aUIpClsgICAyMC40MjcxMjJdIHNkIDQ6MTowOjA6IFtzZGpdIFdyaXRlIFByb3RlY3QgaXMg b2ZmClsgICAyMC40MjcxMzJdIHNkIDQ6MTowOjA6IFtzZGpdIE1vZGUgU2Vuc2U6IDAwIDNh IDAwIDAwClsgICAyMC40MjcyNjZdIHNkIDQ6MTowOjA6IFtzZGpdIFdyaXRlIGNhY2hlOiBl bmFibGVkLCByZWFkIGNhY2hlOiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZV QQpbICAgMjAuNDI3NjI3XSBzZCA0OjE6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2cx MCB0eXBlIDAKWyAgIDIwLjQyOTQxN10gc2NzaSA0OjI6MDowOiBEaXJlY3QtQWNjZXNzICAg ICBBVEEgICAgICBIaXRhY2hpIEhEUzVDMzAyIEFBMTAgUFE6IDAgQU5TSTogNQpbICAgMjAu NDMwNzM1XSBzZCA0OjI6MDowOiBbc2RrXSAzOTA3MDI5MTY4IDUxMi1ieXRlIGxvZ2ljYWwg YmxvY2tzOiAoMi4wMCBUQi8xLjgxIFRpQikKWyAgIDIwLjQzMTA5NV0gc2QgNDoyOjA6MDog QXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMTEgdHlwZSAwClsgICAyMC40MzExNzFdIHNkIDQ6 MjowOjA6IFtzZGtdIFdyaXRlIFByb3RlY3QgaXMgb2ZmClsgICAyMC40MzExODFdIHNkIDQ6 MjowOjA6IFtzZGtdIE1vZGUgU2Vuc2U6IDAwIDNhIDAwIDAwClsgICAyMC40MzEzOTZdIHNk IDQ6MjowOjA6IFtzZGtdIFdyaXRlIGNhY2hlOiBlbmFibGVkLCByZWFkIGNhY2hlOiBlbmFi bGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZVQQpbICAgMjAuNDMxNzIwXSBzY3NpIDQ6 MzowOjA6IERpcmVjdC1BY2Nlc3MgICAgIEFUQSAgICAgIEhpdGFjaGkgSERTNUMzMDIgQUEx MCBQUTogMCBBTlNJOiA1ClsgICAyMC40MzI5MTNdIHNkIDQ6MzowOjA6IFtzZGxdIDM5MDcw MjkxNjggNTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6ICgyLjAwIFRCLzEuODEgVGlCKQpbICAg MjAuNDMzMjQyXSBzZCA0OjM6MDowOiBbc2RsXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpbICAg MjAuNDMzMjUyXSBzZCA0OjM6MDowOiBbc2RsXSBNb2RlIFNlbnNlOiAwMCAzYSAwMCAwMApb ICAgMjAuNDMzMjg3XSBzZCA0OjM6MDowOiBBdHRhY2hlZCBzY3NpIGdlbmVyaWMgc2cxMiB0 eXBlIDAKWyAgIDIwLjQzMzM4Nl0gc2QgNDozOjA6MDogW3NkbF0gV3JpdGUgY2FjaGU6IGVu YWJsZWQsIHJlYWQgY2FjaGU6IGVuYWJsZWQsIGRvZXNuJ3Qgc3VwcG9ydCBEUE8gb3IgRlVB ClsgICAyMC40MzM4ODhdIHNjc2kgNDo0OjA6MDogRGlyZWN0LUFjY2VzcyAgICAgQVRBICAg ICAgV0RDIFdEMjBFQVJTLTAwTSBBQjUxIFBROiAwIEFOU0k6IDUKWyAgIDIwLjQzNTIyNV0g c2QgNDo0OjA6MDogW3NkbV0gMzkwNzAyOTE2OCA1MTItYnl0ZSBsb2dpY2FsIGJsb2Nrczog KDIuMDAgVEIvMS44MSBUaUIpClsgICAyMC40MzU0NTZdIHNkIDQ6NDowOjA6IEF0dGFjaGVk IHNjc2kgZ2VuZXJpYyBzZzEzIHR5cGUgMApbICAgMjAuNDM1NTQyXSBzZCA0OjQ6MDowOiBb c2RtXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpbICAgMjAuNDM1NTUzXSBzZCA0OjQ6MDowOiBb c2RtXSBNb2RlIFNlbnNlOiAwMCAzYSAwMCAwMApbICAgMjAuNDM1Njg2XSBzZCA0OjQ6MDow OiBbc2RtXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9l c24ndCBzdXBwb3J0IERQTyBvciBGVUEKWyAgIDIwLjQ2NjQ0Nl0gIHNkbDogc2RsMQpbICAg MjAuNDY3OTA0XSBzZCA0OjM6MDowOiBbc2RsXSBBdHRhY2hlZCBTQ1NJIGRpc2sKWyAgIDIw LjQ2OTUxOV0gIHNkajogc2RqMQpbICAgMjAuNDcxMTE5XSBzZCA0OjE6MDowOiBbc2RqXSBB dHRhY2hlZCBTQ1NJIGRpc2sKWyAgIDIwLjQ3NTM2Nl0gIHNkazogc2RrMQpbICAgMjAuNDc2 ODcwXSBzZCA0OjI6MDowOiBbc2RrXSBBdHRhY2hlZCBTQ1NJIGRpc2sKWyAgIDIwLjQ4OTcy NV0gIHNkbTogc2RtMQpbICAgMjAuNDkxMjY0XSBzZCA0OjQ6MDowOiBbc2RtXSBBdHRhY2hl ZCBTQ1NJIGRpc2sKWyAgIDIyLjU2ODA1OV0gYXRhNjogU0FUQSBsaW5rIHVwIDMuMCBHYnBz IChTU3RhdHVzIDEyMyBTQ29udHJvbCAwKQpbICAgMjIuNTY4NTYxXSBhdGE2LjE1OiBQb3J0 IE11bHRpcGxpZXIgMS4xLCAweDEwOTU6MHgzNzI2IHIyMywgNiBwb3J0cywgZmVhdCAweDEv MHg5ClsgICAyMi41ODAzNTNdIGF0YTYuMDA6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDIy Ljg4NTU3MF0gYXRhNi4wMDogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBT Q29udHJvbCAzMjApClsgICAyMi44ODU2MzFdIGF0YTYuMDE6IGhhcmQgcmVzZXR0aW5nIGxp bmsKWyAgIDIzLjE5MDU2NV0gYXRhNi4wMTogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3Rh dHVzIDEyMyBTQ29udHJvbCAzMDApClsgICAyMy4xOTA2MjRdIGF0YTYuMDI6IGhhcmQgcmVz ZXR0aW5nIGxpbmsKWyAgIDIzLjQ5NTU2OF0gYXRhNi4wMjogU0FUQSBsaW5rIHVwIDMuMCBH YnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMDApClsgICAyMy40OTU2MzBdIGF0YTYuMDM6 IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDIzLjgwMDU2OV0gYXRhNi4wMzogU0FUQSBsaW5r IHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMDApClsgICAyMy44MDA2Mjld IGF0YTYuMDQ6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDI0LjEwNTU1Nl0gYXRhNi4wNDog U0FUQSBsaW5rIGRvd24gKFNTdGF0dXMgMCBTQ29udHJvbCAzMjApClsgICAyNC4xMDU2NjVd IGF0YTYuMDU6IGhhcmQgcmVzZXR0aW5nIGxpbmsKWyAgIDI0LjQxMDU3NF0gYXRhNi4wNTog U0FUQSBsaW5rIHVwIDEuNSBHYnBzIChTU3RhdHVzIDExMyBTQ29udHJvbCAzMjApClsgICAy NC40MTE0MDhdIGF0YTYuMDA6IEFUQS04OiBTVDIwMDBETDAwMy05VlQxNjYsIENDMzIsIG1h eCBVRE1BLzEzMwpbICAgMjQuNDExNDE3XSBhdGE2LjAwOiAzOTA3MDI5MTY4IHNlY3RvcnMs IG11bHRpIDE2OiBMQkE0OCBOQ1EgKGRlcHRoIDMxLzMyKQpbICAgMjQuNDEyMzE1XSBhdGE2 LjAwOiBjb25maWd1cmVkIGZvciBVRE1BLzEwMApbICAgMjQuNDEzMDkyXSBhdGE2LjAxOiBB VEEtODogU1QyMDAwREwwMDEtOVZUMTU2LCBDQzk2LCBtYXggVURNQS8xMzMKWyAgIDI0LjQx MzA5OV0gYXRhNi4wMTogMzkwNzAyOTE2OCBzZWN0b3JzLCBtdWx0aSAwOiBMQkE0OCAKWyAg IDI0LjQxMzk1MV0gYXRhNi4wMTogY29uZmlndXJlZCBmb3IgVURNQS8xMDAKWyAgIDI0LjQx NDcxMF0gYXRhNi4wMjogQVRBLTg6IFNUMjAwMERMMDAxLTlWVDE1NiwgQ0M5NiwgbWF4IFVE TUEvMTMzClsgICAyNC40MTQ3MThdIGF0YTYuMDI6IDM5MDcwMjkxNjggc2VjdG9ycywgbXVs dGkgMDogTEJBNDggClsgICAyNC40MTU1NzJdIGF0YTYuMDI6IGNvbmZpZ3VyZWQgZm9yIFVE TUEvMTAwClsgICAyNC40MTY0MjZdIGF0YTYuMDM6IEFUQS04OiBTVDIwMDBETDAwMy05VlQx NjYsIENDMzIsIG1heCBVRE1BLzEzMwpbICAgMjQuNDE2NDMzXSBhdGE2LjAzOiAzOTA3MDI5 MTY4IHNlY3RvcnMsIG11bHRpIDA6IExCQTQ4IE5DUSAoZGVwdGggMzEvMzIpClsgICAyNC40 MTczNTldIGF0YTYuMDM6IGNvbmZpZ3VyZWQgZm9yIFVETUEvMTAwClsgICAyNC40MTc0Njdd IGF0YTY6IEVIIGNvbXBsZXRlClsgICAyNC40MTc4MTldIHNjc2kgNTowOjA6MDogRGlyZWN0 LUFjY2VzcyAgICAgQVRBICAgICAgU1QyMDAwREwwMDMtOVZUMSBDQzMyIFBROiAwIEFOU0k6 IDUKWyAgIDI0LjQxOTE4OV0gc2QgNTowOjA6MDogW3Nkbl0gMzkwNzAyOTE2OCA1MTItYnl0 ZSBsb2dpY2FsIGJsb2NrczogKDIuMDAgVEIvMS44MSBUaUIpClsgICAyNC40MTk0MzBdIHNk IDU6MDowOjA6IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBzZzE0IHR5cGUgMApbICAgMjQuNDE5 NTE2XSBzZCA1OjA6MDowOiBbc2RuXSBXcml0ZSBQcm90ZWN0IGlzIG9mZgpbICAgMjQuNDE5 NTI2XSBzZCA1OjA6MDowOiBbc2RuXSBNb2RlIFNlbnNlOiAwMCAzYSAwMCAwMApbICAgMjQu NDE5NjU5XSBzZCA1OjA6MDowOiBbc2RuXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBj YWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUEKWyAgIDI0LjQxOTk5 NV0gc2NzaSA1OjE6MDowOiBEaXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBTVDIwMDBETDAw MS05VlQxIENDOTYgUFE6IDAgQU5TSTogNQpbICAgMjQuNDIxMzExXSBzZCA1OjE6MDowOiBb c2RvXSAzOTA3MDI5MTY4IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMi4wMCBUQi8xLjgx IFRpQikKWyAgIDI0LjQyMTMyMV0gc2QgNToxOjA6MDogW3Nkb10gNDA5Ni1ieXRlIHBoeXNp Y2FsIGJsb2NrcwpbICAgMjQuNDIxNTU2XSBzZCA1OjE6MDowOiBBdHRhY2hlZCBzY3NpIGdl bmVyaWMgc2cxNSB0eXBlIDAKWyAgIDI0LjQyMTYzOF0gc2QgNToxOjA6MDogW3Nkb10gV3Jp dGUgUHJvdGVjdCBpcyBvZmYKWyAgIDI0LjQyMTY0OF0gc2QgNToxOjA6MDogW3Nkb10gTW9k ZSBTZW5zZTogMDAgM2EgMDAgMDAKWyAgIDI0LjQyMTc4M10gc2QgNToxOjA6MDogW3Nkb10g V3JpdGUgY2FjaGU6IGVuYWJsZWQsIHJlYWQgY2FjaGU6IGVuYWJsZWQsIGRvZXNuJ3Qgc3Vw cG9ydCBEUE8gb3IgRlVBClsgICAyNC40MjIxMDBdIHNjc2kgNToyOjA6MDogRGlyZWN0LUFj Y2VzcyAgICAgQVRBICAgICAgU1QyMDAwREwwMDEtOVZUMSBDQzk2IFBROiAwIEFOU0k6IDUK WyAgIDI0LjQyMzQwMV0gc2QgNToyOjA6MDogW3NkcF0gMzkwNzAyOTE2OCA1MTItYnl0ZSBs b2dpY2FsIGJsb2NrczogKDIuMDAgVEIvMS44MSBUaUIpClsgICAyNC40MjM0MTFdIHNkIDU6 MjowOjA6IFtzZHBdIDQwOTYtYnl0ZSBwaHlzaWNhbCBibG9ja3MKWyAgIDI0LjQyMzY5MF0g c2QgNToyOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMTYgdHlwZSAwClsgICAyNC40 MjM3MzJdIHNkIDU6MjowOjA6IFtzZHBdIFdyaXRlIFByb3RlY3QgaXMgb2ZmClsgICAyNC40 MjM3NDJdIHNkIDU6MjowOjA6IFtzZHBdIE1vZGUgU2Vuc2U6IDAwIDNhIDAwIDAwClsgICAy NC40MjM4NzZdIHNkIDU6MjowOjA6IFtzZHBdIFdyaXRlIGNhY2hlOiBlbmFibGVkLCByZWFk IGNhY2hlOiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZVQQpbICAgMjQuNDI0 MjI0XSBzY3NpIDU6MzowOjA6IERpcmVjdC1BY2Nlc3MgICAgIEFUQSAgICAgIFNUMjAwMERM MDAzLTlWVDEgQ0MzMiBQUTogMCBBTlNJOiA1ClsgICAyNC40MjU1MTddIHNkIDU6MzowOjA6 IFtzZHFdIDM5MDcwMjkxNjggNTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6ICgyLjAwIFRCLzEu ODEgVGlCKQpbICAgMjQuNDI1ODM2XSBzZCA1OjM6MDowOiBbc2RxXSBXcml0ZSBQcm90ZWN0 IGlzIG9mZgpbICAgMjQuNDI1ODQ2XSBzZCA1OjM6MDowOiBbc2RxXSBNb2RlIFNlbnNlOiAw MCAzYSAwMCAwMApbICAgMjQuNDI2ODc4XSBzZCA1OjM6MDowOiBbc2RxXSBXcml0ZSBjYWNo ZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBv ciBGVUEKWyAgIDI0LjQzMDQyN10gc2QgNTozOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmlj IHNnMTcgdHlwZSAwClsgICAyNC40Mzk0MzNdICBzZHA6IHVua25vd24gcGFydGl0aW9uIHRh YmxlClsgICAyNC40NDA2MThdIHNkIDU6MjowOjA6IFtzZHBdIEF0dGFjaGVkIFNDU0kgZGlz awpbICAgMjQuNDUzMDM2XSAgc2RxOiBzZHExIHNkcTIKWyAgIDI0LjQ1NDc4MV0gc2QgNToz OjA6MDogW3NkcV0gQXR0YWNoZWQgU0NTSSBkaXNrClsgICAyNC40NTk0MjBdICBzZG46IHNk bjEKWyAgIDI0LjQ2MTc5MF0gc2QgNTowOjA6MDogW3Nkbl0gQXR0YWNoZWQgU0NTSSBkaXNr ClsgICAyNC40ODU3OTNdICBzZG86IHNkbzEKWyAgIDI0LjQ4NzM1Ml0gc2QgNToxOjA6MDog W3Nkb10gQXR0YWNoZWQgU0NTSSBkaXNrClsgICAyNC45MTE3MjddIG1kOiBiaW5kPHNkZDE+ ClsgICAyNC45NzMzODNdIG1kOiBiaW5kPHNkYzE+ClsgICAyNS4wMDQyNDhdIG1kOiBiaW5k PHNkYjE+ClsgICAyNS4wNjI0MzRdIG1kOiBiaW5kPHNkZTE+ClsgICAyNS4xNTM3MDddIG1k L3JhaWQ6bWQxOiBkZXZpY2Ugc2RlMSBvcGVyYXRpb25hbCBhcyByYWlkIGRpc2sgMQpbICAg MjUuMTUzNzE3XSBtZC9yYWlkOm1kMTogZGV2aWNlIHNkYjEgb3BlcmF0aW9uYWwgYXMgcmFp ZCBkaXNrIDAKWyAgIDI1LjE1MzcyNF0gbWQvcmFpZDptZDE6IGRldmljZSBzZGQxIG9wZXJh dGlvbmFsIGFzIHJhaWQgZGlzayAyClsgICAyNS4xNTg2NzddIG1kL3JhaWQ6bWQxOiBhbGxv Y2F0ZWQgMGtCClsgICAyNS4xNjIxMjddIG1kL3JhaWQ6bWQxOiByYWlkIGxldmVsIDUgYWN0 aXZlIHdpdGggMyBvdXQgb2YgMyBkZXZpY2VzLCBhbGdvcml0aG0gMgpbICAgMjUuMTYyMTM2 XSBSQUlEIGNvbmYgcHJpbnRvdXQ6ClsgICAyNS4xNjIxNDJdICAtLS0gbGV2ZWw6NSByZDoz IHdkOjMKWyAgIDI1LjE2MjE0OV0gIGRpc2sgMCwgbzoxLCBkZXY6c2RiMQpbICAgMjUuMTYy MTU1XSAgZGlzayAxLCBvOjEsIGRldjpzZGUxClsgICAyNS4xNjIxNjFdICBkaXNrIDIsIG86 MSwgZGV2OnNkZDEKWyAgIDI1LjE2NDQ1Ml0gY3JlYXRlZCBiaXRtYXAgKDE1IHBhZ2VzKSBm b3IgZGV2aWNlIG1kMQpbICAgMjUuMTY4ODk5XSBtZDE6IGJpdG1hcCBpbml0aWFsaXplZCBm cm9tIGRpc2s6IHJlYWQgMSBwYWdlcywgc2V0IDAgb2YgMjk4MDcgYml0cwpbICAgMjUuMTk4 NjIwXSBtZDE6IGRldGVjdGVkIGNhcGFjaXR5IGNoYW5nZSBmcm9tIDAgdG8gNDAwMDUyNzE1 NTIwMApbICAgMjUuMjAyNzUzXSBtZDogYmluZDxzZGcxPgpbICAgMjUuMjE0Mzg4XSAgbWQx OiB1bmtub3duIHBhcnRpdGlvbiB0YWJsZQpbICAgMjUuMjUzMTI0XSBtZDogYmluZDxzZGYx PgpbICAgMjUuMjkzOTQ2XSBtZDogYmluZDxzZGkxPgpbICAgMjUuMzc5MTQ1XSBtZDogYmlu ZDxzZGgxPgpbICAgMjUuNDYzNTI1XSBtZC9yYWlkOm1kMjogZGV2aWNlIHNkaDEgb3BlcmF0 aW9uYWwgYXMgcmFpZCBkaXNrIDIKWyAgIDI1LjQ2MzUzNV0gbWQvcmFpZDptZDI6IGRldmlj ZSBzZGkxIG9wZXJhdGlvbmFsIGFzIHJhaWQgZGlzayAzClsgICAyNS40NjM1NDNdIG1kL3Jh aWQ6bWQyOiBkZXZpY2Ugc2RmMSBvcGVyYXRpb25hbCBhcyByYWlkIGRpc2sgMApbICAgMjUu NDYzNTQ5XSBtZC9yYWlkOm1kMjogZGV2aWNlIHNkZzEgb3BlcmF0aW9uYWwgYXMgcmFpZCBk aXNrIDEKWyAgIDI1LjQ4MjM5Ml0gbWQvcmFpZDptZDI6IGFsbG9jYXRlZCAwa0IKWyAgIDI1 LjQ4NzMxNl0gbWQvcmFpZDptZDI6IHJhaWQgbGV2ZWwgNSBhY3RpdmUgd2l0aCA0IG91dCBv ZiA0IGRldmljZXMsIGFsZ29yaXRobSAyClsgICAyNS40ODczMjRdIFJBSUQgY29uZiBwcmlu dG91dDoKWyAgIDI1LjQ4NzMzMF0gIC0tLSBsZXZlbDo1IHJkOjQgd2Q6NApbICAgMjUuNDg3 MzM3XSAgZGlzayAwLCBvOjEsIGRldjpzZGYxClsgICAyNS40ODczNDRdICBkaXNrIDEsIG86 MSwgZGV2OnNkZzEKWyAgIDI1LjQ4NzM1MF0gIGRpc2sgMiwgbzoxLCBkZXY6c2RoMQpbICAg MjUuNDg3MzU2XSAgZGlzayAzLCBvOjEsIGRldjpzZGkxClsgICAyNS40OTI4NThdIGNyZWF0 ZWQgYml0bWFwICgxNSBwYWdlcykgZm9yIGRldmljZSBtZDIKWyAgIDI1LjUxNTgwNl0gbWQy OiBiaXRtYXAgaW5pdGlhbGl6ZWQgZnJvbSBkaXNrOiByZWFkIDEgcGFnZXMsIHNldCAwIG9m IDI5ODA3IGJpdHMKWyAgIDI1LjUzNzM4OF0gbWQyOiBkZXRlY3RlZCBjYXBhY2l0eSBjaGFu Z2UgZnJvbSAwIHRvIDYwMDA3OTA3MzI4MDAKWyAgIDI1LjU0NDYyNl0gbWQ6IGJpbmQ8c2Rt MT4KWyAgIDI1LjU0NTUxNl0gIG1kMjogdW5rbm93biBwYXJ0aXRpb24gdGFibGUKWyAgIDI1 LjU3MTE3NF0gbWQ6IGJpbmQ8c2RrMT4KWyAgIDI1LjYwNDA5Ml0gbWQ6IGJpbmQ8c2RsMT4K WyAgIDI1LjY3MjI1NF0gbWQ6IGJpbmQ8c2RqMT4KWyAgIDI1LjcxNTk0MF0gbWQvcmFpZDpt ZDM6IGRldmljZSBzZGoxIG9wZXJhdGlvbmFsIGFzIHJhaWQgZGlzayAxClsgICAyNS43MTU5 NTJdIG1kL3JhaWQ6bWQzOiBkZXZpY2Ugc2RsMSBvcGVyYXRpb25hbCBhcyByYWlkIGRpc2sg NApbICAgMjUuNzE1OTU4XSBtZC9yYWlkOm1kMzogZGV2aWNlIHNkazEgb3BlcmF0aW9uYWwg YXMgcmFpZCBkaXNrIDIKWyAgIDI1LjcxNTk2NV0gbWQvcmFpZDptZDM6IGRldmljZSBzZG0x IG9wZXJhdGlvbmFsIGFzIHJhaWQgZGlzayAwClsgICAyNS43MTU5NzFdIG1kL3JhaWQ6bWQz OiBkZXZpY2Ugc2RjMSBvcGVyYXRpb25hbCBhcyByYWlkIGRpc2sgMwpbICAgMjUuNzI1NjAz XSBtZC9yYWlkOm1kMzogYWxsb2NhdGVkIDBrQgpbICAgMjUuNzI1NzU3XSBtZC9yYWlkOm1k MzogcmFpZCBsZXZlbCA1IGFjdGl2ZSB3aXRoIDUgb3V0IG9mIDUgZGV2aWNlcywgYWxnb3Jp dGhtIDIKWyAgIDI1LjcyNTc2M10gUkFJRCBjb25mIHByaW50b3V0OgpbICAgMjUuNzI1NzY4 XSAgLS0tIGxldmVsOjUgcmQ6NSB3ZDo1ClsgICAyNS43MjU3NzZdICBkaXNrIDAsIG86MSwg ZGV2OnNkbTEKWyAgIDI1LjcyNTc4Ml0gIGRpc2sgMSwgbzoxLCBkZXY6c2RqMQpbICAgMjUu NzI1Nzg4XSAgZGlzayAyLCBvOjEsIGRldjpzZGsxClsgICAyNS43MjU3OTVdICBkaXNrIDMs IG86MSwgZGV2OnNkYzEKWyAgIDI1LjcyNTgwMV0gIGRpc2sgNCwgbzoxLCBkZXY6c2RsMQpb ICAgMjUuNzI2MTM2XSBjcmVhdGVkIGJpdG1hcCAoMTUgcGFnZXMpIGZvciBkZXZpY2UgbWQz ClsgICAyNS43Mjc1OTldIG1kMzogYml0bWFwIGluaXRpYWxpemVkIGZyb20gZGlzazogcmVh ZCAxIHBhZ2VzLCBzZXQgMCBvZiAyOTgwNyBiaXRzClsgICAyNS43Mzg5MDNdIG1kMzogZGV0 ZWN0ZWQgY2FwYWNpdHkgY2hhbmdlIGZyb20gMCB0byA4MDAxMDU0MzEwNDAwClsgICAyNS43 NDY4NzNdIG1kOiBiaW5kPHNkbzE+ClsgICAyNS43NTI0NjFdICBtZDM6IHVua25vd24gcGFy dGl0aW9uIHRhYmxlClsgICAyNS43NzE3NjNdIG1kOiBiaW5kPHNkbjE+ClsgICAyNy45NTM0 NDldIEVYVDMtZnMgKHNkYTMpOiB1c2luZyBpbnRlcm5hbCBqb3VybmFsClsgICAyOC40Nzgx NjFdIEFkZGluZyA5NzY2OTA4ayBzd2FwIG9uIC9kZXYvc2RhMi4gIFByaW9yaXR5Oi0xIGV4 dGVudHM6MSBhY3Jvc3M6OTc2NjkwOGsgClsgICAzNi4wNDI3NzldIFZlbG9jaXR5IGlzIEFV VE8gbW9kZQpbICAgMzguNDE5NTUwXSBlbnAxczA6IExpbmsgYXV0by1uZWdvdGlhdGlvbiBz cGVlZCAxMDAwTSBicHMgZnVsbCBkdXBsZXgKWyAgMTM1LjU2MzYzNV0gbWQ6IG1kMTI3IHN0 b3BwZWQuClsgIDEzNS41NjM3MzZdIG1kOiB1bmJpbmQ8c2RuMT4KWyAgMTM1LjU2ODM3NF0g bWQ6IGV4cG9ydF9yZGV2KHNkbjEpClsgIDEzNS41NzAzOThdIG1kOiB1bmJpbmQ8c2RvMT4K WyAgMTM1LjU3NTA1MV0gbWQ6IGV4cG9ydF9yZGV2KHNkbzEpClsgIDE1OC4wODIxMjBdIG1k OiBtZDQgc3RvcHBlZC4KWyAgMTU4LjA4NjY5MF0gbWQ6IGJpbmQ8c2RpMj4KWyAgMTU4LjA4 NzUzMF0gbWQ6IG1kNCBzdG9wcGVkLgpbICAxNTguMDg3NTY5XSBtZDogdW5iaW5kPHNkaTI+ ClsgIDE1OC4wOTMwNzddIG1kOiBleHBvcnRfcmRldihzZGkyKQpbICAxNjIuNzY1NjgxXSBt ZDogbWQ0IHN0b3BwZWQuClsgIDE2Mi43Nzc0ODhdIG1kOiBiaW5kPHNkaDI+ClsgIDE2Mi43 Nzg0MzBdIG1kOiBiaW5kPHNkaTI+ClsgIDE2Mi44MTM0MzJdIG1kOiByYWlkMSBwZXJzb25h bGl0eSByZWdpc3RlcmVkIGZvciBsZXZlbCAxClsgIDE2Mi44MjE5NDRdIG1kL3JhaWQxOm1k NDogYWN0aXZlIHdpdGggMiBvdXQgb2YgMiBtaXJyb3JzClsgIDE2Mi44MjIyMzZdIGNyZWF0 ZWQgYml0bWFwICgxNSBwYWdlcykgZm9yIGRldmljZSBtZDQKWyAgMTYyLjgyMzQ3NV0gbWQ0 OiBiaXRtYXAgaW5pdGlhbGl6ZWQgZnJvbSBkaXNrOiByZWFkIDEgcGFnZXMsIHNldCAwIG9m IDI5ODA1IGJpdHMKWyAgMTYyLjg0MzA2NF0gbWQ0OiBkZXRlY3RlZCBjYXBhY2l0eSBjaGFu Z2UgZnJvbSAwIHRvIDIwMDAxNTI0Mjg1NDQKWyAgMTYyLjg1NjM2OF0gIG1kNDogdW5rbm93 biBwYXJ0aXRpb24gdGFibGUKWyAgMTcxLjE0ODQ5NF0gbWQ6IGJpbmQ8c2RuMT4KWyAgMTc3 LjQ3Mzg4N10gbWQ6IGJpbmQ8c2RvMT4KWyAgMTgyLjMwNzk1NF0gIHNkcDogdW5rbm93biBw YXJ0aXRpb24gdGFibGUKWyAgMTg5LjUyOTcwNl0gIHNkcDogdW5rbm93biBwYXJ0aXRpb24g dGFibGUKWyAgMTk5LjUxNzEyOV0gIHNkcTogc2RxMSBzZHEyClsgMTAyOC42NDE3ODddIG5m X2Nvbm50cmFjazogYXV0b21hdGljIGhlbHBlciBhc3NpZ25tZW50IGlzIGRlcHJlY2F0ZWQg YW5kIGl0IHdpbGwgYmUgcmVtb3ZlZCBzb29uLiBVc2UgdGhlIGlwdGFibGVzIENUIHRhcmdl dCB0byBhdHRhY2ggaGVscGVycyBpbnN0ZWFkLgpbIDEyNzMuMTYwMTEwXSB1c2IgMi0yOiBu ZXcgbG93LXNwZWVkIFVTQiBkZXZpY2UgbnVtYmVyIDIwIHVzaW5nIHVoY2lfaGNkClsgMTM3 Ni40MTAxNTVdIHVzYiAyLTI6IG5ldyBsb3ctc3BlZWQgVVNCIGRldmljZSBudW1iZXIgNDAg dXNpbmcgdWhjaV9oY2QKWyAxMzc2LjUyNDE1NF0gdXNiIDItMjogZGV2aWNlIGRlc2NyaXB0 b3IgcmVhZC82NCwgZXJyb3IgLTcxClsgMTM3Ni43Mzk1MzRdIHVzYiAyLTI6IGRldmljZSBk ZXNjcmlwdG9yIHJlYWQvNjQsIGVycm9yIC03MQpbIDEzNzYuOTQyMTQ1XSB1c2IgMi0yOiBu ZXcgbG93LXNwZWVkIFVTQiBkZXZpY2UgbnVtYmVyIDQxIHVzaW5nIHVoY2lfaGNkClsgMTQ2 My42NDM5NzFdIFhGUyAobWQyKTogTW91bnRpbmcgVjUgRmlsZXN5c3RlbQpbIDE0NjMuOTg2 NzYyXSBYRlMgKG1kMik6IEVuZGluZyBjbGVhbiBtb3VudApbIDM5MzkuNDIxODk1XSBFWFQ0 LWZzIChtZDEpOiByZWNvdmVyeSBjb21wbGV0ZQpbIDM5MzkuNDM3OTg2XSBFWFQ0LWZzICht ZDEpOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCBvcmRlcmVkIGRhdGEgbW9kZS4gT3B0czog KG51bGwpClsgMzk0My4xMzczMTJdIFhGUyAobWQzKTogTW91bnRpbmcgVjUgRmlsZXN5c3Rl bQpbIDM5NDMuODE3NjU5XSBYRlMgKG1kMyk6IFN0YXJ0aW5nIHJlY292ZXJ5IChsb2dkZXY6 IGludGVybmFsKQpbIDM5NDQuNDYxMzYyXSBYRlMgKG1kMyk6IEVuZGluZyByZWNvdmVyeSAo bG9nZGV2OiBpbnRlcm5hbCkKWyAzOTc3LjUyMTYzM10gUlBDOiBSZWdpc3RlcmVkIG5hbWVk IFVOSVggc29ja2V0IHRyYW5zcG9ydCBtb2R1bGUuClsgMzk3Ny41MjE2NDZdIFJQQzogUmVn aXN0ZXJlZCB1ZHAgdHJhbnNwb3J0IG1vZHVsZS4KWyAzOTc3LjUyMTY1M10gUlBDOiBSZWdp c3RlcmVkIHRjcCB0cmFuc3BvcnQgbW9kdWxlLgpbIDM5NzcuNTIxNjU5XSBSUEM6IFJlZ2lz dGVyZWQgdGNwIE5GU3Y0LjEgYmFja2NoYW5uZWwgdHJhbnNwb3J0IG1vZHVsZS4KWyAzOTc4 LjMwMTA5OV0gSW5zdGFsbGluZyBrbmZzZCAoY29weXJpZ2h0IChDKSAxOTk2IG9raXJAbW9u YWQuc3diLmRlKS4KWyAzOTc4LjY3ODI5M10gTkZTRDogVXNpbmcgL3Zhci9saWIvbmZzL3Y0 cmVjb3ZlcnkgYXMgdGhlIE5GU3Y0IHN0YXRlIHJlY292ZXJ5IGRpcmVjdG9yeQpbIDM5Nzgu NzA2NTM5XSBORlNEOiBzdGFydGluZyA5MC1zZWNvbmQgZ3JhY2UgcGVyaW9kIChuZXQgZmZm ZmZmZmY4MWNjMGY0MCkKWyA0NTA5LjY2MDE0N10gdXNiIDItMjogbmV3IGxvdy1zcGVlZCBV U0IgZGV2aWNlIG51bWJlciA4OCB1c2luZyB1aGNpX2hjZApbIDQ1MDkuNzc0MTM1XSB1c2Ig Mi0yOiBkZXZpY2UgZGVzY3JpcHRvciByZWFkLzY0LCBlcnJvciAtNzEKWyA0NTA5Ljk4ODE1 N10gdXNiIDItMjogZGV2aWNlIGRlc2NyaXB0b3IgcmVhZC82NCwgZXJyb3IgLTcxClsgNDUx MC4xOTE0NzRdIHVzYiAyLTI6IG5ldyBsb3ctc3BlZWQgVVNCIGRldmljZSBudW1iZXIgODkg dXNpbmcgdWhjaV9oY2QKWyA0NTEwLjMwNTE1MV0gdXNiIDItMjogZGV2aWNlIGRlc2NyaXB0 b3IgcmVhZC82NCwgZXJyb3IgLTcxClsgNDUxMC41MTkxMjNdIHVzYiAyLTI6IGRldmljZSBk ZXNjcmlwdG9yIHJlYWQvNjQsIGVycm9yIC03MQpbIDQ1MTQuNDEwMTU0XSB1c2IgMi0yOiBu ZXcgbG93LXNwZWVkIFVTQiBkZXZpY2UgbnVtYmVyIDkxIHVzaW5nIHVoY2lfaGNkClsgNDUx NC41MjQxNThdIHVzYiAyLTI6IGRldmljZSBkZXNjcmlwdG9yIHJlYWQvNjQsIGVycm9yIC03 MQpbIDQ1MTQuNzM5MTM4XSB1c2IgMi0yOiBkZXZpY2UgZGVzY3JpcHRvciByZWFkLzY0LCBl cnJvciAtNzEKWyA0NTE0Ljk0MjE1NF0gdXNiIDItMjogbmV3IGxvdy1zcGVlZCBVU0IgZGV2 aWNlIG51bWJlciA5MiB1c2luZyB1aGNpX2hjZApbIDQ1MTUuMDU2NTgxXSB1c2IgMi0yOiBk ZXZpY2UgZGVzY3JpcHRvciByZWFkLzY0LCBlcnJvciAtNzEKWyA0NTE1LjI3MTEzMV0gdXNi IDItMjogZGV2aWNlIGRlc2NyaXB0b3IgcmVhZC82NCwgZXJyb3IgLTcxClsgNDUxNS40NzQx NTVdIHVzYiAyLTI6IG5ldyBsb3ctc3BlZWQgVVNCIGRldmljZSBudW1iZXIgOTMgdXNpbmcg dWhjaV9oY2QKWyA0NTE1Ljg4NDA0NV0gdXNiIDItMjogZGV2aWNlIG5vdCBhY2NlcHRpbmcg YWRkcmVzcyA5MywgZXJyb3IgLTcxClsgNDUxNS45ODYxMjRdIHVzYiAyLTI6IG5ldyBsb3ct c3BlZWQgVVNCIGRldmljZSBudW1iZXIgOTQgdXNpbmcgdWhjaV9oY2QKWyA0NTE2LjQwMjA2 OV0gdXNiIDItMjogZGV2aWNlIG5vdCBhY2NlcHRpbmcgYWRkcmVzcyA5NCwgZXJyb3IgLTcx ClsgNDUxNi40MDIxNzhdIHVzYiB1c2IyLXBvcnQyOiB1bmFibGUgdG8gZW51bWVyYXRlIFVT QiBkZXZpY2UKWzEwOTY0LjI2NjE5NV0gbnJfcGRmbHVzaF90aHJlYWRzIGV4cG9ydGVkIGlu IC9wcm9jIGlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbAoKWzIwNjUzLjA5ODA0NF0gPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Clsy MDY1My4wOTgwNDRdIFsgSU5GTzogcG9zc2libGUgaXJxIGxvY2sgaW52ZXJzaW9uIGRlcGVu ZGVuY3kgZGV0ZWN0ZWQgXQpbMjA2NTMuMDk4MDQ0XSAzLjE5LjggIzYgVGFpbnRlZDogRyAg ICAgICAgICAgTyAgClsyMDY1My4wOTgwNDRdIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpbMjA2NTMuMDk4MDQ0XSBrc3dhcGQw LzUxMyBqdXN0IGNoYW5nZWQgdGhlIHN0YXRlIG9mIGxvY2s6ClsyMDY1My4wOTgwNDRdICAo Jnhmc19kaXJfaWxvY2tfY2xhc3MpeysrKystK30sIGF0OiBbPGZmZmZmZmZmODEyZjQzNjA+ XSB4ZnNfaWxvY2srMHhiMC8weDEzMApbMjA2NTMuMDk4MDQ0XSBidXQgdGhpcyBsb2NrIHRv b2sgYW5vdGhlciwgUkVDTEFJTV9GUy11bnNhZmUgbG9jayBpbiB0aGUgcGFzdDoKWzIwNjUz LjA5ODA0NF0gICgmbW0tPm1tYXBfc2VtKXsrKysrKyt9CiAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICBhbmQgaW50ZXJydXB0cyBjb3VsZCBjcmVhdGUgaW52ZXJzZSBsb2NrIG9y ZGVyaW5nIGJldHdlZW4gdGhlbS4KClsyMDY1My4wOTgwNDRdIAogICAgICAgICAgICAgICBv dGhlciBpbmZvIHRoYXQgbWlnaHQgaGVscCB1cyBkZWJ1ZyB0aGlzOgpbMjA2NTMuMDk4MDQ0 XSAgUG9zc2libGUgaW50ZXJydXB0IHVuc2FmZSBsb2NraW5nIHNjZW5hcmlvOgoKWzIwNjUz LjA5ODA0NF0gICAgICAgIENQVTAgICAgICAgICAgICAgICAgICAgIENQVTEKWzIwNjUzLjA5 ODA0NF0gICAgICAgIC0tLS0gICAgICAgICAgICAgICAgICAgIC0tLS0KWzIwNjUzLjA5ODA0 NF0gICBsb2NrKCZtbS0+bW1hcF9zZW0pOwpbMjA2NTMuMDk4MDQ0XSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbG9jYWxfaXJxX2Rpc2FibGUoKTsKWzIwNjUzLjA5ODA0NF0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2soJnhmc19kaXJfaWxvY2tfY2xh c3MpOwpbMjA2NTMuMDk4MDQ0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9j aygmbW0tPm1tYXBfc2VtKTsKWzIwNjUzLjA5ODA0NF0gICA8SW50ZXJydXB0PgpbMjA2NTMu MDk4MDQ0XSAgICAgbG9jaygmeGZzX2Rpcl9pbG9ja19jbGFzcyk7ClsyMDY1My4wOTgwNDRd IAogICAgICAgICAgICAgICAgKioqIERFQURMT0NLICoqKgoKWzIwNjUzLjA5ODA0NF0gMyBs b2NrcyBoZWxkIGJ5IGtzd2FwZDAvNTEzOgpbMjA2NTMuMDk4MDQ0XSAgIzA6ICAoc2hyaW5r ZXJfcndzZW0peysrKysuLn0sIGF0OiBbPGZmZmZmZmZmODExMzAzZDM+XSBzaHJpbmtfbm9k ZV9zbGFicysweDQzLzB4M2IwClsyMDY1My4wOTgwNDRdICAjMTogICgmdHlwZS0+c191bW91 bnRfa2V5IzM2KXsuKy4rLit9LCBhdDogWzxmZmZmZmZmZjgxMTdiOThmPl0gZ3JhYl9zdXBl cl9wYXNzaXZlKzB4M2YvMHg5MApbMjA2NTMuMDk4MDQ0XSAgIzI6ICAoJnBhZy0+cGFnX2lj aV9yZWNsYWltX2xvY2speysuKy4uLn0sIGF0OiBbPGZmZmZmZmZmODEyZWNhNTI+XSB4ZnNf cmVjbGFpbV9pbm9kZXNfYWcrMHhhMi8weDNjMApbMjA2NTMuMjE0MDIxXSAKICAgICAgICAg ICAgICAgdGhlIHNob3J0ZXN0IGRlcGVuZGVuY2llcyBiZXR3ZWVuIDJuZCBsb2NrIGFuZCAx c3QgbG9jazoKWzIwNjUzLjIxNDAyMV0gIC0+ICgmbW0tPm1tYXBfc2VtKXsrKysrKyt9IG9w czogMTEzMjc4OTE1OCB7ClsyMDY1My4yMTQwMjFdICAgICBIQVJESVJRLU9OLVcgYXQ6Clsy MDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEwOTJjNDM+ XSBfX2xvY2tfYWNxdWlyZSsweDlhMy8weDIwOTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAg ICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5NTMyMz5dIGxvY2tfYWNxdWlyZSsweGMzLzB4 MTcwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODE2 ZDk4YzU+XSBkb3duX3dyaXRlKzB4NTUvMHhjMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAg ICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTdmYjUwPl0gZG9fZXhlY3ZlYXRfY29tbW9uLmlz cmEuMzMrMHgyZTAvMHg3YTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAg IFs8ZmZmZmZmZmY4MTE4MDAzNz5dIGRvX2V4ZWN2ZSsweDI3LzB4MzAKWzIwNjUzLjIxNDAy MV0gICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTAwMDFmNj5dIHJ1bl9pbml0 X3Byb2Nlc3MrMHgyNi8weDMwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAg ICBbPGZmZmZmZmZmODEwMDAyMGY+XSB0cnlfdG9fcnVuX2luaXRfcHJvY2VzcysweGYvMHg0 MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxNmNm NzNjPl0ga2VybmVsX2luaXQrMHg5Yy8weGYwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAg ICAgICAgICAgICBbPGZmZmZmZmZmODE2ZGJkYzg+XSByZXRfZnJvbV9mb3JrKzB4NTgvMHg5 MApbMjA2NTMuMjE0MDIxXSAgICAgSEFSRElSUS1PTi1SIGF0OgpbMjA2NTMuMjE0MDIxXSAg ICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDkyNjA3Pl0gX19sb2NrX2FjcXVp cmUrMHgzNjcvMHgyMDkwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBb PGZmZmZmZmZmODEwOTUzMjM+XSBsb2NrX2FjcXVpcmUrMHhjMy8weDE3MApbMjA2NTMuMjE0 MDIxXSAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTQ1ZGM0Pl0gbWlnaHRf ZmF1bHQrMHg4NC8weGIwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBb PGZmZmZmZmZmODEzOWFmYTI+XSBfX2NsZWFyX3VzZXIrMHgxMi8weDYwClsyMDY1My4yMTQw MjFdICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEzOWIwMWE+XSBjbGVhcl91 c2VyKzB4MmEvMHgzMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgWzxm ZmZmZmZmZjgxMWNlYTQxPl0gcGFkemVybysweDIxLzB4MzAKWzIwNjUzLjIxNDAyMV0gICAg ICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTFkMGQ3Nz5dIGxvYWRfZWxmX2JpbmFy eSsweDkxNy8weDE2ZTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgIFs8 ZmZmZmZmZmY4MTE3ZTZlOD5dIHNlYXJjaF9iaW5hcnlfaGFuZGxlcisweDk4LzB4MjIwClsy MDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExN2ZlNmI+ XSBkb19leGVjdmVhdF9jb21tb24uaXNyYS4zMysweDVmYi8weDdhMApbMjA2NTMuMjE0MDIx XSAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTgwMDM3Pl0gZG9fZXhlY3Zl KzB4MjcvMHgzMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZm ZmZmZjgxMDAwMWY2Pl0gcnVuX2luaXRfcHJvY2VzcysweDI2LzB4MzAKWzIwNjUzLjIxNDAy MV0gICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTAwMDIwZj5dIHRyeV90b19y dW5faW5pdF9wcm9jZXNzKzB4Zi8weDQwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAg ICAgICAgICBbPGZmZmZmZmZmODE2Y2Y3M2M+XSBrZXJuZWxfaW5pdCsweDljLzB4ZjAKWzIw NjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTZkYmRjOD5d IHJldF9mcm9tX2ZvcmsrMHg1OC8weDkwClsyMDY1My4yMTQwMjFdICAgICBTT0ZUSVJRLU9O LVcgYXQ6ClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZm ODEwOTJjN2Q+XSBfX2xvY2tfYWNxdWlyZSsweDlkZC8weDIwOTAKWzIwNjUzLjIxNDAyMV0g ICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5NTMyMz5dIGxvY2tfYWNxdWly ZSsweGMzLzB4MTcwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBbPGZm ZmZmZmZmODE2ZDk4YzU+XSBkb3duX3dyaXRlKzB4NTUvMHhjMApbMjA2NTMuMjE0MDIxXSAg ICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTdmYjUwPl0gZG9fZXhlY3ZlYXRf Y29tbW9uLmlzcmEuMzMrMHgyZTAvMHg3YTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAg ICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4MDAzNz5dIGRvX2V4ZWN2ZSsweDI3LzB4MzAKWzIw NjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTAwMDFmNj5d IHJ1bl9pbml0X3Byb2Nlc3MrMHgyNi8weDMwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAg ICAgICAgICAgICBbPGZmZmZmZmZmODEwMDAyMGY+XSB0cnlfdG9fcnVuX2luaXRfcHJvY2Vz cysweGYvMHg0MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZm ZmZmZjgxNmNmNzNjPl0ga2VybmVsX2luaXQrMHg5Yy8weGYwClsyMDY1My4yMTQwMjFdICAg ICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODE2ZGJkYzg+XSByZXRfZnJvbV9mb3Jr KzB4NTgvMHg5MApbMjA2NTMuMjE0MDIxXSAgICAgU09GVElSUS1PTi1SIGF0OgpbMjA2NTMu MjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDkyYzdkPl0gX19s b2NrX2FjcXVpcmUrMHg5ZGQvMHgyMDkwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAg ICAgICAgICBbPGZmZmZmZmZmODEwOTUzMjM+XSBsb2NrX2FjcXVpcmUrMHhjMy8weDE3MApb MjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTQ1ZGM0 Pl0gbWlnaHRfZmF1bHQrMHg4NC8weGIwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAg ICAgICAgICBbPGZmZmZmZmZmODEzOWFmYTI+XSBfX2NsZWFyX3VzZXIrMHgxMi8weDYwClsy MDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEzOWIwMWE+ XSBjbGVhcl91c2VyKzB4MmEvMHgzMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAg ICAgICAgWzxmZmZmZmZmZjgxMWNlYTQxPl0gcGFkemVybysweDIxLzB4MzAKWzIwNjUzLjIx NDAyMV0gICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTFkMGQ3Nz5dIGxvYWRf ZWxmX2JpbmFyeSsweDkxNy8weDE2ZTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAg ICAgICAgIFs8ZmZmZmZmZmY4MTE3ZTZlOD5dIHNlYXJjaF9iaW5hcnlfaGFuZGxlcisweDk4 LzB4MjIwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZm ODExN2ZlNmI+XSBkb19leGVjdmVhdF9jb21tb24uaXNyYS4zMysweDVmYi8weDdhMApbMjA2 NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTgwMDM3Pl0g ZG9fZXhlY3ZlKzB4MjcvMHgzMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAg ICAgWzxmZmZmZmZmZjgxMDAwMWY2Pl0gcnVuX2luaXRfcHJvY2VzcysweDI2LzB4MzAKWzIw NjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTAwMDIwZj5d IHRyeV90b19ydW5faW5pdF9wcm9jZXNzKzB4Zi8weDQwClsyMDY1My4yMTQwMjFdICAgICAg ICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODE2Y2Y3M2M+XSBrZXJuZWxfaW5pdCsweDlj LzB4ZjAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4 MTZkYmRjOD5dIHJldF9mcm9tX2ZvcmsrMHg1OC8weDkwClsyMDY1My4yMTQwMjFdICAgICBS RUNMQUlNX0ZTLU9OLVcgYXQ6ClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAg ICAgICBbPGZmZmZmZmZmODEwOTFkMWM+XSBtYXJrX2hlbGRfbG9ja3MrMHg3Yy8weGIwClsy MDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEwOTY1 NGQ+XSBsb2NrZGVwX3RyYWNlX2FsbG9jKzB4YmQvMHgxMTAKWzIwNjUzLjIxNDAyMV0gICAg ICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTEyNzMzYz5dIF9fYWxsb2NfcGFn ZXNfbm9kZW1hc2srMHg3Yy8weGE3MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAg ICAgICAgICAgWzxmZmZmZmZmZjgxMTY1OThlPl0gYWxsb2NfcGFnZXNfY3VycmVudCsweGVl LzB4MWEwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZm ZmZmODExNDg0NDM+XSBfX3BtZF9hbGxvYysweDIzLzB4MTQwClsyMDY1My4yMTQwMjFdICAg ICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExNTE5MWY+XSBtb3ZlX3BhZ2Vf dGFibGVzKzB4NDhmLzB4NGQwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAg ICAgICBbPGZmZmZmZmZmODExN2RhZTU+XSBzaGlmdF9hcmdfcGFnZXMrMHhiNS8weDFiMApb MjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTdk ZGJiPl0gc2V0dXBfYXJnX3BhZ2VzKzB4MWRiLzB4MjIwClsyMDY1My4yMTQwMjFdICAgICAg ICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExZDA4Yjk+XSBsb2FkX2VsZl9iaW5h cnkrMHg0NTkvMHgxNmUwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAg ICBbPGZmZmZmZmZmODExN2U2ZTg+XSBzZWFyY2hfYmluYXJ5X2hhbmRsZXIrMHg5OC8weDIy MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgx MTdmZTZiPl0gZG9fZXhlY3ZlYXRfY29tbW9uLmlzcmEuMzMrMHg1ZmIvMHg3YTAKWzIwNjUz LjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4MDAzNz5d IGRvX2V4ZWN2ZSsweDI3LzB4MzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAg ICAgICAgIFs8ZmZmZmZmZmY4MTAwMDFmNj5dIHJ1bl9pbml0X3Byb2Nlc3MrMHgyNi8weDMw ClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEw MDAyMGY+XSB0cnlfdG9fcnVuX2luaXRfcHJvY2VzcysweGYvMHg0MApbMjA2NTMuMjE0MDIx XSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxNmNmNzNjPl0ga2VybmVs X2luaXQrMHg5Yy8weGYwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAg ICBbPGZmZmZmZmZmODE2ZGJkYzg+XSByZXRfZnJvbV9mb3JrKzB4NTgvMHg5MApbMjA2NTMu MjE0MDIxXSAgICAgUkVDTEFJTV9GUy1PTi1SIGF0OgpbMjA2NTMuMjE0MDIxXSAgICAgICAg ICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDkxZDFjPl0gbWFya19oZWxkX2xvY2tz KzB4N2MvMHhiMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxm ZmZmZmZmZjgxMDk2NTRkPl0gbG9ja2RlcF90cmFjZV9hbGxvYysweGJkLzB4MTEwClsyMDY1 My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExMjczM2M+ XSBfX2FsbG9jX3BhZ2VzX25vZGVtYXNrKzB4N2MvMHhhNzAKWzIwNjUzLjIxNDAyMV0gICAg ICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE2NTk4ZT5dIGFsbG9jX3BhZ2Vz X2N1cnJlbnQrMHhlZS8weDFhMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAg ICAgICAgWzxmZmZmZmZmZjgxMTIzMDQ5Pl0gX19nZXRfZnJlZV9wYWdlcysweDkvMHg0MApb MjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTIz MDkxPl0gZ2V0X3plcm9lZF9wYWdlKzB4MTEvMHgyMApbMjA2NTMuMjE0MDIxXSAgICAgICAg ICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTQ4MzlkPl0gX19wdWRfYWxsb2MrMHgx ZC8weGEwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZm ZmZmODExNDk0NzY+XSBoYW5kbGVfbW1fZmF1bHQrMHg1ZDYvMHhhZTAKWzIwNjUzLjIxNDAy MV0gICAgICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA0MTkxZD5dIF9fZG9f cGFnZV9mYXVsdCsweDFmZC8weDVkMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAg ICAgICAgICAgWzxmZmZmZmZmZjgxMDQxY2ZjPl0gZG9fcGFnZV9mYXVsdCsweGMvMHgxMApb MjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxNmRk YjEyPl0gcGFnZV9mYXVsdCsweDIyLzB4MzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAg ICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTM5YjAxYT5dIGNsZWFyX3VzZXIrMHgyYS8weDMw ClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEx Y2VhNDE+XSBwYWR6ZXJvKzB4MjEvMHgzMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAg ICAgICAgICAgICAgWzxmZmZmZmZmZjgxMWQwZDc3Pl0gbG9hZF9lbGZfYmluYXJ5KzB4OTE3 LzB4MTZlMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZm ZmZmZjgxMTdlNmU4Pl0gc2VhcmNoX2JpbmFyeV9oYW5kbGVyKzB4OTgvMHgyMjAKWzIwNjUz LjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE3ZmU2Yj5d IGRvX2V4ZWN2ZWF0X2NvbW1vbi5pc3JhLjMzKzB4NWZiLzB4N2EwClsyMDY1My4yMTQwMjFd ICAgICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExODAwMzc+XSBkb19leGVj dmUrMHgyNy8weDMwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgICBb PGZmZmZmZmZmODEwMDAxZjY+XSBydW5faW5pdF9wcm9jZXNzKzB4MjYvMHgzMApbMjA2NTMu MjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDAwMjBmPl0g dHJ5X3RvX3J1bl9pbml0X3Byb2Nlc3MrMHhmLzB4NDAKWzIwNjUzLjIxNDAyMV0gICAgICAg ICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTZjZjczYz5dIGtlcm5lbF9pbml0KzB4 OWMvMHhmMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZm ZmZmZjgxNmRiZGM4Pl0gcmV0X2Zyb21fZm9yaysweDU4LzB4OTAKWzIwNjUzLjIxNDAyMV0g ICAgIElOSVRJQUwgVVNFIGF0OgpbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAg ICBbPGZmZmZmZmZmODEwOTI2YzI+XSBfX2xvY2tfYWNxdWlyZSsweDQyMi8weDIwOTAKWzIw NjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDk1MzIzPl0g bG9ja19hY3F1aXJlKzB4YzMvMHgxNzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAg ICAgICAgWzxmZmZmZmZmZjgxNmQ5OGM1Pl0gZG93bl93cml0ZSsweDU1LzB4YzAKWzIwNjUz LjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTdmYjUwPl0gZG9f ZXhlY3ZlYXRfY29tbW9uLmlzcmEuMzMrMHgyZTAvMHg3YTAKWzIwNjUzLjIxNDAyMV0gICAg ICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTgwMDM3Pl0gZG9fZXhlY3ZlKzB4Mjcv MHgzMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEw MDAxZjY+XSBydW5faW5pdF9wcm9jZXNzKzB4MjYvMHgzMApbMjA2NTMuMjE0MDIxXSAgICAg ICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEwMDAyMGY+XSB0cnlfdG9fcnVuX2luaXRf cHJvY2VzcysweGYvMHg0MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICBb PGZmZmZmZmZmODE2Y2Y3M2M+XSBrZXJuZWxfaW5pdCsweDljLzB4ZjAKWzIwNjUzLjIxNDAy MV0gICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxNmRiZGM4Pl0gcmV0X2Zyb21f Zm9yaysweDU4LzB4OTAKWzIwNjUzLjIxNDAyMV0gICB9ClsyMDY1My4yMTQwMjFdICAgLi4u IGtleSAgICAgIGF0OiBbPGZmZmZmZmZmODFmZWZiNjA+XSBfX2tleS41MDAzNCsweDAvMHg4 ClsyMDY1My4yMTQwMjFdICAgLi4uIGFjcXVpcmVkIGF0OgpbMjA2NTMuMjE0MDIxXSAgICBb PGZmZmZmZmZmODEwOTUzMjM+XSBsb2NrX2FjcXVpcmUrMHhjMy8weDE3MApbMjA2NTMuMjE0 MDIxXSAgICBbPGZmZmZmZmZmODExNDVkYzQ+XSBtaWdodF9mYXVsdCsweDg0LzB4YjAKWzIw NjUzLjIxNDAyMV0gICAgWzxmZmZmZmZmZjgxMThlMDZkPl0gZmlsbGRpcisweDhkLzB4MTIw ClsyMDY1My4yMTQwMjFdICAgIFs8ZmZmZmZmZmY4MTJlNjEzYT5dIHhmc19kaXIyX3NmX2dl dGRlbnRzLmlzcmEuMTArMHgxZmEvMHgyNjAKWzIwNjUzLjIxNDAyMV0gICAgWzxmZmZmZmZm ZjgxMmU2NGJlPl0geGZzX3JlYWRkaXIrMHgxMmUvMHgxOTAKWzIwNjUzLjIxNDAyMV0gICAg WzxmZmZmZmZmZjgxMmU4MWI2Pl0geGZzX2ZpbGVfcmVhZGRpcisweDI2LzB4MzAKWzIwNjUz LjIxNDAyMV0gICAgWzxmZmZmZmZmZjgxMThkZTRhPl0gaXRlcmF0ZV9kaXIrMHg5YS8weDE0 MApbMjA2NTMuMjE0MDIxXSAgICBbPGZmZmZmZmZmODExOGUzMmM+XSBTeVNfZ2V0ZGVudHMr MHg3Yy8weDEwMApbMjA2NTMuMjE0MDIxXSAgICBbPGZmZmZmZmZmODE2ZGJlNzI+XSBzeXN0 ZW1fY2FsbF9mYXN0cGF0aCsweDEyLzB4MTcKClsyMDY1My4yMTQwMjFdIC0+ICgmeGZzX2Rp cl9pbG9ja19jbGFzcyl7KysrKy0rfSBvcHM6IDcxMjQwIHsKWzIwNjUzLjIxNDAyMV0gICAg SEFSRElSUS1PTi1XIGF0OgpbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8 ZmZmZmZmZmY4MTA5MmM0Mz5dIF9fbG9ja19hY3F1aXJlKzB4OWEzLzB4MjA5MApbMjA2NTMu MjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5NTMyMz5dIGxvY2tf YWNxdWlyZSsweGMzLzB4MTcwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAg WzxmZmZmZmZmZjgxMDhkMmI5Pl0gZG93bl93cml0ZV9uZXN0ZWQrMHg1OS8weGMwClsyMDY1 My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMmY0MzYwPl0geGZz X2lsb2NrKzB4YjAvMHgxMzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICBb PGZmZmZmZmZmODEyZjI3YzY+XSB4ZnNfdm5fdXBkYXRlX3RpbWUrMHg4Ni8weDFjMApbMjA2 NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE5NjFjMD5dIHVw ZGF0ZV90aW1lKzB4MjAvMHhjMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAg IFs8ZmZmZmZmZmY4MTE5NjMyNj5dIHRvdWNoX2F0aW1lKzB4YzYvMHgxMzAKWzIwNjUzLjIx NDAyMV0gICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExOGRlOWM+XSBpdGVyYXRl X2RpcisweGVjLzB4MTQwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgWzxm ZmZmZmZmZjgxMThlMzJjPl0gU3lTX2dldGRlbnRzKzB4N2MvMHgxMDAKWzIwNjUzLjIxNDAy MV0gICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODE2ZGJlNzI+XSBzeXN0ZW1fY2Fs bF9mYXN0cGF0aCsweDEyLzB4MTcKWzIwNjUzLjIxNDAyMV0gICAgSEFSRElSUS1PTi1SIGF0 OgpbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5MjYw Nz5dIF9fbG9ja19hY3F1aXJlKzB4MzY3LzB4MjA5MApbMjA2NTMuMjE0MDIxXSAgICAgICAg ICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5NTMyMz5dIGxvY2tfYWNxdWlyZSsweGMzLzB4 MTcwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDhk NGUyPl0gZG93bl9yZWFkX25lc3RlZCsweDUyLzB4YTAKWzIwNjUzLjIxNDAyMV0gICAgICAg ICAgICAgICAgICAgICBbPGZmZmZmZmZmODEyZjQzMjI+XSB4ZnNfaWxvY2srMHg3Mi8weDEz MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTJmNDQw Zj5dIHhmc19pbG9ja19kYXRhX21hcF9zaGFyZWQrMHgyZi8weDQwClsyMDY1My4yMTQwMjFd ICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMmY1NGZhPl0geGZzX2xvb2t1cCsw eDVhLzB4MTIwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZm ZjgxMmYyM2NmPl0geGZzX3ZuX2xvb2t1cCsweDRmLzB4OTAKWzIwNjUzLjIxNDAyMV0gICAg ICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExODFmMTg+XSBsb29rdXBfcmVhbCsweDE4 LzB4NzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEx ODJhY2U+XSBfX2xvb2t1cF9oYXNoKzB4MmUvMHg0MApbMjA2NTMuMjE0MDIxXSAgICAgICAg ICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4NmM3ZT5dIGxpbmtfcGF0aF93YWxrKzB4M2Fl LzB4MTM2MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4 MTE4ODkwND5dIHBhdGhfbG9va3VwYXQrMHg2NDQvMHgxMTEwClsyMDY1My4yMTQwMjFdICAg ICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTg5M2Y1Pl0gZmlsZW5hbWVfbG9va3Vw KzB4MjUvMHhjMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZm ZmY4MTE4YjMzZj5dIHVzZXJfcGF0aF9hdF9lbXB0eSsweDRmLzB4YTAKWzIwNjUzLjIxNDAy MV0gICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExOGIzOWM+XSB1c2VyX3BhdGhf YXQrMHhjLzB4MTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICBbPGZmZmZm ZmZmODExNzY2NmQ+XSBTeVNfYWNjZXNzKzB4OWQvMHgyMDAKWzIwNjUzLjIxNDAyMV0gICAg ICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODE2ZGJlNzI+XSBzeXN0ZW1fY2FsbF9mYXN0 cGF0aCsweDEyLzB4MTcKWzIwNjUzLjIxNDAyMV0gICAgU09GVElSUS1PTi1XIGF0OgpbMjA2 NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5MmM3ZD5dIF9f bG9ja19hY3F1aXJlKzB4OWRkLzB4MjA5MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAg ICAgICAgIFs8ZmZmZmZmZmY4MTA5NTMyMz5dIGxvY2tfYWNxdWlyZSsweGMzLzB4MTcwClsy MDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDhkMmI5Pl0g ZG93bl93cml0ZV9uZXN0ZWQrMHg1OS8weGMwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAg ICAgICAgICAgWzxmZmZmZmZmZjgxMmY0MzYwPl0geGZzX2lsb2NrKzB4YjAvMHgxMzAKWzIw NjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEyZjI3YzY+XSB4 ZnNfdm5fdXBkYXRlX3RpbWUrMHg4Ni8weDFjMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAg ICAgICAgICAgIFs8ZmZmZmZmZmY4MTE5NjFjMD5dIHVwZGF0ZV90aW1lKzB4MjAvMHhjMApb MjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE5NjMyNj5d IHRvdWNoX2F0aW1lKzB4YzYvMHgxMzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAg ICAgICBbPGZmZmZmZmZmODExOGRlOWM+XSBpdGVyYXRlX2RpcisweGVjLzB4MTQwClsyMDY1 My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMThlMzJjPl0gU3lT X2dldGRlbnRzKzB4N2MvMHgxMDAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAg ICBbPGZmZmZmZmZmODE2ZGJlNzI+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDEyLzB4MTcK WzIwNjUzLjIxNDAyMV0gICAgU09GVElSUS1PTi1SIGF0OgpbMjA2NTMuMjE0MDIxXSAgICAg ICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5MmM3ZD5dIF9fbG9ja19hY3F1aXJlKzB4 OWRkLzB4MjA5MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZm ZmY4MTA5NTMyMz5dIGxvY2tfYWNxdWlyZSsweGMzLzB4MTcwClsyMDY1My4yMTQwMjFdICAg ICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDhkNGUyPl0gZG93bl9yZWFkX25lc3Rl ZCsweDUyLzB4YTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICBbPGZmZmZm ZmZmODEyZjQzMjI+XSB4ZnNfaWxvY2srMHg3Mi8weDEzMApbMjA2NTMuMjE0MDIxXSAgICAg ICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTJmNDQwZj5dIHhmc19pbG9ja19kYXRhX21h cF9zaGFyZWQrMHgyZi8weDQwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAg WzxmZmZmZmZmZjgxMmY1NGZhPl0geGZzX2xvb2t1cCsweDVhLzB4MTIwClsyMDY1My4yMTQw MjFdICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMmYyM2NmPl0geGZzX3ZuX2xv b2t1cCsweDRmLzB4OTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICBbPGZm ZmZmZmZmODExODFmMTg+XSBsb29rdXBfcmVhbCsweDE4LzB4NzAKWzIwNjUzLjIxNDAyMV0g ICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExODJhY2U+XSBfX2xvb2t1cF9oYXNo KzB4MmUvMHg0MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZm ZmY4MTE4NmM3ZT5dIGxpbmtfcGF0aF93YWxrKzB4M2FlLzB4MTM2MApbMjA2NTMuMjE0MDIx XSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4ODkwND5dIHBhdGhfbG9va3Vw YXQrMHg2NDQvMHgxMTEwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgWzxm ZmZmZmZmZjgxMTg5M2Y1Pl0gZmlsZW5hbWVfbG9va3VwKzB4MjUvMHhjMApbMjA2NTMuMjE0 MDIxXSAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4YjMzZj5dIHVzZXJfcGF0 aF9hdF9lbXB0eSsweDRmLzB4YTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAg ICBbPGZmZmZmZmZmODExOGIzOWM+XSB1c2VyX3BhdGhfYXQrMHhjLzB4MTAKWzIwNjUzLjIx NDAyMV0gICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExNzY2NmQ+XSBTeVNfYWNj ZXNzKzB4OWQvMHgyMDAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICBbPGZm ZmZmZmZmODE2ZGJlNzI+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDEyLzB4MTcKWzIwNjUz LjIxNDAyMV0gICAgSU4tUkVDTEFJTV9GUy1XIGF0OgpbMjA2NTMuMjE0MDIxXSAgICAgICAg ICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5MjY4Nz5dIF9fbG9ja19hY3F1aXJlKzB4 M2U3LzB4MjA5MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgIFs8ZmZm ZmZmZmY4MTA5NTMyMz5dIGxvY2tfYWNxdWlyZSsweGMzLzB4MTcwClsyMDY1My4yMTQwMjFd ICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDhkMmI5Pl0gZG93bl93cml0 ZV9uZXN0ZWQrMHg1OS8weGMwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAg ICAgWzxmZmZmZmZmZjgxMmY0MzYwPl0geGZzX2lsb2NrKzB4YjAvMHgxMzAKWzIwNjUzLjIx NDAyMV0gICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEyZWM3NmQ+XSB4ZnNf cmVjbGFpbV9pbm9kZSsweGZkLzB4MzQwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAg ICAgICAgICAgWzxmZmZmZmZmZjgxMmVjYzIzPl0geGZzX3JlY2xhaW1faW5vZGVzX2FnKzB4 MjczLzB4M2MwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZm ZmZmZjgxMmVkOTllPl0geGZzX3JlY2xhaW1faW5vZGVzX25yKzB4MmUvMHg0MApbMjA2NTMu MjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTJmYzU1MD5dIHhm c19mc19mcmVlX2NhY2hlZF9vYmplY3RzKzB4MTAvMHgyMApbMjA2NTMuMjE0MDIxXSAgICAg ICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE3YmI0Yj5dIHN1cGVyX2NhY2hlX3Nj YW4rMHgxNmIvMHgxNzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgICBb PGZmZmZmZmZmODExMzA1NWM+XSBzaHJpbmtfbm9kZV9zbGFicysweDFjYy8weDNiMApbMjA2 NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTEzMmJjND5d IHNocmlua196b25lKzB4NzQvMHhhMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAg ICAgICAgIFs8ZmZmZmZmZmY4MTEzMzY4OT5dIGtzd2FwZCsweDQ1OS8weDlkMApbMjA2NTMu MjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTA2YmQ0ZD5dIGt0 aHJlYWQrMHhlZC8weDExMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAg IFs8ZmZmZmZmZmY4MTZkYmRjOD5dIHJldF9mcm9tX2ZvcmsrMHg1OC8weDkwClsyMDY1My4y MTQwMjFdICAgIFJFQ0xBSU1fRlMtT04tUiBhdDoKWzIwNjUzLjIxNDAyMV0gICAgICAgICAg ICAgICAgICAgICAgICBbPGZmZmZmZmZmODEwOTFkMWM+XSBtYXJrX2hlbGRfbG9ja3MrMHg3 Yy8weGIwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZm ZjgxMDk2NTRkPl0gbG9ja2RlcF90cmFjZV9hbGxvYysweGJkLzB4MTEwClsyMDY1My4yMTQw MjFdICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTI3MzNjPl0gX19hbGxv Y19wYWdlc19ub2RlbWFzaysweDdjLzB4YTcwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAg ICAgICAgICAgICAgWzxmZmZmZmZmZjgxMTY3MWI5Pl0gYWxsb2NfcGFnZXNfdm1hKzB4ZTkv MHgyMTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZm ODExNDk4MDU+XSBoYW5kbGVfbW1fZmF1bHQrMHg5NjUvMHhhZTAKWzIwNjUzLjIxNDAyMV0g ICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEwNDE5MWQ+XSBfX2RvX3BhZ2Vf ZmF1bHQrMHgxZmQvMHg1ZDAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAg ICBbPGZmZmZmZmZmODEwNDFjZmM+XSBkb19wYWdlX2ZhdWx0KzB4Yy8weDEwClsyMDY1My4y MTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxNmRkYjEyPl0gcGFn ZV9mYXVsdCsweDIyLzB4MzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgICAg ICBbPGZmZmZmZmZmODEyZTVlNjI+XSB4ZnNfZGlyMl9sZWFmX2dldGRlbnRzKzB4MmUyLzB4 M2MwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgx MmU2NGNlPl0geGZzX3JlYWRkaXIrMHgxM2UvMHgxOTAKWzIwNjUzLjIxNDAyMV0gICAgICAg ICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEyZTgxYjY+XSB4ZnNfZmlsZV9yZWFkZGly KzB4MjYvMHgzMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgIFs8ZmZm ZmZmZmY4MTE4ZGU0YT5dIGl0ZXJhdGVfZGlyKzB4OWEvMHgxNDAKWzIwNjUzLjIxNDAyMV0g ICAgICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODExOGUzMmM+XSBTeVNfZ2V0ZGVu dHMrMHg3Yy8weDEwMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgICAgIFs8 ZmZmZmZmZmY4MTZkYmU3Mj5dIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MTIvMHgxNwpbMjA2 NTMuMjE0MDIxXSAgICBJTklUSUFMIFVTRSBhdDoKWzIwNjUzLjIxNDAyMV0gICAgICAgICAg ICAgICAgICAgIFs8ZmZmZmZmZmY4MTA5MjZjMj5dIF9fbG9ja19hY3F1aXJlKzB4NDIyLzB4 MjA5MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAgICAgICAgWzxmZmZmZmZmZjgxMDk1 MzIzPl0gbG9ja19hY3F1aXJlKzB4YzMvMHgxNzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAg ICAgICAgICAgIFs8ZmZmZmZmZmY4MTA4ZDRlMj5dIGRvd25fcmVhZF9uZXN0ZWQrMHg1Mi8w eGEwClsyMDY1My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODEyZjQz MjI+XSB4ZnNfaWxvY2srMHg3Mi8weDEzMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAg ICAgICAgWzxmZmZmZmZmZjgxMmY0NDBmPl0geGZzX2lsb2NrX2RhdGFfbWFwX3NoYXJlZCsw eDJmLzB4NDAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4 MTJmNTRmYT5dIHhmc19sb29rdXArMHg1YS8weDEyMApbMjA2NTMuMjE0MDIxXSAgICAgICAg ICAgICAgICAgICAgWzxmZmZmZmZmZjgxMmYyM2NmPl0geGZzX3ZuX2xvb2t1cCsweDRmLzB4 OTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4MWYx OD5dIGxvb2t1cF9yZWFsKzB4MTgvMHg3MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAg ICAgICAgWzxmZmZmZmZmZjgxMTgyYWNlPl0gX19sb29rdXBfaGFzaCsweDJlLzB4NDAKWzIw NjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4NmM3ZT5dIGxp bmtfcGF0aF93YWxrKzB4M2FlLzB4MTM2MApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAg ICAgICAgWzxmZmZmZmZmZjgxMTg4OTA0Pl0gcGF0aF9sb29rdXBhdCsweDY0NC8weDExMTAK WzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4OTNmNT5d IGZpbGVuYW1lX2xvb2t1cCsweDI1LzB4YzAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAg ICAgICAgIFs8ZmZmZmZmZmY4MTE4YjMzZj5dIHVzZXJfcGF0aF9hdF9lbXB0eSsweDRmLzB4 YTAKWzIwNjUzLjIxNDAyMV0gICAgICAgICAgICAgICAgICAgIFs8ZmZmZmZmZmY4MTE4YjM5 Yz5dIHVzZXJfcGF0aF9hdCsweGMvMHgxMApbMjA2NTMuMjE0MDIxXSAgICAgICAgICAgICAg ICAgICAgWzxmZmZmZmZmZjgxMTc2NjZkPl0gU3lTX2FjY2VzcysweDlkLzB4MjAwClsyMDY1 My4yMTQwMjFdICAgICAgICAgICAgICAgICAgICBbPGZmZmZmZmZmODE2ZGJlNzI+XSBzeXN0 ZW1fY2FsbF9mYXN0cGF0aCsweDEyLzB4MTcKWzIwNjUzLjIxNDAyMV0gIH0KWzIwNjUzLjIx NDAyMV0gIC4uLiBrZXkgICAgICBhdDogWzxmZmZmZmZmZjgyZDY5Mzk0Pl0geGZzX2Rpcl9p bG9ja19jbGFzcysweDAvMHg4ClsyMDY1My4yMTQwMjFdICAuLi4gYWNxdWlyZWQgYXQ6Clsy MDY1My4yMTQwMjFdICAgIFs8ZmZmZmZmZmY4MTA5MGNhNz5dIGNoZWNrX3VzYWdlX2Zvcndh cmRzKzB4MTM3LzB4MTQwClsyMDY1My4yMTQwMjFdICAgIFs8ZmZmZmZmZmY4MTA5MTk4Nz5d IG1hcmtfbG9jaysweDNmNy8weDcxMApbMjA2NTMuMjE0MDIxXSAgICBbPGZmZmZmZmZmODEw OTI2ODc+XSBfX2xvY2tfYWNxdWlyZSsweDNlNy8weDIwOTAKWzIwNjUzLjIxNDAyMV0gICAg WzxmZmZmZmZmZjgxMDk1MzIzPl0gbG9ja19hY3F1aXJlKzB4YzMvMHgxNzAKWzIwNjUzLjIx NDAyMV0gICAgWzxmZmZmZmZmZjgxMDhkMmI5Pl0gZG93bl93cml0ZV9uZXN0ZWQrMHg1OS8w eGMwClsyMDY1My4yMTQwMjFdICAgIFs8ZmZmZmZmZmY4MTJmNDM2MD5dIHhmc19pbG9jaysw eGIwLzB4MTMwClsyMDY1My4yMTQwMjFdICAgIFs8ZmZmZmZmZmY4MTJlYzc2ZD5dIHhmc19y ZWNsYWltX2lub2RlKzB4ZmQvMHgzNDAKWzIwNjUzLjIxNDAyMV0gICAgWzxmZmZmZmZmZjgx MmVjYzIzPl0geGZzX3JlY2xhaW1faW5vZGVzX2FnKzB4MjczLzB4M2MwClsyMDY1My4yMTQw MjFdICAgIFs8ZmZmZmZmZmY4MTJlZDk5ZT5dIHhmc19yZWNsYWltX2lub2Rlc19ucisweDJl LzB4NDAKWzIwNjUzLjIxNDAyMV0gICAgWzxmZmZmZmZmZjgxMmZjNTUwPl0geGZzX2ZzX2Zy ZWVfY2FjaGVkX29iamVjdHMrMHgxMC8weDIwClsyMDY1My4yMTQwMjFdICAgIFs8ZmZmZmZm ZmY4MTE3YmI0Yj5dIHN1cGVyX2NhY2hlX3NjYW4rMHgxNmIvMHgxNzAKWzIwNjUzLjIxNDAy MV0gICAgWzxmZmZmZmZmZjgxMTMwNTVjPl0gc2hyaW5rX25vZGVfc2xhYnMrMHgxY2MvMHgz YjAKWzIwNjUzLjIxNDAyMV0gICAgWzxmZmZmZmZmZjgxMTMyYmM0Pl0gc2hyaW5rX3pvbmUr MHg3NC8weGEwClsyMDY1My4yMTQwMjFdICAgIFs8ZmZmZmZmZmY4MTEzMzY4OT5dIGtzd2Fw ZCsweDQ1OS8weDlkMApbMjA2NTMuMjE0MDIxXSAgICBbPGZmZmZmZmZmODEwNmJkNGQ+XSBr dGhyZWFkKzB4ZWQvMHgxMTAKWzIwNjUzLjIxNDAyMV0gICAgWzxmZmZmZmZmZjgxNmRiZGM4 Pl0gcmV0X2Zyb21fZm9yaysweDU4LzB4OTAKClsyMDY1My4yMTQwMjFdIAogICAgICAgICAg ICAgICBzdGFjayBiYWNrdHJhY2U6ClsyMDY1My4yMTQwMjFdIENQVTogMSBQSUQ6IDUxMyBD b21tOiBrc3dhcGQwIFRhaW50ZWQ6IEcgICAgICAgICAgIE8gICAzLjE5LjggIzYKWzIwNjUz LjIxNDAyMV0gSGFyZHdhcmUgbmFtZTogVklBIHRlY2hub2xvZ3kgSW5jLiBWWDkwMC9FSVRY LTMwMDIsIEJJT1MgSTIxMDAxMDEgMDIvMTQvMjAxMgpbMjA2NTMuMjE0MDIxXSAgZmZmZmZm ZmY4MmI3M2MwMCBmZmZmODgwMWY1NjI3Njc4IGZmZmZmZmZmODE2ZDMyMTEgMDAwMDAwMDAw MDAwMDAwNwpbMjA2NTMuMjE0MDIxXSAgZmZmZmZmZmY4MmI3M2MwMCBmZmZmODgwMWY1NjI3 NmM4IGZmZmZmZmZmODE2ZDIxMGQgMDAwMDAwMDAwMDAwMDAwYQpbMjA2NTMuMjE0MDIxXSAg ZmZmZmZmZmY4MWEwN2ZhMiBmZmZmODgwMWY1NjI3NmM4IGZmZmY4ODAxZjY2NjU3YzggZmZm Zjg4MDFmNjY2NTAwMApbMjA2NTMuMjE0MDIxXSBDYWxsIFRyYWNlOgpbMjA2NTMuMjE0MDIx XSAgWzxmZmZmZmZmZjgxNmQzMjExPl0gZHVtcF9zdGFjaysweDRjLzB4NjUKWzIwNjUzLjIx NDAyMV0gIFs8ZmZmZmZmZmY4MTZkMjEwZD5dIHByaW50X2lycV9pbnZlcnNpb25fYnVnLnBh cnQuMzYrMHgxYmEvMHgxYzkKWzIwNjUzLjIxNDAyMV0gIFs8ZmZmZmZmZmY4MTA5MGNhNz5d IGNoZWNrX3VzYWdlX2ZvcndhcmRzKzB4MTM3LzB4MTQwClsyMDY1My4yMTQwMjFdICBbPGZm ZmZmZmZmODEwOTE5ODc+XSBtYXJrX2xvY2srMHgzZjcvMHg3MTAKWzIwNjUzLjIxNDAyMV0g IFs8ZmZmZmZmZmY4MTA5MGI3MD5dID8gY2hlY2tfdXNhZ2VfYmFja3dhcmRzKzB4MTQwLzB4 MTQwClsyMDY1My4yMTQwMjFdICBbPGZmZmZmZmZmODEwOTI2ODc+XSBfX2xvY2tfYWNxdWly ZSsweDNlNy8weDIwOTAKWzIwNjUzLjIxNDAyMV0gIFs8ZmZmZmZmZmY4MTA3YmQxNT5dID8g c2NoZWRfY2xvY2tfbG9jYWwrMHgyNS8weDkwClsyMDY1My4yMTQwMjFdICBbPGZmZmZmZmZm ODEwOTI4NWM+XSA/IF9fbG9ja19hY3F1aXJlKzB4NWJjLzB4MjA5MApbMjA2NTMuMjE0MDIx XSAgWzxmZmZmZmZmZjgxMDk1MzIzPl0gbG9ja19hY3F1aXJlKzB4YzMvMHgxNzAKWzIwNjUz LjIxNDAyMV0gIFs8ZmZmZmZmZmY4MTJmNDM2MD5dID8geGZzX2lsb2NrKzB4YjAvMHgxMzAK WzIwNjUzLjIxNDAyMV0gIFs8ZmZmZmZmZmY4MTJlYzc2ZD5dID8geGZzX3JlY2xhaW1faW5v ZGUrMHhmZC8weDM0MApbMjA2NTMuMjE0MDIxXSAgWzxmZmZmZmZmZjgxMDhkMmI5Pl0gZG93 bl93cml0ZV9uZXN0ZWQrMHg1OS8weGMwClsyMDY1My4yMTQwMjFdICBbPGZmZmZmZmZmODEy ZjQzNjA+XSA/IHhmc19pbG9jaysweGIwLzB4MTMwClsyMDY1My4yMTQwMjFdICBbPGZmZmZm ZmZmODEyZjQzNjA+XSB4ZnNfaWxvY2srMHhiMC8weDEzMApbMjA2NTMuMjE0MDIxXSAgWzxm ZmZmZmZmZjgxMmVjNzZkPl0geGZzX3JlY2xhaW1faW5vZGUrMHhmZC8weDM0MApbMjA2NTMu MjE0MDIxXSAgWzxmZmZmZmZmZjgxMmVjYzIzPl0geGZzX3JlY2xhaW1faW5vZGVzX2FnKzB4 MjczLzB4M2MwClsyMDY1My4yMTQwMjFdICBbPGZmZmZmZmZmODEyZWNhODA+XSA/IHhmc19y ZWNsYWltX2lub2Rlc19hZysweGQwLzB4M2MwClsyMDY1My4yMTQwMjFdICBbPGZmZmZmZmZm ODEwN2JkMTU+XSA/IHNjaGVkX2Nsb2NrX2xvY2FsKzB4MjUvMHg5MApbMjA2NTMuMjE0MDIx XSAgWzxmZmZmZmZmZjgxMDk1MzM4Pl0gPyBsb2NrX2FjcXVpcmUrMHhkOC8weDE3MApbMjA2 NTMuMjE0MDIxXSAgWzxmZmZmZmZmZjgxMzEwOGU4Pl0gPyB4ZnNfYWlsX3B1c2hfYWxsKzB4 NzgvMHg5MApbMjA2NTMuMjE0MDIxXSAgWzxmZmZmZmZmZjgxMDdiZmY4Pl0gPyBzY2hlZF9j bG9ja19jcHUrMHg5OC8weGQwClsyMDY1My4yMTQwMjFdICBbPGZmZmZmZmZmODEwN2MwOGE+ XSA/IGxvY2FsX2Nsb2NrKzB4MWEvMHgzMApbMjA2NTMuMjE0MDIxXSAgWzxmZmZmZmZmZjgx MzEwOGU4Pl0gPyB4ZnNfYWlsX3B1c2hfYWxsKzB4NzgvMHg5MApbMjA2NTMuMjE0MDIxXSAg WzxmZmZmZmZmZjgxNmRiM2M2Pl0gPyBfcmF3X3NwaW5fdW5sb2NrKzB4MjYvMHg0MApbMjA2 NTMuMjE0MDIxXSAgWzxmZmZmZmZmZjgxMmVkOTllPl0geGZzX3JlY2xhaW1faW5vZGVzX25y KzB4MmUvMHg0MApbMjA2NTMuMjE0MDIxXSAgWzxmZmZmZmZmZjgxMmZjNTUwPl0geGZzX2Zz X2ZyZWVfY2FjaGVkX29iamVjdHMrMHgxMC8weDIwClsyMDY1My4yMTQwMjFdICBbPGZmZmZm ZmZmODExN2JiNGI+XSBzdXBlcl9jYWNoZV9zY2FuKzB4MTZiLzB4MTcwClsyMDY1My4yMTQw MjFdICBbPGZmZmZmZmZmODExMzA1NWM+XSBzaHJpbmtfbm9kZV9zbGFicysweDFjYy8weDNi MApbMjA2NTMuMjE0MDIxXSAgWzxmZmZmZmZmZjgxMTMyYmM0Pl0gc2hyaW5rX3pvbmUrMHg3 NC8weGEwClsyMDY1My4yMTQwMjFdICBbPGZmZmZmZmZmODExMzM2ODk+XSBrc3dhcGQrMHg0 NTkvMHg5ZDAKWzIwNjUzLjIxNDAyMV0gIFs8ZmZmZmZmZmY4MTEzMzIzMD5dID8gem9uZV9y ZWNsYWltKzB4MjMwLzB4MjMwClsyMDY1My4yMTQwMjFdICBbPGZmZmZmZmZmODEwNmJkNGQ+ XSBrdGhyZWFkKzB4ZWQvMHgxMTAKWzIwNjUzLjIxNDAyMV0gIFs8ZmZmZmZmZmY4MTA2YmM2 MD5dID8ga3RocmVhZF9jcmVhdGVfb25fbm9kZSsweDI0MC8weDI0MApbMjA2NTMuMjE0MDIx XSAgWzxmZmZmZmZmZjgxNmRiZGM4Pl0gcmV0X2Zyb21fZm9yaysweDU4LzB4OTAKWzIwNjUz LjIxNDAyMV0gIFs8ZmZmZmZmZmY4MTA2YmM2MD5dID8ga3RocmVhZF9jcmVhdGVfb25fbm9k ZSsweDI0MC8weDI0MAo= --------------FCDEAA802FAAAEFEF4C84CC8-- From hch@lst.de Sat Aug 20 01:37:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 78CF27CA2 for ; Sat, 20 Aug 2016 01:37:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D14F5AC003 for ; Fri, 19 Aug 2016 23:37:28 -0700 (PDT) X-ASG-Debug-ID: 1471675044-0bf57b53139ed10001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id j0eZNvIIrWG9NFpj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 19 Aug 2016 23:37:25 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 746E17068E; Sat, 20 Aug 2016 08:37:23 +0200 (CEST) Date: Sat, 20 Aug 2016 08:37:23 +0200 From: Christoph Hellwig To: Peter Zijlstra Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-ID: <20160820063723.GA7013@lst.de> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead References: <1470935423-12329-1-git-send-email-hch@lst.de> <20160811215444.GY30192@twins.programming.kicks-ass.net> <20160818173707.GA1240@lst.de> <20160819132736.GH10121@twins.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160819132736.GH10121@twins.programming.kicks-ass.net> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1471675045 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 554 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32170 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 19, 2016 at 03:27:36PM +0200, Peter Zijlstra wrote: > Hurm, if you're going to directly use that maybe we should pick a better > name ;-) Fine with that. > Also, be sure to check the debug_locks variable, if that's cleared the > result of _lockdep_is_held() isn't reliable -- we stop tracking lock > state when there's an error. I already do. But I'm wondering if we can't simply move the debug_locks check into lockdep_is_held? It's already used directly in a few places, and that would also solve the whole naming issue. From david@fromorbit.com Sat Aug 20 18:23:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C10017CA2 for ; Sat, 20 Aug 2016 18:23:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 93B358F8037 for ; Sat, 20 Aug 2016 16:23:43 -0700 (PDT) X-ASG-Debug-ID: 1471735420-0bf57b5313b3480001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id LZF1JZroRMd9WHy1 for ; Sat, 20 Aug 2016 16:23:41 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CvEADo5bhXEAI1LHleg0SBUoJ5g3mbawaMcIoghhcEAgKBOk0CAQEBAQECBgEBAQEBAQEBN0CEXwEFOhwjEAgDDgoJJQ8FJQMHGhOIMLtBAQslHoVFhRWKGwEEmUiPFYFhjXmMP4N4hGAqNIZ7AQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2016 08:53:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbFc2-0006uO-5Y; Sun, 21 Aug 2016 09:23:38 +1000 Date: Sun, 21 Aug 2016 09:23:38 +1000 From: Dave Chinner To: Andrew Ryder Cc: xfs@oss.sgi.com Subject: Re: IRQ Lock Inversion dependency detected? Message-ID: <20160820232338.GL19025@dastard> X-ASG-Orig-Subj: Re: IRQ Lock Inversion dependency detected? References: <6b41c73b-9894-3076-670a-18c7247752b8@shaw.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6b41c73b-9894-3076-670a-18c7247752b8@shaw.ca> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1471735420 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 508 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32186 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Aug 20, 2016 at 12:09:24AM -0400, Andrew Ryder wrote: > Had this pop up sometime in the last 24 hours but it didn't seem to > cause me any problems? Thought I'd pass it along if its of use or > ignore them in the future? I've attached the full dmesg output also. False positive. See commit dbad7c9 ("xfs: stop holding ILOCK over filldir callbacks") for explanation and the change that was made to stop lockdep triggering on this. Cheers, Dave. -- Dave Chinner david@fromorbit.com From zlang@redhat.com Sun Aug 21 09:47:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 331D17CA2 for ; Sun, 21 Aug 2016 09:47:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E920C304032 for ; Sun, 21 Aug 2016 07:47:44 -0700 (PDT) X-ASG-Debug-ID: 1471790862-0bf57b5311c4c10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OBB0v1lHG9cyzaYq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 21 Aug 2016 07:47:43 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B949D4E4C7; Sun, 21 Aug 2016 14:47:42 +0000 (UTC) Received: from localhost (vpn1-5-49.pek2.redhat.com [10.72.5.49]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7LElfw8016870; Sun, 21 Aug 2016 10:47:42 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH] xfs/033: source mkfs output again if isize less than 512 Date: Sun, 21 Aug 2016 22:47:39 +0800 X-ASG-Orig-Subj: [PATCH] xfs/033: source mkfs output again if isize less than 512 Message-Id: <1471790859-26077-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Sun, 21 Aug 2016 14:47:42 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471790863 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3722 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When blocksize is 512b, xfs/033 will run mkfs.xfs again to make sure inode size is 512b. As below: # devzero blows away 512byte blocks, so make 512byte inodes (at least) _scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs . $tmp.mkfs [ $isize -lt 512 ] && \ _scratch_mkfs_xfs -isize=512 | _filter_mkfs >/dev/null 2>&1 But after "566ebd5 mkfs: default to CRC enabled filesystems", xfsprogs enable CRC as default. If MKFS_OPTIONS is "-b size=512 -m crc=0", the first "_scratch_mkfs_xfs" will make crc=0, but the second will change "crc" to "1", because it'll waive the "-b size=512 -m crc=0" options. xfs/033 need to check xfs's sb_features, for use different .out files. So we should import the mkfs output($tmp.mkfs file) again, if the scecond mkfs changes something. Signed-off-by: Zorro Lang --- Hi, I moved the mkfs_xfs output to /dev/null, because: 1. I think it's not necessary. 2. The case maybe do and output mkfs once or twice(not sure). So it'll be hard to keep consistent golden image. Thanks, Zorro tests/xfs/033 | 8 +++++--- tests/xfs/033.out.crc.linux | 6 ------ tests/xfs/033.out.irix | 6 ------ tests/xfs/033.out.linux | 6 ------ 4 files changed, 5 insertions(+), 21 deletions(-) diff --git a/tests/xfs/033 b/tests/xfs/033 index 9342f0c..45caf08 100755 --- a/tests/xfs/033 +++ b/tests/xfs/033 @@ -78,10 +78,12 @@ _require_scratch _require_no_large_scratch_dev # devzero blows away 512byte blocks, so make 512byte inodes (at least) -_scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs +_scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs >/dev/null . $tmp.mkfs -[ $isize -lt 512 ] && \ - _scratch_mkfs_xfs -isize=512 | _filter_mkfs >/dev/null 2>&1 +if [ $isize -lt 512 ]; then + _scratch_mkfs_xfs -isize=512 | _filter_mkfs 2>$tmp.mkfs >/dev/null + . $tmp.mkfs +fi # link correct .out file FEATURES=$(_get_os_name) diff --git a/tests/xfs/033.out.crc.linux b/tests/xfs/033.out.crc.linux index a6e86b9..2ab4c43 100644 --- a/tests/xfs/033.out.crc.linux +++ b/tests/xfs/033.out.crc.linux @@ -1,10 +1,4 @@ QA output created by 033 -meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks -data = bsize=XXX blocks=XXX, imaxpct=PCT - = sunit=XXX swidth=XXX, unwritten=X -naming =VERN bsize=XXX -log =LDEV bsize=XXX blocks=XXX -realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX Corrupting root inode - setting bits to 0 Wrote X.XXKb (value 0x0) Phase 1 - find and verify superblock... diff --git a/tests/xfs/033.out.irix b/tests/xfs/033.out.irix index 1a2d9c3..5960117 100644 --- a/tests/xfs/033.out.irix +++ b/tests/xfs/033.out.irix @@ -1,10 +1,4 @@ QA output created by 033 -meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks -data = bsize=XXX blocks=XXX, imaxpct=PCT - = sunit=XXX swidth=XXX, unwritten=X -naming =VERN bsize=XXX -log =LDEV bsize=XXX blocks=XXX -realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX Corrupting root inode - setting bits to 0 Wrote X.XXKb (value 0x0) Phase 1 - find and verify superblock... diff --git a/tests/xfs/033.out.linux b/tests/xfs/033.out.linux index d79ce2a..68bc781 100644 --- a/tests/xfs/033.out.linux +++ b/tests/xfs/033.out.linux @@ -1,10 +1,4 @@ QA output created by 033 -meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks -data = bsize=XXX blocks=XXX, imaxpct=PCT - = sunit=XXX swidth=XXX, unwritten=X -naming =VERN bsize=XXX -log =LDEV bsize=XXX blocks=XXX -realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX Corrupting root inode - setting bits to 0 Wrote X.XXKb (value 0x0) Phase 1 - find and verify superblock... -- 2.7.4 From BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 21 16:47:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6780F7CA0 for ; Sun, 21 Aug 2016 16:47:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B8FE8F8035 for ; Sun, 21 Aug 2016 14:47:11 -0700 (PDT) X-ASG-Debug-ID: 1471816026-0bf8155c77b0750001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ICuCOHS0B5oDYcWu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 21 Aug 2016 14:47:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bbaaA-00019H-3l; Sun, 21 Aug 2016 21:47:06 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: agruenba@redhat.com, rpeterso@redhat.com, linux-fsdevel@vger.kernel.org Subject: [PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems Date: Sun, 21 Aug 2016 23:47:03 +0200 X-ASG-Orig-Subj: [PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems Message-Id: <1471816023-28739-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471816026 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2003 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Filesystems like XFS that use extents should not set the FIEMAP_EXTENT_MERGED flag in the fiemap extent structures. To allow for both behaviors for the upcoming gfs2 usage split the iomap type field into type and flags, and only set FIEMAP_EXTENT_MERGED if the IOMAP_F_MERGED flag is set. The flags field will also come in handy for future features such as shared extents on reflink-enabled file systems. Reported-by: Andreas Gruenbacher Signed-off-by: Christoph Hellwig --- fs/iomap.c | 5 ++++- include/linux/iomap.h | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/iomap.c b/fs/iomap.c index 0342254..706270f 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -428,9 +428,12 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi, break; } + if (iomap->flags & IOMAP_F_MERGED) + flags |= FIEMAP_EXTENT_MERGED; + return fiemap_fill_next_extent(fi, iomap->offset, iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, - iomap->length, flags | FIEMAP_EXTENT_MERGED); + iomap->length, flags); } diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 3267df4..3d70ece 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -19,6 +19,11 @@ struct vm_fault; #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ /* + * Flags for iomap mappings: + */ +#define IOMAP_F_MERGED 0x01 /* contains multiple blocks/extents */ + +/* * Magic value for blkno: */ #define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ @@ -27,7 +32,8 @@ struct iomap { sector_t blkno; /* 1st sector of mapping, 512b units */ loff_t offset; /* file offset of mapping, bytes */ u64 length; /* length of mapping, bytes */ - int type; /* type of mapping */ + u16 type; /* type of mapping */ + u16 flags; /* flags for mapping */ struct block_device *bdev; /* block device for I/O */ }; -- 2.1.4 From BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 21 16:51:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D3F277CA0 for ; Sun, 21 Aug 2016 16:51:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A417E8F8035 for ; Sun, 21 Aug 2016 14:51:21 -0700 (PDT) X-ASG-Debug-ID: 1471816278-0bf57c55b4a6ae0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id zCjqAEcpD861GcGB (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 21 Aug 2016 14:51:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bbaeE-0002TQ-BA for xfs@oss.sgi.com; Sun, 21 Aug 2016 21:51:18 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: move xfs_bmbt_to_iomap up Date: Sun, 21 Aug 2016 23:51:10 +0200 X-ASG-Orig-Subj: [PATCH 1/4] xfs: move xfs_bmbt_to_iomap up Message-Id: <1471816273-28940-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471816273-28940-1-git-send-email-hch@lst.de> References: <1471816273-28940-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471816279 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2312 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 We'll need it earlier in the file soon, so the unchanged function to the top of xfs_iomap.c Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 2af0dda..ba3592f 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -44,6 +44,32 @@ << mp->m_writeio_log) #define XFS_WRITE_IMAPS XFS_BMAP_MAX_NMAP +void +xfs_bmbt_to_iomap( + struct xfs_inode *ip, + struct iomap *iomap, + struct xfs_bmbt_irec *imap) +{ + struct xfs_mount *mp = ip->i_mount; + + if (imap->br_startblock == HOLESTARTBLOCK) { + iomap->blkno = IOMAP_NULL_BLOCK; + iomap->type = IOMAP_HOLE; + } else if (imap->br_startblock == DELAYSTARTBLOCK) { + iomap->blkno = IOMAP_NULL_BLOCK; + iomap->type = IOMAP_DELALLOC; + } else { + iomap->blkno = xfs_fsb_to_db(ip, imap->br_startblock); + if (imap->br_state == XFS_EXT_UNWRITTEN) + iomap->type = IOMAP_UNWRITTEN; + else + iomap->type = IOMAP_MAPPED; + } + iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); + iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); + iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip)); +} + STATIC int xfs_iomap_eof_align_last_fsb( xfs_mount_t *mp, @@ -947,32 +973,6 @@ error_on_bmapi_transaction: return error; } -void -xfs_bmbt_to_iomap( - struct xfs_inode *ip, - struct iomap *iomap, - struct xfs_bmbt_irec *imap) -{ - struct xfs_mount *mp = ip->i_mount; - - if (imap->br_startblock == HOLESTARTBLOCK) { - iomap->blkno = IOMAP_NULL_BLOCK; - iomap->type = IOMAP_HOLE; - } else if (imap->br_startblock == DELAYSTARTBLOCK) { - iomap->blkno = IOMAP_NULL_BLOCK; - iomap->type = IOMAP_DELALLOC; - } else { - iomap->blkno = xfs_fsb_to_db(ip, imap->br_startblock); - if (imap->br_state == XFS_EXT_UNWRITTEN) - iomap->type = IOMAP_UNWRITTEN; - else - iomap->type = IOMAP_MAPPED; - } - iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); - iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); - iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip)); -} - static inline bool imap_needs_alloc(struct xfs_bmbt_irec *imap, int nimaps) { return !nimaps || -- 2.1.4 From BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 21 16:51:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1A3D57CA0 for ; Sun, 21 Aug 2016 16:51:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 82468AC003 for ; Sun, 21 Aug 2016 14:51:19 -0700 (PDT) X-ASG-Debug-ID: 1471816276-0bf57c55b1a6ad0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id AX0rdISHwpLRF8D2 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 21 Aug 2016 14:51:17 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bbaeB-0002TF-Lw for xfs@oss.sgi.com; Sun, 21 Aug 2016 21:51:16 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: iomap write fixes Date: Sun, 21 Aug 2016 23:51:09 +0200 X-ASG-Orig-Subj: iomap write fixes Message-Id: <1471816273-28940-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471816277 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 659 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 These have already been discussed in a lkml thread for a while, so I wanted to formally send them out. The problem was that as part of a AIM7 regression we saw that we spend a lot of time looking up extent records. I turns out that the current delayed write path is horribly inefficient, and we can generall do with a single btree lookup for the write path. Also xfs_inode_set_eofblocks_tag turns out to trash the cache quite bad, so add a trivial flag to avoid it if we can. Compared to the git tree under discussion only one changelog has been updated, and I've added a copyright statement to xfs_iomap.c now that it has a lot of my code. From BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 21 16:51:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 071377CAF for ; Sun, 21 Aug 2016 16:51:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66B14AC001 for ; Sun, 21 Aug 2016 14:51:26 -0700 (PDT) X-ASG-Debug-ID: 1471816283-0bf57c55b3a6ae0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id sa9GO2JuQYhbgXLh (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 21 Aug 2016 14:51:24 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bbaeJ-0002Tb-AP for xfs@oss.sgi.com; Sun, 21 Aug 2016 21:51:23 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case Date: Sun, 21 Aug 2016 23:51:12 +0200 X-ASG-Orig-Subj: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case Message-Id: <1471816273-28940-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471816273-28940-1-git-send-email-hch@lst.de> References: <1471816273-28940-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471816284 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2021 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 For long growing file writes we will usually already have the eofblocks tag set when adding more speculative preallocations. Add a flag in the inode to allow us to skip the the fairly expensive AG-wide spinlocks and multiple radix tree operations in that case. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_icache.c | 14 ++++++++++++++ fs/xfs/xfs_inode.h | 1 + 2 files changed, 15 insertions(+) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index fb39a66..65b2e3f 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -1414,6 +1414,16 @@ xfs_inode_set_eofblocks_tag( struct xfs_perag *pag; int tagged; + /* + * Don't bother locking the AG and looking up in the radix trees + * if we already know that we have the tag set. + */ + if (ip->i_flags & XFS_IEOFBLOCKS) + return; + spin_lock(&ip->i_flags_lock); + ip->i_flags |= XFS_IEOFBLOCKS; + spin_unlock(&ip->i_flags_lock); + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); spin_lock(&pag->pag_ici_lock); trace_xfs_inode_set_eofblocks_tag(ip); @@ -1449,6 +1459,10 @@ xfs_inode_clear_eofblocks_tag( struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; + spin_lock(&ip->i_flags_lock); + ip->i_flags &= ~XFS_IEOFBLOCKS; + spin_unlock(&ip->i_flags_lock); + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); spin_lock(&pag->pag_ici_lock); trace_xfs_inode_clear_eofblocks_tag(ip); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index e1a411e..8f30d25 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -216,6 +216,7 @@ xfs_get_initial_prid(struct xfs_inode *dp) #define __XFS_IPINNED_BIT 8 /* wakeup key for zero pin count */ #define XFS_IPINNED (1 << __XFS_IPINNED_BIT) #define XFS_IDONTCACHE (1 << 9) /* don't cache the inode long term */ +#define XFS_IEOFBLOCKS (1 << 10)/* has the preallocblocks tag set */ /* * Per-lifetime flags need to be reset when re-using a reclaimable inode during -- 2.1.4 From BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 21 16:51:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 744727CB0 for ; Sun, 21 Aug 2016 16:51:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45A7C304032 for ; Sun, 21 Aug 2016 14:51:24 -0700 (PDT) X-ASG-Debug-ID: 1471816281-0bf57b5312cfbd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CiG27IdlcIw9LbBV (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 21 Aug 2016 14:51:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bbaeG-0002TV-Pz for xfs@oss.sgi.com; Sun, 21 Aug 2016 21:51:21 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: factor our a helper to calculate the EOF alignment Date: Sun, 21 Aug 2016 23:51:11 +0200 X-ASG-Orig-Subj: [PATCH 2/4] xfs: factor our a helper to calculate the EOF alignment Message-Id: <1471816273-28940-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471816273-28940-1-git-send-email-hch@lst.de> References: <1471816273-28940-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471816282 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1951 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 And drop the pointless mp argument to xfs_iomap_eof_align_last_fsb, while we're at it. Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index ba3592f..918511a 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -70,15 +70,13 @@ xfs_bmbt_to_iomap( iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip)); } -STATIC int -xfs_iomap_eof_align_last_fsb( - xfs_mount_t *mp, - xfs_inode_t *ip, - xfs_extlen_t extsize, - xfs_fileoff_t *last_fsb) +static xfs_extlen_t +xfs_eof_alignment( + struct xfs_inode *ip, + xfs_extlen_t extsize) { - xfs_extlen_t align = 0; - int eof, error; + struct xfs_mount *mp = ip->i_mount; + xfs_extlen_t align = 0; if (!XFS_IS_REALTIME_INODE(ip)) { /* @@ -109,8 +107,21 @@ xfs_iomap_eof_align_last_fsb( align = extsize; } + return align; +} + +STATIC int +xfs_iomap_eof_align_last_fsb( + struct xfs_inode *ip, + xfs_extlen_t extsize, + xfs_fileoff_t *last_fsb) +{ + xfs_extlen_t align = xfs_eof_alignment(ip, extsize); + if (align) { xfs_fileoff_t new_last_fsb = roundup_64(*last_fsb, align); + int eof, error; + error = xfs_bmap_eof(ip, new_last_fsb, XFS_DATA_FORK, &eof); if (error) return error; @@ -180,7 +191,7 @@ xfs_iomap_write_direct( */ ASSERT(XFS_IFORK_PTR(ip, XFS_DATA_FORK)->if_flags & XFS_IFEXTENTS); - error = xfs_iomap_eof_align_last_fsb(mp, ip, extsz, &last_fsb); + error = xfs_iomap_eof_align_last_fsb(ip, extsz, &last_fsb); if (error) goto out_unlock; } else { @@ -638,7 +649,7 @@ retry: } if (prealloc || extsz) { - error = xfs_iomap_eof_align_last_fsb(mp, ip, extsz, &last_fsb); + error = xfs_iomap_eof_align_last_fsb(ip, extsz, &last_fsb); if (error) return error; } -- 2.1.4 From BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org Sun Aug 21 16:51:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2D41C7CA0 for ; Sun, 21 Aug 2016 16:51:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C5331304032 for ; Sun, 21 Aug 2016 14:51:29 -0700 (PDT) X-ASG-Debug-ID: 1471816286-0bf81509b0a87b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id LafEcu8ggDRaAQlm (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sun, 21 Aug 2016 14:51:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e8746478a7d5f55f812c+4746+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from [83.175.99.196] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bbaeL-0002Tf-P1 for xfs@oss.sgi.com; Sun, 21 Aug 2016 21:51:26 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path Date: Sun, 21 Aug 2016 23:51:13 +0200 X-ASG-Orig-Subj: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path Message-Id: <1471816273-28940-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1471816273-28940-1-git-send-email-hch@lst.de> References: <1471816273-28940-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471816286 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 21780 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Currently xfs_iomap_write_delay does up to lookups in the inode extent tree, which is rather costly especially with the new iomap based write path and small write sizes. But it turns out that the low-level xfs_bmap_search_extents gives us all the information we need in the regular delalloc buffered write path: - it will return us an extent covering the block we are looking up if it exists. In that case we can simply return that extent to the caller and are done - it will tell us if we are beyoned the last current allocated block with an eof return parameter. In that case we can create a delalloc reservation and use the also returned information about the last extent in the file as the hint to size our delalloc reservation. - it can tell us that we are writing into a hole, but that there is an extent beyoned this hole. In this case we can create a delalloc reservation that covers the requested size (possible capped to the next existing allocation). All that can be done in one single routine instead of bouncing up and down a few layers. This reduced the CPU overhead of the block mapping routines and also simplified the code a lot. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_bmap.c | 89 +---------- fs/xfs/libxfs/xfs_bmap.h | 10 +- fs/xfs/xfs_iomap.c | 381 ++++++++++++++++++++--------------------------- fs/xfs/xfs_iomap.h | 2 - 4 files changed, 169 insertions(+), 313 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index b060bca..614803b 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -1388,7 +1388,7 @@ xfs_bmap_search_multi_extents( * Else, *lastxp will be set to the index of the found * entry; *gotp will contain the entry. */ -STATIC xfs_bmbt_rec_host_t * /* pointer to found extent entry */ +xfs_bmbt_rec_host_t * /* pointer to found extent entry */ xfs_bmap_search_extents( xfs_inode_t *ip, /* incore inode pointer */ xfs_fileoff_t bno, /* block number searched for */ @@ -4074,7 +4074,7 @@ xfs_bmapi_read( return 0; } -STATIC int +int xfs_bmapi_reserve_delalloc( struct xfs_inode *ip, xfs_fileoff_t aoff, @@ -4170,91 +4170,6 @@ out_unreserve_quota: return error; } -/* - * Map file blocks to filesystem blocks, adding delayed allocations as needed. - */ -int -xfs_bmapi_delay( - struct xfs_inode *ip, /* incore inode */ - xfs_fileoff_t bno, /* starting file offs. mapped */ - xfs_filblks_t len, /* length to map in file */ - struct xfs_bmbt_irec *mval, /* output: map values */ - int *nmap, /* i/o: mval size/count */ - int flags) /* XFS_BMAPI_... */ -{ - struct xfs_mount *mp = ip->i_mount; - struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); - struct xfs_bmbt_irec got; /* current file extent record */ - struct xfs_bmbt_irec prev; /* previous file extent record */ - xfs_fileoff_t obno; /* old block number (offset) */ - xfs_fileoff_t end; /* end of mapped file region */ - xfs_extnum_t lastx; /* last useful extent number */ - int eof; /* we've hit the end of extents */ - int n = 0; /* current extent index */ - int error = 0; - - ASSERT(*nmap >= 1); - ASSERT(*nmap <= XFS_BMAP_MAX_NMAP); - ASSERT(!(flags & ~XFS_BMAPI_ENTIRE)); - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - - if (unlikely(XFS_TEST_ERROR( - (XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_BTREE), - mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { - XFS_ERROR_REPORT("xfs_bmapi_delay", XFS_ERRLEVEL_LOW, mp); - return -EFSCORRUPTED; - } - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - XFS_STATS_INC(mp, xs_blk_mapw); - - if (!(ifp->if_flags & XFS_IFEXTENTS)) { - error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK); - if (error) - return error; - } - - xfs_bmap_search_extents(ip, bno, XFS_DATA_FORK, &eof, &lastx, &got, &prev); - end = bno + len; - obno = bno; - - while (bno < end && n < *nmap) { - if (eof || got.br_startoff > bno) { - error = xfs_bmapi_reserve_delalloc(ip, bno, len, &got, - &prev, &lastx, eof); - if (error) { - if (n == 0) { - *nmap = 0; - return error; - } - break; - } - } - - /* set up the extent map to return. */ - xfs_bmapi_trim_map(mval, &got, &bno, len, obno, end, n, flags); - xfs_bmapi_update_map(&mval, &bno, &len, obno, end, &n, flags); - - /* If we're done, stop now. */ - if (bno >= end || n >= *nmap) - break; - - /* Else go on to the next record. */ - prev = got; - if (++lastx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, lastx), &got); - else - eof = 1; - } - - *nmap = n; - return 0; -} - - static int xfs_bmapi_allocate( struct xfs_bmalloca *bma) diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 254034f..d660069 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -181,9 +181,6 @@ int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip, int xfs_bmapi_read(struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, struct xfs_bmbt_irec *mval, int *nmap, int flags); -int xfs_bmapi_delay(struct xfs_inode *ip, xfs_fileoff_t bno, - xfs_filblks_t len, struct xfs_bmbt_irec *mval, - int *nmap, int flags); int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, int flags, xfs_fsblock_t *firstblock, xfs_extlen_t total, @@ -202,5 +199,12 @@ int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, struct xfs_defer_ops *dfops, enum shift_direction direction, int num_exts); int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset); +struct xfs_bmbt_rec_host * + xfs_bmap_search_extents(struct xfs_inode *ip, xfs_fileoff_t bno, + int fork, int *eofp, xfs_extnum_t *lastxp, + struct xfs_bmbt_irec *gotp, struct xfs_bmbt_irec *prevp); +int xfs_bmapi_reserve_delalloc(struct xfs_inode *ip, xfs_fileoff_t aoff, + xfs_filblks_t len, struct xfs_bmbt_irec *got, + struct xfs_bmbt_irec *prev, xfs_extnum_t *lastx, int eof); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 918511a..2b449f5 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2016 Christoph Hellwig. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -42,7 +43,6 @@ #define XFS_WRITEIO_ALIGN(mp,off) (((off) >> mp->m_writeio_log) \ << mp->m_writeio_log) -#define XFS_WRITE_IMAPS XFS_BMAP_MAX_NMAP void xfs_bmbt_to_iomap( @@ -311,130 +311,6 @@ out_trans_cancel: goto out_unlock; } -/* - * If the caller is doing a write at the end of the file, then extend the - * allocation out to the file system's write iosize. We clean up any extra - * space left over when the file is closed in xfs_inactive(). - * - * If we find we already have delalloc preallocation beyond EOF, don't do more - * preallocation as it it not needed. - */ -STATIC int -xfs_iomap_eof_want_preallocate( - xfs_mount_t *mp, - xfs_inode_t *ip, - xfs_off_t offset, - size_t count, - xfs_bmbt_irec_t *imap, - int nimaps, - int *prealloc) -{ - xfs_fileoff_t start_fsb; - xfs_filblks_t count_fsb; - int n, error, imaps; - int found_delalloc = 0; - - *prealloc = 0; - if (offset + count <= XFS_ISIZE(ip)) - return 0; - - /* - * If the file is smaller than the minimum prealloc and we are using - * dynamic preallocation, don't do any preallocation at all as it is - * likely this is the only write to the file that is going to be done. - */ - if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) && - XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_writeio_blocks)) - return 0; - - /* - * If there are any real blocks past eof, then don't - * do any speculative allocation. - */ - start_fsb = XFS_B_TO_FSBT(mp, ((xfs_ufsize_t)(offset + count - 1))); - count_fsb = XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes); - while (count_fsb > 0) { - imaps = nimaps; - error = xfs_bmapi_read(ip, start_fsb, count_fsb, imap, &imaps, - 0); - if (error) - return error; - for (n = 0; n < imaps; n++) { - if ((imap[n].br_startblock != HOLESTARTBLOCK) && - (imap[n].br_startblock != DELAYSTARTBLOCK)) - return 0; - start_fsb += imap[n].br_blockcount; - count_fsb -= imap[n].br_blockcount; - - if (imap[n].br_startblock == DELAYSTARTBLOCK) - found_delalloc = 1; - } - } - if (!found_delalloc) - *prealloc = 1; - return 0; -} - -/* - * Determine the initial size of the preallocation. We are beyond the current - * EOF here, but we need to take into account whether this is a sparse write or - * an extending write when determining the preallocation size. Hence we need to - * look up the extent that ends at the current write offset and use the result - * to determine the preallocation size. - * - * If the extent is a hole, then preallocation is essentially disabled. - * Otherwise we take the size of the preceeding data extent as the basis for the - * preallocation size. If the size of the extent is greater than half the - * maximum extent length, then use the current offset as the basis. This ensures - * that for large files the preallocation size always extends to MAXEXTLEN - * rather than falling short due to things like stripe unit/width alignment of - * real extents. - */ -STATIC xfs_fsblock_t -xfs_iomap_eof_prealloc_initial_size( - struct xfs_mount *mp, - struct xfs_inode *ip, - xfs_off_t offset, - xfs_bmbt_irec_t *imap, - int nimaps) -{ - xfs_fileoff_t start_fsb; - int imaps = 1; - int error; - - ASSERT(nimaps >= imaps); - - /* if we are using a specific prealloc size, return now */ - if (mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) - return 0; - - /* If the file is small, then use the minimum prealloc */ - if (XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_dalign)) - return 0; - - /* - * As we write multiple pages, the offset will always align to the - * start of a page and hence point to a hole at EOF. i.e. if the size is - * 4096 bytes, we only have one block at FSB 0, but XFS_B_TO_FSB(4096) - * will return FSB 1. Hence if there are blocks in the file, we want to - * point to the block prior to the EOF block and not the hole that maps - * directly at @offset. - */ - start_fsb = XFS_B_TO_FSB(mp, offset); - if (start_fsb) - start_fsb--; - error = xfs_bmapi_read(ip, start_fsb, 1, imap, &imaps, XFS_BMAPI_ENTIRE); - if (error) - return 0; - - ASSERT(imaps == 1); - if (imap[0].br_startblock == HOLESTARTBLOCK) - return 0; - if (imap[0].br_blockcount <= (MAXEXTLEN >> 1)) - return imap[0].br_blockcount << 1; - return XFS_B_TO_FSB(mp, offset); -} - STATIC bool xfs_quota_need_throttle( struct xfs_inode *ip, @@ -503,20 +379,37 @@ xfs_quota_calc_throttle( */ STATIC xfs_fsblock_t xfs_iomap_prealloc_size( - struct xfs_mount *mp, struct xfs_inode *ip, xfs_off_t offset, - struct xfs_bmbt_irec *imap, - int nimaps) + struct xfs_bmbt_irec *prev) { - xfs_fsblock_t alloc_blocks = 0; + struct xfs_mount *mp = ip->i_mount; int shift = 0; int64_t freesp; xfs_fsblock_t qblocks; int qshift = 0; + xfs_fsblock_t alloc_blocks = 0; - alloc_blocks = xfs_iomap_eof_prealloc_initial_size(mp, ip, offset, - imap, nimaps); + /* + * Determine the initial size of the preallocation. We are beyond the + * current EOF here, but we need to take into account whether this is + * a sparse write or an extending write when determining the + * preallocation size. Hence we need to look up the extent that ends + * at the current write offset and use the result to determine the + * preallocation size. + * + * If the extent is a hole, then preallocation is essentially disabled. + * Otherwise we take the size of the preceding data extent as the basis + * for the preallocation size. If the size of the extent is greater than + * half the maximum extent length, then use the current offset as the + * basis. This ensures that for large files the preallocation size + * always extends to MAXEXTLEN rather than falling short due to things + * like stripe unit/width alignment of real extents. + */ + if (prev->br_blockcount <= (MAXEXTLEN >> 1)) + alloc_blocks = prev->br_blockcount << 1; + else + alloc_blocks = XFS_B_TO_FSB(mp, offset); if (!alloc_blocks) goto check_writeio; qblocks = alloc_blocks; @@ -587,120 +480,167 @@ xfs_iomap_prealloc_size( */ while (alloc_blocks && alloc_blocks >= freesp) alloc_blocks >>= 4; - check_writeio: if (alloc_blocks < mp->m_writeio_blocks) alloc_blocks = mp->m_writeio_blocks; - trace_xfs_iomap_prealloc_size(ip, alloc_blocks, shift, mp->m_writeio_blocks); - return alloc_blocks; } -int -xfs_iomap_write_delay( - xfs_inode_t *ip, - xfs_off_t offset, - size_t count, - xfs_bmbt_irec_t *ret_imap) +static int +xfs_file_iomap_begin_delay( + struct inode *inode, + loff_t offset, + loff_t count, + unsigned flags, + struct iomap *iomap) { - xfs_mount_t *mp = ip->i_mount; - xfs_fileoff_t offset_fsb; - xfs_fileoff_t last_fsb; - xfs_off_t aligned_offset; - xfs_fileoff_t ioalign; - xfs_extlen_t extsz; - int nimaps; - xfs_bmbt_irec_t imap[XFS_WRITE_IMAPS]; - int prealloc; - int error; - - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - - /* - * Make sure that the dquots are there. This doesn't hold - * the ilock across a disk read. - */ - error = xfs_qm_dqattach_locked(ip, 0); - if (error) - return error; + struct xfs_inode *ip = XFS_I(inode); + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); + xfs_fileoff_t maxbytes_fsb = + XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes); + xfs_fileoff_t end_fsb, orig_end_fsb; + int error = 0, eof = 0; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec prev; + xfs_extnum_t idx; - extsz = xfs_get_extsz_hint(ip); - offset_fsb = XFS_B_TO_FSBT(mp, offset); + ASSERT(!XFS_IS_REALTIME_INODE(ip)); + ASSERT(!xfs_get_extsz_hint(ip)); - error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count, - imap, XFS_WRITE_IMAPS, &prealloc); - if (error) - return error; + xfs_ilock(ip, XFS_ILOCK_EXCL); -retry: - if (prealloc) { - xfs_fsblock_t alloc_blocks; + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp); + error = -EFSCORRUPTED; + goto out_unlock; + } - alloc_blocks = xfs_iomap_prealloc_size(mp, ip, offset, imap, - XFS_WRITE_IMAPS); + XFS_STATS_INC(mp, xs_blk_mapw); - aligned_offset = XFS_WRITEIO_ALIGN(mp, (offset + count - 1)); - ioalign = XFS_B_TO_FSBT(mp, aligned_offset); - last_fsb = ioalign + alloc_blocks; - } else { - last_fsb = XFS_B_TO_FSB(mp, ((xfs_ufsize_t)(offset + count))); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK); + if (error) + goto out_unlock; } - if (prealloc || extsz) { - error = xfs_iomap_eof_align_last_fsb(ip, extsz, &last_fsb); - if (error) - return error; + xfs_bmap_search_extents(ip, offset_fsb, XFS_DATA_FORK, &eof, &idx, + &got, &prev); + if (!eof && got.br_startoff <= offset_fsb) { + trace_xfs_iomap_found(ip, offset, count, 0, &got); + goto done; } + error = xfs_qm_dqattach_locked(ip, 0); + if (error) + goto out_unlock; + /* - * Make sure preallocation does not create extents beyond the range we - * actually support in this filesystem. + * We cap the maximum length we map here to MAX_WRITEBACK_PAGES pages + * to keep the chunks of work done where somewhat symmetric with the + * work writeback does. This is a completely arbitrary number pulled + * out of thin air as a best guess for initial testing. + * + * Note that the values needs to be less than 32-bits wide until + * the lower level functions are updated. */ - if (last_fsb > XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes)) - last_fsb = XFS_B_TO_FSB(mp, mp->m_super->s_maxbytes); + count = min_t(loff_t, count, 1024 * PAGE_SIZE); + end_fsb = orig_end_fsb = + min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); + + /* + * If we are doing a write at the end of the file and there are no + * allocations past this one, then extend the allocation out to the + * file system's write iosize. + * + * As an exception we don't do any preallocation at all if the file + * is smaller than the minimum preallocation and we are using the + * default dynamic preallocation scheme, as it is likely this is the + * only write to the file that is going to be done. + * + * We clean up any extra space left over when the file is closed in + * xfs_inactive(). + */ + if (eof && offset + count > XFS_ISIZE(ip) && + ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || + XFS_ISIZE(ip) >= XFS_FSB_TO_B(mp, mp->m_writeio_blocks))) { + xfs_fsblock_t alloc_blocks; + xfs_off_t aligned_offset; + xfs_extlen_t align; + + /* + * If an explicit allocsize is set, the file is small, or we + * are writing behind a hole, then use the minimum prealloc: + */ + if ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || + XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_dalign) || + idx == 0 || + prev.br_startoff + prev.br_blockcount < offset_fsb) + alloc_blocks = mp->m_writeio_blocks; + else + alloc_blocks = + xfs_iomap_prealloc_size(ip, offset, &prev); + + aligned_offset = XFS_WRITEIO_ALIGN(mp, offset + count - 1); + end_fsb = XFS_B_TO_FSBT(mp, aligned_offset) + alloc_blocks; + + align = xfs_eof_alignment(ip, 0); + if (align) + end_fsb = roundup_64(end_fsb, align); - ASSERT(last_fsb > offset_fsb); + end_fsb = min(end_fsb, maxbytes_fsb); + ASSERT(end_fsb > offset_fsb); + } - nimaps = XFS_WRITE_IMAPS; - error = xfs_bmapi_delay(ip, offset_fsb, last_fsb - offset_fsb, - imap, &nimaps, XFS_BMAPI_ENTIRE); +retry: + error = xfs_bmapi_reserve_delalloc(ip, offset_fsb, + end_fsb - offset_fsb, &got, + &prev, &idx, eof); switch (error) { case 0: + break; case -ENOSPC: case -EDQUOT: - break; - default: - return error; - } - - /* - * If bmapi returned us nothing, we got either ENOSPC or EDQUOT. Retry - * without EOF preallocation. - */ - if (nimaps == 0) { + /* retry without any preallocation */ trace_xfs_delalloc_enospc(ip, offset, count); - if (prealloc) { - prealloc = 0; - error = 0; + if (end_fsb != orig_end_fsb) { + end_fsb = orig_end_fsb; goto retry; } - return error ? error : -ENOSPC; + /*FALLTHRU*/ + default: + goto out_unlock; } - if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) - return xfs_alert_fsblock_zero(ip, &imap[0]); - /* * Tag the inode as speculatively preallocated so we can reclaim this * space on demand, if necessary. */ - if (prealloc) + if (end_fsb != orig_end_fsb) xfs_inode_set_eofblocks_tag(ip); - *ret_imap = imap[0]; - return 0; + trace_xfs_iomap_alloc(ip, offset, count, 0, &got); +done: + if (isnullstartblock(got.br_startblock)) + got.br_startblock = DELAYSTARTBLOCK; + + if (!got.br_startblock) { + error = xfs_alert_fsblock_zero(ip, &got); + if (error) + goto out_unlock; + } + + xfs_bmbt_to_iomap(ip, iomap, &got); + +out_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; } /* @@ -1008,6 +948,11 @@ xfs_file_iomap_begin( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; + if ((flags & IOMAP_WRITE) && !xfs_get_extsz_hint(ip)) { + return xfs_file_iomap_begin_delay(inode, offset, length, flags, + iomap); + } + xfs_ilock(ip, XFS_ILOCK_EXCL); ASSERT(offset <= mp->m_super->s_maxbytes); @@ -1035,19 +980,13 @@ xfs_file_iomap_begin( * the lower level functions are updated. */ length = min_t(loff_t, length, 1024 * PAGE_SIZE); - if (xfs_get_extsz_hint(ip)) { - /* - * xfs_iomap_write_direct() expects the shared lock. It - * is unlocked on return. - */ - xfs_ilock_demote(ip, XFS_ILOCK_EXCL); - error = xfs_iomap_write_direct(ip, offset, length, &imap, - nimaps); - } else { - error = xfs_iomap_write_delay(ip, offset, length, &imap); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - } - + /* + * xfs_iomap_write_direct() expects the shared lock. It + * is unlocked on return. + */ + xfs_ilock_demote(ip, XFS_ILOCK_EXCL); + error = xfs_iomap_write_direct(ip, offset, length, &imap, + nimaps); if (error) return error; diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index fb8aca3..6498be4 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -25,8 +25,6 @@ struct xfs_bmbt_irec; int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, struct xfs_bmbt_irec *, int); -int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, - struct xfs_bmbt_irec *); int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, struct xfs_bmbt_irec *); int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); -- 2.1.4 From david@fromorbit.com Sun Aug 21 19:38:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0AA707CA0 for ; Sun, 21 Aug 2016 19:38:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B3D5C8F8033 for ; Sun, 21 Aug 2016 17:38:05 -0700 (PDT) X-ASG-Debug-ID: 1471826282-0bf8155c77b3430001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id WHddRiHW5rGUrG6F for ; Sun, 21 Aug 2016 17:38:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ai4XAI9Iuld5LDUCEGdsb2JhbABeg0SBUoJ5g3mbawaMcIYUhAyGFwQCAoEuTQIBAQEBAQIGAQEBAQEBAQE3QIReAQEEAScLASMjBQsIAxgJJQ8FJQMHGhOIKQe8XwEBAQcCJR6FRYUVihsFmUiPFY9aSIt3g3iCZhyBXio0hnsBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 10:08:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbdFY-0000RO-MF; Mon, 22 Aug 2016 10:38:00 +1000 Date: Mon, 22 Aug 2016 10:38:00 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH V5] xfs_db: add crc manipulation commands Message-ID: <20160822003800.GN19025@dastard> X-ASG-Orig-Subj: Re: [PATCH V5] xfs_db: add crc manipulation commands References: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> <0bb88897-3dfc-de4e-05fb-b737221f0d80@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <0bb88897-3dfc-de4e-05fb-b737221f0d80@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471826282 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2218 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Aug 14, 2016 at 07:30:51PM -0500, Eric Sandeen wrote: > This adds a new "crc" command to xfs_db for CRC-enabled filesystems. .... > diff --git a/db/io.c b/db/io.c > index 91cab12..240b129 100644 > --- a/db/io.c > +++ b/db/io.c > @@ -27,6 +27,7 @@ > #include "output.h" > #include "init.h" > #include "malloc.h" > +#include "crc.h" > > static int pop_f(int argc, char **argv); > static void pop_help(void); > @@ -473,12 +474,15 @@ xfs_verify_recalc_crc( > void > write_cur(void) > { > + int skip_crc = (iocur_top->bp->b_ops->verify_write == xfs_dummy_verify); > + > if (iocur_sp < 0) { > dbprintf(_("nothing to write\n")); > return; > } > > - if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf) { > + if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf && > + !skip_crc) { > libxfs_dinode_calc_crc(mp, iocur_top->data); > iocur_top->ino_crc_ok = 1; > } > @@ -489,6 +493,19 @@ write_cur(void) > write_cur_bbs(); > else > write_cur_buf(); > + > + /* If we didn't write the crc automatically, re-check validity */ > + if (iocur_top->ino_buf && skip_crc) { > + xfs_dinode_t *dip; > + xfs_ino_t ino; > + > + dip = iocur_top->data; > + ino = iocur_top->ino; > + iocur_top->ino_crc_ok = xfs_verify_cksum((char *)dip, > + mp->m_sb.sb_inodesize, > + XFS_DINODE_CRC_OFF); > + } > + io.c: In function ¿write_cur¿: io.c:500:13: warning: variable ¿ino¿ set but not used [-Wunused-but-set-variable] xfs_ino_t ino; I've just removed the unused xfs_ino_t here, because it doesn't seem to have any purpose here. > diff --git a/db/write.h b/db/write.h > index 31e2665..664ddcc 100644 > --- a/db/write.h > +++ b/db/write.h > @@ -20,5 +20,5 @@ struct field; > > extern void write_init(void); > extern void write_block(const field_t *fields, int argc, char **argv); > -extern void write_string(const field_t *fields, int argc, char **argv); > extern void write_struct(const field_t *fields, int argc, char **argv); > +extern void write_string(const field_t *fields, int argc, char **argv); Stray hunk? (removed) Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Sun Aug 21 19:45:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A209B7CA0 for ; Sun, 21 Aug 2016 19:45:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6437D8F8033 for ; Sun, 21 Aug 2016 17:45:20 -0700 (PDT) X-ASG-Debug-ID: 1471826717-0bf8155c77b3d90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id IgizKxnZdvUWCZei for ; Sun, 21 Aug 2016 17:45:17 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 207B333FE; Sun, 21 Aug 2016 19:45:17 -0500 (CDT) Subject: Re: [PATCH V5] xfs_db: add crc manipulation commands To: Dave Chinner X-ASG-Orig-Subj: Re: [PATCH V5] xfs_db: add crc manipulation commands References: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> <0bb88897-3dfc-de4e-05fb-b737221f0d80@sandeen.net> <20160822003800.GN19025@dastard> Cc: xfs@oss.sgi.com From: Eric Sandeen Message-ID: <9bee7dc5-f53f-5a86-9972-3a53fb4aac90@sandeen.net> Date: Sun, 21 Aug 2016 19:45:16 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160822003800.GN19025@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471826717 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 386 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 8/21/16 7:38 PM, Dave Chinner wrote: ... > io.c: In function ¿write_cur¿: > io.c:500:13: warning: variable ¿ino¿ set but not used [-Wunused-but-set-variable] > xfs_ino_t ino; > > I've just removed the unused xfs_ino_t here, because it doesn't seem > to have any purpose here. Thanks - yeah I just saw that as well, sorry for missing it the first go-round. -Eric From david@fromorbit.com Sun Aug 21 19:54:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 07F877CA0 for ; Sun, 21 Aug 2016 19:54:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 706DA304032 for ; Sun, 21 Aug 2016 17:54:45 -0700 (PDT) X-ASG-Debug-ID: 1471827282-0bf57b5314d4590001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ip09lgQ7jI3CYZM5 for ; Sun, 21 Aug 2016 17:54:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag0YABBMuld5LDUCEGdsb2JhbABeg0SBUoJ5g3mbawaMcIYUhAyGFwICAQECgS5NAgEBAQEBAgYBAQEBAQEBATdAhF8BBScTHBUOBQsIAxgJJQ8FJQMHGhOIMLxgAQEBBwIBJB6FRYUVihsFmUiPFYF3jWNIhiGFVoN4gmYcgV4qNIU2AiQBAwOBGAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 10:24:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbdVh-0000SR-FI; Mon, 22 Aug 2016 10:54:41 +1000 Date: Mon, 22 Aug 2016 10:54:41 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH V5] xfs_db: add crc manipulation commands Message-ID: <20160822005441.GO19025@dastard> X-ASG-Orig-Subj: Re: [PATCH V5] xfs_db: add crc manipulation commands References: <8cb34b7c-5154-ebb4-7706-1375e94abd74@redhat.com> <0bb88897-3dfc-de4e-05fb-b737221f0d80@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <0bb88897-3dfc-de4e-05fb-b737221f0d80@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471827282 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1825 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32211 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Aug 14, 2016 at 07:30:51PM -0500, Eric Sandeen wrote: > This adds a new "crc" command to xfs_db for CRC-enabled filesystems. > > If a structure has a CRC field, we can validate it, invalidate/corrupt > it, or revalidate/rewrite it: > > xfs_db> sb 0 > xfs_db> crc -v > crc = 0x796c814f (correct) > xfs_db> crc -i > Metadata CRC error detected at block 0x0/0x200 > crc = 0x796c8150 (bad) > xfs_db> crc -r > crc = 0x796c814f (correct) > > (-i and -r require "expert" write-capable mode) > > This requires temporarily replacing the write verifier with > a dummy which won't recalculate the CRC on the way to disk. > > It also required me to write a new flist function, which is > totally foreign to me, so hopefully done right - but it seems > to work here. > > Signed-off-by: Eric Sandeen Actually, this need more help.... > @@ -473,12 +474,15 @@ xfs_verify_recalc_crc( > void > write_cur(void) > { > + int skip_crc = (iocur_top->bp->b_ops->verify_write == xfs_dummy_verify); > + bool, and we can't use the iocur until we've checked if it's valid. i.e. after this first check: > if (iocur_sp < 0) { > dbprintf(_("nothing to write\n")); > return; > } > > - if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf) { > + if (xfs_sb_version_hascrc(&mp->m_sb) && iocur_top->ino_buf && > + !skip_crc) { > libxfs_dinode_calc_crc(mp, iocur_top->data); > iocur_top->ino_crc_ok = 1; > } The line of code below this calculates CRCs for dquot buffers, so it seems kind of broken to be skipping crc update for an inode but not a dquot given they are updated in the same way.... Shouldn't this "skip_crc" condition also be applied to dquot buffers, too? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 21 20:18:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4A9D97CA0 for ; Sun, 21 Aug 2016 20:18:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A0D89AC001 for ; Sun, 21 Aug 2016 18:18:18 -0700 (PDT) X-ASG-Debug-ID: 1471828694-0bf57c55b1a9ef0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id noag6Q1vTzVyuG60 for ; Sun, 21 Aug 2016 18:18:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsUWAOdRuld5LDUCEGdsb2JhbABdg0RWfIJ5n2QGjHCGFIQMJIVzBAICgTBNAgEBAQEBAgYBAQEBAQEBATdAhF8BBTocIxAIAxgJJQ8FJQMHGhOIMA+8UQEBCAIlHoVFhRWCX4c8BZlIhiCIdY9aSIt3g3iEYCo0AYZ6AQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 10:48:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbdsS-0000UY-Um; Mon, 22 Aug 2016 11:18:12 +1000 Date: Mon, 22 Aug 2016 11:18:12 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/3] xfs_quota: changes to accomodate hoisted ioctl defs Message-ID: <20160822011812.GP19025@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/3] xfs_quota: changes to accomodate hoisted ioctl defs References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-3-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471356998-2876-3-git-send-email-billodo@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471828694 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1400 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32211 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 16, 2016 at 09:16:37AM -0500, Bill O'Donnell wrote: > The kernel commit to make the ioctl promotion (334e580a6f) moved > the definitions for the XFS ioctl to uapi/linux/fs.h for the > following reason: > > Hoist the ioctl definitions for the XFS_IOC_FS[SG]SETXATTR API > from fs/xfs/libxfs/xfs_fs.h to include/uapi/linux/fs.h so that > the ioctls can be used by all filesystems, not just XFS. This > enables (initially) ext4 to use the ioctl to set project IDs on > inodes. > > This means we now need to handle this change in userspace as the > uapi/linux/fs.h file may not contain the definitions (i.e. new > xfsprogs/ old linux uapi files) xfsprogs needs to build. Hence we > need to massage the definition in xfs_fs.h to take the values from > the system header if it exists, otherwise keep the old definitions > for compatibility and platforms other than linux.. > > This patch was originally submitted by Dave Chinner > (http://oss.sgi.com/archives/xfs/2016-02/msg00108.html) > > Resubmitting with changes to accomodate upstream changes since > initial submission. This is unnecessary - the "include local version" changes were made to the platform headers (e.g. include/linux.h) in commit 83f4b5a ("xfs_fs.h: XFS_IOC_FS[SG]SETXATTR to FS_IOC_FS[SG]ETXATTR promotion"). Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 21 20:47:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 160947CA0 for ; Sun, 21 Aug 2016 20:47:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CDC068F8033 for ; Sun, 21 Aug 2016 18:47:47 -0700 (PDT) X-ASG-Debug-ID: 1471830463-0bf57b5313d5300001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id kcHkDTjYWbcwYnAF for ; Sun, 21 Aug 2016 18:47:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsUWAPdYuld5LDUCEGdsb2JhbABdg0RWfIJ5n2QGjHCGFIQMJIVzBAICgTBNAgEBAQEBAgYBAQEBAQEBATdAhF8BBTocIxAIAxgJJQ8FJQMHGhOIMA+8WgEBCAIlHoVFhRWCX4FIhXQFmUiGIIh1gXeEXIkHSIYhhVaDeIRgKjQBhTaBRAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 11:17:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbeL0-0000WS-7D; Mon, 22 Aug 2016 11:47:42 +1000 Date: Mon, 22 Aug 2016 11:47:42 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 Message-ID: <20160822014742.GQ19025@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-2-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471356998-2876-2-git-send-email-billodo@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471830463 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1276 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32211 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 16, 2016 at 09:16:36AM -0500, Bill O'Donnell wrote: > This allows xfs_quota to be used on ext4 for project quota testing > in xfstests. > > This patch was originally submitted by Dave Chinner > (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html) > > Resubmitting with the following change: > quota/init.c: correct logic error in loop contained in init_args_command() > function (lines 85-91). What logic error? Commit messages like this really don't tell the reader anything about what is different the original patch. I've had to go archive spelunking to work out what is different, and I'm still not sure what the logic error you fixed is.... And, FWIW, whilst spelunking, I noticed that Eric's last review comments on my original patch: Looks ok, but now with the new option: 1) needs a manpage update 2) usage() should be updated to include -f 3) and I just noticed, _("foreign mount active, %s command is for XFS filesystems only\n"), seems kind of unclear; maybe just _("%s command is for XFS filesystems only\n"), have not been addressed by this update. Can you please add these these changes, update the commit message and resubmit? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 21 21:07:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1C0237CA0 for ; Sun, 21 Aug 2016 21:07:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84D13AC003 for ; Sun, 21 Aug 2016 19:07:30 -0700 (PDT) X-ASG-Debug-ID: 1471831647-0bf57b5311d5730001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id mCEPyBHwKktH5yrd for ; Sun, 21 Aug 2016 19:07:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4YAKpduld5LDUCEGdsb2JhbABdg0SBUoJ5g3mbawaMcIYUhAyGFwICAQECgTBNAgEBAQEBAgYBAQEBAQEBATdAhF4BAQQBJxMcIwULCAMYCSUPBSUDBxoTiCkHvG4BAQgCASQehUWFFYQnhXQFjh+FYoVHjxWPWkiLd4N4hGAqNIU3gUQBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 11:36:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbedW-0000Yd-Hd; Mon, 22 Aug 2016 12:06:50 +1000 Date: Mon, 22 Aug 2016 12:06:50 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 Message-ID: <20160822020650.GR19025@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-4-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471356998-2876-4-git-send-email-billodo@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471831647 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2441 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32211 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 16, 2016 at 09:16:38AM -0500, Bill O'Donnell wrote: > Further changes to allow xfs_quota to be used on foreign filesystem(s) > (e.g. ext4) for project quota testing in xfstests. > > Add CMD_FLAG_GENERIC to enable generic xfs_quota commands (help and > quit) when xfs_quota is run on foreign filesystems. > > Use CMD_FLAG_FOREIGN_OK on commands suitable for foreign filesystems. > > Signed-off-by: Bill O'Donnell > --- > include/command.h | 1 + > libxcmd/help.c | 3 ++- > libxcmd/quit.c | 3 ++- > quota/init.c | 3 ++- > 4 files changed, 7 insertions(+), 3 deletions(-) > > diff --git a/include/command.h b/include/command.h > index 81d5a4d..1c2898a 100644 > --- a/include/command.h > +++ b/include/command.h > @@ -22,6 +22,7 @@ > > #define CMD_FLAG_GLOBAL (1<<31) /* don't iterate "args" */ > #define CMD_FLAG_FOREIGN_OK (1<<30) /* command not restricted to XFS */ > +#define CMD_FLAG_GENERIC (1<<29) /* command is generic (help, quit) */ I don't think this belongs in include/command.h - it's an xfs_quota specific behaviour so I'd put this in quota/init.h: #define CMD_SKIP_CHECK (1<<0) /* command is always run */ > diff --git a/quota/init.c b/quota/init.c > index d5d80c2..85931bf 100644 > --- a/quota/init.c > +++ b/quota/init.c > @@ -104,7 +104,8 @@ init_check_command( > const cmdinfo_t *ct) > { > if (fs_path && > - !(ct->flags & CMD_FLAG_FOREIGN_OK) && > + !((ct->flags & CMD_FLAG_FOREIGN_OK) && foreign_allowed) && > + !(ct->flags & CMD_FLAG_GENERIC) && > (fs_path->fs_flags & FS_FOREIGN)) { This is now sufficiently confusing that it needs to be reworked to make the logic clear and easily commented. i.e. something like this: static int init_check_command( const cmdinfo_t *ct) { if (!fspath) return 1; /* Always run commands that we are told to skip here */ if (ct->flags & CMD_SKIP_CHECK) return 1; /* if it's an XFS filesystem, always run the command */ if (!(fs_path->fs_flags & FS_FOREIGN)) return 1; /* If the user specified foreign filesysetms are ok, run it */ if (foreign_allowed && (ct->flags & CMD_FLAG_FOREIGN_OK)) return 1; /* foreign filesystem and it's no a valid command! */ fprintf(stderr, _("%s command is for XFS filesystems only\n"), ct->name); return 0; } Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 21 22:10:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E1CD7CA0 for ; Sun, 21 Aug 2016 22:10:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4E23304043 for ; Sun, 21 Aug 2016 20:10:01 -0700 (PDT) X-ASG-Debug-ID: 1471835395-0bf8155c74b9c90001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id HfQj4KLZ2zEUMWVk for ; Sun, 21 Aug 2016 20:09:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AigXALtruld5LDUCEGdsb2JhbABdg0SBUoJ5g3mbawaMcIoghhcEAgKBME0CAQEBAQECBgEBAQEBAQEBN0CEXwEFOhwjEAgDGAklDwUlAwcaE4gwvHcBCyUehUWFFYobBZlIiR+Fdo9aSIt3g3iEYCo0hnsBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 12:39:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbfcY-0000dV-07; Mon, 22 Aug 2016 13:09:54 +1000 Date: Mon, 22 Aug 2016 13:09:53 +1000 From: Dave Chinner To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t Message-ID: <20160822030953.GS19025@dastard> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471835395 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 909 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32213 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Aug 13, 2016 at 07:04:18PM +0200, Felix Janda wrote: > This patch series does several things related to large file support. > > Patches 1-3 enable transparent LFS in the build system and make it > mandatory. > > Patches 4-9 and 12 replace *64 function and structure aliases. > > Patches 10 and 11 disable fsr on Mac OS X and do cleanup to enable > Patch 12. Further cleanup of the portability code is possible later. > > Patch 13 makes tranparent LFS also mandatory for all users of libxfs. > > Patch 14 finally replaces off64_t by off_t. Felix, can you check how you are sending these patches? The last two sets of patches you've sent have not threaded in the correct order (they thread in a random order) which means I have to manually reorder the patch set to get it to apply in the correct order via git am.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Sun Aug 21 22:34:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C385C7CA0 for ; Sun, 21 Aug 2016 22:34:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6A5338F8040 for ; Sun, 21 Aug 2016 20:34:42 -0700 (PDT) X-ASG-Debug-ID: 1471836878-0bf8155c77baf10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id o1C3DTEVN7CPTb4f for ; Sun, 21 Aug 2016 20:34:39 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9A099474BA7 for ; Sun, 21 Aug 2016 22:34:38 -0500 (CDT) Subject: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-4-git-send-email-billodo@redhat.com> <20160822020650.GR19025@dastard> From: Eric Sandeen Message-ID: <86d459e4-6853-9f3c-3851-3e212f8c7adf@sandeen.net> Date: Sun, 21 Aug 2016 22:34:38 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <20160822020650.GR19025@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471836879 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2844 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32213 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/16 9:06 PM, Dave Chinner wrote: > On Tue, Aug 16, 2016 at 09:16:38AM -0500, Bill O'Donnell wrote: >> Further changes to allow xfs_quota to be used on foreign filesystem(s) >> (e.g. ext4) for project quota testing in xfstests. >> >> Add CMD_FLAG_GENERIC to enable generic xfs_quota commands (help and >> quit) when xfs_quota is run on foreign filesystems. >> >> Use CMD_FLAG_FOREIGN_OK on commands suitable for foreign filesystems. >> >> Signed-off-by: Bill O'Donnell >> --- >> include/command.h | 1 + >> libxcmd/help.c | 3 ++- >> libxcmd/quit.c | 3 ++- >> quota/init.c | 3 ++- >> 4 files changed, 7 insertions(+), 3 deletions(-) >> >> diff --git a/include/command.h b/include/command.h >> index 81d5a4d..1c2898a 100644 >> --- a/include/command.h >> +++ b/include/command.h >> @@ -22,6 +22,7 @@ >> >> #define CMD_FLAG_GLOBAL (1<<31) /* don't iterate "args" */ >> #define CMD_FLAG_FOREIGN_OK (1<<30) /* command not restricted to XFS */ >> +#define CMD_FLAG_GENERIC (1<<29) /* command is generic (help, quit) */ > > I don't think this belongs in include/command.h - it's an xfs_quota > specific behaviour so I'd put this in quota/init.h: > > #define CMD_SKIP_CHECK (1<<0) /* command is always run */ > >> diff --git a/quota/init.c b/quota/init.c >> index d5d80c2..85931bf 100644 >> --- a/quota/init.c >> +++ b/quota/init.c >> @@ -104,7 +104,8 @@ init_check_command( >> const cmdinfo_t *ct) >> { >> if (fs_path && >> - !(ct->flags & CMD_FLAG_FOREIGN_OK) && >> + !((ct->flags & CMD_FLAG_FOREIGN_OK) && foreign_allowed) && >> + !(ct->flags & CMD_FLAG_GENERIC) && >> (fs_path->fs_flags & FS_FOREIGN)) { > > This is now sufficiently confusing that it needs to be reworked to > make the logic clear and easily commented. i.e. something like this: > > static int > init_check_command( > const cmdinfo_t *ct) > { > if (!fspath) > return 1; > > /* Always run commands that we are told to skip here */ > if (ct->flags & CMD_SKIP_CHECK) > return 1; > > /* if it's an XFS filesystem, always run the command */ > if (!(fs_path->fs_flags & FS_FOREIGN)) > return 1; Sorry for the late review; thanks for getting on it, Dave - but, isn't "foreign ok" exactly == "skip check?" The only check that gets skipped is the foreign check, so just setting FOREIGN_OK seems to accomplish the same thing without more flag complexity, no? Thanks, -Eric > /* If the user specified foreign filesysetms are ok, run it */ > if (foreign_allowed && > (ct->flags & CMD_FLAG_FOREIGN_OK)) > return 1; > > /* foreign filesystem and it's no a valid command! */ > fprintf(stderr, _("%s command is for XFS filesystems only\n"), > ct->name); > return 0; > } > > Cheers, > > Dave. > From sandeen@sandeen.net Sun Aug 21 23:46:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2A5057CA0 for ; Sun, 21 Aug 2016 23:46:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9590DAC001 for ; Sun, 21 Aug 2016 21:46:22 -0700 (PDT) X-ASG-Debug-ID: 1471841175-0bf57c55b1b2970001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id qDzI2iKyevf7NZ54 for ; Sun, 21 Aug 2016 21:46:15 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 45E3B474BA7 for ; Sun, 21 Aug 2016 23:46:15 -0500 (CDT) Subject: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-4-git-send-email-billodo@redhat.com> <20160822020650.GR19025@dastard> <86d459e4-6853-9f3c-3851-3e212f8c7adf@sandeen.net> From: Eric Sandeen Message-ID: <8c1b4044-ff69-f891-a4f4-b302bd3bfef3@sandeen.net> Date: Sun, 21 Aug 2016 23:46:14 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <86d459e4-6853-9f3c-3851-3e212f8c7adf@sandeen.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471841175 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1736 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32215 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/16 10:34 PM, Eric Sandeen wrote: > On 8/21/16 9:06 PM, Dave Chinner wrote: >> On Tue, Aug 16, 2016 at 09:16:38AM -0500, Bill O'Donnell wrote: ... >> static int >> init_check_command( >> const cmdinfo_t *ct) >> { >> if (!fspath) >> return 1; >> >> /* Always run commands that we are told to skip here */ >> if (ct->flags & CMD_SKIP_CHECK) >> return 1; >> >> /* if it's an XFS filesystem, always run the command */ >> if (!(fs_path->fs_flags & FS_FOREIGN)) >> return 1; > > Sorry for the late review; thanks for getting on it, Dave - but, > isn't "foreign ok" exactly == "skip check?" > > The only check that gets skipped is the foreign check, so just > setting FOREIGN_OK seems to accomplish the same thing without > more flag complexity, no? Oh, the subliminal brain reminded me that we want to be able to issue help or quit whether or not we had the "-f" flag, regardless of the filesystem, and that "foreign" isn't ok unless the -f flag is set, so we do need a class of "always works" commands. I guess that was the point of the patch, but I suppose some clarity in comments or commitlog would help slow people like me. ;) Thanks, -Eric > Thanks, > -Eric > > >> /* If the user specified foreign filesysetms are ok, run it */ >> if (foreign_allowed && >> (ct->flags & CMD_FLAG_FOREIGN_OK)) >> return 1; >> >> /* foreign filesystem and it's no a valid command! */ >> fprintf(stderr, _("%s command is for XFS filesystems only\n"), >> ct->name); >> return 0; >> } >> >> Cheers, >> >> Dave. >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From david@fromorbit.com Mon Aug 22 00:35:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8720A7CA0 for ; Mon, 22 Aug 2016 00:35:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 56DE9304043 for ; Sun, 21 Aug 2016 22:35:01 -0700 (PDT) X-ASG-Debug-ID: 1471844098-0bf57c55b2b66c0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id JFtDiKVjfe2OirJq for ; Sun, 21 Aug 2016 22:34:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoMYAOuNuld5LDUCEGdsb2JhbABdg0SBUoZym2YBAQQGjHCGFIQMhhcEAgKBNk0CAQEBAQECBgEBAQEBAQEBN0CEXgEBBAEnExwjBQsIAxgJJQ8FJQMHGhOIKQe9CAEBCAIlHoVFhRWKGwWUAYVHjxWPWkiLd4N4hGAqNIZ7AQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 15:04:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbhsu-0000rH-0y; Mon, 22 Aug 2016 15:34:56 +1000 Date: Mon, 22 Aug 2016 15:34:55 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 Message-ID: <20160822053455.GT19025@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-4-git-send-email-billodo@redhat.com> <20160822020650.GR19025@dastard> <86d459e4-6853-9f3c-3851-3e212f8c7adf@sandeen.net> <8c1b4044-ff69-f891-a4f4-b302bd3bfef3@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8c1b4044-ff69-f891-a4f4-b302bd3bfef3@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471844098 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1568 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32215 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Aug 21, 2016 at 11:46:14PM -0500, Eric Sandeen wrote: > On 8/21/16 10:34 PM, Eric Sandeen wrote: > > On 8/21/16 9:06 PM, Dave Chinner wrote: > >> On Tue, Aug 16, 2016 at 09:16:38AM -0500, Bill O'Donnell wrote: > > ... > > >> static int > >> init_check_command( > >> const cmdinfo_t *ct) > >> { > >> if (!fspath) > >> return 1; > >> > >> /* Always run commands that we are told to skip here */ > >> if (ct->flags & CMD_SKIP_CHECK) > >> return 1; > >> > >> /* if it's an XFS filesystem, always run the command */ > >> if (!(fs_path->fs_flags & FS_FOREIGN)) > >> return 1; > > > > Sorry for the late review; thanks for getting on it, Dave - but, > > isn't "foreign ok" exactly == "skip check?" > > > > The only check that gets skipped is the foreign check, so just > > setting FOREIGN_OK seems to accomplish the same thing without > > more flag complexity, no? > > Oh, the subliminal brain reminded me that we want to be able to > issue help or quit whether or not we had the "-f" flag, regardless > of the filesystem, and that "foreign" isn't ok unless the -f flag > is set, so we do need a class of "always works" commands. Right, but that was something that was done in patch 1/3. I pointed out that no mention of it was made in the cmmit message there.... > I guess that was the point of the patch, but I suppose some clarity > in comments or commitlog would help slow people like me. ;) Right. better explanations needed all round :P Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon Aug 22 00:39:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5C68A7CA2 for ; Mon, 22 Aug 2016 00:39:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 218DD304043 for ; Sun, 21 Aug 2016 22:39:38 -0700 (PDT) X-ASG-Debug-ID: 1471844375-0bf57c55b3b6780001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id tnh0s3G3W7XQIcK3 for ; Sun, 21 Aug 2016 22:39:36 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmIYABOPuld5LDUCEGdsb2JhbABdg0SBUoZym2YBAQQGkwSLYU0CAQEBAQECBgEBAQEBAQEBN0CFDC8jGBhqAwctiDC9OYVjiSV8hQ8FmUiPIY9MApA3ghUBCwGCPio0hTaBRQEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 15:09:35 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1bbhxO-0000ri-4j; Mon, 22 Aug 2016 15:39:34 +1000 Received: from dave by disappointment with local (Exim 4.87) (envelope-from ) id 1bbhxH-0002Wn-Q4; Mon, 22 Aug 2016 15:39:27 +1000 From: Dave Chinner To: linux-xfs@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] xfs: fix superblock inprogress check Date: Mon, 22 Aug 2016 15:39:27 +1000 X-ASG-Orig-Subj: [PATCH] xfs: fix superblock inprogress check Message-Id: <1471844367-9679-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.8.0.rc3 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471844375 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1129 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32215 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header From: Dave Chinner >From inspection, the superblock sb_inprogress check is done in the verifier and triggered only for the primary superblock via a "bp->b_bn == XFS_SB_DADDR" check. Unfortunately, the primary superblock is an uncached buffer, and hence it is configured by xfs_buf_read_uncached() with: bp->b_bn = XFS_BUF_DADDR_NULL; /* always null for uncached buffers */ And so this check never triggers. Fix it. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_sb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 0e3d4f5..4aecc5f 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -583,7 +583,8 @@ xfs_sb_verify( * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. */ - return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR, + return xfs_mount_validate_sb(mp, &sb, + bp->b_maps[0].bm_bn == XFS_SB_DADDR, check_version); } -- 2.8.0.rc3 From Sales.6@mike.com Mon Aug 22 00:52:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3CA097CA0 for ; Mon, 22 Aug 2016 00:52:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 014068F8035 for ; Sun, 21 Aug 2016 22:52:26 -0700 (PDT) X-ASG-Debug-ID: 1471845142-0bf57c55b1b6a70001-NocioJ Received: from mike.com ([114.238.90.209]) by cuda.sgi.com with SMTP id T8BGrZkf1jtoDdIL for ; Sun, 21 Aug 2016 22:52:23 -0700 (PDT) X-Barracuda-Envelope-From: Sales.6@mike.com X-Barracuda-Effective-Source-IP: UNKNOWN[114.238.90.209] X-Barracuda-Apparent-Source-IP: 114.238.90.209 Sender: Sales.6@mike.com Received: from PC-20151225RDFR[127.0.0.1] by PC-20151225RDFR[127.0.0.1] (SMTPD32); Mon, 22 Aug 2016 13:52:36 +0800 From: "simon.lilei@163.com" Subject: winter knitted neck warmer To: xfs@oss.sgi.com X-ASG-Orig-Subj: winter knitted neck warmer MIME-Version: 1.0 Reply-To: simon.lilei@163.com Date: Mon, 22 Aug 2016 13:52:36 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[114.238.90.209] X-Barracuda-Start-Time: 1471845142 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8724 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.94 X-Barracuda-Spam-Status: No, SCORE=0.94 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32215 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.20 BSF_SC0_SA038b Custom Rule SA038b 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160822055226.AB1181940062@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA5LjAwLjgxMTIuMTY3MTciPjwvSEVBRD4NCjxCT0RZPg0KPERJViANCnN0eWxl PSJURVhULVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQQUNJTkc6 IG5vcm1hbDsgRk9OVDogMTRweC8yMXB4IEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmOyBXSElU RS1TUEFDRTogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13 ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6 IDEuNTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IGxhcmdlIj5IZWxsbyANCmZyaWVu ZHMhPC9TUEFOPjwvRElWPg0KPERJViANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgVEVY VC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgRk9OVDogMTRweC8yMXB4IEFy aWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmOyBXSElURS1TUEFDRTogbm9ybWFsOyBDT0xPUjogcmdi KDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBw eCI+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHls ZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48 L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxh bms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1B cmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxhbmsj IiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0K c2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9 ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlk ZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0K PFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+d2UgYXJlIGEgZ2FybWVudHMgZXhwb3J0ZXIgaW4g Q0hJTkEgZm9yIHllYXJzLCANCmxvb2tpbmcgZm9yIGltcG9ydGVycyBpbiB5b3VyIGFyZWE6PC9G T05UPjwvUD4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFO IHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9G T05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0 PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBm YWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpi bGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZP TlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEg aHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZ OiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9E SVY+DQo8UD48Rk9OVCBzaXplPTQgZmFjZT1BcmlhbD53ZSBjYW4gc3VwcGx5OjwvRk9OVD48L1A+ DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0i VklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQ QU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+ PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1Bcmlh bD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0 YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6 ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFi b3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVu Ij48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPFA+ PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+Q29hdHM6IDxGT05UIGZhY2U9QXJpYWw+PEZPTlQgc2l6 ZT00PnRyZW5jaCwgbGFkeSwgDQptZW5zLCBjYXN1YWwsIHdvb2xlbiBjb2F0cy4uLi4uLi4uLi48 L0ZPTlQ+PEZPTlQgc2l6ZT00PiBzaGlydHMsc3VpdHMsIGJsYXplcnMsLCANCi4uLi4uLjwvRk9O VD48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQPjxGT05UIHNpemU9ND5XaW50ZXIga25pdHRlZCBoYXRz ICZhbXA7IG5lY2sgd2FybWVycyZuYnNwOyZhbXA7IGdsb3ZlcyAmYW1wOyANCnNjYXJmICZhbXA7 IHNoYXdsLi4uLi4uLi4uPC9GT05UPjwvUD4NCjxQPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPmph Y2tldHM6IDwvRk9OVD48Rk9OVCBzaXplPTQgZmFjZT1BcmlhbD53YXRlciBwcm9vZiwgDQpzb2Z0 c2hlbGwsIHdpbnRlciwgbGFkeSwgZmxlZWNlLCAsIGRvd24gamFja2V0LCBwYWRkaW5nIGphY2tl dHMuLi48L0ZPTlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxh bms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1B cmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxhbmsj IiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0K c2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48Rk9OVCBzaXpl PTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRh cmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXpl PTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJv dXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4i PjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElW PjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJ TElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9B PjwvRElWPg0KPFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+UGFudHM6IDwvRk9OVD48Rk9OVCBz aXplPTQgZmFjZT1BcmlhbD5DYXJnbywgDQpjYXN1YWwsLi4uLi4uLi4uLi4uLi4uLi48L0ZPTlQ+ PC9QPg0KPFA+PEZPTlQgZmFjZT1BcmlhbD48Rk9OVCBzaXplPTQ+d29ya3dlYXI6IGNvdmVyYWxs LCBoaWdoLXZpeiBqYWNrZXRzLCANCnJlZmxlY3RpdmUgdmVzdHMuLi4uLjwvRk9OVD48L0ZPTlQ+ PC9QPg0KPFA+PEZPTlQgc2l6ZT00PkFuZCBvdGhlciBraW5kcyBvZiBjdXN0b21pemVkIGdhcm1l bnRzLi4uLi48L0ZPTlQ+PEZPTlQgDQpmYWNlPUFyaWFsPjxCUj48Rk9OVCBzaXplPTQ+LjwvRk9O VD48L0ZPTlQ+PC9QPg0KPFA+PEZPTlQgc2l6ZT00PkhvcGUgdG8gZ2V0IGxvbmcgdGVybSBjb29w ZXJhdGlvbiB3aXRoIHlvdSBhbmQgeW91ciBlc3RlZW1lZCANCmNvbXBhbnkhPC9GT05UPjwvUD4N CjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJW SVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BB Tj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48 U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFs PjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRh cmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXpl PTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJv dXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4i PjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48 Rk9OVCBzaXplPTQgZmFjZT1BcmlhbD5CZXN0IHJlZ2FyZHMsPC9GT05UPjwvUD4NCjxESVY+PEEg aHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZ OiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9E SVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHls ZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48 L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxh bms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1B cmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxhbmsj IiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0K c2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48Rk9OVCBzaXpl PTQgZmFjZT1BcmlhbD5MSSBMRUk8L0ZPTlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFu ayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQg DQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJl Zj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBo aWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+ DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0i VklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQ QU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+ PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1Bcmlh bD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxQPjxGT05UIGZhY2U9QXJpYWw+PEZPTlQgc2l6 ZT00PjwvRk9OVD48L0ZPTlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdl dD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQg ZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6 YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxG T05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxB IGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElU WTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwv RElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5 bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+ PC9TUEFOPjwvQT48L0RJVj48Rk9OVCBmYWNlPUFyaWFsPjxCUj48Rk9OVCANCnNpemU9ND48U1RS T05HPkJBTVRPTiBJTkRVU1RSWSBDTy4sTFREPC9TVFJPTkc+PC9GT05UPjwvRk9OVD4gDQo8RElW PjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48Rk9OVCBmYWNlPUFyaWFsPjxT UEFOIA0Kc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PC9TUEFOPjwvRk9OVD48L0E+PC9ESVY+ DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0i VklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQ QU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+ PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1Bcmlh bD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxQPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPjwv Rk9OVD48L1A+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BB TiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwv Rk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdl dD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQg ZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6 YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxG T05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxB IGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElU WTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwv RElWPg0KPFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+PFNUUk9ORz5IVUFJQU4gRkVOR0ZBTiBJ TVBPUlQgJmFtcDsgRVhQT1JUIA0KQ08uLExURDwvU1RST05HPjwvRk9OVD48L1A+DQo8RElWPjxB IGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElU WTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwv RElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5 bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+ PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2Js YW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9 QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5r IyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCAN CnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPFA+PEZPTlQgc2l6 ZT00IGZhY2U9QXJpYWw+Tk8uMTI1LCBIVUFJWUlOIERJU1RSSUNULCBIVUFJQU4sIEpJQU5HU1Us IA0KQ0hJTkE8L0ZPTlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1f Ymxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFj ZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxh bmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05U IA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhy ZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTog aGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElW Pg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9 IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9T UEFOPjwvQT48L0RJVj4NCjxQPjxGT05UIGZhY2U9QXJpYWw+PEZPTlQgc2l6ZT00PlRFTDorODYg MTgxMjE2ODUyNTgsIDE1MDUxMzgxNjI3IEUtTUFJTDo8U1BBTiANCmNsYXNzPUFwcGxlLWNvbnZl cnRlZC1zcGFjZT4gPC9TUEFOPjwvRk9OVD48QSANCmhyZWY9Im1haWx0bzpidC10ZXh0aWxlcy5j b21zaW1vbi5saWxlaUAxNjMuY29tIj48Rk9OVCBjb2xvcj0jMDAwMDAwIA0Kc2l6ZT00PnNpbW9u LmxpbGVpQDE2My5jb208L0ZPTlQ+PC9BPjwvRk9OVD48L1A+PC9ESVY+PC9CT0RZPjwvSFRNTD4N Cg0K From eguan@redhat.com Mon Aug 22 01:12:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BD2DB7CA0 for ; Mon, 22 Aug 2016 01:12:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26C13AC003 for ; Sun, 21 Aug 2016 23:12:56 -0700 (PDT) X-ASG-Debug-ID: 1471846373-0bf57c55b3b70a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 39lb0fOEaQI6DzA3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 21 Aug 2016 23:12:54 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D20F188E60; Mon, 22 Aug 2016 06:12:53 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7M6Cq8k031248; Mon, 22 Aug 2016 02:12:53 -0400 Date: Mon, 22 Aug 2016 14:12:52 +0800 From: Eryu Guan To: Zorro Lang Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs/006: move code about resetting error handling to common/rc Message-ID: <20160822061252.GJ27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs/006: move code about resetting error handling to common/rc References: <1471629392-13661-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471629392-13661-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 22 Aug 2016 06:12:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471846374 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5093 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 20, 2016 at 01:56:31AM +0800, Zorro Lang wrote: > Nearly 1/3 code is used to reset the xfs error handling attributes, > This part can be picked up, and used for other cases. So move them > to a new function reset_xfs_sysfs_error_handling() in common/rc. > > Signed-off-by: Zorro Lang These two patches look good to me, both xfs/006 and the new EIO test passed on 4.8-rc2 and RHEL7 kernel, test hung as expected if I set max_retries or retry_timeout_seconds to 0. Just some nitpicks below: > --- > common/rc | 37 +++++++++++++++++++++++++++++++++++++ > tests/xfs/006 | 27 +++++++-------------------- > tests/xfs/006.out | 1 + > 3 files changed, 45 insertions(+), 20 deletions(-) > > diff --git a/common/rc b/common/rc > index 3fb0600..b038d8e 100644 > --- a/common/rc > +++ b/common/rc > @@ -3888,6 +3888,43 @@ _get_fs_sysfs_attr() > cat /sys/fs/${FSTYP}/${dname}/${attr} > } > > + > +# Reset all xfs error handling attributes, set them to original > +# status. > +# > +# Only one argument, and it's necessary: ^^^^^^^^^ mandatory? > +# - dev: device name, e.g. $SCRATCH_DEV > +# > +# Note: this function only works for XFS > +reset_xfs_sysfs_error_handling() Usually we name common helpers with a "_" as prefix. I can fix them at commit time, if there's no new review comments from others. Thanks, Eryu > +{ > + local dev=$1 > + > + if [ ! -b "$dev" -o "$FSTYP" != "xfs" ];then > + _fail "Usage: reset_xfs_sysfs_error_handling " > + fi > + > + _set_fs_sysfs_attr $dev error/fail_at_unmount 1 > + echo -n "error/fail_at_unmount=" > + _get_fs_sysfs_attr $dev error/fail_at_unmount > + > + # Make sure all will be configured to retry forever by default, except > + # for ENODEV, which is an unrecoverable error, so it will be configured > + # to not retry on error by default. > + for e in default EIO ENOSPC; do > + _set_fs_sysfs_attr $dev \ > + error/metadata/${e}/max_retries -1 > + echo -n "error/metadata/${e}/max_retries=" > + _get_fs_sysfs_attr $dev error/metadata/${e}/max_retries > + > + _set_fs_sysfs_attr $dev \ > + error/metadata/${e}/retry_timeout_seconds 0 > + echo -n "error/metadata/${e}/retry_timeout_seconds=" > + _get_fs_sysfs_attr $dev \ > + error/metadata/${e}/retry_timeout_seconds > + done > +} > + > # Skip if we are running an older binary without the stricter input checks. > # Make multiple checks to be sure that there is no regression on the one > # selected feature check, which would skew the result. > diff --git a/tests/xfs/006 b/tests/xfs/006 > index 8910026..58f9348 100755 > --- a/tests/xfs/006 > +++ b/tests/xfs/006 > @@ -57,31 +57,18 @@ _scratch_mkfs > $seqres.full 2>&1 > _dmerror_init > _dmerror_mount > > -# Enable fail_at_unmount, so XFS stops retrying on errors at unmount > -# time. _fail the test if we fail to set it to 1, because the test > -# probably will hang in such case and block subsequent tests. > -_set_fs_sysfs_attr $DMERROR_DEV error/fail_at_unmount 1 > +# Make sure all error handling attributes are original status > +reset_xfs_sysfs_error_handling $DMERROR_DEV > + > +# Make sure fail_at_unmount is enabled, so XFS stops retrying on > +# errors at unmount time. _fail the test if we fail to set it to 1, > +# because the test probably will hang in such case and block > +# subsequent tests. > attr=`_get_fs_sysfs_attr $DMERROR_DEV error/fail_at_unmount` > if [ "$attr" != "1" ]; then > _fail "Failed to set error/fail_at_unmount: $attr" > fi > > -# Make sure all will be configured to retry forever by default, except > -# for ENODEV, which is an unrecoverable error, so it will be configured > -# to not retry on error by default. > -for e in default EIO ENOSPC; do > - _set_fs_sysfs_attr $DMERROR_DEV \ > - error/metadata/${e}/max_retries -1 > - echo -n "error/metadata/${e}/max_retries=" > - _get_fs_sysfs_attr $DMERROR_DEV error/metadata/${e}/max_retries > - > - _set_fs_sysfs_attr $DMERROR_DEV \ > - error/metadata/${e}/retry_timeout_seconds 0 > - echo -n "error/metadata/${e}/retry_timeout_seconds=" > - _get_fs_sysfs_attr $DMERROR_DEV \ > - error/metadata/${e}/retry_timeout_seconds > -done > - > # start a metadata-intensive workload, but no data allocation operation. > # Because uncompleted new space allocation I/Os may cause XFS to shutdown > # after loading error table. > diff --git a/tests/xfs/006.out b/tests/xfs/006.out > index 393f411..3260b3a 100644 > --- a/tests/xfs/006.out > +++ b/tests/xfs/006.out > @@ -1,4 +1,5 @@ > QA output created by 006 > +error/fail_at_unmount=1 > error/metadata/default/max_retries=-1 > error/metadata/default/retry_timeout_seconds=0 > error/metadata/EIO/max_retries=-1 > -- > 2.7.4 > > -- > To unsubscribe from this list: send the line "unsubscribe fstests" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From david@fromorbit.com Mon Aug 22 01:20:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D3B627CA0 for ; Mon, 22 Aug 2016 01:20:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7E0F78F8035 for ; Sun, 21 Aug 2016 23:20:17 -0700 (PDT) X-ASG-Debug-ID: 1471846814-0bf8155c77c0d40001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id FkaoEokRwuORGZ5K for ; Sun, 21 Aug 2016 23:20:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuQYAHKYuld5LDUCEGdsb2JhbABdg0RWfIZym1oMAQEEBoxwhhSEDByFewQCAoE6TQIBAQEBAQIGAQEBAQEBAQE3QIRfBjocIxAIJCUPBSUDBy2IML0LAQEBBwIBJB6FRYweC4MHBZlIhiCIdYF3ToQOiQUChmmJToRgKjSGewEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 22 Aug 2016 15:50:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbiai-0000vk-27; Mon, 22 Aug 2016 16:20:12 +1000 Date: Mon, 22 Aug 2016 16:20:12 +1000 From: Dave Chinner To: linux-xfs@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: for-next branch updated to c563396 Message-ID: <20160822062011.GU19025@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: for-next branch updated to c563396 References: <20160821235610.GM19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160821235610.GM19025@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1471846814 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6202 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header [and now with the correct xfs@oss.sgi.com address] Hi Folks, The for-next branch of the xfsprogs repository at: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git has just been updated. It now contains full reverse mapping btree support, which can be turned on at mkfs time via "-m rmapbt=1". Filesystems using reverse mappings are bleeding edge experimental at thsi point in time, so don't use this for any data you actually care about right now. *IMPORTANT*: Using reverse mapping functionality requires a *4.8-rc3* kernel or more recent (Linus tagged 4.8-rc3 about 30 minutes ago) due to a small change in on-disk format required for efficient accounting. If you use a 4.8-rc[12] kernel, you will see corruptions when you update your kernel to -rc3 or later. For those of you who have existing rmapbt=1 filesystems, please update your xfsprogs and kernel at the same time and remake those filesystems. Running repair should also fix up the on-disk accounted we added, so mkfs may not be necessary. >From this point onwards, however, the rmapbt on-disk format will be stable and will not change without the use of feature bits to tell the kernel about the change. -Dave. The new head of the master branch is commit: c563396 mkfs.xfs: create filesystems with reverse-mappings New Commits: Darrick J. Wong (35): [de2f203] libxfs: fix xfs_isset pointer calculation [59d2274] xfs_buflock: add a tool that can be used to find buffer deadlocks [1c47bd6] xfs_io: bmap should print 'delalloc', not '-2' [2110aea] xfs_repair: preserve in-core meta_uuid while zeroing unused sb portions [9e1c66c] mkfs: fix library ordering [7079b3d] xfs_logprint: move the EFI copying/printing functions to a redo items file [c4c32d8] xfs_logprint: fix formatting issues with the EFI printing code [a481a58] man: document the DAX fsxattr inode flag [80afb9a] xfs_io: add free-extent error injection type [8511b71] xfs: store rmapbt block count in the AGF [59b8636] xfs: remove OWN_AG rmap when allocating a block from the AGFL [794a560] libxfs: fix various oddities in the kernel import [dc3bce0] libxfs: add deferred ops item handlers for userspace [a9d7b98] xfs_db: display rmap btree contents [e3dcc17] xfs_db: spot check rmapbt [e434854] xfs_db: copy the rmap btree [86bb49e] xfs_db: introduce the 'fsmap' command to find what owns a set of fsblocks [f6b78a5] xfs_growfs: report rmapbt presence [dea764e] xfs_io: add rmap-finish error injection type [4428538] xfs_logprint: support rmap redo items [0f94fa4] xfs_repair: use rmap btree data to check block types [7ddb50f] xfs_repair: fix fino_bno calculation when rmapbt is enabled [9c9990b] xfs_repair: create a slab API for allocating arrays in large chunks [9e0f480] xfs_repair: collect reverse-mapping data for refcount/rmap tree rebuilding [1102c15] xfs_repair: record and merge raw rmap data [00efc33] xfs_repair: add inode bmbt block rmaps [713b681] xfs_repair: add fixed-location per-AG rmaps [11b9e51] xfs_repair: check existing rmapbt entries against observed rmaps [934b554] xfs_repair: rebuild reverse-mapping btree [62cf990] xfs_repair: add per-AG btree blocks to rmap data and add to rmapbt [b7f12e5] xfs_repair: merge data & attr fork reverse mappings [6584173] xfs_repair: look for mergeable rmaps [a418fe7] xfs_repair: check for impossible rmap record field combinations [e5cc9d5] mkfs: set agsize prior to calculating minimum log size [c563396] mkfs.xfs: create filesystems with reverse-mappings Code Diffstat: db/Makefile | 2 +- db/agf.c | 9 + db/btblock.c | 100 ++++++ db/btblock.h | 5 + db/check.c | 85 ++++- db/command.c | 2 + db/field.c | 19 ++ db/field.h | 9 + db/fsmap.c | 172 ++++++++++ db/fsmap.h | 20 ++ db/metadump.c | 74 ++++ db/type.c | 5 + db/type.h | 2 +- growfs/xfs_growfs.c | 14 +- include/libxfs.h | 3 +- include/xfs_multidisk.h | 4 +- include/xfs_trans.h | 3 + io/bmap.c | 2 + io/inject.c | 6 +- libxfs/Makefile | 1 + libxfs/defer_item.c | 258 ++++++++++++++ libxfs/init.c | 4 + libxfs/libxfs_api_defs.h | 13 + libxfs/xfs_alloc.c | 19 ++ libxfs/xfs_format.h | 13 +- libxfs/xfs_rmap_btree.c | 6 + libxfs/xfs_rmap_btree.h | 7 - logprint/Makefile | 2 +- logprint/log_misc.c | 155 +-------- logprint/log_print_all.c | 72 +--- logprint/log_redo.c | 382 +++++++++++++++++++++ logprint/logprint.h | 11 +- man/man3/xfsctl.3 | 5 + man/man8/mkfs.xfs.8 | 20 ++ man/man8/xfs_db.8 | 65 +++- mkfs/Makefile | 2 +- mkfs/maxtrres.c | 8 +- mkfs/xfs_mkfs.c | 142 ++++++-- repair/Makefile | 4 +- repair/agheader.c | 4 + repair/dinode.c | 15 + repair/incore.h | 16 +- repair/phase4.c | 62 ++++ repair/phase5.c | 456 +++++++++++++++++++++++-- repair/rmap.c | 924 ++++++++++++++++++++++++++++++++++++++++++++++++++ repair/rmap.h | 55 +++ repair/scan.c | 491 ++++++++++++++++++++++++++- repair/slab.c | 456 +++++++++++++++++++++++++ repair/slab.h | 60 ++++ repair/xfs_repair.c | 10 +- tools/xfsbuflock.py | 205 +++++++++++ 51 files changed, 4159 insertions(+), 320 deletions(-) create mode 100644 db/fsmap.c create mode 100644 db/fsmap.h create mode 100644 libxfs/defer_item.c create mode 100644 logprint/log_redo.c create mode 100644 repair/rmap.c create mode 100644 repair/rmap.h create mode 100644 repair/slab.c create mode 100644 repair/slab.h create mode 100755 tools/xfsbuflock.py -- Dave Chinner david@fromorbit.com From felix.janda@posteo.de Mon Aug 22 02:07:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 017877CA0 for ; Mon, 22 Aug 2016 02:07:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6EB8304039 for ; Mon, 22 Aug 2016 00:07:28 -0700 (PDT) X-ASG-Debug-ID: 1471849644-0bf57c55b3b8330001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id qaFEZitjK3HvyJ5c (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 00:07:26 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 414F620461 for ; Mon, 22 Aug 2016 09:07:24 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sHl4p6vTjz105v; Mon, 22 Aug 2016 09:07:22 +0200 (CEST) Date: Mon, 22 Aug 2016 09:06:01 +0200 From: Felix Janda To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t Message-ID: <20160822070601.GA1205@nyan> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t References: <20160822030953.GS19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160822030953.GS19025@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471849646 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 986 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Dave Chinner wrote: > On Sat, Aug 13, 2016 at 07:04:18PM +0200, Felix Janda wrote: > > This patch series does several things related to large file support. > > > > Patches 1-3 enable transparent LFS in the build system and make it > > mandatory. > > > > Patches 4-9 and 12 replace *64 function and structure aliases. > > > > Patches 10 and 11 disable fsr on Mac OS X and do cleanup to enable > > Patch 12. Further cleanup of the portability code is possible later. > > > > Patch 13 makes tranparent LFS also mandatory for all users of libxfs. > > > > Patch 14 finally replaces off64_t by off_t. > > Felix, can you check how you are sending these patches? The last two > sets of patches you've sent have not threaded in the correct order > (they thread in a random order) which means I have to manually > reorder the patch set to get it to apply in the correct order via > git am.... I am sorry for that. Should I resend the patch series? Cheers, Felix From peterz@infradead.org Mon Aug 22 03:35:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 50D057CA0 for ; Mon, 22 Aug 2016 03:35:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C4C96AC002 for ; Mon, 22 Aug 2016 01:35:03 -0700 (PDT) X-ASG-Debug-ID: 1471854901-0bf8155c77c6370001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id GbmXN7BAMWZ7tbyR (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 22 Aug 2016 01:35:01 -0700 (PDT) X-Barracuda-Envelope-From: peterz@infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from j217100.upc-j.chello.nl ([24.132.217.100] helo=twins.programming.kicks-ass.net) by bombadil.infradead.org with esmtpsa (Exim 4.85_2 #1 (Red Hat Linux)) id 1bbkh9-0001ig-Q8; Mon, 22 Aug 2016 08:35:00 +0000 Received: by twins.programming.kicks-ass.net (Postfix, from userid 1000) id C4F7012573B0D; Mon, 22 Aug 2016 10:34:55 +0200 (CEST) Date: Mon, 22 Aug 2016 10:34:55 +0200 From: Peter Zijlstra To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead Message-ID: <20160822083455.GH10153@twins.programming.kicks-ass.net> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: remove i_iolock and use i_rwsem in the VFS inode instead References: <1470935423-12329-1-git-send-email-hch@lst.de> <20160811215444.GY30192@twins.programming.kicks-ass.net> <20160818173707.GA1240@lst.de> <20160819132736.GH10121@twins.programming.kicks-ass.net> <20160820063723.GA7013@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160820063723.GA7013@lst.de> User-Agent: Mutt/1.5.23.1 (2014-03-12) X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1471854901 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1011 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, COMMA_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Aug 20, 2016 at 08:37:23AM +0200, Christoph Hellwig wrote: > On Fri, Aug 19, 2016 at 03:27:36PM +0200, Peter Zijlstra wrote: > > Hurm, if you're going to directly use that maybe we should pick a better > > name ;-) > > Fine with that. > > > Also, be sure to check the debug_locks variable, if that's cleared the > > result of _lockdep_is_held() isn't reliable -- we stop tracking lock > > state when there's an error. > > I already do. But I'm wondering if we can't simply move the > debug_locks check into lockdep_is_held? It's already used directly > in a few places, and that would also solve the whole naming issue. Reason I didn't do that initially was that I used lock_is_held() for both positive and negative tests (ie. assert a lock is held and a lock is not held). Given that, you cannot pick a right return value when !debug_locks. Not sure we still do that, but I distinctly remember running into that when I did as you suggest now. But that was many years ago. From cmaiolino@redhat.com Mon Aug 22 03:35:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 84D587CA0 for ; Mon, 22 Aug 2016 03:35:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED506AC002 for ; Mon, 22 Aug 2016 01:35:58 -0700 (PDT) X-ASG-Debug-ID: 1471854957-0bf57c55b4bb5b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id w6alJ80sIXq2DcEI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 01:35:57 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D95BC636FE; Mon, 22 Aug 2016 08:35:56 +0000 (UTC) Received: from redhat.com (gfs-i24c-02.mpc.lab.eng.bos.redhat.com [10.16.144.214]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7M8ZsP9015295 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 22 Aug 2016 04:35:56 -0400 Date: Mon, 22 Aug 2016 04:35:54 -0400 From: Carlos Maiolino To: "Darrick J. Wong" Cc: Dave Chinner , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: disallow mounting of realtime + rmap filesystems Message-ID: <20160822083554.GA8035@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: disallow mounting of realtime + rmap filesystems Mail-Followup-To: "Darrick J. Wong" , Dave Chinner , linux-xfs@vger.kernel.org, xfs@oss.sgi.com References: <20160819203207.GE8268@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160819203207.GE8268@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 22 Aug 2016 08:35:56 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471854957 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1303 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 19, 2016 at 01:32:07PM -0700, Darrick J. Wong wrote: > Since the kernel doesn't currently support the realtime rmapbt, > don't allow such filesystems to be mounted. Support will appear > in a future release. > Makes sense to me, you can add: Reviewed-by: Carlos Maiolino > Signed-off-by: Darrick J. Wong > --- > fs/xfs/xfs_super.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 24ef83e..fd6be45 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1574,9 +1574,16 @@ xfs_fs_fill_super( > } > } > > - if (xfs_sb_version_hasrmapbt(&mp->m_sb)) > + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { > + if (mp->m_sb.sb_rblocks) { > + xfs_alert(mp, > + "EXPERIMENTAL reverse mapping btree not compatible with realtime device!"); > + error = -EINVAL; > + goto out_filestream_unmount; > + } > xfs_alert(mp, > "EXPERIMENTAL reverse mapping btree feature enabled. Use at your own risk!"); > + } > > error = xfs_mountfs(mp); > if (error) > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From david@fromorbit.com Mon Aug 22 06:51:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A95FD7CA0 for ; Mon, 22 Aug 2016 06:51:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 785D6304039 for ; Mon, 22 Aug 2016 04:51:07 -0700 (PDT) X-ASG-Debug-ID: 1471866664-0bf57b5312f0910001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id RkCQTsXIas3sdNd6 for ; Mon, 22 Aug 2016 04:51:04 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiwiAJPluld5LDUCEGdsb2JhbABdg0SBUoJ5g3mbbQaMcIoghhcEAgKBTk0CAQEBAQECBgEBAQEBAQEBN0CEXwEFOhwjEAgDGAklDwUlAwcaE4gwvWwBCyUehUWFFYobBZlIiR+Fdo9aSIt3g3iEYCo0hnsBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Aug 2016 21:21:02 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbnkr-0001Vz-FQ; Mon, 22 Aug 2016 21:51:01 +1000 Date: Mon, 22 Aug 2016 21:51:01 +1000 From: Dave Chinner To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t Message-ID: <20160822115101.GV19025@dastard> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t References: <20160822030953.GS19025@dastard> <20160822070601.GA1205@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160822070601.GA1205@nyan> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471866664 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1177 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32220 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 22, 2016 at 09:06:01AM +0200, Felix Janda wrote: > Dave Chinner wrote: > > On Sat, Aug 13, 2016 at 07:04:18PM +0200, Felix Janda wrote: > > > This patch series does several things related to large file support. > > > > > > Patches 1-3 enable transparent LFS in the build system and make it > > > mandatory. > > > > > > Patches 4-9 and 12 replace *64 function and structure aliases. > > > > > > Patches 10 and 11 disable fsr on Mac OS X and do cleanup to enable > > > Patch 12. Further cleanup of the portability code is possible later. > > > > > > Patch 13 makes tranparent LFS also mandatory for all users of libxfs. > > > > > > Patch 14 finally replaces off64_t by off_t. > > > > Felix, can you check how you are sending these patches? The last two > > sets of patches you've sent have not threaded in the correct order > > (they thread in a random order) which means I have to manually > > reorder the patch set to get it to apply in the correct order via > > git am.... > > I am sorry for that. Should I resend the patch series? No, I've re-ordered it appropriately. Cheers, Dave. -- Dave Chinner david@fromorbit.com From billodo@redhat.com Mon Aug 22 08:17:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8213F7CA0 for ; Mon, 22 Aug 2016 08:17:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E8001AC006 for ; Mon, 22 Aug 2016 06:16:57 -0700 (PDT) X-ASG-Debug-ID: 1471871812-0bf57c55b2d2170001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uWwwh6sqHGxo26L7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 06:16:53 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 87873C05678F; Mon, 22 Aug 2016 13:16:52 +0000 (UTC) Received: from redhat.com (vpn-62-114.rdu2.redhat.com [10.10.62.114]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7MDGo43030122 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 22 Aug 2016 09:16:51 -0400 Date: Mon, 22 Aug 2016 08:16:49 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/3] xfs_quota: changes to accomodate hoisted ioctl defs Message-ID: <20160822131649.GA2736@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2 2/3] xfs_quota: changes to accomodate hoisted ioctl defs References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-3-git-send-email-billodo@redhat.com> <20160822011812.GP19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160822011812.GP19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 22 Aug 2016 13:16:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471871813 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1605 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 22, 2016 at 11:18:12AM +1000, Dave Chinner wrote: > On Tue, Aug 16, 2016 at 09:16:37AM -0500, Bill O'Donnell wrote: > > The kernel commit to make the ioctl promotion (334e580a6f) moved > > the definitions for the XFS ioctl to uapi/linux/fs.h for the > > following reason: > > > > Hoist the ioctl definitions for the XFS_IOC_FS[SG]SETXATTR API > > from fs/xfs/libxfs/xfs_fs.h to include/uapi/linux/fs.h so that > > the ioctls can be used by all filesystems, not just XFS. This > > enables (initially) ext4 to use the ioctl to set project IDs on > > inodes. > > > > This means we now need to handle this change in userspace as the > > uapi/linux/fs.h file may not contain the definitions (i.e. new > > xfsprogs/ old linux uapi files) xfsprogs needs to build. Hence we > > need to massage the definition in xfs_fs.h to take the values from > > the system header if it exists, otherwise keep the old definitions > > for compatibility and platforms other than linux.. > > > > This patch was originally submitted by Dave Chinner > > (http://oss.sgi.com/archives/xfs/2016-02/msg00108.html) > > > > Resubmitting with changes to accomodate upstream changes since > > initial submission. > > This is unnecessary - the "include local version" changes were made > to the platform headers (e.g. include/linux.h) in commit 83f4b5a > ("xfs_fs.h: XFS_IOC_FS[SG]SETXATTR to FS_IOC_FS[SG]ETXATTR > promotion"). Sorry, I missed that. I'll remove this patch on v3. Thanks- Bill > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From billodo@redhat.com Mon Aug 22 08:20:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 375AF7CA0 for ; Mon, 22 Aug 2016 08:20:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8B057AC003 for ; Mon, 22 Aug 2016 06:20:30 -0700 (PDT) X-ASG-Debug-ID: 1471872028-0bf57b5314f5bf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id whz9PcX3Mm4ece1C (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 06:20:29 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4E22E9D0E0; Mon, 22 Aug 2016 13:20:28 +0000 (UTC) Received: from redhat.com (vpn-62-114.rdu2.redhat.com [10.10.62.114]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7MDKPgE013154 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 22 Aug 2016 09:20:27 -0400 Date: Mon, 22 Aug 2016 08:20:25 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 Message-ID: <20160822132025.GB2736@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfs_quota: additional changes to allow use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-4-git-send-email-billodo@redhat.com> <20160822020650.GR19025@dastard> <86d459e4-6853-9f3c-3851-3e212f8c7adf@sandeen.net> <8c1b4044-ff69-f891-a4f4-b302bd3bfef3@sandeen.net> <20160822053455.GT19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160822053455.GT19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 22 Aug 2016 13:20:28 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471872029 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1917 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 22, 2016 at 03:34:55PM +1000, Dave Chinner wrote: > On Sun, Aug 21, 2016 at 11:46:14PM -0500, Eric Sandeen wrote: > > On 8/21/16 10:34 PM, Eric Sandeen wrote: > > > On 8/21/16 9:06 PM, Dave Chinner wrote: > > >> On Tue, Aug 16, 2016 at 09:16:38AM -0500, Bill O'Donnell wrote: > > > > ... > > > > >> static int > > >> init_check_command( > > >> const cmdinfo_t *ct) > > >> { > > >> if (!fspath) > > >> return 1; > > >> > > >> /* Always run commands that we are told to skip here */ > > >> if (ct->flags & CMD_SKIP_CHECK) > > >> return 1; > > >> > > >> /* if it's an XFS filesystem, always run the command */ > > >> if (!(fs_path->fs_flags & FS_FOREIGN)) > > >> return 1; > > > > > > Sorry for the late review; thanks for getting on it, Dave - but, > > > isn't "foreign ok" exactly == "skip check?" > > > > > > The only check that gets skipped is the foreign check, so just > > > setting FOREIGN_OK seems to accomplish the same thing without > > > more flag complexity, no? > > > > Oh, the subliminal brain reminded me that we want to be able to > > issue help or quit whether or not we had the "-f" flag, regardless > > of the filesystem, and that "foreign" isn't ok unless the -f flag > > is set, so we do need a class of "always works" commands. > > Right, but that was something that was done in patch 1/3. I pointed > out that no mention of it was made in the cmmit message there.... > > > I guess that was the point of the patch, but I suppose some clarity > > in comments or commitlog would help slow people like me. ;) > > Right. better explanations needed all round :P Yes, I'll clean it up in v3. Thanks- Bill > > Cheers, > > Dave. > > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From billodo@redhat.com Mon Aug 22 11:02:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 40F1F7CA0 for ; Mon, 22 Aug 2016 11:02:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 043318F804B for ; Mon, 22 Aug 2016 09:02:11 -0700 (PDT) X-ASG-Debug-ID: 1471881730-0bf57c55b3db180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id V867cj5ntVnWLydE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 09:02:10 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E574E83F46; Mon, 22 Aug 2016 16:02:09 +0000 (UTC) Received: from redhat.com (vpn-62-114.rdu2.redhat.com [10.10.62.114]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7MG27wT008944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 22 Aug 2016 12:02:09 -0400 Date: Mon, 22 Aug 2016 11:02:07 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 Message-ID: <20160822160207.GC2736@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-2-git-send-email-billodo@redhat.com> <20160822014742.GQ19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160822014742.GQ19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Mon, 22 Aug 2016 16:02:09 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471881730 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2173 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 22, 2016 at 11:47:42AM +1000, Dave Chinner wrote: > On Tue, Aug 16, 2016 at 09:16:36AM -0500, Bill O'Donnell wrote: > > This allows xfs_quota to be used on ext4 for project quota testing > > in xfstests. > > > > This patch was originally submitted by Dave Chinner > > (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html) > > > > Resubmitting with the following change: > > quota/init.c: correct logic error in loop contained in init_args_command() > > function (lines 85-91). > > What logic error? In your original patch, in init_args_command(): do { fs_path = &fs_table[index++]; - } while ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count); + if (fs_path->fs_flags & FS_PROJECT_PATH) + continue; + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + continue; + } while (index < fs_count); The loop should break out, when (fs_path->fs_flags & FS_PROJECT_PATH) is false, but instead moves onto the next test (and then back to the top). See in the original while statement, the loop stops when the false condition occurs, that is, ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count) == False. My commit message was completely terse, sorry. I'll clarify it in v3. Thanks- Bill > > Commit messages like this really don't tell the reader anything > about what is different the original patch. I've had to go archive > spelunking to work out what is different, and I'm still not sure > what the logic error you fixed is.... > > And, FWIW, whilst spelunking, I noticed that Eric's last review > comments on my original patch: > > Looks ok, but now with the new option: > > 1) needs a manpage update > 2) usage() should be updated to include -f > > 3) and I just noticed, > > _("foreign mount active, %s command is for XFS filesystems only\n"), > > seems kind of unclear; maybe just > > _("%s command is for XFS filesystems only\n"), > > have not been addressed by this update. > > Can you please add these these changes, update the commit message > and resubmit? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From MAILER-DAEMON Mon Aug 22 11:24:36 2016 Return-Path: <> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=FH_FROMEML_NOTLD, FREEMAIL_FORGED_REPLYTO,FROM_NO_USER,HTML_MESSAGE,TO_MALFORMED,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3BB617CA0 for ; Mon, 22 Aug 2016 11:24:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3DEAAC002 for ; Mon, 22 Aug 2016 09:24:32 -0700 (PDT) X-ASG-Debug-ID: 1471883069-0bf8155c74e2e60001-NocioJ Received: from mail.mutucertification.com (mail.mutucertification.com [103.3.59.14]) by cuda.sgi.com with ESMTP id wRoCJMMmpZzCJa7f (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 09:24:30 -0700 (PDT) X-Barracuda-Envelope-From: X-Barracuda-Effective-Source-IP: mail.mutucertification.com[103.3.59.14] X-Barracuda-Apparent-Source-IP: 103.3.59.14 Received: from localhost (localhost [127.0.0.1]) by mail.mutucertification.com (Postfix) with ESMTP id 19219D019A9; Mon, 22 Aug 2016 17:19:50 +0700 (WIB) Received: from mail.mutucertification.com ([127.0.0.1]) by localhost (mail.mutucertification.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id Q2fFYXBOWov6; Mon, 22 Aug 2016 17:19:49 +0700 (WIB) Received: from localhost (localhost [127.0.0.1]) by mail.mutucertification.com (Postfix) with ESMTP id 02EB2C884C7; Mon, 22 Aug 2016 16:17:16 +0700 (WIB) X-Virus-Scanned: amavisd-new at mutucertification.com Received: from mail.mutucertification.com ([127.0.0.1]) by localhost (mail.mutucertification.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id Nk5vNDe9auM5; Mon, 22 Aug 2016 16:17:16 +0700 (WIB) Received: from laurach1.laurach1.b6.internal.cloudapp.net (unknown [40.87.59.171]) by mail.mutucertification.com (Postfix) with ESMTPSA id D489AD45604; Mon, 22 Aug 2016 15:27:15 +0700 (WIB) Content-Type: multipart/alternative; boundary="===============2035335699==" MIME-Version: 1.0 Subject: Darlehen anbieten / Loan offer.. To: Recipients <> X-ASG-Orig-Subj: Darlehen anbieten / Loan offer.. From: "FREEDOM " <> Date: Mon, 22 Aug 2016 08:28:10 +0000 Reply-To: freedominvestmentmarket@yandex.com Message-Id: <20160822082717.D489AD45604@mail.mutucertification.com> X-Barracuda-Connect: mail.mutucertification.com[103.3.59.14] X-Barracuda-Start-Time: 1471883070 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 52 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.51 X-Barracuda-Spam-Status: No, SCORE=0.51 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ANY_BOUNCE_MESSAGE, BOUNCE_MESSAGE, BSF_SC0_MISMATCH_TO, EMPTY_ENV_FROM, FROM_NO_USER, FUZZY_CREDIT, HTML_MESSAGE, TO_MALFORMED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 TO_MALFORMED To: has a malformed address 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.50 FROM_NO_USER From: has no local-part before @ sign 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 FUZZY_CREDIT BODY: Attempt to obfuscate words in spam 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BOUNCE_MESSAGE MTA bounce message 0.00 ANY_BOUNCE_MESSAGE Message is some kind of bounce message You will not see this in a MIME-aware mail reader. --===============2035335699== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Diese Nachricht ist, Ihnen mitzuteilen, dass wir alle Arten von Krediten @ = 3% j=E4hrlich an. Sind Sie in der Notwendigkeit der Finanzierung von jeder = Art? Gesch=E4ft, Hypothek, Personal usw. Alle interessierten Bewerber sollt= en so schnell wie m=F6glich an uns zur=FCck. Diese E-Mail, einschlie=DFlich aller Anh=E4nge, kann vertrauliche Informat= ionen enthalten und ist ausschlie=DFlich f=FCr die Nutzung durch die Person= bestimmt sind, an die sie gerichtet ist. Wenn Sie diese E-Mail irrt=FCmlic= h erhalten haben, informieren Sie bitte den Absender, nicht seinen Inhalt a= n andere weitergeben , und es von Ihrem System zu l=F6schen. Jede andere Ve= rwendung dieser E-Mail und / oder Anlagen ist verboten. Diese Meldung wird = nicht in elektronischer Form zu bilden, eine elektronische Unterschrift ode= r Absicht zur Kontraktion gemeint. = This message is to inform you that we offer all types of LOANS @ 3% annual = rate. Are you in need of financing of any type? Business, Mortgage, Persona= l etc. Any interested Applicants should get back to us asap. This E-mail, including any attachments, may contain confidential informati= on and is intended solely for use by the individual to whom it is addressed= . If you received this E-mail in error, please notify the sender, do not di= sclose its contents to others, and delete it from your system. Any other us= e of this E-mail and/or attachments is prohibited. This message is not mean= t to constitute an electronic signature or intent to contract electronicall= y. --===============2035335699== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body

Diese Nachricht ist, Ihnen mitzuteilen, = dass wir alle Arten von Krediten @ 3= % j=E4hrlich an. Sind S= ie in der Notwendigkeit der Finanzierung von jede= r Art? Gesch=E4ft, Hypothek, = Personal usw. Alle interessierten Bewerber sollten so schnell wie m=F6glich an = uns zur=FCck.

Diese E-Mail, einschlie=DFlich aller Anh=E4nge, kann vertrauliche Informationen enthalten und ist ausschlie=DFlich f=FCr die Nutzung durch= die Person bestimmt sind, an die si= e gerichtet ist. Wenn Sie diese E-Ma= il irrt=FCmlich erhalten haben, informieren Sie bitte den Absender, nicht seinen Inhalt an andere weitergeben , und es von Ihrem System zu l=F6schen. = Jede andere Verwendung dieser E-Mail und /<= /SPAN> oder Anlagen ist verboten. Diese Mel= dung wird nicht in elektronischer Form zu bilden,= eine elektronische Unterschrift oder Absicht zur Kontraktion gemeint.


T= his message is to inform you that we offer all types of LOANS @ 3% annual r= ate. Are you in need of financing of any type? Business, Mortgage, Personal= etc. Any interested Applicants should get back to us asap.

This E-mail, including any attachments, may contain confidential informa= tion and is intended solely for use by the individual to whom it is address= ed. If you received this E-mail in error, please notify the sender, do not = disclose its contents to others, and delete it from your system. Any other = use of this E-mail and/or attachments is prohibited. This message is not me= ant to constitute an electronic signature or intent to contract electronica= lly.

--===============2035335699==-- From bfoster@redhat.com Mon Aug 22 11:31:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8D91C7CA0 for ; Mon, 22 Aug 2016 11:31:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07B02AC002 for ; Mon, 22 Aug 2016 09:31:05 -0700 (PDT) X-ASG-Debug-ID: 1471883464-0bf81509b0db720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZybdY1nAjZATpnC0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 09:31:04 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D11B54A54A for ; Mon, 22 Aug 2016 16:31:03 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-33.bos.redhat.com [10.18.41.33]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7MGV3SY002095 for ; Mon, 22 Aug 2016 12:31:03 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0FCBF121165; Mon, 22 Aug 2016 12:31:01 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: close xfs_wait_buftarg() race with buffer lookups Date: Mon, 22 Aug 2016 12:31:01 -0400 X-ASG-Orig-Subj: [PATCH] xfs: close xfs_wait_buftarg() race with buffer lookups Message-Id: <1471883461-27407-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 22 Aug 2016 16:31:03 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471883464 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5328 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_wait_buftarg() is invoked on unmount and filesystem freeze to drain and free the buffer LRU. We have reports of filesystem freeze hangs with the following call chain: ->xfs_wait_buftarg() ->xfs_log_quiesce() ->xfs_quiesce_attr() ->xfs_fs_freeze() ... This hang can reproduced with a long enough running fsstress instance running in parallel with a tight freeze/unfreeze loop. The cause of the hang is racing b_hold updates between xfs_wait_buftarg() and _xfs_buf_lookup(). Specifically, buftarg wait path checks whether a buffer has a >1 b_hold count to determine whether to skip the buffer. If b_hold == 1, xfs_wait_buftarg_rele() proceeds to prepare the buffer for the final removal and ultimately calls xfs_buf_rele() to drop the LRU reference. The problem is that _xfs_buf_find() can acquire a b_hold reference any time after xfs_buftarg_wait_rele() has decided it has the only remaining reference. If this occurs, xfs_wait_buftarg() drops the LRU reference, but the xfs_buf_rele() instance doesn't actually remove the buffer from the LRU due to the _xfs_buf_find() hold. At this point b_hold == 1, yet the buffer is held via the _xfs_buf_find() codepath and still remains on the LRU. Both call chains will ultimately call xfs_buf_rele() on a buffer with b_hold == 1. This can have several user facing side effects such as use after free errors or the freed buffer remaining on the LRU indefinitely with an underflowed or garbage b_hold count value. Update xfs_buftarg_wait_rele() to properly synchronize the LRU drain against buffer lookups. Atomically decrement and lock the perag associated with the buffer to lock out buffer lookups before xfs_wait_buftarg() determines whether the LRU holds the final reference. Open code freeing of the buffer so we can remove it from the perag rbtree before the perag lock is dropped and guarantee it cannot be looked up once freeing is imminent. Also update xfs_buftarg_wait_rele() to drop and reacquire the lru_lock in the correct order to avoid deadlocks with LRU insertion. Signed-off-by: Brian Foster --- A couple notes... first is that are several different ways to close this race. I opted for this approach because xfs_wait_buftarg() is the slow/less frequent path. Second, I believe we still have an independent freeze hang upstream due to an issue with how we use drain_workqueue(). Specifically, I see the following warning from kernel/workqueue.c:__queue_work(): if (unlikely(wq->flags & __WQ_DRAINING) && WARN_ON_ONCE(!is_chained_work(wq))) return; ... followed by a hang. I suspect this is due to the ioend work being dropped and thus never completing the I/O, but I haven't dug into it yet. For now, I'm testing for hangs with this fix and the above commented out. Brian fs/xfs/xfs_buf.c | 52 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 607cc29..ce9c419 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1570,24 +1570,48 @@ xfs_buftarg_wait_rele( { struct xfs_buf *bp = container_of(item, struct xfs_buf, b_lru); struct list_head *dispose = arg; + struct xfs_perag *pag = bp->b_pag; + int release; + + /* + * Drop lru_lock to avoid deadlocks with LRU insertion. The required + * lock order to safely isolate a buffer is pag_buf_lock -> b_lock + * -> lru_lock. + */ + spin_unlock(lru_lock); - if (atomic_read(&bp->b_hold) > 1) { + /* + * Atomically decrement and lock the perag to synchronize against buffer + * lookups. We unconditionally decrement because a check for b_hold == 1 + * alone is not sufficient. _xfs_buf_find() can acquire a reference + * immediately after the check. + */ + release = atomic_dec_and_lock(&bp->b_hold, &pag->pag_buf_lock); + if (!release) { /* need to wait, so skip it this pass */ trace_xfs_buf_wait_buftarg(bp, _RET_IP_); - return LRU_SKIP; + goto skip_buf; } - if (!spin_trylock(&bp->b_lock)) - return LRU_SKIP; + if (!spin_trylock(&bp->b_lock)) { + spin_unlock(&pag->pag_buf_lock); + goto skip_buf; + } + spin_lock(lru_lock); + + /* remove from the rbtree to prevent further lookups */ + rb_erase(&bp->b_rbnode, &pag->pag_buf_tree); + spin_unlock(&pag->pag_buf_lock); - /* - * clear the LRU reference count so the buffer doesn't get - * ignored in xfs_buf_rele(). - */ - atomic_set(&bp->b_lru_ref, 0); bp->b_state |= XFS_BSTATE_DISPOSE; list_lru_isolate_move(lru, item, dispose); spin_unlock(&bp->b_lock); return LRU_REMOVED; + +skip_buf: + /* skipping the buf, put back the LRU hold */ + atomic_inc(&bp->b_hold); + spin_lock(lru_lock); + return LRU_SKIP; } void @@ -1629,7 +1653,15 @@ xfs_wait_buftarg( xfs_alert(btp->bt_mount, "Please run xfs_repair to determine the extent of the problem."); } - xfs_buf_rele(bp); + + /* + * The buffer has already been removed from the rbtree + * and had the last reference dropped. Drop the perag + * reference and free it. + */ + ASSERT(atomic_read(&bp->b_hold) == 0); + xfs_perag_put(bp->b_pag); + xfs_buf_free(bp); } if (loop++ != 0) delay(100); -- 2.5.5 From oceans_bounty-xfs=oss.sgi.com@grandma-hacks.com Mon Aug 22 13:45:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_IMAGE_ONLY_32, HTML_MESSAGE,T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 31D737CA0 for ; Mon, 22 Aug 2016 13:45:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA71A304039 for ; Mon, 22 Aug 2016 11:45:03 -0700 (PDT) X-ASG-Debug-ID: 1471891501-0bf57b5312109aa0001-NocioJ Received: from mail.grandma-hacks.com (net152.ntraweb.net [94.156.93.152]) by cuda.sgi.com with ESMTP id BcHTFzDiy4CmrGty for ; Mon, 22 Aug 2016 11:45:01 -0700 (PDT) X-Barracuda-Envelope-From: oceans_bounty-xfs=oss.sgi.com@grandma-hacks.com X-Barracuda-Effective-Source-IP: net152.ntraweb.net[94.156.93.152] X-Barracuda-Apparent-Source-IP: 94.156.93.152 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=dkim; d=grandma-hacks.com; h=Date:From:To:Subject:MIME-Version:Content-Type:List-Unsubscribe:Message-ID; i=oceans_bounty@grandma-hacks.com; bh=OuiU0nYNliNJ1ttn7LiYt5JTE34=; b=f50THo80sDOdcwP2TJ4eGMbRLDV7jGZF0wqpccXbveYq0vgKegPvvZUENiGZum40YNsqCDf9Nw4i eVkLFnIB6Fe43Ac555QICE0FvVrD8ymPrVjgbX4VX+y5zFSiED3w3efwRtqP8TaCfFleEalhznzk 6ljxkfz3RxHG3nGmEX4= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=dkim; d=grandma-hacks.com; b=ijw7WmeE3bVpSVDZ5ZOvoJONXLwsVevT8j9TGmg9d5HdJebXezDMR+R5TvG3f5ILnlBq81Rt/JdW H8ttLRDto/4//GKvzboP3+wMhVdwW78y5Pe6A8lhc47xbbGqLlRybMgSAWsfhke/uaN9NTBHZAkq FGinSa88KNhg3brNgqE=; Received: by mail.grandma-hacks.com id hnd42s0001g0 for ; Mon, 22 Aug 2016 13:42:01 -0500 (envelope-from ) Date: Mon, 22 Aug 2016 13:42:01 -0500 From: "Oceans Bounty" To: Subject: How to make cough, mucus, sore throat VANISH in 24 hours MIME-Version: 1.0 X-ASG-Orig-Subj: How to make cough, mucus, sore throat VANISH in 24 hours Content-Type: multipart/alternative; boundary="----=_Part_451_841581576.1471891266541" List-Unsubscribe: Feedback-ID: 201608221336172653651 Message-ID: <0.0.0.32.1D1FCA4DF1C295C.202073@mail.grandma-hacks.com> X-Barracuda-Connect: net152.ntraweb.net[94.156.93.152] X-Barracuda-Start-Time: 1471891501 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3179 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ALL_NATURAL, BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_ONLY_32, HTML_IMAGE_ONLY_32_2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32225 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 ALL_NATURAL BODY: Spam is 100% natural?! -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_ONLY_32 BODY: HTML: images with 2800-3200 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 HTML_IMAGE_ONLY_32_2 HTML: images with 2800-3200 bytes of words 0.10 BSF_SC0_SA085 Custom Rule SA085 ------=_Part_451_841581576.1471891266541 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit How to make cough, mucus, sore throat VANISH in 24 hours http://www.grandma-hacks.com/1f1WP86_6b6gdjdf2DZsnFjnn0ntv0Mjh45b/down Update Preferences- http://www.grandma-hacks.com/miss/blue/d6fVi866b6nejdf2CZsnFjnn0ntv0Mjhc8e ------=_Part_451_841581576.1471891266541 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit  

How to make cough, mucus, sore throat VANISH in 24 hours



Hi xfs,


Ever wonder why it takes SO darn long for  cough, cold, and
sinus problems to go away?

I mean we're talking sometimes WEEKS.

In the mean time?

* You're coughing so much you're absolutely exhausted
because it DRAINS your energy

* You can't concentrate on your tasks because of this
energy drain and constant annoyance

* You feel like your entire HEAD is made of ? sewage
(aka MUCUS), and can't seem to get rid of it

* That ? tickle in your throat is something you wish you
could just reach in and scratch, and have it gone

* And your spouse and family members are getting
really angry each night since they can't sleep!

Look I know this is going to sound crazy?

But don't bother with the doctors or their prescription drugs. You
KNOW they won't give you quick relief you so badly want.

I'm here to tell you the breakthrough that hit the medical industry:

==> [link]

This totally NATURAL remedy contains 23 ingredients that gives
you 24 hour relief? and for GOOD.

Try it out? or they'll pay you (no kidding).


-Dr. Dave
Ocean's Bounty




Update Preferences





 


------=_Part_451_841581576.1471891266541-- From felix.janda@posteo.de Mon Aug 22 14:17:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 628387CA0 for ; Mon, 22 Aug 2016 14:17:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 33AF4304032 for ; Mon, 22 Aug 2016 12:17:47 -0700 (PDT) X-ASG-Debug-ID: 1471893462-0bf57c55b1f1e70001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id CkV5kLbM59MuqLwP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 12:17:44 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 77B6620ADC for ; Mon, 22 Aug 2016 21:17:42 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sJ3HM5GZYz105g; Mon, 22 Aug 2016 21:17:34 +0200 (CEST) Date: Mon, 22 Aug 2016 21:16:03 +0200 From: Felix Janda To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t Message-ID: <20160822191603.GA3227@nyan> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t References: <20160822030953.GS19025@dastard> <20160822070601.GA1205@nyan> <20160822115101.GV19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160822115101.GV19025@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1471893464 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 710 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32225 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Dave Chinner wrote: > On Mon, Aug 22, 2016 at 09:06:01AM +0200, Felix Janda wrote: > > Dave Chinner wrote: > > > Felix, can you check how you are sending these patches? The last two > > > sets of patches you've sent have not threaded in the correct order > > > (they thread in a random order) which means I have to manually > > > reorder the patch set to get it to apply in the correct order via > > > git am.... > > > > I am sorry for that. Should I resend the patch series? > > No, I've re-ordered it appropriately. Ok. Anyway thanks for drawing my attention to the ordering issues. (I was not quite aware that git am does not take the patch numbers in the subject into account.) Felix From david@fromorbit.com Mon Aug 22 18:24:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 95A377CA0 for ; Mon, 22 Aug 2016 18:24:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F0687AC001 for ; Mon, 22 Aug 2016 16:24:16 -0700 (PDT) X-ASG-Debug-ID: 1471908252-0bf57c55b4fad60001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 40dwAZREsInSDz4k for ; Mon, 22 Aug 2016 16:24:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ai4hAD2Iu1d5LDUCEGdsb2JhbABdg0SBUoZym3sGjHCDaoIqhAyGFwICAQECgWZNAgEBAQEBAgYBAQEBAQEBATdAhF4BAQQBJxMcIwULCAMOCgklDwUlAwcaExuIDge+IwEwHoVFhRWKGwWUAYVHiR+FdoF3jWNIhiGFVoN4hGAqNIZ7AQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Aug 2016 08:54:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbyZe-000350-Cx; Tue, 23 Aug 2016 09:24:10 +1000 Date: Tue, 23 Aug 2016 09:24:10 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: close xfs_wait_buftarg() race with buffer lookups Message-ID: <20160822232410.GW19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: close xfs_wait_buftarg() race with buffer lookups References: <1471883461-27407-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471883461-27407-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471908252 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4736 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 22, 2016 at 12:31:01PM -0400, Brian Foster wrote: > xfs_wait_buftarg() is invoked on unmount and filesystem freeze to drain and > free the buffer LRU. We have reports of filesystem freeze hangs with the > following call chain: > > ->xfs_wait_buftarg() > ->xfs_log_quiesce() > ->xfs_quiesce_attr() > ->xfs_fs_freeze() > ... > > This hang can reproduced with a long enough running fsstress instance > running in parallel with a tight freeze/unfreeze loop. The cause of the > hang is racing b_hold updates between xfs_wait_buftarg() and > _xfs_buf_lookup(). Specifically, buftarg wait path checks whether a > buffer has a >1 b_hold count to determine whether to skip the buffer. > If b_hold == 1, xfs_wait_buftarg_rele() proceeds to prepare the buffer > for the final removal and ultimately calls xfs_buf_rele() to drop the > LRU reference. So, dumb question: why are we reclaiming the entire buffer cache when the filesystem is being frozen? > The problem is that _xfs_buf_find() can acquire a b_hold reference any > time after xfs_buftarg_wait_rele() has decided it has the only remaining > reference. If this occurs, xfs_wait_buftarg() drops the LRU reference, > but the xfs_buf_rele() instance doesn't actually remove the buffer from > the LRU due to the _xfs_buf_find() hold. Right. > At this point b_hold == 1, yet > the buffer is held via the _xfs_buf_find() codepath and still remains on > the LRU. Both call chains will ultimately call xfs_buf_rele() on a > buffer with b_hold == 1. I don't follow your logic here? We've gone form a count of 2 (i.e. lru + racing lookup) to a count of 1 by dropping the LRU hold count, but now you're saying that both the find and lru still need to call xfs_buf_rele()? I'm clearly missing something here - how do we get to a hold count of 1 here without dropping a reference twice? (I wrote this to analisys is so I'll leave it here for discussion purposes). The code paths are: Freeze process lookup process xfs_buftarg_wait xfs_buftarg_wait_rele() b_hold = 1 lock(b_lock) b_lru_ref = 0 XFS_BSTATE_DISPOSE move to dispose list unlock(b_lock) ..... _xfs_buf_find() atomic_inc(b_hold) //hold count = 2 ..... walks dispose list xfs_buf_rele() atomic_dec(b_hold) //hold count = 1 release == false b_lru_ref set to non-zero ..... xfs_buf_rele() atomic_dec(b_hold) // hold_count = 0 !stale, b_lru_ref > 0 add back to LRU, atomic_inc(b_hold) // hold_count = 1 ~XFS_BSTATE_DISPOSE So where does the hold count become 1 while both still need to call xfs_buf_rele()? > Update xfs_buftarg_wait_rele() to properly synchronize the LRU drain > against buffer lookups. Atomically decrement and lock the perag > associated with the buffer to lock out buffer lookups before > xfs_wait_buftarg() determines whether the LRU holds the final reference. > Open code freeing of the buffer so we can remove it from the perag > rbtree before the perag lock is dropped and guarantee it cannot be > looked up once freeing is imminent. Also update xfs_buftarg_wait_rele() > to drop and reacquire the lru_lock in the correct order to avoid > deadlocks with LRU insertion. While this is a solution, I don't yet understand the reace being solved, so I can't comment on whether it's the best solution or not. It doesn't happen at unmount because there can't be racing lookups occurring at that point in unmount, so it comes back to this question: why are we invalidating the entire LRU on freeze? We really only need to wait for IO to completei during freeze, right? i.e. xfs-wait_buftarg() is doing 2 things: the first is waiting for outstanding IO to complete, and the other is reclaiming the LRU. And for freeze, we don't need to do the second? So if we stop trying to reclaim the buffer cache on freeze, then the whole lookup vs forced reclaim problem will go away? > Second, I believe we still have an independent freeze hang upstream due > to an issue with how we use drain_workqueue(). Specifically, I see the > following warning from kernel/workqueue.c:__queue_work(): > > if (unlikely(wq->flags & __WQ_DRAINING) && > WARN_ON_ONCE(!is_chained_work(wq))) > return; Using flush_workqueue() would solve that problem. We've already guaranteed for unmount that there isn't any new incoming work. i.e: while (percpu_counter_sum(&btp->bt_io_count)) { delay(100); flush_workqueue(btp->bt_mount->m_buf_workqueue); } flush_workqueue(btp->bt_mount->m_buf_workqueue); Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 22 19:13:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0F8A67CA0 for ; Mon, 22 Aug 2016 19:13:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D426030404E for ; Mon, 22 Aug 2016 17:13:00 -0700 (PDT) X-ASG-Debug-ID: 1471911156-0bf57b531211e240001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id HuanugFQnPt2BQOP for ; Mon, 22 Aug 2016 17:12:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhsgAPSTu1d5LDUCEGdsb2JhbABdg0RWfKJbEgaMcIYUhAwkhXMEAgKBaE0CAQEBAQECBgEBAQEBAQEBN0CEXgEBBAEnExwjBQsIAxgJJQ8FJQMHGhOIKQcPviIBAQgCJR6FRYUVgl+BSIV0BZlIhiCIdYF3iA+FVEiLd4N4gmYcgV4qNAGFNoFEAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Aug 2016 09:39:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bbzHI-0003EN-Gx; Tue, 23 Aug 2016 10:09:16 +1000 Date: Tue, 23 Aug 2016 10:09:16 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 Message-ID: <20160823000916.GX19025@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-2-git-send-email-billodo@redhat.com> <20160822014742.GQ19025@dastard> <20160822160207.GC2736@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160822160207.GC2736@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471911156 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4794 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32237 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 22, 2016 at 11:02:07AM -0500, Bill O'Donnell wrote: > On Mon, Aug 22, 2016 at 11:47:42AM +1000, Dave Chinner wrote: > > On Tue, Aug 16, 2016 at 09:16:36AM -0500, Bill O'Donnell wrote: > > > This allows xfs_quota to be used on ext4 for project quota testing > > > in xfstests. > > > > > > This patch was originally submitted by Dave Chinner > > > (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html) > > > > > > Resubmitting with the following change: > > > quota/init.c: correct logic error in loop contained in init_args_command() > > > function (lines 85-91). > > > > What logic error? > > In your original patch, in init_args_command(): > > do { > fs_path = &fs_table[index++]; > - } while ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count); > + if (fs_path->fs_flags & FS_PROJECT_PATH) > + continue; > + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) > + continue; > + } while (index < fs_count); > > The loop should break out, when (fs_path->fs_flags & FS_PROJECT_PATH) is false, > but instead moves onto the next test (and then back to the top). See in the > original while statement, the loop stops when the false condition occurs, that is, > ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count) == False. Hi Bill - now I see *how* you changed the logic changed, but I still don't know *why* it needed to be changed. What problem did you encounter that needed to be solved? The code I wrote had different logic for good reason: the fstable is now populated with non-XFS mount points now, and so we have to walk it differently. In more detail, the fstable is initialised from two place - the mount table for FS_MOUNT_POINT entries, and the projects files for FS_PROJECT_PATH entries. The original init_args_command() code was searching for the first mount point entry in the filesystem table (i.e. a FS_MOUNT_POINT entry) and it did so by skipping over FS_PROJECT_PATH entries. It could do this because it "knew" that the fs_table was only populated with XFS filesystem mount points. Hence once it found an entry that was not a project quota path entry, it could stop knowing it had an XFS mount point to work from. Now we are populating the fstable with all types of filesystem mount points as well as project quota paths. Hence if we are operating only on XFS filesystems we now have to skip over any foreign mount point entries we find in the table. IOWs, the original code I wrote is supposed to skip both project paths and foreign mounts when "-f" is not set. But that said, I've analysed your change sufficiently that I can now see the problem you tried to solve: it doesn't break out of the search loop when it finds the first mount point it can use. This is the "why" of the logic change you made, and if you said that in the commit message, it would have been easy to spot it in the patch. It would have also been much easier to review, because now it's clear that the logic change you've made makes it stop searching at the first FS_MOUNT_POINT entry, regardless of whether it is foreign or not, or whether we are allowing foreign mounts to be used. This is incorrect behaviour, as you can now see from the above explanation of what the code was supposed to be doing. i.e. the search loop should now look something like this: /* lookup the first FS_MOUNT_POINT entry we should use */ do { /* skip project quota entries */ if (fs_path->fs_flags & FS_PROJECT_PATH) continue; /* only consider foreign filesystems if told to */ if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) continue; /* We can use this one */ break; } while (index < fs_count); > My commit message was completely terse, sorry. I'll clarify it in v3. Writing good commit messages is hard and takes practice. If you read the commit message and you can't answer the following questions after reading it, the commit message needs more work: 1 what problem is being solved? 2 why did the problem need to be solved? 3 what unforeseen or tricky issues needed to be addressed while solving the problem? 4 what changed from the last version, and why did it change? (see 1, 2 and 3) Note that there's no "how did the problem get solved?" in that list? That's because the "how?" is the code. Reviewers can read the code change to understand the how - what they can't get from the code is the "why?" and "what changed from last time?" and that's what needs to be in comments and commit messages... Often 1) and 2) can be described in the patch series summary (i.e. patch 0/N) as it doesn't need to be explained in every patch in the series. Cheers, Dave. -- Dave Chinner david@fromorbit.com From billodo@redhat.com Mon Aug 22 19:24:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DA46E7CA0 for ; Mon, 22 Aug 2016 19:24:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9B28B304048 for ; Mon, 22 Aug 2016 17:24:21 -0700 (PDT) X-ASG-Debug-ID: 1471911856-0bf57c55b1fd550001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8ohmoMees9ujH0BL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 17:24:17 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B669A85546; Tue, 23 Aug 2016 00:24:16 +0000 (UTC) Received: from redhat.com (vpn-62-114.rdu2.redhat.com [10.10.62.114]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7N0OEu8006929 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 22 Aug 2016 20:24:16 -0400 Date: Mon, 22 Aug 2016 19:24:13 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 Message-ID: <20160823002413.GA21673@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfs_quota: add capabilities for use on ext4 References: <1471356998-2876-1-git-send-email-billodo@redhat.com> <1471356998-2876-2-git-send-email-billodo@redhat.com> <20160822014742.GQ19025@dastard> <20160822160207.GC2736@redhat.com> <20160823000916.GX19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160823000916.GX19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 23 Aug 2016 00:24:16 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471911857 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5201 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 23, 2016 at 10:09:16AM +1000, Dave Chinner wrote: > On Mon, Aug 22, 2016 at 11:02:07AM -0500, Bill O'Donnell wrote: > > On Mon, Aug 22, 2016 at 11:47:42AM +1000, Dave Chinner wrote: > > > On Tue, Aug 16, 2016 at 09:16:36AM -0500, Bill O'Donnell wrote: > > > > This allows xfs_quota to be used on ext4 for project quota testing > > > > in xfstests. > > > > > > > > This patch was originally submitted by Dave Chinner > > > > (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html) > > > > > > > > Resubmitting with the following change: > > > > quota/init.c: correct logic error in loop contained in init_args_command() > > > > function (lines 85-91). > > > > > > What logic error? > > > > In your original patch, in init_args_command(): > > > > do { > > fs_path = &fs_table[index++]; > > - } while ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count); > > + if (fs_path->fs_flags & FS_PROJECT_PATH) > > + continue; > > + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) > > + continue; > > + } while (index < fs_count); > > > > The loop should break out, when (fs_path->fs_flags & FS_PROJECT_PATH) is false, > > but instead moves onto the next test (and then back to the top). See in the > > original while statement, the loop stops when the false condition occurs, that is, > > ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count) == False. > > Hi Bill - now I see *how* you changed the logic changed, but I still > don't know *why* it needed to be changed. What problem did you > encounter that needed to be solved? The code I wrote had different > logic for good reason: the fstable is now populated with non-XFS > mount points now, and so we have to walk it differently. > > In more detail, the fstable is initialised from two place - the > mount table for FS_MOUNT_POINT entries, and the projects files for > FS_PROJECT_PATH entries. The original init_args_command() code was > searching for the first mount point entry in the filesystem table > (i.e. a FS_MOUNT_POINT entry) and it did so by skipping over > FS_PROJECT_PATH entries. It could do this because it "knew" that the > fs_table was only populated with XFS filesystem mount points. Hence > once it found an entry that was not a project quota path entry, it > could stop knowing it had an XFS mount point to work from. > > Now we are populating the fstable with all types of filesystem mount > points as well as project quota paths. Hence if we are operating > only on XFS filesystems we now have to skip over any foreign mount > point entries we find in the table. IOWs, the original code I wrote > is supposed to skip both project paths and foreign mounts when "-f" > is not set. > > But that said, I've analysed your change sufficiently that I can now > see the problem you tried to solve: it doesn't break out of the > search loop when it finds the first mount point it can use. This is > the "why" of the logic change you made, and if you said that in the > commit message, it would have been easy to spot it in the patch. > > It would have also been much easier to review, because now it's > clear that the logic change you've made makes it stop searching at > the first FS_MOUNT_POINT entry, regardless of whether it is foreign > or not, or whether we are allowing foreign mounts to be used. This > is incorrect behaviour, as you can now see from the above > explanation of what the code was supposed to be doing. > > i.e. the search loop should now look something like this: > > /* lookup the first FS_MOUNT_POINT entry we should use */ > do { > /* skip project quota entries */ > if (fs_path->fs_flags & FS_PROJECT_PATH) > continue; > > /* only consider foreign filesystems if told to */ > if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) > continue; > > /* We can use this one */ > break; > } while (index < fs_count); > > > My commit message was completely terse, sorry. I'll clarify it in v3. > > Writing good commit messages is hard and takes practice. If you > read the commit message and you can't answer the following questions > after reading it, the commit message needs more work: > > 1 what problem is being solved? > 2 why did the problem need to be solved? > 3 what unforeseen or tricky issues needed to be addressed > while solving the problem? > 4 what changed from the last version, and why did it change? > (see 1, 2 and 3) > > Note that there's no "how did the problem get solved?" in that list? > That's because the "how?" is the code. Reviewers can read the code > change to understand the how - what they can't get from the code is > the "why?" and "what changed from last time?" and that's what needs > to be in comments and commit messages... > > Often 1) and 2) can be described in the patch series summary (i.e. > patch 0/N) as it doesn't need to be explained in every patch in the > series. Hi Dave- Thanks for your thorough review. I do appreciate it, and I'll fix up things in v3. Cheers- Bill > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From darrick.wong@oracle.com Mon Aug 22 20:27:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BB5A67CA0 for ; Mon, 22 Aug 2016 20:27:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F0FBAC001 for ; Mon, 22 Aug 2016 18:27:27 -0700 (PDT) X-ASG-Debug-ID: 1471915645-0bf57b5313120720001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id hXkhLGx38LJFDwHX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 22 Aug 2016 18:27:25 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7N1RLZW001024 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 23 Aug 2016 01:27:22 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7N1RLk7016377 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 23 Aug 2016 01:27:21 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7N1RLTd007263; Tue, 23 Aug 2016 01:27:21 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 22 Aug 2016 18:27:20 -0700 Date: Mon, 22 Aug 2016 18:27:19 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: xfs@oss.sgi.com, rpeterso@redhat.com, linux-fsdevel@vger.kernel.org, agruenba@redhat.com Subject: Re: [PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems Message-ID: <20160823012719.GF8268@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems References: <1471816023-28739-1-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471816023-28739-1-git-send-email-hch@lst.de> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1471915645 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2538 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32238 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Sun, Aug 21, 2016 at 11:47:03PM +0200, Christoph Hellwig wrote: > Filesystems like XFS that use extents should not set the > FIEMAP_EXTENT_MERGED flag in the fiemap extent structures. To allow > for both behaviors for the upcoming gfs2 usage split the iomap > type field into type and flags, and only set FIEMAP_EXTENT_MERGED if > the IOMAP_F_MERGED flag is set. The flags field will also come in > handy for future features such as shared extents on reflink-enabled > file systems. You can add an: Acked-by: Darrick J. Wong I'm going to send in a similar patch adding a SHARED flag when I send out the XFS reflink series for review later this week. --D > > Reported-by: Andreas Gruenbacher > Signed-off-by: Christoph Hellwig > --- > fs/iomap.c | 5 ++++- > include/linux/iomap.h | 8 +++++++- > 2 files changed, 11 insertions(+), 2 deletions(-) > > diff --git a/fs/iomap.c b/fs/iomap.c > index 0342254..706270f 100644 > --- a/fs/iomap.c > +++ b/fs/iomap.c > @@ -428,9 +428,12 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi, > break; > } > > + if (iomap->flags & IOMAP_F_MERGED) > + flags |= FIEMAP_EXTENT_MERGED; > + > return fiemap_fill_next_extent(fi, iomap->offset, > iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, > - iomap->length, flags | FIEMAP_EXTENT_MERGED); > + iomap->length, flags); > > } > > diff --git a/include/linux/iomap.h b/include/linux/iomap.h > index 3267df4..3d70ece 100644 > --- a/include/linux/iomap.h > +++ b/include/linux/iomap.h > @@ -19,6 +19,11 @@ struct vm_fault; > #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ > > /* > + * Flags for iomap mappings: > + */ > +#define IOMAP_F_MERGED 0x01 /* contains multiple blocks/extents */ > + > +/* > * Magic value for blkno: > */ > #define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ > @@ -27,7 +32,8 @@ struct iomap { > sector_t blkno; /* 1st sector of mapping, 512b units */ > loff_t offset; /* file offset of mapping, bytes */ > u64 length; /* length of mapping, bytes */ > - int type; /* type of mapping */ > + u16 type; /* type of mapping */ > + u16 flags; /* flags for mapping */ > struct block_device *bdev; /* block device for I/O */ > }; > > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From Zoe29@soldersleeve.com Tue Aug 23 01:23:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C2D4A7CA0 for ; Tue, 23 Aug 2016 01:23:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0C28DAC001 for ; Mon, 22 Aug 2016 23:23:14 -0700 (PDT) X-ASG-Debug-ID: 1471933388-0bf57c55b3109d60001-NocioJ Received: from soldersleeve.com ([180.175.133.186]) by cuda.sgi.com with SMTP id um4Xckl9WTVu6ede for ; Mon, 22 Aug 2016 23:23:09 -0700 (PDT) X-Barracuda-Envelope-From: Zoe29@soldersleeve.com X-Barracuda-Effective-Source-IP: UNKNOWN[180.175.133.186] X-Barracuda-Apparent-Source-IP: 180.175.133.186 Received: from WIN-4450DMVE46C[127.0.0.1] by WIN-4450DMVE46C[127.0.0.1] (SMTPD32); Tue, 23 Aug 2016 14:17:54 +0800 From: "ZoeTang1999@163.com" Subject: Re: Invitation to visit Shrink Terminal and Solder Sleeve booth of Hampool in Automechanika show in FRANKFURT,Germany during 13-17 September, 2016 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Invitation to visit Shrink Terminal and Solder Sleeve booth of Hampool in Automechanika show in FRANKFURT,Germany during 13-17 September, 2016 MIME-Version: 1.0 Sender: Zoe29@soldersleeve.com Reply-To: ZoeTang1999@163.com Date: Tue, 23 Aug 2016 14:17:54 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[180.175.133.186] X-Barracuda-Start-Time: 1471933389 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10257 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.35 X-Barracuda-Spam-Status: No, SCORE=1.35 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_FONT_FACE_BAD, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32243 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160823062314.7FDD91940063@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8+PEhFQUQ+DQo8TUVUQSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNo YXJzZXQ9VVRGLTgiIGh0dHAtZXF1aXY9Y29udGVudC10eXBlPg0KPE1FVEEgbmFtZT1HRU5FUkFU T1IgY29udGVudD0iTVNIVE1MIDguMDAuNzYwMS4xODkzNCI+PC9IRUFEPg0KPEJPRFk+DQo8RElW IA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1 LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyBGT05UOiAxM3B4LzE5cHggJiMzOTtNaWNyb3Nv ZnQgWWFIZWkgVUkmIzM5OzsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5v cm1hbDsgQ09MT1I6IHJnYigwLDUxLDEwMik7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRl eHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0Kc3R5bGU9IkxJTkUtSEVJR0hUOiAxLjU7IEJB Q0tHUk9VTkQtQ09MT1I6IHdpbmRvdzsgRk9OVC1TSVpFOiAxMHB0Ij48L1NQQU4+PC9ESVY+DQo8 RElWIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2Io MjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyBGT05UOiAxM3B4LzE5cHggJiMzOTtNaWNy b3NvZnQgWWFIZWkgVUkmIzM5OzsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6 IG5vcm1hbDsgQ09MT1I6IHJnYigwLDUxLDEwMik7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0 LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGp1c3RpZnk7 IE1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PEZPTlQgZmFjZT3lvq7ova/pm4Xpu5E+RGVh ciANCk1yLi9NcnMuLDwvRk9OVD48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeTsg TUFSR0lOOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48Rk9OVCANCmZhY2U95b6u6L2v6ZuF6buRPiZu YnNwOzwvRk9OVD48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeTsgTUFSR0lOOiAw cHQiIGNsYXNzPU1zb05vcm1hbD48Rk9OVCBmYWNlPeW+rui9r+mbhem7kT5Ib3cgDQphcmUgeW91 PyBXaXNoIGV2ZXJ5dGhpbmcgaXMgZ29pbmcgd2VsbCB0aGVyZSB3aXRoIHlvdS48bzpwPjwvbzpw PjwvRk9OVD48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeTsgTUFSR0lOOiAwcHQi IGNsYXNzPU1zb05vcm1hbD48Rk9OVCANCmZhY2U95b6u6L2v6ZuF6buRPiZuYnNwOzxvOnA+PC9v OnA+PC9GT05UPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5OyBNQVJHSU46IDBw dCIgY2xhc3M9TXNvTm9ybWFsPjxGT05UIGZhY2U95b6u6L2v6ZuF6buRPkFzIA0KcHJvZmVzc2lv bmFsIG1hbnVmYWN0dXJlciBhbmQgZXhwb3J0ZXIgZm9yPEI+Jm5ic3A7PC9CPjxGT05UIA0KY29s b3I9I2ZmMDBmZj48Qj5oZWF0IHNocmluayB0ZXJtaW5hbCwmbmJzcDtzb2xkZXIgDQpzbGVldmU8 L0I+Jm5ic3A7PC9GT05UPmFuZDxGT05UIGNvbG9yPSNmZjAwZmY+Jm5ic3A7PEI+c2hyaW5rIA0K dHViZTwvQj48L0ZPTlQ+Jm5ic3A7ZXRjJm5ic3A7aW4gQ2hpbmEsJm5ic3A7d2Ugd2lsbCZuYnNw OzwvRk9OVD48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeTsgTUFSR0lOOiAwcHQi IGNsYXNzPU1zb05vcm1hbD48Rk9OVCANCmZhY2U95b6u6L2v6ZuF6buRPmF0dGVuZCZuYnNwOzxG T05UIGNvbG9yPSNmZjAwZmY+PEI+QXV0b21lY2hhbmlrYSBzaG93IGluIEZSQU5LRlVSVCANCiwm bmJzcDtHZXJtYW55Jm5ic3A7ZHVyaW5nJm5ic3A7MTMmbmJzcDstLSZuYnNwOzE3Jm5ic3A7U2Vw dGVtYmVyLCANCjIwMTY8L0I+PC9GT05UPiwmbmJzcDt3ZSB3b3VsZCBsaWtlIHRvIGludml0ZSB5 b3UgdG8mbmJzcDs8L0ZPTlQ+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGp1c3RpZnk7IE1B UkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PEZPTlQgDQpmYWNlPeW+rui9r+mbhem7kT52aXNp dCBvdXIgYm9vdGgmbmJzcDs8Rk9OVCBjb2xvcj0jZmYwMGZmPjxCPkgxMSZuYnNwO2luIEhhbGwg DQpOby4mbmJzcDszLjE8L0I+PC9GT05UPiZuYnNwOzxvOnA+PC9vOnA+PC9GT05UPjwvUD4NCjxQ IHN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5OyBNQVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFs PjxvOnA+PEZPTlQgDQpmYWNlPeW+rui9r+mbhem7kT4mbmJzcDs8L0ZPTlQ+PC9vOnA+PC9QPg0K PFAgc3R5bGU9IlRFWFQtQUxJR046IGp1c3RpZnk7IE1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3Jt YWw+PEZPTlQgZmFjZT3lvq7ova/pm4Xpu5E+TWF5IA0KSSBhc2sgd2hldGhlciB5b3Ugd2lsbCBj b21lIHRvIHZpc2l0Jm5ic3A7b3VyIGJvb3RoJm5ic3A7c28mbmJzcDt0aGF0IHdlIGNhbiANCm1h a2UgYSBmaXhlZCBhcHBvaW50bWVudD8mbmJzcDtJZiB5b3UgY29tZSB0byB2aXNpdCB1cywgcGxl YXNlJm5ic3A7PC9GT05UPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5OyBNQVJH SU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxGT05UIGZhY2U95b6u6L2v6ZuF6buRPmZlZWwgDQpm cmVlIHRvIGNhbGwgdXMgLTg2LTE4MCAxNjQwIDc2NTAgLyAxMzkgMTg0MyAyMjIxLiAmbmJzcDs8 bzpwPjwvbzpwPjwvRk9OVD48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeTsgTUFS R0lOOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48bzpwPjxGT05UIA0KZmFjZT3lvq7ova/pm4Xpu5E+ Jm5ic3A7PC9GT05UPjwvbzpwPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5OyBN QVJHSU46IDBwdCIgY2xhc3M9TXNvTm9ybWFsPjxGT05UIGZhY2U95b6u6L2v6ZuF6buRPldlIA0K aW52aXRlIHlvdSB0byB2aXNpdCB1cyBvbiBvdXIgYm9vdGgmbmJzcDs8Rk9OVCBjb2xvcj0jZmYw MGZmPjxCPkgxMSZuYnNwO2luIEhhbGwgDQpOby4mbmJzcDszLjE8L0I+Jm5ic3A7PC9GT05UPmR1 cmluZyZuYnNwOzEzLTE3IFNlcHRlbWJlciwgMjAxNjo8L0ZPTlQ+PC9QPg0KPFAgc3R5bGU9IlRF WFQtQUxJR046IGp1c3RpZnk7IE1BUkdJTjogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PElNRyBib3Jk ZXI9MCANCmhzcGFjZT0wIGFsdD0iIiBhbGlnbj1iYXNlbGluZSANCnNyYz0iY2lkOmltZzAuanBn Ij48L1A+DQo8UCANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xP UjogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgTUFSR0lOOiAwY20gMGNtIDBw dDsgRk9OVDogMTJwdC8xOHB0ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTssIHNlcmlmOyBXSElU RS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCww KTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCIgDQpj bGFzcz1Nc29Ob3JtYWw+PEZPTlQgZmFjZT3lvq7ova/pm4Xpu5E+PEZPTlQgc2l6ZT0xPjxTUEFO IA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IG5hdnk7IEZP TlQtU0laRTogMTMuNXB0Ij48L1NQQU4+PC9GT05UPjwvRk9OVD48L1A+DQo8UCANCnN0eWxlPSJU RVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsg VEVYVC1JTkRFTlQ6IDBweDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgRk9OVDogMTJwdC8xOHB0ICYj Mzk7VGltZXMgTmV3IFJvbWFuJiMzOTssIHNlcmlmOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRU RVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7 IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xPUjogbmF2eTsgRk9O VC1TSVpFOiAxMy41cHQiPjxGT05UIA0Kc2l6ZT0xIGZhY2U95b6u6L2v6ZuF6buRPkJlc3QgcmVn YXJkcyw8L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25l OyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUlOREVOVDogMHB4OyBN QVJHSU46IDBjbSAwY20gMHB0OyBGT05UOiAxMnB0LzE4cHQgJiMzOTtUaW1lcyBOZXcgUm9tYW4m IzM5Oywgc2VyaWY7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7 IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9r ZS13aWR0aDogMHB4IiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogQXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBuYXZ5OyBGT05ULVNJWkU6IDEzLjVwdCI+PC9T UEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6 IG5hdnk7IEZPTlQtU0laRTogMTMuNXB0Ij48Rk9OVCANCnNpemU9MSBmYWNlPeW+rui9r+mbhem7 kT5ab2UgVGFuZzwvRk9OVD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06 IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAw cHg7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEZPTlQ6IDEycHQvMThwdCAmIzM5O1RpbWVzIE5ldyBS b21hbiYjMzk7LCBzZXJpZjsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5v cm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQt c3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IG5hdnk7IEZPTlQtU0laRTogMTMuNXB0 Ij48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBD T0xPUjogbmF2eTsgRk9OVC1TSVpFOiAxMy41cHQiPjwvU1BBTj48U1BBTiANCnN0eWxlPSJDT0xP Ujogc2lsdmVyIj48bzpwPjxGT05UIHNpemU9MSBmYWNlPeW+rui9r+mbhem7kT48SU1HIGJvcmRl cj0wIGhzcGFjZT0wIGFsdD0iIiANCmFsaWduPWJhc2VsaW5lIA0Kc3JjPSJjaWQ6aW1nMS5qcGci PjwvRk9OVD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjoganVzdGlm eTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1 NSk7IFRFWFQtSU5ERU5UOiAwcHg7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEZPTlQ6IDEycHQvMTQu MjVwdCAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7LCBzZXJpZjsgV0hJVEUtU1BBQ0U6IG5vcm1h bDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lO RzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFs PjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBDYWxpYnJpLCBzYW5zLXNlcmlmOyBDT0xPUjog cmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMC41cHQiPjxvOnA+PEZPTlQgDQpzaXplPTEgZmFj ZT3lvq7ova/pm4Xpu5E+PC9GT05UPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhU LUFMSUdOOiBqdXN0aWZ5OyBURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjog cmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1JTkRFTlQ6IDBweDsgTUFSR0lOOiAwY20gMGNtIDBwdDsg Rk9OVDogMTJwdC8xNC4yNXB0ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTssIHNlcmlmOyBXSElU RS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCww KTsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCIgDQpj bGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmksIHNhbnMt c2VyaWY7IENPTE9SOiByZ2IoMCw1MSwxMDIpOyBGT05ULVNJWkU6IDEwLjVwdCI+PG86cD48Rk9O VCANCnNpemU9MSBmYWNlPeW+rui9r+mbhem7kT48L0ZPTlQ+PC9vOnA+PC9TUEFOPjwvUD4NCjxQ IA0Kc3R5bGU9IlRFWFQtQUxJR046IGp1c3RpZnk7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNL R1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgRk9O VC1TVFlMRTogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyBNQVJHSU46IDBjbSAwY20gMHB0OyBG T05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5Oywgc2VyaWY7IFdISVRFLVNQQUNF OiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05U LVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Vi a2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFsPjxGT05UIGZhY2U9 5b6u6L2v6ZuF6buRPjxGT05UIHNpemU9MT48Qj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog QXJpYWwsIHNhbnMtc2VyaWY7IENPTE9SOiBuYXZ5OyBGT05ULVNJWkU6IDEwcHQiPkFkZDogRmxv b3IgDQo0LCZuYnNwOyBCdWlsZGluZyAxMiwgTGFuZSAxNzU1IFdlbmJlaSBSZC4sIE5hbnhpYW5n IFRvd24sIEppYWRpbmcgRGlzdHJpY3QsIA0KU2hhbmdoYWksIENoaW5hJm5ic3A7Jm5ic3A7IFpp cDogMjAxODAyPC9TUEFOPjwvQj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2FsaWJyaSwg c2Fucy1zZXJpZjsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZPTlQtU0laRTogMTAuNXB0Ij48bzpw PjwvbzpwPjwvU1BBTj48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046 IGp1c3RpZnk7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1 LDI1NSwyNTUpOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgRk9OVC1TVFlMRTogbm9ybWFsOyBURVhU LUlOREVOVDogMHB4OyBNQVJHSU46IDBjbSAwY20gMHB0OyBGT05ULUZBTUlMWTogJiMzOTtUaW1l cyBOZXcgUm9tYW4mIzM5Oywgc2VyaWY7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFD SU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJ R0hUOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRo OiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFsPjxGT05UIGZhY2U95b6u6L2v6ZuF6buRPjxGT05UIHNp emU9MT48Qj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWY7IENP TE9SOiBuYXZ5OyBGT05ULVNJWkU6IDEwcHQiPldlYnNpdGU6Jm5ic3A7PC9TUEFOPjwvQj48U1BB TiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2FsaWJyaSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigw LDUxLDEwMik7IEZPTlQtU0laRTogMTAuNXB0Ij48QSANCnN0eWxlPSJDT0xPUjogcHVycGxlOyBU RVhULURFQ09SQVRJT046IHVuZGVybGluZSIgDQpocmVmPSJodHRwOi8vd3d3LmhhbXBvb2wuY29t LyI+PFNQQU4gY2xhc3M9MTU+PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBz YW5zLXNlcmlmOyBGT05ULVNJWkU6IDEwcHQiPnd3dy5oYW1wb29sLmNvbTwvU1BBTj48L0I+PC9T UEFOPjwvQT48L1NQQU4+PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5z LXNlcmlmOyBDT0xPUjogbmF2eTsgRk9OVC1TSVpFOiAxMHB0Ij4mbmJzcDsgDQombmJzcDsmbmJz cDs8L1NQQU4+PC9CPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBDYWxpYnJpLCBzYW5zLXNl cmlmOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMC41cHQiPjxvOnA+PC9vOnA+ PC9TUEFOPjwvRk9OVD48L0ZPTlQ+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjoganVzdGlm eTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1 NSk7IEZPTlQtVkFSSUFOVDogbm9ybWFsOyBGT05ULVNUWUxFOiBub3JtYWw7IFRFWFQtSU5ERU5U OiAwcHg7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBS b21hbiYjMzk7LCBzZXJpZjsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5v cm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5v cm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCIg DQpjbGFzcz1Nc29Ob3JtYWw+PEZPTlQgZmFjZT3lvq7ova/pm4Xpu5E+PEZPTlQgc2l6ZT0xPjxC PjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IG5h dnk7IEZPTlQtU0laRTogMTBwdCI+RS1tYWlsOiZuYnNwOzxTUEFOIA0Kc3R5bGU9IkJBQ0tHUk9V TkQtQ09MT1I6IHdoaXRlIj48QSANCnN0eWxlPSJDT0xPUjogcHVycGxlOyBURVhULURFQ09SQVRJ T046IHVuZGVybGluZSIgDQpocmVmPSJtYWlsdG86c2FsZXMzQGhhbXBvb2wuY29tIj5zYWxlczNA aGFtcG9vbC5jb208L0E+LCZuYnNwOzxBIA0Kc3R5bGU9IkNPTE9SOiBwdXJwbGU7IFRFWFQtREVD T1JBVElPTjogdW5kZXJsaW5lIiANCmhyZWY9Im1haWx0bzpzYWxlczhAaGFtcG9vbC5jb20iPnNh bGVzOEBoYW1wb29sLmNvbTwvQT48L1NQQU4+PC9TUEFOPjwvQj48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTogQ2FsaWJyaSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZPTlQt U0laRTogMTAuNXB0Ij48bzpwPjwvbzpwPjwvU1BBTj48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQIA0K c3R5bGU9IlRFWFQtQUxJR046IGp1c3RpZnk7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JP VU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgRk9OVC1T VFlMRTogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyBNQVJHSU46IDBjbSAwY20gMHB0OyBGT05U LUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5Oywgc2VyaWY7IFdISVRFLVNQQUNFOiBu b3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJ WkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0 LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFsPjxGT05UIGZhY2U95b6u 6L2v6ZuF6buRPjxGT05UIHNpemU9MT48Qj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJp YWwsIHNhbnMtc2VyaWY7IENPTE9SOiBuYXZ5OyBGT05ULVNJWkU6IDEwcHQiPkNlbGw6IA0KLTg2 LTE4NzIxNjM1ODUxLCZuYnNwOzxTUEFOIA0Kc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6IHdoaXRl Ij4tODYtMTUwMDg0Mzg3NTImbmJzcDsoV2hhdHNhcHAvVmliZXIpJm5ic3A7Jm5ic3A7PC9TUEFO PjwvU1BBTj48L0I+PC9GT05UPjwvRk9OVD48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBq dXN0aWZ5OyBURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwy NTUsMjU1KTsgRk9OVC1WQVJJQU5UOiBub3JtYWw7IEZPTlQtU1RZTEU6IG5vcm1hbDsgVEVYVC1J TkRFTlQ6IDBweDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMg TmV3IFJvbWFuJiMzOTssIHNlcmlmOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdI VDogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDog MHB4IiANCmNsYXNzPU1zb05vcm1hbD48Rk9OVCBmYWNlPeW+rui9r+mbhem7kT48Rk9OVCBzaXpl PTE+PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xP UjogbmF2eTsgRk9OVC1TSVpFOiAxMHB0Ij48U1BBTiANCnN0eWxlPSJCQUNLR1JPVU5ELUNPTE9S OiB3aGl0ZSI+VGVsbDotODYtMjEtNjk5Mjc2NTEgDQpGYXg6LTg2LTIxLTY5OTI3NjUyPC9TUEFO PjwvU1BBTj48L0I+PC9GT05UPjwvRk9OVD48L1A+PC9ESVY+PC9CT0RZPjwvSFRNTD4NCg0K From Sales.33@fashion-business.com Tue Aug 23 02:53:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C92E97CA0 for ; Tue, 23 Aug 2016 02:53:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D9E9304048 for ; Tue, 23 Aug 2016 00:53:50 -0700 (PDT) X-ASG-Debug-ID: 1471938822-0bf57c55b110e310001-NocioJ Received: from fashion-business.com ([14.218.95.82]) by cuda.sgi.com with SMTP id PNXFDS1FLBDfw6zo for ; Tue, 23 Aug 2016 00:53:43 -0700 (PDT) X-Barracuda-Envelope-From: Sales.33@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.95.82] X-Barracuda-Apparent-Source-IP: 14.218.95.82 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Tue, 23 Aug 2016 15:40:39 +0800 From: "angelbervogue@sina.com" Subject: Luxury bag for your checking To: xfs@oss.sgi.com X-ASG-Orig-Subj: Luxury bag for your checking MIME-Version: 1.0 Sender: Sales.33@fashion-business.com Reply-To: angelbervogue@sina.com Date: Tue, 23 Aug 2016 15:40:39 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.95.82] X-Barracuda-Start-Time: 1471938822 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12088 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32244 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160823075350.01F151940065@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTog5a6L5L2TOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFs OyBtc28taGFuc2ktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJp YWwiPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsg TElORS1IRUlHSFQ6IDE3LjQ1cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURE SU5HLUxFRlQ6IDBwdDsgUEFERElORy1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1 NSwyNTUpOyBQQURESU5HLVRPUDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiAN CmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9O VC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlMWTogVmVyZGFuYTsgQkFDS0dST1VORDogcmdiKDI1 NSwyNTUsMjU1KTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7IEZP TlQtU0laRTogMTAuNXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5p bmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+SGkgDQpteSBmcmll bmQsPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0laRTog MTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+ DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBQQURESU5HLUJPVFRPTTogMHB0OyBMSU5F LUhFSUdIVDogMTcuNDVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFBBRERJTkct TEVGVDogMHB0OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1 NSk7IFBBRERJTkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xh c3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVNU WUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiDlrovkvZM7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1 LDI1NSk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6 IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5Ozsg bXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlh bDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0 eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OyI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1B TElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7IFRF WFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElORy1S SUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDogMHB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiAN CnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZB TUlMWTogVmVyZGFuYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgTEVUVEVSLVNQQUNJ Tkc6IDBwdDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7IEZPTlQtU0laRTogMTAuNXB0OyBGT05ULVdF SUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGlu ZzogcmdiKDI1NSwyNTUsMjU1KSI+V2UgDQphcmUgYSBtYW51ZmFjdHVyZSBzdXBwbGllciBvZiBi YWdzLCBpbmNsdWRlIGxhZGllcyBoYW5kYmFnLCBtZW4gYnJpZWZjYXNlLCB0b3RlIA0KYmFncyBh bmQgd2FsbGV0IGV0Yy4gQW55IGlucXVpcnkgb3IgaXRlbXMgbmVlZGVkPzwvU1BBTj48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OyI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVY VC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7 IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElO Ry1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDog MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BB TiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05U LUZBTUlMWTog5a6L5L2TOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBMRVRURVItU1BB Q0lORzogMHB0OyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdI VDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1mb250LWZh bWlseTogQXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZvbnQt ZmFtaWx5OiBBcmlhbDsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiBy Z2IoMjU1LDI1NSwyNTUpIj4mbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IFRhaG9tYTsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTsiPjxv OnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IFBBRERJ TkctQk9UVE9NOiAwcHQ7IExJTkUtSEVJR0hUOiAxNy40NXB0OyBURVhULUlOREVOVDogMHB0OyBN QVJHSU46IDBwdDsgUEFERElORy1MRUZUOiAwcHQ7IFBBRERJTkctUklHSFQ6IDBwdDsgQkFDS0dS T1VORDogcmdiKDI1NSwyNTUsMjU1KTsgUEFERElORy1UT1A6IDBwdDsgbXNvLXBhZ2luYXRpb246 IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iVEVYVC1UUkFO U0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IFZlcmRhbmE7IEJB Q0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiBy Z2IoNTEsNTEsNTEpOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1 NSkiPk5vIA0KaGFybSB0byB0YWtlIHlvdSA1IHNlY29uZHMgdG8gZ2V0IGJhY2sgdXMgd2l0aCBh bnkgcXVlc3Rpb25zIGF0IGZpcnN0IGNvbnRhY3QuIA0KVGhlIGNhdGFsb2cgY291bGQgYmUgc2Vu dCB0byB5b3UgaWYgeW91IHdhbnQuPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBU YWhvbWE7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7Ij48bzpw PjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBQQURESU5H LUJPVFRPTTogMHB0OyBMSU5FLUhFSUdIVDogMTcuNDVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFS R0lOOiAwcHQ7IFBBRERJTkctTEVGVDogMHB0OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJBQ0tHUk9V TkQ6IHJnYigyNTUsMjU1LDI1NSk7IFBBRERJTkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3 aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IlRFWFQtVFJBTlNG T1JNOiBub25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiDlrovkvZM7IEJBQ0tH Uk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2Io MCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWhhbnNp LWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPiZuYnNw OzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFob21hOyBGT05ULVNJWkU6IDEx cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OyI+PG86cD48L286cD48L1NQQU4+PC9QPg0K PFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1I RUlHSFQ6IDE3LjQ1cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxF RlQ6IDBwdDsgUEFERElORy1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUp OyBQQURESU5HLVRPUDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNz PU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlM RTogbm9ybWFsOyBGT05ULUZBTUlMWTogVmVyZGFuYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUs MjU1KTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7IEZPTlQtU0la RTogMTAuNXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAu MDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+TG9vayANCmZvcndhcmQgdG8g eW91IHByb21wdCByZXBseS48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9t YTsgRk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTsiPjxvOnA+PC9v OnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IFBBRERJTkctQk9U VE9NOiAwcHQ7IExJTkUtSEVJR0hUOiAxNy40NXB0OyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46 IDBwdDsgUEFERElORy1MRUZUOiAwcHQ7IFBBRERJTkctUklHSFQ6IDBwdDsgQkFDS0dST1VORDog cmdiKDI1NSwyNTUsMjU1KTsgUEFERElORy1UT1A6IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93 LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06 IG5vbmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgQkFDS0dST1VO RDogcmdiKDI1NSwyNTUsMjU1KTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IEFyaWFsOyBtc28taGFuc2ktZm9u dC1mYW1pbHk6IEFyaWFsOyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+Jm5ic3A7PC9T UEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0laRTogMTFwdDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCAN CnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBQQURESU5HLUJPVFRPTTogMHB0OyBMSU5FLUhFSUdI VDogMTcuNDVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFBBRERJTkctTEVGVDog MHB0OyBQQURESU5HLVJJR0hUOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFBB RERJTkctVE9QOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBu b3JtYWw7IEZPTlQtRkFNSUxZOiBWZXJkYW5hOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUp OyBMRVRURVItU1BBQ0lORzogMHB0OyBDT0xPUjogcmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAx MC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5Ozsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAw cHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5IYXZlIA0KYSBuaWNlIGRheSE8L1NQ QU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsgRk9OVC1TSVpFOiAxMXB0OyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTsiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0K c3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IFBBRERJTkctQk9UVE9NOiAwcHQ7IExJTkUtSEVJR0hU OiAxNy40NXB0OyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46IDBwdDsgUEFERElORy1MRUZUOiAw cHQ7IFBBRERJTkctUklHSFQ6IDBwdDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgUEFE RElORy1UT1A6IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29O b3JtYWw+PFNQQU4gDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtU1RZTEU6IG5v cm1hbDsgRk9OVC1GQU1JTFk6IFZlcmRhbmE7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7 IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoNTEsNTEsNTEpOyBGT05ULVNJWkU6IDEw LjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0 eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlM WTogVmVyZGFuYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgTEVUVEVSLVNQQUNJTkc6 IDBwdDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7IEZPTlQtU0laRTogMTAuNXB0OyBGT05ULVdFSUdI VDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzog cmdiKDI1NSwyNTUsMjU1KSI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVY VC1BTElHTjogbGVmdDsgUEFERElORy1CT1RUT006IDBwdDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7 IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJTjogMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElO Ry1SSUdIVDogMHB0OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDog MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BB TiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05U LUZBTUlMWTogVmVyZGFuYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgTEVUVEVSLVNQ QUNJTkc6IDBwdDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7IEZPTlQtU0laRTogMTAuNXB0OyBGT05U LVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+QmVzdCANClJlZ2FyZHMhPC9TUEFOPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtRkFNSUxZOiBUYWhvbWE7IEZPTlQtU0laRTogMTFwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7Ij48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBQQURESU5HLUJPVFRPTTogMHB0OyBMSU5FLUhFSUdIVDogMTcuNDVwdDsgVEVY VC1JTkRFTlQ6IDBwdDsgTUFSR0lOOiAwcHQ7IFBBRERJTkctTEVGVDogMHB0OyBQQURESU5HLVJJ R0hUOiAwcHQ7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFBBRERJTkctVE9QOiAwcHQ7 IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0K c3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFN SUxZOiDlrovkvZM7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IExFVFRFUi1TUEFDSU5H OiAwcHQ7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBu b3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5 OiBBcmlhbDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1p bHk6IEFyaWFsOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigy NTUsMjU1LDI1NSkiPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogVGFo b21hOyBGT05ULVNJWkU6IDExcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OyI+PG86cD48 L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgUEFERElORy1C T1RUT006IDBwdDsgTElORS1IRUlHSFQ6IDE3LjQ1cHQ7IFRFWFQtSU5ERU5UOiAwcHQ7IE1BUkdJ TjogMHB0OyBQQURESU5HLUxFRlQ6IDBwdDsgUEFERElORy1SSUdIVDogMHB0OyBCQUNLR1JPVU5E OiByZ2IoMjU1LDI1NSwyNTUpOyBQQURESU5HLVRPUDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lk b3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJURVhULVRSQU5TRk9S TTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlMWTogVmVyZGFuYTsgQkFDS0dS T1VORDogcmdiKDI1NSwyNTUsMjU1KTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgQ09MT1I6IHJnYig1 MSw1MSw1MSk7IEZPTlQtU0laRTogMTAuNXB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1z by1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+ QW5nZWxvIA0KSHVhbmc8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IFRhaG9tYTsg Rk9OVC1TSVpFOiAxMXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTsiPjxvOnA+PC9vOnA+ PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IFBBRERJTkctQk9UVE9N OiAwcHQ7IExJTkUtSEVJR0hUOiAxNy40NXB0OyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46IDBw dDsgUEFERElORy1MRUZUOiAwcHQ7IFBBRERJTkctUklHSFQ6IDBwdDsgQkFDS0dST1VORDogcmdi KDI1NSwyNTUsMjU1KTsgUEFERElORy1UT1A6IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5v bmU7IEZPTlQtU1RZTEU6IG5vcm1hbDsgRk9OVC1GQU1JTFk6IFZlcmRhbmE7IEJBQ0tHUk9VTkQ6 IHJnYigyNTUsMjU1LDI1NSk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IENPTE9SOiByZ2IoNTEsNTEs NTEpOyBGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSk7IG1zby1o aWdobGlnaHQ6IHJnYigyNTUsMjU1LDApIj5Ta3lwZTogDQpkYXZpZTE4MTgxODwvU1BBTj48U1BB TiANCnN0eWxlPSJURVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05U LUZBTUlMWTogVmVyZGFuYTsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgTEVUVEVSLVNQ QUNJTkc6IDBwdDsgQ09MT1I6IHJnYig1MSw1MSw1MSk7IEZPTlQtU0laRTogMTAuNXB0OyBGT05U LVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IlRFWFQt VFJBTlNGT1JNOiBub25lOyBGT05ULVNUWUxFOiBub3JtYWw7IEZPTlQtRkFNSUxZOiBWZXJkYW5h OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBMRVRURVItU1BBQ0lORzogMHB0OyBDT0xP UjogcmdiKDUxLDUxLDUxKTsgRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7 IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWu i+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1 NSwyNTUpIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBs ZWZ0OyBQQURESU5HLUJPVFRPTTogMHB0OyBURVhULUlOREVOVDogMHB0OyBNQVJHSU46IDBwdDsg UEFERElORy1MRUZUOiAwcHQ7IExBWU9VVC1HUklELU1PREU6IGNoYXI7IFBBRERJTkctUklHSFQ6 IDBwdDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1BVVRPU1BBQ0U6IGlkZW9n cmFwaC1udW1lcmljOyBQQURESU5HLVRPUDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuOyBtc28tbGF5b3V0LWdyaWQtYWxpZ246IG5vbmU7IG1zby1wYXJhLW1hcmdpbi1yaWdodDog MC4wMDAwZ2Q7IG1zby1wYXJhLW1hcmdpbi1sZWZ0OiAwLjAwMDBnZDsgbXNvLWNoYXItaW5kZW50 LWNvdW50OiAwLjAwMDAiIA0KY2xhc3M9cD48Qj48U1BBTiANCnN0eWxlPSJURVhULVRSQU5TRk9S TTogbm9uZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBGT05ULUZBTUlMWTog5a6L5L2TOyBMRVRURVIt U1BBQ0lORzogMHB0OyBDT0xPUjogcmdiKDI1NSwwLDApOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQt V0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1hc2NpaS1mb250 LWZhbWlseTogQXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZv bnQtZmFtaWx5OiBBcmlhbDsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxvOnA+Jm5ic3A7 PC9vOnA+PC9TUEFOPjwvQj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiANCmNs YXNzPU1zb05vcm1hbD48IS0tRW5kRnJhZ21lbnQtLT48L1NQQU4+PC9QPjwvQk9EWT48L0hUTUw+ DQoNCg== From bfoster@redhat.com Tue Aug 23 07:54:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9FDB47CA0 for ; Tue, 23 Aug 2016 07:54:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 70839304039 for ; Tue, 23 Aug 2016 05:54:52 -0700 (PDT) X-ASG-Debug-ID: 1471956890-0bf57c55b411eab0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hLYFB7AmqkSEY5Br (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 05:54:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 590D5C056793; Tue, 23 Aug 2016 12:54:50 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-33.bos.redhat.com [10.18.41.33]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NCsnhI010727; Tue, 23 Aug 2016 08:54:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B5F58121479; Tue, 23 Aug 2016 08:54:48 -0400 (EDT) Date: Tue, 23 Aug 2016 08:54:48 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: close xfs_wait_buftarg() race with buffer lookups Message-ID: <20160823125446.GA24184@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: close xfs_wait_buftarg() race with buffer lookups References: <1471883461-27407-1-git-send-email-bfoster@redhat.com> <20160822232410.GW19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160822232410.GW19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 23 Aug 2016 12:54:50 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471956890 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7396 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 23, 2016 at 09:24:10AM +1000, Dave Chinner wrote: > On Mon, Aug 22, 2016 at 12:31:01PM -0400, Brian Foster wrote: > > xfs_wait_buftarg() is invoked on unmount and filesystem freeze to drain and > > free the buffer LRU. We have reports of filesystem freeze hangs with the > > following call chain: > > > > ->xfs_wait_buftarg() > > ->xfs_log_quiesce() > > ->xfs_quiesce_attr() > > ->xfs_fs_freeze() > > ... > > > > This hang can reproduced with a long enough running fsstress instance > > running in parallel with a tight freeze/unfreeze loop. The cause of the > > hang is racing b_hold updates between xfs_wait_buftarg() and > > _xfs_buf_lookup(). Specifically, buftarg wait path checks whether a > > buffer has a >1 b_hold count to determine whether to skip the buffer. > > If b_hold == 1, xfs_wait_buftarg_rele() proceeds to prepare the buffer > > for the final removal and ultimately calls xfs_buf_rele() to drop the > > LRU reference. > > So, dumb question: why are we reclaiming the entire buffer cache > when the filesystem is being frozen? > Not sure. I noticed that briefly, but I guess was too preoccupied with figuring out what was happening to step back and think about it. It looks like this changed in commit c75921a7 ("xfs: xfs_quiesce_attr() should quiesce the log like unmount"), which may or may not have been motivated by fs freeze. AFAICT, it just looks like a semi-lazy reuse of the unmount mechanism. E.g., xfs_fs_freeze() was calling xfs_quiesce_attr() at the time and that commit altered the latter to reuse xfs_log_quiesce(), which happens to call xfs_wait_buftarg(). > > The problem is that _xfs_buf_find() can acquire a b_hold reference any > > time after xfs_buftarg_wait_rele() has decided it has the only remaining > > reference. If this occurs, xfs_wait_buftarg() drops the LRU reference, > > but the xfs_buf_rele() instance doesn't actually remove the buffer from > > the LRU due to the _xfs_buf_find() hold. > > Right. > > > > At this point b_hold == 1, yet > > the buffer is held via the _xfs_buf_find() codepath and still remains on > > the LRU. Both call chains will ultimately call xfs_buf_rele() on a > > buffer with b_hold == 1. > > I don't follow your logic here? We've gone form a count of 2 (i.e. > lru + racing lookup) to a count of 1 by dropping the LRU hold count, > but now you're saying that both the find and lru still need to call > xfs_buf_rele()? I'm clearly missing something here - how do we get > to a hold count of 1 here without dropping a reference twice? > Sorry if the explanation is unclear. I probably relied too much on the downstream code to describe the problem as this is more difficult to reproduce upstream. Downstream is also slightly different in that it predates the list_lru based mechanism. > (I wrote this to analisys is so I'll leave it here for discussion > purposes). > > The code paths are: > > Freeze process lookup process > > xfs_buftarg_wait > > xfs_buftarg_wait_rele() > b_hold = 1 > lock(b_lock) > b_lru_ref = 0 > XFS_BSTATE_DISPOSE > move to dispose list > unlock(b_lock) > ..... > _xfs_buf_find() > > atomic_inc(b_hold) //hold count = 2 > ..... > walks dispose list > xfs_buf_rele() > atomic_dec(b_hold) //hold count = 1 > release == false > > > b_lru_ref set to non-zero > ..... > xfs_buf_rele() > atomic_dec(b_hold) // hold_count = 0 > !stale, b_lru_ref > 0 > add back to LRU, > atomic_inc(b_hold) // hold_count = 1 > ~XFS_BSTATE_DISPOSE > > > So where does the hold count become 1 while both still need to call > xfs_buf_rele()? > Hmm, it's possible the hang due to this race is a downstream only problem and the upstream hang is purely the workqueue issue. Looking at the upstream code again, the part I missed the first time around is that the buffer is dropped from the lru by xfs_wait_buftarg() rather than xfs_buf_rele(). The fact that doesn't happen in the downstream code is sort of the problem. E.g., in downstream, xfs_wait_buftarg() calls xfs_buf_rele() which never removes the item from the LRU due to the elevated hold count, so effectively it ends up calling xfs_buf_rele() again and again until the buffer is removed from the LRU (and thus freed). The upstream wait_buftarg() checks b_hold, migrates to the dispose list, removes from the dispose list, then invokes xfs_buf_rele() and never sees the buffer again. The lru_list management here should ensure that xfs_buf_rele() is called only once for the LRU afaict... (though I'm still not sure passing through xfs_wait_buftarg() with a buffer being held by another context is quite correct, even if the race is more of a landmine than anything). I thought I had confirmed/reproduced this upstream, but it's possible that occurred before I recognized the workqueue hang was independent. Let me step back and try to reproduce this with the hack to work around the workqueue issue and see what happens. If it reoccurs, I'll try to put together more applicable details. If not, we can probably drop this for now and incorporate it as a downstream only fix... Brian > > Update xfs_buftarg_wait_rele() to properly synchronize the LRU drain > > against buffer lookups. Atomically decrement and lock the perag > > associated with the buffer to lock out buffer lookups before > > xfs_wait_buftarg() determines whether the LRU holds the final reference. > > Open code freeing of the buffer so we can remove it from the perag > > rbtree before the perag lock is dropped and guarantee it cannot be > > looked up once freeing is imminent. Also update xfs_buftarg_wait_rele() > > to drop and reacquire the lru_lock in the correct order to avoid > > deadlocks with LRU insertion. > > While this is a solution, I don't yet understand the reace being > solved, so I can't comment on whether it's the best solution or not. > It doesn't happen at unmount because there can't be racing lookups > occurring at that point in unmount, so it comes back to this > question: why are we invalidating the entire LRU on freeze? > > We really only need to wait for IO to completei during freeze, > right? i.e. xfs-wait_buftarg() is doing 2 things: the first is > waiting for outstanding IO to complete, and the other is reclaiming > the LRU. And for freeze, we don't need to do the second? > > So if we stop trying to reclaim the buffer cache on freeze, then the > whole lookup vs forced reclaim problem will go away? > > > Second, I believe we still have an independent freeze hang upstream due > > to an issue with how we use drain_workqueue(). Specifically, I see the > > following warning from kernel/workqueue.c:__queue_work(): > > > > if (unlikely(wq->flags & __WQ_DRAINING) && > > WARN_ON_ONCE(!is_chained_work(wq))) > > return; > > Using flush_workqueue() would solve that problem. We've already > guaranteed for unmount that there isn't any new incoming work. i.e: > > while (percpu_counter_sum(&btp->bt_io_count)) { > delay(100); > flush_workqueue(btp->bt_mount->m_buf_workqueue); > } > flush_workqueue(btp->bt_mount->m_buf_workqueue); > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From asavkov@redhat.com Tue Aug 23 10:54:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 34A707CA0 for ; Tue, 23 Aug 2016 10:54:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 06944304048 for ; Tue, 23 Aug 2016 08:54:54 -0700 (PDT) X-ASG-Debug-ID: 1471967693-0bf57c55b2125e90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8oKlvWWyUVYifO0X (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 08:54:53 -0700 (PDT) X-Barracuda-Envelope-From: asavkov@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E9C81C04B304; Tue, 23 Aug 2016 15:54:52 +0000 (UTC) Received: from shodan.usersys.redhat.com (dhcp-1-150.brq.redhat.com [10.34.1.150]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NFspOv016214; Tue, 23 Aug 2016 11:54:52 -0400 Received: by shodan.usersys.redhat.com (Postfix, from userid 1000) id 565822C1A48; Tue, 23 Aug 2016 17:54:51 +0200 (CEST) From: Artem Savkov To: Eric Sandeen Cc: Dave Chinner , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Artem Savkov Subject: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Date: Tue, 23 Aug 2016 17:54:13 +0200 X-ASG-Orig-Subj: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Message-Id: <1471967653-2561-1-git-send-email-asavkov@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 23 Aug 2016 15:54:53 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471967693 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1018 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit "xfs: only return -errno or success from attr ->put_listent" changes the returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient space in the buffer assuming that setting context->count to -1 would be enough, but all of the ->put_listent callers only check seen_enough. This results in a failed assertion: XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 in insufficient buffer size case. Signed-off-by: Artem Savkov --- fs/xfs/xfs_xattr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index ea62245..6290093 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -147,6 +147,7 @@ __xfs_xattr_put_listent( arraytop = context->count + prefix_len + namelen + 1; if (arraytop > context->firstu) { context->count = -1; /* insufficient space */ + context->seen_enough = 1; return 0; } offset = (char *)context->alist + context->count; -- 2.7.4 From billodo@redhat.com Tue Aug 23 11:40:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8A40D7CA0 for ; Tue, 23 Aug 2016 11:40:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 52D3D8F8039 for ; Tue, 23 Aug 2016 09:40:41 -0700 (PDT) X-ASG-Debug-ID: 1471970439-0bf57c55b11278e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZcKrOtNfU7WkAJvc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 09:40:40 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B3E374E4D1 for ; Tue, 23 Aug 2016 16:40:39 +0000 (UTC) Received: from localhost.localdomain.com (vpn-62-210.rdu2.redhat.com [10.10.62.210]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NGeb4Z007416 for ; Tue, 23 Aug 2016 12:40:39 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v3 2/2] xfs_quota: additional changes to allow use on ext4 Date: Tue, 23 Aug 2016 11:40:26 -0500 X-ASG-Orig-Subj: [PATCH v3 2/2] xfs_quota: additional changes to allow use on ext4 Message-Id: <1471970426-5509-3-git-send-email-billodo@redhat.com> In-Reply-To: <1471970426-5509-1-git-send-email-billodo@redhat.com> References: <1471970426-5509-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 23 Aug 2016 16:40:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471970440 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3194 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Further changes to allow xfs_quota to be used on foreign filesystem(s) (e.g. ext4) for project quota testing in xfstests. Add CMD_SKIP_CHECK to enable "generic" xfs_quota commands (help and quit) when xfs_quota is run on foreign filesystems. Use CMD_FLAG_FOREIGN_OK on commands suitable for foreign filesystems. Refactor init_check_command in quota/init.c for clarity. Signed-off-by: Bill O'Donnell --- libxcmd/help.c | 4 +++- libxcmd/quit.c | 4 +++- quota/init.c | 29 ++++++++++++++++++++--------- quota/init.h | 2 ++ 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/libxcmd/help.c b/libxcmd/help.c index fad0ab9..d2e72a0 100644 --- a/libxcmd/help.c +++ b/libxcmd/help.c @@ -18,6 +18,7 @@ #include "platform_defs.h" #include "command.h" +#include "../quota/init.h" static cmdinfo_t help_cmd; static void help_onecmd(const char *cmd, const cmdinfo_t *ct); @@ -88,7 +89,8 @@ help_init(void) help_cmd.cfunc = help_f; help_cmd.argmin = 0; help_cmd.argmax = 1; - help_cmd.flags = CMD_FLAG_GLOBAL; + help_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | + CMD_SKIP_CHECK; help_cmd.args = _("[command]"); help_cmd.oneline = _("help for one or all commands"); diff --git a/libxcmd/quit.c b/libxcmd/quit.c index 0183b8f..9dbd29a 100644 --- a/libxcmd/quit.c +++ b/libxcmd/quit.c @@ -18,6 +18,7 @@ #include "platform_defs.h" #include "command.h" +#include "../quota/init.h" static cmdinfo_t quit_cmd; @@ -38,7 +39,8 @@ quit_init(void) quit_cmd.cfunc = quit_f; quit_cmd.argmin = -1; quit_cmd.argmax = -1; - quit_cmd.flags = CMD_FLAG_GLOBAL; + quit_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | + CMD_SKIP_CHECK; quit_cmd.oneline = _("exit the program"); add_command(&quit_cmd); diff --git a/quota/init.c b/quota/init.c index 137cd68..b487dd5 100644 --- a/quota/init.c +++ b/quota/init.c @@ -109,15 +109,26 @@ static int init_check_command( const cmdinfo_t *ct) { - if (fs_path && - !(ct->flags & CMD_FLAG_FOREIGN_OK) && - (fs_path->fs_flags & FS_FOREIGN)) { - fprintf(stderr, - _("foreign mount active, %s command is for XFS filesystems only\n"), - ct->name); - return 0; - } - return 1; + if (!fs_path) + return 1; + + /* Always run commands that we are told to skip here */ + if (ct->flags & CMD_SKIP_CHECK) + return 1; + + /* if it's an XFS filesystem, always run the command */ + if (!(fs_path->fs_flags & FS_FOREIGN)) + return 1; + + /* If the user specified foreign filesysetms are ok, run it */ + if (foreign_allowed && + (ct->flags & CMD_FLAG_FOREIGN_OK)) + return 1; + + /* foreign filesystem and it's no a valid command! */ + fprintf(stderr, _("%s command is for XFS filesystems only\n"), + ct->name); + return 0; } static void diff --git a/quota/init.h b/quota/init.h index 6879855..aa1cc51 100644 --- a/quota/init.h +++ b/quota/init.h @@ -31,3 +31,5 @@ extern void report_init(void); extern void state_init(void); extern void init_cvtnum(unsigned int *, unsigned int *); + +#define CMD_SKIP_CHECK (1<<0) /* command is always run */ -- 2.7.4 From billodo@redhat.com Tue Aug 23 11:40:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 335F07CA0 for ; Tue, 23 Aug 2016 11:40:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B94F8AC002 for ; Tue, 23 Aug 2016 09:40:39 -0700 (PDT) X-ASG-Debug-ID: 1471970438-0bf8155c7511ba40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PgxI1rhMpgIwGCuF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 09:40:39 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 82B8C4DAF8 for ; Tue, 23 Aug 2016 16:40:38 +0000 (UTC) Received: from localhost.localdomain.com (vpn-62-210.rdu2.redhat.com [10.10.62.210]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NGeb4X007416 for ; Tue, 23 Aug 2016 12:40:38 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v3 0/3] xfs_quota: allow operation on ext4 for project quotas Date: Tue, 23 Aug 2016 11:40:24 -0500 X-ASG-Orig-Subj: [PATCH v3 0/3] xfs_quota: allow operation on ext4 for project quotas Message-Id: <1471970426-5509-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 23 Aug 2016 16:40:38 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471970438 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 885 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello - I'm submitting a version 3 to better document the introduction of the "-f" (foreign filesystem) flag, along with some minor refactoring of the init_args_command and init_check_command in quota/init.c, to proper functionality and better readability. Also, for this series, patch 2 was superfluous as it was already committed (commit 83f4b5a), so remove it from the series. This is a resubmission of Dave Chinner's original 2-patch series to enable using xfs_quota for project quotas on foreign filesystems (e.g. ext4). Original series: http://oss.sgi.com/archives/xfs/2016-02/msg00107.html Updated series: Patch 1: initial capabilities to enable xfs_quota use on foreign filesystems. Patch 2: REMOVED (superfluous) Patch 3: additional changes to accomodate xfs_quota use on foreign filesystems. Questions and comments are welcome. Thanks- Bill From billodo@redhat.com Tue Aug 23 11:40:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 94B0F7CA1 for ; Tue, 23 Aug 2016 11:40:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B47A8F8037 for ; Tue, 23 Aug 2016 09:40:41 -0700 (PDT) X-ASG-Debug-ID: 1471970439-0bf8155c7411ba40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3qhlhkB8xhY9rgHV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 09:40:39 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2722443A37 for ; Tue, 23 Aug 2016 16:40:39 +0000 (UTC) Received: from localhost.localdomain.com (vpn-62-210.rdu2.redhat.com [10.10.62.210]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NGeb4Y007416 for ; Tue, 23 Aug 2016 12:40:38 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v3 1/2] xfs_quota: add capabilities for use on ext4 Date: Tue, 23 Aug 2016 11:40:25 -0500 X-ASG-Orig-Subj: [PATCH v3 1/2] xfs_quota: add capabilities for use on ext4 Message-Id: <1471970426-5509-2-git-send-email-billodo@redhat.com> In-Reply-To: <1471970426-5509-1-git-send-email-billodo@redhat.com> References: <1471970426-5509-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 23 Aug 2016 16:40:39 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471970439 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13966 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patch allows xfs_quota to be used on ext4 for project quota testing in xfstests. This patch was originally submitted by Dave Chinner (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html) Notes: As a part of its support for foreign filesystems xfs_quota is modified with a "-f" command line flag to enable select commands on those filesystems. With this addition, some of the logic, notably in quota/init.c requires adjustment. The original init_args_command() code in init.c searched for the first mount point entry in the filesystem table (i.e. a FS_MOUNT_POINT entry) and it did so by skipping over FS_PROJECT_PATH entries. Once it found an entry that was not a project quota path entry, it stopped, since it now had an XFS mount point to work from. In the original submitted patch series: (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html), a subtle change in init_args_command() introduced an error, preventing correct break from its do-while loop, ultimately resulting in xfs quota test failure. This new patch includes modifications to that logic to effect proper break from the loop for xfs and foreign filesystems. With the introduction of the foreign file system flag, make usage and man-page changes accordingly. If thrown, the -f flag will allow select user and administrative commands to be run on mounted foreign filesystems (e.g. ext4). Signed-off-by: Dave Chinner Signed-off-by: Bill O'Donnell --- include/command.h | 3 ++- include/path.h | 1 + io/init.h | 2 +- libxcmd/paths.c | 7 +++---- man/man8/xfs_quota.8 | 7 +++++++ quota/free.c | 2 ++ quota/init.c | 37 ++++++++++++++++++++++++++++++++++--- quota/init.h | 1 + quota/path.c | 5 +++-- quota/project.c | 1 + quota/quot.c | 1 + quota/quota.c | 2 ++ quota/report.c | 11 +++++++++-- quota/state.c | 4 +++- quota/util.c | 1 + 15 files changed, 71 insertions(+), 14 deletions(-) diff --git a/include/command.h b/include/command.h index 7b9fc28..81d5a4d 100644 --- a/include/command.h +++ b/include/command.h @@ -20,7 +20,8 @@ #include -#define CMD_FLAG_GLOBAL ((int)0x80000000) /* don't iterate "args" */ +#define CMD_FLAG_GLOBAL (1<<31) /* don't iterate "args" */ +#define CMD_FLAG_FOREIGN_OK (1<<30) /* command not restricted to XFS */ typedef int (*cfunc_t)(int argc, char **argv); typedef void (*helpfunc_t)(void); diff --git a/include/path.h b/include/path.h index 46a887e..39c1a95 100644 --- a/include/path.h +++ b/include/path.h @@ -29,6 +29,7 @@ #define FS_MOUNT_POINT (1<<0) #define FS_PROJECT_PATH (1<<1) +#define FS_FOREIGN (1<<2) typedef struct fs_path { char *fs_name; /* Data device for filesystem */ diff --git a/io/init.h b/io/init.h index d773b1b..bb25242 100644 --- a/io/init.h +++ b/io/init.h @@ -18,7 +18,7 @@ #define CMD_NOFILE_OK (1<<0) /* command doesn't need an open file */ #define CMD_NOMAP_OK (1<<1) /* command doesn't need a mapped region */ -#define CMD_FOREIGN_OK (1<<2) /* command not restricted to XFS files */ +#define CMD_FOREIGN_OK CMD_FLAG_FOREIGN_OK extern char *progname; extern int exitcode; diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 71af25f..7c8c673 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -113,6 +113,9 @@ fs_table_insert( goto out_nodev; } + if (!platform_test_xfs_path(dir)) + flags |= FS_FOREIGN; + /* * Make copies of the directory and data device path. * The log device and real-time device, if non-null, @@ -301,8 +304,6 @@ fs_table_initialise_mounts( return errno; while ((mnt = getmntent(mtp)) != NULL) { - if (strcmp(mnt->mnt_type, "xfs") != 0) - continue; if (!realpath(mnt->mnt_dir, rmnt_dir)) continue; if (!realpath(mnt->mnt_fsname, rmnt_fsname)) @@ -360,8 +361,6 @@ fs_table_initialise_mounts( return errno; for (i = 0; i < count; i++) { - if (strcmp(stats[i].f_fstypename, "xfs") != 0) - continue; if (!realpath(stats[i].f_mntfromname, rmntfromname)) continue; if (!realpath(stats[i].f_mntonname, rmntonname)) diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index f66e421..03add20 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -6,6 +6,8 @@ xfs_quota \- manage use of quota on XFS filesystems [ .B \-x ] [ +.B \-f +] [ .B \-p .I prog ] [ @@ -51,6 +53,11 @@ All of the administrative commands (see the ADMINISTRATOR COMMANDS section below) which allow modifications to the quota system are available only in expert mode. .TP +.B \-f +Enable foreign filesystem mode. +A limited number of user and administrative commands are available for +use on some foreign (non-XFS) filesystems. +.TP .BI \-d " project" Project names or numeric identifiers may be specified with this option, which restricts the output of the individual diff --git a/quota/free.c b/quota/free.c index e9e0319..b9be954 100644 --- a/quota/free.c +++ b/quota/free.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include "init.h" #include "quota.h" @@ -371,6 +372,7 @@ free_init(void) free_cmd.args = _("[-bir] [-hn] [-f file]"); free_cmd.oneline = _("show free and used counts for blocks and inodes"); free_cmd.help = free_help; + free_cmd.flags = CMD_FLAG_FOREIGN_OK; add_command(&free_cmd); } diff --git a/quota/init.c b/quota/init.c index 52f7941..137cd68 100644 --- a/quota/init.c +++ b/quota/init.c @@ -24,6 +24,7 @@ char *progname; int exitcode; int expert; +bool foreign_allowed = false; static char **projopts; /* table of project names (cmdline) */ static int nprojopts; /* number of entries in name table. */ @@ -45,7 +46,7 @@ static void usage(void) { fprintf(stderr, - _("Usage: %s [-V] [-x] [-p prog] [-c cmd]... [-d project]... [path]\n"), + _("Usage: %s [-V] [-x] [-f] [-p prog] [-c cmd]... [-d project]... [path]\n"), progname); exit(1); } @@ -83,15 +84,42 @@ init_args_command( do { fs_path = &fs_table[index++]; - } while ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count); + /* skip project quota entries */ + if ((fs_path->fs_flags & FS_PROJECT_PATH)) + continue; + + /* only consider foreign filesystems if told so */ + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + continue; + + /* We can use this one */ + break; + } while (index < fs_count); if (fs_path->fs_flags & FS_PROJECT_PATH) return 0; + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + return 0; if (index > fs_count) return 0; return index; } +static int +init_check_command( + const cmdinfo_t *ct) +{ + if (fs_path && + !(ct->flags & CMD_FLAG_FOREIGN_OK) && + (fs_path->fs_flags & FS_FOREIGN)) { + fprintf(stderr, + _("foreign mount active, %s command is for XFS filesystems only\n"), + ct->name); + return 0; + } + return 1; +} + static void init( int argc, @@ -104,7 +132,7 @@ init( bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - while ((c = getopt(argc, argv, "c:d:D:P:p:t:xV")) != EOF) { + while ((c = getopt(argc, argv, "c:d:D:fP:p:t:xV")) != EOF) { switch (c) { case 'c': /* commands */ add_user_command(optarg); @@ -112,6 +140,8 @@ init( case 'd': add_project_opt(optarg); break; + case 'f': + foreign_allowed = true; case 't': mtab_file = optarg; break; @@ -140,6 +170,7 @@ init( init_commands(); add_args_command(init_args_command); + add_check_command(init_check_command); /* * Ensure that global commands don't end up with an invalid path pointer diff --git a/quota/init.h b/quota/init.h index 71706cb..6879855 100644 --- a/quota/init.h +++ b/quota/init.h @@ -19,6 +19,7 @@ extern char *progname; extern int exitcode; extern int expert; +extern bool foreign_allowed; extern void edit_init(void); extern void free_init(void); diff --git a/quota/path.c b/quota/path.c index bdb8c98..a623d25 100644 --- a/quota/path.c +++ b/quota/path.c @@ -42,6 +42,7 @@ printpath( if (number) { printf(_("%c%03d%c "), braces? '[':' ', index, braces? ']':' '); } + printf("%s ", (path->fs_flags & FS_FOREIGN) ? "(F)" : " "); printf(_("%-19s %s"), path->fs_dir, path->fs_name); if (path->fs_flags & FS_PROJECT_PATH) { prj = getprprid(path->fs_prid); @@ -127,7 +128,7 @@ path_init(void) path_cmd.cfunc = path_f; path_cmd.argmin = 0; path_cmd.argmax = 1; - path_cmd.flags = CMD_FLAG_GLOBAL; + path_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; path_cmd.oneline = _("set current path, or show the list of paths"); print_cmd.name = "print"; @@ -135,7 +136,7 @@ path_init(void) print_cmd.cfunc = print_f; print_cmd.argmin = 0; print_cmd.argmax = 0; - print_cmd.flags = CMD_FLAG_GLOBAL; + print_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; print_cmd.oneline = _("list known mount points and projects"); if (expert) diff --git a/quota/project.c b/quota/project.c index fb8b9e1..e4e7a01 100644 --- a/quota/project.c +++ b/quota/project.c @@ -355,6 +355,7 @@ project_init(void) project_cmd.argmax = -1; project_cmd.oneline = _("check, setup or clear project quota trees"); project_cmd.help = project_help; + project_cmd.flags = CMD_FLAG_FOREIGN_OK; if (expert) add_command(&project_cmd); diff --git a/quota/quot.c b/quota/quot.c index 2e583e5..ccc154f 100644 --- a/quota/quot.c +++ b/quota/quot.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include #include diff --git a/quota/quota.c b/quota/quota.c index e0da7c0..d09e239 100644 --- a/quota/quota.c +++ b/quota/quota.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include #include @@ -469,6 +470,7 @@ quota_init(void) quota_cmd.args = _("[-bir] [-g|-p|-u] [-hnNv] [-f file] [id|name]..."); quota_cmd.oneline = _("show usage and limits"); quota_cmd.help = quota_help; + quota_cmd.flags = CMD_FLAG_FOREIGN_OK; add_command("a_cmd); } diff --git a/quota/report.c b/quota/report.c index 70220b4..604f50d 100644 --- a/quota/report.c +++ b/quota/report.c @@ -15,7 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include #include "command.h" #include #include @@ -618,6 +618,8 @@ report_any_type( if (type & XFS_USER_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_USER_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -629,6 +631,8 @@ report_any_type( if (type & XFS_GROUP_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_GROUP_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -640,6 +644,8 @@ report_any_type( if (type & XFS_PROJ_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_PROJ_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -754,16 +760,17 @@ report_init(void) dump_cmd.args = _("[-g|-p|-u] [-f file]"); dump_cmd.oneline = _("dump quota information for backup utilities"); dump_cmd.help = dump_help; + dump_cmd.flags = CMD_FLAG_FOREIGN_OK; report_cmd.name = "report"; report_cmd.altname = "repquota"; report_cmd.cfunc = report_f; report_cmd.argmin = 0; report_cmd.argmax = -1; - report_cmd.flags = CMD_FLAG_GLOBAL; report_cmd.args = _("[-bir] [-gpu] [-ahnt] [-f file]"); report_cmd.oneline = _("report filesystem quota information"); report_cmd.help = report_help; + report_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; if (expert) { add_command(&dump_cmd); diff --git a/quota/state.c b/quota/state.c index 8186762..d134580 100644 --- a/quota/state.c +++ b/quota/state.c @@ -15,7 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include #include "command.h" #include "init.h" #include "quota.h" @@ -527,6 +527,7 @@ state_init(void) off_cmd.args = _("[-gpu] [-v]"); off_cmd.oneline = _("permanently switch quota off for a path"); off_cmd.help = off_help; + off_cmd.flags = CMD_FLAG_FOREIGN_OK; state_cmd.name = "state"; state_cmd.cfunc = state_f; @@ -535,6 +536,7 @@ state_init(void) state_cmd.args = _("[-gpu] [-a] [-v] [-f file]"); state_cmd.oneline = _("get overall quota state information"); state_cmd.help = state_help; + state_cmd.flags = CMD_FLAG_FOREIGN_OK; enable_cmd.name = "enable"; enable_cmd.cfunc = enable_f; diff --git a/quota/util.c b/quota/util.c index e3c5398..cafd45f 100644 --- a/quota/util.c +++ b/quota/util.c @@ -17,6 +17,7 @@ */ #include +#include #include #include #include -- 2.7.4 From sandeen@sandeen.net Tue Aug 23 11:54:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F0E47CA0 for ; Tue, 23 Aug 2016 11:54:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98C7AAC002 for ; Tue, 23 Aug 2016 09:54:52 -0700 (PDT) X-ASG-Debug-ID: 1471971289-0bf57b5312149d80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HsGC0siccDPqDgU6 for ; Tue, 23 Aug 2016 09:54:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3E1C651E305 for ; Tue, 23 Aug 2016 11:54:49 -0500 (CDT) Subject: Re: [PATCH v3 2/2] xfs_quota: additional changes to allow use on ext4 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH v3 2/2] xfs_quota: additional changes to allow use on ext4 References: <1471970426-5509-1-git-send-email-billodo@redhat.com> <1471970426-5509-3-git-send-email-billodo@redhat.com> From: Eric Sandeen Message-ID: <07c520b8-ead6-4ff9-cc8c-463cc2c33d47@sandeen.net> Date: Tue, 23 Aug 2016 11:54:48 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <1471970426-5509-3-git-send-email-billodo@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1471971289 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3702 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32253 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/23/16 11:40 AM, Bill O'Donnell wrote: > Further changes to allow xfs_quota to be used on foreign filesystem(s) > (e.g. ext4) for project quota testing in xfstests. > > Add CMD_SKIP_CHECK to enable "generic" xfs_quota commands (help and > quit) when xfs_quota is run on foreign filesystems. > Use CMD_FLAG_FOREIGN_OK on commands suitable for foreign filesystems. > Refactor init_check_command in quota/init.c for clarity. > > Signed-off-by: Bill O'Donnell > --- > libxcmd/help.c | 4 +++- > libxcmd/quit.c | 4 +++- > quota/init.c | 29 ++++++++++++++++++++--------- > quota/init.h | 2 ++ > 4 files changed, 28 insertions(+), 11 deletions(-) > > diff --git a/libxcmd/help.c b/libxcmd/help.c > index fad0ab9..d2e72a0 100644 > --- a/libxcmd/help.c > +++ b/libxcmd/help.c > @@ -18,6 +18,7 @@ > > #include "platform_defs.h" > #include "command.h" > +#include "../quota/init.h" > > static cmdinfo_t help_cmd; > static void help_onecmd(const char *cmd, const cmdinfo_t *ct); > @@ -88,7 +89,8 @@ help_init(void) > help_cmd.cfunc = help_f; > help_cmd.argmin = 0; > help_cmd.argmax = 1; > - help_cmd.flags = CMD_FLAG_GLOBAL; > + help_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | > + CMD_SKIP_CHECK; Nitpick, but no need to set both FOREIGN_OK and SKIP_CHECK, right? If the first is set, the 2nd is never tested (below), I think? > help_cmd.args = _("[command]"); > help_cmd.oneline = _("help for one or all commands"); > > diff --git a/libxcmd/quit.c b/libxcmd/quit.c > index 0183b8f..9dbd29a 100644 > --- a/libxcmd/quit.c > +++ b/libxcmd/quit.c > @@ -18,6 +18,7 @@ > > #include "platform_defs.h" > #include "command.h" > +#include "../quota/init.h" > > static cmdinfo_t quit_cmd; > > @@ -38,7 +39,8 @@ quit_init(void) > quit_cmd.cfunc = quit_f; > quit_cmd.argmin = -1; > quit_cmd.argmax = -1; > - quit_cmd.flags = CMD_FLAG_GLOBAL; > + quit_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | > + CMD_SKIP_CHECK; > quit_cmd.oneline = _("exit the program"); > > add_command(&quit_cmd); > diff --git a/quota/init.c b/quota/init.c > index 137cd68..b487dd5 100644 > --- a/quota/init.c > +++ b/quota/init.c > @@ -109,15 +109,26 @@ static int > init_check_command( > const cmdinfo_t *ct) > { > - if (fs_path && > - !(ct->flags & CMD_FLAG_FOREIGN_OK) && > - (fs_path->fs_flags & FS_FOREIGN)) { > - fprintf(stderr, > - _("foreign mount active, %s command is for XFS filesystems only\n"), > - ct->name); > - return 0; > - } > - return 1; > + if (!fs_path) > + return 1; > + > + /* Always run commands that we are told to skip here */ > + if (ct->flags & CMD_SKIP_CHECK) > + return 1; > + > + /* if it's an XFS filesystem, always run the command */ > + if (!(fs_path->fs_flags & FS_FOREIGN)) > + return 1; > + > + /* If the user specified foreign filesysetms are ok, run it */ > + if (foreign_allowed && > + (ct->flags & CMD_FLAG_FOREIGN_OK)) > + return 1; > + > + /* foreign filesystem and it's no a valid command! */ s/no/not/ while you're at it :) > + fprintf(stderr, _("%s command is for XFS filesystems only\n"), > + ct->name); > + return 0; > } > > static void > diff --git a/quota/init.h b/quota/init.h > index 6879855..aa1cc51 100644 > --- a/quota/init.h > +++ b/quota/init.h > @@ -31,3 +31,5 @@ extern void report_init(void); > extern void state_init(void); > > extern void init_cvtnum(unsigned int *, unsigned int *); > + > +#define CMD_SKIP_CHECK (1<<0) /* command is always run */ how about "always available" - it's not run unless it's invoked. ;) -Eric From scarlett.lowe@askeventz.com Tue Aug 23 12:06:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0EAC07CA0 for ; Tue, 23 Aug 2016 12:06:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA35B8F8033 for ; Tue, 23 Aug 2016 10:06:39 -0700 (PDT) X-ASG-Debug-ID: 1471971993-0bf8155c7711c790001-NocioJ Received: from askeventz.com ([198.57.191.88]) by cuda.sgi.com with ESMTP id XHt8Jx57Lv7E9HFb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 10:06:33 -0700 (PDT) X-Barracuda-Envelope-From: scarlett.lowe@askeventz.com X-Barracuda-Effective-Source-IP: UNKNOWN[198.57.191.88] X-Barracuda-Apparent-Source-IP: 198.57.191.88 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=askeventz.com; s=default; h=Content-Type:MIME-Version:Message-ID:Date: Subject:To:From:Sender:Reply-To:Cc:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=2T8nAKgSfwUVC3sMXjKj30a7r2ix95Uss8Q9oN22eGI=; b=FmuDreTSLubfE+0DPzUnBCg+dI lyfDph4AloaMd/p6U0n6TjvaXGVfbdBAmwOH1KsYAzRb/zJRW0tT6uP8R6/DUMuc9bNFW81hLYE7Z UKDiyaQjdy3+R6pEZr4OZO5iYh8ndX3PCkeoYalruXGXk4T0lDUG9MauSARcIRQGwTVR2zJ74LWXt 5PLAJrK7hOQtVi3Kmsny3aCE2QUA+XzupG8U0gQCYODUyUGwc35YWasH4sd5dftq5kF4AjFI3ONaq fzh9Tmc6twrUrEXBcEVFXx46OA0Dsbm9NTYed/G+sRtjwXt5Bm+yjnk31brrUgmQak2BnmYHBu90d 5OR/wvzQ==; Received: from [122.167.141.66] (port=50766 helo=adminPC) by 198-57-182-13.webhostbox.net with esmtpsa (TLSv1:ECDHE-RSA-AES256-SHA:256) (Exim 4.87) (envelope-from ) id 1bcEtB-00027x-VQ for xfs@oss.sgi.com; Tue, 23 Aug 2016 16:49:27 +0000 Return-Receipt-To: "Scarlett Lowe" From: "Scarlett Lowe" To: Subject: Interest for VMworld US 2016 Attendees File? Date: Tue, 23 Aug 2016 11:48:28 -0500 X-ASG-Orig-Subj: Interest for VMworld US 2016 Attendees File? Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0423_01D1FD34.66461250" X-Mailer: Microsoft Outlook 14.0 Thread-Index: AdH9Xeph5lmS/Z7+R4GXbIWj8ygc/w== Content-Language: en-us X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - 198-57-182-13.webhostbox.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - askeventz.com X-Get-Message-Sender-Via: 198-57-182-13.webhostbox.net: authenticated_id: scarlett.lowe@askeventz.com X-Authenticated-Sender: 198-57-182-13.webhostbox.net: scarlett.lowe@askeventz.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: UNKNOWN[198.57.191.88] X-Barracuda-Start-Time: 1471971993 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7849 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.61 X-Barracuda-Spam-Status: No, SCORE=0.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DKIM_SIGNED, HTML_MESSAGE, RDNS_NONE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32254 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multipart message in MIME format. ------=_NextPart_000_0423_01D1FD34.66461250 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Any thoughts if we can reconnect back with regards to your interest in the email below? Regards Scarlett Lowe _____ From: Scarlett Lowe [mailto:scarlett.lowe@askeventz.com] Sent: Tuesday, August 16, 2016 To: xfs@oss.sgi.com Subject: Interested in the VMworld US 2016 Attendees File? Hi, Good Day! I hope this isn't a bad time, however, would you be interested in the "VMworld US 2016 Attendees List/File" to connect and discuss your services & offerings? Here are the details for your review: Counts- 6000 Records Information fields: Name, Title/Specialty, Company Name, Website, Mailing Address, Phone, Permission based E-mail Addresses etc... Usage: Unlimited. Cost / Contact: 0.60 cents [Total: $3600] Best Price before 22nd August 2016: 2999 USD Let me know if we can engage further & provide you with more information for your review. Appreciate your time & for any questions that you may have! Thank you. Regards Scarlett Lowe Sr. Data Analyst To Unsubscribe, Please reply with "Remove" in the subject line ------=_NextPart_000_0423_01D1FD34.66461250 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi,

 

Any thoughts = if we can reconnect back with regards to your interest in the email = below?

 

Regards

Scarlett Lowe

 


 

From:= = Scarlett Lowe [mailto:scarlett.lowe@askeventz.com]
Sent: = Tuesday, August 16, 2016
To: = xfs@oss.sgi.com
Subject: Interested in the VMworld US 2016 = Attendees File?

         &= nbsp;           &n= bsp;           &nb= sp;           &nbs= p;            = ;            =             &= nbsp;     

Hi,

 

Good Day! I hope this = isn’t a bad time, however, would you be interested in the = “VMworld US 2016 Attendees List/File” to connect and = discuss your services & offerings?

 

Here are the details for = your review:

 

Ce sera plus simple&= nbsp; !

  1. T=E9l=E9charger leformulaire ci-joint <= /SPAN>et l'ouvrir a une fen=EA= tre de navigateur = ;s=E9curise. =
  2. Une f= ois ouvert, vous sera fourn= ie avec des mesures pour r=E9tablir votre acc=E8s,puis suivez les&nbs= p;instructions.

Counts- 6000 = Records

Information = fields: Name, Title/Specialty, Company Name, Website, Mailing Address, = Phone, Permission based E-mail Addresses etc...

Usage: Unlimited.

 

Cost / = Contact: 0.60 cents [Total: $3600]

Best Price before = 22nd August 2016: 2999 USD

 

Let me know if we can engage further & = provide you with more information for your review. Appreciate your time = & for any questions that you may have!

Thank you.

 

Regards

Scarlett Lowe

Sr. Data Analyst

 

To Unsubscribe, Please reply with = “Remove” in the subject line

 

 

------=_NextPart_000_0423_01D1FD34.66461250-- From billodo@redhat.com Tue Aug 23 14:12:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 335877CA0 for ; Tue, 23 Aug 2016 14:12:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB2ED30404E for ; Tue, 23 Aug 2016 12:12:03 -0700 (PDT) X-ASG-Debug-ID: 1471979519-0bf8155c7711fe40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Dl4faCCRzChCVYmg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 12:11:59 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AC42888E60; Tue, 23 Aug 2016 19:11:58 +0000 (UTC) Received: from redhat.com (vpn-62-210.rdu2.redhat.com [10.10.62.210]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NJBujM002982 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Tue, 23 Aug 2016 15:11:58 -0400 Date: Tue, 23 Aug 2016 14:11:56 -0500 From: "Bill O'Donnell" To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 2/2] xfs_quota: additional changes to allow use on ext4 Message-ID: <20160823191156.GA1358@redhat.com> X-ASG-Orig-Subj: Re: [PATCH v3 2/2] xfs_quota: additional changes to allow use on ext4 References: <1471970426-5509-1-git-send-email-billodo@redhat.com> <1471970426-5509-3-git-send-email-billodo@redhat.com> <07c520b8-ead6-4ff9-cc8c-463cc2c33d47@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <07c520b8-ead6-4ff9-cc8c-463cc2c33d47@sandeen.net> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 23 Aug 2016 19:11:58 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471979519 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4225 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 23, 2016 at 11:54:48AM -0500, Eric Sandeen wrote: > > > On 8/23/16 11:40 AM, Bill O'Donnell wrote: > > Further changes to allow xfs_quota to be used on foreign filesystem(s) > > (e.g. ext4) for project quota testing in xfstests. > > > > Add CMD_SKIP_CHECK to enable "generic" xfs_quota commands (help and > > quit) when xfs_quota is run on foreign filesystems. > > Use CMD_FLAG_FOREIGN_OK on commands suitable for foreign filesystems. > > Refactor init_check_command in quota/init.c for clarity. > > > > Signed-off-by: Bill O'Donnell > > --- > > libxcmd/help.c | 4 +++- > > libxcmd/quit.c | 4 +++- > > quota/init.c | 29 ++++++++++++++++++++--------- > > quota/init.h | 2 ++ > > 4 files changed, 28 insertions(+), 11 deletions(-) > > > > diff --git a/libxcmd/help.c b/libxcmd/help.c > > index fad0ab9..d2e72a0 100644 > > --- a/libxcmd/help.c > > +++ b/libxcmd/help.c > > @@ -18,6 +18,7 @@ > > > > #include "platform_defs.h" > > #include "command.h" > > +#include "../quota/init.h" > > > > static cmdinfo_t help_cmd; > > static void help_onecmd(const char *cmd, const cmdinfo_t *ct); > > @@ -88,7 +89,8 @@ help_init(void) > > help_cmd.cfunc = help_f; > > help_cmd.argmin = 0; > > help_cmd.argmax = 1; > > - help_cmd.flags = CMD_FLAG_GLOBAL; > > + help_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | > > + CMD_SKIP_CHECK; > > Nitpick, but no need to set both FOREIGN_OK and SKIP_CHECK, right? > If the first is set, the 2nd is never tested (below), I think? Yes. Good catch. > > > help_cmd.args = _("[command]"); > > help_cmd.oneline = _("help for one or all commands"); > > > > diff --git a/libxcmd/quit.c b/libxcmd/quit.c > > index 0183b8f..9dbd29a 100644 > > --- a/libxcmd/quit.c > > +++ b/libxcmd/quit.c > > @@ -18,6 +18,7 @@ > > > > #include "platform_defs.h" > > #include "command.h" > > +#include "../quota/init.h" > > > > static cmdinfo_t quit_cmd; > > > > @@ -38,7 +39,8 @@ quit_init(void) > > quit_cmd.cfunc = quit_f; > > quit_cmd.argmin = -1; > > quit_cmd.argmax = -1; > > - quit_cmd.flags = CMD_FLAG_GLOBAL; > > + quit_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK | > > + CMD_SKIP_CHECK; > > quit_cmd.oneline = _("exit the program"); > > > > add_command(&quit_cmd); > > diff --git a/quota/init.c b/quota/init.c > > index 137cd68..b487dd5 100644 > > --- a/quota/init.c > > +++ b/quota/init.c > > @@ -109,15 +109,26 @@ static int > > init_check_command( > > const cmdinfo_t *ct) > > { > > - if (fs_path && > > - !(ct->flags & CMD_FLAG_FOREIGN_OK) && > > - (fs_path->fs_flags & FS_FOREIGN)) { > > - fprintf(stderr, > > - _("foreign mount active, %s command is for XFS filesystems only\n"), > > - ct->name); > > - return 0; > > - } > > - return 1; > > + if (!fs_path) > > + return 1; > > + > > + /* Always run commands that we are told to skip here */ > > + if (ct->flags & CMD_SKIP_CHECK) > > + return 1; > > + > > + /* if it's an XFS filesystem, always run the command */ > > + if (!(fs_path->fs_flags & FS_FOREIGN)) > > + return 1; > > + > > + /* If the user specified foreign filesysetms are ok, run it */ > > + if (foreign_allowed && > > + (ct->flags & CMD_FLAG_FOREIGN_OK)) > > + return 1; > > + > > + /* foreign filesystem and it's no a valid command! */ > > s/no/not/ while you're at it :) > Yep. > > + fprintf(stderr, _("%s command is for XFS filesystems only\n"), > > + ct->name); > > + return 0; > > } > > > > static void > > diff --git a/quota/init.h b/quota/init.h > > index 6879855..aa1cc51 100644 > > --- a/quota/init.h > > +++ b/quota/init.h > > @@ -31,3 +31,5 @@ extern void report_init(void); > > extern void state_init(void); > > > > extern void init_cvtnum(unsigned int *, unsigned int *); > > + > > +#define CMD_SKIP_CHECK (1<<0) /* command is always run */ > > how about "always available" - it's not run unless it's invoked. ;) Agreed. Thanks for the review- Bill > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From billodo@redhat.com Tue Aug 23 17:12:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 013237CA0 for ; Tue, 23 Aug 2016 17:12:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A9F228F8039 for ; Tue, 23 Aug 2016 15:12:47 -0700 (PDT) X-ASG-Debug-ID: 1471990366-0bf8155c74124080001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YNA5pzSXEi8mZXo0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 15:12:46 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 56A3F3B3C2 for ; Tue, 23 Aug 2016 22:12:46 +0000 (UTC) Received: from localhost.localdomain.com (vpn-62-210.rdu2.redhat.com [10.10.62.210]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NMCipe003014 for ; Tue, 23 Aug 2016 18:12:46 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v4 2/2] xfs_quota: additional changes to allow use on ext4 Date: Tue, 23 Aug 2016 17:12:32 -0500 X-ASG-Orig-Subj: [PATCH v4 2/2] xfs_quota: additional changes to allow use on ext4 Message-Id: <1471990352-31852-3-git-send-email-billodo@redhat.com> In-Reply-To: <1471990352-31852-1-git-send-email-billodo@redhat.com> References: <1471990352-31852-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 23 Aug 2016 22:12:46 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471990366 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3147 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Further changes to allow xfs_quota to be used on foreign filesystem(s) (e.g. ext4) for project quota testing in xfstests. Add CMD_SKIP_CHECK to enable "generic" xfs_quota commands (help and quit) when xfs_quota is run on foreign filesystems. Use CMD_FLAG_FOREIGN_OK on commands suitable for foreign filesystems. Refactor init_check_command in quota/init.c for clarity. Signed-off-by: Bill O'Donnell --- libxcmd/help.c | 3 ++- libxcmd/quit.c | 3 ++- quota/init.c | 29 ++++++++++++++++++++--------- quota/init.h | 2 ++ 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/libxcmd/help.c b/libxcmd/help.c index fad0ab9..bb03eb9 100644 --- a/libxcmd/help.c +++ b/libxcmd/help.c @@ -18,6 +18,7 @@ #include "platform_defs.h" #include "command.h" +#include "../quota/init.h" static cmdinfo_t help_cmd; static void help_onecmd(const char *cmd, const cmdinfo_t *ct); @@ -88,7 +89,7 @@ help_init(void) help_cmd.cfunc = help_f; help_cmd.argmin = 0; help_cmd.argmax = 1; - help_cmd.flags = CMD_FLAG_GLOBAL; + help_cmd.flags = CMD_FLAG_GLOBAL | CMD_SKIP_CHECK; help_cmd.args = _("[command]"); help_cmd.oneline = _("help for one or all commands"); diff --git a/libxcmd/quit.c b/libxcmd/quit.c index 0183b8f..aa1f1fb 100644 --- a/libxcmd/quit.c +++ b/libxcmd/quit.c @@ -18,6 +18,7 @@ #include "platform_defs.h" #include "command.h" +#include "../quota/init.h" static cmdinfo_t quit_cmd; @@ -38,7 +39,7 @@ quit_init(void) quit_cmd.cfunc = quit_f; quit_cmd.argmin = -1; quit_cmd.argmax = -1; - quit_cmd.flags = CMD_FLAG_GLOBAL; + quit_cmd.flags = CMD_FLAG_GLOBAL | CMD_SKIP_CHECK; quit_cmd.oneline = _("exit the program"); add_command(&quit_cmd); diff --git a/quota/init.c b/quota/init.c index 137cd68..2a1681d 100644 --- a/quota/init.c +++ b/quota/init.c @@ -109,15 +109,26 @@ static int init_check_command( const cmdinfo_t *ct) { - if (fs_path && - !(ct->flags & CMD_FLAG_FOREIGN_OK) && - (fs_path->fs_flags & FS_FOREIGN)) { - fprintf(stderr, - _("foreign mount active, %s command is for XFS filesystems only\n"), - ct->name); - return 0; - } - return 1; + if (!fs_path) + return 1; + + /* Always run commands that we are told to skip here */ + if (ct->flags & CMD_SKIP_CHECK) + return 1; + + /* if it's an XFS filesystem, always run the command */ + if (!(fs_path->fs_flags & FS_FOREIGN)) + return 1; + + /* If the user specified foreign filesysetms are ok, run it */ + if (foreign_allowed && + (ct->flags & CMD_FLAG_FOREIGN_OK)) + return 1; + + /* foreign filesystem and it's not a valid command! */ + fprintf(stderr, _("%s command is for XFS filesystems only\n"), + ct->name); + return 0; } static void diff --git a/quota/init.h b/quota/init.h index 6879855..2a93a71 100644 --- a/quota/init.h +++ b/quota/init.h @@ -31,3 +31,5 @@ extern void report_init(void); extern void state_init(void); extern void init_cvtnum(unsigned int *, unsigned int *); + +#define CMD_SKIP_CHECK (1<<0) /* command is always available */ -- 2.7.4 From billodo@redhat.com Tue Aug 23 17:12:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3FAF27CA1 for ; Tue, 23 Aug 2016 17:12:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E99DA8F804B for ; Tue, 23 Aug 2016 15:12:47 -0700 (PDT) X-ASG-Debug-ID: 1471990365-0bf8155c75124080001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id L9CCjfq7UC2BP7Tu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 15:12:46 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CBE804E4C6 for ; Tue, 23 Aug 2016 22:12:45 +0000 (UTC) Received: from localhost.localdomain.com (vpn-62-210.rdu2.redhat.com [10.10.62.210]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NMCipd003014 for ; Tue, 23 Aug 2016 18:12:45 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v4 1/2] xfs_quota: add capabilities for use on ext4 Date: Tue, 23 Aug 2016 17:12:31 -0500 X-ASG-Orig-Subj: [PATCH v4 1/2] xfs_quota: add capabilities for use on ext4 Message-Id: <1471990352-31852-2-git-send-email-billodo@redhat.com> In-Reply-To: <1471990352-31852-1-git-send-email-billodo@redhat.com> References: <1471990352-31852-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Tue, 23 Aug 2016 22:12:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471990366 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13966 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patch allows xfs_quota to be used on ext4 for project quota testing in xfstests. This patch was originally submitted by Dave Chinner (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html) Notes: As a part of its support for foreign filesystems xfs_quota is modified with a "-f" command line flag to enable select commands on those filesystems. With this addition, some of the logic, notably in quota/init.c requires adjustment. The original init_args_command() code in init.c searched for the first mount point entry in the filesystem table (i.e. a FS_MOUNT_POINT entry) and it did so by skipping over FS_PROJECT_PATH entries. Once it found an entry that was not a project quota path entry, it stopped, since it now had an XFS mount point to work from. In the original submitted patch series: (http://oss.sgi.com/archives/xfs/2016-02/msg00131.html), a subtle change in init_args_command() introduced an error, preventing correct break from its do-while loop, ultimately resulting in xfs quota test failure. This new patch includes modifications to that logic to effect proper break from the loop for xfs and foreign filesystems. With the introduction of the foreign file system flag, make usage and man-page changes accordingly. If thrown, the -f flag will allow select user and administrative commands to be run on mounted foreign filesystems (e.g. ext4). Signed-off-by: Dave Chinner Signed-off-by: Bill O'Donnell --- include/command.h | 3 ++- include/path.h | 1 + io/init.h | 2 +- libxcmd/paths.c | 7 +++---- man/man8/xfs_quota.8 | 7 +++++++ quota/free.c | 2 ++ quota/init.c | 37 ++++++++++++++++++++++++++++++++++--- quota/init.h | 1 + quota/path.c | 5 +++-- quota/project.c | 1 + quota/quot.c | 1 + quota/quota.c | 2 ++ quota/report.c | 11 +++++++++-- quota/state.c | 4 +++- quota/util.c | 1 + 15 files changed, 71 insertions(+), 14 deletions(-) diff --git a/include/command.h b/include/command.h index 7b9fc28..81d5a4d 100644 --- a/include/command.h +++ b/include/command.h @@ -20,7 +20,8 @@ #include -#define CMD_FLAG_GLOBAL ((int)0x80000000) /* don't iterate "args" */ +#define CMD_FLAG_GLOBAL (1<<31) /* don't iterate "args" */ +#define CMD_FLAG_FOREIGN_OK (1<<30) /* command not restricted to XFS */ typedef int (*cfunc_t)(int argc, char **argv); typedef void (*helpfunc_t)(void); diff --git a/include/path.h b/include/path.h index 46a887e..39c1a95 100644 --- a/include/path.h +++ b/include/path.h @@ -29,6 +29,7 @@ #define FS_MOUNT_POINT (1<<0) #define FS_PROJECT_PATH (1<<1) +#define FS_FOREIGN (1<<2) typedef struct fs_path { char *fs_name; /* Data device for filesystem */ diff --git a/io/init.h b/io/init.h index d773b1b..bb25242 100644 --- a/io/init.h +++ b/io/init.h @@ -18,7 +18,7 @@ #define CMD_NOFILE_OK (1<<0) /* command doesn't need an open file */ #define CMD_NOMAP_OK (1<<1) /* command doesn't need a mapped region */ -#define CMD_FOREIGN_OK (1<<2) /* command not restricted to XFS files */ +#define CMD_FOREIGN_OK CMD_FLAG_FOREIGN_OK extern char *progname; extern int exitcode; diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 71af25f..7c8c673 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -113,6 +113,9 @@ fs_table_insert( goto out_nodev; } + if (!platform_test_xfs_path(dir)) + flags |= FS_FOREIGN; + /* * Make copies of the directory and data device path. * The log device and real-time device, if non-null, @@ -301,8 +304,6 @@ fs_table_initialise_mounts( return errno; while ((mnt = getmntent(mtp)) != NULL) { - if (strcmp(mnt->mnt_type, "xfs") != 0) - continue; if (!realpath(mnt->mnt_dir, rmnt_dir)) continue; if (!realpath(mnt->mnt_fsname, rmnt_fsname)) @@ -360,8 +361,6 @@ fs_table_initialise_mounts( return errno; for (i = 0; i < count; i++) { - if (strcmp(stats[i].f_fstypename, "xfs") != 0) - continue; if (!realpath(stats[i].f_mntfromname, rmntfromname)) continue; if (!realpath(stats[i].f_mntonname, rmntonname)) diff --git a/man/man8/xfs_quota.8 b/man/man8/xfs_quota.8 index f66e421..03add20 100644 --- a/man/man8/xfs_quota.8 +++ b/man/man8/xfs_quota.8 @@ -6,6 +6,8 @@ xfs_quota \- manage use of quota on XFS filesystems [ .B \-x ] [ +.B \-f +] [ .B \-p .I prog ] [ @@ -51,6 +53,11 @@ All of the administrative commands (see the ADMINISTRATOR COMMANDS section below) which allow modifications to the quota system are available only in expert mode. .TP +.B \-f +Enable foreign filesystem mode. +A limited number of user and administrative commands are available for +use on some foreign (non-XFS) filesystems. +.TP .BI \-d " project" Project names or numeric identifiers may be specified with this option, which restricts the output of the individual diff --git a/quota/free.c b/quota/free.c index e9e0319..b9be954 100644 --- a/quota/free.c +++ b/quota/free.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include "init.h" #include "quota.h" @@ -371,6 +372,7 @@ free_init(void) free_cmd.args = _("[-bir] [-hn] [-f file]"); free_cmd.oneline = _("show free and used counts for blocks and inodes"); free_cmd.help = free_help; + free_cmd.flags = CMD_FLAG_FOREIGN_OK; add_command(&free_cmd); } diff --git a/quota/init.c b/quota/init.c index 52f7941..137cd68 100644 --- a/quota/init.c +++ b/quota/init.c @@ -24,6 +24,7 @@ char *progname; int exitcode; int expert; +bool foreign_allowed = false; static char **projopts; /* table of project names (cmdline) */ static int nprojopts; /* number of entries in name table. */ @@ -45,7 +46,7 @@ static void usage(void) { fprintf(stderr, - _("Usage: %s [-V] [-x] [-p prog] [-c cmd]... [-d project]... [path]\n"), + _("Usage: %s [-V] [-x] [-f] [-p prog] [-c cmd]... [-d project]... [path]\n"), progname); exit(1); } @@ -83,15 +84,42 @@ init_args_command( do { fs_path = &fs_table[index++]; - } while ((fs_path->fs_flags & FS_PROJECT_PATH) && index < fs_count); + /* skip project quota entries */ + if ((fs_path->fs_flags & FS_PROJECT_PATH)) + continue; + + /* only consider foreign filesystems if told so */ + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + continue; + + /* We can use this one */ + break; + } while (index < fs_count); if (fs_path->fs_flags & FS_PROJECT_PATH) return 0; + if (!foreign_allowed && (fs_path->fs_flags & FS_FOREIGN)) + return 0; if (index > fs_count) return 0; return index; } +static int +init_check_command( + const cmdinfo_t *ct) +{ + if (fs_path && + !(ct->flags & CMD_FLAG_FOREIGN_OK) && + (fs_path->fs_flags & FS_FOREIGN)) { + fprintf(stderr, + _("foreign mount active, %s command is for XFS filesystems only\n"), + ct->name); + return 0; + } + return 1; +} + static void init( int argc, @@ -104,7 +132,7 @@ init( bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); - while ((c = getopt(argc, argv, "c:d:D:P:p:t:xV")) != EOF) { + while ((c = getopt(argc, argv, "c:d:D:fP:p:t:xV")) != EOF) { switch (c) { case 'c': /* commands */ add_user_command(optarg); @@ -112,6 +140,8 @@ init( case 'd': add_project_opt(optarg); break; + case 'f': + foreign_allowed = true; case 't': mtab_file = optarg; break; @@ -140,6 +170,7 @@ init( init_commands(); add_args_command(init_args_command); + add_check_command(init_check_command); /* * Ensure that global commands don't end up with an invalid path pointer diff --git a/quota/init.h b/quota/init.h index 71706cb..6879855 100644 --- a/quota/init.h +++ b/quota/init.h @@ -19,6 +19,7 @@ extern char *progname; extern int exitcode; extern int expert; +extern bool foreign_allowed; extern void edit_init(void); extern void free_init(void); diff --git a/quota/path.c b/quota/path.c index bdb8c98..a623d25 100644 --- a/quota/path.c +++ b/quota/path.c @@ -42,6 +42,7 @@ printpath( if (number) { printf(_("%c%03d%c "), braces? '[':' ', index, braces? ']':' '); } + printf("%s ", (path->fs_flags & FS_FOREIGN) ? "(F)" : " "); printf(_("%-19s %s"), path->fs_dir, path->fs_name); if (path->fs_flags & FS_PROJECT_PATH) { prj = getprprid(path->fs_prid); @@ -127,7 +128,7 @@ path_init(void) path_cmd.cfunc = path_f; path_cmd.argmin = 0; path_cmd.argmax = 1; - path_cmd.flags = CMD_FLAG_GLOBAL; + path_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; path_cmd.oneline = _("set current path, or show the list of paths"); print_cmd.name = "print"; @@ -135,7 +136,7 @@ path_init(void) print_cmd.cfunc = print_f; print_cmd.argmin = 0; print_cmd.argmax = 0; - print_cmd.flags = CMD_FLAG_GLOBAL; + print_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; print_cmd.oneline = _("list known mount points and projects"); if (expert) diff --git a/quota/project.c b/quota/project.c index fb8b9e1..e4e7a01 100644 --- a/quota/project.c +++ b/quota/project.c @@ -355,6 +355,7 @@ project_init(void) project_cmd.argmax = -1; project_cmd.oneline = _("check, setup or clear project quota trees"); project_cmd.help = project_help; + project_cmd.flags = CMD_FLAG_FOREIGN_OK; if (expert) add_command(&project_cmd); diff --git a/quota/quot.c b/quota/quot.c index 2e583e5..ccc154f 100644 --- a/quota/quot.c +++ b/quota/quot.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include #include diff --git a/quota/quota.c b/quota/quota.c index e0da7c0..d09e239 100644 --- a/quota/quota.c +++ b/quota/quota.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include "command.h" #include #include @@ -469,6 +470,7 @@ quota_init(void) quota_cmd.args = _("[-bir] [-g|-p|-u] [-hnNv] [-f file] [id|name]..."); quota_cmd.oneline = _("show usage and limits"); quota_cmd.help = quota_help; + quota_cmd.flags = CMD_FLAG_FOREIGN_OK; add_command("a_cmd); } diff --git a/quota/report.c b/quota/report.c index 70220b4..604f50d 100644 --- a/quota/report.c +++ b/quota/report.c @@ -15,7 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include #include "command.h" #include #include @@ -618,6 +618,8 @@ report_any_type( if (type & XFS_USER_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_USER_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -629,6 +631,8 @@ report_any_type( if (type & XFS_GROUP_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_GROUP_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -640,6 +644,8 @@ report_any_type( if (type & XFS_PROJ_QUOTA) { fs_cursor_initialise(dir, FS_MOUNT_POINT, &cursor); while ((mount = fs_cursor_next_entry(&cursor))) { + if (!foreign_allowed && (mount->fs_flags & FS_FOREIGN)) + continue; if (xfsquotactl(XFS_QSYNC, mount->fs_name, XFS_PROJ_QUOTA, 0, NULL) < 0 && errno != ENOENT && errno != ENOSYS) @@ -754,16 +760,17 @@ report_init(void) dump_cmd.args = _("[-g|-p|-u] [-f file]"); dump_cmd.oneline = _("dump quota information for backup utilities"); dump_cmd.help = dump_help; + dump_cmd.flags = CMD_FLAG_FOREIGN_OK; report_cmd.name = "report"; report_cmd.altname = "repquota"; report_cmd.cfunc = report_f; report_cmd.argmin = 0; report_cmd.argmax = -1; - report_cmd.flags = CMD_FLAG_GLOBAL; report_cmd.args = _("[-bir] [-gpu] [-ahnt] [-f file]"); report_cmd.oneline = _("report filesystem quota information"); report_cmd.help = report_help; + report_cmd.flags = CMD_FLAG_GLOBAL | CMD_FLAG_FOREIGN_OK; if (expert) { add_command(&dump_cmd); diff --git a/quota/state.c b/quota/state.c index 8186762..d134580 100644 --- a/quota/state.c +++ b/quota/state.c @@ -15,7 +15,7 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - +#include #include "command.h" #include "init.h" #include "quota.h" @@ -527,6 +527,7 @@ state_init(void) off_cmd.args = _("[-gpu] [-v]"); off_cmd.oneline = _("permanently switch quota off for a path"); off_cmd.help = off_help; + off_cmd.flags = CMD_FLAG_FOREIGN_OK; state_cmd.name = "state"; state_cmd.cfunc = state_f; @@ -535,6 +536,7 @@ state_init(void) state_cmd.args = _("[-gpu] [-a] [-v] [-f file]"); state_cmd.oneline = _("get overall quota state information"); state_cmd.help = state_help; + state_cmd.flags = CMD_FLAG_FOREIGN_OK; enable_cmd.name = "enable"; enable_cmd.cfunc = enable_f; diff --git a/quota/util.c b/quota/util.c index e3c5398..cafd45f 100644 --- a/quota/util.c +++ b/quota/util.c @@ -17,6 +17,7 @@ */ #include +#include #include #include #include -- 2.7.4 From billodo@redhat.com Tue Aug 23 17:12:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 09C9B7CA0 for ; Tue, 23 Aug 2016 17:12:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D06C28F8039 for ; Tue, 23 Aug 2016 15:12:46 -0700 (PDT) X-ASG-Debug-ID: 1471990365-0bf57c55b112f990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fsXz4HkAD7WsMjrt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 15:12:46 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 38B7FC057FA6 for ; Tue, 23 Aug 2016 22:12:45 +0000 (UTC) Received: from localhost.localdomain.com (vpn-62-210.rdu2.redhat.com [10.10.62.210]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7NMCipc003014 for ; Tue, 23 Aug 2016 18:12:44 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH v4 0/2] xfs_quota: allow operation on ext4 for project quotas Date: Tue, 23 Aug 2016 17:12:30 -0500 X-ASG-Orig-Subj: [PATCH v4 0/2] xfs_quota: allow operation on ext4 for project quotas Message-Id: <1471990352-31852-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 23 Aug 2016 22:12:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1471990365 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1045 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hello - submitting v4... Version 4 of this series modifies patch 2, removing the unnecessary application of flags for the help and quit commands, and corrects some output message verbiage and comments. Version 3 better documented the introduction of the "-f" (foreign filesystem) flag, along with some minor refactoring of the init_args_command and init_check_command in quota/init.c, to proper functionality and better readability. Patch 2 was superfluous as it was already committed (commit 83f4b5a), so it was removed in v3. This series is a resubmission of Dave Chinner's original 2-patch series to enable using xfs_quota for project quotas on foreign filesystems (e.g. ext4). Original series: http://oss.sgi.com/archives/xfs/2016-02/msg00107.html Updated series: Patch 1: initial capabilities to enable xfs_quota use on foreign filesystems. Patch 2: REMOVED (superfluous) Patch 3: additional changes to accomodate xfs_quota use on foreign filesystems. Questions and comments are welcome. Thanks- Bill From david@fromorbit.com Tue Aug 23 17:36:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 82C467CA0 for ; Tue, 23 Aug 2016 17:36:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07922AC003 for ; Tue, 23 Aug 2016 15:36:53 -0700 (PDT) X-ASG-Debug-ID: 1471991810-0bf57b5312152b80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Z9G7r2ePKY8SXyKB for ; Tue, 23 Aug 2016 15:36:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AugmAKLPvFd5LDUCEGdsb2JhbABegykBAQEBAR6BUoZym3oBAQEBAQEGjHCGFIQMgiuDbAICAQECgW5NAgEBAQEBAgYBAQEBAQEBATdAhGEBBTocIxAIAw4KCSUPBSUDBxoTiDC9YQELASQehUeFFYobBZlIjxePWkiLeIN5gmYcgV4qNIYRAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2016 08:05:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bcKHc-0005gf-II; Wed, 24 Aug 2016 08:35:00 +1000 Date: Wed, 24 Aug 2016 08:35:00 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Felix Janda , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: kill __uint*_t and __int*_t Message-ID: <20160823223500.GZ19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: kill __uint*_t and __int*_t References: <20160807173835.GA20839@nyan> <20160809083332.GA1489@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160809083332.GA1489@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1471991810 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1072 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32266 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 09, 2016 at 01:33:32AM -0700, Christoph Hellwig wrote: > On Sun, Aug 07, 2016 at 07:38:35PM +0200, Felix Janda wrote: > > Replace them by the more widely used uint*_t and int*_t. > > > > Signed-off-by: Felix Janda > > --- > > This patch is essentially a global > > 'sed -i "s/__\(u*\)int\([0-9]*\)_t/\1int\2_t/"'. The only other changes > > are whitespace changes and removing the now unecessary type definitions. > > > > Running 'sed "s/^.//"' on the patch might be useful for checking that > > I didn't mess up the indentation. > > If everyone is fine using (u)int*_t over s*/u* this looks good. I'd > have a slight preference for s*/u* as in the rest of the kernel, but > either way getting rid of our crazy __ types is a good thing. Don't really care that much. I'd prefer (marginally) to go with the (u)int*_t types as userspace then doesn't need a set of typedefs in the platform headers to support the kernel specific types in libxfs code.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Aug 23 18:27:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6AC347CA0 for ; Tue, 23 Aug 2016 18:27:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6A30AC002 for ; Tue, 23 Aug 2016 16:27:12 -0700 (PDT) X-ASG-Debug-ID: 1471994830-0bf57c55b2130de0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id QJS0o7pg9nbHG101 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 16:27:10 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7NNQg3F011497 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 23 Aug 2016 23:26:43 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7NNQguu009499 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 23 Aug 2016 23:26:42 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7NNQfKs013967; Tue, 23 Aug 2016 23:26:41 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 16:26:41 -0700 Date: Tue, 23 Aug 2016 16:26:40 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: Christoph Hellwig , Felix Janda , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: kill __uint*_t and __int*_t Message-ID: <20160823232640.GG8268@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: kill __uint*_t and __int*_t References: <20160807173835.GA20839@nyan> <20160809083332.GA1489@infradead.org> <20160823223500.GZ19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160823223500.GZ19025@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1471994830 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1863 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32268 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 24, 2016 at 08:35:00AM +1000, Dave Chinner wrote: > On Tue, Aug 09, 2016 at 01:33:32AM -0700, Christoph Hellwig wrote: > > On Sun, Aug 07, 2016 at 07:38:35PM +0200, Felix Janda wrote: > > > Replace them by the more widely used uint*_t and int*_t. > > > > > > Signed-off-by: Felix Janda > > > --- > > > This patch is essentially a global > > > 'sed -i "s/__\(u*\)int\([0-9]*\)_t/\1int\2_t/"'. The only other changes > > > are whitespace changes and removing the now unecessary type definitions. > > > > > > Running 'sed "s/^.//"' on the patch might be useful for checking that > > > I didn't mess up the indentation. > > > > If everyone is fine using (u)int*_t over s*/u* this looks good. I'd > > have a slight preference for s*/u* as in the rest of the kernel, but > > either way getting rid of our crazy __ types is a good thing. > > Don't really care that much. I'd prefer (marginally) to go with the > (u)int*_t types as userspace then doesn't need a set of typedefs in > the platform headers to support the kernel specific types in libxfs > code.... I don't mind moving from __uintXX_t to uintXX_t so long as the changes land in the kernel and xfsprogs at the same time. Basically, I use stgit with my kernel/xfsprogs git repos to maintain the stack of patches that go to the mailing lists. Right now the libxfs code in both are nearly identical, so it's very easy to jump to the middle of the stack, make a change, and send it to the other git repo. This becomes much more painful if I have to edit a diff as it jumps between repos so that they apply and build. --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Aug 23 20:19:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 32B477CA0 for ; Tue, 23 Aug 2016 20:19:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AD7C4AC003 for ; Tue, 23 Aug 2016 18:19:30 -0700 (PDT) X-ASG-Debug-ID: 1472001567-0bf8155c75129dd0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id mqrPytPoQHtI0yPp for ; Tue, 23 Aug 2016 18:19:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtIWACv1vFd5LDUCEGdsb2JhbABdgykBAQEBAR6BUoZynAAGjHCKIIYXBAICgWJNAgEBAQEBAgYBAQEBAQEBATdAhGIBBTocIxAIAxgJJQ8FJQMHGhOIML4RAQEBBwIBJB6FR4UVh2yCLwWZSI8Yj1pIi3iDeYRgKjSGegEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2016 10:49:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bcMqV-0005xj-TH; Wed, 24 Aug 2016 11:19:11 +1000 Date: Wed, 24 Aug 2016 11:19:11 +1000 From: Dave Chinner To: Felix Janda Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t Message-ID: <20160824011911.GA19025@dastard> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1472001567 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2773 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32270 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Aug 13, 2016 at 07:04:18PM +0200, Felix Janda wrote: > This patch series does several things related to large file support. > > Patches 1-3 enable transparent LFS in the build system and make it > mandatory. > > Patches 4-9 and 12 replace *64 function and structure aliases. > > Patches 10 and 11 disable fsr on Mac OS X and do cleanup to enable > Patch 12. Further cleanup of the portability code is possible later. > > Patch 13 makes tranparent LFS also mandatory for all users of libxfs. > > Patch 14 finally replaces off64_t by off_t. > > > In comparison to v1: > > Patches 1, 3 and 14 are identical to previous patches. Patches 4-8 are > identical to previous patches, except that some of them are merged. > Patch 9 was previously send separately from the patch series. Patch > 13 is identical to a previous patch except for the commit message. The > other patches are new, grown out of review by Christoph Hellwig. > > Felix Janda (14): > configure: use AC_SYS_LARGEFILE > configure: error out when LFS does not work > remove unecessary definitions of _FILE_OFFSET_BITS > replace [fl]stat64 by equivalent [fl]stat > replace ftruncate64 by equivalent ftruncate > replace lseek64 by equivalent lseek > replace pread64/pwrite64 by equivalent pread/pwrite > replace sendfile64 by equivalent sendfile > fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise > Makefile: disable fsr for Mac OS X > fsr: remove workaround for statvfs on Mac OS X > replace statvfs64 by equivalent statvfs > xfs.h: require transparent LFS for all users > platform: remove use of off64_t So, the patches are fine, and everything works. Problem is, it screws up xfstests because it changes all the error messages that are output to stderr and captured by the test harness. There are quite a few tests that this causes failures for, and because it's stderr, it's not as simple as just adding a new filter to do 'sed -e "s/^\(.*\)64\(: .*$\)/\1\2/"' on stderr. Further, errors returned change, which further screws up xfstests. e.g. old code gives EFBIG when we try to use offsets beyond the supported range, this patchset returns EINVAL. That further complicates any sort of error filtering we'll need to do. I don't have the time or patience to fix up xfstests for every change that people want to make and this series is a non-critical cleanup, so I'm dropping this until the fixups for xfstests are worked out. I'm not going to get to this for weeks at the current rate patches are being thrown at me for inclusion, so I'm not breaking xfstests for everyone while I'm bottlenecked on other, higher priority changes. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 23 20:55:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ACED17CA0 for ; Tue, 23 Aug 2016 20:55:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22BAEAC006 for ; Tue, 23 Aug 2016 18:55:55 -0700 (PDT) X-ASG-Debug-ID: 1472003752-0bf57b5312158440001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FzGhIOxB9TNvcJpN for ; Tue, 23 Aug 2016 18:55:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AroXAGr9vFd5LDUCEGdsb2JhbABdgykBAQEBAR6BUoZynAAGjHCDaoIqhAyGFwICAQECgWNNAgEBAQEBAgYBAQEBAQEBATdAhGEBAQQBJxMcIwULCAMOCgklDwUlAwcaE4gpB716AQEBAQYBAQEBIx6FR4UVgSCGTIIvBYgkhzKJco8YgXeEXIkHSIt4g3mEYCo0hnoBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Aug 2016 11:25:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bcNPz-00060u-FD; Wed, 24 Aug 2016 11:55:51 +1000 Date: Wed, 24 Aug 2016 11:55:51 +1000 From: Dave Chinner To: Artem Savkov Cc: Eric Sandeen , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Message-ID: <20160824015551.GB19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. References: <1471967653-2561-1-git-send-email-asavkov@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471967653-2561-1-git-send-email-asavkov@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1472003753 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1755 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote: > Commit "xfs: only return -errno or success from attr ->put_listent" changes the Please quote commits in --oneline format in changelogs - it makes it much easier to find the change you are refering to if there is both a commit ID and the text string in the commit message. (i.e. text string confirms the commit id is the one you meant to quote). commit 2a6fba6 ("xfs: only return -errno or success from attr ->put_listent") is the one you are refering to here, right? > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient > space in the buffer assuming that setting context->count to -1 would be enough, > but all of the ->put_listent callers only check seen_enough. This results in > a failed assertion: > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 > in insufficient buffer size case. You have a test case? Can you turn it into an xfstest? We really need regression tests that cover issues like this.... > Signed-off-by: Artem Savkov > --- > fs/xfs/xfs_xattr.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c > index ea62245..6290093 100644 > --- a/fs/xfs/xfs_xattr.c > +++ b/fs/xfs/xfs_xattr.c > @@ -147,6 +147,7 @@ __xfs_xattr_put_listent( > arraytop = context->count + prefix_len + namelen + 1; > if (arraytop > context->firstu) { > context->count = -1; /* insufficient space */ > + context->seen_enough = 1; > return 0; > } > offset = (char *)context->alist + context->count; Looks sane, though I don't know how to test it yet.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Tue Aug 23 21:20:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 355C07CA0 for ; Tue, 23 Aug 2016 21:20:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 08ACC8F8033 for ; Tue, 23 Aug 2016 19:20:35 -0700 (PDT) X-ASG-Debug-ID: 1472005233-0bf57c55b4136f50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id uCogDeP0Q2rDsKch (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:20:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2KVfp020206 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:20:32 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7O2KVmY029712 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:20:31 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2KUIM013859; Wed, 24 Aug 2016 02:20:30 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:20:29 -0700 Subject: [PATCH 0/5] xfs: reverse mapping fixes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 0/5] xfs: reverse mapping fixes To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:20:27 -0700 Message-ID: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472005234 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 361 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is a roll-up of a few fixes[1] for reverse-mapping in 4.8. The patches have been xfstested with the 'auto' group on x64 and (afaict) don't cause any regressions. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/for-dave-for-4.8-6 From darrick.wong@oracle.com Tue Aug 23 21:20:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 937E17CA4 for ; Tue, 23 Aug 2016 21:20:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 58BEC8F8033 for ; Tue, 23 Aug 2016 19:20:42 -0700 (PDT) X-ASG-Debug-ID: 1472005240-0bf57b5314158de0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id gD99rwEzXq7pmrHH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:20:40 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2KcFP020317 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:20:39 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2Kc57025539 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:20:38 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2KbLX032281; Wed, 24 Aug 2016 02:20:37 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:20:36 -0700 Subject: [PATCH 1/5] xfs: don't log the entire end of the AGF From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/5] xfs: don't log the entire end of the AGF To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:20:35 -0700 Message-ID: <147200523494.14738.13569285576029583652.stgit@birch.djwong.org> In-Reply-To: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472005240 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1770 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're logging the last non-spare field in the AGF, we don't need to log the spare fields, so plumb in a new AGF logging flag to help us avoid that. (This patch is already in xfsprogs.) Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 2 ++ fs/xfs/libxfs/xfs_format.h | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 3dd8f1d..05b5243 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2278,6 +2278,8 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_btreeblks), offsetof(xfs_agf_t, agf_uuid), offsetof(xfs_agf_t, agf_rmap_blocks), + /* needed so that we don't log the whole rest of the structure: */ + offsetof(xfs_agf_t, agf_spare64), sizeof(xfs_agf_t) }; diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index e6a8bea..270fb5c 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -674,7 +674,8 @@ typedef struct xfs_agf { #define XFS_AGF_BTREEBLKS 0x00000800 #define XFS_AGF_UUID 0x00001000 #define XFS_AGF_RMAP_BLOCKS 0x00002000 -#define XFS_AGF_NUM_BITS 14 +#define XFS_AGF_SPARE64 0x00004000 +#define XFS_AGF_NUM_BITS 15 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_FLAGS \ @@ -691,7 +692,8 @@ typedef struct xfs_agf { { XFS_AGF_LONGEST, "LONGEST" }, \ { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ { XFS_AGF_UUID, "UUID" }, \ - { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" } + { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" }, \ + { XFS_AGF_SPARE64, "SPARE64" } /* disk block (xfs_daddr_t) in the AG */ #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) From darrick.wong@oracle.com Tue Aug 23 21:20:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F3397CA0 for ; Tue, 23 Aug 2016 21:20:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 027AC8F8033 for ; Tue, 23 Aug 2016 19:20:48 -0700 (PDT) X-ASG-Debug-ID: 1472005246-0bf57c55b2136f50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id RqX2ssrEcuRtXy5I (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:20:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2KiPx031645 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:20:44 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7O2Kiet029876 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:20:44 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2KgZn015977; Wed, 24 Aug 2016 02:20:43 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:20:42 -0700 Subject: [PATCH 2/5] xfs: don't perform lookups on zero-height btrees From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/5] xfs: don't perform lookups on zero-height btrees To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:20:41 -0700 Message-ID: <147200524120.14738.16686498030898663475.stgit@birch.djwong.org> In-Reply-To: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472005247 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 743 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the caller passes in a cursor to a zero-height btree (which is impossible), we never set block to anything but NULL, which causes the later dereference of it to crash. Instead, just return -EFSCORRUPTED. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index b5c213a..33f1406 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -1814,6 +1814,10 @@ xfs_btree_lookup( XFS_BTREE_STATS_INC(cur, lookup); + /* No such thing as a zero-level tree. */ + if (cur->bc_nlevels == 0) + return -EFSCORRUPTED; + block = NULL; keyno = 0; From darrick.wong@oracle.com Tue Aug 23 21:20:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C41E77CA0 for ; Tue, 23 Aug 2016 21:20:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86197304051 for ; Tue, 23 Aug 2016 19:20:52 -0700 (PDT) X-ASG-Debug-ID: 1472005250-0bf57b5311158de0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4vMzWzqJfN27NwEv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:20:51 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2Kn0x031690 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:20:49 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7O2KnML029968 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:20:49 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2KmnR015995; Wed, 24 Aug 2016 02:20:48 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:20:48 -0700 Subject: [PATCH 3/5] xfs: fix some key handling problems in _btree_simple_query_range From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/5] xfs: fix some key handling problems in _btree_simple_query_range To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:20:47 -0700 Message-ID: <147200524743.14738.15760103598513525911.stgit@birch.djwong.org> In-Reply-To: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472005251 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1195 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines We only need the record's high key for the first record that we look at; for all records, we /definitely/ need the regular record key. Therefore, fix how the simple range query function gets its keys. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 33f1406..b70d9f9 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -4563,10 +4563,10 @@ xfs_btree_simple_query_range( error = xfs_btree_get_rec(cur, &recp, &stat); if (error || !stat) break; - cur->bc_ops->init_high_key_from_rec(&rec_key, recp); /* Skip if high_key(rec) < low_key. */ if (firstrec) { + cur->bc_ops->init_high_key_from_rec(&rec_key, recp); firstrec = false; diff = cur->bc_ops->diff_two_keys(cur, low_key, &rec_key); @@ -4575,6 +4575,7 @@ xfs_btree_simple_query_range( } /* Stop if high_key < low_key(rec). */ + cur->bc_ops->init_key_from_rec(&rec_key, recp); diff = cur->bc_ops->diff_two_keys(cur, &rec_key, high_key); if (diff > 0) break; From darrick.wong@oracle.com Tue Aug 23 21:20:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF6297CB5 for ; Tue, 23 Aug 2016 21:20:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B543A304051 for ; Tue, 23 Aug 2016 19:20:58 -0700 (PDT) X-ASG-Debug-ID: 1472005256-0bf8155c7712b7b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zZuxS7jDeGr0egzN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:20:57 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2Ktwa031723 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:20:56 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2Ktpa015046 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:20:55 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2KsOS014033; Wed, 24 Aug 2016 02:20:55 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:20:54 -0700 Subject: [PATCH 4/5] xfs: simple btree query range should look right if LE lookup fails From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 4/5] xfs: simple btree query range should look right if LE lookup fails To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:20:53 -0700 Message-ID: <147200525360.14738.17074008566594507843.stgit@birch.djwong.org> In-Reply-To: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472005257 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 986 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the initial LOOKUP_LE in the simple query range fails to find anything, we should attempt to increment the btree cursor to see if there actually /are/ records for what we're trying to find. Without this patch, a bnobt range query of (0, $agsize) returns no results because the leftmost record never has a startblock of zero. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index b70d9f9..0856979 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -4558,6 +4558,13 @@ xfs_btree_simple_query_range( if (error) goto out; + /* Nothing? See if there's anything to the right. */ + if (!stat) { + error = xfs_btree_increment(cur, 0, &stat); + if (error) + goto out; + } + while (stat) { /* Find the record. */ error = xfs_btree_get_rec(cur, &recp, &stat); From darrick.wong@oracle.com Tue Aug 23 21:21:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 016657CA1 for ; Tue, 23 Aug 2016 21:21:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA6D68F8033 for ; Tue, 23 Aug 2016 19:21:11 -0700 (PDT) X-ASG-Debug-ID: 1472005269-0bf57c55b2136f80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id QG3aJAFBg6eOJyLV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:21:10 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2L1DP031989 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:21:02 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2L1MM026075 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:21:01 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2L1eD006917; Wed, 24 Aug 2016 02:21:01 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:21:00 -0700 Subject: [PATCH 5/5] xfs: disallow mounting of realtime + rmap filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 5/5] xfs: disallow mounting of realtime + rmap filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:20:59 -0700 Message-ID: <147200525982.14738.18075322042697360316.stgit@birch.djwong.org> In-Reply-To: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472005269 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 935 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since the kernel doesn't currently support the realtime rmapbt, don't allow such filesystems to be mounted. Support will appear in a future release. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_super.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 24ef83e..fd6be45 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1574,9 +1574,16 @@ xfs_fs_fill_super( } } - if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + if (mp->m_sb.sb_rblocks) { + xfs_alert(mp, + "EXPERIMENTAL reverse mapping btree not compatible with realtime device!"); + error = -EINVAL; + goto out_filestream_unmount; + } xfs_alert(mp, "EXPERIMENTAL reverse mapping btree feature enabled. Use at your own risk!"); + } error = xfs_mountfs(mp); if (error) From darrick.wong@oracle.com Tue Aug 23 21:24:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6F5617CA1 for ; Tue, 23 Aug 2016 21:24:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 01AD1AC002 for ; Tue, 23 Aug 2016 19:24:30 -0700 (PDT) X-ASG-Debug-ID: 1472005468-0bf81509b01238e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id wi5aFJ60N25zWZLf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:24:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2OQ8I023177 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:24:27 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2OQ6M020494 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:24:26 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2OQmj008380; Wed, 24 Aug 2016 02:24:26 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:24:25 -0700 Subject: [PATCH 0/7] xfsprogs: reverse mapping fixes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 0/7] xfsprogs: reverse mapping fixes To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:24:24 -0700 Message-ID: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472005468 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 373 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is a roll-up of a few fixes[1] for reverse-mapping in xfsprogs 4.8. The patches have been xfstested with the 'auto' group on x64 and (afaict) don't cause any regressions. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/xfsprogs/tree/for-dave-for-4.8-6 From darrick.wong@oracle.com Tue Aug 23 21:24:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9BC937CA1 for ; Tue, 23 Aug 2016 21:24:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5F37A30404E for ; Tue, 23 Aug 2016 19:24:39 -0700 (PDT) X-ASG-Debug-ID: 1472005477-0bf57b5311158f10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id vY1qh4i6H92jSklM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:24:37 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2OaeC002143 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:24:36 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2OZg4020657 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:24:35 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2OWZg017637; Wed, 24 Aug 2016 02:24:35 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:24:32 -0700 Subject: [PATCH 1/7] xfs: don't perform lookups on zero-height btrees From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/7] xfs: don't perform lookups on zero-height btrees To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:24:31 -0700 Message-ID: <147200547113.15538.538811110514829359.stgit@birch.djwong.org> In-Reply-To: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472005477 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 708 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the caller passes in a cursor to a zero-height btree (which is impossible), we never set block to anything but NULL, which causes the later dereference of it to crash. Instead, just return -EFSCORRUPTED. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 8391078..cb671f6 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -1810,6 +1810,10 @@ xfs_btree_lookup( XFS_BTREE_STATS_INC(cur, lookup); + /* No such thing as a zero-level tree. */ + if (cur->bc_nlevels == 0) + return -EFSCORRUPTED; + block = NULL; keyno = 0; From darrick.wong@oracle.com Tue Aug 23 21:24:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D887D7CAF for ; Tue, 23 Aug 2016 21:24:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9DCB58F8033 for ; Tue, 23 Aug 2016 19:24:42 -0700 (PDT) X-ASG-Debug-ID: 1472005480-0bf57c55b1137100001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id aKHexUJbKV9qWIHY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:24:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2OdUo023462 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:24:39 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2Od5a030915 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:24:39 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2OcC7015297; Wed, 24 Aug 2016 02:24:38 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:24:38 -0700 Subject: [PATCH 2/7] xfs: fix some key handling problems in _btree_simple_query_range From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/7] xfs: fix some key handling problems in _btree_simple_query_range To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:24:37 -0700 Message-ID: <147200547728.15538.10046761968707267924.stgit@birch.djwong.org> In-Reply-To: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472005480 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1160 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines We only need the record's high key for the first record that we look at; for all records, we /definitely/ need the regular record key. Therefore, fix how the simple range query function gets its keys. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index cb671f6..b69c8d2 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -4563,10 +4563,10 @@ xfs_btree_simple_query_range( error = xfs_btree_get_rec(cur, &recp, &stat); if (error || !stat) break; - cur->bc_ops->init_high_key_from_rec(&rec_key, recp); /* Skip if high_key(rec) < low_key. */ if (firstrec) { + cur->bc_ops->init_high_key_from_rec(&rec_key, recp); firstrec = false; diff = cur->bc_ops->diff_two_keys(cur, low_key, &rec_key); @@ -4575,6 +4575,7 @@ xfs_btree_simple_query_range( } /* Stop if high_key < low_key(rec). */ + cur->bc_ops->init_key_from_rec(&rec_key, recp); diff = cur->bc_ops->diff_two_keys(cur, &rec_key, high_key); if (diff > 0) break; From darrick.wong@oracle.com Tue Aug 23 21:24:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 312F57CA1 for ; Tue, 23 Aug 2016 21:24:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 990F2AC005 for ; Tue, 23 Aug 2016 19:24:49 -0700 (PDT) X-ASG-Debug-ID: 1472005487-0bf57b5312158f30001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Q9RTlJSlGMzUEWVP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:24:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2OkcN023509 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:24:46 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2OjEQ010432 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:24:45 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2OjUx017766; Wed, 24 Aug 2016 02:24:45 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:24:44 -0700 Subject: [PATCH 3/7] xfs: simple btree query range should look right if LE lookup fails From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/7] xfs: simple btree query range should look right if LE lookup fails To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:24:43 -0700 Message-ID: <147200548364.15538.8448801693088924431.stgit@birch.djwong.org> In-Reply-To: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472005487 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 951 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the initial LOOKUP_LE in the simple query range fails to find anything, we should attempt to increment the btree cursor to see if there actually /are/ records for what we're trying to find. Without this patch, a bnobt range query of (0, $agsize) returns no results because the leftmost record never has a startblock of zero. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index b69c8d2..8e928ea 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -4558,6 +4558,13 @@ xfs_btree_simple_query_range( if (error) goto out; + /* Nothing? See if there's anything to the right. */ + if (!stat) { + error = xfs_btree_increment(cur, 0, &stat); + if (error) + goto out; + } + while (stat) { /* Find the record. */ error = xfs_btree_get_rec(cur, &recp, &stat); From darrick.wong@oracle.com Tue Aug 23 21:24:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D700F7CA1 for ; Tue, 23 Aug 2016 21:24:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 81A5730404E for ; Tue, 23 Aug 2016 19:24:57 -0700 (PDT) X-ASG-Debug-ID: 1472005493-0bf8155c7412b960001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id PRGnX390v3uGKf3a (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:24:54 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2Oq9X002278 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:24:53 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7O2Oq0x004492 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:24:52 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2OpAO001405; Wed, 24 Aug 2016 02:24:51 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:24:51 -0700 Subject: [PATCH 4/7] libxcmd: fix mount option parsing to find rt/log devices From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 4/7] libxcmd: fix mount option parsing to find rt/log devices To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:24:50 -0700 Message-ID: <147200548998.15538.11330546457799095768.stgit@birch.djwong.org> In-Reply-To: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472005494 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1504 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines It turns out that glibc's hasmntopt implementation returns NULL if the opt parameter ends with an equals ('='). Therefore, we cannot directly search for the option 'rtdev='; we must instead have hasmntopt look for 'rtdev' and look for the trailing equals sign ourselves. This fixes xfs_info's reporting of external log and realtime device paths, and xfs_scrub will need it for data block scrubbing of realtime extents. Signed-off-by: Darrick J. Wong --- libxcmd/paths.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 71af25f..b08985f 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -234,10 +234,17 @@ fs_extract_mount_options( { char *fslog, *fsrt; - /* Extract log device and realtime device from mount options */ - if ((fslog = hasmntopt(mnt, "logdev="))) + /* + * Extract log device and realtime device from mount options. + * + * Note: the glibc hasmntopt implementation requires that the + * character in mnt_opts immediately after the search string + * must be a NULL ('\0'), a comma (','), or an equals ('='). + * Therefore we cannot search for 'logdev=' directly. + */ + if ((fslog = hasmntopt(mnt, "logdev")) && fslog[6] == '=') fslog += 7; - if ((fsrt = hasmntopt(mnt, "rtdev="))) + if ((fsrt = hasmntopt(mnt, "rtdev")) && fsrt[5] == '=') fsrt += 6; /* Do this only after we've finished processing mount options */ From darrick.wong@oracle.com Tue Aug 23 21:25:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 212DE7CA6 for ; Tue, 23 Aug 2016 21:25:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA3518F8035 for ; Tue, 23 Aug 2016 19:25:01 -0700 (PDT) X-ASG-Debug-ID: 1472005499-0bf81509b0123920001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id rcBDPqxXmNnFBb6q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:24:59 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2OwlD023592 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:24:58 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7O2OwZv004699 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 02:24:58 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2OvZj015478; Wed, 24 Aug 2016 02:24:57 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:24:57 -0700 Subject: [PATCH 5/7] misc: fix Coverity errors From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 5/7] misc: fix Coverity errors To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:24:56 -0700 Message-ID: <147200549633.15538.18051281375686885659.stgit@birch.djwong.org> In-Reply-To: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472005499 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3962 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32272 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Fix various code sloppinesses pointed out by Coverity. Coverity-id: 1371628 - 1371638 Signed-off-by: Darrick J. Wong --- db/fsmap.c | 1 + repair/phase5.c | 12 ++++++++---- repair/rmap.c | 5 +++-- repair/scan.c | 1 + 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/db/fsmap.c b/db/fsmap.c index b2ba55d..4b245b9 100644 --- a/db/fsmap.c +++ b/db/fsmap.c @@ -75,6 +75,7 @@ fsmap( high.rm_owner = ULLONG_MAX; high.rm_offset = ULLONG_MAX; high.rm_flags = XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK | XFS_RMAP_UNWRITTEN; + high.rm_blockcount = low.rm_blockcount = 0; start_ag = XFS_FSB_TO_AGNO(mp, start_fsb); end_ag = XFS_FSB_TO_AGNO(mp, end_fsb); diff --git a/repair/phase5.c b/repair/phase5.c index e583879..5a7185c 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -1464,7 +1464,7 @@ prop_rmap_cursor( * and set the rightsib pointer of current block */ #ifdef XR_BLD_INO_TRACE - fprintf(stderr, " ino prop agbno %d ", lptr->prev_agbno); + fprintf(stderr, " rmap prop agbno %d ", lptr->prev_agbno); #endif if (lptr->prev_agbno != NULLAGBLOCK) { ASSERT(lptr->prev_buf_p != NULL); @@ -1502,7 +1502,7 @@ prop_rmap_cursor( prop_rmap_cursor(mp, agno, btree_curs, rm_rec, level); } /* - * add inode info to current block + * add rmap info to current block */ be16_add_cpu(&bt_hdr->bb_numrecs, 1); @@ -1548,6 +1548,7 @@ prop_rmap_highkey( bt_key->rm_offset = cpu_to_be64( libxfs_rmap_irec_offset_pack(&high_key)); + key.rm_blockcount = 0; for (i = 1; i < numrecs - 1; i++) { bt_key = XFS_RMAP_HIGH_KEY_ADDR(bt_hdr, i); key.rm_startblock = be32_to_cpu(bt_key->rm_startblock); @@ -1621,7 +1622,7 @@ _("Insufficient memory to construct reverse-map cursor.")); rm_rec = pop_slab_cursor(rmap_cur); lptr = &btree_curs->level[0]; - for (i = 0; i < lptr->num_blocks; i++) { + for (i = 0; i < lptr->num_blocks && rm_rec != NULL; i++) { /* * block initialization, lay in block header */ @@ -1639,14 +1640,17 @@ _("Insufficient memory to construct reverse-map cursor.")); if (lptr->modulo > 0) lptr->modulo--; - if (lptr->num_recs_pb > 0) + if (lptr->num_recs_pb > 0) { + ASSERT(rm_rec != NULL); prop_rmap_cursor(mp, agno, btree_curs, rm_rec, 0); + } bt_rec = (struct xfs_rmap_rec *) ((char *)bt_hdr + XFS_RMAP_BLOCK_LEN); highest_key.rm_startblock = 0; highest_key.rm_owner = 0; highest_key.rm_offset = 0; + highest_key.rm_blockcount = 0; for (j = 0; j < be16_to_cpu(bt_hdr->bb_numrecs); j++) { ASSERT(rm_rec != NULL); bt_rec[j].rm_startblock = diff --git a/repair/rmap.c b/repair/rmap.c index f22f4f0..b3d4c25 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -316,7 +316,7 @@ fold_raw_rmaps( struct xfs_slab_cursor *cur = NULL; struct xfs_rmap_irec *prev, *rec; size_t old_sz; - int error; + int error = 0; old_sz = slab_count(ag_rmaps[agno].ar_rmaps); if (slab_count(ag_rmaps[agno].ar_raw_rmaps) == 0) @@ -329,7 +329,7 @@ fold_raw_rmaps( prev = pop_slab_cursor(cur); rec = pop_slab_cursor(cur); - while (rec) { + while (prev && rec) { if (mergeable_rmaps(prev, rec)) { prev->rm_blockcount += rec->rm_blockcount; rec = pop_slab_cursor(cur); @@ -843,6 +843,7 @@ rmap_high_key_from_rec( (rec->rm_flags & XFS_RMAP_BMBT_BLOCK)) return; key->rm_offset += adj; + key->rm_blockcount = 0; } /* diff --git a/repair/scan.c b/repair/scan.c index 9a46dd0..253e3de 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1109,6 +1109,7 @@ advance: key.rm_flags = 0; key.rm_startblock = be32_to_cpu(kp->rm_startblock); key.rm_owner = be64_to_cpu(kp->rm_owner); + key.rm_blockcount = 0; if (libxfs_rmap_irec_offset_unpack(be64_to_cpu(kp->rm_offset), &key)) { /* Look for impossible flags. */ From darrick.wong@oracle.com Tue Aug 23 21:25:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 84ABD7CB1 for ; Tue, 23 Aug 2016 21:25:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 472058F8033 for ; Tue, 23 Aug 2016 19:25:10 -0700 (PDT) X-ASG-Debug-ID: 1472005505-0bf57c55b1137150001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 7bbnz9LlSKjpydLv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:25:05 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2P49Z002620 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:25:04 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2P4PB010894 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:25:04 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7O2P34m008631; Wed, 24 Aug 2016 02:25:04 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:25:03 -0700 Subject: [PATCH 6/7] misc: fix libxfs api violations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 6/7] misc: fix libxfs api violations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:25:02 -0700 Message-ID: <147200550258.15538.5184942465515335880.stgit@birch.djwong.org> In-Reply-To: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472005505 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 31167 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Fix all the client programs to use 'libxfs_' prefixes for non-inline function calls and to negate integer return codes. Signed-off-by: Darrick J. Wong --- db/bmap.c | 4 ++- db/bmroot.c | 4 ++- db/check.c | 6 +++-- db/frag.c | 2 +- db/fsmap.c | 8 +++---- db/init.c | 2 +- db/logformat.c | 2 +- db/metadump.c | 4 ++- io/open.c | 2 +- libxfs/libxfs_api_defs.h | 15 +++++++++++++ mkfs/maxtrres.c | 2 +- mkfs/xfs_mkfs.c | 46 +++++++++++++++++++-------------------- repair/dinode.c | 8 +++---- repair/phase5.c | 50 +++++++++++++++++++++--------------------- repair/phase6.c | 6 +++-- repair/prefetch.c | 4 ++- repair/rmap.c | 24 ++++++++++---------- repair/sb.c | 2 +- tools/find-api-violations.sh | 38 ++++++++++++++++++++++++++++++++ 19 files changed, 141 insertions(+), 88 deletions(-) create mode 100755 tools/find-api-violations.sh diff --git a/db/bmap.c b/db/bmap.c index c71b6b4..58833f7 100644 --- a/db/bmap.c +++ b/db/bmap.c @@ -90,7 +90,7 @@ bmap( push_cur(); rblock = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); fsize = XFS_DFORK_SIZE(dip, mp, whichfork); - pp = XFS_BMDR_PTR_ADDR(rblock, 1, xfs_bmdr_maxrecs(fsize, 0)); + pp = XFS_BMDR_PTR_ADDR(rblock, 1, libxfs_bmdr_maxrecs(fsize, 0)); kp = XFS_BMDR_KEY_ADDR(rblock, 1); bno = select_child(curoffset, kp, pp, be16_to_cpu(rblock->bb_numrecs)); @@ -101,7 +101,7 @@ bmap( if (be16_to_cpu(block->bb_level) == 0) break; pp = XFS_BMBT_PTR_ADDR(mp, block, 1, - xfs_bmbt_maxrecs(mp, mp->m_sb.sb_blocksize, 0)); + libxfs_bmbt_maxrecs(mp, mp->m_sb.sb_blocksize, 0)); kp = XFS_BMBT_KEY_ADDR(mp, block, 1); bno = select_child(curoffset, kp, pp, be16_to_cpu(block->bb_numrecs)); diff --git a/db/bmroot.c b/db/bmroot.c index 0950e19..7697e61 100644 --- a/db/bmroot.c +++ b/db/bmroot.c @@ -140,7 +140,7 @@ bmroota_ptr_offset( ASSERT(XFS_DFORK_Q(dip) && (char *)block == XFS_DFORK_APTR(dip)); ASSERT(be16_to_cpu(block->bb_level) > 0); pp = XFS_BMDR_PTR_ADDR(block, idx, - xfs_bmdr_maxrecs(XFS_DFORK_ASIZE(dip, mp), 0)); + libxfs_bmdr_maxrecs(XFS_DFORK_ASIZE(dip, mp), 0)); return bitize((int)((char *)pp - (char *)block)); } @@ -235,7 +235,7 @@ bmrootd_ptr_offset( block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff)); ASSERT(be16_to_cpu(block->bb_level) > 0); pp = XFS_BMDR_PTR_ADDR(block, idx, - xfs_bmdr_maxrecs(XFS_DFORK_DSIZE(dip, mp), 0)); + libxfs_bmdr_maxrecs(XFS_DFORK_DSIZE(dip, mp), 0)); return bitize((int)((char *)pp - (char *)block)); } diff --git a/db/check.c b/db/check.c index 11c6b56..a6a8372 100644 --- a/db/check.c +++ b/db/check.c @@ -2186,7 +2186,7 @@ process_btinode( return; } if (be16_to_cpu(dib->bb_numrecs) > - xfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), + libxfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), be16_to_cpu(dib->bb_level) == 0)) { if (!sflag || id->ilist) dbprintf(_("numrecs for ino %lld %s fork bmap root too " @@ -2204,7 +2204,7 @@ process_btinode( *nex += be16_to_cpu(dib->bb_numrecs); return; } else { - pp = XFS_BMDR_PTR_ADDR(dib, 1, xfs_bmdr_maxrecs( + pp = XFS_BMDR_PTR_ADDR(dib, 1, libxfs_bmdr_maxrecs( XFS_DFORK_SIZE(dip, mp, whichfork), 0)); for (i = 0; i < be16_to_cpu(dib->bb_numrecs); i++) scan_lbtree(get_unaligned_be64(&pp[i]), @@ -2684,7 +2684,7 @@ process_inode( error++; return; } - if (!xfs_dinode_good_version(mp, xino.i_d.di_version)) { + if (!libxfs_dinode_good_version(mp, xino.i_d.di_version)) { if (isfree || v) dbprintf(_("bad version number %#x for inode %lld\n"), xino.i_d.di_version, ino); diff --git a/db/frag.c b/db/frag.c index e11b140..8005e45 100644 --- a/db/frag.c +++ b/db/frag.c @@ -260,7 +260,7 @@ process_btinode( return; } pp = XFS_BMDR_PTR_ADDR(dib, 1, - xfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), 0)); + libxfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), 0)); for (i = 0; i < be16_to_cpu(dib->bb_numrecs); i++) scan_lbtree(get_unaligned_be64(&pp[i]), be16_to_cpu(dib->bb_level), scanfunc_bmap, extmapp, diff --git a/db/fsmap.c b/db/fsmap.c index 4b245b9..67fed20 100644 --- a/db/fsmap.c +++ b/db/fsmap.c @@ -85,13 +85,13 @@ fsmap( if (agno == end_ag) high.rm_startblock = XFS_FSB_TO_AGBNO(mp, end_fsb); - error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + error = -libxfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); if (error) { dbprintf(_("Error %d while reading AGF.\n"), error); return; } - bt_cur = xfs_rmapbt_init_cursor(mp, NULL, agbp, agno); + bt_cur = libxfs_rmapbt_init_cursor(mp, NULL, agbp, agno); if (!bt_cur) { libxfs_putbuf(agbp); dbprintf(_("Not enough memory.\n")); @@ -102,14 +102,14 @@ fsmap( error = -libxfs_rmap_query_range(bt_cur, &low, &high, fsmap_fn, &info); if (error) { - xfs_btree_del_cursor(bt_cur, XFS_BTREE_ERROR); + libxfs_btree_del_cursor(bt_cur, XFS_BTREE_ERROR); libxfs_putbuf(agbp); dbprintf(_("Error %d while querying fsmap btree.\n"), error); return; } - xfs_btree_del_cursor(bt_cur, XFS_BTREE_NOERROR); + libxfs_btree_del_cursor(bt_cur, XFS_BTREE_NOERROR); libxfs_putbuf(agbp); if (agno == start_ag) diff --git a/db/init.c b/db/init.c index c0472c8..ec1e274 100644 --- a/db/init.c +++ b/db/init.c @@ -164,7 +164,7 @@ init( */ if (sbp->sb_rootino != NULLFSINO && xfs_sb_version_haslazysbcount(&mp->m_sb)) { - int error = xfs_initialize_perag_data(mp, sbp->sb_agcount); + int error = -libxfs_initialize_perag_data(mp, sbp->sb_agcount); if (error) { fprintf(stderr, _("%s: cannot init perag data (%d). Continuing anyway.\n"), diff --git a/db/logformat.c b/db/logformat.c index 254f33d..70097bc 100644 --- a/db/logformat.c +++ b/db/logformat.c @@ -101,7 +101,7 @@ logformat_f(int argc, char **argv) dbprintf("Formatting the log to cycle %d, stripe unit %d bytes.\n", cycle, lsunit); - error = libxfs_log_clear(mp->m_logdev_targp, NULL, + error = -libxfs_log_clear(mp->m_logdev_targp, NULL, mp->m_log->l_logBBstart, mp->m_log->l_logBBsize, &mp->m_sb.sb_uuid, logversion, lsunit, diff --git a/db/metadump.c b/db/metadump.c index 609a5d7..44359e1 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -2016,7 +2016,7 @@ process_btinode( nrecs, itype); } - maxrecs = xfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), 0); + maxrecs = libxfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), 0); if (nrecs > maxrecs) { if (show_warnings) print_warning("invalid numrecs (%u) in inode %lld %s " @@ -2132,7 +2132,7 @@ process_inode( /* we only care about crc recalculation if we will modify the inode. */ if (obfuscate || zero_stale_data) { - crc_was_ok = xfs_verify_cksum((char *)dip, + crc_was_ok = libxfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, offsetof(struct xfs_dinode, di_crc)); } diff --git a/io/open.c b/io/open.c index 2303527..a5d465a 100644 --- a/io/open.c +++ b/io/open.c @@ -878,7 +878,7 @@ inode_f( lastgrp--; lastino = igroup[lastgrp].xi_startino + - xfs_highbit64(igroup[lastgrp].xi_allocmask); + libxfs_highbit64(igroup[lastgrp].xi_allocmask); if (verbose) printf("%llu:%d\n", lastino, diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 993ca9f..626c79f 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -122,4 +122,19 @@ #define xfs_verify_cksum libxfs_verify_cksum +#define xfs_alloc_ag_max_usable libxfs_alloc_ag_max_usable +#define xfs_allocbt_maxrecs libxfs_allocbt_maxrecs +#define xfs_bmbt_maxrecs libxfs_bmbt_maxrecs +#define xfs_bmdr_maxrecs libxfs_bmdr_maxrecs +#define xfs_btree_init_block libxfs_btree_init_block +#define xfs_dir_ino_validate libxfs_dir_ino_validate +#define xfs_initialize_perag_data libxfs_initialize_perag_data +#define xfs_inobt_maxrecs libxfs_inobt_maxrecs +#define xfs_iread_extents libxfs_iread_extents +#define xfs_log_calc_minimum_size libxfs_log_calc_minimum_size +#define xfs_perag_get libxfs_perag_get +#define xfs_perag_put libxfs_perag_put +#define xfs_prealloc_blocks libxfs_prealloc_blocks +#define xfs_dinode_good_version libxfs_dinode_good_version + #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index fc24eac..d7978b6 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -77,7 +77,7 @@ max_trans_res( sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_RMAPBT; libxfs_mount(&mount, sbp, 0,0,0,0); - maxfsb = xfs_log_calc_minimum_size(&mount); + maxfsb = libxfs_log_calc_minimum_size(&mount); libxfs_umount(&mount); #if 0 diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 8c69f69..580119e 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2675,7 +2675,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), /* * sb_versionnum, finobt and rmapbt flags must be set before we use - * xfs_prealloc_blocks(). + * libxfs_prealloc_blocks(). */ sb_set_features(&mp->m_sb, &sb_feat, sectorsize, lsectorsize, dsunit); @@ -2687,12 +2687,12 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), */ if (!logsize) { logblocks = MIN(logblocks, - xfs_alloc_ag_max_usable(mp)); + libxfs_alloc_ag_max_usable(mp)); /* revalidate the log size is valid if we changed it */ validate_log_size(logblocks, blocklog, min_logblocks); } - if (logblocks > agsize - xfs_prealloc_blocks(mp)) { + if (logblocks > agsize - libxfs_prealloc_blocks(mp)) { fprintf(stderr, _("internal log size %lld too large, must fit in allocation group\n"), (long long)logblocks); @@ -2709,7 +2709,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), } else logagno = (xfs_agnumber_t)(agcount / 2); - logstart = XFS_AGB_TO_FSB(mp, logagno, xfs_prealloc_blocks(mp)); + logstart = XFS_AGB_TO_FSB(mp, logagno, libxfs_prealloc_blocks(mp)); /* * Align the logstart at stripe unit boundary. */ @@ -2788,7 +2788,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), sbp->sb_imax_pct = imaxpct; sbp->sb_icount = 0; sbp->sb_ifree = 0; - sbp->sb_fdblocks = dblocks - agcount * xfs_prealloc_blocks(mp) - + sbp->sb_fdblocks = dblocks - agcount * libxfs_prealloc_blocks(mp) - (loginternal ? logblocks : 0); sbp->sb_frextents = 0; /* will do a free later */ sbp->sb_uquotino = sbp->sb_gquotino = sbp->sb_pquotino = 0; @@ -2893,7 +2893,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), for (agno = 0; agno < agcount; agno++) { struct xfs_agfl *agfl; int bucket; - struct xfs_perag *pag = xfs_perag_get(mp, agno); + struct xfs_perag *pag = libxfs_perag_get(mp, agno); /* * Superblock. @@ -2937,7 +2937,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), agf->agf_flfirst = 0; agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); agf->agf_flcount = 0; - nbmblocks = (xfs_extlen_t)(agsize - xfs_prealloc_blocks(mp)); + nbmblocks = (xfs_extlen_t)(agsize - libxfs_prealloc_blocks(mp)); agf->agf_freeblks = cpu_to_be32(nbmblocks); agf->agf_longest = cpu_to_be32(nbmblocks); if (xfs_sb_version_hascrc(&mp->m_sb)) @@ -2948,8 +2948,8 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), agf->agf_longest = cpu_to_be32(agsize - XFS_FSB_TO_AGBNO(mp, logstart) - logblocks); } - if (xfs_alloc_min_freelist(mp, pag) > worst_freelist) - worst_freelist = xfs_alloc_min_freelist(mp, pag); + if (libxfs_alloc_min_freelist(mp, pag) > worst_freelist) + worst_freelist = libxfs_alloc_min_freelist(mp, pag); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); /* @@ -3011,14 +3011,14 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), block = XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, buf, XFS_ABTB_CRC_MAGIC, 0, 1, + libxfs_btree_init_block(mp, buf, XFS_ABTB_CRC_MAGIC, 0, 1, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, buf, XFS_ABTB_MAGIC, 0, 1, + libxfs_btree_init_block(mp, buf, XFS_ABTB_MAGIC, 0, 1, agno, 0); arec = XFS_ALLOC_REC_ADDR(mp, block, 1); - arec->ar_startblock = cpu_to_be32(xfs_prealloc_blocks(mp)); + arec->ar_startblock = cpu_to_be32(libxfs_prealloc_blocks(mp)); if (loginternal && agno == logagno) { if (lalign) { /* @@ -3066,14 +3066,14 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), block = XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, buf, XFS_ABTC_CRC_MAGIC, 0, 1, + libxfs_btree_init_block(mp, buf, XFS_ABTC_CRC_MAGIC, 0, 1, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, buf, XFS_ABTC_MAGIC, 0, 1, + libxfs_btree_init_block(mp, buf, XFS_ABTC_MAGIC, 0, 1, agno, 0); arec = XFS_ALLOC_REC_ADDR(mp, block, 1); - arec->ar_startblock = cpu_to_be32(xfs_prealloc_blocks(mp)); + arec->ar_startblock = cpu_to_be32(libxfs_prealloc_blocks(mp)); if (loginternal && agno == logagno) { if (lalign) { arec->ar_blockcount = cpu_to_be32( @@ -3111,10 +3111,10 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), block = XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, buf, XFS_IBT_CRC_MAGIC, 0, 0, + libxfs_btree_init_block(mp, buf, XFS_IBT_CRC_MAGIC, 0, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, buf, XFS_IBT_MAGIC, 0, 0, + libxfs_btree_init_block(mp, buf, XFS_IBT_MAGIC, 0, 0, agno, 0); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); @@ -3129,10 +3129,10 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), block = XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, buf, XFS_FIBT_CRC_MAGIC, 0, 0, + libxfs_btree_init_block(mp, buf, XFS_FIBT_CRC_MAGIC, 0, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, buf, XFS_FIBT_MAGIC, 0, 0, + libxfs_btree_init_block(mp, buf, XFS_FIBT_MAGIC, 0, 0, agno, 0); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); } @@ -3148,7 +3148,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), block = XFS_BUF_TO_BLOCK(buf); memset(block, 0, blocksize); - xfs_btree_init_block(mp, buf, XFS_RMAP_CRC_MAGIC, 0, 0, + libxfs_btree_init_block(mp, buf, XFS_RMAP_CRC_MAGIC, 0, 0, agno, XFS_BTREE_CRC_BLOCKS); /* @@ -3203,7 +3203,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); } - xfs_perag_put(pag); + libxfs_perag_put(pag); } /* @@ -3241,10 +3241,10 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), args.mp = mp; args.agno = agno; args.alignment = 1; - args.pag = xfs_perag_get(mp,agno); + args.pag = libxfs_perag_get(mp,agno); libxfs_alloc_fix_freelist(&args, 0); - xfs_perag_put(args.pag); + libxfs_perag_put(args.pag); libxfs_trans_commit(tp); } diff --git a/repair/dinode.c b/repair/dinode.c index 89163b1..db55860 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -131,7 +131,7 @@ clear_dinode_core(struct xfs_mount *mp, xfs_dinode_t *dinoc, xfs_ino_t ino_num) dinoc->di_magic = cpu_to_be16(XFS_DINODE_MAGIC); } - if (!xfs_dinode_good_version(mp, dinoc->di_version)) { + if (!libxfs_dinode_good_version(mp, dinoc->di_version)) { __dirty_no_modify_ret(dirty); if (xfs_sb_version_hascrc(&mp->m_sb)) dinoc->di_version = 3; @@ -966,7 +966,7 @@ _("bad numrecs 0 in inode %" PRIu64 " bmap btree root block\n"), init_bm_cursor(&cursor, level + 1); pp = XFS_BMDR_PTR_ADDR(dib, 1, - xfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), 0)); + libxfs_bmdr_maxrecs(XFS_DFORK_SIZE(dip, mp, whichfork), 0)); pkey = XFS_BMDR_KEY_ADDR(dib, 1); last_key = NULLFILEOFF; @@ -2240,7 +2240,7 @@ process_dinode_int(xfs_mount_t *mp, * rewritten, and the CRC is updated automagically. */ if (xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_verify_cksum((char *)dino, mp->m_sb.sb_inodesize, + !libxfs_verify_cksum((char *)dino, mp->m_sb.sb_inodesize, XFS_DINODE_CRC_OFF)) { retval = 1; if (!uncertain) @@ -2271,7 +2271,7 @@ process_dinode_int(xfs_mount_t *mp, } } - if (!xfs_dinode_good_version(mp, dino->di_version)) { + if (!libxfs_dinode_good_version(mp, dino->di_version)) { retval = 1; if (!uncertain) do_warn(_("bad version number 0x%x on inode %" PRIu64 "%c"), diff --git a/repair/phase5.c b/repair/phase5.c index 5a7185c..93b1f75 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -360,7 +360,7 @@ finish_cursor(bt_status_t *curs) * XXX(hch): any reason we don't just look at mp->m_alloc_mxr? */ #define XR_ALLOC_BLOCK_MAXRECS(mp, level) \ - (xfs_allocbt_maxrecs((mp), (mp)->m_sb.sb_blocksize, (level) == 0) - 2) + (libxfs_allocbt_maxrecs((mp), (mp)->m_sb.sb_blocksize, (level) == 0) - 2) /* * this calculates a freespace cursor for an ag. @@ -693,10 +693,10 @@ prop_freespace_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, lptr->buf_p, crc_magic, level, + libxfs_btree_init_block(mp, lptr->buf_p, crc_magic, level, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, magic, level, + libxfs_btree_init_block(mp, lptr->buf_p, magic, level, 0, agno, 0); bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); @@ -779,10 +779,10 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, lptr->buf_p, crc_magic, i, + libxfs_btree_init_block(mp, lptr->buf_p, crc_magic, i, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, magic, i, + libxfs_btree_init_block(mp, lptr->buf_p, magic, i, 0, agno, 0); } /* @@ -811,10 +811,10 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, lptr->buf_p, crc_magic, 0, + libxfs_btree_init_block(mp, lptr->buf_p, crc_magic, 0, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, magic, 0, + libxfs_btree_init_block(mp, lptr->buf_p, magic, 0, 0, agno, 0); bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); @@ -895,7 +895,7 @@ build_freespace_tree(xfs_mount_t *mp, xfs_agnumber_t agno, * XXX(hch): any reason we don't just look at mp->m_inobt_mxr? */ #define XR_INOBT_BLOCK_MAXRECS(mp, level) \ - xfs_inobt_maxrecs((mp), (mp)->m_sb.sb_blocksize, \ + libxfs_inobt_maxrecs((mp), (mp)->m_sb.sb_blocksize, \ (level) == 0) /* @@ -1073,11 +1073,11 @@ prop_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, + libxfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_CRC_MAGIC, level, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, + libxfs_btree_init_block(mp, lptr->buf_p, XFS_IBT_MAGIC, level, 0, agno, 0); bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); @@ -1198,11 +1198,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, lptr->buf_p, magic, + libxfs_btree_init_block(mp, lptr->buf_p, magic, i, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, magic, + libxfs_btree_init_block(mp, lptr->buf_p, magic, i, 0, agno, 0); } @@ -1232,11 +1232,11 @@ build_ino_tree(xfs_mount_t *mp, xfs_agnumber_t agno, bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); if (xfs_sb_version_hascrc(&mp->m_sb)) - xfs_btree_init_block(mp, lptr->buf_p, magic, + libxfs_btree_init_block(mp, lptr->buf_p, magic, 0, 0, agno, XFS_BTREE_CRC_BLOCKS); else - xfs_btree_init_block(mp, lptr->buf_p, magic, + libxfs_btree_init_block(mp, lptr->buf_p, magic, 0, 0, agno, 0); bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); @@ -1490,7 +1490,7 @@ prop_rmap_cursor( lptr->buf_p->b_ops = &xfs_rmapbt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); - xfs_btree_init_block(mp, lptr->buf_p, XFS_RMAP_CRC_MAGIC, + libxfs_btree_init_block(mp, lptr->buf_p, XFS_RMAP_CRC_MAGIC, level, 0, agno, XFS_BTREE_CRC_BLOCKS); @@ -1604,7 +1604,7 @@ build_rmap_tree( lptr->buf_p->b_ops = &xfs_rmapbt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); - xfs_btree_init_block(mp, lptr->buf_p, XFS_RMAP_CRC_MAGIC, + libxfs_btree_init_block(mp, lptr->buf_p, XFS_RMAP_CRC_MAGIC, i, 0, agno, XFS_BTREE_CRC_BLOCKS); } @@ -1629,7 +1629,7 @@ _("Insufficient memory to construct reverse-map cursor.")); lptr->buf_p->b_ops = &xfs_rmapbt_buf_ops; bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); memset(bt_hdr, 0, mp->m_sb.sb_blocksize); - xfs_btree_init_block(mp, lptr->buf_p, XFS_RMAP_CRC_MAGIC, + libxfs_btree_init_block(mp, lptr->buf_p, XFS_RMAP_CRC_MAGIC, 0, 0, agno, XFS_BTREE_CRC_BLOCKS); @@ -2162,21 +2162,21 @@ phase5(xfs_mount_t *mp) #ifdef XR_BLD_FREE_TRACE fprintf(stderr, "inobt level 1, maxrec = %d, minrec = %d\n", - xfs_inobt_maxrecs(mp, mp->m_sb.sb_blocksize, 0), - xfs_inobt_maxrecs(mp, mp->m_sb.sb_blocksize, 0) / 2); + libxfs_inobt_maxrecs(mp, mp->m_sb.sb_blocksize, 0), + libxfs_inobt_maxrecs(mp, mp->m_sb.sb_blocksize, 0) / 2); fprintf(stderr, "inobt level 0 (leaf), maxrec = %d, minrec = %d\n", - xfs_inobt_maxrecs(mp, mp->m_sb.sb_blocksize, 1), - xfs_inobt_maxrecs(mp, mp->m_sb.sb_blocksize, 1) / 2); + libxfs_inobt_maxrecs(mp, mp->m_sb.sb_blocksize, 1), + libxfs_inobt_maxrecs(mp, mp->m_sb.sb_blocksize, 1) / 2); fprintf(stderr, "xr inobt level 0 (leaf), maxrec = %d\n", XR_INOBT_BLOCK_MAXRECS(mp, 0)); fprintf(stderr, "xr inobt level 1 (int), maxrec = %d\n", XR_INOBT_BLOCK_MAXRECS(mp, 1)); fprintf(stderr, "bnobt level 1, maxrec = %d, minrec = %d\n", - xfs_allocbt_maxrecs(mp, mp->m_sb.sb_blocksize, 0), - xfs_allocbt_maxrecs(mp, mp->m_sb.sb_blocksize, 0) / 2); + libxfs_allocbt_maxrecs(mp, mp->m_sb.sb_blocksize, 0), + libxfs_allocbt_maxrecs(mp, mp->m_sb.sb_blocksize, 0) / 2); fprintf(stderr, "bnobt level 0 (leaf), maxrec = %d, minrec = %d\n", - xfs_allocbt_maxrecs(mp, mp->m_sb.sb_blocksize, 1), - xfs_allocbt_maxrecs(mp, mp->m_sb.sb_blocksize, 1) / 2); + libxfs_allocbt_maxrecs(mp, mp->m_sb.sb_blocksize, 1), + libxfs_allocbt_maxrecs(mp, mp->m_sb.sb_blocksize, 1) / 2); #endif /* * make sure the root and realtime inodes show up allocated diff --git a/repair/phase6.c b/repair/phase6.c index 2500def..973a5f8 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -451,7 +451,7 @@ bmap_next_offset( } ifp = XFS_IFORK_PTR(ip, whichfork); if (!(ifp->if_flags & XFS_IFEXTENTS) && - (error = xfs_iread_extents(tp, ip, whichfork))) + (error = -libxfs_iread_extents(tp, ip, whichfork))) return error; bno = *bnop + 1; libxfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, @@ -1286,7 +1286,7 @@ longform_dir2_rebuild( */ pip.i_ino = get_inode_parent(irec, ino_offset); if (pip.i_ino == NULLFSINO || - xfs_dir_ino_validate(mp, pip.i_ino)) + libxfs_dir_ino_validate(mp, pip.i_ino)) pip.i_ino = mp->m_sb.sb_rootino; libxfs_defer_init(&dfops, &firstblock); @@ -1311,7 +1311,7 @@ longform_dir2_rebuild( ASSERT(done); - error = libxfs_dir_init(tp, ip, &pip); + error = -libxfs_dir_init(tp, ip, &pip); if (error) { do_warn(_("xfs_dir_init failed -- error - %d\n"), error); goto out_bmap_cancel; diff --git a/repair/prefetch.c b/repair/prefetch.c index b4f20d9..b76a784 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -369,7 +369,7 @@ pf_read_btinode( return; dsize = XFS_DFORK_DSIZE(dino, mp); - pp = XFS_BMDR_PTR_ADDR(dib, 1, xfs_bmdr_maxrecs(dsize, 0)); + pp = XFS_BMDR_PTR_ADDR(dib, 1, libxfs_bmdr_maxrecs(dsize, 0)); for (i = 0; i < numrecs; i++) { dbno = get_unaligned_be64(&pp[i]); @@ -431,7 +431,7 @@ pf_read_inode_dirs( if (be16_to_cpu(dino->di_magic) != XFS_DINODE_MAGIC) continue; - if (!xfs_dinode_good_version(mp, dino->di_version)) + if (!libxfs_dinode_good_version(mp, dino->di_version)) continue; if (be64_to_cpu(dino->di_size) <= XFS_DFORK_DSIZE(dino, mp)) diff --git a/repair/rmap.c b/repair/rmap.c index b3d4c25..43b821d 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -61,8 +61,8 @@ rmap_compare( __u64 ob; pa = a; pb = b; - oa = xfs_rmap_irec_offset_pack(pa); - ob = xfs_rmap_irec_offset_pack(pb); + oa = libxfs_rmap_irec_offset_pack(pa); + ob = libxfs_rmap_irec_offset_pack(pb); if (pa->rm_startblock < pb->rm_startblock) return -1; @@ -498,7 +498,7 @@ store_ag_btree_rmap_data( goto err; /* Add the AGFL blocks to the rmap list */ - error = libxfs_trans_read_buf( + error = -libxfs_trans_read_buf( mp, NULL, mp->m_ddev_targp, XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), XFS_FSS_TO_BB(mp, 1), 0, &agflbp, &xfs_agfl_buf_ops); @@ -536,13 +536,13 @@ store_ag_btree_rmap_data( if (error) goto err_slab; - error = libxfs_alloc_read_agf(mp, tp, agno, 0, &agbp); + error = -libxfs_alloc_read_agf(mp, tp, agno, 0, &agbp); if (error) goto err_trans; ASSERT(XFS_RMAP_NON_INODE_OWNER(rm_rec->rm_owner)); libxfs_rmap_ag_owner(&oinfo, rm_rec->rm_owner); - error = libxfs_rmap_alloc(tp, agbp, agno, rm_rec->rm_startblock, + error = -libxfs_rmap_alloc(tp, agbp, agno, rm_rec->rm_startblock, rm_rec->rm_blockcount, &oinfo); if (error) goto err_trans; @@ -716,9 +716,9 @@ check_rmaps( goto err; /* Leave the per-ag data "uninitialized" since we rewrite it later */ - pag = xfs_perag_get(mp, agno); + pag = libxfs_perag_get(mp, agno); pag->pagf_init = 0; - xfs_perag_put(pag); + libxfs_perag_put(pag); bt_cur = libxfs_rmapbt_init_cursor(mp, NULL, agbp, agno); if (!bt_cur) { @@ -804,10 +804,10 @@ rmap_diffkeys( tmp = *kp1; tmp.rm_flags &= ~XFS_RMAP_REC_FLAGS; - oa = xfs_rmap_irec_offset_pack(&tmp); + oa = libxfs_rmap_irec_offset_pack(&tmp); tmp = *kp2; tmp.rm_flags &= ~XFS_RMAP_REC_FLAGS; - ob = xfs_rmap_irec_offset_pack(&tmp); + ob = libxfs_rmap_irec_offset_pack(&tmp); d = (__int64_t)kp1->rm_startblock - kp2->rm_startblock; if (d) @@ -867,7 +867,7 @@ fix_freelist( args.mp = mp; args.agno = agno; args.alignment = 1; - args.pag = xfs_perag_get(mp, agno); + args.pag = libxfs_perag_get(mp, agno); error = -libxfs_trans_alloc(mp, &tres, libxfs_alloc_min_freelist(mp, args.pag), 0, 0, &tp); if (error) @@ -899,8 +899,8 @@ fix_freelist( flags = XFS_ALLOC_FLAG_NOSHRINK; if (skip_rmapbt) flags |= XFS_ALLOC_FLAG_NORMAP; - error = libxfs_alloc_fix_freelist(&args, flags); - xfs_perag_put(args.pag); + error = -libxfs_alloc_fix_freelist(&args, flags); + libxfs_perag_put(args.pag); if (error) { do_error(_("failed to fix AGFL on AG %d, error %d\n"), agno, error); diff --git a/repair/sb.c b/repair/sb.c index a8170ba..ac13a66 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -384,7 +384,7 @@ verify_sb(char *sb_buf, xfs_sb_t *sb, int is_primary_sb) /* sector size in range - CRC check time */ if (xfs_sb_version_hascrc(sb) && - !xfs_verify_cksum(sb_buf, sb->sb_sectsize, XFS_SB_CRC_OFF)) + !libxfs_verify_cksum(sb_buf, sb->sb_sectsize, XFS_SB_CRC_OFF)) return XR_BAD_CRC; /* check to ensure blocksize and blocklog are legal */ diff --git a/tools/find-api-violations.sh b/tools/find-api-violations.sh new file mode 100755 index 0000000..7937749 --- /dev/null +++ b/tools/find-api-violations.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Find libxfs API violations -- calls to functions defined in libxfs/*.c that +# don't use the libxfs wrappers; or failing to negate the integer return +# values. + +# NOTE: This script doesn't look for API violations in function parameters. + +tool_dirs="copy db estimate fs fsck fsr growfs io mdrestore mkfs quota repair rtcp" + +# Calls to xfs_* functions in libxfs/*.c without the libxfs_ prefix +find_possible_api_calls() { + grep -rn '[[:space:],-(]xfs_[a-z_]*(' $tool_dirs | sed -e 's/^.*\(xfs_[a-z_]*\)(.*$/\1/g' | sort | uniq +} + +check_if_api_calls() { + while read f; do grep "^$f(" libxfs/*.c; done | sed -e 's/^.*:xfs_/xfs_/g' -e 's/.$//g' +} + +find_libxfs_violations() { + grep -r -n -f <(find_possible_api_calls | check_if_api_calls | sed -e 's/^/[[:space:],-(]/g' -e 's/$/(/g' ) $tool_dirs +} + +# libxfs calls without negated error codes +find_errcode_violations() { + grep -r -n 'err.* = libxfs' $tool_dirs +} + +# Find xfs_* calls that are in the libxfs definition list +find_possible_libxfs_api_calls() { + grep '#define[[:space:]]*xfs' libxfs/libxfs_api_defs.h | awk '{print $2}' +} + +find_libxfs_api_violations() { + grep -r -n -f <(find_possible_libxfs_api_calls | sed -e 's/^/[[:space:],-(]/g' -e 's/$/(/g') $tool_dirs +} + +(find_libxfs_violations ; find_errcode_violations ; find_libxfs_api_violations) | sort -g -t ':' -k 2 | sort -g -t ':' -k 1 | uniq From darrick.wong@oracle.com Tue Aug 23 21:25:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5197D7CC7 for ; Tue, 23 Aug 2016 21:25:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 23A138F8039 for ; Tue, 23 Aug 2016 19:25:15 -0700 (PDT) X-ASG-Debug-ID: 1472005512-0bf57b5314158f60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HRL6tUnrDlw1J2iH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 23 Aug 2016 19:25:12 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7O2PBgs002766 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:25:11 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2PBnc011298 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 02:25:11 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7O2PAso001463; Wed, 24 Aug 2016 02:25:10 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 23 Aug 2016 19:25:09 -0700 Subject: [PATCH 7/7] xfs_repair: fix naming problems in repair/rmap.c From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 7/7] xfs_repair: fix naming problems in repair/rmap.c To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Tue, 23 Aug 2016 19:25:08 -0700 Message-ID: <147200550894.15538.9346863758990497173.stgit@birch.djwong.org> In-Reply-To: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472005512 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16177 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The utility functions in repair/rmap.c should all have a prefix of 'rmap_' so that they are easily identifiable. Signed-off-by: Darrick J. Wong --- repair/dinode.c | 2 + repair/phase4.c | 12 ++++---- repair/phase5.c | 6 ++-- repair/rmap.c | 76 ++++++++++++++++++++++++++------------------------- repair/rmap.h | 26 +++++++++-------- repair/scan.c | 4 +-- repair/xfs_repair.c | 4 +-- 7 files changed, 65 insertions(+), 65 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index db55860..512a668 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -782,7 +782,7 @@ _("illegal state %d in block map %" PRIu64 "\n"), } } if (collect_rmaps) { /* && !check_dups */ - error = add_rmap(mp, ino, whichfork, &irec); + error = rmap_add_rec(mp, ino, whichfork, &irec); if (error) do_error( _("couldn't add reverse mapping\n") diff --git a/repair/phase4.c b/repair/phase4.c index 3be3786..9da1bb1 100644 --- a/repair/phase4.c +++ b/repair/phase4.c @@ -159,7 +159,7 @@ process_ags( do_inode_prefetch(mp, ag_stride, process_ag_func, true, false); for (i = 0; i < mp->m_sb.sb_agcount; i++) { - error = finish_collecting_fork_rmaps(mp, i); + error = rmap_finish_collecting_fork_recs(mp, i); if (error) do_error( _("unable to finish adding attr/data fork reverse-mapping data for AG %u.\n"), @@ -175,17 +175,17 @@ check_rmap_btrees( { int error; - error = add_fixed_ag_rmap_data(wq->mp, agno); + error = rmap_add_fixed_ag_rec(wq->mp, agno); if (error) do_error( _("unable to add AG %u metadata reverse-mapping data.\n"), agno); - error = fold_raw_rmaps(wq->mp, agno); + error = rmap_fold_raw_recs(wq->mp, agno); if (error) do_error( _("unable to merge AG %u metadata reverse-mapping data.\n"), agno); - error = check_rmaps(wq->mp, agno); + error = rmaps_verify_btree(wq->mp, agno); if (error) do_error( _("%s while checking reverse-mappings"), @@ -199,7 +199,7 @@ process_rmap_data( struct work_queue wq; xfs_agnumber_t i; - if (!needs_rmap_work(mp)) + if (!rmap_needs_work(mp)) return; create_work_queue(&wq, mp, libxfs_nproc()); @@ -223,7 +223,7 @@ phase4(xfs_mount_t *mp) int ag_hdr_block; int bstate; - if (needs_rmap_work(mp)) + if (rmap_needs_work(mp)) collect_rmaps = true; ag_hdr_block = howmany(ag_hdr_len, mp->m_sb.sb_blocksize); diff --git a/repair/phase5.c b/repair/phase5.c index 93b1f75..4c7655c 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -251,7 +251,7 @@ setup_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *curs) blocks_allocated++; } - error = add_ag_rmap(mp, agno, ext_ptr->ex_startblock, u, + error = rmap_add_ag_rec(mp, agno, ext_ptr->ex_startblock, u, curs->owner); if (error) do_error(_("could not set up btree rmaps: %s\n"), @@ -1615,7 +1615,7 @@ build_rmap_tree( * pointers for the parent. that can recurse up to the root * if required. set the sibling pointers for leaf level here. */ - error = init_rmap_cursor(agno, &rmap_cur); + error = rmap_init_cursor(agno, &rmap_cur); if (error) do_error( _("Insufficient memory to construct reverse-map cursor.")); @@ -2137,7 +2137,7 @@ phase5_func( /* * Put the per-AG btree rmap data into the rmapbt */ - error = store_ag_btree_rmap_data(mp, agno); + error = rmap_store_ag_btree_rec(mp, agno); if (error) do_error( _("unable to add AG %u reverse-mapping data to btree.\n"), agno); diff --git a/repair/rmap.c b/repair/rmap.c index 43b821d..a493388 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -85,7 +85,7 @@ rmap_compare( * mapping trees. */ bool -needs_rmap_work( +rmap_needs_work( struct xfs_mount *mp) { return xfs_sb_version_hasrmapbt(&mp->m_sb); @@ -95,13 +95,13 @@ needs_rmap_work( * Initialize per-AG reverse map data. */ void -init_rmaps( +rmaps_init( struct xfs_mount *mp) { xfs_agnumber_t i; int error; - if (!needs_rmap_work(mp)) + if (!rmap_needs_work(mp)) return; ag_rmaps = calloc(mp->m_sb.sb_agcount, sizeof(struct xfs_ag_rmap)); @@ -127,12 +127,12 @@ _("Insufficient memory while allocating raw metadata reverse mapping slabs.")); * Free the per-AG reverse-mapping data. */ void -free_rmaps( +rmaps_free( struct xfs_mount *mp) { xfs_agnumber_t i; - if (!needs_rmap_work(mp)) + if (!rmap_needs_work(mp)) return; for (i = 0; i < mp->m_sb.sb_agcount; i++) { @@ -147,7 +147,7 @@ free_rmaps( * Decide if two reverse-mapping records can be merged. */ bool -mergeable_rmaps( +rmaps_are_mergeable( struct xfs_rmap_irec *r1, struct xfs_rmap_irec *r2) { @@ -173,7 +173,7 @@ mergeable_rmaps( * fork for later btree reconstruction. */ int -add_rmap( +rmap_add_rec( struct xfs_mount *mp, xfs_ino_t ino, int whichfork, @@ -185,7 +185,7 @@ add_rmap( struct xfs_rmap_irec *last_rmap; int error = 0; - if (!needs_rmap_work(mp)) + if (!rmap_needs_work(mp)) return 0; agno = XFS_FSB_TO_AGNO(mp, irec->br_startblock); @@ -208,7 +208,7 @@ add_rmap( last_rmap = &ag_rmaps[agno].ar_last_rmap; if (last_rmap->rm_owner == XFS_RMAP_OWN_UNKNOWN) *last_rmap = rmap; - else if (mergeable_rmaps(last_rmap, &rmap)) + else if (rmaps_are_mergeable(last_rmap, &rmap)) last_rmap->rm_blockcount += rmap.rm_blockcount; else { error = slab_add(ag_rmaps[agno].ar_rmaps, last_rmap); @@ -222,11 +222,11 @@ add_rmap( /* Finish collecting inode data/attr fork rmaps. */ int -finish_collecting_fork_rmaps( +rmap_finish_collecting_fork_recs( struct xfs_mount *mp, xfs_agnumber_t agno) { - if (!needs_rmap_work(mp) || + if (!rmap_needs_work(mp) || ag_rmaps[agno].ar_last_rmap.rm_owner == XFS_RMAP_OWN_UNKNOWN) return 0; return slab_add(ag_rmaps[agno].ar_rmaps, &ag_rmaps[agno].ar_last_rmap); @@ -234,7 +234,7 @@ finish_collecting_fork_rmaps( /* add a raw rmap; these will be merged later */ static int -__add_raw_rmap( +__rmap_add_raw_rec( struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, @@ -262,7 +262,7 @@ __add_raw_rmap( * Add a reverse mapping for an inode fork's block mapping btree block. */ int -add_bmbt_rmap( +rmap_add_bmbt_rec( struct xfs_mount *mp, xfs_ino_t ino, int whichfork, @@ -271,7 +271,7 @@ add_bmbt_rmap( xfs_agnumber_t agno; xfs_agblock_t agbno; - if (!needs_rmap_work(mp)) + if (!rmap_needs_work(mp)) return 0; agno = XFS_FSB_TO_AGNO(mp, fsbno); @@ -280,7 +280,7 @@ add_bmbt_rmap( ASSERT(agno < mp->m_sb.sb_agcount); ASSERT(agbno + 1 <= mp->m_sb.sb_agblocks); - return __add_raw_rmap(mp, agno, agbno, 1, ino, + return __rmap_add_raw_rec(mp, agno, agbno, 1, ino, whichfork == XFS_ATTR_FORK, true); } @@ -288,28 +288,28 @@ add_bmbt_rmap( * Add a reverse mapping for a per-AG fixed metadata extent. */ int -add_ag_rmap( +rmap_add_ag_rec( struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len, uint64_t owner) { - if (!needs_rmap_work(mp)) + if (!rmap_needs_work(mp)) return 0; ASSERT(agno != NULLAGNUMBER); ASSERT(agno < mp->m_sb.sb_agcount); ASSERT(agbno + len <= mp->m_sb.sb_agblocks); - return __add_raw_rmap(mp, agno, agbno, len, owner, false, false); + return __rmap_add_raw_rec(mp, agno, agbno, len, owner, false, false); } /* * Merge adjacent raw rmaps and add them to the main rmap list. */ int -fold_raw_rmaps( +rmap_fold_raw_recs( struct xfs_mount *mp, xfs_agnumber_t agno) { @@ -330,7 +330,7 @@ fold_raw_rmaps( prev = pop_slab_cursor(cur); rec = pop_slab_cursor(cur); while (prev && rec) { - if (mergeable_rmaps(prev, rec)) { + if (rmaps_are_mergeable(prev, rec)) { prev->rm_blockcount += rec->rm_blockcount; rec = pop_slab_cursor(cur); continue; @@ -395,7 +395,7 @@ popcnt( * sb/agi/agf/agfl headers, inode chunks, and the log. */ int -add_fixed_ag_rmap_data( +rmap_add_fixed_ag_rec( struct xfs_mount *mp, xfs_agnumber_t agno) { @@ -407,11 +407,11 @@ add_fixed_ag_rmap_data( int startidx; int nr; - if (!needs_rmap_work(mp)) + if (!rmap_needs_work(mp)) return 0; /* sb/agi/agf/agfl headers */ - error = add_ag_rmap(mp, agno, 0, XFS_BNO_BLOCK(mp), + error = rmap_add_ag_rec(mp, agno, 0, XFS_BNO_BLOCK(mp), XFS_RMAP_OWN_FS); if (error) goto out; @@ -432,7 +432,7 @@ add_fixed_ag_rmap_data( agino = ino_rec->ino_startnum + startidx; agbno = XFS_AGINO_TO_AGBNO(mp, agino); if (XFS_AGINO_TO_OFFSET(mp, agino) == 0) { - error = add_ag_rmap(mp, agno, agbno, nr, + error = rmap_add_ag_rec(mp, agno, agbno, nr, XFS_RMAP_OWN_INODES); if (error) goto out; @@ -443,7 +443,7 @@ add_fixed_ag_rmap_data( fsbno = mp->m_sb.sb_logstart; if (fsbno && XFS_FSB_TO_AGNO(mp, fsbno) == agno) { agbno = XFS_FSB_TO_AGBNO(mp, mp->m_sb.sb_logstart); - error = add_ag_rmap(mp, agno, agbno, mp->m_sb.sb_logblocks, + error = rmap_add_ag_rec(mp, agno, agbno, mp->m_sb.sb_logblocks, XFS_RMAP_OWN_LOG); if (error) goto out; @@ -473,7 +473,7 @@ out: * the rmapbt, after which it is fully regenerated. */ int -store_ag_btree_rmap_data( +rmap_store_ag_btree_rec( struct xfs_mount *mp, xfs_agnumber_t agno) { @@ -509,7 +509,7 @@ store_ag_btree_rmap_data( agfl_bno += ag_rmaps[agno].ar_flcount; b = agfl_bno; while (*b != NULLAGBLOCK && b - agfl_bno <= XFS_AGFL_SIZE(mp)) { - error = add_ag_rmap(mp, agno, be32_to_cpu(*b), 1, + error = rmap_add_ag_rec(mp, agno, be32_to_cpu(*b), 1, XFS_RMAP_OWN_AG); if (error) goto err; @@ -519,7 +519,7 @@ store_ag_btree_rmap_data( agflbp = NULL; /* Merge all the raw rmaps into the main list */ - error = fold_raw_rmaps(mp, agno); + error = rmap_fold_raw_recs(mp, agno); if (error) goto err; @@ -572,7 +572,7 @@ err: #ifdef RMAP_DEBUG static void -dump_rmap( +rmap_dump( const char *msg, xfs_agnumber_t agno, struct xfs_rmap_irec *rmap) @@ -587,7 +587,7 @@ dump_rmap( (unsigned int)rmap->rm_flags); } #else -# define dump_rmap(m, a, r) +# define rmap_dump(m, a, r) #endif /* @@ -605,7 +605,7 @@ rmap_record_count( * Return a slab cursor that will return rmap objects in order. */ int -init_rmap_cursor( +rmap_init_cursor( xfs_agnumber_t agno, struct xfs_slab_cursor **cur) { @@ -623,7 +623,7 @@ rmap_avoid_check(void) /* Look for an rmap in the rmapbt that matches a given rmap. */ static int -lookup_rmap( +rmap_lookup( struct xfs_btree_cur *bt_cur, struct xfs_rmap_irec *rm_rec, struct xfs_rmap_irec *tmp, @@ -647,7 +647,7 @@ lookup_rmap( #define NEXTP(x) ((x)->rm_startblock + (x)->rm_blockcount) #define NEXTL(x) ((x)->rm_offset + (x)->rm_blockcount) static bool -is_good_rmap( +rmap_is_good( struct xfs_rmap_irec *observed, struct xfs_rmap_irec *btree) { @@ -685,7 +685,7 @@ is_good_rmap( * Compare the observed reverse mappings against what's in the ag btree. */ int -check_rmaps( +rmaps_verify_btree( struct xfs_mount *mp, xfs_agnumber_t agno) { @@ -707,7 +707,7 @@ check_rmaps( } /* Create cursors to refcount structures */ - error = init_rmap_cursor(agno, &rm_cur); + error = rmap_init_cursor(agno, &rm_cur); if (error) return error; @@ -728,7 +728,7 @@ check_rmaps( rm_rec = pop_slab_cursor(rm_cur); while (rm_rec) { - error = lookup_rmap(bt_cur, rm_rec, &tmp, &have); + error = rmap_lookup(bt_cur, rm_rec, &tmp, &have); if (error) goto err; if (!have) { @@ -749,7 +749,7 @@ _("Missing reverse-mapping record for (%u/%u) %slen %u owner %"PRId64" \ } /* Compare each refcount observation against the btree's */ - if (!is_good_rmap(rm_rec, &tmp)) { + if (!rmap_is_good(rm_rec, &tmp)) { do_warn( _("Incorrect reverse-mapping: saw (%u/%u) %slen %u owner %"PRId64" %s%soff \ %"PRIu64"; should be (%u/%u) %slen %u owner %"PRId64" %s%soff %"PRIu64"\n"), @@ -918,7 +918,7 @@ rmap_store_agflcount( xfs_agnumber_t agno, int count) { - if (!needs_rmap_work(mp)) + if (!rmap_needs_work(mp)) return; ag_rmaps[agno].ar_flcount = count; diff --git a/repair/rmap.h b/repair/rmap.h index 69215e8..7106dfc 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -22,27 +22,27 @@ extern bool collect_rmaps; -extern bool needs_rmap_work(struct xfs_mount *); +extern bool rmap_needs_work(struct xfs_mount *); -extern void init_rmaps(struct xfs_mount *); -extern void free_rmaps(struct xfs_mount *); +extern void rmaps_init(struct xfs_mount *); +extern void rmaps_free(struct xfs_mount *); -extern int add_rmap(struct xfs_mount *, xfs_ino_t, int, struct xfs_bmbt_irec *); -extern int finish_collecting_fork_rmaps(struct xfs_mount *mp, +extern int rmap_add_rec(struct xfs_mount *, xfs_ino_t, int, struct xfs_bmbt_irec *); +extern int rmap_finish_collecting_fork_recs(struct xfs_mount *mp, xfs_agnumber_t agno); -extern int add_ag_rmap(struct xfs_mount *, xfs_agnumber_t agno, +extern int rmap_add_ag_rec(struct xfs_mount *, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len, uint64_t owner); -extern int add_bmbt_rmap(struct xfs_mount *, xfs_ino_t, int, xfs_fsblock_t); -extern int fold_raw_rmaps(struct xfs_mount *mp, xfs_agnumber_t agno); -extern bool mergeable_rmaps(struct xfs_rmap_irec *r1, struct xfs_rmap_irec *r2); +extern int rmap_add_bmbt_rec(struct xfs_mount *, xfs_ino_t, int, xfs_fsblock_t); +extern int rmap_fold_raw_recs(struct xfs_mount *mp, xfs_agnumber_t agno); +extern bool rmaps_are_mergeable(struct xfs_rmap_irec *r1, struct xfs_rmap_irec *r2); -extern int add_fixed_ag_rmap_data(struct xfs_mount *, xfs_agnumber_t); -extern int store_ag_btree_rmap_data(struct xfs_mount *, xfs_agnumber_t); +extern int rmap_add_fixed_ag_rec(struct xfs_mount *, xfs_agnumber_t); +extern int rmap_store_ag_btree_rec(struct xfs_mount *, xfs_agnumber_t); extern size_t rmap_record_count(struct xfs_mount *, xfs_agnumber_t); -extern int init_rmap_cursor(xfs_agnumber_t, struct xfs_slab_cursor **); +extern int rmap_init_cursor(xfs_agnumber_t, struct xfs_slab_cursor **); extern void rmap_avoid_check(void); -extern int check_rmaps(struct xfs_mount *, xfs_agnumber_t); +extern int rmaps_verify_btree(struct xfs_mount *, xfs_agnumber_t); extern __int64_t rmap_diffkeys(struct xfs_rmap_irec *kp1, struct xfs_rmap_irec *kp2); diff --git a/repair/scan.c b/repair/scan.c index 253e3de..8fc4592 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -383,7 +383,7 @@ _("bad state %d, inode %" PRIu64 " bmap block 0x%" PRIx64 "\n"), /* Record BMBT blocks in the reverse-mapping data. */ if (check_dups && collect_rmaps) { - error = add_bmbt_rmap(mp, ino, whichfork, bno); + error = rmap_add_bmbt_rec(mp, ino, whichfork, bno); if (error) do_error( _("couldn't add inode %"PRIu64" bmbt block %"PRIu64" reverse-mapping data."), @@ -1040,7 +1040,7 @@ advance: } /* Is this mergeable with the previous record? */ - if (mergeable_rmaps(&rmap_priv->last_rec, &key)) { + if (rmaps_are_mergeable(&rmap_priv->last_rec, &key)) { do_warn( _("record %d in block (%u/%u) of %s tree should be merged with previous record\n"), i, agno, bno, name); diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 3040c46..dc38ece 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -900,7 +900,7 @@ main(int argc, char **argv) init_bmaps(mp); incore_ino_init(mp); incore_ext_init(mp); - init_rmaps(mp); + rmaps_init(mp); /* initialize random globals now that we know the fs geometry */ inodes_per_block = mp->m_sb.sb_inopblock; @@ -934,7 +934,7 @@ main(int argc, char **argv) /* * Done with the block usage maps, toss them... */ - free_rmaps(mp); + rmaps_free(mp); free_bmaps(mp); if (!bad_ino_btree) { From retoboutgo@mail333.com Tue Aug 23 23:09:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.9 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, TVD_FROM_1 autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9DB7E7CA0 for ; Tue, 23 Aug 2016 23:09:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F3CF304051 for ; Tue, 23 Aug 2016 21:09:00 -0700 (PDT) X-ASG-Debug-ID: 1472011730-0bf57b531215ba60001-NocioJ Received: from mx.qip.ru (www.bahema.fr [195.14.0.139]) by cuda.sgi.com with ESMTP id slzfNzcHMYfMev0l for ; Tue, 23 Aug 2016 21:08:53 -0700 (PDT) X-Barracuda-Envelope-From: retoboutgo@mail333.com X-Barracuda-Effective-Source-IP: www.bahema.fr[195.14.0.139] X-Barracuda-Apparent-Source-IP: 195.14.0.139 MIME-Version: 1.0 Date: Wed, 24 Aug 2016 07:08:54 +0300 Message-ID: <766122699.20160824070854@LMZRFSPWILQ> Subject: =?utf-8?B?0JrQvtC90YLRgNCw0LrRgiDQvNC10LbQtNGD0L3QsNGA0L7QtNC90L7QuSDQutGD0L/Qu9C4LdC/0YDQvtC00LDQttC4?= From: "=?utf-8?B?0JrQvtC90YLRgNCw0LrRgiDQktCt0JQ=?=" X-ASG-Orig-Subj: =?utf-8?B?0JrQvtC90YLRgNCw0LrRgiDQvNC10LbQtNGD0L3QsNGA0L7QtNC90L7QuSDQutGD0L/Qu9C4LdC/0YDQvtC00LDQttC4?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=----------5A4897013FB1C13F2 X-Barracuda-Connect: www.bahema.fr[195.14.0.139] X-Barracuda-Start-Time: 1472011730 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 23612 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32273 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message ------------5A4897013FB1C13F2 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 KtCQ0LrQutGA0LXQtNC40YLQvtCy0LDQvdC90YvQuSDQo9GH0LXQsdC90YvQuSDRhtC10L3RgtGA INC/0YDQuNCz0LvQsNGI0LDQtdGCINC90LAg0L7QsdGD0YfQtdC90LjQtTooKtC/0YDQvtC80L7Q utC+0LQg0LTQsNC90L3QvtCz0L4NCtC30LDQvdGP0YLQuNGPOiA0OTUqKSoNCg0KDQoNCg0KDQrQ ktCd0JXQqNCd0JXQotCe0KDQk9Ce0JLQq9CZINCa0J7QndCi0KDQkNCa0KI6INCe0KHQntCR0JXQ ndCd0J7QodCi0Jgg0J/QoNCQ0JLQntCS0J7Qk9CeDQrQoNCV0JPQo9Cb0JjQoNCe0JLQkNCd0JjQ ryDQmCDQoNCQ0KHQodCc0J7QotCg0JXQndCY0JUg0KHQn9Ce0KDQntCSDQrQkiDQkNCg0JHQmNCi 0KDQkNCW0J3QntCZINCf0KDQkNCa0KLQmNCa0JUNCioyOS0zMSDQsNCy0LPRg9GB0YLQsCogKNGB IDEwOjAwINC00L4gMTc6MzApIHwg0LMu0JzQvtGB0LrQstCwDQoNCirQlNC70Y8g0LrQvtCz0L4g 0L/RgNC10LTQvdCw0LfQvdCw0YfQtdC9OiAq0Y7RgNC40YHRgtC+0LIg0L/QviDQtNC+0LPQvtCy 0L7RgNC90L7QvNGDINC/0YDQsNCy0YMsINGB0L/QtdGG0LjQsNC70LjRgdGC0L7QsiAtDQrQv9GA 0LDQutGC0LjQutC+0LIsINC30LDQvdC40LzQsNGO0YnQuNGF0YHRjw0K0LLQvdC10YjQvdC10Y3Q utC+0L3QvtC80LjRh9C10YHQutC+0Lkg0LTQtdGP0YLQtdC70YzQvdC+0YHRgtGM0Y4uDQoNCirQ ptC10LvRjDogKtC00LDRgtGMINC00LXRgtCw0LvRjNC90YvQuSDQsNC90LDQu9C40Lcg0L7RgdC9 0L7QstC90YvRhSDRg9GB0LvQvtCy0LjQuSDQstC90LXRiNC90LXRjdC60L7QvdC+0LzQuNGH0LXR gdC60L7Qs9C+DQrQutC+0L3RgtGA0LDQutGC0LAg0YENCtGD0YfQtdGC0L7QvCDQv9GA0LDQutGC 0LjQutC4INC30LDQutC70Y7Rh9C10L3QuNGPLCDQuNGB0L/QvtC70L3QtdC90LjRjyDQuCDRgNCw 0LfRgNC10YjQtdC90LjRjyDRgdC/0L7RgNC+0LIuINCR0L7Qu9GM0YjQvtC1DQrQstC90LjQvNCw 0L3QuNC1INGD0LTQtdC70Y/QtdGC0YHRjw0K0YLQuNC/0LjRh9C90YvQvCDQvtGI0LjQsdC60LDQ vCwg0LTQvtC/0YPRgdC60LDQtdC80YvQvCDQv9GA0Lgg0LfQsNC60LvRjtGH0LXQvdC40Lgg0LrQ vtC90YLRgNCw0LrRgtC+0LIsINC/0YDQuCDQv9GA0LXQtNGK0Y/QstC70LXQvdC40LgNCtC40YHQ utC+0LIg0Lgg0LjRhQ0K0YDQsNGB0YHQvNC+0YLRgNC10L3QuNC4INCyINCc0JrQkNChINC/0YDQ uCDQotCf0J8g0KDQpCwg0LIg0LDRgNCx0LjRgtGA0LDQttC90YvRhSDRgdGD0LTQsNGFINCyINCg 0L7RgdGB0LjQuCDQuCDQt9CwINGA0YPQsdC10LbQvtC8Lg0KDQp+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0K DQogICAgKtCS0YHRjyDQuNC90YLQtdGA0LXRgdGD0Y7RidCw0Y8g0JLQsNGBINC40L3RhNC+0YDQ vNCw0YbQuNGPINC4INGA0LXQs9C40YHRgtGA0LDRhtC40Y8g0L/QviDRgtC10LsuOiogOCDQutC+ 0LQg0LPQvtGA0L7QtNCwDQooNDk1KQ0K0YLQtdC7LjogNzI1LTA0LTQ4ICjQvNC90L7Qs9C+0LrQ sNC90LDQu9GM0L3Ri9C5KQ0KDQrQktGLINC80L7QttC10YLQtSDRg9GH0LDRgdGC0LLQvtCy0LDR gtGMINCyINC+0LHRg9GH0LXQvdC40Lgg0LrQsNC6INC+0YIg0LrQvtC80L/QsNC90LjQuCwg0YLQ sNC6INC4INC60LDQuiDRh9Cw0YHRgtC90L7QtSDQu9C40YbQvi4NCijQv9C+0LbQsNC70YPQudGB 0YLQsCDQvdC1INC+0YLQstC10YfQsNC50YLQtSDQvdCwINC+0LHRgNCw0YLQvdGL0Lkg0LDQtNGA 0LXRgSDRjdC7LtC/0L7Rh9GC0YspDQoNCg0KKtCh0L7QtNC10YDQttCw0L3QuNC1INC/0YDQvtCz 0YDQsNC80LzRizoqDQoNCioxLiDQn9GA0LDQstC+0LLQvtC1INC+0LHQtdGB0L/QtdGH0LXQvdC4 0LUg0LLQvdC10YjQvdC10Y3QutC+0L3QvtC80LjRh9C10YHQutC+0Lkg0Lgg0LLQvdC10YjQvdC1 0YLQvtGA0LPQvtCy0L7QuSDQtNC10Y/RgtC10LvRjNC90L7RgdGC0LguKg0KINCQ0L3QsNC70LjQ tw0K0LLRgdGC0YPQv9C40LLRiNC40YUg0LIg0YHQuNC70YMg0Lgg0L7QttC40LTQsNC10LzRi9GF INC40LfQvNC10L3QtdC90LjQuS4NCg0KKjIuINCS0L3QtdGI0L3QtdGC0L7RgNCz0L7QstGL0Lkg 0LrQvtC90YLRgNCw0LrRgi4g0KHRgtGA0YPQutGC0YPRgNCwINC4INGB0L7QtNC10YDQttCw0L3Q uNC1INCy0L3QtdGI0L3QtdGC0L7RgNCz0L7QstC+0LPQvg0K0LrQvtC90YLRgNCw0LrRgtCwLiAq DQotINCh0YLRgNCw0YLQtdCz0LjRjyDQuCDRgtCw0LrRgtC40LrQsCDQv9C10YDQtdCz0L7QstC+ 0YDQvtCyINC+INC30LDQutC70Y7Rh9C10L3QuNC4INC60L7QvdGC0YDQsNC60YLQsC4g0J/RgNC+ 0LHQu9C10LzQvdGL0LUNCtCy0L7Qv9GA0L7RgdGLDQrQv9C+0LTQs9C+0YLQvtCy0LrQuCDQutC+ 0L3RgtGA0LDQutGC0LAgKNCy0YvQsdC+0YAg0L3QsNC00LvQtdC20LDRidC10LPQviDQv9Cw0YDR gtC90LXRgNCwLCDQstGL0LHQvtGAINGB0L/QvtGB0L7QsdCwINC+0LHQtdGB0L/QtdGH0LXQvdC4 0Y8NCtC40YHQv9C+0LvQvdC10L3QuNGPDQrQvtCx0Y/Qt9Cw0YLQtdC70YzRgdGC0LIg0LrQvtC9 0YLRgNCw0LPQtdC90YLQvtC8LCDQstGL0LHQvtGAINC/0YDQuNC80LXQvdC40LzQvtCz0L4g0L/R gNCw0LLQsCDQuCDRgdC/0L7RgdC+0LHQsCDRgNCw0LfRgNC10YjQtdC90LjRjw0K0LLQvtC30LzQ vtC20L3Ri9GFINCyDQrQsdGD0LTRg9GJ0LXQvCDRgdC/0L7RgNC+0LIpLiDQmNC90YHRgtGA0YPQ utGG0LjQuCDQv9C+INC/0L7QtNCz0L7RgtC+0LLQutC1INC4INC/0YDQvtCy0LXRgNC60LUg0LTQ vtC60YPQvNC10L3RgtC+0LIuDQrQodC+0LPQu9Cw0YHQvtCy0LDQvdC40LUg0YPRgdC70L7QstC4 0LkNCtC60L7QvdGC0YDQsNC60YLQsC4NCi0g0JjRgdC/0L7Qu9C90LXQvdC40LUg0LTQvtCz0L7Q stC+0YDQvdGL0YUg0L7QsdGP0LfQsNGC0LXQu9GM0YHRgtCyLiDQlNCy0YPRj9C30YvRh9C90YvQ tSDRhNC+0YDQvNGD0LvQuNGA0L7QstC60Lgg0LrQvtC90YLRgNCw0LrRgtC+0LIuDQotINCe0YHQ vtCx0LXQvdC90L7RgdGC0Lgg0YDQtdCw0LvQuNC30LDRhtC40Lgg0LrQvtC90YLRgNCw0LrRgtCw INCyINC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDQstGL0LHQvtGA0LAg0L3QvtGA0LwNCtC9 0LDRhtC40L7QvdCw0LvRjNC90L7Qs9C+INC/0YDQsNCy0LAuDQotINCb0LjRhtC10L3Qt9C40YDQ vtCy0LDQvdC40LUsINGB0LXRgNGC0LjRhNC40LrQsNGG0LjRjywg0LTQtdC60LvQsNGA0LjRgNC+ 0LLQsNC90LjQtS4NCg0KDQoqMy4g0J7RgdC90L7QstC90YvQtSDQvdCw0YDRg9GI0LXQvdC40Y8g 0Lgg0L7RiNC40LHQutC4LCDQtNC+0L/Rg9GB0LrQsNC10LzRi9C1INC/0YDQuCDQvtGE0L7RgNC8 0LvQtdC90LjQuA0K0LzQtdC20LTRg9C90LDRgNC+0LTQvdGL0YUg0LTQvtC60YPQvNC10L3RgtC+ 0LIuICoNCi0g0KHQv9C+0YHQvtCx0Ysg0LfQsNGJ0LjRgtGLINC+0YIg0L3QsNGA0YPRiNC10L3Q uNC5ICjQv9C+INC80LXQttC00YPQvdCw0YDQvtC00L3Qvi3Qv9GA0LDQstC+0LLRi9C8INC4INC9 0LDRhtC40L7QvdCw0LvRjNC90YvQvA0K0L3QvtGA0LzQsNC8KS4NCg0KDQoqNC4g0J/RgNCw0LrR gtC40YfQtdGB0LrQuNC1INCy0L7Qv9GA0L7RgdGLINC/0YDQtdC00YPQv9GA0LXQttC00LXQvdC4 0Y8g0L/QvtGC0LXQvdGG0LjQsNC70YzQvdGL0YUg0YDQuNGB0LrQvtCyINC/0YDQuCDQt9Cw0LrQ u9GO0YfQtdC90LjQuA0K0Lgg0LjRgdC/0L7Qu9C90LXQvdC40Lgg0LTQvtCz0L7QstC+0YDQvtCy INGBINGD0YfQsNGB0YLQuNC10Lwg0LjQvdC+0YHRgtGA0LDQvdC90YvRhSDRhNC40YDQvC4qDQoN Cio1LiDQntGC0LLQtdGC0YHRgtCy0LXQvdC90L7RgdGC0Ywg0LLQviDQstC90LXRiNC90LXRjdC6 0L7QvdC+0LzQuNGH0LXRgdC60LjRhSDRgdC00LXQu9C60LDRhS4qDQotINCf0YDQuNC80LXQvdC1 0L3QuNC1INC80LXRgCDQvtGC0LLQtdGC0YHRgtCy0LXQvdC90L7RgdGC0Lgg0YHRgtC+0YDQvtC9 INC+0LHRj9C30LDRgtC10LvRjNGB0YLQstCwINCyINC60L7QvdGC0LXQutGB0YLQtSDQv9GA0LDQ stCwLA0K0L/RgNC40LzQtdC90LjQvNC+0LPQviDQug0K0LTQvtCz0L7QstC+0YDRgy4NCi0g0J7R gdC90L7QstCw0L3QuNGPINC4INGD0YHQu9C+0LLQuNGPINC/0YDQuNC80LXQvdC10L3QuNGPINC8 0LXRgCDQvtGC0LLQtdGC0YHRgtCy0LXQvdC90L7RgdGC0LguDQotINCj0LHRi9GC0LrQuCDQuCDQ vdC10YPRgdGC0L7QudC60LAuDQotINCf0YDQvtGG0LXQvdGC0Ysg0L/QviDQv9GA0LjQvNC10L3Q uNC80L7QvNGDINC/0YDQsNCy0YMuDQotINCh0YDQsNCy0L3QuNGC0LXQu9GM0L3Ri9C5INCw0L3Q sNC70LjQtyDQktC10L3RgdC60L7QuSDQutC+0L3QstC10L3RhtC40Lgg0Lgg0L3QvtGA0Lwg0JPQ miDQoNCkLg0KDQoNCio2LiDQndC+0LLQvtC1INCyINGB0YTQtdGA0LUg0LLQsNC70Y7RgtC90L7Q s9C+INC60L7QvdGC0YDQvtC70Y8g0Lgg0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40Y8g0LLQsNC7 0Y7RgtC90YvRhSDQvtC/0LXRgNCw0YbQuNC5DQrQv9GA0Lgg0L7RgdGD0YnQtdGB0YLQstC70LXQ vdC40Lgg0JLQrdCULioNCi0g0KTQtdC00LXRgNCw0LvRjNC90YvQuSDQt9Cw0LrQvtC9IOKEljE3 My3QpNCXICLQniDQstCw0LvRjtGC0L3QvtC8INGA0LXQs9GD0LvQuNGA0L7QstCw0L3QuNC4INC4 INCy0LDQu9GO0YLQvdC+0Lwg0LrQvtC90YLRgNC+0LvQtSI6DQrQvtGB0L3QvtCy0L3Ri9C1INC/ 0L7QvdGP0YLQuNGPINC4INGC0YDQtdCx0L7QstCw0L3QuNGPLg0KLSDQn9GA0LDQutGC0LjQutCw INC/0YDQuNC80LXQvdC10L3QuNGPINCY0L3RgdGC0YDRg9C60YbQuNC4INCR0LDQvdC60LAg0KDQ vtGB0YHQuNC4INC+0YIgMDQuMDYuMjAxMiDihJYgMTM4LdCYLg0KLSDQn9C+0LvQvdC+0LzQvtGH 0LjRjyDQvtGA0LPQsNC90L7QsiDQuCDQsNCz0LXQvdGC0L7QsiDQstCw0LvRjtGC0L3QvtCz0L4g 0LrQvtC90YLRgNC+0LvRjyAo0KTQndChLCDQoNC+0YHRhNC40L3QvdCw0LTQt9C+0YDQsCwg0KTQ otChLA0K0LHQsNC90LrQuCksINC40YUNCtCy0LfQsNC40LzQvtC00LXQudGB0YLQstC40LUuDQot INCf0LDRgdC/0L7RgNGCINGB0LTQtdC70LrQuDog0LDQutGC0YPQsNC70YzQvdGL0LUg0LLQvtC/ 0YDQvtGB0YssINC/0YDQvtCx0LvQtdC80YssINCw0L3QsNC70LjQtyDQsNGA0LHQuNGC0YDQsNC2 0L3QvtC5DQrQv9GA0LDQutGC0LjQutC4Lg0KLSDQodCw0L3QutGG0LjQuCDQt9CwINC90LDRgNGD 0YjQtdC90LjRjyDQstCw0LvRjtGC0L3QvtCz0L4g0LfQsNC60L7QvdC+0LTQsNGC0LXQu9GM0YHR gtCy0LAuDQotINCe0YHQvdC+0LLQvdGL0LUg0YLQtdC90LTQtdC90YbQuNC4INGB0YPQtNC10LHQ vdC+0Lkg0L/RgNCw0LrRgtC40LrQuCDQv9C+INGB0L/QvtGA0LDQvCDRgSDQoNC+0YHRhNC40L3Q vdCw0LTQt9C+0YDQvtC8Lg0KDQoqNy4g0JHQsNC30LjRgdC90YvQtSDRg9GB0LvQvtCy0LjRjyDQ v9C+0YHRgtCw0LLQutC4ICjQmNC90LrQvtGC0LXRgNC80YEgLSAyMDEwKS4g0JrQvtC80LzQtdC9 0YLQsNGA0LjQuCDQuiDQvtGB0L3QvtCy0L3Ri9C8DQrQv9C+0LvQvtC20LXQvdC40Y/QvC4qDQot INCf0YDQuNC90YbQuNC/0Ysg0KPQndCY0JTQoNCj0JAgMjAxMC4g0JjQvdC60L7RgtC10YDQvNGB INC4INCy0LjQtNGLINGC0YDQsNC90YHQv9C+0YDRgtCwLg0KLSDQntGI0LjQsdC60Lgg0Lgg0YDQ tdC60L7QvNC10L3QtNCw0YbQuNC4INC/0L4g0LLRi9Cx0L7RgNGDINC+0L/RgtC40LzQsNC70YzQ vdGL0YUg0YPRgdC70L7QstC40Lkg0L/QvtGB0YLQsNCy0LrQuC4NCi0g0JjQvdC60L7RgtC10YDQ vNGBINC4INGB0YLRgNCw0YXQvtCy0LDQvdC40LUuDQotINCf0LXRgNC10YXQvtC0INC/0YDQsNCy 0LAg0YHQvtCx0YHRgtCy0LXQvdC90L7RgdGC0LguDQotINCR0LXQt9Cy0L7Qt9C80LXQt9C00L3R i9C1INC/0L7RgdGC0LDQstC60LguDQoNCio4LiDQntGB0L7QsdC10L3QvdC+0YHRgtC4INC90LDQ u9C+0LPQvtC+0LHQu9C+0LbQtdC90LjRjyDQuCDQvdCw0LvQvtCz0L7QstC+0LPQviDQutC+0L3R gtGA0L7Qu9GPINCS0K3QlCDQsiAyMDE2INCz0L7QtNGDLioNCi0g0JrQvtC90YLRgNC+0LvQuNGA 0YPQtdC80YvQtSDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLRi9C1INGB0LTQtdC70LrQuCDRgSDR gtC+0YfQutC4INC30YDQtdC90LjRjyDQvdCw0LvQvtCz0L7QstC+0LPQvg0K0LfQsNC60L7QvdC+ 0LTQsNGC0LXQu9GM0YHRgtCy0LAuDQotINCd0JTQoSDQv9GA0Lgg0Y3QutGB0L/QvtGA0YLQvdC+ LdC40LzQv9C+0YDRgtC90YvRhSDQvtC/0LXRgNCw0YbQuNGP0YUuINCe0YHQvtCx0LXQvdC90L7R gdGC0Lgg0L3QsNC70L7Qs9C+0L7QsdC70L7QttC10L3QuNGPINC/0YDQuA0K0LLQt9Cw0LjQvNC+ 0L7RgtC90L7RiNC10L3QuNGP0YUg0YEg0LHQu9C40LbQvdC40Lwg0LfQsNGA0YPQsdC10LbRjNC1 0LwuDQotINCe0YTQvtGA0LzQu9C10L3QuNC1INGB0YfQtdGC0L7Qsi3RhNCw0LrRgtGD0YAg0L/Q viDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLRi9C8INC+0L/QtdGA0LDRhtC40Y/QvC4NCi0g0J7R gdC+0LHQtdC90L3QvtGB0YLQuCDQuNGB0YfQuNGB0LvQtdC90LjRjyDQvdCw0LvQvtCz0LAg0L3Q sCDQv9GA0LjQsdGL0LvRjCDQv9GA0Lgg0YHQvtCy0LXRgNGI0LXQvdC40Lgg0LLQvdC10YjQvdC1 0YLQvtGA0LPQvtCy0YvRhQ0K0YHQtNC10LvQvtC6Lg0KLSDQodC70YPRh9Cw0Lgg0Lgg0L7RgdC9 0L7QstCw0L3QuNGPINC00LvRjyDQuNGB0YfQuNGB0LvQtdC90LjRjyDQuCDRg9C00LXRgNC20LDQ vdC40Y8g0L3QsNC70L7Qs9CwINGBINC00L7RhdC+0LTQvtCyINC4INCd0JTQoSDQv9GA0LgNCtC/ 0LXRgNC10YfQuNGB0LvQtdC90LjRj9GFINCyINCw0LTRgNC10YEg0LjQvdC+0YHRgtGA0LDQvdC9 0L7QuSDQvtGA0LPQsNC90LjQt9Cw0YbQuNC4LiDQntGC0YfQtdGC0L3QvtGB0YLRjCDQvdCw0LvQ vtCz0L7QstC+0LPQviDQsNCz0LXQvdGC0LANCtC/0L4g0J3QlNChINC4DQrQtNC+0YXQvtC00LDQ vC4NCg0KKjkuINCi0LDQvNC+0LbQtdC90L3QvtC1INGA0LXQs9GD0LvQuNGA0L7QstCw0L3QuNC1 INC4INCS0KLQni4gKg0KLSDQntGB0L7QsdC10L3QvdC+0YHRgtC4INC/0L7QtNCz0L7RgtC+0LLQ utC4INC+0YHQvdC+0LLQvdGL0YUg0LTQvtC60YPQvNC10L3RgtC+0LIg0LTQu9GPINGA0LXQsNC7 0LjQt9Cw0YbQuNC4INCy0L3QtdGI0L3QtdGC0L7RgNCz0L7QstC+0LkNCtGB0LTQtdC70LrQuCDQ uA0K0YLQsNC80L7QttC10L3QvdC+0LPQviDQvtGE0L7RgNC80LvQtdC90LjRjyDRgtC+0LLQsNGA 0L7Qsi4NCi0g0KHQvtC+0YLQvdC+0YjQtdC90LjQtSDQvtCx0Y/Qt9Cw0YLQtdC70YzRgdGC0LIg 0KDQvtGB0YHQuNC4INCyINGA0LDQvNC60LDRhSDQktCi0J4g0Lgg0LIg0YDQsNC80LrQsNGFINCi 0LDQvNC+0LbQtdC90L3QvtCz0L4NCtGB0L7RjtC30LAuDQrQoNC10LPRg9C70LjRgNC+0LLQsNC9 0LjQtSDQtNCy0LjQttC10L3QuNGPINGC0L7QstCw0YDQvtCyINC90LAg0LPRgNCw0L3QuNGG0LDR hSDQotCw0LzQvtC20LXQvdC90L7Qs9C+INGB0L7RjtC30LAg0Lgg0LLQvdGD0YLRgNC4DQrQotCw 0LzQvtC20LXQvdC90L7Qs9C+DQrRgdC+0Y7Qt9CwLg0KLSDQn9GA0LDQstC+0LLRi9C1INC40L3R gdGC0YDRg9C80LXQvdGC0Ysg0Lgg0L/RgNC+0YbQtdC00YPRgNGLINGD0YDQtdCz0YPQu9C40YDQ vtCy0LDQvdC40LUg0YLQvtGA0LPQvtCy0YvRhSDRgdC/0L7RgNC+0LIg0LIg0YDQsNC80LrQsNGF DQrQktCi0J4uINCg0LjRgdC60LgNCtC4INC90LXQttC10LvQsNGC0LXQu9GM0L3Ri9C1INGB0LjR gtGD0LDRhtC40Lgg0L/QviDQtNC10LnRgdGC0LLRg9GO0YnQuNC8INC00L7Qs9C+0LLQvtGA0LDQ vC4NCg0KDQoqMTAuINCe0L/RgNC10LTQtdC70LXQvdC40LUg0L3QsNC40LHQvtC70LXQtSDRjdGE 0YTQtdC60YLQuNCy0L3QvtC5INC80L7QtNC10LvQuCDRgNCw0YHRgdC80L7RgtGA0LXQvdC40Y8g 0LLQvdC10YjQvdC10YLQvtGA0LPQvtCy0YvRhQ0K0YHQv9C+0YDQvtCyINCyINCw0YDQsdC40YLR gNCw0LbQvdGL0YUg0YHRg9C00LDRhSDQoNCkLiAq0JLRi9Cx0L7RgCDQvNC10LbQtNGDINCz0L7R gdGD0LTQsNGA0YHRgtCy0LXQvdC90YvQvCDRgdGD0LTQvtC8INC4DQrQvNC10LbQtNGD0L3QsNGA 0L7QtNC90YvQvA0K0LrQvtC80LzQtdGA0YfQtdGB0LrQuNC8INCw0YDQsdC40YLRgNCw0LbQtdC8 Lg0KLSDQn9GA0L7RhtC10YHRgdGD0LDQu9GM0L3Ri9C1INC+0YHQvtCx0LXQvdC90L7RgdGC0Lgs INC/0YDQtdC40LzRg9GJ0LXRgdGC0LLQsCDQuCDQvdC10LTQvtGB0YLQsNGC0LrQuCDRgNCw0YHR gdC80L7RgtGA0LXQvdC40Y8NCtCy0L3QtdGI0L3QtdGC0L7RgNCz0L7QstGL0YUNCtGB0L/QvtGA 0L7QsiDQsiDQs9C+0YHRg9C00LDRgNGB0YLQstC10L3QvdGL0YUg0LDRgNCx0LjRgtGA0LDQttC9 0YvRhSDRgdGD0LTQsNGFLg0KLSDQn9GA0L7RhtC10YHRgdGD0LDQu9GM0L3Ri9C1INC+0YHQvtCx 0LXQvdC90L7RgdGC0Lgg0YDQsNGB0YHQvNC+0YLRgNC10L3QuNGPINGB0L/QvtGA0L7QsiDQsiDQ nNCa0JDQoSDQuCDQotCf0J8g0KDQpC4NCi0g0KHQvtGB0YLQsNCy0LvQtdC90LjQtSDQsNGA0LHQ uNGC0YDQsNC20L3QvtC5INC+0LPQvtCy0L7RgNC60Lg6INC/0YDQsNC60YLQuNGH0LXRgdC60LjQ tSDQstC+0L/RgNC+0YHRiyDQuCDRgNC10LrQvtC80LXQvdC00LDRhtC40LguDQotINCe0YHQv9Cw 0YDQuNCy0LDQvdC40LUg0Lgg0L/RgNC40LLQtdC00LXQvdC40LUg0LIg0LjRgdC/0L7Qu9C90LXQ vdC40LUg0YDQtdGI0LXQvdC40Lkg0LzQtdC20LTRg9C90LDRgNC+0LTQvdGL0YUg0LrQvtC80LzQ tdGA0YfQtdGB0LrQuNGFDQrQsNGA0LHQuNGC0YDQsNC20LXQuTog0YDQsNGB0YHQvNC+0YLRgNC1 0L3QuNC1INC/0L7RgdC70LXQtNC90LXQuSDQv9GA0LDQutGC0LjQutC4INCy0L3QtdGI0L3QtdGC 0L7RgNCz0L7QstGL0YUg0YHQv9C+0YDQvtCyINCyDQrRgNC+0YHRgdC40LnRgdC60LjRhQ0K0LPQ vtGB0YPQtNCw0YDRgdGC0LLQtdC90L3Ri9GFINGB0YPQtNCw0YUg0Lgg0LzQtdC20LTRg9C90LDR gNC+0LTQvdGL0YUg0LrQvtC80LzQtdGA0YfQtdGB0LrQuNGFINCw0YDQsdC40YLRgNCw0LbQsNGF Lg0KLSDQkNC90LDQu9C40Lcg0LDQutGC0YPQsNC70YzQvdGL0YUg0L/RgNCw0LrRgtC40YfQtdGB 0LrQuNGFINCy0L7Qv9GA0L7RgdC+0LIuDQoNCioxMS4g0J/RgNCw0LLQvtCy0L7QtSDQv9C+0LvQ vtC20LXQvdC40LUg0LjQvdC+0YHRgtGA0LDQvdC90YvRhSDQu9C40YYg0LIg0LDRgNCx0LjRgtGA 0LDQttC90L7QvCDQv9GA0L7RhtC10YHRgdC1LiAqDQotINCj0YHRgtCw0L3QvtCy0LvQtdC90LjQ tSDQv9GA0LDQstC+0LLQvtCz0L4g0YHRgtCw0YLRg9GB0LAg0LjQvdC+0YHRgtGA0LDQvdC90YvR hSDQu9C40YYuDQotINCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0YDQsNGB0YHQvNC+0YLRgNC10L3Q uNGPINC00LXQuyDRgSDRg9GH0LDRgdGC0LjQtdC8INC40L3QvtGB0YLRgNCw0L3QvdGL0YUg0LvQ uNGGLg0KLSDQn9C+0YDRj9C00L7QuiDQuNC30LLQtdGJ0LXQvdC40Y8g0LjQvdC+0YHRgtGA0LDQ vdC90YvRhSDQu9C40YYuDQotINCf0YDQuNC30L3QsNC90LjQtSDQuCDQv9GA0LjQstC10LTQtdC9 0LjQtSDQsiDQuNGB0L/QvtC70L3QtdC90LjQtSDRgNC10YjQtdC90LjQuSDQuNC90L7RgdGC0YDQ sNC90L3Ri9GFINGB0YPQtNC+0LIuDQotINCe0YHQvdC+0LLQsNC90LjRjyDQtNC70Y8g0L/RgNC4 0LfQvdCw0L3QuNGPINC4INC40YHQv9C+0LvQvdC10L3QuNGPINGA0LXRiNC10L3QuNC5INC40L3Q vtGB0YLRgNCw0L3QvdGL0YUg0YHRg9C00L7QsiDQuA0K0LDRgNCx0LjRgtGA0LDQttC10LkuDQot INCe0L/RgNC10LTQtdC70LXQvdC40LUg0LDRgNCx0LjRgtGA0LDQttC90L7Qs9C+INGB0YPQtNCw INC/0L4g0LTQtdC70YMg0L4g0L/RgNC40LfQvdCw0L3QuNC4INC4INC/0YDQuNCy0LXQtNC10L3Q uNC4INCyDQrQuNGB0L/QvtC70L3QtdC90LjQtSDRgNC10YjQtdC90LjRjw0K0LjQvdC+0YHRgtGA 0LDQvdC90L7Qs9C+INGB0YPQtNCwLg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoq0KHRgtC+0LjQvNC+ 0YHRgtGMINGD0YfQsNGB0YLQuNGPOiogMjg5MDAg0YDRg9CxLg0KKtCh0LrQuNC00LrQuCogKDIg 0YfQtdC70L7QstC10LrQsCAtIDEwJSwgMyDRh9C10LvQvtCy0LXQutCwIC0gMTUlLCA0INGH0LXQ u9C+0LLQtdC60LAg0Lgg0LHQvtC70LXQtSAtIDIwJSkuDQoq0JzQtdGB0YLQviDQv9GA0L7QstC1 0LTQtdC90LjRjzogKtC8LiDQkdCw0YPQvNCw0L3RgdC60LDRjywg0YPQuy4g0JHQsNGD0LzQsNC9 0YHQutCw0Y8sINC0LjYsINCx0LjQt9C90LXRgSDRhtC10L3RgtGADQoi0JLQuNC60YLQvtGA0LjR jyDQn9C70LDQt9CwIi4NCtCSINGB0YLQvtC40LzQvtGB0YLRjCDQstGF0L7QtNC40YIg0LzQtdGC 0L7QtNC40YfQtdGB0LrQuNC5INC80LDRgtC10YDQuNCw0LssINC+0LHQtdC00YssINC60L7RhNC1 LdC/0LDRg9C30YssINGB0LXRgNGC0LjRhNC40LrQsNGCLg0K ------------5A4897013FB1C13F2 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PHRhYmxlIGJvcmRlcj0iMCIgYmdjb2xvcj0iI0VERURGMSIgY2VsbHNw YWNpbmc9IjAiIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDsi Pjx0Ym9keT48dHI+PHRkIGhlaWdodD0iMjgiIGJnY29sb3I9IiM2NjY2OTkiPsKgPC90ZD48dGQg aGVpZ2h0PSIyOCIgYmdjb2xvcj0iI0ZCRjhGQyIgd2lkdGg9IjQiPsKgPC90ZD48dGQgaGVpZ2h0 PSIyOCIgYmdjb2xvcj0iIzY2NjY5OSI+PHAgYWxpZ249ImNlbnRlciI+PGZvbnQgZmFjZT0iQ2Ft YnJpYSI+PGI+PGZvbnQgY29sb3I9IiNGMUYxRUIiPjxicj48L2ZvbnQ+PGZvbnQgc2l6ZT0iNCIg Y29sb3I9IiNGMEU3RTMiPtCQ0LrQutGA0LXQtNC40YLQvtCy0LDQvdC90YvQuSDQo9GH0LXQsdC9 0YvQuSDRhtC10L3RgtGAINC/0YDQuNCz0LvQsNGI0LDQtdGCINC90LAg0L7QsdGD0YfQtdC90LjQ tTo8YnI+KDwvZm9udD48L2I+PGZvbnQgY29sb3I9IiNGMEU3RTMiIHNpemU9IjQiPtC/0YDQvtC8 0L7QutC+0LQg0LTQsNC90L3QvtCz0L4g0LfQsNC90Y/RgtC40Y86PHNwYW4gbGFuZz0iZW4tdXMi PsKgNDk1PC9zcGFuPjxiPik8L2I+PC9mb250PjxiPjxmb250IHNpemU9IjQiIGNvbG9yPSIjRkZG RkZGIj48YnI+wqA8L2ZvbnQ+PC9iPjwvZm9udD48L3A+PC90ZD48dGQgaGVpZ2h0PSIyOCIgYmdj b2xvcj0iIzY2NjY5OSI+wqA8L3RkPjx0ZCBoZWlnaHQ9IjI4IiBiZ2NvbG9yPSIjNjY2Njk5Ij7C oDwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiM2NjY2OTkiPsKgPC90ZD48dGQgYmdjb2xvcj0i I0ZCRjhGQyIgd2lkdGg9IjQiPsKgPC90ZD48dGQgYmdjb2xvcj0iI0ZBRjdGNSI+PHAgYWxpZ249 ImNlbnRlciI+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGZvbnQgc2l6ZT0iNCIgY29sb3I9IiM4MDAw MDAiPjxiPjxicj48L2I+PC9mb250Pjxmb250IGNvbG9yPSIjODAwMDAwIiBzaXplPSI1Ij7QktCd 0JXQqNCd0JXQotCe0KDQk9Ce0JLQq9CZINCa0J7QndCi0KDQkNCa0KI6INCe0KHQntCR0JXQndCd 0J7QodCi0Jgg0J/QoNCQ0JLQntCS0J7Qk9CewqA8YnI+0KDQldCT0KPQm9CY0KDQntCS0JDQndCY 0K8g0Jgg0KDQkNCh0KHQnNCe0KLQoNCV0J3QmNCVINCh0J/QntCg0J7QksKgPGJyPtCSINCQ0KDQ kdCY0KLQoNCQ0JbQndCe0Jkg0J/QoNCQ0JrQotCY0JrQlTxicj48L2ZvbnQ+PGZvbnQgc2l6ZT0i NCI+PGI+MjktMzEg0LDQstCz0YPRgdGC0LA8L2I+wqAo0YEgMTA6MDAg0LTQviAxNzozMCkgfCDQ sy7QnNC+0YHQutCy0LA8L2ZvbnQ+PC9mb250PjwvcD48cCBhbGlnbj0ibGVmdCI+PGZvbnQgZmFj ZT0iQ2FtYnJpYSI+PGI+0JTQu9GPINC60L7Qs9C+INC/0YDQtdC00L3QsNC30L3QsNGH0LXQvTrC oDwvYj7RjtGA0LjRgdGC0L7QsiDQv9C+INC00L7Qs9C+0LLQvtGA0L3QvtC80YMg0L/RgNCw0LLR gywg0YHQv9C10YbQuNCw0LvQuNGB0YLQvtCyIC0g0L/RgNCw0LrRgtC40LrQvtCyLCDQt9Cw0L3Q uNC80LDRjtGJ0LjRhdGB0Y/CoDxicj7QstC90LXRiNC90LXRjdC60L7QvdC+0LzQuNGH0LXRgdC6 0L7QuSDQtNC10Y/RgtC10LvRjNC90L7RgdGC0YzRji48YnI+PGJyPjxiPtCm0LXQu9GMOsKgPC9i PtC00LDRgtGMINC00LXRgtCw0LvRjNC90YvQuSDQsNC90LDQu9C40Lcg0L7RgdC90L7QstC90YvR hSDRg9GB0LvQvtCy0LjQuSDQstC90LXRiNC90LXRjdC60L7QvdC+0LzQuNGH0LXRgdC60L7Qs9C+ INC60L7QvdGC0YDQsNC60YLQsCDRgcKgPGJyPtGD0YfQtdGC0L7QvCDQv9GA0LDQutGC0LjQutC4 INC30LDQutC70Y7Rh9C10L3QuNGPLCDQuNGB0L/QvtC70L3QtdC90LjRjyDQuCDRgNCw0LfRgNC1 0YjQtdC90LjRjyDRgdC/0L7RgNC+0LIuINCR0L7Qu9GM0YjQvtC1INCy0L3QuNC80LDQvdC40LUg 0YPQtNC10LvRj9C10YLRgdGPwqA8YnI+0YLQuNC/0LjRh9C90YvQvCDQvtGI0LjQsdC60LDQvCwg 0LTQvtC/0YPRgdC60LDQtdC80YvQvCDQv9GA0Lgg0LfQsNC60LvRjtGH0LXQvdC40Lgg0LrQvtC9 0YLRgNCw0LrRgtC+0LIsINC/0YDQuCDQv9GA0LXQtNGK0Y/QstC70LXQvdC40Lgg0LjRgdC60L7Q siDQuCDQuNGFwqA8YnI+0YDQsNGB0YHQvNC+0YLRgNC10L3QuNC4INCyINCc0JrQkNChINC/0YDQ uCDQotCf0J8g0KDQpCwg0LIg0LDRgNCx0LjRgtGA0LDQttC90YvRhSDRgdGD0LTQsNGFINCyINCg 0L7RgdGB0LjQuCDQuCDQt9CwINGA0YPQsdC10LbQvtC8Ljxicj48YnI+PGZvbnQgY29sb3I9IiM2 NjY2OTkiPjxzcGFuIGxhbmc9ImVuLXVzIj5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fjwvc3Bhbj48L2ZvbnQ+ PC9mb250PjwvcD48L3RkPjx0ZD7CoDwvdGQ+PHRkIGJnY29sb3I9IiM2NjY2OTkiPsKgPC90ZD48 L3RyPjx0cj48dGQgYmdjb2xvcj0iIzY2NjY5OSI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjRkJGOEZD IiB3aWR0aD0iNCI+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjRjhGMEVEIj48Zm9udCBmYWNlPSJDYW1i cmlhIj48Yj7QktGB0Y8g0LjQvdGC0LXRgNC10YHRg9GO0YnQsNGPINCS0LDRgSDQuNC90YTQvtGA 0LzQsNGG0LjRjyDQuCDRgNC10LPQuNGB0YLRgNCw0YbQuNGPINC/0L4g0YLQtdC7Ljo8L2I+wqA8 Zm9udCBzaXplPSI0Ij44PC9mb250PsKg0LrQvtC0INCz0L7RgNC+0LTQsMKgPGZvbnQgc2l6ZT0i NCI+KDQ5NSnCoDwvZm9udD48YnI+0YLQtdC7LjrCoDxmb250IHNpemU9IjQiPjcyNS0wNC00ODwv Zm9udD7CoCjQvNC90L7Qs9C+0LrQsNC90LDQu9GM0L3Ri9C5KTwvZm9udD48cD48Zm9udCBmYWNl PSJDYW1icmlhIj7QktGLINC80L7QttC10YLQtSDRg9GH0LDRgdGC0LLQvtCy0LDRgtGMINCyINC+ 0LHRg9GH0LXQvdC40Lgg0LrQsNC6INC+0YIg0LrQvtC80L/QsNC90LjQuCwg0YLQsNC6INC4INC6 0LDQuiDRh9Cw0YHRgtC90L7QtSDQu9C40YbQvi48YnI+KNC/0L7QttCw0LvRg9C50YHRgtCwINC9 0LUg0L7RgtCy0LXRh9Cw0LnRgtC1INC90LAg0L7QsdGA0LDRgtC90YvQuSDQsNC00YDQtdGBINGN 0Lsu0L/QvtGH0YLRiyk8L2ZvbnQ+PC9wPjwvdGQ+PHRkPsKgPC90ZD48dGQgYmdjb2xvcj0iIzY2 NjY5OSI+wqA8L3RkPjwvdHI+PHRyPjx0ZCBiZ2NvbG9yPSIjNjY2Njk5Ij7CoDwvdGQ+PHRkIGJn Y29sb3I9IiNGQkY4RkMiIHdpZHRoPSI0Ij7CoDwvdGQ+PHRkIGJnY29sb3I9IiNGQUY3RjUiPjxm b250IGZhY2U9IkNhbWJyaWEiPjxicj48dT48Yj7QodC+0LTQtdGA0LbQsNC90LjQtSDQv9GA0L7Q s9GA0LDQvNC80Ys6PC9iPjwvdT48L2ZvbnQ+PHA+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGI+MS4g 0J/RgNCw0LLQvtCy0L7QtSDQvtCx0LXRgdC/0LXRh9C10L3QuNC1INCy0L3QtdGI0L3QtdGN0LrQ vtC90L7QvNC40YfQtdGB0LrQvtC5INC4INCy0L3QtdGI0L3QtdGC0L7RgNCz0L7QstC+0Lkg0LTQ tdGP0YLQtdC70YzQvdC+0YHRgtC4LjwvYj7CoNCQ0L3QsNC70LjQt8KgPGJyPtCy0YHRgtGD0L/Q uNCy0YjQuNGFINCyINGB0LjQu9GDINC4INC+0LbQuNC00LDQtdC80YvRhSDQuNC30LzQtdC90LXQ vdC40LkuPC9mb250PjwvcD48cD48Zm9udCBmYWNlPSJDYW1icmlhIj48Yj4yLiDQktC90LXRiNC9 0LXRgtC+0YDQs9C+0LLRi9C5INC60L7QvdGC0YDQsNC60YIuINCh0YLRgNGD0LrRgtGD0YDQsCDQ uCDRgdC+0LTQtdGA0LbQsNC90LjQtSDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLQvtCz0L4g0LrQ vtC90YLRgNCw0LrRgtCwLsKgPC9iPjxicj4tINCh0YLRgNCw0YLQtdCz0LjRjyDQuCDRgtCw0LrR gtC40LrQsCDQv9C10YDQtdCz0L7QstC+0YDQvtCyINC+INC30LDQutC70Y7Rh9C10L3QuNC4INC6 0L7QvdGC0YDQsNC60YLQsC4g0J/RgNC+0LHQu9C10LzQvdGL0LUg0LLQvtC/0YDQvtGB0YvCoDxi cj7Qv9C+0LTQs9C+0YLQvtCy0LrQuCDQutC+0L3RgtGA0LDQutGC0LAgKNCy0YvQsdC+0YAg0L3Q sNC00LvQtdC20LDRidC10LPQviDQv9Cw0YDRgtC90LXRgNCwLCDQstGL0LHQvtGAINGB0L/QvtGB 0L7QsdCwINC+0LHQtdGB0L/QtdGH0LXQvdC40Y8g0LjRgdC/0L7Qu9C90LXQvdC40Y/CoDxicj7Q vtCx0Y/Qt9Cw0YLQtdC70YzRgdGC0LIg0LrQvtC90YLRgNCw0LPQtdC90YLQvtC8LCDQstGL0LHQ vtGAINC/0YDQuNC80LXQvdC40LzQvtCz0L4g0L/RgNCw0LLQsCDQuCDRgdC/0L7RgdC+0LHQsCDR gNCw0LfRgNC10YjQtdC90LjRjyDQstC+0LfQvNC+0LbQvdGL0YUg0LLCoDxicj7QsdGD0LTRg9GJ 0LXQvCDRgdC/0L7RgNC+0LIpLiDQmNC90YHRgtGA0YPQutGG0LjQuCDQv9C+INC/0L7QtNCz0L7R gtC+0LLQutC1INC4INC/0YDQvtCy0LXRgNC60LUg0LTQvtC60YPQvNC10L3RgtC+0LIuINCh0L7Q s9C70LDRgdC+0LLQsNC90LjQtSDRg9GB0LvQvtCy0LjQucKgPGJyPtC60L7QvdGC0YDQsNC60YLQ sC7CoDxicj4tINCY0YHQv9C+0LvQvdC10L3QuNC1INC00L7Qs9C+0LLQvtGA0L3Ri9GFINC+0LHR j9C30LDRgtC10LvRjNGB0YLQsi4g0JTQstGD0Y/Qt9GL0YfQvdGL0LUg0YTQvtGA0LzRg9C70LjR gNC+0LLQutC4INC60L7QvdGC0YDQsNC60YLQvtCyLjxicj4tINCe0YHQvtCx0LXQvdC90L7RgdGC 0Lgg0YDQtdCw0LvQuNC30LDRhtC40Lgg0LrQvtC90YLRgNCw0LrRgtCwINCyINC30LDQstC40YHQ uNC80L7RgdGC0Lgg0L7RgiDQstGL0LHQvtGA0LAg0L3QvtGA0Lwg0L3QsNGG0LjQvtC90LDQu9GM 0L3QvtCz0L4g0L/RgNCw0LLQsC48YnI+LSDQm9C40YbQtdC90LfQuNGA0L7QstCw0L3QuNC1LCDR gdC10YDRgtC40YTQuNC60LDRhtC40Y8sINC00LXQutC70LDRgNC40YDQvtCy0LDQvdC40LUuPC9m b250PjwvcD48cD48Zm9udCBmYWNlPSJDYW1icmlhIj48Yj4zLiDQntGB0L3QvtCy0L3Ri9C1INC9 0LDRgNGD0YjQtdC90LjRjyDQuCDQvtGI0LjQsdC60LgsINC00L7Qv9GD0YHQutCw0LXQvNGL0LUg 0L/RgNC4INC+0YTQvtGA0LzQu9C10L3QuNC4INC80LXQttC00YPQvdCw0YDQvtC00L3Ri9GFwqA8 YnI+0LTQvtC60YPQvNC10L3RgtC+0LIuwqA8L2I+PGJyPi0g0KHQv9C+0YHQvtCx0Ysg0LfQsNGJ 0LjRgtGLINC+0YIg0L3QsNGA0YPRiNC10L3QuNC5ICjQv9C+INC80LXQttC00YPQvdCw0YDQvtC0 0L3Qvi3Qv9GA0LDQstC+0LLRi9C8INC4INC90LDRhtC40L7QvdCw0LvRjNC90YvQvCDQvdC+0YDQ vNCw0LwpLjwvZm9udD48L3A+PHA+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGI+NC4g0J/RgNCw0LrR gtC40YfQtdGB0LrQuNC1INCy0L7Qv9GA0L7RgdGLINC/0YDQtdC00YPQv9GA0LXQttC00LXQvdC4 0Y8g0L/QvtGC0LXQvdGG0LjQsNC70YzQvdGL0YUg0YDQuNGB0LrQvtCyINC/0YDQuCDQt9Cw0LrQ u9GO0YfQtdC90LjQuCDQuMKgPGJyPtC40YHQv9C+0LvQvdC10L3QuNC4INC00L7Qs9C+0LLQvtGA 0L7QsiDRgSDRg9GH0LDRgdGC0LjQtdC8INC40L3QvtGB0YLRgNCw0L3QvdGL0YUg0YTQuNGA0Lwu PC9iPjwvZm9udD48L3A+PHA+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGI+NS4g0J7RgtCy0LXRgtGB 0YLQstC10L3QvdC+0YHRgtGMINCy0L4g0LLQvdC10YjQvdC10Y3QutC+0L3QvtC80LjRh9C10YHQ utC40YUg0YHQtNC10LvQutCw0YUuPC9iPjxicj4tINCf0YDQuNC80LXQvdC10L3QuNC1INC80LXR gCDQvtGC0LLQtdGC0YHRgtCy0LXQvdC90L7RgdGC0Lgg0YHRgtC+0YDQvtC9INC+0LHRj9C30LDR gtC10LvRjNGB0YLQstCwINCyINC60L7QvdGC0LXQutGB0YLQtSDQv9GA0LDQstCwLCDQv9GA0LjQ vNC10L3QuNC80L7Qs9C+INC6wqA8YnI+0LTQvtCz0L7QstC+0YDRgy48YnI+LSDQntGB0L3QvtCy 0LDQvdC40Y8g0Lgg0YPRgdC70L7QstC40Y8g0L/RgNC40LzQtdC90LXQvdC40Y8g0LzQtdGAINC+ 0YLQstC10YLRgdGC0LLQtdC90L3QvtGB0YLQuC48YnI+LSDQo9Cx0YvRgtC60Lgg0Lgg0L3QtdGD 0YHRgtC+0LnQutCwLsKgPGJyPi0g0J/RgNC+0YbQtdC90YLRiyDQv9C+INC/0YDQuNC80LXQvdC4 0LzQvtC80YMg0L/RgNCw0LLRgy7CoDxicj4tINCh0YDQsNCy0L3QuNGC0LXQu9GM0L3Ri9C5INCw 0L3QsNC70LjQtyDQktC10L3RgdC60L7QuSDQutC+0L3QstC10L3RhtC40Lgg0Lgg0L3QvtGA0Lwg 0JPQmiDQoNCkLjwvZm9udD48L3A+PHA+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGI+Ni4g0J3QvtCy 0L7QtSDQsiDRgdGE0LXRgNC1INCy0LDQu9GO0YLQvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPINC4 INGA0LXQs9GD0LvQuNGA0L7QstCw0L3QuNGPINCy0LDQu9GO0YLQvdGL0YUg0L7Qv9C10YDQsNGG 0LjQuSDQv9GA0LjCoDxicj7QvtGB0YPRidC10YHRgtCy0LvQtdC90LjQuCDQktCt0JQuPC9iPjxi cj4tINCk0LXQtNC10YDQsNC70YzQvdGL0Lkg0LfQsNC60L7QvSDihJYxNzMt0KTQlyAmcXVvdDvQ niDQstCw0LvRjtGC0L3QvtC8INGA0LXQs9GD0LvQuNGA0L7QstCw0L3QuNC4INC4INCy0LDQu9GO 0YLQvdC+0Lwg0LrQvtC90YLRgNC+0LvQtSZxdW90OzrCoDxicj7QvtGB0L3QvtCy0L3Ri9C1INC/ 0L7QvdGP0YLQuNGPINC4INGC0YDQtdCx0L7QstCw0L3QuNGPLjxicj4tINCf0YDQsNC60YLQuNC6 0LAg0L/RgNC40LzQtdC90LXQvdC40Y8g0JjQvdGB0YLRgNGD0LrRhtC40Lgg0JHQsNC90LrQsCDQ oNC+0YHRgdC40Lgg0L7RgiAwNC4wNi4yMDEyIOKEliAxMzgt0JguwqA8YnI+LSDQn9C+0LvQvdC+ 0LzQvtGH0LjRjyDQvtGA0LPQsNC90L7QsiDQuCDQsNCz0LXQvdGC0L7QsiDQstCw0LvRjtGC0L3Q vtCz0L4g0LrQvtC90YLRgNC+0LvRjyAo0KTQndChLCDQoNC+0YHRhNC40L3QvdCw0LTQt9C+0YDQ sCwg0KTQotChLCDQsdCw0L3QutC4KSwg0LjRhcKgPGJyPtCy0LfQsNC40LzQvtC00LXQudGB0YLQ stC40LUuwqA8YnI+LSDQn9Cw0YHQv9C+0YDRgiDRgdC00LXQu9C60Lg6INCw0LrRgtGD0LDQu9GM 0L3Ri9C1INCy0L7Qv9GA0L7RgdGLLCDQv9GA0L7QsdC70LXQvNGLLCDQsNC90LDQu9C40Lcg0LDR gNCx0LjRgtGA0LDQttC90L7QuSDQv9GA0LDQutGC0LjQutC4LsKgPGJyPi0g0KHQsNC90LrRhtC4 0Lgg0LfQsCDQvdCw0YDRg9GI0LXQvdC40Y8g0LLQsNC70Y7RgtC90L7Qs9C+INC30LDQutC+0L3Q vtC00LDRgtC10LvRjNGB0YLQstCwLjxicj4tINCe0YHQvdC+0LLQvdGL0LUg0YLQtdC90LTQtdC9 0YbQuNC4INGB0YPQtNC10LHQvdC+0Lkg0L/RgNCw0LrRgtC40LrQuCDQv9C+INGB0L/QvtGA0LDQ vCDRgSDQoNC+0YHRhNC40L3QvdCw0LTQt9C+0YDQvtC8LjwvZm9udD48L3A+PHA+PGZvbnQgZmFj ZT0iQ2FtYnJpYSI+PGI+Ny4g0JHQsNC30LjRgdC90YvQtSDRg9GB0LvQvtCy0LjRjyDQv9C+0YHR gtCw0LLQutC4ICjQmNC90LrQvtGC0LXRgNC80YEgLSAyMDEwKS4g0JrQvtC80LzQtdC90YLQsNGA 0LjQuCDQuiDQvtGB0L3QvtCy0L3Ri9C8INC/0L7Qu9C+0LbQtdC90LjRj9C8LjwvYj48YnI+LSDQ n9GA0LjQvdGG0LjQv9GLINCj0J3QmNCU0KDQo9CQIDIwMTAuINCY0L3QutC+0YLQtdGA0LzRgSDQ uCDQstC40LTRiyDRgtGA0LDQvdGB0L/QvtGA0YLQsC7CoDxicj4tINCe0YjQuNCx0LrQuCDQuCDR gNC10LrQvtC80LXQvdC00LDRhtC40Lgg0L/QviDQstGL0LHQvtGA0YMg0L7Qv9GC0LjQvNCw0LvR jNC90YvRhSDRg9GB0LvQvtCy0LjQuSDQv9C+0YHRgtCw0LLQutC4Ljxicj4tINCY0L3QutC+0YLQ tdGA0LzRgSDQuCDRgdGC0YDQsNGF0L7QstCw0L3QuNC1LsKgPGJyPi0g0J/QtdGA0LXRhdC+0LQg 0L/RgNCw0LLQsCDRgdC+0LHRgdGC0LLQtdC90L3QvtGB0YLQuC48YnI+LSDQkdC10LfQstC+0LfQ vNC10LfQtNC90YvQtSDQv9C+0YHRgtCw0LLQutC4LjwvZm9udD48L3A+PHA+PGZvbnQgZmFjZT0i Q2FtYnJpYSI+PGI+OC4g0J7RgdC+0LHQtdC90L3QvtGB0YLQuCDQvdCw0LvQvtCz0L7QvtCx0LvQ vtC20LXQvdC40Y8g0Lgg0L3QsNC70L7Qs9C+0LLQvtCz0L4g0LrQvtC90YLRgNC+0LvRjyDQktCt 0JQg0LIgMjAxNiDQs9C+0LTRgy48L2I+PGJyPi0g0JrQvtC90YLRgNC+0LvQuNGA0YPQtdC80YvQ tSDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLRi9C1INGB0LTQtdC70LrQuCDRgSDRgtC+0YfQutC4 INC30YDQtdC90LjRjyDQvdCw0LvQvtCz0L7QstC+0LPQviDQt9Cw0LrQvtC90L7QtNCw0YLQtdC7 0YzRgdGC0LLQsC48YnI+LSDQndCU0KEg0L/RgNC4INGN0LrRgdC/0L7RgNGC0L3Qvi3QuNC80L/Q vtGA0YLQvdGL0YUg0L7Qv9C10YDQsNGG0LjRj9GFLiDQntGB0L7QsdC10L3QvdC+0YHRgtC4INC9 0LDQu9C+0LPQvtC+0LHQu9C+0LbQtdC90LjRjyDQv9GA0LjCoDxicj7QstC30LDQuNC80L7QvtGC 0L3QvtGI0LXQvdC40Y/RhSDRgSDQsdC70LjQttC90LjQvCDQt9Cw0YDRg9Cx0LXQttGM0LXQvC7C oDxicj4tINCe0YTQvtGA0LzQu9C10L3QuNC1INGB0YfQtdGC0L7Qsi3RhNCw0LrRgtGD0YAg0L/Q viDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLRi9C8INC+0L/QtdGA0LDRhtC40Y/QvC7CoDxicj4t INCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0LjRgdGH0LjRgdC70LXQvdC40Y8g0L3QsNC70L7Qs9Cw INC90LAg0L/RgNC40LHRi9C70Ywg0L/RgNC4INGB0L7QstC10YDRiNC10L3QuNC4INCy0L3QtdGI 0L3QtdGC0L7RgNCz0L7QstGL0YUg0YHQtNC10LvQvtC6LsKgPGJyPi0g0KHQu9GD0YfQsNC4INC4 INC+0YHQvdC+0LLQsNC90LjRjyDQtNC70Y8g0LjRgdGH0LjRgdC70LXQvdC40Y8g0Lgg0YPQtNC1 0YDQttCw0L3QuNGPINC90LDQu9C+0LPQsCDRgSDQtNC+0YXQvtC00L7QsiDQuCDQndCU0KEg0L/R gNC4wqA8YnI+0L/QtdGA0LXRh9C40YHQu9C10L3QuNGP0YUg0LIg0LDQtNGA0LXRgSDQuNC90L7R gdGC0YDQsNC90L3QvtC5INC+0YDQs9Cw0L3QuNC30LDRhtC40LguINCe0YLRh9C10YLQvdC+0YHR gtGMINC90LDQu9C+0LPQvtCy0L7Qs9C+INCw0LPQtdC90YLQsCDQv9C+INCd0JTQoSDQuMKgPGJy PtC00L7RhdC+0LTQsNC8LjwvZm9udD48L3A+PHA+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGI+OS4g 0KLQsNC80L7QttC10L3QvdC+0LUg0YDQtdCz0YPQu9C40YDQvtCy0LDQvdC40LUg0Lgg0JLQotCe LsKgPC9iPjxicj4tINCe0YHQvtCx0LXQvdC90L7RgdGC0Lgg0L/QvtC00LPQvtGC0L7QstC60Lgg 0L7RgdC90L7QstC90YvRhSDQtNC+0LrRg9C80LXQvdGC0L7QsiDQtNC70Y8g0YDQtdCw0LvQuNC3 0LDRhtC40Lgg0LLQvdC10YjQvdC10YLQvtGA0LPQvtCy0L7QuSDRgdC00LXQu9C60Lgg0LjCoDxi cj7RgtCw0LzQvtC20LXQvdC90L7Qs9C+INC+0YTQvtGA0LzQu9C10L3QuNGPINGC0L7QstCw0YDQ vtCyLjxicj4tINCh0L7QvtGC0L3QvtGI0LXQvdC40LUg0L7QsdGP0LfQsNGC0LXQu9GM0YHRgtCy INCg0L7RgdGB0LjQuCDQsiDRgNCw0LzQutCw0YUg0JLQotCeINC4INCyINGA0LDQvNC60LDRhSDQ otCw0LzQvtC20LXQvdC90L7Qs9C+INGB0L7RjtC30LAuwqA8YnI+0KDQtdCz0YPQu9C40YDQvtCy 0LDQvdC40LUg0LTQstC40LbQtdC90LjRjyDRgtC+0LLQsNGA0L7QsiDQvdCwINCz0YDQsNC90LjR htCw0YUg0KLQsNC80L7QttC10L3QvdC+0LPQviDRgdC+0Y7Qt9CwINC4INCy0L3Rg9GC0YDQuCDQ otCw0LzQvtC20LXQvdC90L7Qs9C+wqA8YnI+0YHQvtGO0LfQsC48YnI+LSDQn9GA0LDQstC+0LLR i9C1INC40L3RgdGC0YDRg9C80LXQvdGC0Ysg0Lgg0L/RgNC+0YbQtdC00YPRgNGLINGD0YDQtdCz 0YPQu9C40YDQvtCy0LDQvdC40LUg0YLQvtGA0LPQvtCy0YvRhSDRgdC/0L7RgNC+0LIg0LIg0YDQ sNC80LrQsNGFINCS0KLQni4g0KDQuNGB0LrQuMKgPGJyPtC4INC90LXQttC10LvQsNGC0LXQu9GM 0L3Ri9C1INGB0LjRgtGD0LDRhtC40Lgg0L/QviDQtNC10LnRgdGC0LLRg9GO0YnQuNC8INC00L7Q s9C+0LLQvtGA0LDQvC48L2ZvbnQ+PC9wPjxwPjxmb250IGZhY2U9IkNhbWJyaWEiPjxiPjEwLiDQ ntC/0YDQtdC00LXQu9C10L3QuNC1INC90LDQuNCx0L7Qu9C10LUg0Y3RhNGE0LXQutGC0LjQstC9 0L7QuSDQvNC+0LTQtdC70Lgg0YDQsNGB0YHQvNC+0YLRgNC10L3QuNGPINCy0L3QtdGI0L3QtdGC 0L7RgNCz0L7QstGL0YUg0YHQv9C+0YDQvtCyINCywqA8YnI+0LDRgNCx0LjRgtGA0LDQttC90YvR hSDRgdGD0LTQsNGFINCg0KQuwqA8L2I+0JLRi9Cx0L7RgCDQvNC10LbQtNGDINCz0L7RgdGD0LTQ sNGA0YHRgtCy0LXQvdC90YvQvCDRgdGD0LTQvtC8INC4INC80LXQttC00YPQvdCw0YDQvtC00L3R i9C8wqA8YnI+0LrQvtC80LzQtdGA0YfQtdGB0LrQuNC8INCw0YDQsdC40YLRgNCw0LbQtdC8Ljxi cj4tINCf0YDQvtGG0LXRgdGB0YPQsNC70YzQvdGL0LUg0L7RgdC+0LHQtdC90L3QvtGB0YLQuCwg 0L/RgNC10LjQvNGD0YnQtdGB0YLQstCwINC4INC90LXQtNC+0YHRgtCw0YLQutC4INGA0LDRgdGB 0LzQvtGC0YDQtdC90LjRjyDQstC90LXRiNC90LXRgtC+0YDQs9C+0LLRi9GFwqA8YnI+0YHQv9C+ 0YDQvtCyINCyINCz0L7RgdGD0LTQsNGA0YHRgtCy0LXQvdC90YvRhSDQsNGA0LHQuNGC0YDQsNC2 0L3Ri9GFINGB0YPQtNCw0YUuwqA8YnI+LSDQn9GA0L7RhtC10YHRgdGD0LDQu9GM0L3Ri9C1INC+ 0YHQvtCx0LXQvdC90L7RgdGC0Lgg0YDQsNGB0YHQvNC+0YLRgNC10L3QuNGPINGB0L/QvtGA0L7Q siDQsiDQnNCa0JDQoSDQuCDQotCf0J8g0KDQpC7CoDxicj4tINCh0L7RgdGC0LDQstC70LXQvdC4 0LUg0LDRgNCx0LjRgtGA0LDQttC90L7QuSDQvtCz0L7QstC+0YDQutC4OiDQv9GA0LDQutGC0LjR h9C10YHQutC40LUg0LLQvtC/0YDQvtGB0Ysg0Lgg0YDQtdC60L7QvNC10L3QtNCw0YbQuNC4LsKg PGJyPi0g0J7RgdC/0LDRgNC40LLQsNC90LjQtSDQuCDQv9GA0LjQstC10LTQtdC90LjQtSDQsiDQ uNGB0L/QvtC70L3QtdC90LjQtSDRgNC10YjQtdC90LjQuSDQvNC10LbQtNGD0L3QsNGA0L7QtNC9 0YvRhSDQutC+0LzQvNC10YDRh9C10YHQutC40YXCoDxicj7QsNGA0LHQuNGC0YDQsNC20LXQuTog 0YDQsNGB0YHQvNC+0YLRgNC10L3QuNC1INC/0L7RgdC70LXQtNC90LXQuSDQv9GA0LDQutGC0LjQ utC4INCy0L3QtdGI0L3QtdGC0L7RgNCz0L7QstGL0YUg0YHQv9C+0YDQvtCyINCyINGA0L7RgdGB 0LjQudGB0LrQuNGFwqA8YnI+0LPQvtGB0YPQtNCw0YDRgdGC0LLQtdC90L3Ri9GFINGB0YPQtNCw 0YUg0Lgg0LzQtdC20LTRg9C90LDRgNC+0LTQvdGL0YUg0LrQvtC80LzQtdGA0YfQtdGB0LrQuNGF INCw0YDQsdC40YLRgNCw0LbQsNGFLsKgPGJyPi0g0JDQvdCw0LvQuNC3INCw0LrRgtGD0LDQu9GM 0L3Ri9GFINC/0YDQsNC60YLQuNGH0LXRgdC60LjRhSDQstC+0L/RgNC+0YHQvtCyLjwvZm9udD48 L3A+PHA+PGZvbnQgZmFjZT0iQ2FtYnJpYSI+PGI+MTEuINCf0YDQsNCy0L7QstC+0LUg0L/QvtC7 0L7QttC10L3QuNC1INC40L3QvtGB0YLRgNCw0L3QvdGL0YUg0LvQuNGGINCyINCw0YDQsdC40YLR gNCw0LbQvdC+0Lwg0L/RgNC+0YbQtdGB0YHQtS7CoDwvYj48YnI+LSDQo9GB0YLQsNC90L7QstC7 0LXQvdC40LUg0L/RgNCw0LLQvtCy0L7Qs9C+INGB0YLQsNGC0YPRgdCwINC40L3QvtGB0YLRgNCw 0L3QvdGL0YUg0LvQuNGGLsKgPGJyPi0g0J7RgdC+0LHQtdC90L3QvtGB0YLQuCDRgNCw0YHRgdC8 0L7RgtGA0LXQvdC40Y8g0LTQtdC7INGBINGD0YfQsNGB0YLQuNC10Lwg0LjQvdC+0YHRgtGA0LDQ vdC90YvRhSDQu9C40YYuwqA8YnI+LSDQn9C+0YDRj9C00L7QuiDQuNC30LLQtdGJ0LXQvdC40Y8g 0LjQvdC+0YHRgtGA0LDQvdC90YvRhSDQu9C40YYuPGJyPi0g0J/RgNC40LfQvdCw0L3QuNC1INC4 INC/0YDQuNCy0LXQtNC10L3QuNC1INCyINC40YHQv9C+0LvQvdC10L3QuNC1INGA0LXRiNC10L3Q uNC5INC40L3QvtGB0YLRgNCw0L3QvdGL0YUg0YHRg9C00L7Qsi48YnI+LSDQntGB0L3QvtCy0LDQ vdC40Y8g0LTQu9GPINC/0YDQuNC30L3QsNC90LjRjyDQuCDQuNGB0L/QvtC70L3QtdC90LjRjyDR gNC10YjQtdC90LjQuSDQuNC90L7RgdGC0YDQsNC90L3Ri9GFINGB0YPQtNC+0LIg0Lgg0LDRgNCx 0LjRgtGA0LDQttC10LkuwqA8YnI+LSDQntC/0YDQtdC00LXQu9C10L3QuNC1INCw0YDQsdC40YLR gNCw0LbQvdC+0LPQviDRgdGD0LTQsCDQv9C+INC00LXQu9GDINC+INC/0YDQuNC30L3QsNC90LjQ uCDQuCDQv9GA0LjQstC10LTQtdC90LjQuCDQsiDQuNGB0L/QvtC70L3QtdC90LjQtSDRgNC10YjQ tdC90LjRj8KgPGJyPtC40L3QvtGB0YLRgNCw0L3QvdC+0LPQviDRgdGD0LTQsC48YnI+PGJyPjxz cGFuIGxhbmc9ImVuLXVzIj4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t PC9zcGFuPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+PGI+0KHRgtC+0LjQvNC+ 0YHRgtGMINGD0YfQsNGB0YLQuNGPOjwvYj7CoDI4OTAwINGA0YPQsS7CoDxicj48Yj7QodC60LjQ tNC60Lg8L2I+wqAoMiDRh9C10LvQvtCy0LXQutCwIC0gMTAlLCAzINGH0LXQu9C+0LLQtdC60LAg LSAxNSUsIDQg0YfQtdC70L7QstC10LrQsCDQuCDQsdC+0LvQtdC1IC0gMjAlKS48YnI+PGI+0JzQ tdGB0YLQviDQv9GA0L7QstC10LTQtdC90LjRjzrCoDwvYj7QvC4g0JHQsNGD0LzQsNC90YHQutCw 0Y8sINGD0LsuINCR0LDRg9C80LDQvdGB0LrQsNGPLCDQtC42LCDQsdC40LfQvdC10YEg0YbQtdC9 0YLRgCAmcXVvdDvQktC40LrRgtC+0YDQuNGPINCf0LvQsNC30LAmcXVvdDsuPGJyPtCSINGB0YLQ vtC40LzQvtGB0YLRjCDQstGF0L7QtNC40YIg0LzQtdGC0L7QtNC40YfQtdGB0LrQuNC5INC80LDR gtC10YDQuNCw0LssINC+0LHQtdC00YssINC60L7RhNC1LdC/0LDRg9C30YssINGB0LXRgNGC0LjR hNC40LrQsNGCLjxicj7CoDwvZm9udD48L3A+PC90ZD48dGQ+wqA8L3RkPjx0ZCBiZ2NvbG9yPSIj NjY2Njk5Ij7CoDwvdGQ+PC90cj48dHI+PHRkIGJnY29sb3I9IiM2NjY2OTkiPsKgPC90ZD48dGQg Ymdjb2xvcj0iI0ZCRjhGQyIgd2lkdGg9IjQiPsKgPC90ZD48dGQgYmdjb2xvcj0iIzY2NjY5OSI+ wqA8L3RkPjx0ZCBiZ2NvbG9yPSIjNjY2Njk5Ij7CoDwvdGQ+PHRkIGJnY29sb3I9IiM2NjY2OTki PsKgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj4NCg== ------------5A4897013FB1C13F2-- From asavkov@redhat.com Wed Aug 24 03:08:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 27B337CA0 for ; Wed, 24 Aug 2016 03:08:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88310AC001 for ; Wed, 24 Aug 2016 01:08:37 -0700 (PDT) X-ASG-Debug-ID: 1472026115-0bf57b53121626d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id k0ylxGbpFgS85tyz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 01:08:36 -0700 (PDT) X-Barracuda-Envelope-From: asavkov@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4ED5D81138; Wed, 24 Aug 2016 08:08:35 +0000 (UTC) Received: from shodan.usersys.redhat.com (dhcp-1-150.brq.redhat.com [10.34.1.150]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7O88Yk6029901; Wed, 24 Aug 2016 04:08:34 -0400 Received: by shodan.usersys.redhat.com (Postfix, from userid 1000) id 9ED4D2C1A4A; Wed, 24 Aug 2016 10:08:33 +0200 (CEST) Date: Wed, 24 Aug 2016 10:08:33 +0200 From: Artem Savkov To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Message-ID: <20160824080833.GA11104@shodan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. References: <1471967653-2561-1-git-send-email-asavkov@redhat.com> <20160824015551.GB19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20160824015551.GB19025@dastard> User-Agent: Mutt/1.7+2 (e5fcfc5f9c2e) (2016-08-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 24 Aug 2016 08:08:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472026116 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2078 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 24, 2016 at 11:55:51AM +1000, Dave Chinner wrote: > On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote: > > Commit "xfs: only return -errno or success from attr ->put_listent" changes the > > Please quote commits in --oneline format in changelogs - it makes it > much easier to find the change you are refering to if there is both > a commit ID and the text string in the commit message. (i.e. text > string confirms the commit id is the one you meant to quote). Noted, thanks. > > commit 2a6fba6 ("xfs: only return -errno or success from attr > ->put_listent") is the one you are refering to here, right? Yes, that is the one. > > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient > > space in the buffer assuming that setting context->count to -1 would be enough, > > but all of the ->put_listent callers only check seen_enough. This results in > > a failed assertion: > > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 > > in insufficient buffer size case. > > You have a test case? Can you turn it into an xfstest? We really > need regression tests that cover issues like this.... > llistxattr02 test from LTP reliably hits this, I'll see how this can be ported to xfstest. > > Signed-off-by: Artem Savkov > > --- > > fs/xfs/xfs_xattr.c | 1 + > > 1 file changed, 1 insertion(+) > > > > diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c > > index ea62245..6290093 100644 > > --- a/fs/xfs/xfs_xattr.c > > +++ b/fs/xfs/xfs_xattr.c > > @@ -147,6 +147,7 @@ __xfs_xattr_put_listent( > > arraytop = context->count + prefix_len + namelen + 1; > > if (arraytop > context->firstu) { > > context->count = -1; /* insufficient space */ > > + context->seen_enough = 1; > > return 0; > > } > > offset = (char *)context->alist + context->count; > > Looks sane, though I don't know how to test it yet.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Regards, Artem From Sales.6@mike.com Wed Aug 24 07:25:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AED8C7CA0 for ; Wed, 24 Aug 2016 07:25:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 02387AC001 for ; Wed, 24 Aug 2016 05:25:16 -0700 (PDT) X-ASG-Debug-ID: 1472041511-0bf57b5312170020001-NocioJ Received: from mike.com ([36.22.24.245]) by cuda.sgi.com with SMTP id 6dz66QLLJ6MkooBC for ; Wed, 24 Aug 2016 05:25:12 -0700 (PDT) X-Barracuda-Envelope-From: Sales.6@mike.com X-Barracuda-Effective-Source-IP: UNKNOWN[36.22.24.245] X-Barracuda-Apparent-Source-IP: 36.22.24.245 Sender: Sales.6@mike.com Received: from PC-20151225RDFR[127.0.0.1] by PC-20151225RDFR[127.0.0.1] (SMTPD32); Wed, 24 Aug 2016 20:25:23 +0800 From: "simon.lilei@163.com" Subject: cap & hat & jacket & pants & down jacket To: xfs@oss.sgi.com X-ASG-Orig-Subj: cap & hat & jacket & pants & down jacket MIME-Version: 1.0 Reply-To: simon.lilei@163.com Date: Wed, 24 Aug 2016 20:25:23 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[36.22.24.245] X-Barracuda-Start-Time: 1472041512 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9139 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.94 X-Barracuda-Spam-Status: No, SCORE=0.94 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32281 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.20 BSF_SC0_SA038b Custom Rule SA038b 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160824122516.46D306430F3@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA5LjAwLjgxMTIuMTY3MTciPjwvSEVBRD4NCjxCT0RZPg0KPERJViANCnN0eWxl PSJURVhULVRSQU5TRk9STTogbm9uZTsgVEVYVC1JTkRFTlQ6IDBweDsgTEVUVEVSLVNQQUNJTkc6 IG5vcm1hbDsgRk9OVDogMTRweC8yMXB4IEFyaWFsLCBWZXJkYW5hLCBzYW5zLXNlcmlmOyBXSElU RS1TUEFDRTogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7IC13 ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iTElORS1IRUlHSFQ6 IDEuNTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IGxhcmdlIj48Rk9OVCANCnNpemU9 Mz48U1RST05HPkhlbGxvIG1hbmFnZXJzLDwvU1RST05HPjwvRk9OVD48L1NQQU4+PC9ESVY+DQo8 RElWIA0Kc3R5bGU9IlRFWFQtVFJBTlNGT1JNOiBub25lOyBURVhULUlOREVOVDogMHB4OyBMRVRU RVItU1BBQ0lORzogbm9ybWFsOyBGT05UOiAxNHB4LzIxcHggQXJpYWwsIFZlcmRhbmEsIHNhbnMt c2VyaWY7IFdISVRFLVNQQUNFOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJ Tkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij4NCjxESVY+PEEgaHJlZj0i YWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRk ZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8 RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklT SUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+ PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQ QU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48 L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJn ZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00 IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48Rk9OVCBzaXplPTQgZmFj ZT1BcmlhbD53ZSBhcmUgYSBjdXN0b21pemVkIGdhcm1lbnRzIGV4cG9ydGVyIGluIENISU5BIGZv ciANCnllYXJzLCBsb29raW5nIGZvciBpbXBvcnRlcnMgaW4geW91ciBhcmVhOjwvRk9OVD48L1A+ DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0i VklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQ QU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+ PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1Bcmlh bD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0 YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6 ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFi b3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVu Ij48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPFA+ PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+d2UgY2FuIHN1cHBseTo8L0ZPTlQ+PC9QPg0KPERJVj48 QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJ VFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48 L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0 eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05U PjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9i bGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNl PUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFu ayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQg DQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxQPjxGT05UIHNp emU9NCBmYWNlPUFyaWFsPmphY2tldHM6IDwvRk9OVD48Rk9OVCBzaXplPTQgZmFjZT1BcmlhbD53 YXRlciBwcm9vZiwgDQpzb2Z0c2hlbGwsIHdpbnRlciwgbGFkeSwgZmxlZWNlLCAsIGRvd24gamFj a2V0LCBwYWRkaW5nLDwvRk9OVD48L1A+DQo8UD48Rk9OVCBzaXplPTQ+V2ludGVyIGtuaXR0ZWQg aGF0cyAmYW1wOyBnbG92ZXMgJmFtcDsgc2NhcmYgJmFtcDsgc2hhd2wgJmFtcDsgDQpuZWNrIHdh cm1lcnMuLi4uLi4uLi48L0ZPTlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRh cmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXpl PTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJv dXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4i PjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElW PjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJ TElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9B PjwvRElWPg0KPFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+Q29hdHM6IDwvRk9OVD48Rk9OVCBm YWNlPUFyaWFsPjxGT05UIHNpemU9ND50cmVuY2gsIA0KbGFkeSwgbWVucywgY2FzdWFsLCB3b29s ZW4gY29hdHMuLi4uLi4uLi4uPC9GT05UPjxGT05UIHNpemU9ND4gc2hpcnRzLHN1aXRzLCANCmJs YXplcnMsLCAuLi4uLi48L0ZPTlQ+PC9GT05UPjwvUD4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxh bmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05U IA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhy ZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTog aGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElW Pg0KPFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvUD4NCjxESVY+PEEgaHJlZj0i YWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRk ZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8 RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklT SUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+ PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQ QU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48 L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxQPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPlBhbnRz OiA8L0ZPTlQ+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+Q2FyZ28sIA0KY2FzdWFsLC4uLi4uLi4u Li4uLi4uLi4uPC9GT05UPjwvUD4NCjxQPjxGT05UIGZhY2U9QXJpYWw+PEZPTlQgc2l6ZT00Pndv cmt3ZWFyOiBjb3ZlcmFsbCwgaGlnaC12aXogamFja2V0cywgDQpyZWZsZWN0aXZlIHZlc3RzLi4u Li48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQPjxGT05UIHNpemU9ND5BbmQgb3RoZXIga2luZHMgb2Yg Y3VzdG9taXplZCBnYXJtZW50cy4uLi4uPC9GT05UPjxGT05UIA0KZmFjZT1BcmlhbD48QlI+PEZP TlQgc2l6ZT00Pi48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQPjxGT05UIHNpemU9ND5Ib3BlIHRvIGdl dCBsb25nIHRlcm0gY29vcGVyYXRpb24gd2l0aCB5b3UgYW5kIHlvdXIgZXN0ZWVtZWQgDQpjb21w YW55ITwvRk9OVD48L1A+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFu az48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFy aWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMi IHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpz aXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0i YWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRk ZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8 RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklT SUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+ PC9BPjwvRElWPg0KPFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+QmVzdCByZWdhcmRzLDwvRk9O VD48L1A+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBz dHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9O VD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1f Ymxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFj ZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxh bmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05U IA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhy ZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTog aGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElW Pg0KPFA+PEZPTlQgc2l6ZT00IGZhY2U9QXJpYWw+TEkgTEVJPC9GT05UPjwvUD4NCjxESVY+PEEg aHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZ OiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9E SVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHls ZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48 L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxh bms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1B cmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxhbmsj IiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0K c2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48Rk9OVCBmYWNl PUFyaWFsPjxGT05UIHNpemU9ND48L0ZPTlQ+PC9GT05UPjwvUD4NCjxESVY+PEEgaHJlZj0iYWJv dXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4i PjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElW PjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJ TElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9B PjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4g c3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZP TlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9 X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZh Y2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+PEZPTlQgZmFjZT1BcmlhbD48QlI+PEZP TlQgDQpzaXplPTQ+PFNUUk9ORz5CQU1UT04gSU5EVVNUUlkgQ08uLExURDwvU1RST05HPjwvRk9O VD48L0ZPTlQ+IA0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PEZP TlQgZmFjZT1BcmlhbD48U1BBTiANCnN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjwvU1BBTj48 L0ZPTlQ+PC9BPjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxh bms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1B cmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6Ymxhbmsj IiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0K c2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48Rk9OVCBzaXpl PTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRh cmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXpl PTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJv dXQ6YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4i PjxGT05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElW PjxBIGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJ TElUWTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9B PjwvRElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4g c3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZP TlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxQPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPjxTVFJPTkc+ SFVBSUFOIEZFTkdGQU4gSU1QT1JUICZhbXA7IEVYUE9SVCANCkNPLixMVEQ8L1NUUk9ORz48L0ZP TlQ+PC9QPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4g c3R5bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZP TlQ+PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9 X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZh Y2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxBIGhyZWY9ImFib3V0OmJs YW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElUWTogaGlkZGVuIj48Rk9O VCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwvRElWPg0KPERJVj48QSBo cmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5bGU9IlZJU0lCSUxJVFk6 IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+PC9TUEFOPjwvQT48L0RJ Vj4NCjxQPjxGT05UIHNpemU9NCBmYWNlPUFyaWFsPk5PLjEyNSwgSFVBSVlJTiBESVNUUklDVCwg SFVBSUFOLCBKSUFOR1NVLCANCkNISU5BPC9GT05UPjwvUD4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6 YmxhbmsjIiB0YXJnZXQ9X2JsYW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxG T05UIA0Kc2l6ZT00IGZhY2U9QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8RElWPjxB IGhyZWY9ImFib3V0OmJsYW5rIyIgdGFyZ2V0PV9ibGFuaz48U1BBTiBzdHlsZT0iVklTSUJJTElU WTogaGlkZGVuIj48Rk9OVCANCnNpemU9NCBmYWNlPUFyaWFsPjwvRk9OVD48L1NQQU4+PC9BPjwv RElWPg0KPERJVj48QSBocmVmPSJhYm91dDpibGFuayMiIHRhcmdldD1fYmxhbms+PFNQQU4gc3R5 bGU9IlZJU0lCSUxJVFk6IGhpZGRlbiI+PEZPTlQgDQpzaXplPTQgZmFjZT1BcmlhbD48L0ZPTlQ+ PC9TUEFOPjwvQT48L0RJVj4NCjxESVY+PEEgaHJlZj0iYWJvdXQ6YmxhbmsjIiB0YXJnZXQ9X2Js YW5rPjxTUEFOIHN0eWxlPSJWSVNJQklMSVRZOiBoaWRkZW4iPjxGT05UIA0Kc2l6ZT00IGZhY2U9 QXJpYWw+PC9GT05UPjwvU1BBTj48L0E+PC9ESVY+DQo8UD48Rk9OVCBmYWNlPUFyaWFsPjxGT05U IHNpemU9ND5URUw6Kzg2IDE4MTIxNjg1MjU4LCAxNTA1MTM4MTYyNyBFLU1BSUw6PFNQQU4gDQpj bGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+IDwvU1BBTj48L0ZPTlQ+PEEgDQpocmVmPSJtYWls dG86YnQtdGV4dGlsZXMuY29tc2ltb24ubGlsZWlAMTYzLmNvbSI+PEZPTlQgY29sb3I9IzAwMDAw MCANCnNpemU9ND5zaW1vbi5saWxlaUAxNjMuY29tPC9GT05UPjwvQT48L0ZPTlQ+PC9QPjwvRElW PjwvQk9EWT48L0hUTUw+DQoNCg== From 3IZa9VxQKAwglzq3m-0pizm0-vwzmxt6owwotm.kwu5n0w00.0oq.kwu@doclist.bounces.google.com Wed Aug 24 07:42:12 2016 Return-Path: <3IZa9VxQKAwglzq3m-0pizm0-vwzmxt6owwotm.kwu5n0w00.0oq.kwu@doclist.bounces.google.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4BC3A7CA0 for ; Wed, 24 Aug 2016 07:42:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E48F8F8035 for ; Wed, 24 Aug 2016 05:42:12 -0700 (PDT) X-ASG-Debug-ID: 1472042530-0bf57b53141723f0001-NocioJ Received: from mail-it0-f69.google.com (mail-it0-f69.google.com [209.85.214.69]) by cuda.sgi.com with ESMTP id SmqGhbvtHnGehRJK (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 24 Aug 2016 05:42:10 -0700 (PDT) X-Barracuda-Envelope-From: 3IZa9VxQKAwglzq3m-0pizm0-vwzmxt6owwotm.kwu5n0w00.0oq.kwu@doclist.bounces.google.com X-Barracuda-Effective-Source-IP: mail-it0-f69.google.com[209.85.214.69] X-Barracuda-Apparent-Source-IP: 209.85.214.69 Received: by mail-it0-f69.google.com with SMTP id f6so9149578ith.1 for ; Wed, 24 Aug 2016 05:42:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:reply-to:references:message-id:date:subject:from:to:cc; bh=cR6SIhYF0pOeWWMoB56lucZzq2g/rdnRvhr1F8UQQjU=; b=Gfg88DRbQR2TAOxF7tBCoxfrUqXRUUA9jelc3rBO1HxJqaE9Zz++NBPTG1etqSFbE0 6kYLebOOrcgwKQh0nSBEvST9c6ybwQ7ljkxsEQUXlJcxogEuElnrD/4GjLnUVUnq51Pr ruyliBEbG0Xj1lYQYXqOGg8H4iyGVfo4iGC+jB0aKvqCkFgBLAifca2PWEROMzOJC8qn NtepuB/gbO+hVQ+FVtuQpN4su9VZkcs2kPG2vjX8q0fOP7bWIHGr3beYj63FQqxrIkV3 0V9pex6svtYl9PIboSLzz9/yrIOAewk5pDRFraOmQlk6e+Xae8PHHJSSnqCBgI8KDOdq ddnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:reply-to:references:message-id:date :subject:from:to:cc; bh=cR6SIhYF0pOeWWMoB56lucZzq2g/rdnRvhr1F8UQQjU=; b=lzjiH9W9cJD6Zd8Bnb+UEx5ytcXo4B3CfrgHqtO24lRYbk3DUu4di3mkf+Jophi4JS NDJl3n9FtiOK5fz3cg80ZoNNcQJ1FzquKqHzDZ8JQIjZdguhUHGezF33Hi9kOsk8AztN ZyloNJx/ucUjBvwnbKrlpYjBiE4iNpkiPRJj3Gn2Uwniwt6cniWSoM6wn76u7pNQQ6Ic mCaQsh0MNRmIimNFwiCLiwpXNP+J2G40lAHgCDDrdzV8fd5ynrE+E285YeadcLPA5cZ/ nNZ9fthLBm83gVO+tUAI8/36C+GKAhnUMJMLL3u50EdgFtgRn09YU/LY9Ua1DoMCufnp RZGA== X-Gm-Message-State: AE9vXwPPJUmycci1dafxKb1DG0WMXpk1YRxZ1h9RRQYMSrtgWgIKeOHirtTC6qKjl44dDm7oU964Vg== MIME-Version: 1.0 X-Received: by 10.157.56.40 with SMTP id i37mr1862760otc.46.1472042529042; Wed, 24 Aug 2016 05:42:09 -0700 (PDT) Reply-To: "TV to a living signage..." X-Originating-IP: 98.126.12.117 X-No-Auto-Attachment: 1 References: Message-ID: <001a113e0da409b503053ad09c5f@google.com> Date: Wed, 24 Aug 2016 12:42:09 +0000 Subject: Sysview digital signage solution, changing your smart TV to a living signage41017 - Invitation to view From: "TV to a living signage... (via Google Drive)" X-ASG-Orig-Subj: Sysview digital signage solution, changing your smart TV to a living signage41017 - Invitation to view To: xfs@oss.sgi.com Cc: Vicky.Williams@bbr.com, Trang@fbc-cpa.com, info@getawaeco.com.au, captthom@gisco.net, hls@suffolklibraries.co.uk, aqbs@appraisalfoundation.org, support@movingimagecameras.co.uk, john@jwcareyphotos.com, subscribe@virtualtomorrow.com, india@apxpress.com, educationservices@saintelizabeth.com, news@hometechmtl.com, tires@tceq.texas.gov, webdomain@patagonia.com, andy-shirley@hotmail.co.uk, nancy.norton@watermatters.org, sales@francos-ices.co.uk, info@directplusinc.com, vadim.zinakov@Xyleminc.com, sales@newitts.com, info@sandbanksyachtcompany.com, andrew.forsyth@bromwichhardy.com, ed@compassk9.co.uk, vanithhoeum@yahoo.com, cms@insidemagazines.co.uk, grafomer@yahoo.com, Extensions@Frieger.com, sales@barcodelabels.com.au, 0DElizabeth@contractsupport.com, melia.avenida.america@melia.com, adamwong@pipelectronics.hk, info@madeofsugarandspice.com, denis.walsh@utoronto.ca, donnabrooksrealtor@msn.com, kandhari_travels@yahoo.co.in, info@wildarc.com, johan.dorfling@axxess.co.za, elliot@bytewire.co.uk, joostenbrink@netafimusa.com, Jnlinen@yahoo.com, kay@fairlyfitfemale.com, BRANDIECARLOS@GMAIL.COM, dylan.claiborne@adair.kyschools.us, booksnthings21@msn.com, Alphamail@att.net, webmaster@6pmarketing.com, ecarroll@weichert.com, ijkema@het-imo.net, attorneyjobfinder@gmail.com Content-Type: multipart/alternative; boundary=001a113e0da409b48e053ad09c5c X-Barracuda-Connect: mail-it0-f69.google.com[209.85.214.69] X-Barracuda-Start-Time: 1472042530 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7077 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32281 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a113e0da409b48e053ad09c5c Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes I've shared an item with you: Sysview digital signage solution, changing your smart TV to a living signage41017 https://drive.google.com/folderview?id=0B2bSh-xDwJzSRFNOZHYxcU45TUE&usp=sharing&invite=CMriwtYN&ts=57bd9620 It's not an attachment -- it's stored online. To open this item, just click the link above. Dear Sirs, From internet we know you are leading on AV/TV product reseller field. Sysview is a hardware dependent digital signage software, capable upgrade your existing screen to a digital signage . Sysview features following : SaaS based Hardware dependent No monthly/Annual Fees Manage centralized from any device (PC/Tablet/Phone),using any operation system 90 days free trial account is available now. Try this freely now. Best Regards Anna Wang Manager | Sales department No.3 Section (China Shenzhen Branch) --001a113e0da409b48e053ad09c5c Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
TV to a living= signage Sysview digital signage solution, changing your smart has invi= ted you to view the following shared folder:
3D"=E5=8F=91=E4=BB=B6=E4=BA=BA=Dear Sirs,
From internet we know you are leading on AV/TV product reseller field= .

Sysview is a hardware dependent digital signage software, capable = upgrade your existing screen to a digital signage . Sysview features follow= ing :

SaaS based
Hardware dependent
No monthly/Annual FeesManage centralized from any device (PC/Tablet/Phone),using any operation = system

90 days free trial account is available now.

Try th= is freely now.

Best Regards

Anna Wang
Manager | Sales dep= artment No.3 Section (China Shenzhen Branch)
Open
This e= mail grants access to this item without logging in. Only forward it to peop= le you trust.
<= /div>
Goog= le Drive: Have all your files within reach from any device.
Google Inc= . 1600 Amphitheatre Parkway, Mountain View, CA 94043, USA
=3D"Logo
<= /body> --001a113e0da409b48e053ad09c5c-- From bfoster@redhat.com Wed Aug 24 07:55:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F00507CA0 for ; Wed, 24 Aug 2016 07:55:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B13168F8035 for ; Wed, 24 Aug 2016 05:55:32 -0700 (PDT) X-ASG-Debug-ID: 1472043330-0bf57b5314172ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BlXzzlKpPlml4xJb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 05:55:31 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B194F81255 for ; Wed, 24 Aug 2016 12:55:30 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-33.bos.redhat.com [10.18.41.33]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7OCtUUr011897 for ; Wed, 24 Aug 2016 08:55:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 64318121479; Wed, 24 Aug 2016 08:55:29 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: prevent dropping ioend completions during buftarg wait Date: Wed, 24 Aug 2016 08:55:29 -0400 X-ASG-Orig-Subj: [PATCH] xfs: prevent dropping ioend completions during buftarg wait Message-Id: <1472043329-30700-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Wed, 24 Aug 2016 12:55:30 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472043331 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1983 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_wait_buftarg() waits for all pending I/O, drains the ioend completion workqueue and walks the LRU until all buffers in the cache have been released. This is traditionally an unmount operation` but the mechanism is also reused during filesystem freeze. xfs_wait_buftarg() invokes drain_workqueue() as part of the quiesce, which is intended more for a shutdown sequence in that it indicates to the queue that new operations are not expected once the drain has begun. New work jobs after this point result in a WARN_ON_ONCE() and are otherwise dropped. With filesystem freeze, however, read operations are allowed and can proceed during or after the workqueue drain. If such a read occurs during the drain sequence, the workqueue infrastructure complains about the queued ioend completion work item and drops it on the floor. As a result, the buffer remains on the LRU and the freeze never completes. Despite the fact that the overall buffer cache cleanup is not necessary during freeze, fix up this operation such that it is safe to invoke during non-unmount quiesce operations. Replace the drain_workqueue() call with flush_workqueue(), which runs a similar serialization on pending workqueue jobs without causing new jobs to be dropped. This is safe for unmount as unmount independently locks out new operations by the time xfs_wait_buftarg() is invoked. Signed-off-by: Brian Foster --- fs/xfs/xfs_buf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 607cc29..b5b9bff 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1611,7 +1611,7 @@ xfs_wait_buftarg( */ while (percpu_counter_sum(&btp->bt_io_count)) delay(100); - drain_workqueue(btp->bt_mount->m_buf_workqueue); + flush_workqueue(btp->bt_mount->m_buf_workqueue); /* loop until there is nothing left on the lru list. */ while (list_lru_count(&btp->bt_lru)) { -- 2.5.5 From Sales.44@fashion-business.com Wed Aug 24 07:55:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 754FC7CA0 for ; Wed, 24 Aug 2016 07:55:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC765AC001 for ; Wed, 24 Aug 2016 05:55:49 -0700 (PDT) X-ASG-Debug-ID: 1472043345-0bf57b5312172af0001-NocioJ Received: from fashion-business.com ([14.218.93.112]) by cuda.sgi.com with SMTP id isNbP529Xi0ZHMTv for ; Wed, 24 Aug 2016 05:55:46 -0700 (PDT) X-Barracuda-Envelope-From: Sales.44@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.93.112] X-Barracuda-Apparent-Source-IP: 14.218.93.112 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Wed, 24 Aug 2016 20:45:21 +0800 From: "angelbervogue@sina.com" Subject: FW: Ladies handbags To: xfs@oss.sgi.com X-ASG-Orig-Subj: FW: Ladies handbags MIME-Version: 1.0 Sender: Sales.44@fashion-business.com Reply-To: angelbervogue@sina.com Date: Wed, 24 Aug 2016 20:45:21 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.93.112] X-Barracuda-Start-Time: 1472043345 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5688 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160824125549.043A56430F2@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9y cGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFs OyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1T SVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+SGkmbmJzcDtmcmllbmQs PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcu ODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0Niwy NDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdi KDI0NiwyNDYsMjQ2KSI+RnJvbSANCnRoZSBpbnRlcm5ldCwgSSBrbm93IHlvdSBhcmUgdGhlIGJp ZyBjaGFpbiBzdG9yZXMgZm9yIHRoZSBUb3AgRGVzaWduIGJ1c2luZXNzLiANClRvIGRpc3R1cmIg eW91ciAxMCBtaW51dGVzIHRvIHJlYWQgdGhpcyBtYWlsLCB0aGFua3MmbmJzcDthIGxvdCE8L1NQ QU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2 LDI0NiwyNDYpIj5IZXJlIA0KaXMgQW5nZWxvIHdobyBjb21lcyBmcm9tIEFuZ2VsYmVyIFZvZ3Vl IENvLiwgTHRkOyZuYnNwO291ciBjb21wYW55IGlzIA0KYSZuYnNwO3Byb2Zlc3Npb25hbCBtYW51 ZmFjdHVyZXIgaW4gYmFncyBmaWVsZC4gVGhlIGJyYW5kIG9mIHVzIGlzIEFOR0VMQkVSLCB3ZSAN CmFjY2VwdCB0byB3b3JrIHdpdGggY3VzdG9tZXIgaW4gT0VNICZhbXA7IE9ETSBzdHlsZS48L1NQ QU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7 IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2 LDI0NiwyNDYpIj5PdXIgDQphZHZhbnRhZ2VzOjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1B TElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1v cnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlh bDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPjEuIA0KV2UgYXJlIGJh Z3MgZXhwZXJ0LjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1I RUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNv Tm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdi KDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNo YWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPiZuYnNwOyZuYnNwOyZuYnNwOyANCjE1MCBhcmUgb3Vy IGZlYXR1cmVkIHByb2R1Y3RzLCBhbmQgdGhpcyBxdWFudGl0eSBpcyBhbHdheXMgaW5jcmVhc2Vk LCB0aGUgbWFpbmx5IA0KcHJvZHVjdHMgaW5jbHVkZSBsYWRpZXMgaGFuZGJhZ3MsIG1lbiYjMzk7 cyBicmllZmNhc2UsIHRvdGVzIGJhZywgd2FsbGV0IA0KZXRjLjwvU1BBTj48L1A+DQo8UCBzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9u OiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPjIuIA0K R29vZCBxdWFsaXR5IHdpdGggY29tcGV0aXRpdmUgcHJpY2U8L1NQQU4+PC9QPg0KPFAgc3R5bGU9 IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0OyBtc28tcGFnaW5hdGlvbjog d2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IENPTE9SOiByZ2IoMCwwLDAp OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQt a2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2LDI0NiwyNDYpIj4mbmJzcDsm bmJzcDsmbmJzcDsgDQpXZSBkbyB3aG9sZXNhbGVzIGFuZCBvdXIgb2ZmZXIgaXMgYWx3YXlzIGJl dHRlciB0aGFuIG90aGVycy4gQnVsayBxdWFudGl0eSBjYW4gDQpiZSBncmFudGVkIGEgYmlnZ2Vy IGRpc2NvdW50LiBQcm9kdWN0cyBwYXNzIElTTzkwMDEsIENFLCBGQ0MsIFJvSFMgDQp0ZXN0aW5n OzwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3 Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxT UEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYs MjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJn YigyNDYsMjQ2LDI0NikiPjMuIA0KT0VNIHNlcnZpY2UgYXZhaWxhYmxlLjwvU1BBTj48L1A+DQo8 UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdp bmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZP TlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJn YigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0Niki PiZuYnNwOyZuYnNwOyZuYnNwOyANCldlIHNldCBtaW5pdW0gcXVhbnRpdHkgZm9yIHRoZSBPRU0s IGlmIHlvdXIgcXVhbnRpdHkgbWVldHMgd2l0aCBpdCwgT0VNIGlzIGZyZWUuIA0KRGVsaXZlcnkg ZGF0ZSBmb3Igc2FtcGxlcyBvcmRlciBpcyBpbiAyMCBkYXlzLCBmb3IgbWFzcyBxdWFudGl0eSBv cmRlciBpcyBpbiANCjMwfjQ1IGRheXMuPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdO OiBsZWZ0OyBMSU5FLUhFSUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhh biIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBC QUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpF OiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAu MDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+SWYgDQp5b3UgYXJlIGludGVy ZXN0ZWQgaW4gb3VyIHByb2R1Y3RzLCBwbGVhc2UgY29udGFjdCBtZSBmcmVlbHksIEkgd2lsbCBz ZW5kIHRoZSANCmNhdGFsb2cgdG8geW91LjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElH TjogbGVmdDsgTElORS1IRUlHSFQ6IDE3Ljg1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsg QkFDS0dST1VORDogcmdiKDI0NiwyNDYsMjQ2KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAw LjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPlRoYW5rcyANCmFuZCBiZXN0 IHJlZ2FyZHMhPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBMSU5FLUhF SUdIVDogMTcuODVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29O b3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2Io MjQ2LDI0NiwyNDYpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+QW5nZWxvIA0KSHVhbmc8L1NQQU4+PC9QPg0KPFAgc3R5 bGU9IlRFWFQtQUxJR046IGxlZnQ7IExJTkUtSEVJR0hUOiAxNy44NXB0OyBtc28tcGFnaW5hdGlv bjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZv bnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjQ2LDI0NiwyNDYpIj5Ta3lw ZTogDQpkYXZpZTE4MTgxODwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From bfoster@redhat.com Wed Aug 24 13:02:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 06E607CA0 for ; Wed, 24 Aug 2016 13:02:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA54C304048 for ; Wed, 24 Aug 2016 11:01:58 -0700 (PDT) X-ASG-Debug-ID: 1472061717-0bf57b531417d210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HrnCJOsQtmRu8wR7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 11:01:57 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0B9414E4D1; Wed, 24 Aug 2016 18:01:57 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-33.bos.redhat.com [10.18.41.33]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7OI1uNf004680; Wed, 24 Aug 2016 14:01:56 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 57A22121479; Wed, 24 Aug 2016 14:01:55 -0400 (EDT) Date: Wed, 24 Aug 2016 14:01:55 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: Dave Chinner , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't perform lookups on zero-height btrees Message-ID: <20160824180154.GA8982@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't perform lookups on zero-height btrees References: <20160819203022.GD8268@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160819203022.GD8268@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 24 Aug 2016 18:01:57 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472061717 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1049 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 19, 2016 at 01:30:22PM -0700, Darrick J. Wong wrote: > If the caller passes in a cursor to a zero-height btree (which is > impossible), we never set block to anything but NULL, which causes the > later dereference of it to crash. Instead, just return -EFSCORRUPTED. > > Signed-off-by: Darrick J. Wong > --- Did something actually cause this to happen? Brian > fs/xfs/libxfs/xfs_btree.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > index 64fd847..4bffea4 100644 > --- a/fs/xfs/libxfs/xfs_btree.c > +++ b/fs/xfs/libxfs/xfs_btree.c > @@ -1814,6 +1814,10 @@ xfs_btree_lookup( > > XFS_BTREE_STATS_INC(cur, lookup); > > + /* No such thing as a zero-level tree. */ > + if (cur->bc_nlevels == 0) > + return -EFSCORRUPTED; > + > block = NULL; > keyno = 0; > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Aug 24 13:07:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 45F8A7CA0 for ; Wed, 24 Aug 2016 13:07:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 167F28F8035 for ; Wed, 24 Aug 2016 11:07:42 -0700 (PDT) X-ASG-Debug-ID: 1472062060-0bf57c55b415cdd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xg1wTHg4epGakkYi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 11:07:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4C231C04D2B5; Wed, 24 Aug 2016 18:07:40 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-33.bos.redhat.com [10.18.41.33]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7OI7dEb032161; Wed, 24 Aug 2016 14:07:40 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7D015121479; Wed, 24 Aug 2016 14:07:38 -0400 (EDT) Date: Wed, 24 Aug 2016 14:07:38 -0400 From: Brian Foster To: Dave Chinner Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix superblock inprogress check Message-ID: <20160824180738.GB8982@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix superblock inprogress check References: <1471844367-9679-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471844367-9679-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 24 Aug 2016 18:07:40 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472062060 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1447 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 22, 2016 at 03:39:27PM +1000, Dave Chinner wrote: > From: Dave Chinner > > From inspection, the superblock sb_inprogress check is done in the > verifier and triggered only for the primary superblock via a > "bp->b_bn == XFS_SB_DADDR" check. > > Unfortunately, the primary superblock is an uncached buffer, and > hence it is configured by xfs_buf_read_uncached() with: > > bp->b_bn = XFS_BUF_DADDR_NULL; /* always null for uncached buffers */ > > And so this check never triggers. Fix it. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/libxfs/xfs_sb.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 0e3d4f5..4aecc5f 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -583,7 +583,8 @@ xfs_sb_verify( > * Only check the in progress field for the primary superblock as > * mkfs.xfs doesn't clear it from secondary superblocks. > */ > - return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR, > + return xfs_mount_validate_sb(mp, &sb, > + bp->b_maps[0].bm_bn == XFS_SB_DADDR, > check_version); > } > > -- > 2.8.0.rc3 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Wed Aug 24 15:39:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4A8C27CA0 for ; Wed, 24 Aug 2016 15:39:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18722304032 for ; Wed, 24 Aug 2016 13:39:41 -0700 (PDT) X-ASG-Debug-ID: 1472071177-0bf57b5313182fa0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id RJKTRwbVLlvEeaZu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 13:39:38 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7OKdZPI017296 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 24 Aug 2016 20:39:36 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7OKdZ22014655 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 20:39:35 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7OKdYFl014707; Wed, 24 Aug 2016 20:39:35 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 24 Aug 2016 13:39:34 -0700 Date: Wed, 24 Aug 2016 13:39:33 -0700 From: "Darrick J. Wong" To: Brian Foster Cc: Dave Chinner , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't perform lookups on zero-height btrees Message-ID: <20160824203933.GA20705@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't perform lookups on zero-height btrees References: <20160819203022.GD8268@birch.djwong.org> <20160824180154.GA8982@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160824180154.GA8982@bfoster.bfoster> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472071178 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1562 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32294 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Wed, Aug 24, 2016 at 02:01:55PM -0400, Brian Foster wrote: > On Fri, Aug 19, 2016 at 01:30:22PM -0700, Darrick J. Wong wrote: > > If the caller passes in a cursor to a zero-height btree (which is > > impossible), we never set block to anything but NULL, which causes the > > later dereference of it to crash. Instead, just return -EFSCORRUPTED. > > > > Signed-off-by: Darrick J. Wong > > --- > > Did something actually cause this to happen? Well, if you took a reflink xfs that was formatted before we added the rmap/refcount btree block counters to the AGF and then tried to mount it after will blow up like this, because the refcount_level field got moved to somewhere that's zero in the old image. Anyone being malicious with xfs_db can also do this to any other _level field. (Yay automounting!) --D > > Brian > > > fs/xfs/libxfs/xfs_btree.c | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c > > index 64fd847..4bffea4 100644 > > --- a/fs/xfs/libxfs/xfs_btree.c > > +++ b/fs/xfs/libxfs/xfs_btree.c > > @@ -1814,6 +1814,10 @@ xfs_btree_lookup( > > > > XFS_BTREE_STATS_INC(cur, lookup); > > > > + /* No such thing as a zero-level tree. */ > > + if (cur->bc_nlevels == 0) > > + return -EFSCORRUPTED; > > + > > block = NULL; > > keyno = 0; > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From felix.janda@posteo.de Wed Aug 24 15:49:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 82D3A7CA0 for ; Wed, 24 Aug 2016 15:49:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44E1F8F8035 for ; Wed, 24 Aug 2016 13:49:44 -0700 (PDT) X-ASG-Debug-ID: 1472071779-0bf57c55b4162620001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id tozR46kGDenJogY1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 13:49:41 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 021C8208F7 for ; Wed, 24 Aug 2016 22:49:38 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sKKDd2yMMz104v; Wed, 24 Aug 2016 22:49:34 +0200 (CEST) Date: Wed, 24 Aug 2016 22:47:46 +0200 From: Felix Janda To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t Message-ID: <20160824204746.GA25162@nyan> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t References: <20160824011911.GA19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160824011911.GA19025@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1472071780 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3312 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Dave Chinner wrote: > On Sat, Aug 13, 2016 at 07:04:18PM +0200, Felix Janda wrote: > > This patch series does several things related to large file support. > > > > Patches 1-3 enable transparent LFS in the build system and make it > > mandatory. > > > > Patches 4-9 and 12 replace *64 function and structure aliases. > > > > Patches 10 and 11 disable fsr on Mac OS X and do cleanup to enable > > Patch 12. Further cleanup of the portability code is possible later. > > > > Patch 13 makes tranparent LFS also mandatory for all users of libxfs. > > > > Patch 14 finally replaces off64_t by off_t. > > > > > > In comparison to v1: > > > > Patches 1, 3 and 14 are identical to previous patches. Patches 4-8 are > > identical to previous patches, except that some of them are merged. > > Patch 9 was previously send separately from the patch series. Patch > > 13 is identical to a previous patch except for the commit message. The > > other patches are new, grown out of review by Christoph Hellwig. > > > > Felix Janda (14): > > configure: use AC_SYS_LARGEFILE > > configure: error out when LFS does not work > > remove unecessary definitions of _FILE_OFFSET_BITS > > replace [fl]stat64 by equivalent [fl]stat > > replace ftruncate64 by equivalent ftruncate > > replace lseek64 by equivalent lseek > > replace pread64/pwrite64 by equivalent pread/pwrite > > replace sendfile64 by equivalent sendfile > > fadvise.c: replace posix_fadvise64 by equivalent posix_fadvise > > Makefile: disable fsr for Mac OS X > > fsr: remove workaround for statvfs on Mac OS X > > replace statvfs64 by equivalent statvfs > > xfs.h: require transparent LFS for all users > > platform: remove use of off64_t > > So, the patches are fine, and everything works. Problem is, it > screws up xfstests because it changes all the error messages > that are output to stderr and captured by the test harness. > There are quite a few tests that this causes failures for, > and because it's stderr, it's not as simple as just adding a new > filter to do 'sed -e "s/^\(.*\)64\(: .*$\)/\1\2/"' on stderr. Thanks for testing! I can rework the patches to leave stderr unchanged. I guess that this is preferable as opposed to updating the output expected by xfstests since xfstests should be usable with both old and new xfsprogs. > Further, errors returned change, which further screws up xfstests. > e.g. old code gives EFBIG when we try to use offsets beyond the > supported range, this patchset returns EINVAL. That further > complicates any sort of error filtering we'll need to do. I am very surprised that something apart from the error messages has changed. I would be interested to know on what architecture and for which test(s) (where) this happened, if you still remember. > I don't have the time or patience to fix up xfstests for every > change that people want to make and this series is a non-critical > cleanup, so I'm dropping this until the fixups for xfstests are > worked out. I'm not going to get to this for weeks at the current > rate patches are being thrown at me for inclusion, so I'm not > breaking xfstests for everyone while I'm bottlenecked on other, > higher priority changes. That make sense. --Felix From felix.janda@posteo.de Wed Aug 24 16:09:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 34A487CA0 for ; Wed, 24 Aug 2016 16:09:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9F66AAC001 for ; Wed, 24 Aug 2016 14:09:29 -0700 (PDT) X-ASG-Debug-ID: 1472072964-0bf57b5312183db0001-NocioJ Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by cuda.sgi.com with ESMTP id UDCzk1x1OSQCH36A (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 14:09:26 -0700 (PDT) X-Barracuda-Envelope-From: felix.janda@posteo.de X-Barracuda-Effective-Source-IP: mout02.posteo.de[185.67.36.66] X-Barracuda-Apparent-Source-IP: 185.67.36.66 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id 2B235209DD for ; Wed, 24 Aug 2016 23:09:24 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 3sKKgQ5gSBzyvw; Wed, 24 Aug 2016 23:09:21 +0200 (CEST) Date: Wed, 24 Aug 2016 23:07:49 +0200 From: Felix Janda To: "Darrick J. Wong" Cc: Dave Chinner , Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: kill __uint*_t and __int*_t Message-ID: <20160824210749.GB25162@nyan> X-ASG-Orig-Subj: Re: [PATCH] xfs: kill __uint*_t and __int*_t References: <20160807173835.GA20839@nyan> <20160809083332.GA1489@infradead.org> <20160823223500.GZ19025@dastard> <20160823232640.GG8268@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160823232640.GG8268@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-Barracuda-Connect: mout02.posteo.de[185.67.36.66] X-Barracuda-Start-Time: 1472072966 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1408 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32295 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Darrick J. Wong wrote: > On Wed, Aug 24, 2016 at 08:35:00AM +1000, Dave Chinner wrote: > > On Tue, Aug 09, 2016 at 01:33:32AM -0700, Christoph Hellwig wrote: > > > On Sun, Aug 07, 2016 at 07:38:35PM +0200, Felix Janda wrote: > > > > Replace them by the more widely used uint*_t and int*_t. > > > > > > > > Signed-off-by: Felix Janda > > > > --- > > > > This patch is essentially a global > > > > 'sed -i "s/__\(u*\)int\([0-9]*\)_t/\1int\2_t/"'. The only other changes > > > > are whitespace changes and removing the now unecessary type definitions. > > > > > > > > Running 'sed "s/^.//"' on the patch might be useful for checking that > > > > I didn't mess up the indentation. > > > > > > If everyone is fine using (u)int*_t over s*/u* this looks good. I'd > > > have a slight preference for s*/u* as in the rest of the kernel, but > > > either way getting rid of our crazy __ types is a good thing. > > > > Don't really care that much. I'd prefer (marginally) to go with the > > (u)int*_t types as userspace then doesn't need a set of typedefs in > > the platform headers to support the kernel specific types in libxfs > > code.... > > I don't mind moving from __uintXX_t to uintXX_t so long as the changes > land in the kernel and xfsprogs at the same time. When everyone is ok with the changes, I'll prepare patches for both of them. --Felix From sk804@skfirm.com.cn Wed Aug 24 16:53:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING, HTML_FONT_FACE_BAD,HTML_MESSAGE,UNPARSEABLE_RELAY,WEIRD_PORT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 238727CA0 for ; Wed, 24 Aug 2016 16:53:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DFA92AC005 for ; Wed, 24 Aug 2016 14:53:46 -0700 (PDT) X-ASG-Debug-ID: 1472075621-0bf57b53141855c0001-NocioJ Received: from out4447.biz.mail.alibaba.com (out4447.biz.mail.alibaba.com [47.88.44.47]) by cuda.sgi.com with ESMTP id gznfykOpnnulr8OV for ; Wed, 24 Aug 2016 14:53:42 -0700 (PDT) X-Barracuda-Envelope-From: sk804@skfirm.com.cn X-Barracuda-Effective-Source-IP: out4447.biz.mail.alibaba.com[47.88.44.47] X-Barracuda-Apparent-Source-IP: 47.88.44.47 X-Alimail-AntiSpam:AC=CONTINUE;BC=0.2234649|-1;FP=16800030066092337113|797|1|417|0|-1|-1|-1;HT=e02c03303;MF=sk804@skfirm.com.cn;NM=1;PH=DS;RN=1;RT=1;SR=0;TI=SMTPD_----5C7t8PY_1472075614; Received: from WIN-6RJC8I0QBI6(mailfrom:sk804@skfirm.com.cn ip:117.29.165.166) by smtp.aliyun-inc.com(10.147.42.198); Thu, 25 Aug 2016 05:53:34 +0800 Date: Thu, 25 Aug 2016 05:53:30 +0800 (CST) From: Springking Industry Reply-To: Springking Industry To: xfs@oss.sgi.com Message-ID: <201608250553299978590@skfirm.com.cn> Subject: Re: Boiling water faucet & boiling water tank & water filter MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Boiling water faucet & boiling water tank & water filter Content-Type: multipart/related; boundary="----=_Part_53795_6872052.1472075609959" X-Priority: 3 X-Mailer: Foxmail 7, 1, 3, 52[cn] X-Has-Attach: no X-GUID: 2016082505533000175489414 X-Barracuda-Connect: out4447.biz.mail.alibaba.com[47.88.44.47] X-Barracuda-Start-Time: 1472075621 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7621 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.11 X-Barracuda-Spam-Status: No, SCORE=1.11 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, UNPARSEABLE_RELAY, WEIRD_PORT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32297 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 WEIRD_PORT URI: Uses non-standard port number for HTTP 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word This is a multi-part message in MIME format. ------=_Part_53795_6872052.1472075609959 Content-Type: multipart/alternative; boundary="----=_Part_53796_5592781.1472075610000" ------=_Part_53796_5592781.1472075610000 Content-Type: text/plain;charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBNYWRhbSAvU2lyLA0KCQ0KCQlJIGhvcGUgdGhpcyBlbWFpbCBmaW5kcyB5b3Ugd2VsbC4N CgkNCgkJwqANCgkNCgkJVGhpcyBpcyBFbWlseSBmcm9tIFNwcmluZ2tpbmcgSW5kdXN0cnksc3Bl Y2lsaXplZCBpbiBoaWdoIHF1YWxpdHkga2l0Y2hlbiBmYXVjZXQgb3ZlciAxMCB5ZWFycy4NCgkN CgkJwqANCgkNCgkJTm93IHdlIHdvdWxkIGxpa2UgdG8gcmVjb21tZW5kIHlvdSB0aGUgaG90IHNl bGxpbmcgSW5zdGFudCBCb2lsaW5nIFdhdGVyIFRhcCBTSy0yMzEwQUY6DQoJDQoJCTEuSW5zdGFu dGx5IGJvaWxlZCBob3Qgd2F0ZXIgbWF4IDk4IEMgZGVncmVlLg0KCQ0KCQkyLlByZXNzdXJlbGVz cyBzYWZldHkgZGVzaWduLg0KCQ0KCQkzLlRocmVlIHRlbXBlcmF0dXJlIHByb3RlY3Rpb24gZGV2 aWNlLg0KCQ0KCQk0Lkl0IGlzIGFsc28gYSBjb3N0IGVmZmVjdGl2ZSBhbmQgRWNvLWZyaWVuZGx5 IGFsdGVybmF0aXZlIHRvIGF2b2lkIHVzZSBvZiBhIGtldHRsZS4NCgkNCgkJNS5UaGUgZmF1Y2V0 IGFyZSBvZiBzdXBlcmlvciBxdWFsaXR5IGFuZCBzb2xkIGF0IGNvbXBldGl0aXZlIHByaWNlcy7C oA0KCQ0KCQk2LkNFJlJPSFMgYXBwcm92ZWQsIDUgeWVhcnMgd2FycmFudHkgaXMgZ3VhcmFudHnC oA0KCQ0KCQk3LldlIGhhdmUgYmVlbiBlbmpveWluZyBhIHZlcnkgZ29vZCByZXB1dGF0aW9uIGlu IFVLIG1hcmtldC4NCgkNCgkJwqANCgkNCgkJwqBBcyB3ZSBhcmUgbm93IHBsYW5uaW5nIHRvIGV4 dGVuZCBvdXIgbWFya2V0IHRvIHlvdXIgY291bnRyeS4gU28gaWYgeW91IGhhdmUgYW55IHJlcXVp cmVtZW50IHJlZ2FyZGluZyBvdXIgcHJvZHVjdHMscGxlYXNlIGJlIGZyZWUgdG8gY29udGFjdCB1 cyx3ZSBhc3N1cmUgeW91IHdpbGwgcmVjZWl2ZSBvdXIgYmVzdCBhdHRlbnRpb24gdG8geW91ciBp bnF1aXJ5Lg0KCQ0KCQnCoA0KCQ0KCQnCoCDCoFlvdXIgZWFybHkgcmVwbHkgd2lsbCBiZSBoaWdo bHkgYXBwcmVjaWF0ZWQuDQoJCShwaWN0dXJlIGZvciB5b3VyIHJlZmVyZW5jZSk= ------=_Part_53796_5592781.1472075610000 Content-Type: text/html;charset="utf-8" Content-Transfer-Encoding: base64 PEhUTUw+PG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7 Y2hhcnNldD0iVVRGLTgiIiAvPjxCT0RZPjxkaXY+DQoJPGRpdj4NCgkJRGVhciBNYWRhbSAvU2ly LDwvZGl2Pg0KCTxkaXY+DQoJCUkgaG9wZSB0aGlzIGVtYWlsIGZpbmRzIHlvdSB3ZWxsLjwvZGl2 Pg0KCTxkaXY+DQoJCSZuYnNwOzwvZGl2Pg0KCTxkaXY+DQoJCVRoaXMgaXMgRW1pbHkgZnJvbTxz cGFuIHN0eWxlPSJjb2xvcjojMDAwMGZmOyI+PHN0cm9uZz4gU3ByaW5na2luZyBJbmR1c3RyeTwv c3Ryb25nPjwvc3Bhbj4sc3BlY2lsaXplZCBpbiA8c3BhbiBzdHlsZT0iY29sb3I6IzAwMDBmZjsi PjxzdHJvbmc+aGlnaCBxdWFsaXR5IGtpdGNoZW4gZmF1Y2V0PC9zdHJvbmc+IDwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6IzAwNjQwMDsiPjxzdHJvbmc+b3ZlciAxMCB5ZWFycy48L3N0cm9uZz48 L3NwYW4+PC9kaXY+DQoJPGRpdj4NCgkJJm5ic3A7PC9kaXY+DQoJPGRpdj4NCgkJTm93IHdlIHdv dWxkIGxpa2UgdG8gcmVjb21tZW5kIHlvdSB0aGUgaG90IHNlbGxpbmcgPHN0cm9uZz48c3BhbiBz dHlsZT0iY29sb3I6IzAwMDBmZjsiPkluc3RhbnQgQm9pbGluZyBXYXRlciBUYXA8L3NwYW4+PC9z dHJvbmc+IDxzcGFuIHN0eWxlPSJjb2xvcjojMDAwMGZmOyI+U0stMjMxMEFGPC9zcGFuPjo8L2Rp dj4NCgk8ZGl2Pg0KCQk8c3Ryb25nPjEuSW5zdGFudGx5IGJvaWxlZCBob3Qgd2F0ZXIgbWF4IDk4 IEMgZGVncmVlLjwvc3Ryb25nPjwvZGl2Pg0KCTxkaXY+DQoJCTxzdHJvbmc+Mi5QcmVzc3VyZWxl c3Mgc2FmZXR5IGRlc2lnbi48L3N0cm9uZz48L2Rpdj4NCgk8ZGl2Pg0KCQk8c3Ryb25nPjMuVGhy ZWUgdGVtcGVyYXR1cmUgcHJvdGVjdGlvbiBkZXZpY2UuPC9zdHJvbmc+PC9kaXY+DQoJPGRpdj4N CgkJPHN0cm9uZz40Lkl0IGlzIGFsc28gYSBjb3N0IGVmZmVjdGl2ZSBhbmQgRWNvLWZyaWVuZGx5 IGFsdGVybmF0aXZlIHRvIGF2b2lkIHVzZSBvZiBhIGtldHRsZS48L3N0cm9uZz48L2Rpdj4NCgk8 ZGl2Pg0KCQk8c3Ryb25nPjUuVGhlIGZhdWNldCBhcmUgb2Ygc3VwZXJpb3IgcXVhbGl0eSBhbmQg c29sZCBhdCBjb21wZXRpdGl2ZSBwcmljZXMuJm5ic3A7PC9zdHJvbmc+PC9kaXY+DQoJPGRpdj4N CgkJPHN0cm9uZz42LkNFJmFtcDtST0hTIGFwcHJvdmVkLCA1IHllYXJzIHdhcnJhbnR5IGlzIGd1 YXJhbnR5Jm5ic3A7PC9zdHJvbmc+PC9kaXY+DQoJPGRpdj4NCgkJPHN0cm9uZz43LldlIGhhdmUg YmVlbiBlbmpveWluZyBhIHZlcnkgZ29vZCByZXB1dGF0aW9uIGluIFVLIG1hcmtldC48L3N0cm9u Zz48L2Rpdj4NCgk8ZGl2Pg0KCQkmbmJzcDs8L2Rpdj4NCgk8ZGl2Pg0KCQkmbmJzcDtBcyB3ZSBh cmUgbm93IHBsYW5uaW5nIHRvIGV4dGVuZCBvdXIgbWFya2V0IHRvIHlvdXIgY291bnRyeS4gU28g aWYgeW91IGhhdmUgYW55IHJlcXVpcmVtZW50IHJlZ2FyZGluZyBvdXIgcHJvZHVjdHMscGxlYXNl IGJlIGZyZWUgdG8gY29udGFjdCB1cyx3ZSBhc3N1cmUgeW91IHdpbGwgcmVjZWl2ZSBvdXIgYmVz dCBhdHRlbnRpb24gdG8geW91ciBpbnF1aXJ5LjwvZGl2Pg0KCTxkaXY+DQoJCSZuYnNwOzwvZGl2 Pg0KCTxkaXY+DQoJCSZuYnNwOyAmbmJzcDtZb3VyIGVhcmx5IHJlcGx5IHdpbGwgYmUgaGlnaGx5 IGFwcHJlY2lhdGVkLjxiciAvPg0KCQk8c3BhbiBzdHlsZT0iY29sb3I6IzAwMDBmZjsiPihwaWN0 dXJlIGZvciB5b3VyIHJlZmVyZW5jZSk8L3NwYW4+PC9kaXY+DQoJPGltZyBhbHQ9IiIgc3JjPSJj aWQ6MUBlbnRzb2Z0Lm5ldCIgc3R5bGU9IndpZHRoOiAxMDAwcHg7IGhlaWdodDogNjQ4cHg7IiAv PjwvZGl2Pg0KPGRpdj4NCgk8c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHg7Ij48c3BhbiBzdHls ZT0iZm9udC1mYW1pbHk6YXJpYWw7Ij5UaGFua3MgYW5kIGJlc3QgcmVnYXJkcyw8YnIgLz4NCglF bWlseSBMaW48L3NwYW4+PC9zcGFuPjxiciAvPg0KCTxiciAvPg0KCTxiciAvPg0KCTxpbWcgYWx0 PSIiIHNyYz0iY2lkOjJAZW50c29mdC5uZXQiIHN0eWxlPSJ3aWR0aDogMTEwcHg7IGhlaWdodDog MzBweDsiIC8+PGJyIC8+DQoJJm5ic3A7PC9kaXY+DQo8ZGl2Pg0KCTxwIGNsYXNzPSJwMCIgc3R5 bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtZmFtaWx5OiBTaW1zdW47IGZvbnQtc2l6ZTog bWVkaXVtOyBtYXJnaW4tYm90dG9tOiAwcHQ7IG1hcmdpbi10b3A6IDBwdDsiPg0KCQk8c3BhbiBz dHlsZT0iZm9udC1zaXplOiAxMy41cHQ7IGZvbnQtZmFtaWx5OiBBcmlhbDsgY29sb3I6IHJnYigw LCAwLCAyNTUpOyI+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgY29sb3I6IHJnYigwLCAw LCAwKTsiPjxmb250IHN0eWxlPSJmb250LXNpemU6IDE0cHg7Ij48c3BhbiBzdHlsZT0iZm9udC13 ZWlnaHQ6IGJvbGQ7Ij48Zm9udCBmYWNlPSLlrovkvZMiIHNpemU9IjQiPiZuYnNwOzwvZm9udD5T UFJJTkdLSU5HJm5ic3A7SU5EVVNUUlkmbmJzcDtDTy4sTElNSVRFRDwvc3Bhbj4mbmJzcDsmbmJz cDs8L2ZvbnQ+PC9mb250Pjwvc3Bhbj48L3A+DQoJPGRpdiBjbGFzcz0icDAiIHN0eWxlPSJjb2xv cjogcmdiKDAsIDAsIDApOyBmb250LWZhbWlseTogU2ltc3VuOyBmb250LXNpemU6IG1lZGl1bTsg bWFyZ2luLWJvdHRvbTogMHB0OyBtYXJnaW4tdG9wOiAwcHQ7Ij4NCgkJJm5ic3A7PGZvbnQgY29s b3I9IiMwMDAwMDAiPjxmb250IHNpemU9IjIiPjxmb250IGZhY2U9IkFyaWFsIj48c3BhbiBzdHls ZT0iZm9udC1zaXplOiAxMy41cHQ7IGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsiPjxmb250IHN0eWxl PSJmb250LXNpemU6IDEwcHQ7IGNvbG9yOiByZ2IoMCwgMCwgMCk7Ij48Zm9udCBzdHlsZT0iY29s b3I6IHJnYigxMjgsIDEyOCwgMTI4KTsiPlA8L2ZvbnQ+PC9mb250Pjwvc3Bhbj48L2ZvbnQ+PC9m b250PjwvZm9udD48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigxNjksIDE2OSwgMTY5KTsiPjxmb250 IGZhY2U9IkFyaWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMy41cHQ7Ij48Zm9udCBzdHls ZT0iZm9udC1zaXplOiAxMHB0OyBjb2xvcjogcmdiKDAsIDAsIDApOyI+Jm5ic3A7PC9mb250Pjwv c3Bhbj48L2ZvbnQ+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDExcHg7Ij48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBjb2xvcjogcmdiKDEyNywgMTM5 LCAxMzcpOyI+Kzg2IDU5MiA1MjgxMTgwPC9zcGFuPjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6 IHJnYigyMTEsIDIxMSwgMjExKTsiPjxmb250IGZhY2U9IkFyaWFsIj48c3BhbiBzdHlsZT0iZm9u dC1zaXplOiAxMy41cHQ7Ij48Zm9udCBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBjb2xvcjogcmdi KDAsIDAsIDApOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogOXB0OyBmb250LWZhbWlseTogQXJp YWwsIHNhbnMtc2VyaWY7Ij4mbmJzcDt8Jm5ic3A7PC9zcGFuPjwvZm9udD48L3NwYW4+PC9mb250 Pjwvc3Bhbj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+PGZvbnQgc2l6ZT0iMiI+PGZvbnQgZmFjZT0i QXJpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzLjVwdDsgY29sb3I6IHJnYigwLCAwLCAy NTUpOyI+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgY29sb3I6IHJnYigwLCAwLCAwKTsi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDlwdDsgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNl cmlmOyBjb2xvcjogcmdiKDEyNywgMTM5LCAxMzcpOyI+Jm5ic3A7RiAmbmJzcDsrODYgNTkyIDUy ODExODEmbmJzcDsmbmJzcDs8L3NwYW4+PC9mb250Pjwvc3Bhbj48L2ZvbnQ+PC9mb250PjwvZm9u dD48YnIgLz4NCgkJJm5ic3A7PGZvbnQgY29sb3I9IiMwMDAwMDAiPjxmb250IHNpemU9IjIiPjxm b250IGZhY2U9IkFyaWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOiAxMy41cHQ7IGNvbG9yOiBy Z2IoMCwgMCwgMjU1KTsiPjxmb250IHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGNvbG9yOiByZ2Io MCwgMCwgMCk7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiA5cHQ7IGZvbnQtZmFtaWx5OiBBcmlh bCwgc2Fucy1zZXJpZjsgY29sb3I6IGdyYXk7Ij5FJm5ic3A7PC9zcGFuPjwvZm9udD48L3NwYW4+ PC9mb250PjwvZm9udD48L2ZvbnQ+PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMTI4LCAxMjgsIDEy OCk7Ij48Zm9udCBzaXplPSIyIj48Zm9udCBmYWNlPSJBcmlhbCI+PHNwYW4gc3R5bGU9ImZvbnQt c2l6ZTogMTMuNXB0OyI+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgY29sb3I6IHJnYigw LCAwLCAwKTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDlwdDsgZm9udC1mYW1pbHk6IEFyaWFs LCBzYW5zLXNlcmlmOyI+Jm5ic3A7PC9zcGFuPjwvZm9udD48L3NwYW4+PC9mb250PjwvZm9udD48 L3NwYW4+PGZvbnQgc2l6ZT0iMiI+PGZvbnQgZmFjZT0iQXJpYWwiPjxzcGFuIHN0eWxlPSJmb250 LXNpemU6IDEzLjVwdDsiPjxmb250IHN0eWxlPSJmb250LXNpemU6IDEwcHQ7Ij48c3BhbiBzdHls ZT0iZm9udC1zaXplOiA5cHQ7IGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsiPjxhIGhy ZWY9Im1haWx0bzpzazgwMUBza2Zpcm0uY29tIj48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigxMjgs IDEyOCwgMTI4KTsiPnNrMDgwNEBza2Zpcm0uY29tPC9zcGFuPjwvYT48L3NwYW4+PC9mb250Pjwv c3Bhbj48L2ZvbnQ+PC9mb250PjxzcGFuIHN0eWxlPSJjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgp OyI+PGZvbnQgc2l6ZT0iMiI+PGZvbnQgZmFjZT0iQXJpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNp emU6IDEzLjVwdDsiPjxmb250IHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGNvbG9yOiByZ2IoMCwg MCwgMCk7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiA5cHQ7IGZvbnQtZmFtaWx5OiBBcmlhbCwg c2Fucy1zZXJpZjsiPiZuYnNwOyZuYnNwOzwvc3Bhbj48L2ZvbnQ+PC9zcGFuPjxzcGFuIHN0eWxl PSJmb250LXNpemU6IDEzLjVwdDsiPjxmb250IHN0eWxlPSJmb250LXNpemU6IDEwcHQ7IGNvbG9y OiByZ2IoMCwgMCwgMCk7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiA5cHQ7IGZvbnQtZmFtaWx5 OiBBcmlhbCwgc2Fucy1zZXJpZjsiPnwmbmJzcDs8L3NwYW4+PC9mb250Pjwvc3Bhbj48L2ZvbnQ+ PC9mb250Pjwvc3Bhbj48Zm9udCBjb2xvcj0iIzAwMDAwMCI+PGZvbnQgc2l6ZT0iMiI+PGZvbnQg ZmFjZT0iQXJpYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDEzLjVwdDsgY29sb3I6IHJnYigw LCAwLCAyNTUpOyI+PGZvbnQgc3R5bGU9ImZvbnQtc2l6ZTogMTBwdDsgY29sb3I6IHJnYigwLCAw LCAwKTsiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6IDlwdDsgZm9udC1mYW1pbHk6IEFyaWFsLCBz YW5zLXNlcmlmOyBjb2xvcjogcmdiKDEyNywgMTM5LCAxMzcpOyI+VyAmbmJzcDs8L3NwYW4+PHNw YW4gc3R5bGU9ImZvbnQtc2l6ZTogMTFwdDsgZm9udC1mYW1pbHk6IENhbGlicmksIHNhbnMtc2Vy aWY7Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOiA5cHQ7IGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fu cy1zZXJpZjsgY29sb3I6IHJnYigxMjcsIDEzOSwgMTM3KTsiPnd3dy5za2Zpcm0uY29tPC9zcGFu Pjwvc3Bhbj48L2ZvbnQ+PC9zcGFuPjwvZm9udD48L2ZvbnQ+PC9mb250PjwvZGl2Pg0KCTxkaXYg Y2xhc3M9InAwIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IFNpbXN1 bjsgZm9udC1zaXplOiBtZWRpdW07IG1hcmdpbi1ib3R0b206IDBwdDsgbWFyZ2luLXRvcDogMHB0 OyI+DQoJCSZuYnNwOzxmb250IGNvbG9yPSIjMDAwMDAwIj48Zm9udCBzaXplPSIyIj48Zm9udCBm YWNlPSJBcmlhbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTMuNXB0OyBjb2xvcjogcmdiKDAs IDAsIDI1NSk7Ij48Zm9udCBzdHlsZT0iZm9udC1zaXplOiAxMHB0OyBjb2xvcjogcmdiKDAsIDAs IDApOyI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogOXB0OyBmb250LWZhbWlseTogQXJpYWwsIHNh bnMtc2VyaWY7IGNvbG9yOiByZ2IoMTI3LCAxMzksIDEzNyk7Ij48Zm9udCBjb2xvcj0iIzgwODA4 MCIgc2l6ZT0iMiI+U2t5cGU6c3ByaW5na2luZzgwNDwvZm9udD4mbmJzcDt8Jm5ic3A7V2hhdHNh cHAvV2VjaGF0OiZuYnNwOyArODYgMTg5NjAxNjE0MDMmbmJzcDs8L3NwYW4+PC9mb250Pjwvc3Bh bj48L2ZvbnQ+PC9mb250PjwvZm9udD48YnIgLz4NCgkJJm5ic3A7PHNwYW4gc3R5bGU9ImZvbnQt c2l6ZTogOXB0OyBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7IGNvbG9yOiByZ2IoMTI3 LCAxMzksIDEzNyk7Ij5BZGQ6Um02MDEgQmxkZy5BIE5vLjg2IEFubGluZyBSZCAyLCBIdWxpIERp cyAsWGlhbWVuLCBGdWppYW4sQ2hpbmEuIFBDOjM2MTAwOTwvc3Bhbj48L2Rpdj4NCjwvZGl2Pg0K PGltZyBzcmM9IiBodHRwOi8vc2tmaXJtLmltd29yay5uZXQ6ODEvZW50c29mdC9FdEFjdGlvbi5l bnRjcm0/bWV0aG9kPXRlJm1haWxJRD0xODc1OTImY190YXNrTnVtPTIwMTYwODI0MTUwMzEzJmd1 aWQ9MjAxNjA4MjUwNTUzMjk5OTc5MDU0MzAzMSIgaGVpZ2h0PTAgd2lkdGg9MD48L0JPRFk+PC9I VE1MPg== ------=_Part_53796_5592781.1472075610000-- ------=_Part_53795_6872052.1472075609959 Content-Type: image/jpeg;name="1472022324817.jpg.jpeg" Content-Transfer-Encoding: base64 Content-ID: <1@entsoft.net> /9j/4R8KRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAA agEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodpAAQAAAABAAAApAAAANAADqZ4 AAAnEAAOpngAACcQQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzADIwMTU6MDE6MjEgMTg6MTY6 MDgAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAEsKADAAQAAAABAAADCgAAAAAAAAAGAQMAAwAA AAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIA BAAAAAEAAB3UAAAAAAAAAEgAAAABAAAASAAAAAH/2P/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5v AhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAA AAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAA FHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALE AAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gA AAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJp Z2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElF QzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAA AAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZ WiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAA AAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVu Y2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNl IFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABX H+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8 AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0B EwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZ AeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC 6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7 BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF 5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfS B+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEK Jwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzA DNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MP zw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW +hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsU GzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qf vx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSr JNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIq NSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+ MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2 cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0i PWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdE ikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwq THJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJU j1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0n XXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1m kmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XAr cIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6 pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VH hauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJ nPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSp N6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYB tnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD 1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+ 0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M 8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23/ ///tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8V GBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4O DhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgA 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 Q3B0bmJvb2wAAAAAAENsYnJib29sAAAAAABSZ3NNYm9vbAAAAAAAQ3JuQ2Jvb2wAAAAAAENudENi b29sAAAAAABMYmxzYm9vbAAAAAAATmd0dmJvb2wAAAAAAEVtbERib29sAAAAAABJbnRyYm9vbAAA AAAAQmNrZ09iamMAAAABAAAAAAAAUkdCQwAAAAMAAAAAUmQgIGRvdWJAb+AAAAAAAAAAAABHcm4g ZG91YkBv4AAAAAAAAAAAAEJsICBkb3ViQG/gAAAAAAAAAAAAQnJkVFVudEYjUmx0AAAAAAAAAAAA AAAAQmxkIFVudEYjUmx0AAAAAAAAAAAAAAAAUnNsdFVudEYjUHhsQFgAxIAAAAAAAAAKdmVjdG9y RGF0YWJvb2wBAAAAAFBnUHNlbnVtAAAAAFBnUHMAAAAAUGdQQwAAAABMZWZ0VW50RiNSbHQAAAAA AAAAAAAAAABUb3AgVW50RiNSbHQAAAAAAAAAAAAAAABTY2wgVW50RiNQcmNAWQAAAAAAADhCSU0D 7QAAAAAAEABgAxIAAQACAGADEgABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAA AAAABAAAAKs4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAA CgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAA AAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////// //////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAA AAACAAQ4QklNBAIAAAAAAA4AAAAAAAAAAAAAAAAAADhCSU0EMAAAAAAABwEBAQEBAQEAOEJJTQQt AAAAAAAGAAEAAAAGOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4 QklNBBoAAAAAA0EAAAAGAAAAAAAAAAAAAAMKAAAEsAAAAAYAdABhAG4Aa04AWVcAAAABAAAAAAAA AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAABLAAAAMKAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA AAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEA AAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAMKAAAAAFJn aHRsb25nAAAEsAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3Ns aWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VP cmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAA AAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxv bmcAAAAAAAAAAEJ0b21sb25nAAADCgAAAABSZ2h0bG9uZwAABLAAAAADdXJsVEVYVAAAAAEAAAAA AABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAA DmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVu dW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xp Y2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xv clR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAA AAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAA AAwAAAACP/AAAAAAAAA4QklNBBQAAAAAAAQAAAAHOEJJTQQMAAAAAB3wAAAAAQAAAKAAAABoAAAB 4AAAwwAAAB3UABgAAf/Y/+IMWElDQ19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVog B84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAAAAPbWAAEAAAAA0y1I UCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAA AVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZ WgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1kZAAAAsQAAACIdnVlZAAAA0wAAACG dmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAkdGVjaAAABDAAAAAMclRSQwAABDwA AAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABDb3B5cmlnaHQgKGMpIDE5OTggSGV3 bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAA AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbMWFlaIAAAAAAAAAAAAAAAAAAAAABY WVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAA ts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAABZJRUMgaHR0cDov L3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdC AAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJHQiBjb2xvdXIgc3BhY2UgLSBzUkdC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRp dGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRp b24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB2aWV3AAAAAAATpP4A FF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYAUAAAAFcf521lYXMAAAAAAAAAAQAA AAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1cnYAAAAAAAAEAAAAAAUACgAPABQA GQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0AcgB3AHwAgQCGAIsAkACVAJoAnwCk AKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEBAQcBDQETARkBHwElASsBMgE4AT4B RQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEByQHRAdkB4QHpAfIB+gIDAgwCFAId AiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLLAtUC4ALrAvUDAAMLAxYDIQMtAzgD QwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBMEIAQtBDsESARVBGMEcQR+BIwEmgSo BLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1BcUF1QXlBfYGBgYWBicGNwZIBlkG agZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kHrAe/B9IH5Qf4CAsIHwgyCEYIWghu CIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnlCfsKEQonCj0KVApqCoEKmAquCsUK 3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUMjgynDMAM2QzzDQ0NJg1ADVoNdA2O DakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96D5YPsw/PD+wQCRAmEEMQYRB+EJsQ uRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS4xMDEyMTQxNjE4MTpBPFE+UUBhQn FEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaPFrIW1hb6Fx0XQRdlF4kXrhfSF/cY GxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4axRrsGxQbOxtjG4obshvaHAIcKhxS HHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+H2kflB+/H+ogFSBBIGwgmCDEIPAh HCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8kTSR8JKsk2iUJJTglaCWXJccl9yYn Jlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymdKdAqAio1KmgqmyrPKwIrNitpK50r 0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ovkS/HL/4wNTBsMKQw2zESMUoxgjG6 MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXCNf02NzZyNq426TckN2A3nDfXOBQ4 UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8pDzjPSI9YT2hPeA+ID5gPqA+4D8h P2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPARANER0SKRM5FEkVVRZpF3kYiRmdG q0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NLmkviTCpMcky6TQJNSk2TTdxOJU5u TrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1OqU/ZUQlSPVNtVKFV1VcJWD1ZcVqlW 91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVchlzWXSddeF3JXhpebF69Xw9fYV+z YAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWSZedmPWaSZuhnPWeTZ+loP2iWaOxp Q2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5veG/RcCtwhnDgcTpxlXHwcktypnMB c11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJeed6RnqlewR7Y3vCfCF8gXzhfUF9 oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2EgITjhUeFq4YOhnKG14c7h5+IBIhp iM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+ekAaQbpDWkT+RqJIRknqS45NNk7aU IJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kbr5wcnImc951kndKeQJ6unx2fi5/6 oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfgqFKoxKk3qamqHKqPqwKrdavprFys 0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1E7WKtgG2ebbwt2i34LhZuNG5SrnC uju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48JfwtvDWMPUxFHEzsVLxcjGRsbDx0HH v8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQutE80b7SP9LB00TTxtRJ1MvVTtXR 1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p36/gNuC94UThzOJT4tvjY+Pr5HPk /OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7ijutO9A78zwWPDl8XLx//KM8xnzp/Q0 9ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L/tz/bf///+0ADEFkb2JlX0NNAAH/ 7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBER DAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCABoAKADASIAAhEBAxEB/90A BAAK/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAID BAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0 coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl 9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSIT BTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj 80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwDypKUi 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 INhmBAGgAH8lrfa1TOeX2X/F3lDI+o+JXMuxbrqXT/W+0N/6F62nBeVfUv68V/V7FyMDLx334t1g vY6pwa9j9vp2e1422NsY2v8APZs9NdN/46X1dI1pzQfD06T+PrhNISHr2t1XE/4277KsLo9bCW7r cmyRoQWNxmN/6tyWR/jX6Wxv6pg5FzvC17Kh/wCBDIXG/Wf615/1kvpfksZRTjNc2iiuYG87rLHO eXOfbZtr3/8AFsSAKi17usG/ppwrWyRtc0gAQ8Oc51kz+e223d7VQx/5+v8Art/KoKeP/P1/12/l TkP/1fKktUkklK1TyUySStV5KUlMkknVUlLVJJJGqtUtUkklK1SSSSUpJJJJSkkkklKSSSSUpTx/ 5+v+u38qgkkp/9k4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMA aABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADUAAAABADhCSU0P oAAAAAABDG1hbmlJUkZSAAABADhCSU1BbkRzAAAA4AAAABAAAAABAAAAAAAAbnVsbAAAAAMAAAAA QUZTdGxvbmcAAAAAAAAAAEZySW5WbExzAAAAAU9iamMAAAABAAAAAAAAbnVsbAAAAAIAAAAARnJJ RGxvbmdcUsA2AAAAAEZyR0Fkb3ViQGVgAAAAAAAAAAAARlN0c1ZsTHMAAAABT2JqYwAAAAEAAAAA AABudWxsAAAABAAAAABGc0lEbG9uZwAAAAAAAAAAQUZybWxvbmcAAAAAAAAAAEZzRnJWbExzAAAA AWxvbmdcUsA2AAAAAExDbnRsb25nAAAAAAAAOEJJTVJvbGwAAAAIAAAAAAAAAAA4QklND6EAAAAA ABxtZnJpAAAAAgAAABAAAAABAAAAAAAAAAEAAAAAOEJJTQQGAAAAAAAHAAgAAAABAQD/4RE0aHR0 cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBN cENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEv IiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTIt MTc6MzI6MDAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcv MTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIi IHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6cGhvdG9zaG9w PSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1 cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29t L3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NU eXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAv MS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3Ag Q1M1IFdpbmRvd3MiIHhtcDpDcmVhdGVEYXRlPSIyMDE1LTAxLTIxVDE4OjE1OjU5KzA4OjAwIiB4 bXA6TWV0YWRhdGFEYXRlPSIyMDE1LTAxLTIxVDE4OjE2OjA4KzA4OjAwIiB4bXA6TW9kaWZ5RGF0 ZT0iMjAxNS0wMS0yMVQxODoxNjowOCswODowMCIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhv dG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiBkYzpmb3JtYXQ9ImltYWdlL2pw ZWciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QTkzODk5RTQzREExRTQxMUE1MzZCM0UwOEEw NzA1OTgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QTczODk5RTQzREExRTQxMUE1MzZCM0Uw OEEwNzA1OTgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpBNzM4OTlFNDNEQTFF NDExQTUzNkIzRTA4QTA3MDU5OCI+IDxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDxyZGY6 QmFnPiA8cmRmOmxpPjkwNDQzMjhFRDI4RDlFRUExQUFGQzhFODUzRUZFNUIwPC9yZGY6bGk+IDxy ZGY6bGk+QjAzQzNBMkU5QzkzNzRFNEY5RDk3QTYxMEU1RjdFODI8L3JkZjpsaT4gPC9yZGY6QmFn PiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2Vx PiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlp ZDpBNzM4OTlFNDNEQTFFNDExQTUzNkIzRTA4QTA3MDU5OCIgc3RFdnQ6d2hlbj0iMjAxNS0wMS0y MVQxODoxNTo1OSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENT NSBXaW5kb3dzIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJ RD0ieG1wLmlpZDpBODM4OTlFNDNEQTFFNDExQTUzNkIzRTA4QTA3MDU5OCIgc3RFdnQ6d2hlbj0i MjAxNS0wMS0yMVQxODoxNjowOCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhv dG9zaG9wIENTNSBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0 aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFk b2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJp dmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRv YmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVk IiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkE5Mzg5OUU0M0RBMUU0MTFBNTM2QjNFMDhBMDcw NTk4IiBzdEV2dDp3aGVuPSIyMDE1LTAxLTIxVDE4OjE2OjA4KzA4OjAwIiBzdEV2dDpzb2Z0d2Fy ZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4g PC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0 YW5jZUlEPSJ4bXAuaWlkOkE4Mzg5OUU0M0RBMUU0MTFBNTM2QjNFMDhBMDcwNTk4IiBzdFJlZjpk b2N1bWVudElEPSJ4bXAuZGlkOkE3Mzg5OUU0M0RBMUU0MTFBNTM2QjNFMDhBMDcwNTk4IiBzdFJl ZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6QTczODk5RTQzREExRTQxMUE1MzZCM0UwOEEw NzA1OTgiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0 IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIA CQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAA M2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIs AAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcA AAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdU UkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQt UGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAA AAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVz YwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cu aWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MA AAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAA AAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAA AAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24g aW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGlu IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQ zxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAj ACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4A sgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFS AVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8C OAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNa A2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE 0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaM Bp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYI qgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsL CyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1 ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoU ixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhl GIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMc zBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1 IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocm tyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioy YzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjI OQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/ 4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1 R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBP SU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdg qmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnx akhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0 FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJ mYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0 lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNih R6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24 ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7 LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8 yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN 5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD1 3vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkQAAAAAH/2wCE AAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgMD AwMDAwMDAwMBAQEBAQEBAQEBAQICAQICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDA//AABEIAwoEsAMBEQACEQEDEQH/3QAEAJb/xAGiAAAABgIDAQAAAAAA AAAAAAAHCAYFBAkDCgIBAAsBAAAGAwEBAQAAAAAAAAAAAAYFBAMHAggBCQAKCxAAAgEDBAEDAwID AwMCBgl1AQIDBBEFEgYhBxMiAAgxFEEyIxUJUUIWYSQzF1JxgRhikSVDobHwJjRyChnB0TUn4VM2 gvGSokRUc0VGN0djKFVWVxqywtLi8mSDdJOEZaOzw9PjKThm83UqOTpISUpYWVpnaGlqdnd4eXqF hoeIiYqUlZaXmJmapKWmp6ipqrS1tre4ubrExcbHyMnK1NXW19jZ2uTl5ufo6er09fb3+Pn6EQAC AQMCBAQDBQQEBAYGBW0BAgMRBCESBTEGACITQVEHMmEUcQhCgSORFVKhYhYzCbEkwdFDcvAX4YI0 JZJTGGNE8aKyJjUZVDZFZCcKc4OTRnTC0uLyVWV1VjeEhaOzw9Pj8ykalKS0xNTk9JWltcXV5fUo R1dmOHaGlqa2xtbm9md3h5ent8fX5/dIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqq usra6vr/2gAMAwEAAhEDEQA/ANCLMZjLjL5QDK5KwyNcBevqj9KmX8mW59+6903fxnMf87XJf+d1 V/199+6917+M5j/na5L/AM7qr/r77917r38ZzH/O1yX/AJ3VX/X337r3Xv4zmP8Ana5L/wA7qr/r 77917r38ZzH/ADtcl/53VX/X337r3Xv4zmP+drkv/O6q/wCvvv3XuvfxnMf87XJf+d1V/wBfffuv de/jOY/52uS/87qr/r77917r38ZzH/O1yX/ndVf9fffuvde/jOY/52uS/wDO6q/6++/de69/Gcx/ ztcl/wCd1V/199+6917+M5j/AJ2uS/8AO6q/6++/de69/Gcx/wA7XJf+d1V/199+6917+M5j/na5 L/zuqv8Ar77917r38ZzH/O1yX/ndVf8AX337r3Xv4zmP+drkv/O6q/6++/de69/Gcx/ztcl/53VX /X337r3Xv4zmP+drkv8Azuqv+vvv3XuvfxnMf87XJf8AndVf9fffuvde/jOY/wCdrkv/ADuqv+vv v3XuvfxnMf8AO1yX/ndVf9fffuvde/jOY/52uS/87qr/AK++/de67GXzLGwyuSP/AFXVX/X337r3 SioJM48KzHJZNtQuB99VekE8H/O/U8+/de6VGPGZmYlsvkUjRfJJI1fU6Y0Uc6h5eP8AAfU+/de6 Zsvu/IgtSY/J5JYU9LP99U3kYceSQiX1v/QfpX/H37r3Qm7B6t3Tuqjgzeazuax2Nq/XRU1LPVTZ XIRgkedVaQR09MxBAke9/wAe/de6GZeo8bjIdcuP3VXafrNW5yukViOTrjpZIgo/w9+690mK2Hb2 GbR/DIEkViQKqpy1Q3BsQxmrtLL/AIEH37r3WfGVtJk5hFSw41H4VIVge0shPpRQZTcm/v3XumXO QUnnlpslTy08quwaXFZCsoZ4yOOEM8kD2/A0j37r3QcZjb2apaabIYrPZOvobEtG1ZVJW0kC/Uyx +XSyj/VKbH+nv3Xugkqs1lvIyrlMmAPwa6qB4/qPL7917qN/Gcx/ztcl/wCd1V/199+6917+M5j/ AJ2uS/8AO6q/6++/de69/Gcx/wA7XJf+d1V/199+6917+M5j/na5L/zuqv8Ar77917r38ZzH/O1y X/ndVf8AX337r3Xv4zmP+drkv/O6q/6++/de69/Gcx/ztcl/53VX/X337r3Xv4zmP+drkv8Azuqv +vvv3XuvfxnMf87XJf8AndVf9fffuvde/jOY/wCdrkv/ADuqv+vvv3XuvfxnMf8AO1yX/ndVf9ff fuvde/jOY/52uS/87qr/AK++/de69/Gcx/ztcl/53VX/AF99+6917+M5j/na5L/zuqv+vvv3Xuvf xnMf87XJf+d1V/199+6917+M5j/na5L/AM7qr/r77917r38ZzH/O1yX/AJ3VX/X337r3Xv4zmP8A na5L/wA7qr/r77917r38ZzH/ADtcl/53VX/X337r3Xv4zmP+drkv/O6q/wCvvv3XuvfxnMf87XJf +d1V/wBfffuvde/jOY/52uS/87qr/r77917r38ZzH/O1yX/ndVf9fffuvde/jOY/52uS/wDO6q/6 ++/de69/Gcx/ztcl/wCd1V/199+6917+M5j/AJ2uS/8AO6q/6++/de69/Gcx/wA7XJf+d1V/199+ 6917+M5j/na5L/zuqv8Ar77917r38ZzH/O1yX/ndVf8AX337r3Xv4zmP+drkv/O6q/6++/de69/G cx/ztcl/53VX/X337r3Xv4zmP+drkv8Azuqv+vvv3XuvfxnMf87XJf8AndVf9fffuvde/jOY/wCd rkv/ADuqv+vvv3XuvfxnMf8AO1yX/ndVf9fffuvde/jOY/52uS/87qr/AK++/de69/Gcx/ztcl/5 3VX/AF99+6917+M5j/na5L/zuqv+vvv3XuvfxnMf87XJf+d1V/199+6917+M5j/na5L/AM7qr/r7 7917r38ZzH/O1yX/AJ3VX/X337r3Xv4zmP8Ana5L/wA7qr/r77917r38ZzH/ADtcl/53VX/X337r 3Xv4zmP+drkv/O6q/wCvvv3XuvfxnMf87XJf+d1V/wBfffuvde/jOY/52uS/87qr/r77917r38Zz H/O1yX/ndVf9fffuvde/jOY/52uS/wDO6q/6++/de69/Gcx/ztcl/wCd1V/199+6917+M5j/AJ2u S/8AO6q/6++/de69/Gcx/wA7XJf+d1V/199+6917+M5j/na5L/zuqv8Ar77917r38ZzH/O1yX/nd Vf8AX337r3Xv4zmP+drkv/O6q/6++/de69/Gcx/ztcl/53VX/X337r3Xv4zmP+drkv8Azuqv+vvv 3XuvfxnMf87XJf8AndVf9fffuvde/jOY/wCdrkv/ADuqv+vvv3XuvfxnMf8AO1yX/ndVf9fffuvd cXy2VkR45MnkJI5FZHR6ypZHRgVZHVpCrKymxB4I9+6903+/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6P8A/wAp3/t6b/LT/wDF/wD4 b/8AwRXXPv3Xuv/Q0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917qVEWBJIRQPoWUN/sPz+PfuvdPWPnqamohpKalpmeWRUDCkSSU349Isbk3/p7917oSqsTQ VNJhlKT1ZEf3UcSoviqJAqpSjQAP2Ih6j9Ln37r3TRnYMxkahcDtrHZHIJFJpqqjH0dTOtbXW0mO Boo2DQQklVIuGNze3v3Xuhb2D0QlA9PmN/xyS1AZJqXaVDIrTSOPUv8AG6waoqSG/wCqJC0h+hI9 +690Y7NbkqcfRw0tFT00czqt44po6KmpoYltFSwkMZpgqixuVH9PfuvdJnb+4snVZR6OuqKRKWtS VJ4Ia6eSdSELJUUvDASRW5F7W9+690hd64P7pVqK7NB6NmKxVlDjpaiQjUbRTEvHGkyjg34Pv3Xu oWB/g224panBUddlc9DEI6CpyMqSmOsnvGZabG0yeMSIrcamex59+690xZuKnxU3m3VlAMhMBPJi aRlqsrI8nqtOb+Ci1Fvq5JH4X37r3SJrtzF6lGpkWhgjNqejRzKbGwMlU7/592B54C/gD37r3SH3 RgYaqnfN42PQ4OrI06W0am5+4hUAaUJ+o/Hv3Xug39+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+690f/8AlO/9vTf5af8A4v8A/Df/AOCK659+691//9HQRzP/ABeMr/2sq7/3Kl9+6902+/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917rwFzb37r3Qh7X633VumMVVHRrR4pSFfL5NxRUAP00xSS ANVSG3CxhiffuvdDxgtgbQ2IkVRlKmu3Hna0pFR0tAj0gkkbhqejpwsldKGY2aS6X+g9+690LWK2 tU0CrM2P27sYVpXxU8VBHm92z+U8KTUtKlJNLfnW11H1Hv3XuhNxOFo8ZEwFTlKmV1KPW19VHHIq D9cNJDSRwxwQEjnQOTxcj37r3TrHiccqkx08Gl/1NKsjM4vz6g4bk/j37r3SB3oMNR04ijgjjzDl QBDKyR08R58lSHZypYfQcH37r3Qf0E9NiBLlK6t+4q2heKhpAwEUQluj1E78uRpJCoACfrx7917r FJk1eOKsMcbU1SXSoodJ+zrAgAFlN2WS3IN739+690nsvJFtGhkqcQxb+8ELz0csh11FC0Z/dpQS Lkxt+luLj37r3Rbqqvd6qerrXeWZ5Hc+U6nklJPLsTcj+vv3XumryvPIzh21t6v96sL/AEsPfuvd K/blaVq4aOps0VTellU2Ksk3o/SfrYm/Pv3Xug7z+ObE5jIY9v8AlGqZEH/BSdSf7dSPfuvdM/v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917o//wDKd/7em/y0/wDxf/4b/wDwRXXPv3Xuv//S0Ecz /wAXjK/9rKu/9ypffuvdNvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XuuccbyukcaM8kjKiIgLM7MbKq gckkn37r3RnNndYYva0FPmd6U0eTzssKVVBtdmvTUKOoeKpzbRm7PYgiAEf7UffuvdL2TN1VVDU5 esbVS41WgoaaJFipo5QFtBR0kQWJBGzrGoA5dvrx7917oUNr7aqMDCmSqIkn3vmYFlra2dQ6bcoZ lDQ42h1XSCVYiPIw9Rbj37r3S7xmIp6ST7uVvu686j91UNcqzcvIhkJChF+p+ov7917rO9ZS65ZK YGrYMQ9Q4IgVl+iRlibqlvrwvv3Xum+n3DHVZKLH0zmSWRzHNMpBWOw+q/gkEcfge/de6ATcsFQ2 ZyLtLUsi1coAVHKkoxBd5nBjJAHv3Xuk2y0cjMlS0zSBQyaJWY3HIDSWC2P+Fz7917qWJaqtbH0N NEzFWAggiBJLsLDg/j8k/ge/de6RvY24IlqcXgaOojqTgo5vvZ4nDxff1T654I3B0uKcHSSPzce/ de6B/KU7uTXRqJImt5AB/m2I5vb6Kb+/de6aoRqIKXJFjo03Nhfn63I9+690usFTwTVFFUzTLEkF RE87fnxqwdrKBe/H9PfuvdIfeGTTL7lzFfEoSGeskMSg3tFH+3Hz/Uqvv3Xuk17917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de6P/wDynf8At6b/AC0//F//AIb/APwRXXPv3Xuv/9PQRzP/ABeMr/2s q7/3Kl9+6902+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6HXp/B0dL97vnK061MeJkSjwFI4BWqzcql hUMhB1xUEfq/prI9+690ts3m652maSbTU1JLzsVvJd/VbVyzM35/1/fuvdCd15ikymO22akCRPvq Sp8cgV2qpIK+rkqxoYEOYX8Zb/AD37r3QzLVyVNRUyxJ5JJap401H9fjJux/CJwOT+B7917qNP5J HWkaa5ANRWyu+kMrG5mmcALS0YAtFGPVIBe359+690nctnTNC9FjQlPj4hokqZbRGW3Nkj/UqNzY ck/U8+/de6w7cSjppZMpLKsdPjIpK6oKhwnoRmRXkYANJK30Aufp7917oGqvfiU9dVyxVWVlgmnm leiamppqBxKxLiSCpqLWsbXBBt7917piqewdmqWb+AZcyk3K0VRSQU1+LqizPPIiE/0Jt7917pOZ js+rqaeahwONh25TTxmCaqSZ6vL1ETCzI1awRaYMvB8Sqf8AH37r3QWtG4ux1MCTzfUxJ5LH8n1f X37r3UqmmmhYLYujDSysNSst7EEe/de6zz4Q1cctViwY5ow0klIQblV5LQt/t+OffuvdJylrJopX iYlfKGjIN7hrn8H83Hv3Xuk9LfySX+utr/69zf37r3WP37r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+690f8A/lO/9vTf5af/AIv/APDf/wCCK659+691/9TQRzP/ABeMr/2sq7/3Kl9+6902+/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de6NLtOybGwQjVRFTVGRllAHBlVY5Szn6lrMLX/p7917pNUSy5fKspu2 uUva+oEXufT/AEA/23v3XujSbPiXFpjVlUDFU+mqp6lCA1DPKpSaX+rQz3/cX/C49+690JLTwUqJ GZKdJZw9p4ZI2lkjYGTyQx3IW8fJZhx/j7917oHps/WZj7inobUlHNOzSVClnmle+kSSSkMZZggA VQLKPp7917qfRYcTLHESyQQhmnqHDOXdgC8jkgsWNv68e/de6SO985O9F/BcPHLHj0YPVTCNxJWy p9FPpt4lIvz+f9b37r3QAZBZ3I9LxKxIK3tci4ufyffuvdJqopXRhqS2r6MvC2vx/gT7917qK0LA j03A5LHgcW/re3v3XupEOs6RpJu1rab2/wCQhe/v3Xuljitv1lUVlkpIqaHi9RXyx0VMOfqZKho9 Q/4Lcn8e/de6FnFU3W+NoicnlHfJrrDzYqmnqcfGuk+jXOkBlf8AxUFf6X9+690WDK0cYytXUwVE clK1ZLLAYy1/EXJUOrKulgv1+vv3XuklOwaaVh9C7Ef7f/Ye/de6xe/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917qZTUFbWMEpaWedjwBHGzf70PfuvdG 86l/l8fNTvL7J+rfjP3Ju2irxC1Nl8fsHcYwLR1GnxTPuCooIMJDAwcHyPUKgX1E259uxwTS/wBn EzfYD1oso4sB1YNsj/hOh/NV3pHFO3QVJtqCXSRJuXsLr2hdFYkXkpKbc9fXra3I8Orn6e1Y2u/O fpyB8yB/hPTZmjH4uh1pf+EtX8z6ppFqDg+pqeclAaGfsaAVKBlJZmeLFS0emMizWlJuRYEc+7fu m9pXw1/3of5+tePH6/y6DXd3/CaL+bHtenepo+jcFuxI0LlNt9nddTTmysxVKbK7lxFRKw0/2VNy eL+6HbL0f6DX7CP8/W/Gj/i/w9V7dzfyxfn30AK2ftX4n937ZxmPSSWrz56/3BlNsRRRKGkmO6cN RZHbjRIp5ZaoqOeeD7TPbzxf2kLAfMHq4ZW+FgeiOVWOrqFzHV0lRTupIKyxMhBHB+o9s9W6he/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuj /wD8p3/t6b/LT/8AF/8A4b//AARXXPv3Xuv/1dBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917o0XSlRTbixGV2hPKqVVRFLJjXYD9urERTRq/CzRgH/Eg+/de6fdsbQyNHk5 46qBoKimZ0JcaGVxwWOr+wR+eQR7917odsPj6CD7eOVmr5i4aRgNFLGUBZgilbyFbcmwX+l/fuvd ccdPWZfNiUwRRQyPLEH0a3EckckSMC2oJZWB+gHv3XukXOy4JRR19bIaqCaSKLGUal6uWQOyaPFA jStJKbcKL2/Pv3XupWQ25uDJY4TZ7cVRs+ilUvTYegiaqzDIb6Jcgpljio9QA/b1Fj+ffuvdAxlM VujDu7YPerZZFvpim8lLUEc+lqepEkTk/mzm/v3Xukk+99xU7/bZzH4jI6PrHkMetPLz+RNTGB72 /N/fuvdZV3BgaqPVVbdqqC/6pKCvWemsfq3hrEDD+tg/Hv3XuojVuz2J+3yErP8A8q1TAaUAf6g1 ALxsb/0H+x9+691GnylNApNKoo4zwr08Il1f7UZ28j82vxa3v3XumSozLyDUshqZRyHmmLScfi0p uBYe/de6ZarIZCoA1FUS3IEoUcfkgHkf7D37r3TJUVgVDEja3P6mBuov/S459+6900+/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XuuwCTYAkn6Acn37r3Rtvi58GvlB8 xt1Q7V6C6m3RvaXzxw5DM09H9ltjBrIY/wB3O7nyLUmBxKhJAyrNULJIOI1drAuRQyzNpiQk9aLB RUnHW2d8M/8AhJvSNHit0/MPtiprZSKOqqOvurQaKijPMk9Hk945uiatq42usbrSUFKy2bRObhvZ vBtFc3EtPkP8/wDsdMmYn4Fr1sxfHT+VL8CfitQ0cXWfQHXOOydIsR/vLmcNBurd0skYU+Rt07oO XzyAuNWmOoSMNyFHs1itbOAdkIr6nJ/n00TKTk46PrTrtDDRhKOho4VjACiOKJAqqAAAFUWUAC3t T42QowOqmMcW65yb3xFKDo8K2uOLD/D8e/Fz/F14KP4fs6TNf3bs/FFlr8/haJlPqWpydFTsv+us syMPbZmX16uUHmKCvTEPkx1kjaX3ttUEcc5/F3BH4/4FcfT3oSedOq6RnIr0+Y7vbrXOOIKbdG18 hLJx4YMziqqZr/gRR1Mkhv8A63u4kGKjHXtKn7fl0U/5E/y7P5eXzBoKqDur43dW7gyleJWO78Rg 4tmb5SWYEedd7bPfBblmKv6tEtVJCzAFkb21Ja2dx8cK19Rg/wAuqhpE4Nj59axvzU/4SSYuqp8r u/4J92E1CirrIupu65YV8/q8sVDt/sXA46KFX0kxQw5LGqpIUy1wuWBZPsjU1Wsmr5HB/I8D+dOn luBwdfzHWoN8nfhv8lPhzvqo67+RfUe7+stxxmdqNc9jWGKzlLTukcmR21n6RqrA7mxavIo+6x9T Uwamtqvx7JJYpYXKSxlX+fSgEMKg1HRYvbfW+ve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuj/wD8p3/t6b/LT/8AF/8A4b//AARXXPv3Xuv/1tBHM/8AF4yv/ayr v/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917p827n6/beVpspjpmhngdTcHhlBBswuLjj37 r3R5dm9v4Xd0PhzmFT+KRQAvV0Ui6KlFHLFJAJEf6lgCV/1vp7917oUMXlsJV1lPR4+lOqfVGPIW IUtC4UWVVUAfn/A+/de6SkGbr55tcMEWPoaeQxPLM0dLBGyPodNfoEjkj6Asf6D37r3Wbcm/aLBh J6eGmqMnIhQ1yUsUT+gC4NSUFW5Abj9IPv3XugHy296/JTu887MXZieSTqJ/5Ctb8e/de6Tk1can ltTNew/J5/of9b/Ye/de6jtAJh4qxY6qm4VxUC6oDa5WQgOrqP6H8e/de6CjIj7epr/tqqRqKKpk Slu3+cRTYFV/SV5tf8+/de6TrTSO5uiuT/RQOAOPoRa49+69177x4eEZ0YE30PYD/Djj8+/de66O SqyLeQ2/1lJ5+vJUtz/r+/de6jSVEsp9bsfr+f68fQce/de6w+/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3XulFtXaW5d8Z7GbY2jg8ruPcGarafHYrDYWgqsnk8jXVcq w01JQ0FFFNVVdVPKwVI40Z2Y2AJ9+Argcevdbiv8rr/hMvk93Jt/tv5xtVY7HyilydB0lh65qera F1MiR7/3BROJaMsCrNj8bKJluBLUxuHgBtbbaWo9xgfw+f5+n+H7Om2cjCjrdL6p6b6S+OGzMVsj rTZu1dm7dwdMlPj8JtrEUGHxtKscccbMlLQxQxNNJ4wZJCDJIw1OzMSfZ0qxxKFRQFHTVK5Jqepu 4+4KCgVwk8cQW4FiNRH0sqj+tvdWlHl1bj0Tnf3zZ6921XZLEnPx5fO4wSLX4XCyRZGsx0yBGFPm J45BjsFUyeRdMVZPDMym6owv7b8apoBU9ep68Oiebx+eO9M1JJTbSx8OJgL2SpmtXVRX8Dy1KJTA k/hIDYfRz7fWOZvioo/n0y0iLwz/AIOgXr+1e2t/Sn77cO4K4yn/AIDU1ZUw0wv9AtPSmGAAAf6n 2+tuCOFft6Tm4Y8OHTriOouyNwsJlxFYwksTLUK4ZgeblpNTH/Y+7FFXBIr1QtIa0HQl474yb/qF BmgSMNYkEsTY/wBbJ+PehTrfd8unSb4tbp0lpaWllIvp8kHkII54YoT7tVfn1Uox8+ocXVHcOypB U7W3Ru/bssTak/gm4crT0uoDgSYyWaXGTp/tLwsv+HvZEZpwr9nViZB59CNtn5SfJfrKaKHdNJje xsRDJ+/9/Tf3a3IKdRbTBk8XA2GqZQfp5qJC35kH1920DijEfz/2eveKTXUOh6zXY/xD+duxa3pH 5C9ebd3NRZyFkquvO08PTQ5OGqdTH/EdpZiObVHlqbTeGuwtaldB9Q0Z9tyxxzJouIwyevp+fEfy 6uj6WqjZ61Cv5qP/AAmr370lSbk73+CU2d7l6hpRXZrPdR1AXJ9r7Bxq66qaXArRwo3Y23MfEGH7 ES5iniC64apVmqVD17tEkIM1udcPn6j/ADj59LIrgOdLijf4etTero6mhqJaWrhkp6iF2jlilRkd HU2ZWVgCCD7JulHUb37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdH/8A 5Tv/AG9N/lp/+L//AA3/APgiuuffuvdf/9fQRzP/ABeMr/2sq7/3Kl9+6902+/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917pbbCzk2G3BRumt46iQUrxqgkJE5CDxxkEs5JsAPyffuvdHt25QNgJVye Um8mVmRlpaFNIp8YjrpMtSy8zVrIbaR6Y78kn37r3SX3vtTOZfO0OWxlU0mFqmE1WamYiiwhgKNW sV/zaq6guiqCzkke/de6DzsKrep3HlIY9X2qNDUURUWElJJTx+OZVuRZ1U3sb39+690FxkCglja9 j9bH/W/2Pv3XulHiKRHp58vknNLiKMgF+fLVzkXSjpx/akf8/hRyffuvdJPcm5JaqOT7ZBSxvqho 6ZCSIox+pyTdpGYD6k/X37r3QeiUqgEg1L9CpF/9j+Bf6+/de6bpqgm6RgIOdRUAFr/7UObW9+69 1E9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3RlPi 38T+6vl/2lhOp+lNoV+5twZaeM1dUkckOG2/jPKiVWc3DlTG9NicRRBwXlf1OxWOJZJXSNnI43lc JGtWPWiQBUnHX0Y/5V/8lfoT4D7Vx+99zUdBvvu+vx8Jz/YeaoojJjnlhU1WH2RQ1Cu23sNrJV5R /ltYp/ek8eiGM/trKO3XUx1Tevp9n+fpouW8qD/D1b1untPG4GmejxrRUtNEpRBHpQlQLAALa3tQ ZKHPDr1BTjnqo35h/wA07oX40Tw7d3fvCp3D2bm7QbU6c6/o5d59p7nrp7ihosftLEtJVUf38hVY pq1qSnYnhzb2mknRCAW7j5efXqVrQf5uq6dw/Kn5C94Upk3fj5+k9vZJJSestubnOV7DnpJTIsUf YXY+DNJR7Xd4GUy4jbhNWjXSbKD10/t2GGWehI0p/PqrMqKSWq38unrr3rncm5TRYjAYgrSo7/a4 7HUa0mMpmnkLzSw0tOixeWaRi0krAySMSzszEkmMcUcKmgH+XpI8hlPy6sr6e+DeWyP2tdutnjDa XNKin6cGzsRpHH+v7trpw6qEJwerGNi/GLZm1IotGMpUaNVLSSRIzmw/1TAt71rrkk9b0AVovQ0R bO2rikA8dMgUD/jmPoL8gXt9Pfiet0GOubNtWC4R6Ti1wPFf/fH23Vjw6vRc19euOvbVV6U+3+n+ 0WPPIPH1/wB491Jc5HVgEAzw64ttfb+QRgYqd9QJFwgB/wBsPpf37Ww6tpUk9B9ubpHb2Yha9FD6 weVjRrXv9Ra5Fv8AX978alKjqvgg+eOiVdr/ABDpayKefH0gbQxmjsnMcqHUksTrZ4ZY25V1KspH B9uJNQ1HTTQkcOPQY7F7v7g+PuRhwu8hl97bHgkWES1TPUbowlMpVQ1PVykHcFFEo5jnb7oKPTI9 gnt5SDQxmjenl/sdNVIOlx1WH/Nd/kudMfzBtmZn5UfCej21tP5IGmqs5uXZmJ+0wu0u7ZI45Kiu SWkK01LtbtSWXj7mQU9PkJ7pXiOdzVqU7htSzhprZdM/mvkfmPQ/yP28VUU+ntc1X19Pt60Ft3bR 3LsPcma2hvDB5Xbe5tu5Otw2cwWboKrF5bE5XHVElJX47JY6tigq6Guo6mJo5YpUWSN1KsAQR7DB BBIIz0u6TfvXXuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de6t4+G38m75HfMGmiyuEyGP2ngWdhPk1w9bu00kTRo1PLNFiqukpSszMb6ag6VsbknSPdXKU4n q0CL/hK33M9L55PlHtSGXRq+1k6i3UJywW+gKu5mUsT9Lke9qAa1anVRpPA9V7fO3+Rn8o/hB1JX 98ZDJY/snq3B5PH47c+Rxe3M1t/cW26fJvFS0meyWBmkzVGNuDJyCmlqVri0LSws8YWRjHXUtaA9 eII6pQ97611737r3Q+fHToLcXyK7CoNh7erIaCWolpVnqZI/PN/lc4p4IaWm8kKyzSvflnREUEkk 2VvdWVdVc9bYXUH/AAlg25m9v4LcHaHZfdOOlrqeGqqcTtrDbYnp5Ip4SUWLJviapofWwN9D8cf4 +9E049eoPKvQp74/4Sj9QV+JgHXPbPd+38mY6jz5beMezK/EwOY1MEr4lMJha+sjhdG1JHUwEhv1 i3upkQcW68V9B1qF/Mj4t7u+F/yP7K+N2+M/tzdG4eusjj4ZM9tipMuOyeLzuGx+5MBWTUkjNVYb JVeBy9NLU0MxaSllcprkQLK9gQRUcOq8Oixe99e697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917o//wDKd/7em/y0/wDxf/4b/wDwRXXPv3Xuv//Q 0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6G3pLDLV5nI5vw/ cVOGgp0xkZQPoyNfI8UVTpNwWpYY3Zb/AEYg/j37r3R1Btqqko6c1MhaWNVMjM2ksbDWGYm/q/P9 ffuvdPtPKGVqGtSGalkVoHgUoE8PqCiNLKA8at/r+/de6L1v/adTh6/wypUNTLBMcFlljL09VQv6 zjauQE+OppGNkJ/H+Hv3XugTo8HWZLMUeOhBdq6eGGn5Ni8rqliebhCef8PfuvdSewszHBXjbWOc LjMAWoU0C61NXG1q6rksAWaWYEC/0UAe/de6CPIzuZ19RAjRABckA/W9j9PfuvdQ5pSY0b6M49QI 5uONV7/09+691B9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3RvPhf8Mu3/m53HhOpeqMO88tTJFV7k3HVxzLgdo7fWoihrM7nKqKNzHTwmULHEgaapmZ YolZ2A9uRxvK4RBk9e6+mX/Lz/l6dF/y9ul8btfaWHppc7UU1NXbt3hkaWmXcm8s5FEQ2TzE6a2i pYGkdaOiRjBSRMVTU7SyyCO2gjtY6D4zxP8Aq/wdNOQxHoOlj8pfmZ1Z0JsvLb97W39gdhbOxSyI Mhmq5Kf7yoSMumPxNBH5K7MZSZR+3S0sU07n9KH3SSZUFScda/LPWnd8rP51PyU+W++ZOk/hFh8z 13t/Nz1VEm+apKaLsrO42PXHXZo1VV9xh+rNq09Owllq2MmQijIJmgciIoWuJJDpjFPn/q4dWC5y enn4n/FvC9TVOQ3XJW1fYndu7TLJvjufOvX5LN1MtcoWvw+zKrMNPlMfh5TdZ6+Vv4jkgT5mWLTA hjZ2IB8SQd56allCjSp7h1eD8dviJuHf9RRVFXRyUeKDxtJLLEwMgJu1rgNIx/3j2ZGRYhQcekoR pc+XV73TXxl2lsDE0xix8EbxxoJKiSNfNKQLksxAst/x7oCWyePVigUkLw6Fncm89n7GpXElTSxt EhATUl/SP6Xv+Pe9JIp14sAT59E07F+Y2BxHnhp6+mhRA1iJF1cX+nq/qPbgiY0r000wqfX5dEh3 t/MBwWOeX7ncNNCvqOqauhgU2HJ/ckQEf7H3Yoq4ZhTrWt2IOmvQG1H8x3ZkU5Zt24gC/wBf4rSl R9b8iYi/vVIv4utET/w06WW2/wCYls+tMf2+4cfUFyoBiyMMik/7Tpdgfe9KkdjV61+ovEdGf2L8 0cDmniEWXQE29JnSxJ+nBZSfp+PbZhcnh06stPOnR19jd7YvPQRa6yE6tIGiUarcX4Y6T/t+PbLR VwcEdOrKePRicTlMJnoVXXDKJFsTdbk24vY3BN/6fX22UK06dDhugv7J6JwO7KGcGkhdpUZlYKtw SD/qRwfdkd1OetPGrD59Vjbn2D2R8bt2Tbv2I07Y6WcSZnByNIMZmoEP1nRQwpcgkdxHUoNQ4Vwy ekLkkVwM5/1f6qdI3Rozwx1U/wDzdP5ZWwf5k/VWW+V3xiwdPiPlrsPEPJvvY1FSwUld3Jh8PS3n xVbQQLqk7PwdJDbGVIuctTKKNjI32TxFO6bcJg1xCP1xlgPxD1Hz/wAP28VFvNpojHt8vl/sdaFG Sx1biK6qxuRppqOuop5aaqpqiJ4Z4J4XMcsUsUgV45I3UhlIBBFvYW6X9Qffuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xh9R/r/AO+/p7917r6XH/CcOdm6SzKkFg0G PXga15pYDY2NSpBI/q3+DH6+9Dp6TJCjj1sn5TTCh0KqsQzECMK6sbhWDeBDc2tyTYe9ngetKoFa 8eqNf59+Ro6T+Vl8wGq6uGkWp69wlFE1VURwJPW1XYWy4qajiMroJKqplbSictI1lALEe2E+Idab hTr5YXt/pvr3v3XurOv5UVRPT/J3BNEIdP3m32ZnkIkDrl1EYSIL+4hVm1NcaSFFjq416dOxfi+z r60fXUxn2FtFpPS/8CxpY62HJp05A+5jPJ/p7bdhTT59VXz6x7nQ/Zyu5Nljktyx1BtR4vLMBex/ p7TOcj5dXHXy2P8AhQtT5yH+al3xJmaOnpaer2/1PPt96enggNZg06123RpVTvAAaqoGUpaqIyP6 wIgh4QD2sUUUdNNx6pN92611737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3R//wCU7/29N/lp/wDi/wD8N/8A4Irrn37r3X//0dBHM/8AF4yv/ayr v/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuhl6X3zj9m5+oizGtMXloooZKmNdZo 6qGQtT1DIOWhs7K9uQDce/de6sHx+Woa2GJqerpaylqaaOpilR/TNTyWtMjkaSvNjfkHg+/de6yT YyGoVXiaNla+lkKuLg3IuptcHgj37r3XL+HTVFHJjamaQQOCYZoGUVFJKQR5I1kV4JVv9UdSrDg/ X37r3QZS4HeWJzdI6bS2pnqanq0lp8/jsdR0mSjRWFpaikSWjFPUADkqHUm/Pv3XukvuXqbCbonq cln6Ck2dXVc8rQ1GJqD9zW1MxOiSqxTyTUahnsWZWRjf37r3RRtxbKytA07wPFlYqaWSJp6O4qEE TMpE9Kx8wClf1DUo/r7917oPW1BiHuGXghgQRb8WNiPfuvdcffuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3XvfuvdDV8fuhexvkp2ttLqHq7BT57dm7snFQUVPGGSmpY eZKzJZKq0tHQ4vGUiPPUzv6YoUZje1jtVLsFUVY9e6+l7/LI/l+dUfy/OjsZgsbDR5Td1fT0uV35 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 Rp5Xwm8NvZbbeU8PkeITrQ5ekpKh6dpI2CyKpRiDYn3rr3SO9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3R//wCU7/29N/lp/wDi/wD8N/8A4Irrn37r3X//0tBH M/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6EHa3Zu7towN R43ItJj3uDQVaiopk1fqMIe7QF/zpIB/Pv3Xuhc2d37XJlIaLNU9PT47IOkFRVQAxfZzMdMVaAnO lGNpP6pf8ge/de6GbJb8ztE0ixSSKIzzapkkABAaNxb9cTpZlYG5B9+690kKnszcsUiPLIJYfKjS XM4kVdQYkHyWt/S9+PfuvdKX+9rMRUVssca01R5tbfu+eKRVliQUshZiXIsCCoH9ffuvdJOuxWK3 FSy5zGqcZXNUzHIRQEtHFK7GRKgRqbiCUHmwupB+vv3Xugd3Ft+OSRo8rSiKpC3jraYKDKnFpNY9 NRGf6m5/xHv3XuguyGEqKIl0P3EH4kQepR/tac2P+tce/de6Zffuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691OxuOrMtX0mNx9PLVVlbPFTU1PAjSzTTTOsccccaBnd3dgAACS T7917rfY/k/fALbHwW6gpu0e0MPT1HyE7MxdNUZelqQjVe0cLKIa+i2RBIwJpHp5PHNmZE4krFSE axTxO5vbQeDH4jD9Q/yHVScgdDT/ADPv5s+0/hv11SbfwK4zd3f+9sJJU7N2IJ3OLwVCQ9N/fbfB glWoodr0FSGWmpFZajKVKtHGRGk80VpJii+rnrWGNBwHWh1vzsHtH5I9rZfe++8/n+xOyN+ZuE12 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 +0sjlF2s9MsWG25ucmoy71rFGGQgllkkq6ClgjVlMbn9zUCBb2q2tLtkZrg48q9LeWn3gjVfqwiI wG41qP8AJXo86YnDadKUtO4YHixY2H+sbkG359m5OmgYj8uhfUcBx6C7tf4tdK/IDbj7T7W6o2jv rBs61MdLuLBUeQ+0qRHLEldQSzxPNj8jFFO4SeBo5lDtpYXPtlyCag9eFfPrUa/mu/yXW+Je2ch8 gfjtNufcvT9NlYKfeewq+jq8zmusMdU0krjc9PuISy1WZ2VBXwinqTVxirxpqIGkmqYmmlp69b61 6/fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdH/AP5Tv/b03+Wn/wCL /wDw3/8Agiuuffuvdf/T0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de6M717m23FtpYJpWkye3hHRVIZiXqMRJdaKY/Un7U3iYn6Lp9+691Ky eNa0sJLeN1JXk8xn+hY34v7917pnxhkYGiNzWUqtGqk3NbRi5CKW4apitcD6sP8AW9+69084nKnD 1vlbVJRVAMVVF+lvHcjUF/EsDcgH6/T37r3SvyeNp6qG0cUVbRzqZoYwf7DC/noJx6o5P9VH+nVw R7917oHs3gXpxJNRM1RCCdcbIVqILfVZ4fxa31FwffuvdBZX0UUjsyL4ZPqbD0OTwLgD0kn8+/de 6YJIpIm0upH9D+D/AKx/Pv3Xusfv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rYW/ke/C Sj31vef5Zdo4cVOxescrHRdcYiupRJDuzspI46iKuijmQx1FFsuKaOovwP4hLTkMVgmX2tsoPFk1 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 ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de6P/8Aynf+3pv8tP8A8X/+G/8A8EV1z7917r//1NBHM/8AF4yv/ayr v/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xulv17uZdq7noq +oJONqNVBlU+oagq7RzPb8tAbSL/AEK+/de6NflMahCNEUmhYq0M6EPHPTzANFMjD6o6kH+nv3Xu g2y2MlgmE6/tsraldSVZXUmzKVt6rD/Y+/de68lRDkl8NY0dJXnSFqm9FPW/W33XH7NQQf8AOjg/ 2h+ffuvdd4/N1GBmbHZKOaTHmS4C8zUUrWtVUpB9cZt6kvpf6j37r3S0ngx2Xiilaphp5pOKPNUw 1UdTcACOq0gmJ/8AVXF1/tD37r3QTbu2pLTTH7uD7GaQExVkKa6GrUEaZLx+gq31LITb8j37r3QU VtHU0TeOqh9B4Rx6o5F4s0UgBW9v9Y+/de6ZpILXaIll5JW3qUf4/wBR/j7917qN7917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917oY+gemt1d/9u7F6m2bS/c5zeWeo8VAzhvtqKndjLkMrXuqsYcbiMdFLVVM lj46eF2/HvaqWYKBk9e639ulesto9IdQ7Q692RSij2X17gYtv7c1xJDPlqlS8ub3VkFi/bfLbkys 89VKw9IeZtACkACu1gEMSqPTpDK9T1WD/NN7p/uj8W+0cZDO33m+xieuaYJKEcxblyCS5k/XUYzt /HVikDk6/wDD2m3AhYtJOT05APTrWH+PnV8na/YcEdbTtNtvCy01ZmUAZY60NIwocKrrYr/EJI28 hFtFNHIRzp9k9vGZ5uGOlzkRx08+tvz4GfGWs3nmMU01B/kkbwyVEiwBIkiXQvjRFXRGioAqqvCq Ao4HsVxqtvCNIzTHRSSZXBPnx63Avj11Li9k4Cif7OKngo6WJYhoCgBFHJNrfQX/AN59pSxqelSr pGOikfPD5Sw7Rxk2zttTmfLVziggpKV081RVTftQU0XqCqWP1JIVFBZiFUn27DHqap+EdJ55Kdin Pn1qVfzFPnzSfDnbdRtraORo8/8AKzsLGJkIKuVYq+j6kwFcrmj3NXUlRG8Mm4aqKVzgcfMreGMn JVa2kp4alDuW5FAbaA0PmenLe3pSR+Pp/q8+tQTcW485uzN5Tce48pX5rOZqvq8plcrlKueuyGQy FdPJVVlbW1lVJLUVdXVVErSSSSMzu7FiSSfYc6WdMvv3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de6sk/l7/ADRyHxz3zHs/eOQqqjp7eddDFuCkKyVQ21lJRHTU+7sZAuqVJaZESOuiiv8A d0a20PNDTGNTa3LW71/AeI/y/b1Vl1Cnn1aZ/MO6DxO/+vou4tqPQSZTbGL/AI5DlaSaCSjzO1p6 dcjPEK+OT7aoopqRhVUswYpexVtMhPs3uAhQSocU6qhNdLDPVJ/WnYu6+pd7YDsnY2Qmx+Z2/XRV emGR1FRCkivU0syixaCdVOpSOG9Q5BunjlaJ1ljPDrbqHBDcD19DD+VN89sF8h+s9sZ+hyUQysMU FFmcdJMv3FDko0Ec9LMl7oryKbG319iBXSaNZo/hPl8+i2jRv4bfl1sjbXy1HuTCwyMyyJPAFdTY nSy2OpeTcG97/wBCPaaUUNQOlaNXy6ps+e/T+Z633The59jUzRZXb2TTMQeEMiVXiJ+8xtQyD/gP k6Rnia/Fnv8AUD2stZAwKNwPSa4Wjaxw6+d7/OH+L2E+PXyuym6uu8alF0t8gsPTd1dWJRwvHj8V j901NUu5dnx+jw00uzt4UtdRJTB2khoRSs9jIB7CO4WxtbqSOnbWo+z/AGOHS+F/EQN59VPe0XTn Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3W6F/wmz64xUldS5qcU71NLglrkuRM3lyt RLkrg6VIZFqNJX+yfTc29uxjz6rcf2ajrdsosfDLoLAHkfUf4fQge3ekkYDMWr8PShp8PCQoWOI6 tfGnng/6xP59pjUE46UrIJMD06c/7tLIFYUwCkLcBBe9xcj6nk+9dWWtM9eO1of+VdOD9TECQefq LX976cSgOesZ2rTmweO1w3Ij4ABP0/p79091ibaFGfrBG/H1Ktb/AGNj7oyajWvWqdYJdo0o48EJ TUDoCm1za5JP+Ptk1BIr1XqKdp0wuRSw3UMbqgtx/X6j6e9de6hz7cgVjanQWC2tEPyOOQDzce/d e6hvtjWfRTFSWIvpsOebgs30v7917pnr8FJSCxj0llYgFRbhifrbn6e/de6SNdEsNzqHGi5I+lyL ixFuSffuvdJbLGAQsSFJYg3+vIHH049uxZPZ8Xz6bPE9aHv/AAqB29JD8hvjvvDXRfb5frve+1Io ooSuQWXam5sXnp5aufxhZaWUb9RYF1MyMktwAwLOda61gPfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3R/8A+U7/ANvTf5af/i//AMN//giuuffuvdf/1dBHM/8AF4yv/ayrv/cq X37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6Nl0xuFNzYe TaVbIWy2JhZ8UzsL1VDe/wBpdiPXC5JT6/W3HHv3XuhPyu3DUIyiI+VOdLDlgB6vryG9+690DOcx klKWAB03ZSeAQbfQ8GxB9+690m0yyui0WTVp4R6YHuTLBf6KjHnTq5t9PfuvdTKGbJYdmnxzx5Gg m5qaJ7tDKvJ/dhHqSVR9HT1L7917pcY/ckNTStTQwxV9DfXWbcyl2mj1CzyUEqgSAgfSSKzD+0vv 3Xumeu2dQ5qnnqdpzGd1DSVm2Ml4/vYrX5o5PRFXJ/RgEkH9D7917oE8ngZaeWYU0c0M8Lsk+PqA VqYmX9SxhrNIAfwfUP8AH37r3SVkjEhYgBJBcFbEaiOCNJ5VgffuvdQjxwfqPfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3WzZ/I5+LUlLic78gc5jyub3q9Zsjr6aaIa8dtWjljO+9zUpZS0UuSqlixNNMhVgkdfG bhvZptsAeQyMMDh9vTUrUWg49bD/AGdkYcNiPsafTBT0lKY4kQWAWNSPoLW9iNRwHSCoqT5dapH8 2/tKbN1PW3XVHL5TU5fO7vqoEbXLJJTJHtvBp41uWMj1lbpH5b6eyHdX/UCA9GNsgoG8+hF+Avx3 qIafb2HFGJMrkKmKry0yIshlydUU+4XWF9cNDGiwR/UBYyw/UbrdrttCh2GembqapIB63wPgp8aa XZ22MLHJRKlTLDBNVSGMax6VIQkDg8/7f2qlfWxP4R1SJNKjHcej0/JDtPD9LddV9R54qedKN46d FZUOsRkCwvza3+8e2lUuwA6cdgi160//AJsfM/D9A9d7q+TG+zS5vdufqsjt/ofZGTleSPcW4JYP Ic1XU0VRFUPtzGQzR1eQdChNGYKZZY5MijDV/d/SQ6E/tG4f5+mYYvEcu/AfzPp+XWjx2Z2TvLt3 fO5exewM/kNzbu3blqvM5zNZObzVldXVkpllkcgLHGgvpSNFSKKMKiKqKFAWJJJJOT0u6QnvXXuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917rsEqQykggggj6gj6H37r3V/P8uvv2l74 6g3n8Q+ycis2Vj2buHHbHyFfP5J67amSx9VR5PAqZGEs1Vtb7w1lIo1t9j5kukVJEpMrKYMr20hw Qaf5v8vVHFKOvxDoq+Y+OOTyO0Fy+LpFoN5bcmyO2d34xOaf+8+1KyowW4IJI1BETSZGgkdJAPXG 6sQQwPtUsLNGGUZGD9o49U8QBtBNQehh/ltfLHN/EX5DYaHKT1eP2TuvMU2E3Xi5ndIsbXzTrDBX eJjojCyNpYjixU/T29ZzCGTw3NI2x9h8j03PHrSq/GM/b19Lf4odv0W8cBiamlrVqqXIUlPUwSRy o8cqTwoyupHB1qA3/BlP9fZo61FOmInNR6Hoz3eXXlD2Z1vmcTPAk0rUErU7EBiG8ZKFeCSLrb/W t7Sxv4cnSiRdakdaIf8AN/8AjFWdh/FjtLbSUEtRvn4o7qre69jqArVU3U+86yg273FgqKN1Er0+ BzUGKzrhW0wUsM5C88U3qETW0Vyo7kwfsP8AqH8+mbVtLtGfP/J1paEFSVPBBII/oQbH2Ful/XXv 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917rc9/4TdV8lJUUyLIUBwGoqDa/wDls/4uL/T2 /FwI61Of0R1uoYnPEMglJYF1Fgfpx9f6+k+7cOkURWrr/Fx6E/DZmm1QlwTfXzwR9f8AHnn21IQa U6fVDG9QO3oVcZkqB9JaxJVLC6C97G1uPyPdKEivl08CDwPT9V5CkaYCNVWOIj0nRzJbg8W+nvag E93DqwGo9Nss1NKyn0Hg/ULx/r3Fve2Cj4en6+Xl1ClkpkJJVCB/qT+B9b2FrW91611BknpWJGlB zzwPwB+Tz/vPtO/xHrR6wmopkB0orAg34HFj/r/191611Dmq6Qs5KoLKp5K82Uccg8+/deHDpN5H LU8RMiOkZSQlTwQBp+hAsf8AkXv3XukZltyYmVSjFplVHJVFt67WBVj/ALX7917oGsrko5GkMYdY jYBGP0AH5/HBHu4QcGND1Ut6dILKZEMmi5srgG31AtYXufr7uq6CSOPVa1NOtD3/AIU11KT/ACp6 TSKYSLD1HkhJGsgYQTvuysZleMMRHM8PjJ+hZdP4t7cIIJB49VBBFQcda1XvXW+ve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917o//APKd/wC3pv8ALT/8X/8Ahv8A/BFdc+/de6//1tBH M/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de6fMDV5rE5GkzGEaogrKGZZoaiFWIDKblXA4eJwLMp4I+vv3Xuj/AHXvYmH7GoAauBcTuag8 MWRopPTDOX9K1NMzWLQTupFiNUbek/UE+6911v3Z5WJ6+nhElNMv7wS945LEEkAEaWuLH8e/de6K 1msa9PPKpFiCTY3BI/Buwvb/AFvfuvdMlPWT0b+l3A+hHqIPP6iB9f8Aex7917qdLlXcLJ5GhlU3 SbggODq1LIPUjcf4e/de6eaHdqNPC2QZaOujYeDMU6Kkcjf2fvkjsVJP1kX6/wBofn37r3Qjy/wf esQoM3F9pnYotVLlaMo808YF0np2LachCFF2iZtQHKMPp7917oEt37JyGMmV5lhfyq32mSptRo8k kZ/S5IDQ1afQqw1X4P8AU+690F80bairIUmT0spFiSP6g/2v979+691F9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+690IvUnXe c7Z7J2X1ztun+6zW8Nx4nAUEZDeNZ8nWw0iTVDKrmKlgMuuVyNMcasxsAfewKkAcevdfQ3+InTOD 6u6lwGKwdIsGB2ttvGbU23+ysDTYzE0whkys0SjSlfnq5pshVEfrqaqRj9b+xXZwCKJFpmn8+kMz kkny6C/5H7hXF4fMVLSaAsEypY20hFYH+v8AS/tcKAMSPLpOpq2nrUG7VydR3j803hgaWbHbNXG4 0G7PGDg4zW1AjHIXXnMqwv8AkJ7C7f4zfE50g9Gw7Lf+ketsz+Vd8c1zGYx2YqaHVTUAhYM0d1LK VNuV/LD/AHg+xG36MKgcT0Wr+pIa8OPW411/tuk2Ts8VkqJCy0vkFwF0Ikd1J+lgBz7Rsc6elgxT qgT5192xdpdk12zXzdPjdj7So67P73zVbWGjxWL25hkkqMlPkq8usdDRyQwv5pmIENLHNL/uo+30 KxRPK+BTpO+p5Ao4f5evnw/zGvmDkPl33/mdwYuaupOrNmq+0eqdv1FoEoNrY+eT/ctUUMRMFNmd 1Vhevq1BkMJlSlWRoaaEKFridriVpG8+HyHSxVCKFHDqv/2x1br3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3XuhJ6h7K3D1D2PtHsTa9WaTMbXzVFlKYkv4JxBKpno6yNGU z0FdTl4aiInTLDIyNwx97VirBlOQevdbLW1p9rbo7Px28MGkDbE+TuyMZ2nt6nusv2O88TS47b3Y eGqJkUU8mSiD42ScLa9YtWfwx9ifb5Vkcj8Liv58GH+DpHcLQA+n+Dy6Kj81/iHkcJHV732vjpY3 jgNTMKdCpmRAZUbUtgJY7elvqCP6fT24WRj1OnD/AAdbhmDYY562Gv5Bfzcqey+rsd1/ufJOd5db VMWAyMdVKRVTUcWgUFWUdi1vGvN/oR7ftZvHgUk94wf8h6ZdfDloB2HP+x1ufbKycOfwVPNdZI6i ABhcEBHWxHPFlYH/AGAHtmYFSGHSlSCOtfL+Zt1JgNjdjUW8txY3z9d7op8vsvs+kWNQlf1f2Ljq jZnYVK5YGNfDgMvJVqxB0SUqsBce1sYFxbSwN8LL/k6TS1jlVx18yz5IdP5zoLvftjprca2zHXG/ NzbRq5QpWKrODy9VQR5Cl5IejyMMCzwuCVeKRWBIIPsFupRmRuINOjAEEAjh0CXuvW+ve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917rYL/AJLHyzyHxw7Kwk+Xx8+4do5LDzJX0UFSIclRImayUHmx zygwShY4QPFJZTxYj2vsoROTHWjdJbyZo0AHw9b13T/zE6B7RpaSXb/YeIoK+q8R/gm5J1wWTgkK AtE6VrJSSMjNyY5nH+Pt+SxmjJpQjpJHKhOGAbo7eAr1rIY5aeoiqYnUvHNSzRzwtGRcMksTujqw P1v7L5IZI6lxTpdDIGLIeNOhCopZOCWZfStgbg3Nr/0+vuqjsbrzkoDpGOlDBUT2c+U8uObm59I4 55tx7b4cenIpBQVrXqUaqU29b/T6A/8AG/e+lVckdcWlkCltT+pbf4j/AG/09+JAFSevVFadQ2nk S7aidJuRcji/+H+HtKzqWPXiDXA6gS1EpBs7L6JPobfU3H5/ofeuq9M9VLMVv5GtYKfUbm5sB/tv fiaCvXuk7klaRSSSTrJ5JN+P8L8X97GRXr3SErlSJWaWSONNBOqSRY1FnP1eRlH096ySAFJPy6qW A4notvZHfXTfXsNR/ezsba+Onhj1mhgyCZPIuAG4joMaKupZiPp6f9t7Wx280rghCPt6YaaJMGQH qo75L/zQMfgqSvxfTe2Kqqr2ikWHde7R9pQQM0bFZ6DAxsaiqljPK+d0S9vSfp7NY9sAUtIftp0h lvTUiPrTQ/mXdgbr7S3F1jvre2ardwbkzv8ApKnr8pXOrTTePc1DDBGiIBHBTwQoEjjQKqKLAe0F 0oWUheFOldvUxKT1WF7TdP8AXvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+690f/wDl O/8Ab03+Wn/4v/8ADf8A+CK659+691//19BHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de65Bbi4I9+6910Rbjj/Ye/de669+691737r3XvfuvdONDRpPKnlkCx3BYDliP6D8c+/de6 V8FeacLHTnxRAjQFAW4X6F+eSfz7917pW7X3A9Bmaad3URzn7WWRgNSCYgJKHGkr4pQpvf6e/de6 Odg91pLjY6bJWlH+Ynjl9V1PpJNzyARf37r3SN3jsGmykD5HClZQQZNCkal/OhhbVb+nv3Xui1ZT EVFFM6TRmMoSCHB+oP5FuPfuvdJuanZlkWMN6lN1FueLcgmxUW/r7917pJ/dSQyGMH6XDQsQyEi9 yt+QffuvdKnB7iakKQyyTGhjlWSORSRV4iovdaile9zGHtqT6Ef4+/de6MHRV1PuDD1P38aVPiFO mZgitpqYp1tR5/Hf8cZWvyR9HBB4Pv3Xui/7523JiquUhhJJTrFMs8Yslbj6jmmq1sbB0HpcfhgR +PfuvdBnIAGuPo3Nv6H8/wC8+/de6x+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuru/wCSr0BJv3uLPdpVtA09NtGlg2vtuUgjRube MdVS1lZGp9M6Y7aFLkkbgmGesp34Ok+123w+LOCR2rn/ADdNytpU04nreZqNtRbT2FQ4yGJYzBQR rpVdI8hiA+n+0+xOnkOi9sgnqij+Y32bT9cdX7xzk0oU4/FVjwozWMtQ0bCCOxPqaWdkX/Y+9Xcg htZH86dat0LOB69a8H8vbZFfvjf+4t35JXq6zI5WGB6qQF3nqppWr8g+r+j1FSn/ACT/AIeyfaIT JKWI8+jC7fSgUdfRp/lk9Fw7c2FgaiWjCSVcMNXO5jGrxhQUBNh9f959mty9XIB7R0ngXtqRkno+ HzK7ZpuqOpc3UpVR0tRJQzQUw1hCpMJGr6g2ROT7YiQyEY49OTSaFwM9aD/84n5U1nUXQcPVGIyU tP2x8o5Z9x7zlinenymA6goKxqeixU6hhUQrvDJQtT3VgrQUmTglQpOPaLd56abZDjievW6UXURn /VnrUpYliWJuSSSf6k+yLpT117917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de6un+B3bM2e6J3DtSqq3l3H8bt4YrujasKq09dUdd5KU7b7TxVN6bpQ46hygrR GpJaoqS9jpuDLbpzE4/onV+XBv5Z/LpqVNSnHl/xXWzsetcR3R1DT1S00FZFk8RpZlVZFLPBYlSA dXPIP5HsZuNakHKnooBKN9nVDHSmcz/8vj+Yltdat58bsTtDKrtXIcNFRx1lbU6sNUSE6UH+Ut4r n/Vk/j2Qov0d74ZP6cmPlU8Ol70mg1g9y5/Z19Ib4h9iUu9dl4yaKoWUSUsEi2cN6ZEB4P05sD/s Pai4U6TUdehYMAQc9IH+ZB1HS9idIZuSSlWpeloatJQBd2pZoHinS4BIPjJ/1vdbFwW0nr1wupK+ Y6+YN/OQ2E1B3d132vbzV/Z3V+Hxm+KqNFWEdmdQV+R6d3PG6q8hir8ph9lYnNVCsSzPmBJ9HHsi 3OPw7t/nn/If8Fen4G1Rr1T17L+nuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917qzD4VyrS5f Z7ElfucLkbH6XMe6MzGLX/OoezLbSRKT6DpDuNfBFP8AVnq8XbVfLJFRKtS8cqO4BSR43DDSBcIQ pII5JufYlrUD06InGkM1cjq2P4f5veqzY+Kk3ZuGij8spIgzeTjR1KhbsiVCxWW1rEe2p0jkFWjB x1u3lmzKJD9nV5+wszu5o6YVG58zVKsS6jPUxVmogjgGpjdl/wBcH2R3CIFJVKHo1jkldSWNR0Nk OZ3FHO6x5eIhVidEqaWF5BrHKs0RTgkXBta3svk+HpYlSq+oPWWq3pumiQErh6gqrsRLTVCsfr9T HOPrf20oqadXaQoa049B3mu9t1YeGRzgMLMYwpAWWuQG3A+jtb/Y8e3kgR2IbyHVUmZmOMU9egub 5Z7wlqvtl2jgVRpdAkaornIFr34YA/7x7eNpETWnWxdOXCjhXoQMR3JvLNxxn7LCUasjE+OOollA P+0zVGmwH+x9o5FCA0+fTkcrPXpZU2ZzeQUmqywg1RpYUtLTI6mw5DOJrjn6W9oJW0rQDj0oGc9B Z2ZlMtRUYSm3NlIZ5ZfGojqxCzhgBbTAiqSb/wBPbkMhKV09Vfhxp0XvdCvk0+1nq6+qqZaSYOtR UzzRC0TXJM0jKHX+oHs1sR/jCFh206LblyRSvkeqQ+78ZHj9y54loIpBUOFKqNYPqNmYEtb/AA9i JQuo6eid/QdVxdzMYkJU6yiX8shIjbgarIf3CdA/oAPbkg7X6vBUNSlR1Rx84CGx3TjA3DDs48X0 gjdFArBb/wBnUCf9j7DF3/a/l0e25BiWhx0QH2l6f697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuj/8A8p3/ALem/wAtP/xf/wCG/wD8EV1z7917r//Q0Ecz/wAXjK/9rKu/9ypffuvd Nvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917rlqP44H9P+N+/de64+/de65aG/1Lf7Y/737917rsRyN+lHP+sp P+9D37r3U+lx9RLIqmGQAkXLIwUD/XI9+6907tBDT2AQcWAI4vb6/Q8lT7917rEXsSVPHJ5/H+sf qLe/de6l08l/r/Wx/J5H9f8AePfuvdGDxm4ZIMBiKmtkEfgi+zqKxi3iZQwWkeuIuYmQft+axUCw a319+690ucLu+rxsyFZA8EwBCMyvFIrDh4nVmjlQ/wBVNj7917pWZLF7e3xSsyCOkyWkfT0h2seC OL3t9PfuvdF/3HtPI7dqnEsTGK50SBbxso4PNuRYcj37r3SAzW2BlKWXK4f1z0y6spjVUmqgjUC+ Rp1A1T0VzaTSLxHk+k3HuvdICKR11CQATQkiQcjyR2sQbcMLD6+/de6GLrrOtRVcKTFpaSmMME8b ubT4TJyrT1FMSQwvRzyLNGbelhx7917pcb9xKpj62Go9UuByP2KSkWabG5JnQRFif7EwWRB+NRt7 917oqs66GeP66JWUH6cKSv8AU/09+691G9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3XJEMjqii7OwUD/FjYf737917reg/ka/G0bU6l6+mq 6BYq3J45t/5lwzyiXIbyjo67FuWPpj0bNpMQpjFgk3lv6i1xDtkWiHWeLGv5DA6SzEs4UeXWwD2z QiDESqBpVE1f0sAL8f0AA9mYNGA6YcYJ60vf53nZjQUGC2HS1Gl9w5/zVcaudTUGLVqqUEXvpapM QN+PZZvElI4oh5mvT1gtSW9OnX+T701LnaXYsQpdc+4cl/FZvRdvHXVheInjkCmVR/re1W1IIrcy H06rdEvLQHPDr6Qvx52RTbF68xUfhWExY6BB6QpWOOFbn8f0t7ac6jSuSelKAAD7OqcP5iXacW/+ zsT1uMhT023cOJ8zuuoqqr7ahpMDhlWty01dNqCxUrqqQSMSAqSsxICn2siKxxPMxooHSObvkEa+ vXzXfnv8kqz5UfKDs3tQTVf92qrNSYTYlBVEq2K2Lt8DFbXpDTB2hpKqbGUy1NWsdkeuqJ5LXckh KaVppXlbiT0vAAAA4dE19tdb697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de6OR8DuyqXrj5JbEbMzmPam9Kip673hE0gSmm25vmll25XSVqsypJTY56+Os0 n+3TKRyB7cibRIrHh5/YcHrxFRTrdk/lf5efNda5fq/PziqznW+ZzOxsg0ikSPUbTyNTgRO0bepW raSkhqP9aYH8+xtayF7WI8XAofyx0USppmb556Ix/PA+LFTV9cnszbdFJDm9p1EWYpKqkTTUR1OO kFbTyI6DVrWSIhbH6t7R7jGZYGdf7RDUdP2zaJCjfCw6vL/kO/LJe7uher81W1kb5PIYKko8vEsu ow5rF3x2ViIJJUrWwSAA82t7dR/qbdJf4l/n5/z6ooMUrJ5A/wAutlLtHa8O7uu89jJY1kStxVUg BUMNUlOw4+v19lcDlJ9Nc9LGXUhBGOvmgfzx+o6im2HveL7ErP1B3fh920MioqkYHu7bFftPdlwE DGHF7l6Nwhckm0uZXj1XOt6T+ylA4/5f+K6atDhlJ4f6v8vWq57IelnXvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+690ez4jZaX+8G2aVtZig/iVEPWx9DZD74mP6eIB6w8D83P59r9vNJaevSW9r4O Or59izXaDx3YI4EnNzG17kvcHkC1/wCvsSqScdB6UkrJXj1dR8JaaKamhnaqj8nmnVY9CB9IZeSp N+f6+6TGkZI49etv7M/b1dtsOlCwKylG0xx8AhbjgkkE/wCPshupAFfFAAcny/1f7HRvAy+EwY0x /g6Crvz5q/HH4wb/AOoutu693ZPae6u+8lV4vrUwbQ3BuDF5fI0WYwmANDkMng6OuXCzS5PcNLHG 1QiRWdmLhVJ9zR7Wfdu93vezlT3A5w9tuX4b/aOWoUlvgZ44pYUMUkxfRI6CRGjjduwlwVAoa9NT btt23vZxXdzpaf4MHJ4Z/PoxOf8A2A6s6B4jUI6mR+GTUrKSv+pYfj3AtuyzRxzqe1hUD5VIr65N R+XRhcHuUeVMfZ0U/tLceI27iKvKZ/O4bBYuMxRTZLN5ilwuNhklYrEk2QydTS0iPKeEDOCx+g9n +xbNu2/bh+7tk2u5vb9gSIoImlkoFJroSrEFqLUDBPSV7iO3QtMwVD5k0z0CG0MvhNz1b123M7ht yUMNY0Etbt7MUObo4alESR6aSsxlTV08VRHHIrMjMGCsCRyLrN72TeOW7o2G/bTcWF4Yw4W5jeJi jGgZVdVJyCMAjHHpu2lSVvFRlaIGlQfxdGz2hT2jg9FiVJJMLgn8fkEG/wDsPYXnGD54PRjbj4gf XodKFVSmkKo3pSMA3iTT6ebfV73H9LeyiRzQHFelZwMdAL2bUtNkqCnZZUiE5Z5HkYqB+o8KFHI4 /wAPa+NdMdFHz6pcYoBw6KN233t1903mNu0m9TlKjIbuGbp8FQYSmp6iqlgxGOqMhla6eWvyGMo4 aWlooWKp5WqKhlKQxuwNpi9sPaHnL3Sj3y65bit1tNuSMzSzO6IrTOI4kXw45WLuxFKqEUVaRlWp BDuF3b2ZgWViDIaDz+3/AA9VY/IGu1bm3A6LJMplaSnkWH7eIRSFjG8plUSaghHDAMD9R7BkSlGd GZSymh0moqONG4EV4EY6SyU1HS1V8uqou7a6Z2qJJakMsvk1RobjSqFQjMbMQARa/t6T4JOrwtpY kevVMXzNIbbPRklyxeHtb1Ekkqu9IEQEHkaUUW/wt7DN6QZsenRvYqyw0bjU9EN9pOlnXvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+690f/wDlO/8Ab03+Wn/4v/8ADf8A+CK659+691// 0dBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XupMEzobBja4PJ4 4/Jv9be/de6V2JmmeRESGCQkqLtEL/n+hHHv3XujIYDEyUGEjrK2ipv8rBEKPFqLRgXZirlrKb/X 37r3SIytHgMlNMzYiKMq2lXpy8ZIBN2CxkAnV7917pkbZ+OfmOkq1/JBkdV/AIBNhYE/19+691Pp cJtvHMpr3jUgMfGsiO5AtYa3bQDf/XPv3XuhT2ku38vBUYukpaepiRWEkMkscxmp5rJLHIq2FibW /APv3XukNuLZ+Y2hlFba0tQ+JqXEj42cCpgpizGyNFNdRDcEX4Yf19+6906YLceTSsenyeIqsdLF UMi1mPZq6gJUgL5adXlr6ZOOWXzKPrYD37r3Qy0+Ro81TnF5pI5C6WilexZ1a2khiL6T+G9+690B u8tr5HaOSjyWMeUU7Oz01VG5Gg83idgBY6OCPoQffuvdI6bDUO6QZ4qVaLKyxnySU0Y+1q5SQC08 SDTRTkfWVbRm92A+vv3XulLsvZUtPVTx1iloYHojlZUPkSmo6edJ4cbSSr+3XZDIzooJjuqpc3+p 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 QpNX0g6K+Y6s+7d/mvfB74xdkbt6l7W7B3pS9i7DrUotzba271runNpR19XQ0mUgpKfL6KHDVVqG viN0qCilrFgQfeIvtJ/d4/el97uROXfcXkXlfbZuTt1hZ7a5uL+C31IrFC5iJ8f4wQcZANOhPc81 7JtlzNZXVzIZoz+GP1yK/YOnLo/+dn8Me9srv3aPXFD3Ad27R6q7G7UwuM3js/Fbaot94/rLaOX3 ruLB4TMUOf3MuMy7YfDTPEa6KKBgps5YBGOvcP8Auy/vI+1+28r8wc3y7H/V7cN8sdrmktbn6iSy k3C6gs4pp4dEZaMSyAgRMWWvcCCWD9nzns1/LPCniB1iZl7KatI1Gp+wdVLd0/z1vktunZG3u2es /hfQbI6s3Xu6fZGzex+ytzbi3Zt3Obxpo5WqsNQS4fH7HxVVkKGOBmmjWaVIdJDke85+Rf7pv2Rs uctz5D9wvvKTbjz3tu3rf3m17dBBbTRWjnSk0gke7lWFyKBlVWqQRTPQSu+et2ltkuLba1WB20q7 CoJ9B8/z6WnxY7v+UXaf8wbKfGL54bT6a3Jmdm9ZZDsrCY7BbcwFQnX2Ymwu1d0YiPC5vDVVRTZW lrcblYTWUtbJkIlqYY2VhJFcgH399nPu+e3X3NNt9/ful8ycy2W1bjvQ2yWW4ubjXuMSzXVrN9TB MA8TRywOIpYljIRiCNLg9b2+/wB2ud9G37zFG7CIsFAwpIBB+3h08/IX747y3QHdplFZUyu73sVE kj6VQsARqt/sffIyE1qO7SBgMKEcSQRwFG1DGMV6FElOyhr2/wA+qou4kMi1KmMLrMkjyMx5XQj6 FP41/QW9ut8DHq6cAfPqn75nRePaPx/PF5aHtqQtxqe3YUsQL2/tgRgf6wHsM3dPGNPTo7tSTEKn ohXtL0o697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuj/AP8AKd/7em/y0/8Axf8A +G//AMEV1z7917r/0tBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de68AT9Pfuv dZVjJ/xP9B/xPv3XunGmozKwB4F/oP8AE8f6/Pv3XujHdRdeNncnHLUK6Y2kX7uuqmQGOGCL1MD9 PU9rAX9+690Lm/Ny4CjEsEEckcKAUdGioofxKNFxG3p/xJuffuvdAyM/QXMcEGQ1cHW5hjRQDa+i JUJv9b6vp7917ptrsmJyCzVqxnUmlHVENyLfQE/Q/wCv7917psNBiJpEdhV/rGouEkuSRq5vq5+n 09+690O2132BhaAHF19Zj8hKqCqmyWOnYarXMcM9H91EIQ30JUX+pt7917pS1G6MU7RwrQw5VEWz V8FfC1QTYEkU8kcN1Fv0sb+/de6Se/sTVU9Mc7iYoo6SSKOpq3+zdHpSyA/cM0CSxiFhbUSbKefp 7917pF7I3xmJMpTYGuqqPLY/IM0VCssdHXGkrArSQ+FyDPHTTsNLqGABIYW59+690P8AipMfuenk wtdRxKZg0Md4Y50iqNLLFKnkFw0bj+h49+690BFTk9oY554cjk8xV/byyQyYzGY6lxMLSQOyMj1c 85AQspHpiJ/p7917plyvZ5kpP4ZhqGHB4xNaRfayPLXIJAFZ/wCISqgV3A9RjjUsD9ffuvdALmnk ecyF/KW1GKRQwhYEnUyqxYmU39V+b8+/de6Tfv3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917qyD+Vp19Pvj5U7bqUjEkG2MXlcrP6QxQ 5CKPa9JNHcgiWmyO44JQRcjx3/Fwqsk13MQIwDX9meqSGiMfOnX1EvjXspNr9ObdphCsbSY6CVwB p5aJWHsVKOB6S/CoBGeim/MzLJitnZli4UClqmPIAsI2Nv8AH6+3B8XSeU1H2nr51fbantv5+VlA 4NVTydi4uhdSdaij29TR5GqU2vZddM4/wv7Dzr4+408tf+DoxB8O2JA/D/h6+jZ/JX6hTB9b/wB4 pqcB6iOBFk0WuAgcgcA6Qfp7Ob1goCjyHSe1BIZvU9Hx/mPdjDr/AKRytLTy6avJwNTRxqxDyMUL GNQOSzube27FS5BpxPXrljQgHr5tf897tion7O6a+OtNWRTUfUnXybk3HDCx1rvvsuWDL5X7izaW R9uY3FVENxqU1ch/t+yfd5zLdste1RTp6BdMY+fVBXsr6e697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xutnb+VJ2M9KfiTnEqL/AMLrO2+q q+zktHNidybW7MwyyekBVek3lX6ASbhGseCAfbK9JdB8wR/g/wBnpLdj9OtOB635t87Sh3Z1DJOs QlStwZYHTf0T0lwfz9C1/YglHDpItDx4daHODNV8cP5zGJCSHH4ntPCZ3BTRg+KKfIY6Z8pTBl+j TRnGxhPz6yPZSv6W6mnwyIR+dK/5On3Gq0r5qR19Kn4q7lTdXVG3a3WJGfF0yyHVe7RxhDf/ABK2 /wBv7TbmKPG3T1sap1rzfzy+uhW712DIqRxQbwzdB13kqiVX8MeJ7eo8x0tm5qho1aRKePE9hStI wBKqpP49qmPibe/2f4cf5emmFLlPs6+XbmqZqPL5KlZSrQVlRGyn6grI1wf8b+wt0t6a/fuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+690av43ZJ4czgoCbLDnMoVIS2kVNNg9V3tZyTF9Px/sfa2wNLh c9MXOYG62CeqvJKkBcsEUw+oOFurQqSzC/1PsTR+fQclHbJjq0frLo2l+Q/Tme6lrd5bt68p9xV2 JrqbeexqsUe6cDkMBmaLNUFTQVDeghqmiVZVDRs0TMFdTY+5X9lfdq79kfcTY/ce05a27eZbWK4i a1vU128yXEbRMGQg0Kq2GpxAI6Qz2qXtl9IbplzXGD+XQNdr/wAkf5l7nwGaxuxPkF0X8gKDI0El DSf6devqDb3Z2MgkjCxz4js2fb+781TZWDSNEn8XgiJsGW1/fVn20/vNvu8WW47ff8we0PMnKV3H PG8v7kv3l22Vkr2SbeJ4ImjcE6w1uxOBqBoQHrnlDdWicQ3CSRFTo8QAvnzBHn8yelB8xP5cHzdl 6n/lMdV4DHbq7A3h8eIs/tjs/tzroRbuo+nazcfamz83tWugasqaHKZTFdd4MKKeoMK03ixJBaOI J7V/d+++H92uHnj7+HOO5yWW08tc3SQ3G17ZeK1ud0EdhPFdRyLErJDJfTfFVww8cE1cE9X3fYt5 W05Zt4oyZYBl07tFWU1P2dDb8UOs8r/Lu+cfbdL849uZ3tPsz5I5uqn6b/mL1UWa3btfOUtfLFSV +xt3fcQ1/wDohz+4ap4VqJ55B4z46VpP4cIp2h/7w3Om1fe4+7D7ft92jeLbY+ROUbQJu3IYMVvd RlVY/VwAuh3OCAamRAGZmrKB9QSvRnttnLsW9XMe6RtLNMxKXQBbyqQQK04j0z0CP86zpnqbCd5f BOtw3V2wcRWdmd/ZCDsyvxO0MFjqvfkVbunrWOri3pVUNHBJuIVa5Kp1mrMhk88lydRPsWf3Z3ub 7gX3tT97S13b3A3SaHYuUo5NrWa5kk+geO2v1VbRJD+kQURVCA0KqATRQEfONrbLc7G8VuDrk72/ iqRlvQkV/Z0hf5pvVnWnUWE+Ie2erNgbQ652/VfLmLLVWF2Vgcdt3GVGTah23RNkJ6LGxxQyVj0d JFH5CL6IlH0HtJ/dve5vPPuNzH96Dffc3nfcd73m29uGjjm3G6kuZFj1XZEQkkNVQOTRAtQagDpn mm0tbSHa4bFKKboGg+YX/L0aH4lbK2tu7+dL/MZl3lsrbe76Kg2Rt+rxD7s2zi9xUNDkTW9VQGqx xzVBW0tNXmmd0MkVpCmoXtqHsA++vNm98uf3Xv3KIOWuZbnbr+TdJ1mS0uZIWFuIdxPhuI3U6NZS niDSWKqcsB0abRbxz81b6Jo6qYABUYJqvqP9WerXu/8A4V9Ibvo+2u/9udSRV/ySofi32x1F1rX7 brMvjEjo8/19vrEUeBwuycNWY7aNVl8zNuuopRNPSSzt51AZdKkYW+zX3mvc/ZrnkT2t33n0x+z7 867but+JwrFpIb20lMtxcSJJdCGEW6ysqPo7NIHd0Kdw2SxkS7v4rP8A3Y/TtGlOGVKnA+R6oOf+ XB8sd7fyx/iR8eK3YVJ112tsL5R9hdm7t2/2TnKHb5w2zMxFkkxeRqGoWy88lVWNVIVpEjaoUX1o tvfTvdvvufd65L+/L94H3jj5jm3jkbeuQrDabWawheQTXSGMyINfglNIDF5KFSAq1r0CI+XN0u+W dlsjAI7qG8lYhjQhCF4/nw/l1Zftv4Sz4L5+7++alTv2Or/vT1lR7Bx/XlPtySJaCOl2TtfbFbk6 7ck+TdKh5JttNLFFDSJZZQGe4N+fXMH3sRzD90nlP7q9ryeYv3dv0u5PuDzZkZ768uUjWFQVoEuA HLvkgUB4gRLszw7428SXlSYtBAHyp+zolHyDipRurcsjo7ytUVKokYNlLs6/5wnSqj/W594pWxNC C1WAAPyNKkD5Anyx8+n5NIaisSBivVUnc8EVOZGlIUBXUaiHKllK8FLrfUB/rAe1Df2b/Z1eLuoC aDqm/wCZ0gfaHx/ULpEVF22in/VhuwpZC54HIZyv+soP59hy/ULPQGop0c2n9iB8z0Qn2i6Vde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3R/wD+U7/29N/lp/8Ai/8A8N//AIIrrn37 r3X/09BHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XuuwCTYe/de6lxQl+B9P9uf99x79 17p9osW8rABDe9rDm5I45/P+w9+690PXXnU9XuCaOprXixeJjs1RkaxSkIA5KRp+qaVgOFUEk/W3 v3Xuh7z+7NvbMwJwW3UIo40Alm0qtdlKgDT5ZhwsUBcelSbAe/de6K/V1WRz+R+4dJJZpGKwQQpJ JZb3IjRLkksRcgfX37r3S8x/XW6quJXrkpcTCRdP4k4jqXU/X/JIw9QLDnkD6+/de6UcHV9N4JRU 5qqnKEyFaGhEaXXj0yVMlwpX86PfuvdOdJ1tinOlVzEzWuLzUwIva9vHSObG3+w9+690s8d1fFMA seJzMgcaATVcBf7ButEBx9D7917pS0fUdTG6ldu50FSORK5F7G4/4BH6ke/de6FTF7YrKWmWiyGE q3p41ZImqIryRq/DQtJ4YzJGSebg2v8AS3v3Xugo3H0VjKKtlzmyaPFYjKVDPJPFUxltPl4mkxsv llXHOysdQSPSebaT7917oF85vXG9Y/eYyjirsjvNoZoVmrMfVY3E4nzIUNbAK1UqcpMNR8bIFivz c+/de6K1W11TO7ymW8kjvI7ABTI7sWdi1vqSb+/de6ZGmcliblv9qPI/H5/Pv3Xuu1fyxvBIb6/U jW5SQfpYDnkfQ/4e/de6Z5UKMb2BDFWH9GF/94Nr+/de6w+/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rYa/kJ9Y/wB4+1c3uCWmDyS5XCY2 iksxZ6al+7my8QsNOhKivxzkH6tYj6ezXaUrLK/otP2/8V0zMcKteJ6+lFhMMuE2LiKNU0+HGU6W A0niEX/A/r7P8gYzjppgCFPlXqlj+Y1uZcVsTOyeQIWpKoL6h/xzbjji/Hu6HGr5dJZBVlT5/wCD rRZ+GG3j2Z81N6bjMTVMFBl9016TEalWoy2f/htJyb2ZqSOa3+0g+ybbU8a/Z/IVP7el1yxjtwvm aDr6nP8ALk6/Gzvj9tEfb+N6qgjqn9IBN4106ja/IHtRuD1dqnietW60jX1p0RX+Z/uw7g7F6767 WUSQS5mCqroSx8fgoNWTl85H6IWWiCMTxZvay2AijLnAC9J5jqdF/wBXp18un5s9wHvj5U949oxV ElRjNzdhbhm28ZDqaHa1HXSY7alITZb/AGO26OlhvYXEf0H09hCRzJI7niST+3owAoKdFX906917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vdXj/wAr7dD0ux8V63vs75Odczx3J8cMPYmyt+7ZqGXiytLU4ClDc+rSvHHs02ptNyn+mH8wembg VifHl19O/pmlTdfx92zUsolFVtWjJP1uwo0Um/5N19imVqOFrx6QxCqaq8OtBT+cjgj0/wDPL499 nRIKSDDd0Yqmrar9Ijo8rkKVJ9Z49Bpo5L/4H2VXvZc2M3DuA/n0/GA0c6edCet+H+Wfu07h6axC NJ5TBDCg9RPEkAPH+F0913Vez7D160NV6rl/4UM0ddgfj1newMUPHldm7fyu78fOtgY67ZjRbro2 DMCBpnxQ+vHvdq2qxloOCk/sz1aYUmiPz6+Wf8hMVT4PvHtnEUhQ0uN7C3fRUxjR44zT0ufyFPCY 45LOiGOMWB5A4PPsMnBI6V9A77117r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XujI/HksuexrAkBc6 q/U2BlpYSbDkAnwi/wDX/YD2otTSZT5Dpm5/sW62D+o5ZnjhBmVWk8JUFv1Hxj6af9f8+xVGaivy 6Dz/AOi9XM/EbJbhoq2ipKCtenjkmuSLMhva40uhDX/pb36VQyN60P7em7REorsfP+XVqPxJ7i3P v/I9y4zd8+NZdgdl5TaeIqaenjoT/BKGOOWnetYMqTVKknVKQtx+B7Ouddj2/aIOW2sUJa7slkPz cmh/nUdEXJ+/X+6PzLFesoW0vTEv+lyRn7B0fWGrjkJkpJPuoJFScSwvBNEWsQxRo5mugH+B9x1K pAbWtNLEGopkcePUgwvqVCDVWGCMj+XTfkCDTyqxkiSVZAy+NxFIpFrOtyjNyRz+D7YBIcFfKnAV 48O4dyn/AEuetylSpBA1ZpUenGnRb9/bdx2Sh1VUFDUmAI9M1ZQU9S9O6lWD07Txu1PLdAdS2a4+ vHs4sr28tGmS3u5YI3WjeHI0ZbDfGoNJQaj+0J+zpIUW5AaWJXQcO2oB9eHRf48RiJMpTtX0dDkJ KeqaWnatoaetNPK3DS04qIpBBKwQAumlja3tda7le2P1BtNwmijlYB/DkdNVKgCQIyK60atCSK17 emQkcjiOeFXodYJXgR+VejMbPloIlSaOkijll1GadIoY5Z2HAknkVFlmPH9sn6eyOae6MUUDzu0E KlUQuXXPEqrdkYy1AgBxxr0vtlUeM6oqysfipxHp0O+Oq4jBpSNy/jSx+qD88WIBP+w9kUqMgqww OjCNgBVuPQWdkgPEtQYmDQVGpFBQE2Xm7H0gf4fX2/DRVAI8+mpaHjw6C7IiaOieQKqSTUksjP6u DJCw0qeGtc8+zS3cCROIHRZchRw9D1QL3/LWNu7ckMih4xVVBlKglFCM550g3Or/AB59iKClWI4U 6KX+L8uqpO5dcoqVVGkkcyOJHRl0BbFhp5UEEkf4/wBPbzGiEeZ6uvAdVBfM+Lx7N+PLEWaXHduO 31sSvZFVBcA8DiG1h/T2GrwUmNfTo5syDCKevRB/aTpV1737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3XvfuvdH/wD5Tv8A29N/lp/+L/8Aw3/+CK659+691//U0Ecz/wAXjK/9rKu/9ypffuvd Nvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de6lQRF2Cgcm1/9vwPx7917paYjDPM6KU5JUD6i44Nx/rD6+/de6HDA4HG YaFK7KRJKws0NMT6pmUahrAvZBbk8W9+6905ZbsCtqCtLj2SOGIaUEQCU1N+FMSCyyPYWDfT/X9+ 691FwG38nvKqXG0xeoragM8ksrMywRIQ0lRO9yI0iTkkWHv3XujFYHZ+I2rSLS4qEPWFQarLzIpq 5z/a+19IFNTj+yFGo/k+/de6ySrHGW4M0rsCLetyPpcswtq+v1vc+/de6c8VgMxmpGgxtHNI7gRB YUcgFzb9x7BI04vybe/de6UtRt/EbXum4txRx1ag2ocdNHU1MLaL2lemDpE7fQhjcfn37r3TPP2l hMOAKHBUtWFC6KvMVldJ6wWvJ4opoI2Lj6i4v7917p4oPk0kYSF9nbBqyhX9qfH5xTIBcgGeLMqf 8Ab/AJ9+690I+C+RXUOcYU29urqrElyEOU2Tm2nEOqwaWXD7hS8yxgg6Y6pWP9D7917oa8T1zsrf ONlzfU27aPP0ieupxMqGhzFA310ZDDTaKmBwPo63Rh+liPfuvdAz2D0rR52jfH7s29FVKq/s1DIR NTOb2kpquEJPTsP8CP8Aagw9+691XB290RmOvVmzOKmqMrttJLTSSIv8QxIkbTGarQojqaNmsonU LYkBlBNz7r3RdiS9g5vYfWy6v8ebAn/X9+6910KZnt4rSf7SPQ/9eFP1+n4Pv3XumurBEsgIbUCA 17/rUKDcWFje/v3Xuonv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de63NP+E4XVkc+PweWeMytlM9VZksY0/aWWqbESQo49bW/u1HIQfprFvr7 P9pWkEr+rf4B0nlP6iA8Ot8PdFMtHt1VUBQlKqj6g8IF/F+bezXiD1puBBHp1q9/zfN8R7b683ZP 5hGKDBZitPIAX7ajnl/2HCf7f3uQiO3namAp6SgaplFePWst/JX2HPufe+d3FUQtLLmd14XGJKy6 nl+1gFbVm/5P3WW/249otiQhJ5iPL/J/s9P7ge6NB19VjofbMW0+ndsUgjEQo9t0SsNNtLfaoxv/ AI6j7RXjl7pYwfPp9BSOny61Yf5qHb9TtnL/ACh7NpaqKKXqvo3sWqw1RNd46fc2VxVVjNquAARq OahjSx/Vrt9D7M7xvCsZiOJFP8nSSIBrj7Ovmi1s7VNZUzsbtNPLIT/XU5N/YR6MOovv3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917q3 z+WZXUq7Q7lpZZ1FXjt7fHndFJTnXqIxPZL42oqU/wB1AQx7gCNf1/u+mw1e123mlwn2j/COm5f7 Nx8uvqg/CA/xj4x7Alb1+Tb8UVyL3CRlf9bj2Jr19MsR6R2wHht6daRH/Cm/bAwWbgz8UYjmwu+d v5GOQAAq33hhVhxwbye0O6/7ixv6P09Ao8Z1+XW2X/Jb3Ydw9LYScyF/ucPhK9bsSCtRSRyMQT/t Mnt3cu6An5A9NWnFl8q9Rv59+2U3B8Q9+0bxh/v9mb4xpBsLjIbUyVMRqP6b6/r7Tbd3Wk6n+Fv8 HTtxUGM0zqHXyZ/kaY5e5d7V8MP28WZyZz0UPlWfRHno0zCXlR3UlkrQbX9N7fj2HiaknpWeJ6A/ 3rrXXvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3XvfuvdGL6DYx5OjkH1Xc1Cv/JVDUn/AKI9v2/9p+XTNx/Y t1fx1DVSE0KurBmMAXTpIIaNDrZb/Tg/63sVRCigfIf4Og8/CTq9/wCFuPFXNBUSNCrxOfS4S4U2 IOm97D+vu74U9N239mft6MR8cDioaf5n0mbqsjT4hd956oyE+IiE+Thp6nF/uSY6FrLJU8DRewv9 ePchc3JJ4ftwIEDSGxUAH1Vyxr+R6j/lDwx/rhxzMQgvQxpxpQ8Pn04bEk6q23FNWbP+TO9cEs3U mQgjx24cdPLU0dJHIlFDmYVpMhV0U+YpfA5ZY0kIUagh0kBJuke4zqsNzy3C4ScHUhFWDAgDNOB4 9K9vbbLVv8T5knWV4XPhuDQUIJOMVAr+XQ25HdWUzeLya7a+VuAgyNb1lt6fFJlqOnxsNNVSyQUs e4pTVBDRw5RImcuA7+WYoQAq+w823LbywC+5XZv1mUaWAqRQgCh9PWnA9CA3wnheSw5nQHwVbuHk aior654emei+b2yfcs2SyctJ8juuzQU3XtFVVFPJk8YZqfcMYpzU5aRXhTw4mbyqQzAHSwNrc+18 MewyReK3LsyhpTpIGoEYFK141Bx0jnuN4S70jmSDw1tSnGlXOVYAClBXJ4/LpOdcDtit37svJ57s vam4dvPgpWyGKw2Qomkzc/jnp/4zSQQ06TSww1OgGxsbkj/FHuv7qis7qKHbHjkEvmKaMD4v9R49 KNpl3J72ze53JGg8IcCSXpgkeXGvHo7WK7p6swMDPld8bfpIaLJQ4iqklkkZabKVflkp8dO0UUgW plSF2VTa6gn6ewWNm3G4ISG1YyEE0p5AV6FzbpY2a6ri4AQnBrXPpjz6FPIfJfpza0Vb/Ed4Qucf l6fblVT47HZGtqIM1U0hroKFoKajd2kalXWWF1sRzz7SLy1vN0UCWpIZNQzxANCfyOOnn3va4VkL 3YqpA4HzFf8Ai+gA7V+Y3WbQ0dHjcZujONXbyTaMX2uPangau89bRT1sRY+Segp6vHyIzIuosOB9 fZlacobmSxuJY49ArlgPMCmftr+XRbc807egjWNZGLtpBVSQDQmppmmOs3VHZ83bGzK3PtsnObON Dl8nhaag3IslPW1NNR08Lx5JFmhhYw1HlOnggWtf2zue1vtd6kDXCS6lrVSCB8sdOW98dwthMYXS hI7hSvzHy6pt+RtXjqDP7mqK6pihtU1YkmeoWnp/SzOQWYgXhSMlvxa/tdCQg7j5dMEF27RXqmTt 3ey56rmx206OpyMkNRKlXk2Tx4mnSOQwzxpM3M8oUNoFuf8AH6+2pJauyitK9PRxMvx/s6qI+Y+a r6ifp3b0pgOMxGyN3ZbH6Y/8o8+d7f7Dpa3zTazrj0YGDQukaG1m51cE97IZJqsKUHRpZCkA+09E u9pOlfXvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+690f8A/lO/9vTf5af/AIv/APDf /wCCK659+691/9XQRzP/ABeMr/2sq7/3Kl9+6902+/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de65oLm/9P979+690qMTQtIyt a92/2H459+690N2IoocbQLXzRmSYFVpogvqklJsigH6KCeSRx7917pmyeTqK6Z4Q7Mb6ah0Js1gb wQ/QCCMr+OWPv3XusMMKra4I+hCm6gkW5FyAQB+PfuvdHs+OWylrNp5HNBV+/wAvWSUkUjEDRjaH Szx3/H3M7i5H1Cge/de6Fmr65r5pnj8iKobSqi4up54UXP44/Hv3Xup1P1AtMiT5GptCFWSV2LRg IxuV+gKhQbHjn6e/de6jbir56ajGA20f4TikKrLLAPHVV3pALVEw9dmN7DgW9+690XDdGKr6dZJz GxZmYRA6tN/9VfUdZI5JPv3XugRydJWGU/cCUkngG+kHn6fgC/At7917pPSJLFcgEOtjcX/1iOTz /wAU9+691JpMzpbRVakKsNNQgJVf9pkT6n0j/XHv3XujH9FZ3OY7c02VwNbPSSYuiE/3tLM6RFzU RBKSpQMFqI6kBwUb8C4/w917q1LB9k7d3rgWkzyUVFmKaIferM8cUdQAotMGlKqrN+D/AIc3P191 7ojnyOnxOa21mMXs1DXnIRSU9cVBWOngJ11C0xcJ56mQLawGi3IuffuvdVG5PET4ypkp542GliFJ FtSi4P6gDqX8/wCPv3XuoKo6fpUrf+1zfn+hINj/ALD37r3TPlSvljQW8ixgSkfkkkqG/qwW1/fu vdNXv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu uca65I0H1d1Uf8hMB/xPv3Xuvok/8Jzeskx3XWx5/ANEeDo8nqBR7tlcfQ5aX1R3F1rK6YFSdSEE GzAj2J9uXTZxn1qf59JX/tv2dbXfZlqfCTAgKEh5HA+iG3H0+vtWpxXy601c08+tJL+fFv16DrPs eCGYLLPiKvGQjV9GyEsePNrEEnTVn23ftpspfU4/b01bjVcL6DotH8gPrUZFetXamJbObsrcowKW LpLmJKWJuR6lMNGtj+R7vti6NuZhxJPW7o6roL5CnX0nsn49udZVDACNaPCsOOLCKmP0/oAB7JE/ V3H5aulbdsZ+zr5+v87jseqxXxV+U+Y+6eL/AEk9n7A6xpXjezyrQ5aHflVCWVlbxyQbfmUjkMuo EWJsY7y2m0hSuSf856S21S7t1o0ewx0u697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6sv/l0ZCanyfadFHHqStxWwTNJc6oUg7Z2I y2ABGl5nW545A/r7W2GLhfy/wjpuXCN9n+Tr6y38umEz/FTrx2H/AC6yOf6XNuf6+z3dGpLF9nSW 2FU/PrTr/wCFU2NjgxOccBQTXYGf+hLLnMegP+vaQj23uWbA/wCmHTsdRcfkf8HV9P8Awn6yU2V6 E2PNKWIl6/2fJdvqTLg6R7n+hOv6e3L0/wCJKfPQv+AdNW+JZB8+jh/zn4qaf40ZlKoBqY09aKhf yad8fOs6g3BGqEn8+2NoAMT14Z/wdXuqhVoc1HXyQ/mT1/X9WfIffuwMlp+52xNiMaulmcGjXBYy bGku3qLtjpYi1/7V/YdYaWZfQnpXWueive9de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917odujzKM qWEpVIs7gCE1GyvJDmFMhX6DUqAX+vHt6A0evTc39k/V/fTE9vtWmQSRCOlKyqdQ8llK6CbKbD/E G3sWRmoH2DoOScZB1f8A/CijxtQY3nqvDUawyD1KWWy2DXtxc+/SH9M9UtfgA+fRlPiXI8PY/wAu aakxlPn56TfAmpsJUsqQ5edsRO8OPmeZXhSKsdQjawR6voR7G3Pzkcu8iTqSGNhimKVYioP5dAfk cId/59hkWqG7XH5dGa3NuPrqDH0s28vi1m/LItDj5XwmGpZ9P8RxByWQKz0kNOxp6KoT7ZgjanmP Fr8xYN13OJVCX0mCPM5oajqTv3VZSAFbWKv+lFRUUOfmD0haSm+Km+6ioxU/XG5dtVa7MxONqaSv wOcxLDBVM9MtFSeWNy802JqkQs4bVGy/U3A9ro+at4jcML1gfELiuaNSnn6Cv21+XSebl3aGQJ9D GD4YQdowAainQAdsZP4dZ6TObwyBz8U1TtWvx+QlpcXuCn82E21S02CqoYaVaNnmmjpkRQEa86qG F7X9qrXmzdreIW63CtGGLLqQEgk1I4+v+HpPdcr7XcSGaS20kqFoh0jApWlDn16QO2Mr8c9nb62t NhZM3BuCL7Da+36qTH5aZIqbPxNkKWheoFOsSU5jqWL+WwhJs3IHut7zLue4JJFdyKUdqsAoFeA/ ydUstgsbCWOWCJvEQUUkk0zXoTtyY742bGyWRwG79ubnzUkk9HvipoqOmramhqMg0pSGqp6qmWkW pqB94bxs7iKM8Ae2ZOZ92jCNbzhCEK4HkRT/AAdOw7BtjBqwkgtWhNe6ta5+fRsNjy9K7szbYyl6 rr6iU5qrNblMxjKipoPv4aBnGcq2qKmVqpZ4Ks08dRpd9ICXCqACT98bkAqLdssaxlAB/CSGOfmc 9Hv7nsTVzaISzA/sFOk9vPK7uxee3Htzbnx6oKHE4jO1FJhNyh8bTY/OU7YvJV0WRhgp6ZnpoZs4 qJIWJv5/I1iSfaL6ueUlnkYn5kkH8ulDWsVuAIYlX5gCvSY33/pTrts7Pq8hu/a/VpXbtcm+Kara kqh/EKqjSGh/hFVJUCNBS1Upf0uQwCj6n2/FXWDqVT5n1/4rpidlpkVNMAn9v2V6ol7ro9tTV2fx cdRnO1Vj3JX5mSUktDDWZKOeNYmkkkKDEPC4REJZFH+vb2ewsmkAnV8+iN9SuThT6DquLtfEZR6x Z6lIcHjaGpnlosLi9CfchAGi+9kVLIWCepU/HHt1omaulQB04JagZq3VLnzIB/vL1SSgQP1bk5Fs SwZT3f3NHcE/XmM+yW+oLg09B0Y2Rrbofmf8PRPPaPpX1737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3XvfuvdH/wD5Tv8A29N/lp/+L/8Aw3/+CK659+691//W0Ecz/wAXjK/9rKu/9ypffuvd Nvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917rwFzb37r3TnRU5mlRLXBIH+v/U+/de6F7auGEsmp19CLqY2vYLc3/A/Hv3XulMatqtq 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 D3x1XuXJ0m35919obyyWVw1/uptvywbdx+WmMtTURy1uPpUkTTTx1TwIV0EwhdXqAIqAF4dekbWf kB0kZemut1ix7V+DfcNVT414I6ndORrc/PGFNRV6gtdLNGWlnnZizKL6R/T2uh0+IoYA/b0gndlq Bw6qA+QqLQ5rKUNBSUlJFDJ44ViijghigR5NMfihjUlImbj+p/PsUwLGVBVAB8uiOUl3JJzTqpDu Sq0vUvL65ESZbWIB1hgzaSfSFDXv9fdmA0s3n1uMaaMOPVHHzKD/AMc6ZZ1Kl+n8iwPFmA747wTU oHAUlSLf4ew3ekmck+g6O7MAQKBw6Jz7SdKeve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917o//wDKd/7em/y0/wDxf/4b/wDwRXXPv3Xuv//X0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7rmgPJ/2A/1/fuvdK/b9GZZlsCTdeRb/AF/6Xtf37r3Q6xU4xu266sUFJJUEMZsP1NwSPp+ePx79 17pO1TigmxsYvopaeBmIYFRNUHzTG4ve2oD/AHv37r3U7JUppWaVQfE6iSEgFiUmGoEcgWBJ+nHv 3XuoMAMlj9dVybW+h+v6vqBbj/W9+690bz47bogocou18hIYIMmYqjGyuSqCusEkpiDZQaiMAi5s StvyPfuvdHu3+GpsBj6qI2ngZIJdJFtBIvIfpwFuPfuvdEyyFOaWrrIpFKTRVE0LG4a58p9f1sLr zf8Ax9+690GO4ompMXla2IKGjpaki49QYJYFTyLn8fQX9+690VOojGkq6FtR1MCp54/qvOrk/wC2 9+691xos7uDb0nmw2ayuN9XBoK6ppx6fw6RyhGNz+Qb+/de6ETFd/dm43Ss+WpM1EgAMeZxtJVMR bi9TGkFXc/1Lk+/de6EPH/KfKRaBktpY51A9cmMyFTSkf1KxVcdYtzb6are/de6fW+UGFqFtLgsv ESCSpGPqQP8AaVeOron5uR9PfuvdIbO954SvWRqTbUzTkGz1bGNBc/UrHkJ/xb8e/de6Zds9uZ6o qZcRJLDjsbVi8dNRqI1BNrxsQFLlhzcm9x7917oT8LmWgqjFO3lWQt/nPWrqQfIj6yQVYfg/19+6 90CPb2w4YJlyWLjAoqwS1NCVB/aKjXVY9vrzEbvHz+gkfj37r3RaCCpKnggkEf4j37r3XXv3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XuhD6lw6bg7L 2NhZVVosnujCUMgf9Bjq8jT076iOQumTn/D37r3X1jf5J21Xxfxl21lKinENTkcLhayZANOiqrcd T11WgHBGioqXH+HsXOBHbRqD+ED+XSRMu5+fVg/yczH8P2PmCXCj7WX62/1JABF/pb3aH4R1uSml ievmDfzqd2z7o+Qm3Nt0kraZ6/NTyRQtp80s9ZQY2lMiJYSFDNJpvexJt7LN3Jaa3iHp1eyxG7Hh 1uOfyEuuaXHpja6OCSOoxuKo6ZKtZZlnQRU0dObOJLAsq88c+zm7AjtEQHAXpJbHVKx62Ifm3kpM H0bu5v4lWiOXFTIUlkppRqdfqrS0ryjhefUfZLtYBd3CgHh0qnpoavp18wz+fbu2GpPxK2Oa37it xvXm7d7VEIjC+OHee4KDG08zMiiNnqJdlS3APBS9hq5a3lq3YHoo/wAvXrYUiHWuv7KOlHXvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Vo/8ALQANb35f8de7HP8AXn/T707b/e/aqy/3Ij+0f4R1ST+zf7D19Yj+XLx8UeuxcW/hTE/7 At9PZ7uv9rD/AKXpi1Hac+fWnB/wqnqL4zPxHkjI7dX/AFic3QH/AIj37cqDb/nqHXof9yT66eth 7+RBAsPRO0UVbBdp7TCg/gLi6YAf7C3u+4YtKf0R/g6btaa3p69GZ/nGqG+NOeB/NLW3P/VDV/1t +fbO1VMb/wCry6vc00r9o6+S98/+fmB3uf677yp/28gPsPy/2sn+mP8Ah6VDgOic+2+t9e9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+690OfS+XyNJVVlHDWVKUP8WwFeaQSsKb7xJqqnSqEROhZvFKULCxZS Ab2FnYTSRPt6q4JjceXV93ULSSx4iYORMVp3YsCutmswCXJ1Xtb2LYwVoCeA6DcgoZR1ej8RK/Mx V1ItHog8jgsXRGU3AJFnvb6/j3tz0xbntp0bv4uyVsfya+ZMdN9tPmajIbbr6SGu1Jj58gdutHAl c0SnRRyVNhIQLhCfY652q/IXt2wP+gz/APHxjoFcmJp519xS7UBlgx/tejR7nr980D4WXc3xL23u h66ahpcpmdrVFNI8S5HG1Euar0MVLVVk1KlVTqiMfGxEwB4BPuFZFIYk16l+M9lFmofn0FWV3nsH F4/FyZn40ds7bXDVNFPSx4Siyhp8XPm8x4KqnVqGuglVKBKaKoqImiCFJPTe/NQq/GxwvTwjkLLV kI+zoF+xexupqvM1AfZnfUOYoabdeTRaV9xUjBMNJFX5SlWB69DItcieSFAGUiPSpAFvd1eLUKhj 546YMZVjVVr8h0lMH3Ps7Y9LSYeh2/2lX0x3FjqSH+IYKtydYtTumhmzVMsVXWVUUkmOhMbxDSCs Unp+ntaJEIB1H8+k7wyMxIXHRrOme9cbvbO4bARbQ3xhP4ni6yujyO4MEuOoaeopK2amfFVTGomk hyEsUJlj1AIYyObm3tI0i5p1cQoKd5r0K69w9mT1max+B6T3DVPjjkosbkazKU9Hi8o9F9zHSmMt TIfFkngUpY+kSDUQLH2if4j0bJDGY0Os9BjuXdfyi3HPCZevdm7Ew5qUE1Rmc4cxX+CTGTSKI6an qSqzpkQqMLkFRce9D4lHz6bmjRACrZr0Fm8tu5nMpHF2L8iZ9u01q2kq8Rslsfh4Ps8rh4Ycdj5V WRq18pTVlNVSeQXDBgbDTb2oodasDSh6QSYIOgHHVT/yM3g9bkcquzsLl87C0aUqZevhnxVGIIAI oatmrViqar7gJrJSMA34sDf2KYZSI1WKME0/n0RummY+LhT1Vx2Jt7Is0uT3JkFapjiqFgho3aOl iV1dSBFfVPJJGQAXB02uPdvDmaupqV8h1bVGRpjFQPPqm75qG+a6NspRR0nXKoa19K9/d7qDwT9Q PYfviGuGKigp0cWv9ivRLfaTpR1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdH// AJTv/b03+Wn/AOL/APw3/wDgiuuffuvdf//Q0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rPCLkD/ AGr/AHoX9+690J+0acNUwjSb2HHP+H+x/wAPfuvdDpmqW20Yk/tCtgutidSlrtpWwuELc8/n37r3 QcZmNTkplFiBHAUBFuBEqgC1rEWP+v7917pU00X8Z28IQjCvxTllTURJUULLreNAf1NA1zb/AFJ9 +690y06EFVP14IU+q1gBc2uQbG39Rb37r3Qp7fWWkqKKpRpUenVKhGRiGR4iGVlPBVkZRb8cX9+6 91YftXeVPvDDYN6pg6T0opK+P9QFUG8bM54IYsAbj6X49+690iN4bGkrqiVsXLCmQgLQy0dSwhWr WMaY3jlIKpUeOy8+lgBcj37r3Rf977frqLbubp6+kmpKqGjLvDPEFbSCG1oQCJUFv1jUp/r7917o oFYigkAerj8fS3+AsAf9b37r3SenU83ACkH+n5+txc/09+6900zRGxZeCTbSBbSB+Rz9Le/de6hs SL/7Hng/m30ub/T+g9+6911cHkC1h9T9eOFP4P1Pv3XuucFPNUkR08U08jhVWOKN5GvxwEQOSbG/ v3XunL+GZrHvDVS47IUyxMGWeajqYYgVOofuNGF/H9fpx7917oa8Vk/u6Cnqke0iBWa12N7DWGA/ owPv3XuhChEW5sRU4WQqJZE+4x0jD/M10K6oQCWH6/0MPoQ3v3XuiZ7ywr4nJO4iaKKoZ20m/wC1 Kruk0BP+qhlRlP8Are/de6R/v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3XujC/FfB1Gf7468pKZS0tPnIMoAIzL6cOr5aS6BWuvjoTe/AH14v7vGuqR F9SP8PXiaAnr6+f8tHaibY+NO1IFiEYNMioumw8cMawx/wC2VPYrujhFHSSHgeuPzi3CMT19m28h UrRVLcH+kUh/3v3eP8I61LhW6+X783sk/Ynzv2thA5l8W4NtU7qTqsKvcs2RmFvob01OPZRd/q7l EnzA6fi/TtXanl19Db+Rztf7bZM2QMdiVp0Daf8ABT9R+ePZvujFY/8Aa9JbMfEfn1Yp/M5z7Yfo TcpD6XegqAADa5WlmYD/AGJt7L9pXt/Pp24+E049fLy/nrZcTfKzYm1fK8j7F6F6729MrABEmqZ9 w7m/aHBCSRbiV+VU6mPFrEl26Gt7N8qf4OnYRSNeqTvZf071737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691Z7/AC06oR5jvOlKk/c9 ebPOof2fB3z03Lzz/avb6e1Vl/uRH9o/wjqr/A/2Hr6xn8uKTX8UuvCPp/C3F/p9Lnn/AG/s93PM sVfT/L0ltaaGpxr1pp/8KppP2dxLfj+LbYT/AGJzNEbf7x71uX/JP/2w6chp9Sfs62P/AORcgTo7 aqL/AGdsbXCn/aRjIgv9Tew9u7iKWx/0o/wdM2vxPjzPRjv5xRA+M+4WI+lLW/48Ciqr/wBPafav gb7f8nV7r4V+0f4evkufzAf+ywe97f8APdZQ/n8sp/JJ9kEv9rJ/pj/h6VDgOice2+t9e9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+690Yn47Yqmy+cz9NVIHRMdS1KX+izQTyvC/0P6ZAP8AC3u8Zo69ePwP 9nWxH1PsvabddRZ6g3xBDvXbNLtau3DsHPRily8+F3ehO29y7QrKZJKDP4aps0dSjGCoopkKurKV ZhNBckuY2yhp0H7pA0chB6uq+EOOWtjgqHZSUm03lN2BAXUVA4sLfX+nt+f+xYj06RWaUBlrnh0Y z4+0tLN8tPlzjckiS42sxu1WyEcZZJTSvRPDOY3QeZJBGP1JyPY55so3t5yM5+EGQH7RxH2ioqPn 0C+V/wDlfedK/wC+4j+Xr/m6ODj8z11j4IsZtHv3s7bLYpJZzDlxXZuhp4pRNBTUMcO6MY8MkNO0 LOqQ63EY54t7hyYofhGepaiVtP8AZk/l1zqs9uXJU65HZ/yK2PmYHo8jTyw7mw2OeKTI07+Jq4NR VVJNFHT1KESR6Quk2BAsfei9AKAdXEY1AhaHoNc+vbxaWeXfHVmYp5poKoTjD1dNOuHnSkAWA0ks 0bpVaJirsxX9wctpN7wlmeox1qRkB7hmnRdng7flzXgp93deVMEFZkGDz42ur65oJagGhEgiihgh lpI9SXUWN/6j2s/WrStT8uk7S6WIXA6HnZeH7plpKBa3fezKeYoTWPjNpVMt3+4nOim+5qbGP7fx gu4Da9RtYiyJhKNVWxnz6cjKGtB3dDnQ9cb5rnzK1/cG6/s691qsdBicVisfNh2aViBT1UgnlniW FyipJdRwbX59onoTj06Wp8KjpH7k6Xx0aQ1GU3VvzctdS1VLL5cru6tSOeop9DJPNTY9qelBlaMe RAoRubAXPugBPl14nBI657R6w2Zt+oo6fEba25RPKjVMkrQ/eVck0VNPeeSsqdczT6ZXu4IY6jc+ 1cfxKTw6QuzFxQ0x1SD8uOxto0O9NyUuProcxXxVMsIxuIVq6eKaFqtfEYobRQRg07KWcgBgLn2K EmQRIoyaDh0UPHJJKxZxp+3qoLsPKbzyWTyFbuHH0OBxq0kyYnFecVGUqGDC9fOR+3GPEG9IJsrC /PupeTjWg+fWjEoxUH8+qgvm0iLlugWQf53omtlc3vqdvkL38C3+xCj2H7ogzMQa9HkApEn2dEl9 p+nuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917o//wDKd/7em/y0/wDxf/4b/wDw RXXPv3Xuv//R0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917qVSkeQA/wBf99/vXv3Xuhj2dFprqcG9 tY5twQ1uL8kHn37r3Rhc9SadoVMoAV6WWmmAsdTIZ11ekWudJ5/p7917oH81CBWwSixjqKZWvb8x llbkAWYAc39+691lxtRNTsksUghkWXXG9muXFtLEC45AsR9CDz7917pa0lHhM7KktRXU+3K0MPvE q1l+ymKm7yU7QLI0cp/oRYk+/de6XUAplkqTSya6eOFIIZfr5QAFEgFgf3D/AFv7917oWui81JUT bixLPrShyMckQDgPGlRGAbAf2Qy/7f37r3Rms7TnLUy5SlLvWwQiGvgD6Xl0BV86WX1sFX1f19+6 903RYuj3zt/I7XzSCRayhqoMfWsqmpxlW8JWCeKVgT4tY/cjJ0sBb+hHuvdVbZvDvjq6sx1cJI6m hq6miqI1Cm0tJM0UgAa3BZbrf8e/de6TL0uPL3eerQNcsphiYXH9PWnAI9+691IiwuEqSFbMVMLX J4xyta30NxWKTf8ANuf969+691Nh2Fg6lwzbtkgUm51YNpf9iFGSWx/obi/v3Xuhx6o+NG09/wCY o8fUb+y6xySL5FxW1aeebRqvqH3mehijAH5b6f09+691b50z8KPjNtCkbIZfJb4zqUAWPI5CtTAY qgWtCeQ00f2sU07VAVrlfIwUHn+nv3XuhS3D0t8VM3TNj8cu5MIzLJFFX/eUGbp3Y3UNU4ySjp1a EfkLIrafzf37r3VdHfXw7k2IGzezpabIYPKF5cZk8SkpwmQnW8klBKjAPh8yEF/BKF1/2Sw9Xv3X uiK4uqqsXkWhnWSGalqGR4JAVaORH0yIVsSCljx+ffuvdJruXAxTLNW06L46+njzlPp50TFlpcnH cgaf8oRHt/tZ9+690Vf37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3R+P5bW15d0fKfYlNGWVIJ5GnsuoPT1i/wmaNv9SsiZLST/j/X2qsl13UA8tX+ DPVXNEf7Ovr7fEXCDA/H/YtL49DHCwSuALHVIisb8f4+xDdEmRR0zEO2vREv5lW4TjOuNwkSaCuP qub/APNlvz+SL+34wNa+lOmpvhp8+vmpVhO8/wCY3Gx/eSg3WkhP6goxG2nqObXtpqpBf/H2UQjx N2Hybp9zpsz8/wDP19Nz+TLtz+H9Mw1hh0+aSKx0kD0xsRa/9fZhvLdrgdM2gGknzr0rf5tub8HV SYsH1ZGsp6PxBtBf7uogpAgY206vPa5+l/dNqWkSn59auSKhfn18uH+cVuiTdH8wLvGRqiWeLCz7 P2zBHK/k+0G3NhbXw1RRxnUwEUFbRygDjm5IBJ9kF42q6nP9I/yx0qjwi/Z1WB7TdX697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 sy/lrj/fx91f4dc7XP8Atu9Om/aqy/3Ij+0f4eqv8D/YevrI/wAt8/8AOKXXo/6tjG1/8T7Pdz/t IiPT/L0ltvhyPM9aZ3/CqRiYdwn8NuTbSf7BcpTH/ex7ruR/3Xj/AEw6cg/3KP2dbJ38jJSvRu2D YjTtba2j+tv4bDwT/W359vbjm2P+lH+Dpi2+JvtPRhf5x7W+Mu4OfrT13+PP2NR9bc+0214Q/n/g 6duBVR9vXyZf5got8xO+B/TfWTH+8p7IJf7ST7T0pHAdE090631737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Qr9R5ivxOayTY+pnp5psdSlRCofW0WcxOvWh/UopJJhb86re7L8Q68fhb7Otlz497n2q3W G/MNuRKvMboy23+rH2DNRpjKT+73936xMfk8TuEVUjZCsiqaeRJ6KakAR47xyqrRguIrdtMugpkg f4B0QTD9OT0r1dn8G8fQyU0LT1TU86S8RM5U3sur0i4YH8e10orGwHHpJbf2eeFejAdCkwfM/wCT 8UFTTQVC7U2hXQ1c5/yeAhKnRVTvqTVDBpDuCwBAsSPY45rBf235PYYAuLgU/wB56AXLbke4vOEX rbQf4W6OnkJvkn/B8RWQYjqbs6FsdhxT5WNoKGKonMsq56thgaamiSGah0CnCSSEMzAnTx7hh/i6 l+NCVBWUg9AruuTeVLt/H1+a+IWD3BnYMTVSZGjwMmIkioqivy60dfT49rJUz08mIT7mVVDa7BAS b+66WFMdPs5qoX4+gtztVjK/be4kyfxyzuGw+BhyONlptc8NbVYzB1M1Rt1MRQQyNXV9Pk65maJI b/bhtTC1vb0RUUDQMxr5dUZKn9Sn+HPQNzZbA9Wxbd3LsDqPcmRr941lBiMtjqCHJpkdv0KQrUs+ YGS+6enjonm0MVVdcn1P19rG0oiv4D1PSUx+K7KcdGM6V7i3lu3N4fH5bqTdO1MJW0+WWoy+WJkm oMjQ5CeClpp44YYU+1yVHCJo5RdRqAN/aFi1G7cZ6eS3Cn4+jMYDdfaOX25vdzsSPDbjxn3sOzKf IZGL+H5zwPVRUNRVVKOWpoJ1jjlJsoCvb8e0PSxUCjLZ6CzJ5Lt2DFb+o+ydxbD2wMjEsWyMthq6 Na7bxloIo6uoyCV8cNPUPT18uuIsztYL+Tw4gp3Hh1t1XGg1HQG7Nn2Jid/bd3Fmu398dm7sw0Nd JQ4zAJV19BBLPixS1QlxWMglo5oh4TwxJTUb+rn3YMCVapwfTj00xrxjHDqrHvePK1O4dxVO19pY rZVLkqieqfI5anjmz5qqqsmqKgyUUOpFaZZNQDzGzkgj8exPbguisEoOiCbwRKxdTX5cOqzOzNsJ TVeSyFVVVOUydTC0c1TVOCI4BFc09JCtoqWnMlyFW5PAJNvalYwtamvTYZThRQenVMnzemVs70RS Ciq6R8Z0S1JM9TF44qyao7y7vzBqKN/93U6RZVIWbi00Tr+PYYn/ALVuj+IgxoR6dEj9s9Ode9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3R//wCU7/29N/lp/wDi/wD8N/8A4Irrn37r 3X//0tBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de6zQNplQ/jUP94IP+9e/de6HzZVP9w1HMhuUlSO S3FgLPGSRawaM/1+o9+690ZbL0qSbZzUPq1DHiRBpUC8ZSX1E8gWX/b+/de6AWuXXRQSHkwzSRgk i5WcLKV4A/1JPF/fuvdNsNwtgSCp4YMfz6fqbcEe/de6d4C7lbMdcfNzcEqpAALi/q9XHv3XuhM2 +DLSEXazFbfquulWAa17fXj37r3So6DyRg7Hz2Pcm1bRvItjb92Bw9uQLek/X/G3v3XujkZOomoJ xPE5VJlRiCWKmxBJsPyP8CL+/de6W2x6nDZTKUjz6aCp8y+dlCaXVzZ/PBwD/wAHHPv3XuiQfJHq rMbb7b39TUNA9bQLl1q4paD95zHXUlPWAtALyBGMxIIBBB9+690VGtoKiF3R43ia4uk0fhYG5HIe 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 Ux69Uk9/TrNncuyuS5qKkq7uBYszsxjZgIwxI4AufYri0kBVFAAOiOSpck9V5Z7aub3znKPbm3sV kM1nM1WxUGNxtBSPNVVc8jrGixRopfSW5dyAqLySB788ixqWc06tBG0r6UGeri8v/K16d7g+F20f jJ3vg6etz+KpMrn8ZvnCCKDdfXO/M0+SqP4ltfLr6p6egbJeOoo5zLj8iIx54X0xPGFZXDuzAdCK NdEYQ8etFH5rfD7s34O9+bo6L7MRKyXHgZrZe7aWmakxe/8AYVfW11LgN4Y2leeqehFc2PmhqqRp ZXoq6CaAySCMSO31bopvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6P8A/wAp3/t6 b/LT/wDF/wD4b/8AwRXXPv3Xuv/T0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rtTYg/0I9+690Y/ qB0qa2lpZWHjq3Wmu3ASpUGWldiVIAe5j9+690cTIYeQYnJROmlmx9TGyMBrFoWICg/2iw/P9Pfu vdFSqYnOKqWUFXh8M1zb0mMiNiB/ZHqI49+690zRKHCul7OB9Df1WJYAi/GoD37r3TxSRuHB1EfS yk3ux5IIPBLX/wAbe/de6FzAxk0xKoRpKCSxGohlILC9iPpz/t/fuvdMXWlc2G7ix13ASrqjRudI 5E62UH6C+oW9+691YNlaVp6BtNnaBuVt6WRvqfSbG1/r7917pM42VqWvpyqvA/kQCRSwAN7XJ/33 Pv3Xumb5eVeUxu4NkdiYedmpt2YGXEZEMh4zO1Hjo2fyKb+WooJ04vwIvfuvdFXpeyoKkaM5iqOr BAVvvKGCvSwABH7ieXn/AF+T7917pZYuu6tzEimt2ZiJmJ1MaGasxTlSQPQIJlRTq/NiB7917ox/ WnWnSO5c3hoqzaWdoIZauIu0O5J2iCIVdtMFVBOGWyf7z7917q7qfaHTG0+taSgnxdYlHBsypq5f 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 8KldpbfTAfD7e0dKqblfNdvbakrlEStUYJ8bsDKRUlQRH5phR5GKR4gzlYvPJpUGRiddMsKGnWn5 791rr3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuj//AMp3/t6b/LT/APF//hv/APBFdc+/ de6//9TQRzP/ABeMr/2sq7/3Kl9+6902+/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6Gjp+tvmY6HWVeWRfCQbaZYz54GH4BL Iyj/AF/fuvdWb0kEOdwMuTU2miop4MhGo4SrSnOmSVb8rODqBH549+690TSfE+SOtjSMh2eugfnS GBZ3RmAFhfUP+R+/de6D6jVlJhYEG+kDldLD+p/oQP6+/de6UVLGdQuQL/Uf6k/Xm4v/AEv/AF9+ 690L22ktEIxbgoxFh6ri1j+ALfk+/de6SEFA2L7VwcpRvHJkoSt9Q5ExFvoPoG/JsffuvdWVUtOJ p/E6gxzoqcj6MVVgw4H4J/23v3XumxdsSDIR3RtKz6wo5bQl5CRz+kabe/de6TfbeEm3Z8btwXiM uQ673dSbpikvqqI8Vl1lo8iNR/TEEd3a3+oF/p7917qtoV8dKbskMp/Ie5cC9iQy86h7917qVBmK Vz+27QyXsolNo7kghVZRYfX8+/de6G/p/J5aLdtHpralI/G5i8czhDrAjUhla11LW9+691b73J2Z kHx+axUVbLGn2O0NsoA9wD46eFwCfSCzwi45Jv7917qkX5S1+fO76FK2rq2gmxVKI1eR1iJpVanl UKLC6slvfuvdF1wkvgqYtRPqZQxJIvqItcWuT/sPfuvdD3tOBhk4VH0k4A4N1YEg8fU3PHv3Xuj0 bkpziPiZv6SrOls3uPYWOo0kF9clPlZMhKUvbSy09I5JAvYG/Hv3XuicYqIwdeb5qyAEFJiadWIs CZ8pTsoB4sf2zx/Tn37r3RId0i2bqxe/EN/8CYkYj/bn37r3Sd9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdeBI+hI/1vfuvdTIMjX0xvBWVMR/2iZx/wAT 7917pd7e7f7R2pb+7W/924K1hbE5/KY4ELIsq3+zqoL6ZUDD+jAH6j36pHDr3Qi7Y+WPfu0MvNuD DdiZhc5OsSzZiuMGWykghIaENXZaGuqf22FxZhY/T24kssZrHIyn5EjrRAYUYVHz6sg6w/4UI/zX epcPBt7avyfzIwVLAaemxeT2l1/lKamQ+PmE1m05Z1cCPglza5P1JPuxnmYhmkJYeuevAACgAp0m eyP55Hz17XyeTz+9d9beym5MlhslghnhtHCUtbRUOViSKsNJFS08NAKlxEpWWSGR0ZQVIPt47hdm NozL2EUOBw/Z1Two9WrT3dU/TzPUTSzyG8krtI5/qzG59o+nOsXv3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XurJP5cD6d19xf XnrPD/RiBx3J1IeVHDjj8/Q8/UD2ps/9yI/tH+Hqr/A/2dfWN/lwuf8AZUevP+1Uwuf9j9fYh3H4 4c+XSS3HZk+fWmp/wqjAeOT823Rt9/p+TX6B/r8E+2dzH+JD/TDp6HNw32dbL/8AJFUp05gl/ptr biccWIxsIsP8PancBS2I+Q6TWo72pwr0On85N/8AnGXPJ/WnrrXP/TBU8n+tvaXbSBG+fX/B09dY C/aOvkt/O2/+zffIYH8dsb3H+23DX+w/J/aP9p6UjgOile6db697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 tM/lN5WmxfyKoGnk0lsxtCUR2a8kUNbk0lsQNI0moUc83PH597Xj1v8ACwHHr6au0IoK/beDqqdl likxGPdCLEsDTRcHkgMCeR+D7UdJPAY51U6WsFNZxpWxMikal/I+liOPevn1ZIipNTUdKGkj5CyW YEtqUi4YkaSCDcEEf7D3V2IApjp8R+dOs8fVfV2TyQz+R2Zi13A1ItI+epKWngyZpVdZEgeqSIzy RLIgYIWIvz7cF5deElu1w5t1NQtTpr604V+fTQtrfxjcC3T6kimqg1U9K8afLpVVPVe1KpAKXMZC isdPimplfUrCxDSIQXF/wfdDIDknp3wc6qZ6RmQ+PlPNeSi3PFpbXaKSBw1+bFrMlrA/4e9ax1ow auI/n0Gue+LWXrQzU+58egdQBqpXe1jzyZRfge7JLoJIXHVfpsgq1OguqPhLuOerNQd74xUMusf7 jXuv0uNRqVH49vC8YCgXHVWslcgs2elthfihk8YIln3hRy6C2sx0ZQ2ufoROx4v+faV7sOCGQ9PJ DQEO+ehKo+hMdRx2rNyyzFQqkQ0t7rYggMTcjj2mZwVIA6uoI+zrI3THX1PL5KuiqssVkuVqZAkR I5/zagC9h+b+6hmAoDjqxzjp1/heExMAgwmGoMUioygwwxtNpB/syFR4zf8Ap70WJpU9eoB5dJPI Qoxcm5uVuSLm5HPP+PtwSY7uPXqCtfPpK1NMpDEAkgiwt/Xj6/4+/KxLEVx1ujNhekjkmiolVp7K WYxRRqC0lRIxssUSD1M1z/sL+3CaA049X0MQTw61uf8AhS1XbRx3wm2jiN1YGOff9d37stNlZM46 Gpm22o2vvus3LRpk2mSbHR5PD0MSyKiyLUMihgNCkVUkip6YbjXrRW926r1737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3R/wD+U7/29N/lp/8Ai/8A8N//AIIrrn37r3X/1dBHM/8AF4yv/ayr v/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917pRbVysmHzmPrY3MbRVETBr20usgeM/6wcD/b+/de6tY2bn6WlgbI yW/gefwqiqAIKxNNGD5QCbCWmqCR/ja359+690FFVhlhyFdEFLx/cLVROq8NFISLggMDG6sDe/IP v3XugmrsQ0dXURtGSEnkjEgW5BDtZbAhvr/j7917rNBQyIVdlJUkDUq/SQfW63Ngb3APv3XuhS2v BqZVIK+SyX/H0J+g5JH9B7917rLuvCtDmsBlqaN3kp66jldVGoyJ5kikXVc/QLf/AA9+690fShcC VbEqwjibn6raNLq4/wBptb37r3S4mjSooXrE0+bwmFyBZ11nSWBsbHSTY+/de6c8Dtim3Btreu3J R/k249pZOiqfrctBC80br+C6RNJYH+vv3XuqQc3jqjH1VZQVcRWox9VUUVQrcFKilnanlDEAEnXG ffuvdJV2ljLf2gTYgcXN7gXJvwPfuvdC51HnZsZuSBoZ9KeJ2amnUvA+jSfoSdJ9PNrXt7917qyf uLc1JXYndU0kzY6eOPa+4UnBMtEaenmoKh53ZB5oI44JixazAAG549+690Evc/Sld3V1DT9hbJpV y+a2tD97X0mJC1r1lKY0FYtGaYyGbyxjzIv1LgqbMRf3XuqxqPHzJKpCEqGUqQOAF4N7m4ZW4IP0 9+690cnqXZVVna/b7RwPUSVcscSRRIWZ21qNLMLk3v8AQX9+690Zb5f1cOz9r7G6WieNszQSf303 nDEOaTJ5aj+227iZlU+magwsskzp/YNSv59+690U/d1E+B6Xw0TgJU753kUhQ/5x8Zt2jZpZNIt+ 19/WotzwWAHv3Xuq/tzOHz+W0m6pWzQj6HiA+H6jg/o9+690x+/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917qyL+XH/wAfR3Mf6dX4s/63/GY+pOfofp7U2f8AuRH9o/w9Vf4H+zr6w38u Fr/FLrwf1xbfT88n/ePYj3D44j0ktyQhPWnB/wAKofSr8fXcu27/AOH+5IH6e2Nz/wBwQa/jHTkP +5Bx+HrZi/kmEHqDCMD6Tt3bwBHH/KBGAbfQc+1G4/7jv9g6YtfjbFMnoZ/5y/HxqzXP/KNkD+P+ VGouTx9L+0u2/A35/wCDp65+FftHXyZPngLfMH5Ej/v7W+f/AHoa/wBh+T+0f7T0pHAdFI906317 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+690e3+Xjk6vHfIXDGmlMalKGocAAkyU+bxkcLXsWGgVLD62N+fe1+I dXTz6+oL0wtdWdfYDIUtXHFJFtigqqinkTyQVL6UjFiCGga7EkqOfap00ED1FeqE1PQtUu4KOGSN coj453KqrsNdE7WPP3KAhB/gwB90HW1yc9L7FiOrCPSSRVERLHVBIkg/JJ9JNh7ZJNePTvkadK6m j0rpIIPp4tySf6cD3XptfiHTzEzfQixHI+oI5/4r730705QyOU5YmzMLfj+n4+vu7gDT17rN5G/w /wB5/wCK+61NKVx17qFPK3k/1rG1hYmw5N7n6+07MQxz1rqGzABifrZiL883vb/W9061QdQZXZ1u eLWFgOP9sb/09+69001rAR8nkuCP9bTz/t7+/de6R08UjlgqMzWP0Hp06hzq+l7e/dXRWaukdJLM VNDj0c1lbBS8Kyq7rJNIxAskUKHyOxA/A9+6uImLDUKL0H9flqyUFcdRMkRc3rciGgS1iQ0NKv8A lEtgf7WlSfz7ug7untMUZJ1GnQfVkRFZTPNNJVVMlRFeea40sZk4ijBKQof6L/sT7vpNctjpp5GI bt61XP8AhVPUyzbc+NYvIsQ7I7NiaznxTyUu3draHZAdLSQLVMFJF1Dm31Pu9KcOkfWmr7917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuj/AP8AKd/7em/y0/8Axf8A+G//AMEV1z7917r/ 1tBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917rsEgggkEG4I4II5BH+sffuvdWF9Fbkp91dc5 fDVLr/EMJRtKn01vSyN45gCfq0UhDe/de6EbZdL/ABqIYirmjbJY8SJSOzKr12PYMwQ/lpKfgr/t Nx+B7917pgz+0poctU6l1IZPJxYraSNeQb/qJP8ArW9+691Fo9uJcx6dQe+r8c2P9b3F+Dzb37r3 SnxmGloXSQBikbKQPTaP/Ai7ageQffuvdCzidqDcNfiqFY0Z2yNLIqj6uokR5ELC91a+oG349+69 0LrvLTZSvgk9DQVssNgwNgrAIQvBF/pYj37r3Qm4CUNKtPIvomjEc3BAR3FwbEG1v6+/de6GTYOM XHbmooqizU1RKIWLjh4ageKVDyw5jY3/AB7917qnf5O7Fl2d3HvbF6LCTJSVyaU0XE7yRVGlfo4F VTyG/wCQffuvdFiqqVj/AGCx/UFH1a39AfyP9v7917p020TRZminU2GsI4vzaT0MLcXALe/de6sN kqF3Vs3bFdUvrpM3gq7YmdmHAgrqGF6JGlKXa7UFTDKL/qAP+Pv3Xuig9O/IDsX4571qJNs52uwN dishVY3M4idRWYLJGjnenqYchiZxJR1EMhjJB0q4BBDAj37r3VkuA67+PHzZkk3VsegwfXHbdWn3 W7dsbaqKWHb2fyL/ALlXnMdhWkAxtXVTEvOkIVWYlit7sfde6MJldndVfALrGHe++cpgc32ikNW+ x9rV08EsaZKUNHSVtTj4nNZlqmjuZFgiXxhrGV1UH37r3VRWDqd3d67pl3Fk5qrK7l3rumsqameo YyTT1FbVvI7S6TpUIp5VbKijSoCqLe691m75yVBXdmLs3DSRzbZ6cwDbWglj4hqczjYnr93ZIafT I1Rmy8Yb8rAPx7917qtaomaonnqH5eeaSZz/AFaV2dv95b37r3WH37r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3XvfuvdWR/y4h/v5e6z/TqvGH/ANjL1F/xX2ps/wDciP7R/h6q3wP9nX1hP5bo 1fFHrw/X/cUx/wAOSefYj3CuqHpJb10n1r1pxf8ACqX0q1gfVujbak/4Cudr/wCHKj2xuY/xEems dXgp9Qfs62Xf5JTW6awf5tt3bwP9B/kEZ+v9Rx7U7gP8XP2Dpi1Pe329DT/OaYH40Zg/9MuQ/wBf igqPz/gPaXbAfDf7T/g6eusKtPUdfJp+egt8xPkWP6dub6H9fpuKv/PsPSf2kn+mP+HpUOA6KL7p 1vr3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917o43wXqail77wrQSUsYakTy/cSKkrLHm8LMBSqWUySh4wWABI jDH6C/va/Ev29XTiR8uvqI/Gqsas6q27I0iSNLsymJZDqRvGsL/j6kfi3tdPkp/pemVw5+z/AD9C 5BLaQAj0lrkXBBBte4sL3A9s9Wj1Eyd40+nTvT0NCJFkhiajksT5qGaSjcE2JY/bMiEg/wBVP090 0DPTiVz0pocrmqCAvTZyaVIU1eHI00NafRyR5FMDk2/J1e9FKA9OV6UVHuvcnh8kuJwVcXRJE+3r p8e7BwLB/PTuoYqb8Age6FW/h6q2QKdO9Lu/IMgFRtOtjcBmP2eUx1VDYfkO8sMzcj6FB7o7FKY6 tXqYm7Gkj8jYDNqCOAjUMh/ob6Jzax/3n234p9B1tKMwBNB1hl3OC1ht/PMS30MdIp+nA1NUAAD8 e6EliSenjBXKyLT7emUbtyUrSKNn5eNAH0yVWTwkQYhiBaNa4uFP+I+nvXVI0ViQzgdRZty5kg+H B0EBKrYVuXVyGvfU8dLFMth/g9/furC2LA6ZF/b00VWS3RVRTyCrwVEtPZiKehqawguyoLSzSQ2Z Ab/097oePT7hFKIVqaceg/r4K+pkE1fuTNVayKy/Z08sWNolFzwyUkSVDn/EyX/2HvWOvSNDHpCr nz6ZvDT0+SH20McQNDcudUkxZZSCzzSM0hYnm9/p7soqwxjpOZST2YXqDk5Liw4JexI/I02/x/Pt +lCetMaqM56QFUmrJ0NyOaun9P8A0/jt/iCbe99N9ap//Cp6spP7p/FyiNXTffTdn92VUdCaiIVj UtNgOu4JqtaTX5zTJPUojSBdAZgL3IvrppjVutOH37qvXvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3XvfuvdH//AJTv/b03+Wn/AOL/APw3/wDgiuuffuvdf//X0Ecz/wAXjK/9rKu/9ypffuvdNvv3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de6HXoPeMO2d3imrn04/MU81BPc2UfcLoIe/Gkmx/1x7917o4eNx89Fk6evxVY plpqgywlZQNcQfWFJubqAOP6g8+/de6GfeGEOXipc9jUkVKqjppKmGMkimqDGPJEVvZY2ZSU5tYE fUe/de6C4pNTvd72Ujm2lgx4FjyV+n+Pv3XulZjMnAxVmiUsq6JkYEqQeNd2tfj8/wBffuvdGX6P oqGv3piCpjaGm89bf9VoqeJ3dCPywsAB/X37r3Si7K2w+3szPn1GrHShp53sTpkZtVOAbfqd308/ 09+690m9qZdlmXyTep21yMGNtb82X9J4bj6cEe/de6NnsTItXPSQlw08EkbRu9mLoDcrduTwPx/h 7917ooP8xjZsVDvfbe8HpZBT7iwlIXlpQq6KmSF3kJ1HTNrqKSfjULEn+vv3XuqwKvHUc4LUtVFc A6oKgGmlQ3I4Eh8Zv+NLG/v3XumOahnpZkZ0kidGEiEjSbg3VgLG9x9CL+/de6ON0TvDDVT1ewd1 VIpMFvf7NsRmJGVItt71owUxdZUA3AosoD9pO1xpDqx/T7917oJPlD1BmttbqXdRoHjizBWhzRiX UlNuChiSGWV9S3QZKnRJATwx9QuGHv3XuiqRY+thnSpo5Z6SsjIdKmnmlpZkZeS0c0TxyxvcfqBH v3XuniOlzGcyCyZKpyeYyEhWE1NfVVOQrXH0SOSprJZptA4sLkD37r3VlnT9BD0r0PurtfIQwybm xkOQxu16d1DrR5nJrDR0UpvcNMk1YjHjhQf6+/de6I/joqhtp9jZWWV56+PaWZrJapizzS1FU6ir qJXsW8kvndmb63P+Pv3XuiZH6n/X9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvdWT/y3xfcfeH+HUuPP/sZOofamz/3Ij+3qr/A/2dfV/wD5bDA/E/r3/tVN/Xnk+xHuPxQ9JIKa T1p2f8KoVVozqsB/evbQ/wDWiin/AB+jH/be2t0/3CX/AE46vCP8ZP2dbK/8lVQnUGKjX9K4PBBT +Coo4re1G4f2DetB0xa/Efz6Fr+c1Jf415pL8/bZG39bnHT/AOHtNt2ImxnP+Dp264LmmR18nn58 rp+ZPyQX/U9wb9H+23JkB7Dknxv9p6VjgOig+6db697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6W3XW98l1z vPA7yxSJLVYWsWcwSHStTTSK0NVTiTSxheWnkYI4BKPZrG1j7ranSQevpU/ygfkJXd2dKxUeTV/u cHg3p4Xc/uvAaWN4ta3IDBAL/UX9qAxYCvp1RlpKfs6tRhW7Aj6alVv9jwbf7H3vrSMKmnEdKCAB Vjt9Ct2/1hcnn6/j37p5DWv29TJgWhkUWJaJwL/4obXP1/Pv3Vm4Hp2opHNJSC9v2IB6eL2jQX4t 9QPfutL8I6doJXWSNQxAFze/4v8A1PP19pbgglQOPVuudOQYiAzG0sotcgD9w3/P+PtggqaHrXXK SXTwDY8cfix+v9feut6mAwem+WZz/ab6Px/sR/X6i/v3XuoJN/rzz/xT3vp63Y6nrw66SVmpMgD9 NEY+n/N5Lfkfj3b8A+3p6U/qIfLpHzRsyrb+pvz/AFv7p0zMpLk+XTFPdMiqH80Dfm4uZzb/AHr2 9ECKnptANXfw6a8hExsQBbyFfr/r/wDFfbrGpJ621NR0/D0iKhoocri3nYIorUldmuFWOF1kdyRw FRV5P4966oeB6+f3/wAKFPkLl+4v5gm6uvb5Gl2l0DtzA7OweOqqmc01Rnd2YnG7+3ZuWLHvNLTU VXk2z1Fj3eMK1RS4imdwCNK66Z6ot9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3R/ /wCU7/29N/lp/wDi/wD8N/8A4Irrn37r3X//0NBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3XussMrQyxyoxVkYMCpIIt/Qj37r3RgNu9jZSmhgikqpToVNEge3FuCQeblffuvdGg2p3dVYu nwRyLGrxdWtTi8rH5F9SJMJoZOR6JIVnJQ/4H8e/de6Wm6KmGmEVfTsk2PrE89HMgBimgZyxdWBK l1Y6WBN1II49+690l8fn4hUazIsaMwV0s3qvciwJIIFr/wBb+/de6OP0BVR09HuHK8a5lixuOa3o E837s+knn1RIBf8Ax9+690Pu46qn3HhJNqykSyRRfeSSBgHjqQtxQuTchIQb/k6v9b37r3RW43qc HkpsfUK6vFIfES40ugYr6Sb8j6/4n37r3Rl+t9x6p6XTMvkgkjKsx5ulrAn8gkWsPfuvdCt87tpR 7y+Ouxd5U0Cy1OHrp8dVOAC8QhnpaiMC1zcx1035HF+PfuvdUM5jFGGR7oOL3DAabf0IP549+690 k5JammN4Jn0A2aN7SRWW1/23BCgji4A9+690p9vZehrFlxtXG1NLJeSGSMNNTF1ABXx8Spr/AKgn n37r3R6Oue1Nv7926vV3b8VPkDLTR4zB7sqJgFyMESmKgxuZrZLCjyVEtlpKt/6KH5Fz7r3QI786 HotnZGUtJU1WGkndaOsMCqwAN1pa2xIp65EsGH6XtqS6ke/de6YMdRYbFMBi6ONar6fcyBWYm/Au R6b3+vv3Xuhb7Vqaqm+K22IJPIjZ7t6tSVWNvLDjsEtaAOP0pUQIT/j7917oru0ZqV3r8NXMkVFu DGV+Dq5G4EUeUpnpRUN9B/k80ivz+V9+690SvM4mswWWyOGyEZircZWT0VShvby08jRllJ/VHJbU p+hUgjj37r3TZ7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XurKf5b3/Hw96n+nUFCf 9t3L1B7VWf8AuRH9v+Xqr/A32dfV4/lrEf7Kf17/AI4x/r/vufYj3LDw9JIPhP29ad//AAqfRpIJ NIJKbu24x/1myKoPr+C0g9tboP8AEV/046vD/uQSfTrZX/kr3TprCyE21bdwIJtb9OPhHtRuGYWo PIf5OmbT4yfn0Jf85qoA+OWXU8A0mRLX/wBScZMSb2JsR/r+023jsP59O3WQPWvXykP5gI0/ND5L L/TuTf4/225ciPYbk+N/tPSocB0Tv3TrfXvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdbkf/Cez5YR4 +qoNn1tYKqSvon29k6Gsqo/M+SpKYUq1MczLGFnqoJI6gA8EPYksCfbiHy6s2aNXyp1t9Q5WOjqh Q5WM4yrkKukdU6CBlkGqMxVQvA5IIP1BB9u9JwCjNQVBPSzpyrqmkhwV4KkMpufoGBINx710+poe ndUVYSf1EoAL/wDBbFQT731dvhPUmgXVRUhuf8xF/vCgfW/+Hv3Xl+EdO1MNRUHg6rf1NtVx/sPa SU1Zft6t6dZacDRKfppqJl/1/wBxufepFrVq9ePXUiA+om30HtnrXUJ1BUf4ox/1rke/de6hMCty ObEcf6//ABT37pyI6SR69Zo1X7Ov9I4WE2sObzIL+7n4B9vSmQVkjBOOkhKlhqB41Eaf6f0t7p1S 4WjhgcDpO5F4YshJJPLFBHHj0JkkdIwC08hAuxAB0re31Pt6I1FOqS01CnoOkXX5uSsJp8LTvXuH s1Y/khx8JH1LTMA0rW+ojv8A649ukUJHTXQa763pt3qrY3YvYHYGeoMVt7aey8tn9xZnIVNFQUGN xWLikra2czV9TR0tLFHTxEDySprawJufeuvHgevlofJ/vHM/JX5C9wd7Z4SR13Z2+s3uWGll8obH Yeao+227iAs1bkXjTDbfpqWkVPPKqLCFVioHvXTHQD+/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917o/wD/ACnf+3pv8tP/AMX/APhv/wDBFdc+/de6/9HQRzP/ABeMr/2sq7/3Kl9+6902 +/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3XulDiJi6GLVaSMgre/MRvqsb/AFRv949+690KFLK0+FmhLFjHIs0Y Yng2IYqLi5Iv7917oZ+qOwqZ4/7ibrl1Y2rbRi66Q+T+G1b2WMgEkeIk2ccEjn6j37r3T/ufB5Hb 2QlpJFYh1DwSINcciNbS0bX0uhvcEcEe/de6NHs7cg2ntPGU6yKKjGwLU1CFyDVZKrBeO4P+66aM gH/Ae/de6Xu1t+pPUJNVVX71U+t5i/pNU7Xl1sByJVINh+Bf37r3Sz3LhU3BQtk6JT9/Sanqo0K8 kcF0VPzx/ifoffuvdJ3Y2enoMkkMj6ZI5lvbgvZhqIU2Gr/A/j37r3Vme6pIN4/DfeYMfl/g+WoZ pFVQ5jStxmQhWUjkgCaBCfx7917qgrfmH+0qJDGmtJryRPzbSeAbi97Dke/de6L9koqmGRipN/6a bjnj8/Ue/de6bqeqCyKVtHJG90IJ1cckp9L8/j+nv3XuhLoKpq+H7qlmaKviX9+BSF1KOdZjOpZI pPyLEfg+/de6G3Z3duVxdC2Iz1HDnqIosJxuSlZaerpgdPjgq5RN9jVoB6BIHgawA8Z9Xv3XultQ 7r+NuRmFZkMzurZVUrK1Vh63blbkQhv6o6WfGmrp5AH4W7i4H0/Hv3Xug/767W2/2DRbQ2vsOhr6 HYmwlr/tZMmixZHO5rMCIV+dqaaMlaSPxUyRQxkltGom1wB7r3ReIZHRhIvGkcEcG97/AF/1v9t7 917pP9nbY/vVhW3dj41OcwNLEmehSwfI4WICOHJgXJepxQASW3LQWb/dZv7r3RZPfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691Y7/AC5p1i3P3XGxYGfqOBEsCQWj7X6sqSGsRZdFOf68 ge1Np/uRH9vWm+Fvs6+sB/LTcN8Tuvf6fwt/97v9PYj3H4oT0jt8qT8+tPX/AIVNyEQ1thwu4tsy fTgkZqm5vew+ntvcyRZAf0x05DT6lvs62WP5LzLJ0jt6VTw+38CzAf1fHUzC3BH5v7fvv7I/YOmr U5b7elp/OgfR8csm9jYUOUJ+pB0YqRraeSQSPp7YsMK2fXq1yKhfWo6+VR/MHFvmt8mx/TujsMfS 303Rkvx+PYak/tJPtP8Ah6VjgOib+6db697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917o3Xw1+TuU+MP a+J3cktWMG9dQzZEUjSvLQzUk2qLIw06N+8oidkmRRreMgjUUVG9UjI6sCMhvh6+kL8PPnN1H8sN h4LJUmewdVkarEY4VFO9ZSTw1kkVNHBNNAdbI1pY+bfRv6H26r6uI68V0g0GD0e6m2zBHGs2Ay9Z iw15FigmWqoTe9v8lqPImk2/slfd+qdPkab1pqeTVHgs1Gka6tMk2KqjqB0khvPT6v8AWsL+99OV LKcZ67ot1UlHBFS5SjyWPnp1EM2qinqaRZFsSsdZTxtFIqqRc3+vv1R14MAo6d6feG2iyhcxSKWJ BEj+MgC31EgUgD/W9sSICVNc9WBDdcF3lt6FqmFsvSqwmdwOSpSS7KQ2gqykG4NzwfdSKgjq3XZ3 rtw3BzNHb+hN/wDC1ghN/bBQgmgx1rqE+9NuqCEySy2Df5mCeU8H8LHETyPdvDPr16nTdNvGkf8A 4CUeZqj6B+xiKqzHm2l5kjS1v8ffvCb1HWxUEHrOu48gKStC7ezDNKYYoVdKaMMQfIxa8p8Qsn5/ PvZUhSDwHV3kZirUyPTpOu26q5VEdLjMUhVjrqpmrJgbm2mGBViDW/q1r+6/CAaVr1arSo9RQ9MD YSmknq6rOVK5appahadJaxVijWMIsqrFSI/iRY3Y2Jufbkee6memqEcePQF/I75QdI/FjrbN9p90 76wOxdoYFZL1eTnH3WSq/E702GwOJpxPkc5nK0RnwUdFDNUzWJVCAbOE1JPWqgefWhh/NR/nL7++ doyXUPW+JreuPjnTZ5ayejqKxm3X2k2JqhPhMhu9KdY6TE4SkqY1qqbDxmoCVASWeeWRI1hr00eq O/futde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3R/8A+U7/ANvTf5af/i//AMN/ /giuuffuvdf/0tBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6kUtQ1LPHMovp PqX8Mh4Zf9iPfuvdCzipg0GpDeKWMOhF+QRdRe5Or8W559+691imjdJFkQlGV1dHRiJFeMgghwBY qRfj6Ee/de6N11Bu/Gb8pabZO7GhXL0Uf+4HKVLafIY+YqGomc8xyOfSx/Q3H0PHuvdStyyZbEV9 TQ1qTx/ZStEUYMDLHI2iWVfob3A/1re/de64YjcL42oVGkYRtIjrJqFozcNHID9NI/24v7917o2X X29zU1MfmkT7ghNaux01cSJzqH/HUoP68r7917pfbp2kh0bqwkbeGRlkrKaAAtSg6byBEuVW5sb/ AE9+690dr455xN0dYdo9dVbeaXObXNdQ0xazTVmBk/iDIl7kyy0izKAPfuvdVJ7uwLrPmcFVKfvc JWVVNGTwXggkZYmAIF9UdiLfg+/de6LFnsZpkkBBBVj/AFB+p9P+H09+690F1dTNG7adS2J9QPP5 5vf+nv3XusFFnazGzxvdrq1hIhsxW9rP6rSKV4sfr7917oQqLNUGfQLDLHDXqBqjHpWQ2N/S3KsT bg8e/de67rY5B+3VRklfywuwFxpGrklf8PfuvdNZkkhikRD6GC2/5L44FuNJ/wAffuvdOMEV49RA 54/wHH6gCDZuf68n37r3TthKymoKmWWrkjGOjoq5ckZLeH+HyUsqVSy3Jj0SRMVt+b+/de6JNKUM khjBEZdvGG+oS50A/wCIW3v3XuuHv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XurFP5do/39 fcZ/1PU+r/2JXWw/4n2ptP8AciP7etN8L/Z19Xn+WbNq+JvX4uf+LfKL2/of+J9iW/FWiPSS3ypr 69af3/CpxyYcoR/Z3Btpbc8EZalJNv8AX9sbn/uD8tY6vAf8ZP8Apetkn+SJUGXozbock22zt9rf 1/3FwH6fX6A+3r6phr8h/g6btaBm+3rL/NT3PW7v+FW2tz5RI0yO4tixZqvijVkjSoyO2zVSoquS 6ovltc8/n3W1VR4tBju69MSUQ18x18vH+Yauj5t/KBDxp7s7GXj6endWTHH+29heT+0f7T/h6WDg OiZ+6db697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuhk6e+QXcnQmchz/AFPv/P7QrIp4qiSn oasvjKt4nDD7zF1AloZywGksUEgUkBh79w4dbBI4dbG/w5/4Ugdj7Gkx22/kPhTX4uKOOKbdOHFV kIWKaVL1GIEU2So1KXIML1ZLADSoNxbU3r1uqtxFD1s6fGv+ch8P++qOli2/2Vt1snUJAKnFzZCO GvpZDG0hE9BUGHIU/oVmtJGtgpP4Pu+tT2nr3cPhOOrLdkdnbD3dSTz4TceHrFateRYo6uCVDFUq ksTx6XYngWPHv2mnw8evLljXpfacRUKGlpsdUAqxLtDDKGB+lyRcG5+nPvTVxXp0U65xLhFnq1Wi pgAYBaOCFVX9lPoFUfkHj3TrRIHE9Z2/gos32VPfUP8AdMC3J/5BB9+r17Uvr1gaqxiA6YIYzpbS QkYNhwP6fT2zofr2em6fJUSBtU0UQISxuoJ459If6e9BH9D1tVqQCaDptqdy4uHGzf5VE1qxWb1o LARFeTqtY8+/aXz1dXELk8RTor3dXy26I6F24+6O2ezti9e4Pz/ZxZXeO6MNgKSavkdUjo6SbJVl KlVVuZB+1GWcLdraQSLBTwbh041yGBoKda7Hzv8A+FEPTnVeEr9v/FepwnefamVq8nA+U8mTHWey kjo4jRZbIZimhpYd7vNUTx+GjxFUYnWCbz1lMwiWdwADA4dJWkYmtetPf5KfLD5AfLrfU3YPf/ZO d35mhJU/wjH1Uq0e2Nq0lU0bS43aW16EQYPbtC4hj8gpoUkqGQPO8sl3Pum+Oei6+/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6P8A/wAp3/t6b/LT/wDF/wD4b/8AwRXX Pv3Xuv/T0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3XulrtLJIspxdQ+ lZ2Jo3P0Sc/WEkc2m+i/0b/X9+690uJoGRnjf08m6leF/NgLAn6e/de6iU9RPQ1UdVSSSQTxsGWa J2Roymo8EEkXPHH19+690dHZW5KHuXDJgMk0NJvvHUwWinchVzkMcekQO5bUalbDSbEuP8QPfuvd B5VUlTRmox1YrQVuKmkhljZbOIUbTZieR4nJH0/SQffuvdKna+5JqOaKMyupjZWgkDG4PBCXBuFI PF/x7917o/fUPY1HkWpcblWiL1cQppllUeGpV/SVN/TrK/Xnn/X9+690ZXA0tb1dunFbrwrF8Sau KeMXZkRJTqmpZgB6opomK/0Kkj37r3Re/lfsCHbW8aDf+AiB2pvSBKymdOUjeYO7wS8ALLFpeFvz rgP9Rf3XuiCb2xCxVBniBMM6+RbcLzz9P8f+N+/de6ArMUenU9uLnjiwv/WwuQffuvdB/XQ21f4D +nAP1C/T/H37r3SVqPJEfJE7RuhBV0ZlkVvwVZSDwffuvdP1B2bubFAQTmhzVIoC/b5ilE7aF/Ed XA9PVpx+dZ9+690pIu39tab5HYLpMV9T4vcEscRP0W0FdQVRC35trN/6+/de6jV/ce3zEUxm08hH JY2NbmomQN9BdYMcrMAP8Rf/AA9+690Fee3vms9G9K7x0OPdgz0NEHSOaxuv3Mrs81ToP0DNpB5t f37r3SP9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3VjP8upQ26e6b/Ren5G/5J7J6 1b/iPai1/t4/t603wt9nX1ZP5ZUl/ibsTn9NHL/tiAR9Ob+xRe/FH0jt/havWoJ/wqVfVTZX/m5u jb4A/wAFydMf9fg+025/7g/7cdOQ1+p+WnrZI/kkXTovbbAE/wC/U28R/Qn+E0/4P+v7UXo/Rp8h /g6Ztfib7emz+Z0DTfBvY8Dsf2+rcYG1EkC2zodX1IbixB/1vr7pbGniU9G6tcfAnrUdfMb/AJiw C/OP5TqPoO8+ywLfSw3blQPYWk+N/tPSwcB0Sz3TrfXvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3XvfuvdSaSsq8fUw1tBVVNFWU0glp6uknlpqmnlX9MkM8LJLFIPwVIPv3Xuji9VfzCvm T019umx++d5xU1M8jpSZ6opd0xt5WDPG8+4abI1wiBHpVZlEdzp03PvdT69bqR1ZD11/wom+c+ya ZKXL02wt2LFFGkc0sG4MXPJIpbyS1WnM19LKZRbiOKIAj83sNVPr1vV8ujVbV/4VBd2UTUx3R0ZQ 1zycZSpxHYCwBytNYT0NFXbJn8Zer/3XJO2iP+2zDn3Wqjz6FeP/AIVLZLxhaj47bhlkuCzr2BhU Bt/QDaPHv3XsdBLu7/hUN3hXa49mfHzbeHQVU+mo3D2BV5p5aAtJ4FNJj9n4T7WsI0M7CeVBYqAb hhuvV9fy6L1vT/hSL84twQ1VPtvavUO1UqKWGGOrnx27c/lKSeObXLUQSvurGYtxLEAgSWjkC8m5 Nra60XJ8uia7s/nO/wAyDd8H29Z8ia7FoTMZG2/srr7DzSeaFoWvUU+1jMjKrkqyMjq3qBBAI91W p6rz372j2Z2pkocx2d2HvjsTLU6vHT5LfO687uuvp45Egjkjp6rO19fPAjx0sSlVYAiNR/ZFvda6 Qnv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917o//APKd /wC3pv8ALT/8X/8Ahv8A/BFdc+/de6//1NBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917rsEqQykggggg2II5BBHIIPv3XuhewGYGcx7RzuDk6GNRNf9VVAOFqRydTrwJP8A Gx/PHuvdS5YedVwPwbC/PJ/HpA/Hv3XupmJrq7FV8OQxlRJS1tIwlgmgk0yRgEE6SCDwf959+690 dehlg7qwX8dx8SL2bgcWJ87h4lSJ95YOBRDU5LGwqB58tRoh86KCzgagL39+690DFRG1HVkCS8ak tGbFdcf1DDgfjg/Tn37r3Qk7W3TLjjTOJWXwTLa1yyBgPUdLWspT62uL+/de6tP+Pva+D3tj4tib vnjDVEaQ0ORe1hKFAhjmc2Ktcj1e/de6MHkeuabcmAzPSG8iIYcqZ67Y2bm0kUmUdQYadJ2FvHXP GhQX0+ZVvw7e/de6qD7C2TmdtVWe2juGilpM3tqtlo6iCVCrEKdUE0Yb6wVELK6H+jf6/v3Xuir5 mlILg2B/P+BF/wDeyP8Abe/de6CzKwlWfggH6cXH+x/F/fuvdIqtQi6/Xm4/PH5X8WB/29vfuvdJ SqUC4AI+tr/m/wCAfyOffuvdM8v1I44+gtc/X6Ee/de6b2Fif8effuvdcffuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Vjn8uZS26O77AnT0zUvx/tHY/WzX/wBha/tRa/28f29a b4X+zr6qn8sOQP8AFDZK/wCpopLj/EXt7FN4MxGnn0htfhbrUF/4VLyaY6iMW/c3HhGP+DHIwsGI /P6f9j7Sbn/uEAP4x09B/uQ3rTrZV/klnT0LtYmxP9z9unngFv4TT/g/T/W9qb3+x/2o/wAHTNr8 Tn59J3+aWQnwg2Ut9AfqugAYkDSDsyM6iQWAsOfzx7at/wDRB5UbpyYdsVR5jr5kH8wuvo8l83fl LW0EwqKSfvTs5oZgjoJEXeOYS+mRUdeUP1A9hd/jf7T0qHAdE191631737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691liMAL+eOWQGNxGIpkhKzEftu5eCfyRqfqoClvww9+691j4/IP+3t/x B9+6917j8A3/ANf/AI0Pfuvdde/de697917r3v3Xuve/de697917r3v3Xuve/de65ErpWwYML6yW BVjfjSoRSll+tybn+n09+691x4/33/Ivfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+690f/APlO/wDb03+Wn/4v/wDDf/4Irrn37r3X/9XQRzP/ABeMr/2sq7/3Kl9+ 6902+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917qZQV1RjauGspmKywsD9SA6nh43t9UkW4I/of fuvdDXBPTZClp8hSE/bVKksjW1wzCyywsFBXyRsfrxcWPv3XusRvGQR9f1Djgn/bW59+690OfW1V mpaWXKbGyEmO7F2RW0u6dsCJ1VstSi8ObxMauCs0rosUkUJNpiGQAs4Hv3XujLbqw22+69iJ3b1/ RR43IU84xva+zKeyS7U3g6NI9fR0wAMe3dyCN6inOkBJRLGfUjAe690W4mSGVoXXhdI+oVrXBu/F rg+/de6FjY+8a3DVlO8Up1RSB473FmDAgqVIYHi/+x9+691dz0B2dhu7dpU+z9x10UG6cdEh27l5 WVah5IwRFTTS+n0hwNLG39D7917qF8k+jqrtTEPlKeg8Hce0Mc9PVUqxrF/pE27TKzNBGFIR9x45 VZ6bktUqTGLuVv7r3VEO8sRJj8hUwSRuoDsAjqUYMpOoOhAZXRrqQbEEWPv3XugUzVNYM3I5P5DX Nx9OR+frf6e/de6DiuisTa973PF7cWte/wDT37r3STrI+T9R9CB/rnkG54Pv3XumGZSOOL2tx/vr W9+6903yfj37r3WP37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691ZF/LhF90d 6H8L0hkmP0/s9g9cn88fX2/bf28f29ab4X+zr6oP8r2TV8VtoD66KeZfr/gL/wDG/YrveEVPXpDb 8G61Cv8AhUsRrm+lhuPAW+l/+Bik/wCv9PaTdB/ia/6cdPQD/GX/ANL1st/yT+fj9tVwQQ+0dvE/ j0nD05P+sCD7U3n9h/tR/g6Ytf7R6evSY/mph/8AZI9k8Af8Ynx7kIQ6g/3Hi9KswAYC31I9tW+S 4PCh6vMeyP7R18wP5vC3y++SwsFt3j2mLC9hbfOeHFyT7Cz/ABt9p6WDgOis+69b697917r3v3Xu ve/de697917r3v3Xuve/de697917od+r/jF8ge6aOXI9VdP9h79x0MskEuQ2ttLO5qgSoiELSUzV mPoZ6YVKLOhMevWAwNrH3dI3f4EJ+wV60SBxNOpfZ/xT+R/S2OXMdq9J9m7Bw7yxQJl91bK3Fg8W 086u0NOuRyOOp6I1EqxsVjEmshTxx70yOnxoR9op14EHga9F991631737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+6912QRwQQf8ePfuvdde/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917o//wDKd/7em/y0/wDxf/4b/wDwRXXPv3Xuv//W0Ecz/wAXjK/9rKu/ 9ypffuvdNvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917pWbUzoxdU1LUsfsK0qspJ4ppv 0x1S8GwW9nt9V/1h7917oUaqJ05HquCwa900jlWX6jSwI/wA9+690qOtKwUu98LTtKaePKzPifLr KpFPXoUoZDIDqUfxBYvp9L+/de6HXGb5zHVG+shvjFQaqeuR8B2jtRlb7HcGHnmVEy9RRKfHJV0d aBMzEBopwHFhJLf3XuhQ3ts7BbhoqbeWyWibFZKNJ3po2MrUErAs9KQoa3I9JPDAjke/de6BZEmo qjxSK8ckTc+mxAv+Leq/+x9+690YzqDsLJ7UzVBXUdRLBJBLEwdH/wBSRcFR9VP5Pv3Xur9et93Y rvfZGOq4ahaPeuHjjehq/IIpK5oBqNDPItpPMdGqJv1G4/p7917qsf5udBSVU9b2DgMY1NnJGln3 Rhaen8f8VaIWqc3j4I0HjysOgtWwqqidf3kGvyA+691TxmKfh+b83BtwQfob/wBOffuvdBbkYLMw tdhe1iOTz9AeLH37r3SKrYyCSefyR+b8/wC8fj37r3SeqF0k/X/Ycf0NyOOPfuvdNMosR9Pz9Px/ h7917rF7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6sp/ltIH3R30D9B0Nm3 /wCSN9deN/vFvb9t/bR/b1Vvhb7OvqU/ytZdXxW2ryOIJh/thb+v59iy5FRF0it/xV61Fv8AhUw1 pWAsP9/Dg3I/FhVrx+CPr7R7rmzX/Tjp22OqdqenWyz/ACTpAfjxtFiQNWzcARa3H+4WK9rfWwHt VeH9D/aj/B0zbYZ8efTP/NYVqf4O7NMg9adRY4toN9RGxKcnR9T6vx7btRVZG+TdbmPbH9o6+X/8 5Bp+YfybX6W727XFv6W33nx7Cj/G/wBp6X9FV91691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3W9h/J23vl+u/wCVZ3R2Pt4Y5Nz9N9F7235sKoyONo8nQYvdUO+N+zfdVmNqo2pspS1Bij8s E4ZHCD9P19ntgStqCrUy3+Dpp1q1SMUH+Hqyv53Ztez/APhPnju+N/UODk7O7g6O2/nN6ZugxNJi MfX5HM9b5Xc8kNBg6Rf4bjIJdwUkEsSRJeOSNLMNN/bl27vayKzVXw1P51GeqIqhw1M1I/w9fMol t5ZLfTyPb/W1H2HulHWP37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdHZ/l4bPwm9f lr1ni9x4jHZ3D0cO783UYzLUcFfj56jD7Nz1Zi5J6WpSSF2pMskE0ZZToljVvqPae7lMNtNKOKqT 0s2+Fbi9toWHazAHo6v8wDZWEqfjBh+2cziMZLv+s+S9XsHEbnFJBDnDsjF7EzmVyGDqqyGJJ8jQ wZaajMRqZJ3i8dovGrurk+x7pJuLXWpqqhH8+hFzNs9vtUVj4SASOCTkmvVKPsQdBHr3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuj/wD8p3/t6b/LT/8AF/8A4b//AARXXPv3Xuv/ 19BHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917oW dn5sZGlGHqjespIz9nIzeqoplF/Cbm7SU4HAHJT/AIL7917p4qI5YJkkQTQvE6PHIpIZHhfyK6Ot 7SI6ggixFgffuvdGDizq7y23Fuh40bPYuRsLu2DQvgylJNCJqHKVMQUB/v6dZYZbf24b/m/v3Xun Xqnez7Lz/wDdmpkNRtXPACg8pEirE7H9p34H3FDJ+21vqoDW9Q9+690NO89tUUjRVtKoaKYAh4gx KH9YjcAA6dLA3+vv3XukVj0lx1SsRj8cge4Y8xsvADBuVZf8b8f6/v3XurFPi12lLtbPUFJXVM0G NyjxUc1RHI5akdm009eFNwrU0pBPFylx9PfuvdWubp2xQd17Uz+Aljjo+wdvwecLHpSTLRQxaqTL UMiDn7mIDUV55BHv3XutcD5F9TVO2dwZeqpcc1DUUss/8bxaqqxq6SssmSool0mNb/8AAiJVIjb9 xRoJC+690RrL09pGsBY82/H0v/vB9+690ga2KxP1/wBe3F/oefxx7917pMVKeo2B/wAPfuvdME36 yB7917rF7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6sd/lx1T0+7O841VSt T0LumNyb3QQ7l2ZWBl5HOulA/PBP+uH7b+2j+3rR+Fvs6+pR/Kxb/nFXa7fjwTAf4Dj/AAv7F1yP 7P5npDBwfrUb/wCFSzM9VN/T+8GDBP4VDUpz9DYaiPaDdf8AcMf6cdPQf7kNUZ09bL/8lVPF8edp Ja/j2Zg1H1IYJhacX/5Ct7V3YpBn+Af4Ok9v8bfb0yfzapgnwh2po4A6gxrKPwo/uDTMovze3/Ee 6W5pFKfPu/y9WlAPhfaOvmEfOkafmT8oF/1PfXbQ/wBtv7cA9hNvib7el/RUfdevde9+691737r3 Xvfuvde9+691737r3XvfuvdeHJA/qffuvdbvv8tBI8d/Je+X1VCzaj8Vt5zvrIOmWbdm/AQvA0oA QQPr7PbL/cMn5t/g6bNNfHqzT+YHNPt//hNV0hTUscZLdK9X0RSRW0eCq6uqqKpayEHyRU9S7Jc2 DgEgi493u6fTTf8ANNP8I6og7gfmf8vXzUH5dz/tTf72fYf6f64+/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917qxH+WFSzSfJwV8C6pMN1zvfIBvoIvLTUeK8jNcaVByVr/wCPtBuZQWFy X+Gn+UdGmyq7bnaiOmup/wAB6Nt/MRmnpvhH8b6ed2eTP/IPuvMMx51nE7b2bQEqxVdSq+SNj/Q/ 6/sg5TCGK8kRaKXFPsz0KeeWbxNsjc1YRmv246o49i7oBde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+690f/wDlO/8Ab03+Wn/4v/8ADf8A+CK659+691//0NBHM/8AF4yv/ayrv/cq X37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rNTzzUs8VTTyNFNBIskUiG zI6m4I/33Pv3XuhcoM/DmaUSsRDVKSKiBbafIbHyJqsfG9yR/T6e/de6FHruWaKoy1GpBp8xiJWK XCpJNjJPu4mcG92EXmUAW4Y39+6913kIm1y0Iljj/eir8VVsoDUlchJVQ4JZYpwAkg/SRz/ZHv3X ujPbI3W2U23D9yWEqwiOVHJMqTRH1pICQQY2BAPB49+6905IsFQwjnP7LSs/7YVmQnksjEFwxIva 9j/vPv3Xuhb2asmNnpmjZmj8iSQTIbo9iDpIBYqykci1/wDXv7917q3jr7fWTk642v2hipnTcXW+ Sp9rbj0sfJXYKrQTYOqqwLtJG0bPSktx+17917oP/mv1NjewdrYvuzZFPFFFn6ZpchDThT9juSlg DV9JIgBGmvgjYqDwxuPfuvda8/Zm1hQSS5aghEdDNO8VZTqDpxtab/tANyKSpsTH9dLAofot/de6 LxkIzckcC9/xz/rAAH6c+/de6SNWpF/zcf0t/th/j/t/fuvdJqW+s3+v+++v+Pv3XusXv3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917qxP+XX/wAfZ3gefT0HvFuP8MztX/Ye3oP7 ZPt603wt9nX1Jv5WTH/ZVNr2Nr08rf7dPYwuKfp/aOkEH4+tSn/hUcLS17nkrnNvqv8Armsic/T+ vtBuv+4Qx+Pp6Cv1LV/h62Y/5LCmT457Qla+s7FwM5C3/VJg4ZGA/Nyfp7W3gIt60/AP8HSa2Pe9 D+I9Jj+bcFX4WbWUXCDqTFCx5Kqdh01wR+bL+PbMCkxy5xRv8vTsv+hD5jr5f3zUrHyHy2+SNdIi xvWd3do1TxqzMsbVG985MyKzkuyqXsCSTb6+wm2Gb7el3RYfdevde9+691737r3Xvfuvde9+6917 37r3Xvfuvddj6j/XH+9+/de63e/5flKcZ/JG+Y8wlDkfFbNSg2Khfvs9vSoENrsSV8tr/k+zyzr9 E3p3dNmmvPy6s8/mmM+F/wCE5vScSRI5Tqrq2leN7qEWo2JDj3k9IJ1wCq1AfQkWPHty8/3HuBT8 Cf4R03HxWvGp/wAvXzSG5Zj/AFY/737D/Sjrr37r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdK7r /aw3xvzZWyzWHHDd27Nu7YOQEH3JoRnsvR4s1gpjLAKg033WvRrTXptqF7+/de6tl/mTfyzNgfCj aea3FsbsjfG759j99474/bsp94YDF0FHm81kuq4u0I92bUrcY0PgxEERfHy0c6TyrURlvNpADe1L qZQDUAfz60DqBYDGoj9nVNnv3W+ve/de697917r3v3Xuve/de697917r3v3Xuve/de6sJ/l0/CnH /NTs/fGA3Fuur2rs7q7r3I9j7p/hUR/jmcoqGrpaKHB4itfHZimw89VJUl2q5aOrWJI7CFi2pdEq oLNWnV0QuwUdL3+ZL8PelvjFQfHHeXSW4tx5DBd37O3jks3tncmZi3JV7T3BsjP0GHqI4M/HtXZr 1dLmKXJxTLE9CGh038h16I6q6vUqDT59bkTw2p5dVc+79N9e9+691737r3Vnv8q2mlHcXa+WRfRj Oityp5W4SOer3Ts3w3b8My07kcj6H2ScwuE2m4JNBVR/MdCHldA+821fIMf5dDZ/M0r1o/jB8Jdt FWWeXc/yU3LUXckFKjJ9Z46lJBH1IppP6jj2g5SWm3yP5M5p+XRtzy3+7G3jplY/8PVK3sVdAjr3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuj/wD8p3/t6b/LT/8AF/8A4b//AARX XPv3Xuv/0dBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xus0E8tPIJIXKOOLg/UflT/UH37r3Q07H3bEMlQgloiqSU7odNyktNLCxH4OrXa/49 +690vMiwnpZJ42ZjCy6LcMY5CF+ovwD9QffuvdCZ1nVvUU1cqGT7imYSzwC3+UQsqhpQpDDyoAA1 7XAv9QffuvdLSnzMqVDIpX0N42Vj/aDW/p+D7917owexMxCZYo5lDwSBEcJayMRp8y3KkOn9R9ff uvdWhfF6M1+H7d2xOxkosl1pla4BmJUz4V1yeOmABAV4nVgDc8E+/de6Gf48Vg3/ALC3v1tkNE8G Rw1Rl8Osh1rT5rEq08LRBgQgkRNJI+oPv3XuqOvkTs+l2d2FuDDz0wbE5VErPtLFYzT5Aap44/0l GpapXMbX9LoCPp7917qund2IbD5KqoXOuFGWSlqNFhVUko1084/priFmA+jAj6j37r3QZVvp45te /wDgB9PoORz7917pKSm8jf0vYf6349+691j9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691yXTf1hitj+kgG9jp5IItf6+/fZ1 sUr3Vp1x9+611737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691Yn/LtYJujvdz9F+Pu9T/sTmNqgf7yfbsH9qn2 9e8m+zr6jv8AKwcD4q7TH1vSuw5/2leBb839jKXIT7R0Xw4LfPrUz/4VFHyS1ykG38bwLk/kA5GG MG/HNmPtBuv+4Q/0/Tlti4I86dbNH8mEBfjpt4obpHsfDxIbcFYsCiKeOPontdfD/Fv9qP8AAOkt r8b/AGnpD/zdJ1T4Y7YjJI/4xLh0LD6XOwaT/bEH8/09p4Gokg+Tf4T0olGIj8x/g6+YB8xxb5V/ Igf07n7LH+23nmvYTf42+09LRwHRavdet9e9+691737r3Xvfuvde9+691737r3Xvfuvdck/Uv/Bh /vY9+691vHfCtIaD+Rp8y6mNXVT8XaOGx+nklbLVEzKT9VlmrW/pZrj2fWmLCvyb/L00f7Sg446s /wD5vMKw/wDCe/q2nJRFi6t63k9RVQCmBwUKItyLsZJwAPyTb3u+/sbj7F/w9Uj4r+fXzMT9T/rn /e/ZB0o669+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3RiviPtTK7z+UHx6wOKxtXkZK/u7qakq VpqWoqUpqau7B25QNU1hp0c09IslWqtI2lRqHPI9+HHr3W09/Pv6j3o/xh+Se+X29uVcfhv5oW1Z 3qKy+Qo59v1/xj3Jt1dwYlKOnvicLBl9rtRTic280cbagXt7qXMk0h1VIVBjHAY/P59eUERKCKd7 0/b1pr+7de697917r3v3Xuve/de697917r3v3Xuve/de697917q+T+Rhl/7v7h+ZmbDwxtS/G6aB POJ9Dmt3JS0/i1UxWaNpL21KRb8m3tmc0iJ8ulNqpaUAdM/84WGSm6w+Bcc0Kxy1mwu78s0t2MlT HN2bS4mGQ6rDxJFhAiWABCk83udQU0sR69auNWoBhmnVGft/pP13Y/0P+2Pv3Xuh16C6IzPfG66r BUmew+z8Fh6JMluTdu4BVPjsTSzVEdJSU8FLRxSVORy+SqZNFNTLoD6HeSSKGOSRLKhckDr3V0nx 7+O3U/xTxPZ+an7dy++q7fOyJMHj2faOJ2nRUNZQPNkohDUY/fm8aytaumVFCPDAlkJLXsvsh5mi vfoEjs7cyu8gBA8hnP7ehTyi1km5yS3lysaLEaVNKkkf5Olf3f8AGLaPzJ6i+NmM293RSbCyfVm0 N7U+X/vJtLLZ/EVW4N47oiyckM2RwuRfMY+noqDFwajHjaokOLAm49vcu29yLArPbeEytwOK/Onr 1TmuS2k3FZLa58WIpx4/6vl1Qx3t0hvH499jZbrbes2EyFfQRQV2Nz+2Mg2V2zubCVvk+wz2Br5a ejqZaCqMTo0dRBT1VNPHJBUQxTxSRqbspUlSM9BnoHfeuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3XvfuvdH/AP5Tv/b03+Wn/wCL/wDw3/8Agiuuffuvdf/S0Ecz/wAXjK/9rKu/9ypffuvd Nvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rPT1EtLMk8LaZIzd T/sLH/bg+/de6Gva25f4jQV1LIw8wpTqRibnQQyspNyRqX37r3QxdZvJBl6pkdwXijI0AAXDs1iO CdI+lx7917oY6zEJk6+aqoiIJydc0A/TqYD9xdPq0NcXtwv9Le/de6WW26bL4yopvPSzheNMyKZo H/1JEkd1P+tx7917q3X4+VY2f0L232NXBkmrdvy7RwofVeqrMuRQBIvowb95zZb8Jz7917oyvw62 bkNubP3P2vuSGox23sJgq6no5ayJqcZLJ1tM0NPTUhlVPNpDa3NiFW5J9+691S78yMvR5XfdNNR6 WMGKZJ3+rPJNXVNTGb8AqIZB+B9ffuvdV179olr8GK9Repw04hlHNzjK1yE4P0FPXEWt+Jj7917o uWQIGr/YX/2NyLf6w9+690kWN2J/x/2/+P8Asffuvdcffuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+6912o1Mqj6sQP9ube/de62q/hb8Lunuu/5fHY3eXgG5e5d5dcUtVu7JSZdYl6v2LvO eSp27kZcKskbU+2clJjqWOuyc0cnilklcOlPTT+zaztI3iWUnvJ/Zn/L69MySlCQB/s9bqX8rbem 36r41bchxGVoMhTR0b6RBUwmphbSp8VRThzJFIBaw+hHIuLH2JGhcjhgf6sdI4ZEPE0Pn/q9etVP /hUDXpNLWrHY+TKYBG+nANckwYEf4xi/+v7LN1/3C+1+lFsP1zQ/h62X/wCTDk4IfjNs2ORtLy7A wty3BZ/4BENXNiwb6/7H2uum1QBafhH+DpLbIQ7nyqegq/nJb12jgfhxtqiyGfxMOQk6uwtNHQtk KZqoyzbKoaaJpIkkd4IFkkGuRhZVubE2Bbt17JKinaan06tM9DEK8adaaP8APn+CXTXx9z/WPyK6 izdVjq75BpPuPszqrI5JczV7H3jnsRid4Nkqau8slZSUO5Tm6hmoKm7000DPC5glSGAOX1ukEgMb VVq9LonLqCwz1ro+0PTnXvfuvde9+691737r3Xvfuvde9+691737r3XOMXkQf1dR/tyPfuvdbynx eo58F/Ie+XwqJEZpPjdteTVGWIEOYozlqePkKQ6QZBVf8B72v7Pbb/kn/Kjf5emSaS9WMfzuspBi f+E/HT8c6SH+IbO6gxkKpEHMc8zbRmR5dUsJjjEdMwLDUQxA0m9xa/8A7CfH8H+XrUeSp6+ageef ZB0/1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3XvfuvdeHPA+p9+691t1fyn/8AhNNXfIzZW1u9vmjl92bM2ru2kos7s3pX arphd2ZPAVsX3FBld/52rpaip25Dlqd1lhx1JElcIWVpZ4HJhVmSYJgCp6cWOtCeHW0vsj/hPT/K /wBq4mkx6fEPr7LmmgjjNXujIbw3JX1BRAplqazM7irZZJXtdjcC/wCB7YE8laMQOrFVBFBjobNm /wAq/wCN3xwmrMh8ZPj/ALD6xrcpVYPIZiq2Wr4jI1lbg66SoxslXUZDIf5VS0YnfxxCUKrsW03Y n3f6qVFYKK16qUUkV4dHb6y+PuD3xit3YPtDqiPKwV+co9xZD7CrosPTbuzVZS5elrMhvFsdnY4c xU09NVsiNKpZxI2oN9fdre6mrJSMVx5DqskSArU1I+3om25v5Kf8tTJ57M5Gq+DHx1StqsrkKmrk HX2EcS1NRVSyzSOkMSwMzyuSSqhb/QDj3QzSVNTTPoOnAoIwB0xr/JI/lnqwb/ZH/jpYG41dbYIg kc8hoSpH+BHv3iv69WEak/LqWv8AJQ/loXB/2R742ngED/RZtkj68f8AKHz714z+vXtCjy6cV/kv fy1vz8HvjMf6/wDGIto3A/1v4dz7140nketUUfh6nR/yav5biKFHwf8AjFpUBQP9DeyibDgXLYok mw/rf3rxpDWjf4OtUXjTHThF/J4/lxxIqJ8IPi8FF7auk9gsfqSbs+FJ+p/J97EsnEt1YBKcB1JX +T9/LoQWX4RfFy17/wDMkNgH8c/XBf4e7eM/8XWqLntHWeP+UL/LujHo+EvxcF7Xv0f12fpf/Vbf Nvr714zVPd1ojz09Ei/mGfCX4wfGT42btzfRnQ3T/T2b3Zj8lgc5kuuuvtrbLr87iVjo3XEZGvwW PoJainSaYyxLKzIswBADWPti4lcxtRultiqeOKj9nS2/ly/DL4x/If4XdSZrvf489P8AcOV29T5T B7ay3aPW2097ZLD4l6w11ZSYis3Di8jPRUNZk5nmkWNkWSUliCefe4pWK1VqV6rdIBKQ2TQdG7b+ U3/L71l4fhV8Wo7EkBOh+tB9eOR/d2309umWT+LpNQUwoPWVP5VXwUiFoPhv8Xo+R9OhusCQLW4J 203496Mzfx5/Lrej5Domnzi/kudadydQ0m0fjZtHpH46btpNz0u4Z8ntrqzb22sdupKCgrqSlwu4 q/ZuLoMrHSwPXvJC+ipSNybxm9w7BeGGTxHJZPPqjR6hQY616O0P5An8zLA1cq7EwfVu9KAcifbv auCxpkKg2b7DdlDgX1SD66hf2a/va2YCvbT1HSeS1cjtejV9f9X7OmjqD+ST/NUxu7cRNujqfb9D gqWc/crle3OuJaEAlDr+zx+Xq2dDb8Rk2/B9+bc7b+IEHyp1fwJKr3CgHr59X67c/kI/FruvozJ7 f+YPRmwc527mp62GDsnrzM5bGbz2jhlp4P4Nj8Humijx0BfE5CSqqfE9LPQyyzkSxzKSPZZNemWU uPg6dEQ0gVz1o/fze/5Iffn8r3d0m7KMZXtf4r7kyoo9m9yUmNtV7arKuRvstndq0VFH9tt7crD0 0tYgXHZYDVAY5vLSQXjkWQYOem2Uqc8OqPvbnVeve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 o/8A/Kd/7em/y0//ABf/AOG//wAEV1z7917r/9PQRzP/ABeMr/2sq7/3Kl9+6902+/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6lUlZPRTLNTuUYWvYkBlBBKm 34NvfuvdG76YylNnKyaSL0VgpLVEB58hUj1xixvwD7917oePLJS5BqiF3jaNk0spZSCiLps30BHP +v7917o33QNKu7M9iMIVKT19VBA0CLqik8rprlkQaliIi1MTpK8ci/v3XuthXD9Y7TfD7V2XRJSz w7YgjrKzDwYvGTtNmJadGeqmkqEWmH2MPBbSzIzMffuvdEz+WHyjpaunn6q2RqodmbUjeLIZCRZI m3FmIl0zincRwRHEUsnoHjULK6cEoo1e691Qt2JlMhuXLZLLzRTSxtUyhpo0eaCNI2ZQhnQNENAX 6X9P0Pv3Xui85aIVFNm6LjRVYjIcj9RlggashH6rcTUy/wCx+nv3Xuio5NwAbXHF73v9RwOf9f37 r3SY9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdZIf8AOxf8tE/6GHv3Xutw X+XNVzP258eYWUSUVV8ZekMDXU0hDU2Rx9TXbtkrsbX0zXhrKCqilCyRSq0cgJBBA9n+z6tMppjH +XpJdgERgfn+3rdxovjL8ftvbGpq/ZuxIdgyrRNWxU2zZo8Tj0rJYjJPNT0j09UKTzSMSyQPFGCf So9mgnmVqa6g+or039PCwqFp9nWhN/woQaVd809Q9VkMhRUubxePno67K5CqhngRasQuyVc9VFDM kiLeyFWB+gI9od3kLW0INNOr/V/qp1ayjCzPQmuR1sPfyIMVjO2vjl1vlc5V7txeN3LtTGVz42n3 LWVH28U1MIDSQzEQQGmEXCnwiwP0/HsyEpe1t5KDUYweHSZY1E8qVNKkdXfZz41/G2LF9t4av6v2 1vFOtG2jTbXrN3wR57JY6av2FjcxNJkGkEdPkq6GsmLRyzxM6ji/AsxHPdu6tI1AQa0FAc0H8uPT hggUMFWrClM560AP55X3U20NzsF1UtN3vteSV3dS8c1dsPeFPSIoY+Rlanw0gJFwPGATcj2Xb4KN Bjy/zdO2Rqjn5/5+tYH2QdLeve/de697917r3v3Xuve/de697917r3v3XuskP+ei/wCWif8AQw9+ 691vPdPpPQfyC/ldLLZXm+PfW8V1Or9ufbW3Z4ORYE/bzqSPwSQeR7PoD/uvHyB/y9M1/VPpj/J0 fX+e1Mj/AMgvptGZVAwPUjRBmVdTU+U2bTAIpPqbxyE2HOkE/QH3vcv7Gb7V/wAvVYh8H2dfNo9k HSjr3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de6s5/k8fGjE/Kz+YT0D1xujHQZbZGFztX2VvfHVSGWjyG3+vaKXcMe JroQR56DO52moqCdDw0VUwPF/dWNFJ6soqwHl19eDpbalPSYillaBVYxKRZRwABYC9uP969oGB9e nj69DbXUywk6FAt9OOPp9Lf7D3oioB60D59NUfj88GtFlTzQ6omClXHkU6GvxZhcf7H3sCvl14+R 8+pCVU9A2aho5JKWObOVMZWAmErBApKU5KEHQPOePxb/AB97rTUAcV69/DjptLartcnUbk3JJN7n k+o8+6k+vW6YNOuB+vP9bf61/eseXVc19OuJKj8/X68f1/pwPfs9OUamD14BL8EG/AA+v1/1/e+t UND59ZLWsLm3+3/3n/D34eZ60eFKY6yD/ffW3+xt+D7t6dex5jrmtzYkcf0t+P8AkXvRp+fXvQkY 6gZrN4TbeKrc7uPM4jbuDxsfnyObz+TocNh6CEfSStyeSnpqKlQ2+ruL+68Ot1H5dUtfzP8AuXpP uroCpxfWHbvXPYU+2dx4Qbgh2bvHD7mgxn8XzWKp4qbKnC19UkMlZSUszQhtSsYjewuQzcaliOoE A9LbHE4avl5dGn/ldDFUPxC6swNPmcNU5ubB0245sBRZCjky2PxmZo6Spop58MspyVJSVC3ZHeMR tc6WI97g/so/s6pff7ky0wPTqxLkEf8AEk8W/H+A49ucek3Afb13YDkf6/0/1/8AevfuvAU+Y6wS JHIpWQKyH6owBH+H+x5/1/ejT8+t14Zp0nMnS08AUxR6WYHi7FQQQPoT/T23L2KCKdbXNepFHjqa SFJnRix5I1kAEf4D35BWmM9ebhjp/iVIkVI1VUUfpH+vze/1Ptw48sdVpUgg9B52n1TsDubYu6Ou OytpYDfOxt54erwG6tp7nxlLl8HncRXRmKpocjQVkckE8TjkXGpHAZSGAI8HaM1HXiK8eHXzXv54 X/CefffwTrNy/JT4q4/O9ifEmermyG5dtKKzNb26AWokZ2TMy/5RW7k60gY6YMy5NTQIRHX3Cisn MIpBIM/F0w6aTjh1q5+3eqde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+690f/wDlO/8Ab03+Wn/4v/8A Df8A+CK659+691//1NBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuht6araiiyFZPTStFMqqqSI1mU2JNvxYg29+690c rHZKmzksME5+0yA0Au3ENSQF5BJ/bkccEcg+/de6sw+IuCp9iYrcvb2epV+3wFIYsFFKoK1mYmY0 +NjUG4kE1cwJ/wCbaP8AQD37r3Ru6rvDLdb9f0VTPkpW3v2nX1UaOj+SWl25CRJuDLaNQESZGd0o oyL31SW/SffuvdY6He+Eodp1u+N6YnGZvCU4kpsZiXo6Z63PZTR5VxlIZAfDSU4s1RPpIhj/AASQ p917qsDvz5B7l7Aq6qPIUGEwuHpRNSYjbeAx8FFiMXSNcJSwIE8jyC+qSVrNK9yQPp7917qvbKyC IZWokJWKnxOXnY8XGmgqBGtj+HldR/jfj37r3RQ8o/IW9/x9P8B+bDn37r3TL7917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6edv7ezW6szjdvbd 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 7r3v3Xuve/de6P8A/wAp3/t6b/LT/wDF/wD4b/8AwRXXPv3Xuv/V0Ecz/wAXjK/9rKu/9ypffuvd Nvv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6Gnqa K8s7cjXKFv8A4AC9v6Ee/de6NltjFy5bKU1JTx+Sepq4YIApu4aSRY1IBIsB9f8AYe/de6t6anmw +K6r6fx0YnWFaHL5xHOlnrMiBSY6GdjZStHRq85LfTz3Pv3XugXqd2Rdy9tzNhavVh6LJxbO2pSu SscG3sDNLRQVEOk6fFk6nz1zm3JqCfoPfuvdOu8ex48luipw+LLHae16Wp25hYxI5jqTTnRk8sVB IEuTr0chrcxKgJNvfuvdFK31iaXJSTVtGQr+Z3eHSPXc6WOkgAc/i3v3Xuimdo1EWA2vUwmwr9zT LRUgJAZMTQTpUZOrCgG6S1SQ063+t5LfpPv3XuiZ5B9c5H9Of9ifr/vXv3XuoPv3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de65OEB9BLCw5Isb29QsCeAfp/X37y+fWzSuDjrj 791rr3v3Xuu1UswVQSWIAA+pJ4Hv3Xutwj/hPh8GurNvT0PyW7xjxS74zQ1dY47OeJU2xtyoiMcu 6BFVaVizO4o5WSmYi8WOIdCRVHSZWduSBMw+z/P/AJutFgDTrer2lkdjnF01LhKzGTUqQoqNTywO rgL9QyFla/8Arn2aAngR1VtLH06Vb4nDVgJVIWB/K6SP9uOPbgYjgetaR9vTRV7CxNWjL4YyGuCC qlSD9bi1iPdxI3rjqhiGO3PQW7g+Oew843krdr4Wea5K1C0EEFWpItdaulSGqB5/D+7+NWoZQR1T wQKEVHVPvyJ+MvRPfnbW5vjr0t8eeuu7+zNimBe6O0O0MNTZnoT47ZLIUf3WN2tuXN1WIzO6ewu6 shQ1a1A2btysoJ8bSSrUZbI44NFHKmkhhnwtsgHm3D9lKVPWquhFJCT6f5/Tom/ZX/CZ/wCPu/cR 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 bTTSP9X29b8ImtMdYX+RcRW/8R/PH79z/rmx+nuwm1kih4deERzTrH/sxFOLE5G97WtMSb/kG5uP 949+WavAUH2deCmuesTfIqH8ZADkH/P/AO8khvoP9t71rFcfDTryxk+WQesB+RVMTq/iY/H1mP8A Q/X1cX/1vew66dJNGH+qvXtDVwAc9YW+Q1Gx5yIaxvYTPxa5v9fofdQyVAqa9e0kkjy6xN8gqJrD 71WBBtaS45+v9Obj/b+3DIBTFOtuhXTTh12PkBSv+itsPxZjyeL3vweB78jYAOaj5daKsK+vWT/T 1Cf+U0kEkcubmx5va97H3QSBqAedetFTStOuS95K/wDylsw+llc/Xnk/m3t0Opzqpjquk4NMdSY+ 53dvTKxAsCDquARz9CCLH3vxCAGFadaoSacPl06wdqzy2UpI4sPUGZbH6kcm5I/p794grUHrRB1a SScdKWj35WVA4jlH14Ln9Nx9b8/Q+7CrCteHXuFAK9KWh3NXzqzKzqF/qxsTwbf15v733ca9aoR5 9DX0/mMnLvHHRCSZlfyAogdr2H0awsQDzzwPamA1YnT+fTb5DdV0/wDCob+Xl3H86vgnsPdXTVXi KvdnxYy28O4stsrJLLFlN7bWO1hRbhx23Mgrmmpc7jKClNXDBUKErfGYldJCmo1icYTzPSQg+XDr 5V544P1Ht/qnXvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+690f/8AlO/9vTf5af8A4v8A/Df/AOCK659+691//9LQRzP/ABeMr/2sq7/3Kl9+ 6902+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 6kUlLUV1VT0VHTz1dXVzw01LSU0Uk9TVVM8ixQU1PBEryzTzyuFRFBZmIAFz70SACzGigcevdfRt /kKfyK9rfELaG1/ld8odr0Gf+WO6MVT5nae3MzTU9fjfjjhMrTCSlocdTyJLDJ27X0M/+5PJctiV kNDShJFqZ5jPbdu+o0Xl5GdNaxofTydx6niqn4RQnuwqSa40kohx5n/IPl8/P7OO0kkarxBHZbAX AOpiOASQDcX+n+v7EwT14dF7TeVepcVDI4uwP4/Vcm31/wB59+8RV4dJmfPHrm1CATqY2/FgL8fU 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 Tr8aZtx0HY+faqxWUkMtK4lkinSSVI11wQ+5P5X9tOfN4+jubvYnEAWniTytDIRRSpIcPhSopojF RQVwT0Gtx9zditbaSO3uy1zXgial4morVRUjzLEDjQ8Oj0dbfyA/jns4UeW+VnfWT3ylMtP/ABTr XpWgTrfY+YeiWaCCry2687LuLsCJ6nHy/bzwY2fGIY7qJWUgJOOxe0dhtTfU79uJnmqSqqSAgJqV LmhYEitdCkHga5Mb7z7obtuUYg2+BYI6ZPEn0OcCgx+IEdWkda71+KvxI23Udf8Axf6p2P1tjaxg cq+z8Ugzm5q6MyN9/u/d1c1dunduQMkjt5slWVLgsxUrc+5Aszs+0qtttVikaAUqo8vmeJHyrTqP r28vLyR7i/u5JZj5sxJqfmf8lOlKvb+9exJrLU1NNRyupaONmVmRvqjsoFgbfT2crNLJT0Pl0WFl Hlno0XU+DqViBqgSXcOC1zYELwb/AOPs0QUQevSRlV3x+fRt8di5BAQlO7/tDQY4zJ6CmppCFHCo n1+lv9f2286ocmnTghUigXpM7hjoIVSlqGZggBmjLsI3QMX8LqTbwBjqK/Qt7dicuKk48ummiRDq PQYbi7c672TE38d3Hg8Q1jpiqayBJyoFzoi1azYfgD6/Tn24XUDj1oSKMKo6Cib5qdK0LtGufepV eA9PQVrRt/ij/b6WH+x5/HujTRrxYV/b14TN5qOsX+z39IRELNl6lAfoTjcjb+o5FHbi/wDre2/q YP8Afmfs634xp8I6wyfzBfjBTssWW7Cx2LLg6/ug0LE86VAmEXq1AccHn376q3TjLTr3iggA46ZK r+YP8WXgd8Tv+nzNQHZRT0vhAPqsmmzys9x9eRpPFj9fdlv7ccJFI+VerCVQBQ9Qcd8v03b9xT7G x6CGrhdPv6mFXEcZYNdHkUsjkLe6aTbi4v72bgTZRTQHHGnDzz0pRhXVjHXzdf8AhRzQZqD+aD2J mMzFMG3V1n1FnaGrlD2yNJFtSPAy1URb9SJkcJPCbcB4iPx7C92GFxIW4k16MI3V1BXqiL2n6c69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de6s//AJfth1/8pXIuE2DtY/8Ar74c/wDRPtZZV8Vqen/Pw6am+Cp4 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 GeeneVWUPqUqAzPZ3drL4E0ZDcfUU9QeB6EbbjazW3jwSA+g86+hHEfn1a1iqupymRxG1qSGaqye aqcTAqlSzQ0KvDDTRFtR/cFLSxqFtwD9fpdDuDFwEHp0isUqxk9ekL/Nz+Qg/uv1p8Ydv1+qHFwU O696x08wK2oIJKPb2Pq0XUP36tp6zS30EcTfke27VacfLH59HGigFPPqh2x/p/rfXn2t63nroDn6 Dj+v+9+/fb1ULxr12APfurhQR1wP1966bOCR11791rr3v3Xuve/de697917r3v3Xuve/de697917 r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de697917r3v3Xuve/de697917rJH+f9h/xPv3Xusnv3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917rEVZn0qCzMQFUC5JNgAAOSSffuvdW+dIfFbbXxt2/h+3 fkXhqfK9v5WCkyvXPSmWp1ng2JHOq1WL3L2ZiKmMx1u8KqJo56Hb86tBjoWSbJo0zCiidhiMpq1R EOJ9fkOtE0oB8R6Enc+5Nt4bDTd+/JjN5hNtZOsyJ2RsbEVyRb/7hztNNIKvFbRlr4ayLD7coa1R Hnd11kM1LjrtFTxVuQMdG15pqN4UFAo/l/s/4OroioWkdcn+fz+zqrf5AfI/fvyFz9BV7hXG7a2X tiKpoOu+rdpx1FBsPr3DVEiyS0mDx09RU1NdlsgYkfJZivlqsvlpkWSrqZWVNKYCn29eZixqegHp Kqehq6WtpZXgqqOohqqaeNtMkM9PIssMsbD9LxyICD/Ue99V6vh2T2ZisD2r1r3TU4mmzGyexsVj 925rb6vrx+Y21vSiqMd2NsdpUOl4YqifM4Kcfh4nU/T3V1Z4XRV7hkflkfz6diIVwWyvA/Z/qPVQ 3yR6dquhO7ewOrZaw5XGbfzIqtpbgC6It1bC3BSU24tg7sgUABYdz7NytDXBPrGZyjWZSBqNxIiu vAjqjqUZlPEdAf7v1Xr3v3Xuve/de697917pfdcdiZvrXccOcxSw1tHNH9jn9vV5lbDbmwksiPV4 bLQRSRO0MugPFLGyVFJUJHUQPHPFHIvuvdfQO/4TPbK6r3T1L3L2PS1Lbo2xuzsjaNVtehrq+J63 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 /wCbYJU2/qST7UqKufQdJLpqRmnEnrvrTa391th7fxAiaOb7L7+rU31CryMjVcoI+oKrKqf6y+1g OQ35dIQmlAOnqshdbk/Tk6TyOT+eOLn2oXplzwHqeklW0+q9x/sPyfyP9t+PdvlXqmQjmtT0mKqB hfSLMf8Abi35H9Le1lvGG+IY6QtWtfl0l6xZSyqusyEhNKgsxZjZbAeosx4sPzx7U+GgKkDPSUGt SeqyPmh/Me6q+LrZTYe1UoO4fkRFC0MXV+EymnB7GnljieHK9z7poPNHtKhp4phKuIgMmdrQNAip I3FWjNxdx24KqNUvoP8AKfL/AA9XjgaQ6nNI/wDVw61i99737G7f3xuTuLuTdVdvffW5Zadchl6q L7HHx0tCznDbP2ZgY3ak2vsXbiuyUdBTjQnqlkaSeSSVg3deLITLM9WJ/wBVB6dHELRgKiCgH+rP Qq9VbR3NtHa28u7l2Lu7f24MRt3c+Y2Vs3aG3q7ceeyqYCiEm5N0jGY+Kesp9vbSp6hF+7KeIVrx rcmKQeycbbPca5I4WdgCQoFSafL5dHdncQIYxLKEQmlT1rmdjb63D2fvnc2/N01Jqc3ubKVGQqzq ZoqWMsIqTHUuv1JR42kjSCJfqEjF+b+y0LpGmnD/AA+dehN4YIwQQfzHSJdRa3+H+2/x/wAPdgaG o69JGumtM9RxGSDqNv8AfDn26XANB0lWNmGT12Y7cA/778+9CT14dXMZpjrDpv8A1v8A0/1vbmOP TRXV9vXCx966bp16x/p7917SfTrr37rXXvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvdZI/z/sP+J9+691k9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3XvfuvdXmfFb4ubd+IvX23/lZ8iMRTVXdu6MZSbi+PXUOao0qX6+xFdGJ8F3LvrC1Ksr7vyq lZtp4mpjK0kZXLVCM32SLeKMTNpLUjHE/wCTrZ7RX8XQSdl9y4zCVVZ2v241RujNZiorqra2x5sj VpW7qyBqXaVspkUk+9oNswVjFsrkEdaqrkDUtK6ztLUUii4mTT4EJwB+z/Z/wdajXT3uPsH+fqsj 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 fUe2WjpRiOPR1CcqTx8uqHv5vH8qTEfLnbGV716Qw1DiPk1tXGGWtx1JHBR0vduDxkCrHtzLy/tx pvmgpIdGGyDn/KAq0NQfG0EtMGuY+WE3aD6m2FNxQY/pj+E/P+E/l6EC3ZNymsz4cprbMRx8v9j/ AAfZXrR6yGOyGKravGZKhq8dk8dV1VBkcbkKaajr8fX0M70tbQ11JUJHPSVlJUxtHLFIqvG6lSAQ fcMurRu6SAq6mhB8j1IaUlRGjypHTc3AJ+p/p9P9j72KkjptjQY6hG55tx/tv9hzz7fFPz6LJAza iR29ceb/ANOLf7fm9/p+Pdwcfn0nIowHn1xZbqCOT+OPwfdg1GIPDrRUldQ6xMD9P6e78Rjpth5e fXAfX34cemxx69b3rr1Mdde/da697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rJH+f9h/xPv3Xusnv3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xujs/Az4kVHy57ri27nclU7V6 a6+xb9g977+hRb7W66xNTDHVUmMeVHhm3du6ulixWHgKyF62pErI0MMxXRNPt62BXjw6ta+T3clN 23u3H7J2bRYnr3prrTBQ7X2ftaCV6PavX3XO0KOWanpZpIklIocTiqaSvylTpknq6kyyHySOAVtB bQk0q540P8uq69ZpSg4dUUd59h0XYO+q+o2/JkRsrDn+FbQp8mkMFW+OgVEnzNbSU5aGlyO4atGq 5Y9czU6yJTCWSOCNvaOpY6m+I9boBwHQN+/de697917r3v3Xuve/de697917obelO1v9HWXr8ZnI 6iv2Fu2Omot1Y6AeWpopqZpTiN2YaB5YoTuDbUtTI0QZkFTSzVFIzxpUNIvgaEEcevdWYbD3Hths XujqPtFX3L0x2njcdTbjfCaK2ejCLJWbH7e2B9y9LF/fDZcte1Zjy7Qiso56vGVRWmrqpPdJYy+i SNv1VrjyI/h/PyPkflXpxHFCjfCf5fPqrvu7p3c/RPY2b683RJQ5B6EUuSwG5cPI9Tt3eu0cxAmQ 2xvPbNY6RvU4PcWJmjniDrHUU7s9PURw1MM0MfkcSKHXgequpRip4joJvd+q9e9+691737r3W95/ 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 iH+m4mnn12tWWglp5RqkmIDn8Aq31/wIU/j3ow0kSRD2r1ZNxaS1ns7ldUr4J8sH/CB1gJjpxErM 4Y6wkgPrikLqRID+AD+Pd+6TWQMeY9R6dJG8GzWAM51EMAwNCrVFG/LrklbLDWwvIo1tZZJBa0hX VaUfi7KbH3owLJC6qceQ9Pl1ePcZ7Tc7eSZP1ThmH4qV7h8yDnrPUTlzX2b/AIEKnH9dMdzf8fQ/ 7x7pHHpFvUfCT/h6VXd20rbrpkP6yr/Jf9X7OmemqSjT0zE2aN1S/wDQ2uP969q5I9QSQDz6Dtne GJrmyZqgoQPsPXTT/bzBgPRJGEPH1DL/AI/kMPfgniLQ8Qa9eNz9Hc6lxG6AH54/z9QHfxTsyn0N cgDgc34P+sT7fA1xgEZHRXLIYLuqt+m3+z1jZxGeLk6vrcadOkAC31vc+7hS/SaWUQuONa/yp1yE hN7/AELav63P4t+LWHv2k9W8fBBOK164PMStif1W/wB4/wCR+7rHQ58umZbrUoHmesd+bD/Yn3en y6TFyTQHrotcgf09+AoK9aZ9TBa4HXWrm/8Avv6e906oHyT10CSST9efeyOA60rElmJz10Tf34Dq rNU8eur+99arXro+/dVJ8uvE+/deJ9Ouve+q9e9+691hf9R/3349+62eJ64+/da697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3XuuWth9GYf7E/8V9+69070W49wY0qcfncxQlLFDR5OtpihFrFTDMmm1vx7qURviQH8urBm HBiOlxR94d0Y/SaDtzs2i0G6/ab73RTaTa3p8OUS3Htg2do3xWsZ/wBqv+bpwXE4FBO4H+mP+fpR 0/yg+StGoWk+Qnd1Kq/RaftXfMCj6ngRZ1QPr719DZcfo4q/6Rf83W/qrnB+okr/AKY/5+stT8p/ k3WKq1nyK7zqlW+lantnfk4W4sdIlzzBbj+nv30VkOFpF/vC/wCbrRubg8bh/wDej/n6TdZ3r3bk VZMh3D2jXK2oMtZv7dVSrB/13E2VcHV+f6+7ra2yfBbxj7FA/wAnVTNKeMrftPSIq907nr9RrtxZ 2sLG7Gqy1fUFj9bsZahyeT7dCIOCgfl1Qsx4semRpJGJZpHZjySzsSSfySTc+7da643J+pJ/2Pv3 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 hqEMR+R6kxVICRcWaJwTex1qxCsb/X6f717baM6mzgjpZBeqsUH8cbivzBoDn9nUusqBPB+ojSA4 t/wZl5+nBB9swxeG9acejDc776u1pWgUA49akf4OmpJRYpf8FCw5sb3BH+39qmXgT0QxTqAYw1cE VH21HXNanxMXIB1EFgf62IP+9+9eGXGn06cW9EDNIRWpBP20p10ZhKxlb1ryiqSTp/xHv2jQNFKH j1QXIuXM7DVGe0D064O7yxqCSZKdmCkgepbDSbn6292ACMSB2t03JJJPCqlv1oiafMeXXKGoLXJP PFweeVBBB/xA91dKdPWt0XLNXP8Amx1EldUmEv8Aqrg25sf+KX9vIrMhTotuHSK5W4BIrUH/AFen XU0mtA1/oRbkcf6/+x97RdLEU69czGWFZAa0NR1EZ2dV59SC9j+eTf8Aofp7fChWP8J6LHkaWNQf 7Rc/zz1xLa1B/I+vuyrpY9UmkMqJ/EK1643P9T7tQdJ9TevXf++Hv3W6+ZPXgbAn8n34562p0gnz PXV/fqdV1Hr3vfWq1oOu/p711fh11731SuT11791rr3v3Xuve/de697917r3v3XusL/qP+w/3r37 r3XH37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+690f8A/lO/9vTf5af/AIv/APDf/wCCK659+691/9DQRzP/ABd8r/2sq7/3Kl9+6902+/derXr3 v3Xuve/de697917hnrkT9PfurEgkdclY3H+HI59+wfLqymvWTXxY/wBPx/X6/n8e6+HmtenGc0z1 4PyPqLk2/Nvp/t/eiuOtK9CPt67DXIsODx/r/n/D34pQV8+r6zUEeZ65awbj8/72T/Tn8H3XQaA9 W8TP2HrvV/vVuf8AD6e/BfPy62zkrx67V/yPyPp/Q2/H4vY+9MtDTq0chJ/pf7HWdpeeP8Bq+pNx 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 7rb6gx2H+wPH+9+2ytG+YPS1Jta0B7Sv/FdRxZXP4Uc/434/4k+3SSV9SekaaY5HzRR/sddF11Bj fSVtb/b34uP8PfgpAIp3A9UaYM4kyUI4ft/2OsiHSlgeDzwefqbf63urCrVPHpRA3hRhV+E564lw SPVZri/+t/T62t72FIrjHVTIGIAfvB/1DrEJNLkn6N9QD+ePp7sUqAB5dJ0uQkhJwD/h69MFeMkM L/ix/H9D79GWVgKY6tdIssRIPcM9QkdgdBuR9Le1DAEV8+iyKRkOip0+nXbXR9X1U/X/AGI59+Hc tOvNVH1jh1yIH6l+h/33/E+/LXIPWpdJoycD117t0z1737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3XvfuvdYX/AFH/AGH+9D37r3XH37r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+690f8A/lO/9vTf5af/AIv/APDf/wCC K659+691/9HQRzP/ABeMr/2sq7/3Kl9+6902+/de697917r3v3Xuve/de697917r3v3Xgaddk39+ 6szV69f6f4e/darSnXIH6/7c/wDFfe+rBuutR5v7917Weu9X9ebm5t9f6+/cOvFsdclbkcfXj6/4 +9NkdbV8jHWTWLm/0vwfx/vXupXtApmnTgehJp69cmb6Wtza3/En3QClSerayCKfLr19QuDa5/x+ gBAH+t78cYI8utk6sk4r165Fv9iP9bi/+9D3qnHrZI7QOFeuQa1/99/xX3ojh08sjLXPy69q+n5/ H++Pv1OvGQ4HXi1+Tybf1/H/ABI9+APAdaaUNpNfLr1/Tb8cn6/4f8QD79TPz68ZQE+XWWNrD/X/ ANv+m3+2HurLn7OnoXrGWrnrmsgHp+t+P8Bb/jQ91K1z1eOXSKV49cJHJkJB/wBb/YD3tVooHTUs jPOzVr1k8iqii31H0/p+D/sSfddJLE16UeIEjQdeMhJiA+n1I/I5vz/re/BQA9ePWzMHMOk4/wBn rNLJp5/4KLf4D/b8gn3REr0/PMRX7Mfl1xV7qtzfi/P+P+H+x9+K0Jp1RJKomo1NOvF7MCfyT+bf 19701FOtGXIJOSeuDNdgp+hte359Xq5/px72owT59MySaiq1wevBuW+n1Ci/HGlj/rA397K8OrRy AF8+g/wnrnrsGN/pccf04H+9+6aa0FOnEkprOrH+odSJX16f9pFr/T88/wCPuiilellzL4iJ8uoa NyQfoCzX/wBiDz+OPbzDgfPosifOn8OT1kv6hY+mzX+hseCP9sPdaYNRnp7WWZdJ7aH9vXC5RQL3 u31/Fyf9797+Ik/Lpolo0ArxPWYnk/m1j/tx/vPulOHSln7tI8usTvZgQeL3I/qPp9P8Le7quDXj 0kkca0H4a/7H+Q9ZI5LMrE3IBPPK8k2Bv/S/urLxFOlEE2llk1VYAn+Zx1JaYuyE/wBldItx9f8A WHFr+2wtAadL2nLyRk8APs6jSytI5Y/pZiQP6L9FAP8AwVPbqrpUAeX+r/L0X3EzSyM5+EsT+XAD 9i9dRyW+puxsSDfngfX/AG59+df2dVhlNQK5Iz+zrEz+s8kqFUfX86T/AMV93C9oxk9J2lJlrU6Q AP5Z65BxwT/vP9eef9gB71pOadOrICRXiP8AD135A3JJH6QOeP8AVf8AFP8Ab+66SuKZ62Z9eTwq P8/UxZV8JDH6KAp/1jc2v+OT7aKnVgdGyTp9Owc+Qp/q/M9N8sgeUtf08cfg8/m/9PahFKoB59E8 83izlxwPWNmAW176m1Nb+v1tz/j7vSprTh03IaQgassc9dBuf6i1hc/T/W59+I9Om0l05HHri7Es ST+eB/Sx4/3r35RQAdelkLuTXHWfUGIH0/PHFrG5P+IsPdKU6UpIGAAx1yVwTbVYHm5t+Tf/AA/H upXFaZ6dEitqAOf8+esDMfVdrkn/AHnVfj/be3QBig6RPIWDgmpP+frirL5fXcgre3/BQQOPz9Pe yp8Pt416qrq1yWcVWn+Drxa4J4BJufzx/T/effgKGnWjJqWnmW66Dk2DEkC/F/wP+Re/FeJHWxJQ hXNR/q/zdchIdLL9fTb6k8/Un/G/vRXKtTpwT9rrTgKfn14XUK30a9x/rfg2/wBce/GhqPLqqURY m/H5fn1xLlgCTxc/U/n6e96aHHHqvjlwteHXeuysD+bf4fTn6D+vveipX160ZqK4B40H+Xrq/wBO foOP9v8A7zyffqGpx1tZqaanI/z9c/Nqjsf9ULk/Uf7f3Xw6MCONOrtdFo9JGdXXSNa9iPoR+f6i 9j/hb35l4VHXopeK/L/N1zMn+cBY88KP9iR/vXuummnHTzSU8Uk/6s9cAxFv8F5v+fz/ALb3Yrkj 59NpL2qP6PXNZBb83ux4+g1cj6/0PupU/l05HMpFeGT1wdiGBvf6c/8AE+7KBQ46ankIdTx4ddq7 Af4KSP8Ab8H/AF/p78yjh69bhdtJJyASP29eZrhQD9B/vNgCLe/D7OtSya0jC8adcAT+TcAW/wBj yf8AbA+74FaDNek61JAZuynXJnFrki9rc/n8/i/uqgk0pivV5pEwwOaU64IwbVf+o4v+Dxe3u7gj TTh01EcmpyT1JicgWb6X4/r+T/tvbUig5XpbauwBR+I4dYJT6v6At+P8Sv15/Pu8YwfWnSa6NXwe 2v8Am67uLECx/r/vY96PHu69Wo0pkjrF5mU2YfT/AH30PHtzQCKjh1QXMqkVPDrJfV6hxcfX/Y+2 /hqCOrsRJWRTRj1jkBIBB4Auf9f6X9uLxI6YepCn5ddISPTz9bjm/wBR/r+/MAcjq8UhXtr2164y gcEfX8/6/B9+QmhHVJwuoMnp10GupuPxx/r/AOv+PdtNCCOqhtSkHrpfqf8AYW/3n3vpo4+zrn79 1rr3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6wv+o/7D/eh7 917rj7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de6P/APynf+3pv8tP/wAX/wDhv/8ABFdc+/de6//S0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve /de697917r3v3Xuve/de697917r3v3Xuve/de697916vXvfuvde9+691737r3XK/B/1x73Xq1cHr sH/H+tuffvXrdQePXMN6VHIA/wBuefxz/T3WgySM9WqdIHl11qJtc/T/AHs/n3ugBJ69WvHrlrIF vqb/AO8W/wB5960ivDHW6kfbXr2o/wC8fj/e/e9I9OtmuTXPXAEm/wDSwH+29+oOqKak+nWW5088 cf7fj3QDvx69Ok/pgHj14GyiwJJ/qPyD/vXvxWrGpx1tXKppHXer/Em1wP6/7D3UrTqyv5DiOvav UR/QC3/FP8fr79TtB6qGrIc565a/oP6D6f4XPH+PvWnj08ZTgFhw67vyP9v/AL4f6/vVDTrSvlfk eu2fVcsf9696C0wB068xIBPXtZ/r/ha/+N/fqfLrYlOB5Y68zXv/AI/4/wC+t72FOOm5JSXP8uuJ e5AuSQL/AO9/7z7sFxXpppO77Ovaj/X+nH+P+v7rT5dWDGnH/Vw65BiB+bH68fi97X/1/eiOrBzk E/6q9ZXmvcL9Lf7yTf8A3ge6qlMnj0pluB3L5U/w/wCbrEHNzb6WIHP4P1/2/u5X16TK+Kg4671k C39ARf8A4Nx9f6j3XSDnq/i6RjhT+Z65GQtpH9CLk/1/3j34LSp8+rNID4YPl14yNckGw/rb8fQf 7a/vwQAAEdeaapJr/q4dcNR/2FrX+n+t/rcfX3YD9temCxr8qdZkccXFySBa3HFhf88390Za1pw6 URyAZYZqP8nWXVYE3/LWv+ADYc/659t6cjHTofSGOrzPWAnlLk2JBP8AsCRz7ep8VOkxanhiuP8A Z68rWOr/AAP0H+F/9hz70Rqx16NytG8+serlr/krz/h+T/iTb3elAvTOrL18yOuOo3P9f9f3qn7O nNRpWvXub/4fj/erf7x7302pbNeva72Unj+l7fX/AA/r79opUgZ6t4xIClsDrxN/8Pr/AL63vwHH HWmqSD1jY/pA/Bv/ALH3dBxJ6bkJJVQeHXtX0/r+f9ew5/1veyuD15GoQCOPXZYXIP4/417qFNAe vFwrGnl1yvb8/jj/AHj3rTXqyuyjHxdd35t+D/rfn8f69h79pxWuet62DHP+rh1jZ+ePrq/3gAX/ AN592CDFfTpouT+3rijepj/tJ/r/AI+9sMD7evI+XPy68GsADz9ef99/j78y1JI68jaaDrx/WB/i o/4n3tcLXrzmr4GOva7X4PJ/1vr9Pfivw1PDrWqlT5HrJcm3PF7/AOuLfj23TJrx6cJGlc9cb3Cj 6Ajn/YfT3emWPVK4A9euLn0kj8t/seFA9+pRvy6qx7fz646ibX+gFv8Aevp7uB6daBrn5dcr8Ef4 3/w4B4v/ALD3qma9bOAeuS3sW/P6bX/qR/xX3phWi9WUkZH2dZAeSP6Dn/Y/7yD7aK0A6d11LCuO uI+tv6Bf9vzf/Ye9kGlfOvVA2fy68p+p/oT9f99+PfiD2g8erKxTVQ466Lcj/Gx/P5I/3oe7haA+ vVWdmKk/LrtTpBBN/V/j/sP6/Ue9FdRUj06ukmhHU+Z69q4vb6cf7z/xT3or3U9eqhu0muR14va4 HP8AT+g/xHvapwJ68z+VOsDEkD/C4/1xf/iPd/U9MGpA66VipB9+OQR1pWKkHrOkpvz+SAP8Ofz7 oygAUHT6yuWqTx65SC6kn8Em/wDtuP8AY+9IaH7erzVIB8gOsaNpuRzxxf8APP8AxT3dgDTGOmUJ WrD064OdVz/Uj/ev+Ne9gUAA4dUYk1J65LIQLD/ff8j9+oDx62rEA0PXtRIt9RZh/t+f949+pmvW ycAeVKdY7m4P0/41731SvdnrJc/64/H+29+6cHWNvr/sPfj022D1yj/P+w/4n3rqvWT37r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691hf9R/2H+9D37r3XH37 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+690f /wDlO/8Ab03+Wn/4v/8ADf8A+CK659+691//09BHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de67Juff utk1I69c+/deJOevA8W9+62GxTrwNvfutA065auf6f7H37q2qvl1zBt/r3/24IPHvxFfPq4amPPr wKg/m1v95J/4ge9EE/b1sMFbA69/j/vh7tQAU618zx664BH+v78eB69gEHrsctbn8/n/AHw+o91O BXrfFuPXJjxb/if6fjj/AF/flFOvNktnr2v6H6c3+v8AgePetGPXrZckADh10GIF+bn/AIoP9h+f e9I9Oq1PHz66ub3v+Lf7x/xB97Axn1695n59d6rW/P1JHvWkEnr1adc9Q/r+B/X3QoeIHV9Qpxz1 xZuLfm4uOfxf3ZVoa9adya5zXrrVwOfwCf8AXANxf/E+90rUkZ6rWgA68XJK245tb/Y8e9BQK+vW ixND1zDcX+lief8AAfj3UrTp0Px6xBjxc8fX24VH59Ngk0z8+uw5vY/i5/wuAfeiB6daDGpqesym 1j+LA8f7c/7b22wqeHT6vQAnj12ZLJb631N/X6f8bPvQXuz1svSMD7f9X7T14G7WPNh9f+Cn/jfv ZHbUcOqjLUOQP8nXRYFtP9OSf9tx+PfgtBU8evFxUAHHn1wHFy3Fhb/k64Pu59Omx5t5ddazyf8A eP8AYi3+8e/aQKdb1kAjr2vj/Hnj6fXm44/A9708Otaq19esbHkn/E8/8U924dUbGR1y1n+v9f8A ff7x71pHW61qK46xliTe/v3Dh1QsfI9cl5/2/vfr1dTUfOvXE3LH/E+9f4OqH4j1zv8An83sB/rf 4+/D+XV6n1z1zZwLcXFr3/2/+uOD7qF41PViadYv6/61/d+qVoD10DYH/Hj37qoNAT11f3rrVevX Pv3Xqnr1/p/vvz7916vD06yaiB/gR/tv+R+/EDj06SQtPLrhfke916brUjrtjwBa3vXW2JoOug1v xf3uvWg1BSnXi1/fq9bZq9eDWv8A7wf6cg+9daDEdd6jdjc82/3i3v1B1upqTXrkGA5/1v8AbWb3 49b1UNeuZZbEC3P1/wAL+9aakHq9RQgHj1jJ4A/p/T/X929eqngB1yJ5P9L/APGv95t70BQfl1sn JPl1w1Wvb6H37Hn1TVxpw661H37rWs9eLe/dbLk+XXHj37qnWQfUEHgEe9ngfs6cPEEcOsjuALfX /iPbaL+I9OSPinWC/u/TFT17/XF/9e/v3WuvX/N+b+/dbBp13fg/X/jf49+69Xrof1/3x+lx/tj7 91rru44H0/x5+n+tf37r1T69dEW/qRYc/wC2/wCK+/de65p+f9h/xPv3Xusnv3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rC/wCo/wCw/wB6Hv3XuuPv3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917o/wD/ ACnf+3pv8tP/AMX/APhv/wDBFdc+/de6/9TQRzP/ABeMr/2sq7/3Kl9+6902+/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917rv37rfmOuw3v3Ww1OuQa/vfVw1T10W/p791ot6deU/U/Xg/7171x60py SevE3HHvfWyagAHrwPFvfh1oHBHXV78f63v3Xq+XXV+feuq1zXrlfi/5976vqxXz65A8f7D37qwO K+fXRPH+P19+60xxxz11e4P+8e9Zz1UHB6435v8A09+49armvXNSbEfW/H+39+pXr1cHrofT3sdW HwjriPx/vv8Ab+9dVHl1lBGk/Qfj/ko/8a91pladXBwa8OvAixuf8B/hc3/HvZFSKderxHl1zU21 f4kkD/ef9hwfeiPhxw6sCBqPr1jBJJI/JA/2x/p7tQemOqBjU08+uyTptzcm/H+w+vvQHdXrxJ06 fn1jN/z/AFtf3s9Vznrq59+61Ujrsm9r+99bLVpXrq/vXWq9de/da65A249+6sGIqOuvz791occ9 d3AII976sSAQQevE3FvfvLrRaop1x966r1737r3Xvfuvde9+691737r3Xd+Le/dW1GlOuvfuq9dk 3t791smtOuvfutde9+691737r3Xf9ffut+vXr+/der11791rru5vf37rdTWvXib/AO9+/fl1smvX Xv3Veve/de697917r3v3Xuve/de697916p697917r3v3Xuve/de697917r1/99/vv6+/de697917 ru5/5Hz/AL37917rtWtfi9/9h7917rl5P8P95/417917r3k/w/3n/jXv3XuveT/D/ef+Ne/de695 P8P95/417917r3k/w/3n/jXv3XuveT/D/ef+Ne/de695P8P95/417917r3k/w/3n/jXv3XuveT/D /ef+Ne/de695P8P95/417917r3k/w/3n/jXv3XuveT/D/ef+Ne/de64E3N/fuvdde/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuj//AMp3/t6b /LT/APF//hv/APBFdc+/de6//9XQRzP/ABeMr/2sq7/3Kl9+6902+/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/der1737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3XIED/Y+99XVgK9df1966r69de/da67uffut1PXv6e/de9OuY+n+xPvfVxShPz64/X/X9660 c+eeuweP99/T37rwOK9dXsP99/j791ry69e3+x/r7316pHXV/wAe9dar11x791rr3v3Xuve/de69 7917r3v3Xuve/de697917rv+nv3W/Trr37rXXvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3R/8A+U7/ANvTf5af/i//AMN//giu uffuvdf/1tBHM/8AF4yv/ayrv/cqX37r3Tb7917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de67Bt/xT37rYNOPXib+/deJr9nXamxP+tb37062vHro8H3vrXA9e49+69jrr3rrXXvfu vde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdH//AJTv/b03 +Wn/AOL/APw3/wDgiuuffuvdf//X0Ecz/wAXjK/9rKu/9ypffuvdNvv3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3 v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuj/wD8p3/t6b/LT/8AF/8A 4b//AARXXPv3Xuv/0NFfLf8AF0yX/Mtv+LhWfp/T/wACJP0/4f09+6903/8Aot/fuvde/wDRb+/d e69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/AEW/v3Xuvf8Aot/fuvde/wDR b+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/AEW/v3Xuvf8Aot/fuvde /wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/AEW/v3Xuvf8Aot/f uvde/wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/AEW/v3Xuvf8A ot/fuvde/wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/AEW/v3Xu vf8Aot/fuvde/wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/AEW/ v3Xuvf8Aot/fuvde/wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/ AEW/v3Xuvf8Aot/fuvde/wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r 3Xv/AEW/v3Xuvf8Aot/fuvde/wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de69/6L f37r3Xv/AEW/v3Xuvf8Aot/fuvde/wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+/de6 9/6Lf37r3Xv/AEW/v3Xuvf8Aot/fuvde/wDRb+/de69/6Lf37r3Xv/Rb+/de69/6Lf37r3Xv/Rb+ /de69/6Lf37r3Xv/AEW/v3Xuvf8Aot/fuvde/wDRb+/de69/6Lf37r3Xv/Rb+/de6jVn/AOr/wCP A/4DT/8AAP8A4Gf5pv8AgJ/00/8AHP8A2q3v3XukB7917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917o/wD/ACnf+3pv8tP/AMX/APhv/wDB Fdc+/de6/9k= ------=_Part_53795_6872052.1472075609959 Content-Type: image/jpeg;name="1469094886566.png" Content-Transfer-Encoding: base64 Content-ID: <2@entsoft.net> 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 ------=_Part_53795_6872052.1472075609959-- From darrick.wong@oracle.com Wed Aug 24 18:42:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2C8187CA0 for ; Wed, 24 Aug 2016 18:42:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D65968F8033 for ; Wed, 24 Aug 2016 16:42:44 -0700 (PDT) X-ASG-Debug-ID: 1472082162-0bf8155c751637b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 8qupufAXPwnUkwAk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 16:42:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7ONgeoW013792 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 23:42:40 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7ONgd49021634 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 24 Aug 2016 23:42:40 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7ONgdmB022082; Wed, 24 Aug 2016 23:42:39 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 24 Aug 2016 16:42:38 -0700 Date: Wed, 24 Aug 2016 16:42:37 -0700 From: "Darrick J. Wong" To: Dave Chinner , Brian Foster Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: "Bad page state" errors when calling BULKSTAT under memory pressure? Message-ID: <20160824234237.GA22760@birch.djwong.org> X-ASG-Orig-Subj: "Bad page state" errors when calling BULKSTAT under memory pressure? MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472082162 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7140 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32299 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi everyone, [cc'ing Brian because he was the last one to touch xfs_buf.c] I've been stress-testing xfs_scrub against a 900GB filesystem with 2M inodes using a VM with 512M of RAM. I've noticed that I get BUG messages about pages with negative refcount, but only if the system is under memory pressure. No errors are seen if the VM memory is increased to, say, 20GB. : BUG: Bad page state in process xfs_scrub pfn:00426 : page:ffffea0000010980 count:-1 mapcount:0 mapping: (null) index:0x0 : flags: 0x0() : page dumped because: nonzero _count : Modules linked in: xfs libcrc32c sch_fq_codel af_packet : CPU: 1 PID: 2058 Comm: xfs_scrub Not tainted 4.8.0-rc3-mcsum #18 : Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014 : 0000000000000000 ffff906f9c4237b0 ffffffff98331bf3 ffffea0000010980 : ffffffff989d923c ffff906f9c4237d8 ffffffff9819c5b4 0000000000000000 : 0000000000000000 0000000000000000 ffff906f9c4237e8 ffffffff9819c701 : Call Trace: : [] dump_stack+0x85/0xc2 : [] bad_page+0xc4/0x130 : [] check_new_page_bad+0x71/0x80 : [] get_page_from_freelist+0x907/0xa60 : [] __alloc_pages_nodemask+0x156/0xf70 : [] ? is_module_address+0x2f/0x50 : [] xfs_buf_allocate_memory+0x1f6/0x2f0 [xfs] : [] xfs_buf_get_map+0x1bd/0x400 [xfs] : [] xfs_buf_read_map+0x2c/0x360 [xfs] : [] ? queue_unplugged+0x57/0x190 : [] xfs_buf_readahead_map+0x52/0x70 [xfs] : [] xfs_btree_reada_bufs+0x9d/0xb0 [xfs] : [] xfs_bulkstat_ichunk_ra+0xda/0x110 [xfs] : [] ? xfs_btree_check_block+0x14/0x20 [xfs] : [] xfs_bulkstat+0x2b8/0x6c0 [xfs] : [] ? xfs_bulkstat_one_int+0x430/0x430 [xfs] : [] xfs_ioc_bulkstat+0x116/0x210 [xfs] : [] xfs_file_ioctl+0x591/0xf10 [xfs] : [] ? kvm_clock_read+0x23/0x40 : [] ? kvm_sched_clock_read+0x9/0x20 : [] ? sched_clock+0x9/0x10 : [] ? __lock_acquire+0x25d/0x14b0 : [] ? __fget+0xf3/0x200 : [] ? __fget+0xf3/0x200 : [] ? debug_smp_processor_id+0x17/0x20 : [] ? get_lock_stats+0x19/0x60 : [] do_vfs_ioctl+0x93/0x700 : [] ? __fget+0x110/0x200 : [] ? __fget+0x5/0x200 : [] SyS_ioctl+0x41/0x70 : [] entry_SYSCALL_64_fastpath+0x1f/0xbd : Disabling lock debugging due to kernel taint Obviously, a page refcount of -1 is not a good sign. I had a hunch that the page in question was (hopefully) a page backing an xfs_buf, so I applied the following debug patch: diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 607cc29..144b976 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -317,7 +317,7 @@ xfs_buf_free( for (i = 0; i < bp->b_page_count; i++) { struct page *page = bp->b_pages[i]; - +if (page_ref_count(page) != 1) {xfs_err(NULL, "%s: OHNO! daddr=%llu page=%p ref=%d", __func__, bp->b_bn, page, page_ref_count(page)); dump_stack();} __free_page(page); } } else if (bp->b_flags & _XBF_KMEM) I then saw this: : SGI XFS with ACLs, security attributes, realtime, debug enabled : XFS (sda): Mounting V4 Filesystem : XFS (sda): Ending clean mount : XFS: xfs_buf_free: OHNO! daddr=113849120 page=ffffea0000010980 ref=0 : CPU: 2 PID: 2058 Comm: xfs_scrub Not tainted 4.8.0-rc3-mcsum #18 : Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS Ubuntu-1.8.2-1ubuntu1 04/01/2014 : 0000000000000000 ffff906f9c4239f8 ffffffff98331bf3 ffff906f95e86b00 : 0000000000000000 ffff906f9c423a20 ffffffffc03ca53e ffff906f9c604900 : 0000000000000000 0000000000010015 ffff906f9c423a60 ffffffffc03cc640 : Call Trace: : [] dump_stack+0x85/0xc2 : [] xfs_buf_free+0x27e/0x290 [xfs] : [] xfs_buf_get_map+0x360/0x400 [xfs] : [] xfs_buf_read_map+0x2c/0x360 [xfs] : [] ? xfs_buf_readahead_map+0x52/0x70 [xfs] : [] xfs_buf_readahead_map+0x52/0x70 [xfs] : [] xfs_btree_reada_bufs+0x9d/0xb0 [xfs] : [] xfs_bulkstat_ichunk_ra+0xda/0x110 [xfs] : [] ? xfs_btree_check_block+0x14/0x20 [xfs] : [] xfs_bulkstat+0x2b8/0x6c0 [xfs] : [] ? xfs_bulkstat_one_int+0x430/0x430 [xfs] : [] xfs_ioc_bulkstat+0x116/0x210 [xfs] : [] xfs_file_ioctl+0x591/0xf10 [xfs] : [] ? kvm_clock_read+0x23/0x40 : [] ? kvm_sched_clock_read+0x9/0x20 : [] ? sched_clock+0x9/0x10 : [] ? __lock_acquire+0x25d/0x14b0 : [] ? __fget+0xf3/0x200 : [] ? __fget+0xf3/0x200 : [] ? debug_smp_processor_id+0x17/0x20 : [] ? get_lock_stats+0x19/0x60 : [] do_vfs_ioctl+0x93/0x700 : [] ? __fget+0x110/0x200 : [] ? __fget+0x5/0x200 : [] SyS_ioctl+0x41/0x70 : [] entry_SYSCALL_64_fastpath+0x1f/0xbd ...followed several seconds later by the BUG message seen earlier. It looks as though the bulkstat call is attempting to start readahead of the inode chunk, but I'm not familiar enough with how RA works to readily tell what's going on here, or why it's freeing a xfs_buf as part of starting RA. The sector 113849120 does indeed contain an inode. # xfs_info /mnt meta-data=/dev/sda isize=512 agcount=4, agsize=56308224 blks = sectsz=4096 attr=2, projid32bit=1 = crc=0 finobt=0 spinodes=0 rmapbt=0 = reflink=0 data = bsize=4096 blocks=225232896, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=109977, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # df -i /mnt ; df -k /mnt Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda 430M 2.0M 428M 1% /mnt Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda 900491676 326109388 574382288 37% /mnt Kernel is 4.8-rc3 + Darrick's giant patchset, though I can reproduce it with plain 4.8-rc3 if I beat on bulkstat somewhat harder. Not sure what the fix is here, though disabling inode chunk readahead for bulkstat does make the BUG go away. :$ --D From david@fromorbit.com Wed Aug 24 19:24:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8E6357CA0 for ; Wed, 24 Aug 2016 19:24:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3F997304048 for ; Wed, 24 Aug 2016 17:24:24 -0700 (PDT) X-ASG-Debug-ID: 1472084660-0bf8155c74169b00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id siQLr992hwNX6nvx for ; Wed, 24 Aug 2016 17:24:21 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2D0EgAJOr5XEAI1LHlcgykBAQEBAR6BUoZynAEBAQEBAQEGjHGDaoIqhA2GFwQCAoFKTQIBAQEBAQIGAQEBAQEBAQE3QIRiAQUnExwjEAgDDgoJJQ8FJQMHGhOIMcAdAQEBBwIBJB6FSIUVgSCGTYIvBYgkhzKJco8ZgXeEXIkHSIt4g3mEYyo0iFcBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2016 09:54:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bciSm-0008Ss-AF; Thu, 25 Aug 2016 10:24:08 +1000 Date: Thu, 25 Aug 2016 10:24:08 +1000 From: Dave Chinner To: Artem Savkov Cc: Eric Sandeen , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Message-ID: <20160825002408.GC19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. References: <1471967653-2561-1-git-send-email-asavkov@redhat.com> <20160824015551.GB19025@dastard> <20160824080833.GA11104@shodan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160824080833.GA11104@shodan.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1472084660 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2802 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32300 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 24, 2016 at 10:08:33AM +0200, Artem Savkov wrote: > On Wed, Aug 24, 2016 at 11:55:51AM +1000, Dave Chinner wrote: > > On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote: > > > Commit "xfs: only return -errno or success from attr ->put_listent" changes the > > > > Please quote commits in --oneline format in changelogs - it makes it > > much easier to find the change you are refering to if there is both > > a commit ID and the text string in the commit message. (i.e. text > > string confirms the commit id is the one you meant to quote). > > Noted, thanks. > > > > > commit 2a6fba6 ("xfs: only return -errno or success from attr > > ->put_listent") is the one you are refering to here, right? > > Yes, that is the one. > > > > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient > > > space in the buffer assuming that setting context->count to -1 would be enough, > > > but all of the ->put_listent callers only check seen_enough. This results in > > > a failed assertion: > > > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 > > > in insufficient buffer size case. > > > > You have a test case? Can you turn it into an xfstest? We really > > need regression tests that cover issues like this.... > > > > llistxattr02 test from LTP reliably hits this, I'll see how this can be > ported to xfstest. So, after battling the obtuse, completely useless ltp install documentation and having to resort to reverse engineering a working configuration using strace, I finally got this running, I think, on an XFS filesystem: /mnt/scratch/ltp$ sudo ./runltp -b /dev/pmem1 -B xfs -z /dev/vdc -Z xfs -q -p -s llistxattr -I 100 .... Summary: passed 1 failed 0 skipped 0 warnings 0 tst_test.c:756: INFO: Timeout per run is 0h 05m 00s llistxattr02.c:76: PASS: llistxattr() failed as expected: ERANGE llistxattr02.c:76: PASS: llistxattr() failed as expected: ENOENT llistxattr02.c:76: PASS: llistxattr() failed as expected: EFAULT .... And it doesn't fail. strace output: 24833 lsetxattr("symlink", "security.ltptest", "test", 4, XATTR_CREATE) = 0 24833 llistxattr("symlink", 0x7ffe312356b0, 1) = -1 ERANGE (Numerical result out of range) 24833 llistxattr("", 0x7ffe312356a0, 20) = -1 ENOENT (No such file or directory) 24833 llistxattr(0xffffffffffffffff, 0x7ffe312356a0, 20) = -1 EFAULT (Bad address) I'm assuming from your description that it is the first one of these that fails for you as it is the "buffer too small" test case. So, not as obvious as it first seems - ltp doesn't appear to be a reliable reproducer of the problem, so we are going to need a custom test to exercise it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 24 19:35:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 046267CA0 for ; Wed, 24 Aug 2016 19:35:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9CAE48F8033 for ; Wed, 24 Aug 2016 17:35:53 -0700 (PDT) X-ASG-Debug-ID: 1472085350-0bf8155c7416bb50001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 5GeudHNjOPQGHoot for ; Wed, 24 Aug 2016 17:35:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DyEgCVPL5XEAI1LHlcgykBAQEBAR6BUoZynAEBAQEBAQEGjHGGFIQNhhcEAgKBSk0CAQEBAQECBgEBAQEBAQEBN0CEYQEBBAEnExwjBQsIAxIGCSUPBSUDBwYUE4gqB8AdAQEBAQYBAQEBIx6FSIUVh22CLwWZSI8Zj1qMQIN5gmkcgV4qNIhXAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail07.adl2.internode.on.net with ESMTP; 25 Aug 2016 10:05:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bcie4-0008Te-Ue; Thu, 25 Aug 2016 10:35:48 +1000 Date: Thu, 25 Aug 2016 10:35:48 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: Brian Foster , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: "Bad page state" errors when calling BULKSTAT under memory pressure? Message-ID: <20160825003548.GD19025@dastard> X-ASG-Orig-Subj: Re: "Bad page state" errors when calling BULKSTAT under memory pressure? References: <20160824234237.GA22760@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160824234237.GA22760@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1472085350 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2766 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32300 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 24, 2016 at 04:42:37PM -0700, Darrick J. Wong wrote: > Hi everyone, > > [cc'ing Brian because he was the last one to touch xfs_buf.c] > > I've been stress-testing xfs_scrub against a 900GB filesystem with 2M inodes > using a VM with 512M of RAM. I've noticed that I get BUG messages about > pages with negative refcount, but only if the system is under memory pressure. > No errors are seen if the VM memory is increased to, say, 20GB. > > : BUG: Bad page state in process xfs_scrub pfn:00426 > : page:ffffea0000010980 count:-1 mapcount:0 mapping: (null) index:0x0 > : flags: 0x0() > : page dumped because: nonzero _count Unless we are double-freeing a buffer, that's not an XFS problem. Have you tried with memory posioning and allocation debug turned on? > : Modules linked in: xfs libcrc32c sch_fq_codel af_packet > : CPU: 1 PID: 2058 Comm: xfs_scrub Not tainted 4.8.0-rc3-mcsum #18 the mm architecture was significantly modified in 4.8.0-rc1 - it went from per-zone to per-node infrastructure, so it's entirely possible this is a memory reclaim regression. can you reproduce it on an older kernel (e.g. 4.7.0)? > Obviously, a page refcount of -1 is not a good sign. I had a hunch that > the page in question was (hopefully) a page backing an xfs_buf, so I > applied the following debug patch: > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 607cc29..144b976 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -317,7 +317,7 @@ xfs_buf_free( > > for (i = 0; i < bp->b_page_count; i++) { > struct page *page = bp->b_pages[i]; > - > +if (page_ref_count(page) != 1) {xfs_err(NULL, "%s: OHNO! daddr=%llu page=%p ref=%d", __func__, bp->b_bn, page, page_ref_count(page)); dump_stack();} > __free_page(page); > } > } else if (bp->b_flags & _XBF_KMEM) > > I then saw this: > > : SGI XFS with ACLs, security attributes, realtime, debug enabled > : XFS (sda): Mounting V4 Filesystem > : XFS (sda): Ending clean mount > : XFS: xfs_buf_free: OHNO! daddr=113849120 page=ffffea0000010980 ref=0 Which implies something else has dropped the page reference count on us while we hold a reference to it. What you might like to check what the page reference counts are on /allocation/ to see if we're being handed a page from the freelist with a bad ref count.... If the ref counts are good at allocation, but bad on free, then I very much doubt it's an XFS problem. We don't actually touch the page reference count anywhere, so let's make sure that it's not a double free or something like that in XFS first. Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Wed Aug 24 19:48:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B13497CA0 for ; Wed, 24 Aug 2016 19:48:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80879304051 for ; Wed, 24 Aug 2016 17:48:32 -0700 (PDT) X-ASG-Debug-ID: 1472086109-0bf57c55b3173d30001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 8g28MEaXDfVHAmTO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 24 Aug 2016 17:48:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7P0mQ59018739 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 00:48:26 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7P0mPFY024063 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 00:48:25 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7P0mOrF020851; Thu, 25 Aug 2016 00:48:24 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 24 Aug 2016 17:48:24 -0700 Date: Wed, 24 Aug 2016 17:48:22 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: Brian Foster , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: "Bad page state" errors when calling BULKSTAT under memory pressure? Message-ID: <20160825004631.GC20705@birch.djwong.org> X-ASG-Orig-Subj: Re: "Bad page state" errors when calling BULKSTAT under memory pressure? References: <20160824234237.GA22760@birch.djwong.org> <20160825003548.GD19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160825003548.GD19025@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472086109 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3626 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, Aug 25, 2016 at 10:35:48AM +1000, Dave Chinner wrote: > On Wed, Aug 24, 2016 at 04:42:37PM -0700, Darrick J. Wong wrote: > > Hi everyone, > > > > [cc'ing Brian because he was the last one to touch xfs_buf.c] > > > > I've been stress-testing xfs_scrub against a 900GB filesystem with 2M inodes > > using a VM with 512M of RAM. I've noticed that I get BUG messages about > > pages with negative refcount, but only if the system is under memory pressure. > > No errors are seen if the VM memory is increased to, say, 20GB. > > > > : BUG: Bad page state in process xfs_scrub pfn:00426 > > : page:ffffea0000010980 count:-1 mapcount:0 mapping: (null) index:0x0 > > : flags: 0x0() > > : page dumped because: nonzero _count > > Unless we are double-freeing a buffer, that's not an XFS problem. > Have you tried with memory posioning and allocation debug turned on? Yes. The BUG did not reproduce, though it did take nearly 35min to run scrub (which usually takes ~2min). > > : Modules linked in: xfs libcrc32c sch_fq_codel af_packet > > : CPU: 1 PID: 2058 Comm: xfs_scrub Not tainted 4.8.0-rc3-mcsum #18 > > the mm architecture was significantly modified in 4.8.0-rc1 - it > went from per-zone to per-node infrastructure, so it's entirely > possible this is a memory reclaim regression. can you reproduce it > on an older kernel (e.g. 4.7.0)? I'll try. I noticed that it's easier to make it happen when scrub is using getfsmap and/or the new in-kernel scrubbers, but that's no big surprise since that means we're pounding harder on the metadata. :) > > Obviously, a page refcount of -1 is not a good sign. I had a hunch that > > the page in question was (hopefully) a page backing an xfs_buf, so I > > applied the following debug patch: > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > index 607cc29..144b976 100644 > > --- a/fs/xfs/xfs_buf.c > > +++ b/fs/xfs/xfs_buf.c > > @@ -317,7 +317,7 @@ xfs_buf_free( > > > > for (i = 0; i < bp->b_page_count; i++) { > > struct page *page = bp->b_pages[i]; > > - > > +if (page_ref_count(page) != 1) {xfs_err(NULL, "%s: OHNO! daddr=%llu page=%p ref=%d", __func__, bp->b_bn, page, page_ref_count(page)); dump_stack();} > > __free_page(page); > > } > > } else if (bp->b_flags & _XBF_KMEM) > > > > I then saw this: > > > > : SGI XFS with ACLs, security attributes, realtime, debug enabled > > : XFS (sda): Mounting V4 Filesystem > > : XFS (sda): Ending clean mount > > : XFS: xfs_buf_free: OHNO! daddr=113849120 page=ffffea0000010980 ref=0 > > Which implies something else has dropped the page reference count on > us while we hold a reference to it. What you might like to check > what the page reference counts are on /allocation/ to see if we're > being handed a page from the freelist with a bad ref count.... Zero on allocation, except when we hit the BUG case. > If the ref counts are good at allocation, but bad on free, then I > very much doubt it's an XFS problem. We don't actually touch the > page reference count anywhere, so let's make sure that it's not a > double free or something like that in XFS first. I couldn't find any smoking gun inside XFS, which is why I went to the list -- I figured something must be doing something I don't know about. :) Anyway, I was going to push out the reflink patches for review, but the scrubber crashing held me up. Tomorrow, probably. :/ --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:04:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5ABE87CA0 for ; Thu, 25 Aug 2016 03:04:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1FAF030404E for ; Thu, 25 Aug 2016 01:04:07 -0700 (PDT) X-ASG-Debug-ID: 1472112244-0bf81509b0189c50001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ZLX0VyP4pIl8ZwHw (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:04:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpdq-0007df-RB; Thu, 25 Aug 2016 08:04:02 +0000 Date: Thu, 25 Aug 2016 01:04:02 -0700 From: Christoph Hellwig To: Felix Janda Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t Message-ID: <20160825080402.GA28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t References: <20160824011911.GA19025@dastard> <20160824204746.GA25162@nyan> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160824204746.GA25162@nyan> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112245 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 818 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Wed, Aug 24, 2016 at 10:47:46PM +0200, Felix Janda wrote: > > screws up xfstests because it changes all the error messages > > that are output to stderr and captured by the test harness. > > There are quite a few tests that this causes failures for, > > and because it's stderr, it's not as simple as just adding a new > > filter to do 'sed -e "s/^\(.*\)64\(: .*$\)/\1\2/"' on stderr. > > Thanks for testing! > > I can rework the patches to leave stderr unchanged. I guess that this > is preferable as opposed to updating the output expected by xfstests > since xfstests should be usable with both old and new xfsprogs. I would prefer to change the output if we can find a good way to filter it. I suspect the issues are things like perror lines which would look odd if we leave the 64 back in. From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:04:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AD1A27CA0 for ; Thu, 25 Aug 2016 03:04:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5FA9730405F for ; Thu, 25 Aug 2016 01:04:55 -0700 (PDT) X-ASG-Debug-ID: 1472112293-0bf81509b0189d30001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 4IIMo24WTLIMtV0i (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:04:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpee-0007ky-6s; Thu, 25 Aug 2016 08:04:52 +0000 Date: Thu, 25 Aug 2016 01:04:52 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Dave Chinner , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't perform lookups on zero-height btrees Message-ID: <20160825080452.GB28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't perform lookups on zero-height btrees References: <20160819203022.GD8268@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160819203022.GD8268@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112294 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 463 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 19, 2016 at 01:30:22PM -0700, Darrick J. Wong wrote: > If the caller passes in a cursor to a zero-height btree (which is > impossible), we never set block to anything but NULL, which causes the > later dereference of it to crash. Instead, just return -EFSCORRUPTED. > > Signed-off-by: Darrick J. Wong Looks fine, Reviewed-by: Christoph Hellwig maybe also throw in an unlikely notation, though.. From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:05:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9C6B47CA0 for ; Thu, 25 Aug 2016 03:05:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5E6ED30405F for ; Thu, 25 Aug 2016 01:05:13 -0700 (PDT) X-ASG-Debug-ID: 1472112310-0bf57c55b4187050001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id pkQGYOu9qdumBLP9 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:05:11 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpeu-00084S-Fq; Thu, 25 Aug 2016 08:05:08 +0000 Date: Thu, 25 Aug 2016 01:05:08 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: Dave Chinner , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: disallow mounting of realtime + rmap filesystems Message-ID: <20160825080508.GC28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: disallow mounting of realtime + rmap filesystems References: <20160819203207.GE8268@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160819203207.GE8268@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112311 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:06:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 037287CA0 for ; Thu, 25 Aug 2016 03:06:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C9ACA304048 for ; Thu, 25 Aug 2016 01:06:34 -0700 (PDT) X-ASG-Debug-ID: 1472112392-0bf57b53141b6960001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id aA30ek8sklqlzgfu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:06:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpgF-0000zK-AI; Thu, 25 Aug 2016 08:06:31 +0000 Date: Thu, 25 Aug 2016 01:06:31 -0700 From: Christoph Hellwig To: Zorro Lang Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/033: source mkfs output again if isize less than 512 Message-ID: <20160825080631.GD28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs/033: source mkfs output again if isize less than 512 References: <1471790859-26077-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471790859-26077-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112393 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 499 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sun, Aug 21, 2016 at 10:47:39PM +0800, Zorro Lang wrote: > I moved the mkfs_xfs output to /dev/null, because: > 1. I think it's not necessary. > 2. The case maybe do and output mkfs once or twice(not sure). So it'll be > hard to keep consistent golden image. I agree. If for some reaoson we care about the info we should just do a xfs_info later, but I can't see one. But with this change I think we can also consolidate the output files into a single 033.out file, can't we? From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:08:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1BA977CA0 for ; Thu, 25 Aug 2016 03:08:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CEE818F8033 for ; Thu, 25 Aug 2016 01:08:14 -0700 (PDT) X-ASG-Debug-ID: 1472112493-0bf8155c74192270001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id YQxQEehDyboJktOP (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:08:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcphs-0001PU-NH; Thu, 25 Aug 2016 08:08:12 +0000 Date: Thu, 25 Aug 2016 01:08:12 -0700 From: Christoph Hellwig To: Dave Chinner Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix superblock inprogress check Message-ID: <20160825080812.GE28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix superblock inprogress check References: <1471844367-9679-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471844367-9679-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112493 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 644 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Aug 22, 2016 at 03:39:27PM +1000, Dave Chinner wrote: > From: Dave Chinner > > >From inspection, the superblock sb_inprogress check is done in the > verifier and triggered only for the primary superblock via a > "bp->b_bn == XFS_SB_DADDR" check. > > Unfortunately, the primary superblock is an uncached buffer, and > hence it is configured by xfs_buf_read_uncached() with: > > bp->b_bn = XFS_BUF_DADDR_NULL; /* always null for uncached buffers */ Hmm, I wonder why we did that, it seems a bit counter intuitive. But the patch itself looks fine, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:09:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 22F7E7CA1 for ; Thu, 25 Aug 2016 03:09:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D763B8F8037 for ; Thu, 25 Aug 2016 01:09:48 -0700 (PDT) X-ASG-Debug-ID: 1472112587-0bf81509b018a430001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id OLsitMaAV1bIJQxu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:09:47 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpjN-0001hu-0i; Thu, 25 Aug 2016 08:09:45 +0000 Date: Thu, 25 Aug 2016 01:09:44 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: don't log the entire end of the AGF Message-ID: <20160825080944.GF28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: don't log the entire end of the AGF References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> <147200523494.14738.13569285576029583652.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200523494.14738.13569285576029583652.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112587 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 420 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 23, 2016 at 07:20:35PM -0700, Darrick J. Wong wrote: > When we're logging the last non-spare field in the AGF, we don't > need to log the spare fields, so plumb in a new AGF logging flag > to help us avoid that. > > (This patch is already in xfsprogs.) Looks fine, and reminds me that I need to send out my patches that fix the SGF/AGI logging API.. Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:10:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E781A7CA1 for ; Thu, 25 Aug 2016 03:10:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A9D428F8033 for ; Thu, 25 Aug 2016 01:10:28 -0700 (PDT) X-ASG-Debug-ID: 1472112626-0bf8155c75192580001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gcppqA0gbaQD4qYq (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:10:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpk1-0002mo-CC; Thu, 25 Aug 2016 08:10:25 +0000 Date: Thu, 25 Aug 2016 01:10:25 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: don't perform lookups on zero-height btrees Message-ID: <20160825081025.GG28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: don't perform lookups on zero-height btrees References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> <147200524120.14738.16686498030898663475.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200524120.14738.16686498030898663475.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112626 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 98 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, but could probably use an unlikely(): Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:10:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 41E1F7CA1 for ; Thu, 25 Aug 2016 03:10:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 069BF304048 for ; Thu, 25 Aug 2016 01:10:50 -0700 (PDT) X-ASG-Debug-ID: 1472112648-0bf8155c77192610001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rzRiBtTamUdl1b5i (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:10:48 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpkN-00034E-GC; Thu, 25 Aug 2016 08:10:47 +0000 Date: Thu, 25 Aug 2016 01:10:47 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: fix some key handling problems in _btree_simple_query_range Message-ID: <20160825081047.GH28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: fix some key handling problems in _btree_simple_query_range References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> <147200524743.14738.15760103598513525911.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200524743.14738.15760103598513525911.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112648 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:11:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 086C67CA4 for ; Thu, 25 Aug 2016 03:11:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CD5EA8F8033 for ; Thu, 25 Aug 2016 01:11:06 -0700 (PDT) X-ASG-Debug-ID: 1472112664-0bf57b53121b71a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id sS9F4BUJzfmymXcD (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:11:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpkd-00036n-JW; Thu, 25 Aug 2016 08:11:03 +0000 Date: Thu, 25 Aug 2016 01:11:03 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: simple btree query range should look right if LE lookup fails Message-ID: <20160825081103.GI28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: simple btree query range should look right if LE lookup fails References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> <147200525360.14738.17074008566594507843.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200525360.14738.17074008566594507843.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112665 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:11:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 77DE57CA4 for ; Thu, 25 Aug 2016 03:11:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44A5A8F8033 for ; Thu, 25 Aug 2016 01:11:20 -0700 (PDT) X-ASG-Debug-ID: 1472112678-0bf57c55b4187660001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Qw4NSKJexakiQaDT (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:11:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpkr-00038z-1m; Thu, 25 Aug 2016 08:11:17 +0000 Date: Thu, 25 Aug 2016 01:11:17 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfs: disallow mounting of realtime + rmap filesystems Message-ID: <20160825081116.GJ28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: disallow mounting of realtime + rmap filesystems References: <147200522764.14738.15186015137934319456.stgit@birch.djwong.org> <147200525982.14738.18075322042697360316.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200525982.14738.18075322042697360316.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112678 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 03:12:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F0937CA7 for ; Thu, 25 Aug 2016 03:12:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E5BB18F8033 for ; Thu, 25 Aug 2016 01:12:34 -0700 (PDT) X-ASG-Debug-ID: 1472112752-0bf57b53131b74c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id WIZDbVHVAKEImaMX (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 01:12:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcpm4-0003JG-9t; Thu, 25 Aug 2016 08:12:32 +0000 Date: Thu, 25 Aug 2016 01:12:32 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: prevent dropping ioend completions during buftarg wait Message-ID: <20160825081232.GK28747@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: prevent dropping ioend completions during buftarg wait References: <1472043329-30700-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472043329-30700-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472112753 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks fine, Reviewed-by: Christoph Hellwig From asavkov@redhat.com Thu Aug 25 03:21:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UPPERCASE_50_75 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AB57F7CA0 for ; Thu, 25 Aug 2016 03:21:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2778D8F8035 for ; Thu, 25 Aug 2016 01:21:13 -0700 (PDT) X-ASG-Debug-ID: 1472113272-0bf8155c751933c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ay9cqEidugEhExbL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 01:21:12 -0700 (PDT) X-Barracuda-Envelope-From: asavkov@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E64DE4E4D1; Thu, 25 Aug 2016 08:21:11 +0000 (UTC) Received: from shodan.usersys.redhat.com (dhcp-1-150.brq.redhat.com [10.34.1.150]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7P8LAX1027618; Thu, 25 Aug 2016 04:21:10 -0400 Received: by shodan.usersys.redhat.com (Postfix, from userid 1000) id E165F2C1A4A; Thu, 25 Aug 2016 10:21:09 +0200 (CEST) Date: Thu, 25 Aug 2016 10:21:09 +0200 From: Artem Savkov To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Message-ID: <20160825082109.GB11104@shodan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. References: <1471967653-2561-1-git-send-email-asavkov@redhat.com> <20160824015551.GB19025@dastard> <20160824080833.GA11104@shodan.usersys.redhat.com> <20160825002408.GC19025@dastard> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="OXfL5xGRrasGEqWY" Content-Disposition: inline In-Reply-To: <20160825002408.GC19025@dastard> User-Agent: Mutt/1.7+2 (e5fcfc5f9c2e) (2016-08-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 25 Aug 2016 08:21:12 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472113272 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3265 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --OXfL5xGRrasGEqWY Content-Type: text/plain; charset=utf-8 Content-Disposition: inline On Thu, Aug 25, 2016 at 10:24:08AM +1000, Dave Chinner wrote: > On Wed, Aug 24, 2016 at 10:08:33AM +0200, Artem Savkov wrote: > > On Wed, Aug 24, 2016 at 11:55:51AM +1000, Dave Chinner wrote: > > > On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote: > > > > Commit "xfs: only return -errno or success from attr ->put_listent" changes the > > > > > > Please quote commits in --oneline format in changelogs - it makes it > > > much easier to find the change you are refering to if there is both > > > a commit ID and the text string in the commit message. (i.e. text > > > string confirms the commit id is the one you meant to quote). > > > > Noted, thanks. > > > > > > > > commit 2a6fba6 ("xfs: only return -errno or success from attr > > > ->put_listent") is the one you are refering to here, right? > > > > Yes, that is the one. > > > > > > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient > > > > space in the buffer assuming that setting context->count to -1 would be enough, > > > > but all of the ->put_listent callers only check seen_enough. This results in > > > > a failed assertion: > > > > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 > > > > in insufficient buffer size case. > > > > > > You have a test case? Can you turn it into an xfstest? We really > > > need regression tests that cover issues like this.... > > > > > > > llistxattr02 test from LTP reliably hits this, I'll see how this can be > > ported to xfstest. > > So, after battling the obtuse, completely useless ltp install > documentation and having to resort to reverse engineering a working > configuration using strace, I finally got this running, I think, on > an XFS filesystem: > > /mnt/scratch/ltp$ sudo ./runltp -b /dev/pmem1 -B xfs -z /dev/vdc -Z xfs -q -p -s llistxattr -I 100 > .... > Summary: > passed 1 > failed 0 > skipped 0 > warnings 0 > tst_test.c:756: INFO: Timeout per run is 0h 05m 00s > llistxattr02.c:76: PASS: llistxattr() failed as expected: ERANGE > llistxattr02.c:76: PASS: llistxattr() failed as expected: ENOENT > llistxattr02.c:76: PASS: llistxattr() failed as expected: EFAULT > .... > > And it doesn't fail. strace output: > > 24833 lsetxattr("symlink", "security.ltptest", "test", 4, XATTR_CREATE) = 0 > 24833 llistxattr("symlink", 0x7ffe312356b0, 1) = -1 ERANGE (Numerical result out of range) > 24833 llistxattr("", 0x7ffe312356a0, 20) = -1 ENOENT (No such file or directory) > 24833 llistxattr(0xffffffffffffffff, 0x7ffe312356a0, 20) = -1 EFAULT (Bad address) > > I'm assuming from your description that it is the first one of these > that fails for you as it is the "buffer too small" test case. So, > not as obvious as it first seems - ltp doesn't appear to be a > reliable reproducer of the problem, so we are going to need a custom > test to exercise it.... LTP doesn't check dmesg for warnings on it's own, so it is ok for the test to be marked as "PASSED" since we get ERANGE after all. But you should be able to see the warnings in dmesg. I'm attaching the config I'm using. With this config I can repdroduce the issue with both 4.8-rc3 and next-20160825. -- Regards, Artem --OXfL5xGRrasGEqWY Content-Type: text/plain; charset=utf-8 Content-Disposition: attachment; filename=".config.xfscount" # # Automatically generated file; DO NOT EDIT. # Linux/x86 4.8.0-rc3 Kernel Configuration # CONFIG_64BIT=y CONFIG_X86_64=y CONFIG_X86=y CONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf64-x86-64" CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_MMU=y CONFIG_ARCH_MMAP_RND_BITS_MIN=28 CONFIG_ARCH_MMAP_RND_BITS_MAX=32 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=8 CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 CONFIG_NEED_DMA_MAP_STATE=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_GENERIC_ISA_DMA=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_ARCH_HAS_CPU_RELAX=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_HAVE_SETUP_PER_CPU_AREA=y CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y CONFIG_ARCH_WANT_GENERAL_HUGETLB=y CONFIG_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_DEBUG_RODATA=y CONFIG_PGTABLE_LEVELS=4 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y # # General setup # CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_CROSS_COMPILE="" # CONFIG_COMPILE_TEST is not set CONFIG_LOCALVERSION="" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_BZIP2=y CONFIG_HAVE_KERNEL_LZMA=y CONFIG_HAVE_KERNEL_XZ=y CONFIG_HAVE_KERNEL_LZO=y CONFIG_HAVE_KERNEL_LZ4=y CONFIG_KERNEL_GZIP=y # CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_LZMA is not set # CONFIG_KERNEL_XZ is not set # CONFIG_KERNEL_LZO is not set # CONFIG_KERNEL_LZ4 is not set CONFIG_DEFAULT_HOSTNAME="(none)" CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_FHANDLE=y CONFIG_USELIB=y CONFIG_AUDIT=y CONFIG_HAVE_ARCH_AUDITSYSCALL=y CONFIG_AUDITSYSCALL=y CONFIG_AUDIT_WATCH=y CONFIG_AUDIT_TREE=y # # IRQ subsystem # CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_PENDING_IRQ=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_DOMAIN_HIERARCHY=y CONFIG_GENERIC_MSI_IRQ=y CONFIG_GENERIC_MSI_IRQ_DOMAIN=y # CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_GENERIC_CLOCKEVENTS=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_GENERIC_CMOS_UPDATE=y # # Timers subsystem # CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ_COMMON=y # CONFIG_HZ_PERIODIC is not set # CONFIG_NO_HZ_IDLE is not set CONFIG_NO_HZ_FULL=y # CONFIG_NO_HZ_FULL_ALL is not set # CONFIG_NO_HZ_FULL_SYSIDLE is not set CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y # # CPU/Task time and stats accounting # CONFIG_VIRT_CPU_ACCOUNTING=y CONFIG_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y CONFIG_TASK_DELAY_ACCT=y CONFIG_TASK_XACCT=y CONFIG_TASK_IO_ACCOUNTING=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_RCU_EXPERT is not set CONFIG_SRCU=y # CONFIG_TASKS_RCU is not set CONFIG_RCU_STALL_COMMON=y CONFIG_CONTEXT_TRACKING=y # CONFIG_CONTEXT_TRACKING_FORCE is not set # CONFIG_TREE_RCU_TRACE is not set CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_NONE=y # CONFIG_RCU_NOCB_CPU_ZERO is not set # CONFIG_RCU_NOCB_CPU_ALL is not set # CONFIG_RCU_EXPEDITE_BOOT is not set CONFIG_BUILD_BIN2C=y CONFIG_IKCONFIG=m # CONFIG_IKCONFIG_PROC is not set CONFIG_LOG_BUF_SHIFT=20 CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 CONFIG_NMI_LOG_BUF_SHIFT=13 CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y CONFIG_ARCH_SUPPORTS_INT128=y CONFIG_NUMA_BALANCING=y CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y CONFIG_CGROUPS=y CONFIG_PAGE_COUNTER=y CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y CONFIG_MEMCG_SWAP_ENABLED=y CONFIG_BLK_CGROUP=y CONFIG_DEBUG_BLK_CGROUP=y CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y CONFIG_CFS_BANDWIDTH=y CONFIG_RT_GROUP_SCHED=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_HUGETLB=y CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y # CONFIG_CGROUP_DEBUG is not set # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y CONFIG_SCHED_AUTOGROUP=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="" CONFIG_RD_GZIP=y CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y CONFIG_RD_LZ4=y CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SYSCTL=y CONFIG_ANON_INODES=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HAVE_PCSPKR_PLATFORM=y CONFIG_BPF=y # CONFIG_EXPERT is not set CONFIG_UID16=y CONFIG_MULTIUSER=y CONFIG_SGETMASK_SYSCALL=y CONFIG_SYSFS_SYSCALL=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y CONFIG_PRINTK=y CONFIG_PRINTK_NMI=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_PCSPKR_PLATFORM=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y # CONFIG_BPF_SYSCALL is not set CONFIG_SHMEM=y CONFIG_AIO=y CONFIG_ADVISE_SYSCALLS=y CONFIG_USERFAULTFD=y CONFIG_PCI_QUIRKS=y CONFIG_MEMBARRIER=y # CONFIG_EMBEDDED is not set CONFIG_HAVE_PERF_EVENTS=y # # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_SLAB_FREELIST_RANDOM is not set CONFIG_SLUB_CPU_PARTIAL=y CONFIG_SYSTEM_DATA_VERIFICATION=y CONFIG_PROFILING=y CONFIG_TRACEPOINTS=y CONFIG_KEXEC_CORE=y # CONFIG_OPROFILE is not set CONFIG_HAVE_OPROFILE=y CONFIG_OPROFILE_NMI_TIMER=y CONFIG_KPROBES=y CONFIG_JUMP_LABEL=y # CONFIG_STATIC_KEYS_SELFTEST is not set CONFIG_OPTPROBES=y CONFIG_KPROBES_ON_FTRACE=y CONFIG_UPROBES=y # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_KRETPROBES=y CONFIG_HAVE_IOREMAP_PROT=y CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_KPROBES_ON_FTRACE=y CONFIG_HAVE_NMI=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_CONTIGUOUS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_ARCH_WANTS_DYNAMIC_TASK_STRUCT=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_CLK=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y CONFIG_HAVE_USER_RETURN_NOTIFIER=y CONFIG_HAVE_PERF_EVENTS_NMI=y CONFIG_HAVE_PERF_REGS=y CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y CONFIG_HAVE_CMPXCHG_LOCAL=y CONFIG_HAVE_CMPXCHG_DOUBLE=y CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP_FILTER=y CONFIG_HAVE_GCC_PLUGINS=y # CONFIG_GCC_PLUGINS is not set CONFIG_HAVE_CC_STACKPROTECTOR=y CONFIG_CC_STACKPROTECTOR=y # CONFIG_CC_STACKPROTECTOR_NONE is not set # CONFIG_CC_STACKPROTECTOR_REGULAR is not set CONFIG_CC_STACKPROTECTOR_STRONG=y CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y CONFIG_HAVE_CONTEXT_TRACKING=y CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_HAVE_ARCH_HUGE_VMAP=y CONFIG_HAVE_ARCH_SOFT_DIRTY=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y CONFIG_ARCH_HAS_ELF_RANDOMIZE=y CONFIG_HAVE_ARCH_MMAP_RND_BITS=y CONFIG_HAVE_EXIT_THREAD=y CONFIG_ARCH_MMAP_RND_BITS=28 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8 CONFIG_HAVE_COPY_THREAD_TLS=y CONFIG_HAVE_STACK_VALIDATION=y # CONFIG_HAVE_ARCH_HASH is not set # CONFIG_ISA_BUS_API is not set CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y # CONFIG_CPU_NO_EFFICIENT_FFS is not set CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y # CONFIG_MODULE_FORCE_UNLOAD is not set CONFIG_MODVERSIONS=y CONFIG_MODULE_SRCVERSION_ALL=y CONFIG_MODULE_SIG=y # CONFIG_MODULE_SIG_FORCE is not set CONFIG_MODULE_SIG_ALL=y # CONFIG_MODULE_SIG_SHA1 is not set # CONFIG_MODULE_SIG_SHA224 is not set CONFIG_MODULE_SIG_SHA256=y # CONFIG_MODULE_SIG_SHA384 is not set # CONFIG_MODULE_SIG_SHA512 is not set CONFIG_MODULE_SIG_HASH="sha256" # CONFIG_MODULE_COMPRESS is not set # CONFIG_TRIM_UNUSED_KSYMS is not set CONFIG_MODULES_TREE_LOOKUP=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y CONFIG_BLK_DEV_THROTTLING=y # CONFIG_BLK_CMDLINE_PARSER is not set # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_AIX_PARTITION is not set CONFIG_OSF_PARTITION=y CONFIG_AMIGA_PARTITION=y # CONFIG_ATARI_PARTITION is not set CONFIG_MAC_PARTITION=y CONFIG_MSDOS_PARTITION=y CONFIG_BSD_DISKLABEL=y CONFIG_MINIX_SUBPARTITION=y CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y # CONFIG_LDM_PARTITION is not set CONFIG_SGI_PARTITION=y # CONFIG_ULTRIX_PARTITION is not set CONFIG_SUN_PARTITION=y CONFIG_KARMA_PARTITION=y CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_PARTITION is not set # CONFIG_CMDLINE_PARTITION is not set CONFIG_BLOCK_COMPAT=y # # IO Schedulers # CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y CONFIG_CFQ_GROUP_IOSCHED=y CONFIG_DEFAULT_DEADLINE=y # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="deadline" CONFIG_ASN1=y CONFIG_UNINLINE_SPIN_UNLOCK=y CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y CONFIG_RWSEM_SPIN_ON_OWNER=y CONFIG_LOCK_SPIN_ON_OWNER=y CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y CONFIG_QUEUED_SPINLOCKS=y CONFIG_ARCH_USE_QUEUED_RWLOCKS=y CONFIG_QUEUED_RWLOCKS=y CONFIG_FREEZER=y # # Processor type and features # CONFIG_ZONE_DMA=y CONFIG_SMP=y CONFIG_X86_FEATURE_NAMES=y CONFIG_X86_FAST_FEATURE_TESTS=y CONFIG_X86_X2APIC=y CONFIG_X86_MPPARSE=y # CONFIG_GOLDFISH is not set CONFIG_X86_EXTENDED_PLATFORM=y # CONFIG_X86_NUMACHIP is not set # CONFIG_X86_VSMP is not set CONFIG_X86_UV=y # CONFIG_X86_GOLDFISH is not set # CONFIG_X86_INTEL_MID is not set CONFIG_X86_INTEL_LPSS=y # CONFIG_X86_AMD_PLATFORM_DEVICE is not set CONFIG_IOSF_MBI=y # CONFIG_IOSF_MBI_DEBUG is not set CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_HYPERVISOR_GUEST=y CONFIG_PARAVIRT=y # CONFIG_PARAVIRT_DEBUG is not set CONFIG_PARAVIRT_SPINLOCKS=y # CONFIG_QUEUED_LOCK_STAT is not set CONFIG_XEN=y CONFIG_XEN_DOM0=y CONFIG_XEN_PVHVM=y CONFIG_XEN_512GB=y CONFIG_XEN_SAVE_RESTORE=y # CONFIG_XEN_DEBUG_FS is not set # CONFIG_XEN_PVH is not set CONFIG_KVM_GUEST=y # CONFIG_KVM_DEBUG_FS is not set CONFIG_PARAVIRT_TIME_ACCOUNTING=y CONFIG_PARAVIRT_CLOCK=y CONFIG_NO_BOOTMEM=y # CONFIG_MK8 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set # CONFIG_MATOM is not set CONFIG_GENERIC_CPU=y CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_TSC=y CONFIG_X86_CMPXCHG64=y CONFIG_X86_CMOV=y CONFIG_X86_MINIMUM_CPU_FAMILY=64 CONFIG_X86_DEBUGCTLMSR=y CONFIG_CPU_SUP_INTEL=y CONFIG_CPU_SUP_AMD=y CONFIG_CPU_SUP_CENTAUR=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y # CONFIG_GART_IOMMU is not set # CONFIG_CALGARY_IOMMU is not set CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y CONFIG_MAXSMP=y CONFIG_NR_CPUS=8192 CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set CONFIG_PREEMPT_COUNT=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y CONFIG_X86_MCE=y CONFIG_X86_MCE_INTEL=y CONFIG_X86_MCE_AMD=y CONFIG_X86_MCE_THRESHOLD=y # CONFIG_X86_MCE_INJECT is not set CONFIG_X86_THERMAL_VECTOR=y # # Performance monitoring # CONFIG_PERF_EVENTS_INTEL_UNCORE=y CONFIG_PERF_EVENTS_INTEL_RAPL=y CONFIG_PERF_EVENTS_INTEL_CSTATE=y # CONFIG_PERF_EVENTS_AMD_POWER is not set # CONFIG_VM86 is not set CONFIG_X86_16BIT=y CONFIG_X86_ESPFIX64=y CONFIG_X86_VSYSCALL_EMULATION=y # CONFIG_I8K is not set CONFIG_MICROCODE=y CONFIG_MICROCODE_INTEL=y CONFIG_MICROCODE_AMD=y CONFIG_MICROCODE_OLD_INTERFACE=y CONFIG_X86_MSR=y CONFIG_X86_CPUID=y CONFIG_ARCH_PHYS_ADDR_T_64BIT=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_X86_DIRECT_GBPAGES=y CONFIG_NUMA=y CONFIG_AMD_NUMA=y CONFIG_X86_64_ACPI_NUMA=y CONFIG_NODES_SPAN_OTHER_NODES=y # CONFIG_NUMA_EMU is not set CONFIG_NODES_SHIFT=10 CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y # CONFIG_ARCH_MEMORY_PROBE is not set CONFIG_ARCH_PROC_KCORE_TEXT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=y CONFIG_NEED_MULTIPLE_NODES=y CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y CONFIG_HAVE_MEMBLOCK_NODE_MAP=y CONFIG_ARCH_DISCARD_MEMBLOCK=y CONFIG_MEMORY_ISOLATION=y CONFIG_MOVABLE_NODE=y CONFIG_HAVE_BOOTMEM_INFO_NODE=y CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG_SPARSE=y # CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE is not set CONFIG_MEMORY_HOTREMOVE=y CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y CONFIG_COMPACTION=y CONFIG_MIGRATION=y CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y CONFIG_PHYS_ADDR_T_64BIT=y CONFIG_BOUNCE=y CONFIG_VIRT_TO_BUS=y CONFIG_KSM=y CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y CONFIG_MEMORY_FAILURE=y # CONFIG_HWPOISON_INJECT is not set CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set CONFIG_TRANSPARENT_HUGE_PAGECACHE=y CONFIG_CLEANCACHE=y CONFIG_FRONTSWAP=y CONFIG_CMA=y # CONFIG_CMA_DEBUG is not set # CONFIG_CMA_DEBUGFS is not set CONFIG_CMA_AREAS=7 CONFIG_ZSWAP=y CONFIG_ZPOOL=y CONFIG_ZBUD=y # CONFIG_Z3FOLD is not set CONFIG_ZSMALLOC=y # CONFIG_PGTABLE_MAPPING is not set # CONFIG_ZSMALLOC_STAT is not set CONFIG_GENERIC_EARLY_IOREMAP=y CONFIG_ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT=y CONFIG_DEFERRED_STRUCT_PAGE_INIT=y # CONFIG_IDLE_PAGE_TRACKING is not set # CONFIG_ZONE_DEVICE is not set CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y CONFIG_ARCH_HAS_PKEYS=y CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y CONFIG_X86_CHECK_BIOS_CORRUPTION=y CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y CONFIG_X86_RESERVE_LOW=64 CONFIG_MTRR=y CONFIG_MTRR_SANITIZER=y CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 CONFIG_X86_PAT=y CONFIG_ARCH_USES_PG_UNCACHED=y CONFIG_ARCH_RANDOM=y CONFIG_X86_SMAP=y # CONFIG_X86_INTEL_MPX is not set CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y CONFIG_EFI=y CONFIG_EFI_STUB=y CONFIG_EFI_MIXED=y CONFIG_SECCOMP=y # CONFIG_HZ_100 is not set # CONFIG_HZ_250 is not set # CONFIG_HZ_300 is not set CONFIG_HZ_1000=y CONFIG_HZ=1000 CONFIG_SCHED_HRTICK=y CONFIG_KEXEC=y CONFIG_KEXEC_FILE=y CONFIG_KEXEC_VERIFY_SIG=y CONFIG_KEXEC_BZIMAGE_VERIFY_SIG=y CONFIG_CRASH_DUMP=y CONFIG_KEXEC_JUMP=y CONFIG_PHYSICAL_START=0x1000000 CONFIG_RELOCATABLE=y # CONFIG_RANDOMIZE_BASE is not set CONFIG_PHYSICAL_ALIGN=0x200000 CONFIG_HOTPLUG_CPU=y CONFIG_BOOTPARAM_HOTPLUG_CPU0=y # CONFIG_DEBUG_HOTPLUG_CPU0 is not set # CONFIG_COMPAT_VDSO is not set # CONFIG_LEGACY_VSYSCALL_NATIVE is not set CONFIG_LEGACY_VSYSCALL_EMULATE=y # CONFIG_LEGACY_VSYSCALL_NONE is not set # CONFIG_CMDLINE_BOOL is not set CONFIG_MODIFY_LDT_SYSCALL=y CONFIG_HAVE_LIVEPATCH=y # CONFIG_LIVEPATCH is not set CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y CONFIG_USE_PERCPU_NUMA_NODE_ID=y # # Power management and ACPI options # CONFIG_ARCH_HIBERNATION_HEADER=y CONFIG_SUSPEND=y CONFIG_SUSPEND_FREEZER=y CONFIG_HIBERNATE_CALLBACKS=y CONFIG_HIBERNATION=y CONFIG_PM_STD_PARTITION="" CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y # CONFIG_PM_AUTOSLEEP is not set # CONFIG_PM_WAKELOCKS is not set CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_PM_TEST_SUSPEND is not set CONFIG_PM_SLEEP_DEBUG=y # CONFIG_DPM_WATCHDOG is not set CONFIG_PM_TRACE=y CONFIG_PM_TRACE_RTC=y CONFIG_PM_CLK=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set CONFIG_ACPI=y CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y # CONFIG_ACPI_DEBUGGER is not set CONFIG_ACPI_SLEEP=y # CONFIG_ACPI_PROCFS_POWER is not set CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y # CONFIG_ACPI_EC_DEBUGFS is not set CONFIG_ACPI_AC=y CONFIG_ACPI_BATTERY=y CONFIG_ACPI_BUTTON=y # CONFIG_ACPI_VIDEO is not set CONFIG_ACPI_FAN=y CONFIG_ACPI_DOCK=y CONFIG_ACPI_CPU_FREQ_PSS=y CONFIG_ACPI_PROCESSOR_CSTATE=y CONFIG_ACPI_PROCESSOR_IDLE=y CONFIG_ACPI_PROCESSOR=y CONFIG_ACPI_HOTPLUG_CPU=y # CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set CONFIG_ACPI_THERMAL=y CONFIG_ACPI_NUMA=y # CONFIG_ACPI_CUSTOM_DSDT is not set CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y CONFIG_ACPI_TABLE_UPGRADE=y # CONFIG_ACPI_DEBUG is not set CONFIG_ACPI_PCI_SLOT=y CONFIG_X86_PM_TIMER=y CONFIG_ACPI_CONTAINER=y CONFIG_ACPI_HOTPLUG_MEMORY=y CONFIG_ACPI_HOTPLUG_IOAPIC=y # CONFIG_ACPI_SBS is not set CONFIG_ACPI_HED=y # CONFIG_ACPI_CUSTOM_METHOD is not set CONFIG_ACPI_BGRT=y # CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set # CONFIG_ACPI_NFIT is not set CONFIG_HAVE_ACPI_APEI=y CONFIG_HAVE_ACPI_APEI_NMI=y CONFIG_ACPI_APEI=y CONFIG_ACPI_APEI_GHES=y CONFIG_ACPI_APEI_PCIEAER=y CONFIG_ACPI_APEI_MEMORY_FAILURE=y # CONFIG_ACPI_APEI_EINJ is not set # CONFIG_ACPI_APEI_ERST_DEBUG is not set # CONFIG_DPTF_POWER is not set # CONFIG_ACPI_EXTLOG is not set # CONFIG_PMIC_OPREGION is not set # CONFIG_ACPI_CONFIGFS is not set CONFIG_SFI=y # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_GOV_ATTR_SET=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_STAT_DETAILS=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y # CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set # # CPU frequency scaling drivers # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set CONFIG_X86_ACPI_CPUFREQ=m CONFIG_X86_ACPI_CPUFREQ_CPB=y # CONFIG_X86_POWERNOW_K8 is not set # CONFIG_X86_AMD_FREQ_SENSITIVITY is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_P4_CLOCKMOD is not set # # shared options # # CONFIG_X86_SPEEDSTEP_LIB is not set # # CPU Idle # CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y # CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set CONFIG_INTEL_IDLE=y # # Memory power savings # # CONFIG_I7300_IDLE is not set # # Bus options (PCI etc.) # CONFIG_PCI=y CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y CONFIG_PCI_XEN=y CONFIG_PCI_DOMAINS=y CONFIG_PCIEPORTBUS=y CONFIG_HOTPLUG_PCI_PCIE=y CONFIG_PCIEAER=y CONFIG_PCIE_ECRC=y # CONFIG_PCIEAER_INJECT is not set CONFIG_PCIEASPM=y # CONFIG_PCIEASPM_DEBUG is not set CONFIG_PCIEASPM_DEFAULT=y # CONFIG_PCIEASPM_POWERSAVE is not set # CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y # CONFIG_PCIE_DPC is not set CONFIG_PCI_BUS_ADDR_T_64BIT=y CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y # CONFIG_PCI_DEBUG is not set # CONFIG_PCI_REALLOC_ENABLE_AUTO is not set CONFIG_PCI_STUB=y # CONFIG_XEN_PCIDEV_FRONTEND is not set CONFIG_HT_IRQ=y CONFIG_PCI_ATS=y CONFIG_PCI_IOV=y CONFIG_PCI_PRI=y CONFIG_PCI_PASID=y CONFIG_PCI_LABEL=y CONFIG_HOTPLUG_PCI=y CONFIG_HOTPLUG_PCI_ACPI=y # CONFIG_HOTPLUG_PCI_ACPI_IBM is not set # CONFIG_HOTPLUG_PCI_CPCI is not set # CONFIG_HOTPLUG_PCI_SHPC is not set # # PCI host controller drivers # # CONFIG_PCIE_DW_PLAT is not set CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y CONFIG_PCCARD=y # CONFIG_PCMCIA is not set CONFIG_CARDBUS=y # # PC-card bridges # # CONFIG_YENTA is not set # CONFIG_RAPIDIO is not set # CONFIG_X86_SYSFB is not set # # Executable file formats / Emulations # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y CONFIG_ELFCORE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y CONFIG_BINFMT_SCRIPT=y # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=m CONFIG_COREDUMP=y CONFIG_IA32_EMULATION=y # CONFIG_IA32_AOUT is not set # CONFIG_X86_X32 is not set CONFIG_COMPAT=y CONFIG_COMPAT_FOR_U64_ALIGNMENT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_KEYS_COMPAT=y CONFIG_X86_DEV_DMA_OPS=y CONFIG_PMC_ATOM=y # CONFIG_VMD is not set CONFIG_NET=y CONFIG_NET_INGRESS=y # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y # CONFIG_UNIX_DIAG is not set CONFIG_XFRM=y CONFIG_XFRM_ALGO=y CONFIG_XFRM_USER=y CONFIG_XFRM_SUB_POLICY=y CONFIG_XFRM_MIGRATE=y CONFIG_XFRM_STATISTICS=y # CONFIG_NET_KEY is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_FIB_TRIE_STATS=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE_DEMUX is not set # CONFIG_NET_IP_TUNNEL is not set CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y CONFIG_SYN_COOKIES=y # CONFIG_NET_UDP_TUNNEL is not set # CONFIG_NET_FOU is not set # CONFIG_INET_AH is not set # CONFIG_INET_ESP is not set # CONFIG_INET_IPCOMP is not set # CONFIG_INET_XFRM_TUNNEL is not set # CONFIG_INET_TUNNEL is not set # CONFIG_INET_XFRM_MODE_TRANSPORT is not set # CONFIG_INET_XFRM_MODE_TUNNEL is not set # CONFIG_INET_XFRM_MODE_BEET is not set CONFIG_INET_DIAG=m CONFIG_INET_TCP_DIAG=m CONFIG_INET_UDP_DIAG=m # CONFIG_INET_DIAG_DESTROY is not set CONFIG_TCP_CONG_ADVANCED=y # CONFIG_TCP_CONG_BIC is not set CONFIG_TCP_CONG_CUBIC=y # CONFIG_TCP_CONG_WESTWOOD is not set # CONFIG_TCP_CONG_HTCP is not set # CONFIG_TCP_CONG_HSTCP is not set # CONFIG_TCP_CONG_HYBLA is not set # CONFIG_TCP_CONG_VEGAS is not set # CONFIG_TCP_CONG_NV is not set # CONFIG_TCP_CONG_SCALABLE is not set # CONFIG_TCP_CONG_LP is not set # CONFIG_TCP_CONG_VENO is not set # CONFIG_TCP_CONG_YEAH is not set # CONFIG_TCP_CONG_ILLINOIS is not set # CONFIG_TCP_CONG_DCTCP is not set # CONFIG_TCP_CONG_CDG is not set CONFIG_DEFAULT_CUBIC=y # CONFIG_DEFAULT_RENO is not set CONFIG_DEFAULT_TCP_CONG="cubic" CONFIG_TCP_MD5SIG=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y CONFIG_IPV6_OPTIMISTIC_DAD=y # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_IPV6_ILA is not set # CONFIG_INET6_XFRM_TUNNEL is not set # CONFIG_INET6_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_TRANSPORT is not set # CONFIG_INET6_XFRM_MODE_TUNNEL is not set # CONFIG_INET6_XFRM_MODE_BEET is not set # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set # CONFIG_IPV6_SIT is not set # CONFIG_IPV6_TUNNEL is not set # CONFIG_IPV6_FOU is not set # CONFIG_IPV6_FOU_TUNNEL is not set CONFIG_IPV6_MULTIPLE_TABLES=y # CONFIG_IPV6_SUBTREES is not set CONFIG_IPV6_MROUTE=y CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y CONFIG_NETLABEL=y CONFIG_NETWORK_SECMARK=y CONFIG_NET_PTP_CLASSIFY=y CONFIG_NETWORK_PHY_TIMESTAMPING=y CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y # CONFIG_BRIDGE_NETFILTER is not set # # Core Netfilter Configuration # CONFIG_NETFILTER_INGRESS=y CONFIG_NETFILTER_NETLINK=m # CONFIG_NETFILTER_NETLINK_ACCT is not set # CONFIG_NETFILTER_NETLINK_QUEUE is not set # CONFIG_NETFILTER_NETLINK_LOG is not set CONFIG_NF_CONNTRACK=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_TIMEOUT=y CONFIG_NF_CONNTRACK_TIMESTAMP=y # CONFIG_NF_CT_PROTO_DCCP is not set # CONFIG_NF_CT_PROTO_SCTP is not set # CONFIG_NF_CT_PROTO_UDPLITE is not set # CONFIG_NF_CONNTRACK_AMANDA is not set # CONFIG_NF_CONNTRACK_FTP is not set # CONFIG_NF_CONNTRACK_H323 is not set # CONFIG_NF_CONNTRACK_IRC is not set # CONFIG_NF_CONNTRACK_NETBIOS_NS is not set # CONFIG_NF_CONNTRACK_SNMP is not set # CONFIG_NF_CONNTRACK_PPTP is not set # CONFIG_NF_CONNTRACK_SANE is not set # CONFIG_NF_CONNTRACK_SIP is not set # CONFIG_NF_CONNTRACK_TFTP is not set # CONFIG_NF_CT_NETLINK is not set # CONFIG_NF_CT_NETLINK_TIMEOUT is not set CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y # CONFIG_NF_NAT_AMANDA is not set # CONFIG_NF_NAT_FTP is not set # CONFIG_NF_NAT_IRC is not set # CONFIG_NF_NAT_SIP is not set # CONFIG_NF_NAT_TFTP is not set # CONFIG_NF_NAT_REDIRECT is not set # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=y # # Xtables combined modules # # CONFIG_NETFILTER_XT_MARK is not set # CONFIG_NETFILTER_XT_CONNMARK is not set # CONFIG_NETFILTER_XT_SET is not set # # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_AUDIT is not set # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set # CONFIG_NETFILTER_XT_TARGET_CONNSECMARK is not set # CONFIG_NETFILTER_XT_TARGET_CT is not set # CONFIG_NETFILTER_XT_TARGET_DSCP is not set # CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set # CONFIG_NETFILTER_XT_TARGET_LOG is not set # CONFIG_NETFILTER_XT_TARGET_MARK is not set CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_NETMAP is not set # CONFIG_NETFILTER_XT_TARGET_NFLOG is not set # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set # CONFIG_NETFILTER_XT_TARGET_RATEEST is not set # CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set # CONFIG_NETFILTER_XT_TARGET_TEE is not set # CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TRACE is not set # CONFIG_NETFILTER_XT_TARGET_SECMARK is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set # CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches # # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_NETFILTER_XT_MATCH_CGROUP is not set # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set # CONFIG_NETFILTER_XT_MATCH_CONNBYTES is not set # CONFIG_NETFILTER_XT_MATCH_CONNLABEL is not set # CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_CONNMARK is not set CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m # CONFIG_NETFILTER_XT_MATCH_CPU is not set # CONFIG_NETFILTER_XT_MATCH_DCCP is not set # CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set # CONFIG_NETFILTER_XT_MATCH_DSCP is not set # CONFIG_NETFILTER_XT_MATCH_ECN is not set # CONFIG_NETFILTER_XT_MATCH_ESP is not set # CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set # CONFIG_NETFILTER_XT_MATCH_HELPER is not set # CONFIG_NETFILTER_XT_MATCH_HL is not set # CONFIG_NETFILTER_XT_MATCH_IPCOMP is not set # CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set # CONFIG_NETFILTER_XT_MATCH_L2TP is not set # CONFIG_NETFILTER_XT_MATCH_LENGTH is not set # CONFIG_NETFILTER_XT_MATCH_LIMIT is not set # CONFIG_NETFILTER_XT_MATCH_MAC is not set # CONFIG_NETFILTER_XT_MATCH_MARK is not set # CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set # CONFIG_NETFILTER_XT_MATCH_NFACCT is not set # CONFIG_NETFILTER_XT_MATCH_OSF is not set # CONFIG_NETFILTER_XT_MATCH_OWNER is not set # CONFIG_NETFILTER_XT_MATCH_POLICY is not set # CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set # CONFIG_NETFILTER_XT_MATCH_RATEEST is not set # CONFIG_NETFILTER_XT_MATCH_REALM is not set # CONFIG_NETFILTER_XT_MATCH_RECENT is not set # CONFIG_NETFILTER_XT_MATCH_SCTP is not set # CONFIG_NETFILTER_XT_MATCH_SOCKET is not set # CONFIG_NETFILTER_XT_MATCH_STATE is not set # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set # CONFIG_NETFILTER_XT_MATCH_STRING is not set # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set # CONFIG_NETFILTER_XT_MATCH_TIME is not set # CONFIG_NETFILTER_XT_MATCH_U32 is not set CONFIG_IP_SET=m CONFIG_IP_SET_MAX=256 # CONFIG_IP_SET_BITMAP_IP is not set # CONFIG_IP_SET_BITMAP_IPMAC is not set # CONFIG_IP_SET_BITMAP_PORT is not set # CONFIG_IP_SET_HASH_IP is not set # CONFIG_IP_SET_HASH_IPMARK is not set # CONFIG_IP_SET_HASH_IPPORT is not set # CONFIG_IP_SET_HASH_IPPORTIP is not set # CONFIG_IP_SET_HASH_IPPORTNET is not set # CONFIG_IP_SET_HASH_MAC is not set # CONFIG_IP_SET_HASH_NETPORTNET is not set # CONFIG_IP_SET_HASH_NET is not set # CONFIG_IP_SET_HASH_NETNET is not set # CONFIG_IP_SET_HASH_NETPORT is not set # CONFIG_IP_SET_HASH_NETIFACE is not set # CONFIG_IP_SET_LIST_SET is not set # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m # CONFIG_NF_DUP_IPV4 is not set # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m CONFIG_NF_NAT_IPV4=m # CONFIG_NF_NAT_MASQUERADE_IPV4 is not set # CONFIG_NF_NAT_PPTP is not set # CONFIG_NF_NAT_H323 is not set CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set # CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set CONFIG_IP_NF_NAT=m # CONFIG_IP_NF_TARGET_MASQUERADE is not set # CONFIG_IP_NF_TARGET_NETMAP is not set # CONFIG_IP_NF_TARGET_REDIRECT is not set CONFIG_IP_NF_MANGLE=m # CONFIG_IP_NF_TARGET_CLUSTERIP is not set # CONFIG_IP_NF_TARGET_ECN is not set # CONFIG_IP_NF_TARGET_TTL is not set CONFIG_IP_NF_RAW=m CONFIG_IP_NF_SECURITY=m # CONFIG_IP_NF_ARPTABLES is not set # # IPv6: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set CONFIG_NF_NAT_IPV6=m # CONFIG_NF_NAT_MASQUERADE_IPV6 is not set CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set # CONFIG_IP6_NF_MATCH_FRAG is not set # CONFIG_IP6_NF_MATCH_OPTS is not set # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set CONFIG_IP6_NF_MATCH_RPFILTER=m # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_TARGET_HL is not set CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_RAW=m CONFIG_IP6_NF_SECURITY=m CONFIG_IP6_NF_NAT=m # CONFIG_IP6_NF_TARGET_MASQUERADE is not set # CONFIG_IP6_NF_TARGET_NPT is not set CONFIG_BRIDGE_NF_EBTABLES=m CONFIG_BRIDGE_EBT_BROUTE=m CONFIG_BRIDGE_EBT_T_FILTER=m CONFIG_BRIDGE_EBT_T_NAT=m # CONFIG_BRIDGE_EBT_802_3 is not set # CONFIG_BRIDGE_EBT_AMONG is not set # CONFIG_BRIDGE_EBT_ARP is not set # CONFIG_BRIDGE_EBT_IP is not set # CONFIG_BRIDGE_EBT_IP6 is not set # CONFIG_BRIDGE_EBT_LIMIT is not set # CONFIG_BRIDGE_EBT_MARK is not set # CONFIG_BRIDGE_EBT_PKTTYPE is not set # CONFIG_BRIDGE_EBT_STP is not set # CONFIG_BRIDGE_EBT_VLAN is not set # CONFIG_BRIDGE_EBT_ARPREPLY is not set # CONFIG_BRIDGE_EBT_DNAT is not set # CONFIG_BRIDGE_EBT_MARK_T is not set # CONFIG_BRIDGE_EBT_REDIRECT is not set # CONFIG_BRIDGE_EBT_SNAT is not set # CONFIG_BRIDGE_EBT_LOG is not set # CONFIG_BRIDGE_EBT_NFLOG is not set # CONFIG_IP_DCCP is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_L2TP is not set CONFIG_STP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_HAVE_NET_DSA=y # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set CONFIG_LLC=m # CONFIG_LLC2 is not set # CONFIG_IPX is not set # CONFIG_ATALK is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_PHONET is not set # CONFIG_6LOWPAN is not set # CONFIG_IEEE802154 is not set CONFIG_NET_SCHED=y # # Queueing/Scheduling # # CONFIG_NET_SCH_CBQ is not set # CONFIG_NET_SCH_HTB is not set # CONFIG_NET_SCH_HFSC is not set # CONFIG_NET_SCH_PRIO is not set # CONFIG_NET_SCH_MULTIQ is not set # CONFIG_NET_SCH_RED is not set # CONFIG_NET_SCH_SFB is not set # CONFIG_NET_SCH_SFQ is not set # CONFIG_NET_SCH_TEQL is not set # CONFIG_NET_SCH_TBF is not set # CONFIG_NET_SCH_GRED is not set # CONFIG_NET_SCH_DSMARK is not set # CONFIG_NET_SCH_NETEM is not set # CONFIG_NET_SCH_DRR is not set # CONFIG_NET_SCH_MQPRIO is not set # CONFIG_NET_SCH_CHOKE is not set # CONFIG_NET_SCH_QFQ is not set # CONFIG_NET_SCH_CODEL is not set # CONFIG_NET_SCH_FQ_CODEL is not set # CONFIG_NET_SCH_FQ is not set # CONFIG_NET_SCH_HHF is not set # CONFIG_NET_SCH_PIE is not set # CONFIG_NET_SCH_INGRESS is not set # CONFIG_NET_SCH_PLUG is not set # # Classification # CONFIG_NET_CLS=y # CONFIG_NET_CLS_BASIC is not set # CONFIG_NET_CLS_TCINDEX is not set # CONFIG_NET_CLS_ROUTE4 is not set # CONFIG_NET_CLS_FW is not set # CONFIG_NET_CLS_U32 is not set # CONFIG_NET_CLS_RSVP is not set # CONFIG_NET_CLS_RSVP6 is not set # CONFIG_NET_CLS_FLOW is not set CONFIG_NET_CLS_CGROUP=y # CONFIG_NET_CLS_BPF is not set # CONFIG_NET_CLS_FLOWER is not set # CONFIG_NET_CLS_MATCHALL is not set CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 # CONFIG_NET_EMATCH_CMP is not set # CONFIG_NET_EMATCH_NBYTE is not set # CONFIG_NET_EMATCH_U32 is not set # CONFIG_NET_EMATCH_META is not set # CONFIG_NET_EMATCH_TEXT is not set # CONFIG_NET_EMATCH_IPSET is not set CONFIG_NET_CLS_ACT=y # CONFIG_NET_ACT_POLICE is not set # CONFIG_NET_ACT_GACT is not set # CONFIG_NET_ACT_MIRRED is not set # CONFIG_NET_ACT_IPT is not set # CONFIG_NET_ACT_NAT is not set # CONFIG_NET_ACT_PEDIT is not set # CONFIG_NET_ACT_SIMP is not set # CONFIG_NET_ACT_SKBEDIT is not set # CONFIG_NET_ACT_CSUM is not set # CONFIG_NET_ACT_VLAN is not set # CONFIG_NET_ACT_BPF is not set # CONFIG_NET_ACT_CONNMARK is not set # CONFIG_NET_ACT_IFE is not set CONFIG_NET_SCH_FIFO=y CONFIG_DCB=y # CONFIG_DNS_RESOLVER is not set # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_DIAG is not set CONFIG_MPLS=y # CONFIG_NET_MPLS_GSO is not set # CONFIG_MPLS_ROUTING is not set # CONFIG_HSR is not set # CONFIG_NET_SWITCHDEV is not set # CONFIG_NET_L3_MASTER_DEV is not set # CONFIG_NET_NCSI is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y CONFIG_SOCK_CGROUP_DATA=y # CONFIG_CGROUP_NET_PRIO is not set CONFIG_CGROUP_NET_CLASSID=y CONFIG_NET_RX_BUSY_POLL=y CONFIG_BQL=y CONFIG_BPF_JIT=y CONFIG_NET_FLOW_LIMIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_NET_TCPPROBE is not set CONFIG_NET_DROP_MONITOR=y # CONFIG_HAMRADIO is not set # CONFIG_CAN is not set # CONFIG_IRDA is not set # CONFIG_BT is not set # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set # CONFIG_STREAM_PARSER is not set CONFIG_FIB_RULES=y CONFIG_WIRELESS=y # CONFIG_CFG80211 is not set # CONFIG_LIB80211 is not set # # CFG80211 needs to be enabled for MAC80211 # CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set # CONFIG_CAIF is not set # CONFIG_CEPH_LIB is not set # CONFIG_NFC is not set CONFIG_LWTUNNEL=y # CONFIG_DST_CACHE is not set # CONFIG_NET_DEVLINK is not set CONFIG_MAY_USE_DEVLINK=y CONFIG_HAVE_EBPF_JIT=y # # Device Drivers # # # Generic Driver Options # CONFIG_UEVENT_HELPER=y CONFIG_UEVENT_HELPER_PATH="" CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=y # CONFIG_FIRMWARE_IN_KERNEL is not set CONFIG_EXTRA_FIRMWARE="" # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set CONFIG_ALLOW_DEV_COREDUMP=y # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set CONFIG_SYS_HYPERVISOR=y # CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_GENERIC_CPU_AUTOPROBE=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=m CONFIG_DMA_SHARED_BUFFER=y # CONFIG_FENCE_TRACE is not set # CONFIG_DMA_CMA is not set # # Bus devices # CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y # CONFIG_MTD is not set # CONFIG_OF is not set CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y CONFIG_PARPORT=m CONFIG_PARPORT_PC=m # CONFIG_PARPORT_SERIAL is not set # CONFIG_PARPORT_PC_FIFO is not set # CONFIG_PARPORT_PC_SUPERIO is not set # CONFIG_PARPORT_GSC is not set # CONFIG_PARPORT_AX88796 is not set CONFIG_PARPORT_1284=y CONFIG_PNP=y # CONFIG_PNP_DEBUG_MESSAGES is not set # # Protocols # CONFIG_PNPACPI=y CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_NULL_BLK is not set CONFIG_BLK_DEV_FD=m # CONFIG_PARIDE is not set # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set # CONFIG_ZRAM is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=m CONFIG_BLK_DEV_LOOP_MIN_COUNT=0 # CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_SKD is not set # CONFIG_BLK_DEV_SX8 is not set # CONFIG_BLK_DEV_RAM is not set CONFIG_CDROM_PKTCDVD=m CONFIG_CDROM_PKTCDVD_BUFFERS=8 # CONFIG_CDROM_PKTCDVD_WCACHE is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_XEN_BLKDEV_FRONTEND is not set CONFIG_VIRTIO_BLK=m # CONFIG_BLK_DEV_HD is not set # CONFIG_BLK_DEV_RBD is not set # CONFIG_BLK_DEV_RSXX is not set # CONFIG_BLK_DEV_NVME is not set # CONFIG_NVME_TARGET is not set # # Misc devices # # CONFIG_SENSORS_LIS3LV02D is not set # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_IBM_ASM is not set # CONFIG_PHANTOM is not set # CONFIG_SGI_IOC4 is not set # CONFIG_TIFM_CORE is not set # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_SGI_XP is not set # CONFIG_HP_ILO is not set # CONFIG_SGI_GRU is not set # CONFIG_APDS9802ALS is not set # CONFIG_ISL29003 is not set # CONFIG_ISL29020 is not set # CONFIG_SENSORS_TSL2550 is not set # CONFIG_SENSORS_BH1770 is not set # CONFIG_SENSORS_APDS990X is not set # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_BMP085_I2C is not set # CONFIG_USB_SWITCH_FSA9480 is not set # CONFIG_SRAM is not set # CONFIG_PANEL is not set # CONFIG_C2PORT is not set # # EEPROM support # # CONFIG_EEPROM_AT24 is not set # CONFIG_EEPROM_LEGACY is not set # CONFIG_EEPROM_MAX6875 is not set # CONFIG_EEPROM_93CX6 is not set # CONFIG_CB710_CORE is not set # # Texas Instruments shared transport line discipline # # CONFIG_TI_ST is not set # CONFIG_SENSORS_LIS3_I2C is not set # # Altera FPGA firmware download module # # CONFIG_ALTERA_STAPL is not set # CONFIG_INTEL_MEI is not set # CONFIG_INTEL_MEI_ME is not set # CONFIG_INTEL_MEI_TXE is not set # CONFIG_VMWARE_VMCI is not set # # Intel MIC Bus Driver # # CONFIG_INTEL_MIC_BUS is not set # # SCIF Bus Driver # # CONFIG_SCIF_BUS is not set # # VOP Bus Driver # # CONFIG_VOP_BUS is not set # # Intel MIC Host Driver # # # Intel MIC Card Driver # # # SCIF Driver # # # Intel MIC Coprocessor State Management (COSM) Drivers # # # VOP Driver # # CONFIG_GENWQE is not set # CONFIG_ECHO is not set # CONFIG_CXL_BASE is not set # CONFIG_CXL_AFU_DRIVER_OPS is not set CONFIG_HAVE_IDE=y # CONFIG_IDE is not set # # SCSI device support # CONFIG_SCSI_MOD=y # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=y CONFIG_SCSI_DMA=y # CONFIG_SCSI_NETLINK is not set # CONFIG_SCSI_MQ_DEFAULT is not set CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # # CONFIG_BLK_DEV_SD is not set # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=m CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=m # CONFIG_CHR_DEV_SCH is not set CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y CONFIG_SCSI_SCAN_ASYNC=y # # SCSI Transports # # CONFIG_SCSI_SPI_ATTRS is not set # CONFIG_SCSI_FC_ATTRS is not set # CONFIG_SCSI_ISCSI_ATTRS is not set # CONFIG_SCSI_SAS_ATTRS is not set # CONFIG_SCSI_SAS_LIBSAS is not set # CONFIG_SCSI_SRP_ATTRS is not set CONFIG_SCSI_LOWLEVEL=y # CONFIG_ISCSI_TCP is not set # CONFIG_ISCSI_BOOT_SYSFS is not set # CONFIG_SCSI_CXGB3_ISCSI is not set # CONFIG_SCSI_CXGB4_ISCSI is not set # CONFIG_SCSI_BNX2_ISCSI is not set # CONFIG_BE2ISCSI is not set # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_HPSA is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_3W_SAS is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC94XX is not set # CONFIG_SCSI_MVSAS is not set # CONFIG_SCSI_MVUMI is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_ARCMSR is not set # CONFIG_SCSI_ESAS2R is not set # CONFIG_MEGARAID_NEWGEN is not set # CONFIG_MEGARAID_LEGACY is not set # CONFIG_MEGARAID_SAS is not set # CONFIG_SCSI_MPT3SAS is not set # CONFIG_SCSI_MPT2SAS is not set # CONFIG_SCSI_SMARTPQI is not set # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_HPTIOP is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_VMWARE_PVSCSI is not set # CONFIG_XEN_SCSI_FRONTEND is not set # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_ISCI is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_PPA is not set # CONFIG_SCSI_IMM is not set # CONFIG_SCSI_STEX is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_QLA_ISCSI is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_WD719X is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_PMCRAID is not set # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_VIRTIO is not set CONFIG_SCSI_DH=y CONFIG_SCSI_DH_RDAC=y CONFIG_SCSI_DH_HP_SW=y CONFIG_SCSI_DH_EMC=y CONFIG_SCSI_DH_ALUA=y # CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_ATA=m # CONFIG_ATA_NONSTANDARD is not set CONFIG_ATA_VERBOSE_ERROR=y CONFIG_ATA_ACPI=y # CONFIG_SATA_ZPODD is not set CONFIG_SATA_PMP=y # # Controllers with non-SFF native interface # # CONFIG_SATA_AHCI is not set # CONFIG_SATA_AHCI_PLATFORM is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set # CONFIG_SATA_SIL24 is not set CONFIG_ATA_SFF=y # # SFF controllers with custom DMA interface # # CONFIG_PDC_ADMA is not set # CONFIG_SATA_QSTOR is not set # CONFIG_SATA_SX4 is not set CONFIG_ATA_BMDMA=y # # SATA SFF controllers with BMDMA # CONFIG_ATA_PIIX=m # CONFIG_SATA_DWC is not set # CONFIG_SATA_MV is not set # CONFIG_SATA_NV is not set # CONFIG_SATA_PROMISE is not set # CONFIG_SATA_SIL is not set # CONFIG_SATA_SIS is not set # CONFIG_SATA_SVW is not set # CONFIG_SATA_ULI is not set # CONFIG_SATA_VIA is not set # CONFIG_SATA_VITESSE is not set # # PATA SFF controllers with BMDMA # # CONFIG_PATA_ALI is not set # CONFIG_PATA_AMD is not set # CONFIG_PATA_ARTOP is not set # CONFIG_PATA_ATIIXP is not set # CONFIG_PATA_ATP867X is not set # CONFIG_PATA_CMD64X is not set # CONFIG_PATA_CYPRESS is not set # CONFIG_PATA_EFAR is not set # CONFIG_PATA_HPT366 is not set # CONFIG_PATA_HPT37X is not set # CONFIG_PATA_HPT3X2N is not set # CONFIG_PATA_HPT3X3 is not set # CONFIG_PATA_IT8213 is not set # CONFIG_PATA_IT821X is not set # CONFIG_PATA_JMICRON is not set # CONFIG_PATA_MARVELL is not set # CONFIG_PATA_NETCELL is not set # CONFIG_PATA_NINJA32 is not set # CONFIG_PATA_NS87415 is not set # CONFIG_PATA_OLDPIIX is not set # CONFIG_PATA_OPTIDMA is not set # CONFIG_PATA_PDC2027X is not set # CONFIG_PATA_PDC_OLD is not set # CONFIG_PATA_RADISYS is not set # CONFIG_PATA_RDC is not set # CONFIG_PATA_SCH is not set # CONFIG_PATA_SERVERWORKS is not set # CONFIG_PATA_SIL680 is not set # CONFIG_PATA_SIS is not set # CONFIG_PATA_TOSHIBA is not set # CONFIG_PATA_TRIFLEX is not set # CONFIG_PATA_VIA is not set # CONFIG_PATA_WINBOND is not set # # PIO-only SFF controllers # # CONFIG_PATA_CMD640_PCI is not set # CONFIG_PATA_MPIIX is not set # CONFIG_PATA_NS87410 is not set # CONFIG_PATA_OPTI is not set # CONFIG_PATA_RZ1000 is not set # # Generic fallback / legacy drivers # CONFIG_PATA_ACPI=m CONFIG_ATA_GENERIC=m # CONFIG_PATA_LEGACY is not set CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_AUTODETECT=y # CONFIG_MD_LINEAR is not set # CONFIG_MD_RAID0 is not set # CONFIG_MD_RAID1 is not set # CONFIG_MD_RAID10 is not set # CONFIG_MD_RAID456 is not set # CONFIG_MD_MULTIPATH is not set # CONFIG_MD_FAULTY is not set # CONFIG_BCACHE is not set CONFIG_BLK_DEV_DM_BUILTIN=y CONFIG_BLK_DEV_DM=m # CONFIG_DM_MQ_DEFAULT is not set CONFIG_DM_DEBUG=y # CONFIG_DM_CRYPT is not set # CONFIG_DM_SNAPSHOT is not set # CONFIG_DM_THIN_PROVISIONING is not set # CONFIG_DM_CACHE is not set # CONFIG_DM_ERA is not set CONFIG_DM_MIRROR=m # CONFIG_DM_LOG_USERSPACE is not set # CONFIG_DM_RAID is not set # CONFIG_DM_ZERO is not set # CONFIG_DM_MULTIPATH is not set # CONFIG_DM_DELAY is not set CONFIG_DM_UEVENT=y # CONFIG_DM_FLAKEY is not set # CONFIG_DM_VERITY is not set # CONFIG_DM_SWITCH is not set # CONFIG_DM_LOG_WRITES is not set # CONFIG_TARGET_CORE is not set CONFIG_FUSION=y # CONFIG_FUSION_SPI is not set # CONFIG_FUSION_SAS is not set CONFIG_FUSION_MAX_SGE=128 CONFIG_FUSION_LOGGING=y # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set CONFIG_MACINTOSH_DRIVERS=y CONFIG_MAC_EMUMOUSEBTN=y CONFIG_NETDEVICES=y CONFIG_NET_CORE=y # CONFIG_BONDING is not set # CONFIG_DUMMY is not set # CONFIG_EQUALIZER is not set CONFIG_NET_FC=y # CONFIG_IFB is not set # CONFIG_NET_TEAM is not set # CONFIG_MACVLAN is not set # CONFIG_IPVLAN is not set # CONFIG_VXLAN is not set # CONFIG_MACSEC is not set # CONFIG_NETCONSOLE is not set # CONFIG_NETPOLL is not set # CONFIG_NET_POLL_CONTROLLER is not set CONFIG_TUN=m # CONFIG_TUN_VNET_CROSS_LE is not set # CONFIG_VETH is not set CONFIG_VIRTIO_NET=m # CONFIG_NLMON is not set # CONFIG_ARCNET is not set # # CAIF transport drivers # # # Distributed Switch Architecture drivers # CONFIG_ETHERNET=y # CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_ADAPTEC is not set CONFIG_NET_VENDOR_AGERE=y # CONFIG_ET131X is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_ALTERA_TSE is not set CONFIG_NET_VENDOR_AMAZON=y # CONFIG_ENA_ETHERNET is not set # CONFIG_NET_VENDOR_AMD is not set CONFIG_NET_VENDOR_ARC=y CONFIG_NET_VENDOR_ATHEROS=y # CONFIG_ATL2 is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set # CONFIG_ATL1C is not set # CONFIG_ALX is not set # CONFIG_NET_VENDOR_AURORA is not set CONFIG_NET_CADENCE=y # CONFIG_MACB is not set CONFIG_NET_VENDOR_BROADCOM=y # CONFIG_B44 is not set # CONFIG_BCMGENET is not set # CONFIG_BNX2 is not set # CONFIG_CNIC is not set # CONFIG_TIGON3 is not set # CONFIG_BNX2X is not set # CONFIG_BNXT is not set CONFIG_NET_VENDOR_BROCADE=y # CONFIG_BNA is not set CONFIG_NET_VENDOR_CAVIUM=y # CONFIG_THUNDER_NIC_PF is not set # CONFIG_THUNDER_NIC_VF is not set # CONFIG_THUNDER_NIC_BGX is not set # CONFIG_THUNDER_NIC_RGX is not set # CONFIG_LIQUIDIO is not set CONFIG_NET_VENDOR_CHELSIO=y # CONFIG_CHELSIO_T1 is not set # CONFIG_CHELSIO_T3 is not set # CONFIG_CHELSIO_T4 is not set # CONFIG_CHELSIO_T4VF is not set CONFIG_NET_VENDOR_CISCO=y # CONFIG_ENIC is not set # CONFIG_CX_ECAT is not set # CONFIG_DNET is not set CONFIG_NET_VENDOR_DEC=y CONFIG_NET_TULIP=y # CONFIG_DE2104X is not set # CONFIG_TULIP is not set # CONFIG_DE4X5 is not set # CONFIG_WINBOND_840 is not set # CONFIG_DM9102 is not set # CONFIG_ULI526X is not set # CONFIG_PCMCIA_XIRCOM is not set # CONFIG_NET_VENDOR_DLINK is not set CONFIG_NET_VENDOR_EMULEX=y # CONFIG_BE2NET is not set CONFIG_NET_VENDOR_EZCHIP=y # CONFIG_NET_VENDOR_EXAR is not set # CONFIG_NET_VENDOR_HP is not set CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set # CONFIG_E1000 is not set # CONFIG_E1000E is not set # CONFIG_IGB is not set # CONFIG_IGBVF is not set # CONFIG_IXGB is not set # CONFIG_IXGBE is not set # CONFIG_IXGBEVF is not set # CONFIG_I40E is not set # CONFIG_I40EVF is not set # CONFIG_FM10K is not set # CONFIG_NET_VENDOR_I825XX is not set # CONFIG_JME is not set CONFIG_NET_VENDOR_MARVELL=y # CONFIG_MVMDIO is not set # CONFIG_MVNETA_BM is not set # CONFIG_SKGE is not set # CONFIG_SKY2 is not set CONFIG_NET_VENDOR_MELLANOX=y # CONFIG_MLX4_EN is not set # CONFIG_MLX4_CORE is not set # CONFIG_MLX5_CORE is not set # CONFIG_MLXSW_CORE is not set # CONFIG_NET_VENDOR_MICREL is not set CONFIG_NET_VENDOR_MYRI=y # CONFIG_MYRI10GE is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NATSEMI is not set CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP_NETVF is not set # CONFIG_NET_VENDOR_NVIDIA is not set CONFIG_NET_VENDOR_OKI=y # CONFIG_ETHOC is not set CONFIG_NET_PACKET_ENGINE=y # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set CONFIG_NET_VENDOR_QLOGIC=y # CONFIG_QLA3XXX is not set # CONFIG_QLCNIC is not set # CONFIG_QLGE is not set # CONFIG_NETXEN_NIC is not set # CONFIG_QED is not set CONFIG_NET_VENDOR_QUALCOMM=y CONFIG_NET_VENDOR_REALTEK=y # CONFIG_ATP is not set # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_R8169 is not set CONFIG_NET_VENDOR_RENESAS=y # CONFIG_NET_VENDOR_RDC is not set CONFIG_NET_VENDOR_ROCKER=y CONFIG_NET_VENDOR_SAMSUNG=y # CONFIG_SXGBE_ETH is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_SFC is not set CONFIG_NET_VENDOR_SMSC=y # CONFIG_EPIC100 is not set # CONFIG_SMSC911X is not set # CONFIG_SMSC9420 is not set # CONFIG_NET_VENDOR_STMICRO is not set # CONFIG_NET_VENDOR_SUN is not set CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_NET_VENDOR_TEHUTI is not set CONFIG_NET_VENDOR_TI=y # CONFIG_TI_CPSW_ALE is not set # CONFIG_TLAN is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set CONFIG_PHYLIB=y CONFIG_SWPHY=y # # MDIO bus device drivers # # CONFIG_MDIO_BCM_UNIMAC is not set # CONFIG_MDIO_BITBANG is not set # CONFIG_MDIO_OCTEON is not set # CONFIG_MDIO_THUNDER is not set # CONFIG_MDIO_XGENE is not set # # MII PHY device drivers # # CONFIG_AMD_PHY is not set # CONFIG_AQUANTIA_PHY is not set # CONFIG_AT803X_PHY is not set # CONFIG_BCM7XXX_PHY is not set # CONFIG_BCM87XX_PHY is not set # CONFIG_BROADCOM_PHY is not set # CONFIG_CICADA_PHY is not set # CONFIG_DAVICOM_PHY is not set # CONFIG_DP83848_PHY is not set # CONFIG_DP83867_PHY is not set CONFIG_FIXED_PHY=y # CONFIG_ICPLUS_PHY is not set # CONFIG_INTEL_XWAY_PHY is not set # CONFIG_LSI_ET1011C_PHY is not set # CONFIG_LXT_PHY is not set # CONFIG_MARVELL_PHY is not set # CONFIG_MICREL_PHY is not set # CONFIG_MICROCHIP_PHY is not set # CONFIG_MICROSEMI_PHY is not set # CONFIG_NATIONAL_PHY is not set # CONFIG_QSEMI_PHY is not set # CONFIG_REALTEK_PHY is not set # CONFIG_SMSC_PHY is not set # CONFIG_STE10XP is not set # CONFIG_TERANETICS_PHY is not set # CONFIG_VITESSE_PHY is not set # CONFIG_XILINX_GMII2RGMII is not set # CONFIG_PLIP is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set CONFIG_USB_NET_DRIVERS=y # CONFIG_USB_CATC is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set # CONFIG_USB_RTL8152 is not set # CONFIG_USB_LAN78XX is not set # CONFIG_USB_USBNET is not set # CONFIG_USB_IPHETH is not set CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y CONFIG_WLAN_VENDOR_ATH=y CONFIG_ATH_DEBUG=y # CONFIG_ATH_TRACEPOINTS is not set # CONFIG_ATH5K_PCI is not set CONFIG_WLAN_VENDOR_ATMEL=y CONFIG_WLAN_VENDOR_BROADCOM=y CONFIG_WLAN_VENDOR_CISCO=y CONFIG_WLAN_VENDOR_INTEL=y CONFIG_WLAN_VENDOR_INTERSIL=y # CONFIG_HOSTAP is not set # CONFIG_PRISM54 is not set CONFIG_WLAN_VENDOR_MARVELL=y CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_WLAN_VENDOR_RALINK=y CONFIG_WLAN_VENDOR_REALTEK=y CONFIG_WLAN_VENDOR_RSI=y CONFIG_WLAN_VENDOR_ST=y CONFIG_WLAN_VENDOR_TI=y CONFIG_WLAN_VENDOR_ZYDAS=y # # Enable WiMAX (Networking options) to see the WiMAX drivers # CONFIG_WAN=y # CONFIG_HDLC is not set # CONFIG_DLCI is not set # CONFIG_SBNI is not set # CONFIG_XEN_NETDEV_FRONTEND is not set # CONFIG_VMXNET3 is not set # CONFIG_FUJITSU_ES is not set CONFIG_ISDN=y # CONFIG_ISDN_I4L is not set # CONFIG_ISDN_CAPI is not set # CONFIG_ISDN_DRV_GIGASET is not set # CONFIG_HYSDN is not set # CONFIG_MISDN is not set # CONFIG_NVM is not set # # Input device support # CONFIG_INPUT=y CONFIG_INPUT_LEDS=y # CONFIG_INPUT_FF_MEMLESS is not set # CONFIG_INPUT_POLLDEV is not set # CONFIG_INPUT_SPARSEKMAP is not set # CONFIG_INPUT_MATRIXKMAP is not set # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y # CONFIG_INPUT_MOUSEDEV_PSAUX is not set CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 # CONFIG_INPUT_JOYDEV is not set CONFIG_INPUT_EVDEV=y # CONFIG_INPUT_EVBUG is not set # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y # CONFIG_KEYBOARD_ADP5588 is not set # CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1070 is not set # CONFIG_KEYBOARD_QT2160 is not set # CONFIG_KEYBOARD_LKKBD is not set # CONFIG_KEYBOARD_GPIO is not set # CONFIG_KEYBOARD_GPIO_POLLED is not set # CONFIG_KEYBOARD_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 is not set # CONFIG_KEYBOARD_MATRIX is not set # CONFIG_KEYBOARD_LM8323 is not set # CONFIG_KEYBOARD_LM8333 is not set # CONFIG_KEYBOARD_MAX7359 is not set # CONFIG_KEYBOARD_MCS is not set # CONFIG_KEYBOARD_MPR121 is not set # CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_OPENCORES is not set # CONFIG_KEYBOARD_SAMSUNG is not set # CONFIG_KEYBOARD_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_PS2_ALPS=y CONFIG_MOUSE_PS2_BYD=y CONFIG_MOUSE_PS2_LOGIPS2PP=y CONFIG_MOUSE_PS2_SYNAPTICS=y CONFIG_MOUSE_PS2_CYPRESS=y CONFIG_MOUSE_PS2_LIFEBOOK=y CONFIG_MOUSE_PS2_TRACKPOINT=y CONFIG_MOUSE_PS2_ELANTECH=y CONFIG_MOUSE_PS2_SENTELIC=y # CONFIG_MOUSE_PS2_TOUCHKIT is not set CONFIG_MOUSE_PS2_FOCALTECH=y # CONFIG_MOUSE_PS2_VMMOUSE is not set # CONFIG_MOUSE_SERIAL is not set # CONFIG_MOUSE_APPLETOUCH is not set # CONFIG_MOUSE_BCM5974 is not set # CONFIG_MOUSE_CYAPA is not set # CONFIG_MOUSE_ELAN_I2C is not set # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_MOUSE_GPIO is not set # CONFIG_MOUSE_SYNAPTICS_I2C is not set # CONFIG_MOUSE_SYNAPTICS_USB is not set # CONFIG_INPUT_JOYSTICK is not set CONFIG_INPUT_TABLET=y # CONFIG_TABLET_USB_ACECAD is not set # CONFIG_TABLET_USB_AIPTEK is not set # CONFIG_TABLET_USB_GTCO is not set # CONFIG_TABLET_USB_HANWANG is not set # CONFIG_TABLET_USB_KBTAB is not set # CONFIG_TABLET_USB_PEGASUS is not set # CONFIG_TABLET_SERIAL_WACOM4 is not set CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_PROPERTIES=y # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set # CONFIG_TOUCHSCREEN_DYNAPRO is not set # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set # CONFIG_TOUCHSCREEN_EETI is not set # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_ELAN is not set # CONFIG_TOUCHSCREEN_ELO is not set # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set # CONFIG_TOUCHSCREEN_WACOM_I2C is not set # CONFIG_TOUCHSCREEN_MAX11801 is not set # CONFIG_TOUCHSCREEN_MCS5000 is not set # CONFIG_TOUCHSCREEN_MMS114 is not set # CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set # CONFIG_TOUCHSCREEN_MTOUCH is not set # CONFIG_TOUCHSCREEN_INEXIO is not set # CONFIG_TOUCHSCREEN_MK712 is not set # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set # CONFIG_TOUCHSCREEN_PIXCIR is not set # CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set # CONFIG_TOUCHSCREEN_TSC_SERIO is not set # CONFIG_TOUCHSCREEN_TSC2004 is not set # CONFIG_TOUCHSCREEN_TSC2007 is not set # CONFIG_TOUCHSCREEN_RM_TS is not set # CONFIG_TOUCHSCREEN_SILEAD is not set # CONFIG_TOUCHSCREEN_SIS_I2C is not set # CONFIG_TOUCHSCREEN_ST1232 is not set # CONFIG_TOUCHSCREEN_SX8654 is not set # CONFIG_TOUCHSCREEN_TPS6507X is not set # CONFIG_TOUCHSCREEN_ZFORCE is not set # CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set CONFIG_INPUT_PCSPKR=m # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_MPU3050 is not set # CONFIG_INPUT_APANEL is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set # CONFIG_INPUT_GPIO_TILT_POLLED is not set # CONFIG_INPUT_ATLAS_BTNS is not set # CONFIG_INPUT_ATI_REMOTE2 is not set # CONFIG_INPUT_KEYSPAN_REMOTE is not set # CONFIG_INPUT_KXTJ9 is not set # CONFIG_INPUT_POWERMATE is not set # CONFIG_INPUT_YEALINK is not set # CONFIG_INPUT_CM109 is not set # CONFIG_INPUT_UINPUT is not set # CONFIG_INPUT_PCF8574 is not set # CONFIG_INPUT_PWM_BEEPER is not set # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set # CONFIG_INPUT_ADXL34X is not set # CONFIG_INPUT_IMS_PCU is not set # CONFIG_INPUT_CMA3000 is not set # CONFIG_INPUT_XEN_KBDDEV_FRONTEND is not set # CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set # CONFIG_INPUT_DRV260X_HAPTICS is not set # CONFIG_INPUT_DRV2665_HAPTICS is not set # CONFIG_INPUT_DRV2667_HAPTICS is not set # CONFIG_RMI4_CORE is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=y # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PARKBD is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y CONFIG_SERIO_RAW=m # CONFIG_SERIO_ALTERA_PS2 is not set # CONFIG_SERIO_PS2MULT is not set # CONFIG_SERIO_ARC_PS2 is not set # CONFIG_USERIO is not set # CONFIG_GAMEPORT is not set # # Character devices # CONFIG_TTY=y CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_NONSTANDARD=y # CONFIG_ROCKETPORT is not set # CONFIG_CYCLADES is not set # CONFIG_MOXA_INTELLIO is not set # CONFIG_MOXA_SMARTIO is not set # CONFIG_SYNCLINK is not set # CONFIG_SYNCLINKMP is not set # CONFIG_SYNCLINK_GT is not set # CONFIG_NOZOMI is not set # CONFIG_ISI is not set # CONFIG_N_HDLC is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set CONFIG_DEVMEM=y # CONFIG_DEVKMEM is not set # # Serial drivers # CONFIG_SERIAL_EARLYCON=y CONFIG_SERIAL_8250=y # CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set CONFIG_SERIAL_8250_PNP=y # CONFIG_SERIAL_8250_FINTEK is not set CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_DMA=y CONFIG_SERIAL_8250_PCI=y CONFIG_SERIAL_8250_NR_UARTS=32 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set CONFIG_SERIAL_8250_RSA=y # CONFIG_SERIAL_8250_FSL is not set CONFIG_SERIAL_8250_DW=y # CONFIG_SERIAL_8250_RT288X is not set CONFIG_SERIAL_8250_MID=y # CONFIG_SERIAL_8250_MOXA is not set # # Non-8250 serial port support # # CONFIG_SERIAL_KGDB_NMI is not set # CONFIG_SERIAL_UARTLITE is not set CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_CONSOLE_POLL=y # CONFIG_SERIAL_JSM is not set # CONFIG_SERIAL_SCCNXP is not set # CONFIG_SERIAL_SC16IS7XX is not set # CONFIG_SERIAL_ALTERA_JTAGUART is not set # CONFIG_SERIAL_ALTERA_UART is not set # CONFIG_SERIAL_ARC is not set # CONFIG_SERIAL_RP2 is not set # CONFIG_SERIAL_FSL_LPUART is not set CONFIG_SERIAL_MCTRL_GPIO=y # CONFIG_PRINTER is not set CONFIG_PPDEV=m CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y CONFIG_HVC_XEN_FRONTEND=y # CONFIG_VIRTIO_CONSOLE is not set # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=y # CONFIG_HW_RANDOM_TIMERIOMEM is not set # CONFIG_HW_RANDOM_INTEL is not set # CONFIG_HW_RANDOM_AMD is not set # CONFIG_HW_RANDOM_VIA is not set # CONFIG_HW_RANDOM_VIRTIO is not set # CONFIG_HW_RANDOM_TPM is not set CONFIG_NVRAM=y # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set CONFIG_RAW_DRIVER=y CONFIG_MAX_RAW_DEVS=8192 CONFIG_HPET=y CONFIG_HPET_MMAP=y # CONFIG_HPET_MMAP_DEFAULT is not set # CONFIG_HANGCHECK_TIMER is not set # CONFIG_UV_MMTIMER is not set CONFIG_TCG_TPM=y CONFIG_TCG_TIS_CORE=y CONFIG_TCG_TIS=y # CONFIG_TCG_TIS_I2C_ATMEL is not set # CONFIG_TCG_TIS_I2C_INFINEON is not set # CONFIG_TCG_TIS_I2C_NUVOTON is not set # CONFIG_TCG_NSC is not set # CONFIG_TCG_ATMEL is not set # CONFIG_TCG_INFINEON is not set # CONFIG_TCG_XEN is not set # CONFIG_TCG_CRB is not set # CONFIG_TCG_VTPM_PROXY is not set # CONFIG_TCG_TIS_ST33ZP24_I2C is not set # CONFIG_TELCLOCK is not set CONFIG_DEVPORT=y # CONFIG_XILLYBUS is not set # # I2C support # CONFIG_I2C=m CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y # CONFIG_I2C_CHARDEV is not set # CONFIG_I2C_MUX is not set CONFIG_I2C_HELPER_AUTO=y CONFIG_I2C_ALGOBIT=m # # I2C Hardware Bus support # # # PC SMBus host controller drivers # # CONFIG_I2C_ALI1535 is not set # CONFIG_I2C_ALI1563 is not set # CONFIG_I2C_ALI15X3 is not set # CONFIG_I2C_AMD756 is not set # CONFIG_I2C_AMD8111 is not set # CONFIG_I2C_I801 is not set # CONFIG_I2C_ISCH is not set # CONFIG_I2C_ISMT is not set CONFIG_I2C_PIIX4=m # CONFIG_I2C_NFORCE2 is not set # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set # CONFIG_I2C_SIS96X is not set # CONFIG_I2C_VIA is not set # CONFIG_I2C_VIAPRO is not set # # ACPI drivers # # CONFIG_I2C_SCMI is not set # # I2C system bus drivers (mostly embedded / system-on-chip) # # CONFIG_I2C_CBUS_GPIO is not set # CONFIG_I2C_DESIGNWARE_PLATFORM is not set # CONFIG_I2C_DESIGNWARE_PCI is not set # CONFIG_I2C_EMEV2 is not set # CONFIG_I2C_GPIO is not set # CONFIG_I2C_OCORES is not set # CONFIG_I2C_PCA_PLATFORM is not set # CONFIG_I2C_PXA_PCI is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set # # External I2C/SMBus adapter drivers # # CONFIG_I2C_DIOLAN_U2C is not set # CONFIG_I2C_PARPORT is not set # CONFIG_I2C_PARPORT_LIGHT is not set # CONFIG_I2C_ROBOTFUZZ_OSIF is not set # CONFIG_I2C_TAOS_EVM is not set # CONFIG_I2C_TINY_USB is not set # # Other I2C/SMBus bus drivers # # CONFIG_I2C_STUB is not set # CONFIG_I2C_SLAVE is not set # CONFIG_I2C_DEBUG_CORE is not set # CONFIG_I2C_DEBUG_ALGO is not set # CONFIG_I2C_DEBUG_BUS is not set # CONFIG_SPI is not set # CONFIG_SPMI is not set # CONFIG_HSI is not set # # PPS support # # CONFIG_PPS is not set # # PPS generators support # # # PTP clock support # # CONFIG_PTP_1588_CLOCK is not set # CONFIG_DP83640_PHY is not set CONFIG_PINCTRL=y # # Pin controllers # CONFIG_PINMUX=y CONFIG_PINCONF=y CONFIG_GENERIC_PINCONF=y # CONFIG_DEBUG_PINCTRL is not set # CONFIG_PINCTRL_AMD is not set CONFIG_PINCTRL_BAYTRAIL=y # CONFIG_PINCTRL_CHERRYVIEW is not set # CONFIG_PINCTRL_BROXTON is not set # CONFIG_PINCTRL_SUNRISEPOINT is not set CONFIG_GPIOLIB=y CONFIG_GPIO_DEVRES=y CONFIG_GPIO_ACPI=y CONFIG_GPIOLIB_IRQCHIP=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y # # Memory mapped GPIO drivers # # CONFIG_GPIO_AMDPT is not set # CONFIG_GPIO_DWAPB is not set # CONFIG_GPIO_GENERIC_PLATFORM is not set # CONFIG_GPIO_ICH is not set # CONFIG_GPIO_LYNXPOINT is not set # CONFIG_GPIO_VX855 is not set # CONFIG_GPIO_ZX is not set # # Port-mapped I/O GPIO drivers # # CONFIG_GPIO_F7188X is not set # CONFIG_GPIO_IT87 is not set # CONFIG_GPIO_SCH is not set # CONFIG_GPIO_SCH311X is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set # CONFIG_GPIO_PCF857X is not set # CONFIG_GPIO_TPIC2810 is not set # CONFIG_GPIO_TS4900 is not set # # MFD GPIO expanders # # # PCI GPIO expanders # # CONFIG_GPIO_AMD8111 is not set # CONFIG_GPIO_BT8XX is not set # CONFIG_GPIO_ML_IOH is not set # CONFIG_GPIO_RDC321X is not set # # SPI or I2C GPIO expanders # # CONFIG_GPIO_MCP23S08 is not set # # USB GPIO expanders # # CONFIG_W1 is not set # CONFIG_POWER_AVS is not set CONFIG_POWER_RESET=y # CONFIG_POWER_RESET_RESTART is not set CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set # CONFIG_PDA_POWER is not set # CONFIG_TEST_POWER is not set # CONFIG_BATTERY_DS2780 is not set # CONFIG_BATTERY_DS2781 is not set # CONFIG_BATTERY_DS2782 is not set # CONFIG_BATTERY_SBS is not set # CONFIG_BATTERY_BQ27XXX is not set # CONFIG_BATTERY_MAX17040 is not set # CONFIG_BATTERY_MAX17042 is not set # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set # CONFIG_CHARGER_GPIO is not set # CONFIG_CHARGER_BQ2415X is not set # CONFIG_CHARGER_BQ24190 is not set # CONFIG_CHARGER_BQ24257 is not set # CONFIG_CHARGER_BQ24735 is not set # CONFIG_CHARGER_BQ25890 is not set # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_CHARGER_RT9455 is not set CONFIG_HWMON=y # CONFIG_HWMON_VID is not set # CONFIG_HWMON_DEBUG_CHIP is not set # # Native drivers # # CONFIG_SENSORS_ABITUGURU is not set # CONFIG_SENSORS_ABITUGURU3 is not set # CONFIG_SENSORS_AD7414 is not set # CONFIG_SENSORS_AD7418 is not set # CONFIG_SENSORS_ADM1021 is not set # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1026 is not set # CONFIG_SENSORS_ADM1029 is not set # CONFIG_SENSORS_ADM1031 is not set # CONFIG_SENSORS_ADM9240 is not set # CONFIG_SENSORS_ADT7410 is not set # CONFIG_SENSORS_ADT7411 is not set # CONFIG_SENSORS_ADT7462 is not set # CONFIG_SENSORS_ADT7470 is not set # CONFIG_SENSORS_ADT7475 is not set # CONFIG_SENSORS_ASC7621 is not set # CONFIG_SENSORS_K8TEMP is not set # CONFIG_SENSORS_K10TEMP is not set # CONFIG_SENSORS_FAM15H_POWER is not set # CONFIG_SENSORS_APPLESMC is not set # CONFIG_SENSORS_ASB100 is not set # CONFIG_SENSORS_ATXP1 is not set # CONFIG_SENSORS_DS620 is not set # CONFIG_SENSORS_DS1621 is not set # CONFIG_SENSORS_DELL_SMM is not set # CONFIG_SENSORS_I5K_AMB is not set # CONFIG_SENSORS_F71805F is not set # CONFIG_SENSORS_F71882FG is not set # CONFIG_SENSORS_F75375S is not set # CONFIG_SENSORS_FSCHMD is not set # CONFIG_SENSORS_FTSTEUTATES is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_G760A is not set # CONFIG_SENSORS_G762 is not set # CONFIG_SENSORS_GPIO_FAN is not set # CONFIG_SENSORS_HIH6130 is not set # CONFIG_SENSORS_I5500 is not set # CONFIG_SENSORS_CORETEMP is not set # CONFIG_SENSORS_IT87 is not set # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set # CONFIG_SENSORS_LTC2990 is not set # CONFIG_SENSORS_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4222 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4260 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_MAX16065 is not set # CONFIG_SENSORS_MAX1619 is not set # CONFIG_SENSORS_MAX1668 is not set # CONFIG_SENSORS_MAX197 is not set # CONFIG_SENSORS_MAX6639 is not set # CONFIG_SENSORS_MAX6642 is not set # CONFIG_SENSORS_MAX6650 is not set # CONFIG_SENSORS_MAX6697 is not set # CONFIG_SENSORS_MAX31790 is not set # CONFIG_SENSORS_MCP3021 is not set # CONFIG_SENSORS_LM63 is not set # CONFIG_SENSORS_LM73 is not set # CONFIG_SENSORS_LM75 is not set # CONFIG_SENSORS_LM77 is not set # CONFIG_SENSORS_LM78 is not set # CONFIG_SENSORS_LM80 is not set # CONFIG_SENSORS_LM83 is not set # CONFIG_SENSORS_LM85 is not set # CONFIG_SENSORS_LM87 is not set # CONFIG_SENSORS_LM90 is not set # CONFIG_SENSORS_LM92 is not set # CONFIG_SENSORS_LM93 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_NCT6683 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NCT7802 is not set # CONFIG_SENSORS_NCT7904 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_SHT15 is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SHT3x is not set # CONFIG_SENSORS_SHTC1 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_DME1737 is not set # CONFIG_SENSORS_EMC1403 is not set # CONFIG_SENSORS_EMC2103 is not set # CONFIG_SENSORS_EMC6W201 is not set # CONFIG_SENSORS_SMSC47M1 is not set # CONFIG_SENSORS_SMSC47M192 is not set # CONFIG_SENSORS_SMSC47B397 is not set # CONFIG_SENSORS_SCH56XX_COMMON is not set # CONFIG_SENSORS_SCH5627 is not set # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_SMM665 is not set # CONFIG_SENSORS_ADC128D818 is not set # CONFIG_SENSORS_ADS1015 is not set # CONFIG_SENSORS_ADS7828 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set # CONFIG_SENSORS_INA2XX is not set # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_TC74 is not set # CONFIG_SENSORS_THMC50 is not set # CONFIG_SENSORS_TMP102 is not set # CONFIG_SENSORS_TMP103 is not set # CONFIG_SENSORS_TMP401 is not set # CONFIG_SENSORS_TMP421 is not set # CONFIG_SENSORS_VIA_CPUTEMP is not set # CONFIG_SENSORS_VIA686A is not set # CONFIG_SENSORS_VT1211 is not set # CONFIG_SENSORS_VT8231 is not set # CONFIG_SENSORS_W83781D is not set # CONFIG_SENSORS_W83791D is not set # CONFIG_SENSORS_W83792D is not set # CONFIG_SENSORS_W83793 is not set # CONFIG_SENSORS_W83795 is not set # CONFIG_SENSORS_W83L785TS is not set # CONFIG_SENSORS_W83L786NG is not set # CONFIG_SENSORS_W83627HF is not set # CONFIG_SENSORS_W83627EHF is not set # # ACPI drivers # # CONFIG_SENSORS_ACPI_POWER is not set # CONFIG_SENSORS_ATK0110 is not set CONFIG_THERMAL=y CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set # CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set CONFIG_THERMAL_GOV_FAIR_SHARE=y CONFIG_THERMAL_GOV_STEP_WISE=y CONFIG_THERMAL_GOV_BANG_BANG=y CONFIG_THERMAL_GOV_USER_SPACE=y # CONFIG_THERMAL_GOV_POWER_ALLOCATOR is not set # CONFIG_THERMAL_EMULATION is not set # CONFIG_INTEL_POWERCLAMP is not set # CONFIG_X86_PKG_TEMP_THERMAL is not set # CONFIG_INTEL_SOC_DTS_THERMAL is not set # # ACPI INT340X thermal drivers # # CONFIG_INT340X_THERMAL is not set # CONFIG_INTEL_PCH_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set CONFIG_WATCHDOG_SYSFS=y # # Watchdog Device Drivers # # CONFIG_SOFT_WATCHDOG is not set # CONFIG_XILINX_WATCHDOG is not set # CONFIG_ZIIRAVE_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_ACQUIRE_WDT is not set # CONFIG_ADVANTECH_WDT is not set # CONFIG_ALIM1535_WDT is not set # CONFIG_ALIM7101_WDT is not set # CONFIG_F71808E_WDT is not set # CONFIG_SP5100_TCO is not set # CONFIG_SBC_FITPC2_WATCHDOG is not set # CONFIG_EUROTECH_WDT is not set # CONFIG_IB700_WDT is not set # CONFIG_IBMASR is not set # CONFIG_WAFER_WDT is not set # CONFIG_I6300ESB_WDT is not set # CONFIG_IE6XX_WDT is not set # CONFIG_ITCO_WDT is not set # CONFIG_IT8712F_WDT is not set # CONFIG_IT87_WDT is not set # CONFIG_HP_WATCHDOG is not set # CONFIG_SC1200_WDT is not set # CONFIG_PC87413_WDT is not set # CONFIG_NV_TCO is not set # CONFIG_60XX_WDT is not set # CONFIG_CPU5_WDT is not set # CONFIG_SMSC_SCH311X_WDT is not set # CONFIG_SMSC37B787_WDT is not set # CONFIG_VIA_WDT is not set # CONFIG_W83627HF_WDT is not set # CONFIG_W83877F_WDT is not set # CONFIG_W83977F_WDT is not set # CONFIG_MACHZ_WDT is not set # CONFIG_SBC_EPX_C3_WATCHDOG is not set # CONFIG_NI903X_WDT is not set # CONFIG_MEN_A21_WDT is not set # CONFIG_XEN_WDT is not set # # PCI-based Watchdog Cards # # CONFIG_PCIPCWATCHDOG is not set # CONFIG_WDTPCI is not set # # USB-based Watchdog Cards # # CONFIG_USBPCWATCHDOG is not set CONFIG_SSB_POSSIBLE=y # # Sonics Silicon Backplane # # CONFIG_SSB is not set CONFIG_BCMA_POSSIBLE=y # # Broadcom specific AMBA # # CONFIG_BCMA is not set # # Multifunction device drivers # CONFIG_MFD_CORE=y # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_AXP20X_I2C is not set # CONFIG_MFD_CROS_EC is not set # CONFIG_MFD_DA9062 is not set # CONFIG_MFD_DA9063 is not set # CONFIG_MFD_DA9150 is not set # CONFIG_MFD_DLN2 is not set # CONFIG_MFD_MC13XXX_I2C is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set # CONFIG_LPC_ICH is not set # CONFIG_LPC_SCH is not set CONFIG_MFD_INTEL_LPSS=y CONFIG_MFD_INTEL_LPSS_ACPI=y CONFIG_MFD_INTEL_LPSS_PCI=y # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77693 is not set # CONFIG_MFD_MAX8907 is not set # CONFIG_MFD_MT6397 is not set # CONFIG_MFD_MENF21BMC is not set # CONFIG_MFD_VIPERBOARD is not set # CONFIG_MFD_RETU is not set # CONFIG_MFD_PCF50633 is not set # CONFIG_MFD_RDC321X is not set # CONFIG_MFD_RTSX_PCI is not set # CONFIG_MFD_RT5033 is not set # CONFIG_MFD_RTSX_USB is not set # CONFIG_MFD_SI476X_CORE is not set # CONFIG_MFD_SM501 is not set # CONFIG_MFD_SKY81452 is not set # CONFIG_ABX500_CORE is not set # CONFIG_MFD_SYSCON is not set # CONFIG_MFD_TI_AM335X_TSCADC is not set # CONFIG_MFD_LP3943 is not set # CONFIG_TPS6105X is not set # CONFIG_TPS65010 is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65086 is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_TPS65218 is not set # CONFIG_MFD_TPS65912_I2C is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TMIO is not set # CONFIG_MFD_VX855 is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_REGULATOR is not set # CONFIG_MEDIA_SUPPORT is not set # # Graphics support # CONFIG_AGP=y CONFIG_AGP_AMD64=y CONFIG_AGP_INTEL=y CONFIG_AGP_SIS=y CONFIG_AGP_VIA=y CONFIG_INTEL_GTT=y CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=64 CONFIG_VGA_SWITCHEROO=y CONFIG_DRM=m # CONFIG_DRM_DP_AUX_CHARDEV is not set CONFIG_DRM_KMS_HELPER=m CONFIG_DRM_KMS_FB_HELPER=y CONFIG_DRM_FBDEV_EMULATION=y CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_TTM=m # # I2C encoder or helper chips # # CONFIG_DRM_I2C_CH7006 is not set # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_TDFX is not set # CONFIG_DRM_R128 is not set # CONFIG_DRM_RADEON is not set # CONFIG_DRM_AMDGPU is not set # # ACP (Audio CoProcessor) Configuration # # CONFIG_DRM_NOUVEAU is not set # CONFIG_DRM_I810 is not set # CONFIG_DRM_I915 is not set # CONFIG_DRM_MGA is not set # CONFIG_DRM_SIS is not set # CONFIG_DRM_VIA is not set # CONFIG_DRM_SAVAGE is not set # CONFIG_DRM_VGEM is not set # CONFIG_DRM_VMWGFX is not set # CONFIG_DRM_GMA500 is not set # CONFIG_DRM_UDL is not set # CONFIG_DRM_AST is not set # CONFIG_DRM_MGAG200 is not set # CONFIG_DRM_CIRRUS_QEMU is not set # CONFIG_DRM_QXL is not set CONFIG_DRM_BOCHS=m # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_BRIDGE=y # # Display Interface Bridges # # CONFIG_DRM_ANALOGIX_ANX78XX is not set # # Frame buffer Devices # CONFIG_FB=y # CONFIG_FIRMWARE_EDID is not set CONFIG_FB_CMDLINE=y CONFIG_FB_NOTIFY=y # CONFIG_FB_DDC is not set CONFIG_FB_BOOT_VESA_SUPPORT=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set CONFIG_FB_SYS_FILLRECT=m CONFIG_FB_SYS_COPYAREA=m CONFIG_FB_SYS_IMAGEBLIT=m # CONFIG_FB_FOREIGN_ENDIAN is not set CONFIG_FB_SYS_FOPS=m CONFIG_FB_DEFERRED_IO=y # CONFIG_FB_SVGALIB is not set # CONFIG_FB_MACMODES is not set # CONFIG_FB_BACKLIGHT is not set # CONFIG_FB_MODE_HELPERS is not set CONFIG_FB_TILEBLITTING=y # # Frame buffer hardware drivers # # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ARC is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set # CONFIG_FB_UVESA is not set CONFIG_FB_VESA=y CONFIG_FB_EFI=y # CONFIG_FB_N411 is not set # CONFIG_FB_HGA is not set # CONFIG_FB_OPENCORES is not set # CONFIG_FB_S1D13XXX is not set # CONFIG_FB_NVIDIA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_I740 is not set # CONFIG_FB_LE80578 is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_S3 is not set # CONFIG_FB_SAVAGE is not set # CONFIG_FB_SIS is not set # CONFIG_FB_VIA is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_VT8623 is not set # CONFIG_FB_TRIDENT is not set # CONFIG_FB_ARK is not set # CONFIG_FB_PM3 is not set # CONFIG_FB_CARMINE is not set # CONFIG_FB_SMSCUFX is not set # CONFIG_FB_UDL is not set # CONFIG_FB_IBM_GXT4500 is not set # CONFIG_FB_VIRTUAL is not set # CONFIG_XEN_FBDEV_FRONTEND is not set # CONFIG_FB_METRONOME is not set # CONFIG_FB_MB862XX is not set # CONFIG_FB_BROADSHEET is not set # CONFIG_FB_AUO_K190X is not set # CONFIG_FB_SIMPLE is not set # CONFIG_FB_SM712 is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y # CONFIG_BACKLIGHT_GENERIC is not set # CONFIG_BACKLIGHT_PWM is not set # CONFIG_BACKLIGHT_APPLE is not set # CONFIG_BACKLIGHT_PM8941_WLED is not set # CONFIG_BACKLIGHT_SAHARA is not set # CONFIG_BACKLIGHT_ADP8860 is not set # CONFIG_BACKLIGHT_ADP8870 is not set # CONFIG_BACKLIGHT_LM3630A is not set # CONFIG_BACKLIGHT_LM3639 is not set # CONFIG_BACKLIGHT_LP855X is not set # CONFIG_BACKLIGHT_GPIO is not set # CONFIG_BACKLIGHT_LV5207LP is not set # CONFIG_BACKLIGHT_BD6107 is not set # CONFIG_VGASTATE is not set CONFIG_HDMI=y # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_VGACON_SOFT_SCROLLBACK=y CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64 CONFIG_DUMMY_CONSOLE=y CONFIG_DUMMY_CONSOLE_COLUMNS=80 CONFIG_DUMMY_CONSOLE_ROWS=25 CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y # CONFIG_SOUND is not set # # HID support # CONFIG_HID=y CONFIG_HID_BATTERY_STRENGTH=y CONFIG_HIDRAW=y # CONFIG_UHID is not set CONFIG_HID_GENERIC=y # # Special HID drivers # CONFIG_HID_A4TECH=y # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=y # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set CONFIG_HID_BELKIN=y # CONFIG_HID_BETOP_FF is not set CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y # CONFIG_HID_CORSAIR is not set # CONFIG_HID_CMEDIA is not set # CONFIG_HID_CP2112 is not set CONFIG_HID_CYPRESS=y # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELECOM is not set # CONFIG_HID_ELO is not set CONFIG_HID_EZKEY=y # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_HOLTEK is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set # CONFIG_HID_KYE is not set # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_TWINHAN is not set CONFIG_HID_KENSINGTON=y # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LED is not set # CONFIG_HID_LENOVO is not set CONFIG_HID_LOGITECH=y # CONFIG_HID_LOGITECH_DJ is not set # CONFIG_HID_LOGITECH_HIDPP is not set # CONFIG_LOGITECH_FF is not set # CONFIG_LOGIRUMBLEPAD2_FF is not set # CONFIG_LOGIG940_FF is not set # CONFIG_LOGIWHEELS_FF is not set CONFIG_HID_MAGICMOUSE=y CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y # CONFIG_HID_MULTITOUCH is not set CONFIG_HID_NTRIG=y # CONFIG_HID_ORTEK is not set # CONFIG_HID_PANTHERLORD is not set # CONFIG_HID_PENMOUNT is not set # CONFIG_HID_PETALYNX is not set # CONFIG_HID_PICOLCD is not set # CONFIG_HID_PLANTRONICS is not set # CONFIG_HID_PRIMAX is not set # CONFIG_HID_ROCCAT is not set # CONFIG_HID_SAITEK is not set # CONFIG_HID_SAMSUNG is not set # CONFIG_HID_SONY is not set # CONFIG_HID_SPEEDLINK is not set # CONFIG_HID_STEELSERIES is not set # CONFIG_HID_SUNPLUS is not set # CONFIG_HID_RMI is not set # CONFIG_HID_GREENASIA is not set # CONFIG_HID_SMARTJOYPLUS is not set # CONFIG_HID_TIVO is not set # CONFIG_HID_TOPSEED is not set # CONFIG_HID_THINGM is not set # CONFIG_HID_THRUSTMASTER is not set # CONFIG_HID_WACOM is not set # CONFIG_HID_WIIMOTE is not set # CONFIG_HID_XINMO is not set # CONFIG_HID_ZEROPLUS is not set # CONFIG_HID_ZYDACRON is not set # CONFIG_HID_SENSOR_HUB is not set # CONFIG_HID_ALPS is not set # # USB HID support # CONFIG_USB_HID=y CONFIG_HID_PID=y CONFIG_USB_HIDDEV=y # # I2C HID support # # CONFIG_I2C_HID is not set # # Intel ISH HID support # # CONFIG_INTEL_ISH_HID is not set CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=y CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_OTG is not set # CONFIG_USB_OTG_WHITELIST is not set # CONFIG_USB_ULPI_BUS is not set CONFIG_USB_MON=y # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=y CONFIG_USB_XHCI_PCI=y # CONFIG_USB_XHCI_PLATFORM is not set CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_PCI=y # CONFIG_USB_EHCI_HCD_PLATFORM is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set # CONFIG_USB_ISP1362_HCD is not set # CONFIG_USB_FOTG210_HCD is not set CONFIG_USB_OHCI_HCD=y CONFIG_USB_OHCI_HCD_PCI=y # CONFIG_USB_OHCI_HCD_PLATFORM is not set CONFIG_USB_UHCI_HCD=y # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD is not set # CONFIG_USB_HCD_TEST_MODE is not set # # USB Device Class drivers # # CONFIG_USB_ACM is not set # CONFIG_USB_PRINTER is not set # CONFIG_USB_WDM is not set # CONFIG_USB_TMC is not set # # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may # # # also be needed; see USB_STORAGE Help for more info # # CONFIG_USB_STORAGE is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USBIP_CORE is not set # CONFIG_USB_MUSB_HDRC is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_DWC2 is not set # CONFIG_USB_CHIPIDEA is not set # CONFIG_USB_ISP1760 is not set # # USB port drivers # # CONFIG_USB_USS720 is not set CONFIG_USB_SERIAL=y CONFIG_USB_SERIAL_CONSOLE=y CONFIG_USB_SERIAL_GENERIC=y # CONFIG_USB_SERIAL_SIMPLE is not set # CONFIG_USB_SERIAL_AIRCABLE is not set # CONFIG_USB_SERIAL_ARK3116 is not set # CONFIG_USB_SERIAL_BELKIN is not set # CONFIG_USB_SERIAL_CH341 is not set # CONFIG_USB_SERIAL_WHITEHEAT is not set # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set # CONFIG_USB_SERIAL_CP210X is not set # CONFIG_USB_SERIAL_CYPRESS_M8 is not set # CONFIG_USB_SERIAL_EMPEG is not set # CONFIG_USB_SERIAL_FTDI_SIO is not set # CONFIG_USB_SERIAL_VISOR is not set # CONFIG_USB_SERIAL_IPAQ is not set # CONFIG_USB_SERIAL_IR is not set # CONFIG_USB_SERIAL_EDGEPORT is not set # CONFIG_USB_SERIAL_EDGEPORT_TI is not set # CONFIG_USB_SERIAL_F81232 is not set # CONFIG_USB_SERIAL_GARMIN is not set # CONFIG_USB_SERIAL_IPW is not set # CONFIG_USB_SERIAL_IUU is not set # CONFIG_USB_SERIAL_KEYSPAN_PDA is not set # CONFIG_USB_SERIAL_KEYSPAN is not set # CONFIG_USB_SERIAL_KLSI is not set # CONFIG_USB_SERIAL_KOBIL_SCT is not set # CONFIG_USB_SERIAL_MCT_U232 is not set # CONFIG_USB_SERIAL_METRO is not set # CONFIG_USB_SERIAL_MOS7720 is not set # CONFIG_USB_SERIAL_MOS7840 is not set # CONFIG_USB_SERIAL_MXUPORT is not set # CONFIG_USB_SERIAL_NAVMAN is not set # CONFIG_USB_SERIAL_PL2303 is not set # CONFIG_USB_SERIAL_OTI6858 is not set # CONFIG_USB_SERIAL_QCAUX is not set # CONFIG_USB_SERIAL_QUALCOMM is not set # CONFIG_USB_SERIAL_SPCP8X5 is not set # CONFIG_USB_SERIAL_SAFE is not set # CONFIG_USB_SERIAL_SIERRAWIRELESS is not set # CONFIG_USB_SERIAL_SYMBOL is not set # CONFIG_USB_SERIAL_TI is not set # CONFIG_USB_SERIAL_CYBERJACK is not set # CONFIG_USB_SERIAL_XIRCOM is not set # CONFIG_USB_SERIAL_OPTION is not set # CONFIG_USB_SERIAL_OMNINET is not set # CONFIG_USB_SERIAL_OPTICON is not set # CONFIG_USB_SERIAL_XSENS_MT is not set # CONFIG_USB_SERIAL_WISHBONE is not set # CONFIG_USB_SERIAL_SSU100 is not set # CONFIG_USB_SERIAL_QT2 is not set # CONFIG_USB_SERIAL_DEBUG is not set # # USB Miscellaneous drivers # # CONFIG_USB_EMI62 is not set # CONFIG_USB_EMI26 is not set # CONFIG_USB_ADUTUX is not set # CONFIG_USB_SEVSEG is not set # CONFIG_USB_RIO500 is not set # CONFIG_USB_LEGOTOWER is not set # CONFIG_USB_LCD is not set # CONFIG_USB_CYPRESS_CY7C63 is not set # CONFIG_USB_CYTHERM is not set # CONFIG_USB_IDMOUSE is not set # CONFIG_USB_FTDI_ELAN is not set # CONFIG_USB_APPLEDISPLAY is not set # CONFIG_USB_SISUSBVGA is not set # CONFIG_USB_LD is not set # CONFIG_USB_TRANCEVIBRATOR is not set # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set # CONFIG_USB_EHSET_TEST_FIXTURE is not set # CONFIG_USB_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_HSIC_USB4604 is not set # CONFIG_USB_LINK_LAYER_TEST is not set # CONFIG_USB_CHAOSKEY is not set # CONFIG_UCSI is not set # # USB Physical Layer drivers # # CONFIG_USB_PHY is not set # CONFIG_NOP_USB_XCEIV is not set # CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_ISP1301 is not set # CONFIG_USB_GADGET is not set # CONFIG_USB_LED_TRIG is not set # CONFIG_UWB is not set # CONFIG_MMC is not set # CONFIG_MEMSTICK is not set CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y # CONFIG_LEDS_CLASS_FLASH is not set # # LED drivers # # CONFIG_LEDS_LM3530 is not set # CONFIG_LEDS_LM3642 is not set # CONFIG_LEDS_PCA9532 is not set # CONFIG_LEDS_GPIO is not set # CONFIG_LEDS_LP3944 is not set # CONFIG_LEDS_LP3952 is not set # CONFIG_LEDS_LP5521 is not set # CONFIG_LEDS_LP5523 is not set # CONFIG_LEDS_LP5562 is not set # CONFIG_LEDS_LP8501 is not set # CONFIG_LEDS_LP8860 is not set # CONFIG_LEDS_CLEVO_MAIL is not set # CONFIG_LEDS_PCA955X is not set # CONFIG_LEDS_PCA963X is not set # CONFIG_LEDS_PWM is not set # CONFIG_LEDS_BD2802 is not set # CONFIG_LEDS_INTEL_SS4200 is not set # CONFIG_LEDS_LT3593 is not set # CONFIG_LEDS_TCA6507 is not set # CONFIG_LEDS_TLC591XX is not set # CONFIG_LEDS_LM355x is not set # # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) # # CONFIG_LEDS_BLINKM is not set # # LED Triggers # CONFIG_LEDS_TRIGGERS=y # CONFIG_LEDS_TRIGGER_TIMER is not set # CONFIG_LEDS_TRIGGER_ONESHOT is not set # CONFIG_LEDS_TRIGGER_DISK is not set # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set # CONFIG_LEDS_TRIGGER_CPU is not set # CONFIG_LEDS_TRIGGER_GPIO is not set # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set # # iptables trigger is under Netfilter config (LED target) # # CONFIG_LEDS_TRIGGER_TRANSIENT is not set # CONFIG_LEDS_TRIGGER_CAMERA is not set # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set CONFIG_EDAC_ATOMIC_SCRUB=y CONFIG_EDAC_SUPPORT=y CONFIG_EDAC=y CONFIG_EDAC_LEGACY_SYSFS=y CONFIG_EDAC_DEBUG=y # CONFIG_EDAC_DECODE_MCE is not set # CONFIG_EDAC_MM_EDAC is not set CONFIG_RTC_LIB=y CONFIG_RTC_MC146818_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y CONFIG_RTC_HCTOSYS_DEVICE="rtc0" # CONFIG_RTC_SYSTOHC is not set # CONFIG_RTC_DEBUG is not set # # RTC interfaces # CONFIG_RTC_INTF_SYSFS=y CONFIG_RTC_INTF_PROC=y CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set # CONFIG_RTC_DRV_TEST is not set # # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set # CONFIG_RTC_DRV_DS1672 is not set # CONFIG_RTC_DRV_MAX6900 is not set # CONFIG_RTC_DRV_RS5C372 is not set # CONFIG_RTC_DRV_ISL1208 is not set # CONFIG_RTC_DRV_ISL12022 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set # CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set # CONFIG_RTC_DRV_M41T80 is not set # CONFIG_RTC_DRV_BQ32K is not set # CONFIG_RTC_DRV_S35390A is not set # CONFIG_RTC_DRV_FM3130 is not set # CONFIG_RTC_DRV_RX8010 is not set # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set # CONFIG_RTC_DRV_RV8803 is not set # # SPI RTC drivers # CONFIG_RTC_I2C_AND_SPI=m # # SPI and I2C RTC drivers # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # # Platform RTC drivers # CONFIG_RTC_DRV_CMOS=y # CONFIG_RTC_DRV_DS1286 is not set # CONFIG_RTC_DRV_DS1511 is not set # CONFIG_RTC_DRV_DS1553 is not set # CONFIG_RTC_DRV_DS1685_FAMILY is not set # CONFIG_RTC_DRV_DS1742 is not set # CONFIG_RTC_DRV_DS2404 is not set # CONFIG_RTC_DRV_STK17TA8 is not set # CONFIG_RTC_DRV_M48T86 is not set # CONFIG_RTC_DRV_M48T35 is not set # CONFIG_RTC_DRV_M48T59 is not set # CONFIG_RTC_DRV_MSM6242 is not set # CONFIG_RTC_DRV_BQ4802 is not set # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # # on-CPU RTC drivers # # # HID Sensor RTC drivers # # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y CONFIG_DMADEVICES_DEBUG=y CONFIG_DMADEVICES_VDEBUG=y # # DMA Devices # CONFIG_DMA_ENGINE=y CONFIG_DMA_VIRTUAL_CHANNELS=y CONFIG_DMA_ACPI=y # CONFIG_INTEL_IDMA64 is not set # CONFIG_INTEL_IOATDMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set # CONFIG_QCOM_HIDMA is not set # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set CONFIG_HSU_DMA=y # # DMA Clients # CONFIG_ASYNC_TX_DMA=y # CONFIG_DMATEST is not set # # DMABUF options # # CONFIG_SYNC_FILE is not set CONFIG_AUXDISPLAY=y # CONFIG_KS0108 is not set # CONFIG_UIO is not set # CONFIG_VFIO is not set # CONFIG_VIRT_DRIVERS is not set CONFIG_VIRTIO=m # # Virtio drivers # CONFIG_VIRTIO_PCI=m CONFIG_VIRTIO_PCI_LEGACY=y # CONFIG_VIRTIO_BALLOON is not set # CONFIG_VIRTIO_INPUT is not set # CONFIG_VIRTIO_MMIO is not set # # Microsoft Hyper-V guest support # # CONFIG_HYPERV is not set # # Xen driver support # CONFIG_XEN_BALLOON=y # CONFIG_XEN_SELFBALLOONING is not set # CONFIG_XEN_BALLOON_MEMORY_HOTPLUG is not set CONFIG_XEN_SCRUB_PAGES=y # CONFIG_XEN_DEV_EVTCHN is not set # CONFIG_XEN_BACKEND is not set # CONFIG_XENFS is not set CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_XENBUS_FRONTEND=y # CONFIG_XEN_GNTDEV is not set # CONFIG_XEN_GRANT_DEV_ALLOC is not set CONFIG_SWIOTLB_XEN=y CONFIG_XEN_TMEM=m CONFIG_XEN_PRIVCMD=m # CONFIG_XEN_ACPI_PROCESSOR is not set # CONFIG_XEN_MCE_LOG is not set CONFIG_XEN_HAVE_PVMMU=y CONFIG_XEN_EFI=y CONFIG_XEN_AUTO_XLATE=y CONFIG_XEN_ACPI=y CONFIG_XEN_HAVE_VPMU=y CONFIG_STAGING=y # CONFIG_SLICOSS is not set # CONFIG_COMEDI is not set # CONFIG_RTL8192U is not set # CONFIG_RTLLIB is not set # CONFIG_R8712U is not set # CONFIG_RTS5208 is not set # CONFIG_FB_SM750 is not set # CONFIG_FB_XGI is not set # # Speakup console speech # # CONFIG_SPEAKUP is not set # CONFIG_STAGING_MEDIA is not set # # Android # # CONFIG_LTE_GDM724X is not set # CONFIG_LNET is not set # CONFIG_DGNC is not set # CONFIG_GS_FPGABOOT is not set # CONFIG_CRYPTO_SKEIN is not set # CONFIG_UNISYSSPAR is not set # CONFIG_MOST is not set CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_ACERHDF is not set # CONFIG_ASUS_LAPTOP is not set # CONFIG_DELL_SMO8800 is not set # CONFIG_FUJITSU_LAPTOP is not set # CONFIG_FUJITSU_TABLET is not set # CONFIG_HP_ACCEL is not set # CONFIG_HP_WIRELESS is not set # CONFIG_PANASONIC_LAPTOP is not set # CONFIG_THINKPAD_ACPI is not set # CONFIG_SENSORS_HDAPS is not set # CONFIG_INTEL_MENLOW is not set # CONFIG_EEEPC_LAPTOP is not set # CONFIG_ASUS_WIRELESS is not set # CONFIG_ACPI_WMI is not set # CONFIG_TOPSTAR_LAPTOP is not set # CONFIG_TOSHIBA_BT_RFKILL is not set # CONFIG_TOSHIBA_HAPS is not set # CONFIG_ACPI_CMPC is not set # CONFIG_INTEL_HID_EVENT is not set # CONFIG_INTEL_VBTN is not set # CONFIG_INTEL_IPS is not set # CONFIG_INTEL_PMC_CORE is not set # CONFIG_IBM_RTL is not set # CONFIG_SAMSUNG_LAPTOP is not set # CONFIG_SAMSUNG_Q10 is not set # CONFIG_APPLE_GMUX is not set # CONFIG_INTEL_RST is not set # CONFIG_INTEL_SMARTCONNECT is not set CONFIG_PVPANIC=y # CONFIG_INTEL_PMC_IPC is not set # CONFIG_SURFACE_PRO3_BUTTON is not set # CONFIG_INTEL_PUNIT_IPC is not set # CONFIG_CHROME_PLATFORMS is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y # # Common Clock Framework # # CONFIG_COMMON_CLK_SI5351 is not set # CONFIG_COMMON_CLK_CDCE706 is not set # CONFIG_COMMON_CLK_CS2000_CP is not set # CONFIG_COMMON_CLK_NXP is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_PXA is not set # CONFIG_COMMON_CLK_PIC32 is not set # CONFIG_COMMON_CLK_MT8135 is not set # CONFIG_COMMON_CLK_MT8173 is not set # CONFIG_SUNXI_CCU is not set # # Hardware Spinlock drivers # # # Clock Source drivers # CONFIG_CLKEVT_I8253=y CONFIG_I8253_LOCK=y CONFIG_CLKBLD_I8253=y # CONFIG_ATMEL_PIT is not set # CONFIG_SH_TIMER_CMT is not set # CONFIG_SH_TIMER_MTU2 is not set # CONFIG_SH_TIMER_TMU is not set # CONFIG_EM_TIMER_STI is not set # CONFIG_MAILBOX is not set CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y # # Generic IOMMU Pagetable Support # CONFIG_IOMMU_IOVA=y CONFIG_AMD_IOMMU=y # CONFIG_AMD_IOMMU_V2 is not set CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y # CONFIG_INTEL_IOMMU_SVM is not set # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set CONFIG_INTEL_IOMMU_FLOPPY_WA=y CONFIG_IRQ_REMAP=y # # Remoteproc drivers # # CONFIG_STE_MODEM_RPROC is not set # # Rpmsg drivers # # # SOC (System On Chip) specific Drivers # # # Broadcom SoC drivers # # CONFIG_SUNXI_SRAM is not set # CONFIG_SOC_TI is not set CONFIG_PM_DEVFREQ=y # # DEVFREQ Governors # # CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND is not set # CONFIG_DEVFREQ_GOV_PERFORMANCE is not set # CONFIG_DEVFREQ_GOV_POWERSAVE is not set # CONFIG_DEVFREQ_GOV_USERSPACE is not set # CONFIG_DEVFREQ_GOV_PASSIVE is not set # # DEVFREQ Drivers # # CONFIG_PM_DEVFREQ_EVENT is not set # CONFIG_EXTCON is not set # CONFIG_MEMORY is not set # CONFIG_IIO is not set # CONFIG_NTB is not set # CONFIG_VME_BUS is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y # CONFIG_PWM_LPSS_PCI is not set # CONFIG_PWM_LPSS_PLATFORM is not set # CONFIG_PWM_PCA9685 is not set CONFIG_ARM_GIC_MAX_NR=1 # CONFIG_IPACK_BUS is not set # CONFIG_RESET_CONTROLLER is not set # CONFIG_FMC is not set # # PHY Subsystem # CONFIG_GENERIC_PHY=y # CONFIG_PHY_PXA_28NM_HSIC is not set # CONFIG_PHY_PXA_28NM_USB2 is not set # CONFIG_BCM_KONA_USB2_PHY is not set CONFIG_POWERCAP=y # CONFIG_INTEL_RAPL is not set # CONFIG_MCB is not set # # Performance monitor support # CONFIG_RAS=y # CONFIG_THUNDERBOLT is not set # # Android # # CONFIG_ANDROID is not set CONFIG_LIBNVDIMM=y # CONFIG_BLK_DEV_PMEM is not set # CONFIG_ND_BLK is not set CONFIG_ND_CLAIM=y CONFIG_BTT=y # CONFIG_DEV_DAX is not set # CONFIG_NVMEM is not set # CONFIG_STM is not set # CONFIG_INTEL_TH is not set # # FPGA Configuration Support # # CONFIG_FPGA is not set # # Firmware Drivers # # CONFIG_EDD is not set CONFIG_FIRMWARE_MEMMAP=y # CONFIG_DELL_RBU is not set # CONFIG_DCDBAS is not set CONFIG_DMIID=y CONFIG_DMI_SYSFS=y CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y CONFIG_ISCSI_IBFT_FIND=y # CONFIG_ISCSI_IBFT is not set # CONFIG_FW_CFG_SYSFS is not set # CONFIG_GOOGLE_FIRMWARE is not set # # EFI (Extensible Firmware Interface) Support # CONFIG_EFI_VARS=y CONFIG_EFI_ESRT=y CONFIG_EFI_VARS_PSTORE=y CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y CONFIG_EFI_RUNTIME_MAP=y # CONFIG_EFI_FAKE_MEMMAP is not set CONFIG_EFI_RUNTIME_WRAPPERS=y # CONFIG_EFI_BOOTLOADER_CONTROL is not set # CONFIG_EFI_CAPSULE_LOADER is not set CONFIG_UEFI_CPER=y # # File systems # CONFIG_DCACHE_WORD_ACCESS=y CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set CONFIG_EXT4_FS=m CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_ENCRYPTION is not set CONFIG_EXT4_DEBUG=y CONFIG_JBD2=m # CONFIG_JBD2_DEBUG is not set CONFIG_FS_MBCACHE=m # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_XFS_FS=m CONFIG_XFS_QUOTA=y CONFIG_XFS_POSIX_ACL=y # CONFIG_XFS_RT is not set CONFIG_XFS_WARN=y # CONFIG_XFS_DEBUG is not set # CONFIG_GFS2_FS is not set # CONFIG_OCFS2_FS is not set # CONFIG_BTRFS_FS is not set # CONFIG_NILFS2_FS is not set # CONFIG_F2FS_FS is not set CONFIG_FS_DAX=y CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y CONFIG_EXPORTFS_BLOCK_OPS=y CONFIG_FILE_LOCKING=y CONFIG_MANDATORY_FILE_LOCKING=y # CONFIG_FS_ENCRYPTION is not set CONFIG_FSNOTIFY=y CONFIG_DNOTIFY=y CONFIG_INOTIFY_USER=y CONFIG_FANOTIFY=y CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y CONFIG_QUOTA=y CONFIG_QUOTA_NETLINK_INTERFACE=y CONFIG_PRINT_QUOTA_WARNING=y CONFIG_QUOTA_DEBUG=y CONFIG_QUOTA_TREE=y # CONFIG_QFMT_V1 is not set CONFIG_QFMT_V2=y CONFIG_QUOTACTL=y CONFIG_QUOTACTL_COMPAT=y CONFIG_AUTOFS4_FS=y # CONFIG_FUSE_FS is not set # CONFIG_OVERLAY_FS is not set # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # # CONFIG_ISO9660_FS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # # CONFIG_MSDOS_FS is not set # CONFIG_VFAT_FS is not set # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_VMCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_CONFIGFS_FS=y CONFIG_EFIVAR_FS=y CONFIG_MISC_FILESYSTEMS=y # CONFIG_ORANGEFS_FS is not set # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_ECRYPT_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_LOGFS is not set # CONFIG_CRAMFS is not set # CONFIG_SQUASHFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_OMFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_QNX6FS_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_PSTORE=y CONFIG_PSTORE_ZLIB_COMPRESS=y # CONFIG_PSTORE_LZO_COMPRESS is not set # CONFIG_PSTORE_LZ4_COMPRESS is not set # CONFIG_PSTORE_CONSOLE is not set # CONFIG_PSTORE_PMSG is not set # CONFIG_PSTORE_FTRACE is not set # CONFIG_PSTORE_RAM is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y # CONFIG_NFS_FS is not set CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y CONFIG_NFSD_PNFS=y # CONFIG_NFSD_BLOCKLAYOUT is not set CONFIG_NFSD_SCSILAYOUT=y # CONFIG_NFSD_FLEXFILELAYOUT is not set CONFIG_NFSD_V4_SECURITY_LABEL=y CONFIG_NFSD_FAULT_INJECTION=y CONFIG_GRACE_PERIOD=m CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=m CONFIG_NFS_COMMON=y CONFIG_SUNRPC=m CONFIG_SUNRPC_GSS=m CONFIG_SUNRPC_DEBUG=y # CONFIG_CEPH_FS is not set # CONFIG_CIFS is not set # CONFIG_NCP_FS is not set # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=y # CONFIG_NLS_CODEPAGE_737 is not set # CONFIG_NLS_CODEPAGE_775 is not set # CONFIG_NLS_CODEPAGE_850 is not set # CONFIG_NLS_CODEPAGE_852 is not set # CONFIG_NLS_CODEPAGE_855 is not set # CONFIG_NLS_CODEPAGE_857 is not set # CONFIG_NLS_CODEPAGE_860 is not set # CONFIG_NLS_CODEPAGE_861 is not set # CONFIG_NLS_CODEPAGE_862 is not set # CONFIG_NLS_CODEPAGE_863 is not set # CONFIG_NLS_CODEPAGE_864 is not set # CONFIG_NLS_CODEPAGE_865 is not set # CONFIG_NLS_CODEPAGE_866 is not set # CONFIG_NLS_CODEPAGE_869 is not set # CONFIG_NLS_CODEPAGE_936 is not set # CONFIG_NLS_CODEPAGE_950 is not set # CONFIG_NLS_CODEPAGE_932 is not set # CONFIG_NLS_CODEPAGE_949 is not set # CONFIG_NLS_CODEPAGE_874 is not set # CONFIG_NLS_ISO8859_8 is not set # CONFIG_NLS_CODEPAGE_1250 is not set # CONFIG_NLS_CODEPAGE_1251 is not set CONFIG_NLS_ASCII=y # CONFIG_NLS_ISO8859_1 is not set # CONFIG_NLS_ISO8859_2 is not set # CONFIG_NLS_ISO8859_3 is not set # CONFIG_NLS_ISO8859_4 is not set # CONFIG_NLS_ISO8859_5 is not set # CONFIG_NLS_ISO8859_6 is not set # CONFIG_NLS_ISO8859_7 is not set # CONFIG_NLS_ISO8859_9 is not set # CONFIG_NLS_ISO8859_13 is not set # CONFIG_NLS_ISO8859_14 is not set # CONFIG_NLS_ISO8859_15 is not set # CONFIG_NLS_KOI8_R is not set # CONFIG_NLS_KOI8_U is not set # CONFIG_NLS_MAC_ROMAN is not set # CONFIG_NLS_MAC_CELTIC is not set # CONFIG_NLS_MAC_CENTEURO is not set # CONFIG_NLS_MAC_CROATIAN is not set # CONFIG_NLS_MAC_CYRILLIC is not set # CONFIG_NLS_MAC_GAELIC is not set # CONFIG_NLS_MAC_GREEK is not set # CONFIG_NLS_MAC_ICELAND is not set # CONFIG_NLS_MAC_INUIT is not set # CONFIG_NLS_MAC_ROMANIAN is not set # CONFIG_NLS_MAC_TURKISH is not set # CONFIG_NLS_UTF8 is not set # CONFIG_DLM is not set # # Kernel hacking # CONFIG_TRACE_IRQFLAGS_SUPPORT=y # # printk and dmesg options # CONFIG_PRINTK_TIME=y CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 CONFIG_BOOT_PRINTK_DELAY=y CONFIG_DYNAMIC_DEBUG=y # # Compile-time checks and compiler options # CONFIG_DEBUG_INFO=y # CONFIG_DEBUG_INFO_REDUCED is not set # CONFIG_DEBUG_INFO_SPLIT is not set # CONFIG_DEBUG_INFO_DWARF4 is not set # CONFIG_GDB_SCRIPTS is not set # CONFIG_ENABLE_WARN_DEPRECATED is not set CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=2048 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_PAGE_OWNER is not set CONFIG_DEBUG_FS=y CONFIG_HEADERS_CHECK=y CONFIG_DEBUG_SECTION_MISMATCH=y CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # CONFIG_STACK_VALIDATION is not set # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_DEBUG_KERNEL=y # # Memory Debugging # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set CONFIG_DEBUG_OBJECTS=y # CONFIG_DEBUG_OBJECTS_SELFTEST is not set CONFIG_DEBUG_OBJECTS_FREE=y CONFIG_DEBUG_OBJECTS_TIMERS=y CONFIG_DEBUG_OBJECTS_WORK=y CONFIG_DEBUG_OBJECTS_RCU_HEAD=y CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1 # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=20000 # CONFIG_DEBUG_KMEMLEAK_TEST is not set CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y CONFIG_DEBUG_STACK_USAGE=y CONFIG_DEBUG_VM=y # CONFIG_DEBUG_VM_VMACACHE is not set # CONFIG_DEBUG_VM_RB is not set # CONFIG_DEBUG_VM_PGFLAGS is not set # CONFIG_DEBUG_VIRTUAL is not set CONFIG_DEBUG_MEMORY_INIT=y CONFIG_DEBUG_PER_CPU_MAPS=y CONFIG_HAVE_DEBUG_STACKOVERFLOW=y CONFIG_DEBUG_STACKOVERFLOW=y CONFIG_HAVE_ARCH_KMEMCHECK=y CONFIG_HAVE_ARCH_KASAN=y # CONFIG_KASAN is not set CONFIG_ARCH_HAS_KCOV=y # CONFIG_KCOV is not set CONFIG_DEBUG_SHIRQ=y # # Debug Lockups and Hangs # CONFIG_LOCKUP_DETECTOR=y CONFIG_HARDLOCKUP_DETECTOR=y CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=1 # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 # CONFIG_WQ_WATCHDOG is not set # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_SCHED_DEBUG=y CONFIG_SCHED_INFO=y CONFIG_SCHEDSTATS=y # CONFIG_SCHED_STACK_END_CHECK is not set # CONFIG_DEBUG_TIMEKEEPING is not set CONFIG_TIMER_STATS=y # # Lock Debugging (spinlocks, mutexes, etc...) # CONFIG_DEBUG_RT_MUTEXES=y CONFIG_DEBUG_SPINLOCK=y CONFIG_DEBUG_MUTEXES=y # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set CONFIG_DEBUG_LOCK_ALLOC=y CONFIG_PROVE_LOCKING=y CONFIG_LOCKDEP=y CONFIG_LOCK_STAT=y # CONFIG_DEBUG_LOCKDEP is not set CONFIG_DEBUG_ATOMIC_SLEEP=y # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set CONFIG_TRACE_IRQFLAGS=y CONFIG_STACKTRACE=y # CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT_RELEASE is not set CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_LIST=y # CONFIG_DEBUG_PI_LIST is not set CONFIG_DEBUG_SG=y CONFIG_DEBUG_NOTIFIERS=y CONFIG_DEBUG_CREDENTIALS=y # # RCU Debugging # CONFIG_PROVE_RCU=y # CONFIG_PROVE_RCU_REPEATEDLY is not set CONFIG_SPARSE_RCU_POINTER=y # CONFIG_TORTURE_TEST is not set # CONFIG_RCU_PERF_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set # CONFIG_WAKE_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 # CONFIG_RCU_TRACE is not set # CONFIG_RCU_EQS_DEBUG is not set # CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set # CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set # CONFIG_NOTIFIER_ERROR_INJECTION is not set CONFIG_FAULT_INJECTION=y CONFIG_FAILSLAB=y CONFIG_FAIL_PAGE_ALLOC=y CONFIG_FAIL_MAKE_REQUEST=y CONFIG_FAIL_IO_TIMEOUT=y # CONFIG_FAIL_FUTEX is not set CONFIG_FAULT_INJECTION_DEBUG_FS=y CONFIG_LATENCYTOP=y CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set CONFIG_USER_STACKTRACE_SUPPORT=y CONFIG_NOP_TRACER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_FENTRY=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACER_MAX_TRACE=y CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_TRACING=y CONFIG_GENERIC_TRACER=y CONFIG_TRACING_SUPPORT=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_IRQSOFF_TRACER is not set CONFIG_SCHED_TRACER=y CONFIG_FTRACE_SYSCALLS=y CONFIG_TRACER_SNAPSHOT=y # CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set # CONFIG_PROFILE_ALL_BRANCHES is not set CONFIG_STACK_TRACER=y CONFIG_BLK_DEV_IO_TRACE=y CONFIG_KPROBE_EVENT=y CONFIG_UPROBE_EVENT=y CONFIG_PROBE_EVENTS=y CONFIG_DYNAMIC_FTRACE=y CONFIG_DYNAMIC_FTRACE_WITH_REGS=y CONFIG_FUNCTION_PROFILER=y CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set CONFIG_MMIOTRACE=y # CONFIG_HIST_TRIGGERS is not set # CONFIG_MMIOTRACE_TEST is not set # CONFIG_TRACEPOINT_BENCHMARK is not set # CONFIG_RING_BUFFER_BENCHMARK is not set # CONFIG_RING_BUFFER_STARTUP_TEST is not set # CONFIG_TRACE_ENUM_MAP_FILE is not set CONFIG_TRACING_EVENTS_GPIO=y # # Runtime Testing # # CONFIG_LKDTM is not set CONFIG_TEST_LIST_SORT=y # CONFIG_KPROBES_SANITY_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_RBTREE_TEST is not set # CONFIG_INTERVAL_TREE_TEST is not set # CONFIG_PERCPU_TEST is not set CONFIG_ATOMIC64_SELFTEST=y # CONFIG_TEST_HEXDUMP is not set # CONFIG_TEST_STRING_HELPERS is not set CONFIG_TEST_KSTRTOX=y # CONFIG_TEST_PRINTF is not set # CONFIG_TEST_BITMAP is not set # CONFIG_TEST_UUID is not set # CONFIG_TEST_RHASHTABLE is not set # CONFIG_TEST_HASH is not set CONFIG_PROVIDE_OHCI1394_DMA_INIT=y CONFIG_BUILD_DOCSRC=y CONFIG_DMA_API_DEBUG=y # CONFIG_TEST_LKM is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_TEST_FIRMWARE is not set # CONFIG_TEST_UDELAY is not set # CONFIG_MEMTEST is not set # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y CONFIG_KGDB=y CONFIG_KGDB_SERIAL_CONSOLE=y CONFIG_KGDB_TESTS=y # CONFIG_KGDB_TESTS_ON_BOOT is not set CONFIG_KGDB_LOW_LEVEL_TRAP=y CONFIG_KGDB_KDB=y CONFIG_KDB_DEFAULT_ENABLE=0x1 CONFIG_KDB_KEYBOARD=y CONFIG_KDB_CONTINUE_CATASTROPHIC=0 CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set # CONFIG_X86_VERBOSE_BOOTUP is not set CONFIG_EARLY_PRINTK=y CONFIG_EARLY_PRINTK_DBGP=y CONFIG_EARLY_PRINTK_EFI=y CONFIG_X86_PTDUMP_CORE=y CONFIG_X86_PTDUMP=y # CONFIG_EFI_PGT_DUMP is not set # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_WX is not set CONFIG_DEBUG_SET_MODULE_RONX=y # CONFIG_DEBUG_NX_TEST is not set CONFIG_DOUBLEFAULT=y # CONFIG_DEBUG_TLBFLUSH is not set # CONFIG_IOMMU_STRESS is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y CONFIG_X86_DECODER_SELFTEST=y CONFIG_IO_DELAY_TYPE_0X80=0 CONFIG_IO_DELAY_TYPE_0XED=1 CONFIG_IO_DELAY_TYPE_UDELAY=2 CONFIG_IO_DELAY_TYPE_NONE=3 CONFIG_IO_DELAY_0X80=y # CONFIG_IO_DELAY_0XED is not set # CONFIG_IO_DELAY_UDELAY is not set # CONFIG_IO_DELAY_NONE is not set CONFIG_DEFAULT_IO_DELAY_TYPE=0 CONFIG_DEBUG_BOOT_PARAMS=y # CONFIG_CPA_DEBUG is not set CONFIG_OPTIMIZE_INLINING=y # CONFIG_DEBUG_ENTRY is not set # CONFIG_DEBUG_NMI_SELFTEST is not set CONFIG_X86_DEBUG_FPU=y # CONFIG_PUNIT_ATOM_DEBUG is not set # # Security options # CONFIG_KEYS=y CONFIG_PERSISTENT_KEYRINGS=y CONFIG_BIG_KEYS=y CONFIG_TRUSTED_KEYS=y CONFIG_ENCRYPTED_KEYS=y # CONFIG_KEY_DH_OPERATIONS is not set # CONFIG_SECURITY_DMESG_RESTRICT is not set CONFIG_SECURITY=y CONFIG_SECURITYFS=y CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_NETWORK_XFRM=y # CONFIG_SECURITY_PATH is not set CONFIG_INTEL_TXT=y CONFIG_LSM_MMAP_MIN_ADDR=65535 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y CONFIG_HAVE_ARCH_HARDENED_USERCOPY=y # CONFIG_HARDENED_USERCOPY is not set CONFIG_SECURITY_SELINUX=y CONFIG_SECURITY_SELINUX_BOOTPARAM=y CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1 CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_AVC_STATS=y CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 # CONFIG_SECURITY_SMACK is not set # CONFIG_SECURITY_TOMOYO is not set # CONFIG_SECURITY_APPARMOR is not set # CONFIG_SECURITY_LOADPIN is not set # CONFIG_SECURITY_YAMA is not set CONFIG_INTEGRITY=y CONFIG_INTEGRITY_SIGNATURE=y CONFIG_INTEGRITY_ASYMMETRIC_KEYS=y CONFIG_INTEGRITY_TRUSTED_KEYRING=y CONFIG_INTEGRITY_AUDIT=y CONFIG_IMA=y CONFIG_IMA_MEASURE_PCR_IDX=10 CONFIG_IMA_LSM_RULES=y # CONFIG_IMA_TEMPLATE is not set CONFIG_IMA_NG_TEMPLATE=y # CONFIG_IMA_SIG_TEMPLATE is not set CONFIG_IMA_DEFAULT_TEMPLATE="ima-ng" CONFIG_IMA_DEFAULT_HASH_SHA1=y # CONFIG_IMA_DEFAULT_HASH_SHA256 is not set CONFIG_IMA_DEFAULT_HASH="sha1" # CONFIG_IMA_WRITE_POLICY is not set # CONFIG_IMA_READ_POLICY is not set CONFIG_IMA_APPRAISE=y CONFIG_IMA_TRUSTED_KEYRING=y # CONFIG_IMA_BLACKLIST_KEYRING is not set # CONFIG_IMA_LOAD_X509 is not set CONFIG_EVM=y CONFIG_EVM_ATTR_FSUUID=y # CONFIG_EVM_LOAD_X509 is not set CONFIG_DEFAULT_SECURITY_SELINUX=y # CONFIG_DEFAULT_SECURITY_DAC is not set CONFIG_DEFAULT_SECURITY="selinux" CONFIG_CRYPTO=y # # Crypto core or helper # CONFIG_CRYPTO_FIPS=y CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=y CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=y CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=y CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_RNG_DEFAULT=y CONFIG_CRYPTO_AKCIPHER2=y CONFIG_CRYPTO_AKCIPHER=y CONFIG_CRYPTO_KPP2=y CONFIG_CRYPTO_RSA=y # CONFIG_CRYPTO_DH is not set # CONFIG_CRYPTO_ECDH is not set CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set # CONFIG_CRYPTO_GF128MUL is not set CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y # CONFIG_CRYPTO_PCRYPT is not set CONFIG_CRYPTO_WORKQUEUE=y # CONFIG_CRYPTO_CRYPTD is not set # CONFIG_CRYPTO_MCRYPTD is not set # CONFIG_CRYPTO_AUTHENC is not set # CONFIG_CRYPTO_TEST is not set # # Authenticated Encryption with Associated Data # # CONFIG_CRYPTO_CCM is not set # CONFIG_CRYPTO_GCM is not set # CONFIG_CRYPTO_CHACHA20POLY1305 is not set CONFIG_CRYPTO_SEQIV=y # CONFIG_CRYPTO_ECHAINIV is not set # # Block modes # CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CTR=y # CONFIG_CRYPTO_CTS is not set CONFIG_CRYPTO_ECB=y # CONFIG_CRYPTO_LRW is not set # CONFIG_CRYPTO_PCBC is not set # CONFIG_CRYPTO_XTS is not set # CONFIG_CRYPTO_KEYWRAP is not set # # Hash modes # # CONFIG_CRYPTO_CMAC is not set CONFIG_CRYPTO_HMAC=y # CONFIG_CRYPTO_XCBC is not set # CONFIG_CRYPTO_VMAC is not set # # Digest # CONFIG_CRYPTO_CRC32C=y # CONFIG_CRYPTO_CRC32C_INTEL is not set # CONFIG_CRYPTO_CRC32 is not set # CONFIG_CRYPTO_CRC32_PCLMUL is not set CONFIG_CRYPTO_CRCT10DIF=y # CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set # CONFIG_CRYPTO_GHASH is not set # CONFIG_CRYPTO_POLY1305 is not set # CONFIG_CRYPTO_POLY1305_X86_64 is not set # CONFIG_CRYPTO_MD4 is not set CONFIG_CRYPTO_MD5=y # CONFIG_CRYPTO_MICHAEL_MIC is not set # CONFIG_CRYPTO_RMD128 is not set # CONFIG_CRYPTO_RMD160 is not set # CONFIG_CRYPTO_RMD256 is not set # CONFIG_CRYPTO_RMD320 is not set CONFIG_CRYPTO_SHA1=y CONFIG_CRYPTO_SHA1_SSSE3=y CONFIG_CRYPTO_SHA256_SSSE3=y # CONFIG_CRYPTO_SHA512_SSSE3 is not set # CONFIG_CRYPTO_SHA1_MB is not set # CONFIG_CRYPTO_SHA256_MB is not set # CONFIG_CRYPTO_SHA512_MB is not set CONFIG_CRYPTO_SHA256=y # CONFIG_CRYPTO_SHA512 is not set # CONFIG_CRYPTO_SHA3 is not set # CONFIG_CRYPTO_TGR192 is not set # CONFIG_CRYPTO_WP512 is not set # CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=y # CONFIG_CRYPTO_AES_NI_INTEL is not set # CONFIG_CRYPTO_ANUBIS is not set # CONFIG_CRYPTO_ARC4 is not set # CONFIG_CRYPTO_BLOWFISH is not set # CONFIG_CRYPTO_BLOWFISH_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAMELLIA_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set # CONFIG_CRYPTO_CAST5 is not set # CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set # CONFIG_CRYPTO_CAST6 is not set # CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set # CONFIG_CRYPTO_DES is not set # CONFIG_CRYPTO_DES3_EDE_X86_64 is not set # CONFIG_CRYPTO_FCRYPT is not set # CONFIG_CRYPTO_KHAZAD is not set # CONFIG_CRYPTO_SALSA20 is not set # CONFIG_CRYPTO_SALSA20_X86_64 is not set # CONFIG_CRYPTO_CHACHA20 is not set # CONFIG_CRYPTO_CHACHA20_X86_64 is not set # CONFIG_CRYPTO_SEED is not set # CONFIG_CRYPTO_SERPENT is not set # CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set # CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set # CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set # CONFIG_CRYPTO_TEA is not set # CONFIG_CRYPTO_TWOFISH is not set # CONFIG_CRYPTO_TWOFISH_X86_64 is not set # CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set # CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set # # Compression # # CONFIG_CRYPTO_DEFLATE is not set CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_842 is not set # CONFIG_CRYPTO_LZ4 is not set # CONFIG_CRYPTO_LZ4HC is not set # # Random Number Generation # # CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_DRBG_MENU=y CONFIG_CRYPTO_DRBG_HMAC=y CONFIG_CRYPTO_DRBG_HASH=y CONFIG_CRYPTO_DRBG_CTR=y CONFIG_CRYPTO_DRBG=y CONFIG_CRYPTO_JITTERENTROPY=y CONFIG_CRYPTO_USER_API=y CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y # CONFIG_CRYPTO_USER_API_RNG is not set # CONFIG_CRYPTO_USER_API_AEAD is not set CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_PADLOCK is not set # CONFIG_CRYPTO_DEV_CCP is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set # CONFIG_CRYPTO_DEV_QAT_C3XXX is not set # CONFIG_CRYPTO_DEV_QAT_C62X is not set # CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set # CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set # CONFIG_CRYPTO_DEV_QAT_C62XVF is not set CONFIG_ASYMMETRIC_KEY_TYPE=y CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y CONFIG_X509_CERTIFICATE_PARSER=y # CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set CONFIG_PKCS7_MESSAGE_PARSER=y # CONFIG_PKCS7_TEST_KEY is not set CONFIG_SIGNED_PE_FILE_VERIFICATION=y # # Certificates for signature checking # CONFIG_MODULE_SIG_KEY="certs/signing_key.pem" CONFIG_SYSTEM_TRUSTED_KEYRING=y CONFIG_SYSTEM_TRUSTED_KEYS="" # CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set # CONFIG_SECONDARY_TRUSTED_KEYRING is not set # CONFIG_SYSTEM_BLACKLIST_KEYRING is not set CONFIG_HAVE_KVM=y CONFIG_VIRTUALIZATION=y # CONFIG_KVM is not set # CONFIG_VHOST_NET is not set # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set CONFIG_BINARY_PRINTF=y # # Library routines # CONFIG_BITREVERSE=y # CONFIG_HAVE_ARCH_BITREVERSE is not set CONFIG_RATIONAL=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_NET_UTILS=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IOMAP=y CONFIG_GENERIC_IO=y CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y # CONFIG_CRC_ITU_T is not set CONFIG_CRC32=y # CONFIG_CRC32_SELFTEST is not set CONFIG_CRC32_SLICEBY8=y # CONFIG_CRC32_SLICEBY4 is not set # CONFIG_CRC32_SARWATE is not set # CONFIG_CRC32_BIT is not set # CONFIG_CRC7 is not set CONFIG_LIBCRC32C=m # CONFIG_CRC8 is not set # CONFIG_CRC64_ECMA is not set # CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set CONFIG_RANDOM32_SELFTEST=y CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=y CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_LZ4_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y CONFIG_XZ_DEC_BCJ=y # CONFIG_XZ_DEC_TEST is not set CONFIG_DECOMPRESS_GZIP=y CONFIG_DECOMPRESS_BZIP2=y CONFIG_DECOMPRESS_LZMA=y CONFIG_DECOMPRESS_XZ=y CONFIG_DECOMPRESS_LZO=y CONFIG_DECOMPRESS_LZ4=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_RADIX_TREE_MULTIORDER=y CONFIG_ASSOCIATIVE_ARRAY=y CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_CPUMASK_OFFSTACK=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_GLOB=y # CONFIG_GLOB_SELFTEST is not set CONFIG_NLATTR=y CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y CONFIG_CLZ_TAB=y # CONFIG_CORDIC is not set # CONFIG_DDR is not set CONFIG_IRQ_POLL=y CONFIG_MPILIB=y CONFIG_SIGNATURE=y CONFIG_OID_REGISTRY=y CONFIG_UCS2_STRING=y CONFIG_FONT_SUPPORT=y # CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_SG_SPLIT is not set CONFIG_SG_POOL=y CONFIG_ARCH_HAS_SG_CHAIN=y CONFIG_ARCH_HAS_PMEM_API=y CONFIG_ARCH_HAS_MMIO_FLUSH=y --OXfL5xGRrasGEqWY-- From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 04:11:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D289E7CA0 for ; Thu, 25 Aug 2016 04:11:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92523304032 for ; Thu, 25 Aug 2016 02:11:08 -0700 (PDT) X-ASG-Debug-ID: 1472116264-0bf81509b01908d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gMIkAFCmgM9R4ppJ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 02:11:04 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcqgf-0001WL-Lo; Thu, 25 Aug 2016 09:11:01 +0000 Date: Thu, 25 Aug 2016 02:11:01 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/7] xfs: don't perform lookups on zero-height btrees Message-ID: <20160825091101.GA5685@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: don't perform lookups on zero-height btrees References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> <147200547113.15538.538811110514829359.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200547113.15538.538811110514829359.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472116264 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 04:11:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 17F097CA0 for ; Thu, 25 Aug 2016 04:11:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BF7BF304032 for ; Thu, 25 Aug 2016 02:11:20 -0700 (PDT) X-ASG-Debug-ID: 1472116279-0bf8155c751989a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id iWdWEtA6HwaVQPmu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 02:11:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcqgw-0001YJ-0Y; Thu, 25 Aug 2016 09:11:18 +0000 Date: Thu, 25 Aug 2016 02:11:17 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/7] xfs: fix some key handling problems in _btree_simple_query_range Message-ID: <20160825091117.GB5685@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/7] xfs: fix some key handling problems in _btree_simple_query_range References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> <147200547728.15538.10046761968707267924.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200547728.15538.10046761968707267924.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472116279 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 04:11:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DAE7F7CA0 for ; Thu, 25 Aug 2016 04:11:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AD30E304043 for ; Thu, 25 Aug 2016 02:11:31 -0700 (PDT) X-ASG-Debug-ID: 1472116289-0bf57b53141bfc60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 2oC1xF7CSrpvv31V (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 02:11:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcqh6-0001ZG-32; Thu, 25 Aug 2016 09:11:28 +0000 Date: Thu, 25 Aug 2016 02:11:28 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 3/7] xfs: simple btree query range should look right if LE lookup fails Message-ID: <20160825091128.GC5685@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/7] xfs: simple btree query range should look right if LE lookup fails References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> <147200548364.15538.8448801693088924431.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200548364.15538.8448801693088924431.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472116290 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 60 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 04:12:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5F8837CA0 for ; Thu, 25 Aug 2016 04:12:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 321FA304066 for ; Thu, 25 Aug 2016 02:12:17 -0700 (PDT) X-ASG-Debug-ID: 1472116334-0bf57b53111bfed0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id VeGsV2tSBfgDZRbx (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 02:12:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcqho-0001dJ-Td; Thu, 25 Aug 2016 09:12:12 +0000 Date: Thu, 25 Aug 2016 02:12:12 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 4/7] libxcmd: fix mount option parsing to find rt/log devices Message-ID: <20160825091212.GD5685@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/7] libxcmd: fix mount option parsing to find rt/log devices References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> <147200548998.15538.11330546457799095768.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200548998.15538.11330546457799095768.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472116335 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 570 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 23, 2016 at 07:24:50PM -0700, Darrick J. Wong wrote: > It turns out that glibc's hasmntopt implementation returns NULL > if the opt parameter ends with an equals ('='). Therefore, we > cannot directly search for the option 'rtdev='; we must instead > have hasmntopt look for 'rtdev' and look for the trailing equals > sign ourselves. This fixes xfs_info's reporting of external > log and realtime device paths, and xfs_scrub will need it for > data block scrubbing of realtime extents. Looks good, Reviewed-by: Christoph Hellwig From BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 25 04:15:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8AA137CA0 for ; Thu, 25 Aug 2016 04:15:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 08DD9AC003 for ; Thu, 25 Aug 2016 02:14:59 -0700 (PDT) X-ASG-Debug-ID: 1472116493-0bf57b53131c0660001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 6biNYqpUkO9HIBuG (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Thu, 25 Aug 2016 02:14:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+6c187ffeea219fda4259+4750+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcqkO-0002oH-8q; Thu, 25 Aug 2016 09:14:52 +0000 Date: Thu, 25 Aug 2016 02:14:52 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 5/7] misc: fix Coverity errors Message-ID: <20160825091452.GE5685@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/7] misc: fix Coverity errors References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> <147200549633.15538.18051281375686885659.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200549633.15538.18051281375686885659.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472116494 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1324 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Aug 23, 2016 at 07:24:56PM -0700, Darrick J. Wong wrote: > Fix various code sloppinesses pointed out by Coverity. > > Coverity-id: 1371628 - 1371638 > @@ -75,6 +75,7 @@ fsmap( > high.rm_owner = ULLONG_MAX; > high.rm_offset = ULLONG_MAX; > high.rm_flags = XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK | XFS_RMAP_UNWRITTEN; > + high.rm_blockcount = low.rm_blockcount = 0; Do the low initialization near the remaining low fields? or better do a struct initialization ala struct xfs_rmap_irec low = { 0, }; struct xfs_rmap_irec high = { 0, }; that ensures the who;le structure is zero-filled for uninitialized fields. > diff --git a/repair/phase5.c b/repair/phase5.c > index e583879..5a7185c 100644 > --- a/repair/phase5.c > +++ b/repair/phase5.c > @@ -1464,7 +1464,7 @@ prop_rmap_cursor( > * and set the rightsib pointer of current block > */ > #ifdef XR_BLD_INO_TRACE > - fprintf(stderr, " ino prop agbno %d ", lptr->prev_agbno); > + fprintf(stderr, " rmap prop agbno %d ", lptr->prev_agbno); > #endif Did Coveryity really point this out? :) > @@ -1548,6 +1548,7 @@ prop_rmap_highkey( > bt_key->rm_offset = cpu_to_be64( > libxfs_rmap_irec_offset_pack(&high_key)); > > + key.rm_blockcount = 0; should probably be a struct initializer again From jason13@dehuigroup.com Thu Aug 25 04:17:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 608177CA0 for ; Thu, 25 Aug 2016 04:17:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2F1D0304043 for ; Thu, 25 Aug 2016 02:17:51 -0700 (PDT) X-ASG-Debug-ID: 1472116664-0bf57c55b218b910001-NocioJ Received: from dehuigroup.com ([61.156.218.32]) by cuda.sgi.com with SMTP id QImtmQHZFfbu5qG9 for ; Thu, 25 Aug 2016 02:17:45 -0700 (PDT) X-Barracuda-Envelope-From: jason13@dehuigroup.com X-Barracuda-Effective-Source-IP: UNKNOWN[61.156.218.32] X-Barracuda-Apparent-Source-IP: 61.156.218.32 Received: from PC-20150313YEMB[127.0.0.1] by PC-20150313YEMB[127.0.0.1] (SMTPD32); Thu, 25 Aug 2016 17:18:24 +0800 From: "jiachuan2001@163.com" Subject: 280ml silicone sealant To: xfs@oss.sgi.com X-ASG-Orig-Subj: 280ml silicone sealant MIME-Version: 1.0 Sender: jason13@dehuigroup.com Reply-To: jiachuan2001@163.com Date: Thu, 25 Aug 2016 17:18:24 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[61.156.218.32] X-Barracuda-Start-Time: 1472116664 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16672 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32309 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160825091751.C35F91940065@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8+PEhFQUQ+DQo8TUVUQSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNo YXJzZXQ9VVRGLTgiIGh0dHAtZXF1aXY9Y29udGVudC10eXBlPg0KPE1FVEEgbmFtZT1HRU5FUkFU T1IgY29udGVudD0iTVNIVE1MIDExLjAwLjk2MDAuMTg0MjYiPjwvSEVBRD4NCjxCT0RZPjxQUkUg c3R5bGU9IldPUkQtV1JBUDogYnJlYWstd29yZDsgV0hJVEUtU1BBQ0U6IHByZS13cmFwOyBXT1JE LVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBG T05UOiAxNHB4LzIxcHggQXJpYWwsIFZlcmRhbmEsIHNhbnMtc2VyaWY7IFdJRE9XUzogMTsgTEVU VEVSLVNQQUNJTkc6IG5vcm1hbDsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9r ZS13aWR0aDogMHB4IiB3cmFwPSJzb2Z0Ij48UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJ TjogMHB0Ij48Rk9OVCBzaXplPTM+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05U LUZBTUlMWTogQ2FsaWJyaTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1r ZXJuaW5nOiAxLjAwMDBwdCI+RGVhciZuYnNwOyBTaXIvTWFkYW0sPEJSPlRoYW5rIHlvdSBmb3Ig b3BlbmluZyBvdXIgZW1haWwuPEJSPkphc29uIExlZSBmcm9tIERlaHVpIEluZHVzdHJ5IENvLC4g TFREIGlzIHNlcnZpY2luZyBmb3IgeW91LldlIGFyZSBzaWxpY29uZSBzZWFsYW50IGZhY3Rvci55 LjwvU1BBTj48L0ZPTlQ+PC9QPjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQi PjxGT05UIHNpemU9Mz48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZ OiBDYWxpYnJpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0Ij48L1NQQU4+PC9GT05UPiZuYnNwOzwvUD48UCBjbGFzcz1Nc29Ob3JtYWwgc3R5 bGU9Ik1BUkdJTjogMHB0Ij48Rk9OVCBmYWNlPUNhbGlicmk+PEZPTlQgc2l6ZT0zPjxTUEFOIHN0 eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWFzY2lpLWZv bnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpIj48L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTog MTAuNXB0OyBGT05ULUZBTUlMWTog5a6L5L2TOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGli cmk7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWJpZGktZm9udC1mYW1pbHk6 IENhbGlicmkiPjxvOnA+PC9vOnA+PC9TUEFOPjwvRk9OVD48L0ZPTlQ+PC9QPjxQIGNsYXNzPU1z b05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQiPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEwLjVw dDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxvOnA+PEZPTlQgc2l6ZT0zPiZuYnNwOzxGT05UIGNv bG9yPSNmZjAwMDA+T3VyIHNhbXBsZSBpcyBmcmVlLCBNYXggNSBwY3MuPC9GT05UPjwvRk9OVD48 L286cD48L1NQQU4+PC9QPjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQiPjxG T05UIHNpemU9Mz48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBD YWxpYnJpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEu MDAwMHB0Ij48L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlM WTogQ2FsaWJyaTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAxLjAwMDBwdCI+PG86cD48L286cD48L1NQQU4+PC9GT05UPiZuYnNwOzwvUD48UCBjbGFzcz1N c29Ob3JtYWwgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMHB0Ij48U1BBTj48Rk9O VCBzaXplPTM+PEZPTlQgY29sb3I9I2ZmMDAwMD5Db21tb2RpdC55IERldGFpbHM6PC9GT05UPjxC Uj48L0ZPTlQ+PC9TUEFOPjxGT05UIHNpemU9Mz48U1BBTj4xLVByb2R1Y3Q6R1Agc2lsaWNvbmUg c2VhbGFudDxCUj48L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1J TFk6IENhbGlicmk7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiDlubzlnIYiPjItQnJhbmQvQ29kZTpEZWh1aTwvU1BBTj48L0ZPTlQ+PFNQQU4gc3R5bGU9IkZP TlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IEZPTlQtV0VJR0hUOiBub3JtYWw7 IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlubzlnIYiPjxCUj48L1NQQU4+PFNQQU4gc3R5bGU9 IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IEZPTlQtV0VJR0hUOiBub3Jt YWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAw cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPjMtQ0FTIE5vLjo2MzE0OC01Mi03 PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJp OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1m b250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48 QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxp YnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T Ij40LU1haW4gUmF3IE1hdGVyaWFsOlNpbGljb25lPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJ WkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05U LVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj41LTwvU1BBTj48U1BBTiBzdHlsZT0iRk9O VC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW5vOWchiI+U2tpbiB0aW1lOiA0LTggbWludWV0czwv U1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsg Rk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PEJS PjwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJy aTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t Zm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+ Ni1NYWluIEFwcGxpY2F0aW9uOkdlbmVyYWwgUHVycG9zZSBHbGF6aW5nIHdlYXRoZXIgc2VhbGlu ZyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtSb29maW5nIGFu ZCBHdXR0ZXJzICZuYnNwO1JhaW53YXRlciBUYW5rcyBFbGVjdHJpY2FsIFNlYWxpbmcgYW5kIElu c3VsYXRpb24gJm5ic3A7Jm5ic3A7QXV0b21vdGl2ZTwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1T SVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PEJSPjwvU1BBTj48U1BBTiBzdHlsZT0iRk9O VC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+Ny1Db2xvcnM6d2hpdGUsYmxhY2ssdHJh bnNwYXJlbnQgb3IgYXMgcmVxdWVzdGVkPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEy cHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFz dC1mb250LWZhbWlseTog5a6L5L2TIj48QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6 IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj44LVNoZWxmIGxpZmU6MTIgbW9udGhzPC9TUEFOPjxT UEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdF SUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5p bmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48QlI+PC9TUEFO PjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05U LVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj45PC9TUEFO PjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZB TUlMWTog5a6L5L2TOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tYXNjaWktZm9udC1mYW1pbHk6 IENhbGlicmk7IG1zby1oYW5zaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWJpZGktZm9udC1m YW1pbHk6IENhbGlicmkiPi08L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9O VC1GQU1JTFk6IENhbGlicmk7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZMiPkNlcnRpZmljYXRlOiBTR1MsSVNPLFRVVjwvU1BBTj48U1BBTiBzdHls ZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5v cm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+ PC9GT05UPjwvUD48UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1B UkdJTjogNXB0IDBwdDsgVEVYVC1BVVRPU1BBQ0U6IGlkZW9ncmFwaC1udW1lcmljOyBURVhULUlO REVOVDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tcGFyYS1tYXJnaW4t cmlnaHQ6IDAuMDAwMGdkOyBtc28tcGFyYS1tYXJnaW4tbGVmdDogMC4wMDAwZ2Q7IG1zby1tYXJn aW4tdG9wLWFsdDogYXV0bzsgbXNvLW1hcmdpbi1ib3R0b20tYWx0OiBhdXRvOyBtc28tY2hhci1p bmRlbnQtY291bnQ6IDAuMDAwMDsgbXNvLW91dGxpbmUtbGV2ZWw6IDQ7IG1zby1saW5lLWhlaWdo dC1hbHQ6IDBwdCI+PEZPTlQgc2l6ZT0zPjxTUEFOPjxGT05UIGNvbG9yPSNmZjAwMDA+Q29tbWVy Y2lhbCBEZXRhaWxzOjwvRk9OVD48QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEy cHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFz dC1mb250LWZhbWlseTog5bm85ZyGIj4xPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEy cHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFz dC1mb250LWZhbWlseTog5bm85ZyGIj4tUHJvZHVjdDpzaWxpY29uZSBzZWFsYW50PC9TUEFOPjwv Rk9OVD48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsg Rk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9u dC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW5vOWchiI+PEJS PjwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJy aTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t Zm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW5vOWchiI+ Mi1IUyBDb2RlOjwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxNHB0OyBGT05ULUZBTUlM WTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PEZPTlQgc2l6ZT0zPjM1MDYxMDAwMTA8 L0ZPTlQ+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDE0cHQ7IEZPTlQtRkFNSUxZOiBD YWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05U LVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj4zLVBhY2thZ2U6PC9TUEFOPjxTUEFOIHN0 eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDog bm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAu MDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj4zMDBtbC9DYXJ0cmlkZ2Us PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJp OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1m b250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj4y NCBjYXJ0cmlkZ2VzL2NhcnRvbjwvU1BBTj48Rk9OVCBmYWNlPUNhbGlicmk+PFNQQU4gc3R5bGU9 IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgRk9OVC1XRUlHSFQ6IG5vcm1h bDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBw dDsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktZm9udC1mYW1pbHk6 IENhbGlicmk7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpIj4mbmJzcDtib3g8L1NQQU4+ PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IEZPTlQt V0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2Vy bmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPiZuYnNwO++8 jCZuYnNwOyZuYnNwOzwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZB TUlMWTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3ll cyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOWui+S9kyI+Jm5ic3A7PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZP TlQtRkFNSUxZOiDlrovkvZM7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1hc2NpaS1mb250LWZh bWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tYmlkaS1m b250LWZhbWlseTogQ2FsaWJyaSI+NjA8L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTJw dDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZMiPjBtbC9zYXVzYWdlLCAyMHNhdXNhZ2VzL2NhcnRvbiBib3g8 L1NQQU4+PC9GT05UPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBD YWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TIj48QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZ OiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TIj40LUNhcnRvbiBCb3ggc2l6ZTozMDB4MjAweDIzNW1tPC9TUEFOPjxTUEFOIHN0eWxl PSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9y bWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAw MHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48QlI+PC9TUEFOPjxTUEFOIHN0 eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDog bm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAu MDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj41LUxvYWQgUXVhbnRpdHk6 PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJp OyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1m b250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48 QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxp YnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T Ij4zMDBtbDoxOTAwIGNhcnRvbnMvMjBmdCB3aXRob3V0IHBhbGxldHM7MTYwMCBjYXJ0b25zIHdp dGggcGFsbGV0cyA8L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1J TFk6IENhbGlicmk7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiDlrovkvZMiPjxCUj48L1NQQU4+PEZPTlQgZmFjZT1DYWxpYnJpPjxTUEFOIHN0eWxlPSJGT05U LVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiDlrovkvZM7IEZPTlQtV0VJR0hUOiBub3JtYWw7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1z by1hc2NpaS1mb250LWZhbWlseTogQ2FsaWJyaTsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBDYWxp YnJpOyBtc28tYmlkaS1mb250LWZhbWlseTogQ2FsaWJyaSI+NjA8L1NQQU4+PFNQQU4gc3R5bGU9 IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IEZPTlQtV0VJR0hUOiBub3Jt YWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAw cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPjBtbDoxNTAwIGNhcnRvbnMvMjBm dCB3aXRob3V0IHBhbGxldHM7MTEwMCBjYXJ0b25zIHdpdGggcGFsbGV0cyA8L1NQQU4+PC9GT05U PjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05U LVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48QlI+PC9T UEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBG T05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj5EcnVt IDoyMDBML2RydW0sNzUgZHJ1bXMvMjBmdDwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAx MnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNl cnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PEJSPjwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpF OiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOW5vOWchiI+NjwvU1BBTj48Rk9OVCBmYWNlPUNhbGlicmk+PFNQ QU4gc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IOW5vOWchjsgRk9OVC1XRUlH SFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAwLjAwMDBwdDsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28taGFuc2ktZm9u dC1mYW1pbHk6IENhbGlicmk7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiBDYWxpYnJpIj4tPC9TUEFO PjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05U LVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj5NT1E6IE5v PC9TUEFOPjwvRk9OVD48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog Q2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW5 vOWchiI+PEJSPjwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlM WTogQ2FsaWJyaTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOW5vOWchiI+Ny1EZWxpdmVyeTo1IGRheXMgZm9yIHRyaWFsIG9yZGVyIHdpdGhvdXQgcHJpbnRp bmcsMTUgZGF5cyBmb3IgcHJpbnRpbmcgZGVzaWduPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJ WkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj48QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05U LVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj44LVNlcnZpY2U6T0VNLEZyZWUgbG9nbyBk ZXNpZ24gYmFzZWQgb24gMTAwIGNhcnRvbnMuPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6 IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj48QlI+PC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJ WkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj45LUxvYWRpbmcgUG9ydDpRaW5nZGFvPC9TUEFO PjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05U LVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj48QlI+PC9T UEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBG T05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj4xMC1Q YXltZW50OlQvVCxMQyxXZXN0ZXJuIFVuaW9uPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6 IDEycHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBGT05ULVdFSUdIVDogbm9ybWFsOyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5bm85ZyGIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+PFAgY2xhc3M9 TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBwdCI+PEZPTlQgc2l6ZT0zPjxTUEFOIHN0eWxlPSJG T05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPkZvciBtb3JlIGRldGFpbHM8 L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQ2FsaWJy aTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dCI+LDwvU1BBTj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBD YWxpYnJpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEu MDAwMHB0Ij5vbiA8L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZB TUlMWTogQ2FsaWJyaTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJu aW5nOiAxLjAwMDBwdCI+U2t5cGU8L1NQQU4+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0 OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t Zm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+Jm5ic3A7b3IgPC9TUEFOPjxTUEFOIHN0eWxlPSJGT05U LVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPndoYXRzIGFwcDwvU1BBTj48U1BB TiBzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBtc28tc3Bh Y2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij4uIGRvIG5v dCBoZXNpdGF0ZSB0byBjb250YWN0IG1lLDE4IGhvdXJzIG9ubGluZSBldmVyeWRheSE8L1NQQU4+ PC9GT05UPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IENhbGli cmk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAw cHQiPjxCUj48L1NQQU4+PEZPTlQgc2l6ZT0zPjxTUEFOIHN0eWxlPSJGT05ULVNJWkU6IDEwLjVw dDsgRk9OVC1GQU1JTFk6IENhbGlicmk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZvbnQta2VybmluZzogMS4wMDAwcHQiPkJlc3QgUmVnYXJkczwvU1BBTj48L0ZPTlQ+PC9QPjxQ IGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQiPjxGT05UIHNpemU9Mz48U1BBTiBz dHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij5KYXNvbjwvU1BB Tj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48 bzpwPjwvbzpwPjwvU1BBTj48L0ZPTlQ+PC9QPjwhLS1FbmRGcmFnbWVudC0tPjwvUFJFPg0KPFA+ PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQt V0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDI1NSkiPjxvOnA+PFNQQU4+PFNQQU4gDQpz dHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgQ09MT1I6IHJnYigy NTUsMTAyLDApIj48SU1HIA0Kc3R5bGU9IkhFSUdIVDogOTNweDsgV0lEVEg6IDk5cHgiIHNyYz0i aHR0cDovL3d3dy5wZXRmaWxtY2hpbmEuY29tL2xvZ28uanBnIiANCndpZHRoPTIxMyBoZWlnaHQ9 MTk4PjwvU1BBTj48L1NQQU4+PC9vOnA+PC9TUEFOPjwvUD4NCjxESVYgDQpzdHlsZT0iV0hJVEUt U1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBD T0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTRweC8yMXB4IEFyaWFsLFZlcmRhbmEsc2Fucy1zZXJp ZjsgV0lET1dTOiAxOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyAt d2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTog MTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdi KDAsMCwyNTUpIj48bzpwPjxTUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9O VC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiByZ2IoMjU1LDEwMiwwKSI+SmFzb24gDQpMZWUvPEZP TlQgY29sb3I9IzAwMDBmMD5BY2NvdW50IE1hbmFnZXI8L0ZPTlQ+PEJSPkRlaHVpIEluZHVzdHJ5 IENvbXBhbnkgDQpMaW1pdGVkPEJSPkNlbGwvV2hhdHNhcHA8Rk9OVCBjb2xvcj0jMDAwMGYwPjor ODYgMTgxIDA1NCANCjY3ODkwPC9GT05UPiZuYnNwOyZuYnNwOyBTa3lwZTo8Rk9OVCANCmNvbG9y PSMwMDAwZjA+d29vZG1hbjcxODwvRk9OVD48QlI+VGVsOjxTUEFOIA0KY2xhc3M9QXBwbGUtY29u dmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48Rk9OVCBjb2xvcj0jMDAwMGYwPis4NiANCjU0NjYz OTIzMDY8L0ZPTlQ+PC9TUEFOPjwvU1BBTj48L286cD48L1NQQU4+PC9ESVY+DQo8UD48QlIgY2xh c3M9QXBwbGUtaW50ZXJjaGFuZ2UtbmV3bGluZT48Rk9OVCANCmZhY2U9Q2FsaWJyaT4mbmJzcDs8 L0ZPTlQ+PC9QPjwvQk9EWT48L0hUTUw+DQoNCg== From bfoster@redhat.com Thu Aug 25 07:38:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 31D367CA0 for ; Thu, 25 Aug 2016 07:38:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD29330405F for ; Thu, 25 Aug 2016 05:38:03 -0700 (PDT) X-ASG-Debug-ID: 1472128682-0bf81509b01a7b80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wnGbHh4A9CIhGX6e (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 05:38:02 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 018D761E77; Thu, 25 Aug 2016 12:38:02 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7PCc15i025962; Thu, 25 Aug 2016 08:38:01 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E33951208AB; Thu, 25 Aug 2016 08:38:00 -0400 (EDT) Date: Thu, 25 Aug 2016 08:38:00 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: move xfs_bmbt_to_iomap up Message-ID: <20160825123800.GA25041@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: move xfs_bmbt_to_iomap up References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-2-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471816273-28940-2-git-send-email-hch@lst.de> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 25 Aug 2016 12:38:02 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472128682 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2727 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 21, 2016 at 11:51:10PM +0200, Christoph Hellwig wrote: > We'll need it earlier in the file soon, so the unchanged function to the > top of xfs_iomap.c > > Signed-off-by: Christoph Hellwig > --- Reviewed-by: Brian Foster > fs/xfs/xfs_iomap.c | 52 ++++++++++++++++++++++++++-------------------------- > 1 file changed, 26 insertions(+), 26 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 2af0dda..ba3592f 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -44,6 +44,32 @@ > << mp->m_writeio_log) > #define XFS_WRITE_IMAPS XFS_BMAP_MAX_NMAP > > +void > +xfs_bmbt_to_iomap( > + struct xfs_inode *ip, > + struct iomap *iomap, > + struct xfs_bmbt_irec *imap) > +{ > + struct xfs_mount *mp = ip->i_mount; > + > + if (imap->br_startblock == HOLESTARTBLOCK) { > + iomap->blkno = IOMAP_NULL_BLOCK; > + iomap->type = IOMAP_HOLE; > + } else if (imap->br_startblock == DELAYSTARTBLOCK) { > + iomap->blkno = IOMAP_NULL_BLOCK; > + iomap->type = IOMAP_DELALLOC; > + } else { > + iomap->blkno = xfs_fsb_to_db(ip, imap->br_startblock); > + if (imap->br_state == XFS_EXT_UNWRITTEN) > + iomap->type = IOMAP_UNWRITTEN; > + else > + iomap->type = IOMAP_MAPPED; > + } > + iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); > + iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); > + iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip)); > +} > + > STATIC int > xfs_iomap_eof_align_last_fsb( > xfs_mount_t *mp, > @@ -947,32 +973,6 @@ error_on_bmapi_transaction: > return error; > } > > -void > -xfs_bmbt_to_iomap( > - struct xfs_inode *ip, > - struct iomap *iomap, > - struct xfs_bmbt_irec *imap) > -{ > - struct xfs_mount *mp = ip->i_mount; > - > - if (imap->br_startblock == HOLESTARTBLOCK) { > - iomap->blkno = IOMAP_NULL_BLOCK; > - iomap->type = IOMAP_HOLE; > - } else if (imap->br_startblock == DELAYSTARTBLOCK) { > - iomap->blkno = IOMAP_NULL_BLOCK; > - iomap->type = IOMAP_DELALLOC; > - } else { > - iomap->blkno = xfs_fsb_to_db(ip, imap->br_startblock); > - if (imap->br_state == XFS_EXT_UNWRITTEN) > - iomap->type = IOMAP_UNWRITTEN; > - else > - iomap->type = IOMAP_MAPPED; > - } > - iomap->offset = XFS_FSB_TO_B(mp, imap->br_startoff); > - iomap->length = XFS_FSB_TO_B(mp, imap->br_blockcount); > - iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip)); > -} > - > static inline bool imap_needs_alloc(struct xfs_bmbt_irec *imap, int nimaps) > { > return !nimaps || > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Aug 25 07:38:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9725B7CA4 for ; Thu, 25 Aug 2016 07:38:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3281D8F8033 for ; Thu, 25 Aug 2016 05:38:07 -0700 (PDT) X-ASG-Debug-ID: 1472128685-0bf81509b01a7b90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3qhHxTKxWRI5L3TD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 05:38:06 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CE7E3C0567A1; Thu, 25 Aug 2016 12:38:05 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7PCc5ZJ019994; Thu, 25 Aug 2016 08:38:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DF7381208AB; Thu, 25 Aug 2016 08:38:04 -0400 (EDT) Date: Thu, 25 Aug 2016 08:38:04 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: factor our a helper to calculate the EOF alignment Message-ID: <20160825123804.GB25041@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: factor our a helper to calculate the EOF alignment References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-3-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471816273-28940-3-git-send-email-hch@lst.de> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 25 Aug 2016 12:38:05 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472128686 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2358 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 21, 2016 at 11:51:11PM +0200, Christoph Hellwig wrote: > And drop the pointless mp argument to xfs_iomap_eof_align_last_fsb, > while we're at it. > > Signed-off-by: Christoph Hellwig > --- Reviewed-by: Brian Foster > fs/xfs/xfs_iomap.c | 31 +++++++++++++++++++++---------- > 1 file changed, 21 insertions(+), 10 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index ba3592f..918511a 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -70,15 +70,13 @@ xfs_bmbt_to_iomap( > iomap->bdev = xfs_find_bdev_for_inode(VFS_I(ip)); > } > > -STATIC int > -xfs_iomap_eof_align_last_fsb( > - xfs_mount_t *mp, > - xfs_inode_t *ip, > - xfs_extlen_t extsize, > - xfs_fileoff_t *last_fsb) > +static xfs_extlen_t > +xfs_eof_alignment( > + struct xfs_inode *ip, > + xfs_extlen_t extsize) > { > - xfs_extlen_t align = 0; > - int eof, error; > + struct xfs_mount *mp = ip->i_mount; > + xfs_extlen_t align = 0; > > if (!XFS_IS_REALTIME_INODE(ip)) { > /* > @@ -109,8 +107,21 @@ xfs_iomap_eof_align_last_fsb( > align = extsize; > } > > + return align; > +} > + > +STATIC int > +xfs_iomap_eof_align_last_fsb( > + struct xfs_inode *ip, > + xfs_extlen_t extsize, > + xfs_fileoff_t *last_fsb) > +{ > + xfs_extlen_t align = xfs_eof_alignment(ip, extsize); > + > if (align) { > xfs_fileoff_t new_last_fsb = roundup_64(*last_fsb, align); > + int eof, error; > + > error = xfs_bmap_eof(ip, new_last_fsb, XFS_DATA_FORK, &eof); > if (error) > return error; > @@ -180,7 +191,7 @@ xfs_iomap_write_direct( > */ > ASSERT(XFS_IFORK_PTR(ip, XFS_DATA_FORK)->if_flags & > XFS_IFEXTENTS); > - error = xfs_iomap_eof_align_last_fsb(mp, ip, extsz, &last_fsb); > + error = xfs_iomap_eof_align_last_fsb(ip, extsz, &last_fsb); > if (error) > goto out_unlock; > } else { > @@ -638,7 +649,7 @@ retry: > } > > if (prealloc || extsz) { > - error = xfs_iomap_eof_align_last_fsb(mp, ip, extsz, &last_fsb); > + error = xfs_iomap_eof_align_last_fsb(ip, extsz, &last_fsb); > if (error) > return error; > } > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Aug 25 07:38:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 499577CA4 for ; Thu, 25 Aug 2016 07:38:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0487130405F for ; Thu, 25 Aug 2016 05:38:12 -0700 (PDT) X-ASG-Debug-ID: 1472128690-0bf57b53141d65d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CZb9Wz2kGacAUlT6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 05:38:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2DA3C340763; Thu, 25 Aug 2016 12:38:10 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7PCc9ES026041; Thu, 25 Aug 2016 08:38:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3F0671208AB; Thu, 25 Aug 2016 08:38:09 -0400 (EDT) Date: Thu, 25 Aug 2016 08:38:09 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case Message-ID: <20160825123808.GC25041@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-4-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471816273-28940-4-git-send-email-hch@lst.de> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 25 Aug 2016 12:38:10 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472128690 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2756 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 21, 2016 at 11:51:12PM +0200, Christoph Hellwig wrote: > For long growing file writes we will usually already have the eofblocks > tag set when adding more speculative preallocations. Add a flag in the > inode to allow us to skip the the fairly expensive AG-wide spinlocks > and multiple radix tree operations in that case. > > Signed-off-by: Christoph Hellwig > --- > fs/xfs/xfs_icache.c | 14 ++++++++++++++ > fs/xfs/xfs_inode.h | 1 + > 2 files changed, 15 insertions(+) > > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index fb39a66..65b2e3f 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -1414,6 +1414,16 @@ xfs_inode_set_eofblocks_tag( > struct xfs_perag *pag; > int tagged; > > + /* > + * Don't bother locking the AG and looking up in the radix trees > + * if we already know that we have the tag set. > + */ > + if (ip->i_flags & XFS_IEOFBLOCKS) > + return; > + spin_lock(&ip->i_flags_lock); > + ip->i_flags |= XFS_IEOFBLOCKS; > + spin_unlock(&ip->i_flags_lock); > + I'm guessing the lockless check is intentional, but is that really necessary? E.g., it doesn't seem like using ->i_flags_lock unconditionally should affect performance in the way the AG lock or radix tree work does, particularly since we're already holding IOLOCK_EXCL in the current implementation. I could be wrong, but FWIW, we do already have xfs_iflags_test_and_set() sitting around as well... Brian > pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > spin_lock(&pag->pag_ici_lock); > trace_xfs_inode_set_eofblocks_tag(ip); > @@ -1449,6 +1459,10 @@ xfs_inode_clear_eofblocks_tag( > struct xfs_mount *mp = ip->i_mount; > struct xfs_perag *pag; > > + spin_lock(&ip->i_flags_lock); > + ip->i_flags &= ~XFS_IEOFBLOCKS; > + spin_unlock(&ip->i_flags_lock); > + > pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > spin_lock(&pag->pag_ici_lock); > trace_xfs_inode_clear_eofblocks_tag(ip); > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index e1a411e..8f30d25 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -216,6 +216,7 @@ xfs_get_initial_prid(struct xfs_inode *dp) > #define __XFS_IPINNED_BIT 8 /* wakeup key for zero pin count */ > #define XFS_IPINNED (1 << __XFS_IPINNED_BIT) > #define XFS_IDONTCACHE (1 << 9) /* don't cache the inode long term */ > +#define XFS_IEOFBLOCKS (1 << 10)/* has the preallocblocks tag set */ > > /* > * Per-lifetime flags need to be reset when re-using a reclaimable inode during > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Aug 25 09:37:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BFEBB7CA0 for ; Thu, 25 Aug 2016 09:37:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8DFBD304051 for ; Thu, 25 Aug 2016 07:37:12 -0700 (PDT) X-ASG-Debug-ID: 1472135830-0bf57b53111e2810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 34TAy5KEpOtnIwO5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 07:37:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 55D8F4E4E8; Thu, 25 Aug 2016 14:37:10 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7PEb9Pf012001; Thu, 25 Aug 2016 10:37:10 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4BB5D1208AB; Thu, 25 Aug 2016 10:37:09 -0400 (EDT) Date: Thu, 25 Aug 2016 10:37:09 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path Message-ID: <20160825143708.GD25041@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-5-git-send-email-hch@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1471816273-28940-5-git-send-email-hch@lst.de> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 25 Aug 2016 14:37:10 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472135831 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8263 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 21, 2016 at 11:51:13PM +0200, Christoph Hellwig wrote: > Currently xfs_iomap_write_delay does up to lookups in the inode extent > tree, which is rather costly especially with the new iomap based > write path and small write sizes. > > But it turns out that the low-level xfs_bmap_search_extents gives us all > the information we need in the regular delalloc buffered write path: > > - it will return us an extent covering the block we are looking up if > it exists. In that case we can simply return that extent to the > caller and are done > - it will tell us if we are beyoned the last current allocated block > with an eof return parameter. In that case we can create a delalloc > reservation and use the also returned information about the last > extent in the file as the hint to size our delalloc reservation. > - it can tell us that we are writing into a hole, but that there is > an extent beyoned this hole. In this case we can create a delalloc > reservation that covers the requested size (possible capped to the > next existing allocation). > > All that can be done in one single routine instead of bouncing up > and down a few layers. This reduced the CPU overhead of the block > mapping routines and also simplified the code a lot. > On just skimming over this so far, I feel like this should be at least two patches, possibly 3: - Kill xfs_bmapi_delay() and pull up associated bits to iomap(). - Possibly separate out the part that moves iteration from the (former) xfs_bmapi_delay() code up to the iomap code, if we can do so cleanly. - Refactor/rework the preallocate logic. With regard to the latter... > Signed-off-by: Christoph Hellwig > --- > fs/xfs/libxfs/xfs_bmap.c | 89 +---------- > fs/xfs/libxfs/xfs_bmap.h | 10 +- > fs/xfs/xfs_iomap.c | 381 ++++++++++++++++++++--------------------------- > fs/xfs/xfs_iomap.h | 2 - > 4 files changed, 169 insertions(+), 313 deletions(-) > ... > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 918511a..2b449f5 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c ... > @@ -587,120 +480,167 @@ xfs_iomap_prealloc_size( ... > -int > -xfs_iomap_write_delay( > - xfs_inode_t *ip, > - xfs_off_t offset, > - size_t count, > - xfs_bmbt_irec_t *ret_imap) > +static int > +xfs_file_iomap_begin_delay( > + struct inode *inode, > + loff_t offset, > + loff_t count, > + unsigned flags, > + struct iomap *iomap) > { ... > + /* > + * If we are doing a write at the end of the file and there are no > + * allocations past this one, then extend the allocation out to the > + * file system's write iosize. > + * > + * As an exception we don't do any preallocation at all if the file > + * is smaller than the minimum preallocation and we are using the > + * default dynamic preallocation scheme, as it is likely this is the > + * only write to the file that is going to be done. > + * > + * We clean up any extra space left over when the file is closed in > + * xfs_inactive(). > + */ > + if (eof && offset + count > XFS_ISIZE(ip) && > + ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || > + XFS_ISIZE(ip) >= XFS_FSB_TO_B(mp, mp->m_writeio_blocks))) { > + xfs_fsblock_t alloc_blocks; > + xfs_off_t aligned_offset; > + xfs_extlen_t align; > + > + /* > + * If an explicit allocsize is set, the file is small, or we > + * are writing behind a hole, then use the minimum prealloc: > + */ > + if ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || > + XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_dalign) || > + idx == 0 || > + prev.br_startoff + prev.br_blockcount < offset_fsb) > + alloc_blocks = mp->m_writeio_blocks; > + else > + alloc_blocks = > + xfs_iomap_prealloc_size(ip, offset, &prev); > + > + aligned_offset = XFS_WRITEIO_ALIGN(mp, offset + count - 1); > + end_fsb = XFS_B_TO_FSBT(mp, aligned_offset) + alloc_blocks; > + > + align = xfs_eof_alignment(ip, 0); > + if (align) > + end_fsb = roundup_64(end_fsb, align); > > - ASSERT(last_fsb > offset_fsb); > + end_fsb = min(end_fsb, maxbytes_fsb); > + ASSERT(end_fsb > offset_fsb); > + } I'm not necessarily against cleaning up/reworking the prealloc bits, but I'm not a huge fan of open coding all of this here in the iomap function. If nothing else, the indentation starts to make my eyes cross... could we retain one level of abstraction here for this hunk of logic that updates end_fsb? Brian > > - nimaps = XFS_WRITE_IMAPS; > - error = xfs_bmapi_delay(ip, offset_fsb, last_fsb - offset_fsb, > - imap, &nimaps, XFS_BMAPI_ENTIRE); > +retry: > + error = xfs_bmapi_reserve_delalloc(ip, offset_fsb, > + end_fsb - offset_fsb, &got, > + &prev, &idx, eof); > switch (error) { > case 0: > + break; > case -ENOSPC: > case -EDQUOT: > - break; > - default: > - return error; > - } > - > - /* > - * If bmapi returned us nothing, we got either ENOSPC or EDQUOT. Retry > - * without EOF preallocation. > - */ > - if (nimaps == 0) { > + /* retry without any preallocation */ > trace_xfs_delalloc_enospc(ip, offset, count); > - if (prealloc) { > - prealloc = 0; > - error = 0; > + if (end_fsb != orig_end_fsb) { > + end_fsb = orig_end_fsb; > goto retry; > } > - return error ? error : -ENOSPC; > + /*FALLTHRU*/ > + default: > + goto out_unlock; > } > > - if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) > - return xfs_alert_fsblock_zero(ip, &imap[0]); > - > /* > * Tag the inode as speculatively preallocated so we can reclaim this > * space on demand, if necessary. > */ > - if (prealloc) > + if (end_fsb != orig_end_fsb) > xfs_inode_set_eofblocks_tag(ip); > > - *ret_imap = imap[0]; > - return 0; > + trace_xfs_iomap_alloc(ip, offset, count, 0, &got); > +done: > + if (isnullstartblock(got.br_startblock)) > + got.br_startblock = DELAYSTARTBLOCK; > + > + if (!got.br_startblock) { > + error = xfs_alert_fsblock_zero(ip, &got); > + if (error) > + goto out_unlock; > + } > + > + xfs_bmbt_to_iomap(ip, iomap, &got); > + > +out_unlock: > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return error; > } > > /* > @@ -1008,6 +948,11 @@ xfs_file_iomap_begin( > if (XFS_FORCED_SHUTDOWN(mp)) > return -EIO; > > + if ((flags & IOMAP_WRITE) && !xfs_get_extsz_hint(ip)) { > + return xfs_file_iomap_begin_delay(inode, offset, length, flags, > + iomap); > + } > + > xfs_ilock(ip, XFS_ILOCK_EXCL); > > ASSERT(offset <= mp->m_super->s_maxbytes); > @@ -1035,19 +980,13 @@ xfs_file_iomap_begin( > * the lower level functions are updated. > */ > length = min_t(loff_t, length, 1024 * PAGE_SIZE); > - if (xfs_get_extsz_hint(ip)) { > - /* > - * xfs_iomap_write_direct() expects the shared lock. It > - * is unlocked on return. > - */ > - xfs_ilock_demote(ip, XFS_ILOCK_EXCL); > - error = xfs_iomap_write_direct(ip, offset, length, &imap, > - nimaps); > - } else { > - error = xfs_iomap_write_delay(ip, offset, length, &imap); > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > - } > - > + /* > + * xfs_iomap_write_direct() expects the shared lock. It > + * is unlocked on return. > + */ > + xfs_ilock_demote(ip, XFS_ILOCK_EXCL); > + error = xfs_iomap_write_direct(ip, offset, length, &imap, > + nimaps); > if (error) > return error; > > diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h > index fb8aca3..6498be4 100644 > --- a/fs/xfs/xfs_iomap.h > +++ b/fs/xfs/xfs_iomap.h > @@ -25,8 +25,6 @@ struct xfs_bmbt_irec; > > int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, > struct xfs_bmbt_irec *, int); > -int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, > - struct xfs_bmbt_irec *); > int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, > struct xfs_bmbt_irec *); > int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); > -- > 2.1.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Thu Aug 25 11:30:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9D6767CA0 for ; Thu, 25 Aug 2016 11:30:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E7BE304039 for ; Thu, 25 Aug 2016 09:30:40 -0700 (PDT) X-ASG-Debug-ID: 1472142637-0bf57c55b21ac1c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5MBbea8OR0EAzJEj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 09:30:38 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PGUA8M032642 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 16:30:10 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PGUA4k026233 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 16:30:10 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PGU9gZ009539; Thu, 25 Aug 2016 16:30:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 09:30:09 -0700 Date: Thu, 25 Aug 2016 09:30:07 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 5/7] misc: fix Coverity errors Message-ID: <20160825163007.GE20705@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 5/7] misc: fix Coverity errors References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> <147200549633.15538.18051281375686885659.stgit@birch.djwong.org> <20160825091452.GE5685@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160825091452.GE5685@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472142638 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1540 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Thu, Aug 25, 2016 at 02:14:52AM -0700, Christoph Hellwig wrote: > On Tue, Aug 23, 2016 at 07:24:56PM -0700, Darrick J. Wong wrote: > > Fix various code sloppinesses pointed out by Coverity. > > > > Coverity-id: 1371628 - 1371638 > > > @@ -75,6 +75,7 @@ fsmap( > > high.rm_owner = ULLONG_MAX; > > high.rm_offset = ULLONG_MAX; > > high.rm_flags = XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK | XFS_RMAP_UNWRITTEN; > > + high.rm_blockcount = low.rm_blockcount = 0; > > Do the low initialization near the remaining low fields? > > or better do a struct initialization ala > > struct xfs_rmap_irec low = { 0, }; > struct xfs_rmap_irec high = { 0, }; > > that ensures the who;le structure is zero-filled for uninitialized > fields. Ok. > > diff --git a/repair/phase5.c b/repair/phase5.c > > index e583879..5a7185c 100644 > > --- a/repair/phase5.c > > +++ b/repair/phase5.c > > @@ -1464,7 +1464,7 @@ prop_rmap_cursor( > > * and set the rightsib pointer of current block > > */ > > #ifdef XR_BLD_INO_TRACE > > - fprintf(stderr, " ino prop agbno %d ", lptr->prev_agbno); > > + fprintf(stderr, " rmap prop agbno %d ", lptr->prev_agbno); > > #endif > > Did Coveryity really point this out? :) Heh, nope. I'll add it in the changelog. > > @@ -1548,6 +1548,7 @@ prop_rmap_highkey( > > bt_key->rm_offset = cpu_to_be64( > > libxfs_rmap_irec_offset_pack(&high_key)); > > > > + key.rm_blockcount = 0; > > should probably be a struct initializer again --D From contact@kiaxxcommunication.com Thu Aug 25 15:04:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=HTML_IMAGE_ONLY_28, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B2FAB7CA0 for ; Thu, 25 Aug 2016 15:04:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A285304039 for ; Thu, 25 Aug 2016 13:04:15 -0700 (PDT) X-ASG-Debug-ID: 1472155446-0bf8155c751dbf60001-NocioJ Received: from sender.234.com (d720-7.lesmails.info [91.236.254.107]) by cuda.sgi.com with ESMTP id UC8Ax6wrTiKHhyGO for ; Thu, 25 Aug 2016 13:04:07 -0700 (PDT) X-Barracuda-Envelope-From: contact@kiaxxcommunication.com X-Barracuda-Effective-Source-IP: d720-7.lesmails.info[91.236.254.107] X-Barracuda-Apparent-Source-IP: 91.236.254.107 Message-ID: <91134ef005ed45bcb0bfc26220701989@kiaxxcommunication.com> From: "Pierre-Arnaud de VALLEY" To: Subject: =?utf-8?B?Q29tbWVudCBhdHRpcmVyIGRlcyBjbGllbnRzIGdyYWNlIGEgWW91VG==?= =?utf-8?B?dWJlIChmb3JtYXRpb24gb2ZmZXJ0ZSl=?= Date: Thu, 25 Aug 2016 22:03:53 +0200 X-ASG-Orig-Subj: =?utf-8?B?Q29tbWVudCBhdHRpcmVyIGRlcyBjbGllbnRzIGdyYWNlIGEgWW91VG==?= =?utf-8?B?dWJlIChmb3JtYXRpb24gb2ZmZXJ0ZSl=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=MailPart0000_0010_353735AC" X-Barracuda-Connect: d720-7.lesmails.info[91.236.254.107] X-Barracuda-Start-Time: 1472155447 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4198 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.73 X-Barracuda-Spam-Status: No, SCORE=0.73 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_ONLY_28, HTML_IMAGE_ONLY_28_2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32324 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_IMAGE_ONLY_28 BODY: HTML: images with 2400-2800 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.73 HTML_IMAGE_ONLY_28_2 HTML: images with 2400-2800 bytes of words This is a multi-part message in MIME format. ------=MailPart0000_0010_353735AC Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Si vous voulez utiliser la puissance de YouTube pour attirer de nouveaux = visiteurs sur vos sites, des prospects et clients dans votre entreprise, = voici une formation qui devrait vous =C3=AAtre tr=C3=A8s utile : = http://bit.ly/ytbpPEfly - Acc=C3=A8s libre =C3=A0 la formation - Youtube c'est : - Plus d' 1 milliard d'utilisateurs (1/3 de la population = mondiale des internautes).- Plus de 200 millions de vid=C3=A9os = regard=C3=A9es chaque jour.Ce n'est pas =C3=A9tonnant que le g=C3=A9ant = Google ait d=C3=A9cid=C3=A9 de racheter YouTube.Mais alors, comment = utiliser cette puissance pour faire connaitre votre entreprise et = d=C3=A9multiplier vos ventes?Cliquez sur le lien suivant pour recevoir des = strat=C3=A9gies simples =C3=A0 mettre en place d=C3=A8s aujourd'hui : = http://bit.ly/ytbpPEfly Recevez nos salutations les plus cordiales.Pierre-Arnaud de = VALLEY,Directeur Marketing Et CommercialPour la KIAXX ACADEMYCDV70444, 350 = Chemin Pr=C3=A9 Neuf38350 LA MURE PS: Les strat=C3=A9gies que vous = d=C3=A9couvrirez dans cette formation vont =C3=A0 l'encontre de celles = utilis=C3=A9es par "les youtubeurs c=C3=A9l=C3=A8bres".Vous pouvez = atteindre d'excellent r=C3=A9sultats sans avoir besoin d'avoir des = milliers d'abonn=C3=A9s ni des millions de vues.Vous =C3=AAtes = entrepreneurs, vous n'avez pas besoin de faire du youtube BUZ... = uniquement du youtube BIZ (business).Tout est d=C3=A9taill=C3=A9 ici : = http://bit.ly/ytbpPEfly =20 Vous ne voulez plus recevoir de communication de notre part? Vous pouvez = cliquer ici pour vous d=C3=A9sabonner : D=C3=A9sabonnez-moi ------=MailPart0000_0010_353735AC Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Comment attirer des clients grace a YouTube (formation = offerte)

Si vous voulez utiliser la puissance de YouTube = pour attirer de nouveaux visiteurs sur vos sites, des prospects et = clients dans votre entreprise, voici une formation qui = devrait vous =C3=AAtre tr=C3=A8s utile : http://bit.ly/ytbpPEfly

3D"" 
- Acc=C3=A8s = libre =C3=A0 la formation -

Youtube c'est :
- Plus d' 1 milliard = d'utilisateurs (1/3 de la population mondiale des = internautes).
- Plus de 200 millions de vid=C3=A9os = regard=C3=A9es chaque jour.

Ce n'est pas =C3=A9tonnant que le = g=C3=A9ant Google ait d=C3=A9cid=C3=A9 de racheter YouTube.

Mais = alors, comment utiliser cette puissance pour faire connaitre votre = entreprise et d=C3=A9multiplier vos = ventes?

Cliquez sur le lien suivant pour recevoir = des strat=C3=A9gies simples =C3=A0 mettre en place d=C3=A8s aujourd'hui : = http://bit.ly/ytbpPEfly

Recevez nos salutations les plus cordiales.

Pierre-Arnaud de = VALLEY,
Directeur Marketing Et Commercial
Pour la KIAXX = ACADEMY
CDV70444, 350 Chemin Pr=C3=A9 Neuf
38350 LA MURE =
3D""
PS: Les = strat=C3=A9gies que vous d=C3=A9couvrirez dans cette formation vont = =C3=A0 l'encontre de celles utilis=C3=A9es par "les youtubeurs = c=C3=A9l=C3=A8bres".
Vous pouvez atteindre d'excellent r=C3=A9sultats = sans avoir besoin d'avoir des milliers d'abonn=C3=A9s ni des millions de = vues.
Vous =C3=AAtes entrepreneurs, vous n'avez pas besoin de faire du = youtube BUZ... uniquement du youtube BIZ (business).

Tout est = d=C3=A9taill=C3=A9 ici : http://bit.ly/ytbpPEfly

 

Vous ne voulez plus recevoir de communication de notre part? Vous = pouvez cliquer ici pour vous d=C3=A9sabonner : D=C3=A9sabonnez-moi

------=MailPart0000_0010_353735AC-- From darrick.wong@oracle.com Thu Aug 25 16:02:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 506F57CA0 for ; Thu, 25 Aug 2016 16:02:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 205328F8033 for ; Thu, 25 Aug 2016 14:02:27 -0700 (PDT) X-ASG-Debug-ID: 1472158941-0bf57b5313205de0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id hMXev8sui6A6Iyjm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 14:02:22 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PL2J8e023547 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 21:02:20 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PL2JA4024435 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 21:02:19 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PL2Iaq014612; Thu, 25 Aug 2016 21:02:18 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 14:02:18 -0700 Date: Thu, 25 Aug 2016 14:02:16 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: [PATCH v2 5/7] misc: fix Coverity errors Message-ID: <20160825210216.GB22760@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2 5/7] misc: fix Coverity errors References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> <147200549633.15538.18051281375686885659.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200549633.15538.18051281375686885659.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472158942 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4325 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32325 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Fix various code sloppinesses pointed out by Coverity, and fix an incorrect comment/debug message. Coverity-id: 1371628 - 1371638 Signed-off-by: Darrick J. Wong --- db/fsmap.c | 7 ++----- repair/phase5.c | 17 +++++++++-------- repair/rmap.c | 4 ++-- repair/scan.c | 2 +- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/db/fsmap.c b/db/fsmap.c index b2ba55d..61ccce0 100644 --- a/db/fsmap.c +++ b/db/fsmap.c @@ -57,8 +57,8 @@ fsmap( xfs_agnumber_t end_ag; xfs_agnumber_t agno; xfs_daddr_t eofs; - struct xfs_rmap_irec low; - struct xfs_rmap_irec high; + struct xfs_rmap_irec low = {0}; + struct xfs_rmap_irec high = {0}; struct xfs_btree_cur *bt_cur; struct xfs_buf *agbp; int error; @@ -68,9 +68,6 @@ fsmap( end_fsb = XFS_DADDR_TO_FSB(mp, eofs - 1); low.rm_startblock = XFS_FSB_TO_AGBNO(mp, start_fsb); - low.rm_owner = 0; - low.rm_offset = 0; - low.rm_flags = 0; high.rm_startblock = -1U; high.rm_owner = ULLONG_MAX; high.rm_offset = ULLONG_MAX; diff --git a/repair/phase5.c b/repair/phase5.c index e583879..27141cc 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -1464,7 +1464,7 @@ prop_rmap_cursor( * and set the rightsib pointer of current block */ #ifdef XR_BLD_INO_TRACE - fprintf(stderr, " ino prop agbno %d ", lptr->prev_agbno); + fprintf(stderr, " rmap prop agbno %d ", lptr->prev_agbno); #endif if (lptr->prev_agbno != NULLAGBLOCK) { ASSERT(lptr->prev_buf_p != NULL); @@ -1502,7 +1502,7 @@ prop_rmap_cursor( prop_rmap_cursor(mp, agno, btree_curs, rm_rec, level); } /* - * add inode info to current block + * add rmap info to current block */ be16_add_cpu(&bt_hdr->bb_numrecs, 1); @@ -1529,13 +1529,12 @@ prop_rmap_highkey( struct xfs_btree_block *bt_hdr; struct xfs_rmap_key *bt_key; struct bt_stat_level *lptr; - struct xfs_rmap_irec key; + struct xfs_rmap_irec key = {0}; struct xfs_rmap_irec high_key; int level; int i; int numrecs; - key.rm_flags = 0; high_key = *rm_highkey; for (level = 1; level < btree_curs->num_levels; level++) { lptr = &btree_curs->level[level]; @@ -1575,8 +1574,8 @@ build_rmap_tree( struct xfs_rmap_irec *rm_rec; struct xfs_slab_cursor *rmap_cur; struct xfs_rmap_rec *bt_rec; - struct xfs_rmap_irec highest_key; - struct xfs_rmap_irec hi_key; + struct xfs_rmap_irec highest_key = {0}; + struct xfs_rmap_irec hi_key = {0}; struct bt_stat_level *lptr; int level = btree_curs->num_levels; int error; @@ -1621,7 +1620,7 @@ _("Insufficient memory to construct reverse-map cursor.")); rm_rec = pop_slab_cursor(rmap_cur); lptr = &btree_curs->level[0]; - for (i = 0; i < lptr->num_blocks; i++) { + for (i = 0; i < lptr->num_blocks && rm_rec != NULL; i++) { /* * block initialization, lay in block header */ @@ -1639,8 +1638,10 @@ _("Insufficient memory to construct reverse-map cursor.")); if (lptr->modulo > 0) lptr->modulo--; - if (lptr->num_recs_pb > 0) + if (lptr->num_recs_pb > 0) { + ASSERT(rm_rec != NULL); prop_rmap_cursor(mp, agno, btree_curs, rm_rec, 0); + } bt_rec = (struct xfs_rmap_rec *) ((char *)bt_hdr + XFS_RMAP_BLOCK_LEN); diff --git a/repair/rmap.c b/repair/rmap.c index f22f4f0..cdd5c3a 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -316,7 +316,7 @@ fold_raw_rmaps( struct xfs_slab_cursor *cur = NULL; struct xfs_rmap_irec *prev, *rec; size_t old_sz; - int error; + int error = 0; old_sz = slab_count(ag_rmaps[agno].ar_rmaps); if (slab_count(ag_rmaps[agno].ar_raw_rmaps) == 0) @@ -329,7 +329,7 @@ fold_raw_rmaps( prev = pop_slab_cursor(cur); rec = pop_slab_cursor(cur); - while (rec) { + while (prev && rec) { if (mergeable_rmaps(prev, rec)) { prev->rm_blockcount += rec->rm_blockcount; rec = pop_slab_cursor(cur); diff --git a/repair/scan.c b/repair/scan.c index 9a46dd0..0ef1123 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -898,7 +898,7 @@ scan_rmapbt( int state; xfs_agblock_t lastblock = 0; struct xfs_rmap_key *kp; - struct xfs_rmap_irec key; + struct xfs_rmap_irec key = {0}; if (magic != XFS_RMAP_CRC_MAGIC) { name = "(unknown)"; From darrick.wong@oracle.com Thu Aug 25 16:03:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D1FD97CA0 for ; Thu, 25 Aug 2016 16:03:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80ABC304039 for ; Thu, 25 Aug 2016 14:03:53 -0700 (PDT) X-ASG-Debug-ID: 1472159028-0bf8155c771dfcc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id KPki8zBeDyLoYQxI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 14:03:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PL3lA1025162 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 21:03:48 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PL3ldA014636 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 21:03:47 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PL3ka8015349; Thu, 25 Aug 2016 21:03:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 14:03:46 -0700 Date: Thu, 25 Aug 2016 14:03:45 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 0/7] xfsprogs: reverse mapping fixes Message-ID: <20160825210345.GC22760@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 0/7] xfsprogs: reverse mapping fixes References: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147200546481.15538.12724000421579716885.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472159029 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 810 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32325 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 23, 2016 at 07:24:24PM -0700, Darrick J. Wong wrote: > Hi all, > > This is a roll-up of a few fixes[1] for reverse-mapping in xfsprogs 4.8. > > The patches have been xfstested with the 'auto' group on x64 > and (afaict) don't cause any regressions. > > This is an extraordinary way to eat your data. Enjoy! > Comments and questions are, as always, welcome. Just FYI I rolled the updated Coverity fix patch into a new branch: https://github.com/djwong/xfsprogs/tree/for-dave-for-4.8-7 --D > > --D > > [1] https://github.com/djwong/xfsprogs/tree/for-dave-for-4.8-6 > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From sandeen@sandeen.net Thu Aug 25 16:36:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B3DE17CA0 for ; Thu, 25 Aug 2016 16:36:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 75BB7304039 for ; Thu, 25 Aug 2016 14:36:34 -0700 (PDT) X-ASG-Debug-ID: 1472160990-0bf8155c751e0d60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id qJ8buXD0fL09EAFp for ; Thu, 25 Aug 2016 14:36:31 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8D92F56B for ; Thu, 25 Aug 2016 16:36:30 -0500 (CDT) Subject: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. References: <1471967653-2561-1-git-send-email-asavkov@redhat.com> From: Eric Sandeen Message-ID: Date: Thu, 25 Aug 2016 16:36:30 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <1471967653-2561-1-git-send-email-asavkov@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1472160990 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1391 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32326 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/23/16 10:54 AM, Artem Savkov wrote: > Commit "xfs: only return -errno or success from attr ->put_listent" changes the > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient > space in the buffer assuming that setting context->count to -1 would be enough, > but all of the ->put_listent callers only check seen_enough. This results in > a failed assertion: > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 > in insufficient buffer size case. Oof. I remember spending a lot of time trying to track down all of these cases. It seems overly complex and obscure. :( I'll try to find time to dig through it again; offhand it doesn't seem like "count = -1" means anything to anyone except in an ASSERT check? Thanks, -Eric > Signed-off-by: Artem Savkov > --- > fs/xfs/xfs_xattr.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c > index ea62245..6290093 100644 > --- a/fs/xfs/xfs_xattr.c > +++ b/fs/xfs/xfs_xattr.c > @@ -147,6 +147,7 @@ __xfs_xattr_put_listent( > arraytop = context->count + prefix_len + namelen + 1; > if (arraytop > context->firstu) { > context->count = -1; /* insufficient space */ > + context->seen_enough = 1; > return 0; > } > offset = (char *)context->alist + context->count; > From david@fromorbit.com Thu Aug 25 17:02:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=FAKE_REPLY_C autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ABD7D7CA0 for ; Thu, 25 Aug 2016 17:02:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB9D330405F for ; Thu, 25 Aug 2016 15:02:27 -0700 (PDT) X-ASG-Debug-ID: 1472162544-0bf57b53142075e0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id sP5qzM6eciDpJfEi for ; Thu, 25 Aug 2016 15:02:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqUVAHRqv1d5LDUCEGdsb2JhbABdHAEBgyMBAQEBAR6BUoZynBMBAQaMcYoihhcEAgKBX00BAQEBAQEBAQIGAQEBAQEBAQE3QIRhAQEBAwEnExweBRgDEgYJNAUlAwcGFAESiCoHwCYBAQgBAQEBIx6FSIUVh22CLwWZSo8dj1tIi3mDeYRzKjSGTAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Aug 2016 07:31:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bd2iG-0002Iq-4o; Fri, 26 Aug 2016 08:01:28 +1000 Date: Fri, 26 Aug 2016 08:01:28 +1000 From: Dave Chinner To: Felix Janda , Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t Message-ID: <20160825220128.GE19025@dastard> X-ASG-Orig-Subj: Re: [PATCHv2 xfsprogs 00/14] Convert from off64_t to off_t MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160825080402.GA28747@infradead.org> <20160824204746.GA25162@nyan> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472162544 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2852 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32327 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Aug 24, 2016 at 10:47:46PM +0200, Felix Janda wrote: > Dave Chinner wrote: > > So, the patches are fine, and everything works. Problem is, it > > screws up xfstests because it changes all the error messages > > that are output to stderr and captured by the test harness. > > There are quite a few tests that this causes failures for, > > and because it's stderr, it's not as simple as just adding a new > > filter to do 'sed -e "s/^\(.*\)64\(: .*$\)/\1\2/"' on stderr. > > Thanks for testing! > > I can rework the patches to leave stderr unchanged. I guess that this > is preferable as opposed to updating the output expected by xfstests > since xfstests should be usable with both old and new xfsprogs. Well, normally the thing that needs to change is xfstests. We have to handle all sorts of issues like this (core-utils people seem to change error messge format at least once a year). it just more complex for xfs_io because we've got to filter both stdout and stderr separately and not cross the streams. > > Further, errors returned change, which further screws up xfstests. > > e.g. old code gives EFBIG when we try to use offsets beyond the > > supported range, this patchset returns EINVAL. That further > > complicates any sort of error filtering we'll need to do. > > I am very surprised that something apart from the error messages has > changed. I would be interested to know on what architecture and for > which test(s) (where) this happened, if you still remember. Turns out this was a false detection - the test captures EINVAL error message and turns it into a EFBIG error message, probably because at one stage it was EFBIG. So the errno didn't change, just the error filter didn't match and convert.... On Thu, Aug 25, 2016 at 01:04:02AM -0700, Christoph Hellwig wrote: > On Wed, Aug 24, 2016 at 10:47:46PM +0200, Felix Janda wrote: > > > screws up xfstests because it changes all the error messages > > > that are output to stderr and captured by the test harness. > > > There are quite a few tests that this causes failures for, > > > and because it's stderr, it's not as simple as just adding a new > > > filter to do 'sed -e "s/^\(.*\)64\(: .*$\)/\1\2/"' on stderr. > > > > Thanks for testing! > > > > I can rework the patches to leave stderr unchanged. I guess that this > > is preferable as opposed to updating the output expected by xfstests > > since xfstests should be usable with both old and new xfsprogs. > > I would prefer to change the output if we can find a good way to > filter it. I suspect the issues are things like perror lines > which would look odd if we leave the 64 back in. right, it's pwrite64 -> pwrite that is the main issue. And yes, I would prefer to filter it, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 25 17:43:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4A7B27CA0 for ; Thu, 25 Aug 2016 17:43:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A45A7AC001 for ; Thu, 25 Aug 2016 15:43:01 -0700 (PDT) X-ASG-Debug-ID: 1472164953-0bf57b5314208230001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id mQhebFFjH7Qlaiyn for ; Thu, 25 Aug 2016 15:42:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmoTANxzv1d5LDUCEGdsb2JhbABdGwEBAYMjAQEBAQEegVKGcpwTAQEGjHGDaoIqhA6GFwQCAoFgTQEBAQEBAQEBAgYBAQEBAQEBATdAhGEBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOIKgfAKgEBAQcCASQehUiFFYEggnIRAYNJgi8FiCWHM4lyjx2Bd4RdiQdIi3mDeYRzKjSELYIfAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 26 Aug 2016 08:12:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bd3Lj-0002MO-Mc; Fri, 26 Aug 2016 08:42:15 +1000 Date: Fri, 26 Aug 2016 08:42:15 +1000 From: Dave Chinner To: Artem Savkov Cc: Eric Sandeen , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Message-ID: <20160825224215.GF19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. References: <1471967653-2561-1-git-send-email-asavkov@redhat.com> <20160824015551.GB19025@dastard> <20160824080833.GA11104@shodan.usersys.redhat.com> <20160825002408.GC19025@dastard> <20160825082109.GB11104@shodan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160825082109.GB11104@shodan.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472164953 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5788 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 25, 2016 at 10:21:09AM +0200, Artem Savkov wrote: > On Thu, Aug 25, 2016 at 10:24:08AM +1000, Dave Chinner wrote: > > On Wed, Aug 24, 2016 at 10:08:33AM +0200, Artem Savkov wrote: > > > On Wed, Aug 24, 2016 at 11:55:51AM +1000, Dave Chinner wrote: > > > > On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote: > > > > > Commit "xfs: only return -errno or success from attr ->put_listent" changes the > > > > > > > > Please quote commits in --oneline format in changelogs - it makes it > > > > much easier to find the change you are refering to if there is both > > > > a commit ID and the text string in the commit message. (i.e. text > > > > string confirms the commit id is the one you meant to quote). > > > > > > Noted, thanks. > > > > > > > > > > > commit 2a6fba6 ("xfs: only return -errno or success from attr > > > > ->put_listent") is the one you are refering to here, right? > > > > > > Yes, that is the one. > > > > > > > > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient > > > > > space in the buffer assuming that setting context->count to -1 would be enough, > > > > > but all of the ->put_listent callers only check seen_enough. This results in > > > > > a failed assertion: > > > > > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 > > > > > in insufficient buffer size case. > > > > > > > > You have a test case? Can you turn it into an xfstest? We really > > > > need regression tests that cover issues like this.... > > > > > > > > > > llistxattr02 test from LTP reliably hits this, I'll see how this can be > > > ported to xfstest. > > > > So, after battling the obtuse, completely useless ltp install > > documentation and having to resort to reverse engineering a working > > configuration using strace, I finally got this running, I think, on > > an XFS filesystem: > > > > /mnt/scratch/ltp$ sudo ./runltp -b /dev/pmem1 -B xfs -z /dev/vdc -Z xfs -q -p -s llistxattr -I 100 > > .... > > Summary: > > passed 1 > > failed 0 > > skipped 0 > > warnings 0 > > tst_test.c:756: INFO: Timeout per run is 0h 05m 00s > > llistxattr02.c:76: PASS: llistxattr() failed as expected: ERANGE > > llistxattr02.c:76: PASS: llistxattr() failed as expected: ENOENT > > llistxattr02.c:76: PASS: llistxattr() failed as expected: EFAULT > > .... > > > > And it doesn't fail. strace output: > > > > 24833 lsetxattr("symlink", "security.ltptest", "test", 4, XATTR_CREATE) = 0 > > 24833 llistxattr("symlink", 0x7ffe312356b0, 1) = -1 ERANGE (Numerical result out of range) > > 24833 llistxattr("", 0x7ffe312356a0, 20) = -1 ENOENT (No such file or directory) > > 24833 llistxattr(0xffffffffffffffff, 0x7ffe312356a0, 20) = -1 EFAULT (Bad address) > > > > I'm assuming from your description that it is the first one of these > > that fails for you as it is the "buffer too small" test case. So, > > not as obvious as it first seems - ltp doesn't appear to be a > > reliable reproducer of the problem, so we are going to need a custom > > test to exercise it.... > > LTP doesn't check dmesg for warnings on it's own, so it is ok for the test > to be marked as "PASSED" since we get ERANGE after all. But you should > be able to see the warnings in dmesg. Of course. My systems are set up so that any critical message that comes through dmesg is wall'd to all active sessions, so it doesn't matter that xfstests or ltp doesn't capture the error, I know it's happened. Besides, I always use CONFIG_XFS_DEBUG=y, which means these things BUG() rather than just print a warning, and that tends to be fatal in more ways than one... > I'm attaching the config I'm using. With this config I can repdroduce the > issue with both 4.8-rc3 and next-20160825. What I suggest you do is try to recreate the problem manually. I'm pretty certain I know what is different between our test environments that is resulting in me not seeing the problem but, really, we need more people with root cause analysis skills around here so I don't have to spend time solving every problem that is reported. That is, it's all well and good to send a patch to fix a problem, but if we don't understand the root cause of the problem being fixed, then we have no idea whether we've fixed the problem fully or not. Part of understanding the root cause is finding a reliable reproducer of the problem, part of it is reading and understanding the code being fixed, and part of it is understanding the environment and behaviour that demonstrates the problem. So when I look at the fix, and see that it doesn't reproduce on my systems, it's clear that it's either not yet fully understood or hasn't been fully explained by the person who understands the issue. These are some of the questions I've asked myself to understand why we are seeing what we've been seeing: - what condition in the unfixed code leads to the ASSERT being tripped? - how does the patch prevent that from occurring? - at what threshold does the problem trigger (i.e. n=0, n=1, n=2 .... ?) - how do the environmental initial conditions affect the test being run? - what do security layers automatically store in the inode at creation time? - how can we modify the test to always trigger the assert? I know the answer, and it would take much less time to tell everyone that it does to write an email like this. But that means I'll just have to do the same thing next time, and the next time, and so on. The more people we have that can think through issues like this and come to the right conclusion without needing my help, the better off we'll all be... Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Thu Aug 25 18:27:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A7E427CA0 for ; Thu, 25 Aug 2016 18:27:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79313304043 for ; Thu, 25 Aug 2016 16:27:07 -0700 (PDT) X-ASG-Debug-ID: 1472167621-0bf57c55b11c7480001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id cbYQweOBnHFDqAwE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:27:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNQxP1012485 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:26:59 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNQwqW030442 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:26:59 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNQwYW011294; Thu, 25 Aug 2016 23:26:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:26:57 -0700 Subject: [PATCH v8 0/7] xfs-docs: reorganize chapters, document rmap and reflink From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 0/7] xfs-docs: reorganize chapters, document rmap and reflink To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:26:56 -0700 Message-ID: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167621 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1531 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. The patches in this series fix various errors, bring the documentation up to date as of kernel 4.6, and add entirely new chapters about the reverse mapping and reference count btrees. The new log redo items are also documented. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:27:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 431177CA4 for ; Thu, 25 Aug 2016 18:27:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AACFAAC005 for ; Thu, 25 Aug 2016 16:27:12 -0700 (PDT) X-ASG-Debug-ID: 1472167629-0bf57b5314208fc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id PHCX28l9Ca57iOTA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:27:10 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNR8oE005615 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:27:08 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNR7fU014459 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:27:08 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNR6NO013263; Thu, 25 Aug 2016 23:27:06 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:27:04 -0700 Subject: [PATCH 1/7] journaling_log: fix some typos in the section about EFDs From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/7] journaling_log: fix some typos in the section about EFDs To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:27:02 -0700 Message-ID: <147216762268.32447.4258135326050076262.stgit@birch.djwong.org> In-Reply-To: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> References: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167630 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1326 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- .../journaling_log.asciidoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/design/XFS_Filesystem_Structure/journaling_log.asciidoc b/design/XFS_Filesystem_Structure/journaling_log.asciidoc index a67fcc2..67d209f 100644 --- a/design/XFS_Filesystem_Structure/journaling_log.asciidoc +++ b/design/XFS_Filesystem_Structure/journaling_log.asciidoc @@ -368,7 +368,7 @@ typedef struct xfs_efd_log_format { ---- *efd_type*:: -The signature of an EFI operation, 0x1236. This value is in host-endian order, +The signature of an EFD operation, 0x1237. This value is in host-endian order, not big-endian like the rest of XFS. *efd_size*:: @@ -382,9 +382,9 @@ A 64-bit number that binds the corresponding EFI log item to this EFD log item. *efd_extents*:: Variable-length array of extents to be freed. The array length is given by -+efi_nextents+. The record type will be either +xfs_extent_64_t+ or ++efd_nextents+. The record type will be either +xfs_extent_64_t+ or +xfs_extent_32_t+; this can be determined from the log item size (+oh_len+) and -the number of extents (+efi_nextents+). +the number of extents (+efd_nextents+). [[Inode_Log_Item]] === Inode Updates From darrick.wong@oracle.com Thu Aug 25 18:27:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F2AA97CA0 for ; Thu, 25 Aug 2016 18:27:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C53A08F8033 for ; Thu, 25 Aug 2016 16:27:16 -0700 (PDT) X-ASG-Debug-ID: 1472167634-0bf57b5312208fd0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 8eRm6x8Wr7sAaF5z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:27:14 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNRDqR012899 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:27:13 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNRCuC002248 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:27:13 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNRCc6024219; Thu, 25 Aug 2016 23:27:12 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:27:12 -0700 Subject: [PATCH 2/7] xfsdocs: document known testing procedures From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/7] xfsdocs: document known testing procedures To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:27:10 -0700 Message-ID: <147216763079.32447.3995874080873054631.stgit@birch.djwong.org> In-Reply-To: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> References: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167634 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3206 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- design/XFS_Filesystem_Structure/docinfo.xml | 14 ++++++++++++ design/XFS_Filesystem_Structure/testing.asciidoc | 23 ++++++++++++++++++++ .../xfs_filesystem_structure.asciidoc | 2 ++ 3 files changed, 39 insertions(+) create mode 100644 design/XFS_Filesystem_Structure/testing.asciidoc diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml index ba97809..cc5596d 100644 --- a/design/XFS_Filesystem_Structure/docinfo.xml +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -108,4 +108,18 @@ + + 3.14 + January 2016 + + Darrick + Wong + + + + + Document disk format change testing. + + + diff --git a/design/XFS_Filesystem_Structure/testing.asciidoc b/design/XFS_Filesystem_Structure/testing.asciidoc new file mode 100644 index 0000000..f1c90bc --- /dev/null +++ b/design/XFS_Filesystem_Structure/testing.asciidoc @@ -0,0 +1,23 @@ +[[Testing]] += Testing Filesystem Changes + +People put a lot of trust in filesystems to preserve their data in a reliable +fashion. To that end, it is very important that users and developers have +access to a suite of regression tests that can be used to prove correct +operation of any given filesystem code, or to analyze failures to fix problems +found in the code. The XFS regression test suite, +xfstests+, is hosted at ++git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git+. Most tests apply to +filesystems in general, but the suite also contains tests for features specific +to each filesystem. + +When fixing bugs, it is important to provide a testcase exposing the bug so +that the developers can avoid a future re-occurrence of the regression. +Furthermore, if you're developing a new user-visible feature for XFS, please +help the rest of the development community to sustain and maintain the whole +codebase by providing generous test coverage to check its behavior. + +When altering, adding, or removing an on-disk data structure, please remember +to update both the in-kernel structure size checks in +xfs_ondisk.h+ and to +ensure that your changes are reflected in xfstest xfs/122. These regression +tests enable us to detect compiler bugs, alignment problems, and anything +else that might result in the creation of incompatible filesystem images. diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc index 53262bf..f580aab 100644 --- a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -52,6 +52,8 @@ include::common_types.asciidoc[] include::magic.asciidoc[] +include::testing.asciidoc[] + // return titles to normal :leveloffset: 0 From darrick.wong@oracle.com Thu Aug 25 18:27:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9F9CE7CB1 for ; Thu, 25 Aug 2016 18:27:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 24810AC002 for ; Thu, 25 Aug 2016 16:27:22 -0700 (PDT) X-ASG-Debug-ID: 1472167641-0bf8155c751e5c20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id wnrd0eq26v0SKZpl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:27:21 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNRJpL012968 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:27:20 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNRJh9031053 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:27:19 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNRISf026690; Thu, 25 Aug 2016 23:27:18 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:27:18 -0700 Subject: [PATCH 3/7] xfsdocs: update the on-disk format with changes for Linux 4.5 From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/7] xfsdocs: update the on-disk format with changes for Linux 4.5 To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:27:16 -0700 Message-ID: <147216763695.32447.8173128727182823319.stgit@birch.djwong.org> In-Reply-To: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> References: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167641 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1773 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- .../XFS_Filesystem_Structure/ondisk_inode.asciidoc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc index 4aabc55..dc1fad2 100644 --- a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc +++ b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc @@ -66,9 +66,10 @@ of the literal area and +di_forkoff+. The attribute fork is located between [[Inode_Core]] == Inode Core -The inode's core is 96 bytes in size and contains information about the file -itself including most stat data information about data and attribute forks after -the core within the inode. It uses the following structure: +The inode's core is 96 bytes on a V4 filesystem and 176 bytes on a V5 +filesystem. It contains information about the file itself including most stat +data information about data and attribute forks after the core within the +inode. It uses the following structure: [source, c] ---- @@ -313,8 +314,16 @@ Counts the number of changes made to the attributes in this inode. Log sequence number of the last inode write. *di_flags2*:: -Specifies extended flags associated with a v3 inode. There are no flags defined -currently. +Specifies extended flags associated with a v3 inode. + +.Version 3 Inode flags +[options="header"] +|===== +| Flag | Description +| +XFS_DIFLAG2_DAX+ | +For a file, enable DAX to increase performance on persistent-memory storage. +If set on a directory, files created in the directory will inherit this flag. +|===== *di_pad2*:: Padding for future expansion of the inode. From darrick.wong@oracle.com Thu Aug 25 18:27:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 53ECB7CA0 for ; Thu, 25 Aug 2016 18:27:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 24DF28F8033 for ; Thu, 25 Aug 2016 16:27:30 -0700 (PDT) X-ASG-Debug-ID: 1472167647-0bf57c55b21c74b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Ug6kTJrw74vy7aqB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:27:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNRPRV013009 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:27:26 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNRPqY015005 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:27:25 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNROgJ026699; Thu, 25 Aug 2016 23:27:25 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:27:24 -0700 Subject: [PATCH 4/7] xfsdocs: move the discussions of short and long format btrees to a separate chapter From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 4/7] xfsdocs: move the discussions of short and long format btrees to a separate chapter To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:27:23 -0700 Message-ID: <147216764310.32447.6110430430725995824.stgit@birch.djwong.org> In-Reply-To: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> References: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167647 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14279 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Move the discussion of short and long format btrees into a separate chapter. Signed-off-by: Darrick J. Wong --- .../allocation_groups.asciidoc | 59 ------ design/XFS_Filesystem_Structure/btrees.asciidoc | 196 ++++++++++++++++++++ .../XFS_Filesystem_Structure/data_extents.asciidoc | 72 +------ .../xfs_filesystem_structure.asciidoc | 2 4 files changed, 204 insertions(+), 125 deletions(-) create mode 100644 design/XFS_Filesystem_Structure/btrees.asciidoc diff --git a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc index 0633175..55bbc50 100644 --- a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc +++ b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc @@ -612,65 +612,6 @@ Checksum of the AGF sector. *agf_spare2*:: Empty space in the unlogged part of the AGF sector. -[[Short_Format_Btrees]] -=== Short Format B+trees - -Each allocation group uses a ``short format'' B+tree to index various -information about the allocation group. The structure is called short format -because all block pointers are AG block numbers. The trees use the following -header: - -[source, c] ----- -struct xfs_btree_sblock { - __be32 bb_magic; - __be16 bb_level; - __be16 bb_numrecs; - __be32 bb_leftsib; - __be32 bb_rightsib; - - /* version 5 filesystem fields start here */ - __be64 bb_blkno; - __be64 bb_lsn; - uuid_t bb_uuid; - __be32 bb_owner; - __le32 bb_crc; -}; ----- - -*bb_magic*:: -Specifies the magic number for the per-AG B+tree block. - -*bb_level*:: -The level of the tree in which this block is found. If this value is 0, this -is a leaf block and contains records; otherwise, it is a node block and -contains keys and pointers. - -*bb_numrecs*:: -Number of records in this block. - -*bb_leftsib*:: -AG block number of the left sibling of this B+tree node. - -*bb_rightsib*:: -AG block number of the right sibling of this B+tree node. - -*bb_blkno*:: -FS block number of this B+tree block. - -*bb_lsn*:: -Log sequence number of the last write to this block. - -*bb_uuid*:: -The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ -depending on which features are set. - -*bb_owner*:: -The AG number that this B+tree block ought to be in. - -*bb_crc*:: -Checksum of the B+tree block. - [[AG_Free_Space_Btrees]] === AG Free Space B+trees diff --git a/design/XFS_Filesystem_Structure/btrees.asciidoc b/design/XFS_Filesystem_Structure/btrees.asciidoc new file mode 100644 index 0000000..306e061 --- /dev/null +++ b/design/XFS_Filesystem_Structure/btrees.asciidoc @@ -0,0 +1,196 @@ += B+trees + +XFS uses b+trees to index all metadata records. This well known data structure +is used to provide efficient random and sequential access to metadata records +while minimizing seek times. There are two btree formats: a short format +for records pertaining to a single allocation group, since all block pointers +in an AG are 32-bits in size; and a long format for records pertaining to a +file, since file data can have 64-bit block offsets. Each b+tree block is +either a leaf node containing records, or an internal node containing keys and +pointers to other b+tree blocks. The tree consists of a root block which may +point to some number of other blocks; blocks in the bottom level of the b+tree +contains only records. + +Leaf blocks of both types of b+trees have the same general format: a header +describing the data in the block, and an array of records. The specific header +formats are given in the next two sections, and the record format is provided +by the b+tree client itself. The generic b+tree code does not have any +specific knowledge of the record format. + +---- ++--------+------------+------------+ +| header | record | records... | ++--------+------------+------------+ +---- + +Internal node blocks of both types of b+trees also have the same general +format: a header describing the data in the block, an array of keys, and an +array of pointers. Each pointer may be associated with one or two keys. The +first key uniquely identifies the first record accessible via the leftmost path +down the branch of the tree. + +If the records in a b+tree are indexed by an interval, then a range of keys can +uniquely identify a single record. For example, if a record covers blocks +12-16, then any one of the keys 12, 13, 14, 15, or 16 return the same record. +In this case, the key for the record describing "12-16" is 12. If none of the +records overlap, we only need to store one key. + +This is the format of a standard b+tree node: + +---- ++--------+---------+---------+---------+---------+ +| header | key | keys... | ptr | ptrs... | ++--------+---------+---------+---------+---------+ +---- + +If the b+tree records do not overlap, performing a b+tree lookup is simple. +Start with the root. If it is a leaf block, perform a binary search of the +records until we find the record with a lower key than our search key. If the +block is a node block, perform a binary search of the keys until we find a +key lower than our search key, then follow the pointer to the next block. +Repeat until we find a record. + +However, if b+tree records contain intervals and are allowed to overlap, the +internal nodes of the b+tree become larger: + +---- ++--------+---------+----------+---------+-------------+---------+---------+ +| header | low key | high key | low key | high key... | ptr | ptrs... | ++--------+---------+----------+---------+-------------+---------+---------+ +---- + +The low keys are exactly the same as the keys in the non-overlapping b+tree. +High keys, however, are a little different. Recall that a record with a key +consisting of an interval can be referenced by a number of keys. Since the low +key of a record indexes the low end of that key range, the high key indexes the +high end of the key range. Returning to the example above, the high key for +the record describing "12-16" is 16. The high key recorded in a b+tree node +is the largest of the high keys of all records accessible under the subtree +rooted by the pointer. For a level 1 node, this is the largest high key in +the pointed-to leaf node; for any other node, this is the largest of the high +keys in the pointed-to node. + +Nodes and leaves use the same magic numbers. + +[[Short_Format_Btrees]] +== Short Format B+trees + +Each allocation group uses a ``short format'' B+tree to index various +information about the allocation group. The structure is called short format +because all block pointers are AG block numbers. The trees use the following +header: + +[source, c] +---- +struct xfs_btree_sblock { + __be32 bb_magic; + __be16 bb_level; + __be16 bb_numrecs; + __be32 bb_leftsib; + __be32 bb_rightsib; + + /* version 5 filesystem fields start here */ + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be32 bb_owner; + __le32 bb_crc; +}; +---- + +*bb_magic*:: +Specifies the magic number for the per-AG B+tree block. + +*bb_level*:: +The level of the tree in which this block is found. If this value is 0, this +is a leaf block and contains records; otherwise, it is a node block and +contains keys and pointers. + +*bb_numrecs*:: +Number of records in this block. + +*bb_leftsib*:: +AG block number of the left sibling of this B+tree node. + +*bb_rightsib*:: +AG block number of the right sibling of this B+tree node. + +*bb_blkno*:: +FS block number of this B+tree block. + +*bb_lsn*:: +Log sequence number of the last write to this block. + +*bb_uuid*:: +The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ +depending on which features are set. + +*bb_owner*:: +The AG number that this B+tree block ought to be in. + +*bb_crc*:: +Checksum of the B+tree block. + +[[Long_Format_Btrees]] +== Long Format B+trees + +Long format B+trees are similar to short format B+trees, except that their +block pointers are 64-bit filesystem block numbers instead of 32-bit AG block +numbers. Because of this, long format b+trees can be (and usually are) rooted +in an inode's data or attribute fork. The nodes and leaves of this B+tree use +the +xfs_btree_lblock+ declaration: + +[source, c] +---- +struct xfs_btree_lblock { + __be32 bb_magic; + __be16 bb_level; + __be16 bb_numrecs; + __be64 bb_leftsib; + __be64 bb_rightsib; + + /* version 5 filesystem fields start here */ + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be64 bb_owner; + __le32 bb_crc; + __be32 bb_pad; +}; +---- + +*bb_magic*:: +Specifies the magic number for the btree block. + +*bb_level*:: +The level of the tree in which this block is found. If this value is 0, this +is a leaf block and contains records; otherwise, it is a node block and +contains keys and pointers. + +*bb_numrecs*:: +Number of records in this block. + +*bb_leftsib*:: +FS block number of the left sibling of this B+tree node. + +*bb_rightsib*:: +FS block number of the right sibling of this B+tree node. + +*bb_blkno*:: +FS block number of this B+tree block. + +*bb_lsn*:: +Log sequence number of the last write to this block. + +*bb_uuid*:: +The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ +depending on which features are set. + +*bb_owner*:: +The AG number that this B+tree block ought to be in. + +*bb_crc*:: +Checksum of the B+tree block. + +*bb_pad*:: +Pads the structure to 64 bytes. diff --git a/design/XFS_Filesystem_Structure/data_extents.asciidoc b/design/XFS_Filesystem_Structure/data_extents.asciidoc index a39045d..4f1109b 100644 --- a/design/XFS_Filesystem_Structure/data_extents.asciidoc +++ b/design/XFS_Filesystem_Structure/data_extents.asciidoc @@ -203,9 +203,10 @@ u.bmx[0-1] = [startoff,startblock,blockcount,extentflag] [[Btree_Extent_List]] == B+tree Extent List -To manage extent maps that cannot fit in the inode fork area, XFS uses long -format B+trees. The root node of the B+tree is stored in the inode's data -fork. All block pointers for extent B+trees are 64-bit absolute block numbers. +To manage extent maps that cannot fit in the inode fork area, XFS uses +xref:Long_Format_Btrees[long format B+trees]. The root node of the B+tree is +stored in the inode's data fork. All block pointers for extent B+trees are +64-bit filesystem block numbers. For a single level B+tree, the root node points to the B+tree's leaves. Each leaf occupies one filesystem block and contains a header and an array of extents @@ -242,69 +243,8 @@ standard 256 byte inode before a new level of nodes is added between the root and the leaves. This will be less if +di_forkoff+ is not zero (i.e. attributes are in use on the inode). -[[Long_Format_Btrees]] -=== Long Format B+trees - -The subsequent nodes and leaves of the B+tree use the +xfs_btree_lblock+ -declaration: - -[source, c] ----- -struct xfs_btree_lblock { - __be32 bb_magic; - __be16 bb_level; - __be16 bb_numrecs; - __be64 bb_leftsib; - __be64 bb_rightsib; - - /* version 5 filesystem fields start here */ - __be64 bb_blkno; - __be64 bb_lsn; - uuid_t bb_uuid; - __be64 bb_owner; - __le32 bb_crc; - __be32 bb_pad; -}; ----- - -*bb_magic*:: -Specifies the magic number for the BMBT block: ``BMAP'' (0x424d4150). -On a v5 filesystem, this is ``BMA3'' (0x424d4133). - -*bb_level*:: -The level of the tree in which this block is found. If this value is 0, this -is a leaf block and contains records; otherwise, it is a node block and -contains keys and pointers. - -*bb_numrecs*:: -Number of records in this block. - -*bb_leftsib*:: -FS block number of the left sibling of this B+tree node. - -*bb_rightsib*:: -FS block number of the right sibling of this B+tree node. - -*bb_blkno*:: -FS block number of this B+tree block. - -*bb_lsn*:: -Log sequence number of the last write to this block. - -*bb_uuid*:: -The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ -depending on which features are set. - -*bb_owner*:: -The AG number that this B+tree block ought to be in. - -*bb_crc*:: -Checksum of the B+tree block. - -*bb_pad*:: -Pads the structure to 64 bytes. - -// force-split the lists +* The magic number for a BMBT block is ``BMAP'' (0x424d4150). On a v5 +filesystem, this is ``BMA3'' (0x424d4133). * For intermediate nodes, the data following +xfs_btree_lblock+ is the same as the root node: array of +xfs_bmbt_key+ value followed by an array of diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc index f580aab..62502b3 100644 --- a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -62,6 +62,8 @@ Global Structures :leveloffset: 1 +include::btrees.asciidoc[] + include::allocation_groups.asciidoc[] include::journaling_log.asciidoc[] From darrick.wong@oracle.com Thu Aug 25 18:27:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B76947CB7 for ; Thu, 25 Aug 2016 18:27:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 891A98F8035 for ; Thu, 25 Aug 2016 16:27:37 -0700 (PDT) X-ASG-Debug-ID: 1472167654-0bf57b5314209010001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id mmTouwSChobgutlp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:27:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNRW0H013079 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:27:32 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNRWdu015246 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:27:32 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNRV0t026710; Thu, 25 Aug 2016 23:27:31 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:27:30 -0700 Subject: [PATCH 5/7] xfsdocs: reverse-mapping btree documentation From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 5/7] xfsdocs: reverse-mapping btree documentation To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:27:29 -0700 Message-ID: <147216764941.32447.12308463028876567031.stgit@birch.djwong.org> In-Reply-To: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> References: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167654 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 27664 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 BSF_SC5_SA210e Custom Rule SA210e Add chapters on the operation of the reverse mapping btree and future things we could do with rmap data. v2: Add magic number to the table. Signed-off-by: Darrick J. Wong --- .../allocation_groups.asciidoc | 31 +- design/XFS_Filesystem_Structure/docinfo.xml | 17 + .../journaling_log.asciidoc | 122 ++++++++ design/XFS_Filesystem_Structure/magic.asciidoc | 3 .../reconstruction.asciidoc | 53 +++ design/XFS_Filesystem_Structure/rmapbt.asciidoc | 305 ++++++++++++++++++++ .../xfs_filesystem_structure.asciidoc | 4 7 files changed, 526 insertions(+), 9 deletions(-) create mode 100644 design/XFS_Filesystem_Structure/reconstruction.asciidoc create mode 100644 design/XFS_Filesystem_Structure/rmapbt.asciidoc diff --git a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc index 55bbc50..9fcf975 100644 --- a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc +++ b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc @@ -12,6 +12,7 @@ Each AG has the following characteristics: * A super block describing overall filesystem info * Free space management * Inode allocation and tracking + * Reverse block-mapping index (optional) Having multiple AGs allows XFS to handle most operations in parallel without degrading performance as the number of concurrent accesses increases. @@ -379,6 +380,12 @@ it doesn't understand the flag. Free inode B+tree. Each allocation group contains a B+tree to track inode chunks containing free inodes. This is a performance optimization to reduce the time required to allocate inodes. + +| +XFS_SB_FEAT_RO_COMPAT_RMAPBT+ | +Reverse mapping B+tree. Each allocation group contains a B+tree containing +records mapping AG blocks to their owners. See the section about +xref:Reconstruction[reconstruction] for more details. + |===== *sb_features_incompat*:: @@ -529,9 +536,7 @@ struct xfs_agf { __be32 agf_seqno; __be32 agf_length; __be32 agf_roots[XFS_BTNUM_AGF]; - __be32 agf_spare0; __be32 agf_levels[XFS_BTNUM_AGF]; - __be32 agf_spare1; __be32 agf_flfirst; __be32 agf_fllast; __be32 agf_flcount; @@ -541,7 +546,9 @@ struct xfs_agf { /* version 5 filesystem fields start here */ uuid_t agf_uuid; - __be64 agf_spare64[16]; + __be32 agf_rmap_blocks; + __be32 __pad; + __be64 agf_spare64[15]; /* unlogged fields, written during buffer writeback. */ __be64 agf_lsn; @@ -550,9 +557,10 @@ struct xfs_agf { }; ---- -The rest of the bytes in the sector are zeroed. +XFS_BTNUM_AGF+ is set to 2: -index 0 for the free space B+tree indexed by block number; and index 1 for the -free space B+tree indexed by extent size. +The rest of the bytes in the sector are zeroed. +XFS_BTNUM_AGF+ is set to 3: +index 0 for the free space B+tree indexed by block number; index 1 for the free +space B+tree indexed by extent size; and index 2 for the reverse-mapping +B+tree. *agf_magicnum*:: Specifies the magic number for the AGF sector: ``XAGF'' (0x58414746). @@ -570,11 +578,13 @@ this could be less than the +sb_agblocks+ value. It is this value that should be used to determine the size of the AG. *agf_roots*:: -Specifies the block number for the root of the two free space B+trees. +Specifies the block number for the root of the two free space B+trees and the +reverse-mapping B+tree, if enabled. *agf_levels*:: -Specifies the level or depth of the two free space B+trees. For a fresh AG, this -will be one, and the ``roots'' will point to a single leaf of level 0. +Specifies the level or depth of the two free space B+trees and the +reverse-mapping B+tree, if enabled. For a fresh AG, this value will be one, +and the ``roots'' will point to a single leaf of level 0. *agf_flfirst*:: Specifies the index of the first ``free list'' block. Free lists are covered in @@ -600,6 +610,9 @@ used if the +XFS_SB_VERSION2_LAZYSBCOUNTBIT+ bit is set in +sb_features2+. The UUID of this block, which must match either +sb_uuid+ or +sb_meta_uuid+ depending on which features are set. +*agf_rmap_blocks*:: +The size of the reverse mapping B+tree in this allocation group, in blocks. + *agf_spare64*:: Empty space in the logged part of the AGF sector, for use for future features. diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml index cc5596d..44f944a 100644 --- a/design/XFS_Filesystem_Structure/docinfo.xml +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -122,4 +122,21 @@ + + 3.141 + June 2016 + + Darrick + Wong + + + + + Document the reverse-mapping btree. + Move the b+tree info to a separate chapter. + Discuss overlapping interval b+trees. + Discuss new log items for atomic updates. + + + diff --git a/design/XFS_Filesystem_Structure/journaling_log.asciidoc b/design/XFS_Filesystem_Structure/journaling_log.asciidoc index 67d209f..78ce436 100644 --- a/design/XFS_Filesystem_Structure/journaling_log.asciidoc +++ b/design/XFS_Filesystem_Structure/journaling_log.asciidoc @@ -209,6 +209,8 @@ magic number to distinguish themselves. Buffer data items only appear after | +XFS_LI_DQUOT+ | 0x123d | xref:Quota_Update_Log_Item[Update Quota] | +XFS_LI_QUOTAOFF+ | 0x123e | xref:Quota_Off_Log_Item[Quota Off] | +XFS_LI_ICREATE+ | 0x123f | xref:Inode_Create_Log_Item[Inode Creation] +| +XFS_LI_RUI+ | 0x1240 | xref:RUI_Log_Item[Reverse Mapping Update Intent] +| +XFS_LI_RUD+ | 0x1241 | xref:RUD_Log_Item[Reverse Mapping Update Done] |===== [[Log_Transaction_Headers]] @@ -386,6 +388,126 @@ Variable-length array of extents to be freed. The array length is given by +xfs_extent_32_t+; this can be determined from the log item size (+oh_len+) and the number of extents (+efd_nextents+). +[[RUI_Log_Item]] +=== Reverse Mapping Updates Intent + +The next two operation types work together to handle deferred reverse mapping +updates. Naturally, the mappings to be updated can be expressed in terms of +mapping extents: + +[source, c] +---- +struct xfs_map_extent { + __uint64_t me_owner; + __uint64_t me_startblock; + __uint64_t me_startoff; + __uint32_t me_len; + __uint32_t me_flags; +}; +---- + +*me_owner*:: +Owner of this reverse mapping. See the values in the section about +xref:Reverse_Mapping_Btree[reverse mapping] for more information. + +*me_startblock*:: +Filesystem block of this mapping. + +*me_startoff*:: +Logical block offset of this mapping. + +*me_len*:: +The length of this mapping. + +*me_flags*:: +The lower byte of this field is a type code indicating what sort of +reverse mapping operation we want. The upper three bytes are flag bits. + +.Reverse mapping update log intent types +[options="header"] +|===== +| Value | Description +| +XFS_RMAP_EXTENT_MAP+ | Add a reverse mapping for file data. +| +XFS_RMAP_EXTENT_MAP_SHARED+ | Add a reverse mapping for file data for a file with shared blocks. +| +XFS_RMAP_EXTENT_UNMAP+ | Remove a reverse mapping for file data. +| +XFS_RMAP_EXTENT_UNMAP_SHARED+ | Remove a reverse mapping for file data for a file with shared blocks. +| +XFS_RMAP_EXTENT_CONVERT+ | Convert a reverse mapping for file data between unwritten and normal. +| +XFS_RMAP_EXTENT_CONVERT_SHARED+ | Convert a reverse mapping for file data between unwritten and normal for a file with shared blocks. +| +XFS_RMAP_EXTENT_ALLOC+ | Add a reverse mapping for non-file data. +| +XFS_RMAP_EXTENT_FREE+ | Remove a reverse mapping for non-file data. +|===== + +.Reverse mapping update log intent flags +[options="header"] +|===== +| Value | Description +| +XFS_RMAP_EXTENT_ATTR_FORK+ | Extent is for the attribute fork. +| +XFS_RMAP_EXTENT_BMBT_BLOCK+ | Extent is for a block mapping btree block. +| +XFS_RMAP_EXTENT_UNWRITTEN+ | Extent is unwritten. +|===== + +The ``rmap update intent'' operation comes first; it tells the log that XFS +wants to update some reverse mappings. This record is crucial for correct log +recovery because it enables us to spread a complex metadata update across +multiple transactions while ensuring that a crash midway through the complex +update will be replayed fully during log recovery. + +[source, c] +---- +struct xfs_rui_log_format { + __uint16_t rui_type; + __uint16_t rui_size; + __uint32_t rui_nextents; + __uint64_t rui_id; + struct xfs_map_extent rui_extents[1]; +}; +---- + +*rui_type*:: +The signature of an RUI operation, 0x1240. This value is in host-endian order, +not big-endian like the rest of XFS. + +*rui_size*:: +Size of this log item. Should be 1. + +*rui_nextents*:: +Number of reverse mappings. + +*rui_id*:: +A 64-bit number that binds the corresponding RUD log item to this RUI log item. + +*rui_extents*:: +Variable-length array of reverse mappings to update. + +[[RUD_Log_Item]] +=== Completion of Reverse Mapping Updates + +The ``reverse mapping update done'' operation complements the ``reverse mapping +update intent'' operation. This second operation indicates that the update +actually happened, so that log recovery needn't replay the update. The RUD and +the actual updates are typically found in a new transaction following the +transaction in which the RUI was logged. + +[source, c] +---- +struct xfs_rud_log_format { + __uint16_t rud_type; + __uint16_t rud_size; + __uint32_t __pad; + __uint64_t rud_rui_id; +}; +---- + +*rud_type*:: +The signature of an RUD operation, 0x1241. This value is in host-endian order, +not big-endian like the rest of XFS. + +*rud_size*:: +Size of this log item. Should be 1. + +*rud_rui_id*:: +A 64-bit number that binds the corresponding RUI log item to this RUD log item. + [[Inode_Log_Item]] === Inode Updates diff --git a/design/XFS_Filesystem_Structure/magic.asciidoc b/design/XFS_Filesystem_Structure/magic.asciidoc index 301cfa0..10fd15f 100644 --- a/design/XFS_Filesystem_Structure/magic.asciidoc +++ b/design/XFS_Filesystem_Structure/magic.asciidoc @@ -44,6 +44,7 @@ relevant chapters. Magic numbers tend to have consistent locations: | +XFS_ATTR_LEAF_MAGIC+ | 0xfbee | | xref:Leaf_Attributes[Leaf Attribute] | +XFS_ATTR3_LEAF_MAGIC+ | 0x3bee | | xref:Leaf_Attributes[Leaf Attribute], v5 only | +XFS_ATTR3_RMT_MAGIC+ | 0x5841524d | XARM | xref:Remote_Values[Remote Attribute Value], v5 only +| +XFS_RMAP_CRC_MAGIC+ | 0x524d4233 | RMB3 | xref:Reverse_Mapping_Btree[Reverse Mapping B+tree], v5 only |===== The magic numbers for log items are at offset zero in each log item, but items @@ -61,6 +62,8 @@ are not aligned to blocks. | +XFS_LI_DQUOT+ | 0x123d | | xref:Quota_Update_Log_Item[Update Quota Log Item] | +XFS_LI_QUOTAOFF+ | 0x123e | | xref:Quota_Off_Log_Item[Quota Off Log Item] | +XFS_LI_ICREATE+ | 0x123f | | xref:Inode_Create_Log_Item[Inode Creation Log Item] +| +XFS_LI_RUI+ | 0x1240 | | xref:RUI_Log_Item[Reverse Mapping Update Intent] +| +XFS_LI_RUD+ | 0x1241 | | xref:RUD_Log_Item[Reverse Mapping Update Done] |===== = Theoretical Limits diff --git a/design/XFS_Filesystem_Structure/reconstruction.asciidoc b/design/XFS_Filesystem_Structure/reconstruction.asciidoc new file mode 100644 index 0000000..f172e0f --- /dev/null +++ b/design/XFS_Filesystem_Structure/reconstruction.asciidoc @@ -0,0 +1,53 @@ +[[Reconstruction]] += Metadata Reconstruction + +[NOTE] +This is a theoretical discussion of how reconstruction could work; none of this +is implemented as of 2015. + +A simple UNIX filesystem can be thought of in terms of a directed acyclic graph. +To a first approximation, there exists a root directory node, which points to +other nodes. Those other nodes can themselves be directories or they can be +files. Each file, in turn, points to data blocks. + +XFS adds a few more details to this picture: + +* The real root(s) of an XFS filesystem are the allocation group headers +(superblock, AGF, AGI, AGFL). +* Each allocation group’s headers point to various per-AG B+trees (free space, +inode, free inodes, free list, etc.) +* The free space B+trees point to unused extents; +* The inode B+trees point to blocks containing inode chunks; +* All superblocks point to the root directory and the log; +* Hardlinks mean that multiple directories can point to a single file node; +* File data block pointers are indexed by file offset; +* Files and directories can have a second collection of pointers to data blocks +which contain extended attributes; +* Large directories require multiple data blocks to store all the subpointers; +* Still larger directories use high-offset data blocks to store a B+tree of +hashes to directory entries; +* Large extended attribute forks similarly use high-offset data blocks to store +a B+tree of hashes to attribute keys; and +* Symbolic links can point to data blocks. + +The beauty of this massive graph structure is that under normal circumstances, +everything known to the filesystem is discoverable (access controls +notwithstanding) from the root. The major weakness of this structure of course +is that breaking a edge in the graph can render entire subtrees inaccessible. ++xfs_repair+ “recovers†from broken directories by scanning for unlinked inodes +and connecting them to +/lost+found+, but this isn’t sufficiently general to +recover from breaks in other parts of the graph structure. Wouldn’t it be +useful to have back pointers as a secondary data structure? The current repair +strategy is to reconstruct whatever can be rebuilt, but to scrap anything that +doesn't check out. + +The xref:Reverse_Mapping_Btree[reverse-mapping B+tree] fills in part of the +puzzle. Since it contains copies of every entry in each inode’s data and +attribute forks, we can fix a corrupted block map with these records. +Furthermore, if the inode B+trees become corrupt, it is possible to visit all +inode chunks using the reverse-mapping data. Should XFS ever gain the ability +to store parent directory information in each inode, it also becomes possible +to resurrect damaged directory trees, which should reduce the complaints about +inodes ending up in +/lost+found+. Everything else in the per-AG primary +metadata can already be reconstructed via +xfs_repair+. Hopefully, +reconstruction will not turn out to be a fool's errand. diff --git a/design/XFS_Filesystem_Structure/rmapbt.asciidoc b/design/XFS_Filesystem_Structure/rmapbt.asciidoc new file mode 100644 index 0000000..a8a210b --- /dev/null +++ b/design/XFS_Filesystem_Structure/rmapbt.asciidoc @@ -0,0 +1,305 @@ +[[Reverse_Mapping_Btree]] +== Reverse-Mapping B+tree + +[NOTE] +This data structure is under construction! Details may change. + +If the feature is enabled, each allocation group has its own reverse +block-mapping B+tree, which grows in the free space like the free space +B+trees. As mentioned in the chapter about +xref:Reconstruction[reconstruction], this data structure is another piece of +the puzzle necessary to reconstruct the data or attribute fork of a file from +reverse-mapping records; we can also use it to double-check allocations to +ensure that we are not accidentally cross-linking blocks, which can cause +severe damage to the filesystem. + +This B+tree is only present if the +XFS_SB_FEAT_RO_COMPAT_RMAPBT+ +feature is enabled. The feature requires a version 5 filesystem. + +Each record in the reverse-mapping B+tree has the following structure: + +[source, c] +---- +struct xfs_rmap_rec { + __be32 rm_startblock; + __be32 rm_blockcount; + __be64 rm_owner; + __be64 rm_fork:1; + __be64 rm_bmbt:1; + __be64 rm_unwritten:1; + __be64 rm_unused:7; + __be64 rm_offset:54; +}; +---- + +*rm_startblock*:: +AG block number of this record. + +*rm_blockcount*:: +The length of this extent. + +*rm_owner*:: +A 64-bit number describing the owner of this extent. This is typically the +absolute inode number, but can also correspond to one of the following: + +.Special owner values +[options="header"] +|===== +| Value | Description +| +XFS_RMAP_OWN_NULL+ | No owner. This should never appear on disk. +| +XFS_RMAP_OWN_UNKNOWN+ | Unknown owner; for EFI recovery. This should never appear on disk. +| +XFS_RMAP_OWN_FS+ | Allocation group headers +| +XFS_RMAP_OWN_LOG+ | XFS log blocks +| +XFS_RMAP_OWN_AG+ | Per-allocation group B+tree blocks. This means free space B+tree blocks, blocks on the freelist, and reverse-mapping B+tree blocks. +| +XFS_RMAP_OWN_INOBT+ | Per-allocation group inode B+tree blocks. This includes free inode B+tree blocks. +| +XFS_RMAP_OWN_INODES+ | Inode chunks +|===== + +*rm_fork*:: +If +rm_owner+ describes an inode, this can be 1 if this record is for an +attribute fork. + +*rm_bmbt*:: +If +rm_owner+ describes an inode, this can be 1 to signify that this record is +for a block map B+tree block. In this case, +rm_offset+ has no meaning. + +*rm_unwritten*:: +A flag indicating that the extent is unwritten. This corresponds to the flag in +the xref:Data_Extents[extent record] format which means +XFS_EXT_UNWRITTEN+. + +*rm_offset*:: +The 54-bit logical file block offset, if +rm_owner+ describes an inode. +Meaningless otherwise. + +[NOTE] +The single-bit flag values +rm_unwritten+, +rm_fork+, and +rm_bmbt+ are packed +into the larger fields in the C structure definition. + +The key has the following structure: + +[source, c] +---- +struct xfs_rmap_key { + __be32 rm_startblock; + __be64 rm_owner; + __be64 rm_fork:1; + __be64 rm_bmbt:1; + __be64 rm_reserved:1; + __be64 rm_unused:7; + __be64 rm_offset:54; +}; +---- + +For the reverse-mapping B+tree on a filesystem that supports sharing of file +data blocks, the key definition is larger than the usual AG block number. On a +classic XFS filesystem, each block has only one owner, which means that ++rm_startblock+ is sufficient to uniquely identify each record. However, +shared block support (reflink) on XFS breaks that assumption; now filesystem +blocks can be linked to any logical block offset of any file inode. Therefore, +the key must include the owner and offset information to preserve the 1 to 1 +relation between key and record. + +* As the reference counting is AG relative, all the block numbers are only +32-bits. +* The +bb_magic+ value is "RMB3" (0x524d4233). +* The +xfs_btree_sblock_t+ header is used for intermediate B+tree node as well +as the leaves. +* Each pointer is associated with two keys. The first of these is the "low +key", which is the key of the smallest record accessible through the pointer. +This low key has the same meaning as the key in all other btrees. The second +key is the high key, which is the maximum of the largest key that can be used +to access a given record underneath the pointer. Recall that each record +in the reverse mapping b+tree describes an interval of physical blocks mapped +to an interval of logical file block offsets; therefore, it makes sense that +a range of keys can be used to find to a record. + +=== xfs_db rmapbt Example + +This example shows a reverse-mapping B+tree from a freshly populated root +filesystem: + +---- +xfs_db> agf 0 +xfs_db> addr rmaproot +xfs_db> p +magic = 0x524d4233 +level = 1 +numrecs = 43 +leftsib = null +rightsib = null +bno = 56 +lsn = 0x3000004c8 +uuid = 1977221d-8345-464e-b1f4-aa2ea36895f4 +owner = 0 +crc = 0x7cf8be6f (correct) +keys[1-43] = [startblock,owner,offset] +keys[1-43] = [startblock,owner,offset,attrfork,bmbtblock,startblock_hi,owner_hi, + offset_hi,attrfork_hi,bmbtblock_hi] + 1:[0,-3,0,0,0,351,4418,66,0,0] + 2:[417,285,0,0,0,827,4419,2,0,0] + 3:[829,499,0,0,0,2352,573,55,0,0] + 4:[1292,710,0,0,0,32168,262923,47,0,0] + 5:[32215,-5,0,0,0,34655,2365,3411,0,0] + 6:[34083,1161,0,0,0,34895,265220,1,0,1] + 7:[34896,256191,0,0,0,36522,-9,0,0,0] + ... + 41:[50998,326734,0,0,0,51430,-5,0,0,0] + 42:[51431,327010,0,0,0,51600,325722,11,0,0] + 43:[51611,327112,0,0,0,94063,23522,28375272,0,0] +ptrs[1-43] = 1:5 2:6 3:8 4:9 5:10 6:11 7:418 ... 41:46377 42:48784 43:49522 +---- + +We arbitrarily pick pointer 17 to traverse downwards: + +---- +xfs_db> addr ptrs[17] +xfs_db> p +magic = 0x524d4233 +level = 0 +numrecs = 168 +leftsib = 36284 +rightsib = 37617 +bno = 294760 +lsn = 0x200002761 +uuid = 1977221d-8345-464e-b1f4-aa2ea36895f4 +owner = 0 +crc = 0x2dad3fbe (correct) +recs[1-168] = [startblock,blockcount,owner,offset,extentflag,attrfork,bmbtblock] + 1:[40326,1,259615,0,0,0,0] 2:[40327,1,-5,0,0,0,0] + 3:[40328,2,259618,0,0,0,0] 4:[40330,1,259619,0,0,0,0] + ... + 127:[40540,1,324266,0,0,0,0] 128:[40541,1,324266,8388608,0,0,0] + 129:[40542,2,324266,1,0,0,0] 130:[40544,32,-7,0,0,0,0] +---- + +Several interesting things pop out here. The first record shows that inode +259,615 has mapped AG block 40,326 at offset 0. We confirm this by looking at +the block map for that inode: + +---- +xfs_db> inode 259615 +xfs_db> bmap +data offset 0 startblock 40326 (0/40326) count 1 flag 0 +---- + +Next, notice records 127 and 128, which describe neighboring AG blocks that are +mapped to non-contiguous logical blocks in inode 324,266. Given the logical +offset of 8,388,608 we surmise that this is a leaf directory, but let us +confirm: + +---- +xfs_db> inode 324266 +xfs_db> p core.mode +core.mode = 040755 +xfs_db> bmap +data offset 0 startblock 40540 (0/40540) count 1 flag 0 +data offset 1 startblock 40542 (0/40542) count 2 flag 0 +data offset 3 startblock 40576 (0/40576) count 1 flag 0 +data offset 8388608 startblock 40541 (0/40541) count 1 flag 0 +xfs_db> p core.mode +core.mode = 0100644 +xfs_db> dblock 0 +xfs_db> p dhdr.hdr.magic +dhdr.hdr.magic = 0x58444433 +xfs_db> dblock 8388608 +xfs_db> p lhdr.info.hdr.magic +lhdr.info.hdr.magic = 0x3df1 +---- + +Indeed, this inode 324,266 appears to be a leaf directory, as it has regular +directory data blocks at low offsets, and a single leaf block. + +Notice further the two reverse-mapping records with negative owners. An owner +of -7 corresponds to +XFS_RMAP_OWN_INODES+, which is an inode chunk, and an +owner code of -5 corresponds to +XFS_RMAP_OWN_AG+, which covers free space +B+trees and free space. Let's see if block 40,544 is part of an inode chunk: + +---- +xfs_db> blockget +xfs_db> fsblock 40544 +xfs_db> blockuse +block 40544 (0/40544) type inode +xfs_db> stack +1: + byte offset 166068224, length 4096 + buffer block 324352 (fsbno 40544), 8 bbs + inode 324266, dir inode 324266, type data +xfs_db> type inode +xfs_db> p +core.magic = 0x494e +---- + +Our suspicions are confirmed. Let's also see if 40,327 is part of a free space +tree: + +---- +xfs_db> fsblock 40327 +xfs_db> blockuse +block 40327 (0/40327) type btrmap +xfs_db> type rmapbt +xfs_db> p +magic = 0x524d4233 +---- + +As you can see, the reverse block-mapping B+tree is an important secondary +metadata structure, which can be used to reconstruct damaged primary metadata. +Now let's look at an extend rmap btree: + +---- +xfs_db> agf 0 +xfs_db> addr rmaproot +xfs_db> p +magic = 0x34524d42 +level = 1 +numrecs = 5 +leftsib = null +rightsib = null +bno = 6368 +lsn = 0x100000d1b +uuid = 400f0928-6b88-4c37-af1e-cef1f8911f3f +owner = 0 +crc = 0x8d4ace05 (correct) +keys[1-5] = [startblock,owner,offset,attrfork,bmbtblock,startblock_hi,owner_hi,offset_hi,attrfork_hi,bmbtblock_hi] +1:[0,-3,0,0,0,705,132,681,0,0] +2:[24,5761,0,0,0,548,5761,524,0,0] +3:[24,5929,0,0,0,380,5929,356,0,0] +4:[24,6097,0,0,0,212,6097,188,0,0] +5:[24,6277,0,0,0,807,-7,0,0,0] +ptrs[1-5] = 1:5 2:771 3:9 4:10 5:11 +---- + +The second pointer stores both the low key [24,5761,0,0,0] and the high key +[548,5761,524,0,0], which means that we can expect block 771 to contain records +starting at physical block 24, inode 5761, offset zero; and that one of the +records can be used to find a reverse mapping for physical block 548, inode +5761, and offset 524: + +---- +xfs_db> addr ptrs[2] +xfs_db> p +magic = 0x34524d42 +level = 0 +numrecs = 168 +leftsib = 5 +rightsib = 9 +bno = 6168 +lsn = 0x100000d1b +uuid = 400f0928-6b88-4c37-af1e-cef1f8911f3f +owner = 0 +crc = 0xd58eff0e (correct) +recs[1-168] = [startblock,blockcount,owner,offset,extentflag,attrfork,bmbtblock] +1:[24,525,5761,0,0,0,0] +2:[24,524,5762,0,0,0,0] +3:[24,523,5763,0,0,0,0] +... +166:[24,360,5926,0,0,0,0] +167:[24,359,5927,0,0,0,0] +168:[24,358,5928,0,0,0,0] +---- + +Observe that the first record in the block starts at physical block 24, inode +5761, offset zero, just as we expected. Note that this first record is also +indexed by the highest key as provided in the node block; physical block 548, +inode 5761, offset 524 is the very last block mapped by this record. Furthermore, +note that record 168, despite being the last record in this block, has a lower +maximum key (physical block 382, inode 5928, offset 23) than the first record. diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc index 62502b3..1b8658d 100644 --- a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -48,6 +48,8 @@ include::overview.asciidoc[] include::metadata_integrity.asciidoc[] +include::reconstruction.asciidoc[] + include::common_types.asciidoc[] include::magic.asciidoc[] @@ -66,6 +68,8 @@ include::btrees.asciidoc[] include::allocation_groups.asciidoc[] +include::rmapbt.asciidoc[] + include::journaling_log.asciidoc[] include::internal_inodes.asciidoc[] From darrick.wong@oracle.com Thu Aug 25 18:27:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7B8B27CBB for ; Thu, 25 Aug 2016 18:27:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0EB79AC001 for ; Thu, 25 Aug 2016 16:27:43 -0700 (PDT) X-ASG-Debug-ID: 1472167660-0bf8155c751e5cb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id CpUtEWzLwSx0Wvox (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:27:40 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNRcol005954 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:27:39 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNRcCM025009 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:27:38 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNRb76011540; Thu, 25 Aug 2016 23:27:38 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:27:37 -0700 Subject: [PATCH 6/7] xfsdocs: document refcount btree and reflink From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 6/7] xfsdocs: document refcount btree and reflink To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:27:35 -0700 Message-ID: <147216765581.32447.11893404900649503970.stgit@birch.djwong.org> In-Reply-To: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> References: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167660 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 26561 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Document the reference count btree and talk a little bit about how the reflink feature uses it. Signed-off-by: Darrick J. Wong --- .../allocation_groups.asciidoc | 25 ++- .../XFS_Filesystem_Structure/directories.asciidoc | 1 design/XFS_Filesystem_Structure/docinfo.xml | 2 .../journaling_log.asciidoc | 192 ++++++++++++++++++++ design/XFS_Filesystem_Structure/magic.asciidoc | 5 + .../XFS_Filesystem_Structure/ondisk_inode.asciidoc | 25 ++- .../XFS_Filesystem_Structure/refcountbt.asciidoc | 145 +++++++++++++++ design/XFS_Filesystem_Structure/reflink.asciidoc | 40 ++++ design/XFS_Filesystem_Structure/rmapbt.asciidoc | 2 .../xfs_filesystem_structure.asciidoc | 4 10 files changed, 435 insertions(+), 6 deletions(-) create mode 100644 design/XFS_Filesystem_Structure/refcountbt.asciidoc create mode 100644 design/XFS_Filesystem_Structure/reflink.asciidoc diff --git a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc index 9fcf975..cafa8b7 100644 --- a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc +++ b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc @@ -13,6 +13,7 @@ Each AG has the following characteristics: * Free space management * Inode allocation and tracking * Reverse block-mapping index (optional) + * Data block reference count index (optional) Having multiple AGs allows XFS to handle most operations in parallel without degrading performance as the number of concurrent accesses increases. @@ -386,6 +387,12 @@ Reverse mapping B+tree. Each allocation group contains a B+tree containing records mapping AG blocks to their owners. See the section about xref:Reconstruction[reconstruction] for more details. +| +XFS_SB_FEAT_RO_COMPAT_REFLINK+ | +Reference count B+tree. Each allocation group contains a B+tree to track the +reference counts of AG blocks. This enables files to share data blocks safely. +See the section about xref:Reflink_Deduplication[reflink and deduplication] for +more details. + |===== *sb_features_incompat*:: @@ -547,8 +554,10 @@ struct xfs_agf { /* version 5 filesystem fields start here */ uuid_t agf_uuid; __be32 agf_rmap_blocks; - __be32 __pad; - __be64 agf_spare64[15]; + __be32 agf_refcount_blocks; + __be32 agf_refcount_root; + __be32 agf_refcount_level; + __be64 agf_spare64[14]; /* unlogged fields, written during buffer writeback. */ __be64 agf_lsn; @@ -613,6 +622,15 @@ depending on which features are set. *agf_rmap_blocks*:: The size of the reverse mapping B+tree in this allocation group, in blocks. +*agf_refcount_blocks*:: +The size of the reference count B+tree in this allocation group, in blocks. + +*agf_refcount_root*:: +Block number for the root of the reference count B+tree, if enabled. + +*agf_refcount_root*:: +Depth of the reference count B+tree, if enabled. + *agf_spare64*:: Empty space in the logged part of the AGF sector, for use for future features. @@ -1243,4 +1261,5 @@ By placing the real time device (and the journal) on separate high-performance storage devices, it is possible to reduce most of the unpredictability in I/O response times that come from metadata operations. -None of the XFS per-AG B+trees are involved with real time files. +None of the XFS per-AG B+trees are involved with real time files. It is not +possible for real time files to share data blocks. diff --git a/design/XFS_Filesystem_Structure/directories.asciidoc b/design/XFS_Filesystem_Structure/directories.asciidoc index bccf912..1758c4e 100644 --- a/design/XFS_Filesystem_Structure/directories.asciidoc +++ b/design/XFS_Filesystem_Structure/directories.asciidoc @@ -1419,6 +1419,7 @@ The hash value of a particular record. The directory/attribute logical block containing all entries up to the corresponding hash value. +// * The freeindex's +bests+ array starts from the end of the block and grows to the start of the block. diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml index 44f944a..f5e62bc 100644 --- a/design/XFS_Filesystem_Structure/docinfo.xml +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -136,6 +136,8 @@ Move the b+tree info to a separate chapter. Discuss overlapping interval b+trees. Discuss new log items for atomic updates. + Document the reference-count btree. + Discuss block sharing, reflink, & deduplication. diff --git a/design/XFS_Filesystem_Structure/journaling_log.asciidoc b/design/XFS_Filesystem_Structure/journaling_log.asciidoc index 78ce436..0aec036 100644 --- a/design/XFS_Filesystem_Structure/journaling_log.asciidoc +++ b/design/XFS_Filesystem_Structure/journaling_log.asciidoc @@ -211,6 +211,10 @@ magic number to distinguish themselves. Buffer data items only appear after | +XFS_LI_ICREATE+ | 0x123f | xref:Inode_Create_Log_Item[Inode Creation] | +XFS_LI_RUI+ | 0x1240 | xref:RUI_Log_Item[Reverse Mapping Update Intent] | +XFS_LI_RUD+ | 0x1241 | xref:RUD_Log_Item[Reverse Mapping Update Done] +| +XFS_LI_CUI+ | 0x1242 | xref:CUI_Log_Item[Reference Count Update Intent] +| +XFS_LI_CUD+ | 0x1243 | xref:CUD_Log_Item[Reference Count Update Done] +| +XFS_LI_BUI+ | 0x1244 | xref:BUI_Log_Item[File Block Mapping Update Intent] +| +XFS_LI_BUD+ | 0x1245 | xref:BUD_Log_Item[File Block Mapping Update Done] |===== [[Log_Transaction_Headers]] @@ -508,6 +512,194 @@ Size of this log item. Should be 1. *rud_rui_id*:: A 64-bit number that binds the corresponding RUI log item to this RUD log item. +[[CUI_Log_Item]] +=== Reference Count Updates Intent + +The next two operation types work together to handle reference count updates. +Naturally, the ranges of extents having reference count updates can be +expressed in terms of physical extents: + +[source, c] +---- +struct xfs_phys_extent { + __uint64_t pe_startblock; + __uint32_t pe_len; + __uint32_t pe_flags; +}; +---- + +*pe_startblock*:: +Filesystem block of this extent. + +*pe_len*:: +The length of this extent. + +*pe_flags*:: +The lower byte of this field is a type code indicating what sort of +reverse mapping operation we want. The upper three bytes are flag bits. + +.Reference count update log intent types +[options="header"] +|===== +| Value | Description +| +XFS_REFCOUNT_EXTENT_INCREASE+ | Increase the reference count for this extent. +| +XFS_REFCOUNT_EXTENT_DECREASE+ | Decrease the reference count for this extent. +| +XFS_REFCOUNT_EXTENT_ALLOC_COW+ | Reserve an extent for staging copy on write. +| +XFS_REFCOUNT_EXTENT_FREE_COW+ | Unreserve an extent for staging copy on write. +|===== + +The ``reference count update intent'' operation comes first; it tells the log +that XFS wants to update some reference counts. This record is crucial for +correct log recovery because it enables us to spread a complex metadata update +across multiple transactions while ensuring that a crash midway through the +complex update will be replayed fully during log recovery. + +[source, c] +---- +struct xfs_cui_log_format { + __uint16_t cui_type; + __uint16_t cui_size; + __uint32_t cui_nextents; + __uint64_t cui_id; + struct xfs_map_extent cui_extents[1]; +}; +---- + +*cui_type*:: +The signature of an CUI operation, 0x1242. This value is in host-endian order, +not big-endian like the rest of XFS. + +*cui_size*:: +Size of this log item. Should be 1. + +*cui_nextents*:: +Number of reference count updates. + +*cui_id*:: +A 64-bit number that binds the corresponding RUD log item to this RUI log item. + +*cui_extents*:: +Variable-length array of reference count update information. + +[[CUD_Log_Item]] +=== Completion of Reference Count Updates + +The ``reference count update done'' operation complements the ``reference count +update intent'' operation. This second operation indicates that the update +actually happened, so that log recovery needn't replay the update. The CUD and +the actual updates are typically found in a new transaction following the +transaction in which the CUI was logged. + +[source, c] +---- +struct xfs_cud_log_format { + __uint16_t cud_type; + __uint16_t cud_size; + __uint32_t __pad; + __uint64_t cud_cui_id; +}; +---- + +*cud_type*:: +The signature of an RUD operation, 0x1243. This value is in host-endian order, +not big-endian like the rest of XFS. + +*cud_size*:: +Size of this log item. Should be 1. + +*cud_cui_id*:: +A 64-bit number that binds the corresponding CUI log item to this CUD log item. + +[[BUI_Log_Item]] +=== File Block Mapping Intent + +The next two operation types work together to handle deferred file block +mapping updates. The extents to be mapped are expressed via the ++xfs_map_extent+ structure discussed in the section about +xref:RUI_Log_Item[reverse mapping intents]. + +The lower byte of the +me_flags+ field is a type code indicating what sort of +file block mapping operation we want. The upper three bytes are flag bits. + +.File block mapping update log intent types +[options="header"] +|===== +| Value | Description +| +XFS_BMAP_EXTENT_MAP+ | Add a mapping for file data. +| +XFS_BMAP_EXTENT_UNMAP+ | Remove a mapping for file data. +|===== + +.File block mapping update log intent flags +[options="header"] +|===== +| Value | Description +| +XFS_BMAP_EXTENT_ATTR_FORK+ | Extent is for the attribute fork. +| +XFS_BMAP_EXTENT_UNWRITTEN+ | Extent is unwritten. +|===== + +The ``file block mapping update intent'' operation comes first; it tells the +log that XFS wants to map or unmap some extents in a file. This record is +crucial for correct log recovery because it enables us to spread a complex +metadata update across multiple transactions while ensuring that a crash midway +through the complex update will be replayed fully during log recovery. + +[source, c] +---- +struct xfs_bui_log_format { + __uint16_t bui_type; + __uint16_t bui_size; + __uint32_t bui_nextents; + __uint64_t bui_id; + struct xfs_map_extent bui_extents[1]; +}; +---- + +*bui_type*:: +The signature of an BUI operation, 0x1244. This value is in host-endian order, +not big-endian like the rest of XFS. + +*bui_size*:: +Size of this log item. Should be 1. + +*bui_nextents*:: +Number of file mappings. Should be 1. + +*bui_id*:: +A 64-bit number that binds the corresponding BUD log item to this BUI log item. + +*bui_extents*:: +Variable-length array of file block mappings to update. There should only +be one mapping present. + +[[BUD_Log_Item]] +=== Completion of File Block Mapping Updates + +The ``file block mapping update done'' operation complements the ``file block +mapping update intent'' operation. This second operation indicates that the +update actually happened, so that log recovery needn't replay the update. The +BUD and the actual updates are typically found in a new transaction following +the transaction in which the BUI was logged. + +[source, c] +---- +struct xfs_bud_log_format { + __uint16_t bud_type; + __uint16_t bud_size; + __uint32_t __pad; + __uint64_t bud_bui_id; +}; +---- + +*bud_type*:: +The signature of an BUD operation, 0x1245. This value is in host-endian order, +not big-endian like the rest of XFS. + +*bud_size*:: +Size of this log item. Should be 1. + +*bud_bui_id*:: +A 64-bit number that binds the corresponding BUI log item to this BUD log item. + [[Inode_Log_Item]] === Inode Updates diff --git a/design/XFS_Filesystem_Structure/magic.asciidoc b/design/XFS_Filesystem_Structure/magic.asciidoc index 10fd15f..bc172f3 100644 --- a/design/XFS_Filesystem_Structure/magic.asciidoc +++ b/design/XFS_Filesystem_Structure/magic.asciidoc @@ -45,6 +45,7 @@ relevant chapters. Magic numbers tend to have consistent locations: | +XFS_ATTR3_LEAF_MAGIC+ | 0x3bee | | xref:Leaf_Attributes[Leaf Attribute], v5 only | +XFS_ATTR3_RMT_MAGIC+ | 0x5841524d | XARM | xref:Remote_Values[Remote Attribute Value], v5 only | +XFS_RMAP_CRC_MAGIC+ | 0x524d4233 | RMB3 | xref:Reverse_Mapping_Btree[Reverse Mapping B+tree], v5 only +| +XFS_REFC_CRC_MAGIC+ | 0x52334643 | R3FC | xref:Reference_Count_Btree[Reference Count B+tree], v5 only |===== The magic numbers for log items are at offset zero in each log item, but items @@ -64,6 +65,10 @@ are not aligned to blocks. | +XFS_LI_ICREATE+ | 0x123f | | xref:Inode_Create_Log_Item[Inode Creation Log Item] | +XFS_LI_RUI+ | 0x1240 | | xref:RUI_Log_Item[Reverse Mapping Update Intent] | +XFS_LI_RUD+ | 0x1241 | | xref:RUD_Log_Item[Reverse Mapping Update Done] +| +XFS_LI_CUI+ | 0x1242 | | xref:CUI_Log_Item[Reference Count Update Intent] +| +XFS_LI_CUD+ | 0x1243 | | xref:CUD_Log_Item[Reference Count Update Done] +| +XFS_LI_BUI+ | 0x1244 | | xref:BUI_Log_Item[File Block Mapping Update Intent] +| +XFS_LI_BUD+ | 0x1245 | | xref:BUD_Log_Item[File Block Mapping Update Done] |===== = Theoretical Limits diff --git a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc index dc1fad2..4415c38 100644 --- a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc +++ b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc @@ -109,7 +109,8 @@ struct xfs_dinode_core { __be64 di_changecount; __be64 di_lsn; __be64 di_flags2; - __u8 di_pad2[16]; + __be32 di_cowextsize; + __u8 di_pad2[12]; xfs_timestamp_t di_crtime; __be64 di_ino; uuid_t di_uuid; @@ -215,7 +216,7 @@ including relevant metadata like B+trees. This does not include blocks used for extended attributes. *di_extsize*:: -Specifies the extent size for filesystems with real-time devices and an extent +Specifies the extent size for filesystems with real-time devices or an extent size hint for standard filesystems. For normal filesystems, and with directories, the +XFS_DIFLAG_EXTSZINHERIT+ flag must be set in +di_flags+ if this field is used. Inodes created in these directories will inherit the @@ -279,7 +280,7 @@ For directory inodes, new inodes inherit the +di_projid+ value. For directory inodes, symlinks cannot be created. | +XFS_DIFLAG_EXTSIZE+ | -Specifies the extent size for real-time files or a and extent size hint for regular files. +Specifies the extent size for real-time files or an extent size hint for regular files. | +XFS_DIFLAG_EXTSZINHERIT+ | For directory inodes, new inodes inherit the +di_extsize+ value. @@ -323,8 +324,26 @@ Specifies extended flags associated with a v3 inode. | +XFS_DIFLAG2_DAX+ | For a file, enable DAX to increase performance on persistent-memory storage. If set on a directory, files created in the directory will inherit this flag. +| +XFS_DIFLAG2_REFLINK+ | +This inode shares (or has shared) data blocks with another inode. +| +XFS_DIFLAG2_COWEXTSIZE+ | +For files, this is the extent size hint for copy on write operations; see ++di_cowextsize+ for details. For directories, the value in +di_cowextsize+ +will be copied to all newly created files and directories. |===== +*di_cowextsize*:: +Specifies the extent size hint for copy on write operations. When allocating +extents for a copy on write operation, the allocator will be asked to align +its allocations to either +di_cowextsize+ blocks or +di_extsize+ blocks, +whichever is greater. The +XFS_DIFLAG2_COWEXTSIZE+ flag must be set if this +field is used. If this field and its flag are set on a directory file, the +value will be copied into any files or directories created within this +directory. During a block sharing operation, this value will be copied from +the source file to the destination file if the sharing operation completely +overwrites the destination file's contents and the destination file does not +already have +di_cowextsize+ set. + *di_pad2*:: Padding for future expansion of the inode. diff --git a/design/XFS_Filesystem_Structure/refcountbt.asciidoc b/design/XFS_Filesystem_Structure/refcountbt.asciidoc new file mode 100644 index 0000000..dbbb98e --- /dev/null +++ b/design/XFS_Filesystem_Structure/refcountbt.asciidoc @@ -0,0 +1,145 @@ +[[Reference_Count_Btree]] +== Reference Count B+tree + +[NOTE] +This data structure is under construction! Details may change. + +To support the sharing of file data blocks (reflink), each allocation group has +its own reference count B+tree, which grows in the allocated space like the +inode B+trees. This data could be gleaned by performing an interval query of +the reverse-mapping B+tree, but doing so would come at a huge performance +penalty. Therefore, this data structure is a cache of computable information. + +This B+tree is only present if the +XFS_SB_FEAT_RO_COMPAT_REFLINK+ +feature is enabled. The feature requires a version 5 filesystem. + +Each record in the reference count B+tree has the following structure: + +[source, c] +---- +struct xfs_refcount_rec { + __be32 rc_startblock; + __be32 rc_blockcount; + __be32 rc_refcount; +}; +---- + +*rc_startblock*:: +AG block number of this record. + +*rc_blockcount*:: +The length of this extent. + +*rc_refcount*:: +Number of mappings of this filesystem extent. + +Node pointers are an AG relative block pointer: + +[source, c] +---- +struct xfs_refcount_key { + __be32 rc_startblock; +}; +---- + +* As the reference counting is AG relative, all the block numbers are only +32-bits. +* The +bb_magic+ value is "R3FC" (0x52334643). +* The +xfs_btree_sblock_t+ header is used for intermediate B+tree node as well +as the leaves. + +=== xfs_db refcntbt Example + +For this example, an XFS filesystem was populated with a root filesystem and +a deduplication program was run to create shared blocks: + +---- +xfs_db> agf 0 +xfs_db> addr refcntroot +xfs_db> p +magic = 0x52334643 +level = 1 +numrecs = 6 +leftsib = null +rightsib = null +bno = 36892 +lsn = 0x200004ec2 +uuid = f1f89746-e00b-49c9-96b3-ecef0f2f14ae +owner = 0 +crc = 0x75f35128 (correct) +keys[1-6] = [startblock] 1:[14] 2:[65633] 3:[65780] 4:[94571] 5:[117201] 6:[152442] +ptrs[1-6] = 1:7 2:25836 3:25835 4:18447 5:18445 6:18449 +xfs_db> addr ptrs[3] +xfs_db> p +magic = 0x52334643 +level = 0 +numrecs = 80 +leftsib = 25836 +rightsib = 18447 +bno = 51670 +lsn = 0x200004ec2 +uuid = f1f89746-e00b-49c9-96b3-ecef0f2f14ae +owner = 0 +crc = 0xc3962813 (correct) +recs[1-80] = [startblock,blockcount,refcount] + 1:[65780,1,2] 2:[65781,1,3] 3:[65785,2,2] 4:[66640,1,2] + 5:[69602,4,2] 6:[72256,16,2] 7:[72871,4,2] 8:[72879,20,2] + 9:[73395,4,2] 10:[75063,4,2] 11:[79093,4,2] 12:[86344,16,2] +---- + +Record 6 in the reference count B+tree for AG 0 indicates that the AG extent +starting at block 72,256 and running for 16 blocks has a reference count of 2. +This means that there are two files sharing the block: + +---- +xfs_db> blockget -n +xfs_db> fsblock 72256 +xfs_db> blockuse +block 72256 (0/72256) type rldata inode 25169197 +---- + +The blockuse type changes to ``rldata'' to indicate that the block is shared +data. Unfortunately, blockuse only tells us about one block owner. If we +happen to have enabled the reverse-mapping B+tree, we can use it to find all +inodes that own this block: + +---- +xfs_db> agf 0 +xfs_db> addr rmaproot +... +xfs_db> addr ptrs[3] +... +xfs_db> addr ptrs[7] +xfs_db> p +magic = 0x524d4233 +level = 0 +numrecs = 22 +leftsib = 65057 +rightsib = 65058 +bno = 291478 +lsn = 0x200004ec2 +uuid = f1f89746-e00b-49c9-96b3-ecef0f2f14ae +owner = 0 +crc = 0xed7da3f7 (correct) +recs[1-22] = [startblock,blockcount,owner,offset,extentflag,attrfork,bmbtblock] + 1:[68957,8,3201,0,0,0,0] 2:[68965,4,25260953,0,0,0,0] + ... + 18:[72232,58,3227,0,0,0,0] 19:[72256,16,25169197,24,0,0,0] + 20:[72290,75,3228,0,0,0,0] 21:[72365,46,3229,0,0,0,0] +---- + +Records 18 and 19 intersect the block 72,256; they tell us that inodes 3,227 +and 25,169,197 both claim ownership. Let us confirm this: + +---- +xfs_db> inode 25169197 +xfs_db> bmap +data offset 0 startblock 12632259 (3/49347) count 24 flag 0 +data offset 24 startblock 72256 (0/72256) count 16 flag 0 +data offset 40 startblock 12632299 (3/49387) count 18 flag 0 +xfs_db> inode 3227 +xfs_db> bmap +data offset 0 startblock 72232 (0/72232) count 58 flag 0 +---- + +Inodes 25,169,197 and 3,227 both contain mappings to block 0/72,256. diff --git a/design/XFS_Filesystem_Structure/reflink.asciidoc b/design/XFS_Filesystem_Structure/reflink.asciidoc new file mode 100644 index 0000000..8f52b90 --- /dev/null +++ b/design/XFS_Filesystem_Structure/reflink.asciidoc @@ -0,0 +1,40 @@ +[[Reflink_Deduplication]] += Sharing Data Blocks + +On a traditional filesystem, there is a 1:1 mapping between a logical block +offset in a file and a physical block on disk, which is to say that physical +blocks are not shared. However, there exist various use cases for being able +to share blocks between files -- deduplicating files saves space on archival +systems; creating space-efficient clones of disk images for virtual machines +and containers facilitates efficient datacenters; and deferring the payment of +the allocation cost of a file system tree copy as long as possible makes +regular work faster. In all of these cases, a write to one of the shared +copies *must* not affect the other shared copies, which means that writes to +shared blocks must employ a copy-on-write strategy. Sharing blocks in this +manner is commonly referred to as ``reflinking''. + +XFS implements block sharing in a fairly straightforward manner. All existing +data fork structures remain unchanged, save for the addition of a +per-allocation group xref:Reference_Count_Btree[reference count B+tree]. This +data structure tracks reference counts for all shared physical blocks, with a +few rules to maintain compatibility with existing code: If a block is free, it +will be tracked in the free space B+trees. If a block is owned by a single +file, it appears in neither the free space nor the reference count B+trees. If +a block is shared, it will appear in the reference count B+tree with a +reference count >= 2. The first two cases are established precedent in XFS, so +the third case is the only behavioral change. + +When a filesystem block is shared, the block mapping in the destination file is +updated to point to that filesystem block and the reference count B+tree records +are updated to reflect the increased refcount. If a shared block is written, a +new block will be allocated, the dirty data written to this new block, and the +file's block mapping updated to point to the new block. If a shared block is +unmapped, the reference count records are updated to reflect the decreased +refcount and the block is also freed if its reference count becomes zero. This +enables users to create space efficient clones of disk images and to copy +filesystem subtrees quickly, using the standard Linux coreutils packages. + +Deduplication employs the same mechanism to share blocks and copy them at write +time. However, the kernel confirms that the contents of both files are +identical before updating the destination file's mapping. This enables XFS to +be used by userspace deduplication programs such as +duperemove+. diff --git a/design/XFS_Filesystem_Structure/rmapbt.asciidoc b/design/XFS_Filesystem_Structure/rmapbt.asciidoc index a8a210b..0ec72c1 100644 --- a/design/XFS_Filesystem_Structure/rmapbt.asciidoc +++ b/design/XFS_Filesystem_Structure/rmapbt.asciidoc @@ -53,6 +53,8 @@ absolute inode number, but can also correspond to one of the following: | +XFS_RMAP_OWN_AG+ | Per-allocation group B+tree blocks. This means free space B+tree blocks, blocks on the freelist, and reverse-mapping B+tree blocks. | +XFS_RMAP_OWN_INOBT+ | Per-allocation group inode B+tree blocks. This includes free inode B+tree blocks. | +XFS_RMAP_OWN_INODES+ | Inode chunks +| +XFS_RMAP_OWN_REFC+ | Per-allocation group refcount B+tree blocks. This will be used for reflink support. +| +XFS_RMAP_OWN_COW+ | Blocks that have been reserved for a copy-on-write operation that has not completed. |===== *rm_fork*:: diff --git a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc index 1b8658d..7916fbe 100644 --- a/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc +++ b/design/XFS_Filesystem_Structure/xfs_filesystem_structure.asciidoc @@ -48,6 +48,8 @@ include::overview.asciidoc[] include::metadata_integrity.asciidoc[] +include::reflink.asciidoc[] + include::reconstruction.asciidoc[] include::common_types.asciidoc[] @@ -70,6 +72,8 @@ include::allocation_groups.asciidoc[] include::rmapbt.asciidoc[] +include::refcountbt.asciidoc[] + include::journaling_log.asciidoc[] include::internal_inodes.asciidoc[] From darrick.wong@oracle.com Thu Aug 25 18:27:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4F8257CBD for ; Thu, 25 Aug 2016 18:27:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 13C598F8033 for ; Thu, 25 Aug 2016 16:27:51 -0700 (PDT) X-ASG-Debug-ID: 1472167668-0bf57c55b41c74f0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id dEjiwVcGGwAnVPSu (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:27:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNRl07006053 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:27:47 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNRkdi025169 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:27:46 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNRjdG013538; Thu, 25 Aug 2016 23:27:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:27:45 -0700 Subject: [PATCH 7/7] xfsdocs: document the realtime reverse mapping btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 7/7] xfsdocs: document the realtime reverse mapping btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:27:42 -0700 Message-ID: <147216766221.32447.9777486170830928374.stgit@birch.djwong.org> In-Reply-To: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> References: <147216761636.32447.4229640006064129056.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167668 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13214 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- .../allocation_groups.asciidoc | 8 + design/XFS_Filesystem_Structure/docinfo.xml | 14 + .../internal_inodes.asciidoc | 2 design/XFS_Filesystem_Structure/magic.asciidoc | 1 .../XFS_Filesystem_Structure/ondisk_inode.asciidoc | 6 - design/XFS_Filesystem_Structure/rtrmapbt.asciidoc | 234 ++++++++++++++++++++ 6 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 design/XFS_Filesystem_Structure/rtrmapbt.asciidoc diff --git a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc index cafa8b7..7ba636a 100644 --- a/design/XFS_Filesystem_Structure/allocation_groups.asciidoc +++ b/design/XFS_Filesystem_Structure/allocation_groups.asciidoc @@ -105,6 +105,7 @@ struct xfs_sb xfs_ino_t sb_pquotino; xfs_lsn_t sb_lsn; uuid_t sb_meta_uuid; + xfs_ino_t sb_rrmapino; }; ---- *sb_magicnum*:: @@ -449,6 +450,13 @@ If the +XFS_SB_FEAT_INCOMPAT_META_UUID+ feature is set, then the UUID field in all metadata blocks must match this UUID. If not, the block header UUID field must match +sb_uuid+. +*sb_rrmapino*:: +If the +XFS_SB_FEAT_COMPAT_RMAPBT+ feature is set and a real-time +device is present (+sb_rblocks+ > 0), this field points to an inode +that contains the root to the +xref:Real_time_Reverse_Mapping_Btree[Real-Time Reverse Mapping B+tree]. +This field is zero otherwise. + === xfs_db Superblock Example A filesystem is made on a single disk with the following command: diff --git a/design/XFS_Filesystem_Structure/docinfo.xml b/design/XFS_Filesystem_Structure/docinfo.xml index f5e62bc..5cdcf6c 100644 --- a/design/XFS_Filesystem_Structure/docinfo.xml +++ b/design/XFS_Filesystem_Structure/docinfo.xml @@ -141,4 +141,18 @@ + + 3.1415 + July 2016 + + Darrick + Wong + + + + + Document the real-time reverse-mapping btree. + + + diff --git a/design/XFS_Filesystem_Structure/internal_inodes.asciidoc b/design/XFS_Filesystem_Structure/internal_inodes.asciidoc index 9ace3ea..e6bf75f 100644 --- a/design/XFS_Filesystem_Structure/internal_inodes.asciidoc +++ b/design/XFS_Filesystem_Structure/internal_inodes.asciidoc @@ -201,3 +201,5 @@ rtbitmap location, and positive if there are any. This data structure is not particularly space efficient, however it is a very fast way to provide the same data as the two free space B+trees for regular files since the space is preallocated and metadata maintenance is minimal. + +include::rtrmapbt.asciidoc[] diff --git a/design/XFS_Filesystem_Structure/magic.asciidoc b/design/XFS_Filesystem_Structure/magic.asciidoc index bc172f3..77bed6d 100644 --- a/design/XFS_Filesystem_Structure/magic.asciidoc +++ b/design/XFS_Filesystem_Structure/magic.asciidoc @@ -45,6 +45,7 @@ relevant chapters. Magic numbers tend to have consistent locations: | +XFS_ATTR3_LEAF_MAGIC+ | 0x3bee | | xref:Leaf_Attributes[Leaf Attribute], v5 only | +XFS_ATTR3_RMT_MAGIC+ | 0x5841524d | XARM | xref:Remote_Values[Remote Attribute Value], v5 only | +XFS_RMAP_CRC_MAGIC+ | 0x524d4233 | RMB3 | xref:Reverse_Mapping_Btree[Reverse Mapping B+tree], v5 only +| +XFS_RTRMAP_CRC_MAGIC+ | 0x4d415052 | MAPR | xref:Real_time_Reverse_Mapping_Btree[Real-Time Reverse Mapping B+tree], v5 only | +XFS_REFC_CRC_MAGIC+ | 0x52334643 | R3FC | xref:Reference_Count_Btree[Reference Count B+tree], v5 only |===== diff --git a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc index 4415c38..02d44ac 100644 --- a/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc +++ b/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc @@ -141,7 +141,8 @@ the associated metadata or data; or ``btree'' where the inode contains a B+tree root node which points to filesystem blocks containing the metadata or data. Migration between the formats depends on the amount of metadata associated with the inode. ``dev'' is used for character and block devices while ``uuid'' is -currently not used. +currently not used. ``rmap'' indicates that a reverse-mapping B+tree +is rooted in the fork. [source, c] ---- @@ -150,7 +151,8 @@ typedef enum xfs_dinode_fmt { XFS_DINODE_FMT_LOCAL, XFS_DINODE_FMT_EXTENTS, XFS_DINODE_FMT_BTREE, - XFS_DINODE_FMT_UUID + XFS_DINODE_FMT_UUID, + XFS_DINODE_FMT_RMAP, } xfs_dinode_fmt_t; ---- diff --git a/design/XFS_Filesystem_Structure/rtrmapbt.asciidoc b/design/XFS_Filesystem_Structure/rtrmapbt.asciidoc new file mode 100644 index 0000000..3a109b2 --- /dev/null +++ b/design/XFS_Filesystem_Structure/rtrmapbt.asciidoc @@ -0,0 +1,234 @@ +[[Real_time_Reverse_Mapping_Btree]] +=== Real-Time Reverse-Mapping B+tree + +[NOTE] +This data structure is under construction! Details may change. + +If the reverse-mapping B+tree and real-time storage device features +are enabled, the real-time device has its own reverse block-mapping +B+tree. + +As mentioned in the chapter about xref:Reconstruction[reconstruction], +this data structure is another piece of the puzzle necessary to +reconstruct the data or attribute fork of a file from reverse-mapping +records; we can also use it to double-check allocations to ensure that +we are not accidentally cross-linking blocks, which can cause severe +damage to the filesystem. + +This B+tree is only present if the +XFS_SB_FEAT_RO_COMPAT_RMAPBT+ +feature is enabled and a real time device is present. The feature +requires a version 5 filesystem. + +The real-time reverse mapping B+tree is rooted in an inode's data +fork; the inode number is given by the +sb_rrmapino+ field in the +superblock. The B+tree blocks themselves are stored in the regular +filesystem. The structures used for an inode's B+tree root are: + +[source, c] +---- +struct xfs_rtrmap_root { + __be16 bb_level; + __be16 bb_numrecs; +}; +---- + +* On disk, the B+tree node starts with the +xfs_rtrmap_root+ header +followed by an array of +xfs_rtrmap_key+ values and then an array of ++xfs_rtrmap_ptr_t+ values. The size of both arrays is specified by the +header's +bb_numrecs+ value. + +* The root node in the inode can only contain up to 10 key/pointer +pairs for a standard 512 byte inode before a new level of nodes is +added between the root and the leaves. +di_forkoff+ should always +be zero, because there are no extended attributes. + +Each record in the real-time reverse-mapping B+tree has the following +structure: + +[source, c] +---- +struct xfs_rtrmap_rec { + __be64 rm_startblock; + __be64 rm_blockcount; + __be64 rm_owner; + __be64 rm_fork:1; + __be64 rm_bmbt:1; + __be64 rm_unwritten:1; + __be64 rm_unused:7; + __be64 rm_offset:54; +}; +---- + +*rm_startblock*:: +Real-time device block number of this record. + +*rm_blockcount*:: +The length of this extent, in real-time blocks. + +*rm_owner*:: +A 64-bit number describing the owner of this extent. This must be an +inode number, because the real-time device is for file data only. + +*rm_fork*:: +If +rm_owner+ describes an inode, this can be 1 if this record is for +an attribute fork. This value will always be zero for real-time +extents. + +*rm_bmbt*:: +If +rm_owner+ describes an inode, this can be 1 to signify that this +record is for a block map B+tree block. In this case, +rm_offset+ has +no meaning. This value will always be zero for real-time extents. + +*rm_unwritten*:: +A flag indicating that the extent is unwritten. This corresponds to +the flag in the xref:Data_Extents[extent record] format which means ++XFS_EXT_UNWRITTEN+. + +*rm_offset*:: +The 54-bit logical file block offset, if +rm_owner+ describes an +inode. + +[NOTE] +The single-bit flag values +rm_unwritten+, +rm_fork+, and +rm_bmbt+ +are packed into the larger fields in the C structure definition. + +The key has the following structure: + +[source, c] +---- +struct xfs_rtrmap_key { + __be64 rm_startblock; + __be64 rm_owner; + __be64 rm_fork:1; + __be64 rm_bmbt:1; + __be64 rm_reserved:1; + __be64 rm_unused:7; + __be64 rm_offset:54; +}; +---- + +* All block numbers are 64-bit real-time device block numbers. + +* The +bb_magic+ value is ``MAPR'' (0x4d415052). + +* The +xfs_btree_lblock_t+ header is used for intermediate B+tree node as well +as the leaves. + +* Each pointer is associated with two keys. The first of these is the +"low key", which is the key of the smallest record accessible through +the pointer. This low key has the same meaning as the key in all +other btrees. The second key is the high key, which is the maximum of +the largest key that can be used to access a given record underneath +the pointer. Recall that each record in the real-time reverse mapping +b+tree describes an interval of physical blocks mapped to an interval +of logical file block offsets; therefore, it makes sense that a range +of keys can be used to find to a record. + +==== xfs_db rtrmapbt Example + +This example shows a real-time reverse-mapping B+tree from a freshly +populated root filesystem: + +---- +xfs_db> sb 0 +xfs_db> addr rrmapino +xfs_db> p +core.magic = 0x494e +core.mode = 0100000 +core.version = 3 +core.format = 5 (rtrmapbt) +... +u3.rtrmapbt.level = 3 +u3.rtrmapbt.numrecs = 1 +u3.rtrmapbt.keys[1] = [startblock,owner,offset,attrfork,bmbtblock,startblock_hi, + owner_hi,offset_hi,attrfork_hi,bmbtblock_hi] + 1:[1,132,1,0,0,1705337,133,54431,0,0] +u3.rtrmapbt.ptrs[1] = 1:671 +xfs_db> addr u3.rtrmapbt.ptrs[1] +xfs_db> p +magic = 0x4d415052 +level = 2 +numrecs = 8 +leftsib = null +rightsib = null +bno = 5368 +lsn = 0x400000000 +uuid = 98bbde42-67e7-46a5-a73e-d64a76b1b5ce +owner = 131 +crc = 0x2560d199 (correct) +keys[1-8] = [startblock,owner,offset,attrfork,bmbtblock,startblock_hi,owner_hi, + offset_hi,attrfork_hi,bmbtblock_hi] + 1:[1,132,1,0,0,17749,132,17749,0,0] + 2:[17751,132,17751,0,0,35499,132,35499,0,0] + 3:[35501,132,35501,0,0,53249,132,53249,0,0] + 4:[53251,132,53251,0,0,1658473,133,7567,0,0] + 5:[1658475,133,7569,0,0,1667473,133,16567,0,0] + 6:[1667475,133,16569,0,0,1685223,133,34317,0,0] + 7:[1685225,133,34319,0,0,1694223,133,43317,0,0] + 8:[1694225,133,43319,0,0,1705337,133,54431,0,0] +ptrs[1-8] = 1:134 2:238 3:345 4:453 5:795 6:563 7:670 8:780 +---- + +We arbitrarily pick pointer 7 (twice) to traverse downwards: + +---- +xfs_db> addr ptrs[7] +xfs_db> p +magic = 0x4d415052 +level = 1 +numrecs = 36 +leftsib = 563 +rightsib = 780 +bno = 5360 +lsn = 0 +uuid = 98bbde42-67e7-46a5-a73e-d64a76b1b5ce +owner = 131 +crc = 0x6807761d (correct) +keys[1-36] = [startblock,owner,offset,attrfork,bmbtblock,startblock_hi,owner_hi, + offset_hi,attrfork_hi,bmbtblock_hi] + 1:[1685225,133,34319,0,0,1685473,133,34567,0,0] + 2:[1685475,133,34569,0,0,1685723,133,34817,0,0] + 3:[1685725,133,34819,0,0,1685973,133,35067,0,0] + ... + 34:[1693475,133,42569,0,0,1693723,133,42817,0,0] + 35:[1693725,133,42819,0,0,1693973,133,43067,0,0] + 36:[1693975,133,43069,0,0,1694223,133,43317,0,0] +ptrs[1-36] = 1:669 2:672 3:674...34:722 35:723 36:725 +xfs_db> addr ptrs[7] +xfs_db> p +magic = 0x4d415052 +level = 0 +numrecs = 125 +leftsib = 678 +rightsib = 681 +bno = 5440 +lsn = 0 +uuid = 98bbde42-67e7-46a5-a73e-d64a76b1b5ce +owner = 131 +crc = 0xefce34d4 (correct) +recs[1-125] = [startblock,blockcount,owner,offset,extentflag,attrfork,bmbtblock] + 1:[1686725,1,133,35819,0,0,0] + 2:[1686727,1,133,35821,0,0,0] + 3:[1686729,1,133,35823,0,0,0] + ... + 123:[1686969,1,133,36063,0,0,0] + 124:[1686971,1,133,36065,0,0,0] + 125:[1686973,1,133,36067,0,0,0] +---- + +Several interesting things pop out here. The first record shows that +inode 133 has mapped real-time block 1,686,725 at offset 35,819. We +confirm this by looking at the block map for that inode: + +---- +xfs_db> inode 133 +xfs_db> p core.realtime +core.realtime = 1 +xfs_db> bmap +data offset 35817 startblock 1686723 (1/638147) count 1 flag 0 +data offset 35819 startblock 1686725 (1/638149) count 1 flag 0 +data offset 35821 startblock 1686727 (1/638151) count 1 flag 0 +---- + +Notice that inode 133 has the real-time flag set, which means that its +data blocks are all allocated from the real-time device. From darrick.wong@oracle.com Thu Aug 25 18:28:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9B4CC7CA3 for ; Thu, 25 Aug 2016 18:28:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5F3F08F8033 for ; Thu, 25 Aug 2016 16:28:25 -0700 (PDT) X-ASG-Debug-ID: 1472167703-0bf57b5312209050001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 0y1JICFsOCvyzzQW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:28:23 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNSLBs006617 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:28:21 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNSLxR000903 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:28:21 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNSLxv024730; Thu, 25 Aug 2016 23:28:21 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:28:20 -0700 Subject: [PATCH v8 00/13] xfstests: fixes and new tests for rmap/reflink/fsmap From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 00/13] xfstests: fixes and new tests for rmap/reflink/fsmap To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:28:19 -0700 Message-ID: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167703 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3551 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. The first several patches in this series fix various minor errors in a variety of existing tests. The biggest change fixes xfs_db usage to work when an external log is specified. The new tests in this series ensure that xfs_fsr works with files having a high extent count and reverse mapping enabled. Next come more tests for the existing XFS rmap functionality, tests for the realtime rmap patches against XFS, some quick sanity checks for the proposed GETFSMAP ioctl, and tests of shared extent reporting via GETBMAPX. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From: "Darrick J. Wong" Subject: [PATCH v8 00/13] xfstests: fixes and new tests for rmap/reflink/etc Hi all, This is the eighth revision of a patchset that adds to xfstests support for testing reverse-mappings of physical blocks to file and metadata (rmap); support for testing multiple file logical blocks to the same physical block (reflink); and implements the beginnings of online metadata scrubbing. The first eleven tests fix various bugs in existing reflink and rmap tests, most of which were a result of not using helpers when I should have. After that, there are new tests to make sure that we can't clone_range across mountpoints; test to make sure that swapext works with many extents on a rmap filesystem; and tests for realtime reverse-mapping. There are also revised patches for testing xfs_repair's ability to rebuild filesystem indices correctly, and to run xfs_scrub during each test. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], and documentation[4]. The kernel patches should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, i386, armv7l, and ppc64. AFAICT these don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-experimental [2] https://github.com/djwong/xfsprogs/tree/djwong-experimental [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:28:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3DE517CA3 for ; Thu, 25 Aug 2016 18:28:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DAE80304043 for ; Thu, 25 Aug 2016 16:28:32 -0700 (PDT) X-ASG-Debug-ID: 1472167710-0bf8155c751e5df0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id mvsZ7ssTBorNT9lW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:28:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNSS4O006707 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:28:29 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNSScE026397 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:28:28 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNSRvS026974; Thu, 25 Aug 2016 23:28:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:28:27 -0700 Subject: [PATCH 01/13] tests/xfs: don't run tests if cowextsize isn't present From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/13] tests/xfs: don't run tests if cowextsize isn't present To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:28:25 -0700 Message-ID: <147216770565.32641.5996523789425289351.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167710 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8090 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Some of the tests forgot to check that xfs_io has a cowextsize command, so fix that here. Signed-off-by: Darrick J. Wong --- tests/xfs/215 | 1 + tests/xfs/218 | 1 + tests/xfs/219 | 1 + tests/xfs/221 | 1 + tests/xfs/223 | 1 + tests/xfs/224 | 1 + tests/xfs/225 | 1 + tests/xfs/226 | 1 + tests/xfs/228 | 1 + tests/xfs/230 | 1 + tests/xfs/231 | 1 + tests/xfs/232 | 1 + tests/xfs/243 | 1 + tests/xfs/248 | 1 + tests/xfs/249 | 1 + tests/xfs/251 | 1 + tests/xfs/254 | 1 + tests/xfs/255 | 1 + tests/xfs/256 | 1 + tests/xfs/257 | 1 + tests/xfs/258 | 1 + tests/xfs/315 | 1 + tests/xfs/326 | 1 + 23 files changed, 23 insertions(+) diff --git a/tests/xfs/215 b/tests/xfs/215 index 7a517d7..b9c9ab4 100755 --- a/tests/xfs/215 +++ b/tests/xfs/215 @@ -50,6 +50,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_odirect rm -f $seqres.full diff --git a/tests/xfs/218 b/tests/xfs/218 index 0ab4102..887a135 100755 --- a/tests/xfs/218 +++ b/tests/xfs/218 @@ -50,6 +50,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" rm -f $seqres.full diff --git a/tests/xfs/219 b/tests/xfs/219 index df57e07..5ae0714 100755 --- a/tests/xfs/219 +++ b/tests/xfs/219 @@ -50,6 +50,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_odirect rm -f $seqres.full diff --git a/tests/xfs/221 b/tests/xfs/221 index 03d81ac..3afc75f 100755 --- a/tests/xfs/221 +++ b/tests/xfs/221 @@ -50,6 +50,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" rm -f $seqres.full diff --git a/tests/xfs/223 b/tests/xfs/223 index 7c990a2..3f34bcf 100755 --- a/tests/xfs/223 +++ b/tests/xfs/223 @@ -51,6 +51,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_odirect rm -f $seqres.full diff --git a/tests/xfs/224 b/tests/xfs/224 index bf33d1f..91033fa 100755 --- a/tests/xfs/224 +++ b/tests/xfs/224 @@ -51,6 +51,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" rm -f $seqres.full diff --git a/tests/xfs/225 b/tests/xfs/225 index 749816f..2260441 100755 --- a/tests/xfs/225 +++ b/tests/xfs/225 @@ -50,6 +50,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_odirect rm -f $seqres.full diff --git a/tests/xfs/226 b/tests/xfs/226 index bb94d24..ac70239 100755 --- a/tests/xfs/226 +++ b/tests/xfs/226 @@ -50,6 +50,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" rm -f $seqres.full diff --git a/tests/xfs/228 b/tests/xfs/228 index df1fd7a..65d7f51 100755 --- a/tests/xfs/228 +++ b/tests/xfs/228 @@ -54,6 +54,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_xfs_io_command "fpunch" _require_cp_reflink _require_odirect diff --git a/tests/xfs/230 b/tests/xfs/230 index 73f599a..73c6267 100755 --- a/tests/xfs/230 +++ b/tests/xfs/230 @@ -54,6 +54,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_xfs_io_command "fpunch" _require_cp_reflink _require_odirect diff --git a/tests/xfs/231 b/tests/xfs/231 index 166f6b0..d89139a 100755 --- a/tests/xfs/231 +++ b/tests/xfs/231 @@ -51,6 +51,7 @@ _supported_os Linux _supported_fs xfs _require_scratch_reflink _require_cp_reflink +_require_xfs_io_command "cowextsize" _require_fiemap old_cow_lifetime=$(cat /proc/sys/fs/xfs/speculative_cow_prealloc_lifetime) diff --git a/tests/xfs/232 b/tests/xfs/232 index 0008dbf..2438f1f 100755 --- a/tests/xfs/232 +++ b/tests/xfs/232 @@ -50,6 +50,7 @@ _cleanup() # real QA test starts here _supported_os Linux _supported_fs xfs +_require_xfs_io_command "cowextsize" _require_scratch_reflink _require_cp_reflink _require_fiemap diff --git a/tests/xfs/243 b/tests/xfs/243 index f6a8692..0bb69c4 100755 --- a/tests/xfs/243 +++ b/tests/xfs/243 @@ -55,6 +55,7 @@ _supported_os Linux _supported_fs xfs _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_xfs_io_command "fpunch" _require_xfs_io_command "bmap" "-c" _require_cp_reflink diff --git a/tests/xfs/248 b/tests/xfs/248 index 7e25258..471205c 100755 --- a/tests/xfs/248 +++ b/tests/xfs/248 @@ -51,6 +51,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" rm -f $seqres.full diff --git a/tests/xfs/249 b/tests/xfs/249 index b82d89c..0a7fbf1 100755 --- a/tests/xfs/249 +++ b/tests/xfs/249 @@ -51,6 +51,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_odirect rm -f $seqres.full diff --git a/tests/xfs/251 b/tests/xfs/251 index 4f74772..48a027c 100755 --- a/tests/xfs/251 +++ b/tests/xfs/251 @@ -53,6 +53,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" rm -f $seqres.full diff --git a/tests/xfs/254 b/tests/xfs/254 index c8ac412..ac87e49 100755 --- a/tests/xfs/254 +++ b/tests/xfs/254 @@ -53,6 +53,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_odirect rm -f $seqres.full diff --git a/tests/xfs/255 b/tests/xfs/255 index 93ad13e..97cbb77 100755 --- a/tests/xfs/255 +++ b/tests/xfs/255 @@ -53,6 +53,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" rm -f $seqres.full diff --git a/tests/xfs/256 b/tests/xfs/256 index d5cf71b..a182953 100755 --- a/tests/xfs/256 +++ b/tests/xfs/256 @@ -53,6 +53,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_odirect rm -f $seqres.full diff --git a/tests/xfs/257 b/tests/xfs/257 index 624f5e3..1fc401b 100755 --- a/tests/xfs/257 +++ b/tests/xfs/257 @@ -54,6 +54,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" rm -f $seqres.full diff --git a/tests/xfs/258 b/tests/xfs/258 index 243e853..a3ffc89 100755 --- a/tests/xfs/258 +++ b/tests/xfs/258 @@ -54,6 +54,7 @@ _cleanup() _supported_os Linux _require_scratch_reflink _require_xfs_io_command "falloc" +_require_xfs_io_command "cowextsize" _require_odirect rm -f $seqres.full diff --git a/tests/xfs/315 b/tests/xfs/315 index 62d7fcf..6170540 100755 --- a/tests/xfs/315 +++ b/tests/xfs/315 @@ -49,6 +49,7 @@ _supported_fs xfs _require_cp_reflink _require_scratch_reflink _require_error_injection +_require_xfs_io_command "cowextsize" _require_xfs_io_error_injection "free_extent" rm -f $seqres.full diff --git a/tests/xfs/326 b/tests/xfs/326 index 2cd6eda..36bdcf4 100755 --- a/tests/xfs/326 +++ b/tests/xfs/326 @@ -50,6 +50,7 @@ _supported_os Linux _supported_fs xfs _require_cp_reflink _require_scratch_reflink +_require_xfs_io_command "cowextsize" _require_xfs_io_error_injection "refcount_finish_one" rm -f $seqres.full From darrick.wong@oracle.com Thu Aug 25 18:28:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F14D87CA3 for ; Thu, 25 Aug 2016 18:28:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9F88E8F8035 for ; Thu, 25 Aug 2016 16:28:39 -0700 (PDT) X-ASG-Debug-ID: 1472167717-0bf8155c771e5e20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id NH7nvWx7VDBnAbfN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:28:37 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNSZXl014006 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:28:35 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNSZUB004420 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:28:35 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNSYXt011816; Thu, 25 Aug 2016 23:28:35 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:28:33 -0700 Subject: [PATCH 02/13] xfs/122: decrease the log update done item sizes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/13] xfs/122: decrease the log update done item sizes To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:28:32 -0700 Message-ID: <147216771202.32641.9018236822745566504.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167717 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1271 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Redundant fields were removed from the rmap/refcount/bmap update done log items, so fix the size tests. Signed-off-by: Darrick J. Wong --- tests/xfs/122.out | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/xfs/122.out b/tests/xfs/122.out index b20011e..06d1432 100644 --- a/tests/xfs/122.out +++ b/tests/xfs/122.out @@ -61,10 +61,10 @@ sizeof(struct xfs_attr3_leaf_hdr) = 80 sizeof(struct xfs_attr3_leafblock) = 88 sizeof(struct xfs_attr3_rmt_hdr) = 56 sizeof(struct xfs_btree_block) = 72 -sizeof(struct xfs_bud_log_format) = 48 +sizeof(struct xfs_bud_log_format) = 16 sizeof(struct xfs_bui_log_format) = 48 sizeof(struct xfs_clone_args) = 32 -sizeof(struct xfs_cud_log_format) = 32 +sizeof(struct xfs_cud_log_format) = 16 sizeof(struct xfs_cui_log_format) = 32 sizeof(struct xfs_da3_blkinfo) = 56 sizeof(struct xfs_da3_intnode) = 64 @@ -90,7 +90,7 @@ sizeof(struct xfs_rmap_rec) = 24 sizeof(struct xfs_rtrmap_key) = 24 sizeof(struct xfs_rtrmap_rec) = 32 sizeof(struct xfs_rtrmap_root) = 4 -sizeof(struct xfs_rud_log_format) = 48 +sizeof(struct xfs_rud_log_format) = 16 sizeof(struct xfs_rui_log_format) = 48 sizeof(xfs_agf_t) = 224 sizeof(xfs_agfl_t) = 36 From darrick.wong@oracle.com Thu Aug 25 18:28:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 488047CBE for ; Thu, 25 Aug 2016 18:28:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C4A18F8033 for ; Thu, 25 Aug 2016 16:28:43 -0700 (PDT) X-ASG-Debug-ID: 1472167721-0bf57c55b41c7520001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id C7TyxMCUQABc3QIO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:28:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNSeMV006801 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:28:40 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNSeNR017863 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:28:40 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNSeG3024773; Thu, 25 Aug 2016 23:28:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:28:39 -0700 Subject: [PATCH 03/13] xfs/{130,235}: deal with an unreplayable dirty log From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/13] xfs/{130,235}: deal with an unreplayable dirty log To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:28:38 -0700 Message-ID: <147216771851.32641.12882618561173838572.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167722 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1283 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Now that we have log replay items, an FS shutdown due to a corrupt btree results in a log that can't be replayed. The only solution here is to zap the log when we're fixing the corrupt fs, so do that here. Signed-off-by: Darrick J. Wong --- tests/xfs/130 | 3 ++- tests/xfs/235 | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/xfs/130 b/tests/xfs/130 index 7d8ea2a..554d078 100755 --- a/tests/xfs/130 +++ b/tests/xfs/130 @@ -87,7 +87,8 @@ _cp_reflink "${SCRATCH_MNT}/file1" "${SCRATCH_MNT}/file4" 2> /dev/null && \ umount "${SCRATCH_MNT}" echo "+ repair fs" -_scratch_xfs_repair >> "$seqres.full" 2>&1 +_disable_dmesg_check +_repair_scratch_fs >> "$seqres.full" 2>&1 _scratch_xfs_repair >> "$seqres.full" 2>&1 echo "+ mount image (2)" diff --git a/tests/xfs/235 b/tests/xfs/235 index c2e0340..ef51d22 100755 --- a/tests/xfs/235 +++ b/tests/xfs/235 @@ -85,7 +85,8 @@ test -s ${SCRATCH_MNT}/file4 && _fail "should not be able to copy with busted rm umount ${SCRATCH_MNT} echo "+ repair fs" -_scratch_xfs_repair >> $seqres.full 2>&1 +_disable_dmesg_check +_repair_scratch_fs >> "$seqres.full" 2>&1 _scratch_xfs_repair >> $seqres.full 2>&1 echo "+ mount image (2)" From darrick.wong@oracle.com Thu Aug 25 18:28:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 430BA7CA3 for ; Thu, 25 Aug 2016 18:28:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A0B13AC002 for ; Thu, 25 Aug 2016 16:28:50 -0700 (PDT) X-ASG-Debug-ID: 1472167728-0bf57c55b41c7530001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id iSJdhKy82yPL1LSl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:28:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNSl1K014123 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:28:47 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNSlF5027035 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:28:47 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNSkO2011877; Thu, 25 Aug 2016 23:28:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:28:46 -0700 Subject: [PATCH 04/13] generic/159, 160: deal with EACCESS -> EPERM transition From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/13] generic/159, 160: deal with EACCESS -> EPERM transition To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:28:44 -0700 Message-ID: <147216772479.32641.3592660842211217853.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167728 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1776 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines As of 4.8 we can receive EPERM (instead of EACCESS) for attempts to reflink/dedupe to an immutable file. Fix this up so that we accept either answer. Signed-off-by: Darrick J. Wong --- tests/generic/159 | 6 +++++- tests/generic/160 | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/generic/159 b/tests/generic/159 index 8898d58..726333a 100755 --- a/tests/generic/159 +++ b/tests/generic/159 @@ -65,9 +65,13 @@ _pwrite_byte 0x61 0 $sz $testdir1/file1 >> $seqres.full _pwrite_byte 0x61 0 $sz $testdir1/file2 >> $seqres.full sync +do_filter_output() { + _filter_test_dir | sed -e 's/Operation not permitted/Permission denied/g' +} + echo "Try reflink on immutable files" $CHATTR_PROG +i $testdir1/file1 $testdir1/file2 -_reflink_range $testdir1/file1 0 $testdir1/file2 0 $blksz 2>&1 | _filter_test_dir +_reflink_range $testdir1/file1 0 $testdir1/file2 0 $blksz 2>&1 | do_filter_output $CHATTR_PROG -i $testdir1/file1 $testdir1/file2 # success, all done diff --git a/tests/generic/160 b/tests/generic/160 index 3a91dc8..4946bfc 100755 --- a/tests/generic/160 +++ b/tests/generic/160 @@ -65,9 +65,13 @@ _pwrite_byte 0x61 0 $sz $testdir1/file1 >> $seqres.full _pwrite_byte 0x61 0 $sz $testdir1/file2 >> $seqres.full sync +do_filter_output() { + _filter_test_dir | sed -e 's/Operation not permitted/Permission denied/g' +} + echo "Try dedupe on immutable files" $CHATTR_PROG +i $testdir1/file1 $testdir1/file2 -_dedupe_range $testdir1/file1 0 $testdir1/file2 0 $blksz 2>&1 | _filter_test_dir +_dedupe_range $testdir1/file1 0 $testdir1/file2 0 $blksz 2>&1 | do_filter_output $CHATTR_PROG -i $testdir1/file1 $testdir1/file2 # success, all done From darrick.wong@oracle.com Thu Aug 25 18:28:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DCCDD7CD4 for ; Thu, 25 Aug 2016 18:28:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A16ED8F8035 for ; Thu, 25 Aug 2016 16:28:57 -0700 (PDT) X-ASG-Debug-ID: 1472167735-0bf57b5311209070001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id KNDWdUvX7Cgg4bH6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:28:56 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNSsCl014163 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:28:54 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNSr74018466 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:28:53 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNSq5E011898; Thu, 25 Aug 2016 23:28:53 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:28:52 -0700 Subject: [PATCH 05/13] xfs/122: test btree header block sizes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/13] xfs/122: test btree header block sizes To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:28:51 -0700 Message-ID: <147216773109.32641.2117135160062092839.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167735 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 649 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- tests/xfs/122.out | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/xfs/122.out b/tests/xfs/122.out index 06d1432..bbffd0f 100644 --- a/tests/xfs/122.out +++ b/tests/xfs/122.out @@ -61,6 +61,8 @@ sizeof(struct xfs_attr3_leaf_hdr) = 80 sizeof(struct xfs_attr3_leafblock) = 88 sizeof(struct xfs_attr3_rmt_hdr) = 56 sizeof(struct xfs_btree_block) = 72 +sizeof(struct xfs_btree_block_lhdr) = 64 +sizeof(struct xfs_btree_block_shdr) = 48 sizeof(struct xfs_bud_log_format) = 16 sizeof(struct xfs_bui_log_format) = 48 sizeof(struct xfs_clone_args) = 32 From darrick.wong@oracle.com Thu Aug 25 18:29:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6A6267CD8 for ; Thu, 25 Aug 2016 18:29:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E13C5AC001 for ; Thu, 25 Aug 2016 16:29:05 -0700 (PDT) X-ASG-Debug-ID: 1472167741-0bf8155c771e5ee0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id AWn6vujIqvkmilvU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:29:02 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNT0CC014218 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:00 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNSxaj027480 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:00 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNSxBd025000; Thu, 25 Aug 2016 23:28:59 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:28:58 -0700 Subject: [PATCH 06/13] xfs: fix $XFS_DB_PROG usage From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/13] xfs: fix $XFS_DB_PROG usage To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:28:57 -0700 Message-ID: <147216773738.32641.691363173215857168.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167742 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 33660 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines xfs_db requires us to pass in the log device, if any; this can be accomplished via _scratch_xfs_db_options (if we're operating on the scratch device, anyway). However, many of the tests/xfs/ scripts pass only $SCRATCH_DEV directly, so they'll fail if we test with an external log. So, fix that. Signed-off-by: Darrick J. Wong --- tests/xfs/001 | 14 +++++++------- tests/xfs/002 | 4 ++-- tests/xfs/070 | 2 +- tests/xfs/077 | 6 +++--- tests/xfs/086 | 2 +- tests/xfs/087 | 2 +- tests/xfs/088 | 2 +- tests/xfs/089 | 2 +- tests/xfs/091 | 2 +- tests/xfs/093 | 2 +- tests/xfs/097 | 2 +- tests/xfs/098 | 6 +++--- tests/xfs/099 | 2 +- tests/xfs/100 | 4 ++-- tests/xfs/101 | 2 +- tests/xfs/102 | 4 ++-- tests/xfs/105 | 4 ++-- tests/xfs/111 | 2 +- tests/xfs/112 | 4 ++-- tests/xfs/113 | 4 ++-- tests/xfs/117 | 2 +- tests/xfs/120 | 2 +- tests/xfs/123 | 2 +- tests/xfs/124 | 10 +++++----- tests/xfs/125 | 8 ++++---- tests/xfs/126 | 10 +++++----- tests/xfs/130 | 2 +- tests/xfs/135 | 2 +- tests/xfs/137 | 6 +++--- tests/xfs/179 | 10 +++++----- tests/xfs/186 | 8 ++++---- tests/xfs/187 | 14 +++++++------- tests/xfs/235 | 2 +- tests/xfs/287 | 2 +- tests/xfs/298 | 2 +- 35 files changed, 77 insertions(+), 77 deletions(-) diff --git a/tests/xfs/001 b/tests/xfs/001 index c33adae..e1e1411 100755 --- a/tests/xfs/001 +++ b/tests/xfs/001 @@ -44,11 +44,11 @@ _do_bit_test() bits="$2" echo "testing $field with $bits bits" - $XFS_DB_PROG -x -c "inode $FILE_INO" -c "write $field 0" $SCRATCH_DEV + $XFS_DB_PROG -x -c "inode $FILE_INO" -c "write $field 0" `_scratch_xfs_db_options` num=1 for n in `seq 0 1 $bits`; do $XFS_DB_PROG -x -c "inode $FILE_INO" \ - -c "write $field $num" $SCRATCH_DEV + -c "write $field $num" `_scratch_xfs_db_options` let num=$num*2 done echo @@ -89,10 +89,10 @@ _do_bit_test "u.bmx[0].startoff" $BMBT_STARTOFF_BITLEN _do_bit_test "u.bmx[0].startblock" $BMBT_STARTBLOCK_BITLEN _do_bit_test "u.bmx[0].blockcount" $BMBT_BLOCKCOUNT_BITLEN # test setting the 32 bit generation number -$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen 0x5a" $SCRATCH_DEV -$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen 0xa5" $SCRATCH_DEV -$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen 0" $SCRATCH_DEV -$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen #5a5a" $SCRATCH_DEV -$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen #a5a5" $SCRATCH_DEV +$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen 0x5a" `_scratch_xfs_db_options` +$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen 0xa5" `_scratch_xfs_db_options` +$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen 0" `_scratch_xfs_db_options` +$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen #5a5a" `_scratch_xfs_db_options` +$XFS_DB_PROG -x -c "inode $FILE_INO" -c "write core.gen #a5a5" `_scratch_xfs_db_options` status=0 exit diff --git a/tests/xfs/002 b/tests/xfs/002 index 6dfdd6c..e9805e9 100755 --- a/tests/xfs/002 +++ b/tests/xfs/002 @@ -62,8 +62,8 @@ _scratch_mkfs_xfs -m crc=0 -d size=128m >> $seqres.full 2>&1 || _fail "mkfs fail # Scribble past a couple V4 secondary superblocks to populate sb_crc # (We can't write to the structure member because it doesn't exist # on a v4 superblock, so we use the data type & "write fill") -$XFS_DB_PROG -x -c "sb 1" -c "type data" -c "write fill 0xff 224 4" $SCRATCH_DEV -$XFS_DB_PROG -x -c "sb 2" -c "type data" -c "write fill 0xff 224 4" $SCRATCH_DEV +$XFS_DB_PROG -x -c "sb 1" -c "type data" -c "write fill 0xff 224 4" `_scratch_xfs_db_options` +$XFS_DB_PROG -x -c "sb 2" -c "type data" -c "write fill 0xff 224 4" `_scratch_xfs_db_options` _scratch_mount diff --git a/tests/xfs/070 b/tests/xfs/070 index e3a48b3..e0deb18 100755 --- a/tests/xfs/070 +++ b/tests/xfs/070 @@ -101,7 +101,7 @@ _scratch_mkfs | _filter_mkfs > /dev/null 2> $tmp.mkfs || _fail "mkfs failed" # corrupt the last secondary sb in the fs $XFS_DB_PROG -x -c "sb $((agcount - 1))" -c "type data" \ - -c "write fill 0xff 0 512" $SCRATCH_DEV + -c "write fill 0xff 0 512" `_scratch_xfs_db_options` # attempt to repair _xfs_repair_noscan diff --git a/tests/xfs/077 b/tests/xfs/077 index 007d05d..0ddb3f6 100755 --- a/tests/xfs/077 +++ b/tests/xfs/077 @@ -64,9 +64,9 @@ _test_uuid() ACTION=$1 EXPECTED_UUID=$2 - $XFS_DB_PROG -x -c "uuid $ACTION" $SCRATCH_DEV \ + $XFS_DB_PROG -x -c "uuid $ACTION" `_scratch_xfs_db_options` \ | _filter_uuid $EXPECTED_UUID - NEW_UUID=`$XFS_DB_PROG -c "uuid" $SCRATCH_DEV | awk '{print $NF}'` + NEW_UUID=`$XFS_DB_PROG -c "uuid" $(_scratch_xfs_db_options) | awk '{print $NF}'` _check_scratch_fs _scratch_mount || _fail "Mount failed after UUID $ACTION" _scratch_unmount @@ -83,7 +83,7 @@ rm -f $seqres.full _scratch_mkfs_xfs -m crc=1 >> $seqres.full 2>&1 || _fail "mkfs failed" -ORIG_UUID=`$XFS_DB_PROG -c "uuid" $SCRATCH_DEV | awk '{print $NF}'` +ORIG_UUID=`$XFS_DB_PROG -c "uuid" $(_scratch_xfs_db_options) | awk '{print $NF}'` _scratch_mount # Put some stuff on the fs diff --git a/tests/xfs/086 b/tests/xfs/086 index 143915b..57a5ad5 100755 --- a/tests/xfs/086 +++ b/tests/xfs/086 @@ -87,7 +87,7 @@ _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail echo "+ corrupt image" for ag in $(seq 1 $((agcount - 1))) 0; do - $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full 2>&1 done # Try to append to files; this should fail diff --git a/tests/xfs/087 b/tests/xfs/087 index 97c6680..2efe6f7 100755 --- a/tests/xfs/087 +++ b/tests/xfs/087 @@ -86,7 +86,7 @@ _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail echo "+ corrupt image" for ag in $(seq 1 $((agcount - 1))) 0; do - $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full 2>&1 done echo "+ mount image" diff --git a/tests/xfs/088 b/tests/xfs/088 index 18bf6ad..ac9c7da 100755 --- a/tests/xfs/088 +++ b/tests/xfs/088 @@ -86,7 +86,7 @@ _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail echo "+ corrupt image" for ag in $(seq 1 $((agcount - 1))) 0; do - $XFS_DB_PROG -x -c "agfl ${ag}" -c "agfl ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "agfl ${ag}" -c "agfl ${ag}" -c "stack" -c "blocktrash -x 32 -o +64 -y 4096 -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full 2>&1 done # Try to append to files; this should fail diff --git a/tests/xfs/089 b/tests/xfs/089 index b6e512f..496a4cd 100755 --- a/tests/xfs/089 +++ b/tests/xfs/089 @@ -86,7 +86,7 @@ _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail echo "+ corrupt image" for ag in $(seq 1 $((agcount - 1))) 0; do - $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr bnoroot" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr bnoroot" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full 2>&1 done # Try to append to files; this should fail diff --git a/tests/xfs/091 b/tests/xfs/091 index f995d9c..3943474 100755 --- a/tests/xfs/091 +++ b/tests/xfs/091 @@ -86,7 +86,7 @@ _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail echo "+ corrupt image" for ag in $(seq 1 $((agcount - 1))) 0; do - $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr cntroot" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr cntroot" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full 2>&1 done # Try to append to files; this should fail diff --git a/tests/xfs/093 b/tests/xfs/093 index 7d4d9b8..790fdbe 100755 --- a/tests/xfs/093 +++ b/tests/xfs/093 @@ -86,7 +86,7 @@ _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail echo "+ corrupt image" for ag in $(seq 1 $((agcount - 1))) 0; do - $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "addr root" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "addr root" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full 2>&1 done echo "+ mount image" diff --git a/tests/xfs/097 b/tests/xfs/097 index f5a8178..4dac34f 100755 --- a/tests/xfs/097 +++ b/tests/xfs/097 @@ -89,7 +89,7 @@ _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail echo "+ corrupt image" for ag in $(seq 1 $((agcount - 1))) 0; do - $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "addr free_root" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "agi ${ag}" -c "agi ${ag}" -c "addr free_root" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full 2>&1 done echo "+ mount image" diff --git a/tests/xfs/098 b/tests/xfs/098 index d91d617..4851618 100755 --- a/tests/xfs/098 +++ b/tests/xfs/098 @@ -84,9 +84,9 @@ echo "+ check fs" _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" echo "+ corrupt image" -logstart="$($XFS_DB_PROG -c 'sb 0' -c 'p' "${SCRATCH_DEV}" | grep '^logstart =' | cut -d ' ' -f 3)" -logstart="$($XFS_DB_PROG -c "convert fsblock ${logstart} byte" "${SCRATCH_DEV}" | sed -e 's/^.*(\([0-9]*\).*$/\1/g')" -logblocks="$(xfs_db -c 'sb 0' -c 'p' "${SCRATCH_DEV}" | grep '^logblocks =' | cut -d ' ' -f 3)" +logstart="$($XFS_DB_PROG -c 'sb 0' -c 'p' `_scratch_xfs_db_options` | grep '^logstart =' | cut -d ' ' -f 3)" +logstart="$($XFS_DB_PROG -c "convert fsblock ${logstart} byte" `_scratch_xfs_db_options` | sed -e 's/^.*(\([0-9]*\).*$/\1/g')" +logblocks="$($XFS_DB_PROG -c 'sb 0' -c 'p' `_scratch_xfs_db_options` | grep '^logblocks =' | cut -d ' ' -f 3)" $XFS_IO_PROG -f -c "pwrite -S 0x62 ${logstart} $((logblocks * blksz))" "${SCRATCH_DEV}" >> $seqres.full echo "+ mount image" diff --git a/tests/xfs/099 b/tests/xfs/099 index 36cf893..6c37160 100755 --- a/tests/xfs/099 +++ b/tests/xfs/099 @@ -78,7 +78,7 @@ echo "+ check dir" __populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" block echo "+ corrupt dir" -$XFS_DB_PROG -x -c "inode ${inode}" -c 'dblock 0' -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c 'dblock 0' -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full echo "+ mount image" _scratch_mount diff --git a/tests/xfs/100 b/tests/xfs/100 index 397c613..19ab43b 100755 --- a/tests/xfs/100 +++ b/tests/xfs/100 @@ -80,8 +80,8 @@ __populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" leaf echo "+ corrupt dir" loff=0 while true; do - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" `_scratch_xfs_db_options` | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full loff="$((loff + 1))" done diff --git a/tests/xfs/101 b/tests/xfs/101 index 09af649..61a85d2 100755 --- a/tests/xfs/101 +++ b/tests/xfs/101 @@ -78,7 +78,7 @@ echo "+ check dir" __populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" leaf echo "+ corrupt dir" -$XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${leaf_lblk}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${leaf_lblk}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full echo "+ mount image" _scratch_mount diff --git a/tests/xfs/102 b/tests/xfs/102 index 5d1965e..8c4db3e 100755 --- a/tests/xfs/102 +++ b/tests/xfs/102 @@ -80,8 +80,8 @@ __populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" node echo "+ corrupt dir" loff=0 while true; do - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" `_scratch_xfs_db_options` | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full loff="$((loff + 1))" done diff --git a/tests/xfs/105 b/tests/xfs/105 index 516639a..682e8d5 100755 --- a/tests/xfs/105 +++ b/tests/xfs/105 @@ -80,8 +80,8 @@ __populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" node echo "+ corrupt dir" loff="${leaf_lblk}" while true; do - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" `_scratch_xfs_db_options` | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full loff="$((loff + 1))" done diff --git a/tests/xfs/111 b/tests/xfs/111 index f6a41a8..4899020 100755 --- a/tests/xfs/111 +++ b/tests/xfs/111 @@ -64,7 +64,7 @@ INO=`ls -i $SCRATCH_MNT/512 | awk '{print $1}'` _scratch_unmount # Figure out where that middle inode starts -BYTE=`$XFS_DB_PROG -c "convert inode $INO byte" $SCRATCH_DEV \ +BYTE=`$XFS_DB_PROG -c "convert inode $INO byte" `_scratch_xfs_db_options` \ | awk '{print $2}' | sed s/[\(\)]//g` echo Blat inode clusters diff --git a/tests/xfs/112 b/tests/xfs/112 index aa7561e..8893e79 100755 --- a/tests/xfs/112 +++ b/tests/xfs/112 @@ -80,8 +80,8 @@ __populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" node echo "+ corrupt dir" loff="${node_lblk}" while true; do - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" `_scratch_xfs_db_options` | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full loff="$((loff + 1))" done diff --git a/tests/xfs/113 b/tests/xfs/113 index 8aa3395..e56927f 100755 --- a/tests/xfs/113 +++ b/tests/xfs/113 @@ -80,8 +80,8 @@ __populate_check_xfs_dir "${SCRATCH_DEV}" "${inode}" btree echo "+ corrupt dir" loff=0 while true; do - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file data block is unmapped' && break - $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" `_scratch_xfs_db_options` | grep -q 'file data block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "dblock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full loff="$((loff + 1))" done diff --git a/tests/xfs/117 b/tests/xfs/117 index 27dafd9..3aeb555 100755 --- a/tests/xfs/117 +++ b/tests/xfs/117 @@ -85,7 +85,7 @@ _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail echo "+ corrupt image" seq "${inode}" "$((inode + 64))" | while read ino; do - $XFS_DB_PROG -x -c "inode ${ino}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "inode ${ino}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full 2>&1 done echo "+ mount image" diff --git a/tests/xfs/120 b/tests/xfs/120 index 08a4615..b4b5f8b 100755 --- a/tests/xfs/120 +++ b/tests/xfs/120 @@ -75,7 +75,7 @@ echo "+ check fs" _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" echo "+ corrupt image" -$XFS_DB_PROG -x -c "inode ${inode}" -c "addr u.bmbt.ptrs[1]" -c "addr u3.bmbt.ptrs[1]" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "addr u.bmbt.ptrs[1]" -c "addr u3.bmbt.ptrs[1]" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full echo "+ mount image" _scratch_mount diff --git a/tests/xfs/123 b/tests/xfs/123 index a746d5c..bc6cb64 100755 --- a/tests/xfs/123 +++ b/tests/xfs/123 @@ -74,7 +74,7 @@ echo "+ check fs" _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" echo "+ corrupt image" -$XFS_DB_PROG -x -c "inode ${inode}" -c "dblock 0" -c "stack" -c "blocktrash -x 32 -o 256 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "dblock 0" -c "stack" -c "blocktrash -x 32 -o 256 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full echo "+ mount image" _scratch_mount diff --git a/tests/xfs/124 b/tests/xfs/124 index 239c246..f436ba5 100755 --- a/tests/xfs/124 +++ b/tests/xfs/124 @@ -77,13 +77,13 @@ echo "+ check fs" _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" echo "+ check xattr" -$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" "${SCRATCH_DEV}" >> $seqres.full -$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a block xattr (data)" -$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${leaf_lblk}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' || _fail "failed to create a block xattr (leaf)" -$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${node_lblk}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' || _fail "failed to create a block xattr (free)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" `_scratch_xfs_db_options` >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" `_scratch_xfs_db_options` | grep -q 'file attr block is unmapped' && _fail "failed to create a block xattr (data)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${leaf_lblk}" -c "stack" `_scratch_xfs_db_options` | grep -q 'file attr block is unmapped' || _fail "failed to create a block xattr (leaf)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${node_lblk}" -c "stack" `_scratch_xfs_db_options` | grep -q 'file attr block is unmapped' || _fail "failed to create a block xattr (free)" echo "+ corrupt xattr" -$XFS_DB_PROG -x -c "inode ${inode}" -c 'ablock 0' -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c 'ablock 0' -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full echo "+ mount image" _scratch_mount diff --git a/tests/xfs/125 b/tests/xfs/125 index cf61e02..1779152 100755 --- a/tests/xfs/125 +++ b/tests/xfs/125 @@ -78,12 +78,12 @@ echo "+ check fs" _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" echo "+ check xattr" -$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" "${SCRATCH_DEV}" >> $seqres.full -$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (index)" -$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 1" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (data)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" `_scratch_xfs_db_options` >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" `_scratch_xfs_db_options` | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (index)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 1" -c "stack" `_scratch_xfs_db_options` | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (data)" echo "+ corrupt xattr" -$XFS_DB_PROG -x -c "inode ${inode}" -c 'ablock 0' -c "stack" -c "blocktrash -x 32 -o +32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c 'ablock 0' -c "stack" -c "blocktrash -x 32 -o +32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full echo "+ mount image" _scratch_mount diff --git a/tests/xfs/126 b/tests/xfs/126 index ebe84fc..107ff79 100755 --- a/tests/xfs/126 +++ b/tests/xfs/126 @@ -78,15 +78,15 @@ echo "+ check fs" _scratch_xfs_repair -n >> $seqres.full 2>&1 || _fail "xfs_repair should not fail" echo "+ check xattr" -$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" "${SCRATCH_DEV}" >> $seqres.full -$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (index)" -$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 1" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (data)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "bmap" `_scratch_xfs_db_options` >> $seqres.full +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 0" -c "stack" `_scratch_xfs_db_options` | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (index)" +$XFS_DB_PROG -x -c "inode ${inode}" -c "ablock 1" -c "stack" `_scratch_xfs_db_options` | grep -q 'file attr block is unmapped' && _fail "failed to create a leaf xattr (data)" echo "+ corrupt xattr" loff=1 while true; do - $XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${loff}" -c "stack" "${SCRATCH_DEV}" | grep -q 'file attr block is unmapped' && break - $XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" "${SCRATCH_DEV}" >> $seqres.full + $XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${loff}" -c "stack" `_scratch_xfs_db_options` | grep -q 'file attr block is unmapped' && break + $XFS_DB_PROG -x -c "inode ${inode}" -c "ablock ${loff}" -c "stack" -c "blocktrash -x 32 -y $((blksz * 8)) -z ${FUZZ_ARGS}" `_scratch_xfs_db_options` >> $seqres.full loff="$((loff + 1))" done diff --git a/tests/xfs/130 b/tests/xfs/130 index 554d078..4078809 100755 --- a/tests/xfs/130 +++ b/tests/xfs/130 @@ -75,7 +75,7 @@ echo "+ corrupt image" seq 0 $((agcount - 1)) | while read ag; do $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr refcntroot" \ -c "stack" -c "blocktrash -x 4096 -y 4096 -z -n 8 -3" \ - "${SCRATCH_DEV}" >> "$seqres.full" 2>&1 + `_scratch_xfs_db_options` >> "$seqres.full" 2>&1 done echo "+ mount image" diff --git a/tests/xfs/135 b/tests/xfs/135 index 0487f0e..8cc8249 100755 --- a/tests/xfs/135 +++ b/tests/xfs/135 @@ -60,7 +60,7 @@ _scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" # (the log is zeroed when cycle == 1). for i in 16 32 64 128 256; do lsunit=$((i * 1024)) - $XFS_DB_PROG -x -c "logformat -c 3 -s $lsunit" $SCRATCH_DEV | \ + $XFS_DB_PROG -x -c "logformat -c 3 -s $lsunit" `_scratch_xfs_db_options` | \ tee -a $seqres.full # don't redirect error output so it causes test failure $XFS_LOGPRINT_PROG $SCRATCH_DEV >> $seqres.full diff --git a/tests/xfs/137 b/tests/xfs/137 index dec9fc9..aab306b 100755 --- a/tests/xfs/137 +++ b/tests/xfs/137 @@ -58,7 +58,7 @@ _require_xfs_db_command "logformat" _scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" # push the log cycle ahead so we have room to move it backwards later -$XFS_DB_PROG -x -c "logformat -c 3" $SCRATCH_DEV >> $seqres.full 2>&1 +$XFS_DB_PROG -x -c "logformat -c 3" `_scratch_xfs_db_options` >> $seqres.full 2>&1 # do some work on the fs to update metadata LSNs _scratch_mount @@ -68,13 +68,13 @@ _scratch_unmount # Reformat to the current cycle and try to mount. This fails in most cases # because the sb LSN is ahead of the current LSN. If it doesn't fail, push the # cycle back further and try again. -$XFS_DB_PROG -x -c "logformat" $SCRATCH_DEV >> $seqres.full 2>&1 +$XFS_DB_PROG -x -c "logformat" `_scratch_xfs_db_options` >> $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 if [ $? != 0 ]; then echo mount failure detected else _scratch_unmount - $XFS_DB_PROG -x -c "logformat -c 2" $SCRATCH_DEV >> $seqres.full 2>&1 + $XFS_DB_PROG -x -c "logformat -c 2" `_scratch_xfs_db_options` >> $seqres.full 2>&1 _scratch_mount >> $seqres.full 2>&1 || echo mount failure detected fi diff --git a/tests/xfs/179 b/tests/xfs/179 index 18459cb..8cb3ddd 100755 --- a/tests/xfs/179 +++ b/tests/xfs/179 @@ -67,9 +67,9 @@ _cp_reflink $testdir/file1 $testdir/file2 >> $seqres.full echo "Change reference count" _scratch_unmount echo "set refcount to -4" >> $seqres.full -$XFS_DB_PROG -x -c 'agf 0' -c 'addr refcntroot' -c 'write recs[1].refcount 4294967292' $SCRATCH_DEV >> $seqres.full +$XFS_DB_PROG -x -c 'agf 0' -c 'addr refcntroot' -c 'write recs[1].refcount 4294967292' `_scratch_xfs_db_options` >> $seqres.full echo "check refcount after setting to -4" >> $seqres.full -$XFS_DB_PROG -c 'agf 0' -c 'addr refcntroot' -c 'p recs[1]' $SCRATCH_DEV >> $seqres.full +$XFS_DB_PROG -c 'agf 0' -c 'addr refcntroot' -c 'p recs[1]' `_scratch_xfs_db_options` >> $seqres.full _scratch_mount >> $seqres.full echo "Reflink the overlinked file" @@ -82,7 +82,7 @@ _cp_reflink $testdir/file1 $testdir/file7 >> $seqres.full echo "Check scratch fs" _scratch_unmount echo "check refcount after reflinking 5 more times" >> $seqres.full -$XFS_DB_PROG -c 'agf 0' -c 'addr refcntroot' -c 'p recs[1]' $SCRATCH_DEV >> $seqres.full +$XFS_DB_PROG -c 'agf 0' -c 'addr refcntroot' -c 'p recs[1]' `_scratch_xfs_db_options` >> $seqres.full _scratch_mount >> $seqres.full echo "CoW a couple files" @@ -93,7 +93,7 @@ _pwrite_byte 0x62 0 $blksz $testdir/file7 >> $seqres.full echo "Check scratch fs" _scratch_unmount echo "check refcount after cowing 3 files" >> $seqres.full -$XFS_DB_PROG -c 'agf 0' -c 'addr refcntroot' -c 'p recs[1]' $SCRATCH_DEV >> $seqres.full +$XFS_DB_PROG -c 'agf 0' -c 'addr refcntroot' -c 'p recs[1]' `_scratch_xfs_db_options` >> $seqres.full _scratch_mount >> $seqres.full echo "Remove reflinked files" @@ -102,7 +102,7 @@ rm -rf $testdir/file* echo "Check scratch fs" _scratch_unmount echo "check refcount after removing all files" >> $seqres.full -$XFS_DB_PROG -c 'agf 0' -c 'addr refcntroot' -c 'p recs[1]' $SCRATCH_DEV >> $seqres.full +$XFS_DB_PROG -c 'agf 0' -c 'addr refcntroot' -c 'p recs[1]' `_scratch_xfs_db_options` >> $seqres.full _scratch_xfs_repair -o force_geometry -n >> $seqres.full 2>&1 res=$? if [ $res -eq 0 ]; then diff --git a/tests/xfs/186 b/tests/xfs/186 index 192a8c8..347db0d 100755 --- a/tests/xfs/186 +++ b/tests/xfs/186 @@ -98,8 +98,8 @@ _print_inode() { echo "" echo "=================================" - $XFS_DB_PROG -c "version" $SCRATCH_DEV 2>&1 | _filter_version - $XFS_DB_PROG -c "inode $inum" -c p $SCRATCH_DEV 2>&1 | _filter_inode + $XFS_DB_PROG -c "version" `_scratch_xfs_db_options` 2>&1 | _filter_version + $XFS_DB_PROG -c "inode $inum" -c p `_scratch_xfs_db_options` 2>&1 | _filter_inode echo "=================================" } @@ -136,7 +136,7 @@ _changeto_attr1() echo "" echo "Try setting attr1 by db" echo "" - $XFS_DB_PROG -x -c "version attr1" $SCRATCH_DEV | _filter_version + $XFS_DB_PROG -x -c "version attr1" `_scratch_xfs_db_options` | _filter_version } # get standard environment, filters and checks @@ -173,7 +173,7 @@ fi # set inum to root dir ino # we'll add in dirents and EAs into the root directory -eval `$XFS_DB_PROG -r -c 'sb 0' -c 'p rootino' $SCRATCH_DEV | $SED_PROG 's/ //g'` +eval `$XFS_DB_PROG -r -c 'sb 0' -c 'p rootino' `_scratch_xfs_db_options` | $SED_PROG 's/ //g'` inum=$rootino fork_dir=$SCRATCH_MNT _print_inode diff --git a/tests/xfs/187 b/tests/xfs/187 index 836b924..68a00c9 100755 --- a/tests/xfs/187 +++ b/tests/xfs/187 @@ -76,7 +76,7 @@ export MKFS_LAZY="-m crc=0 -l lazy-count=1 -i projid32bit=0" # Make sure that when we think we are testing with morebits off # that we really are. _scratch_mkfs -i attr=1 $MKFS_NO_LAZY >/dev/null 2>&1 -$XFS_DB_PROG -c version $SCRATCH_DEV 2>&1 >$tmp.db +$XFS_DB_PROG -c version `_scratch_xfs_db_options` 2>&1 >$tmp.db if grep -i morebits $tmp.db then echo "" @@ -91,13 +91,13 @@ echo "" echo "attr2 fs" echo "" _scratch_mkfs -i attr=2 $MKFS_NO_LAZY >/dev/null 2>&1 -$XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version +$XFS_DB_PROG -r -c version `_scratch_xfs_db_options` 2>&1 | _filter_version echo "" echo "noattr2 fs" echo "" _scratch_mount -o noattr2 $UMOUNT_PROG $SCRATCH_MNT -$XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version +$XFS_DB_PROG -r -c version `_scratch_xfs_db_options` 2>&1 | _filter_version # adding an EA will ensure the ATTR1 flag is turned on echo "" @@ -106,7 +106,7 @@ echo "" echo "attr2 fs" echo "" _scratch_mkfs -i attr=2 $MKFS_NO_LAZY >/dev/null 2>&1 -$XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version +$XFS_DB_PROG -r -c version `_scratch_xfs_db_options` 2>&1 | _filter_version echo "" echo "noattr2 fs" echo "" @@ -117,7 +117,7 @@ $SETFATTR_PROG -n user.test -v 0xbabe testfile $GETFATTR_PROG testfile cd $here $UMOUNT_PROG $SCRATCH_MNT -$XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version +$XFS_DB_PROG -r -c version `_scratch_xfs_db_options` 2>&1 | _filter_version echo "" echo "*** 3. test noattr2 mount and lazy sb ***" @@ -126,7 +126,7 @@ echo "" echo "attr2 fs" echo "" _scratch_mkfs -i attr=2 $MKFS_LAZY >/dev/null 2>&1 -$XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version +$XFS_DB_PROG -r -c version `_scratch_xfs_db_options` 2>&1 | _filter_version echo "" echo "noattr2 fs" echo "" @@ -135,7 +135,7 @@ cd $SCRATCH_MNT touch testfile cd $here $UMOUNT_PROG $SCRATCH_MNT -$XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version +$XFS_DB_PROG -r -c version `_scratch_xfs_db_options` 2>&1 | _filter_version # success, all done status=0 diff --git a/tests/xfs/235 b/tests/xfs/235 index ef51d22..1329c28 100755 --- a/tests/xfs/235 +++ b/tests/xfs/235 @@ -73,7 +73,7 @@ echo "+ corrupt image" seq 0 $((agcount - 1)) | while read ag; do $XFS_DB_PROG -x -c "agf ${ag}" -c "agf ${ag}" -c "addr rmaproot" \ -c "stack" -c "blocktrash -x 4096 -y 4096 -z -n 8 -3" \ - ${SCRATCH_DEV} >> $seqres.full 2>&1 + `_scratch_xfs_db_options` >> $seqres.full 2>&1 done echo "+ mount image" diff --git a/tests/xfs/287 b/tests/xfs/287 index aca410a..14fa51b 100755 --- a/tests/xfs/287 +++ b/tests/xfs/287 @@ -49,7 +49,7 @@ _print_projid() $XFS_DB_PROG -r -c "inode $1" \ -c "print core.projid_lo" \ -c "print core.projid_hi" \ - $SCRATCH_DEV + `_scratch_xfs_db_options` } # real QA test starts here diff --git a/tests/xfs/298 b/tests/xfs/298 index bb836a0..18781ad 100755 --- a/tests/xfs/298 +++ b/tests/xfs/298 @@ -82,7 +82,7 @@ while [ $SIZE -lt 1024 ];do # umount and check the number of extents on the inode. Should be 0. cd _scratch_unmount >/dev/null 2>&1 - $XFS_DB_PROG -c "inode $inode" -c "p core.nextents" $SCRATCH_DEV + $XFS_DB_PROG -c "inode $inode" -c "p core.nextents" `_scratch_xfs_db_options` let SIZE=$SIZE+32 done From darrick.wong@oracle.com Thu Aug 25 18:29:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A94977CB3 for ; Thu, 25 Aug 2016 18:29:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2E6AAC004 for ; Thu, 25 Aug 2016 16:29:11 -0700 (PDT) X-ASG-Debug-ID: 1472167748-0bf57c55b31c7540001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id yRJqpuxlPys0UMlM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:29:09 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNT76F014579 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:07 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNT6tf002301 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:07 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNT6vd025042; Thu, 25 Aug 2016 23:29:06 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:29:05 -0700 Subject: [PATCH 07/13] xfs: test swapext with reflink From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/13] xfs: test swapext with reflink To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:29:03 -0700 Message-ID: <147216774386.32641.14276663608220751384.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167749 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12826 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add a few tests to stress the new swapext code for reflink and rmap. Signed-off-by: Darrick J. Wong --- tests/xfs/873 | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/873.out | 6 +++ tests/xfs/874 | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/874.out | 10 +++++ tests/xfs/875 | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/875.out | 12 ++++++ tests/xfs/group | 3 + 7 files changed, 338 insertions(+) create mode 100755 tests/xfs/873 create mode 100644 tests/xfs/873.out create mode 100755 tests/xfs/874 create mode 100644 tests/xfs/874.out create mode 100755 tests/xfs/875 create mode 100644 tests/xfs/875.out diff --git a/tests/xfs/873 b/tests/xfs/873 new file mode 100755 index 0000000..75334c6 --- /dev/null +++ b/tests/xfs/873 @@ -0,0 +1,108 @@ +#! /bin/bash +# FS QA Test No. 873 +# +# See how well xfs_fsr handles "defragging" a file with a hojillion extents. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_test_program "punch-alternating" +_require_command "$XFS_FSR_PROG" "xfs_fsr" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +testdir="$SCRATCH_MNT/test-$seq" +mkdir "$testdir" + +# Setup for 16000 blocks, but we'll accept stress testing down to +# 2^10 blocks... that should be plenty for anyone. +fnr=$((12 + LOAD_FACTOR)) +free_blocks=$(stat -f -c '%a' "$testdir") +blksz=$(stat -f -c '%S' "$testdir") +space_avail=$((free_blocks * blksz)) +calc_space() { + blocks_needed=$(( 2 ** (fnr + 1) )) + space_needed=$((blocks_needed * blksz * 5 / 4)) +} +calc_space +while test $space_needed -gt $space_avail; do + fnr=$((fnr - 1)) + calc_space +done +test $fnr -lt 10 && _notrun "Insufficient space for stress test; would only create $blocks_needed extents." +bytes=$((blocks_needed * blksz)) + +echo "Create a many-block file" +echo "creating $blocks_needed blocks..." >> "$seqres.full" +_pwrite_byte 0x62 0 $blksz $testdir/file0 >> $seqres.full +"$XFS_IO_PROG" -f -c "pwrite -S 0x61 -b 4194304 0 $bytes" "$testdir/file1" >> "$seqres.full" +echo "punching..." >> "$seqres.full" +"$here/src/punch-alternating" "$testdir/file1" >> "$seqres.full" +seq 0 2 $((2 ** (fnr + 1) )) | while read lblk; do + _reflink_range $testdir/file0 0 $testdir/file1 $((lblk * blksz)) $blksz >> $seqres.full +done +echo "...done" >> "$seqres.full" +_scratch_cycle_mount + +echo "Reflink the big file" +echo "reflinking $((blocks_needed / 2)) blocks, $((bytes / 2)) bytes" >> "$seqres.full" +_reflink_range "$testdir/file1" 0 "$testdir/file2" 0 $bytes >> "$seqres.full" + +echo "Defrag the big file" +old_nextents=$(_count_extents $testdir/file1) +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full +new_nextents=$(_count_extents $testdir/file1) + +echo "Check extent count" +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full +test $old_nextents -gt $new_nextents || echo "FAIL: $old_nextents -> $new_nextents" + +# success, all done +status=0 +exit diff --git a/tests/xfs/873.out b/tests/xfs/873.out new file mode 100644 index 0000000..9dddf55 --- /dev/null +++ b/tests/xfs/873.out @@ -0,0 +1,6 @@ +QA output created by 873 +Format and mount +Create a many-block file +Reflink the big file +Defrag the big file +Check extent count diff --git a/tests/xfs/874 b/tests/xfs/874 new file mode 100755 index 0000000..2e799ce --- /dev/null +++ b/tests/xfs/874 @@ -0,0 +1,97 @@ +#! /bin/bash +# FS QA Test No. 874 +# +# Ensure that xfs_fsr handles errors correctly while defragging files. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/reflink +. ./common/inject + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_command "$XFS_FSR_PROG" "xfs_fsr" +_require_xfs_io_error_injection "bmap_finish_one" +_require_xfs_scratch_rmapbt + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount >> "$seqres.full" 2>&1 + +testdir="$SCRATCH_MNT/test-$seq" +blksz=65536 +blks=3 +mkdir "$testdir" + +echo "Create a many-block file" +_pwrite_byte 0x62 0 $((blksz * blks)) $testdir/file1 >> $seqres.full +_pwrite_byte 0x63 0 $blksz $testdir/file2 >> $seqres.full +_reflink_range $testdir/file2 0 $testdir/file1 $blksz $blksz >> $seqres.full +_scratch_cycle_mount +$XFS_IO_PROG -c 'bmap -v' $testdir/file1 >> $seqres.full + +echo "Inject error" +_scratch_inject_error "bmap_finish_one" + +echo "Defrag the file" +old_nextents=$(_count_extents $testdir/file1) +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full 2>&1 + +echo "FS should be shut down, touch will fail" +touch $SCRATCH_MNT/badfs 2>&1 | _filter_scratch + +echo "Remount to replay log" | tee /dev/ttyprintk +_scratch_inject_logprint >> $seqres.full +new_nextents=$(_count_extents $testdir/file1) + +echo "Check extent count" | tee /dev/ttyprintk +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full + +echo "FS should be online, touch should succeed" +touch $SCRATCH_MNT/goodfs +$XFS_IO_PROG -c 'bmap -v' $testdir/file1 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/874.out b/tests/xfs/874.out new file mode 100644 index 0000000..dbc0f49 --- /dev/null +++ b/tests/xfs/874.out @@ -0,0 +1,10 @@ +QA output created by 874 +Format and mount +Create a many-block file +Inject error +Defrag the file +FS should be shut down, touch will fail +touch: cannot touch 'SCRATCH_MNT/badfs': Input/output error +Remount to replay log +Check extent count +FS should be online, touch should succeed diff --git a/tests/xfs/875 b/tests/xfs/875 new file mode 100755 index 0000000..d579ba1 --- /dev/null +++ b/tests/xfs/875 @@ -0,0 +1,102 @@ +#! /bin/bash +# FS QA Test No. 875 +# +# Ensure that xfs_fsr handles quota correctly while defragging files. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr +. ./common/reflink +. ./common/quota + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_cp_reflink +_require_command "$XFS_FSR_PROG" "xfs_fsr" +_require_quota +_require_nobody + +do_repquota() +{ + repquota $SCRATCH_MNT | egrep '^(fsgqa|root|nobody)' +} + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +export MOUNT_OPTIONS="-o usrquota,grpquota $MOUNT_OPTIONS" +_scratch_mount >> "$seqres.full" 2>&1 +quotacheck -u -g $SCRATCH_MNT 2> /dev/null +quotaon $SCRATCH_MNT 2> /dev/null + +testdir="$SCRATCH_MNT/test-$seq" +blksz=65536 +blks=3 +mkdir "$testdir" + +echo "Create a many-block file" +touch $testdir/file1 +chown nobody $testdir/file1 +touch $testdir/file2 +chown nobody $testdir/file2 +_pwrite_byte 0x62 0 $((blksz * blks)) $testdir/file1 >> $seqres.full +_pwrite_byte 0x63 0 $blksz $testdir/file2 >> $seqres.full +_reflink_range $testdir/file2 0 $testdir/file1 $blksz $blksz >> $seqres.full +do_repquota +_scratch_cycle_mount + +echo "Defrag the file" +old_nextents=$(_count_extents $testdir/file1) +$XFS_FSR_PROG -v -d $testdir/file1 >> $seqres.full +new_nextents=$(_count_extents $testdir/file1) +do_repquota + +echo "Remount the FS to see if accounting changes" +_scratch_cycle_mount +do_repquota + +echo "Check extent count" +$XFS_IO_PROG -c 'stat -v' $testdir/file1 >> $seqres.full +$XFS_IO_PROG -c 'stat -v' $testdir/file2 >> $seqres.full +echo "extents: $old_nextents -> $new_nextents" >> $seqres.full +test $old_nextents -gt $new_nextents || echo "FAIL: $old_nextents -> $new_nextents" + +# success, all done +status=0 +exit diff --git a/tests/xfs/875.out b/tests/xfs/875.out new file mode 100644 index 0000000..57653e9 --- /dev/null +++ b/tests/xfs/875.out @@ -0,0 +1,12 @@ +QA output created by 875 +Format and mount +Create a many-block file +root -- 0 0 0 4 0 0 +nobody -- 256 0 0 2 0 0 +Defrag the file +root -- 0 0 0 4 0 0 +nobody -- 256 0 0 2 0 0 +Remount the FS to see if accounting changes +root -- 0 0 0 4 0 0 +nobody -- 256 0 0 2 0 0 +Check extent count diff --git a/tests/xfs/group b/tests/xfs/group index 6905a62..8565204 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -308,3 +308,6 @@ 325 auto quick clone 326 auto quick clone 327 auto quick clone +873 auto quick clone fsr +874 auto quick clone fsr +875 auto quick clone fsr quota From darrick.wong@oracle.com Thu Aug 25 18:29:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B2B7D7CDF for ; Thu, 25 Aug 2016 18:29:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 856398F8035 for ; Thu, 25 Aug 2016 16:29:18 -0700 (PDT) X-ASG-Debug-ID: 1472167756-0bf57b5311209080001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id GMVTL6se5h4LHonh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:29:16 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNTEDW007434 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:15 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNTDbf027929 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:14 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNTDTh027179; Thu, 25 Aug 2016 23:29:13 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:29:12 -0700 Subject: [PATCH 08/13] xfs: more rmapbt tests From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/13] xfs: more rmapbt tests To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:29:11 -0700 Message-ID: <147216775128.32641.13355812513622220212.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167756 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6932 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines More tests for the reverse mapping functionality. Signed-off-by: Darrick J. Wong --- tests/xfs/876 | 75 +++++++++++++++++++++++++++++++++++++++++++ tests/xfs/876.out | 4 ++ tests/xfs/877 | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/877.out | 10 ++++++ tests/xfs/group | 2 + 5 files changed, 183 insertions(+) create mode 100755 tests/xfs/876 create mode 100644 tests/xfs/876.out create mode 100755 tests/xfs/877 create mode 100644 tests/xfs/877.out diff --git a/tests/xfs/876 b/tests/xfs/876 new file mode 100755 index 0000000..7f447c9 --- /dev/null +++ b/tests/xfs/876 @@ -0,0 +1,75 @@ +#! /bin/bash +# FS QA Test No. 876 +# +# Create a big enough rmapbt that we tickle a fdblocks accounting bug. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch +_require_xfs_scratch_rmapbt +_require_scratch_reflink +_require_test_program "punch-alternating" + +rm -f "$seqres.full" + +echo "+ create scratch fs" +_scratch_mkfs > "$seqres.full" 2>&1 + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f $SCRATCH_MNT -c '%S')" + +bt_ptrs=$(( (blksz - 56) / 44 )) +bt_recs=$(( (blksz - 56) / 24 )) + +blocks=$((bt_ptrs * bt_recs + 1)) +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) +len=$((blocks * blksz)) + +echo "+ make some files" +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" + +# success, all done +status=0 +exit diff --git a/tests/xfs/876.out b/tests/xfs/876.out new file mode 100644 index 0000000..96c1970 --- /dev/null +++ b/tests/xfs/876.out @@ -0,0 +1,4 @@ +QA output created by 876 ++ create scratch fs ++ mount fs image ++ make some files diff --git a/tests/xfs/877 b/tests/xfs/877 new file mode 100755 index 0000000..2ad7d30 --- /dev/null +++ b/tests/xfs/877 @@ -0,0 +1,92 @@ +#! /bin/bash +# FS QA Test No. 877 +# +# Make sure query_range returns -EINVAL if lowkey > highkey. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/attr + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_xfs_scratch_rmapbt +_require_command "$XFS_DB_PROG" "xfs_db" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fpunch" +_require_xfs_io_command "fzero" +_require_xfs_io_command "fcollapse" +_require_xfs_io_command "finsert" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount +blksz=65536 +blocks=16 +len=$((blocks * blksz)) + +echo "Create some files" +$XFS_IO_PROG -f -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full + +echo "Manipulate file" +$XFS_IO_PROG -c "fpunch $blksz $blksz" \ + -c "fzero $((3 * blksz)) $blksz" \ + -c "pwrite -S 0x69 $((5 * blksz)) $blksz" \ + -c "fpunch $((7 * blksz)) $blksz" \ + -c "fsync" \ + -c "pwrite -S 0x70 $((7 * blksz)) $blksz" \ + -c "fcollapse $((9 * blksz)) $blksz" \ + -c "finsert $((10 * blksz)) $blksz" $SCRATCH_MNT/f1 >> $seqres.full + +echo "Check file" +md5sum $SCRATCH_MNT/f1 | _filter_scratch +od -tx1 -Ad -c $SCRATCH_MNT/f1 >> $seqres.full + +echo "Unmount" +_scratch_unmount + +echo "Try a regular fsmap" +$XFS_DB_PROG -c 'fsmap' `_scratch_xfs_db_options` >> $seqres.full +$XFS_DB_PROG -c 'fsmap 0 5' `_scratch_xfs_db_options` >> $seqres.full + +echo "Try a bad fsmap" +$XFS_DB_PROG -c 'fsmap 5 4' `_scratch_xfs_db_options` + +# success, all done +status=0 +exit diff --git a/tests/xfs/877.out b/tests/xfs/877.out new file mode 100644 index 0000000..4a2242f --- /dev/null +++ b/tests/xfs/877.out @@ -0,0 +1,10 @@ +QA output created by 877 +Format and mount +Create some files +Manipulate file +Check file +e45c5707fcf6817e914ffb6ce37a0ac7 SCRATCH_MNT/f1 +Unmount +Try a regular fsmap +Try a bad fsmap +Error 22 while querying fsmap btree. diff --git a/tests/xfs/group b/tests/xfs/group index 8565204..72580e9 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -311,3 +311,5 @@ 873 auto quick clone fsr 874 auto quick clone fsr 875 auto quick clone fsr quota +876 auto quick rmap clone +877 auto quick rmap clone From darrick.wong@oracle.com Thu Aug 25 18:29:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 07E6D7CAE for ; Thu, 25 Aug 2016 18:29:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8CEB8AC001 for ; Thu, 25 Aug 2016 16:29:26 -0700 (PDT) X-ASG-Debug-ID: 1472167761-0bf8155c771e5f70001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id kgBC8SNnc05t16tz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:29:22 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNTKhB007479 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:20 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNTKDh002970 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:20 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNTJun027288; Thu, 25 Aug 2016 23:29:19 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:29:19 -0700 Subject: [PATCH 09/13] xfs: test realtime rmapbt code From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/13] xfs: test realtime rmapbt code To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:29:17 -0700 Message-ID: <147216775764.32641.4754646041045321851.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167761 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 40659 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Test the realtime rmap btree code by exercising various IO patterns on realtime files. Signed-off-by: Darrick J. Wong --- tests/xfs/878 | 91 +++++++++++++++++++++++++++++++++++++++++++ tests/xfs/878.out | 9 ++++ tests/xfs/879 | 67 ++++++++++++++++++++++++++++++++ tests/xfs/879.out | 7 +++ tests/xfs/880 | 86 +++++++++++++++++++++++++++++++++++++++++ tests/xfs/880.out | 7 +++ tests/xfs/881 | 95 +++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/881.out | 8 ++++ tests/xfs/882 | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/882.out | 11 +++++ tests/xfs/883 | 90 +++++++++++++++++++++++++++++++++++++++++++ tests/xfs/883.out | 10 +++++ tests/xfs/884 | 91 +++++++++++++++++++++++++++++++++++++++++++ tests/xfs/884.out | 9 ++++ tests/xfs/885 | 95 +++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/885.out | 10 +++++ tests/xfs/886 | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/886.out | 7 +++ tests/xfs/887 | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/887.out | 7 +++ tests/xfs/888 | 81 +++++++++++++++++++++++++++++++++++++++ tests/xfs/888.out | 6 +++ tests/xfs/group | 11 +++++ 23 files changed, 1121 insertions(+) create mode 100755 tests/xfs/878 create mode 100644 tests/xfs/878.out create mode 100755 tests/xfs/879 create mode 100644 tests/xfs/879.out create mode 100755 tests/xfs/880 create mode 100644 tests/xfs/880.out create mode 100755 tests/xfs/881 create mode 100644 tests/xfs/881.out create mode 100755 tests/xfs/882 create mode 100644 tests/xfs/882.out create mode 100755 tests/xfs/883 create mode 100644 tests/xfs/883.out create mode 100755 tests/xfs/884 create mode 100644 tests/xfs/884.out create mode 100755 tests/xfs/885 create mode 100644 tests/xfs/885.out create mode 100755 tests/xfs/886 create mode 100644 tests/xfs/886.out create mode 100755 tests/xfs/887 create mode 100644 tests/xfs/887.out create mode 100755 tests/xfs/888 create mode 100644 tests/xfs/888.out diff --git a/tests/xfs/878 b/tests/xfs/878 new file mode 100755 index 0000000..557e4ae --- /dev/null +++ b/tests/xfs/878 @@ -0,0 +1,91 @@ +#! /bin/bash +# FS QA Test No. 878 +# +# Set rrmapino to another inode on an non-rt rmap fs and see if repair fixes it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_xfs_scratch_rmapbt + +rm -f "$seqres.full" + +unset SCRATCH_RTDEV + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Create some files" +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full +echo garbage > $SCRATCH_MNT/f3 +ino=$(stat -c '%i' $SCRATCH_MNT/f3) +_scratch_unmount + +echo "Corrupt fs" +$XFS_DB_PROG -x -c 'sb 0' \ + -c "write rrmapino $ino" `_scratch_xfs_db_options` >> $seqres.full +_scratch_mount + +echo "Check files" +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch + +echo "Try to create more files" +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 + +echo "Repair fs" +_scratch_unmount 2>&1 | _filter_scratch +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ + | tee $tmp.logprint | grep -q "" +if [ $? -ne 0 ]; then + echo "Dirty log, zeroing..." >> $seqres.full + _scratch_xfs_repair -L >> $seqres.full 2>&1 +else + _scratch_xfs_repair >> $seqres.full 2>&1 +fi +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "Try to create more files (again)" +_scratch_mount +$XFS_IO_PROG -f -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/878.out b/tests/xfs/878.out new file mode 100644 index 0000000..e134506 --- /dev/null +++ b/tests/xfs/878.out @@ -0,0 +1,9 @@ +QA output created by 878 +Format and mount +Create some files +Corrupt fs +Check files +8f27047948255cb84872e2dd7c0bc56d SCRATCH_MNT/f1 +Try to create more files +Repair fs +Try to create more files (again) diff --git a/tests/xfs/879 b/tests/xfs/879 new file mode 100755 index 0000000..247b3af --- /dev/null +++ b/tests/xfs/879 @@ -0,0 +1,67 @@ +#! /bin/bash +# FS QA Test No. 879 +# +# Ensure that we can create a few realtime files on a rmapbt filesystem. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Create a few files" +$XFS_IO_PROG -f -R -c 'pwrite -S 0x67 0 50000' -c fsync $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c 'pwrite -S 0x67 0 50000' -c fsync $SCRATCH_MNT/f2 >> $seqres.full +_scratch_cycle_mount + +echo "Grab contents" +md5sum $SCRATCH_MNT/f1 $SCRATCH_MNT/f2 | _filter_scratch + +echo "Remove one file" +rm -rf $SCRATCH_MNT/f2 + +# success, all done +status=0 +exit diff --git a/tests/xfs/879.out b/tests/xfs/879.out new file mode 100644 index 0000000..9dfe48b --- /dev/null +++ b/tests/xfs/879.out @@ -0,0 +1,7 @@ +QA output created by 879 +Format and mount +Create a few files +Grab contents +10abe2628d19eb1c2ebe18aad7b14820 SCRATCH_MNT/f1 +10abe2628d19eb1c2ebe18aad7b14820 SCRATCH_MNT/f2 +Remove one file diff --git a/tests/xfs/880 b/tests/xfs/880 new file mode 100755 index 0000000..8cd509f --- /dev/null +++ b/tests/xfs/880 @@ -0,0 +1,86 @@ +#! /bin/bash +# FS QA Test No. 880 +# +# Exercise expanding and shrinking the realtime rmap btree. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt +_require_test_program "punch-alternating" +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs | _filter_mkfs 2>$tmp.mkfs >/dev/null +. $tmp.mkfs +cat $tmp.mkfs > "$seqres.full" 2>&1 +_scratch_mount +blksz="$(stat -f $SCRATCH_MNT -c '%S')" + +echo "Create a three-level rtrmapbt" +i_ptrs=$(( (isize - 176) / 56 )) +bt_ptrs=$(( (blksz - 56) / 56 )) +bt_recs=$(( (blksz - 56) / 32 )) + +blocks=$((i_ptrs * bt_ptrs * bt_recs)) +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) +len=$((blocks * rtextsz)) + +echo "Create big file" +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full + +echo "Explode the rtrmapbt" +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" +_scratch_cycle_mount + +echo "Remove half the records" +rm -rf $SCRATCH_MNT/f1 +_scratch_cycle_mount + +echo "Remove the rest of the records" +rm -rf $SCRATCH_MNT/f2 + +# success, all done +status=0 +exit diff --git a/tests/xfs/880.out b/tests/xfs/880.out new file mode 100644 index 0000000..b87665b --- /dev/null +++ b/tests/xfs/880.out @@ -0,0 +1,7 @@ +QA output created by 880 +Format and mount +Create a three-level rtrmapbt +Create big file +Explode the rtrmapbt +Remove half the records +Remove the rest of the records diff --git a/tests/xfs/881 b/tests/xfs/881 new file mode 100755 index 0000000..750a92a --- /dev/null +++ b/tests/xfs/881 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. 881 +# +# Exercise metadump on realtime rmapbt preservation. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt +_require_test_program "punch-alternating" +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs | _filter_mkfs 2>$tmp.mkfs >/dev/null +. $tmp.mkfs +cat $tmp.mkfs > "$seqres.full" 2>&1 +_scratch_mount +blksz="$(stat -f $SCRATCH_MNT -c '%S')" + +metadump_file=$TEST_DIR/${seq}_metadump +rm -rf $metadump_file + +echo "Create a three-level rtrmapbt" +i_ptrs=$(( (isize - 176) / 56 )) +bt_ptrs=$(( (blksz - 56) / 56 )) +bt_recs=$(( (blksz - 56) / 32 )) + +blocks=$((i_ptrs * bt_ptrs * bt_recs)) +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) +len=$((blocks * rtextsz)) + +echo "Create big file" +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full + +echo "Explode the rtrmapbt" +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" +_scratch_cycle_mount + +echo "Create metadump file" +_scratch_unmount +_scratch_metadump $metadump_file + +# Now restore the obfuscated one back and take a look around +echo "Restore metadump" +xfs_mdrestore $metadump_file $TEST_DIR/image +SCRATCH_DEV=$TEST_DIR/image _scratch_mount +SCRATCH_DEV=$TEST_DIR/image _scratch_unmount + +echo "Check restored fs" +_check_generic_filesystem $metadump_file + +# success, all done +status=0 +exit diff --git a/tests/xfs/881.out b/tests/xfs/881.out new file mode 100644 index 0000000..6ad156c --- /dev/null +++ b/tests/xfs/881.out @@ -0,0 +1,8 @@ +QA output created by 881 +Format and mount +Create a three-level rtrmapbt +Create big file +Explode the rtrmapbt +Create metadump file +Restore metadump +Check restored fs diff --git a/tests/xfs/882 b/tests/xfs/882 new file mode 100755 index 0000000..3c44540 --- /dev/null +++ b/tests/xfs/882 @@ -0,0 +1,111 @@ +#! /bin/bash +# FS QA Test No. 882 +# +# Corrupt the realtime rmapbt and see how the kernel and xfs_repair deal. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt +_require_test_program "punch-alternating" +_require_xfs_io_command "falloc" + +rm -f "$seqres.full" + +echo "+ create scratch fs" +_scratch_mkfs | _filter_mkfs 2>$tmp.mkfs >/dev/null +. $tmp.mkfs +cat $tmp.mkfs > "$seqres.full" 2>&1 + +echo "+ mount fs image" +_scratch_mount +blksz="$(stat -f $SCRATCH_MNT -c '%S')" + +i_ptrs=$(( (isize - 176) / 56 )) +bt_ptrs=$(( (blksz - 56) / 56 )) +bt_recs=$(( (blksz - 56) / 32 )) + +blocks=$((i_ptrs * bt_ptrs * bt_recs + 1)) +_require_fs_space $SCRATCH_MNT $(( (2 * blocks * blksz) * 5 / 4096 )) +len=$((blocks * blksz)) + +echo "+ make some files" +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" +_scratch_unmount + +echo "+ check fs" +_scratch_xfs_repair -n >> $seqres.full 2>&1 || echo "xfs_repair should not fail" + +echo "+ corrupt image" +$XFS_DB_PROG -x -c "sb" -c "addr rrmapino" -c "addr u3.rtrmapbt.ptrs[1]" \ + -c "stack" -c "blocktrash -x 4096 -y 4096 -n 8 -3 -z" \ + `_scratch_xfs_db_options` >> $seqres.full 2>&1 + +echo "+ mount image" +_scratch_mount + +echo "+ copy more" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 1" $SCRATCH_MNT/e3 >> $seqres.full 2>&1 +test -s ${SCRATCH_MNT}/f3 && echo "should not be able to copy with busted rtrmap btree" +_scratch_unmount + +echo "+ repair fs" +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ + | tee $tmp.logprint | grep -q "" +if [ $? -ne 0 ]; then + echo "Dirty log, zeroing..." >> $seqres.full + _scratch_xfs_repair -L >> $seqres.full 2>&1 +else + _scratch_xfs_repair >> $seqres.full 2>&1 +fi +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "+ mount image (2)" +_scratch_mount + +echo "+ copy more (2)" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 1" $SCRATCH_MNT/e4 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/882.out b/tests/xfs/882.out new file mode 100644 index 0000000..5ebe620 --- /dev/null +++ b/tests/xfs/882.out @@ -0,0 +1,11 @@ +QA output created by 882 ++ create scratch fs ++ mount fs image ++ make some files ++ check fs ++ corrupt image ++ mount image ++ copy more ++ repair fs ++ mount image (2) ++ copy more (2) diff --git a/tests/xfs/883 b/tests/xfs/883 new file mode 100755 index 0000000..86dd047 --- /dev/null +++ b/tests/xfs/883 @@ -0,0 +1,90 @@ +#! /bin/bash +# FS QA Test No. 883 +# +# Set rrmapino to zero on an rtrmap fs and see if repair fixes it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Create some files" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full +_scratch_unmount + +echo "Corrupt fs" +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rrmapino' \ + -c 'write core.nlinkv2 0' -c 'write core.mode 0' -c 'sb 0' \ + -c 'write rrmapino 0' `_scratch_xfs_db_options` >> $seqres.full +_scratch_mount >> $seqres.full 2>&1 && echo "mount should have failed" + +echo "Check files" +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch + +echo "Try to create more files" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 +test -e $SCRATCH_MNT/f3 && echo "should not have been able to write f3" + +echo "Repair fs" +_scratch_unmount 2>&1 | _filter_scratch +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ + | tee $tmp.logprint | grep -q "" +if [ $? -ne 0 ]; then + echo "Dirty log, zeroing..." >> $seqres.full + _scratch_xfs_repair -L >> $seqres.full 2>&1 +else + _scratch_xfs_repair >> $seqres.full 2>&1 +fi +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "Try to create more files (again)" +_scratch_mount +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/883.out b/tests/xfs/883.out new file mode 100644 index 0000000..6e75ac1 --- /dev/null +++ b/tests/xfs/883.out @@ -0,0 +1,10 @@ +QA output created by 883 +Format and mount +Create some files +Corrupt fs +Check files +md5sum: SCRATCH_MNT/f1: No such file or directory +Try to create more files +Repair fs +umount: SCRATCH_DEV: not mounted +Try to create more files (again) diff --git a/tests/xfs/884 b/tests/xfs/884 new file mode 100755 index 0000000..51071e0 --- /dev/null +++ b/tests/xfs/884 @@ -0,0 +1,91 @@ +#! /bin/bash +# FS QA Test No. 884 +# +# Link rrmapino into the rootdir on an rtrmap fs and see if repair fixes it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Create some files" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full +echo garbage > $SCRATCH_MNT/f3 +ln $SCRATCH_MNT/f3 $SCRATCH_MNT/f4 +_scratch_unmount + +echo "Corrupt fs" +rrmapino=$($XFS_DB_PROG -c 'sb 0' -c 'p rrmapino' `_scratch_xfs_db_options` | awk '{print $3}') +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rootino' \ + -c "write u3.sfdir3.list[3].inumber.i4 $rrmapino" `_scratch_xfs_db_options` >> $seqres.full +_scratch_mount + +echo "Check files" +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch + +echo "Try to create more files" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 + +echo "Repair fs" +_scratch_unmount 2>&1 | _filter_scratch +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ + | tee $tmp.logprint | grep -q "" +if [ $? -ne 0 ]; then + echo "Dirty log, zeroing..." >> $seqres.full + _scratch_xfs_repair -L >> $seqres.full 2>&1 +else + _scratch_xfs_repair >> $seqres.full 2>&1 +fi +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "Try to create more files (again)" +_scratch_mount +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/884.out b/tests/xfs/884.out new file mode 100644 index 0000000..17a73ef --- /dev/null +++ b/tests/xfs/884.out @@ -0,0 +1,9 @@ +QA output created by 884 +Format and mount +Create some files +Corrupt fs +Check files +8f27047948255cb84872e2dd7c0bc56d SCRATCH_MNT/f1 +Try to create more files +Repair fs +Try to create more files (again) diff --git a/tests/xfs/885 b/tests/xfs/885 new file mode 100755 index 0000000..1839c11 --- /dev/null +++ b/tests/xfs/885 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. 885 +# +# Set rrmapino to another inode on an rtrmap fs and see if repair fixes it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Create some files" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f2 >> $seqres.full +echo garbage > $SCRATCH_MNT/f3 +ino=$(stat -c '%i' $SCRATCH_MNT/f3) +_scratch_unmount + +echo "Corrupt fs" +rrmapino=$($XFS_DB_PROG -c 'sb 0' -c 'p rrmapino' `_scratch_xfs_db_options` | awk '{print $3}') +$XFS_DB_PROG -x -c "inode $rrmapino" \ + -c 'write core.format 2' -c 'write core.size 0' \ + -c 'write core.nblocks 0' -c 'sb 0' -c 'addr rootino' \ + -c "write u3.sfdir3.list[2].inumber.i4 $rrmapino" \ + -c 'sb 0' -c "write rrmapino $ino" `_scratch_xfs_db_options` >> $seqres.full +_scratch_mount >> $seqres.full 2>&1 && echo "mount should have failed" + +echo "Check files" +md5sum $SCRATCH_MNT/f1 2>&1 | _filter_scratch + +echo "Try to create more files" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f3 >> $seqres.full 2>&1 +test -e $SCRATCH_MNT/f3 && echo "should not have been able to write f3" + +echo "Repair fs" +_scratch_unmount 2>&1 | _filter_scratch +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ + | tee $tmp.logprint | grep -q "" +if [ $? -ne 0 ]; then + echo "Dirty log, zeroing..." >> $seqres.full + _scratch_xfs_repair -L >> $seqres.full 2>&1 +else + _scratch_xfs_repair >> $seqres.full 2>&1 +fi +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "Try to create more files (again)" +_scratch_mount +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/885.out b/tests/xfs/885.out new file mode 100644 index 0000000..df04f79 --- /dev/null +++ b/tests/xfs/885.out @@ -0,0 +1,10 @@ +QA output created by 885 +Format and mount +Create some files +Corrupt fs +Check files +md5sum: SCRATCH_MNT/f1: No such file or directory +Try to create more files +Repair fs +umount: SCRATCH_DEV: not mounted +Try to create more files (again) diff --git a/tests/xfs/886 b/tests/xfs/886 new file mode 100755 index 0000000..81e7e64 --- /dev/null +++ b/tests/xfs/886 @@ -0,0 +1,104 @@ +#! /bin/bash +# FS QA Test No. 886 +# +# Cross-link rrmapino to another inode on an rtrmap fs and see if repair fixes it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt +_require_test_program "punch-alternating" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs | _filter_mkfs 2>$tmp.mkfs >/dev/null +. $tmp.mkfs +cat $tmp.mkfs > "$seqres.full" 2>&1 +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount +blksz="$(stat -f $SCRATCH_MNT -c '%S')" + +i_ptrs=$(( (isize - 176) / 56 )) +bt_recs=$(( (blksz - 56) / 32 )) + +blocks=$((i_ptrs * bt_recs + 1)) +len=$((blocks * rtextsz)) + +echo "Create some files" +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" +echo garbage > $SCRATCH_MNT/f3 +ino=$(stat -c '%i' $SCRATCH_MNT/f3) +_scratch_unmount + +echo "Corrupt fs" +fsbno=$($XFS_DB_PROG -c "inode $ino" -c 'bmap' `_scratch_xfs_db_options` | \ + sed -e 's/^.*startblock \([0-9]*\) .*$/\1/g') + +$XFS_DB_PROG -x -c 'sb 0' -c 'addr rrmapino' \ + -c "write u3.rtrmapbt.ptrs[1] $fsbno" -c 'p' `_scratch_xfs_db_options` >> $seqres.full +_scratch_mount + +echo "Try to create more files" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 +test -e $SCRATCH_MNT/f5 && echo "should not have been able to write f5" + +echo "Repair fs" +_scratch_unmount 2>&1 | _filter_scratch +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ + | tee $tmp.logprint | grep -q "" +if [ $? -ne 0 ]; then + echo "Dirty log, zeroing..." >> $seqres.full + _scratch_xfs_repair -L >> $seqres.full 2>&1 +else + _scratch_xfs_repair >> $seqres.full 2>&1 +fi +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "Try to create more files (again)" +_scratch_mount +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/886.out b/tests/xfs/886.out new file mode 100644 index 0000000..7f00c5d --- /dev/null +++ b/tests/xfs/886.out @@ -0,0 +1,7 @@ +QA output created by 886 +Format and mount +Create some files +Corrupt fs +Try to create more files +Repair fs +Try to create more files (again) diff --git a/tests/xfs/887 b/tests/xfs/887 new file mode 100755 index 0000000..05d0b50 --- /dev/null +++ b/tests/xfs/887 @@ -0,0 +1,108 @@ +#! /bin/bash +# FS QA Test No. 887 +# +# Cross-link rrmapino to another inode on an rtrmap fs and see if repair fixes it. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt +_require_test_program "punch-alternating" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs | _filter_mkfs 2>$tmp.mkfs >/dev/null +. $tmp.mkfs +cat $tmp.mkfs > "$seqres.full" 2>&1 +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount +blksz="$(stat -f $SCRATCH_MNT -c '%S')" + +i_ptrs=$(( (isize - 176) / 56 )) +bt_recs=$(( (blksz - 56) / 32 )) + +blocks=$((i_ptrs * bt_recs + 1)) +len=$((blocks * rtextsz)) + +echo "Create some files" +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f2 >> $seqres.full +./src/punch-alternating $SCRATCH_MNT/f1 >> "$seqres.full" +./src/punch-alternating $SCRATCH_MNT/f2 >> "$seqres.full" +echo garbage > $SCRATCH_MNT/f3 +ino=$(stat -c '%i' $SCRATCH_MNT/f3) +_scratch_unmount + +echo "Corrupt fs" +$XFS_DB_PROG -c 'sb 0' -c 'addr rrmapino' \ + -c 'p u3.rtrmapbt.ptrs[1]' `_scratch_xfs_db_options` >> $seqres.full + +fsbno=$($XFS_DB_PROG -c 'sb 0' -c 'addr rrmapino' \ + -c 'p u3.rtrmapbt.ptrs[1]' `_scratch_xfs_db_options` | sed -e 's/^.*://g') +$XFS_DB_PROG -x -c "inode $ino" \ + -c "write u3.bmx[0].startblock $fsbno" `_scratch_xfs_db_options` >> $seqres.full +_scratch_mount + +od -tx1 -Ad -c $SCRATCH_MNT/f3 >> $seqres.full + +echo "Try to create more files" +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f5 >> $seqres.full 2>&1 +test ! -e $SCRATCH_MNT/f5 && echo "should have been able to write f5" + +echo "Repair fs" +_scratch_unmount 2>&1 | _filter_scratch +$XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ + | tee $tmp.logprint | grep -q "" +if [ $? -ne 0 ]; then + echo "Dirty log, zeroing..." >> $seqres.full + _scratch_xfs_repair -L >> $seqres.full 2>&1 +else + _scratch_xfs_repair >> $seqres.full 2>&1 +fi +_scratch_xfs_repair >> $seqres.full 2>&1 + +echo "Try to create more files (again)" +_scratch_mount +$XFS_IO_PROG -f -R -c "pwrite -S 0x68 0 9999" $SCRATCH_MNT/f4 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/887.out b/tests/xfs/887.out new file mode 100644 index 0000000..30cf032 --- /dev/null +++ b/tests/xfs/887.out @@ -0,0 +1,7 @@ +QA output created by 887 +Format and mount +Create some files +Corrupt fs +Try to create more files +Repair fs +Try to create more files (again) diff --git a/tests/xfs/888 b/tests/xfs/888 new file mode 100755 index 0000000..dcc9fd8 --- /dev/null +++ b/tests/xfs/888 @@ -0,0 +1,81 @@ +#! /bin/bash +# FS QA Test No. 888 +# +# Basic rmap manipulation tests for realtime files. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $metadump_file +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt +_require_xfs_io_command "falloc" +_require_xfs_io_command "fpunch" +_require_xfs_io_command "fzero" +_require_xfs_io_command "fcollapse" +_require_xfs_io_command "finsert" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount +blksz=65536 +blocks=16 +len=$((blocks * blksz)) + +echo "Create some files" +$XFS_IO_PROG -f -R -c "falloc 0 $len" -c "pwrite -S 0x68 -b 1048576 0 $len" $SCRATCH_MNT/f1 >> $seqres.full + +echo "Manipulate file" +$XFS_IO_PROG -c "fpunch $blksz $blksz" \ + -c "fzero $((3 * blksz)) $blksz" \ + -c "pwrite -S 0x69 $((5 * blksz)) $blksz" \ + -c "fpunch $((7 * blksz)) $blksz" \ + -c "fsync" \ + -c "pwrite -S 0x70 $((7 * blksz)) $blksz" \ + -c "fcollapse $((9 * blksz)) $blksz" \ + -c "finsert $((10 * blksz)) $blksz" $SCRATCH_MNT/f1 >> $seqres.full + +echo "Check file" +md5sum $SCRATCH_MNT/f1 | _filter_scratch +od -tx1 -Ad -c $SCRATCH_MNT/f1 >> $seqres.full + +# success, all done +status=0 +exit diff --git a/tests/xfs/888.out b/tests/xfs/888.out new file mode 100644 index 0000000..2587697 --- /dev/null +++ b/tests/xfs/888.out @@ -0,0 +1,6 @@ +QA output created by 888 +Format and mount +Create some files +Manipulate file +Check file +e45c5707fcf6817e914ffb6ce37a0ac7 SCRATCH_MNT/f1 diff --git a/tests/xfs/group b/tests/xfs/group index 72580e9..1b0e22a 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -313,3 +313,14 @@ 875 auto quick clone fsr quota 876 auto quick rmap clone 877 auto quick rmap clone +878 auto quick rmap +879 auto quick rmap +880 auto quick rmap +881 auto quick rmap +882 fuzzers rmap +883 auto quick rmap +884 auto quick rmap +885 auto quick rmap +886 auto quick rmap +887 auto quick rmap +888 auto quick rmap From darrick.wong@oracle.com Thu Aug 25 18:29:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=LOTS_OF_MONEY, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 874DC7CE8 for ; Thu, 25 Aug 2016 18:29:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E3EC5AC001 for ; Thu, 25 Aug 2016 16:29:32 -0700 (PDT) X-ASG-Debug-ID: 1472167768-0bf57c55b41c7570001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id DCeU46HQmcAOpofW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:29:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNTQPq007509 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:27 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNTQIf028240 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:26 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNTQHV025224; Thu, 25 Aug 2016 23:29:26 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:29:25 -0700 Subject: [PATCH 10/13] xfs: test getfsmap ioctl From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/13] xfs: test getfsmap ioctl To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:29:24 -0700 Message-ID: <147216776414.32641.43424679167210633.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167769 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 25251 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add some simple tests for the new getfsmap ioctl. Signed-off-by: Darrick J. Wong --- common/rc | 6 +++ tests/xfs/889 | 82 ++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/889.out | 13 +++++++ tests/xfs/890 | 84 +++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/890.out | 6 +++ tests/xfs/891 | 65 ++++++++++++++++++++++++++++++++++++ tests/xfs/891.out | 3 ++ tests/xfs/892 | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/892.out | 7 ++++ tests/xfs/893 | 68 ++++++++++++++++++++++++++++++++++++++ tests/xfs/893.out | 4 ++ tests/xfs/894 | 85 +++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/894.out | 6 +++ tests/xfs/895 | 68 ++++++++++++++++++++++++++++++++++++++ tests/xfs/895.out | 4 ++ tests/xfs/group | 7 ++++ 16 files changed, 603 insertions(+) create mode 100755 tests/xfs/889 create mode 100644 tests/xfs/889.out create mode 100755 tests/xfs/890 create mode 100644 tests/xfs/890.out create mode 100755 tests/xfs/891 create mode 100644 tests/xfs/891.out create mode 100755 tests/xfs/892 create mode 100644 tests/xfs/892.out create mode 100755 tests/xfs/893 create mode 100644 tests/xfs/893.out create mode 100755 tests/xfs/894 create mode 100644 tests/xfs/894.out create mode 100755 tests/xfs/895 create mode 100644 tests/xfs/895.out diff --git a/common/rc b/common/rc index 3b706dd..40e9858 100644 --- a/common/rc +++ b/common/rc @@ -2039,6 +2039,12 @@ _require_xfs_io_command() echo $testio | egrep -q "invalid option|Is a directory" && \ _notrun "xfs_io $command support is missing" ;; + "fsmap" ) + testio=`$XFS_IO_PROG -T -F -c "fsmap" \ + $TEST_DIR 2>&1` + echo $testio | egrep -q "Inappropriate ioctl" && \ + _notrun "xfs_io $command support is missing" + ;; *) testio=`$XFS_IO_PROG -c "$command help" 2>&1` esac diff --git a/tests/xfs/889 b/tests/xfs/889 new file mode 100755 index 0000000..49f3a7b --- /dev/null +++ b/tests/xfs/889 @@ -0,0 +1,82 @@ +#! /bin/bash +# FS QA Test No. 889 +# +# Check that getfsmap reports the AG metadata we're expecting. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/testout +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_xfs_scratch_rmapbt +_require_xfs_io_command "fsmap" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +agcount=$(xfs_info $SCRATCH_MNT | grep agcount= | sed -e 's/^.*agcount=\([0-9]*\),.*$/\1/g') + +echo "Get fsmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT > $TEST_DIR/fsmap +cat $TEST_DIR/fsmap >> $seqres.full + +echo "Check AG header" | tee -a $seqres.full +grep 'static fs metadata[[:space:]]*[0-9]*[[:space:]]*(0\.\.' $TEST_DIR/fsmap | tee -a $seqres.full > $TEST_DIR/testout +_within_tolerance "AG header count" $(wc -l < $TEST_DIR/testout) $agcount 0 -v + +echo "Check freesp/rmap btrees" | tee -a $seqres.full +grep 'per-AG metadata[[:space:]]*[0-9]*[[:space:]]*([0-9]*\.\.' $TEST_DIR/fsmap | tee -a $seqres.full > $TEST_DIR/testout +_within_tolerance "freesp extent count" $(wc -l < $TEST_DIR/testout) $((agcount * 3)) 0 999999 -v + +echo "Check inode btrees" | tee -a $seqres.full +grep 'inode btree[[:space:]]*[0-9]*[[:space:]]*([0-9]*\.\.' $TEST_DIR/fsmap | tee -a $seqres.full > $TEST_DIR/testout +_within_tolerance "inode btree extent count" $(wc -l < $TEST_DIR/testout) $agcount 0 -v + +echo "Check inodes" | tee -a $seqres.full +grep 'inodes[[:space:]]*[0-9]*[[:space:]]*([0-9]*\.\.' $TEST_DIR/fsmap | tee -a $seqres.full > $TEST_DIR/testout +_within_tolerance "inode extent count" $(wc -l < $TEST_DIR/testout) 1 0 999999 -v + +echo "Check journal" | tee -a $seqres.full +grep 'journalling log' $TEST_DIR/fsmap | tee -a $seqres.full > $TEST_DIR/testout +_within_tolerance "journal extent count" $(wc -l < $TEST_DIR/testout) 1 0 -v + +# success, all done +status=0 +exit diff --git a/tests/xfs/889.out b/tests/xfs/889.out new file mode 100644 index 0000000..3d2dc3e --- /dev/null +++ b/tests/xfs/889.out @@ -0,0 +1,13 @@ +QA output created by 889 +Format and mount +Get fsmap +Check AG header +AG header count is in range +Check freesp/rmap btrees +freesp extent count is in range +Check inode btrees +inode btree extent count is in range +Check inodes +inode extent count is in range +Check journal +journal extent count is in range diff --git a/tests/xfs/890 b/tests/xfs/890 new file mode 100755 index 0000000..e4f83a5 --- /dev/null +++ b/tests/xfs/890 @@ -0,0 +1,84 @@ +#! /bin/bash +# FS QA Test No. 890 +# +# Check that getfsmap agrees with getbmap. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/bmap +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_xfs_scratch_rmapbt +_require_xfs_io_command "fsmap" +_require_test_program "punch-alternating" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +_pwrite_byte 0x80 0 737373 $SCRATCH_MNT/urk >> $seqres.full +sync +./src/punch-alternating $SCRATCH_MNT/urk >> $seqres.full +ino=$(stat -c '%i' $SCRATCH_MNT/urk) + +echo "Get fsmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT >> $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT | tr '[]()' ' ' > $TEST_DIR/fsmap + +echo "Get bmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'bmap -v' $SCRATCH_MNT/urk >> $seqres.full +$XFS_IO_PROG -c 'bmap -v' $SCRATCH_MNT/urk | grep '^[[:space:]]*[0-9]*:' | grep -v 'hole' | tr '[]()' ' ' > $TEST_DIR/bmap + +echo "Check bmap and fsmap" | tee -a $seqres.full +cat $TEST_DIR/bmap | while read ext offrange colon blockrange ag agrange total crap; do + qstr="^[[:space:]]*[0-9]*:[[:space:]]*[0-9]*:[0-9]*[[:space:]]*${blockrange} :[[:space:]]*${ino}[[:space:]]*${offrange}[[:space:]]*${ag}[[:space:]]*${agrange}[[:space:]]*${total}$" + echo "${qstr}" >> $seqres.full + grep "${qstr}" $TEST_DIR/fsmap >> $seqres.full + found=$(grep -c "${qstr}" $TEST_DIR/fsmap) + test $found -eq 1 || echo "Unexpected output for offset ${offrange}." +done + +echo "Check device field of FS metadata and regular file" +data_dev=$(grep 'static fs metadata' $TEST_DIR/fsmap | head -n 1 | awk '{print $2}') +rt_dev=$(grep "${ino}[[:space:]]*[0-9]*\.\.[0-9]*" $TEST_DIR/fsmap | head -n 1 | awk '{print $2}') +test "${data_dev}" = "${rt_dev}" || echo "data ${data_dev} realtime ${rt_dev}?" + +# success, all done +status=0 +exit diff --git a/tests/xfs/890.out b/tests/xfs/890.out new file mode 100644 index 0000000..962050a --- /dev/null +++ b/tests/xfs/890.out @@ -0,0 +1,6 @@ +QA output created by 890 +Format and mount +Get fsmap +Get bmap +Check bmap and fsmap +Check device field of FS metadata and regular file diff --git a/tests/xfs/891 b/tests/xfs/891 new file mode 100755 index 0000000..c2abaaf --- /dev/null +++ b/tests/xfs/891 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. 891 +# +# Populate filesystem, check that fsmap -n10000 matches fsmap -n1. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/a $TEST_DIR/b +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/populate + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch +_require_xfs_io_command "fsmap" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_populate >> $seqres.full + +echo "Compare fsmap" | tee -a $seqres.full +_scratch_mount +$XFS_IO_PROG -c 'fsmap -v -n 65536' $SCRATCH_MNT | grep -v 'EXT:' > $TEST_DIR/a +$XFS_IO_PROG -c 'fsmap -v -n 1' $SCRATCH_MNT | grep -v 'EXT:' > $TEST_DIR/b +cat $TEST_DIR/a $TEST_DIR/b >> $seqres.full + +diff -uw $TEST_DIR/a $TEST_DIR/b + +# success, all done +status=0 +exit diff --git a/tests/xfs/891.out b/tests/xfs/891.out new file mode 100644 index 0000000..c0d8d42 --- /dev/null +++ b/tests/xfs/891.out @@ -0,0 +1,3 @@ +QA output created by 891 +Format and mount +Compare fsmap diff --git a/tests/xfs/892 b/tests/xfs/892 new file mode 100755 index 0000000..9241474 --- /dev/null +++ b/tests/xfs/892 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. 892 +# +# Check that getfsmap agrees with getbmap for reflinked files. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/bmap +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_xfs_scratch_rmapbt +_require_xfs_io_command "fsmap" +_require_test_program "punch-alternating" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +_pwrite_byte 0x80 0 737373 $SCRATCH_MNT/f1 >> $seqres.full +sync +./src/punch-alternating $SCRATCH_MNT/f1 >> $seqres.full +_cp_reflink $SCRATCH_MNT/f1 $SCRATCH_MNT/f2 +ino=$(stat -c '%i' $SCRATCH_MNT/f1) + +echo "Get fsmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT >> $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT | tr '[]()' ' ' > $TEST_DIR/fsmap + +echo "Get f1 bmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'bmap -v' $SCRATCH_MNT/f1 >> $seqres.full +$XFS_IO_PROG -c 'bmap -v' $SCRATCH_MNT/f1 | grep '^[[:space:]]*[0-9]*:' | grep -v 'hole' | tr '[]()' ' ' > $TEST_DIR/bmap + +echo "Check f1 bmap and fsmap" | tee -a $seqres.full +cat $TEST_DIR/bmap | while read ext offrange colon blockrange ag agrange total crap; do + qstr="^[[:space:]]*[0-9]*:[[:space:]]*[0-9]*:[0-9]*[[:space:]]*${blockrange} :[[:space:]]*${ino}[[:space:]]*${offrange}[[:space:]]*${ag}[[:space:]]*${agrange}[[:space:]]*${total} 1000000$" + echo "${qstr}" >> $seqres.full + grep "${qstr}" $TEST_DIR/fsmap >> $seqres.full + found=$(grep -c "${qstr}" $TEST_DIR/fsmap) + test $found -eq 1 || echo "Unexpected output for offset ${offrange}." +done + +echo "Get f2 bmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'bmap -v' $SCRATCH_MNT/f2 >> $seqres.full +$XFS_IO_PROG -c 'bmap -v' $SCRATCH_MNT/f2 | grep '^[[:space:]]*[0-9]*:' | grep -v 'hole' | tr '[]()' ' ' > $TEST_DIR/bmap + +echo "Check f2 bmap and fsmap" | tee -a $seqres.full +cat $TEST_DIR/bmap | while read ext offrange colon blockrange ag agrange total crap; do + qstr="^[[:space:]]*[0-9]*:[[:space:]]*[0-9]*:[0-9]*[[:space:]]*${blockrange} :[[:space:]]*${ino}[[:space:]]*${offrange}[[:space:]]*${ag}[[:space:]]*${agrange}[[:space:]]*${total} 1000000$" + echo "${qstr}" >> $seqres.full + grep "${qstr}" $TEST_DIR/fsmap >> $seqres.full + found=$(grep -c "${qstr}" $TEST_DIR/fsmap) + test $found -eq 1 || echo "Unexpected output for offset ${offrange}." +done + +# success, all done +status=0 +exit diff --git a/tests/xfs/892.out b/tests/xfs/892.out new file mode 100644 index 0000000..edcffb3 --- /dev/null +++ b/tests/xfs/892.out @@ -0,0 +1,7 @@ +QA output created by 892 +Format and mount +Get fsmap +Get f1 bmap +Check f1 bmap and fsmap +Get f2 bmap +Check f2 bmap and fsmap diff --git a/tests/xfs/893 b/tests/xfs/893 new file mode 100755 index 0000000..d0bcf2e --- /dev/null +++ b/tests/xfs/893 @@ -0,0 +1,68 @@ +#! /bin/bash +# FS QA Test No. 893 +# +# Check that getfsmap reports external log devices +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/testout +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch +_require_xfs_io_command "fsmap" +if [ "$USE_EXTERNAL" != "yes" ] || [ -z "$SCRATCH_LOGDEV" ]; then + _notrun "Need external log device" +fi + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Get fsmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT >> $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT | tr '[]()' ' ' > $TEST_DIR/fsmap + +echo "Check device field of FS metadata and journalling log" +data_dev=$(grep 'static fs metadata' $TEST_DIR/fsmap | head -n 1 | awk '{print $2}') +journal_dev=$(grep 'journalling log' $TEST_DIR/fsmap | head -n 1 | awk '{print $2}') +test "${data_dev}" != "${journal_dev}" || echo "data ${data_dev} journal ${journal_dev}?" + +# success, all done +status=0 +exit diff --git a/tests/xfs/893.out b/tests/xfs/893.out new file mode 100644 index 0000000..2f1ccae --- /dev/null +++ b/tests/xfs/893.out @@ -0,0 +1,4 @@ +QA output created by 893 +Format and mount +Get fsmap +Check device field of FS metadata and journalling log diff --git a/tests/xfs/894 b/tests/xfs/894 new file mode 100755 index 0000000..f5bb5f5 --- /dev/null +++ b/tests/xfs/894 @@ -0,0 +1,85 @@ +#! /bin/bash +# FS QA Test No. 894 +# +# Check that getfsmap agrees with getbmap when realtime files are present. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/bmap +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_realtime +_require_xfs_scratch_rmapbt +_require_xfs_io_command "fsmap" +_require_test_program "punch-alternating" + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +$XFS_IO_PROG -f -R -c 'pwrite -S 0x80 0 737373' $SCRATCH_MNT/urk >> $seqres.full +sync +./src/punch-alternating $SCRATCH_MNT/urk >> $seqres.full +ino=$(stat -c '%i' $SCRATCH_MNT/urk) + +echo "Get fsmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT >> $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT | tr '[]()' ' ' > $TEST_DIR/fsmap + +echo "Get bmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'bmap -v' $SCRATCH_MNT/urk >> $seqres.full +$XFS_IO_PROG -c 'bmap -v' $SCRATCH_MNT/urk | grep '^[[:space:]]*[0-9]*:' | grep -v 'hole' | tr '[]()' ' ' > $TEST_DIR/bmap + +echo "Check bmap and fsmap" | tee -a $seqres.full +cat $TEST_DIR/bmap | while read ext offrange colon blockrange ag agrange total crap; do + qstr="^[[:space:]]*[0-9]*:[[:space:]]*[0-9]*:[0-9]*[[:space:]]*${blockrange} :[[:space:]]*${ino}[[:space:]]*${offrange}[[:space:]]*${ag}[[:space:]]*${agrange}[[:space:]]*${total}$" + echo "${qstr}" >> $seqres.full + grep "${qstr}" $TEST_DIR/fsmap >> $seqres.full + found=$(grep -c "${qstr}" $TEST_DIR/fsmap) + test $found -eq 1 || echo "Unexpected output for offset ${offrange}." +done + +echo "Check device field of FS metadata and realtime file" +data_dev=$(grep 'static fs metadata' $TEST_DIR/fsmap | head -n 1 | awk '{print $2}') +rt_dev=$(grep "${ino}[[:space:]]*[0-9]*\.\.[0-9]*" $TEST_DIR/fsmap | head -n 1 | awk '{print $2}') +test "${data_dev}" != "${rt_dev}" || echo "data ${data_dev} realtime ${rt_dev}?" + +# success, all done +status=0 +exit diff --git a/tests/xfs/894.out b/tests/xfs/894.out new file mode 100644 index 0000000..a1eb886 --- /dev/null +++ b/tests/xfs/894.out @@ -0,0 +1,6 @@ +QA output created by 894 +Format and mount +Get fsmap +Get bmap +Check bmap and fsmap +Check device field of FS metadata and realtime file diff --git a/tests/xfs/895 b/tests/xfs/895 new file mode 100755 index 0000000..7dc9cf4 --- /dev/null +++ b/tests/xfs/895 @@ -0,0 +1,68 @@ +#! /bin/bash +# FS QA Test No. 895 +# +# Check that getfsmap reports internal log devices +# +#----------------------------------------------------------------------- +# Copyright (c) 2016, Oracle and/or its affiliates. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename "$0"` +seqres="$RESULT_DIR/$seq" +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -rf "$tmp".* $TEST_DIR/fsmap $TEST_DIR/testout +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_xfs_scratch_rmapbt +_require_xfs_io_command "fsmap" +if [ "$USE_EXTERNAL" = "yes" ] && [ -n "$SCRATCH_LOGDEV" ]; then + _notrun "Cannot have external log device" +fi + +rm -f "$seqres.full" + +echo "Format and mount" +_scratch_mkfs > "$seqres.full" 2>&1 +_scratch_mount + +echo "Get fsmap" | tee -a $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT >> $seqres.full +$XFS_IO_PROG -c 'fsmap -v' $SCRATCH_MNT | tr '[]()' ' ' > $TEST_DIR/fsmap + +echo "Check device field of FS metadata and journalling log" +data_dev=$(grep 'static fs metadata' $TEST_DIR/fsmap | head -n 1 | awk '{print $2}') +journal_dev=$(grep 'journalling log' $TEST_DIR/fsmap | head -n 1 | awk '{print $2}') +test "${data_dev}" = "${journal_dev}" || echo "data ${data_dev} journal ${journal_dev}?" + +# success, all done +status=0 +exit diff --git a/tests/xfs/895.out b/tests/xfs/895.out new file mode 100644 index 0000000..007eeba --- /dev/null +++ b/tests/xfs/895.out @@ -0,0 +1,4 @@ +QA output created by 895 +Format and mount +Get fsmap +Check device field of FS metadata and journalling log diff --git a/tests/xfs/group b/tests/xfs/group index 1b0e22a..6d349dc 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -324,3 +324,10 @@ 886 auto quick rmap 887 auto quick rmap 888 auto quick rmap +889 auto quick rmap fsmap +890 auto quick rmap fsmap +891 auto rmap fsmap +892 auto quick rmap fsmap +893 auto quick rmap fsmap +894 auto quick rmap fsmap +895 auto quick rmap fsmap From darrick.wong@oracle.com Thu Aug 25 18:29:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C1A37CD8 for ; Thu, 25 Aug 2016 18:29:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3051304039 for ; Thu, 25 Aug 2016 16:29:36 -0700 (PDT) X-ASG-Debug-ID: 1472167775-0bf57b53122090a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id b7U1SCq08HgF2LT4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:29:35 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNTXKu007586 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:29:34 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNTXtU006228 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:33 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNTWSd027357; Thu, 25 Aug 2016 23:29:32 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:29:32 -0700 Subject: [PATCH 11/13] xfs: test getbmapx shared extent reporting From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/13] xfs: test getbmapx shared extent reporting To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:29:30 -0700 Message-ID: <147216777074.32641.10368196568223720351.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167775 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3982 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Test that getbmapx returns exact shared extents. Signed-off-by: Darrick J. Wong --- tests/xfs/896 | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/896.out | 17 ++++++++++ tests/xfs/group | 1 + 3 files changed, 111 insertions(+) create mode 100755 tests/xfs/896 create mode 100644 tests/xfs/896.out diff --git a/tests/xfs/896 b/tests/xfs/896 new file mode 100755 index 0000000..a0281bd --- /dev/null +++ b/tests/xfs/896 @@ -0,0 +1,93 @@ +#! /bin/bash +# FS QA Test No. 896 +# +# Check that GETBMAPX accurately report shared extents. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 7 15 + +_cleanup() +{ + cd / + rm -rf $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/reflink + +# real QA test starts here +_supported_os Linux +_supported_fs xfs +_require_scratch_reflink +_require_xfs_io_command "bmap" + +echo "Format and mount" +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount >> $seqres.full 2>&1 + +testdir=$SCRATCH_MNT/test-$seq +mkdir $testdir + +blocks=5 +blksz=65536 +sz=$((blocks * blksz)) + +echo "Create the original files" +$XFS_IO_PROG -f -c "falloc 0 $sz" $testdir/file1 >> $seqres.full +_pwrite_byte 0x61 0 $sz $testdir/file1 >> $seqres.full +_scratch_cycle_mount + +bmap() { + $XFS_IO_PROG -c 'bmap -v' $1 | grep '^[[:space:]]*[0-9]*:' +} + +echo "file1 extents and holes" +bmap $testdir/file1 | grep -v -c hole +bmap $testdir/file1 | grep -c hole + +_reflink_range $testdir/file1 $blksz $testdir/file2 $((blksz * 3)) $blksz >> $seqres.full +_reflink_range $testdir/file1 $((blksz * 3)) $testdir/file2 $blksz $blksz >> $seqres.full +_scratch_cycle_mount + +echo "Compare files" +md5sum $testdir/file1 | _filter_scratch +md5sum $testdir/file2 | _filter_scratch + +echo "file1 extents and holes" +bmap $testdir/file1 | grep -v -c hole +bmap $testdir/file1 | grep -c hole +echo "file2 extents and holes" +bmap $testdir/file2 | grep -v -c hole +bmap $testdir/file2 | grep -c hole +echo "file1 shared extents" +bmap $testdir/file1 | grep -c '1.....$' + +# success, all done +status=0 +exit diff --git a/tests/xfs/896.out b/tests/xfs/896.out new file mode 100644 index 0000000..63b3a11 --- /dev/null +++ b/tests/xfs/896.out @@ -0,0 +1,17 @@ +QA output created by 896 +Format and mount +Create the original files +file1 extents and holes +1 +0 +Compare files +17af09af790a9b4c79cddf72f6b642cb SCRATCH_MNT/test-896/file1 +79418df9c55ab7f58781cb7b9e7d5d91 SCRATCH_MNT/test-896/file2 +file1 extents and holes +5 +0 +file2 extents and holes +2 +2 +file1 shared extents +2 diff --git a/tests/xfs/group b/tests/xfs/group index 6d349dc..5ff35cb 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -331,3 +331,4 @@ 893 auto quick rmap fsmap 894 auto quick rmap fsmap 895 auto quick rmap fsmap +896 auto quick clone From darrick.wong@oracle.com Thu Aug 25 18:29:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C81037CD8 for ; Thu, 25 Aug 2016 18:29:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 976A58F8035 for ; Thu, 25 Aug 2016 16:29:46 -0700 (PDT) X-ASG-Debug-ID: 1472167784-0bf57b53132090c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id LoS2OwqrchbfTQ2g (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:29:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNTh3i014960 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:29:43 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNTh57006573 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:29:43 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNTc14012254; Thu, 25 Aug 2016 23:29:41 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:29:38 -0700 Subject: [PATCH 12/13] xfs/122: track xfs_scrub_metadata From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 12/13] xfs/122: track xfs_scrub_metadata To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:29:37 -0700 Message-ID: <147216777706.32641.3994494186495545598.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167784 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 625 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make sure the metadata scrub ioctl structure doesn't change size. Signed-off-by: Darrick J. Wong --- tests/xfs/122.out | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/xfs/122.out b/tests/xfs/122.out index bbffd0f..cd909e6 100644 --- a/tests/xfs/122.out +++ b/tests/xfs/122.out @@ -94,6 +94,7 @@ sizeof(struct xfs_rtrmap_rec) = 32 sizeof(struct xfs_rtrmap_root) = 4 sizeof(struct xfs_rud_log_format) = 16 sizeof(struct xfs_rui_log_format) = 48 +sizeof(struct xfs_scrub_metadata) = 64 sizeof(xfs_agf_t) = 224 sizeof(xfs_agfl_t) = 36 sizeof(xfs_agi_t) = 336 From darrick.wong@oracle.com Thu Aug 25 18:29:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8A62C7CF5 for ; Thu, 25 Aug 2016 18:29:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0B009AC002 for ; Thu, 25 Aug 2016 16:29:47 -0700 (PDT) X-ASG-Debug-ID: 1472167786-0bf8155c741e6010001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id JMHPBd935JaEAM0p (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:29:46 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNTjQt007703 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:29:45 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNTjpD020457 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:29:45 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNTjlG025340; Thu, 25 Aug 2016 23:29:45 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:29:44 -0700 Subject: [PATCH 13/13] xfs/122: check the ag reservation counter ioctl From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 13/13] xfs/122: check the ag reservation counter ioctl To: david@fromorbit.com, eguan@redhat.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, fstests@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:29:43 -0700 Message-ID: <147216778333.32641.6694229942234239492.stgit@birch.djwong.org> In-Reply-To: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> References: <147216769914.32641.55434969009554013.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167786 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 596 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- tests/xfs/122.out | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/xfs/122.out b/tests/xfs/122.out index cd909e6..ae84283 100644 --- a/tests/xfs/122.out +++ b/tests/xfs/122.out @@ -81,6 +81,7 @@ sizeof(struct xfs_dsymlink_hdr) = 56 sizeof(struct xfs_extent_data) = 24 sizeof(struct xfs_extent_data_info) = 32 sizeof(struct xfs_fs_eofblocks) = 128 +sizeof(struct xfs_fsop_ag_resblks) = 32 sizeof(struct xfs_icreate_log) = 28 sizeof(struct xfs_log_dinode) = 176 sizeof(struct xfs_map_extent) = 32 From darrick.wong@oracle.com Thu Aug 25 18:30:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A6EF47CB4 for ; Thu, 25 Aug 2016 18:30:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6FDA98F8033 for ; Thu, 25 Aug 2016 16:30:47 -0700 (PDT) X-ASG-Debug-ID: 1472167845-0bf57c55b31c75d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ZRbN5vLRAzcBVe9n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:30:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNUi6r008751 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:30:44 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNUh6E031534 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:30:43 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNUhTW025881; Thu, 25 Aug 2016 23:30:43 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:30:43 -0700 Subject: [PATCH v8 0/6] vfs: help support reflink for XFS From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 0/6] vfs: help support reflink for XFS To: david@fromorbit.com, viro@ZenIV.linux.org.uk, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:30:40 -0700 Message-ID: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167845 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1836 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. The patches in this series implement generic changes that will be necessary for XFS' implementation of reflink and dedupe. There are some small fixes for the new VFS hoists of the dedupe ioctl, as well as a patch adding the reflink and CoW extent size hints to the file attr ioctl that ext4 and XFS now share. The second half of the series are amendments to the iomap infrastructure that Christoph Hellwig refactored in 4.8. These changes make it easier to implement CoW and to pass along various flags through struct iomap. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:30:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3C8D87CA7 for ; Thu, 25 Aug 2016 18:30:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 015D1304039 for ; Thu, 25 Aug 2016 16:30:56 -0700 (PDT) X-ASG-Debug-ID: 1472167854-0bf57b5313209120001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id qZASXcPrNwjrXxvH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:30:54 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNUqYi008794 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:30:52 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNUpvM009534 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:30:51 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNUnE6012790; Thu, 25 Aug 2016 23:30:51 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:30:49 -0700 Subject: [PATCH 1/6] vfs: fix return type of ioctl_file_dedupe_range From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/6] vfs: fix return type of ioctl_file_dedupe_range To: david@fromorbit.com, viro@ZenIV.linux.org.uk, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:30:47 -0700 Message-ID: <147216784790.525.14015293677474442757.stgit@birch.djwong.org> In-Reply-To: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> References: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167854 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 729 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines All the VFS functions in the dedupe ioctl path return int status, so the ioctl handler ought to as well. Found by Coverity, CID 1350952. Signed-off-by: Darrick J. Wong --- fs/ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/ioctl.c b/fs/ioctl.c index 0f56deb..26aba09 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -568,7 +568,7 @@ static int ioctl_fsthaw(struct file *filp) return thaw_super(sb); } -static long ioctl_file_dedupe_range(struct file *file, void __user *arg) +static int ioctl_file_dedupe_range(struct file *file, void __user *arg) { struct file_dedupe_range __user *argp = arg; struct file_dedupe_range *same = NULL; From darrick.wong@oracle.com Thu Aug 25 18:31:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B567D7CD7 for ; Thu, 25 Aug 2016 18:31:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6205A304039 for ; Thu, 25 Aug 2016 16:31:02 -0700 (PDT) X-ASG-Debug-ID: 1472167860-0bf81509b01de1c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id KeEDscmfOJI6Eg3F (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:31:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNUwtx016021 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:30:58 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNUvXp025718 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:30:58 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNUuaa014905; Thu, 25 Aug 2016 23:30:56 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:30:55 -0700 Subject: [PATCH 2/6] vfs: cap dedupe request structure size at PAGE_SIZE From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/6] vfs: cap dedupe request structure size at PAGE_SIZE To: david@fromorbit.com, viro@ZenIV.linux.org.uk, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, "Kirill A. Shutemov" , linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:30:54 -0700 Message-ID: <147216785429.525.1965983896010934181.stgit@birch.djwong.org> In-Reply-To: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> References: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167860 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1181 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Kirill A. Shutemov reports that the kernel doesn't try to cap dest_count in any way, and uses the number to allocate kernel memory. This causes high order allocation warnings in the kernel log if someone passes in a big enough value. We should clamp the allocation at PAGE_SIZE to avoid stressing the VM. The two existing users of the dedupe ioctl never send more than 120 requests, so we can safely clamp dest_range at PAGE_SIZE, because with 4k pages we can handle up to 127 dedupe candidates. Given the max extent length of 16MB, we can end up doing 2GB of IO which is plenty. Reported-by: "Kirill A. Shutemov" Signed-off-by: Darrick J. Wong --- fs/ioctl.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/ioctl.c b/fs/ioctl.c index 26aba09..c415668 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -582,6 +582,10 @@ static int ioctl_file_dedupe_range(struct file *file, void __user *arg) } size = offsetof(struct file_dedupe_range __user, info[count]); + if (size > PAGE_SIZE) { + ret = -ENOMEM; + goto out; + } same = memdup_user(argp, size); if (IS_ERR(same)) { From darrick.wong@oracle.com Thu Aug 25 18:31:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 477FD7CA7 for ; Thu, 25 Aug 2016 18:31:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 112EA304043 for ; Thu, 25 Aug 2016 16:31:08 -0700 (PDT) X-ASG-Debug-ID: 1472167865-0bf57c55b31c75f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id B0iZwDVEcZG6uaIE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:31:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNV3cx016270 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:31:04 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNV3d4007632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:31:03 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNV2xT027984; Thu, 25 Aug 2016 23:31:02 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:31:02 -0700 Subject: [PATCH 3/6] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/6] vfs: support FS_XFLAG_REFLINK and FS_XFLAG_COWEXTSIZE To: david@fromorbit.com, viro@ZenIV.linux.org.uk, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:31:00 -0700 Message-ID: <147216786073.525.16014208838990530622.stgit@birch.djwong.org> In-Reply-To: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> References: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167865 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1331 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Introduce XFLAGs for the new XFS reflink inode flag and the CoW extent size hint, and actually plumb the CoW extent size hint into the fsxattr structure. Signed-off-by: Darrick J. Wong --- include/uapi/linux/fs.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 3b00f7c..fb371a5 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -157,7 +157,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* CoW extsize field value (get/set)*/ + unsigned char fsx_pad[8]; }; /* @@ -178,6 +179,8 @@ struct fsxattr { #define FS_XFLAG_NODEFRAG 0x00002000 /* do not defragment */ #define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */ #define FS_XFLAG_DAX 0x00008000 /* use DAX for IO */ +#define FS_XFLAG_REFLINK 0x00010000 /* file is reflinked */ +#define FS_XFLAG_COWEXTSIZE 0x00020000 /* CoW extent size allocator hint */ #define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */ /* the read-only stuff doesn't really belong here, but any other place is From darrick.wong@oracle.com Thu Aug 25 18:31:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 70DCD7CA7 for ; Thu, 25 Aug 2016 18:31:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1ED1F304043 for ; Thu, 25 Aug 2016 16:31:15 -0700 (PDT) X-ASG-Debug-ID: 1472167871-0bf8155c751e6280001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id x2H7BFHNBfMFTDtT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:31:12 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNV95a009137 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:31:10 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNV9jJ010224 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:31:09 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNV9P4012865; Thu, 25 Aug 2016 23:31:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:31:08 -0700 Subject: [PATCH 4/6] fs: add iomap_file_dirty From: Christoph Hellwig X-ASG-Orig-Subj: [PATCH 4/6] fs: add iomap_file_dirty To: david@fromorbit.com, viro@ZenIV.linux.org.uk, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:31:07 -0700 Message-ID: <147216786712.525.5901639662288553230.stgit@birch.djwong.org> In-Reply-To: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> References: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167872 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3382 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Originally-from: Christoph Hellwig This function uses the iomap infrastructure to re-write all pages in a given range. This is useful for doing a copy-up of COW ranges, and might be useful for scrubbing in the future. XXX: might want a bigger name, and possible a better implementation that doesn't require two lookups in the radix tree. Signed-off-by: Christoph Hellwig --- fs/iomap.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/iomap.h | 2 + 2 files changed, 84 insertions(+) diff --git a/fs/iomap.c b/fs/iomap.c index 0342254..7b295d5 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -252,6 +252,88 @@ iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *iter, } EXPORT_SYMBOL_GPL(iomap_file_buffered_write); +static struct page * +__iomap_read_page(struct inode *inode, loff_t offset) +{ + struct address_space *mapping = inode->i_mapping; + struct page *page; + + page = read_mapping_page(mapping, offset >> PAGE_SHIFT, NULL); + if (IS_ERR(page)) + return page; + if (!PageUptodate(page)) { + put_page(page); + return ERR_PTR(-EIO); + } + return page; +} + +static loff_t +iomap_dirty_actor(struct inode *inode, loff_t pos, loff_t length, void *data, + struct iomap *iomap) +{ + long status = 0; + ssize_t written = 0; + + do { + struct page *page, *rpage; + unsigned long offset; /* Offset into pagecache page */ + unsigned long bytes; /* Bytes to write to page */ + + offset = (pos & (PAGE_SIZE - 1)); + bytes = min_t(unsigned long, PAGE_SIZE - offset, length); + + rpage = __iomap_read_page(inode, pos); + if (IS_ERR(rpage)) + return PTR_ERR(rpage); + + status = iomap_write_begin(inode, pos, bytes, + AOP_FLAG_NOFS | AOP_FLAG_UNINTERRUPTIBLE, + &page, iomap); + put_page(rpage); + if (unlikely(status)) + return status; + + WARN_ON_ONCE(!PageUptodate(page)); + + status = iomap_write_end(inode, pos, bytes, bytes, page); + if (unlikely(status <= 0)) { + if (WARN_ON_ONCE(status == 0)) + return -EIO; + return status; + } + + cond_resched(); + + pos += status; + written += status; + length -= status; + + balance_dirty_pages_ratelimited(inode->i_mapping); + } while (length); + + return written; +} + +int +iomap_file_dirty(struct inode *inode, loff_t pos, loff_t len, + struct iomap_ops *ops) +{ + loff_t ret; + + while (len) { + ret = iomap_apply(inode, pos, len, IOMAP_WRITE, ops, NULL, + iomap_dirty_actor); + if (ret <= 0) + return ret; + pos += ret; + len -= ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(iomap_file_dirty); + static int iomap_zero(struct inode *inode, loff_t pos, unsigned offset, unsigned bytes, struct iomap *iomap) { diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 3267df4..b2e30e5 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -58,6 +58,8 @@ struct iomap_ops { ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from, struct iomap_ops *ops); +int iomap_file_dirty(struct inode *inode, loff_t pos, loff_t len, + struct iomap_ops *ops); int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero, struct iomap_ops *ops); int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, From darrick.wong@oracle.com Thu Aug 25 18:31:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0D9397D01 for ; Thu, 25 Aug 2016 18:31:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C669B8F8033 for ; Thu, 25 Aug 2016 16:31:25 -0700 (PDT) X-ASG-Debug-ID: 1472167883-0bf57b5311209140001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id dtNjsNlY7y0OIKS9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:31:23 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNVJMR016407 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:31:19 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNVItr026551 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:31:19 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNVFk6012890; Thu, 25 Aug 2016 23:31:18 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:31:15 -0700 Subject: [PATCH 5/6] iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 5/6] iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems To: david@fromorbit.com, viro@ZenIV.linux.org.uk, darrick.wong@oracle.com Cc: Andreas Gruenbacher , linux-api@vger.kernel.org, xfs@oss.sgi.com, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, Christoph Hellwig Date: Thu, 25 Aug 2016 16:31:13 -0700 Message-ID: <147216787356.525.16980820316846690768.stgit@birch.djwong.org> In-Reply-To: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> References: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167883 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2039 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines From: Christoph Hellwig Filesystems like XFS that use extents should not set the FIEMAP_EXTENT_MERGED flag in the fiemap extent structures. To allow for both behaviors for the upcoming gfs2 usage split the iomap type field into type and flags, and only set FIEMAP_EXTENT_MERGED if the IOMAP_F_MERGED flag is set. The flags field will also come in handy for future features such as shared extents on reflink-enabled file systems. Reported-by: Andreas Gruenbacher Signed-off-by: Christoph Hellwig --- fs/iomap.c | 5 ++++- include/linux/iomap.h | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/fs/iomap.c b/fs/iomap.c index 7b295d5..e9b3f99 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -510,9 +510,12 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi, break; } + if (iomap->flags & IOMAP_F_MERGED) + flags |= FIEMAP_EXTENT_MERGED; + return fiemap_fill_next_extent(fi, iomap->offset, iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, - iomap->length, flags | FIEMAP_EXTENT_MERGED); + iomap->length, flags); } diff --git a/include/linux/iomap.h b/include/linux/iomap.h index b2e30e5..3a56212 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -19,6 +19,11 @@ struct vm_fault; #define IOMAP_UNWRITTEN 0x04 /* blocks allocated @blkno in unwritten state */ /* + * Flags for iomap mappings: + */ +#define IOMAP_F_MERGED 0x01 /* contains multiple blocks/extents */ + +/* * Magic value for blkno: */ #define IOMAP_NULL_BLOCK -1LL /* blkno is not valid */ @@ -27,7 +32,8 @@ struct iomap { sector_t blkno; /* 1st sector of mapping, 512b units */ loff_t offset; /* file offset of mapping, bytes */ u64 length; /* length of mapping, bytes */ - int type; /* type of mapping */ + u16 type; /* type of mapping */ + u16 flags; /* flags for mapping */ struct block_device *bdev; /* block device for I/O */ }; From darrick.wong@oracle.com Thu Aug 25 18:31:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 91F1E7D01 for ; Thu, 25 Aug 2016 18:31:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 54D7B8F8035 for ; Thu, 25 Aug 2016 16:31:26 -0700 (PDT) X-ASG-Debug-ID: 1472167884-0bf8155c741e62e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id eWUvtnMoGmrmJGgE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:31:25 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNVNgE016428 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:31:23 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNVMV2000544 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:31:23 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNVLqu028200; Thu, 25 Aug 2016 23:31:22 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:31:21 -0700 Subject: [PATCH 6/6] iomap: add a flag to report shared extents From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 6/6] iomap: add a flag to report shared extents To: david@fromorbit.com, viro@ZenIV.linux.org.uk, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:31:20 -0700 Message-ID: <147216788009.525.789325200721590680.stgit@birch.djwong.org> In-Reply-To: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> References: <147216784041.525.7722906502172299465.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167884 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1016 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- fs/iomap.c | 2 ++ include/linux/iomap.h | 1 + 2 files changed, 3 insertions(+) diff --git a/fs/iomap.c b/fs/iomap.c index e9b3f99..ec411a6 100644 --- a/fs/iomap.c +++ b/fs/iomap.c @@ -512,6 +512,8 @@ static int iomap_to_fiemap(struct fiemap_extent_info *fi, if (iomap->flags & IOMAP_F_MERGED) flags |= FIEMAP_EXTENT_MERGED; + if (iomap->flags & IOMAP_F_SHARED) + flags |= FIEMAP_EXTENT_SHARED; return fiemap_fill_next_extent(fi, iomap->offset, iomap->blkno != IOMAP_NULL_BLOCK ? iomap->blkno << 9: 0, diff --git a/include/linux/iomap.h b/include/linux/iomap.h index 3a56212..c74226a 100644 --- a/include/linux/iomap.h +++ b/include/linux/iomap.h @@ -22,6 +22,7 @@ struct vm_fault; * Flags for iomap mappings: */ #define IOMAP_F_MERGED 0x01 /* contains multiple blocks/extents */ +#define IOMAP_F_SHARED 0x02 /* block shared with another file */ /* * Magic value for blkno: From darrick.wong@oracle.com Thu Aug 25 18:32:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2206F7CD2 for ; Thu, 25 Aug 2016 18:32:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7D88BAC002 for ; Thu, 25 Aug 2016 16:32:07 -0700 (PDT) X-ASG-Debug-ID: 1472167925-0bf57c55b41c7630001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Mt5E3ClaLQJl8qab (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:05 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNW4FS009918 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:32:04 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNW3aR028176 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:03 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNVwdQ013179; Thu, 25 Aug 2016 23:32:03 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:31:57 -0700 Subject: [PATCH v8 00/71] xfs: add reflink and dedupe support From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 00/71] xfs: add reflink and dedupe support To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:31:56 -0700 Message-ID: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167925 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3401 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. (NOTE: In the git trees, this series is preceded by the pending rmap fixes patches posted to linux-xfs a few days ago.) The reflink implementation features a simple per-AG b+tree containing tuples of (physical block, blockcount, refcount) with the key being the physical block. Copy on Write (CoW) is implemented by creating a separate CoW extent mapping fork and using the existing delayed allocation mechanism to try to allocate as large of a replacement extent as possible before committing the new data to media. A CoW extent size hint allows administrators to influence the size of the replacement extents, and certain writes can be "promoted" to CoW when it would be advantageous to reduce fragmentation. The userspace interface to reflink and dedupe are the VFS FICLONE, FICLONERANGE, and FIDEDUPERANGE ioctls, which were previously private to btrfs. At the beginning of the patchset is the establishment of a per-AG block reservation mechanism. This "hides" some blocks from the regular block allocator so that the refcountbt and rmapbt can expand without hitting ENOSPC. The block reservation mechanism built into transactions isn't sufficient for this purpose because it only reserves blocks at a broad filesystem level, whereas per-AG btree expansion requires specific per-AG reservations. Next comes the reference count B+tree, which tracks the reference counts of shared extents (refcount > 1) and extents being used to stage a copy-on-write operation (refcount == 1). We define new log redo item pairs both for refcount updates and for inode fork updates; these plug into the deferred ops framework created for the reverse mapping patches. After that comes the reflink code, which handles the actual copy-on-write behavior that is required for block sharing; and connections to the VFS file ops for reflink, dedupe, and copy_file_range. At the very end of the patchset is a reimplementation of the swap extents code that uses reverse mapping and block mapping deferred ops to implement xfs_swap_extent for filesystems with reverse-mapping. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:32:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 878EA7CE2 for ; Thu, 25 Aug 2016 18:32:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 597D3304039 for ; Thu, 25 Aug 2016 16:32:08 -0700 (PDT) X-ASG-Debug-ID: 1472167926-0bf57b5314209170001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id RJ5q6svmGrIh1KKO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNW5FG009926 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:05 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNW4nF001823 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:05 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNW4Zt013206; Thu, 25 Aug 2016 23:32:04 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:04 -0700 Subject: [PATCH 01/71] xfs: remove xfs_btree_bigkey From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/71] xfs: remove xfs_btree_bigkey To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:02 -0700 Message-ID: <147216792277.867.4345768462787186616.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167926 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3770 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Remove the xfs_btree_bigkey mess and simply make xfs_btree_key big enough to hold both keys in-core. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 12 ++++++------ fs/xfs/libxfs/xfs_btree.h | 24 ++++++------------------ 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 67fd2ce..d1155ca 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -2070,7 +2070,7 @@ __xfs_btree_updkeys( struct xfs_buf *bp0, bool force_all) { - union xfs_btree_bigkey key; /* keys from current level */ + union xfs_btree_key key; /* keys from current level */ union xfs_btree_key *lkey; /* keys from the next level up */ union xfs_btree_key *hkey; union xfs_btree_key *nlkey; /* keys from the next level up */ @@ -2086,7 +2086,7 @@ __xfs_btree_updkeys( trace_xfs_btree_updkeys(cur, level, bp0); - lkey = (union xfs_btree_key *)&key; + lkey = &key; hkey = xfs_btree_high_key_from_key(cur, lkey); xfs_btree_get_keys(cur, block, lkey); for (level++; level < cur->bc_nlevels; level++) { @@ -3230,7 +3230,7 @@ xfs_btree_insrec( struct xfs_buf *bp; /* buffer for block */ union xfs_btree_ptr nptr; /* new block ptr */ struct xfs_btree_cur *ncur; /* new btree cursor */ - union xfs_btree_bigkey nkey; /* new block key */ + union xfs_btree_key nkey; /* new block key */ union xfs_btree_key *lkey; int optr; /* old key/record index */ int ptr; /* key/record index */ @@ -3245,7 +3245,7 @@ xfs_btree_insrec( XFS_BTREE_TRACE_ARGIPR(cur, level, *ptrp, &rec); ncur = NULL; - lkey = (union xfs_btree_key *)&nkey; + lkey = &nkey; /* * If we have an external root pointer, and we've made it to the @@ -3448,14 +3448,14 @@ xfs_btree_insert( union xfs_btree_ptr nptr; /* new block number (split result) */ struct xfs_btree_cur *ncur; /* new cursor (split result) */ struct xfs_btree_cur *pcur; /* previous level's cursor */ - union xfs_btree_bigkey bkey; /* key of block to insert */ + union xfs_btree_key bkey; /* key of block to insert */ union xfs_btree_key *key; union xfs_btree_rec rec; /* record to insert */ level = 0; ncur = NULL; pcur = cur; - key = (union xfs_btree_key *)&bkey; + key = &bkey; xfs_btree_set_ptr_null(cur, &nptr); diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 72f8b3c..870a5ab 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -37,30 +37,18 @@ union xfs_btree_ptr { __be64 l; /* long form ptr */ }; -union xfs_btree_key { - struct xfs_bmbt_key bmbt; - xfs_bmdr_key_t bmbr; /* bmbt root block */ - xfs_alloc_key_t alloc; - struct xfs_inobt_key inobt; - struct xfs_rmap_key rmap; -}; - /* - * In-core key that holds both low and high keys for overlapped btrees. - * The two keys are packed next to each other on disk, so do the same - * in memory. Preserve the existing xfs_btree_key as a single key to - * avoid the mental model breakage that would happen if we passed a - * bigkey into a function that operates on a single key. + * The in-core btree key. Overlapping btrees actually store two keys + * per pointer, so we reserve enough memory to hold both. The __*bigkey + * items should never be accessed directly. */ -union xfs_btree_bigkey { +union xfs_btree_key { struct xfs_bmbt_key bmbt; xfs_bmdr_key_t bmbr; /* bmbt root block */ xfs_alloc_key_t alloc; struct xfs_inobt_key inobt; - struct { - struct xfs_rmap_key rmap; - struct xfs_rmap_key rmap_hi; - }; + struct xfs_rmap_key rmap; + struct xfs_rmap_key __rmap_bigkey[2]; }; union xfs_btree_rec { From darrick.wong@oracle.com Thu Aug 25 18:32:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2C9927CD2 for ; Thu, 25 Aug 2016 18:32:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA3C18F8037 for ; Thu, 25 Aug 2016 16:32:16 -0700 (PDT) X-ASG-Debug-ID: 1472167934-0bf81509b01de3e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id uSppi8WMfNcEKOp7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:15 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNWDfx010009 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:32:13 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNWD6p028398 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:13 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNWAD5028327; Thu, 25 Aug 2016 23:32:12 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:10 -0700 Subject: [PATCH 02/71] xfs: create a standard btree size calculator code From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/71] xfs: create a standard btree size calculator code To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:09 -0700 Message-ID: <147216792896.867.711816517859232858.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167934 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2194 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a helper to generate AG btree height calculator functions. This will be used (much) later when we get to the refcount btree. v2: Use a helper function instead of a macro. v3: We can (theoretically) store more than 2^32 records in a btree, so widen the fields to accept that. v4: Don't modify xfs_bmap_worst_indlen; the purpose of /that/ function is to estimate the worst-case number of blocks needed for a bmbt expansion, not to calculate the space required to store nr records. v5: More minor tweaks to the loop control; move down to reflink patches. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 24 ++++++++++++++++++++++++ fs/xfs/libxfs/xfs_btree.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index d1155ca..1bc483b 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -4801,3 +4801,27 @@ xfs_btree_query_range( return xfs_btree_overlapped_query_range(cur, &low_key, &high_key, fn, priv); } + +/* + * Calculate the number of blocks needed to store a given number of records + * in a short-format (per-AG metadata) btree. + */ +xfs_extlen_t +xfs_btree_calc_size( + struct xfs_mount *mp, + uint *limits, + unsigned long long len) +{ + int level; + int maxrecs; + xfs_extlen_t rval; + + maxrecs = limits[0]; + for (level = 0, rval = 0; len > 1; level++) { + len += maxrecs - 1; + do_div(len, maxrecs); + maxrecs = limits[1]; + rval += len; + } + return rval; +} diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 870a5ab..607463a 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -501,6 +501,8 @@ bool xfs_btree_sblock_v5hdr_verify(struct xfs_buf *bp); bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); uint xfs_btree_compute_maxlevels(struct xfs_mount *mp, uint *limits, unsigned long len); +xfs_extlen_t xfs_btree_calc_size(struct xfs_mount *mp, uint *limits, + unsigned long long len); /* return codes */ #define XFS_BTREE_QUERY_RANGE_CONTINUE 0 /* keep iterating */ From darrick.wong@oracle.com Thu Aug 25 18:32:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F023C7D00 for ; Thu, 25 Aug 2016 18:32:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C2C89304043 for ; Thu, 25 Aug 2016 16:32:20 -0700 (PDT) X-ASG-Debug-ID: 1472167939-0bf57c55b11c7630001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id d6jOUUn1UScehP3b (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNWIei010073 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:32:18 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNWHDZ028549 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:32:18 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNWGdo015373; Thu, 25 Aug 2016 23:32:17 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:16 -0700 Subject: [PATCH 03/71] xfs: count the blocks in a btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/71] xfs: count the blocks in a btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:15 -0700 Message-ID: <147216793514.867.6884435099045085232.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167939 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1665 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide a helper method to count the number of blocks in a short form btree. The refcount and rmap btrees need to know the number of blocks already in use to set up their per-AG block reservations during mount. v2: Use btree_visit_blocks instead of open-coding our own traversal routine. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 23 +++++++++++++++++++++++ fs/xfs/libxfs/xfs_btree.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 1bc483b..3dfb541 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -4825,3 +4825,26 @@ xfs_btree_calc_size( } return rval; } + +int +xfs_btree_count_blocks_helper( + struct xfs_btree_cur *cur, + int level, + void *data) +{ + xfs_extlen_t *blocks = data; + (*blocks)++; + + return 0; +} + +/* Count the blocks in a btree and return the result in *blocks. */ +int +xfs_btree_count_blocks( + struct xfs_btree_cur *cur, + xfs_extlen_t *blocks) +{ + *blocks = 0; + return xfs_btree_visit_blocks(cur, xfs_btree_count_blocks_helper, + blocks); +} diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 607463a..be4a0c1 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -519,4 +519,6 @@ typedef int (*xfs_btree_visit_blocks_fn)(struct xfs_btree_cur *cur, int level, int xfs_btree_visit_blocks(struct xfs_btree_cur *cur, xfs_btree_visit_blocks_fn fn, void *data); +int xfs_btree_count_blocks(struct xfs_btree_cur *cur, xfs_extlen_t *blocks); + #endif /* __XFS_BTREE_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:32:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C0D457CBC for ; Thu, 25 Aug 2016 18:32:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9083A304039 for ; Thu, 25 Aug 2016 16:32:31 -0700 (PDT) X-ASG-Debug-ID: 1472167949-0bf57c55b21c7640001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id xDyzJfiVFv0inMiw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNWRLJ017186 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:28 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNWRNZ011066 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:27 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNWQWo028484; Thu, 25 Aug 2016 23:32:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:26 -0700 Subject: [PATCH 04/71] xfs: defer should allow ->finish_item to request a new transaction From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/71] xfs: defer should allow ->finish_item to request a new transaction To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:21 -0700 Message-ID: <147216794133.867.4063030531885190227.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167949 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6650 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When xfs_defer_finish calls ->finish_item, it's possible that (refcount) won't be able to finish all the work in a single transaction. When this happens, the ->finish_item handler should shorten the log done item's list count, update the work item to reflect where work should continue, and return -EAGAIN so that defer_finish knows to retain the pending item on the pending list, roll the transaction, and restart processing where we left off. Plumb in the code and document how this mechanism is supposed to work. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_defer.c | 78 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 7 deletions(-) diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c index 054a203..faba739 100644 --- a/fs/xfs/libxfs/xfs_defer.c +++ b/fs/xfs/libxfs/xfs_defer.c @@ -81,6 +81,10 @@ * - For each work item attached to the log intent item, * * Perform the described action. * * Attach the work item to the log done item. + * * If the result of doing the work was -EAGAIN, ->finish work + * wants a new transaction. See the "Requesting a Fresh + * Transaction while Finishing Deferred Work" section below for + * details. * * The key here is that we must log an intent item for all pending * work items every time we roll the transaction, and that we must log @@ -88,6 +92,34 @@ * we can perform complex remapping operations, chaining intent items * as needed. * + * Requesting a Fresh Transaction while Finishing Deferred Work + * + * If ->finish_item decides that it needs a fresh transaction to + * finish the work, it must ask its caller (xfs_defer_finish) for a + * continuation. The most likely cause of this circumstance are the + * refcount adjust functions deciding that they've logged enough items + * to be at risk of exceeding the transaction reservation. + * + * To get a fresh transaction, we want to log the existing log done + * item to prevent the log intent item from replaying, immediately log + * a new log intent item with the unfinished work items, roll the + * transaction, and re-call ->finish_item wherever it left off. The + * log done item and the new log intent item must be in the same + * transaction or atomicity cannot be guaranteed; defer_finish ensures + * that this happens. + * + * This requires some coordination between ->finish_item and + * defer_finish. Upon deciding to request a new transaction, + * ->finish_item should update the current work item to reflect the + * unfinished work. Next, it should reset the log done item's list + * count to the number of items finished, and return -EAGAIN. + * defer_finish sees the -EAGAIN, logs the new log intent item + * with the remaining work items, and leaves the xfs_defer_pending + * item at the head of the dop_work queue. Then it rolls the + * transaction and picks up processing where it left off. It is + * required that ->finish_item must be careful to leave enough + * transaction reservation to fit the new log intent item. + * * This is an example of remapping the extent (E, E+B) into file X at * offset A and dealing with the extent (C, C+B) already being mapped * there: @@ -104,21 +136,26 @@ * | Intent to add rmap (X, E, A, B) | * +-------------------------------------------------+ * | Reduce refcount for extent (C, B) | t2 - * | Done reducing refcount for extent (C, B) | + * | Done reducing refcount for extent (C, 9) | + * | Intent to reduce refcount for extent (C+9, B-9) | + * | (ran out of space after 9 refcount updates) | + * +-------------------------------------------------+ + * | Reduce refcount for extent (C+9, B+9) | t3 + * | Done reducing refcount for extent (C+9, B-9) | * | Increase refcount for extent (E, B) | * | Done increasing refcount for extent (E, B) | * | Intent to free extent (C, B) | * | Intent to free extent (F, 1) (refcountbt block) | * | Intent to remove rmap (F, 1, REFC) | * +-------------------------------------------------+ - * | Remove rmap (X, C, A, B) | t3 + * | Remove rmap (X, C, A, B) | t4 * | Done removing rmap (X, C, A, B) | * | Add rmap (X, E, A, B) | * | Done adding rmap (X, E, A, B) | * | Remove rmap (F, 1, REFC) | * | Done removing rmap (F, 1, REFC) | * +-------------------------------------------------+ - * | Free extent (C, B) | t4 + * | Free extent (C, B) | t5 * | Done freeing extent (C, B) | * | Free extent (D, 1) | * | Done freeing extent (D, 1) | @@ -141,6 +178,9 @@ * - Intent to free extent (C, B) * - Intent to free extent (F, 1) (refcountbt block) * - Intent to remove rmap (F, 1, REFC) + * + * Note that the continuation requested between t2 and t3 is likely to + * reoccur. */ static const struct xfs_defer_op_type *defer_op_types[XFS_DEFER_OPS_TYPE_MAX]; @@ -332,7 +372,16 @@ xfs_defer_finish( dfp->dfp_count--; error = dfp->dfp_type->finish_item(*tp, dop, li, done_item, &state); - if (error) { + if (error == -EAGAIN) { + /* + * Caller wants a fresh transaction; + * put the work item back on the list + * and jump out. + */ + list_add(li, &dfp->dfp_work); + dfp->dfp_count++; + break; + } else if (error) { /* * Clean up after ourselves and jump out. * xfs_defer_cancel will take care of freeing @@ -344,9 +393,24 @@ xfs_defer_finish( goto out; } } - /* Done with the dfp, free it. */ - list_del(&dfp->dfp_list); - kmem_free(dfp); + if (error == -EAGAIN) { + /* + * Caller wants a fresh transaction, so log a + * new log intent item to replace the old one + * and roll the transaction. See "Requesting + * a Fresh Transaction while Finishing + * Deferred Work" above. + */ + dfp->dfp_intent = dfp->dfp_type->create_intent(*tp, + dfp->dfp_count); + list_for_each(li, &dfp->dfp_work) + dfp->dfp_type->log_item(*tp, dfp->dfp_intent, + li); + } else { + /* Done with the dfp, free it. */ + list_del(&dfp->dfp_list); + kmem_free(dfp); + } if (cleanup_fn) cleanup_fn(*tp, state, error); From darrick.wong@oracle.com Thu Aug 25 18:32:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 291D47D22 for ; Thu, 25 Aug 2016 18:32:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E113D8F8035 for ; Thu, 25 Aug 2016 16:32:36 -0700 (PDT) X-ASG-Debug-ID: 1472167955-0bf57b53142091a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5oP2cHL8ScRC68xe (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:35 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNWYiU010145 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:34 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNWXta011287 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:34 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNWX4j015417; Thu, 25 Aug 2016 23:32:33 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:32 -0700 Subject: [PATCH 05/71] xfs: introduce tracepoints for AG reservation code From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/71] xfs: introduce tracepoints for AG reservation code To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:31 -0700 Message-ID: <147216795137.867.2930536284130968371.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167955 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2725 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_trace.h | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 7e88bec..6eae816 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2558,6 +2558,75 @@ DEFINE_RMAPBT_EVENT(xfs_rmap_lookup_le_range_result); DEFINE_RMAPBT_EVENT(xfs_rmap_find_right_neighbor_result); DEFINE_RMAPBT_EVENT(xfs_rmap_find_left_neighbor_result); +/* dummy definitions to avoid breaking bisectability; will be removed later */ +#ifndef XFS_AG_RESV_DUMMY +#define XFS_AG_RESV_DUMMY +enum xfs_ag_resv_type { + XFS_AG_RESV_NONE = 0, + XFS_AG_RESV_METADATA, + XFS_AG_RESV_AGFL, +}; +struct xfs_ag_resv { + xfs_extlen_t ar_reserved; + xfs_extlen_t ar_asked; +}; +#define xfs_perag_resv(...) NULL +#endif + +/* per-AG reservation */ +DECLARE_EVENT_CLASS(xfs_ag_resv_class, + TP_PROTO(struct xfs_perag *pag, enum xfs_ag_resv_type resv, + xfs_extlen_t len), + TP_ARGS(pag, resv, len), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(int, resv) + __field(xfs_extlen_t, freeblks) + __field(xfs_extlen_t, flcount) + __field(xfs_extlen_t, reserved) + __field(xfs_extlen_t, asked) + __field(xfs_extlen_t, len) + ), + TP_fast_assign( + struct xfs_ag_resv *r = xfs_perag_resv(pag, resv); + + __entry->dev = pag->pag_mount->m_super->s_dev; + __entry->agno = pag->pag_agno; + __entry->resv = resv; + __entry->freeblks = pag->pagf_freeblks; + __entry->flcount = pag->pagf_flcount; + __entry->reserved = r ? r->ar_reserved : 0; + __entry->asked = r ? r->ar_asked : 0; + __entry->len = len; + ), + TP_printk("dev %d:%d agno %u resv %d freeblks %u flcount %u resv %u ask %u len %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->resv, + __entry->freeblks, + __entry->flcount, + __entry->reserved, + __entry->asked, + __entry->len) +) +#define DEFINE_AG_RESV_EVENT(name) \ +DEFINE_EVENT(xfs_ag_resv_class, name, \ + TP_PROTO(struct xfs_perag *pag, enum xfs_ag_resv_type type, \ + xfs_extlen_t len), \ + TP_ARGS(pag, type, len)) + +/* per-AG reservation tracepoints */ +DEFINE_AG_RESV_EVENT(xfs_ag_resv_init); +DEFINE_AG_RESV_EVENT(xfs_ag_resv_free); +DEFINE_AG_RESV_EVENT(xfs_ag_resv_alloc_extent); +DEFINE_AG_RESV_EVENT(xfs_ag_resv_free_extent); +DEFINE_AG_RESV_EVENT(xfs_ag_resv_critical); +DEFINE_AG_RESV_EVENT(xfs_ag_resv_needed); + +DEFINE_AG_ERROR_EVENT(xfs_ag_resv_free_error); +DEFINE_AG_ERROR_EVENT(xfs_ag_resv_init_error); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH From darrick.wong@oracle.com Thu Aug 25 18:32:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 821687CBC for ; Thu, 25 Aug 2016 18:32:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFC42AC002 for ; Thu, 25 Aug 2016 16:32:46 -0700 (PDT) X-ASG-Debug-ID: 1472167962-0bf57b53132091a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id upL7EqmhWTbB9ylm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNWe0Q017316 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:41 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNWeGp002660 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:40 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNWdmq028499; Thu, 25 Aug 2016 23:32:39 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:38 -0700 Subject: [PATCH 06/71] xfs: set up per-AG free space reservations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/71] xfs: set up per-AG free space reservations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:37 -0700 Message-ID: <147216795753.867.766643420503917806.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167962 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 34885 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines One unfortunate quirk of the reference count btree -- it can expand in size when blocks are written to *other* allocation groups if, say, one large extent becomes a lot of tiny extents. Since we don't want to start throwing errors in the middle of CoWing, we need to reserve some blocks to handle future expansion. Use the count of how many reserved blocks we need to have on hand to create a virtual reservation in the AG. Through selective clamping of the maximum length of allocation requests and of the length of the longest free extent, we can make it look like there's less free space in the AG unless the reservation owner is asking for blocks. In other words, play some accounting tricks in-core to make sure that we always have blocks available. On the plus side, there's nothing to clean up if we crash, which is contrast to the strategy that the rough draft used (actually removing extents from the freespace btrees). v2: There's really only two kinds of per-AG reservation pools -- one to feed the AGFL (rmapbt), and one to feed everything else (refcountbt). Bearing that in mind, we can embed the reservation controls in xfs_perag and greatly simplify the block accounting. Furthermore, fix some longstanding accounting bugs that were a direct result of the goofy "allocate a block and later fix up the accounting" strategy by integrating the reservation accounting code more tightly with the allocator. This eliminates the ENOSPC complaints resulting from refcount btree splits during truncate operations. v3: Since AGFL blocks are considered to be "free", we mustn't change fdblocks in response to any AGFL grow/shrink operation. Therefore, we must give back to fdblocks at umount whatever we borrowed at mount. We have to let ag_reserved go down to zero because it's used to determine if we're critically low on reservation. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_ag_resv.c | 326 ++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ag_resv.h | 35 ++++ fs/xfs/libxfs/xfs_alloc.c | 112 +++++++++---- fs/xfs/libxfs/xfs_alloc.h | 8 + fs/xfs/libxfs/xfs_bmap.c | 6 - fs/xfs/libxfs/xfs_ialloc_btree.c | 2 fs/xfs/xfs_filestream.c | 4 fs/xfs/xfs_fsops.c | 2 fs/xfs/xfs_mount.h | 36 ++++ fs/xfs/xfs_trace.h | 36 +--- fs/xfs/xfs_trans.c | 1 fs/xfs/xfs_trans_extfree.c | 3 13 files changed, 503 insertions(+), 69 deletions(-) create mode 100644 fs/xfs/libxfs/xfs_ag_resv.c create mode 100644 fs/xfs/libxfs/xfs_ag_resv.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index fc593c8..584e87e 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -52,6 +52,7 @@ xfs-y += $(addprefix libxfs/, \ xfs_inode_fork.o \ xfs_inode_buf.o \ xfs_log_rlimit.o \ + xfs_ag_resv.o \ xfs_rmap.o \ xfs_rmap_btree.o \ xfs_sb.o \ diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c new file mode 100644 index 0000000..874c437 --- /dev/null +++ b/fs/xfs/libxfs/xfs_ag_resv.c @@ -0,0 +1,326 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_alloc.h" +#include "xfs_error.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_trans.h" +#include "xfs_bit.h" +#include "xfs_bmap.h" +#include "xfs_bmap_btree.h" +#include "xfs_ag_resv.h" +#include "xfs_trans_space.h" +#include "xfs_rmap_btree.h" +#include "xfs_btree.h" + +/* + * Per-AG Block Reservations + * + * For some kinds of allocation group metadata structures, it is advantageous + * to reserve a small number of blocks in each AG so that future expansions of + * that data structure do not encounter ENOSPC because errors during a btree + * split cause the filesystem to go offline. + * + * Prior to the introduction of reflink, this wasn't an issue because the free + * space btrees maintain a reserve of space (the AGFL) to handle any expansion + * that may be necessary; and allocations of other metadata (inodes, BMBT, + * dir/attr) aren't restricted to a single AG. However, with reflink it is + * possible to allocate all the space in an AG, have subsequent reflink/CoW + * activity expand the refcount btree, and discover that there's no space left + * to handle that expansion. Since we can calculate the maximum size of the + * refcount btree, we can reserve space for it and avoid ENOSPC. + * + * Handling per-AG reservations consists of three changes to the allocator's + * behavior: First, because these reservations are always needed, we decrease + * the ag_max_usable counter to reflect the size of the AG after the reserved + * blocks are taken. Second, the reservations must be reflected in the + * fdblocks count to maintain proper accounting. Third, each AG must maintain + * its own reserved block counter so that we can calculate the amount of space + * that must remain free to maintain the reservations. Fourth, the "remaining + * reserved blocks" count must be used when calculating the length of the + * longest free extent in an AG and to clamp maxlen in the per-AG allocation + * functions. In other words, we maintain a virtual allocation via in-core + * accounting tricks so that we don't have to clean up after a crash. :) + * + * Reserved blocks can be managed by passing one of the enum xfs_ag_resv_type + * values via struct xfs_alloc_arg or directly to the xfs_free_extent + * function. It might seem a little funny to maintain a reservoir of blocks + * to feed another reservoir, but the AGFL only holds enough blocks to get + * through the next transaction. The per-AG reservation is to ensure (we + * hope) that each AG never runs out of blocks. Each data structure wanting + * to use the reservation system should update ask/used in xfs_ag_resv_init. + */ + +/* + * Are we critically low on blocks? For now we'll define that as the number + * of blocks we can get our hands on being less than 10% of what we reserved + * or less than some arbitrary number (eight). + */ +bool +xfs_ag_resv_critical( + struct xfs_perag *pag, + enum xfs_ag_resv_type type) +{ + xfs_extlen_t avail; + xfs_extlen_t orig; + + switch (type) { + case XFS_AG_RESV_METADATA: + avail = pag->pagf_freeblks - pag->pag_agfl_resv.ar_reserved; + orig = pag->pag_meta_resv.ar_asked; + break; + case XFS_AG_RESV_AGFL: + avail = pag->pagf_freeblks + pag->pagf_flcount - + pag->pag_meta_resv.ar_reserved; + orig = pag->pag_agfl_resv.ar_asked; + break; + default: + ASSERT(0); + return false; + } + + trace_xfs_ag_resv_critical(pag, type, avail); + + return avail < orig / 10 || avail < XFS_BTREE_MAXLEVELS; +} + +/* + * How many blocks are reserved but not used, and therefore must not be + * allocated away? + */ +xfs_extlen_t +xfs_ag_resv_needed( + struct xfs_perag *pag, + enum xfs_ag_resv_type type) +{ + xfs_extlen_t len; + + len = pag->pag_meta_resv.ar_reserved + pag->pag_agfl_resv.ar_reserved; + switch (type) { + case XFS_AG_RESV_METADATA: + case XFS_AG_RESV_AGFL: + len -= xfs_perag_resv(pag, type)->ar_reserved; + break; + case XFS_AG_RESV_NONE: + /* empty */ + break; + default: + ASSERT(0); + } + + trace_xfs_ag_resv_needed(pag, type, len); + + return len; +} + +/* Clean out a reservation */ +static int +__xfs_ag_resv_free( + struct xfs_perag *pag, + enum xfs_ag_resv_type type) +{ + struct xfs_ag_resv *resv; + xfs_extlen_t oldresv; + int error; + + trace_xfs_ag_resv_free(pag, type, 0); + + resv = xfs_perag_resv(pag, type); + pag->pag_mount->m_ag_max_usable += resv->ar_asked; + /* + * AGFL blocks are always considered "free", so whatever + * was reserved at mount time must be given back at umount. + */ + oldresv = (type == XFS_AG_RESV_AGFL ? resv->ar_orig_reserved : + resv->ar_reserved); + error = xfs_mod_fdblocks(pag->pag_mount, oldresv, true); + resv->ar_reserved = 0; + resv->ar_asked = 0; + + if (error) + trace_xfs_ag_resv_free_error(pag->pag_mount, pag->pag_agno, + error, _RET_IP_); + return error; +} + +/* Free a per-AG reservation. */ +int +xfs_ag_resv_free( + struct xfs_perag *pag) +{ + int error = 0; + int err2; + + err2 = __xfs_ag_resv_free(pag, XFS_AG_RESV_AGFL); + if (err2 && !error) + error = err2; + err2 = __xfs_ag_resv_free(pag, XFS_AG_RESV_METADATA); + if (err2 && !error) + error = err2; + return error; +} + +static int +__xfs_ag_resv_init( + struct xfs_perag *pag, + enum xfs_ag_resv_type type, + xfs_extlen_t ask, + xfs_extlen_t used) +{ + struct xfs_mount *mp = pag->pag_mount; + struct xfs_ag_resv *resv; + int error; + + resv = xfs_perag_resv(pag, type); + if (used > ask) + ask = used; + resv->ar_asked = ask; + resv->ar_reserved = resv->ar_orig_reserved = ask - used; + mp->m_ag_max_usable -= ask; + + trace_xfs_ag_resv_init(pag, type, ask); + + error = xfs_mod_fdblocks(mp, -(int64_t)resv->ar_reserved, true); + if (error) + trace_xfs_ag_resv_init_error(pag->pag_mount, pag->pag_agno, + error, _RET_IP_); + + return error; +} + +/* Create a per-AG block reservation. */ +int +xfs_ag_resv_init( + struct xfs_perag *pag) +{ + xfs_extlen_t ask; + xfs_extlen_t used; + int error = 0; + int err2; + + if (pag->pag_meta_resv.ar_asked) + goto init_agfl; + + /* Create the metadata reservation. */ + ask = used = 0; + + err2 = __xfs_ag_resv_init(pag, XFS_AG_RESV_METADATA, ask, used); + if (err2 && !error) + error = err2; + +init_agfl: + if (pag->pag_agfl_resv.ar_asked) + return error; + + /* Create the AGFL metadata reservation */ + ask = used = 0; + + err2 = __xfs_ag_resv_init(pag, XFS_AG_RESV_AGFL, ask, used); + if (err2 && !error) + error = err2; + + return error; +} + +/* Allocate a block from the reservation. */ +void +xfs_ag_resv_alloc_extent( + struct xfs_perag *pag, + enum xfs_ag_resv_type type, + struct xfs_alloc_arg *args) +{ + struct xfs_ag_resv *resv; + xfs_extlen_t len; + uint field; + + trace_xfs_ag_resv_alloc_extent(pag, type, args->len); + + switch (type) { + case XFS_AG_RESV_METADATA: + case XFS_AG_RESV_AGFL: + resv = xfs_perag_resv(pag, type); + break; + default: + ASSERT(0); + /* fall through */ + case XFS_AG_RESV_NONE: + field = args->wasdel ? XFS_TRANS_SB_RES_FDBLOCKS : + XFS_TRANS_SB_FDBLOCKS; + xfs_trans_mod_sb(args->tp, field, -(int64_t)args->len); + return; + } + + len = min_t(xfs_extlen_t, args->len, resv->ar_reserved); + resv->ar_reserved -= len; + if (type == XFS_AG_RESV_AGFL) + return; + /* Allocations of reserved blocks only need on-disk sb updates... */ + xfs_trans_mod_sb(args->tp, XFS_TRANS_SB_RES_FDBLOCKS, -(int64_t)len); + /* ...but non-reserved blocks need in-core and on-disk updates. */ + if (args->len > len) + xfs_trans_mod_sb(args->tp, XFS_TRANS_SB_FDBLOCKS, + -((int64_t)args->len - len)); +} + +/* Free a block to the reservation. */ +void +xfs_ag_resv_free_extent( + struct xfs_perag *pag, + enum xfs_ag_resv_type type, + struct xfs_trans *tp, + xfs_extlen_t len) +{ + xfs_extlen_t leftover; + struct xfs_ag_resv *resv; + + trace_xfs_ag_resv_free_extent(pag, type, len); + + switch (type) { + case XFS_AG_RESV_METADATA: + case XFS_AG_RESV_AGFL: + resv = xfs_perag_resv(pag, type); + break; + default: + ASSERT(0); + /* fall through */ + case XFS_AG_RESV_NONE: + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (int64_t)len); + return; + } + + leftover = min_t(xfs_extlen_t, len, resv->ar_asked - resv->ar_reserved); + resv->ar_reserved += leftover; + if (type == XFS_AG_RESV_AGFL) + return; + /* Freeing into the reserved pool only requires on-disk update... */ + xfs_trans_mod_sb(tp, XFS_TRANS_SB_RES_FDBLOCKS, len); + /* ...but freeing beyond that requires in-core and on-disk update. */ + if (len > leftover) + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, len - leftover); +} diff --git a/fs/xfs/libxfs/xfs_ag_resv.h b/fs/xfs/libxfs/xfs_ag_resv.h new file mode 100644 index 0000000..8d6c687 --- /dev/null +++ b/fs/xfs/libxfs/xfs_ag_resv.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_AG_RESV_H__ +#define __XFS_AG_RESV_H__ + +int xfs_ag_resv_free(struct xfs_perag *pag); +int xfs_ag_resv_init(struct xfs_perag *pag); + +bool xfs_ag_resv_critical(struct xfs_perag *pag, enum xfs_ag_resv_type type); +xfs_extlen_t xfs_ag_resv_needed(struct xfs_perag *pag, + enum xfs_ag_resv_type type); + +void xfs_ag_resv_alloc_extent(struct xfs_perag *pag, enum xfs_ag_resv_type type, + struct xfs_alloc_arg *args); +void xfs_ag_resv_free_extent(struct xfs_perag *pag, enum xfs_ag_resv_type type, + struct xfs_trans *tp, xfs_extlen_t len); + +#endif /* __XFS_AG_RESV_H__ */ diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 12912b5..2f58277 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -37,6 +37,7 @@ #include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_log.h" +#include "xfs_ag_resv.h" struct workqueue_struct *xfs_alloc_wq; @@ -74,14 +75,8 @@ xfs_prealloc_blocks( * extents need to be actually allocated. To get around this, we explicitly set * aside a few blocks which will not be reserved in delayed allocation. * - * When rmap is disabled, we need to reserve 4 fsbs _per AG_ for the freelist - * and 4 more to handle a potential split of the file's bmap btree. - * - * When rmap is enabled, we must also be able to handle two rmap btree inserts - * to record both the file data extent and a new bmbt block. The bmbt block - * might not be in the same AG as the file data extent. In the worst case - * the bmap btree splits multiple levels and all the new blocks come from - * different AGs, so set aside enough to handle rmap btree splits in all AGs. + * We need to reserve 4 fsbs _per AG_ for the freelist and 4 more to handle a + * potential split of the file's bmap btree. */ unsigned int xfs_alloc_set_aside( @@ -90,8 +85,6 @@ xfs_alloc_set_aside( unsigned int blocks; blocks = 4 + (mp->m_sb.sb_agcount * XFS_ALLOC_AGFL_RESERVE); - if (xfs_sb_version_hasrmapbt(&mp->m_sb)) - blocks += mp->m_sb.sb_agcount * mp->m_rmap_maxlevels; return blocks; } @@ -680,12 +673,29 @@ xfs_alloc_ag_vextent( xfs_alloc_arg_t *args) /* argument structure for allocation */ { int error=0; + xfs_extlen_t reservation; + xfs_extlen_t oldmax; ASSERT(args->minlen > 0); ASSERT(args->maxlen > 0); ASSERT(args->minlen <= args->maxlen); ASSERT(args->mod < args->prod); ASSERT(args->alignment > 0); + + /* + * Clamp maxlen to the amount of free space minus any reservations + * that have been made. + */ + oldmax = args->maxlen; + reservation = xfs_ag_resv_needed(args->pag, args->resv); + if (args->maxlen > args->pag->pagf_freeblks - reservation) + args->maxlen = args->pag->pagf_freeblks - reservation; + if (args->maxlen == 0) { + args->agbno = NULLAGBLOCK; + args->maxlen = oldmax; + return 0; + } + /* * Branch to correct routine based on the type. */ @@ -705,12 +715,14 @@ xfs_alloc_ag_vextent( /* NOTREACHED */ } + args->maxlen = oldmax; + if (error || args->agbno == NULLAGBLOCK) return error; ASSERT(args->len >= args->minlen); ASSERT(args->len <= args->maxlen); - ASSERT(!args->wasfromfl || !args->isfl); + ASSERT(!args->wasfromfl || args->resv != XFS_AG_RESV_AGFL); ASSERT(args->agbno % args->alignment == 0); /* if not file data, insert new block into the reverse map btree */ @@ -732,12 +744,7 @@ xfs_alloc_ag_vextent( args->agbno, args->len)); } - if (!args->isfl) { - xfs_trans_mod_sb(args->tp, args->wasdel ? - XFS_TRANS_SB_RES_FDBLOCKS : - XFS_TRANS_SB_FDBLOCKS, - -((long)(args->len))); - } + xfs_ag_resv_alloc_extent(args->pag, args->resv, args); XFS_STATS_INC(args->mp, xs_allocx); XFS_STATS_ADD(args->mp, xs_allocb, args->len); @@ -1583,6 +1590,7 @@ xfs_alloc_ag_vextent_small( int *stat) /* status: 0-freelist, 1-normal/none */ { struct xfs_owner_info oinfo; + struct xfs_perag *pag; int error; xfs_agblock_t fbno; xfs_extlen_t flen; @@ -1600,7 +1608,8 @@ xfs_alloc_ag_vextent_small( * to respect minleft even when pulling from the * freelist. */ - else if (args->minlen == 1 && args->alignment == 1 && !args->isfl && + else if (args->minlen == 1 && args->alignment == 1 && + args->resv != XFS_AG_RESV_AGFL && (be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_flcount) > args->minleft)) { error = xfs_alloc_get_freelist(args->tp, args->agbp, &fbno, 0); @@ -1629,13 +1638,18 @@ xfs_alloc_ag_vextent_small( /* * If we're feeding an AGFL block to something that * doesn't live in the free space, we need to clear - * out the OWN_AG rmap. + * out the OWN_AG rmap and add the block back to + * the AGFL per-AG reservation. */ xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG); error = xfs_rmap_free(args->tp, args->agbp, args->agno, fbno, 1, &oinfo); if (error) goto error0; + pag = xfs_perag_get(args->mp, args->agno); + xfs_ag_resv_free_extent(pag, XFS_AG_RESV_AGFL, + args->tp, 1); + xfs_perag_put(pag); *stat = 0; return 0; @@ -1683,7 +1697,7 @@ xfs_free_ag_extent( xfs_agblock_t bno, xfs_extlen_t len, struct xfs_owner_info *oinfo, - int isfl) + enum xfs_ag_resv_type type) { xfs_btree_cur_t *bno_cur; /* cursor for by-block btree */ xfs_btree_cur_t *cnt_cur; /* cursor for by-size btree */ @@ -1911,21 +1925,22 @@ xfs_free_ag_extent( */ pag = xfs_perag_get(mp, agno); error = xfs_alloc_update_counters(tp, pag, agbp, len); + xfs_ag_resv_free_extent(pag, type, tp, len); xfs_perag_put(pag); if (error) goto error0; - if (!isfl) - xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); XFS_STATS_INC(mp, xs_freex); XFS_STATS_ADD(mp, xs_freeb, len); - trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright); + trace_xfs_free_extent(mp, agno, bno, len, type == XFS_AG_RESV_AGFL, + haveleft, haveright); return 0; error0: - trace_xfs_free_extent(mp, agno, bno, len, isfl, -1, -1); + trace_xfs_free_extent(mp, agno, bno, len, type == XFS_AG_RESV_AGFL, + -1, -1); if (bno_cur) xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); if (cnt_cur) @@ -1950,21 +1965,43 @@ xfs_alloc_compute_maxlevels( } /* - * Find the length of the longest extent in an AG. + * Find the length of the longest extent in an AG. The 'need' parameter + * specifies how much space we're going to need for the AGFL and the + * 'reserved' parameter tells us how many blocks in this AG are reserved for + * other callers. */ xfs_extlen_t xfs_alloc_longest_free_extent( struct xfs_mount *mp, struct xfs_perag *pag, - xfs_extlen_t need) + xfs_extlen_t need, + xfs_extlen_t reserved) { xfs_extlen_t delta = 0; + /* + * If the AGFL needs a recharge, we'll have to subtract that from the + * longest extent. + */ if (need > pag->pagf_flcount) delta = need - pag->pagf_flcount; + /* + * If we cannot maintain others' reservations with space from the + * not-longest freesp extents, we'll have to subtract /that/ from + * the longest extent too. + */ + if (pag->pagf_freeblks - pag->pagf_longest < reserved) + delta += reserved - (pag->pagf_freeblks - pag->pagf_longest); + + /* + * If the longest extent is long enough to satisfy all the + * reservations and AGFL rules in place, we can return this extent. + */ if (pag->pagf_longest > delta) return pag->pagf_longest - delta; + + /* Otherwise, let the caller try for 1 block if there's space. */ return pag->pagf_flcount > 0 || pag->pagf_longest > 0; } @@ -2004,20 +2041,24 @@ xfs_alloc_space_available( { struct xfs_perag *pag = args->pag; xfs_extlen_t longest; + xfs_extlen_t reservation; /* blocks that are still reserved */ int available; if (flags & XFS_ALLOC_FLAG_FREEING) return true; + reservation = xfs_ag_resv_needed(pag, args->resv); + /* do we have enough contiguous free space for the allocation? */ - longest = xfs_alloc_longest_free_extent(args->mp, pag, min_free); + longest = xfs_alloc_longest_free_extent(args->mp, pag, min_free, + reservation); if ((args->minlen + args->alignment + args->minalignslop - 1) > longest) return false; - /* do have enough free space remaining for the allocation? */ + /* do we have enough free space remaining for the allocation? */ available = (int)(pag->pagf_freeblks + pag->pagf_flcount - - min_free - args->total); - if (available < (int)args->minleft) + reservation - min_free - args->total); + if (available < (int)args->minleft || available <= 0) return false; return true; @@ -2124,7 +2165,7 @@ xfs_alloc_fix_freelist( if (error) goto out_agbp_relse; error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1, - &targs.oinfo, 1); + &targs.oinfo, XFS_AG_RESV_AGFL); if (error) goto out_agbp_relse; bp = xfs_btree_get_bufs(mp, tp, args->agno, bno, 0); @@ -2135,7 +2176,7 @@ xfs_alloc_fix_freelist( targs.mp = mp; targs.agbp = agbp; targs.agno = args->agno; - targs.alignment = targs.minlen = targs.prod = targs.isfl = 1; + targs.alignment = targs.minlen = targs.prod = 1; targs.type = XFS_ALLOCTYPE_THIS_AG; targs.pag = pag; error = xfs_alloc_read_agfl(mp, tp, targs.agno, &agflbp); @@ -2146,6 +2187,7 @@ xfs_alloc_fix_freelist( while (pag->pagf_flcount < need) { targs.agbno = 0; targs.maxlen = need - pag->pagf_flcount; + targs.resv = XFS_AG_RESV_AGFL; /* Allocate as many blocks as possible at once. */ error = xfs_alloc_ag_vextent(&targs); @@ -2827,7 +2869,8 @@ xfs_free_extent( struct xfs_trans *tp, /* transaction pointer */ xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len, /* length of extent */ - struct xfs_owner_info *oinfo) /* extent owner */ + struct xfs_owner_info *oinfo, /* extent owner */ + enum xfs_ag_resv_type type) /* block reservation type */ { struct xfs_mount *mp = tp->t_mountp; struct xfs_buf *agbp; @@ -2836,6 +2879,7 @@ xfs_free_extent( int error; ASSERT(len != 0); + ASSERT(type != XFS_AG_RESV_AGFL); if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_FREE_EXTENT, @@ -2853,7 +2897,7 @@ xfs_free_extent( agbno + len <= be32_to_cpu(XFS_BUF_TO_AGF(agbp)->agf_length), err); - error = xfs_free_ag_extent(tp, agbp, agno, agbno, len, oinfo, 0); + error = xfs_free_ag_extent(tp, agbp, agno, agbno, len, oinfo, type); if (error) goto err; diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index 6fe2d6b..f7c5201 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -87,10 +87,10 @@ typedef struct xfs_alloc_arg { xfs_alloctype_t otype; /* original allocation type */ char wasdel; /* set if allocation was prev delayed */ char wasfromfl; /* set if allocation is from freelist */ - char isfl; /* set if is freelist blocks - !acctg */ char userdata; /* mask defining userdata treatment */ xfs_fsblock_t firstblock; /* io first block allocated */ struct xfs_owner_info oinfo; /* owner of blocks being allocated */ + enum xfs_ag_resv_type resv; /* block reservation to use */ } xfs_alloc_arg_t; /* @@ -106,7 +106,8 @@ unsigned int xfs_alloc_set_aside(struct xfs_mount *mp); unsigned int xfs_alloc_ag_max_usable(struct xfs_mount *mp); xfs_extlen_t xfs_alloc_longest_free_extent(struct xfs_mount *mp, - struct xfs_perag *pag, xfs_extlen_t need); + struct xfs_perag *pag, xfs_extlen_t need, + xfs_extlen_t reserved); unsigned int xfs_alloc_min_freelist(struct xfs_mount *mp, struct xfs_perag *pag); @@ -184,7 +185,8 @@ xfs_free_extent( struct xfs_trans *tp, /* transaction pointer */ xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len, /* length of extent */ - struct xfs_owner_info *oinfo);/* extent owner */ + struct xfs_owner_info *oinfo, /* extent owner */ + enum xfs_ag_resv_type type); /* block reservation type */ int /* error */ xfs_alloc_lookup_ge( diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index b060bca..042d7bf 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -47,6 +47,7 @@ #include "xfs_attr_leaf.h" #include "xfs_filestream.h" #include "xfs_rmap.h" +#include "xfs_ag_resv.h" kmem_zone_t *xfs_bmap_free_item_zone; @@ -3501,7 +3502,8 @@ xfs_bmap_longest_free_extent( } longest = xfs_alloc_longest_free_extent(mp, pag, - xfs_alloc_min_freelist(mp, pag)); + xfs_alloc_min_freelist(mp, pag), + xfs_ag_resv_needed(pag, XFS_AG_RESV_NONE)); if (*blen < longest) *blen = longest; @@ -3781,7 +3783,7 @@ xfs_bmap_btalloc( } args.minleft = ap->minleft; args.wasdel = ap->wasdel; - args.isfl = 0; + args.resv = XFS_AG_RESV_NONE; args.userdata = ap->userdata; if (ap->userdata & XFS_ALLOC_USERDATA_ZERO) args.ip = ap->ip; diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index 31ca220..eab68ae 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -132,7 +132,7 @@ xfs_inobt_free_block( xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INOBT); return xfs_free_extent(cur->bc_tp, XFS_DADDR_TO_FSB(cur->bc_mp, XFS_BUF_ADDR(bp)), 1, - &oinfo); + &oinfo, XFS_AG_RESV_NONE); } STATIC int diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index 4a33a33..c8005fd 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -30,6 +30,7 @@ #include "xfs_mru_cache.h" #include "xfs_filestream.h" #include "xfs_trace.h" +#include "xfs_ag_resv.h" struct xfs_fstrm_item { struct xfs_mru_cache_elem mru; @@ -198,7 +199,8 @@ xfs_filestream_pick_ag( } longest = xfs_alloc_longest_free_extent(mp, pag, - xfs_alloc_min_freelist(mp, pag)); + xfs_alloc_min_freelist(mp, pag), + xfs_ag_resv_needed(pag, XFS_AG_RESV_NONE)); if (((minlen && longest >= minlen) || (!minlen && pag->pagf_freeblks >= minfree)) && (!pag->pagf_metadata || !(flags & XFS_PICK_USERDATA) || diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 0b7f986..94ac06f 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -553,7 +553,7 @@ xfs_growfs_data_private( error = xfs_free_extent(tp, XFS_AGB_TO_FSB(mp, agno, be32_to_cpu(agf->agf_length) - new), - new, &oinfo); + new, &oinfo, XFS_AG_RESV_NONE); if (error) goto error0; } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b36676c..a3c2e2d 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -325,6 +325,22 @@ xfs_mp_fail_writes(struct xfs_mount *mp) } #endif +/* per-AG block reservation data structures*/ +enum xfs_ag_resv_type { + XFS_AG_RESV_NONE = 0, + XFS_AG_RESV_METADATA, + XFS_AG_RESV_AGFL, +}; + +struct xfs_ag_resv { + /* number of blocks originally reserved here */ + xfs_extlen_t ar_orig_reserved; + /* number of blocks reserved here */ + xfs_extlen_t ar_reserved; + /* number of blocks originally asked for */ + xfs_extlen_t ar_asked; +}; + /* * Per-ag incore structure, copies of information in agf and agi, to improve the * performance of allocation group selection. @@ -372,8 +388,28 @@ typedef struct xfs_perag { /* for rcu-safe freeing */ struct rcu_head rcu_head; int pagb_count; /* pagb slots in use */ + + /* Blocks reserved for all kinds of metadata. */ + struct xfs_ag_resv pag_meta_resv; + /* Blocks reserved for just AGFL-based metadata. */ + struct xfs_ag_resv pag_agfl_resv; } xfs_perag_t; +static inline struct xfs_ag_resv * +xfs_perag_resv( + struct xfs_perag *pag, + enum xfs_ag_resv_type type) +{ + switch (type) { + case XFS_AG_RESV_METADATA: + return &pag->pag_meta_resv; + case XFS_AG_RESV_AGFL: + return &pag->pag_agfl_resv; + default: + return NULL; + } +} + extern void xfs_uuid_table_free(void); extern int xfs_log_sbcount(xfs_mount_t *); extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 6eae816..ed91efd 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1570,14 +1570,15 @@ TRACE_EVENT(xfs_agf, TRACE_EVENT(xfs_free_extent, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, bool isfl, int haveleft, int haveright), - TP_ARGS(mp, agno, agbno, len, isfl, haveleft, haveright), + xfs_extlen_t len, enum xfs_ag_resv_type resv, int haveleft, + int haveright), + TP_ARGS(mp, agno, agbno, len, resv, haveleft, haveright), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) __field(xfs_agblock_t, agbno) __field(xfs_extlen_t, len) - __field(int, isfl) + __field(int, resv) __field(int, haveleft) __field(int, haveright) ), @@ -1586,16 +1587,16 @@ TRACE_EVENT(xfs_free_extent, __entry->agno = agno; __entry->agbno = agbno; __entry->len = len; - __entry->isfl = isfl; + __entry->resv = resv; __entry->haveleft = haveleft; __entry->haveright = haveright; ), - TP_printk("dev %d:%d agno %u agbno %u len %u isfl %d %s", + TP_printk("dev %d:%d agno %u agbno %u len %u resv %d %s", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, __entry->agbno, __entry->len, - __entry->isfl, + __entry->resv, __entry->haveleft ? (__entry->haveright ? "both" : "left") : (__entry->haveright ? "right" : "none")) @@ -1622,7 +1623,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class, __field(short, otype) __field(char, wasdel) __field(char, wasfromfl) - __field(char, isfl) + __field(int, resv) __field(char, userdata) __field(xfs_fsblock_t, firstblock) ), @@ -1643,13 +1644,13 @@ DECLARE_EVENT_CLASS(xfs_alloc_class, __entry->otype = args->otype; __entry->wasdel = args->wasdel; __entry->wasfromfl = args->wasfromfl; - __entry->isfl = args->isfl; + __entry->resv = args->resv; __entry->userdata = args->userdata; __entry->firstblock = args->firstblock; ), TP_printk("dev %d:%d agno %u agbno %u minlen %u maxlen %u mod %u " "prod %u minleft %u total %u alignment %u minalignslop %u " - "len %u type %s otype %s wasdel %d wasfromfl %d isfl %d " + "len %u type %s otype %s wasdel %d wasfromfl %d resv %d " "userdata %d firstblock 0x%llx", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, @@ -1667,7 +1668,7 @@ DECLARE_EVENT_CLASS(xfs_alloc_class, __print_symbolic(__entry->otype, XFS_ALLOC_TYPES), __entry->wasdel, __entry->wasfromfl, - __entry->isfl, + __entry->resv, __entry->userdata, (unsigned long long)__entry->firstblock) ) @@ -2558,21 +2559,6 @@ DEFINE_RMAPBT_EVENT(xfs_rmap_lookup_le_range_result); DEFINE_RMAPBT_EVENT(xfs_rmap_find_right_neighbor_result); DEFINE_RMAPBT_EVENT(xfs_rmap_find_left_neighbor_result); -/* dummy definitions to avoid breaking bisectability; will be removed later */ -#ifndef XFS_AG_RESV_DUMMY -#define XFS_AG_RESV_DUMMY -enum xfs_ag_resv_type { - XFS_AG_RESV_NONE = 0, - XFS_AG_RESV_METADATA, - XFS_AG_RESV_AGFL, -}; -struct xfs_ag_resv { - xfs_extlen_t ar_reserved; - xfs_extlen_t ar_asked; -}; -#define xfs_perag_resv(...) NULL -#endif - /* per-AG reservation */ DECLARE_EVENT_CLASS(xfs_ag_resv_class, TP_PROTO(struct xfs_perag *pag, enum xfs_ag_resv_type resv, diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 5f3d33d..3ad3553 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -318,7 +318,6 @@ xfs_trans_mod_sb( * in-core superblock's counter. This should only * be applied to the on-disk superblock. */ - ASSERT(delta < 0); tp->t_res_fdblocks_delta += delta; if (xfs_sb_version_haslazysbcount(&mp->m_sb)) flags &= ~XFS_TRANS_SB_DIRTY; diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index 459ddec..ab43864 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -79,7 +79,8 @@ xfs_trans_free_extent( trace_xfs_bmap_free_deferred(tp->t_mountp, agno, 0, agbno, ext_len); - error = xfs_free_extent(tp, start_block, ext_len, oinfo); + error = xfs_free_extent(tp, start_block, ext_len, oinfo, + XFS_AG_RESV_NONE); /* * Mark the transaction dirty, even on error. This ensures the From darrick.wong@oracle.com Thu Aug 25 18:32:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 609B57CFE for ; Thu, 25 Aug 2016 18:32:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D7794AC001 for ; Thu, 25 Aug 2016 16:32:50 -0700 (PDT) X-ASG-Debug-ID: 1472167968-0bf8155c741e6540001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 6ptFJZylDH8W7iDV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNWkGL017340 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:32:47 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNWkcg029476 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:46 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNWjWC028531; Thu, 25 Aug 2016 23:32:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:45 -0700 Subject: [PATCH 07/71] xfs: define tracepoints for refcount btree activities From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/71] xfs: define tracepoints for refcount btree activities To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:44 -0700 Message-ID: <147216796400.867.3093949883691867882.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167968 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12126 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Define all the tracepoints we need to inspect the refcount btree runtime operation. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_trace.h | 302 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 302 insertions(+) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index ed91efd..148afc6 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -40,6 +40,16 @@ struct xfs_inode_log_format; struct xfs_bmbt_irec; struct xfs_btree_cur; +#ifndef XFS_REFCOUNT_IREC_PLACEHOLDER +#define XFS_REFCOUNT_IREC_PLACEHOLDER +/* Placeholder definition to avoid breaking bisectability. */ +struct xfs_refcount_irec { + xfs_agblock_t rc_startblock; /* starting block number */ + xfs_extlen_t rc_blockcount; /* count of free blocks */ + xfs_nlink_t rc_refcount; /* number of inodes linked here */ +}; +#endif + DECLARE_EVENT_CLASS(xfs_attr_list_class, TP_PROTO(struct xfs_attr_list_context *ctx), TP_ARGS(ctx), @@ -2613,6 +2623,298 @@ DEFINE_AG_RESV_EVENT(xfs_ag_resv_needed); DEFINE_AG_ERROR_EVENT(xfs_ag_resv_free_error); DEFINE_AG_ERROR_EVENT(xfs_ag_resv_init_error); +/* refcount tracepoint classes */ + +/* reuse the discard trace class for agbno/aglen-based traces */ +#define DEFINE_AG_EXTENT_EVENT(name) DEFINE_DISCARD_EVENT(name) + +/* ag btree lookup tracepoint class */ +#define XFS_AG_BTREE_CMP_FORMAT_STR \ + { XFS_LOOKUP_EQ, "eq" }, \ + { XFS_LOOKUP_LE, "le" }, \ + { XFS_LOOKUP_GE, "ge" } +DECLARE_EVENT_CLASS(xfs_ag_btree_lookup_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_lookup_t dir), + TP_ARGS(mp, agno, agbno, dir), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, agbno) + __field(xfs_lookup_t, dir) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->agbno = agbno; + __entry->dir = dir; + ), + TP_printk("dev %d:%d agno %u agbno %u cmp %s(%d)\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->agbno, + __print_symbolic(__entry->dir, XFS_AG_BTREE_CMP_FORMAT_STR), + __entry->dir) +) + +#define DEFINE_AG_BTREE_LOOKUP_EVENT(name) \ +DEFINE_EVENT(xfs_ag_btree_lookup_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + xfs_agblock_t agbno, xfs_lookup_t dir), \ + TP_ARGS(mp, agno, agbno, dir)) + +/* single-rcext tracepoint class */ +DECLARE_EVENT_CLASS(xfs_refcount_extent_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + struct xfs_refcount_irec *irec), + TP_ARGS(mp, agno, irec), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, startblock) + __field(xfs_extlen_t, blockcount) + __field(xfs_nlink_t, refcount) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->startblock = irec->rc_startblock; + __entry->blockcount = irec->rc_blockcount; + __entry->refcount = irec->rc_refcount; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u refcount %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->startblock, + __entry->blockcount, + __entry->refcount) +) + +#define DEFINE_REFCOUNT_EXTENT_EVENT(name) \ +DEFINE_EVENT(xfs_refcount_extent_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + struct xfs_refcount_irec *irec), \ + TP_ARGS(mp, agno, irec)) + +/* single-rcext and an agbno tracepoint class */ +DECLARE_EVENT_CLASS(xfs_refcount_extent_at_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + struct xfs_refcount_irec *irec, xfs_agblock_t agbno), + TP_ARGS(mp, agno, irec, agbno), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, startblock) + __field(xfs_extlen_t, blockcount) + __field(xfs_nlink_t, refcount) + __field(xfs_agblock_t, agbno) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->startblock = irec->rc_startblock; + __entry->blockcount = irec->rc_blockcount; + __entry->refcount = irec->rc_refcount; + __entry->agbno = agbno; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u refcount %u @ agbno %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->startblock, + __entry->blockcount, + __entry->refcount, + __entry->agbno) +) + +#define DEFINE_REFCOUNT_EXTENT_AT_EVENT(name) \ +DEFINE_EVENT(xfs_refcount_extent_at_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + struct xfs_refcount_irec *irec, xfs_agblock_t agbno), \ + TP_ARGS(mp, agno, irec, agbno)) + +/* double-rcext tracepoint class */ +DECLARE_EVENT_CLASS(xfs_refcount_double_extent_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + struct xfs_refcount_irec *i1, struct xfs_refcount_irec *i2), + TP_ARGS(mp, agno, i1, i2), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, i1_startblock) + __field(xfs_extlen_t, i1_blockcount) + __field(xfs_nlink_t, i1_refcount) + __field(xfs_agblock_t, i2_startblock) + __field(xfs_extlen_t, i2_blockcount) + __field(xfs_nlink_t, i2_refcount) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->i1_startblock = i1->rc_startblock; + __entry->i1_blockcount = i1->rc_blockcount; + __entry->i1_refcount = i1->rc_refcount; + __entry->i2_startblock = i2->rc_startblock; + __entry->i2_blockcount = i2->rc_blockcount; + __entry->i2_refcount = i2->rc_refcount; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u refcount %u -- " + "agbno %u len %u refcount %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->i1_startblock, + __entry->i1_blockcount, + __entry->i1_refcount, + __entry->i2_startblock, + __entry->i2_blockcount, + __entry->i2_refcount) +) + +#define DEFINE_REFCOUNT_DOUBLE_EXTENT_EVENT(name) \ +DEFINE_EVENT(xfs_refcount_double_extent_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + struct xfs_refcount_irec *i1, struct xfs_refcount_irec *i2), \ + TP_ARGS(mp, agno, i1, i2)) + +/* double-rcext and an agbno tracepoint class */ +DECLARE_EVENT_CLASS(xfs_refcount_double_extent_at_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + struct xfs_refcount_irec *i1, struct xfs_refcount_irec *i2, + xfs_agblock_t agbno), + TP_ARGS(mp, agno, i1, i2, agbno), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, i1_startblock) + __field(xfs_extlen_t, i1_blockcount) + __field(xfs_nlink_t, i1_refcount) + __field(xfs_agblock_t, i2_startblock) + __field(xfs_extlen_t, i2_blockcount) + __field(xfs_nlink_t, i2_refcount) + __field(xfs_agblock_t, agbno) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->i1_startblock = i1->rc_startblock; + __entry->i1_blockcount = i1->rc_blockcount; + __entry->i1_refcount = i1->rc_refcount; + __entry->i2_startblock = i2->rc_startblock; + __entry->i2_blockcount = i2->rc_blockcount; + __entry->i2_refcount = i2->rc_refcount; + __entry->agbno = agbno; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u refcount %u -- " + "agbno %u len %u refcount %u @ agbno %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->i1_startblock, + __entry->i1_blockcount, + __entry->i1_refcount, + __entry->i2_startblock, + __entry->i2_blockcount, + __entry->i2_refcount, + __entry->agbno) +) + +#define DEFINE_REFCOUNT_DOUBLE_EXTENT_AT_EVENT(name) \ +DEFINE_EVENT(xfs_refcount_double_extent_at_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + struct xfs_refcount_irec *i1, struct xfs_refcount_irec *i2, \ + xfs_agblock_t agbno), \ + TP_ARGS(mp, agno, i1, i2, agbno)) + +/* triple-rcext tracepoint class */ +DECLARE_EVENT_CLASS(xfs_refcount_triple_extent_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + struct xfs_refcount_irec *i1, struct xfs_refcount_irec *i2, + struct xfs_refcount_irec *i3), + TP_ARGS(mp, agno, i1, i2, i3), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, i1_startblock) + __field(xfs_extlen_t, i1_blockcount) + __field(xfs_nlink_t, i1_refcount) + __field(xfs_agblock_t, i2_startblock) + __field(xfs_extlen_t, i2_blockcount) + __field(xfs_nlink_t, i2_refcount) + __field(xfs_agblock_t, i3_startblock) + __field(xfs_extlen_t, i3_blockcount) + __field(xfs_nlink_t, i3_refcount) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->i1_startblock = i1->rc_startblock; + __entry->i1_blockcount = i1->rc_blockcount; + __entry->i1_refcount = i1->rc_refcount; + __entry->i2_startblock = i2->rc_startblock; + __entry->i2_blockcount = i2->rc_blockcount; + __entry->i2_refcount = i2->rc_refcount; + __entry->i3_startblock = i3->rc_startblock; + __entry->i3_blockcount = i3->rc_blockcount; + __entry->i3_refcount = i3->rc_refcount; + ), + TP_printk("dev %d:%d agno %u agbno %u len %u refcount %u -- " + "agbno %u len %u refcount %u -- " + "agbno %u len %u refcount %u\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->i1_startblock, + __entry->i1_blockcount, + __entry->i1_refcount, + __entry->i2_startblock, + __entry->i2_blockcount, + __entry->i2_refcount, + __entry->i3_startblock, + __entry->i3_blockcount, + __entry->i3_refcount) +); + +#define DEFINE_REFCOUNT_TRIPLE_EXTENT_EVENT(name) \ +DEFINE_EVENT(xfs_refcount_triple_extent_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ + struct xfs_refcount_irec *i1, struct xfs_refcount_irec *i2, \ + struct xfs_refcount_irec *i3), \ + TP_ARGS(mp, agno, i1, i2, i3)) + +/* refcount btree tracepoints */ +DEFINE_BUSY_EVENT(xfs_refcountbt_alloc_block); +DEFINE_BUSY_EVENT(xfs_refcountbt_free_block); +DEFINE_AG_BTREE_LOOKUP_EVENT(xfs_refcount_lookup); +DEFINE_REFCOUNT_EXTENT_EVENT(xfs_refcount_get); +DEFINE_REFCOUNT_EXTENT_EVENT(xfs_refcount_update); +DEFINE_REFCOUNT_EXTENT_EVENT(xfs_refcount_insert); +DEFINE_REFCOUNT_EXTENT_EVENT(xfs_refcount_delete); +DEFINE_AG_ERROR_EVENT(xfs_refcount_insert_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_delete_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_update_error); + +/* refcount adjustment tracepoints */ +DEFINE_AG_EXTENT_EVENT(xfs_refcount_increase); +DEFINE_AG_EXTENT_EVENT(xfs_refcount_decrease); +DEFINE_REFCOUNT_TRIPLE_EXTENT_EVENT(xfs_refcount_merge_center_extents); +DEFINE_REFCOUNT_EXTENT_EVENT(xfs_refcount_modify_extent); +DEFINE_REFCOUNT_EXTENT_AT_EVENT(xfs_refcount_split_extent); +DEFINE_REFCOUNT_DOUBLE_EXTENT_EVENT(xfs_refcount_merge_left_extent); +DEFINE_REFCOUNT_DOUBLE_EXTENT_EVENT(xfs_refcount_merge_right_extent); +DEFINE_REFCOUNT_DOUBLE_EXTENT_AT_EVENT(xfs_refcount_find_left_extent); +DEFINE_REFCOUNT_DOUBLE_EXTENT_AT_EVENT(xfs_refcount_find_right_extent); +DEFINE_AG_ERROR_EVENT(xfs_refcount_adjust_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_merge_center_extents_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_modify_extent_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_split_extent_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_merge_left_extent_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_merge_right_extent_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_find_left_extent_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_find_right_extent_error); +DEFINE_REFCOUNT_DOUBLE_EXTENT_EVENT(xfs_refcount_rec_order_error); + +/* reflink helpers */ +DEFINE_AG_EXTENT_EVENT(xfs_refcount_find_shared); +DEFINE_AG_EXTENT_EVENT(xfs_refcount_find_shared_result); +DEFINE_AG_ERROR_EVENT(xfs_refcount_find_shared_error); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH From darrick.wong@oracle.com Thu Aug 25 18:33:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 861BB7CBC for ; Thu, 25 Aug 2016 18:33:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3D5AE304043 for ; Thu, 25 Aug 2016 16:33:00 -0700 (PDT) X-ASG-Debug-ID: 1472167977-0bf8155c741e6580001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id jhIAnhvX8dBywaW3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:32:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNWrEg010313 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:32:53 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNWrYo029853 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:32:53 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNWq9G015505; Thu, 25 Aug 2016 23:32:52 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:51 -0700 Subject: [PATCH 08/71] xfs: introduce refcount btree definitions From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/71] xfs: introduce refcount btree definitions To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:50 -0700 Message-ID: <147216797030.867.2576348201175433862.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167978 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9395 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add new per-AG refcount btree definitions to the per-AG structures. v2: Move the reflink inode flag out of the way of the DAX flag, and add the new cowextsize flag. v3: Don't allow pNFS to export reflinked files; this will be removed some day when the Linux pNFS server supports it. [hch: don't allow pNFS export of reflinked files] [darrick: fix the feature test in hch's patch] Signed-off-by: Darrick J. Wong Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_alloc.c | 5 +++++ fs/xfs/libxfs/xfs_btree.c | 5 +++-- fs/xfs/libxfs/xfs_btree.h | 3 +++ fs/xfs/libxfs/xfs_format.h | 31 +++++++++++++++++++++++++++---- fs/xfs/libxfs/xfs_rmap_btree.c | 7 +++++-- fs/xfs/libxfs/xfs_types.h | 2 +- fs/xfs/xfs_inode.h | 5 +++++ fs/xfs/xfs_mount.h | 3 +++ fs/xfs/xfs_pnfs.c | 7 +++++++ 9 files changed, 59 insertions(+), 9 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 2f58277..1a7e46f 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2457,6 +2457,10 @@ xfs_agf_verify( be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length)) return false; + if (xfs_sb_version_hasreflink(&mp->m_sb) && + be32_to_cpu(agf->agf_refcount_level) > XFS_BTREE_MAXLEVELS) + return false; + return true;; } @@ -2577,6 +2581,7 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); pag->pagf_levels[XFS_BTNUM_RMAPi] = be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAPi]); + pag->pagf_refcount_level = be32_to_cpu(agf->agf_refcount_level); spin_lock_init(&pag->pagb_lock); pag->pagb_count = 0; #ifdef __KERNEL__ diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 3dfb541..e860002 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -45,9 +45,10 @@ kmem_zone_t *xfs_btree_cur_zone; */ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, 0, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, - XFS_FIBT_MAGIC }, + XFS_FIBT_MAGIC, 0 }, { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, XFS_RMAP_CRC_MAGIC, - XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC } + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC, + XFS_REFC_CRC_MAGIC } }; #define xfs_btree_magic(cur) \ xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index be4a0c1..cd54a5b 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -72,6 +72,7 @@ union xfs_btree_rec { #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) #define XFS_BTNUM_FINO ((xfs_btnum_t)XFS_BTNUM_FINOi) #define XFS_BTNUM_RMAP ((xfs_btnum_t)XFS_BTNUM_RMAPi) +#define XFS_BTNUM_REFC ((xfs_btnum_t)XFS_BTNUM_REFCi) /* * For logging record fields. @@ -105,6 +106,7 @@ do { \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(__mp, ibt, stat); break; \ case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(__mp, fibt, stat); break; \ case XFS_BTNUM_RMAP: __XFS_BTREE_STATS_INC(__mp, rmap, stat); break; \ + case XFS_BTNUM_REFC: break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ } \ } while (0) @@ -127,6 +129,7 @@ do { \ __XFS_BTREE_STATS_ADD(__mp, fibt, stat, val); break; \ case XFS_BTNUM_RMAP: \ __XFS_BTREE_STATS_ADD(__mp, rmap, stat, val); break; \ + case XFS_BTNUM_REFC: break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 74dabd0..9fdc86c 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -456,6 +456,7 @@ xfs_sb_has_compat_feature( #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ #define XFS_SB_FEAT_RO_COMPAT_RMAPBT (1 << 1) /* reverse map btree */ +#define XFS_SB_FEAT_RO_COMPAT_REFLINK (1 << 2) /* reflinked files */ #define XFS_SB_FEAT_RO_COMPAT_ALL \ (XFS_SB_FEAT_RO_COMPAT_FINOBT | \ XFS_SB_FEAT_RO_COMPAT_RMAPBT) @@ -546,6 +547,12 @@ static inline bool xfs_sb_version_hasrmapbt(struct xfs_sb *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT); } +static inline bool xfs_sb_version_hasreflink(struct xfs_sb *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && + (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_REFLINK); +} + /* * end of superblock version macros */ @@ -641,14 +648,17 @@ typedef struct xfs_agf { uuid_t agf_uuid; /* uuid of filesystem */ __be32 agf_rmap_blocks; /* rmapbt blocks used */ - __be32 agf_padding; /* padding */ + __be32 agf_refcount_blocks; /* refcountbt blocks used */ + + __be32 agf_refcount_root; /* refcount tree root block */ + __be32 agf_refcount_level; /* refcount btree levels */ /* * reserve some contiguous space for future logged fields before we add * the unlogged fields. This makes the range logging via flags and * structure offsets much simpler. */ - __be64 agf_spare64[15]; + __be64 agf_spare64[14]; /* unlogged fields, written during buffer writeback. */ __be64 agf_lsn; /* last write sequence */ @@ -1040,9 +1050,14 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) * 16 bits of the XFS_XFLAG_s range. */ #define XFS_DIFLAG2_DAX_BIT 0 /* use DAX for this inode */ +#define XFS_DIFLAG2_REFLINK_BIT 1 /* file's blocks may be shared */ +#define XFS_DIFLAG2_COWEXTSIZE_BIT 2 /* copy on write extent size hint */ #define XFS_DIFLAG2_DAX (1 << XFS_DIFLAG2_DAX_BIT) +#define XFS_DIFLAG2_REFLINK (1 << XFS_DIFLAG2_REFLINK_BIT) +#define XFS_DIFLAG2_COWEXTSIZE (1 << XFS_DIFLAG2_COWEXTSIZE_BIT) -#define XFS_DIFLAG2_ANY (XFS_DIFLAG2_DAX) +#define XFS_DIFLAG2_ANY \ + (XFS_DIFLAG2_DAX | XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE) /* * Inode number format: @@ -1352,7 +1367,8 @@ struct xfs_owner_info { #define XFS_RMAP_OWN_AG (-5ULL) /* AG freespace btree blocks */ #define XFS_RMAP_OWN_INOBT (-6ULL) /* Inode btree blocks */ #define XFS_RMAP_OWN_INODES (-7ULL) /* Inode chunk */ -#define XFS_RMAP_OWN_MIN (-8ULL) /* guard */ +#define XFS_RMAP_OWN_REFC (-8ULL) /* refcount tree */ +#define XFS_RMAP_OWN_MIN (-9ULL) /* guard */ #define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63))) @@ -1433,6 +1449,13 @@ typedef __be32 xfs_rmap_ptr_t; XFS_IBT_BLOCK(mp) + 1) /* + * Reference Count Btree format definitions + * + */ +#define XFS_REFC_CRC_MAGIC 0x52334643 /* 'R3FC' */ + + +/* * BMAP Btree format definitions * * This includes both the root block definition that sits inside an inode fork diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c index 17b8eeb..7834956 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.c +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -512,6 +512,9 @@ void xfs_rmapbt_compute_maxlevels( struct xfs_mount *mp) { - mp->m_rmap_maxlevels = xfs_btree_compute_maxlevels(mp, - mp->m_rmap_mnr, mp->m_sb.sb_agblocks); + if (xfs_sb_version_hasreflink(&mp->m_sb)) + mp->m_rmap_maxlevels = XFS_BTREE_MAXLEVELS; + else + mp->m_rmap_maxlevels = xfs_btree_compute_maxlevels(mp, + mp->m_rmap_mnr, mp->m_sb.sb_agblocks); } diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index da87796..690d616 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -112,7 +112,7 @@ typedef enum { typedef enum { XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_RMAPi, XFS_BTNUM_BMAPi, - XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_MAX + XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_REFCi, XFS_BTNUM_MAX } xfs_btnum_t; struct xfs_name { diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index e1a411e..4094f2c 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -202,6 +202,11 @@ xfs_get_initial_prid(struct xfs_inode *dp) return XFS_PROJID_DEFAULT; } +static inline bool xfs_is_reflink_inode(struct xfs_inode *ip) +{ + return ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK; +} + /* * In-core inode flags. */ diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a3c2e2d..6141d68 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -393,6 +393,9 @@ typedef struct xfs_perag { struct xfs_ag_resv pag_meta_resv; /* Blocks reserved for just AGFL-based metadata. */ struct xfs_ag_resv pag_agfl_resv; + + /* reference count */ + __uint8_t pagf_refcount_level; } xfs_perag_t; static inline struct xfs_ag_resv * diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index 0f14b2e..93a7aaf 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -114,6 +114,13 @@ xfs_fs_map_blocks( return -ENXIO; /* + * The pNFS block layout spec actually supports reflink like + * functionality, but the Linux pNFS server doesn't implement it yet. + */ + if (xfs_is_reflink_inode(ip)) + return -ENXIO; + + /* * Lock out any other I/O before we flush and invalidate the pagecache, * and then hand out a layout to the remote system. This is very * similar to direct I/O, except that the synchronization is much more From darrick.wong@oracle.com Thu Aug 25 18:33:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 258C67CBC for ; Thu, 25 Aug 2016 18:33:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E7A8C8F8033 for ; Thu, 25 Aug 2016 16:33:01 -0700 (PDT) X-ASG-Debug-ID: 1472167980-0bf57c55b31c7680001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id T3ArKUxPItQt9fp4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNWxlv017479 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:59 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNWwOB003069 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:32:58 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNWwfS027037; Thu, 25 Aug 2016 23:32:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:32:58 -0700 Subject: [PATCH 09/71] xfs: add refcount btree stats infrastructure From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/71] xfs: add refcount btree stats infrastructure To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:32:56 -0700 Message-ID: <147216797669.867.2688861926901884645.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167980 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2942 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The refcount btree presents the same stats as the other btrees, so add all the code for that now. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.h | 5 +++-- fs/xfs/xfs_stats.c | 1 + fs/xfs/xfs_stats.h | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index cd54a5b..81ee006 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -106,7 +106,7 @@ do { \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(__mp, ibt, stat); break; \ case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(__mp, fibt, stat); break; \ case XFS_BTNUM_RMAP: __XFS_BTREE_STATS_INC(__mp, rmap, stat); break; \ - case XFS_BTNUM_REFC: break; \ + case XFS_BTNUM_REFC: __XFS_BTREE_STATS_INC(__mp, refcbt, stat); break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ } \ } while (0) @@ -129,7 +129,8 @@ do { \ __XFS_BTREE_STATS_ADD(__mp, fibt, stat, val); break; \ case XFS_BTNUM_RMAP: \ __XFS_BTREE_STATS_ADD(__mp, rmap, stat, val); break; \ - case XFS_BTNUM_REFC: break; \ + case XFS_BTNUM_REFC: \ + __XFS_BTREE_STATS_ADD(__mp, refcbt, stat, val); break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/fs/xfs/xfs_stats.c b/fs/xfs/xfs_stats.c index 6e812fe0..12d48cd 100644 --- a/fs/xfs/xfs_stats.c +++ b/fs/xfs/xfs_stats.c @@ -62,6 +62,7 @@ int xfs_stats_format(struct xfsstats __percpu *stats, char *buf) { "ibt2", XFSSTAT_END_IBT_V2 }, { "fibt2", XFSSTAT_END_FIBT_V2 }, { "rmapbt", XFSSTAT_END_RMAP_V2 }, + { "refcntbt", XFSSTAT_END_REFCOUNT }, /* we print both series of quota information together */ { "qm", XFSSTAT_END_QM }, }; diff --git a/fs/xfs/xfs_stats.h b/fs/xfs/xfs_stats.h index 657865f..79ad2e6 100644 --- a/fs/xfs/xfs_stats.h +++ b/fs/xfs/xfs_stats.h @@ -213,7 +213,23 @@ struct xfsstats { __uint32_t xs_rmap_2_alloc; __uint32_t xs_rmap_2_free; __uint32_t xs_rmap_2_moves; -#define XFSSTAT_END_XQMSTAT (XFSSTAT_END_RMAP_V2+6) +#define XFSSTAT_END_REFCOUNT (XFSSTAT_END_RMAP_V2 + 15) + __uint32_t xs_refcbt_2_lookup; + __uint32_t xs_refcbt_2_compare; + __uint32_t xs_refcbt_2_insrec; + __uint32_t xs_refcbt_2_delrec; + __uint32_t xs_refcbt_2_newroot; + __uint32_t xs_refcbt_2_killroot; + __uint32_t xs_refcbt_2_increment; + __uint32_t xs_refcbt_2_decrement; + __uint32_t xs_refcbt_2_lshift; + __uint32_t xs_refcbt_2_rshift; + __uint32_t xs_refcbt_2_split; + __uint32_t xs_refcbt_2_join; + __uint32_t xs_refcbt_2_alloc; + __uint32_t xs_refcbt_2_free; + __uint32_t xs_refcbt_2_moves; +#define XFSSTAT_END_XQMSTAT (XFSSTAT_END_REFCOUNT + 6) __uint32_t xs_qm_dqreclaims; __uint32_t xs_qm_dqreclaim_misses; __uint32_t xs_qm_dquot_dups; From darrick.wong@oracle.com Thu Aug 25 18:33:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8A1AD7CF6 for ; Thu, 25 Aug 2016 18:33:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 593848F8033 for ; Thu, 25 Aug 2016 16:33:12 -0700 (PDT) X-ASG-Debug-ID: 1472167990-0bf57c55b31c76a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id tEFXUttWAZAzj27D (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:11 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNX9Me010934 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:10 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNX9es012400 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:09 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNX4vR013530; Thu, 25 Aug 2016 23:33:08 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:04 -0700 Subject: [PATCH 10/71] xfs: refcount btree add more reserved blocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/71] xfs: refcount btree add more reserved blocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:02 -0700 Message-ID: <147216798287.867.16925106074929270380.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167991 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1645 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since XFS reserves a small amount of space in each AG as the minimum free space needed for an operation, save some more space in case we touch the refcount btree. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 13 +++++++++++++ fs/xfs/libxfs/xfs_format.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 1a7e46f..845d747 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -52,10 +52,23 @@ STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); +unsigned int +xfs_refc_block( + struct xfs_mount *mp) +{ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + return XFS_RMAP_BLOCK(mp) + 1; + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + return XFS_FIBT_BLOCK(mp) + 1; + return XFS_IBT_BLOCK(mp) + 1; +} + xfs_extlen_t xfs_prealloc_blocks( struct xfs_mount *mp) { + if (xfs_sb_version_hasreflink(&mp->m_sb)) + return xfs_refc_block(mp) + 1; if (xfs_sb_version_hasrmapbt(&mp->m_sb)) return XFS_RMAP_BLOCK(mp) + 1; if (xfs_sb_version_hasfinobt(&mp->m_sb)) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 9fdc86c..fbcd99f 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1454,6 +1454,8 @@ typedef __be32 xfs_rmap_ptr_t; */ #define XFS_REFC_CRC_MAGIC 0x52334643 /* 'R3FC' */ +unsigned int xfs_refc_block(struct xfs_mount *mp); + /* * BMAP Btree format definitions From darrick.wong@oracle.com Thu Aug 25 18:33:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D03897CBC for ; Thu, 25 Aug 2016 18:33:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 370DAAC004 for ; Thu, 25 Aug 2016 16:33:19 -0700 (PDT) X-ASG-Debug-ID: 1472167995-0bf57b53132091d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id OR0GKVH3UmZwSHsU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:16 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNXCf6017884 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:12 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXBba012480 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:11 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXANu013543; Thu, 25 Aug 2016 23:33:11 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:10 -0700 Subject: [PATCH 11/71] xfs: define the on-disk refcount btree format From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/71] xfs: define the on-disk refcount btree format To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:09 -0700 Message-ID: <147216798906.867.6348942755846510156.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472167996 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 18616 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Start constructing the refcount btree implementation by establishing the on-disk format and everything needed to read, write, and manipulate the refcount btree blocks. v2: Calculate a separate maxlevels for the refcount btree. v3: Enable the tracking of per-cursor stats for refcount btrees. The refcount update code will use this to guess if it's time to split a refcountbt update across two transactions to avoid exhausing the transaction reservation. xfs_refcountbt_init_cursor can be called under the ilock, so use KM_NOFS to prevent fs activity with a lock held. This should shut up some of the lockdep warnings. Signed-off-by: Darrick J. Wong [hch: allocate the cursor with KM_NOFS to quiet lockdep] Signed-off-by: Christoph Hellwig --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_btree.c | 3 + fs/xfs/libxfs/xfs_btree.h | 12 ++ fs/xfs/libxfs/xfs_format.h | 32 ++++++ fs/xfs/libxfs/xfs_refcount_btree.c | 178 ++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_refcount_btree.h | 67 ++++++++++++++ fs/xfs/libxfs/xfs_sb.c | 9 ++ fs/xfs/libxfs/xfs_shared.h | 2 fs/xfs/libxfs/xfs_trans_resv.c | 2 fs/xfs/libxfs/xfs_trans_resv.h | 1 fs/xfs/xfs_mount.c | 2 fs/xfs/xfs_mount.h | 3 + fs/xfs/xfs_ondisk.h | 3 + fs/xfs/xfs_trace.h | 11 -- 14 files changed, 315 insertions(+), 11 deletions(-) create mode 100644 fs/xfs/libxfs/xfs_refcount_btree.c create mode 100644 fs/xfs/libxfs/xfs_refcount_btree.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 584e87e..8d749f2 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -55,6 +55,7 @@ xfs-y += $(addprefix libxfs/, \ xfs_ag_resv.o \ xfs_rmap.o \ xfs_rmap_btree.o \ + xfs_refcount_btree.o \ xfs_sb.o \ xfs_symlink_remote.o \ xfs_trans_resv.o \ diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index e860002..2552c03 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -1217,6 +1217,9 @@ xfs_btree_set_refs( case XFS_BTNUM_RMAP: xfs_buf_set_ref(bp, XFS_RMAP_BTREE_REF); break; + case XFS_BTNUM_REFC: + xfs_buf_set_ref(bp, XFS_REFC_BTREE_REF); + break; default: ASSERT(0); } diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 81ee006..eb20376 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -49,6 +49,7 @@ union xfs_btree_key { struct xfs_inobt_key inobt; struct xfs_rmap_key rmap; struct xfs_rmap_key __rmap_bigkey[2]; + struct xfs_refcount_key refc; }; union xfs_btree_rec { @@ -57,6 +58,7 @@ union xfs_btree_rec { struct xfs_alloc_rec alloc; struct xfs_inobt_rec inobt; struct xfs_rmap_rec rmap; + struct xfs_refcount_rec refc; }; /* @@ -221,6 +223,15 @@ union xfs_btree_irec { struct xfs_bmbt_irec b; struct xfs_inobt_rec_incore i; struct xfs_rmap_irec r; + struct xfs_refcount_irec rc; +}; + +/* Per-AG btree private information. */ +union xfs_btree_cur_private { + struct { + unsigned long nr_ops; /* # record updates */ + int shape_changes; /* # of extent splits */ + } refc; }; /* @@ -247,6 +258,7 @@ typedef struct xfs_btree_cur struct xfs_buf *agbp; /* agf/agi buffer pointer */ struct xfs_defer_ops *dfops; /* deferred updates */ xfs_agnumber_t agno; /* ag number */ + union xfs_btree_cur_private priv; } a; struct { /* needed for BMAP */ struct xfs_inode *ip; /* pointer to our inode */ diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index fbcd99f..f8b3c1d 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1456,6 +1456,38 @@ typedef __be32 xfs_rmap_ptr_t; unsigned int xfs_refc_block(struct xfs_mount *mp); +/* + * Data record/key structure + * + * Each record associates a range of physical blocks (starting at + * rc_startblock and ending rc_blockcount blocks later) with a + * reference count (rc_refcount). A record is only stored in the + * btree if the refcount is > 2. An entry in the free block btree + * means that the refcount is 0, and no entries anywhere means that + * the refcount is 1, as was true in XFS before reflinking. + */ +struct xfs_refcount_rec { + __be32 rc_startblock; /* starting block number */ + __be32 rc_blockcount; /* count of blocks */ + __be32 rc_refcount; /* number of inodes linked here */ +}; + +struct xfs_refcount_key { + __be32 rc_startblock; /* starting block number */ +}; + +struct xfs_refcount_irec { + xfs_agblock_t rc_startblock; /* starting block number */ + xfs_extlen_t rc_blockcount; /* count of free blocks */ + xfs_nlink_t rc_refcount; /* number of inodes linked here */ +}; + +#define MAXREFCOUNT ((xfs_nlink_t)~0U) +#define MAXREFCEXTLEN ((xfs_extlen_t)~0U) + +/* btree pointer type */ +typedef __be32 xfs_refcount_ptr_t; + /* * BMAP Btree format definitions diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c new file mode 100644 index 0000000..359cf0c --- /dev/null +++ b/fs/xfs/libxfs/xfs_refcount_btree.c @@ -0,0 +1,178 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_btree.h" +#include "xfs_bmap.h" +#include "xfs_refcount_btree.h" +#include "xfs_alloc.h" +#include "xfs_error.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_trans.h" +#include "xfs_bit.h" + +static struct xfs_btree_cur * +xfs_refcountbt_dup_cursor( + struct xfs_btree_cur *cur) +{ + return xfs_refcountbt_init_cursor(cur->bc_mp, cur->bc_tp, + cur->bc_private.a.agbp, cur->bc_private.a.agno, + cur->bc_private.a.dfops); +} + +STATIC bool +xfs_refcountbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag = bp->b_pag; + unsigned int level; + + if (block->bb_magic != cpu_to_be32(XFS_REFC_CRC_MAGIC)) + return false; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return false; + if (!xfs_btree_sblock_v5hdr_verify(bp)) + return false; + + level = be16_to_cpu(block->bb_level); + if (pag && pag->pagf_init) { + if (level >= pag->pagf_refcount_level) + return false; + } else if (level >= mp->m_refc_maxlevels) + return false; + + return xfs_btree_sblock_verify(bp, mp->m_refc_mxr[level != 0]); +} + +STATIC void +xfs_refcountbt_read_verify( + struct xfs_buf *bp) +{ + if (!xfs_btree_sblock_verify_crc(bp)) + xfs_buf_ioerror(bp, -EFSBADCRC); + else if (!xfs_refcountbt_verify(bp)) + xfs_buf_ioerror(bp, -EFSCORRUPTED); + + if (bp->b_error) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_verifier_error(bp); + } +} + +STATIC void +xfs_refcountbt_write_verify( + struct xfs_buf *bp) +{ + if (!xfs_refcountbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_buf_ioerror(bp, -EFSCORRUPTED); + xfs_verifier_error(bp); + return; + } + xfs_btree_sblock_calc_crc(bp); + +} + +const struct xfs_buf_ops xfs_refcountbt_buf_ops = { + .name = "xfs_refcountbt", + .verify_read = xfs_refcountbt_read_verify, + .verify_write = xfs_refcountbt_write_verify, +}; + +static const struct xfs_btree_ops xfs_refcountbt_ops = { + .rec_len = sizeof(struct xfs_refcount_rec), + .key_len = sizeof(struct xfs_refcount_key), + + .dup_cursor = xfs_refcountbt_dup_cursor, + .buf_ops = &xfs_refcountbt_buf_ops, +}; + +/* + * Allocate a new refcount btree cursor. + */ +struct xfs_btree_cur * +xfs_refcountbt_init_cursor( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agnumber_t agno, + struct xfs_defer_ops *dfops) +{ + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + struct xfs_btree_cur *cur; + + ASSERT(agno != NULLAGNUMBER); + ASSERT(agno < mp->m_sb.sb_agcount); + cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_NOFS); + + cur->bc_tp = tp; + cur->bc_mp = mp; + cur->bc_btnum = XFS_BTNUM_REFC; + cur->bc_blocklog = mp->m_sb.sb_blocklog; + cur->bc_ops = &xfs_refcountbt_ops; + + cur->bc_nlevels = be32_to_cpu(agf->agf_refcount_level); + + cur->bc_private.a.agbp = agbp; + cur->bc_private.a.agno = agno; + cur->bc_private.a.dfops = dfops; + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; + + cur->bc_private.a.priv.refc.nr_ops = 0; + cur->bc_private.a.priv.refc.shape_changes = 0; + + return cur; +} + +/* + * Calculate the number of records in a refcount btree block. + */ +int +xfs_refcountbt_maxrecs( + struct xfs_mount *mp, + int blocklen, + bool leaf) +{ + blocklen -= XFS_REFCOUNT_BLOCK_LEN; + + if (leaf) + return blocklen / sizeof(struct xfs_refcount_rec); + return blocklen / (sizeof(struct xfs_refcount_key) + + sizeof(xfs_refcount_ptr_t)); +} + +/* Compute the maximum height of a refcount btree. */ +void +xfs_refcountbt_compute_maxlevels( + struct xfs_mount *mp) +{ + mp->m_refc_maxlevels = xfs_btree_compute_maxlevels(mp, + mp->m_refc_mnr, mp->m_sb.sb_agblocks); +} diff --git a/fs/xfs/libxfs/xfs_refcount_btree.h b/fs/xfs/libxfs/xfs_refcount_btree.h new file mode 100644 index 0000000..9e9ad7c --- /dev/null +++ b/fs/xfs/libxfs/xfs_refcount_btree.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_REFCOUNT_BTREE_H__ +#define __XFS_REFCOUNT_BTREE_H__ + +/* + * Reference Count Btree on-disk structures + */ + +struct xfs_buf; +struct xfs_btree_cur; +struct xfs_mount; + +/* + * Btree block header size + */ +#define XFS_REFCOUNT_BLOCK_LEN XFS_BTREE_SBLOCK_CRC_LEN + +/* + * Record, key, and pointer address macros for btree blocks. + * + * (note that some of these may appear unused, but they are used in userspace) + */ +#define XFS_REFCOUNT_REC_ADDR(block, index) \ + ((struct xfs_refcount_rec *) \ + ((char *)(block) + \ + XFS_REFCOUNT_BLOCK_LEN + \ + (((index) - 1) * sizeof(struct xfs_refcount_rec)))) + +#define XFS_REFCOUNT_KEY_ADDR(block, index) \ + ((struct xfs_refcount_key *) \ + ((char *)(block) + \ + XFS_REFCOUNT_BLOCK_LEN + \ + ((index) - 1) * sizeof(struct xfs_refcount_key))) + +#define XFS_REFCOUNT_PTR_ADDR(block, index, maxrecs) \ + ((xfs_refcount_ptr_t *) \ + ((char *)(block) + \ + XFS_REFCOUNT_BLOCK_LEN + \ + (maxrecs) * sizeof(struct xfs_refcount_key) + \ + ((index) - 1) * sizeof(xfs_refcount_ptr_t))) + +extern struct xfs_btree_cur *xfs_refcountbt_init_cursor(struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_buf *agbp, xfs_agnumber_t agno, + struct xfs_defer_ops *dfops); +extern int xfs_refcountbt_maxrecs(struct xfs_mount *mp, int blocklen, + bool leaf); +extern void xfs_refcountbt_compute_maxlevels(struct xfs_mount *mp); + +#endif /* __XFS_REFCOUNT_BTREE_H__ */ diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 59c9f59..a937071 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -38,6 +38,8 @@ #include "xfs_ialloc_btree.h" #include "xfs_log.h" #include "xfs_rmap_btree.h" +#include "xfs_bmap.h" +#include "xfs_refcount_btree.h" /* * Physical superblock buffer manipulations. Shared with libxfs in userspace. @@ -740,6 +742,13 @@ xfs_sb_mount_common( mp->m_rmap_mnr[0] = mp->m_rmap_mxr[0] / 2; mp->m_rmap_mnr[1] = mp->m_rmap_mxr[1] / 2; + mp->m_refc_mxr[0] = xfs_refcountbt_maxrecs(mp, sbp->sb_blocksize, + true); + mp->m_refc_mxr[1] = xfs_refcountbt_maxrecs(mp, sbp->sb_blocksize, + false); + mp->m_refc_mnr[0] = mp->m_refc_mxr[0] / 2; + mp->m_refc_mnr[1] = mp->m_refc_mxr[1] / 2; + mp->m_bsize = XFS_FSB_TO_BB(mp, 1); mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, sbp->sb_inopblock); diff --git a/fs/xfs/libxfs/xfs_shared.h b/fs/xfs/libxfs/xfs_shared.h index 0c5b30b..c6f4eb4 100644 --- a/fs/xfs/libxfs/xfs_shared.h +++ b/fs/xfs/libxfs/xfs_shared.h @@ -39,6 +39,7 @@ extern const struct xfs_buf_ops xfs_agf_buf_ops; extern const struct xfs_buf_ops xfs_agfl_buf_ops; extern const struct xfs_buf_ops xfs_allocbt_buf_ops; extern const struct xfs_buf_ops xfs_rmapbt_buf_ops; +extern const struct xfs_buf_ops xfs_refcountbt_buf_ops; extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; extern const struct xfs_buf_ops xfs_bmbt_buf_ops; @@ -122,6 +123,7 @@ int xfs_log_calc_minimum_size(struct xfs_mount *); #define XFS_INO_REF 2 #define XFS_ATTR_BTREE_REF 1 #define XFS_DQUOT_REF 1 +#define XFS_REFC_BTREE_REF 1 /* * Flags for xfs_trans_ichgtime(). diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c index 301ef2f..7c840e1 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.c +++ b/fs/xfs/libxfs/xfs_trans_resv.c @@ -73,7 +73,7 @@ xfs_calc_buf_res( * * Keep in mind that max depth is calculated separately for each type of tree. */ -static uint +uint xfs_allocfree_log_count( struct xfs_mount *mp, uint num_ops) diff --git a/fs/xfs/libxfs/xfs_trans_resv.h b/fs/xfs/libxfs/xfs_trans_resv.h index 0eb46ed..36a1511 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.h +++ b/fs/xfs/libxfs/xfs_trans_resv.h @@ -102,5 +102,6 @@ struct xfs_trans_resv { #define XFS_ATTRRM_LOG_COUNT 3 void xfs_trans_resv_calc(struct xfs_mount *mp, struct xfs_trans_resv *resp); +uint xfs_allocfree_log_count(struct xfs_mount *mp, uint num_ops); #endif /* __XFS_TRANS_RESV_H__ */ diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index faeead6..d556731 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -43,6 +43,7 @@ #include "xfs_icache.h" #include "xfs_sysfs.h" #include "xfs_rmap_btree.h" +#include "xfs_refcount_btree.h" static DEFINE_MUTEX(xfs_uuid_table_mutex); @@ -684,6 +685,7 @@ xfs_mountfs( xfs_bmap_compute_maxlevels(mp, XFS_ATTR_FORK); xfs_ialloc_compute_maxlevels(mp); xfs_rmapbt_compute_maxlevels(mp); + xfs_refcountbt_compute_maxlevels(mp); xfs_set_maxicount(mp); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 6141d68..1572388 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -118,10 +118,13 @@ typedef struct xfs_mount { uint m_inobt_mnr[2]; /* min inobt btree records */ uint m_rmap_mxr[2]; /* max rmap btree records */ uint m_rmap_mnr[2]; /* min rmap btree records */ + uint m_refc_mxr[2]; /* max refc btree records */ + uint m_refc_mnr[2]; /* min refc btree records */ uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* max inobt btree levels. */ uint m_rmap_maxlevels; /* max rmap btree levels */ + uint m_refc_maxlevels; /* max refcount btree level */ xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ uint m_alloc_set_aside; /* space we can't use */ uint m_ag_max_usable; /* max space per AG */ diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h index 69e2986..0c381d7 100644 --- a/fs/xfs/xfs_ondisk.h +++ b/fs/xfs/xfs_ondisk.h @@ -49,6 +49,8 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr, 56); XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key, 4); XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec, 16); + XFS_CHECK_STRUCT_SIZE(struct xfs_refcount_key, 4); + XFS_CHECK_STRUCT_SIZE(struct xfs_refcount_rec, 12); XFS_CHECK_STRUCT_SIZE(struct xfs_rmap_key, 20); XFS_CHECK_STRUCT_SIZE(struct xfs_rmap_rec, 24); XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp, 8); @@ -56,6 +58,7 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t, 4); XFS_CHECK_STRUCT_SIZE(xfs_alloc_rec_t, 8); XFS_CHECK_STRUCT_SIZE(xfs_inobt_ptr_t, 4); + XFS_CHECK_STRUCT_SIZE(xfs_refcount_ptr_t, 4); XFS_CHECK_STRUCT_SIZE(xfs_rmap_ptr_t, 4); /* dir/attr trees */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 148afc6..6297bc0 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -39,16 +39,7 @@ struct xfs_buf_log_format; struct xfs_inode_log_format; struct xfs_bmbt_irec; struct xfs_btree_cur; - -#ifndef XFS_REFCOUNT_IREC_PLACEHOLDER -#define XFS_REFCOUNT_IREC_PLACEHOLDER -/* Placeholder definition to avoid breaking bisectability. */ -struct xfs_refcount_irec { - xfs_agblock_t rc_startblock; /* starting block number */ - xfs_extlen_t rc_blockcount; /* count of free blocks */ - xfs_nlink_t rc_refcount; /* number of inodes linked here */ -}; -#endif +struct xfs_refcount_irec; DECLARE_EVENT_CLASS(xfs_attr_list_class, TP_PROTO(struct xfs_attr_list_context *ctx), From darrick.wong@oracle.com Thu Aug 25 18:33:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7F6BF7CBC for ; Thu, 25 Aug 2016 18:33:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9FD1AC001 for ; Thu, 25 Aug 2016 16:33:21 -0700 (PDT) X-ASG-Debug-ID: 1472167999-0bf57b53112091d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 6C0c6nbrY1TCQsim (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNXIA5011015 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:18 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXHnl003600 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:17 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNXH3l027086; Thu, 25 Aug 2016 23:33:17 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:16 -0700 Subject: [PATCH 12/71] xfs: add refcount btree support to growfs From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 12/71] xfs: add refcount btree support to growfs To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:15 -0700 Message-ID: <147216799554.867.14722354534434753240.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472167999 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2019 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Modify the growfs code to initialize new refcount btree blocks. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_fsops.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 94ac06f..c2fe6bf 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -259,6 +259,11 @@ xfs_growfs_data_private( agf->agf_longest = cpu_to_be32(tmpsize); if (xfs_sb_version_hascrc(&mp->m_sb)) uuid_copy(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid); + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + agf->agf_refcount_root = cpu_to_be32( + xfs_refc_block(mp)); + agf->agf_refcount_level = cpu_to_be32(1); + } error = xfs_bwrite(bp); xfs_buf_relse(bp); @@ -450,6 +455,17 @@ xfs_growfs_data_private( rrec->rm_offset = 0; be16_add_cpu(&block->bb_numrecs, 1); + /* account for refc btree root */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + rrec = XFS_RMAP_REC_ADDR(block, 5); + rrec->rm_startblock = cpu_to_be32( + xfs_refc_block(mp)); + rrec->rm_blockcount = cpu_to_be32(1); + rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_REFC); + rrec->rm_offset = 0; + be16_add_cpu(&block->bb_numrecs, 1); + } + error = xfs_bwrite(bp); xfs_buf_relse(bp); if (error) @@ -507,6 +523,28 @@ xfs_growfs_data_private( goto error0; } + /* + * refcount btree root block + */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + bp = xfs_growfs_get_hdr_buf(mp, + XFS_AGB_TO_DADDR(mp, agno, xfs_refc_block(mp)), + BTOBB(mp->m_sb.sb_blocksize), 0, + &xfs_refcountbt_buf_ops); + if (!bp) { + error = -ENOMEM; + goto error0; + } + + xfs_btree_init_block(mp, bp, XFS_REFC_CRC_MAGIC, + 0, 0, agno, + XFS_BTREE_CRC_BLOCKS); + + error = xfs_bwrite(bp); + xfs_buf_relse(bp); + if (error) + goto error0; + } } xfs_trans_agblocks_delta(tp, nfree); /* From darrick.wong@oracle.com Thu Aug 25 18:33:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A40A77D46 for ; Thu, 25 Aug 2016 18:33:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 438508F8033 for ; Thu, 25 Aug 2016 16:33:30 -0700 (PDT) X-ASG-Debug-ID: 1472168007-0bf81509b01de610001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id aJrZI5CP61ZAlBx9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNXOMl011068 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:33:24 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNXNIH013993 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:33:24 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNXN3c027195; Thu, 25 Aug 2016 23:33:23 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:23 -0700 Subject: [PATCH 13/71] xfs: account for the refcount btree in the alloc/free log reservation From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 13/71] xfs: account for the refcount btree in the alloc/free log reservation To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:21 -0700 Message-ID: <147216800171.867.5535621294774272133.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168007 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1499 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Every time we allocate or free an extent, we might need to split the refcount btree. Reserve some blocks in the transaction to handle this possibility. (Reproduced by generic/167 over NFS atop XFS) Signed-off-by: Christoph Hellwig [darrick.wong@oracle.com: add commit message] Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_trans_resv.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c index 7c840e1..a59838f 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.c +++ b/fs/xfs/libxfs/xfs_trans_resv.c @@ -67,7 +67,8 @@ xfs_calc_buf_res( * Per-extent log reservation for the btree changes involved in freeing or * allocating an extent. In classic XFS there were two trees that will be * modified (bnobt + cntbt). With rmap enabled, there are three trees - * (rmapbt). The number of blocks reserved is based on the formula: + * (rmapbt). With reflink, there are four trees (refcountbt). The number of + * blocks reserved is based on the formula: * * num trees * ((2 blocks/level * max depth) - 1) * @@ -83,6 +84,8 @@ xfs_allocfree_log_count( blocks = num_ops * 2 * (2 * mp->m_ag_maxlevels - 1); if (xfs_sb_version_hasrmapbt(&mp->m_sb)) blocks += num_ops * (2 * mp->m_rmap_maxlevels - 1); + if (xfs_sb_version_hasreflink(&mp->m_sb)) + blocks += num_ops * (2 * mp->m_refc_maxlevels - 1); return blocks; } From darrick.wong@oracle.com Thu Aug 25 18:33:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 07AF87D46 for ; Thu, 25 Aug 2016 18:33:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B02A18F8033 for ; Thu, 25 Aug 2016 16:33:37 -0700 (PDT) X-ASG-Debug-ID: 1472168013-0bf81509b01de640001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id cgqg2dDryVWEa51r (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNXUWc018031 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:30 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXUm3003796 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:30 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXTCP013636; Thu, 25 Aug 2016 23:33:29 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:29 -0700 Subject: [PATCH 14/71] xfs: add refcount btree operations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 14/71] xfs: add refcount btree operations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:28 -0700 Message-ID: <147216800795.867.8161276170370290222.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168014 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 17387 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Implement the generic btree operations required to manipulate refcount btree blocks. The implementation is similar to the bmapbt, though it will only allocate and free blocks from the AG. v2: Remove init_rec_from_key since we no longer need it, and add tracepoints when refcount btree operations fail. Since the refcount root and level fields are separate from the existing roots and levels array, they need a separate logging flag. Signed-off-by: Darrick J. Wong [hch: fix logging of AGF refcount btree fields] Signed-off-by: Christoph Hellwig --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_alloc.c | 3 + fs/xfs/libxfs/xfs_format.h | 10 +- fs/xfs/libxfs/xfs_refcount.c | 177 +++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_refcount.h | 30 +++++ fs/xfs/libxfs/xfs_refcount_btree.c | 205 ++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_fsops.c | 1 7 files changed, 425 insertions(+), 2 deletions(-) create mode 100644 fs/xfs/libxfs/xfs_refcount.c create mode 100644 fs/xfs/libxfs/xfs_refcount.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 8d749f2..98b2427 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -55,6 +55,7 @@ xfs-y += $(addprefix libxfs/, \ xfs_ag_resv.o \ xfs_rmap.o \ xfs_rmap_btree.o \ + xfs_refcount.o \ xfs_refcount_btree.o \ xfs_sb.o \ xfs_symlink_remote.o \ diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 845d747..08ee609 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2333,6 +2333,9 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_btreeblks), offsetof(xfs_agf_t, agf_uuid), offsetof(xfs_agf_t, agf_rmap_blocks), + offsetof(xfs_agf_t, agf_refcount_blocks), + offsetof(xfs_agf_t, agf_refcount_root), + offsetof(xfs_agf_t, agf_refcount_level), /* needed so that we don't log the whole rest of the structure: */ offsetof(xfs_agf_t, agf_spare64), sizeof(xfs_agf_t) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index f8b3c1d..ab46c02 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -684,8 +684,11 @@ typedef struct xfs_agf { #define XFS_AGF_BTREEBLKS 0x00000800 #define XFS_AGF_UUID 0x00001000 #define XFS_AGF_RMAP_BLOCKS 0x00002000 -#define XFS_AGF_SPARE64 0x00004000 -#define XFS_AGF_NUM_BITS 15 +#define XFS_AGF_REFCOUNT_BLOCKS 0x00004000 +#define XFS_AGF_REFCOUNT_ROOT 0x00008000 +#define XFS_AGF_REFCOUNT_LEVEL 0x00010000 +#define XFS_AGF_SPARE64 0x00020000 +#define XFS_AGF_NUM_BITS 18 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_FLAGS \ @@ -703,6 +706,9 @@ typedef struct xfs_agf { { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ { XFS_AGF_UUID, "UUID" }, \ { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" }, \ + { XFS_AGF_REFCOUNT_BLOCKS, "REFCOUNT_BLOCKS" }, \ + { XFS_AGF_REFCOUNT_ROOT, "REFCOUNT_ROOT" }, \ + { XFS_AGF_REFCOUNT_LEVEL, "REFCOUNT_LEVEL" }, \ { XFS_AGF_SPARE64, "SPARE64" } /* disk block (xfs_daddr_t) in the AG */ diff --git a/fs/xfs/libxfs/xfs_refcount.c b/fs/xfs/libxfs/xfs_refcount.c new file mode 100644 index 0000000..de13406 --- /dev/null +++ b/fs/xfs/libxfs/xfs_refcount.c @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_btree.h" +#include "xfs_bmap.h" +#include "xfs_refcount_btree.h" +#include "xfs_alloc.h" +#include "xfs_error.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_trans.h" +#include "xfs_bit.h" +#include "xfs_refcount.h" + +/* + * Look up the first record less than or equal to [bno, len] in the btree + * given by cur. + */ +int +xfs_refcount_lookup_le( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + int *stat) +{ + trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno, + XFS_LOOKUP_LE); + cur->bc_rec.rc.rc_startblock = bno; + cur->bc_rec.rc.rc_blockcount = 0; + return xfs_btree_lookup(cur, XFS_LOOKUP_LE, stat); +} + +/* + * Look up the first record greater than or equal to [bno, len] in the btree + * given by cur. + */ +int +xfs_refcount_lookup_ge( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + int *stat) +{ + trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno, + XFS_LOOKUP_GE); + cur->bc_rec.rc.rc_startblock = bno; + cur->bc_rec.rc.rc_blockcount = 0; + return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat); +} + +/* + * Get the data from the pointed-to record. + */ +int +xfs_refcount_get_rec( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *irec, + int *stat) +{ + union xfs_btree_rec *rec; + int error; + + error = xfs_btree_get_rec(cur, &rec, stat); + if (!error && *stat == 1) { + irec->rc_startblock = be32_to_cpu(rec->refc.rc_startblock); + irec->rc_blockcount = be32_to_cpu(rec->refc.rc_blockcount); + irec->rc_refcount = be32_to_cpu(rec->refc.rc_refcount); + trace_xfs_refcount_get(cur->bc_mp, cur->bc_private.a.agno, + irec); + } + return error; +} + +/* + * Update the record referred to by cur to the value given + * by [bno, len, refcount]. + * This either works (return 0) or gets an EFSCORRUPTED error. + */ +STATIC int +xfs_refcount_update( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *irec) +{ + union xfs_btree_rec rec; + int error; + + trace_xfs_refcount_update(cur->bc_mp, cur->bc_private.a.agno, irec); + rec.refc.rc_startblock = cpu_to_be32(irec->rc_startblock); + rec.refc.rc_blockcount = cpu_to_be32(irec->rc_blockcount); + rec.refc.rc_refcount = cpu_to_be32(irec->rc_refcount); + error = xfs_btree_update(cur, &rec); + if (error) + trace_xfs_refcount_update_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Insert the record referred to by cur to the value given + * by [bno, len, refcount]. + * This either works (return 0) or gets an EFSCORRUPTED error. + */ +STATIC int +xfs_refcount_insert( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *irec, + int *i) +{ + int error; + + trace_xfs_refcount_insert(cur->bc_mp, cur->bc_private.a.agno, irec); + cur->bc_rec.rc.rc_startblock = irec->rc_startblock; + cur->bc_rec.rc.rc_blockcount = irec->rc_blockcount; + cur->bc_rec.rc.rc_refcount = irec->rc_refcount; + error = xfs_btree_insert(cur, i); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, *i == 1, out_error); +out_error: + if (error) + trace_xfs_refcount_insert_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Remove the record referred to by cur, then set the pointer to the spot + * where the record could be re-inserted, in case we want to increment or + * decrement the cursor. + * This either works (return 0) or gets an EFSCORRUPTED error. + */ +STATIC int +xfs_refcount_delete( + struct xfs_btree_cur *cur, + int *i) +{ + struct xfs_refcount_irec irec; + int found_rec; + int error; + + error = xfs_refcount_get_rec(cur, &irec, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + trace_xfs_refcount_delete(cur->bc_mp, cur->bc_private.a.agno, &irec); + error = xfs_btree_delete(cur, i); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, *i == 1, out_error); + if (error) + goto out_error; + error = xfs_refcount_lookup_ge(cur, irec.rc_startblock, &found_rec); +out_error: + if (error) + trace_xfs_refcount_delete_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} diff --git a/fs/xfs/libxfs/xfs_refcount.h b/fs/xfs/libxfs/xfs_refcount.h new file mode 100644 index 0000000..4dc335a --- /dev/null +++ b/fs/xfs/libxfs/xfs_refcount.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_REFCOUNT_H__ +#define __XFS_REFCOUNT_H__ + +extern int xfs_refcount_lookup_le(struct xfs_btree_cur *cur, + xfs_agblock_t bno, int *stat); +extern int xfs_refcount_lookup_ge(struct xfs_btree_cur *cur, + xfs_agblock_t bno, int *stat); +extern int xfs_refcount_get_rec(struct xfs_btree_cur *cur, + struct xfs_refcount_irec *irec, int *stat); + +#endif /* __XFS_REFCOUNT_H__ */ diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c index 359cf0c..26f4eb7 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.c +++ b/fs/xfs/libxfs/xfs_refcount_btree.c @@ -34,6 +34,7 @@ #include "xfs_cksum.h" #include "xfs_trans.h" #include "xfs_bit.h" +#include "xfs_rmap.h" static struct xfs_btree_cur * xfs_refcountbt_dup_cursor( @@ -44,6 +45,160 @@ xfs_refcountbt_dup_cursor( cur->bc_private.a.dfops); } +STATIC void +xfs_refcountbt_set_root( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr, + int inc) +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); + struct xfs_perag *pag = xfs_perag_get(cur->bc_mp, seqno); + + ASSERT(ptr->s != 0); + + agf->agf_refcount_root = ptr->s; + be32_add_cpu(&agf->agf_refcount_level, inc); + pag->pagf_refcount_level += inc; + xfs_perag_put(pag); + + xfs_alloc_log_agf(cur->bc_tp, agbp, + XFS_AGF_REFCOUNT_ROOT | XFS_AGF_REFCOUNT_LEVEL); +} + +STATIC int +xfs_refcountbt_alloc_block( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *start, + union xfs_btree_ptr *new, + int *stat) +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + struct xfs_alloc_arg args; /* block allocation args */ + int error; /* error return value */ + + memset(&args, 0, sizeof(args)); + args.tp = cur->bc_tp; + args.mp = cur->bc_mp; + args.type = XFS_ALLOCTYPE_NEAR_BNO; + args.fsbno = XFS_AGB_TO_FSB(cur->bc_mp, cur->bc_private.a.agno, + xfs_refc_block(args.mp)); + args.firstblock = args.fsbno; + xfs_rmap_ag_owner(&args.oinfo, XFS_RMAP_OWN_REFC); + args.minlen = args.maxlen = args.prod = 1; + + error = xfs_alloc_vextent(&args); + if (error) + goto out_error; + trace_xfs_refcountbt_alloc_block(cur->bc_mp, cur->bc_private.a.agno, + args.agbno, 1); + if (args.fsbno == NULLFSBLOCK) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 0; + return 0; + } + ASSERT(args.agno == cur->bc_private.a.agno); + ASSERT(args.len == 1); + + new->s = cpu_to_be32(args.agbno); + be32_add_cpu(&agf->agf_refcount_blocks, 1); + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); + + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 1; + return 0; + +out_error: + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; +} + +STATIC int +xfs_refcountbt_free_block( + struct xfs_btree_cur *cur, + struct xfs_buf *bp) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); + struct xfs_owner_info oinfo; + + trace_xfs_refcountbt_free_block(cur->bc_mp, cur->bc_private.a.agno, + XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1); + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_REFC); + be32_add_cpu(&agf->agf_refcount_blocks, -1); + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); + xfs_bmap_add_free(mp, cur->bc_private.a.dfops, fsbno, 1, + &oinfo); + + return 0; +} + +STATIC int +xfs_refcountbt_get_minrecs( + struct xfs_btree_cur *cur, + int level) +{ + return cur->bc_mp->m_refc_mnr[level != 0]; +} + +STATIC int +xfs_refcountbt_get_maxrecs( + struct xfs_btree_cur *cur, + int level) +{ + return cur->bc_mp->m_refc_mxr[level != 0]; +} + +STATIC void +xfs_refcountbt_init_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + ASSERT(rec->refc.rc_startblock != 0); + + key->refc.rc_startblock = rec->refc.rc_startblock; +} + +STATIC void +xfs_refcountbt_init_rec_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec) +{ + ASSERT(cur->bc_rec.rc.rc_startblock != 0); + + rec->refc.rc_startblock = cpu_to_be32(cur->bc_rec.rc.rc_startblock); + rec->refc.rc_blockcount = cpu_to_be32(cur->bc_rec.rc.rc_blockcount); + rec->refc.rc_refcount = cpu_to_be32(cur->bc_rec.rc.rc_refcount); +} + +STATIC void +xfs_refcountbt_init_ptr_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + struct xfs_agf *agf = XFS_BUF_TO_AGF(cur->bc_private.a.agbp); + + ASSERT(cur->bc_private.a.agno == be32_to_cpu(agf->agf_seqno)); + ASSERT(agf->agf_refcount_root != 0); + + ptr->s = agf->agf_refcount_root; +} + +STATIC __int64_t +xfs_refcountbt_key_diff( + struct xfs_btree_cur *cur, + union xfs_btree_key *key) +{ + struct xfs_refcount_irec *rec = &cur->bc_rec.rc; + struct xfs_refcount_key *kp = &key->refc; + + return (__int64_t)be32_to_cpu(kp->rc_startblock) - rec->rc_startblock; +} + STATIC bool xfs_refcountbt_verify( struct xfs_buf *bp) @@ -106,12 +261,62 @@ const struct xfs_buf_ops xfs_refcountbt_buf_ops = { .verify_write = xfs_refcountbt_write_verify, }; +#if defined(DEBUG) || defined(XFS_WARN) +STATIC int +xfs_refcountbt_keys_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return be32_to_cpu(k1->refc.rc_startblock) < + be32_to_cpu(k2->refc.rc_startblock); +} + +STATIC int +xfs_refcountbt_recs_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_rec *r1, + union xfs_btree_rec *r2) +{ + struct xfs_refcount_irec a, b; + + int ret = be32_to_cpu(r1->refc.rc_startblock) + + be32_to_cpu(r1->refc.rc_blockcount) <= + be32_to_cpu(r2->refc.rc_startblock); + if (!ret) { + a.rc_startblock = be32_to_cpu(r1->refc.rc_startblock); + a.rc_blockcount = be32_to_cpu(r1->refc.rc_blockcount); + a.rc_refcount = be32_to_cpu(r1->refc.rc_refcount); + b.rc_startblock = be32_to_cpu(r2->refc.rc_startblock); + b.rc_blockcount = be32_to_cpu(r2->refc.rc_blockcount); + b.rc_refcount = be32_to_cpu(r2->refc.rc_refcount); + trace_xfs_refcount_rec_order_error(cur->bc_mp, + cur->bc_private.a.agno, &a, &b); + } + + return ret; +} +#endif /* DEBUG */ + static const struct xfs_btree_ops xfs_refcountbt_ops = { .rec_len = sizeof(struct xfs_refcount_rec), .key_len = sizeof(struct xfs_refcount_key), .dup_cursor = xfs_refcountbt_dup_cursor, + .set_root = xfs_refcountbt_set_root, + .alloc_block = xfs_refcountbt_alloc_block, + .free_block = xfs_refcountbt_free_block, + .get_minrecs = xfs_refcountbt_get_minrecs, + .get_maxrecs = xfs_refcountbt_get_maxrecs, + .init_key_from_rec = xfs_refcountbt_init_key_from_rec, + .init_rec_from_cur = xfs_refcountbt_init_rec_from_cur, + .init_ptr_from_cur = xfs_refcountbt_init_ptr_from_cur, + .key_diff = xfs_refcountbt_key_diff, .buf_ops = &xfs_refcountbt_buf_ops, +#if defined(DEBUG) || defined(XFS_WARN) + .keys_inorder = xfs_refcountbt_keys_inorder, + .recs_inorder = xfs_refcountbt_recs_inorder, +#endif }; /* diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index c2fe6bf..4b4059b 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -263,6 +263,7 @@ xfs_growfs_data_private( agf->agf_refcount_root = cpu_to_be32( xfs_refc_block(mp)); agf->agf_refcount_level = cpu_to_be32(1); + agf->agf_refcount_blocks = cpu_to_be32(1); } error = xfs_bwrite(bp); From darrick.wong@oracle.com Thu Aug 25 18:33:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 44ACE7D53 for ; Thu, 25 Aug 2016 18:33:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 144508F8033 for ; Thu, 25 Aug 2016 16:33:43 -0700 (PDT) X-ASG-Debug-ID: 1472168019-0bf57c55b31c7730001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4VKPJNxnmGKx9I9c (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:40 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNXbSJ011180 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:38 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXbRu003940 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:37 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXasB028811; Thu, 25 Aug 2016 23:33:36 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:35 -0700 Subject: [PATCH 15/71] xfs: create refcount update intent log items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 15/71] xfs: create refcount update intent log items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:34 -0700 Message-ID: <147216801436.867.13017543869659604138.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168020 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 21184 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create refcount update intent/done log items to record redo information in the log. Because we need to roll transactions between updating the bmbt mapping and updating the reverse mapping, we also have to track the status of the metadata updates that will be recorded in the post-roll transactions, just in case we crash before committing the final transaction. This mechanism enables log recovery to finish what was already started. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_log_format.h | 51 +++++ fs/xfs/xfs_refcount_item.c | 423 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_refcount_item.h | 94 +++++++++ fs/xfs/xfs_super.c | 19 ++ 5 files changed, 586 insertions(+), 2 deletions(-) create mode 100644 fs/xfs/xfs_refcount_item.c create mode 100644 fs/xfs/xfs_refcount_item.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 98b2427..d6429fd 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -106,6 +106,7 @@ xfs-y += xfs_log.o \ xfs_extfree_item.o \ xfs_icreate_item.o \ xfs_inode_item.o \ + xfs_refcount_item.o \ xfs_rmap_item.o \ xfs_log_recover.o \ xfs_trans_ail.o \ diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index 96c7010..484eb06 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -112,7 +112,9 @@ static inline uint xlog_get_cycle(char *ptr) #define XLOG_REG_TYPE_ICREATE 20 #define XLOG_REG_TYPE_RUI_FORMAT 21 #define XLOG_REG_TYPE_RUD_FORMAT 22 -#define XLOG_REG_TYPE_MAX 22 +#define XLOG_REG_TYPE_CUI_FORMAT 23 +#define XLOG_REG_TYPE_CUD_FORMAT 24 +#define XLOG_REG_TYPE_MAX 24 /* * Flags to log operation header @@ -231,6 +233,8 @@ typedef struct xfs_trans_header { #define XFS_LI_ICREATE 0x123f #define XFS_LI_RUI 0x1240 /* rmap update intent */ #define XFS_LI_RUD 0x1241 +#define XFS_LI_CUI 0x1242 /* refcount update intent */ +#define XFS_LI_CUD 0x1243 #define XFS_LI_TYPE_DESC \ { XFS_LI_EFI, "XFS_LI_EFI" }, \ @@ -242,7 +246,9 @@ typedef struct xfs_trans_header { { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" }, \ { XFS_LI_ICREATE, "XFS_LI_ICREATE" }, \ { XFS_LI_RUI, "XFS_LI_RUI" }, \ - { XFS_LI_RUD, "XFS_LI_RUD" } + { XFS_LI_RUD, "XFS_LI_RUD" }, \ + { XFS_LI_CUI, "XFS_LI_CUI" }, \ + { XFS_LI_CUD, "XFS_LI_CUD" } /* * Inode Log Item Format definitions. @@ -663,6 +669,47 @@ struct xfs_rud_log_format { }; /* + * CUI/CUD (refcount update) log format definitions + */ +struct xfs_phys_extent { + __uint64_t pe_startblock; + __uint32_t pe_len; + __uint32_t pe_flags; +}; + +/* refcount pe_flags: upper bits are flags, lower byte is type code */ +#define XFS_REFCOUNT_EXTENT_INCREASE 1 +#define XFS_REFCOUNT_EXTENT_DECREASE 2 +#define XFS_REFCOUNT_EXTENT_ALLOC_COW 3 +#define XFS_REFCOUNT_EXTENT_FREE_COW 4 +#define XFS_REFCOUNT_EXTENT_TYPE_MASK 0xFF + +/* + * This is the structure used to lay out a cui log item in the + * log. The cui_extents field is a variable size array whose + * size is given by cui_nextents. + */ +struct xfs_cui_log_format { + __uint16_t cui_type; /* cui log item type */ + __uint16_t cui_size; /* size of this item */ + __uint32_t cui_nextents; /* # extents to free */ + __uint64_t cui_id; /* cui identifier */ + struct xfs_phys_extent cui_extents[1]; /* array of extents */ +}; + +/* + * This is the structure used to lay out a cud log item in the + * log. The cud_extents array is a variable size array whose + * size is given by cud_nextents; + */ +struct xfs_cud_log_format { + __uint16_t cud_type; /* cud log item type */ + __uint16_t cud_size; /* size of this item */ + __uint32_t __pad; + __uint64_t cud_cui_id; /* id of corresponding cui */ +}; + +/* * Dquot Log format definitions. * * The first two fields must be the type and size fitting into diff --git a/fs/xfs/xfs_refcount_item.c b/fs/xfs/xfs_refcount_item.c new file mode 100644 index 0000000..ca76fa2 --- /dev/null +++ b/fs/xfs/xfs_refcount_item.c @@ -0,0 +1,423 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_mount.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_buf_item.h" +#include "xfs_refcount_item.h" +#include "xfs_log.h" + + +kmem_zone_t *xfs_cui_zone; +kmem_zone_t *xfs_cud_zone; + +static inline struct xfs_cui_log_item *CUI_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_cui_log_item, cui_item); +} + +void +xfs_cui_item_free( + struct xfs_cui_log_item *cuip) +{ + if (cuip->cui_format.cui_nextents > XFS_CUI_MAX_FAST_EXTENTS) + kmem_free(cuip); + else + kmem_zone_free(xfs_cui_zone, cuip); +} + +/* + * This returns the number of iovecs needed to log the given cui item. + * We only need 1 iovec for an cui item. It just logs the cui_log_format + * structure. + */ +static inline int +xfs_cui_item_sizeof( + struct xfs_cui_log_item *cuip) +{ + return sizeof(struct xfs_cui_log_format) + + (cuip->cui_format.cui_nextents - 1) * + sizeof(struct xfs_phys_extent); +} + +STATIC void +xfs_cui_item_size( + struct xfs_log_item *lip, + int *nvecs, + int *nbytes) +{ + *nvecs += 1; + *nbytes += xfs_cui_item_sizeof(CUI_ITEM(lip)); +} + +/* + * This is called to fill in the vector of log iovecs for the + * given cui log item. We use only 1 iovec, and we point that + * at the cui_log_format structure embedded in the cui item. + * It is at this point that we assert that all of the extent + * slots in the cui item have been filled. + */ +STATIC void +xfs_cui_item_format( + struct xfs_log_item *lip, + struct xfs_log_vec *lv) +{ + struct xfs_cui_log_item *cuip = CUI_ITEM(lip); + struct xfs_log_iovec *vecp = NULL; + + ASSERT(atomic_read(&cuip->cui_next_extent) == + cuip->cui_format.cui_nextents); + + cuip->cui_format.cui_type = XFS_LI_CUI; + cuip->cui_format.cui_size = 1; + + xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_CUI_FORMAT, &cuip->cui_format, + xfs_cui_item_sizeof(cuip)); +} + +/* + * Pinning has no meaning for an cui item, so just return. + */ +STATIC void +xfs_cui_item_pin( + struct xfs_log_item *lip) +{ +} + +/* + * The unpin operation is the last place an CUI is manipulated in the log. It is + * either inserted in the AIL or aborted in the event of a log I/O error. In + * either case, the CUI transaction has been successfully committed to make it + * this far. Therefore, we expect whoever committed the CUI to either construct + * and commit the CUD or drop the CUD's reference in the event of error. Simply + * drop the log's CUI reference now that the log is done with it. + */ +STATIC void +xfs_cui_item_unpin( + struct xfs_log_item *lip, + int remove) +{ + struct xfs_cui_log_item *cuip = CUI_ITEM(lip); + + xfs_cui_release(cuip); +} + +/* + * CUI items have no locking or pushing. However, since CUIs are pulled from + * the AIL when their corresponding CUDs are committed to disk, their situation + * is very similar to being pinned. Return XFS_ITEM_PINNED so that the caller + * will eventually flush the log. This should help in getting the CUI out of + * the AIL. + */ +STATIC uint +xfs_cui_item_push( + struct xfs_log_item *lip, + struct list_head *buffer_list) +{ + return XFS_ITEM_PINNED; +} + +/* + * The CUI has been either committed or aborted if the transaction has been + * cancelled. If the transaction was cancelled, an CUD isn't going to be + * constructed and thus we free the CUI here directly. + */ +STATIC void +xfs_cui_item_unlock( + struct xfs_log_item *lip) +{ + if (lip->li_flags & XFS_LI_ABORTED) + xfs_cui_item_free(CUI_ITEM(lip)); +} + +/* + * The CUI is logged only once and cannot be moved in the log, so simply return + * the lsn at which it's been logged. + */ +STATIC xfs_lsn_t +xfs_cui_item_committed( + struct xfs_log_item *lip, + xfs_lsn_t lsn) +{ + return lsn; +} + +/* + * The CUI dependency tracking op doesn't do squat. It can't because + * it doesn't know where the free extent is coming from. The dependency + * tracking has to be handled by the "enclosing" metadata object. For + * example, for inodes, the inode is locked throughout the extent freeing + * so the dependency should be recorded there. + */ +STATIC void +xfs_cui_item_committing( + struct xfs_log_item *lip, + xfs_lsn_t lsn) +{ +} + +/* + * This is the ops vector shared by all cui log items. + */ +static const struct xfs_item_ops xfs_cui_item_ops = { + .iop_size = xfs_cui_item_size, + .iop_format = xfs_cui_item_format, + .iop_pin = xfs_cui_item_pin, + .iop_unpin = xfs_cui_item_unpin, + .iop_unlock = xfs_cui_item_unlock, + .iop_committed = xfs_cui_item_committed, + .iop_push = xfs_cui_item_push, + .iop_committing = xfs_cui_item_committing, +}; + +/* + * Allocate and initialize an cui item with the given number of extents. + */ +struct xfs_cui_log_item * +xfs_cui_init( + struct xfs_mount *mp, + uint nextents) + +{ + struct xfs_cui_log_item *cuip; + uint size; + + ASSERT(nextents > 0); + if (nextents > XFS_CUI_MAX_FAST_EXTENTS) { + size = (uint)(sizeof(struct xfs_cui_log_item) + + ((nextents - 1) * sizeof(struct xfs_phys_extent))); + cuip = kmem_zalloc(size, KM_SLEEP); + } else { + cuip = kmem_zone_zalloc(xfs_cui_zone, KM_SLEEP); + } + + xfs_log_item_init(mp, &cuip->cui_item, XFS_LI_CUI, &xfs_cui_item_ops); + cuip->cui_format.cui_nextents = nextents; + cuip->cui_format.cui_id = (uintptr_t)(void *)cuip; + atomic_set(&cuip->cui_next_extent, 0); + atomic_set(&cuip->cui_refcount, 2); + + return cuip; +} + +/* + * Copy an CUI format buffer from the given buf, and into the destination + * CUI format structure. The CUI/CUD items were designed not to need any + * special alignment handling. + */ +int +xfs_cui_copy_format( + struct xfs_log_iovec *buf, + struct xfs_cui_log_format *dst_cui_fmt) +{ + struct xfs_cui_log_format *src_cui_fmt; + uint len; + + src_cui_fmt = buf->i_addr; + len = sizeof(struct xfs_cui_log_format) + + (src_cui_fmt->cui_nextents - 1) * + sizeof(struct xfs_phys_extent); + + if (buf->i_len == len) { + memcpy((char *)dst_cui_fmt, (char *)src_cui_fmt, len); + return 0; + } + return -EFSCORRUPTED; +} + +/* + * Freeing the CUI requires that we remove it from the AIL if it has already + * been placed there. However, the CUI may not yet have been placed in the AIL + * when called by xfs_cui_release() from CUD processing due to the ordering of + * committed vs unpin operations in bulk insert operations. Hence the reference + * count to ensure only the last caller frees the CUI. + */ +void +xfs_cui_release( + struct xfs_cui_log_item *cuip) +{ + if (atomic_dec_and_test(&cuip->cui_refcount)) { + xfs_trans_ail_remove(&cuip->cui_item, SHUTDOWN_LOG_IO_ERROR); + xfs_cui_item_free(cuip); + } +} + +static inline struct xfs_cud_log_item *CUD_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_cud_log_item, cud_item); +} + +STATIC void +xfs_cud_item_size( + struct xfs_log_item *lip, + int *nvecs, + int *nbytes) +{ + *nvecs += 1; + *nbytes += sizeof(struct xfs_cud_log_format); +} + +/* + * This is called to fill in the vector of log iovecs for the + * given cud log item. We use only 1 iovec, and we point that + * at the cud_log_format structure embedded in the cud item. + * It is at this point that we assert that all of the extent + * slots in the cud item have been filled. + */ +STATIC void +xfs_cud_item_format( + struct xfs_log_item *lip, + struct xfs_log_vec *lv) +{ + struct xfs_cud_log_item *cudp = CUD_ITEM(lip); + struct xfs_log_iovec *vecp = NULL; + + cudp->cud_format.cud_type = XFS_LI_CUD; + cudp->cud_format.cud_size = 1; + + xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_CUD_FORMAT, &cudp->cud_format, + sizeof(struct xfs_rud_log_format)); +} + +/* + * Pinning has no meaning for an cud item, so just return. + */ +STATIC void +xfs_cud_item_pin( + struct xfs_log_item *lip) +{ +} + +/* + * Since pinning has no meaning for an cud item, unpinning does + * not either. + */ +STATIC void +xfs_cud_item_unpin( + struct xfs_log_item *lip, + int remove) +{ +} + +/* + * There isn't much you can do to push on an cud item. It is simply stuck + * waiting for the log to be flushed to disk. + */ +STATIC uint +xfs_cud_item_push( + struct xfs_log_item *lip, + struct list_head *buffer_list) +{ + return XFS_ITEM_PINNED; +} + +/* + * The CUD is either committed or aborted if the transaction is cancelled. If + * the transaction is cancelled, drop our reference to the CUI and free the + * CUD. + */ +STATIC void +xfs_cud_item_unlock( + struct xfs_log_item *lip) +{ + struct xfs_cud_log_item *cudp = CUD_ITEM(lip); + + if (lip->li_flags & XFS_LI_ABORTED) { + xfs_cui_release(cudp->cud_cuip); + kmem_zone_free(xfs_cud_zone, cudp); + } +} + +/* + * When the cud item is committed to disk, all we need to do is delete our + * reference to our partner cui item and then free ourselves. Since we're + * freeing ourselves we must return -1 to keep the transaction code from + * further referencing this item. + */ +STATIC xfs_lsn_t +xfs_cud_item_committed( + struct xfs_log_item *lip, + xfs_lsn_t lsn) +{ + struct xfs_cud_log_item *cudp = CUD_ITEM(lip); + + /* + * Drop the CUI reference regardless of whether the CUD has been + * aborted. Once the CUD transaction is constructed, it is the sole + * responsibility of the CUD to release the CUI (even if the CUI is + * aborted due to log I/O error). + */ + xfs_cui_release(cudp->cud_cuip); + kmem_zone_free(xfs_cud_zone, cudp); + + return (xfs_lsn_t)-1; +} + +/* + * The CUD dependency tracking op doesn't do squat. It can't because + * it doesn't know where the free extent is coming from. The dependency + * tracking has to be handled by the "enclosing" metadata object. For + * example, for inodes, the inode is locked throughout the extent freeing + * so the dependency should be recorded there. + */ +STATIC void +xfs_cud_item_committing( + struct xfs_log_item *lip, + xfs_lsn_t lsn) +{ +} + +/* + * This is the ops vector shared by all cud log items. + */ +static const struct xfs_item_ops xfs_cud_item_ops = { + .iop_size = xfs_cud_item_size, + .iop_format = xfs_cud_item_format, + .iop_pin = xfs_cud_item_pin, + .iop_unpin = xfs_cud_item_unpin, + .iop_unlock = xfs_cud_item_unlock, + .iop_committed = xfs_cud_item_committed, + .iop_push = xfs_cud_item_push, + .iop_committing = xfs_cud_item_committing, +}; + +/* + * Allocate and initialize an cud item with the given number of extents. + */ +struct xfs_cud_log_item * +xfs_cud_init( + struct xfs_mount *mp, + struct xfs_cui_log_item *cuip) + +{ + struct xfs_cud_log_item *cudp; + + cudp = kmem_zone_zalloc(xfs_cud_zone, KM_SLEEP); + xfs_log_item_init(mp, &cudp->cud_item, XFS_LI_CUD, &xfs_cud_item_ops); + cudp->cud_cuip = cuip; + cudp->cud_format.cud_cui_id = cuip->cui_format.cui_id; + + return cudp; +} diff --git a/fs/xfs/xfs_refcount_item.h b/fs/xfs/xfs_refcount_item.h new file mode 100644 index 0000000..596ee2d4 --- /dev/null +++ b/fs/xfs/xfs_refcount_item.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_REFCOUNT_ITEM_H__ +#define __XFS_REFCOUNT_ITEM_H__ + +/* + * There are (currently) two pairs of refcount btree redo item types: + * increase and decrease. The log items for these are CUI (refcount + * update intent) and CUD (refcount update done). The redo item type + * is encoded in the flags field of each xfs_map_extent. + * + * *I items should be recorded in the *first* of a series of rolled + * transactions, and the *D items should be recorded in the same + * transaction that records the associated refcountbt updates. + * + * Should the system crash after the commit of the first transaction + * but before the commit of the final transaction in a series, log + * recovery will use the redo information recorded by the intent items + * to replay the refcountbt metadata updates. + */ + +/* kernel only CUI/CUD definitions */ + +struct xfs_mount; +struct kmem_zone; + +/* + * Max number of extents in fast allocation path. + */ +#define XFS_CUI_MAX_FAST_EXTENTS 16 + +/* + * Define CUI flag bits. Manipulated by set/clear/test_bit operators. + */ +#define XFS_CUI_RECOVERED 1 + +/* + * This is the "refcount update intent" log item. It is used to log + * the fact that some reverse mappings need to change. It is used in + * conjunction with the "refcount update done" log item described + * below. + * + * These log items follow the same rules as struct xfs_efi_log_item; + * see the comments about that structure (in xfs_extfree_item.h) for + * more details. + */ +struct xfs_cui_log_item { + struct xfs_log_item cui_item; + atomic_t cui_refcount; + atomic_t cui_next_extent; + unsigned long cui_flags; /* misc flags */ + struct xfs_cui_log_format cui_format; +}; + +/* + * This is the "refcount update done" log item. It is used to log the + * fact that some refcountbt updates mentioned in an earlier cui item + * have been performed. + */ +struct xfs_cud_log_item { + struct xfs_log_item cud_item; + struct xfs_cui_log_item *cud_cuip; + struct xfs_cud_log_format cud_format; +}; + +extern struct kmem_zone *xfs_cui_zone; +extern struct kmem_zone *xfs_cud_zone; + +struct xfs_cui_log_item *xfs_cui_init(struct xfs_mount *, uint); +struct xfs_cud_log_item *xfs_cud_init(struct xfs_mount *, + struct xfs_cui_log_item *); +int xfs_cui_copy_format(struct xfs_log_iovec *buf, + struct xfs_cui_log_format *dst_cui_fmt); +void xfs_cui_item_free(struct xfs_cui_log_item *); +void xfs_cui_release(struct xfs_cui_log_item *); + +#endif /* __XFS_REFCOUNT_ITEM_H__ */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index fd6be45..be9a98b 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -47,6 +47,7 @@ #include "xfs_sysfs.h" #include "xfs_ondisk.h" #include "xfs_rmap_item.h" +#include "xfs_refcount_item.h" #include #include @@ -1789,8 +1790,24 @@ xfs_init_zones(void) if (!xfs_rui_zone) goto out_destroy_rud_zone; + xfs_cud_zone = kmem_zone_init(sizeof(struct xfs_cud_log_item), + "xfs_cud_item"); + if (!xfs_cud_zone) + goto out_destroy_rui_zone; + + xfs_cui_zone = kmem_zone_init((sizeof(struct xfs_cui_log_item) + + ((XFS_CUI_MAX_FAST_EXTENTS - 1) * + sizeof(struct xfs_phys_extent))), + "xfs_cui_item"); + if (!xfs_cui_zone) + goto out_destroy_cud_zone; + return 0; + out_destroy_cud_zone: + kmem_zone_destroy(xfs_cud_zone); + out_destroy_rui_zone: + kmem_zone_destroy(xfs_rui_zone); out_destroy_rud_zone: kmem_zone_destroy(xfs_rud_zone); out_destroy_icreate_zone: @@ -1833,6 +1850,8 @@ xfs_destroy_zones(void) * destroy caches. */ rcu_barrier(); + kmem_zone_destroy(xfs_cui_zone); + kmem_zone_destroy(xfs_cud_zone); kmem_zone_destroy(xfs_rui_zone); kmem_zone_destroy(xfs_rud_zone); kmem_zone_destroy(xfs_icreate_zone); From darrick.wong@oracle.com Thu Aug 25 18:33:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_LOLITA1, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B9C967D5C for ; Thu, 25 Aug 2016 18:33:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A5908F8035 for ; Thu, 25 Aug 2016 16:33:47 -0700 (PDT) X-ASG-Debug-ID: 1472168025-0bf57b5313209210001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id VZxKVP9xlns8Jad2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNXhmh011283 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:33:44 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNXh4l014469 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:33:43 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNXglA027224; Thu, 25 Aug 2016 23:33:42 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:42 -0700 Subject: [PATCH 16/71] xfs: log refcount intent items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 16/71] xfs: log refcount intent items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:40 -0700 Message-ID: <147216802075.867.12945255918683675311.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168025 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16961 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide a mechanism for higher levels to create CUI/CUD items, submit them to the log, and a stub function to deal with recovered CUI items. These parts will be connected to the refcountbt in a later patch. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_log_format.h | 2 + fs/xfs/libxfs/xfs_refcount.h | 14 ++++ fs/xfs/xfs_log_recover.c | 151 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_refcount_item.c | 59 ++++++++++++++++ fs/xfs/xfs_refcount_item.h | 1 fs/xfs/xfs_trace.h | 30 ++++++++ fs/xfs/xfs_trans.h | 11 +++ fs/xfs/xfs_trans_refcount.c | 105 ++++++++++++++++++++++++++++ 9 files changed, 374 insertions(+) create mode 100644 fs/xfs/xfs_trans_refcount.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index d6429fd..6a9ea9e 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -113,6 +113,7 @@ xfs-y += xfs_log.o \ xfs_trans_buf.o \ xfs_trans_extfree.o \ xfs_trans_inode.o \ + xfs_trans_refcount.o \ xfs_trans_rmap.o \ # optional features diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index 484eb06..ebf5dc0 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -684,6 +684,8 @@ struct xfs_phys_extent { #define XFS_REFCOUNT_EXTENT_FREE_COW 4 #define XFS_REFCOUNT_EXTENT_TYPE_MASK 0xFF +#define XFS_REFCOUNT_EXTENT_FLAGS (XFS_REFCOUNT_EXTENT_TYPE_MASK) + /* * This is the structure used to lay out a cui log item in the * log. The cui_extents field is a variable size array whose diff --git a/fs/xfs/libxfs/xfs_refcount.h b/fs/xfs/libxfs/xfs_refcount.h index 4dc335a..2ef2b28 100644 --- a/fs/xfs/libxfs/xfs_refcount.h +++ b/fs/xfs/libxfs/xfs_refcount.h @@ -27,4 +27,18 @@ extern int xfs_refcount_lookup_ge(struct xfs_btree_cur *cur, extern int xfs_refcount_get_rec(struct xfs_btree_cur *cur, struct xfs_refcount_irec *irec, int *stat); +enum xfs_refcount_intent_type { + XFS_REFCOUNT_INCREASE, + XFS_REFCOUNT_DECREASE, + XFS_REFCOUNT_ALLOC_COW, + XFS_REFCOUNT_FREE_COW, +}; + +struct xfs_refcount_intent { + struct list_head ri_list; + enum xfs_refcount_intent_type ri_type; + xfs_fsblock_t ri_startblock; + xfs_extlen_t ri_blockcount; +}; + #endif /* __XFS_REFCOUNT_H__ */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index e8638fd..aa12daf 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -44,6 +44,7 @@ #include "xfs_error.h" #include "xfs_dir2.h" #include "xfs_rmap_item.h" +#include "xfs_refcount_item.h" #define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) @@ -1914,6 +1915,8 @@ xlog_recover_reorder_trans( case XFS_LI_EFI: case XFS_LI_RUI: case XFS_LI_RUD: + case XFS_LI_CUI: + case XFS_LI_CUD: trace_xfs_log_recover_item_reorder_tail(log, trans, item, pass); list_move_tail(&item->ri_list, &inode_list); @@ -3515,6 +3518,99 @@ xlog_recover_rud_pass2( } /* + * This routine is called to create an in-core extent refcount update + * item from the cui format structure which was logged on disk. + * It allocates an in-core cui, copies the extents from the format + * structure into it, and adds the cui to the AIL with the given + * LSN. + */ +STATIC int +xlog_recover_cui_pass2( + struct xlog *log, + struct xlog_recover_item *item, + xfs_lsn_t lsn) +{ + int error; + struct xfs_mount *mp = log->l_mp; + struct xfs_cui_log_item *cuip; + struct xfs_cui_log_format *cui_formatp; + + cui_formatp = item->ri_buf[0].i_addr; + + cuip = xfs_cui_init(mp, cui_formatp->cui_nextents); + error = xfs_cui_copy_format(&item->ri_buf[0], &cuip->cui_format); + if (error) { + xfs_cui_item_free(cuip); + return error; + } + atomic_set(&cuip->cui_next_extent, cui_formatp->cui_nextents); + + spin_lock(&log->l_ailp->xa_lock); + /* + * The CUI has two references. One for the CUD and one for CUI to ensure + * it makes it into the AIL. Insert the CUI into the AIL directly and + * drop the CUI reference. Note that xfs_trans_ail_update() drops the + * AIL lock. + */ + xfs_trans_ail_update(log->l_ailp, &cuip->cui_item, lsn); + xfs_cui_release(cuip); + return 0; +} + + +/* + * This routine is called when an CUD format structure is found in a committed + * transaction in the log. Its purpose is to cancel the corresponding CUI if it + * was still in the log. To do this it searches the AIL for the CUI with an id + * equal to that in the CUD format structure. If we find it we drop the CUD + * reference, which removes the CUI from the AIL and frees it. + */ +STATIC int +xlog_recover_cud_pass2( + struct xlog *log, + struct xlog_recover_item *item) +{ + struct xfs_cud_log_format *cud_formatp; + struct xfs_cui_log_item *cuip = NULL; + struct xfs_log_item *lip; + __uint64_t cui_id; + struct xfs_ail_cursor cur; + struct xfs_ail *ailp = log->l_ailp; + + cud_formatp = item->ri_buf[0].i_addr; + ASSERT(item->ri_buf[0].i_len == sizeof(struct xfs_cud_log_format)); + cui_id = cud_formatp->cud_cui_id; + + /* + * Search for the CUI with the id in the CUD format structure in the + * AIL. + */ + spin_lock(&ailp->xa_lock); + lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); + while (lip != NULL) { + if (lip->li_type == XFS_LI_CUI) { + cuip = (struct xfs_cui_log_item *)lip; + if (cuip->cui_format.cui_id == cui_id) { + /* + * Drop the CUD reference to the CUI. This + * removes the CUI from the AIL and frees it. + */ + spin_unlock(&ailp->xa_lock); + xfs_cui_release(cuip); + spin_lock(&ailp->xa_lock); + break; + } + } + lip = xfs_trans_ail_cursor_next(ailp, &cur); + } + + xfs_trans_ail_cursor_done(&cur); + spin_unlock(&ailp->xa_lock); + + return 0; +} + +/* * This routine is called when an inode create format structure is found in a * committed transaction in the log. It's purpose is to initialise the inodes * being allocated on disk. This requires us to get inode cluster buffers that @@ -3741,6 +3837,8 @@ xlog_recover_ra_pass2( case XFS_LI_QUOTAOFF: case XFS_LI_RUI: case XFS_LI_RUD: + case XFS_LI_CUI: + case XFS_LI_CUD: default: break; } @@ -3766,6 +3864,8 @@ xlog_recover_commit_pass1( case XFS_LI_ICREATE: case XFS_LI_RUI: case XFS_LI_RUD: + case XFS_LI_CUI: + case XFS_LI_CUD: /* nothing to do in pass 1 */ return 0; default: @@ -3800,6 +3900,10 @@ xlog_recover_commit_pass2( return xlog_recover_rui_pass2(log, item, trans->r_lsn); case XFS_LI_RUD: return xlog_recover_rud_pass2(log, item); + case XFS_LI_CUI: + return xlog_recover_cui_pass2(log, item, trans->r_lsn); + case XFS_LI_CUD: + return xlog_recover_cud_pass2(log, item); case XFS_LI_DQUOT: return xlog_recover_dquot_pass2(log, buffer_list, item, trans->r_lsn); @@ -4352,12 +4456,53 @@ xlog_recover_cancel_rui( spin_lock(&ailp->xa_lock); } +/* Recover the CUI if necessary. */ +STATIC int +xlog_recover_process_cui( + struct xfs_mount *mp, + struct xfs_ail *ailp, + struct xfs_log_item *lip) +{ + struct xfs_cui_log_item *cuip; + int error; + + /* + * Skip CUIs that we've already processed. + */ + cuip = container_of(lip, struct xfs_cui_log_item, cui_item); + if (test_bit(XFS_CUI_RECOVERED, &cuip->cui_flags)) + return 0; + + spin_unlock(&ailp->xa_lock); + error = xfs_cui_recover(mp, cuip); + spin_lock(&ailp->xa_lock); + + return error; +} + +/* Release the CUI since we're cancelling everything. */ +STATIC void +xlog_recover_cancel_cui( + struct xfs_mount *mp, + struct xfs_ail *ailp, + struct xfs_log_item *lip) +{ + struct xfs_cui_log_item *cuip; + + cuip = container_of(lip, struct xfs_cui_log_item, cui_item); + + spin_unlock(&ailp->xa_lock); + xfs_cui_release(cuip); + spin_lock(&ailp->xa_lock); +} + /* Is this log item a deferred action intent? */ static inline bool xlog_item_is_intent(struct xfs_log_item *lip) { switch (lip->li_type) { case XFS_LI_EFI: case XFS_LI_RUI: + case XFS_LI_CUI: return true; default: return false; @@ -4421,6 +4566,9 @@ xlog_recover_process_intents( case XFS_LI_RUI: error = xlog_recover_process_rui(log->l_mp, ailp, lip); break; + case XFS_LI_CUI: + error = xlog_recover_process_cui(log->l_mp, ailp, lip); + break; } if (error) goto out; @@ -4468,6 +4616,9 @@ xlog_recover_cancel_intents( case XFS_LI_RUI: xlog_recover_cancel_rui(log->l_mp, ailp, lip); break; + case XFS_LI_CUI: + xlog_recover_cancel_cui(log->l_mp, ailp, lip); + break; } lip = xfs_trans_ail_cursor_next(ailp, &cur); diff --git a/fs/xfs/xfs_refcount_item.c b/fs/xfs/xfs_refcount_item.c index ca76fa2..a4a6c21 100644 --- a/fs/xfs/xfs_refcount_item.c +++ b/fs/xfs/xfs_refcount_item.c @@ -22,6 +22,7 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" +#include "xfs_bit.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" @@ -421,3 +422,61 @@ xfs_cud_init( return cudp; } + +/* + * Process a refcount update intent item that was recovered from the log. + * We need to update the refcountbt. + */ +int +xfs_cui_recover( + struct xfs_mount *mp, + struct xfs_cui_log_item *cuip) +{ + int i; + int error = 0; + struct xfs_phys_extent *refc; + xfs_fsblock_t startblock_fsb; + bool op_ok; + + ASSERT(!test_bit(XFS_CUI_RECOVERED, &cuip->cui_flags)); + + /* + * First check the validity of the extents described by the + * CUI. If any are bad, then assume that all are bad and + * just toss the CUI. + */ + for (i = 0; i < cuip->cui_format.cui_nextents; i++) { + refc = &cuip->cui_format.cui_extents[i]; + startblock_fsb = XFS_BB_TO_FSB(mp, + XFS_FSB_TO_DADDR(mp, refc->pe_startblock)); + switch (refc->pe_flags & XFS_REFCOUNT_EXTENT_TYPE_MASK) { + case XFS_REFCOUNT_EXTENT_INCREASE: + case XFS_REFCOUNT_EXTENT_DECREASE: + case XFS_REFCOUNT_EXTENT_ALLOC_COW: + case XFS_REFCOUNT_EXTENT_FREE_COW: + op_ok = true; + break; + default: + op_ok = false; + break; + } + if (!op_ok || startblock_fsb == 0 || + refc->pe_len == 0 || + startblock_fsb >= mp->m_sb.sb_dblocks || + refc->pe_len >= mp->m_sb.sb_agblocks || + (refc->pe_flags & ~XFS_REFCOUNT_EXTENT_FLAGS)) { + /* + * This will pull the CUI from the AIL and + * free the memory associated with it. + */ + set_bit(XFS_CUI_RECOVERED, &cuip->cui_flags); + xfs_cui_release(cuip); + return -EIO; + } + } + + /* XXX: do nothing for now */ + set_bit(XFS_CUI_RECOVERED, &cuip->cui_flags); + xfs_cui_release(cuip); + return error; +} diff --git a/fs/xfs/xfs_refcount_item.h b/fs/xfs/xfs_refcount_item.h index 596ee2d4..f744b85 100644 --- a/fs/xfs/xfs_refcount_item.h +++ b/fs/xfs/xfs_refcount_item.h @@ -90,5 +90,6 @@ int xfs_cui_copy_format(struct xfs_log_iovec *buf, struct xfs_cui_log_format *dst_cui_fmt); void xfs_cui_item_free(struct xfs_cui_log_item *); void xfs_cui_release(struct xfs_cui_log_item *); +int xfs_cui_recover(struct xfs_mount *mp, struct xfs_cui_log_item *cuip); #endif /* __XFS_REFCOUNT_ITEM_H__ */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 6297bc0..a195fc5 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2906,6 +2906,36 @@ DEFINE_AG_EXTENT_EVENT(xfs_refcount_find_shared); DEFINE_AG_EXTENT_EVENT(xfs_refcount_find_shared_result); DEFINE_AG_ERROR_EVENT(xfs_refcount_find_shared_error); +TRACE_EVENT(xfs_refcount_finish_one_leftover, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, + int type, xfs_agblock_t agbno, + xfs_extlen_t len, xfs_extlen_t adjusted), + TP_ARGS(mp, agno, type, agbno, len, adjusted), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_agnumber_t, agno) + __field(int, type) + __field(xfs_agblock_t, agbno) + __field(xfs_extlen_t, len) + __field(xfs_extlen_t, adjusted) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->type = type; + __entry->agbno = agbno; + __entry->len = len; + __entry->adjusted = adjusted; + ), + TP_printk("dev %d:%d type %d agno %u agbno %u len %u adjusted %u", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->type, + __entry->agno, + __entry->agbno, + __entry->len, + __entry->adjusted) +); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index e2bf86a..fe69e20 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -36,6 +36,7 @@ struct xfs_busy_extent; struct xfs_rud_log_item; struct xfs_rui_log_item; struct xfs_btree_cur; +struct xfs_cui_log_item; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ @@ -248,4 +249,14 @@ int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, struct xfs_btree_cur **pcur); +/* refcount updates */ +enum xfs_refcount_intent_type; + +struct xfs_cud_log_item *xfs_trans_get_cud(struct xfs_trans *tp, + struct xfs_cui_log_item *cuip); +int xfs_trans_log_finish_refcount_update(struct xfs_trans *tp, + struct xfs_cud_log_item *cudp, + enum xfs_refcount_intent_type type, xfs_fsblock_t startblock, + xfs_extlen_t blockcount, struct xfs_btree_cur **pcur); + #endif /* __XFS_TRANS_H__ */ diff --git a/fs/xfs/xfs_trans_refcount.c b/fs/xfs/xfs_trans_refcount.c new file mode 100644 index 0000000..6398ff9 --- /dev/null +++ b/fs/xfs/xfs_trans_refcount.c @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_refcount_item.h" +#include "xfs_alloc.h" +#include "xfs_refcount.h" + +/* Set the phys extent flags for this reverse mapping. */ +static void +xfs_trans_set_refcount_flags( + struct xfs_phys_extent *refc, + enum xfs_refcount_intent_type type) +{ + refc->pe_flags = 0; + switch (type) { + case XFS_REFCOUNT_INCREASE: + refc->pe_flags |= XFS_REFCOUNT_EXTENT_INCREASE; + break; + case XFS_REFCOUNT_DECREASE: + refc->pe_flags |= XFS_REFCOUNT_EXTENT_DECREASE; + break; + case XFS_REFCOUNT_ALLOC_COW: + refc->pe_flags |= XFS_REFCOUNT_EXTENT_ALLOC_COW; + break; + case XFS_REFCOUNT_FREE_COW: + refc->pe_flags |= XFS_REFCOUNT_EXTENT_FREE_COW; + break; + default: + ASSERT(0); + } +} + +/* + * This routine is called to allocate a "refcount update done" + * log item. + */ +struct xfs_cud_log_item * +xfs_trans_get_cud( + struct xfs_trans *tp, + struct xfs_cui_log_item *cuip) +{ + struct xfs_cud_log_item *cudp; + + cudp = xfs_cud_init(tp->t_mountp, cuip); + xfs_trans_add_item(tp, &cudp->cud_item); + return cudp; +} + +/* + * Finish an refcount update and log it to the CUD. Note that the + * transaction is marked dirty regardless of whether the refcount + * update succeeds or fails to support the CUI/CUD lifecycle rules. + */ +int +xfs_trans_log_finish_refcount_update( + struct xfs_trans *tp, + struct xfs_cud_log_item *cudp, + enum xfs_refcount_intent_type type, + xfs_fsblock_t startblock, + xfs_extlen_t blockcount, + struct xfs_btree_cur **pcur) +{ + int error; + + /* XXX: leave this empty for now */ + error = -EFSCORRUPTED; + + /* + * Mark the transaction dirty, even on error. This ensures the + * transaction is aborted, which: + * + * 1.) releases the CUI and frees the CUD + * 2.) shuts down the filesystem + */ + tp->t_flags |= XFS_TRANS_DIRTY; + cudp->cud_item.li_desc->lid_flags |= XFS_LID_DIRTY; + + return error; +} From darrick.wong@oracle.com Thu Aug 25 18:33:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 163087D28 for ; Thu, 25 Aug 2016 18:33:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A546D8F8033 for ; Thu, 25 Aug 2016 16:33:54 -0700 (PDT) X-ASG-Debug-ID: 1472168030-0bf81509b01de6d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id sLhuUjjsYDh4ZaCz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:51 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNXnXh011330 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:33:50 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNXnPB031527 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:49 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXm3n028852; Thu, 25 Aug 2016 23:33:49 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:48 -0700 Subject: [PATCH 17/71] xfs: adjust refcount of an extent of blocks in refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 17/71] xfs: adjust refcount of an extent of blocks in refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:47 -0700 Message-ID: <147216802709.867.8352733619174935098.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168031 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 25181 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide functions to adjust the reference counts for an extent of physical blocks stored in the refcount btree. v2: Refactor the left/right split code into a single function. Track the number of btree shape changes and record updates during a refcount update so that we can decide if we need to get a fresh transaction to continue. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_refcount.c | 783 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_error.h | 4 2 files changed, 786 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_refcount.c b/fs/xfs/libxfs/xfs_refcount.c index de13406..4f82651 100644 --- a/fs/xfs/libxfs/xfs_refcount.c +++ b/fs/xfs/libxfs/xfs_refcount.c @@ -37,6 +37,12 @@ #include "xfs_bit.h" #include "xfs_refcount.h" +/* Allowable refcount adjustment amounts. */ +enum xfs_refc_adjust_op { + XFS_REFCOUNT_ADJUST_INCREASE = 1, + XFS_REFCOUNT_ADJUST_DECREASE = -1, +}; + /* * Look up the first record less than or equal to [bno, len] in the btree * given by cur. @@ -175,3 +181,780 @@ out_error: cur->bc_private.a.agno, error, _RET_IP_); return error; } + +/* + * Adjusting the Reference Count + * + * As stated elsewhere, the reference count btree (refcbt) stores + * >1 reference counts for extents of physical blocks. In this + * operation, we're either raising or lowering the reference count of + * some subrange stored in the tree: + * + * <------ adjustment range ------> + * ----+ +---+-----+ +--+--------+--------- + * 2 | | 3 | 4 | |17| 55 | 10 + * ----+ +---+-----+ +--+--------+--------- + * X axis is physical blocks number; + * reference counts are the numbers inside the rectangles + * + * The first thing we need to do is to ensure that there are no + * refcount extents crossing either boundary of the range to be + * adjusted. For any extent that does cross a boundary, split it into + * two extents so that we can increment the refcount of one of the + * pieces later: + * + * <------ adjustment range ------> + * ----+ +---+-----+ +--+--------+----+---- + * 2 | | 3 | 2 | |17| 55 | 10 | 10 + * ----+ +---+-----+ +--+--------+----+---- + * + * For this next step, let's assume that all the physical blocks in + * the adjustment range are mapped to a file and are therefore in use + * at least once. Therefore, we can infer that any gap in the + * refcount tree within the adjustment range represents a physical + * extent with refcount == 1: + * + * <------ adjustment range ------> + * ----+---+---+-----+-+--+--------+----+---- + * 2 |"1"| 3 | 2 |1|17| 55 | 10 | 10 + * ----+---+---+-----+-+--+--------+----+---- + * ^ + * + * For each extent that falls within the interval range, figure out + * which extent is to the left or the right of that extent. Now we + * have a left, current, and right extent. If the new reference count + * of the center extent enables us to merge left, center, and right + * into one record covering all three, do so. If the center extent is + * at the left end of the range, abuts the left extent, and its new + * reference count matches the left extent's record, then merge them. + * If the center extent is at the right end of the range, abuts the + * right extent, and the reference counts match, merge those. In the + * example, we can left merge (assuming an increment operation): + * + * <------ adjustment range ------> + * --------+---+-----+-+--+--------+----+---- + * 2 | 3 | 2 |1|17| 55 | 10 | 10 + * --------+---+-----+-+--+--------+----+---- + * ^ + * + * For all other extents within the range, adjust the reference count + * or delete it if the refcount falls below 2. If we were + * incrementing, the end result looks like this: + * + * <------ adjustment range ------> + * --------+---+-----+-+--+--------+----+---- + * 2 | 4 | 3 |2|18| 56 | 11 | 10 + * --------+---+-----+-+--+--------+----+---- + * + * The result of a decrement operation looks as such: + * + * <------ adjustment range ------> + * ----+ +---+ +--+--------+----+---- + * 2 | | 2 | |16| 54 | 9 | 10 + * ----+ +---+ +--+--------+----+---- + * DDDD 111111DD + * + * The blocks marked "D" are freed; the blocks marked "1" are only + * referenced once and therefore the record is removed from the + * refcount btree. + */ + +#define RCNEXT(rc) ((rc).rc_startblock + (rc).rc_blockcount) +/* + * Split a refcount extent that crosses agbno. + */ +STATIC int +xfs_refcount_split_extent( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + bool *shape_changed) +{ + struct xfs_refcount_irec rcext, tmp; + int found_rec; + int error; + + *shape_changed = false; + error = xfs_refcount_lookup_le(cur, agbno, &found_rec); + if (error) + goto out_error; + if (!found_rec) + return 0; + + error = xfs_refcount_get_rec(cur, &rcext, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + if (rcext.rc_startblock == agbno || RCNEXT(rcext) <= agbno) + return 0; + + *shape_changed = true; + trace_xfs_refcount_split_extent(cur->bc_mp, cur->bc_private.a.agno, + &rcext, agbno); + + /* Establish the right extent. */ + tmp = rcext; + tmp.rc_startblock = agbno; + tmp.rc_blockcount -= (agbno - rcext.rc_startblock); + error = xfs_refcount_update(cur, &tmp); + if (error) + goto out_error; + + /* Insert the left extent. */ + tmp = rcext; + tmp.rc_blockcount = agbno - rcext.rc_startblock; + error = xfs_refcount_insert(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + return error; + +out_error: + trace_xfs_refcount_split_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Merge the left, center, and right extents. + */ +STATIC int +xfs_refcount_merge_center_extent( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *left, + struct xfs_refcount_irec *center, + unsigned long long extlen, + xfs_agblock_t *agbno, + xfs_extlen_t *aglen) +{ + int error; + int found_rec; + + error = xfs_refcount_lookup_ge(cur, center->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + if (center->rc_refcount > 1) { + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + } + + error = xfs_refcount_lookup_le(cur, left->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + left->rc_blockcount = extlen; + error = xfs_refcount_update(cur, left); + if (error) + goto out_error; + + *aglen = 0; + return error; + +out_error: + trace_xfs_refcount_merge_center_extents_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Merge with the left extent. + */ +STATIC int +xfs_refcount_merge_left_extent( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *left, + struct xfs_refcount_irec *cleft, + xfs_agblock_t *agbno, + xfs_extlen_t *aglen) +{ + int error; + int found_rec; + + if (cleft->rc_refcount > 1) { + error = xfs_refcount_lookup_le(cur, cleft->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + } + + error = xfs_refcount_lookup_le(cur, left->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + left->rc_blockcount += cleft->rc_blockcount; + error = xfs_refcount_update(cur, left); + if (error) + goto out_error; + + *agbno += cleft->rc_blockcount; + *aglen -= cleft->rc_blockcount; + return error; + +out_error: + trace_xfs_refcount_merge_left_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Merge with the right extent. + */ +STATIC int +xfs_refcount_merge_right_extent( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *right, + struct xfs_refcount_irec *cright, + xfs_agblock_t *agbno, + xfs_extlen_t *aglen) +{ + int error; + int found_rec; + + if (cright->rc_refcount > 1) { + error = xfs_refcount_lookup_le(cur, cright->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + } + + error = xfs_refcount_lookup_le(cur, right->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + right->rc_startblock -= cright->rc_blockcount; + right->rc_blockcount += cright->rc_blockcount; + error = xfs_refcount_update(cur, right); + if (error) + goto out_error; + + *aglen -= cright->rc_blockcount; + return error; + +out_error: + trace_xfs_refcount_merge_right_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Find the left extent and the one after it (cleft). This function assumes + * that we've already split any extent crossing agbno. + */ +STATIC int +xfs_refcount_find_left_extents( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *left, + struct xfs_refcount_irec *cleft, + xfs_agblock_t agbno, + xfs_extlen_t aglen) +{ + struct xfs_refcount_irec tmp; + int error; + int found_rec; + + left->rc_blockcount = cleft->rc_blockcount = 0; + error = xfs_refcount_lookup_le(cur, agbno - 1, &found_rec); + if (error) + goto out_error; + if (!found_rec) + return 0; + + error = xfs_refcount_get_rec(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + if (RCNEXT(tmp) != agbno) + return 0; + /* We have a left extent; retrieve (or invent) the next right one */ + *left = tmp; + + error = xfs_btree_increment(cur, 0, &found_rec); + if (error) + goto out_error; + if (found_rec) { + error = xfs_refcount_get_rec(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + + /* if tmp starts at the end of our range, just use that */ + if (tmp.rc_startblock == agbno) + *cleft = tmp; + else { + /* + * There's a gap in the refcntbt at the start of the + * range we're interested in (refcount == 1) so + * create the implied extent and pass it back. + */ + cleft->rc_startblock = agbno; + cleft->rc_blockcount = min(aglen, + tmp.rc_startblock - agbno); + cleft->rc_refcount = 1; + } + } else { + /* + * No extents, so pretend that there's one covering the whole + * range. + */ + cleft->rc_startblock = agbno; + cleft->rc_blockcount = aglen; + cleft->rc_refcount = 1; + } + trace_xfs_refcount_find_left_extent(cur->bc_mp, cur->bc_private.a.agno, + left, cleft, agbno); + return error; + +out_error: + trace_xfs_refcount_find_left_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Find the right extent and the one before it (cright). This function + * assumes that we've already split any extents crossing agbno + aglen. + */ +STATIC int +xfs_refcount_find_right_extents( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *right, + struct xfs_refcount_irec *cright, + xfs_agblock_t agbno, + xfs_extlen_t aglen) +{ + struct xfs_refcount_irec tmp; + int error; + int found_rec; + + right->rc_blockcount = cright->rc_blockcount = 0; + error = xfs_refcount_lookup_ge(cur, agbno + aglen, &found_rec); + if (error) + goto out_error; + if (!found_rec) + return 0; + + error = xfs_refcount_get_rec(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + if (tmp.rc_startblock != agbno + aglen) + return 0; + /* We have a right extent; retrieve (or invent) the next left one */ + *right = tmp; + + error = xfs_btree_decrement(cur, 0, &found_rec); + if (error) + goto out_error; + if (found_rec) { + error = xfs_refcount_get_rec(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + + /* if tmp ends at the end of our range, just use that */ + if (RCNEXT(tmp) == agbno + aglen) + *cright = tmp; + else { + /* + * There's a gap in the refcntbt at the end of the + * range we're interested in (refcount == 1) so + * create the implied extent and pass it back. + */ + cright->rc_startblock = max(agbno, RCNEXT(tmp)); + cright->rc_blockcount = right->rc_startblock - + cright->rc_startblock; + cright->rc_refcount = 1; + } + } else { + /* + * No extents, so pretend that there's one covering the whole + * range. + */ + cright->rc_startblock = agbno; + cright->rc_blockcount = aglen; + cright->rc_refcount = 1; + } + trace_xfs_refcount_find_right_extent(cur->bc_mp, cur->bc_private.a.agno, + cright, right, agbno + aglen); + return error; + +out_error: + trace_xfs_refcount_find_right_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} +#undef RCNEXT + +/* + * Try to merge with any extents on the boundaries of the adjustment range. + */ +STATIC int +xfs_refcount_merge_extents( + struct xfs_btree_cur *cur, + xfs_agblock_t *agbno, + xfs_extlen_t *aglen, + enum xfs_refc_adjust_op adjust, + bool *shape_changed) +{ + struct xfs_refcount_irec left = {0}, cleft = {0}; + struct xfs_refcount_irec cright = {0}, right = {0}; + int error; + unsigned long long ulen; + bool cequal; + + *shape_changed = false; + /* + * Find the extent just below agbno [left], just above agbno [cleft], + * just below (agbno + aglen) [cright], and just above (agbno + aglen) + * [right]. + */ + error = xfs_refcount_find_left_extents(cur, &left, &cleft, *agbno, + *aglen); + if (error) + return error; + error = xfs_refcount_find_right_extents(cur, &right, &cright, *agbno, + *aglen); + if (error) + return error; + + /* No left or right extent to merge; exit. */ + if (left.rc_blockcount == 0 && right.rc_blockcount == 0) + return 0; + + *shape_changed = true; + cequal = (cleft.rc_startblock == cright.rc_startblock) && + (cleft.rc_blockcount == cright.rc_blockcount); + + /* Try to merge left, cleft, and right. cleft must == cright. */ + ulen = (unsigned long long)left.rc_blockcount + cleft.rc_blockcount + + right.rc_blockcount; + if (left.rc_blockcount != 0 && right.rc_blockcount != 0 && + cleft.rc_blockcount != 0 && cright.rc_blockcount != 0 && + cequal && + left.rc_refcount == cleft.rc_refcount + adjust && + right.rc_refcount == cleft.rc_refcount + adjust && + ulen < MAXREFCEXTLEN) { + trace_xfs_refcount_merge_center_extents(cur->bc_mp, + cur->bc_private.a.agno, &left, &cleft, &right); + return xfs_refcount_merge_center_extent(cur, &left, &cleft, + ulen, agbno, aglen); + } + + /* Try to merge left and cleft. */ + ulen = (unsigned long long)left.rc_blockcount + cleft.rc_blockcount; + if (left.rc_blockcount != 0 && cleft.rc_blockcount != 0 && + left.rc_refcount == cleft.rc_refcount + adjust && + ulen < MAXREFCEXTLEN) { + trace_xfs_refcount_merge_left_extent(cur->bc_mp, + cur->bc_private.a.agno, &left, &cleft); + error = xfs_refcount_merge_left_extent(cur, &left, &cleft, + agbno, aglen); + if (error) + return error; + + /* + * If we just merged left + cleft and cleft == cright, + * we no longer have a cright to merge with right. We're done. + */ + if (cequal) + return 0; + } + + /* Try to merge cright and right. */ + ulen = (unsigned long long)right.rc_blockcount + cright.rc_blockcount; + if (right.rc_blockcount != 0 && cright.rc_blockcount != 0 && + right.rc_refcount == cright.rc_refcount + adjust && + ulen < MAXREFCEXTLEN) { + trace_xfs_refcount_merge_right_extent(cur->bc_mp, + cur->bc_private.a.agno, &cright, &right); + return xfs_refcount_merge_right_extent(cur, &right, &cright, + agbno, aglen); + } + + return error; +} + +/* + * While we're adjusting the refcounts records of an extent, we have + * to keep an eye on the number of extents we're dirtying -- run too + * many in a single transaction and we'll exceed the transaction's + * reservation and crash the fs. Each record adds 12 bytes to the + * log (plus any key updates) so we'll conservatively assume 24 bytes + * per record. We must also leave space for btree splits on both ends + * of the range and space for the CUD and a new CUI. + * + * XXX: This is a pretty hand-wavy estimate. The penalty for guessing + * true incorrectly is a shutdown FS; the penalty for guessing false + * incorrectly is more transaction rolls than might be necessary. + * Be conservative here. + */ +static bool +xfs_refcount_still_have_space( + struct xfs_btree_cur *cur) +{ + unsigned long overhead; + + overhead = cur->bc_private.a.priv.refc.shape_changes * + xfs_allocfree_log_count(cur->bc_mp, 1); + overhead *= cur->bc_mp->m_sb.sb_blocksize; + + /* + * Only allow 2 refcount extent updates per transaction if the + * refcount continue update "error" has been injected. + */ + if (cur->bc_private.a.priv.refc.nr_ops > 2 && + XFS_TEST_ERROR(false, cur->bc_mp, + XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE, + XFS_RANDOM_REFCOUNT_CONTINUE_UPDATE)) + return false; + + if (cur->bc_private.a.priv.refc.nr_ops == 0) + return true; + else if (overhead > cur->bc_tp->t_log_res) + return false; + return cur->bc_tp->t_log_res - overhead > + cur->bc_private.a.priv.refc.nr_ops * 32; +} + +/* + * Adjust the refcounts of middle extents. At this point we should have + * split extents that crossed the adjustment range; merged with adjacent + * extents; and updated agbno/aglen to reflect the merges. Therefore, + * all we have to do is update the extents inside [agbno, agbno + aglen]. + */ +STATIC int +xfs_refcount_adjust_extents( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + xfs_extlen_t *adjusted, + enum xfs_refc_adjust_op adj, + struct xfs_defer_ops *dfops, + struct xfs_owner_info *oinfo) +{ + struct xfs_refcount_irec ext, tmp; + int error; + int found_rec, found_tmp; + xfs_fsblock_t fsbno; + + /* Merging did all the work already. */ + if (aglen == 0) + return 0; + + error = xfs_refcount_lookup_ge(cur, agbno, &found_rec); + if (error) + goto out_error; + + while (aglen > 0 && xfs_refcount_still_have_space(cur)) { + error = xfs_refcount_get_rec(cur, &ext, &found_rec); + if (error) + goto out_error; + if (!found_rec) { + ext.rc_startblock = cur->bc_mp->m_sb.sb_agblocks; + ext.rc_blockcount = 0; + ext.rc_refcount = 0; + } + + /* + * Deal with a hole in the refcount tree; if a file maps to + * these blocks and there's no refcountbt recourd, pretend that + * there is one with refcount == 1. + */ + if (ext.rc_startblock != agbno) { + tmp.rc_startblock = agbno; + tmp.rc_blockcount = min(aglen, + ext.rc_startblock - agbno); + tmp.rc_refcount = 1 + adj; + trace_xfs_refcount_modify_extent(cur->bc_mp, + cur->bc_private.a.agno, &tmp); + + /* + * Either cover the hole (increment) or + * delete the range (decrement). + */ + if (tmp.rc_refcount) { + error = xfs_refcount_insert(cur, &tmp, + &found_tmp); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + found_tmp == 1, out_error); + cur->bc_private.a.priv.refc.nr_ops++; + } else { + fsbno = XFS_AGB_TO_FSB(cur->bc_mp, + cur->bc_private.a.agno, + tmp.rc_startblock); + xfs_bmap_add_free(cur->bc_mp, dfops, fsbno, + tmp.rc_blockcount, oinfo); + } + + (*adjusted) += tmp.rc_blockcount; + agbno += tmp.rc_blockcount; + aglen -= tmp.rc_blockcount; + + error = xfs_refcount_lookup_ge(cur, agbno, + &found_rec); + if (error) + goto out_error; + } + + /* Stop if there's nothing left to modify */ + if (aglen == 0 || !xfs_refcount_still_have_space(cur)) + break; + + /* + * Adjust the reference count and either update the tree + * (incr) or free the blocks (decr). + */ + if (ext.rc_refcount == MAXREFCOUNT) + goto skip; + ext.rc_refcount += adj; + trace_xfs_refcount_modify_extent(cur->bc_mp, + cur->bc_private.a.agno, &ext); + if (ext.rc_refcount > 1) { + error = xfs_refcount_update(cur, &ext); + if (error) + goto out_error; + cur->bc_private.a.priv.refc.nr_ops++; + } else if (ext.rc_refcount == 1) { + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + found_rec == 1, out_error); + cur->bc_private.a.priv.refc.nr_ops++; + goto advloop; + } else { + fsbno = XFS_AGB_TO_FSB(cur->bc_mp, + cur->bc_private.a.agno, + ext.rc_startblock); + xfs_bmap_add_free(cur->bc_mp, dfops, fsbno, + ext.rc_blockcount, oinfo); + } + +skip: + error = xfs_btree_increment(cur, 0, &found_rec); + if (error) + goto out_error; + +advloop: + (*adjusted) += ext.rc_blockcount; + agbno += ext.rc_blockcount; + aglen -= ext.rc_blockcount; + } + + return error; +out_error: + trace_xfs_refcount_modify_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* Adjust the reference count of a range of AG blocks. */ +STATIC int +xfs_refcount_adjust( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + xfs_extlen_t *adjusted, + enum xfs_refc_adjust_op adj, + struct xfs_defer_ops *dfops, + struct xfs_owner_info *oinfo) +{ + xfs_extlen_t orig_aglen; + bool shape_changed; + int shape_changes = 0; + int error; + + *adjusted = 0; + switch (adj) { + case XFS_REFCOUNT_ADJUST_INCREASE: + trace_xfs_refcount_increase(cur->bc_mp, cur->bc_private.a.agno, + agbno, aglen); + break; + case XFS_REFCOUNT_ADJUST_DECREASE: + trace_xfs_refcount_decrease(cur->bc_mp, cur->bc_private.a.agno, + agbno, aglen); + break; + default: + ASSERT(0); + } + + /* + * Ensure that no rcextents cross the boundary of the adjustment range. + */ + error = xfs_refcount_split_extent(cur, agbno, &shape_changed); + if (error) + goto out_error; + if (shape_changed) + shape_changes++; + + error = xfs_refcount_split_extent(cur, agbno + aglen, &shape_changed); + if (error) + goto out_error; + if (shape_changed) + shape_changes++; + + /* + * Try to merge with the left or right extents of the range. + */ + orig_aglen = aglen; + error = xfs_refcount_merge_extents(cur, &agbno, &aglen, adj, + &shape_changed); + if (error) + goto out_error; + if (shape_changed) + shape_changes++; + (*adjusted) += orig_aglen - aglen; + if (shape_changes) + cur->bc_private.a.priv.refc.shape_changes++; + + /* Now that we've taken care of the ends, adjust the middle extents */ + error = xfs_refcount_adjust_extents(cur, agbno, aglen, adjusted, adj, + dfops, oinfo); + if (error) + goto out_error; + + return 0; + +out_error: + trace_xfs_refcount_adjust_error(cur->bc_mp, cur->bc_private.a.agno, + error, _RET_IP_); + return error; +} diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 3d22470..d9675c64 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -92,7 +92,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp); #define XFS_ERRTAG_BMAPIFORMAT 21 #define XFS_ERRTAG_FREE_EXTENT 22 #define XFS_ERRTAG_RMAP_FINISH_ONE 23 -#define XFS_ERRTAG_MAX 24 +#define XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE 24 +#define XFS_ERRTAG_MAX 25 /* * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. @@ -121,6 +122,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); #define XFS_RANDOM_BMAPIFORMAT XFS_RANDOM_DEFAULT #define XFS_RANDOM_FREE_EXTENT 1 #define XFS_RANDOM_RMAP_FINISH_ONE 1 +#define XFS_RANDOM_REFCOUNT_CONTINUE_UPDATE 1 #ifdef DEBUG extern int xfs_error_test_active; From darrick.wong@oracle.com Thu Aug 25 18:34:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 523037D5C for ; Thu, 25 Aug 2016 18:34:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 24688304039 for ; Thu, 25 Aug 2016 16:34:01 -0700 (PDT) X-ASG-Debug-ID: 1472168037-0bf57c55b41c7790001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id ezwY8eoMA5vo09oO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:33:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNXuYC018250 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:56 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNXtfc004377 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:33:56 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNXtH9027397; Thu, 25 Aug 2016 23:33:55 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:33:55 -0700 Subject: [PATCH 18/71] xfs: connect refcount adjust functions to upper layers From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 18/71] xfs: connect refcount adjust functions to upper layers To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:33:53 -0700 Message-ID: <147216803348.867.13758665374298091849.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168038 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 18124 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the upper level interface to schedule and finish deferred refcount operations via the deferred ops mechanism. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_defer.h | 1 fs/xfs/libxfs/xfs_refcount.c | 170 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_refcount.h | 12 +++ fs/xfs/xfs_error.h | 4 + fs/xfs/xfs_refcount_item.c | 80 +++++++++++++++++++- fs/xfs/xfs_super.c | 1 fs/xfs/xfs_trace.h | 3 + fs/xfs/xfs_trans.h | 8 +- fs/xfs/xfs_trans_refcount.c | 167 +++++++++++++++++++++++++++++++++++++++++ 9 files changed, 439 insertions(+), 7 deletions(-) diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h index cc3981c..d47a482 100644 --- a/fs/xfs/libxfs/xfs_defer.h +++ b/fs/xfs/libxfs/xfs_defer.h @@ -51,6 +51,7 @@ struct xfs_defer_pending { * find all the space it needs. */ enum xfs_defer_ops_type { + XFS_DEFER_OPS_TYPE_REFCOUNT, XFS_DEFER_OPS_TYPE_RMAP, XFS_DEFER_OPS_TYPE_FREE, XFS_DEFER_OPS_TYPE_MAX, diff --git a/fs/xfs/libxfs/xfs_refcount.c b/fs/xfs/libxfs/xfs_refcount.c index 4f82651..b52ecfe 100644 --- a/fs/xfs/libxfs/xfs_refcount.c +++ b/fs/xfs/libxfs/xfs_refcount.c @@ -958,3 +958,173 @@ out_error: error, _RET_IP_); return error; } + +/* Clean up after calling xfs_refcount_finish_one. */ +void +xfs_refcount_finish_one_cleanup( + struct xfs_trans *tp, + struct xfs_btree_cur *rcur, + int error) +{ + struct xfs_buf *agbp; + + if (rcur == NULL) + return; + agbp = rcur->bc_private.a.agbp; + xfs_btree_del_cursor(rcur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + if (error) + xfs_trans_brelse(tp, agbp); +} + +/* + * Process one of the deferred refcount operations. We pass back the + * btree cursor to maintain our lock on the btree between calls. + * This saves time and eliminates a buffer deadlock between the + * superblock and the AGF because we'll always grab them in the same + * order. + */ +int +xfs_refcount_finish_one( + struct xfs_trans *tp, + struct xfs_defer_ops *dfops, + enum xfs_refcount_intent_type type, + xfs_fsblock_t startblock, + xfs_extlen_t blockcount, + xfs_extlen_t *adjusted, + struct xfs_btree_cur **pcur) +{ + struct xfs_mount *mp = tp->t_mountp; + struct xfs_btree_cur *rcur; + struct xfs_buf *agbp = NULL; + int error = 0; + xfs_agnumber_t agno; + xfs_agblock_t bno; + unsigned long nr_ops = 0; + int shape_changes = 0; + + agno = XFS_FSB_TO_AGNO(mp, startblock); + ASSERT(agno != NULLAGNUMBER); + bno = XFS_FSB_TO_AGBNO(mp, startblock); + + trace_xfs_refcount_deferred(mp, XFS_FSB_TO_AGNO(mp, startblock), + type, XFS_FSB_TO_AGBNO(mp, startblock), + blockcount); + + if (XFS_TEST_ERROR(false, mp, + XFS_ERRTAG_REFCOUNT_FINISH_ONE, + XFS_RANDOM_REFCOUNT_FINISH_ONE)) + return -EIO; + + /* + * If we haven't gotten a cursor or the cursor AG doesn't match + * the startblock, get one now. + */ + rcur = *pcur; + if (rcur != NULL && rcur->bc_private.a.agno != agno) { + nr_ops = rcur->bc_private.a.priv.refc.nr_ops; + shape_changes = rcur->bc_private.a.priv.refc.shape_changes; + xfs_refcount_finish_one_cleanup(tp, rcur, 0); + rcur = NULL; + *pcur = NULL; + } + if (rcur == NULL) { + error = xfs_alloc_read_agf(tp->t_mountp, tp, agno, + XFS_ALLOC_FLAG_FREEING, &agbp); + if (error) + return error; + if (!agbp) + return -EFSCORRUPTED; + + rcur = xfs_refcountbt_init_cursor(mp, tp, agbp, agno, dfops); + if (!rcur) { + error = -ENOMEM; + goto out_cur; + } + rcur->bc_private.a.priv.refc.nr_ops = nr_ops; + rcur->bc_private.a.priv.refc.shape_changes = shape_changes; + } + *pcur = rcur; + + switch (type) { + case XFS_REFCOUNT_INCREASE: + error = xfs_refcount_adjust(rcur, bno, blockcount, adjusted, + XFS_REFCOUNT_ADJUST_INCREASE, dfops, NULL); + break; + case XFS_REFCOUNT_DECREASE: + error = xfs_refcount_adjust(rcur, bno, blockcount, adjusted, + XFS_REFCOUNT_ADJUST_DECREASE, dfops, NULL); + break; + default: + ASSERT(0); + error = -EFSCORRUPTED; + } + if (!error && *adjusted != blockcount) + trace_xfs_refcount_finish_one_leftover(mp, agno, type, + bno, blockcount, *adjusted); + return error; + +out_cur: + xfs_trans_brelse(tp, agbp); + + return error; +} + +/* + * Record a refcount intent for later processing. + */ +static int +__xfs_refcount_add( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + enum xfs_refcount_intent_type type, + xfs_fsblock_t startblock, + xfs_extlen_t blockcount) +{ + struct xfs_refcount_intent *ri; + + trace_xfs_refcount_defer(mp, XFS_FSB_TO_AGNO(mp, startblock), + type, XFS_FSB_TO_AGBNO(mp, startblock), + blockcount); + + ri = kmem_alloc(sizeof(struct xfs_refcount_intent), + KM_SLEEP | KM_NOFS); + INIT_LIST_HEAD(&ri->ri_list); + ri->ri_type = type; + ri->ri_startblock = startblock; + ri->ri_blockcount = blockcount; + + xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_REFCOUNT, &ri->ri_list); + return 0; +} + +/* + * Increase the reference count of the blocks backing a file's extent. + */ +int +xfs_refcount_increase_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + struct xfs_bmbt_irec *PREV) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_INCREASE, + PREV->br_startblock, PREV->br_blockcount); +} + +/* + * Decrease the reference count of the blocks backing a file's extent. + */ +int +xfs_refcount_decrease_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + struct xfs_bmbt_irec *PREV) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_DECREASE, + PREV->br_startblock, PREV->br_blockcount); +} diff --git a/fs/xfs/libxfs/xfs_refcount.h b/fs/xfs/libxfs/xfs_refcount.h index 2ef2b28..605d7d7 100644 --- a/fs/xfs/libxfs/xfs_refcount.h +++ b/fs/xfs/libxfs/xfs_refcount.h @@ -41,4 +41,16 @@ struct xfs_refcount_intent { xfs_extlen_t ri_blockcount; }; +extern int xfs_refcount_increase_extent(struct xfs_mount *mp, + struct xfs_defer_ops *dfops, struct xfs_bmbt_irec *irec); +extern int xfs_refcount_decrease_extent(struct xfs_mount *mp, + struct xfs_defer_ops *dfops, struct xfs_bmbt_irec *irec); + +extern void xfs_refcount_finish_one_cleanup(struct xfs_trans *tp, + struct xfs_btree_cur *rcur, int error); +extern int xfs_refcount_finish_one(struct xfs_trans *tp, + struct xfs_defer_ops *dfops, enum xfs_refcount_intent_type type, + xfs_fsblock_t startblock, xfs_extlen_t blockcount, + xfs_extlen_t *adjusted, struct xfs_btree_cur **pcur); + #endif /* __XFS_REFCOUNT_H__ */ diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index d9675c64..641e090 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -93,7 +93,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp); #define XFS_ERRTAG_FREE_EXTENT 22 #define XFS_ERRTAG_RMAP_FINISH_ONE 23 #define XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE 24 -#define XFS_ERRTAG_MAX 25 +#define XFS_ERRTAG_REFCOUNT_FINISH_ONE 25 +#define XFS_ERRTAG_MAX 26 /* * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. @@ -123,6 +124,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); #define XFS_RANDOM_FREE_EXTENT 1 #define XFS_RANDOM_RMAP_FINISH_ONE 1 #define XFS_RANDOM_REFCOUNT_CONTINUE_UPDATE 1 +#define XFS_RANDOM_REFCOUNT_FINISH_ONE 1 #ifdef DEBUG extern int xfs_error_test_active; diff --git a/fs/xfs/xfs_refcount_item.c b/fs/xfs/xfs_refcount_item.c index a4a6c21..7be6029 100644 --- a/fs/xfs/xfs_refcount_item.c +++ b/fs/xfs/xfs_refcount_item.c @@ -24,11 +24,13 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_mount.h" +#include "xfs_defer.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_buf_item.h" #include "xfs_refcount_item.h" #include "xfs_log.h" +#include "xfs_refcount.h" kmem_zone_t *xfs_cui_zone; @@ -437,6 +439,15 @@ xfs_cui_recover( struct xfs_phys_extent *refc; xfs_fsblock_t startblock_fsb; bool op_ok; + struct xfs_cud_log_item *cudp; + struct xfs_trans *tp; + struct xfs_btree_cur *rcur = NULL; + enum xfs_refcount_intent_type type; + xfs_fsblock_t firstfsb; + xfs_extlen_t adjusted; + struct xfs_bmbt_irec irec; + struct xfs_defer_ops dfops; + bool requeue_only = false; ASSERT(!test_bit(XFS_CUI_RECOVERED, &cuip->cui_flags)); @@ -475,8 +486,73 @@ xfs_cui_recover( } } - /* XXX: do nothing for now */ + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); + if (error) + return error; + cudp = xfs_trans_get_cud(tp, cuip); + + xfs_defer_init(&dfops, &firstfsb); + for (i = 0; i < cuip->cui_format.cui_nextents; i++) { + refc = &cuip->cui_format.cui_extents[i]; + switch (refc->pe_flags & XFS_REFCOUNT_EXTENT_TYPE_MASK) { + case XFS_REFCOUNT_EXTENT_INCREASE: + type = XFS_REFCOUNT_INCREASE; + break; + case XFS_REFCOUNT_EXTENT_DECREASE: + type = XFS_REFCOUNT_DECREASE; + break; + case XFS_REFCOUNT_EXTENT_ALLOC_COW: + type = XFS_REFCOUNT_ALLOC_COW; + break; + case XFS_REFCOUNT_EXTENT_FREE_COW: + type = XFS_REFCOUNT_FREE_COW; + break; + default: + error = -EFSCORRUPTED; + goto abort_error; + } + if (requeue_only) + adjusted = 0; + else + error = xfs_trans_log_finish_refcount_update(tp, cudp, + &dfops, type, refc->pe_startblock, refc->pe_len, + &adjusted, &rcur); + if (error) + goto abort_error; + + /* Requeue what we didn't finish. */ + if (adjusted < refc->pe_len) { + irec.br_startblock = refc->pe_startblock + adjusted; + irec.br_blockcount = refc->pe_len - adjusted; + switch (type) { + case XFS_REFCOUNT_INCREASE: + error = xfs_refcount_increase_extent( + tp->t_mountp, &dfops, &irec); + break; + case XFS_REFCOUNT_DECREASE: + error = xfs_refcount_decrease_extent( + tp->t_mountp, &dfops, &irec); + break; + default: + ASSERT(0); + } + if (error) + goto abort_error; + requeue_only = true; + } + } + + xfs_refcount_finish_one_cleanup(tp, rcur, error); + error = xfs_defer_finish(&tp, &dfops, NULL); + if (error) + goto abort_error; set_bit(XFS_CUI_RECOVERED, &cuip->cui_flags); - xfs_cui_release(cuip); + error = xfs_trans_commit(tp); + return error; + +abort_error: + xfs_refcount_finish_one_cleanup(tp, rcur, error); + xfs_defer_cancel(&dfops); + xfs_trans_cancel(tp); return error; } diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index be9a98b..a027e27 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1905,6 +1905,7 @@ init_xfs_fs(void) xfs_extent_free_init_defer_op(); xfs_rmap_update_init_defer_op(); + xfs_refcount_update_init_defer_op(); xfs_dir_startup(); diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index a195fc5..6175003 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2905,6 +2905,9 @@ DEFINE_REFCOUNT_DOUBLE_EXTENT_EVENT(xfs_refcount_rec_order_error); DEFINE_AG_EXTENT_EVENT(xfs_refcount_find_shared); DEFINE_AG_EXTENT_EVENT(xfs_refcount_find_shared_result); DEFINE_AG_ERROR_EVENT(xfs_refcount_find_shared_error); +#define DEFINE_REFCOUNT_DEFERRED_EVENT DEFINE_PHYS_EXTENT_DEFERRED_EVENT +DEFINE_REFCOUNT_DEFERRED_EVENT(xfs_refcount_defer); +DEFINE_REFCOUNT_DEFERRED_EVENT(xfs_refcount_deferred); TRACE_EVENT(xfs_refcount_finish_one_leftover, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index fe69e20..a7a87d2 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -37,6 +37,8 @@ struct xfs_rud_log_item; struct xfs_rui_log_item; struct xfs_btree_cur; struct xfs_cui_log_item; +struct xfs_cud_log_item; +struct xfs_defer_ops; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ @@ -252,11 +254,13 @@ int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, /* refcount updates */ enum xfs_refcount_intent_type; +void xfs_refcount_update_init_defer_op(void); struct xfs_cud_log_item *xfs_trans_get_cud(struct xfs_trans *tp, struct xfs_cui_log_item *cuip); int xfs_trans_log_finish_refcount_update(struct xfs_trans *tp, - struct xfs_cud_log_item *cudp, + struct xfs_cud_log_item *cudp, struct xfs_defer_ops *dfops, enum xfs_refcount_intent_type type, xfs_fsblock_t startblock, - xfs_extlen_t blockcount, struct xfs_btree_cur **pcur); + xfs_extlen_t blockcount, xfs_extlen_t *adjusted, + struct xfs_btree_cur **pcur); #endif /* __XFS_TRANS_H__ */ diff --git a/fs/xfs/xfs_trans_refcount.c b/fs/xfs/xfs_trans_refcount.c index 6398ff9..3358a13 100644 --- a/fs/xfs/xfs_trans_refcount.c +++ b/fs/xfs/xfs_trans_refcount.c @@ -81,15 +81,17 @@ int xfs_trans_log_finish_refcount_update( struct xfs_trans *tp, struct xfs_cud_log_item *cudp, + struct xfs_defer_ops *dop, enum xfs_refcount_intent_type type, xfs_fsblock_t startblock, xfs_extlen_t blockcount, + xfs_extlen_t *adjusted, struct xfs_btree_cur **pcur) { int error; - /* XXX: leave this empty for now */ - error = -EFSCORRUPTED; + error = xfs_refcount_finish_one(tp, dop, type, startblock, + blockcount, adjusted, pcur); /* * Mark the transaction dirty, even on error. This ensures the @@ -103,3 +105,164 @@ xfs_trans_log_finish_refcount_update( return error; } + +/* Sort refcount intents by AG. */ +static int +xfs_refcount_update_diff_items( + void *priv, + struct list_head *a, + struct list_head *b) +{ + struct xfs_mount *mp = priv; + struct xfs_refcount_intent *ra; + struct xfs_refcount_intent *rb; + + ra = container_of(a, struct xfs_refcount_intent, ri_list); + rb = container_of(b, struct xfs_refcount_intent, ri_list); + return XFS_FSB_TO_AGNO(mp, ra->ri_startblock) - + XFS_FSB_TO_AGNO(mp, rb->ri_startblock); +} + +/* Get an CUI. */ +STATIC void * +xfs_refcount_update_create_intent( + struct xfs_trans *tp, + unsigned int count) +{ + struct xfs_cui_log_item *cuip; + + ASSERT(tp != NULL); + ASSERT(count > 0); + + cuip = xfs_cui_init(tp->t_mountp, count); + ASSERT(cuip != NULL); + + /* + * Get a log_item_desc to point at the new item. + */ + xfs_trans_add_item(tp, &cuip->cui_item); + return cuip; +} + +/* Log refcount updates in the intent item. */ +STATIC void +xfs_refcount_update_log_item( + struct xfs_trans *tp, + void *intent, + struct list_head *item) +{ + struct xfs_cui_log_item *cuip = intent; + struct xfs_refcount_intent *refc; + uint next_extent; + struct xfs_phys_extent *ext; + + refc = container_of(item, struct xfs_refcount_intent, ri_list); + + tp->t_flags |= XFS_TRANS_DIRTY; + cuip->cui_item.li_desc->lid_flags |= XFS_LID_DIRTY; + + /* + * atomic_inc_return gives us the value after the increment; + * we want to use it as an array index so we need to subtract 1 from + * it. + */ + next_extent = atomic_inc_return(&cuip->cui_next_extent) - 1; + ASSERT(next_extent < cuip->cui_format.cui_nextents); + ext = &cuip->cui_format.cui_extents[next_extent]; + ext->pe_startblock = refc->ri_startblock; + ext->pe_len = refc->ri_blockcount; + xfs_trans_set_refcount_flags(ext, refc->ri_type); +} + +/* Get an CUD so we can process all the deferred refcount updates. */ +STATIC void * +xfs_refcount_update_create_done( + struct xfs_trans *tp, + void *intent, + unsigned int count) +{ + return xfs_trans_get_cud(tp, intent); +} + +/* Process a deferred refcount update. */ +STATIC int +xfs_refcount_update_finish_item( + struct xfs_trans *tp, + struct xfs_defer_ops *dop, + struct list_head *item, + void *done_item, + void **state) +{ + struct xfs_refcount_intent *refc; + xfs_extlen_t adjusted; + int error; + + refc = container_of(item, struct xfs_refcount_intent, ri_list); + error = xfs_trans_log_finish_refcount_update(tp, done_item, dop, + refc->ri_type, + refc->ri_startblock, + refc->ri_blockcount, + &adjusted, + (struct xfs_btree_cur **)state); + /* Did we run out of reservation? Requeue what we didn't finish. */ + if (!error && adjusted < refc->ri_blockcount) { + ASSERT(refc->ri_type == XFS_REFCOUNT_INCREASE || + refc->ri_type == XFS_REFCOUNT_DECREASE); + refc->ri_startblock += adjusted; + refc->ri_blockcount -= adjusted; + return -EAGAIN; + } + kmem_free(refc); + return error; +} + +/* Clean up after processing deferred refcounts. */ +STATIC void +xfs_refcount_update_finish_cleanup( + struct xfs_trans *tp, + void *state, + int error) +{ + struct xfs_btree_cur *rcur = state; + + xfs_refcount_finish_one_cleanup(tp, rcur, error); +} + +/* Abort all pending CUIs. */ +STATIC void +xfs_refcount_update_abort_intent( + void *intent) +{ + xfs_cui_release(intent); +} + +/* Cancel a deferred refcount update. */ +STATIC void +xfs_refcount_update_cancel_item( + struct list_head *item) +{ + struct xfs_refcount_intent *refc; + + refc = container_of(item, struct xfs_refcount_intent, ri_list); + kmem_free(refc); +} + +static const struct xfs_defer_op_type xfs_refcount_update_defer_type = { + .type = XFS_DEFER_OPS_TYPE_REFCOUNT, + .max_items = XFS_CUI_MAX_FAST_EXTENTS, + .diff_items = xfs_refcount_update_diff_items, + .create_intent = xfs_refcount_update_create_intent, + .abort_intent = xfs_refcount_update_abort_intent, + .log_item = xfs_refcount_update_log_item, + .create_done = xfs_refcount_update_create_done, + .finish_item = xfs_refcount_update_finish_item, + .finish_cleanup = xfs_refcount_update_finish_cleanup, + .cancel_item = xfs_refcount_update_cancel_item, +}; + +/* Register the deferred op type. */ +void +xfs_refcount_update_init_defer_op(void) +{ + xfs_defer_init_op_type(&xfs_refcount_update_defer_type); +} From darrick.wong@oracle.com Thu Aug 25 18:34:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 91B017D6C for ; Thu, 25 Aug 2016 18:34:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 582DB304039 for ; Thu, 25 Aug 2016 16:34:06 -0700 (PDT) X-ASG-Debug-ID: 1472168044-0bf57c55b11c77a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id hkTFxHpOOMLOFlz3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:04 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNY2UM011679 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:03 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNY2gW004555 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:02 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNY1Ok016491; Thu, 25 Aug 2016 23:34:02 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:01 -0700 Subject: [PATCH 19/71] xfs: adjust refcount when unmapping file blocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 19/71] xfs: adjust refcount when unmapping file blocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:34:00 -0700 Message-ID: <147216804032.867.105965788553400078.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168044 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1297 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're unmapping blocks from a reflinked file, decrease the refcount of the affected blocks and free the extents that are no longer in use. v2: Use deferred ops system to avoid deadlocks and running out of transaction reservation. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 042d7bf..5e0c9ec 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -48,6 +48,7 @@ #include "xfs_filestream.h" #include "xfs_rmap.h" #include "xfs_ag_resv.h" +#include "xfs_refcount.h" kmem_zone_t *xfs_bmap_free_item_zone; @@ -5062,9 +5063,16 @@ xfs_bmap_del_extent( /* * If we need to, add to list of extents to delete. */ - if (do_fx) - xfs_bmap_add_free(mp, dfops, del->br_startblock, - del->br_blockcount, NULL); + if (do_fx) { + if (xfs_is_reflink_inode(ip) && whichfork == XFS_DATA_FORK) { + error = xfs_refcount_decrease_extent(mp, dfops, del); + if (error) + goto done; + } else + xfs_bmap_add_free(mp, dfops, del->br_startblock, + del->br_blockcount, NULL); + } + /* * Adjust inode # blocks in the file. */ From darrick.wong@oracle.com Thu Aug 25 18:34:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6A16F7D72 for ; Thu, 25 Aug 2016 18:34:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CABF8F8033 for ; Thu, 25 Aug 2016 16:34:12 -0700 (PDT) X-ASG-Debug-ID: 1472168050-0bf57b5313209280001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id JIcbjYW25C33ToRJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:11 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNY9or011766 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:34:09 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNY85L015133 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:09 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNY87i028922; Thu, 25 Aug 2016 23:34:08 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:07 -0700 Subject: [PATCH 20/71] xfs: add refcount btree block detection to log recovery From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 20/71] xfs: add refcount btree block detection to log recovery To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:34:06 -0700 Message-ID: <147216804649.867.3386489542459859114.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168050 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 940 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Identify refcountbt blocks in the log correctly so that we can validate them during log recovery. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_log_recover.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index aa12daf..0acc96e 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2235,6 +2235,7 @@ xlog_recover_get_buf_lsn( case XFS_ABTB_MAGIC: case XFS_ABTC_MAGIC: case XFS_RMAP_CRC_MAGIC: + case XFS_REFC_CRC_MAGIC: case XFS_IBT_CRC_MAGIC: case XFS_IBT_MAGIC: { struct xfs_btree_block *btb = blk; @@ -2406,6 +2407,9 @@ xlog_recover_validate_buf_type( case XFS_RMAP_CRC_MAGIC: bp->b_ops = &xfs_rmapbt_buf_ops; break; + case XFS_REFC_CRC_MAGIC: + bp->b_ops = &xfs_refcountbt_buf_ops; + break; default: xfs_warn(mp, "Bad btree block magic!"); ASSERT(0); From darrick.wong@oracle.com Thu Aug 25 18:34:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 937567D37 for ; Thu, 25 Aug 2016 18:34:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1134EAC002 for ; Thu, 25 Aug 2016 16:34:18 -0700 (PDT) X-ASG-Debug-ID: 1472168056-0bf8155c751e67f0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ZSkLHeYL6jHG0y1A (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:16 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNYFAb011845 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:34:15 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNYE4M015298 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:34:15 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNYEjr016632; Thu, 25 Aug 2016 23:34:14 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:14 -0700 Subject: [PATCH 21/71] xfs: refcount btree requires more reserved space From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 21/71] xfs: refcount btree requires more reserved space To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:34:12 -0700 Message-ID: <147216805266.867.13479037971772162849.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168056 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2896 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The reference count btree is allocated from the free space, which means that we have to ensure that an AG can't run out of free space while performing a refcount operation. In the pathological case each AG block has its own refcntbt record, so we have to keep that much space available. v2: Calculate the maximum possible size of the rmap and refcount btrees based on minimally-full btree blocks. This increases the per-AG block reservations to handle the worst case btree size. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 3 +++ fs/xfs/libxfs/xfs_refcount_btree.c | 23 +++++++++++++++++++++++ fs/xfs/libxfs/xfs_refcount_btree.h | 4 ++++ 3 files changed, 30 insertions(+) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 08ee609..6e81b27 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -38,6 +38,7 @@ #include "xfs_buf_item.h" #include "xfs_log.h" #include "xfs_ag_resv.h" +#include "xfs_refcount_btree.h" struct workqueue_struct *xfs_alloc_wq; @@ -128,6 +129,8 @@ xfs_alloc_ag_max_usable( blocks++; /* finobt root block */ if (xfs_sb_version_hasrmapbt(&mp->m_sb)) blocks++; /* rmap root block */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) + blocks++; /* refcount root block */ return mp->m_sb.sb_agblocks - blocks; } diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c index 26f4eb7..c9d4823 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.c +++ b/fs/xfs/libxfs/xfs_refcount_btree.c @@ -381,3 +381,26 @@ xfs_refcountbt_compute_maxlevels( mp->m_refc_maxlevels = xfs_btree_compute_maxlevels(mp, mp->m_refc_mnr, mp->m_sb.sb_agblocks); } + +/* Calculate the refcount btree size for some records. */ +xfs_extlen_t +xfs_refcountbt_calc_size( + struct xfs_mount *mp, + unsigned long long len) +{ + return xfs_btree_calc_size(mp, mp->m_refc_mnr, len); +} + +/* + * Calculate the maximum refcount btree size. + */ +xfs_extlen_t +xfs_refcountbt_max_size( + struct xfs_mount *mp) +{ + /* Bail out if we're uninitialized, which can happen in mkfs. */ + if (mp->m_refc_mxr[0] == 0) + return 0; + + return xfs_refcountbt_calc_size(mp, mp->m_sb.sb_agblocks); +} diff --git a/fs/xfs/libxfs/xfs_refcount_btree.h b/fs/xfs/libxfs/xfs_refcount_btree.h index 9e9ad7c..780b02f 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.h +++ b/fs/xfs/libxfs/xfs_refcount_btree.h @@ -64,4 +64,8 @@ extern int xfs_refcountbt_maxrecs(struct xfs_mount *mp, int blocklen, bool leaf); extern void xfs_refcountbt_compute_maxlevels(struct xfs_mount *mp); +extern xfs_extlen_t xfs_refcountbt_calc_size(struct xfs_mount *mp, + unsigned long long len); +extern xfs_extlen_t xfs_refcountbt_max_size(struct xfs_mount *mp); + #endif /* __XFS_REFCOUNT_BTREE_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:34:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 109BA7D7C for ; Thu, 25 Aug 2016 18:34:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7A9C304051 for ; Thu, 25 Aug 2016 16:34:26 -0700 (PDT) X-ASG-Debug-ID: 1472168064-0bf57c55b41c77f0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id aHe7nIqlz4CBxPjG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNYNSQ011891 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:23 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYNKg004955 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:23 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYLYD013969; Thu, 25 Aug 2016 23:34:22 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:21 -0700 Subject: [PATCH 22/71] xfs: introduce reflink utility functions From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 22/71] xfs: introduce reflink utility functions To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com, "Darrick J. Wong" Date: Thu, 25 Aug 2016 16:34:18 -0700 Message-ID: <147216805883.867.2849292964061840223.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168064 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4143 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines These functions will be used by the other reflink functions to find the maximum length of a range of shared blocks. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_refcount.c | 100 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_refcount.h | 4 ++ 2 files changed, 104 insertions(+) diff --git a/fs/xfs/libxfs/xfs_refcount.c b/fs/xfs/libxfs/xfs_refcount.c index b52ecfe..58b7770 100644 --- a/fs/xfs/libxfs/xfs_refcount.c +++ b/fs/xfs/libxfs/xfs_refcount.c @@ -1128,3 +1128,103 @@ xfs_refcount_decrease_extent( return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_DECREASE, PREV->br_startblock, PREV->br_blockcount); } + +/* + * Given an AG extent, find the lowest-numbered run of shared blocks within + * that range and return the range in fbno/flen. If find_maximal is set, + * return the longest extent of shared blocks; if not, just return the first + * extent we find. If no shared blocks are found, flen will be set to zero. + */ +int +xfs_refcount_find_shared( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + xfs_agblock_t *fbno, + xfs_extlen_t *flen, + bool find_maximal) +{ + struct xfs_refcount_irec tmp; + int i; + int have; + int error; + + trace_xfs_refcount_find_shared(cur->bc_mp, cur->bc_private.a.agno, + agbno, aglen); + + /* By default, skip the whole range */ + *fbno = agbno + aglen; + *flen = 0; + + /* Try to find a refcount extent that crosses the start */ + error = xfs_refcount_lookup_le(cur, agbno, &have); + if (error) + goto out_error; + if (!have) { + /* No left extent, look at the next one */ + error = xfs_btree_increment(cur, 0, &have); + if (error) + goto out_error; + if (!have) + goto done; + } + error = xfs_refcount_get_rec(cur, &tmp, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); + + /* If the extent ends before the start, look at the next one */ + if (tmp.rc_startblock + tmp.rc_blockcount <= agbno) { + error = xfs_btree_increment(cur, 0, &have); + if (error) + goto out_error; + if (!have) + goto done; + error = xfs_refcount_get_rec(cur, &tmp, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); + } + + /* If the extent ends after the range we want, bail out */ + if (tmp.rc_startblock >= agbno + aglen) + goto done; + + /* We found the start of a shared extent! */ + if (tmp.rc_startblock < agbno) { + tmp.rc_blockcount -= (agbno - tmp.rc_startblock); + tmp.rc_startblock = agbno; + } + + *fbno = tmp.rc_startblock; + *flen = min(tmp.rc_blockcount, agbno + aglen - *fbno); + if (!find_maximal) + goto done; + + /* Otherwise, find the end of this shared extent */ + while (*fbno + *flen < agbno + aglen) { + error = xfs_btree_increment(cur, 0, &have); + if (error) + goto out_error; + if (!have) + break; + error = xfs_refcount_get_rec(cur, &tmp, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); + if (tmp.rc_startblock >= agbno + aglen || + tmp.rc_startblock != *fbno + *flen) + break; + *flen = min(*flen + tmp.rc_blockcount, agbno + aglen - *fbno); + } + +done: + trace_xfs_refcount_find_shared_result(cur->bc_mp, + cur->bc_private.a.agno, *fbno, *flen); + +out_error: + if (error) + trace_xfs_refcount_find_shared_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} diff --git a/fs/xfs/libxfs/xfs_refcount.h b/fs/xfs/libxfs/xfs_refcount.h index 605d7d7..0ec9a28 100644 --- a/fs/xfs/libxfs/xfs_refcount.h +++ b/fs/xfs/libxfs/xfs_refcount.h @@ -53,4 +53,8 @@ extern int xfs_refcount_finish_one(struct xfs_trans *tp, xfs_fsblock_t startblock, xfs_extlen_t blockcount, xfs_extlen_t *adjusted, struct xfs_btree_cur **pcur); +extern int xfs_refcount_find_shared(struct xfs_btree_cur *cur, + xfs_agblock_t agbno, xfs_extlen_t aglen, xfs_agblock_t *fbno, + xfs_extlen_t *flen, bool find_maximal); + #endif /* __XFS_REFCOUNT_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:34:37 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F07457D78 for ; Thu, 25 Aug 2016 18:34:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3E41304043 for ; Thu, 25 Aug 2016 16:34:36 -0700 (PDT) X-ASG-Debug-ID: 1472168073-0bf57b53142092a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id fo4OtuvDVVtmHZYc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNYWpJ011962 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:34:32 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNYWp9000612 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:34:32 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNYVhg027604; Thu, 25 Aug 2016 23:34:32 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:31 -0700 Subject: [PATCH 23/71] xfs: create bmbt update intent log items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 23/71] xfs: create bmbt update intent log items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:34:26 -0700 Message-ID: <147216806641.867.8346721707766016003.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168073 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 20835 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create bmbt update intent/done log items to record redo information in the log. Because we roll transactions multiple times for reflink operations, we also have to track the status of the metadata updates that will be recorded in the post-roll transactions in case we crash before committing the final transaction. This mechanism enables log recovery to finish what was already started. v2: Only allow one item per BUI to simpify inode locking during recovery and to avoid exceeding the transaction reservation. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_log_format.h | 51 +++++ fs/xfs/xfs_bmap_item.c | 411 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_bmap_item.h | 91 +++++++++ fs/xfs/xfs_super.c | 19 ++ 5 files changed, 571 insertions(+), 2 deletions(-) create mode 100644 fs/xfs/xfs_bmap_item.c create mode 100644 fs/xfs/xfs_bmap_item.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 6a9ea9e..b850961 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -102,6 +102,7 @@ xfs-y += xfs_aops.o \ # low-level transaction/log code xfs-y += xfs_log.o \ xfs_log_cil.o \ + xfs_bmap_item.o \ xfs_buf_item.o \ xfs_extfree_item.o \ xfs_icreate_item.o \ diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index ebf5dc0..fffcc0f 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -114,7 +114,9 @@ static inline uint xlog_get_cycle(char *ptr) #define XLOG_REG_TYPE_RUD_FORMAT 22 #define XLOG_REG_TYPE_CUI_FORMAT 23 #define XLOG_REG_TYPE_CUD_FORMAT 24 -#define XLOG_REG_TYPE_MAX 24 +#define XLOG_REG_TYPE_BUI_FORMAT 25 +#define XLOG_REG_TYPE_BUD_FORMAT 26 +#define XLOG_REG_TYPE_MAX 26 /* * Flags to log operation header @@ -235,6 +237,8 @@ typedef struct xfs_trans_header { #define XFS_LI_RUD 0x1241 #define XFS_LI_CUI 0x1242 /* refcount update intent */ #define XFS_LI_CUD 0x1243 +#define XFS_LI_BUI 0x1244 /* bmbt update intent */ +#define XFS_LI_BUD 0x1245 #define XFS_LI_TYPE_DESC \ { XFS_LI_EFI, "XFS_LI_EFI" }, \ @@ -248,7 +252,9 @@ typedef struct xfs_trans_header { { XFS_LI_RUI, "XFS_LI_RUI" }, \ { XFS_LI_RUD, "XFS_LI_RUD" }, \ { XFS_LI_CUI, "XFS_LI_CUI" }, \ - { XFS_LI_CUD, "XFS_LI_CUD" } + { XFS_LI_CUD, "XFS_LI_CUD" }, \ + { XFS_LI_BUI, "XFS_LI_BUI" }, \ + { XFS_LI_BUD, "XFS_LI_BUD" } /* * Inode Log Item Format definitions. @@ -712,6 +718,47 @@ struct xfs_cud_log_format { }; /* + * BUI/BUD (inode block mapping) log format definitions + */ + +/* bmbt me_flags: upper bits are flags, lower byte is type code */ +#define XFS_BMAP_EXTENT_MAP 1 +#define XFS_BMAP_EXTENT_UNMAP 2 +#define XFS_BMAP_EXTENT_TYPE_MASK 0xFF + +#define XFS_BMAP_EXTENT_ATTR_FORK (1U << 31) +#define XFS_BMAP_EXTENT_UNWRITTEN (1U << 30) + +#define XFS_BMAP_EXTENT_FLAGS (XFS_BMAP_EXTENT_TYPE_MASK | \ + XFS_BMAP_EXTENT_ATTR_FORK | \ + XFS_BMAP_EXTENT_UNWRITTEN) + +/* + * This is the structure used to lay out an bui log item in the + * log. The bui_extents field is a variable size array whose + * size is given by bui_nextents. + */ +struct xfs_bui_log_format { + __uint16_t bui_type; /* bui log item type */ + __uint16_t bui_size; /* size of this item */ + __uint32_t bui_nextents; /* # extents to free */ + __uint64_t bui_id; /* bui identifier */ + struct xfs_map_extent bui_extents[1]; /* array of extents to bmap */ +}; + +/* + * This is the structure used to lay out an bud log item in the + * log. The bud_extents array is a variable size array whose + * size is given by bud_nextents; + */ +struct xfs_bud_log_format { + __uint16_t bud_type; /* bud log item type */ + __uint16_t bud_size; /* size of this item */ + __uint32_t __pad; + __uint64_t bud_bui_id; /* id of corresponding bui */ +}; + +/* * Dquot Log format definitions. * * The first two fields must be the type and size fitting into diff --git a/fs/xfs/xfs_bmap_item.c b/fs/xfs/xfs_bmap_item.c new file mode 100644 index 0000000..5eb86cf --- /dev/null +++ b/fs/xfs/xfs_bmap_item.c @@ -0,0 +1,411 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_mount.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_buf_item.h" +#include "xfs_bmap_item.h" +#include "xfs_log.h" + + +kmem_zone_t *xfs_bui_zone; +kmem_zone_t *xfs_bud_zone; + +static inline struct xfs_bui_log_item *BUI_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_bui_log_item, bui_item); +} + +void +xfs_bui_item_free( + struct xfs_bui_log_item *buip) +{ + kmem_zone_free(xfs_bui_zone, buip); +} + +/* + * This returns the number of iovecs needed to log the given bui item. + * We only need 1 iovec for an bui item. It just logs the bui_log_format + * structure. + */ +static inline int +xfs_bui_item_sizeof( + struct xfs_bui_log_item *buip) +{ + return sizeof(struct xfs_bui_log_format) + + (buip->bui_format.bui_nextents - 1) * + sizeof(struct xfs_map_extent); +} + +STATIC void +xfs_bui_item_size( + struct xfs_log_item *lip, + int *nvecs, + int *nbytes) +{ + *nvecs += 1; + *nbytes += xfs_bui_item_sizeof(BUI_ITEM(lip)); +} + +/* + * This is called to fill in the vector of log iovecs for the + * given bui log item. We use only 1 iovec, and we point that + * at the bui_log_format structure embedded in the bui item. + * It is at this point that we assert that all of the extent + * slots in the bui item have been filled. + */ +STATIC void +xfs_bui_item_format( + struct xfs_log_item *lip, + struct xfs_log_vec *lv) +{ + struct xfs_bui_log_item *buip = BUI_ITEM(lip); + struct xfs_log_iovec *vecp = NULL; + + ASSERT(atomic_read(&buip->bui_next_extent) == + buip->bui_format.bui_nextents); + + buip->bui_format.bui_type = XFS_LI_BUI; + buip->bui_format.bui_size = 1; + + xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_BUI_FORMAT, &buip->bui_format, + xfs_bui_item_sizeof(buip)); +} + +/* + * Pinning has no meaning for an bui item, so just return. + */ +STATIC void +xfs_bui_item_pin( + struct xfs_log_item *lip) +{ +} + +/* + * The unpin operation is the last place an BUI is manipulated in the log. It is + * either inserted in the AIL or aborted in the event of a log I/O error. In + * either case, the BUI transaction has been successfully committed to make it + * this far. Therefore, we expect whoever committed the BUI to either construct + * and commit the BUD or drop the BUD's reference in the event of error. Simply + * drop the log's BUI reference now that the log is done with it. + */ +STATIC void +xfs_bui_item_unpin( + struct xfs_log_item *lip, + int remove) +{ + struct xfs_bui_log_item *buip = BUI_ITEM(lip); + + xfs_bui_release(buip); +} + +/* + * BUI items have no locking or pushing. However, since BUIs are pulled from + * the AIL when their corresponding BUDs are committed to disk, their situation + * is very similar to being pinned. Return XFS_ITEM_PINNED so that the caller + * will eventually flush the log. This should help in getting the BUI out of + * the AIL. + */ +STATIC uint +xfs_bui_item_push( + struct xfs_log_item *lip, + struct list_head *buffer_list) +{ + return XFS_ITEM_PINNED; +} + +/* + * The BUI has been either committed or aborted if the transaction has been + * cancelled. If the transaction was cancelled, an BUD isn't going to be + * constructed and thus we free the BUI here directly. + */ +STATIC void +xfs_bui_item_unlock( + struct xfs_log_item *lip) +{ + if (lip->li_flags & XFS_LI_ABORTED) + xfs_bui_item_free(BUI_ITEM(lip)); +} + +/* + * The BUI is logged only once and cannot be moved in the log, so simply return + * the lsn at which it's been logged. + */ +STATIC xfs_lsn_t +xfs_bui_item_committed( + struct xfs_log_item *lip, + xfs_lsn_t lsn) +{ + return lsn; +} + +/* + * The BUI dependency tracking op doesn't do squat. It can't because + * it doesn't know where the free extent is coming from. The dependency + * tracking has to be handled by the "enclosing" metadata object. For + * example, for inodes, the inode is locked throughout the extent freeing + * so the dependency should be recorded there. + */ +STATIC void +xfs_bui_item_committing( + struct xfs_log_item *lip, + xfs_lsn_t lsn) +{ +} + +/* + * This is the ops vector shared by all bui log items. + */ +static const struct xfs_item_ops xfs_bui_item_ops = { + .iop_size = xfs_bui_item_size, + .iop_format = xfs_bui_item_format, + .iop_pin = xfs_bui_item_pin, + .iop_unpin = xfs_bui_item_unpin, + .iop_unlock = xfs_bui_item_unlock, + .iop_committed = xfs_bui_item_committed, + .iop_push = xfs_bui_item_push, + .iop_committing = xfs_bui_item_committing, +}; + +/* + * Allocate and initialize an bui item with the given number of extents. + */ +struct xfs_bui_log_item * +xfs_bui_init( + struct xfs_mount *mp) + +{ + struct xfs_bui_log_item *buip; + + buip = kmem_zone_zalloc(xfs_bui_zone, KM_SLEEP); + + xfs_log_item_init(mp, &buip->bui_item, XFS_LI_BUI, &xfs_bui_item_ops); + buip->bui_format.bui_nextents = XFS_BUI_MAX_FAST_EXTENTS; + buip->bui_format.bui_id = (uintptr_t)(void *)buip; + atomic_set(&buip->bui_next_extent, 0); + atomic_set(&buip->bui_refcount, 2); + + return buip; +} + +/* + * Copy an BUI format buffer from the given buf, and into the destination + * BUI format structure. The BUI/BUD items were designed not to need any + * special alignment handling. + */ +int +xfs_bui_copy_format( + struct xfs_log_iovec *buf, + struct xfs_bui_log_format *dst_bui_fmt) +{ + struct xfs_bui_log_format *src_bui_fmt; + uint len; + + src_bui_fmt = buf->i_addr; + len = sizeof(struct xfs_bui_log_format) + + (src_bui_fmt->bui_nextents - 1) * + sizeof(struct xfs_map_extent); + + if (buf->i_len == len) { + memcpy((char *)dst_bui_fmt, (char *)src_bui_fmt, len); + return 0; + } + return -EFSCORRUPTED; +} + +/* + * Freeing the BUI requires that we remove it from the AIL if it has already + * been placed there. However, the BUI may not yet have been placed in the AIL + * when called by xfs_bui_release() from BUD processing due to the ordering of + * committed vs unpin operations in bulk insert operations. Hence the reference + * count to ensure only the last caller frees the BUI. + */ +void +xfs_bui_release( + struct xfs_bui_log_item *buip) +{ + if (atomic_dec_and_test(&buip->bui_refcount)) { + xfs_trans_ail_remove(&buip->bui_item, SHUTDOWN_LOG_IO_ERROR); + xfs_bui_item_free(buip); + } +} + +static inline struct xfs_bud_log_item *BUD_ITEM(struct xfs_log_item *lip) +{ + return container_of(lip, struct xfs_bud_log_item, bud_item); +} + +STATIC void +xfs_bud_item_size( + struct xfs_log_item *lip, + int *nvecs, + int *nbytes) +{ + *nvecs += 1; + *nbytes += sizeof(struct xfs_bud_log_format); +} + +/* + * This is called to fill in the vector of log iovecs for the + * given bud log item. We use only 1 iovec, and we point that + * at the bud_log_format structure embedded in the bud item. + * It is at this point that we assert that all of the extent + * slots in the bud item have been filled. + */ +STATIC void +xfs_bud_item_format( + struct xfs_log_item *lip, + struct xfs_log_vec *lv) +{ + struct xfs_bud_log_item *budp = BUD_ITEM(lip); + struct xfs_log_iovec *vecp = NULL; + + budp->bud_format.bud_type = XFS_LI_BUD; + budp->bud_format.bud_size = 1; + + xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_BUD_FORMAT, &budp->bud_format, + sizeof(struct xfs_bud_log_format)); +} + +/* + * Pinning has no meaning for an bud item, so just return. + */ +STATIC void +xfs_bud_item_pin( + struct xfs_log_item *lip) +{ +} + +/* + * Since pinning has no meaning for an bud item, unpinning does + * not either. + */ +STATIC void +xfs_bud_item_unpin( + struct xfs_log_item *lip, + int remove) +{ +} + +/* + * There isn't much you can do to push on an bud item. It is simply stuck + * waiting for the log to be flushed to disk. + */ +STATIC uint +xfs_bud_item_push( + struct xfs_log_item *lip, + struct list_head *buffer_list) +{ + return XFS_ITEM_PINNED; +} + +/* + * The BUD is either committed or aborted if the transaction is cancelled. If + * the transaction is cancelled, drop our reference to the BUI and free the + * BUD. + */ +STATIC void +xfs_bud_item_unlock( + struct xfs_log_item *lip) +{ + struct xfs_bud_log_item *budp = BUD_ITEM(lip); + + if (lip->li_flags & XFS_LI_ABORTED) { + xfs_bui_release(budp->bud_buip); + kmem_zone_free(xfs_bud_zone, budp); + } +} + +/* + * When the bud item is committed to disk, all we need to do is delete our + * reference to our partner bui item and then free ourselves. Since we're + * freeing ourselves we must return -1 to keep the transaction code from + * further referencing this item. + */ +STATIC xfs_lsn_t +xfs_bud_item_committed( + struct xfs_log_item *lip, + xfs_lsn_t lsn) +{ + struct xfs_bud_log_item *budp = BUD_ITEM(lip); + + /* + * Drop the BUI reference regardless of whether the BUD has been + * aborted. Once the BUD transaction is constructed, it is the sole + * responsibility of the BUD to release the BUI (even if the BUI is + * aborted due to log I/O error). + */ + xfs_bui_release(budp->bud_buip); + kmem_zone_free(xfs_bud_zone, budp); + + return (xfs_lsn_t)-1; +} + +/* + * The BUD dependency tracking op doesn't do squat. It can't because + * it doesn't know where the free extent is coming from. The dependency + * tracking has to be handled by the "enclosing" metadata object. For + * example, for inodes, the inode is locked throughout the extent freeing + * so the dependency should be recorded there. + */ +STATIC void +xfs_bud_item_committing( + struct xfs_log_item *lip, + xfs_lsn_t lsn) +{ +} + +/* + * This is the ops vector shared by all bud log items. + */ +static const struct xfs_item_ops xfs_bud_item_ops = { + .iop_size = xfs_bud_item_size, + .iop_format = xfs_bud_item_format, + .iop_pin = xfs_bud_item_pin, + .iop_unpin = xfs_bud_item_unpin, + .iop_unlock = xfs_bud_item_unlock, + .iop_committed = xfs_bud_item_committed, + .iop_push = xfs_bud_item_push, + .iop_committing = xfs_bud_item_committing, +}; + +/* + * Allocate and initialize an bud item with the given number of extents. + */ +struct xfs_bud_log_item * +xfs_bud_init( + struct xfs_mount *mp, + struct xfs_bui_log_item *buip) + +{ + struct xfs_bud_log_item *budp; + + budp = kmem_zone_zalloc(xfs_bud_zone, KM_SLEEP); + xfs_log_item_init(mp, &budp->bud_item, XFS_LI_BUD, &xfs_bud_item_ops); + budp->bud_buip = buip; + budp->bud_format.bud_bui_id = buip->bui_format.bui_id; + + return budp; +} diff --git a/fs/xfs/xfs_bmap_item.h b/fs/xfs/xfs_bmap_item.h new file mode 100644 index 0000000..8646428 --- /dev/null +++ b/fs/xfs/xfs_bmap_item.h @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_BMAP_ITEM_H__ +#define __XFS_BMAP_ITEM_H__ + +/* + * There are (currently) two pairs of bmap btree redo item types: map & unmap. + * The common abbreviations for these are BUI (bmap update intent) and BUD + * (bmap update done). The redo item type is encoded in the flags field of + * each xfs_map_extent. + * + * *I items should be recorded in the *first* of a series of rolled + * transactions, and the *D items should be recorded in the same transaction + * that records the associated bmbt updates. + * + * Should the system crash after the commit of the first transaction but + * before the commit of the final transaction in a series, log recovery will + * use the redo information recorded by the intent items to replay the + * bmbt metadata updates in the non-first transaction. + */ + +/* kernel only BUI/BUD definitions */ + +struct xfs_mount; +struct kmem_zone; + +/* + * Max number of extents in fast allocation path. + */ +#define XFS_BUI_MAX_FAST_EXTENTS 1 + +/* + * Define BUI flag bits. Manipulated by set/clear/test_bit operators. + */ +#define XFS_BUI_RECOVERED 1 + +/* + * This is the "bmap update intent" log item. It is used to log the fact that + * some reverse mappings need to change. It is used in conjunction with the + * "bmap update done" log item described below. + * + * These log items follow the same rules as struct xfs_efi_log_item; see the + * comments about that structure (in xfs_extfree_item.h) for more details. + */ +struct xfs_bui_log_item { + struct xfs_log_item bui_item; + atomic_t bui_refcount; + atomic_t bui_next_extent; + unsigned long bui_flags; /* misc flags */ + struct xfs_bui_log_format bui_format; +}; + +/* + * This is the "bmap update done" log item. It is used to log the fact that + * some bmbt updates mentioned in an earlier bui item have been performed. + */ +struct xfs_bud_log_item { + struct xfs_log_item bud_item; + struct xfs_bui_log_item *bud_buip; + struct xfs_bud_log_format bud_format; +}; + +extern struct kmem_zone *xfs_bui_zone; +extern struct kmem_zone *xfs_bud_zone; + +struct xfs_bui_log_item *xfs_bui_init(struct xfs_mount *); +struct xfs_bud_log_item *xfs_bud_init(struct xfs_mount *, + struct xfs_bui_log_item *); +int xfs_bui_copy_format(struct xfs_log_iovec *buf, + struct xfs_bui_log_format *dst_bui_fmt); +void xfs_bui_item_free(struct xfs_bui_log_item *); +void xfs_bui_release(struct xfs_bui_log_item *); + +#endif /* __XFS_BMAP_ITEM_H__ */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index a027e27..ba73c562 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -48,6 +48,7 @@ #include "xfs_ondisk.h" #include "xfs_rmap_item.h" #include "xfs_refcount_item.h" +#include "xfs_bmap_item.h" #include #include @@ -1802,8 +1803,24 @@ xfs_init_zones(void) if (!xfs_cui_zone) goto out_destroy_cud_zone; + xfs_bud_zone = kmem_zone_init(sizeof(struct xfs_bud_log_item), + "xfs_bud_item"); + if (!xfs_bud_zone) + goto out_destroy_cui_zone; + + xfs_bui_zone = kmem_zone_init((sizeof(struct xfs_bui_log_item) + + ((XFS_BUI_MAX_FAST_EXTENTS - 1) * + sizeof(struct xfs_map_extent))), + "xfs_bui_item"); + if (!xfs_bui_zone) + goto out_destroy_bud_zone; + return 0; + out_destroy_bud_zone: + kmem_zone_destroy(xfs_bud_zone); + out_destroy_cui_zone: + kmem_zone_destroy(xfs_cui_zone); out_destroy_cud_zone: kmem_zone_destroy(xfs_cud_zone); out_destroy_rui_zone: @@ -1850,6 +1867,8 @@ xfs_destroy_zones(void) * destroy caches. */ rcu_barrier(); + kmem_zone_destroy(xfs_bui_zone); + kmem_zone_destroy(xfs_bud_zone); kmem_zone_destroy(xfs_cui_zone); kmem_zone_destroy(xfs_cud_zone); kmem_zone_destroy(xfs_rui_zone); From darrick.wong@oracle.com Thu Aug 25 18:34:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_LOLITA1, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 852F57D8B for ; Thu, 25 Aug 2016 18:34:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2EF138F8033 for ; Thu, 25 Aug 2016 16:34:44 -0700 (PDT) X-ASG-Debug-ID: 1472168081-0bf8155c741e68b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id XvAtieKYSXY4o6Mt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNYdWQ012037 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:40 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYdOW005344 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:39 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYcjQ029079; Thu, 25 Aug 2016 23:34:38 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:37 -0700 Subject: [PATCH 24/71] xfs: log bmap intent items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 24/71] xfs: log bmap intent items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:34:36 -0700 Message-ID: <147216807650.867.6465129921731006694.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168081 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15412 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide a mechanism for higher levels to create BUI/BUD items, submit them to the log, and a stub function to deal with recovered BUI items. These parts will be connected to the rmapbt in a later patch. v2: Only support one item per BUI. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_bmap.h | 13 ++++ fs/xfs/xfs_bmap_item.c | 65 ++++++++++++++++++++ fs/xfs/xfs_bmap_item.h | 1 fs/xfs/xfs_log_recover.c | 153 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_trans.h | 13 ++++ fs/xfs/xfs_trans_bmap.c | 109 +++++++++++++++++++++++++++++++++ 7 files changed, 355 insertions(+) create mode 100644 fs/xfs/xfs_trans_bmap.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index b850961..6afb228 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -111,6 +111,7 @@ xfs-y += xfs_log.o \ xfs_rmap_item.o \ xfs_log_recover.o \ xfs_trans_ail.o \ + xfs_trans_bmap.o \ xfs_trans_buf.o \ xfs_trans_extfree.o \ xfs_trans_inode.o \ diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 254034f..d77a513 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -203,4 +203,17 @@ int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, int num_exts); int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset); +enum xfs_bmap_intent_type { + XFS_BMAP_MAP, + XFS_BMAP_UNMAP, +}; + +struct xfs_bmap_intent { + struct list_head bi_list; + enum xfs_bmap_intent_type bi_type; + struct xfs_inode *bi_owner; + int bi_whichfork; + struct xfs_bmbt_irec bi_bmap; +}; + #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_item.c b/fs/xfs/xfs_bmap_item.c index 5eb86cf..d192b57 100644 --- a/fs/xfs/xfs_bmap_item.c +++ b/fs/xfs/xfs_bmap_item.c @@ -22,6 +22,7 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" +#include "xfs_bit.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" @@ -409,3 +410,67 @@ xfs_bud_init( return budp; } + +/* + * Process a bmap update intent item that was recovered from the log. + * We need to update some inode's bmbt. + */ +int +xfs_bui_recover( + struct xfs_mount *mp, + struct xfs_bui_log_item *buip) +{ + int error = 0; + struct xfs_map_extent *bmap; + xfs_fsblock_t startblock_fsb; + xfs_fsblock_t inode_fsb; + bool op_ok; + + ASSERT(!test_bit(XFS_BUI_RECOVERED, &buip->bui_flags)); + + /* Only one mapping operation per BUI... */ + if (buip->bui_format.bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) { + set_bit(XFS_BUI_RECOVERED, &buip->bui_flags); + xfs_bui_release(buip); + return -EIO; + } + + /* + * First check the validity of the extent described by the + * BUI. If anything is bad, then toss the BUI. + */ + bmap = &buip->bui_format.bui_extents[0]; + startblock_fsb = XFS_BB_TO_FSB(mp, + XFS_FSB_TO_DADDR(mp, bmap->me_startblock)); + inode_fsb = XFS_BB_TO_FSB(mp, XFS_FSB_TO_DADDR(mp, + XFS_INO_TO_FSB(mp, bmap->me_owner))); + switch (bmap->me_flags & XFS_BMAP_EXTENT_TYPE_MASK) { + case XFS_BMAP_EXTENT_MAP: + case XFS_BMAP_EXTENT_UNMAP: + op_ok = true; + break; + default: + op_ok = false; + break; + } + if (!op_ok || startblock_fsb == 0 || + bmap->me_len == 0 || + inode_fsb == 0 || + startblock_fsb >= mp->m_sb.sb_dblocks || + bmap->me_len >= mp->m_sb.sb_agblocks || + inode_fsb >= mp->m_sb.sb_agblocks || + (bmap->me_flags & ~XFS_BMAP_EXTENT_FLAGS)) { + /* + * This will pull the BUI from the AIL and + * free the memory associated with it. + */ + set_bit(XFS_BUI_RECOVERED, &buip->bui_flags); + xfs_bui_release(buip); + return -EIO; + } + + /* XXX: do nothing for now */ + set_bit(XFS_BUI_RECOVERED, &buip->bui_flags); + xfs_bui_release(buip); + return error; +} diff --git a/fs/xfs/xfs_bmap_item.h b/fs/xfs/xfs_bmap_item.h index 8646428..452181b 100644 --- a/fs/xfs/xfs_bmap_item.h +++ b/fs/xfs/xfs_bmap_item.h @@ -87,5 +87,6 @@ int xfs_bui_copy_format(struct xfs_log_iovec *buf, struct xfs_bui_log_format *dst_bui_fmt); void xfs_bui_item_free(struct xfs_bui_log_item *); void xfs_bui_release(struct xfs_bui_log_item *); +int xfs_bui_recover(struct xfs_mount *mp, struct xfs_bui_log_item *buip); #endif /* __XFS_BMAP_ITEM_H__ */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 0acc96e..37673d6 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -45,6 +45,7 @@ #include "xfs_dir2.h" #include "xfs_rmap_item.h" #include "xfs_refcount_item.h" +#include "xfs_bmap_item.h" #define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) @@ -1917,6 +1918,8 @@ xlog_recover_reorder_trans( case XFS_LI_RUD: case XFS_LI_CUI: case XFS_LI_CUD: + case XFS_LI_BUI: + case XFS_LI_BUD: trace_xfs_log_recover_item_reorder_tail(log, trans, item, pass); list_move_tail(&item->ri_list, &inode_list); @@ -3615,6 +3618,101 @@ xlog_recover_cud_pass2( } /* + * This routine is called to create an in-core extent bmap update + * item from the bui format structure which was logged on disk. + * It allocates an in-core bui, copies the extents from the format + * structure into it, and adds the bui to the AIL with the given + * LSN. + */ +STATIC int +xlog_recover_bui_pass2( + struct xlog *log, + struct xlog_recover_item *item, + xfs_lsn_t lsn) +{ + int error; + struct xfs_mount *mp = log->l_mp; + struct xfs_bui_log_item *buip; + struct xfs_bui_log_format *bui_formatp; + + bui_formatp = item->ri_buf[0].i_addr; + + if (bui_formatp->bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) + return -EFSCORRUPTED; + buip = xfs_bui_init(mp); + error = xfs_bui_copy_format(&item->ri_buf[0], &buip->bui_format); + if (error) { + xfs_bui_item_free(buip); + return error; + } + atomic_set(&buip->bui_next_extent, bui_formatp->bui_nextents); + + spin_lock(&log->l_ailp->xa_lock); + /* + * The RUI has two references. One for the RUD and one for RUI to ensure + * it makes it into the AIL. Insert the RUI into the AIL directly and + * drop the RUI reference. Note that xfs_trans_ail_update() drops the + * AIL lock. + */ + xfs_trans_ail_update(log->l_ailp, &buip->bui_item, lsn); + xfs_bui_release(buip); + return 0; +} + + +/* + * This routine is called when an BUD format structure is found in a committed + * transaction in the log. Its purpose is to cancel the corresponding BUI if it + * was still in the log. To do this it searches the AIL for the BUI with an id + * equal to that in the BUD format structure. If we find it we drop the BUD + * reference, which removes the BUI from the AIL and frees it. + */ +STATIC int +xlog_recover_bud_pass2( + struct xlog *log, + struct xlog_recover_item *item) +{ + struct xfs_bud_log_format *bud_formatp; + struct xfs_bui_log_item *buip = NULL; + struct xfs_log_item *lip; + __uint64_t bui_id; + struct xfs_ail_cursor cur; + struct xfs_ail *ailp = log->l_ailp; + + bud_formatp = item->ri_buf[0].i_addr; + ASSERT(item->ri_buf[0].i_len == sizeof(struct xfs_bud_log_format)); + bui_id = bud_formatp->bud_bui_id; + + /* + * Search for the BUI with the id in the BUD format structure in the + * AIL. + */ + spin_lock(&ailp->xa_lock); + lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); + while (lip != NULL) { + if (lip->li_type == XFS_LI_BUI) { + buip = (struct xfs_bui_log_item *)lip; + if (buip->bui_format.bui_id == bui_id) { + /* + * Drop the BUD reference to the BUI. This + * removes the BUI from the AIL and frees it. + */ + spin_unlock(&ailp->xa_lock); + xfs_bui_release(buip); + spin_lock(&ailp->xa_lock); + break; + } + } + lip = xfs_trans_ail_cursor_next(ailp, &cur); + } + + xfs_trans_ail_cursor_done(&cur); + spin_unlock(&ailp->xa_lock); + + return 0; +} + +/* * This routine is called when an inode create format structure is found in a * committed transaction in the log. It's purpose is to initialise the inodes * being allocated on disk. This requires us to get inode cluster buffers that @@ -3843,6 +3941,8 @@ xlog_recover_ra_pass2( case XFS_LI_RUD: case XFS_LI_CUI: case XFS_LI_CUD: + case XFS_LI_BUI: + case XFS_LI_BUD: default: break; } @@ -3870,6 +3970,8 @@ xlog_recover_commit_pass1( case XFS_LI_RUD: case XFS_LI_CUI: case XFS_LI_CUD: + case XFS_LI_BUI: + case XFS_LI_BUD: /* nothing to do in pass 1 */ return 0; default: @@ -3908,6 +4010,10 @@ xlog_recover_commit_pass2( return xlog_recover_cui_pass2(log, item, trans->r_lsn); case XFS_LI_CUD: return xlog_recover_cud_pass2(log, item); + case XFS_LI_BUI: + return xlog_recover_bui_pass2(log, item, trans->r_lsn); + case XFS_LI_BUD: + return xlog_recover_bud_pass2(log, item); case XFS_LI_DQUOT: return xlog_recover_dquot_pass2(log, buffer_list, item, trans->r_lsn); @@ -4500,6 +4606,46 @@ xlog_recover_cancel_cui( spin_lock(&ailp->xa_lock); } +/* Recover the BUI if necessary. */ +STATIC int +xlog_recover_process_bui( + struct xfs_mount *mp, + struct xfs_ail *ailp, + struct xfs_log_item *lip) +{ + struct xfs_bui_log_item *buip; + int error; + + /* + * Skip BUIs that we've already processed. + */ + buip = container_of(lip, struct xfs_bui_log_item, bui_item); + if (test_bit(XFS_BUI_RECOVERED, &buip->bui_flags)) + return 0; + + spin_unlock(&ailp->xa_lock); + error = xfs_bui_recover(mp, buip); + spin_lock(&ailp->xa_lock); + + return error; +} + +/* Release the BUI since we're cancelling everything. */ +STATIC void +xlog_recover_cancel_bui( + struct xfs_mount *mp, + struct xfs_ail *ailp, + struct xfs_log_item *lip) +{ + struct xfs_bui_log_item *buip; + + buip = container_of(lip, struct xfs_bui_log_item, bui_item); + + spin_unlock(&ailp->xa_lock); + xfs_bui_release(buip); + spin_lock(&ailp->xa_lock); +} + /* Is this log item a deferred action intent? */ static inline bool xlog_item_is_intent(struct xfs_log_item *lip) { @@ -4507,6 +4653,7 @@ static inline bool xlog_item_is_intent(struct xfs_log_item *lip) case XFS_LI_EFI: case XFS_LI_RUI: case XFS_LI_CUI: + case XFS_LI_BUI: return true; default: return false; @@ -4573,6 +4720,9 @@ xlog_recover_process_intents( case XFS_LI_CUI: error = xlog_recover_process_cui(log->l_mp, ailp, lip); break; + case XFS_LI_BUI: + error = xlog_recover_process_bui(log->l_mp, ailp, lip); + break; } if (error) goto out; @@ -4623,6 +4773,9 @@ xlog_recover_cancel_intents( case XFS_LI_CUI: xlog_recover_cancel_cui(log->l_mp, ailp, lip); break; + case XFS_LI_BUI: + xlog_recover_cancel_bui(log->l_mp, ailp, lip); + break; } lip = xfs_trans_ail_cursor_next(ailp, &cur); diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index a7a87d2..7cf02d3 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -39,6 +39,7 @@ struct xfs_btree_cur; struct xfs_cui_log_item; struct xfs_cud_log_item; struct xfs_defer_ops; +struct xfs_bui_log_item; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ @@ -263,4 +264,16 @@ int xfs_trans_log_finish_refcount_update(struct xfs_trans *tp, xfs_extlen_t blockcount, xfs_extlen_t *adjusted, struct xfs_btree_cur **pcur); +/* mapping updates */ +enum xfs_bmap_intent_type; + +void xfs_bmap_update_init_defer_op(void); +struct xfs_bud_log_item *xfs_trans_get_bud(struct xfs_trans *tp, + struct xfs_bui_log_item *buip); +int xfs_trans_log_finish_bmap_update(struct xfs_trans *tp, + struct xfs_bud_log_item *rudp, struct xfs_defer_ops *dfops, + enum xfs_bmap_intent_type type, struct xfs_inode *ip, + int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, + xfs_filblks_t blockcount, xfs_exntst_t state); + #endif /* __XFS_TRANS_H__ */ diff --git a/fs/xfs/xfs_trans_bmap.c b/fs/xfs/xfs_trans_bmap.c new file mode 100644 index 0000000..3f21c57 --- /dev/null +++ b/fs/xfs/xfs_trans_bmap.c @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_bmap_item.h" +#include "xfs_alloc.h" +#include "xfs_bmap.h" +#include "xfs_inode.h" + +/* Set the map extent flags for this mapping. */ +static void +xfs_trans_set_bmap_flags( + struct xfs_map_extent *bmap, + enum xfs_bmap_intent_type type, + int whichfork, + xfs_exntst_t state) +{ + bmap->me_flags = 0; + if (state == XFS_EXT_UNWRITTEN) + bmap->me_flags |= XFS_BMAP_EXTENT_UNWRITTEN; + if (whichfork == XFS_ATTR_FORK) + bmap->me_flags |= XFS_BMAP_EXTENT_ATTR_FORK; + switch (type) { + case XFS_BMAP_MAP: + bmap->me_flags |= XFS_BMAP_EXTENT_MAP; + break; + case XFS_BMAP_UNMAP: + bmap->me_flags |= XFS_BMAP_EXTENT_UNMAP; + break; + default: + ASSERT(0); + } +} + +/* + * This routine is called to allocate a "bmap update done" + * log item. + */ +struct xfs_bud_log_item * +xfs_trans_get_bud( + struct xfs_trans *tp, + struct xfs_bui_log_item *buip) +{ + struct xfs_bud_log_item *budp; + + budp = xfs_bud_init(tp->t_mountp, buip); + xfs_trans_add_item(tp, &budp->bud_item); + return budp; +} + +/* + * Finish an bmap update and log it to the BUD. Note that the + * transaction is marked dirty regardless of whether the bmap update + * succeeds or fails to support the BUI/BUD lifecycle rules. + */ +int +xfs_trans_log_finish_bmap_update( + struct xfs_trans *tp, + struct xfs_bud_log_item *budp, + struct xfs_defer_ops *dop, + enum xfs_bmap_intent_type type, + struct xfs_inode *ip, + int whichfork, + xfs_fileoff_t startoff, + xfs_fsblock_t startblock, + xfs_filblks_t blockcount, + xfs_exntst_t state) +{ + int error; + + error = -EFSCORRUPTED; + + /* + * Mark the transaction dirty, even on error. This ensures the + * transaction is aborted, which: + * + * 1.) releases the BUI and frees the BUD + * 2.) shuts down the filesystem + */ + tp->t_flags |= XFS_TRANS_DIRTY; + budp->bud_item.li_desc->lid_flags |= XFS_LID_DIRTY; + + return error; +} From darrick.wong@oracle.com Thu Aug 25 18:34:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 485F77D94 for ; Thu, 25 Aug 2016 18:34:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08182304059 for ; Thu, 25 Aug 2016 16:34:49 -0700 (PDT) X-ASG-Debug-ID: 1472168087-0bf57c55b11c7820001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zuXfGKlDUX493oa6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNYjlS012114 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:46 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYjVm005536 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:45 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYi3D029093; Thu, 25 Aug 2016 23:34:44 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:44 -0700 Subject: [PATCH 25/71] xfs: map an inode's offset to an exact physical block From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 25/71] xfs: map an inode's offset to an exact physical block To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:34:42 -0700 Message-ID: <147216808283.867.18437648454056324743.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168087 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6452 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Teach the bmap routine to know how to map a range of file blocks to a specific range of physical blocks, instead of simply allocating fresh blocks. This enables reflink to map a file to blocks that are already in use. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_bmap.h | 10 +++++++ fs/xfs/xfs_trace.h | 54 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 5e0c9ec..7f525b9 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -3873,6 +3873,55 @@ xfs_bmap_btalloc( } /* + * For a remap operation, just "allocate" an extent at the address that the + * caller passed in, and ensure that the AGFL is the right size. The caller + * will then map the "allocated" extent into the file somewhere. + */ +STATIC int +xfs_bmap_remap_alloc( + struct xfs_bmalloca *ap) +{ + struct xfs_trans *tp = ap->tp; + struct xfs_mount *mp = tp->t_mountp; + xfs_agblock_t bno; + struct xfs_alloc_arg args; + int error; + + /* + * validate that the block number is legal - the enables us to detect + * and handle a silent filesystem corruption rather than crashing. + */ + memset(&args, 0, sizeof(struct xfs_alloc_arg)); + args.tp = ap->tp; + args.mp = ap->tp->t_mountp; + bno = *ap->firstblock; + args.agno = XFS_FSB_TO_AGNO(mp, bno); + ASSERT(args.agno < mp->m_sb.sb_agcount); + args.agbno = XFS_FSB_TO_AGBNO(mp, bno); + ASSERT(args.agbno < mp->m_sb.sb_agblocks); + + /* "Allocate" the extent from the range we passed in. */ + trace_xfs_bmap_remap_alloc(ap->ip, *ap->firstblock, ap->length); + ap->blkno = bno; + ap->ip->i_d.di_nblocks += ap->length; + xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); + + /* Fix the freelist, like a real allocator does. */ + args.userdata = 1; + args.pag = xfs_perag_get(args.mp, args.agno); + ASSERT(args.pag); + + error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING); + if (error) + goto error0; +error0: + xfs_perag_put(args.pag); + if (error) + trace_xfs_bmap_remap_alloc_error(ap->ip, error, _RET_IP_); + return error; +} + +/* * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. * It figures out where to ask the underlying allocator to put the new extent. */ @@ -3880,6 +3929,8 @@ STATIC int xfs_bmap_alloc( struct xfs_bmalloca *ap) /* bmap alloc argument struct */ { + if (ap->flags & XFS_BMAPI_REMAP) + return xfs_bmap_remap_alloc(ap); if (XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata) return xfs_bmap_rtalloc(ap); return xfs_bmap_btalloc(ap); @@ -4516,6 +4567,12 @@ xfs_bmapi_write( ASSERT(len > 0); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + if (whichfork == XFS_ATTR_FORK) + ASSERT(!(flags & XFS_BMAPI_REMAP)); + if (flags & XFS_BMAPI_REMAP) { + ASSERT(!(flags & XFS_BMAPI_PREALLOC)); + ASSERT(!(flags & XFS_BMAPI_CONVERT)); + } /* zeroing is for currently only for data extents, not metadata */ ASSERT((flags & (XFS_BMAPI_METADATA | XFS_BMAPI_ZERO)) != @@ -4577,6 +4634,12 @@ xfs_bmapi_write( wasdelay = !inhole && isnullstartblock(bma.got.br_startblock); /* + * Make sure we only reflink into a hole. + */ + if (flags & XFS_BMAPI_REMAP) + ASSERT(inhole); + + /* * First, deal with the hole before the allocated space * that we found, if any. */ diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index d77a513..76b19ba 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -97,6 +97,13 @@ struct xfs_extent_free_item */ #define XFS_BMAPI_ZERO 0x080 +/* + * Map the inode offset to the block given in ap->firstblock. Primarily + * used for reflink. The range must be in a hole, and this flag cannot be + * turned on with PREALLOC or CONVERT, and cannot be used on the attr fork. + */ +#define XFS_BMAPI_REMAP 0x100 + #define XFS_BMAPI_FLAGS \ { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ { XFS_BMAPI_METADATA, "METADATA" }, \ @@ -105,7 +112,8 @@ struct xfs_extent_free_item { XFS_BMAPI_IGSTATE, "IGSTATE" }, \ { XFS_BMAPI_CONTIG, "CONTIG" }, \ { XFS_BMAPI_CONVERT, "CONVERT" }, \ - { XFS_BMAPI_ZERO, "ZERO" } + { XFS_BMAPI_ZERO, "ZERO" }, \ + { XFS_BMAPI_REMAP, "REMAP" } static inline int xfs_bmapi_aflag(int w) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 6175003..4324ada 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2939,6 +2939,60 @@ TRACE_EVENT(xfs_refcount_finish_one_leftover, __entry->adjusted) ); +/* simple inode-based error/%ip tracepoint class */ +DECLARE_EVENT_CLASS(xfs_inode_error_class, + TP_PROTO(struct xfs_inode *ip, int error, unsigned long caller_ip), + TP_ARGS(ip, error, caller_ip), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(int, error) + __field(unsigned long, caller_ip) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->error = error; + __entry->caller_ip = caller_ip; + ), + TP_printk("dev %d:%d ino %llx error %d caller %ps", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->error, + (char *)__entry->caller_ip) +); + +#define DEFINE_INODE_ERROR_EVENT(name) \ +DEFINE_EVENT(xfs_inode_error_class, name, \ + TP_PROTO(struct xfs_inode *ip, int error, \ + unsigned long caller_ip), \ + TP_ARGS(ip, error, caller_ip)) + +/* reflink allocator */ +TRACE_EVENT(xfs_bmap_remap_alloc, + TP_PROTO(struct xfs_inode *ip, xfs_fsblock_t fsbno, + xfs_extlen_t len), + TP_ARGS(ip, fsbno, len), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_fsblock_t, fsbno) + __field(xfs_extlen_t, len) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->fsbno = fsbno; + __entry->len = len; + ), + TP_printk("dev %d:%d ino 0x%llx fsbno 0x%llx len %x", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->fsbno, + __entry->len) +); +DEFINE_INODE_ERROR_EVENT(xfs_bmap_remap_alloc_error); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH From darrick.wong@oracle.com Thu Aug 25 18:34:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9F67F7D8B for ; Thu, 25 Aug 2016 18:34:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 002B5AC002 for ; Thu, 25 Aug 2016 16:34:55 -0700 (PDT) X-ASG-Debug-ID: 1472168093-0bf57b53112092c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Pz1KUn42dUIQIeLY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:54 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNYqNX012165 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:34:52 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNYqFC016023 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:52 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYo9g014191; Thu, 25 Aug 2016 23:34:51 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:50 -0700 Subject: [PATCH 26/71] xfs: pass bmapi flags through to bmap_del_extent From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 26/71] xfs: pass bmapi flags through to bmap_del_extent To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:34:49 -0700 Message-ID: <147216808906.867.6443731652289216675.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168094 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2512 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Pass BMAPI_ flags from bunmapi into bmap_del_extent and extend BMAPI_REMAP (which means "don't touch the allocator or the quota accounting") to apply to bunmapi as well. This will be used to implement the unmap operation, which will be used by swapext. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 9 +++++---- fs/xfs/libxfs/xfs_bmap.h | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 7f525b9..2aa7eb6 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -4834,7 +4834,8 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *del, /* data to remove from extents */ int *logflagsp, /* inode logging flags */ - int whichfork) /* data or attr fork */ + int whichfork, /* data or attr fork */ + int bflags) /* bmapi flags */ { xfs_filblks_t da_new; /* new delay-alloc indirect blocks */ xfs_filblks_t da_old; /* old delay-alloc indirect blocks */ @@ -5126,7 +5127,7 @@ xfs_bmap_del_extent( /* * If we need to, add to list of extents to delete. */ - if (do_fx) { + if (do_fx && !(bflags & XFS_BMAPI_REMAP)) { if (xfs_is_reflink_inode(ip) && whichfork == XFS_DATA_FORK) { error = xfs_refcount_decrease_extent(mp, dfops, del); if (error) @@ -5144,7 +5145,7 @@ xfs_bmap_del_extent( /* * Adjust quota data. */ - if (qfield) + if (qfield && !(bflags & XFS_BMAPI_REMAP)) xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks); /* @@ -5469,7 +5470,7 @@ xfs_bunmapi( cur->bc_private.b.flags &= ~XFS_BTCUR_BPRV_WASDEL; error = xfs_bmap_del_extent(ip, tp, &lastx, dfops, cur, &del, - &tmp_logflags, whichfork); + &tmp_logflags, whichfork, flags); logflags |= tmp_logflags; if (error) goto error0; diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 76b19ba..1a5d5f4 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -101,6 +101,9 @@ struct xfs_extent_free_item * Map the inode offset to the block given in ap->firstblock. Primarily * used for reflink. The range must be in a hole, and this flag cannot be * turned on with PREALLOC or CONVERT, and cannot be used on the attr fork. + * + * For bunmapi, this flag unmaps the range without adjusting quota, reducing + * refcount, or freeing the blocks. */ #define XFS_BMAPI_REMAP 0x100 From darrick.wong@oracle.com Thu Aug 25 18:35:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 55D9C7D94 for ; Thu, 25 Aug 2016 18:35:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A1A76AC001 for ; Thu, 25 Aug 2016 16:35:02 -0700 (PDT) X-ASG-Debug-ID: 1472168098-0bf57b53132092d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id AScoaIRT7Z8MROES (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:34:59 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNYvoe019027 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:57 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYvf2005914 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:34:57 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNYvrX014227; Thu, 25 Aug 2016 23:34:57 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:34:56 -0700 Subject: [PATCH 27/71] xfs: implement deferred bmbt map/unmap operations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 27/71] xfs: implement deferred bmbt map/unmap operations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:34:55 -0700 Message-ID: <147216809522.867.17109256595026376153.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168099 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14879 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Implement deferred versions of the inode block map/unmap functions. These will be used in subsequent patches to make reflink operations atomic. v2: Only allow one item per BUI, and implement unmap too. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 141 ++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_bmap.h | 11 +++ fs/xfs/libxfs/xfs_defer.h | 1 fs/xfs/xfs_bmap_item.c | 71 ++++++++++++++++++++++ fs/xfs/xfs_error.h | 4 + fs/xfs/xfs_super.c | 1 fs/xfs/xfs_trace.h | 5 ++ fs/xfs/xfs_trans.h | 1 fs/xfs/xfs_trans_bmap.c | 144 +++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 375 insertions(+), 4 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 2aa7eb6..6272cf6 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -6131,3 +6131,144 @@ out: xfs_trans_cancel(tp); return error; } + +/* Deferred mapping is only for real extents in the data fork. */ +static bool +xfs_bmap_is_update_needed( + int whichfork, + struct xfs_bmbt_irec *bmap) +{ + ASSERT(whichfork == XFS_DATA_FORK); + + return bmap->br_startblock != HOLESTARTBLOCK && + bmap->br_startblock != DELAYSTARTBLOCK; +} + +/* Record a bmap intent. */ +static int +__xfs_bmap_add( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + enum xfs_bmap_intent_type type, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *bmap) +{ + int error; + struct xfs_bmap_intent *bi; + + trace_xfs_bmap_defer(mp, + XFS_FSB_TO_AGNO(mp, bmap->br_startblock), + type, + XFS_FSB_TO_AGBNO(mp, bmap->br_startblock), + ip->i_ino, whichfork, + bmap->br_startoff, + bmap->br_blockcount, + bmap->br_state); + + bi = kmem_alloc(sizeof(struct xfs_bmap_intent), KM_SLEEP | KM_NOFS); + INIT_LIST_HEAD(&bi->bi_list); + bi->bi_type = type; + bi->bi_owner = ip; + bi->bi_whichfork = whichfork; + bi->bi_bmap = *bmap; + + error = xfs_defer_join(dfops, bi->bi_owner); + if (error) { + kmem_free(bi); + return error; + } + + xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_BMAP, &bi->bi_list); + return 0; +} + +/* Map an extent into a file. */ +int +xfs_bmap_map_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *PREV) +{ + if (!xfs_bmap_is_update_needed(whichfork, PREV)) + return 0; + + return __xfs_bmap_add(mp, dfops, XFS_BMAP_MAP, ip, whichfork, PREV); +} + +/* Unmap an extent out of a file. */ +int +xfs_bmap_unmap_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *PREV) +{ + if (!xfs_bmap_is_update_needed(whichfork, PREV)) + return 0; + + return __xfs_bmap_add(mp, dfops, XFS_BMAP_UNMAP, ip, whichfork, PREV); +} + +/* + * Process one of the deferred bmap operations. We pass back the + * btree cursor to maintain our lock on the bmapbt between calls. + */ +int +xfs_bmap_finish_one( + struct xfs_trans *tp, + struct xfs_defer_ops *dfops, + struct xfs_inode *ip, + enum xfs_bmap_intent_type type, + int whichfork, + xfs_fileoff_t startoff, + xfs_fsblock_t startblock, + xfs_filblks_t blockcount, + xfs_exntst_t state) +{ + struct xfs_bmbt_irec bmap; + int nimaps = 1; + xfs_fsblock_t firstfsb; + int done; + int error = 0; + + bmap.br_startblock = startblock; + bmap.br_startoff = startoff; + bmap.br_blockcount = blockcount; + bmap.br_state = state; + + trace_xfs_bmap_deferred(tp->t_mountp, + XFS_FSB_TO_AGNO(tp->t_mountp, startblock), type, + XFS_FSB_TO_AGBNO(tp->t_mountp, startblock), + ip->i_ino, whichfork, startoff, blockcount, state); + + if (XFS_TEST_ERROR(false, tp->t_mountp, + XFS_ERRTAG_BMAP_FINISH_ONE, + XFS_RANDOM_BMAP_FINISH_ONE)) + return -EIO; + + switch (type) { + case XFS_BMAP_MAP: + firstfsb = bmap.br_startblock; + error = xfs_bmapi_write(tp, ip, bmap.br_startoff, + bmap.br_blockcount, + XFS_BMAPI_REMAP, &firstfsb, + bmap.br_blockcount, &bmap, &nimaps, + dfops); + break; + case XFS_BMAP_UNMAP: + error = xfs_bunmapi(tp, ip, bmap.br_startoff, + bmap.br_blockcount, XFS_BMAPI_REMAP, 1, &firstfsb, + dfops, &done); + ASSERT(done); + break; + default: + ASSERT(0); + error = -EFSCORRUPTED; + } + + return error; +} diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 1a5d5f4..30f2294 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -227,4 +227,15 @@ struct xfs_bmap_intent { struct xfs_bmbt_irec bi_bmap; }; +int xfs_bmap_finish_one(struct xfs_trans *tp, struct xfs_defer_ops *dfops, + struct xfs_inode *ip, enum xfs_bmap_intent_type type, + int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, + xfs_filblks_t blockcount, xfs_exntst_t state); +int xfs_bmap_map_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, + struct xfs_inode *ip, int whichfork, + struct xfs_bmbt_irec *imap); +int xfs_bmap_unmap_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, + struct xfs_inode *ip, int whichfork, + struct xfs_bmbt_irec *imap); + #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h index d47a482..aa57eaa 100644 --- a/fs/xfs/libxfs/xfs_defer.h +++ b/fs/xfs/libxfs/xfs_defer.h @@ -51,6 +51,7 @@ struct xfs_defer_pending { * find all the space it needs. */ enum xfs_defer_ops_type { + XFS_DEFER_OPS_TYPE_BMAP, XFS_DEFER_OPS_TYPE_REFCOUNT, XFS_DEFER_OPS_TYPE_RMAP, XFS_DEFER_OPS_TYPE_FREE, diff --git a/fs/xfs/xfs_bmap_item.c b/fs/xfs/xfs_bmap_item.c index d192b57..9b1720c 100644 --- a/fs/xfs/xfs_bmap_item.c +++ b/fs/xfs/xfs_bmap_item.c @@ -24,11 +24,16 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_buf_item.h" #include "xfs_bmap_item.h" #include "xfs_log.h" +#include "xfs_bmap.h" +#include "xfs_icache.h" +#include "xfs_trace.h" kmem_zone_t *xfs_bui_zone; @@ -425,6 +430,14 @@ xfs_bui_recover( xfs_fsblock_t startblock_fsb; xfs_fsblock_t inode_fsb; bool op_ok; + struct xfs_bud_log_item *budp; + enum xfs_bmap_intent_type type; + int whichfork; + xfs_exntst_t state; + struct xfs_trans *tp; + struct xfs_inode *ip = NULL; + struct xfs_defer_ops dfops; + xfs_fsblock_t firstfsb; ASSERT(!test_bit(XFS_BUI_RECOVERED, &buip->bui_flags)); @@ -469,8 +482,62 @@ xfs_bui_recover( return -EIO; } - /* XXX: do nothing for now */ + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); + if (error) + return error; + budp = xfs_trans_get_bud(tp, buip); + + /* Grab the inode. */ + error = xfs_iget(mp, tp, bmap->me_owner, 0, XFS_ILOCK_EXCL, &ip); + if (error) + goto err_inode; + + xfs_defer_init(&dfops, &firstfsb); + + /* Process deferred bmap item. */ + state = (bmap->me_flags & XFS_BMAP_EXTENT_UNWRITTEN) ? + XFS_EXT_UNWRITTEN : XFS_EXT_NORM; + whichfork = (bmap->me_flags & XFS_BMAP_EXTENT_ATTR_FORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; + switch (bmap->me_flags & XFS_BMAP_EXTENT_TYPE_MASK) { + case XFS_BMAP_EXTENT_MAP: + type = XFS_BMAP_MAP; + break; + case XFS_BMAP_EXTENT_UNMAP: + type = XFS_BMAP_UNMAP; + break; + default: + error = -EFSCORRUPTED; + goto err_dfops; + } + xfs_trans_ijoin(tp, ip, 0); + + error = xfs_trans_log_finish_bmap_update(tp, budp, &dfops, type, + ip, whichfork, bmap->me_startoff, + bmap->me_startblock, bmap->me_len, + state); + if (error) + goto err_dfops; + + /* Finish transaction, free inodes. */ + error = xfs_defer_finish(&tp, &dfops, NULL); + if (error) + goto err_dfops; + set_bit(XFS_BUI_RECOVERED, &buip->bui_flags); - xfs_bui_release(buip); + error = xfs_trans_commit(tp); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + IRELE(ip); + + return error; + +err_dfops: + xfs_defer_cancel(&dfops); +err_inode: + xfs_trans_cancel(tp); + if (ip) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + IRELE(ip); + } return error; } diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 641e090..8d8e1b07 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h @@ -94,7 +94,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp); #define XFS_ERRTAG_RMAP_FINISH_ONE 23 #define XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE 24 #define XFS_ERRTAG_REFCOUNT_FINISH_ONE 25 -#define XFS_ERRTAG_MAX 26 +#define XFS_ERRTAG_BMAP_FINISH_ONE 26 +#define XFS_ERRTAG_MAX 27 /* * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. @@ -125,6 +126,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp); #define XFS_RANDOM_RMAP_FINISH_ONE 1 #define XFS_RANDOM_REFCOUNT_CONTINUE_UPDATE 1 #define XFS_RANDOM_REFCOUNT_FINISH_ONE 1 +#define XFS_RANDOM_BMAP_FINISH_ONE 1 #ifdef DEBUG extern int xfs_error_test_active; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index ba73c562..f62d50c 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1925,6 +1925,7 @@ init_xfs_fs(void) xfs_extent_free_init_defer_op(); xfs_rmap_update_init_defer_op(); xfs_refcount_update_init_defer_op(); + xfs_bmap_update_init_defer_op(); xfs_dir_startup(); diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 4324ada..d78b369d 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2560,6 +2560,11 @@ DEFINE_RMAPBT_EVENT(xfs_rmap_lookup_le_range_result); DEFINE_RMAPBT_EVENT(xfs_rmap_find_right_neighbor_result); DEFINE_RMAPBT_EVENT(xfs_rmap_find_left_neighbor_result); +/* deferred bmbt updates */ +#define DEFINE_BMAP_DEFERRED_EVENT DEFINE_RMAP_DEFERRED_EVENT +DEFINE_BMAP_DEFERRED_EVENT(xfs_bmap_defer); +DEFINE_BMAP_DEFERRED_EVENT(xfs_bmap_deferred); + /* per-AG reservation */ DECLARE_EVENT_CLASS(xfs_ag_resv_class, TP_PROTO(struct xfs_perag *pag, enum xfs_ag_resv_type resv, diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 7cf02d3..7a4ea0c 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -40,6 +40,7 @@ struct xfs_cui_log_item; struct xfs_cud_log_item; struct xfs_defer_ops; struct xfs_bui_log_item; +struct xfs_bud_log_item; typedef struct xfs_log_item { struct list_head li_ail; /* AIL pointers */ diff --git a/fs/xfs/xfs_trans_bmap.c b/fs/xfs/xfs_trans_bmap.c index 3f21c57..3fce3c8 100644 --- a/fs/xfs/xfs_trans_bmap.c +++ b/fs/xfs/xfs_trans_bmap.c @@ -93,7 +93,8 @@ xfs_trans_log_finish_bmap_update( { int error; - error = -EFSCORRUPTED; + error = xfs_bmap_finish_one(tp, dop, ip, type, whichfork, startoff, + startblock, blockcount, state); /* * Mark the transaction dirty, even on error. This ensures the @@ -107,3 +108,144 @@ xfs_trans_log_finish_bmap_update( return error; } + +/* Sort bmap intents by inode. */ +static int +xfs_bmap_update_diff_items( + void *priv, + struct list_head *a, + struct list_head *b) +{ + struct xfs_bmap_intent *ba; + struct xfs_bmap_intent *bb; + + ba = container_of(a, struct xfs_bmap_intent, bi_list); + bb = container_of(b, struct xfs_bmap_intent, bi_list); + return ba->bi_owner->i_ino - bb->bi_owner->i_ino; +} + +/* Get an BUI. */ +STATIC void * +xfs_bmap_update_create_intent( + struct xfs_trans *tp, + unsigned int count) +{ + struct xfs_bui_log_item *buip; + + ASSERT(count == XFS_BUI_MAX_FAST_EXTENTS); + ASSERT(tp != NULL); + + buip = xfs_bui_init(tp->t_mountp); + ASSERT(buip != NULL); + + /* + * Get a log_item_desc to point at the new item. + */ + xfs_trans_add_item(tp, &buip->bui_item); + return buip; +} + +/* Log bmap updates in the intent item. */ +STATIC void +xfs_bmap_update_log_item( + struct xfs_trans *tp, + void *intent, + struct list_head *item) +{ + struct xfs_bui_log_item *buip = intent; + struct xfs_bmap_intent *bmap; + uint next_extent; + struct xfs_map_extent *map; + + bmap = container_of(item, struct xfs_bmap_intent, bi_list); + + tp->t_flags |= XFS_TRANS_DIRTY; + buip->bui_item.li_desc->lid_flags |= XFS_LID_DIRTY; + + /* + * atomic_inc_return gives us the value after the increment; + * we want to use it as an array index so we need to subtract 1 from + * it. + */ + next_extent = atomic_inc_return(&buip->bui_next_extent) - 1; + ASSERT(next_extent < buip->bui_format.bui_nextents); + map = &buip->bui_format.bui_extents[next_extent]; + map->me_owner = bmap->bi_owner->i_ino; + map->me_startblock = bmap->bi_bmap.br_startblock; + map->me_startoff = bmap->bi_bmap.br_startoff; + map->me_len = bmap->bi_bmap.br_blockcount; + xfs_trans_set_bmap_flags(map, bmap->bi_type, bmap->bi_whichfork, + bmap->bi_bmap.br_state); +} + +/* Get an BUD so we can process all the deferred rmap updates. */ +STATIC void * +xfs_bmap_update_create_done( + struct xfs_trans *tp, + void *intent, + unsigned int count) +{ + return xfs_trans_get_bud(tp, intent); +} + +/* Process a deferred rmap update. */ +STATIC int +xfs_bmap_update_finish_item( + struct xfs_trans *tp, + struct xfs_defer_ops *dop, + struct list_head *item, + void *done_item, + void **state) +{ + struct xfs_bmap_intent *bmap; + int error; + + bmap = container_of(item, struct xfs_bmap_intent, bi_list); + error = xfs_trans_log_finish_bmap_update(tp, done_item, dop, + bmap->bi_type, + bmap->bi_owner, bmap->bi_whichfork, + bmap->bi_bmap.br_startoff, + bmap->bi_bmap.br_startblock, + bmap->bi_bmap.br_blockcount, + bmap->bi_bmap.br_state); + kmem_free(bmap); + return error; +} + +/* Abort all pending BUIs. */ +STATIC void +xfs_bmap_update_abort_intent( + void *intent) +{ + xfs_bui_release(intent); +} + +/* Cancel a deferred rmap update. */ +STATIC void +xfs_bmap_update_cancel_item( + struct list_head *item) +{ + struct xfs_bmap_intent *bmap; + + bmap = container_of(item, struct xfs_bmap_intent, bi_list); + kmem_free(bmap); +} + +static const struct xfs_defer_op_type xfs_bmap_update_defer_type = { + .type = XFS_DEFER_OPS_TYPE_BMAP, + .max_items = XFS_BUI_MAX_FAST_EXTENTS, + .diff_items = xfs_bmap_update_diff_items, + .create_intent = xfs_bmap_update_create_intent, + .abort_intent = xfs_bmap_update_abort_intent, + .log_item = xfs_bmap_update_log_item, + .create_done = xfs_bmap_update_create_done, + .finish_item = xfs_bmap_update_finish_item, + .cancel_item = xfs_bmap_update_cancel_item, +}; + +/* Register the deferred op type. */ +void +xfs_bmap_update_init_defer_op(void) +{ + xfs_defer_init_op_type(&xfs_bmap_update_defer_type); +} From darrick.wong@oracle.com Thu Aug 25 18:35:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B79C07DA5 for ; Thu, 25 Aug 2016 18:35:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E81F304051 for ; Thu, 25 Aug 2016 16:35:08 -0700 (PDT) X-ASG-Debug-ID: 1472168106-0bf8155c771e6990001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ZzwvtqtzaRMKYFWv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZ5W0012493 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:35:05 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNZ4QN001892 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:35:05 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNZ4o5016870; Thu, 25 Aug 2016 23:35:04 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:03 -0700 Subject: [PATCH 28/71] xfs: when replaying bmap operations, don't let unlinked inodes get reaped From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 28/71] xfs: when replaying bmap operations, don't let unlinked inodes get reaped To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:01 -0700 Message-ID: <147216810156.867.6921848738908792090.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168106 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2932 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Log recovery will iget an inode to replay BUI items and iput the inode when it's done. Unfortunately, the iput will see that i_nlink == 0 and decide to truncate & free the inode, which prevents us from replaying subsequent BUIs. We can't skip the BUIs because we have to replay all the redo items to ensure that atomic operations complete. Since unlinked inode recovery will reap the inode anyway, we can safely introduce a new inode flag to indicate that an inode is in this 'unlinked recovery' state and should not be auto-reaped in the drop_inode path. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_bmap_item.c | 1 + fs/xfs/xfs_inode.c | 8 ++++++++ fs/xfs/xfs_inode.h | 6 ++++++ fs/xfs/xfs_log_recover.c | 1 + 4 files changed, 16 insertions(+) diff --git a/fs/xfs/xfs_bmap_item.c b/fs/xfs/xfs_bmap_item.c index 9b1720c..418c012 100644 --- a/fs/xfs/xfs_bmap_item.c +++ b/fs/xfs/xfs_bmap_item.c @@ -492,6 +492,7 @@ xfs_bui_recover( if (error) goto err_inode; + xfs_iflags_set(ip, XFS_IRECOVER_UNLINKED); xfs_defer_init(&dfops, &firstfsb); /* Process deferred bmap item. */ diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e08eaea..0c25a76 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1855,6 +1855,14 @@ xfs_inactive( if (mp->m_flags & XFS_MOUNT_RDONLY) return; + /* + * If this unlinked inode is in the middle of recovery, don't + * truncate and free the inode just yet; log recovery will take + * care of that. See the comment for this inode flag. + */ + if (xfs_iflags_test(ip, XFS_IRECOVER_UNLINKED)) + return; + if (VFS_I(ip)->i_nlink != 0) { /* * force is true because we are evicting an inode from the diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 4094f2c..7283db3 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -221,6 +221,12 @@ static inline bool xfs_is_reflink_inode(struct xfs_inode *ip) #define __XFS_IPINNED_BIT 8 /* wakeup key for zero pin count */ #define XFS_IPINNED (1 << __XFS_IPINNED_BIT) #define XFS_IDONTCACHE (1 << 9) /* don't cache the inode long term */ +/* + * If this unlinked inode is in the middle of recovery, don't let drop_inode + * truncate and free the inode. This can happen if we iget the inode during + * log recovery to replay a bmap operation on the inode. + */ +#define XFS_IRECOVER_UNLINKED (1 << 10) /* * Per-lifetime flags need to be reset when re-using a reclaimable inode during diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 37673d6..c9c05b9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4854,6 +4854,7 @@ xlog_recover_process_one_iunlink( if (error) goto fail_iput; + xfs_iflags_clear(ip, XFS_IRECOVER_UNLINKED); ASSERT(VFS_I(ip)->i_nlink == 0); ASSERT(VFS_I(ip)->i_mode != 0); From darrick.wong@oracle.com Thu Aug 25 18:35:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 74A617DAB for ; Thu, 25 Aug 2016 18:35:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D08C5AC002 for ; Thu, 25 Aug 2016 16:35:14 -0700 (PDT) X-ASG-Debug-ID: 1472168112-0bf57c55b41c7870001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EbBqFSiwHSJvVOJP (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:12 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZBRW012572 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:35:11 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNZAXo002236 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:11 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZADC014292; Thu, 25 Aug 2016 23:35:10 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:10 -0700 Subject: [PATCH 29/71] xfs: return work remaining at the end of a bunmapi operation From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 29/71] xfs: return work remaining at the end of a bunmapi operation To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:08 -0700 Message-ID: <147216810880.867.17514772792244202162.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168112 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3601 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Return the range of file blocks that bunmapi didn't free. This hint is used by CoW and reflink to figure out what part of an extent actually got freed so that it can set up the appropriate atomic remapping of just the freed range. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 36 ++++++++++++++++++++++++++++++------ fs/xfs/libxfs/xfs_bmap.h | 4 ++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 6272cf6..afedbc4 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5167,17 +5167,16 @@ done: * *done is set. */ int /* error */ -xfs_bunmapi( +__xfs_bunmapi( xfs_trans_t *tp, /* transaction pointer */ struct xfs_inode *ip, /* incore inode */ xfs_fileoff_t bno, /* starting offset to unmap */ - xfs_filblks_t len, /* length to unmap in file */ + xfs_filblks_t *rlen, /* i/o: amount remaining */ int flags, /* misc flags */ xfs_extnum_t nexts, /* number of extents max */ xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ - struct xfs_defer_ops *dfops, /* i/o: list extents to free */ - int *done) /* set if not done yet */ + struct xfs_defer_ops *dfops) /* i/o: deferred updates */ { xfs_btree_cur_t *cur; /* bmap btree cursor */ xfs_bmbt_irec_t del; /* extent being deleted */ @@ -5199,6 +5198,7 @@ xfs_bunmapi( int wasdel; /* was a delayed alloc extent */ int whichfork; /* data or attribute fork */ xfs_fsblock_t sum; + xfs_filblks_t len = *rlen; /* length to unmap in file */ trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); @@ -5225,7 +5225,7 @@ xfs_bunmapi( return error; nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); if (nextents == 0) { - *done = 1; + *rlen = 0; return 0; } XFS_STATS_INC(mp, xs_blk_unmap); @@ -5496,7 +5496,10 @@ nodelete: extno++; } } - *done = bno == (xfs_fileoff_t)-1 || bno < start || lastx < 0; + if (bno == (xfs_fileoff_t)-1 || bno < start || lastx < 0) + *rlen = 0; + else + *rlen = bno - start + 1; /* * Convert to a btree if necessary. @@ -5552,6 +5555,27 @@ error0: return error; } +/* Unmap a range of a file. */ +int +xfs_bunmapi( + xfs_trans_t *tp, + struct xfs_inode *ip, + xfs_fileoff_t bno, + xfs_filblks_t len, + int flags, + xfs_extnum_t nexts, + xfs_fsblock_t *firstblock, + struct xfs_defer_ops *dfops, + int *done) +{ + int error; + + error = __xfs_bunmapi(tp, ip, bno, &len, flags, nexts, firstblock, + dfops); + *done = (len == 0); + return error; +} + /* * Determine whether an extent shift can be accomplished by a merge with the * extent that precedes the target hole of the shift. diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 30f2294..3b2a5b5 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -200,6 +200,10 @@ int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fsblock_t *firstblock, xfs_extlen_t total, struct xfs_bmbt_irec *mval, int *nmap, struct xfs_defer_ops *dfops); +int __xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t bno, xfs_filblks_t *rlen, int flags, + xfs_extnum_t nexts, xfs_fsblock_t *firstblock, + struct xfs_defer_ops *dfops); int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, int flags, xfs_extnum_t nexts, xfs_fsblock_t *firstblock, From darrick.wong@oracle.com Thu Aug 25 18:35:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10B477D94 for ; Thu, 25 Aug 2016 18:35:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AC52B8F8033 for ; Thu, 25 Aug 2016 16:35:21 -0700 (PDT) X-ASG-Debug-ID: 1472168119-0bf8155c741e69f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id dDyhC7hJZpZnY7F4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZHr3019503 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:18 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZHHF016233 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:17 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZGgD029294; Thu, 25 Aug 2016 23:35:17 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:16 -0700 Subject: [PATCH 30/71] xfs: define tracepoints for reflink activities From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 30/71] xfs: define tracepoints for reflink activities To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:15 -0700 Message-ID: <147216811500.867.1716806226267871573.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168119 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11851 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Define all the tracepoints we need to inspect the runtime operation of reflink/dedupe/copy-on-write. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_trace.h | 333 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index d78b369d..57ef0fa 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2998,6 +2998,339 @@ TRACE_EVENT(xfs_bmap_remap_alloc, ); DEFINE_INODE_ERROR_EVENT(xfs_bmap_remap_alloc_error); +/* reflink tracepoint classes */ + +/* two-file io tracepoint class */ +DECLARE_EVENT_CLASS(xfs_double_io_class, + TP_PROTO(struct xfs_inode *src, xfs_off_t soffset, xfs_off_t len, + struct xfs_inode *dest, xfs_off_t doffset), + TP_ARGS(src, soffset, len, dest, doffset), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, src_ino) + __field(loff_t, src_isize) + __field(loff_t, src_disize) + __field(loff_t, src_offset) + __field(size_t, len) + __field(xfs_ino_t, dest_ino) + __field(loff_t, dest_isize) + __field(loff_t, dest_disize) + __field(loff_t, dest_offset) + ), + TP_fast_assign( + __entry->dev = VFS_I(src)->i_sb->s_dev; + __entry->src_ino = src->i_ino; + __entry->src_isize = VFS_I(src)->i_size; + __entry->src_disize = src->i_d.di_size; + __entry->src_offset = soffset; + __entry->len = len; + __entry->dest_ino = dest->i_ino; + __entry->dest_isize = VFS_I(dest)->i_size; + __entry->dest_disize = dest->i_d.di_size; + __entry->dest_offset = doffset; + ), + TP_printk("dev %d:%d count %zd " + "ino 0x%llx isize 0x%llx disize 0x%llx offset 0x%llx -> " + "ino 0x%llx isize 0x%llx disize 0x%llx offset 0x%llx", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->len, + __entry->src_ino, + __entry->src_isize, + __entry->src_disize, + __entry->src_offset, + __entry->dest_ino, + __entry->dest_isize, + __entry->dest_disize, + __entry->dest_offset) +) + +#define DEFINE_DOUBLE_IO_EVENT(name) \ +DEFINE_EVENT(xfs_double_io_class, name, \ + TP_PROTO(struct xfs_inode *src, xfs_off_t soffset, xfs_off_t len, \ + struct xfs_inode *dest, xfs_off_t doffset), \ + TP_ARGS(src, soffset, len, dest, doffset)) + +/* two-file vfs io tracepoint class */ +DECLARE_EVENT_CLASS(xfs_double_vfs_io_class, + TP_PROTO(struct inode *src, u64 soffset, u64 len, + struct inode *dest, u64 doffset), + TP_ARGS(src, soffset, len, dest, doffset), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(unsigned long, src_ino) + __field(loff_t, src_isize) + __field(loff_t, src_offset) + __field(size_t, len) + __field(unsigned long, dest_ino) + __field(loff_t, dest_isize) + __field(loff_t, dest_offset) + ), + TP_fast_assign( + __entry->dev = src->i_sb->s_dev; + __entry->src_ino = src->i_ino; + __entry->src_isize = i_size_read(src); + __entry->src_offset = soffset; + __entry->len = len; + __entry->dest_ino = dest->i_ino; + __entry->dest_isize = i_size_read(dest); + __entry->dest_offset = doffset; + ), + TP_printk("dev %d:%d count %zd " + "ino 0x%lx isize 0x%llx offset 0x%llx -> " + "ino 0x%lx isize 0x%llx offset 0x%llx", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->len, + __entry->src_ino, + __entry->src_isize, + __entry->src_offset, + __entry->dest_ino, + __entry->dest_isize, + __entry->dest_offset) +) + +#define DEFINE_DOUBLE_VFS_IO_EVENT(name) \ +DEFINE_EVENT(xfs_double_vfs_io_class, name, \ + TP_PROTO(struct inode *src, u64 soffset, u64 len, \ + struct inode *dest, u64 doffset), \ + TP_ARGS(src, soffset, len, dest, doffset)) + +/* CoW write tracepoint */ +DECLARE_EVENT_CLASS(xfs_copy_on_write_class, + TP_PROTO(struct xfs_inode *ip, xfs_fileoff_t lblk, xfs_fsblock_t pblk, + xfs_extlen_t len, xfs_fsblock_t new_pblk), + TP_ARGS(ip, lblk, pblk, len, new_pblk), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_fileoff_t, lblk) + __field(xfs_fsblock_t, pblk) + __field(xfs_extlen_t, len) + __field(xfs_fsblock_t, new_pblk) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->lblk = lblk; + __entry->pblk = pblk; + __entry->len = len; + __entry->new_pblk = new_pblk; + ), + TP_printk("dev %d:%d ino 0x%llx lblk 0x%llx pblk 0x%llx " + "len 0x%x new_pblk %llu", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->lblk, + __entry->pblk, + __entry->len, + __entry->new_pblk) +) + +#define DEFINE_COW_EVENT(name) \ +DEFINE_EVENT(xfs_copy_on_write_class, name, \ + TP_PROTO(struct xfs_inode *ip, xfs_fileoff_t lblk, xfs_fsblock_t pblk, \ + xfs_extlen_t len, xfs_fsblock_t new_pblk), \ + TP_ARGS(ip, lblk, pblk, len, new_pblk)) + +/* inode/irec events */ +DECLARE_EVENT_CLASS(xfs_inode_irec_class, + TP_PROTO(struct xfs_inode *ip, struct xfs_bmbt_irec *irec), + TP_ARGS(ip, irec), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_fileoff_t, lblk) + __field(xfs_extlen_t, len) + __field(xfs_fsblock_t, pblk) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->lblk = irec->br_startoff; + __entry->len = irec->br_blockcount; + __entry->pblk = irec->br_startblock; + ), + TP_printk("dev %d:%d ino 0x%llx lblk 0x%llx len 0x%x pblk %llu", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->lblk, + __entry->len, + __entry->pblk) +); +#define DEFINE_INODE_IREC_EVENT(name) \ +DEFINE_EVENT(xfs_inode_irec_class, name, \ + TP_PROTO(struct xfs_inode *ip, struct xfs_bmbt_irec *irec), \ + TP_ARGS(ip, irec)) + +/* refcount/reflink tracepoint definitions */ + +/* reflink tracepoints */ +DEFINE_INODE_EVENT(xfs_reflink_set_inode_flag); +DEFINE_INODE_EVENT(xfs_reflink_unset_inode_flag); +DEFINE_ITRUNC_EVENT(xfs_reflink_update_inode_size); +DEFINE_IOMAP_EVENT(xfs_reflink_remap_imap); +TRACE_EVENT(xfs_reflink_remap_blocks_loop, + TP_PROTO(struct xfs_inode *src, xfs_fileoff_t soffset, + xfs_filblks_t len, struct xfs_inode *dest, + xfs_fileoff_t doffset), + TP_ARGS(src, soffset, len, dest, doffset), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, src_ino) + __field(xfs_fileoff_t, src_lblk) + __field(xfs_filblks_t, len) + __field(xfs_ino_t, dest_ino) + __field(xfs_fileoff_t, dest_lblk) + ), + TP_fast_assign( + __entry->dev = VFS_I(src)->i_sb->s_dev; + __entry->src_ino = src->i_ino; + __entry->src_lblk = soffset; + __entry->len = len; + __entry->dest_ino = dest->i_ino; + __entry->dest_lblk = doffset; + ), + TP_printk("dev %d:%d len 0x%llx " + "ino 0x%llx offset 0x%llx blocks -> " + "ino 0x%llx offset 0x%llx blocks", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->len, + __entry->src_ino, + __entry->src_lblk, + __entry->dest_ino, + __entry->dest_lblk) +); +TRACE_EVENT(xfs_reflink_punch_range, + TP_PROTO(struct xfs_inode *ip, xfs_fileoff_t lblk, + xfs_extlen_t len), + TP_ARGS(ip, lblk, len), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_fileoff_t, lblk) + __field(xfs_extlen_t, len) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->lblk = lblk; + __entry->len = len; + ), + TP_printk("dev %d:%d ino 0x%llx lblk 0x%llx len 0x%x", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->lblk, + __entry->len) +); +TRACE_EVENT(xfs_reflink_remap, + TP_PROTO(struct xfs_inode *ip, xfs_fileoff_t lblk, + xfs_extlen_t len, xfs_fsblock_t new_pblk), + TP_ARGS(ip, lblk, len, new_pblk), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(xfs_fileoff_t, lblk) + __field(xfs_extlen_t, len) + __field(xfs_fsblock_t, new_pblk) + ), + TP_fast_assign( + __entry->dev = VFS_I(ip)->i_sb->s_dev; + __entry->ino = ip->i_ino; + __entry->lblk = lblk; + __entry->len = len; + __entry->new_pblk = new_pblk; + ), + TP_printk("dev %d:%d ino 0x%llx lblk 0x%llx len 0x%x new_pblk %llu", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->lblk, + __entry->len, + __entry->new_pblk) +); +DEFINE_DOUBLE_IO_EVENT(xfs_reflink_remap_range); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_remap_range_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_set_inode_flag_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_update_inode_size_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_reflink_main_loop_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_read_iomap_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_remap_blocks_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_remap_extent_error); + +/* dedupe tracepoints */ +DEFINE_DOUBLE_IO_EVENT(xfs_reflink_compare_extents); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_compare_extents_error); + +/* ioctl tracepoints */ +DEFINE_DOUBLE_VFS_IO_EVENT(xfs_ioctl_reflink); +DEFINE_DOUBLE_VFS_IO_EVENT(xfs_ioctl_clone_range); +DEFINE_DOUBLE_VFS_IO_EVENT(xfs_ioctl_file_extent_same); +TRACE_EVENT(xfs_ioctl_clone, + TP_PROTO(struct inode *src, struct inode *dest), + TP_ARGS(src, dest), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(unsigned long, src_ino) + __field(loff_t, src_isize) + __field(unsigned long, dest_ino) + __field(loff_t, dest_isize) + ), + TP_fast_assign( + __entry->dev = src->i_sb->s_dev; + __entry->src_ino = src->i_ino; + __entry->src_isize = i_size_read(src); + __entry->dest_ino = dest->i_ino; + __entry->dest_isize = i_size_read(dest); + ), + TP_printk("dev %d:%d " + "ino 0x%lx isize 0x%llx -> " + "ino 0x%lx isize 0x%llx\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->src_ino, + __entry->src_isize, + __entry->dest_ino, + __entry->dest_isize) +); + +/* unshare tracepoints */ +DEFINE_SIMPLE_IO_EVENT(xfs_reflink_unshare); +DEFINE_SIMPLE_IO_EVENT(xfs_reflink_cow_eof_block); +DEFINE_PAGE_EVENT(xfs_reflink_unshare_page); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_unshare_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_cow_eof_block_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_dirty_page_error); + +/* copy on write */ +DEFINE_INODE_IREC_EVENT(xfs_reflink_trim_around_shared); + +DEFINE_RW_EVENT(xfs_reflink_reserve_cow_range); +DEFINE_INODE_IREC_EVENT(xfs_reflink_reserve_cow_extent); +DEFINE_RW_EVENT(xfs_reflink_allocate_cow_range); +DEFINE_INODE_IREC_EVENT(xfs_reflink_allocate_cow_extent); + +DEFINE_INODE_IREC_EVENT(xfs_reflink_bounce_dio_write); +DEFINE_IOMAP_EVENT(xfs_reflink_find_cow_mapping); +DEFINE_INODE_IREC_EVENT(xfs_reflink_trim_irec); +DEFINE_SIMPLE_IO_EVENT(xfs_iomap_cow_delay); + +DEFINE_SIMPLE_IO_EVENT(xfs_reflink_cancel_cow_range); +DEFINE_SIMPLE_IO_EVENT(xfs_reflink_end_cow); +DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_remap); +DEFINE_INODE_IREC_EVENT(xfs_reflink_cow_remap_piece); + +DEFINE_INODE_ERROR_EVENT(xfs_reflink_reserve_cow_range_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_reserve_cow_extent_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_allocate_cow_range_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_cancel_cow_range_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_end_cow_error); + +DEFINE_COW_EVENT(xfs_reflink_fork_buf); +DEFINE_COW_EVENT(xfs_reflink_finish_fork_buf); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_fork_buf_error); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_finish_fork_buf_error); + +DEFINE_INODE_EVENT(xfs_reflink_cancel_pending_cow); +DEFINE_INODE_IREC_EVENT(xfs_reflink_cancel_cow); +DEFINE_INODE_ERROR_EVENT(xfs_reflink_cancel_pending_cow_error); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH From darrick.wong@oracle.com Thu Aug 25 18:35:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E434F7DB6 for ; Thu, 25 Aug 2016 18:35:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id ACD92304043 for ; Thu, 25 Aug 2016 16:35:31 -0700 (PDT) X-ASG-Debug-ID: 1472168128-0bf57b5313209310001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id BhoJLBCuZaPV9RfE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:28 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZOBg012787 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:35:24 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNZN0j016897 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:24 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZMHm029373; Thu, 25 Aug 2016 23:35:23 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:22 -0700 Subject: [PATCH 31/71] xfs: add reflink feature flag to geometry From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 31/71] xfs: add reflink feature flag to geometry To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:21 -0700 Message-ID: <147216812132.867.6738233134195860349.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168128 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1639 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Report the reflink feature in the XFS geometry so that xfs_info and friends know the filesystem has this feature. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 3 ++- fs/xfs/xfs_fsops.c | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 7945505..6f4f2c3 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -206,7 +206,8 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ #define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ #define XFS_FSOP_GEOM_FLAGS_SPINODES 0x40000 /* sparse inode chunks */ -#define XFS_FSOP_GEOM_FLAGS_RMAPBT 0x80000 /* Reverse mapping btree */ +#define XFS_FSOP_GEOM_FLAGS_RMAPBT 0x80000 /* reverse mapping btree */ +#define XFS_FSOP_GEOM_FLAGS_REFLINK 0x100000 /* files can share blocks */ /* * Minimum and maximum sizes need for growth checks. diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 4b4059b..3acbf4e0 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -108,7 +108,9 @@ xfs_fs_geometry( (xfs_sb_version_hassparseinodes(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_SPINODES : 0) | (xfs_sb_version_hasrmapbt(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_RMAPBT : 0); + XFS_FSOP_GEOM_FLAGS_RMAPBT : 0) | + (xfs_sb_version_hasreflink(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_REFLINK : 0); geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; From darrick.wong@oracle.com Thu Aug 25 18:35:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 66E307DBB for ; Thu, 25 Aug 2016 18:35:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 13F638F8035 for ; Thu, 25 Aug 2016 16:35:35 -0700 (PDT) X-ASG-Debug-ID: 1472168133-0bf81509b01dea10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id q4TmbWIxKcNFYpOi (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZWel012838 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:32 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZVPM016508 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:32 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZTuU014420; Thu, 25 Aug 2016 23:35:31 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:28 -0700 Subject: [PATCH 32/71] xfs: don't allow reflinked dir/dev/fifo/socket/pipe files From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 32/71] xfs: don't allow reflinked dir/dev/fifo/socket/pipe files To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:27 -0700 Message-ID: <147216812749.867.3721043669046332313.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168133 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1586 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Only non-rt files can be reflinked, so check that when we load an inode. Also, don't leak the attr fork if there's a failure. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_inode_fork.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index bbcc8c7..7699a03 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -121,6 +121,26 @@ xfs_iformat_fork( return -EFSCORRUPTED; } + if (unlikely(xfs_is_reflink_inode(ip) && + (VFS_I(ip)->i_mode & S_IFMT) != S_IFREG)) { + xfs_warn(ip->i_mount, + "corrupt dinode %llu, wrong file type for reflink.", + ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat(reflink)", + XFS_ERRLEVEL_LOW, ip->i_mount, dip); + return -EFSCORRUPTED; + } + + if (unlikely(xfs_is_reflink_inode(ip) && + (ip->i_d.di_flags & XFS_DIFLAG_REALTIME))) { + xfs_warn(ip->i_mount, + "corrupt dinode %llu, has reflink+realtime flag set.", + ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat(reflink)", + XFS_ERRLEVEL_LOW, ip->i_mount, dip); + return -EFSCORRUPTED; + } + switch (VFS_I(ip)->i_mode & S_IFMT) { case S_IFIFO: case S_IFCHR: @@ -208,7 +228,8 @@ xfs_iformat_fork( XFS_CORRUPTION_ERROR("xfs_iformat(8)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return -EFSCORRUPTED; + error = -EFSCORRUPTED; + break; } error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size); From darrick.wong@oracle.com Thu Aug 25 18:35:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A82587D9B for ; Thu, 25 Aug 2016 18:35:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 77DA6304043 for ; Thu, 25 Aug 2016 16:35:41 -0700 (PDT) X-ASG-Debug-ID: 1472168137-0bf57c55b31c78b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id mtcR2PtdsTe1YduM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:38 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZaZC012857 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:36 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZa0q006901 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:36 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZZ5X014521; Thu, 25 Aug 2016 23:35:35 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:35 -0700 Subject: [PATCH 33/71] xfs: introduce the CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 33/71] xfs: introduce the CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:33 -0700 Message-ID: <147216813367.867.9335678840922111140.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168138 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 21813 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Introduce a new in-core fork for storing copy-on-write delalloc reservations and allocated extents that are in the process of being written out. v2: fix up bmapi_read so that we can query the CoW fork, and have it return a "hole" extent if there's no CoW fork. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_bmap.c | 27 +++++++-- fs/xfs/libxfs/xfs_bmap.h | 22 +++++++- fs/xfs/libxfs/xfs_bmap_btree.c | 1 fs/xfs/libxfs/xfs_inode_fork.c | 47 +++++++++++++++- fs/xfs/libxfs/xfs_inode_fork.h | 28 ++++++++-- fs/xfs/libxfs/xfs_rmap.c | 15 +++-- fs/xfs/libxfs/xfs_types.h | 1 fs/xfs/xfs_icache.c | 5 ++ fs/xfs/xfs_inode.h | 4 + fs/xfs/xfs_reflink.c | 114 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 23 ++++++++ fs/xfs/xfs_trace.h | 4 + 13 files changed, 264 insertions(+), 28 deletions(-) create mode 100644 fs/xfs/xfs_reflink.c create mode 100644 fs/xfs/xfs_reflink.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 6afb228..26ef195 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -90,6 +90,7 @@ xfs-y += xfs_aops.o \ xfs_message.o \ xfs_mount.o \ xfs_mru_cache.o \ + xfs_reflink.o \ xfs_stats.o \ xfs_super.o \ xfs_symlink.o \ diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index afedbc4..f745d7e 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -2924,6 +2924,7 @@ xfs_bmap_add_extent_hole_real( ASSERT(!isnullstartblock(new->br_startblock)); ASSERT(!bma->cur || !(bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); + ASSERT(whichfork != XFS_COW_FORK); XFS_STATS_INC(mp, xs_add_exlist); @@ -4059,12 +4060,11 @@ xfs_bmapi_read( int error; int eof; int n = 0; - int whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + int whichfork = xfs_bmapi_whichfork(flags); ASSERT(*nmap >= 1); ASSERT(!(flags & ~(XFS_BMAPI_ATTRFORK|XFS_BMAPI_ENTIRE| - XFS_BMAPI_IGSTATE))); + XFS_BMAPI_IGSTATE|XFS_BMAPI_COWFORK))); ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)); if (unlikely(XFS_TEST_ERROR( @@ -4082,6 +4082,16 @@ xfs_bmapi_read( ifp = XFS_IFORK_PTR(ip, whichfork); + /* No CoW fork? Return a hole. */ + if (whichfork == XFS_COW_FORK && !ifp) { + mval->br_startoff = bno; + mval->br_startblock = HOLESTARTBLOCK; + mval->br_blockcount = len; + mval->br_state = XFS_EXT_NORM; + *nmap = 1; + return 0; + } + if (!(ifp->if_flags & XFS_IFEXTENTS)) { error = xfs_iread_extents(NULL, ip, whichfork); if (error) @@ -4434,8 +4444,7 @@ xfs_bmapi_convert_unwritten( xfs_filblks_t len, int flags) { - int whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + int whichfork = xfs_bmapi_whichfork(flags); struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); int tmp_logflags = 0; int error; @@ -4451,6 +4460,8 @@ xfs_bmapi_convert_unwritten( (XFS_BMAPI_PREALLOC | XFS_BMAPI_CONVERT)) return 0; + ASSERT(whichfork != XFS_COW_FORK); + /* * Modify (by adding) the state flag, if writing. */ @@ -4864,6 +4875,8 @@ xfs_bmap_del_extent( if (whichfork == XFS_ATTR_FORK) state |= BMAP_ATTRFORK; + else if (whichfork == XFS_COW_FORK) + state |= BMAP_COWFORK; ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT((*idx >= 0) && (*idx < ifp->if_bytes / @@ -5202,8 +5215,8 @@ __xfs_bunmapi( trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); - whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + whichfork = xfs_bmapi_whichfork(flags); + ASSERT(whichfork != XFS_COW_FORK); ifp = XFS_IFORK_PTR(ip, whichfork); if (unlikely( XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 3b2a5b5..e686a1b 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -107,6 +107,9 @@ struct xfs_extent_free_item */ #define XFS_BMAPI_REMAP 0x100 +/* Map something in the CoW fork. */ +#define XFS_BMAPI_COWFORK 0x200 + #define XFS_BMAPI_FLAGS \ { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ { XFS_BMAPI_METADATA, "METADATA" }, \ @@ -116,12 +119,23 @@ struct xfs_extent_free_item { XFS_BMAPI_CONTIG, "CONTIG" }, \ { XFS_BMAPI_CONVERT, "CONVERT" }, \ { XFS_BMAPI_ZERO, "ZERO" }, \ - { XFS_BMAPI_REMAP, "REMAP" } + { XFS_BMAPI_REMAP, "REMAP" }, \ + { XFS_BMAPI_COWFORK, "COWFORK" } static inline int xfs_bmapi_aflag(int w) { - return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0); + return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : + (w == XFS_COW_FORK ? XFS_BMAPI_COWFORK : 0)); +} + +static inline int xfs_bmapi_whichfork(int bmapi_flags) +{ + if (bmapi_flags & XFS_BMAPI_COWFORK) + return XFS_COW_FORK; + else if (bmapi_flags & XFS_BMAPI_ATTRFORK) + return XFS_ATTR_FORK; + return XFS_DATA_FORK; } /* @@ -142,13 +156,15 @@ static inline int xfs_bmapi_aflag(int w) #define BMAP_LEFT_VALID (1 << 6) #define BMAP_RIGHT_VALID (1 << 7) #define BMAP_ATTRFORK (1 << 8) +#define BMAP_COWFORK (1 << 9) #define XFS_BMAP_EXT_FLAGS \ { BMAP_LEFT_CONTIG, "LC" }, \ { BMAP_RIGHT_CONTIG, "RC" }, \ { BMAP_LEFT_FILLING, "LF" }, \ { BMAP_RIGHT_FILLING, "RF" }, \ - { BMAP_ATTRFORK, "ATTR" } + { BMAP_ATTRFORK, "ATTR" }, \ + { BMAP_COWFORK, "COW" } /* diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index cd85274..37f0d9d 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -777,6 +777,7 @@ xfs_bmbt_init_cursor( { struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); struct xfs_btree_cur *cur; + ASSERT(whichfork != XFS_COW_FORK); cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_SLEEP); diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 7699a03..d29954a 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -206,9 +206,14 @@ xfs_iformat_fork( XFS_ERROR_REPORT("xfs_iformat(7)", XFS_ERRLEVEL_LOW, ip->i_mount); return -EFSCORRUPTED; } - if (error) { + if (error) return error; + + if (xfs_is_reflink_inode(ip)) { + ASSERT(ip->i_cowfp == NULL); + xfs_ifork_init_cow(ip); } + if (!XFS_DFORK_Q(dip)) return 0; @@ -247,6 +252,9 @@ xfs_iformat_fork( if (error) { kmem_zone_free(xfs_ifork_zone, ip->i_afp); ip->i_afp = NULL; + if (ip->i_cowfp) + kmem_zone_free(xfs_ifork_zone, ip->i_cowfp); + ip->i_cowfp = NULL; xfs_idestroy_fork(ip, XFS_DATA_FORK); } return error; @@ -761,6 +769,9 @@ xfs_idestroy_fork( if (whichfork == XFS_ATTR_FORK) { kmem_zone_free(xfs_ifork_zone, ip->i_afp); ip->i_afp = NULL; + } else if (whichfork == XFS_COW_FORK) { + kmem_zone_free(xfs_ifork_zone, ip->i_cowfp); + ip->i_cowfp = NULL; } } @@ -948,6 +959,19 @@ xfs_iext_get_ext( } } +/* XFS_IEXT_STATE_TO_FORK() -- Convert BMAP state flags to an inode fork. */ +xfs_ifork_t * +XFS_IEXT_STATE_TO_FORK( + struct xfs_inode *ip, + int state) +{ + if (state & BMAP_COWFORK) + return ip->i_cowfp; + else if (state & BMAP_ATTRFORK) + return ip->i_afp; + return &ip->i_df; +} + /* * Insert new item(s) into the extent records for incore inode * fork 'ifp'. 'count' new items are inserted at index 'idx'. @@ -960,7 +984,7 @@ xfs_iext_insert( xfs_bmbt_irec_t *new, /* items to insert */ int state) /* type of extent conversion */ { - xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; + xfs_ifork_t *ifp = XFS_IEXT_STATE_TO_FORK(ip, state); xfs_extnum_t i; /* extent record index */ trace_xfs_iext_insert(ip, idx, new, state, _RET_IP_); @@ -1210,7 +1234,7 @@ xfs_iext_remove( int ext_diff, /* number of extents to remove */ int state) /* type of extent conversion */ { - xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; + xfs_ifork_t *ifp = XFS_IEXT_STATE_TO_FORK(ip, state); xfs_extnum_t nextents; /* number of extents in file */ int new_size; /* size of extents after removal */ @@ -1955,3 +1979,20 @@ xfs_iext_irec_update_extoffs( ifp->if_u1.if_ext_irec[i].er_extoff += ext_diff; } } + +/* + * Initialize an inode's copy-on-write fork. + */ +void +xfs_ifork_init_cow( + struct xfs_inode *ip) +{ + if (ip->i_cowfp) + return; + + ip->i_cowfp = kmem_zone_zalloc(xfs_ifork_zone, + KM_SLEEP | KM_NOFS); + ip->i_cowfp->if_flags = XFS_IFEXTENTS; + ip->i_cformat = XFS_DINODE_FMT_EXTENTS; + ip->i_cnextents = 0; +} diff --git a/fs/xfs/libxfs/xfs_inode_fork.h b/fs/xfs/libxfs/xfs_inode_fork.h index f95e072..44d38eb 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.h +++ b/fs/xfs/libxfs/xfs_inode_fork.h @@ -92,7 +92,9 @@ typedef struct xfs_ifork { #define XFS_IFORK_PTR(ip,w) \ ((w) == XFS_DATA_FORK ? \ &(ip)->i_df : \ - (ip)->i_afp) + ((w) == XFS_ATTR_FORK ? \ + (ip)->i_afp : \ + (ip)->i_cowfp)) #define XFS_IFORK_DSIZE(ip) \ (XFS_IFORK_Q(ip) ? \ XFS_IFORK_BOFF(ip) : \ @@ -105,26 +107,38 @@ typedef struct xfs_ifork { #define XFS_IFORK_SIZE(ip,w) \ ((w) == XFS_DATA_FORK ? \ XFS_IFORK_DSIZE(ip) : \ - XFS_IFORK_ASIZE(ip)) + ((w) == XFS_ATTR_FORK ? \ + XFS_IFORK_ASIZE(ip) : \ + 0)) #define XFS_IFORK_FORMAT(ip,w) \ ((w) == XFS_DATA_FORK ? \ (ip)->i_d.di_format : \ - (ip)->i_d.di_aformat) + ((w) == XFS_ATTR_FORK ? \ + (ip)->i_d.di_aformat : \ + (ip)->i_cformat)) #define XFS_IFORK_FMT_SET(ip,w,n) \ ((w) == XFS_DATA_FORK ? \ ((ip)->i_d.di_format = (n)) : \ - ((ip)->i_d.di_aformat = (n))) + ((w) == XFS_ATTR_FORK ? \ + ((ip)->i_d.di_aformat = (n)) : \ + ((ip)->i_cformat = (n)))) #define XFS_IFORK_NEXTENTS(ip,w) \ ((w) == XFS_DATA_FORK ? \ (ip)->i_d.di_nextents : \ - (ip)->i_d.di_anextents) + ((w) == XFS_ATTR_FORK ? \ + (ip)->i_d.di_anextents : \ + (ip)->i_cnextents)) #define XFS_IFORK_NEXT_SET(ip,w,n) \ ((w) == XFS_DATA_FORK ? \ ((ip)->i_d.di_nextents = (n)) : \ - ((ip)->i_d.di_anextents = (n))) + ((w) == XFS_ATTR_FORK ? \ + ((ip)->i_d.di_anextents = (n)) : \ + ((ip)->i_cnextents = (n)))) #define XFS_IFORK_MAXEXT(ip, w) \ (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t)) +xfs_ifork_t *XFS_IEXT_STATE_TO_FORK(struct xfs_inode *ip, int state); + int xfs_iformat_fork(struct xfs_inode *, struct xfs_dinode *); void xfs_iflush_fork(struct xfs_inode *, struct xfs_dinode *, struct xfs_inode_log_item *, int); @@ -169,4 +183,6 @@ void xfs_iext_irec_update_extoffs(struct xfs_ifork *, int, int); extern struct kmem_zone *xfs_ifork_zone; +extern void xfs_ifork_init_cow(struct xfs_inode *ip); + #endif /* __XFS_INODE_FORK_H__ */ diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 73d0540..1c40b85 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -1263,9 +1263,10 @@ out_cur: */ static bool xfs_rmap_update_is_needed( - struct xfs_mount *mp) + struct xfs_mount *mp, + int whichfork) { - return xfs_sb_version_hasrmapbt(&mp->m_sb); + return xfs_sb_version_hasrmapbt(&mp->m_sb) && whichfork != XFS_COW_FORK; } /* @@ -1311,7 +1312,7 @@ xfs_rmap_map_extent( int whichfork, struct xfs_bmbt_irec *PREV) { - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; return __xfs_rmap_add(mp, dfops, XFS_RMAP_MAP, ip->i_ino, @@ -1327,7 +1328,7 @@ xfs_rmap_unmap_extent( int whichfork, struct xfs_bmbt_irec *PREV) { - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; return __xfs_rmap_add(mp, dfops, XFS_RMAP_UNMAP, ip->i_ino, @@ -1343,7 +1344,7 @@ xfs_rmap_convert_extent( int whichfork, struct xfs_bmbt_irec *PREV) { - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; return __xfs_rmap_add(mp, dfops, XFS_RMAP_CONVERT, ip->i_ino, @@ -1362,7 +1363,7 @@ xfs_rmap_alloc_extent( { struct xfs_bmbt_irec bmap; - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, XFS_DATA_FORK)) return 0; bmap.br_startblock = XFS_AGB_TO_FSB(mp, agno, bno); @@ -1386,7 +1387,7 @@ xfs_rmap_free_extent( { struct xfs_bmbt_irec bmap; - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, XFS_DATA_FORK)) return 0; bmap.br_startblock = XFS_AGB_TO_FSB(mp, agno, bno); diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index 690d616..cf044c0 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -93,6 +93,7 @@ typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ */ #define XFS_DATA_FORK 0 #define XFS_ATTR_FORK 1 +#define XFS_COW_FORK 2 /* * Min numbers of data/attr fork btree root pointers. diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index fb39a66..b5ccd20 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -76,6 +76,9 @@ xfs_inode_alloc( ip->i_mount = mp; memset(&ip->i_imap, 0, sizeof(struct xfs_imap)); ip->i_afp = NULL; + ip->i_cowfp = NULL; + ip->i_cnextents = 0; + ip->i_cformat = XFS_DINODE_FMT_EXTENTS; memset(&ip->i_df, 0, sizeof(xfs_ifork_t)); ip->i_flags = 0; ip->i_delayed_blks = 0; @@ -101,6 +104,8 @@ xfs_inode_free_callback( if (ip->i_afp) xfs_idestroy_fork(ip, XFS_ATTR_FORK); + if (ip->i_cowfp) + xfs_idestroy_fork(ip, XFS_COW_FORK); if (ip->i_itemp) { ASSERT(!(ip->i_itemp->ili_item.li_flags & XFS_LI_IN_AIL)); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 7283db3..7b2e858 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -47,6 +47,7 @@ typedef struct xfs_inode { /* Extent information. */ xfs_ifork_t *i_afp; /* attribute fork pointer */ + xfs_ifork_t *i_cowfp; /* copy on write extents */ xfs_ifork_t i_df; /* data fork */ /* operations vectors */ @@ -65,6 +66,9 @@ typedef struct xfs_inode { struct xfs_icdinode i_d; /* most of ondisk inode */ + xfs_extnum_t i_cnextents; /* # of extents in cow fork */ + unsigned int i_cformat; /* format of cow fork */ + /* VFS inode */ struct inode i_vnode; /* embedded VFS inode */ } xfs_inode_t; diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c new file mode 100644 index 0000000..7adbb83 --- /dev/null +++ b/fs/xfs/xfs_reflink.c @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" +#include "xfs_inode.h" +#include "xfs_trans.h" +#include "xfs_inode_item.h" +#include "xfs_bmap.h" +#include "xfs_bmap_util.h" +#include "xfs_error.h" +#include "xfs_dir2.h" +#include "xfs_dir2_priv.h" +#include "xfs_ioctl.h" +#include "xfs_trace.h" +#include "xfs_log.h" +#include "xfs_icache.h" +#include "xfs_pnfs.h" +#include "xfs_refcount_btree.h" +#include "xfs_refcount.h" +#include "xfs_bmap_btree.h" +#include "xfs_trans_space.h" +#include "xfs_bit.h" +#include "xfs_alloc.h" +#include "xfs_quota_defs.h" +#include "xfs_quota.h" +#include "xfs_btree.h" +#include "xfs_bmap_btree.h" +#include "xfs_reflink.h" + +/* + * Copy on Write of Shared Blocks + * + * XFS must preserve "the usual" file semantics even when two files share + * the same physical blocks. This means that a write to one file must not + * alter the blocks in a different file; the way that we'll do that is + * through the use of a copy-on-write mechanism. At a high level, that + * means that when we want to write to a shared block, we allocate a new + * block, write the data to the new block, and if that succeeds we map the + * new block into the file. + * + * XFS provides a "delayed allocation" mechanism that defers the allocation + * of disk blocks to dirty-but-not-yet-mapped file blocks as long as + * possible. This reduces fragmentation by enabling the filesystem to ask + * for bigger chunks less often, which is exactly what we want for CoW. + * + * The delalloc mechanism begins when the kernel wants to make a block + * writable (write_begin or page_mkwrite). If the offset is not mapped, we + * create a delalloc mapping, which is a regular in-core extent, but without + * a real startblock. (For delalloc mappings, the startblock encodes both + * a flag that this is a delalloc mapping, and a worst-case estimate of how + * many blocks might be required to put the mapping into the BMBT.) delalloc + * mappings are a reservation against the free space in the filesystem; + * adjacent mappings can also be combined into fewer larger mappings. + * + * When dirty pages are being written out (typically in writepage), the + * delalloc reservations are converted into real mappings by allocating + * blocks and replacing the delalloc mapping with real ones. A delalloc + * mapping can be replaced by several real ones if the free space is + * fragmented. + * + * We want to adapt the delalloc mechanism for copy-on-write, since the + * write paths are similar. The first two steps (creating the reservation + * and allocating the blocks) are exactly the same as delalloc except that + * the mappings must be stored in a separate CoW fork because we do not want + * to disturb the mapping in the data fork until we're sure that the write + * succeeded. IO completion in this case is the process of removing the old + * mapping from the data fork and moving the new mapping from the CoW fork to + * the data fork. This will be discussed shortly. + * + * For now, unaligned directio writes will be bounced back to the page cache. + * Block-aligned directio writes will use the same mechanism as buffered + * writes. + * + * CoW remapping must be done after the data block write completes, + * because we don't want to destroy the old data fork map until we're sure + * the new block has been written. Since the new mappings are kept in a + * separate fork, we can simply iterate these mappings to find the ones + * that cover the file blocks that we just CoW'd. For each extent, simply + * unmap the corresponding range in the data fork, map the new range into + * the data fork, and remove the extent from the CoW fork. + * + * Since the remapping operation can be applied to an arbitrary file + * range, we record the need for the remap step as a flag in the ioend + * instead of declaring a new IO type. This is required for direct io + * because we only have ioend for the whole dio, and we have to be able to + * remember the presence of unwritten blocks and CoW blocks with a single + * ioend structure. Better yet, the more ground we can cover with one + * ioend, the better. + */ diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h new file mode 100644 index 0000000..820b151 --- /dev/null +++ b/fs/xfs/xfs_reflink.h @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_REFLINK_H +#define __XFS_REFLINK_H 1 + +#endif /* __XFS_REFLINK_H */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 57ef0fa..73d92be 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -269,10 +269,10 @@ DECLARE_EVENT_CLASS(xfs_bmap_class, __field(unsigned long, caller_ip) ), TP_fast_assign( - struct xfs_ifork *ifp = (state & BMAP_ATTRFORK) ? - ip->i_afp : &ip->i_df; + struct xfs_ifork *ifp; struct xfs_bmbt_irec r; + ifp = XFS_IEXT_STATE_TO_FORK(ip, state); xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx), &r); __entry->dev = VFS_I(ip)->i_sb->s_dev; __entry->ino = ip->i_ino; From darrick.wong@oracle.com Thu Aug 25 18:35:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 48CE67DC2 for ; Thu, 25 Aug 2016 18:35:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0CE6B8F8033 for ; Thu, 25 Aug 2016 16:35:46 -0700 (PDT) X-ASG-Debug-ID: 1472168144-0bf57c55b11c78c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id sJRI7qYJ1fANIKo7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:44 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZgM8019789 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:35:43 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNZg88003559 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:42 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZf6l014528; Thu, 25 Aug 2016 23:35:41 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:41 -0700 Subject: [PATCH 34/71] xfs: support bmapping delalloc extents in the CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 34/71] xfs: support bmapping delalloc extents in the CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:40 -0700 Message-ID: <147216814006.867.6404376654574855233.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168144 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8327 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Allow the creation of delayed allocation extents in the CoW fork. In a subsequent patch we'll wire up write_begin and page_mkwrite to actually do this. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 29 +++++++++++++++++----------- fs/xfs/libxfs/xfs_bmap.h | 2 +- fs/xfs/xfs_iomap.c | 48 +++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_iomap.h | 2 ++ 4 files changed, 60 insertions(+), 21 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index f745d7e..6f2a080 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -2760,6 +2760,7 @@ done: STATIC void xfs_bmap_add_extent_hole_delay( xfs_inode_t *ip, /* incore inode pointer */ + int whichfork, xfs_extnum_t *idx, /* extent number to update/insert */ xfs_bmbt_irec_t *new) /* new data to add to file extents */ { @@ -2771,8 +2772,10 @@ xfs_bmap_add_extent_hole_delay( int state; /* state bits, accessed thru macros */ xfs_filblks_t temp=0; /* temp for indirect calculations */ - ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + ifp = XFS_IFORK_PTR(ip, whichfork); state = 0; + if (whichfork == XFS_COW_FORK) + state |= BMAP_COWFORK; ASSERT(isnullstartblock(new->br_startblock)); /* @@ -2790,7 +2793,7 @@ xfs_bmap_add_extent_hole_delay( * Check and set flags if the current (right) segment exists. * If it doesn't exist, we're converting the hole at end-of-file. */ - if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + if (*idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); @@ -4141,6 +4144,7 @@ xfs_bmapi_read( STATIC int xfs_bmapi_reserve_delalloc( struct xfs_inode *ip, + int whichfork, xfs_fileoff_t aoff, xfs_filblks_t len, struct xfs_bmbt_irec *got, @@ -4149,7 +4153,7 @@ xfs_bmapi_reserve_delalloc( int eof) { struct xfs_mount *mp = ip->i_mount; - struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); xfs_extlen_t alen; xfs_extlen_t indlen; char rt = XFS_IS_REALTIME_INODE(ip); @@ -4208,7 +4212,7 @@ xfs_bmapi_reserve_delalloc( got->br_startblock = nullstartblock(indlen); got->br_blockcount = alen; got->br_state = XFS_EXT_NORM; - xfs_bmap_add_extent_hole_delay(ip, lastx, got); + xfs_bmap_add_extent_hole_delay(ip, whichfork, lastx, got); /* * Update our extent pointer, given that xfs_bmap_add_extent_hole_delay @@ -4240,6 +4244,7 @@ out_unreserve_quota: int xfs_bmapi_delay( struct xfs_inode *ip, /* incore inode */ + int whichfork, /* data or cow fork? */ xfs_fileoff_t bno, /* starting file offs. mapped */ xfs_filblks_t len, /* length to map in file */ struct xfs_bmbt_irec *mval, /* output: map values */ @@ -4247,7 +4252,7 @@ xfs_bmapi_delay( int flags) /* XFS_BMAPI_... */ { struct xfs_mount *mp = ip->i_mount; - struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); struct xfs_bmbt_irec got; /* current file extent record */ struct xfs_bmbt_irec prev; /* previous file extent record */ xfs_fileoff_t obno; /* old block number (offset) */ @@ -4257,14 +4262,15 @@ xfs_bmapi_delay( int n = 0; /* current extent index */ int error = 0; + ASSERT(whichfork == XFS_DATA_FORK || whichfork == XFS_COW_FORK); ASSERT(*nmap >= 1); ASSERT(*nmap <= XFS_BMAP_MAX_NMAP); ASSERT(!(flags & ~XFS_BMAPI_ENTIRE)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); if (unlikely(XFS_TEST_ERROR( - (XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_BTREE), + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { XFS_ERROR_REPORT("xfs_bmapi_delay", XFS_ERRLEVEL_LOW, mp); return -EFSCORRUPTED; @@ -4275,19 +4281,20 @@ xfs_bmapi_delay( XFS_STATS_INC(mp, xs_blk_mapw); - if (!(ifp->if_flags & XFS_IFEXTENTS)) { - error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK); + if (whichfork == XFS_DATA_FORK && !(ifp->if_flags & XFS_IFEXTENTS)) { + error = xfs_iread_extents(NULL, ip, whichfork); if (error) return error; } - xfs_bmap_search_extents(ip, bno, XFS_DATA_FORK, &eof, &lastx, &got, &prev); + xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev); end = bno + len; obno = bno; while (bno < end && n < *nmap) { if (eof || got.br_startoff > bno) { - error = xfs_bmapi_reserve_delalloc(ip, bno, len, &got, + error = xfs_bmapi_reserve_delalloc(ip, whichfork, + bno, len, &got, &prev, &lastx, eof); if (error) { if (n == 0) { diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index e686a1b..9f2c7ec 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -208,7 +208,7 @@ int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip, int xfs_bmapi_read(struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, struct xfs_bmbt_irec *mval, int *nmap, int flags); -int xfs_bmapi_delay(struct xfs_inode *ip, xfs_fileoff_t bno, +int xfs_bmapi_delay(struct xfs_inode *ip, int whichfork, xfs_fileoff_t bno, xfs_filblks_t len, struct xfs_bmbt_irec *mval, int *nmap, int flags); int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 2af0dda..1835f3e 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -561,12 +561,13 @@ check_writeio: return alloc_blocks; } -int -xfs_iomap_write_delay( +STATIC int +__xfs_iomap_write_delay( xfs_inode_t *ip, xfs_off_t offset, size_t count, - xfs_bmbt_irec_t *ret_imap) + xfs_bmbt_irec_t *ret_imap, + int whichfork) { xfs_mount_t *mp = ip->i_mount; xfs_fileoff_t offset_fsb; @@ -592,10 +593,14 @@ xfs_iomap_write_delay( extsz = xfs_get_extsz_hint(ip); offset_fsb = XFS_B_TO_FSBT(mp, offset); - error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count, - imap, XFS_WRITE_IMAPS, &prealloc); - if (error) - return error; + if (whichfork == XFS_DATA_FORK) { + error = xfs_iomap_eof_want_preallocate(mp, ip, offset, count, + imap, XFS_WRITE_IMAPS, &prealloc); + if (error) + return error; + } else { + prealloc = 0; + } retry: if (prealloc) { @@ -627,8 +632,8 @@ retry: ASSERT(last_fsb > offset_fsb); nimaps = XFS_WRITE_IMAPS; - error = xfs_bmapi_delay(ip, offset_fsb, last_fsb - offset_fsb, - imap, &nimaps, XFS_BMAPI_ENTIRE); + error = xfs_bmapi_delay(ip, whichfork, offset_fsb, + last_fsb - offset_fsb, imap, &nimaps, XFS_BMAPI_ENTIRE); switch (error) { case 0: case -ENOSPC: @@ -666,6 +671,31 @@ retry: return 0; } +int +xfs_iomap_write_delay( + xfs_inode_t *ip, + xfs_off_t offset, + size_t count, + xfs_bmbt_irec_t *ret_imap) +{ + return __xfs_iomap_write_delay(ip, offset, count, ret_imap, + XFS_DATA_FORK); +} + +int +xfs_iomap_cow_delay( + xfs_inode_t *ip, + xfs_off_t offset, + size_t count, + xfs_bmbt_irec_t *ret_imap) +{ + ASSERT(XFS_IFORK_PTR(ip, XFS_COW_FORK) != NULL); + trace_xfs_iomap_cow_delay(ip, offset, count); + + return __xfs_iomap_write_delay(ip, offset, count, ret_imap, + XFS_COW_FORK); +} + /* * Pass in a delayed allocate extent, convert it to real extents; * return to the caller the extent we create which maps on top of diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index fb8aca3..0fd6df3 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -30,6 +30,8 @@ int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, struct xfs_bmbt_irec *); int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); +int xfs_iomap_cow_delay(struct xfs_inode *, xfs_off_t, size_t, + struct xfs_bmbt_irec *); void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *, struct xfs_bmbt_irec *); From darrick.wong@oracle.com Thu Aug 25 18:35:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BBE037DA5 for ; Thu, 25 Aug 2016 18:35:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 23A12AC002 for ; Thu, 25 Aug 2016 16:35:55 -0700 (PDT) X-ASG-Debug-ID: 1472168152-0bf57b5314209340001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id bD7KQfI9lHz58QEN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:52 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZnnN019889 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:49 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZmIK016925 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:49 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZmdJ029439; Thu, 25 Aug 2016 23:35:48 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:47 -0700 Subject: [PATCH 35/71] xfs: create delalloc extents in CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 35/71] xfs: create delalloc extents in CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:46 -0700 Message-ID: <147216814632.867.1974926574237679668.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168152 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7338 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Wire up write_begin and page_mkwrite to detect shared extents and create delayed allocation extents in the CoW fork. v2: Make trim_extent better at constraining the extent to just the range passed in. Signed-off-by: Darrick J. Wong [hch: rewrite for the iomap-based write path] Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_iomap.c | 12 +++ fs/xfs/xfs_reflink.c | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 6 ++ 3 files changed, 202 insertions(+) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 1835f3e..f4b735d 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -38,6 +38,7 @@ #include "xfs_quota.h" #include "xfs_dquot_item.h" #include "xfs_dquot.h" +#include "xfs_reflink.h" #define XFS_WRITEIO_ALIGN(mp,off) (((off) >> mp->m_writeio_log) \ @@ -1035,6 +1036,17 @@ xfs_file_iomap_begin( offset_fsb = XFS_B_TO_FSBT(mp, offset); end_fsb = XFS_B_TO_FSB(mp, offset + length); + /* Reserve delalloc blocks for CoW. */ + if ((flags & (IOMAP_WRITE | IOMAP_ZERO)) && xfs_is_reflink_inode(ip)) { + trace_xfs_reflink_reserve_cow_range(ip, offset, length); + + error = xfs_reflink_reserve_cow_range(ip, offset_fsb, end_fsb); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + } + } + error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, &nimaps, XFS_BMAPI_ENTIRE); if (error) { diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 7adbb83..eea0120 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -51,6 +51,7 @@ #include "xfs_btree.h" #include "xfs_bmap_btree.h" #include "xfs_reflink.h" +#include "xfs_iomap.h" /* * Copy on Write of Shared Blocks @@ -112,3 +113,186 @@ * ioend structure. Better yet, the more ground we can cover with one * ioend, the better. */ + +/* Trim extent to fit a logical block range. */ +static void +xfs_trim_extent( + struct xfs_bmbt_irec *irec, + xfs_fileoff_t bno, + xfs_filblks_t len) +{ + xfs_fileoff_t distance; + xfs_fileoff_t end = bno + len; + + if (irec->br_startoff + irec->br_blockcount <= bno || + irec->br_startoff >= end) { + irec->br_blockcount = 0; + return; + } + + if (irec->br_startoff < bno) { + distance = bno - irec->br_startoff; + if (irec->br_startblock != DELAYSTARTBLOCK && + irec->br_startblock != HOLESTARTBLOCK) + irec->br_startblock += distance; + irec->br_startoff += distance; + irec->br_blockcount -= distance; + } + + if (end < irec->br_startoff + irec->br_blockcount) { + distance = irec->br_startoff + irec->br_blockcount - end; + irec->br_blockcount -= distance; + } +} + +/* + * Given an AG extent, find the lowest-numbered run of shared blocks within + * that range and return the range in fbno/flen. + */ +int +xfs_reflink_find_shared( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + xfs_agblock_t *fbno, + xfs_extlen_t *flen, + bool find_maximal) +{ + struct xfs_buf *agbp; + struct xfs_btree_cur *cur; + int error; + + error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + if (error) + return error; + + cur = xfs_refcountbt_init_cursor(mp, NULL, agbp, agno, NULL); + + error = xfs_refcount_find_shared(cur, agbno, aglen, fbno, flen, + find_maximal); + + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + + xfs_buf_relse(agbp); + return error; +} + +/* Find the shared ranges under an irec, and set up delalloc extents. */ +static int +xfs_reflink_reserve_cow_extent( + struct xfs_inode *ip, + struct xfs_bmbt_irec *irec) +{ + struct xfs_bmbt_irec rec; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + xfs_extlen_t aglen; + xfs_agblock_t fbno; + xfs_extlen_t flen; + xfs_fileoff_t lblk; + xfs_off_t foffset; + xfs_extlen_t distance; + size_t fsize; + int error = 0; + + /* Holes, unwritten, and delalloc extents cannot be shared */ + if (ISUNWRITTEN(irec) || + irec->br_startblock == HOLESTARTBLOCK || + irec->br_startblock == DELAYSTARTBLOCK) + return 0; + + trace_xfs_reflink_reserve_cow_extent(ip, irec); + agno = XFS_FSB_TO_AGNO(ip->i_mount, irec->br_startblock); + agbno = XFS_FSB_TO_AGBNO(ip->i_mount, irec->br_startblock); + lblk = irec->br_startoff; + aglen = irec->br_blockcount; + + while (aglen > 0) { + /* Find maximal fork range within this extent */ + error = xfs_reflink_find_shared(ip->i_mount, agno, agbno, + aglen, &fbno, &flen, true); + if (error) + break; + if (flen == 0) { + distance = fbno - agbno; + goto advloop; + } + + /* Add as much as we can to the cow fork */ + foffset = XFS_FSB_TO_B(ip->i_mount, lblk + fbno - agbno); + fsize = XFS_FSB_TO_B(ip->i_mount, flen); + error = xfs_iomap_cow_delay(ip, foffset, fsize, &rec); + if (error) + break; + + distance = (rec.br_startoff - lblk) + rec.br_blockcount; +advloop: + if (aglen < distance) + break; + aglen -= distance; + agbno += distance; + lblk += distance; + } + + if (error) + trace_xfs_reflink_reserve_cow_extent_error(ip, error, _RET_IP_); + return error; +} + +/* + * Create CoW reservations for all shared blocks within a byte range of + * a file. + */ +int +xfs_reflink_reserve_cow_range( + struct xfs_inode *ip, + xfs_fileoff_t offset_fsb, + xfs_fileoff_t end_fsb) +{ + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec imap; + xfs_extnum_t idx; + int nimaps, error = 0; + + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + + trace_xfs_reflink_reserve_cow_range(ip, + XFS_FSB_TO_B(ip->i_mount, end_fsb - offset_fsb), + XFS_FSB_TO_B(ip->i_mount, offset_fsb)); + + while (offset_fsb < end_fsb) { + /* Already reserved? Skip the refcount btree access. */ + gotp = xfs_iext_bno_to_ext(ifp, offset_fsb, &idx); + if (gotp) { + xfs_bmbt_get_all(gotp, &imap); + if (imap.br_startoff <= offset_fsb && + imap.br_startoff + imap.br_blockcount > offset_fsb) { + offset_fsb = imap.br_startoff + imap.br_blockcount; + continue; + } + } + + /* Read extent from the source file. */ + nimaps = 1; + error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, + &imap, &nimaps, 0); + if (error) + break; + + if (nimaps == 0) + break; + + /* Fork all the shared blocks in this extent. */ + error = xfs_reflink_reserve_cow_extent(ip, &imap); + if (error) + break; + + offset_fsb += imap.br_blockcount; + } + + if (error) + trace_xfs_reflink_reserve_cow_range_error(ip, error, _RET_IP_); + return error; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 820b151..a724cb8 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -20,4 +20,10 @@ #ifndef __XFS_REFLINK_H #define __XFS_REFLINK_H 1 +extern int xfs_reflink_find_shared(struct xfs_mount *mp, xfs_agnumber_t agno, + xfs_agblock_t agbno, xfs_extlen_t aglen, xfs_agblock_t *fbno, + xfs_extlen_t *flen, bool find_maximal); +extern int xfs_reflink_reserve_cow_range(struct xfs_inode *ip, + xfs_fileoff_t offset_fsb, xfs_fileoff_t end_fsb); + #endif /* __XFS_REFLINK_H */ From darrick.wong@oracle.com Thu Aug 25 18:35:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 26F077DD3 for ; Thu, 25 Aug 2016 18:35:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8E7DAC001 for ; Thu, 25 Aug 2016 16:35:58 -0700 (PDT) X-ASG-Debug-ID: 1472168156-0bf81509b01dead0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 4nRM3jqoKrD4kH05 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:35:56 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNZtij019936 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:55 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNZtRL007562 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:35:55 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNZsf6017258; Thu, 25 Aug 2016 23:35:54 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:35:54 -0700 Subject: [PATCH 36/71] xfs: support allocating delayed extents in CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 36/71] xfs: support allocating delayed extents in CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:52 -0700 Message-ID: <147216815266.867.17036043400244206259.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168156 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9620 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Modify xfs_bmap_add_extent_delay_real() so that we can convert delayed allocation extents in the CoW fork to real allocations, and wire this up all the way back to xfs_iomap_write_allocate(). In a subsequent patch, we'll modify the writepage handler to call this. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 51 ++++++++++++++++++++++++++++++++-------------- fs/xfs/xfs_aops.c | 6 ++++- fs/xfs/xfs_iomap.c | 7 +++++- fs/xfs/xfs_iomap.h | 2 +- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 6f2a080..c61c988 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -141,7 +141,8 @@ xfs_bmbt_lookup_ge( */ static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfork) { - return XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS && + return whichfork != XFS_COW_FORK && + XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS && XFS_IFORK_NEXTENTS(ip, whichfork) > XFS_IFORK_MAXEXT(ip, whichfork); } @@ -151,7 +152,8 @@ static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfork) */ static inline bool xfs_bmap_wants_extents(struct xfs_inode *ip, int whichfork) { - return XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE && + return whichfork != XFS_COW_FORK && + XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE && XFS_IFORK_NEXTENTS(ip, whichfork) <= XFS_IFORK_MAXEXT(ip, whichfork); } @@ -641,6 +643,7 @@ xfs_bmap_btree_to_extents( mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); + ASSERT(whichfork != XFS_COW_FORK); ASSERT(ifp->if_flags & XFS_IFEXTENTS); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE); rblock = ifp->if_broot; @@ -707,6 +710,7 @@ xfs_bmap_extents_to_btree( xfs_bmbt_ptr_t *pp; /* root block address pointer */ mp = ip->i_mount; + ASSERT(whichfork != XFS_COW_FORK); ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS); @@ -838,6 +842,7 @@ xfs_bmap_local_to_extents_empty( { struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); + ASSERT(whichfork != XFS_COW_FORK); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL); ASSERT(ifp->if_bytes == 0); ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0); @@ -1671,7 +1676,8 @@ xfs_bmap_one_block( */ STATIC int /* error */ xfs_bmap_add_extent_delay_real( - struct xfs_bmalloca *bma) + struct xfs_bmalloca *bma, + int whichfork) { struct xfs_bmbt_irec *new = &bma->got; int diff; /* temp value */ @@ -1689,11 +1695,14 @@ xfs_bmap_add_extent_delay_real( xfs_filblks_t temp=0; /* value for da_new calculations */ xfs_filblks_t temp2=0;/* value for da_new calculations */ int tmp_rval; /* partial logging flags */ - int whichfork = XFS_DATA_FORK; struct xfs_mount *mp; + xfs_extnum_t *nextents; mp = bma->ip->i_mount; ifp = XFS_IFORK_PTR(bma->ip, whichfork); + ASSERT(whichfork != XFS_ATTR_FORK); + nextents = (whichfork == XFS_COW_FORK ? &bma->ip->i_cnextents : + &bma->ip->i_d.di_nextents); ASSERT(bma->idx >= 0); ASSERT(bma->idx <= ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); @@ -1707,6 +1716,9 @@ xfs_bmap_add_extent_delay_real( #define RIGHT r[1] #define PREV r[2] + if (whichfork == XFS_COW_FORK) + state |= BMAP_COWFORK; + /* * Set up a bunch of variables to make the tests simpler. */ @@ -1793,7 +1805,7 @@ xfs_bmap_add_extent_delay_real( trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_iext_remove(bma->ip, bma->idx + 1, 2, state); - bma->ip->i_d.di_nextents--; + (*nextents)--; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -1895,7 +1907,7 @@ xfs_bmap_add_extent_delay_real( xfs_bmbt_set_startblock(ep, new->br_startblock); trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - bma->ip->i_d.di_nextents++; + (*nextents)++; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -1965,7 +1977,7 @@ xfs_bmap_add_extent_delay_real( temp = PREV.br_blockcount - new->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); xfs_iext_insert(bma->ip, bma->idx, 1, new, state); - bma->ip->i_d.di_nextents++; + (*nextents)++; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -2049,7 +2061,7 @@ xfs_bmap_add_extent_delay_real( trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); xfs_iext_insert(bma->ip, bma->idx + 1, 1, new, state); - bma->ip->i_d.di_nextents++; + (*nextents)++; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -2118,7 +2130,7 @@ xfs_bmap_add_extent_delay_real( RIGHT.br_blockcount = temp2; /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ xfs_iext_insert(bma->ip, bma->idx + 1, 2, &LEFT, state); - bma->ip->i_d.di_nextents++; + (*nextents)++; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -2216,7 +2228,8 @@ xfs_bmap_add_extent_delay_real( xfs_bmap_check_leaf_extents(bma->cur, bma->ip, whichfork); done: - bma->logflags |= rval; + if (whichfork != XFS_COW_FORK) + bma->logflags |= rval; return error; #undef LEFT #undef RIGHT @@ -3857,7 +3870,8 @@ xfs_bmap_btalloc( ASSERT(nullfb || fb_agno == args.agno || (ap->dfops->dop_low && fb_agno < args.agno)); ap->length = args.len; - ap->ip->i_d.di_nblocks += args.len; + if (!(ap->flags & XFS_BMAPI_COWFORK)) + ap->ip->i_d.di_nblocks += args.len; xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); if (ap->wasdel) ap->ip->i_delayed_blks -= args.len; @@ -4331,8 +4345,7 @@ xfs_bmapi_allocate( struct xfs_bmalloca *bma) { struct xfs_mount *mp = bma->ip->i_mount; - int whichfork = (bma->flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + int whichfork = xfs_bmapi_whichfork(bma->flags); struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); int tmp_logflags = 0; int error; @@ -4421,7 +4434,7 @@ xfs_bmapi_allocate( bma->got.br_state = XFS_EXT_UNWRITTEN; if (bma->wasdel) - error = xfs_bmap_add_extent_delay_real(bma); + error = xfs_bmap_add_extent_delay_real(bma, whichfork); else error = xfs_bmap_add_extent_hole_real(bma, whichfork); @@ -4575,8 +4588,7 @@ xfs_bmapi_write( orig_mval = mval; orig_nmap = *nmap; #endif - whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + whichfork = xfs_bmapi_whichfork(flags); ASSERT(*nmap >= 1); ASSERT(*nmap <= XFS_BMAP_MAX_NMAP); @@ -4587,6 +4599,11 @@ xfs_bmapi_write( ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); if (whichfork == XFS_ATTR_FORK) ASSERT(!(flags & XFS_BMAPI_REMAP)); + if (whichfork == XFS_COW_FORK) { + ASSERT(!(flags & XFS_BMAPI_REMAP)); + ASSERT(!(flags & XFS_BMAPI_PREALLOC)); + ASSERT(!(flags & XFS_BMAPI_CONVERT)); + } if (flags & XFS_BMAPI_REMAP) { ASSERT(!(flags & XFS_BMAPI_PREALLOC)); ASSERT(!(flags & XFS_BMAPI_CONVERT)); @@ -4656,6 +4673,8 @@ xfs_bmapi_write( */ if (flags & XFS_BMAPI_REMAP) ASSERT(inhole); + if (flags & XFS_BMAPI_COWFORK) + ASSERT(!inhole); /* * First, deal with the hole before the allocated space diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 7575cfc..4821176 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -345,9 +345,11 @@ xfs_map_blocks( if (type == XFS_IO_DELALLOC && (!nimaps || isnullstartblock(imap->br_startblock))) { - error = xfs_iomap_write_allocate(ip, offset, imap); + error = xfs_iomap_write_allocate(ip, XFS_DATA_FORK, offset, + imap); if (!error) - trace_xfs_map_blocks_alloc(ip, offset, count, type, imap); + trace_xfs_map_blocks_alloc(ip, offset, count, type, + imap); return error; } diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index f4b735d..6065bde 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -710,6 +710,7 @@ xfs_iomap_cow_delay( int xfs_iomap_write_allocate( xfs_inode_t *ip, + int whichfork, xfs_off_t offset, xfs_bmbt_irec_t *imap) { @@ -722,8 +723,12 @@ xfs_iomap_write_allocate( xfs_trans_t *tp; int nimaps; int error = 0; + int flags = 0; int nres; + if (whichfork == XFS_COW_FORK) + flags |= XFS_BMAPI_COWFORK; + /* * Make sure that the dquots are there. */ @@ -817,7 +822,7 @@ xfs_iomap_write_allocate( * pointer that the caller gave to us. */ error = xfs_bmapi_write(tp, ip, map_start_fsb, - count_fsb, 0, &first_block, + count_fsb, flags, &first_block, nres, imap, &nimaps, &dfops); if (error) diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index 0fd6df3..52f9c99 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -27,7 +27,7 @@ int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, struct xfs_bmbt_irec *, int); int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, struct xfs_bmbt_irec *); -int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, +int xfs_iomap_write_allocate(struct xfs_inode *, int, xfs_off_t, struct xfs_bmbt_irec *); int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, xfs_off_t); int xfs_iomap_cow_delay(struct xfs_inode *, xfs_off_t, size_t, From darrick.wong@oracle.com Thu Aug 25 18:36:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6715C7DCD for ; Thu, 25 Aug 2016 18:36:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1C8FAC001 for ; Thu, 25 Aug 2016 16:36:07 -0700 (PDT) X-ASG-Debug-ID: 1472168163-0bf57c55b21c78e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id vZPPOLNMoc2hVDAN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:03 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNa1Kb020210 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:02 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNa1th017184 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:01 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNa0Yv017270; Thu, 25 Aug 2016 23:36:00 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:00 -0700 Subject: [PATCH 37/71] xfs: allocate delayed extents in CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 37/71] xfs: allocate delayed extents in CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:35:59 -0700 Message-ID: <147216815895.867.10851568007441923678.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168163 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8236 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Modify the writepage handler to find and convert pending delalloc extents to real allocations. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_aops.c | 58 ++++++++++++++++++++++++--- fs/xfs/xfs_aops.h | 4 +- fs/xfs/xfs_reflink.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 5 ++ 4 files changed, 165 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 4821176..f0f83d4 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -31,6 +31,7 @@ #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_bmap_btree.h" +#include "xfs_reflink.h" #include #include #include @@ -320,10 +321,15 @@ xfs_map_blocks( int error = 0; int bmapi_flags = XFS_BMAPI_ENTIRE; int nimaps = 1; + int whichfork; + bool need_alloc; if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; + whichfork = (type == XFS_IO_COW ? XFS_COW_FORK : XFS_DATA_FORK); + need_alloc = (type == XFS_IO_DELALLOC); + if (type == XFS_IO_UNWRITTEN) bmapi_flags |= XFS_BMAPI_IGSTATE; @@ -336,16 +342,29 @@ xfs_map_blocks( count = mp->m_super->s_maxbytes - offset; end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count); offset_fsb = XFS_B_TO_FSBT(mp, offset); - error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, - imap, &nimaps, bmapi_flags); + + if (type == XFS_IO_COW) + error = xfs_reflink_find_cow_mapping(ip, offset, imap, + &need_alloc); + else { + error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, + imap, &nimaps, bmapi_flags); + /* + * Truncate an overwrite extent if there's a pending CoW + * reservation before the end of this extent. This forces us + * to come back to writepage to take care of the CoW. + */ + if (nimaps && type == XFS_IO_OVERWRITE) + xfs_reflink_trim_irec_to_next_cow(ip, offset_fsb, imap); + } xfs_iunlock(ip, XFS_ILOCK_SHARED); if (error) return error; - if (type == XFS_IO_DELALLOC && + if (need_alloc && (!nimaps || isnullstartblock(imap->br_startblock))) { - error = xfs_iomap_write_allocate(ip, XFS_DATA_FORK, offset, + error = xfs_iomap_write_allocate(ip, whichfork, offset, imap); if (!error) trace_xfs_map_blocks_alloc(ip, offset, count, type, @@ -634,7 +653,8 @@ xfs_check_page_type( if (type == XFS_IO_DELALLOC) return true; } else if (buffer_dirty(bh) && buffer_mapped(bh)) { - if (type == XFS_IO_OVERWRITE) + if (type == XFS_IO_OVERWRITE || + type == XFS_IO_COW) return true; } @@ -646,6 +666,26 @@ xfs_check_page_type( return false; } +/* + * Figure out if CoW is pending at this offset. + */ +static bool +xfs_is_cow_io( + struct xfs_inode *ip, + xfs_off_t offset) +{ + bool is_cow; + + if (!xfs_sb_version_hasreflink(&ip->i_mount->m_sb)) + return false; + + xfs_ilock(ip, XFS_ILOCK_SHARED); + is_cow = xfs_reflink_is_cow_pending(ip, offset); + xfs_iunlock(ip, XFS_ILOCK_SHARED); + + return is_cow; +} + STATIC void xfs_vm_invalidatepage( struct page *page, @@ -754,6 +794,7 @@ xfs_writepage_map( int error = 0; int count = 0; int uptodate = 1; + unsigned int new_type; bh = head = page_buffers(page); offset = page_offset(page); @@ -785,8 +826,11 @@ xfs_writepage_map( wpc->imap_valid = false; } } else if (buffer_uptodate(bh)) { - if (wpc->io_type != XFS_IO_OVERWRITE) { - wpc->io_type = XFS_IO_OVERWRITE; + new_type = xfs_is_cow_io(XFS_I(inode), offset) ? + XFS_IO_COW : XFS_IO_OVERWRITE; + + if (wpc->io_type != new_type) { + wpc->io_type = new_type; wpc->imap_valid = false; } } else { diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h index bf2d9a1..5460db1 100644 --- a/fs/xfs/xfs_aops.h +++ b/fs/xfs/xfs_aops.h @@ -28,13 +28,15 @@ enum { XFS_IO_DELALLOC, /* covers delalloc region */ XFS_IO_UNWRITTEN, /* covers allocated but uninitialized data */ XFS_IO_OVERWRITE, /* covers already allocated extent */ + XFS_IO_COW, /* covers copy-on-write extent */ }; #define XFS_IO_TYPES \ { XFS_IO_INVALID, "invalid" }, \ { XFS_IO_DELALLOC, "delalloc" }, \ { XFS_IO_UNWRITTEN, "unwritten" }, \ - { XFS_IO_OVERWRITE, "overwrite" } + { XFS_IO_OVERWRITE, "overwrite" }, \ + { XFS_IO_COW, "CoW" } /* * Structure for buffered I/O completions. diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index eea0120..48c8a6e 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -296,3 +296,109 @@ xfs_reflink_reserve_cow_range( trace_xfs_reflink_reserve_cow_range_error(ip, error, _RET_IP_); return error; } + +/* + * Determine if there's a CoW reservation at a byte offset of an inode. + */ +bool +xfs_reflink_is_cow_pending( + struct xfs_inode *ip, + xfs_off_t offset) +{ + struct xfs_ifork *ifp; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec irec; + xfs_fileoff_t bno; + xfs_extnum_t idx; + + if (!xfs_is_reflink_inode(ip)) + return false; + + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); + bno = XFS_B_TO_FSBT(ip->i_mount, offset); + gotp = xfs_iext_bno_to_ext(ifp, bno, &idx); + + if (!gotp) + return false; + + xfs_bmbt_get_all(gotp, &irec); + if (bno >= irec.br_startoff + irec.br_blockcount || + bno < irec.br_startoff) + return false; + return true; +} + +/* + * Find the CoW reservation (and whether or not it needs block allocation) + * for a given byte offset of a file. + */ +int +xfs_reflink_find_cow_mapping( + struct xfs_inode *ip, + xfs_off_t offset, + struct xfs_bmbt_irec *imap, + bool *need_alloc) +{ + struct xfs_bmbt_irec irec; + struct xfs_ifork *ifp; + struct xfs_bmbt_rec_host *gotp; + xfs_fileoff_t bno; + xfs_extnum_t idx; + + /* Find the extent in the CoW fork. */ + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); + bno = XFS_B_TO_FSBT(ip->i_mount, offset); + gotp = xfs_iext_bno_to_ext(ifp, bno, &idx); + xfs_bmbt_get_all(gotp, &irec); + + trace_xfs_reflink_find_cow_mapping(ip, offset, 1, XFS_IO_OVERWRITE, + &irec); + + /* If it's still delalloc, we must allocate later. */ + *imap = irec; + *need_alloc = !!(isnullstartblock(irec.br_startblock)); + + return 0; +} + +/* + * Trim an extent to end at the next CoW reservation past offset_fsb. + */ +int +xfs_reflink_trim_irec_to_next_cow( + struct xfs_inode *ip, + xfs_fileoff_t offset_fsb, + struct xfs_bmbt_irec *imap) +{ + struct xfs_bmbt_irec irec; + struct xfs_ifork *ifp; + struct xfs_bmbt_rec_host *gotp; + xfs_extnum_t idx; + + if (!xfs_is_reflink_inode(ip)) + return 0; + + /* Find the extent in the CoW fork. */ + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); + gotp = xfs_iext_bno_to_ext(ifp, offset_fsb, &idx); + if (!gotp) + return 0; + xfs_bmbt_get_all(gotp, &irec); + + /* This is the extent before; try sliding up one. */ + if (irec.br_startoff < offset_fsb) { + idx++; + if (idx >= ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) + return 0; + gotp = xfs_iext_get_ext(ifp, idx); + xfs_bmbt_get_all(gotp, &irec); + } + + if (irec.br_startoff >= imap->br_startoff + imap->br_blockcount) + return 0; + + imap->br_blockcount = irec.br_startoff - imap->br_startoff; + trace_xfs_reflink_trim_irec(ip, imap); + + return 0; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index a724cb8..5dd0ff9 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -25,5 +25,10 @@ extern int xfs_reflink_find_shared(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_extlen_t *flen, bool find_maximal); extern int xfs_reflink_reserve_cow_range(struct xfs_inode *ip, xfs_fileoff_t offset_fsb, xfs_fileoff_t end_fsb); +extern bool xfs_reflink_is_cow_pending(struct xfs_inode *ip, xfs_off_t offset); +extern int xfs_reflink_find_cow_mapping(struct xfs_inode *ip, xfs_off_t offset, + struct xfs_bmbt_irec *imap, bool *need_alloc); +extern int xfs_reflink_trim_irec_to_next_cow(struct xfs_inode *ip, + xfs_fileoff_t offset_fsb, struct xfs_bmbt_irec *imap); #endif /* __XFS_REFLINK_H */ From darrick.wong@oracle.com Thu Aug 25 18:36:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6BF097DE4 for ; Thu, 25 Aug 2016 18:36:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E72C8F8033 for ; Thu, 25 Aug 2016 16:36:12 -0700 (PDT) X-ASG-Debug-ID: 1472168169-0bf57b5311209350001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id piSIjQ3YxdtNjAus (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:10 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNa7B8020296 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:08 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNa7Ie017636 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:07 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNa6rk017304; Thu, 25 Aug 2016 23:36:07 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:06 -0700 Subject: [PATCH 38/71] xfs: support removing extents from CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 38/71] xfs: support removing extents from CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:05 -0700 Message-ID: <147216816525.867.856348013561917093.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168169 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7132 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a helper method to remove extents from the CoW fork without any of the side effects (rmapbt/bmbt updates) of the regular extent deletion routine. We'll eventually use this to clear out the CoW fork during ioend processing. v2: Use bmapi_read to iterate and trim the CoW extents instead of reading them raw via the iext code. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 176 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_bmap.h | 1 2 files changed, 177 insertions(+) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index c61c988..37cd35d 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -4983,6 +4983,7 @@ xfs_bmap_del_extent( /* * Matches the whole extent. Delete the entry. */ + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_iext_remove(ip, *idx, 1, whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); --*idx; @@ -5200,6 +5201,181 @@ done: } /* + * xfs_bunmapi_cow() -- Remove the relevant parts of the CoW fork. + * See xfs_bmap_del_extent. + * @ip: XFS inode. + * @idx: Extent number to delete. + * @del: Extent to remove. + */ +int +xfs_bunmapi_cow( + xfs_inode_t *ip, + xfs_bmbt_irec_t *del) +{ + xfs_filblks_t da_new; /* new delay-alloc indirect blocks */ + xfs_filblks_t da_old; /* old delay-alloc indirect blocks */ + xfs_fsblock_t del_endblock = 0;/* first block past del */ + xfs_fileoff_t del_endoff; /* first offset past del */ + int delay; /* current block is delayed allocated */ + xfs_bmbt_rec_host_t *ep; /* current extent entry pointer */ + int error; /* error return value */ + xfs_bmbt_irec_t got; /* current extent entry */ + xfs_fileoff_t got_endoff; /* first offset past got */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_mount_t *mp; /* mount structure */ + xfs_filblks_t nblks; /* quota/sb block count */ + xfs_bmbt_irec_t new; /* new record to be inserted */ + /* REFERENCED */ + uint qfield; /* quota field to update */ + xfs_filblks_t temp; /* for indirect length calculations */ + xfs_filblks_t temp2; /* for indirect length calculations */ + int state = BMAP_COWFORK; + int eof; + xfs_extnum_t eidx; + + mp = ip->i_mount; + XFS_STATS_INC(mp, xs_del_exlist); + + ep = xfs_bmap_search_extents(ip, del->br_startoff, XFS_COW_FORK, &eof, + &eidx, &got, &new); + + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); ifp = ifp; + ASSERT((eidx >= 0) && (eidx < ifp->if_bytes / + (uint)sizeof(xfs_bmbt_rec_t))); + ASSERT(del->br_blockcount > 0); + ASSERT(got.br_startoff <= del->br_startoff); + del_endoff = del->br_startoff + del->br_blockcount; + got_endoff = got.br_startoff + got.br_blockcount; + ASSERT(got_endoff >= del_endoff); + delay = isnullstartblock(got.br_startblock); + ASSERT(isnullstartblock(del->br_startblock) == delay); + qfield = 0; + error = 0; + /* + * If deleting a real allocation, must free up the disk space. + */ + if (!delay) { + nblks = del->br_blockcount; + qfield = XFS_TRANS_DQ_BCOUNT; + /* + * Set up del_endblock and cur for later. + */ + del_endblock = del->br_startblock + del->br_blockcount; + da_old = da_new = 0; + } else { + da_old = startblockval(got.br_startblock); + da_new = 0; + nblks = 0; + } + qfield = qfield; + nblks = nblks; + + /* + * Set flag value to use in switch statement. + * Left-contig is 2, right-contig is 1. + */ + switch (((got.br_startoff == del->br_startoff) << 1) | + (got_endoff == del_endoff)) { + case 3: + /* + * Matches the whole extent. Delete the entry. + */ + xfs_iext_remove(ip, eidx, 1, BMAP_COWFORK); + --eidx; + break; + + case 2: + /* + * Deleting the first part of the extent. + */ + trace_xfs_bmap_pre_update(ip, eidx, state, _THIS_IP_); + xfs_bmbt_set_startoff(ep, del_endoff); + temp = got.br_blockcount - del->br_blockcount; + xfs_bmbt_set_blockcount(ep, temp); + if (delay) { + temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_old); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + da_new = temp; + break; + } + xfs_bmbt_set_startblock(ep, del_endblock); + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + break; + + case 1: + /* + * Deleting the last part of the extent. + */ + temp = got.br_blockcount - del->br_blockcount; + trace_xfs_bmap_pre_update(ip, eidx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + if (delay) { + temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_old); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + da_new = temp; + break; + } + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + break; + + case 0: + /* + * Deleting the middle of the extent. + */ + temp = del->br_startoff - got.br_startoff; + trace_xfs_bmap_pre_update(ip, eidx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + new.br_startoff = del_endoff; + temp2 = got_endoff - del_endoff; + new.br_blockcount = temp2; + new.br_state = got.br_state; + if (!delay) { + new.br_startblock = del_endblock; + } else { + temp = xfs_bmap_worst_indlen(ip, temp); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + temp2 = xfs_bmap_worst_indlen(ip, temp2); + new.br_startblock = nullstartblock((int)temp2); + da_new = temp + temp2; + while (da_new > da_old) { + if (temp) { + temp--; + da_new--; + xfs_bmbt_set_startblock(ep, + nullstartblock((int)temp)); + } + if (da_new == da_old) + break; + if (temp2) { + temp2--; + da_new--; + new.br_startblock = + nullstartblock((int)temp2); + } + } + } + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + xfs_iext_insert(ip, eidx + 1, 1, &new, state); + ++eidx; + break; + } + + /* + * Account for change in delayed indirect blocks. + * Nothing to do for disk quota accounting here. + */ + ASSERT(da_old >= da_new); + if (da_old > da_new) + xfs_mod_fdblocks(mp, (int64_t)(da_old - da_new), false); + + return error; +} + +/* * Unmap (remove) blocks from a file. * If nexts is nonzero then the number of extents to remove is limited to * that value. If not all extents in the block range can be removed then diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 9f2c7ec..134ea00 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -224,6 +224,7 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, int flags, xfs_extnum_t nexts, xfs_fsblock_t *firstblock, struct xfs_defer_ops *dfops, int *done); +int xfs_bunmapi_cow(struct xfs_inode *ip, struct xfs_bmbt_irec *del); int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); From darrick.wong@oracle.com Thu Aug 25 18:36:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7647C7DDA for ; Thu, 25 Aug 2016 18:36:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2D3E4304051 for ; Thu, 25 Aug 2016 16:36:20 -0700 (PDT) X-ASG-Debug-ID: 1472168177-0bf81509b01deb60001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Dr1wrtAfj64FseHB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:17 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNaDPA020332 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:14 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNaDvg017818 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:13 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNaDE1028355; Thu, 25 Aug 2016 23:36:13 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:12 -0700 Subject: [PATCH 39/71] xfs: move mappings from cow fork to data fork after copy-write From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 39/71] xfs: move mappings from cow fork to data fork after copy-write To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:11 -0700 Message-ID: <147216817148.867.2208217895711961150.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168177 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10513 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines After the write component of a copy-write operation finishes, clean up the bookkeeping left behind. On error, we simply free the new blocks and pass the error up. If we succeed, however, then we must remove the old data fork mapping and move the cow fork mapping to the data fork. v2: If CoW fails, we need to remove the CoW fork mapping and free the blocks. Furthermore, if xfs_cancel_ioend happens, we also need to clean out all the CoW record keeping. v3: When we're removing CoW extents, only free one extent per transaction to avoid running out of reservation. Also, xfs_cancel_ioend mustn't clean out the CoW fork because it is called when async writeback can't get an inode lock and will try again. v4: Use bmapi_read to iterate the CoW fork instead of calling the iext functions directly, and make the CoW remapping atomic by using the deferred ops mechanism which takes care of logging redo items for us. v5: Unlock the inode if cancelling the CoW reservation fails. Signed-off-by: Darrick J. Wong [hch: Call the CoW failure function during xfs_cancel_ioend] Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_aops.c | 22 ++++ fs/xfs/xfs_reflink.c | 246 ++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 8 ++ 3 files changed, 274 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index f0f83d4..b0e87ae 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -271,6 +271,23 @@ xfs_end_io( error = -EIO; /* + * For a CoW extent, we need to move the mapping from the CoW fork + * to the data fork. If instead an error happened, just dump the + * new blocks. + */ + if (ioend->io_type == XFS_IO_COW) { + if (ioend->io_bio->bi_error) { + error = xfs_reflink_cancel_cow_range(ip, + ioend->io_offset, ioend->io_size); + goto done; + } + error = xfs_reflink_end_cow(ip, ioend->io_offset, + ioend->io_size); + if (error) + goto done; + } + + /* * For unwritten extents we need to issue transactions to convert a * range to normal written extens after the data I/O has finished. * Detecting and handling completion IO errors is done individually @@ -285,7 +302,8 @@ xfs_end_io( } else if (ioend->io_append_trans) { error = xfs_setfilesize_ioend(ioend, error); } else { - ASSERT(!xfs_ioend_is_append(ioend)); + ASSERT(!xfs_ioend_is_append(ioend) || + ioend->io_type == XFS_IO_COW); } done: @@ -299,7 +317,7 @@ xfs_end_bio( struct xfs_ioend *ioend = bio->bi_private; struct xfs_mount *mp = XFS_I(ioend->io_inode)->i_mount; - if (ioend->io_type == XFS_IO_UNWRITTEN) + if (ioend->io_type == XFS_IO_UNWRITTEN || ioend->io_type == XFS_IO_COW) queue_work(mp->m_unwritten_workqueue, &ioend->io_work); else if (ioend->io_append_trans) queue_work(mp->m_data_workqueue, &ioend->io_work); diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 48c8a6e..82d66a4 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -52,6 +52,7 @@ #include "xfs_bmap_btree.h" #include "xfs_reflink.h" #include "xfs_iomap.h" +#include "xfs_rmap_btree.h" /* * Copy on Write of Shared Blocks @@ -402,3 +403,248 @@ xfs_reflink_trim_irec_to_next_cow( return 0; } + +/* + * Cancel all pending CoW reservations for some block range of an inode. + */ +int +xfs_reflink_cancel_cow_blocks( + struct xfs_inode *ip, + struct xfs_trans **tpp, + xfs_fileoff_t offset_fsb, + xfs_fileoff_t end_fsb) +{ + struct xfs_bmbt_irec irec; + struct xfs_ifork *ifp; + xfs_filblks_t count_fsb; + xfs_fsblock_t firstfsb; + struct xfs_defer_ops dfops; + int error = 0; + int nimaps; + + if (!xfs_is_reflink_inode(ip)) + return 0; + + /* Go find the old extent in the CoW fork. */ + count_fsb = (xfs_filblks_t)(end_fsb - offset_fsb); + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); + while (count_fsb) { + nimaps = 1; + error = xfs_bmapi_read(ip, offset_fsb, count_fsb, &irec, + &nimaps, XFS_BMAPI_COWFORK); + if (error) + break; + ASSERT(nimaps == 1); + + trace_xfs_reflink_cancel_cow(ip, &irec); + + if (irec.br_startblock == DELAYSTARTBLOCK) { + /* Free a delayed allocation. */ + xfs_mod_fdblocks(ip->i_mount, irec.br_blockcount, + false); + ip->i_delayed_blks -= irec.br_blockcount; + + /* Remove the mapping from the CoW fork. */ + error = xfs_bunmapi_cow(ip, &irec); + if (error) + break; + } else if (irec.br_startblock == HOLESTARTBLOCK) { + /* empty */ + } else { + xfs_trans_ijoin(*tpp, ip, 0); + xfs_defer_init(&dfops, &firstfsb); + + xfs_bmap_add_free(ip->i_mount, &dfops, + irec.br_startblock, irec.br_blockcount, + NULL); + + /* Update quota accounting */ + xfs_trans_mod_dquot_byino(*tpp, ip, XFS_TRANS_DQ_BCOUNT, + -(long)irec.br_blockcount); + + /* Roll the transaction */ + error = xfs_defer_finish(tpp, &dfops, ip); + if (error) { + xfs_defer_cancel(&dfops); + break; + } + + /* Remove the mapping from the CoW fork. */ + error = xfs_bunmapi_cow(ip, &irec); + if (error) + break; + } + + /* Roll on... */ + count_fsb -= irec.br_startoff + irec.br_blockcount - offset_fsb; + offset_fsb = irec.br_startoff + irec.br_blockcount; + } + + return error; +} + +/* + * Cancel all pending CoW reservations for some byte range of an inode. + */ +int +xfs_reflink_cancel_cow_range( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t count) +{ + struct xfs_trans *tp; + xfs_fileoff_t offset_fsb; + xfs_fileoff_t end_fsb; + int error; + + trace_xfs_reflink_cancel_cow_range(ip, offset, count); + + offset_fsb = XFS_B_TO_FSBT(ip->i_mount, offset); + if (count == NULLFILEOFF) + end_fsb = NULLFILEOFF; + else + end_fsb = XFS_B_TO_FSB(ip->i_mount, offset + count); + + /* Start a rolling transaction to remove the mappings */ + error = xfs_trans_alloc(ip->i_mount, &M_RES(ip->i_mount)->tr_write, + 0, 0, 0, &tp); + if (error) + goto out; + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + /* Scrape out the old CoW reservations */ + error = xfs_reflink_cancel_cow_blocks(ip, &tp, offset_fsb, end_fsb); + if (error) + goto out_defer; + + error = xfs_trans_commit(tp); + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + +out_defer: + xfs_trans_cancel(tp); + xfs_iunlock(ip, XFS_ILOCK_EXCL); +out: + trace_xfs_reflink_cancel_cow_range_error(ip, error, _RET_IP_); + return error; +} + +/* + * Remap parts of a file's data fork after a successful CoW. + */ +int +xfs_reflink_end_cow( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t count) +{ + struct xfs_bmbt_irec irec; + struct xfs_bmbt_irec uirec; + struct xfs_trans *tp; + struct xfs_ifork *ifp; + xfs_fileoff_t offset_fsb; + xfs_fileoff_t end_fsb; + xfs_filblks_t count_fsb; + xfs_fsblock_t firstfsb; + struct xfs_defer_ops dfops; + int done; + int error; + unsigned int resblks; + xfs_filblks_t ilen; + xfs_filblks_t rlen; + int nimaps; + + trace_xfs_reflink_end_cow(ip, offset, count); + + offset_fsb = XFS_B_TO_FSBT(ip->i_mount, offset); + end_fsb = XFS_B_TO_FSB(ip->i_mount, offset + count); + count_fsb = (xfs_filblks_t)(end_fsb - offset_fsb); + + /* Start a rolling transaction to switch the mappings */ + resblks = XFS_EXTENTADD_SPACE_RES(ip->i_mount, XFS_DATA_FORK); + error = xfs_trans_alloc(ip->i_mount, &M_RES(ip->i_mount)->tr_write, + resblks, 0, 0, &tp); + if (error) + goto out; + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + /* Go find the old extent in the CoW fork. */ + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); + while (count_fsb) { + /* Read extent from the source file */ + nimaps = 1; + error = xfs_bmapi_read(ip, offset_fsb, count_fsb, &irec, + &nimaps, XFS_BMAPI_COWFORK); + if (error) + goto out_cancel; + ASSERT(nimaps == 1); + + ASSERT(irec.br_startblock != DELAYSTARTBLOCK); + trace_xfs_reflink_cow_remap(ip, &irec); + + /* + * We can have a hole in the CoW fork if part of a directio + * write is CoW but part of it isn't. + */ + rlen = ilen = irec.br_blockcount; + if (irec.br_startblock == HOLESTARTBLOCK) + goto next_extent; + + /* Unmap the old blocks in the data fork. */ + done = false; + while (rlen) { + xfs_defer_init(&dfops, &firstfsb); + error = __xfs_bunmapi(tp, ip, irec.br_startoff, + &rlen, 0, 1, &firstfsb, &dfops); + if (error) + goto out_defer; + + /* Trim the extent to whatever got unmapped. */ + uirec = irec; + xfs_trim_extent(&uirec, irec.br_startoff + rlen, + irec.br_blockcount - rlen); + irec.br_blockcount = rlen; + trace_xfs_reflink_cow_remap_piece(ip, &uirec); + + /* Map the new blocks into the data fork. */ + error = xfs_bmap_map_extent(tp->t_mountp, &dfops, + ip, XFS_DATA_FORK, &uirec); + if (error) + goto out_defer; + + /* Remove the mapping from the CoW fork. */ + error = xfs_bunmapi_cow(ip, &uirec); + if (error) + goto out_defer; + + error = xfs_defer_finish(&tp, &dfops, ip); + if (error) + goto out_defer; + } + +next_extent: + /* Roll on... */ + count_fsb -= irec.br_startoff + ilen - offset_fsb; + offset_fsb = irec.br_startoff + ilen; + } + + error = xfs_trans_commit(tp); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + goto out; + return 0; + +out_defer: + xfs_defer_cancel(&dfops); +out_cancel: + xfs_trans_cancel(tp); + xfs_iunlock(ip, XFS_ILOCK_EXCL); +out: + trace_xfs_reflink_end_cow_error(ip, error, _RET_IP_); + return error; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 5dd0ff9..0ffabfb 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -31,4 +31,12 @@ extern int xfs_reflink_find_cow_mapping(struct xfs_inode *ip, xfs_off_t offset, extern int xfs_reflink_trim_irec_to_next_cow(struct xfs_inode *ip, xfs_fileoff_t offset_fsb, struct xfs_bmbt_irec *imap); +extern int xfs_reflink_cancel_cow_blocks(struct xfs_inode *ip, + struct xfs_trans **tpp, xfs_fileoff_t offset_fsb, + xfs_fileoff_t end_fsb); +extern int xfs_reflink_cancel_cow_range(struct xfs_inode *ip, xfs_off_t offset, + xfs_off_t count); +extern int xfs_reflink_end_cow(struct xfs_inode *ip, xfs_off_t offset, + xfs_off_t count); + #endif /* __XFS_REFLINK_H */ From darrick.wong@oracle.com Thu Aug 25 18:36:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9196A7DF0 for ; Thu, 25 Aug 2016 18:36:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 648A88F8033 for ; Thu, 25 Aug 2016 16:36:26 -0700 (PDT) X-ASG-Debug-ID: 1472168184-0bf57b5312209380001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EtWm0t9z9JBLTqgC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNaM1l013581 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:23 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNaMNd008171 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:22 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNaJwl014723; Thu, 25 Aug 2016 23:36:22 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:19 -0700 Subject: [PATCH 40/71] xfs: report shared extents through the iomap interface From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 40/71] xfs: report shared extents through the iomap interface To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:17 -0700 Message-ID: <147216817787.867.4276938642586853650.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168184 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5862 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Report shared extents through the iomap interface so that FIEMAP reports shared blocks accurately. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_iomap.c | 19 ++++++++++++--- fs/xfs/xfs_iomap.h | 2 +- fs/xfs/xfs_pnfs.c | 2 +- fs/xfs/xfs_reflink.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 3 ++ 5 files changed, 82 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 6065bde..130010a 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -987,10 +987,13 @@ void xfs_bmbt_to_iomap( struct xfs_inode *ip, struct iomap *iomap, - struct xfs_bmbt_irec *imap) + struct xfs_bmbt_irec *imap, + bool is_shared) { struct xfs_mount *mp = ip->i_mount; + if (is_shared) + iomap->flags |= IOMAP_F_SHARED; if (imap->br_startblock == HOLESTARTBLOCK) { iomap->blkno = IOMAP_NULL_BLOCK; iomap->type = IOMAP_HOLE; @@ -1028,6 +1031,7 @@ xfs_file_iomap_begin( struct xfs_mount *mp = ip->i_mount; struct xfs_bmbt_irec imap; xfs_fileoff_t offset_fsb, end_fsb; + bool shared, trimmed; int nimaps = 1, error = 0; if (XFS_FORCED_SHUTDOWN(mp)) @@ -1053,7 +1057,14 @@ xfs_file_iomap_begin( } error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, &imap, - &nimaps, XFS_BMAPI_ENTIRE); + &nimaps, 0); + if (error) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + } + + /* Trim the mapping to the nearest shared extent boundary. */ + error = xfs_reflink_trim_around_shared(ip, &imap, &shared, &trimmed); if (error) { xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; @@ -1095,7 +1106,7 @@ xfs_file_iomap_begin( trace_xfs_iomap_found(ip, offset, length, 0, &imap); } - xfs_bmbt_to_iomap(ip, iomap, &imap); + xfs_bmbt_to_iomap(ip, iomap, &imap, shared); return 0; } @@ -1193,7 +1204,7 @@ out_unlock: if (!error) { ASSERT(nimaps); - xfs_bmbt_to_iomap(ip, iomap, &imap); + xfs_bmbt_to_iomap(ip, iomap, &imap, false); } return error; diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index 52f9c99..c04bf99 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -34,7 +34,7 @@ int xfs_iomap_cow_delay(struct xfs_inode *, xfs_off_t, size_t, struct xfs_bmbt_irec *); void xfs_bmbt_to_iomap(struct xfs_inode *, struct iomap *, - struct xfs_bmbt_irec *); + struct xfs_bmbt_irec *, bool); extern struct iomap_ops xfs_iomap_ops; extern struct iomap_ops xfs_xattr_iomap_ops; diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index 93a7aaf..5519e4b 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -188,7 +188,7 @@ xfs_fs_map_blocks( } xfs_iunlock(ip, XFS_IOLOCK_EXCL); - xfs_bmbt_to_iomap(ip, iomap, &imap); + xfs_bmbt_to_iomap(ip, iomap, &imap, false); *device_generation = mp->m_generation; return error; out_unlock: diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 82d66a4..885ec61 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -179,6 +179,68 @@ xfs_reflink_find_shared( return error; } +/* + * Trim the mapping to the next block where there's a change in the + * shared/unshared status. More specifically, this means that we + * find the lowest-numbered extent of shared blocks that coincides with + * the given block mapping. If the shared extent overlaps the start of + * the mapping, trim the mapping to the end of the shared extent. If + * the shared region intersects the mapping, trim the mapping to the + * start of the shared extent. If there are no shared regions that + * overlap, just return the original extent. + */ +int +xfs_reflink_trim_around_shared( + struct xfs_inode *ip, + struct xfs_bmbt_irec *irec, + bool *shared, + bool *trimmed) +{ + xfs_agnumber_t agno; + xfs_agblock_t agbno; + xfs_extlen_t aglen; + xfs_agblock_t fbno; + xfs_extlen_t flen; + int error = 0; + + /* Holes, unwritten, and delalloc extents cannot be shared */ + if (!xfs_is_reflink_inode(ip) || + ISUNWRITTEN(irec) || + irec->br_startblock == HOLESTARTBLOCK || + irec->br_startblock == DELAYSTARTBLOCK) { + *shared = false; + return 0; + } + + trace_xfs_reflink_trim_around_shared(ip, irec); + + agno = XFS_FSB_TO_AGNO(ip->i_mount, irec->br_startblock); + agbno = XFS_FSB_TO_AGBNO(ip->i_mount, irec->br_startblock); + aglen = irec->br_blockcount; + + error = xfs_reflink_find_shared(ip->i_mount, agno, agbno, + aglen, &fbno, &flen, true); + if (error) + return error; + + *shared = *trimmed = false; + if (flen == 0) { + /* No shared blocks at all. */ + return 0; + } else if (fbno == agbno) { + /* The start of this extent is shared. */ + irec->br_blockcount = flen; + *shared = true; + *trimmed = true; + return 0; + } else { + /* There's a shared extent midway through this extent. */ + irec->br_blockcount = fbno - agbno; + *trimmed = true; + return 0; + } +} + /* Find the shared ranges under an irec, and set up delalloc extents. */ static int xfs_reflink_reserve_cow_extent( diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 0ffabfb..e0bad68 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -23,6 +23,9 @@ extern int xfs_reflink_find_shared(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t aglen, xfs_agblock_t *fbno, xfs_extlen_t *flen, bool find_maximal); +extern int xfs_reflink_trim_around_shared(struct xfs_inode *ip, + struct xfs_bmbt_irec *irec, bool *shared, bool *trimmed); + extern int xfs_reflink_reserve_cow_range(struct xfs_inode *ip, xfs_fileoff_t offset_fsb, xfs_fileoff_t end_fsb); extern bool xfs_reflink_is_cow_pending(struct xfs_inode *ip, xfs_off_t offset); From darrick.wong@oracle.com Thu Aug 25 18:36:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 36CD97DF9 for ; Thu, 25 Aug 2016 18:36:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE997304043 for ; Thu, 25 Aug 2016 16:36:30 -0700 (PDT) X-ASG-Debug-ID: 1472168188-0bf57c55b41c7910001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id kITTpCbgvCcVnKIE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:28 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNaRdI020451 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:36:27 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNaQMN018312 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:36:27 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNaPoH017511; Thu, 25 Aug 2016 23:36:26 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:25 -0700 Subject: [PATCH 41/71] xfs: implement CoW for directio writes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 41/71] xfs: implement CoW for directio writes To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:24 -0700 Message-ID: <147216818410.867.12011711439450360058.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168188 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10566 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines For O_DIRECT writes to shared blocks, we have to CoW them just like we would with buffered writes. For writes that are not block-aligned, just bounce them to the page cache. For block-aligned writes, however, we can do better than that. Use the same mechanisms that we employ for buffered CoW to set up a delalloc reservation, allocate all the blocks at once, issue the writes against the new blocks and use the same ioend functions to remap the blocks after the write. This should be fairly performant. v2: Turns out that there's no way for xfs_end_io_direct_write to know if the write completed successfully. Therefore, do /not/ use the ioend for dio cow post-processing; instead, move it to xfs_vm_do_dio where we *can* tell if the write succeeded or not. v3: Update the file size if we do a directio CoW across EOF. This can happen if the last block is shared, the cowextsize hint is set, and we do a dio write past the end of the file. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_aops.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++---- fs/xfs/xfs_file.c | 33 +++++++++++++++++- fs/xfs/xfs_reflink.c | 60 +++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 2 + 4 files changed, 178 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index b0e87ae..e8d573e 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -40,6 +40,7 @@ /* flags for direct write completions */ #define XFS_DIO_FLAG_UNWRITTEN (1 << 0) #define XFS_DIO_FLAG_APPEND (1 << 1) +#define XFS_DIO_FLAG_COW (1 << 2) /* * structure owned by writepages passed to individual writepage calls @@ -1154,18 +1155,24 @@ xfs_map_direct( struct inode *inode, struct buffer_head *bh_result, struct xfs_bmbt_irec *imap, - xfs_off_t offset) + xfs_off_t offset, + bool is_cow) { uintptr_t *flags = (uintptr_t *)&bh_result->b_private; xfs_off_t size = bh_result->b_size; trace_xfs_get_blocks_map_direct(XFS_I(inode), offset, size, - ISUNWRITTEN(imap) ? XFS_IO_UNWRITTEN : XFS_IO_OVERWRITE, imap); + ISUNWRITTEN(imap) ? XFS_IO_UNWRITTEN : is_cow ? XFS_IO_COW : + XFS_IO_OVERWRITE, imap); if (ISUNWRITTEN(imap)) { *flags |= XFS_DIO_FLAG_UNWRITTEN; set_buffer_defer_completion(bh_result); - } else if (offset + size > i_size_read(inode) || offset + size < 0) { + } else if (is_cow) { + *flags |= XFS_DIO_FLAG_COW; + set_buffer_defer_completion(bh_result); + } + if (offset + size > i_size_read(inode) || offset + size < 0) { *flags |= XFS_DIO_FLAG_APPEND; set_buffer_defer_completion(bh_result); } @@ -1211,6 +1218,44 @@ xfs_map_trim_size( bh_result->b_size = mapping_size; } +/* Bounce unaligned directio writes to the page cache. */ +static int +xfs_bounce_unaligned_dio_write( + struct xfs_inode *ip, + xfs_fileoff_t offset_fsb, + struct xfs_bmbt_irec *imap) +{ + struct xfs_bmbt_irec irec; + xfs_fileoff_t delta; + bool shared; + bool x; + int error; + + irec = *imap; + if (offset_fsb > irec.br_startoff) { + delta = offset_fsb - irec.br_startoff; + irec.br_blockcount -= delta; + irec.br_startblock += delta; + irec.br_startoff = offset_fsb; + } + error = xfs_reflink_trim_around_shared(ip, &irec, &x, &shared); + if (error) + return error; + /* + * Are we doing a DIO write to a shared block? In + * the ideal world we at least would fork full blocks, + * but for now just fall back to buffered mode. Yuck. + * Use -EREMCHG ("remote address changed") to signal + * this, since in general XFS doesn't do this sort of + * fallback. + */ + if (shared) { + trace_xfs_reflink_bounce_dio_write(ip, imap); + return -EREMCHG; + } + return 0; +} + STATIC int __xfs_get_blocks( struct inode *inode, @@ -1230,6 +1275,8 @@ __xfs_get_blocks( xfs_off_t offset; ssize_t size; int new = 0; + bool is_cow = false; + bool need_alloc = false; BUG_ON(create && !direct); @@ -1255,8 +1302,27 @@ __xfs_get_blocks( end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + size); offset_fsb = XFS_B_TO_FSBT(mp, offset); - error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, - &imap, &nimaps, XFS_BMAPI_ENTIRE); + if (create && direct) + is_cow = xfs_reflink_is_cow_pending(ip, offset); + if (is_cow) + error = xfs_reflink_find_cow_mapping(ip, offset, &imap, + &need_alloc); + else { + error = xfs_bmapi_read(ip, offset_fsb, end_fsb - offset_fsb, + &imap, &nimaps, XFS_BMAPI_ENTIRE); + /* + * Truncate an overwrite extent if there's a pending CoW + * reservation before the end of this extent. This forces us + * to come back to writepage to take care of the CoW. + */ + if (create && direct && nimaps && + imap.br_startblock != HOLESTARTBLOCK && + imap.br_startblock != DELAYSTARTBLOCK && + !ISUNWRITTEN(&imap)) + xfs_reflink_trim_irec_to_next_cow(ip, offset_fsb, + &imap); + } + ASSERT(!need_alloc); if (error) goto out_unlock; @@ -1308,6 +1374,13 @@ __xfs_get_blocks( if (imap.br_startblock != HOLESTARTBLOCK && imap.br_startblock != DELAYSTARTBLOCK && (create || !ISUNWRITTEN(&imap))) { + if (create && direct && !is_cow) { + error = xfs_bounce_unaligned_dio_write(ip, offset_fsb, + &imap); + if (error) + return error; + } + xfs_map_buffer(inode, bh_result, &imap, offset); if (ISUNWRITTEN(&imap)) set_buffer_unwritten(bh_result); @@ -1316,7 +1389,8 @@ __xfs_get_blocks( if (dax_fault) ASSERT(!ISUNWRITTEN(&imap)); else - xfs_map_direct(inode, bh_result, &imap, offset); + xfs_map_direct(inode, bh_result, &imap, offset, + is_cow); } } @@ -1443,7 +1517,11 @@ xfs_end_io_direct_write( trace_xfs_end_io_direct_write_unwritten(ip, offset, size); error = xfs_iomap_write_unwritten(ip, offset, size); - } else if (flags & XFS_DIO_FLAG_APPEND) { + } + if (flags & XFS_DIO_FLAG_COW) { + error = xfs_reflink_end_cow(ip, offset, size); + } + if (flags & XFS_DIO_FLAG_APPEND) { struct xfs_trans *tp; trace_xfs_end_io_direct_write_append(ip, offset, size); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index e612a02..22311fa 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -38,6 +38,7 @@ #include "xfs_icache.h" #include "xfs_pnfs.h" #include "xfs_iomap.h" +#include "xfs_reflink.h" #include #include @@ -679,6 +680,26 @@ xfs_file_dio_aio_write( trace_xfs_file_direct_write(ip, count, iocb->ki_pos); + /* If this is a block-aligned directio CoW, remap immediately. */ + if (xfs_is_reflink_inode(ip) && !unaligned_io) { + /* + * XXX(hch): this seems all a little messy, I'd much prefer to + * do this in the get_blocks handler or equivalent. It's + * probably time to rewrite DIO using the iomap infrastructure.. + */ + xfs_ilock(ip, XFS_ILOCK_EXCL); + ret = xfs_reflink_reserve_cow_range(ip, + XFS_B_TO_FSBT(mp, iocb->ki_pos), + XFS_B_TO_FSB(mp, iocb->ki_pos + count)); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + if (ret) + goto out; + + ret = xfs_reflink_allocate_cow_range(ip, iocb->ki_pos, count); + if (ret) + goto out; + } + data = *from; ret = __blockdev_direct_IO(iocb, inode, target->bt_bdev, &data, xfs_get_blocks_direct, xfs_end_io_direct_write, @@ -857,10 +878,18 @@ xfs_file_write_iter( if (IS_DAX(inode)) ret = xfs_file_dax_write(iocb, from); - else if (iocb->ki_flags & IOCB_DIRECT) + else if (iocb->ki_flags & IOCB_DIRECT) { + /* + * Allow DIO to fall back to buffered *only* in the case + * that we're doing a reflink CoW. + */ ret = xfs_file_dio_aio_write(iocb, from); - else + if (ret == -EREMCHG) + goto buffered; + } else { +buffered: ret = xfs_file_buffered_aio_write(iocb, from); + } if (ret > 0) { XFS_STATS_ADD(ip->i_mount, xs_write_bytes, ret); diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 885ec61..b6fbbe6 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -361,6 +361,66 @@ xfs_reflink_reserve_cow_range( } /* + * Allocate blocks to all CoW reservations within a byte range of a file. + */ +int +xfs_reflink_allocate_cow_range( + struct xfs_inode *ip, + xfs_off_t pos, + xfs_off_t len) +{ + struct xfs_ifork *ifp; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec imap; + int error = 0; + xfs_fileoff_t start_lblk; + xfs_fileoff_t end_lblk; + xfs_extnum_t idx; + + if (!xfs_is_reflink_inode(ip)) + return 0; + + trace_xfs_reflink_allocate_cow_range(ip, len, pos); + + start_lblk = XFS_B_TO_FSBT(ip->i_mount, pos); + end_lblk = XFS_B_TO_FSB(ip->i_mount, pos + len); + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); + xfs_ilock(ip, XFS_ILOCK_EXCL); + + gotp = xfs_iext_bno_to_ext(ifp, start_lblk, &idx); + while (gotp) { + xfs_bmbt_get_all(gotp, &imap); + + if (imap.br_startoff >= end_lblk) + break; + if (!isnullstartblock(imap.br_startblock)) + goto advloop; + xfs_trim_extent(&imap, start_lblk, end_lblk - start_lblk); + trace_xfs_reflink_allocate_cow_extent(ip, &imap); + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + error = xfs_iomap_write_allocate(ip, XFS_COW_FORK, + XFS_FSB_TO_B(ip->i_mount, imap.br_startoff + + imap.br_blockcount - 1), &imap); + xfs_ilock(ip, XFS_ILOCK_EXCL); + if (error) + break; +advloop: + /* Roll on... */ + idx++; + if (idx >= ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) + break; + gotp = xfs_iext_get_ext(ifp, idx); + } + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + if (error) + trace_xfs_reflink_allocate_cow_range_error(ip, error, _RET_IP_); + return error; +} + +/* * Determine if there's a CoW reservation at a byte offset of an inode. */ bool diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index e0bad68..4aaefd4 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -28,6 +28,8 @@ extern int xfs_reflink_trim_around_shared(struct xfs_inode *ip, extern int xfs_reflink_reserve_cow_range(struct xfs_inode *ip, xfs_fileoff_t offset_fsb, xfs_fileoff_t end_fsb); +extern int xfs_reflink_allocate_cow_range(struct xfs_inode *ip, xfs_off_t pos, + xfs_off_t len); extern bool xfs_reflink_is_cow_pending(struct xfs_inode *ip, xfs_off_t offset); extern int xfs_reflink_find_cow_mapping(struct xfs_inode *ip, xfs_off_t offset, struct xfs_bmbt_irec *imap, bool *need_alloc); From darrick.wong@oracle.com Thu Aug 25 18:36:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 63C3C7DDA for ; Thu, 25 Aug 2016 18:36:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2847A8F8033 for ; Thu, 25 Aug 2016 16:36:36 -0700 (PDT) X-ASG-Debug-ID: 1472168194-0bf57b53112093b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id HHlZ1ztlKT4b4pKa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNaWQV020507 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:33 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNaWbr018352 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:32 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNaW2S028486; Thu, 25 Aug 2016 23:36:32 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:31 -0700 Subject: [PATCH 42/71] xfs: cancel CoW reservations and clear inode reflink flag when freeing blocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 42/71] xfs: cancel CoW reservations and clear inode reflink flag when freeing blocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:30 -0700 Message-ID: <147216819041.867.11860151583478539823.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168194 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1166 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're freeing blocks (truncate, punch, etc.), clear all CoW reservations in the range being freed. If the file block count drops to zero, also clear the inode reflink flag. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_inode.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 0c25a76..8c971fd 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -49,6 +49,7 @@ #include "xfs_trans_priv.h" #include "xfs_log.h" #include "xfs_bmap_btree.h" +#include "xfs_reflink.h" kmem_zone_t *xfs_inode_zone; @@ -1586,6 +1587,18 @@ xfs_itruncate_extents( goto out; } + /* Remove all pending CoW reservations. */ + error = xfs_reflink_cancel_cow_blocks(ip, &tp, first_unmap_block, + last_block); + if (error) + goto out; + + /* + * Clear the reflink flag if we truncated everything. + */ + if (ip->i_d.di_nblocks == 0 && xfs_is_reflink_inode(ip)) + ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; + /* * Always re-log the inode so that our permanent transaction can keep * on rolling it forward in the log. From darrick.wong@oracle.com Thu Aug 25 18:36:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F14CB7DDA for ; Thu, 25 Aug 2016 18:36:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8FF3304043 for ; Thu, 25 Aug 2016 16:36:44 -0700 (PDT) X-ASG-Debug-ID: 1472168202-0bf8155c751e6c80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id QpMIBaCT5mhCYP39 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNadUF020595 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:41 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNadrB018498 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:39 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNacmu029781; Thu, 25 Aug 2016 23:36:38 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:37 -0700 Subject: [PATCH 43/71] xfs: cancel pending CoW reservations when destroying inodes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 43/71] xfs: cancel pending CoW reservations when destroying inodes To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:36 -0700 Message-ID: <147216819658.867.12009703316700069391.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168202 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1308 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When destroying the inode, cancel all pending reservations in the CoW fork so that all the reserved blocks go back to the free pile. In theory this sort of cleanup is only needed to clean up after write errors. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_super.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f62d50c..86afb15 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -49,6 +49,7 @@ #include "xfs_rmap_item.h" #include "xfs_refcount_item.h" #include "xfs_bmap_item.h" +#include "xfs_reflink.h" #include #include @@ -938,6 +939,7 @@ xfs_fs_destroy_inode( struct inode *inode) { struct xfs_inode *ip = XFS_I(inode); + int error; trace_xfs_destroy_inode(ip); @@ -945,6 +947,12 @@ xfs_fs_destroy_inode( XFS_STATS_INC(ip->i_mount, vn_rele); XFS_STATS_INC(ip->i_mount, vn_remove); + error = xfs_reflink_cancel_cow_range(ip, 0, NULLFILEOFF); + if (error && !XFS_FORCED_SHUTDOWN(ip->i_mount)) + xfs_warn(ip->i_mount, "Error %d while evicting CoW blocks " + "for inode %llu.", + error, ip->i_ino); + xfs_inactive(ip); ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); From darrick.wong@oracle.com Thu Aug 25 18:36:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9ADA37DDA for ; Thu, 25 Aug 2016 18:36:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5E9D030404E for ; Thu, 25 Aug 2016 16:36:54 -0700 (PDT) X-ASG-Debug-ID: 1472168210-0bf57c55b11c7930001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id DUAA9WEPlt9fmk5q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:51 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNanou020660 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:36:49 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNam6e018765 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:49 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNalVA029835; Thu, 25 Aug 2016 23:36:48 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:47 -0700 Subject: [PATCH 44/71] xfs: store in-progress CoW allocations in the refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 44/71] xfs: store in-progress CoW allocations in the refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:42 -0700 Message-ID: <147216820276.867.15990055578063985003.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168211 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 24495 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Due to the way the CoW algorithm in XFS works, there's an interval during which blocks allocated to handle a CoW can be lost -- if the FS goes down after the blocks are allocated but before the block remapping takes place. This is exacerbated by the cowextsz hint -- allocated reservations can sit around for a while, waiting to get used. Since the refcount btree doesn't normally store records with refcount of 1, we can use it to record these in-progress extents. In-progress blocks cannot be shared because they're not user-visible, so there shouldn't be any conflicts with other programs. This is a better solution than holding EFIs during writeback because (a) EFIs can't be relogged currently, (b) even if they could, EFIs are bound by available log space, which puts an unnecessary upper bound on how much CoW we can have in flight, and (c) we already have a mechanism to track blocks. At mount time, read the refcount records and free anything we find with a refcount of 1 because those were in-progress when the FS went down. v2: Use the deferred operations system to avoid deadlocks and blowing out the transaction reservation. This allows us to unmap a CoW extent from the refcountbt and into a file atomically. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 11 + fs/xfs/libxfs/xfs_format.h | 3 fs/xfs/libxfs/xfs_refcount.c | 317 +++++++++++++++++++++++++++++++++++++++++- fs/xfs/libxfs/xfs_refcount.h | 7 + fs/xfs/xfs_mount.c | 9 + fs/xfs/xfs_refcount_item.c | 12 ++ fs/xfs/xfs_reflink.c | 144 +++++++++++++++++++ fs/xfs/xfs_reflink.h | 1 fs/xfs/xfs_super.c | 8 + fs/xfs/xfs_trace.h | 4 + 10 files changed, 510 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 37cd35d..7c5d0b1 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -4706,6 +4706,17 @@ xfs_bmapi_write( goto error0; if (bma.blkno == NULLFSBLOCK) break; + + /* + * If this is a CoW allocation, record the data in + * the refcount btree for orphan recovery. + */ + if (whichfork == XFS_COW_FORK) { + error = xfs_refcount_alloc_cow_extent(mp, dfops, + bma.blkno, bma.length); + if (error) + goto error0; + } } /* Deal with the allocated space we found. */ diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index ab46c02..022ae27 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1374,7 +1374,8 @@ struct xfs_owner_info { #define XFS_RMAP_OWN_INOBT (-6ULL) /* Inode btree blocks */ #define XFS_RMAP_OWN_INODES (-7ULL) /* Inode chunk */ #define XFS_RMAP_OWN_REFC (-8ULL) /* refcount tree */ -#define XFS_RMAP_OWN_MIN (-9ULL) /* guard */ +#define XFS_RMAP_OWN_COW (-9ULL) /* cow allocations */ +#define XFS_RMAP_OWN_MIN (-10ULL) /* guard */ #define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63))) diff --git a/fs/xfs/libxfs/xfs_refcount.c b/fs/xfs/libxfs/xfs_refcount.c index 58b7770..9136745 100644 --- a/fs/xfs/libxfs/xfs_refcount.c +++ b/fs/xfs/libxfs/xfs_refcount.c @@ -36,13 +36,23 @@ #include "xfs_trans.h" #include "xfs_bit.h" #include "xfs_refcount.h" +#include "xfs_rmap.h" /* Allowable refcount adjustment amounts. */ enum xfs_refc_adjust_op { XFS_REFCOUNT_ADJUST_INCREASE = 1, XFS_REFCOUNT_ADJUST_DECREASE = -1, + XFS_REFCOUNT_ADJUST_COW_ALLOC = 0, + XFS_REFCOUNT_ADJUST_COW_FREE = -1, }; +STATIC int __xfs_refcount_cow_alloc(struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, xfs_extlen_t aglen, + struct xfs_defer_ops *dfops); +STATIC int __xfs_refcount_cow_free(struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, xfs_extlen_t aglen, + struct xfs_defer_ops *dfops); + /* * Look up the first record less than or equal to [bno, len] in the btree * given by cur. @@ -468,6 +478,8 @@ out_error: return error; } +#define XFS_FIND_RCEXT_SHARED 1 +#define XFS_FIND_RCEXT_COW 2 /* * Find the left extent and the one after it (cleft). This function assumes * that we've already split any extent crossing agbno. @@ -478,7 +490,8 @@ xfs_refcount_find_left_extents( struct xfs_refcount_irec *left, struct xfs_refcount_irec *cleft, xfs_agblock_t agbno, - xfs_extlen_t aglen) + xfs_extlen_t aglen, + int flags) { struct xfs_refcount_irec tmp; int error; @@ -498,6 +511,10 @@ xfs_refcount_find_left_extents( if (RCNEXT(tmp) != agbno) return 0; + if ((flags & XFS_FIND_RCEXT_SHARED) && tmp.rc_refcount < 2) + return 0; + if ((flags & XFS_FIND_RCEXT_COW) && tmp.rc_refcount > 1) + return 0; /* We have a left extent; retrieve (or invent) the next right one */ *left = tmp; @@ -554,7 +571,8 @@ xfs_refcount_find_right_extents( struct xfs_refcount_irec *right, struct xfs_refcount_irec *cright, xfs_agblock_t agbno, - xfs_extlen_t aglen) + xfs_extlen_t aglen, + int flags) { struct xfs_refcount_irec tmp; int error; @@ -574,6 +592,10 @@ xfs_refcount_find_right_extents( if (tmp.rc_startblock != agbno + aglen) return 0; + if ((flags & XFS_FIND_RCEXT_SHARED) && tmp.rc_refcount < 2) + return 0; + if ((flags & XFS_FIND_RCEXT_COW) && tmp.rc_refcount > 1) + return 0; /* We have a right extent; retrieve (or invent) the next left one */ *right = tmp; @@ -630,6 +652,7 @@ xfs_refcount_merge_extents( xfs_agblock_t *agbno, xfs_extlen_t *aglen, enum xfs_refc_adjust_op adjust, + int flags, bool *shape_changed) { struct xfs_refcount_irec left = {0}, cleft = {0}; @@ -645,11 +668,11 @@ xfs_refcount_merge_extents( * [right]. */ error = xfs_refcount_find_left_extents(cur, &left, &cleft, *agbno, - *aglen); + *aglen, flags); if (error) return error; error = xfs_refcount_find_right_extents(cur, &right, &cright, *agbno, - *aglen); + *aglen, flags); if (error) return error; @@ -936,7 +959,7 @@ xfs_refcount_adjust( */ orig_aglen = aglen; error = xfs_refcount_merge_extents(cur, &agbno, &aglen, adj, - &shape_changed); + XFS_FIND_RCEXT_SHARED, &shape_changed); if (error) goto out_error; if (shape_changed) @@ -1054,6 +1077,18 @@ xfs_refcount_finish_one( error = xfs_refcount_adjust(rcur, bno, blockcount, adjusted, XFS_REFCOUNT_ADJUST_DECREASE, dfops, NULL); break; + case XFS_REFCOUNT_ALLOC_COW: + *adjusted = 0; + error = __xfs_refcount_cow_alloc(rcur, bno, blockcount, dfops); + if (!error) + *adjusted = blockcount; + break; + case XFS_REFCOUNT_FREE_COW: + *adjusted = 0; + error = __xfs_refcount_cow_free(rcur, bno, blockcount, dfops); + if (!error) + *adjusted = blockcount; + break; default: ASSERT(0); error = -EFSCORRUPTED; @@ -1228,3 +1263,275 @@ out_error: cur->bc_private.a.agno, error, _RET_IP_); return error; } + +/* + * Recovering CoW Blocks After a Crash + * + * Due to the way that the copy on write mechanism works, there's a window of + * opportunity in which we can lose track of allocated blocks during a crash. + * Because CoW uses delayed allocation in the in-core CoW fork, writeback + * causes blocks to be allocated and stored in the CoW fork. The blocks are + * no longer in the free space btree but are not otherwise recorded anywhere + * until the write completes and the blocks are mapped into the file. A crash + * in between allocation and remapping results in the replacement blocks being + * lost. This situation is exacerbated by the CoW extent size hint because + * allocations can hang around for long time. + * + * However, there is a place where we can record these allocations before they + * become mappings -- the reference count btree. The btree does not record + * extents with refcount == 1, so we can record allocations with a refcount of + * 1. Blocks being used for CoW writeout cannot be shared, so there should be + * no conflict with shared block records. These mappings should be created + * when we allocate blocks to the CoW fork and deleted when they're removed + * from the CoW fork. + * + * Minor nit: records for in-progress CoW allocations and records for shared + * extents must never be merged, to preserve the property that (except for CoW + * allocations) there are no refcount btree entries with refcount == 1. The + * only time this could potentially happen is when unsharing a block that's + * adjacent to CoW allocations, so we must be careful to avoid this. + * + * At mount time we recover lost CoW allocations by searching the refcount + * btree for these refcount == 1 mappings. These represent CoW allocations + * that were in progress at the time the filesystem went down, so we can free + * them to get the space back. + * + * This mechanism is superior to creating EFIs for unmapped CoW extents for + * several reasons -- first, EFIs pin the tail of the log and would have to be + * periodically relogged to avoid filling up the log. Second, CoW completions + * will have to file an EFD and create new EFIs for whatever remains in the + * CoW fork; this partially takes care of (1) but extent-size reservations + * will have to periodically relog even if there's no writeout in progress. + * This can happen if the CoW extent size hint is set, which you really want. + * Third, EFIs cannot currently be automatically relogged into newer + * transactions to advance the log tail. Fourth, stuffing the log full of + * EFIs places an upper bound on the number of CoW allocations that can be + * held filesystem-wide at any given time. Recording them in the refcount + * btree doesn't require us to maintain any state in memory and doesn't pin + * the log. + */ +/* + * Adjust the refcounts of CoW allocations. These allocations are "magic" + * in that they're not referenced anywhere else in the filesystem, so we + * stash them in the refcount btree with a refcount of 1 until either file + * remapping (or CoW cancellation) happens. + */ +STATIC int +xfs_refcount_adjust_cow_extents( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + enum xfs_refc_adjust_op adj, + struct xfs_defer_ops *dfops, + struct xfs_owner_info *oinfo) +{ + struct xfs_refcount_irec ext, tmp; + int error; + int found_rec, found_tmp; + + if (aglen == 0) + return 0; + + /* Find any overlapping refcount records */ + error = xfs_refcount_lookup_ge(cur, agbno, &found_rec); + if (error) + goto out_error; + error = xfs_refcount_get_rec(cur, &ext, &found_rec); + if (error) + goto out_error; + if (!found_rec) { + ext.rc_startblock = cur->bc_mp->m_sb.sb_agblocks; + ext.rc_blockcount = 0; + ext.rc_refcount = 0; + } + + switch (adj) { + case XFS_REFCOUNT_ADJUST_COW_ALLOC: + /* Adding a CoW reservation, there should be nothing here. */ + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + ext.rc_startblock >= agbno + aglen, out_error); + + tmp.rc_startblock = agbno; + tmp.rc_blockcount = aglen; + tmp.rc_refcount = 1; + trace_xfs_refcount_modify_extent(cur->bc_mp, + cur->bc_private.a.agno, &tmp); + + error = xfs_refcount_insert(cur, &tmp, + &found_tmp); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + found_tmp == 1, out_error); + break; + case XFS_REFCOUNT_ADJUST_COW_FREE: + /* Removing a CoW reservation, there should be one extent. */ + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + ext.rc_startblock == agbno, out_error); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + ext.rc_blockcount == aglen, out_error); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + ext.rc_refcount == 1, out_error); + + ext.rc_refcount = 0; + trace_xfs_refcount_modify_extent(cur->bc_mp, + cur->bc_private.a.agno, &ext); + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + found_rec == 1, out_error); + break; + default: + ASSERT(0); + } + + return error; +out_error: + trace_xfs_refcount_modify_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Add or remove refcount btree entries for CoW reservations. + */ +STATIC int +xfs_refcount_adjust_cow( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + enum xfs_refc_adjust_op adj, + struct xfs_defer_ops *dfops) +{ + bool shape_changed; + int error; + + /* + * Ensure that no rcextents cross the boundary of the adjustment range. + */ + error = xfs_refcount_split_extent(cur, agbno, &shape_changed); + if (error) + goto out_error; + + error = xfs_refcount_split_extent(cur, agbno + aglen, &shape_changed); + if (error) + goto out_error; + + /* + * Try to merge with the left or right extents of the range. + */ + error = xfs_refcount_merge_extents(cur, &agbno, &aglen, adj, + XFS_FIND_RCEXT_COW, &shape_changed); + if (error) + goto out_error; + + /* Now that we've taken care of the ends, adjust the middle extents */ + error = xfs_refcount_adjust_cow_extents(cur, agbno, aglen, adj, + dfops, NULL); + if (error) + goto out_error; + + return 0; + +out_error: + trace_xfs_refcount_adjust_cow_error(cur->bc_mp, cur->bc_private.a.agno, + error, _RET_IP_); + return error; +} + +/* + * Record a CoW allocation in the refcount btree. + */ +STATIC int +__xfs_refcount_cow_alloc( + struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + struct xfs_defer_ops *dfops) +{ + int error; + + trace_xfs_refcount_cow_increase(rcur->bc_mp, rcur->bc_private.a.agno, + agbno, aglen); + + /* Add refcount btree reservation */ + error = xfs_refcount_adjust_cow(rcur, agbno, aglen, + XFS_REFCOUNT_ADJUST_COW_ALLOC, dfops); + if (error) + return error; + + /* Add rmap entry */ + if (xfs_sb_version_hasrmapbt(&rcur->bc_mp->m_sb)) { + error = xfs_rmap_alloc_extent(rcur->bc_mp, dfops, + rcur->bc_private.a.agno, + agbno, aglen, XFS_RMAP_OWN_COW); + if (error) + return error; + } + + return error; +} + +/* + * Remove a CoW allocation from the refcount btree. + */ +STATIC int +__xfs_refcount_cow_free( + struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + struct xfs_defer_ops *dfops) +{ + int error; + + trace_xfs_refcount_cow_decrease(rcur->bc_mp, rcur->bc_private.a.agno, + agbno, aglen); + + /* Remove refcount btree reservation */ + error = xfs_refcount_adjust_cow(rcur, agbno, aglen, + XFS_REFCOUNT_ADJUST_COW_FREE, dfops); + if (error) + return error; + + /* Remove rmap entry */ + if (xfs_sb_version_hasrmapbt(&rcur->bc_mp->m_sb)) { + error = xfs_rmap_free_extent(rcur->bc_mp, dfops, + rcur->bc_private.a.agno, + agbno, aglen, XFS_RMAP_OWN_COW); + if (error) + return error; + } + + return error; +} + +/* Record a CoW staging extent in the refcount btree. */ +int +xfs_refcount_alloc_cow_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + xfs_fsblock_t fsb, + xfs_extlen_t len) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_ALLOC_COW, + fsb, len); +} + +/* Forget a CoW staging event in the refcount btree. */ +int +xfs_refcount_free_cow_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + xfs_fsblock_t fsb, + xfs_extlen_t len) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_FREE_COW, + fsb, len); +} diff --git a/fs/xfs/libxfs/xfs_refcount.h b/fs/xfs/libxfs/xfs_refcount.h index 0ec9a28..105c246 100644 --- a/fs/xfs/libxfs/xfs_refcount.h +++ b/fs/xfs/libxfs/xfs_refcount.h @@ -57,4 +57,11 @@ extern int xfs_refcount_find_shared(struct xfs_btree_cur *cur, xfs_agblock_t agbno, xfs_extlen_t aglen, xfs_agblock_t *fbno, xfs_extlen_t *flen, bool find_maximal); +extern int xfs_refcount_alloc_cow_extent(struct xfs_mount *mp, + struct xfs_defer_ops *dfops, xfs_fsblock_t fsb, + xfs_extlen_t len); +extern int xfs_refcount_free_cow_extent(struct xfs_mount *mp, + struct xfs_defer_ops *dfops, xfs_fsblock_t fsb, + xfs_extlen_t len); + #endif /* __XFS_REFCOUNT_H__ */ diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index d556731..0093616 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -44,6 +44,7 @@ #include "xfs_sysfs.h" #include "xfs_rmap_btree.h" #include "xfs_refcount_btree.h" +#include "xfs_reflink.h" static DEFINE_MUTEX(xfs_uuid_table_mutex); @@ -962,6 +963,14 @@ xfs_mountfs( if (error) xfs_warn(mp, "Unable to allocate reserve blocks. Continuing without reserve pool."); + + /* Recover any CoW blocks that never got remapped. */ + error = xfs_reflink_recover_cow(mp); + if (error && !XFS_FORCED_SHUTDOWN(mp)) { + xfs_err(mp, + "Error %d recovering leftover CoW allocations.", error); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + } } return 0; diff --git a/fs/xfs/xfs_refcount_item.c b/fs/xfs/xfs_refcount_item.c index 7be6029..c1291dc 100644 --- a/fs/xfs/xfs_refcount_item.c +++ b/fs/xfs/xfs_refcount_item.c @@ -533,6 +533,18 @@ xfs_cui_recover( error = xfs_refcount_decrease_extent( tp->t_mountp, &dfops, &irec); break; + case XFS_REFCOUNT_ALLOC_COW: + error = xfs_refcount_alloc_cow_extent( + tp->t_mountp, &dfops, + irec.br_startblock, + irec.br_blockcount); + break; + case XFS_REFCOUNT_FREE_COW: + error = xfs_refcount_free_cow_extent( + tp->t_mountp, &dfops, + irec.br_startblock, + irec.br_blockcount); + break; default: ASSERT(0); } diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index b6fbbe6..ed8da62 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -576,6 +576,13 @@ xfs_reflink_cancel_cow_blocks( xfs_trans_ijoin(*tpp, ip, 0); xfs_defer_init(&dfops, &firstfsb); + /* Free the CoW orphan record. */ + error = xfs_refcount_free_cow_extent(ip->i_mount, + &dfops, irec.br_startblock, + irec.br_blockcount); + if (error) + break; + xfs_bmap_add_free(ip->i_mount, &dfops, irec.br_startblock, irec.br_blockcount, NULL); @@ -733,6 +740,13 @@ xfs_reflink_end_cow( irec.br_blockcount = rlen; trace_xfs_reflink_cow_remap_piece(ip, &uirec); + /* Free the CoW orphan record. */ + error = xfs_refcount_free_cow_extent(tp->t_mountp, + &dfops, uirec.br_startblock, + uirec.br_blockcount); + if (error) + goto out_defer; + /* Map the new blocks into the data fork. */ error = xfs_bmap_map_extent(tp->t_mountp, &dfops, ip, XFS_DATA_FORK, &uirec); @@ -770,3 +784,133 @@ out: trace_xfs_reflink_end_cow_error(ip, error, _RET_IP_); return error; } + +struct xfs_reflink_recovery { + struct list_head rr_list; + struct xfs_refcount_irec rr_rrec; +}; + +/* + * Find and remove leftover CoW reservations. + */ +STATIC int +xfs_reflink_recover_cow_ag( + struct xfs_mount *mp, + xfs_agnumber_t agno) +{ + struct list_head debris; + struct xfs_trans *tp; + struct xfs_btree_cur *cur; + struct xfs_buf *agbp; + struct xfs_refcount_irec tmp; + struct xfs_reflink_recovery *rr, *n; + struct xfs_defer_ops dfops; + xfs_fsblock_t fsb; + int i, have; + int error; + + error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + if (error) + return error; + cur = xfs_refcountbt_init_cursor(mp, NULL, agbp, agno, NULL); + + /* Start iterating btree entries. */ + INIT_LIST_HEAD(&debris); + error = xfs_refcount_lookup_ge(cur, 0, &have); + if (error) + goto out_error; + while (have) { + /* If refcount == 1, save the stashed entry for later. */ + error = xfs_refcount_get_rec(cur, &tmp, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + if (tmp.rc_refcount != 1) + goto advloop; + + rr = kmem_alloc(sizeof(struct xfs_reflink_recovery), KM_SLEEP); + rr->rr_rrec = tmp; + list_add_tail(&rr->rr_list, &debris); + +advloop: + /* Look at the next one */ + error = xfs_btree_increment(cur, 0, &have); + if (error) + goto out_error; + } + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + xfs_buf_relse(agbp); + + /* Now iterate the list to free the leftovers */ + list_for_each_entry(rr, &debris, rr_list) { + /* Set up transaction. */ + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, 0, 0, 0, &tp); + if (error) + goto out_free; + + trace_xfs_reflink_recover_extent(mp, agno, &rr->rr_rrec); + + /* Free the orphan record */ + xfs_defer_init(&dfops, &fsb); + fsb = XFS_AGB_TO_FSB(mp, agno, rr->rr_rrec.rc_startblock); + error = xfs_refcount_free_cow_extent(mp, &dfops, fsb, + rr->rr_rrec.rc_blockcount); + if (error) + goto out_defer; + + /* Free the block. */ + xfs_bmap_add_free(mp, &dfops, fsb, + rr->rr_rrec.rc_blockcount, NULL); + + error = xfs_defer_finish(&tp, &dfops, NULL); + if (error) + goto out_defer; + + error = xfs_trans_commit(tp); + if (error) + goto out_cancel; + } + goto out_free; + +out_defer: + xfs_defer_cancel(&dfops); +out_cancel: + xfs_trans_cancel(tp); + +out_free: + /* Free the leftover list */ + list_for_each_entry_safe(rr, n, &debris, rr_list) { + list_del(&rr->rr_list); + kmem_free(rr); + } + + return error; + +out_error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + xfs_buf_relse(agbp); + return error; +} + +/* + * Free leftover CoW reservations that didn't get cleaned out. + */ +int +xfs_reflink_recover_cow( + struct xfs_mount *mp) +{ + xfs_agnumber_t agno; + int error = 0; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { + error = xfs_reflink_recover_cow_ag(mp, agno); + if (error) + break; + } + + return error; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 4aaefd4..79b00a9 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -43,5 +43,6 @@ extern int xfs_reflink_cancel_cow_range(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t count); extern int xfs_reflink_end_cow(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t count); +extern int xfs_reflink_recover_cow(struct xfs_mount *mp); #endif /* __XFS_REFLINK_H */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 86afb15..c580926 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1306,6 +1306,14 @@ xfs_fs_remount( xfs_restore_resvblks(mp); xfs_log_work_queue(mp); xfs_queue_eofblocks(mp); + + /* Recover any CoW blocks that never got remapped. */ + error = xfs_reflink_recover_cow(mp); + if (error && !XFS_FORCED_SHUTDOWN(mp)) { + xfs_err(mp, + "Error %d recovering leftover CoW allocations.", error); + xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); + } } /* rw -> ro */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 73d92be..8fba977 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2889,14 +2889,18 @@ DEFINE_AG_ERROR_EVENT(xfs_refcount_update_error); /* refcount adjustment tracepoints */ DEFINE_AG_EXTENT_EVENT(xfs_refcount_increase); DEFINE_AG_EXTENT_EVENT(xfs_refcount_decrease); +DEFINE_AG_EXTENT_EVENT(xfs_refcount_cow_increase); +DEFINE_AG_EXTENT_EVENT(xfs_refcount_cow_decrease); DEFINE_REFCOUNT_TRIPLE_EXTENT_EVENT(xfs_refcount_merge_center_extents); DEFINE_REFCOUNT_EXTENT_EVENT(xfs_refcount_modify_extent); +DEFINE_REFCOUNT_EXTENT_EVENT(xfs_reflink_recover_extent); DEFINE_REFCOUNT_EXTENT_AT_EVENT(xfs_refcount_split_extent); DEFINE_REFCOUNT_DOUBLE_EXTENT_EVENT(xfs_refcount_merge_left_extent); DEFINE_REFCOUNT_DOUBLE_EXTENT_EVENT(xfs_refcount_merge_right_extent); DEFINE_REFCOUNT_DOUBLE_EXTENT_AT_EVENT(xfs_refcount_find_left_extent); DEFINE_REFCOUNT_DOUBLE_EXTENT_AT_EVENT(xfs_refcount_find_right_extent); DEFINE_AG_ERROR_EVENT(xfs_refcount_adjust_error); +DEFINE_AG_ERROR_EVENT(xfs_refcount_adjust_cow_error); DEFINE_AG_ERROR_EVENT(xfs_refcount_merge_center_extents_error); DEFINE_AG_ERROR_EVENT(xfs_refcount_modify_extent_error); DEFINE_AG_ERROR_EVENT(xfs_refcount_split_extent_error); From darrick.wong@oracle.com Thu Aug 25 18:37:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2E4AC7E12 for ; Thu, 25 Aug 2016 18:37:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4877304051 for ; Thu, 25 Aug 2016 16:36:59 -0700 (PDT) X-ASG-Debug-ID: 1472168217-0bf57b5313209420001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id m14ZHYHOLjHykObE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:36:57 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNatXJ020682 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:56 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNat8s019019 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:36:55 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNasaZ017698; Thu, 25 Aug 2016 23:36:54 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:36:53 -0700 Subject: [PATCH 45/71] xfs: reflink extents from one file to another From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 45/71] xfs: reflink extents from one file to another To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:52 -0700 Message-ID: <147216821253.867.11872089223427287627.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168217 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13910 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Reflink extents from one file to another; that is to say, iteratively remove the mappings from the destination file, copy the mappings from the source file to the destination file, and increment the reference count of all the blocks that got remapped. v2: Call xfs_defer_cancel before cancelling the transaction if the remap operation fails. Use the deferred operations system to avoid deadlocks or blowing out the transaction reservation, and make the entire reflink operation atomic for each extent being remapped. The destination file's i_size will be updated if necessary to avoid violating the assumption that there are no shared blocks past the EOF block. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_reflink.c | 425 ++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 2 2 files changed, 427 insertions(+) diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index ed8da62..4d759a5 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -914,3 +914,428 @@ xfs_reflink_recover_cow( return error; } + +/* + * Reflinking (Block) Ranges of Two Files Together + * + * First, ensure that the reflink flag is set on both inodes. The flag is an + * optimization to avoid unnecessary refcount btree lookups in the write path. + * + * Now we can iteratively remap the range of extents (and holes) in src to the + * corresponding ranges in dest. Let drange and srange denote the ranges of + * logical blocks in dest and src touched by the reflink operation. + * + * While the length of drange is greater than zero, + * - Read src's bmbt at the start of srange ("imap") + * - If imap doesn't exist, make imap appear to start at the end of srange + * with zero length. + * - If imap starts before srange, advance imap to start at srange. + * - If imap goes beyond srange, truncate imap to end at the end of srange. + * - Punch (imap start - srange start + imap len) blocks from dest at + * offset (drange start). + * - If imap points to a real range of pblks, + * > Increase the refcount of the imap's pblks + * > Map imap's pblks into dest at the offset + * (drange start + imap start - srange start) + * - Advance drange and srange by (imap start - srange start + imap len) + * + * Finally, if the reflink made dest longer, update both the in-core and + * on-disk file sizes. + * + * ASCII Art Demonstration: + * + * Let's say we want to reflink this source file: + * + * ----SSSSSSS-SSSSS----SSSSSS (src file) + * <--------------------> + * + * into this destination file: + * + * --DDDDDDDDDDDDDDDDDDD--DDD (dest file) + * <--------------------> + * '-' means a hole, and 'S' and 'D' are written blocks in the src and dest. + * Observe that the range has different logical offsets in either file. + * + * Consider that the first extent in the source file doesn't line up with our + * reflink range. Unmapping and remapping are separate operations, so we can + * unmap more blocks from the destination file than we remap. + * + * ----SSSSSSS-SSSSS----SSSSSS + * <-------> + * --DDDDD---------DDDDD--DDD + * <-------> + * + * Now remap the source extent into the destination file: + * + * ----SSSSSSS-SSSSS----SSSSSS + * <-------> + * --DDDDD--SSSSSSSDDDDD--DDD + * <-------> + * + * Do likewise with the second hole and extent in our range. Holes in the + * unmap range don't affect our operation. + * + * ----SSSSSSS-SSSSS----SSSSSS + * <----> + * --DDDDD--SSSSSSS-SSSSS-DDD + * <----> + * + * Finally, unmap and remap part of the third extent. This will increase the + * size of the destination file. + * + * ----SSSSSSS-SSSSS----SSSSSS + * <-----> + * --DDDDD--SSSSSSS-SSSSS----SSS + * <-----> + * + * Once we update the destination file's i_size, we're done. + */ + +/* + * Ensure the reflink bit is set in both inodes. + */ +STATIC int +xfs_reflink_set_inode_flag( + struct xfs_inode *src, + struct xfs_inode *dest) +{ + struct xfs_mount *mp = src->i_mount; + int error; + struct xfs_trans *tp; + + if (xfs_is_reflink_inode(src) && xfs_is_reflink_inode(dest)) + return 0; + + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); + if (error) + goto out_error; + + /* Lock both files against IO */ + if (src->i_ino == dest->i_ino) + xfs_ilock(src, XFS_ILOCK_EXCL); + else + xfs_lock_two_inodes(src, dest, XFS_ILOCK_EXCL); + + if (!xfs_is_reflink_inode(src)) { + trace_xfs_reflink_set_inode_flag(src); + xfs_trans_ijoin(tp, src, XFS_ILOCK_EXCL); + src->i_d.di_flags2 |= XFS_DIFLAG2_REFLINK; + xfs_trans_log_inode(tp, src, XFS_ILOG_CORE); + xfs_ifork_init_cow(src); + } else + xfs_iunlock(src, XFS_ILOCK_EXCL); + + if (src->i_ino == dest->i_ino) + goto commit_flags; + + if (!xfs_is_reflink_inode(dest)) { + trace_xfs_reflink_set_inode_flag(dest); + xfs_trans_ijoin(tp, dest, XFS_ILOCK_EXCL); + dest->i_d.di_flags2 |= XFS_DIFLAG2_REFLINK; + xfs_trans_log_inode(tp, dest, XFS_ILOG_CORE); + xfs_ifork_init_cow(dest); + } else + xfs_iunlock(dest, XFS_ILOCK_EXCL); + +commit_flags: + error = xfs_trans_commit(tp); + if (error) + goto out_error; + return error; + +out_error: + trace_xfs_reflink_set_inode_flag_error(dest, error, _RET_IP_); + return error; +} + +/* + * Update destination inode size, if necessary. + */ +STATIC int +xfs_reflink_update_dest( + struct xfs_inode *dest, + xfs_off_t newlen) +{ + struct xfs_mount *mp = dest->i_mount; + struct xfs_trans *tp; + int error; + + if (newlen <= i_size_read(VFS_I(dest))) + return 0; + + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); + if (error) + goto out_error; + + xfs_ilock(dest, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dest, XFS_ILOCK_EXCL); + + trace_xfs_reflink_update_inode_size(dest, newlen); + i_size_write(VFS_I(dest), newlen); + dest->i_d.di_size = newlen; + xfs_trans_log_inode(tp, dest, XFS_ILOG_CORE); + + error = xfs_trans_commit(tp); + if (error) + goto out_error; + return error; + +out_error: + trace_xfs_reflink_update_inode_size_error(dest, error, _RET_IP_); + return error; +} + +/* + * Unmap a range of blocks from a file, then map other blocks into the hole. + * The range to unmap is (destoff : destoff + srcioff + irec->br_blockcount). + * The extent irec is mapped into dest at irec->br_startoff. + */ +STATIC int +xfs_reflink_remap_extent( + struct xfs_inode *ip, + struct xfs_bmbt_irec *irec, + xfs_fileoff_t destoff, + xfs_off_t new_isize) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + xfs_fsblock_t firstfsb; + unsigned int resblks; + struct xfs_defer_ops dfops; + struct xfs_bmbt_irec uirec; + bool real_extent; + xfs_filblks_t rlen; + xfs_filblks_t unmap_len; + xfs_off_t newlen; + int error; + + unmap_len = irec->br_startoff + irec->br_blockcount - destoff; + trace_xfs_reflink_punch_range(ip, destoff, unmap_len); + + /* Only remap normal extents. */ + real_extent = (irec->br_startblock != HOLESTARTBLOCK && + irec->br_startblock != DELAYSTARTBLOCK && + !ISUNWRITTEN(irec)); + + /* Start a rolling transaction to switch the mappings */ + resblks = XFS_EXTENTADD_SPACE_RES(ip->i_mount, XFS_DATA_FORK); + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, 0, 0, &tp); + if (error) + goto out; + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + /* If we're not just clearing space, then do we have enough quota? */ + if (real_extent) { + error = xfs_trans_reserve_quota_nblks(tp, ip, + irec->br_blockcount, 0, XFS_QMOPT_RES_REGBLKS); + if (error) + goto out_cancel; + } + + trace_xfs_reflink_remap(ip, irec->br_startoff, + irec->br_blockcount, irec->br_startblock); + + /* Unmap the old blocks in the data fork. */ + rlen = unmap_len; + while (rlen) { + xfs_defer_init(&dfops, &firstfsb); + error = __xfs_bunmapi(tp, ip, destoff, &rlen, 0, 1, + &firstfsb, &dfops); + if (error) + goto out_defer; + + /* Trim the extent to whatever got unmapped. */ + uirec = *irec; + xfs_trim_extent(&uirec, destoff + rlen, unmap_len - rlen); + unmap_len = rlen; + + /* If this isn't a real mapping, we're done. */ + if (!real_extent || uirec.br_blockcount == 0) + goto next_extent; + + trace_xfs_reflink_remap(ip, uirec.br_startoff, + uirec.br_blockcount, uirec.br_startblock); + + /* Update the refcount tree */ + error = xfs_refcount_increase_extent(mp, &dfops, &uirec); + if (error) + goto out_defer; + + /* Map the new blocks into the data fork. */ + error = xfs_bmap_map_extent(mp, &dfops, ip, XFS_DATA_FORK, + &uirec); + if (error) + goto out_defer; + + /* Update quota accounting. */ + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, + uirec.br_blockcount); + + /* Update dest isize if needed. */ + newlen = XFS_FSB_TO_B(mp, + uirec.br_startoff + uirec.br_blockcount); + newlen = min_t(xfs_off_t, newlen, new_isize); + if (newlen > i_size_read(VFS_I(ip))) { + trace_xfs_reflink_update_inode_size(ip, newlen); + i_size_write(VFS_I(ip), newlen); + ip->i_d.di_size = newlen; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + } + +next_extent: + /* Process all the deferred stuff. */ + error = xfs_defer_finish(&tp, &dfops, ip); + if (error) + goto out_defer; + } + + error = xfs_trans_commit(tp); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + goto out; + return 0; + +out_defer: + xfs_defer_cancel(&dfops); +out_cancel: + xfs_trans_cancel(tp); + xfs_iunlock(ip, XFS_ILOCK_EXCL); +out: + trace_xfs_reflink_remap_extent_error(ip, error, _RET_IP_); + return error; +} + +/* + * Iteratively remap one file's extents (and holes) to another's. + */ +STATIC int +xfs_reflink_remap_blocks( + struct xfs_inode *src, + xfs_fileoff_t srcoff, + struct xfs_inode *dest, + xfs_fileoff_t destoff, + xfs_filblks_t len, + xfs_off_t new_isize) +{ + struct xfs_bmbt_irec imap; + int nimaps; + int error = 0; + xfs_filblks_t range_len; + + /* drange = (destoff, destoff + len); srange = (srcoff, srcoff + len) */ + while (len) { + trace_xfs_reflink_remap_blocks_loop(src, srcoff, len, + dest, destoff); + /* Read extent from the source file */ + nimaps = 1; + xfs_ilock(src, XFS_ILOCK_EXCL); + error = xfs_bmapi_read(src, srcoff, len, &imap, &nimaps, 0); + xfs_iunlock(src, XFS_ILOCK_EXCL); + if (error) + goto err; + ASSERT(nimaps == 1); + + trace_xfs_reflink_remap_imap(src, srcoff, len, XFS_IO_OVERWRITE, + &imap); + + /* Translate imap into the destination file. */ + range_len = imap.br_startoff + imap.br_blockcount - srcoff; + imap.br_startoff += destoff - srcoff; + + /* Clear dest from destoff to the end of imap and map it in. */ + error = xfs_reflink_remap_extent(dest, &imap, destoff, + new_isize); + if (error) + goto err; + + if (fatal_signal_pending(current)) { + error = -EINTR; + goto err; + } + + /* Advance drange/srange */ + srcoff += range_len; + destoff += range_len; + len -= range_len; + } + + return 0; + +err: + trace_xfs_reflink_remap_blocks_error(dest, error, _RET_IP_); + return error; +} + +/* + * Link a range of blocks from one file to another. + */ +int +xfs_reflink_remap_range( + struct xfs_inode *src, + xfs_off_t srcoff, + struct xfs_inode *dest, + xfs_off_t destoff, + xfs_off_t len) +{ + struct xfs_mount *mp = src->i_mount; + xfs_fileoff_t sfsbno, dfsbno; + xfs_filblks_t fsblen; + int error; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return -EOPNOTSUPP; + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + /* Don't reflink realtime inodes */ + if (XFS_IS_REALTIME_INODE(src) || XFS_IS_REALTIME_INODE(dest)) + return -EINVAL; + + trace_xfs_reflink_remap_range(src, srcoff, len, dest, destoff); + + /* Lock both files against IO */ + if (src->i_ino == dest->i_ino) { + xfs_ilock(src, XFS_IOLOCK_EXCL); + xfs_ilock(src, XFS_MMAPLOCK_EXCL); + } else { + xfs_lock_two_inodes(src, dest, XFS_IOLOCK_EXCL); + xfs_lock_two_inodes(src, dest, XFS_MMAPLOCK_EXCL); + } + + error = xfs_reflink_set_inode_flag(src, dest); + if (error) + goto out_error; + + /* + * Invalidate the page cache so that we can clear any CoW mappings + * in the destination file. + */ + truncate_inode_pages_range(&VFS_I(dest)->i_data, destoff, + PAGE_ALIGN(destoff + len) - 1); + + dfsbno = XFS_B_TO_FSBT(mp, destoff); + sfsbno = XFS_B_TO_FSBT(mp, srcoff); + fsblen = XFS_B_TO_FSB(mp, len); + error = xfs_reflink_remap_blocks(src, sfsbno, dest, dfsbno, fsblen, + destoff + len); + if (error) + goto out_error; + + error = xfs_reflink_update_dest(dest, destoff + len); + if (error) + goto out_error; + +out_error: + xfs_iunlock(src, XFS_MMAPLOCK_EXCL); + xfs_iunlock(src, XFS_IOLOCK_EXCL); + if (src->i_ino != dest->i_ino) { + xfs_iunlock(dest, XFS_MMAPLOCK_EXCL); + xfs_iunlock(dest, XFS_IOLOCK_EXCL); + } + if (error) + trace_xfs_reflink_remap_range_error(dest, error, _RET_IP_); + return error; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 79b00a9..bd9c832 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -44,5 +44,7 @@ extern int xfs_reflink_cancel_cow_range(struct xfs_inode *ip, xfs_off_t offset, extern int xfs_reflink_end_cow(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t count); extern int xfs_reflink_recover_cow(struct xfs_mount *mp); +extern int xfs_reflink_remap_range(struct xfs_inode *src, xfs_off_t srcoff, + struct xfs_inode *dest, xfs_off_t destoff, xfs_off_t len); #endif /* __XFS_REFLINK_H */ From darrick.wong@oracle.com Thu Aug 25 18:37:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C15997DDA for ; Thu, 25 Aug 2016 18:37:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 697CE8F8035 for ; Thu, 25 Aug 2016 16:37:06 -0700 (PDT) X-ASG-Debug-ID: 1472168223-0bf8155c771e6d30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 8rOYr3uChGmx11PD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:04 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNb2kK014213 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:02 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNb1B5009072 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:01 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNb04E029902; Thu, 25 Aug 2016 23:37:00 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:00 -0700 Subject: [PATCH 46/71] xfs: add clone file and clone range vfs functions From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 46/71] xfs: add clone file and clone range vfs functions To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:36:58 -0700 Message-ID: <147216821884.867.10570315449782485300.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168223 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5336 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Define two VFS functions which allow userspace to reflink a range of blocks between two files or to reflink one file's contents to another. These functions fit the new VFS ioctls that standardize the checking for the btrfs CLONE and CLONE RANGE ioctls. v2: Plug into the VFS function pointers instead of handling ioctls directly. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 11 ++++ fs/xfs/xfs_file.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 6f4f2c3..788e006 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -533,6 +533,17 @@ typedef struct xfs_swapext #define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t) /* XFS_IOC_GETFSUUID ---------- deprecated 140 */ +/* reflink ioctls; these MUST match the btrfs ioctl definitions */ +/* from struct btrfs_ioctl_clone_range_args */ +struct xfs_clone_args { + __s64 src_fd; + __u64 src_offset; + __u64 src_length; + __u64 dest_offset; +}; + +#define XFS_IOC_CLONE _IOW (0x94, 9, int) +#define XFS_IOC_CLONE_RANGE _IOW (0x94, 13, struct xfs_clone_args) #ifndef HAVE_BBMACROS /* diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 22311fa..5440207 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1032,6 +1032,146 @@ out_unlock: return error; } +/* + * Flush all file writes out to disk. + */ +static int +xfs_file_wait_for_io( + struct inode *inode, + loff_t offset, + size_t len) +{ + loff_t rounding; + loff_t ioffset; + loff_t iendoffset; + loff_t bs; + int ret; + + bs = inode->i_sb->s_blocksize; + inode_dio_wait(inode); + + rounding = max_t(xfs_off_t, bs, PAGE_SIZE); + ioffset = round_down(offset, rounding); + iendoffset = round_up(offset + len, rounding) - 1; + ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, + iendoffset); + return ret; +} + +/* Hook up to the VFS reflink function */ +STATIC int +xfs_file_share_range( + struct file *file_in, + loff_t pos_in, + struct file *file_out, + loff_t pos_out, + u64 len) +{ + struct inode *inode_in; + struct inode *inode_out; + ssize_t ret; + loff_t bs; + loff_t isize; + int same_inode; + loff_t blen; + + inode_in = file_inode(file_in); + inode_out = file_inode(file_out); + bs = inode_out->i_sb->s_blocksize; + + /* Don't touch certain kinds of inodes */ + if (IS_IMMUTABLE(inode_out)) + return -EPERM; + if (IS_SWAPFILE(inode_in) || + IS_SWAPFILE(inode_out)) + return -ETXTBSY; + + /* Reflink only works within this filesystem. */ + if (inode_in->i_sb != inode_out->i_sb) + return -EXDEV; + same_inode = (inode_in->i_ino == inode_out->i_ino); + + /* Don't reflink dirs, pipes, sockets... */ + if (S_ISDIR(inode_in->i_mode) || S_ISDIR(inode_out->i_mode)) + return -EISDIR; + if (S_ISFIFO(inode_in->i_mode) || S_ISFIFO(inode_out->i_mode)) + return -EINVAL; + if (!S_ISREG(inode_in->i_mode) || !S_ISREG(inode_out->i_mode)) + return -EINVAL; + + /* Are we going all the way to the end? */ + isize = i_size_read(inode_in); + if (isize == 0) + return 0; + if (len == 0) + len = isize - pos_in; + + /* Ensure offsets don't wrap and the input is inside i_size */ + if (pos_in + len < pos_in || pos_out + len < pos_out || + pos_in + len > isize) + return -EINVAL; + + /* If we're linking to EOF, continue to the block boundary. */ + if (pos_in + len == isize) + blen = ALIGN(isize, bs) - pos_in; + else + blen = len; + + /* Only reflink if we're aligned to block boundaries */ + if (!IS_ALIGNED(pos_in, bs) || !IS_ALIGNED(pos_in + blen, bs) || + !IS_ALIGNED(pos_out, bs) || !IS_ALIGNED(pos_out + blen, bs)) + return -EINVAL; + + /* Don't allow overlapped reflink within the same file */ + if (same_inode && pos_out + blen > pos_in && pos_out < pos_in + blen) + return -EINVAL; + + /* Wait for the completion of any pending IOs on srcfile */ + ret = xfs_file_wait_for_io(inode_in, pos_in, len); + if (ret) + goto out_unlock; + ret = xfs_file_wait_for_io(inode_out, pos_out, len); + if (ret) + goto out_unlock; + + ret = xfs_reflink_remap_range(XFS_I(inode_in), pos_in, XFS_I(inode_out), + pos_out, len); + if (ret < 0) + goto out_unlock; + +out_unlock: + return ret; +} + +STATIC ssize_t +xfs_file_copy_range( + struct file *file_in, + loff_t pos_in, + struct file *file_out, + loff_t pos_out, + size_t len, + unsigned int flags) +{ + int error; + + error = xfs_file_share_range(file_in, pos_in, file_out, pos_out, + len); + if (error) + return error; + return len; +} + +STATIC int +xfs_file_clone_range( + struct file *file_in, + loff_t pos_in, + struct file *file_out, + loff_t pos_out, + u64 len) +{ + return xfs_file_share_range(file_in, pos_in, file_out, pos_out, + len); +} STATIC int xfs_file_open( @@ -1692,6 +1832,8 @@ const struct file_operations xfs_file_operations = { .release = xfs_file_release, .fsync = xfs_file_fsync, .fallocate = xfs_file_fallocate, + .copy_file_range = xfs_file_copy_range, + .clone_file_range = xfs_file_clone_range, }; const struct file_operations xfs_dir_file_operations = { From darrick.wong@oracle.com Thu Aug 25 18:37:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 556AD7E1B for ; Thu, 25 Aug 2016 18:37:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28951304039 for ; Thu, 25 Aug 2016 16:37:17 -0700 (PDT) X-ASG-Debug-ID: 1472168234-0bf57b5311209450001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 3NQUpscuI4QuN2z6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:14 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbCVN021162 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:13 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNbCac009354 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:12 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNb6Fe014981; Thu, 25 Aug 2016 23:37:12 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:06 -0700 Subject: [PATCH 47/71] xfs: add dedupe range vfs function From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 47/71] xfs: add dedupe range vfs function To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:05 -0700 Message-ID: <147216822509.867.1023187653596731818.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168234 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9395 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Define a VFS function which allows userspace to request that the kernel reflink a range of blocks between two files if the ranges' contents match. The function fits the new VFS ioctl that standardizes the checking for the btrfs EXTENT SAME ioctl. v2: Plug into the VFS function pointers instead of handling ioctls directly, and lock the pages so they don't disappear while we're trying to compare them. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 30 +++++++++++ fs/xfs/xfs_file.c | 48 +++++++++++++++++- fs/xfs/xfs_reflink.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 5 ++ 4 files changed, 204 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 788e006..6230230 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -542,8 +542,38 @@ struct xfs_clone_args { __u64 dest_offset; }; +/* extent-same (dedupe) ioctls; these MUST match the btrfs ioctl definitions */ +#define XFS_EXTENT_DATA_SAME 0 +#define XFS_EXTENT_DATA_DIFFERS 1 + +/* from struct btrfs_ioctl_file_extent_same_info */ +struct xfs_extent_data_info { + __s64 fd; /* in - destination file */ + __u64 logical_offset; /* in - start of extent in destination */ + __u64 bytes_deduped; /* out - total # of bytes we were able + * to dedupe from this file */ + /* status of this dedupe operation: + * < 0 for error + * == XFS_EXTENT_DATA_SAME if dedupe succeeds + * == XFS_EXTENT_DATA_DIFFERS if data differs + */ + __s32 status; /* out - see above description */ + __u32 reserved; +}; + +/* from struct btrfs_ioctl_file_extent_same_args */ +struct xfs_extent_data { + __u64 logical_offset; /* in - start of extent in source */ + __u64 length; /* in - length of extent */ + __u16 dest_count; /* in - total elements in info array */ + __u16 reserved1; + __u32 reserved2; + struct xfs_extent_data_info info[0]; +}; + #define XFS_IOC_CLONE _IOW (0x94, 9, int) #define XFS_IOC_CLONE_RANGE _IOW (0x94, 13, struct xfs_clone_args) +#define XFS_IOC_FILE_EXTENT_SAME _IOWR(0x94, 54, struct xfs_extent_data) #ifndef HAVE_BBMACROS /* diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 5440207..14ec085 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1065,7 +1065,8 @@ xfs_file_share_range( loff_t pos_in, struct file *file_out, loff_t pos_out, - u64 len) + u64 len, + bool is_dedupe) { struct inode *inode_in; struct inode *inode_out; @@ -1074,6 +1075,7 @@ xfs_file_share_range( loff_t isize; int same_inode; loff_t blen; + unsigned int flags = 0; inode_in = file_inode(file_in); inode_out = file_inode(file_out); @@ -1111,6 +1113,15 @@ xfs_file_share_range( pos_in + len > isize) return -EINVAL; + /* Don't allow dedupe past EOF in the dest file */ + if (is_dedupe) { + loff_t disize; + + disize = i_size_read(inode_out); + if (pos_out >= disize || pos_out + len > disize) + return -EINVAL; + } + /* If we're linking to EOF, continue to the block boundary. */ if (pos_in + len == isize) blen = ALIGN(isize, bs) - pos_in; @@ -1134,8 +1145,10 @@ xfs_file_share_range( if (ret) goto out_unlock; + if (is_dedupe) + flags |= XFS_REFLINK_DEDUPE; ret = xfs_reflink_remap_range(XFS_I(inode_in), pos_in, XFS_I(inode_out), - pos_out, len); + pos_out, len, flags); if (ret < 0) goto out_unlock; @@ -1155,7 +1168,7 @@ xfs_file_copy_range( int error; error = xfs_file_share_range(file_in, pos_in, file_out, pos_out, - len); + len, false); if (error) return error; return len; @@ -1170,7 +1183,33 @@ xfs_file_clone_range( u64 len) { return xfs_file_share_range(file_in, pos_in, file_out, pos_out, - len); + len, false); +} + +#define XFS_MAX_DEDUPE_LEN (16 * 1024 * 1024) +STATIC ssize_t +xfs_file_dedupe_range( + struct file *src_file, + u64 loff, + u64 len, + struct file *dst_file, + u64 dst_loff) +{ + int error; + + /* + * Limit the total length we will dedupe for each operation. + * This is intended to bound the total time spent in this + * ioctl to something sane. + */ + if (len > XFS_MAX_DEDUPE_LEN) + len = XFS_MAX_DEDUPE_LEN; + + error = xfs_file_share_range(src_file, loff, dst_file, dst_loff, + len, true); + if (error) + return error; + return len; } STATIC int @@ -1834,6 +1873,7 @@ const struct file_operations xfs_file_operations = { .fallocate = xfs_file_fallocate, .copy_file_range = xfs_file_copy_range, .clone_file_range = xfs_file_clone_range, + .dedupe_file_range = xfs_file_dedupe_range, }; const struct file_operations xfs_dir_file_operations = { diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 4d759a5..d7eea9e 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -1269,6 +1269,111 @@ err: } /* + * Read a page's worth of file data into the page cache. Return the page + * locked. + */ +static struct page * +xfs_get_page( + struct inode *inode, + xfs_off_t offset) +{ + struct address_space *mapping; + struct page *page; + pgoff_t n; + + n = offset >> PAGE_SHIFT; + mapping = inode->i_mapping; + page = read_mapping_page(mapping, n, NULL); + if (IS_ERR(page)) + return page; + if (!PageUptodate(page)) { + put_page(page); + return ERR_PTR(-EIO); + } + lock_page(page); + return page; +} + +/* + * Compare extents of two files to see if they are the same. + */ +static int +xfs_compare_extents( + struct inode *src, + xfs_off_t srcoff, + struct inode *dest, + xfs_off_t destoff, + xfs_off_t len, + bool *is_same) +{ + xfs_off_t src_poff; + xfs_off_t dest_poff; + void *src_addr; + void *dest_addr; + struct page *src_page; + struct page *dest_page; + xfs_off_t cmp_len; + bool same; + int error; + + error = -EINVAL; + same = true; + while (len) { + src_poff = srcoff & (PAGE_SIZE - 1); + dest_poff = destoff & (PAGE_SIZE - 1); + cmp_len = min(PAGE_SIZE - src_poff, + PAGE_SIZE - dest_poff); + cmp_len = min(cmp_len, len); + ASSERT(cmp_len > 0); + + trace_xfs_reflink_compare_extents(XFS_I(src), srcoff, cmp_len, + XFS_I(dest), destoff); + + src_page = xfs_get_page(src, srcoff); + if (IS_ERR(src_page)) { + error = PTR_ERR(src_page); + goto out_error; + } + dest_page = xfs_get_page(dest, destoff); + if (IS_ERR(dest_page)) { + error = PTR_ERR(dest_page); + unlock_page(src_page); + put_page(src_page); + goto out_error; + } + src_addr = kmap_atomic(src_page); + dest_addr = kmap_atomic(dest_page); + + flush_dcache_page(src_page); + flush_dcache_page(dest_page); + + if (memcmp(src_addr + src_poff, dest_addr + dest_poff, cmp_len)) + same = false; + + kunmap_atomic(dest_addr); + kunmap_atomic(src_addr); + unlock_page(dest_page); + unlock_page(src_page); + put_page(dest_page); + put_page(src_page); + + if (!same) + break; + + srcoff += cmp_len; + destoff += cmp_len; + len -= cmp_len; + } + + *is_same = same; + return 0; + +out_error: + trace_xfs_reflink_compare_extents_error(XFS_I(dest), error, _RET_IP_); + return error; +} + +/* * Link a range of blocks from one file to another. */ int @@ -1277,12 +1382,14 @@ xfs_reflink_remap_range( xfs_off_t srcoff, struct xfs_inode *dest, xfs_off_t destoff, - xfs_off_t len) + xfs_off_t len, + unsigned int flags) { struct xfs_mount *mp = src->i_mount; xfs_fileoff_t sfsbno, dfsbno; xfs_filblks_t fsblen; int error; + bool is_same; if (!xfs_sb_version_hasreflink(&mp->m_sb)) return -EOPNOTSUPP; @@ -1294,6 +1401,9 @@ xfs_reflink_remap_range( if (XFS_IS_REALTIME_INODE(src) || XFS_IS_REALTIME_INODE(dest)) return -EINVAL; + if (flags & ~XFS_REFLINK_ALL) + return -EINVAL; + trace_xfs_reflink_remap_range(src, srcoff, len, dest, destoff); /* Lock both files against IO */ @@ -1305,6 +1415,21 @@ xfs_reflink_remap_range( xfs_lock_two_inodes(src, dest, XFS_MMAPLOCK_EXCL); } + /* + * Check that the extents are the same. + */ + if (flags & XFS_REFLINK_DEDUPE) { + is_same = false; + error = xfs_compare_extents(VFS_I(src), srcoff, VFS_I(dest), + destoff, len, &is_same); + if (error) + goto out_error; + if (!is_same) { + error = -EBADE; + goto out_error; + } + } + error = xfs_reflink_set_inode_flag(src, dest); if (error) goto out_error; diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index bd9c832..6a67c08 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -44,7 +44,10 @@ extern int xfs_reflink_cancel_cow_range(struct xfs_inode *ip, xfs_off_t offset, extern int xfs_reflink_end_cow(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t count); extern int xfs_reflink_recover_cow(struct xfs_mount *mp); +#define XFS_REFLINK_DEDUPE 1 /* only reflink if contents match */ +#define XFS_REFLINK_ALL (XFS_REFLINK_DEDUPE) extern int xfs_reflink_remap_range(struct xfs_inode *src, xfs_off_t srcoff, - struct xfs_inode *dest, xfs_off_t destoff, xfs_off_t len); + struct xfs_inode *dest, xfs_off_t destoff, xfs_off_t len, + unsigned int flags); #endif /* __XFS_REFLINK_H */ From darrick.wong@oracle.com Thu Aug 25 18:37:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 002617DDA for ; Thu, 25 Aug 2016 18:37:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 775A4AC002 for ; Thu, 25 Aug 2016 16:37:17 -0700 (PDT) X-ASG-Debug-ID: 1472168235-0bf8155c741e6d80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id qHHcP7sH51thQpo7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:15 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbEZJ021173 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:14 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNbEQE009371 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:14 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbDO3017781; Thu, 25 Aug 2016 23:37:13 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:12 -0700 Subject: [PATCH 48/71] xfs: teach get_bmapx about shared extents and the CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 48/71] xfs: teach get_bmapx about shared extents and the CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:11 -0700 Message-ID: <147216823143.867.5001532335455709937.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168235 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7974 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Teach xfs_getbmapx how to report shared extents and CoW fork contents accurately in the bmap output by querying the refcount btree appropriately. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 4 + fs/xfs/xfs_bmap_util.c | 132 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 121 insertions(+), 15 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 6230230..b1af423 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -81,14 +81,16 @@ struct getbmapx { #define BMV_IF_PREALLOC 0x4 /* rtn status BMV_OF_PREALLOC if req */ #define BMV_IF_DELALLOC 0x8 /* rtn status BMV_OF_DELALLOC if req */ #define BMV_IF_NO_HOLES 0x10 /* Do not return holes */ +#define BMV_IF_COWFORK 0x20 /* return CoW fork rather than data */ #define BMV_IF_VALID \ (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC| \ - BMV_IF_DELALLOC|BMV_IF_NO_HOLES) + BMV_IF_DELALLOC|BMV_IF_NO_HOLES|BMV_IF_COWFORK) /* bmv_oflags values - returned for each non-header segment */ #define BMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ #define BMV_OF_DELALLOC 0x2 /* segment = delayed allocation */ #define BMV_OF_LAST 0x4 /* segment is the last in the file */ +#define BMV_OF_SHARED 0x8 /* segment shared with another file */ /* * Structure for XFS_IOC_FSSETDM. diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 4ece4f2..5e1c679f 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -42,6 +42,9 @@ #include "xfs_icache.h" #include "xfs_log.h" #include "xfs_rmap_btree.h" +#include "xfs_iomap.h" +#include "xfs_reflink.h" +#include "xfs_refcount.h" /* Kernel only BMAP related definitions and functions */ @@ -389,11 +392,13 @@ xfs_bmap_count_blocks( STATIC int xfs_getbmapx_fix_eof_hole( xfs_inode_t *ip, /* xfs incore inode pointer */ + int whichfork, struct getbmapx *out, /* output structure */ int prealloced, /* this is a file with * preallocated data space */ __int64_t end, /* last block requested */ - xfs_fsblock_t startblock) + xfs_fsblock_t startblock, + bool moretocome) { __int64_t fixlen; xfs_mount_t *mp; /* file system mount point */ @@ -418,8 +423,9 @@ xfs_getbmapx_fix_eof_hole( else out->bmv_block = xfs_fsb_to_db(ip, startblock); fileblock = XFS_BB_TO_FSB(ip->i_mount, out->bmv_offset); - ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); - if (xfs_iext_bno_to_ext(ifp, fileblock, &lastx) && + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!moretocome && + xfs_iext_bno_to_ext(ifp, fileblock, &lastx) && (lastx == (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))-1)) out->bmv_oflags |= BMV_OF_LAST; } @@ -459,12 +465,23 @@ xfs_getbmap( int iflags; /* interface flags */ int bmapi_flags; /* flags for xfs_bmapi */ int cur_ext = 0; + struct xfs_bmbt_irec inject_map; mp = ip->i_mount; iflags = bmv->bmv_iflags; - whichfork = iflags & BMV_IF_ATTRFORK ? XFS_ATTR_FORK : XFS_DATA_FORK; - if (whichfork == XFS_ATTR_FORK) { + if ((iflags & BMV_IF_ATTRFORK) && (iflags & BMV_IF_COWFORK)) + return -EINVAL; + + if (iflags & BMV_IF_ATTRFORK) + whichfork = XFS_ATTR_FORK; + else if (iflags & BMV_IF_COWFORK) + whichfork = XFS_COW_FORK; + else + whichfork = XFS_DATA_FORK; + + switch (whichfork) { + case XFS_ATTR_FORK: if (XFS_IFORK_Q(ip)) { if (ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS && ip->i_d.di_aformat != XFS_DINODE_FMT_BTREE && @@ -480,7 +497,15 @@ xfs_getbmap( prealloced = 0; fixlen = 1LL << 32; - } else { + break; + case XFS_COW_FORK: + if (ip->i_cformat != XFS_DINODE_FMT_EXTENTS) + return -EINVAL; + + prealloced = 0; + fixlen = XFS_ISIZE(ip); + break; + default: if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && ip->i_d.di_format != XFS_DINODE_FMT_BTREE && ip->i_d.di_format != XFS_DINODE_FMT_LOCAL) @@ -494,6 +519,7 @@ xfs_getbmap( prealloced = 0; fixlen = XFS_ISIZE(ip); } + break; } if (bmv->bmv_length == -1) { @@ -520,7 +546,8 @@ xfs_getbmap( return -ENOMEM; xfs_ilock(ip, XFS_IOLOCK_SHARED); - if (whichfork == XFS_DATA_FORK) { + switch (whichfork) { + case XFS_DATA_FORK: if (!(iflags & BMV_IF_DELALLOC) && (ip->i_delayed_blks || XFS_ISIZE(ip) > ip->i_d.di_size)) { error = filemap_write_and_wait(VFS_I(ip)->i_mapping); @@ -538,8 +565,14 @@ xfs_getbmap( } lock = xfs_ilock_data_map_shared(ip); - } else { + break; + case XFS_COW_FORK: + lock = XFS_ILOCK_SHARED; + xfs_ilock(ip, lock); + break; + case XFS_ATTR_FORK: lock = xfs_ilock_attr_map_shared(ip); + break; } /* @@ -581,7 +614,8 @@ xfs_getbmap( goto out_free_map; ASSERT(nmap <= subnex); - for (i = 0; i < nmap && nexleft && bmv->bmv_length; i++) { + for (i = 0; i < nmap && nexleft && bmv->bmv_length && + cur_ext < bmv->bmv_count; i++) { out[cur_ext].bmv_oflags = 0; if (map[i].br_state == XFS_EXT_UNWRITTEN) out[cur_ext].bmv_oflags |= BMV_OF_PREALLOC; @@ -614,9 +648,74 @@ xfs_getbmap( goto out_free_map; } - if (!xfs_getbmapx_fix_eof_hole(ip, &out[cur_ext], - prealloced, bmvend, - map[i].br_startblock)) + /* Is this a shared block? */ + inject_map.br_blockcount = 0; + if (whichfork == XFS_DATA_FORK && + map[i].br_startblock != DELAYSTARTBLOCK && + map[i].br_startblock != HOLESTARTBLOCK && + !ISUNWRITTEN(&map[i]) && xfs_is_reflink_inode(ip)) { + xfs_agblock_t agbno; + xfs_agblock_t ebno; + xfs_extlen_t elen; + xfs_extlen_t nlen; + + agbno = XFS_FSB_TO_AGBNO(mp, + map[i].br_startblock); + error = xfs_reflink_find_shared(mp, + XFS_FSB_TO_AGNO(mp, + map[i].br_startblock), + agbno, + map[i].br_blockcount, + &ebno, &elen, true); + if (error) + goto out_free_map; + + inject_map = map[i]; + if (agbno == ebno) { + /* + * Shared extent at (agbno, elen). + * Shrink the reported extent length + * and prepare to move the start of + * map[i] to agbno+elen, with the aim + * of (re)formatting the new map[i] + * the next time through the inner + * loop. + */ + out[cur_ext].bmv_length = + XFS_FSB_TO_BB(mp, elen); + out[cur_ext].bmv_oflags |= + BMV_OF_SHARED; + inject_map.br_startblock += elen; + inject_map.br_startoff += elen; + inject_map.br_blockcount -= elen; + map[i].br_blockcount -= elen; + } else { + /* + * There's an unshared extent + * (agbno, ebno - agbno) followed by + * shared extent at (ebno, elen). + * Shrink the reported extent length to + * cover only the unshared extent and + * prepare to move up the start of + * map[i] to ebno, with the aim of + * (re)formatting the new map[i] the + * next time through the inner + * loop. + */ + nlen = ebno - agbno; + out[cur_ext].bmv_length = + XFS_FSB_TO_BB(mp, nlen); + inject_map.br_startblock += nlen; + inject_map.br_startoff += nlen; + inject_map.br_blockcount -= nlen; + map[i].br_blockcount -= nlen; + } + } + + if (!xfs_getbmapx_fix_eof_hole(ip, whichfork, + &out[cur_ext], prealloced, bmvend, + map[i].br_startblock, + inject_map.br_blockcount != 0)) goto out_free_map; bmv->bmv_offset = @@ -636,11 +735,16 @@ xfs_getbmap( continue; } - nexleft--; + if (inject_map.br_blockcount) { + map[i] = inject_map; + i--; + } else + nexleft--; bmv->bmv_entries++; cur_ext++; } - } while (nmap && nexleft && bmv->bmv_length); + } while (nmap && nexleft && bmv->bmv_length && + cur_ext < bmv->bmv_count); out_free_map: kmem_free(map); From darrick.wong@oracle.com Thu Aug 25 18:37:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DF7407E2B for ; Thu, 25 Aug 2016 18:37:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B11B98F8035 for ; Thu, 25 Aug 2016 16:37:23 -0700 (PDT) X-ASG-Debug-ID: 1472168241-0bf57c55b11c7950001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id p39nIIXjyxlMFzqN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:22 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbKvA014474 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:37:20 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbKm8007696 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:37:20 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbJhP017898; Thu, 25 Aug 2016 23:37:19 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:19 -0700 Subject: [PATCH 49/71] xfs: swap inode reflink flags when swapping inode extents From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 49/71] xfs: swap inode reflink flags when swapping inode extents To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:17 -0700 Message-ID: <147216823767.867.10956914067526373772.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168242 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1317 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're swapping the extents of two inodes, be sure to swap the reflink inode flag too. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_bmap_util.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 5e1c679f..2ca62d1 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1638,6 +1638,8 @@ xfs_swap_extents( int taforkblks = 0; __uint64_t tmp; int lock_flags; + struct xfs_ifork *cowfp; + __uint64_t f; /* XXX: we can't do this with rmap, will fix later */ if (xfs_sb_version_hasrmapbt(&mp->m_sb)) @@ -1851,6 +1853,19 @@ xfs_swap_extents( break; } + /* Do we have to swap reflink flags? */ + if ((ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK) ^ + (tip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK)) { + f = ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK; + ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; + ip->i_d.di_flags2 |= tip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK; + tip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; + tip->i_d.di_flags2 |= f & XFS_DIFLAG2_REFLINK; + cowfp = ip->i_cowfp; + ip->i_cowfp = tip->i_cowfp; + tip->i_cowfp = cowfp; + } + xfs_trans_log_inode(tp, ip, src_log_flags); xfs_trans_log_inode(tp, tip, target_log_flags); From darrick.wong@oracle.com Thu Aug 25 18:37:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4A6F87E25 for ; Thu, 25 Aug 2016 18:37:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E648304039 for ; Thu, 25 Aug 2016 16:37:32 -0700 (PDT) X-ASG-Debug-ID: 1472168250-0bf57c55b31c7960001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id uvkTXfOGYyJ4EfXs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:31 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbRpt021268 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:27 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNbQCh020208 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:27 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbPeP017912; Thu, 25 Aug 2016 23:37:26 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:25 -0700 Subject: [PATCH 50/71] xfs: unshare a range of blocks via fallocate From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 50/71] xfs: unshare a range of blocks via fallocate To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:23 -0700 Message-ID: <147216824384.867.12107593689756610488.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168250 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8277 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Now that we have an fallocate flag to unshare a range of blocks, make XFS actually implement it. v2: NFS doesn't pass around struct file pointers, which means that our unshare functions all crash when filp == NULL. We don't need filp anyway, so remove all the parts where we pass filp around. Signed-off-by: Darrick J. Wong [hch: pass inode instead of file to xfs_reflink_dirty_range, use iomap infrastructure for copy up] Signed-off-by: Christoph Hellwig --- fs/xfs/xfs_file.c | 6 + fs/xfs/xfs_reflink.c | 237 ++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 2 3 files changed, 244 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 14ec085..28d03c3 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -993,9 +993,13 @@ xfs_file_fallocate( if (mode & FALLOC_FL_ZERO_RANGE) error = xfs_zero_file_space(ip, offset, len); - else + else { + error = xfs_reflink_unshare(ip, offset, len); + if (error) + goto out_unlock; error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); + } if (error) goto out_unlock; } diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index d7eea9e..d717e80 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -1464,3 +1464,240 @@ out_error: trace_xfs_reflink_remap_range_error(dest, error, _RET_IP_); return error; } + +/* + * The user wants to preemptively CoW all shared blocks in this file, + * which enables us to turn off the reflink flag. Iterate all + * extents which are not prealloc/delalloc to see which ranges are + * mentioned in the refcount tree, then read those blocks into the + * pagecache, dirty them, fsync them back out, and then we can update + * the inode flag. What happens if we run out of memory? :) + */ +STATIC int +xfs_reflink_dirty_extents( + struct xfs_inode *ip, + xfs_fileoff_t fbno, + xfs_filblks_t end, + xfs_off_t isize) +{ + struct xfs_mount *mp = ip->i_mount; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + xfs_extlen_t aglen; + xfs_agblock_t rbno; + xfs_extlen_t rlen; + xfs_off_t fpos; + xfs_off_t flen; + struct xfs_bmbt_irec map[2]; + int nmaps; + int error; + + while (end - fbno > 0) { + nmaps = 1; + /* + * Look for extents in the file. Skip holes, delalloc, or + * unwritten extents; they can't be reflinked. + */ + error = xfs_bmapi_read(ip, fbno, end - fbno, map, &nmaps, 0); + if (error) + goto out; + if (nmaps == 0) + break; + if (map[0].br_startblock == HOLESTARTBLOCK || + map[0].br_startblock == DELAYSTARTBLOCK || + ISUNWRITTEN(&map[0])) + goto next; + + map[1] = map[0]; + while (map[1].br_blockcount) { + agno = XFS_FSB_TO_AGNO(mp, map[1].br_startblock); + agbno = XFS_FSB_TO_AGBNO(mp, map[1].br_startblock); + aglen = map[1].br_blockcount; + + error = xfs_reflink_find_shared(mp, agno, agbno, aglen, + &rbno, &rlen, true); + if (error) + goto out; + if (rlen == 0) + goto skip_copy; + + /* Dirty the pages */ + xfs_iunlock(ip, XFS_ILOCK_EXCL); + fpos = XFS_FSB_TO_B(mp, map[1].br_startoff + + (rbno - agbno)); + flen = XFS_FSB_TO_B(mp, rlen); + if (fpos + flen > isize) + flen = isize - fpos; + error = iomap_file_dirty(VFS_I(ip), fpos, flen, + &xfs_iomap_ops); + xfs_ilock(ip, XFS_ILOCK_EXCL); + if (error) + goto out; +skip_copy: + map[1].br_blockcount -= (rbno - agbno + rlen); + map[1].br_startoff += (rbno - agbno + rlen); + map[1].br_startblock += (rbno - agbno + rlen); + } + +next: + fbno = map[0].br_startoff + map[0].br_blockcount; + } +out: + return error; +} + +/* Iterate the extents; if there are no reflinked blocks, clear the flag. */ +STATIC int +xfs_reflink_try_clear_inode_flag( + struct xfs_inode *ip, + xfs_off_t old_isize) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + xfs_fileoff_t fbno; + xfs_filblks_t end; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + xfs_extlen_t aglen; + xfs_agblock_t rbno; + xfs_extlen_t rlen; + struct xfs_bmbt_irec map[2]; + int nmaps; + int error = 0; + + /* Start a rolling transaction to remove the mappings */ + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, 0, 0, 0, &tp); + if (error) + return error; + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + if (old_isize != i_size_read(VFS_I(ip))) + goto cancel; + if (!(ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK)) + goto cancel; + + fbno = 0; + end = XFS_B_TO_FSB(mp, old_isize); + while (end - fbno > 0) { + nmaps = 1; + /* + * Look for extents in the file. Skip holes, delalloc, or + * unwritten extents; they can't be reflinked. + */ + error = xfs_bmapi_read(ip, fbno, end - fbno, map, &nmaps, 0); + if (error) + goto cancel; + if (nmaps == 0) + break; + if (map[0].br_startblock == HOLESTARTBLOCK || + map[0].br_startblock == DELAYSTARTBLOCK || + ISUNWRITTEN(&map[0])) + goto next; + + map[1] = map[0]; + while (map[1].br_blockcount) { + agno = XFS_FSB_TO_AGNO(mp, map[1].br_startblock); + agbno = XFS_FSB_TO_AGBNO(mp, map[1].br_startblock); + aglen = map[1].br_blockcount; + + error = xfs_reflink_find_shared(mp, agno, agbno, aglen, + &rbno, &rlen, false); + if (error) + goto cancel; + /* Is there still a shared block here? */ + if (rlen > 0) { + error = 0; + goto cancel; + } + + map[1].br_blockcount -= aglen; + map[1].br_startoff += aglen; + map[1].br_startblock += aglen; + } + +next: + fbno = map[0].br_startoff + map[0].br_blockcount; + } + + /* + * We didn't find any shared blocks so turn off the reflink flag. + * First, get rid of any leftover CoW mappings. + */ + error = xfs_reflink_cancel_cow_blocks(ip, &tp, 0, NULLFILEOFF); + if (error) + goto cancel; + + /* Clear the inode flag. */ + trace_xfs_reflink_unset_inode_flag(ip); + ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; + xfs_trans_ijoin(tp, ip, 0); + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + + error = xfs_trans_commit(tp); + if (error) + goto out; + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; +cancel: + xfs_trans_cancel(tp); +out: + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* + * Pre-COW all shared blocks within a given byte range of a file and turn off + * the reflink flag if we unshare all of the file's blocks. + */ +int +xfs_reflink_unshare( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len) +{ + struct xfs_mount *mp = ip->i_mount; + xfs_fileoff_t fbno; + xfs_filblks_t end; + xfs_off_t old_isize, isize; + int error; + + if (!xfs_is_reflink_inode(ip)) + return 0; + + trace_xfs_reflink_unshare(ip, offset, len); + + inode_dio_wait(VFS_I(ip)); + + /* Try to CoW the selected ranges */ + xfs_ilock(ip, XFS_ILOCK_EXCL); + fbno = XFS_B_TO_FSB(mp, offset); + old_isize = isize = i_size_read(VFS_I(ip)); + end = XFS_B_TO_FSB(mp, offset + len); + error = xfs_reflink_dirty_extents(ip, fbno, end, isize); + if (error) + goto out_unlock; + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + /* Wait for the IO to finish */ + error = filemap_write_and_wait(VFS_I(ip)->i_mapping); + if (error) + goto out; + + /* Turn off the reflink flag if we unshared the whole file */ + if (offset == 0 && len == isize) { + error = xfs_reflink_try_clear_inode_flag(ip, old_isize); + if (error) + goto out; + } + + return 0; + +out_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); +out: + trace_xfs_reflink_unshare_error(ip, error, _RET_IP_); + return error; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 6a67c08..906c74d 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -49,5 +49,7 @@ extern int xfs_reflink_recover_cow(struct xfs_mount *mp); extern int xfs_reflink_remap_range(struct xfs_inode *src, xfs_off_t srcoff, struct xfs_inode *dest, xfs_off_t destoff, xfs_off_t len, unsigned int flags); +extern int xfs_reflink_unshare(struct xfs_inode *ip, xfs_off_t offset, + xfs_off_t len); #endif /* __XFS_REFLINK_H */ From darrick.wong@oracle.com Thu Aug 25 18:37:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CC5317E38 for ; Thu, 25 Aug 2016 18:37:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D9AF8F8033 for ; Thu, 25 Aug 2016 16:37:36 -0700 (PDT) X-ASG-Debug-ID: 1472168254-0bf57b5312209470001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id NZBuo3Yfxevj2Hl6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbWQr014544 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:33 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNbWCc009754 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:32 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbVkF028936; Thu, 25 Aug 2016 23:37:32 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:31 -0700 Subject: [PATCH 51/71] xfs: CoW shared EOF block when truncating file From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 51/71] xfs: CoW shared EOF block when truncating file To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:30 -0700 Message-ID: <147216825024.867.15854938687374361206.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168254 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3144 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When shrinking a file, the VFS zeroes everything in the associated page between the new EOF and the previous EOF to avoid leaking data. If this block is shared we need to CoW it before the VFS does its zeroing to avoid corrupting the other files. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_iops.c | 9 +++++++++ fs/xfs/xfs_reflink.c | 42 ++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 1 + 3 files changed, 52 insertions(+) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index b24c310..dc3f5ba5 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -39,6 +39,7 @@ #include "xfs_trans_space.h" #include "xfs_pnfs.h" #include "xfs_iomap.h" +#include "xfs_reflink.h" #include #include @@ -827,6 +828,14 @@ xfs_setattr_size( return error; /* + * CoW the EOF block of the file if it's necessary to avoid + * corrupting other files. + */ + error = xfs_reflink_cow_eof_block(ip, newsize); + if (error) + return error; + + /* * We are going to log the inode size change in this transaction so * any previous writes that are beyond the on disk EOF and the new * EOF that have not been written out need to be written here. If we diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index d717e80..c0034c1 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -1701,3 +1701,45 @@ out: trace_xfs_reflink_unshare_error(ip, error, _RET_IP_); return error; } + +/* + * If we're trying to truncate a file whose last block is shared and the new + * size isn't aligned to a block boundary, we need to dirty that last block + * ahead of the VFS zeroing the page. + */ +int +xfs_reflink_cow_eof_block( + struct xfs_inode *ip, + xfs_off_t newsize) +{ + struct xfs_mount *mp = ip->i_mount; + xfs_fileoff_t fbno; + xfs_off_t isize; + int error; + + if (!xfs_is_reflink_inode(ip) || + (newsize & ((1 << VFS_I(ip)->i_blkbits) - 1)) == 0) + return 0; + + /* Try to CoW the shared last block */ + xfs_ilock(ip, XFS_ILOCK_EXCL); + fbno = XFS_B_TO_FSBT(mp, newsize); + isize = i_size_read(VFS_I(ip)); + + if (newsize > isize) + trace_xfs_reflink_cow_eof_block(ip, isize, newsize - isize); + else + trace_xfs_reflink_cow_eof_block(ip, newsize, isize - newsize); + + error = xfs_reflink_dirty_extents(ip, fbno, fbno + 1, isize); + if (error) + goto out_unlock; + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + return 0; + +out_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); + trace_xfs_reflink_cow_eof_block_error(ip, error, _RET_IP_); + return error; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 906c74d..89fe0e3 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -51,5 +51,6 @@ extern int xfs_reflink_remap_range(struct xfs_inode *src, xfs_off_t srcoff, unsigned int flags); extern int xfs_reflink_unshare(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); +extern int xfs_reflink_cow_eof_block(struct xfs_inode *ip, xfs_off_t newsize); #endif /* __XFS_REFLINK_H */ From darrick.wong@oracle.com Thu Aug 25 18:37:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 182C47DDA for ; Thu, 25 Aug 2016 18:37:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B7D218F8033 for ; Thu, 25 Aug 2016 16:37:41 -0700 (PDT) X-ASG-Debug-ID: 1472168260-0bf8155c741e6e20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id NkVcaAkDKKxpdKId (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:40 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbdEP014616 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:37:39 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbcDr008237 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:39 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNbcVL015246; Thu, 25 Aug 2016 23:37:38 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:37 -0700 Subject: [PATCH 52/71] xfs: support FS_XFLAG_REFLINK on reflink filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 52/71] xfs: support FS_XFLAG_REFLINK on reflink filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:36 -0700 Message-ID: <147216825640.867.291198169154557243.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168260 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3088 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add support for reporting the "reflink" inode flag in the XFS-specific getxflags ioctl, and allow the user to clear the flag if file size is zero. v2: Move the reflink flag out of the way of the DAX flag, and add the new cowextsize flag. v3: do not report (or allow changes to) FL_NOCOW_FL, since we don't support a flag to prevent CoWing and the reflink flag is a poor proxy. We'll try to design away the need for the NOCOW flag. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_inode.c | 2 ++ fs/xfs/xfs_ioctl.c | 5 +++++ fs/xfs/xfs_reflink.c | 26 ++++++++++++++++++++++++++ fs/xfs/xfs_reflink.h | 4 ++++ 4 files changed, 37 insertions(+) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8c971fd..d6ec1ec 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -652,6 +652,8 @@ _xfs_dic2xflags( if (di_flags2 & XFS_DIFLAG2_ANY) { if (di_flags2 & XFS_DIFLAG2_DAX) flags |= FS_XFLAG_DAX; + if (di_flags2 & XFS_DIFLAG2_REFLINK) + flags |= FS_XFLAG_REFLINK; } if (has_attr) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 96a70fd..97bb5b6 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -41,6 +41,7 @@ #include "xfs_trans.h" #include "xfs_pnfs.h" #include "xfs_acl.h" +#include "xfs_reflink.h" #include #include @@ -1261,6 +1262,10 @@ xfs_ioctl_setattr( trace_xfs_ioctl_setattr(ip); + code = xfs_reflink_check_flag_adjust(ip, &fa->fsx_xflags); + if (code) + return code; + code = xfs_ioctl_setattr_check_projid(ip, fa); if (code) return code; diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index c0034c1..368cc17 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -1743,3 +1743,29 @@ out_unlock: trace_xfs_reflink_cow_eof_block_error(ip, error, _RET_IP_); return error; } + +/* + * Ensure that the only change we allow to the inode reflink flag is to clear + * it when the fs supports reflink and the size is zero. + */ +int +xfs_reflink_check_flag_adjust( + struct xfs_inode *ip, + unsigned int *xflags) +{ + unsigned int chg; + + chg = !!(*xflags & FS_XFLAG_REFLINK) ^ !!xfs_is_reflink_inode(ip); + + if (!chg) + return 0; + if (!xfs_sb_version_hasreflink(&ip->i_mount->m_sb)) + return -EOPNOTSUPP; + if (i_size_read(VFS_I(ip)) != 0) + return -EINVAL; + if (*xflags & FS_XFLAG_REFLINK) { + *xflags &= ~FS_XFLAG_REFLINK; + return 0; + } + return 0; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 89fe0e3..89e1e62 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -53,4 +53,8 @@ extern int xfs_reflink_unshare(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); extern int xfs_reflink_cow_eof_block(struct xfs_inode *ip, xfs_off_t newsize); +extern void xfs_reflink_get_lxflags(struct xfs_inode *ip, unsigned int *flags); +extern int xfs_reflink_check_flag_adjust(struct xfs_inode *ip, + unsigned int *xflags); + #endif /* __XFS_REFLINK_H */ From darrick.wong@oracle.com Thu Aug 25 18:37:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4898C7E37 for ; Thu, 25 Aug 2016 18:37:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A1E3EAC002 for ; Thu, 25 Aug 2016 16:37:49 -0700 (PDT) X-ASG-Debug-ID: 1472168266-0bf57b53142094a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id taS9qcAhY5GZiF1f (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbiSv021455 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:45 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNbiTA020873 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:44 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbiZt028983; Thu, 25 Aug 2016 23:37:44 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:44 -0700 Subject: [PATCH 53/71] xfs: create a separate cow extent size hint for the allocator From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 53/71] xfs: create a separate cow extent size hint for the allocator To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:42 -0700 Message-ID: <147216826262.867.2724089755289094058.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168266 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16713 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a per-inode extent size allocator hint for copy-on-write. This hint is separate from the existing extent size hint so that CoW can take advantage of the fragmentation-reducing properties of extent size hints without disabling delalloc for regular writes. The extent size hint that's fed to the allocator during a copy on write operation is the greater of the cowextsize and regular extsize hint. During reflink, if we're sharing the entire source file to the entire destination file and the destination file doesn't already have a cowextsize hint, propagate the source file's cowextsize hint to the destination file. Furthermore, zero the bulkstat buffer prior to setting the fields so that we don't copy kernel memory contents into userspace. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 13 +++++++- fs/xfs/libxfs/xfs_format.h | 3 +- fs/xfs/libxfs/xfs_fs.h | 3 +- fs/xfs/libxfs/xfs_inode_buf.c | 4 ++ fs/xfs/libxfs/xfs_inode_buf.h | 1 + fs/xfs/libxfs/xfs_log_format.h | 3 +- fs/xfs/xfs_bmap_util.c | 9 ++++- fs/xfs/xfs_inode.c | 33 ++++++++++++++++++++ fs/xfs/xfs_inode.h | 1 + fs/xfs/xfs_inode_item.c | 2 + fs/xfs/xfs_ioctl.c | 67 +++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_iomap.c | 5 ++- fs/xfs/xfs_itable.c | 8 ++++- fs/xfs/xfs_reflink.c | 36 +++++++++++++++++---- 14 files changed, 168 insertions(+), 20 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 7c5d0b1..76b3a0f 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -3665,7 +3665,13 @@ xfs_bmap_btalloc( else if (mp->m_dalign) stripe_align = mp->m_dalign; - align = ap->userdata ? xfs_get_extsz_hint(ap->ip) : 0; + if (ap->userdata) { + if (ap->flags & XFS_BMAPI_COWFORK) + align = xfs_get_cowextsz_hint(ap->ip); + else + align = xfs_get_extsz_hint(ap->ip); + } else + align = 0; if (unlikely(align)) { error = xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, align, 0, ap->eof, 0, ap->conv, @@ -4179,7 +4185,10 @@ xfs_bmapi_reserve_delalloc( alen = XFS_FILBLKS_MIN(alen, got->br_startoff - aoff); /* Figure out the extent size, adjust alen */ - extsz = xfs_get_extsz_hint(ip); + if (whichfork == XFS_COW_FORK) + extsz = xfs_get_cowextsz_hint(ip); + else + extsz = xfs_get_extsz_hint(ip); if (extsz) { error = xfs_bmap_extsize_align(mp, got, prev, extsz, rt, eof, 1, 0, &aoff, &alen); diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 022ae27..4f2a354 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -900,7 +900,8 @@ typedef struct xfs_dinode { __be64 di_changecount; /* number of attribute changes */ __be64 di_lsn; /* flush sequence */ __be64 di_flags2; /* more random flags */ - __u8 di_pad2[16]; /* more padding for future expansion */ + __be32 di_cowextsize; /* basic cow extent size for file */ + __u8 di_pad2[12]; /* more padding for future expansion */ /* fields only written to during inode creation */ xfs_timestamp_t di_crtime; /* time created */ diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index b1af423..10ebf99 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -278,7 +278,8 @@ typedef struct xfs_bstat { #define bs_projid bs_projid_lo /* (previously just bs_projid) */ __u16 bs_forkoff; /* inode fork offset in bytes */ __u16 bs_projid_hi; /* higher part of project id */ - unsigned char bs_pad[10]; /* pad space, unused */ + unsigned char bs_pad[6]; /* pad space, unused */ + __u32 bs_cowextsize; /* cow extent size */ __u32 bs_dmevmask; /* DMIG event mask */ __u16 bs_dmstate; /* DMIG state info */ __u16 bs_aextents; /* attribute number of extents */ diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index 44f325c..2efa42c 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -267,6 +267,7 @@ xfs_inode_from_disk( to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec); to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec); to->di_flags2 = be64_to_cpu(from->di_flags2); + to->di_cowextsize = be32_to_cpu(from->di_cowextsize); } } @@ -316,7 +317,7 @@ xfs_inode_to_disk( to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); to->di_flags2 = cpu_to_be64(from->di_flags2); - + to->di_cowextsize = cpu_to_be32(from->di_cowextsize); to->di_ino = cpu_to_be64(ip->i_ino); to->di_lsn = cpu_to_be64(lsn); memset(to->di_pad2, 0, sizeof(to->di_pad2)); @@ -368,6 +369,7 @@ xfs_log_dinode_to_disk( to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); to->di_flags2 = cpu_to_be64(from->di_flags2); + to->di_cowextsize = cpu_to_be32(from->di_cowextsize); to->di_ino = cpu_to_be64(from->di_ino); to->di_lsn = cpu_to_be64(from->di_lsn); memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); diff --git a/fs/xfs/libxfs/xfs_inode_buf.h b/fs/xfs/libxfs/xfs_inode_buf.h index 958c543..6848a0a 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.h +++ b/fs/xfs/libxfs/xfs_inode_buf.h @@ -47,6 +47,7 @@ struct xfs_icdinode { __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ __uint64_t di_flags2; /* more random flags */ + __uint32_t di_cowextsize; /* basic cow extent size for file */ xfs_ictimestamp_t di_crtime; /* time created */ }; diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index fffcc0f..d788d01 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -423,7 +423,8 @@ struct xfs_log_dinode { __uint64_t di_changecount; /* number of attribute changes */ xfs_lsn_t di_lsn; /* flush sequence */ __uint64_t di_flags2; /* more random flags */ - __uint8_t di_pad2[16]; /* more padding for future expansion */ + __uint32_t di_cowextsize; /* basic cow extent size for file */ + __uint8_t di_pad2[12]; /* more padding for future expansion */ /* fields only written to during inode creation */ xfs_ictimestamp_t di_crtime; /* time created */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 2ca62d1..62217e7 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -502,8 +502,13 @@ xfs_getbmap( if (ip->i_cformat != XFS_DINODE_FMT_EXTENTS) return -EINVAL; - prealloced = 0; - fixlen = XFS_ISIZE(ip); + if (xfs_get_cowextsz_hint(ip)) { + prealloced = 1; + fixlen = mp->m_super->s_maxbytes; + } else { + prealloced = 0; + fixlen = XFS_ISIZE(ip); + } break; default: if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS && diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index d6ec1ec..26ce555 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -78,6 +78,27 @@ xfs_get_extsz_hint( } /* + * Helper function to extract CoW extent size hint from inode. + * Between the extent size hint and the CoW extent size hint, we + * return the greater of the two. + */ +xfs_extlen_t +xfs_get_cowextsz_hint( + struct xfs_inode *ip) +{ + xfs_extlen_t a, b; + + a = 0; + if (ip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE) + a = ip->i_d.di_cowextsize; + b = xfs_get_extsz_hint(ip); + + if (a > b) + return a; + return b; +} + +/* * These two are wrapper routines around the xfs_ilock() routine used to * centralize some grungy code. They are used in places that wish to lock the * inode solely for reading the extents. The reason these places can't just @@ -654,6 +675,8 @@ _xfs_dic2xflags( flags |= FS_XFLAG_DAX; if (di_flags2 & XFS_DIFLAG2_REFLINK) flags |= FS_XFLAG_REFLINK; + if (di_flags2 & XFS_DIFLAG2_COWEXTSIZE) + flags |= FS_XFLAG_COWEXTSIZE; } if (has_attr) @@ -837,6 +860,7 @@ xfs_ialloc( if (ip->i_d.di_version == 3) { inode->i_version = 1; ip->i_d.di_flags2 = 0; + ip->i_d.di_cowextsize = 0; ip->i_d.di_crtime.t_sec = (__int32_t)tv.tv_sec; ip->i_d.di_crtime.t_nsec = (__int32_t)tv.tv_nsec; } @@ -899,6 +923,15 @@ xfs_ialloc( ip->i_d.di_flags |= di_flags; ip->i_d.di_flags2 |= di_flags2; } + if (pip && + (pip->i_d.di_flags2 & XFS_DIFLAG2_ANY) && + pip->i_d.di_version == 3 && + ip->i_d.di_version == 3) { + if (pip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE) { + ip->i_d.di_flags2 |= XFS_DIFLAG2_COWEXTSIZE; + ip->i_d.di_cowextsize = pip->i_d.di_cowextsize; + } + } /* FALLTHROUGH */ case S_IFLNK: ip->i_d.di_format = XFS_DINODE_FMT_EXTENTS; diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 7b2e858..73fc4ff 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -425,6 +425,7 @@ int xfs_iflush(struct xfs_inode *, struct xfs_buf **); void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip); +xfs_extlen_t xfs_get_cowextsz_hint(struct xfs_inode *ip); int xfs_dir_ialloc(struct xfs_trans **, struct xfs_inode *, umode_t, xfs_nlink_t, xfs_dev_t, prid_t, int, diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 892c2ac..9610e9c 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -368,7 +368,7 @@ xfs_inode_to_log_dinode( to->di_crtime.t_sec = from->di_crtime.t_sec; to->di_crtime.t_nsec = from->di_crtime.t_nsec; to->di_flags2 = from->di_flags2; - + to->di_cowextsize = from->di_cowextsize; to->di_ino = ip->i_ino; to->di_lsn = lsn; memset(to->di_pad2, 0, sizeof(to->di_pad2)); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 97bb5b6..4d4531ee 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -904,6 +904,8 @@ xfs_ioc_fsgetxattr( xfs_ilock(ip, XFS_ILOCK_SHARED); fa.fsx_xflags = xfs_ip2xflags(ip); fa.fsx_extsize = ip->i_d.di_extsize << ip->i_mount->m_sb.sb_blocklog; + fa.fsx_cowextsize = ip->i_d.di_cowextsize << + ip->i_mount->m_sb.sb_blocklog; fa.fsx_projid = xfs_get_projid(ip); if (attr) { @@ -974,12 +976,13 @@ xfs_set_diflags( if (ip->i_d.di_version < 3) return; - di_flags2 = 0; + di_flags2 = (ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK); if (xflags & FS_XFLAG_DAX) di_flags2 |= XFS_DIFLAG2_DAX; + if (xflags & FS_XFLAG_COWEXTSIZE) + di_flags2 |= XFS_DIFLAG2_COWEXTSIZE; ip->i_d.di_flags2 = di_flags2; - } STATIC void @@ -1220,6 +1223,56 @@ xfs_ioctl_setattr_check_extsize( return 0; } +/* + * CoW extent size hint validation rules are: + * + * 1. CoW extent size hint can only be set if reflink is enabled on the fs. + * The inode does not have to have any shared blocks, but it must be a v3. + * 2. FS_XFLAG_COWEXTSIZE is only valid for directories and regular files; + * for a directory, the hint is propagated to new files. + * 3. Can be changed on files & directories at any time. + * 4. CoW extsize hint of 0 turns off hints, clears inode flags. + * 5. Extent size must be a multiple of the appropriate block size. + * 6. The extent size hint must be limited to half the AG size to avoid + * alignment extending the extent beyond the limits of the AG. + */ +static int +xfs_ioctl_setattr_check_cowextsize( + struct xfs_inode *ip, + struct fsxattr *fa) +{ + struct xfs_mount *mp = ip->i_mount; + + if (!(fa->fsx_xflags & FS_XFLAG_COWEXTSIZE)) + return 0; + + if (!xfs_sb_version_hasreflink(&ip->i_mount->m_sb) || + ip->i_d.di_version != 3) + return -EINVAL; + + if (!S_ISREG(VFS_I(ip)->i_mode) && !S_ISDIR(VFS_I(ip)->i_mode)) + return -EINVAL; + + if (fa->fsx_cowextsize != 0) { + xfs_extlen_t size; + xfs_fsblock_t cowextsize_fsb; + + cowextsize_fsb = XFS_B_TO_FSB(mp, fa->fsx_cowextsize); + if (cowextsize_fsb > MAXEXTLEN) + return -EINVAL; + + size = mp->m_sb.sb_blocksize; + if (cowextsize_fsb > mp->m_sb.sb_agblocks / 2) + return -EINVAL; + + if (fa->fsx_cowextsize % size) + return -EINVAL; + } else + fa->fsx_xflags &= ~FS_XFLAG_COWEXTSIZE; + + return 0; +} + static int xfs_ioctl_setattr_check_projid( struct xfs_inode *ip, @@ -1316,6 +1369,10 @@ xfs_ioctl_setattr( if (code) goto error_trans_cancel; + code = xfs_ioctl_setattr_check_cowextsize(ip, fa); + if (code) + goto error_trans_cancel; + code = xfs_ioctl_setattr_xflags(tp, ip, fa); if (code) goto error_trans_cancel; @@ -1351,6 +1408,12 @@ xfs_ioctl_setattr( ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog; else ip->i_d.di_extsize = 0; + if (ip->i_d.di_version == 3 && + (ip->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE)) + ip->i_d.di_cowextsize = fa->fsx_cowextsize >> + mp->m_sb.sb_blocklog; + else + ip->i_d.di_cowextsize = 0; code = xfs_trans_commit(tp); diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 130010a..666bafc 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -591,7 +591,10 @@ __xfs_iomap_write_delay( if (error) return error; - extsz = xfs_get_extsz_hint(ip); + if (whichfork == XFS_COW_FORK) + extsz = xfs_get_cowextsz_hint(ip); + else + extsz = xfs_get_extsz_hint(ip); offset_fsb = XFS_B_TO_FSBT(mp, offset); if (whichfork == XFS_DATA_FORK) { diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index ce73eb3..66e8817 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -66,7 +66,7 @@ xfs_bulkstat_one_int( if (!buffer || xfs_internal_inum(mp, ino)) return -EINVAL; - buf = kmem_alloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); + buf = kmem_zalloc(sizeof(*buf), KM_SLEEP | KM_MAYFAIL); if (!buf) return -ENOMEM; @@ -111,6 +111,12 @@ xfs_bulkstat_one_int( buf->bs_aextents = dic->di_anextents; buf->bs_forkoff = XFS_IFORK_BOFF(ip); + if (dic->di_version == 3) { + if (dic->di_flags2 & XFS_DIFLAG2_COWEXTSIZE) + buf->bs_cowextsize = dic->di_cowextsize << + mp->m_sb.sb_blocklog; + } + switch (dic->di_format) { case XFS_DINODE_FMT_DEV: buf->bs_rdev = ip->i_df.if_u2.if_rdev; diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 368cc17..2caed8c 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -1049,18 +1049,19 @@ out_error: } /* - * Update destination inode size, if necessary. + * Update destination inode size & cowextsize hint, if necessary. */ STATIC int xfs_reflink_update_dest( struct xfs_inode *dest, - xfs_off_t newlen) + xfs_off_t newlen, + xfs_extlen_t cowextsize) { struct xfs_mount *mp = dest->i_mount; struct xfs_trans *tp; int error; - if (newlen <= i_size_read(VFS_I(dest))) + if (newlen <= i_size_read(VFS_I(dest)) && cowextsize == 0) return 0; error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); @@ -1070,9 +1071,17 @@ xfs_reflink_update_dest( xfs_ilock(dest, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, dest, XFS_ILOCK_EXCL); - trace_xfs_reflink_update_inode_size(dest, newlen); - i_size_write(VFS_I(dest), newlen); - dest->i_d.di_size = newlen; + if (newlen > i_size_read(VFS_I(dest))) { + trace_xfs_reflink_update_inode_size(dest, newlen); + i_size_write(VFS_I(dest), newlen); + dest->i_d.di_size = newlen; + } + + if (cowextsize) { + dest->i_d.di_cowextsize = cowextsize; + dest->i_d.di_flags2 |= XFS_DIFLAG2_COWEXTSIZE; + } + xfs_trans_log_inode(tp, dest, XFS_ILOG_CORE); error = xfs_trans_commit(tp); @@ -1389,6 +1398,7 @@ xfs_reflink_remap_range( xfs_fileoff_t sfsbno, dfsbno; xfs_filblks_t fsblen; int error; + xfs_extlen_t cowextsize; bool is_same; if (!xfs_sb_version_hasreflink(&mp->m_sb)) @@ -1449,7 +1459,19 @@ xfs_reflink_remap_range( if (error) goto out_error; - error = xfs_reflink_update_dest(dest, destoff + len); + /* + * Carry the cowextsize hint from src to dest if we're sharing the + * entire source file to the entire destination file, the source file + * has a cowextsize hint, and the destination file does not. + */ + cowextsize = 0; + if (srcoff == 0 && len == i_size_read(VFS_I(src)) && + (src->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE) && + destoff == 0 && len >= i_size_read(VFS_I(dest)) && + !(dest->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE)) + cowextsize = src->i_d.di_cowextsize; + + error = xfs_reflink_update_dest(dest, destoff + len, cowextsize); if (error) goto out_error; From darrick.wong@oracle.com Thu Aug 25 18:37:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E9FBD7DDA for ; Thu, 25 Aug 2016 18:37:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A0110304039 for ; Thu, 25 Aug 2016 16:37:57 -0700 (PDT) X-ASG-Debug-ID: 1472168274-0bf8155c751e6e90001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 9r4qoTCcElJC2pDH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:55 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbpM8021513 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:37:51 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbp8L008599 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:37:51 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbo7p029049; Thu, 25 Aug 2016 23:37:50 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:50 -0700 Subject: [PATCH 54/71] xfs: preallocate blocks for worst-case btree expansion From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 54/71] xfs: preallocate blocks for worst-case btree expansion To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:49 -0700 Message-ID: <147216826896.867.9556738728686244638.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168275 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12918 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines To gracefully handle the situation where a CoW operation turns a single refcount extent into a lot of tiny ones and then run out of space when a tree split has to happen, use the per-AG reserved block pool to pre-allocate all the space we'll ever need for a maximal btree. For a 4K block size, this only costs an overhead of 0.3% of available disk space. When reflink is enabled, we have an unfortunate problem with rmap -- since we can share a block billions of times, this means that the reverse mapping btree can expand basically infinitely. When an AG is so full that there are no free blocks with which to expand the rmapbt, the filesystem will shut down hard. This is rather annoying to the user, so use the AG reservation code to reserve a "reasonable" amount of space for rmap. We'll prevent reflinks and CoW operations if we think we're getting close to exhausting an AG's free space rather than shutting down, but this permanent reservation should be enough for "most" users. Hopefully. v2: Simplify the return value from xfs_perag_pool_free_block to a bool so that we can easily call xfs_trans_binval for both the per-AG pool and the real freeing case. Without this we fail to invalidate the btree buffer and will trip over the write verifier on a shrinking refcount btree. v3: Convert to the new per-AG reservation code. v4: Combine this patch with the one that adds the rmapbt reservation, since the rmapbt reservation is only needed for reflink filesystems. v5: If we detect errors while counting the refcount or rmap btrees, shut down the filesystem to avoid the scenario where the fs shuts down mid-transaction due to btree corruption, repair refuses to run until the log is clean, and the log cannot be cleaned because replay hits btree corruption and shuts down. Signed-off-by: Darrick J. Wong [hch@lst.de: ensure that we invalidate the freed btree buffer] Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_ag_resv.c | 11 +++++++ fs/xfs/libxfs/xfs_refcount_btree.c | 45 +++++++++++++++++++++++++-- fs/xfs/libxfs/xfs_refcount_btree.h | 3 ++ fs/xfs/libxfs/xfs_rmap_btree.c | 60 ++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap_btree.h | 7 ++++ fs/xfs/xfs_fsops.c | 55 +++++++++++++++++++++++++++++++++ fs/xfs/xfs_fsops.h | 3 ++ fs/xfs/xfs_mount.c | 4 ++ fs/xfs/xfs_super.c | 5 +++ 9 files changed, 190 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c index 874c437..adddae4 100644 --- a/fs/xfs/libxfs/xfs_ag_resv.c +++ b/fs/xfs/libxfs/xfs_ag_resv.c @@ -38,6 +38,7 @@ #include "xfs_trans_space.h" #include "xfs_rmap_btree.h" #include "xfs_btree.h" +#include "xfs_refcount_btree.h" /* * Per-AG Block Reservations @@ -230,6 +231,11 @@ xfs_ag_resv_init( /* Create the metadata reservation. */ ask = used = 0; + err2 = xfs_refcountbt_calc_reserves(pag->pag_mount, pag->pag_agno, + &ask, &used); + if (err2 && !error) + error = err2; + err2 = __xfs_ag_resv_init(pag, XFS_AG_RESV_METADATA, ask, used); if (err2 && !error) error = err2; @@ -241,6 +247,11 @@ init_agfl: /* Create the AGFL metadata reservation */ ask = used = 0; + err2 = xfs_rmapbt_calc_reserves(pag->pag_mount, pag->pag_agno, + &ask, &used); + if (err2 && !error) + error = err2; + err2 = __xfs_ag_resv_init(pag, XFS_AG_RESV_AGFL, ask, used); if (err2 && !error) error = err2; diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c index c9d4823..fa8dfd6 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.c +++ b/fs/xfs/libxfs/xfs_refcount_btree.c @@ -79,6 +79,8 @@ xfs_refcountbt_alloc_block( struct xfs_alloc_arg args; /* block allocation args */ int error; /* error return value */ + XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); + memset(&args, 0, sizeof(args)); args.tp = cur->bc_tp; args.mp = cur->bc_mp; @@ -88,6 +90,7 @@ xfs_refcountbt_alloc_block( args.firstblock = args.fsbno; xfs_rmap_ag_owner(&args.oinfo, XFS_RMAP_OWN_REFC); args.minlen = args.maxlen = args.prod = 1; + args.resv = XFS_AG_RESV_METADATA; error = xfs_alloc_vextent(&args); if (error) @@ -125,16 +128,19 @@ xfs_refcountbt_free_block( struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); struct xfs_owner_info oinfo; + int error; trace_xfs_refcountbt_free_block(cur->bc_mp, cur->bc_private.a.agno, XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1); xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_REFC); be32_add_cpu(&agf->agf_refcount_blocks, -1); xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); - xfs_bmap_add_free(mp, cur->bc_private.a.dfops, fsbno, 1, - &oinfo); + error = xfs_free_extent(cur->bc_tp, fsbno, 1, &oinfo, + XFS_AG_RESV_METADATA); + if (error) + return error; - return 0; + return error; } STATIC int @@ -404,3 +410,36 @@ xfs_refcountbt_max_size( return xfs_refcountbt_calc_size(mp, mp->m_sb.sb_agblocks); } + +/* + * Figure out how many blocks to reserve and how many are used by this btree. + */ +int +xfs_refcountbt_calc_reserves( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_extlen_t *ask, + xfs_extlen_t *used) +{ + struct xfs_buf *agbp; + struct xfs_agf *agf; + xfs_extlen_t tree_len; + int error; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + *ask += xfs_refcountbt_max_size(mp); + + error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + if (error) + return error; + + agf = XFS_BUF_TO_AGF(agbp); + tree_len = be32_to_cpu(agf->agf_refcount_blocks); + xfs_buf_relse(agbp); + + *used += tree_len; + + return error; +} diff --git a/fs/xfs/libxfs/xfs_refcount_btree.h b/fs/xfs/libxfs/xfs_refcount_btree.h index 780b02f..3be7768 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.h +++ b/fs/xfs/libxfs/xfs_refcount_btree.h @@ -68,4 +68,7 @@ extern xfs_extlen_t xfs_refcountbt_calc_size(struct xfs_mount *mp, unsigned long long len); extern xfs_extlen_t xfs_refcountbt_max_size(struct xfs_mount *mp); +extern int xfs_refcountbt_calc_reserves(struct xfs_mount *mp, + xfs_agnumber_t agno, xfs_extlen_t *ask, xfs_extlen_t *used); + #endif /* __XFS_REFCOUNT_BTREE_H__ */ diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c index 7834956..385c2ac 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.c +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -35,6 +35,7 @@ #include "xfs_cksum.h" #include "xfs_error.h" #include "xfs_extent_busy.h" +#include "xfs_ag_resv.h" /* * Reverse map btree. @@ -518,3 +519,62 @@ xfs_rmapbt_compute_maxlevels( mp->m_rmap_maxlevels = xfs_btree_compute_maxlevels(mp, mp->m_rmap_mnr, mp->m_sb.sb_agblocks); } + +/* Calculate the refcount btree size for some records. */ +xfs_extlen_t +xfs_rmapbt_calc_size( + struct xfs_mount *mp, + unsigned long long len) +{ + return xfs_btree_calc_size(mp, mp->m_rmap_mnr, len); +} + +/* + * Calculate the maximum refcount btree size. + */ +xfs_extlen_t +xfs_rmapbt_max_size( + struct xfs_mount *mp) +{ + /* Bail out if we're uninitialized, which can happen in mkfs. */ + if (mp->m_rmap_mxr[0] == 0) + return 0; + + return xfs_rmapbt_calc_size(mp, mp->m_sb.sb_agblocks); +} + +/* + * Figure out how many blocks to reserve and how many are used by this btree. + */ +int +xfs_rmapbt_calc_reserves( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_extlen_t *ask, + xfs_extlen_t *used) +{ + struct xfs_buf *agbp; + struct xfs_agf *agf; + xfs_extlen_t pool_len; + xfs_extlen_t tree_len; + int error; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return 0; + + /* Reserve 1% of the AG or enough for 1 block per record. */ + pool_len = max(mp->m_sb.sb_agblocks / 100, xfs_rmapbt_max_size(mp)); + *ask += pool_len; + + error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + if (error) + return error; + + agf = XFS_BUF_TO_AGF(agbp); + tree_len = be32_to_cpu(agf->agf_rmap_blocks); + xfs_buf_relse(agbp); + + *used += tree_len; + + return error; +} diff --git a/fs/xfs/libxfs/xfs_rmap_btree.h b/fs/xfs/libxfs/xfs_rmap_btree.h index e73a553..2a9ac47 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.h +++ b/fs/xfs/libxfs/xfs_rmap_btree.h @@ -58,4 +58,11 @@ struct xfs_btree_cur *xfs_rmapbt_init_cursor(struct xfs_mount *mp, int xfs_rmapbt_maxrecs(struct xfs_mount *mp, int blocklen, int leaf); extern void xfs_rmapbt_compute_maxlevels(struct xfs_mount *mp); +extern xfs_extlen_t xfs_rmapbt_calc_size(struct xfs_mount *mp, + unsigned long long len); +extern xfs_extlen_t xfs_rmapbt_max_size(struct xfs_mount *mp); + +extern int xfs_rmapbt_calc_reserves(struct xfs_mount *mp, + xfs_agnumber_t agno, xfs_extlen_t *ask, xfs_extlen_t *used); + #endif /* __XFS_RMAP_BTREE_H__ */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 3acbf4e0..9880eeb 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -43,6 +43,7 @@ #include "xfs_log.h" #include "xfs_filestream.h" #include "xfs_rmap.h" +#include "xfs_ag_resv.h" /* * File system operations @@ -680,6 +681,9 @@ xfs_growfs_data_private( continue; } } + + xfs_fs_reserve_ag_blocks(mp); + return saved_error ? saved_error : error; error0: @@ -989,3 +993,54 @@ xfs_do_force_shutdown( "Please umount the filesystem and rectify the problem(s)"); } } + +/* + * Reserve free space for per-AG metadata. + */ +void +xfs_fs_reserve_ag_blocks( + struct xfs_mount *mp) +{ + xfs_agnumber_t agno; + struct xfs_perag *pag; + int error = 0; + int err2; + + for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { + pag = xfs_perag_get(mp, agno); + err2 = xfs_ag_resv_init(pag); + xfs_perag_put(pag); + if (err2 && !error) + error = err2; + } + + if (error) { + xfs_warn(mp, "Error %d reserving metadata blocks.", error); + xfs_force_shutdown(mp, (error == -EFSCORRUPTED) ? + SHUTDOWN_CORRUPT_INCORE : SHUTDOWN_META_IO_ERROR); + } +} + +/* + * Free space reserved for per-AG metadata. + */ +void +xfs_fs_unreserve_ag_blocks( + struct xfs_mount *mp) +{ + xfs_agnumber_t agno; + struct xfs_perag *pag; + int error = 0; + int err2; + + for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { + pag = xfs_perag_get(mp, agno); + err2 = xfs_ag_resv_free(pag); + xfs_perag_put(pag); + if (err2 && !error) + error = err2; + } + + if (error) + xfs_warn(mp, "Error %d unreserving metadata blocks.", error); +} diff --git a/fs/xfs/xfs_fsops.h b/fs/xfs/xfs_fsops.h index f32713f..71e32480 100644 --- a/fs/xfs/xfs_fsops.h +++ b/fs/xfs/xfs_fsops.h @@ -26,4 +26,7 @@ extern int xfs_reserve_blocks(xfs_mount_t *mp, __uint64_t *inval, xfs_fsop_resblks_t *outval); extern int xfs_fs_goingdown(xfs_mount_t *mp, __uint32_t inflags); +extern void xfs_fs_reserve_ag_blocks(struct xfs_mount *mp); +extern void xfs_fs_unreserve_ag_blocks(struct xfs_mount *mp); + #endif /* __XFS_FSOPS_H__ */ diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 0093616..d64e5b9 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -45,6 +45,7 @@ #include "xfs_rmap_btree.h" #include "xfs_refcount_btree.h" #include "xfs_reflink.h" +#include "xfs_refcount_btree.h" static DEFINE_MUTEX(xfs_uuid_table_mutex); @@ -964,6 +965,8 @@ xfs_mountfs( xfs_warn(mp, "Unable to allocate reserve blocks. Continuing without reserve pool."); + xfs_fs_reserve_ag_blocks(mp); + /* Recover any CoW blocks that never got remapped. */ error = xfs_reflink_recover_cow(mp); if (error && !XFS_FORCED_SHUTDOWN(mp)) { @@ -1017,6 +1020,7 @@ xfs_unmountfs( cancel_delayed_work_sync(&mp->m_eofblocks_work); + xfs_fs_unreserve_ag_blocks(mp); xfs_qm_unmount_quotas(mp); xfs_rtunmount_inodes(mp); IRELE(mp->m_rootip); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index c580926..a980fef 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -50,6 +50,7 @@ #include "xfs_refcount_item.h" #include "xfs_bmap_item.h" #include "xfs_reflink.h" +#include "xfs_refcount_btree.h" #include #include @@ -1306,6 +1307,7 @@ xfs_fs_remount( xfs_restore_resvblks(mp); xfs_log_work_queue(mp); xfs_queue_eofblocks(mp); + xfs_fs_reserve_ag_blocks(mp); /* Recover any CoW blocks that never got remapped. */ error = xfs_reflink_recover_cow(mp); @@ -1325,6 +1327,9 @@ xfs_fs_remount( * reserve pool size so that if we get remounted rw, we can * return it to the same size. */ + + xfs_fs_unreserve_ag_blocks(mp); + xfs_save_resvblks(mp); /* From darrick.wong@oracle.com Thu Aug 25 18:38:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 89AC27E55 for ; Thu, 25 Aug 2016 18:38:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 52E058F8035 for ; Thu, 25 Aug 2016 16:38:01 -0700 (PDT) X-ASG-Debug-ID: 1472168279-0bf57c55b21c7990001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id fvx9MAI2wN9QPtdE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:37:59 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNbw3l014803 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:58 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNbv6N021191 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:37:57 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNbuDP018055; Thu, 25 Aug 2016 23:37:57 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:37:56 -0700 Subject: [PATCH 55/71] xfs: don't allow reflink when the AG is low on space From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 55/71] xfs: don't allow reflink when the AG is low on space To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:37:55 -0700 Message-ID: <147216827534.867.13543187691263026433.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168279 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2088 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the AG free space is down to the reserves, refuse to reflink our way out of space. Hopefully userspace will make a real copy and/or go elsewhere. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_reflink.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 2caed8c..68cd467 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -53,6 +53,8 @@ #include "xfs_reflink.h" #include "xfs_iomap.h" #include "xfs_rmap_btree.h" +#include "xfs_sb.h" +#include "xfs_ag_resv.h" /* * Copy on Write of Shared Blocks @@ -1095,6 +1097,30 @@ out_error: } /* + * Do we have enough reserve in this AG to handle a reflink? The refcount + * btree already reserved all the space it needs, but the rmap btree can grow + * infinitely, so we won't allow more reflinks when the AG is down to the + * btree reserves. + */ +static int +xfs_reflink_ag_has_free_space( + struct xfs_mount *mp, + xfs_agnumber_t agno) +{ + struct xfs_perag *pag; + int error = 0; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return 0; + + pag = xfs_perag_get(mp, agno); + if (xfs_ag_resv_critical(pag, XFS_AG_RESV_AGFL)) + error = -ENOSPC; + xfs_perag_put(pag); + return error; +} + +/* * Unmap a range of blocks from a file, then map other blocks into the hole. * The range to unmap is (destoff : destoff + srcioff + irec->br_blockcount). * The extent irec is mapped into dest at irec->br_startoff. @@ -1126,6 +1152,14 @@ xfs_reflink_remap_extent( irec->br_startblock != DELAYSTARTBLOCK && !ISUNWRITTEN(irec)); + /* No reflinking if we're low on space */ + if (real_extent) { + error = xfs_reflink_ag_has_free_space(mp, + XFS_FSB_TO_AGNO(mp, irec->br_startblock)); + if (error) + goto out; + } + /* Start a rolling transaction to switch the mappings */ resblks = XFS_EXTENTADD_SPACE_RES(ip->i_mount, XFS_DATA_FORK); error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, 0, 0, &tp); From darrick.wong@oracle.com Thu Aug 25 18:38:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0EA5F7E56 for ; Thu, 25 Aug 2016 18:38:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C5E6E8F8035 for ; Thu, 25 Aug 2016 16:38:07 -0700 (PDT) X-ASG-Debug-ID: 1472168285-0bf57b53122094b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id wkFx8ysKmYirlLtC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:05 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNc4Rc015075 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:04 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNc3ub021709 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:04 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNc3I9029189; Thu, 25 Aug 2016 23:38:03 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:02 -0700 Subject: [PATCH 56/71] xfs: try other AGs to allocate a BMBT block From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 56/71] xfs: try other AGs to allocate a BMBT block To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:01 -0700 Message-ID: <147216828153.867.17281582386743529738.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168285 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4665 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Prior to the introduction of reflink, allocating a block and mapping it into a file was performed in a single transaction with a single block reservation, and the allocator was supposed to find enough blocks to allocate the extent and any BMBT blocks that might be necessary (unless we're low on space). However, due to the way copy on write works, allocation and mapping have been split into two transactions, which means that we must be able to handle the case where we allocate an extent for CoW but that AG runs out of free space before the blocks can be mapped into a file, and the mapping requires a new BMBT block. When this happens, look in one of the other AGs for a BMBT block instead of taking the FS down. The same applies to the functions that convert a data fork to extents and later btree format. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 30 ++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_bmap_btree.c | 17 +++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 76b3a0f..9ae4a3a 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -753,6 +753,7 @@ xfs_bmap_extents_to_btree( args.type = XFS_ALLOCTYPE_START_BNO; args.fsbno = XFS_INO_TO_FSB(mp, ip->i_ino); } else if (dfops->dop_low) { +try_another_ag: args.type = XFS_ALLOCTYPE_START_BNO; args.fsbno = *firstblock; } else { @@ -767,6 +768,21 @@ xfs_bmap_extents_to_btree( xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } + + /* + * During a CoW operation, the allocation and bmbt updates occur in + * different transactions. The mapping code tries to put new bmbt + * blocks near extents being mapped, but the only way to guarantee this + * is if the alloc and the mapping happen in a single transaction that + * has a block reservation. That isn't the case here, so if we run out + * of space we'll try again with another AG. + */ + if (xfs_sb_version_hasreflink(&cur->bc_mp->m_sb) && + args.fsbno == NULLFSBLOCK && + args.type == XFS_ALLOCTYPE_NEAR_BNO) { + dfops->dop_low = true; + goto try_another_ag; + } /* * Allocation can't fail, the space was reserved. */ @@ -902,6 +918,7 @@ xfs_bmap_local_to_extents( * file currently fits in an inode. */ if (*firstblock == NULLFSBLOCK) { +try_another_ag: args.fsbno = XFS_INO_TO_FSB(args.mp, ip->i_ino); args.type = XFS_ALLOCTYPE_START_BNO; } else { @@ -914,6 +931,19 @@ xfs_bmap_local_to_extents( if (error) goto done; + /* + * During a CoW operation, the allocation and bmbt updates occur in + * different transactions. The mapping code tries to put new bmbt + * blocks near extents being mapped, but the only way to guarantee this + * is if the alloc and the mapping happen in a single transaction that + * has a block reservation. That isn't the case here, so if we run out + * of space we'll try again with another AG. + */ + if (xfs_sb_version_hasreflink(&ip->i_mount->m_sb) && + args.fsbno == NULLFSBLOCK && + args.type == XFS_ALLOCTYPE_NEAR_BNO) { + goto try_another_ag; + } /* Can't fail, the space was reserved. */ ASSERT(args.fsbno != NULLFSBLOCK); ASSERT(args.len == 1); diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index 37f0d9d..8007d2b 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -453,6 +453,7 @@ xfs_bmbt_alloc_block( if (args.fsbno == NULLFSBLOCK) { args.fsbno = be64_to_cpu(start->l); +try_another_ag: args.type = XFS_ALLOCTYPE_START_BNO; /* * Make sure there is sufficient room left in the AG to @@ -482,6 +483,22 @@ xfs_bmbt_alloc_block( if (error) goto error0; + /* + * During a CoW operation, the allocation and bmbt updates occur in + * different transactions. The mapping code tries to put new bmbt + * blocks near extents being mapped, but the only way to guarantee this + * is if the alloc and the mapping happen in a single transaction that + * has a block reservation. That isn't the case here, so if we run out + * of space we'll try again with another AG. + */ + if (xfs_sb_version_hasreflink(&cur->bc_mp->m_sb) && + args.fsbno == NULLFSBLOCK && + args.type == XFS_ALLOCTYPE_NEAR_BNO) { + cur->bc_private.b.dfops->dop_low = true; + args.fsbno = cur->bc_private.b.firstblock; + goto try_another_ag; + } + if (args.fsbno == NULLFSBLOCK && args.minleft) { /* * Could not find an AG with enough free space to satisfy From darrick.wong@oracle.com Thu Aug 25 18:38:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 114EC7DDA for ; Thu, 25 Aug 2016 18:38:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BCFF78F8035 for ; Thu, 25 Aug 2016 16:38:15 -0700 (PDT) X-ASG-Debug-ID: 1472168293-0bf8155c751e6f30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id E3K8Z1qqu3LeKAkv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:14 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNcCSu015174 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:38:12 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNcBQf021270 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:12 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNc9qk015388; Thu, 25 Aug 2016 23:38:11 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:09 -0700 Subject: [PATCH 57/71] xfs: promote buffered writes to CoW when cowextsz is set From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 57/71] xfs: promote buffered writes to CoW when cowextsz is set To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:07 -0700 Message-ID: <147216828776.867.12361135037176012283.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168293 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2321 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're doing non-cow writes to a part of a file that already has a CoW reservation by virtue of cowextsz being set, promote the write to copy-on-write so that the entire extent can get written out as a single block, thereby reducing post-CoW fragmentation. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_aops.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e8d573e..a85bc62 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -666,10 +666,12 @@ xfs_check_page_type( bh = head = page_buffers(page); do { if (buffer_unwritten(bh)) { - if (type == XFS_IO_UNWRITTEN) + if (type == XFS_IO_UNWRITTEN || + type == XFS_IO_COW) return true; } else if (buffer_delay(bh)) { - if (type == XFS_IO_DELALLOC) + if (type == XFS_IO_DELALLOC || + type == XFS_IO_COW) return true; } else if (buffer_dirty(bh) && buffer_mapped(bh)) { if (type == XFS_IO_OVERWRITE || @@ -834,25 +836,13 @@ xfs_writepage_map( continue; } - if (buffer_unwritten(bh)) { - if (wpc->io_type != XFS_IO_UNWRITTEN) { - wpc->io_type = XFS_IO_UNWRITTEN; - wpc->imap_valid = false; - } - } else if (buffer_delay(bh)) { - if (wpc->io_type != XFS_IO_DELALLOC) { - wpc->io_type = XFS_IO_DELALLOC; - wpc->imap_valid = false; - } - } else if (buffer_uptodate(bh)) { - new_type = xfs_is_cow_io(XFS_I(inode), offset) ? - XFS_IO_COW : XFS_IO_OVERWRITE; - - if (wpc->io_type != new_type) { - wpc->io_type = new_type; - wpc->imap_valid = false; - } - } else { + if (buffer_unwritten(bh)) + new_type = XFS_IO_UNWRITTEN; + else if (buffer_delay(bh)) + new_type = XFS_IO_DELALLOC; + else if (buffer_uptodate(bh)) + new_type = XFS_IO_OVERWRITE; + else { if (PageUptodate(page)) ASSERT(buffer_mapped(bh)); /* @@ -865,6 +855,13 @@ xfs_writepage_map( continue; } + if (xfs_is_cow_io(XFS_I(inode), offset)) + new_type = XFS_IO_COW; + if (wpc->io_type != new_type) { + wpc->io_type = new_type; + wpc->imap_valid = false; + } + if (wpc->imap_valid) wpc->imap_valid = xfs_imap_valid(inode, &wpc->imap, offset); From darrick.wong@oracle.com Thu Aug 25 18:38:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A89087E55 for ; Thu, 25 Aug 2016 18:38:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A74D8F8033 for ; Thu, 25 Aug 2016 16:38:20 -0700 (PDT) X-ASG-Debug-ID: 1472168297-0bf57c55b11c79b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id iCUXcTAYb2DKMiFJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:17 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNcGj4015216 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:16 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNcFOi022296 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:16 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNcFvf029233; Thu, 25 Aug 2016 23:38:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:15 -0700 Subject: [PATCH 58/71] xfs: garbage collect old cowextsz reservations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 58/71] xfs: garbage collect old cowextsz reservations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:14 -0700 Message-ID: <147216829394.867.16281333542262043955.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168297 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 19633 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Trim CoW reservations made on behalf of a cowextsz hint if they get too old or we run low on quota, so long as we don't have dirty data awaiting writeback or directio operations in progress. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_bmap_util.c | 2 fs/xfs/xfs_file.c | 3 + fs/xfs/xfs_globals.c | 5 + fs/xfs/xfs_icache.c | 238 ++++++++++++++++++++++++++++++++++++++++++------ fs/xfs/xfs_icache.h | 7 + fs/xfs/xfs_inode.c | 4 + fs/xfs/xfs_iomap.c | 2 fs/xfs/xfs_linux.h | 1 fs/xfs/xfs_mount.c | 1 fs/xfs/xfs_mount.h | 2 fs/xfs/xfs_reflink.c | 35 +++++++ fs/xfs/xfs_reflink.h | 2 fs/xfs/xfs_super.c | 1 fs/xfs/xfs_sysctl.c | 9 ++ fs/xfs/xfs_sysctl.h | 1 fs/xfs/xfs_trace.h | 5 + 16 files changed, 286 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 62217e7..584e2ad 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1869,6 +1869,8 @@ xfs_swap_extents( cowfp = ip->i_cowfp; ip->i_cowfp = tip->i_cowfp; tip->i_cowfp = cowfp; + xfs_inode_set_cowblocks_tag(ip); + xfs_inode_set_cowblocks_tag(tip); } xfs_trans_log_inode(tp, ip, src_log_flags); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 28d03c3..68365ee 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -839,6 +839,9 @@ write_retry: enospc = xfs_inode_free_quota_eofblocks(ip); if (enospc) goto write_retry; + enospc = xfs_inode_free_quota_cowblocks(ip); + if (enospc) + goto write_retry; } else if (ret == -ENOSPC && !enospc) { struct xfs_eofblocks eofb = {0}; diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c index 4d41b24..f3f6aa9 100644 --- a/fs/xfs/xfs_globals.c +++ b/fs/xfs/xfs_globals.c @@ -21,8 +21,8 @@ /* * Tunable XFS parameters. xfs_params is required even when CONFIG_SYSCTL=n, * other XFS code uses these values. Times are measured in centisecs (i.e. - * 100ths of a second) with the exception of eofb_timer, which is measured in - * seconds. + * 100ths of a second) with the exception of eofb_timer and cowb_timer, which + * are measured in seconds. */ xfs_param_t xfs_params = { /* MIN DFLT MAX */ @@ -42,6 +42,7 @@ xfs_param_t xfs_params = { .inherit_nodfrg = { 0, 1, 1 }, .fstrm_timer = { 1, 30*100, 3600*100}, .eofb_timer = { 1, 300, 3600*24}, + .cowb_timer = { 1, 300, 3600*24}, }; struct xfs_globals xfs_globals = { diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index b5ccd20..cfca825 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -33,6 +33,7 @@ #include "xfs_bmap_util.h" #include "xfs_dquot_item.h" #include "xfs_dquot.h" +#include "xfs_reflink.h" #include #include @@ -792,6 +793,33 @@ xfs_eofblocks_worker( xfs_queue_eofblocks(mp); } +/* + * Background scanning to trim preallocated CoW space. This is queued + * based on the 'speculative_cow_prealloc_lifetime' tunable (5m by default). + * (We'll just piggyback on the post-EOF prealloc space workqueue.) + */ +STATIC void +xfs_queue_cowblocks( + struct xfs_mount *mp) +{ + rcu_read_lock(); + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_COWBLOCKS_TAG)) + queue_delayed_work(mp->m_eofblocks_workqueue, + &mp->m_cowblocks_work, + msecs_to_jiffies(xfs_cowb_secs * 1000)); + rcu_read_unlock(); +} + +void +xfs_cowblocks_worker( + struct work_struct *work) +{ + struct xfs_mount *mp = container_of(to_delayed_work(work), + struct xfs_mount, m_cowblocks_work); + xfs_icache_free_cowblocks(mp, NULL); + xfs_queue_cowblocks(mp); +} + int xfs_inode_ag_iterator( struct xfs_mount *mp, @@ -1348,18 +1376,30 @@ xfs_inode_free_eofblocks( return ret; } -int -xfs_icache_free_eofblocks( +static int +__xfs_icache_free_eofblocks( struct xfs_mount *mp, - struct xfs_eofblocks *eofb) + struct xfs_eofblocks *eofb, + int (*execute)(struct xfs_inode *ip, int flags, + void *args), + int tag) { int flags = SYNC_TRYLOCK; if (eofb && (eofb->eof_flags & XFS_EOF_FLAGS_SYNC)) flags = SYNC_WAIT; - return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, - eofb, XFS_ICI_EOFBLOCKS_TAG); + return xfs_inode_ag_iterator_tag(mp, execute, flags, + eofb, tag); +} + +int +xfs_icache_free_eofblocks( + struct xfs_mount *mp, + struct xfs_eofblocks *eofb) +{ + return __xfs_icache_free_eofblocks(mp, eofb, xfs_inode_free_eofblocks, + XFS_ICI_EOFBLOCKS_TAG); } /* @@ -1368,9 +1408,11 @@ xfs_icache_free_eofblocks( * failure. We make a best effort by including each quota under low free space * conditions (less than 1% free space) in the scan. */ -int -xfs_inode_free_quota_eofblocks( - struct xfs_inode *ip) +static int +__xfs_inode_free_quota_eofblocks( + struct xfs_inode *ip, + int (*execute)(struct xfs_mount *mp, + struct xfs_eofblocks *eofb)) { int scan = 0; struct xfs_eofblocks eofb = {0}; @@ -1406,14 +1448,25 @@ xfs_inode_free_quota_eofblocks( } if (scan) - xfs_icache_free_eofblocks(ip->i_mount, &eofb); + execute(ip->i_mount, &eofb); return scan; } -void -xfs_inode_set_eofblocks_tag( - xfs_inode_t *ip) +int +xfs_inode_free_quota_eofblocks( + struct xfs_inode *ip) +{ + return __xfs_inode_free_quota_eofblocks(ip, xfs_icache_free_eofblocks); +} + +static void +__xfs_inode_set_eofblocks_tag( + xfs_inode_t *ip, + void (*execute)(struct xfs_mount *mp), + void (*set_tp)(struct xfs_mount *mp, xfs_agnumber_t agno, + int error, unsigned long caller_ip), + int tag) { struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; @@ -1421,26 +1474,22 @@ xfs_inode_set_eofblocks_tag( pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); spin_lock(&pag->pag_ici_lock); - trace_xfs_inode_set_eofblocks_tag(ip); - tagged = radix_tree_tagged(&pag->pag_ici_root, - XFS_ICI_EOFBLOCKS_TAG); + tagged = radix_tree_tagged(&pag->pag_ici_root, tag); radix_tree_tag_set(&pag->pag_ici_root, - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), - XFS_ICI_EOFBLOCKS_TAG); + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), tag); if (!tagged) { /* propagate the eofblocks tag up into the perag radix tree */ spin_lock(&ip->i_mount->m_perag_lock); radix_tree_tag_set(&ip->i_mount->m_perag_tree, XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), - XFS_ICI_EOFBLOCKS_TAG); + tag); spin_unlock(&ip->i_mount->m_perag_lock); /* kick off background trimming */ - xfs_queue_eofblocks(ip->i_mount); + execute(ip->i_mount); - trace_xfs_perag_set_eofblocks(ip->i_mount, pag->pag_agno, - -1, _RET_IP_); + set_tp(ip->i_mount, pag->pag_agno, -1, _RET_IP_); } spin_unlock(&pag->pag_ici_lock); @@ -1448,31 +1497,162 @@ xfs_inode_set_eofblocks_tag( } void -xfs_inode_clear_eofblocks_tag( +xfs_inode_set_eofblocks_tag( xfs_inode_t *ip) { + trace_xfs_inode_set_eofblocks_tag(ip); + return __xfs_inode_set_eofblocks_tag(ip, xfs_queue_eofblocks, + trace_xfs_perag_set_eofblocks, + XFS_ICI_EOFBLOCKS_TAG); +} + +static void +__xfs_inode_clear_eofblocks_tag( + xfs_inode_t *ip, + void (*clear_tp)(struct xfs_mount *mp, xfs_agnumber_t agno, + int error, unsigned long caller_ip), + int tag) +{ struct xfs_mount *mp = ip->i_mount; struct xfs_perag *pag; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); spin_lock(&pag->pag_ici_lock); - trace_xfs_inode_clear_eofblocks_tag(ip); radix_tree_tag_clear(&pag->pag_ici_root, - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), - XFS_ICI_EOFBLOCKS_TAG); - if (!radix_tree_tagged(&pag->pag_ici_root, XFS_ICI_EOFBLOCKS_TAG)) { + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), tag); + if (!radix_tree_tagged(&pag->pag_ici_root, tag)) { /* clear the eofblocks tag from the perag radix tree */ spin_lock(&ip->i_mount->m_perag_lock); radix_tree_tag_clear(&ip->i_mount->m_perag_tree, XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), - XFS_ICI_EOFBLOCKS_TAG); + tag); spin_unlock(&ip->i_mount->m_perag_lock); - trace_xfs_perag_clear_eofblocks(ip->i_mount, pag->pag_agno, - -1, _RET_IP_); + clear_tp(ip->i_mount, pag->pag_agno, -1, _RET_IP_); } spin_unlock(&pag->pag_ici_lock); xfs_perag_put(pag); } +void +xfs_inode_clear_eofblocks_tag( + xfs_inode_t *ip) +{ + trace_xfs_inode_clear_eofblocks_tag(ip); + return __xfs_inode_clear_eofblocks_tag(ip, + trace_xfs_perag_clear_eofblocks, XFS_ICI_EOFBLOCKS_TAG); +} + +/* + * Automatic CoW Reservation Freeing + * + * These functions automatically garbage collect leftover CoW reservations + * that were made on behalf of a cowextsize hint when we start to run out + * of quota or when the reservations sit around for too long. If the file + * has dirty pages or is undergoing writeback, its CoW reservations will + * be retained. + * + * The actual garbage collection piggybacks off the same code that runs + * the speculative EOF preallocation garbage collector. + */ +STATIC int +xfs_inode_free_cowblocks( + struct xfs_inode *ip, + int flags, + void *args) +{ + int ret; + struct xfs_eofblocks *eofb = args; + bool need_iolock = true; + int match; + + ASSERT(!eofb || (eofb && eofb->eof_scan_owner != 0)); + + if (!xfs_reflink_has_real_cow_blocks(ip)) { + trace_xfs_inode_free_cowblocks_invalid(ip); + xfs_inode_clear_cowblocks_tag(ip); + return 0; + } + + /* + * If the mapping is dirty or under writeback we cannot touch the + * CoW fork. Leave it alone if we're in the midst of a directio. + */ + if (mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY) || + mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_WRITEBACK) || + atomic_read(&VFS_I(ip)->i_dio_count)) + return 0; + + if (eofb) { + if (eofb->eof_flags & XFS_EOF_FLAGS_UNION) + match = xfs_inode_match_id_union(ip, eofb); + else + match = xfs_inode_match_id(ip, eofb); + if (!match) + return 0; + + /* skip the inode if the file size is too small */ + if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE && + XFS_ISIZE(ip) < eofb->eof_min_file_size) + return 0; + + /* + * A scan owner implies we already hold the iolock. Skip it in + * xfs_free_eofblocks() to avoid deadlock. This also eliminates + * the possibility of EAGAIN being returned. + */ + if (eofb->eof_scan_owner == ip->i_ino) + need_iolock = false; + } + + /* Free the CoW blocks */ + if (need_iolock) { + xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_ilock(ip, XFS_MMAPLOCK_EXCL); + } + + ret = xfs_reflink_cancel_cow_range(ip, 0, NULLFILEOFF); + + if (need_iolock) { + xfs_iunlock(ip, XFS_MMAPLOCK_EXCL); + xfs_iunlock(ip, XFS_IOLOCK_EXCL); + } + + return ret; +} + +int +xfs_icache_free_cowblocks( + struct xfs_mount *mp, + struct xfs_eofblocks *eofb) +{ + return __xfs_icache_free_eofblocks(mp, eofb, xfs_inode_free_cowblocks, + XFS_ICI_COWBLOCKS_TAG); +} + +int +xfs_inode_free_quota_cowblocks( + struct xfs_inode *ip) +{ + return __xfs_inode_free_quota_eofblocks(ip, xfs_icache_free_cowblocks); +} + +void +xfs_inode_set_cowblocks_tag( + xfs_inode_t *ip) +{ + trace_xfs_inode_set_eofblocks_tag(ip); + return __xfs_inode_set_eofblocks_tag(ip, xfs_queue_cowblocks, + trace_xfs_perag_set_eofblocks, + XFS_ICI_COWBLOCKS_TAG); +} + +void +xfs_inode_clear_cowblocks_tag( + xfs_inode_t *ip) +{ + trace_xfs_inode_clear_eofblocks_tag(ip); + return __xfs_inode_clear_eofblocks_tag(ip, + trace_xfs_perag_clear_eofblocks, XFS_ICI_COWBLOCKS_TAG); +} diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 05bac99..a1e02f4 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -40,6 +40,7 @@ struct xfs_eofblocks { in xfs_inode_ag_iterator */ #define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ #define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ +#define XFS_ICI_COWBLOCKS_TAG 2 /* inode can have cow blocks to gc */ /* * Flags for xfs_iget() @@ -70,6 +71,12 @@ int xfs_inode_free_quota_eofblocks(struct xfs_inode *ip); void xfs_eofblocks_worker(struct work_struct *); void xfs_queue_eofblocks(struct xfs_mount *); +void xfs_inode_set_cowblocks_tag(struct xfs_inode *ip); +void xfs_inode_clear_cowblocks_tag(struct xfs_inode *ip); +int xfs_icache_free_cowblocks(struct xfs_mount *, struct xfs_eofblocks *); +int xfs_inode_free_quota_cowblocks(struct xfs_inode *ip); +void xfs_cowblocks_worker(struct work_struct *); + int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, int flags, void *args), int flags, void *args); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 26ce555..e91fd84 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1631,8 +1631,10 @@ xfs_itruncate_extents( /* * Clear the reflink flag if we truncated everything. */ - if (ip->i_d.di_nblocks == 0 && xfs_is_reflink_inode(ip)) + if (ip->i_d.di_nblocks == 0 && xfs_is_reflink_inode(ip)) { ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; + xfs_inode_clear_cowblocks_tag(ip); + } /* * Always re-log the inode so that our permanent transaction can keep diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 666bafc..a379fb8 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -670,6 +670,8 @@ retry: */ if (prealloc) xfs_inode_set_eofblocks_tag(ip); + if (whichfork == XFS_COW_FORK && extsz > 0) + xfs_inode_set_cowblocks_tag(ip); *ret_imap = imap[0]; return 0; diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index b8d64d5..68640fb 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -116,6 +116,7 @@ typedef __u32 xfs_nlink_t; #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val #define xfs_eofb_secs xfs_params.eofb_timer.val +#define xfs_cowb_secs xfs_params.cowb_timer.val #define current_cpu() (raw_smp_processor_id()) #define current_pid() (current->pid) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index d64e5b9..039b5be 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1019,6 +1019,7 @@ xfs_unmountfs( int error; cancel_delayed_work_sync(&mp->m_eofblocks_work); + cancel_delayed_work_sync(&mp->m_cowblocks_work); xfs_fs_unreserve_ag_blocks(mp); xfs_qm_unmount_quotas(mp); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1572388..b896ea5 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -158,6 +158,8 @@ typedef struct xfs_mount { struct delayed_work m_reclaim_work; /* background inode reclaim */ struct delayed_work m_eofblocks_work; /* background eof blocks trimming */ + struct delayed_work m_cowblocks_work; /* background cow blocks + trimming */ bool m_update_sb; /* sb needs update in mount */ int64_t m_low_space[XFS_LOWSP_MAX]; /* low free space thresholds */ diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 68cd467..0db3a34 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -1688,6 +1688,7 @@ next: /* Clear the inode flag. */ trace_xfs_reflink_unset_inode_flag(ip); ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK; + xfs_inode_clear_cowblocks_tag(ip); xfs_trans_ijoin(tp, ip, 0); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); @@ -1825,3 +1826,37 @@ xfs_reflink_check_flag_adjust( } return 0; } + +/* + * Does this inode have any real CoW reservations? + */ +bool +xfs_reflink_has_real_cow_blocks( + struct xfs_inode *ip) +{ + struct xfs_bmbt_irec irec; + struct xfs_ifork *ifp; + struct xfs_bmbt_rec_host *gotp; + xfs_extnum_t idx; + + if (!xfs_is_reflink_inode(ip)) + return false; + + /* Go find the old extent in the CoW fork. */ + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); + gotp = xfs_iext_bno_to_ext(ifp, 0, &idx); + while (gotp) { + xfs_bmbt_get_all(gotp, &irec); + + if (!isnullstartblock(irec.br_startblock)) + return true; + + /* Roll on... */ + idx++; + if (idx >= ifp->if_bytes / sizeof(xfs_bmbt_rec_t)) + break; + gotp = xfs_iext_get_ext(ifp, idx); + } + + return false; +} diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h index 89e1e62..5c37a7d 100644 --- a/fs/xfs/xfs_reflink.h +++ b/fs/xfs/xfs_reflink.h @@ -57,4 +57,6 @@ extern void xfs_reflink_get_lxflags(struct xfs_inode *ip, unsigned int *flags); extern int xfs_reflink_check_flag_adjust(struct xfs_inode *ip, unsigned int *xflags); +extern bool xfs_reflink_has_real_cow_blocks(struct xfs_inode *ip); + #endif /* __XFS_REFLINK_H */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index a980fef..6ef6244 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1513,6 +1513,7 @@ xfs_fs_fill_super( atomic_set(&mp->m_active_trans, 0); INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); INIT_DELAYED_WORK(&mp->m_eofblocks_work, xfs_eofblocks_worker); + INIT_DELAYED_WORK(&mp->m_cowblocks_work, xfs_cowblocks_worker); mp->m_kobj.kobject.kset = xfs_kset; mp->m_super = sb; diff --git a/fs/xfs/xfs_sysctl.c b/fs/xfs/xfs_sysctl.c index aed74d3..afe1f66 100644 --- a/fs/xfs/xfs_sysctl.c +++ b/fs/xfs/xfs_sysctl.c @@ -184,6 +184,15 @@ static struct ctl_table xfs_table[] = { .extra1 = &xfs_params.eofb_timer.min, .extra2 = &xfs_params.eofb_timer.max, }, + { + .procname = "speculative_cow_prealloc_lifetime", + .data = &xfs_params.cowb_timer.val, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &xfs_params.cowb_timer.min, + .extra2 = &xfs_params.cowb_timer.max, + }, /* please keep this the last entry */ #ifdef CONFIG_PROC_FS { diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h index ffef453..984a349 100644 --- a/fs/xfs/xfs_sysctl.h +++ b/fs/xfs/xfs_sysctl.h @@ -48,6 +48,7 @@ typedef struct xfs_param { xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ xfs_sysctl_val_t fstrm_timer; /* Filestream dir-AG assoc'n timeout. */ xfs_sysctl_val_t eofb_timer; /* Interval between eofb scan wakeups */ + xfs_sysctl_val_t cowb_timer; /* Interval between cowb scan wakeups */ } xfs_param_t; /* diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 8fba977..67e4cf7 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -136,6 +136,8 @@ DEFINE_PERAG_REF_EVENT(xfs_perag_set_reclaim); DEFINE_PERAG_REF_EVENT(xfs_perag_clear_reclaim); DEFINE_PERAG_REF_EVENT(xfs_perag_set_eofblocks); DEFINE_PERAG_REF_EVENT(xfs_perag_clear_eofblocks); +DEFINE_PERAG_REF_EVENT(xfs_perag_set_cowblocks); +DEFINE_PERAG_REF_EVENT(xfs_perag_clear_cowblocks); DECLARE_EVENT_CLASS(xfs_ag_class, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno), @@ -687,6 +689,9 @@ DEFINE_INODE_EVENT(xfs_dquot_dqdetach); DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); +DEFINE_INODE_EVENT(xfs_inode_set_cowblocks_tag); +DEFINE_INODE_EVENT(xfs_inode_clear_cowblocks_tag); +DEFINE_INODE_EVENT(xfs_inode_free_cowblocks_invalid); DEFINE_INODE_EVENT(xfs_filemap_fault); DEFINE_INODE_EVENT(xfs_filemap_pmd_fault); From darrick.wong@oracle.com Thu Aug 25 18:38:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B74727DDA for ; Thu, 25 Aug 2016 18:38:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7D367304039 for ; Thu, 25 Aug 2016 16:38:26 -0700 (PDT) X-ASG-Debug-ID: 1472168304-0bf57b53122094d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id s18c7qE51mfuDWGc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNcMK1015284 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:23 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNcMaG022478 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:22 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNcLF7018217; Thu, 25 Aug 2016 23:38:22 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:21 -0700 Subject: [PATCH 59/71] xfs: provide switch to force filesystem to copy-on-write all the time From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 59/71] xfs: provide switch to force filesystem to copy-on-write all the time To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:20 -0700 Message-ID: <147216830032.867.12177632219145817933.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168304 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2817 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make it possible to force XFS to use copy on write all the time, at least if reflink is turned on. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_globals.c | 1 + fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_reflink.c | 6 ++++++ fs/xfs/xfs_sysctl.c | 11 +++++++++++ fs/xfs/xfs_sysctl.h | 1 + 5 files changed, 20 insertions(+) diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c index f3f6aa9..9a55966 100644 --- a/fs/xfs/xfs_globals.c +++ b/fs/xfs/xfs_globals.c @@ -43,6 +43,7 @@ xfs_param_t xfs_params = { .fstrm_timer = { 1, 30*100, 3600*100}, .eofb_timer = { 1, 300, 3600*24}, .cowb_timer = { 1, 300, 3600*24}, + .always_cow = { 0, 0, 1 }, }; struct xfs_globals xfs_globals = { diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 68640fb..a9c1765 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -117,6 +117,7 @@ typedef __u32 xfs_nlink_t; #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val #define xfs_eofb_secs xfs_params.eofb_timer.val #define xfs_cowb_secs xfs_params.cowb_timer.val +#define xfs_always_cow xfs_params.always_cow.val #define current_cpu() (raw_smp_processor_id()) #define current_pid() (current->pid) diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index 0db3a34..1299a42 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -166,6 +166,12 @@ xfs_reflink_find_shared( struct xfs_btree_cur *cur; int error; + if (xfs_always_cow) { + *fbno = agbno; + *flen = aglen; + return 0; + } + error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); if (error) return error; diff --git a/fs/xfs/xfs_sysctl.c b/fs/xfs/xfs_sysctl.c index afe1f66..650b8d5 100644 --- a/fs/xfs/xfs_sysctl.c +++ b/fs/xfs/xfs_sysctl.c @@ -193,6 +193,17 @@ static struct ctl_table xfs_table[] = { .extra1 = &xfs_params.cowb_timer.min, .extra2 = &xfs_params.cowb_timer.max, }, +#ifdef DEBUG + { + .procname = "always_cow", + .data = &xfs_params.always_cow.val, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &xfs_params.always_cow.min, + .extra2 = &xfs_params.always_cow.max, + }, +#endif /* please keep this the last entry */ #ifdef CONFIG_PROC_FS { diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h index 984a349..16099dc 100644 --- a/fs/xfs/xfs_sysctl.h +++ b/fs/xfs/xfs_sysctl.h @@ -49,6 +49,7 @@ typedef struct xfs_param { xfs_sysctl_val_t fstrm_timer; /* Filestream dir-AG assoc'n timeout. */ xfs_sysctl_val_t eofb_timer; /* Interval between eofb scan wakeups */ xfs_sysctl_val_t cowb_timer; /* Interval between cowb scan wakeups */ + xfs_sysctl_val_t always_cow; /* Always copy on write? */ } xfs_param_t; /* From darrick.wong@oracle.com Thu Aug 25 18:38:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B37F67E6F for ; Thu, 25 Aug 2016 18:38:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 85DC48F8033 for ; Thu, 25 Aug 2016 16:38:32 -0700 (PDT) X-ASG-Debug-ID: 1472168310-0bf57c55b21c79c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id kqzVtDZx5ZNo2l2D (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNcS0g022050 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:38:29 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNcSik009752 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:38:28 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNcS12029315; Thu, 25 Aug 2016 23:38:28 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:27 -0700 Subject: [PATCH 60/71] xfs: increase log reservations for reflink From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 60/71] xfs: increase log reservations for reflink To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:26 -0700 Message-ID: <147216830650.867.11021857693291070796.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168310 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2691 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Increase the log reservations to handle the increased rolling that happens at the end of copy-on-write operations. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_trans_resv.c | 16 +++++++++++++--- fs/xfs/libxfs/xfs_trans_resv.h | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c index a59838f..b456cca 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.c +++ b/fs/xfs/libxfs/xfs_trans_resv.c @@ -812,11 +812,18 @@ xfs_trans_resv_calc( * require a permanent reservation on space. */ resp->tr_write.tr_logres = xfs_calc_write_reservation(mp); - resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT; + if (xfs_sb_version_hasreflink(&mp->m_sb)) + resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT_REFLINK; + else + resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT; resp->tr_write.tr_logflags |= XFS_TRANS_PERM_LOG_RES; resp->tr_itruncate.tr_logres = xfs_calc_itruncate_reservation(mp); - resp->tr_itruncate.tr_logcount = XFS_ITRUNCATE_LOG_COUNT; + if (xfs_sb_version_hasreflink(&mp->m_sb)) + resp->tr_itruncate.tr_logcount = + XFS_ITRUNCATE_LOG_COUNT_REFLINK; + else + resp->tr_itruncate.tr_logcount = XFS_ITRUNCATE_LOG_COUNT; resp->tr_itruncate.tr_logflags |= XFS_TRANS_PERM_LOG_RES; resp->tr_rename.tr_logres = xfs_calc_rename_reservation(mp); @@ -873,7 +880,10 @@ xfs_trans_resv_calc( resp->tr_growrtalloc.tr_logflags |= XFS_TRANS_PERM_LOG_RES; resp->tr_qm_dqalloc.tr_logres = xfs_calc_qm_dqalloc_reservation(mp); - resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT; + if (xfs_sb_version_hasreflink(&mp->m_sb)) + resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT_REFLINK; + else + resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT; resp->tr_qm_dqalloc.tr_logflags |= XFS_TRANS_PERM_LOG_RES; /* diff --git a/fs/xfs/libxfs/xfs_trans_resv.h b/fs/xfs/libxfs/xfs_trans_resv.h index 36a1511..b7e5357 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.h +++ b/fs/xfs/libxfs/xfs_trans_resv.h @@ -87,6 +87,7 @@ struct xfs_trans_resv { #define XFS_DEFAULT_LOG_COUNT 1 #define XFS_DEFAULT_PERM_LOG_COUNT 2 #define XFS_ITRUNCATE_LOG_COUNT 2 +#define XFS_ITRUNCATE_LOG_COUNT_REFLINK 8 #define XFS_INACTIVE_LOG_COUNT 2 #define XFS_CREATE_LOG_COUNT 2 #define XFS_CREATE_TMPFILE_LOG_COUNT 2 @@ -96,6 +97,7 @@ struct xfs_trans_resv { #define XFS_LINK_LOG_COUNT 2 #define XFS_RENAME_LOG_COUNT 2 #define XFS_WRITE_LOG_COUNT 2 +#define XFS_WRITE_LOG_COUNT_REFLINK 8 #define XFS_ADDAFORK_LOG_COUNT 2 #define XFS_ATTRINVAL_LOG_COUNT 1 #define XFS_ATTRSET_LOG_COUNT 3 From darrick.wong@oracle.com Thu Aug 25 18:38:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 822437E7D for ; Thu, 25 Aug 2016 18:38:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45D858F8033 for ; Thu, 25 Aug 2016 16:38:38 -0700 (PDT) X-ASG-Debug-ID: 1472168316-0bf57b53122094f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 3ESJmNep2NaHKYXD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNcYwv022135 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:38:35 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNcYGI010036 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:38:34 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNcYV3029357; Thu, 25 Aug 2016 23:38:34 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:34 -0700 Subject: [PATCH 61/71] xfs: add shared rmap map/unmap/convert log item types From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 61/71] xfs: add shared rmap map/unmap/convert log item types To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:32 -0700 Message-ID: <147216831268.867.9941303230739520022.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168316 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2443 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Wire up some rmap log redo item type codes to map, unmap, or convert shared data block extents. The actual log item recovery comes in a later patch. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_log_format.h | 3 +++ fs/xfs/xfs_rmap_item.c | 3 +++ fs/xfs/xfs_trans_rmap.c | 9 +++++++++ 3 files changed, 15 insertions(+) diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index d788d01..75f9890 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -635,8 +635,11 @@ struct xfs_map_extent { /* rmap me_flags: upper bits are flags, lower byte is type code */ #define XFS_RMAP_EXTENT_MAP 1 +#define XFS_RMAP_EXTENT_MAP_SHARED 2 #define XFS_RMAP_EXTENT_UNMAP 3 +#define XFS_RMAP_EXTENT_UNMAP_SHARED 4 #define XFS_RMAP_EXTENT_CONVERT 5 +#define XFS_RMAP_EXTENT_CONVERT_SHARED 6 #define XFS_RMAP_EXTENT_ALLOC 7 #define XFS_RMAP_EXTENT_FREE 8 #define XFS_RMAP_EXTENT_TYPE_MASK 0xFF diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c index 2500f28..f4bf026 100644 --- a/fs/xfs/xfs_rmap_item.c +++ b/fs/xfs/xfs_rmap_item.c @@ -459,8 +459,11 @@ xfs_rui_recover( XFS_FSB_TO_DADDR(mp, rmap->me_startblock)); switch (rmap->me_flags & XFS_RMAP_EXTENT_TYPE_MASK) { case XFS_RMAP_EXTENT_MAP: + case XFS_RMAP_EXTENT_MAP_SHARED: case XFS_RMAP_EXTENT_UNMAP: + case XFS_RMAP_EXTENT_UNMAP_SHARED: case XFS_RMAP_EXTENT_CONVERT: + case XFS_RMAP_EXTENT_CONVERT_SHARED: case XFS_RMAP_EXTENT_ALLOC: case XFS_RMAP_EXTENT_FREE: op_ok = true; diff --git a/fs/xfs/xfs_trans_rmap.c b/fs/xfs/xfs_trans_rmap.c index 5a50ef8..9ead064 100644 --- a/fs/xfs/xfs_trans_rmap.c +++ b/fs/xfs/xfs_trans_rmap.c @@ -48,12 +48,21 @@ xfs_trans_set_rmap_flags( case XFS_RMAP_MAP: rmap->me_flags |= XFS_RMAP_EXTENT_MAP; break; + case XFS_RMAP_MAP_SHARED: + rmap->me_flags |= XFS_RMAP_EXTENT_MAP_SHARED; + break; case XFS_RMAP_UNMAP: rmap->me_flags |= XFS_RMAP_EXTENT_UNMAP; break; + case XFS_RMAP_UNMAP_SHARED: + rmap->me_flags |= XFS_RMAP_EXTENT_UNMAP_SHARED; + break; case XFS_RMAP_CONVERT: rmap->me_flags |= XFS_RMAP_EXTENT_CONVERT; break; + case XFS_RMAP_CONVERT_SHARED: + rmap->me_flags |= XFS_RMAP_EXTENT_CONVERT_SHARED; + break; case XFS_RMAP_ALLOC: rmap->me_flags |= XFS_RMAP_EXTENT_ALLOC; break; From darrick.wong@oracle.com Thu Aug 25 18:38:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3636A7D11 for ; Thu, 25 Aug 2016 18:38:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D1FC58F8033 for ; Thu, 25 Aug 2016 16:38:46 -0700 (PDT) X-ASG-Debug-ID: 1472168323-0bf8155c741e7000001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id EMj6mVdX43i8luuD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNcgVe022234 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:42 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNcfWV011938 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:41 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNceHU030414; Thu, 25 Aug 2016 23:38:41 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:40 -0700 Subject: [PATCH 62/71] xfs: use interval query for rmap alloc operations on shared files From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 62/71] xfs: use interval query for rmap alloc operations on shared files To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:38 -0700 Message-ID: <147216831884.867.6563772939067285792.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168323 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 20190 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When it's possible for reverse mappings to overlap (data fork extents of files on reflink filesystems), use the interval query function to find the left neighbor of an extent we're trying to add; and be careful to use the lookup functions to update the neighbors and/or add new extents. v2: xfs_rmap_find_left_neighbor() needs to calculate the high key of a query range correctly. We can also add a few shortcuts -- there are no left neighbors of a query at offset zero. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rmap.c | 514 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rmap.h | 7 + fs/xfs/xfs_rmap_item.c | 6 + fs/xfs/xfs_trace.h | 5 4 files changed, 530 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 1c40b85..bb5e2f8 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -148,6 +148,37 @@ done: return error; } +STATIC int +xfs_rmap_delete( + struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, + xfs_extlen_t len, + uint64_t owner, + uint64_t offset, + unsigned int flags) +{ + int i; + int error; + + trace_xfs_rmap_delete(rcur->bc_mp, rcur->bc_private.a.agno, agbno, + len, owner, offset, flags); + + error = xfs_rmap_lookup_eq(rcur, agbno, len, owner, offset, flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(rcur->bc_mp, i == 1, done); + + error = xfs_btree_delete(rcur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(rcur->bc_mp, i == 1, done); +done: + if (error) + trace_xfs_rmap_delete_error(rcur->bc_mp, + rcur->bc_private.a.agno, error, _RET_IP_); + return error; +} + static int xfs_rmap_btrec_to_irec( union xfs_btree_rec *rec, @@ -180,6 +211,160 @@ xfs_rmap_get_rec( return xfs_rmap_btrec_to_irec(rec, irec); } +struct xfs_find_left_neighbor_info { + struct xfs_rmap_irec high; + struct xfs_rmap_irec *irec; + int *stat; +}; + +/* For each rmap given, figure out if it matches the key we want. */ +STATIC int +xfs_rmap_find_left_neighbor_helper( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *rec, + void *priv) +{ + struct xfs_find_left_neighbor_info *info = priv; + + trace_xfs_rmap_find_left_neighbor_candidate(cur->bc_mp, + cur->bc_private.a.agno, rec->rm_startblock, + rec->rm_blockcount, rec->rm_owner, rec->rm_offset, + rec->rm_flags); + + if (rec->rm_owner != info->high.rm_owner) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + if (!XFS_RMAP_NON_INODE_OWNER(rec->rm_owner) && + !(rec->rm_flags & XFS_RMAP_BMBT_BLOCK) && + rec->rm_offset + rec->rm_blockcount - 1 != info->high.rm_offset) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + + *info->irec = *rec; + *info->stat = 1; + return XFS_BTREE_QUERY_RANGE_ABORT; +} + +/* + * Find the record to the left of the given extent, being careful only to + * return a match with the same owner and adjacent physical and logical + * block ranges. + */ +int +xfs_rmap_find_left_neighbor( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + uint64_t owner, + uint64_t offset, + unsigned int flags, + struct xfs_rmap_irec *irec, + int *stat) +{ + struct xfs_find_left_neighbor_info info; + int error; + + *stat = 0; + if (bno == 0) + return 0; + info.high.rm_startblock = bno - 1; + info.high.rm_owner = owner; + if (!XFS_RMAP_NON_INODE_OWNER(owner) && + !(flags & XFS_RMAP_BMBT_BLOCK)) { + if (offset == 0) + return 0; + info.high.rm_offset = offset - 1; + } else + info.high.rm_offset = 0; + info.high.rm_flags = flags; + info.high.rm_blockcount = 0; + info.irec = irec; + info.stat = stat; + + trace_xfs_rmap_find_left_neighbor_query(cur->bc_mp, + cur->bc_private.a.agno, bno, 0, owner, offset, flags); + + error = xfs_rmap_query_range(cur, &info.high, &info.high, + xfs_rmap_find_left_neighbor_helper, &info); + if (error == XFS_BTREE_QUERY_RANGE_ABORT) + error = 0; + if (*stat) + trace_xfs_rmap_find_left_neighbor_result(cur->bc_mp, + cur->bc_private.a.agno, irec->rm_startblock, + irec->rm_blockcount, irec->rm_owner, + irec->rm_offset, irec->rm_flags); + return error; +} + +/* For each rmap given, figure out if it matches the key we want. */ +STATIC int +xfs_rmap_lookup_le_range_helper( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *rec, + void *priv) +{ + struct xfs_find_left_neighbor_info *info = priv; + + trace_xfs_rmap_lookup_le_range_candidate(cur->bc_mp, + cur->bc_private.a.agno, rec->rm_startblock, + rec->rm_blockcount, rec->rm_owner, rec->rm_offset, + rec->rm_flags); + + if (rec->rm_owner != info->high.rm_owner) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + if (!XFS_RMAP_NON_INODE_OWNER(rec->rm_owner) && + !(rec->rm_flags & XFS_RMAP_BMBT_BLOCK) && + (rec->rm_offset > info->high.rm_offset || + rec->rm_offset + rec->rm_blockcount <= info->high.rm_offset)) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + + *info->irec = *rec; + *info->stat = 1; + return XFS_BTREE_QUERY_RANGE_ABORT; +} + +/* + * Find the record to the left of the given extent, being careful only to + * return a match with the same owner and overlapping physical and logical + * block ranges. This is the overlapping-interval version of + * xfs_rmap_lookup_le. + */ +int +xfs_rmap_lookup_le_range( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + uint64_t owner, + uint64_t offset, + unsigned int flags, + struct xfs_rmap_irec *irec, + int *stat) +{ + struct xfs_find_left_neighbor_info info; + int error; + + info.high.rm_startblock = bno; + info.high.rm_owner = owner; + if (!XFS_RMAP_NON_INODE_OWNER(owner) && !(flags & XFS_RMAP_BMBT_BLOCK)) + info.high.rm_offset = offset; + else + info.high.rm_offset = 0; + info.high.rm_flags = flags; + info.high.rm_blockcount = 0; + *stat = 0; + info.irec = irec; + info.stat = stat; + + trace_xfs_rmap_lookup_le_range(cur->bc_mp, + cur->bc_private.a.agno, bno, 0, owner, offset, flags); + error = xfs_rmap_query_range(cur, &info.high, &info.high, + xfs_rmap_lookup_le_range_helper, &info); + if (error == XFS_BTREE_QUERY_RANGE_ABORT) + error = 0; + if (*stat) + trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, + cur->bc_private.a.agno, irec->rm_startblock, + irec->rm_blockcount, irec->rm_owner, + irec->rm_offset, irec->rm_flags); + return error; +} + /* * Find the extent in the rmap btree and remove it. * @@ -1098,6 +1283,321 @@ done: #undef RIGHT #undef PREV +/* + * Find an extent in the rmap btree and unmap it. For rmap extent types that + * can overlap (data fork rmaps on reflink filesystems) we must be careful + * that the prev/next records in the btree might belong to another owner. + * Therefore we must use delete+insert to alter any of the key fields. + * + * For every other situation there can only be one owner for a given extent, + * so we can call the regular _free function. + */ +STATIC int +xfs_rmap_unmap_shared( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool unwritten, + struct xfs_owner_info *oinfo) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_rmap_irec ltrec; + uint64_t ltoff; + int error = 0; + int i; + uint64_t owner; + uint64_t offset; + unsigned int flags; + + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); + if (unwritten) + flags |= XFS_RMAP_UNWRITTEN; + trace_xfs_rmap_unmap(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); + + /* + * We should always have a left record because there's a static record + * for the AG headers at rm_startblock == 0 created by mkfs/growfs that + * will not ever be removed from the tree. + */ + error = xfs_rmap_lookup_le_range(cur, bno, owner, offset, flags, + <rec, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + ltoff = ltrec.rm_offset; + + /* Make sure the extent we found covers the entire freeing range. */ + XFS_WANT_CORRUPTED_GOTO(mp, ltrec.rm_startblock <= bno && + ltrec.rm_startblock + ltrec.rm_blockcount >= + bno + len, out_error); + + /* Make sure the owner matches what we expect to find in the tree. */ + XFS_WANT_CORRUPTED_GOTO(mp, owner == ltrec.rm_owner, out_error); + + /* Make sure the unwritten flag matches. */ + XFS_WANT_CORRUPTED_GOTO(mp, (flags & XFS_RMAP_UNWRITTEN) == + (ltrec.rm_flags & XFS_RMAP_UNWRITTEN), out_error); + + /* Check the offset. */ + XFS_WANT_CORRUPTED_GOTO(mp, ltrec.rm_offset <= offset, out_error); + XFS_WANT_CORRUPTED_GOTO(mp, offset <= ltoff + ltrec.rm_blockcount, + out_error); + + if (ltrec.rm_startblock == bno && ltrec.rm_blockcount == len) { + /* Exact match, simply remove the record from rmap tree. */ + error = xfs_rmap_delete(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags); + if (error) + goto out_error; + } else if (ltrec.rm_startblock == bno) { + /* + * Overlap left hand side of extent: move the start, trim the + * length and update the current record. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrrrrrrr| + * bno len + */ + + /* Delete prev rmap. */ + error = xfs_rmap_delete(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags); + if (error) + goto out_error; + + /* Add an rmap at the new offset. */ + ltrec.rm_startblock += len; + ltrec.rm_blockcount -= len; + ltrec.rm_offset += len; + error = xfs_rmap_insert(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags); + if (error) + goto out_error; + } else if (ltrec.rm_startblock + ltrec.rm_blockcount == bno + len) { + /* + * Overlap right hand side of extent: trim the length and + * update the current record. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrrrrrrr| + * bno len + */ + error = xfs_rmap_lookup_eq(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + ltrec.rm_blockcount -= len; + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + } else { + /* + * Overlap middle of extent: trim the length of the existing + * record to the length of the new left-extent size, increment + * the insertion position so we can insert a new record + * containing the remaining right-extent space. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrr| |rrrr| + * bno len + */ + xfs_extlen_t orig_len = ltrec.rm_blockcount; + + /* Shrink the left side of the rmap */ + error = xfs_rmap_lookup_eq(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + ltrec.rm_blockcount = bno - ltrec.rm_startblock; + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + + /* Add an rmap at the new offset */ + error = xfs_rmap_insert(cur, bno + len, + orig_len - len - ltrec.rm_blockcount, + ltrec.rm_owner, offset + len, + ltrec.rm_flags); + if (error) + goto out_error; + } + + trace_xfs_rmap_unmap_done(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); +out_error: + if (error) + trace_xfs_rmap_unmap_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Find an extent in the rmap btree and map it. For rmap extent types that + * can overlap (data fork rmaps on reflink filesystems) we must be careful + * that the prev/next records in the btree might belong to another owner. + * Therefore we must use delete+insert to alter any of the key fields. + * + * For every other situation there can only be one owner for a given extent, + * so we can call the regular _alloc function. + */ +STATIC int +xfs_rmap_map_shared( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool unwritten, + struct xfs_owner_info *oinfo) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_rmap_irec ltrec; + struct xfs_rmap_irec gtrec; + int have_gt; + int have_lt; + int error = 0; + int i; + uint64_t owner; + uint64_t offset; + unsigned int flags = 0; + + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); + if (unwritten) + flags |= XFS_RMAP_UNWRITTEN; + trace_xfs_rmap_map(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); + + /* Is there a left record that abuts our range? */ + error = xfs_rmap_find_left_neighbor(cur, bno, owner, offset, flags, + <rec, &have_lt); + if (error) + goto out_error; + if (have_lt && + !xfs_rmap_is_mergeable(<rec, owner, flags)) + have_lt = 0; + + /* Is there a right record that abuts our range? */ + error = xfs_rmap_lookup_eq(cur, bno + len, len, owner, offset + len, + flags, &have_gt); + if (error) + goto out_error; + if (have_gt) { + error = xfs_rmap_get_rec(cur, >rec, &have_gt); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, have_gt == 1, out_error); + trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, + cur->bc_private.a.agno, gtrec.rm_startblock, + gtrec.rm_blockcount, gtrec.rm_owner, + gtrec.rm_offset, gtrec.rm_flags); + + if (!xfs_rmap_is_mergeable(>rec, owner, flags)) + have_gt = 0; + } + + if (have_lt && + ltrec.rm_startblock + ltrec.rm_blockcount == bno && + ltrec.rm_offset + ltrec.rm_blockcount == offset) { + /* + * Left edge contiguous, merge into left record. + * + * ltbno ltlen + * orig: |ooooooooo| + * adding: |aaaaaaaaa| + * result: |rrrrrrrrrrrrrrrrrrr| + * bno len + */ + ltrec.rm_blockcount += len; + if (have_gt && + bno + len == gtrec.rm_startblock && + offset + len == gtrec.rm_offset) { + /* + * Right edge also contiguous, delete right record + * and merge into left record. + * + * ltbno ltlen gtbno gtlen + * orig: |ooooooooo| |ooooooooo| + * adding: |aaaaaaaaa| + * result: |rrrrrrrrrrrrrrrrrrrrrrrrrrrrr| + */ + ltrec.rm_blockcount += gtrec.rm_blockcount; + error = xfs_rmap_delete(cur, gtrec.rm_startblock, + gtrec.rm_blockcount, gtrec.rm_owner, + gtrec.rm_offset, gtrec.rm_flags); + if (error) + goto out_error; + } + + /* Point the cursor back to the left record and update. */ + error = xfs_rmap_lookup_eq(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + } else if (have_gt && + bno + len == gtrec.rm_startblock && + offset + len == gtrec.rm_offset) { + /* + * Right edge contiguous, merge into right record. + * + * gtbno gtlen + * Orig: |ooooooooo| + * adding: |aaaaaaaaa| + * Result: |rrrrrrrrrrrrrrrrrrr| + * bno len + */ + /* Delete the old record. */ + error = xfs_rmap_delete(cur, gtrec.rm_startblock, + gtrec.rm_blockcount, gtrec.rm_owner, + gtrec.rm_offset, gtrec.rm_flags); + if (error) + goto out_error; + + /* Move the start and re-add it. */ + gtrec.rm_startblock = bno; + gtrec.rm_blockcount += len; + gtrec.rm_offset = offset; + error = xfs_rmap_insert(cur, gtrec.rm_startblock, + gtrec.rm_blockcount, gtrec.rm_owner, + gtrec.rm_offset, gtrec.rm_flags); + if (error) + goto out_error; + } else { + /* + * No contiguous edge with identical owner, insert + * new record at current cursor position. + */ + error = xfs_rmap_insert(cur, bno, len, owner, offset, flags); + if (error) + goto out_error; + } + + trace_xfs_rmap_map_done(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); +out_error: + if (error) + trace_xfs_rmap_map_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + struct xfs_rmap_query_range_info { xfs_rmap_query_range_fn fn; void *priv; @@ -1237,11 +1737,19 @@ xfs_rmap_finish_one( case XFS_RMAP_MAP: error = xfs_rmap_map(rcur, bno, blockcount, unwritten, &oinfo); break; + case XFS_RMAP_MAP_SHARED: + error = xfs_rmap_map_shared(rcur, bno, blockcount, unwritten, + &oinfo); + break; case XFS_RMAP_FREE: case XFS_RMAP_UNMAP: error = xfs_rmap_unmap(rcur, bno, blockcount, unwritten, &oinfo); break; + case XFS_RMAP_UNMAP_SHARED: + error = xfs_rmap_unmap_shared(rcur, bno, blockcount, unwritten, + &oinfo); + break; case XFS_RMAP_CONVERT: error = xfs_rmap_convert(rcur, bno, blockcount, !unwritten, &oinfo); @@ -1315,7 +1823,8 @@ xfs_rmap_map_extent( if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; - return __xfs_rmap_add(mp, dfops, XFS_RMAP_MAP, ip->i_ino, + return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? + XFS_RMAP_MAP_SHARED : XFS_RMAP_MAP, ip->i_ino, whichfork, PREV); } @@ -1331,7 +1840,8 @@ xfs_rmap_unmap_extent( if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; - return __xfs_rmap_add(mp, dfops, XFS_RMAP_UNMAP, ip->i_ino, + return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? + XFS_RMAP_UNMAP_SHARED : XFS_RMAP_UNMAP, ip->i_ino, whichfork, PREV); } diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h index 71cf99a..7899305 100644 --- a/fs/xfs/libxfs/xfs_rmap.h +++ b/fs/xfs/libxfs/xfs_rmap.h @@ -206,4 +206,11 @@ int xfs_rmap_finish_one(struct xfs_trans *tp, enum xfs_rmap_intent_type type, xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, struct xfs_btree_cur **pcur); +int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno, + uint64_t owner, uint64_t offset, unsigned int flags, + struct xfs_rmap_irec *irec, int *stat); +int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno, + uint64_t owner, uint64_t offset, unsigned int flags, + struct xfs_rmap_irec *irec, int *stat); + #endif /* __XFS_RMAP_H__ */ diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c index f4bf026..7ecb5ae 100644 --- a/fs/xfs/xfs_rmap_item.c +++ b/fs/xfs/xfs_rmap_item.c @@ -502,9 +502,15 @@ xfs_rui_recover( case XFS_RMAP_EXTENT_MAP: type = XFS_RMAP_MAP; break; + case XFS_RMAP_EXTENT_MAP_SHARED: + type = XFS_RMAP_MAP_SHARED; + break; case XFS_RMAP_EXTENT_UNMAP: type = XFS_RMAP_UNMAP; break; + case XFS_RMAP_EXTENT_UNMAP_SHARED: + type = XFS_RMAP_UNMAP_SHARED; + break; case XFS_RMAP_EXTENT_CONVERT: type = XFS_RMAP_CONVERT; break; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 67e4cf7..8b1f803 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2561,6 +2561,11 @@ DEFINE_RMAPBT_EVENT(xfs_rmap_delete); DEFINE_AG_ERROR_EVENT(xfs_rmap_insert_error); DEFINE_AG_ERROR_EVENT(xfs_rmap_delete_error); DEFINE_AG_ERROR_EVENT(xfs_rmap_update_error); + +DEFINE_RMAPBT_EVENT(xfs_rmap_find_left_neighbor_candidate); +DEFINE_RMAPBT_EVENT(xfs_rmap_find_left_neighbor_query); +DEFINE_RMAPBT_EVENT(xfs_rmap_lookup_le_range_candidate); +DEFINE_RMAPBT_EVENT(xfs_rmap_lookup_le_range); DEFINE_RMAPBT_EVENT(xfs_rmap_lookup_le_range_result); DEFINE_RMAPBT_EVENT(xfs_rmap_find_right_neighbor_result); DEFINE_RMAPBT_EVENT(xfs_rmap_find_left_neighbor_result); From darrick.wong@oracle.com Thu Aug 25 18:38:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7FFEC7D36 for ; Thu, 25 Aug 2016 18:38:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 29940304039 for ; Thu, 25 Aug 2016 16:38:52 -0700 (PDT) X-ASG-Debug-ID: 1472168329-0bf81509b01defe0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zO6jlXoe05pUhN0q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNclwu015574 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:38:48 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNcllD022146 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:38:47 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNckv9029394; Thu, 25 Aug 2016 23:38:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:46 -0700 Subject: [PATCH 63/71] xfs: convert unwritten status of reverse mappings for shared files From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 63/71] xfs: convert unwritten status of reverse mappings for shared files To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:45 -0700 Message-ID: <147216832523.867.7783077724151736670.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168329 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13498 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide a function to convert an unwritten extent to a real one and vice versa when shared extents are possible. v2: Move rmap unwritten bit to rm_offset. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rmap.c | 385 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_rmap_item.c | 3 2 files changed, 387 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index bb5e2f8..3a8cc71 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -1278,6 +1278,384 @@ done: return error; } +/* + * Convert an unwritten extent to a real extent or vice versa. If there is no + * possibility of overlapping extents, delegate to the simpler convert + * function. + */ +STATIC int +xfs_rmap_convert_shared( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool unwritten, + struct xfs_owner_info *oinfo) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_rmap_irec r[4]; /* neighbor extent entries */ + /* left is 0, right is 1, prev is 2 */ + /* new is 3 */ + uint64_t owner; + uint64_t offset; + uint64_t new_endoff; + unsigned int oldext; + unsigned int newext; + unsigned int flags = 0; + int i; + int state = 0; + int error; + + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); + ASSERT(!(XFS_RMAP_NON_INODE_OWNER(owner) || + (flags & (XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK)))); + oldext = unwritten ? XFS_RMAP_UNWRITTEN : 0; + new_endoff = offset + len; + trace_xfs_rmap_convert(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); + + /* + * For the initial lookup, look for and exact match or the left-adjacent + * record for our insertion point. This will also give us the record for + * start block contiguity tests. + */ + error = xfs_rmap_lookup_le_range(cur, bno, owner, offset, flags, + &PREV, &i); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + + ASSERT(PREV.rm_offset <= offset); + ASSERT(PREV.rm_offset + PREV.rm_blockcount >= new_endoff); + ASSERT((PREV.rm_flags & XFS_RMAP_UNWRITTEN) == oldext); + newext = ~oldext & XFS_RMAP_UNWRITTEN; + + /* + * Set flags determining what part of the previous oldext allocation + * extent is being replaced by a newext allocation. + */ + if (PREV.rm_offset == offset) + state |= RMAP_LEFT_FILLING; + if (PREV.rm_offset + PREV.rm_blockcount == new_endoff) + state |= RMAP_RIGHT_FILLING; + + /* Is there a left record that abuts our range? */ + error = xfs_rmap_find_left_neighbor(cur, bno, owner, offset, newext, + &LEFT, &i); + if (error) + goto done; + if (i) { + state |= RMAP_LEFT_VALID; + XFS_WANT_CORRUPTED_GOTO(mp, + LEFT.rm_startblock + LEFT.rm_blockcount <= bno, + done); + if (xfs_rmap_is_mergeable(&LEFT, owner, newext)) + state |= RMAP_LEFT_CONTIG; + } + + /* Is there a right record that abuts our range? */ + error = xfs_rmap_lookup_eq(cur, bno + len, len, owner, offset + len, + newext, &i); + if (error) + goto done; + if (i) { + state |= RMAP_RIGHT_VALID; + error = xfs_rmap_get_rec(cur, &RIGHT, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= RIGHT.rm_startblock, + done); + trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, + cur->bc_private.a.agno, RIGHT.rm_startblock, + RIGHT.rm_blockcount, RIGHT.rm_owner, + RIGHT.rm_offset, RIGHT.rm_flags); + if (xfs_rmap_is_mergeable(&RIGHT, owner, newext)) + state |= RMAP_RIGHT_CONTIG; + } + + /* check that left + prev + right is not too long */ + if ((state & (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | + RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG)) == + (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | + RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG) && + (unsigned long)LEFT.rm_blockcount + len + + RIGHT.rm_blockcount > XFS_RMAP_LEN_MAX) + state &= ~RMAP_RIGHT_CONTIG; + + trace_xfs_rmap_convert_state(mp, cur->bc_private.a.agno, state, + _RET_IP_); + /* + * Switch out based on the FILLING and CONTIG state bits. + */ + switch (state & (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | + RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG)) { + case RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | + RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG: + /* + * Setting all of a previous oldext extent to newext. + * The left and right neighbors are both contiguous with new. + */ + error = xfs_rmap_delete(cur, RIGHT.rm_startblock, + RIGHT.rm_blockcount, RIGHT.rm_owner, + RIGHT.rm_offset, RIGHT.rm_flags); + if (error) + goto done; + error = xfs_rmap_delete(cur, PREV.rm_startblock, + PREV.rm_blockcount, PREV.rm_owner, + PREV.rm_offset, PREV.rm_flags); + if (error) + goto done; + NEW = LEFT; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount += PREV.rm_blockcount + RIGHT.rm_blockcount; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_RIGHT_FILLING | RMAP_LEFT_CONTIG: + /* + * Setting all of a previous oldext extent to newext. + * The left neighbor is contiguous, the right is not. + */ + error = xfs_rmap_delete(cur, PREV.rm_startblock, + PREV.rm_blockcount, PREV.rm_owner, + PREV.rm_offset, PREV.rm_flags); + if (error) + goto done; + NEW = LEFT; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount += PREV.rm_blockcount; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG: + /* + * Setting all of a previous oldext extent to newext. + * The right neighbor is contiguous, the left is not. + */ + error = xfs_rmap_delete(cur, RIGHT.rm_startblock, + RIGHT.rm_blockcount, RIGHT.rm_owner, + RIGHT.rm_offset, RIGHT.rm_flags); + if (error) + goto done; + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount += RIGHT.rm_blockcount; + NEW.rm_flags = RIGHT.rm_flags; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_RIGHT_FILLING: + /* + * Setting all of a previous oldext extent to newext. + * Neither the left nor right neighbors are contiguous with + * the new one. + */ + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_flags = newext; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG: + /* + * Setting the first part of a previous oldext extent to newext. + * The left neighbor is contiguous. + */ + NEW = PREV; + error = xfs_rmap_delete(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + NEW.rm_offset += len; + NEW.rm_startblock += len; + NEW.rm_blockcount -= len; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + NEW = LEFT; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount += len; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING: + /* + * Setting the first part of a previous oldext extent to newext. + * The left neighbor is not contiguous. + */ + NEW = PREV; + error = xfs_rmap_delete(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + NEW.rm_offset += len; + NEW.rm_startblock += len; + NEW.rm_blockcount -= len; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + error = xfs_rmap_insert(cur, bno, len, owner, offset, newext); + if (error) + goto done; + break; + + case RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG: + /* + * Setting the last part of a previous oldext extent to newext. + * The right neighbor is contiguous with the new allocation. + */ + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount = offset - NEW.rm_offset; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + NEW = RIGHT; + error = xfs_rmap_delete(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + NEW.rm_offset = offset; + NEW.rm_startblock = bno; + NEW.rm_blockcount += len; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + break; + + case RMAP_RIGHT_FILLING: + /* + * Setting the last part of a previous oldext extent to newext. + * The right neighbor is not contiguous. + */ + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount -= len; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + error = xfs_rmap_insert(cur, bno, len, owner, offset, newext); + if (error) + goto done; + break; + + case 0: + /* + * Setting the middle part of a previous oldext extent to + * newext. Contiguity is impossible here. + * One extent becomes three extents. + */ + /* new right extent - oldext */ + NEW.rm_startblock = bno + len; + NEW.rm_owner = owner; + NEW.rm_offset = new_endoff; + NEW.rm_blockcount = PREV.rm_offset + PREV.rm_blockcount - + new_endoff; + NEW.rm_flags = PREV.rm_flags; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, NEW.rm_offset, + NEW.rm_flags); + if (error) + goto done; + /* new left extent - oldext */ + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount = offset - NEW.rm_offset; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + /* new middle extent - newext */ + NEW.rm_startblock = bno; + NEW.rm_blockcount = len; + NEW.rm_owner = owner; + NEW.rm_offset = offset; + NEW.rm_flags = newext; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, NEW.rm_offset, + NEW.rm_flags); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | RMAP_RIGHT_CONTIG: + case RMAP_RIGHT_FILLING | RMAP_LEFT_CONTIG | RMAP_RIGHT_CONTIG: + case RMAP_LEFT_FILLING | RMAP_RIGHT_CONTIG: + case RMAP_RIGHT_FILLING | RMAP_LEFT_CONTIG: + case RMAP_LEFT_CONTIG | RMAP_RIGHT_CONTIG: + case RMAP_LEFT_CONTIG: + case RMAP_RIGHT_CONTIG: + /* + * These cases are all impossible. + */ + ASSERT(0); + } + + trace_xfs_rmap_convert_done(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); +done: + if (error) + trace_xfs_rmap_convert_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + #undef NEW #undef LEFT #undef RIGHT @@ -1754,6 +2132,10 @@ xfs_rmap_finish_one( error = xfs_rmap_convert(rcur, bno, blockcount, !unwritten, &oinfo); break; + case XFS_RMAP_CONVERT_SHARED: + error = xfs_rmap_convert_shared(rcur, bno, blockcount, + !unwritten, &oinfo); + break; default: ASSERT(0); error = -EFSCORRUPTED; @@ -1857,7 +2239,8 @@ xfs_rmap_convert_extent( if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; - return __xfs_rmap_add(mp, dfops, XFS_RMAP_CONVERT, ip->i_ino, + return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? + XFS_RMAP_CONVERT_SHARED : XFS_RMAP_CONVERT, ip->i_ino, whichfork, PREV); } diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c index 7ecb5ae..0c96e41 100644 --- a/fs/xfs/xfs_rmap_item.c +++ b/fs/xfs/xfs_rmap_item.c @@ -514,6 +514,9 @@ xfs_rui_recover( case XFS_RMAP_EXTENT_CONVERT: type = XFS_RMAP_CONVERT; break; + case XFS_RMAP_EXTENT_CONVERT_SHARED: + type = XFS_RMAP_CONVERT_SHARED; + break; case XFS_RMAP_EXTENT_ALLOC: type = XFS_RMAP_ALLOC; break; From darrick.wong@oracle.com Thu Aug 25 18:38:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B6AE97DDA for ; Thu, 25 Aug 2016 18:38:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29B86AC001 for ; Thu, 25 Aug 2016 16:38:58 -0700 (PDT) X-ASG-Debug-ID: 1472168335-0bf57c55b41c7a00001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id RbD6pS33qf7StMsb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:38:56 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNcsMM015641 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:54 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNcrRW012162 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:38:54 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNcrpk030441; Thu, 25 Aug 2016 23:38:53 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:38:52 -0700 Subject: [PATCH 64/71] xfs: set a default CoW extent size of 32 blocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 64/71] xfs: set a default CoW extent size of 32 blocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:51 -0700 Message-ID: <147216833153.867.6545330182721132210.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168336 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1029 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the admin doesn't set a CoW extent size or a regular extent size hint, default to creating CoW reservations 32 blocks long to reduce fragmentation. Signed-off-by: DarricK J. Wong --- fs/xfs/xfs_inode.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e91fd84..8c2f9a7 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -80,7 +80,8 @@ xfs_get_extsz_hint( /* * Helper function to extract CoW extent size hint from inode. * Between the extent size hint and the CoW extent size hint, we - * return the greater of the two. + * return the greater of the two. If the value is zero (automatic), + * default to 32 blocks. */ xfs_extlen_t xfs_get_cowextsz_hint( @@ -93,9 +94,10 @@ xfs_get_cowextsz_hint( a = ip->i_d.di_cowextsize; b = xfs_get_extsz_hint(ip); - if (a > b) - return a; - return b; + a = max(a, b); + if (a == 0) + return 32; + return a; } /* From darrick.wong@oracle.com Thu Aug 25 18:39:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 92C4D7D17 for ; Thu, 25 Aug 2016 18:39:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EE54BAC003 for ; Thu, 25 Aug 2016 16:39:06 -0700 (PDT) X-ASG-Debug-ID: 1472168344-0bf57c55b11c7a00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id gDp3Nv3VGloxr509 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:39:05 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNd33Q022562 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:39:03 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNd3cM022489 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:39:03 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNd29A018372; Thu, 25 Aug 2016 23:39:03 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:39:02 -0700 Subject: [PATCH 65/71] xfs: check for invalid inode reflink flags From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 65/71] xfs: check for invalid inode reflink flags To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:38:57 -0700 Message-ID: <147216833770.867.15426310797031939448.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168345 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1818 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines We don't support sharing blocks on the realtime device. Flag inodes with the reflink or cowextsize flags set when the reflink feature is disabled. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_inode_buf.c | 16 ++++++++++++++++ fs/xfs/xfs_ioctl.c | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index 2efa42c..9778891 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -386,6 +386,9 @@ xfs_dinode_verify( xfs_ino_t ino, struct xfs_dinode *dip) { + uint16_t flags; + uint64_t flags2; + if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) return false; @@ -402,6 +405,19 @@ xfs_dinode_verify( return false; if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_meta_uuid)) return false; + + flags = be16_to_cpu(dip->di_flags); + flags2 = be64_to_cpu(dip->di_flags2); + + /* don't allow reflink/cowextsize if we don't have reflink */ + if ((flags2 & (XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE)) && + !xfs_sb_version_hasreflink(&mp->m_sb)) + return false; + + /* don't let reflink and realtime mix */ + if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags & XFS_DIFLAG_REALTIME)) + return false; + return true; } diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 4d4531ee..c99c7bb 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1035,6 +1035,10 @@ xfs_ioctl_setattr_xflags( return -EINVAL; } + /* Don't allow us to set realtime mode for a reflinked file. */ + if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip)) + return -EINVAL; + /* * Can't modify an immutable/append-only file unless * we have appropriate permission. From darrick.wong@oracle.com Thu Aug 25 18:39:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C1C5D7E9B for ; Thu, 25 Aug 2016 18:39:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36063AC004 for ; Thu, 25 Aug 2016 16:39:13 -0700 (PDT) X-ASG-Debug-ID: 1472168351-0bf57b5311209520001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id h6n8Mlt80Xk053yH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:39:11 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNd9Zo016040 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:39:10 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNd9Mg012467 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:39:09 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNd8iv029626; Thu, 25 Aug 2016 23:39:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:39:08 -0700 Subject: [PATCH 66/71] xfs: don't mix reflink and DAX mode for now From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 66/71] xfs: don't mix reflink and DAX mode for now To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:39:07 -0700 Message-ID: <147216834731.867.14351025424788799568.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168351 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2359 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since we don't have a strategy for handling both DAX and reflink, for now we'll just prohibit both being set at the same time. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_inode_buf.c | 4 ++++ fs/xfs/xfs_file.c | 4 ++++ fs/xfs/xfs_ioctl.c | 4 ++++ fs/xfs/xfs_iops.c | 1 + 4 files changed, 13 insertions(+) diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index 9778891..54817f8 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -418,6 +418,10 @@ xfs_dinode_verify( if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags & XFS_DIFLAG_REALTIME)) return false; + /* don't let reflink and dax mix */ + if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags2 & XFS_DIFLAG2_DAX)) + return false; + return true; } diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 68365ee..674d77d 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1108,6 +1108,10 @@ xfs_file_share_range( if (!S_ISREG(inode_in->i_mode) || !S_ISREG(inode_out->i_mode)) return -EINVAL; + /* Don't share DAX file data for now. */ + if (IS_DAX(inode_in) || IS_DAX(inode_out)) + return -EINVAL; + /* Are we going all the way to the end? */ isize = i_size_read(inode_in); if (isize == 0) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index c99c7bb..7007a36 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1039,6 +1039,10 @@ xfs_ioctl_setattr_xflags( if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip)) return -EINVAL; + /* Don't allow us to set DAX mode for a reflinked file for now. */ + if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip)) + return -EINVAL; + /* * Can't modify an immutable/append-only file unless * we have appropriate permission. diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index dc3f5ba5..6d6b219 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1153,6 +1153,7 @@ xfs_diflags_to_iflags( inode->i_flags |= S_NOATIME; if (S_ISREG(inode->i_mode) && ip->i_mount->m_sb.sb_blocksize == PAGE_SIZE && + !xfs_is_reflink_inode(ip) && (ip->i_mount->m_flags & XFS_MOUNT_DAX || ip->i_d.di_flags2 & XFS_DIFLAG2_DAX)) inode->i_flags |= S_DAX; From darrick.wong@oracle.com Thu Aug 25 18:39:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E3C8B7D17 for ; Thu, 25 Aug 2016 18:39:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D232AC004 for ; Thu, 25 Aug 2016 16:39:21 -0700 (PDT) X-ASG-Debug-ID: 1472168359-0bf57b5311209530001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id ppZmfkI4z45ZgNH9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:39:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNdGZh022704 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:39:16 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNdG0l022796 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:39:16 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNdF7i018414; Thu, 25 Aug 2016 23:39:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:39:14 -0700 Subject: [PATCH 67/71] xfs: fail ->bmap for reflink inodes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 67/71] xfs: fail ->bmap for reflink inodes To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:39:13 -0700 Message-ID: <147216835350.867.14512964799631563964.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168359 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1238 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines From: Christoph Hellwig Have xfs_vm_bmap return zero for reflinked files. This hack prevents using a file with shared blocks as a swap file, because we don't want to deal with CoW when we're (probably) low on memory. Signed-off-by: Christoph Hellwig [darrick.wong@oracle.com: add a more descriptive changelog] Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_aops.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index a85bc62..f564d02 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1553,6 +1553,17 @@ xfs_vm_bmap( trace_xfs_vm_bmap(XFS_I(inode)); xfs_ilock(ip, XFS_IOLOCK_SHARED); + + /* + * The swap code (ab-)uses ->bmap to get a block mapping and then + * bypasseѕ the file system for actual I/O. We really can't allow + * that on reflinks inodes, so we have to skip out here. And yes, + * 0 is the magic code for a bmap error.. + */ + if (xfs_is_reflink_inode(ip)) { + xfs_iunlock(ip, XFS_IOLOCK_SHARED); + return 0; + } filemap_write_and_wait(mapping); xfs_iunlock(ip, XFS_IOLOCK_SHARED); return generic_block_bmap(mapping, block, xfs_get_blocks); From darrick.wong@oracle.com Thu Aug 25 18:39:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DBF247EAA for ; Thu, 25 Aug 2016 18:39:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 84CD88F8035 for ; Thu, 25 Aug 2016 16:39:26 -0700 (PDT) X-ASG-Debug-ID: 1472168364-0bf8155c751e7150001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id PevkhkZs1xPFGUYL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:39:25 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNdNYY016146 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:39:23 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNdNcB012621 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:39:23 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNdLSo015757; Thu, 25 Aug 2016 23:39:22 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:39:21 -0700 Subject: [PATCH 68/71] xfs: recognize the reflink feature bit From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 68/71] xfs: recognize the reflink feature bit To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:39:19 -0700 Message-ID: <147216835974.867.6260866903649232833.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168365 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1717 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add the reflink feature flag to the set of recognized feature flags. This enables users to write to reflink filesystems. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_format.h | 3 ++- fs/xfs/xfs_super.c | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 4f2a354..bf40fa8 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -459,7 +459,8 @@ xfs_sb_has_compat_feature( #define XFS_SB_FEAT_RO_COMPAT_REFLINK (1 << 2) /* reflinked files */ #define XFS_SB_FEAT_RO_COMPAT_ALL \ (XFS_SB_FEAT_RO_COMPAT_FINOBT | \ - XFS_SB_FEAT_RO_COMPAT_RMAPBT) + XFS_SB_FEAT_RO_COMPAT_RMAPBT | \ + XFS_SB_FEAT_RO_COMPAT_REFLINK) #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool xfs_sb_has_ro_compat_feature( diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 6ef6244..2d249a5 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1596,6 +1596,9 @@ xfs_fs_fill_super( "DAX unsupported by block device. Turning off DAX."); mp->m_flags &= ~XFS_MOUNT_DAX; } + if (xfs_sb_version_hasreflink(&mp->m_sb)) + xfs_alert(mp, + "DAX and reflink have not been tested together!"); } if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { @@ -1609,6 +1612,10 @@ xfs_fs_fill_super( "EXPERIMENTAL reverse mapping btree feature enabled. Use at your own risk!"); } + if (xfs_sb_version_hasreflink(&mp->m_sb)) + xfs_alert(mp, + "EXPERIMENTAL reflink feature enabled. Use at your own risk!"); + error = xfs_mountfs(mp); if (error) goto out_filestream_unmount; From darrick.wong@oracle.com Thu Aug 25 18:39:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 21C467D17 for ; Thu, 25 Aug 2016 18:39:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88562AC004 for ; Thu, 25 Aug 2016 16:39:31 -0700 (PDT) X-ASG-Debug-ID: 1472168369-0bf57c55b21c7a30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5lpwGz1ir3HGPcrZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:39:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNdSZZ016163 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:39:28 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNdRTw022943 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:39:28 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNdRiD029687; Thu, 25 Aug 2016 23:39:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:39:27 -0700 Subject: [PATCH 69/71] xfs: various swapext cleanups From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 69/71] xfs: various swapext cleanups To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:39:25 -0700 Message-ID: <147216836590.867.2683058902048991965.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168369 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1783 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Replace structure typedefs with struct expressions and fix some whitespace issues that result. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_bmap_util.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 584e2ad..86cd7d4 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1542,8 +1542,8 @@ xfs_insert_file_space( */ static int xfs_swap_extents_check_format( - xfs_inode_t *ip, /* target inode */ - xfs_inode_t *tip) /* tmp inode */ + struct xfs_inode *ip, /* target inode */ + struct xfs_inode *tip) /* tmp inode */ { /* Should never get a local format */ @@ -1629,22 +1629,22 @@ xfs_swap_extent_flush( int xfs_swap_extents( - xfs_inode_t *ip, /* target inode */ - xfs_inode_t *tip, /* tmp inode */ - xfs_swapext_t *sxp) + struct xfs_inode *ip, /* target inode */ + struct xfs_inode *tip, /* tmp inode */ + struct xfs_swapext *sxp) { - xfs_mount_t *mp = ip->i_mount; - xfs_trans_t *tp; - xfs_bstat_t *sbp = &sxp->sx_stat; - xfs_ifork_t *tempifp, *ifp, *tifp; - int src_log_flags, target_log_flags; - int error = 0; - int aforkblks = 0; - int taforkblks = 0; - __uint64_t tmp; - int lock_flags; + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bstat *sbp = &sxp->sx_stat; + struct xfs_ifork *tempifp, *ifp, *tifp; + int src_log_flags, target_log_flags; + int error = 0; + int aforkblks = 0; + int taforkblks = 0; + __uint64_t tmp; + int lock_flags; struct xfs_ifork *cowfp; - __uint64_t f; + __uint64_t f; /* XXX: we can't do this with rmap, will fix later */ if (xfs_sb_version_hasrmapbt(&mp->m_sb)) From darrick.wong@oracle.com Thu Aug 25 18:39:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 16FBD7D17 for ; Thu, 25 Aug 2016 18:39:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 746C9AC002 for ; Thu, 25 Aug 2016 16:39:38 -0700 (PDT) X-ASG-Debug-ID: 1472168375-0bf57b5311209550001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id hp0lxDEKxq0BPGv0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:39:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNdYZW016231 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:39:35 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNdY1g012759 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:39:34 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNdXdV029802; Thu, 25 Aug 2016 23:39:33 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:39:33 -0700 Subject: [PATCH 70/71] xfs: refactor swapext code From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 70/71] xfs: refactor swapext code To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:39:32 -0700 Message-ID: <147216837209.867.2761439307500426616.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168376 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11348 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Refactor the swapext function to pull out the fork swapping piece into a separate function. In the next patch we'll add in the bit we need to make it work with rmap filesystems. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_bmap_util.c | 275 +++++++++++++++++++++++++----------------------- 1 file changed, 144 insertions(+), 131 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 86cd7d4..3bd85aa 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1627,127 +1627,37 @@ xfs_swap_extent_flush( return 0; } -int -xfs_swap_extents( - struct xfs_inode *ip, /* target inode */ - struct xfs_inode *tip, /* tmp inode */ - struct xfs_swapext *sxp) +/* Swap the extents of two files by swapping data forks. */ +STATIC int +xfs_swap_extent_forks( + struct xfs_trans *tp, + struct xfs_inode *ip, + struct xfs_inode *tip, + int *src_log_flags, + int *target_log_flags) { - struct xfs_mount *mp = ip->i_mount; - struct xfs_trans *tp; - struct xfs_bstat *sbp = &sxp->sx_stat; - struct xfs_ifork *tempifp, *ifp, *tifp; - int src_log_flags, target_log_flags; - int error = 0; + struct xfs_ifork tempifp, *ifp, *tifp; int aforkblks = 0; int taforkblks = 0; __uint64_t tmp; - int lock_flags; - struct xfs_ifork *cowfp; - __uint64_t f; - - /* XXX: we can't do this with rmap, will fix later */ - if (xfs_sb_version_hasrmapbt(&mp->m_sb)) - return -EOPNOTSUPP; - - tempifp = kmem_alloc(sizeof(xfs_ifork_t), KM_MAYFAIL); - if (!tempifp) { - error = -ENOMEM; - goto out; - } - - /* - * Lock the inodes against other IO, page faults and truncate to - * begin with. Then we can ensure the inodes are flushed and have no - * page cache safely. Once we have done this we can take the ilocks and - * do the rest of the checks. - */ - lock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; - xfs_lock_two_inodes(ip, tip, XFS_IOLOCK_EXCL); - xfs_lock_two_inodes(ip, tip, XFS_MMAPLOCK_EXCL); - - /* Verify that both files have the same format */ - if ((VFS_I(ip)->i_mode & S_IFMT) != (VFS_I(tip)->i_mode & S_IFMT)) { - error = -EINVAL; - goto out_unlock; - } - - /* Verify both files are either real-time or non-realtime */ - if (XFS_IS_REALTIME_INODE(ip) != XFS_IS_REALTIME_INODE(tip)) { - error = -EINVAL; - goto out_unlock; - } - - error = xfs_swap_extent_flush(ip); - if (error) - goto out_unlock; - error = xfs_swap_extent_flush(tip); - if (error) - goto out_unlock; - - error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); - if (error) - goto out_unlock; - - /* - * Lock and join the inodes to the tansaction so that transaction commit - * or cancel will unlock the inodes from this point onwards. - */ - xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); - lock_flags |= XFS_ILOCK_EXCL; - xfs_trans_ijoin(tp, ip, lock_flags); - xfs_trans_ijoin(tp, tip, lock_flags); - - - /* Verify all data are being swapped */ - if (sxp->sx_offset != 0 || - sxp->sx_length != ip->i_d.di_size || - sxp->sx_length != tip->i_d.di_size) { - error = -EFAULT; - goto out_trans_cancel; - } - - trace_xfs_swap_extent_before(ip, 0); - trace_xfs_swap_extent_before(tip, 1); - - /* check inode formats now that data is flushed */ - error = xfs_swap_extents_check_format(ip, tip); - if (error) { - xfs_notice(mp, - "%s: inode 0x%llx format is incompatible for exchanging.", - __func__, ip->i_ino); - goto out_trans_cancel; - } + int error; /* - * Compare the current change & modify times with that - * passed in. If they differ, we abort this swap. - * This is the mechanism used to ensure the calling - * process that the file was not changed out from - * under it. - */ - if ((sbp->bs_ctime.tv_sec != VFS_I(ip)->i_ctime.tv_sec) || - (sbp->bs_ctime.tv_nsec != VFS_I(ip)->i_ctime.tv_nsec) || - (sbp->bs_mtime.tv_sec != VFS_I(ip)->i_mtime.tv_sec) || - (sbp->bs_mtime.tv_nsec != VFS_I(ip)->i_mtime.tv_nsec)) { - error = -EBUSY; - goto out_trans_cancel; - } - /* * Count the number of extended attribute blocks */ if ( ((XFS_IFORK_Q(ip) != 0) && (ip->i_d.di_anextents > 0)) && (ip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL)) { - error = xfs_bmap_count_blocks(tp, ip, XFS_ATTR_FORK, &aforkblks); + error = xfs_bmap_count_blocks(tp, ip, XFS_ATTR_FORK, + &aforkblks); if (error) - goto out_trans_cancel; + return error; } if ( ((XFS_IFORK_Q(tip) != 0) && (tip->i_d.di_anextents > 0)) && (tip->i_d.di_aformat != XFS_DINODE_FMT_LOCAL)) { error = xfs_bmap_count_blocks(tp, tip, XFS_ATTR_FORK, - &taforkblks); + &taforkblks); if (error) - goto out_trans_cancel; + return error; } /* @@ -1756,31 +1666,23 @@ xfs_swap_extents( * buffers, and so the validation done on read will expect the owner * field to be correctly set. Once we change the owners, we can swap the * inode forks. - * - * Note the trickiness in setting the log flags - we set the owner log - * flag on the opposite inode (i.e. the inode we are setting the new - * owner to be) because once we swap the forks and log that, log - * recovery is going to see the fork as owned by the swapped inode, - * not the pre-swapped inodes. */ - src_log_flags = XFS_ILOG_CORE; - target_log_flags = XFS_ILOG_CORE; if (ip->i_d.di_version == 3 && ip->i_d.di_format == XFS_DINODE_FMT_BTREE) { - target_log_flags |= XFS_ILOG_DOWNER; + (*target_log_flags) |= XFS_ILOG_DOWNER; error = xfs_bmbt_change_owner(tp, ip, XFS_DATA_FORK, tip->i_ino, NULL); if (error) - goto out_trans_cancel; + return error; } if (tip->i_d.di_version == 3 && tip->i_d.di_format == XFS_DINODE_FMT_BTREE) { - src_log_flags |= XFS_ILOG_DOWNER; + (*src_log_flags) |= XFS_ILOG_DOWNER; error = xfs_bmbt_change_owner(tp, tip, XFS_DATA_FORK, ip->i_ino, NULL); if (error) - goto out_trans_cancel; + return error; } /* @@ -1788,9 +1690,9 @@ xfs_swap_extents( */ ifp = &ip->i_df; tifp = &tip->i_df; - *tempifp = *ifp; /* struct copy */ + tempifp = *ifp; /* struct copy */ *ifp = *tifp; /* struct copy */ - *tifp = *tempifp; /* struct copy */ + *tifp = tempifp; /* struct copy */ /* * Fix the on-disk inode values @@ -1830,12 +1732,12 @@ xfs_swap_extents( ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; } - src_log_flags |= XFS_ILOG_DEXT; + (*src_log_flags) |= XFS_ILOG_DEXT; break; case XFS_DINODE_FMT_BTREE: ASSERT(ip->i_d.di_version < 3 || - (src_log_flags & XFS_ILOG_DOWNER)); - src_log_flags |= XFS_ILOG_DBROOT; + (*src_log_flags & XFS_ILOG_DOWNER)); + (*src_log_flags) |= XFS_ILOG_DBROOT; break; } @@ -1849,15 +1751,126 @@ xfs_swap_extents( tifp->if_u1.if_extents = tifp->if_u2.if_inline_ext; } - target_log_flags |= XFS_ILOG_DEXT; + (*target_log_flags) |= XFS_ILOG_DEXT; break; case XFS_DINODE_FMT_BTREE: - target_log_flags |= XFS_ILOG_DBROOT; + (*target_log_flags) |= XFS_ILOG_DBROOT; ASSERT(tip->i_d.di_version < 3 || - (target_log_flags & XFS_ILOG_DOWNER)); + (*target_log_flags & XFS_ILOG_DOWNER)); break; } + return 0; +} + +int +xfs_swap_extents( + struct xfs_inode *ip, /* target inode */ + struct xfs_inode *tip, /* tmp inode */ + struct xfs_swapext *sxp) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bstat *sbp = &sxp->sx_stat; + int src_log_flags, target_log_flags; + int error = 0; + int lock_flags; + struct xfs_ifork *cowfp; + __uint64_t f; + + /* + * Lock the inodes against other IO, page faults and truncate to + * begin with. Then we can ensure the inodes are flushed and have no + * page cache safely. Once we have done this we can take the ilocks and + * do the rest of the checks. + */ + lock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; + xfs_lock_two_inodes(ip, tip, XFS_IOLOCK_EXCL); + xfs_lock_two_inodes(ip, tip, XFS_MMAPLOCK_EXCL); + + /* Verify that both files have the same format */ + if ((VFS_I(ip)->i_mode & S_IFMT) != (VFS_I(tip)->i_mode & S_IFMT)) { + error = -EINVAL; + goto out_unlock; + } + + /* Verify both files are either real-time or non-realtime */ + if (XFS_IS_REALTIME_INODE(ip) != XFS_IS_REALTIME_INODE(tip)) { + error = -EINVAL; + goto out_unlock; + } + + error = xfs_swap_extent_flush(ip); + if (error) + goto out_unlock; + error = xfs_swap_extent_flush(tip); + if (error) + goto out_unlock; + + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); + if (error) + goto out_unlock; + + /* + * Lock and join the inodes to the tansaction so that transaction commit + * or cancel will unlock the inodes from this point onwards. + */ + xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); + lock_flags |= XFS_ILOCK_EXCL; + xfs_trans_ijoin(tp, ip, 0); + xfs_trans_ijoin(tp, tip, 0); + + + /* Verify all data are being swapped */ + if (sxp->sx_offset != 0 || + sxp->sx_length != ip->i_d.di_size || + sxp->sx_length != tip->i_d.di_size) { + error = -EFAULT; + goto out_trans_cancel; + } + + trace_xfs_swap_extent_before(ip, 0); + trace_xfs_swap_extent_before(tip, 1); + + /* check inode formats now that data is flushed */ + error = xfs_swap_extents_check_format(ip, tip); + if (error) { + xfs_notice(mp, + "%s: inode 0x%llx format is incompatible for exchanging.", + __func__, ip->i_ino); + goto out_trans_cancel; + } + + /* + * Compare the current change & modify times with that + * passed in. If they differ, we abort this swap. + * This is the mechanism used to ensure the calling + * process that the file was not changed out from + * under it. + */ + if ((sbp->bs_ctime.tv_sec != VFS_I(ip)->i_ctime.tv_sec) || + (sbp->bs_ctime.tv_nsec != VFS_I(ip)->i_ctime.tv_nsec) || + (sbp->bs_mtime.tv_sec != VFS_I(ip)->i_mtime.tv_sec) || + (sbp->bs_mtime.tv_nsec != VFS_I(ip)->i_mtime.tv_nsec)) { + error = -EBUSY; + goto out_trans_cancel; + } + + /* + * Note the trickiness in setting the log flags - we set the owner log + * flag on the opposite inode (i.e. the inode we are setting the new + * owner to be) because once we swap the forks and log that, log + * recovery is going to see the fork as owned by the swapped inode, + * not the pre-swapped inodes. + */ + src_log_flags = XFS_ILOG_CORE; + target_log_flags = XFS_ILOG_CORE; + + error = xfs_swap_extent_forks(tp, ip, tip, &src_log_flags, + &target_log_flags); + if (error) + goto out_trans_cancel; + /* Do we have to swap reflink flags? */ if ((ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK) ^ (tip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK)) { @@ -1887,16 +1900,16 @@ xfs_swap_extents( trace_xfs_swap_extent_after(ip, 0); trace_xfs_swap_extent_after(tip, 1); -out: - kmem_free(tempifp); - return error; -out_unlock: xfs_iunlock(ip, lock_flags); xfs_iunlock(tip, lock_flags); - goto out; + return error; out_trans_cancel: xfs_trans_cancel(tp); - goto out; + +out_unlock: + xfs_iunlock(ip, lock_flags); + xfs_iunlock(tip, lock_flags); + return error; } From darrick.wong@oracle.com Thu Aug 25 18:39:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 90EF37D17 for ; Thu, 25 Aug 2016 18:39:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 12035AC002 for ; Thu, 25 Aug 2016 16:39:46 -0700 (PDT) X-ASG-Debug-ID: 1472168383-0bf81509b01df180001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id cEIrvCpaFz5yjKME (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:39:44 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNdgVq016296 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:39:42 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNdfPi024784 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:39:42 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNdebH018637; Thu, 25 Aug 2016 23:39:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:39:39 -0700 Subject: [PATCH 71/71] xfs: implement swapext for rmap filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 71/71] xfs: implement swapext for rmap filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:39:38 -0700 Message-ID: <147216837842.867.8168149197321420871.stgit@birch.djwong.org> In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168383 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7342 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Implement swapext for filesystems that have reverse mapping. Back in the reflink patches, we augmented the bmap code with a 'REMAP' flag that updates only the bmbt and doesn't touch the allocator and implemented log redo items for those two operations. Now we can rewrite extent swapping as a (looong) series of remap operations. This is far less efficient than the fork swapping method implemented in the past, so we only switch this on for rmap. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_bmap_util.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_trace.h | 5 + 2 files changed, 166 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 3bd85aa..e9b48dc 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1559,6 +1559,13 @@ xfs_swap_extents_check_format( return -EINVAL; /* + * If we have to use the (expensive) rmap swap method, we can + * handle any number of extents and any format. + */ + if (xfs_sb_version_hasrmapbt(&ip->i_mount->m_sb)) + return 0; + + /* * if the target inode is in extent form and the temp inode is in btree * form then we will end up with the target inode in the wrong format * as we already know there are less extents in the temp inode. @@ -1627,6 +1634,132 @@ xfs_swap_extent_flush( return 0; } +/* + * Move extents from one file to another, when rmap is enabled. + */ +STATIC int +xfs_swap_extent_rmap( + struct xfs_trans **tpp, + struct xfs_inode *ip, + struct xfs_inode *tip) +{ + struct xfs_bmbt_irec irec; + struct xfs_bmbt_irec uirec; + struct xfs_bmbt_irec tirec; + xfs_fileoff_t offset_fsb; + xfs_fileoff_t end_fsb; + xfs_filblks_t count_fsb; + xfs_fsblock_t firstfsb; + struct xfs_defer_ops dfops; + int done; + int error; + xfs_filblks_t ilen; + xfs_filblks_t rlen; + int nimaps; + __uint64_t tip_flags2; + + /* + * If the source file has shared blocks, we must flag the donor + * file as having shared blocks so that we get the shared-block + * rmap functions when we go to fix up the rmaps. The flags + * will be switch for reals later. + */ + tip_flags2 = tip->i_d.di_flags2; + if (ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK) + tip->i_d.di_flags2 |= XFS_DIFLAG2_REFLINK; + + offset_fsb = 0; + end_fsb = XFS_B_TO_FSB(ip->i_mount, i_size_read(VFS_I(ip))); + count_fsb = (xfs_filblks_t)(end_fsb - offset_fsb); + + while (count_fsb) { + /* Read extent from the donor file */ + nimaps = 1; + error = xfs_bmapi_read(tip, offset_fsb, count_fsb, &tirec, + &nimaps, 0); + if (error) + goto out; + ASSERT(nimaps == 1); + ASSERT(tirec.br_startblock != DELAYSTARTBLOCK); + + trace_xfs_swap_extent_rmap_remap(tip, &tirec); + ilen = tirec.br_blockcount; + + /* Unmap the old blocks in the source file. */ + done = false; + while (tirec.br_blockcount) { + xfs_defer_init(&dfops, &firstfsb); + trace_xfs_swap_extent_rmap_remap_piece(tip, &tirec); + + /* Read extent from the source file */ + nimaps = 1; + error = xfs_bmapi_read(ip, tirec.br_startoff, + tirec.br_blockcount, &irec, + &nimaps, 0); + if (error) + goto out_defer; + ASSERT(nimaps == 1); + ASSERT(tirec.br_startoff == irec.br_startoff); + trace_xfs_swap_extent_rmap_remap_piece(ip, &irec); + + /* Trim the extent. */ + uirec = tirec; + uirec.br_blockcount = rlen = min_t(xfs_filblks_t, + tirec.br_blockcount, + irec.br_blockcount); + trace_xfs_swap_extent_rmap_remap_piece(tip, &uirec); + + /* Remove the mapping from the donor file. */ + error = xfs_bmap_unmap_extent((*tpp)->t_mountp, &dfops, + tip, XFS_DATA_FORK, &uirec); + if (error) + goto out_defer; + + /* Remove the mapping from the source file. */ + error = xfs_bmap_unmap_extent((*tpp)->t_mountp, &dfops, + ip, XFS_DATA_FORK, &irec); + if (error) + goto out_defer; + + /* Map the donor file's blocks into the source file. */ + error = xfs_bmap_map_extent((*tpp)->t_mountp, &dfops, + ip, XFS_DATA_FORK, &uirec); + if (error) + goto out_defer; + + /* Map the source file's blocks into the donor file. */ + error = xfs_bmap_map_extent((*tpp)->t_mountp, &dfops, + tip, XFS_DATA_FORK, &irec); + if (error) + goto out_defer; + + error = xfs_defer_finish(tpp, &dfops, ip); + if (error) + goto out_defer; + + tirec.br_startoff += rlen; + if (tirec.br_startblock != HOLESTARTBLOCK && + tirec.br_startblock != DELAYSTARTBLOCK) + tirec.br_startblock += rlen; + tirec.br_blockcount -= rlen; + } + + /* Roll on... */ + count_fsb -= ilen; + offset_fsb += ilen; + } + + tip->i_d.di_flags2 = tip_flags2; + return 0; + +out_defer: + xfs_defer_cancel(&dfops); +out: + trace_xfs_swap_extent_rmap_error(ip, error, _RET_IP_); + tip->i_d.di_flags2 = tip_flags2; + return error; +} + /* Swap the extents of two files by swapping data forks. */ STATIC int xfs_swap_extent_forks( @@ -1777,6 +1910,7 @@ xfs_swap_extents( int lock_flags; struct xfs_ifork *cowfp; __uint64_t f; + int resblks; /* * Lock the inodes against other IO, page faults and truncate to @@ -1807,7 +1941,28 @@ xfs_swap_extents( if (error) goto out_unlock; - error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); + /* + * Extent "swapping" with rmap requires a permanent reservation and + * a block reservation because it's really just a remap operation + * performed with log redo items! + */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + /* + * Conceptually this shouldn't affect the shape of either + * bmbt, but since we atomically move extents one by one, + * we reserve enough space to rebuild both trees. + */ + resblks = XFS_NEXTENTADD_SPACE_RES(mp, + XFS_IFORK_NEXTENTS(ip, XFS_DATA_FORK), + XFS_DATA_FORK) + + XFS_NEXTENTADD_SPACE_RES(mp, + XFS_IFORK_NEXTENTS(tip, XFS_DATA_FORK), + XFS_DATA_FORK); + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, + 0, 0, &tp); + } else + error = xfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, + 0, 0, &tp); if (error) goto out_unlock; @@ -1866,8 +2021,11 @@ xfs_swap_extents( src_log_flags = XFS_ILOG_CORE; target_log_flags = XFS_ILOG_CORE; - error = xfs_swap_extent_forks(tp, ip, tip, &src_log_flags, - &target_log_flags); + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + error = xfs_swap_extent_rmap(&tp, ip, tip); + else + error = xfs_swap_extent_forks(tp, ip, tip, &src_log_flags, + &target_log_flags); if (error) goto out_trans_cancel; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 8b1f803..f980cca 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -3345,6 +3345,11 @@ DEFINE_INODE_EVENT(xfs_reflink_cancel_pending_cow); DEFINE_INODE_IREC_EVENT(xfs_reflink_cancel_cow); DEFINE_INODE_ERROR_EVENT(xfs_reflink_cancel_pending_cow_error); +/* rmap swapext tracepoints */ +DEFINE_INODE_IREC_EVENT(xfs_swap_extent_rmap_remap); +DEFINE_INODE_IREC_EVENT(xfs_swap_extent_rmap_remap_piece); +DEFINE_INODE_ERROR_EVENT(xfs_swap_extent_rmap_error); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH From darrick.wong@oracle.com Thu Aug 25 18:40:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D89487EC5 for ; Thu, 25 Aug 2016 18:40:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4063DAC001 for ; Thu, 25 Aug 2016 16:40:20 -0700 (PDT) X-ASG-Debug-ID: 1472168418-0bf57c55b31c7a80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 101sGUCefcIs1Sxq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:40:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNeHSD016858 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:17 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNeGap026481 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:17 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNeEnl016042; Thu, 25 Aug 2016 23:40:16 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:14 -0700 Subject: [PATCH v8 00/25] xfs: online scrub support From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 00/25] xfs: online scrub support To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:40:13 -0700 Message-ID: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168418 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3010 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. Online scrub support consists of three pieces -- first, an ioctl that maps physical extents to their owners; second, various in-kernel metadata scrubbing ioctls to examine metadata records and cross-reference them with other filesystem metadata; and third, a userspace component to initiate kernel scrubbing, walk all inodes and the directory tree, and scrub data extents. The first few patches in this series implements the GETFSMAP ioctl that maps a device number and physical extent either to filesystem metadata or to a range of file blocks. The initial implementation uses the reverse-mapping B+tree to supply the mapping information, however a fallback implementation based on the free space btrees is also provided. The flexibility of having both implementations is important when it comes to the userspace tool -- even without the owner/offset data, we still have enough information to set up a read verification. The bulk of the patches implement in-kernel scrubbing. This is implemented as a new ioctl. Pass in a metadata type and a control number (when applicable); the kernel will examine each record in that metadata structure looking for obvious logical errors. External corruption should be discoverable via the checksum embedded in each (v5) filesystem metadata block. When applicable, the metadata record will be cross-referenced with the other metadata structures to look for discrepancies. Should any errors be found, an error code is returned to userspace, which should take the filesystem offline and repair it. The final patch in the series enables xfs_scrub to query the per-AG block reservations so that the summary counters can be sanity-checked. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:40:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AC6947ECD for ; Thu, 25 Aug 2016 18:40:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E670304039 for ; Thu, 25 Aug 2016 16:40:27 -0700 (PDT) X-ASG-Debug-ID: 1472168423-0bf57b53122095b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id S6tssTSpGLsnP88T (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:40:23 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNeMek016919 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:22 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNeLV3026733 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:22 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNeLvr016074; Thu, 25 Aug 2016 23:40:21 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:20 -0700 Subject: [PATCH 01/25] xfs: introduce the XFS_IOC_GETFSMAP ioctl From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/25] xfs: introduce the XFS_IOC_GETFSMAP ioctl To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:40:19 -0700 Message-ID: <147216841930.3108.11870767716212371622.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168423 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 30178 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Introduce a new ioctl that uses the reverse mapping btree to return information about the physical layout of the filesystem. v2: shorten the device field to u32 since that's all we need for dev_t. Support reporting reverse mapping information for all the devices that XFS supports (data, log). v3: don't call the function that reports the journalling log rmap if we don't have an external device, since the regular rmapbt will take care of that. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_fs.h | 65 +++++ fs/xfs/xfs_fsmap.c | 571 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_fsmap.h | 29 ++ fs/xfs/xfs_ioctl.c | 77 ++++++ fs/xfs/xfs_ioctl32.c | 1 fs/xfs/xfs_trace.h | 85 +++++++ 7 files changed, 829 insertions(+) create mode 100644 fs/xfs/xfs_fsmap.c create mode 100644 fs/xfs/xfs_fsmap.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 26ef195..5c90f82 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -79,6 +79,7 @@ xfs-y += xfs_aops.o \ xfs_extent_busy.o \ xfs_file.o \ xfs_filestream.o \ + xfs_fsmap.o \ xfs_fsops.o \ xfs_globals.o \ xfs_icache.o \ diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 10ebf99..58e14b14e 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -93,6 +93,70 @@ struct getbmapx { #define BMV_OF_SHARED 0x8 /* segment shared with another file */ /* + * Structure for XFS_IOC_GETFSMAP. + * + * Similar to XFS_IOC_GETBMAPX, the first two elements in the array are + * used to constrain the output. The first element in the array should + * represent the lowest disk address that the user wants to learn about. + * The second element in the array should represent the highest disk + * address to query. Subsequent array elements will be filled out by the + * command. + * + * The fmv_iflags field is only used in the first structure. The + * fmv_oflags field is filled in for each returned structure after the + * second structure. The fmv_unused1 fields in the first two array + * elements must be zero. + * + * The fmv_count, fmv_entries, and fmv_iflags fields in the second array + * element must be zero. + * + * fmv_block, fmv_offset, and fmv_length are expressed in units of 512 + * byte sectors. + */ +#ifndef HAVE_GETFSMAP +struct getfsmap { + __u32 fmv_device; /* device id */ + __u32 fmv_unused1; /* future use, must be zero */ + __u64 fmv_block; /* starting block */ + __u64 fmv_owner; /* owner id */ + __u64 fmv_offset; /* file offset of segment */ + __u64 fmv_length; /* length of segment, blocks */ + __u32 fmv_oflags; /* mapping flags */ + __u32 fmv_iflags; /* control flags (1st structure) */ + __u32 fmv_count; /* # of entries in array incl. input */ + __u32 fmv_entries; /* # of entries filled in (output). */ + __u64 fmv_unused2; /* future use, must be zero */ +}; +#endif + +/* fmv_iflags values - set by XFS_IOC_GETFSMAP caller in the header. */ +/* no flags defined yet */ +#define FMV_HIF_VALID 0 + +/* fmv_oflags values - returned in the header segment only. */ +#define FMV_HOF_DEV_T 0x1 /* fmv_device values will be dev_t */ + +/* fmv_flags values - returned for each non-header segment */ +#define FMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ +#define FMV_OF_ATTR_FORK 0x2 /* segment = attribute fork */ +#define FMV_OF_EXTENT_MAP 0x4 /* segment = extent map */ +#define FMV_OF_SHARED 0x8 /* segment = shared with another file */ +#define FMV_OF_SPECIAL_OWNER 0x10 /* owner is a special value */ +#define FMV_OF_LAST 0x20 /* segment is the last in the FS */ + +/* fmv_owner special values */ +#define FMV_OWN_FREE (-1ULL) /* free space */ +#define FMV_OWN_UNKNOWN (-2ULL) /* unknown owner */ +#define FMV_OWN_FS (-3ULL) /* static fs metadata */ +#define FMV_OWN_LOG (-4ULL) /* journalling log */ +#define FMV_OWN_AG (-5ULL) /* per-AG metadata */ +#define FMV_OWN_INOBT (-6ULL) /* inode btree blocks */ +#define FMV_OWN_INODES (-7ULL) /* inodes */ +#define FMV_OWN_REFC (-8ULL) /* refcount tree */ +#define FMV_OWN_COW (-9ULL) /* cow staging */ +#define FMV_OWN_DEFECTIVE (-10ULL) /* bad blocks */ + +/* * Structure for XFS_IOC_FSSETDM. * For use by backup and restore programs to set the XFS on-disk inode * fields di_dmevmask and di_dmstate. These must be set to exactly and @@ -502,6 +566,7 @@ typedef struct xfs_swapext #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_fs_eofblocks) +#define XFS_IOC_GETFSMAP _IOWR('X', 59, struct getfsmap) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c new file mode 100644 index 0000000..a167acb --- /dev/null +++ b/fs/xfs/xfs_fsmap.c @@ -0,0 +1,571 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_inode.h" +#include "xfs_trans.h" +#include "xfs_error.h" +#include "xfs_btree.h" +#include "xfs_rmap_btree.h" +#include "xfs_trace.h" +#include "xfs_log.h" +#include "xfs_rmap.h" +#include "xfs_alloc.h" +#include "xfs_bit.h" +#include "xfs_fsmap.h" + +/* getfsmap query state */ +struct xfs_getfsmap_info { + struct getfsmap *fmv; /* vector header */ + xfs_fsmap_format_t formatter; /* formatting fn */ + void *format_arg; /* format buffer */ + bool last; /* last extent? */ + xfs_daddr_t next_daddr; /* next daddr we expect */ + u32 dev; /* device id */ + u64 missing_owner; /* owner of holes */ + + xfs_agnumber_t agno; /* AG number, if applicable */ + struct xfs_buf *agbp; /* AGF, for refcount queries */ + struct xfs_rmap_irec low; /* low rmap key */ + struct xfs_rmap_irec high; /* high rmap key */ +}; + +/* Associate a device with a getfsmap handler. */ +struct xfs_getfsmap_dev { + u32 dev; + int (*fn)(struct xfs_mount *mp, + struct getfsmap *keys, + struct xfs_getfsmap_info *info); +}; + +/* Compare two getfsmap device handlers. */ +static int +xfs_getfsmap_dev_compare( + const void *p1, + const void *p2) +{ + const struct xfs_getfsmap_dev *d1 = p1; + const struct xfs_getfsmap_dev *d2 = p2; + + return d1->dev - d2->dev; +} + +/* Compare a record against our starting point */ +static bool +xfs_getfsmap_rec_before_low_key( + struct xfs_getfsmap_info *info, + struct xfs_rmap_irec *rec) +{ + uint64_t x, y; + + if (rec->rm_startblock < info->low.rm_startblock) + return true; + if (rec->rm_startblock > info->low.rm_startblock) + return false; + + if (rec->rm_owner < info->low.rm_owner) + return true; + if (rec->rm_owner > info->low.rm_owner) + return false; + + x = xfs_rmap_irec_offset_pack(rec); + y = xfs_rmap_irec_offset_pack(&info->low); + if (x < y) + return true; + return false; +} + +/* + * Format a reverse mapping for getfsmap, having translated rm_startblock + * into the appropriate daddr units. + */ +STATIC int +xfs_getfsmap_helper( + struct xfs_mount *mp, + struct xfs_getfsmap_info *info, + struct xfs_rmap_irec *rec, + xfs_daddr_t rec_daddr) +{ + struct getfsmap fmv; + xfs_daddr_t key_end; + int error; + + /* + * Filter out records that start before our startpoint, if the + * caller requested that. + */ + if (info->fmv->fmv_length && + xfs_getfsmap_rec_before_low_key(info, rec)) { + rec_daddr += XFS_FSB_TO_BB(mp, rec->rm_blockcount); + if (info->next_daddr < rec_daddr) + info->next_daddr = rec_daddr; + return XFS_BTREE_QUERY_RANGE_CONTINUE; + } + + /* + * If the caller passed in a length with the low record and + * the record represents a file data extent, we incremented + * the offset in the low key by the length in the hopes of + * finding reverse mappings for the physical blocks we just + * saw. We did /not/ increment next_daddr by the length + * because the range query would not be able to find shared + * extents within the same physical block range. + * + * However, the extent we've been fed could have a startblock + * past the passed-in low record. If this is the case, + * advance next_daddr to the end of the passed-in low record + * so we don't report the extent prior to this extent as + * free. + */ + key_end = info->fmv->fmv_block + info->fmv->fmv_length; + if (info->dev == info->fmv->fmv_device && + info->next_daddr < key_end && rec_daddr >= key_end) + info->next_daddr = key_end; + + /* Are we just counting mappings? */ + if (info->fmv->fmv_count == 2) { + if (rec_daddr > info->next_daddr) + info->fmv->fmv_entries++; + + if (info->last) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + + info->fmv->fmv_entries++; + + rec_daddr += XFS_FSB_TO_BB(mp, rec->rm_blockcount); + if (info->next_daddr < rec_daddr) + info->next_daddr = rec_daddr; + return XFS_BTREE_QUERY_RANGE_CONTINUE; + } + + /* + * If the record starts past the last physical block we saw, + * then we've found some free space. Report that too. + */ + if (rec_daddr > info->next_daddr) { + if (info->fmv->fmv_entries >= info->fmv->fmv_count - 2) + return XFS_BTREE_QUERY_RANGE_ABORT; + + trace_xfs_fsmap_mapping(mp, info->dev, info->agno, + XFS_DADDR_TO_FSB(mp, info->next_daddr), + XFS_DADDR_TO_FSB(mp, rec_daddr - + info->next_daddr), + info->missing_owner, 0); + + fmv.fmv_device = info->dev; + fmv.fmv_block = info->next_daddr; + fmv.fmv_owner = info->missing_owner; + fmv.fmv_offset = 0; + fmv.fmv_length = rec_daddr - info->next_daddr; + fmv.fmv_oflags = FMV_OF_SPECIAL_OWNER; + fmv.fmv_count = 0; + fmv.fmv_entries = 0; + fmv.fmv_unused1 = 0; + fmv.fmv_unused2 = 0; + error = info->formatter(&fmv, info->format_arg); + if (error) + return error; + info->fmv->fmv_entries++; + } + + if (info->last) + goto out; + + /* Fill out the extent we found */ + if (info->fmv->fmv_entries >= info->fmv->fmv_count - 2) + return XFS_BTREE_QUERY_RANGE_ABORT; + + trace_xfs_fsmap_mapping(mp, info->dev, info->agno, + rec->rm_startblock, rec->rm_blockcount, rec->rm_owner, + rec->rm_offset); + + fmv.fmv_device = info->dev; + fmv.fmv_block = rec_daddr; + fmv.fmv_owner = rec->rm_owner; + fmv.fmv_offset = XFS_FSB_TO_BB(mp, rec->rm_offset); + fmv.fmv_length = XFS_FSB_TO_BB(mp, rec->rm_blockcount); + fmv.fmv_oflags = 0; + fmv.fmv_count = 0; + fmv.fmv_entries = 0; + fmv.fmv_unused1 = 0; + fmv.fmv_unused2 = 0; + if (XFS_RMAP_NON_INODE_OWNER(rec->rm_owner)) + fmv.fmv_oflags |= FMV_OF_SPECIAL_OWNER; + if (rec->rm_flags & XFS_RMAP_UNWRITTEN) + fmv.fmv_oflags |= FMV_OF_PREALLOC; + if (rec->rm_flags & XFS_RMAP_ATTR_FORK) + fmv.fmv_oflags |= FMV_OF_ATTR_FORK; + if (rec->rm_flags & XFS_RMAP_BMBT_BLOCK) + fmv.fmv_oflags |= FMV_OF_EXTENT_MAP; + error = info->formatter(&fmv, info->format_arg); + if (error) + return error; + info->fmv->fmv_entries++; + +out: + rec_daddr += XFS_FSB_TO_BB(mp, rec->rm_blockcount); + if (info->next_daddr < rec_daddr) + info->next_daddr = rec_daddr; + return XFS_BTREE_QUERY_RANGE_CONTINUE; +} + +/* Transform a rmapbt irec into a fsmap */ +STATIC int +xfs_getfsmap_datadev_helper( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *rec, + void *priv) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_getfsmap_info *info = priv; + xfs_fsblock_t fsb; + xfs_daddr_t rec_daddr; + + fsb = XFS_AGB_TO_FSB(mp, cur->bc_private.a.agno, + rec->rm_startblock); + rec_daddr = XFS_FSB_TO_DADDR(mp, fsb); + + return xfs_getfsmap_helper(mp, info, rec, rec_daddr); +} + +/* Transform a absolute-startblock rmap (rtdev, logdev) into a fsmap */ +STATIC int +xfs_getfsmap_rtdev_helper( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *rec, + void *priv) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_getfsmap_info *info = priv; + xfs_daddr_t rec_daddr; + + rec_daddr = XFS_FSB_TO_BB(mp, rec->rm_startblock); + + return xfs_getfsmap_helper(mp, info, rec, rec_daddr); +} + +/* Set rmap flags based on the getfsmap flags */ +static void +xfs_getfsmap_set_irec_flags( + struct xfs_rmap_irec *irec, + struct getfsmap *fmv) +{ + irec->rm_flags = 0; + if (fmv->fmv_oflags & FMV_OF_ATTR_FORK) + irec->rm_flags |= XFS_RMAP_ATTR_FORK; + if (fmv->fmv_oflags & FMV_OF_EXTENT_MAP) + irec->rm_flags |= XFS_RMAP_BMBT_BLOCK; + if (fmv->fmv_oflags & FMV_OF_PREALLOC) + irec->rm_flags |= XFS_RMAP_UNWRITTEN; +} + +/* Execute a getfsmap query against the log device. */ +STATIC int +xfs_getfsmap_logdev( + struct xfs_mount *mp, + struct getfsmap *keys, + struct xfs_getfsmap_info *info) +{ + struct xfs_btree_cur cur; + struct getfsmap *lowkey = keys; + struct xfs_rmap_irec rmap; + + /* Set up search keys */ + info->low.rm_startblock = XFS_BB_TO_FSBT(mp, lowkey->fmv_block); + info->low.rm_offset = XFS_BB_TO_FSBT(mp, lowkey->fmv_offset); + info->low.rm_owner = lowkey->fmv_owner; + info->low.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->low, lowkey); + + info->high.rm_startblock = -1U; + info->high.rm_owner = ULLONG_MAX; + info->high.rm_offset = ULLONG_MAX; + info->high.rm_blockcount = 0; + info->high.rm_flags = XFS_RMAP_KEY_FLAGS | XFS_RMAP_REC_FLAGS; + info->missing_owner = FMV_OWN_FREE; + + trace_xfs_fsmap_low_key(mp, info->dev, info->agno, + info->low.rm_startblock, + info->low.rm_blockcount, + info->low.rm_owner, + info->low.rm_offset); + + trace_xfs_fsmap_high_key(mp, info->dev, info->agno, + info->high.rm_startblock, + info->high.rm_blockcount, + info->high.rm_owner, + info->high.rm_offset); + + + if (lowkey->fmv_block > 0) + return 0; + + rmap.rm_startblock = 0; + rmap.rm_blockcount = mp->m_sb.sb_logblocks; + rmap.rm_owner = XFS_RMAP_OWN_LOG; + rmap.rm_offset = 0; + rmap.rm_flags = 0; + + cur.bc_mp = mp; + return xfs_getfsmap_rtdev_helper(&cur, &rmap, info); +} + +/* Execute a getfsmap query against the regular data device. */ +STATIC int +xfs_getfsmap_datadev( + struct xfs_mount *mp, + struct getfsmap *keys, + struct xfs_getfsmap_info *info) +{ + struct xfs_btree_cur *bt_cur = NULL; + struct getfsmap *lowkey; + struct getfsmap *highkey; + xfs_fsblock_t start_fsb; + xfs_fsblock_t end_fsb; + xfs_agnumber_t start_ag; + xfs_agnumber_t end_ag; + xfs_daddr_t eofs; + int error = 0; + + lowkey = keys; + highkey = keys + 1; + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); + if (lowkey->fmv_block >= eofs) + return 0; + if (highkey->fmv_block >= eofs) + highkey->fmv_block = eofs - 1; + start_fsb = XFS_DADDR_TO_FSB(mp, lowkey->fmv_block); + end_fsb = XFS_DADDR_TO_FSB(mp, highkey->fmv_block); + + /* Set up search keys */ + info->low.rm_startblock = XFS_FSB_TO_AGBNO(mp, start_fsb); + info->low.rm_offset = XFS_BB_TO_FSBT(mp, lowkey->fmv_offset); + info->low.rm_owner = lowkey->fmv_owner; + info->low.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->low, lowkey); + + info->high.rm_startblock = -1U; + info->high.rm_owner = ULLONG_MAX; + info->high.rm_offset = ULLONG_MAX; + info->high.rm_blockcount = 0; + info->high.rm_flags = XFS_RMAP_KEY_FLAGS | XFS_RMAP_REC_FLAGS; + info->missing_owner = FMV_OWN_FREE; + + start_ag = XFS_FSB_TO_AGNO(mp, start_fsb); + end_ag = XFS_FSB_TO_AGNO(mp, end_fsb); + + /* Query each AG */ + for (info->agno = start_ag; info->agno <= end_ag; info->agno++) { + if (info->agno == end_ag) { + info->high.rm_startblock = XFS_FSB_TO_AGBNO(mp, + end_fsb); + info->high.rm_offset = XFS_BB_TO_FSBT(mp, + highkey->fmv_offset); + info->high.rm_owner = highkey->fmv_owner; + xfs_getfsmap_set_irec_flags(&info->high, highkey); + } + + if (bt_cur) { + xfs_btree_del_cursor(bt_cur, XFS_BTREE_NOERROR); + xfs_buf_relse(info->agbp); + bt_cur = NULL; + info->agbp = NULL; + } + + error = xfs_alloc_read_agf(mp, NULL, info->agno, 0, + &info->agbp); + if (error) + goto err; + + trace_xfs_fsmap_low_key(mp, info->dev, info->agno, + info->low.rm_startblock, + info->low.rm_blockcount, + info->low.rm_owner, + info->low.rm_offset); + + trace_xfs_fsmap_high_key(mp, info->dev, info->agno, + info->high.rm_startblock, + info->high.rm_blockcount, + info->high.rm_owner, + info->high.rm_offset); + + bt_cur = xfs_rmapbt_init_cursor(mp, NULL, info->agbp, + info->agno); + error = xfs_rmap_query_range(bt_cur, &info->low, &info->high, + xfs_getfsmap_datadev_helper, info); + if (error) + goto err; + + if (info->agno == start_ag) { + info->low.rm_startblock = 0; + info->low.rm_owner = 0; + info->low.rm_offset = 0; + info->low.rm_flags = 0; + } + } + + /* Report any free space at the end of the AG */ + info->last = true; + error = xfs_getfsmap_datadev_helper(bt_cur, &info->high, info); + if (error) + goto err; + +err: + if (bt_cur) + xfs_btree_del_cursor(bt_cur, error < 0 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + if (info->agbp) { + xfs_buf_relse(info->agbp); + info->agbp = NULL; + } + + return error; +} + +/* Do we recognize the device? */ +STATIC bool +xfs_getfsmap_is_valid_device( + struct xfs_mount *mp, + struct getfsmap *fmv) +{ + if (fmv->fmv_device == 0 || fmv->fmv_device == UINT_MAX || + fmv->fmv_device == new_encode_dev(mp->m_ddev_targp->bt_dev)) + return true; + if (mp->m_logdev_targp && + fmv->fmv_device == new_encode_dev(mp->m_logdev_targp->bt_dev)) + return true; + return false; +} + +#define XFS_GETFSMAP_DEVS 3 +/* + * Get filesystem's extents as described in fmv, and format for + * output. Calls formatter to fill the user's buffer until all + * extents are mapped, until the passed-in fmv->fmv_count slots have + * been filled, or until the formatter short-circuits the loop, if it + * is tracking filled-in extents on its own. + */ +int +xfs_getfsmap( + struct xfs_mount *mp, + struct getfsmap *fmv_low, + xfs_fsmap_format_t formatter, + void *arg) +{ + struct getfsmap *fmv_high; + struct getfsmap keys[2]; + struct xfs_getfsmap_dev handlers[XFS_GETFSMAP_DEVS]; + struct xfs_getfsmap_info info; + int i; + int error = 0; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return -EOPNOTSUPP; + if (fmv_low->fmv_count < 2) + return -EINVAL; + if (fmv_low->fmv_iflags & (~FMV_HIF_VALID)) + return -EINVAL; + fmv_high = fmv_low + 1; + if (!xfs_getfsmap_is_valid_device(mp, fmv_low) || + !xfs_getfsmap_is_valid_device(mp, fmv_high) || + fmv_high->fmv_iflags || fmv_high->fmv_count || + fmv_high->fmv_length || fmv_high->fmv_entries || + fmv_high->fmv_unused1 || fmv_low->fmv_unused1 || + fmv_high->fmv_unused2 || fmv_low->fmv_unused2) + return -EINVAL; + + fmv_low->fmv_entries = 0; + + /* Set up our device handlers. */ + memset(handlers, 0, sizeof(handlers)); + handlers[0].dev = new_encode_dev(mp->m_ddev_targp->bt_dev); + handlers[0].fn = xfs_getfsmap_datadev; + if (mp->m_logdev_targp != mp->m_ddev_targp) { + handlers[1].dev = new_encode_dev(mp->m_logdev_targp->bt_dev); + handlers[1].fn = xfs_getfsmap_logdev; + } + + xfs_sort(handlers, XFS_GETFSMAP_DEVS, sizeof(struct xfs_getfsmap_dev), + xfs_getfsmap_dev_compare); + + /* + * Since we allow the user to copy the last fmv item from a previous + * call into the low key slot, we have to advance the low key by + * whatever the reported length is. If the offset field doesn't apply, + * move up the start block to the next extent and start over with the + * lowest owner/offset possible; otherwise it's file data, so move up + * the offset only. + */ + keys[0] = *fmv_low; + if (keys[0].fmv_oflags & (FMV_OF_SPECIAL_OWNER | FMV_OF_EXTENT_MAP)) { + keys[0].fmv_block += fmv_low->fmv_length; + keys[0].fmv_owner = 0; + keys[0].fmv_offset = 0; + } else + keys[0].fmv_offset += fmv_low->fmv_length; + memset(keys + 1, 0xFF, sizeof(struct getfsmap)); + + memset(&info, 0, sizeof(info)); + info.fmv = fmv_low; + info.formatter = formatter; + info.format_arg = arg; + + /* For each device we support... */ + for (i = 0; i < XFS_GETFSMAP_DEVS; i++) { + /* Is this device within the range the user asked for? */ + if (!handlers[i].fn) + continue; + if (fmv_low->fmv_device > handlers[i].dev) + continue; + if (fmv_high->fmv_device < handlers[i].dev) + break; + + /* + * If this device number matches the high key, we have + * to pass the high key to the handler to limit the + * query results. If the device number exceeds the + * low key, zero out the low key so that we get + * everything from the beginning. + */ + if (handlers[i].dev == fmv_high->fmv_device) + keys[1] = *fmv_high; + if (handlers[i].dev > fmv_low->fmv_device) + memset(keys, 0, sizeof(struct getfsmap)); + + info.next_daddr = keys[0].fmv_block; + info.dev = handlers[i].dev; + info.last = false; + info.agno = NULLAGNUMBER; + error = handlers[i].fn(mp, keys, &info); + if (error) + break; + + } + + fmv_low->fmv_oflags = FMV_HOF_DEV_T; + return error; +} diff --git a/fs/xfs/xfs_fsmap.h b/fs/xfs/xfs_fsmap.h new file mode 100644 index 0000000..d1d0549 --- /dev/null +++ b/fs/xfs/xfs_fsmap.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_FSMAP_H__ +#define __XFS_FSMAP_H__ + +/* fsmap to userspace formatter - copy to user & advance pointer */ +typedef int (*xfs_fsmap_format_t)(struct getfsmap *, void *); + +int xfs_getfsmap(struct xfs_mount *mp, struct getfsmap *fmv, + xfs_fsmap_format_t formatter, void *arg); + +#endif /* __XFS_FSMAP_H__ */ diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 7007a36..936cb45 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -42,6 +42,8 @@ #include "xfs_pnfs.h" #include "xfs_acl.h" #include "xfs_reflink.h" +#include "xfs_btree.h" +#include "xfs_fsmap.h" #include #include @@ -1614,6 +1616,76 @@ xfs_ioc_getbmapx( return 0; } +struct getfsmap_info { + struct xfs_mount *mp; + struct getfsmap __user *data; + __s64 last_flags; +}; + +STATIC int +xfs_getfsmap_format(struct getfsmap *fmv, void *priv) +{ + struct getfsmap_info *info = priv; + + trace_xfs_getfsmap_mapping(info->mp, fmv->fmv_device, fmv->fmv_block, + fmv->fmv_length, fmv->fmv_owner, + fmv->fmv_offset, fmv->fmv_oflags); + + info->last_flags = fmv->fmv_oflags; + if (copy_to_user(info->data, fmv, sizeof(struct getfsmap))) + return -EFAULT; + + info->data++; + return 0; +} + +STATIC int +xfs_ioc_getfsmap( + struct xfs_inode *ip, + void __user *arg) +{ + struct getfsmap_info info; + struct getfsmap fmx[2]; + bool aborted = false; + int error; + + if (copy_from_user(&fmx, arg, 2 * sizeof(struct getfsmap))) + return -EFAULT; + + trace_xfs_getfsmap_low_key(ip->i_mount, fmx[0].fmv_device, + fmx[0].fmv_block, fmx[0].fmv_length, fmx[0].fmv_owner, + fmx[0].fmv_offset, fmx[0].fmv_oflags); + + trace_xfs_getfsmap_high_key(ip->i_mount, fmx[1].fmv_device, + fmx[1].fmv_block, fmx[1].fmv_length, fmx[1].fmv_owner, + fmx[1].fmv_offset, fmx[1].fmv_oflags); + + info.mp = ip->i_mount; + info.data = (__force struct getfsmap *)arg + 2; + error = xfs_getfsmap(ip->i_mount, fmx, xfs_getfsmap_format, &info); + if (error == XFS_BTREE_QUERY_RANGE_ABORT) { + error = 0; + aborted = true; + } + if (error) + return error; + + /* If we didn't abort, set the "last" flag in the last fmx */ + if (!aborted && fmx[0].fmv_entries) { + info.data--; + info.last_flags |= FMV_OF_LAST; + if (copy_to_user(&info.data->fmv_oflags, &info.last_flags, + sizeof(info.last_flags))) + return -EFAULT; + } + + /* copy back header */ + if (copy_to_user(arg, fmx, 2 * sizeof(struct getfsmap))) + return -EFAULT; + + return 0; +} + int xfs_ioc_swapext( xfs_swapext_t *sxp) @@ -1794,6 +1866,11 @@ xfs_file_ioctl( case XFS_IOC_GETBMAPX: return xfs_ioc_getbmapx(ip, arg); + case XFS_IOC_GETFSMAP: + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + return xfs_ioc_getfsmap(ip, arg); + case XFS_IOC_FD_TO_HANDLE: case XFS_IOC_PATH_TO_HANDLE: case XFS_IOC_PATH_TO_FSHANDLE: { diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 321f577..9491bc8 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -554,6 +554,7 @@ xfs_file_compat_ioctl( case XFS_IOC_GOINGDOWN: case XFS_IOC_ERROR_INJECTION: case XFS_IOC_ERROR_CLEARALL: + case XFS_IOC_GETFSMAP: return xfs_file_ioctl(filp, cmd, p); #ifndef BROKEN_X86_ALIGNMENT /* These are handled fine if no alignment issues */ diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index f980cca..03b5505 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -3350,6 +3350,91 @@ DEFINE_INODE_IREC_EVENT(xfs_swap_extent_rmap_remap); DEFINE_INODE_IREC_EVENT(xfs_swap_extent_rmap_remap_piece); DEFINE_INODE_ERROR_EVENT(xfs_swap_extent_rmap_error); +/* fsmap traces */ +DECLARE_EVENT_CLASS(xfs_fsmap_class, + TP_PROTO(struct xfs_mount *mp, u32 keydev, xfs_agnumber_t agno, + xfs_fsblock_t bno, xfs_filblks_t len, __uint64_t owner, + __uint64_t offset), + TP_ARGS(mp, keydev, agno, bno, len, owner, offset), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(dev_t, keydev) + __field(xfs_agnumber_t, agno) + __field(xfs_fsblock_t, bno) + __field(xfs_filblks_t, len) + __field(__uint64_t, owner) + __field(__uint64_t, offset) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->keydev = new_decode_dev(keydev); + __entry->agno = agno; + __entry->bno = bno; + __entry->len = len; + __entry->owner = owner; + __entry->offset = offset; + ), + TP_printk("dev %d:%d keydev %d:%d agno %u bno %llu len %llu owner %lld offset 0x%llx\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + MAJOR(__entry->keydev), MINOR(__entry->keydev), + __entry->agno, + __entry->bno, + __entry->len, + __entry->owner, + __entry->offset) +) +#define DEFINE_FSMAP_EVENT(name) \ +DEFINE_EVENT(xfs_fsmap_class, name, \ + TP_PROTO(struct xfs_mount *mp, u32 keydev, xfs_agnumber_t agno, \ + xfs_fsblock_t bno, xfs_filblks_t len, __uint64_t owner, \ + __uint64_t offset), \ + TP_ARGS(mp, keydev, agno, bno, len, owner, offset)) +DEFINE_FSMAP_EVENT(xfs_fsmap_low_key); +DEFINE_FSMAP_EVENT(xfs_fsmap_high_key); +DEFINE_FSMAP_EVENT(xfs_fsmap_mapping); + +DECLARE_EVENT_CLASS(xfs_getfsmap_class, + TP_PROTO(struct xfs_mount *mp, u32 keydev, xfs_daddr_t block, + xfs_daddr_t len, __uint64_t owner, __uint64_t offset, + __uint64_t flags), + TP_ARGS(mp, keydev, block, len, owner, offset, flags), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(dev_t, keydev) + __field(xfs_daddr_t, block) + __field(xfs_daddr_t, len) + __field(__uint64_t, owner) + __field(__uint64_t, offset) + __field(__uint64_t, flags) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->keydev = new_decode_dev(keydev); + __entry->block = block; + __entry->len = len; + __entry->owner = owner; + __entry->offset = offset; + __entry->flags = flags; + ), + TP_printk("dev %d:%d keydev %d:%d block %llu len %llu owner %lld offset %llu flags 0x%llx\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + MAJOR(__entry->keydev), MINOR(__entry->keydev), + __entry->block, + __entry->len, + __entry->owner, + __entry->offset, + __entry->flags) +) +#define DEFINE_GETFSMAP_EVENT(name) \ +DEFINE_EVENT(xfs_getfsmap_class, name, \ + TP_PROTO(struct xfs_mount *mp, u32 keydev, xfs_daddr_t block, \ + xfs_daddr_t len, __uint64_t owner, __uint64_t offset, \ + __uint64_t flags), \ + TP_ARGS(mp, keydev, block, len, owner, offset, flags)) +DEFINE_GETFSMAP_EVENT(xfs_getfsmap_low_key); +DEFINE_GETFSMAP_EVENT(xfs_getfsmap_high_key); +DEFINE_GETFSMAP_EVENT(xfs_getfsmap_mapping); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH From darrick.wong@oracle.com Thu Aug 25 18:40:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 16D857ED4 for ; Thu, 25 Aug 2016 18:40:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5769304043 for ; Thu, 25 Aug 2016 16:40:31 -0700 (PDT) X-ASG-Debug-ID: 1472168429-0bf8155c751e7370001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id B7A56keMhv0BqBRN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:40:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNeScL017016 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:40:28 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNeRfC024305 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:40:28 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNeRRh018897; Thu, 25 Aug 2016 23:40:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:27 -0700 Subject: [PATCH 02/25] xfs: report shared extents in getfsmapx From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/25] xfs: report shared extents in getfsmapx To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:40:25 -0700 Message-ID: <147216842570.3108.8594952543604455508.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168430 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2295 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Cross-reference the reverse mapping data with the refcount btree to find out which extents are shared. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_fsmap.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c index a167acb..2eca7b9 100644 --- a/fs/xfs/xfs_fsmap.c +++ b/fs/xfs/xfs_fsmap.c @@ -37,6 +37,8 @@ #include "xfs_alloc.h" #include "xfs_bit.h" #include "xfs_fsmap.h" +#include "xfs_refcount.h" +#include "xfs_refcount_btree.h" /* getfsmap query state */ struct xfs_getfsmap_info { @@ -99,6 +101,42 @@ xfs_getfsmap_rec_before_low_key( return false; } +/* Decide if this mapping is shared. */ +STATIC int +xfs_getfsmap_is_shared( + struct xfs_mount *mp, + struct xfs_getfsmap_info *info, + struct xfs_rmap_irec *rec, + bool *stat) +{ + struct xfs_btree_cur *cur; + xfs_agblock_t fbno; + xfs_extlen_t flen; + int error; + + *stat = false; + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + /* rt files will have agno set to NULLAGNUMBER */ + if (info->agno == NULLAGNUMBER) + return 0; + + /* Are there any shared blocks here? */ + flen = 0; + cur = xfs_refcountbt_init_cursor(mp, NULL, info->agbp, + info->agno, NULL); + + error = xfs_refcount_find_shared(cur, rec->rm_startblock, + rec->rm_blockcount, &fbno, &flen, false); + + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + if (error) + return error; + + *stat = flen > 0; + return 0; +} + /* * Format a reverse mapping for getfsmap, having translated rm_startblock * into the appropriate daddr units. @@ -112,6 +150,7 @@ xfs_getfsmap_helper( { struct getfsmap fmv; xfs_daddr_t key_end; + bool shared; int error; /* @@ -221,6 +260,13 @@ xfs_getfsmap_helper( fmv.fmv_oflags |= FMV_OF_ATTR_FORK; if (rec->rm_flags & XFS_RMAP_BMBT_BLOCK) fmv.fmv_oflags |= FMV_OF_EXTENT_MAP; + if (fmv.fmv_oflags == 0) { + error = xfs_getfsmap_is_shared(mp, info, rec, &shared); + if (error) + return error; + if (shared) + fmv.fmv_oflags |= FMV_OF_SHARED; + } error = info->formatter(&fmv, info->format_arg); if (error) return error; From darrick.wong@oracle.com Thu Aug 25 18:40:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 600517ED5 for ; Thu, 25 Aug 2016 18:40:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 32C678F8037 for ; Thu, 25 Aug 2016 16:40:38 -0700 (PDT) X-ASG-Debug-ID: 1472168435-0bf57c55b31c7a90001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id WsHstpAlZlwiD9jK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:40:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNeYIp017148 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:35 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNeYiV027198 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:34 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNeXuh018980; Thu, 25 Aug 2016 23:40:34 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:33 -0700 Subject: [PATCH 03/25] xfs: have getfsmap fall back to the freesp btrees when rmap is not present From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/25] xfs: have getfsmap fall back to the freesp btrees when rmap is not present To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:40:31 -0700 Message-ID: <147216843188.3108.6702587672062077831.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168436 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8174 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the reverse-mapping btree isn't available, fall back to the free space btrees to provide partial reverse mapping information. The online scrub tool can make use of even partial information to speed up the data block scan. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 42 +++++++++++++ fs/xfs/libxfs/xfs_alloc.h | 10 +++ fs/xfs/xfs_fsmap.c | 151 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 200 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 6e81b27..8b3e6b3 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2932,3 +2932,45 @@ err: xfs_trans_brelse(tp, agbp); return error; } + +struct xfs_alloc_query_range_info { + xfs_alloc_query_range_fn fn; + void *priv; +}; + +/* Format btree record and pass to our callback. */ +STATIC int +xfs_alloc_query_range_helper( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec, + void *priv) +{ + struct xfs_alloc_query_range_info *query = priv; + struct xfs_alloc_rec_incore irec; + + irec.ar_startblock = be32_to_cpu(rec->alloc.ar_startblock); + irec.ar_blockcount = be32_to_cpu(rec->alloc.ar_blockcount); + return query->fn(cur, &irec, query->priv); +} + +/* Find all rmaps between two keys. */ +int +xfs_alloc_query_range( + struct xfs_btree_cur *cur, + struct xfs_alloc_rec_incore *low_rec, + struct xfs_alloc_rec_incore *high_rec, + xfs_alloc_query_range_fn fn, + void *priv) +{ + union xfs_btree_irec low_brec; + union xfs_btree_irec high_brec; + struct xfs_alloc_query_range_info query; + + ASSERT(cur->bc_btnum == XFS_BTNUM_BNO); + low_brec.a = *low_rec; + high_brec.a = *high_rec; + query.priv = priv; + query.fn = fn; + return xfs_btree_query_range(cur, &low_brec, &high_brec, + xfs_alloc_query_range_helper, &query); +} diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index f7c5201..0b00de0 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -210,4 +210,14 @@ int xfs_free_extent_fix_freelist(struct xfs_trans *tp, xfs_agnumber_t agno, xfs_extlen_t xfs_prealloc_blocks(struct xfs_mount *mp); +typedef int (*xfs_alloc_query_range_fn)( + struct xfs_btree_cur *cur, + struct xfs_alloc_rec_incore *rec, + void *priv); + +int xfs_alloc_query_range(struct xfs_btree_cur *cur, + struct xfs_alloc_rec_incore *low_rec, + struct xfs_alloc_rec_incore *high_rec, + xfs_alloc_query_range_fn fn, void *priv); + #endif /* __XFS_ALLOC_H__ */ diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c index 2eca7b9..eb54884 100644 --- a/fs/xfs/xfs_fsmap.c +++ b/fs/xfs/xfs_fsmap.c @@ -39,6 +39,7 @@ #include "xfs_fsmap.h" #include "xfs_refcount.h" #include "xfs_refcount_btree.h" +#include "xfs_alloc_btree.h" /* getfsmap query state */ struct xfs_getfsmap_info { @@ -314,6 +315,32 @@ xfs_getfsmap_rtdev_helper( return xfs_getfsmap_helper(mp, info, rec, rec_daddr); } +/* Transform a bnobt irec into a fsmap */ +STATIC int +xfs_getfsmap_datadev_bnobt_helper( + struct xfs_btree_cur *cur, + struct xfs_alloc_rec_incore *rec, + void *priv) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_getfsmap_info *info = priv; + struct xfs_rmap_irec irec; + xfs_fsblock_t fsb; + xfs_daddr_t rec_daddr; + + fsb = XFS_AGB_TO_FSB(mp, cur->bc_private.a.agno, + rec->ar_startblock); + rec_daddr = XFS_FSB_TO_DADDR(mp, fsb); + + irec.rm_startblock = rec->ar_startblock; + irec.rm_blockcount = rec->ar_blockcount; + irec.rm_owner = XFS_RMAP_OWN_NULL; /* "free" */ + irec.rm_offset = 0; + irec.rm_flags = 0; + + return xfs_getfsmap_helper(mp, info, &irec, rec_daddr); +} + /* Set rmap flags based on the getfsmap flags */ static void xfs_getfsmap_set_irec_flags( @@ -492,6 +519,123 @@ err: return error; } +/* Execute a getfsmap query against the regular data device's bnobt. */ +STATIC int +xfs_getfsmap_datadev_bnobt( + struct xfs_mount *mp, + struct getfsmap *keys, + struct xfs_getfsmap_info *info) +{ + struct xfs_btree_cur *bt_cur = NULL; + struct getfsmap *lowkey; + struct getfsmap *highkey; + struct xfs_alloc_rec_incore alow; + struct xfs_alloc_rec_incore ahigh; + xfs_fsblock_t start_fsb; + xfs_fsblock_t end_fsb; + xfs_agnumber_t start_ag; + xfs_agnumber_t end_ag; + xfs_daddr_t eofs; + int error = 0; + + lowkey = keys; + highkey = keys + 1; + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); + if (lowkey->fmv_block >= eofs) + return 0; + if (highkey->fmv_block >= eofs) + highkey->fmv_block = eofs - 1; + start_fsb = XFS_DADDR_TO_FSB(mp, lowkey->fmv_block); + end_fsb = XFS_DADDR_TO_FSB(mp, highkey->fmv_block); + + /* Set up search keys */ + info->low.rm_startblock = XFS_FSB_TO_AGBNO(mp, start_fsb); + info->low.rm_offset = XFS_BB_TO_FSBT(mp, lowkey->fmv_offset); + info->low.rm_owner = lowkey->fmv_owner; + info->low.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->low, lowkey); + + info->high.rm_startblock = -1U; + info->high.rm_owner = ULLONG_MAX; + info->high.rm_offset = ULLONG_MAX; + info->high.rm_blockcount = 0; + info->high.rm_flags = XFS_RMAP_KEY_FLAGS | XFS_RMAP_REC_FLAGS; + + info->missing_owner = FMV_OWN_UNKNOWN; + + start_ag = XFS_FSB_TO_AGNO(mp, start_fsb); + end_ag = XFS_FSB_TO_AGNO(mp, end_fsb); + + /* Query each AG */ + for (info->agno = start_ag; info->agno <= end_ag; info->agno++) { + if (info->agno == end_ag) { + info->high.rm_startblock = XFS_FSB_TO_AGBNO(mp, + end_fsb); + info->high.rm_offset = XFS_BB_TO_FSBT(mp, + highkey->fmv_offset); + info->high.rm_owner = highkey->fmv_owner; + xfs_getfsmap_set_irec_flags(&info->high, highkey); + } + + if (bt_cur) { + xfs_btree_del_cursor(bt_cur, XFS_BTREE_NOERROR); + xfs_buf_relse(info->agbp); + bt_cur = NULL; + info->agbp = NULL; + } + + error = xfs_alloc_read_agf(mp, NULL, info->agno, 0, + &info->agbp); + if (error) + goto err; + + trace_xfs_fsmap_low_key(mp, info->dev, info->agno, + info->low.rm_startblock, + info->low.rm_blockcount, + info->low.rm_owner, + info->low.rm_offset); + + trace_xfs_fsmap_high_key(mp, info->dev, info->agno, + info->high.rm_startblock, + info->high.rm_blockcount, + info->high.rm_owner, + info->high.rm_offset); + + bt_cur = xfs_allocbt_init_cursor(mp, NULL, info->agbp, + info->agno, XFS_BTNUM_BNO); + alow.ar_startblock = info->low.rm_startblock; + ahigh.ar_startblock = info->high.rm_startblock; + error = xfs_alloc_query_range(bt_cur, &alow, &ahigh, + xfs_getfsmap_datadev_bnobt_helper, info); + if (error) + goto err; + + if (info->agno == start_ag) { + info->low.rm_startblock = 0; + info->low.rm_owner = 0; + info->low.rm_offset = 0; + info->low.rm_flags = 0; + } + } + + /* Report any free space at the end of the AG */ + info->last = true; + error = xfs_getfsmap_datadev_bnobt_helper(bt_cur, &ahigh, info); + if (error) + goto err; + +err: + if (bt_cur) + xfs_btree_del_cursor(bt_cur, error < 0 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + if (info->agbp) { + xfs_buf_relse(info->agbp); + info->agbp = NULL; + } + + return error; +} + /* Do we recognize the device? */ STATIC bool xfs_getfsmap_is_valid_device( @@ -529,8 +673,6 @@ xfs_getfsmap( int i; int error = 0; - if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) - return -EOPNOTSUPP; if (fmv_low->fmv_count < 2) return -EINVAL; if (fmv_low->fmv_iflags & (~FMV_HIF_VALID)) @@ -549,7 +691,10 @@ xfs_getfsmap( /* Set up our device handlers. */ memset(handlers, 0, sizeof(handlers)); handlers[0].dev = new_encode_dev(mp->m_ddev_targp->bt_dev); - handlers[0].fn = xfs_getfsmap_datadev; + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + handlers[0].fn = xfs_getfsmap_datadev; + else + handlers[0].fn = xfs_getfsmap_datadev_bnobt; if (mp->m_logdev_targp != mp->m_ddev_targp) { handlers[1].dev = new_encode_dev(mp->m_logdev_targp->bt_dev); handlers[1].fn = xfs_getfsmap_logdev; From darrick.wong@oracle.com Thu Aug 25 18:40:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2DC127EE6 for ; Thu, 25 Aug 2016 18:40:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8936DAC003 for ; Thu, 25 Aug 2016 16:40:44 -0700 (PDT) X-ASG-Debug-ID: 1472168442-0bf57b53112095c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ek8dygB2eG9isWQY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:40:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNefUH017217 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:40:41 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNeeJ7012810 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:40:41 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNeddV019057; Thu, 25 Aug 2016 23:40:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:39 -0700 Subject: [PATCH 04/25] xfs: getfsmap should fall back to rtbitmap when rtrmapbt not present From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/25] xfs: getfsmap should fall back to rtbitmap when rtrmapbt not present To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:40:38 -0700 Message-ID: <147216843818.3108.1654337677671309494.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168442 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4686 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_fsmap.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c index eb54884..1c5ce01 100644 --- a/fs/xfs/xfs_fsmap.c +++ b/fs/xfs/xfs_fsmap.c @@ -40,6 +40,7 @@ #include "xfs_refcount.h" #include "xfs_refcount_btree.h" #include "xfs_alloc_btree.h" +#include "xfs_rtalloc.h" /* getfsmap query state */ struct xfs_getfsmap_info { @@ -315,6 +316,29 @@ xfs_getfsmap_rtdev_helper( return xfs_getfsmap_helper(mp, info, rec, rec_daddr); } +/* Transform a rtbitmap "record" into a fsmap */ +STATIC int +xfs_getfsmap_rtdev_rtbitmap_helper( + struct xfs_mount *mp, + xfs_rtblock_t start, + xfs_rtblock_t end, + void *priv) +{ + struct xfs_getfsmap_info *info = priv; + struct xfs_rmap_irec irec; + xfs_daddr_t rec_daddr; + + rec_daddr = XFS_FSB_TO_BB(mp, start); + + irec.rm_startblock = start; + irec.rm_blockcount = end - start + 1; + irec.rm_owner = XFS_RMAP_OWN_NULL; /* "free" */ + irec.rm_offset = 0; + irec.rm_flags = 0; + + return xfs_getfsmap_helper(mp, info, &irec, rec_daddr); +} + /* Transform a bnobt irec into a fsmap */ STATIC int xfs_getfsmap_datadev_bnobt_helper( @@ -407,6 +431,103 @@ xfs_getfsmap_logdev( return xfs_getfsmap_rtdev_helper(&cur, &rmap, info); } +/* Execute a getfsmap query against the realtime data device (rtbitmap). */ +STATIC int +xfs_getfsmap_rtdev_rtbitmap( + struct xfs_mount *mp, + struct getfsmap *keys, + struct xfs_getfsmap_info *info) +{ + struct getfsmap *lowkey; + struct getfsmap *highkey; + xfs_fsblock_t start_fsb; + xfs_fsblock_t end_fsb; + xfs_rtblock_t rtstart; + xfs_rtblock_t rtend; + xfs_rtblock_t rem; + xfs_daddr_t eofs; + int is_free; + int error = 0; + + lowkey = keys; + highkey = keys + 1; + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks); + if (lowkey->fmv_block >= eofs) + return 0; + if (highkey->fmv_block >= eofs) + highkey->fmv_block = eofs - 1; + start_fsb = XFS_BB_TO_FSBT(mp, lowkey->fmv_block); + end_fsb = XFS_BB_TO_FSB(mp, highkey->fmv_block); + + /* Set up search keys */ + info->low.rm_startblock = start_fsb; + info->low.rm_owner = lowkey->fmv_owner; + info->low.rm_offset = XFS_BB_TO_FSBT(mp, lowkey->fmv_offset); + info->low.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->low, lowkey); + + info->high.rm_startblock = end_fsb; + info->high.rm_owner = highkey->fmv_owner; + info->high.rm_offset = XFS_BB_TO_FSBT(mp, highkey->fmv_offset); + info->high.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->high, highkey); + + info->missing_owner = FMV_OWN_UNKNOWN; + + trace_xfs_fsmap_low_key(mp, info->dev, info->agno, + info->low.rm_startblock, + info->low.rm_blockcount, + info->low.rm_owner, + info->low.rm_offset); + + trace_xfs_fsmap_high_key(mp, info->dev, info->agno, + info->high.rm_startblock, + info->high.rm_blockcount, + info->high.rm_owner, + info->high.rm_offset); + + xfs_ilock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); + + /* Iterate the bitmap, looking for discrepancies. */ + rtstart = 0; + rem = mp->m_sb.sb_rblocks; + while (rem) { + /* Is the first block free? */ + error = xfs_rtcheck_range(mp, NULL, rtstart, 1, 1, &rtend, + &is_free); + if (error) + goto out_unlock; + + /* How long does the extent go for? */ + error = xfs_rtfind_forw(mp, NULL, rtstart, + mp->m_sb.sb_rblocks - 1, &rtend); + if (error) + goto out_unlock; + + if (is_free) { + error = xfs_getfsmap_rtdev_rtbitmap_helper(mp, + rtstart, rtend, info); + if (error) + goto out_unlock; + } + + rem -= rtend - rtstart + 1; + rtstart = rtend + 1; + } + +out_unlock: + xfs_iunlock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); + + /* Report any free space at the end of the rtdev */ + info->last = true; + error = xfs_getfsmap_rtdev_rtbitmap_helper(mp, end_fsb, 0, info); + if (error) + goto err; + +err: + return error; +} + /* Execute a getfsmap query against the regular data device. */ STATIC int xfs_getfsmap_datadev( @@ -699,6 +820,11 @@ xfs_getfsmap( handlers[1].dev = new_encode_dev(mp->m_logdev_targp->bt_dev); handlers[1].fn = xfs_getfsmap_logdev; } + if (mp->m_rtdev_targp) { + handlers[2].dev = new_encode_dev(mp->m_rtdev_targp->bt_dev); + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + handlers[2].fn = xfs_getfsmap_rtdev_rtbitmap; + } xfs_sort(handlers, XFS_GETFSMAP_DEVS, sizeof(struct xfs_getfsmap_dev), xfs_getfsmap_dev_compare); From darrick.wong@oracle.com Thu Aug 25 18:40:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3FCCE7EEF for ; Thu, 25 Aug 2016 18:40:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C554BAC003 for ; Thu, 25 Aug 2016 16:40:50 -0700 (PDT) X-ASG-Debug-ID: 1472168448-0bf8155c751e7420001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id uWmVaoRoe3Mroq6q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:40:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNekLY024094 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:47 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNekbI027603 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:46 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNek3v030315; Thu, 25 Aug 2016 23:40:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:45 -0700 Subject: [PATCH 05/25] xfs: add scrub tracepoints From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/25] xfs: add scrub tracepoints To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:40:44 -0700 Message-ID: <147216844444.3108.4312125627184435526.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168448 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3046 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_trace.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 03b5505..74963a1 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -3435,6 +3435,83 @@ DEFINE_GETFSMAP_EVENT(xfs_getfsmap_low_key); DEFINE_GETFSMAP_EVENT(xfs_getfsmap_high_key); DEFINE_GETFSMAP_EVENT(xfs_getfsmap_mapping); +/* scrub */ +DECLARE_EVENT_CLASS(xfs_scrub_class, + TP_PROTO(struct xfs_inode *ip, int type, unsigned long long control, + unsigned int flags, int error), + TP_ARGS(ip, type, control, flags, error), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_ino_t, ino) + __field(int, type) + __field(unsigned long long, control) + __field(unsigned int, flags) + __field(int, error) + ), + TP_fast_assign( + __entry->dev = ip->i_mount->m_super->s_dev; + __entry->ino = ip->i_ino; + __entry->type = type; + __entry->control = control; + __entry->flags = flags; + __entry->error = error; + ), + TP_printk("dev %d:%d ino %llu type %u ctl %llu flags 0x%x error %d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->ino, + __entry->type, + __entry->control, + __entry->flags, + __entry->error) +) +#define DEFINE_SCRUB_EVENT(name) \ +DEFINE_EVENT(xfs_scrub_class, name, \ + TP_PROTO(struct xfs_inode *ip, int type, unsigned long long control, \ + unsigned int flags, int error), \ + TP_ARGS(ip, type, control, flags, error)) + +DECLARE_EVENT_CLASS(xfs_scrub_sbtree_class, + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t bno, + xfs_btnum_t btnum, int level, int nlevels, int ptr), + TP_ARGS(mp, agno, bno, btnum, level, nlevels, ptr), + TP_STRUCT__entry( + __field(dev_t, dev) + __field(xfs_btnum_t, btnum) + __field(xfs_agnumber_t, agno) + __field(xfs_agblock_t, bno) + __field(int, level) + __field(int, nlevels) + __field(int, ptr) + ), + TP_fast_assign( + __entry->dev = mp->m_super->s_dev; + __entry->agno = agno; + __entry->btnum = btnum; + __entry->bno = bno; + __entry->level = level; + __entry->nlevels = nlevels; + __entry->ptr = ptr; + ), + TP_printk("dev %d:%d agno %u agbno %u btnum %d level %d nlevels %d ptr %d\n", + MAJOR(__entry->dev), MINOR(__entry->dev), + __entry->agno, + __entry->bno, + __entry->btnum, + __entry->level, + __entry->nlevels, + __entry->ptr) +) +#define DEFINE_SCRUB_SBTREE_EVENT(name) \ +DEFINE_EVENT(xfs_scrub_sbtree_class, name, \ + TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, xfs_agblock_t bno, \ + xfs_btnum_t btnum, int level, int nlevels, int ptr), \ + TP_ARGS(mp, agno, bno, btnum, level, nlevels, ptr)) + +DEFINE_SCRUB_EVENT(xfs_scrub); +DEFINE_SCRUB_EVENT(xfs_scrub_done); +DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_rec); +DEFINE_SCRUB_SBTREE_EVENT(xfs_scrub_btree_key); + #endif /* _TRACE_XFS_H */ #undef TRACE_INCLUDE_PATH From darrick.wong@oracle.com Thu Aug 25 18:41:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 648887EF7 for ; Thu, 25 Aug 2016 18:41:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C2BC8F8033 for ; Thu, 25 Aug 2016 16:41:00 -0700 (PDT) X-ASG-Debug-ID: 1472168455-0bf8155c741e7460001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 0quEYXsdhmvF7kX6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:40:56 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNervT017344 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:54 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNer71014617 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:53 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNeqKr031101; Thu, 25 Aug 2016 23:40:52 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:51 -0700 Subject: [PATCH 06/25] xfs: generic functions to scrub metadata and btrees From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/25] xfs: generic functions to scrub metadata and btrees To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:40:50 -0700 Message-ID: <147216845062.3108.1751981381146729642.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168455 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 27910 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a function that walks a btree, checking the integrity of each btree block (headers, keys, records) and calling back to the caller to perform further checks on the records. Add some helper functions so that we report detailed scrub errors in a uniform manner in dmesg. These are helper functions for subsequent patches. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_btree.c | 41 ++- fs/xfs/libxfs/xfs_btree.h | 17 + fs/xfs/libxfs/xfs_format.h | 2 fs/xfs/xfs_scrub.c | 705 ++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_scrub.h | 25 ++ 6 files changed, 782 insertions(+), 9 deletions(-) create mode 100644 fs/xfs/xfs_scrub.c create mode 100644 fs/xfs/xfs_scrub.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 5c90f82..a903bd3 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -92,6 +92,7 @@ xfs-y += xfs_aops.o \ xfs_mount.o \ xfs_mru_cache.o \ xfs_reflink.o \ + xfs_scrub.o \ xfs_stats.o \ xfs_super.o \ xfs_symlink.o \ diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 2552c03..a926c54 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -552,7 +552,7 @@ xfs_btree_ptr_offset( /* * Return a pointer to the n-th record in the btree block. */ -STATIC union xfs_btree_rec * +union xfs_btree_rec * xfs_btree_rec_addr( struct xfs_btree_cur *cur, int n, @@ -565,7 +565,7 @@ xfs_btree_rec_addr( /* * Return a pointer to the n-th key in the btree block. */ -STATIC union xfs_btree_key * +union xfs_btree_key * xfs_btree_key_addr( struct xfs_btree_cur *cur, int n, @@ -578,7 +578,7 @@ xfs_btree_key_addr( /* * Return a pointer to the n-th high key in the btree block. */ -STATIC union xfs_btree_key * +union xfs_btree_key * xfs_btree_high_key_addr( struct xfs_btree_cur *cur, int n, @@ -591,7 +591,7 @@ xfs_btree_high_key_addr( /* * Return a pointer to the n-th block pointer in the btree block. */ -STATIC union xfs_btree_ptr * +union xfs_btree_ptr * xfs_btree_ptr_addr( struct xfs_btree_cur *cur, int n, @@ -625,7 +625,7 @@ xfs_btree_get_iroot( * Retrieve the block pointer from the cursor at the given level. * This may be an inode btree root or from a buffer. */ -STATIC struct xfs_btree_block * /* generic btree block pointer */ +struct xfs_btree_block * /* generic btree block pointer */ xfs_btree_get_block( struct xfs_btree_cur *cur, /* btree cursor */ int level, /* level in btree */ @@ -1736,7 +1736,7 @@ error0: return error; } -STATIC int +int xfs_btree_lookup_get_block( struct xfs_btree_cur *cur, /* btree cursor */ int level, /* level in the btree */ @@ -4852,3 +4852,32 @@ xfs_btree_count_blocks( return xfs_btree_visit_blocks(cur, xfs_btree_count_blocks_helper, blocks); } + +/* If there's an extent, we're done. */ +STATIC int +xfs_btree_has_record_helper( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec, + void *priv) +{ + return XFS_BTREE_QUERY_RANGE_ABORT; +} + +/* Is there a record covering a given range of keys? */ +int +xfs_btree_has_record( + struct xfs_btree_cur *cur, + union xfs_btree_irec *low, + union xfs_btree_irec *high, + bool *exists) +{ + int error; + + error = xfs_btree_query_range(cur, low, high, + &xfs_btree_has_record_helper, NULL); + if (error && error != XFS_BTREE_QUERY_RANGE_ABORT) + return error; + *exists = error == XFS_BTREE_QUERY_RANGE_ABORT; + + return 0; +} diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index eb20376..f81b2a8 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -197,7 +197,6 @@ struct xfs_btree_ops { const struct xfs_buf_ops *buf_ops; -#if defined(DEBUG) || defined(XFS_WARN) /* check that k1 is lower than k2 */ int (*keys_inorder)(struct xfs_btree_cur *cur, union xfs_btree_key *k1, @@ -207,7 +206,6 @@ struct xfs_btree_ops { int (*recs_inorder)(struct xfs_btree_cur *cur, union xfs_btree_rec *r1, union xfs_btree_rec *r2); -#endif }; /* @@ -537,4 +535,19 @@ int xfs_btree_visit_blocks(struct xfs_btree_cur *cur, int xfs_btree_count_blocks(struct xfs_btree_cur *cur, xfs_extlen_t *blocks); +union xfs_btree_rec *xfs_btree_rec_addr(struct xfs_btree_cur *cur, int n, + struct xfs_btree_block *block); +union xfs_btree_key *xfs_btree_key_addr(struct xfs_btree_cur *cur, int n, + struct xfs_btree_block *block); +union xfs_btree_key *xfs_btree_high_key_addr(struct xfs_btree_cur *cur, int n, + struct xfs_btree_block *block); +union xfs_btree_ptr *xfs_btree_ptr_addr(struct xfs_btree_cur *cur, int n, + struct xfs_btree_block *block); +int xfs_btree_lookup_get_block(struct xfs_btree_cur *cur, int level, + union xfs_btree_ptr *pp, struct xfs_btree_block **blkp); +struct xfs_btree_block *xfs_btree_get_block(struct xfs_btree_cur *cur, + int level, struct xfs_buf **bpp); +int xfs_btree_has_record(struct xfs_btree_cur *cur, union xfs_btree_irec *low, + union xfs_btree_irec *high, bool *exists); + #endif /* __XFS_BTREE_H__ */ diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index bf40fa8..a3aa5e9 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -518,7 +518,7 @@ static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); } -static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasfinobt(xfs_sb_t *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c new file mode 100644 index 0000000..13bea55 --- /dev/null +++ b/fs/xfs/xfs_scrub.c @@ -0,0 +1,705 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_trans_resv.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_btree.h" +#include "xfs_bit.h" +#include "xfs_log_format.h" +#include "xfs_trans.h" +#include "xfs_trace.h" +#include "xfs_scrub.h" +#include "xfs_sb.h" +#include "xfs_inode.h" +#include "xfs_alloc.h" +#include "xfs_alloc_btree.h" +#include "xfs_bmap.h" +#include "xfs_bmap_btree.h" +#include "xfs_ialloc.h" +#include "xfs_ialloc_btree.h" +#include "xfs_refcount.h" +#include "xfs_refcount_btree.h" +#include "xfs_rmap.h" +#include "xfs_rmap_btree.h" +#include "xfs_rtalloc.h" + +/* Report a scrub corruption in dmesg. */ +STATIC void +xfs_scrub_error( + struct xfs_mount *mp, + struct xfs_buf *bp, + const char *type, + const char *func, + int line, + const char *check) +{ + xfs_fsblock_t fsbno; + + fsbno = XFS_DADDR_TO_FSB(mp, bp->b_bn); + xfs_alert(mp, "scrub: %s corruption in block %u/%u: %s, func: %s, line: %d", + type, + XFS_FSB_TO_AGNO(mp, fsbno), + XFS_FSB_TO_AGBNO(mp, fsbno), + check, func, line); +} + +#define XFS_SCRUB_CHECK(mp, bp, type, fs_ok) \ + if (!(fs_ok)) { \ + xfs_scrub_error((mp), (bp), (type), __func__, __LINE__, #fs_ok); \ + error = -EFSCORRUPTED; \ + } +#define XFS_SCRUB_GOTO(mp, bp, type, fs_ok, label) \ + if (!(fs_ok)) { \ + xfs_scrub_error((mp), (bp), (type), __func__, __LINE__, #fs_ok); \ + error = -EFSCORRUPTED; \ + goto label; \ + } + +/* Report a scrub corruption in dmesg. */ +STATIC void +xfs_scrub_ino_error( + struct xfs_inode *ip, + struct xfs_buf *bp, + const char *type, + const char *func, + int line, + const char *check) +{ + struct xfs_mount *mp = ip->i_mount; + xfs_fsblock_t fsbno; + + if (!bp) { + xfs_alert(mp, "scrub: inode %llu %s corruption: %s, " + "func: %s, line: %d", + ip->i_ino, + type, + check, func, line); + return; + } + + fsbno = XFS_DADDR_TO_FSB(mp, bp->b_bn); + xfs_alert(mp, "scrub: inode %llu %s corruption in block %u/%u: %s, " + "func: %s, line: %d", + ip->i_ino, + type, + XFS_FSB_TO_AGNO(mp, fsbno), + XFS_FSB_TO_AGBNO(mp, fsbno), + check, func, line); +} + +#define XFS_INO_SCRUB_CHECK(ip, bp, type, fs_ok) \ + if (!(fs_ok)) { \ + xfs_scrub_ino_error((ip), (bp), (type), __func__, __LINE__, #fs_ok); \ + error = -EFSCORRUPTED; \ + } +#define XFS_INO_SCRUB_GOTO(ip, bp, type, fs_ok, label) \ + if (!(fs_ok)) { \ + xfs_scrub_ino_error((ip), (bp), (type), __func__, __LINE__, #fs_ok); \ + error = -EFSCORRUPTED; \ + goto label; \ + } + +/* btree scrubbing */ + +static const char * const btree_types[] = { + [XFS_BTNUM_BNO] = "bnobt", + [XFS_BTNUM_CNT] = "cntbt", + [XFS_BTNUM_RMAP] = "rmapbt", + [XFS_BTNUM_BMAP] = "bmapbt", + [XFS_BTNUM_INO] = "inobt", + [XFS_BTNUM_FINO] = "finobt", + [XFS_BTNUM_REFC] = "refcountbt", +}; + +struct xfs_scrub_btree; +typedef int (*xfs_scrub_btree_rec_fn)( + struct xfs_scrub_btree *bs, + union xfs_btree_rec *rec); + +struct xfs_scrub_btree { + /* caller-provided scrub state */ + struct xfs_btree_cur *cur; + xfs_scrub_btree_rec_fn scrub_rec; + struct xfs_buf *agi_bp; + struct xfs_buf *agf_bp; + struct xfs_buf *agfl_bp; + struct xfs_owner_info oinfo; + + /* internal scrub state */ + union xfs_btree_rec lastrec; + bool firstrec; + union xfs_btree_key lastkey[XFS_BTREE_MAXLEVELS]; + bool firstkey[XFS_BTREE_MAXLEVELS]; + struct xfs_btree_cur *bno_cur; + struct xfs_btree_cur *cnt_cur; + struct xfs_btree_cur *ino_cur; + struct xfs_btree_cur *fino_cur; + struct xfs_btree_cur *rmap_cur; + struct xfs_btree_cur *refc_cur; + struct list_head to_check; + int error; +}; + +/* Report a scrub corruption in dmesg. */ +STATIC void +xfs_scrub_btree_error( + struct xfs_btree_cur *cur, + int level, + const char *func, + int line, + const char *check) +{ + char buf[24]; + char descr[48]; + const char *type; + struct xfs_buf *bp; + struct xfs_btree_block *block; + xfs_fsblock_t fsbno; + + switch (cur->bc_btnum) { + case XFS_BTNUM_BMAP: + switch (cur->bc_private.b.whichfork) { + case XFS_DATA_FORK: + type = "data"; + break; + case XFS_ATTR_FORK: + type = "attr"; + break; + case XFS_COW_FORK: + type = "CoW"; + break; + } + snprintf(descr, 48, "inode %llu %s fork", + (unsigned long long)cur->bc_private.b.ip->i_ino, + type); + type = descr; + break; + default: + type = btree_types[cur->bc_btnum]; + break; + } + + if (level < cur->bc_nlevels && cur->bc_ptrs[level] >= 1) { + block = xfs_btree_get_block(cur, level, &bp); + snprintf(buf, 24, " %s %d/%d", level == 0 ? "rec" : "ptr", + cur->bc_ptrs[level], + be16_to_cpu(block->bb_numrecs)); + } else + buf[0] = 0; + + if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && + level >= cur->bc_nlevels - 1) { + xfs_alert(cur->bc_mp, "scrub: %s btree corruption in inode " + "%llu root%s: %s, func: %s, line: %d", + type, cur->bc_private.b.ip->i_ino, + buf, check, func, line); + } else if (!cur->bc_bufs[level]) { + xfs_alert(cur->bc_mp, "scrub: %s btree corruption, " + "func: %s, line: %d", + type, func, line); + } else { + fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, cur->bc_bufs[level]->b_bn); + xfs_alert(cur->bc_mp, "scrub: %s btree corruption in block " + "%u/%u%s: %s, func: %s, line: %d", + type, + XFS_FSB_TO_AGNO(cur->bc_mp, fsbno), + XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), + buf, check, func, line); + } +} + +#define XFS_BTREC_SCRUB_CHECK(bs, fs_ok) \ + if (!(fs_ok)) { \ + xfs_scrub_btree_error((bs)->cur, 0, __func__, __LINE__, #fs_ok); \ + (bs)->error = -EFSCORRUPTED; \ + } +#define XFS_BTREC_SCRUB_GOTO(bs, fs_ok, label) \ + if (!(fs_ok)) { \ + xfs_scrub_btree_error((bs)->cur, 0, __func__, __LINE__, #fs_ok); \ + (bs)->error = -EFSCORRUPTED; \ + goto label; \ + } +#define XFS_BTKEY_SCRUB_CHECK(bs, level, fs_ok) \ + if (!(fs_ok)) { \ + xfs_scrub_btree_error((bs)->cur, (level), __func__, __LINE__, #fs_ok); \ + (bs)->error = -EFSCORRUPTED; \ + } +#define XFS_BTKEY_SCRUB_GOTO(bs, level, fs_ok, label) \ + if (!(fs_ok)) { \ + xfs_scrub_btree_error((bs)->cur, (level), __func__, __LINE__, #fs_ok); \ + (bs)->error = -EFSCORRUPTED; \ + goto label; \ + } + +/* + * Make sure this record is in order and doesn't stray outside of the parent + * keys. + */ +STATIC int +xfs_scrub_btree_rec( + struct xfs_scrub_btree *bs) +{ + struct xfs_btree_cur *cur = bs->cur; + union xfs_btree_rec *rec; + union xfs_btree_key key; + union xfs_btree_key hkey; + union xfs_btree_key *keyp; + struct xfs_btree_block *block; + struct xfs_btree_block *keyblock; + struct xfs_buf *bp; + + block = xfs_btree_get_block(cur, 0, &bp); + rec = xfs_btree_rec_addr(cur, cur->bc_ptrs[0], block); + + if (bp) + trace_xfs_scrub_btree_rec(cur->bc_mp, + XFS_FSB_TO_AGNO(cur->bc_mp, + XFS_DADDR_TO_FSB(cur->bc_mp, bp->b_bn)), + XFS_FSB_TO_AGBNO(cur->bc_mp, + XFS_DADDR_TO_FSB(cur->bc_mp, bp->b_bn)), + cur->bc_btnum, 0, cur->bc_nlevels, + cur->bc_ptrs[0]); + else if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) + trace_xfs_scrub_btree_rec(cur->bc_mp, + XFS_INO_TO_AGNO(cur->bc_mp, + cur->bc_private.b.ip->i_ino), + XFS_INO_TO_AGBNO(cur->bc_mp, + cur->bc_private.b.ip->i_ino), + cur->bc_btnum, 0, cur->bc_nlevels, + cur->bc_ptrs[0]); + else + trace_xfs_scrub_btree_rec(cur->bc_mp, + NULLAGNUMBER, NULLAGBLOCK, + cur->bc_btnum, 0, cur->bc_nlevels, + cur->bc_ptrs[0]); + + /* If this isn't the first record, are they in order? */ + XFS_BTREC_SCRUB_CHECK(bs, bs->firstrec || + cur->bc_ops->recs_inorder(cur, &bs->lastrec, rec)); + bs->firstrec = false; + bs->lastrec = *rec; + + if (cur->bc_nlevels == 1) + return 0; + + /* Is this at least as large as the parent low key? */ + cur->bc_ops->init_key_from_rec(&key, rec); + keyblock = xfs_btree_get_block(cur, 1, &bp); + keyp = xfs_btree_key_addr(cur, cur->bc_ptrs[1], keyblock); + XFS_BTKEY_SCRUB_CHECK(bs, 0, + cur->bc_ops->diff_two_keys(cur, &key, keyp) >= 0); + + if (!(cur->bc_flags & XFS_BTREE_OVERLAPPING)) + return 0; + + /* Is this no larger than the parent high key? */ + cur->bc_ops->init_high_key_from_rec(&hkey, rec); + keyp = xfs_btree_high_key_addr(cur, cur->bc_ptrs[1], keyblock); + XFS_BTKEY_SCRUB_CHECK(bs, 0, + cur->bc_ops->diff_two_keys(cur, keyp, &hkey) >= 0); + + return 0; +} + +/* + * Make sure this key is in order and doesn't stray outside of the parent + * keys. + */ +STATIC int +xfs_scrub_btree_key( + struct xfs_scrub_btree *bs, + int level) +{ + struct xfs_btree_cur *cur = bs->cur; + union xfs_btree_key *key; + union xfs_btree_key *keyp; + struct xfs_btree_block *block; + struct xfs_btree_block *keyblock; + struct xfs_buf *bp; + + block = xfs_btree_get_block(cur, level, &bp); + key = xfs_btree_key_addr(cur, cur->bc_ptrs[level], block); + + if (bp) + trace_xfs_scrub_btree_key(cur->bc_mp, + XFS_FSB_TO_AGNO(cur->bc_mp, + XFS_DADDR_TO_FSB(cur->bc_mp, bp->b_bn)), + XFS_FSB_TO_AGBNO(cur->bc_mp, + XFS_DADDR_TO_FSB(cur->bc_mp, bp->b_bn)), + cur->bc_btnum, level, cur->bc_nlevels, + cur->bc_ptrs[level]); + else if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) + trace_xfs_scrub_btree_key(cur->bc_mp, + XFS_INO_TO_AGNO(cur->bc_mp, + cur->bc_private.b.ip->i_ino), + XFS_INO_TO_AGBNO(cur->bc_mp, + cur->bc_private.b.ip->i_ino), + cur->bc_btnum, level, cur->bc_nlevels, + cur->bc_ptrs[level]); + else + trace_xfs_scrub_btree_key(cur->bc_mp, + NULLAGNUMBER, NULLAGBLOCK, + cur->bc_btnum, level, cur->bc_nlevels, + cur->bc_ptrs[level]); + + /* If this isn't the first key, are they in order? */ + XFS_BTKEY_SCRUB_CHECK(bs, level, bs->firstkey[level] || + cur->bc_ops->keys_inorder(cur, &bs->lastkey[level], + key)); + bs->firstkey[level] = false; + bs->lastkey[level] = *key; + + if (level + 1 >= cur->bc_nlevels) + return 0; + + /* Is this at least as large as the parent low key? */ + keyblock = xfs_btree_get_block(cur, level + 1, &bp); + keyp = xfs_btree_key_addr(cur, cur->bc_ptrs[level + 1], keyblock); + XFS_BTKEY_SCRUB_CHECK(bs, level, + cur->bc_ops->diff_two_keys(cur, key, keyp) >= 0); + + if (!(cur->bc_flags & XFS_BTREE_OVERLAPPING)) + return 0; + + /* Is this no larger than the parent high key? */ + key = xfs_btree_high_key_addr(cur, cur->bc_ptrs[level], block); + keyp = xfs_btree_high_key_addr(cur, cur->bc_ptrs[level + 1], keyblock); + XFS_BTKEY_SCRUB_CHECK(bs, level, + cur->bc_ops->diff_two_keys(cur, keyp, key) >= 0); + + return 0; +} + +/* + * For scrub, grab the AGI and the AGF headers, in that order. + * Locking order requires us to get the AGI before the AGF. + */ +STATIC int +xfs_scrub_get_ag_headers( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_buf **agi_bpp, + struct xfs_buf **agf_bpp) +{ + int error; + + error = xfs_read_agi(mp, NULL, agno, agi_bpp); + if (error) + return error; + + error = xfs_read_agf(mp, NULL, agno, 0, agf_bpp); + if (error) { + xfs_buf_relse(*agi_bpp); + *agi_bpp = NULL; + } + + return error; +} + +/* + * Release the AGF/AGI buffers. + */ +STATIC void +xfs_scrub_put_ag_headers( + struct xfs_buf **agi_bpp, + struct xfs_buf **agf_bpp) +{ + if (*agf_bpp) + xfs_buf_relse(*agf_bpp); + if (*agi_bpp) + xfs_buf_relse(*agi_bpp); + *agi_bpp = *agf_bpp = NULL; +} + +/* + * For scrub, grab the AGI and the AGF headers, in that order. + * Locking order requires us to get the AGI before the AGF. + */ +STATIC int +xfs_scrub_btree_get_ag_headers( + struct xfs_mount *mp, + struct xfs_scrub_btree *bs, + xfs_agnumber_t agno) +{ + return xfs_scrub_get_ag_headers(mp, agno, &bs->agi_bp, &bs->agf_bp); +} + +/* + * Release the AGF/AGI buffers. + */ +STATIC void +xfs_scrub_btree_put_ag_headers( + struct xfs_scrub_btree *bs) +{ + xfs_scrub_put_ag_headers(&bs->agi_bp, &bs->agf_bp); +} + +/* Check a btree pointer. */ +static int +xfs_scrub_btree_ptr( + struct xfs_scrub_btree *bs, + int level, + union xfs_btree_ptr *ptr) +{ + struct xfs_btree_cur *cur = bs->cur; + xfs_daddr_t daddr; + xfs_daddr_t eofs; + int error = 0; + + if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && + level == cur->bc_nlevels) { + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + XFS_BTKEY_SCRUB_GOTO(bs, level, ptr->l == 0, out); + } else { + XFS_BTKEY_SCRUB_GOTO(bs, level, ptr->s == 0, out); + } + goto out; + } + + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + XFS_BTKEY_SCRUB_GOTO(bs, level, + ptr->l != cpu_to_be64(NULLFSBLOCK), out); + + daddr = XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); + } else { + XFS_BTKEY_SCRUB_GOTO(bs, level, + cur->bc_private.a.agno != NULLAGNUMBER, out); + XFS_BTKEY_SCRUB_GOTO(bs, level, + ptr->s != cpu_to_be32(NULLAGBLOCK), out); + + daddr = XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_private.a.agno, + be32_to_cpu(ptr->s)); + } + eofs = XFS_FSB_TO_BB(cur->bc_mp, cur->bc_mp->m_sb.sb_dblocks); + XFS_BTKEY_SCRUB_GOTO(bs, level, daddr != 0, out); + XFS_BTKEY_SCRUB_GOTO(bs, level, daddr < eofs, out); + +out: + return error; +} + +/* Should we end the scrub early? */ +static bool +xfs_scrub_should_terminate( + int *error) +{ + if (fatal_signal_pending(current)) { + if (*error == 0) + *error = -EAGAIN; + return true; + } + return false; +} + +/* + * Visit all nodes and leaves of a btree. Check that all pointers and + * records are in order, that the keys reflect the records, and use a callback + * so that the caller can verify individual records. The callback is the same + * as the one for xfs_btree_query_range, so therefore this function also + * returns XFS_BTREE_QUERY_RANGE_ABORT, zero, or a negative error code. + */ +STATIC int +xfs_scrub_btree( + struct xfs_scrub_btree *bs) +{ + struct xfs_btree_cur *cur = bs->cur; + union xfs_btree_ptr ptr; + union xfs_btree_ptr *pp; + union xfs_btree_rec *recp; + struct xfs_btree_block *block; + int level; + struct xfs_buf *bp; + int i; + int error = 0; + + /* No such thing as a zero-level tree. */ + XFS_BTREC_SCRUB_GOTO(bs, cur->bc_nlevels > 0, out_badcursor); + + /* Make sure the root isn't in the superblock. */ + cur->bc_ops->init_ptr_from_cur(cur, &ptr); + error = xfs_scrub_btree_ptr(bs, cur->bc_nlevels, &ptr); + if (error) + goto out_badcursor; + + /* Finish filling out the scrub state */ + bs->error = 0; + bs->firstrec = true; + for (i = 0; i < XFS_BTREE_MAXLEVELS; i++) + bs->firstkey[i] = true; + bs->bno_cur = bs->cnt_cur = bs->ino_cur = bs->fino_cur = NULL; + bs->rmap_cur = bs->refc_cur = NULL; + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + bs->agi_bp = NULL; + bs->agf_bp = NULL; + } + INIT_LIST_HEAD(&bs->to_check); + + /* Grab cursors to the other AGs for cross-referencing. */ + if (!(cur->bc_flags & XFS_BTREE_LONG_PTRS)) { + /* Set up a bnobt cursor for cross-referencing. */ + if (bs->cur->bc_btnum != XFS_BTNUM_BNO) + bs->bno_cur = xfs_allocbt_init_cursor(cur->bc_mp, NULL, + bs->agf_bp, bs->cur->bc_private.a.agno, + XFS_BTNUM_BNO); + /* Set up a cntbt cursor for cross-referencing. */ + if (bs->cur->bc_btnum != XFS_BTNUM_CNT) + bs->cnt_cur = xfs_allocbt_init_cursor(cur->bc_mp, NULL, + bs->agf_bp, bs->cur->bc_private.a.agno, + XFS_BTNUM_CNT); + /* Set up a inobt cursor for cross-referencing. */ + if (bs->cur->bc_btnum != XFS_BTNUM_INO) + bs->ino_cur = xfs_inobt_init_cursor(cur->bc_mp, NULL, + bs->agi_bp, bs->cur->bc_private.a.agno, + XFS_BTNUM_INO); + /* Set up a finobt cursor for cross-referencing. */ + if (bs->cur->bc_btnum != XFS_BTNUM_FINO && + xfs_sb_version_hasfinobt(&cur->bc_mp->m_sb)) + bs->fino_cur = xfs_inobt_init_cursor(cur->bc_mp, NULL, + bs->agi_bp, bs->cur->bc_private.a.agno, + XFS_BTNUM_FINO); + /* Set up a rmapbt cursor for cross-referencing. */ + if (bs->cur->bc_btnum != XFS_BTNUM_RMAP && + xfs_sb_version_hasrmapbt(&cur->bc_mp->m_sb)) + bs->rmap_cur = xfs_rmapbt_init_cursor(cur->bc_mp, NULL, + bs->agf_bp, bs->cur->bc_private.a.agno); + /* Set up a refcountbt cursor for cross-referencing. */ + if (bs->cur->bc_btnum != XFS_BTNUM_REFC && + xfs_sb_version_hasreflink(&cur->bc_mp->m_sb)) + bs->refc_cur = xfs_refcountbt_init_cursor(cur->bc_mp, + NULL, bs->agf_bp, + bs->cur->bc_private.a.agno, NULL); + } + + /* Load the root of the btree. */ + level = cur->bc_nlevels - 1; + cur->bc_ops->init_ptr_from_cur(cur, &ptr); + error = xfs_btree_lookup_get_block(cur, level, &ptr, &block); + if (error) + goto out; + + xfs_btree_get_block(cur, level, &bp); + error = xfs_btree_check_block(cur, block, level, bp); + if (error) + goto out; + + cur->bc_ptrs[level] = 1; + + while (level < cur->bc_nlevels) { + block = xfs_btree_get_block(cur, level, &bp); + + if (level == 0) { + /* End of leaf, pop back towards the root. */ + if (cur->bc_ptrs[level] > + be16_to_cpu(block->bb_numrecs)) { + if (level < cur->bc_nlevels - 1) + cur->bc_ptrs[level + 1]++; + level++; + continue; + } + + /* Records in order for scrub? */ + error = xfs_scrub_btree_rec(bs); + if (error) + goto out; + recp = xfs_btree_rec_addr(cur, cur->bc_ptrs[0], block); + error = bs->scrub_rec(bs, recp); + if (error < 0 || + error == XFS_BTREE_QUERY_RANGE_ABORT) + break; + if (xfs_scrub_should_terminate(&error)) + break; + + cur->bc_ptrs[level]++; + continue; + } + + /* End of node, pop back towards the root. */ + if (cur->bc_ptrs[level] > be16_to_cpu(block->bb_numrecs)) { + if (level < cur->bc_nlevels - 1) + cur->bc_ptrs[level + 1]++; + level++; + continue; + } + + /* Keys in order for scrub? */ + error = xfs_scrub_btree_key(bs, level); + if (error) + goto out; + + /* Drill another level deeper. */ + pp = xfs_btree_ptr_addr(cur, cur->bc_ptrs[level], block); + error = xfs_scrub_btree_ptr(bs, level, pp); + if (error) + goto out; + level--; + error = xfs_btree_lookup_get_block(cur, level, pp, &block); + if (error) + goto out; + + xfs_btree_get_block(cur, level, &bp); + error = xfs_btree_check_block(cur, block, level, bp); + if (error) + goto out; + + cur->bc_ptrs[level] = 1; + } + +out: + /* + * If we don't end this function with the cursor pointing at a record + * block, a subsequent non-error cursor deletion will not release + * node-level buffers, causing a buffer leak. This is quite possible + * with a zero-results range query, so release the buffers if we + * failed to return any results. + */ + if (cur->bc_bufs[0] == NULL) { + for (i = 0; i < cur->bc_nlevels; i++) { + if (cur->bc_bufs[i]) { + xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[i]); + cur->bc_bufs[i] = NULL; + cur->bc_ptrs[i] = 0; + cur->bc_ra[i] = 0; + } + } + } + + if (bs->refc_cur) + xfs_btree_del_cursor(bs->refc_cur, XFS_BTREE_ERROR); + if (bs->rmap_cur && bs->rmap_cur != bs->cur) + xfs_btree_del_cursor(bs->rmap_cur, XFS_BTREE_ERROR); + if (bs->fino_cur) + xfs_btree_del_cursor(bs->fino_cur, XFS_BTREE_ERROR); + if (bs->ino_cur) + xfs_btree_del_cursor(bs->ino_cur, XFS_BTREE_ERROR); + if (bs->cnt_cur) + xfs_btree_del_cursor(bs->cnt_cur, XFS_BTREE_ERROR); + if (bs->bno_cur && bs->bno_cur != bs->cur) + xfs_btree_del_cursor(bs->bno_cur, XFS_BTREE_ERROR); + + if (!error && bs->error) + error = bs->error; + +out_badcursor: + return error; +} diff --git a/fs/xfs/xfs_scrub.h b/fs/xfs/xfs_scrub.h new file mode 100644 index 0000000..474df7e --- /dev/null +++ b/fs/xfs/xfs_scrub.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_SCRUB_H__ +#define __XFS_SCRUB_H__ + +/* Functions to come later. */ + +#endif /* __XFS_SCRUB_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:41:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10C817EFD for ; Thu, 25 Aug 2016 18:41:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D84928F8033 for ; Thu, 25 Aug 2016 16:41:02 -0700 (PDT) X-ASG-Debug-ID: 1472168460-0bf57c55b21c7ab0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id FiFCz6dALNEUpJak (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNexAt017372 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:59 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNexh5027944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:40:59 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNewZf030434; Thu, 25 Aug 2016 23:40:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:40:58 -0700 Subject: [PATCH 07/25] xfs: create an ioctl to scrub AG metadata From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/25] xfs: create an ioctl to scrub AG metadata To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:40:57 -0700 Message-ID: <147216845703.3108.9850206520479318952.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168460 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4333 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create an ioctl that can be used to scrub internal filesystem metadata. The new ioctl takes the metadata type, an (optional) AG number, and a flags argument. This will be used by the upcoming XFS online scrub tool. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 16 ++++++++++++++++ fs/xfs/xfs_ioctl.c | 20 ++++++++++++++++++++ fs/xfs/xfs_scrub.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_scrub.h | 2 +- 4 files changed, 81 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 58e14b14e..22559ab 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -524,6 +524,21 @@ typedef struct xfs_swapext #define XFS_FSOP_GOING_FLAGS_LOGFLUSH 0x1 /* flush log but not data */ #define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */ +/* metadata scrubbing */ +struct xfs_scrub_metadata { + __u32 type; /* What to check? */ + __u32 flags; /* Flags; none defined right now. */ + __u64 control; /* AG or inode number */ + __u64 reserved[6]; /* Must be zero. */ +}; + +/* + * Metadata types and flags for scrub operation. + */ +#define XFS_SCRUB_TYPE_MAX 0 + +#define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ + /* * ioctl limits */ @@ -567,6 +582,7 @@ typedef struct xfs_swapext #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_fs_eofblocks) #define XFS_IOC_GETFSMAP _IOWR('X', 59, struct getfsmap) +#define XFS_IOC_SCRUB_METADATA _IOR ('X', 60, struct xfs_scrub_metadata) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 936cb45..65f0c03 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -44,6 +44,7 @@ #include "xfs_reflink.h" #include "xfs_btree.h" #include "xfs_fsmap.h" +#include "xfs_scrub.h" #include #include @@ -1686,6 +1687,22 @@ xfs_ioc_getfsmap( return 0; } +STATIC int +xfs_ioc_scrub_metadata( + struct xfs_inode *ip, + void __user *arg) +{ + struct xfs_scrub_metadata scrub; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (copy_from_user(&scrub, arg, sizeof(scrub))) + return -EFAULT; + + return xfs_scrub_metadata(ip, &scrub); +} + int xfs_ioc_swapext( xfs_swapext_t *sxp) @@ -1871,6 +1888,9 @@ xfs_file_ioctl( return -EPERM; return xfs_ioc_getfsmap(ip, arg); + case XFS_IOC_SCRUB_METADATA: + return xfs_ioc_scrub_metadata(ip, arg); + case XFS_IOC_FD_TO_HANDLE: case XFS_IOC_PATH_TO_HANDLE: case XFS_IOC_PATH_TO_FSHANDLE: { diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 13bea55..fd24af7 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -703,3 +703,47 @@ out: out_badcursor: return error; } + +/* Scrubbing dispatch. */ + +struct xfs_scrub_meta_fns { + int (*scrub_fn)(struct xfs_inode *, struct xfs_scrub_metadata *); + bool (*has_fn)(struct xfs_sb *); +}; + +static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { +}; + +/* Dispatch metadata scrubbing. */ +int +xfs_scrub_metadata( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + const struct xfs_scrub_meta_fns *fns; + int i; + int error = 0; + + trace_xfs_scrub(ip, sm->type, sm->control, sm->flags, error); + + error = -EINVAL; + for (i = 0; i < ARRAY_SIZE(sm->reserved); i++) + if (sm->reserved[i]) + goto out; + if (sm->type > XFS_SCRUB_TYPE_MAX) + goto out; + if (sm->flags & ~XFS_SCRUB_FLAGS_ALL) + goto out; + + fns = &meta_scrub_fns[sm->type]; + if (fns->has_fn && !fns->has_fn(&mp->m_sb)) { + error = -ENOENT; + goto out; + } + error = fns->scrub_fn(ip, sm); + +out: + trace_xfs_scrub_done(ip, sm->type, sm->control, sm->flags, error); + return error; +} diff --git a/fs/xfs/xfs_scrub.h b/fs/xfs/xfs_scrub.h index 474df7e..f4bb021 100644 --- a/fs/xfs/xfs_scrub.h +++ b/fs/xfs/xfs_scrub.h @@ -20,6 +20,6 @@ #ifndef __XFS_SCRUB_H__ #define __XFS_SCRUB_H__ -/* Functions to come later. */ +int xfs_scrub_metadata(struct xfs_inode *ip, struct xfs_scrub_metadata *sm); #endif /* __XFS_SCRUB_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:41:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 793087F06 for ; Thu, 25 Aug 2016 18:41:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D3491AC001 for ; Thu, 25 Aug 2016 16:41:09 -0700 (PDT) X-ASG-Debug-ID: 1472168467-0bf57c55b21c7ac0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id xcmzOKikXm6CGtu4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:07 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNf5GC024456 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:41:06 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNf5Fo013483 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:41:05 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNf4M0030546; Thu, 25 Aug 2016 23:41:05 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:04 -0700 Subject: [PATCH 08/25] xfs: scrub the backup superblocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/25] xfs: scrub the backup superblocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:03 -0700 Message-ID: <147216846337.3108.10510729691563285944.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168467 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3348 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ensure that the geometry presented in the backup superblocks matches the primary superblock so that repair can recover the filesystem if that primary gets corrupted. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 1 + fs/xfs/xfs_scrub.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 22559ab..8d58061 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -535,6 +535,7 @@ struct xfs_scrub_metadata { /* * Metadata types and flags for scrub operation. */ +#define XFS_SCRUB_TYPE_SB 0 /* superblock */ #define XFS_SCRUB_TYPE_MAX 0 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index fd24af7..3def216 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -704,6 +704,80 @@ out_badcursor: return error; } +/* Metadata scrubbers */ + +/* Scrub the filesystem superblock. */ +STATIC int +xfs_scrub_sb( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_buf *bp; + struct xfs_sb sb; + xfs_agnumber_t agno; + int error; + + if (sm->control >= mp->m_sb.sb_agcount || sm->flags) + return -EINVAL; + agno = sm->control; + + error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, + XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)), + XFS_FSS_TO_BB(mp, 1), 0, &bp, + &xfs_sb_buf_ops); + if (error) + return error; + + if (agno == 0) + goto out; + + xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); + + /* Verify the geometries match. */ +#define XFS_SCRUB_SB_FIELD(fn) \ + XFS_SCRUB_CHECK(mp, bp, "superblock", \ + sb.sb_##fn == mp->m_sb.sb_##fn) + XFS_SCRUB_SB_FIELD(blocksize); + XFS_SCRUB_SB_FIELD(dblocks); + XFS_SCRUB_SB_FIELD(rblocks); + XFS_SCRUB_SB_FIELD(rextents); + XFS_SCRUB_SB_FIELD(logstart); + XFS_SCRUB_SB_FIELD(rextsize); + XFS_SCRUB_SB_FIELD(agblocks); + XFS_SCRUB_SB_FIELD(agcount); + XFS_SCRUB_SB_FIELD(rbmblocks); + XFS_SCRUB_SB_FIELD(logblocks); + XFS_SCRUB_SB_FIELD(sectsize); + XFS_SCRUB_SB_FIELD(inodesize); +#undef XFS_SCRUB_SB_FIELD + +#define XFS_SCRUB_SB_FEAT(fn) \ + XFS_SCRUB_CHECK(mp, bp, "superblock", \ + xfs_sb_version_has##fn(&sb) == xfs_sb_version_has##fn(&mp->m_sb)) + XFS_SCRUB_SB_FEAT(align); + XFS_SCRUB_SB_FEAT(dalign); + XFS_SCRUB_SB_FEAT(logv2); + XFS_SCRUB_SB_FEAT(extflgbit); + XFS_SCRUB_SB_FEAT(sector); + XFS_SCRUB_SB_FEAT(asciici); + XFS_SCRUB_SB_FEAT(morebits); + XFS_SCRUB_SB_FEAT(lazysbcount); + XFS_SCRUB_SB_FEAT(crc); + XFS_SCRUB_SB_FEAT(_pquotino); + XFS_SCRUB_SB_FEAT(ftype); + XFS_SCRUB_SB_FEAT(finobt); + XFS_SCRUB_SB_FEAT(sparseinodes); + XFS_SCRUB_SB_FEAT(metauuid); + XFS_SCRUB_SB_FEAT(rmapbt); + XFS_SCRUB_SB_FEAT(reflink); +#undef XFS_SCRUB_SB_FEAT + +out: + xfs_buf_relse(bp); + return error; +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -712,6 +786,7 @@ struct xfs_scrub_meta_fns { }; static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { + {xfs_scrub_sb, NULL}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:41:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 961667F0F for ; Thu, 25 Aug 2016 18:41:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F0AE6AC001 for ; Thu, 25 Aug 2016 16:41:21 -0700 (PDT) X-ASG-Debug-ID: 1472168479-0bf57b53122095e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4ws8Hm3bBrc904ki (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNfI3l017776 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:18 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNfHWt028596 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:18 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNfBQH016449; Thu, 25 Aug 2016 23:41:17 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:11 -0700 Subject: [PATCH 09/25] xfs: scrub AGF and AGFL From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/25] xfs: scrub AGF and AGFL To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:09 -0700 Message-ID: <147216846953.3108.18345853853421759907.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168479 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6440 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Check the block references in the AGF and AGFL headers to make sure they make sense. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 2 - fs/xfs/libxfs/xfs_alloc.h | 2 + fs/xfs/libxfs/xfs_fs.h | 4 + fs/xfs/xfs_scrub.c | 133 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 8b3e6b3..37782a1 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -629,7 +629,7 @@ const struct xfs_buf_ops xfs_agfl_buf_ops = { /* * Read in the allocation group free block array. */ -STATIC int /* error */ +int /* error */ xfs_alloc_read_agfl( xfs_mount_t *mp, /* mount point structure */ xfs_trans_t *tp, /* transaction pointer */ diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index 0b00de0..c3ada6b 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -204,6 +204,8 @@ xfs_alloc_get_rec( int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); +int xfs_alloc_read_agfl(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_agnumber_t agno, struct xfs_buf **bpp); int xfs_alloc_fix_freelist(struct xfs_alloc_arg *args, int flags); int xfs_free_extent_fix_freelist(struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **agbp); diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 8d58061..8249ae0 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -536,7 +536,9 @@ struct xfs_scrub_metadata { * Metadata types and flags for scrub operation. */ #define XFS_SCRUB_TYPE_SB 0 /* superblock */ -#define XFS_SCRUB_TYPE_MAX 0 +#define XFS_SCRUB_TYPE_AGF 1 /* AG free header */ +#define XFS_SCRUB_TYPE_AGFL 2 /* AG free list */ +#define XFS_SCRUB_TYPE_MAX 2 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 3def216..c04a097 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -778,6 +778,137 @@ out: return error; } +/* Scrub the AGF. */ +STATIC int +xfs_scrub_agf( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_agf *agf; + struct xfs_buf *agi_bp = NULL; + struct xfs_buf *agf_bp = NULL; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + xfs_agblock_t eoag; + xfs_daddr_t daddr; + xfs_daddr_t eofs; + int error; + + if (sm->control >= mp->m_sb.sb_agcount || sm->flags) + return -EINVAL; + agno = sm->control; + + /* Let the verifier check most of the AGF fields. */ + error = xfs_scrub_get_ag_headers(mp, agno, &agi_bp, &agf_bp); + if (error) + return error; + + agf = XFS_BUF_TO_AGF(agf_bp); + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); + + /* Check the AG length */ + eoag = be32_to_cpu(agf->agf_length); + if (agno == mp->m_sb.sb_agcount - 1) { + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", + eoag <= mp->m_sb.sb_agblocks); + } else { + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", + eoag == mp->m_sb.sb_agblocks); + } + daddr = XFS_AGB_TO_DADDR(mp, agno, eoag); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", daddr <= eofs); + + /* Check the AGF btree roots */ + agbno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNO]); + daddr = XFS_AGB_TO_DADDR(mp, agno, agbno); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", agbno < mp->m_sb.sb_agblocks); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", agbno < eoag); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", daddr < eofs); + + agbno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNT]); + daddr = XFS_AGB_TO_DADDR(mp, agno, agbno); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", agbno < mp->m_sb.sb_agblocks); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", agbno < eoag); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", daddr < eofs); + + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + agbno = be32_to_cpu(agf->agf_roots[XFS_BTNUM_RMAP]); + daddr = XFS_AGB_TO_DADDR(mp, agno, agbno); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", + agbno < mp->m_sb.sb_agblocks); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", agbno < eoag); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", daddr < eofs); + } + + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + agbno = be32_to_cpu(agf->agf_refcount_root); + daddr = XFS_AGB_TO_DADDR(mp, agno, agbno); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", + agbno < mp->m_sb.sb_agblocks); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", agbno < eoag); + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", daddr < eofs); + } + + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); + return error; +} + +/* Scrub the AGFL. */ +STATIC int +xfs_scrub_agfl( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_agf *agf; + struct xfs_buf *agi_bp = NULL; + struct xfs_buf *agf_bp = NULL; + struct xfs_buf *agfl_bp; + __be32 *agfl_bno; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + xfs_agblock_t eoag; + xfs_daddr_t eofs; + int i; + int error; + + if (sm->control >= mp->m_sb.sb_agcount || sm->flags) + return -EINVAL; + agno = sm->control; + + /* Let the verifier check most of the AGF fields. */ + error = xfs_scrub_get_ag_headers(mp, agno, &agi_bp, &agf_bp); + if (error) + return error; + + error = xfs_alloc_read_agfl(mp, NULL, agno, &agfl_bp); + if (error) + goto err_no_agfl; + + agf = XFS_BUF_TO_AGF(agf_bp); + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); + eoag = be32_to_cpu(agf->agf_length); + + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agfl_bp); + for (i = be32_to_cpu(agf->agf_flfirst); + i <= be32_to_cpu(agf->agf_fllast); + i++) { + agbno = be32_to_cpu(agfl_bno[i]); + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", + XFS_AGB_TO_DADDR(mp, agno, agbno) < eofs); + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", + agbno < mp->m_sb.sb_agblocks); + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", + agbno < eoag); + } + + xfs_buf_relse(agfl_bp); +err_no_agfl: + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); + return error; +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -787,6 +918,8 @@ struct xfs_scrub_meta_fns { static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_sb, NULL}, + {xfs_scrub_agf, NULL}, + {xfs_scrub_agfl, NULL}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:41:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C5A447F15 for ; Thu, 25 Aug 2016 18:41:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6DAE78F8033 for ; Thu, 25 Aug 2016 16:41:24 -0700 (PDT) X-ASG-Debug-ID: 1472168482-0bf8155c741e7550001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id jD8EGdlZ3ZQYG1LH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:22 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNfLcY017788 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:21 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNfLNh028678 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:21 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNfKjd031376; Thu, 25 Aug 2016 23:41:21 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:20 -0700 Subject: [PATCH 10/25] xfs: scrub the AGI From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/25] xfs: scrub the AGI To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:16 -0700 Message-ID: <147216847640.3108.11528139250590916971.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168482 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3429 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add a forgotten check to the AGI verifier, then wire up the scrub infrastructure to check the AGI contents. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 3 ++- fs/xfs/libxfs/xfs_ialloc.c | 5 ++++ fs/xfs/xfs_scrub.c | 51 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 8249ae0..2d320a7 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -538,7 +538,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_SB 0 /* superblock */ #define XFS_SCRUB_TYPE_AGF 1 /* AG free header */ #define XFS_SCRUB_TYPE_AGFL 2 /* AG free list */ -#define XFS_SCRUB_TYPE_MAX 2 +#define XFS_SCRUB_TYPE_AGI 3 /* AG inode header */ +#define XFS_SCRUB_TYPE_MAX 3 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 60e1a67..1240064 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2514,6 +2514,11 @@ xfs_agi_verify( if (be32_to_cpu(agi->agi_level) > XFS_BTREE_MAXLEVELS) return false; + + if (xfs_sb_version_hasfinobt(&mp->m_sb) && + be32_to_cpu(agi->agi_free_level) > XFS_BTREE_MAXLEVELS) + return false; + /* * during growfs operations, the perag is not fully initialised, * so we can't use it for any useful checking. growfs ensures we can't diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index c04a097..2b1d669 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -909,6 +909,56 @@ err_no_agfl: return error; } +/* Scrub the AGI. */ +STATIC int +xfs_scrub_agi( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_agi *agi; + struct xfs_agf *agf; + struct xfs_buf *agi_bp = NULL; + struct xfs_buf *agf_bp = NULL; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + xfs_agblock_t eoag; + xfs_daddr_t daddr; + xfs_daddr_t eofs; + int error; + + if (sm->control >= mp->m_sb.sb_agcount || sm->flags) + return -EINVAL; + agno = sm->control; + + error = xfs_scrub_get_ag_headers(mp, agno, &agi_bp, &agf_bp); + if (error) + return error; + + agi = XFS_BUF_TO_AGI(agi_bp); + agf = XFS_BUF_TO_AGF(agf_bp); + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); + eoag = be32_to_cpu(agf->agf_length); + + agbno = be32_to_cpu(agi->agi_root); + daddr = XFS_AGB_TO_DADDR(mp, agno, agbno); + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", agbno < mp->m_sb.sb_agblocks); + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", agbno < eoag); + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", daddr < eofs); + + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + agbno = be32_to_cpu(agi->agi_free_root); + daddr = XFS_AGB_TO_DADDR(mp, agno, agbno); + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", + agbno < mp->m_sb.sb_agblocks); + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", agbno < eoag); + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", daddr < eofs); + } + + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); + return error; +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -920,6 +970,7 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_sb, NULL}, {xfs_scrub_agf, NULL}, {xfs_scrub_agfl, NULL}, + {xfs_scrub_agi, NULL}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:41:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 648BA7F1B for ; Thu, 25 Aug 2016 18:41:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE56EAC003 for ; Thu, 25 Aug 2016 16:41:31 -0700 (PDT) X-ASG-Debug-ID: 1472168488-0bf57c55b11c7ae0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id DENkbY7eIXu4x2EZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNfR1U017827 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:28 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNfRH0015303 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:27 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNfRMW016531; Thu, 25 Aug 2016 23:41:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:26 -0700 Subject: [PATCH 11/25] xfs: support scrubbing free space btrees From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/25] xfs: support scrubbing free space btrees To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:25 -0700 Message-ID: <147216848530.3108.15977159193739192185.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168489 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10723 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces necessary to check the free space btrees. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc_btree.c | 156 +++++++++++++++++++++++++++++---------- fs/xfs/libxfs/xfs_fs.h | 4 + fs/xfs/xfs_scrub.c | 80 ++++++++++++++++++++ 3 files changed, 197 insertions(+), 43 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc_btree.c b/fs/xfs/libxfs/xfs_alloc_btree.c index 5ba2dac..d6d81cb 100644 --- a/fs/xfs/libxfs/xfs_alloc_btree.c +++ b/fs/xfs/libxfs/xfs_alloc_btree.c @@ -205,19 +205,28 @@ xfs_allocbt_init_key_from_rec( union xfs_btree_key *key, union xfs_btree_rec *rec) { - ASSERT(rec->alloc.ar_startblock != 0); - key->alloc.ar_startblock = rec->alloc.ar_startblock; key->alloc.ar_blockcount = rec->alloc.ar_blockcount; } STATIC void +xfs_bnobt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + __u32 x; + + x = be32_to_cpu(rec->alloc.ar_startblock); + x += be32_to_cpu(rec->alloc.ar_blockcount) - 1; + key->alloc.ar_startblock = cpu_to_be32(x); + key->alloc.ar_blockcount = 0; +} + +STATIC void xfs_allocbt_init_rec_from_cur( struct xfs_btree_cur *cur, union xfs_btree_rec *rec) { - ASSERT(cur->bc_rec.a.ar_startblock != 0); - rec->alloc.ar_startblock = cpu_to_be32(cur->bc_rec.a.ar_startblock); rec->alloc.ar_blockcount = cpu_to_be32(cur->bc_rec.a.ar_blockcount); } @@ -236,18 +245,24 @@ xfs_allocbt_init_ptr_from_cur( } STATIC __int64_t -xfs_allocbt_key_diff( +xfs_bnobt_key_diff( struct xfs_btree_cur *cur, union xfs_btree_key *key) { xfs_alloc_rec_incore_t *rec = &cur->bc_rec.a; xfs_alloc_key_t *kp = &key->alloc; - __int64_t diff; - if (cur->bc_btnum == XFS_BTNUM_BNO) { - return (__int64_t)be32_to_cpu(kp->ar_startblock) - - rec->ar_startblock; - } + return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; +} + +STATIC __int64_t +xfs_cntbt_key_diff( + struct xfs_btree_cur *cur, + union xfs_btree_key *key) +{ + xfs_alloc_rec_incore_t *rec = &cur->bc_rec.a; + xfs_alloc_key_t *kp = &key->alloc; + __int64_t diff; diff = (__int64_t)be32_to_cpu(kp->ar_blockcount) - rec->ar_blockcount; if (diff) @@ -256,6 +271,33 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } +STATIC __int64_t +xfs_bnobt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return (__int64_t)be32_to_cpu(k1->alloc.ar_startblock) - + be32_to_cpu(k2->alloc.ar_startblock); +} + +STATIC __int64_t +xfs_cntbt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + __int64_t diff; + + diff = be32_to_cpu(k1->alloc.ar_blockcount) - + be32_to_cpu(k2->alloc.ar_blockcount); + if (diff) + return diff; + + return be32_to_cpu(k1->alloc.ar_startblock) - + be32_to_cpu(k2->alloc.ar_startblock); +} + static bool xfs_allocbt_verify( struct xfs_buf *bp) @@ -344,46 +386,76 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int -xfs_allocbt_keys_inorder( +xfs_bnobt_keys_inorder( struct xfs_btree_cur *cur, union xfs_btree_key *k1, union xfs_btree_key *k2) { - if (cur->bc_btnum == XFS_BTNUM_BNO) { - return be32_to_cpu(k1->alloc.ar_startblock) < - be32_to_cpu(k2->alloc.ar_startblock); - } else { - return be32_to_cpu(k1->alloc.ar_blockcount) < - be32_to_cpu(k2->alloc.ar_blockcount) || - (k1->alloc.ar_blockcount == k2->alloc.ar_blockcount && - be32_to_cpu(k1->alloc.ar_startblock) < - be32_to_cpu(k2->alloc.ar_startblock)); - } + return be32_to_cpu(k1->alloc.ar_startblock) < + be32_to_cpu(k2->alloc.ar_startblock); } STATIC int -xfs_allocbt_recs_inorder( +xfs_bnobt_recs_inorder( struct xfs_btree_cur *cur, union xfs_btree_rec *r1, union xfs_btree_rec *r2) { - if (cur->bc_btnum == XFS_BTNUM_BNO) { - return be32_to_cpu(r1->alloc.ar_startblock) + - be32_to_cpu(r1->alloc.ar_blockcount) <= - be32_to_cpu(r2->alloc.ar_startblock); - } else { - return be32_to_cpu(r1->alloc.ar_blockcount) < - be32_to_cpu(r2->alloc.ar_blockcount) || - (r1->alloc.ar_blockcount == r2->alloc.ar_blockcount && - be32_to_cpu(r1->alloc.ar_startblock) < - be32_to_cpu(r2->alloc.ar_startblock)); - } + return be32_to_cpu(r1->alloc.ar_startblock) + + be32_to_cpu(r1->alloc.ar_blockcount) <= + be32_to_cpu(r2->alloc.ar_startblock); } -#endif /* DEBUG */ -static const struct xfs_btree_ops xfs_allocbt_ops = { +STATIC int +xfs_cntbt_keys_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return be32_to_cpu(k1->alloc.ar_blockcount) < + be32_to_cpu(k2->alloc.ar_blockcount) || + (k1->alloc.ar_blockcount == k2->alloc.ar_blockcount && + be32_to_cpu(k1->alloc.ar_startblock) < + be32_to_cpu(k2->alloc.ar_startblock)); +} + +STATIC int +xfs_cntbt_recs_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_rec *r1, + union xfs_btree_rec *r2) +{ + return be32_to_cpu(r1->alloc.ar_blockcount) < + be32_to_cpu(r2->alloc.ar_blockcount) || + (r1->alloc.ar_blockcount == r2->alloc.ar_blockcount && + be32_to_cpu(r1->alloc.ar_startblock) < + be32_to_cpu(r2->alloc.ar_startblock)); +} + +static const struct xfs_btree_ops xfs_bnobt_ops = { + .rec_len = sizeof(xfs_alloc_rec_t), + .key_len = sizeof(xfs_alloc_key_t), + + .dup_cursor = xfs_allocbt_dup_cursor, + .set_root = xfs_allocbt_set_root, + .alloc_block = xfs_allocbt_alloc_block, + .free_block = xfs_allocbt_free_block, + .update_lastrec = xfs_allocbt_update_lastrec, + .get_minrecs = xfs_allocbt_get_minrecs, + .get_maxrecs = xfs_allocbt_get_maxrecs, + .init_key_from_rec = xfs_allocbt_init_key_from_rec, + .init_high_key_from_rec = xfs_bnobt_init_high_key_from_rec, + .init_rec_from_cur = xfs_allocbt_init_rec_from_cur, + .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, + .key_diff = xfs_bnobt_key_diff, + .buf_ops = &xfs_allocbt_buf_ops, + .diff_two_keys = xfs_bnobt_diff_two_keys, + .keys_inorder = xfs_bnobt_keys_inorder, + .recs_inorder = xfs_bnobt_recs_inorder, +}; + +static const struct xfs_btree_ops xfs_cntbt_ops = { .rec_len = sizeof(xfs_alloc_rec_t), .key_len = sizeof(xfs_alloc_key_t), @@ -397,12 +469,11 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .init_key_from_rec = xfs_allocbt_init_key_from_rec, .init_rec_from_cur = xfs_allocbt_init_rec_from_cur, .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, - .key_diff = xfs_allocbt_key_diff, + .key_diff = xfs_cntbt_key_diff, .buf_ops = &xfs_allocbt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) - .keys_inorder = xfs_allocbt_keys_inorder, - .recs_inorder = xfs_allocbt_recs_inorder, -#endif + .diff_two_keys = xfs_cntbt_diff_two_keys, + .keys_inorder = xfs_cntbt_keys_inorder, + .recs_inorder = xfs_cntbt_recs_inorder, }; /* @@ -427,12 +498,13 @@ xfs_allocbt_init_cursor( cur->bc_mp = mp; cur->bc_btnum = btnum; cur->bc_blocklog = mp->m_sb.sb_blocklog; - cur->bc_ops = &xfs_allocbt_ops; if (btnum == XFS_BTNUM_CNT) { + cur->bc_ops = &xfs_cntbt_ops; cur->bc_nlevels = be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]); cur->bc_flags = XFS_BTREE_LASTREC_UPDATE; } else { + cur->bc_ops = &xfs_bnobt_ops; cur->bc_nlevels = be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]); } diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 2d320a7..2cb47e2 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -539,7 +539,9 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_AGF 1 /* AG free header */ #define XFS_SCRUB_TYPE_AGFL 2 /* AG free list */ #define XFS_SCRUB_TYPE_AGI 3 /* AG inode header */ -#define XFS_SCRUB_TYPE_MAX 3 +#define XFS_SCRUB_TYPE_BNOBT 4 /* freesp by block btree */ +#define XFS_SCRUB_TYPE_CNTBT 5 /* freesp by length btree */ +#define XFS_SCRUB_TYPE_MAX 5 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 2b1d669..b93dedb 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -959,6 +959,84 @@ xfs_scrub_agi( return error; } +/* Free space btree scrubber. */ + +/* Scrub a bnobt/cntbt record. */ +STATIC int +xfs_scrub_allocbt_helper( + struct xfs_scrub_btree *bs, + union xfs_btree_rec *rec) +{ + struct xfs_mount *mp = bs->cur->bc_mp; + struct xfs_agf *agf; + xfs_agblock_t bno; + xfs_extlen_t len; + int error = 0; + + bno = be32_to_cpu(rec->alloc.ar_startblock); + len = be32_to_cpu(rec->alloc.ar_blockcount); + agf = XFS_BUF_TO_AGF(bs->agf_bp); + + XFS_BTREC_SCRUB_CHECK(bs, bno < mp->m_sb.sb_agblocks); + XFS_BTREC_SCRUB_CHECK(bs, bno < be32_to_cpu(agf->agf_length)); + XFS_BTREC_SCRUB_CHECK(bs, bno < bno + len); + XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= + mp->m_sb.sb_agblocks); + XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= + be32_to_cpu(agf->agf_length)); + + return error; +} + +/* Scrub the freespace btrees for some AG. */ +STATIC int +xfs_scrub_allocbt( + struct xfs_mount *mp, + struct xfs_scrub_metadata *sm, + xfs_btnum_t which) +{ + struct xfs_scrub_btree bs; + xfs_agnumber_t agno; + int error; + + if (sm->control >= mp->m_sb.sb_agcount || sm->flags) + return -EINVAL; + agno = sm->control; + + error = xfs_scrub_btree_get_ag_headers(mp, &bs, agno); + if (error) + return error; + + bs.cur = xfs_allocbt_init_cursor(mp, NULL, bs.agf_bp, agno, which); + bs.scrub_rec = xfs_scrub_allocbt_helper; + xfs_rmap_ag_owner(&bs.oinfo, XFS_RMAP_OWN_AG); + error = xfs_scrub_btree(&bs); + xfs_btree_del_cursor(bs.cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_scrub_btree_put_ag_headers(&bs); + + if (!error && bs.error) + error = bs.error; + + return error; +} + +STATIC int +xfs_scrub_bnobt( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + return xfs_scrub_allocbt(ip->i_mount, sm, XFS_BTNUM_BNO); +} + +STATIC int +xfs_scrub_cntbt( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + return xfs_scrub_allocbt(ip->i_mount, sm, XFS_BTNUM_CNT); +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -971,6 +1049,8 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_agf, NULL}, {xfs_scrub_agfl, NULL}, {xfs_scrub_agi, NULL}, + {xfs_scrub_bnobt, NULL}, + {xfs_scrub_cntbt, NULL}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:41:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8BA1D7F23 for ; Thu, 25 Aug 2016 18:41:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 554048F8033 for ; Thu, 25 Aug 2016 16:41:38 -0700 (PDT) X-ASG-Debug-ID: 1472168495-0bf57b53112095f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Axx1gc6cbyd61cdY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNfYUZ024633 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:34 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNfY6R015414 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:34 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNfXUd031408; Thu, 25 Aug 2016 23:41:33 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:32 -0700 Subject: [PATCH 12/25] xfs: support scrubbing inode btrees From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 12/25] xfs: support scrubbing inode btrees To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:31 -0700 Message-ID: <147216849160.3108.13963850933878815940.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168496 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10441 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces necessary to check the inode btrees. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 4 + fs/xfs/libxfs/xfs_ialloc.c | 41 +++++++----- fs/xfs/libxfs/xfs_ialloc.h | 3 + fs/xfs/libxfs/xfs_ialloc_btree.c | 32 ++++++++- fs/xfs/xfs_scrub.c | 129 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 186 insertions(+), 23 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 2cb47e2..6b8ff75 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -541,7 +541,9 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_AGI 3 /* AG inode header */ #define XFS_SCRUB_TYPE_BNOBT 4 /* freesp by block btree */ #define XFS_SCRUB_TYPE_CNTBT 5 /* freesp by length btree */ -#define XFS_SCRUB_TYPE_MAX 5 +#define XFS_SCRUB_TYPE_INOBT 6 /* inode btree */ +#define XFS_SCRUB_TYPE_FINOBT 7 /* free inode btree */ +#define XFS_SCRUB_TYPE_MAX 7 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 1240064..ab05f63 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -99,24 +99,14 @@ xfs_inobt_update( return xfs_btree_update(cur, &rec); } -/* - * Get the data from the pointed-to record. - */ -int /* error */ -xfs_inobt_get_rec( - struct xfs_btree_cur *cur, /* btree cursor */ - xfs_inobt_rec_incore_t *irec, /* btree record */ - int *stat) /* output: success/failure */ +void +xfs_inobt_btrec_to_irec( + struct xfs_mount *mp, + union xfs_btree_rec *rec, + struct xfs_inobt_rec_incore *irec) { - union xfs_btree_rec *rec; - int error; - - error = xfs_btree_get_rec(cur, &rec, stat); - if (error || *stat == 0) - return error; - irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); - if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { + if (xfs_sb_version_hassparseinodes(&mp->m_sb)) { irec->ir_holemask = be16_to_cpu(rec->inobt.ir_u.sp.ir_holemask); irec->ir_count = rec->inobt.ir_u.sp.ir_count; irec->ir_freecount = rec->inobt.ir_u.sp.ir_freecount; @@ -131,6 +121,25 @@ xfs_inobt_get_rec( be32_to_cpu(rec->inobt.ir_u.f.ir_freecount); } irec->ir_free = be64_to_cpu(rec->inobt.ir_free); +} + +/* + * Get the data from the pointed-to record. + */ +int /* error */ +xfs_inobt_get_rec( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_inobt_rec_incore_t *irec, /* btree record */ + int *stat) /* output: success/failure */ +{ + union xfs_btree_rec *rec; + int error; + + error = xfs_btree_get_rec(cur, &rec, stat); + if (error || *stat == 0) + return error; + + xfs_inobt_btrec_to_irec(cur->bc_mp, rec, irec); return 0; } diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 0bb8966..8e5861d 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -168,5 +168,8 @@ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); +union xfs_btree_rec; +void xfs_inobt_btrec_to_irec(struct xfs_mount *mp, union xfs_btree_rec *rec, + struct xfs_inobt_rec_incore *irec); #endif /* __XFS_IALLOC_H__ */ diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index eab68ae..f09ec06 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -152,6 +152,18 @@ xfs_inobt_init_key_from_rec( } STATIC void +xfs_inobt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + __u32 x; + + x = be32_to_cpu(rec->inobt.ir_startino); + x += XFS_INODES_PER_CHUNK - 1; + key->inobt.ir_startino = cpu_to_be32(x); +} + +STATIC void xfs_inobt_init_rec_from_cur( struct xfs_btree_cur *cur, union xfs_btree_rec *rec) @@ -205,6 +217,16 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } +STATIC __int64_t +xfs_inobt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return (__int64_t)be32_to_cpu(k1->inobt.ir_startino) - + be32_to_cpu(k2->inobt.ir_startino); +} + static int xfs_inobt_verify( struct xfs_buf *bp) @@ -279,7 +301,6 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { .verify_write = xfs_inobt_write_verify, }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_inobt_keys_inorder( struct xfs_btree_cur *cur, @@ -299,7 +320,6 @@ xfs_inobt_recs_inorder( return be32_to_cpu(r1->inobt.ir_startino) + XFS_INODES_PER_CHUNK <= be32_to_cpu(r2->inobt.ir_startino); } -#endif /* DEBUG */ static const struct xfs_btree_ops xfs_inobt_ops = { .rec_len = sizeof(xfs_inobt_rec_t), @@ -312,14 +332,14 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .get_minrecs = xfs_inobt_get_minrecs, .get_maxrecs = xfs_inobt_get_maxrecs, .init_key_from_rec = xfs_inobt_init_key_from_rec, + .init_high_key_from_rec = xfs_inobt_init_high_key_from_rec, .init_rec_from_cur = xfs_inobt_init_rec_from_cur, .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, .buf_ops = &xfs_inobt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) + .diff_two_keys = xfs_inobt_diff_two_keys, .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, -#endif }; static const struct xfs_btree_ops xfs_finobt_ops = { @@ -333,14 +353,14 @@ static const struct xfs_btree_ops xfs_finobt_ops = { .get_minrecs = xfs_inobt_get_minrecs, .get_maxrecs = xfs_inobt_get_maxrecs, .init_key_from_rec = xfs_inobt_init_key_from_rec, + .init_high_key_from_rec = xfs_inobt_init_high_key_from_rec, .init_rec_from_cur = xfs_inobt_init_rec_from_cur, .init_ptr_from_cur = xfs_finobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, .buf_ops = &xfs_inobt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) + .diff_two_keys = xfs_inobt_diff_two_keys, .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, -#endif }; /* diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index b93dedb..81d24f5 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -1037,6 +1037,133 @@ xfs_scrub_cntbt( return xfs_scrub_allocbt(ip->i_mount, sm, XFS_BTNUM_CNT); } +/* Inode btree scrubber. */ + +/* Scrub an inobt/finobt record. */ +STATIC int +xfs_scrub_iallocbt_helper( + struct xfs_scrub_btree *bs, + union xfs_btree_rec *rec) +{ + struct xfs_mount *mp = bs->cur->bc_mp; + struct xfs_agf *agf; + struct xfs_inobt_rec_incore irec; + __uint16_t holemask; + xfs_agino_t agino; + xfs_agblock_t bno; + xfs_agblock_t eoag; + xfs_extlen_t len; + int holecount; + int i; + int error = 0; + uint64_t holes; + + xfs_inobt_btrec_to_irec(mp, rec, &irec); + + XFS_BTREC_SCRUB_CHECK(bs, irec.ir_count <= XFS_INODES_PER_CHUNK); + XFS_BTREC_SCRUB_CHECK(bs, irec.ir_freecount <= XFS_INODES_PER_CHUNK); + agino = irec.ir_startino; + agf = XFS_BUF_TO_AGF(bs->agf_bp); + eoag = be32_to_cpu(agf->agf_length); + + /* Handle non-sparse inodes */ + if (!xfs_inobt_issparse(irec.ir_holemask)) { + len = XFS_B_TO_FSB(mp, + XFS_INODES_PER_CHUNK * mp->m_sb.sb_inodesize); + bno = XFS_AGINO_TO_AGBNO(mp, agino); + + XFS_BTREC_SCRUB_CHECK(bs, bno < mp->m_sb.sb_agblocks) + XFS_BTREC_SCRUB_CHECK(bs, bno < eoag); + XFS_BTREC_SCRUB_CHECK(bs, bno < bno + len); + XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= + mp->m_sb.sb_agblocks); + XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= + eoag); + return error; + } + + /* Check each chunk of a sparse inode cluster. */ + holemask = irec.ir_holemask; + holecount = 0; + len = XFS_B_TO_FSB(mp, + XFS_INODES_PER_HOLEMASK_BIT * mp->m_sb.sb_inodesize); + holes = ~xfs_inobt_irec_to_allocmask(&irec); + XFS_BTREC_SCRUB_CHECK(bs, (holes & irec.ir_free) == holes); + XFS_BTREC_SCRUB_CHECK(bs, irec.ir_freecount <= irec.ir_count); + + for (i = 0; i < XFS_INOBT_HOLEMASK_BITS; holemask >>= 1, + i++, agino += XFS_INODES_PER_HOLEMASK_BIT) { + if (holemask & 1) { + holecount += XFS_INODES_PER_HOLEMASK_BIT; + continue; + } + bno = XFS_AGINO_TO_AGBNO(mp, agino); + + XFS_BTREC_SCRUB_CHECK(bs, bno < mp->m_sb.sb_agblocks) + XFS_BTREC_SCRUB_CHECK(bs, bno < eoag); + XFS_BTREC_SCRUB_CHECK(bs, bno < bno + len); + XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= + mp->m_sb.sb_agblocks); + XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= + eoag); + } + + XFS_BTREC_SCRUB_CHECK(bs, holecount <= XFS_INODES_PER_CHUNK); + XFS_BTREC_SCRUB_CHECK(bs, holecount + irec.ir_count == + XFS_INODES_PER_CHUNK); + + return error; +} + +/* Scrub the inode btrees for some AG. */ +STATIC int +xfs_scrub_iallocbt( + struct xfs_mount *mp, + struct xfs_scrub_metadata *sm, + xfs_btnum_t which) +{ + struct xfs_scrub_btree bs; + xfs_agnumber_t agno; + int error; + + if (sm->control >= mp->m_sb.sb_agcount || sm->flags) + return -EINVAL; + agno = sm->control; + + error = xfs_scrub_btree_get_ag_headers(mp, &bs, agno); + if (error) + return error; + + bs.cur = xfs_inobt_init_cursor(mp, NULL, bs.agi_bp, agno, which); + bs.scrub_rec = xfs_scrub_iallocbt_helper; + xfs_rmap_ag_owner(&bs.oinfo, XFS_RMAP_OWN_INOBT); + error = xfs_scrub_btree(&bs); + xfs_btree_del_cursor(bs.cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_scrub_btree_put_ag_headers(&bs); + + if (!error && bs.error) + error = bs.error; + + return error; +} + +STATIC int +xfs_scrub_inobt( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + return xfs_scrub_iallocbt(ip->i_mount, sm, XFS_BTNUM_INO); +} + +STATIC int +xfs_scrub_finobt( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + return xfs_scrub_iallocbt(ip->i_mount, sm, XFS_BTNUM_FINO); +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -1051,6 +1178,8 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_agi, NULL}, {xfs_scrub_bnobt, NULL}, {xfs_scrub_cntbt, NULL}, + {xfs_scrub_inobt, NULL}, + {xfs_scrub_finobt, xfs_sb_version_hasfinobt}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:41:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9B87F7F2B for ; Thu, 25 Aug 2016 18:41:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D7A48F8033 for ; Thu, 25 Aug 2016 16:41:45 -0700 (PDT) X-ASG-Debug-ID: 1472168503-0bf8155c751e7620001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id o45Cdbdhg6WsmRQG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:44 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNfgvY024710 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:42 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNff54029140 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:41:41 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNfduf019384; Thu, 25 Aug 2016 23:41:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:39 -0700 Subject: [PATCH 13/25] xfs: support scrubbing rmap btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 13/25] xfs: support scrubbing rmap btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:37 -0700 Message-ID: <147216849790.3108.6113125984791659243.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168503 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5904 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces necessary to check the rmap btree. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 3 + fs/xfs/libxfs/xfs_rmap.c | 3 + fs/xfs/libxfs/xfs_rmap.h | 3 + fs/xfs/libxfs/xfs_rmap_btree.c | 4 -- fs/xfs/xfs_scrub.c | 84 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 6b8ff75..31e091c 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -543,7 +543,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_CNTBT 5 /* freesp by length btree */ #define XFS_SCRUB_TYPE_INOBT 6 /* inode btree */ #define XFS_SCRUB_TYPE_FINOBT 7 /* free inode btree */ -#define XFS_SCRUB_TYPE_MAX 7 +#define XFS_SCRUB_TYPE_RMAPBT 8 /* reverse mapping btree */ +#define XFS_SCRUB_TYPE_MAX 8 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 3a8cc71..b0308fc 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -179,7 +179,8 @@ done: return error; } -static int +/* Convert an internal btree record to an rmap record. */ +int xfs_rmap_btrec_to_irec( union xfs_btree_rec *rec, struct xfs_rmap_irec *irec) diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h index 7899305..188db38 100644 --- a/fs/xfs/libxfs/xfs_rmap.h +++ b/fs/xfs/libxfs/xfs_rmap.h @@ -212,5 +212,8 @@ int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno, int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, struct xfs_rmap_irec *irec, int *stat); +union xfs_btree_rec; +int xfs_rmap_btrec_to_irec(union xfs_btree_rec *rec, + struct xfs_rmap_irec *irec); #endif /* __XFS_RMAP_H__ */ diff --git a/fs/xfs/libxfs/xfs_rmap_btree.c b/fs/xfs/libxfs/xfs_rmap_btree.c index 385c2ac..f4c776d 100644 --- a/fs/xfs/libxfs/xfs_rmap_btree.c +++ b/fs/xfs/libxfs/xfs_rmap_btree.c @@ -377,7 +377,6 @@ const struct xfs_buf_ops xfs_rmapbt_buf_ops = { .verify_write = xfs_rmapbt_write_verify, }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_rmapbt_keys_inorder( struct xfs_btree_cur *cur, @@ -437,7 +436,6 @@ xfs_rmapbt_recs_inorder( return 1; return 0; } -#endif /* DEBUG */ static const struct xfs_btree_ops xfs_rmapbt_ops = { .rec_len = sizeof(struct xfs_rmap_rec), @@ -456,10 +454,8 @@ static const struct xfs_btree_ops xfs_rmapbt_ops = { .key_diff = xfs_rmapbt_key_diff, .buf_ops = &xfs_rmapbt_buf_ops, .diff_two_keys = xfs_rmapbt_diff_two_keys, -#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_rmapbt_keys_inorder, .recs_inorder = xfs_rmapbt_recs_inorder, -#endif }; /* diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 81d24f5..d155c52 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -1164,6 +1164,89 @@ xfs_scrub_finobt( return xfs_scrub_iallocbt(ip->i_mount, sm, XFS_BTNUM_FINO); } +/* Reverse-mapping scrubber. */ + +/* Scrub an rmapbt record. */ +STATIC int +xfs_scrub_rmapbt_helper( + struct xfs_scrub_btree *bs, + union xfs_btree_rec *rec) +{ + struct xfs_mount *mp = bs->cur->bc_mp; + struct xfs_agf *agf; + struct xfs_rmap_irec irec; + xfs_agblock_t eoag; + bool non_inode; + bool is_unwritten; + bool is_bmbt; + bool is_attr; + int error; + + error = xfs_rmap_btrec_to_irec(rec, &irec); + if (error) + return error; + + agf = XFS_BUF_TO_AGF(bs->agf_bp); + eoag = be32_to_cpu(agf->agf_length); + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_startblock < mp->m_sb.sb_agblocks) + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_startblock < eoag); + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_startblock < irec.rm_startblock + + irec.rm_blockcount); + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_startblock + irec.rm_blockcount <= + mp->m_sb.sb_agblocks) + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_startblock + irec.rm_blockcount <= + eoag); + + non_inode = XFS_RMAP_NON_INODE_OWNER(irec.rm_owner); + is_bmbt = irec.rm_flags & XFS_RMAP_BMBT_BLOCK; + is_attr = irec.rm_flags & XFS_RMAP_ATTR_FORK; + is_unwritten = irec.rm_flags & XFS_RMAP_UNWRITTEN; + + XFS_BTREC_SCRUB_CHECK(bs, !is_bmbt || irec.rm_offset == 0); + XFS_BTREC_SCRUB_CHECK(bs, !non_inode || irec.rm_offset == 0); + XFS_BTREC_SCRUB_CHECK(bs, !is_unwritten || !(is_bmbt || non_inode || + is_attr)); + XFS_BTREC_SCRUB_CHECK(bs, !non_inode || !(is_bmbt || is_unwritten || + is_attr)); + + /* XXX: check with the owner */ + + return error; +} + +/* Scrub the rmap btree for some AG. */ +STATIC int +xfs_scrub_rmapbt( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_scrub_btree bs; + xfs_agnumber_t agno; + int error; + + if (sm->control >= mp->m_sb.sb_agcount || sm->flags) + return -EINVAL; + agno = sm->control; + + error = xfs_scrub_btree_get_ag_headers(mp, &bs, agno); + if (error) + return error; + + bs.cur = xfs_rmapbt_init_cursor(mp, NULL, bs.agf_bp, agno); + bs.scrub_rec = xfs_scrub_rmapbt_helper; + xfs_rmap_ag_owner(&bs.oinfo, XFS_RMAP_OWN_AG); + error = xfs_scrub_btree(&bs); + xfs_btree_del_cursor(bs.cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_scrub_btree_put_ag_headers(&bs); + + if (!error && bs.error) + error = bs.error; + + return error; +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -1180,6 +1263,7 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_cntbt, NULL}, {xfs_scrub_inobt, NULL}, {xfs_scrub_finobt, xfs_sb_version_hasfinobt}, + {xfs_scrub_rmapbt, xfs_sb_version_hasrmapbt}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:41:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 26EC47F50 for ; Thu, 25 Aug 2016 18:41:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED8178F8035 for ; Thu, 25 Aug 2016 16:41:49 -0700 (PDT) X-ASG-Debug-ID: 1472168507-0bf57b5311209600001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5EPMdotFLfRtTQcl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNfkRb017973 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:41:47 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNfkt9025856 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:41:46 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNfjaY019412; Thu, 25 Aug 2016 23:41:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:45 -0700 Subject: [PATCH 14/25] xfs: support scrubbing refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 14/25] xfs: support scrubbing refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:44 -0700 Message-ID: <147216850417.3108.11834451022377166006.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168508 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6677 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces necessary to check the refcount btree. If rmap is available, check the reference count by performing an interval query against the rmapbt. v2: Handle the case where the rmap records are not all at least the length of the refcount extent. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 3 +- fs/xfs/libxfs/xfs_refcount_btree.c | 33 +++++++++++++----- fs/xfs/xfs_scrub.c | 67 ++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 9 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 31e091c..60dfe03 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -544,7 +544,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_INOBT 6 /* inode btree */ #define XFS_SCRUB_TYPE_FINOBT 7 /* free inode btree */ #define XFS_SCRUB_TYPE_RMAPBT 8 /* reverse mapping btree */ -#define XFS_SCRUB_TYPE_MAX 8 +#define XFS_SCRUB_TYPE_REFCNTBT 9 /* reference count btree */ +#define XFS_SCRUB_TYPE_MAX 9 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/libxfs/xfs_refcount_btree.c b/fs/xfs/libxfs/xfs_refcount_btree.c index fa8dfd6..a58540c 100644 --- a/fs/xfs/libxfs/xfs_refcount_btree.c +++ b/fs/xfs/libxfs/xfs_refcount_btree.c @@ -164,18 +164,26 @@ xfs_refcountbt_init_key_from_rec( union xfs_btree_key *key, union xfs_btree_rec *rec) { - ASSERT(rec->refc.rc_startblock != 0); - key->refc.rc_startblock = rec->refc.rc_startblock; } STATIC void +xfs_refcountbt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + __u32 x; + + x = be32_to_cpu(rec->refc.rc_startblock); + x += be32_to_cpu(rec->refc.rc_blockcount) - 1; + key->refc.rc_startblock = cpu_to_be32(x); +} + +STATIC void xfs_refcountbt_init_rec_from_cur( struct xfs_btree_cur *cur, union xfs_btree_rec *rec) { - ASSERT(cur->bc_rec.rc.rc_startblock != 0); - rec->refc.rc_startblock = cpu_to_be32(cur->bc_rec.rc.rc_startblock); rec->refc.rc_blockcount = cpu_to_be32(cur->bc_rec.rc.rc_blockcount); rec->refc.rc_refcount = cpu_to_be32(cur->bc_rec.rc.rc_refcount); @@ -205,6 +213,16 @@ xfs_refcountbt_key_diff( return (__int64_t)be32_to_cpu(kp->rc_startblock) - rec->rc_startblock; } +STATIC __int64_t +xfs_refcountbt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return (__int64_t)be32_to_cpu(k1->refc.rc_startblock) - + be32_to_cpu(k2->refc.rc_startblock); +} + STATIC bool xfs_refcountbt_verify( struct xfs_buf *bp) @@ -267,7 +285,6 @@ const struct xfs_buf_ops xfs_refcountbt_buf_ops = { .verify_write = xfs_refcountbt_write_verify, }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_refcountbt_keys_inorder( struct xfs_btree_cur *cur, @@ -296,13 +313,13 @@ xfs_refcountbt_recs_inorder( b.rc_startblock = be32_to_cpu(r2->refc.rc_startblock); b.rc_blockcount = be32_to_cpu(r2->refc.rc_blockcount); b.rc_refcount = be32_to_cpu(r2->refc.rc_refcount); + a = a; b = b; trace_xfs_refcount_rec_order_error(cur->bc_mp, cur->bc_private.a.agno, &a, &b); } return ret; } -#endif /* DEBUG */ static const struct xfs_btree_ops xfs_refcountbt_ops = { .rec_len = sizeof(struct xfs_refcount_rec), @@ -315,14 +332,14 @@ static const struct xfs_btree_ops xfs_refcountbt_ops = { .get_minrecs = xfs_refcountbt_get_minrecs, .get_maxrecs = xfs_refcountbt_get_maxrecs, .init_key_from_rec = xfs_refcountbt_init_key_from_rec, + .init_high_key_from_rec = xfs_refcountbt_init_high_key_from_rec, .init_rec_from_cur = xfs_refcountbt_init_rec_from_cur, .init_ptr_from_cur = xfs_refcountbt_init_ptr_from_cur, .key_diff = xfs_refcountbt_key_diff, .buf_ops = &xfs_refcountbt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) + .diff_two_keys = xfs_refcountbt_diff_two_keys, .keys_inorder = xfs_refcountbt_keys_inorder, .recs_inorder = xfs_refcountbt_recs_inorder, -#endif }; /* diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index d155c52..4894221 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -1247,6 +1247,72 @@ xfs_scrub_rmapbt( return error; } +/* Reference count btree scrubber. */ + +/* Scrub a refcountbt record. */ +STATIC int +xfs_scrub_refcountbt_helper( + struct xfs_scrub_btree *bs, + union xfs_btree_rec *rec) +{ + struct xfs_mount *mp = bs->cur->bc_mp; + struct xfs_agf *agf; + struct xfs_refcount_irec irec; + xfs_agblock_t eoag; + int error = 0; + + irec.rc_startblock = be32_to_cpu(rec->refc.rc_startblock); + irec.rc_blockcount = be32_to_cpu(rec->refc.rc_blockcount); + irec.rc_refcount = be32_to_cpu(rec->refc.rc_refcount); + agf = XFS_BUF_TO_AGF(bs->agf_bp); + eoag = be32_to_cpu(agf->agf_length); + + XFS_BTREC_SCRUB_CHECK(bs, irec.rc_startblock < mp->m_sb.sb_agblocks); + XFS_BTREC_SCRUB_CHECK(bs, irec.rc_startblock < eoag); + XFS_BTREC_SCRUB_CHECK(bs, irec.rc_startblock < irec.rc_startblock + + irec.rc_blockcount); + XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)irec.rc_startblock + + irec.rc_blockcount <= mp->m_sb.sb_agblocks); + XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)irec.rc_startblock + + irec.rc_blockcount <= eoag); + XFS_BTREC_SCRUB_CHECK(bs, irec.rc_refcount >= 1); + + return error; +} + +/* Scrub the refcount btree for some AG. */ +STATIC int +xfs_scrub_refcountbt( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_scrub_btree bs; + xfs_agnumber_t agno; + int error; + + if (sm->control >= mp->m_sb.sb_agcount || sm->flags) + return -EINVAL; + agno = sm->control; + + error = xfs_scrub_btree_get_ag_headers(mp, &bs, agno); + if (error) + return error; + + bs.cur = xfs_refcountbt_init_cursor(mp, NULL, bs.agf_bp, agno, NULL); + bs.scrub_rec = xfs_scrub_refcountbt_helper; + xfs_rmap_ag_owner(&bs.oinfo, XFS_RMAP_OWN_REFC); + error = xfs_scrub_btree(&bs); + xfs_btree_del_cursor(bs.cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_scrub_btree_put_ag_headers(&bs); + + if (!error && bs.error) + error = bs.error; + + return error; +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -1264,6 +1330,7 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_inobt, NULL}, {xfs_scrub_finobt, xfs_sb_version_hasfinobt}, {xfs_scrub_rmapbt, xfs_sb_version_hasrmapbt}, + {xfs_scrub_refcountbt, xfs_sb_version_hasreflink}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:41:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4E6D37F32 for ; Thu, 25 Aug 2016 18:41:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 056FA304043 for ; Thu, 25 Aug 2016 16:41:55 -0700 (PDT) X-ASG-Debug-ID: 1472168514-0bf8155c751e7680001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id mElOxi9KMjRCCNzX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:41:54 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNfqZF018047 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:41:53 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNfqQB026054 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:41:52 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNfqeV019446; Thu, 25 Aug 2016 23:41:52 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:51 -0700 Subject: [PATCH 15/25] xfs: scrub inodes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 15/25] xfs: scrub inodes To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:50 -0700 Message-ID: <147216851043.3108.602921681514529851.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168514 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4207 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Scrub the fields within an inode. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 3 +- fs/xfs/xfs_itable.c | 2 + fs/xfs/xfs_itable.h | 5 +++ fs/xfs/xfs_scrub.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 60dfe03..30903d1 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -545,7 +545,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_FINOBT 7 /* free inode btree */ #define XFS_SCRUB_TYPE_RMAPBT 8 /* reverse mapping btree */ #define XFS_SCRUB_TYPE_REFCNTBT 9 /* reference count btree */ -#define XFS_SCRUB_TYPE_MAX 9 +#define XFS_SCRUB_TYPE_INODE 10 /* inode record */ +#define XFS_SCRUB_TYPE_MAX 10 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 66e8817..4fd5fe1 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -31,7 +31,7 @@ #include "xfs_trace.h" #include "xfs_icache.h" -STATIC int +int xfs_internal_inum( xfs_mount_t *mp, xfs_ino_t ino) diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index 6ea8b39..dd2427b 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -96,4 +96,9 @@ xfs_inumbers( void __user *buffer, /* buffer with inode info */ inumbers_fmt_pf formatter); +int +xfs_internal_inum( + xfs_mount_t *mp, + xfs_ino_t ino); + #endif /* __XFS_ITABLE_H__ */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 4894221..383a00e 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -43,6 +43,8 @@ #include "xfs_rmap.h" #include "xfs_rmap_btree.h" #include "xfs_rtalloc.h" +#include "xfs_icache.h" +#include "xfs_itable.h" /* Report a scrub corruption in dmesg. */ STATIC void @@ -1313,6 +1315,72 @@ xfs_scrub_refcountbt( return error; } +/* Scrub an inode. */ +STATIC int +xfs_scrub_inode( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_inode *ips; + int error; + + if (sm->flags) + return -EINVAL; + + if (sm->control && sm->control != ip->i_ino) { + if (xfs_internal_inum(mp, sm->control)) { + error = -ENOENT; + goto out; + } + error = xfs_iget(ip->i_mount, NULL, sm->control, + XFS_IGET_UNTRUSTED | XFS_IGET_DONTCACHE, + XFS_ILOCK_EXCL, &ips); + if (error) + goto out; + } else { + ips = ip; + xfs_ilock(ips, XFS_ILOCK_EXCL); + } + + /* The verifiers should refuse any inode with bad fields. */ + XFS_INO_SCRUB_GOTO(ips, NULL, "inode", ips != NULL, out_unlock); + + XFS_INO_SCRUB_CHECK(ips, NULL, "inode", + ips->i_d.di_projid_hi == 0 || + xfs_sb_version_hasprojid32bit(&mp->m_sb)); + + if (ips->i_d.di_flags & XFS_DIFLAG_EXTSIZE) { + XFS_INO_SCRUB_CHECK(ips, NULL, "inode", + ips->i_d.di_extsize > 0); + XFS_INO_SCRUB_CHECK(ips, NULL, "inode", + ips->i_d.di_extsize <= MAXEXTLEN); + XFS_INO_SCRUB_CHECK(ips, NULL, "inode", + XFS_IS_REALTIME_INODE(ip) || + ips->i_d.di_extsize <= mp->m_sb.sb_agblocks / 2); + } + XFS_INO_SCRUB_CHECK(ips, NULL, "inode", + !(ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE) || + !(ip->i_d.di_flags & XFS_DIFLAG_APPEND)); + + if (ips->i_d.di_version == 3 && + ips->i_d.di_flags2 & XFS_DIFLAG2_COWEXTSIZE) { + XFS_INO_SCRUB_CHECK(ips, NULL, "inode", + ips->i_d.di_cowextsize > 0); + XFS_INO_SCRUB_CHECK(ips, NULL, "inode", + ips->i_d.di_cowextsize <= MAXEXTLEN); + XFS_INO_SCRUB_CHECK(ips, NULL, "inode", + ips->i_d.di_cowextsize <= mp->m_sb.sb_agblocks / 2); + } + +out_unlock: + xfs_iunlock(ips, XFS_ILOCK_EXCL); + if (ips != ip) + IRELE(ips); +out: + return error; +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -1331,6 +1399,7 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_finobt, xfs_sb_version_hasfinobt}, {xfs_scrub_rmapbt, xfs_sb_version_hasrmapbt}, {xfs_scrub_refcountbt, xfs_sb_version_hasreflink}, + {xfs_scrub_inode, NULL}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:42:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 271B77F66 for ; Thu, 25 Aug 2016 18:42:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EE9568F8033 for ; Thu, 25 Aug 2016 16:42:03 -0700 (PDT) X-ASG-Debug-ID: 1472168520-0bf57c55b21c7b30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zCxlrkJWiximpiQB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNfx09018095 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:41:59 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNfwWR026126 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:41:59 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNfw6n030816; Thu, 25 Aug 2016 23:41:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:41:58 -0700 Subject: [PATCH 16/25] xfs: scrub inode block mappings From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 16/25] xfs: scrub inode block mappings To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:41:56 -0700 Message-ID: <147216851666.3108.9311932165996955396.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168521 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12748 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Scrub an individual inode's block mappings to make sure they make sense. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 2 fs/xfs/libxfs/xfs_bmap.h | 6 + fs/xfs/libxfs/xfs_bmap_btree.c | 26 +++- fs/xfs/libxfs/xfs_fs.h | 5 + fs/xfs/xfs_scrub.c | 296 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 329 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 9ae4a3a..7a91618 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -1425,7 +1425,7 @@ xfs_bmap_search_multi_extents( * Else, *lastxp will be set to the index of the found * entry; *gotp will contain the entry. */ -STATIC xfs_bmbt_rec_host_t * /* pointer to found extent entry */ +xfs_bmbt_rec_host_t * /* pointer to found extent entry */ xfs_bmap_search_extents( xfs_inode_t *ip, /* incore inode pointer */ xfs_fileoff_t bno, /* block number searched for */ diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 134ea00..4afa21c 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -259,4 +259,10 @@ int xfs_bmap_unmap_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, struct xfs_inode *ip, int whichfork, struct xfs_bmbt_irec *imap); +struct xfs_bmbt_rec_host * + xfs_bmap_search_extents(struct xfs_inode *ip, xfs_fileoff_t bno, + int fork, int *eofp, xfs_extnum_t *lastxp, + struct xfs_bmbt_irec *gotp, + struct xfs_bmbt_irec *prevp); + #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index 8007d2b..1fc3eed 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -623,6 +623,16 @@ xfs_bmbt_init_key_from_rec( } STATIC void +xfs_bmbt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + key->bmbt.br_startoff = cpu_to_be64( + xfs_bmbt_disk_get_startoff(&rec->bmbt) + + xfs_bmbt_disk_get_blockcount(&rec->bmbt) - 1); +} + +STATIC void xfs_bmbt_init_rec_from_cur( struct xfs_btree_cur *cur, union xfs_btree_rec *rec) @@ -647,6 +657,16 @@ xfs_bmbt_key_diff( cur->bc_rec.b.br_startoff; } +STATIC __int64_t +xfs_bmbt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return (__int64_t)be64_to_cpu(k1->bmbt.br_startoff) - + be64_to_cpu(k2->bmbt.br_startoff); +} + static bool xfs_bmbt_verify( struct xfs_buf *bp) @@ -737,7 +757,6 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_bmbt_keys_inorder( struct xfs_btree_cur *cur, @@ -758,7 +777,6 @@ xfs_bmbt_recs_inorder( xfs_bmbt_disk_get_blockcount(&r1->bmbt) <= xfs_bmbt_disk_get_startoff(&r2->bmbt); } -#endif /* DEBUG */ static const struct xfs_btree_ops xfs_bmbt_ops = { .rec_len = sizeof(xfs_bmbt_rec_t), @@ -772,14 +790,14 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .get_minrecs = xfs_bmbt_get_minrecs, .get_dmaxrecs = xfs_bmbt_get_dmaxrecs, .init_key_from_rec = xfs_bmbt_init_key_from_rec, + .init_high_key_from_rec = xfs_bmbt_init_high_key_from_rec, .init_rec_from_cur = xfs_bmbt_init_rec_from_cur, .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, .key_diff = xfs_bmbt_key_diff, + .diff_two_keys = xfs_bmbt_diff_two_keys, .buf_ops = &xfs_bmbt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, -#endif }; /* diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 30903d1..c688deb 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -546,7 +546,10 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_RMAPBT 8 /* reverse mapping btree */ #define XFS_SCRUB_TYPE_REFCNTBT 9 /* reference count btree */ #define XFS_SCRUB_TYPE_INODE 10 /* inode record */ -#define XFS_SCRUB_TYPE_MAX 10 +#define XFS_SCRUB_TYPE_BMBTD 11 /* data fork block mapping */ +#define XFS_SCRUB_TYPE_BMBTA 12 /* attr fork block mapping */ +#define XFS_SCRUB_TYPE_BMBTC 13 /* CoW fork block mapping */ +#define XFS_SCRUB_TYPE_MAX 13 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 383a00e..573acd4 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -1381,6 +1381,299 @@ out: return error; } +/* + * Inode fork block mapping (BMBT) scrubber. + * More complex than the others because we have to scrub + * all the extents regardless of whether or not the fork + * is in btree format. + */ + +struct xfs_scrub_bmap_info { + struct xfs_scrub_btree bs; + struct xfs_inode *ip; + const char *type; + xfs_daddr_t eofs; + xfs_fileoff_t lastoff; + bool is_rt; + bool is_shared; + bool scrub_btrec; + int whichfork; +}; + +/* Scrub a single extent record. */ +STATIC int +xfs_scrub_bmap_extent( + struct xfs_inode *ip, + struct xfs_scrub_bmap_info *info, + struct xfs_bmbt_irec *irec) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_buf *bp = NULL; + struct xfs_buf *agi_bp = NULL; + struct xfs_buf *agf_bp = NULL; + xfs_daddr_t daddr; + xfs_daddr_t dlen; + xfs_agnumber_t agno; + xfs_fsblock_t bno; + int error = 0; + int err2 = 0; + + if (info->bs.cur) + xfs_btree_get_block(info->bs.cur, 0, &bp); + + XFS_INO_SCRUB_CHECK(ip, bp, info->type, + irec->br_startoff >= info->lastoff); + XFS_INO_SCRUB_CHECK(ip, bp, info->type, + irec->br_startblock != HOLESTARTBLOCK); + + if (irec->br_startblock == DELAYSTARTBLOCK) { + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + irec->br_state == XFS_EXT_NORM); + goto out; + } + + /* Actual mapping, so check the block ranges. */ + if (info->is_rt) { + daddr = XFS_FSB_TO_BB(mp, irec->br_startblock); + agno = NULLAGNUMBER; + bno = irec->br_startblock; + } else { + daddr = XFS_FSB_TO_DADDR(mp, irec->br_startblock); + agno = XFS_FSB_TO_AGNO(mp, irec->br_startblock); + bno = XFS_FSB_TO_AGBNO(mp, irec->br_startblock); + } + dlen = XFS_FSB_TO_BB(mp, irec->br_blockcount); + XFS_INO_SCRUB_CHECK(ip, bp, info->type, daddr < info->eofs); + XFS_INO_SCRUB_CHECK(ip, bp, info->type, + daddr + dlen < info->eofs); + XFS_INO_SCRUB_CHECK(ip, bp, info->type, + irec->br_state != XFS_EXT_UNWRITTEN || + xfs_sb_version_hasextflgbit(&mp->m_sb)); + + /* Set ourselves up for cross-referencing later. */ + if (!info->is_rt) { + err2 = xfs_scrub_get_ag_headers(mp, agno, &agi_bp, &agf_bp); + if (err2) + goto out; + } + +out: + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); + info->lastoff = irec->br_startoff + irec->br_blockcount; + if (!error && err2) + error = err2; + return error; +} + +/* Scrub a bmbt record. */ +STATIC int +xfs_scrub_bmapbt_helper( + struct xfs_scrub_btree *bs, + union xfs_btree_rec *rec) +{ + struct xfs_bmbt_rec_host ihost; + struct xfs_bmbt_irec irec; + struct xfs_scrub_bmap_info *info; + int error; + + info = container_of(bs, struct xfs_scrub_bmap_info, bs); + if (!info->scrub_btrec) + return 0; + + /* Set up the in-core record and scrub it. */ + ihost.l0 = be64_to_cpu(rec->bmbt.l0); + ihost.l1 = be64_to_cpu(rec->bmbt.l1); + xfs_bmbt_get_all(&ihost, &irec); + error = xfs_scrub_bmap_extent(info->ip, info, &irec); + + /* Record the error, but keep going. */ + if (bs->error == 0 && error != 0) + bs->error = error; + return 0; +} + +/* Scrub an inode fork's block mappings. */ +STATIC int +xfs_scrub_bmap( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm, + int whichfork) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + struct xfs_bmbt_irec irec; + struct xfs_bmbt_irec imap; + struct xfs_scrub_bmap_info info; + xfs_fileoff_t off; + xfs_fileoff_t endoff; + xfs_extnum_t extnum; + int eof; + int nmaps; + int flags = 0; + int error = 0; + int err2 = 0; + + if (sm->control || sm->flags) + return -EINVAL; + + memset(&info, 0, sizeof(info)); + switch (whichfork) { + case XFS_DATA_FORK: + info.type = "data fork"; + break; + case XFS_ATTR_FORK: + info.type = "attr fork"; + break; + case XFS_COW_FORK: + info.type = "CoW fork"; + break; + default: + info.type = NULL; + ASSERT(0); + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + ifp = XFS_IFORK_PTR(ip, whichfork); + + info.is_rt = whichfork == XFS_DATA_FORK && XFS_IS_REALTIME_INODE(ip); + info.eofs = XFS_FSB_TO_BB(mp, info.is_rt ? mp->m_sb.sb_rblocks : + mp->m_sb.sb_dblocks); + info.ip = ip; + info.whichfork = whichfork; + info.is_shared = whichfork == XFS_DATA_FORK && xfs_is_reflink_inode(ip); + + switch (whichfork) { + case XFS_COW_FORK: + /* Non-existent CoW forks are ignorable. */ + if (!ifp) + goto out_unlock; + /* No CoW forks on non-reflink inodes/filesystems. */ + XFS_INO_SCRUB_GOTO(ip, NULL, info.type, + xfs_is_reflink_inode(ip), out_unlock); + break; + case XFS_ATTR_FORK: + if (!ifp) + goto out_unlock; + XFS_INO_SCRUB_CHECK(ip, NULL, info.type, + xfs_sb_version_hasattr(&mp->m_sb)); + break; + } + + /* Check the fork values */ + switch (XFS_IFORK_FORMAT(ip, whichfork)) { + case XFS_DINODE_FMT_UUID: + case XFS_DINODE_FMT_DEV: + case XFS_DINODE_FMT_LOCAL: + /* No mappings to check. */ + goto out_unlock; + case XFS_DINODE_FMT_EXTENTS: + XFS_INO_SCRUB_GOTO(ip, NULL, info.type, + ifp->if_flags & XFS_IFEXTENTS, out_unlock); + break; + case XFS_DINODE_FMT_BTREE: + XFS_INO_SCRUB_CHECK(ip, NULL, info.type, + whichfork != XFS_COW_FORK); + /* + * Scan the btree. If extents aren't loaded, have the btree + * scrub routine examine the extent records. + */ + info.scrub_btrec = !(ifp->if_flags & XFS_IFEXTENTS); + + info.bs.cur = xfs_bmbt_init_cursor(mp, NULL, ip, whichfork); + info.bs.scrub_rec = xfs_scrub_bmapbt_helper; + xfs_rmap_ino_bmbt_owner(&info.bs.oinfo, ip->i_ino, whichfork); + err2 = xfs_scrub_btree(&info.bs); + xfs_btree_del_cursor(info.bs.cur, + err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + info.bs.cur = NULL; + if (err2) + goto out_unlock; + if (error == 0 && info.bs.error != 0) + error = info.bs.error; + if (info.scrub_btrec) + goto out_unlock; + break; + default: + XFS_INO_SCRUB_GOTO(ip, NULL, info.type, false, out_unlock); + break; + } + + /* Extent data is in memory, so scrub that. */ + switch (whichfork) { + case XFS_ATTR_FORK: + flags |= XFS_BMAPI_ATTRFORK; + break; + case XFS_COW_FORK: + flags |= XFS_BMAPI_COWFORK; + break; + default: + break; + } + + /* Find the offset of the last extent in the mapping. */ + xfs_bmap_search_extents(ip, -1ULL, whichfork, &eof, &extnum, + &irec, &imap); + + /* Scrub extent records. */ + off = 0; + endoff = irec.br_startoff + irec.br_blockcount; + while (true) { + nmaps = 1; + err2 = xfs_bmapi_read(ip, off, endoff - off, &irec, + &nmaps, flags); + if (err2 || nmaps == 0 || irec.br_startoff > endoff) + break; + + /* Scrub non-hole extent. */ + if (irec.br_startblock != HOLESTARTBLOCK) { + err2 = xfs_scrub_bmap_extent(ip, &info, &irec); + if (!error && err2) + error = err2; + if (xfs_scrub_should_terminate(&error)) + break; + } + + off += irec.br_blockcount; + } + +out_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + if (error == 0 && err2 != 0) + error = err2; + return error; +} + +/* Scrub an inode's data fork. */ +STATIC int +xfs_scrub_bmap_data( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + return xfs_scrub_bmap(ip, sm, XFS_DATA_FORK); +} + +/* Scrub an inode's attr fork. */ +STATIC int +xfs_scrub_bmap_attr( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + return xfs_scrub_bmap(ip, sm, XFS_ATTR_FORK); +} + +/* Scrub an inode's CoW fork. */ +STATIC int +xfs_scrub_bmap_cow( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + if (!xfs_is_reflink_inode(ip)) + return -ENOENT; + + return xfs_scrub_bmap(ip, sm, XFS_COW_FORK); +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -1400,6 +1693,9 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_rmapbt, xfs_sb_version_hasrmapbt}, {xfs_scrub_refcountbt, xfs_sb_version_hasreflink}, {xfs_scrub_inode, NULL}, + {xfs_scrub_bmap_data, NULL}, + {xfs_scrub_bmap_attr, NULL}, + {xfs_scrub_bmap_cow, NULL}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:42:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 12A187F6F for ; Thu, 25 Aug 2016 18:42:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D8CC88F8033 for ; Thu, 25 Aug 2016 16:42:09 -0700 (PDT) X-ASG-Debug-ID: 1472168527-0bf57c55b21c7b40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 5v2sYjd5XlaHiJe2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:07 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNg5NL025064 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:42:06 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNg540014643 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:05 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNg4bF031495; Thu, 25 Aug 2016 23:42:05 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:42:04 -0700 Subject: [PATCH 17/25] xfs: scrub realtime bitmap/summary From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 17/25] xfs: scrub realtime bitmap/summary To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:03 -0700 Message-ID: <147216852298.3108.7894874786598979745.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168527 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5661 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Perform simple tests of the realtime bitmap and summary. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_format.h | 5 +++ fs/xfs/libxfs/xfs_fs.h | 4 ++ fs/xfs/libxfs/xfs_rtbitmap.c | 2 + fs/xfs/xfs_rtalloc.h | 3 ++ fs/xfs/xfs_scrub.c | 78 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index a3aa5e9..5703b57 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -315,6 +315,11 @@ static inline bool xfs_sb_good_version(struct xfs_sb *sbp) return false; } +static inline bool xfs_sb_version_hasrealtime(struct xfs_sb *sbp) +{ + return sbp->sb_rblocks > 0; +} + /* * Detect a mismatched features2 field. Older kernels read/wrote * this into the wrong slot, so to be safe we keep them in sync. diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index c688deb..211c874 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -549,7 +549,9 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_BMBTD 11 /* data fork block mapping */ #define XFS_SCRUB_TYPE_BMBTA 12 /* attr fork block mapping */ #define XFS_SCRUB_TYPE_BMBTC 13 /* CoW fork block mapping */ -#define XFS_SCRUB_TYPE_MAX 13 +#define XFS_SCRUB_TYPE_RTBITMAP 14 /* realtime bitmap */ +#define XFS_SCRUB_TYPE_RTSUM 15 /* realtime summary */ +#define XFS_SCRUB_TYPE_MAX 15 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index ea45584..f4b68c0 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -70,7 +70,7 @@ const struct xfs_buf_ops xfs_rtbuf_ops = { * Get a buffer for the bitmap or summary file block specified. * The buffer is returned read and locked. */ -static int +int xfs_rtbuf_get( xfs_mount_t *mp, /* file system mount structure */ xfs_trans_t *tp, /* transaction pointer */ diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h index 355dd9e..91e48f9 100644 --- a/fs/xfs/xfs_rtalloc.h +++ b/fs/xfs/xfs_rtalloc.h @@ -98,6 +98,8 @@ xfs_growfs_rt( /* * From xfs_rtbitmap.c */ +int xfs_rtbuf_get(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_rtblock_t block, int issum, struct xfs_buf **bpp); int xfs_rtcheck_range(struct xfs_mount *mp, struct xfs_trans *tp, xfs_rtblock_t start, xfs_extlen_t len, int val, xfs_rtblock_t *new, int *stat); @@ -126,6 +128,7 @@ int xfs_rtfree_range(struct xfs_mount *mp, struct xfs_trans *tp, # define xfs_rtfree_extent(t,b,l) (ENOSYS) # define xfs_rtpick_extent(m,t,l,rb) (ENOSYS) # define xfs_growfs_rt(mp,in) (ENOSYS) +# define xfs_rtbuf_get(m,t,b,i,p) (ENOSYS) static inline int /* error */ xfs_rtmount_init( xfs_mount_t *mp) /* file system mount structure */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 573acd4..22ba07d 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -773,6 +773,7 @@ xfs_scrub_sb( XFS_SCRUB_SB_FEAT(metauuid); XFS_SCRUB_SB_FEAT(rmapbt); XFS_SCRUB_SB_FEAT(reflink); + XFS_SCRUB_SB_FEAT(realtime); #undef XFS_SCRUB_SB_FEAT out: @@ -1674,6 +1675,81 @@ xfs_scrub_bmap_cow( return xfs_scrub_bmap(ip, sm, XFS_COW_FORK); } +/* Scrub the realtime bitmap. */ +STATIC int +xfs_scrub_rtbitmap( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_buf *bp = NULL; + xfs_rtblock_t rtstart; + xfs_rtblock_t rtend; + xfs_rtblock_t block; + xfs_rtblock_t rem; + int is_free; + int error = 0; + int err2 = 0; + + if (sm->control || sm->flags) + return -EINVAL; + + xfs_ilock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); + + /* Iterate the bitmap, looking for discrepancies. */ + rtstart = 0; + rem = mp->m_sb.sb_rblocks; + while (rem) { + if (xfs_scrub_should_terminate(&error)) + break; + + /* Is the first block free? */ + err2 = xfs_rtcheck_range(mp, NULL, rtstart, 1, 1, &rtend, + &is_free); + if (err2) + goto out_unlock; + + /* How long does the extent go for? */ + err2 = xfs_rtfind_forw(mp, NULL, rtstart, + mp->m_sb.sb_rblocks - 1, &rtend); + if (err2) + goto out_unlock; + + /* Find the buffer for error reporting. */ + block = XFS_BITTOBLOCK(mp, rtstart); + err2 = xfs_rtbuf_get(mp, NULL, block, 0, &bp); + if (err2) + break; + XFS_SCRUB_CHECK(mp, bp, "rtbitmap", rtend >= rtstart); + + xfs_buf_relse(bp); + bp = NULL; + rem -= rtend - rtstart + 1; + rtstart = rtend + 1; + } + +out_unlock: + if (bp) + xfs_buf_relse(bp); + xfs_iunlock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); + if (!error && err2) + error = err2; + return error; +} + +/* Scrub the realtime summary. */ +STATIC int +xfs_scrub_rtsummary( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + if (sm->control || sm->flags) + return -EINVAL; + + /* XXX: implement this some day */ + return -ENOENT; +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -1696,6 +1772,8 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_bmap_data, NULL}, {xfs_scrub_bmap_attr, NULL}, {xfs_scrub_bmap_cow, NULL}, + {xfs_scrub_rtbitmap, xfs_sb_version_hasrealtime}, + {xfs_scrub_rtsummary, xfs_sb_version_hasrealtime}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:42:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 70BEC7F7C for ; Thu, 25 Aug 2016 18:42:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3534F8F8033 for ; Thu, 25 Aug 2016 16:42:16 -0700 (PDT) X-ASG-Debug-ID: 1472168533-0bf57b5314209620001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id x7KNt3pSQYNv82Ei (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:13 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNgBBu025145 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:11 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgBug029982 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:11 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNgAc9030969; Thu, 25 Aug 2016 23:42:11 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:42:10 -0700 Subject: [PATCH 18/25] xfs: scrub should cross-reference with the bnobt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 18/25] xfs: scrub should cross-reference with the bnobt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:09 -0700 Message-ID: <147216852921.3108.6982601521206127601.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168533 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12589 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're scrubbing various btrees, cross-reference the records with the bnobt to ensure that we don't also think the space is free. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 19 +++++ fs/xfs/libxfs/xfs_alloc.h | 3 + fs/xfs/xfs_scrub.c | 184 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 197 insertions(+), 9 deletions(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 37782a1..0de83f5 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2974,3 +2974,22 @@ xfs_alloc_query_range( return xfs_btree_query_range(cur, &low_brec, &high_brec, xfs_alloc_query_range_helper, &query); } + +/* Is there a record covering a given extent? */ +int +xfs_alloc_has_record( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool *exists) +{ + union xfs_btree_irec low; + union xfs_btree_irec high; + + memset(&low, 0, sizeof(low)); + low.a.ar_startblock = bno; + memset(&high, 0xFF, sizeof(high)); + high.a.ar_startblock = bno + len - 1; + + return xfs_btree_has_record(cur, &low, &high, exists); +} diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index c3ada6b..b740456 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -222,4 +222,7 @@ int xfs_alloc_query_range(struct xfs_btree_cur *cur, struct xfs_alloc_rec_incore *high_rec, xfs_alloc_query_range_fn fn, void *priv); +int xfs_alloc_has_record(struct xfs_btree_cur *cur, xfs_agblock_t bno, + xfs_extlen_t len, bool *exist); + #endif /* __XFS_ALLOC_H__ */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 22ba07d..612d3c3 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -515,6 +515,67 @@ xfs_scrub_should_terminate( } /* + * Make sure this btree block isn't in the free list and that there's + * an rmap record for it. + */ +STATIC int +xfs_scrub_btree_check_block_owner( + struct xfs_scrub_btree *bs, + xfs_fsblock_t fsb) +{ + xfs_agnumber_t agno; + xfs_agblock_t bno; + bool is_freesp; + struct xfs_buf *agf_bp = NULL; + struct xfs_btree_cur *bcur = NULL; + int error = 0; + int err2; + + agno = XFS_FSB_TO_AGNO(bs->cur->bc_mp, fsb); + bno = XFS_FSB_TO_AGBNO(bs->cur->bc_mp, fsb); + + if (bs->cur->bc_flags & XFS_BTREE_LONG_PTRS) { + err2 = xfs_alloc_read_agf(bs->cur->bc_mp, NULL, agno, + 0, &agf_bp); + if (err2) + return error; + bcur = xfs_allocbt_init_cursor(bs->cur->bc_mp, NULL, + agf_bp, agno, XFS_BTNUM_BNO); + } else { + bcur = bs->bno_cur; + } + + /* Check that this block isn't free. */ + err2 = xfs_alloc_has_record(bcur, bno, 1, &is_freesp); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); + + if (agf_bp) { + xfs_btree_del_cursor(bcur, XFS_BTREE_ERROR); + xfs_buf_relse(agf_bp); + } + + return error; +} + +/* Check the owner of a btree block. */ +STATIC int +xfs_scrub_btree_check_owner( + struct xfs_scrub_btree *bs, + struct xfs_buf *bp) +{ + struct xfs_btree_cur *cur = bs->cur; + xfs_fsblock_t fsbno; + + if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && bp == NULL) + return 0; + + fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, bp->b_bn); + + return xfs_scrub_btree_check_block_owner(bs, fsbno); +} + +/* * Visit all nodes and leaves of a btree. Check that all pointers and * records are in order, that the keys reflect the records, and use a callback * so that the caller can verify individual records. The callback is the same @@ -604,6 +665,9 @@ xfs_scrub_btree( error = xfs_btree_check_block(cur, block, level, bp); if (error) goto out; + error = xfs_scrub_btree_check_owner(bs, bp); + if (error) + goto out; cur->bc_ptrs[level] = 1; @@ -664,6 +728,10 @@ xfs_scrub_btree( if (error) goto out; + error = xfs_scrub_btree_check_owner(bs, bp); + if (error) + goto out; + cur->bc_ptrs[level] = 1; } @@ -716,9 +784,14 @@ xfs_scrub_sb( { struct xfs_mount *mp = ip->i_mount; struct xfs_buf *bp; + struct xfs_buf *agi_bp = NULL; + struct xfs_buf *agf_bp = NULL; + struct xfs_btree_cur *xcur = NULL; struct xfs_sb sb; xfs_agnumber_t agno; + bool is_freesp; int error; + int err2; if (sm->control >= mp->m_sb.sb_agcount || sm->flags) return -EINVAL; @@ -732,7 +805,7 @@ xfs_scrub_sb( return error; if (agno == 0) - goto out; + goto btree_xref; xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); @@ -776,6 +849,22 @@ xfs_scrub_sb( XFS_SCRUB_SB_FEAT(realtime); #undef XFS_SCRUB_SB_FEAT + if (error) + goto out; + +btree_xref: + error = xfs_scrub_get_ag_headers(mp, agno, &agi_bp, &agf_bp); + if (error) + goto out; + + /* Cross-reference with bnobt. */ + xcur = xfs_allocbt_init_cursor(mp, NULL, agf_bp, agno, XFS_BTNUM_BNO); + err2 = xfs_alloc_has_record(xcur, XFS_SB_BLOCK(mp), 1, &is_freesp); + if (!err2) + XFS_SCRUB_CHECK(mp, bp, "superblock", !is_freesp); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); out: xfs_buf_relse(bp); return error; @@ -791,12 +880,15 @@ xfs_scrub_agf( struct xfs_agf *agf; struct xfs_buf *agi_bp = NULL; struct xfs_buf *agf_bp = NULL; + struct xfs_btree_cur *xcur = NULL; xfs_agnumber_t agno; xfs_agblock_t agbno; xfs_agblock_t eoag; xfs_daddr_t daddr; xfs_daddr_t eofs; + bool is_freesp; int error; + int err2; if (sm->control >= mp->m_sb.sb_agcount || sm->flags) return -EINVAL; @@ -853,6 +945,13 @@ xfs_scrub_agf( XFS_SCRUB_CHECK(mp, agf_bp, "AGF", daddr < eofs); } + /* Cross-reference with the bnobt. */ + xcur = xfs_allocbt_init_cursor(mp, NULL, agf_bp, agno, XFS_BTNUM_BNO); + err2 = xfs_alloc_has_record(xcur, XFS_AGF_BLOCK(mp), 1, &is_freesp); + if (!err2) + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", !is_freesp); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); return error; } @@ -869,12 +968,15 @@ xfs_scrub_agfl( struct xfs_buf *agf_bp = NULL; struct xfs_buf *agfl_bp; __be32 *agfl_bno; + struct xfs_btree_cur *xcur = NULL; xfs_agnumber_t agno; xfs_agblock_t agbno; xfs_agblock_t eoag; xfs_daddr_t eofs; + bool is_freesp; int i; int error; + int err2; if (sm->control >= mp->m_sb.sb_agcount || sm->flags) return -EINVAL; @@ -893,6 +995,12 @@ xfs_scrub_agfl( eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); eoag = be32_to_cpu(agf->agf_length); + /* Cross-reference with the bnobt. */ + xcur = xfs_allocbt_init_cursor(mp, NULL, agf_bp, agno, XFS_BTNUM_BNO); + err2 = xfs_alloc_has_record(xcur, XFS_AGFL_BLOCK(mp), 1, &is_freesp); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !is_freesp); + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agfl_bp); for (i = be32_to_cpu(agf->agf_flfirst); i <= be32_to_cpu(agf->agf_fllast); @@ -904,8 +1012,14 @@ xfs_scrub_agfl( agbno < mp->m_sb.sb_agblocks); XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", agbno < eoag); + + /* Cross-reference with the bnobt. */ + err2 = xfs_alloc_has_record(xcur, agbno, 1, &is_freesp); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !is_freesp); } + xfs_btree_del_cursor(xcur, XFS_BTREE_ERROR); xfs_buf_relse(agfl_bp); err_no_agfl: xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); @@ -923,12 +1037,15 @@ xfs_scrub_agi( struct xfs_agf *agf; struct xfs_buf *agi_bp = NULL; struct xfs_buf *agf_bp = NULL; + struct xfs_btree_cur *xcur = NULL; xfs_agnumber_t agno; xfs_agblock_t agbno; xfs_agblock_t eoag; xfs_daddr_t daddr; xfs_daddr_t eofs; + bool is_freesp; int error; + int err2; if (sm->control >= mp->m_sb.sb_agcount || sm->flags) return -EINVAL; @@ -958,6 +1075,13 @@ xfs_scrub_agi( XFS_SCRUB_CHECK(mp, agi_bp, "AGI", daddr < eofs); } + /* Cross-reference with bnobt. */ + xcur = xfs_allocbt_init_cursor(mp, NULL, agf_bp, agno, XFS_BTNUM_BNO); + err2 = xfs_alloc_has_record(xcur, XFS_AGI_BLOCK(mp), 1, &is_freesp); + if (!err2) + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", !is_freesp); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); return error; } @@ -1056,9 +1180,11 @@ xfs_scrub_iallocbt_helper( xfs_agblock_t bno; xfs_agblock_t eoag; xfs_extlen_t len; + bool is_freesp; int holecount; int i; int error = 0; + int err2; uint64_t holes; xfs_inobt_btrec_to_irec(mp, rec, &irec); @@ -1082,7 +1208,14 @@ xfs_scrub_iallocbt_helper( mp->m_sb.sb_agblocks); XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= eoag); - return error; + + /* Cross-reference with the bnobt. */ + err2 = xfs_alloc_has_record(bs->bno_cur, bno, len, + &is_freesp); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); + + goto out; } /* Check each chunk of a sparse inode cluster. */ @@ -1109,12 +1242,19 @@ xfs_scrub_iallocbt_helper( mp->m_sb.sb_agblocks); XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= eoag); + + /* Cross-reference with the bnobt. */ + err2 = xfs_alloc_has_record(bs->bno_cur, bno, len, + &is_freesp); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); } XFS_BTREC_SCRUB_CHECK(bs, holecount <= XFS_INODES_PER_CHUNK); XFS_BTREC_SCRUB_CHECK(bs, holecount + irec.ir_count == XFS_INODES_PER_CHUNK); +out: return error; } @@ -1179,11 +1319,13 @@ xfs_scrub_rmapbt_helper( struct xfs_agf *agf; struct xfs_rmap_irec irec; xfs_agblock_t eoag; + bool is_freesp; bool non_inode; bool is_unwritten; bool is_bmbt; bool is_attr; - int error; + int error = 0; + int err2; error = xfs_rmap_btrec_to_irec(rec, &irec); if (error) @@ -1212,7 +1354,11 @@ xfs_scrub_rmapbt_helper( XFS_BTREC_SCRUB_CHECK(bs, !non_inode || !(is_bmbt || is_unwritten || is_attr)); - /* XXX: check with the owner */ + /* check there's no record in freesp btrees */ + err2 = xfs_alloc_has_record(bs->bno_cur, irec.rm_startblock, + irec.rm_blockcount, &is_freesp); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); return error; } @@ -1262,7 +1408,9 @@ xfs_scrub_refcountbt_helper( struct xfs_agf *agf; struct xfs_refcount_irec irec; xfs_agblock_t eoag; + bool is_freesp; int error = 0; + int err2; irec.rc_startblock = be32_to_cpu(rec->refc.rc_startblock); irec.rc_blockcount = be32_to_cpu(rec->refc.rc_blockcount); @@ -1280,6 +1428,12 @@ xfs_scrub_refcountbt_helper( irec.rc_blockcount <= eoag); XFS_BTREC_SCRUB_CHECK(bs, irec.rc_refcount >= 1); + /* Cross-reference with the bnobt. */ + err2 = xfs_alloc_has_record(bs->bno_cur, irec.rc_startblock, + irec.rc_blockcount, &is_freesp); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); + return error; } @@ -1412,10 +1566,12 @@ xfs_scrub_bmap_extent( struct xfs_buf *bp = NULL; struct xfs_buf *agi_bp = NULL; struct xfs_buf *agf_bp = NULL; + struct xfs_btree_cur *xcur = NULL; xfs_daddr_t daddr; xfs_daddr_t dlen; xfs_agnumber_t agno; xfs_fsblock_t bno; + bool is_freesp; int error = 0; int err2 = 0; @@ -1450,19 +1606,29 @@ xfs_scrub_bmap_extent( XFS_INO_SCRUB_CHECK(ip, bp, info->type, irec->br_state != XFS_EXT_UNWRITTEN || xfs_sb_version_hasextflgbit(&mp->m_sb)); + if (error) + goto out; /* Set ourselves up for cross-referencing later. */ if (!info->is_rt) { - err2 = xfs_scrub_get_ag_headers(mp, agno, &agi_bp, &agf_bp); - if (err2) + error = xfs_scrub_get_ag_headers(mp, agno, &agi_bp, &agf_bp); + if (error) goto out; + + /* Cross-reference with the bnobt. */ + xcur = xfs_allocbt_init_cursor(mp, NULL, agf_bp, agno, + XFS_BTNUM_BNO); + err2 = xfs_alloc_has_record(xcur, bno, + irec->br_blockcount, &is_freesp); + if (!err2) + XFS_BTREC_SCRUB_CHECK(&info->bs, !is_freesp); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); } -out: xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); +out: info->lastoff = irec->br_startoff + irec->br_blockcount; - if (!error && err2) - error = err2; return error; } From darrick.wong@oracle.com Thu Aug 25 18:42:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 760797F84 for ; Thu, 25 Aug 2016 18:42:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 486BD8F8035 for ; Thu, 25 Aug 2016 16:42:22 -0700 (PDT) X-ASG-Debug-ID: 1472168540-0bf57b5311209620001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id dRWpGSdwNqbGjoEr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNgII2018522 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:42:19 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNgIHQ026592 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:18 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgH7B031607; Thu, 25 Aug 2016 23:42:17 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:42:16 -0700 Subject: [PATCH 19/25] xfs: cross-reference bnobt records with cntbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 19/25] xfs: cross-reference bnobt records with cntbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:15 -0700 Message-ID: <147216853554.3108.6115648994956205089.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168540 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2832 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Scrub should make sure that each bnobt record has a corresponding cntbt record. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_alloc.c | 2 +- fs/xfs/libxfs/xfs_alloc.h | 7 +++++++ fs/xfs/xfs_scrub.c | 24 ++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 0de83f5..a65cd8d 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -170,7 +170,7 @@ xfs_alloc_lookup_ge( * Lookup the first record less than or equal to [bno, len] * in the btree given by cur. */ -static int /* error */ +int /* error */ xfs_alloc_lookup_le( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index b740456..2afc024 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -189,6 +189,13 @@ xfs_free_extent( enum xfs_ag_resv_type type); /* block reservation type */ int /* error */ +xfs_alloc_lookup_le( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t bno, /* starting block of extent */ + xfs_extlen_t len, /* length of extent */ + int *stat); /* success/failure */ + +int /* error */ xfs_alloc_lookup_ge( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 612d3c3..66365e2 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -1096,9 +1096,14 @@ xfs_scrub_allocbt_helper( { struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_agf *agf; + struct xfs_btree_cur *other_cur; + xfs_agblock_t fbno; xfs_agblock_t bno; + xfs_extlen_t flen; xfs_extlen_t len; + int has_otherrec; int error = 0; + int err2; bno = be32_to_cpu(rec->alloc.ar_startblock); len = be32_to_cpu(rec->alloc.ar_blockcount); @@ -1112,6 +1117,25 @@ xfs_scrub_allocbt_helper( XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= be32_to_cpu(agf->agf_length)); + /* + * Ensure there's a corresponding cntbt/bnobt record matching + * this bnobt/cntbt record, respectively. + */ + other_cur = (bs->cnt_cur ? bs->cnt_cur : bs->bno_cur); + err2 = xfs_alloc_lookup_le(other_cur, bno, len, &has_otherrec); + if (err2) + goto skip_freesp_xref; + XFS_BTREC_SCRUB_CHECK(bs, has_otherrec); + if (!has_otherrec) + goto skip_freesp_xref; + err2 = xfs_alloc_get_rec(other_cur, &fbno, &flen, &has_otherrec); + if (!err2) { + XFS_BTREC_SCRUB_CHECK(bs, has_otherrec); + XFS_BTREC_SCRUB_CHECK(bs, fbno == bno); + XFS_BTREC_SCRUB_CHECK(bs, flen == len); + } +skip_freesp_xref: + return error; } From darrick.wong@oracle.com Thu Aug 25 18:42:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DABFE7F07 for ; Thu, 25 Aug 2016 18:42:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F5B9304039 for ; Thu, 25 Aug 2016 16:42:32 -0700 (PDT) X-ASG-Debug-ID: 1472168550-0bf81509b01df730001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 1JpIekqy8XTTDRvV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNgT2K025236 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:29 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgSl3016527 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:29 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNgSMk031035; Thu, 25 Aug 2016 23:42:28 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:42:28 -0700 Subject: [PATCH 20/25] xfs: cross-reference extents with AG header From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 20/25] xfs: cross-reference extents with AG header To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:21 -0700 Message-ID: <147216854170.3108.4876331933510244657.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168550 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4139 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ensure that none of the AG btree records overlap the AG sb/agf/agfl/agi headers except for the XFS_RMAP_OWN_FS rmap. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_scrub.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 66365e2..63a7434 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -434,6 +434,30 @@ xfs_scrub_put_ag_headers( *agi_bpp = *agf_bpp = NULL; } +/* Does this AG extent cover the AG headers? */ +STATIC bool +xfs_scrub_extent_covers_ag_head( + struct xfs_mount *mp, + xfs_agblock_t agbno, + xfs_extlen_t len) +{ + xfs_agblock_t bno; + + bno = XFS_SB_BLOCK(mp); + if (bno >= agbno && bno < agbno + len) + return true; + bno = XFS_AGF_BLOCK(mp); + if (bno >= agbno && bno < agbno + len) + return true; + bno = XFS_AGFL_BLOCK(mp); + if (bno >= agbno && bno < agbno + len) + return true; + bno = XFS_AGI_BLOCK(mp); + if (bno >= agbno && bno < agbno + len) + return true; + return false; +} + /* * For scrub, grab the AGI and the AGF headers, in that order. * Locking order requires us to get the AGI before the AGF. @@ -1013,6 +1037,10 @@ xfs_scrub_agfl( XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", agbno < eoag); + /* Cross-reference with the AG headers. */ + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", + !xfs_scrub_extent_covers_ag_head(mp, agbno, 1)); + /* Cross-reference with the bnobt. */ err2 = xfs_alloc_has_record(xcur, agbno, 1, &is_freesp); if (!err2) @@ -1117,6 +1145,10 @@ xfs_scrub_allocbt_helper( XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= be32_to_cpu(agf->agf_length)); + /* Make sure we don't cover the AG headers. */ + XFS_BTREC_SCRUB_CHECK(bs, + !xfs_scrub_extent_covers_ag_head(mp, bno, len)); + /* * Ensure there's a corresponding cntbt/bnobt record matching * this bnobt/cntbt record, respectively. @@ -1233,6 +1265,10 @@ xfs_scrub_iallocbt_helper( XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= eoag); + /* Make sure we don't cover the AG headers. */ + XFS_BTREC_SCRUB_CHECK(bs, + !xfs_scrub_extent_covers_ag_head(mp, bno, len)); + /* Cross-reference with the bnobt. */ err2 = xfs_alloc_has_record(bs->bno_cur, bno, len, &is_freesp); @@ -1267,6 +1303,10 @@ xfs_scrub_iallocbt_helper( XFS_BTREC_SCRUB_CHECK(bs, (unsigned long long)bno + len <= eoag); + /* Make sure we don't cover the AG headers. */ + XFS_BTREC_SCRUB_CHECK(bs, + !xfs_scrub_extent_covers_ag_head(mp, bno, len)); + /* Cross-reference with the bnobt. */ err2 = xfs_alloc_has_record(bs->bno_cur, bno, len, &is_freesp); @@ -1378,6 +1418,11 @@ xfs_scrub_rmapbt_helper( XFS_BTREC_SCRUB_CHECK(bs, !non_inode || !(is_bmbt || is_unwritten || is_attr)); + /* Make sure only the AG header owner maps to the AG header. */ + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_owner == XFS_RMAP_OWN_FS || + !xfs_scrub_extent_covers_ag_head(mp, irec.rm_startblock, + irec.rm_blockcount)); + /* check there's no record in freesp btrees */ err2 = xfs_alloc_has_record(bs->bno_cur, irec.rm_startblock, irec.rm_blockcount, &is_freesp); @@ -1452,6 +1497,10 @@ xfs_scrub_refcountbt_helper( irec.rc_blockcount <= eoag); XFS_BTREC_SCRUB_CHECK(bs, irec.rc_refcount >= 1); + /* Make sure we don't cover the AG headers. */ + XFS_BTREC_SCRUB_CHECK(bs, !xfs_scrub_extent_covers_ag_head(mp, + irec.rc_startblock, irec.rc_blockcount)); + /* Cross-reference with the bnobt. */ err2 = xfs_alloc_has_record(bs->bno_cur, irec.rc_startblock, irec.rc_blockcount, &is_freesp); @@ -1639,6 +1688,11 @@ xfs_scrub_bmap_extent( if (error) goto out; + /* Make sure we don't cover the AG headers. */ + XFS_INO_SCRUB_CHECK(ip, bp, info->type, info->is_rt || + !xfs_scrub_extent_covers_ag_head(mp, bno, + irec->br_blockcount)); + /* Cross-reference with the bnobt. */ xcur = xfs_allocbt_init_cursor(mp, NULL, agf_bp, agno, XFS_BTNUM_BNO); From darrick.wong@oracle.com Thu Aug 25 18:42:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EFB8E7F93 for ; Thu, 25 Aug 2016 18:42:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73E46AC002 for ; Thu, 25 Aug 2016 16:42:40 -0700 (PDT) X-ASG-Debug-ID: 1472168557-0bf81509b01df770001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EsfjGDMEMZYUmPCf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:38 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNgaio018673 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:36 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgZYs016632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:35 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgY1S031711; Thu, 25 Aug 2016 23:42:35 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:42:34 -0700 Subject: [PATCH 21/25] xfs: cross-reference inode btrees during scrub From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 21/25] xfs: cross-reference inode btrees during scrub To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:33 -0700 Message-ID: <147216855295.3108.5148111072976994293.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168557 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13655 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Cross-reference the inode btrees with the other metadata when we scrub the filesystem. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_ialloc.c | 58 ++++++++++++ fs/xfs/libxfs/xfs_ialloc.h | 4 + fs/xfs/xfs_scrub.c | 205 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 267 insertions(+) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index ab05f63..d6521fd 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2665,3 +2665,61 @@ xfs_ialloc_pagi_init( xfs_trans_brelse(tp, bp); return 0; } + +/* Is there an inode record covering a given range of inode numbers? */ +int +xfs_ialloc_has_inode_record( + struct xfs_btree_cur *cur, + xfs_agino_t low, + xfs_agino_t high, + bool *exists) +{ + struct xfs_inobt_rec_incore irec; + xfs_agino_t agino; + __uint16_t holemask; + int has; + int i; + int error; + + *exists = false; + error = xfs_inobt_lookup(cur, low, XFS_LOOKUP_LE, &has); + while (error == 0 && has) { + error = xfs_inobt_get_rec(cur, &irec, &has); + if (error || irec.ir_startino > high) + break; + + agino = irec.ir_startino; + holemask = irec.ir_holemask; + for (i = 0; i < XFS_INOBT_HOLEMASK_BITS; holemask >>= 1, + i++, agino += XFS_INODES_PER_HOLEMASK_BIT) { + if (holemask & 1) + continue; + if (agino + XFS_INODES_PER_HOLEMASK_BIT > low && + agino <= high) { + *exists = true; + goto out; + } + } + + error = xfs_btree_increment(cur, 0, &has); + } +out: + return error; +} + +/* Is there an inode record covering a given extent? */ +int +xfs_ialloc_has_inodes_at_extent( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool *exists) +{ + xfs_agino_t low; + xfs_agino_t high; + + low = XFS_OFFBNO_TO_AGINO(cur->bc_mp, bno, 0); + high = XFS_OFFBNO_TO_AGINO(cur->bc_mp, bno + len, 0) - 1; + + return xfs_ialloc_has_inode_record(cur, low, high, exists); +} diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 8e5861d..f20d958 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -171,5 +171,9 @@ int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, union xfs_btree_rec; void xfs_inobt_btrec_to_irec(struct xfs_mount *mp, union xfs_btree_rec *rec, struct xfs_inobt_rec_incore *irec); +int xfs_ialloc_has_inodes_at_extent(struct xfs_btree_cur *cur, + xfs_agblock_t bno, xfs_extlen_t len, bool *exists); +int xfs_ialloc_has_inode_record(struct xfs_btree_cur *cur, xfs_agino_t low, + xfs_agino_t high, bool *exists); #endif /* __XFS_IALLOC_H__ */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 63a7434..cc85584 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -814,6 +814,7 @@ xfs_scrub_sb( struct xfs_sb sb; xfs_agnumber_t agno; bool is_freesp; + bool has_inodes; int error; int err2; @@ -888,6 +889,26 @@ btree_xref: XFS_SCRUB_CHECK(mp, bp, "superblock", !is_freesp); xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + /* Cross-reference with inobt. */ + xcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, XFS_BTNUM_INO); + err2 = xfs_ialloc_has_inodes_at_extent(xcur, XFS_SB_BLOCK(mp), 1, + &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, bp, "superblock", !has_inodes); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + + /* Cross-reference with finobt. */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + xcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, + XFS_BTNUM_FINO); + err2 = xfs_ialloc_has_inodes_at_extent(xcur, XFS_SB_BLOCK(mp), + 1, &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, bp, "superblock", !has_inodes); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); out: xfs_buf_relse(bp); @@ -911,6 +932,7 @@ xfs_scrub_agf( xfs_daddr_t daddr; xfs_daddr_t eofs; bool is_freesp; + bool has_inodes; int error; int err2; @@ -976,6 +998,26 @@ xfs_scrub_agf( XFS_SCRUB_CHECK(mp, agf_bp, "AGF", !is_freesp); xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + /* Cross-reference with inobt. */ + xcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, XFS_BTNUM_INO); + err2 = xfs_ialloc_has_inodes_at_extent(xcur, XFS_AGF_BLOCK(mp), 1, + &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", !has_inodes); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + + /* Cross-reference with finobt. */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + xcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, + XFS_BTNUM_FINO); + err2 = xfs_ialloc_has_inodes_at_extent(xcur, XFS_AGF_BLOCK(mp), + 1, &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", !has_inodes); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); return error; } @@ -993,11 +1035,14 @@ xfs_scrub_agfl( struct xfs_buf *agfl_bp; __be32 *agfl_bno; struct xfs_btree_cur *xcur = NULL; + struct xfs_btree_cur *icur = NULL; + struct xfs_btree_cur *fcur = NULL; xfs_agnumber_t agno; xfs_agblock_t agbno; xfs_agblock_t eoag; xfs_daddr_t eofs; bool is_freesp; + bool has_inodes; int i; int error; int err2; @@ -1025,6 +1070,23 @@ xfs_scrub_agfl( if (!err2) XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !is_freesp); + /* Cross-reference with inobt. */ + icur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, XFS_BTNUM_INO); + err2 = xfs_ialloc_has_inodes_at_extent(icur, XFS_AGFL_BLOCK(mp), 1, + &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !has_inodes); + + /* Cross-reference with finobt. */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + fcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, + XFS_BTNUM_FINO); + err2 = xfs_ialloc_has_inodes_at_extent(fcur, XFS_AGFL_BLOCK(mp), + 1, &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !has_inodes); + } + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agfl_bp); for (i = be32_to_cpu(agf->agf_flfirst); i <= be32_to_cpu(agf->agf_fllast); @@ -1045,8 +1107,26 @@ xfs_scrub_agfl( err2 = xfs_alloc_has_record(xcur, agbno, 1, &is_freesp); if (!err2) XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !is_freesp); + + /* Cross-reference with inobt. */ + err2 = xfs_ialloc_has_inodes_at_extent(icur, agbno, 1, + &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !has_inodes); + + /* Cross-reference with finobt. */ + if (fcur) { + err2 = xfs_ialloc_has_inodes_at_extent(fcur, agbno, 1, + &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", + !has_inodes); + } } + if (fcur) + xfs_btree_del_cursor(fcur, XFS_BTREE_ERROR); + xfs_btree_del_cursor(icur, XFS_BTREE_ERROR); xfs_btree_del_cursor(xcur, XFS_BTREE_ERROR); xfs_buf_relse(agfl_bp); err_no_agfl: @@ -1072,6 +1152,7 @@ xfs_scrub_agi( xfs_daddr_t daddr; xfs_daddr_t eofs; bool is_freesp; + bool has_inodes; int error; int err2; @@ -1110,6 +1191,26 @@ xfs_scrub_agi( XFS_SCRUB_CHECK(mp, agi_bp, "AGI", !is_freesp); xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + /* Cross-reference with inobt. */ + xcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, XFS_BTNUM_INO); + err2 = xfs_ialloc_has_inodes_at_extent(xcur, XFS_AGI_BLOCK(mp), 1, + &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", !has_inodes); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + + /* Cross-reference with finobt. */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + xcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, + XFS_BTNUM_FINO); + err2 = xfs_ialloc_has_inodes_at_extent(xcur, XFS_AGI_BLOCK(mp), + 1, &has_inodes); + if (!err2) + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", !has_inodes); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); return error; } @@ -1129,6 +1230,7 @@ xfs_scrub_allocbt_helper( xfs_agblock_t bno; xfs_extlen_t flen; xfs_extlen_t len; + bool has_inodes; int has_otherrec; int error = 0; int err2; @@ -1168,6 +1270,20 @@ xfs_scrub_allocbt_helper( } skip_freesp_xref: + /* Cross-reference with inobt. */ + err2 = xfs_ialloc_has_inodes_at_extent(bs->ino_cur, bno, len, + &has_inodes); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !has_inodes); + + /* Cross-reference with finobt. */ + if (bs->fino_cur) { + err2 = xfs_ialloc_has_inodes_at_extent(bs->fino_cur, bno, len, + &has_inodes); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !has_inodes); + } + return error; } @@ -1230,6 +1346,7 @@ xfs_scrub_iallocbt_helper( { struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_agf *agf; + struct xfs_btree_cur *other_cur; struct xfs_inobt_rec_incore irec; __uint16_t holemask; xfs_agino_t agino; @@ -1237,6 +1354,7 @@ xfs_scrub_iallocbt_helper( xfs_agblock_t eoag; xfs_extlen_t len; bool is_freesp; + bool has_inodes; int holecount; int i; int error = 0; @@ -1275,6 +1393,18 @@ xfs_scrub_iallocbt_helper( if (!err2) XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); + /* If we have a finobt, cross-reference with it. */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + other_cur = bs->fino_cur ? bs->fino_cur : bs->ino_cur; + if (bs->cur->bc_btnum == XFS_BTNUM_FINO || + irec.ir_freecount) { + err2 = xfs_ialloc_has_inode_record(other_cur, + agino, agino, &has_inodes); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, has_inodes); + } + } + goto out; } @@ -1312,6 +1442,18 @@ xfs_scrub_iallocbt_helper( &is_freesp); if (!err2) XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); + + /* If we have a finobt, cross-reference with it. */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + other_cur = bs->fino_cur ? bs->fino_cur : bs->ino_cur; + if (bs->cur->bc_btnum == XFS_BTNUM_FINO || + irec.ir_freecount) { + err2 = xfs_ialloc_has_inode_record(other_cur, + agino, agino, &has_inodes); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, has_inodes); + } + } } XFS_BTREC_SCRUB_CHECK(bs, holecount <= XFS_INODES_PER_CHUNK); @@ -1388,6 +1530,7 @@ xfs_scrub_rmapbt_helper( bool is_unwritten; bool is_bmbt; bool is_attr; + bool has_inodes; int error = 0; int err2; @@ -1429,6 +1572,25 @@ xfs_scrub_rmapbt_helper( if (!err2) XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); + /* Cross-reference with inobt. */ + err2 = xfs_ialloc_has_inodes_at_extent(bs->ino_cur, irec.rm_startblock, + irec.rm_blockcount, &has_inodes); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, + irec.rm_owner == XFS_RMAP_OWN_INODES || + !has_inodes); + + /* Cross-reference with finobt. */ + if (bs->fino_cur) { + err2 = xfs_ialloc_has_inodes_at_extent(bs->fino_cur, + irec.rm_startblock, irec.rm_blockcount, + &has_inodes); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, + irec.rm_owner == XFS_RMAP_OWN_INODES || + !has_inodes); + } + return error; } @@ -1478,6 +1640,7 @@ xfs_scrub_refcountbt_helper( struct xfs_refcount_irec irec; xfs_agblock_t eoag; bool is_freesp; + bool has_inodes; int error = 0; int err2; @@ -1507,6 +1670,21 @@ xfs_scrub_refcountbt_helper( if (!err2) XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); + /* Cross-reference with inobt. */ + err2 = xfs_ialloc_has_inodes_at_extent(bs->ino_cur, irec.rc_startblock, + irec.rc_blockcount, &has_inodes); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !has_inodes); + + /* Cross-reference with finobt. */ + if (bs->fino_cur) { + err2 = xfs_ialloc_has_inodes_at_extent(bs->fino_cur, + irec.rc_startblock, irec.rc_blockcount, + &has_inodes); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !has_inodes); + } + return error; } @@ -1645,6 +1823,7 @@ xfs_scrub_bmap_extent( xfs_agnumber_t agno; xfs_fsblock_t bno; bool is_freesp; + bool has_inodes; int error = 0; int err2 = 0; @@ -1702,6 +1881,32 @@ xfs_scrub_bmap_extent( XFS_BTREC_SCRUB_CHECK(&info->bs, !is_freesp); xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + + /* Cross-reference with inobt. */ + xcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, + XFS_BTNUM_INO); + err2 = xfs_ialloc_has_inodes_at_extent(xcur, + irec->br_startblock, irec->br_blockcount, + &has_inodes); + if (!err2) + XFS_INO_SCRUB_CHECK(ip, bp, info->type, !has_inodes); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + + /* Cross-reference with finobt. */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + xcur = xfs_inobt_init_cursor(mp, NULL, agi_bp, agno, + XFS_BTNUM_FINO); + err2 = xfs_ialloc_has_inodes_at_extent(xcur, + irec->br_startblock, + irec->br_blockcount, + &has_inodes); + if (!err2) + XFS_INO_SCRUB_CHECK(ip, bp, info->type, + !has_inodes); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } } xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); From darrick.wong@oracle.com Thu Aug 25 18:42:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D7D4B7F9C for ; Thu, 25 Aug 2016 18:42:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9C9E58F8033 for ; Thu, 25 Aug 2016 16:42:47 -0700 (PDT) X-ASG-Debug-ID: 1472168563-0bf57c55b41c7b80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 9xsNJtXuaKvWbInp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNggoF018740 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:42 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgfxV030762 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:42 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNgf2K019770; Thu, 25 Aug 2016 23:42:41 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:42:40 -0700 Subject: [PATCH 22/25] xfs: cross-reference reverse-mapping btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 22/25] xfs: cross-reference reverse-mapping btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:39 -0700 Message-ID: <147216855926.3108.17144534581470868653.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168563 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 22129 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When scrubbing various btrees, we should cross-reference the records with the reverse mapping btree. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rmap.c | 58 ++++++ fs/xfs/libxfs/xfs_rmap.h | 5 + fs/xfs/xfs_scrub.c | 441 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 503 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index b0308fc..b22f93d 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -2292,3 +2292,61 @@ xfs_rmap_free_extent( return __xfs_rmap_add(mp, dfops, XFS_RMAP_FREE, owner, XFS_DATA_FORK, &bmap); } + +/* Is there a record covering a given extent? */ +int +xfs_rmap_has_record( + struct xfs_btree_cur *cur, + xfs_fsblock_t bno, + xfs_filblks_t len, + bool *exists) +{ + union xfs_btree_irec low; + union xfs_btree_irec high; + + memset(&low, 0, sizeof(low)); + low.r.rm_startblock = bno; + memset(&high, 0xFF, sizeof(high)); + high.r.rm_startblock = bno + len - 1; + + return xfs_btree_has_record(cur, &low, &high, exists); +} + +/* Is there a record covering a given extent? */ +int +xfs_rmap_record_exists( + struct xfs_btree_cur *cur, + xfs_fsblock_t bno, + xfs_filblks_t len, + struct xfs_owner_info *oinfo, + bool *has_rmap) +{ + uint64_t owner; + uint64_t offset; + unsigned int flags; + int stat; + struct xfs_rmap_irec irec; + int error; + + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); + + error = xfs_rmap_lookup_le(cur, bno, len, owner, offset, flags, &stat); + if (error) + return error; + if (!stat) { + *has_rmap = false; + return 0; + } + + error = xfs_rmap_get_rec(cur, &irec, &stat); + if (error) + return error; + if (!stat) { + *has_rmap = false; + return 0; + } + + *has_rmap = (irec.rm_startblock <= bno && + irec.rm_startblock + irec.rm_blockcount >= bno + len); + return 0; +} diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h index 188db38..c5c5817 100644 --- a/fs/xfs/libxfs/xfs_rmap.h +++ b/fs/xfs/libxfs/xfs_rmap.h @@ -215,5 +215,10 @@ int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno, union xfs_btree_rec; int xfs_rmap_btrec_to_irec(union xfs_btree_rec *rec, struct xfs_rmap_irec *irec); +int xfs_rmap_has_record(struct xfs_btree_cur *cur, xfs_fsblock_t bno, + xfs_filblks_t len, bool *exists); +int xfs_rmap_record_exists(struct xfs_btree_cur *cur, xfs_fsblock_t bno, + xfs_filblks_t len, struct xfs_owner_info *oinfo, + bool *has_rmap); #endif /* __XFS_RMAP_H__ */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index cc85584..34c23f7 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -393,6 +393,11 @@ xfs_scrub_btree_key( return 0; } +struct check_owner { + struct list_head list; + xfs_fsblock_t bno; +}; + /* * For scrub, grab the AGI and the AGF headers, in that order. * Locking order requires us to get the AGI before the AGF. @@ -550,8 +555,10 @@ xfs_scrub_btree_check_block_owner( xfs_agnumber_t agno; xfs_agblock_t bno; bool is_freesp; + bool has_rmap; struct xfs_buf *agf_bp = NULL; struct xfs_btree_cur *bcur = NULL; + struct xfs_btree_cur *rcur = NULL; int error = 0; int err2; @@ -565,8 +572,12 @@ xfs_scrub_btree_check_block_owner( return error; bcur = xfs_allocbt_init_cursor(bs->cur->bc_mp, NULL, agf_bp, agno, XFS_BTNUM_BNO); + if (xfs_sb_version_hasrmapbt(&bs->cur->bc_mp->m_sb)) + rcur = xfs_rmapbt_init_cursor(bs->cur->bc_mp, NULL, + agf_bp, agno); } else { bcur = bs->bno_cur; + rcur = bs->rmap_cur; } /* Check that this block isn't free. */ @@ -574,7 +585,17 @@ xfs_scrub_btree_check_block_owner( if (!err2) XFS_BTREC_SCRUB_CHECK(bs, !is_freesp); + /* Check that this block is in the rmap. */ + if (rcur) { + err2 = xfs_rmap_record_exists(rcur, bno, 1, &bs->oinfo, + &has_rmap); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, has_rmap); + } + if (agf_bp) { + if (rcur) + xfs_btree_del_cursor(rcur, XFS_BTREE_ERROR); xfs_btree_del_cursor(bcur, XFS_BTREE_ERROR); xfs_buf_relse(agf_bp); } @@ -589,6 +610,7 @@ xfs_scrub_btree_check_owner( struct xfs_buf *bp) { struct xfs_btree_cur *cur = bs->cur; + struct check_owner *co; xfs_fsblock_t fsbno; if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && bp == NULL) @@ -596,6 +618,15 @@ xfs_scrub_btree_check_owner( fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, bp->b_bn); + /* Do we need to defer this one? */ + if ((!bs->rmap_cur && xfs_sb_version_hasrmapbt(&cur->bc_mp->m_sb)) || + !bs->bno_cur) { + co = kmem_alloc(sizeof(struct check_owner), KM_SLEEP | KM_NOFS); + co->bno = fsbno; + list_add_tail(&co->list, &bs->to_check); + return 0; + } + return xfs_scrub_btree_check_block_owner(bs, fsbno); } @@ -617,6 +648,8 @@ xfs_scrub_btree( struct xfs_btree_block *block; int level; struct xfs_buf *bp; + struct check_owner *co; + struct check_owner *n; int i; int error = 0; @@ -778,6 +811,23 @@ out: } } + /* Process deferred rmap owner checks on btree blocks. */ + if (!error) { + if (bs->cur->bc_btnum == XFS_BTNUM_BNO) + bs->bno_cur = bs->cur; + else if (bs->cur->bc_btnum == XFS_BTNUM_RMAP) + bs->rmap_cur = bs->cur; + list_for_each_entry(co, &bs->to_check, list) { + error = xfs_scrub_btree_check_block_owner(bs, co->bno); + if (error) + break; + } + } + list_for_each_entry_safe(co, n, &bs->to_check, list) { + list_del(&co->list); + kmem_free(co); + } + if (bs->refc_cur) xfs_btree_del_cursor(bs->refc_cur, XFS_BTREE_ERROR); if (bs->rmap_cur && bs->rmap_cur != bs->cur) @@ -812,9 +862,11 @@ xfs_scrub_sb( struct xfs_buf *agf_bp = NULL; struct xfs_btree_cur *xcur = NULL; struct xfs_sb sb; + struct xfs_owner_info oinfo; xfs_agnumber_t agno; bool is_freesp; bool has_inodes; + bool has_rmap; int error; int err2; @@ -909,6 +961,18 @@ btree_xref: XFS_BTREE_NOERROR); } + /* Cross-reference with the rmapbt. */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_FS); + xcur = xfs_rmapbt_init_cursor(mp, NULL, agf_bp, agno); + err2 = xfs_rmap_record_exists(xcur, XFS_SB_BLOCK(mp), 1, + &oinfo, &has_rmap); + if (!err2) + XFS_SCRUB_CHECK(mp, bp, "superblock", has_rmap); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); out: xfs_buf_relse(bp); @@ -926,13 +990,16 @@ xfs_scrub_agf( struct xfs_buf *agi_bp = NULL; struct xfs_buf *agf_bp = NULL; struct xfs_btree_cur *xcur = NULL; + struct xfs_owner_info oinfo; xfs_agnumber_t agno; xfs_agblock_t agbno; xfs_agblock_t eoag; xfs_daddr_t daddr; xfs_daddr_t eofs; + xfs_extlen_t blocks; bool is_freesp; bool has_inodes; + bool has_rmap; int error; int err2; @@ -1018,6 +1085,24 @@ xfs_scrub_agf( XFS_BTREE_NOERROR); } + /* Cross-reference with the rmapbt. */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_FS); + xcur = xfs_rmapbt_init_cursor(mp, NULL, agf_bp, agno); + err2 = xfs_rmap_record_exists(xcur, XFS_AGF_BLOCK(mp), 1, + &oinfo, &has_rmap); + if (err2) + goto skip_rmap_xref; + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", has_rmap); + err2 = xfs_btree_count_blocks(xcur, &blocks); + if (!err2) + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", blocks == + be32_to_cpu(agf->agf_rmap_blocks)); +skip_rmap_xref: + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); return error; } @@ -1037,12 +1122,15 @@ xfs_scrub_agfl( struct xfs_btree_cur *xcur = NULL; struct xfs_btree_cur *icur = NULL; struct xfs_btree_cur *fcur = NULL; + struct xfs_btree_cur *rcur = NULL; + struct xfs_owner_info oinfo; xfs_agnumber_t agno; xfs_agblock_t agbno; xfs_agblock_t eoag; xfs_daddr_t eofs; bool is_freesp; bool has_inodes; + bool has_rmap; int i; int error; int err2; @@ -1087,6 +1175,17 @@ xfs_scrub_agfl( XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !has_inodes); } + /* Set up cross-reference with rmapbt. */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + rcur = xfs_rmapbt_init_cursor(mp, NULL, agf_bp, agno); + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_FS); + err2 = xfs_rmap_record_exists(rcur, XFS_AGFL_BLOCK(mp), 1, + &oinfo, &has_rmap); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", has_rmap); + } + + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG); agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agfl_bp); for (i = be32_to_cpu(agf->agf_flfirst); i <= be32_to_cpu(agf->agf_fllast); @@ -1122,8 +1221,18 @@ xfs_scrub_agfl( XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !has_inodes); } + + /* Cross-reference with the rmapbt. */ + if (rcur) { + err2 = xfs_rmap_record_exists(rcur, agbno, 1, &oinfo, + &has_rmap); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", has_rmap); + } } + if (rcur) + xfs_btree_del_cursor(rcur, XFS_BTREE_ERROR); if (fcur) xfs_btree_del_cursor(fcur, XFS_BTREE_ERROR); xfs_btree_del_cursor(icur, XFS_BTREE_ERROR); @@ -1146,6 +1255,7 @@ xfs_scrub_agi( struct xfs_buf *agi_bp = NULL; struct xfs_buf *agf_bp = NULL; struct xfs_btree_cur *xcur = NULL; + struct xfs_owner_info oinfo; xfs_agnumber_t agno; xfs_agblock_t agbno; xfs_agblock_t eoag; @@ -1153,6 +1263,7 @@ xfs_scrub_agi( xfs_daddr_t eofs; bool is_freesp; bool has_inodes; + bool has_rmap; int error; int err2; @@ -1211,6 +1322,18 @@ xfs_scrub_agi( XFS_BTREE_NOERROR); } + /* Cross-reference with the rmapbt. */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_FS); + xcur = xfs_rmapbt_init_cursor(mp, NULL, agf_bp, agno); + err2 = xfs_rmap_record_exists(xcur, XFS_AGI_BLOCK(mp), 1, + &oinfo, &has_rmap); + if (!err2) + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", has_rmap); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); return error; } @@ -1230,6 +1353,7 @@ xfs_scrub_allocbt_helper( xfs_agblock_t bno; xfs_extlen_t flen; xfs_extlen_t len; + bool has_rmap; bool has_inodes; int has_otherrec; int error = 0; @@ -1284,6 +1408,13 @@ skip_freesp_xref: XFS_BTREC_SCRUB_CHECK(bs, !has_inodes); } + /* Cross-reference with the rmapbt. */ + if (bs->rmap_cur) { + err2 = xfs_rmap_has_record(bs->rmap_cur, bno, len, &has_rmap); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !has_rmap); + } + return error; } @@ -1348,6 +1479,7 @@ xfs_scrub_iallocbt_helper( struct xfs_agf *agf; struct xfs_btree_cur *other_cur; struct xfs_inobt_rec_incore irec; + struct xfs_owner_info oinfo; __uint16_t holemask; xfs_agino_t agino; xfs_agblock_t bno; @@ -1355,10 +1487,11 @@ xfs_scrub_iallocbt_helper( xfs_extlen_t len; bool is_freesp; bool has_inodes; + bool has_rmap; int holecount; int i; int error = 0; - int err2; + int err2 = 0; uint64_t holes; xfs_inobt_btrec_to_irec(mp, rec, &irec); @@ -1368,6 +1501,7 @@ xfs_scrub_iallocbt_helper( agino = irec.ir_startino; agf = XFS_BUF_TO_AGF(bs->agf_bp); eoag = be32_to_cpu(agf->agf_length); + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INODES); /* Handle non-sparse inodes */ if (!xfs_inobt_issparse(irec.ir_holemask)) { @@ -1405,6 +1539,14 @@ xfs_scrub_iallocbt_helper( } } + /* Cross-reference with rmapbt. */ + if (bs->rmap_cur) { + err2 = xfs_rmap_record_exists(bs->rmap_cur, bno, len, + &oinfo, &has_rmap); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, has_rmap); + } + goto out; } @@ -1454,6 +1596,14 @@ xfs_scrub_iallocbt_helper( XFS_BTREC_SCRUB_CHECK(bs, has_inodes); } } + + /* Cross-reference with the rmapbt. */ + if (bs->rmap_cur) { + err2 = xfs_rmap_record_exists(bs->rmap_cur, bno, len, + &oinfo, &has_rmap); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, has_rmap); + } } XFS_BTREC_SCRUB_CHECK(bs, holecount <= XFS_INODES_PER_CHUNK); @@ -1629,6 +1779,165 @@ xfs_scrub_rmapbt( /* Reference count btree scrubber. */ +struct xfs_refcountbt_scrub_fragment { + struct xfs_rmap_irec rm; + struct list_head list; +}; + +struct xfs_refcountbt_scrub_rmap_check_info { + struct xfs_scrub_btree *bs; + xfs_nlink_t nr; + struct xfs_refcount_irec rc; + struct list_head fragments; +}; + +/* + * Decide if the given rmap is large enough that we can redeem it + * towards refcount verification now, or if it's a fragment, in + * which case we'll hang onto it in the hopes that we'll later + * discover that we've collected exactly the correct number of + * fragments as the refcountbt says we should have. + */ +STATIC int +xfs_refcountbt_scrub_rmap_check( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *rec, + void *priv) +{ + struct xfs_refcountbt_scrub_rmap_check_info *rsrci = priv; + struct xfs_refcountbt_scrub_fragment *frag; + xfs_agblock_t rm_last; + xfs_agblock_t rc_last; + + rm_last = rec->rm_startblock + rec->rm_blockcount; + rc_last = rsrci->rc.rc_startblock + rsrci->rc.rc_blockcount; + XFS_BTREC_SCRUB_CHECK(rsrci->bs, rsrci->rc.rc_refcount != 1 || + rec->rm_owner == XFS_RMAP_OWN_COW); + if (rec->rm_startblock <= rsrci->rc.rc_startblock && rm_last >= rc_last) + rsrci->nr++; + else { + frag = kmem_zalloc(sizeof(struct xfs_refcountbt_scrub_fragment), + KM_SLEEP); + frag->rm = *rec; + list_add_tail(&frag->list, &rsrci->fragments); + } + + return 0; +} + +/* + * Given a bunch of rmap fragments, iterate through them, keeping + * a running tally of the refcount. If this ever deviates from + * what we expect (which is the refcountbt's refcount minus the + * number of extents that totally covered the refcountbt extent), + * we have a refcountbt error. + */ +STATIC void +xfs_refcountbt_process_rmap_fragments( + struct xfs_mount *mp, + struct xfs_refcountbt_scrub_rmap_check_info *rsrci) +{ + struct list_head worklist; + struct xfs_refcountbt_scrub_fragment *cur; + struct xfs_refcountbt_scrub_fragment *n; + xfs_agblock_t bno; + xfs_agblock_t rbno; + xfs_agblock_t next_rbno; + xfs_nlink_t nr; + xfs_nlink_t target_nr; + + target_nr = rsrci->rc.rc_refcount - rsrci->nr; + if (target_nr == 0) + return; + + /* + * There are (rsrci->rc.rc_refcount - rsrci->nr refcount) + * references we haven't found yet. Pull that many off the + * fragment list and figure out where the smallest rmap ends + * (and therefore the next rmap should start). All the rmaps + * we pull off should start at or before the beginning of the + * refcount record's range. + */ + INIT_LIST_HEAD(&worklist); + rbno = NULLAGBLOCK; + nr = 1; + list_for_each_entry_safe(cur, n, &rsrci->fragments, list) { + if (cur->rm.rm_startblock > rsrci->rc.rc_startblock) + goto fail; + bno = cur->rm.rm_startblock + cur->rm.rm_blockcount; + if (rbno > bno) + rbno = bno; + list_del(&cur->list); + list_add_tail(&cur->list, &worklist); + if (nr == target_nr) + break; + nr++; + } + + if (nr != target_nr) + goto fail; + + while (!list_empty(&rsrci->fragments)) { + /* Discard any fragments ending at rbno. */ + nr = 0; + next_rbno = NULLAGBLOCK; + list_for_each_entry_safe(cur, n, &worklist, list) { + bno = cur->rm.rm_startblock + cur->rm.rm_blockcount; + if (bno != rbno) { + if (next_rbno > bno) + next_rbno = bno; + continue; + } + list_del(&cur->list); + kmem_free(cur); + nr++; + } + + /* Empty list? We're done. */ + if (list_empty(&rsrci->fragments)) + break; + + /* Try to add nr rmaps starting at rbno to the worklist. */ + list_for_each_entry_safe(cur, n, &rsrci->fragments, list) { + bno = cur->rm.rm_startblock + cur->rm.rm_blockcount; + if (cur->rm.rm_startblock != rbno) + goto fail; + list_del(&cur->list); + list_add_tail(&cur->list, &worklist); + if (next_rbno > bno) + next_rbno = bno; + nr--; + if (nr == 0) + break; + } + + rbno = next_rbno; + } + + /* + * Make sure the last extent we processed ends at or beyond + * the end of the refcount extent. + */ + if (rbno < rsrci->rc.rc_startblock + rsrci->rc.rc_blockcount) + goto fail; + + rsrci->nr = rsrci->rc.rc_refcount; +fail: + /* Delete fragments and work list. */ + while (!list_empty(&worklist)) { + cur = list_first_entry(&worklist, + struct xfs_refcountbt_scrub_fragment, list); + list_del(&cur->list); + kmem_free(cur); + } + while (!list_empty(&rsrci->fragments)) { + cur = list_first_entry(&rsrci->fragments, + struct xfs_refcountbt_scrub_fragment, list); + list_del(&cur->list); + kmem_free(cur); + } +} + /* Scrub a refcountbt record. */ STATIC int xfs_scrub_refcountbt_helper( @@ -1638,6 +1947,10 @@ xfs_scrub_refcountbt_helper( struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_agf *agf; struct xfs_refcount_irec irec; + struct xfs_rmap_irec low; + struct xfs_rmap_irec high; + struct xfs_refcountbt_scrub_rmap_check_info rsrci; + struct xfs_refcountbt_scrub_fragment *cur; xfs_agblock_t eoag; bool is_freesp; bool has_inodes; @@ -1685,6 +1998,34 @@ xfs_scrub_refcountbt_helper( XFS_BTREC_SCRUB_CHECK(bs, !has_inodes); } + /* Cross-reference with the rmapbt to confirm the refcount. */ + if (bs->rmap_cur) { + memset(&low, 0, sizeof(low)); + low.rm_startblock = irec.rc_startblock; + memset(&high, 0xFF, sizeof(high)); + high.rm_startblock = irec.rc_startblock + + irec.rc_blockcount - 1; + + rsrci.bs = bs; + rsrci.nr = 0; + rsrci.rc = irec; + INIT_LIST_HEAD(&rsrci.fragments); + err2 = xfs_rmap_query_range(bs->rmap_cur, &low, &high, + &xfs_refcountbt_scrub_rmap_check, &rsrci); + if (err2 == 0) { + xfs_refcountbt_process_rmap_fragments(mp, &rsrci); + XFS_BTREC_SCRUB_CHECK(bs, irec.rc_refcount == rsrci.nr); + } + + while (!list_empty(&rsrci.fragments)) { + cur = list_first_entry(&rsrci.fragments, + struct xfs_refcountbt_scrub_fragment, + list); + list_del(&cur->list); + kmem_free(cur); + } + } + return error; } @@ -1822,8 +2163,13 @@ xfs_scrub_bmap_extent( xfs_daddr_t dlen; xfs_agnumber_t agno; xfs_fsblock_t bno; + struct xfs_rmap_irec rmap; + uint64_t owner; + xfs_fileoff_t offset; bool is_freesp; bool has_inodes; + unsigned int rflags; + int has_rmap; int error = 0; int err2 = 0; @@ -1909,6 +2255,99 @@ xfs_scrub_bmap_extent( } } + /* Cross-reference with rmapbt. */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && !info->is_rt) { + xcur = xfs_rmapbt_init_cursor(mp, NULL, agf_bp, agno); + + if (info->whichfork == XFS_COW_FORK) { + owner = XFS_RMAP_OWN_COW; + offset = 0; + } else { + owner = ip->i_ino; + offset = irec->br_startoff; + } + + /* Look for a corresponding rmap. */ + rflags = 0; + if (info->whichfork == XFS_ATTR_FORK) + rflags |= XFS_RMAP_ATTR_FORK; + + if (info->is_shared) { + err2 = xfs_rmap_lookup_le_range(xcur, bno, owner, + offset, rflags, &rmap, + &has_rmap); + if (err2) + goto skip_rmap_xref; + XFS_INO_SCRUB_GOTO(ip, NULL, info->type, has_rmap, + skip_rmap_xref); + } else { + err2 = xfs_rmap_lookup_le(xcur, bno, 0, owner, + offset, rflags, &has_rmap); + if (err2) + goto skip_rmap_xref; + XFS_INO_SCRUB_GOTO(ip, NULL, info->type, has_rmap, + skip_rmap_xref); + + err2 = xfs_rmap_get_rec(xcur, &rmap, &has_rmap); + if (err2) + goto skip_rmap_xref; + XFS_INO_SCRUB_GOTO(ip, NULL, info->type, has_rmap, + skip_rmap_xref); + } + + /* Check the rmap. */ + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_startblock <= bno); + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_startblock + rmap.rm_blockcount > + rmap.rm_startblock); + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_startblock + rmap.rm_blockcount >= + bno + irec->br_blockcount); + if (owner != XFS_RMAP_OWN_COW) { + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_offset <= offset); + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_offset + rmap.rm_blockcount > + rmap.rm_offset); + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_offset + rmap.rm_blockcount >= + offset + irec->br_blockcount); + } + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_owner == owner); + switch (irec->br_state) { + case XFS_EXT_UNWRITTEN: + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_flags & XFS_RMAP_UNWRITTEN); + break; + case XFS_EXT_NORM: + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + !(rmap.rm_flags & XFS_RMAP_UNWRITTEN)); + break; + default: + break; + } + switch (info->whichfork) { + case XFS_ATTR_FORK: + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + rmap.rm_flags & XFS_RMAP_ATTR_FORK); + break; + case XFS_DATA_FORK: + case XFS_COW_FORK: + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + !(rmap.rm_flags & XFS_RMAP_ATTR_FORK)); + break; + } + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + !(rmap.rm_flags & XFS_RMAP_BMBT_BLOCK)); + +skip_rmap_xref: + /* Free cursor. */ + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); out: info->lastoff = irec->br_startoff + irec->br_blockcount; From darrick.wong@oracle.com Thu Aug 25 18:42:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4B6DA7FA9 for ; Thu, 25 Aug 2016 18:42:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1F72A304039 for ; Thu, 25 Aug 2016 16:42:52 -0700 (PDT) X-ASG-Debug-ID: 1472168569-0bf57c55b21c7b80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id U3Rk6VFrg7nbn3Sl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNgmoC025391 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:48 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgmmJ016855 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:48 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNglZm019780; Thu, 25 Aug 2016 23:42:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:42:47 -0700 Subject: [PATCH 23/25] xfs: cross-reference refcount btree during scrub From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 23/25] xfs: cross-reference refcount btree during scrub To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:45 -0700 Message-ID: <147216856568.3108.7611118372039280000.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168569 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11146 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines During metadata btree scrub, we should cross-reference with the reference counts. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_refcount.c | 19 ++++ fs/xfs/libxfs/xfs_refcount.h | 3 + fs/xfs/xfs_scrub.c | 184 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 206 insertions(+) diff --git a/fs/xfs/libxfs/xfs_refcount.c b/fs/xfs/libxfs/xfs_refcount.c index 9136745..af82ea3 100644 --- a/fs/xfs/libxfs/xfs_refcount.c +++ b/fs/xfs/libxfs/xfs_refcount.c @@ -1535,3 +1535,22 @@ xfs_refcount_free_cow_extent( return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_FREE_COW, fsb, len); } + +/* Is there a record covering a given extent? */ +int +xfs_refcount_has_record( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool *exists) +{ + union xfs_btree_irec low; + union xfs_btree_irec high; + + memset(&low, 0, sizeof(low)); + low.rc.rc_startblock = bno; + memset(&high, 0xFF, sizeof(high)); + high.rc.rc_startblock = bno + len - 1; + + return xfs_btree_has_record(cur, &low, &high, exists); +} diff --git a/fs/xfs/libxfs/xfs_refcount.h b/fs/xfs/libxfs/xfs_refcount.h index 105c246..a00400f 100644 --- a/fs/xfs/libxfs/xfs_refcount.h +++ b/fs/xfs/libxfs/xfs_refcount.h @@ -64,4 +64,7 @@ extern int xfs_refcount_free_cow_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, xfs_fsblock_t fsb, xfs_extlen_t len); +extern int xfs_refcount_has_record(struct xfs_btree_cur *cur, + xfs_agblock_t bno, xfs_extlen_t len, bool *exists); + #endif /* __XFS_REFCOUNT_H__ */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 34c23f7..ff55d8c 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -867,6 +867,7 @@ xfs_scrub_sb( bool is_freesp; bool has_inodes; bool has_rmap; + bool has_refcount; int error; int err2; @@ -973,6 +974,17 @@ btree_xref: XFS_BTREE_NOERROR); } + /* Cross-reference with the refcountbt. */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + xcur = xfs_refcountbt_init_cursor(mp, NULL, agf_bp, agno, NULL); + err2 = xfs_refcount_has_record(xcur, XFS_SB_BLOCK(mp), 1, + &has_refcount); + if (!err2) + XFS_SCRUB_CHECK(mp, bp, "superblock", !has_refcount); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); out: xfs_buf_relse(bp); @@ -1000,6 +1012,7 @@ xfs_scrub_agf( bool is_freesp; bool has_inodes; bool has_rmap; + bool has_refcount; int error; int err2; @@ -1103,6 +1116,23 @@ skip_rmap_xref: XFS_BTREE_NOERROR); } + /* Cross-reference with the refcountbt. */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + xcur = xfs_refcountbt_init_cursor(mp, NULL, agf_bp, agno, NULL); + err2 = xfs_refcount_has_record(xcur, XFS_AGF_BLOCK(mp), 1, + &has_refcount); + if (err2) + goto skip_refc_xref; + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", !has_refcount); + err2 = xfs_btree_count_blocks(xcur, &blocks); + if (!err2) + XFS_SCRUB_CHECK(mp, agf_bp, "AGF", blocks == + be32_to_cpu(agf->agf_refcount_blocks)); +skip_refc_xref: + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); return error; } @@ -1123,6 +1153,7 @@ xfs_scrub_agfl( struct xfs_btree_cur *icur = NULL; struct xfs_btree_cur *fcur = NULL; struct xfs_btree_cur *rcur = NULL; + struct xfs_btree_cur *ccur = NULL; struct xfs_owner_info oinfo; xfs_agnumber_t agno; xfs_agblock_t agbno; @@ -1131,6 +1162,7 @@ xfs_scrub_agfl( bool is_freesp; bool has_inodes; bool has_rmap; + bool has_refcount; int i; int error; int err2; @@ -1185,6 +1217,15 @@ xfs_scrub_agfl( XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", has_rmap); } + /* Set up cross-reference with refcountbt. */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + ccur = xfs_refcountbt_init_cursor(mp, NULL, agf_bp, agno, NULL); + err2 = xfs_refcount_has_record(ccur, XFS_AGFL_BLOCK(mp), 1, + &has_refcount); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", !has_refcount); + } + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG); agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agfl_bp); for (i = be32_to_cpu(agf->agf_flfirst); @@ -1229,8 +1270,19 @@ xfs_scrub_agfl( if (!err2) XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", has_rmap); } + + /* Cross-reference with the refcountbt. */ + if (ccur) { + err2 = xfs_refcount_has_record(ccur, agbno, 1, + &has_refcount); + if (!err2) + XFS_SCRUB_CHECK(mp, agfl_bp, "AGFL", + !has_refcount); + } } + if (ccur) + xfs_btree_del_cursor(ccur, XFS_BTREE_ERROR); if (rcur) xfs_btree_del_cursor(rcur, XFS_BTREE_ERROR); if (fcur) @@ -1264,6 +1316,7 @@ xfs_scrub_agi( bool is_freesp; bool has_inodes; bool has_rmap; + bool has_refcount; int error; int err2; @@ -1334,6 +1387,17 @@ xfs_scrub_agi( XFS_BTREE_NOERROR); } + /* Cross-reference with the refcountbt. */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + xcur = xfs_refcountbt_init_cursor(mp, NULL, agf_bp, agno, NULL); + err2 = xfs_refcount_has_record(xcur, XFS_AGI_BLOCK(mp), 1, + &has_refcount); + if (!err2) + XFS_SCRUB_CHECK(mp, agi_bp, "AGI", !has_refcount); + xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); return error; } @@ -1355,6 +1419,7 @@ xfs_scrub_allocbt_helper( xfs_extlen_t len; bool has_rmap; bool has_inodes; + bool has_refcount; int has_otherrec; int error = 0; int err2; @@ -1415,6 +1480,14 @@ skip_freesp_xref: XFS_BTREC_SCRUB_CHECK(bs, !has_rmap); } + /* Cross-reference with the refcountbt. */ + if (bs->refc_cur) { + err2 = xfs_refcount_has_record(bs->refc_cur, bno, len, + &has_refcount); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !has_refcount); + } + return error; } @@ -1488,6 +1561,7 @@ xfs_scrub_iallocbt_helper( bool is_freesp; bool has_inodes; bool has_rmap; + bool has_refcount; int holecount; int i; int error = 0; @@ -1547,6 +1621,14 @@ xfs_scrub_iallocbt_helper( XFS_BTREC_SCRUB_CHECK(bs, has_rmap); } + /* Cross-reference with the refcountbt. */ + if (bs->refc_cur) { + err2 = xfs_refcount_has_record(bs->refc_cur, bno, + len, &has_refcount); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !has_refcount); + } + goto out; } @@ -1604,6 +1686,14 @@ xfs_scrub_iallocbt_helper( if (!err2) XFS_BTREC_SCRUB_CHECK(bs, has_rmap); } + + /* Cross-reference with the refcountbt. */ + if (bs->refc_cur) { + err2 = xfs_refcount_has_record(bs->refc_cur, bno, + len, &has_refcount); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !has_refcount); + } } XFS_BTREC_SCRUB_CHECK(bs, holecount <= XFS_INODES_PER_CHUNK); @@ -1674,13 +1764,17 @@ xfs_scrub_rmapbt_helper( struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_agf *agf; struct xfs_rmap_irec irec; + struct xfs_refcount_irec crec; xfs_agblock_t eoag; + xfs_agblock_t fbno; + xfs_extlen_t flen; bool is_freesp; bool non_inode; bool is_unwritten; bool is_bmbt; bool is_attr; bool has_inodes; + int has_refcount; int error = 0; int err2; @@ -1741,6 +1835,45 @@ xfs_scrub_rmapbt_helper( !has_inodes); } + /* Cross-reference with the refcount btree. */ + if (bs->refc_cur) { + if (irec.rm_owner == XFS_RMAP_OWN_COW) { + /* Check this CoW staging extent. */ + err2 = xfs_refcount_lookup_le(bs->refc_cur, + irec.rm_startblock, &has_refcount); + if (err2) + goto skip_refc_xref; + XFS_BTREC_SCRUB_GOTO(bs, has_refcount, skip_refc_xref); + + err2 = xfs_refcount_get_rec(bs->refc_cur, &crec, + &has_refcount); + if (err2) + goto skip_refc_xref; + XFS_BTREC_SCRUB_GOTO(bs, has_refcount, skip_refc_xref); + XFS_BTREC_SCRUB_CHECK(bs, crec.rc_startblock <= + irec.rm_startblock); + XFS_BTREC_SCRUB_CHECK(bs, crec.rc_startblock + + crec.rc_blockcount > + crec.rc_startblock); + XFS_BTREC_SCRUB_CHECK(bs, crec.rc_startblock + + crec.rc_blockcount >= + irec.rm_startblock + + irec.rm_blockcount); + XFS_BTREC_SCRUB_CHECK(bs, + crec.rc_refcount == 1); + } else { + /* If this is shared, the inode flag must be set. */ + err2 = xfs_refcount_find_shared(bs->refc_cur, + irec.rm_startblock, irec.rm_blockcount, + &fbno, &flen, false); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, flen == 0 || + (!non_inode && !is_attr && + !is_bmbt && !is_unwritten)); + } +skip_refc_xref:; + } + return error; } @@ -2164,12 +2297,16 @@ xfs_scrub_bmap_extent( xfs_agnumber_t agno; xfs_fsblock_t bno; struct xfs_rmap_irec rmap; + struct xfs_refcount_irec crec; uint64_t owner; xfs_fileoff_t offset; + xfs_agblock_t fbno; + xfs_extlen_t flen; bool is_freesp; bool has_inodes; unsigned int rflags; int has_rmap; + int has_refcount; int error = 0; int err2 = 0; @@ -2348,6 +2485,53 @@ skip_rmap_xref: XFS_BTREE_NOERROR); } + /* + * If this is a non-shared file on a reflink filesystem, + * check the refcountbt to see if the flag is wrong. + */ + if (xfs_sb_version_hasreflink(&mp->m_sb) && !info->is_rt) { + xcur = xfs_refcountbt_init_cursor(mp, NULL, agf_bp, agno, NULL); + + if (info->whichfork == XFS_COW_FORK) { + /* Check this CoW staging extent. */ + err2 = xfs_refcount_lookup_le(xcur, bno, &has_refcount); + if (err2) + goto skip_refc_xref; + XFS_INO_SCRUB_GOTO(ip, NULL, info->type, has_refcount, + skip_refc_xref); + + err2 = xfs_refcount_get_rec(xcur, &crec, &has_refcount); + if (err2) + goto skip_refc_xref; + XFS_INO_SCRUB_GOTO(ip, NULL, info->type, has_refcount, + skip_refc_xref); + + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + crec.rc_startblock <= bno); + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + crec.rc_startblock + + crec.rc_blockcount > + crec.rc_startblock); + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + crec.rc_startblock + + crec.rc_blockcount >= + bno + irec->br_blockcount); + XFS_INO_SCRUB_CHECK(ip, NULL, info->type, + crec.rc_refcount == 1); + } else { + /* If this is shared, the inode flag must be set. */ + err2 = xfs_refcount_find_shared(xcur, bno, + irec->br_blockcount, &fbno, &flen, + false); + if (!err2) + XFS_INO_SCRUB_CHECK(ip, bp, info->type, + flen == 0 || + xfs_is_reflink_inode(ip)); + } +skip_refc_xref: + xfs_btree_del_cursor(xcur, XFS_BTREE_NOERROR); + } + xfs_scrub_put_ag_headers(&agi_bp, &agf_bp); out: info->lastoff = irec->br_startoff + irec->br_blockcount; From darrick.wong@oracle.com Thu Aug 25 18:42:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 873647FA5 for ; Thu, 25 Aug 2016 18:42:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5AA84304039 for ; Thu, 25 Aug 2016 16:42:59 -0700 (PDT) X-ASG-Debug-ID: 1472168577-0bf57b5311209670001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 74GOYGXS8T8jemAc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:42:57 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNgt4I025434 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:56 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgtGl031076 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:42:55 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNgril017037; Thu, 25 Aug 2016 23:42:54 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:42:53 -0700 Subject: [PATCH 24/25] xfs: scrub should cross-reference the realtime bitmap From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 24/25] xfs: scrub should cross-reference the realtime bitmap To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:52 -0700 Message-ID: <147216857200.3108.11169547765266171675.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168577 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3069 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines While we're scrubbing various btrees, cross-reference the records with the other metadata. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rtbitmap.c | 29 +++++++++++++++++++++++++++++ fs/xfs/xfs_rtalloc.h | 3 +++ fs/xfs/xfs_scrub.c | 9 +++++++++ 3 files changed, 41 insertions(+) diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index f4b68c0..0f95c19 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -1016,3 +1016,32 @@ xfs_rtfree_extent( } return 0; } + +/* Is the given extent all free? */ +int +xfs_rtbitmap_extent_is_free( + struct xfs_mount *mp, + xfs_rtblock_t start, + xfs_rtblock_t len, + bool *is_free) +{ + xfs_rtblock_t end; + xfs_extlen_t clen; + int matches; + int error; + + *is_free = false; + while (len) { + clen = len > ~0U ? ~0U : len; + error = xfs_rtcheck_range(mp, NULL, start, clen, 1, &end, + &matches); + if (error || !matches || end < start + clen) + return error; + + len -= end - start; + start = end + 1; + } + + *is_free = true; + return error; +} diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h index 91e48f9..14fd2c3 100644 --- a/fs/xfs/xfs_rtalloc.h +++ b/fs/xfs/xfs_rtalloc.h @@ -121,6 +121,8 @@ int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log, int xfs_rtfree_range(struct xfs_mount *mp, struct xfs_trans *tp, xfs_rtblock_t start, xfs_extlen_t len, struct xfs_buf **rbpp, xfs_fsblock_t *rsb); +int xfs_rtbitmap_extent_is_free(struct xfs_mount *mp, + xfs_rtblock_t start, xfs_rtblock_t len, bool *is_free); #else @@ -129,6 +131,7 @@ int xfs_rtfree_range(struct xfs_mount *mp, struct xfs_trans *tp, # define xfs_rtpick_extent(m,t,l,rb) (ENOSYS) # define xfs_growfs_rt(mp,in) (ENOSYS) # define xfs_rtbuf_get(m,t,b,i,p) (ENOSYS) +# define xfs_rtbitmap_extent_is_free(m,s,l,i) (ENOSYS) static inline int /* error */ xfs_rtmount_init( xfs_mount_t *mp) /* file system mount structure */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index ff55d8c..e4e3210 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -2304,6 +2304,7 @@ xfs_scrub_bmap_extent( xfs_extlen_t flen; bool is_freesp; bool has_inodes; + bool is_free; unsigned int rflags; int has_rmap; int has_refcount; @@ -2390,6 +2391,14 @@ xfs_scrub_bmap_extent( xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); } + } else { + /* Cross-reference with rtbitmap. */ + xfs_ilock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); + err2 = xfs_rtbitmap_extent_is_free(mp, irec->br_startblock, + irec->br_blockcount, &is_free); + if (!err2) + XFS_BTREC_SCRUB_CHECK(&info->bs, !is_free); + xfs_iunlock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); } /* Cross-reference with rmapbt. */ From darrick.wong@oracle.com Thu Aug 25 18:43:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D38717FBB for ; Thu, 25 Aug 2016 18:43:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A3F5304043 for ; Thu, 25 Aug 2016 16:43:04 -0700 (PDT) X-ASG-Debug-ID: 1472168582-0bf57b5314209690001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ca037RmKMmlr5XEm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:43:03 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNh1Yh019163 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:43:02 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNh1VC031436 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:43:01 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNh0KC031807; Thu, 25 Aug 2016 23:43:01 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:43:00 -0700 Subject: [PATCH 25/25] xfs: query the per-AG reservation counters From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 25/25] xfs: query the per-AG reservation counters To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:42:58 -0700 Message-ID: <147216857818.3108.11355542277200889786.stgit@birch.djwong.org> In-Reply-To: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> References: <147216841262.3108.10746252464845687338.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168583 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3861 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Establish an ioctl for userspace to query the original and current per-AG reservation counts. This will be used by xfs_scrub to check that the vfs counters are at least somewhat sane. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 10 ++++++++++ fs/xfs/xfs_fsops.c | 29 +++++++++++++++++++++++++++++ fs/xfs/xfs_fsops.h | 2 ++ fs/xfs/xfs_ioctl.c | 16 ++++++++++++++++ 4 files changed, 57 insertions(+) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index 211c874..f273e76 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -556,6 +556,15 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ /* + * AG reserved block counters + */ +struct xfs_fsop_ag_resblks { + __u64 resblks; /* blocks reserved now */ + __u64 resblks_orig; /* blocks reserved at mount time */ + __u64 reserved[2]; +}; + +/* * ioctl limits */ #ifdef XATTR_LIST_MAX @@ -631,6 +640,7 @@ struct xfs_scrub_metadata { #define XFS_IOC_ATTRMULTI_BY_HANDLE _IOW ('X', 123, struct xfs_fsop_attrmulti_handlereq) #define XFS_IOC_FSGEOMETRY _IOR ('X', 124, struct xfs_fsop_geom) #define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t) +#define XFS_IOC_GET_AG_RESBLKS _IOR ('X', 126, struct xfs_fsop_ag_resblks) /* XFS_IOC_GETFSUUID ---------- deprecated 140 */ /* reflink ioctls; these MUST match the btrfs ioctl definitions */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 9880eeb..9d7984d 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -44,6 +44,7 @@ #include "xfs_filestream.h" #include "xfs_rmap.h" #include "xfs_ag_resv.h" +#include "xfs_fs.h" /* * File system operations @@ -1044,3 +1045,31 @@ xfs_fs_unreserve_ag_blocks( if (error) xfs_warn(mp, "Error %d unreserving metadata blocks.", error); } + +/* Query the per-AG reservations to see how many blocks we have reserved. */ +int +xfs_fs_get_ag_reserve_blocks( + struct xfs_mount *mp, + struct xfs_fsop_ag_resblks *out) +{ + struct xfs_ag_resv *r; + struct xfs_perag *pag; + xfs_agnumber_t agno; + + out->resblks = 0; + out->resblks_orig = 0; + out->reserved[0] = out->reserved[1] = 0; + + for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) { + pag = xfs_perag_get(mp, agno); + r = xfs_perag_resv(pag, XFS_AG_RESV_METADATA); + out->resblks += r->ar_reserved; + out->resblks_orig += r->ar_asked; + r = xfs_perag_resv(pag, XFS_AG_RESV_AGFL); + out->resblks += r->ar_reserved; + out->resblks_orig += r->ar_asked; + xfs_perag_put(pag); + } + + return 0; +} diff --git a/fs/xfs/xfs_fsops.h b/fs/xfs/xfs_fsops.h index 71e32480..58b584b 100644 --- a/fs/xfs/xfs_fsops.h +++ b/fs/xfs/xfs_fsops.h @@ -25,6 +25,8 @@ extern int xfs_fs_counts(xfs_mount_t *mp, xfs_fsop_counts_t *cnt); extern int xfs_reserve_blocks(xfs_mount_t *mp, __uint64_t *inval, xfs_fsop_resblks_t *outval); extern int xfs_fs_goingdown(xfs_mount_t *mp, __uint32_t inflags); +extern int xfs_fs_get_ag_reserve_blocks(struct xfs_mount *mp, + struct xfs_fsop_ag_resblks *out); extern void xfs_fs_reserve_ag_blocks(struct xfs_mount *mp); extern void xfs_fs_unreserve_ag_blocks(struct xfs_mount *mp); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 65f0c03..2a61268 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1993,6 +1993,22 @@ xfs_file_ioctl( return 0; } + case XFS_IOC_GET_AG_RESBLKS: { + struct xfs_fsop_ag_resblks out; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + error = xfs_fs_get_ag_reserve_blocks(mp, &out); + if (error) + return error; + + if (copy_to_user(arg, &out, sizeof(out))) + return -EFAULT; + + return 0; + } + case XFS_IOC_FSGROWFSDATA: { xfs_growfs_data_t in; From darrick.wong@oracle.com Thu Aug 25 18:43:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6FDE57FC1 for ; Thu, 25 Aug 2016 18:43:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1811A8F8035 for ; Thu, 25 Aug 2016 16:43:32 -0700 (PDT) X-ASG-Debug-ID: 1472168609-0bf8155c751e79b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Db3EDC1CIu1fHSV3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:43:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNhSpu025915 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:43:29 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNhSHB016242 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:43:28 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNhSAe031424; Thu, 25 Aug 2016 23:43:28 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:43:27 -0700 Subject: [PATCH v8 00/20] xfs: add realtime reverse-mapping support From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 00/20] xfs: add realtime reverse-mapping support To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:43:26 -0700 Message-ID: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168610 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2170 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. At the beginning of the set are patches to implement storing B+tree leaves in an inode root, since the realtime rmapbt is rooted in an inode, unlike the regular rmapbt which is rooted in an AG block. Prior to this, the only btree that could be rooted in the inode fork was the block mapping btree; if all the extent records fit in the inode, format would be switched from 'btree' to 'extents'. The next few patches widen the reverse mapping routines to fit the 64-bit numbers required to store information about the realtime device and establish a new b+tree type (rtrmapbt) for the realtime variant of the rmapbt. After that are a few patches to handle rooting the rtrmapbt in a specific inode that's referenced by the superblock. Finally, there are patches to implement GETFSMAP with the rtrmapbt and scrub functionality for the rtrmapbt and rtbitmap. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:43:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AC7DE7D9B for ; Thu, 25 Aug 2016 18:43:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 707B4304039 for ; Thu, 25 Aug 2016 16:43:44 -0700 (PDT) X-ASG-Debug-ID: 1472168622-0bf57c55b31c7bd0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id eO6yMvLDzb87y72K (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:43:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNheZF026151 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:43:41 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNhe0e016566 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:43:40 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNhYdD017273; Thu, 25 Aug 2016 23:43:39 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:43:34 -0700 Subject: [PATCH 01/20] xfs: refactor long-format btree header verification routines From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/20] xfs: refactor long-format btree header verification routines To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:43:32 -0700 Message-ID: <147216861266.3688.15987417236994523745.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168622 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4544 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create two helper functions to verify the headers of a long format btree block. We'll use this later for the realtime rmapbt. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap_btree.c | 22 ++----------------- fs/xfs/libxfs/xfs_btree.c | 47 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_btree.h | 3 +++ 3 files changed, 52 insertions(+), 20 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index 1fc3eed..df691d2 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -677,17 +677,11 @@ xfs_bmbt_verify( switch (block->bb_magic) { case cpu_to_be32(XFS_BMAP_CRC_MAGIC): - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return false; - if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)) - return false; - if (be64_to_cpu(block->bb_u.l.bb_blkno) != bp->b_bn) - return false; /* * XXX: need a better way of verifying the owner here. Right now * just make sure there has been one set. */ - if (be64_to_cpu(block->bb_u.l.bb_owner) == 0) + if (!xfs_btree_lblock_v5hdr_verify(bp, XFS_RMAP_OWN_UNKNOWN)) return false; /* fall through */ case cpu_to_be32(XFS_BMAP_MAGIC): @@ -706,20 +700,8 @@ xfs_bmbt_verify( level = be16_to_cpu(block->bb_level); if (level > max(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1])) return false; - if (be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) - return false; - - /* sibling pointer verification */ - if (!block->bb_u.l.bb_leftsib || - (block->bb_u.l.bb_leftsib != cpu_to_be64(NULLFSBLOCK) && - !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib)))) - return false; - if (!block->bb_u.l.bb_rightsib || - (block->bb_u.l.bb_rightsib != cpu_to_be64(NULLFSBLOCK) && - !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib)))) - return false; - return true; + return xfs_btree_lblock_verify(bp, mp->m_bmap_dmxr[level != 0]); } static void diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index a926c54..753e5ed 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -4457,6 +4457,53 @@ xfs_btree_change_owner( &bbcoi); } +/* Verify the v5 fields of a long-format btree block. */ +bool +xfs_btree_lblock_v5hdr_verify( + struct xfs_buf *bp, + __uint64_t owner) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)) + return false; + if (block->bb_u.l.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (owner != XFS_RMAP_OWN_UNKNOWN && + be64_to_cpu(block->bb_u.l.bb_owner) != owner) + return false; + return true; +} + +/* Verify a long-format btree block. */ +bool +xfs_btree_lblock_verify( + struct xfs_buf *bp, + unsigned int max_recs) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + + /* numrecs verification */ + if (be16_to_cpu(block->bb_numrecs) > max_recs) + return false; + + /* sibling pointer verification */ + if (!block->bb_u.l.bb_leftsib || + (block->bb_u.l.bb_leftsib != cpu_to_be64(NULLFSBLOCK) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib)))) + return false; + if (!block->bb_u.l.bb_rightsib || + (block->bb_u.l.bb_rightsib != cpu_to_be64(NULLFSBLOCK) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib)))) + return false; + + return true; +} + /** * xfs_btree_sblock_v5hdr_verify() -- verify the v5 fields of a short-format * btree block diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index f81b2a8..a7770dd 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -513,6 +513,9 @@ static inline int xfs_btree_get_level(struct xfs_btree_block *block) bool xfs_btree_sblock_v5hdr_verify(struct xfs_buf *bp); bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); +bool xfs_btree_lblock_v5hdr_verify(struct xfs_buf *bp, __uint64_t owner); +bool xfs_btree_lblock_verify(struct xfs_buf *bp, unsigned int max_recs); + uint xfs_btree_compute_maxlevels(struct xfs_mount *mp, uint *limits, unsigned long len); xfs_extlen_t xfs_btree_calc_size(struct xfs_mount *mp, uint *limits, From darrick.wong@oracle.com Thu Aug 25 18:43:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 843B27E45 for ; Thu, 25 Aug 2016 18:43:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 096A6AC001 for ; Thu, 25 Aug 2016 16:43:45 -0700 (PDT) X-ASG-Debug-ID: 1472168622-0bf8155c741e7a20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id anVcFPp7gehLC23R (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:43:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNhfk6019538 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:43:41 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNhfKc028196 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:43:41 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNhecD017326; Thu, 25 Aug 2016 23:43:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:43:40 -0700 Subject: [PATCH 02/20] xfs: make iroot_realloc a btree function From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/20] xfs: make iroot_realloc a btree function To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:43:38 -0700 Message-ID: <147216861888.3688.9056614828997397364.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168623 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14515 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines For btrees that are rooted in the inode core, we have to have a function to resize the root. This is fairly specific to each btree type, so make xfs_iroot_realloc a per-btree function. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 6 +- fs/xfs/libxfs/xfs_bmap_btree.c | 139 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_bmap_btree.h | 3 + fs/xfs/libxfs/xfs_btree.c | 12 +-- fs/xfs/libxfs/xfs_btree.h | 7 ++ fs/xfs/libxfs/xfs_inode_fork.c | 129 ------------------------------------- fs/xfs/libxfs/xfs_inode_fork.h | 1 7 files changed, 156 insertions(+), 141 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 7a91618..a90f40f 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -671,7 +671,7 @@ xfs_bmap_btree_to_extents( xfs_trans_binval(tp, cbp); if (cur->bc_bufs[0] == cbp) cur->bc_bufs[0] = NULL; - xfs_iroot_realloc(ip, -1, whichfork); + xfs_bmbt_iroot_realloc(ip, -1, whichfork); ASSERT(ifp->if_broot == NULL); ASSERT((ifp->if_flags & XFS_IFBROOT) == 0); XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); @@ -717,7 +717,7 @@ xfs_bmap_extents_to_btree( /* * Make space in the inode incore. */ - xfs_iroot_realloc(ip, 1, whichfork); + xfs_bmbt_iroot_realloc(ip, 1, whichfork); ifp->if_flags |= XFS_IFBROOT; /* @@ -764,7 +764,7 @@ try_another_ag: args.wasdel = wasdel; *logflagsp = 0; if ((error = xfs_alloc_vextent(&args))) { - xfs_iroot_realloc(ip, -1, whichfork); + xfs_bmbt_iroot_realloc(ip, -1, whichfork); xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index df691d2..44e0e14a 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -667,6 +667,144 @@ xfs_bmbt_diff_two_keys( be64_to_cpu(k2->bmbt.br_startoff); } +/* + * Reallocate the space for if_broot based on the number of records + * being added or deleted as indicated in rec_diff. Move the records + * and pointers in if_broot to fit the new size. When shrinking this + * will eliminate holes between the records and pointers created by + * the caller. When growing this will create holes to be filled in + * by the caller. + * + * The caller must not request to add more records than would fit in + * the on-disk inode root. If the if_broot is currently NULL, then + * if we are adding records, one will be allocated. The caller must also + * not request that the number of records go below zero, although + * it can go to zero. + * + * ip -- the inode whose if_broot area is changing + * ext_diff -- the change in the number of records, positive or negative, + * requested for the if_broot array. + */ +void +xfs_bmbt_iroot_realloc( + struct xfs_inode *ip, + int rec_diff, + int whichfork) +{ + struct xfs_mount *mp = ip->i_mount; + int cur_max; + struct xfs_ifork *ifp; + struct xfs_btree_block *new_broot; + int new_max; + size_t new_size; + char *np; + char *op; + + /* + * Handle the degenerate case quietly. + */ + if (rec_diff == 0) { + return; + } + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (rec_diff > 0) { + /* + * If there wasn't any memory allocated before, just + * allocate it now and get out. + */ + if (ifp->if_broot_bytes == 0) { + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); + ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); + ifp->if_broot_bytes = (int)new_size; + return; + } + + /* + * If there is already an existing if_broot, then we need + * to realloc() it and shift the pointers to their new + * location. The records don't change location because + * they are kept butted up against the btree block header. + */ + cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); + new_max = cur_max + rec_diff; + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); + ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, + KM_SLEEP | KM_NOFS); + op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + ifp->if_broot_bytes); + np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + (int)new_size); + ifp->if_broot_bytes = (int)new_size; + ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + memmove(np, op, cur_max * (uint)sizeof(xfs_fsblock_t)); + return; + } + + /* + * rec_diff is less than 0. In this case, we are shrinking the + * if_broot buffer. It must already exist. If we go to zero + * records, just get rid of the root and clear the status bit. + */ + ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); + cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); + new_max = cur_max + rec_diff; + ASSERT(new_max >= 0); + if (new_max > 0) + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); + else + new_size = 0; + if (new_size > 0) { + new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); + /* + * First copy over the btree block header. + */ + memcpy(new_broot, ifp->if_broot, + XFS_BMBT_BLOCK_LEN(ip->i_mount)); + } else { + new_broot = NULL; + ifp->if_flags &= ~XFS_IFBROOT; + } + + /* + * Only copy the records and pointers if there are any. + */ + if (new_max > 0) { + /* + * First copy the records. + */ + op = (char *)XFS_BMBT_REC_ADDR(mp, ifp->if_broot, 1); + np = (char *)XFS_BMBT_REC_ADDR(mp, new_broot, 1); + memcpy(np, op, new_max * (uint)sizeof(xfs_bmbt_rec_t)); + + /* + * Then copy the pointers. + */ + op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + ifp->if_broot_bytes); + np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1, + (int)new_size); + memcpy(np, op, new_max * (uint)sizeof(xfs_fsblock_t)); + } + kmem_free(ifp->if_broot); + ifp->if_broot = new_broot; + ifp->if_broot_bytes = (int)new_size; + if (ifp->if_broot) + ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + return; +} + +STATIC void +__xfs_bmbt_iroot_realloc( + struct xfs_btree_cur *cur, + int rec_diff) +{ + return xfs_bmbt_iroot_realloc(cur->bc_private.b.ip, rec_diff, + cur->bc_private.b.whichfork); +} + static bool xfs_bmbt_verify( struct xfs_buf *bp) @@ -778,6 +916,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .key_diff = xfs_bmbt_key_diff, .diff_two_keys = xfs_bmbt_diff_two_keys, .buf_ops = &xfs_bmbt_buf_ops, + .iroot_realloc = __xfs_bmbt_iroot_realloc, .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, }; diff --git a/fs/xfs/libxfs/xfs_bmap_btree.h b/fs/xfs/libxfs/xfs_bmap_btree.h index 819a8a4..843e25e 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.h +++ b/fs/xfs/libxfs/xfs_bmap_btree.h @@ -140,4 +140,7 @@ extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip, extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); +extern void xfs_bmbt_iroot_realloc(struct xfs_inode *ip, int rec_diff, + int whichfork); + #endif /* __XFS_BMAP_BTREE_H__ */ diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 753e5ed..21243e8 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -2993,9 +2993,7 @@ xfs_btree_new_iroot( #endif xfs_btree_copy_ptrs(cur, pp, &nptr, 1); - xfs_iroot_realloc(cur->bc_private.b.ip, - 1 - xfs_btree_get_numrecs(cblock), - cur->bc_private.b.whichfork); + cur->bc_ops->iroot_realloc(cur, 1 - xfs_btree_get_numrecs(cblock)); xfs_btree_setbuf(cur, level, cbp); @@ -3170,7 +3168,7 @@ xfs_btree_make_block_unfull( if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) { /* A root block that can be made bigger. */ - xfs_iroot_realloc(ip, 1, cur->bc_private.b.whichfork); + cur->bc_ops->iroot_realloc(cur, 1); *stat = 1; } else { /* A root block that needs replacing */ @@ -3589,8 +3587,7 @@ xfs_btree_kill_iroot( index = numrecs - cur->bc_ops->get_maxrecs(cur, level); if (index) { - xfs_iroot_realloc(cur->bc_private.b.ip, index, - cur->bc_private.b.whichfork); + cur->bc_ops->iroot_realloc(cur, index); block = ifp->if_broot; } @@ -3804,8 +3801,7 @@ xfs_btree_delrec( */ if (level == cur->bc_nlevels - 1) { if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { - xfs_iroot_realloc(cur->bc_private.b.ip, -1, - cur->bc_private.b.whichfork); + cur->bc_ops->iroot_realloc(cur, -1); error = xfs_btree_kill_iroot(cur); if (error) diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index a7770dd..ea15b1e 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -195,6 +195,13 @@ struct xfs_btree_ops { union xfs_btree_key *key1, union xfs_btree_key *key2); + /* + * Reallocate the space for if_broot based on the number of records + * being added or deleted as indicated in rec_diff. + */ + void (*iroot_realloc)(struct xfs_btree_cur *cur, + int rec_diff); + const struct xfs_buf_ops *buf_ops; /* check that k1 is lower than k2 */ diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index d29954a..2de6cb5 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -508,135 +508,6 @@ xfs_iread_extents( xfs_validate_extents(ifp, nextents, XFS_EXTFMT_INODE(ip)); return 0; } -/* - * Reallocate the space for if_broot based on the number of records - * being added or deleted as indicated in rec_diff. Move the records - * and pointers in if_broot to fit the new size. When shrinking this - * will eliminate holes between the records and pointers created by - * the caller. When growing this will create holes to be filled in - * by the caller. - * - * The caller must not request to add more records than would fit in - * the on-disk inode root. If the if_broot is currently NULL, then - * if we are adding records, one will be allocated. The caller must also - * not request that the number of records go below zero, although - * it can go to zero. - * - * ip -- the inode whose if_broot area is changing - * ext_diff -- the change in the number of records, positive or negative, - * requested for the if_broot array. - */ -void -xfs_iroot_realloc( - xfs_inode_t *ip, - int rec_diff, - int whichfork) -{ - struct xfs_mount *mp = ip->i_mount; - int cur_max; - xfs_ifork_t *ifp; - struct xfs_btree_block *new_broot; - int new_max; - size_t new_size; - char *np; - char *op; - - /* - * Handle the degenerate case quietly. - */ - if (rec_diff == 0) { - return; - } - - ifp = XFS_IFORK_PTR(ip, whichfork); - if (rec_diff > 0) { - /* - * If there wasn't any memory allocated before, just - * allocate it now and get out. - */ - if (ifp->if_broot_bytes == 0) { - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); - ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); - ifp->if_broot_bytes = (int)new_size; - return; - } - - /* - * If there is already an existing if_broot, then we need - * to realloc() it and shift the pointers to their new - * location. The records don't change location because - * they are kept butted up against the btree block header. - */ - cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); - new_max = cur_max + rec_diff; - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); - ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, - KM_SLEEP | KM_NOFS); - op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - ifp->if_broot_bytes); - np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - (int)new_size); - ifp->if_broot_bytes = (int)new_size; - ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= - XFS_IFORK_SIZE(ip, whichfork)); - memmove(np, op, cur_max * (uint)sizeof(xfs_fsblock_t)); - return; - } - - /* - * rec_diff is less than 0. In this case, we are shrinking the - * if_broot buffer. It must already exist. If we go to zero - * records, just get rid of the root and clear the status bit. - */ - ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); - cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); - new_max = cur_max + rec_diff; - ASSERT(new_max >= 0); - if (new_max > 0) - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); - else - new_size = 0; - if (new_size > 0) { - new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); - /* - * First copy over the btree block header. - */ - memcpy(new_broot, ifp->if_broot, - XFS_BMBT_BLOCK_LEN(ip->i_mount)); - } else { - new_broot = NULL; - ifp->if_flags &= ~XFS_IFBROOT; - } - - /* - * Only copy the records and pointers if there are any. - */ - if (new_max > 0) { - /* - * First copy the records. - */ - op = (char *)XFS_BMBT_REC_ADDR(mp, ifp->if_broot, 1); - np = (char *)XFS_BMBT_REC_ADDR(mp, new_broot, 1); - memcpy(np, op, new_max * (uint)sizeof(xfs_bmbt_rec_t)); - - /* - * Then copy the pointers. - */ - op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - ifp->if_broot_bytes); - np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1, - (int)new_size); - memcpy(np, op, new_max * (uint)sizeof(xfs_fsblock_t)); - } - kmem_free(ifp->if_broot); - ifp->if_broot = new_broot; - ifp->if_broot_bytes = (int)new_size; - if (ifp->if_broot) - ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= - XFS_IFORK_SIZE(ip, whichfork)); - return; -} - /* * This is called when the amount of space needed for if_data diff --git a/fs/xfs/libxfs/xfs_inode_fork.h b/fs/xfs/libxfs/xfs_inode_fork.h index 44d38eb..ecdf665 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.h +++ b/fs/xfs/libxfs/xfs_inode_fork.h @@ -144,7 +144,6 @@ void xfs_iflush_fork(struct xfs_inode *, struct xfs_dinode *, struct xfs_inode_log_item *, int); void xfs_idestroy_fork(struct xfs_inode *, int); void xfs_idata_realloc(struct xfs_inode *, int, int); -void xfs_iroot_realloc(struct xfs_inode *, int, int); int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); int xfs_iextents_copy(struct xfs_inode *, struct xfs_bmbt_rec *, int); From darrick.wong@oracle.com Thu Aug 25 18:43:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 742AB7FD0 for ; Thu, 25 Aug 2016 18:43:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D04E2AC002 for ; Thu, 25 Aug 2016 16:43:51 -0700 (PDT) X-ASG-Debug-ID: 1472168629-0bf57b5314209750001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id BRYAlYHkIU2WOcVS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:43:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNhlKf026202 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:43:48 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNhlND000469 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:43:47 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNhkhC031562; Thu, 25 Aug 2016 23:43:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:43:46 -0700 Subject: [PATCH 03/20] xfs: support storing records in the inode core root From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/20] xfs: support storing records in the inode core root To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:43:45 -0700 Message-ID: <147216862522.3688.1533947807203721369.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168629 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11116 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make it so that we can actually store btree records in the inode core (i.e. enable bb_level == 0) so that the rtrmapbt can do this. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 201 +++++++++++++++++++++++++++++++++------------ fs/xfs/libxfs/xfs_btree.h | 1 2 files changed, 150 insertions(+), 52 deletions(-) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 21243e8..e89b1d3 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -157,6 +157,11 @@ xfs_btree_check_block( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer containing block, if any */ { + /* Don't check the inode-core root. */ + if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && + level == cur->bc_nlevels - 1) + return 0; + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) return xfs_btree_check_lblock(cur, block, level, bp); else @@ -1420,10 +1425,15 @@ xfs_btree_log_recs( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); - xfs_trans_log_buf(cur->bc_tp, bp, - xfs_btree_rec_offset(cur, first), - xfs_btree_rec_offset(cur, last + 1) - 1); + if (bp) { + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); + xfs_trans_log_buf(cur->bc_tp, bp, + xfs_btree_rec_offset(cur, first), + xfs_btree_rec_offset(cur, last + 1) - 1); + } else { + xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, + xfs_ilog_fbroot(cur->bc_private.b.whichfork)); + } XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); } @@ -2921,8 +2931,11 @@ xfs_btree_new_iroot( struct xfs_btree_block *cblock; /* child btree block */ union xfs_btree_key *ckp; /* child key pointer */ union xfs_btree_ptr *cpp; /* child ptr pointer */ + union xfs_btree_rec *crp; union xfs_btree_key *kp; /* pointer to btree key */ union xfs_btree_ptr *pp; /* pointer to block addr */ + union xfs_btree_rec *rp; + union xfs_btree_ptr aptr; union xfs_btree_ptr nptr; /* new block addr */ int level; /* btree level */ int error; /* error return code */ @@ -2938,10 +2951,15 @@ xfs_btree_new_iroot( level = cur->bc_nlevels - 1; block = xfs_btree_get_iroot(cur); - pp = xfs_btree_ptr_addr(cur, 1, block); + ASSERT(level > 0 || (cur->bc_flags & XFS_BTREE_IROOT_RECORDS)); + if (level > 0) + aptr = *xfs_btree_ptr_addr(cur, 1, block); + else + aptr.l = cpu_to_be64(XFS_INO_TO_FSB(cur->bc_mp, + cur->bc_private.b.ip->i_ino)); /* Allocate the new block. If we can't do it, we're toast. Give up. */ - error = cur->bc_ops->alloc_block(cur, pp, &nptr, stat); + error = cur->bc_ops->alloc_block(cur, &aptr, &nptr, stat); if (error) goto error0; if (*stat == 0) { @@ -2967,43 +2985,93 @@ xfs_btree_new_iroot( cblock->bb_u.s.bb_blkno = cpu_to_be64(cbp->b_bn); } - be16_add_cpu(&block->bb_level, 1); xfs_btree_set_numrecs(block, 1); cur->bc_nlevels++; cur->bc_ptrs[level + 1] = 1; - kp = xfs_btree_key_addr(cur, 1, block); - ckp = xfs_btree_key_addr(cur, 1, cblock); - xfs_btree_copy_keys(cur, ckp, kp, xfs_btree_get_numrecs(cblock)); + if (level > 0) { + /* + * We already incremented nlevels, so we have to do the + * same to bb_level or else pp will be calculated with the + * maxrecs for regular blocks and point at the wrong place. + */ + be16_add_cpu(&block->bb_level, 1); + + kp = xfs_btree_key_addr(cur, 1, block); + ckp = xfs_btree_key_addr(cur, 1, cblock); + xfs_btree_copy_keys(cur, ckp, kp, + xfs_btree_get_numrecs(cblock)); - cpp = xfs_btree_ptr_addr(cur, 1, cblock); + pp = xfs_btree_ptr_addr(cur, 1, block); + cpp = xfs_btree_ptr_addr(cur, 1, cblock); #ifdef DEBUG - for (i = 0; i < be16_to_cpu(cblock->bb_numrecs); i++) { - error = xfs_btree_check_ptr(cur, pp, i, level); - if (error) - goto error0; - } + for (i = 0; i < be16_to_cpu(cblock->bb_numrecs); i++) { + error = xfs_btree_check_ptr(cur, pp, i, level); + if (error) + goto error0; + } #endif - xfs_btree_copy_ptrs(cur, cpp, pp, xfs_btree_get_numrecs(cblock)); + xfs_btree_copy_ptrs(cur, cpp, pp, + xfs_btree_get_numrecs(cblock)); #ifdef DEBUG - error = xfs_btree_check_ptr(cur, &nptr, 0, level); - if (error) - goto error0; + error = xfs_btree_check_ptr(cur, &nptr, 0, level); + if (error) + goto error0; #endif - xfs_btree_copy_ptrs(cur, pp, &nptr, 1); + xfs_btree_copy_ptrs(cur, pp, &nptr, 1); - cur->bc_ops->iroot_realloc(cur, 1 - xfs_btree_get_numrecs(cblock)); + cur->bc_ops->iroot_realloc(cur, + 1 - xfs_btree_get_numrecs(cblock)); + block = xfs_btree_get_iroot(cur); - xfs_btree_setbuf(cur, level, cbp); + xfs_btree_setbuf(cur, level, cbp); - /* - * Do all this logging at the end so that - * the root is at the right level. - */ - xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); - xfs_btree_log_keys(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); - xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); + /* + * Do all this logging at the end so that + * the root is at the right level. + */ + xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); + xfs_btree_log_keys(cur, cbp, 1, + be16_to_cpu(cblock->bb_numrecs)); + xfs_btree_log_ptrs(cur, cbp, 1, + be16_to_cpu(cblock->bb_numrecs)); + } else { + rp = xfs_btree_rec_addr(cur, 1, block); + crp = xfs_btree_rec_addr(cur, 1, cblock); + xfs_btree_copy_recs(cur, crp, rp, + xfs_btree_get_numrecs(cblock)); + + /* + * Trickery here: The number of records we think we have + * changes when we convert a leaf to a node. Therefore, + * set the length to zero, increment the level, and set + * the length to 1 record. + */ + cur->bc_ops->iroot_realloc(cur, -xfs_btree_get_numrecs(cblock)); + block = xfs_btree_get_iroot(cur); + be16_add_cpu(&block->bb_level, 1); + cur->bc_ops->iroot_realloc(cur, 1); + block = xfs_btree_get_iroot(cur); + + /* Copy pointer into the block. */ + xfs_btree_copy_ptrs(cur, xfs_btree_ptr_addr(cur, 1, block), + &nptr, 1); + + xfs_btree_setbuf(cur, level, cbp); + + /* + * Do all this logging at the end so that + * the root is at the right level. + */ + xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); + xfs_btree_log_recs(cur, cbp, 1, + be16_to_cpu(cblock->bb_numrecs)); + + /* Write the new keys into the root block. */ + } + /* Get the keys for the new block and put them into the root. */ + xfs_btree_get_keys(cur, cblock, xfs_btree_key_addr(cur, 1, block)); *logflags |= XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork); @@ -3526,15 +3594,15 @@ STATIC int xfs_btree_kill_iroot( struct xfs_btree_cur *cur) { - int whichfork = cur->bc_private.b.whichfork; struct xfs_inode *ip = cur->bc_private.b.ip; - struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); struct xfs_btree_block *block; struct xfs_btree_block *cblock; union xfs_btree_key *kp; union xfs_btree_key *ckp; union xfs_btree_ptr *pp; union xfs_btree_ptr *cpp; + union xfs_btree_rec *rp; + union xfs_btree_rec *crp; struct xfs_buf *cbp; int level; int index; @@ -3548,14 +3616,19 @@ xfs_btree_kill_iroot( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); - ASSERT(cur->bc_nlevels > 1); + ASSERT((cur->bc_flags & XFS_BTREE_IROOT_RECORDS) || + cur->bc_nlevels > 1); /* * Don't deal with the root block needs to be a leaf case. * We're just going to turn the thing back into extents anyway. */ level = cur->bc_nlevels - 1; - if (level == 1) + if (level == 1 && !(cur->bc_flags & XFS_BTREE_IROOT_RECORDS)) + goto out0; + + /* If we're already a leaf, jump out. */ + if (level == 0) goto out0; /* @@ -3586,30 +3659,55 @@ xfs_btree_kill_iroot( #endif index = numrecs - cur->bc_ops->get_maxrecs(cur, level); - if (index) { - cur->bc_ops->iroot_realloc(cur, index); - block = ifp->if_broot; - } - be16_add_cpu(&block->bb_numrecs, index); ASSERT(block->bb_numrecs == cblock->bb_numrecs); - kp = xfs_btree_key_addr(cur, 1, block); - ckp = xfs_btree_key_addr(cur, 1, cblock); - xfs_btree_copy_keys(cur, kp, ckp, numrecs); + if (be16_to_cpu(cblock->bb_level) > 0) { + if (index) { + cur->bc_ops->iroot_realloc(cur, index); + block = xfs_btree_get_iroot(cur); + } + + kp = xfs_btree_key_addr(cur, 1, block); + ckp = xfs_btree_key_addr(cur, 1, cblock); + xfs_btree_copy_keys(cur, kp, ckp, numrecs); - pp = xfs_btree_ptr_addr(cur, 1, block); - cpp = xfs_btree_ptr_addr(cur, 1, cblock); + pp = xfs_btree_ptr_addr(cur, 1, block); + cpp = xfs_btree_ptr_addr(cur, 1, cblock); #ifdef DEBUG - for (i = 0; i < numrecs; i++) { - error = xfs_btree_check_ptr(cur, cpp, i, level - 1); - if (error) { - XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); - return error; + for (i = 0; i < numrecs; i++) { + error = xfs_btree_check_ptr(cur, cpp, i, level - 1); + if (error) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; + } } - } #endif - xfs_btree_copy_ptrs(cur, pp, cpp, numrecs); + xfs_btree_copy_ptrs(cur, pp, cpp, numrecs); + /* + * Decrement the (root) block's level after copying the + * pointers or else pp will be calculated using maxrecs + * for a regular block and won't point to the right place. + * Notice how we don't adjust nlevels until later. + */ + be16_add_cpu(&block->bb_level, -1); + } else { + /* + * Trickery here: The number of records we think we have + * changes when we convert a leaf to a node. Therefore, + * set the length to zero, change the level, and set + * the length to however many records we're getting. + */ + cur->bc_ops->iroot_realloc(cur, -xfs_btree_get_numrecs(block)); + block = xfs_btree_get_iroot(cur); + be16_add_cpu(&block->bb_level, -1); + cur->bc_ops->iroot_realloc(cur, numrecs); + block = xfs_btree_get_iroot(cur); + + rp = xfs_btree_rec_addr(cur, 1, block); + crp = xfs_btree_rec_addr(cur, 1, cblock); + xfs_btree_copy_recs(cur, rp, crp, numrecs); + } error = xfs_btree_free_block(cur, cbp); if (error) { @@ -3618,7 +3716,6 @@ xfs_btree_kill_iroot( } cur->bc_bufs[level - 1] = NULL; - be16_add_cpu(&block->bb_level, -1); xfs_trans_log_inode(cur->bc_tp, ip, XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork)); cur->bc_nlevels--; diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index ea15b1e..8918b81 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -284,6 +284,7 @@ typedef struct xfs_btree_cur #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ #define XFS_BTREE_CRC_BLOCKS (1<<3) /* uses extended btree blocks */ #define XFS_BTREE_OVERLAPPING (1<<4) /* overlapping intervals */ +#define XFS_BTREE_IROOT_RECORDS (1<<5) /* iroot can store records */ #define XFS_BTREE_NOERROR 0 From darrick.wong@oracle.com Thu Aug 25 18:43:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC1007FDD for ; Thu, 25 Aug 2016 18:43:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2FFD1AC002 for ; Thu, 25 Aug 2016 16:43:59 -0700 (PDT) X-ASG-Debug-ID: 1472168636-0bf81509b01dfa30001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id YE08eXwL6Ufw8ea6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:43:57 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNht6C026239 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:43:55 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNhsMA016832 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:43:55 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNhsiF017410; Thu, 25 Aug 2016 23:43:54 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:43:52 -0700 Subject: [PATCH 04/20] xfs: widen xfs_refcount_irec fields to handle realtime rmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/20] xfs: widen xfs_refcount_irec fields to handle realtime rmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:43:51 -0700 Message-ID: <147216863155.3688.8152957980694721928.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168636 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13064 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Change the startblock and blockcount fields of xfs_refcount_irec to be 64 bits wide. This enables us to use the same high level rmap code for either tree. We'll also collect all the resulting breakage fixes here. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_format.h | 4 ++- fs/xfs/libxfs/xfs_rmap.c | 58 ++++++++++++++++++++++---------------------- fs/xfs/libxfs/xfs_rmap.h | 20 ++++++++------- fs/xfs/xfs_trace.h | 38 ++++++++++++++--------------- 4 files changed, 60 insertions(+), 60 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 5703b57..62c19ce 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1436,8 +1436,8 @@ struct xfs_rmap_rec { XFS_RMAP_BMBT_BLOCK) #define XFS_RMAP_REC_FLAGS (XFS_RMAP_UNWRITTEN) struct xfs_rmap_irec { - xfs_agblock_t rm_startblock; /* extent start block */ - xfs_extlen_t rm_blockcount; /* extent length */ + xfs_fsblock_t rm_startblock; /* extent start block */ + xfs_filblks_t rm_blockcount; /* extent length */ __uint64_t rm_owner; /* extent owner */ __uint64_t rm_offset; /* offset within the owner */ unsigned int rm_flags; /* state flags */ diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index b22f93d..aa5052f 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -46,8 +46,8 @@ int xfs_rmap_lookup_le( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags, @@ -68,8 +68,8 @@ xfs_rmap_lookup_le( int xfs_rmap_lookup_eq( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags, @@ -115,8 +115,8 @@ xfs_rmap_update( int xfs_rmap_insert( struct xfs_btree_cur *rcur, - xfs_agblock_t agbno, - xfs_extlen_t len, + xfs_fsblock_t agbno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags) @@ -151,8 +151,8 @@ done: STATIC int xfs_rmap_delete( struct xfs_btree_cur *rcur, - xfs_agblock_t agbno, - xfs_extlen_t len, + xfs_fsblock_t agbno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags) @@ -252,7 +252,7 @@ xfs_rmap_find_left_neighbor_helper( int xfs_rmap_find_left_neighbor( struct xfs_btree_cur *cur, - xfs_agblock_t bno, + xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, @@ -330,7 +330,7 @@ xfs_rmap_lookup_le_range_helper( int xfs_rmap_lookup_le_range( struct xfs_btree_cur *cur, - xfs_agblock_t bno, + xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, @@ -387,8 +387,8 @@ xfs_rmap_lookup_le_range( STATIC int xfs_rmap_unmap( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -528,7 +528,7 @@ xfs_rmap_unmap( * Result: |rrrrr| |rrrr| * bno len */ - xfs_extlen_t orig_len = ltrec.rm_blockcount; + xfs_filblks_t orig_len = ltrec.rm_blockcount; ltrec.rm_blockcount = bno - ltrec.rm_startblock; error = xfs_rmap_update(cur, <rec); @@ -638,8 +638,8 @@ xfs_rmap_is_mergeable( STATIC int xfs_rmap_map( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -862,8 +862,8 @@ out_error: STATIC int xfs_rmap_convert( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -1287,8 +1287,8 @@ done: STATIC int xfs_rmap_convert_shared( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -1674,8 +1674,8 @@ done: STATIC int xfs_rmap_unmap_shared( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -1792,7 +1792,7 @@ xfs_rmap_unmap_shared( * Result: |rrrrr| |rrrr| * bno len */ - xfs_extlen_t orig_len = ltrec.rm_blockcount; + xfs_filblks_t orig_len = ltrec.rm_blockcount; /* Shrink the left side of the rmap */ error = xfs_rmap_lookup_eq(cur, ltrec.rm_startblock, @@ -1836,8 +1836,8 @@ out_error: STATIC int xfs_rmap_map_shared( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -2062,7 +2062,7 @@ xfs_rmap_finish_one( int error = 0; xfs_agnumber_t agno; struct xfs_owner_info oinfo; - xfs_agblock_t bno; + xfs_fsblock_t bno; bool unwritten; agno = XFS_FSB_TO_AGNO(mp, startblock); @@ -2251,8 +2251,8 @@ xfs_rmap_alloc_extent( struct xfs_mount *mp, struct xfs_defer_ops *dfops, xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, __uint64_t owner) { struct xfs_bmbt_irec bmap; @@ -2275,8 +2275,8 @@ xfs_rmap_free_extent( struct xfs_mount *mp, struct xfs_defer_ops *dfops, xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, __uint64_t owner) { struct xfs_bmbt_irec bmap; diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h index c5c5817..06f7e73 100644 --- a/fs/xfs/libxfs/xfs_rmap.h +++ b/fs/xfs/libxfs/xfs_rmap.h @@ -142,14 +142,14 @@ int xfs_rmap_free(struct xfs_trans *tp, struct xfs_buf *agbp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, struct xfs_owner_info *oinfo); -int xfs_rmap_lookup_le(struct xfs_btree_cur *cur, xfs_agblock_t bno, - xfs_extlen_t len, uint64_t owner, uint64_t offset, +int xfs_rmap_lookup_le(struct xfs_btree_cur *cur, xfs_fsblock_t bno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags, int *stat); -int xfs_rmap_lookup_eq(struct xfs_btree_cur *cur, xfs_agblock_t bno, - xfs_extlen_t len, uint64_t owner, uint64_t offset, +int xfs_rmap_lookup_eq(struct xfs_btree_cur *cur, xfs_fsblock_t bno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags, int *stat); -int xfs_rmap_insert(struct xfs_btree_cur *rcur, xfs_agblock_t agbno, - xfs_extlen_t len, uint64_t owner, uint64_t offset, +int xfs_rmap_insert(struct xfs_btree_cur *rcur, xfs_fsblock_t agbno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags); int xfs_rmap_get_rec(struct xfs_btree_cur *cur, struct xfs_rmap_irec *irec, int *stat); @@ -193,10 +193,10 @@ int xfs_rmap_convert_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, struct xfs_inode *ip, int whichfork, struct xfs_bmbt_irec *imap); int xfs_rmap_alloc_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, - xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, + xfs_agnumber_t agno, xfs_fsblock_t bno, xfs_filblks_t len, __uint64_t owner); int xfs_rmap_free_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, - xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, + xfs_agnumber_t agno, xfs_fsblock_t bno, xfs_filblks_t len, __uint64_t owner); void xfs_rmap_finish_one_cleanup(struct xfs_trans *tp, @@ -206,10 +206,10 @@ int xfs_rmap_finish_one(struct xfs_trans *tp, enum xfs_rmap_intent_type type, xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, struct xfs_btree_cur **pcur); -int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno, +int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, struct xfs_rmap_irec *irec, int *stat); -int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno, +int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, struct xfs_rmap_irec *irec, int *stat); union xfs_btree_rec; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 74963a1..8d916dd 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2430,14 +2430,14 @@ DEFINE_BMAP_FREE_DEFERRED_EVENT(xfs_bmap_free_deferred); /* rmap tracepoints */ DECLARE_EVENT_CLASS(xfs_rmap_class, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, - xfs_agblock_t agbno, xfs_extlen_t len, bool unwritten, + xfs_fsblock_t bno, xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo), - TP_ARGS(mp, agno, agbno, len, unwritten, oinfo), + TP_ARGS(mp, agno, bno, len, unwritten, oinfo), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) - __field(xfs_agblock_t, agbno) - __field(xfs_extlen_t, len) + __field(xfs_fsblock_t, bno) + __field(xfs_filblks_t, len) __field(uint64_t, owner) __field(uint64_t, offset) __field(unsigned long, flags) @@ -2445,7 +2445,7 @@ DECLARE_EVENT_CLASS(xfs_rmap_class, TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->agno = agno; - __entry->agbno = agbno; + __entry->bno = bno; __entry->len = len; __entry->owner = oinfo->oi_owner; __entry->offset = oinfo->oi_offset; @@ -2453,10 +2453,10 @@ DECLARE_EVENT_CLASS(xfs_rmap_class, if (unwritten) __entry->flags |= XFS_RMAP_UNWRITTEN; ), - TP_printk("dev %d:%d agno %u agbno %u len %u owner %lld offset %llu flags 0x%lx", + TP_printk("dev %d:%d agno %d bno %llu len %llu owner %lld offset %llu flags 0x%lx", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, - __entry->agbno, + __entry->bno, __entry->len, __entry->owner, __entry->offset, @@ -2465,9 +2465,9 @@ DECLARE_EVENT_CLASS(xfs_rmap_class, #define DEFINE_RMAP_EVENT(name) \ DEFINE_EVENT(xfs_rmap_class, name, \ TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ - xfs_agblock_t agbno, xfs_extlen_t len, bool unwritten, \ + xfs_fsblock_t bno, xfs_filblks_t len, bool unwritten, \ struct xfs_owner_info *oinfo), \ - TP_ARGS(mp, agno, agbno, len, unwritten, oinfo)) + TP_ARGS(mp, agno, bno, len, unwritten, oinfo)) /* simple AG-based error/%ip tracepoint class */ DECLARE_EVENT_CLASS(xfs_ag_error_class, @@ -2486,7 +2486,7 @@ DECLARE_EVENT_CLASS(xfs_ag_error_class, __entry->error = error; __entry->caller_ip = caller_ip; ), - TP_printk("dev %d:%d agno %u error %d caller %ps", + TP_printk("dev %d:%d agno %d error %d caller %ps", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, __entry->error, @@ -2512,14 +2512,14 @@ DEFINE_AG_ERROR_EVENT(xfs_rmap_convert_state); DECLARE_EVENT_CLASS(xfs_rmapbt_class, TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, - xfs_agblock_t agbno, xfs_extlen_t len, + xfs_fsblock_t bno, xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags), - TP_ARGS(mp, agno, agbno, len, owner, offset, flags), + TP_ARGS(mp, agno, bno, len, owner, offset, flags), TP_STRUCT__entry( __field(dev_t, dev) __field(xfs_agnumber_t, agno) - __field(xfs_agblock_t, agbno) - __field(xfs_extlen_t, len) + __field(xfs_fsblock_t, bno) + __field(xfs_filblks_t, len) __field(uint64_t, owner) __field(uint64_t, offset) __field(unsigned int, flags) @@ -2527,16 +2527,16 @@ DECLARE_EVENT_CLASS(xfs_rmapbt_class, TP_fast_assign( __entry->dev = mp->m_super->s_dev; __entry->agno = agno; - __entry->agbno = agbno; + __entry->bno = bno; __entry->len = len; __entry->owner = owner; __entry->offset = offset; __entry->flags = flags; ), - TP_printk("dev %d:%d agno %u agbno %u len %u owner %lld offset %llu flags 0x%x", + TP_printk("dev %d:%d agno %d bno %llu len %llu owner %lld offset %llu flags 0x%x", MAJOR(__entry->dev), MINOR(__entry->dev), __entry->agno, - __entry->agbno, + __entry->bno, __entry->len, __entry->owner, __entry->offset, @@ -2545,9 +2545,9 @@ DECLARE_EVENT_CLASS(xfs_rmapbt_class, #define DEFINE_RMAPBT_EVENT(name) \ DEFINE_EVENT(xfs_rmapbt_class, name, \ TP_PROTO(struct xfs_mount *mp, xfs_agnumber_t agno, \ - xfs_agblock_t agbno, xfs_extlen_t len, \ + xfs_fsblock_t bno, xfs_filblks_t len, \ uint64_t owner, uint64_t offset, unsigned int flags), \ - TP_ARGS(mp, agno, agbno, len, owner, offset, flags)) + TP_ARGS(mp, agno, bno, len, owner, offset, flags)) #define DEFINE_RMAP_DEFERRED_EVENT DEFINE_MAP_EXTENT_DEFERRED_EVENT DEFINE_RMAP_DEFERRED_EVENT(xfs_rmap_defer); From darrick.wong@oracle.com Thu Aug 25 18:44:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0691E7FF3 for ; Thu, 25 Aug 2016 18:44:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BF5AF304039 for ; Thu, 25 Aug 2016 16:44:04 -0700 (PDT) X-ASG-Debug-ID: 1472168642-0bf57c55b31c7be0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id N666CBcWtwRBB5Uo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:03 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNi1Co019758 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:01 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNi0V9028608 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:00 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNi02w017420; Thu, 25 Aug 2016 23:44:00 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:00 -0700 Subject: [PATCH 05/20] xfs: introduce realtime rmap btree definitions From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/20] xfs: introduce realtime rmap btree definitions To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:43:58 -0700 Message-ID: <147216863876.3688.12339433041300368229.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168642 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3521 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add new realtime rmap btree definitions. The realtime rmap btree will be rooted from a hidden inode, but has its own shape and therefore needs to have most of its own separate types. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_btree.c | 4 ++-- fs/xfs/libxfs/xfs_btree.h | 3 +++ fs/xfs/libxfs/xfs_format.h | 7 +++++++ fs/xfs/libxfs/xfs_types.h | 3 ++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index e89b1d3..d5beaf7 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -45,10 +45,10 @@ kmem_zone_t *xfs_btree_cur_zone; */ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, 0, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, - XFS_FIBT_MAGIC, 0 }, + XFS_FIBT_MAGIC, 0, 0 }, { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, XFS_RMAP_CRC_MAGIC, XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC, - XFS_REFC_CRC_MAGIC } + XFS_REFC_CRC_MAGIC, XFS_RTRMAP_CRC_MAGIC } }; #define xfs_btree_magic(cur) \ xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 8918b81..8913ffa 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -75,6 +75,7 @@ union xfs_btree_rec { #define XFS_BTNUM_FINO ((xfs_btnum_t)XFS_BTNUM_FINOi) #define XFS_BTNUM_RMAP ((xfs_btnum_t)XFS_BTNUM_RMAPi) #define XFS_BTNUM_REFC ((xfs_btnum_t)XFS_BTNUM_REFCi) +#define XFS_BTNUM_RTRMAP ((xfs_btnum_t)XFS_BTNUM_RTRMAPi) /* * For logging record fields. @@ -107,6 +108,7 @@ do { \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_INC(__mp, bmbt, stat); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(__mp, ibt, stat); break; \ case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(__mp, fibt, stat); break; \ + case XFS_BTNUM_RTRMAP: /* pass-through */ \ case XFS_BTNUM_RMAP: __XFS_BTREE_STATS_INC(__mp, rmap, stat); break; \ case XFS_BTNUM_REFC: __XFS_BTREE_STATS_INC(__mp, refcbt, stat); break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ @@ -129,6 +131,7 @@ do { \ __XFS_BTREE_STATS_ADD(__mp, ibt, stat, val); break; \ case XFS_BTNUM_FINO: \ __XFS_BTREE_STATS_ADD(__mp, fibt, stat, val); break; \ + case XFS_BTNUM_RTRMAP: /* pass-through */ \ case XFS_BTNUM_RMAP: \ __XFS_BTREE_STATS_ADD(__mp, rmap, stat, val); break; \ case XFS_BTNUM_REFC: \ diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 62c19ce..6afaee2 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1463,6 +1463,13 @@ typedef __be32 xfs_rmap_ptr_t; XFS_IBT_BLOCK(mp) + 1) /* + * Realtime Reverse mapping btree format definitions + * + * There is a btree for the reverse map per allocation group + */ +#define XFS_RTRMAP_CRC_MAGIC 0x4d415052 /* 'MAPR' */ + +/* * Reference Count Btree format definitions * */ diff --git a/fs/xfs/libxfs/xfs_types.h b/fs/xfs/libxfs/xfs_types.h index cf044c0..749aa83 100644 --- a/fs/xfs/libxfs/xfs_types.h +++ b/fs/xfs/libxfs/xfs_types.h @@ -113,7 +113,8 @@ typedef enum { typedef enum { XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_RMAPi, XFS_BTNUM_BMAPi, - XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_REFCi, XFS_BTNUM_MAX + XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_REFCi, XFS_BTNUM_RTRMAPi, + XFS_BTNUM_MAX } xfs_btnum_t; struct xfs_name { From darrick.wong@oracle.com Thu Aug 25 18:44:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 05A358002 for ; Thu, 25 Aug 2016 18:44:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60750AC001 for ; Thu, 25 Aug 2016 16:44:12 -0700 (PDT) X-ASG-Debug-ID: 1472168649-0bf57c55b41c7bf0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id ngXTS9nO2opjQr6a (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:09 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNi7EK026515 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:08 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNi78Y000950 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:07 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNi6xH032057; Thu, 25 Aug 2016 23:44:07 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:06 -0700 Subject: [PATCH 06/20] xfs: define the on-disk realtime rmap btree format From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/20] xfs: define the on-disk realtime rmap btree format To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:44:05 -0700 Message-ID: <147216864494.3688.5284749439377992177.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168649 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16583 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Start filling out the rtrmap btree implementation. Start with the on-disk btree format; add everything needed to read, write and manipulate rmap btree blocks. This prepares the way for connecting the btree operations implementation. Signed-off-by: Darrick J. Wong --- fs/xfs/Makefile | 1 fs/xfs/libxfs/xfs_btree.c | 1 fs/xfs/libxfs/xfs_btree.h | 3 + fs/xfs/libxfs/xfs_format.h | 48 +++++++++ fs/xfs/libxfs/xfs_rtrmap_btree.c | 197 ++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rtrmap_btree.h | 62 ++++++++++++ fs/xfs/libxfs/xfs_sb.c | 6 + fs/xfs/libxfs/xfs_shared.h | 1 fs/xfs/xfs_mount.c | 2 fs/xfs/xfs_mount.h | 3 + fs/xfs/xfs_ondisk.h | 2 11 files changed, 326 insertions(+) create mode 100644 fs/xfs/libxfs/xfs_rtrmap_btree.c create mode 100644 fs/xfs/libxfs/xfs_rtrmap_btree.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index a903bd3..9e6aabf 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -55,6 +55,7 @@ xfs-y += $(addprefix libxfs/, \ xfs_ag_resv.o \ xfs_rmap.o \ xfs_rmap_btree.o \ + xfs_rtrmap_btree.o \ xfs_refcount.o \ xfs_refcount_btree.o \ xfs_sb.o \ diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index d5beaf7..9f2b457 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -1220,6 +1220,7 @@ xfs_btree_set_refs( xfs_buf_set_ref(bp, XFS_BMAP_BTREE_REF); break; case XFS_BTNUM_RMAP: + case XFS_BTNUM_RTRMAP: xfs_buf_set_ref(bp, XFS_RMAP_BTREE_REF); break; case XFS_BTNUM_REFC: diff --git a/fs/xfs/libxfs/xfs_btree.h b/fs/xfs/libxfs/xfs_btree.h index 8913ffa..a9936ac 100644 --- a/fs/xfs/libxfs/xfs_btree.h +++ b/fs/xfs/libxfs/xfs_btree.h @@ -50,6 +50,8 @@ union xfs_btree_key { struct xfs_rmap_key rmap; struct xfs_rmap_key __rmap_bigkey[2]; struct xfs_refcount_key refc; + struct xfs_rtrmap_key rtrmap; + struct xfs_rtrmap_key __rtrmap_bigkey[2]; }; union xfs_btree_rec { @@ -59,6 +61,7 @@ union xfs_btree_rec { struct xfs_inobt_rec inobt; struct xfs_rmap_rec rmap; struct xfs_refcount_rec refc; + struct xfs_rtrmap_rec rtrmap; }; /* diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 6afaee2..7f30781 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1470,6 +1470,54 @@ typedef __be32 xfs_rmap_ptr_t; #define XFS_RTRMAP_CRC_MAGIC 0x4d415052 /* 'MAPR' */ /* + * Data record structure + */ +struct xfs_rtrmap_rec { + __be64 rm_startblock; /* extent start block */ + __be64 rm_blockcount; /* extent length */ + __be64 rm_owner; /* extent owner */ + __be64 rm_offset; /* offset within the owner */ +}; + +/* rm_offset has the same values as the regular rmapbt. */ +#define XFS_RTRMAP_OFF_ATTR_FORK XFS_RMAP_OFF_ATTR_FORK +#define XFS_RTRMAP_OFF_BMBT_BLOCK XFS_RMAP_OFF_BMBT_BLOCK +#define XFS_RTRMAP_OFF_UNWRITTEN XFS_RMAP_OFF_UNWRITTEN + +#define XFS_RTRMAP_LEN_MAX ((__uint64_t)~0U) +#define XFS_RTRMAP_OFF_FLAGS XFS_RMAP_OFF_FLAGS +#define XFS_RTRMAP_OFF_MASK XFS_RMAP_OFF_MASK + +#define XFS_RTRMAP_OFF XFS_RMAP_OFF + +#define XFS_RTRMAP_IS_BMBT_BLOCK(off) XFS_RMAP_IS_BMBT_BLOCK +#define XFS_RTRMAP_IS_ATTR_FORK(off) XFS_RMAP_IS_ATTR_FORK +#define XFS_RTRMAP_IS_UNWRITTEN(len) XFS_RMAP_IS_UNWRITTEN + +#define RTRMAPBT_STARTBLOCK_BITLEN 64 +#define RTRMAPBT_BLOCKCOUNT_BITLEN 64 +#define RTRMAPBT_OWNER_BITLEN RMAPBT_OWNER_BITLEN +#define RTRMAPBT_ATTRFLAG_BITLEN RMAPBT_ATTRFLAG_BITLEN +#define RTRMAPBT_BMBTFLAG_BITLEN RMAPBT_BMBTFLAG_BITLEN +#define RTRMAPBT_EXNTFLAG_BITLEN RMAPBT_EXNTFLAG_BITLEN +#define RTRMAPBT_UNUSED_OFFSET_BITLEN RMAPBT_UNUSED_OFFSET_BITLEN +#define RTRMAPBT_OFFSET_BITLEN RMAPBT_OFFSET_BITLEN + +/* + * Key structure + * + * We don't use the length for lookups + */ +struct xfs_rtrmap_key { + __be64 rm_startblock; /* extent start block */ + __be64 rm_owner; /* extent owner */ + __be64 rm_offset; /* offset within the owner */ +} __attribute__((packed)); + +/* btree pointer type */ +typedef __be64 xfs_rtrmap_ptr_t; + +/* * Reference Count Btree format definitions * */ diff --git a/fs/xfs/libxfs/xfs_rtrmap_btree.c b/fs/xfs/libxfs/xfs_rtrmap_btree.c new file mode 100644 index 0000000..5008906 --- /dev/null +++ b/fs/xfs/libxfs/xfs_rtrmap_btree.c @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_bit.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_inode.h" +#include "xfs_trans.h" +#include "xfs_alloc.h" +#include "xfs_btree.h" +#include "xfs_rtrmap_btree.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_error.h" +#include "xfs_extent_busy.h" +#include "xfs_ag_resv.h" + +/* + * Realtime Reverse map btree. + * + * This is a per-ag tree used to track the owner(s) of a given extent + * in the realtime device. See the comments in xfs_rmap_btree.c for + * more information. + * + * This tree is basically the same as the regular rmap btree except that + * it doesn't live in free space, and the startblock and blockcount + * fields have been widened to 64 bits. + */ + +static struct xfs_btree_cur * +xfs_rtrmapbt_dup_cursor( + struct xfs_btree_cur *cur) +{ + struct xfs_btree_cur *new; + + new = xfs_rtrmapbt_init_cursor(cur->bc_mp, cur->bc_tp, + cur->bc_private.b.ip); + + /* + * Copy the firstblock, dfops, and flags values, + * since init cursor doesn't get them. + */ + new->bc_private.b.firstblock = cur->bc_private.b.firstblock; + new->bc_private.b.dfops = cur->bc_private.b.dfops; + new->bc_private.b.flags = cur->bc_private.b.flags; + + return new; +} + +static bool +xfs_rtrmapbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + int level; + + if (block->bb_magic != cpu_to_be32(XFS_RTRMAP_CRC_MAGIC)) + return false; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return false; + if (!xfs_btree_lblock_v5hdr_verify(bp, XFS_RMAP_OWN_UNKNOWN)) + return false; + level = be16_to_cpu(block->bb_level); + if (level > mp->m_rtrmap_maxlevels) + return false; + + return xfs_btree_lblock_verify(bp, mp->m_rtrmap_mxr[level != 0]); +} + +static void +xfs_rtrmapbt_read_verify( + struct xfs_buf *bp) +{ + if (!xfs_btree_lblock_verify_crc(bp)) + xfs_buf_ioerror(bp, -EFSBADCRC); + else if (!xfs_rtrmapbt_verify(bp)) + xfs_buf_ioerror(bp, -EFSCORRUPTED); + + if (bp->b_error) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_verifier_error(bp); + } +} + +static void +xfs_rtrmapbt_write_verify( + struct xfs_buf *bp) +{ + if (!xfs_rtrmapbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_buf_ioerror(bp, -EFSCORRUPTED); + xfs_verifier_error(bp); + return; + } + xfs_btree_lblock_calc_crc(bp); + +} + +const struct xfs_buf_ops xfs_rtrmapbt_buf_ops = { + .name = "xfs_rtrmapbt", + .verify_read = xfs_rtrmapbt_read_verify, + .verify_write = xfs_rtrmapbt_write_verify, +}; + +static const struct xfs_btree_ops xfs_rtrmapbt_ops = { + .rec_len = sizeof(struct xfs_rtrmap_rec), + .key_len = 2 * sizeof(struct xfs_rtrmap_key), + + .dup_cursor = xfs_rtrmapbt_dup_cursor, + .buf_ops = &xfs_rtrmapbt_buf_ops, +}; + +/* + * Allocate a new allocation btree cursor. + */ +struct xfs_btree_cur * +xfs_rtrmapbt_init_cursor( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_inode *ip) +{ + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + struct xfs_btree_cur *cur; + + cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_NOFS); + cur->bc_tp = tp; + cur->bc_mp = mp; + cur->bc_btnum = XFS_BTNUM_RTRMAP; + cur->bc_flags = XFS_BTREE_LONG_PTRS | XFS_BTREE_ROOT_IN_INODE | + XFS_BTREE_CRC_BLOCKS | XFS_BTREE_IROOT_RECORDS | + XFS_BTREE_OVERLAPPING; + cur->bc_blocklog = mp->m_sb.sb_blocklog; + cur->bc_ops = &xfs_rtrmapbt_ops; + cur->bc_nlevels = be16_to_cpu(ifp->if_broot->bb_level) + 1; + + cur->bc_private.b.forksize = XFS_IFORK_SIZE(ip, XFS_DATA_FORK); + cur->bc_private.b.ip = ip; + cur->bc_private.b.firstblock = NULLFSBLOCK; + cur->bc_private.b.dfops = NULL; + cur->bc_private.b.allocated = 0; + cur->bc_private.b.flags = 0; + cur->bc_private.b.whichfork = XFS_DATA_FORK; + + return cur; +} + +/* + * Calculate number of records in an rmap btree block. + */ +int +xfs_rtrmapbt_maxrecs( + struct xfs_mount *mp, + int blocklen, + bool leaf) +{ + blocklen -= XFS_RTRMAP_BLOCK_LEN; + + if (leaf) + return blocklen / sizeof(struct xfs_rtrmap_rec); + return blocklen / + (2 * sizeof(struct xfs_rtrmap_key) + sizeof(xfs_rtrmap_ptr_t)); +} + +/* Compute the maximum height of an rmap btree. */ +void +xfs_rtrmapbt_compute_maxlevels( + struct xfs_mount *mp) +{ + mp->m_rtrmap_maxlevels = xfs_btree_compute_maxlevels(mp, + mp->m_rtrmap_mnr, mp->m_sb.sb_rblocks); + ASSERT(mp->m_rtrmap_maxlevels <= XFS_BTREE_MAXLEVELS); +} diff --git a/fs/xfs/libxfs/xfs_rtrmap_btree.h b/fs/xfs/libxfs/xfs_rtrmap_btree.h new file mode 100644 index 0000000..5eb19f4 --- /dev/null +++ b/fs/xfs/libxfs/xfs_rtrmap_btree.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_RTRMAP_BTREE_H__ +#define __XFS_RTRMAP_BTREE_H__ + +struct xfs_buf; +struct xfs_btree_cur; +struct xfs_mount; + +/* rmaps only exist on crc enabled filesystems */ +#define XFS_RTRMAP_BLOCK_LEN XFS_BTREE_LBLOCK_CRC_LEN + +/* + * Record, key, and pointer address macros for btree blocks. + * + * (note that some of these may appear unused, but they are used in userspace) + */ +#define XFS_RTRMAP_REC_ADDR(block, index) \ + ((struct xfs_rtrmap_rec *) \ + ((char *)(block) + XFS_RTRMAP_BLOCK_LEN + \ + (((index) - 1) * sizeof(struct xfs_rtrmap_rec)))) + +#define XFS_RTRMAP_KEY_ADDR(block, index) \ + ((struct xfs_rtrmap_key *) \ + ((char *)(block) + XFS_RTRMAP_BLOCK_LEN + \ + ((index) - 1) * 2 * sizeof(struct xfs_rtrmap_key))) + +#define XFS_RTRMAP_HIGH_KEY_ADDR(block, index) \ + ((struct xfs_rtrmap_key *) \ + ((char *)(block) + XFS_RTRMAP_BLOCK_LEN + \ + sizeof(struct xfs_rtrmap_key) + \ + ((index) - 1) * 2 * sizeof(struct xfs_rtrmap_key))) + +#define XFS_RTRMAP_PTR_ADDR(block, index, maxrecs) \ + ((xfs_rtrmap_ptr_t *) \ + ((char *)(block) + XFS_RTRMAP_BLOCK_LEN + \ + (maxrecs) * 2 * sizeof(struct xfs_rtrmap_key) + \ + ((index) - 1) * sizeof(xfs_rtrmap_ptr_t))) + +struct xfs_btree_cur *xfs_rtrmapbt_init_cursor(struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_inode *ip); +int xfs_rtrmapbt_maxrecs(struct xfs_mount *mp, int blocklen, bool leaf); +extern void xfs_rtrmapbt_compute_maxlevels(struct xfs_mount *mp); + +#endif /* __XFS_RTRMAP_BTREE_H__ */ diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index a937071..eb33ec9 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -40,6 +40,7 @@ #include "xfs_rmap_btree.h" #include "xfs_bmap.h" #include "xfs_refcount_btree.h" +#include "xfs_rtrmap_btree.h" /* * Physical superblock buffer manipulations. Shared with libxfs in userspace. @@ -742,6 +743,11 @@ xfs_sb_mount_common( mp->m_rmap_mnr[0] = mp->m_rmap_mxr[0] / 2; mp->m_rmap_mnr[1] = mp->m_rmap_mxr[1] / 2; + mp->m_rtrmap_mxr[0] = xfs_rtrmapbt_maxrecs(mp, sbp->sb_blocksize, 1); + mp->m_rtrmap_mxr[1] = xfs_rtrmapbt_maxrecs(mp, sbp->sb_blocksize, 0); + mp->m_rtrmap_mnr[0] = mp->m_rtrmap_mxr[0] / 2; + mp->m_rtrmap_mnr[1] = mp->m_rtrmap_mxr[1] / 2; + mp->m_refc_mxr[0] = xfs_refcountbt_maxrecs(mp, sbp->sb_blocksize, true); mp->m_refc_mxr[1] = xfs_refcountbt_maxrecs(mp, sbp->sb_blocksize, diff --git a/fs/xfs/libxfs/xfs_shared.h b/fs/xfs/libxfs/xfs_shared.h index c6f4eb4..0032a8c 100644 --- a/fs/xfs/libxfs/xfs_shared.h +++ b/fs/xfs/libxfs/xfs_shared.h @@ -39,6 +39,7 @@ extern const struct xfs_buf_ops xfs_agf_buf_ops; extern const struct xfs_buf_ops xfs_agfl_buf_ops; extern const struct xfs_buf_ops xfs_allocbt_buf_ops; extern const struct xfs_buf_ops xfs_rmapbt_buf_ops; +extern const struct xfs_buf_ops xfs_rtrmapbt_buf_ops; extern const struct xfs_buf_ops xfs_refcountbt_buf_ops; extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 039b5be..2af9b2a 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -46,6 +46,7 @@ #include "xfs_refcount_btree.h" #include "xfs_reflink.h" #include "xfs_refcount_btree.h" +#include "xfs_rtrmap_btree.h" static DEFINE_MUTEX(xfs_uuid_table_mutex); @@ -687,6 +688,7 @@ xfs_mountfs( xfs_bmap_compute_maxlevels(mp, XFS_ATTR_FORK); xfs_ialloc_compute_maxlevels(mp); xfs_rmapbt_compute_maxlevels(mp); + xfs_rtrmapbt_compute_maxlevels(mp); xfs_refcountbt_compute_maxlevels(mp); xfs_set_maxicount(mp); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b896ea5..70d3cc3 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -118,12 +118,15 @@ typedef struct xfs_mount { uint m_inobt_mnr[2]; /* min inobt btree records */ uint m_rmap_mxr[2]; /* max rmap btree records */ uint m_rmap_mnr[2]; /* min rmap btree records */ + uint m_rtrmap_mxr[2]; /* max rtrmap btree records */ + uint m_rtrmap_mnr[2]; /* min rtrmap btree records */ uint m_refc_mxr[2]; /* max refc btree records */ uint m_refc_mnr[2]; /* min refc btree records */ uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* max inobt btree levels. */ uint m_rmap_maxlevels; /* max rmap btree levels */ + uint m_rtrmap_maxlevels; /* max rtrmap btree level */ uint m_refc_maxlevels; /* max refcount btree level */ xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ uint m_alloc_set_aside; /* space we can't use */ diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h index 0c381d7..88c771e 100644 --- a/fs/xfs/xfs_ondisk.h +++ b/fs/xfs/xfs_ondisk.h @@ -53,6 +53,8 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(struct xfs_refcount_rec, 12); XFS_CHECK_STRUCT_SIZE(struct xfs_rmap_key, 20); XFS_CHECK_STRUCT_SIZE(struct xfs_rmap_rec, 24); + XFS_CHECK_STRUCT_SIZE(struct xfs_rtrmap_key, 24); + XFS_CHECK_STRUCT_SIZE(struct xfs_rtrmap_rec, 32); XFS_CHECK_STRUCT_SIZE(struct xfs_timestamp, 8); XFS_CHECK_STRUCT_SIZE(xfs_alloc_key_t, 8); XFS_CHECK_STRUCT_SIZE(xfs_alloc_ptr_t, 4); From darrick.wong@oracle.com Thu Aug 25 18:44:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A11CC800F for ; Thu, 25 Aug 2016 18:44:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7433F8F8035 for ; Thu, 25 Aug 2016 16:44:17 -0700 (PDT) X-ASG-Debug-ID: 1472168655-0bf57b5314209780001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id S73msUDKHEYniwI6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:15 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNiE31020102 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:14 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNiE2D017286 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:14 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNiDET032105; Thu, 25 Aug 2016 23:44:13 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:12 -0700 Subject: [PATCH 07/20] xfs: realtime rmap btree transaction reservations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/20] xfs: realtime rmap btree transaction reservations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:44:11 -0700 Message-ID: <147216865128.3688.1537361834919049399.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168655 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1028 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make sure that there's enough log reservation to handle mapping and unmapping realtime extents. We have to reserve enough space to handle a split in the rtrmapbt to add the record and a second split in the regular rmapbt to record the rtrmapbt split. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_trans_resv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c index b456cca..f9771b7 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.c +++ b/fs/xfs/libxfs/xfs_trans_resv.c @@ -83,7 +83,8 @@ xfs_allocfree_log_count( blocks = num_ops * 2 * (2 * mp->m_ag_maxlevels - 1); if (xfs_sb_version_hasrmapbt(&mp->m_sb)) - blocks += num_ops * (2 * mp->m_rmap_maxlevels - 1); + blocks += max(num_ops * (2 * mp->m_rmap_maxlevels - 1), + num_ops * (2 * mp->m_rtrmap_maxlevels - 1)); if (xfs_sb_version_hasreflink(&mp->m_sb)) blocks += num_ops * (2 * mp->m_refc_maxlevels - 1); From darrick.wong@oracle.com Thu Aug 25 18:44:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AFC8A800A for ; Thu, 25 Aug 2016 18:44:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 420CA304039 for ; Thu, 25 Aug 2016 16:44:24 -0700 (PDT) X-ASG-Debug-ID: 1472168661-0bf8155c771e7b60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id xiVitHDlQaQ6CutF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:21 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNiKSR020158 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:20 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNiJ7D017385 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:20 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNiJG4020123; Thu, 25 Aug 2016 23:44:19 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:18 -0700 Subject: [PATCH 08/20] xfs: add realtime rmap btree operations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/20] xfs: add realtime rmap btree operations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:44:17 -0700 Message-ID: <147216865744.3688.6696041635091824750.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168661 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10025 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Implement the generic btree operations needed to manipulate rtrmap btree blocks. This is different from the regular rmapbt in that we allocate space from the filesystem at large, and are neither constrained to the free space nor any particular AG. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rtrmap_btree.c | 319 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) diff --git a/fs/xfs/libxfs/xfs_rtrmap_btree.c b/fs/xfs/libxfs/xfs_rtrmap_btree.c index 5008906..71f954a 100644 --- a/fs/xfs/libxfs/xfs_rtrmap_btree.c +++ b/fs/xfs/libxfs/xfs_rtrmap_btree.c @@ -31,12 +31,14 @@ #include "xfs_trans.h" #include "xfs_alloc.h" #include "xfs_btree.h" +#include "xfs_rmap.h" #include "xfs_rtrmap_btree.h" #include "xfs_trace.h" #include "xfs_cksum.h" #include "xfs_error.h" #include "xfs_extent_busy.h" #include "xfs_ag_resv.h" +#include "xfs_bmap.h" /* * Realtime Reverse map btree. @@ -70,6 +72,275 @@ xfs_rtrmapbt_dup_cursor( return new; } +STATIC int +xfs_rtrmapbt_alloc_block( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *start, + union xfs_btree_ptr *new, + int *stat) +{ + struct xfs_alloc_arg args; + int error; + + memset(&args, 0, sizeof(args)); + args.tp = cur->bc_tp; + args.mp = cur->bc_mp; + args.fsbno = cur->bc_private.b.firstblock; + args.firstblock = args.fsbno; + xfs_rmap_ino_bmbt_owner(&args.oinfo, cur->bc_private.b.ip->i_ino, + cur->bc_private.b.whichfork); + + if (args.fsbno == NULLFSBLOCK) { + args.fsbno = be64_to_cpu(start->l); + args.type = XFS_ALLOCTYPE_START_BNO; + /* + * Make sure there is sufficient room left in the AG to + * complete a full tree split for an extent insert. If + * we are converting the middle part of an extent then + * we may need space for two tree splits. + * + * We are relying on the caller to make the correct block + * reservation for this operation to succeed. If the + * reservation amount is insufficient then we may fail a + * block allocation here and corrupt the filesystem. + */ + args.minleft = args.tp->t_blk_res; + } else if (cur->bc_private.b.dfops->dop_low) { + args.type = XFS_ALLOCTYPE_START_BNO; + } else { + args.type = XFS_ALLOCTYPE_NEAR_BNO; + } + + args.minlen = args.maxlen = args.prod = 1; + args.wasdel = 0; + error = xfs_alloc_vextent(&args); + if (error) + goto error0; + + if (args.fsbno == NULLFSBLOCK && args.minleft) { + /* + * Could not find an AG with enough free space to satisfy + * a full btree split. Try again without minleft and if + * successful activate the lowspace algorithm. + */ + args.fsbno = 0; + args.type = XFS_ALLOCTYPE_FIRST_AG; + args.minleft = 0; + error = xfs_alloc_vextent(&args); + if (error) + goto error0; + cur->bc_private.b.dfops->dop_low = true; + } + if (args.fsbno == NULLFSBLOCK) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 0; + return 0; + } + ASSERT(args.len == 1); + cur->bc_private.b.firstblock = args.fsbno; + cur->bc_private.b.allocated++; + cur->bc_private.b.ip->i_d.di_nblocks++; + xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE); + + new->l = cpu_to_be64(args.fsbno); + + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 1; + return 0; + + error0: + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; +} + +STATIC int +xfs_rtrmapbt_free_block( + struct xfs_btree_cur *cur, + struct xfs_buf *bp) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_inode *ip = cur->bc_private.b.ip; + struct xfs_trans *tp = cur->bc_tp; + xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); + struct xfs_owner_info oinfo; + + xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, cur->bc_private.b.whichfork); + xfs_bmap_add_free(mp, cur->bc_private.b.dfops, fsbno, 1, &oinfo); + ip->i_d.di_nblocks--; + + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + return 0; +} + +/* + * Calculate number of records in the in-core realtime rmap btree inode root. + */ +STATIC int +xfs_rtrmapbt_broot_maxrecs( + int blocklen, + bool leaf) +{ + blocklen -= XFS_RTRMAP_BLOCK_LEN; + + if (leaf) + return blocklen / sizeof(struct xfs_rtrmap_rec); + return blocklen / (2 * sizeof(struct xfs_rtrmap_key) + + sizeof(xfs_rtrmap_ptr_t)); +} + +STATIC int +xfs_rtrmapbt_get_minrecs( + struct xfs_btree_cur *cur, + int level) +{ + struct xfs_ifork *ifp; + + if (level == cur->bc_nlevels - 1) { + ifp = XFS_IFORK_PTR(cur->bc_private.b.ip, + cur->bc_private.b.whichfork); + + return xfs_rtrmapbt_broot_maxrecs(ifp->if_broot_bytes, + level == 0) / 2; + } + + return cur->bc_mp->m_rtrmap_mnr[level != 0]; +} + +STATIC int +xfs_rtrmapbt_get_maxrecs( + struct xfs_btree_cur *cur, + int level) +{ + struct xfs_ifork *ifp; + + if (level == cur->bc_nlevels - 1) { + ifp = XFS_IFORK_PTR(cur->bc_private.b.ip, + cur->bc_private.b.whichfork); + + return xfs_rtrmapbt_broot_maxrecs(ifp->if_broot_bytes, + level == 0); + } + + return cur->bc_mp->m_rtrmap_mxr[level != 0]; +} + +STATIC void +xfs_rtrmapbt_init_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + key->rtrmap.rm_startblock = rec->rtrmap.rm_startblock; + key->rtrmap.rm_owner = rec->rtrmap.rm_owner; + key->rtrmap.rm_offset = rec->rtrmap.rm_offset; +} + +STATIC void +xfs_rtrmapbt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + __uint64_t off; + int adj; + + adj = be64_to_cpu(rec->rtrmap.rm_blockcount) - 1; + + key->rtrmap.rm_startblock = rec->rtrmap.rm_startblock; + be64_add_cpu(&key->rtrmap.rm_startblock, adj); + key->rtrmap.rm_owner = rec->rtrmap.rm_owner; + key->rtrmap.rm_offset = rec->rtrmap.rm_offset; + if (XFS_RMAP_NON_INODE_OWNER(be64_to_cpu(rec->rtrmap.rm_owner)) || + XFS_RMAP_IS_BMBT_BLOCK(be64_to_cpu(rec->rtrmap.rm_offset))) + return; + off = be64_to_cpu(key->rtrmap.rm_offset); + off = (XFS_RMAP_OFF(off) + adj) | (off & ~XFS_RMAP_OFF_MASK); + key->rtrmap.rm_offset = cpu_to_be64(off); +} + +STATIC void +xfs_rtrmapbt_init_rec_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec) +{ + rec->rtrmap.rm_startblock = cpu_to_be64(cur->bc_rec.r.rm_startblock); + rec->rtrmap.rm_blockcount = cpu_to_be64(cur->bc_rec.r.rm_blockcount); + rec->rtrmap.rm_owner = cpu_to_be64(cur->bc_rec.r.rm_owner); + rec->rtrmap.rm_offset = cpu_to_be64( + xfs_rmap_irec_offset_pack(&cur->bc_rec.r)); +} + +STATIC void +xfs_rtrmapbt_init_ptr_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + ptr->l = 0; +} + +STATIC __int64_t +xfs_rtrmapbt_key_diff( + struct xfs_btree_cur *cur, + union xfs_btree_key *key) +{ + struct xfs_rmap_irec *rec = &cur->bc_rec.r; + struct xfs_rtrmap_key *kp = &key->rtrmap; + __u64 x, y; + + x = be64_to_cpu(kp->rm_startblock); + y = rec->rm_startblock; + if (x > y) + return 1; + else if (y > x) + return -1; + + x = be64_to_cpu(kp->rm_owner); + y = rec->rm_owner; + if (x > y) + return 1; + else if (y > x) + return -1; + + x = XFS_RMAP_OFF(be64_to_cpu(kp->rm_offset)); + y = rec->rm_offset; + if (x > y) + return 1; + else if (y > x) + return -1; + return 0; +} + +STATIC __int64_t +xfs_rtrmapbt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + struct xfs_rtrmap_key *kp1 = &k1->rtrmap; + struct xfs_rtrmap_key *kp2 = &k2->rtrmap; + __u64 x, y; + + x = be64_to_cpu(kp1->rm_startblock); + y = be64_to_cpu(kp2->rm_startblock); + if (x > y) + return 1; + else if (y > x) + return -1; + + x = be64_to_cpu(kp1->rm_owner); + y = be64_to_cpu(kp2->rm_owner); + if (x > y) + return 1; + else if (y > x) + return -1; + + x = XFS_RMAP_OFF(be64_to_cpu(kp1->rm_offset)); + y = XFS_RMAP_OFF(be64_to_cpu(kp2->rm_offset)); + if (x > y) + return 1; + else if (y > x) + return -1; + return 0; +} + static bool xfs_rtrmapbt_verify( struct xfs_buf *bp) @@ -127,12 +398,60 @@ const struct xfs_buf_ops xfs_rtrmapbt_buf_ops = { .verify_write = xfs_rtrmapbt_write_verify, }; +STATIC int +xfs_rtrmapbt_keys_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + if (be64_to_cpu(k1->rtrmap.rm_startblock) < + be64_to_cpu(k2->rtrmap.rm_startblock)) + return 1; + if (be64_to_cpu(k1->rtrmap.rm_owner) < + be64_to_cpu(k2->rtrmap.rm_owner)) + return 1; + if (XFS_RMAP_OFF(be64_to_cpu(k1->rtrmap.rm_offset)) <= + XFS_RMAP_OFF(be64_to_cpu(k2->rtrmap.rm_offset))) + return 1; + return 0; +} + +STATIC int +xfs_rtrmapbt_recs_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_rec *r1, + union xfs_btree_rec *r2) +{ + if (be64_to_cpu(r1->rtrmap.rm_startblock) < + be64_to_cpu(r2->rtrmap.rm_startblock)) + return 1; + if (XFS_RMAP_OFF(be64_to_cpu(r1->rtrmap.rm_offset)) < + XFS_RMAP_OFF(be64_to_cpu(r2->rtrmap.rm_offset))) + return 1; + if (be64_to_cpu(r1->rtrmap.rm_owner) <= + be64_to_cpu(r2->rtrmap.rm_owner)) + return 1; + return 0; +} + static const struct xfs_btree_ops xfs_rtrmapbt_ops = { .rec_len = sizeof(struct xfs_rtrmap_rec), .key_len = 2 * sizeof(struct xfs_rtrmap_key), .dup_cursor = xfs_rtrmapbt_dup_cursor, + .alloc_block = xfs_rtrmapbt_alloc_block, + .free_block = xfs_rtrmapbt_free_block, + .get_minrecs = xfs_rtrmapbt_get_minrecs, + .get_maxrecs = xfs_rtrmapbt_get_maxrecs, + .init_key_from_rec = xfs_rtrmapbt_init_key_from_rec, + .init_high_key_from_rec = xfs_rtrmapbt_init_high_key_from_rec, + .init_rec_from_cur = xfs_rtrmapbt_init_rec_from_cur, + .init_ptr_from_cur = xfs_rtrmapbt_init_ptr_from_cur, + .key_diff = xfs_rtrmapbt_key_diff, .buf_ops = &xfs_rtrmapbt_buf_ops, + .diff_two_keys = xfs_rtrmapbt_diff_two_keys, + .keys_inorder = xfs_rtrmapbt_keys_inorder, + .recs_inorder = xfs_rtrmapbt_recs_inorder, }; /* From darrick.wong@oracle.com Thu Aug 25 18:44:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 204C5800D for ; Thu, 25 Aug 2016 18:44:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E685F8F8035 for ; Thu, 25 Aug 2016 16:44:30 -0700 (PDT) X-ASG-Debug-ID: 1472168667-0bf57b5312209790001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Zm7W95tSyqBESsp7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:28 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNiPZQ026702 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:26 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNiPov001284 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:25 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNiPIv031807; Thu, 25 Aug 2016 23:44:25 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:25 -0700 Subject: [PATCH 09/20] xfs: prepare rmap functions to deal with rtrmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/20] xfs: prepare rmap functions to deal with rtrmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:44:23 -0700 Message-ID: <147216866373.3688.16417052145703125563.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168667 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 22280 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Prepare the high-level rmap functions to deal with the new realtime rmapbt and its slightly different conventions. Provide the ability to talk to either rmapbt or rtrmapbt formats from the same high level code. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rmap.c | 178 +++++++++++++++++++++++++++------------------- fs/xfs/libxfs/xfs_rmap.h | 2 - fs/xfs/xfs_scrub.c | 2 - 3 files changed, 108 insertions(+), 74 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index aa5052f..c654816 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -39,6 +39,24 @@ #include "xfs_bmap.h" #include "xfs_inode.h" +/* By convention, the rtrmapbt's "AG" number is NULLAGNUMBER. */ +static xfs_agnumber_t +xfs_rmap_cur_agno( + struct xfs_btree_cur *cur) +{ + return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? + NULLAGNUMBER : cur->bc_private.a.agno; +} + +/* Return the maximum length of an rmap record. */ +static xfs_filblks_t +xfs_rmap_len_max( + struct xfs_btree_cur *cur) +{ + return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? + XFS_RTRMAP_LEN_MAX : XFS_RMAP_LEN_MAX; +} + /* * Lookup the first record less than or equal to [bno, len, owner, offset] * in the btree given by cur. @@ -96,19 +114,27 @@ xfs_rmap_update( union xfs_btree_rec rec; int error; - trace_xfs_rmap_update(cur->bc_mp, cur->bc_private.a.agno, + trace_xfs_rmap_update(cur->bc_mp, xfs_rmap_cur_agno(cur), irec->rm_startblock, irec->rm_blockcount, irec->rm_owner, irec->rm_offset, irec->rm_flags); - rec.rmap.rm_startblock = cpu_to_be32(irec->rm_startblock); - rec.rmap.rm_blockcount = cpu_to_be32(irec->rm_blockcount); - rec.rmap.rm_owner = cpu_to_be64(irec->rm_owner); - rec.rmap.rm_offset = cpu_to_be64( - xfs_rmap_irec_offset_pack(irec)); + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + rec.rtrmap.rm_startblock = cpu_to_be64(irec->rm_startblock); + rec.rtrmap.rm_blockcount = cpu_to_be64(irec->rm_blockcount); + rec.rtrmap.rm_owner = cpu_to_be64(irec->rm_owner); + rec.rtrmap.rm_offset = cpu_to_be64( + xfs_rmap_irec_offset_pack(irec)); + } else { + rec.rmap.rm_startblock = cpu_to_be32(irec->rm_startblock); + rec.rmap.rm_blockcount = cpu_to_be32(irec->rm_blockcount); + rec.rmap.rm_owner = cpu_to_be64(irec->rm_owner); + rec.rmap.rm_offset = cpu_to_be64( + xfs_rmap_irec_offset_pack(irec)); + } error = xfs_btree_update(cur, &rec); if (error) trace_xfs_rmap_update_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -124,7 +150,7 @@ xfs_rmap_insert( int i; int error; - trace_xfs_rmap_insert(rcur->bc_mp, rcur->bc_private.a.agno, agbno, + trace_xfs_rmap_insert(rcur->bc_mp, xfs_rmap_cur_agno(rcur), agbno, len, owner, offset, flags); error = xfs_rmap_lookup_eq(rcur, agbno, len, owner, offset, flags, &i); @@ -144,7 +170,7 @@ xfs_rmap_insert( done: if (error) trace_xfs_rmap_insert_error(rcur->bc_mp, - rcur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(rcur), error, _RET_IP_); return error; } @@ -160,7 +186,7 @@ xfs_rmap_delete( int i; int error; - trace_xfs_rmap_delete(rcur->bc_mp, rcur->bc_private.a.agno, agbno, + trace_xfs_rmap_delete(rcur->bc_mp, xfs_rmap_cur_agno(rcur), agbno, len, owner, offset, flags); error = xfs_rmap_lookup_eq(rcur, agbno, len, owner, offset, flags, &i); @@ -175,22 +201,31 @@ xfs_rmap_delete( done: if (error) trace_xfs_rmap_delete_error(rcur->bc_mp, - rcur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(rcur), error, _RET_IP_); return error; } /* Convert an internal btree record to an rmap record. */ int xfs_rmap_btrec_to_irec( + struct xfs_btree_cur *cur, union xfs_btree_rec *rec, struct xfs_rmap_irec *irec) { irec->rm_flags = 0; - irec->rm_startblock = be32_to_cpu(rec->rmap.rm_startblock); - irec->rm_blockcount = be32_to_cpu(rec->rmap.rm_blockcount); - irec->rm_owner = be64_to_cpu(rec->rmap.rm_owner); - return xfs_rmap_irec_offset_unpack(be64_to_cpu(rec->rmap.rm_offset), - irec); + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + irec->rm_startblock = be64_to_cpu(rec->rtrmap.rm_startblock); + irec->rm_blockcount = be64_to_cpu(rec->rtrmap.rm_blockcount); + irec->rm_owner = be64_to_cpu(rec->rtrmap.rm_owner); + return xfs_rmap_irec_offset_unpack( + be64_to_cpu(rec->rtrmap.rm_offset), irec); + } else { + irec->rm_startblock = be32_to_cpu(rec->rmap.rm_startblock); + irec->rm_blockcount = be32_to_cpu(rec->rmap.rm_blockcount); + irec->rm_owner = be64_to_cpu(rec->rmap.rm_owner); + return xfs_rmap_irec_offset_unpack( + be64_to_cpu(rec->rmap.rm_offset), irec); + } } /* @@ -209,7 +244,7 @@ xfs_rmap_get_rec( if (error || !*stat) return error; - return xfs_rmap_btrec_to_irec(rec, irec); + return xfs_rmap_btrec_to_irec(cur, rec, irec); } struct xfs_find_left_neighbor_info { @@ -228,7 +263,7 @@ xfs_rmap_find_left_neighbor_helper( struct xfs_find_left_neighbor_info *info = priv; trace_xfs_rmap_find_left_neighbor_candidate(cur->bc_mp, - cur->bc_private.a.agno, rec->rm_startblock, + xfs_rmap_cur_agno(cur), rec->rm_startblock, rec->rm_blockcount, rec->rm_owner, rec->rm_offset, rec->rm_flags); @@ -280,7 +315,7 @@ xfs_rmap_find_left_neighbor( info.stat = stat; trace_xfs_rmap_find_left_neighbor_query(cur->bc_mp, - cur->bc_private.a.agno, bno, 0, owner, offset, flags); + xfs_rmap_cur_agno(cur), bno, 0, owner, offset, flags); error = xfs_rmap_query_range(cur, &info.high, &info.high, xfs_rmap_find_left_neighbor_helper, &info); @@ -288,7 +323,7 @@ xfs_rmap_find_left_neighbor( error = 0; if (*stat) trace_xfs_rmap_find_left_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, irec->rm_startblock, + xfs_rmap_cur_agno(cur), irec->rm_startblock, irec->rm_blockcount, irec->rm_owner, irec->rm_offset, irec->rm_flags); return error; @@ -304,7 +339,7 @@ xfs_rmap_lookup_le_range_helper( struct xfs_find_left_neighbor_info *info = priv; trace_xfs_rmap_lookup_le_range_candidate(cur->bc_mp, - cur->bc_private.a.agno, rec->rm_startblock, + xfs_rmap_cur_agno(cur), rec->rm_startblock, rec->rm_blockcount, rec->rm_owner, rec->rm_offset, rec->rm_flags); @@ -353,14 +388,14 @@ xfs_rmap_lookup_le_range( info.stat = stat; trace_xfs_rmap_lookup_le_range(cur->bc_mp, - cur->bc_private.a.agno, bno, 0, owner, offset, flags); + xfs_rmap_cur_agno(cur), bno, 0, owner, offset, flags); error = xfs_rmap_query_range(cur, &info.high, &info.high, xfs_rmap_lookup_le_range_helper, &info); if (error == XFS_BTREE_QUERY_RANGE_ABORT) error = 0; if (*stat) trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - cur->bc_private.a.agno, irec->rm_startblock, + xfs_rmap_cur_agno(cur), irec->rm_startblock, irec->rm_blockcount, irec->rm_owner, irec->rm_offset, irec->rm_flags); return error; @@ -407,7 +442,7 @@ xfs_rmap_unmap( (flags & XFS_RMAP_BMBT_BLOCK); if (unwritten) flags |= XFS_RMAP_UNWRITTEN; - trace_xfs_rmap_unmap(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_unmap(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -425,7 +460,7 @@ xfs_rmap_unmap( goto out_error; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - cur->bc_private.a.agno, ltrec.rm_startblock, + xfs_rmap_cur_agno(cur), ltrec.rm_startblock, ltrec.rm_blockcount, ltrec.rm_owner, ltrec.rm_offset, ltrec.rm_flags); ltoff = ltrec.rm_offset; @@ -473,7 +508,7 @@ xfs_rmap_unmap( if (ltrec.rm_startblock == bno && ltrec.rm_blockcount == len) { /* exact match, simply remove the record from rmap tree */ - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), ltrec.rm_startblock, ltrec.rm_blockcount, ltrec.rm_owner, ltrec.rm_offset, ltrec.rm_flags); @@ -548,7 +583,7 @@ xfs_rmap_unmap( else cur->bc_rec.r.rm_offset = offset + len; cur->bc_rec.r.rm_flags = flags; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), cur->bc_rec.r.rm_startblock, cur->bc_rec.r.rm_blockcount, cur->bc_rec.r.rm_owner, @@ -560,11 +595,11 @@ xfs_rmap_unmap( } out_done: - trace_xfs_rmap_unmap_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_unmap_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); out_error: if (error) - trace_xfs_rmap_unmap_error(mp, cur->bc_private.a.agno, + trace_xfs_rmap_unmap_error(mp, xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -661,7 +696,7 @@ xfs_rmap_map( (flags & XFS_RMAP_BMBT_BLOCK); if (unwritten) flags |= XFS_RMAP_UNWRITTEN; - trace_xfs_rmap_map(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_map(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -680,7 +715,7 @@ xfs_rmap_map( goto out_error; XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error); trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - cur->bc_private.a.agno, ltrec.rm_startblock, + xfs_rmap_cur_agno(cur), ltrec.rm_startblock, ltrec.rm_blockcount, ltrec.rm_owner, ltrec.rm_offset, ltrec.rm_flags); @@ -707,7 +742,7 @@ xfs_rmap_map( XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= gtrec.rm_startblock, out_error); trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, gtrec.rm_startblock, + xfs_rmap_cur_agno(cur), gtrec.rm_startblock, gtrec.rm_blockcount, gtrec.rm_owner, gtrec.rm_offset, gtrec.rm_flags); if (!xfs_rmap_is_mergeable(>rec, owner, flags)) @@ -734,8 +769,8 @@ xfs_rmap_map( if (have_gt && bno + len == gtrec.rm_startblock && (ignore_off || offset + len == gtrec.rm_offset) && - (unsigned long)ltrec.rm_blockcount + len + - gtrec.rm_blockcount <= XFS_RMAP_LEN_MAX) { + ltrec.rm_blockcount + len + gtrec.rm_blockcount <= + xfs_rmap_len_max(cur)) { /* * right edge also contiguous, delete right record * and merge into left record. @@ -746,7 +781,7 @@ xfs_rmap_map( * result: |rrrrrrrrrrrrrrrrrrrrrrrrrrrrr| */ ltrec.rm_blockcount += gtrec.rm_blockcount; - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), gtrec.rm_startblock, gtrec.rm_blockcount, gtrec.rm_owner, @@ -794,7 +829,7 @@ xfs_rmap_map( cur->bc_rec.r.rm_owner = owner; cur->bc_rec.r.rm_offset = offset; cur->bc_rec.r.rm_flags = flags; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), bno, len, owner, offset, flags); error = xfs_btree_insert(cur, &i); if (error) @@ -802,11 +837,11 @@ xfs_rmap_map( XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); } - trace_xfs_rmap_map_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_map_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); out_error: if (error) - trace_xfs_rmap_map_error(mp, cur->bc_private.a.agno, + trace_xfs_rmap_map_error(mp, xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -886,7 +921,7 @@ xfs_rmap_convert( (flags & (XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK)))); oldext = unwritten ? XFS_RMAP_UNWRITTEN : 0; new_endoff = offset + len; - trace_xfs_rmap_convert(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_convert(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -904,7 +939,7 @@ xfs_rmap_convert( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - cur->bc_private.a.agno, PREV.rm_startblock, + xfs_rmap_cur_agno(cur), PREV.rm_startblock, PREV.rm_blockcount, PREV.rm_owner, PREV.rm_offset, PREV.rm_flags); @@ -940,7 +975,7 @@ xfs_rmap_convert( LEFT.rm_startblock + LEFT.rm_blockcount <= bno, done); trace_xfs_rmap_find_left_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, LEFT.rm_startblock, + xfs_rmap_cur_agno(cur), LEFT.rm_startblock, LEFT.rm_blockcount, LEFT.rm_owner, LEFT.rm_offset, LEFT.rm_flags); if (LEFT.rm_startblock + LEFT.rm_blockcount == bno && @@ -970,7 +1005,7 @@ xfs_rmap_convert( XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= RIGHT.rm_startblock, done); trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, RIGHT.rm_startblock, + xfs_rmap_cur_agno(cur), RIGHT.rm_startblock, RIGHT.rm_blockcount, RIGHT.rm_owner, RIGHT.rm_offset, RIGHT.rm_flags); if (bno + len == RIGHT.rm_startblock && @@ -984,11 +1019,11 @@ xfs_rmap_convert( RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG)) == (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG) && - (unsigned long)LEFT.rm_blockcount + len + - RIGHT.rm_blockcount > XFS_RMAP_LEN_MAX) + LEFT.rm_blockcount + len + RIGHT.rm_blockcount > + xfs_rmap_len_max(cur)) state &= ~RMAP_RIGHT_CONTIG; - trace_xfs_rmap_convert_state(mp, cur->bc_private.a.agno, state, + trace_xfs_rmap_convert_state(mp, xfs_rmap_cur_agno(cur), state, _RET_IP_); /* reset the cursor back to PREV */ @@ -1012,7 +1047,7 @@ xfs_rmap_convert( if (error) goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), RIGHT.rm_startblock, RIGHT.rm_blockcount, RIGHT.rm_owner, RIGHT.rm_offset, RIGHT.rm_flags); @@ -1024,7 +1059,7 @@ xfs_rmap_convert( if (error) goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), PREV.rm_startblock, PREV.rm_blockcount, PREV.rm_owner, PREV.rm_offset, PREV.rm_flags); @@ -1048,7 +1083,7 @@ xfs_rmap_convert( * Setting all of a previous oldext extent to newext. * The left neighbor is contiguous, the right is not. */ - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), PREV.rm_startblock, PREV.rm_blockcount, PREV.rm_owner, PREV.rm_offset, PREV.rm_flags); @@ -1076,7 +1111,7 @@ xfs_rmap_convert( if (error) goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), RIGHT.rm_startblock, RIGHT.rm_blockcount, RIGHT.rm_owner, RIGHT.rm_offset, RIGHT.rm_flags); @@ -1149,7 +1184,7 @@ xfs_rmap_convert( NEW.rm_blockcount = len; NEW.rm_flags = newext; cur->bc_rec.r = NEW; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, bno, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), bno, len, owner, offset, newext); error = xfs_btree_insert(cur, &i); if (error) @@ -1200,7 +1235,7 @@ xfs_rmap_convert( NEW.rm_blockcount = len; NEW.rm_flags = newext; cur->bc_rec.r = NEW; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, bno, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), bno, len, owner, offset, newext); error = xfs_btree_insert(cur, &i); if (error) @@ -1228,7 +1263,7 @@ xfs_rmap_convert( NEW = PREV; NEW.rm_blockcount = offset - PREV.rm_offset; cur->bc_rec.r = NEW; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), NEW.rm_startblock, NEW.rm_blockcount, NEW.rm_owner, NEW.rm_offset, NEW.rm_flags); @@ -1249,7 +1284,7 @@ xfs_rmap_convert( /* new middle extent - newext */ cur->bc_rec.r.rm_flags &= ~XFS_RMAP_UNWRITTEN; cur->bc_rec.r.rm_flags |= newext; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), bno, len, owner, offset, newext); error = xfs_btree_insert(cur, &i); if (error) @@ -1270,12 +1305,12 @@ xfs_rmap_convert( ASSERT(0); } - trace_xfs_rmap_convert_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_convert_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); done: if (error) trace_xfs_rmap_convert_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -1311,7 +1346,7 @@ xfs_rmap_convert_shared( (flags & (XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK)))); oldext = unwritten ? XFS_RMAP_UNWRITTEN : 0; new_endoff = offset + len; - trace_xfs_rmap_convert(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_convert(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -1365,7 +1400,7 @@ xfs_rmap_convert_shared( XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= RIGHT.rm_startblock, done); trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, RIGHT.rm_startblock, + xfs_rmap_cur_agno(cur), RIGHT.rm_startblock, RIGHT.rm_blockcount, RIGHT.rm_owner, RIGHT.rm_offset, RIGHT.rm_flags); if (xfs_rmap_is_mergeable(&RIGHT, owner, newext)) @@ -1377,11 +1412,11 @@ xfs_rmap_convert_shared( RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG)) == (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG) && - (unsigned long)LEFT.rm_blockcount + len + - RIGHT.rm_blockcount > XFS_RMAP_LEN_MAX) + LEFT.rm_blockcount + len + RIGHT.rm_blockcount > + xfs_rmap_len_max(cur)) state &= ~RMAP_RIGHT_CONTIG; - trace_xfs_rmap_convert_state(mp, cur->bc_private.a.agno, state, + trace_xfs_rmap_convert_state(mp, xfs_rmap_cur_agno(cur), state, _RET_IP_); /* * Switch out based on the FILLING and CONTIG state bits. @@ -1648,12 +1683,12 @@ xfs_rmap_convert_shared( ASSERT(0); } - trace_xfs_rmap_convert_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_convert_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); done: if (error) trace_xfs_rmap_convert_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -1691,7 +1726,7 @@ xfs_rmap_unmap_shared( xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); if (unwritten) flags |= XFS_RMAP_UNWRITTEN; - trace_xfs_rmap_unmap(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_unmap(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -1815,12 +1850,12 @@ xfs_rmap_unmap_shared( goto out_error; } - trace_xfs_rmap_unmap_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_unmap_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); out_error: if (error) trace_xfs_rmap_unmap_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -1855,7 +1890,7 @@ xfs_rmap_map_shared( xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); if (unwritten) flags |= XFS_RMAP_UNWRITTEN; - trace_xfs_rmap_map(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_map(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* Is there a left record that abuts our range? */ @@ -1878,7 +1913,7 @@ xfs_rmap_map_shared( goto out_error; XFS_WANT_CORRUPTED_GOTO(mp, have_gt == 1, out_error); trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, gtrec.rm_startblock, + xfs_rmap_cur_agno(cur), gtrec.rm_startblock, gtrec.rm_blockcount, gtrec.rm_owner, gtrec.rm_offset, gtrec.rm_flags); @@ -1968,12 +2003,12 @@ xfs_rmap_map_shared( goto out_error; } - trace_xfs_rmap_map_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_map_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); out_error: if (error) trace_xfs_rmap_map_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -1993,7 +2028,7 @@ xfs_rmap_query_range_helper( struct xfs_rmap_irec irec; int error; - error = xfs_rmap_btrec_to_irec(rec, &irec); + error = xfs_rmap_btrec_to_irec(cur, rec, &irec); if (error) return error; return query->fn(cur, &irec, query->priv); @@ -2076,13 +2111,12 @@ xfs_rmap_finish_one( XFS_ERRTAG_RMAP_FINISH_ONE, XFS_RANDOM_RMAP_FINISH_ONE)) return -EIO; - /* * If we haven't gotten a cursor or the cursor AG doesn't match * the startblock, get one now. */ rcur = *pcur; - if (rcur != NULL && rcur->bc_private.a.agno != agno) { + if (rcur != NULL && xfs_rmap_cur_agno(rcur) != agno) { xfs_rmap_finish_one_cleanup(tp, rcur, 0); rcur = NULL; *pcur = NULL; diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h index 06f7e73..3574377 100644 --- a/fs/xfs/libxfs/xfs_rmap.h +++ b/fs/xfs/libxfs/xfs_rmap.h @@ -213,7 +213,7 @@ int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, struct xfs_rmap_irec *irec, int *stat); union xfs_btree_rec; -int xfs_rmap_btrec_to_irec(union xfs_btree_rec *rec, +int xfs_rmap_btrec_to_irec(struct xfs_btree_cur *cur, union xfs_btree_rec *rec, struct xfs_rmap_irec *irec); int xfs_rmap_has_record(struct xfs_btree_cur *cur, xfs_fsblock_t bno, xfs_filblks_t len, bool *exists); diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index e4e3210..590bef8 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -1778,7 +1778,7 @@ xfs_scrub_rmapbt_helper( int error = 0; int err2; - error = xfs_rmap_btrec_to_irec(rec, &irec); + error = xfs_rmap_btrec_to_irec(bs->cur, rec, &irec); if (error) return error; From darrick.wong@oracle.com Thu Aug 25 18:44:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A3DB28024 for ; Thu, 25 Aug 2016 18:44:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 76A34304039 for ; Thu, 25 Aug 2016 16:44:36 -0700 (PDT) X-ASG-Debug-ID: 1472168674-0bf57c55b11c7c10001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id bX2spJI8NUiUd8Ak (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNiW4F020252 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:33 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNiWqO029214 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:32 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNiVnf031826; Thu, 25 Aug 2016 23:44:31 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:31 -0700 Subject: [PATCH 10/20] xfs: add a realtime flag to the rmap update log redo items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/20] xfs: add a realtime flag to the rmap update log redo items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:44:30 -0700 Message-ID: <147216867011.3688.5459904823282801857.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168674 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7168 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Extend the rmap update (RUI) log items with a new realtime flag that indicates that the updates apply against the realtime rmapbt. We'll wire up the actual rmap code later. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_log_format.h | 4 +++- fs/xfs/libxfs/xfs_rmap.c | 17 ++++++++++------- fs/xfs/libxfs/xfs_rmap.h | 1 + fs/xfs/xfs_rmap_item.c | 4 +++- fs/xfs/xfs_trans.h | 2 +- fs/xfs/xfs_trans_rmap.c | 9 +++++++-- 6 files changed, 25 insertions(+), 12 deletions(-) diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index 75f9890..34c4cc7 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -647,11 +647,13 @@ struct xfs_map_extent { #define XFS_RMAP_EXTENT_ATTR_FORK (1U << 31) #define XFS_RMAP_EXTENT_BMBT_BLOCK (1U << 30) #define XFS_RMAP_EXTENT_UNWRITTEN (1U << 29) +#define XFS_RMAP_EXTENT_REALTIME (1U << 28) #define XFS_RMAP_EXTENT_FLAGS (XFS_RMAP_EXTENT_TYPE_MASK | \ XFS_RMAP_EXTENT_ATTR_FORK | \ XFS_RMAP_EXTENT_BMBT_BLOCK | \ - XFS_RMAP_EXTENT_UNWRITTEN) + XFS_RMAP_EXTENT_UNWRITTEN | \ + XFS_RMAP_EXTENT_REALTIME) /* * This is the structure used to lay out an rui log item in the diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index c654816..71704d6 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -2205,11 +2205,13 @@ __xfs_rmap_add( enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, - struct xfs_bmbt_irec *bmap) + struct xfs_bmbt_irec *bmap, + bool realtime) { struct xfs_rmap_intent *ri; - trace_xfs_rmap_defer(mp, XFS_FSB_TO_AGNO(mp, bmap->br_startblock), + trace_xfs_rmap_defer(mp, realtime ? NULLAGNUMBER : + XFS_FSB_TO_AGNO(mp, bmap->br_startblock), type, XFS_FSB_TO_AGBNO(mp, bmap->br_startblock), owner, whichfork, @@ -2223,6 +2225,7 @@ __xfs_rmap_add( ri->ri_owner = owner; ri->ri_whichfork = whichfork; ri->ri_bmap = *bmap; + ri->ri_realtime = realtime; xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_RMAP, &ri->ri_list); return 0; @@ -2242,7 +2245,7 @@ xfs_rmap_map_extent( return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? XFS_RMAP_MAP_SHARED : XFS_RMAP_MAP, ip->i_ino, - whichfork, PREV); + whichfork, PREV, XFS_IS_REALTIME_INODE(ip)); } /* Unmap an extent out of a file. */ @@ -2259,7 +2262,7 @@ xfs_rmap_unmap_extent( return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? XFS_RMAP_UNMAP_SHARED : XFS_RMAP_UNMAP, ip->i_ino, - whichfork, PREV); + whichfork, PREV, XFS_IS_REALTIME_INODE(ip)); } /* Convert a data fork extent from unwritten to real or vice versa. */ @@ -2276,7 +2279,7 @@ xfs_rmap_convert_extent( return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? XFS_RMAP_CONVERT_SHARED : XFS_RMAP_CONVERT, ip->i_ino, - whichfork, PREV); + whichfork, PREV, XFS_IS_REALTIME_INODE(ip)); } /* Schedule the creation of an rmap for non-file data. */ @@ -2300,7 +2303,7 @@ xfs_rmap_alloc_extent( bmap.br_state = XFS_EXT_NORM; return __xfs_rmap_add(mp, dfops, XFS_RMAP_ALLOC, owner, - XFS_DATA_FORK, &bmap); + XFS_DATA_FORK, &bmap, false); } /* Schedule the deletion of an rmap for non-file data. */ @@ -2324,7 +2327,7 @@ xfs_rmap_free_extent( bmap.br_state = XFS_EXT_NORM; return __xfs_rmap_add(mp, dfops, XFS_RMAP_FREE, owner, - XFS_DATA_FORK, &bmap); + XFS_DATA_FORK, &bmap, false); } /* Is there a record covering a given extent? */ diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h index 3574377..0850310 100644 --- a/fs/xfs/libxfs/xfs_rmap.h +++ b/fs/xfs/libxfs/xfs_rmap.h @@ -180,6 +180,7 @@ struct xfs_rmap_intent { __uint64_t ri_owner; int ri_whichfork; struct xfs_bmbt_irec ri_bmap; + bool ri_realtime; }; /* functions for updating the rmapbt based on bmbt map/unmap operations */ diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c index 0c96e41..01d6edf 100644 --- a/fs/xfs/xfs_rmap_item.c +++ b/fs/xfs/xfs_rmap_item.c @@ -445,6 +445,7 @@ xfs_rui_recover( xfs_exntst_t state; struct xfs_trans *tp; struct xfs_btree_cur *rcur = NULL; + bool rt; ASSERT(!test_bit(XFS_RUI_RECOVERED, &ruip->rui_flags)); @@ -498,6 +499,7 @@ xfs_rui_recover( XFS_EXT_UNWRITTEN : XFS_EXT_NORM; whichfork = (rmap->me_flags & XFS_RMAP_EXTENT_ATTR_FORK) ? XFS_ATTR_FORK : XFS_DATA_FORK; + rt = !!(rmap->me_flags & XFS_RMAP_EXTENT_REALTIME); switch (rmap->me_flags & XFS_RMAP_EXTENT_TYPE_MASK) { case XFS_RMAP_EXTENT_MAP: type = XFS_RMAP_MAP; @@ -530,7 +532,7 @@ xfs_rui_recover( error = xfs_trans_log_finish_rmap_update(tp, rudp, type, rmap->me_owner, whichfork, rmap->me_startoff, rmap->me_startblock, - rmap->me_len, state, &rcur); + rmap->me_len, state, rt, &rcur); if (error) goto abort_error; diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 7a4ea0c..fbd7bc8 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -251,7 +251,7 @@ int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, xfs_filblks_t blockcount, - xfs_exntst_t state, struct xfs_btree_cur **pcur); + xfs_exntst_t state, bool rt, struct xfs_btree_cur **pcur); /* refcount updates */ enum xfs_refcount_intent_type; diff --git a/fs/xfs/xfs_trans_rmap.c b/fs/xfs/xfs_trans_rmap.c index 9ead064..9240157b 100644 --- a/fs/xfs/xfs_trans_rmap.c +++ b/fs/xfs/xfs_trans_rmap.c @@ -37,13 +37,16 @@ xfs_trans_set_rmap_flags( struct xfs_map_extent *rmap, enum xfs_rmap_intent_type type, int whichfork, - xfs_exntst_t state) + xfs_exntst_t state, + bool rt) { rmap->me_flags = 0; if (state == XFS_EXT_UNWRITTEN) rmap->me_flags |= XFS_RMAP_EXTENT_UNWRITTEN; if (whichfork == XFS_ATTR_FORK) rmap->me_flags |= XFS_RMAP_EXTENT_ATTR_FORK; + if (rt) + rmap->me_flags |= XFS_RMAP_EXTENT_REALTIME; switch (type) { case XFS_RMAP_MAP: rmap->me_flags |= XFS_RMAP_EXTENT_MAP; @@ -102,6 +105,7 @@ xfs_trans_log_finish_rmap_update( xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, + bool rt, struct xfs_btree_cur **pcur) { int error; @@ -190,7 +194,7 @@ xfs_rmap_update_log_item( map->me_startoff = rmap->ri_bmap.br_startoff; map->me_len = rmap->ri_bmap.br_blockcount; xfs_trans_set_rmap_flags(map, rmap->ri_type, rmap->ri_whichfork, - rmap->ri_bmap.br_state); + rmap->ri_bmap.br_state, rmap->ri_realtime); } /* Get an RUD so we can process all the deferred rmap updates. */ @@ -223,6 +227,7 @@ xfs_rmap_update_finish_item( rmap->ri_bmap.br_startblock, rmap->ri_bmap.br_blockcount, rmap->ri_bmap.br_state, + rmap->ri_realtime, (struct xfs_btree_cur **)state); kmem_free(rmap); return error; From darrick.wong@oracle.com Thu Aug 25 18:44:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3242A8025 for ; Thu, 25 Aug 2016 18:44:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E82DD304043 for ; Thu, 25 Aug 2016 16:44:41 -0700 (PDT) X-ASG-Debug-ID: 1472168680-0bf8155c751e7bd0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id SCnkZH1JR6NvMyFb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:40 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNicfu020311 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:39 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNicQI029424 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:38 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNicln020316; Thu, 25 Aug 2016 23:44:38 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:37 -0700 Subject: [PATCH 11/20] xfs: add realtime rmap btree block detection to log recovery From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/20] xfs: add realtime rmap btree block detection to log recovery To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com, Dave Chinner Date: Thu, 25 Aug 2016 16:44:36 -0700 Message-ID: <147216867635.3688.9696474131171382574.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168680 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 907 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Identify rtrmapbt blocks in the log correctly so that we can validate them during log recovery. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index c9c05b9..dc2c80e 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2247,6 +2247,7 @@ xlog_recover_get_buf_lsn( uuid = &btb->bb_u.s.bb_uuid; break; } + case XFS_RTRMAP_CRC_MAGIC: case XFS_BMAP_CRC_MAGIC: case XFS_BMAP_MAGIC: { struct xfs_btree_block *btb = blk; @@ -2407,6 +2408,9 @@ xlog_recover_validate_buf_type( case XFS_BMAP_MAGIC: bp->b_ops = &xfs_bmbt_buf_ops; break; + case XFS_RTRMAP_CRC_MAGIC: + bp->b_ops = &xfs_rtrmapbt_buf_ops; + break; case XFS_RMAP_CRC_MAGIC: bp->b_ops = &xfs_rmapbt_buf_ops; break; From darrick.wong@oracle.com Thu Aug 25 18:44:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 809118036 for ; Thu, 25 Aug 2016 18:44:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 51BDE304039 for ; Thu, 25 Aug 2016 16:44:50 -0700 (PDT) X-ASG-Debug-ID: 1472168688-0bf57c55b21c7c70001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id mjpmi6IVC0uxd9Hn (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNilLq020425 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:47 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNik0v001615 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:47 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNik1Q031965; Thu, 25 Aug 2016 23:44:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:43 -0700 Subject: [PATCH 12/20] xfs: add realtime reverse map inode to superblock From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 12/20] xfs: add realtime reverse map inode to superblock To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:44:42 -0700 Message-ID: <147216868259.3688.1952034016958084309.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168688 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9575 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add a field to the superblock to record the rt rmapbt inode and load it at mount time. The rtrmapbt inode will have a unique extent format code, which means that we also have to update the inode validation and flush routines to look for it. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_format.h | 10 +++++++++- fs/xfs/libxfs/xfs_inode_fork.c | 11 +++++++++++ fs/xfs/libxfs/xfs_rtrmap_btree.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 2 ++ fs/xfs/xfs_inode.c | 9 ++++++++- fs/xfs/xfs_inode_item.c | 2 ++ fs/xfs/xfs_itable.c | 1 + fs/xfs/xfs_log_recover.c | 13 ++++++++++++- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_ondisk.h | 2 +- fs/xfs/xfs_rtalloc.c | 21 +++++++++++++++++++++ 11 files changed, 69 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 7f30781..4ae3537 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -183,6 +183,7 @@ typedef struct xfs_sb { xfs_ino_t sb_pquotino; /* project quota inode */ xfs_lsn_t sb_lsn; /* last write sequence */ uuid_t sb_meta_uuid; /* metadata file system unique id */ + xfs_ino_t sb_rrmapino; /* realtime reverse map inode */ /* must be padded to 64 bit alignment */ } xfs_sb_t; @@ -270,6 +271,7 @@ typedef struct xfs_dsb { __be64 sb_pquotino; /* project quota inode */ __be64 sb_lsn; /* last write sequence */ uuid_t sb_meta_uuid; /* metadata file system unique id */ + __be64 sb_rrmapino; /* realtime reverse map inode */ /* must be padded to 64 bit alignment */ } xfs_dsb_t; @@ -553,6 +555,11 @@ static inline bool xfs_sb_version_hasrmapbt(struct xfs_sb *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT); } +static inline bool xfs_sb_version_hasrtrmapbt(struct xfs_sb *sbp) +{ + return sbp->sb_rblocks > 0 && xfs_sb_version_hasrmapbt(sbp); +} + static inline bool xfs_sb_version_hasreflink(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && @@ -948,7 +955,8 @@ typedef enum xfs_dinode_fmt { XFS_DINODE_FMT_LOCAL, /* bulk data */ XFS_DINODE_FMT_EXTENTS, /* struct xfs_bmbt_rec */ XFS_DINODE_FMT_BTREE, /* struct xfs_bmdr_block */ - XFS_DINODE_FMT_UUID /* uuid_t */ + XFS_DINODE_FMT_UUID, /* uuid_t */ + XFS_DINODE_FMT_RMAP, /* reverse mapping btree */ } xfs_dinode_fmt_t; /* diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 2de6cb5..c09c048 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -195,6 +195,13 @@ xfs_iformat_fork( case XFS_DINODE_FMT_BTREE: error = xfs_iformat_btree(ip, dip, XFS_DATA_FORK); break; + case XFS_DINODE_FMT_RMAP: + if (!xfs_sb_version_hasrtrmapbt(&ip->i_mount->m_sb)) + return -EFSCORRUPTED; + if (ip->i_ino != ip->i_mount->m_sb.sb_rrmapino) + return -EFSCORRUPTED; + /* to be implemented later */ + break; default: XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW, ip->i_mount); @@ -797,6 +804,10 @@ xfs_iflush_fork( } break; + case XFS_DINODE_FMT_RMAP: + /* to be implemented later */ + break; + default: ASSERT(0); break; diff --git a/fs/xfs/libxfs/xfs_rtrmap_btree.c b/fs/xfs/libxfs/xfs_rtrmap_btree.c index 71f954a..8f75691 100644 --- a/fs/xfs/libxfs/xfs_rtrmap_btree.c +++ b/fs/xfs/libxfs/xfs_rtrmap_btree.c @@ -354,7 +354,7 @@ xfs_rtrmapbt_verify( if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) return false; - if (!xfs_btree_lblock_v5hdr_verify(bp, XFS_RMAP_OWN_UNKNOWN)) + if (!xfs_btree_lblock_v5hdr_verify(bp, mp->m_sb.sb_rrmapino)) return false; level = be16_to_cpu(block->bb_level); if (level > mp->m_rtrmap_maxlevels) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index eb33ec9..87c867e4 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -426,6 +426,7 @@ __xfs_sb_from_disk( uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid); else uuid_copy(&to->sb_meta_uuid, &from->sb_uuid); + to->sb_rrmapino = be64_to_cpu(from->sb_rrmapino); /* Convert on-disk flags to in-memory flags? */ if (convert_xquota) xfs_sb_quota_from_disk(to); @@ -569,6 +570,7 @@ xfs_sb_to_disk( to->sb_lsn = cpu_to_be64(from->sb_lsn); if (xfs_sb_version_hasmetauuid(from)) uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid); + to->sb_rrmapino = cpu_to_be64(from->sb_rrmapino); } } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8c2f9a7..e31310b 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3514,7 +3514,14 @@ xfs_iflush_int( __func__, ip->i_ino, be16_to_cpu(dip->di_magic), dip); goto corrupt_out; } - if (S_ISREG(VFS_I(ip)->i_mode)) { + if (ip->i_ino == mp->m_sb.sb_rrmapino) { + if (ip->i_d.di_format != XFS_DINODE_FMT_RMAP) { + xfs_alert_tag(mp, XFS_PTAG_IFLUSH, + "%s: Bad rtrmap inode %Lu, ptr 0x%p", + __func__, ip->i_ino, ip); + goto corrupt_out; + } + } else if (S_ISREG(VFS_I(ip)->i_mode)) { if (XFS_TEST_ERROR( (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS) && (ip->i_d.di_format != XFS_DINODE_FMT_BTREE), diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 9610e9c..632ea87 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -56,6 +56,7 @@ xfs_inode_item_data_fork_size( } break; case XFS_DINODE_FMT_BTREE: + case XFS_DINODE_FMT_RMAP: if ((iip->ili_fields & XFS_ILOG_DBROOT) && ip->i_df.if_broot_bytes > 0) { *nbytes += ip->i_df.if_broot_bytes; @@ -179,6 +180,7 @@ xfs_inode_item_format_data_fork( } break; case XFS_DINODE_FMT_BTREE: + case XFS_DINODE_FMT_RMAP: iip->ili_fields &= ~(XFS_ILOG_DDATA | XFS_ILOG_DEXT | XFS_ILOG_DEV | XFS_ILOG_UUID); diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 4fd5fe1..8b2150d 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -37,6 +37,7 @@ xfs_internal_inum( xfs_ino_t ino) { return (ino == mp->m_sb.sb_rbmino || ino == mp->m_sb.sb_rsumino || + ino == mp->m_sb.sb_rrmapino || (xfs_sb_version_hasquota(&mp->m_sb) && xfs_is_quota_inode(&mp->m_sb, ino))); } diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index dc2c80e..fa3a0fb 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3039,7 +3039,18 @@ xlog_recover_inode_pass2( /* Take the opportunity to reset the flush iteration count */ ldip->di_flushiter = 0; - if (unlikely(S_ISREG(ldip->di_mode))) { + if (in_f->ilf_ino == mp->m_sb.sb_rrmapino) { + if (ldip->di_format != XFS_DINODE_FMT_RMAP) { + XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)", + XFS_ERRLEVEL_LOW, mp, ldip); + xfs_alert(mp, + "%s: Bad rtrmapbt inode log record, rec ptr 0x%p, " + "ino ptr = 0x%p, ino bp = 0x%p, ino %Ld", + __func__, item, dip, bp, in_f->ilf_ino); + error = -EFSCORRUPTED; + goto out_release; + } + } else if (unlikely(S_ISREG(ldip->di_mode))) { if ((ldip->di_format != XFS_DINODE_FMT_EXTENTS) && (ldip->di_format != XFS_DINODE_FMT_BTREE)) { XFS_CORRUPTION_ERROR("xlog_recover_inode_pass2(3)", diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 70d3cc3..5128ec0 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -97,6 +97,7 @@ typedef struct xfs_mount { uint m_rsumsize; /* size of rt summary, bytes */ struct xfs_inode *m_rbmip; /* pointer to bitmap inode */ struct xfs_inode *m_rsumip; /* pointer to summary inode */ + struct xfs_inode *m_rrmapip; /* pointer to rmap inode */ struct xfs_inode *m_rootip; /* pointer to root directory */ struct xfs_quotainfo *m_quotainfo; /* disk quota information */ xfs_buftarg_t *m_ddev_targp; /* saves taking the address */ diff --git a/fs/xfs/xfs_ondisk.h b/fs/xfs/xfs_ondisk.h index 88c771e..779b5f0 100644 --- a/fs/xfs/xfs_ondisk.h +++ b/fs/xfs/xfs_ondisk.h @@ -45,7 +45,7 @@ xfs_check_ondisk_structs(void) XFS_CHECK_STRUCT_SIZE(struct xfs_dinode, 176); XFS_CHECK_STRUCT_SIZE(struct xfs_disk_dquot, 104); XFS_CHECK_STRUCT_SIZE(struct xfs_dqblk, 136); - XFS_CHECK_STRUCT_SIZE(struct xfs_dsb, 264); + XFS_CHECK_STRUCT_SIZE(struct xfs_dsb, 272); XFS_CHECK_STRUCT_SIZE(struct xfs_dsymlink_hdr, 56); XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_key, 4); XFS_CHECK_STRUCT_SIZE(struct xfs_inobt_rec, 16); diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 802bcc3..401cb17 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -1235,6 +1235,25 @@ xfs_rtmount_inodes( return error; } ASSERT(mp->m_rsumip != NULL); + + /* If we have rmap and a realtime device, look for the rtrmapbt. */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && mp->m_sb.sb_rblocks > 0) { + ASSERT(sbp->sb_rrmapino != NULLFSINO); + error = xfs_iget(mp, NULL, sbp->sb_rrmapino, 0, 0, + &mp->m_rrmapip); + if (error) { + if (mp->m_rrmapip) + IRELE(mp->m_rrmapip); + return error; + } + ASSERT(mp->m_rrmapip != NULL); + if (mp->m_rrmapip->i_d.di_format != XFS_DINODE_FMT_RMAP) { + IRELE(mp->m_rrmapip); + mp->m_rrmapip = NULL; + return -EFSCORRUPTED; + } + } + return 0; } @@ -1242,6 +1261,8 @@ void xfs_rtunmount_inodes( struct xfs_mount *mp) { + if (mp->m_rrmapip) + IRELE(mp->m_rrmapip); if (mp->m_rbmip) IRELE(mp->m_rbmip); if (mp->m_rsumip) From darrick.wong@oracle.com Thu Aug 25 18:44:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 25403803E for ; Thu, 25 Aug 2016 18:44:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C11C0304039 for ; Thu, 25 Aug 2016 16:44:56 -0700 (PDT) X-ASG-Debug-ID: 1472168693-0bf8155c751e7c60001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id rxco6GeX0ZOFfwvk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:44:53 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNipBj026943 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:52 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNipk5029601 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:51 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNio3t020364; Thu, 25 Aug 2016 23:44:50 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:50 -0700 Subject: [PATCH 13/20] xfs: wire up a new inode fork type for the realtime rmap From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 13/20] xfs: wire up a new inode fork type for the realtime rmap To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:44:48 -0700 Message-ID: <147216868889.3688.13692428102291406545.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168693 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15747 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces we need to embed the root of the realtime rmap btree in an inode's data fork, complete with new fork type and on-disk interpretation functions. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_format.h | 8 + fs/xfs/libxfs/xfs_inode_fork.c | 48 +++++++ fs/xfs/libxfs/xfs_rtrmap_btree.c | 250 ++++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_rtrmap_btree.h | 49 +++++++ 4 files changed, 353 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 4ae3537..8eff259 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1478,6 +1478,14 @@ typedef __be32 xfs_rmap_ptr_t; #define XFS_RTRMAP_CRC_MAGIC 0x4d415052 /* 'MAPR' */ /* + * rtrmap root header, on-disk form only. + */ +struct xfs_rtrmap_root { + __be16 bb_level; /* 0 is a leaf */ + __be16 bb_numrecs; /* current # of data records */ +}; + +/* * Data record structure */ struct xfs_rtrmap_rec { diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index c09c048..4ec8576 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -32,12 +32,14 @@ #include "xfs_trace.h" #include "xfs_attr_sf.h" #include "xfs_da_format.h" +#include "xfs_rtrmap_btree.h" kmem_zone_t *xfs_ifork_zone; STATIC int xfs_iformat_local(xfs_inode_t *, xfs_dinode_t *, int, int); STATIC int xfs_iformat_extents(xfs_inode_t *, xfs_dinode_t *, int); STATIC int xfs_iformat_btree(xfs_inode_t *, xfs_dinode_t *, int); +STATIC int xfs_iformat_rmap(struct xfs_inode *, struct xfs_dinode *); #ifdef DEBUG /* @@ -200,7 +202,7 @@ xfs_iformat_fork( return -EFSCORRUPTED; if (ip->i_ino != ip->i_mount->m_sb.sb_rrmapino) return -EFSCORRUPTED; - /* to be implemented later */ + error = xfs_iformat_rmap(ip, dip); break; default: XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW, @@ -476,6 +478,37 @@ xfs_iformat_btree( return 0; } +/* The file is a reverse mapping tree. */ +STATIC int +xfs_iformat_rmap( + struct xfs_inode *ip, + struct xfs_dinode *dip) +{ + struct xfs_rtrmap_root *dfp; + struct xfs_ifork *ifp; + /* REFERENCED */ + int size; + int whichfork = XFS_DATA_FORK; + + ifp = XFS_IFORK_PTR(ip, whichfork); + dfp = (struct xfs_rtrmap_root *)XFS_DFORK_PTR(dip, whichfork); + size = XFS_RTRMAP_BROOT_SPACE(dfp); + + ifp->if_broot_bytes = size; + ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS); + ASSERT(ifp->if_broot != NULL); + /* + * Copy and convert from the on-disk structure + * to the in-memory structure. + */ + xfs_rtrmapbt_from_disk(ip, dfp, + XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), + ifp->if_broot, size); + ifp->if_flags = XFS_IFBROOT; + + return 0; +} + /* * Read in extents from a btree-format inode. * Allocate and fill in if_extents. Real work is done in xfs_bmap.c. @@ -805,7 +838,18 @@ xfs_iflush_fork( break; case XFS_DINODE_FMT_RMAP: - /* to be implemented later */ + ASSERT(whichfork == XFS_DATA_FORK); + ASSERT(ip->i_ino == mp->m_sb.sb_rrmapino); + if ((iip->ili_fields & brootflag[whichfork]) && + (ifp->if_broot_bytes > 0)) { + ASSERT(ifp->if_broot != NULL); + ASSERT(XFS_RTRMAP_ROOT_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + xfs_rtrmapbt_to_disk(mp, ifp->if_broot, + ifp->if_broot_bytes, + (struct xfs_rtrmap_root *)cp, + XFS_DFORK_SIZE(dip, mp, whichfork)); + } break; default: diff --git a/fs/xfs/libxfs/xfs_rtrmap_btree.c b/fs/xfs/libxfs/xfs_rtrmap_btree.c index 8f75691..5a40e47 100644 --- a/fs/xfs/libxfs/xfs_rtrmap_btree.c +++ b/fs/xfs/libxfs/xfs_rtrmap_btree.c @@ -224,6 +224,42 @@ xfs_rtrmapbt_get_maxrecs( return cur->bc_mp->m_rtrmap_mxr[level != 0]; } +/* + * Calculate number of records in a realtime rmap btree inode root. + */ +STATIC int +xfs_rtrmapbt_root_maxrecs( + int blocklen, + bool leaf) +{ + blocklen -= sizeof(struct xfs_rtrmap_root); + + if (leaf) + return blocklen / sizeof(struct xfs_rtrmap_rec); + return blocklen / (2 * sizeof(struct xfs_rtrmap_key) + + sizeof(xfs_rtrmap_ptr_t)); +} + +/* + * Get the maximum records we could store in the on-disk format. + * + * For non-root nodes this is equivalent to xfs_bmbt_get_maxrecs, but + * for the root node this checks the available space in the dinode fork + * so that we can resize the in-memory buffer to match it. After a + * resize to the maximum size this function returns the same value + * as xfs_bmbt_get_maxrecs for the root node, too. + */ +STATIC int +xfs_rtrmapbt_get_dmaxrecs( + struct xfs_btree_cur *cur, + int level) +{ + if (level != cur->bc_nlevels - 1) + return cur->bc_mp->m_rtrmap_mxr[level != 0]; + return xfs_rtrmapbt_root_maxrecs(cur->bc_private.b.forksize, + level == 0); +} + STATIC void xfs_rtrmapbt_init_key_from_rec( union xfs_btree_key *key, @@ -341,6 +377,129 @@ xfs_rtrmapbt_diff_two_keys( return 0; } +/* + * Reallocate the space for if_broot based on the number of records + * being added or deleted as indicated in rec_diff. Move the records + * and pointers in if_broot to fit the new size. When shrinking this + * will eliminate holes between the records and pointers created by + * the caller. When growing this will create holes to be filled in + * by the caller. + * + * The caller must not request to add more records than would fit in + * the on-disk inode root. If the if_broot is currently NULL, then + * if we are adding records, one will be allocated. The caller must also + * not request that the number of records go below zero, although + * it can go to zero. + */ +STATIC void +xfs_rtrmapbt_iroot_realloc( + struct xfs_btree_cur *cur, + int rec_diff) +{ + struct xfs_inode *ip = cur->bc_private.b.ip; + int whichfork = cur->bc_private.b.whichfork; + struct xfs_mount *mp = ip->i_mount; + int cur_max; + struct xfs_ifork *ifp; + struct xfs_btree_block *new_broot; + struct xfs_btree_block *broot; + int new_max; + size_t new_size; + char *np; + char *op; + int level; + + /* + * Handle the degenerate case quietly. + */ + if (rec_diff == 0) { + return; + } + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (rec_diff > 0) { + /* + * If there wasn't any memory allocated before, just + * allocate it now and get out. + */ + if (ifp->if_broot_bytes == 0) { + new_size = XFS_RTRMAP_BROOT_SPACE_CALC(rec_diff, + cur->bc_nlevels - 1); + ifp->if_broot = kmem_alloc(new_size, + KM_SLEEP | KM_NOFS); + ifp->if_broot_bytes = (int)new_size; + return; + } + + /* + * If there is already an existing if_broot, then we need + * to realloc() it and shift the pointers to their new + * location. The records don't change location because + * they are kept butted up against the btree block header. + */ + broot = (struct xfs_btree_block *)ifp->if_broot; + level = be16_to_cpu(broot->bb_level); + cur_max = xfs_rtrmapbt_maxrecs(mp, ifp->if_broot_bytes, + level == 0); + new_max = cur_max + rec_diff; + new_size = XFS_RTRMAP_BROOT_SPACE_CALC(new_max, level); + ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, + KM_SLEEP | KM_NOFS); + if (level > 0) { + op = (char *)XFS_RTRMAP_BROOT_PTR_ADDR(ifp->if_broot, + 1, ifp->if_broot_bytes); + np = (char *)XFS_RTRMAP_BROOT_PTR_ADDR(ifp->if_broot, + 1, (int)new_size); + memmove(np, op, cur_max * sizeof(xfs_fsblock_t)); + } + ifp->if_broot_bytes = (int)new_size; + ASSERT(XFS_RTRMAP_ROOT_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + return; + } + + /* + * rec_diff is less than 0. In this case, we are shrinking the + * if_broot buffer. It must already exist. If we go to zero + * records, just get rid of the root and clear the status bit. + */ + ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); + broot = (struct xfs_btree_block *)ifp->if_broot; + level = be16_to_cpu(broot->bb_level); + cur_max = xfs_rtrmapbt_maxrecs(mp, ifp->if_broot_bytes, level == 0); + new_max = cur_max + rec_diff; + if (new_max < 0) + new_max = 0; + new_size = XFS_RTRMAP_BROOT_SPACE_CALC(new_max, level); + new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); + memcpy(new_broot, ifp->if_broot, XFS_RTRMAP_BLOCK_LEN); + + /* Copy the records or keys and pointers. */ + if (level > 0) { + op = (char *)XFS_RTRMAP_KEY_ADDR(ifp->if_broot, 1); + np = (char *)XFS_RTRMAP_KEY_ADDR(new_broot, 1); + memcpy(np, op, new_max * 2 * sizeof(struct xfs_rtrmap_key)); + + op = (char *)XFS_RTRMAP_BROOT_PTR_ADDR(ifp->if_broot, 1, + ifp->if_broot_bytes); + np = (char *)XFS_RTRMAP_BROOT_PTR_ADDR(new_broot, 1, + (int)new_size); + memcpy(np, op, new_max * sizeof(xfs_fsblock_t)); + } else { + op = (char *)XFS_RTRMAP_REC_ADDR(ifp->if_broot, 1); + np = (char *)XFS_RTRMAP_REC_ADDR(new_broot, 1); + memcpy(np, op, new_max * sizeof(struct xfs_rtrmap_rec)); + } + + kmem_free(ifp->if_broot); + ifp->if_broot = new_broot; + ifp->if_broot_bytes = (int)new_size; + if (ifp->if_broot) + ASSERT(XFS_RTRMAP_ROOT_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + return; +} + static bool xfs_rtrmapbt_verify( struct xfs_buf *bp) @@ -443,12 +602,14 @@ static const struct xfs_btree_ops xfs_rtrmapbt_ops = { .free_block = xfs_rtrmapbt_free_block, .get_minrecs = xfs_rtrmapbt_get_minrecs, .get_maxrecs = xfs_rtrmapbt_get_maxrecs, + .get_dmaxrecs = xfs_rtrmapbt_get_dmaxrecs, .init_key_from_rec = xfs_rtrmapbt_init_key_from_rec, .init_high_key_from_rec = xfs_rtrmapbt_init_high_key_from_rec, .init_rec_from_cur = xfs_rtrmapbt_init_rec_from_cur, .init_ptr_from_cur = xfs_rtrmapbt_init_ptr_from_cur, .key_diff = xfs_rtrmapbt_key_diff, .buf_ops = &xfs_rtrmapbt_buf_ops, + .iroot_realloc = xfs_rtrmapbt_iroot_realloc, .diff_two_keys = xfs_rtrmapbt_diff_two_keys, .keys_inorder = xfs_rtrmapbt_keys_inorder, .recs_inorder = xfs_rtrmapbt_recs_inorder, @@ -514,3 +675,92 @@ xfs_rtrmapbt_compute_maxlevels( mp->m_rtrmap_mnr, mp->m_sb.sb_rblocks); ASSERT(mp->m_rtrmap_maxlevels <= XFS_BTREE_MAXLEVELS); } + +/* + * Convert on-disk form of btree root to in-memory form. + */ +void +xfs_rtrmapbt_from_disk( + struct xfs_inode *ip, + struct xfs_rtrmap_root *dblock, + int dblocklen, + struct xfs_btree_block *rblock, + int rblocklen) +{ + struct xfs_mount *mp = ip->i_mount; + int dmxr; + struct xfs_rtrmap_key *fkp; + __be64 *fpp; + struct xfs_rtrmap_key *tkp; + __be64 *tpp; + struct xfs_rtrmap_rec *frp; + struct xfs_rtrmap_rec *trp; + + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_RTRMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + + rblock->bb_level = dblock->bb_level; + rblock->bb_numrecs = dblock->bb_numrecs; + + if (be16_to_cpu(rblock->bb_level) > 0) { + dmxr = xfs_rtrmapbt_maxrecs(mp, dblocklen, 0); + fkp = XFS_RTRMAP_ROOT_KEY_ADDR(dblock, 1); + tkp = XFS_RTRMAP_KEY_ADDR(rblock, 1); + fpp = XFS_RTRMAP_ROOT_PTR_ADDR(dblock, 1, dmxr); + tpp = XFS_RTRMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen); + dmxr = be16_to_cpu(dblock->bb_numrecs); + memcpy(tkp, fkp, 2 * sizeof(*fkp) * dmxr); + memcpy(tpp, fpp, sizeof(*fpp) * dmxr); + } else { + frp = XFS_RTRMAP_ROOT_REC_ADDR(dblock, 1); + trp = XFS_RTRMAP_REC_ADDR(rblock, 1); + dmxr = be16_to_cpu(dblock->bb_numrecs); + memcpy(trp, frp, sizeof(*frp) * dmxr); + } +} + +/* + * Convert in-memory form of btree root to on-disk form. + */ +void +xfs_rtrmapbt_to_disk( + struct xfs_mount *mp, + struct xfs_btree_block *rblock, + int rblocklen, + struct xfs_rtrmap_root *dblock, + int dblocklen) +{ + int dmxr; + struct xfs_rtrmap_key *fkp; + __be64 *fpp; + struct xfs_rtrmap_key *tkp; + __be64 *tpp; + struct xfs_rtrmap_rec *frp; + struct xfs_rtrmap_rec *trp; + + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_RTRMAP_CRC_MAGIC)); + ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)); + ASSERT(rblock->bb_u.l.bb_blkno == cpu_to_be64(XFS_BUF_DADDR_NULL)); + ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLFSBLOCK)); + ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLFSBLOCK)); + + dblock->bb_level = rblock->bb_level; + dblock->bb_numrecs = rblock->bb_numrecs; + + if (be16_to_cpu(rblock->bb_level) > 0) { + dmxr = xfs_rtrmapbt_maxrecs(mp, dblocklen, 0); + fkp = XFS_RTRMAP_KEY_ADDR(rblock, 1); + tkp = XFS_RTRMAP_ROOT_KEY_ADDR(dblock, 1); + fpp = XFS_RTRMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen); + tpp = XFS_RTRMAP_ROOT_PTR_ADDR(dblock, 1, dmxr); + dmxr = be16_to_cpu(rblock->bb_numrecs); + memcpy(tkp, fkp, 2 * sizeof(*fkp) * dmxr); + memcpy(tpp, fpp, sizeof(*fpp) * dmxr); + } else { + frp = XFS_RTRMAP_REC_ADDR(rblock, 1); + trp = XFS_RTRMAP_ROOT_REC_ADDR(dblock, 1); + dmxr = be16_to_cpu(rblock->bb_numrecs); + memcpy(trp, frp, sizeof(*frp) * dmxr); + } +} diff --git a/fs/xfs/libxfs/xfs_rtrmap_btree.h b/fs/xfs/libxfs/xfs_rtrmap_btree.h index 5eb19f4..51adc0c 100644 --- a/fs/xfs/libxfs/xfs_rtrmap_btree.h +++ b/fs/xfs/libxfs/xfs_rtrmap_btree.h @@ -54,9 +54,58 @@ struct xfs_mount; (maxrecs) * 2 * sizeof(struct xfs_rtrmap_key) + \ ((index) - 1) * sizeof(xfs_rtrmap_ptr_t))) +/* Macros for handling the inode root */ + +#define XFS_RTRMAP_ROOT_REC_ADDR(block, index) \ + ((struct xfs_rtrmap_rec *) \ + ((char *)(block) + \ + sizeof(struct xfs_rtrmap_root) + \ + ((index) - 1) * sizeof(struct xfs_rtrmap_rec))) + +#define XFS_RTRMAP_ROOT_KEY_ADDR(block, index) \ + ((struct xfs_rtrmap_key *) \ + ((char *)(block) + \ + sizeof(struct xfs_rtrmap_root) + \ + ((index) - 1) * 2 * sizeof(struct xfs_rtrmap_key))) + +#define XFS_RTRMAP_ROOT_PTR_ADDR(block, index, maxrecs) \ + ((xfs_rtrmap_ptr_t *) \ + ((char *)(block) + \ + sizeof(struct xfs_rtrmap_root) + \ + (maxrecs) * 2 * sizeof(struct xfs_rtrmap_key) + \ + ((index) - 1) * sizeof(xfs_rtrmap_ptr_t))) + +#define XFS_RTRMAP_BROOT_PTR_ADDR(bb, i, sz) \ + XFS_RTRMAP_PTR_ADDR(bb, i, xfs_rtrmapbt_maxrecs(mp, sz, 0)) + +#define XFS_RTRMAP_BROOT_SPACE_CALC(nrecs, level) \ + (int)(XFS_RTRMAP_BLOCK_LEN + ((level) > 0 ? \ + ((nrecs) * (2 * sizeof(struct xfs_rtrmap_key) + sizeof(xfs_rtrmap_ptr_t))) : \ + ((nrecs) * sizeof(struct xfs_rtrmap_rec)))) + +#define XFS_RTRMAP_BROOT_SPACE(bb) \ + (XFS_RTRMAP_BROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs), \ + be16_to_cpu((bb)->bb_level))) + +#define XFS_RTRMAP_ROOT_SPACE_CALC(nrecs, level) \ + (int)(sizeof(struct xfs_rtrmap_root) + ((level) > 0 ? \ + ((nrecs) * (2 * sizeof(struct xfs_rtrmap_key) + sizeof(xfs_rtrmap_ptr_t))) : \ + ((nrecs) * sizeof(struct xfs_rtrmap_rec)))) + +#define XFS_RTRMAP_ROOT_SPACE(bb) \ + (XFS_RTRMAP_ROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs), \ + be16_to_cpu((bb)->bb_level))) + struct xfs_btree_cur *xfs_rtrmapbt_init_cursor(struct xfs_mount *mp, struct xfs_trans *tp, struct xfs_inode *ip); int xfs_rtrmapbt_maxrecs(struct xfs_mount *mp, int blocklen, bool leaf); extern void xfs_rtrmapbt_compute_maxlevels(struct xfs_mount *mp); +void xfs_rtrmapbt_from_disk(struct xfs_inode *ip, + struct xfs_rtrmap_root *dblock, int dblocklen, + struct xfs_btree_block *rblock, int rblocklen); +void xfs_rtrmapbt_to_disk(struct xfs_mount *mp, + struct xfs_btree_block *rblock, int rblocklen, + struct xfs_rtrmap_root *dblock, int dblocklen); + #endif /* __XFS_RTRMAP_BTREE_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:45:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 07F628046 for ; Thu, 25 Aug 2016 18:45:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BFFF08F8033 for ; Thu, 25 Aug 2016 16:45:01 -0700 (PDT) X-ASG-Debug-ID: 1472168699-0bf57b5314209830001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id uGslOJoYoTwZ56YC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:45:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNiwNv020507 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:44:58 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNiwpZ029911 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:44:58 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNiu4w017742; Thu, 25 Aug 2016 23:44:57 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:44:56 -0700 Subject: [PATCH 14/20] xfs: don't assume a left rmap when allocating a new rmap From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 14/20] xfs: don't assume a left rmap when allocating a new rmap To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:44:55 -0700 Message-ID: <147216869521.3688.15284336999719329869.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168700 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1626 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The original rmap code assumed that there would always be at least one rmap in the rmapbt (the AG sb/agf/agi) and so errored out if it didn't find one. This assumption isn't true for rtrmapbt, so remove the check and just deal with the situation. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rmap.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 71704d6..73e8dc4 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -708,19 +708,19 @@ xfs_rmap_map( &have_lt); if (error) goto out_error; - XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error); - - error = xfs_rmap_get_rec(cur, <rec, &have_lt); - if (error) - goto out_error; - XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error); - trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - xfs_rmap_cur_agno(cur), ltrec.rm_startblock, - ltrec.rm_blockcount, ltrec.rm_owner, - ltrec.rm_offset, ltrec.rm_flags); + if (have_lt) { + error = xfs_rmap_get_rec(cur, <rec, &have_lt); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error); + trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, + xfs_rmap_cur_agno(cur), ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags); - if (!xfs_rmap_is_mergeable(<rec, owner, flags)) - have_lt = 0; + if (!xfs_rmap_is_mergeable(<rec, owner, flags)) + have_lt = 0; + } XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 0 || From darrick.wong@oracle.com Thu Aug 25 18:45:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B79218047 for ; Thu, 25 Aug 2016 18:45:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7C4C230404E for ; Thu, 25 Aug 2016 16:45:10 -0700 (PDT) X-ASG-Debug-ID: 1472168708-0bf57c55b31c7cd0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id NafcRIwJAvwBAp9X (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:45:08 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNj6ju027364 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:45:07 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNj6ed019899 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:45:06 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNj3SV032381; Thu, 25 Aug 2016 23:45:05 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:45:02 -0700 Subject: [PATCH 15/20] xfs: wire up rmap map and unmap to the realtime rmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 15/20] xfs: wire up rmap map and unmap to the realtime rmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:45:01 -0700 Message-ID: <147216870139.3688.13864882802473337845.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168708 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8669 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Connect the map and unmap reverse-mapping operations to the realtime rmapbt via the deferred operation callbacks. This enables us to perform rmap operations against the correct btree. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_rmap.c | 63 ++++++++++++++++++++++++++++++---------------- fs/xfs/libxfs/xfs_rmap.h | 9 ++++--- fs/xfs/xfs_rmap_item.c | 8 +++++- fs/xfs/xfs_trans.h | 9 ++++--- fs/xfs/xfs_trans_rmap.c | 7 +++-- 5 files changed, 62 insertions(+), 34 deletions(-) diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c index 73e8dc4..f3e47d6 100644 --- a/fs/xfs/libxfs/xfs_rmap.c +++ b/fs/xfs/libxfs/xfs_rmap.c @@ -38,6 +38,7 @@ #include "xfs_extent_busy.h" #include "xfs_bmap.h" #include "xfs_inode.h" +#include "xfs_rtrmap_btree.h" /* By convention, the rtrmapbt's "AG" number is NULLAGNUMBER. */ static xfs_agnumber_t @@ -2062,13 +2063,14 @@ xfs_rmap_finish_one_cleanup( struct xfs_btree_cur *rcur, int error) { - struct xfs_buf *agbp; + struct xfs_buf *agbp = NULL; if (rcur == NULL) return; - agbp = rcur->bc_private.a.agbp; + if (!(rcur->bc_flags & XFS_BTREE_LONG_PTRS)) + agbp = rcur->bc_private.a.agbp; xfs_btree_del_cursor(rcur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); - if (error) + if (error && agbp) xfs_trans_brelse(tp, agbp); } @@ -2082,6 +2084,7 @@ xfs_rmap_finish_one_cleanup( int xfs_rmap_finish_one( struct xfs_trans *tp, + struct xfs_defer_ops *dfops, enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, @@ -2089,6 +2092,7 @@ xfs_rmap_finish_one( xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, + bool realtime, struct xfs_btree_cur **pcur) { struct xfs_mount *mp = tp->t_mountp; @@ -2100,9 +2104,8 @@ xfs_rmap_finish_one( xfs_fsblock_t bno; bool unwritten; - agno = XFS_FSB_TO_AGNO(mp, startblock); - ASSERT(agno != NULLAGNUMBER); - bno = XFS_FSB_TO_AGBNO(mp, startblock); + agno = realtime ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, startblock); + bno = realtime ? startblock : XFS_FSB_TO_AGBNO(mp, startblock); trace_xfs_rmap_deferred(mp, agno, type, bno, owner, whichfork, startoff, blockcount, state); @@ -2122,31 +2125,45 @@ xfs_rmap_finish_one( *pcur = NULL; } if (rcur == NULL) { - /* - * Refresh the freelist before we start changing the - * rmapbt, because a shape change could cause us to - * allocate blocks. - */ - error = xfs_free_extent_fix_freelist(tp, agno, &agbp); - if (error) - return error; - if (!agbp) - return -EFSCORRUPTED; - - rcur = xfs_rmapbt_init_cursor(mp, tp, agbp, agno); - if (!rcur) { - error = -ENOMEM; - goto out_cur; + if (realtime) { + xfs_ilock(mp->m_rrmapip, + XFS_ILOCK_EXCL|XFS_ILOCK_RTBITMAP); + xfs_trans_ijoin(tp, mp->m_rrmapip, XFS_ILOCK_EXCL); + rcur = xfs_rtrmapbt_init_cursor(mp, tp, mp->m_rrmapip); + if (!rcur) { + error = -ENOMEM; + goto out_cur; + } + rcur->bc_private.b.dfops = dfops; + rcur->bc_private.b.flags = 0; + } else { + /* + * Refresh the freelist before we start changing the + * rmapbt, because a shape change could cause us to + * allocate blocks. + */ + error = xfs_free_extent_fix_freelist(tp, agno, &agbp); + if (error) + return error; + if (!agbp) + return -EFSCORRUPTED; + + rcur = xfs_rmapbt_init_cursor(mp, tp, agbp, agno); + if (!rcur) { + error = -ENOMEM; + goto out_cur; + } } } *pcur = rcur; xfs_rmap_ino_owner(&oinfo, owner, whichfork, startoff); unwritten = state == XFS_EXT_UNWRITTEN; - bno = XFS_FSB_TO_AGBNO(rcur->bc_mp, startblock); switch (type) { case XFS_RMAP_ALLOC: + ASSERT(!realtime); + /* fall through */ case XFS_RMAP_MAP: error = xfs_rmap_map(rcur, bno, blockcount, unwritten, &oinfo); break; @@ -2155,6 +2172,8 @@ xfs_rmap_finish_one( &oinfo); break; case XFS_RMAP_FREE: + ASSERT(!realtime); + /* fall through */ case XFS_RMAP_UNMAP: error = xfs_rmap_unmap(rcur, bno, blockcount, unwritten, &oinfo); diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h index 0850310..8d9c48f2 100644 --- a/fs/xfs/libxfs/xfs_rmap.h +++ b/fs/xfs/libxfs/xfs_rmap.h @@ -202,10 +202,11 @@ int xfs_rmap_free_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, void xfs_rmap_finish_one_cleanup(struct xfs_trans *tp, struct xfs_btree_cur *rcur, int error); -int xfs_rmap_finish_one(struct xfs_trans *tp, enum xfs_rmap_intent_type type, - __uint64_t owner, int whichfork, xfs_fileoff_t startoff, - xfs_fsblock_t startblock, xfs_filblks_t blockcount, - xfs_exntst_t state, struct xfs_btree_cur **pcur); +int xfs_rmap_finish_one(struct xfs_trans *tp, struct xfs_defer_ops *dfops, + enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, + xfs_fileoff_t startoff, xfs_fsblock_t startblock, + xfs_filblks_t blockcount, xfs_exntst_t state, bool realtime, + struct xfs_btree_cur **pcur); int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c index 01d6edf..a57aebb 100644 --- a/fs/xfs/xfs_rmap_item.c +++ b/fs/xfs/xfs_rmap_item.c @@ -446,6 +446,8 @@ xfs_rui_recover( struct xfs_trans *tp; struct xfs_btree_cur *rcur = NULL; bool rt; + struct xfs_defer_ops dfops; + xfs_fsblock_t firstfsb; ASSERT(!test_bit(XFS_RUI_RECOVERED, &ruip->rui_flags)); @@ -493,6 +495,7 @@ xfs_rui_recover( return error; rudp = xfs_trans_get_rud(tp, ruip); + xfs_defer_init(&dfops, &firstfsb); for (i = 0; i < ruip->rui_format.rui_nextents; i++) { rmap = &ruip->rui_format.rui_extents[i]; state = (rmap->me_flags & XFS_RMAP_EXTENT_UNWRITTEN) ? @@ -529,7 +532,7 @@ xfs_rui_recover( error = -EFSCORRUPTED; goto abort_error; } - error = xfs_trans_log_finish_rmap_update(tp, rudp, type, + error = xfs_trans_log_finish_rmap_update(tp, &dfops, rudp, type, rmap->me_owner, whichfork, rmap->me_startoff, rmap->me_startblock, rmap->me_len, state, rt, &rcur); @@ -539,6 +542,9 @@ xfs_rui_recover( } xfs_rmap_finish_one_cleanup(tp, rcur, error); + error = xfs_defer_finish(&tp, &dfops, NULL); + if (error) + goto abort_error; set_bit(XFS_RUI_RECOVERED, &ruip->rui_flags); error = xfs_trans_commit(tp); return error; diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index fbd7bc8..17ac0e8 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -248,10 +248,11 @@ void xfs_rmap_update_init_defer_op(void); struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp, struct xfs_rui_log_item *ruip); int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp, - struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, - __uint64_t owner, int whichfork, xfs_fileoff_t startoff, - xfs_fsblock_t startblock, xfs_filblks_t blockcount, - xfs_exntst_t state, bool rt, struct xfs_btree_cur **pcur); + struct xfs_defer_ops *dfops, struct xfs_rud_log_item *rudp, + enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, + xfs_fileoff_t startoff, xfs_fsblock_t startblock, + xfs_filblks_t blockcount, xfs_exntst_t state, bool rt, + struct xfs_btree_cur **pcur); /* refcount updates */ enum xfs_refcount_intent_type; diff --git a/fs/xfs/xfs_trans_rmap.c b/fs/xfs/xfs_trans_rmap.c index 9240157b..e80002e 100644 --- a/fs/xfs/xfs_trans_rmap.c +++ b/fs/xfs/xfs_trans_rmap.c @@ -97,6 +97,7 @@ xfs_trans_get_rud( int xfs_trans_log_finish_rmap_update( struct xfs_trans *tp, + struct xfs_defer_ops *dfops, struct xfs_rud_log_item *rudp, enum xfs_rmap_intent_type type, __uint64_t owner, @@ -110,8 +111,8 @@ xfs_trans_log_finish_rmap_update( { int error; - error = xfs_rmap_finish_one(tp, type, owner, whichfork, startoff, - startblock, blockcount, state, pcur); + error = xfs_rmap_finish_one(tp, dfops, type, owner, whichfork, startoff, + startblock, blockcount, state, rt, pcur); /* * Mark the transaction dirty, even on error. This ensures the @@ -220,7 +221,7 @@ xfs_rmap_update_finish_item( int error; rmap = container_of(item, struct xfs_rmap_intent, ri_list); - error = xfs_trans_log_finish_rmap_update(tp, done_item, + error = xfs_trans_log_finish_rmap_update(tp, dop, done_item, rmap->ri_type, rmap->ri_owner, rmap->ri_whichfork, rmap->ri_bmap.br_startoff, From darrick.wong@oracle.com Thu Aug 25 18:45:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 118318059 for ; Thu, 25 Aug 2016 18:45:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CA44F304039 for ; Thu, 25 Aug 2016 16:45:13 -0700 (PDT) X-ASG-Debug-ID: 1472168711-0bf8155c771e7d20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Tbd3UBTRmDU5m4bv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:45:12 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNjAL4020929 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:45:10 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNjAe5018606 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:45:10 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNj9iB020515; Thu, 25 Aug 2016 23:45:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:45:09 -0700 Subject: [PATCH 16/20] xfs: enable realtime rmap btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 16/20] xfs: enable realtime rmap btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:45:07 -0700 Message-ID: <147216870765.3688.6549904751705048479.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168711 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 850 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_super.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 2d249a5..34f6b94 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1601,16 +1601,9 @@ xfs_fs_fill_super( "DAX and reflink have not been tested together!"); } - if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { - if (mp->m_sb.sb_rblocks) { - xfs_alert(mp, - "EXPERIMENTAL reverse mapping btree not compatible with realtime device!"); - error = -EINVAL; - goto out_filestream_unmount; - } + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) xfs_alert(mp, "EXPERIMENTAL reverse mapping btree feature enabled. Use at your own risk!"); - } if (xfs_sb_version_hasreflink(&mp->m_sb)) xfs_alert(mp, From darrick.wong@oracle.com Thu Aug 25 18:45:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 471F28061 for ; Thu, 25 Aug 2016 18:45:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18073304039 for ; Thu, 25 Aug 2016 16:45:20 -0700 (PDT) X-ASG-Debug-ID: 1472168717-0bf57c55b41c7cf0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id b2DusGrEfdHBjPPa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:45:17 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNjGdT021000 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:45:16 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNjGpB018825 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:45:16 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNjFVj032483; Thu, 25 Aug 2016 23:45:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:45:15 -0700 Subject: [PATCH 17/20] xfs: wire up getfsmap to the realtime reverse mapping btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 17/20] xfs: wire up getfsmap to the realtime reverse mapping btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:45:13 -0700 Message-ID: <147216871382.3688.13083744368929762457.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168717 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3671 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Connect the getfsmap ioctl to the realtime rmapbt. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_fsmap.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/fs/xfs/xfs_fsmap.c b/fs/xfs/xfs_fsmap.c index 1c5ce01..a816955 100644 --- a/fs/xfs/xfs_fsmap.c +++ b/fs/xfs/xfs_fsmap.c @@ -41,6 +41,7 @@ #include "xfs_refcount_btree.h" #include "xfs_alloc_btree.h" #include "xfs_rtalloc.h" +#include "xfs_rtrmap_btree.h" /* getfsmap query state */ struct xfs_getfsmap_info { @@ -431,6 +432,81 @@ xfs_getfsmap_logdev( return xfs_getfsmap_rtdev_helper(&cur, &rmap, info); } +/* Execute a getfsmap query against the realtime data device. */ +STATIC int +xfs_getfsmap_rtdev( + struct xfs_mount *mp, + struct getfsmap *keys, + struct xfs_getfsmap_info *info) +{ + struct xfs_btree_cur *bt_cur = NULL; + struct getfsmap *lowkey; + struct getfsmap *highkey; + xfs_fsblock_t start_fsb; + xfs_fsblock_t end_fsb; + xfs_daddr_t eofs; + int error = 0; + + lowkey = keys; + highkey = keys + 1; + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks); + if (lowkey->fmv_block >= eofs) + return 0; + if (highkey->fmv_block >= eofs) + highkey->fmv_block = eofs - 1; + start_fsb = XFS_BB_TO_FSBT(mp, lowkey->fmv_block); + end_fsb = XFS_BB_TO_FSB(mp, highkey->fmv_block); + + /* Set up search keys */ + info->low.rm_startblock = start_fsb; + info->low.rm_owner = lowkey->fmv_owner; + info->low.rm_offset = XFS_BB_TO_FSBT(mp, lowkey->fmv_offset); + info->low.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->low, lowkey); + + info->high.rm_startblock = end_fsb; + info->high.rm_owner = highkey->fmv_owner; + info->high.rm_offset = XFS_BB_TO_FSBT(mp, highkey->fmv_offset); + info->high.rm_blockcount = 0; + xfs_getfsmap_set_irec_flags(&info->high, highkey); + + info->missing_owner = FMV_OWN_FREE; + + trace_xfs_fsmap_low_key(mp, info->dev, info->agno, + info->low.rm_startblock, + info->low.rm_blockcount, + info->low.rm_owner, + info->low.rm_offset); + + trace_xfs_fsmap_high_key(mp, info->dev, info->agno, + info->high.rm_startblock, + info->high.rm_blockcount, + info->high.rm_owner, + info->high.rm_offset); + + /* Query the rtrmapbt */ + xfs_ilock(mp->m_rrmapip, XFS_ILOCK_EXCL); + bt_cur = xfs_rtrmapbt_init_cursor(mp, NULL, mp->m_rrmapip); + + error = xfs_rmap_query_range(bt_cur, &info->low, &info->high, + xfs_getfsmap_rtdev_helper, info); + if (error) + goto err; + + /* Report any free space at the end of the rtdev */ + info->last = true; + error = xfs_getfsmap_rtdev_helper(bt_cur, &info->high, info); + if (error) + goto err; + +err: + xfs_btree_del_cursor(bt_cur, error < 0 ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + xfs_iunlock(mp->m_rrmapip, XFS_ILOCK_EXCL); + + return error; +} + /* Execute a getfsmap query against the realtime data device (rtbitmap). */ STATIC int xfs_getfsmap_rtdev_rtbitmap( @@ -769,6 +845,9 @@ xfs_getfsmap_is_valid_device( if (mp->m_logdev_targp && fmv->fmv_device == new_encode_dev(mp->m_logdev_targp->bt_dev)) return true; + if (mp->m_rtdev_targp && + fmv->fmv_device == new_encode_dev(mp->m_rtdev_targp->bt_dev)) + return true; return false; } @@ -824,6 +903,8 @@ xfs_getfsmap( handlers[2].dev = new_encode_dev(mp->m_rtdev_targp->bt_dev); if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) handlers[2].fn = xfs_getfsmap_rtdev_rtbitmap; + else + handlers[2].fn = xfs_getfsmap_rtdev; } xfs_sort(handlers, XFS_GETFSMAP_DEVS, sizeof(struct xfs_getfsmap_dev), From Sales.76@tshirtfashion.com Thu Aug 25 18:45:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CA114806E for ; Thu, 25 Aug 2016 18:45:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9CE068F8033 for ; Thu, 25 Aug 2016 16:45:22 -0700 (PDT) X-ASG-Debug-ID: 1472168718-0bf57b5313209870001-NocioJ Received: from tshirtfashion.com ([182.85.248.16]) by cuda.sgi.com with SMTP id nWAWUv8kAwh4PnUG for ; Thu, 25 Aug 2016 16:45:19 -0700 (PDT) X-Barracuda-Envelope-From: Sales.76@tshirtfashion.com X-Barracuda-Effective-Source-IP: UNKNOWN[182.85.248.16] X-Barracuda-Apparent-Source-IP: 182.85.248.16 Received: from dell-PC[127.0.0.1] by DELL-PC[127.0.0.1] (SMTPD32); Thu, 25 Aug 2016 19:15:21 +0800 From: "betsy_fashiongroup@163.com" Subject: Re: Knitted Garment Factory with Disney Audit To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Knitted Garment Factory with Disney Audit MIME-Version: 1.0 Sender: Sales.76@tshirtfashion.com Reply-To: betsy_fashiongroup@163.com Date: Thu, 25 Aug 2016 19:15:21 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[182.85.248.16] X-Barracuda-Start-Time: 1472168718 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11151 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.56 X-Barracuda-Spam-Status: No, SCORE=1.56 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160825234522.386A16430F3@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTEuMDAuOTYwMC4xODA1NyI+PC9IRUFEPg0KPEJPRFk+PFNQQU4gbGFuZz1FTi1VUyAN CnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDog d2hpdGU7IENPTE9SOiAjMzMzMzk5Ij48bzpwPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9 IkJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjog MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIj48U1BBTiANCnN0eWxlPSJGT05ULVNJ WkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1 KTsgQ09MT1I6IHJnYig1MSw1MSwxNTMpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0 OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+SGVsbG8sPC9TUEFOPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2Io MjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vybmlu ZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48QlI+PC9TUEFOPjxT UEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JP VU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZv bnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48QlI+ PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFs OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9 kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwy NTUpIj5HbGFkIA0KdG8gbGVhcm4geW91JiMzOTtyZSBvbiB0aGUgbWFya2V0IG9mIGFwcGFyZWwg cHJvZHVjdHMuJm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9O VC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdi KDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5n OiByZ2IoMjU1LDI1NSwyNTUpIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29O b3JtYWwgDQpzdHlsZT0iQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1BTElHTjog bGVmdDsgTUFSR0lOOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0K c3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiBy Z2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vy bmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48bzpwPiZuYnNw OzwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1wIA0Kc3R5bGU9IlZFUlRJQ0FMLUFMSUdOOiBi YXNlbGluZTsgTUFSR0lOOiA1cHQgMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBt c28tbGluZS1oZWlnaHQtYWx0OiAxMnB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7 IEZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYig1MSw1MSwxNTMpOyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0Ij5PdXIgDQo8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpF OiAxMnB0OyBGT05ULUZBTUlMWTog5a6L5L2TOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1i aWRpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNv LWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbCI+RmFzaGlvbjwvU1BBTj48U1BBTiANCnN0eWxlPSJG T05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYig1MSw1MSwxNTMp OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij4mbmJzcDtoYXZlIA0KPC9TUEFOPjxT UEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgQ09MT1I6 IHJnYig1MSw1MSwxNTMpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1hc2NpaS1m b250LWZhbWlseTogQXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWwiPjIwPC9TUEFO PjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xP UjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPiZuYnNw O3llYXJzIA0KaGlzdG9yeSBub3cgYXMgZmFjdG9yeSBydW5uaW5nLCB3aXRoIHR3byBmYWN0b3J5 IHdvcmtzaG9wcyBhbG9uZyB3aXRoIDMgDQpwcm9kdWNpbmcgbGluZXMuIEFscmVhZHkgY29vcGVy YXRlZCB3aXRoIERpc25leSwgV2FsLU1hcnQsIFpBSU4sIFNBTVNVTkcsIFVTIA0KTmF2eS4gPC9T UEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBD T0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPjxv OnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPXAgDQpzdHlsZT0iVkVSVElDQUwtQUxJR046 IGJhc2VsaW5lOyBNQVJHSU46IDVwdCAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47 IG1zby1saW5lLWhlaWdodC1hbHQ6IDEycHQiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJw dDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZv bnQta2VybmluZzogMC4wMDAwcHQiPk1haW4gDQpwcm9kdWN0czogPC9TUEFOPjxCPjxTUEFOIA0K c3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVdFSUdIVDog Ym9sZDsgQ09MT1I6IHJnYig1MSw1MSwxNTMpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAw MHB0Ij5ULXNoaXJ0LCANClBvbG8gc2hpcnQsIENvbXByZXNzZWQgdC1zaGlydCwgSG9vZGllJmFt cDtzd2VhdGVyLCB2ZXN0IGFuZCANCnVuZGVyd2VhcjwvU1BBTj48L0I+PFNQQU4gDQpzdHlsZT0i Rk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQXJpYWw7IENPTE9SOiByZ2IoNTEsNTEsMTUz KTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdCI+Jm5ic3A7ZXRjLjwvU1BBTj48U1BB TiANCnN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgQkFDS0dST1VO RDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYig1MSw1MSwxNTMpOyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+Jm5ic3A7 PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFs OyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQi PjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNL R1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsg bXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAx MnB0OyBGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENP TE9SOiByZ2IoNTEsNTEsMTUzKTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNv LXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPklmIA0KYW55IHByb2R1Y3QgbWVlZCB5b3VyIGRl bWFuZCwgcGxlYXNlIGNvbnRhY3QgdXMgZm9yIGZ1cnRoZXIgDQppbmZvcm1hdGlvbi4mbmJzcDs8 L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQXJpYWw7 IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoNTEsNTEsMTUzKTsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1 NSkiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJC QUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBw dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpF OiAxMnB0OyBGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7 IENPTE9SOiByZ2IoNTEsNTEsMTUzKTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsg bXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwv UD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwy NTUpOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93 LW9ycGhhbiI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTogQXJp YWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoNTEsNTEsMTUzKTsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1 LDI1NSkiPldlJiMzOTtyZSANCnN1cmUgeW91ciBhbnkgaW5xdWlyeSBvciByZXF1aXJlbWVudCB3 aWxsIGdldCBwcm9tcHQgDQphdHRlbnRpb24uJm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZP TlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1 NSwyNTUpOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4w MDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48bzpwPjwvbzpwPjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFDS0dST1VORDogcmdiKDI1NSwyNTUs MjU1KTsgVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRv dy1vcnBoYW4iPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFy aWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7 IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWu i+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1 NSwyNTUpIj48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwg DQpzdHlsZT0iQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgVEVYVC1BTElHTjogbGVmdDsg TUFSR0lOOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0Kc3R5bGU9 IkZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1 LDI1NSwyNTUpOyBDT0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzog MC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5CZXN0IA0KcmVnYXJkcywm bmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05ULUZBTUlMWTog QXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoNTEsNTEsMTUz KTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUs MjU1LDI1NSkiPjxCUj48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05U LUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2Io NTEsNTEsMTUzKTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6 IHJnYigyNTUsMjU1LDI1NSkiPkJldHN5PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTog MTJwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBD T0xPUjogcmdiKDUxLDUxLDE1Myk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBj bGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFDS0dST1VORDogd2hpdGU7IFRFWFQtQUxJR046IGxl ZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0K YWxpZ249bGVmdD4mbmJzcDs8L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjog MHB0Ij48QSBuYW1lPU9MRV9MSU5LNj48L0E+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41 cHQ7IEZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVdFSUdIVDog bm9ybWFsOyBDT0xPUjogcmdiKDMxLDc4LDEyMSk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4w MDAwcHQiPkIyQiANCndlYnNpdGU6IDwvU1BBTj48U1BBTj48QSBocmVmPSJodHRwczovL3Byb21v dGUuZW4uYWxpYmFiYS5jb20vIj48VT48U1BBTiANCmNsYXNzPTE1IA0Kc3R5bGU9IkZPTlQtU0la RTogMTAuNXB0OyBURVhULURFQ09SQVRJT046IHVuZGVybGluZTsgRk9OVC1GQU1JTFk6ICYjMzk7 VGltZXMgTmV3IFJvbWFuJiMzOTs7IEZPTlQtV0VJR0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMzEs NzgsMTIxKTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyB0ZXh0LXVuZGVybGluZTogc2lu Z2xlIj5odHRwczovL3Byb21vdGUuZW4uYWxpYmFiYS5jb208L1NQQU4+PC9VPjwvQT48L1NQQU4+ PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiAmIzM5O1RpbWVz IE5ldyBSb21hbiYjMzk7OyBGT05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdiKDMxLDc4LDEy MSk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwv UD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5OyBNQVJH SU46IDBwdDsgVEVYVC1KVVNUSUZZOiBpbnRlci1pZGVvZ3JhcGg7IExJTkUtSEVJR0hUOiAxNS43 NXB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWp1c3RpZnk+PFNQQU4g DQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBS b21hbiYjMzk7OyBGT05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdiKDMxLDc4LDEyMSk7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9 kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQiPlNreXBlOiZuYnNwO2JldHN5LnJpY2hhYmxl Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlM WTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6 IHJnYigzMSw3OCwxMjEpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwv bzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjog anVzdGlmeTsgTUFSR0lOOiAwcHQ7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBMSU5F LUhFSUdIVDogMTUuNzVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1q dXN0aWZ5PjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogJiMz OTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigz MSw3OCwxMjEpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij5NUDogDQowMDg2LTEz NTc2OTkwOTM2Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9TUEFO PjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogJiMzOTtUaW1l cyBOZXcgUm9tYW4mIzM5OzsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigzMSw3OCwx MjEpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0Ij48bzpwPjwvbzpwPjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeTsgTUFS R0lOOiAwcHQ7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBMSU5FLUhFSUdIVDogMTUu NzVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1qdXN0aWZ5PjxTUEFO IA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcg Um9tYW4mIzM5OzsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigzMSw3OCwxMjEpOyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovk vZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0Ij5UZWw6MDA4Ni03OTEtODgzNzUyMzc8L1NQ QU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiAmIzM5O1Rp bWVzIE5ldyBSb21hbiYjMzk7OyBGT05ULVdFSUdIVDogbm9ybWFsOyBDT0xPUjogcmdiKDMxLDc4 LDEyMSk7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQiPjxvOnA+PC9vOnA+PC9TUEFO PjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0ZTsgVEVY VC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93 LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjwhLS1FbmRGcmFnbWVudC0tPjwhLS1FbmRGcmFnbWVudC0t PjwvbzpwPjwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4NCg0K From darrick.wong@oracle.com Thu Aug 25 18:45:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D0C708069 for ; Thu, 25 Aug 2016 18:45:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 95986304039 for ; Thu, 25 Aug 2016 16:45:27 -0700 (PDT) X-ASG-Debug-ID: 1472168723-0bf57b5313209880001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id NC2f6O7egEhC1Fb3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:45:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNjMIv021043 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:45:22 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNjMb2018965 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:45:22 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNjLOc032545; Thu, 25 Aug 2016 23:45:22 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:45:21 -0700 Subject: [PATCH 18/20] xfs: scrub the realtime rmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 18/20] xfs: scrub the realtime rmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:45:20 -0700 Message-ID: <147216872000.3688.2076878295318596902.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168724 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8054 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Check the realtime reverse mapping btree against the rtbitmap, and modify the rtbitmap scrub to check against the rtrmapbt. Signed-off-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_fs.h | 3 + fs/xfs/xfs_scrub.c | 103 +++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 90 insertions(+), 16 deletions(-) diff --git a/fs/xfs/libxfs/xfs_fs.h b/fs/xfs/libxfs/xfs_fs.h index f273e76..d1accde 100644 --- a/fs/xfs/libxfs/xfs_fs.h +++ b/fs/xfs/libxfs/xfs_fs.h @@ -551,7 +551,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_BMBTC 13 /* CoW fork block mapping */ #define XFS_SCRUB_TYPE_RTBITMAP 14 /* realtime bitmap */ #define XFS_SCRUB_TYPE_RTSUM 15 /* realtime summary */ -#define XFS_SCRUB_TYPE_MAX 15 +#define XFS_SCRUB_TYPE_RTRMAPBT 16 /* realtime reverse mapping btree */ +#define XFS_SCRUB_TYPE_MAX 16 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index 590bef8..f1f4a2f 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -42,6 +42,7 @@ #include "xfs_refcount_btree.h" #include "xfs_rmap.h" #include "xfs_rmap_btree.h" +#include "xfs_rtrmap_btree.h" #include "xfs_rtalloc.h" #include "xfs_icache.h" #include "xfs_itable.h" @@ -128,6 +129,7 @@ static const char * const btree_types[] = { [XFS_BTNUM_BNO] = "bnobt", [XFS_BTNUM_CNT] = "cntbt", [XFS_BTNUM_RMAP] = "rmapbt", + [XFS_BTNUM_RTRMAP] = "rtrmapbt", [XFS_BTNUM_BMAP] = "bmapbt", [XFS_BTNUM_INO] = "inobt", [XFS_BTNUM_FINO] = "finobt", @@ -925,6 +927,7 @@ xfs_scrub_sb( XFS_SCRUB_SB_FEAT(rmapbt); XFS_SCRUB_SB_FEAT(reflink); XFS_SCRUB_SB_FEAT(realtime); + XFS_SCRUB_SB_FEAT(rtrmapbt); #undef XFS_SCRUB_SB_FEAT if (error) @@ -1912,12 +1915,12 @@ xfs_scrub_rmapbt( /* Reference count btree scrubber. */ -struct xfs_refcountbt_scrub_fragment { +struct xfs_scrub_refcountbt_fragment { struct xfs_rmap_irec rm; struct list_head list; }; -struct xfs_refcountbt_scrub_rmap_check_info { +struct xfs_scrub_refcountbt_rmap_check_info { struct xfs_scrub_btree *bs; xfs_nlink_t nr; struct xfs_refcount_irec rc; @@ -1932,13 +1935,13 @@ struct xfs_refcountbt_scrub_rmap_check_info { * fragments as the refcountbt says we should have. */ STATIC int -xfs_refcountbt_scrub_rmap_check( +xfs_scrub_refcountbt_rmap_check( struct xfs_btree_cur *cur, struct xfs_rmap_irec *rec, void *priv) { - struct xfs_refcountbt_scrub_rmap_check_info *rsrci = priv; - struct xfs_refcountbt_scrub_fragment *frag; + struct xfs_scrub_refcountbt_rmap_check_info *rsrci = priv; + struct xfs_scrub_refcountbt_fragment *frag; xfs_agblock_t rm_last; xfs_agblock_t rc_last; @@ -1949,7 +1952,7 @@ xfs_refcountbt_scrub_rmap_check( if (rec->rm_startblock <= rsrci->rc.rc_startblock && rm_last >= rc_last) rsrci->nr++; else { - frag = kmem_zalloc(sizeof(struct xfs_refcountbt_scrub_fragment), + frag = kmem_zalloc(sizeof(struct xfs_scrub_refcountbt_fragment), KM_SLEEP); frag->rm = *rec; list_add_tail(&frag->list, &rsrci->fragments); @@ -1968,11 +1971,11 @@ xfs_refcountbt_scrub_rmap_check( STATIC void xfs_refcountbt_process_rmap_fragments( struct xfs_mount *mp, - struct xfs_refcountbt_scrub_rmap_check_info *rsrci) + struct xfs_scrub_refcountbt_rmap_check_info *rsrci) { struct list_head worklist; - struct xfs_refcountbt_scrub_fragment *cur; - struct xfs_refcountbt_scrub_fragment *n; + struct xfs_scrub_refcountbt_fragment *cur; + struct xfs_scrub_refcountbt_fragment *n; xfs_agblock_t bno; xfs_agblock_t rbno; xfs_agblock_t next_rbno; @@ -2059,13 +2062,13 @@ fail: /* Delete fragments and work list. */ while (!list_empty(&worklist)) { cur = list_first_entry(&worklist, - struct xfs_refcountbt_scrub_fragment, list); + struct xfs_scrub_refcountbt_fragment, list); list_del(&cur->list); kmem_free(cur); } while (!list_empty(&rsrci->fragments)) { cur = list_first_entry(&rsrci->fragments, - struct xfs_refcountbt_scrub_fragment, list); + struct xfs_scrub_refcountbt_fragment, list); list_del(&cur->list); kmem_free(cur); } @@ -2082,8 +2085,8 @@ xfs_scrub_refcountbt_helper( struct xfs_refcount_irec irec; struct xfs_rmap_irec low; struct xfs_rmap_irec high; - struct xfs_refcountbt_scrub_rmap_check_info rsrci; - struct xfs_refcountbt_scrub_fragment *cur; + struct xfs_scrub_refcountbt_rmap_check_info rsrci; + struct xfs_scrub_refcountbt_fragment *cur; xfs_agblock_t eoag; bool is_freesp; bool has_inodes; @@ -2144,7 +2147,7 @@ xfs_scrub_refcountbt_helper( rsrci.rc = irec; INIT_LIST_HEAD(&rsrci.fragments); err2 = xfs_rmap_query_range(bs->rmap_cur, &low, &high, - &xfs_refcountbt_scrub_rmap_check, &rsrci); + &xfs_scrub_refcountbt_rmap_check, &rsrci); if (err2 == 0) { xfs_refcountbt_process_rmap_fragments(mp, &rsrci); XFS_BTREC_SCRUB_CHECK(bs, irec.rc_refcount == rsrci.nr); @@ -2152,7 +2155,7 @@ xfs_scrub_refcountbt_helper( while (!list_empty(&rsrci.fragments)) { cur = list_first_entry(&rsrci.fragments, - struct xfs_refcountbt_scrub_fragment, + struct xfs_scrub_refcountbt_fragment, list); list_del(&cur->list); kmem_free(cur); @@ -2646,6 +2649,7 @@ xfs_scrub_bmap( case XFS_DINODE_FMT_UUID: case XFS_DINODE_FMT_DEV: case XFS_DINODE_FMT_LOCAL: + case XFS_DINODE_FMT_RMAP: /* No mappings to check. */ goto out_unlock; case XFS_DINODE_FMT_EXTENTS: @@ -2831,6 +2835,74 @@ xfs_scrub_rtsummary( return -ENOENT; } +/* Realtime reverse mapping. */ + +/* Scrub a realtime rmapbt record. */ +STATIC int +xfs_scrub_rtrmapbt_helper( + struct xfs_scrub_btree *bs, + union xfs_btree_rec *rec) +{ + struct xfs_mount *mp = bs->cur->bc_mp; + struct xfs_rmap_irec irec; + bool non_inode; + bool is_bmbt; + bool is_attr; + int error; + + error = xfs_rmap_btrec_to_irec(bs->cur, rec, &irec); + if (error) + return error; + + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_startblock < mp->m_sb.sb_rblocks) + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_startblock < irec.rm_startblock + + irec.rm_blockcount); + XFS_BTREC_SCRUB_CHECK(bs, irec.rm_startblock + irec.rm_blockcount <= + mp->m_sb.sb_rblocks) + + non_inode = XFS_RMAP_NON_INODE_OWNER(irec.rm_owner); + is_bmbt = irec.rm_flags & XFS_RMAP_BMBT_BLOCK; + is_attr = irec.rm_flags & XFS_RMAP_ATTR_FORK; + + XFS_BTREC_SCRUB_CHECK(bs, !is_bmbt); + XFS_BTREC_SCRUB_CHECK(bs, !non_inode); + XFS_BTREC_SCRUB_CHECK(bs, !is_attr); + + return error; +} + +/* Scrub the realtime rmap btree. */ +STATIC int +xfs_scrub_rtrmapbt( + struct xfs_inode *ip, + struct xfs_scrub_metadata *sm) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_scrub_btree bs; + int error; + + if (sm->control || sm->flags) + return -EINVAL; + + xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP); + xfs_ilock(mp->m_rrmapip, XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP); + + bs.cur = xfs_rtrmapbt_init_cursor(mp, NULL, mp->m_rrmapip); + bs.scrub_rec = xfs_scrub_rtrmapbt_helper; + xfs_rmap_ino_bmbt_owner(&bs.oinfo, mp->m_sb.sb_rrmapino, XFS_DATA_FORK); + error = xfs_scrub_btree(&bs); + xfs_btree_del_cursor(bs.cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + + xfs_iunlock(mp->m_rrmapip, XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP); + xfs_iunlock(mp->m_rbmip, XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP); + + if (!error && bs.error) + error = bs.error; + + return error; +} + /* Scrubbing dispatch. */ struct xfs_scrub_meta_fns { @@ -2855,6 +2927,7 @@ static const struct xfs_scrub_meta_fns meta_scrub_fns[] = { {xfs_scrub_bmap_cow, NULL}, {xfs_scrub_rtbitmap, xfs_sb_version_hasrealtime}, {xfs_scrub_rtsummary, xfs_sb_version_hasrealtime}, + {xfs_scrub_rtrmapbt, xfs_sb_version_hasrtrmapbt}, }; /* Dispatch metadata scrubbing. */ From darrick.wong@oracle.com Thu Aug 25 18:45:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3ED47807B for ; Thu, 25 Aug 2016 18:45:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E8AA18F8035 for ; Thu, 25 Aug 2016 16:45:31 -0700 (PDT) X-ASG-Debug-ID: 1472168730-0bf8155c741e7db0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id nBobvN3D2OurfA7F (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:45:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNjS5x021118 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:45:29 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNjS6J019146 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:45:28 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNjRMT017990; Thu, 25 Aug 2016 23:45:28 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:45:27 -0700 Subject: [PATCH 19/20] xfs: cross-reference realtime bitmap to realtime rmapbt scrubber From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 19/20] xfs: cross-reference realtime bitmap to realtime rmapbt scrubber To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:45:26 -0700 Message-ID: <147216872624.3688.9023416667706304844.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168730 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1060 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're checking the realtime rmapbt, cross-reference the entries with the realtime bitmap too. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_scrub.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index f1f4a2f..f0cd21f 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -2845,10 +2845,12 @@ xfs_scrub_rtrmapbt_helper( { struct xfs_mount *mp = bs->cur->bc_mp; struct xfs_rmap_irec irec; + bool is_free; bool non_inode; bool is_bmbt; bool is_attr; int error; + int err2; error = xfs_rmap_btrec_to_irec(bs->cur, rec, &irec); if (error) @@ -2868,6 +2870,12 @@ xfs_scrub_rtrmapbt_helper( XFS_BTREC_SCRUB_CHECK(bs, !non_inode); XFS_BTREC_SCRUB_CHECK(bs, !is_attr); + /* Check the rtbitmap thinks it's free. */ + err2 = xfs_rtbitmap_extent_is_free(mp, irec.rm_startblock, + irec.rm_blockcount, &is_free); + if (!err2) + XFS_BTREC_SCRUB_CHECK(bs, !is_free); + return error; } From darrick.wong@oracle.com Thu Aug 25 18:45:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 37FE58084 for ; Thu, 25 Aug 2016 18:45:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8DB9AAC003 for ; Thu, 25 Aug 2016 16:45:43 -0700 (PDT) X-ASG-Debug-ID: 1472168741-0bf57b53142098a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id AQROxnq6WKyN4i1Q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:45:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNjehQ027739 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:45:40 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNjdBs020780 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:45:39 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNjcUw032596; Thu, 25 Aug 2016 23:45:39 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:45:38 -0700 Subject: [PATCH 20/20] xfs: cross-reference the realtime rmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 20/20] xfs: cross-reference the realtime rmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:45:32 -0700 Message-ID: <147216873241.3688.11988964019948967528.stgit@birch.djwong.org> In-Reply-To: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> References: <147216860614.3688.3200692982609112535.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168741 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2770 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're scrubbing the realtime metadata, cross-reference the rtrmapt. Signed-off-by: Darrick J. Wong --- fs/xfs/xfs_scrub.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_scrub.c b/fs/xfs/xfs_scrub.c index f0cd21f..61c99ea 100644 --- a/fs/xfs/xfs_scrub.c +++ b/fs/xfs/xfs_scrub.c @@ -2405,8 +2405,15 @@ xfs_scrub_bmap_extent( } /* Cross-reference with rmapbt. */ - if (xfs_sb_version_hasrmapbt(&mp->m_sb) && !info->is_rt) { - xcur = xfs_rmapbt_init_cursor(mp, NULL, agf_bp, agno); + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + if (!info->is_rt) + xcur = xfs_rmapbt_init_cursor(mp, NULL, agf_bp, agno); + else { + xfs_ilock(mp->m_rrmapip, XFS_ILOCK_SHARED | + XFS_ILOCK_RTBITMAP); + xcur = xfs_rtrmapbt_init_cursor(mp, NULL, + mp->m_rrmapip); + } if (info->whichfork == XFS_COW_FORK) { owner = XFS_RMAP_OWN_COW; @@ -2495,6 +2502,9 @@ skip_rmap_xref: /* Free cursor. */ xfs_btree_del_cursor(xcur, err2 ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + if (info->is_rt) + xfs_iunlock(mp->m_rrmapip, XFS_ILOCK_SHARED | + XFS_ILOCK_RTBITMAP); } /* @@ -2768,10 +2778,12 @@ xfs_scrub_rtbitmap( { struct xfs_mount *mp = ip->i_mount; struct xfs_buf *bp = NULL; + struct xfs_btree_cur *cur = NULL; xfs_rtblock_t rtstart; xfs_rtblock_t rtend; xfs_rtblock_t block; xfs_rtblock_t rem; + bool has_rmap; int is_free; int error = 0; int err2 = 0; @@ -2780,6 +2792,10 @@ xfs_scrub_rtbitmap( return -EINVAL; xfs_ilock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) { + xfs_ilock(mp->m_rrmapip, XFS_ILOCK_SHARED | XFS_ILOCK_RTSUM); + cur = xfs_rtrmapbt_init_cursor(mp, NULL, mp->m_rrmapip); + } /* Iterate the bitmap, looking for discrepancies. */ rtstart = 0; @@ -2807,6 +2823,14 @@ xfs_scrub_rtbitmap( break; XFS_SCRUB_CHECK(mp, bp, "rtbitmap", rtend >= rtstart); + /* Cross-reference the rtrmapbt. */ + if (cur && is_free) { + err2 = xfs_rmap_has_record(cur, rtstart, + rtend - rtstart + 1, &has_rmap); + if (!err2) + XFS_SCRUB_CHECK(mp, bp, "rtbitmap", !has_rmap); + } + xfs_buf_relse(bp); bp = NULL; rem -= rtend - rtstart + 1; @@ -2816,6 +2840,11 @@ xfs_scrub_rtbitmap( out_unlock: if (bp) xfs_buf_relse(bp); + if (cur) { + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : + XFS_BTREE_NOERROR); + xfs_iunlock(mp->m_rrmapip, XFS_ILOCK_SHARED | XFS_ILOCK_RTSUM); + } xfs_iunlock(mp->m_rbmip, XFS_ILOCK_SHARED | XFS_ILOCK_RTBITMAP); if (!error && err2) error = err2; From darrick.wong@oracle.com Thu Aug 25 18:46:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 92BCA808E for ; Thu, 25 Aug 2016 18:46:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16650AC002 for ; Thu, 25 Aug 2016 16:46:38 -0700 (PDT) X-ASG-Debug-ID: 1472168795-0bf8155c741e7fa0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id mJDhkSH9N2dMEDbY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:46:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNkYqq028358 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:46:34 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNkY1W020488 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:46:34 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNkXX3000318; Thu, 25 Aug 2016 23:46:33 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:46:33 -0700 Subject: [PATCH v8 00/71] xfsprogs: add reflink and dedupe support From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 00/71] xfsprogs: add reflink and dedupe support To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:46:32 -0700 Message-ID: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168796 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2220 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. (NOTE: In the git trees, this series is preceded by the pending rmap fixes patches posted to linux-xfs a few days ago.) At the beginning of this series are imports of all the kernel patches against libxfs/ that are needed to provide refcount btrees and reflink support. Please note that these patches /do/ have diffs against files in the libxfs/ directory (mostly for deferred ops) that do not start with 'xfs_', so the libxfs-apply script cannot be used in isolation. After that are the various small changes required for db, growfs, io, logprint, and manpages to support the new reference counting data structures. The mkfs patch is, as usual, at the end. Before that, however, are a bunch of patches to xfs_repair that spot-check the refcount btree and use the rmap tracking code introduced in xfsprogs 4.8 to regenerate the refcount btree. It also fixes discrepancies in the inode reflink flag. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:46:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E20C68096 for ; Thu, 25 Aug 2016 18:46:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A717D8F8033 for ; Thu, 25 Aug 2016 16:46:45 -0700 (PDT) X-ASG-Debug-ID: 1472168803-0bf57c55b21c7d60001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id z1w8GZm7uxpYrrTV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:46:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNkfni028426 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:46:42 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNkf7T022017 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:46:41 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNke03018480; Thu, 25 Aug 2016 23:46:41 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:46:39 -0700 Subject: [PATCH 01/71] xfs: remove xfs_btree_bigkey From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/71] xfs: remove xfs_btree_bigkey To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:46:38 -0700 Message-ID: <147216879842.4420.13542552343853332867.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168803 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3700 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Remove the xfs_btree_bigkey mess and simply make xfs_btree_key big enough to hold both keys in-core. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 12 ++++++------ libxfs/xfs_btree.h | 24 ++++++------------------ 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 27db736..99bf808 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -2066,7 +2066,7 @@ __xfs_btree_updkeys( struct xfs_buf *bp0, bool force_all) { - union xfs_btree_bigkey key; /* keys from current level */ + union xfs_btree_key key; /* keys from current level */ union xfs_btree_key *lkey; /* keys from the next level up */ union xfs_btree_key *hkey; union xfs_btree_key *nlkey; /* keys from the next level up */ @@ -2082,7 +2082,7 @@ __xfs_btree_updkeys( trace_xfs_btree_updkeys(cur, level, bp0); - lkey = (union xfs_btree_key *)&key; + lkey = &key; hkey = xfs_btree_high_key_from_key(cur, lkey); xfs_btree_get_keys(cur, block, lkey); for (level++; level < cur->bc_nlevels; level++) { @@ -3226,7 +3226,7 @@ xfs_btree_insrec( struct xfs_buf *bp; /* buffer for block */ union xfs_btree_ptr nptr; /* new block ptr */ struct xfs_btree_cur *ncur; /* new btree cursor */ - union xfs_btree_bigkey nkey; /* new block key */ + union xfs_btree_key nkey; /* new block key */ union xfs_btree_key *lkey; int optr; /* old key/record index */ int ptr; /* key/record index */ @@ -3241,7 +3241,7 @@ xfs_btree_insrec( XFS_BTREE_TRACE_ARGIPR(cur, level, *ptrp, &rec); ncur = NULL; - lkey = (union xfs_btree_key *)&nkey; + lkey = &nkey; /* * If we have an external root pointer, and we've made it to the @@ -3444,14 +3444,14 @@ xfs_btree_insert( union xfs_btree_ptr nptr; /* new block number (split result) */ struct xfs_btree_cur *ncur; /* new cursor (split result) */ struct xfs_btree_cur *pcur; /* previous level's cursor */ - union xfs_btree_bigkey bkey; /* key of block to insert */ + union xfs_btree_key bkey; /* key of block to insert */ union xfs_btree_key *key; union xfs_btree_rec rec; /* record to insert */ level = 0; ncur = NULL; pcur = cur; - key = (union xfs_btree_key *)&bkey; + key = &bkey; xfs_btree_set_ptr_null(cur, &nptr); diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index 72f8b3c..870a5ab 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -37,30 +37,18 @@ union xfs_btree_ptr { __be64 l; /* long form ptr */ }; -union xfs_btree_key { - struct xfs_bmbt_key bmbt; - xfs_bmdr_key_t bmbr; /* bmbt root block */ - xfs_alloc_key_t alloc; - struct xfs_inobt_key inobt; - struct xfs_rmap_key rmap; -}; - /* - * In-core key that holds both low and high keys for overlapped btrees. - * The two keys are packed next to each other on disk, so do the same - * in memory. Preserve the existing xfs_btree_key as a single key to - * avoid the mental model breakage that would happen if we passed a - * bigkey into a function that operates on a single key. + * The in-core btree key. Overlapping btrees actually store two keys + * per pointer, so we reserve enough memory to hold both. The __*bigkey + * items should never be accessed directly. */ -union xfs_btree_bigkey { +union xfs_btree_key { struct xfs_bmbt_key bmbt; xfs_bmdr_key_t bmbr; /* bmbt root block */ xfs_alloc_key_t alloc; struct xfs_inobt_key inobt; - struct { - struct xfs_rmap_key rmap; - struct xfs_rmap_key rmap_hi; - }; + struct xfs_rmap_key rmap; + struct xfs_rmap_key __rmap_bigkey[2]; }; union xfs_btree_rec { From darrick.wong@oracle.com Thu Aug 25 18:46:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 83852809E for ; Thu, 25 Aug 2016 18:46:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 55F9F8F8033 for ; Thu, 25 Aug 2016 16:46:51 -0700 (PDT) X-ASG-Debug-ID: 1472168808-0bf57c55b11c7d70001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id nMUn09DVxSixQ1Y2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:46:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNklxF022091 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:46:48 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNkl4d032488 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:46:47 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNkkPp000383; Thu, 25 Aug 2016 23:46:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:46:45 -0700 Subject: [PATCH 02/71] xfs: create a standard btree size calculator code From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/71] xfs: create a standard btree size calculator code To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:46:44 -0700 Message-ID: <147216880460.4420.4815652191731578681.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168809 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2124 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a helper to generate AG btree height calculator functions. This will be used (much) later when we get to the refcount btree. v2: Use a helper function instead of a macro. v3: We can (theoretically) store more than 2^32 records in a btree, so widen the fields to accept that. v4: Don't modify xfs_bmap_worst_indlen; the purpose of /that/ function is to estimate the worst-case number of blocks needed for a bmbt expansion, not to calculate the space required to store nr records. v5: More minor tweaks to the loop control; move down to reflink patches. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 24 ++++++++++++++++++++++++ libxfs/xfs_btree.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 99bf808..b3e2ce9 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -4797,3 +4797,27 @@ xfs_btree_query_range( return xfs_btree_overlapped_query_range(cur, &low_key, &high_key, fn, priv); } + +/* + * Calculate the number of blocks needed to store a given number of records + * in a short-format (per-AG metadata) btree. + */ +xfs_extlen_t +xfs_btree_calc_size( + struct xfs_mount *mp, + uint *limits, + unsigned long long len) +{ + int level; + int maxrecs; + xfs_extlen_t rval; + + maxrecs = limits[0]; + for (level = 0, rval = 0; len > 1; level++) { + len += maxrecs - 1; + do_div(len, maxrecs); + maxrecs = limits[1]; + rval += len; + } + return rval; +} diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index 870a5ab..607463a 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -501,6 +501,8 @@ bool xfs_btree_sblock_v5hdr_verify(struct xfs_buf *bp); bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); uint xfs_btree_compute_maxlevels(struct xfs_mount *mp, uint *limits, unsigned long len); +xfs_extlen_t xfs_btree_calc_size(struct xfs_mount *mp, uint *limits, + unsigned long long len); /* return codes */ #define XFS_BTREE_QUERY_RANGE_CONTINUE 0 /* keep iterating */ From darrick.wong@oracle.com Thu Aug 25 18:46:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 752E580A6 for ; Thu, 25 Aug 2016 18:46:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44DF18F8035 for ; Thu, 25 Aug 2016 16:46:56 -0700 (PDT) X-ASG-Debug-ID: 1472168814-0bf57b5311209920001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id a3yjzckw23GfsmfL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:46:54 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNkr0e028491 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:46:53 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNkrk9022207 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:46:53 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNkqrU018516; Thu, 25 Aug 2016 23:46:52 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:46:52 -0700 Subject: [PATCH 03/71] xfs: count the blocks in a btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/71] xfs: count the blocks in a btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:46:50 -0700 Message-ID: <147216881078.4420.6999962677135186371.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168814 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1595 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide a helper method to count the number of blocks in a short form btree. The refcount and rmap btrees need to know the number of blocks already in use to set up their per-AG block reservations during mount. v2: Use btree_visit_blocks instead of open-coding our own traversal routine. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 23 +++++++++++++++++++++++ libxfs/xfs_btree.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index b3e2ce9..43c809f 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -4821,3 +4821,26 @@ xfs_btree_calc_size( } return rval; } + +int +xfs_btree_count_blocks_helper( + struct xfs_btree_cur *cur, + int level, + void *data) +{ + xfs_extlen_t *blocks = data; + (*blocks)++; + + return 0; +} + +/* Count the blocks in a btree and return the result in *blocks. */ +int +xfs_btree_count_blocks( + struct xfs_btree_cur *cur, + xfs_extlen_t *blocks) +{ + *blocks = 0; + return xfs_btree_visit_blocks(cur, xfs_btree_count_blocks_helper, + blocks); +} diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index 607463a..be4a0c1 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -519,4 +519,6 @@ typedef int (*xfs_btree_visit_blocks_fn)(struct xfs_btree_cur *cur, int level, int xfs_btree_visit_blocks(struct xfs_btree_cur *cur, xfs_btree_visit_blocks_fn fn, void *data); +int xfs_btree_count_blocks(struct xfs_btree_cur *cur, xfs_extlen_t *blocks); + #endif /* __XFS_BTREE_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:47:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DEA2F80B3 for ; Thu, 25 Aug 2016 18:47:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 97B0F304043 for ; Thu, 25 Aug 2016 16:47:02 -0700 (PDT) X-ASG-Debug-ID: 1472168820-0bf81509b01e0000001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id RMeXR4ByJERk0vLd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNkx4m028527 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:46:59 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNkxEJ022364 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:46:59 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNkwEc018531; Thu, 25 Aug 2016 23:46:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:46:58 -0700 Subject: [PATCH 04/71] xfs: defer should allow ->finish_item to request a new transaction From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/71] xfs: defer should allow ->finish_item to request a new transaction To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:46:56 -0700 Message-ID: <147216881696.4420.16237985704832808995.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168820 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6622 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When xfs_defer_finish calls ->finish_item, it's possible that (refcount) won't be able to finish all the work in a single transaction. When this happens, the ->finish_item handler should shorten the log done item's list count, update the work item to reflect where work should continue, and return -EAGAIN so that defer_finish knows to retain the pending item on the pending list, roll the transaction, and restart processing where we left off. Plumb in the code and document how this mechanism is supposed to work. Signed-off-by: Darrick J. Wong --- libxfs/xfs_defer.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 7 deletions(-) diff --git a/libxfs/xfs_defer.c b/libxfs/xfs_defer.c index 06d56ba..27fef4b 100644 --- a/libxfs/xfs_defer.c +++ b/libxfs/xfs_defer.c @@ -81,6 +81,10 @@ * - For each work item attached to the log intent item, * * Perform the described action. * * Attach the work item to the log done item. + * * If the result of doing the work was -EAGAIN, ->finish work + * wants a new transaction. See the "Requesting a Fresh + * Transaction while Finishing Deferred Work" section below for + * details. * * The key here is that we must log an intent item for all pending * work items every time we roll the transaction, and that we must log @@ -88,6 +92,34 @@ * we can perform complex remapping operations, chaining intent items * as needed. * + * Requesting a Fresh Transaction while Finishing Deferred Work + * + * If ->finish_item decides that it needs a fresh transaction to + * finish the work, it must ask its caller (xfs_defer_finish) for a + * continuation. The most likely cause of this circumstance are the + * refcount adjust functions deciding that they've logged enough items + * to be at risk of exceeding the transaction reservation. + * + * To get a fresh transaction, we want to log the existing log done + * item to prevent the log intent item from replaying, immediately log + * a new log intent item with the unfinished work items, roll the + * transaction, and re-call ->finish_item wherever it left off. The + * log done item and the new log intent item must be in the same + * transaction or atomicity cannot be guaranteed; defer_finish ensures + * that this happens. + * + * This requires some coordination between ->finish_item and + * defer_finish. Upon deciding to request a new transaction, + * ->finish_item should update the current work item to reflect the + * unfinished work. Next, it should reset the log done item's list + * count to the number of items finished, and return -EAGAIN. + * defer_finish sees the -EAGAIN, logs the new log intent item + * with the remaining work items, and leaves the xfs_defer_pending + * item at the head of the dop_work queue. Then it rolls the + * transaction and picks up processing where it left off. It is + * required that ->finish_item must be careful to leave enough + * transaction reservation to fit the new log intent item. + * * This is an example of remapping the extent (E, E+B) into file X at * offset A and dealing with the extent (C, C+B) already being mapped * there: @@ -104,21 +136,26 @@ * | Intent to add rmap (X, E, A, B) | * +-------------------------------------------------+ * | Reduce refcount for extent (C, B) | t2 - * | Done reducing refcount for extent (C, B) | + * | Done reducing refcount for extent (C, 9) | + * | Intent to reduce refcount for extent (C+9, B-9) | + * | (ran out of space after 9 refcount updates) | + * +-------------------------------------------------+ + * | Reduce refcount for extent (C+9, B+9) | t3 + * | Done reducing refcount for extent (C+9, B-9) | * | Increase refcount for extent (E, B) | * | Done increasing refcount for extent (E, B) | * | Intent to free extent (C, B) | * | Intent to free extent (F, 1) (refcountbt block) | * | Intent to remove rmap (F, 1, REFC) | * +-------------------------------------------------+ - * | Remove rmap (X, C, A, B) | t3 + * | Remove rmap (X, C, A, B) | t4 * | Done removing rmap (X, C, A, B) | * | Add rmap (X, E, A, B) | * | Done adding rmap (X, E, A, B) | * | Remove rmap (F, 1, REFC) | * | Done removing rmap (F, 1, REFC) | * +-------------------------------------------------+ - * | Free extent (C, B) | t4 + * | Free extent (C, B) | t5 * | Done freeing extent (C, B) | * | Free extent (D, 1) | * | Done freeing extent (D, 1) | @@ -141,6 +178,9 @@ * - Intent to free extent (C, B) * - Intent to free extent (F, 1) (refcountbt block) * - Intent to remove rmap (F, 1, REFC) + * + * Note that the continuation requested between t2 and t3 is likely to + * reoccur. */ static const struct xfs_defer_op_type *defer_op_types[XFS_DEFER_OPS_TYPE_MAX]; @@ -332,7 +372,16 @@ xfs_defer_finish( dfp->dfp_count--; error = dfp->dfp_type->finish_item(*tp, dop, li, done_item, &state); - if (error) { + if (error == -EAGAIN) { + /* + * Caller wants a fresh transaction; + * put the work item back on the list + * and jump out. + */ + list_add(li, &dfp->dfp_work); + dfp->dfp_count++; + break; + } else if (error) { /* * Clean up after ourselves and jump out. * xfs_defer_cancel will take care of freeing @@ -344,9 +393,24 @@ xfs_defer_finish( goto out; } } - /* Done with the dfp, free it. */ - list_del(&dfp->dfp_list); - kmem_free(dfp); + if (error == -EAGAIN) { + /* + * Caller wants a fresh transaction, so log a + * new log intent item to replace the old one + * and roll the transaction. See "Requesting + * a Fresh Transaction while Finishing + * Deferred Work" above. + */ + dfp->dfp_intent = dfp->dfp_type->create_intent(*tp, + dfp->dfp_count); + list_for_each(li, &dfp->dfp_work) + dfp->dfp_type->log_item(*tp, dfp->dfp_intent, + li); + } else { + /* Done with the dfp, free it. */ + list_del(&dfp->dfp_list); + kmem_free(dfp); + } if (cleanup_fn) cleanup_fn(*tp, state, error); From darrick.wong@oracle.com Thu Aug 25 18:47:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0024E80B1 for ; Thu, 25 Aug 2016 18:47:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3CBA0AC002 for ; Thu, 25 Aug 2016 16:47:12 -0700 (PDT) X-ASG-Debug-ID: 1472168827-0bf57b5313209940001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id vplq51ugA1LHA8VI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:08 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNl58C028823 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:47:06 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNl5dA021640 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:47:05 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNl5Kd000435; Thu, 25 Aug 2016 23:47:05 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:04 -0700 Subject: [PATCH 05/71] xfs: set up per-AG free space reservations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/71] xfs: set up per-AG free space reservations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:03 -0700 Message-ID: <147216882319.4420.16258127357814201394.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168828 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 30292 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines One unfortunate quirk of the reference count btree -- it can expand in size when blocks are written to *other* allocation groups if, say, one large extent becomes a lot of tiny extents. Since we don't want to start throwing errors in the middle of CoWing, we need to reserve some blocks to handle future expansion. Use the count of how many reserved blocks we need to have on hand to create a virtual reservation in the AG. Through selective clamping of the maximum length of allocation requests and of the length of the longest free extent, we can make it look like there's less free space in the AG unless the reservation owner is asking for blocks. In other words, play some accounting tricks in-core to make sure that we always have blocks available. On the plus side, there's nothing to clean up if we crash, which is contrast to the strategy that the rough draft used (actually removing extents from the freespace btrees). v2: There's really only two kinds of per-AG reservation pools -- one to feed the AGFL (rmapbt), and one to feed everything else (refcountbt). Bearing that in mind, we can embed the reservation controls in xfs_perag and greatly simplify the block accounting. Furthermore, fix some longstanding accounting bugs that were a direct result of the goofy "allocate a block and later fix up the accounting" strategy by integrating the reservation accounting code more tightly with the allocator. This eliminates the ENOSPC complaints resulting from refcount btree splits during truncate operations. v3: Since AGFL blocks are considered to be "free", we mustn't change fdblocks in response to any AGFL grow/shrink operation. Therefore, we must give back to fdblocks at umount whatever we borrowed at mount. We have to let ag_reserved go down to zero because it's used to determine if we're critically low on reservation. Signed-off-by: Darrick J. Wong --- include/xfs_mount.h | 36 +++++ include/xfs_trace.h | 14 ++ libxfs/Makefile | 2 libxfs/defer_item.c | 3 libxfs/xfs_ag_resv.c | 325 +++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_ag_resv.h | 35 +++++ libxfs/xfs_alloc.c | 109 ++++++++++----- libxfs/xfs_alloc.h | 8 + libxfs/xfs_bmap.c | 6 + libxfs/xfs_ialloc_btree.c | 2 10 files changed, 499 insertions(+), 41 deletions(-) create mode 100644 libxfs/xfs_ag_resv.c create mode 100644 libxfs/xfs_ag_resv.h diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 5cd9464..62b9ef2 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -112,6 +112,22 @@ typedef struct xfs_mount { struct xlog *m_log; } xfs_mount_t; +/* per-AG block reservation data structures*/ +enum xfs_ag_resv_type { + XFS_AG_RESV_NONE = 0, + XFS_AG_RESV_METADATA, + XFS_AG_RESV_AGFL, +}; + +struct xfs_ag_resv { + /* number of blocks originally reserved here */ + xfs_extlen_t ar_orig_reserved; + /* number of blocks reserved here */ + xfs_extlen_t ar_reserved; + /* number of blocks originally asked for */ + xfs_extlen_t ar_asked; +}; + /* * Per-ag incore structure, copies of information in agf and agi, * to improve the performance of allocation group selection. @@ -142,8 +158,28 @@ typedef struct xfs_perag { xfs_agino_t pagl_leftrec; xfs_agino_t pagl_rightrec; int pagb_count; /* pagb slots in use */ + + /* Blocks reserved for all kinds of metadata. */ + struct xfs_ag_resv pag_meta_resv; + /* Blocks reserved for just AGFL-based metadata. */ + struct xfs_ag_resv pag_agfl_resv; } xfs_perag_t; +static inline struct xfs_ag_resv * +xfs_perag_resv( + struct xfs_perag *pag, + enum xfs_ag_resv_type type) +{ + switch (type) { + case XFS_AG_RESV_METADATA: + return &pag->pag_meta_resv; + case XFS_AG_RESV_AGFL: + return &pag->pag_agfl_resv; + default: + return NULL; + } +} + #define LIBXFS_MOUNT_DEBUGGER 0x0001 #define LIBXFS_MOUNT_32BITINODES 0x0002 #define LIBXFS_MOUNT_32BITINOOPT 0x0004 diff --git a/include/xfs_trace.h b/include/xfs_trace.h index a636a8c..a32eec3 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -215,4 +215,18 @@ #define trace_xfs_rmapbt_free_block(...) ((void) 0) #define trace_xfs_rmapbt_alloc_block(...) ((void) 0) +#define trace_xfs_ag_resv_critical(...) ((void) 0) +#define trace_xfs_ag_resv_needed(...) ((void) 0) +#define trace_xfs_ag_resv_free(...) ((void) 0) +#define trace_xfs_ag_resv_free_error(...) ((void) 0) +#define trace_xfs_ag_resv_init(...) ((void) 0) +#define trace_xfs_ag_resv_init_error(...) ((void) 0) +#define trace_xfs_ag_resv_alloc_extent(...) ((void) 0) +#define trace_xfs_ag_resv_free_extent(...) ((void) 0) + +/* set c = c to avoid unused var warnings */ +#define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) +#define trace_xfs_perag_get_tag(a,b,c,d) ((c) = (c)) +#define trace_xfs_perag_put(a,b,c,d) ((c) = (c)) + #endif /* __TRACE_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 62608bd..1b3bcca 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -18,6 +18,7 @@ PKGHFILES = xfs_fs.h \ xfs_log_format.h HFILES = \ + xfs_ag_resv.h \ xfs_alloc.h \ xfs_alloc_btree.h \ xfs_attr_leaf.h \ @@ -60,6 +61,7 @@ CFILES = cache.c \ rdwr.c \ trans.c \ util.c \ + xfs_ag_resv.c \ xfs_alloc.c \ xfs_alloc_btree.c \ xfs_attr.c \ diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c index de4f769..f60a11b 100644 --- a/libxfs/defer_item.c +++ b/libxfs/defer_item.c @@ -95,7 +95,8 @@ xfs_extent_free_finish_item( free = container_of(item, struct xfs_extent_free_item, xefi_list); error = xfs_free_extent(tp, free->xefi_startblock, - free->xefi_blockcount, &free->xefi_oinfo); + free->xefi_blockcount, &free->xefi_oinfo, + XFS_AG_RESV_NONE); kmem_free(free); return error; } diff --git a/libxfs/xfs_ag_resv.c b/libxfs/xfs_ag_resv.c new file mode 100644 index 0000000..af69235 --- /dev/null +++ b/libxfs/xfs_ag_resv.c @@ -0,0 +1,325 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs_priv.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_alloc.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_trans.h" +#include "xfs_bit.h" +#include "xfs_bmap.h" +#include "xfs_bmap_btree.h" +#include "xfs_ag_resv.h" +#include "xfs_trans_space.h" +#include "xfs_rmap_btree.h" +#include "xfs_btree.h" + +/* + * Per-AG Block Reservations + * + * For some kinds of allocation group metadata structures, it is advantageous + * to reserve a small number of blocks in each AG so that future expansions of + * that data structure do not encounter ENOSPC because errors during a btree + * split cause the filesystem to go offline. + * + * Prior to the introduction of reflink, this wasn't an issue because the free + * space btrees maintain a reserve of space (the AGFL) to handle any expansion + * that may be necessary; and allocations of other metadata (inodes, BMBT, + * dir/attr) aren't restricted to a single AG. However, with reflink it is + * possible to allocate all the space in an AG, have subsequent reflink/CoW + * activity expand the refcount btree, and discover that there's no space left + * to handle that expansion. Since we can calculate the maximum size of the + * refcount btree, we can reserve space for it and avoid ENOSPC. + * + * Handling per-AG reservations consists of three changes to the allocator's + * behavior: First, because these reservations are always needed, we decrease + * the ag_max_usable counter to reflect the size of the AG after the reserved + * blocks are taken. Second, the reservations must be reflected in the + * fdblocks count to maintain proper accounting. Third, each AG must maintain + * its own reserved block counter so that we can calculate the amount of space + * that must remain free to maintain the reservations. Fourth, the "remaining + * reserved blocks" count must be used when calculating the length of the + * longest free extent in an AG and to clamp maxlen in the per-AG allocation + * functions. In other words, we maintain a virtual allocation via in-core + * accounting tricks so that we don't have to clean up after a crash. :) + * + * Reserved blocks can be managed by passing one of the enum xfs_ag_resv_type + * values via struct xfs_alloc_arg or directly to the xfs_free_extent + * function. It might seem a little funny to maintain a reservoir of blocks + * to feed another reservoir, but the AGFL only holds enough blocks to get + * through the next transaction. The per-AG reservation is to ensure (we + * hope) that each AG never runs out of blocks. Each data structure wanting + * to use the reservation system should update ask/used in xfs_ag_resv_init. + */ + +/* + * Are we critically low on blocks? For now we'll define that as the number + * of blocks we can get our hands on being less than 10% of what we reserved + * or less than some arbitrary number (eight). + */ +bool +xfs_ag_resv_critical( + struct xfs_perag *pag, + enum xfs_ag_resv_type type) +{ + xfs_extlen_t avail; + xfs_extlen_t orig; + + switch (type) { + case XFS_AG_RESV_METADATA: + avail = pag->pagf_freeblks - pag->pag_agfl_resv.ar_reserved; + orig = pag->pag_meta_resv.ar_asked; + break; + case XFS_AG_RESV_AGFL: + avail = pag->pagf_freeblks + pag->pagf_flcount - + pag->pag_meta_resv.ar_reserved; + orig = pag->pag_agfl_resv.ar_asked; + break; + default: + ASSERT(0); + return false; + } + + trace_xfs_ag_resv_critical(pag, type, avail); + + return avail < orig / 10 || avail < XFS_BTREE_MAXLEVELS; +} + +/* + * How many blocks are reserved but not used, and therefore must not be + * allocated away? + */ +xfs_extlen_t +xfs_ag_resv_needed( + struct xfs_perag *pag, + enum xfs_ag_resv_type type) +{ + xfs_extlen_t len; + + len = pag->pag_meta_resv.ar_reserved + pag->pag_agfl_resv.ar_reserved; + switch (type) { + case XFS_AG_RESV_METADATA: + case XFS_AG_RESV_AGFL: + len -= xfs_perag_resv(pag, type)->ar_reserved; + break; + case XFS_AG_RESV_NONE: + /* empty */ + break; + default: + ASSERT(0); + } + + trace_xfs_ag_resv_needed(pag, type, len); + + return len; +} + +/* Clean out a reservation */ +static int +__xfs_ag_resv_free( + struct xfs_perag *pag, + enum xfs_ag_resv_type type) +{ + struct xfs_ag_resv *resv; + xfs_extlen_t oldresv; + int error; + + trace_xfs_ag_resv_free(pag, type, 0); + + resv = xfs_perag_resv(pag, type); + pag->pag_mount->m_ag_max_usable += resv->ar_asked; + /* + * AGFL blocks are always considered "free", so whatever + * was reserved at mount time must be given back at umount. + */ + oldresv = (type == XFS_AG_RESV_AGFL ? resv->ar_orig_reserved : + resv->ar_reserved); + error = xfs_mod_fdblocks(pag->pag_mount, oldresv, true); + resv->ar_reserved = 0; + resv->ar_asked = 0; + + if (error) + trace_xfs_ag_resv_free_error(pag->pag_mount, pag->pag_agno, + error, _RET_IP_); + return error; +} + +/* Free a per-AG reservation. */ +int +xfs_ag_resv_free( + struct xfs_perag *pag) +{ + int error = 0; + int err2; + + err2 = __xfs_ag_resv_free(pag, XFS_AG_RESV_AGFL); + if (err2 && !error) + error = err2; + err2 = __xfs_ag_resv_free(pag, XFS_AG_RESV_METADATA); + if (err2 && !error) + error = err2; + return error; +} + +static int +__xfs_ag_resv_init( + struct xfs_perag *pag, + enum xfs_ag_resv_type type, + xfs_extlen_t ask, + xfs_extlen_t used) +{ + struct xfs_mount *mp = pag->pag_mount; + struct xfs_ag_resv *resv; + int error; + + resv = xfs_perag_resv(pag, type); + if (used > ask) + ask = used; + resv->ar_asked = ask; + resv->ar_reserved = resv->ar_orig_reserved = ask - used; + mp->m_ag_max_usable -= ask; + + trace_xfs_ag_resv_init(pag, type, ask); + + error = xfs_mod_fdblocks(mp, -(int64_t)resv->ar_reserved, true); + if (error) + trace_xfs_ag_resv_init_error(pag->pag_mount, pag->pag_agno, + error, _RET_IP_); + + return error; +} + +/* Create a per-AG block reservation. */ +int +xfs_ag_resv_init( + struct xfs_perag *pag) +{ + xfs_extlen_t ask; + xfs_extlen_t used; + int error = 0; + int err2; + + if (pag->pag_meta_resv.ar_asked) + goto init_agfl; + + /* Create the metadata reservation. */ + ask = used = 0; + + err2 = __xfs_ag_resv_init(pag, XFS_AG_RESV_METADATA, ask, used); + if (err2 && !error) + error = err2; + +init_agfl: + if (pag->pag_agfl_resv.ar_asked) + return error; + + /* Create the AGFL metadata reservation */ + ask = used = 0; + + err2 = __xfs_ag_resv_init(pag, XFS_AG_RESV_AGFL, ask, used); + if (err2 && !error) + error = err2; + + return error; +} + +/* Allocate a block from the reservation. */ +void +xfs_ag_resv_alloc_extent( + struct xfs_perag *pag, + enum xfs_ag_resv_type type, + struct xfs_alloc_arg *args) +{ + struct xfs_ag_resv *resv; + xfs_extlen_t len; + uint field; + + trace_xfs_ag_resv_alloc_extent(pag, type, args->len); + + switch (type) { + case XFS_AG_RESV_METADATA: + case XFS_AG_RESV_AGFL: + resv = xfs_perag_resv(pag, type); + break; + default: + ASSERT(0); + /* fall through */ + case XFS_AG_RESV_NONE: + field = args->wasdel ? XFS_TRANS_SB_RES_FDBLOCKS : + XFS_TRANS_SB_FDBLOCKS; + xfs_trans_mod_sb(args->tp, field, -(int64_t)args->len); + return; + } + + len = min_t(xfs_extlen_t, args->len, resv->ar_reserved); + resv->ar_reserved -= len; + if (type == XFS_AG_RESV_AGFL) + return; + /* Allocations of reserved blocks only need on-disk sb updates... */ + xfs_trans_mod_sb(args->tp, XFS_TRANS_SB_RES_FDBLOCKS, -(int64_t)len); + /* ...but non-reserved blocks need in-core and on-disk updates. */ + if (args->len > len) + xfs_trans_mod_sb(args->tp, XFS_TRANS_SB_FDBLOCKS, + -((int64_t)args->len - len)); +} + +/* Free a block to the reservation. */ +void +xfs_ag_resv_free_extent( + struct xfs_perag *pag, + enum xfs_ag_resv_type type, + struct xfs_trans *tp, + xfs_extlen_t len) +{ + xfs_extlen_t leftover; + struct xfs_ag_resv *resv; + + trace_xfs_ag_resv_free_extent(pag, type, len); + + switch (type) { + case XFS_AG_RESV_METADATA: + case XFS_AG_RESV_AGFL: + resv = xfs_perag_resv(pag, type); + break; + default: + ASSERT(0); + /* fall through */ + case XFS_AG_RESV_NONE: + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (int64_t)len); + return; + } + + leftover = min_t(xfs_extlen_t, len, resv->ar_asked - resv->ar_reserved); + resv->ar_reserved += leftover; + if (type == XFS_AG_RESV_AGFL) + return; + /* Freeing into the reserved pool only requires on-disk update... */ + xfs_trans_mod_sb(tp, XFS_TRANS_SB_RES_FDBLOCKS, len); + /* ...but freeing beyond that requires in-core and on-disk update. */ + if (len > leftover) + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, len - leftover); +} diff --git a/libxfs/xfs_ag_resv.h b/libxfs/xfs_ag_resv.h new file mode 100644 index 0000000..8d6c687 --- /dev/null +++ b/libxfs/xfs_ag_resv.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_AG_RESV_H__ +#define __XFS_AG_RESV_H__ + +int xfs_ag_resv_free(struct xfs_perag *pag); +int xfs_ag_resv_init(struct xfs_perag *pag); + +bool xfs_ag_resv_critical(struct xfs_perag *pag, enum xfs_ag_resv_type type); +xfs_extlen_t xfs_ag_resv_needed(struct xfs_perag *pag, + enum xfs_ag_resv_type type); + +void xfs_ag_resv_alloc_extent(struct xfs_perag *pag, enum xfs_ag_resv_type type, + struct xfs_alloc_arg *args); +void xfs_ag_resv_free_extent(struct xfs_perag *pag, enum xfs_ag_resv_type type, + struct xfs_trans *tp, xfs_extlen_t len); + +#endif /* __XFS_AG_RESV_H__ */ diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 8353c77..5f111dd 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -33,6 +33,7 @@ #include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_trans.h" +#include "xfs_ag_resv.h" struct workqueue_struct *xfs_alloc_wq; @@ -70,14 +71,8 @@ xfs_prealloc_blocks( * extents need to be actually allocated. To get around this, we explicitly set * aside a few blocks which will not be reserved in delayed allocation. * - * When rmap is disabled, we need to reserve 4 fsbs _per AG_ for the freelist - * and 4 more to handle a potential split of the file's bmap btree. - * - * When rmap is enabled, we must also be able to handle two rmap btree inserts - * to record both the file data extent and a new bmbt block. The bmbt block - * might not be in the same AG as the file data extent. In the worst case - * the bmap btree splits multiple levels and all the new blocks come from - * different AGs, so set aside enough to handle rmap btree splits in all AGs. + * We need to reserve 4 fsbs _per AG_ for the freelist and 4 more to handle a + * potential split of the file's bmap btree. */ unsigned int xfs_alloc_set_aside( @@ -86,8 +81,6 @@ xfs_alloc_set_aside( unsigned int blocks; blocks = 4 + (mp->m_sb.sb_agcount * XFS_ALLOC_AGFL_RESERVE); - if (xfs_sb_version_hasrmapbt(&mp->m_sb)) - blocks += mp->m_sb.sb_agcount * mp->m_rmap_maxlevels; return blocks; } @@ -676,12 +669,29 @@ xfs_alloc_ag_vextent( xfs_alloc_arg_t *args) /* argument structure for allocation */ { int error=0; + xfs_extlen_t reservation; + xfs_extlen_t oldmax; ASSERT(args->minlen > 0); ASSERT(args->maxlen > 0); ASSERT(args->minlen <= args->maxlen); ASSERT(args->mod < args->prod); ASSERT(args->alignment > 0); + + /* + * Clamp maxlen to the amount of free space minus any reservations + * that have been made. + */ + oldmax = args->maxlen; + reservation = xfs_ag_resv_needed(args->pag, args->resv); + if (args->maxlen > args->pag->pagf_freeblks - reservation) + args->maxlen = args->pag->pagf_freeblks - reservation; + if (args->maxlen == 0) { + args->agbno = NULLAGBLOCK; + args->maxlen = oldmax; + return 0; + } + /* * Branch to correct routine based on the type. */ @@ -701,12 +711,14 @@ xfs_alloc_ag_vextent( /* NOTREACHED */ } + args->maxlen = oldmax; + if (error || args->agbno == NULLAGBLOCK) return error; ASSERT(args->len >= args->minlen); ASSERT(args->len <= args->maxlen); - ASSERT(!args->wasfromfl || !args->isfl); + ASSERT(!args->wasfromfl || args->resv != XFS_AG_RESV_AGFL); ASSERT(args->agbno % args->alignment == 0); /* if not file data, insert new block into the reverse map btree */ @@ -728,12 +740,7 @@ xfs_alloc_ag_vextent( args->agbno, args->len)); } - if (!args->isfl) { - xfs_trans_mod_sb(args->tp, args->wasdel ? - XFS_TRANS_SB_RES_FDBLOCKS : - XFS_TRANS_SB_FDBLOCKS, - -((long)(args->len))); - } + xfs_ag_resv_alloc_extent(args->pag, args->resv, args); XFS_STATS_INC(args->mp, xs_allocx); XFS_STATS_ADD(args->mp, xs_allocb, args->len); @@ -1597,7 +1604,8 @@ xfs_alloc_ag_vextent_small( * to respect minleft even when pulling from the * freelist. */ - else if (args->minlen == 1 && args->alignment == 1 && !args->isfl && + else if (args->minlen == 1 && args->alignment == 1 && + args->resv != XFS_AG_RESV_AGFL && (be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_flcount) > args->minleft)) { error = xfs_alloc_get_freelist(args->tp, args->agbp, &fbno, 0); @@ -1626,7 +1634,8 @@ xfs_alloc_ag_vextent_small( /* * If we're feeding an AGFL block to something that * doesn't live in the free space, we need to clear - * out the OWN_AG rmap. + * out the OWN_AG rmap and add the block back to + * the AGFL per-AG reservation. */ xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG); error = xfs_rmap_free(args->tp, args->agbp, args->agno, @@ -1634,6 +1643,8 @@ xfs_alloc_ag_vextent_small( if (error) goto error0; pag = xfs_perag_get(args->mp, args->agno); + xfs_ag_resv_free_extent(pag, XFS_AG_RESV_AGFL, + args->tp, 1); xfs_perag_put(pag); *stat = 0; @@ -1682,7 +1693,7 @@ xfs_free_ag_extent( xfs_agblock_t bno, xfs_extlen_t len, struct xfs_owner_info *oinfo, - int isfl) + enum xfs_ag_resv_type type) { xfs_btree_cur_t *bno_cur; /* cursor for by-block btree */ xfs_btree_cur_t *cnt_cur; /* cursor for by-size btree */ @@ -1910,21 +1921,22 @@ xfs_free_ag_extent( */ pag = xfs_perag_get(mp, agno); error = xfs_alloc_update_counters(tp, pag, agbp, len); + xfs_ag_resv_free_extent(pag, type, tp, len); xfs_perag_put(pag); if (error) goto error0; - if (!isfl) - xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len); XFS_STATS_INC(mp, xs_freex); XFS_STATS_ADD(mp, xs_freeb, len); - trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright); + trace_xfs_free_extent(mp, agno, bno, len, type == XFS_AG_RESV_AGFL, + haveleft, haveright); return 0; error0: - trace_xfs_free_extent(mp, agno, bno, len, isfl, -1, -1); + trace_xfs_free_extent(mp, agno, bno, len, type == XFS_AG_RESV_AGFL, + -1, -1); if (bno_cur) xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR); if (cnt_cur) @@ -1949,21 +1961,43 @@ xfs_alloc_compute_maxlevels( } /* - * Find the length of the longest extent in an AG. + * Find the length of the longest extent in an AG. The 'need' parameter + * specifies how much space we're going to need for the AGFL and the + * 'reserved' parameter tells us how many blocks in this AG are reserved for + * other callers. */ xfs_extlen_t xfs_alloc_longest_free_extent( struct xfs_mount *mp, struct xfs_perag *pag, - xfs_extlen_t need) + xfs_extlen_t need, + xfs_extlen_t reserved) { xfs_extlen_t delta = 0; + /* + * If the AGFL needs a recharge, we'll have to subtract that from the + * longest extent. + */ if (need > pag->pagf_flcount) delta = need - pag->pagf_flcount; + /* + * If we cannot maintain others' reservations with space from the + * not-longest freesp extents, we'll have to subtract /that/ from + * the longest extent too. + */ + if (pag->pagf_freeblks - pag->pagf_longest < reserved) + delta += reserved - (pag->pagf_freeblks - pag->pagf_longest); + + /* + * If the longest extent is long enough to satisfy all the + * reservations and AGFL rules in place, we can return this extent. + */ if (pag->pagf_longest > delta) return pag->pagf_longest - delta; + + /* Otherwise, let the caller try for 1 block if there's space. */ return pag->pagf_flcount > 0 || pag->pagf_longest > 0; } @@ -2003,20 +2037,24 @@ xfs_alloc_space_available( { struct xfs_perag *pag = args->pag; xfs_extlen_t longest; + xfs_extlen_t reservation; /* blocks that are still reserved */ int available; if (flags & XFS_ALLOC_FLAG_FREEING) return true; + reservation = xfs_ag_resv_needed(pag, args->resv); + /* do we have enough contiguous free space for the allocation? */ - longest = xfs_alloc_longest_free_extent(args->mp, pag, min_free); + longest = xfs_alloc_longest_free_extent(args->mp, pag, min_free, + reservation); if ((args->minlen + args->alignment + args->minalignslop - 1) > longest) return false; - /* do have enough free space remaining for the allocation? */ + /* do we have enough free space remaining for the allocation? */ available = (int)(pag->pagf_freeblks + pag->pagf_flcount - - min_free - args->total); - if (available < (int)args->minleft) + reservation - min_free - args->total); + if (available < (int)args->minleft || available <= 0) return false; return true; @@ -2123,7 +2161,7 @@ xfs_alloc_fix_freelist( if (error) goto out_agbp_relse; error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1, - &targs.oinfo, 1); + &targs.oinfo, XFS_AG_RESV_AGFL); if (error) goto out_agbp_relse; bp = xfs_btree_get_bufs(mp, tp, args->agno, bno, 0); @@ -2134,7 +2172,7 @@ xfs_alloc_fix_freelist( targs.mp = mp; targs.agbp = agbp; targs.agno = args->agno; - targs.alignment = targs.minlen = targs.prod = targs.isfl = 1; + targs.alignment = targs.minlen = targs.prod = 1; targs.type = XFS_ALLOCTYPE_THIS_AG; targs.pag = pag; error = xfs_alloc_read_agfl(mp, tp, targs.agno, &agflbp); @@ -2145,6 +2183,7 @@ xfs_alloc_fix_freelist( while (pag->pagf_flcount < need) { targs.agbno = 0; targs.maxlen = need - pag->pagf_flcount; + targs.resv = XFS_AG_RESV_AGFL; /* Allocate as many blocks as possible at once. */ error = xfs_alloc_ag_vextent(&targs); @@ -2826,7 +2865,8 @@ xfs_free_extent( struct xfs_trans *tp, /* transaction pointer */ xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len, /* length of extent */ - struct xfs_owner_info *oinfo) /* extent owner */ + struct xfs_owner_info *oinfo, /* extent owner */ + enum xfs_ag_resv_type type) /* block reservation type */ { struct xfs_mount *mp = tp->t_mountp; struct xfs_buf *agbp; @@ -2835,6 +2875,7 @@ xfs_free_extent( int error; ASSERT(len != 0); + ASSERT(type != XFS_AG_RESV_AGFL); if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_FREE_EXTENT, @@ -2852,7 +2893,7 @@ xfs_free_extent( agbno + len <= be32_to_cpu(XFS_BUF_TO_AGF(agbp)->agf_length), err); - error = xfs_free_ag_extent(tp, agbp, agno, agbno, len, oinfo, 0); + error = xfs_free_ag_extent(tp, agbp, agno, agbno, len, oinfo, type); if (error) goto err; diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index 6fe2d6b..f7c5201 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -87,10 +87,10 @@ typedef struct xfs_alloc_arg { xfs_alloctype_t otype; /* original allocation type */ char wasdel; /* set if allocation was prev delayed */ char wasfromfl; /* set if allocation is from freelist */ - char isfl; /* set if is freelist blocks - !acctg */ char userdata; /* mask defining userdata treatment */ xfs_fsblock_t firstblock; /* io first block allocated */ struct xfs_owner_info oinfo; /* owner of blocks being allocated */ + enum xfs_ag_resv_type resv; /* block reservation to use */ } xfs_alloc_arg_t; /* @@ -106,7 +106,8 @@ unsigned int xfs_alloc_set_aside(struct xfs_mount *mp); unsigned int xfs_alloc_ag_max_usable(struct xfs_mount *mp); xfs_extlen_t xfs_alloc_longest_free_extent(struct xfs_mount *mp, - struct xfs_perag *pag, xfs_extlen_t need); + struct xfs_perag *pag, xfs_extlen_t need, + xfs_extlen_t reserved); unsigned int xfs_alloc_min_freelist(struct xfs_mount *mp, struct xfs_perag *pag); @@ -184,7 +185,8 @@ xfs_free_extent( struct xfs_trans *tp, /* transaction pointer */ xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len, /* length of extent */ - struct xfs_owner_info *oinfo);/* extent owner */ + struct xfs_owner_info *oinfo, /* extent owner */ + enum xfs_ag_resv_type type); /* block reservation type */ int /* error */ xfs_alloc_lookup_ge( diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 7da6b60..a50a8af 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -39,6 +39,7 @@ #include "xfs_attr_leaf.h" #include "xfs_quota_defs.h" #include "xfs_rmap.h" +#include "xfs_ag_resv.h" kmem_zone_t *xfs_bmap_free_item_zone; @@ -3493,7 +3494,8 @@ xfs_bmap_longest_free_extent( } longest = xfs_alloc_longest_free_extent(mp, pag, - xfs_alloc_min_freelist(mp, pag)); + xfs_alloc_min_freelist(mp, pag), + xfs_ag_resv_needed(pag, XFS_AG_RESV_NONE)); if (*blen < longest) *blen = longest; @@ -3773,7 +3775,7 @@ xfs_bmap_btalloc( } args.minleft = ap->minleft; args.wasdel = ap->wasdel; - args.isfl = 0; + args.resv = XFS_AG_RESV_NONE; args.userdata = ap->userdata; if (ap->userdata & XFS_ALLOC_USERDATA_ZERO) args.ip = ap->ip; diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 642e3bb..7bf6040 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -131,7 +131,7 @@ xfs_inobt_free_block( xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_INOBT); return xfs_free_extent(cur->bc_tp, XFS_DADDR_TO_FSB(cur->bc_mp, XFS_BUF_ADDR(bp)), 1, - &oinfo); + &oinfo, XFS_AG_RESV_NONE); } STATIC int From darrick.wong@oracle.com Thu Aug 25 18:47:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 186F080C0 for ; Thu, 25 Aug 2016 18:47:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8239AAC001 for ; Thu, 25 Aug 2016 16:47:18 -0700 (PDT) X-ASG-Debug-ID: 1472168835-0bf57b5312209950001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 91wEgaEoy9AKs9Hj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:16 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNlC96022611 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:47:12 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNlCKK021809 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:47:12 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNlBjV018584; Thu, 25 Aug 2016 23:47:11 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:11 -0700 Subject: [PATCH 06/71] xfs: introduce refcount btree definitions From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/71] xfs: introduce refcount btree definitions To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:09 -0700 Message-ID: <147216882960.4420.16410199718845659051.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168835 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8563 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add new per-AG refcount btree definitions to the per-AG structures. v2: Move the reflink inode flag out of the way of the DAX flag, and add the new cowextsize flag. v3: Don't allow pNFS to export reflinked files; this will be removed some day when the Linux pNFS server supports it. [hch: don't allow pNFS export of reflinked files] [darrick: fix the feature test in hch's patch] Signed-off-by: Darrick J. Wong Signed-off-by: Christoph Hellwig --- include/xfs_inode.h | 5 +++++ include/xfs_mount.h | 3 +++ libxfs/xfs_alloc.c | 5 +++++ libxfs/xfs_btree.c | 5 +++-- libxfs/xfs_btree.h | 3 +++ libxfs/xfs_format.h | 31 +++++++++++++++++++++++++++---- libxfs/xfs_rmap_btree.c | 7 +++++-- libxfs/xfs_types.h | 2 +- 8 files changed, 52 insertions(+), 9 deletions(-) diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 8141d97..3876fa6 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -122,6 +122,11 @@ xfs_set_projid(struct xfs_icdinode *id, prid_t projid) id->di_projid_lo = (__uint16_t) (projid & 0xffff); } +static inline bool xfs_is_reflink_inode(struct xfs_inode *ip) +{ + return ip->i_d.di_flags2 & XFS_DIFLAG2_REFLINK; +} + typedef struct cred { uid_t cr_uid; gid_t cr_gid; diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 62b9ef2..8301b78 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -163,6 +163,9 @@ typedef struct xfs_perag { struct xfs_ag_resv pag_meta_resv; /* Blocks reserved for just AGFL-based metadata. */ struct xfs_ag_resv pag_agfl_resv; + + /* reference count */ + __uint8_t pagf_refcount_level; } xfs_perag_t; static inline struct xfs_ag_resv * diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 5f111dd..a9a0820 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2453,6 +2453,10 @@ xfs_agf_verify( be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length)) return false; + if (xfs_sb_version_hasreflink(&mp->m_sb) && + be32_to_cpu(agf->agf_refcount_level) > XFS_BTREE_MAXLEVELS) + return false; + return true;; } @@ -2573,6 +2577,7 @@ xfs_alloc_read_agf( be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]); pag->pagf_levels[XFS_BTNUM_RMAPi] = be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAPi]); + pag->pagf_refcount_level = be32_to_cpu(agf->agf_refcount_level); spin_lock_init(&pag->pagb_lock); pag->pagb_count = 0; #ifdef __KERNEL__ diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 43c809f..3ad060f 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -41,9 +41,10 @@ kmem_zone_t *xfs_btree_cur_zone; */ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, 0, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, - XFS_FIBT_MAGIC }, + XFS_FIBT_MAGIC, 0 }, { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, XFS_RMAP_CRC_MAGIC, - XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC } + XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC, + XFS_REFC_CRC_MAGIC } }; #define xfs_btree_magic(cur) \ xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index be4a0c1..b5d820e 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -72,6 +72,7 @@ union xfs_btree_rec { #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) #define XFS_BTNUM_FINO ((xfs_btnum_t)XFS_BTNUM_FINOi) #define XFS_BTNUM_RMAP ((xfs_btnum_t)XFS_BTNUM_RMAPi) +#define XFS_BTNUM_REFC ((xfs_btnum_t)XFS_BTNUM_REFCi) /* * For logging record fields. @@ -105,6 +106,7 @@ do { \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(__mp, ibt, stat); break; \ case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(__mp, fibt, stat); break; \ case XFS_BTNUM_RMAP: __XFS_BTREE_STATS_INC(__mp, rmap, stat); break; \ + case XFS_BTNUM_REFC: break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ } \ } while (0) @@ -127,6 +129,7 @@ do { \ __XFS_BTREE_STATS_ADD(__mp, fibt, stat, val); break; \ case XFS_BTNUM_RMAP: \ __XFS_BTREE_STATS_ADD(__mp, rmap, stat, val); break; \ + case XFS_BTNUM_REFC: break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index ffa1931..3d1bad7 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -456,6 +456,7 @@ xfs_sb_has_compat_feature( #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ #define XFS_SB_FEAT_RO_COMPAT_RMAPBT (1 << 1) /* reverse map btree */ +#define XFS_SB_FEAT_RO_COMPAT_REFLINK (1 << 2) /* reflinked files */ #define XFS_SB_FEAT_RO_COMPAT_ALL \ (XFS_SB_FEAT_RO_COMPAT_FINOBT | \ XFS_SB_FEAT_RO_COMPAT_RMAPBT) @@ -546,6 +547,12 @@ static inline bool xfs_sb_version_hasrmapbt(struct xfs_sb *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT); } +static inline bool xfs_sb_version_hasreflink(struct xfs_sb *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && + (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_REFLINK); +} + /* * end of superblock version macros */ @@ -641,14 +648,17 @@ typedef struct xfs_agf { uuid_t agf_uuid; /* uuid of filesystem */ __be32 agf_rmap_blocks; /* rmapbt blocks used */ - __be32 agf_padding; /* padding */ + __be32 agf_refcount_blocks; /* refcountbt blocks used */ + + __be32 agf_refcount_root; /* refcount tree root block */ + __be32 agf_refcount_level; /* refcount btree levels */ /* * reserve some contiguous space for future logged fields before we add * the unlogged fields. This makes the range logging via flags and * structure offsets much simpler. */ - __be64 agf_spare64[15]; + __be64 agf_spare64[14]; /* unlogged fields, written during buffer writeback. */ __be64 agf_lsn; /* last write sequence */ @@ -1040,9 +1050,14 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) * 16 bits of the XFS_XFLAG_s range. */ #define XFS_DIFLAG2_DAX_BIT 0 /* use DAX for this inode */ +#define XFS_DIFLAG2_REFLINK_BIT 1 /* file's blocks may be shared */ +#define XFS_DIFLAG2_COWEXTSIZE_BIT 2 /* copy on write extent size hint */ #define XFS_DIFLAG2_DAX (1 << XFS_DIFLAG2_DAX_BIT) +#define XFS_DIFLAG2_REFLINK (1 << XFS_DIFLAG2_REFLINK_BIT) +#define XFS_DIFLAG2_COWEXTSIZE (1 << XFS_DIFLAG2_COWEXTSIZE_BIT) -#define XFS_DIFLAG2_ANY (XFS_DIFLAG2_DAX) +#define XFS_DIFLAG2_ANY \ + (XFS_DIFLAG2_DAX | XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE) /* * Inode number format: @@ -1352,7 +1367,8 @@ struct xfs_owner_info { #define XFS_RMAP_OWN_AG (-5ULL) /* AG freespace btree blocks */ #define XFS_RMAP_OWN_INOBT (-6ULL) /* Inode btree blocks */ #define XFS_RMAP_OWN_INODES (-7ULL) /* Inode chunk */ -#define XFS_RMAP_OWN_MIN (-8ULL) /* guard */ +#define XFS_RMAP_OWN_REFC (-8ULL) /* refcount tree */ +#define XFS_RMAP_OWN_MIN (-9ULL) /* guard */ #define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63))) @@ -1433,6 +1449,13 @@ typedef __be32 xfs_rmap_ptr_t; XFS_IBT_BLOCK(mp) + 1) /* + * Reference Count Btree format definitions + * + */ +#define XFS_REFC_CRC_MAGIC 0x52334643 /* 'R3FC' */ + + +/* * BMAP Btree format definitions * * This includes both the root block definition that sits inside an inode fork diff --git a/libxfs/xfs_rmap_btree.c b/libxfs/xfs_rmap_btree.c index d1b3c08..29a4dd6 100644 --- a/libxfs/xfs_rmap_btree.c +++ b/libxfs/xfs_rmap_btree.c @@ -510,6 +510,9 @@ void xfs_rmapbt_compute_maxlevels( struct xfs_mount *mp) { - mp->m_rmap_maxlevels = xfs_btree_compute_maxlevels(mp, - mp->m_rmap_mnr, mp->m_sb.sb_agblocks); + if (xfs_sb_version_hasreflink(&mp->m_sb)) + mp->m_rmap_maxlevels = XFS_BTREE_MAXLEVELS; + else + mp->m_rmap_maxlevels = xfs_btree_compute_maxlevels(mp, + mp->m_rmap_mnr, mp->m_sb.sb_agblocks); } diff --git a/libxfs/xfs_types.h b/libxfs/xfs_types.h index da87796..690d616 100644 --- a/libxfs/xfs_types.h +++ b/libxfs/xfs_types.h @@ -112,7 +112,7 @@ typedef enum { typedef enum { XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_RMAPi, XFS_BTNUM_BMAPi, - XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_MAX + XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_REFCi, XFS_BTNUM_MAX } xfs_btnum_t; struct xfs_name { From darrick.wong@oracle.com Thu Aug 25 18:47:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B854F80CC for ; Thu, 25 Aug 2016 18:47:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E89AAC001 for ; Thu, 25 Aug 2016 16:47:21 -0700 (PDT) X-ASG-Debug-ID: 1472168839-0bf81509b01e0090001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Nvs1HJqQsICQUHlF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNlI2q028952 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:47:18 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNlI7e000805 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:47:18 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNlHU6021222; Thu, 25 Aug 2016 23:47:17 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:17 -0700 Subject: [PATCH 07/71] xfs: add refcount btree stats infrastructure From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/71] xfs: add refcount btree stats infrastructure To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:15 -0700 Message-ID: <147216883596.4420.1036810242895247837.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168839 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1251 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The refcount btree presents the same stats as the other btrees, so add all the code for that now. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index b5d820e..81ee006 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -106,7 +106,7 @@ do { \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(__mp, ibt, stat); break; \ case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(__mp, fibt, stat); break; \ case XFS_BTNUM_RMAP: __XFS_BTREE_STATS_INC(__mp, rmap, stat); break; \ - case XFS_BTNUM_REFC: break; \ + case XFS_BTNUM_REFC: __XFS_BTREE_STATS_INC(__mp, refcbt, stat); break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ } \ } while (0) @@ -129,7 +129,8 @@ do { \ __XFS_BTREE_STATS_ADD(__mp, fibt, stat, val); break; \ case XFS_BTNUM_RMAP: \ __XFS_BTREE_STATS_ADD(__mp, rmap, stat, val); break; \ - case XFS_BTNUM_REFC: break; \ + case XFS_BTNUM_REFC: \ + __XFS_BTREE_STATS_ADD(__mp, refcbt, stat, val); break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ } \ } while (0) From darrick.wong@oracle.com Thu Aug 25 18:47:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EF3F080C4 for ; Thu, 25 Aug 2016 18:47:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B44F88F8035 for ; Thu, 25 Aug 2016 16:47:27 -0700 (PDT) X-ASG-Debug-ID: 1472168845-0bf57c55b31c7db0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id i0PsDlGHvljlLC53 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNlOBq028990 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:47:24 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNlOSd005921 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:47:24 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNlNOH000729; Thu, 25 Aug 2016 23:47:23 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:23 -0700 Subject: [PATCH 08/71] xfs: refcount btree add more reserved blocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/71] xfs: refcount btree add more reserved blocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:22 -0700 Message-ID: <147216884211.4420.5871705515934407781.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168846 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1575 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since XFS reserves a small amount of space in each AG as the minimum free space needed for an operation, save some more space in case we touch the refcount btree. Signed-off-by: Darrick J. Wong --- libxfs/xfs_alloc.c | 13 +++++++++++++ libxfs/xfs_format.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index a9a0820..8920c71 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -48,10 +48,23 @@ STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *); STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *); +unsigned int +xfs_refc_block( + struct xfs_mount *mp) +{ + if (xfs_sb_version_hasrmapbt(&mp->m_sb)) + return XFS_RMAP_BLOCK(mp) + 1; + if (xfs_sb_version_hasfinobt(&mp->m_sb)) + return XFS_FIBT_BLOCK(mp) + 1; + return XFS_IBT_BLOCK(mp) + 1; +} + xfs_extlen_t xfs_prealloc_blocks( struct xfs_mount *mp) { + if (xfs_sb_version_hasreflink(&mp->m_sb)) + return xfs_refc_block(mp) + 1; if (xfs_sb_version_hasrmapbt(&mp->m_sb)) return XFS_RMAP_BLOCK(mp) + 1; if (xfs_sb_version_hasfinobt(&mp->m_sb)) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index 3d1bad7..b028466 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1454,6 +1454,8 @@ typedef __be32 xfs_rmap_ptr_t; */ #define XFS_REFC_CRC_MAGIC 0x52334643 /* 'R3FC' */ +unsigned int xfs_refc_block(struct xfs_mount *mp); + /* * BMAP Btree format definitions From darrick.wong@oracle.com Thu Aug 25 18:47:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4810A80DB for ; Thu, 25 Aug 2016 18:47:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0CB908F8035 for ; Thu, 25 Aug 2016 16:47:37 -0700 (PDT) X-ASG-Debug-ID: 1472168854-0bf57b5313209970001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id pdK1zsH7XlZsut20 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:35 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNlU2K029021 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:47:31 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNlUuJ000947 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:47:30 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNlURr000749; Thu, 25 Aug 2016 23:47:30 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:29 -0700 Subject: [PATCH 09/71] xfs: define the on-disk refcount btree format From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/71] xfs: define the on-disk refcount btree format To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:28 -0700 Message-ID: <147216884827.4420.14285398405355006339.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168854 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 19105 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Start constructing the refcount btree implementation by establishing the on-disk format and everything needed to read, write, and manipulate the refcount btree blocks. v2: Calculate a separate maxlevels for the refcount btree. v3: Enable the tracking of per-cursor stats for refcount btrees. The refcount update code will use this to guess if it's time to split a refcountbt update across two transactions to avoid exhausing the transaction reservation. xfs_refcountbt_init_cursor can be called under the ilock, so use KM_NOFS to prevent fs activity with a lock held. This should shut up some of the lockdep warnings. Signed-off-by: Darrick J. Wong [hch: allocate the cursor with KM_NOFS to quiet lockdep] Signed-off-by: Christoph Hellwig --- include/darwin.h | 1 include/freebsd.h | 1 include/gnukfreebsd.h | 1 include/irix.h | 1 include/libxfs.h | 1 include/linux.h | 1 include/xfs_mount.h | 3 + libxfs/Makefile | 2 libxfs/init.c | 2 libxfs/xfs_btree.c | 3 + libxfs/xfs_btree.h | 12 +++ libxfs/xfs_format.h | 32 ++++++++ libxfs/xfs_refcount_btree.c | 177 +++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_refcount_btree.h | 67 ++++++++++++++++ libxfs/xfs_sb.c | 9 ++ libxfs/xfs_shared.h | 2 libxfs/xfs_trans_resv.c | 2 libxfs/xfs_trans_resv.h | 1 18 files changed, 317 insertions(+), 1 deletion(-) create mode 100644 libxfs/xfs_refcount_btree.c create mode 100644 libxfs/xfs_refcount_btree.h diff --git a/include/darwin.h b/include/darwin.h index 45e0c03..140386a 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -140,6 +140,7 @@ typedef off_t xfs_off_t; typedef u_int64_t xfs_ino_t; typedef u_int32_t xfs_dev_t; typedef int64_t xfs_daddr_t; +typedef u_int32_t xfs_nlink_t; #define stat64 stat #define fstat64 fstat diff --git a/include/freebsd.h b/include/freebsd.h index 6e77427..668dcea 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -51,6 +51,7 @@ typedef off_t off64_t; typedef __uint64_t xfs_ino_t; typedef __uint32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; +typedef __uint32_t xfs_nlink_t; typedef unsigned char __u8; typedef signed char __s8; diff --git a/include/gnukfreebsd.h b/include/gnukfreebsd.h index d55acfb..dfd31ae 100644 --- a/include/gnukfreebsd.h +++ b/include/gnukfreebsd.h @@ -40,6 +40,7 @@ typedef off_t xfs_off_t; typedef __uint64_t xfs_ino_t; typedef __uint32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; +typedef __uint32_t xfs_nlink_t; typedef unsigned char __u8; typedef signed char __s8; diff --git a/include/irix.h b/include/irix.h index b92e01b..8b9d588 100644 --- a/include/irix.h +++ b/include/irix.h @@ -47,6 +47,7 @@ typedef off64_t xfs_off_t; typedef __int64_t xfs_ino_t; typedef __int32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; +typedef __int32_t xfs_nlink_t; typedef unsigned char __u8; typedef signed char __s8; diff --git a/include/libxfs.h b/include/libxfs.h index cf59d6c..ec8f6ab 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -79,6 +79,7 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); #include "xfs_trans.h" #include "xfs_rmap_btree.h" #include "xfs_rmap.h" +#include "xfs_refcount_btree.h" #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) diff --git a/include/linux.h b/include/linux.h index 5614719..1663930 100644 --- a/include/linux.h +++ b/include/linux.h @@ -141,6 +141,7 @@ typedef off64_t xfs_off_t; typedef __uint64_t xfs_ino_t; typedef __uint32_t xfs_dev_t; typedef __int64_t xfs_daddr_t; +typedef __uint32_t xfs_nlink_t; /** * Abstraction of mountpoints. diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 8301b78..97b4ad7 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -66,10 +66,13 @@ typedef struct xfs_mount { uint m_inobt_mnr[2]; /* XFS_INOBT_BLOCK_MINRECS */ uint m_rmap_mxr[2]; /* max rmap btree records */ uint m_rmap_mnr[2]; /* min rmap btree records */ + uint m_refc_mxr[2]; /* max refc btree records */ + uint m_refc_mnr[2]; /* min refc btree records */ uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* XFS_IN_MAXLEVELS */ uint m_rmap_maxlevels; /* max rmap btree levels */ + uint m_refc_maxlevels; /* max refcount btree level */ xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ uint m_alloc_set_aside; /* space we can't use */ uint m_ag_max_usable; /* max space per AG */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 1b3bcca..ccfd8e9 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -36,6 +36,7 @@ HFILES = \ xfs_inode_buf.h \ xfs_inode_fork.h \ xfs_quota_defs.h \ + xfs_refcount_btree.h \ xfs_rmap.h \ xfs_rmap_btree.h \ xfs_sb.h \ @@ -86,6 +87,7 @@ CFILES = cache.c \ xfs_inode_fork.c \ xfs_ialloc_btree.c \ xfs_log_rlimit.c \ + xfs_refcount_btree.c \ xfs_rmap.c \ xfs_rmap_btree.c \ xfs_rtbitmap.c \ diff --git a/libxfs/init.c b/libxfs/init.c index c13b123..706925d 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -32,6 +32,7 @@ #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_rmap_btree.h" +#include "xfs_refcount_btree.h" #include "libxfs.h" /* for now */ @@ -687,6 +688,7 @@ libxfs_mount( xfs_bmap_compute_maxlevels(mp, XFS_ATTR_FORK); xfs_ialloc_compute_maxlevels(mp); xfs_rmapbt_compute_maxlevels(mp); + xfs_refcountbt_compute_maxlevels(mp); if (sbp->sb_imax_pct) { /* Make sure the maximum inode count is a multiple of the diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 3ad060f..0468a9e 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -1213,6 +1213,9 @@ xfs_btree_set_refs( case XFS_BTNUM_RMAP: xfs_buf_set_ref(bp, XFS_RMAP_BTREE_REF); break; + case XFS_BTNUM_REFC: + xfs_buf_set_ref(bp, XFS_REFC_BTREE_REF); + break; default: ASSERT(0); } diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index 81ee006..eb20376 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -49,6 +49,7 @@ union xfs_btree_key { struct xfs_inobt_key inobt; struct xfs_rmap_key rmap; struct xfs_rmap_key __rmap_bigkey[2]; + struct xfs_refcount_key refc; }; union xfs_btree_rec { @@ -57,6 +58,7 @@ union xfs_btree_rec { struct xfs_alloc_rec alloc; struct xfs_inobt_rec inobt; struct xfs_rmap_rec rmap; + struct xfs_refcount_rec refc; }; /* @@ -221,6 +223,15 @@ union xfs_btree_irec { struct xfs_bmbt_irec b; struct xfs_inobt_rec_incore i; struct xfs_rmap_irec r; + struct xfs_refcount_irec rc; +}; + +/* Per-AG btree private information. */ +union xfs_btree_cur_private { + struct { + unsigned long nr_ops; /* # record updates */ + int shape_changes; /* # of extent splits */ + } refc; }; /* @@ -247,6 +258,7 @@ typedef struct xfs_btree_cur struct xfs_buf *agbp; /* agf/agi buffer pointer */ struct xfs_defer_ops *dfops; /* deferred updates */ xfs_agnumber_t agno; /* ag number */ + union xfs_btree_cur_private priv; } a; struct { /* needed for BMAP */ struct xfs_inode *ip; /* pointer to our inode */ diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index b028466..6c81ce7 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1456,6 +1456,38 @@ typedef __be32 xfs_rmap_ptr_t; unsigned int xfs_refc_block(struct xfs_mount *mp); +/* + * Data record/key structure + * + * Each record associates a range of physical blocks (starting at + * rc_startblock and ending rc_blockcount blocks later) with a + * reference count (rc_refcount). A record is only stored in the + * btree if the refcount is > 2. An entry in the free block btree + * means that the refcount is 0, and no entries anywhere means that + * the refcount is 1, as was true in XFS before reflinking. + */ +struct xfs_refcount_rec { + __be32 rc_startblock; /* starting block number */ + __be32 rc_blockcount; /* count of blocks */ + __be32 rc_refcount; /* number of inodes linked here */ +}; + +struct xfs_refcount_key { + __be32 rc_startblock; /* starting block number */ +}; + +struct xfs_refcount_irec { + xfs_agblock_t rc_startblock; /* starting block number */ + xfs_extlen_t rc_blockcount; /* count of free blocks */ + xfs_nlink_t rc_refcount; /* number of inodes linked here */ +}; + +#define MAXREFCOUNT ((xfs_nlink_t)~0U) +#define MAXREFCEXTLEN ((xfs_extlen_t)~0U) + +/* btree pointer type */ +typedef __be32 xfs_refcount_ptr_t; + /* * BMAP Btree format definitions diff --git a/libxfs/xfs_refcount_btree.c b/libxfs/xfs_refcount_btree.c new file mode 100644 index 0000000..a7b99e4 --- /dev/null +++ b/libxfs/xfs_refcount_btree.c @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs_priv.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_btree.h" +#include "xfs_bmap.h" +#include "xfs_refcount_btree.h" +#include "xfs_alloc.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_trans.h" +#include "xfs_bit.h" + +static struct xfs_btree_cur * +xfs_refcountbt_dup_cursor( + struct xfs_btree_cur *cur) +{ + return xfs_refcountbt_init_cursor(cur->bc_mp, cur->bc_tp, + cur->bc_private.a.agbp, cur->bc_private.a.agno, + cur->bc_private.a.dfops); +} + +STATIC bool +xfs_refcountbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + struct xfs_perag *pag = bp->b_pag; + unsigned int level; + + if (block->bb_magic != cpu_to_be32(XFS_REFC_CRC_MAGIC)) + return false; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return false; + if (!xfs_btree_sblock_v5hdr_verify(bp)) + return false; + + level = be16_to_cpu(block->bb_level); + if (pag && pag->pagf_init) { + if (level >= pag->pagf_refcount_level) + return false; + } else if (level >= mp->m_refc_maxlevels) + return false; + + return xfs_btree_sblock_verify(bp, mp->m_refc_mxr[level != 0]); +} + +STATIC void +xfs_refcountbt_read_verify( + struct xfs_buf *bp) +{ + if (!xfs_btree_sblock_verify_crc(bp)) + xfs_buf_ioerror(bp, -EFSBADCRC); + else if (!xfs_refcountbt_verify(bp)) + xfs_buf_ioerror(bp, -EFSCORRUPTED); + + if (bp->b_error) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_verifier_error(bp); + } +} + +STATIC void +xfs_refcountbt_write_verify( + struct xfs_buf *bp) +{ + if (!xfs_refcountbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_buf_ioerror(bp, -EFSCORRUPTED); + xfs_verifier_error(bp); + return; + } + xfs_btree_sblock_calc_crc(bp); + +} + +const struct xfs_buf_ops xfs_refcountbt_buf_ops = { + .name = "xfs_refcountbt", + .verify_read = xfs_refcountbt_read_verify, + .verify_write = xfs_refcountbt_write_verify, +}; + +static const struct xfs_btree_ops xfs_refcountbt_ops = { + .rec_len = sizeof(struct xfs_refcount_rec), + .key_len = sizeof(struct xfs_refcount_key), + + .dup_cursor = xfs_refcountbt_dup_cursor, + .buf_ops = &xfs_refcountbt_buf_ops, +}; + +/* + * Allocate a new refcount btree cursor. + */ +struct xfs_btree_cur * +xfs_refcountbt_init_cursor( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agnumber_t agno, + struct xfs_defer_ops *dfops) +{ + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + struct xfs_btree_cur *cur; + + ASSERT(agno != NULLAGNUMBER); + ASSERT(agno < mp->m_sb.sb_agcount); + cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_NOFS); + + cur->bc_tp = tp; + cur->bc_mp = mp; + cur->bc_btnum = XFS_BTNUM_REFC; + cur->bc_blocklog = mp->m_sb.sb_blocklog; + cur->bc_ops = &xfs_refcountbt_ops; + + cur->bc_nlevels = be32_to_cpu(agf->agf_refcount_level); + + cur->bc_private.a.agbp = agbp; + cur->bc_private.a.agno = agno; + cur->bc_private.a.dfops = dfops; + cur->bc_flags |= XFS_BTREE_CRC_BLOCKS; + + cur->bc_private.a.priv.refc.nr_ops = 0; + cur->bc_private.a.priv.refc.shape_changes = 0; + + return cur; +} + +/* + * Calculate the number of records in a refcount btree block. + */ +int +xfs_refcountbt_maxrecs( + struct xfs_mount *mp, + int blocklen, + bool leaf) +{ + blocklen -= XFS_REFCOUNT_BLOCK_LEN; + + if (leaf) + return blocklen / sizeof(struct xfs_refcount_rec); + return blocklen / (sizeof(struct xfs_refcount_key) + + sizeof(xfs_refcount_ptr_t)); +} + +/* Compute the maximum height of a refcount btree. */ +void +xfs_refcountbt_compute_maxlevels( + struct xfs_mount *mp) +{ + mp->m_refc_maxlevels = xfs_btree_compute_maxlevels(mp, + mp->m_refc_mnr, mp->m_sb.sb_agblocks); +} diff --git a/libxfs/xfs_refcount_btree.h b/libxfs/xfs_refcount_btree.h new file mode 100644 index 0000000..9e9ad7c --- /dev/null +++ b/libxfs/xfs_refcount_btree.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_REFCOUNT_BTREE_H__ +#define __XFS_REFCOUNT_BTREE_H__ + +/* + * Reference Count Btree on-disk structures + */ + +struct xfs_buf; +struct xfs_btree_cur; +struct xfs_mount; + +/* + * Btree block header size + */ +#define XFS_REFCOUNT_BLOCK_LEN XFS_BTREE_SBLOCK_CRC_LEN + +/* + * Record, key, and pointer address macros for btree blocks. + * + * (note that some of these may appear unused, but they are used in userspace) + */ +#define XFS_REFCOUNT_REC_ADDR(block, index) \ + ((struct xfs_refcount_rec *) \ + ((char *)(block) + \ + XFS_REFCOUNT_BLOCK_LEN + \ + (((index) - 1) * sizeof(struct xfs_refcount_rec)))) + +#define XFS_REFCOUNT_KEY_ADDR(block, index) \ + ((struct xfs_refcount_key *) \ + ((char *)(block) + \ + XFS_REFCOUNT_BLOCK_LEN + \ + ((index) - 1) * sizeof(struct xfs_refcount_key))) + +#define XFS_REFCOUNT_PTR_ADDR(block, index, maxrecs) \ + ((xfs_refcount_ptr_t *) \ + ((char *)(block) + \ + XFS_REFCOUNT_BLOCK_LEN + \ + (maxrecs) * sizeof(struct xfs_refcount_key) + \ + ((index) - 1) * sizeof(xfs_refcount_ptr_t))) + +extern struct xfs_btree_cur *xfs_refcountbt_init_cursor(struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_buf *agbp, xfs_agnumber_t agno, + struct xfs_defer_ops *dfops); +extern int xfs_refcountbt_maxrecs(struct xfs_mount *mp, int blocklen, + bool leaf); +extern void xfs_refcountbt_compute_maxlevels(struct xfs_mount *mp); + +#endif /* __XFS_REFCOUNT_BTREE_H__ */ diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 0a1462f..de25489 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -35,6 +35,8 @@ #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" #include "xfs_rmap_btree.h" +#include "xfs_bmap.h" +#include "xfs_refcount_btree.h" /* * Physical superblock buffer manipulations. Shared with libxfs in userspace. @@ -740,6 +742,13 @@ xfs_sb_mount_common( mp->m_rmap_mnr[0] = mp->m_rmap_mxr[0] / 2; mp->m_rmap_mnr[1] = mp->m_rmap_mxr[1] / 2; + mp->m_refc_mxr[0] = xfs_refcountbt_maxrecs(mp, sbp->sb_blocksize, + true); + mp->m_refc_mxr[1] = xfs_refcountbt_maxrecs(mp, sbp->sb_blocksize, + false); + mp->m_refc_mnr[0] = mp->m_refc_mxr[0] / 2; + mp->m_refc_mnr[1] = mp->m_refc_mxr[1] / 2; + mp->m_bsize = XFS_FSB_TO_BB(mp, 1); mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, sbp->sb_inopblock); diff --git a/libxfs/xfs_shared.h b/libxfs/xfs_shared.h index 0c5b30b..c6f4eb4 100644 --- a/libxfs/xfs_shared.h +++ b/libxfs/xfs_shared.h @@ -39,6 +39,7 @@ extern const struct xfs_buf_ops xfs_agf_buf_ops; extern const struct xfs_buf_ops xfs_agfl_buf_ops; extern const struct xfs_buf_ops xfs_allocbt_buf_ops; extern const struct xfs_buf_ops xfs_rmapbt_buf_ops; +extern const struct xfs_buf_ops xfs_refcountbt_buf_ops; extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; extern const struct xfs_buf_ops xfs_bmbt_buf_ops; @@ -122,6 +123,7 @@ int xfs_log_calc_minimum_size(struct xfs_mount *); #define XFS_INO_REF 2 #define XFS_ATTR_BTREE_REF 1 #define XFS_DQUOT_REF 1 +#define XFS_REFC_BTREE_REF 1 /* * Flags for xfs_trans_ichgtime(). diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 2ed80a5..10234bb 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -72,7 +72,7 @@ xfs_calc_buf_res( * * Keep in mind that max depth is calculated separately for each type of tree. */ -static uint +uint xfs_allocfree_log_count( struct xfs_mount *mp, uint num_ops) diff --git a/libxfs/xfs_trans_resv.h b/libxfs/xfs_trans_resv.h index 0eb46ed..36a1511 100644 --- a/libxfs/xfs_trans_resv.h +++ b/libxfs/xfs_trans_resv.h @@ -102,5 +102,6 @@ struct xfs_trans_resv { #define XFS_ATTRRM_LOG_COUNT 3 void xfs_trans_resv_calc(struct xfs_mount *mp, struct xfs_trans_resv *resp); +uint xfs_allocfree_log_count(struct xfs_mount *mp, uint num_ops); #endif /* __XFS_TRANS_RESV_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:47:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7C03280E8 for ; Thu, 25 Aug 2016 18:47:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 32D698F8037 for ; Thu, 25 Aug 2016 16:47:41 -0700 (PDT) X-ASG-Debug-ID: 1472168859-0bf8155c741e8190001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Nlxyg7giCc2vewj5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:39 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNlaq3022775 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:47:36 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNlamC022261 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:47:36 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNlaEu000761; Thu, 25 Aug 2016 23:47:36 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:36 -0700 Subject: [PATCH 10/71] xfs: account for the refcount btree in the alloc/free log reservation From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/71] xfs: account for the refcount btree in the alloc/free log reservation To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:34 -0700 Message-ID: <147216885471.4420.4863290735646572937.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168859 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1464 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Every time we allocate or free an extent, we might need to split the refcount btree. Reserve some blocks in the transaction to handle this possibility. (Reproduced by generic/167 over NFS atop XFS) Signed-off-by: Christoph Hellwig [darrick.wong@oracle.com: add commit message] Signed-off-by: Darrick J. Wong --- libxfs/xfs_trans_resv.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 10234bb..5b6bbcd 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -66,7 +66,8 @@ xfs_calc_buf_res( * Per-extent log reservation for the btree changes involved in freeing or * allocating an extent. In classic XFS there were two trees that will be * modified (bnobt + cntbt). With rmap enabled, there are three trees - * (rmapbt). The number of blocks reserved is based on the formula: + * (rmapbt). With reflink, there are four trees (refcountbt). The number of + * blocks reserved is based on the formula: * * num trees * ((2 blocks/level * max depth) - 1) * @@ -82,6 +83,8 @@ xfs_allocfree_log_count( blocks = num_ops * 2 * (2 * mp->m_ag_maxlevels - 1); if (xfs_sb_version_hasrmapbt(&mp->m_sb)) blocks += num_ops * (2 * mp->m_rmap_maxlevels - 1); + if (xfs_sb_version_hasreflink(&mp->m_sb)) + blocks += num_ops * (2 * mp->m_refc_maxlevels - 1); return blocks; } From darrick.wong@oracle.com Thu Aug 25 18:47:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 049FB80E4 for ; Thu, 25 Aug 2016 18:47:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A4CAAC002 for ; Thu, 25 Aug 2016 16:47:50 -0700 (PDT) X-ASG-Debug-ID: 1472168866-0bf8155c771e81d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Uf7BGDk2hm7dr1GA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNlhUR029137 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:47:43 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNlhhh023254 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:47:43 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNlg50021459; Thu, 25 Aug 2016 23:47:43 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:42 -0700 Subject: [PATCH 11/71] xfs: add refcount btree operations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/71] xfs: add refcount btree operations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:40 -0700 Message-ID: <147216886093.4420.18074594362748070844.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168867 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 18443 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Implement the generic btree operations required to manipulate refcount btree blocks. The implementation is similar to the bmapbt, though it will only allocate and free blocks from the AG. v2: Remove init_rec_from_key since we no longer need it, and add tracepoints when refcount btree operations fail. Since the refcount root and level fields are separate from the existing roots and levels array, they need a separate logging flag. Signed-off-by: Darrick J. Wong [hch: fix logging of AGF refcount btree fields] Signed-off-by: Christoph Hellwig --- include/libxfs.h | 1 include/xfs_trace.h | 12 +++ libxfs/Makefile | 2 libxfs/xfs_alloc.c | 3 + libxfs/xfs_format.h | 10 ++ libxfs/xfs_refcount.c | 176 +++++++++++++++++++++++++++++++++++++ libxfs/xfs_refcount.h | 30 ++++++ libxfs/xfs_refcount_btree.c | 205 +++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 437 insertions(+), 2 deletions(-) create mode 100644 libxfs/xfs_refcount.c create mode 100644 libxfs/xfs_refcount.h diff --git a/include/libxfs.h b/include/libxfs.h index ec8f6ab..e5e1523 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -80,6 +80,7 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); #include "xfs_rmap_btree.h" #include "xfs_rmap.h" #include "xfs_refcount_btree.h" +#include "xfs_refcount.h" #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index a32eec3..937d5f5 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -224,6 +224,18 @@ #define trace_xfs_ag_resv_alloc_extent(...) ((void) 0) #define trace_xfs_ag_resv_free_extent(...) ((void) 0) +#define trace_xfs_refcount_lookup(...) ((void) 0) +#define trace_xfs_refcount_get(...) ((void) 0) +#define trace_xfs_refcount_update(...) ((void) 0) +#define trace_xfs_refcount_update_error(...) ((void) 0) +#define trace_xfs_refcount_insert(...) ((void) 0) +#define trace_xfs_refcount_insert_error(...) ((void) 0) +#define trace_xfs_refcount_delete(...) ((void) 0) +#define trace_xfs_refcount_delete_error(...) ((void) 0) +#define trace_xfs_refcountbt_free_block(...) ((void) 0) +#define trace_xfs_refcountbt_alloc_block(...) ((void) 0) +#define trace_xfs_refcount_rec_order_error(...) ((void) 0) + /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) #define trace_xfs_perag_get_tag(a,b,c,d) ((c) = (c)) diff --git a/libxfs/Makefile b/libxfs/Makefile index ccfd8e9..6499731 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -36,6 +36,7 @@ HFILES = \ xfs_inode_buf.h \ xfs_inode_fork.h \ xfs_quota_defs.h \ + xfs_refcount.h \ xfs_refcount_btree.h \ xfs_rmap.h \ xfs_rmap_btree.h \ @@ -87,6 +88,7 @@ CFILES = cache.c \ xfs_inode_fork.c \ xfs_ialloc_btree.c \ xfs_log_rlimit.c \ + xfs_refcount.c \ xfs_refcount_btree.c \ xfs_rmap.c \ xfs_rmap_btree.c \ diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 8920c71..e754647 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2329,6 +2329,9 @@ xfs_alloc_log_agf( offsetof(xfs_agf_t, agf_btreeblks), offsetof(xfs_agf_t, agf_uuid), offsetof(xfs_agf_t, agf_rmap_blocks), + offsetof(xfs_agf_t, agf_refcount_blocks), + offsetof(xfs_agf_t, agf_refcount_root), + offsetof(xfs_agf_t, agf_refcount_level), /* needed so that we don't log the whole rest of the structure: */ offsetof(xfs_agf_t, agf_spare64), sizeof(xfs_agf_t) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index 6c81ce7..bbb9334 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -684,8 +684,11 @@ typedef struct xfs_agf { #define XFS_AGF_BTREEBLKS 0x00000800 #define XFS_AGF_UUID 0x00001000 #define XFS_AGF_RMAP_BLOCKS 0x00002000 -#define XFS_AGF_SPARE64 0x00004000 -#define XFS_AGF_NUM_BITS 15 +#define XFS_AGF_REFCOUNT_BLOCKS 0x00004000 +#define XFS_AGF_REFCOUNT_ROOT 0x00008000 +#define XFS_AGF_REFCOUNT_LEVEL 0x00010000 +#define XFS_AGF_SPARE64 0x00020000 +#define XFS_AGF_NUM_BITS 18 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_FLAGS \ @@ -703,6 +706,9 @@ typedef struct xfs_agf { { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ { XFS_AGF_UUID, "UUID" }, \ { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" }, \ + { XFS_AGF_REFCOUNT_BLOCKS, "REFCOUNT_BLOCKS" }, \ + { XFS_AGF_REFCOUNT_ROOT, "REFCOUNT_ROOT" }, \ + { XFS_AGF_REFCOUNT_LEVEL, "REFCOUNT_LEVEL" }, \ { XFS_AGF_SPARE64, "SPARE64" } /* disk block (xfs_daddr_t) in the AG */ diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c new file mode 100644 index 0000000..8b522e2 --- /dev/null +++ b/libxfs/xfs_refcount.c @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs_priv.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_btree.h" +#include "xfs_bmap.h" +#include "xfs_refcount_btree.h" +#include "xfs_alloc.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_trans.h" +#include "xfs_bit.h" +#include "xfs_refcount.h" + +/* + * Look up the first record less than or equal to [bno, len] in the btree + * given by cur. + */ +int +xfs_refcount_lookup_le( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + int *stat) +{ + trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno, + XFS_LOOKUP_LE); + cur->bc_rec.rc.rc_startblock = bno; + cur->bc_rec.rc.rc_blockcount = 0; + return xfs_btree_lookup(cur, XFS_LOOKUP_LE, stat); +} + +/* + * Look up the first record greater than or equal to [bno, len] in the btree + * given by cur. + */ +int +xfs_refcount_lookup_ge( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + int *stat) +{ + trace_xfs_refcount_lookup(cur->bc_mp, cur->bc_private.a.agno, bno, + XFS_LOOKUP_GE); + cur->bc_rec.rc.rc_startblock = bno; + cur->bc_rec.rc.rc_blockcount = 0; + return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat); +} + +/* + * Get the data from the pointed-to record. + */ +int +xfs_refcount_get_rec( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *irec, + int *stat) +{ + union xfs_btree_rec *rec; + int error; + + error = xfs_btree_get_rec(cur, &rec, stat); + if (!error && *stat == 1) { + irec->rc_startblock = be32_to_cpu(rec->refc.rc_startblock); + irec->rc_blockcount = be32_to_cpu(rec->refc.rc_blockcount); + irec->rc_refcount = be32_to_cpu(rec->refc.rc_refcount); + trace_xfs_refcount_get(cur->bc_mp, cur->bc_private.a.agno, + irec); + } + return error; +} + +/* + * Update the record referred to by cur to the value given + * by [bno, len, refcount]. + * This either works (return 0) or gets an EFSCORRUPTED error. + */ +STATIC int +xfs_refcount_update( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *irec) +{ + union xfs_btree_rec rec; + int error; + + trace_xfs_refcount_update(cur->bc_mp, cur->bc_private.a.agno, irec); + rec.refc.rc_startblock = cpu_to_be32(irec->rc_startblock); + rec.refc.rc_blockcount = cpu_to_be32(irec->rc_blockcount); + rec.refc.rc_refcount = cpu_to_be32(irec->rc_refcount); + error = xfs_btree_update(cur, &rec); + if (error) + trace_xfs_refcount_update_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Insert the record referred to by cur to the value given + * by [bno, len, refcount]. + * This either works (return 0) or gets an EFSCORRUPTED error. + */ +STATIC int +xfs_refcount_insert( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *irec, + int *i) +{ + int error; + + trace_xfs_refcount_insert(cur->bc_mp, cur->bc_private.a.agno, irec); + cur->bc_rec.rc.rc_startblock = irec->rc_startblock; + cur->bc_rec.rc.rc_blockcount = irec->rc_blockcount; + cur->bc_rec.rc.rc_refcount = irec->rc_refcount; + error = xfs_btree_insert(cur, i); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, *i == 1, out_error); +out_error: + if (error) + trace_xfs_refcount_insert_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Remove the record referred to by cur, then set the pointer to the spot + * where the record could be re-inserted, in case we want to increment or + * decrement the cursor. + * This either works (return 0) or gets an EFSCORRUPTED error. + */ +STATIC int +xfs_refcount_delete( + struct xfs_btree_cur *cur, + int *i) +{ + struct xfs_refcount_irec irec; + int found_rec; + int error; + + error = xfs_refcount_get_rec(cur, &irec, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + trace_xfs_refcount_delete(cur->bc_mp, cur->bc_private.a.agno, &irec); + error = xfs_btree_delete(cur, i); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, *i == 1, out_error); + if (error) + goto out_error; + error = xfs_refcount_lookup_ge(cur, irec.rc_startblock, &found_rec); +out_error: + if (error) + trace_xfs_refcount_delete_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} diff --git a/libxfs/xfs_refcount.h b/libxfs/xfs_refcount.h new file mode 100644 index 0000000..4dc335a --- /dev/null +++ b/libxfs/xfs_refcount.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_REFCOUNT_H__ +#define __XFS_REFCOUNT_H__ + +extern int xfs_refcount_lookup_le(struct xfs_btree_cur *cur, + xfs_agblock_t bno, int *stat); +extern int xfs_refcount_lookup_ge(struct xfs_btree_cur *cur, + xfs_agblock_t bno, int *stat); +extern int xfs_refcount_get_rec(struct xfs_btree_cur *cur, + struct xfs_refcount_irec *irec, int *stat); + +#endif /* __XFS_REFCOUNT_H__ */ diff --git a/libxfs/xfs_refcount_btree.c b/libxfs/xfs_refcount_btree.c index a7b99e4..04f8db0 100644 --- a/libxfs/xfs_refcount_btree.c +++ b/libxfs/xfs_refcount_btree.c @@ -33,6 +33,7 @@ #include "xfs_cksum.h" #include "xfs_trans.h" #include "xfs_bit.h" +#include "xfs_rmap.h" static struct xfs_btree_cur * xfs_refcountbt_dup_cursor( @@ -43,6 +44,160 @@ xfs_refcountbt_dup_cursor( cur->bc_private.a.dfops); } +STATIC void +xfs_refcountbt_set_root( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr, + int inc) +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); + struct xfs_perag *pag = xfs_perag_get(cur->bc_mp, seqno); + + ASSERT(ptr->s != 0); + + agf->agf_refcount_root = ptr->s; + be32_add_cpu(&agf->agf_refcount_level, inc); + pag->pagf_refcount_level += inc; + xfs_perag_put(pag); + + xfs_alloc_log_agf(cur->bc_tp, agbp, + XFS_AGF_REFCOUNT_ROOT | XFS_AGF_REFCOUNT_LEVEL); +} + +STATIC int +xfs_refcountbt_alloc_block( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *start, + union xfs_btree_ptr *new, + int *stat) +{ + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + struct xfs_alloc_arg args; /* block allocation args */ + int error; /* error return value */ + + memset(&args, 0, sizeof(args)); + args.tp = cur->bc_tp; + args.mp = cur->bc_mp; + args.type = XFS_ALLOCTYPE_NEAR_BNO; + args.fsbno = XFS_AGB_TO_FSB(cur->bc_mp, cur->bc_private.a.agno, + xfs_refc_block(args.mp)); + args.firstblock = args.fsbno; + xfs_rmap_ag_owner(&args.oinfo, XFS_RMAP_OWN_REFC); + args.minlen = args.maxlen = args.prod = 1; + + error = xfs_alloc_vextent(&args); + if (error) + goto out_error; + trace_xfs_refcountbt_alloc_block(cur->bc_mp, cur->bc_private.a.agno, + args.agbno, 1); + if (args.fsbno == NULLFSBLOCK) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 0; + return 0; + } + ASSERT(args.agno == cur->bc_private.a.agno); + ASSERT(args.len == 1); + + new->s = cpu_to_be32(args.agbno); + be32_add_cpu(&agf->agf_refcount_blocks, 1); + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); + + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 1; + return 0; + +out_error: + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; +} + +STATIC int +xfs_refcountbt_free_block( + struct xfs_btree_cur *cur, + struct xfs_buf *bp) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_buf *agbp = cur->bc_private.a.agbp; + struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); + struct xfs_owner_info oinfo; + + trace_xfs_refcountbt_free_block(cur->bc_mp, cur->bc_private.a.agno, + XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1); + xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_REFC); + be32_add_cpu(&agf->agf_refcount_blocks, -1); + xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); + xfs_bmap_add_free(mp, cur->bc_private.a.dfops, fsbno, 1, + &oinfo); + + return 0; +} + +STATIC int +xfs_refcountbt_get_minrecs( + struct xfs_btree_cur *cur, + int level) +{ + return cur->bc_mp->m_refc_mnr[level != 0]; +} + +STATIC int +xfs_refcountbt_get_maxrecs( + struct xfs_btree_cur *cur, + int level) +{ + return cur->bc_mp->m_refc_mxr[level != 0]; +} + +STATIC void +xfs_refcountbt_init_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + ASSERT(rec->refc.rc_startblock != 0); + + key->refc.rc_startblock = rec->refc.rc_startblock; +} + +STATIC void +xfs_refcountbt_init_rec_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec) +{ + ASSERT(cur->bc_rec.rc.rc_startblock != 0); + + rec->refc.rc_startblock = cpu_to_be32(cur->bc_rec.rc.rc_startblock); + rec->refc.rc_blockcount = cpu_to_be32(cur->bc_rec.rc.rc_blockcount); + rec->refc.rc_refcount = cpu_to_be32(cur->bc_rec.rc.rc_refcount); +} + +STATIC void +xfs_refcountbt_init_ptr_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + struct xfs_agf *agf = XFS_BUF_TO_AGF(cur->bc_private.a.agbp); + + ASSERT(cur->bc_private.a.agno == be32_to_cpu(agf->agf_seqno)); + ASSERT(agf->agf_refcount_root != 0); + + ptr->s = agf->agf_refcount_root; +} + +STATIC __int64_t +xfs_refcountbt_key_diff( + struct xfs_btree_cur *cur, + union xfs_btree_key *key) +{ + struct xfs_refcount_irec *rec = &cur->bc_rec.rc; + struct xfs_refcount_key *kp = &key->refc; + + return (__int64_t)be32_to_cpu(kp->rc_startblock) - rec->rc_startblock; +} + STATIC bool xfs_refcountbt_verify( struct xfs_buf *bp) @@ -105,12 +260,62 @@ const struct xfs_buf_ops xfs_refcountbt_buf_ops = { .verify_write = xfs_refcountbt_write_verify, }; +#if defined(DEBUG) || defined(XFS_WARN) +STATIC int +xfs_refcountbt_keys_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return be32_to_cpu(k1->refc.rc_startblock) < + be32_to_cpu(k2->refc.rc_startblock); +} + +STATIC int +xfs_refcountbt_recs_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_rec *r1, + union xfs_btree_rec *r2) +{ + struct xfs_refcount_irec a, b; + + int ret = be32_to_cpu(r1->refc.rc_startblock) + + be32_to_cpu(r1->refc.rc_blockcount) <= + be32_to_cpu(r2->refc.rc_startblock); + if (!ret) { + a.rc_startblock = be32_to_cpu(r1->refc.rc_startblock); + a.rc_blockcount = be32_to_cpu(r1->refc.rc_blockcount); + a.rc_refcount = be32_to_cpu(r1->refc.rc_refcount); + b.rc_startblock = be32_to_cpu(r2->refc.rc_startblock); + b.rc_blockcount = be32_to_cpu(r2->refc.rc_blockcount); + b.rc_refcount = be32_to_cpu(r2->refc.rc_refcount); + trace_xfs_refcount_rec_order_error(cur->bc_mp, + cur->bc_private.a.agno, &a, &b); + } + + return ret; +} +#endif /* DEBUG */ + static const struct xfs_btree_ops xfs_refcountbt_ops = { .rec_len = sizeof(struct xfs_refcount_rec), .key_len = sizeof(struct xfs_refcount_key), .dup_cursor = xfs_refcountbt_dup_cursor, + .set_root = xfs_refcountbt_set_root, + .alloc_block = xfs_refcountbt_alloc_block, + .free_block = xfs_refcountbt_free_block, + .get_minrecs = xfs_refcountbt_get_minrecs, + .get_maxrecs = xfs_refcountbt_get_maxrecs, + .init_key_from_rec = xfs_refcountbt_init_key_from_rec, + .init_rec_from_cur = xfs_refcountbt_init_rec_from_cur, + .init_ptr_from_cur = xfs_refcountbt_init_ptr_from_cur, + .key_diff = xfs_refcountbt_key_diff, .buf_ops = &xfs_refcountbt_buf_ops, +#if defined(DEBUG) || defined(XFS_WARN) + .keys_inorder = xfs_refcountbt_keys_inorder, + .recs_inorder = xfs_refcountbt_recs_inorder, +#endif }; /* From darrick.wong@oracle.com Thu Aug 25 18:47:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 47B7D80F5 for ; Thu, 25 Aug 2016 18:47:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1929D8F8035 for ; Thu, 25 Aug 2016 16:47:55 -0700 (PDT) X-ASG-Debug-ID: 1472168872-0bf57c55b31c7dd0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id U7IQwrqFAEXx5ZSk (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:47:53 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNlpLH022906 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:47:52 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNlpW3006361 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:47:51 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNlo54000646; Thu, 25 Aug 2016 23:47:51 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:50 -0700 Subject: [PATCH 12/71] xfs: create refcount update intent log items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 12/71] xfs: create refcount update intent log items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:47 -0700 Message-ID: <147216886741.4420.9217180914915429445.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168873 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3424 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create refcount update intent/done log items to record redo information in the log. Because we need to roll transactions between updating the bmbt mapping and updating the reverse mapping, we also have to track the status of the metadata updates that will be recorded in the post-roll transactions, just in case we crash before committing the final transaction. This mechanism enables log recovery to finish what was already started. Signed-off-by: Darrick J. Wong --- libxfs/xfs_log_format.h | 53 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_log_format.h b/libxfs/xfs_log_format.h index 96c7010..ebf5dc0 100644 --- a/libxfs/xfs_log_format.h +++ b/libxfs/xfs_log_format.h @@ -112,7 +112,9 @@ static inline uint xlog_get_cycle(char *ptr) #define XLOG_REG_TYPE_ICREATE 20 #define XLOG_REG_TYPE_RUI_FORMAT 21 #define XLOG_REG_TYPE_RUD_FORMAT 22 -#define XLOG_REG_TYPE_MAX 22 +#define XLOG_REG_TYPE_CUI_FORMAT 23 +#define XLOG_REG_TYPE_CUD_FORMAT 24 +#define XLOG_REG_TYPE_MAX 24 /* * Flags to log operation header @@ -231,6 +233,8 @@ typedef struct xfs_trans_header { #define XFS_LI_ICREATE 0x123f #define XFS_LI_RUI 0x1240 /* rmap update intent */ #define XFS_LI_RUD 0x1241 +#define XFS_LI_CUI 0x1242 /* refcount update intent */ +#define XFS_LI_CUD 0x1243 #define XFS_LI_TYPE_DESC \ { XFS_LI_EFI, "XFS_LI_EFI" }, \ @@ -242,7 +246,9 @@ typedef struct xfs_trans_header { { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" }, \ { XFS_LI_ICREATE, "XFS_LI_ICREATE" }, \ { XFS_LI_RUI, "XFS_LI_RUI" }, \ - { XFS_LI_RUD, "XFS_LI_RUD" } + { XFS_LI_RUD, "XFS_LI_RUD" }, \ + { XFS_LI_CUI, "XFS_LI_CUI" }, \ + { XFS_LI_CUD, "XFS_LI_CUD" } /* * Inode Log Item Format definitions. @@ -663,6 +669,49 @@ struct xfs_rud_log_format { }; /* + * CUI/CUD (refcount update) log format definitions + */ +struct xfs_phys_extent { + __uint64_t pe_startblock; + __uint32_t pe_len; + __uint32_t pe_flags; +}; + +/* refcount pe_flags: upper bits are flags, lower byte is type code */ +#define XFS_REFCOUNT_EXTENT_INCREASE 1 +#define XFS_REFCOUNT_EXTENT_DECREASE 2 +#define XFS_REFCOUNT_EXTENT_ALLOC_COW 3 +#define XFS_REFCOUNT_EXTENT_FREE_COW 4 +#define XFS_REFCOUNT_EXTENT_TYPE_MASK 0xFF + +#define XFS_REFCOUNT_EXTENT_FLAGS (XFS_REFCOUNT_EXTENT_TYPE_MASK) + +/* + * This is the structure used to lay out a cui log item in the + * log. The cui_extents field is a variable size array whose + * size is given by cui_nextents. + */ +struct xfs_cui_log_format { + __uint16_t cui_type; /* cui log item type */ + __uint16_t cui_size; /* size of this item */ + __uint32_t cui_nextents; /* # extents to free */ + __uint64_t cui_id; /* cui identifier */ + struct xfs_phys_extent cui_extents[1]; /* array of extents */ +}; + +/* + * This is the structure used to lay out a cud log item in the + * log. The cud_extents array is a variable size array whose + * size is given by cud_nextents; + */ +struct xfs_cud_log_format { + __uint16_t cud_type; /* cud log item type */ + __uint16_t cud_size; /* size of this item */ + __uint32_t __pad; + __uint64_t cud_cui_id; /* id of corresponding cui */ +}; + +/* * Dquot Log format definitions. * * The first two fields must be the type and size fitting into From darrick.wong@oracle.com Thu Aug 25 18:48:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF56780FD for ; Thu, 25 Aug 2016 18:48:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A47F3304039 for ; Thu, 25 Aug 2016 16:48:03 -0700 (PDT) X-ASG-Debug-ID: 1472168881-0bf57c55b31c7de0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Xv6rATR8ZBtCExdE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNm05w029210 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:00 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNm0rG001395 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:00 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNlute018826; Thu, 25 Aug 2016 23:47:59 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:47:56 -0700 Subject: [PATCH 13/71] xfs: log refcount intent items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 13/71] xfs: log refcount intent items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:47:55 -0700 Message-ID: <147216887536.4420.16308398963061320982.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168881 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1067 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide a mechanism for higher levels to create CUI/CUD items, submit them to the log, and a stub function to deal with recovered CUI items. These parts will be connected to the refcountbt in a later patch. Signed-off-by: Darrick J. Wong --- libxfs/xfs_refcount.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libxfs/xfs_refcount.h b/libxfs/xfs_refcount.h index 4dc335a..2ef2b28 100644 --- a/libxfs/xfs_refcount.h +++ b/libxfs/xfs_refcount.h @@ -27,4 +27,18 @@ extern int xfs_refcount_lookup_ge(struct xfs_btree_cur *cur, extern int xfs_refcount_get_rec(struct xfs_btree_cur *cur, struct xfs_refcount_irec *irec, int *stat); +enum xfs_refcount_intent_type { + XFS_REFCOUNT_INCREASE, + XFS_REFCOUNT_DECREASE, + XFS_REFCOUNT_ALLOC_COW, + XFS_REFCOUNT_FREE_COW, +}; + +struct xfs_refcount_intent { + struct list_head ri_list; + enum xfs_refcount_intent_type ri_type; + xfs_fsblock_t ri_startblock; + xfs_extlen_t ri_blockcount; +}; + #endif /* __XFS_REFCOUNT_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:48:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D479A8106 for ; Thu, 25 Aug 2016 18:48:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A7B88304039 for ; Thu, 25 Aug 2016 16:48:10 -0700 (PDT) X-ASG-Debug-ID: 1472168886-0bf57b5312209990001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id mQfro3Ts6qKm6NJA (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNm4jI029498 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:04 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNm45b001555 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:04 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNm3I1000692; Thu, 25 Aug 2016 23:48:03 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:02 -0700 Subject: [PATCH 14/71] xfs: adjust refcount of an extent of blocks in refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 14/71] xfs: adjust refcount of an extent of blocks in refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:01 -0700 Message-ID: <147216888152.4420.5174473213933092027.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168886 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 25987 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide functions to adjust the reference counts for an extent of physical blocks stored in the refcount btree. v2: Refactor the left/right split code into a single function. Track the number of btree shape changes and record updates during a refcount update so that we can decide if we need to get a fresh transaction to continue. Signed-off-by: Darrick J. Wong --- include/xfs_trace.h | 20 + libxfs/xfs_refcount.c | 783 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 803 insertions(+) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 937d5f5..5605c3c 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -235,6 +235,26 @@ #define trace_xfs_refcountbt_free_block(...) ((void) 0) #define trace_xfs_refcountbt_alloc_block(...) ((void) 0) #define trace_xfs_refcount_rec_order_error(...) ((void) 0) +#define trace_xfs_refcount_split_extent(...) ((void) 0) +#define trace_xfs_refcount_split_extent_error(...) ((void) 0) +#define trace_xfs_refcount_merge_center_extents_error(...) ((void) 0) +#define trace_xfs_refcount_merge_left_extent_error(...) ((void) 0) +#define trace_xfs_refcount_merge_right_extent_error(...) ((void) 0) +#define trace_xfs_refcount_find_left_extent(...) ((void) 0) +#define trace_xfs_refcount_find_left_extent_error(...) ((void) 0) +#define trace_xfs_refcount_find_right_extent(...) ((void) 0) +#define trace_xfs_refcount_find_right_extent_error(...) ((void) 0) +#define trace_xfs_refcount_merge_center_extents(...) ((void) 0) +#define trace_xfs_refcount_merge_left_extent(...) ((void) 0) +#define trace_xfs_refcount_merge_right_extent(...) ((void) 0) +#define trace_xfs_refcount_modify_extent(...) ((void) 0) +#define trace_xfs_refcount_modify_extent_error(...) ((void) 0) +#define trace_xfs_refcount_adjust_error(...) ((void) 0) +#define trace_xfs_refcount_increase(...) ((void) 0) +#define trace_xfs_refcount_decrease(...) ((void) 0) +#define trace_xfs_refcount_deferred(...) ((void) 0) +#define trace_xfs_refcount_defer(...) ((void) 0) +#define trace_xfs_refcount_finish_one_leftover(...) ((void) 0) /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index 8b522e2..08866f8 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -36,6 +36,12 @@ #include "xfs_bit.h" #include "xfs_refcount.h" +/* Allowable refcount adjustment amounts. */ +enum xfs_refc_adjust_op { + XFS_REFCOUNT_ADJUST_INCREASE = 1, + XFS_REFCOUNT_ADJUST_DECREASE = -1, +}; + /* * Look up the first record less than or equal to [bno, len] in the btree * given by cur. @@ -174,3 +180,780 @@ out_error: cur->bc_private.a.agno, error, _RET_IP_); return error; } + +/* + * Adjusting the Reference Count + * + * As stated elsewhere, the reference count btree (refcbt) stores + * >1 reference counts for extents of physical blocks. In this + * operation, we're either raising or lowering the reference count of + * some subrange stored in the tree: + * + * <------ adjustment range ------> + * ----+ +---+-----+ +--+--------+--------- + * 2 | | 3 | 4 | |17| 55 | 10 + * ----+ +---+-----+ +--+--------+--------- + * X axis is physical blocks number; + * reference counts are the numbers inside the rectangles + * + * The first thing we need to do is to ensure that there are no + * refcount extents crossing either boundary of the range to be + * adjusted. For any extent that does cross a boundary, split it into + * two extents so that we can increment the refcount of one of the + * pieces later: + * + * <------ adjustment range ------> + * ----+ +---+-----+ +--+--------+----+---- + * 2 | | 3 | 2 | |17| 55 | 10 | 10 + * ----+ +---+-----+ +--+--------+----+---- + * + * For this next step, let's assume that all the physical blocks in + * the adjustment range are mapped to a file and are therefore in use + * at least once. Therefore, we can infer that any gap in the + * refcount tree within the adjustment range represents a physical + * extent with refcount == 1: + * + * <------ adjustment range ------> + * ----+---+---+-----+-+--+--------+----+---- + * 2 |"1"| 3 | 2 |1|17| 55 | 10 | 10 + * ----+---+---+-----+-+--+--------+----+---- + * ^ + * + * For each extent that falls within the interval range, figure out + * which extent is to the left or the right of that extent. Now we + * have a left, current, and right extent. If the new reference count + * of the center extent enables us to merge left, center, and right + * into one record covering all three, do so. If the center extent is + * at the left end of the range, abuts the left extent, and its new + * reference count matches the left extent's record, then merge them. + * If the center extent is at the right end of the range, abuts the + * right extent, and the reference counts match, merge those. In the + * example, we can left merge (assuming an increment operation): + * + * <------ adjustment range ------> + * --------+---+-----+-+--+--------+----+---- + * 2 | 3 | 2 |1|17| 55 | 10 | 10 + * --------+---+-----+-+--+--------+----+---- + * ^ + * + * For all other extents within the range, adjust the reference count + * or delete it if the refcount falls below 2. If we were + * incrementing, the end result looks like this: + * + * <------ adjustment range ------> + * --------+---+-----+-+--+--------+----+---- + * 2 | 4 | 3 |2|18| 56 | 11 | 10 + * --------+---+-----+-+--+--------+----+---- + * + * The result of a decrement operation looks as such: + * + * <------ adjustment range ------> + * ----+ +---+ +--+--------+----+---- + * 2 | | 2 | |16| 54 | 9 | 10 + * ----+ +---+ +--+--------+----+---- + * DDDD 111111DD + * + * The blocks marked "D" are freed; the blocks marked "1" are only + * referenced once and therefore the record is removed from the + * refcount btree. + */ + +#define RCNEXT(rc) ((rc).rc_startblock + (rc).rc_blockcount) +/* + * Split a refcount extent that crosses agbno. + */ +STATIC int +xfs_refcount_split_extent( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + bool *shape_changed) +{ + struct xfs_refcount_irec rcext, tmp; + int found_rec; + int error; + + *shape_changed = false; + error = xfs_refcount_lookup_le(cur, agbno, &found_rec); + if (error) + goto out_error; + if (!found_rec) + return 0; + + error = xfs_refcount_get_rec(cur, &rcext, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + if (rcext.rc_startblock == agbno || RCNEXT(rcext) <= agbno) + return 0; + + *shape_changed = true; + trace_xfs_refcount_split_extent(cur->bc_mp, cur->bc_private.a.agno, + &rcext, agbno); + + /* Establish the right extent. */ + tmp = rcext; + tmp.rc_startblock = agbno; + tmp.rc_blockcount -= (agbno - rcext.rc_startblock); + error = xfs_refcount_update(cur, &tmp); + if (error) + goto out_error; + + /* Insert the left extent. */ + tmp = rcext; + tmp.rc_blockcount = agbno - rcext.rc_startblock; + error = xfs_refcount_insert(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + return error; + +out_error: + trace_xfs_refcount_split_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Merge the left, center, and right extents. + */ +STATIC int +xfs_refcount_merge_center_extent( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *left, + struct xfs_refcount_irec *center, + unsigned long long extlen, + xfs_agblock_t *agbno, + xfs_extlen_t *aglen) +{ + int error; + int found_rec; + + error = xfs_refcount_lookup_ge(cur, center->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + if (center->rc_refcount > 1) { + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + } + + error = xfs_refcount_lookup_le(cur, left->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + left->rc_blockcount = extlen; + error = xfs_refcount_update(cur, left); + if (error) + goto out_error; + + *aglen = 0; + return error; + +out_error: + trace_xfs_refcount_merge_center_extents_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Merge with the left extent. + */ +STATIC int +xfs_refcount_merge_left_extent( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *left, + struct xfs_refcount_irec *cleft, + xfs_agblock_t *agbno, + xfs_extlen_t *aglen) +{ + int error; + int found_rec; + + if (cleft->rc_refcount > 1) { + error = xfs_refcount_lookup_le(cur, cleft->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + } + + error = xfs_refcount_lookup_le(cur, left->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + left->rc_blockcount += cleft->rc_blockcount; + error = xfs_refcount_update(cur, left); + if (error) + goto out_error; + + *agbno += cleft->rc_blockcount; + *aglen -= cleft->rc_blockcount; + return error; + +out_error: + trace_xfs_refcount_merge_left_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Merge with the right extent. + */ +STATIC int +xfs_refcount_merge_right_extent( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *right, + struct xfs_refcount_irec *cright, + xfs_agblock_t *agbno, + xfs_extlen_t *aglen) +{ + int error; + int found_rec; + + if (cright->rc_refcount > 1) { + error = xfs_refcount_lookup_le(cur, cright->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + } + + error = xfs_refcount_lookup_le(cur, right->rc_startblock, + &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + right->rc_startblock -= cright->rc_blockcount; + right->rc_blockcount += cright->rc_blockcount; + error = xfs_refcount_update(cur, right); + if (error) + goto out_error; + + *aglen -= cright->rc_blockcount; + return error; + +out_error: + trace_xfs_refcount_merge_right_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Find the left extent and the one after it (cleft). This function assumes + * that we've already split any extent crossing agbno. + */ +STATIC int +xfs_refcount_find_left_extents( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *left, + struct xfs_refcount_irec *cleft, + xfs_agblock_t agbno, + xfs_extlen_t aglen) +{ + struct xfs_refcount_irec tmp; + int error; + int found_rec; + + left->rc_blockcount = cleft->rc_blockcount = 0; + error = xfs_refcount_lookup_le(cur, agbno - 1, &found_rec); + if (error) + goto out_error; + if (!found_rec) + return 0; + + error = xfs_refcount_get_rec(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + if (RCNEXT(tmp) != agbno) + return 0; + /* We have a left extent; retrieve (or invent) the next right one */ + *left = tmp; + + error = xfs_btree_increment(cur, 0, &found_rec); + if (error) + goto out_error; + if (found_rec) { + error = xfs_refcount_get_rec(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + + /* if tmp starts at the end of our range, just use that */ + if (tmp.rc_startblock == agbno) + *cleft = tmp; + else { + /* + * There's a gap in the refcntbt at the start of the + * range we're interested in (refcount == 1) so + * create the implied extent and pass it back. + */ + cleft->rc_startblock = agbno; + cleft->rc_blockcount = min(aglen, + tmp.rc_startblock - agbno); + cleft->rc_refcount = 1; + } + } else { + /* + * No extents, so pretend that there's one covering the whole + * range. + */ + cleft->rc_startblock = agbno; + cleft->rc_blockcount = aglen; + cleft->rc_refcount = 1; + } + trace_xfs_refcount_find_left_extent(cur->bc_mp, cur->bc_private.a.agno, + left, cleft, agbno); + return error; + +out_error: + trace_xfs_refcount_find_left_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Find the right extent and the one before it (cright). This function + * assumes that we've already split any extents crossing agbno + aglen. + */ +STATIC int +xfs_refcount_find_right_extents( + struct xfs_btree_cur *cur, + struct xfs_refcount_irec *right, + struct xfs_refcount_irec *cright, + xfs_agblock_t agbno, + xfs_extlen_t aglen) +{ + struct xfs_refcount_irec tmp; + int error; + int found_rec; + + right->rc_blockcount = cright->rc_blockcount = 0; + error = xfs_refcount_lookup_ge(cur, agbno + aglen, &found_rec); + if (error) + goto out_error; + if (!found_rec) + return 0; + + error = xfs_refcount_get_rec(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, out_error); + + if (tmp.rc_startblock != agbno + aglen) + return 0; + /* We have a right extent; retrieve (or invent) the next left one */ + *right = tmp; + + error = xfs_btree_decrement(cur, 0, &found_rec); + if (error) + goto out_error; + if (found_rec) { + error = xfs_refcount_get_rec(cur, &tmp, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, found_rec == 1, + out_error); + + /* if tmp ends at the end of our range, just use that */ + if (RCNEXT(tmp) == agbno + aglen) + *cright = tmp; + else { + /* + * There's a gap in the refcntbt at the end of the + * range we're interested in (refcount == 1) so + * create the implied extent and pass it back. + */ + cright->rc_startblock = max(agbno, RCNEXT(tmp)); + cright->rc_blockcount = right->rc_startblock - + cright->rc_startblock; + cright->rc_refcount = 1; + } + } else { + /* + * No extents, so pretend that there's one covering the whole + * range. + */ + cright->rc_startblock = agbno; + cright->rc_blockcount = aglen; + cright->rc_refcount = 1; + } + trace_xfs_refcount_find_right_extent(cur->bc_mp, cur->bc_private.a.agno, + cright, right, agbno + aglen); + return error; + +out_error: + trace_xfs_refcount_find_right_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} +#undef RCNEXT + +/* + * Try to merge with any extents on the boundaries of the adjustment range. + */ +STATIC int +xfs_refcount_merge_extents( + struct xfs_btree_cur *cur, + xfs_agblock_t *agbno, + xfs_extlen_t *aglen, + enum xfs_refc_adjust_op adjust, + bool *shape_changed) +{ + struct xfs_refcount_irec left = {0}, cleft = {0}; + struct xfs_refcount_irec cright = {0}, right = {0}; + int error; + unsigned long long ulen; + bool cequal; + + *shape_changed = false; + /* + * Find the extent just below agbno [left], just above agbno [cleft], + * just below (agbno + aglen) [cright], and just above (agbno + aglen) + * [right]. + */ + error = xfs_refcount_find_left_extents(cur, &left, &cleft, *agbno, + *aglen); + if (error) + return error; + error = xfs_refcount_find_right_extents(cur, &right, &cright, *agbno, + *aglen); + if (error) + return error; + + /* No left or right extent to merge; exit. */ + if (left.rc_blockcount == 0 && right.rc_blockcount == 0) + return 0; + + *shape_changed = true; + cequal = (cleft.rc_startblock == cright.rc_startblock) && + (cleft.rc_blockcount == cright.rc_blockcount); + + /* Try to merge left, cleft, and right. cleft must == cright. */ + ulen = (unsigned long long)left.rc_blockcount + cleft.rc_blockcount + + right.rc_blockcount; + if (left.rc_blockcount != 0 && right.rc_blockcount != 0 && + cleft.rc_blockcount != 0 && cright.rc_blockcount != 0 && + cequal && + left.rc_refcount == cleft.rc_refcount + adjust && + right.rc_refcount == cleft.rc_refcount + adjust && + ulen < MAXREFCEXTLEN) { + trace_xfs_refcount_merge_center_extents(cur->bc_mp, + cur->bc_private.a.agno, &left, &cleft, &right); + return xfs_refcount_merge_center_extent(cur, &left, &cleft, + ulen, agbno, aglen); + } + + /* Try to merge left and cleft. */ + ulen = (unsigned long long)left.rc_blockcount + cleft.rc_blockcount; + if (left.rc_blockcount != 0 && cleft.rc_blockcount != 0 && + left.rc_refcount == cleft.rc_refcount + adjust && + ulen < MAXREFCEXTLEN) { + trace_xfs_refcount_merge_left_extent(cur->bc_mp, + cur->bc_private.a.agno, &left, &cleft); + error = xfs_refcount_merge_left_extent(cur, &left, &cleft, + agbno, aglen); + if (error) + return error; + + /* + * If we just merged left + cleft and cleft == cright, + * we no longer have a cright to merge with right. We're done. + */ + if (cequal) + return 0; + } + + /* Try to merge cright and right. */ + ulen = (unsigned long long)right.rc_blockcount + cright.rc_blockcount; + if (right.rc_blockcount != 0 && cright.rc_blockcount != 0 && + right.rc_refcount == cright.rc_refcount + adjust && + ulen < MAXREFCEXTLEN) { + trace_xfs_refcount_merge_right_extent(cur->bc_mp, + cur->bc_private.a.agno, &cright, &right); + return xfs_refcount_merge_right_extent(cur, &right, &cright, + agbno, aglen); + } + + return error; +} + +/* + * While we're adjusting the refcounts records of an extent, we have + * to keep an eye on the number of extents we're dirtying -- run too + * many in a single transaction and we'll exceed the transaction's + * reservation and crash the fs. Each record adds 12 bytes to the + * log (plus any key updates) so we'll conservatively assume 24 bytes + * per record. We must also leave space for btree splits on both ends + * of the range and space for the CUD and a new CUI. + * + * XXX: This is a pretty hand-wavy estimate. The penalty for guessing + * true incorrectly is a shutdown FS; the penalty for guessing false + * incorrectly is more transaction rolls than might be necessary. + * Be conservative here. + */ +static bool +xfs_refcount_still_have_space( + struct xfs_btree_cur *cur) +{ + unsigned long overhead; + + overhead = cur->bc_private.a.priv.refc.shape_changes * + xfs_allocfree_log_count(cur->bc_mp, 1); + overhead *= cur->bc_mp->m_sb.sb_blocksize; + + /* + * Only allow 2 refcount extent updates per transaction if the + * refcount continue update "error" has been injected. + */ + if (cur->bc_private.a.priv.refc.nr_ops > 2 && + XFS_TEST_ERROR(false, cur->bc_mp, + XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE, + XFS_RANDOM_REFCOUNT_CONTINUE_UPDATE)) + return false; + + if (cur->bc_private.a.priv.refc.nr_ops == 0) + return true; + else if (overhead > cur->bc_tp->t_log_res) + return false; + return cur->bc_tp->t_log_res - overhead > + cur->bc_private.a.priv.refc.nr_ops * 32; +} + +/* + * Adjust the refcounts of middle extents. At this point we should have + * split extents that crossed the adjustment range; merged with adjacent + * extents; and updated agbno/aglen to reflect the merges. Therefore, + * all we have to do is update the extents inside [agbno, agbno + aglen]. + */ +STATIC int +xfs_refcount_adjust_extents( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + xfs_extlen_t *adjusted, + enum xfs_refc_adjust_op adj, + struct xfs_defer_ops *dfops, + struct xfs_owner_info *oinfo) +{ + struct xfs_refcount_irec ext, tmp; + int error; + int found_rec, found_tmp; + xfs_fsblock_t fsbno; + + /* Merging did all the work already. */ + if (aglen == 0) + return 0; + + error = xfs_refcount_lookup_ge(cur, agbno, &found_rec); + if (error) + goto out_error; + + while (aglen > 0 && xfs_refcount_still_have_space(cur)) { + error = xfs_refcount_get_rec(cur, &ext, &found_rec); + if (error) + goto out_error; + if (!found_rec) { + ext.rc_startblock = cur->bc_mp->m_sb.sb_agblocks; + ext.rc_blockcount = 0; + ext.rc_refcount = 0; + } + + /* + * Deal with a hole in the refcount tree; if a file maps to + * these blocks and there's no refcountbt recourd, pretend that + * there is one with refcount == 1. + */ + if (ext.rc_startblock != agbno) { + tmp.rc_startblock = agbno; + tmp.rc_blockcount = min(aglen, + ext.rc_startblock - agbno); + tmp.rc_refcount = 1 + adj; + trace_xfs_refcount_modify_extent(cur->bc_mp, + cur->bc_private.a.agno, &tmp); + + /* + * Either cover the hole (increment) or + * delete the range (decrement). + */ + if (tmp.rc_refcount) { + error = xfs_refcount_insert(cur, &tmp, + &found_tmp); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + found_tmp == 1, out_error); + cur->bc_private.a.priv.refc.nr_ops++; + } else { + fsbno = XFS_AGB_TO_FSB(cur->bc_mp, + cur->bc_private.a.agno, + tmp.rc_startblock); + xfs_bmap_add_free(cur->bc_mp, dfops, fsbno, + tmp.rc_blockcount, oinfo); + } + + (*adjusted) += tmp.rc_blockcount; + agbno += tmp.rc_blockcount; + aglen -= tmp.rc_blockcount; + + error = xfs_refcount_lookup_ge(cur, agbno, + &found_rec); + if (error) + goto out_error; + } + + /* Stop if there's nothing left to modify */ + if (aglen == 0 || !xfs_refcount_still_have_space(cur)) + break; + + /* + * Adjust the reference count and either update the tree + * (incr) or free the blocks (decr). + */ + if (ext.rc_refcount == MAXREFCOUNT) + goto skip; + ext.rc_refcount += adj; + trace_xfs_refcount_modify_extent(cur->bc_mp, + cur->bc_private.a.agno, &ext); + if (ext.rc_refcount > 1) { + error = xfs_refcount_update(cur, &ext); + if (error) + goto out_error; + cur->bc_private.a.priv.refc.nr_ops++; + } else if (ext.rc_refcount == 1) { + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + found_rec == 1, out_error); + cur->bc_private.a.priv.refc.nr_ops++; + goto advloop; + } else { + fsbno = XFS_AGB_TO_FSB(cur->bc_mp, + cur->bc_private.a.agno, + ext.rc_startblock); + xfs_bmap_add_free(cur->bc_mp, dfops, fsbno, + ext.rc_blockcount, oinfo); + } + +skip: + error = xfs_btree_increment(cur, 0, &found_rec); + if (error) + goto out_error; + +advloop: + (*adjusted) += ext.rc_blockcount; + agbno += ext.rc_blockcount; + aglen -= ext.rc_blockcount; + } + + return error; +out_error: + trace_xfs_refcount_modify_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* Adjust the reference count of a range of AG blocks. */ +STATIC int +xfs_refcount_adjust( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + xfs_extlen_t *adjusted, + enum xfs_refc_adjust_op adj, + struct xfs_defer_ops *dfops, + struct xfs_owner_info *oinfo) +{ + xfs_extlen_t orig_aglen; + bool shape_changed; + int shape_changes = 0; + int error; + + *adjusted = 0; + switch (adj) { + case XFS_REFCOUNT_ADJUST_INCREASE: + trace_xfs_refcount_increase(cur->bc_mp, cur->bc_private.a.agno, + agbno, aglen); + break; + case XFS_REFCOUNT_ADJUST_DECREASE: + trace_xfs_refcount_decrease(cur->bc_mp, cur->bc_private.a.agno, + agbno, aglen); + break; + default: + ASSERT(0); + } + + /* + * Ensure that no rcextents cross the boundary of the adjustment range. + */ + error = xfs_refcount_split_extent(cur, agbno, &shape_changed); + if (error) + goto out_error; + if (shape_changed) + shape_changes++; + + error = xfs_refcount_split_extent(cur, agbno + aglen, &shape_changed); + if (error) + goto out_error; + if (shape_changed) + shape_changes++; + + /* + * Try to merge with the left or right extents of the range. + */ + orig_aglen = aglen; + error = xfs_refcount_merge_extents(cur, &agbno, &aglen, adj, + &shape_changed); + if (error) + goto out_error; + if (shape_changed) + shape_changes++; + (*adjusted) += orig_aglen - aglen; + if (shape_changes) + cur->bc_private.a.priv.refc.shape_changes++; + + /* Now that we've taken care of the ends, adjust the middle extents */ + error = xfs_refcount_adjust_extents(cur, agbno, aglen, adjusted, adj, + dfops, oinfo); + if (error) + goto out_error; + + return 0; + +out_error: + trace_xfs_refcount_adjust_error(cur->bc_mp, cur->bc_private.a.agno, + error, _RET_IP_); + return error; +} From darrick.wong@oracle.com Thu Aug 25 18:48:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 75D2D810D for ; Thu, 25 Aug 2016 18:48:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EF1E5AC003 for ; Thu, 25 Aug 2016 16:48:14 -0700 (PDT) X-ASG-Debug-ID: 1472168892-0bf81509b01e0220001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id pihmGfAuU9rwIzMp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:12 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNmAvw029579 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:11 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNmApA006871 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:10 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNm9l3000709; Thu, 25 Aug 2016 23:48:10 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:09 -0700 Subject: [PATCH 15/71] xfs: connect refcount adjust functions to upper layers From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 15/71] xfs: connect refcount adjust functions to upper layers To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:07 -0700 Message-ID: <147216888791.4420.9015511823939396368.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168892 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11008 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the upper level interface to schedule and finish deferred refcount operations via the deferred ops mechanism. Signed-off-by: Darrick J. Wong --- include/xfs_trans.h | 1 libxfs/defer_item.c | 129 +++++++++++++++++++++++++++++++++++++ libxfs/init.c | 1 libxfs/xfs_defer.h | 1 libxfs/xfs_refcount.c | 170 +++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_refcount.h | 12 +++ 6 files changed, 314 insertions(+) diff --git a/include/xfs_trans.h b/include/xfs_trans.h index ab5d59b..739a792 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -147,5 +147,6 @@ libxfs_trans_read_buf( void xfs_extent_free_init_defer_op(void); void xfs_rmap_update_init_defer_op(void); +void xfs_refcount_update_init_defer_op(void); #endif /* __XFS_TRANS_H__ */ diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c index f60a11b..133e6e1 100644 --- a/libxfs/defer_item.c +++ b/libxfs/defer_item.c @@ -31,6 +31,7 @@ #include "xfs_bmap.h" #include "xfs_alloc.h" #include "xfs_rmap.h" +#include "xfs_refcount.h" /* Dummy defer item ops, since we don't do logging. */ @@ -257,3 +258,131 @@ xfs_rmap_update_init_defer_op(void) { xfs_defer_init_op_type(&xfs_rmap_update_defer_type); } + +/* Reference Counting */ + +/* Sort refcount intents by AG. */ +static int +xfs_refcount_update_diff_items( + void *priv, + struct list_head *a, + struct list_head *b) +{ + struct xfs_mount *mp = priv; + struct xfs_refcount_intent *ra; + struct xfs_refcount_intent *rb; + + ra = container_of(a, struct xfs_refcount_intent, ri_list); + rb = container_of(b, struct xfs_refcount_intent, ri_list); + return XFS_FSB_TO_AGNO(mp, ra->ri_startblock) - + XFS_FSB_TO_AGNO(mp, rb->ri_startblock); +} + +/* Get an CUI. */ +STATIC void * +xfs_refcount_update_create_intent( + struct xfs_trans *tp, + unsigned int count) +{ + return NULL; +} + +/* Log refcount updates in the intent item. */ +STATIC void +xfs_refcount_update_log_item( + struct xfs_trans *tp, + void *intent, + struct list_head *item) +{ +} + +/* Get an CUD so we can process all the deferred refcount updates. */ +STATIC void * +xfs_refcount_update_create_done( + struct xfs_trans *tp, + void *intent, + unsigned int count) +{ + return NULL; +} + +/* Process a deferred refcount update. */ +STATIC int +xfs_refcount_update_finish_item( + struct xfs_trans *tp, + struct xfs_defer_ops *dop, + struct list_head *item, + void *done_item, + void **state) +{ + struct xfs_refcount_intent *refc; + xfs_extlen_t adjusted; + int error; + + refc = container_of(item, struct xfs_refcount_intent, ri_list); + error = xfs_refcount_finish_one(tp, dop, + refc->ri_type, + refc->ri_startblock, + refc->ri_blockcount, + &adjusted, + (struct xfs_btree_cur **)state); + /* Did we run out of reservation? Requeue what we didn't finish. */ + if (!error && adjusted < refc->ri_blockcount) { + ASSERT(refc->ri_type == XFS_REFCOUNT_INCREASE || + refc->ri_type == XFS_REFCOUNT_DECREASE); + refc->ri_startblock += adjusted; + refc->ri_blockcount -= adjusted; + return -EAGAIN; + } + kmem_free(refc); + return error; +} + +/* Clean up after processing deferred refcounts. */ +STATIC void +xfs_refcount_update_finish_cleanup( + struct xfs_trans *tp, + void *state, + int error) +{ + struct xfs_btree_cur *rcur = state; + + xfs_refcount_finish_one_cleanup(tp, rcur, error); +} + +/* Abort all pending CUIs. */ +STATIC void +xfs_refcount_update_abort_intent( + void *intent) +{ +} + +/* Cancel a deferred refcount update. */ +STATIC void +xfs_refcount_update_cancel_item( + struct list_head *item) +{ + struct xfs_refcount_intent *refc; + + refc = container_of(item, struct xfs_refcount_intent, ri_list); + kmem_free(refc); +} + +static const struct xfs_defer_op_type xfs_refcount_update_defer_type = { + .type = XFS_DEFER_OPS_TYPE_REFCOUNT, + .diff_items = xfs_refcount_update_diff_items, + .create_intent = xfs_refcount_update_create_intent, + .abort_intent = xfs_refcount_update_abort_intent, + .log_item = xfs_refcount_update_log_item, + .create_done = xfs_refcount_update_create_done, + .finish_item = xfs_refcount_update_finish_item, + .finish_cleanup = xfs_refcount_update_finish_cleanup, + .cancel_item = xfs_refcount_update_cancel_item, +}; + +/* Register the deferred op type. */ +void +xfs_refcount_update_init_defer_op(void) +{ + xfs_defer_init_op_type(&xfs_refcount_update_defer_type); +} diff --git a/libxfs/init.c b/libxfs/init.c index 706925d..2d1bb58 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -266,6 +266,7 @@ libxfs_init(libxfs_init_t *a) xfs_extent_free_init_defer_op(); xfs_rmap_update_init_defer_op(); + xfs_refcount_update_init_defer_op(); radix_tree_init(); diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index cc3981c..d47a482 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -51,6 +51,7 @@ struct xfs_defer_pending { * find all the space it needs. */ enum xfs_defer_ops_type { + XFS_DEFER_OPS_TYPE_REFCOUNT, XFS_DEFER_OPS_TYPE_RMAP, XFS_DEFER_OPS_TYPE_FREE, XFS_DEFER_OPS_TYPE_MAX, diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index 08866f8..31028bf 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -957,3 +957,173 @@ out_error: error, _RET_IP_); return error; } + +/* Clean up after calling xfs_refcount_finish_one. */ +void +xfs_refcount_finish_one_cleanup( + struct xfs_trans *tp, + struct xfs_btree_cur *rcur, + int error) +{ + struct xfs_buf *agbp; + + if (rcur == NULL) + return; + agbp = rcur->bc_private.a.agbp; + xfs_btree_del_cursor(rcur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + if (error) + xfs_trans_brelse(tp, agbp); +} + +/* + * Process one of the deferred refcount operations. We pass back the + * btree cursor to maintain our lock on the btree between calls. + * This saves time and eliminates a buffer deadlock between the + * superblock and the AGF because we'll always grab them in the same + * order. + */ +int +xfs_refcount_finish_one( + struct xfs_trans *tp, + struct xfs_defer_ops *dfops, + enum xfs_refcount_intent_type type, + xfs_fsblock_t startblock, + xfs_extlen_t blockcount, + xfs_extlen_t *adjusted, + struct xfs_btree_cur **pcur) +{ + struct xfs_mount *mp = tp->t_mountp; + struct xfs_btree_cur *rcur; + struct xfs_buf *agbp = NULL; + int error = 0; + xfs_agnumber_t agno; + xfs_agblock_t bno; + unsigned long nr_ops = 0; + int shape_changes = 0; + + agno = XFS_FSB_TO_AGNO(mp, startblock); + ASSERT(agno != NULLAGNUMBER); + bno = XFS_FSB_TO_AGBNO(mp, startblock); + + trace_xfs_refcount_deferred(mp, XFS_FSB_TO_AGNO(mp, startblock), + type, XFS_FSB_TO_AGBNO(mp, startblock), + blockcount); + + if (XFS_TEST_ERROR(false, mp, + XFS_ERRTAG_REFCOUNT_FINISH_ONE, + XFS_RANDOM_REFCOUNT_FINISH_ONE)) + return -EIO; + + /* + * If we haven't gotten a cursor or the cursor AG doesn't match + * the startblock, get one now. + */ + rcur = *pcur; + if (rcur != NULL && rcur->bc_private.a.agno != agno) { + nr_ops = rcur->bc_private.a.priv.refc.nr_ops; + shape_changes = rcur->bc_private.a.priv.refc.shape_changes; + xfs_refcount_finish_one_cleanup(tp, rcur, 0); + rcur = NULL; + *pcur = NULL; + } + if (rcur == NULL) { + error = xfs_alloc_read_agf(tp->t_mountp, tp, agno, + XFS_ALLOC_FLAG_FREEING, &agbp); + if (error) + return error; + if (!agbp) + return -EFSCORRUPTED; + + rcur = xfs_refcountbt_init_cursor(mp, tp, agbp, agno, dfops); + if (!rcur) { + error = -ENOMEM; + goto out_cur; + } + rcur->bc_private.a.priv.refc.nr_ops = nr_ops; + rcur->bc_private.a.priv.refc.shape_changes = shape_changes; + } + *pcur = rcur; + + switch (type) { + case XFS_REFCOUNT_INCREASE: + error = xfs_refcount_adjust(rcur, bno, blockcount, adjusted, + XFS_REFCOUNT_ADJUST_INCREASE, dfops, NULL); + break; + case XFS_REFCOUNT_DECREASE: + error = xfs_refcount_adjust(rcur, bno, blockcount, adjusted, + XFS_REFCOUNT_ADJUST_DECREASE, dfops, NULL); + break; + default: + ASSERT(0); + error = -EFSCORRUPTED; + } + if (!error && *adjusted != blockcount) + trace_xfs_refcount_finish_one_leftover(mp, agno, type, + bno, blockcount, *adjusted); + return error; + +out_cur: + xfs_trans_brelse(tp, agbp); + + return error; +} + +/* + * Record a refcount intent for later processing. + */ +static int +__xfs_refcount_add( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + enum xfs_refcount_intent_type type, + xfs_fsblock_t startblock, + xfs_extlen_t blockcount) +{ + struct xfs_refcount_intent *ri; + + trace_xfs_refcount_defer(mp, XFS_FSB_TO_AGNO(mp, startblock), + type, XFS_FSB_TO_AGBNO(mp, startblock), + blockcount); + + ri = kmem_alloc(sizeof(struct xfs_refcount_intent), + KM_SLEEP | KM_NOFS); + INIT_LIST_HEAD(&ri->ri_list); + ri->ri_type = type; + ri->ri_startblock = startblock; + ri->ri_blockcount = blockcount; + + xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_REFCOUNT, &ri->ri_list); + return 0; +} + +/* + * Increase the reference count of the blocks backing a file's extent. + */ +int +xfs_refcount_increase_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + struct xfs_bmbt_irec *PREV) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_INCREASE, + PREV->br_startblock, PREV->br_blockcount); +} + +/* + * Decrease the reference count of the blocks backing a file's extent. + */ +int +xfs_refcount_decrease_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + struct xfs_bmbt_irec *PREV) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_DECREASE, + PREV->br_startblock, PREV->br_blockcount); +} diff --git a/libxfs/xfs_refcount.h b/libxfs/xfs_refcount.h index 2ef2b28..605d7d7 100644 --- a/libxfs/xfs_refcount.h +++ b/libxfs/xfs_refcount.h @@ -41,4 +41,16 @@ struct xfs_refcount_intent { xfs_extlen_t ri_blockcount; }; +extern int xfs_refcount_increase_extent(struct xfs_mount *mp, + struct xfs_defer_ops *dfops, struct xfs_bmbt_irec *irec); +extern int xfs_refcount_decrease_extent(struct xfs_mount *mp, + struct xfs_defer_ops *dfops, struct xfs_bmbt_irec *irec); + +extern void xfs_refcount_finish_one_cleanup(struct xfs_trans *tp, + struct xfs_btree_cur *rcur, int error); +extern int xfs_refcount_finish_one(struct xfs_trans *tp, + struct xfs_defer_ops *dfops, enum xfs_refcount_intent_type type, + xfs_fsblock_t startblock, xfs_extlen_t blockcount, + xfs_extlen_t *adjusted, struct xfs_btree_cur **pcur); + #endif /* __XFS_REFCOUNT_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:48:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 39060810E for ; Thu, 25 Aug 2016 18:48:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 09413304039 for ; Thu, 25 Aug 2016 16:48:19 -0700 (PDT) X-ASG-Debug-ID: 1472168897-0bf57c55b21c7df0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 667MCAA1Xlr9t39x (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNmG5S029607 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:16 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNmGES007029 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:16 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNmFnr001157; Thu, 25 Aug 2016 23:48:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:15 -0700 Subject: [PATCH 16/71] xfs: adjust refcount when unmapping file blocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 16/71] xfs: adjust refcount when unmapping file blocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:14 -0700 Message-ID: <147216889423.4420.12408768243636014094.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168898 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1262 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're unmapping blocks from a reflinked file, decrease the refcount of the affected blocks and free the extents that are no longer in use. v2: Use deferred ops system to avoid deadlocks and running out of transaction reservation. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index a50a8af..4045340 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -40,6 +40,7 @@ #include "xfs_quota_defs.h" #include "xfs_rmap.h" #include "xfs_ag_resv.h" +#include "xfs_refcount.h" kmem_zone_t *xfs_bmap_free_item_zone; @@ -5054,9 +5055,16 @@ xfs_bmap_del_extent( /* * If we need to, add to list of extents to delete. */ - if (do_fx) - xfs_bmap_add_free(mp, dfops, del->br_startblock, - del->br_blockcount, NULL); + if (do_fx) { + if (xfs_is_reflink_inode(ip) && whichfork == XFS_DATA_FORK) { + error = xfs_refcount_decrease_extent(mp, dfops, del); + if (error) + goto done; + } else + xfs_bmap_add_free(mp, dfops, del->br_startblock, + del->br_blockcount, NULL); + } + /* * Adjust inode # blocks in the file. */ From darrick.wong@oracle.com Thu Aug 25 18:48:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 26A82811D for ; Thu, 25 Aug 2016 18:48:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED0518F8035 for ; Thu, 25 Aug 2016 16:48:25 -0700 (PDT) X-ASG-Debug-ID: 1472168904-0bf57b53142099b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id vGnAqCZ39BA9auxm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNmMdk023373 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:23 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNmM1M023534 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:22 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNmMk2022135; Thu, 25 Aug 2016 23:48:22 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:21 -0700 Subject: [PATCH 17/71] xfs: refcount btree requires more reserved space From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 17/71] xfs: refcount btree requires more reserved space To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:20 -0700 Message-ID: <147216890040.4420.17914127056329841183.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168904 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2790 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The reference count btree is allocated from the free space, which means that we have to ensure that an AG can't run out of free space while performing a refcount operation. In the pathological case each AG block has its own refcntbt record, so we have to keep that much space available. v2: Calculate the maximum possible size of the rmap and refcount btrees based on minimally-full btree blocks. This increases the per-AG block reservations to handle the worst case btree size. Signed-off-by: Darrick J. Wong --- libxfs/xfs_alloc.c | 3 +++ libxfs/xfs_refcount_btree.c | 23 +++++++++++++++++++++++ libxfs/xfs_refcount_btree.h | 4 ++++ 3 files changed, 30 insertions(+) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index e754647..3151fbb 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -34,6 +34,7 @@ #include "xfs_trace.h" #include "xfs_trans.h" #include "xfs_ag_resv.h" +#include "xfs_refcount_btree.h" struct workqueue_struct *xfs_alloc_wq; @@ -124,6 +125,8 @@ xfs_alloc_ag_max_usable( blocks++; /* finobt root block */ if (xfs_sb_version_hasrmapbt(&mp->m_sb)) blocks++; /* rmap root block */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) + blocks++; /* refcount root block */ return mp->m_sb.sb_agblocks - blocks; } diff --git a/libxfs/xfs_refcount_btree.c b/libxfs/xfs_refcount_btree.c index 04f8db0..568a2f8 100644 --- a/libxfs/xfs_refcount_btree.c +++ b/libxfs/xfs_refcount_btree.c @@ -380,3 +380,26 @@ xfs_refcountbt_compute_maxlevels( mp->m_refc_maxlevels = xfs_btree_compute_maxlevels(mp, mp->m_refc_mnr, mp->m_sb.sb_agblocks); } + +/* Calculate the refcount btree size for some records. */ +xfs_extlen_t +xfs_refcountbt_calc_size( + struct xfs_mount *mp, + unsigned long long len) +{ + return xfs_btree_calc_size(mp, mp->m_refc_mnr, len); +} + +/* + * Calculate the maximum refcount btree size. + */ +xfs_extlen_t +xfs_refcountbt_max_size( + struct xfs_mount *mp) +{ + /* Bail out if we're uninitialized, which can happen in mkfs. */ + if (mp->m_refc_mxr[0] == 0) + return 0; + + return xfs_refcountbt_calc_size(mp, mp->m_sb.sb_agblocks); +} diff --git a/libxfs/xfs_refcount_btree.h b/libxfs/xfs_refcount_btree.h index 9e9ad7c..780b02f 100644 --- a/libxfs/xfs_refcount_btree.h +++ b/libxfs/xfs_refcount_btree.h @@ -64,4 +64,8 @@ extern int xfs_refcountbt_maxrecs(struct xfs_mount *mp, int blocklen, bool leaf); extern void xfs_refcountbt_compute_maxlevels(struct xfs_mount *mp); +extern xfs_extlen_t xfs_refcountbt_calc_size(struct xfs_mount *mp, + unsigned long long len); +extern xfs_extlen_t xfs_refcountbt_max_size(struct xfs_mount *mp); + #endif /* __XFS_REFCOUNT_BTREE_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:48:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DD6278124 for ; Thu, 25 Aug 2016 18:48:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B01EC8F8035 for ; Thu, 25 Aug 2016 16:48:32 -0700 (PDT) X-ASG-Debug-ID: 1472168910-0bf57b53132099b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id snD03JLW5XtheLsS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:31 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNmTtQ029660 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:29 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNmScX023629 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:29 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNmSem018967; Thu, 25 Aug 2016 23:48:28 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:27 -0700 Subject: [PATCH 18/71] xfs: introduce reflink utility functions From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 18/71] xfs: introduce reflink utility functions To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com, "Darrick J. Wong" Date: Thu, 25 Aug 2016 16:48:26 -0700 Message-ID: <147216890657.4420.12127358569225976411.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168911 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4731 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines These functions will be used by the other reflink functions to find the maximum length of a range of shared blocks. Signed-off-by: Darrick J. Wong --- include/xfs_trace.h | 3 + libxfs/xfs_refcount.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_refcount.h | 4 ++ 3 files changed, 107 insertions(+) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 5605c3c..0698280 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -255,6 +255,9 @@ #define trace_xfs_refcount_deferred(...) ((void) 0) #define trace_xfs_refcount_defer(...) ((void) 0) #define trace_xfs_refcount_finish_one_leftover(...) ((void) 0) +#define trace_xfs_refcount_find_shared(...) ((void) 0) +#define trace_xfs_refcount_find_shared_result(...) ((void) 0) +#define trace_xfs_refcount_find_shared_error(...) ((void) 0) /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index 31028bf..20b4f68 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -1127,3 +1127,103 @@ xfs_refcount_decrease_extent( return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_DECREASE, PREV->br_startblock, PREV->br_blockcount); } + +/* + * Given an AG extent, find the lowest-numbered run of shared blocks within + * that range and return the range in fbno/flen. If find_maximal is set, + * return the longest extent of shared blocks; if not, just return the first + * extent we find. If no shared blocks are found, flen will be set to zero. + */ +int +xfs_refcount_find_shared( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + xfs_agblock_t *fbno, + xfs_extlen_t *flen, + bool find_maximal) +{ + struct xfs_refcount_irec tmp; + int i; + int have; + int error; + + trace_xfs_refcount_find_shared(cur->bc_mp, cur->bc_private.a.agno, + agbno, aglen); + + /* By default, skip the whole range */ + *fbno = agbno + aglen; + *flen = 0; + + /* Try to find a refcount extent that crosses the start */ + error = xfs_refcount_lookup_le(cur, agbno, &have); + if (error) + goto out_error; + if (!have) { + /* No left extent, look at the next one */ + error = xfs_btree_increment(cur, 0, &have); + if (error) + goto out_error; + if (!have) + goto done; + } + error = xfs_refcount_get_rec(cur, &tmp, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); + + /* If the extent ends before the start, look at the next one */ + if (tmp.rc_startblock + tmp.rc_blockcount <= agbno) { + error = xfs_btree_increment(cur, 0, &have); + if (error) + goto out_error; + if (!have) + goto done; + error = xfs_refcount_get_rec(cur, &tmp, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); + } + + /* If the extent ends after the range we want, bail out */ + if (tmp.rc_startblock >= agbno + aglen) + goto done; + + /* We found the start of a shared extent! */ + if (tmp.rc_startblock < agbno) { + tmp.rc_blockcount -= (agbno - tmp.rc_startblock); + tmp.rc_startblock = agbno; + } + + *fbno = tmp.rc_startblock; + *flen = min(tmp.rc_blockcount, agbno + aglen - *fbno); + if (!find_maximal) + goto done; + + /* Otherwise, find the end of this shared extent */ + while (*fbno + *flen < agbno + aglen) { + error = xfs_btree_increment(cur, 0, &have); + if (error) + goto out_error; + if (!have) + break; + error = xfs_refcount_get_rec(cur, &tmp, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, i == 1, out_error); + if (tmp.rc_startblock >= agbno + aglen || + tmp.rc_startblock != *fbno + *flen) + break; + *flen = min(*flen + tmp.rc_blockcount, agbno + aglen - *fbno); + } + +done: + trace_xfs_refcount_find_shared_result(cur->bc_mp, + cur->bc_private.a.agno, *fbno, *flen); + +out_error: + if (error) + trace_xfs_refcount_find_shared_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} diff --git a/libxfs/xfs_refcount.h b/libxfs/xfs_refcount.h index 605d7d7..0ec9a28 100644 --- a/libxfs/xfs_refcount.h +++ b/libxfs/xfs_refcount.h @@ -53,4 +53,8 @@ extern int xfs_refcount_finish_one(struct xfs_trans *tp, xfs_fsblock_t startblock, xfs_extlen_t blockcount, xfs_extlen_t *adjusted, struct xfs_btree_cur **pcur); +extern int xfs_refcount_find_shared(struct xfs_btree_cur *cur, + xfs_agblock_t agbno, xfs_extlen_t aglen, xfs_agblock_t *fbno, + xfs_extlen_t *flen, bool find_maximal); + #endif /* __XFS_REFCOUNT_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:48:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 49D1D812B for ; Thu, 25 Aug 2016 18:48:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0B1DAC003 for ; Thu, 25 Aug 2016 16:48:39 -0700 (PDT) X-ASG-Debug-ID: 1472168917-0bf8155c741e8360001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id B5EmZe7wbi0IXzYO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:38 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNma4u023498 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:36 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNma1h023776 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:36 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNmYIY019041; Thu, 25 Aug 2016 23:48:35 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:34 -0700 Subject: [PATCH 19/71] xfs: create bmbt update intent log items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 19/71] xfs: create bmbt update intent log items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:32 -0700 Message-ID: <147216891287.4420.13513263762009543259.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168918 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3344 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create bmbt update intent/done log items to record redo information in the log. Because we need to roll transactions multiple times for reflink operations, between we also have to track the status of the metadata updates that will be recorded in the post-roll transactions, just in case we crash before committing the final transaction. This mechanism enables log recovery to finish what was already started. Signed-off-by: Darrick J. Wong --- libxfs/xfs_log_format.h | 51 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_log_format.h b/libxfs/xfs_log_format.h index ebf5dc0..fffcc0f 100644 --- a/libxfs/xfs_log_format.h +++ b/libxfs/xfs_log_format.h @@ -114,7 +114,9 @@ static inline uint xlog_get_cycle(char *ptr) #define XLOG_REG_TYPE_RUD_FORMAT 22 #define XLOG_REG_TYPE_CUI_FORMAT 23 #define XLOG_REG_TYPE_CUD_FORMAT 24 -#define XLOG_REG_TYPE_MAX 24 +#define XLOG_REG_TYPE_BUI_FORMAT 25 +#define XLOG_REG_TYPE_BUD_FORMAT 26 +#define XLOG_REG_TYPE_MAX 26 /* * Flags to log operation header @@ -235,6 +237,8 @@ typedef struct xfs_trans_header { #define XFS_LI_RUD 0x1241 #define XFS_LI_CUI 0x1242 /* refcount update intent */ #define XFS_LI_CUD 0x1243 +#define XFS_LI_BUI 0x1244 /* bmbt update intent */ +#define XFS_LI_BUD 0x1245 #define XFS_LI_TYPE_DESC \ { XFS_LI_EFI, "XFS_LI_EFI" }, \ @@ -248,7 +252,9 @@ typedef struct xfs_trans_header { { XFS_LI_RUI, "XFS_LI_RUI" }, \ { XFS_LI_RUD, "XFS_LI_RUD" }, \ { XFS_LI_CUI, "XFS_LI_CUI" }, \ - { XFS_LI_CUD, "XFS_LI_CUD" } + { XFS_LI_CUD, "XFS_LI_CUD" }, \ + { XFS_LI_BUI, "XFS_LI_BUI" }, \ + { XFS_LI_BUD, "XFS_LI_BUD" } /* * Inode Log Item Format definitions. @@ -712,6 +718,47 @@ struct xfs_cud_log_format { }; /* + * BUI/BUD (inode block mapping) log format definitions + */ + +/* bmbt me_flags: upper bits are flags, lower byte is type code */ +#define XFS_BMAP_EXTENT_MAP 1 +#define XFS_BMAP_EXTENT_UNMAP 2 +#define XFS_BMAP_EXTENT_TYPE_MASK 0xFF + +#define XFS_BMAP_EXTENT_ATTR_FORK (1U << 31) +#define XFS_BMAP_EXTENT_UNWRITTEN (1U << 30) + +#define XFS_BMAP_EXTENT_FLAGS (XFS_BMAP_EXTENT_TYPE_MASK | \ + XFS_BMAP_EXTENT_ATTR_FORK | \ + XFS_BMAP_EXTENT_UNWRITTEN) + +/* + * This is the structure used to lay out an bui log item in the + * log. The bui_extents field is a variable size array whose + * size is given by bui_nextents. + */ +struct xfs_bui_log_format { + __uint16_t bui_type; /* bui log item type */ + __uint16_t bui_size; /* size of this item */ + __uint32_t bui_nextents; /* # extents to free */ + __uint64_t bui_id; /* bui identifier */ + struct xfs_map_extent bui_extents[1]; /* array of extents to bmap */ +}; + +/* + * This is the structure used to lay out an bud log item in the + * log. The bud_extents array is a variable size array whose + * size is given by bud_nextents; + */ +struct xfs_bud_log_format { + __uint16_t bud_type; /* bud log item type */ + __uint16_t bud_size; /* size of this item */ + __uint32_t __pad; + __uint64_t bud_bui_id; /* id of corresponding bui */ +}; + +/* * Dquot Log format definitions. * * The first two fields must be the type and size fitting into From darrick.wong@oracle.com Thu Aug 25 18:48:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5C7447E4B for ; Thu, 25 Aug 2016 18:48:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BFB2AAC002 for ; Thu, 25 Aug 2016 16:48:44 -0700 (PDT) X-ASG-Debug-ID: 1472168922-0bf57c55b41c7e30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id mqPMMLF3wXvuYw1t (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNmfHG023569 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:41 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNmfrZ002478 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:41 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNmect022339; Thu, 25 Aug 2016 23:48:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:40 -0700 Subject: [PATCH 20/71] xfs: log bmap intent items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 20/71] xfs: log bmap intent items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:39 -0700 Message-ID: <147216891904.4420.8548167605851988552.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168923 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 909 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Provide a mechanism for higher levels to create BUI/BUD items, submit them to the log, and a stub function to deal with recovered BUI items. These parts will be connected to the rmapbt in a later patch. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index 9220b1d..c8160fe 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -209,5 +209,17 @@ struct xfs_bmbt_rec_host * struct xfs_bmbt_irec *gotp, struct xfs_bmbt_irec *prevp); +enum xfs_bmap_intent_type { + XFS_BMAP_MAP, + XFS_BMAP_UNMAP, +}; + +struct xfs_bmap_intent { + struct list_head bi_list; + enum xfs_bmap_intent_type bi_type; + struct xfs_inode *bi_owner; + int bi_whichfork; + struct xfs_bmbt_irec bi_bmap; +}; #endif /* __XFS_BMAP_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:48:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DDD0F7E86 for ; Thu, 25 Aug 2016 18:48:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A28E6304039 for ; Thu, 25 Aug 2016 16:48:50 -0700 (PDT) X-ASG-Debug-ID: 1472168928-0bf57b53122099f0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 1YFxJfG0AjGinLkD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNmljC023658 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:48 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNmlCH007574 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:48:47 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNmkvv019096; Thu, 25 Aug 2016 23:48:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:46 -0700 Subject: [PATCH 21/71] xfs: map an inode's offset to an exact physical block From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 21/71] xfs: map an inode's offset to an exact physical block To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:45 -0700 Message-ID: <147216892521.4420.4118413366349909612.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168929 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5017 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Teach the bmap routine to know how to map a range of file blocks to a specific range of physical blocks, instead of simply allocating fresh blocks. This enables reflink to map a file to blocks that are already in use. Signed-off-by: Darrick J. Wong --- include/xfs_trace.h | 3 ++ libxfs/xfs_bmap.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_bmap.h | 10 +++++++- 3 files changed, 75 insertions(+), 1 deletion(-) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 0698280..cc0e960 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -259,6 +259,9 @@ #define trace_xfs_refcount_find_shared_result(...) ((void) 0) #define trace_xfs_refcount_find_shared_error(...) ((void) 0) +#define trace_xfs_bmap_remap_alloc(...) ((void) 0) +#define trace_xfs_bmap_remap_alloc_error(...) ((void) 0) + /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) #define trace_xfs_perag_get_tag(a,b,c,d) ((c) = (c)) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 4045340..fab8182 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -3865,6 +3865,55 @@ xfs_bmap_btalloc( } /* + * For a remap operation, just "allocate" an extent at the address that the + * caller passed in, and ensure that the AGFL is the right size. The caller + * will then map the "allocated" extent into the file somewhere. + */ +STATIC int +xfs_bmap_remap_alloc( + struct xfs_bmalloca *ap) +{ + struct xfs_trans *tp = ap->tp; + struct xfs_mount *mp = tp->t_mountp; + xfs_agblock_t bno; + struct xfs_alloc_arg args; + int error; + + /* + * validate that the block number is legal - the enables us to detect + * and handle a silent filesystem corruption rather than crashing. + */ + memset(&args, 0, sizeof(struct xfs_alloc_arg)); + args.tp = ap->tp; + args.mp = ap->tp->t_mountp; + bno = *ap->firstblock; + args.agno = XFS_FSB_TO_AGNO(mp, bno); + ASSERT(args.agno < mp->m_sb.sb_agcount); + args.agbno = XFS_FSB_TO_AGBNO(mp, bno); + ASSERT(args.agbno < mp->m_sb.sb_agblocks); + + /* "Allocate" the extent from the range we passed in. */ + trace_xfs_bmap_remap_alloc(ap->ip, *ap->firstblock, ap->length); + ap->blkno = bno; + ap->ip->i_d.di_nblocks += ap->length; + xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); + + /* Fix the freelist, like a real allocator does. */ + args.userdata = 1; + args.pag = xfs_perag_get(args.mp, args.agno); + ASSERT(args.pag); + + error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING); + if (error) + goto error0; +error0: + xfs_perag_put(args.pag); + if (error) + trace_xfs_bmap_remap_alloc_error(ap->ip, error, _RET_IP_); + return error; +} + +/* * xfs_bmap_alloc is called by xfs_bmapi to allocate an extent for a file. * It figures out where to ask the underlying allocator to put the new extent. */ @@ -3872,6 +3921,8 @@ STATIC int xfs_bmap_alloc( struct xfs_bmalloca *ap) /* bmap alloc argument struct */ { + if (ap->flags & XFS_BMAPI_REMAP) + return xfs_bmap_remap_alloc(ap); if (XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata) return xfs_bmap_rtalloc(ap); return xfs_bmap_btalloc(ap); @@ -4508,6 +4559,12 @@ xfs_bmapi_write( ASSERT(len > 0); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + if (whichfork == XFS_ATTR_FORK) + ASSERT(!(flags & XFS_BMAPI_REMAP)); + if (flags & XFS_BMAPI_REMAP) { + ASSERT(!(flags & XFS_BMAPI_PREALLOC)); + ASSERT(!(flags & XFS_BMAPI_CONVERT)); + } /* zeroing is for currently only for data extents, not metadata */ ASSERT((flags & (XFS_BMAPI_METADATA | XFS_BMAPI_ZERO)) != @@ -4569,6 +4626,12 @@ xfs_bmapi_write( wasdelay = !inhole && isnullstartblock(bma.got.br_startblock); /* + * Make sure we only reflink into a hole. + */ + if (flags & XFS_BMAPI_REMAP) + ASSERT(inhole); + + /* * First, deal with the hole before the allocated space * that we found, if any. */ diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index c8160fe..42dc49e 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -97,6 +97,13 @@ struct xfs_extent_free_item */ #define XFS_BMAPI_ZERO 0x080 +/* + * Map the inode offset to the block given in ap->firstblock. Primarily + * used for reflink. The range must be in a hole, and this flag cannot be + * turned on with PREALLOC or CONVERT, and cannot be used on the attr fork. + */ +#define XFS_BMAPI_REMAP 0x100 + #define XFS_BMAPI_FLAGS \ { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ { XFS_BMAPI_METADATA, "METADATA" }, \ @@ -105,7 +112,8 @@ struct xfs_extent_free_item { XFS_BMAPI_IGSTATE, "IGSTATE" }, \ { XFS_BMAPI_CONTIG, "CONTIG" }, \ { XFS_BMAPI_CONVERT, "CONVERT" }, \ - { XFS_BMAPI_ZERO, "ZERO" } + { XFS_BMAPI_ZERO, "ZERO" }, \ + { XFS_BMAPI_REMAP, "REMAP" } static inline int xfs_bmapi_aflag(int w) From darrick.wong@oracle.com Thu Aug 25 18:48:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 087C27F5A for ; Thu, 25 Aug 2016 18:48:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8199CAC002 for ; Thu, 25 Aug 2016 16:48:58 -0700 (PDT) X-ASG-Debug-ID: 1472168936-0bf8155c741e8400001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 07MYX2s2Y4a34vyF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:48:56 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNms8d023709 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:54 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNmrVu002679 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:48:54 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNmraG001378; Thu, 25 Aug 2016 23:48:53 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:52 -0700 Subject: [PATCH 22/71] xfs: pass bmapi flags through to bmap_del_extent From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 22/71] xfs: pass bmapi flags through to bmap_del_extent To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:51 -0700 Message-ID: <147216893145.4420.4696782319825156598.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168936 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2442 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Pass BMAPI_ flags from bunmapi into bmap_del_extent and extend BMAPI_REMAP (which means "don't touch the allocator or the quota accounting") to apply to bunmapi as well. This will be used to implement the unmap operation, which will be used by swapext. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.c | 9 +++++---- libxfs/xfs_bmap.h | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index fab8182..ff99768 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -4826,7 +4826,8 @@ xfs_bmap_del_extent( xfs_btree_cur_t *cur, /* if null, not a btree */ xfs_bmbt_irec_t *del, /* data to remove from extents */ int *logflagsp, /* inode logging flags */ - int whichfork) /* data or attr fork */ + int whichfork, /* data or attr fork */ + int bflags) /* bmapi flags */ { xfs_filblks_t da_new; /* new delay-alloc indirect blocks */ xfs_filblks_t da_old; /* old delay-alloc indirect blocks */ @@ -5118,7 +5119,7 @@ xfs_bmap_del_extent( /* * If we need to, add to list of extents to delete. */ - if (do_fx) { + if (do_fx && !(bflags & XFS_BMAPI_REMAP)) { if (xfs_is_reflink_inode(ip) && whichfork == XFS_DATA_FORK) { error = xfs_refcount_decrease_extent(mp, dfops, del); if (error) @@ -5136,7 +5137,7 @@ xfs_bmap_del_extent( /* * Adjust quota data. */ - if (qfield) + if (qfield && !(bflags & XFS_BMAPI_REMAP)) xfs_trans_mod_dquot_byino(tp, ip, qfield, (long)-nblks); /* @@ -5461,7 +5462,7 @@ xfs_bunmapi( cur->bc_private.b.flags &= ~XFS_BTCUR_BPRV_WASDEL; error = xfs_bmap_del_extent(ip, tp, &lastx, dfops, cur, &del, - &tmp_logflags, whichfork); + &tmp_logflags, whichfork, flags); logflags |= tmp_logflags; if (error) goto error0; diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index 42dc49e..4d9b666 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -101,6 +101,9 @@ struct xfs_extent_free_item * Map the inode offset to the block given in ap->firstblock. Primarily * used for reflink. The range must be in a hole, and this flag cannot be * turned on with PREALLOC or CONVERT, and cannot be used on the attr fork. + * + * For bunmapi, this flag unmaps the range without adjusting quota, reducing + * refcount, or freeing the blocks. */ #define XFS_BMAPI_REMAP 0x100 From darrick.wong@oracle.com Thu Aug 25 18:49:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 595967FBC for ; Thu, 25 Aug 2016 18:49:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F30CB8F8033 for ; Thu, 25 Aug 2016 16:49:04 -0700 (PDT) X-ASG-Debug-ID: 1472168941-0bf8155c771e8430001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id GgQUeyaOuN2whsnH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:02 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNn0Jj029944 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:00 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNn0CE007829 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:00 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNmx0p000955; Thu, 25 Aug 2016 23:48:59 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:48:59 -0700 Subject: [PATCH 23/71] xfs: implement deferred bmbt map/unmap operations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 23/71] xfs: implement deferred bmbt map/unmap operations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:48:57 -0700 Message-ID: <147216893766.4420.12921405283472420891.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168942 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9663 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Implement deferred versions of the inode block map/unmap functions. These will be used in subsequent patches to make reflink operations atomic. Signed-off-by: Darrick J. Wong --- include/xfs_trace.h | 2 + include/xfs_trans.h | 1 libxfs/defer_item.c | 107 +++++++++++++++++++++++++++++++++++++++ libxfs/init.c | 1 libxfs/xfs_bmap.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_bmap.h | 11 ++++ libxfs/xfs_defer.h | 1 7 files changed, 264 insertions(+) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index cc0e960..506f23b 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -261,6 +261,8 @@ #define trace_xfs_bmap_remap_alloc(...) ((void) 0) #define trace_xfs_bmap_remap_alloc_error(...) ((void) 0) +#define trace_xfs_bmap_deferred(...) ((void) 0) +#define trace_xfs_bmap_defer(...) ((void) 0) /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) diff --git a/include/xfs_trans.h b/include/xfs_trans.h index 739a792..44deebb 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -148,5 +148,6 @@ libxfs_trans_read_buf( void xfs_extent_free_init_defer_op(void); void xfs_rmap_update_init_defer_op(void); void xfs_refcount_update_init_defer_op(void); +void xfs_bmap_update_init_defer_op(void); #endif /* __XFS_TRANS_H__ */ diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c index 133e6e1..d4cd876 100644 --- a/libxfs/defer_item.c +++ b/libxfs/defer_item.c @@ -32,6 +32,8 @@ #include "xfs_alloc.h" #include "xfs_rmap.h" #include "xfs_refcount.h" +#include "xfs_bmap.h" +#include "xfs_inode.h" /* Dummy defer item ops, since we don't do logging. */ @@ -386,3 +388,108 @@ xfs_refcount_update_init_defer_op(void) { xfs_defer_init_op_type(&xfs_refcount_update_defer_type); } + +/* Inode Block Mapping */ + +/* Sort bmap intents by inode. */ +static int +xfs_bmap_update_diff_items( + void *priv, + struct list_head *a, + struct list_head *b) +{ + struct xfs_bmap_intent *ba; + struct xfs_bmap_intent *bb; + + ba = container_of(a, struct xfs_bmap_intent, bi_list); + bb = container_of(b, struct xfs_bmap_intent, bi_list); + return ba->bi_owner->i_ino - bb->bi_owner->i_ino; +} + +/* Get an BUI. */ +STATIC void * +xfs_bmap_update_create_intent( + struct xfs_trans *tp, + unsigned int count) +{ + return NULL; +} + +/* Log bmap updates in the intent item. */ +STATIC void +xfs_bmap_update_log_item( + struct xfs_trans *tp, + void *intent, + struct list_head *item) +{ +} + +/* Get an BUD so we can process all the deferred rmap updates. */ +STATIC void * +xfs_bmap_update_create_done( + struct xfs_trans *tp, + void *intent, + unsigned int count) +{ + return NULL; +} + +/* Process a deferred rmap update. */ +STATIC int +xfs_bmap_update_finish_item( + struct xfs_trans *tp, + struct xfs_defer_ops *dop, + struct list_head *item, + void *done_item, + void **state) +{ + struct xfs_bmap_intent *bmap; + int error; + + bmap = container_of(item, struct xfs_bmap_intent, bi_list); + error = xfs_bmap_finish_one(tp, dop, + bmap->bi_owner, + bmap->bi_type, bmap->bi_whichfork, + bmap->bi_bmap.br_startoff, + bmap->bi_bmap.br_startblock, + bmap->bi_bmap.br_blockcount, + bmap->bi_bmap.br_state); + kmem_free(bmap); + return error; +} + +/* Abort all pending BUIs. */ +STATIC void +xfs_bmap_update_abort_intent( + void *intent) +{ +} + +/* Cancel a deferred rmap update. */ +STATIC void +xfs_bmap_update_cancel_item( + struct list_head *item) +{ + struct xfs_bmap_intent *bmap; + + bmap = container_of(item, struct xfs_bmap_intent, bi_list); + kmem_free(bmap); +} + +static const struct xfs_defer_op_type xfs_bmap_update_defer_type = { + .type = XFS_DEFER_OPS_TYPE_BMAP, + .diff_items = xfs_bmap_update_diff_items, + .create_intent = xfs_bmap_update_create_intent, + .abort_intent = xfs_bmap_update_abort_intent, + .log_item = xfs_bmap_update_log_item, + .create_done = xfs_bmap_update_create_done, + .finish_item = xfs_bmap_update_finish_item, + .cancel_item = xfs_bmap_update_cancel_item, +}; + +/* Register the deferred op type. */ +void +xfs_bmap_update_init_defer_op(void) +{ + xfs_defer_init_op_type(&xfs_bmap_update_defer_type); +} diff --git a/libxfs/init.c b/libxfs/init.c index 2d1bb58..9134879 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -267,6 +267,7 @@ libxfs_init(libxfs_init_t *a) xfs_extent_free_init_defer_op(); xfs_rmap_update_init_defer_op(); xfs_refcount_update_init_defer_op(); + xfs_bmap_update_init_defer_op(); radix_tree_init(); diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index ff99768..a919371 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -6123,3 +6123,144 @@ out: xfs_trans_cancel(tp); return error; } + +/* Deferred mapping is only for real extents in the data fork. */ +static bool +xfs_bmap_is_update_needed( + int whichfork, + struct xfs_bmbt_irec *bmap) +{ + ASSERT(whichfork == XFS_DATA_FORK); + + return bmap->br_startblock != HOLESTARTBLOCK && + bmap->br_startblock != DELAYSTARTBLOCK; +} + +/* Record a bmap intent. */ +static int +__xfs_bmap_add( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + enum xfs_bmap_intent_type type, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *bmap) +{ + int error; + struct xfs_bmap_intent *bi; + + trace_xfs_bmap_defer(mp, + XFS_FSB_TO_AGNO(mp, bmap->br_startblock), + type, + XFS_FSB_TO_AGBNO(mp, bmap->br_startblock), + ip->i_ino, whichfork, + bmap->br_startoff, + bmap->br_blockcount, + bmap->br_state); + + bi = kmem_alloc(sizeof(struct xfs_bmap_intent), KM_SLEEP | KM_NOFS); + INIT_LIST_HEAD(&bi->bi_list); + bi->bi_type = type; + bi->bi_owner = ip; + bi->bi_whichfork = whichfork; + bi->bi_bmap = *bmap; + + error = xfs_defer_join(dfops, bi->bi_owner); + if (error) { + kmem_free(bi); + return error; + } + + xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_BMAP, &bi->bi_list); + return 0; +} + +/* Map an extent into a file. */ +int +xfs_bmap_map_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *PREV) +{ + if (!xfs_bmap_is_update_needed(whichfork, PREV)) + return 0; + + return __xfs_bmap_add(mp, dfops, XFS_BMAP_MAP, ip, whichfork, PREV); +} + +/* Unmap an extent out of a file. */ +int +xfs_bmap_unmap_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + struct xfs_inode *ip, + int whichfork, + struct xfs_bmbt_irec *PREV) +{ + if (!xfs_bmap_is_update_needed(whichfork, PREV)) + return 0; + + return __xfs_bmap_add(mp, dfops, XFS_BMAP_UNMAP, ip, whichfork, PREV); +} + +/* + * Process one of the deferred bmap operations. We pass back the + * btree cursor to maintain our lock on the bmapbt between calls. + */ +int +xfs_bmap_finish_one( + struct xfs_trans *tp, + struct xfs_defer_ops *dfops, + struct xfs_inode *ip, + enum xfs_bmap_intent_type type, + int whichfork, + xfs_fileoff_t startoff, + xfs_fsblock_t startblock, + xfs_filblks_t blockcount, + xfs_exntst_t state) +{ + struct xfs_bmbt_irec bmap; + int nimaps = 1; + xfs_fsblock_t firstfsb; + int done; + int error = 0; + + bmap.br_startblock = startblock; + bmap.br_startoff = startoff; + bmap.br_blockcount = blockcount; + bmap.br_state = state; + + trace_xfs_bmap_deferred(tp->t_mountp, + XFS_FSB_TO_AGNO(tp->t_mountp, startblock), type, + XFS_FSB_TO_AGBNO(tp->t_mountp, startblock), + ip->i_ino, whichfork, startoff, blockcount, state); + + if (XFS_TEST_ERROR(false, tp->t_mountp, + XFS_ERRTAG_BMAP_FINISH_ONE, + XFS_RANDOM_BMAP_FINISH_ONE)) + return -EIO; + + switch (type) { + case XFS_BMAP_MAP: + firstfsb = bmap.br_startblock; + error = xfs_bmapi_write(tp, ip, bmap.br_startoff, + bmap.br_blockcount, + XFS_BMAPI_REMAP, &firstfsb, + bmap.br_blockcount, &bmap, &nimaps, + dfops); + break; + case XFS_BMAP_UNMAP: + error = xfs_bunmapi(tp, ip, bmap.br_startoff, + bmap.br_blockcount, XFS_BMAPI_REMAP, 1, &firstfsb, + dfops, &done); + ASSERT(done); + break; + default: + ASSERT(0); + error = -EFSCORRUPTED; + } + + return error; +} diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index 4d9b666..858788b 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -233,4 +233,15 @@ struct xfs_bmap_intent { struct xfs_bmbt_irec bi_bmap; }; +int xfs_bmap_finish_one(struct xfs_trans *tp, struct xfs_defer_ops *dfops, + struct xfs_inode *ip, enum xfs_bmap_intent_type type, + int whichfork, xfs_fileoff_t startoff, xfs_fsblock_t startblock, + xfs_filblks_t blockcount, xfs_exntst_t state); +int xfs_bmap_map_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, + struct xfs_inode *ip, int whichfork, + struct xfs_bmbt_irec *imap); +int xfs_bmap_unmap_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, + struct xfs_inode *ip, int whichfork, + struct xfs_bmbt_irec *imap); + #endif /* __XFS_BMAP_H__ */ diff --git a/libxfs/xfs_defer.h b/libxfs/xfs_defer.h index d47a482..aa57eaa 100644 --- a/libxfs/xfs_defer.h +++ b/libxfs/xfs_defer.h @@ -51,6 +51,7 @@ struct xfs_defer_pending { * find all the space it needs. */ enum xfs_defer_ops_type { + XFS_DEFER_OPS_TYPE_BMAP, XFS_DEFER_OPS_TYPE_REFCOUNT, XFS_DEFER_OPS_TYPE_RMAP, XFS_DEFER_OPS_TYPE_FREE, From darrick.wong@oracle.com Thu Aug 25 18:49:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 48AA68141 for ; Thu, 25 Aug 2016 18:49:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1AA038F8033 for ; Thu, 25 Aug 2016 16:49:10 -0700 (PDT) X-ASG-Debug-ID: 1472168947-0bf57c55b41c7e50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id AvJD1hUzuFLyK8Ro (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:08 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNn65w024012 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:49:07 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNn61B003087 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:49:06 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNn5CG001412; Thu, 25 Aug 2016 23:49:05 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:49:05 -0700 Subject: [PATCH 24/71] xfs: return work remaining at the end of a bunmapi operation From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 24/71] xfs: return work remaining at the end of a bunmapi operation To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:03 -0700 Message-ID: <147216894396.4420.2834251749095179855.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168948 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3531 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Return the range of file blocks that bunmapi didn't free. This hint is used by CoW and reflink to figure out what part of an extent actually got freed so that it can set up the appropriate atomic remapping of just the freed range. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.c | 36 ++++++++++++++++++++++++++++++------ libxfs/xfs_bmap.h | 4 ++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index a919371..011ac9b 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -5159,17 +5159,16 @@ done: * *done is set. */ int /* error */ -xfs_bunmapi( +__xfs_bunmapi( xfs_trans_t *tp, /* transaction pointer */ struct xfs_inode *ip, /* incore inode */ xfs_fileoff_t bno, /* starting offset to unmap */ - xfs_filblks_t len, /* length to unmap in file */ + xfs_filblks_t *rlen, /* i/o: amount remaining */ int flags, /* misc flags */ xfs_extnum_t nexts, /* number of extents max */ xfs_fsblock_t *firstblock, /* first allocated block controls a.g. for allocs */ - struct xfs_defer_ops *dfops, /* i/o: list extents to free */ - int *done) /* set if not done yet */ + struct xfs_defer_ops *dfops) /* i/o: deferred updates */ { xfs_btree_cur_t *cur; /* bmap btree cursor */ xfs_bmbt_irec_t del; /* extent being deleted */ @@ -5191,6 +5190,7 @@ xfs_bunmapi( int wasdel; /* was a delayed alloc extent */ int whichfork; /* data or attribute fork */ xfs_fsblock_t sum; + xfs_filblks_t len = *rlen; /* length to unmap in file */ trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); @@ -5217,7 +5217,7 @@ xfs_bunmapi( return error; nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); if (nextents == 0) { - *done = 1; + *rlen = 0; return 0; } XFS_STATS_INC(mp, xs_blk_unmap); @@ -5488,7 +5488,10 @@ nodelete: extno++; } } - *done = bno == (xfs_fileoff_t)-1 || bno < start || lastx < 0; + if (bno == (xfs_fileoff_t)-1 || bno < start || lastx < 0) + *rlen = 0; + else + *rlen = bno - start + 1; /* * Convert to a btree if necessary. @@ -5544,6 +5547,27 @@ error0: return error; } +/* Unmap a range of a file. */ +int +xfs_bunmapi( + xfs_trans_t *tp, + struct xfs_inode *ip, + xfs_fileoff_t bno, + xfs_filblks_t len, + int flags, + xfs_extnum_t nexts, + xfs_fsblock_t *firstblock, + struct xfs_defer_ops *dfops, + int *done) +{ + int error; + + error = __xfs_bunmapi(tp, ip, bno, &len, flags, nexts, firstblock, + dfops); + *done = (len == 0); + return error; +} + /* * Determine whether an extent shift can be accomplished by a merge with the * extent that precedes the target hole of the shift. diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index 858788b..4b68e96 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -200,6 +200,10 @@ int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fsblock_t *firstblock, xfs_extlen_t total, struct xfs_bmbt_irec *mval, int *nmap, struct xfs_defer_ops *dfops); +int __xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t bno, xfs_filblks_t *rlen, int flags, + xfs_extnum_t nexts, xfs_fsblock_t *firstblock, + struct xfs_defer_ops *dfops); int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, int flags, xfs_extnum_t nexts, xfs_fsblock_t *firstblock, From darrick.wong@oracle.com Thu Aug 25 18:49:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D54D2814B for ; Thu, 25 Aug 2016 18:49:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95BB18F8035 for ; Thu, 25 Aug 2016 16:49:16 -0700 (PDT) X-ASG-Debug-ID: 1472168954-0bf57c55b41c7e60001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id wGI3iSdgy5fDpDAa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:15 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNnDp5030284 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:49:13 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNnDjY003206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:13 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnBjq001041; Thu, 25 Aug 2016 23:49:12 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:49:11 -0700 Subject: [PATCH 25/71] xfs: add reflink feature flag to geometry From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 25/71] xfs: add reflink feature flag to geometry To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:10 -0700 Message-ID: <147216895011.4420.827445237391951114.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168955 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 943 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Report the reflink feature in the XFS geometry so that xfs_info and friends know the filesystem has this feature. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 085ea6f..f291a53 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -230,7 +230,8 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ #define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ #define XFS_FSOP_GEOM_FLAGS_SPINODES 0x40000 /* sparse inode chunks */ -#define XFS_FSOP_GEOM_FLAGS_RMAPBT 0x80000 /* Reverse mapping btree */ +#define XFS_FSOP_GEOM_FLAGS_RMAPBT 0x80000 /* reverse mapping btree */ +#define XFS_FSOP_GEOM_FLAGS_REFLINK 0x100000 /* files can share blocks */ /* * Minimum and maximum sizes need for growth checks. From darrick.wong@oracle.com Thu Aug 25 18:49:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 547AD815A for ; Thu, 25 Aug 2016 18:49:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E01C304039 for ; Thu, 25 Aug 2016 16:49:23 -0700 (PDT) X-ASG-Debug-ID: 1472168961-0bf57b5311209a10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id dMSxb40G4PKYikON (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:21 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNnJWU030311 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:20 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnIdr008262 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:19 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnHFW019208; Thu, 25 Aug 2016 23:49:18 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:49:17 -0700 Subject: [PATCH 26/71] xfs: don't allow reflinked dir/dev/fifo/socket/pipe files From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 26/71] xfs: don't allow reflinked dir/dev/fifo/socket/pipe files To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:16 -0700 Message-ID: <147216895627.4420.18285839565734790478.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168961 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1551 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Only non-rt files can be reflinked, so check that when we load an inode. Also, don't leak the attr fork if there's a failure. Signed-off-by: Darrick J. Wong --- libxfs/xfs_inode_fork.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index 75d448b..eda590f 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -117,6 +117,26 @@ xfs_iformat_fork( return -EFSCORRUPTED; } + if (unlikely(xfs_is_reflink_inode(ip) && + (VFS_I(ip)->i_mode & S_IFMT) != S_IFREG)) { + xfs_warn(ip->i_mount, + "corrupt dinode %llu, wrong file type for reflink.", + ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat(reflink)", + XFS_ERRLEVEL_LOW, ip->i_mount, dip); + return -EFSCORRUPTED; + } + + if (unlikely(xfs_is_reflink_inode(ip) && + (ip->i_d.di_flags & XFS_DIFLAG_REALTIME))) { + xfs_warn(ip->i_mount, + "corrupt dinode %llu, has reflink+realtime flag set.", + ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat(reflink)", + XFS_ERRLEVEL_LOW, ip->i_mount, dip); + return -EFSCORRUPTED; + } + switch (VFS_I(ip)->i_mode & S_IFMT) { case S_IFIFO: case S_IFCHR: @@ -204,7 +224,8 @@ xfs_iformat_fork( XFS_CORRUPTION_ERROR("xfs_iformat(8)", XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return -EFSCORRUPTED; + error = -EFSCORRUPTED; + break; } error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size); From darrick.wong@oracle.com Thu Aug 25 18:49:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B36038160 for ; Thu, 25 Aug 2016 18:49:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 681EE30404E for ; Thu, 25 Aug 2016 16:49:29 -0700 (PDT) X-ASG-Debug-ID: 1472168966-0bf8155c771e84e0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Ra6eWAJ2XeBvCDon (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNnP29030354 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:49:25 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNnPqD003481 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:25 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnOIs001131; Thu, 25 Aug 2016 23:49:24 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:49:23 -0700 Subject: [PATCH 27/71] xfs: introduce the CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 27/71] xfs: introduce the CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:22 -0700 Message-ID: <147216896243.4420.7348456039656197972.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168967 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 13701 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Introduce a new in-core fork for storing copy-on-write delalloc reservations and allocated extents that are in the process of being written out. v2: fix up bmapi_read so that we can query the CoW fork, and have it return a "hole" extent if there's no CoW fork. Signed-off-by: Darrick J. Wong --- include/xfs_inode.h | 3 +++ libxfs/rdwr.c | 2 ++ libxfs/xfs_bmap.c | 27 ++++++++++++++++++++------- libxfs/xfs_bmap.h | 22 +++++++++++++++++++--- libxfs/xfs_bmap_btree.c | 1 + libxfs/xfs_inode_fork.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- libxfs/xfs_inode_fork.h | 28 ++++++++++++++++++++++------ libxfs/xfs_rmap.c | 15 ++++++++------- libxfs/xfs_types.h | 1 + 9 files changed, 120 insertions(+), 26 deletions(-) diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 3876fa6..b7623c0 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -50,6 +50,7 @@ typedef struct xfs_inode { struct xfs_imap i_imap; /* location for xfs_imap() */ struct xfs_buftarg i_dev; /* dev for this inode */ struct xfs_ifork *i_afp; /* attribute fork pointer */ + struct xfs_ifork *i_cowfp; /* copy on write extents */ struct xfs_ifork i_df; /* data fork */ struct xfs_trans *i_transp; /* ptr to owning transaction */ struct xfs_inode_log_item *i_itemp; /* logging information */ @@ -58,6 +59,8 @@ typedef struct xfs_inode { xfs_fsize_t i_size; /* in-memory size */ const struct xfs_dir_ops *d_ops; /* directory ops vector */ struct inode i_vnode; + xfs_extnum_t i_cnextents; /* # of extents in cow fork */ + unsigned int i_cformat; /* format of cow fork */ } xfs_inode_t; static inline struct inode *VFS_I(struct xfs_inode *ip) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index aa30522..533a064 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -1372,6 +1372,8 @@ libxfs_idestroy(xfs_inode_t *ip) } if (ip->i_afp) libxfs_idestroy_fork(ip, XFS_ATTR_FORK); + if (ip->i_cowfp) + xfs_idestroy_fork(ip, XFS_COW_FORK); } void diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 011ac9b..3121f7f 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -2916,6 +2916,7 @@ xfs_bmap_add_extent_hole_real( ASSERT(!isnullstartblock(new->br_startblock)); ASSERT(!bma->cur || !(bma->cur->bc_private.b.flags & XFS_BTCUR_BPRV_WASDEL)); + ASSERT(whichfork != XFS_COW_FORK); XFS_STATS_INC(mp, xs_add_exlist); @@ -4051,12 +4052,11 @@ xfs_bmapi_read( int error; int eof; int n = 0; - int whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + int whichfork = xfs_bmapi_whichfork(flags); ASSERT(*nmap >= 1); ASSERT(!(flags & ~(XFS_BMAPI_ATTRFORK|XFS_BMAPI_ENTIRE| - XFS_BMAPI_IGSTATE))); + XFS_BMAPI_IGSTATE|XFS_BMAPI_COWFORK))); ASSERT(xfs_isilocked(ip, XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)); if (unlikely(XFS_TEST_ERROR( @@ -4074,6 +4074,16 @@ xfs_bmapi_read( ifp = XFS_IFORK_PTR(ip, whichfork); + /* No CoW fork? Return a hole. */ + if (whichfork == XFS_COW_FORK && !ifp) { + mval->br_startoff = bno; + mval->br_startblock = HOLESTARTBLOCK; + mval->br_blockcount = len; + mval->br_state = XFS_EXT_NORM; + *nmap = 1; + return 0; + } + if (!(ifp->if_flags & XFS_IFEXTENTS)) { error = xfs_iread_extents(NULL, ip, whichfork); if (error) @@ -4426,8 +4436,7 @@ xfs_bmapi_convert_unwritten( xfs_filblks_t len, int flags) { - int whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + int whichfork = xfs_bmapi_whichfork(flags); struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); int tmp_logflags = 0; int error; @@ -4443,6 +4452,8 @@ xfs_bmapi_convert_unwritten( (XFS_BMAPI_PREALLOC | XFS_BMAPI_CONVERT)) return 0; + ASSERT(whichfork != XFS_COW_FORK); + /* * Modify (by adding) the state flag, if writing. */ @@ -4856,6 +4867,8 @@ xfs_bmap_del_extent( if (whichfork == XFS_ATTR_FORK) state |= BMAP_ATTRFORK; + else if (whichfork == XFS_COW_FORK) + state |= BMAP_COWFORK; ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT((*idx >= 0) && (*idx < ifp->if_bytes / @@ -5194,8 +5207,8 @@ __xfs_bunmapi( trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); - whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + whichfork = xfs_bmapi_whichfork(flags); + ASSERT(whichfork != XFS_COW_FORK); ifp = XFS_IFORK_PTR(ip, whichfork); if (unlikely( XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index 4b68e96..b7df7d4 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -107,6 +107,9 @@ struct xfs_extent_free_item */ #define XFS_BMAPI_REMAP 0x100 +/* Map something in the CoW fork. */ +#define XFS_BMAPI_COWFORK 0x200 + #define XFS_BMAPI_FLAGS \ { XFS_BMAPI_ENTIRE, "ENTIRE" }, \ { XFS_BMAPI_METADATA, "METADATA" }, \ @@ -116,12 +119,23 @@ struct xfs_extent_free_item { XFS_BMAPI_CONTIG, "CONTIG" }, \ { XFS_BMAPI_CONVERT, "CONVERT" }, \ { XFS_BMAPI_ZERO, "ZERO" }, \ - { XFS_BMAPI_REMAP, "REMAP" } + { XFS_BMAPI_REMAP, "REMAP" }, \ + { XFS_BMAPI_COWFORK, "COWFORK" } static inline int xfs_bmapi_aflag(int w) { - return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0); + return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : + (w == XFS_COW_FORK ? XFS_BMAPI_COWFORK : 0)); +} + +static inline int xfs_bmapi_whichfork(int bmapi_flags) +{ + if (bmapi_flags & XFS_BMAPI_COWFORK) + return XFS_COW_FORK; + else if (bmapi_flags & XFS_BMAPI_ATTRFORK) + return XFS_ATTR_FORK; + return XFS_DATA_FORK; } /* @@ -142,13 +156,15 @@ static inline int xfs_bmapi_aflag(int w) #define BMAP_LEFT_VALID (1 << 6) #define BMAP_RIGHT_VALID (1 << 7) #define BMAP_ATTRFORK (1 << 8) +#define BMAP_COWFORK (1 << 9) #define XFS_BMAP_EXT_FLAGS \ { BMAP_LEFT_CONTIG, "LC" }, \ { BMAP_RIGHT_CONTIG, "RC" }, \ { BMAP_LEFT_FILLING, "LF" }, \ { BMAP_RIGHT_FILLING, "RF" }, \ - { BMAP_ATTRFORK, "ATTR" } + { BMAP_ATTRFORK, "ATTR" }, \ + { BMAP_COWFORK, "COW" } /* diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 906983e..3d1a02e 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -774,6 +774,7 @@ xfs_bmbt_init_cursor( { struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); struct xfs_btree_cur *cur; + ASSERT(whichfork != XFS_COW_FORK); cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_SLEEP); diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index eda590f..e65f633 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -202,9 +202,14 @@ xfs_iformat_fork( XFS_ERROR_REPORT("xfs_iformat(7)", XFS_ERRLEVEL_LOW, ip->i_mount); return -EFSCORRUPTED; } - if (error) { + if (error) return error; + + if (xfs_is_reflink_inode(ip)) { + ASSERT(ip->i_cowfp == NULL); + xfs_ifork_init_cow(ip); } + if (!XFS_DFORK_Q(dip)) return 0; @@ -243,6 +248,9 @@ xfs_iformat_fork( if (error) { kmem_zone_free(xfs_ifork_zone, ip->i_afp); ip->i_afp = NULL; + if (ip->i_cowfp) + kmem_zone_free(xfs_ifork_zone, ip->i_cowfp); + ip->i_cowfp = NULL; xfs_idestroy_fork(ip, XFS_DATA_FORK); } return error; @@ -757,6 +765,9 @@ xfs_idestroy_fork( if (whichfork == XFS_ATTR_FORK) { kmem_zone_free(xfs_ifork_zone, ip->i_afp); ip->i_afp = NULL; + } else if (whichfork == XFS_COW_FORK) { + kmem_zone_free(xfs_ifork_zone, ip->i_cowfp); + ip->i_cowfp = NULL; } } @@ -944,6 +955,19 @@ xfs_iext_get_ext( } } +/* XFS_IEXT_STATE_TO_FORK() -- Convert BMAP state flags to an inode fork. */ +xfs_ifork_t * +XFS_IEXT_STATE_TO_FORK( + struct xfs_inode *ip, + int state) +{ + if (state & BMAP_COWFORK) + return ip->i_cowfp; + else if (state & BMAP_ATTRFORK) + return ip->i_afp; + return &ip->i_df; +} + /* * Insert new item(s) into the extent records for incore inode * fork 'ifp'. 'count' new items are inserted at index 'idx'. @@ -956,7 +980,7 @@ xfs_iext_insert( xfs_bmbt_irec_t *new, /* items to insert */ int state) /* type of extent conversion */ { - xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; + xfs_ifork_t *ifp = XFS_IEXT_STATE_TO_FORK(ip, state); xfs_extnum_t i; /* extent record index */ trace_xfs_iext_insert(ip, idx, new, state, _RET_IP_); @@ -1206,7 +1230,7 @@ xfs_iext_remove( int ext_diff, /* number of extents to remove */ int state) /* type of extent conversion */ { - xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; + xfs_ifork_t *ifp = XFS_IEXT_STATE_TO_FORK(ip, state); xfs_extnum_t nextents; /* number of extents in file */ int new_size; /* size of extents after removal */ @@ -1953,3 +1977,20 @@ xfs_iext_irec_update_extoffs( ifp->if_u1.if_ext_irec[i].er_extoff += ext_diff; } } + +/* + * Initialize an inode's copy-on-write fork. + */ +void +xfs_ifork_init_cow( + struct xfs_inode *ip) +{ + if (ip->i_cowfp) + return; + + ip->i_cowfp = kmem_zone_zalloc(xfs_ifork_zone, + KM_SLEEP | KM_NOFS); + ip->i_cowfp->if_flags = XFS_IFEXTENTS; + ip->i_cformat = XFS_DINODE_FMT_EXTENTS; + ip->i_cnextents = 0; +} diff --git a/libxfs/xfs_inode_fork.h b/libxfs/xfs_inode_fork.h index f95e072..44d38eb 100644 --- a/libxfs/xfs_inode_fork.h +++ b/libxfs/xfs_inode_fork.h @@ -92,7 +92,9 @@ typedef struct xfs_ifork { #define XFS_IFORK_PTR(ip,w) \ ((w) == XFS_DATA_FORK ? \ &(ip)->i_df : \ - (ip)->i_afp) + ((w) == XFS_ATTR_FORK ? \ + (ip)->i_afp : \ + (ip)->i_cowfp)) #define XFS_IFORK_DSIZE(ip) \ (XFS_IFORK_Q(ip) ? \ XFS_IFORK_BOFF(ip) : \ @@ -105,26 +107,38 @@ typedef struct xfs_ifork { #define XFS_IFORK_SIZE(ip,w) \ ((w) == XFS_DATA_FORK ? \ XFS_IFORK_DSIZE(ip) : \ - XFS_IFORK_ASIZE(ip)) + ((w) == XFS_ATTR_FORK ? \ + XFS_IFORK_ASIZE(ip) : \ + 0)) #define XFS_IFORK_FORMAT(ip,w) \ ((w) == XFS_DATA_FORK ? \ (ip)->i_d.di_format : \ - (ip)->i_d.di_aformat) + ((w) == XFS_ATTR_FORK ? \ + (ip)->i_d.di_aformat : \ + (ip)->i_cformat)) #define XFS_IFORK_FMT_SET(ip,w,n) \ ((w) == XFS_DATA_FORK ? \ ((ip)->i_d.di_format = (n)) : \ - ((ip)->i_d.di_aformat = (n))) + ((w) == XFS_ATTR_FORK ? \ + ((ip)->i_d.di_aformat = (n)) : \ + ((ip)->i_cformat = (n)))) #define XFS_IFORK_NEXTENTS(ip,w) \ ((w) == XFS_DATA_FORK ? \ (ip)->i_d.di_nextents : \ - (ip)->i_d.di_anextents) + ((w) == XFS_ATTR_FORK ? \ + (ip)->i_d.di_anextents : \ + (ip)->i_cnextents)) #define XFS_IFORK_NEXT_SET(ip,w,n) \ ((w) == XFS_DATA_FORK ? \ ((ip)->i_d.di_nextents = (n)) : \ - ((ip)->i_d.di_anextents = (n))) + ((w) == XFS_ATTR_FORK ? \ + ((ip)->i_d.di_anextents = (n)) : \ + ((ip)->i_cnextents = (n)))) #define XFS_IFORK_MAXEXT(ip, w) \ (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t)) +xfs_ifork_t *XFS_IEXT_STATE_TO_FORK(struct xfs_inode *ip, int state); + int xfs_iformat_fork(struct xfs_inode *, struct xfs_dinode *); void xfs_iflush_fork(struct xfs_inode *, struct xfs_dinode *, struct xfs_inode_log_item *, int); @@ -169,4 +183,6 @@ void xfs_iext_irec_update_extoffs(struct xfs_ifork *, int, int); extern struct kmem_zone *xfs_ifork_zone; +extern void xfs_ifork_init_cow(struct xfs_inode *ip); + #endif /* __XFS_INODE_FORK_H__ */ diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index b752fed..82c2597 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -1261,9 +1261,10 @@ out_cur: */ static bool xfs_rmap_update_is_needed( - struct xfs_mount *mp) + struct xfs_mount *mp, + int whichfork) { - return xfs_sb_version_hasrmapbt(&mp->m_sb); + return xfs_sb_version_hasrmapbt(&mp->m_sb) && whichfork != XFS_COW_FORK; } /* @@ -1309,7 +1310,7 @@ xfs_rmap_map_extent( int whichfork, struct xfs_bmbt_irec *PREV) { - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; return __xfs_rmap_add(mp, dfops, XFS_RMAP_MAP, ip->i_ino, @@ -1325,7 +1326,7 @@ xfs_rmap_unmap_extent( int whichfork, struct xfs_bmbt_irec *PREV) { - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; return __xfs_rmap_add(mp, dfops, XFS_RMAP_UNMAP, ip->i_ino, @@ -1341,7 +1342,7 @@ xfs_rmap_convert_extent( int whichfork, struct xfs_bmbt_irec *PREV) { - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; return __xfs_rmap_add(mp, dfops, XFS_RMAP_CONVERT, ip->i_ino, @@ -1360,7 +1361,7 @@ xfs_rmap_alloc_extent( { struct xfs_bmbt_irec bmap; - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, XFS_DATA_FORK)) return 0; bmap.br_startblock = XFS_AGB_TO_FSB(mp, agno, bno); @@ -1384,7 +1385,7 @@ xfs_rmap_free_extent( { struct xfs_bmbt_irec bmap; - if (!xfs_rmap_update_is_needed(mp)) + if (!xfs_rmap_update_is_needed(mp, XFS_DATA_FORK)) return 0; bmap.br_startblock = XFS_AGB_TO_FSB(mp, agno, bno); diff --git a/libxfs/xfs_types.h b/libxfs/xfs_types.h index 690d616..cf044c0 100644 --- a/libxfs/xfs_types.h +++ b/libxfs/xfs_types.h @@ -93,6 +93,7 @@ typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */ */ #define XFS_DATA_FORK 0 #define XFS_ATTR_FORK 1 +#define XFS_COW_FORK 2 /* * Min numbers of data/attr fork btree root pointers. From darrick.wong@oracle.com Thu Aug 25 18:49:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 791798166 for ; Thu, 25 Aug 2016 18:49:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4AC7030404E for ; Thu, 25 Aug 2016 16:49:35 -0700 (PDT) X-ASG-Debug-ID: 1472168973-0bf57c55b41c7e70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id tRynU4i24HsnX05L (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNnVKC030384 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:32 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnV2P008698 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:31 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnUS5001147; Thu, 25 Aug 2016 23:49:30 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:49:30 -0700 Subject: [PATCH 28/71] xfs: support bmapping delalloc extents in the CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 28/71] xfs: support bmapping delalloc extents in the CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:28 -0700 Message-ID: <147216896883.4420.3084170519338583041.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168973 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5471 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Allow the creation of delayed allocation extents in the CoW fork. In a subsequent patch we'll wire up write_begin and page_mkwrite to actually do this. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.c | 29 ++++++++++++++++++----------- libxfs/xfs_bmap.h | 2 +- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 3121f7f..cdc1ed3 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -2752,6 +2752,7 @@ done: STATIC void xfs_bmap_add_extent_hole_delay( xfs_inode_t *ip, /* incore inode pointer */ + int whichfork, xfs_extnum_t *idx, /* extent number to update/insert */ xfs_bmbt_irec_t *new) /* new data to add to file extents */ { @@ -2763,8 +2764,10 @@ xfs_bmap_add_extent_hole_delay( int state; /* state bits, accessed thru macros */ xfs_filblks_t temp=0; /* temp for indirect calculations */ - ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + ifp = XFS_IFORK_PTR(ip, whichfork); state = 0; + if (whichfork == XFS_COW_FORK) + state |= BMAP_COWFORK; ASSERT(isnullstartblock(new->br_startblock)); /* @@ -2782,7 +2785,7 @@ xfs_bmap_add_extent_hole_delay( * Check and set flags if the current (right) segment exists. * If it doesn't exist, we're converting the hole at end-of-file. */ - if (*idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { + if (*idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { state |= BMAP_RIGHT_VALID; xfs_bmbt_get_all(xfs_iext_get_ext(ifp, *idx), &right); @@ -4133,6 +4136,7 @@ xfs_bmapi_read( STATIC int xfs_bmapi_reserve_delalloc( struct xfs_inode *ip, + int whichfork, xfs_fileoff_t aoff, xfs_filblks_t len, struct xfs_bmbt_irec *got, @@ -4141,7 +4145,7 @@ xfs_bmapi_reserve_delalloc( int eof) { struct xfs_mount *mp = ip->i_mount; - struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); xfs_extlen_t alen; xfs_extlen_t indlen; char rt = XFS_IS_REALTIME_INODE(ip); @@ -4200,7 +4204,7 @@ xfs_bmapi_reserve_delalloc( got->br_startblock = nullstartblock(indlen); got->br_blockcount = alen; got->br_state = XFS_EXT_NORM; - xfs_bmap_add_extent_hole_delay(ip, lastx, got); + xfs_bmap_add_extent_hole_delay(ip, whichfork, lastx, got); /* * Update our extent pointer, given that xfs_bmap_add_extent_hole_delay @@ -4232,6 +4236,7 @@ out_unreserve_quota: int xfs_bmapi_delay( struct xfs_inode *ip, /* incore inode */ + int whichfork, /* data or cow fork? */ xfs_fileoff_t bno, /* starting file offs. mapped */ xfs_filblks_t len, /* length to map in file */ struct xfs_bmbt_irec *mval, /* output: map values */ @@ -4239,7 +4244,7 @@ xfs_bmapi_delay( int flags) /* XFS_BMAPI_... */ { struct xfs_mount *mp = ip->i_mount; - struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); struct xfs_bmbt_irec got; /* current file extent record */ struct xfs_bmbt_irec prev; /* previous file extent record */ xfs_fileoff_t obno; /* old block number (offset) */ @@ -4249,14 +4254,15 @@ xfs_bmapi_delay( int n = 0; /* current extent index */ int error = 0; + ASSERT(whichfork == XFS_DATA_FORK || whichfork == XFS_COW_FORK); ASSERT(*nmap >= 1); ASSERT(*nmap <= XFS_BMAP_MAX_NMAP); ASSERT(!(flags & ~XFS_BMAPI_ENTIRE)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); if (unlikely(XFS_TEST_ERROR( - (XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, XFS_DATA_FORK) != XFS_DINODE_FMT_BTREE), + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { XFS_ERROR_REPORT("xfs_bmapi_delay", XFS_ERRLEVEL_LOW, mp); return -EFSCORRUPTED; @@ -4267,19 +4273,20 @@ xfs_bmapi_delay( XFS_STATS_INC(mp, xs_blk_mapw); - if (!(ifp->if_flags & XFS_IFEXTENTS)) { - error = xfs_iread_extents(NULL, ip, XFS_DATA_FORK); + if (whichfork == XFS_DATA_FORK && !(ifp->if_flags & XFS_IFEXTENTS)) { + error = xfs_iread_extents(NULL, ip, whichfork); if (error) return error; } - xfs_bmap_search_extents(ip, bno, XFS_DATA_FORK, &eof, &lastx, &got, &prev); + xfs_bmap_search_extents(ip, bno, whichfork, &eof, &lastx, &got, &prev); end = bno + len; obno = bno; while (bno < end && n < *nmap) { if (eof || got.br_startoff > bno) { - error = xfs_bmapi_reserve_delalloc(ip, bno, len, &got, + error = xfs_bmapi_reserve_delalloc(ip, whichfork, + bno, len, &got, &prev, &lastx, eof); if (error) { if (n == 0) { diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index b7df7d4..c9f29b3 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -208,7 +208,7 @@ int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip, int xfs_bmapi_read(struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, struct xfs_bmbt_irec *mval, int *nmap, int flags); -int xfs_bmapi_delay(struct xfs_inode *ip, xfs_fileoff_t bno, +int xfs_bmapi_delay(struct xfs_inode *ip, int whichfork, xfs_fileoff_t bno, xfs_filblks_t len, struct xfs_bmbt_irec *mval, int *nmap, int flags); int xfs_bmapi_write(struct xfs_trans *tp, struct xfs_inode *ip, From darrick.wong@oracle.com Thu Aug 25 18:49:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 921B48178 for ; Thu, 25 Aug 2016 18:49:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E8F77AC002 for ; Thu, 25 Aug 2016 16:49:41 -0700 (PDT) X-ASG-Debug-ID: 1472168979-0bf57b5312209a20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id hPliTcX2xjlk91yF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:39 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNncV6030461 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:38 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnbKB025582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:37 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnauY001170; Thu, 25 Aug 2016 23:49:37 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:49:36 -0700 Subject: [PATCH 29/71] xfs: support allocating delayed extents in CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 29/71] xfs: support allocating delayed extents in CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:35 -0700 Message-ID: <147216897506.4420.17994208428591127794.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472168979 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7320 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Modify xfs_bmap_add_extent_delay_real() so that we can convert delayed allocation extents in the CoW fork to real allocations, and wire this up all the way back to xfs_iomap_write_allocate(). In a subsequent patch, we'll modify the writepage handler to call this. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.c | 51 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index cdc1ed3..6503241 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -133,7 +133,8 @@ xfs_bmbt_lookup_ge( */ static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfork) { - return XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS && + return whichfork != XFS_COW_FORK && + XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS && XFS_IFORK_NEXTENTS(ip, whichfork) > XFS_IFORK_MAXEXT(ip, whichfork); } @@ -143,7 +144,8 @@ static inline bool xfs_bmap_needs_btree(struct xfs_inode *ip, int whichfork) */ static inline bool xfs_bmap_wants_extents(struct xfs_inode *ip, int whichfork) { - return XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE && + return whichfork != XFS_COW_FORK && + XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE && XFS_IFORK_NEXTENTS(ip, whichfork) <= XFS_IFORK_MAXEXT(ip, whichfork); } @@ -633,6 +635,7 @@ xfs_bmap_btree_to_extents( mp = ip->i_mount; ifp = XFS_IFORK_PTR(ip, whichfork); + ASSERT(whichfork != XFS_COW_FORK); ASSERT(ifp->if_flags & XFS_IFEXTENTS); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE); rblock = ifp->if_broot; @@ -699,6 +702,7 @@ xfs_bmap_extents_to_btree( xfs_bmbt_ptr_t *pp; /* root block address pointer */ mp = ip->i_mount; + ASSERT(whichfork != XFS_COW_FORK); ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS); @@ -830,6 +834,7 @@ xfs_bmap_local_to_extents_empty( { struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); + ASSERT(whichfork != XFS_COW_FORK); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL); ASSERT(ifp->if_bytes == 0); ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0); @@ -1663,7 +1668,8 @@ xfs_bmap_one_block( */ STATIC int /* error */ xfs_bmap_add_extent_delay_real( - struct xfs_bmalloca *bma) + struct xfs_bmalloca *bma, + int whichfork) { struct xfs_bmbt_irec *new = &bma->got; int diff; /* temp value */ @@ -1682,10 +1688,13 @@ xfs_bmap_add_extent_delay_real( xfs_filblks_t temp2=0;/* value for da_new calculations */ int tmp_rval; /* partial logging flags */ struct xfs_mount *mp; - int whichfork = XFS_DATA_FORK; + xfs_extnum_t *nextents; mp = bma->ip->i_mount; ifp = XFS_IFORK_PTR(bma->ip, whichfork); + ASSERT(whichfork != XFS_ATTR_FORK); + nextents = (whichfork == XFS_COW_FORK ? &bma->ip->i_cnextents : + &bma->ip->i_d.di_nextents); ASSERT(bma->idx >= 0); ASSERT(bma->idx <= ifp->if_bytes / sizeof(struct xfs_bmbt_rec)); @@ -1699,6 +1708,9 @@ xfs_bmap_add_extent_delay_real( #define RIGHT r[1] #define PREV r[2] + if (whichfork == XFS_COW_FORK) + state |= BMAP_COWFORK; + /* * Set up a bunch of variables to make the tests simpler. */ @@ -1785,7 +1797,7 @@ xfs_bmap_add_extent_delay_real( trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_iext_remove(bma->ip, bma->idx + 1, 2, state); - bma->ip->i_d.di_nextents--; + (*nextents)--; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -1887,7 +1899,7 @@ xfs_bmap_add_extent_delay_real( xfs_bmbt_set_startblock(ep, new->br_startblock); trace_xfs_bmap_post_update(bma->ip, bma->idx, state, _THIS_IP_); - bma->ip->i_d.di_nextents++; + (*nextents)++; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -1957,7 +1969,7 @@ xfs_bmap_add_extent_delay_real( temp = PREV.br_blockcount - new->br_blockcount; xfs_bmbt_set_blockcount(ep, temp); xfs_iext_insert(bma->ip, bma->idx, 1, new, state); - bma->ip->i_d.di_nextents++; + (*nextents)++; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -2041,7 +2053,7 @@ xfs_bmap_add_extent_delay_real( trace_xfs_bmap_pre_update(bma->ip, bma->idx, state, _THIS_IP_); xfs_bmbt_set_blockcount(ep, temp); xfs_iext_insert(bma->ip, bma->idx + 1, 1, new, state); - bma->ip->i_d.di_nextents++; + (*nextents)++; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -2110,7 +2122,7 @@ xfs_bmap_add_extent_delay_real( RIGHT.br_blockcount = temp2; /* insert LEFT (r[0]) and RIGHT (r[1]) at the same time */ xfs_iext_insert(bma->ip, bma->idx + 1, 2, &LEFT, state); - bma->ip->i_d.di_nextents++; + (*nextents)++; if (bma->cur == NULL) rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; else { @@ -2208,7 +2220,8 @@ xfs_bmap_add_extent_delay_real( xfs_bmap_check_leaf_extents(bma->cur, bma->ip, whichfork); done: - bma->logflags |= rval; + if (whichfork != XFS_COW_FORK) + bma->logflags |= rval; return error; #undef LEFT #undef RIGHT @@ -3849,7 +3862,8 @@ xfs_bmap_btalloc( ASSERT(nullfb || fb_agno == args.agno || (ap->dfops->dop_low && fb_agno < args.agno)); ap->length = args.len; - ap->ip->i_d.di_nblocks += args.len; + if (!(ap->flags & XFS_BMAPI_COWFORK)) + ap->ip->i_d.di_nblocks += args.len; xfs_trans_log_inode(ap->tp, ap->ip, XFS_ILOG_CORE); if (ap->wasdel) ap->ip->i_delayed_blks -= args.len; @@ -4323,8 +4337,7 @@ xfs_bmapi_allocate( struct xfs_bmalloca *bma) { struct xfs_mount *mp = bma->ip->i_mount; - int whichfork = (bma->flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + int whichfork = xfs_bmapi_whichfork(bma->flags); struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); int tmp_logflags = 0; int error; @@ -4413,7 +4426,7 @@ xfs_bmapi_allocate( bma->got.br_state = XFS_EXT_UNWRITTEN; if (bma->wasdel) - error = xfs_bmap_add_extent_delay_real(bma); + error = xfs_bmap_add_extent_delay_real(bma, whichfork); else error = xfs_bmap_add_extent_hole_real(bma, whichfork); @@ -4567,8 +4580,7 @@ xfs_bmapi_write( orig_mval = mval; orig_nmap = *nmap; #endif - whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + whichfork = xfs_bmapi_whichfork(flags); ASSERT(*nmap >= 1); ASSERT(*nmap <= XFS_BMAP_MAX_NMAP); @@ -4579,6 +4591,11 @@ xfs_bmapi_write( ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); if (whichfork == XFS_ATTR_FORK) ASSERT(!(flags & XFS_BMAPI_REMAP)); + if (whichfork == XFS_COW_FORK) { + ASSERT(!(flags & XFS_BMAPI_REMAP)); + ASSERT(!(flags & XFS_BMAPI_PREALLOC)); + ASSERT(!(flags & XFS_BMAPI_CONVERT)); + } if (flags & XFS_BMAPI_REMAP) { ASSERT(!(flags & XFS_BMAPI_PREALLOC)); ASSERT(!(flags & XFS_BMAPI_CONVERT)); @@ -4648,6 +4665,8 @@ xfs_bmapi_write( */ if (flags & XFS_BMAPI_REMAP) ASSERT(inhole); + if (flags & XFS_BMAPI_COWFORK) + ASSERT(!inhole); /* * First, deal with the hole before the allocated space From darrick.wong@oracle.com Thu Aug 25 18:49:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4E29D8180 for ; Thu, 25 Aug 2016 18:49:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 217B6304043 for ; Thu, 25 Aug 2016 16:49:48 -0700 (PDT) X-ASG-Debug-ID: 1472168985-0bf57b5313209a30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id A12p0g0krjxufLgO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNnh2B024306 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:44 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnh2i025730 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:43 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNngem019420; Thu, 25 Aug 2016 23:49:43 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:49:42 -0700 Subject: [PATCH 30/71] xfs: support removing extents from CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 30/71] xfs: support removing extents from CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:41 -0700 Message-ID: <147216898131.4420.12375167822640453648.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168985 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7069 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a helper method to remove extents from the CoW fork without any of the side effects (rmapbt/bmbt updates) of the regular extent deletion routine. We'll eventually use this to clear out the CoW fork during ioend processing. v2: Use bmapi_read to iterate and trim the CoW extents instead of reading them raw via the iext code. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_bmap.h | 1 2 files changed, 177 insertions(+) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 6503241..cb30099 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -4975,6 +4975,7 @@ xfs_bmap_del_extent( /* * Matches the whole extent. Delete the entry. */ + trace_xfs_bmap_pre_update(ip, *idx, state, _THIS_IP_); xfs_iext_remove(ip, *idx, 1, whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); --*idx; @@ -5192,6 +5193,181 @@ done: } /* + * xfs_bunmapi_cow() -- Remove the relevant parts of the CoW fork. + * See xfs_bmap_del_extent. + * @ip: XFS inode. + * @idx: Extent number to delete. + * @del: Extent to remove. + */ +int +xfs_bunmapi_cow( + xfs_inode_t *ip, + xfs_bmbt_irec_t *del) +{ + xfs_filblks_t da_new; /* new delay-alloc indirect blocks */ + xfs_filblks_t da_old; /* old delay-alloc indirect blocks */ + xfs_fsblock_t del_endblock = 0;/* first block past del */ + xfs_fileoff_t del_endoff; /* first offset past del */ + int delay; /* current block is delayed allocated */ + xfs_bmbt_rec_host_t *ep; /* current extent entry pointer */ + int error; /* error return value */ + xfs_bmbt_irec_t got; /* current extent entry */ + xfs_fileoff_t got_endoff; /* first offset past got */ + xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_mount_t *mp; /* mount structure */ + xfs_filblks_t nblks; /* quota/sb block count */ + xfs_bmbt_irec_t new; /* new record to be inserted */ + /* REFERENCED */ + uint qfield; /* quota field to update */ + xfs_filblks_t temp; /* for indirect length calculations */ + xfs_filblks_t temp2; /* for indirect length calculations */ + int state = BMAP_COWFORK; + int eof; + xfs_extnum_t eidx; + + mp = ip->i_mount; + XFS_STATS_INC(mp, xs_del_exlist); + + ep = xfs_bmap_search_extents(ip, del->br_startoff, XFS_COW_FORK, &eof, + &eidx, &got, &new); + + ifp = XFS_IFORK_PTR(ip, XFS_COW_FORK); ifp = ifp; + ASSERT((eidx >= 0) && (eidx < ifp->if_bytes / + (uint)sizeof(xfs_bmbt_rec_t))); + ASSERT(del->br_blockcount > 0); + ASSERT(got.br_startoff <= del->br_startoff); + del_endoff = del->br_startoff + del->br_blockcount; + got_endoff = got.br_startoff + got.br_blockcount; + ASSERT(got_endoff >= del_endoff); + delay = isnullstartblock(got.br_startblock); + ASSERT(isnullstartblock(del->br_startblock) == delay); + qfield = 0; + error = 0; + /* + * If deleting a real allocation, must free up the disk space. + */ + if (!delay) { + nblks = del->br_blockcount; + qfield = XFS_TRANS_DQ_BCOUNT; + /* + * Set up del_endblock and cur for later. + */ + del_endblock = del->br_startblock + del->br_blockcount; + da_old = da_new = 0; + } else { + da_old = startblockval(got.br_startblock); + da_new = 0; + nblks = 0; + } + qfield = qfield; + nblks = nblks; + + /* + * Set flag value to use in switch statement. + * Left-contig is 2, right-contig is 1. + */ + switch (((got.br_startoff == del->br_startoff) << 1) | + (got_endoff == del_endoff)) { + case 3: + /* + * Matches the whole extent. Delete the entry. + */ + xfs_iext_remove(ip, eidx, 1, BMAP_COWFORK); + --eidx; + break; + + case 2: + /* + * Deleting the first part of the extent. + */ + trace_xfs_bmap_pre_update(ip, eidx, state, _THIS_IP_); + xfs_bmbt_set_startoff(ep, del_endoff); + temp = got.br_blockcount - del->br_blockcount; + xfs_bmbt_set_blockcount(ep, temp); + if (delay) { + temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_old); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + da_new = temp; + break; + } + xfs_bmbt_set_startblock(ep, del_endblock); + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + break; + + case 1: + /* + * Deleting the last part of the extent. + */ + temp = got.br_blockcount - del->br_blockcount; + trace_xfs_bmap_pre_update(ip, eidx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + if (delay) { + temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), + da_old); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + da_new = temp; + break; + } + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + break; + + case 0: + /* + * Deleting the middle of the extent. + */ + temp = del->br_startoff - got.br_startoff; + trace_xfs_bmap_pre_update(ip, eidx, state, _THIS_IP_); + xfs_bmbt_set_blockcount(ep, temp); + new.br_startoff = del_endoff; + temp2 = got_endoff - del_endoff; + new.br_blockcount = temp2; + new.br_state = got.br_state; + if (!delay) { + new.br_startblock = del_endblock; + } else { + temp = xfs_bmap_worst_indlen(ip, temp); + xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); + temp2 = xfs_bmap_worst_indlen(ip, temp2); + new.br_startblock = nullstartblock((int)temp2); + da_new = temp + temp2; + while (da_new > da_old) { + if (temp) { + temp--; + da_new--; + xfs_bmbt_set_startblock(ep, + nullstartblock((int)temp)); + } + if (da_new == da_old) + break; + if (temp2) { + temp2--; + da_new--; + new.br_startblock = + nullstartblock((int)temp2); + } + } + } + trace_xfs_bmap_post_update(ip, eidx, state, _THIS_IP_); + xfs_iext_insert(ip, eidx + 1, 1, &new, state); + ++eidx; + break; + } + + /* + * Account for change in delayed indirect blocks. + * Nothing to do for disk quota accounting here. + */ + ASSERT(da_old >= da_new); + if (da_old > da_new) + xfs_mod_fdblocks(mp, (int64_t)(da_old - da_new), false); + + return error; +} + +/* * Unmap (remove) blocks from a file. * If nexts is nonzero then the number of extents to remove is limited to * that value. If not all extents in the block range can be removed then diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index c9f29b3..e60be02 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -224,6 +224,7 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t bno, xfs_filblks_t len, int flags, xfs_extnum_t nexts, xfs_fsblock_t *firstblock, struct xfs_defer_ops *dfops, int *done); +int xfs_bunmapi_cow(struct xfs_inode *ip, struct xfs_bmbt_irec *del); int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); From darrick.wong@oracle.com Thu Aug 25 18:49:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C30918187 for ; Thu, 25 Aug 2016 18:49:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 44BE7AC002 for ; Thu, 25 Aug 2016 16:49:55 -0700 (PDT) X-ASG-Debug-ID: 1472168992-0bf81509b01e0560001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EYnZBK3KTTiG5LVL (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:49:52 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNno3L024367 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:51 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnofC025818 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:49:50 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNnnk5001197; Thu, 25 Aug 2016 23:49:49 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:49:48 -0700 Subject: [PATCH 31/71] xfs: store in-progress CoW allocations in the refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 31/71] xfs: store in-progress CoW allocations in the refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:47 -0700 Message-ID: <147216898752.4420.13353121659330076252.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472168992 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16694 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Due to the way the CoW algorithm in XFS works, there's an interval during which blocks allocated to handle a CoW can be lost -- if the FS goes down after the blocks are allocated but before the block remapping takes place. This is exacerbated by the cowextsz hint -- allocated reservations can sit around for a while, waiting to get used. Since the refcount btree doesn't normally store records with refcount of 1, we can use it to record these in-progress extents. In-progress blocks cannot be shared because they're not user-visible, so there shouldn't be any conflicts with other programs. This is a better solution than holding EFIs during writeback because (a) EFIs can't be relogged currently, (b) even if they could, EFIs are bound by available log space, which puts an unnecessary upper bound on how much CoW we can have in flight, and (c) we already have a mechanism to track blocks. At mount time, read the refcount records and free anything we find with a refcount of 1 because those were in-progress when the FS went down. v2: Use the deferred operations system to avoid deadlocks and blowing out the transaction reservation. This allows us to unmap a CoW extent from the refcountbt and into a file atomically. Signed-off-by: Darrick J. Wong --- include/xfs_trace.h | 4 + libxfs/xfs_bmap.c | 11 ++ libxfs/xfs_format.h | 3 libxfs/xfs_refcount.c | 317 ++++++++++++++++++++++++++++++++++++++++++++++++- libxfs/xfs_refcount.h | 7 + 5 files changed, 336 insertions(+), 6 deletions(-) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 506f23b..b7bf3d0 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -264,6 +264,10 @@ #define trace_xfs_bmap_deferred(...) ((void) 0) #define trace_xfs_bmap_defer(...) ((void) 0) +#define trace_xfs_refcount_adjust_cow_error(...) ((void) 0) +#define trace_xfs_refcount_cow_increase(...) ((void) 0) +#define trace_xfs_refcount_cow_decrease(...) ((void) 0) + /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) #define trace_xfs_perag_get_tag(a,b,c,d) ((c) = (c)) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index cb30099..a94f855 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -4698,6 +4698,17 @@ xfs_bmapi_write( goto error0; if (bma.blkno == NULLFSBLOCK) break; + + /* + * If this is a CoW allocation, record the data in + * the refcount btree for orphan recovery. + */ + if (whichfork == XFS_COW_FORK) { + error = xfs_refcount_alloc_cow_extent(mp, dfops, + bma.blkno, bma.length); + if (error) + goto error0; + } } /* Deal with the allocated space we found. */ diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index bbb9334..3991eaa 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1374,7 +1374,8 @@ struct xfs_owner_info { #define XFS_RMAP_OWN_INOBT (-6ULL) /* Inode btree blocks */ #define XFS_RMAP_OWN_INODES (-7ULL) /* Inode chunk */ #define XFS_RMAP_OWN_REFC (-8ULL) /* refcount tree */ -#define XFS_RMAP_OWN_MIN (-9ULL) /* guard */ +#define XFS_RMAP_OWN_COW (-9ULL) /* cow allocations */ +#define XFS_RMAP_OWN_MIN (-10ULL) /* guard */ #define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63))) diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index 20b4f68..7d3735f 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -35,13 +35,23 @@ #include "xfs_trans.h" #include "xfs_bit.h" #include "xfs_refcount.h" +#include "xfs_rmap.h" /* Allowable refcount adjustment amounts. */ enum xfs_refc_adjust_op { XFS_REFCOUNT_ADJUST_INCREASE = 1, XFS_REFCOUNT_ADJUST_DECREASE = -1, + XFS_REFCOUNT_ADJUST_COW_ALLOC = 0, + XFS_REFCOUNT_ADJUST_COW_FREE = -1, }; +STATIC int __xfs_refcount_cow_alloc(struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, xfs_extlen_t aglen, + struct xfs_defer_ops *dfops); +STATIC int __xfs_refcount_cow_free(struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, xfs_extlen_t aglen, + struct xfs_defer_ops *dfops); + /* * Look up the first record less than or equal to [bno, len] in the btree * given by cur. @@ -467,6 +477,8 @@ out_error: return error; } +#define XFS_FIND_RCEXT_SHARED 1 +#define XFS_FIND_RCEXT_COW 2 /* * Find the left extent and the one after it (cleft). This function assumes * that we've already split any extent crossing agbno. @@ -477,7 +489,8 @@ xfs_refcount_find_left_extents( struct xfs_refcount_irec *left, struct xfs_refcount_irec *cleft, xfs_agblock_t agbno, - xfs_extlen_t aglen) + xfs_extlen_t aglen, + int flags) { struct xfs_refcount_irec tmp; int error; @@ -497,6 +510,10 @@ xfs_refcount_find_left_extents( if (RCNEXT(tmp) != agbno) return 0; + if ((flags & XFS_FIND_RCEXT_SHARED) && tmp.rc_refcount < 2) + return 0; + if ((flags & XFS_FIND_RCEXT_COW) && tmp.rc_refcount > 1) + return 0; /* We have a left extent; retrieve (or invent) the next right one */ *left = tmp; @@ -553,7 +570,8 @@ xfs_refcount_find_right_extents( struct xfs_refcount_irec *right, struct xfs_refcount_irec *cright, xfs_agblock_t agbno, - xfs_extlen_t aglen) + xfs_extlen_t aglen, + int flags) { struct xfs_refcount_irec tmp; int error; @@ -573,6 +591,10 @@ xfs_refcount_find_right_extents( if (tmp.rc_startblock != agbno + aglen) return 0; + if ((flags & XFS_FIND_RCEXT_SHARED) && tmp.rc_refcount < 2) + return 0; + if ((flags & XFS_FIND_RCEXT_COW) && tmp.rc_refcount > 1) + return 0; /* We have a right extent; retrieve (or invent) the next left one */ *right = tmp; @@ -629,6 +651,7 @@ xfs_refcount_merge_extents( xfs_agblock_t *agbno, xfs_extlen_t *aglen, enum xfs_refc_adjust_op adjust, + int flags, bool *shape_changed) { struct xfs_refcount_irec left = {0}, cleft = {0}; @@ -644,11 +667,11 @@ xfs_refcount_merge_extents( * [right]. */ error = xfs_refcount_find_left_extents(cur, &left, &cleft, *agbno, - *aglen); + *aglen, flags); if (error) return error; error = xfs_refcount_find_right_extents(cur, &right, &cright, *agbno, - *aglen); + *aglen, flags); if (error) return error; @@ -935,7 +958,7 @@ xfs_refcount_adjust( */ orig_aglen = aglen; error = xfs_refcount_merge_extents(cur, &agbno, &aglen, adj, - &shape_changed); + XFS_FIND_RCEXT_SHARED, &shape_changed); if (error) goto out_error; if (shape_changed) @@ -1053,6 +1076,18 @@ xfs_refcount_finish_one( error = xfs_refcount_adjust(rcur, bno, blockcount, adjusted, XFS_REFCOUNT_ADJUST_DECREASE, dfops, NULL); break; + case XFS_REFCOUNT_ALLOC_COW: + *adjusted = 0; + error = __xfs_refcount_cow_alloc(rcur, bno, blockcount, dfops); + if (!error) + *adjusted = blockcount; + break; + case XFS_REFCOUNT_FREE_COW: + *adjusted = 0; + error = __xfs_refcount_cow_free(rcur, bno, blockcount, dfops); + if (!error) + *adjusted = blockcount; + break; default: ASSERT(0); error = -EFSCORRUPTED; @@ -1227,3 +1262,275 @@ out_error: cur->bc_private.a.agno, error, _RET_IP_); return error; } + +/* + * Recovering CoW Blocks After a Crash + * + * Due to the way that the copy on write mechanism works, there's a window of + * opportunity in which we can lose track of allocated blocks during a crash. + * Because CoW uses delayed allocation in the in-core CoW fork, writeback + * causes blocks to be allocated and stored in the CoW fork. The blocks are + * no longer in the free space btree but are not otherwise recorded anywhere + * until the write completes and the blocks are mapped into the file. A crash + * in between allocation and remapping results in the replacement blocks being + * lost. This situation is exacerbated by the CoW extent size hint because + * allocations can hang around for long time. + * + * However, there is a place where we can record these allocations before they + * become mappings -- the reference count btree. The btree does not record + * extents with refcount == 1, so we can record allocations with a refcount of + * 1. Blocks being used for CoW writeout cannot be shared, so there should be + * no conflict with shared block records. These mappings should be created + * when we allocate blocks to the CoW fork and deleted when they're removed + * from the CoW fork. + * + * Minor nit: records for in-progress CoW allocations and records for shared + * extents must never be merged, to preserve the property that (except for CoW + * allocations) there are no refcount btree entries with refcount == 1. The + * only time this could potentially happen is when unsharing a block that's + * adjacent to CoW allocations, so we must be careful to avoid this. + * + * At mount time we recover lost CoW allocations by searching the refcount + * btree for these refcount == 1 mappings. These represent CoW allocations + * that were in progress at the time the filesystem went down, so we can free + * them to get the space back. + * + * This mechanism is superior to creating EFIs for unmapped CoW extents for + * several reasons -- first, EFIs pin the tail of the log and would have to be + * periodically relogged to avoid filling up the log. Second, CoW completions + * will have to file an EFD and create new EFIs for whatever remains in the + * CoW fork; this partially takes care of (1) but extent-size reservations + * will have to periodically relog even if there's no writeout in progress. + * This can happen if the CoW extent size hint is set, which you really want. + * Third, EFIs cannot currently be automatically relogged into newer + * transactions to advance the log tail. Fourth, stuffing the log full of + * EFIs places an upper bound on the number of CoW allocations that can be + * held filesystem-wide at any given time. Recording them in the refcount + * btree doesn't require us to maintain any state in memory and doesn't pin + * the log. + */ +/* + * Adjust the refcounts of CoW allocations. These allocations are "magic" + * in that they're not referenced anywhere else in the filesystem, so we + * stash them in the refcount btree with a refcount of 1 until either file + * remapping (or CoW cancellation) happens. + */ +STATIC int +xfs_refcount_adjust_cow_extents( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + enum xfs_refc_adjust_op adj, + struct xfs_defer_ops *dfops, + struct xfs_owner_info *oinfo) +{ + struct xfs_refcount_irec ext, tmp; + int error; + int found_rec, found_tmp; + + if (aglen == 0) + return 0; + + /* Find any overlapping refcount records */ + error = xfs_refcount_lookup_ge(cur, agbno, &found_rec); + if (error) + goto out_error; + error = xfs_refcount_get_rec(cur, &ext, &found_rec); + if (error) + goto out_error; + if (!found_rec) { + ext.rc_startblock = cur->bc_mp->m_sb.sb_agblocks; + ext.rc_blockcount = 0; + ext.rc_refcount = 0; + } + + switch (adj) { + case XFS_REFCOUNT_ADJUST_COW_ALLOC: + /* Adding a CoW reservation, there should be nothing here. */ + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + ext.rc_startblock >= agbno + aglen, out_error); + + tmp.rc_startblock = agbno; + tmp.rc_blockcount = aglen; + tmp.rc_refcount = 1; + trace_xfs_refcount_modify_extent(cur->bc_mp, + cur->bc_private.a.agno, &tmp); + + error = xfs_refcount_insert(cur, &tmp, + &found_tmp); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + found_tmp == 1, out_error); + break; + case XFS_REFCOUNT_ADJUST_COW_FREE: + /* Removing a CoW reservation, there should be one extent. */ + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + ext.rc_startblock == agbno, out_error); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + ext.rc_blockcount == aglen, out_error); + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + ext.rc_refcount == 1, out_error); + + ext.rc_refcount = 0; + trace_xfs_refcount_modify_extent(cur->bc_mp, + cur->bc_private.a.agno, &ext); + error = xfs_refcount_delete(cur, &found_rec); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(cur->bc_mp, + found_rec == 1, out_error); + break; + default: + ASSERT(0); + } + + return error; +out_error: + trace_xfs_refcount_modify_extent_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Add or remove refcount btree entries for CoW reservations. + */ +STATIC int +xfs_refcount_adjust_cow( + struct xfs_btree_cur *cur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + enum xfs_refc_adjust_op adj, + struct xfs_defer_ops *dfops) +{ + bool shape_changed; + int error; + + /* + * Ensure that no rcextents cross the boundary of the adjustment range. + */ + error = xfs_refcount_split_extent(cur, agbno, &shape_changed); + if (error) + goto out_error; + + error = xfs_refcount_split_extent(cur, agbno + aglen, &shape_changed); + if (error) + goto out_error; + + /* + * Try to merge with the left or right extents of the range. + */ + error = xfs_refcount_merge_extents(cur, &agbno, &aglen, adj, + XFS_FIND_RCEXT_COW, &shape_changed); + if (error) + goto out_error; + + /* Now that we've taken care of the ends, adjust the middle extents */ + error = xfs_refcount_adjust_cow_extents(cur, agbno, aglen, adj, + dfops, NULL); + if (error) + goto out_error; + + return 0; + +out_error: + trace_xfs_refcount_adjust_cow_error(cur->bc_mp, cur->bc_private.a.agno, + error, _RET_IP_); + return error; +} + +/* + * Record a CoW allocation in the refcount btree. + */ +STATIC int +__xfs_refcount_cow_alloc( + struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + struct xfs_defer_ops *dfops) +{ + int error; + + trace_xfs_refcount_cow_increase(rcur->bc_mp, rcur->bc_private.a.agno, + agbno, aglen); + + /* Add refcount btree reservation */ + error = xfs_refcount_adjust_cow(rcur, agbno, aglen, + XFS_REFCOUNT_ADJUST_COW_ALLOC, dfops); + if (error) + return error; + + /* Add rmap entry */ + if (xfs_sb_version_hasrmapbt(&rcur->bc_mp->m_sb)) { + error = xfs_rmap_alloc_extent(rcur->bc_mp, dfops, + rcur->bc_private.a.agno, + agbno, aglen, XFS_RMAP_OWN_COW); + if (error) + return error; + } + + return error; +} + +/* + * Remove a CoW allocation from the refcount btree. + */ +STATIC int +__xfs_refcount_cow_free( + struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, + xfs_extlen_t aglen, + struct xfs_defer_ops *dfops) +{ + int error; + + trace_xfs_refcount_cow_decrease(rcur->bc_mp, rcur->bc_private.a.agno, + agbno, aglen); + + /* Remove refcount btree reservation */ + error = xfs_refcount_adjust_cow(rcur, agbno, aglen, + XFS_REFCOUNT_ADJUST_COW_FREE, dfops); + if (error) + return error; + + /* Remove rmap entry */ + if (xfs_sb_version_hasrmapbt(&rcur->bc_mp->m_sb)) { + error = xfs_rmap_free_extent(rcur->bc_mp, dfops, + rcur->bc_private.a.agno, + agbno, aglen, XFS_RMAP_OWN_COW); + if (error) + return error; + } + + return error; +} + +/* Record a CoW staging extent in the refcount btree. */ +int +xfs_refcount_alloc_cow_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + xfs_fsblock_t fsb, + xfs_extlen_t len) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_ALLOC_COW, + fsb, len); +} + +/* Forget a CoW staging event in the refcount btree. */ +int +xfs_refcount_free_cow_extent( + struct xfs_mount *mp, + struct xfs_defer_ops *dfops, + xfs_fsblock_t fsb, + xfs_extlen_t len) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_FREE_COW, + fsb, len); +} diff --git a/libxfs/xfs_refcount.h b/libxfs/xfs_refcount.h index 0ec9a28..105c246 100644 --- a/libxfs/xfs_refcount.h +++ b/libxfs/xfs_refcount.h @@ -57,4 +57,11 @@ extern int xfs_refcount_find_shared(struct xfs_btree_cur *cur, xfs_agblock_t agbno, xfs_extlen_t aglen, xfs_agblock_t *fbno, xfs_extlen_t *flen, bool find_maximal); +extern int xfs_refcount_alloc_cow_extent(struct xfs_mount *mp, + struct xfs_defer_ops *dfops, xfs_fsblock_t fsb, + xfs_extlen_t len); +extern int xfs_refcount_free_cow_extent(struct xfs_mount *mp, + struct xfs_defer_ops *dfops, xfs_fsblock_t fsb, + xfs_extlen_t len); + #endif /* __XFS_REFCOUNT_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:50:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 922BD8188 for ; Thu, 25 Aug 2016 18:50:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA128AC002 for ; Thu, 25 Aug 2016 16:50:04 -0700 (PDT) X-ASG-Debug-ID: 1472169002-0bf57c55b31c7ea0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zpTx7lymq44raZXV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:03 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNo16j024666 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:50:02 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNo1lG004256 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:50:01 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNo0O5001758; Thu, 25 Aug 2016 23:50:00 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:00 -0700 Subject: [PATCH 32/71] xfs: teach get_bmapx and fiemap about shared extents and the CoW fork From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 32/71] xfs: teach get_bmapx and fiemap about shared extents and the CoW fork To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:49:53 -0700 Message-ID: <147216899385.4420.12429549267505931508.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169003 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1375 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Teach xfs_getbmapx how to report shared extents and CoW fork contents, then modify the FIEMAP formatters to set the appropriate flags. A previous version of this patch only modified the fiemap formatter, which is insufficient. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index f291a53..bb70066 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -105,14 +105,16 @@ struct getbmapx { #define BMV_IF_PREALLOC 0x4 /* rtn status BMV_OF_PREALLOC if req */ #define BMV_IF_DELALLOC 0x8 /* rtn status BMV_OF_DELALLOC if req */ #define BMV_IF_NO_HOLES 0x10 /* Do not return holes */ +#define BMV_IF_COWFORK 0x20 /* return CoW fork rather than data */ #define BMV_IF_VALID \ (BMV_IF_ATTRFORK|BMV_IF_NO_DMAPI_READ|BMV_IF_PREALLOC| \ - BMV_IF_DELALLOC|BMV_IF_NO_HOLES) + BMV_IF_DELALLOC|BMV_IF_NO_HOLES|BMV_IF_COWFORK) /* bmv_oflags values - returned for each non-header segment */ #define BMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ #define BMV_OF_DELALLOC 0x2 /* segment = delayed allocation */ #define BMV_OF_LAST 0x4 /* segment is the last in the file */ +#define BMV_OF_SHARED 0x8 /* segment shared with another file */ /* * Structure for XFS_IOC_FSSETDM. From darrick.wong@oracle.com Thu Aug 25 18:50:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3E9DC81A1 for ; Thu, 25 Aug 2016 18:50:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 11250304043 for ; Thu, 25 Aug 2016 16:50:13 -0700 (PDT) X-ASG-Debug-ID: 1472169011-0bf57b5313209a50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4XdIANjMATwyd3ST (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:11 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNoAtl024761 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:10 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNoAJK009773 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:10 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNo9vK001281; Thu, 25 Aug 2016 23:50:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:08 -0700 Subject: [PATCH 33/71] xfs: support FS_XFLAG_REFLINK on reflink filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 33/71] xfs: support FS_XFLAG_REFLINK on reflink filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:05 -0700 Message-ID: <147216900528.4420.3049697376537013476.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169011 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2436 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add support for reporting the "reflink" inode flag in the XFS-specific getxflags ioctl, and allow the user to clear the flag if file size is zero. v2: Move the reflink flag out of the way of the DAX flag, and add the new cowextsize flag. v3: do not report (or allow changes to) FL_NOCOW_FL, since we don't support a flag to prevent CoWing and the reflink flag is a poor proxy. We'll try to design away the need for the NOCOW flag. Signed-off-by: Darrick J. Wong --- include/darwin.h | 8 ++++++++ include/freebsd.h | 7 +++++++ include/irix.h | 7 +++++++ include/linux.h | 8 ++++++++ 4 files changed, 30 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index 140386a..71a63a1 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -320,4 +320,12 @@ struct fsxattr { #endif +#ifndef FS_XFLAG_REFLINK +#define FS_XFLAG_REFLINK 0x00010000 /* file is reflinked */ +#endif + +#ifndef FS_XFLAG_COWEXTSIZE +#define FS_XFLAG_COWEXTSIZE 0x00020000 /* CoW extent size allocator hint */ +#endif + #endif /* __XFS_DARWIN_H__ */ diff --git a/include/freebsd.h b/include/freebsd.h index 668dcea..e8970a5 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -209,5 +209,12 @@ struct fsxattr { #endif +#ifndef FS_XFLAG_REFLINK +#define FS_XFLAG_REFLINK 0x00010000 /* file is reflinked */ +#endif + +#ifndef FS_XFLAG_COWEXTSIZE +#define FS_XFLAG_COWEXTSIZE 0x00020000 /* CoW extent size allocator hint */ +#endif #endif /* __XFS_FREEBSD_H__ */ diff --git a/include/irix.h b/include/irix.h index 8b9d588..fea7c7c 100644 --- a/include/irix.h +++ b/include/irix.h @@ -454,6 +454,13 @@ struct fsxattr { #endif +#ifndef FS_XFLAG_REFLINK +#define FS_XFLAG_REFLINK 0x00010000 /* file is reflinked */ +#endif + +#ifndef FS_XFLAG_COWEXTSIZE +#define FS_XFLAG_COWEXTSIZE 0x00020000 /* CoW extent size allocator hint */ +#endif /** * Abstraction of mountpoints. diff --git a/include/linux.h b/include/linux.h index 1663930..67337d6 100644 --- a/include/linux.h +++ b/include/linux.h @@ -209,4 +209,12 @@ struct fsxattr { #endif +#ifndef FS_XFLAG_REFLINK +#define FS_XFLAG_REFLINK 0x00010000 /* file is reflinked */ +#endif + +#ifndef FS_XFLAG_COWEXTSIZE +#define FS_XFLAG_COWEXTSIZE 0x00020000 /* CoW extent size allocator hint */ +#endif + #endif /* __XFS_LINUX_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:50:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 080C881A9 for ; Thu, 25 Aug 2016 18:50:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 83A02AC005 for ; Thu, 25 Aug 2016 16:50:20 -0700 (PDT) X-ASG-Debug-ID: 1472169017-0bf8155c741e8680001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 5fW4Qf3ykn7zMtXR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNoGnn031014 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:50:16 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNoGBJ026290 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:16 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNoFtL001357; Thu, 25 Aug 2016 23:50:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:15 -0700 Subject: [PATCH 34/71] xfs: create a separate cow extent size hint for the allocator From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 34/71] xfs: create a separate cow extent size hint for the allocator To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:13 -0700 Message-ID: <147216901370.4420.5128548957073800504.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169018 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8218 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a per-inode extent size allocator hint for copy-on-write. This hint is separate from the existing extent size hint so that CoW can take advantage of the fragmentation-reducing properties of extent size hints without disabling delalloc for regular writes. The extent size hint that's fed to the allocator during a copy on write operation is the greater of the cowextsize and regular extsize hint. During reflink, if we're sharing the entire source file to the entire destination file and the destination file doesn't already have a cowextsize hint, propagate the source file's cowextsize hint to the destination file. Signed-off-by: Darrick J. Wong --- include/darwin.h | 3 ++- include/freebsd.h | 3 ++- include/irix.h | 3 ++- include/linux.h | 3 ++- libxfs/libxfs_priv.h | 1 + libxfs/xfs_bmap.c | 13 +++++++++++-- libxfs/xfs_format.h | 3 ++- libxfs/xfs_fs.h | 3 ++- libxfs/xfs_inode_buf.c | 4 +++- libxfs/xfs_inode_buf.h | 1 + libxfs/xfs_log_format.h | 3 ++- 11 files changed, 30 insertions(+), 10 deletions(-) diff --git a/include/darwin.h b/include/darwin.h index 71a63a1..2b242e0 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -292,7 +292,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ + unsigned char fsx_pad[8]; }; /* diff --git a/include/freebsd.h b/include/freebsd.h index e8970a5..8ee7279 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -181,7 +181,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ + unsigned char fsx_pad[8]; }; /* diff --git a/include/irix.h b/include/irix.h index fea7c7c..d4f9467 100644 --- a/include/irix.h +++ b/include/irix.h @@ -426,7 +426,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ + unsigned char fsx_pad[8]; }; /* diff --git a/include/linux.h b/include/linux.h index 67337d6..bc7af9f 100644 --- a/include/linux.h +++ b/include/linux.h @@ -181,7 +181,8 @@ struct fsxattr { __u32 fsx_extsize; /* extsize field value (get/set)*/ __u32 fsx_nextents; /* nextents field value (get) */ __u32 fsx_projid; /* project identifier (get/set) */ - unsigned char fsx_pad[12]; + __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ + unsigned char fsx_pad[8]; }; /* diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index ba4503d..8e7cb33 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -426,6 +426,7 @@ do { \ #define xfs_rotorstep 1 #define xfs_bmap_rtalloc(a) (-ENOSYS) #define xfs_get_extsz_hint(ip) (0) +#define xfs_get_cowextsz_hint(ip) (0) #define xfs_inode_is_filestream(ip) (0) #define xfs_filestream_lookup_ag(ip) (0) #define xfs_filestream_new_ag(ip,ag) (0) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index a94f855..875a15f 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -3657,7 +3657,13 @@ xfs_bmap_btalloc( else if (mp->m_dalign) stripe_align = mp->m_dalign; - align = ap->userdata ? xfs_get_extsz_hint(ap->ip) : 0; + if (ap->userdata) { + if (ap->flags & XFS_BMAPI_COWFORK) + align = xfs_get_cowextsz_hint(ap->ip); + else + align = xfs_get_extsz_hint(ap->ip); + } else + align = 0; if (unlikely(align)) { error = xfs_bmap_extsize_align(mp, &ap->got, &ap->prev, align, 0, ap->eof, 0, ap->conv, @@ -4171,7 +4177,10 @@ xfs_bmapi_reserve_delalloc( alen = XFS_FILBLKS_MIN(alen, got->br_startoff - aoff); /* Figure out the extent size, adjust alen */ - extsz = xfs_get_extsz_hint(ip); + if (whichfork == XFS_COW_FORK) + extsz = xfs_get_cowextsz_hint(ip); + else + extsz = xfs_get_extsz_hint(ip); if (extsz) { error = xfs_bmap_extsize_align(mp, got, prev, extsz, rt, eof, 1, 0, &aoff, &alen); diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index 3991eaa..e1551f1 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -900,7 +900,8 @@ typedef struct xfs_dinode { __be64 di_changecount; /* number of attribute changes */ __be64 di_lsn; /* flush sequence */ __be64 di_flags2; /* more random flags */ - __u8 di_pad2[16]; /* more padding for future expansion */ + __be32 di_cowextsize; /* basic cow extent size for file */ + __u8 di_pad2[12]; /* more padding for future expansion */ /* fields only written to during inode creation */ xfs_timestamp_t di_crtime; /* time created */ diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index bb70066..df58c1c 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -302,7 +302,8 @@ typedef struct xfs_bstat { #define bs_projid bs_projid_lo /* (previously just bs_projid) */ __u16 bs_forkoff; /* inode fork offset in bytes */ __u16 bs_projid_hi; /* higher part of project id */ - unsigned char bs_pad[10]; /* pad space, unused */ + unsigned char bs_pad[6]; /* pad space, unused */ + __u32 bs_cowextsize; /* cow extent size */ __u32 bs_dmevmask; /* DMIG event mask */ __u16 bs_dmstate; /* DMIG state info */ __u16 bs_aextents; /* attribute number of extents */ diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 572c101..8a804e2 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -265,6 +265,7 @@ xfs_inode_from_disk( to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec); to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec); to->di_flags2 = be64_to_cpu(from->di_flags2); + to->di_cowextsize = be32_to_cpu(from->di_cowextsize); } } @@ -314,7 +315,7 @@ xfs_inode_to_disk( to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); to->di_flags2 = cpu_to_be64(from->di_flags2); - + to->di_cowextsize = cpu_to_be32(from->di_cowextsize); to->di_ino = cpu_to_be64(ip->i_ino); to->di_lsn = cpu_to_be64(lsn); memset(to->di_pad2, 0, sizeof(to->di_pad2)); @@ -366,6 +367,7 @@ xfs_log_dinode_to_disk( to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); to->di_flags2 = cpu_to_be64(from->di_flags2); + to->di_cowextsize = cpu_to_be32(from->di_cowextsize); to->di_ino = cpu_to_be64(from->di_ino); to->di_lsn = cpu_to_be64(from->di_lsn); memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); diff --git a/libxfs/xfs_inode_buf.h b/libxfs/xfs_inode_buf.h index 958c543..6848a0a 100644 --- a/libxfs/xfs_inode_buf.h +++ b/libxfs/xfs_inode_buf.h @@ -47,6 +47,7 @@ struct xfs_icdinode { __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ __uint64_t di_flags2; /* more random flags */ + __uint32_t di_cowextsize; /* basic cow extent size for file */ xfs_ictimestamp_t di_crtime; /* time created */ }; diff --git a/libxfs/xfs_log_format.h b/libxfs/xfs_log_format.h index fffcc0f..d788d01 100644 --- a/libxfs/xfs_log_format.h +++ b/libxfs/xfs_log_format.h @@ -423,7 +423,8 @@ struct xfs_log_dinode { __uint64_t di_changecount; /* number of attribute changes */ xfs_lsn_t di_lsn; /* flush sequence */ __uint64_t di_flags2; /* more random flags */ - __uint8_t di_pad2[16]; /* more padding for future expansion */ + __uint32_t di_cowextsize; /* basic cow extent size for file */ + __uint8_t di_pad2[12]; /* more padding for future expansion */ /* fields only written to during inode creation */ xfs_ictimestamp_t di_crtime; /* time created */ From darrick.wong@oracle.com Thu Aug 25 18:50:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B527B81AD for ; Thu, 25 Aug 2016 18:50:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6B71830404E for ; Thu, 25 Aug 2016 16:50:28 -0700 (PDT) X-ASG-Debug-ID: 1472169025-0bf8155c751e86c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EC74x0nI1hMsqRFb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNoMfS024851 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:50:22 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNoMnY026466 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:22 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNoL7r001405; Thu, 25 Aug 2016 23:50:22 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:21 -0700 Subject: [PATCH 35/71] xfs: preallocate blocks for worst-case btree expansion From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 35/71] xfs: preallocate blocks for worst-case btree expansion To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig , xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:19 -0700 Message-ID: <147216901995.4420.9308541290373322813.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169025 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8358 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines To gracefully handle the situation where a CoW operation turns a single refcount extent into a lot of tiny ones and then run out of space when a tree split has to happen, use the per-AG reserved block pool to pre-allocate all the space we'll ever need for a maximal btree. For a 4K block size, this only costs an overhead of 0.3% of available disk space. When reflink is enabled, we have an unfortunate problem with rmap -- since we can share a block billions of times, this means that the reverse mapping btree can expand basically infinitely. When an AG is so full that there are no free blocks with which to expand the rmapbt, the filesystem will shut down hard. This is rather annoying to the user, so use the AG reservation code to reserve a "reasonable" amount of space for rmap. We'll prevent reflinks and CoW operations if we think we're getting close to exhausting an AG's free space rather than shutting down, but this permanent reservation should be enough for "most" users. Hopefully. v2: Simplify the return value from xfs_perag_pool_free_block to a bool so that we can easily call xfs_trans_binval for both the per-AG pool and the real freeing case. Without this we fail to invalidate the btree buffer and will trip over the write verifier on a shrinking refcount btree. v3: Convert to the new per-AG reservation code. v4: Combine this patch with the one that adds the rmapbt reservation, since the rmapbt reservation is only needed for reflink filesystems. Signed-off-by: Darrick J. Wong [hch@lst.de: ensure that we invalidate the freed btree buffer] Signed-off-by: Christoph Hellwig --- libxfs/xfs_ag_resv.c | 11 ++++++++ libxfs/xfs_refcount_btree.c | 45 ++++++++++++++++++++++++++++++-- libxfs/xfs_refcount_btree.h | 3 ++ libxfs/xfs_rmap_btree.c | 60 +++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_rmap_btree.h | 7 +++++ 5 files changed, 123 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_ag_resv.c b/libxfs/xfs_ag_resv.c index af69235..9d338bd 100644 --- a/libxfs/xfs_ag_resv.c +++ b/libxfs/xfs_ag_resv.c @@ -37,6 +37,7 @@ #include "xfs_trans_space.h" #include "xfs_rmap_btree.h" #include "xfs_btree.h" +#include "xfs_refcount_btree.h" /* * Per-AG Block Reservations @@ -229,6 +230,11 @@ xfs_ag_resv_init( /* Create the metadata reservation. */ ask = used = 0; + err2 = xfs_refcountbt_calc_reserves(pag->pag_mount, pag->pag_agno, + &ask, &used); + if (err2 && !error) + error = err2; + err2 = __xfs_ag_resv_init(pag, XFS_AG_RESV_METADATA, ask, used); if (err2 && !error) error = err2; @@ -240,6 +246,11 @@ init_agfl: /* Create the AGFL metadata reservation */ ask = used = 0; + err2 = xfs_rmapbt_calc_reserves(pag->pag_mount, pag->pag_agno, + &ask, &used); + if (err2 && !error) + error = err2; + err2 = __xfs_ag_resv_init(pag, XFS_AG_RESV_AGFL, ask, used); if (err2 && !error) error = err2; diff --git a/libxfs/xfs_refcount_btree.c b/libxfs/xfs_refcount_btree.c index 568a2f8..d2dbdbd 100644 --- a/libxfs/xfs_refcount_btree.c +++ b/libxfs/xfs_refcount_btree.c @@ -78,6 +78,8 @@ xfs_refcountbt_alloc_block( struct xfs_alloc_arg args; /* block allocation args */ int error; /* error return value */ + XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); + memset(&args, 0, sizeof(args)); args.tp = cur->bc_tp; args.mp = cur->bc_mp; @@ -87,6 +89,7 @@ xfs_refcountbt_alloc_block( args.firstblock = args.fsbno; xfs_rmap_ag_owner(&args.oinfo, XFS_RMAP_OWN_REFC); args.minlen = args.maxlen = args.prod = 1; + args.resv = XFS_AG_RESV_METADATA; error = xfs_alloc_vextent(&args); if (error) @@ -124,16 +127,19 @@ xfs_refcountbt_free_block( struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); struct xfs_owner_info oinfo; + int error; trace_xfs_refcountbt_free_block(cur->bc_mp, cur->bc_private.a.agno, XFS_FSB_TO_AGBNO(cur->bc_mp, fsbno), 1); xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_REFC); be32_add_cpu(&agf->agf_refcount_blocks, -1); xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS); - xfs_bmap_add_free(mp, cur->bc_private.a.dfops, fsbno, 1, - &oinfo); + error = xfs_free_extent(cur->bc_tp, fsbno, 1, &oinfo, + XFS_AG_RESV_METADATA); + if (error) + return error; - return 0; + return error; } STATIC int @@ -403,3 +409,36 @@ xfs_refcountbt_max_size( return xfs_refcountbt_calc_size(mp, mp->m_sb.sb_agblocks); } + +/* + * Figure out how many blocks to reserve and how many are used by this btree. + */ +int +xfs_refcountbt_calc_reserves( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_extlen_t *ask, + xfs_extlen_t *used) +{ + struct xfs_buf *agbp; + struct xfs_agf *agf; + xfs_extlen_t tree_len; + int error; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + *ask += xfs_refcountbt_max_size(mp); + + error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + if (error) + return error; + + agf = XFS_BUF_TO_AGF(agbp); + tree_len = be32_to_cpu(agf->agf_refcount_blocks); + xfs_buf_relse(agbp); + + *used += tree_len; + + return error; +} diff --git a/libxfs/xfs_refcount_btree.h b/libxfs/xfs_refcount_btree.h index 780b02f..3be7768 100644 --- a/libxfs/xfs_refcount_btree.h +++ b/libxfs/xfs_refcount_btree.h @@ -68,4 +68,7 @@ extern xfs_extlen_t xfs_refcountbt_calc_size(struct xfs_mount *mp, unsigned long long len); extern xfs_extlen_t xfs_refcountbt_max_size(struct xfs_mount *mp); +extern int xfs_refcountbt_calc_reserves(struct xfs_mount *mp, + xfs_agnumber_t agno, xfs_extlen_t *ask, xfs_extlen_t *used); + #endif /* __XFS_REFCOUNT_BTREE_H__ */ diff --git a/libxfs/xfs_rmap_btree.c b/libxfs/xfs_rmap_btree.c index 29a4dd6..02ceace 100644 --- a/libxfs/xfs_rmap_btree.c +++ b/libxfs/xfs_rmap_btree.c @@ -33,6 +33,7 @@ #include "xfs_rmap_btree.h" #include "xfs_trace.h" #include "xfs_cksum.h" +#include "xfs_ag_resv.h" /* * Reverse map btree. @@ -516,3 +517,62 @@ xfs_rmapbt_compute_maxlevels( mp->m_rmap_maxlevels = xfs_btree_compute_maxlevels(mp, mp->m_rmap_mnr, mp->m_sb.sb_agblocks); } + +/* Calculate the refcount btree size for some records. */ +xfs_extlen_t +xfs_rmapbt_calc_size( + struct xfs_mount *mp, + unsigned long long len) +{ + return xfs_btree_calc_size(mp, mp->m_rmap_mnr, len); +} + +/* + * Calculate the maximum refcount btree size. + */ +xfs_extlen_t +xfs_rmapbt_max_size( + struct xfs_mount *mp) +{ + /* Bail out if we're uninitialized, which can happen in mkfs. */ + if (mp->m_rmap_mxr[0] == 0) + return 0; + + return xfs_rmapbt_calc_size(mp, mp->m_sb.sb_agblocks); +} + +/* + * Figure out how many blocks to reserve and how many are used by this btree. + */ +int +xfs_rmapbt_calc_reserves( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_extlen_t *ask, + xfs_extlen_t *used) +{ + struct xfs_buf *agbp; + struct xfs_agf *agf; + xfs_extlen_t pool_len; + xfs_extlen_t tree_len; + int error; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return 0; + + /* Reserve 1% of the AG or enough for 1 block per record. */ + pool_len = max(mp->m_sb.sb_agblocks / 100, xfs_rmapbt_max_size(mp)); + *ask += pool_len; + + error = xfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + if (error) + return error; + + agf = XFS_BUF_TO_AGF(agbp); + tree_len = be32_to_cpu(agf->agf_rmap_blocks); + xfs_buf_relse(agbp); + + *used += tree_len; + + return error; +} diff --git a/libxfs/xfs_rmap_btree.h b/libxfs/xfs_rmap_btree.h index 5ff9cfa..f3137a3 100644 --- a/libxfs/xfs_rmap_btree.h +++ b/libxfs/xfs_rmap_btree.h @@ -58,4 +58,11 @@ struct xfs_btree_cur *xfs_rmapbt_init_cursor(struct xfs_mount *mp, int xfs_rmapbt_maxrecs(struct xfs_mount *mp, int blocklen, int leaf); extern void xfs_rmapbt_compute_maxlevels(struct xfs_mount *mp); +extern xfs_extlen_t xfs_rmapbt_calc_size(struct xfs_mount *mp, + unsigned long long len); +extern xfs_extlen_t xfs_rmapbt_max_size(struct xfs_mount *mp); + +extern int xfs_rmapbt_calc_reserves(struct xfs_mount *mp, + xfs_agnumber_t agno, xfs_extlen_t *ask, xfs_extlen_t *used); + #endif /* __XFS_RMAP_BTREE_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:50:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67CC681BB for ; Thu, 25 Aug 2016 18:50:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5655AC001 for ; Thu, 25 Aug 2016 16:50:35 -0700 (PDT) X-ASG-Debug-ID: 1472169033-0bf57c55b21c7ec0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id ki1OwKT8Unoj9IzV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNoVse031096 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:31 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNoUHp010212 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:31 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNoRmg019607; Thu, 25 Aug 2016 23:50:30 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:27 -0700 Subject: [PATCH 36/71] xfs: try other AGs to allocate a BMBT block From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 36/71] xfs: try other AGs to allocate a BMBT block To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:26 -0700 Message-ID: <147216902624.4420.1687447903576954909.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169033 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4595 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Prior to the introduction of reflink, allocating a block and mapping it into a file was performed in a single transaction with a single block reservation, and the allocator was supposed to find enough blocks to allocate the extent and any BMBT blocks that might be necessary (unless we're low on space). However, due to the way copy on write works, allocation and mapping have been split into two transactions, which means that we must be able to handle the case where we allocate an extent for CoW but that AG runs out of free space before the blocks can be mapped into a file, and the mapping requires a new BMBT block. When this happens, look in one of the other AGs for a BMBT block instead of taking the FS down. The same applies to the functions that convert a data fork to extents and later btree format. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.c | 30 ++++++++++++++++++++++++++++++ libxfs/xfs_bmap_btree.c | 17 +++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 875a15f..4721cff 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -745,6 +745,7 @@ xfs_bmap_extents_to_btree( args.type = XFS_ALLOCTYPE_START_BNO; args.fsbno = XFS_INO_TO_FSB(mp, ip->i_ino); } else if (dfops->dop_low) { +try_another_ag: args.type = XFS_ALLOCTYPE_START_BNO; args.fsbno = *firstblock; } else { @@ -759,6 +760,21 @@ xfs_bmap_extents_to_btree( xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } + + /* + * During a CoW operation, the allocation and bmbt updates occur in + * different transactions. The mapping code tries to put new bmbt + * blocks near extents being mapped, but the only way to guarantee this + * is if the alloc and the mapping happen in a single transaction that + * has a block reservation. That isn't the case here, so if we run out + * of space we'll try again with another AG. + */ + if (xfs_sb_version_hasreflink(&cur->bc_mp->m_sb) && + args.fsbno == NULLFSBLOCK && + args.type == XFS_ALLOCTYPE_NEAR_BNO) { + dfops->dop_low = true; + goto try_another_ag; + } /* * Allocation can't fail, the space was reserved. */ @@ -894,6 +910,7 @@ xfs_bmap_local_to_extents( * file currently fits in an inode. */ if (*firstblock == NULLFSBLOCK) { +try_another_ag: args.fsbno = XFS_INO_TO_FSB(args.mp, ip->i_ino); args.type = XFS_ALLOCTYPE_START_BNO; } else { @@ -906,6 +923,19 @@ xfs_bmap_local_to_extents( if (error) goto done; + /* + * During a CoW operation, the allocation and bmbt updates occur in + * different transactions. The mapping code tries to put new bmbt + * blocks near extents being mapped, but the only way to guarantee this + * is if the alloc and the mapping happen in a single transaction that + * has a block reservation. That isn't the case here, so if we run out + * of space we'll try again with another AG. + */ + if (xfs_sb_version_hasreflink(&ip->i_mount->m_sb) && + args.fsbno == NULLFSBLOCK && + args.type == XFS_ALLOCTYPE_NEAR_BNO) { + goto try_another_ag; + } /* Can't fail, the space was reserved. */ ASSERT(args.fsbno != NULLFSBLOCK); ASSERT(args.len == 1); diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 3d1a02e..601385d 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -450,6 +450,7 @@ xfs_bmbt_alloc_block( if (args.fsbno == NULLFSBLOCK) { args.fsbno = be64_to_cpu(start->l); +try_another_ag: args.type = XFS_ALLOCTYPE_START_BNO; /* * Make sure there is sufficient room left in the AG to @@ -479,6 +480,22 @@ xfs_bmbt_alloc_block( if (error) goto error0; + /* + * During a CoW operation, the allocation and bmbt updates occur in + * different transactions. The mapping code tries to put new bmbt + * blocks near extents being mapped, but the only way to guarantee this + * is if the alloc and the mapping happen in a single transaction that + * has a block reservation. That isn't the case here, so if we run out + * of space we'll try again with another AG. + */ + if (xfs_sb_version_hasreflink(&cur->bc_mp->m_sb) && + args.fsbno == NULLFSBLOCK && + args.type == XFS_ALLOCTYPE_NEAR_BNO) { + cur->bc_private.b.dfops->dop_low = true; + args.fsbno = cur->bc_private.b.firstblock; + goto try_another_ag; + } + if (args.fsbno == NULLFSBLOCK && args.minleft) { /* * Could not find an AG with enough free space to satisfy From darrick.wong@oracle.com Thu Aug 25 18:50:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BCD8C81C3 for ; Thu, 25 Aug 2016 18:50:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 82BE1304051 for ; Thu, 25 Aug 2016 16:50:38 -0700 (PDT) X-ASG-Debug-ID: 1472169036-0bf57c55b41c7ed0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id sDAKIW7PhtNGbUwr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNoYlh025026 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:50:35 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNoYh3026725 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:34 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNoYW7001475; Thu, 25 Aug 2016 23:50:34 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:33 -0700 Subject: [PATCH 37/71] xfs: increase log reservations for reflink From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 37/71] xfs: increase log reservations for reflink To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:32 -0700 Message-ID: <147216903248.4420.16968622120010292321.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169036 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2621 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Increase the log reservations to handle the increased rolling that happens at the end of copy-on-write operations. Signed-off-by: Darrick J. Wong --- libxfs/xfs_trans_resv.c | 16 +++++++++++++--- libxfs/xfs_trans_resv.h | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 5b6bbcd..5152a5b 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -811,11 +811,18 @@ xfs_trans_resv_calc( * require a permanent reservation on space. */ resp->tr_write.tr_logres = xfs_calc_write_reservation(mp); - resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT; + if (xfs_sb_version_hasreflink(&mp->m_sb)) + resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT_REFLINK; + else + resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT; resp->tr_write.tr_logflags |= XFS_TRANS_PERM_LOG_RES; resp->tr_itruncate.tr_logres = xfs_calc_itruncate_reservation(mp); - resp->tr_itruncate.tr_logcount = XFS_ITRUNCATE_LOG_COUNT; + if (xfs_sb_version_hasreflink(&mp->m_sb)) + resp->tr_itruncate.tr_logcount = + XFS_ITRUNCATE_LOG_COUNT_REFLINK; + else + resp->tr_itruncate.tr_logcount = XFS_ITRUNCATE_LOG_COUNT; resp->tr_itruncate.tr_logflags |= XFS_TRANS_PERM_LOG_RES; resp->tr_rename.tr_logres = xfs_calc_rename_reservation(mp); @@ -872,7 +879,10 @@ xfs_trans_resv_calc( resp->tr_growrtalloc.tr_logflags |= XFS_TRANS_PERM_LOG_RES; resp->tr_qm_dqalloc.tr_logres = xfs_calc_qm_dqalloc_reservation(mp); - resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT; + if (xfs_sb_version_hasreflink(&mp->m_sb)) + resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT_REFLINK; + else + resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT; resp->tr_qm_dqalloc.tr_logflags |= XFS_TRANS_PERM_LOG_RES; /* diff --git a/libxfs/xfs_trans_resv.h b/libxfs/xfs_trans_resv.h index 36a1511..b7e5357 100644 --- a/libxfs/xfs_trans_resv.h +++ b/libxfs/xfs_trans_resv.h @@ -87,6 +87,7 @@ struct xfs_trans_resv { #define XFS_DEFAULT_LOG_COUNT 1 #define XFS_DEFAULT_PERM_LOG_COUNT 2 #define XFS_ITRUNCATE_LOG_COUNT 2 +#define XFS_ITRUNCATE_LOG_COUNT_REFLINK 8 #define XFS_INACTIVE_LOG_COUNT 2 #define XFS_CREATE_LOG_COUNT 2 #define XFS_CREATE_TMPFILE_LOG_COUNT 2 @@ -96,6 +97,7 @@ struct xfs_trans_resv { #define XFS_LINK_LOG_COUNT 2 #define XFS_RENAME_LOG_COUNT 2 #define XFS_WRITE_LOG_COUNT 2 +#define XFS_WRITE_LOG_COUNT_REFLINK 8 #define XFS_ADDAFORK_LOG_COUNT 2 #define XFS_ATTRINVAL_LOG_COUNT 1 #define XFS_ATTRSET_LOG_COUNT 3 From darrick.wong@oracle.com Thu Aug 25 18:50:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 27E2681C5 for ; Thu, 25 Aug 2016 18:50:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EE4878F8037 for ; Thu, 25 Aug 2016 16:50:43 -0700 (PDT) X-ASG-Debug-ID: 1472169042-0bf57b5311209a60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id C5bJPZhDq8ipc0Ay (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNoegg025070 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:41 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNoe09027294 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:40 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNoegQ023078; Thu, 25 Aug 2016 23:50:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:40 -0700 Subject: [PATCH 38/71] xfs: add shared rmap map/unmap/convert log item types From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 38/71] xfs: add shared rmap map/unmap/convert log item types To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:38 -0700 Message-ID: <147216903865.4420.10111406668899344566.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169042 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 853 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Wire up some rmap log redo item type codes to map, unmap, or convert shared data block extents. Signed-off-by: Darrick J. Wong --- libxfs/xfs_log_format.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libxfs/xfs_log_format.h b/libxfs/xfs_log_format.h index d788d01..75f9890 100644 --- a/libxfs/xfs_log_format.h +++ b/libxfs/xfs_log_format.h @@ -635,8 +635,11 @@ struct xfs_map_extent { /* rmap me_flags: upper bits are flags, lower byte is type code */ #define XFS_RMAP_EXTENT_MAP 1 +#define XFS_RMAP_EXTENT_MAP_SHARED 2 #define XFS_RMAP_EXTENT_UNMAP 3 +#define XFS_RMAP_EXTENT_UNMAP_SHARED 4 #define XFS_RMAP_EXTENT_CONVERT 5 +#define XFS_RMAP_EXTENT_CONVERT_SHARED 6 #define XFS_RMAP_EXTENT_ALLOC 7 #define XFS_RMAP_EXTENT_FREE 8 #define XFS_RMAP_EXTENT_TYPE_MASK 0xFF From darrick.wong@oracle.com Thu Aug 25 18:50:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5EEB681D2 for ; Thu, 25 Aug 2016 18:50:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D3D58AC003 for ; Thu, 25 Aug 2016 16:50:52 -0700 (PDT) X-ASG-Debug-ID: 1472169049-0bf8155c741e8770001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id oC0TxiwoRnivQSdx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNolNZ025151 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:50:48 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNolgb005655 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:50:47 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNokxe002113; Thu, 25 Aug 2016 23:50:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:46 -0700 Subject: [PATCH 39/71] xfs: use interval query for rmap map and unmap operations on shared files From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 39/71] xfs: use interval query for rmap map and unmap operations on shared files To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:44 -0700 Message-ID: <147216904481.4420.218627288366588607.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169049 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 20267 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When it's possible for reverse mappings to overlap (data fork extents of files on reflink filesystems), use the interval query function to find the left neighbor of an extent we're trying to add; and be careful to use the lookup functions to update the neighbors and/or add new extents. v2: xfs_rmap_find_left_neighbor() needs to calculate the high key of a query range correctly. We can also add a few shortcuts -- there are no left neighbors of a query at offset zero. Signed-off-by: Darrick J. Wong --- include/xfs_trace.h | 14 + libxfs/xfs_rmap.c | 514 +++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_rmap.h | 7 + 3 files changed, 532 insertions(+), 3 deletions(-) diff --git a/include/xfs_trace.h b/include/xfs_trace.h index b7bf3d0..24b99dd 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -209,7 +209,6 @@ #define trace_xfs_rmap_defer(...) ((void) 0) #define trace_xfs_rmap_deferred(...) ((void) 0) #define trace_xfs_rmap_find_right_neighbor_result(...) ((void) 0) -#define trace_xfs_rmap_find_left_neighbor_result(...) ((void) 0) #define trace_xfs_rmap_lookup_le_range_result(...) ((void) 0) #define trace_xfs_rmapbt_free_block(...) ((void) 0) @@ -268,6 +267,19 @@ #define trace_xfs_refcount_cow_increase(...) ((void) 0) #define trace_xfs_refcount_cow_decrease(...) ((void) 0) +#define trace_xfs_rmap_find_left_neighbor_candidate(...) ((void) 0) +#define trace_xfs_rmap_find_left_neighbor_query(...) ((void) 0) +#define trace_xfs_rmap_find_left_neighbor_result(...) ((void) 0) +#define trace_xfs_rmap_lookup_le_range_candidate(...) ((void) 0) +#define trace_xfs_rmap_lookup_le_range(...) ((void) 0) +#define trace_xfs_rmap_unmap(...) ((void) 0) +#define trace_xfs_rmap_unmap_done(...) ((void) 0) +#define trace_xfs_rmap_unmap_error(...) ((void) 0) +#define trace_xfs_rmap_map(...) ((void) 0) +#define trace_xfs_rmap_map_done(...) ((void) 0) +#define trace_xfs_rmap_map_error(...) ((void) 0) +#define trace_xfs_rmap_delete_error(...) ((void) 0) + /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) #define trace_xfs_perag_get_tag(a,b,c,d) ((c) = (c)) diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index 82c2597..17dc7d6 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -146,6 +146,37 @@ done: return error; } +STATIC int +xfs_rmap_delete( + struct xfs_btree_cur *rcur, + xfs_agblock_t agbno, + xfs_extlen_t len, + uint64_t owner, + uint64_t offset, + unsigned int flags) +{ + int i; + int error; + + trace_xfs_rmap_delete(rcur->bc_mp, rcur->bc_private.a.agno, agbno, + len, owner, offset, flags); + + error = xfs_rmap_lookup_eq(rcur, agbno, len, owner, offset, flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(rcur->bc_mp, i == 1, done); + + error = xfs_btree_delete(rcur, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(rcur->bc_mp, i == 1, done); +done: + if (error) + trace_xfs_rmap_delete_error(rcur->bc_mp, + rcur->bc_private.a.agno, error, _RET_IP_); + return error; +} + static int xfs_rmap_btrec_to_irec( union xfs_btree_rec *rec, @@ -178,6 +209,160 @@ xfs_rmap_get_rec( return xfs_rmap_btrec_to_irec(rec, irec); } +struct xfs_find_left_neighbor_info { + struct xfs_rmap_irec high; + struct xfs_rmap_irec *irec; + int *stat; +}; + +/* For each rmap given, figure out if it matches the key we want. */ +STATIC int +xfs_rmap_find_left_neighbor_helper( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *rec, + void *priv) +{ + struct xfs_find_left_neighbor_info *info = priv; + + trace_xfs_rmap_find_left_neighbor_candidate(cur->bc_mp, + cur->bc_private.a.agno, rec->rm_startblock, + rec->rm_blockcount, rec->rm_owner, rec->rm_offset, + rec->rm_flags); + + if (rec->rm_owner != info->high.rm_owner) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + if (!XFS_RMAP_NON_INODE_OWNER(rec->rm_owner) && + !(rec->rm_flags & XFS_RMAP_BMBT_BLOCK) && + rec->rm_offset + rec->rm_blockcount - 1 != info->high.rm_offset) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + + *info->irec = *rec; + *info->stat = 1; + return XFS_BTREE_QUERY_RANGE_ABORT; +} + +/* + * Find the record to the left of the given extent, being careful only to + * return a match with the same owner and adjacent physical and logical + * block ranges. + */ +int +xfs_rmap_find_left_neighbor( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + uint64_t owner, + uint64_t offset, + unsigned int flags, + struct xfs_rmap_irec *irec, + int *stat) +{ + struct xfs_find_left_neighbor_info info; + int error; + + *stat = 0; + if (bno == 0) + return 0; + info.high.rm_startblock = bno - 1; + info.high.rm_owner = owner; + if (!XFS_RMAP_NON_INODE_OWNER(owner) && + !(flags & XFS_RMAP_BMBT_BLOCK)) { + if (offset == 0) + return 0; + info.high.rm_offset = offset - 1; + } else + info.high.rm_offset = 0; + info.high.rm_flags = flags; + info.high.rm_blockcount = 0; + info.irec = irec; + info.stat = stat; + + trace_xfs_rmap_find_left_neighbor_query(cur->bc_mp, + cur->bc_private.a.agno, bno, 0, owner, offset, flags); + + error = xfs_rmap_query_range(cur, &info.high, &info.high, + xfs_rmap_find_left_neighbor_helper, &info); + if (error == XFS_BTREE_QUERY_RANGE_ABORT) + error = 0; + if (*stat) + trace_xfs_rmap_find_left_neighbor_result(cur->bc_mp, + cur->bc_private.a.agno, irec->rm_startblock, + irec->rm_blockcount, irec->rm_owner, + irec->rm_offset, irec->rm_flags); + return error; +} + +/* For each rmap given, figure out if it matches the key we want. */ +STATIC int +xfs_rmap_lookup_le_range_helper( + struct xfs_btree_cur *cur, + struct xfs_rmap_irec *rec, + void *priv) +{ + struct xfs_find_left_neighbor_info *info = priv; + + trace_xfs_rmap_lookup_le_range_candidate(cur->bc_mp, + cur->bc_private.a.agno, rec->rm_startblock, + rec->rm_blockcount, rec->rm_owner, rec->rm_offset, + rec->rm_flags); + + if (rec->rm_owner != info->high.rm_owner) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + if (!XFS_RMAP_NON_INODE_OWNER(rec->rm_owner) && + !(rec->rm_flags & XFS_RMAP_BMBT_BLOCK) && + (rec->rm_offset > info->high.rm_offset || + rec->rm_offset + rec->rm_blockcount <= info->high.rm_offset)) + return XFS_BTREE_QUERY_RANGE_CONTINUE; + + *info->irec = *rec; + *info->stat = 1; + return XFS_BTREE_QUERY_RANGE_ABORT; +} + +/* + * Find the record to the left of the given extent, being careful only to + * return a match with the same owner and overlapping physical and logical + * block ranges. This is the overlapping-interval version of + * xfs_rmap_lookup_le. + */ +int +xfs_rmap_lookup_le_range( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + uint64_t owner, + uint64_t offset, + unsigned int flags, + struct xfs_rmap_irec *irec, + int *stat) +{ + struct xfs_find_left_neighbor_info info; + int error; + + info.high.rm_startblock = bno; + info.high.rm_owner = owner; + if (!XFS_RMAP_NON_INODE_OWNER(owner) && !(flags & XFS_RMAP_BMBT_BLOCK)) + info.high.rm_offset = offset; + else + info.high.rm_offset = 0; + info.high.rm_flags = flags; + info.high.rm_blockcount = 0; + *stat = 0; + info.irec = irec; + info.stat = stat; + + trace_xfs_rmap_lookup_le_range(cur->bc_mp, + cur->bc_private.a.agno, bno, 0, owner, offset, flags); + error = xfs_rmap_query_range(cur, &info.high, &info.high, + xfs_rmap_lookup_le_range_helper, &info); + if (error == XFS_BTREE_QUERY_RANGE_ABORT) + error = 0; + if (*stat) + trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, + cur->bc_private.a.agno, irec->rm_startblock, + irec->rm_blockcount, irec->rm_owner, + irec->rm_offset, irec->rm_flags); + return error; +} + /* * Find the extent in the rmap btree and remove it. * @@ -1096,6 +1281,321 @@ done: #undef RIGHT #undef PREV +/* + * Find an extent in the rmap btree and unmap it. For rmap extent types that + * can overlap (data fork rmaps on reflink filesystems) we must be careful + * that the prev/next records in the btree might belong to another owner. + * Therefore we must use delete+insert to alter any of the key fields. + * + * For every other situation there can only be one owner for a given extent, + * so we can call the regular _free function. + */ +STATIC int +xfs_rmap_unmap_shared( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool unwritten, + struct xfs_owner_info *oinfo) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_rmap_irec ltrec; + uint64_t ltoff; + int error = 0; + int i; + uint64_t owner; + uint64_t offset; + unsigned int flags; + + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); + if (unwritten) + flags |= XFS_RMAP_UNWRITTEN; + trace_xfs_rmap_unmap(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); + + /* + * We should always have a left record because there's a static record + * for the AG headers at rm_startblock == 0 created by mkfs/growfs that + * will not ever be removed from the tree. + */ + error = xfs_rmap_lookup_le_range(cur, bno, owner, offset, flags, + <rec, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + ltoff = ltrec.rm_offset; + + /* Make sure the extent we found covers the entire freeing range. */ + XFS_WANT_CORRUPTED_GOTO(mp, ltrec.rm_startblock <= bno && + ltrec.rm_startblock + ltrec.rm_blockcount >= + bno + len, out_error); + + /* Make sure the owner matches what we expect to find in the tree. */ + XFS_WANT_CORRUPTED_GOTO(mp, owner == ltrec.rm_owner, out_error); + + /* Make sure the unwritten flag matches. */ + XFS_WANT_CORRUPTED_GOTO(mp, (flags & XFS_RMAP_UNWRITTEN) == + (ltrec.rm_flags & XFS_RMAP_UNWRITTEN), out_error); + + /* Check the offset. */ + XFS_WANT_CORRUPTED_GOTO(mp, ltrec.rm_offset <= offset, out_error); + XFS_WANT_CORRUPTED_GOTO(mp, offset <= ltoff + ltrec.rm_blockcount, + out_error); + + if (ltrec.rm_startblock == bno && ltrec.rm_blockcount == len) { + /* Exact match, simply remove the record from rmap tree. */ + error = xfs_rmap_delete(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags); + if (error) + goto out_error; + } else if (ltrec.rm_startblock == bno) { + /* + * Overlap left hand side of extent: move the start, trim the + * length and update the current record. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrrrrrrr| + * bno len + */ + + /* Delete prev rmap. */ + error = xfs_rmap_delete(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags); + if (error) + goto out_error; + + /* Add an rmap at the new offset. */ + ltrec.rm_startblock += len; + ltrec.rm_blockcount -= len; + ltrec.rm_offset += len; + error = xfs_rmap_insert(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags); + if (error) + goto out_error; + } else if (ltrec.rm_startblock + ltrec.rm_blockcount == bno + len) { + /* + * Overlap right hand side of extent: trim the length and + * update the current record. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrrrrrrr| + * bno len + */ + error = xfs_rmap_lookup_eq(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + ltrec.rm_blockcount -= len; + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + } else { + /* + * Overlap middle of extent: trim the length of the existing + * record to the length of the new left-extent size, increment + * the insertion position so we can insert a new record + * containing the remaining right-extent space. + * + * ltbno ltlen + * Orig: |oooooooooooooooooooo| + * Freeing: |fffffffff| + * Result: |rrrrr| |rrrr| + * bno len + */ + xfs_extlen_t orig_len = ltrec.rm_blockcount; + + /* Shrink the left side of the rmap */ + error = xfs_rmap_lookup_eq(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + ltrec.rm_blockcount = bno - ltrec.rm_startblock; + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + + /* Add an rmap at the new offset */ + error = xfs_rmap_insert(cur, bno + len, + orig_len - len - ltrec.rm_blockcount, + ltrec.rm_owner, offset + len, + ltrec.rm_flags); + if (error) + goto out_error; + } + + trace_xfs_rmap_unmap_done(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); +out_error: + if (error) + trace_xfs_rmap_unmap_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + +/* + * Find an extent in the rmap btree and map it. For rmap extent types that + * can overlap (data fork rmaps on reflink filesystems) we must be careful + * that the prev/next records in the btree might belong to another owner. + * Therefore we must use delete+insert to alter any of the key fields. + * + * For every other situation there can only be one owner for a given extent, + * so we can call the regular _alloc function. + */ +STATIC int +xfs_rmap_map_shared( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool unwritten, + struct xfs_owner_info *oinfo) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_rmap_irec ltrec; + struct xfs_rmap_irec gtrec; + int have_gt; + int have_lt; + int error = 0; + int i; + uint64_t owner; + uint64_t offset; + unsigned int flags = 0; + + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); + if (unwritten) + flags |= XFS_RMAP_UNWRITTEN; + trace_xfs_rmap_map(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); + + /* Is there a left record that abuts our range? */ + error = xfs_rmap_find_left_neighbor(cur, bno, owner, offset, flags, + <rec, &have_lt); + if (error) + goto out_error; + if (have_lt && + !xfs_rmap_is_mergeable(<rec, owner, flags)) + have_lt = 0; + + /* Is there a right record that abuts our range? */ + error = xfs_rmap_lookup_eq(cur, bno + len, len, owner, offset + len, + flags, &have_gt); + if (error) + goto out_error; + if (have_gt) { + error = xfs_rmap_get_rec(cur, >rec, &have_gt); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, have_gt == 1, out_error); + trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, + cur->bc_private.a.agno, gtrec.rm_startblock, + gtrec.rm_blockcount, gtrec.rm_owner, + gtrec.rm_offset, gtrec.rm_flags); + + if (!xfs_rmap_is_mergeable(>rec, owner, flags)) + have_gt = 0; + } + + if (have_lt && + ltrec.rm_startblock + ltrec.rm_blockcount == bno && + ltrec.rm_offset + ltrec.rm_blockcount == offset) { + /* + * Left edge contiguous, merge into left record. + * + * ltbno ltlen + * orig: |ooooooooo| + * adding: |aaaaaaaaa| + * result: |rrrrrrrrrrrrrrrrrrr| + * bno len + */ + ltrec.rm_blockcount += len; + if (have_gt && + bno + len == gtrec.rm_startblock && + offset + len == gtrec.rm_offset) { + /* + * Right edge also contiguous, delete right record + * and merge into left record. + * + * ltbno ltlen gtbno gtlen + * orig: |ooooooooo| |ooooooooo| + * adding: |aaaaaaaaa| + * result: |rrrrrrrrrrrrrrrrrrrrrrrrrrrrr| + */ + ltrec.rm_blockcount += gtrec.rm_blockcount; + error = xfs_rmap_delete(cur, gtrec.rm_startblock, + gtrec.rm_blockcount, gtrec.rm_owner, + gtrec.rm_offset, gtrec.rm_flags); + if (error) + goto out_error; + } + + /* Point the cursor back to the left record and update. */ + error = xfs_rmap_lookup_eq(cur, ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags, &i); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); + + error = xfs_rmap_update(cur, <rec); + if (error) + goto out_error; + } else if (have_gt && + bno + len == gtrec.rm_startblock && + offset + len == gtrec.rm_offset) { + /* + * Right edge contiguous, merge into right record. + * + * gtbno gtlen + * Orig: |ooooooooo| + * adding: |aaaaaaaaa| + * Result: |rrrrrrrrrrrrrrrrrrr| + * bno len + */ + /* Delete the old record. */ + error = xfs_rmap_delete(cur, gtrec.rm_startblock, + gtrec.rm_blockcount, gtrec.rm_owner, + gtrec.rm_offset, gtrec.rm_flags); + if (error) + goto out_error; + + /* Move the start and re-add it. */ + gtrec.rm_startblock = bno; + gtrec.rm_blockcount += len; + gtrec.rm_offset = offset; + error = xfs_rmap_insert(cur, gtrec.rm_startblock, + gtrec.rm_blockcount, gtrec.rm_owner, + gtrec.rm_offset, gtrec.rm_flags); + if (error) + goto out_error; + } else { + /* + * No contiguous edge with identical owner, insert + * new record at current cursor position. + */ + error = xfs_rmap_insert(cur, bno, len, owner, offset, flags); + if (error) + goto out_error; + } + + trace_xfs_rmap_map_done(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); +out_error: + if (error) + trace_xfs_rmap_map_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + struct xfs_rmap_query_range_info { xfs_rmap_query_range_fn fn; void *priv; @@ -1235,11 +1735,19 @@ xfs_rmap_finish_one( case XFS_RMAP_MAP: error = xfs_rmap_map(rcur, bno, blockcount, unwritten, &oinfo); break; + case XFS_RMAP_MAP_SHARED: + error = xfs_rmap_map_shared(rcur, bno, blockcount, unwritten, + &oinfo); + break; case XFS_RMAP_FREE: case XFS_RMAP_UNMAP: error = xfs_rmap_unmap(rcur, bno, blockcount, unwritten, &oinfo); break; + case XFS_RMAP_UNMAP_SHARED: + error = xfs_rmap_unmap_shared(rcur, bno, blockcount, unwritten, + &oinfo); + break; case XFS_RMAP_CONVERT: error = xfs_rmap_convert(rcur, bno, blockcount, !unwritten, &oinfo); @@ -1313,7 +1821,8 @@ xfs_rmap_map_extent( if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; - return __xfs_rmap_add(mp, dfops, XFS_RMAP_MAP, ip->i_ino, + return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? + XFS_RMAP_MAP_SHARED : XFS_RMAP_MAP, ip->i_ino, whichfork, PREV); } @@ -1329,7 +1838,8 @@ xfs_rmap_unmap_extent( if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; - return __xfs_rmap_add(mp, dfops, XFS_RMAP_UNMAP, ip->i_ino, + return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? + XFS_RMAP_UNMAP_SHARED : XFS_RMAP_UNMAP, ip->i_ino, whichfork, PREV); } diff --git a/libxfs/xfs_rmap.h b/libxfs/xfs_rmap.h index 71cf99a..7899305 100644 --- a/libxfs/xfs_rmap.h +++ b/libxfs/xfs_rmap.h @@ -206,4 +206,11 @@ int xfs_rmap_finish_one(struct xfs_trans *tp, enum xfs_rmap_intent_type type, xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, struct xfs_btree_cur **pcur); +int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno, + uint64_t owner, uint64_t offset, unsigned int flags, + struct xfs_rmap_irec *irec, int *stat); +int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno, + uint64_t owner, uint64_t offset, unsigned int flags, + struct xfs_rmap_irec *irec, int *stat); + #endif /* __XFS_RMAP_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:50:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A0CF281DD for ; Thu, 25 Aug 2016 18:50:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EBE29AC004 for ; Thu, 25 Aug 2016 16:50:57 -0700 (PDT) X-ASG-Debug-ID: 1472169054-0bf57b5314209a80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 7kXYOnox8KRD8BMx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:50:55 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNorAR031378 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:53 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNor4l010709 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:50:53 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNoq4u002208; Thu, 25 Aug 2016 23:50:53 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:52 -0700 Subject: [PATCH 40/71] xfs: convert unwritten status of shared-extent reverse mappings on shared files From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 40/71] xfs: convert unwritten status of shared-extent reverse mappings on shared files To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:51 -0700 Message-ID: <147216905121.4420.12444976161755026169.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169055 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12956 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Upgrade the rmap extent conversion function to handle shared extents. v2: Move unwritten bit to rm_offset. Signed-off-by: Darrick J. Wong --- libxfs/xfs_rmap.c | 385 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 384 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index 17dc7d6..7a75e26 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -1276,6 +1276,384 @@ done: return error; } +/* + * Convert an unwritten extent to a real extent or vice versa. If there is no + * possibility of overlapping extents, delegate to the simpler convert + * function. + */ +STATIC int +xfs_rmap_convert_shared( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool unwritten, + struct xfs_owner_info *oinfo) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_rmap_irec r[4]; /* neighbor extent entries */ + /* left is 0, right is 1, prev is 2 */ + /* new is 3 */ + uint64_t owner; + uint64_t offset; + uint64_t new_endoff; + unsigned int oldext; + unsigned int newext; + unsigned int flags = 0; + int i; + int state = 0; + int error; + + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); + ASSERT(!(XFS_RMAP_NON_INODE_OWNER(owner) || + (flags & (XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK)))); + oldext = unwritten ? XFS_RMAP_UNWRITTEN : 0; + new_endoff = offset + len; + trace_xfs_rmap_convert(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); + + /* + * For the initial lookup, look for and exact match or the left-adjacent + * record for our insertion point. This will also give us the record for + * start block contiguity tests. + */ + error = xfs_rmap_lookup_le_range(cur, bno, owner, offset, flags, + &PREV, &i); + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + + ASSERT(PREV.rm_offset <= offset); + ASSERT(PREV.rm_offset + PREV.rm_blockcount >= new_endoff); + ASSERT((PREV.rm_flags & XFS_RMAP_UNWRITTEN) == oldext); + newext = ~oldext & XFS_RMAP_UNWRITTEN; + + /* + * Set flags determining what part of the previous oldext allocation + * extent is being replaced by a newext allocation. + */ + if (PREV.rm_offset == offset) + state |= RMAP_LEFT_FILLING; + if (PREV.rm_offset + PREV.rm_blockcount == new_endoff) + state |= RMAP_RIGHT_FILLING; + + /* Is there a left record that abuts our range? */ + error = xfs_rmap_find_left_neighbor(cur, bno, owner, offset, newext, + &LEFT, &i); + if (error) + goto done; + if (i) { + state |= RMAP_LEFT_VALID; + XFS_WANT_CORRUPTED_GOTO(mp, + LEFT.rm_startblock + LEFT.rm_blockcount <= bno, + done); + if (xfs_rmap_is_mergeable(&LEFT, owner, newext)) + state |= RMAP_LEFT_CONTIG; + } + + /* Is there a right record that abuts our range? */ + error = xfs_rmap_lookup_eq(cur, bno + len, len, owner, offset + len, + newext, &i); + if (error) + goto done; + if (i) { + state |= RMAP_RIGHT_VALID; + error = xfs_rmap_get_rec(cur, &RIGHT, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= RIGHT.rm_startblock, + done); + trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, + cur->bc_private.a.agno, RIGHT.rm_startblock, + RIGHT.rm_blockcount, RIGHT.rm_owner, + RIGHT.rm_offset, RIGHT.rm_flags); + if (xfs_rmap_is_mergeable(&RIGHT, owner, newext)) + state |= RMAP_RIGHT_CONTIG; + } + + /* check that left + prev + right is not too long */ + if ((state & (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | + RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG)) == + (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | + RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG) && + (unsigned long)LEFT.rm_blockcount + len + + RIGHT.rm_blockcount > XFS_RMAP_LEN_MAX) + state &= ~RMAP_RIGHT_CONTIG; + + trace_xfs_rmap_convert_state(mp, cur->bc_private.a.agno, state, + _RET_IP_); + /* + * Switch out based on the FILLING and CONTIG state bits. + */ + switch (state & (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | + RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG)) { + case RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | + RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG: + /* + * Setting all of a previous oldext extent to newext. + * The left and right neighbors are both contiguous with new. + */ + error = xfs_rmap_delete(cur, RIGHT.rm_startblock, + RIGHT.rm_blockcount, RIGHT.rm_owner, + RIGHT.rm_offset, RIGHT.rm_flags); + if (error) + goto done; + error = xfs_rmap_delete(cur, PREV.rm_startblock, + PREV.rm_blockcount, PREV.rm_owner, + PREV.rm_offset, PREV.rm_flags); + if (error) + goto done; + NEW = LEFT; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount += PREV.rm_blockcount + RIGHT.rm_blockcount; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_RIGHT_FILLING | RMAP_LEFT_CONTIG: + /* + * Setting all of a previous oldext extent to newext. + * The left neighbor is contiguous, the right is not. + */ + error = xfs_rmap_delete(cur, PREV.rm_startblock, + PREV.rm_blockcount, PREV.rm_owner, + PREV.rm_offset, PREV.rm_flags); + if (error) + goto done; + NEW = LEFT; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount += PREV.rm_blockcount; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG: + /* + * Setting all of a previous oldext extent to newext. + * The right neighbor is contiguous, the left is not. + */ + error = xfs_rmap_delete(cur, RIGHT.rm_startblock, + RIGHT.rm_blockcount, RIGHT.rm_owner, + RIGHT.rm_offset, RIGHT.rm_flags); + if (error) + goto done; + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount += RIGHT.rm_blockcount; + NEW.rm_flags = RIGHT.rm_flags; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_RIGHT_FILLING: + /* + * Setting all of a previous oldext extent to newext. + * Neither the left nor right neighbors are contiguous with + * the new one. + */ + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_flags = newext; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG: + /* + * Setting the first part of a previous oldext extent to newext. + * The left neighbor is contiguous. + */ + NEW = PREV; + error = xfs_rmap_delete(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + NEW.rm_offset += len; + NEW.rm_startblock += len; + NEW.rm_blockcount -= len; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + NEW = LEFT; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount += len; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING: + /* + * Setting the first part of a previous oldext extent to newext. + * The left neighbor is not contiguous. + */ + NEW = PREV; + error = xfs_rmap_delete(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + NEW.rm_offset += len; + NEW.rm_startblock += len; + NEW.rm_blockcount -= len; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + error = xfs_rmap_insert(cur, bno, len, owner, offset, newext); + if (error) + goto done; + break; + + case RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG: + /* + * Setting the last part of a previous oldext extent to newext. + * The right neighbor is contiguous with the new allocation. + */ + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount = offset - NEW.rm_offset; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + NEW = RIGHT; + error = xfs_rmap_delete(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + NEW.rm_offset = offset; + NEW.rm_startblock = bno; + NEW.rm_blockcount += len; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags); + if (error) + goto done; + break; + + case RMAP_RIGHT_FILLING: + /* + * Setting the last part of a previous oldext extent to newext. + * The right neighbor is not contiguous. + */ + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount -= len; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + error = xfs_rmap_insert(cur, bno, len, owner, offset, newext); + if (error) + goto done; + break; + + case 0: + /* + * Setting the middle part of a previous oldext extent to + * newext. Contiguity is impossible here. + * One extent becomes three extents. + */ + /* new right extent - oldext */ + NEW.rm_startblock = bno + len; + NEW.rm_owner = owner; + NEW.rm_offset = new_endoff; + NEW.rm_blockcount = PREV.rm_offset + PREV.rm_blockcount - + new_endoff; + NEW.rm_flags = PREV.rm_flags; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, NEW.rm_offset, + NEW.rm_flags); + if (error) + goto done; + /* new left extent - oldext */ + NEW = PREV; + error = xfs_rmap_lookup_eq(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, + NEW.rm_offset, NEW.rm_flags, &i); + if (error) + goto done; + XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); + NEW.rm_blockcount = offset - NEW.rm_offset; + error = xfs_rmap_update(cur, &NEW); + if (error) + goto done; + /* new middle extent - newext */ + NEW.rm_startblock = bno; + NEW.rm_blockcount = len; + NEW.rm_owner = owner; + NEW.rm_offset = offset; + NEW.rm_flags = newext; + error = xfs_rmap_insert(cur, NEW.rm_startblock, + NEW.rm_blockcount, NEW.rm_owner, NEW.rm_offset, + NEW.rm_flags); + if (error) + goto done; + break; + + case RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | RMAP_RIGHT_CONTIG: + case RMAP_RIGHT_FILLING | RMAP_LEFT_CONTIG | RMAP_RIGHT_CONTIG: + case RMAP_LEFT_FILLING | RMAP_RIGHT_CONTIG: + case RMAP_RIGHT_FILLING | RMAP_LEFT_CONTIG: + case RMAP_LEFT_CONTIG | RMAP_RIGHT_CONTIG: + case RMAP_LEFT_CONTIG: + case RMAP_RIGHT_CONTIG: + /* + * These cases are all impossible. + */ + ASSERT(0); + } + + trace_xfs_rmap_convert_done(mp, cur->bc_private.a.agno, bno, len, + unwritten, oinfo); +done: + if (error) + trace_xfs_rmap_convert_error(cur->bc_mp, + cur->bc_private.a.agno, error, _RET_IP_); + return error; +} + #undef NEW #undef LEFT #undef RIGHT @@ -1752,6 +2130,10 @@ xfs_rmap_finish_one( error = xfs_rmap_convert(rcur, bno, blockcount, !unwritten, &oinfo); break; + case XFS_RMAP_CONVERT_SHARED: + error = xfs_rmap_convert_shared(rcur, bno, blockcount, + !unwritten, &oinfo); + break; default: ASSERT(0); error = -EFSCORRUPTED; @@ -1855,7 +2237,8 @@ xfs_rmap_convert_extent( if (!xfs_rmap_update_is_needed(mp, whichfork)) return 0; - return __xfs_rmap_add(mp, dfops, XFS_RMAP_CONVERT, ip->i_ino, + return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? + XFS_RMAP_CONVERT_SHARED : XFS_RMAP_CONVERT, ip->i_ino, whichfork, PREV); } From darrick.wong@oracle.com Thu Aug 25 18:51:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 29B5D81DE for ; Thu, 25 Aug 2016 18:51:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A135FAC001 for ; Thu, 25 Aug 2016 16:51:03 -0700 (PDT) X-ASG-Debug-ID: 1472169061-0bf8155c771e87d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Al7r8FxDGrjlbUvH (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:02 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNp04n031470 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:00 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNp0TR006133 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:00 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNoxEC002268; Thu, 25 Aug 2016 23:51:00 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:50:59 -0700 Subject: [PATCH 41/71] xfs: don't allow realtime and reflinked files to mix From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 41/71] xfs: don't allow realtime and reflinked files to mix To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:50:57 -0700 Message-ID: <147216905751.4420.1257629723455686327.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169062 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1164 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines We don't support sharing blocks on the realtime device. Signed-off-by: Darrick J. Wong --- libxfs/xfs_inode_buf.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 8a804e2..2966d54 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -384,6 +384,9 @@ xfs_dinode_verify( xfs_ino_t ino, struct xfs_dinode *dip) { + uint16_t flags; + uint64_t flags2; + if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) return false; @@ -400,6 +403,19 @@ xfs_dinode_verify( return false; if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_meta_uuid)) return false; + + flags = be16_to_cpu(dip->di_flags); + flags2 = be64_to_cpu(dip->di_flags2); + + /* don't allow reflink/cowextsize if we don't have reflink */ + if ((flags2 & (XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE)) && + !xfs_sb_version_hasreflink(&mp->m_sb)) + return false; + + /* don't let reflink and realtime mix */ + if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags & XFS_DIFLAG_REALTIME)) + return false; + return true; } From darrick.wong@oracle.com Thu Aug 25 18:51:10 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 160E581EF for ; Thu, 25 Aug 2016 18:51:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA86E8F8033 for ; Thu, 25 Aug 2016 16:51:09 -0700 (PDT) X-ASG-Debug-ID: 1472169068-0bf57c55b41c7f00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id IBVL7qAiCAGa41rp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:08 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNp69b031747 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:07 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNp6hP028105 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:06 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNp6aA023212; Thu, 25 Aug 2016 23:51:06 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:05 -0700 Subject: [PATCH 42/71] xfs: don't mix reflink and DAX mode for now From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 42/71] xfs: don't mix reflink and DAX mode for now To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:04 -0700 Message-ID: <147216906459.4420.5585305790072253161.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169068 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 710 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Since we don't have a strategy for handling both DAX and reflink, for now we'll just prohibit both being set at the same time. Signed-off-by: Darrick J. Wong --- libxfs/xfs_inode_buf.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 2966d54..3f2049b 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -416,6 +416,10 @@ xfs_dinode_verify( if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags & XFS_DIFLAG_REALTIME)) return false; + /* don't let reflink and dax mix */ + if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags2 & XFS_DIFLAG2_DAX)) + return false; + return true; } From darrick.wong@oracle.com Thu Aug 25 18:51:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 501DC81F7 for ; Thu, 25 Aug 2016 18:51:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5BCCAC001 for ; Thu, 25 Aug 2016 16:51:16 -0700 (PDT) X-ASG-Debug-ID: 1472169074-0bf57b5313209aa0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id z3BtBNcj3vz5kIua (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:14 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNpDIt031811 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:13 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNpCGj006426 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:12 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNpCnl002322; Thu, 25 Aug 2016 23:51:12 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:12 -0700 Subject: [PATCH 43/71] xfs: recognize the reflink feature bit From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 43/71] xfs: recognize the reflink feature bit To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:10 -0700 Message-ID: <147216907076.4420.2565511908216135157.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169074 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 843 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add the reflink feature flag to the set of recognized feature flags. This enables users to write to reflink filesystems. Signed-off-by: Darrick J. Wong --- libxfs/xfs_format.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index e1551f1..f2b9737 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -459,7 +459,8 @@ xfs_sb_has_compat_feature( #define XFS_SB_FEAT_RO_COMPAT_REFLINK (1 << 2) /* reflinked files */ #define XFS_SB_FEAT_RO_COMPAT_ALL \ (XFS_SB_FEAT_RO_COMPAT_FINOBT | \ - XFS_SB_FEAT_RO_COMPAT_RMAPBT) + XFS_SB_FEAT_RO_COMPAT_RMAPBT | \ + XFS_SB_FEAT_RO_COMPAT_REFLINK) #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool xfs_sb_has_ro_compat_feature( From darrick.wong@oracle.com Thu Aug 25 18:51:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF24D81FF for ; Thu, 25 Aug 2016 18:51:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1D7330404E for ; Thu, 25 Aug 2016 16:51:23 -0700 (PDT) X-ASG-Debug-ID: 1472169081-0bf57c55b11c7f00001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 1FUestP12A0BkbZB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:21 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNpJRw025697 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:20 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNpJiA006568 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:19 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNpIJl002434; Thu, 25 Aug 2016 23:51:18 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:18 -0700 Subject: [PATCH 44/71] xfs_db: dump refcount btree data From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 44/71] xfs_db: dump refcount btree data To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:16 -0700 Message-ID: <147216907691.4420.3072564601166848691.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169081 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11699 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add the ability to walk and dump the refcount btree in xfs_db. Signed-off-by: Darrick J. Wong --- db/agf.c | 13 +++++++++++-- db/btblock.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ db/btblock.h | 5 +++++ db/field.c | 9 +++++++++ db/field.h | 4 ++++ db/inode.c | 3 +++ db/sb.c | 2 ++ db/type.c | 5 +++++ db/type.h | 2 +- man/man8/xfs_db.8 | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 10 files changed, 135 insertions(+), 5 deletions(-) diff --git a/db/agf.c b/db/agf.c index 467dd4c..275f407 100644 --- a/db/agf.c +++ b/db/agf.c @@ -47,7 +47,7 @@ const field_t agf_flds[] = { { "versionnum", FLDT_UINT32D, OI(OFF(versionnum)), C1, 0, TYP_NONE }, { "seqno", FLDT_AGNUMBER, OI(OFF(seqno)), C1, 0, TYP_NONE }, { "length", FLDT_AGBLOCK, OI(OFF(length)), C1, 0, TYP_NONE }, - { "roots", FLDT_AGBLOCK, OI(OFF(roots)), CI(XFS_BTNUM_AGF), + { "roots", FLDT_AGBLOCK, OI(OFF(roots)), CI(XFS_BTNUM_AGF) + 1, FLD_ARRAY|FLD_SKIPALL, TYP_NONE }, { "bnoroot", FLDT_AGBLOCK, OI(OFF(roots) + XFS_BTNUM_BNO * SZ(roots[XFS_BTNUM_BNO])), C1, 0, @@ -58,7 +58,10 @@ const field_t agf_flds[] = { { "rmaproot", FLDT_AGBLOCKNZ, OI(OFF(roots) + XFS_BTNUM_RMAP * SZ(roots[XFS_BTNUM_RMAP])), C1, 0, TYP_RMAPBT }, - { "levels", FLDT_UINT32D, OI(OFF(levels)), CI(XFS_BTNUM_AGF), + { "refcntroot", FLDT_AGBLOCKNZ, + OI(OFF(refcount_root)), C1, 0, + TYP_REFCBT }, + { "levels", FLDT_UINT32D, OI(OFF(levels)), CI(XFS_BTNUM_AGF) + 1, FLD_ARRAY|FLD_SKIPALL, TYP_NONE }, { "bnolevel", FLDT_UINT32D, OI(OFF(levels) + XFS_BTNUM_BNO * SZ(levels[XFS_BTNUM_BNO])), C1, 0, @@ -69,9 +72,15 @@ const field_t agf_flds[] = { { "rmaplevel", FLDT_UINT32D, OI(OFF(levels) + XFS_BTNUM_RMAP * SZ(levels[XFS_BTNUM_RMAP])), C1, 0, TYP_NONE }, + { "refcntlevel", FLDT_UINT32D, + OI(OFF(refcount_level)), C1, 0, + TYP_NONE }, { "rmapblocks", FLDT_UINT32D, OI(OFF(rmap_blocks)), C1, 0, TYP_NONE }, + { "refcntblocks", FLDT_UINT32D, + OI(OFF(refcount_blocks)), C1, 0, + TYP_NONE }, { "flfirst", FLDT_UINT32D, OI(OFF(flfirst)), C1, 0, TYP_NONE }, { "fllast", FLDT_UINT32D, OI(OFF(fllast)), C1, 0, TYP_NONE }, { "flcount", FLDT_UINT32D, OI(OFF(flcount)), C1, 0, TYP_NONE }, diff --git a/db/btblock.c b/db/btblock.c index ce59d18..e0c896b 100644 --- a/db/btblock.c +++ b/db/btblock.c @@ -102,6 +102,12 @@ struct xfs_db_btree { sizeof(struct xfs_rmap_rec), sizeof(__be32), }, + { XFS_REFC_CRC_MAGIC, + XFS_BTREE_SBLOCK_CRC_LEN, + sizeof(struct xfs_refcount_key), + sizeof(struct xfs_refcount_rec), + sizeof(__be32), + }, { 0, }, }; @@ -707,3 +713,47 @@ const field_t rmapbt_rec_flds[] = { { NULL } }; #undef ROFF + +/* refcount btree blocks */ +const field_t refcbt_crc_hfld[] = { + { "", FLDT_REFCBT_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + +#define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) +const field_t refcbt_crc_flds[] = { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_leftsib)), C1, 0, TYP_REFCBT }, + { "rightsib", FLDT_AGBLOCK, OI(OFF(u.s.bb_rightsib)), C1, 0, TYP_REFCBT }, + { "bno", FLDT_DFSBNO, OI(OFF(u.s.bb_blkno)), C1, 0, TYP_REFCBT }, + { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_REFCBTREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_REFCBTKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_REFCBTPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_REFCBT }, + { NULL } +}; +#undef OFF + +#define KOFF(f) bitize(offsetof(struct xfs_refcount_key, rc_ ## f)) +const field_t refcbt_key_flds[] = { + { "startblock", FLDT_AGBLOCK, OI(KOFF(startblock)), C1, 0, TYP_DATA }, + { NULL } +}; +#undef KOFF + +#define ROFF(f) bitize(offsetof(struct xfs_refcount_rec, rc_ ## f)) +const field_t refcbt_rec_flds[] = { + { "startblock", FLDT_AGBLOCK, OI(ROFF(startblock)), C1, 0, TYP_DATA }, + { "blockcount", FLDT_EXTLEN, OI(ROFF(blockcount)), C1, 0, TYP_NONE }, + { "refcount", FLDT_UINT32D, OI(ROFF(refcount)), C1, 0, TYP_DATA }, + { NULL } +}; +#undef ROFF diff --git a/db/btblock.h b/db/btblock.h index 35299b4..fead2f1 100644 --- a/db/btblock.h +++ b/db/btblock.h @@ -59,4 +59,9 @@ extern const struct field rmapbt_crc_hfld[]; extern const struct field rmapbt_key_flds[]; extern const struct field rmapbt_rec_flds[]; +extern const struct field refcbt_crc_flds[]; +extern const struct field refcbt_crc_hfld[]; +extern const struct field refcbt_key_flds[]; +extern const struct field refcbt_rec_flds[]; + extern int btblock_size(void *obj, int startoff, int idx); diff --git a/db/field.c b/db/field.c index ca7642f..e0e7066 100644 --- a/db/field.c +++ b/db/field.c @@ -183,6 +183,15 @@ const ftattr_t ftattrtab[] = { { FLDT_RMAPBTREC, "rmapbtrec", fp_sarray, (char *)rmapbt_rec_flds, SI(bitsz(struct xfs_rmap_rec)), 0, NULL, rmapbt_rec_flds }, + { FLDT_REFCBT_CRC, "refcntbt", NULL, (char *)refcbt_crc_flds, btblock_size, + FTARG_SIZE, NULL, refcbt_crc_flds }, + { FLDT_REFCBTKEY, "refcntbtkey", fp_sarray, (char *)refcbt_key_flds, + SI(bitsz(struct xfs_refcount_key)), 0, NULL, refcbt_key_flds }, + { FLDT_REFCBTPTR, "refcntbtptr", fp_num, "%u", SI(bitsz(xfs_refcount_ptr_t)), + 0, fa_agblock, NULL }, + { FLDT_REFCBTREC, "refcntbtrec", fp_sarray, (char *)refcbt_rec_flds, + SI(bitsz(struct xfs_refcount_rec)), 0, NULL, refcbt_rec_flds }, + /* CRC field */ { FLDT_CRC, "crc", fp_crc, "%#x (%s)", SI(bitsz(__uint32_t)), 0, NULL, NULL }, diff --git a/db/field.h b/db/field.h index 47f562a..ae5f490 100644 --- a/db/field.h +++ b/db/field.h @@ -89,6 +89,10 @@ typedef enum fldt { FLDT_RMAPBTKEY, FLDT_RMAPBTPTR, FLDT_RMAPBTREC, + FLDT_REFCBT_CRC, + FLDT_REFCBTKEY, + FLDT_REFCBTPTR, + FLDT_REFCBTREC, /* CRC field type */ FLDT_CRC, diff --git a/db/inode.c b/db/inode.c index 442e6ea..702cdf8 100644 --- a/db/inode.c +++ b/db/inode.c @@ -175,6 +175,9 @@ const field_t inode_v3_flds[] = { { "crtime", FLDT_TIMESTAMP, OI(COFF(crtime)), C1, 0, TYP_NONE }, { "inumber", FLDT_INO, OI(COFF(ino)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(COFF(uuid)), C1, 0, TYP_NONE }, + { "reflink", FLDT_UINT1, + OI(COFF(flags2) + bitsz(__uint64_t) - XFS_DIFLAG2_REFLINK_BIT-1), C1, + 0, TYP_NONE }, { NULL } }; diff --git a/db/sb.c b/db/sb.c index 79a3c1d..8e7722c 100644 --- a/db/sb.c +++ b/db/sb.c @@ -694,6 +694,8 @@ version_string( strcat(s, ",SPARSE_INODES"); if (xfs_sb_version_hasmetauuid(sbp)) strcat(s, ",META_UUID"); + if (xfs_sb_version_hasreflink(sbp)) + strcat(s, ",REFLINK"); return s; } diff --git a/db/type.c b/db/type.c index 337243a..10fa54e 100644 --- a/db/type.c +++ b/db/type.c @@ -61,6 +61,7 @@ static const typ_t __typtab[] = { { TYP_BNOBT, "bnobt", handle_struct, bnobt_hfld, NULL, TYP_F_NO_CRC_OFF }, { TYP_CNTBT, "cntbt", handle_struct, cntbt_hfld, NULL, TYP_F_NO_CRC_OFF }, { TYP_RMAPBT, NULL }, + { TYP_REFCBT, NULL }, { TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_DIR2, "dir2", handle_struct, dir2_hfld, NULL, TYP_F_NO_CRC_OFF }, { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, NULL, TYP_F_NO_CRC_OFF }, @@ -97,6 +98,8 @@ static const typ_t __typtab_crc[] = { &xfs_allocbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_RMAPBT, "rmapbt", handle_struct, rmapbt_crc_hfld, &xfs_rmapbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, + { TYP_REFCBT, "refcntbt", handle_struct, refcbt_crc_hfld, + &xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_DIR2, "dir3", handle_struct, dir3_hfld, &xfs_dir3_db_buf_ops, TYP_F_NO_CRC_OFF }, @@ -139,6 +142,8 @@ static const typ_t __typtab_spcrc[] = { &xfs_allocbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_RMAPBT, "rmapbt", handle_struct, rmapbt_crc_hfld, &xfs_rmapbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, + { TYP_REFCBT, "refcntbt", handle_struct, refcbt_crc_hfld, + &xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_DIR2, "dir3", handle_struct, dir3_hfld, &xfs_dir3_db_buf_ops, TYP_F_NO_CRC_OFF }, diff --git a/db/type.h b/db/type.h index b5a21a7..87ff107 100644 --- a/db/type.h +++ b/db/type.h @@ -24,7 +24,7 @@ struct field; typedef enum typnm { TYP_AGF, TYP_AGFL, TYP_AGI, TYP_ATTR, TYP_BMAPBTA, - TYP_BMAPBTD, TYP_BNOBT, TYP_CNTBT, TYP_RMAPBT, TYP_DATA, + TYP_BMAPBTD, TYP_BNOBT, TYP_CNTBT, TYP_RMAPBT, TYP_REFCBT, TYP_DATA, TYP_DIR2, TYP_DQBLK, TYP_INOBT, TYP_INODATA, TYP_INODE, TYP_LOG, TYP_RTBITMAP, TYP_RTSUMMARY, TYP_SB, TYP_SYMLINK, TYP_TEXT, TYP_FINOBT, TYP_NONE diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index e177913..514e3aa 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -682,8 +682,8 @@ If no argument is given, show the current data type. The possible data types are: .BR agf ", " agfl ", " agi ", " attr ", " bmapbta ", " bmapbtd , .BR bnobt ", " cntbt ", " data ", " dir ", " dir2 ", " dqblk , -.BR inobt ", " inode ", " log ", " rmapbt ", " rtbitmap ", " rtsummary , -.BR sb ", " symlink " and " text . +.BR inobt ", " inode ", " log ", " refcntbt ", " rmapbt ", " rtbitmap , +.BR rtsummary ", " sb ", " symlink " and " text . See the TYPES section below for more information on these data types. .TP .BI "uuid [" uuid " | " generate " | " rewrite " | " restore ] @@ -1667,6 +1667,49 @@ use .BR xfs_logprint (8) instead. .TP +.B refcntbt +There is one set of filesystem blocks forming the reference count Btree for +each allocation group. The root block of this Btree is designated by the +.B refcntroot +field in the corresponding AGF block. The blocks are linked to sibling left +and right blocks at each level, as well as by pointers from parent to child +blocks. Each block has the following fields: +.RS 1.4i +.PD 0 +.TP 1.2i +.B magic +REFC block magic number, 0x52334643 ('R3FC'). +.TP +.B level +level number of this block, 0 is a leaf. +.TP +.B numrecs +number of data entries in the block. +.TP +.B leftsib +left (logically lower) sibling block, 0 if none. +.TP +.B rightsib +right (logically higher) sibling block, 0 if none. +.TP +.B recs +[leaf blocks only] array of reference count records. Each record contains +.BR startblock , +.BR blockcount , +and +.BR refcount . +.TP +.B keys +[non-leaf blocks only] array of key records. These are the first value +of each block in the level below this one. Each record contains +.BR startblock . +.TP +.B ptrs +[non-leaf blocks only] array of child block pointers. Each pointer is a +block number within the allocation group to the next level in the Btree. +.PD +.RE +.TP .B rmapbt There is one set of filesystem blocks forming the reverse mapping Btree for each allocation group. The root block of this Btree is designated by the From darrick.wong@oracle.com Thu Aug 25 18:51:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 58E868209 for ; Thu, 25 Aug 2016 18:51:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F14C0304043 for ; Thu, 25 Aug 2016 16:51:28 -0700 (PDT) X-ASG-Debug-ID: 1472169086-0bf8155c751e8880001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id TrUW8HLxXlpwkETe (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNpPjt031912 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:25 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNpPAu006667 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:25 GMT Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNpO5S023298; Thu, 25 Aug 2016 23:51:25 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:24 -0700 Subject: [PATCH 45/71] xfs_db: add support for checking the refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 45/71] xfs_db: add support for checking the refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:23 -0700 Message-ID: <147216908320.4420.11320444962847831991.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169086 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8007 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Do some basic checks of the refcount btree. xfs_repair will have to check that the reference counts match the various bmbt mappings. Signed-off-by: Darrick J. Wong --- db/check.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 128 insertions(+), 8 deletions(-) diff --git a/db/check.c b/db/check.c index a6a8372..5b90182 100644 --- a/db/check.c +++ b/db/check.c @@ -44,7 +44,8 @@ typedef enum { DBM_FREE1, DBM_FREE2, DBM_FREELIST, DBM_INODE, DBM_LOG, DBM_MISSING, DBM_QUOTA, DBM_RTBITMAP, DBM_RTDATA, DBM_RTFREE, DBM_RTSUM, DBM_SB, - DBM_SYMLINK, DBM_BTFINO, DBM_BTRMAP, + DBM_SYMLINK, DBM_BTFINO, DBM_BTRMAP, DBM_BTREFC, + DBM_RLDATA, DBM_NDBM } dbm_t; @@ -52,7 +53,8 @@ typedef struct inodata { struct inodata *next; nlink_t link_set; nlink_t link_add; - char isdir; + char isdir:1; + char isreflink:1; char security; char ilist; xfs_ino_t ino; @@ -172,6 +174,8 @@ static const char *typename[] = { "symlink", "btfino", "btrmap", + "btrefcnt", + "rldata", NULL }; static int verbose; @@ -229,7 +233,8 @@ static int blocktrash_f(int argc, char **argv); static int blockuse_f(int argc, char **argv); static int check_blist(xfs_fsblock_t bno); static void check_dbmap(xfs_agnumber_t agno, xfs_agblock_t agbno, - xfs_extlen_t len, dbm_t type); + xfs_extlen_t len, dbm_t type, + int ignore_reflink); static int check_inomap(xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len, xfs_ino_t c_ino); static void check_linkcounts(xfs_agnumber_t agno); @@ -353,6 +358,9 @@ static void scanfunc_fino(struct xfs_btree_block *block, int level, static void scanfunc_rmap(struct xfs_btree_block *block, int level, struct xfs_agf *agf, xfs_agblock_t bno, int isroot); +static void scanfunc_refcnt(struct xfs_btree_block *block, int level, + struct xfs_agf *agf, xfs_agblock_t bno, + int isroot); static void set_dbmap(xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len, dbm_t type, xfs_agnumber_t c_agno, xfs_agblock_t c_agbno); @@ -1055,6 +1063,7 @@ blocktrash_f( (1 << DBM_SYMLINK) | (1 << DBM_BTFINO) | (1 << DBM_BTRMAP) | + (1 << DBM_BTREFC) | (1 << DBM_SB); while ((c = getopt(argc, argv, "0123n:o:s:t:x:y:z")) != EOF) { switch (c) { @@ -1291,18 +1300,25 @@ check_dbmap( xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_extlen_t len, - dbm_t type) + dbm_t type, + int ignore_reflink) { xfs_extlen_t i; char *p; + dbm_t d; for (i = 0, p = &dbmap[agno][agbno]; i < len; i++, p++) { + d = (dbm_t)*p; + if (ignore_reflink && (d == DBM_UNKNOWN || d == DBM_DATA || + d == DBM_RLDATA)) + continue; if ((dbm_t)*p != type) { - if (!sflag || CHECK_BLISTA(agno, agbno + i)) + if (!sflag || CHECK_BLISTA(agno, agbno + i)) { dbprintf(_("block %u/%u expected type %s got " "%s\n"), agno, agbno + i, typename[type], typename[(dbm_t)*p]); + } error++; } } @@ -1336,7 +1352,7 @@ check_inomap( return 0; } for (i = 0, rval = 1, idp = &inomap[agno][agbno]; i < len; i++, idp++) { - if (*idp) { + if (*idp && !(*idp)->isreflink) { if (!sflag || (*idp)->ilist || CHECK_BLISTA(agno, agbno + i)) dbprintf(_("block %u/%u claimed by inode %lld, " @@ -1542,6 +1558,26 @@ check_rrange( return 1; } +/* + * We don't check the accuracy of reference counts -- all we do is ensure + * that a data block never crosses with non-data blocks. repair can check + * those kinds of things. + * + * So with that in mind, if we're setting a block to be data or rldata, + * don't complain so long as the block is currently unknown, data, or rldata. + * Don't let blocks downgrade from rldata -> data. + */ +static bool +is_reflink( + dbm_t type2) +{ + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return false; + if (type2 == DBM_DATA || type2 == DBM_RLDATA) + return true; + return false; +} + static void check_set_dbmap( xfs_agnumber_t agno, @@ -1561,10 +1597,15 @@ check_set_dbmap( agbno, agbno + len - 1, c_agno, c_agbno); return; } - check_dbmap(agno, agbno, len, type1); + check_dbmap(agno, agbno, len, type1, is_reflink(type2)); mayprint = verbose | blist_size; for (i = 0, p = &dbmap[agno][agbno]; i < len; i++, p++) { - *p = (char)type2; + if (*p == DBM_RLDATA && type2 == DBM_DATA) + ; /* do nothing */ + if (*p == DBM_DATA && type2 == DBM_DATA) + *p = (char)DBM_RLDATA; + else + *p = (char)type2; if (mayprint && (verbose || CHECK_BLISTA(agno, agbno + i))) dbprintf(_("setting block %u/%u to %s\n"), agno, agbno + i, typename[type2]); @@ -2804,6 +2845,7 @@ process_inode( break; } + id->isreflink = !!(xino.i_d.di_flags2 & XFS_DIFLAG2_REFLINK); setlink_inode(id, VFS_I(&xino)->i_nlink, type == DBM_DIR, security); switch (xino.i_d.di_format) { @@ -3910,6 +3952,12 @@ scan_ag( be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]), 1, scanfunc_rmap, TYP_RMAPBT); } + if (agf->agf_refcount_root) { + scan_sbtree(agf, + be32_to_cpu(agf->agf_refcount_root), + be32_to_cpu(agf->agf_refcount_level), + 1, scanfunc_refcnt, TYP_REFCBT); + } scan_sbtree(agf, be32_to_cpu(agi->agi_root), be32_to_cpu(agi->agi_level), @@ -4643,6 +4691,78 @@ scanfunc_rmap( } static void +scanfunc_refcnt( + struct xfs_btree_block *block, + int level, + struct xfs_agf *agf, + xfs_agblock_t bno, + int isroot) +{ + xfs_agnumber_t seqno = be32_to_cpu(agf->agf_seqno); + int i; + xfs_refcount_ptr_t *pp; + struct xfs_refcount_rec *rp; + xfs_agblock_t lastblock; + + if (be32_to_cpu(block->bb_magic) != XFS_REFC_CRC_MAGIC) { + dbprintf(_("bad magic # %#x in refcntbt block %u/%u\n"), + be32_to_cpu(block->bb_magic), seqno, bno); + serious_error++; + return; + } + if (be16_to_cpu(block->bb_level) != level) { + if (!sflag) + dbprintf(_("expected level %d got %d in refcntbt block " + "%u/%u\n"), + level, be16_to_cpu(block->bb_level), seqno, bno); + error++; + } + set_dbmap(seqno, bno, 1, DBM_BTREFC, seqno, bno); + if (level == 0) { + if (be16_to_cpu(block->bb_numrecs) > mp->m_refc_mxr[0] || + (isroot == 0 && be16_to_cpu(block->bb_numrecs) < mp->m_refc_mnr[0])) { + dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in " + "refcntbt block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), mp->m_refc_mnr[0], + mp->m_refc_mxr[0], seqno, bno); + serious_error++; + return; + } + rp = XFS_REFCOUNT_REC_ADDR(block, 1); + lastblock = 0; + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { + set_dbmap(seqno, be32_to_cpu(rp[i].rc_startblock), + be32_to_cpu(rp[i].rc_blockcount), DBM_RLDATA, + seqno, bno); + if (be32_to_cpu(rp[i].rc_startblock) < lastblock) { + dbprintf(_( + "out-of-order refcnt btree record %d (%u %u) block %u/%u\n"), + i, be32_to_cpu(rp[i].rc_startblock), + be32_to_cpu(rp[i].rc_startblock), + be32_to_cpu(agf->agf_seqno), bno); + } else { + lastblock = be32_to_cpu(rp[i].rc_startblock) + + be32_to_cpu(rp[i].rc_blockcount); + } + } + return; + } + if (be16_to_cpu(block->bb_numrecs) > mp->m_refc_mxr[1] || + (isroot == 0 && be16_to_cpu(block->bb_numrecs) < mp->m_refc_mnr[1])) { + dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in refcntbt " + "block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), mp->m_refc_mnr[1], + mp->m_refc_mxr[1], seqno, bno); + serious_error++; + return; + } + pp = XFS_REFCOUNT_PTR_ADDR(block, 1, mp->m_refc_mxr[1]); + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) + scan_sbtree(agf, be32_to_cpu(pp[i]), level, 0, scanfunc_refcnt, + TYP_REFCBT); +} + +static void set_dbmap( xfs_agnumber_t agno, xfs_agblock_t agbno, From darrick.wong@oracle.com Thu Aug 25 18:51:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 30E728211 for ; Thu, 25 Aug 2016 18:51:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 03600304043 for ; Thu, 25 Aug 2016 16:51:36 -0700 (PDT) X-ASG-Debug-ID: 1472169094-0bf57b5311209ae0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id qnTwPMIBukIZ8lbB (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNpXLW025796 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:33 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNpWKG028935 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:33 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNpVPi019964; Thu, 25 Aug 2016 23:51:32 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:30 -0700 Subject: [PATCH 46/71] xfs_db: metadump should copy the refcount btree too From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 46/71] xfs_db: metadump should copy the refcount btree too To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:29 -0700 Message-ID: <147216908943.4420.9232479421481473209.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169094 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2590 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Teach metadump to copy the refcount btree. Signed-off-by: Darrick J. Wong --- db/metadump.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/db/metadump.c b/db/metadump.c index 44359e1..ab64fbd 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -615,6 +615,78 @@ copy_rmap_btree( return scan_btree(agno, root, levels, TYP_RMAPBT, agf, scanfunc_rmapbt); } +static int +scanfunc_refcntbt( + struct xfs_btree_block *block, + xfs_agnumber_t agno, + xfs_agblock_t agbno, + int level, + typnm_t btype, + void *arg) +{ + xfs_refcount_ptr_t *pp; + int i; + int numrecs; + + if (level == 0) + return 1; + + numrecs = be16_to_cpu(block->bb_numrecs); + if (numrecs > mp->m_refc_mxr[1]) { + if (show_warnings) + print_warning("invalid numrecs (%u) in %s block %u/%u", + numrecs, typtab[btype].name, agno, agbno); + return 1; + } + + pp = XFS_REFCOUNT_PTR_ADDR(block, 1, mp->m_refc_mxr[1]); + for (i = 0; i < numrecs; i++) { + if (!valid_bno(agno, be32_to_cpu(pp[i]))) { + if (show_warnings) + print_warning("invalid block number (%u/%u) " + "in %s block %u/%u", + agno, be32_to_cpu(pp[i]), + typtab[btype].name, agno, agbno); + continue; + } + if (!scan_btree(agno, be32_to_cpu(pp[i]), level, btype, arg, + scanfunc_refcntbt)) + return 0; + } + return 1; +} + +static int +copy_refcount_btree( + xfs_agnumber_t agno, + struct xfs_agf *agf) +{ + xfs_agblock_t root; + int levels; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 1; + + root = be32_to_cpu(agf->agf_refcount_root); + levels = be32_to_cpu(agf->agf_refcount_level); + + /* validate root and levels before processing the tree */ + if (root == 0 || root > mp->m_sb.sb_agblocks) { + if (show_warnings) + print_warning("invalid block number (%u) in refcntbt " + "root in agf %u", root, agno); + return 1; + } + if (levels >= XFS_BTREE_MAXLEVELS) { + if (show_warnings) + print_warning("invalid level (%u) in refcntbt root " + "in agf %u", levels, agno); + return 1; + } + + return scan_btree(agno, root, levels, TYP_REFCBT, agf, scanfunc_refcntbt); +} + /* filename and extended attribute obfuscation routines */ struct name_ent { @@ -2525,6 +2597,8 @@ scan_ag( goto pop_out; if (!copy_rmap_btree(agno, agf)) goto pop_out; + if (!copy_refcount_btree(agno, agf)) + goto pop_out; } /* copy inode btrees and the inodes and their associated metadata */ From darrick.wong@oracle.com Thu Aug 25 18:51:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 417428219 for ; Thu, 25 Aug 2016 18:51:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EC6A8304039 for ; Thu, 25 Aug 2016 16:51:40 -0700 (PDT) X-ASG-Debug-ID: 1472169099-0bf81509b01e0890001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id yXvHg1zU87u6oCWa (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:39 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNpcr2025838 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:38 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNpbhG011611 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:38 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNpbNc020070; Thu, 25 Aug 2016 23:51:37 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:36 -0700 Subject: [PATCH 47/71] xfs_db: deal with the CoW extent size hint From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 47/71] xfs_db: deal with the CoW extent size hint To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:35 -0700 Message-ID: <147216909559.4420.8839992477749709326.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169099 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1080 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Display the CoW extent hint size when dumping inodes. Signed-off-by: Darrick J. Wong --- db/inode.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/db/inode.c b/db/inode.c index 702cdf8..cac19fc 100644 --- a/db/inode.c +++ b/db/inode.c @@ -172,12 +172,16 @@ const field_t inode_v3_flds[] = { { "change_count", FLDT_UINT64D, OI(COFF(changecount)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(COFF(lsn)), C1, 0, TYP_NONE }, { "flags2", FLDT_UINT64X, OI(COFF(flags2)), C1, 0, TYP_NONE }, + { "cowextsize", FLDT_EXTLEN, OI(COFF(cowextsize)), C1, 0, TYP_NONE }, { "crtime", FLDT_TIMESTAMP, OI(COFF(crtime)), C1, 0, TYP_NONE }, { "inumber", FLDT_INO, OI(COFF(ino)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(COFF(uuid)), C1, 0, TYP_NONE }, { "reflink", FLDT_UINT1, OI(COFF(flags2) + bitsz(__uint64_t) - XFS_DIFLAG2_REFLINK_BIT-1), C1, 0, TYP_NONE }, + { "cowextsz", FLDT_UINT1, + OI(COFF(flags2) + bitsz(__uint64_t) - XFS_DIFLAG2_COWEXTSIZE_BIT-1), C1, + 0, TYP_NONE }, { NULL } }; From darrick.wong@oracle.com Thu Aug 25 18:51:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3DF68821A for ; Thu, 25 Aug 2016 18:51:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A7B43AC002 for ; Thu, 25 Aug 2016 16:51:47 -0700 (PDT) X-ASG-Debug-ID: 1472169105-0bf57c55b31c7f20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id INWacP4GGrIMuZcZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:46 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNphng025882 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:44 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNph1b028855 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:43 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNph48020095; Thu, 25 Aug 2016 23:51:43 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:43 -0700 Subject: [PATCH 48/71] xfs_db: print one array element per line From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 48/71] xfs_db: print one array element per line To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:41 -0700 Message-ID: <147216910176.4420.2022527266903445188.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169105 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 623 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Print one array element per line so that the debugger output isn't a gigantic pile of screen snow. Signed-off-by: Darrick J. Wong --- db/print.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/print.c b/db/print.c index 998daf4..e31372f 100644 --- a/db/print.c +++ b/db/print.c @@ -197,7 +197,7 @@ print_sarray( i < count && !seenint(); i++, bitoff += size) { if (array) - dbprintf("%d:", i + base); + dbprintf("\n%d:", i + base); for (f = flds, first = 1; f->name; f++) { if (f->flags & FLD_SKIPALL) continue; From darrick.wong@oracle.com Thu Aug 25 18:51:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 732E0822B for ; Thu, 25 Aug 2016 18:51:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 39446304043 for ; Thu, 25 Aug 2016 16:51:53 -0700 (PDT) X-ASG-Debug-ID: 1472169111-0bf57c55b11c7f20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Rz8i0CPG6JaOPYTg (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:51 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNpouS032076 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:51:50 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNpouH006935 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:50 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNpnir020112; Thu, 25 Aug 2016 23:51:49 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:49 -0700 Subject: [PATCH 49/71] xfs_growfs: report the presence of the reflink feature From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 49/71] xfs_growfs: report the presence of the reflink feature To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:47 -0700 Message-ID: <147216910793.4420.4380288271821747476.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169111 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2529 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Report the presence of the reflink feature in xfs_info. Signed-off-by: Darrick J. Wong --- growfs/xfs_growfs.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/growfs/xfs_growfs.c b/growfs/xfs_growfs.c index 2b46480..a294e14 100644 --- a/growfs/xfs_growfs.c +++ b/growfs/xfs_growfs.c @@ -59,12 +59,14 @@ report_info( int ftype_enabled, int finobt_enabled, int spinodes, - int rmapbt_enabled) + int rmapbt_enabled, + int reflink_enabled) { printf(_( "meta-data=%-22s isize=%-6u agcount=%u, agsize=%u blks\n" " =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n" " =%-22s crc=%-8u finobt=%u spinodes=%u rmapbt=%u\n" + " =%-22s reflink=%u\n" "data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n" " =%-22s sunit=%-6u swidth=%u blks\n" "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n" @@ -75,6 +77,7 @@ report_info( mntpoint, geo.inodesize, geo.agcount, geo.agblocks, "", geo.sectsize, attrversion, projid32bit, "", crcs_enabled, finobt_enabled, spinodes, rmapbt_enabled, + "", reflink_enabled, "", geo.blocksize, (unsigned long long)geo.datablocks, geo.imaxpct, "", geo.sunit, geo.swidth, @@ -129,6 +132,7 @@ main(int argc, char **argv) int finobt_enabled; /* free inode btree */ int spinodes; int rmapbt_enabled; + int reflink_enabled; progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -253,12 +257,13 @@ main(int argc, char **argv) finobt_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_FINOBT ? 1 : 0; spinodes = geo.flags & XFS_FSOP_GEOM_FLAGS_SPINODES ? 1 : 0; rmapbt_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_RMAPBT ? 1 : 0; + reflink_enabled = geo.flags & XFS_FSOP_GEOM_FLAGS_REFLINK ? 1 : 0; if (nflag) { report_info(geo, datadev, isint, logdev, rtdev, lazycount, dirversion, logversion, attrversion, projid32bit, crcs_enabled, ci, ftype_enabled, finobt_enabled, spinodes, - rmapbt_enabled); + rmapbt_enabled, reflink_enabled); exit(0); } @@ -296,7 +301,8 @@ main(int argc, char **argv) report_info(geo, datadev, isint, logdev, rtdev, lazycount, dirversion, logversion, attrversion, projid32bit, crcs_enabled, ci, ftype_enabled, - finobt_enabled, spinodes, rmapbt_enabled); + finobt_enabled, spinodes, rmapbt_enabled, + reflink_enabled); ddsize = xi.dsize; dlsize = ( xi.logBBsize? xi.logBBsize : From darrick.wong@oracle.com Thu Aug 25 18:52:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B64618234 for ; Thu, 25 Aug 2016 18:52:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2A5C9AC004 for ; Thu, 25 Aug 2016 16:52:00 -0700 (PDT) X-ASG-Debug-ID: 1472169117-0bf57b5311209b40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id CxewFiGxIfkdhOVj (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:51:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNpuKf032133 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:56 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNpu5f029006 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:51:56 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNptEV002666; Thu, 25 Aug 2016 23:51:55 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:51:55 -0700 Subject: [PATCH 50/71] xfs_io: bmap should support querying CoW fork, shared blocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 50/71] xfs_io: bmap should support querying CoW fork, shared blocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:51:54 -0700 Message-ID: <147216911412.4420.8062599654968728476.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169118 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5701 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Teach the bmap command to report shared and delayed allocation extents, and to be able to query the CoW fork. Signed-off-by: Darrick J. Wong --- io/bmap.c | 43 ++++++++++++++++++++++++++++++++++--------- man/man8/xfs_bmap.8 | 14 ++++++++++++++ man/man8/xfs_io.8 | 2 +- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/io/bmap.c b/io/bmap.c index b2e48da..2333244 100644 --- a/io/bmap.c +++ b/io/bmap.c @@ -41,7 +41,9 @@ bmap_help(void) " Holes are marked by replacing the startblock..endblock with 'hole'.\n" " All the file offsets and disk blocks are in units of 512-byte blocks.\n" " -a -- prints the attribute fork map instead of the data fork.\n" +" -c -- prints the copy-on-write fork map instead of the data fork.\n" " -d -- suppresses a DMAPI read event, offline portions shown as holes.\n" +" -e -- print delayed allocation extents.\n" " -l -- also displays the length of each extent in 512-byte blocks.\n" " -n -- query n extents.\n" " -p -- obtain all unwritten extents as well (w/ -v show which are unwritten.)\n" @@ -75,6 +77,7 @@ bmap_f( int loop = 0; int flg = 0; int aflag = 0; + int cflag = 0; int lflag = 0; int nflag = 0; int pflag = 0; @@ -85,12 +88,19 @@ bmap_f( int c; int egcnt; - while ((c = getopt(argc, argv, "adln:pv")) != EOF) { + while ((c = getopt(argc, argv, "acdeln:pv")) != EOF) { switch (c) { case 'a': /* Attribute fork. */ bmv_iflags |= BMV_IF_ATTRFORK; aflag = 1; break; + case 'c': /* CoW fork. */ + bmv_iflags |= BMV_IF_COWFORK | BMV_IF_DELALLOC; + cflag = 1; + break; + case 'e': + bmv_iflags |= BMV_IF_DELALLOC; + break; case 'l': /* list number of blocks with each extent */ lflag = 1; break; @@ -113,7 +123,7 @@ bmap_f( return command_usage(&bmap_cmd); } } - if (aflag) + if (aflag || cflag) bmv_iflags &= ~(BMV_IF_PREALLOC|BMV_IF_NO_DMAPI_READ); if (vflag) { @@ -273,13 +283,14 @@ bmap_f( #define MINRANGE_WIDTH 16 #define MINAG_WIDTH 2 #define MINTOT_WIDTH 5 -#define NFLG 5 /* count of flags */ -#define FLG_NULL 000000 /* Null flag */ -#define FLG_PRE 010000 /* Unwritten extent */ -#define FLG_BSU 001000 /* Not on begin of stripe unit */ -#define FLG_ESU 000100 /* Not on end of stripe unit */ -#define FLG_BSW 000010 /* Not on begin of stripe width */ -#define FLG_ESW 000001 /* Not on end of stripe width */ +#define NFLG 6 /* count of flags */ +#define FLG_NULL 0000000 /* Null flag */ +#define FLG_SHARED 0100000 /* shared extent */ +#define FLG_PRE 0010000 /* Unwritten extent */ +#define FLG_BSU 0001000 /* Not on begin of stripe unit */ +#define FLG_ESU 0000100 /* Not on end of stripe unit */ +#define FLG_BSW 0000010 /* Not on begin of stripe width */ +#define FLG_ESW 0000001 /* Not on end of stripe width */ int agno; off64_t agoff, bbperag; int foff_w, boff_w, aoff_w, tot_w, agno_w; @@ -350,6 +361,10 @@ bmap_f( if (map[i + 1].bmv_oflags & BMV_OF_PREALLOC) { flg |= FLG_PRE; } + if (map[i + 1].bmv_oflags & BMV_OF_SHARED) + flg |= FLG_SHARED; + if (map[i + 1].bmv_oflags & BMV_OF_DELALLOC) + map[i + 1].bmv_block = -2; /* * If striping enabled, determine if extent starts/ends * on a stripe unit boundary. @@ -382,6 +397,14 @@ bmap_f( agno_w, "", aoff_w, "", tot_w, (long long)map[i+1].bmv_length); + } else if (map[i + 1].bmv_block == -2) { + printf("%4d: %-*s %-*s %*s %-*s %*lld\n", + i, + foff_w, rbuf, + boff_w, _("delalloc"), + agno_w, "", + aoff_w, "", + tot_w, (long long)map[i+1].bmv_length); } else { snprintf(bbuf, sizeof(bbuf), "%lld..%lld", (long long) map[i + 1].bmv_block, @@ -413,6 +436,8 @@ bmap_f( } if ((flg || pflag) && vflag > 1) { printf(_(" FLAG Values:\n")); + printf(_(" %*.*o Shared extent\n"), + NFLG+1, NFLG+1, FLG_SHARED); printf(_(" %*.*o Unwritten preallocated extent\n"), NFLG+1, NFLG+1, FLG_PRE); printf(_(" %*.*o Doesn't begin on stripe unit\n"), diff --git a/man/man8/xfs_bmap.8 b/man/man8/xfs_bmap.8 index e196559..098cfae 100644 --- a/man/man8/xfs_bmap.8 +++ b/man/man8/xfs_bmap.8 @@ -36,6 +36,10 @@ no matter what the filesystem's block size is. If this option is specified, information about the file's attribute fork is printed instead of the default data fork. .TP +.B \-c +If this option is specified, information about the file's +copy on write fork is printed instead of the default data fork. +.TP .B \-d If portions of the file have been migrated offline by a DMAPI application, a DMAPI read event will be generated to @@ -45,6 +49,16 @@ printed. However if the option is used, no DMAPI read event will be generated for a DMAPI file and offline portions will be reported as holes. .TP +.B \-e +If this option is used, +.B xfs_bmap +obtains all delayed allocation extents, and does not flush dirty pages +to disk before querying extent data. With the +.B \-v +option, the +.I flags +column will show which extents have not yet been allocated. +.TP .B \-l If this option is used, then .IP diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 2c56f09..d089524 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -256,7 +256,7 @@ See the .B pwrite command. .TP -.BI "bmap [ \-adlpv ] [ \-n " nx " ]" +.BI "bmap [ \-acdelpv ] [ \-n " nx " ]" Prints the block mapping for the current open file. Refer to the .BR xfs_bmap (8) manual page for complete documentation. From darrick.wong@oracle.com Thu Aug 25 18:52:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9BCF5823B for ; Thu, 25 Aug 2016 18:52:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 601118F8033 for ; Thu, 25 Aug 2016 16:52:07 -0700 (PDT) X-ASG-Debug-ID: 1472169123-0bf57b5313209b60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id TjhFyTY311YEIDSF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:52:04 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNq2jS026263 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:03 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNq2vd007422 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:02 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNq1xq002683; Thu, 25 Aug 2016 23:52:02 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:01 -0700 Subject: [PATCH 51/71] libxfs: add configure option to override system header fsxattr From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 51/71] libxfs: add configure option to override system header fsxattr To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:00 -0700 Message-ID: <147216912039.4420.11989639519430308847.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169124 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3422 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines By default, libxfs will use the kernel/system headers to define struct fsxattr. Unfortunately, this creates a problem for developers who are writing new features but building xfsprogs on a stable system, because the stable kernel's headers don't reflect the new feature. In this case, we want to be able to use the internal fsxattr definition while the kernel headers catch up, so provide some configure magic to allow developers to force the use of the internal definition. Signed-off-by: Darrick J. Wong --- configure.ac | 5 +++++ include/builddefs.in | 4 ++++ include/linux.h | 10 +++++++++- io/fiemap.c | 1 - 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 1bb5fef..66a562f 100644 --- a/configure.ac +++ b/configure.ac @@ -61,6 +61,11 @@ AC_ARG_ENABLE(librt, enable_librt=yes) AC_SUBST(enable_librt) +AC_ARG_ENABLE(internal-fsxattr, +[ --enable-internal-fsxattr=[yes/no] Override system definition of struct fsxattr [default=no]],, + enable_internal_fsxattr=no) +AC_SUBST(enable_internal_fsxattr) + # # If the user specified a libdir ending in lib64 do not append another # 64 to the library names. diff --git a/include/builddefs.in b/include/builddefs.in index 7153d7a..fd7eb74 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -109,6 +109,7 @@ HAVE_MNTENT = @have_mntent@ HAVE_FLS = @have_fls@ HAVE_FSETXATTR = @have_fsetxattr@ HAVE_MREMAP = @have_mremap@ +ENABLE_INTERNAL_FSXATTR = @enable_internal_fsxattr@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl @@ -148,6 +149,9 @@ endif ifeq ($(ENABLE_BLKID),yes) PCFLAGS+= -DENABLE_BLKID endif +ifeq ($(ENABLE_INTERNAL_FSXATTR),yes) +PCFLAGS+= -DOVERRIDE_SYSTEM_FSXATTR +endif GCFLAGS = $(OPTIMIZER) $(DEBUG) \ diff --git a/include/linux.h b/include/linux.h index bc7af9f..cd0de71 100644 --- a/include/linux.h +++ b/include/linux.h @@ -32,7 +32,13 @@ #include #include #include +#ifdef OVERRIDE_SYSTEM_FSXATTR +# define fsxattr sys_fsxattr +#endif #include /* fsxattr defintion for new kernels */ +#ifdef OVERRIDE_SYSTEM_FSXATTR +# undef fsxattr +#endif static __inline__ int xfsctl(const char *path, int fd, int cmd, void *p) { @@ -175,7 +181,7 @@ static inline void platform_mntent_close(struct mntent_cursor * cursor) * are a copy of the definitions moved to linux/uapi/fs.h in the 4.5 kernel, * so this is purely for supporting builds against old kernel headers. */ -#ifndef FS_IOC_FSGETXATTR +#if !defined FS_IOC_FSGETXATTR || defined OVERRIDE_SYSTEM_FSXATTR struct fsxattr { __u32 fsx_xflags; /* xflags field value (get/set) */ __u32 fsx_extsize; /* extsize field value (get/set)*/ @@ -184,7 +190,9 @@ struct fsxattr { __u32 fsx_cowextsize; /* cow extsize field value (get/set) */ unsigned char fsx_pad[8]; }; +#endif +#ifndef FS_IOC_FSGETXATTR /* * Flags for the fsx_xflags field */ diff --git a/io/fiemap.c b/io/fiemap.c index f89da06..bcbae49 100644 --- a/io/fiemap.c +++ b/io/fiemap.c @@ -19,7 +19,6 @@ #include "platform_defs.h" #include "command.h" #include -#include #include "init.h" #include "io.h" From darrick.wong@oracle.com Thu Aug 25 18:52:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 85F778243 for ; Thu, 25 Aug 2016 18:52:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B1888F8033 for ; Thu, 25 Aug 2016 16:52:19 -0700 (PDT) X-ASG-Debug-ID: 1472169135-0bf8155c741e89f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id ZRMOForUgDKuytAE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:52:16 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNqEqD032526 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:14 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNqElv031196 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:14 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNqBPJ002090; Thu, 25 Aug 2016 23:52:13 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:11 -0700 Subject: [PATCH 52/71] xfs_io: get and set the CoW extent size hint From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 52/71] xfs_io: get and set the CoW extent size hint To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:06 -0700 Message-ID: <147216912656.4420.10505137543136479814.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169136 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 12217 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0713, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.50 BSF_SC0_MV0713 Custom rule MV0713 Enable administrators to get or set the CoW extent size hint. Report the hint when we run stat. This also requires some autoconf magic to detect whether or not fsx_cowextsize exists. Signed-off-by: Darrick J. Wong --- configure.ac | 1 include/builddefs.in | 4 + io/Makefile | 5 + io/attr.c | 8 ++ io/cowextsize.c | 202 +++++++++++++++++++++++++++++++++++++++++++++++++ io/init.c | 1 io/io.h | 6 + io/open.c | 3 + m4/package_libcdev.m4 | 26 ++++++ man/man8/xfs_io.8 | 16 ++++ 10 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 io/cowextsize.c diff --git a/configure.ac b/configure.ac index 66a562f..875d4bb 100644 --- a/configure.ac +++ b/configure.ac @@ -134,6 +134,7 @@ AC_HAVE_FLS AC_HAVE_READDIR AC_HAVE_FSETXATTR AC_HAVE_MREMAP +AC_HAVE_FSXATTR_COWEXTSIZE if test "$enable_blkid" = yes; then AC_HAVE_BLKID_TOPO diff --git a/include/builddefs.in b/include/builddefs.in index fd7eb74..165fa78 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -109,6 +109,7 @@ HAVE_MNTENT = @have_mntent@ HAVE_FLS = @have_fls@ HAVE_FSETXATTR = @have_fsetxattr@ HAVE_MREMAP = @have_mremap@ +HAVE_FSXATTR_COWEXTSIZE = @have_fsxattr_cowextsize@ ENABLE_INTERNAL_FSXATTR = @enable_internal_fsxattr@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall @@ -149,6 +150,9 @@ endif ifeq ($(ENABLE_BLKID),yes) PCFLAGS+= -DENABLE_BLKID endif +ifeq ($(HAVE_FSXATTR_COWEXTSIZE),yes) +PCFLAGS+= -DHAVE_FSXATTR_COWEXTSIZE +endif ifeq ($(ENABLE_INTERNAL_FSXATTR),yes) PCFLAGS+= -DOVERRIDE_SYSTEM_FSXATTR endif diff --git a/io/Makefile b/io/Makefile index 62bc03b..1997ca9 100644 --- a/io/Makefile +++ b/io/Makefile @@ -99,6 +99,11 @@ ifeq ($(HAVE_MREMAP),yes) LCFLAGS += -DHAVE_MREMAP endif +ifeq ($(HAVE_FSXATTR_COWEXTSIZE),yes) +CFILES += cowextsize.c +# -DHAVE_FSXATTR_COWEXTSIZE already set in PCFLAGS +endif + default: depend $(LTCOMMAND) include $(BUILDRULES) diff --git a/io/attr.c b/io/attr.c index 0186b1d..13bec73 100644 --- a/io/attr.c +++ b/io/attr.c @@ -48,9 +48,11 @@ static struct xflags { { FS_XFLAG_NODEFRAG, "f", "no-defrag" }, { FS_XFLAG_FILESTREAM, "S", "filestream" }, { FS_XFLAG_DAX, "x", "dax" }, + { FS_XFLAG_REFLINK, "R", "reflink" }, + { FS_XFLAG_COWEXTSIZE, "C", "cowextsize" }, { 0, NULL, NULL } }; -#define CHATTR_XFLAG_LIST "r"/*p*/"iasAdtPneEfSx" +#define CHATTR_XFLAG_LIST "r"/*p*/"iasAdtPneEfSxRC" static void lsattr_help(void) @@ -75,6 +77,8 @@ lsattr_help(void) " f -- do not include this file when defragmenting the filesystem\n" " S -- enable filestreams allocator for this directory\n" " x -- Use direct access (DAX) for data in this file\n" +" R -- file data blocks may be shared with another file\n" +" C -- for files with shared blocks, observe the inode CoW extent size value\n" "\n" " Options:\n" " -R -- recursively descend (useful when current file is a directory)\n" @@ -111,6 +115,8 @@ chattr_help(void) " +/-f -- set/clear the no-defrag flag\n" " +/-S -- set/clear the filestreams allocator flag\n" " +/-x -- set/clear the direct access (DAX) flag\n" +" +/-R -- set/clear the reflink flag\n" +" +/-C -- set/clear the CoW extent-size flag\n" " Note1: user must have certain capabilities to modify immutable/append-only.\n" " Note2: immutable/append-only files cannot be deleted; removing these files\n" " requires the immutable/append-only flag to be cleared first.\n" diff --git a/io/cowextsize.c b/io/cowextsize.c new file mode 100644 index 0000000..b4a1c2e --- /dev/null +++ b/io/cowextsize.c @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +/* + * If configure didn't find a struct fsxattr with fsx_cowextsize, + * disable the only other source (so far) of struct fsxattr. Thus, + * build with the internal definition of struct fsxattr, which has + * fsx_cowextsize. + */ +#include "platform_defs.h" +#include "command.h" +#include "init.h" +#include "io.h" +#include "input.h" +#include "path.h" + +static cmdinfo_t cowextsize_cmd; +static long cowextsize; + +static void +cowextsize_help(void) +{ + printf(_( +"\n" +" report or modify preferred CoW extent size (in bytes) for the current path\n" +"\n" +" -R -- recursively descend (useful when current path is a directory)\n" +" -D -- recursively descend, only modifying cowextsize on directories\n" +"\n")); +} + +static int +get_cowextsize(const char *path, int fd) +{ + struct fsxattr fsx; + + if ((xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { + printf("%s: XFS_IOC_FSGETXATTR %s: %s\n", + progname, path, strerror(errno)); + return 0; + } + printf("[%u] %s\n", fsx.fsx_cowextsize, path); + return 0; +} + +static int +set_cowextsize(const char *path, int fd, long extsz) +{ + struct fsxattr fsx; + struct stat64 stat; + + if (fstat64(fd, &stat) < 0) { + perror("fstat64"); + return 0; + } + if ((xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { + printf("%s: XFS_IOC_FSGETXATTR %s: %s\n", + progname, path, strerror(errno)); + return 0; + } + + if (S_ISREG(stat.st_mode) || S_ISDIR(stat.st_mode)) { + fsx.fsx_xflags |= FS_XFLAG_COWEXTSIZE; + } else { + printf(_("invalid target file type - file %s\n"), path); + return 0; + } + fsx.fsx_cowextsize = extsz; + + if ((xfsctl(path, fd, XFS_IOC_FSSETXATTR, &fsx)) < 0) { + printf("%s: XFS_IOC_FSSETXATTR %s: %s\n", + progname, path, strerror(errno)); + return 0; + } + + return 0; +} + +static int +get_cowextsize_callback( + const char *path, + const struct stat *stat, + int status, + struct FTW *data) +{ + int fd; + + if (recurse_dir && !S_ISDIR(stat->st_mode)) + return 0; + + fd = open(path, O_RDONLY); + if (fd < 0) { + fprintf(stderr, _("%s: cannot open %s: %s\n"), + progname, path, strerror(errno)); + } else { + get_cowextsize(path, fd); + close(fd); + } + return 0; +} + +static int +set_cowextsize_callback( + const char *path, + const struct stat *stat, + int status, + struct FTW *data) +{ + int fd; + + if (recurse_dir && !S_ISDIR(stat->st_mode)) + return 0; + + fd = open(path, O_RDONLY); + if (fd < 0) { + fprintf(stderr, _("%s: cannot open %s: %s\n"), + progname, path, strerror(errno)); + } else { + set_cowextsize(path, fd, cowextsize); + close(fd); + } + return 0; +} + +static int +cowextsize_f( + int argc, + char **argv) +{ + size_t blocksize, sectsize; + int c; + + recurse_all = recurse_dir = 0; + init_cvtnum(&blocksize, §size); + while ((c = getopt(argc, argv, "DR")) != EOF) { + switch (c) { + case 'D': + recurse_all = 0; + recurse_dir = 1; + break; + case 'R': + recurse_all = 1; + recurse_dir = 0; + break; + default: + return command_usage(&cowextsize_cmd); + } + } + + if (optind < argc) { + cowextsize = (long)cvtnum(blocksize, sectsize, argv[optind]); + if (cowextsize < 0) { + printf(_("non-numeric cowextsize argument -- %s\n"), + argv[optind]); + return 0; + } + } else { + cowextsize = -1; + } + + if (recurse_all || recurse_dir) + nftw(file->name, (cowextsize >= 0) ? + set_cowextsize_callback : get_cowextsize_callback, + 100, FTW_PHYS | FTW_MOUNT | FTW_DEPTH); + else if (cowextsize >= 0) + set_cowextsize(file->name, file->fd, cowextsize); + else + get_cowextsize(file->name, file->fd); + return 0; +} + +void +cowextsize_init(void) +{ + cowextsize_cmd.name = "cowextsize"; + cowextsize_cmd.cfunc = cowextsize_f; + cowextsize_cmd.args = _("[-D | -R] [cowextsize]"); + cowextsize_cmd.argmin = 0; + cowextsize_cmd.argmax = -1; + cowextsize_cmd.flags = CMD_NOMAP_OK; + cowextsize_cmd.oneline = + _("get/set preferred CoW extent size (in bytes) for the open file"); + cowextsize_cmd.help = cowextsize_help; + + add_command(&cowextsize_cmd); +} diff --git a/io/init.c b/io/init.c index efe7390..6b88cc6 100644 --- a/io/init.c +++ b/io/init.c @@ -85,6 +85,7 @@ init_commands(void) sync_range_init(); truncate_init(); reflink_init(); + cowextsize_init(); } static int diff --git a/io/io.h b/io/io.h index 2bc7ac4..4264e4d 100644 --- a/io/io.h +++ b/io/io.h @@ -169,3 +169,9 @@ extern void readdir_init(void); #endif extern void reflink_init(void); + +#ifdef HAVE_FSXATTR_COWEXTSIZE +extern void cowextsize_init(void); +#else +#define cowextsize_init() do { } while (0) +#endif diff --git a/io/open.c b/io/open.c index a5d465a..9a3563c 100644 --- a/io/open.c +++ b/io/open.c @@ -125,6 +125,9 @@ stat_f( printxattr(fsx.fsx_xflags, verbose, 0, file->name, 1, 1); printf(_("fsxattr.projid = %u\n"), fsx.fsx_projid); printf(_("fsxattr.extsize = %u\n"), fsx.fsx_extsize); +#if defined HAVE_FSXATTR_COWEXTSIZE + printf(_("fsxattr.cowextsize = %u\n"), fsx.fsx_cowextsize); +#endif printf(_("fsxattr.nextents = %u\n"), fsx.fsx_nextents); printf(_("fsxattr.naextents = %u\n"), fsxa.fsx_nextents); } diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 7a847e9..45954c2 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -265,3 +265,29 @@ AC_DEFUN([AC_HAVE_MREMAP], ) AC_SUBST(have_mremap) ]) + +# +# Check if we have a struct fsxattr with a fsx_cowextsize field. +# If linux/fs.h has a struct with that field, then we're ok. +# If we can't find fsxattr in linux/fs.h at all, the internal +# definitions provide it, and we're ok. +# +# The only way we won't have this is if the kernel headers don't +# have the field. +# +AC_DEFUN([AC_HAVE_FSXATTR_COWEXTSIZE], + [ AM_CONDITIONAL([INTERNAL_FSXATTR], [test "x$enable_internal_fsxattr" = xyes]) + AM_COND_IF([INTERNAL_FSXATTR], + [have_fsxattr_cowextsize=yes], + [ AC_CHECK_TYPE(struct fsxattr, + [AC_CHECK_MEMBER(struct fsxattr.fsx_cowextsize, + have_fsxattr_cowextsize=yes, + have_fsxattr_cowextsize=no, + [#include ] + )], + have_fsxattr_cowextsize=yes, + [#include ] + ) + ]) + AC_SUBST(have_fsxattr_cowextsize) + ]) diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index d089524..2365550 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -283,6 +283,22 @@ The should be specified in bytes, or using one of the usual units suffixes (k, m, g, b, etc). The extent size is always reported in units of bytes. .TP +.BI "cowextsize [ \-R | \-D ] [ " value " ]" +Display and/or modify the preferred copy-on-write extent size used +when allocating space for the currently open file. If the +.B \-R +option is specified, a recursive descent is performed +for all directory entries below the currently open file +.RB ( \-D +can be used to restrict the output to directories only). +If the target file is a directory, then the inherited CoW extent size +is set for that directory (new files created in that directory +inherit that CoW extent size). +The +.I value +should be specified in bytes, or using one of the usual units suffixes +(k, m, g, b, etc). The extent size is always reported in units of bytes. +.TP .BI "allocsp " size " 0" Sets the size of the file to .I size From darrick.wong@oracle.com Thu Aug 25 18:52:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 71CD7824D for ; Thu, 25 Aug 2016 18:52:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35E25304043 for ; Thu, 25 Aug 2016 16:52:26 -0700 (PDT) X-ASG-Debug-ID: 1472169144-0bf81509b01e09e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Q6D7KrpzOOTqqrI6 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:52:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNqMxF026486 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:22 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNqM0C012522 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:22 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNqKvI020184; Thu, 25 Aug 2016 23:52:21 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:20 -0700 Subject: [PATCH 53/71] xfs_io: add refcount+bmap error injection types From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 53/71] xfs_io: add refcount+bmap error injection types To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:16 -0700 Message-ID: <147216913645.4420.6358033608832201927.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169144 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1028 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add refcount and bmap deferred finish to the types of errors we can inject. Signed-off-by: Darrick J. Wong --- io/inject.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/io/inject.c b/io/inject.c index 16ac925..56642b8 100644 --- a/io/inject.c +++ b/io/inject.c @@ -78,7 +78,13 @@ error_tag(char *name) { XFS_ERRTAG_FREE_EXTENT, "free_extent" }, #define XFS_ERRTAG_RMAP_FINISH_ONE 23 { XFS_ERRTAG_RMAP_FINISH_ONE, "rmap_finish_one" }, -#define XFS_ERRTAG_MAX 24 +#define XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE 24 + { XFS_ERRTAG_REFCOUNT_CONTINUE_UPDATE, "refcount_continue_update" }, +#define XFS_ERRTAG_REFCOUNT_FINISH_ONE 25 + { XFS_ERRTAG_REFCOUNT_FINISH_ONE, "refcount_finish_one" }, +#define XFS_ERRTAG_BMAP_FINISH_ONE 26 + { XFS_ERRTAG_BMAP_FINISH_ONE, "bmap_finish_one" }, +#define XFS_ERRTAG_MAX 27 { XFS_ERRTAG_MAX, NULL } }; int count; From darrick.wong@oracle.com Thu Aug 25 18:52:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0CF228255 for ; Thu, 25 Aug 2016 18:52:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C4FD38F8033 for ; Thu, 25 Aug 2016 16:52:30 -0700 (PDT) X-ASG-Debug-ID: 1472169148-0bf57c55b21c7f40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 8VUBWVRDzi99Eds1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:52:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNqRcj032569 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:27 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNqRt1029644 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:27 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNqQMv002864; Thu, 25 Aug 2016 23:52:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:26 -0700 Subject: [PATCH 54/71] xfs_logprint: support cowextsize reporting in log contents From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 54/71] xfs_logprint: support cowextsize reporting in log contents To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:25 -0700 Message-ID: <147216914532.4420.529835785368632546.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169149 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1161 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- logprint/log_misc.c | 4 ++++ logprint/log_print_all.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 479fc14..f6488d9 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -513,6 +513,10 @@ xlog_print_trans_inode_core( ip->di_dmstate); printf(_("flags 0x%x gen 0x%x\n"), ip->di_flags, ip->di_gen); + if (ip->di_version == 3) { + printf(_("flags2 0x%llx cowextsize 0x%x\n"), + (unsigned long long)ip->di_flags2, ip->di_cowextsize); + } } void diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 0fe354b..46952c4 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -272,6 +272,10 @@ xlog_recover_print_inode_core( "gen:%d\n"), (int)di->di_forkoff, di->di_dmevmask, (int)di->di_dmstate, (int)di->di_flags, di->di_gen); + if (di->di_version == 3) { + printf(_("flags2 0x%llx cowextsize 0x%x\n"), + (unsigned long long)di->di_flags2, di->di_cowextsize); + } } STATIC void From darrick.wong@oracle.com Thu Aug 25 18:52:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 535A7825A for ; Thu, 25 Aug 2016 18:52:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2425830404E for ; Thu, 25 Aug 2016 16:52:38 -0700 (PDT) X-ASG-Debug-ID: 1472169155-0bf57b5314209bd0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Qzrd0H5oey5eDHDe (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:52:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNqYN3032620 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:34 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNqXqi012701 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:34 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNqXeu023704; Thu, 25 Aug 2016 23:52:33 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:32 -0700 Subject: [PATCH 55/71] xfs_logprint: support refcount redo items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 55/71] xfs_logprint: support refcount redo items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:31 -0700 Message-ID: <147216915147.4420.13686802045570738569.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169156 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6151 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Print reference count update redo items. Signed-off-by: Darrick J. Wong --- logprint/log_misc.c | 11 +++ logprint/log_print_all.c | 12 ++++ logprint/log_redo.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++ logprint/logprint.h | 5 ++ 4 files changed, 178 insertions(+) diff --git a/logprint/log_misc.c b/logprint/log_misc.c index f6488d9..5389b72 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -1008,6 +1008,17 @@ xlog_print_record( be32_to_cpu(op_head->oh_len)); break; } + case XFS_LI_CUI: { + skip = xlog_print_trans_cui(&ptr, + be32_to_cpu(op_head->oh_len), + continued); + break; + } + case XFS_LI_CUD: { + skip = xlog_print_trans_cud(&ptr, + be32_to_cpu(op_head->oh_len)); + break; + } case XFS_LI_QUOTAOFF: { skip = xlog_print_trans_qoff(&ptr, be32_to_cpu(op_head->oh_len)); diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 46952c4..eb3e326 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -418,6 +418,12 @@ xlog_recover_print_logitem( case XFS_LI_RUI: xlog_recover_print_rui(item); break; + case XFS_LI_CUD: + xlog_recover_print_cud(item); + break; + case XFS_LI_CUI: + xlog_recover_print_cui(item); + break; case XFS_LI_DQUOT: xlog_recover_print_dquot(item); break; @@ -458,6 +464,12 @@ xlog_recover_print_item( case XFS_LI_RUI: printf("RUI"); break; + case XFS_LI_CUD: + printf("CUD"); + break; + case XFS_LI_CUI: + printf("CUI"); + break; case XFS_LI_DQUOT: printf("DQ "); break; diff --git a/logprint/log_redo.c b/logprint/log_redo.c index add0764..6a2e30a 100644 --- a/logprint/log_redo.c +++ b/logprint/log_redo.c @@ -380,3 +380,153 @@ xlog_recover_print_rud( f = item->ri_buf[0].i_addr; xlog_print_trans_rud(&f, sizeof(struct xfs_rud_log_format)); } + +/* Reference Count Update Items */ + +static int +xfs_cui_copy_format( + char *buf, + uint len, + struct xfs_cui_log_format *dst_fmt, + int continued) +{ + uint nextents = ((struct xfs_cui_log_format *)buf)->cui_nextents; + uint dst_len = sizeof(struct xfs_cui_log_format) + + (nextents - 1) * sizeof(struct xfs_phys_extent); + + if (len == dst_len || continued) { + memcpy((char *)dst_fmt, buf, len); + return 0; + } + fprintf(stderr, _("%s: bad size of CUI format: %u; expected %u; nextents = %u\n"), + progname, len, dst_len, nextents); + return 1; +} + +int +xlog_print_trans_cui( + char **ptr, + uint src_len, + int continued) +{ + struct xfs_cui_log_format *src_f, *f = NULL; + uint dst_len; + uint nextents; + struct xfs_phys_extent *ex; + int i; + int error = 0; + int core_size; + + core_size = offsetof(struct xfs_cui_log_format, cui_extents); + + /* + * memmove to ensure 8-byte alignment for the long longs in + * struct xfs_cui_log_format structure + */ + src_f = malloc(src_len); + if (src_f == NULL) { + fprintf(stderr, _("%s: %s: malloc failed\n"), + progname, __func__); + exit(1); + } + memmove((char*)src_f, *ptr, src_len); + *ptr += src_len; + + /* convert to native format */ + nextents = src_f->cui_nextents; + dst_len = sizeof(struct xfs_cui_log_format) + + (nextents - 1) * sizeof(struct xfs_phys_extent); + + if (continued && src_len < core_size) { + printf(_("CUI: Not enough data to decode further\n")); + error = 1; + goto error; + } + + f = malloc(dst_len); + if (f == NULL) { + fprintf(stderr, _("%s: %s: malloc failed\n"), + progname, __func__); + exit(1); + } + if (xfs_cui_copy_format((char *)src_f, src_len, f, continued)) { + error = 1; + goto error; + } + + printf(_("CUI: #regs: %d num_extents: %d id: 0x%llx\n"), + f->cui_size, f->cui_nextents, (unsigned long long)f->cui_id); + + if (continued) { + printf(_("CUI extent data skipped (CONTINUE set, no space)\n")); + goto error; + } + + ex = f->cui_extents; + for (i=0; i < f->cui_nextents; i++) { + printf("(s: 0x%llx, l: %d, f: 0x%x) ", + (unsigned long long)ex->pe_startblock, ex->pe_len, + ex->pe_flags); + printf("\n"); + ex++; + } +error: + free(src_f); + free(f); + return error; +} + +void +xlog_recover_print_cui( + struct xlog_recover_item *item) +{ + char *src_f; + uint src_len; + + src_f = item->ri_buf[0].i_addr; + src_len = item->ri_buf[0].i_len; + + xlog_print_trans_cui(&src_f, src_len, 0); +} + +int +xlog_print_trans_cud( + char **ptr, + uint len) +{ + struct xfs_cud_log_format *f; + struct xfs_cud_log_format lbuf; + + /* size without extents at end */ + uint core_size = sizeof(struct xfs_cud_log_format); + + /* + * memmove to ensure 8-byte alignment for the long longs in + * xfs_efd_log_format_t structure + */ + memmove(&lbuf, *ptr, MIN(core_size, len)); + f = &lbuf; + *ptr += len; + if (len >= core_size) { + printf(_("CUD: #regs: %d id: 0x%llx\n"), + f->cud_size, + (unsigned long long)f->cud_cui_id); + + /* don't print extents as they are not used */ + + return 0; + } else { + printf(_("CUD: Not enough data to decode further\n")); + return 1; + } +} + +void +xlog_recover_print_cud( + struct xlog_recover_item *item) +{ + char *f; + + f = item->ri_buf[0].i_addr; + xlog_print_trans_cud(&f, sizeof(struct xfs_cud_log_format)); +} diff --git a/logprint/logprint.h b/logprint/logprint.h index 0c03c08..a1115e2 100644 --- a/logprint/logprint.h +++ b/logprint/logprint.h @@ -56,4 +56,9 @@ extern void xlog_recover_print_rui(struct xlog_recover_item *item); extern int xlog_print_trans_rud(char **ptr, uint len); extern void xlog_recover_print_rud(struct xlog_recover_item *item); +extern int xlog_print_trans_cui(char **ptr, uint src_len, int continued); +extern void xlog_recover_print_cui(struct xlog_recover_item *item); +extern int xlog_print_trans_cud(char **ptr, uint len); +extern void xlog_recover_print_cud(struct xlog_recover_item *item); + #endif /* LOGPRINT_H */ From darrick.wong@oracle.com Thu Aug 25 18:52:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 38D038264 for ; Thu, 25 Aug 2016 18:52:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E263B8F8033 for ; Thu, 25 Aug 2016 16:52:43 -0700 (PDT) X-ASG-Debug-ID: 1472169161-0bf81509b01e0a70001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id pG0581a7AOq0UA1A (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:52:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNqe4R032696 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:40 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNqdE0029904 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:52:39 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNqdMm002897; Thu, 25 Aug 2016 23:52:39 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:39 -0700 Subject: [PATCH 56/71] xfs_logprint: support bmap redo items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 56/71] xfs_logprint: support bmap redo items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:37 -0700 Message-ID: <147216915771.4420.14619176682224551855.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169161 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6233 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Print block mapping update redo items. Signed-off-by: Darrick J. Wong --- logprint/log_misc.c | 11 +++ logprint/log_print_all.c | 12 ++++ logprint/log_redo.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++ logprint/logprint.h | 5 ++ 4 files changed, 179 insertions(+) diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 5389b72..c10a1d1 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -1019,6 +1019,17 @@ xlog_print_record( be32_to_cpu(op_head->oh_len)); break; } + case XFS_LI_BUI: { + skip = xlog_print_trans_bui(&ptr, + be32_to_cpu(op_head->oh_len), + continued); + break; + } + case XFS_LI_BUD: { + skip = xlog_print_trans_bud(&ptr, + be32_to_cpu(op_head->oh_len)); + break; + } case XFS_LI_QUOTAOFF: { skip = xlog_print_trans_qoff(&ptr, be32_to_cpu(op_head->oh_len)); diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index eb3e326..f49316e 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -424,6 +424,12 @@ xlog_recover_print_logitem( case XFS_LI_CUI: xlog_recover_print_cui(item); break; + case XFS_LI_BUD: + xlog_recover_print_bud(item); + break; + case XFS_LI_BUI: + xlog_recover_print_bui(item); + break; case XFS_LI_DQUOT: xlog_recover_print_dquot(item); break; @@ -470,6 +476,12 @@ xlog_recover_print_item( case XFS_LI_CUI: printf("CUI"); break; + case XFS_LI_BUD: + printf("BUD"); + break; + case XFS_LI_BUI: + printf("BUI"); + break; case XFS_LI_DQUOT: printf("DQ "); break; diff --git a/logprint/log_redo.c b/logprint/log_redo.c index 6a2e30a..dcca427 100644 --- a/logprint/log_redo.c +++ b/logprint/log_redo.c @@ -530,3 +530,154 @@ xlog_recover_print_cud( f = item->ri_buf[0].i_addr; xlog_print_trans_cud(&f, sizeof(struct xfs_cud_log_format)); } + +/* Block Mapping Update Items */ + +static int +xfs_bui_copy_format( + char *buf, + uint len, + struct xfs_bui_log_format *dst_fmt, + int continued) +{ + uint nextents = ((struct xfs_bui_log_format *)buf)->bui_nextents; + uint dst_len = sizeof(struct xfs_bui_log_format) + + (nextents - 1) * sizeof(struct xfs_map_extent); + + if (len == dst_len || continued) { + memcpy((char *)dst_fmt, buf, len); + return 0; + } + fprintf(stderr, _("%s: bad size of BUI format: %u; expected %u; nextents = %u\n"), + progname, len, dst_len, nextents); + return 1; +} + +int +xlog_print_trans_bui( + char **ptr, + uint src_len, + int continued) +{ + struct xfs_bui_log_format *src_f, *f = NULL; + uint dst_len; + uint nextents; + struct xfs_map_extent *ex; + int i; + int error = 0; + int core_size; + + core_size = offsetof(struct xfs_bui_log_format, bui_extents); + + /* + * memmove to ensure 8-byte alignment for the long longs in + * struct xfs_bui_log_format structure + */ + src_f = malloc(src_len); + if (src_f == NULL) { + fprintf(stderr, _("%s: %s: malloc failed\n"), + progname, __func__); + exit(1); + } + memmove((char*)src_f, *ptr, src_len); + *ptr += src_len; + + /* convert to native format */ + nextents = src_f->bui_nextents; + dst_len = sizeof(struct xfs_bui_log_format) + + (nextents - 1) * sizeof(struct xfs_map_extent); + + if (continued && src_len < core_size) { + printf(_("BUI: Not enough data to decode further\n")); + error = 1; + goto error; + } + + f = malloc(dst_len); + if (f == NULL) { + fprintf(stderr, _("%s: %s: malloc failed\n"), + progname, __func__); + exit(1); + } + if (xfs_bui_copy_format((char *)src_f, src_len, f, continued)) { + error = 1; + goto error; + } + + printf(_("BUI: #regs: %d num_extents: %d id: 0x%llx\n"), + f->bui_size, f->bui_nextents, (unsigned long long)f->bui_id); + + if (continued) { + printf(_("BUI extent data skipped (CONTINUE set, no space)\n")); + goto error; + } + + ex = f->bui_extents; + for (i=0; i < f->bui_nextents; i++) { + printf("(s: 0x%llx, l: %d, own: %lld, off: %llu, f: 0x%x) ", + (unsigned long long)ex->me_startblock, ex->me_len, + (long long)ex->me_owner, + (unsigned long long)ex->me_startoff, ex->me_flags); + printf("\n"); + ex++; + } +error: + free(src_f); + free(f); + return error; +} + +void +xlog_recover_print_bui( + struct xlog_recover_item *item) +{ + char *src_f; + uint src_len; + + src_f = item->ri_buf[0].i_addr; + src_len = item->ri_buf[0].i_len; + + xlog_print_trans_bui(&src_f, src_len, 0); +} + +int +xlog_print_trans_bud( + char **ptr, + uint len) +{ + struct xfs_bud_log_format *f; + struct xfs_bud_log_format lbuf; + + /* size without extents at end */ + uint core_size = sizeof(struct xfs_bud_log_format); + + /* + * memmove to ensure 8-byte alignment for the long longs in + * xfs_efd_log_format_t structure + */ + memmove(&lbuf, *ptr, MIN(core_size, len)); + f = &lbuf; + *ptr += len; + if (len >= core_size) { + printf(_("BUD: #regs: %d id: 0x%llx\n"), + f->bud_size, + (unsigned long long)f->bud_bui_id); + + /* don't print extents as they are not used */ + + return 0; + } else { + printf(_("BUD: Not enough data to decode further\n")); + return 1; + } +} + +void +xlog_recover_print_bud( + struct xlog_recover_item *item) +{ + char *f; + + f = item->ri_buf[0].i_addr; + xlog_print_trans_bud(&f, sizeof(struct xfs_bud_log_format)); +} diff --git a/logprint/logprint.h b/logprint/logprint.h index a1115e2..81feff3 100644 --- a/logprint/logprint.h +++ b/logprint/logprint.h @@ -61,4 +61,9 @@ extern void xlog_recover_print_cui(struct xlog_recover_item *item); extern int xlog_print_trans_cud(char **ptr, uint len); extern void xlog_recover_print_cud(struct xlog_recover_item *item); +extern int xlog_print_trans_bui(char **ptr, uint src_len, int continued); +extern void xlog_recover_print_bui(struct xlog_recover_item *item); +extern int xlog_print_trans_bud(char **ptr, uint len); +extern void xlog_recover_print_bud(struct xlog_recover_item *item); + #endif /* LOGPRINT_H */ From darrick.wong@oracle.com Thu Aug 25 18:52:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C00E5826D for ; Thu, 25 Aug 2016 18:52:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 931758F8033 for ; Thu, 25 Aug 2016 16:52:49 -0700 (PDT) X-ASG-Debug-ID: 1472169167-0bf57c55b11c8000001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id XesavdgUgD0Tr07J (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:52:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNqkbU026715 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:46 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNqkhF008264 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:46 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNqjNd023796; Thu, 25 Aug 2016 23:52:45 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:45 -0700 Subject: [PATCH 57/71] man: document the reflink inode flag in fsxattr From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 57/71] man: document the reflink inode flag in fsxattr To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:43 -0700 Message-ID: <147216916395.4420.14137061415373193422.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169167 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1056 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Document the new inode flag in struct fsxattr for reflink. Signed-off-by: Darrick J. Wong --- man/man3/xfsctl.3 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/man/man3/xfsctl.3 b/man/man3/xfsctl.3 index 9e7f138..ef6c992 100644 --- a/man/man3/xfsctl.3 +++ b/man/man3/xfsctl.3 @@ -230,6 +230,16 @@ If the filesystem lives on directly accessible persistent memory, reads and writes to this file will go straight to the persistent memory, bypassing the page cache. .TP +.SM "Bit 16 (0x10000) \- XFS_XFLAG_REFLINK" +This file is sharing or has shared blocks with another file. +This flag can be set by reflinking or deduping blocks with another file +and cleared by fallocating the entire file to pre-copy all shared extents. +A file cannot have +.BR XFS_XFLAG_REFLINK +and +.BR XFS_XFLAG_DAX +set at the same time, that is to say that DAX files cannot share blocks. +.TP .SM "Bit 31 (0x80000000) \- XFS_XFLAG_HASATTR" The file has extended attributes associated with it. .RE From darrick.wong@oracle.com Thu Aug 25 18:52:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A83CF8275 for ; Thu, 25 Aug 2016 18:52:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 616708F8033 for ; Thu, 25 Aug 2016 16:52:55 -0700 (PDT) X-ASG-Debug-ID: 1472169173-0bf57c55b21c8070001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Ou3EDekCmIy1RvOX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:52:53 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNqqjm032757 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:52 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNqqNJ008367 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:52 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNqp4C023805; Thu, 25 Aug 2016 23:52:51 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:51 -0700 Subject: [PATCH 58/71] man: document the inode cowextsize flags & fields From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 58/71] man: document the inode cowextsize flags & fields To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:50 -0700 Message-ID: <147216917010.4420.687777056323399610.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169173 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2300 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Document the new copy-on-write extent size fields and inode flags available in struct fsxattr. Signed-off-by: Darrick J. Wong --- man/man3/xfsctl.3 | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/man/man3/xfsctl.3 b/man/man3/xfsctl.3 index ef6c992..77506aa 100644 --- a/man/man3/xfsctl.3 +++ b/man/man3/xfsctl.3 @@ -150,6 +150,15 @@ value returned indicates that a preferred extent size was previously set on the file, a .B fsx_extsize of zero indicates that the defaults for that filesystem will be used. +A +.B fsx_cowextsize +value returned indicates that a preferred copy on write extent size was +previously set on the file, whereas a +.B fsx_cowextsize +of zero indicates that the defaults for that filesystem will be used. +The current default for +.B fsx_cowextsize +is 128 blocks. Currently the meaningful bits for the .B fsx_xflags field are: @@ -240,6 +249,15 @@ and .BR XFS_XFLAG_DAX set at the same time, that is to say that DAX files cannot share blocks. .TP +.SM "Bit 17 (0x20000) \- XFS_XFLAG_COWEXTSIZE" +Copy on Write Extent size bit - if a CoW extent size value is set on the file, +the allocator will allocate extents for staging a copy on write operation +in multiples of the set size for this file (see +.B XFS_IOC_FSSETXATTR +below). +If the CoW extent size is set on a directory, then new file and directories +created in the directory will inherit the parent's CoW extent size value. +.TP .SM "Bit 31 (0x80000000) \- XFS_XFLAG_HASATTR" The file has extended attributes associated with it. .RE @@ -261,7 +279,8 @@ The final argument points to a variable of type .BR "struct fsxattr" , but only the following fields are used in this call: .BR fsx_xflags , -.B fsx_extsize +.BR fsx_extsize , +.BR fsx_cowextsize , and .BR fsx_projid . The @@ -271,6 +290,9 @@ when the file is empty, except in the case of a directory where the extent size can be set at any time (this value is only used for regular file allocations, so should only be set on a directory in conjunction with the XFS_XFLAG_EXTSZINHERIT flag). +The copy on write extent size, +.BR fsx_cowextsize , +can be set at any time. .TP .B XFS_IOC_GETBMAP From darrick.wong@oracle.com Thu Aug 25 18:53:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9FA29827D for ; Thu, 25 Aug 2016 18:53:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 14EEAAC001 for ; Thu, 25 Aug 2016 16:53:02 -0700 (PDT) X-ASG-Debug-ID: 1472169180-0bf57b5313209be0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 3MT4H9FDIWk4W0jO (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:01 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNqx39026809 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:59 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNqwh4008628 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:52:58 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNqveW003070; Thu, 25 Aug 2016 23:52:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:52:57 -0700 Subject: [PATCH 59/71] xfs_repair: fix get_agino_buf to avoid corrupting inodes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 59/71] xfs_repair: fix get_agino_buf to avoid corrupting inodes To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:52:56 -0700 Message-ID: <147216917625.4420.10924742973800299704.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169181 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5547 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The inode buffering code tries to read inodes in units of chunks, which are the larger of 8K or 1 FSB. Each chunk gets its own xfs_buf, which means that get_agino_buf must calculate the disk address of the chunk and feed that to libxfs_readbuf in order to find the inode data correctly. The current code simply grabs the chunk for the start inode and indexes from that, which corrupts memory because the start inode and the target inode could be in different inode chunks. That causes the assert in rmap.c to blow when we clear the reflink flag. (Also fix some minor errors in the debugging printfs.) Signed-off-by: Darrick J. Wong --- libxfs/rdwr.c | 8 +++--- repair/dinode.c | 73 +++++++++++++++++++++++++++++++++---------------------- repair/dinode.h | 12 +++++---- 3 files changed, 54 insertions(+), 39 deletions(-) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 533a064..9fcc319 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -1038,9 +1038,9 @@ libxfs_readbufr_map(struct xfs_buftarg *btp, struct xfs_buf *bp, int flags) if (!error) bp->b_flags |= LIBXFS_B_UPTODATE; #ifdef IO_DEBUG - printf("%lx: %s: read %u bytes, error %d, blkno=0x%llx(0x%llx), %p\n", - pthread_self(), __FUNCTION__, , error, - (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); + printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", + pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, + (long long)LIBXFS_BBTOOFF64(bp->b_bn), (long long)bp->b_bn, bp); #endif return error; } @@ -1070,7 +1070,7 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, if (!error) libxfs_readbuf_verify(bp, ops); -#ifdef IO_DEBUG +#ifdef IO_DEBUGX printf("%lx: %s: read %lu bytes, error %d, blkno=%llu(%llu), %p\n", pthread_self(), __FUNCTION__, buf - (char *)bp->b_addr, error, (long long)LIBXFS_BBTOOFF64(bp->b_bn), (long long)bp->b_bn, bp); diff --git a/repair/dinode.c b/repair/dinode.c index 512a668..16e0a06 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -847,43 +847,58 @@ scan_bmbt_reclist( } /* - * these two are meant for routines that read and work with inodes - * one at a time where the inodes may be in any order (like walking - * the unlinked lists to look for inodes). the caller is responsible - * for writing/releasing the buffer. + * Grab the buffer backing an inode. This is meant for routines that + * work with inodes one at a time in any order (like walking the + * unlinked lists to look for inodes). The caller is responsible for + * writing/releasing the buffer. */ -xfs_buf_t * -get_agino_buf(xfs_mount_t *mp, - xfs_agnumber_t agno, - xfs_agino_t agino, - xfs_dinode_t **dipp) +struct xfs_buf * +get_agino_buf( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agino_t agino, + struct xfs_dinode **dipp) { - ino_tree_node_t *irec; - xfs_buf_t *bp; - int size; - - if ((irec = find_inode_rec(mp, agno, agino)) == NULL) - return(NULL); + struct xfs_buf *bp; + int cluster_size; + int ino_per_cluster; + xfs_agino_t cluster_agino; + xfs_daddr_t cluster_daddr; + xfs_daddr_t cluster_blks; - size = MAX(1, XFS_FSB_TO_BB(mp, + /* + * Inode buffers have been read into memory in inode_cluster_size + * chunks (or one FSB). To find the correct buffer for an inode, + * we must find the buffer for its cluster, add the appropriate + * offset, and return that. + */ + cluster_size = MAX(mp->m_inode_cluster_size, mp->m_sb.sb_blocksize); + ino_per_cluster = cluster_size / mp->m_sb.sb_inodesize; + cluster_agino = agino & ~(ino_per_cluster - 1); + cluster_blks = XFS_FSB_TO_DADDR(mp, MAX(1, mp->m_inode_cluster_size >> mp->m_sb.sb_blocklog)); - bp = libxfs_readbuf(mp->m_dev, XFS_AGB_TO_DADDR(mp, agno, - XFS_AGINO_TO_AGBNO(mp, irec->ino_startnum)), size, 0, - &xfs_inode_buf_ops); + cluster_daddr = XFS_AGB_TO_DADDR(mp, agno, + XFS_AGINO_TO_AGBNO(mp, cluster_agino)); + +#ifdef XR_INODE_TRACE + printf("cluster_size %d ipc %d clusagino %d daddr %lld sectors %lld\n", + cluster_size, ino_per_cluster, cluster_agino, cluster_daddr, + cluster_blks); +#endif + + bp = libxfs_readbuf(mp->m_dev, cluster_daddr, cluster_blks, + 0, &xfs_inode_buf_ops); if (!bp) { do_warn(_("cannot read inode (%u/%u), disk block %" PRIu64 "\n"), - agno, irec->ino_startnum, - XFS_AGB_TO_DADDR(mp, agno, - XFS_AGINO_TO_AGBNO(mp, irec->ino_startnum))); - return(NULL); + agno, cluster_agino, cluster_daddr); + return NULL; } - *dipp = xfs_make_iptr(mp, bp, agino - - XFS_OFFBNO_TO_AGINO(mp, XFS_AGINO_TO_AGBNO(mp, - irec->ino_startnum), - 0)); - - return(bp); + *dipp = xfs_make_iptr(mp, bp, agino - cluster_agino); + ASSERT(!xfs_sb_version_hascrc(&mp->m_sb) || + XFS_AGINO_TO_INO(mp, agno, agino) == + be64_to_cpu((*dipp)->di_ino)); + return bp; } /* diff --git a/repair/dinode.h b/repair/dinode.h index 5aebf5b..61d0736 100644 --- a/repair/dinode.h +++ b/repair/dinode.h @@ -113,12 +113,12 @@ void check_uncertain_aginodes(xfs_mount_t *mp, xfs_agnumber_t agno); -xfs_buf_t * -get_agino_buf(xfs_mount_t *mp, - xfs_agnumber_t agno, - xfs_agino_t agino, - xfs_dinode_t **dipp); - +struct xfs_buf * +get_agino_buf( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agino_t agino, + struct xfs_dinode **dipp); void dinode_bmbt_translation_init(void); char * get_forkname(int whichfork); From darrick.wong@oracle.com Thu Aug 25 18:53:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 960AE8287 for ; Thu, 25 Aug 2016 18:53:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67FA68F8033 for ; Thu, 25 Aug 2016 16:53:08 -0700 (PDT) X-ASG-Debug-ID: 1472169186-0bf57b5311209be0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id RSgmD2NlfOnAGZSE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNr4wG000639 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:05 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNr4wM013569 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:04 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNr43h003125; Thu, 25 Aug 2016 23:53:04 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:03 -0700 Subject: [PATCH 60/71] xfs_repair: check the existing refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 60/71] xfs_repair: check the existing refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:02 -0700 Message-ID: <147216918246.4420.2364013368793255366.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169186 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7147 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Spot-check the refcount btree for obvious errors, and mark the refcount btree blocks as such. Signed-off-by: Darrick J. Wong --- repair/incore.h | 3 + repair/scan.c | 185 +++++++++++++++++++++++++++++++++++++++++++++++++++ repair/xfs_repair.c | 2 + 3 files changed, 189 insertions(+), 1 deletion(-) diff --git a/repair/incore.h b/repair/incore.h index bc0810b..b6c4b4f 100644 --- a/repair/incore.h +++ b/repair/incore.h @@ -106,7 +106,8 @@ typedef struct rt_extent_tree_node { #define XR_E_INUSE_FS1 9 /* used by fs ag header or log (rmap btree) */ #define XR_E_INO1 10 /* used by inodes (marked by rmap btree) */ #define XR_E_FS_MAP1 11 /* used by fs space/inode maps (rmap btree) */ -#define XR_E_BAD_STATE 12 +#define XR_E_REFC 12 /* used by fs ag reference count btree */ +#define XR_E_BAD_STATE 13 /* separate state bit, OR'ed into high (4th) bit of ex_state field */ diff --git a/repair/scan.c b/repair/scan.c index 35a974a..c27f969 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -810,6 +810,9 @@ process_rmap_rec( case XFS_RMAP_OWN_INODES: set_bmap_ext(agno, b, blen, XR_E_INO1); break; + case XFS_RMAP_OWN_REFC: + set_bmap_ext(agno, b, blen, XR_E_REFC); + break; case XFS_RMAP_OWN_NULL: /* still unknown */ break; @@ -845,6 +848,14 @@ _("inode block (%d,%d-%d) mismatch in %s tree, state - %d,%" PRIx64 "\n"), agno, b, b + blen - 1, name, state, owner); break; + case XR_E_REFC: + if (owner == XFS_RMAP_OWN_REFC) + break; + do_warn( +_("AG refcount block (%d,%d-%d) mismatch in %s tree, state - %d,%" PRIx64 "\n"), + agno, b, b + blen - 1, + name, state, owner); + break; case XR_E_INUSE: if (owner >= 0 && owner < mp->m_sb.sb_dblocks) @@ -1161,6 +1172,167 @@ out: rmap_avoid_check(); } +static void +scan_refcbt( + struct xfs_btree_block *block, + int level, + xfs_agblock_t bno, + xfs_agnumber_t agno, + int suspect, + int isroot, + __uint32_t magic, + void *priv) +{ + const char *name = "refcount"; + int i; + xfs_refcount_ptr_t *pp; + struct xfs_refcount_rec *rp; + int hdr_errors = 0; + int numrecs; + int state; + xfs_agblock_t lastblock = 0; + + if (magic != XFS_REFC_CRC_MAGIC) { + name = "(unknown)"; + hdr_errors++; + suspect++; + goto out; + } + + if (be32_to_cpu(block->bb_magic) != magic) { + do_warn(_("bad magic # %#x in %s btree block %d/%d\n"), + be32_to_cpu(block->bb_magic), name, agno, bno); + hdr_errors++; + if (suspect) + goto out; + } + + if (be16_to_cpu(block->bb_level) != level) { + do_warn(_("expected level %d got %d in %s btree block %d/%d\n"), + level, be16_to_cpu(block->bb_level), name, agno, bno); + hdr_errors++; + if (suspect) + goto out; + } + + /* check for btree blocks multiply claimed */ + state = get_bmap(agno, bno); + if (!(state == XR_E_UNKNOWN || state == XR_E_REFC)) { + set_bmap(agno, bno, XR_E_MULT); + do_warn( +_("%s btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), + name, state, agno, bno, suspect); + goto out; + } + set_bmap(agno, bno, XR_E_FS_MAP); + + numrecs = be16_to_cpu(block->bb_numrecs); + if (level == 0) { + if (numrecs > mp->m_refc_mxr[0]) { + numrecs = mp->m_refc_mxr[0]; + hdr_errors++; + } + if (isroot == 0 && numrecs < mp->m_refc_mnr[0]) { + numrecs = mp->m_refc_mnr[0]; + hdr_errors++; + } + + if (hdr_errors) { + do_warn( + _("bad btree nrecs (%u, min=%u, max=%u) in %s btree block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), + mp->m_refc_mnr[0], mp->m_refc_mxr[0], + name, agno, bno); + suspect++; + } + + rp = XFS_REFCOUNT_REC_ADDR(block, 1); + for (i = 0; i < numrecs; i++) { + xfs_agblock_t b, end; + xfs_extlen_t len; + xfs_nlink_t nr; + + b = be32_to_cpu(rp[i].rc_startblock); + len = be32_to_cpu(rp[i].rc_blockcount); + nr = be32_to_cpu(rp[i].rc_refcount); + end = b + len; + + if (!verify_agbno(mp, agno, b)) { + do_warn( + _("invalid start block %u in record %u of %s btree block %u/%u\n"), + b, i, name, agno, bno); + continue; + } + if (len == 0 || !verify_agbno(mp, agno, end - 1)) { + do_warn( + _("invalid length %u in record %u of %s btree block %u/%u\n"), + len, i, name, agno, bno); + continue; + } + + if (nr < 2 || nr > MAXREFCOUNT) { + do_warn( + _("invalid reference count %u in record %u of %s btree block %u/%u\n"), + nr, i, name, agno, bno); + continue; + } + + if (b && b <= lastblock) { + do_warn(_( + "out-of-order %s btree record %d (%u %u) block %u/%u\n"), + name, i, b, len, agno, bno); + } else { + lastblock = b; + } + + /* XXX: probably want to mark the reflinked areas? */ + } + goto out; + } + + /* + * interior record + */ + pp = XFS_REFCOUNT_PTR_ADDR(block, 1, mp->m_refc_mxr[1]); + + if (numrecs > mp->m_refc_mxr[1]) { + numrecs = mp->m_refc_mxr[1]; + hdr_errors++; + } + if (isroot == 0 && numrecs < mp->m_refc_mnr[1]) { + numrecs = mp->m_refc_mnr[1]; + hdr_errors++; + } + + /* + * don't pass bogus tree flag down further if this block + * looked ok. bail out if two levels in a row look bad. + */ + if (hdr_errors) { + do_warn( + _("bad btree nrecs (%u, min=%u, max=%u) in %s btree block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), + mp->m_refc_mnr[1], mp->m_refc_mxr[1], + name, agno, bno); + if (suspect) + goto out; + suspect++; + } else if (suspect) { + suspect = 0; + } + + for (i = 0; i < numrecs; i++) { + xfs_agblock_t bno = be32_to_cpu(pp[i]); + + if (bno != 0 && verify_agbno(mp, agno, bno)) { + scan_sbtree(bno, level, agno, suspect, scan_refcbt, 0, + magic, priv, &xfs_refcountbt_buf_ops); + } + } +out: + return; +} + /* * The following helpers are to help process and validate individual on-disk * inode btree records. We have two possible inode btrees with slightly @@ -1951,6 +2123,19 @@ validate_agf( } } + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + bno = be32_to_cpu(agf->agf_refcount_root); + if (bno != 0 && verify_agbno(mp, agno, bno)) { + scan_sbtree(bno, + be32_to_cpu(agf->agf_refcount_level), + agno, 0, scan_refcbt, 1, XFS_REFC_CRC_MAGIC, + agcnts, &xfs_refcountbt_buf_ops); + } else { + do_warn(_("bad agbno %u for refcntbt root, agno %d\n"), + bno, agno); + } + } + if (be32_to_cpu(agf->agf_freeblks) != agcnts->agffreeblks) { do_warn(_("agf_freeblks %u, counted %u in ag %u\n"), be32_to_cpu(agf->agf_freeblks), agcnts->agffreeblks, agno); diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index dc38ece..4d92b90 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -423,6 +423,8 @@ calc_mkfs(xfs_mount_t *mp) fino_bno += min(2, mp->m_rmap_maxlevels); /* agfl blocks */ fino_bno++; } + if (xfs_sb_version_hasreflink(&mp->m_sb)) + fino_bno++; /* * If the log is allocated in the first allocation group we need to From darrick.wong@oracle.com Thu Aug 25 18:53:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B7FB0828A for ; Thu, 25 Aug 2016 18:53:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6BF038F8033 for ; Thu, 25 Aug 2016 16:53:15 -0700 (PDT) X-ASG-Debug-ID: 1472169192-0bf81509b01e0b60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id sc50HRBTKV8AcFmC (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:13 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNrBRU027195 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:53:12 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNrB3T009010 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:11 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNrA3l002341; Thu, 25 Aug 2016 23:53:10 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:10 -0700 Subject: [PATCH 61/71] xfs_repair: handle multiple owners of data blocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 61/71] xfs_repair: handle multiple owners of data blocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:08 -0700 Message-ID: <147216918870.4420.17056399412341828338.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169193 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5136 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If reflink is enabled, don't freak out if there are multiple owners of a given block; that's just a sign that each of those owners are reflink files. v2: owner and offset are unsigned types, so use those for inorder comparison. Signed-off-by: Darrick J. Wong --- repair/dinode.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ repair/scan.c | 42 ++++++++++++++++++++++++++++++++++- 2 files changed, 107 insertions(+), 1 deletion(-) diff --git a/repair/dinode.c b/repair/dinode.c index 16e0a06..98afdc9 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -722,6 +722,9 @@ _("Fatal error: inode %" PRIu64 " - blkmap_set_ext(): %s\n" * checking each entry without setting the * block bitmap */ + if (type == XR_INO_DATA && + xfs_sb_version_hasreflink(&mp->m_sb)) + goto skip_dup; if (search_dup_extent(agno, agbno, ebno)) { do_warn( _("%s fork in ino %" PRIu64 " claims dup extent, " @@ -731,6 +734,7 @@ _("%s fork in ino %" PRIu64 " claims dup extent, " irec.br_blockcount); goto done; } +skip_dup: *tot += irec.br_blockcount; continue; } @@ -770,6 +774,9 @@ _("%s fork in inode %" PRIu64 " claims metadata block %" PRIu64 "\n"), case XR_E_INUSE: case XR_E_MULT: set_bmap_ext(agno, agbno, blen, XR_E_MULT); + if (type == XR_INO_DATA && + xfs_sb_version_hasreflink(&mp->m_sb)) + break; do_warn( _("%s fork in %s inode %" PRIu64 " claims used block %" PRIu64 "\n"), forkname, ftype, ino, b); @@ -2475,6 +2482,65 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), } } + /* + * check that we only have valid flags2 set, and those that are set make + * sense. + */ + if (dino->di_version >= 3) { + uint16_t flags = be16_to_cpu(dino->di_flags); + uint64_t flags2 = be64_to_cpu(dino->di_flags2); + + if (flags2 & ~XFS_DIFLAG2_ANY) { + if (!uncertain) { + do_warn( + _("Bad flags2 set in inode %" PRIu64 "\n"), + lino); + } + flags2 &= XFS_DIFLAG2_ANY; + } + + if ((flags2 & XFS_DIFLAG2_REFLINK) && + !xfs_sb_version_hasreflink(&mp->m_sb)) { + if (!uncertain) { + do_warn( + _("inode %" PRIu64 " is marked reflinked but file system does not support reflink\n"), + lino); + } + goto clear_bad_out; + } + + if (flags2 & XFS_DIFLAG2_REFLINK) { + /* must be a file */ + if (di_mode && !S_ISREG(di_mode)) { + if (!uncertain) { + do_warn( + _("reflink flag set on non-file inode %" PRIu64 "\n"), + lino); + } + goto clear_bad_out; + } + } + + if ((flags2 & XFS_DIFLAG2_REFLINK) && + (flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT))) { + if (!uncertain) { + do_warn( + _("Cannot have a reflinked realtime inode %" PRIu64 "\n"), + lino); + } + goto clear_bad_out; + } + + if (!verify_mode && flags2 != be64_to_cpu(dino->di_flags2)) { + if (!no_modify) { + do_warn(_("fixing bad flags2.\n")); + dino->di_flags2 = cpu_to_be64(flags2); + *dirty = 1; + } else + do_warn(_("would fix bad flags2.\n")); + } + } + if (verify_mode) return retval; diff --git a/repair/scan.c b/repair/scan.c index c27f969..d3a1a82 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -872,6 +872,15 @@ _("in use block (%d,%d-%d) mismatch in %s tree, state - %d,%" PRIx64 "\n"), * be caught later. */ break; + case XR_E_INUSE1: + /* + * multiple inode owners are ok with + * reflink enabled + */ + if (xfs_sb_version_hasreflink(&mp->m_sb) && + !XFS_RMAP_NON_INODE_OWNER(owner)) + break; + /* fall through */ default: do_warn( _("unknown block (%d,%d-%d) mismatch on %s tree, state - %d,%" PRIx64 "\n"), @@ -888,6 +897,28 @@ struct rmap_priv { xfs_agblock_t nr_blocks; }; +static bool +rmap_in_order( + xfs_agblock_t b, + xfs_agblock_t lastblock, + uint64_t owner, + uint64_t lastowner, + uint64_t offset, + uint64_t lastoffset) +{ + if (b > lastblock) + return true; + else if (b < lastblock) + return false; + + if (owner > lastowner) + return true; + else if (owner < lastowner) + return false; + + return offset > lastoffset; +} + static void scan_rmapbt( struct xfs_btree_block *block, @@ -908,6 +939,8 @@ scan_rmapbt( int numrecs; int state; xfs_agblock_t lastblock = 0; + uint64_t lastowner = 0; + uint64_t lastoffset = 0; struct xfs_rmap_key *kp; struct xfs_rmap_irec key = {0}; @@ -1038,10 +1071,17 @@ _("%s rmap btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), if (i == 0) { advance: lastblock = b; + lastowner = owner; + lastoffset = offset; } else { bool bad; - bad = b <= lastblock; + if (xfs_sb_version_hasreflink(&mp->m_sb)) + bad = !rmap_in_order(b, lastblock, + owner, lastowner, + offset, lastoffset); + else + bad = b <= lastblock; if (bad) do_warn( _("out-of-order rmap btree record %d (%u %"PRId64" %"PRIx64" %u) block %u/%u\n"), From darrick.wong@oracle.com Thu Aug 25 18:53:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0D57C8299 for ; Thu, 25 Aug 2016 18:53:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73AAEAC001 for ; Thu, 25 Aug 2016 16:53:22 -0700 (PDT) X-ASG-Debug-ID: 1472169199-0bf57c55b21c80e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EDgRLfTfwhXoc91O (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNrI6q027252 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:18 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNrHVg030658 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:17 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNrGpo002427; Thu, 25 Aug 2016 23:53:17 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:16 -0700 Subject: [PATCH 62/71] xfs_repair: process reverse-mapping data into refcount data From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 62/71] xfs_repair: process reverse-mapping data into refcount data To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:14 -0700 Message-ID: <147216919493.4420.15402732901727826690.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169199 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11607 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Take all the reverse-mapping data we've acquired and use it to generate reference count data. This data is used in phase 5 to rebuild the refcount btree. v2: Update to reflect separation of rmap_irec flags. Signed-off-by: Darrick J. Wong --- repair/phase4.c | 27 ++++++ repair/rmap.c | 232 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ repair/rmap.h | 2 3 files changed, 259 insertions(+), 2 deletions(-) diff --git a/repair/phase4.c b/repair/phase4.c index 9da1bb1..86992c9 100644 --- a/repair/phase4.c +++ b/repair/phase4.c @@ -193,6 +193,21 @@ _("%s while checking reverse-mappings"), } static void +compute_ag_refcounts( + work_queue_t *wq, + xfs_agnumber_t agno, + void *arg) +{ + int error; + + error = compute_refcounts(wq->mp, agno); + if (error) + do_error( +_("%s while computing reference count records.\n"), + strerror(-error)); +} + +static void process_rmap_data( struct xfs_mount *mp) { @@ -206,6 +221,14 @@ process_rmap_data( for (i = 0; i < mp->m_sb.sb_agcount; i++) queue_work(&wq, check_rmap_btrees, i, NULL); destroy_work_queue(&wq); + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return; + + create_work_queue(&wq, mp, libxfs_nproc()); + for (i = 0; i < mp->m_sb.sb_agcount; i++) + queue_work(&wq, compute_ag_refcounts, i, NULL); + destroy_work_queue(&wq); } void @@ -359,7 +382,9 @@ phase4(xfs_mount_t *mp) /* * Process all the reverse-mapping data that we collected. This - * involves checking the rmap data against the btree. + * involves checking the rmap data against the btree, computing + * reference counts based on the rmap data, and checking the counts + * against the refcount btree. */ process_rmap_data(mp); diff --git a/repair/rmap.c b/repair/rmap.c index 0baf4eb..0753448 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -42,6 +42,7 @@ struct xfs_ag_rmap { int ar_flcount; /* agfl entries from leftover */ /* agbt allocations */ struct xfs_rmap_irec ar_last_rmap; /* last rmap seen */ + struct xfs_slab *ar_refcount_items; /* refcount items, p4-5 */ }; static struct xfs_ag_rmap *ag_rmaps; @@ -88,7 +89,8 @@ bool rmap_needs_work( struct xfs_mount *mp) { - return xfs_sb_version_hasrmapbt(&mp->m_sb); + return xfs_sb_version_hasreflink(&mp->m_sb) || + xfs_sb_version_hasrmapbt(&mp->m_sb); } /* @@ -120,6 +122,11 @@ _("Insufficient memory while allocating reverse mapping slabs.")); do_error( _("Insufficient memory while allocating raw metadata reverse mapping slabs.")); ag_rmaps[i].ar_last_rmap.rm_owner = XFS_RMAP_OWN_UNKNOWN; + error = init_slab(&ag_rmaps[i].ar_refcount_items, + sizeof(struct xfs_refcount_irec)); + if (error) + do_error( +_("Insufficient memory while allocating refcount item slabs.")); } } @@ -138,6 +145,7 @@ rmaps_free( for (i = 0; i < mp->m_sb.sb_agcount; i++) { free_slab(&ag_rmaps[i].ar_rmaps); free_slab(&ag_rmaps[i].ar_raw_rmaps); + free_slab(&ag_rmaps[i].ar_refcount_items); } free(ag_rmaps); ag_rmaps = NULL; @@ -591,6 +599,228 @@ rmap_dump( #endif /* + * Rebuilding the Reference Count & Reverse Mapping Btrees + * + * The reference count (refcnt) and reverse mapping (rmap) btrees are rebuilt + * during phase 5, like all other AG btrees. Therefore, reverse mappings must + * be processed into reference counts at the end of phase 4, and the rmaps must + * be recorded during phase 4. There is a need to access the rmaps in physical + * block order, but no particular need for random access, so the slab.c code + * provides a big logical array (consisting of smaller slabs) and some inorder + * iterator functions. + * + * Once we've recorded all the reverse mappings, we're ready to translate the + * rmaps into refcount entries. Imagine the rmap entries as rectangles + * representing extents of physical blocks, and that the rectangles can be laid + * down to allow them to overlap each other; then we know that we must emit + * a refcnt btree entry wherever the amount of overlap changes, i.e. the + * emission stimulus is level-triggered: + * + * - --- + * -- ----- ---- --- ------ + * -- ---- ----------- ---- --------- + * -------------------------------- ----------- + * ^ ^ ^^ ^^ ^ ^^ ^^^ ^^^^ ^ ^^ ^ ^ ^ + * 2 1 23 21 3 43 234 2123 1 01 2 3 0 + * + * For our purposes, a rmap is a tuple (startblock, len, fileoff, owner). + * + * Note that in the actual refcnt btree we don't store the refcount < 2 cases + * because the bnobt tells us which blocks are free; single-use blocks aren't + * recorded in the bnobt or the refcntbt. If the rmapbt supports storing + * multiple entries covering a given block we could theoretically dispense with + * the refcntbt and simply count rmaps, but that's inefficient in the (hot) + * write path, so we'll take the cost of the extra tree to save time. Also + * there's no guarantee that rmap will be enabled. + * + * Given an array of rmaps sorted by physical block number, a starting physical + * block (sp), a bag to hold rmaps that cover sp, and the next physical + * block where the level changes (np), we can reconstruct the refcount + * btree as follows: + * + * While there are still unprocessed rmaps in the array, + * - Set sp to the physical block (pblk) of the next unprocessed rmap. + * - Add to the bag all rmaps in the array where startblock == sp. + * - Set np to the physical block where the bag size will change. + * This is the minimum of (the pblk of the next unprocessed rmap) and + * (startblock + len of each rmap in the bag). + * - Record the bag size as old_bag_size. + * + * - While the bag isn't empty, + * - Remove from the bag all rmaps where startblock + len == np. + * - Add to the bag all rmaps in the array where startblock == np. + * - If the bag size isn't old_bag_size, store the refcount entry + * (sp, np - sp, bag_size) in the refcnt btree. + * - If the bag is empty, break out of the inner loop. + * - Set old_bag_size to the bag size + * - Set sp = np. + * - Set np to the physical block where the bag size will change. + * This is the minimum of (the pblk of the next unprocessed rmap) and + * (startblock + len of each rmap in the bag). + * + * An implementation detail is that because this processing happens during + * phase 4, the refcount entries are stored in an array so that phase 5 can + * load them into the refcount btree. The rmaps can be loaded directly into + * the rmap btree during phase 5 as well. + */ + +/* + * Emit a refcount object for refcntbt reconstruction during phase 5. + */ +#define REFCOUNT_CLAMP(nr) ((nr) > MAXREFCOUNT ? MAXREFCOUNT : (nr)) +static void +refcount_emit( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agblock_t agbno, + xfs_extlen_t len, + size_t nr_rmaps) +{ + struct xfs_refcount_irec rlrec; + int error; + struct xfs_slab *rlslab; + + rlslab = ag_rmaps[agno].ar_refcount_items; + ASSERT(nr_rmaps > 0); + + dbg_printf("REFL: agno=%u pblk=%u, len=%u -> refcount=%zu\n", + agno, agbno, len, nr_rmaps); + rlrec.rc_startblock = agbno; + rlrec.rc_blockcount = len; + rlrec.rc_refcount = REFCOUNT_CLAMP(nr_rmaps); + error = slab_add(rlslab, &rlrec); + if (error) + do_error( +_("Insufficient memory while recreating refcount tree.")); +} +#undef REFCOUNT_CLAMP + +/* + * Transform a pile of physical block mapping observations into refcount data + * for eventual rebuilding of the btrees. + */ +#define RMAP_END(r) ((r)->rm_startblock + (r)->rm_blockcount) +int +compute_refcounts( + struct xfs_mount *mp, + xfs_agnumber_t agno) +{ + struct xfs_bag *stack_top = NULL; + struct xfs_slab *rmaps; + struct xfs_slab_cursor *rmaps_cur; + struct xfs_rmap_irec *array_cur; + struct xfs_rmap_irec *rmap; + xfs_agblock_t sbno; /* first bno of this rmap set */ + xfs_agblock_t cbno; /* first bno of this refcount set */ + xfs_agblock_t nbno; /* next bno where rmap set changes */ + size_t n, idx; + size_t old_stack_nr; + int error; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + + rmaps = ag_rmaps[agno].ar_rmaps; + + error = init_slab_cursor(rmaps, rmap_compare, &rmaps_cur); + if (error) + return error; + + error = init_bag(&stack_top); + if (error) + goto err; + + /* While there are rmaps to be processed... */ + n = 0; + while (n < slab_count(rmaps)) { + array_cur = peek_slab_cursor(rmaps_cur); + sbno = cbno = array_cur->rm_startblock; + /* Push all rmaps with pblk == sbno onto the stack */ + for (; + array_cur && array_cur->rm_startblock == sbno; + array_cur = peek_slab_cursor(rmaps_cur)) { + advance_slab_cursor(rmaps_cur); n++; + rmap_dump("push0", agno, array_cur); + error = bag_add(stack_top, array_cur); + if (error) + goto err; + } + + /* Set nbno to the bno of the next refcount change */ + if (n < slab_count(rmaps)) + nbno = array_cur->rm_startblock; + else + nbno = NULLAGBLOCK; + foreach_bag_ptr(stack_top, idx, rmap) { + nbno = min(nbno, RMAP_END(rmap)); + } + + /* Emit reverse mappings, if needed */ + ASSERT(nbno > sbno); + old_stack_nr = bag_count(stack_top); + + /* While stack isn't empty... */ + while (bag_count(stack_top)) { + /* Pop all rmaps that end at nbno */ + foreach_bag_ptr_reverse(stack_top, idx, rmap) { + if (RMAP_END(rmap) != nbno) + continue; + rmap_dump("pop", agno, rmap); + error = bag_remove(stack_top, idx); + if (error) + goto err; + } + + /* Push array items that start at nbno */ + for (; + array_cur && array_cur->rm_startblock == nbno; + array_cur = peek_slab_cursor(rmaps_cur)) { + advance_slab_cursor(rmaps_cur); n++; + rmap_dump("push1", agno, array_cur); + error = bag_add(stack_top, array_cur); + if (error) + goto err; + } + + /* Emit refcount if necessary */ + ASSERT(nbno > cbno); + if (bag_count(stack_top) != old_stack_nr) { + if (old_stack_nr > 1) { + refcount_emit(mp, agno, cbno, + nbno - cbno, + old_stack_nr); + } + cbno = nbno; + } + + /* Stack empty, go find the next rmap */ + if (bag_count(stack_top) == 0) + break; + old_stack_nr = bag_count(stack_top); + sbno = nbno; + + /* Set nbno to the bno of the next refcount change */ + if (n < slab_count(rmaps)) + nbno = array_cur->rm_startblock; + else + nbno = NULLAGBLOCK; + foreach_bag_ptr(stack_top, idx, rmap) { + nbno = min(nbno, RMAP_END(rmap)); + } + + /* Emit reverse mappings, if needed */ + ASSERT(nbno > sbno); + } + } +err: + free_bag(&stack_top); + free_slab_cursor(&rmaps_cur); + + return error; +} +#undef RMAP_END + +/* * Return the number of rmap objects for an AG. */ size_t diff --git a/repair/rmap.h b/repair/rmap.h index 7106dfc..01dec9f 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -49,6 +49,8 @@ extern __int64_t rmap_diffkeys(struct xfs_rmap_irec *kp1, extern void rmap_high_key_from_rec(struct xfs_rmap_irec *rec, struct xfs_rmap_irec *key); +extern int compute_refcounts(struct xfs_mount *, xfs_agnumber_t); + extern void fix_freelist(struct xfs_mount *, xfs_agnumber_t, bool); extern void rmap_store_agflcount(struct xfs_mount *, xfs_agnumber_t, int); From darrick.wong@oracle.com Thu Aug 25 18:53:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AD2AB8299 for ; Thu, 25 Aug 2016 18:53:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 42ECFAC001 for ; Thu, 25 Aug 2016 16:53:29 -0700 (PDT) X-ASG-Debug-ID: 1472169207-0bf81509b01e0c90001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id hOJwBvFckbFycKsd (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNrPJK000815 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:26 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNrP6O013951 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:25 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNrPnw003259; Thu, 25 Aug 2016 23:53:25 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:24 -0700 Subject: [PATCH 63/71] xfs_repair: record reflink inode state From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 63/71] xfs_repair: record reflink inode state To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:23 -0700 Message-ID: <147216920343.4420.16713920861343965579.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169207 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5359 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Record the state of the per-inode reflink flag, so that we can compare against the rmap data and update the flags accordingly. Clear the (reflink) state if we clear the inode. Signed-off-by: Darrick J. Wong --- repair/dino_chunks.c | 1 + repair/dinode.c | 6 ++++++ repair/incore.h | 38 ++++++++++++++++++++++++++++++++++++++ repair/incore_ino.c | 2 ++ repair/rmap.c | 26 ++++++++++++++++++++++++++ repair/rmap.h | 2 ++ 6 files changed, 75 insertions(+) diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 7dbaca6..4db9512 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -931,6 +931,7 @@ next_readbuf: do_warn(_("would have cleared inode %" PRIu64 "\n"), ino); } + clear_inode_was_rl(ino_rec, irec_offset); } process_next: diff --git a/repair/dinode.c b/repair/dinode.c index 98afdc9..64fc983 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -2636,6 +2636,12 @@ _("bad non-zero extent size %u for non-realtime/extsize inode %" PRIu64 ", "), goto clear_bad_out; /* + * record the state of the reflink flag + */ + if (collect_rmaps) + record_inode_reflink_flag(mp, dino, agno, ino, lino); + + /* * check data fork -- if it's bad, clear the inode */ if (process_inode_data_fork(mp, agno, ino, dino, type, dirty, diff --git a/repair/incore.h b/repair/incore.h index b6c4b4f..bcd2f4b 100644 --- a/repair/incore.h +++ b/repair/incore.h @@ -283,6 +283,8 @@ typedef struct ino_tree_node { __uint64_t ir_sparse; /* sparse inode bitmask */ __uint64_t ino_confirmed; /* confirmed bitmask */ __uint64_t ino_isa_dir; /* bit == 1 if a directory */ + __uint64_t ino_was_rl; /* bit == 1 if reflink flag set */ + __uint64_t ino_is_rl; /* bit == 1 if reflink flag should be set */ __uint8_t nlink_size; union ino_nlink disk_nlinks; /* on-disk nlinks, set in P3 */ union { @@ -494,6 +496,42 @@ static inline bool is_inode_sparse(struct ino_tree_node *irec, int offset) } /* + * set/clear/test was inode marked as reflinked + */ +static inline void set_inode_was_rl(struct ino_tree_node *irec, int offset) +{ + irec->ino_was_rl |= IREC_MASK(offset); +} + +static inline void clear_inode_was_rl(struct ino_tree_node *irec, int offset) +{ + irec->ino_was_rl &= ~IREC_MASK(offset); +} + +static inline int inode_was_rl(struct ino_tree_node *irec, int offset) +{ + return (irec->ino_was_rl & IREC_MASK(offset)) != 0; +} + +/* + * set/clear/test should inode be marked as reflinked + */ +static inline void set_inode_is_rl(struct ino_tree_node *irec, int offset) +{ + irec->ino_is_rl |= IREC_MASK(offset); +} + +static inline void clear_inode_is_rl(struct ino_tree_node *irec, int offset) +{ + irec->ino_is_rl &= ~IREC_MASK(offset); +} + +static inline int inode_is_rl(struct ino_tree_node *irec, int offset) +{ + return (irec->ino_is_rl & IREC_MASK(offset)) != 0; +} + +/* * add_inode_reached() is set on inode I only if I has been reached * by an inode P claiming to be the parent and if I is a directory, * the .. link in the I says that P is I's parent. diff --git a/repair/incore_ino.c b/repair/incore_ino.c index 1898257..2ec1765 100644 --- a/repair/incore_ino.c +++ b/repair/incore_ino.c @@ -257,6 +257,8 @@ alloc_ino_node( irec->ino_startnum = starting_ino; irec->ino_confirmed = 0; irec->ino_isa_dir = 0; + irec->ino_was_rl = 0; + irec->ino_is_rl = 0; irec->ir_free = (xfs_inofree_t) - 1; irec->ir_sparse = 0; irec->ino_un.ex_data = NULL; diff --git a/repair/rmap.c b/repair/rmap.c index 0753448..4507420 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -1076,6 +1076,32 @@ rmap_high_key_from_rec( } /* + * Record that an inode had the reflink flag set when repair started. The + * inode reflink flag will be adjusted as necessary. + */ +void +record_inode_reflink_flag( + struct xfs_mount *mp, + struct xfs_dinode *dino, + xfs_agnumber_t agno, + xfs_agino_t ino, + xfs_ino_t lino) +{ + struct ino_tree_node *irec; + int off; + + ASSERT(XFS_AGINO_TO_INO(mp, agno, ino) == be64_to_cpu(dino->di_ino)); + if (!(be64_to_cpu(dino->di_flags2) & XFS_DIFLAG2_REFLINK)) + return; + irec = find_inode_rec(mp, agno, ino); + off = get_inode_offset(mp, lino, irec); + ASSERT(!inode_was_rl(irec, off)); + set_inode_was_rl(irec, off); + dbg_printf("set was_rl lino=%llu was=0x%llx\n", + (unsigned long long)lino, (unsigned long long)irec->ino_was_rl); +} + +/* * Regenerate the AGFL so that we don't run out of it while rebuilding the * rmap btree. If skip_rmapbt is true, don't update the rmapbt (most probably * because we're updating the rmapbt). diff --git a/repair/rmap.h b/repair/rmap.h index 01dec9f..ab6f434 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -50,6 +50,8 @@ extern void rmap_high_key_from_rec(struct xfs_rmap_irec *rec, struct xfs_rmap_irec *key); extern int compute_refcounts(struct xfs_mount *, xfs_agnumber_t); +extern void record_inode_reflink_flag(struct xfs_mount *, struct xfs_dinode *, + xfs_agnumber_t, xfs_agino_t, xfs_ino_t); extern void fix_freelist(struct xfs_mount *, xfs_agnumber_t, bool); extern void rmap_store_agflcount(struct xfs_mount *, xfs_agnumber_t, int); From darrick.wong@oracle.com Thu Aug 25 18:53:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A682882AC for ; Thu, 25 Aug 2016 18:53:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 783DB304039 for ; Thu, 25 Aug 2016 16:53:36 -0700 (PDT) X-ASG-Debug-ID: 1472169213-0bf57c55b31c80f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id aTG5yA7E0Evcjr3T (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:34 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNrWpo000858 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:32 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNrVdv014098 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:32 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNrVRE024024; Thu, 25 Aug 2016 23:53:31 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:31 -0700 Subject: [PATCH 64/71] xfs_repair: fix inode reflink flags From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 64/71] xfs_repair: fix inode reflink flags To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:29 -0700 Message-ID: <147216920968.4420.261618033432866879.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169214 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6323 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines While we're computing reference counts, record which inodes actually share blocks with other files and fix the flags as necessary. Signed-off-by: Darrick J. Wong --- repair/phase4.c | 20 ++++++++ repair/rmap.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ repair/rmap.h | 1 3 files changed, 154 insertions(+) diff --git a/repair/phase4.c b/repair/phase4.c index 86992c9..2c2d611 100644 --- a/repair/phase4.c +++ b/repair/phase4.c @@ -208,6 +208,21 @@ _("%s while computing reference count records.\n"), } static void +process_inode_reflink_flags( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + int error; + + error = fix_inode_reflink_flags(wq->mp, agno); + if (error) + do_error( +_("%s while fixing inode reflink flags.\n"), + strerror(-error)); +} + +static void process_rmap_data( struct xfs_mount *mp) { @@ -229,6 +244,11 @@ process_rmap_data( for (i = 0; i < mp->m_sb.sb_agcount; i++) queue_work(&wq, compute_ag_refcounts, i, NULL); destroy_work_queue(&wq); + + create_work_queue(&wq, mp, libxfs_nproc()); + for (i = 0; i < mp->m_sb.sb_agcount; i++) + queue_work(&wq, process_inode_reflink_flags, i, NULL); + destroy_work_queue(&wq); } void diff --git a/repair/rmap.c b/repair/rmap.c index 4507420..5206206 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -665,6 +665,39 @@ rmap_dump( */ /* + * Mark all inodes in the reverse-mapping observation stack as requiring the + * reflink inode flag, if the stack depth is greater than 1. + */ +static void +mark_inode_rl( + struct xfs_mount *mp, + struct xfs_bag *rmaps) +{ + xfs_agnumber_t iagno; + struct xfs_rmap_irec *rmap; + struct ino_tree_node *irec; + int off; + size_t idx; + xfs_agino_t ino; + + if (bag_count(rmaps) < 2) + return; + + /* Reflink flag accounting */ + foreach_bag_ptr(rmaps, idx, rmap) { + ASSERT(!XFS_RMAP_NON_INODE_OWNER(rmap->rm_owner)); + iagno = XFS_INO_TO_AGNO(mp, rmap->rm_owner); + ino = XFS_INO_TO_AGINO(mp, rmap->rm_owner); + pthread_mutex_lock(&ag_locks[iagno].lock); + irec = find_inode_rec(mp, iagno, ino); + off = get_inode_offset(mp, rmap->rm_owner, irec); + /* lock here because we might go outside this ag */ + set_inode_is_rl(irec, off); + pthread_mutex_unlock(&ag_locks[iagno].lock); + } +} + +/* * Emit a refcount object for refcntbt reconstruction during phase 5. */ #define REFCOUNT_CLAMP(nr) ((nr) > MAXREFCOUNT ? MAXREFCOUNT : (nr)) @@ -745,6 +778,7 @@ compute_refcounts( if (error) goto err; } + mark_inode_rl(mp, stack_top); /* Set nbno to the bno of the next refcount change */ if (n < slab_count(rmaps)) @@ -781,6 +815,7 @@ compute_refcounts( if (error) goto err; } + mark_inode_rl(mp, stack_top); /* Emit refcount if necessary */ ASSERT(nbno > cbno); @@ -1102,6 +1137,104 @@ record_inode_reflink_flag( } /* + * Fix an inode's reflink flag. + */ +static int +fix_inode_reflink_flag( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agino_t agino, + bool set) +{ + struct xfs_dinode *dino; + struct xfs_buf *buf; + + if (set) + do_warn( +_("setting reflink flag on inode %"PRIu64"\n"), + XFS_AGINO_TO_INO(mp, agno, agino)); + else if (!no_modify) /* && !set */ + do_warn( +_("clearing reflink flag on inode %"PRIu64"\n"), + XFS_AGINO_TO_INO(mp, agno, agino)); + if (no_modify) + return 0; + + buf = get_agino_buf(mp, agno, agino, &dino); + if (!buf) + return 1; + ASSERT(XFS_AGINO_TO_INO(mp, agno, agino) == be64_to_cpu(dino->di_ino)); + if (set) + dino->di_flags2 |= cpu_to_be64(XFS_DIFLAG2_REFLINK); + else + dino->di_flags2 &= cpu_to_be64(~XFS_DIFLAG2_REFLINK); + libxfs_dinode_calc_crc(mp, dino); + libxfs_writebuf(buf, 0); + + return 0; +} + +/* + * Fix discrepancies between the state of the inode reflink flag and our + * observations as to whether or not the inode really needs it. + */ +int +fix_inode_reflink_flags( + struct xfs_mount *mp, + xfs_agnumber_t agno) +{ + struct ino_tree_node *irec; + int bit; + __uint64_t was; + __uint64_t is; + __uint64_t diff; + __uint64_t mask; + int error = 0; + xfs_agino_t agino; + + /* + * Update the reflink flag for any inode where there's a discrepancy + * between the inode flag and whether or not we found any reflinked + * extents. + */ + for (irec = findfirst_inode_rec(agno); + irec != NULL; + irec = next_ino_rec(irec)) { + ASSERT((irec->ino_was_rl & irec->ir_free) == 0); + ASSERT((irec->ino_is_rl & irec->ir_free) == 0); + was = irec->ino_was_rl; + is = irec->ino_is_rl; + if (was == is) + continue; + diff = was ^ is; + dbg_printf("mismatch ino=%llu was=0x%lx is=0x%lx dif=0x%lx\n", + (unsigned long long)XFS_AGINO_TO_INO(mp, agno, + irec->ino_startnum), + was, is, diff); + + for (bit = 0, mask = 1; bit < 64; bit++, mask <<= 1) { + agino = bit + irec->ino_startnum; + if (!(diff & mask)) + continue; + else if (was & mask) + error = fix_inode_reflink_flag(mp, agno, agino, + false); + else if (is & mask) + error = fix_inode_reflink_flag(mp, agno, agino, + true); + else + ASSERT(0); + if (error) + do_error( +_("Unable to fix reflink flag on inode %"PRIu64".\n"), + XFS_AGINO_TO_INO(mp, agno, agino)); + } + } + + return error; +} + +/* * Regenerate the AGFL so that we don't run out of it while rebuilding the * rmap btree. If skip_rmapbt is true, don't update the rmapbt (most probably * because we're updating the rmapbt). diff --git a/repair/rmap.h b/repair/rmap.h index ab6f434..266448f 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -52,6 +52,7 @@ extern void rmap_high_key_from_rec(struct xfs_rmap_irec *rec, extern int compute_refcounts(struct xfs_mount *, xfs_agnumber_t); extern void record_inode_reflink_flag(struct xfs_mount *, struct xfs_dinode *, xfs_agnumber_t, xfs_agino_t, xfs_ino_t); +extern int fix_inode_reflink_flags(struct xfs_mount *, xfs_agnumber_t); extern void fix_freelist(struct xfs_mount *, xfs_agnumber_t, bool); extern void rmap_store_agflcount(struct xfs_mount *, xfs_agnumber_t, int); From darrick.wong@oracle.com Thu Aug 25 18:53:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B0DE982B4 for ; Thu, 25 Aug 2016 18:53:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 82ECA8F8033 for ; Thu, 25 Aug 2016 16:53:42 -0700 (PDT) X-ASG-Debug-ID: 1472169220-0bf57b5313209c10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Cma82d5GSoDEB1Uz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:40 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNrcAq001038 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:39 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNrc1H014206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:38 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNrba9002502; Thu, 25 Aug 2016 23:53:37 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:37 -0700 Subject: [PATCH 65/71] xfs_repair: check the refcount btree against our observed reference counts when -n From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 65/71] xfs_repair: check the refcount btree against our observed reference counts when -n To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:35 -0700 Message-ID: <147216921590.4420.3306219015258022080.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169220 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6896 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Check the observed reference counts against whatever's in the refcount btree for discrepancies. Signed-off-by: Darrick J. Wong --- libxfs/libxfs_api_defs.h | 4 + repair/phase4.c | 20 +++++++ repair/rmap.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++ repair/rmap.h | 5 ++ repair/scan.c | 3 + 5 files changed, 158 insertions(+) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index b9eb2cf..28bac11 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -137,4 +137,8 @@ #define xfs_prealloc_blocks libxfs_prealloc_blocks #define xfs_dinode_good_version libxfs_dinode_good_version +#define xfs_refcountbt_init_cursor libxfs_refcountbt_init_cursor +#define xfs_refcount_lookup_le libxfs_refcount_lookup_le +#define xfs_refcount_get_rec libxfs_refcount_get_rec + #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/repair/phase4.c b/repair/phase4.c index 2c2d611..395d373 100644 --- a/repair/phase4.c +++ b/repair/phase4.c @@ -223,6 +223,21 @@ _("%s while fixing inode reflink flags.\n"), } static void +check_refcount_btrees( + work_queue_t *wq, + xfs_agnumber_t agno, + void *arg) +{ + int error; + + error = check_refcounts(wq->mp, agno); + if (error) + do_error( +_("%s while checking reference counts"), + strerror(-error)); +} + +static void process_rmap_data( struct xfs_mount *mp) { @@ -249,6 +264,11 @@ process_rmap_data( for (i = 0; i < mp->m_sb.sb_agcount; i++) queue_work(&wq, process_inode_reflink_flags, i, NULL); destroy_work_queue(&wq); + + create_work_queue(&wq, mp, libxfs_nproc()); + for (i = 0; i < mp->m_sb.sb_agcount; i++) + queue_work(&wq, check_refcount_btrees, i, NULL); + destroy_work_queue(&wq); } void diff --git a/repair/rmap.c b/repair/rmap.c index 5206206..c53d6b7 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -47,6 +47,7 @@ struct xfs_ag_rmap { static struct xfs_ag_rmap *ag_rmaps; static bool rmapbt_suspect; +static bool refcbt_suspect; /* * Compare rmap observations for array sorting. @@ -1235,6 +1236,131 @@ _("Unable to fix reflink flag on inode %"PRIu64".\n"), } /* + * Return the number of refcount objects for an AG. + */ +size_t +refcount_record_count( + struct xfs_mount *mp, + xfs_agnumber_t agno) +{ + return slab_count(ag_rmaps[agno].ar_refcount_items); +} + +/* + * Return a slab cursor that will return refcount objects in order. + */ +int +init_refcount_cursor( + xfs_agnumber_t agno, + struct xfs_slab_cursor **cur) +{ + return init_slab_cursor(ag_rmaps[agno].ar_refcount_items, NULL, cur); +} + +/* + * Disable the refcount btree check. + */ +void +refcount_avoid_check(void) +{ + refcbt_suspect = true; +} + +/* + * Compare the observed reference counts against what's in the ag btree. + */ +int +check_refcounts( + struct xfs_mount *mp, + xfs_agnumber_t agno) +{ + struct xfs_slab_cursor *rl_cur; + struct xfs_btree_cur *bt_cur = NULL; + int error; + int have; + int i; + struct xfs_buf *agbp = NULL; + struct xfs_refcount_irec *rl_rec; + struct xfs_refcount_irec tmp; + struct xfs_perag *pag; /* per allocation group data */ + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) + return 0; + if (refcbt_suspect) { + if (no_modify && agno == 0) + do_warn(_("would rebuild corrupt refcount btrees.\n")); + return 0; + } + + /* Create cursors to refcount structures */ + error = init_refcount_cursor(agno, &rl_cur); + if (error) + return error; + + error = -libxfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + if (error) + goto err; + + /* Leave the per-ag data "uninitialized" since we rewrite it later */ + pag = libxfs_perag_get(mp, agno); + pag->pagf_init = 0; + libxfs_perag_put(pag); + + bt_cur = libxfs_refcountbt_init_cursor(mp, NULL, agbp, agno, NULL); + if (!bt_cur) { + error = -ENOMEM; + goto err; + } + + rl_rec = pop_slab_cursor(rl_cur); + while (rl_rec) { + /* Look for a refcount record in the btree */ + error = -libxfs_refcount_lookup_le(bt_cur, + rl_rec->rc_startblock, &have); + if (error) + goto err; + if (!have) { + do_warn( +_("Missing reference count record for (%u/%u) len %u count %u\n"), + agno, rl_rec->rc_startblock, + rl_rec->rc_blockcount, rl_rec->rc_refcount); + goto next_loop; + } + + error = -libxfs_refcount_get_rec(bt_cur, &tmp, &i); + if (error) + goto err; + if (!i) { + do_warn( +_("Missing reference count record for (%u/%u) len %u count %u\n"), + agno, rl_rec->rc_startblock, + rl_rec->rc_blockcount, rl_rec->rc_refcount); + goto next_loop; + } + + /* Compare each refcount observation against the btree's */ + if (tmp.rc_startblock != rl_rec->rc_startblock || + tmp.rc_blockcount < rl_rec->rc_blockcount || + tmp.rc_refcount < rl_rec->rc_refcount) + do_warn( +_("Incorrect reference count: saw (%u/%u) len %u nlinks %u; should be (%u/%u) len %u nlinks %u\n"), + agno, tmp.rc_startblock, tmp.rc_blockcount, + tmp.rc_refcount, agno, rl_rec->rc_startblock, + rl_rec->rc_blockcount, rl_rec->rc_refcount); +next_loop: + rl_rec = pop_slab_cursor(rl_cur); + } + +err: + if (bt_cur) + libxfs_btree_del_cursor(bt_cur, XFS_BTREE_NOERROR); + if (agbp) + libxfs_putbuf(agbp); + free_slab_cursor(&rl_cur); + return 0; +} + +/* * Regenerate the AGFL so that we don't run out of it while rebuilding the * rmap btree. If skip_rmapbt is true, don't update the rmapbt (most probably * because we're updating the rmapbt). diff --git a/repair/rmap.h b/repair/rmap.h index 266448f..752ece8 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -50,6 +50,11 @@ extern void rmap_high_key_from_rec(struct xfs_rmap_irec *rec, struct xfs_rmap_irec *key); extern int compute_refcounts(struct xfs_mount *, xfs_agnumber_t); +extern size_t refcount_record_count(struct xfs_mount *, xfs_agnumber_t); +extern int init_refcount_cursor(xfs_agnumber_t, struct xfs_slab_cursor **); +extern void refcount_avoid_check(void); +extern int check_refcounts(struct xfs_mount *, xfs_agnumber_t); + extern void record_inode_reflink_flag(struct xfs_mount *, struct xfs_dinode *, xfs_agnumber_t, xfs_agino_t, xfs_ino_t); extern int fix_inode_reflink_flags(struct xfs_mount *, xfs_agnumber_t); diff --git a/repair/scan.c b/repair/scan.c index d3a1a82..1c60784 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1370,6 +1370,8 @@ _("%s btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), } } out: + if (suspect) + refcount_avoid_check(); return; } @@ -2173,6 +2175,7 @@ validate_agf( } else { do_warn(_("bad agbno %u for refcntbt root, agno %d\n"), bno, agno); + refcount_avoid_check(); } } From darrick.wong@oracle.com Thu Aug 25 18:53:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F3E5D811E for ; Thu, 25 Aug 2016 18:53:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 56270AC002 for ; Thu, 25 Aug 2016 16:53:49 -0700 (PDT) X-ASG-Debug-ID: 1472169226-0bf57b5313209c20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id XFAOGTOMTzNjAdif (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:46 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNripo027539 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:53:45 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNri5r009423 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:53:44 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNrhZt024105; Thu, 25 Aug 2016 23:53:44 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:43 -0700 Subject: [PATCH 66/71] xfs_repair: rebuild the refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 66/71] xfs_repair: rebuild the refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:42 -0700 Message-ID: <147216922212.4420.9634068016216710493.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169226 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11538 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Rebuild the refcount btree with the reference count data we assembled during phase 4. Signed-off-by: Darrick J. Wong --- repair/phase5.c | 318 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 316 insertions(+), 2 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index b464b56..1b29043 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -1692,6 +1692,297 @@ _("Insufficient memory to construct reverse-map cursor.")); free_slab_cursor(&rmap_cur); } +/* rebuild the refcount tree */ + +/* + * we don't have to worry here about how chewing up free extents + * may perturb things because reflink tree building happens before + * freespace tree building. + */ +static void +init_refc_cursor( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct bt_status *btree_curs) +{ + size_t num_recs; + int level; + struct bt_stat_level *lptr; + struct bt_stat_level *p_lptr; + xfs_extlen_t blocks_allocated; + + if (!xfs_sb_version_hasreflink(&mp->m_sb)) { + memset(btree_curs, 0, sizeof(struct bt_status)); + return; + } + + lptr = &btree_curs->level[0]; + btree_curs->init = 1; + btree_curs->owner = XFS_RMAP_OWN_REFC; + + /* + * build up statistics + */ + num_recs = refcount_record_count(mp, agno); + if (num_recs == 0) { + /* + * easy corner-case -- no refcount records + */ + lptr->num_blocks = 1; + lptr->modulo = 0; + lptr->num_recs_pb = 0; + lptr->num_recs_tot = 0; + + btree_curs->num_levels = 1; + btree_curs->num_tot_blocks = btree_curs->num_free_blocks = 1; + + setup_cursor(mp, agno, btree_curs); + + return; + } + + blocks_allocated = lptr->num_blocks = howmany(num_recs, + mp->m_refc_mxr[0]); + + lptr->modulo = num_recs % lptr->num_blocks; + lptr->num_recs_pb = num_recs / lptr->num_blocks; + lptr->num_recs_tot = num_recs; + level = 1; + + if (lptr->num_blocks > 1) { + for (; btree_curs->level[level-1].num_blocks > 1 + && level < XFS_BTREE_MAXLEVELS; + level++) { + lptr = &btree_curs->level[level]; + p_lptr = &btree_curs->level[level - 1]; + lptr->num_blocks = howmany(p_lptr->num_blocks, + mp->m_refc_mxr[1]); + lptr->modulo = p_lptr->num_blocks % lptr->num_blocks; + lptr->num_recs_pb = p_lptr->num_blocks + / lptr->num_blocks; + lptr->num_recs_tot = p_lptr->num_blocks; + + blocks_allocated += lptr->num_blocks; + } + } + ASSERT(lptr->num_blocks == 1); + btree_curs->num_levels = level; + + btree_curs->num_tot_blocks = btree_curs->num_free_blocks + = blocks_allocated; + + setup_cursor(mp, agno, btree_curs); +} + +static void +prop_refc_cursor( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct bt_status *btree_curs, + xfs_agblock_t startbno, + int level) +{ + struct xfs_btree_block *bt_hdr; + struct xfs_refcount_key *bt_key; + xfs_refcount_ptr_t *bt_ptr; + xfs_agblock_t agbno; + struct bt_stat_level *lptr; + + level++; + + if (level >= btree_curs->num_levels) + return; + + lptr = &btree_curs->level[level]; + bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); + + if (be16_to_cpu(bt_hdr->bb_numrecs) == 0) { + /* + * this only happens once to initialize the + * first path up the left side of the tree + * where the agbno's are already set up + */ + prop_refc_cursor(mp, agno, btree_curs, startbno, level); + } + + if (be16_to_cpu(bt_hdr->bb_numrecs) == + lptr->num_recs_pb + (lptr->modulo > 0)) { + /* + * write out current prev block, grab us a new block, + * and set the rightsib pointer of current block + */ +#ifdef XR_BLD_INO_TRACE + fprintf(stderr, " ino prop agbno %d ", lptr->prev_agbno); +#endif + if (lptr->prev_agbno != NULLAGBLOCK) { + ASSERT(lptr->prev_buf_p != NULL); + libxfs_writebuf(lptr->prev_buf_p, 0); + } + lptr->prev_agbno = lptr->agbno; + lptr->prev_buf_p = lptr->buf_p; + agbno = get_next_blockaddr(agno, level, btree_curs); + + bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(agbno); + + lptr->buf_p = libxfs_getbuf(mp->m_dev, + XFS_AGB_TO_DADDR(mp, agno, agbno), + XFS_FSB_TO_BB(mp, 1)); + lptr->agbno = agbno; + + if (lptr->modulo) + lptr->modulo--; + + /* + * initialize block header + */ + lptr->buf_p->b_ops = &xfs_refcountbt_buf_ops; + bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); + memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + libxfs_btree_init_block(mp, lptr->buf_p, XFS_REFC_CRC_MAGIC, + level, 0, agno, + XFS_BTREE_CRC_BLOCKS); + + bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); + + /* + * propagate extent record for first extent in new block up + */ + prop_refc_cursor(mp, agno, btree_curs, startbno, level); + } + /* + * add inode info to current block + */ + be16_add_cpu(&bt_hdr->bb_numrecs, 1); + + bt_key = XFS_REFCOUNT_KEY_ADDR(bt_hdr, + be16_to_cpu(bt_hdr->bb_numrecs)); + bt_ptr = XFS_REFCOUNT_PTR_ADDR(bt_hdr, + be16_to_cpu(bt_hdr->bb_numrecs), + mp->m_refc_mxr[1]); + + bt_key->rc_startblock = cpu_to_be32(startbno); + *bt_ptr = cpu_to_be32(btree_curs->level[level-1].agbno); +} + +/* + * rebuilds a refcount btree given a cursor. + */ +static void +build_refcount_tree( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct bt_status *btree_curs) +{ + xfs_agnumber_t i; + xfs_agblock_t j; + xfs_agblock_t agbno; + struct xfs_btree_block *bt_hdr; + struct xfs_refcount_irec *refc_rec; + struct xfs_slab_cursor *refc_cur; + struct xfs_refcount_rec *bt_rec; + struct bt_stat_level *lptr; + int level = btree_curs->num_levels; + int error; + + for (i = 0; i < level; i++) { + lptr = &btree_curs->level[i]; + + agbno = get_next_blockaddr(agno, i, btree_curs); + lptr->buf_p = libxfs_getbuf(mp->m_dev, + XFS_AGB_TO_DADDR(mp, agno, agbno), + XFS_FSB_TO_BB(mp, 1)); + + if (i == btree_curs->num_levels - 1) + btree_curs->root = agbno; + + lptr->agbno = agbno; + lptr->prev_agbno = NULLAGBLOCK; + lptr->prev_buf_p = NULL; + /* + * initialize block header + */ + + lptr->buf_p->b_ops = &xfs_refcountbt_buf_ops; + bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); + memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + libxfs_btree_init_block(mp, lptr->buf_p, XFS_REFC_CRC_MAGIC, + i, 0, agno, + XFS_BTREE_CRC_BLOCKS); + } + + /* + * run along leaf, setting up records. as we have to switch + * blocks, call the prop_refc_cursor routine to set up the new + * pointers for the parent. that can recurse up to the root + * if required. set the sibling pointers for leaf level here. + */ + error = init_refcount_cursor(agno, &refc_cur); + if (error) + do_error( +_("Insufficient memory to construct refcount cursor.")); + refc_rec = pop_slab_cursor(refc_cur); + lptr = &btree_curs->level[0]; + + for (i = 0; i < lptr->num_blocks; i++) { + /* + * block initialization, lay in block header + */ + lptr->buf_p->b_ops = &xfs_refcountbt_buf_ops; + bt_hdr = XFS_BUF_TO_BLOCK(lptr->buf_p); + memset(bt_hdr, 0, mp->m_sb.sb_blocksize); + libxfs_btree_init_block(mp, lptr->buf_p, XFS_REFC_CRC_MAGIC, + 0, 0, agno, + XFS_BTREE_CRC_BLOCKS); + + bt_hdr->bb_u.s.bb_leftsib = cpu_to_be32(lptr->prev_agbno); + bt_hdr->bb_numrecs = cpu_to_be16(lptr->num_recs_pb + + (lptr->modulo > 0)); + + if (lptr->modulo > 0) + lptr->modulo--; + + if (lptr->num_recs_pb > 0) + prop_refc_cursor(mp, agno, btree_curs, + refc_rec->rc_startblock, 0); + + bt_rec = (struct xfs_refcount_rec *) + ((char *)bt_hdr + XFS_REFCOUNT_BLOCK_LEN); + for (j = 0; j < be16_to_cpu(bt_hdr->bb_numrecs); j++) { + ASSERT(refc_rec != NULL); + bt_rec[j].rc_startblock = + cpu_to_be32(refc_rec->rc_startblock); + bt_rec[j].rc_blockcount = + cpu_to_be32(refc_rec->rc_blockcount); + bt_rec[j].rc_refcount = cpu_to_be32(refc_rec->rc_refcount); + + refc_rec = pop_slab_cursor(refc_cur); + } + + if (refc_rec != NULL) { + /* + * get next leaf level block + */ + if (lptr->prev_buf_p != NULL) { +#ifdef XR_BLD_RL_TRACE + fprintf(stderr, "writing refcntbt agbno %u\n", + lptr->prev_agbno); +#endif + ASSERT(lptr->prev_agbno != NULLAGBLOCK); + libxfs_writebuf(lptr->prev_buf_p, 0); + } + lptr->prev_buf_p = lptr->buf_p; + lptr->prev_agbno = lptr->agbno; + lptr->agbno = get_next_blockaddr(agno, 0, btree_curs); + bt_hdr->bb_u.s.bb_rightsib = cpu_to_be32(lptr->agbno); + + lptr->buf_p = libxfs_getbuf(mp->m_dev, + XFS_AGB_TO_DADDR(mp, agno, lptr->agbno), + XFS_FSB_TO_BB(mp, 1)); + } + } + free_slab_cursor(&refc_cur); +} + /* * build both the agf and the agfl for an agno given both * btree cursors. @@ -1706,7 +1997,8 @@ build_agf_agfl( struct bt_status *bcnt_bt, xfs_extlen_t freeblks, /* # free blocks in tree */ int lostblocks, /* # blocks that will be lost */ - struct bt_status *rmap_bt) + struct bt_status *rmap_bt, + struct bt_status *refcnt_bt) { struct extent_tree_node *ext_ptr; struct xfs_buf *agf_buf, *agfl_buf; @@ -1750,6 +2042,10 @@ build_agf_agfl( agf->agf_freeblks = cpu_to_be32(freeblks); agf->agf_rmap_blocks = cpu_to_be32(rmap_bt->num_tot_blocks - rmap_bt->num_free_blocks); + agf->agf_refcount_root = cpu_to_be32(refcnt_bt->root); + agf->agf_refcount_level = cpu_to_be32(refcnt_bt->num_levels); + agf->agf_refcount_blocks = cpu_to_be32(refcnt_bt->num_tot_blocks - + refcnt_bt->num_free_blocks); /* * Count and record the number of btree blocks consumed if required. @@ -1867,6 +2163,10 @@ build_agf_agfl( ASSERT(be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNOi]) != be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNTi])); + ASSERT(be32_to_cpu(agf->agf_refcount_root) != + be32_to_cpu(agf->agf_roots[XFS_BTNUM_BNOi])); + ASSERT(be32_to_cpu(agf->agf_refcount_root) != + be32_to_cpu(agf->agf_roots[XFS_BTNUM_CNTi])); libxfs_writebuf(agf_buf, 0); @@ -1936,6 +2236,7 @@ phase5_func( bt_status_t ino_btree_curs; bt_status_t fino_btree_curs; bt_status_t rmap_btree_curs; + bt_status_t refcnt_btree_curs; int extra_blocks = 0; uint num_freeblocks; xfs_extlen_t freeblks1; @@ -1998,6 +2299,12 @@ phase5_func( */ init_rmapbt_cursor(mp, agno, &rmap_btree_curs); + /* + * Set up the btree cursors for the on-disk refcount btrees, + * which includes pre-allocating all required blocks. + */ + init_refc_cursor(mp, agno, &refcnt_btree_curs); + num_extents = count_bno_extents_blocks(agno, &num_freeblocks); /* * lose two blocks per AG -- the space tree roots @@ -2091,12 +2398,17 @@ phase5_func( rmap_btree_curs.num_free_blocks) - 1; } + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + build_refcount_tree(mp, agno, &refcnt_btree_curs); + write_cursor(&refcnt_btree_curs); + } + /* * set up agf and agfl */ build_agf_agfl(mp, agno, &bno_btree_curs, &bcnt_btree_curs, freeblks1, extra_blocks, - &rmap_btree_curs); + &rmap_btree_curs, &refcnt_btree_curs); /* * build inode allocation tree. */ @@ -2127,6 +2439,8 @@ phase5_func( finish_cursor(&ino_btree_curs); if (xfs_sb_version_hasrmapbt(&mp->m_sb)) finish_cursor(&rmap_btree_curs); + if (xfs_sb_version_hasreflink(&mp->m_sb)) + finish_cursor(&refcnt_btree_curs); if (xfs_sb_version_hasfinobt(&mp->m_sb)) finish_cursor(&fino_btree_curs); finish_cursor(&bcnt_btree_curs); From darrick.wong@oracle.com Thu Aug 25 18:53:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D66F182C0 for ; Thu, 25 Aug 2016 18:53:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8E5D0304043 for ; Thu, 25 Aug 2016 16:53:55 -0700 (PDT) X-ASG-Debug-ID: 1472169233-0bf81509b01e0e30001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id PMF5pNXX8kid5nYf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:53 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNrp7Y001253 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:53:52 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNrpDM001960 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:51 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNrojG020802; Thu, 25 Aug 2016 23:53:50 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:49 -0700 Subject: [PATCH 67/71] xfs_repair: complain about copy-on-write leftovers From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 67/71] xfs_repair: complain about copy-on-write leftovers To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:48 -0700 Message-ID: <147216922840.4420.18424767230279439467.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169233 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3959 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Complain about leftover CoW allocations that are hanging off the refcount btree. These are cleaned out at mount time, but we could be louder about flagging down evidence of trouble. Since these extents aren't "owned" by anything, we'll free them up by reconstructing the free space btrees. v2: When we're processing rmap records, we inadvertently forgot to handle the CoW owner, so the leftover CoW staging blocks got marked as file data. These blocks will just get freed later, so mark them "CoW". When we process the refcountbt, complain about leftovers if the type is unknown or "CoW". Signed-off-by: Darrick J. Wong --- db/check.c | 21 +++++++++++++++++---- repair/incore.h | 3 ++- repair/scan.c | 26 +++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/db/check.c b/db/check.c index 5b90182..7392852 100644 --- a/db/check.c +++ b/db/check.c @@ -45,7 +45,7 @@ typedef enum { DBM_LOG, DBM_MISSING, DBM_QUOTA, DBM_RTBITMAP, DBM_RTDATA, DBM_RTFREE, DBM_RTSUM, DBM_SB, DBM_SYMLINK, DBM_BTFINO, DBM_BTRMAP, DBM_BTREFC, - DBM_RLDATA, + DBM_RLDATA, DBM_COWDATA, DBM_NDBM } dbm_t; @@ -4731,9 +4731,22 @@ scanfunc_refcnt( rp = XFS_REFCOUNT_REC_ADDR(block, 1); lastblock = 0; for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { - set_dbmap(seqno, be32_to_cpu(rp[i].rc_startblock), - be32_to_cpu(rp[i].rc_blockcount), DBM_RLDATA, - seqno, bno); + if (be32_to_cpu(rp[i].rc_refcount) == 1) { + dbprintf(_( + "leftover CoW extent (%u/%u) len %u\n"), + seqno, + be32_to_cpu(rp[i].rc_startblock), + be32_to_cpu(rp[i].rc_blockcount)); + set_dbmap(seqno, + be32_to_cpu(rp[i].rc_startblock), + be32_to_cpu(rp[i].rc_blockcount), + DBM_COWDATA, seqno, bno); + } else { + set_dbmap(seqno, + be32_to_cpu(rp[i].rc_startblock), + be32_to_cpu(rp[i].rc_blockcount), + DBM_RLDATA, seqno, bno); + } if (be32_to_cpu(rp[i].rc_startblock) < lastblock) { dbprintf(_( "out-of-order refcnt btree record %d (%u %u) block %u/%u\n"), diff --git a/repair/incore.h b/repair/incore.h index bcd2f4b..c23a3a3 100644 --- a/repair/incore.h +++ b/repair/incore.h @@ -107,7 +107,8 @@ typedef struct rt_extent_tree_node { #define XR_E_INO1 10 /* used by inodes (marked by rmap btree) */ #define XR_E_FS_MAP1 11 /* used by fs space/inode maps (rmap btree) */ #define XR_E_REFC 12 /* used by fs ag reference count btree */ -#define XR_E_BAD_STATE 13 +#define XR_E_COW 13 /* leftover cow extent */ +#define XR_E_BAD_STATE 14 /* separate state bit, OR'ed into high (4th) bit of ex_state field */ diff --git a/repair/scan.c b/repair/scan.c index 1c60784..499253e 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -813,6 +813,9 @@ process_rmap_rec( case XFS_RMAP_OWN_REFC: set_bmap_ext(agno, b, blen, XR_E_REFC); break; + case XFS_RMAP_OWN_COW: + set_bmap_ext(agno, b, blen, XR_E_COW); + break; case XFS_RMAP_OWN_NULL: /* still unknown */ break; @@ -1310,7 +1313,28 @@ _("%s btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), continue; } - if (nr < 2 || nr > MAXREFCOUNT) { + if (nr == 1) { + xfs_agblock_t c; + xfs_extlen_t cnr; + + for (c = b; c < end; c += cnr) { + state = get_bmap_ext(agno, c, end, &cnr); + switch (state) { + case XR_E_UNKNOWN: + case XR_E_COW: + do_warn( +_("leftover CoW extent (%u/%u) len %u\n"), + agno, c, cnr); + set_bmap_ext(agno, c, cnr, XR_E_FREE); + break; + default: + do_warn( +_("extent (%u/%u) len %u claimed, state is %d\n"), + agno, c, cnr, state); + break; + } + } + } else if (nr < 2 || nr > MAXREFCOUNT) { do_warn( _("invalid reference count %u in record %u of %s btree block %u/%u\n"), nr, i, name, agno, bno); From darrick.wong@oracle.com Thu Aug 25 18:54:01 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8C9B682BA for ; Thu, 25 Aug 2016 18:54:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1108DAC002 for ; Thu, 25 Aug 2016 16:54:00 -0700 (PDT) X-ASG-Debug-ID: 1472169239-0bf8155c741e8eb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id srZLeCAf0QBoPJ2z (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:53:59 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNrvkO027668 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:53:58 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNrv3F009748 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:53:57 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNruc0002550; Thu, 25 Aug 2016 23:53:56 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:53:55 -0700 Subject: [PATCH 68/71] xfs_repair: check the CoW extent size hint From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 68/71] xfs_repair: check the CoW extent size hint To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:53:54 -0700 Message-ID: <147216923461.4420.8008292314107955095.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169239 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2405 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- repair/dinode.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/repair/dinode.c b/repair/dinode.c index 64fc983..11b60ce 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -2531,6 +2531,38 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), goto clear_bad_out; } + if ((flags2 & XFS_DIFLAG2_COWEXTSIZE) && + !xfs_sb_version_hasreflink(&mp->m_sb)) { + if (!uncertain) { + do_warn( + _("inode %" PRIu64 " has CoW extent size hint but file system does not support reflink\n"), + lino); + } + flags2 &= ~XFS_DIFLAG2_COWEXTSIZE; + } + + if (flags2 & XFS_DIFLAG2_COWEXTSIZE) { + /* must be a directory or file */ + if (di_mode && !S_ISDIR(di_mode) && !S_ISREG(di_mode)) { + if (!uncertain) { + do_warn( + _("CoW extent size flag set on non-file, non-directory inode %" PRIu64 "\n" ), + lino); + } + flags2 &= ~XFS_DIFLAG2_COWEXTSIZE; + } + } + + if ((flags2 & XFS_DIFLAG2_COWEXTSIZE) && + (flags & (XFS_DIFLAG_REALTIME | XFS_DIFLAG_RTINHERIT))) { + if (!uncertain) { + do_warn( + _("Cannot have CoW extent size hint on a realtime inode %" PRIu64 "\n"), + lino); + } + flags2 &= ~XFS_DIFLAG2_COWEXTSIZE; + } + if (!verify_mode && flags2 != be64_to_cpu(dino->di_flags2)) { if (!no_modify) { do_warn(_("fixing bad flags2.\n")); @@ -2624,6 +2656,29 @@ _("bad non-zero extent size %u for non-realtime/extsize inode %" PRIu64 ", "), } /* + * Only (regular files and directories) with COWEXTSIZE flags + * set can have extsize set. + */ + if (dino->di_version >= 3 && + be32_to_cpu(dino->di_cowextsize) != 0) { + if ((type == XR_INO_DIR || type == XR_INO_DATA) && + (be64_to_cpu(dino->di_flags2) & + XFS_DIFLAG2_COWEXTSIZE)) { + /* s'okay */ ; + } else { + do_warn( +_("Cannot have non-zero CoW extent size %u on non-cowextsize inode %" PRIu64 ", "), + be32_to_cpu(dino->di_cowextsize), lino); + if (!no_modify) { + do_warn(_("resetting to zero\n")); + dino->di_cowextsize = 0; + *dirty = 1; + } else + do_warn(_("would reset to zero\n")); + } + } + + /* * general size/consistency checks: */ if (process_check_inode_sizes(mp, dino, lino, type) != 0) From darrick.wong@oracle.com Thu Aug 25 18:54:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4B0A182BE for ; Thu, 25 Aug 2016 18:54:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1F0B88F8033 for ; Thu, 25 Aug 2016 16:54:06 -0700 (PDT) X-ASG-Debug-ID: 1472169244-0bf57c55b31c8100001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 9HcHLOpgZArJOc0x (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:54:04 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNs2iN001535 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:54:03 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNs2iu010012 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:54:02 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNs2ZW020817; Thu, 25 Aug 2016 23:54:02 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:54:02 -0700 Subject: [PATCH 69/71] xfs_repair: use range query when while checking rmaps From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 69/71] xfs_repair: use range query when while checking rmaps To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:54:00 -0700 Message-ID: <147216924076.4420.12782764054758153515.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169244 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2711 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines For shared extents, we ought to use a range query on the rmapbt to find the corresponding rmap. However, most of the time the observed rmap will be an exact match for the rmapbt rmap, in which case we could have used the (much faster) regular lookup. Therefore, try the regular lookup first and resort to the range lookup if that doesn't get us what we want. This can cut the run time of the rmap check of xfs_repair in half. Theoretically, the only reason why an observed rmap wouldn't be an exact match for an rmapbt rmap is because we modified some file on account of a metadata error. Signed-off-by: Darrick J. Wong --- libxfs/libxfs_api_defs.h | 1 + repair/rmap.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 28bac11..8026522 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -140,5 +140,6 @@ #define xfs_refcountbt_init_cursor libxfs_refcountbt_init_cursor #define xfs_refcount_lookup_le libxfs_refcount_lookup_le #define xfs_refcount_get_rec libxfs_refcount_get_rec +#define xfs_rmap_lookup_le_range libxfs_rmap_lookup_le_range #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/repair/rmap.c b/repair/rmap.c index c53d6b7..597655b 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -909,6 +909,20 @@ rmap_lookup( return -libxfs_rmap_get_rec(bt_cur, tmp, have); } +/* Look for an rmap in the rmapbt that matches a given rmap. */ +static int +rmap_lookup_overlapped( + struct xfs_btree_cur *bt_cur, + struct xfs_rmap_irec *rm_rec, + struct xfs_rmap_irec *tmp, + int *have) +{ + /* Have to use our fancy version for overlapped */ + return -libxfs_rmap_lookup_le_range(bt_cur, rm_rec->rm_startblock, + rm_rec->rm_owner, rm_rec->rm_offset, + rm_rec->rm_flags, tmp, have); +} + /* Does the btree rmap cover the observed rmap? */ #define NEXTP(x) ((x)->rm_startblock + (x)->rm_blockcount) #define NEXTL(x) ((x)->rm_offset + (x)->rm_blockcount) @@ -997,6 +1011,18 @@ rmaps_verify_btree( error = rmap_lookup(bt_cur, rm_rec, &tmp, &have); if (error) goto err; + /* + * Using the range query is expensive, so only do it if + * the regular lookup doesn't find anything or if it doesn't + * match the observed rmap. + */ + if (xfs_sb_version_hasreflink(&bt_cur->bc_mp->m_sb) && + (!have || !rmap_is_good(rm_rec, &tmp))) { + error = rmap_lookup_overlapped(bt_cur, rm_rec, + &tmp, &have); + if (error) + goto err; + } if (!have) { do_warn( _("Missing reverse-mapping record for (%u/%u) %slen %u owner %"PRId64" \ From darrick.wong@oracle.com Thu Aug 25 18:54:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DE3FC82D6 for ; Thu, 25 Aug 2016 18:54:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 531F8AC001 for ; Thu, 25 Aug 2016 16:54:13 -0700 (PDT) X-ASG-Debug-ID: 1472169251-0bf57c55b31c8110001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id h1hwwQX2pzXRkqzm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:54:11 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNsAWM027996 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:54:10 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNs99C002729 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:54:10 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNs9M1003529; Thu, 25 Aug 2016 23:54:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:54:09 -0700 Subject: [PATCH 70/71] xfs_repair: check for mergeable refcount records From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 70/71] xfs_repair: check for mergeable refcount records To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:54:06 -0700 Message-ID: <147216924692.4420.10874812188502361823.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169251 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2578 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make sure there aren't adjacent refcount records that could be merged; this is a sign that the refcount tree algorithms aren't working correctly. Signed-off-by: Darrick J. Wong --- repair/scan.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/repair/scan.c b/repair/scan.c index 499253e..f4d6f89 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1215,6 +1215,12 @@ out: rmap_avoid_check(); } +struct refc_priv { + struct xfs_refcount_irec last_rec; + xfs_agblock_t nr_blocks; +}; + + static void scan_refcbt( struct xfs_btree_block *block, @@ -1234,6 +1240,7 @@ scan_refcbt( int numrecs; int state; xfs_agblock_t lastblock = 0; + struct refc_priv *refc_priv = priv; if (magic != XFS_REFC_CRC_MAGIC) { name = "(unknown)"; @@ -1258,6 +1265,8 @@ scan_refcbt( goto out; } + refc_priv->nr_blocks++; + /* check for btree blocks multiply claimed */ state = get_bmap(agno, bno); if (!(state == XR_E_UNKNOWN || state == XR_E_REFC)) { @@ -1349,6 +1358,20 @@ _("extent (%u/%u) len %u claimed, state is %d\n"), lastblock = b; } + /* Is this record mergeable with the last one? */ + if (refc_priv->last_rec.rc_startblock + + refc_priv->last_rec.rc_blockcount == b && + refc_priv->last_rec.rc_refcount == nr) { + do_warn( + _("record %d in block (%u/%u) of %s tree should be merged with previous record\n"), + i, agno, bno, name); + refc_priv->last_rec.rc_blockcount += len; + } else { + refc_priv->last_rec.rc_startblock = b; + refc_priv->last_rec.rc_blockcount = len; + refc_priv->last_rec.rc_refcount = nr; + } + /* XXX: probably want to mark the reflinked areas? */ } goto out; @@ -2192,10 +2215,17 @@ validate_agf( if (xfs_sb_version_hasreflink(&mp->m_sb)) { bno = be32_to_cpu(agf->agf_refcount_root); if (bno != 0 && verify_agbno(mp, agno, bno)) { + struct refc_priv priv; + + memset(&priv, 0, sizeof(priv)); scan_sbtree(bno, be32_to_cpu(agf->agf_refcount_level), agno, 0, scan_refcbt, 1, XFS_REFC_CRC_MAGIC, - agcnts, &xfs_refcountbt_buf_ops); + &priv, &xfs_refcountbt_buf_ops); + if (be32_to_cpu(agf->agf_refcount_blocks) != priv.nr_blocks) + do_warn(_("bad refcountbt block count %u, saw %u\n"), + priv.nr_blocks, + be32_to_cpu(agf->agf_refcount_blocks)); } else { do_warn(_("bad agbno %u for refcntbt root, agno %d\n"), bno, agno); From darrick.wong@oracle.com Thu Aug 25 18:54:24 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EE24682E2 for ; Thu, 25 Aug 2016 18:54:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A30CF8F8037 for ; Thu, 25 Aug 2016 16:54:23 -0700 (PDT) X-ASG-Debug-ID: 1472169261-0bf57b5314209cc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id LvUeCogVatJCOQja (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:54:21 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNsJ8b028084 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:54:20 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNsJEw010313 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:54:19 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNsGHT020892; Thu, 25 Aug 2016 23:54:19 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:54:15 -0700 Subject: [PATCH 71/71] mkfs.xfs: format reflink enabled filesystems From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 71/71] mkfs.xfs: format reflink enabled filesystems To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:54:14 -0700 Message-ID: <147216925429.4420.3323449215866524186.stgit@birch.djwong.org> In-Reply-To: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> References: <147216879156.4420.2446767701729565218.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169261 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9784 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580D, BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.75 BSF_RULE_7580D Custom Rule 7580D Create the refcount btree at mkfs time and set the feature flag. v2: Turn on the reflink feature when calculating the minimum log size. Signed-off-by: Darrick J. Wong --- include/xfs_multidisk.h | 3 +- libxfs/libxfs_api_defs.h | 1 + man/man8/mkfs.xfs.8 | 28 ++++++++++++++++++ mkfs/maxtrres.c | 5 +++ mkfs/xfs_mkfs.c | 70 ++++++++++++++++++++++++++++++++++++++++++---- 5 files changed, 99 insertions(+), 8 deletions(-) diff --git a/include/xfs_multidisk.h b/include/xfs_multidisk.h index 8dc3027..ce9bbce 100644 --- a/include/xfs_multidisk.h +++ b/include/xfs_multidisk.h @@ -68,6 +68,7 @@ extern void res_failed (int err); /* maxtrres.c */ extern int max_trans_res(unsigned long agsize, int crcs_enabled, int dirversion, int sectorlog, int blocklog, int inodelog, int dirblocklog, - int logversion, int log_sunit, int finobt, int rmapbt); + int logversion, int log_sunit, int finobt, int rmapbt, + int reflink); #endif /* __XFS_MULTIDISK_H__ */ diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 8026522..8d57a66 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -141,5 +141,6 @@ #define xfs_refcount_lookup_le libxfs_refcount_lookup_le #define xfs_refcount_get_rec libxfs_refcount_get_rec #define xfs_rmap_lookup_le_range libxfs_rmap_lookup_le_range +#define xfs_refc_block libxfs_refc_block #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/man/man8/mkfs.xfs.8 b/man/man8/mkfs.xfs.8 index 9578c4d..6dab46a 100644 --- a/man/man8/mkfs.xfs.8 +++ b/man/man8/mkfs.xfs.8 @@ -213,6 +213,34 @@ for filesystems created with the (default) option set. When the option .B \-m crc=0 is used, the reverse mapping btree feature is not supported and is disabled. +.TP +.BI reflink= value +This option enables the use of a separate reference count btree index in each +allocation group. The value is either 0 to disable the feature, or 1 to create +a reference count btree in each allocation group. +.IP +The reference count btree enables the sharing of physical extents between +the data forks of different files, which is commonly known as "reflink". +Unlike traditional Unix filesystems which assume that every inode and +logical block pair map to a unique physical block, a reflink-capable +XFS filesystem removes the uniqueness requirement, allowing up to four +billion arbitrary inode/logical block pairs to map to a physical block. +If a program tries to write to a multiply-referenced block in a file, the write +will be redirected to a new block, and that file's logical-to-physical +mapping will be changed to the new block ("copy on write"). This feature +enables the creation of per-file snapshots and deduplication. It is only +available for the data forks of regular files. +.IP +By default, +.B mkfs.xfs +will not create reference count btrees and therefore will not enable the +reflink feature. This feature is only available for filesystems created with +the (default) +.B \-m crc=1 +option set. When the option +.B \-m crc=0 +is used, the reference count btree feature is not supported and reflink is +disabled. .RE .TP .BI \-d " data_section_options" diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index d7978b6..fba7818 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -39,7 +39,8 @@ max_trans_res( int logversion, int log_sunit, int finobt, - int rmapbt) + int rmapbt, + int reflink) { xfs_sb_t *sbp; xfs_mount_t mount; @@ -75,6 +76,8 @@ max_trans_res( sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_FINOBT; if (rmapbt) sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_RMAPBT; + if (reflink) + sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_REFLINK; libxfs_mount(&mount, sbp, 0,0,0,0); maxfsb = libxfs_log_calc_minimum_size(&mount); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 580119e..fc565c0 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -672,6 +672,8 @@ struct opt_params mopts = { "uuid", #define M_RMAPBT 3 "rmapbt", +#define M_REFLINK 4 + "reflink", NULL }, .subopt_params = { @@ -697,6 +699,12 @@ struct opt_params mopts = { .maxval = 1, .defaultval = 0, }, + { .index = M_REFLINK, + .conflicts = { LAST_CONFLICT }, + .minval = 0, + .maxval = 1, + .defaultval = 0, + }, }, }; @@ -1155,6 +1163,7 @@ struct sb_feat_args { bool dirftype; bool parent_pointers; bool rmapbt; + bool reflink; }; static void @@ -1227,6 +1236,8 @@ sb_set_features( sbp->sb_features_ro_compat = XFS_SB_FEAT_RO_COMPAT_FINOBT; if (fp->rmapbt) sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_RMAPBT; + if (fp->reflink) + sbp->sb_features_ro_compat |= XFS_SB_FEAT_RO_COMPAT_REFLINK; /* * Sparse inode chunk support has two main inode alignment requirements. @@ -1488,6 +1499,7 @@ main( .dirftype = true, .parent_pointers = false, .rmapbt = false, + .reflink = false, }; platform_uuid_generate(&uuid); @@ -1776,6 +1788,10 @@ main( sb_feat.rmapbt = getnum( value, &mopts, M_RMAPBT); break; + case M_REFLINK: + sb_feat.reflink = getnum( + value, &mopts, M_REFLINK); + break; default: unknown('m', value); } @@ -2115,6 +2131,13 @@ _("rmapbt not supported without CRC support\n")); usage(); } sb_feat.rmapbt = false; + + if (sb_feat.reflink) { + fprintf(stderr, +_("reflink not supported without CRC support\n")); + usage(); + } + sb_feat.reflink = false; } @@ -2599,7 +2622,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), sb_feat.crcs_enabled, sb_feat.dir_version, sectorlog, blocklog, inodelog, dirblocklog, sb_feat.log_version, lsunit, sb_feat.finobt, - sb_feat.rmapbt); + sb_feat.rmapbt, sb_feat.reflink); ASSERT(min_logblocks); min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks); if (!logsize && dblocks >= (1024*1024*1024) >> blocklog) @@ -2734,7 +2757,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), printf(_( "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" " =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n" - " =%-22s crc=%-8u finobt=%u, sparse=%u, rmapbt=%u\n" + " =%-22s crc=%-8u finobt=%u, sparse=%u, rmapbt=%u, reflink=%u\n" "data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n" " =%-22s sunit=%-6u swidth=%u blks\n" "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n" @@ -2745,7 +2768,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), "", sectorsize, sb_feat.attr_version, !sb_feat.projid16bit, "", sb_feat.crcs_enabled, sb_feat.finobt, sb_feat.spinodes, - sb_feat.rmapbt, + sb_feat.rmapbt, sb_feat.reflink, "", blocksize, (long long)dblocks, imaxpct, "", dsunit, dswidth, sb_feat.dir_version, dirblocksize, sb_feat.nci, @@ -2933,7 +2956,12 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), agf->agf_levels[XFS_BTNUM_RMAPi] = cpu_to_be32(1); agf->agf_rmap_blocks = cpu_to_be32(1); } - + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + agf->agf_refcount_root = cpu_to_be32( + libxfs_refc_block(mp)); + agf->agf_refcount_level = cpu_to_be32(1); + agf->agf_refcount_blocks = cpu_to_be32(1); + } agf->agf_flfirst = 0; agf->agf_fllast = cpu_to_be32(XFS_AGFL_SIZE(mp) - 1); agf->agf_flcount = 0; @@ -3102,6 +3130,24 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); /* + * refcount btree root block + */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + buf = libxfs_getbuf(mp->m_ddev_targp, + XFS_AGB_TO_DADDR(mp, agno, + libxfs_refc_block(mp)), + bsize); + buf->b_ops = &xfs_refcountbt_buf_ops; + + block = XFS_BUF_TO_BLOCK(buf); + memset(block, 0, blocksize); + libxfs_btree_init_block(mp, buf, XFS_REFC_CRC_MAGIC, 0, + 0, agno, XFS_BTREE_CRC_BLOCKS); + + libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); + } + + /* * INO btree root block */ buf = libxfs_getbuf(mp->m_ddev_targp, @@ -3189,9 +3235,21 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), rrec->rm_offset = 0; be16_add_cpu(&block->bb_numrecs, 1); + /* account for refcount btree root */ + if (xfs_sb_version_hasreflink(&mp->m_sb)) { + rrec = XFS_RMAP_REC_ADDR(block, 5); + rrec->rm_startblock = cpu_to_be32( + libxfs_refc_block(mp)); + rrec->rm_blockcount = cpu_to_be32(1); + rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_REFC); + rrec->rm_offset = 0; + be16_add_cpu(&block->bb_numrecs, 1); + } + /* account for the log space */ if (loginternal && agno == logagno) { - rrec = XFS_RMAP_REC_ADDR(block, 5); + rrec = XFS_RMAP_REC_ADDR(block, + be16_to_cpu(block->bb_numrecs) + 1); rrec->rm_startblock = cpu_to_be32( XFS_FSB_TO_AGBNO(mp, logstart)); rrec->rm_blockcount = cpu_to_be32(logblocks); @@ -3446,7 +3504,7 @@ usage( void ) { fprintf(stderr, _("Usage: %s\n\ /* blocksize */ [-b log=n|size=num]\n\ -/* metadata */ [-m crc=0|1,finobt=0|1,uuid=xxx,rmapbt=0|1]\n\ +/* metadata */ [-m crc=0|1,finobt=0|1,uuid=xxx,rmapbt=0|1,reflink=0|1]\n\ /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\ (sunit=value,swidth=value|su=num,sw=num|noalign),\n\ sectlog=n|sectsize=num\n\ From darrick.wong@oracle.com Thu Aug 25 18:55:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ADBD882EE for ; Thu, 25 Aug 2016 18:55:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 768A8304039 for ; Thu, 25 Aug 2016 16:55:25 -0700 (PDT) X-ASG-Debug-ID: 1472169323-0bf57b5311209d50001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id r1YFZdvZ1jQgu55C (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:55:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNtMeU002367 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:55:22 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNtMTP011777 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:55:22 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNtKxX021278; Thu, 25 Aug 2016 23:55:21 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:55:20 -0700 Subject: [PATCH v8 00/24] xfsprogs: online scrub support From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 00/24] xfsprogs: online scrub support To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:55:18 -0700 Message-ID: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169323 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2472 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. The first few patches implement the GETFSMAP ioctl and xfs_io support for testing. Following that are ports of the kernel patches that touch libxfs/, and the customary xfs_io support for that as well. The huge patch at the end implements xfs_scrub, which is a tool that walks the file system to find and check as much metadata as it can. scrub/generic.c and scrub/xfs.c both contain large comments documenting exactly how scrub works, so I will not rehash them in great depth here. We aggressively use XFS' online metadata scrub features to scour all per-AG and per-FS metadata. Then, we use BULKSTAT, open_by_handle, GETBMAPX, and online scrub to rapidly examine every inode and extent map in the filesystem. Finally, if data extent scrubbing is switched on, we use GETFSMAP to find physical extents that need scanning -- with rmap enabled, we can narrow it down to target only file data blocks; without it, the bnobt backend to GETFSMAP provides us a map of the free space, which is good enough to (over)scan the disk. If the underlying disks are SCSI devices, we can issue READ VERIFY commands to do the verify without consuming wire bandwidth. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:55:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F1E0882F4 for ; Thu, 25 Aug 2016 18:55:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 84DE1AC003 for ; Thu, 25 Aug 2016 16:55:30 -0700 (PDT) X-ASG-Debug-ID: 1472169328-0bf81509b01e1180001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id S84b1x9495FjRE1v (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:55:28 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNtRDd002400 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:55:27 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNtRL2011875 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:55:27 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNtQoc021361; Thu, 25 Aug 2016 23:55:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:55:26 -0700 Subject: [PATCH 01/24] xfs: introduce the XFS_IOC_GETFSMAP ioctl From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/24] xfs: introduce the XFS_IOC_GETFSMAP ioctl To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:55:25 -0700 Message-ID: <147216932511.6398.11162170353495454793.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169328 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4059 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Introduce a new ioctl that uses the reverse mapping btree to return information about the physical layout of the filesystem. v2: shorten the device field to u32 since that's all we need for dev_t. Support reporting reverse mapping information for all the devices that XFS supports (data, log). Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index df58c1c..11149fa 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -117,6 +117,70 @@ struct getbmapx { #define BMV_OF_SHARED 0x8 /* segment shared with another file */ /* + * Structure for XFS_IOC_GETFSMAP. + * + * Similar to XFS_IOC_GETBMAPX, the first two elements in the array are + * used to constrain the output. The first element in the array should + * represent the lowest disk address that the user wants to learn about. + * The second element in the array should represent the highest disk + * address to query. Subsequent array elements will be filled out by the + * command. + * + * The fmv_iflags field is only used in the first structure. The + * fmv_oflags field is filled in for each returned structure after the + * second structure. The fmv_unused1 fields in the first two array + * elements must be zero. + * + * The fmv_count, fmv_entries, and fmv_iflags fields in the second array + * element must be zero. + * + * fmv_block, fmv_offset, and fmv_length are expressed in units of 512 + * byte sectors. + */ +#ifndef HAVE_GETFSMAP +struct getfsmap { + __u32 fmv_device; /* device id */ + __u32 fmv_unused1; /* future use, must be zero */ + __u64 fmv_block; /* starting block */ + __u64 fmv_owner; /* owner id */ + __u64 fmv_offset; /* file offset of segment */ + __u64 fmv_length; /* length of segment, blocks */ + __u32 fmv_oflags; /* mapping flags */ + __u32 fmv_iflags; /* control flags (1st structure) */ + __u32 fmv_count; /* # of entries in array incl. input */ + __u32 fmv_entries; /* # of entries filled in (output). */ + __u64 fmv_unused2; /* future use, must be zero */ +}; +#endif + +/* fmv_iflags values - set by XFS_IOC_GETFSMAP caller in the header. */ +/* no flags defined yet */ +#define FMV_HIF_VALID 0 + +/* fmv_oflags values - returned in the header segment only. */ +#define FMV_HOF_DEV_T 0x1 /* fmv_device values will be dev_t */ + +/* fmv_flags values - returned for each non-header segment */ +#define FMV_OF_PREALLOC 0x1 /* segment = unwritten pre-allocation */ +#define FMV_OF_ATTR_FORK 0x2 /* segment = attribute fork */ +#define FMV_OF_EXTENT_MAP 0x4 /* segment = extent map */ +#define FMV_OF_SHARED 0x8 /* segment = shared with another file */ +#define FMV_OF_SPECIAL_OWNER 0x10 /* owner is a special value */ +#define FMV_OF_LAST 0x20 /* segment is the last in the FS */ + +/* fmv_owner special values */ +#define FMV_OWN_FREE (-1ULL) /* free space */ +#define FMV_OWN_UNKNOWN (-2ULL) /* unknown owner */ +#define FMV_OWN_FS (-3ULL) /* static fs metadata */ +#define FMV_OWN_LOG (-4ULL) /* journalling log */ +#define FMV_OWN_AG (-5ULL) /* per-AG metadata */ +#define FMV_OWN_INOBT (-6ULL) /* inode btree blocks */ +#define FMV_OWN_INODES (-7ULL) /* inodes */ +#define FMV_OWN_REFC (-8ULL) /* refcount tree */ +#define FMV_OWN_COW (-9ULL) /* cow staging */ +#define FMV_OWN_DEFECTIVE (-10ULL) /* bad blocks */ + +/* * Structure for XFS_IOC_FSSETDM. * For use by backup and restore programs to set the XFS on-disk inode * fields di_dmevmask and di_dmstate. These must be set to exactly and @@ -523,6 +587,7 @@ typedef struct xfs_swapext #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_fs_eofblocks) +#define XFS_IOC_GETFSMAP _IOWR('X', 59, struct getfsmap) /* * ioctl commands that replace IRIX syssgi()'s From darrick.wong@oracle.com Thu Aug 25 18:55:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B24B682FB for ; Thu, 25 Aug 2016 18:55:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 19FDEAC003 for ; Thu, 25 Aug 2016 16:55:38 -0700 (PDT) X-ASG-Debug-ID: 1472169336-0bf57c55b31c81d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 4nbqRSKbzP6rCXIX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:55:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNtYFo002456 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:55:35 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNtYJA016682 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:55:34 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNtXYP024681; Thu, 25 Aug 2016 23:55:33 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:55:33 -0700 Subject: [PATCH 02/24] xfs: have getfsmap fall back to the freesp btrees when rmap is not present From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/24] xfs: have getfsmap fall back to the freesp btrees when rmap is not present To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:55:31 -0700 Message-ID: <147216933141.6398.3843782526499785752.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169336 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2472 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines If the reverse-mapping btree isn't available, fall back to the free space btrees to provide partial reverse mapping information. The online scrub tool can make use of even partial information to speed up the data block scan. Signed-off-by: Darrick J. Wong --- libxfs/xfs_alloc.c | 42 ++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_alloc.h | 10 ++++++++++ 2 files changed, 52 insertions(+) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 3151fbb..0f93016 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2928,3 +2928,45 @@ err: xfs_trans_brelse(tp, agbp); return error; } + +struct xfs_alloc_query_range_info { + xfs_alloc_query_range_fn fn; + void *priv; +}; + +/* Format btree record and pass to our callback. */ +STATIC int +xfs_alloc_query_range_helper( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec, + void *priv) +{ + struct xfs_alloc_query_range_info *query = priv; + struct xfs_alloc_rec_incore irec; + + irec.ar_startblock = be32_to_cpu(rec->alloc.ar_startblock); + irec.ar_blockcount = be32_to_cpu(rec->alloc.ar_blockcount); + return query->fn(cur, &irec, query->priv); +} + +/* Find all rmaps between two keys. */ +int +xfs_alloc_query_range( + struct xfs_btree_cur *cur, + struct xfs_alloc_rec_incore *low_rec, + struct xfs_alloc_rec_incore *high_rec, + xfs_alloc_query_range_fn fn, + void *priv) +{ + union xfs_btree_irec low_brec; + union xfs_btree_irec high_brec; + struct xfs_alloc_query_range_info query; + + ASSERT(cur->bc_btnum == XFS_BTNUM_BNO); + low_brec.a = *low_rec; + high_brec.a = *high_rec; + query.priv = priv; + query.fn = fn; + return xfs_btree_query_range(cur, &low_brec, &high_brec, + xfs_alloc_query_range_helper, &query); +} diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index f7c5201..0b00de0 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -210,4 +210,14 @@ int xfs_free_extent_fix_freelist(struct xfs_trans *tp, xfs_agnumber_t agno, xfs_extlen_t xfs_prealloc_blocks(struct xfs_mount *mp); +typedef int (*xfs_alloc_query_range_fn)( + struct xfs_btree_cur *cur, + struct xfs_alloc_rec_incore *rec, + void *priv); + +int xfs_alloc_query_range(struct xfs_btree_cur *cur, + struct xfs_alloc_rec_incore *low_rec, + struct xfs_alloc_rec_incore *high_rec, + xfs_alloc_query_range_fn fn, void *priv); + #endif /* __XFS_ALLOC_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:55:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA72C8301 for ; Thu, 25 Aug 2016 18:55:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F58F8F8033 for ; Thu, 25 Aug 2016 16:55:46 -0700 (PDT) X-ASG-Debug-ID: 1472169342-0bf57c55b31c81e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id VTbuwgK4IZzwwGM2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:55:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNteu0029050 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:55:40 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNteTu001451 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:55:40 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNtdti024779; Thu, 25 Aug 2016 23:55:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:55:39 -0700 Subject: [PATCH 03/24] xfs_io: support the new getfsmap ioctl From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/24] xfs_io: support the new getfsmap ioctl To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:55:38 -0700 Message-ID: <147216933800.6398.14553822443288756490.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169342 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 18653 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- io/Makefile | 2 io/fsmap.c | 522 +++++++++++++++++++++++++++++++++++++++++++++++++++++ io/init.c | 1 io/io.h | 1 man/man8/xfs_io.8 | 47 +++++ 5 files changed, 572 insertions(+), 1 deletion(-) create mode 100644 io/fsmap.c diff --git a/io/Makefile b/io/Makefile index 1997ca9..cc27dba 100644 --- a/io/Makefile +++ b/io/Makefile @@ -11,7 +11,7 @@ HFILES = init.h io.h CFILES = init.c \ attr.c bmap.c file.c freeze.c fsync.c getrusage.c imap.c link.c \ mmap.c open.c parent.c pread.c prealloc.c pwrite.c seek.c shutdown.c \ - sync.c truncate.c reflink.c + sync.c truncate.c reflink.c fsmap.c LLDLIBS = $(LIBXCMD) $(LIBHANDLE) LTDEPENDENCIES = $(LIBXCMD) $(LIBHANDLE) diff --git a/io/fsmap.c b/io/fsmap.c new file mode 100644 index 0000000..a04b94e --- /dev/null +++ b/io/fsmap.c @@ -0,0 +1,522 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "platform_defs.h" +#include "command.h" +#include "init.h" +#include "io.h" +#include "input.h" +#include "path.h" + +static cmdinfo_t fsmap_cmd; +static dev_t xfs_data_dev; + +static void +fsmap_help(void) +{ + printf(_( +"\n" +" prints the block mapping for an XFS filesystem" +"\n" +" Example:\n" +" 'fsmap -vn' - tabular format verbose map, including unwritten extents\n" +"\n" +" fsmap prints the map of disk blocks used by the whole filesystem.\n" +" The map lists each extent used by the file, as well as regions in the\n" +" filesystem that do not have any corresponding blocks (free space).\n" +" By default, each line of the listing takes the following form:\n" +" extent: [startoffset..endoffset] owner startblock..endblock\n" +" All the file offsets and disk blocks are in units of 512-byte blocks.\n" +" -n -- query n extents.\n" +" -v -- Verbose information, specify ag info. Show flags legend on 2nd -v\n" +"\n")); +} + +static int +numlen( + off64_t val) +{ + off64_t tmp; + int len; + + for (len = 0, tmp = val; tmp > 0; tmp = tmp/10) + len++; + return (len == 0 ? 1 : len); +} + +static const char * +special_owner( + __int64_t owner) +{ + switch (owner) { + case FMV_OWN_FREE: + return _("free space"); + case FMV_OWN_UNKNOWN: + return _("unknown"); + case FMV_OWN_FS: + return _("static fs metadata"); + case FMV_OWN_LOG: + return _("journalling log"); + case FMV_OWN_AG: + return _("per-AG metadata"); + case FMV_OWN_INOBT: + return _("inode btree"); + case FMV_OWN_INODES: + return _("inodes"); + case FMV_OWN_REFC: + return _("refcount btree"); + case FMV_OWN_COW: + return _("cow reservation"); + case FMV_OWN_DEFECTIVE: + return _("defective"); + default: + return _("unknown"); + } +} + +static void +dump_map( + unsigned long long nr, + struct getfsmap *map) +{ + unsigned long long i; + struct getfsmap *p; + + for (i = 0, p = map + 2; i < map->fmv_entries; i++, p++) { + printf("\t%llu: %u:%u [%lld..%lld]: ", i + nr, + major(p->fmv_device), minor(p->fmv_device), + (long long) p->fmv_block, + (long long)(p->fmv_block + p->fmv_length - 1)); + if (p->fmv_oflags & FMV_OF_SPECIAL_OWNER) + printf("%s", special_owner(p->fmv_owner)); + else if (p->fmv_oflags & FMV_OF_EXTENT_MAP) + printf(_("inode %lld extent map"), + (long long) p->fmv_owner); + else + printf(_("inode %lld %lld..%lld"), + (long long) p->fmv_owner, + (long long) p->fmv_offset, + (long long)(p->fmv_offset + p->fmv_length - 1)); + printf(_(" %lld blocks\n"), + (long long)p->fmv_length); + } +} + +/* + * Verbose mode displays: + * extent: major:minor [startblock..endblock]: startoffset..endoffset \ + * ag# (agoffset..agendoffset) totalbbs flags + */ +#define MINRANGE_WIDTH 16 +#define MINAG_WIDTH 2 +#define MINTOT_WIDTH 5 +#define NFLG 7 /* count of flags */ +#define FLG_NULL 00000000 /* Null flag */ +#define FLG_SHARED 01000000 /* shared extent */ +#define FLG_ATTR_FORK 00100000 /* attribute fork */ +#define FLG_PRE 00010000 /* Unwritten extent */ +#define FLG_BSU 00001000 /* Not on begin of stripe unit */ +#define FLG_ESU 00000100 /* Not on end of stripe unit */ +#define FLG_BSW 00000010 /* Not on begin of stripe width */ +#define FLG_ESW 00000001 /* Not on end of stripe width */ +static void +dump_map_verbose( + unsigned long long nr, + struct getfsmap *map, + bool *dumped_flags, + struct xfs_fsop_geom *fsgeo) +{ + unsigned long long i; + struct getfsmap *p; + int agno; + off64_t agoff, bbperag; + int foff_w, boff_w, aoff_w, tot_w, agno_w, own_w, nr_w, dev_w; + char rbuf[32], bbuf[32], abuf[32], obuf[32], nbuf[32], dbuf[32], gbuf[32]; + int sunit, swidth; + int flg = 0; + + foff_w = boff_w = aoff_w = own_w = MINRANGE_WIDTH; + dev_w = 3; + nr_w = 4; + tot_w = MINTOT_WIDTH; + bbperag = (off64_t)fsgeo->agblocks * + (off64_t)fsgeo->blocksize / BBSIZE; + sunit = (fsgeo->sunit * fsgeo->blocksize) / BBSIZE; + swidth = (fsgeo->swidth * fsgeo->blocksize) / BBSIZE; + + /* + * Go through the extents and figure out the width + * needed for all columns. + */ + for (i = 0, p = map + 2; i < map->fmv_entries; i++, p++) { + if (p->fmv_oflags & FMV_OF_PREALLOC || + p->fmv_oflags & FMV_OF_ATTR_FORK || + p->fmv_oflags & FMV_OF_SHARED) + flg = 1; + if (sunit && + (p->fmv_block % sunit != 0 || + ((p->fmv_block + p->fmv_length) % sunit) != 0 || + p->fmv_block % swidth != 0 || + ((p->fmv_block + p->fmv_length) % swidth) != 0)) + flg = 1; + if (flg) + *dumped_flags = true; + snprintf(nbuf, sizeof(nbuf), "%llu", nr + i); + nr_w = max(nr_w, strlen(nbuf)); + if (map->fmv_oflags & FMV_HOF_DEV_T) + snprintf(dbuf, sizeof(dbuf), "%u:%u", + major(p->fmv_device), + minor(p->fmv_device)); + else + snprintf(dbuf, sizeof(dbuf), "0x%x", p->fmv_device); + dev_w = max(dev_w, strlen(dbuf)); + snprintf(bbuf, sizeof(bbuf), "[%lld..%lld]:", + (long long) p->fmv_block, + (long long)(p->fmv_block + p->fmv_length - 1)); + boff_w = max(boff_w, strlen(bbuf)); + if (p->fmv_oflags & FMV_OF_SPECIAL_OWNER) + own_w = max(own_w, strlen(special_owner(p->fmv_owner))); + else { + snprintf(obuf, sizeof(obuf), "%lld", + (long long)p->fmv_owner); + own_w = max(own_w, strlen(obuf)); + } + if (p->fmv_oflags & FMV_OF_EXTENT_MAP) + foff_w = max(foff_w, strlen(_("extent_map"))); + else if (p->fmv_oflags & FMV_OF_SPECIAL_OWNER) + ; + else { + snprintf(rbuf, sizeof(rbuf), "%lld..%lld", + (long long) p->fmv_offset, + (long long)(p->fmv_offset + p->fmv_length - 1)); + foff_w = max(foff_w, strlen(rbuf)); + } + if (p->fmv_device == xfs_data_dev) { + agno = p->fmv_block / bbperag; + agoff = p->fmv_block - (agno * bbperag); + snprintf(abuf, sizeof(abuf), + "(%lld..%lld)", + (long long)agoff, + (long long)(agoff + p->fmv_length - 1)); + } else + abuf[0] = 0; + aoff_w = max(aoff_w, strlen(abuf)); + tot_w = max(tot_w, + numlen(p->fmv_length)); + } + agno_w = max(MINAG_WIDTH, numlen(fsgeo->agcount)); + if (nr == 0) + printf("%*s: %-*s %-*s %-*s %-*s %*s %-*s %*s%s\n", + nr_w, _("EXT"), + dev_w, _("DEV"), + boff_w, _("BLOCK-RANGE"), + own_w, _("OWNER"), + foff_w, _("FILE-OFFSET"), + agno_w, _("AG"), + aoff_w, _("AG-OFFSET"), + tot_w, _("TOTAL"), + flg ? _(" FLAGS") : ""); + for (i = 0, p = map + 2; i < map->fmv_entries; i++, p++) { + flg = FLG_NULL; + if (p->fmv_oflags & FMV_OF_PREALLOC) + flg |= FLG_PRE; + if (p->fmv_oflags & FMV_OF_ATTR_FORK) + flg |= FLG_ATTR_FORK; + if (p->fmv_oflags & FMV_OF_SHARED) + flg |= FLG_SHARED; + /* + * If striping enabled, determine if extent starts/ends + * on a stripe unit boundary. + */ + if (sunit) { + if (p->fmv_block % sunit != 0) + flg |= FLG_BSU; + if (((p->fmv_block + + p->fmv_length ) % sunit ) != 0) + flg |= FLG_ESU; + if (p->fmv_block % swidth != 0) + flg |= FLG_BSW; + if (((p->fmv_block + + p->fmv_length ) % swidth ) != 0) + flg |= FLG_ESW; + } + if (map->fmv_oflags & FMV_HOF_DEV_T) + snprintf(dbuf, sizeof(dbuf), "%u:%u", + major(p->fmv_device), + minor(p->fmv_device)); + else + snprintf(dbuf, sizeof(dbuf), "0x%x", p->fmv_device); + snprintf(bbuf, sizeof(bbuf), "[%lld..%lld]:", + (long long) p->fmv_block, + (long long)(p->fmv_block + p->fmv_length - 1)); + if (p->fmv_oflags & FMV_OF_SPECIAL_OWNER) { + snprintf(obuf, sizeof(obuf), "%s", + special_owner(p->fmv_owner)); + snprintf(rbuf, sizeof(rbuf), " "); + } else { + snprintf(obuf, sizeof(obuf), "%lld", + (long long)p->fmv_owner); + snprintf(rbuf, sizeof(rbuf), "%lld..%lld", + (long long) p->fmv_offset, + (long long)(p->fmv_offset + p->fmv_length - 1)); + } + if (p->fmv_device == xfs_data_dev) { + agno = p->fmv_block / bbperag; + agoff = p->fmv_block - (agno * bbperag); + snprintf(abuf, sizeof(abuf), + "(%lld..%lld)", + (long long)agoff, + (long long)(agoff + p->fmv_length - 1)); + snprintf(gbuf, sizeof(gbuf), + "%lld", + (long long)agno); + } else { + abuf[0] = 0; + gbuf[0] = 0; + } + if (p->fmv_oflags & FMV_OF_EXTENT_MAP) + printf("%*llu: %-*s %-*s %-*s %-*s %-*s %-*s %*lld\n", + nr_w, nr + i, + dev_w, dbuf, + boff_w, bbuf, + own_w, obuf, + foff_w, _("extent map"), + agno_w, gbuf, + aoff_w, abuf, + tot_w, (long long)p->fmv_length); + else { + printf("%*llu: %-*s %-*s %-*s %-*s", nr_w, nr + i, + dev_w, dbuf, boff_w, bbuf, own_w, obuf, + foff_w, rbuf); + printf(" %-*s %-*s", agno_w, gbuf, + aoff_w, abuf); + printf(" %*lld", tot_w, + (long long)p->fmv_length); + if (flg == FLG_NULL) + printf("\n"); + else + printf(" %-*.*o\n", NFLG, NFLG, flg); + } + } +} + +static void +dump_verbose_key(void) +{ + printf(_(" FLAG Values:\n")); + printf(_(" %*.*o Shared extent\n"), + NFLG+1, NFLG+1, FLG_SHARED); + printf(_(" %*.*o Attribute fork\n"), + NFLG+1, NFLG+1, FLG_ATTR_FORK); + printf(_(" %*.*o Unwritten preallocated extent\n"), + NFLG+1, NFLG+1, FLG_PRE); + printf(_(" %*.*o Doesn't begin on stripe unit\n"), + NFLG+1, NFLG+1, FLG_BSU); + printf(_(" %*.*o Doesn't end on stripe unit\n"), + NFLG+1, NFLG+1, FLG_ESU); + printf(_(" %*.*o Doesn't begin on stripe width\n"), + NFLG+1, NFLG+1, FLG_BSW); + printf(_(" %*.*o Doesn't end on stripe width\n"), + NFLG+1, NFLG+1, FLG_ESW); +} + +int +fsmap_f( + int argc, + char **argv) +{ + struct getfsmap *p; + struct getfsmap *nmap; + struct getfsmap *map; + struct xfs_fsop_geom fsgeo; + long long start = 0; + long long end = -1; + int nmap_size; + int map_size; + int nflag = 0; + int vflag = 0; + int fmv_iflags = 0; /* flags for GETFSMAP */ + int i = 0; + int c; + unsigned long long nr = 0; + size_t fsblocksize, fssectsize; + struct fs_path *fs; + static bool tab_init; + bool dumped_flags = false; + + init_cvtnum(&fsblocksize, &fssectsize); + + while ((c = getopt(argc, argv, "n:v")) != EOF) { + switch (c) { + case 'n': /* number of extents specified */ + nflag = atoi(optarg); + break; + case 'v': /* Verbose output */ + vflag++; + break; + default: + return command_usage(&fsmap_cmd); + } + } + + if (argc > optind) { + start = cvtnum(fsblocksize, fssectsize, argv[optind]); + if (start < 0) { + fprintf(stderr, + _("Bad rmap start_fsb %s.\n"), + argv[optind]); + return 0; + } + } + + if (argc > optind + 1) { + end = cvtnum(fsblocksize, fssectsize, argv[optind + 1]); + if (end < 0) { + fprintf(stderr, + _("Bad rmap end_fsb %s.\n"), + argv[optind + 1]); + return 0; + } + } + + if (vflag) { + c = xfsctl(file->name, file->fd, XFS_IOC_FSGEOMETRY_V1, &fsgeo); + if (c < 0) { + fprintf(stderr, + _("%s: can't get geometry [\"%s\"]: %s\n"), + progname, file->name, strerror(errno)); + exitcode = 1; + return 0; + } + } + + map_size = nflag ? nflag + 2 : 131072 / sizeof(*map); + map = malloc(map_size * sizeof(*map)); + if (map == NULL) { + fprintf(stderr, _("%s: malloc of %zu bytes failed.\n"), + progname, map_size * sizeof(*map)); + exitcode = 1; + return 0; + } + + memset(map, 0, sizeof(*map) * 2); + map->fmv_iflags = fmv_iflags; + map->fmv_block = start / 512; + (map + 1)->fmv_device = UINT_MAX; + (map + 1)->fmv_block = (unsigned long long)end / 512; + (map + 1)->fmv_owner = ULLONG_MAX; + (map + 1)->fmv_offset = ULLONG_MAX; + + /* Count mappings */ + if (!nflag) { + map->fmv_count = 2; + i = xfsctl(file->name, file->fd, XFS_IOC_GETFSMAP, map); + if (i < 0) { + fprintf(stderr, _("%s: xfsctl(XFS_IOC_GETFSMAP)" + " iflags=0x%x [\"%s\"]: %s\n"), + progname, map->fmv_iflags, file->name, + strerror(errno)); + free(map); + exitcode = 1; + return 0; + } + if (map->fmv_entries > map_size + 2) { + unsigned long long nr; + + nr = 5ULL * map->fmv_entries / 4 + 2; + nmap_size = nr > INT_MAX ? INT_MAX : nr; + nmap = realloc(map, nmap_size * sizeof(*map)); + if (nmap == NULL) { + fprintf(stderr, + _("%s: cannot realloc %zu bytes\n"), + progname, map_size*sizeof(*map)); + } else { + map = nmap; + map_size = nmap_size; + } + } + } + + /* + * If this is an XFS filesystem, remember the data device. + * (We report AG number/block for data device extents on XFS). + */ + if (!tab_init) { + fs_table_initialise(0, NULL, 0, NULL); + tab_init = true; + } + fs = fs_table_lookup(file->name, FS_MOUNT_POINT); + xfs_data_dev = fs ? fs->fs_datadev : 0; + + map->fmv_count = map_size; + do { + /* Get some extents */ + i = xfsctl(file->name, file->fd, XFS_IOC_GETFSMAP, map); + if (i < 0) { + fprintf(stderr, _("%s: xfsctl(XFS_IOC_GETFSMAP)" + " iflags=0x%x [\"%s\"]: %s\n"), + progname, map->fmv_iflags, file->name, + strerror(errno)); + free(map); + exitcode = 1; + return 0; + } + + if (map->fmv_entries == 0) + break; + + if (!vflag) + dump_map(nr, map); + else + dump_map_verbose(nr, map, &dumped_flags, &fsgeo); + + p = map + 1 + map->fmv_entries; + if (p->fmv_oflags & FMV_OF_LAST) + break; + + nr += map->fmv_entries; + map->fmv_device = p->fmv_device; + map->fmv_block = p->fmv_block; + map->fmv_owner = p->fmv_owner; + map->fmv_offset = p->fmv_offset; + map->fmv_oflags = p->fmv_oflags; + map->fmv_length = p->fmv_length; + } while (true); + + if (dumped_flags) + dump_verbose_key(); + + free(map); + return 0; +} + +void +fsmap_init(void) +{ + fsmap_cmd.name = "fsmap"; + fsmap_cmd.cfunc = fsmap_f; + fsmap_cmd.argmin = 0; + fsmap_cmd.argmax = -1; + fsmap_cmd.flags = CMD_NOMAP_OK; + fsmap_cmd.args = _("[-v] [-n nx] [start] [end]"); + fsmap_cmd.oneline = _("print filesystem mapping for a range of blocks"); + fsmap_cmd.help = fsmap_help; + + add_command(&fsmap_cmd); +} diff --git a/io/init.c b/io/init.c index 6b88cc6..9c0da0e 100644 --- a/io/init.c +++ b/io/init.c @@ -61,6 +61,7 @@ init_commands(void) file_init(); flink_init(); freeze_init(); + fsmap_init(); fsync_init(); getrusage_init(); help_init(); diff --git a/io/io.h b/io/io.h index 4264e4d..83a8366 100644 --- a/io/io.h +++ b/io/io.h @@ -97,6 +97,7 @@ extern void bmap_init(void); extern void file_init(void); extern void flink_init(void); extern void freeze_init(void); +extern void fsmap_init(void); extern void fsync_init(void); extern void getrusage_init(void); extern void help_init(void); diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 2365550..a275a63 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -267,6 +267,53 @@ ioctl. Options behave as described in the .BR xfs_bmap (8) manual page. .TP +.BI "fsmap [ \-v ] [ \-n " nx " ] [ " start " ] [ " end " ] +Prints the mapping of disk blocks used by an XFS filesystem. The map +lists each extent used by files, allocation group metadata, +journalling logs, and static filesystem metadata, as well as any +regions that are unused. Each line of the listings takes the +following form: +.PP +.RS +.IR extent ": " major ":" minor " [" startblock .. endblock "]: " owner " " startoffset .. endoffset " " length +.PP +Static filesystem metadata, allocation group metadata, btrees, +journalling logs, and free space are marked by replacing the +.IR startoffset .. endoffset +with the appropriate marker. All blocks, offsets, and lengths are specified +in units of 512-byte blocks, no matter what the filesystem's block size is. +.BI "The optional " start " and " end " arguments can be used to constrain +the output to a particular range of disk blocks. +.RE +.RS 1.0i +.PD 0 +.TP +.BI \-n " num_extents" +If this option is given, +.B xfs_fsmap +obtains the extent list of the file in groups of +.I num_extents +extents. In the absence of +.BR \-n ", " xfs_fsmap +queries the system for the number of extents in the filesystem and uses that +value to compute the group size. +.TP +.B \-v +Shows verbose information. When this flag is specified, additional AG +specific information is appended to each line in the following form: +.IP +.RS 1.2i +.IR agno " (" startagblock .. endagblock ") " nblocks " " flags +.RE +.IP +A second +.B \-v +option will print out the +.I flags +legend. +.RE +.PD +.TP .BI "extsize [ \-R | \-D ] [ " value " ]" Display and/or modify the preferred extent size used when allocating space for the currently open file. If the From darrick.wong@oracle.com Thu Aug 25 18:55:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 012E882F0 for ; Thu, 25 Aug 2016 18:55:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5E3A7AC003 for ; Thu, 25 Aug 2016 16:55:52 -0700 (PDT) X-ASG-Debug-ID: 1472169349-0bf57b5312209d80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zDauS3hBwV4E8cW7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:55:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNtmE1029093 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:55:48 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNtlHF005349 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:55:48 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNtkNl021507; Thu, 25 Aug 2016 23:55:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:55:45 -0700 Subject: [PATCH 04/24] xfs: generic functions to scrub metadata and btrees From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/24] xfs: generic functions to scrub metadata and btrees To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:55:44 -0700 Message-ID: <147216934437.6398.12209563310605493987.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169349 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5328 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a function that walks a btree, checking the integrity of each btree block (headers, keys, records) and calling back to the caller to perform further checks on the records. v2: Prefix function names with xfs_ v3: Add some helper functions to report errors in a more standard way, including non-btree metadata errors. Rework scrub dispatching into a central routine (for the ioctl in the next patch) instead of using sysfs. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 41 +++++++++++++++++++++++++++++++++++------ libxfs/xfs_btree.h | 17 +++++++++++++++-- libxfs/xfs_format.h | 2 +- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 0468a9e..ad205c0 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -548,7 +548,7 @@ xfs_btree_ptr_offset( /* * Return a pointer to the n-th record in the btree block. */ -STATIC union xfs_btree_rec * +union xfs_btree_rec * xfs_btree_rec_addr( struct xfs_btree_cur *cur, int n, @@ -561,7 +561,7 @@ xfs_btree_rec_addr( /* * Return a pointer to the n-th key in the btree block. */ -STATIC union xfs_btree_key * +union xfs_btree_key * xfs_btree_key_addr( struct xfs_btree_cur *cur, int n, @@ -574,7 +574,7 @@ xfs_btree_key_addr( /* * Return a pointer to the n-th high key in the btree block. */ -STATIC union xfs_btree_key * +union xfs_btree_key * xfs_btree_high_key_addr( struct xfs_btree_cur *cur, int n, @@ -587,7 +587,7 @@ xfs_btree_high_key_addr( /* * Return a pointer to the n-th block pointer in the btree block. */ -STATIC union xfs_btree_ptr * +union xfs_btree_ptr * xfs_btree_ptr_addr( struct xfs_btree_cur *cur, int n, @@ -621,7 +621,7 @@ xfs_btree_get_iroot( * Retrieve the block pointer from the cursor at the given level. * This may be an inode btree root or from a buffer. */ -STATIC struct xfs_btree_block * /* generic btree block pointer */ +struct xfs_btree_block * /* generic btree block pointer */ xfs_btree_get_block( struct xfs_btree_cur *cur, /* btree cursor */ int level, /* level in btree */ @@ -1732,7 +1732,7 @@ error0: return error; } -STATIC int +int xfs_btree_lookup_get_block( struct xfs_btree_cur *cur, /* btree cursor */ int level, /* level in the btree */ @@ -4848,3 +4848,32 @@ xfs_btree_count_blocks( return xfs_btree_visit_blocks(cur, xfs_btree_count_blocks_helper, blocks); } + +/* If there's an extent, we're done. */ +STATIC int +xfs_btree_has_record_helper( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec, + void *priv) +{ + return XFS_BTREE_QUERY_RANGE_ABORT; +} + +/* Is there a record covering a given range of keys? */ +int +xfs_btree_has_record( + struct xfs_btree_cur *cur, + union xfs_btree_irec *low, + union xfs_btree_irec *high, + bool *exists) +{ + int error; + + error = xfs_btree_query_range(cur, low, high, + &xfs_btree_has_record_helper, NULL); + if (error && error != XFS_BTREE_QUERY_RANGE_ABORT) + return error; + *exists = error == XFS_BTREE_QUERY_RANGE_ABORT; + + return 0; +} diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index eb20376..f81b2a8 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -197,7 +197,6 @@ struct xfs_btree_ops { const struct xfs_buf_ops *buf_ops; -#if defined(DEBUG) || defined(XFS_WARN) /* check that k1 is lower than k2 */ int (*keys_inorder)(struct xfs_btree_cur *cur, union xfs_btree_key *k1, @@ -207,7 +206,6 @@ struct xfs_btree_ops { int (*recs_inorder)(struct xfs_btree_cur *cur, union xfs_btree_rec *r1, union xfs_btree_rec *r2); -#endif }; /* @@ -537,4 +535,19 @@ int xfs_btree_visit_blocks(struct xfs_btree_cur *cur, int xfs_btree_count_blocks(struct xfs_btree_cur *cur, xfs_extlen_t *blocks); +union xfs_btree_rec *xfs_btree_rec_addr(struct xfs_btree_cur *cur, int n, + struct xfs_btree_block *block); +union xfs_btree_key *xfs_btree_key_addr(struct xfs_btree_cur *cur, int n, + struct xfs_btree_block *block); +union xfs_btree_key *xfs_btree_high_key_addr(struct xfs_btree_cur *cur, int n, + struct xfs_btree_block *block); +union xfs_btree_ptr *xfs_btree_ptr_addr(struct xfs_btree_cur *cur, int n, + struct xfs_btree_block *block); +int xfs_btree_lookup_get_block(struct xfs_btree_cur *cur, int level, + union xfs_btree_ptr *pp, struct xfs_btree_block **blkp); +struct xfs_btree_block *xfs_btree_get_block(struct xfs_btree_cur *cur, + int level, struct xfs_buf **bpp); +int xfs_btree_has_record(struct xfs_btree_cur *cur, union xfs_btree_irec *low, + union xfs_btree_irec *high, bool *exists); + #endif /* __XFS_BTREE_H__ */ diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index f2b9737..df6518e 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -518,7 +518,7 @@ static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); } -static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) +static inline bool xfs_sb_version_hasfinobt(xfs_sb_t *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); From darrick.wong@oracle.com Thu Aug 25 18:55:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CFBB68312 for ; Thu, 25 Aug 2016 18:55:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9731D304039 for ; Thu, 25 Aug 2016 16:55:56 -0700 (PDT) X-ASG-Debug-ID: 1472169354-0bf57b5311209d90001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id vIqbew5CqfTmWtaW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:55:55 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNtrwJ002699 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:55:53 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNtqgL005460 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:55:53 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNtqA9024818; Thu, 25 Aug 2016 23:55:52 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:55:52 -0700 Subject: [PATCH 05/24] xfs: create an ioctl to scrub AG metadata From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/24] xfs: create an ioctl to scrub AG metadata To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:55:50 -0700 Message-ID: <147216935060.6398.12110286173117202579.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169355 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1497 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create an ioctl that can be used to scrub internal filesystem metadata. The new ioctl takes the metadata type, an (optional) AG number, and a flags argument. This will be used by the upcoming XFS online scrub tool. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 11149fa..6cb3cff 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -548,6 +548,21 @@ typedef struct xfs_swapext #define XFS_FSOP_GOING_FLAGS_LOGFLUSH 0x1 /* flush log but not data */ #define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH 0x2 /* don't flush log nor data */ +/* metadata scrubbing */ +struct xfs_scrub_metadata { + __u32 type; /* What to check? */ + __u32 flags; /* Flags; none defined right now. */ + __u64 control; /* AG or inode number */ + __u64 reserved[6]; /* Must be zero. */ +}; + +/* + * Metadata types and flags for scrub operation. + */ +#define XFS_SCRUB_TYPE_MAX 0 + +#define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ + /* * ioctl limits */ @@ -588,6 +603,7 @@ typedef struct xfs_swapext #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_fs_eofblocks) #define XFS_IOC_GETFSMAP _IOWR('X', 59, struct getfsmap) +#define XFS_IOC_SCRUB_METADATA _IOR ('X', 60, struct xfs_scrub_metadata) /* * ioctl commands that replace IRIX syssgi()'s From darrick.wong@oracle.com Thu Aug 25 18:56:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A5B878318 for ; Thu, 25 Aug 2016 18:56:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6C262304039 for ; Thu, 25 Aug 2016 16:56:02 -0700 (PDT) X-ASG-Debug-ID: 1472169360-0bf8155c771e92d0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id qEIqGY2SrNy5MIuD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNtxTk002718 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:55:59 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNtwaM012574 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:55:59 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNtwom004315; Thu, 25 Aug 2016 23:55:58 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:55:58 -0700 Subject: [PATCH 06/24] xfs: scrub the backup superblocks From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/24] xfs: scrub the backup superblocks To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:55:56 -0700 Message-ID: <147216935683.6398.16296815516315936549.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169360 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 670 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Ensure that the geometry presented in the backup superblocks matches the primary superblock so that repair can recover the filesystem if that primary gets corrupted. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 6cb3cff..64c7b43 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -559,6 +559,7 @@ struct xfs_scrub_metadata { /* * Metadata types and flags for scrub operation. */ +#define XFS_SCRUB_TYPE_SB 0 /* superblock */ #define XFS_SCRUB_TYPE_MAX 0 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ From darrick.wong@oracle.com Thu Aug 25 18:56:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9DA6782FD for ; Thu, 25 Aug 2016 18:56:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 452FD8F8035 for ; Thu, 25 Aug 2016 16:56:09 -0700 (PDT) X-ASG-Debug-ID: 1472169367-0bf8155c771e9300001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id jJlrkeAoEHhUjGv8 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:07 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNu5e2029381 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:05 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNu5oc012842 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:05 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNu4fI024887; Thu, 25 Aug 2016 23:56:05 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:04 -0700 Subject: [PATCH 07/24] xfs: scrub AGF and AGFL From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/24] xfs: scrub AGF and AGFL To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:03 -0700 Message-ID: <147216936304.6398.907217110911507233.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169367 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1839 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Check the block references in the AGF and AGFL headers to make sure they make sense. Signed-off-by: Darrick J. Wong --- libxfs/xfs_alloc.c | 2 +- libxfs/xfs_alloc.h | 2 ++ libxfs/xfs_fs.h | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 0f93016..055d57e 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -625,7 +625,7 @@ const struct xfs_buf_ops xfs_agfl_buf_ops = { /* * Read in the allocation group free block array. */ -STATIC int /* error */ +int /* error */ xfs_alloc_read_agfl( xfs_mount_t *mp, /* mount point structure */ xfs_trans_t *tp, /* transaction pointer */ diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index 0b00de0..c3ada6b 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -204,6 +204,8 @@ xfs_alloc_get_rec( int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); +int xfs_alloc_read_agfl(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_agnumber_t agno, struct xfs_buf **bpp); int xfs_alloc_fix_freelist(struct xfs_alloc_arg *args, int flags); int xfs_free_extent_fix_freelist(struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **agbp); diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 64c7b43..dbdd346 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -560,7 +560,9 @@ struct xfs_scrub_metadata { * Metadata types and flags for scrub operation. */ #define XFS_SCRUB_TYPE_SB 0 /* superblock */ -#define XFS_SCRUB_TYPE_MAX 0 +#define XFS_SCRUB_TYPE_AGF 1 /* AG free header */ +#define XFS_SCRUB_TYPE_AGFL 2 /* AG free list */ +#define XFS_SCRUB_TYPE_MAX 2 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ From darrick.wong@oracle.com Thu Aug 25 18:56:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DAF8E8304 for ; Thu, 25 Aug 2016 18:56:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 53DDDAC002 for ; Thu, 25 Aug 2016 16:56:15 -0700 (PDT) X-ASG-Debug-ID: 1472169373-0bf57c55b31c8210001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 9MrE1g4dU4wjj0RS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:13 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNuBw9029424 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:12 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNuBKf012948 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:11 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNuB3D004435; Thu, 25 Aug 2016 23:56:11 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:10 -0700 Subject: [PATCH 08/24] xfs: scrub the AGI From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/24] xfs: scrub the AGI To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:09 -0700 Message-ID: <147216936933.6398.15480725503545971412.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169373 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1338 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add a forgotten check to the AGI verifier, then wire up the scrub infrastructure to check the AGI contents. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 3 ++- libxfs/xfs_ialloc.c | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index dbdd346..daf8f5d 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -562,7 +562,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_SB 0 /* superblock */ #define XFS_SCRUB_TYPE_AGF 1 /* AG free header */ #define XFS_SCRUB_TYPE_AGFL 2 /* AG free list */ -#define XFS_SCRUB_TYPE_MAX 2 +#define XFS_SCRUB_TYPE_AGI 3 /* AG inode header */ +#define XFS_SCRUB_TYPE_MAX 3 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 5c88b0b..c533d5c 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -2508,6 +2508,11 @@ xfs_agi_verify( if (be32_to_cpu(agi->agi_level) > XFS_BTREE_MAXLEVELS) return false; + + if (xfs_sb_version_hasfinobt(&mp->m_sb) && + be32_to_cpu(agi->agi_free_level) > XFS_BTREE_MAXLEVELS) + return false; + /* * during growfs operations, the perag is not fully initialised, * so we can't use it for any useful checking. growfs ensures we can't From darrick.wong@oracle.com Thu Aug 25 18:56:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A9B7A832D for ; Thu, 25 Aug 2016 18:56:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 22228AC003 for ; Thu, 25 Aug 2016 16:56:22 -0700 (PDT) X-ASG-Debug-ID: 1472169379-0bf57b5313209dc0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 2vU8xRmhPJ8bxpmh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:20 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNuIvP029496 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:56:18 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNuIK1017468 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:56:18 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNuHBm003313; Thu, 25 Aug 2016 23:56:18 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:17 -0700 Subject: [PATCH 09/24] xfs: support scrubbing free space btrees From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/24] xfs: support scrubbing free space btrees To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:15 -0700 Message-ID: <147216937576.6398.3420248267786575580.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169379 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8062 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces necessary to check the free space btrees. Signed-off-by: Darrick J. Wong --- libxfs/xfs_alloc_btree.c | 156 ++++++++++++++++++++++++++++++++++------------ libxfs/xfs_fs.h | 4 + 2 files changed, 117 insertions(+), 43 deletions(-) diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index ff4bae4..0c4d397 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -203,19 +203,28 @@ xfs_allocbt_init_key_from_rec( union xfs_btree_key *key, union xfs_btree_rec *rec) { - ASSERT(rec->alloc.ar_startblock != 0); - key->alloc.ar_startblock = rec->alloc.ar_startblock; key->alloc.ar_blockcount = rec->alloc.ar_blockcount; } STATIC void +xfs_bnobt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + __u32 x; + + x = be32_to_cpu(rec->alloc.ar_startblock); + x += be32_to_cpu(rec->alloc.ar_blockcount) - 1; + key->alloc.ar_startblock = cpu_to_be32(x); + key->alloc.ar_blockcount = 0; +} + +STATIC void xfs_allocbt_init_rec_from_cur( struct xfs_btree_cur *cur, union xfs_btree_rec *rec) { - ASSERT(cur->bc_rec.a.ar_startblock != 0); - rec->alloc.ar_startblock = cpu_to_be32(cur->bc_rec.a.ar_startblock); rec->alloc.ar_blockcount = cpu_to_be32(cur->bc_rec.a.ar_blockcount); } @@ -234,18 +243,24 @@ xfs_allocbt_init_ptr_from_cur( } STATIC __int64_t -xfs_allocbt_key_diff( +xfs_bnobt_key_diff( struct xfs_btree_cur *cur, union xfs_btree_key *key) { xfs_alloc_rec_incore_t *rec = &cur->bc_rec.a; xfs_alloc_key_t *kp = &key->alloc; - __int64_t diff; - if (cur->bc_btnum == XFS_BTNUM_BNO) { - return (__int64_t)be32_to_cpu(kp->ar_startblock) - - rec->ar_startblock; - } + return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; +} + +STATIC __int64_t +xfs_cntbt_key_diff( + struct xfs_btree_cur *cur, + union xfs_btree_key *key) +{ + xfs_alloc_rec_incore_t *rec = &cur->bc_rec.a; + xfs_alloc_key_t *kp = &key->alloc; + __int64_t diff; diff = (__int64_t)be32_to_cpu(kp->ar_blockcount) - rec->ar_blockcount; if (diff) @@ -254,6 +269,33 @@ xfs_allocbt_key_diff( return (__int64_t)be32_to_cpu(kp->ar_startblock) - rec->ar_startblock; } +STATIC __int64_t +xfs_bnobt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return (__int64_t)be32_to_cpu(k1->alloc.ar_startblock) - + be32_to_cpu(k2->alloc.ar_startblock); +} + +STATIC __int64_t +xfs_cntbt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + __int64_t diff; + + diff = be32_to_cpu(k1->alloc.ar_blockcount) - + be32_to_cpu(k2->alloc.ar_blockcount); + if (diff) + return diff; + + return be32_to_cpu(k1->alloc.ar_startblock) - + be32_to_cpu(k2->alloc.ar_startblock); +} + static bool xfs_allocbt_verify( struct xfs_buf *bp) @@ -342,46 +384,76 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int -xfs_allocbt_keys_inorder( +xfs_bnobt_keys_inorder( struct xfs_btree_cur *cur, union xfs_btree_key *k1, union xfs_btree_key *k2) { - if (cur->bc_btnum == XFS_BTNUM_BNO) { - return be32_to_cpu(k1->alloc.ar_startblock) < - be32_to_cpu(k2->alloc.ar_startblock); - } else { - return be32_to_cpu(k1->alloc.ar_blockcount) < - be32_to_cpu(k2->alloc.ar_blockcount) || - (k1->alloc.ar_blockcount == k2->alloc.ar_blockcount && - be32_to_cpu(k1->alloc.ar_startblock) < - be32_to_cpu(k2->alloc.ar_startblock)); - } + return be32_to_cpu(k1->alloc.ar_startblock) < + be32_to_cpu(k2->alloc.ar_startblock); } STATIC int -xfs_allocbt_recs_inorder( +xfs_bnobt_recs_inorder( struct xfs_btree_cur *cur, union xfs_btree_rec *r1, union xfs_btree_rec *r2) { - if (cur->bc_btnum == XFS_BTNUM_BNO) { - return be32_to_cpu(r1->alloc.ar_startblock) + - be32_to_cpu(r1->alloc.ar_blockcount) <= - be32_to_cpu(r2->alloc.ar_startblock); - } else { - return be32_to_cpu(r1->alloc.ar_blockcount) < - be32_to_cpu(r2->alloc.ar_blockcount) || - (r1->alloc.ar_blockcount == r2->alloc.ar_blockcount && - be32_to_cpu(r1->alloc.ar_startblock) < - be32_to_cpu(r2->alloc.ar_startblock)); - } + return be32_to_cpu(r1->alloc.ar_startblock) + + be32_to_cpu(r1->alloc.ar_blockcount) <= + be32_to_cpu(r2->alloc.ar_startblock); } -#endif /* DEBUG */ -static const struct xfs_btree_ops xfs_allocbt_ops = { +STATIC int +xfs_cntbt_keys_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return be32_to_cpu(k1->alloc.ar_blockcount) < + be32_to_cpu(k2->alloc.ar_blockcount) || + (k1->alloc.ar_blockcount == k2->alloc.ar_blockcount && + be32_to_cpu(k1->alloc.ar_startblock) < + be32_to_cpu(k2->alloc.ar_startblock)); +} + +STATIC int +xfs_cntbt_recs_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_rec *r1, + union xfs_btree_rec *r2) +{ + return be32_to_cpu(r1->alloc.ar_blockcount) < + be32_to_cpu(r2->alloc.ar_blockcount) || + (r1->alloc.ar_blockcount == r2->alloc.ar_blockcount && + be32_to_cpu(r1->alloc.ar_startblock) < + be32_to_cpu(r2->alloc.ar_startblock)); +} + +static const struct xfs_btree_ops xfs_bnobt_ops = { + .rec_len = sizeof(xfs_alloc_rec_t), + .key_len = sizeof(xfs_alloc_key_t), + + .dup_cursor = xfs_allocbt_dup_cursor, + .set_root = xfs_allocbt_set_root, + .alloc_block = xfs_allocbt_alloc_block, + .free_block = xfs_allocbt_free_block, + .update_lastrec = xfs_allocbt_update_lastrec, + .get_minrecs = xfs_allocbt_get_minrecs, + .get_maxrecs = xfs_allocbt_get_maxrecs, + .init_key_from_rec = xfs_allocbt_init_key_from_rec, + .init_high_key_from_rec = xfs_bnobt_init_high_key_from_rec, + .init_rec_from_cur = xfs_allocbt_init_rec_from_cur, + .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, + .key_diff = xfs_bnobt_key_diff, + .buf_ops = &xfs_allocbt_buf_ops, + .diff_two_keys = xfs_bnobt_diff_two_keys, + .keys_inorder = xfs_bnobt_keys_inorder, + .recs_inorder = xfs_bnobt_recs_inorder, +}; + +static const struct xfs_btree_ops xfs_cntbt_ops = { .rec_len = sizeof(xfs_alloc_rec_t), .key_len = sizeof(xfs_alloc_key_t), @@ -395,12 +467,11 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .init_key_from_rec = xfs_allocbt_init_key_from_rec, .init_rec_from_cur = xfs_allocbt_init_rec_from_cur, .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, - .key_diff = xfs_allocbt_key_diff, + .key_diff = xfs_cntbt_key_diff, .buf_ops = &xfs_allocbt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) - .keys_inorder = xfs_allocbt_keys_inorder, - .recs_inorder = xfs_allocbt_recs_inorder, -#endif + .diff_two_keys = xfs_cntbt_diff_two_keys, + .keys_inorder = xfs_cntbt_keys_inorder, + .recs_inorder = xfs_cntbt_recs_inorder, }; /* @@ -425,12 +496,13 @@ xfs_allocbt_init_cursor( cur->bc_mp = mp; cur->bc_btnum = btnum; cur->bc_blocklog = mp->m_sb.sb_blocklog; - cur->bc_ops = &xfs_allocbt_ops; if (btnum == XFS_BTNUM_CNT) { + cur->bc_ops = &xfs_cntbt_ops; cur->bc_nlevels = be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]); cur->bc_flags = XFS_BTREE_LASTREC_UPDATE; } else { + cur->bc_ops = &xfs_bnobt_ops; cur->bc_nlevels = be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]); } diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index daf8f5d..42ea98b 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -563,7 +563,9 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_AGF 1 /* AG free header */ #define XFS_SCRUB_TYPE_AGFL 2 /* AG free list */ #define XFS_SCRUB_TYPE_AGI 3 /* AG inode header */ -#define XFS_SCRUB_TYPE_MAX 3 +#define XFS_SCRUB_TYPE_BNOBT 4 /* freesp by block btree */ +#define XFS_SCRUB_TYPE_CNTBT 5 /* freesp by length btree */ +#define XFS_SCRUB_TYPE_MAX 5 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ From darrick.wong@oracle.com Thu Aug 25 18:56:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AFFDC8338 for ; Thu, 25 Aug 2016 18:56:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1B5BFAC002 for ; Thu, 25 Aug 2016 16:56:28 -0700 (PDT) X-ASG-Debug-ID: 1472169386-0bf57c55b21c8230001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id REt3Wd1AZZxfMs1R (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:27 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNuOc0003122 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:25 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNuON7006368 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:24 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNuN1Z024923; Thu, 25 Aug 2016 23:56:24 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:23 -0700 Subject: [PATCH 10/24] xfs: support scrubbing inode btrees From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/24] xfs: support scrubbing inode btrees To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:22 -0700 Message-ID: <147216938229.6398.4611010897290185819.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169386 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6057 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces necessary to check the inode btrees. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 4 +++- libxfs/xfs_ialloc.c | 41 +++++++++++++++++++++++++---------------- libxfs/xfs_ialloc.h | 3 +++ libxfs/xfs_ialloc_btree.c | 32 ++++++++++++++++++++++++++------ 4 files changed, 57 insertions(+), 23 deletions(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 42ea98b..03fdfb5 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -565,7 +565,9 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_AGI 3 /* AG inode header */ #define XFS_SCRUB_TYPE_BNOBT 4 /* freesp by block btree */ #define XFS_SCRUB_TYPE_CNTBT 5 /* freesp by length btree */ -#define XFS_SCRUB_TYPE_MAX 5 +#define XFS_SCRUB_TYPE_INOBT 6 /* inode btree */ +#define XFS_SCRUB_TYPE_FINOBT 7 /* free inode btree */ +#define XFS_SCRUB_TYPE_MAX 7 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index c533d5c..b880f78 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -93,24 +93,14 @@ xfs_inobt_update( return xfs_btree_update(cur, &rec); } -/* - * Get the data from the pointed-to record. - */ -int /* error */ -xfs_inobt_get_rec( - struct xfs_btree_cur *cur, /* btree cursor */ - xfs_inobt_rec_incore_t *irec, /* btree record */ - int *stat) /* output: success/failure */ +void +xfs_inobt_btrec_to_irec( + struct xfs_mount *mp, + union xfs_btree_rec *rec, + struct xfs_inobt_rec_incore *irec) { - union xfs_btree_rec *rec; - int error; - - error = xfs_btree_get_rec(cur, &rec, stat); - if (error || *stat == 0) - return error; - irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); - if (xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)) { + if (xfs_sb_version_hassparseinodes(&mp->m_sb)) { irec->ir_holemask = be16_to_cpu(rec->inobt.ir_u.sp.ir_holemask); irec->ir_count = rec->inobt.ir_u.sp.ir_count; irec->ir_freecount = rec->inobt.ir_u.sp.ir_freecount; @@ -125,6 +115,25 @@ xfs_inobt_get_rec( be32_to_cpu(rec->inobt.ir_u.f.ir_freecount); } irec->ir_free = be64_to_cpu(rec->inobt.ir_free); +} + +/* + * Get the data from the pointed-to record. + */ +int /* error */ +xfs_inobt_get_rec( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_inobt_rec_incore_t *irec, /* btree record */ + int *stat) /* output: success/failure */ +{ + union xfs_btree_rec *rec; + int error; + + error = xfs_btree_get_rec(cur, &rec, stat); + if (error || *stat == 0) + return error; + + xfs_inobt_btrec_to_irec(cur->bc_mp, rec, irec); return 0; } diff --git a/libxfs/xfs_ialloc.h b/libxfs/xfs_ialloc.h index 0bb8966..8e5861d 100644 --- a/libxfs/xfs_ialloc.h +++ b/libxfs/xfs_ialloc.h @@ -168,5 +168,8 @@ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); +union xfs_btree_rec; +void xfs_inobt_btrec_to_irec(struct xfs_mount *mp, union xfs_btree_rec *rec, + struct xfs_inobt_rec_incore *irec); #endif /* __XFS_IALLOC_H__ */ diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 7bf6040..f46488a 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -151,6 +151,18 @@ xfs_inobt_init_key_from_rec( } STATIC void +xfs_inobt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + __u32 x; + + x = be32_to_cpu(rec->inobt.ir_startino); + x += XFS_INODES_PER_CHUNK - 1; + key->inobt.ir_startino = cpu_to_be32(x); +} + +STATIC void xfs_inobt_init_rec_from_cur( struct xfs_btree_cur *cur, union xfs_btree_rec *rec) @@ -204,6 +216,16 @@ xfs_inobt_key_diff( cur->bc_rec.i.ir_startino; } +STATIC __int64_t +xfs_inobt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return (__int64_t)be32_to_cpu(k1->inobt.ir_startino) - + be32_to_cpu(k2->inobt.ir_startino); +} + static int xfs_inobt_verify( struct xfs_buf *bp) @@ -278,7 +300,6 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { .verify_write = xfs_inobt_write_verify, }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_inobt_keys_inorder( struct xfs_btree_cur *cur, @@ -298,7 +319,6 @@ xfs_inobt_recs_inorder( return be32_to_cpu(r1->inobt.ir_startino) + XFS_INODES_PER_CHUNK <= be32_to_cpu(r2->inobt.ir_startino); } -#endif /* DEBUG */ static const struct xfs_btree_ops xfs_inobt_ops = { .rec_len = sizeof(xfs_inobt_rec_t), @@ -311,14 +331,14 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .get_minrecs = xfs_inobt_get_minrecs, .get_maxrecs = xfs_inobt_get_maxrecs, .init_key_from_rec = xfs_inobt_init_key_from_rec, + .init_high_key_from_rec = xfs_inobt_init_high_key_from_rec, .init_rec_from_cur = xfs_inobt_init_rec_from_cur, .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, .buf_ops = &xfs_inobt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) + .diff_two_keys = xfs_inobt_diff_two_keys, .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, -#endif }; static const struct xfs_btree_ops xfs_finobt_ops = { @@ -332,14 +352,14 @@ static const struct xfs_btree_ops xfs_finobt_ops = { .get_minrecs = xfs_inobt_get_minrecs, .get_maxrecs = xfs_inobt_get_maxrecs, .init_key_from_rec = xfs_inobt_init_key_from_rec, + .init_high_key_from_rec = xfs_inobt_init_high_key_from_rec, .init_rec_from_cur = xfs_inobt_init_rec_from_cur, .init_ptr_from_cur = xfs_finobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, .buf_ops = &xfs_inobt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) + .diff_two_keys = xfs_inobt_diff_two_keys, .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, -#endif }; /* From darrick.wong@oracle.com Thu Aug 25 18:56:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EE6B98342 for ; Thu, 25 Aug 2016 18:56:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 67E0AAC003 for ; Thu, 25 Aug 2016 16:56:34 -0700 (PDT) X-ASG-Debug-ID: 1472169392-0bf57b5312209dd0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id u2V8fcKz2ciiR4k5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:32 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNuUuJ003162 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:56:31 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNuUlZ017632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:56:30 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNuUPc004585; Thu, 25 Aug 2016 23:56:30 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:29 -0700 Subject: [PATCH 11/24] xfs: support scrubbing rmap btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/24] xfs: support scrubbing rmap btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:28 -0700 Message-ID: <147216938852.6398.18199178103372916204.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169392 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2697 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces necessary to check the rmap btree. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 3 ++- libxfs/xfs_rmap.c | 3 ++- libxfs/xfs_rmap.h | 3 +++ libxfs/xfs_rmap_btree.c | 4 ---- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 03fdfb5..bfc3940 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -567,7 +567,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_CNTBT 5 /* freesp by length btree */ #define XFS_SCRUB_TYPE_INOBT 6 /* inode btree */ #define XFS_SCRUB_TYPE_FINOBT 7 /* free inode btree */ -#define XFS_SCRUB_TYPE_MAX 7 +#define XFS_SCRUB_TYPE_RMAPBT 8 /* reverse mapping btree */ +#define XFS_SCRUB_TYPE_MAX 8 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index 7a75e26..4ce2025 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -177,7 +177,8 @@ done: return error; } -static int +/* Convert an internal btree record to an rmap record. */ +int xfs_rmap_btrec_to_irec( union xfs_btree_rec *rec, struct xfs_rmap_irec *irec) diff --git a/libxfs/xfs_rmap.h b/libxfs/xfs_rmap.h index 7899305..188db38 100644 --- a/libxfs/xfs_rmap.h +++ b/libxfs/xfs_rmap.h @@ -212,5 +212,8 @@ int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno, int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, struct xfs_rmap_irec *irec, int *stat); +union xfs_btree_rec; +int xfs_rmap_btrec_to_irec(union xfs_btree_rec *rec, + struct xfs_rmap_irec *irec); #endif /* __XFS_RMAP_H__ */ diff --git a/libxfs/xfs_rmap_btree.c b/libxfs/xfs_rmap_btree.c index 02ceace..42a6bad 100644 --- a/libxfs/xfs_rmap_btree.c +++ b/libxfs/xfs_rmap_btree.c @@ -375,7 +375,6 @@ const struct xfs_buf_ops xfs_rmapbt_buf_ops = { .verify_write = xfs_rmapbt_write_verify, }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_rmapbt_keys_inorder( struct xfs_btree_cur *cur, @@ -435,7 +434,6 @@ xfs_rmapbt_recs_inorder( return 1; return 0; } -#endif /* DEBUG */ static const struct xfs_btree_ops xfs_rmapbt_ops = { .rec_len = sizeof(struct xfs_rmap_rec), @@ -454,10 +452,8 @@ static const struct xfs_btree_ops xfs_rmapbt_ops = { .key_diff = xfs_rmapbt_key_diff, .buf_ops = &xfs_rmapbt_buf_ops, .diff_two_keys = xfs_rmapbt_diff_two_keys, -#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_rmapbt_keys_inorder, .recs_inorder = xfs_rmapbt_recs_inorder, -#endif }; /* From darrick.wong@oracle.com Thu Aug 25 18:56:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 17383834A for ; Thu, 25 Aug 2016 18:56:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B45EB304039 for ; Thu, 25 Aug 2016 16:56:42 -0700 (PDT) X-ASG-Debug-ID: 1472169400-0bf81509b01e13c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id hv42dd95ZZBDsA02 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNudUx003233 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:39 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNuceJ006697 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:39 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNuc6G004614; Thu, 25 Aug 2016 23:56:38 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:38 -0700 Subject: [PATCH 12/24] xfs: support scrubbing refcount btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 12/24] xfs: support scrubbing refcount btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:34 -0700 Message-ID: <147216939468.6398.12957432650994916456.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169401 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3971 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces necessary to check the refcount btree. If rmap is available, check the reference count by performing an interval query against the rmapbt. v2: Handle the case where the rmap records are not all at least the length of the refcount extent. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 3 ++- libxfs/xfs_refcount_btree.c | 33 +++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index bfc3940..45e0800 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -568,7 +568,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_INOBT 6 /* inode btree */ #define XFS_SCRUB_TYPE_FINOBT 7 /* free inode btree */ #define XFS_SCRUB_TYPE_RMAPBT 8 /* reverse mapping btree */ -#define XFS_SCRUB_TYPE_MAX 8 +#define XFS_SCRUB_TYPE_REFCNTBT 9 /* reference count btree */ +#define XFS_SCRUB_TYPE_MAX 9 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/libxfs/xfs_refcount_btree.c b/libxfs/xfs_refcount_btree.c index d2dbdbd..7975abc 100644 --- a/libxfs/xfs_refcount_btree.c +++ b/libxfs/xfs_refcount_btree.c @@ -163,18 +163,26 @@ xfs_refcountbt_init_key_from_rec( union xfs_btree_key *key, union xfs_btree_rec *rec) { - ASSERT(rec->refc.rc_startblock != 0); - key->refc.rc_startblock = rec->refc.rc_startblock; } STATIC void +xfs_refcountbt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + __u32 x; + + x = be32_to_cpu(rec->refc.rc_startblock); + x += be32_to_cpu(rec->refc.rc_blockcount) - 1; + key->refc.rc_startblock = cpu_to_be32(x); +} + +STATIC void xfs_refcountbt_init_rec_from_cur( struct xfs_btree_cur *cur, union xfs_btree_rec *rec) { - ASSERT(cur->bc_rec.rc.rc_startblock != 0); - rec->refc.rc_startblock = cpu_to_be32(cur->bc_rec.rc.rc_startblock); rec->refc.rc_blockcount = cpu_to_be32(cur->bc_rec.rc.rc_blockcount); rec->refc.rc_refcount = cpu_to_be32(cur->bc_rec.rc.rc_refcount); @@ -204,6 +212,16 @@ xfs_refcountbt_key_diff( return (__int64_t)be32_to_cpu(kp->rc_startblock) - rec->rc_startblock; } +STATIC __int64_t +xfs_refcountbt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return (__int64_t)be32_to_cpu(k1->refc.rc_startblock) - + be32_to_cpu(k2->refc.rc_startblock); +} + STATIC bool xfs_refcountbt_verify( struct xfs_buf *bp) @@ -266,7 +284,6 @@ const struct xfs_buf_ops xfs_refcountbt_buf_ops = { .verify_write = xfs_refcountbt_write_verify, }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_refcountbt_keys_inorder( struct xfs_btree_cur *cur, @@ -295,13 +312,13 @@ xfs_refcountbt_recs_inorder( b.rc_startblock = be32_to_cpu(r2->refc.rc_startblock); b.rc_blockcount = be32_to_cpu(r2->refc.rc_blockcount); b.rc_refcount = be32_to_cpu(r2->refc.rc_refcount); + a = a; b = b; trace_xfs_refcount_rec_order_error(cur->bc_mp, cur->bc_private.a.agno, &a, &b); } return ret; } -#endif /* DEBUG */ static const struct xfs_btree_ops xfs_refcountbt_ops = { .rec_len = sizeof(struct xfs_refcount_rec), @@ -314,14 +331,14 @@ static const struct xfs_btree_ops xfs_refcountbt_ops = { .get_minrecs = xfs_refcountbt_get_minrecs, .get_maxrecs = xfs_refcountbt_get_maxrecs, .init_key_from_rec = xfs_refcountbt_init_key_from_rec, + .init_high_key_from_rec = xfs_refcountbt_init_high_key_from_rec, .init_rec_from_cur = xfs_refcountbt_init_rec_from_cur, .init_ptr_from_cur = xfs_refcountbt_init_ptr_from_cur, .key_diff = xfs_refcountbt_key_diff, .buf_ops = &xfs_refcountbt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) + .diff_two_keys = xfs_refcountbt_diff_two_keys, .keys_inorder = xfs_refcountbt_keys_inorder, .recs_inorder = xfs_refcountbt_recs_inorder, -#endif }; /* From darrick.wong@oracle.com Thu Aug 25 18:56:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 994BA8352 for ; Thu, 25 Aug 2016 18:56:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C91A8F8033 for ; Thu, 25 Aug 2016 16:56:49 -0700 (PDT) X-ASG-Debug-ID: 1472169407-0bf57c55b11c8260001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 6tDRxLww2jHjJJ6q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:47 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNujEX003319 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:46 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNujOi006796 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:45 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNuitp025138; Thu, 25 Aug 2016 23:56:45 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:44 -0700 Subject: [PATCH 13/24] xfs: scrub inodes From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 13/24] xfs: scrub inodes To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:43 -0700 Message-ID: <147216940335.6398.10349625247299837027.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169407 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 716 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Scrub the fields within an inode. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 45e0800..f8301c8 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -569,7 +569,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_FINOBT 7 /* free inode btree */ #define XFS_SCRUB_TYPE_RMAPBT 8 /* reverse mapping btree */ #define XFS_SCRUB_TYPE_REFCNTBT 9 /* reference count btree */ -#define XFS_SCRUB_TYPE_MAX 9 +#define XFS_SCRUB_TYPE_INODE 10 /* inode record */ +#define XFS_SCRUB_TYPE_MAX 10 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ From darrick.wong@oracle.com Thu Aug 25 18:56:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BF9A38355 for ; Thu, 25 Aug 2016 18:56:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7677D304043 for ; Thu, 25 Aug 2016 16:56:55 -0700 (PDT) X-ASG-Debug-ID: 1472169413-0bf8155c751e9480001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id LGHvBDkk2NlVrivD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:56:53 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNuqkn029775 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:52 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNupoF006934 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:52 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNupP6025199; Thu, 25 Aug 2016 23:56:51 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:50 -0700 Subject: [PATCH 14/24] xfs: scrub inode block mappings From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 14/24] xfs: scrub inode block mappings To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:49 -0700 Message-ID: <147216940951.6398.12992976318472582887.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169413 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4088 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Scrub an individual inode's block mappings to make sure they make sense. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.h | 12 ++++++------ libxfs/xfs_bmap_btree.c | 26 ++++++++++++++++++++++---- libxfs/xfs_fs.h | 5 ++++- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/libxfs/xfs_bmap.h b/libxfs/xfs_bmap.h index e60be02..4afa21c 100644 --- a/libxfs/xfs_bmap.h +++ b/libxfs/xfs_bmap.h @@ -235,12 +235,6 @@ int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, int num_exts); int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset); -struct xfs_bmbt_rec_host * - xfs_bmap_search_extents(struct xfs_inode *ip, xfs_fileoff_t bno, - int fork, int *eofp, xfs_extnum_t *lastxp, - struct xfs_bmbt_irec *gotp, - struct xfs_bmbt_irec *prevp); - enum xfs_bmap_intent_type { XFS_BMAP_MAP, XFS_BMAP_UNMAP, @@ -265,4 +259,10 @@ int xfs_bmap_unmap_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, struct xfs_inode *ip, int whichfork, struct xfs_bmbt_irec *imap); +struct xfs_bmbt_rec_host * + xfs_bmap_search_extents(struct xfs_inode *ip, xfs_fileoff_t bno, + int fork, int *eofp, xfs_extnum_t *lastxp, + struct xfs_bmbt_irec *gotp, + struct xfs_bmbt_irec *prevp); + #endif /* __XFS_BMAP_H__ */ diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 601385d..54306b1 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -620,6 +620,16 @@ xfs_bmbt_init_key_from_rec( } STATIC void +xfs_bmbt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + key->bmbt.br_startoff = cpu_to_be64( + xfs_bmbt_disk_get_startoff(&rec->bmbt) + + xfs_bmbt_disk_get_blockcount(&rec->bmbt) - 1); +} + +STATIC void xfs_bmbt_init_rec_from_cur( struct xfs_btree_cur *cur, union xfs_btree_rec *rec) @@ -644,6 +654,16 @@ xfs_bmbt_key_diff( cur->bc_rec.b.br_startoff; } +STATIC __int64_t +xfs_bmbt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + return (__int64_t)be64_to_cpu(k1->bmbt.br_startoff) - + be64_to_cpu(k2->bmbt.br_startoff); +} + static bool xfs_bmbt_verify( struct xfs_buf *bp) @@ -734,7 +754,6 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { }; -#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_bmbt_keys_inorder( struct xfs_btree_cur *cur, @@ -755,7 +774,6 @@ xfs_bmbt_recs_inorder( xfs_bmbt_disk_get_blockcount(&r1->bmbt) <= xfs_bmbt_disk_get_startoff(&r2->bmbt); } -#endif /* DEBUG */ static const struct xfs_btree_ops xfs_bmbt_ops = { .rec_len = sizeof(xfs_bmbt_rec_t), @@ -769,14 +787,14 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .get_minrecs = xfs_bmbt_get_minrecs, .get_dmaxrecs = xfs_bmbt_get_dmaxrecs, .init_key_from_rec = xfs_bmbt_init_key_from_rec, + .init_high_key_from_rec = xfs_bmbt_init_high_key_from_rec, .init_rec_from_cur = xfs_bmbt_init_rec_from_cur, .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, .key_diff = xfs_bmbt_key_diff, + .diff_two_keys = xfs_bmbt_diff_two_keys, .buf_ops = &xfs_bmbt_buf_ops, -#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, -#endif }; /* diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index f8301c8..9829a6a 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -570,7 +570,10 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_RMAPBT 8 /* reverse mapping btree */ #define XFS_SCRUB_TYPE_REFCNTBT 9 /* reference count btree */ #define XFS_SCRUB_TYPE_INODE 10 /* inode record */ -#define XFS_SCRUB_TYPE_MAX 10 +#define XFS_SCRUB_TYPE_BMBTD 11 /* data fork block mapping */ +#define XFS_SCRUB_TYPE_BMBTA 12 /* attr fork block mapping */ +#define XFS_SCRUB_TYPE_BMBTC 13 /* CoW fork block mapping */ +#define XFS_SCRUB_TYPE_MAX 13 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ From darrick.wong@oracle.com Thu Aug 25 18:57:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 733D28364 for ; Thu, 25 Aug 2016 18:57:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id DCCACAC002 for ; Thu, 25 Aug 2016 16:57:01 -0700 (PDT) X-ASG-Debug-ID: 1472169419-0bf57c55b41c8280001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id zwLJsODeHY9Tpdik (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:00 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNuw0t029824 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:56:58 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNuwYO007103 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:56:58 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNuvE2003458; Thu, 25 Aug 2016 23:56:57 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:56:57 -0700 Subject: [PATCH 15/24] xfs: scrub realtime bitmap/summary From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 15/24] xfs: scrub realtime bitmap/summary To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:56:55 -0700 Message-ID: <147216941586.6398.15123421644399719463.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169420 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1853 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Perform simple tests of the realtime bitmap and summary. Signed-off-by: Darrick J. Wong --- libxfs/xfs_format.h | 5 +++++ libxfs/xfs_fs.h | 4 +++- libxfs/xfs_rtbitmap.c | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index df6518e..ed36809 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -315,6 +315,11 @@ static inline bool xfs_sb_good_version(struct xfs_sb *sbp) return false; } +static inline bool xfs_sb_version_hasrealtime(struct xfs_sb *sbp) +{ + return sbp->sb_rblocks > 0; +} + /* * Detect a mismatched features2 field. Older kernels read/wrote * this into the wrong slot, so to be safe we keep them in sync. diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 9829a6a..fd2dd80 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -573,7 +573,9 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_BMBTD 11 /* data fork block mapping */ #define XFS_SCRUB_TYPE_BMBTA 12 /* attr fork block mapping */ #define XFS_SCRUB_TYPE_BMBTC 13 /* CoW fork block mapping */ -#define XFS_SCRUB_TYPE_MAX 13 +#define XFS_SCRUB_TYPE_RTBITMAP 14 /* realtime bitmap */ +#define XFS_SCRUB_TYPE_RTSUM 15 /* realtime summary */ +#define XFS_SCRUB_TYPE_MAX 15 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index 36fe323..70ea975 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -65,7 +65,7 @@ const struct xfs_buf_ops xfs_rtbuf_ops = { * Get a buffer for the bitmap or summary file block specified. * The buffer is returned read and locked. */ -static int +int xfs_rtbuf_get( xfs_mount_t *mp, /* file system mount structure */ xfs_trans_t *tp, /* transaction pointer */ From darrick.wong@oracle.com Thu Aug 25 18:57:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E446F836C for ; Thu, 25 Aug 2016 18:57:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B6DCE8F8033 for ; Thu, 25 Aug 2016 16:57:07 -0700 (PDT) X-ASG-Debug-ID: 1472169426-0bf57b5313209e20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id EcyZekrXMI1SgfAz (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNv41c003660 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:57:05 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNv47f007436 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:04 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNv3ii003479; Thu, 25 Aug 2016 23:57:03 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:03 -0700 Subject: [PATCH 16/24] xfs: scrub should cross-reference with the bnobt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 16/24] xfs: scrub should cross-reference with the bnobt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:02 -0700 Message-ID: <147216942202.6398.14566422832252652021.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169426 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1512 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When we're scrubbing various btrees, cross-reference the records with the bnobt to ensure that we don't also think the space is free. Signed-off-by: Darrick J. Wong --- libxfs/xfs_alloc.c | 19 +++++++++++++++++++ libxfs/xfs_alloc.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 055d57e..96c6e2e 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -2970,3 +2970,22 @@ xfs_alloc_query_range( return xfs_btree_query_range(cur, &low_brec, &high_brec, xfs_alloc_query_range_helper, &query); } + +/* Is there a record covering a given extent? */ +int +xfs_alloc_has_record( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool *exists) +{ + union xfs_btree_irec low; + union xfs_btree_irec high; + + memset(&low, 0, sizeof(low)); + low.a.ar_startblock = bno; + memset(&high, 0xFF, sizeof(high)); + high.a.ar_startblock = bno + len - 1; + + return xfs_btree_has_record(cur, &low, &high, exists); +} diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index c3ada6b..b740456 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -222,4 +222,7 @@ int xfs_alloc_query_range(struct xfs_btree_cur *cur, struct xfs_alloc_rec_incore *high_rec, xfs_alloc_query_range_fn fn, void *priv); +int xfs_alloc_has_record(struct xfs_btree_cur *cur, xfs_agblock_t bno, + xfs_extlen_t len, bool *exist); + #endif /* __XFS_ALLOC_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:57:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 59FC58374 for ; Thu, 25 Aug 2016 18:57:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB9A730404E for ; Thu, 25 Aug 2016 16:57:14 -0700 (PDT) X-ASG-Debug-ID: 1472169432-0bf8155c771e9520001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JTlmgrQlBPQ3jRRq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:13 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNvBaa003731 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:57:11 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNvAwd007499 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:57:11 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNvAi7025241; Thu, 25 Aug 2016 23:57:10 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:10 -0700 Subject: [PATCH 17/24] xfs: cross-reference bnobt records with cntbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 17/24] xfs: cross-reference bnobt records with cntbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:08 -0700 Message-ID: <147216942818.6398.9538162566803812115.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169433 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1346 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Scrub should make sure that each bnobt record has a corresponding cntbt record. Signed-off-by: Darrick J. Wong --- libxfs/xfs_alloc.c | 2 +- libxfs/xfs_alloc.h | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 96c6e2e..380ade3 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -166,7 +166,7 @@ xfs_alloc_lookup_ge( * Lookup the first record less than or equal to [bno, len] * in the btree given by cur. */ -static int /* error */ +int /* error */ xfs_alloc_lookup_le( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ diff --git a/libxfs/xfs_alloc.h b/libxfs/xfs_alloc.h index b740456..2afc024 100644 --- a/libxfs/xfs_alloc.h +++ b/libxfs/xfs_alloc.h @@ -189,6 +189,13 @@ xfs_free_extent( enum xfs_ag_resv_type type); /* block reservation type */ int /* error */ +xfs_alloc_lookup_le( + struct xfs_btree_cur *cur, /* btree cursor */ + xfs_agblock_t bno, /* starting block of extent */ + xfs_extlen_t len, /* length of extent */ + int *stat); /* success/failure */ + +int /* error */ xfs_alloc_lookup_ge( struct xfs_btree_cur *cur, /* btree cursor */ xfs_agblock_t bno, /* starting block of extent */ From darrick.wong@oracle.com Thu Aug 25 18:57:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE21C837C for ; Thu, 25 Aug 2016 18:57:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B063D8F8035 for ; Thu, 25 Aug 2016 16:57:20 -0700 (PDT) X-ASG-Debug-ID: 1472169438-0bf57b5312209e30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id GnGgoqT9oYxmeewf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNvHXg030208 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:17 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvHoS003725 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:17 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNvGDv025257; Thu, 25 Aug 2016 23:57:16 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:16 -0700 Subject: [PATCH 18/24] xfs: cross-reference inode btrees during scrub From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 18/24] xfs: cross-reference inode btrees during scrub To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:14 -0700 Message-ID: <147216943485.6398.7135955874180910126.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169438 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2591 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Cross-reference the inode btrees with the other metadata when we scrub the filesystem. Signed-off-by: Darrick J. Wong --- libxfs/xfs_ialloc.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_ialloc.h | 4 ++++ 2 files changed, 62 insertions(+) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index b880f78..2a1dc47 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -2659,3 +2659,61 @@ xfs_ialloc_pagi_init( xfs_trans_brelse(tp, bp); return 0; } + +/* Is there an inode record covering a given range of inode numbers? */ +int +xfs_ialloc_has_inode_record( + struct xfs_btree_cur *cur, + xfs_agino_t low, + xfs_agino_t high, + bool *exists) +{ + struct xfs_inobt_rec_incore irec; + xfs_agino_t agino; + __uint16_t holemask; + int has; + int i; + int error; + + *exists = false; + error = xfs_inobt_lookup(cur, low, XFS_LOOKUP_LE, &has); + while (error == 0 && has) { + error = xfs_inobt_get_rec(cur, &irec, &has); + if (error || irec.ir_startino > high) + break; + + agino = irec.ir_startino; + holemask = irec.ir_holemask; + for (i = 0; i < XFS_INOBT_HOLEMASK_BITS; holemask >>= 1, + i++, agino += XFS_INODES_PER_HOLEMASK_BIT) { + if (holemask & 1) + continue; + if (agino + XFS_INODES_PER_HOLEMASK_BIT > low && + agino <= high) { + *exists = true; + goto out; + } + } + + error = xfs_btree_increment(cur, 0, &has); + } +out: + return error; +} + +/* Is there an inode record covering a given extent? */ +int +xfs_ialloc_has_inodes_at_extent( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool *exists) +{ + xfs_agino_t low; + xfs_agino_t high; + + low = XFS_OFFBNO_TO_AGINO(cur->bc_mp, bno, 0); + high = XFS_OFFBNO_TO_AGINO(cur->bc_mp, bno + len, 0) - 1; + + return xfs_ialloc_has_inode_record(cur, low, high, exists); +} diff --git a/libxfs/xfs_ialloc.h b/libxfs/xfs_ialloc.h index 8e5861d..f20d958 100644 --- a/libxfs/xfs_ialloc.h +++ b/libxfs/xfs_ialloc.h @@ -171,5 +171,9 @@ int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, union xfs_btree_rec; void xfs_inobt_btrec_to_irec(struct xfs_mount *mp, union xfs_btree_rec *rec, struct xfs_inobt_rec_incore *irec); +int xfs_ialloc_has_inodes_at_extent(struct xfs_btree_cur *cur, + xfs_agblock_t bno, xfs_extlen_t len, bool *exists); +int xfs_ialloc_has_inode_record(struct xfs_btree_cur *cur, xfs_agino_t low, + xfs_agino_t high, bool *exists); #endif /* __XFS_IALLOC_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:57:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A1068384 for ; Thu, 25 Aug 2016 18:57:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3E84AC001 for ; Thu, 25 Aug 2016 16:57:27 -0700 (PDT) X-ASG-Debug-ID: 1472169445-0bf57c55b11c82a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id STkJJgIOwxwl41dh (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNvOGD003790 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:24 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvNR9003817 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:23 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNvMOC004883; Thu, 25 Aug 2016 23:57:23 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:22 -0700 Subject: [PATCH 19/24] xfs: cross-reference reverse-mapping btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 19/24] xfs: cross-reference reverse-mapping btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:21 -0700 Message-ID: <147216944140.6398.9592499704687271521.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169445 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2522 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines When scrubbing various btrees, we should cross-reference the records with the reverse mapping btree. Signed-off-by: Darrick J. Wong --- libxfs/xfs_rmap.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_rmap.h | 5 +++++ 2 files changed, 63 insertions(+) diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index 4ce2025..62096cd 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -2290,3 +2290,61 @@ xfs_rmap_free_extent( return __xfs_rmap_add(mp, dfops, XFS_RMAP_FREE, owner, XFS_DATA_FORK, &bmap); } + +/* Is there a record covering a given extent? */ +int +xfs_rmap_has_record( + struct xfs_btree_cur *cur, + xfs_fsblock_t bno, + xfs_filblks_t len, + bool *exists) +{ + union xfs_btree_irec low; + union xfs_btree_irec high; + + memset(&low, 0, sizeof(low)); + low.r.rm_startblock = bno; + memset(&high, 0xFF, sizeof(high)); + high.r.rm_startblock = bno + len - 1; + + return xfs_btree_has_record(cur, &low, &high, exists); +} + +/* Is there a record covering a given extent? */ +int +xfs_rmap_record_exists( + struct xfs_btree_cur *cur, + xfs_fsblock_t bno, + xfs_filblks_t len, + struct xfs_owner_info *oinfo, + bool *has_rmap) +{ + uint64_t owner; + uint64_t offset; + unsigned int flags; + int stat; + struct xfs_rmap_irec irec; + int error; + + xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); + + error = xfs_rmap_lookup_le(cur, bno, len, owner, offset, flags, &stat); + if (error) + return error; + if (!stat) { + *has_rmap = false; + return 0; + } + + error = xfs_rmap_get_rec(cur, &irec, &stat); + if (error) + return error; + if (!stat) { + *has_rmap = false; + return 0; + } + + *has_rmap = (irec.rm_startblock <= bno && + irec.rm_startblock + irec.rm_blockcount >= bno + len); + return 0; +} diff --git a/libxfs/xfs_rmap.h b/libxfs/xfs_rmap.h index 188db38..c5c5817 100644 --- a/libxfs/xfs_rmap.h +++ b/libxfs/xfs_rmap.h @@ -215,5 +215,10 @@ int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno, union xfs_btree_rec; int xfs_rmap_btrec_to_irec(union xfs_btree_rec *rec, struct xfs_rmap_irec *irec); +int xfs_rmap_has_record(struct xfs_btree_cur *cur, xfs_fsblock_t bno, + xfs_filblks_t len, bool *exists); +int xfs_rmap_record_exists(struct xfs_btree_cur *cur, xfs_fsblock_t bno, + xfs_filblks_t len, struct xfs_owner_info *oinfo, + bool *has_rmap); #endif /* __XFS_RMAP_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:57:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 89E94838E for ; Thu, 25 Aug 2016 18:57:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 32E8A8F8037 for ; Thu, 25 Aug 2016 16:57:35 -0700 (PDT) X-ASG-Debug-ID: 1472169453-0bf8155c771e95c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id kfeKKhUPBtjpFoDy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNvW77030291 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:32 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvVZ4018559 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:31 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvT2j021921; Thu, 25 Aug 2016 23:57:31 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:28 -0700 Subject: [PATCH 20/24] xfs: cross-reference refcount btree during scrub From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 20/24] xfs: cross-reference refcount btree during scrub To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:27 -0700 Message-ID: <147216944755.6398.7839427955228756441.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169453 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1484 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines During metadata btree scrub, we should cross-reference with the reference counts. Signed-off-by: Darrick J. Wong --- libxfs/xfs_refcount.c | 19 +++++++++++++++++++ libxfs/xfs_refcount.h | 3 +++ 2 files changed, 22 insertions(+) diff --git a/libxfs/xfs_refcount.c b/libxfs/xfs_refcount.c index 7d3735f..2d747ba 100644 --- a/libxfs/xfs_refcount.c +++ b/libxfs/xfs_refcount.c @@ -1534,3 +1534,22 @@ xfs_refcount_free_cow_extent( return __xfs_refcount_add(mp, dfops, XFS_REFCOUNT_FREE_COW, fsb, len); } + +/* Is there a record covering a given extent? */ +int +xfs_refcount_has_record( + struct xfs_btree_cur *cur, + xfs_agblock_t bno, + xfs_extlen_t len, + bool *exists) +{ + union xfs_btree_irec low; + union xfs_btree_irec high; + + memset(&low, 0, sizeof(low)); + low.rc.rc_startblock = bno; + memset(&high, 0xFF, sizeof(high)); + high.rc.rc_startblock = bno + len - 1; + + return xfs_btree_has_record(cur, &low, &high, exists); +} diff --git a/libxfs/xfs_refcount.h b/libxfs/xfs_refcount.h index 105c246..a00400f 100644 --- a/libxfs/xfs_refcount.h +++ b/libxfs/xfs_refcount.h @@ -64,4 +64,7 @@ extern int xfs_refcount_free_cow_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, xfs_fsblock_t fsb, xfs_extlen_t len); +extern int xfs_refcount_has_record(struct xfs_btree_cur *cur, + xfs_agblock_t bno, xfs_extlen_t len, bool *exists); + #endif /* __XFS_REFCOUNT_H__ */ From darrick.wong@oracle.com Thu Aug 25 18:57:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B1F868396 for ; Thu, 25 Aug 2016 18:57:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 26DB4AC002 for ; Thu, 25 Aug 2016 16:57:40 -0700 (PDT) X-ASG-Debug-ID: 1472169457-0bf57b5313209e40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id x9b3OWlICGzSFazG (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:38 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNva9Q003839 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:57:36 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNva6g007957 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:36 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvZfU003630; Thu, 25 Aug 2016 23:57:35 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:35 -0700 Subject: [PATCH 21/24] xfs: scrub should cross-reference the realtime bitmap From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 21/24] xfs: scrub should cross-reference the realtime bitmap To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:33 -0700 Message-ID: <147216945371.6398.4788072006138447787.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169458 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1056 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines While we're scrubbing various btrees, cross-reference the records with the other metadata. Signed-off-by: Darrick J. Wong --- libxfs/xfs_rtbitmap.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c index 70ea975..d7a1acd 100644 --- a/libxfs/xfs_rtbitmap.c +++ b/libxfs/xfs_rtbitmap.c @@ -1011,3 +1011,32 @@ xfs_rtfree_extent( } return 0; } + +/* Is the given extent all free? */ +int +xfs_rtbitmap_extent_is_free( + struct xfs_mount *mp, + xfs_rtblock_t start, + xfs_rtblock_t len, + bool *is_free) +{ + xfs_rtblock_t end; + xfs_extlen_t clen; + int matches; + int error; + + *is_free = false; + while (len) { + clen = len > ~0U ? ~0U : len; + error = xfs_rtcheck_range(mp, NULL, start, clen, 1, &end, + &matches); + if (error || !matches || end < start + clen) + return error; + + len -= end - start; + start = end + 1; + } + + *is_free = true; + return error; +} From darrick.wong@oracle.com Thu Aug 25 18:57:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8FA64839E for ; Thu, 25 Aug 2016 18:57:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED2EEAC002 for ; Thu, 25 Aug 2016 16:57:45 -0700 (PDT) X-ASG-Debug-ID: 1472169464-0bf57c55b41c82c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id oKsWnX8LlJSkgD6E (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:44 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNvgdb030387 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:43 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvgTB004119 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:42 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvfTk003650; Thu, 25 Aug 2016 23:57:41 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:41 -0700 Subject: [PATCH 22/24] xfs: query the per-AG reservation counters From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 22/24] xfs: query the per-AG reservation counters To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:39 -0700 Message-ID: <147216945986.6398.8799705861500901774.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169464 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1303 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Establish an ioctl for userspace to query the original and current per-AG reservation counts. This will be used by xfs_scrub to check that the vfs counters are at least somewhat sane. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index fd2dd80..2c37d57 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -580,6 +580,15 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ /* + * AG reserved block counters + */ +struct xfs_fsop_ag_resblks { + __u64 resblks; /* blocks reserved now */ + __u64 resblks_orig; /* blocks reserved at mount time */ + __u64 reserved[2]; +}; + +/* * ioctl limits */ #ifdef XATTR_LIST_MAX @@ -652,6 +661,7 @@ struct xfs_scrub_metadata { #define XFS_IOC_ATTRMULTI_BY_HANDLE _IOW ('X', 123, struct xfs_fsop_attrmulti_handlereq) #define XFS_IOC_FSGEOMETRY _IOR ('X', 124, struct xfs_fsop_geom) #define XFS_IOC_GOINGDOWN _IOR ('X', 125, __uint32_t) +#define XFS_IOC_GET_AG_RESBLKS _IOR ('X', 126, struct xfs_fsop_ag_resblks) /* XFS_IOC_GETFSUUID ---------- deprecated 140 */ /* reflink ioctls; these MUST match the btrfs ioctl definitions */ From darrick.wong@oracle.com Thu Aug 25 18:57:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5656983A6 for ; Thu, 25 Aug 2016 18:57:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 19D088F8033 for ; Thu, 25 Aug 2016 16:57:53 -0700 (PDT) X-ASG-Debug-ID: 1472169470-0bf57b5311209e50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id mVRwCexNP2hLZsyT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNvmHY030438 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:57:48 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNvmQh014720 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:57:48 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNvl4g025463; Thu, 25 Aug 2016 23:57:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:47 -0700 Subject: [PATCH 23/24] xfs_io: provide an interface to the scrub ioctls From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 23/24] xfs_io: provide an interface to the scrub ioctls To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:46 -0700 Message-ID: <147216946601.6398.16187695052276931699.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169470 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6287 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_MV0713, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.50 BSF_SC0_MV0713 Custom rule MV0713 Create a new xfs_io command to call the new XFS metadata scrub ioctl. Signed-off-by: Darrick J. Wong --- io/Makefile | 2 - io/init.c | 1 io/io.h | 2 + io/scrub.c | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++++ man/man8/xfs_io.8 | 8 ++ 5 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 io/scrub.c diff --git a/io/Makefile b/io/Makefile index cc27dba..c430418 100644 --- a/io/Makefile +++ b/io/Makefile @@ -11,7 +11,7 @@ HFILES = init.h io.h CFILES = init.c \ attr.c bmap.c file.c freeze.c fsync.c getrusage.c imap.c link.c \ mmap.c open.c parent.c pread.c prealloc.c pwrite.c seek.c shutdown.c \ - sync.c truncate.c reflink.c fsmap.c + sync.c truncate.c reflink.c fsmap.c scrub.c LLDLIBS = $(LIBXCMD) $(LIBHANDLE) LTDEPENDENCIES = $(LIBXCMD) $(LIBHANDLE) diff --git a/io/init.c b/io/init.c index 9c0da0e..c16bc69 100644 --- a/io/init.c +++ b/io/init.c @@ -87,6 +87,7 @@ init_commands(void) truncate_init(); reflink_init(); cowextsize_init(); + scrub_init(); } static int diff --git a/io/io.h b/io/io.h index 83a8366..10be081 100644 --- a/io/io.h +++ b/io/io.h @@ -176,3 +176,5 @@ extern void cowextsize_init(void); #else #define cowextsize_init() do { } while (0) #endif + +extern void scrub_init(void); diff --git a/io/scrub.c b/io/scrub.c new file mode 100644 index 0000000..8b93121 --- /dev/null +++ b/io/scrub.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include "command.h" +#include "input.h" +#include "init.h" +#include "io.h" + +static cmdinfo_t scrub_cmd; + +/* These must correspond with XFS_SCRUB_TYPE_ */ +struct scrub_descr { + const char *name; + bool is_ag; +}; + +static const struct scrub_descr scrubbers[] = { + {"sb", true}, + {"agf", true}, + {"agfl", true}, + {"agi", true}, + {"bnobt", true}, + {"cntbt", true}, + {"inobt", true}, + {"finobt", true}, + {"rmapbt", true}, + {"refcountbt", true}, + {"inode", false}, + {"bmapbtd", false}, + {"bmapbta", false}, + {"bmapbtc", false}, + {"rtbitmap", false}, + {"rtsummary", false}, + {NULL, false}, +}; + +static void +scrub_help(void) +{ + const struct scrub_descr *d; + + printf(_("\n\ + Scrubs a piece of XFS filesystem metadata. The first argument is the type\n\ + of metadata to examine. Allocation group number(s) can be specified to\n\ + restrict the scrub operation to a subset of allocation groups.\n\ + Certain metadata types do not take AG numbers.\n\ +\n\ + Example:\n\ + 'scrub inobt 3 5 7' - scrubs the inode btree in groups 3, 5, and 7.\n\ +\n\ + Known metadata scrub types are:")); + for (d = scrubbers; d->name; d++) + printf(" %s", d->name); + printf("\n"); +} + +static void +scrub_ioctl( + int fd, + int type, + unsigned long long control) +{ + struct xfs_scrub_metadata meta; + int error; + + memset(&meta, 0, sizeof(meta)); + meta.type = type; + meta.control = control; + + error = ioctl(fd, XFS_IOC_SCRUB_METADATA, &meta); + if (error) + perror("scrub"); +} + +static int +scrub_f( + int argc, + char **argv) +{ + char *p; + int type = -1; + int i, c; + unsigned long long control; + bool is_ag; + struct xfs_fsop_geom geom; + const struct scrub_descr *d; + + while ((c = getopt(argc, argv, "")) != EOF) { + switch (c) { + default: + return command_usage(&scrub_cmd); + } + } + if (optind > argc - 1) + return command_usage(&scrub_cmd); + + for (i = 0, d = scrubbers; d->name; i++, d++) { + if (strcmp(d->name, argv[optind]) == 0) { + type = i; + is_ag = d->is_ag; + } + } + optind++; + + if (type < 0) + return command_usage(&scrub_cmd); + + if (!is_ag) + geom.agcount = 1; + else { + i = xfsctl(file->name, file->fd, XFS_IOC_FSGEOMETRY_V1, &geom); + if (i < 0) { + fprintf(stderr, + _("%s: can't get geometry [\"%s\"]: %s\n"), + progname, file->name, strerror(errno)); + exitcode = 1; + return 0; + } + } + + if (optind == argc) { + for (control = 0; control < geom.agcount; control++) + scrub_ioctl(file->fd, type, control); + return 0; + } + + for (i = optind; i < argc; i++) { + control = strtoull(argv[i], &p, 0); + if (*p != '\0') { + fprintf(stderr, + _("bad control number %s\n"), argv[i]); + return 0; + } + + scrub_ioctl(file->fd, type, control); + } + return 0; +} + +void +scrub_init(void) +{ + scrub_cmd.name = "scrub"; + scrub_cmd.altname = "sc"; + scrub_cmd.cfunc = scrub_f; + scrub_cmd.argmin = 1; + scrub_cmd.argmax = -1; + scrub_cmd.flags = CMD_NOMAP_OK; + scrub_cmd.args = +_("type [agno...]"); + scrub_cmd.oneline = + _("scrubs filesystem metadata"); + scrub_cmd.help = scrub_help; + + add_command(&scrub_cmd); +} diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index a275a63..884db2a 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -926,6 +926,14 @@ verbose output will be printed. .IP .B [NOTE: Not currently operational on Linux.] .PD +.TP +.BI "scrub " type " [ " agnumber... " ]" +Scrub internal XFS filesystem metadata. The +.BI type +parameter specifies which type of metadata to scrub. +AG numbers can optionally be specified to restrict the scrub operation +to a particular set of allocation groups. +By default, all allocation groups are scrubbed. .SH SEE ALSO .BR mkfs.xfs (8), From darrick.wong@oracle.com Thu Aug 25 18:58:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=FUZZY_XPILL,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 73CD283AE for ; Thu, 25 Aug 2016 18:58:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2ED2304051 for ; Thu, 25 Aug 2016 16:58:16 -0700 (PDT) X-ASG-Debug-ID: 1472169478-0bf8155c741e9670001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 1cXuD3D6ueOwdWfD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:57:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNvunb030483 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:56 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvtQI004281 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:57:55 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNvs4n003709; Thu, 25 Aug 2016 23:57:55 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:57:53 -0700 Subject: [PATCH 24/24] xfs_scrub: create online filesystem scrub program From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 24/24] xfs_scrub: create online filesystem scrub program To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:57:52 -0700 Message-ID: <147216947223.6398.13955653425302662945.stgit@birch.djwong.org> In-Reply-To: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> References: <147216931783.6398.1716678878794493264.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169478 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 184831 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, INFO_TLD, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain Create a filesystem scrubbing tool that walks the directory tree, queries every file's extents, extended attributes, and stat data. For generic (non-XFS) filesystems this depends on the kernel to do nearly all the validation. Optionally, we can (try to) read all the file data. For XFS, we perform sequential scans of each AG's metadata, inodes, extent maps, and file data. Being XFS specific, we can work with the in-kernel scrubbers to perform much stronger metadata checking and cross-referencing. We can also take advantage of newer ioctls such as GETFSMAP to perform faster read verification. In the future we will be able to take advantage of (still unwritten) features such as parent directory pointers to fully validate all metadata. However, this tool /should/ work for most non-XFS filesystems such as ext4 and btrfs. Signed-off-by: Darrick J. Wong --- Makefile | 3 configure.ac | 11 include/builddefs.in | 11 m4/Makefile | 1 m4/package_attrdev.m4 | 29 + m4/package_libcdev.m4 | 111 ++ man/man8/xfs_scrub.8 | 96 ++ scrub/Makefile | 43 + scrub/disk.c | 234 +++++ scrub/disk.h | 42 + scrub/extent.c | 383 ++++++++ scrub/extent.h | 53 + scrub/generic.c | 1057 +++++++++++++++++++++++ scrub/iocmd.c | 342 +++++++ scrub/iocmd.h | 46 + scrub/non_xfs.c | 122 +++ scrub/read_verify.c | 182 ++++ scrub/read_verify.h | 58 + scrub/scrub.c | 698 +++++++++++++++ scrub/scrub.h | 147 +++ scrub/xfs.c | 2272 +++++++++++++++++++++++++++++++++++++++++++++++++ scrub/xfs_ioctl.c | 465 ++++++++++ scrub/xfs_ioctl.h | 89 ++ 23 files changed, 6494 insertions(+), 1 deletion(-) create mode 100644 m4/package_attrdev.m4 create mode 100644 man/man8/xfs_scrub.8 create mode 100644 scrub/Makefile create mode 100644 scrub/disk.c create mode 100644 scrub/disk.h create mode 100644 scrub/extent.c create mode 100644 scrub/extent.h create mode 100644 scrub/generic.c create mode 100644 scrub/iocmd.c create mode 100644 scrub/iocmd.h create mode 100644 scrub/non_xfs.c create mode 100644 scrub/read_verify.c create mode 100644 scrub/read_verify.h create mode 100644 scrub/scrub.c create mode 100644 scrub/scrub.h create mode 100644 scrub/xfs.c create mode 100644 scrub/xfs_ioctl.c create mode 100644 scrub/xfs_ioctl.h diff --git a/Makefile b/Makefile index 7bdc670..70c1cab 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ HDR_SUBDIRS = include libxfs DLIB_SUBDIRS = libxlog libxcmd libhandle LIB_SUBDIRS = libxfs $(DLIB_SUBDIRS) TOOL_SUBDIRS = copy db estimate fsck fsr growfs io logprint mkfs quota \ - mdrestore repair rtcp m4 man doc debian + mdrestore repair rtcp m4 man doc debian scrub ifneq ("$(XGETTEXT)","") TOOL_SUBDIRS += po @@ -83,6 +83,7 @@ quota: libxcmd repair: libxlog libxcmd copy: libxlog mkfs: libxcmd +scrub: libhandle libxcmd repair ifeq ($(HAVE_BUILDDEFS), yes) include $(BUILDRULES) diff --git a/configure.ac b/configure.ac index 875d4bb..86d8304 100644 --- a/configure.ac +++ b/configure.ac @@ -133,8 +133,19 @@ AC_HAVE_MNTENT AC_HAVE_FLS AC_HAVE_READDIR AC_HAVE_FSETXATTR +AC_HAVE_FGETXATTR +AC_HAVE_FLISTXATTR +AC_HAVE_LLISTXATTR AC_HAVE_MREMAP AC_HAVE_FSXATTR_COWEXTSIZE +AC_HAVE_MALLINFO +AC_HAVE_SG_IO +AC_HAVE_ATTRIBUTES_H +AC_HAVE_ATTRIBUTES_MACROS +AC_HAVE_ATTRIBUTES_STRUCTS +AC_HAVE_OPENAT +AC_HAVE_READLINKAT +AC_HAVE_SYNCFS if test "$enable_blkid" = yes; then AC_HAVE_BLKID_TOPO diff --git a/include/builddefs.in b/include/builddefs.in index 165fa78..f480658 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -108,9 +108,20 @@ HAVE_READDIR = @have_readdir@ HAVE_MNTENT = @have_mntent@ HAVE_FLS = @have_fls@ HAVE_FSETXATTR = @have_fsetxattr@ +HAVE_FGETXATTR = @have_fgetxattr@ +HAVE_FLISTXATTR = @have_flistxattr@ +HAVE_LLISTXATTR = @have_llistxattr@ HAVE_MREMAP = @have_mremap@ HAVE_FSXATTR_COWEXTSIZE = @have_fsxattr_cowextsize@ ENABLE_INTERNAL_FSXATTR = @enable_internal_fsxattr@ +HAVE_MALLINFO = @have_mallinfo@ +HAVE_SG_IO = @have_sg_io@ +HAVE_ATTRIBUTES_H = @have_attributes_h@ +HAVE_ATTRIBUTES_MACROS = @have_attributes_macros@ +HAVE_ATTRIBUTES_STRUCTS = @have_attributes_structs@ +HAVE_OPENAT = @have_openat@ +HAVE_READLINKAT = @have_readlinkat@ +HAVE_SYNCFS = @have_syncfs@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl diff --git a/m4/Makefile b/m4/Makefile index d282f0a..0c73f35 100644 --- a/m4/Makefile +++ b/m4/Makefile @@ -14,6 +14,7 @@ CONFIGURE = \ LSRCFILES = \ manual_format.m4 \ + package_attrdev.m4 \ package_blkid.m4 \ package_globals.m4 \ package_libcdev.m4 \ diff --git a/m4/package_attrdev.m4 b/m4/package_attrdev.m4 new file mode 100644 index 0000000..eb0e35b --- /dev/null +++ b/m4/package_attrdev.m4 @@ -0,0 +1,29 @@ +AC_DEFUN([AC_HAVE_ATTRIBUTES_H], + [ AC_CHECK_HEADERS(attr/attributes.h, [have_attributes_h=yes]) + AC_SUBST(have_attributes_h) + if test "$have_attributes_h" != "yes"; then + echo + echo 'WARNING: attr/attributes.h does not exist.' + echo 'Install the extended attributes (attr) development package.' + echo 'Alternatively, run "make install-dev" from the attr source.' + echo + fi + ]) + +AC_DEFUN([AC_HAVE_ATTRIBUTES_STRUCTS], + [ AC_CHECK_TYPES([struct attrlist_cursor, struct attr_multiop, struct attrlist_ent], + [have_attributes_structs=yes],, + [ +#include +#include ] ) + AC_SUBST(have_attributes_structs) + ]) + +AC_DEFUN([AC_HAVE_ATTRIBUTES_MACROS], + [ AC_TRY_LINK([ +#include +#include ], + [ int x = ATTR_SECURE; int y = ATTR_ROOT; int z = ATTR_TRUST; ATTR_ENTRY(0, 0); ], + [have_attributes_macros=yes]) + AC_SUBST(have_attributes_macros) + ]) diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 45954c2..744f826 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -245,6 +245,45 @@ AC_DEFUN([AC_HAVE_FSETXATTR], ]) # +# Check if we have a fgetxattr call (Mac OS X) +# +AC_DEFUN([AC_HAVE_FGETXATTR], + [ AC_CHECK_DECL([fgetxattr], + have_fgetxattr=yes, + [], + [#include + #include ] + ) + AC_SUBST(have_fgetxattr) + ]) + +# +# Check if we have a flistxattr call (Mac OS X) +# +AC_DEFUN([AC_HAVE_FLISTXATTR], + [ AC_CHECK_DECL([flistxattr], + have_flistxattr=yes, + [], + [#include + #include ] + ) + AC_SUBST(have_flistxattr) + ]) + +# +# Check if we have a llistxattr call (Mac OS X) +# +AC_DEFUN([AC_HAVE_LLISTXATTR], + [ AC_CHECK_DECL([llistxattr], + have_llistxattr=yes, + [], + [#include + #include ] + ) + AC_SUBST(have_llistxattr) + ]) + +# # Check if there is mntent.h # AC_DEFUN([AC_HAVE_MNTENT], @@ -291,3 +330,75 @@ AC_DEFUN([AC_HAVE_FSXATTR_COWEXTSIZE], ]) AC_SUBST(have_fsxattr_cowextsize) ]) + +# +# Check if we have a mallinfo libc call +# +AC_DEFUN([AC_HAVE_MALLINFO], + [ AC_MSG_CHECKING([for mallinfo ]) + AC_TRY_COMPILE([ +#include + ], [ + struct mallinfo test; + + test.arena = 0; test.hblkhd = 0; test.uordblks = 0; test.fordblks = 0; + test = mallinfo(); + ], have_mallinfo=yes + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + AC_SUBST(have_mallinfo) + ]) + +# +# Check if we have the SG_IO ioctl +# +AC_DEFUN([AC_HAVE_SG_IO], + [ AC_MSG_CHECKING([for struct sg_io_hdr ]) + AC_TRY_COMPILE([#include ], + [ + struct sg_io_hdr hdr; + ioctl(0, SG_IO, &hdr); + ], have_sg_io=yes + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + AC_SUBST(have_sg_io) + ]) + +# +# Check if we have a openat call +# +AC_DEFUN([AC_HAVE_OPENAT], + [ AC_CHECK_DECL([openat], + have_openat=yes, + [], + [#include + #include + #include ] + ) + AC_SUBST(have_openat) + ]) + +# +# Check if we have a readlinkat call +# +AC_DEFUN([AC_HAVE_READLINKAT], + [ AC_CHECK_DECL([readlinkat], + have_readlinkat=yes, + [], + [#include + #include ] + ) + AC_SUBST(have_readlinkat) + ]) + +# +# Check if we have a syncfs call +# +AC_DEFUN([AC_HAVE_SYNCFS], + [ AC_CHECK_DECL([syncfs], + have_syncfs=yes, + [], + [#define _GNU_SOURCE + #include ]) + AC_SUBST(have_syncfs) + ]) diff --git a/man/man8/xfs_scrub.8 b/man/man8/xfs_scrub.8 new file mode 100644 index 0000000..08c70df --- /dev/null +++ b/man/man8/xfs_scrub.8 @@ -0,0 +1,96 @@ +.TH xfs_scrub 8 +.SH NAME +xfs_scrub \- scrub the contents of an XFS filesystem +.SH SYNOPSIS +.B xfs_scrub +[ +.B \-dvx +] [ +.B \-t +.I fstype +] +.I mountpoint +.br +.B xfs_scrub \-V +.SH DESCRIPTION +.B xfs_scrub +attempts to read and check all the metadata in a Linux filesystem. +.PP +If +.B xfs_scrub +does not detect an XFS filesystem, it will use a generic backend to +scrub the filesystem. +This involves walking the directory tree, querying the data and +extended attribute extent maps, performing limited checks of directory +and inode data, reading all of an inode's extended attributes, +optionally reading all data in a file, and comparing the number of +blocks and inodes seen against the reported counters. +.PP +If an XFS filesystem is detected, then +.B xfs_scrub +will use private XFS ioctls to perform more rigorous scrubbing of the +internal metadata. +Currently this is limited to asking the kernel to check the per-AG +btrees, inode data, and realtime metadata. +The in-kernel scrubbers also cross-reference each data structure's +records against the other filesystem metadata. +.SH OPTIONS +.TP +.B \-d +Enable debugging mode, which augments error reports with the exact file +and line where the scrub failure occurred. +This also enables verbose mode. +.TP +.B \-v +Enable verbose mode, which prints periodic status updates. +.TP +.BI \-T +Print timing and memory usage information for each phase. +.TP +.BI \-t " fstype" +Force the use of a particular type of filesystem scrubber. Currently +supported backends are the +.IR xfs , " ext4" , " ext3", " ext2", " btrfs" ", and " generic +scrubbers. +.TP +.B \-V +Prints the version number and exits. +.TP +.B \-x +Scrub file data. This reads every block of every file on disk. +If the filesystem reports file extent mappings or physical extent +mappings and is backed by a block device, +.B xfs_scrub +will issue O_DIRECT reads to the block device directly. +If the block device is a SCSI disk, it will issue READ VERIFY commands +directly to the disk. +.SH EXIT CODE +The exit code returned by +.B xfs_scrub +is the sum of the following conditions: +.br +\ 0\ \-\ No errors +.br +\ 4\ \-\ File system errors left uncorrected +.br +\ 8\ \-\ Operational error +.br +\ 16\ \-\ Usage or syntax error +.br +.SH CAVEATS +.B xfs_scrub +is an immature utility! +The generic scrub backend walks the directory tree, reads file extents +and data, and queries every extended attribute it can find. +The generic scrub does not grab exclusive locks on the objects it is +examining, nor does it have any way to cross-reference what it sees +against the internal filesystem metadata. +.PP +The XFS backend takes advantage of in-kernel scrubbing to verify a +given data structure with locks held. +This can tie up the system for a while. +.PP +If errors are found, the filesystem should be taken offline and +repaired. +.SH SEE ALSO +.BR xfs_repair (8). diff --git a/scrub/Makefile b/scrub/Makefile new file mode 100644 index 0000000..3058f3d --- /dev/null +++ b/scrub/Makefile @@ -0,0 +1,43 @@ +# +# Copyright (c) 2016 Oracle. All Rights Reserved. +# + +TOPDIR = .. +include $(TOPDIR)/include/builddefs + +SCRUB_PREREQS=$(HAVE_FIEMAP)$(HAVE_ATTRIBUTES_H)$(HAVE_ATTRIBUTES_MACROS)$(HAVE_ATTRIBUTES_STRUCTS)$(HAVE_FGETXATTR)$(HAVE_FLISTXATTR)$(HAVE_LLISTXATTR)$(HAVE_OPENAT)$(HAVE_READLINKAT) + +ifeq ($(SCRUB_PREREQS),yesyesyesyesyesyesyesyesyes) +LTCOMMAND = xfs_scrub +endif + +HFILES = scrub.h ../repair/threads.h xfs_ioctl.h read_verify.h iocmd.h +CFILES = ../repair/avl64.c disk.c extent.c generic.c iocmd.c non_xfs.c \ + read_verify.c scrub.c ../repair/threads.c xfs.c xfs_ioctl.c + +LLDLIBS += $(LIBBLKID) $(LIBXFS) $(LIBXCMD) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) $(LIBHANDLE) +LTDEPENDENCIES += $(LIBXFS) $(LIBXCMD) $(LIBHANDLE) +LLDFLAGS = -static-libtool-libs + +ifeq ($(HAVE_MALLINFO),yes) +LCFLAGS += -DHAVE_MALLINFO +endif + +ifeq ($(HAVE_SG_IO),yes) +LCFLAGS += -DHAVE_SG_IO +endif + +ifeq ($(HAVE_SYNCFS),yes) +LCFLAGS += -DHAVE_SYNCFS +endif + +default: depend $(LTCOMMAND) + +include $(BUILDRULES) + +install: default + $(INSTALL) -m 755 -d $(PKG_ROOT_SBIN_DIR) + $(LTINSTALL) -m 755 $(LTCOMMAND) $(PKG_ROOT_SBIN_DIR) +install-dev: + +-include .dep diff --git a/scrub/disk.c b/scrub/disk.c new file mode 100644 index 0000000..0920235 --- /dev/null +++ b/scrub/disk.c @@ -0,0 +1,234 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include +#include +#include +#ifdef HAVE_SG_IO +# include +#endif +#include "disk.h" +#include "scrub.h" + +/* Figure out how many disk heads are available. */ +unsigned int +disk_heads( + struct disk *disk) +{ + int iomin; + int ioopt; + unsigned short rot; + int error; + + if (getenv("XFS_SCRUB_NO_THREADS")) + return 1; + + /* If it's not a block device, throw all the CPUs at it. */ + if (!S_ISBLK(disk->d_sb.st_mode)) + return libxfs_nproc(); + + /* Non-rotational device? Throw all the CPUs. */ + rot = 1; + error = ioctl(disk->d_fd, BLKROTATIONAL, &rot); + if (error == 0 && rot == 0) + return libxfs_nproc(); + + /* + * Sometimes we can infer the number of devices from the + * min/optimal IO sizes. + */ + iomin = ioopt = 0; + if (ioctl(disk->d_fd, BLKIOMIN, &iomin) == 0 && + ioctl(disk->d_fd, BLKIOOPT, &ioopt) == 0 && + iomin > 0 && ioopt > 0) { + return ioopt / iomin; + } + + /* Rotating device? I guess? */ + return libxfs_nproc() / 2; +} + +/* Execute a SCSI VERIFY(16). We hope. */ +#ifdef HAVE_SG_IO +# define SENSE_BUF_LEN 64 +# define VERIFY16_CMDLEN 16 +# define VERIFY16_CMD 0x8F + +# ifndef SG_FLAG_Q_AT_TAIL +# define SG_FLAG_Q_AT_TAIL 0x10 +# endif +int +disk_scsi_verify( + int fd, + uint64_t startblock, /* lba */ + uint64_t blockcount) /* lba */ +{ + struct sg_io_hdr iohdr; + unsigned char cdb[VERIFY16_CMDLEN]; + unsigned char sense[SENSE_BUF_LEN]; + uint64_t llba = startblock; + uint64_t veri_len = blockcount; + int error; + + /* Borrowed from sg_verify */ + cdb[0] = VERIFY16_CMD; + cdb[1] = 0; /* skip PI, DPO, and byte check. */ + cdb[2] = (llba >> 56) & 0xff; + cdb[3] = (llba >> 48) & 0xff; + cdb[4] = (llba >> 40) & 0xff; + cdb[5] = (llba >> 32) & 0xff; + cdb[6] = (llba >> 24) & 0xff; + cdb[7] = (llba >> 16) & 0xff; + cdb[8] = (llba >> 8) & 0xff; + cdb[9] = llba & 0xff; + cdb[10] = (veri_len >> 24) & 0xff; + cdb[11] = (veri_len >> 16) & 0xff; + cdb[12] = (veri_len >> 8) & 0xff; + cdb[13] = veri_len & 0xff; + cdb[14] = 0; + cdb[15] = 0; + memset(sense, 0, SENSE_BUF_LEN); + + /* v3 SG_IO */ + memset(&iohdr, 0, sizeof(iohdr)); + iohdr.interface_id = 'S'; + iohdr.dxfer_direction = SG_DXFER_NONE; + iohdr.cmdp = cdb; + iohdr.cmd_len = VERIFY16_CMDLEN; + iohdr.sbp = sense; + iohdr.mx_sb_len = SENSE_BUF_LEN; + iohdr.flags |= SG_FLAG_Q_AT_TAIL; + iohdr.timeout = 30000; /* 30s */ + + error = ioctl(fd, SG_IO, &iohdr); + if (error) + return error; + + dbg_printf("VERIFY(16) fd %d lba %"PRIu64" len %"PRIu64" info %x " + "status %d masked %d msg %d host %d driver %d " + "duration %d resid %d\n", + fd, startblock, blockcount, iohdr.info, + iohdr.status, iohdr.masked_status, iohdr.msg_status, + iohdr.host_status, iohdr.driver_status, iohdr.duration, + iohdr.resid); + + if (iohdr.info & SG_INFO_CHECK) { + errno = EIO; + return -1; + } + + return error; +} +#else +# define disk_scsi_verify(...) (ENOTTY) +#endif /* HAVE_SG_IO */ + +/* Test the availability of the kernel scrub ioctl. */ +bool +disk_can_scsi_verify( + int fd) +{ + int error; + + if (getenv("XFS_SCRUB_NO_SCSI_VERIFY")) + return false; + + error = disk_scsi_verify(fd, 0, 1); + return error == 0; +} + +/* Open a disk device and discover its geometry. */ +int +disk_open( + const char *pathname, + struct disk *disk) +{ + int lba_sz; + int error; + + disk->d_fd = open(pathname, O_RDONLY | O_DIRECT | O_NOATIME); + if (disk->d_fd < 0) + return -1; + error = ioctl(disk->d_fd, BLKSSZGET, &lba_sz); + if (error) + lba_sz = 512; + disk->d_lbalog = libxfs_log2_roundup(lba_sz); + if (disk_can_scsi_verify(disk->d_fd)) + disk->d_flags |= DISK_FLAG_SCSI_VERIFY; + error = fstat64(disk->d_fd, &disk->d_sb); + if (error == 0) { + if (S_ISBLK(disk->d_sb.st_mode)) { + error = ioctl(disk->d_fd, BLKGETSIZE64, + &disk->d_nrsectors); + if (error) + disk->d_nrsectors = 0; + } else + disk->d_nrsectors = disk->d_sb.st_size >> BBSHIFT; + } else { + error = errno; + close(disk->d_fd); + errno = error; + disk->d_fd = -1; + return -1; + } + return 0; +} + +/* Close a disk device. */ +int +disk_close( + struct disk *disk) +{ + int error = 0; + + if (disk->d_fd >= 0) + error = close(disk->d_fd); + disk->d_fd = -1; + return error; +} + +/* Is this device open? */ +bool +disk_is_open( + struct disk *disk) +{ + return disk->d_fd >= 0; +} + +/* Read-verify an extent of a disk device. */ +ssize_t +disk_read_verify( + struct disk *disk, + void *buf, + uint64_t startblock, + uint64_t blockcount) +{ + uint64_t end = startblock + blockcount; + + /* Convert to logical block size. */ + startblock = startblock >> (disk->d_lbalog - BBSHIFT); + end = end >> (disk->d_lbalog - BBSHIFT); + blockcount = end - startblock; + if (disk->d_flags & DISK_FLAG_SCSI_VERIFY) + return disk_scsi_verify(disk->d_fd, startblock, blockcount); + + return pread64(disk->d_fd, buf, blockcount << disk->d_lbalog, + startblock << disk->d_lbalog); +} diff --git a/scrub/disk.h b/scrub/disk.h new file mode 100644 index 0000000..986b83a --- /dev/null +++ b/scrub/disk.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef DISK_H_ +#define DISK_H_ + +#define DISK_FLAG_SCSI_VERIFY 0x1 +struct disk { + struct stat64 d_sb; + int d_fd; + int d_lbalog; + unsigned int d_flags; + uint64_t d_nrsectors; /* 512b */ +}; + +int disk_scsi_verify(int fd, uint64_t startblock, uint64_t len); +bool disk_can_scsi_verify(int fd); + +unsigned int disk_heads(struct disk *disk); +bool disk_is_open(struct disk *disk); +int disk_open(const char *pathname, struct disk *disk); +int disk_close(struct disk *disk); +ssize_t disk_read_verify(struct disk *disk, void *buf, uint64_t startblock, + uint64_t blockcount); + +#endif /* DISK_H_ */ diff --git a/scrub/extent.c b/scrub/extent.c new file mode 100644 index 0000000..5d110fb --- /dev/null +++ b/scrub/extent.c @@ -0,0 +1,383 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include "../repair/avl64.h" +#include "extent.h" + +struct extent_tree_node { + struct avl64node etn_node; + uint64_t etn_start; + uint64_t etn_length; +}; + +static __uint64_t +extent_start( + struct avl64node *node) +{ + struct extent_tree_node *etn; + + etn = container_of(node, struct extent_tree_node, etn_node); + return etn->etn_start; +} + +static __uint64_t +extent_end( + struct avl64node *node) +{ + struct extent_tree_node *etn; + + etn = container_of(node, struct extent_tree_node, etn_node); + return etn->etn_start + etn->etn_length; +} + +static struct avl64ops extent_tree_ops = { + extent_start, + extent_end, +}; + +/* Initialize an extent tree. */ +bool +extent_tree_init( + struct extent_tree *tree) +{ + tree->et_tree = malloc(sizeof(struct avl64tree_desc)); + if (!tree) + return false; + + pthread_mutex_init(&tree->et_lock, NULL); + avl64_init_tree(tree->et_tree, &extent_tree_ops); + + return true; +} + +/* Free an extent tree. */ +void +extent_tree_free( + struct extent_tree *tree) +{ + struct avl64node *node; + struct avl64node *n; + struct extent_tree_node *ext; + + if (!tree->et_tree) + return; + + avl_for_each_safe(tree->et_tree, node, n) { + ext = container_of(node, struct extent_tree_node, etn_node); + free(ext); + } + free(tree->et_tree); + tree->et_tree = NULL; +} + +/* Create a new extent. */ +static struct extent_tree_node * +extent_tree_node_init( + uint64_t start, + uint64_t len) +{ + struct extent_tree_node *ext; + + ext = malloc(sizeof(struct extent_tree_node)); + if (!ext) + return NULL; + + ext->etn_node.avl_nextino = NULL; + ext->etn_start = start; + ext->etn_length = len; + + return ext; +} + +/* Add an extent. */ +static bool +__extent_tree_add( + struct extent_tree *tree, + uint64_t start, + uint64_t length) +{ + struct avl64node *firstn; + struct avl64node *lastn; + struct avl64node *pos; + struct avl64node *n; + struct avl64node *l; + struct extent_tree_node *ext; + uint64_t new_start; + uint64_t new_length; + struct avl64node *node; + bool res = true; + + /* Find any existing nodes over that range. */ + avl64_findranges(tree->et_tree, start - 1, start + length, + &firstn, &lastn); + + /* Nothing, just insert a new extent. */ + if (firstn == NULL && lastn == NULL) { + ext = extent_tree_node_init(start, length); + if (!ext) + return false; + + node = avl64_insert(tree->et_tree, &ext->etn_node); + if (node == NULL) { + free(ext); + errno = EEXIST; + return false; + } + + return true; + } + + ASSERT(firstn != NULL && lastn != NULL); + new_start = start; + new_length = length; + + avl_for_each_range_safe(pos, n, l, firstn, lastn) { + ext = container_of(pos, struct extent_tree_node, etn_node); + + /* Bail if the new extent is contained within an old one. */ + if (ext->etn_start <= start && ext->etn_length >= length) + return res; + + /* Check for overlapping and adjacent extents. */ + if (ext->etn_start + ext->etn_length >= start || + ext->etn_start <= start + length) { + if (ext->etn_start < start) + new_start = ext->etn_start; + + if (ext->etn_start + ext->etn_length > + new_start + new_length) + new_length = ext->etn_start + ext->etn_length - + new_start; + + avl64_delete(tree->et_tree, pos); + free(ext); + } + } + + ext = extent_tree_node_init(new_start, new_length); + if (!ext) + return false; + + node = avl64_insert(tree->et_tree, &ext->etn_node); + if (node == NULL) { + free(ext); + errno = EEXIST; + return false; + } + + return res; +} + +/* Add an extent. */ +bool +extent_tree_add( + struct extent_tree *tree, + uint64_t start, + uint64_t length) +{ + bool res; + + pthread_mutex_lock(&tree->et_lock); + res = __extent_tree_add(tree, start, length); + pthread_mutex_unlock(&tree->et_lock); + + return res; +} + +/* Remove an extent. */ +bool +extent_tree_remove( + struct extent_tree *tree, + uint64_t start, + uint64_t len) +{ + struct avl64node *firstn; + struct avl64node *lastn; + struct avl64node *pos; + struct avl64node *n; + struct avl64node *l; + struct extent_tree_node *ext; + uint64_t new_start; + uint64_t new_length; + struct avl64node *node; + int stat; + + pthread_mutex_lock(&tree->et_lock); + /* Find any existing nodes over that range. */ + avl64_findranges(tree->et_tree, start - 1, start + len - 1, + &firstn, &lastn); + + /* Nothing, we're done. */ + if (firstn == NULL && lastn == NULL) { + pthread_mutex_unlock(&tree->et_lock); + return true; + } + + ASSERT(firstn != NULL && lastn != NULL); + + /* Delete or truncate everything in sight. */ + avl_for_each_range_safe(pos, n, l, firstn, lastn) { + ext = container_of(pos, struct extent_tree_node, etn_node); + + stat = 0; + if (ext->etn_start < start) + stat |= 1; + if (ext->etn_start + ext->etn_length > start + len) + stat |= 2; + switch (stat) { + case 0: + /* Extent totally within range; delete. */ + avl64_delete(tree->et_tree, pos); + free(ext); + break; + case 1: + /* Extent is left-adjacent; truncate. */ + ext->etn_length = start - ext->etn_start; + break; + case 2: + /* Extent is right-adjacent; move it. */ + ext->etn_length = ext->etn_start + ext->etn_length - + (start + len); + ext->etn_start = start + len; + break; + case 3: + /* Extent overlaps both ends. */ + ext->etn_length = start - ext->etn_start; + new_start = start + len; + new_length = ext->etn_start + ext->etn_length - + new_start; + + ext = extent_tree_node_init(new_start, new_length); + if (!ext) + return false; + + node = avl64_insert(tree->et_tree, &ext->etn_node); + if (node == NULL) { + errno = EEXIST; + return false; + } + break; + } + } + + pthread_mutex_unlock(&tree->et_lock); + return true; +} + +/* Iterate an extent tree. */ +bool +extent_tree_iterate( + struct extent_tree *tree, + bool (*fn)(uint64_t, uint64_t, void *), + void *arg) +{ + struct avl64node *node; + struct extent_tree_node *ext; + bool moveon = true; + + pthread_mutex_lock(&tree->et_lock); + avl_for_each(tree->et_tree, node) { + ext = container_of(node, struct extent_tree_node, etn_node); + moveon = fn(ext->etn_start, ext->etn_length, arg); + if (!moveon) + break; + } + pthread_mutex_unlock(&tree->et_lock); + + return moveon; +} + +/* Do any extents overlap the given one? */ +bool +extent_tree_has_extent( + struct extent_tree *tree, + uint64_t start, + uint64_t len) +{ + struct avl64node *firstn; + struct avl64node *lastn; + bool res; + + pthread_mutex_lock(&tree->et_lock); + /* Find any existing nodes over that range. */ + avl64_findranges(tree->et_tree, start - 1, start + len - 1, + &firstn, &lastn); + + res = firstn != NULL && lastn != NULL; + pthread_mutex_unlock(&tree->et_lock); + + return res; +} + +/* Is it empty? */ +bool +extent_tree_empty( + struct extent_tree *tree) +{ + return tree->et_tree->avl_firstino == NULL; +} + +static bool +merge_helper( + uint64_t start, + uint64_t length, + void *arg) +{ + struct extent_tree *thistree = arg; + + return __extent_tree_add(thistree, start, length); +} + +/* Merge another tree with this one. */ +bool +extent_tree_merge( + struct extent_tree *thistree, + struct extent_tree *tree) +{ + bool res; + + assert(thistree != tree); + + pthread_mutex_lock(&thistree->et_lock); + res = extent_tree_iterate(tree, merge_helper, thistree); + pthread_mutex_unlock(&thistree->et_lock); + + return res; +} + +static bool +extent_tree_dump_fn( + uint64_t startblock, + uint64_t blockcount, + void *arg) +{ + printf("%"PRIu64":%"PRIu64"\n", startblock, blockcount); + return true; +} + +/* Dump extent tree. */ +void +extent_tree_dump( + struct extent_tree *tree) +{ + printf("EXTENT TREE %p\n", tree); + extent_tree_iterate(tree, extent_tree_dump_fn, NULL); + printf("EXTENT DUMP DONE\n"); +} diff --git a/scrub/extent.h b/scrub/extent.h new file mode 100644 index 0000000..6d35a38 --- /dev/null +++ b/scrub/extent.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef EXTENT_H_ +#define EXTENT_H_ + +struct extent_tree { + pthread_mutex_t et_lock; + struct avl64tree_desc *et_tree; +}; + +#define avl_for_each_range_safe(pos, n, l, first, last) \ + for (pos = (first), n = pos->avl_nextino, l = (last)->avl_nextino; pos != (l); \ + pos = n, n = pos ? pos->avl_nextino : NULL) + +#define avl_for_each_safe(tree, pos, n) \ + for (pos = (tree)->avl_firstino, n = pos ? pos->avl_nextino : NULL; \ + pos != NULL; \ + pos = n, n = pos ? pos->avl_nextino : NULL) + +#define avl_for_each(tree, pos) \ + for (pos = (tree)->avl_firstino; pos != NULL; pos = pos->avl_nextino) + +bool extent_tree_init(struct extent_tree *tree); +void extent_tree_free(struct extent_tree *tree); +bool extent_tree_add(struct extent_tree *tree, uint64_t start, uint64_t length); +bool extent_tree_remove(struct extent_tree *tree, uint64_t start, + uint64_t len); +bool extent_tree_iterate(struct extent_tree *tree, + bool (*fn)(uint64_t, uint64_t, void *), void *arg); +bool extent_tree_has_extent(struct extent_tree *tree, uint64_t start, + uint64_t len); +bool extent_tree_empty(struct extent_tree *tree); +bool extent_tree_merge(struct extent_tree *thistree, struct extent_tree *tree); +void extent_tree_dump(struct extent_tree *tree); + +#endif /* EXTENT_H_ */ diff --git a/scrub/generic.c b/scrub/generic.c new file mode 100644 index 0000000..5668bd4 --- /dev/null +++ b/scrub/generic.c @@ -0,0 +1,1057 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include +#include +#include +#include +#include +#include "disk.h" +#include "scrub.h" +#include "iocmd.h" +#include "../repair/threads.h" +#include "read_verify.h" +#include "extent.h" + +/* + * Generic Filesystem Scrub Strategy + * + * For a generic filesystem, we can only scrub the filesystem using the + * generic VFS APIs that are accessible to userspace. This requirement + * reduces the effectiveness of the scrub because we can only scrub that + * which we can find through the directory tree namespace -- we won't be + * able to examine open unlinked files or any directory subtree that is + * also a mountpoint. + * + * The "find geometry" phase collects statfs/statvfs information and + * opens file descriptors to the mountpoint. If the filesystem has a + * block device, a file descriptor is opened to that as well. + * + * The VFS has no mechanism to scrub internal metadata or to iterate + * inodes by inode number, so those phases do nothing. + * + * The "check directory structure" phase walks the directory tree + * looking for inodes. Each directory is processed separately by thread + * pool workers. For each entry in a directory, we scrub the following + * pieces of metadata: + * + * - The dirent inode number is compared against the fstatat output. + * - The dirent type code is also checked against the fstatat type. + * - If it's a symlink, the target is read but not validated. + * - If the entry is not a file or directory, the extended + * attributes names and values are read via llistxattr. + * - If the entry points to a file or directory, open the inode. + * If not, we're done with the entry. + * - The inode stat buffer is re-checked. + * - The extent maps for file data and extended attribute data are + * checked. + * - Extended attributes are read. + * + * The "verify data file integrity" phase re-walks the directory tree + * for files. If the filesystem supports FIEMAP and we have the block + * device open, the data extents are read directly from disk. This step + * is optimized by buffering the disk extents in a bitmap and using the + * bitmap to issue large IOs; if there are errors, those are recorded + * and cross-referenced against the metadata to identify the affected + * files with a second walk/FIEMAP run. If FIEMAP is unavailable, it + * falls back to using SEEK_DATA and SEEK_HOLE to direct-read file + * contents. If even that fails, direct-read the entire file. + * + * In the "check summary counters" phase, we tally up the blocks and + * inodes we saw and compare that to the statfs output. This gives the + * user a rough estimate of how thorough the scrub was. + */ + +#ifndef SEEK_DATA +# define SEEK_DATA 3 /* seek to the next data */ +#endif + +#ifndef SEEK_HOLE +# define SEEK_HOLE 4 /* seek to the next hole */ +#endif + +/* Routines to translate bad physical extents into file paths and offsets. */ + +/* Report if this extent overlaps a bad region. */ +static bool +report_verify_inode_fiemap( + struct scrub_ctx *ctx, + const char *descr, + struct fiemap_extent *extent, + void *arg) +{ + struct extent_tree *tree = arg; + + /* Skip non-real/non-aligned extents. */ + if (extent->fe_flags & (FIEMAP_EXTENT_UNKNOWN | + FIEMAP_EXTENT_DELALLOC | + FIEMAP_EXTENT_ENCODED | + FIEMAP_EXTENT_NOT_ALIGNED | + FIEMAP_EXTENT_UNWRITTEN)) + return true; + + if (!extent_tree_has_extent(tree, extent->fe_physical >> BBSHIFT, + extent->fe_length >> BBSHIFT)) + return true; + + str_error(ctx, descr, +_("offset %llu failed read verification."), + extent->fe_logical >> BBSHIFT); + + return true; +} + +/* Iterate the extent mappings of a file to report errors. */ +static bool +report_verify_fd( + struct scrub_ctx *ctx, + const char *descr, + int fd, + void *arg) +{ + /* data fork */ + fiemap(ctx, descr, fd, false, false, report_verify_inode_fiemap, arg); + + /* attr fork */ + fiemap(ctx, descr, fd, true, false, report_verify_inode_fiemap, arg); + + return true; +} + +/* Scan the inode associated with a directory entry. */ +static bool +report_verify_dirent( + struct scrub_ctx *ctx, + const char *path, + int dir_fd, + struct dirent *dirent, + struct stat64 *sb, + void *arg) +{ + bool moveon; + int fd; + + /* Ignore things we can't open. */ + if (!S_ISREG(sb->st_mode)) + return true; + /* Ignore . and .. */ + if (!strcmp(".", dirent->d_name) || !strcmp("..", dirent->d_name)) + return true; + + /* Open the file */ + fd = openat(dir_fd, dirent->d_name, + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) + return true; + + /* Go find the badness. */ + moveon = report_verify_fd(ctx, path, fd, arg); + if (moveon) + goto out; + +out: + close(fd); + + return moveon; +} + +/* Given bad extent lists for the data device, find bad files. */ +static bool +report_verify_errors( + struct scrub_ctx *ctx, + struct extent_tree *d_bad) +{ + /* Scan the directory tree to get file paths. */ + return scan_fs_tree(ctx, NULL, report_verify_dirent, d_bad); +} + +/* Phase 1 */ +bool +generic_scan_fs( + struct scrub_ctx *ctx) +{ + /* Nothing to do here. */ + return true; +} + +bool +generic_cleanup( + struct scrub_ctx *ctx) +{ + /* Nothing to do here. */ + return true; +} + +/* Phase 2 */ +bool +generic_scan_metadata( + struct scrub_ctx *ctx) +{ + /* Nothing to do here. */ + return true; +} + +/* Phase 3 */ +bool +generic_scan_inodes( + struct scrub_ctx *ctx) +{ + /* Nothing to do here. */ + return true; +} + +/* Phase 4 */ + +/* Check all entries in a directory. */ +bool +generic_check_dir( + struct scrub_ctx *ctx, + const char *descr, + int dir_fd) +{ + /* Nothing to do here. */ + return true; +} + +/* Check an extent for problems. */ +static bool +check_fiemap_extent( + struct scrub_ctx *ctx, + const char *descr, + struct fiemap_extent *extent, + void *arg) +{ + unsigned long long eofs; + unsigned long quirks; + + pthread_mutex_lock(&ctx->lock); + quirks = ctx->quirks; + pthread_mutex_unlock(&ctx->lock); + + if (quirks & SCRUB_QUIRK_IGNORE_STATFS_BLOCKS) + eofs = ctx->datadev.d_nrsectors; + else + eofs = ctx->mnt_sf.f_blocks * ctx->mnt_sf.f_frsize; + + if (extent->fe_length == 0) + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) has zero length."), + extent->fe_physical >> BBSHIFT, + extent->fe_logical >> BBSHIFT, + extent->fe_length >> BBSHIFT); + if (extent->fe_physical > eofs) + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) starts past end of filesystem at %llu."), + extent->fe_physical >> BBSHIFT, + extent->fe_logical >> BBSHIFT, + extent->fe_length >> BBSHIFT, + eofs >> BBSHIFT); + if (extent->fe_physical + extent->fe_length > eofs || + extent->fe_physical + extent->fe_length < + extent->fe_physical) + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) ends past end of filesystem at %llu."), + extent->fe_physical >> BBSHIFT, + extent->fe_logical >> BBSHIFT, + extent->fe_length >> BBSHIFT, + eofs >> BBSHIFT); + if (extent->fe_logical + extent->fe_length < + extent->fe_logical) + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) overflows file offset."), + extent->fe_physical >> BBSHIFT, + extent->fe_logical >> BBSHIFT, + extent->fe_length >> BBSHIFT); + return true; +} + +/* Check an inode's extents. */ +bool +generic_scan_extents( + struct scrub_ctx *ctx, + const char *descr, + int fd, + struct stat64 *sb, + bool attr_fork) +{ + /* FIEMAP only works for files. */ + if (!S_ISREG(sb->st_mode)) + return true; + + return fiemap(ctx, descr, fd, attr_fork, true, + check_fiemap_extent, NULL); +} + +/* Check the fields of an inode. */ +bool +generic_check_inode( + struct scrub_ctx *ctx, + const char *descr, + int fd, + struct stat64 *sb) +{ + if (sb->st_nlink == 0) + str_error(ctx, descr, +_("nlinks should not be 0.")); + + return true; +} + +/* Try to read all the extended attributes. */ +bool +generic_scan_xattrs( + struct scrub_ctx *ctx, + const char *descr, + int fd) +{ + char *buf = NULL; + char *p; + ssize_t buf_sz; + ssize_t sz; + ssize_t val_sz; + ssize_t sz2; + bool moveon = true; + + buf_sz = flistxattr(fd, NULL, 0); + if (buf_sz == -EOPNOTSUPP) + return true; + else if (buf_sz == 0) + return true; + else if (buf_sz < 0) { + str_errno(ctx, descr); + return true; + } + + buf = malloc(buf_sz); + if (!buf) { + str_errno(ctx, descr); + return false; + } + + sz = flistxattr(fd, buf, buf_sz); + if (sz < 0) { + str_errno(ctx, descr); + goto out; + } else if (sz != buf_sz) { + str_error(ctx, descr, +_("read %zu bytes of xattr names, expected %zu bytes."), + sz, buf_sz); + } + + /* Read all the attrs and values. */ + for (p = buf; p < buf + sz; p += strlen(p) + 1) { + val_sz = fgetxattr(fd, p, NULL, 0); + if (val_sz < 0) { + if (errno != ENODATA) + str_errno(ctx, descr); + continue; + } + sz2 = fgetxattr(fd, p, ctx->readbuf, val_sz); + if (sz2 < 0) { + str_errno(ctx, descr); + continue; + } else if (sz2 != val_sz) + str_error(ctx, descr, +_("read %zu bytes from xattr %s value, expected %zu bytes."), + sz2, p, val_sz); + } +out: + free(buf); + return moveon; +} + +/* Try to read all the extended attributes of things that have no fd. */ +bool +generic_scan_special_xattrs( + struct scrub_ctx *ctx, + const char *path) +{ + char *buf = NULL; + char *p; + ssize_t buf_sz; + ssize_t sz; + ssize_t val_sz; + ssize_t sz2; + bool moveon = true; + + buf_sz = llistxattr(path, NULL, 0); + if (buf_sz == -EOPNOTSUPP) + return true; + else if (buf_sz == 0) + return true; + else if (buf_sz < 0) { + str_errno(ctx, path); + return true; + } + + buf = malloc(buf_sz); + if (!buf) { + str_errno(ctx, path); + return false; + } + + sz = llistxattr(path, buf, buf_sz); + if (sz < 0) { + str_errno(ctx, path); + goto out; + } else if (sz != buf_sz) { + str_error(ctx, path, +_("read %zu bytes of xattr names, expected %zu bytes."), + sz, buf_sz); + } + + /* Read all the attrs and values. */ + for (p = buf; p < buf + sz; p += strlen(p) + 1) { + val_sz = lgetxattr(path, p, NULL, 0); + if (val_sz < 0) { + str_errno(ctx, path); + continue; + } + sz2 = lgetxattr(path, p, ctx->readbuf, val_sz); + if (sz2 < 0) { + str_errno(ctx, path); + continue; + } else if (sz2 != val_sz) + str_error(ctx, path, +_("read %zu bytes from xattr %s value, expected %zu bytes."), + sz2, p, val_sz); + } +out: + free(buf); + return moveon; +} + +/* Directory checking */ +#define CHECK_TYPE(type) \ + case DT_##type: \ + if (!S_IS##type(sb->st_mode)) { \ + str_error(ctx, descr, \ +_("dtype of block does not match mode 0x%x\n"), \ + sb->st_mode & S_IFMT); \ + } \ + break; + +/* Ensure that the directory entry matches the stat info. */ +static bool +generic_verify_dirent( + struct scrub_ctx *ctx, + const char *descr, + struct dirent *dirent, + struct stat64 *sb) +{ + if (dirent->d_ino != sb->st_ino) { + str_error(ctx, descr, +_("inode numbers (%llu != %llu) do not match!"), + (unsigned long long)dirent->d_ino, + (unsigned long long)sb->st_ino); + } + + switch (dirent->d_type) { + case DT_UNKNOWN: + break; + CHECK_TYPE(BLK) + CHECK_TYPE(CHR) + CHECK_TYPE(DIR) + CHECK_TYPE(FIFO) + CHECK_TYPE(LNK) + CHECK_TYPE(REG) + CHECK_TYPE(SOCK) + } + + return true; +} +#undef CHECK_TYPE + +/* Scan the inode associated with a directory entry. */ +static bool +check_dirent( + struct scrub_ctx *ctx, + const char *path, + int dir_fd, + struct dirent *dirent, + struct stat64 *sb, + void *arg) +{ + struct stat64 fd_sb; + static char linkbuf[PATH_MAX]; + ssize_t len; + bool moveon; + int fd; + int error; + + /* Check the directory entry itself. */ + moveon = generic_verify_dirent(ctx, path, dirent, sb); + if (!moveon) + return moveon; + + /* If symlink, read the target value. */ + if (S_ISLNK(sb->st_mode)) { + len = readlinkat(dir_fd, dirent->d_name, linkbuf, + PATH_MAX); + if (len < 0) + str_errno(ctx, path); + else if (len != sb->st_size) + str_error(ctx, path, +_("read %zu bytes from a %zu byte symlink?"), + len, sb->st_size); + } + + /* Read the xattrs without a file descriptor. */ + if (S_ISSOCK(sb->st_mode) || S_ISFIFO(sb->st_mode) || + S_ISBLK(sb->st_mode) || S_ISCHR(sb->st_mode) || + S_ISLNK(sb->st_mode)) { + moveon = ctx->ops->scan_special_xattrs(ctx, path); + if (!moveon) + return moveon; + } + + /* If not dir or file, move on to the next dirent. */ + if (!S_ISDIR(sb->st_mode) && !S_ISREG(sb->st_mode)) + return true; + + /* Open the file */ + fd = openat(dir_fd, dirent->d_name, + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) { + if (errno != ENOENT) + str_errno(ctx, path); + return true; + } + + /* Did the fstatat and the open race? */ + if (fstat64(fd, &fd_sb) < 0) { + str_errno(ctx, path); + goto close; + } + if (fd_sb.st_ino != sb->st_ino || fd_sb.st_dev != sb->st_dev) + str_warn(ctx, path, +_("inode changed out from under us!")); + + /* Check the inode. */ + moveon = ctx->ops->check_inode(ctx, path, fd, &fd_sb); + if (!moveon) + goto close; + + /* Scan the extent maps. */ + moveon = ctx->ops->scan_extents(ctx, path, fd, &fd_sb, false); + if (!moveon) + goto close; + moveon = ctx->ops->scan_extents(ctx, path, fd, &fd_sb, true); + if (!moveon) + goto close; + + /* Read all the extended attributes. */ + moveon = ctx->ops->scan_xattrs(ctx, path, fd); + if (!moveon) + goto close; + +close: + /* Close file. */ + error = close(fd); + if (error) + str_errno(ctx, path); + + return moveon; +} + +/* + * Check all the entries in a directory. + */ +bool +generic_check_directory( + struct scrub_ctx *ctx, + const char *descr, + int *pfd) +{ + struct stat64 sb; + DIR *dir; + struct dirent *dirent; + bool moveon = true; + int fd = *pfd; + int error; + + /* Iterate the directory entries. */ + dir = fdopendir(fd); + if (!dir) { + str_errno(ctx, descr); + return true; + } + rewinddir(dir); + + /* Iterate every directory entry. */ + for (dirent = readdir(dir); + dirent != NULL; + dirent = readdir(dir)) { + error = fstatat64(fd, dirent->d_name, &sb, + AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW); + if (error) { + str_errno(ctx, descr); + break; + } + + /* Ignore files on other filesystems. */ + if (sb.st_dev != ctx->mnt_sb.st_dev) + continue; + + /* Check the type codes. */ + moveon = generic_verify_dirent(ctx, descr, dirent, &sb); + if (!moveon) + break; + } + + /* Close dir, go away. */ + error = closedir(dir); + if (error) + str_errno(ctx, descr); + *pfd = -1; + return moveon; +} + +/* Adapter for the check_dir thing. */ +static bool +check_dir( + struct scrub_ctx *ctx, + const char *descr, + int dir_fd, + void *arg) +{ + return ctx->ops->check_dir(ctx, descr, dir_fd); +} + +/* Traverse the directory tree. */ +bool +generic_scan_fs_tree( + struct scrub_ctx *ctx) +{ + return scan_fs_tree(ctx, check_dir, check_dirent, NULL); +} + +/* Phase 5 */ + +struct read_verify_fiemap { + struct scrub_ctx *ctx; + struct extent_tree good; + struct extent_tree bad; + struct read_verify_pool rvp; + struct read_verify rv; + bool (*fiemap_fn)(struct scrub_ctx *, + const char *, + struct fiemap_extent *, + void *); +}; + +/* Handle an io error while read verifying an extent. */ +void +read_verify_fiemap_ioerr( + struct read_verify_pool *rvp, + struct disk *disk, + uint64_t startblock, + uint64_t blockcount, + int error, + void *arg) +{ + struct read_verify_fiemap *rvf = arg; + + extent_tree_add(&rvf->bad, startblock, blockcount); +} + +/* Check an extent for data integrity problems. */ +bool +read_verify_fiemap_extent( + struct scrub_ctx *ctx, + const char *descr, + struct fiemap_extent *extent, + void *arg) +{ + struct read_verify_fiemap *rvf = arg; + + /* Skip non-real/non-aligned extents. */ + if (extent->fe_flags & (FIEMAP_EXTENT_UNKNOWN | + FIEMAP_EXTENT_DELALLOC | + FIEMAP_EXTENT_ENCODED | + FIEMAP_EXTENT_NOT_ALIGNED | + FIEMAP_EXTENT_UNWRITTEN)) + return true; + + return extent_tree_add(&rvf->good, extent->fe_physical >> BBSHIFT, + extent->fe_length >> BBSHIFT); +} + +/* Scan the inode associated with a directory entry. */ +static bool +read_verify_dirent( + struct scrub_ctx *ctx, + const char *path, + int dir_fd, + struct dirent *dirent, + struct stat64 *sb, + void *arg) +{ + struct stat64 fd_sb; + struct read_verify_fiemap *rvf = arg; + bool moveon = true; + int fd; + int error; + + /* If not file, move on to the next dirent. */ + if (!S_ISREG(sb->st_mode)) + return true; + + /* Open the file */ + fd = openat(dir_fd, dirent->d_name, + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) { + if (errno != ENOENT) + str_errno(ctx, path); + return true; + } + + /* Did the fstatat and the open race? */ + if (fstat64(fd, &fd_sb) < 0) { + str_errno(ctx, path); + goto close; + } + if (fd_sb.st_ino != sb->st_ino || fd_sb.st_dev != sb->st_dev) + str_warn(ctx, path, +_("inode changed out from under us!")); + + /* + * Read all the file data. If we have the block device open + * we'll try to use FIEMAP data to read-verify the physical + * data blocks. If that doesn't work, we'll use the generic + * seek-based read_file to verify the file data. + */ + if (disk_is_open(&ctx->datadev)) + moveon = fiemap(ctx, path, fd, false, false, rvf->fiemap_fn, + rvf); + else + moveon = false; + if (moveon) + goto close; + moveon = ctx->ops->read_file(ctx, path, fd, &fd_sb); + if (!moveon) + goto close; + +close: + /* Close file. */ + error = close(fd); + if (error) + str_errno(ctx, path); + + return moveon; +} + +static bool +schedule_read_verify( + uint64_t start, + uint64_t length, + void *arg) +{ + struct read_verify_fiemap *rvf = arg; + + read_verify_schedule(&rvf->rvp, &rvf->rv, &rvf->ctx->datadev, + start, length, rvf); + return true; +} + +/* Scan all the data blocks, using FIEMAP to figure out what to verify. */ +bool +generic_scan_blocks( + struct scrub_ctx *ctx) +{ + struct read_verify_fiemap rvf; + bool moveon; + + if (!scrub_data) + return true; + + memset(&rvf, 0, sizeof(rvf)); + rvf.ctx = ctx; + moveon = extent_tree_init(&rvf.good); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + moveon = extent_tree_init(&rvf.bad); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_good; + } + + /* Collect all the extent maps. */ + rvf.fiemap_fn = read_verify_fiemap_extent; + moveon = scan_fs_tree(ctx, NULL, read_verify_dirent, &rvf); + if (!moveon) + goto out_bad; + + /* Run all the IO in batches. */ + read_verify_pool_init(&rvf.rvp, ctx, ctx->readbuf, IO_MAX_SIZE, + ctx->mnt_sf.f_frsize, read_verify_fiemap_ioerr, + NULL, scrub_nproc(ctx)); + moveon = extent_tree_iterate(&rvf.good, schedule_read_verify, &rvf); + if (!moveon) + goto out_pool; + read_verify_force(&rvf.rvp, &rvf.rv); + read_verify_pool_destroy(&rvf.rvp); + + /* Scan the whole dir tree to see what matches the bad extents. */ + if (!extent_tree_empty(&rvf.bad)) + moveon = report_verify_errors(ctx, &rvf.bad); + + extent_tree_free(&rvf.bad); + extent_tree_free(&rvf.good); + return moveon; + +out_pool: + read_verify_pool_destroy(&rvf.rvp); +out_bad: + extent_tree_free(&rvf.bad); +out_good: + extent_tree_free(&rvf.good); + + return moveon; +} + +/* Read all the data in a file. */ +bool +generic_read_file( + struct scrub_ctx *ctx, + const char *descr, + int fd, + struct stat64 *sb) +{ + off_t data_end = 0; + off_t data_start; + off_t start; + ssize_t sz; + size_t count; + bool reports_holes = true; + bool direct_io = false; + int flags; + int error; + + /* Can we set O_DIRECT? */ + flags = fcntl(fd, F_GETFL); + error = fcntl(fd, F_SETFL, flags | O_DIRECT); + if (!error) + direct_io = true; + + /* See if SEEK_DATA/SEEK_HOLE work... */ + data_start = lseek(fd, data_end, SEEK_DATA); + if (data_start < 0) { + /* ENXIO for SEEK_DATA means no file data anywhere. */ + if (errno == ENXIO) + return true; + reports_holes = false; + } + + if (reports_holes) { + data_end = lseek(fd, data_start, SEEK_HOLE); + if (data_end < 0) + reports_holes = false; + } + + /* ...or just read everything if they don't. */ + if (!reports_holes) { + data_start = 0; + data_end = sb->st_size; + } + + if (!direct_io) { + posix_fadvise(fd, 0, sb->st_size, POSIX_FADV_SEQUENTIAL); + posix_fadvise(fd, 0, sb->st_size, POSIX_FADV_WILLNEED); + } + /* Read the non-hole areas. */ + while (data_start < data_end) { + start = data_start; + + if (direct_io && (start & (page_size - 1))) + start &= ~(page_size - 1); + count = min(IO_MAX_SIZE, data_end - start); + if (direct_io && (count & (page_size - 1))) + count = (count + page_size) & ~(page_size - 1); + sz = pread64(fd, ctx->readbuf, count, start); + if (sz < 0) + str_errno(ctx, descr); + else if (sz == 0) { + str_error(ctx, descr, +_("Read zero bytes, expected %zu."), + count); + break; + } else if (sz != count && start + sz != data_end) { + str_warn(ctx, descr, +_("Short read of %zu bytes, expected %zu."), + sz, count); + } + data_start = start + sz; + + if (data_start >= data_end && reports_holes) { + data_start = lseek(fd, data_end, SEEK_DATA); + if (data_start < 0) { + if (errno != ENXIO) + str_errno(ctx, descr); + break; + } + data_end = lseek(fd, data_start, SEEK_HOLE); + if (data_end < 0) { + if (errno != ENXIO) + str_errno(ctx, descr); + break; + } + } + } + + /* Turn off O_DIRECT. */ + if (direct_io) { + flags = fcntl(fd, F_GETFL); + error = fcntl(fd, F_SETFL, flags & ~O_DIRECT); + if (error) + str_errno(ctx, descr); + } + + return true; +} + +/* Phase 6 */ +struct summary_counts { + pthread_mutex_t lock; + unsigned long long inodes; /* number of inodes */ + unsigned long long blocks; /* 512b blocks */ +}; + +/* Record the presence of an inode and its block usage. */ +static bool +record_inode_summary( + struct scrub_ctx *ctx, + const char *descr, + int dir_fd, + struct dirent *dirent, + struct stat64 *sb, + void *arg) +{ + struct summary_counts *summary = arg; + + if (strcmp(dirent->d_name, ".") == 0 || + strcmp(dirent->d_name, "..") == 0) + return true; + + pthread_mutex_lock(&summary->lock); + summary->inodes++; + summary->blocks += sb->st_blocks; + pthread_mutex_unlock(&summary->lock); + + return true; +} + +/* Traverse the directory tree, counting inodes & blocks. */ +bool +generic_check_summary( + struct scrub_ctx *ctx) +{ + struct summary_counts summary; + struct stat64 sb; + struct statvfs sfs; + unsigned long long fd; + unsigned long long fi; + unsigned long long sd; + unsigned long long si; + unsigned long long absdiff; + bool complain; + bool moveon; + int error; + + pthread_mutex_init(&summary.lock, NULL); + summary.inodes = 0; + summary.blocks = 0; + + /* Flush everything out to disk before we start counting. */ + error = syncfs(ctx->mnt_fd); + if (error) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + /* Get the rootdir's summary stats. */ + error = fstat64(ctx->mnt_fd, &sb); + if (error) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + /* Scan the rest of the filesystem. */ + moveon = scan_fs_tree(ctx, NULL, record_inode_summary, &summary); + if (!moveon) + return moveon; + + /* Compare to statfs results. */ + error = fstatvfs(ctx->mnt_fd, &sfs); + if (error) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + /* Report on what we found. */ + fd = (sfs.f_blocks - sfs.f_bfree) * sfs.f_frsize >> (BBSHIFT + 1), + fi = sfs.f_files - sfs.f_ffree; + sd = summary.blocks >> 1; + si = summary.inodes; + + /* + * Complain if the counts are off by more than 10%, unless + * the inaccuracy is less than 32MB worth of blocks or 100 inodes. + */ + absdiff = (1ULL << 25) / sfs.f_bsize; + complain = !within_range(ctx, sd, fd, absdiff, 1, 10, _("data blocks")); + complain |= !within_range(ctx, si, fi, 100, 1, 10, _("inodes")); + + if (complain || verbose) { + double b, i; + char *bu, *iu; + + b = auto_space_units(fd, &bu); + i = auto_units(fi, &iu); + printf(_("%.1f%s blocks used; %.2f%s inodes used.\n"), + b, bu, i, iu); + b = auto_space_units(sd, &bu); + i = auto_units(si, &iu); + printf(_("%.1f%s blocks found; %.2f%s inodes found.\n"), + b, bu, i, iu); + } + + return true; +} + +struct scrub_ops generic_scrub_ops = { + .name = "generic", + .cleanup = generic_cleanup, + .scan_fs = generic_scan_fs, + .scan_inodes = generic_scan_inodes, + .check_dir = generic_check_dir, + .check_inode = generic_check_inode, + .scan_extents = generic_scan_extents, + .scan_xattrs = generic_scan_xattrs, + .scan_special_xattrs = generic_scan_special_xattrs, + .scan_metadata = generic_scan_metadata, + .check_summary = generic_check_summary, + .read_file = generic_read_file, + .scan_blocks = generic_scan_blocks, + .scan_fs_tree = generic_scan_fs_tree, +}; diff --git a/scrub/iocmd.c b/scrub/iocmd.c new file mode 100644 index 0000000..9cd7b81 --- /dev/null +++ b/scrub/iocmd.c @@ -0,0 +1,342 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include +#include +#include +#include +#include +#include "../repair/threads.h" +#include "disk.h" +#include "scrub.h" +#include "iocmd.h" + +#define NR_EXTENTS 512 + +/* Scan a filesystem tree. */ +struct scan_fs_tree { + unsigned int nr_dirs; + pthread_mutex_t lock; + pthread_cond_t wakeup; + struct stat64 root_sb; + bool moveon; + bool (*dir_fn)(struct scrub_ctx *, const char *, + int, void *); + bool (*dirent_fn)(struct scrub_ctx *, const char *, + int, struct dirent *, + struct stat64 *, void *); + void *arg; +}; + +/* Per-work-item scan context. */ +struct scan_fs_tree_dir { + char *path; + struct scan_fs_tree *sft; +}; + +/* Scan a directory sub tree. */ +static void +scan_fs_dir( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + struct scrub_ctx *ctx = (struct scrub_ctx *)wq->mp; + struct scan_fs_tree_dir *sftd = arg; + struct scan_fs_tree *sft = sftd->sft; + DIR *dir; + struct dirent *dirent; + char newpath[PATH_MAX]; + struct scan_fs_tree_dir *new_sftd; + struct stat64 sb; + int dir_fd; + int error; + + /* Open the directory. */ + dir_fd = open(sftd->path, O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (dir_fd < 0) { + if (errno != ENOENT) + str_errno(ctx, sftd->path); + goto out; + } + + /* Caller-specific directory checks. */ + if (sft->dir_fn && !sft->dir_fn(ctx, sftd->path, dir_fd, sft->arg)) { + sft->moveon = false; + goto out; + } + + /* Iterate the directory entries. */ + dir = fdopendir(dir_fd); + if (!dir) { + str_errno(ctx, sftd->path); + goto out; + } + rewinddir(dir); + for (dirent = readdir(dir); dirent != NULL; dirent = readdir(dir)) { + snprintf(newpath, PATH_MAX, "%s/%s", sftd->path, + dirent->d_name); + + /* Get the stat info for this directory entry. */ + error = fstatat64(dir_fd, dirent->d_name, &sb, + AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW); + if (error) { + str_errno(ctx, newpath); + continue; + } + + /* Ignore files on other filesystems. */ + if (sb.st_dev != sft->root_sb.st_dev) + continue; + + /* Caller-specific directory entry function. */ + if (!sft->dirent_fn(ctx, newpath, dir_fd, dirent, &sb, + sft->arg)) { + sft->moveon = false; + break; + } + + /* If directory, call ourselves recursively. */ + if (S_ISDIR(sb.st_mode) && strcmp(".", dirent->d_name) && + strcmp("..", dirent->d_name)) { + new_sftd = malloc(sizeof(struct scan_fs_tree_dir)); + if (!new_sftd) { + str_errno(ctx, newpath); + sft->moveon = false; + break; + } + new_sftd->path = strdup(newpath); + new_sftd->sft = sft; + pthread_mutex_lock(&sft->lock); + sft->nr_dirs++; + pthread_mutex_unlock(&sft->lock); + queue_work(wq, scan_fs_dir, 0, new_sftd); + } + } + + /* Close dir, go away. */ + error = closedir(dir); + if (error) + str_errno(ctx, sftd->path); + +out: + pthread_mutex_lock(&sft->lock); + sft->nr_dirs--; + if (sft->nr_dirs == 0) + pthread_cond_signal(&sft->wakeup); + pthread_mutex_unlock(&sft->lock); + + free(sftd->path); + free(sftd); +} + +/* Scan the entire filesystem. */ +bool +scan_fs_tree( + struct scrub_ctx *ctx, + bool (*dir_fn)(struct scrub_ctx *, const char *, + int, void *), + bool (*dirent_fn)(struct scrub_ctx *, const char *, + int, struct dirent *, + struct stat64 *, void *), + void *arg) +{ + struct work_queue wq; + struct scan_fs_tree sft; + struct scan_fs_tree_dir *sftd; + + sft.moveon = true; + sft.nr_dirs = 1; + sft.root_sb = ctx->mnt_sb; + sft.dir_fn = dir_fn; + sft.dirent_fn = dirent_fn; + sft.arg = arg; + pthread_mutex_init(&sft.lock, NULL); + pthread_cond_init(&sft.wakeup, NULL); + + sftd = malloc(sizeof(struct scan_fs_tree_dir)); + if (!sftd) { + str_errno(ctx, ctx->mntpoint); + return false; + } + sftd->path = strdup(ctx->mntpoint); + sftd->sft = &sft; + + create_work_queue(&wq, (struct xfs_mount *)ctx, scrub_nproc(ctx)); + queue_work(&wq, scan_fs_dir, 0, sftd); + + pthread_mutex_lock(&sft.lock); + pthread_cond_wait(&sft.wakeup, &sft.lock); + assert(sft.nr_dirs == 0); + pthread_mutex_unlock(&sft.lock); + destroy_work_queue(&wq); + + return sft.moveon; +} + +/* Check an inode's extents... the hard way. */ +static bool +fibmap( + struct scrub_ctx *ctx, + const char *descr, + int fd, + bool (*fn)(struct scrub_ctx *, const char *, + struct fiemap_extent *, void *), + void *arg) +{ + struct stat64 sb; + struct fiemap_extent extent; + unsigned int blk; + unsigned int b; + off_t numblocks; + bool moveon = true; + int error; + + pthread_mutex_lock(&ctx->lock); + if (!(ctx->quirks & SCRUB_QUIRK_FIBMAP_WORKS)) { + pthread_mutex_unlock(&ctx->lock); + return true; + } + pthread_mutex_unlock(&ctx->lock); + + error = fstat64(fd, &sb); + if (error) { + str_errno(ctx, descr); + return false; + } + + numblocks = (sb.st_size + sb.st_blksize - 1) / sb.st_blksize; + if (numblocks > UINT_MAX) + numblocks = UINT_MAX; + for (blk = 0; blk < numblocks; blk++) { + b = blk; + error = ioctl(fd, FIBMAP, &b); + if (error) { + if (errno == EOPNOTSUPP || errno == EINVAL) { + str_warn(ctx, descr, +_("data block FIEMAP/FIBMAP not supported, will not check extent map.")); + pthread_mutex_lock(&ctx->lock); + ctx->quirks &= ~SCRUB_QUIRK_FIBMAP_WORKS; + pthread_mutex_unlock(&ctx->lock); + return true; + } + str_errno(ctx, descr); + continue; + } + extent.fe_physical = b * sb.st_blksize; + extent.fe_logical = blk * sb.st_blksize; + extent.fe_length = sb.st_blksize; + extent.fe_flags = 0; + moveon = fn(ctx, descr, &extent, arg); + if (!moveon) + break; + } + + return moveon; +} + +/* Call the FIEMAP ioctl on a file. */ +bool +fiemap( + struct scrub_ctx *ctx, + const char *descr, + int fd, + bool attr_fork, + bool use_fibmap, + bool (*fn)(struct scrub_ctx *, const char *, + struct fiemap_extent *, void *), + void *arg) +{ + struct fiemap *fiemap; + struct fiemap_extent *extent; + size_t sz; + __u64 next_logical; + unsigned long quirks; + bool moveon = true; + bool last = false; + unsigned int i; + int error; + + pthread_mutex_lock(&ctx->lock); + quirks = ctx->quirks; + pthread_mutex_unlock(&ctx->lock); + if (!attr_fork && !(quirks & SCRUB_QUIRK_FIEMAP_WORKS)) + return use_fibmap ? fibmap(ctx, descr, fd, fn, arg) : false; + else if (attr_fork && !(quirks & SCRUB_QUIRK_FIEMAP_ATTR_WORKS)) + return true; + + sz = sizeof(struct fiemap) + sizeof(struct fiemap_extent) * NR_EXTENTS; + fiemap = calloc(sz, 1); + if (!fiemap) { + str_errno(ctx, descr); + return false; + } + + fiemap->fm_length = ~0ULL; + fiemap->fm_flags = FIEMAP_FLAG_SYNC; + if (attr_fork) + fiemap->fm_flags |= FIEMAP_FLAG_XATTR; + fiemap->fm_extent_count = NR_EXTENTS; + fiemap->fm_reserved = 0; + next_logical = 0; + + while (!last) { + fiemap->fm_start = next_logical; + error = ioctl(fd, FS_IOC_FIEMAP, (unsigned long)fiemap); + if (error < 0 && (errno == EOPNOTSUPP || errno == EBADR)) { + if (attr_fork) { + str_warn(ctx, descr, +_("extended attribute FIEMAP not supported, will not check extent map.")); + pthread_mutex_lock(&ctx->lock); + ctx->quirks &= ~SCRUB_QUIRK_FIEMAP_ATTR_WORKS; + pthread_mutex_unlock(&ctx->lock); + } else { + pthread_mutex_lock(&ctx->lock); + ctx->quirks &= ~SCRUB_QUIRK_FIEMAP_WORKS; + pthread_mutex_unlock(&ctx->lock); + } + break; + } + if (error < 0) { + str_errno(ctx, descr); + break; + } + + /* No more extents to map, exit */ + if (!fiemap->fm_mapped_extents) + break; + + for (i = 0; i < fiemap->fm_mapped_extents; i++) { + extent = &fiemap->fm_extents[i]; + + moveon = fn(ctx, descr, extent, arg); + if (!moveon) + goto out; + + next_logical = extent->fe_logical + extent->fe_length; + if (extent->fe_flags & FIEMAP_EXTENT_LAST) + last = true; + } + } + +out: + free(fiemap); + return moveon; +} diff --git a/scrub/iocmd.h b/scrub/iocmd.h new file mode 100644 index 0000000..eb2874b --- /dev/null +++ b/scrub/iocmd.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef IOCMD_H_ +#define IOCMD_H_ + +struct fiemap_extent; + +bool +scan_fs_tree( + struct scrub_ctx *ctx, + bool (*dir_fn)(struct scrub_ctx *, const char *, + int, void *), + bool (*dirent_fn)(struct scrub_ctx *, const char *, + int, struct dirent *, + struct stat64 *, void *), + void *arg); + +bool +fiemap( + struct scrub_ctx *ctx, + const char *descr, + int fd, + bool attr_fork, + bool fibmap, + bool (*fn)(struct scrub_ctx *, const char *, + struct fiemap_extent *, void *), + void *arg); + +#endif /* IOCMD_H_ */ diff --git a/scrub/non_xfs.c b/scrub/non_xfs.c new file mode 100644 index 0000000..b2f1b72 --- /dev/null +++ b/scrub/non_xfs.c @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include +#include "disk.h" +#include "scrub.h" + +/* Stub scrubbers for non-XFS filesystems. */ + +/* Read the ext4 geometry. */ +static bool +ext4_scan_fs( + struct scrub_ctx *ctx) +{ + /* + * ext* underreports the filesystem block size by the journal + * length, so we can't verify FIEMAP info against the statvfs + * counters. + */ + ctx->quirks |= SCRUB_QUIRK_IGNORE_STATFS_BLOCKS; + return generic_scan_fs(ctx); +} + +/* extN profile */ +struct scrub_ops ext2_scrub_ops = { + .name = "ext2", + .cleanup = generic_cleanup, + .scan_fs = ext4_scan_fs, + .scan_inodes = generic_scan_inodes, + .check_dir = generic_check_dir, + .check_inode = generic_check_inode, + .scan_extents = generic_scan_extents, + .scan_xattrs = generic_scan_xattrs, + .scan_special_xattrs = generic_scan_special_xattrs, + .scan_metadata = generic_scan_metadata, + .check_summary = generic_check_summary, + .read_file = generic_read_file, + .scan_blocks = generic_scan_blocks, + .scan_fs_tree = generic_scan_fs_tree, +}; +struct scrub_ops ext3_scrub_ops = { + .name = "ext3", + .cleanup = generic_cleanup, + .scan_fs = ext4_scan_fs, + .scan_inodes = generic_scan_inodes, + .check_dir = generic_check_dir, + .check_inode = generic_check_inode, + .scan_extents = generic_scan_extents, + .scan_xattrs = generic_scan_xattrs, + .scan_special_xattrs = generic_scan_special_xattrs, + .scan_metadata = generic_scan_metadata, + .check_summary = generic_check_summary, + .read_file = generic_read_file, + .scan_blocks = generic_scan_blocks, + .scan_fs_tree = generic_scan_fs_tree, +}; +struct scrub_ops ext4_scrub_ops = { + .name = "ext4", + .cleanup = generic_cleanup, + .scan_fs = ext4_scan_fs, + .scan_inodes = generic_scan_inodes, + .check_dir = generic_check_dir, + .check_inode = generic_check_inode, + .scan_extents = generic_scan_extents, + .scan_xattrs = generic_scan_xattrs, + .scan_special_xattrs = generic_scan_special_xattrs, + .scan_metadata = generic_scan_metadata, + .check_summary = generic_check_summary, + .read_file = generic_read_file, + .scan_blocks = generic_scan_blocks, + .scan_fs_tree = generic_scan_fs_tree, +}; + +/* Read the btrfs geometry. */ +static bool +btrfs_scan_fs( + struct scrub_ctx *ctx) +{ + /* + * btrfs is a volume manager, so we can't get meaningful block numbers + * out of FIEMAP/FIBMAP. It also checksums data, so raw device access + * for file verify is impossible. + */ + ctx->quirks = SCRUB_QUIRK_IGNORE_STATFS_BLOCKS; + disk_close(&ctx->datadev); + return generic_scan_fs(ctx); +} + +/* btrfs profile */ +struct scrub_ops btrfs_scrub_ops = { + .name = "btrfs", + .cleanup = generic_cleanup, + .scan_fs = btrfs_scan_fs, + .scan_inodes = generic_scan_inodes, + .check_dir = generic_check_dir, + .check_inode = generic_check_inode, + .scan_extents = generic_scan_extents, + .scan_xattrs = generic_scan_xattrs, + .scan_special_xattrs = generic_scan_special_xattrs, + .scan_metadata = generic_scan_metadata, + .check_summary = generic_check_summary, + .read_file = generic_read_file, + .scan_blocks = generic_scan_blocks, + .scan_fs_tree = generic_scan_fs_tree, +}; diff --git a/scrub/read_verify.c b/scrub/read_verify.c new file mode 100644 index 0000000..aa485e7 --- /dev/null +++ b/scrub/read_verify.c @@ -0,0 +1,182 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include +#include +#include +#include "disk.h" +#include "scrub.h" +#include "../repair/threads.h" +#include "read_verify.h" + +/* Tolerate 64k holes in adjacent read verify requests. */ +#define IO_BATCH_LOCALITY (65536 >> BBSHIFT) + +/* Create a thread pool to run read verifiers. */ +void +read_verify_pool_init( + struct read_verify_pool *rvp, + struct scrub_ctx *ctx, + void *readbuf, + size_t readbufsz, + size_t min_io_sz, + read_verify_ioend_fn_t ioend_fn, + read_verify_ioend_arg_free_fn_t ioend_arg_free_fn, + int nproc) +{ + rvp->rvp_readbuf = readbuf; + rvp->rvp_readbufsz = readbufsz; + rvp->rvp_ctx = ctx; + rvp->rvp_min_io_size = min_io_sz >> BBSHIFT; + rvp->ioend_fn = ioend_fn; + rvp->ioend_arg_free_fn = ioend_arg_free_fn; + create_work_queue(&rvp->rvp_wq, (struct xfs_mount *)rvp, nproc); +} + +/* Finish up any read verification work and tear it down. */ +void +read_verify_pool_destroy( + struct read_verify_pool *rvp) +{ + destroy_work_queue(&rvp->rvp_wq); + memset(&rvp->rvp_wq, 0, sizeof(struct work_queue)); +} + +/* + * Issue a read-verify IO in big batches. + */ +static void +read_verify( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + struct read_verify *rv = arg; + struct read_verify_pool *rvp; + ssize_t sz; + ssize_t len; + + rvp = (struct read_verify_pool *)wq->mp; + while (rv->io_blockcount > 0) { + len = min(rv->io_blockcount, rvp->rvp_readbufsz >> BBSHIFT); + dbg_printf("pread %d %"PRIu64" %zu\n", rv->io_disk->d_fd, + rv->io_startblock, len); + sz = disk_read_verify(rv->io_disk, rvp->rvp_readbuf, + rv->io_startblock, len); + if (sz < 0) { + dbg_printf("IOERR %d %"PRIu64" %zu\n", + rv->io_disk->d_fd, + rv->io_startblock, len); + rvp->ioend_fn(rvp, rv->io_disk, rv->io_startblock, + rvp->rvp_min_io_size, + errno, rv->io_end_arg); + len = rvp->rvp_min_io_size; + } + rv->io_startblock += len; + rv->io_blockcount -= len; + } + + if (rvp->ioend_arg_free_fn) + rvp->ioend_arg_free_fn(rv->io_end_arg); + free(rv); +} + +/* Queue a read verify request. */ +static void +read_verify_queue( + struct read_verify_pool *rvp, + struct read_verify *rv) +{ + struct read_verify *tmp; + + dbg_printf("verify fd %d daddr %"PRIu64" len %"PRIu64"\n", + rv->io_disk->d_fd, rv->io_startblock, + rv->io_blockcount); + + tmp = malloc(sizeof(struct read_verify)); + if (!tmp) { + rvp->ioend_fn(rvp, rv->io_disk, rv->io_startblock, + rv->io_blockcount, errno, rv->io_end_arg); + return; + } + *tmp = *rv; + + queue_work(&rvp->rvp_wq, read_verify, 0, tmp); +} + +/* + * Issue an IO request. We'll batch subsequent requests if they're + * within 64k of each other + */ +void +read_verify_schedule( + struct read_verify_pool *rvp, + struct read_verify *rv, + struct disk *disk, + uint64_t startblock, + uint64_t blockcount, + void *end_arg) +{ + uint64_t ve_end; + uint64_t io_end; + + assert(rvp->rvp_readbuf); + ve_end = startblock + blockcount; + io_end = rv->io_startblock + rv->io_blockcount; + + /* + * If we have a stashed IO, we haven't changed fds, the error + * reporting is the same, and the two extents are close, + * we can combine them. + */ + if (rv->io_blockcount > 0 && disk == rv->io_disk && + end_arg == rv->io_end_arg && + ((startblock >= rv->io_startblock && + startblock <= io_end + IO_BATCH_LOCALITY) || + (rv->io_startblock >= startblock && + rv->io_startblock <= ve_end + IO_BATCH_LOCALITY))) { + rv->io_startblock = min(rv->io_startblock, startblock); + rv->io_blockcount = max(ve_end, io_end) - rv->io_startblock; + } else { + /* Otherwise, issue the stashed IO (if there is one) */ + if (rv->io_blockcount > 0) + read_verify_queue(rvp, rv); + + /* Stash the new IO. */ + rv->io_disk = disk; + rv->io_startblock = startblock; + rv->io_blockcount = blockcount; + rv->io_end_arg = end_arg; + } +} + +/* Force any stashed IOs into the verifier. */ +void +read_verify_force( + struct read_verify_pool *rvp, + struct read_verify *rv) +{ + assert(rvp->rvp_readbuf); + if (rv->io_blockcount == 0) + return; + + read_verify_queue(rvp, rv); + rv->io_blockcount = 0; +} diff --git a/scrub/read_verify.h b/scrub/read_verify.h new file mode 100644 index 0000000..cc9ab12 --- /dev/null +++ b/scrub/read_verify.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef READ_VERIFY_H_ +#define READ_VERIFY_H_ + +struct read_verify_pool; + +typedef void (*read_verify_ioend_fn_t)(struct read_verify_pool *rvp, + struct disk *disk, uint64_t startblock, uint64_t blockcount, + int error, void *arg); +typedef void (*read_verify_ioend_arg_free_fn_t)(void *arg); + +struct read_verify_pool { + struct work_queue rvp_wq; + struct scrub_ctx *rvp_ctx; + void *rvp_readbuf; + size_t rvp_readbufsz; + size_t rvp_min_io_size; /* 512b sectors */ + read_verify_ioend_fn_t ioend_fn; + read_verify_ioend_arg_free_fn_t ioend_arg_free_fn; +}; + +void read_verify_pool_init(struct read_verify_pool *rvp, struct scrub_ctx *ctx, + void *readbuf, size_t readbufsz, size_t min_io_sz, + read_verify_ioend_fn_t ioend_fn, + read_verify_ioend_arg_free_fn_t ioend_arg_free_fn, int nproc); +void read_verify_pool_destroy(struct read_verify_pool *rvp); + +struct read_verify { + void *io_end_arg; + struct disk *io_disk; + uint64_t io_startblock; /* 512b blocks */ + uint64_t io_blockcount; /* 512b blocks */ +}; + +void read_verify_schedule(struct read_verify_pool *rvp, struct read_verify *rv, + struct disk *disk, uint64_t startblock, uint64_t blockcount, + void *end_arg); +void read_verify_force(struct read_verify_pool *rvp, struct read_verify *rv); + +#endif /* READ_VERIFY_H_ */ diff --git a/scrub/scrub.c b/scrub/scrub.c new file mode 100644 index 0000000..3f220d5 --- /dev/null +++ b/scrub/scrub.c @@ -0,0 +1,698 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "disk.h" +#include "scrub.h" + +#define _PATH_PROC_MOUNTS "/proc/mounts" + +bool verbose; +int debug; +bool scrub_data; +bool dumpcore; +bool display_rusage; +long page_size; + +static void __attribute__((noreturn)) +usage(void) +{ + fprintf(stderr, _("Usage: %s [OPTIONS] mountpoint\n"), progname); + fprintf(stderr, _("-d:\tRun program in debug mode.\n")); + fprintf(stderr, _("-t:\tUse this filesystem backend for scrubbing.\n")); + fprintf(stderr, _("-T:\tDisplay timing/usage information.\n")); + fprintf(stderr, _("-v:\tVerbose output.\n")); + fprintf(stderr, _("-x:\tScrub file data too.\n")); + + exit(16); +} + +/* + * Check if the argument is either the device name or mountpoint of a mounted + * filesystem. + */ +static bool +find_mountpoint_check( + struct stat64 *sb, + struct mntent *t) +{ + struct stat64 ms; + + if (S_ISDIR(sb->st_mode)) { /* mount point */ + if (stat64(t->mnt_dir, &ms) < 0) + return false; + if (sb->st_ino != ms.st_ino) + return false; + if (sb->st_dev != ms.st_dev) + return false; + /* + * Since we can handle non-XFS filesystems, we don't + * need to check that the device is accessible. + * (The xfs_fsr version of this function does care.) + */ + } else { /* device */ + if (stat64(t->mnt_fsname, &ms) < 0) + return false; + if (sb->st_rdev != ms.st_rdev) + return false; + /* + * Make sure the mountpoint given by mtab is accessible + * before using it. + */ + if (stat64(t->mnt_dir, &ms) < 0) + return false; + } + + return true; +} + +/* Check that our alleged mountpoint is in mtab */ +static bool +find_mountpoint( + char *mtab, + struct scrub_ctx *ctx) +{ + struct mntent_cursor cursor; + struct mntent *t = NULL; + bool found = false; + + if (platform_mntent_open(&cursor, mtab) != 0) { + fprintf(stderr, "Error: can't get mntent entries.\n"); + exit(1); + } + + while ((t = platform_mntent_next(&cursor)) != NULL) { + /* + * Keep jotting down matching mount details; newer mounts are + * towards the end of the file (hopefully). + */ + if (find_mountpoint_check(&ctx->mnt_sb, t)) { + ctx->mntpoint = strdup(t->mnt_dir); + ctx->mnt_type = strdup(t->mnt_type); + ctx->blkdev = strdup(t->mnt_fsname); + found = true; + } + } + platform_mntent_close(&cursor); + return found; +} + +/* Print a string and whatever error is stored in errno. */ +void +__str_errno( + struct scrub_ctx *ctx, + const char *str, + const char *file, + int line) +{ + char buf[DESCR_BUFSZ]; + + pthread_mutex_lock(&ctx->lock); + fprintf(stderr, "%s: %s.", str, strerror_r(errno, buf, DESCR_BUFSZ)); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->errors_found++; + pthread_mutex_unlock(&ctx->lock); +} + +/* Print a string and some error text. */ +void +__str_error( + struct scrub_ctx *ctx, + const char *str, + const char *file, + int line, + const char *format, + ...) +{ + va_list args; + + pthread_mutex_lock(&ctx->lock); + fprintf(stderr, "%s: ", str); + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->errors_found++; + pthread_mutex_unlock(&ctx->lock); +} + +/* Print a string and some warning text. */ +void +__str_warn( + struct scrub_ctx *ctx, + const char *str, + const char *file, + int line, + const char *format, + ...) +{ + va_list args; + + pthread_mutex_lock(&ctx->lock); + fprintf(stderr, "%s: ", str); + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + ctx->warnings_found++; + pthread_mutex_unlock(&ctx->lock); +} + +/* Print a string and some informational text. */ +void +__str_info( + struct scrub_ctx *ctx, + const char *str, + const char *file, + int line, + const char *format, + ...) +{ + va_list args; + + pthread_mutex_lock(&ctx->lock); + fprintf(stderr, "%s: ", str); + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + if (debug) + fprintf(stderr, " (%s line %d)", file, line); + fprintf(stderr, "\n"); + pthread_mutex_unlock(&ctx->lock); +} + +static struct scrub_ops *scrub_impl[] = { + &xfs_scrub_ops, + &ext2_scrub_ops, + &ext3_scrub_ops, + &ext4_scrub_ops, + &btrfs_scrub_ops, + &generic_scrub_ops, + NULL +}; + +void __attribute__((noreturn)) +do_error(char const *msg, ...) +{ + va_list args; + + fprintf(stderr, _("\nfatal error -- ")); + + va_start(args, msg); + vfprintf(stderr, msg, args); + if (dumpcore) + abort(); + exit(1); +} + +/* How many threads to kick off? */ +unsigned int +scrub_nproc( + struct scrub_ctx *ctx) +{ + if (getenv("XFS_SCRUB_NO_THREADS")) + return 1; + return ctx->nr_io_threads; +} + +/* Decide if a value is within +/- (n/d) of a desired value. */ +bool +within_range( + struct scrub_ctx *ctx, + unsigned long long value, + unsigned long long desired, + unsigned long long diff_threshold, + unsigned int n, + unsigned int d, + const char *descr) +{ + assert(n < d); + + /* Don't complain if difference does not exceed an absolute value. */ + if (value < desired && desired - value < diff_threshold) + return true; + if (value > desired && value - desired < diff_threshold) + return true; + + /* Complain if the difference exceeds a certain percentage. */ + if (value < desired * (d - n) / d) { + str_warn(ctx, ctx->mntpoint, +_("Found fewer %s than reported"), descr); + return false; + } + if (value > desired * (d + n) / d) { + str_warn(ctx, ctx->mntpoint, +_("Found more %s than reported"), descr); + return false; + } + return true; +} + +static float +timeval_subtract( + struct timeval *tv1, + struct timeval *tv2) +{ + return ((tv1->tv_sec - tv2->tv_sec) + + ((float) (tv1->tv_usec - tv2->tv_usec)) / 1000000); +} + +/* Produce human readable disk space output. */ +double +auto_space_units( + unsigned long long kilobytes, + char **units) +{ + if (kilobytes > 1073741824ULL) { + *units = "TiB"; + return kilobytes / 1073741824.0; + } else if (kilobytes > 1048576ULL) { + *units = "GiB"; + return kilobytes / 1048576.0; + } else if (kilobytes > 1024ULL) { + *units = "MiB"; + return kilobytes / 1024.0; + } else { + *units = "KiB"; + return kilobytes; + } +} + +/* Produce human readable discrete number output. */ +double +auto_units( + unsigned long long number, + char **units) +{ + if (number > 1000000000000ULL) { + *units = "T"; + return number / 1000000000000.0; + } else if (number > 1000000000ULL) { + *units = "G"; + return number / 1000000000.0; + } else if (number > 1000000ULL) { + *units = "M"; + return number / 1000000.0; + } else if (number > 1000ULL) { + *units = "K"; + return number / 1000.0; + } else { + *units = ""; + return number; + } +} + +struct phase_info { + struct rusage ruse; + struct timeval time; + void *brk_start; + const char *tag; +}; + +/* Start tracking resource usage for a phase. */ +static bool +phase_start( + struct phase_info *pi, + const char *tag, + const char *descr) +{ + int error; + + error = getrusage(RUSAGE_SELF, &pi->ruse); + if (error) { + perror(_("getrusage")); + return false; + } + pi->brk_start = sbrk(0); + + error = gettimeofday(&pi->time, NULL); + if (error) { + perror(_("gettimeofday")); + return false; + } + pi->tag = tag; + + if ((verbose || display_rusage) && descr) + printf(_("%s%s\n"), pi->tag, descr); + return true; +} + +/* Report usage stats. */ +static bool +phase_end( + struct phase_info *pi) +{ + struct rusage ruse_now; +#ifdef HAVE_MALLINFO + struct mallinfo mall_now; +#endif + struct timeval time_now; + long iops; + int error; + + if (!display_rusage) + return true; + + error = gettimeofday(&time_now, NULL); + if (error) { + perror(_("gettimeofday")); + return false; + } + + error = getrusage(RUSAGE_SELF, &ruse_now); + if (error) { + perror(_("getrusage")); + return false; + } + +#define kbytes(x) (((unsigned long)(x) + 1023) / 1024) +#ifdef HAVE_MALLINFO + + mall_now = mallinfo(); + printf(_("%sMemory used: %luk/%luk (%luk/%luk), "), pi->tag, + kbytes(mall_now.arena), kbytes(mall_now.hblkhd), + kbytes(mall_now.uordblks), kbytes(mall_now.fordblks)); +#else + printf(_("%sMemory used: %luk, "), pi->tag, + (unsigned long) kbytes(((char *) sbrk(0)) - + ((char *) pi->brk_start))); +#endif +#undef kbytes + + printf(_("time: %5.2f/%5.2f/%5.2f\n"), + timeval_subtract(&time_now, &pi->time), + timeval_subtract(&ruse_now.ru_utime, &pi->ruse.ru_utime), + timeval_subtract(&ruse_now.ru_stime, &pi->ruse.ru_stime)); + iops = ruse_now.ru_inblock - pi->ruse.ru_inblock + + ruse_now.ru_oublock - pi->ruse.ru_oublock; + printf(_("%sI/O: %lu in/%lu out, rate: %.2f iops\n"), pi->tag, + ruse_now.ru_inblock - pi->ruse.ru_inblock, + ruse_now.ru_oublock - pi->ruse.ru_oublock, + (float)iops / timeval_subtract(&time_now, &pi->time)); + + return true; +} + +/* Find filesystem geometry and perform any other setup functions. */ +static bool +find_geo( + struct scrub_ctx *ctx) +{ + bool moveon; + int error; + + ctx->mnt_fd = open(ctx->mntpoint, O_RDONLY | O_NOATIME | O_DIRECTORY); + if (ctx->mnt_fd < 0) { + if (errno == EPERM) + str_error(ctx, ctx->mntpoint, +_("Must be root to run scrub.")); + else + str_errno(ctx, ctx->mntpoint); + return false; + } + error = disk_open(ctx->blkdev, &ctx->datadev); + if (error && errno != ENOENT) + str_errno(ctx, ctx->blkdev); + + error = fstat64(ctx->mnt_fd, &ctx->mnt_sb); + if (error) { + str_errno(ctx, ctx->mntpoint); + return false; + } + error = fstatvfs(ctx->mnt_fd, &ctx->mnt_sv); + if (error) { + str_errno(ctx, ctx->mntpoint); + return false; + } + error = fstatfs(ctx->mnt_fd, &ctx->mnt_sf); + if (error) { + str_errno(ctx, ctx->mntpoint); + return false; + } + if (disk_is_open(&ctx->datadev)) + ctx->nr_io_threads = disk_heads(&ctx->datadev); + else + ctx->nr_io_threads = libxfs_nproc(); + moveon = ctx->ops->scan_fs(ctx); + if (verbose) + printf(_("%s: using %d threads to scrub.\n"), + ctx->mntpoint, ctx->nr_io_threads); + + return moveon; +} + +struct scrub_phase { + char *descr; + bool (*fn)(struct scrub_ctx *); +}; + +/* Run all the phases of the scrubber. */ +static bool +run_scrub_phases( + struct scrub_ctx *ctx) +{ + struct scrub_phase phases[] = { + {_("Find filesystem geometry."), find_geo}, + {_("Check internal metadata."), ctx->ops->scan_metadata}, + {_("Scan all inodes."), ctx->ops->scan_inodes}, + {_("Check directory structure."), ctx->ops->scan_fs_tree}, + {_("Verify data file integrity."), ctx->ops->scan_blocks}, + {_("Check summary counters."), ctx->ops->check_summary}, + {NULL, NULL, NULL}, + }; + struct phase_info pi; + char buf[DESCR_BUFSZ]; + struct scrub_phase *phase; + bool moveon; + int c; + + /* Run all phases of the scrub tool. */ + for (c = 1, phase = phases; phase->descr; phase++, c++) { + snprintf(buf, DESCR_BUFSZ, _("Phase %d: "), c); + moveon = phase_start(&pi, buf, phase->descr); + if (!moveon) + return false; + moveon = phase->fn(ctx); + if (!moveon) + return false; + moveon = phase_end(&pi); + if (!moveon) + return false; + } + + return true; +} + +int +main( + int argc, + char **argv) +{ + int c; + char *mtab = NULL; + struct scrub_ctx ctx; + struct phase_info all_pi; + bool ismnt; + bool moveon = true; + int ret; + struct scrub_ops **ops; + int error; + + progname = basename(argv[0]); + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + pthread_mutex_init(&ctx.lock, NULL); + memset(&ctx, 0, sizeof(struct scrub_ctx)); + ctx.datadev.d_fd = -1; + while ((c = getopt(argc, argv, "dm:Tt:vxV")) != EOF) { + switch (c) { + case 'd': + debug++; + dumpcore = true; + break; + case 'm': + mtab = optarg; + break; + case 't': + for (ops = scrub_impl; *ops; ops++) { + if (!strcmp(optarg, (*ops)->name)) { + ctx.ops = *ops; + break; + } + } + if (!ctx.ops) { + fprintf(stderr, +_("Unknown filesystem driver '%s'.\n"), + optarg); + return 1; + } + break; + case 'T': + display_rusage = true; + break; + case 'v': + verbose = true; + break; + case 'x': + scrub_data = true; + break; + case 'V': + printf(_("%s version %s\n"), progname, VERSION); + exit(0); + case '?': + /* fall through */ + default: + usage(); + } + } + + if (optind != argc - 1) + usage(); + + ctx.mntpoint = argv[optind]; + if (!getenv("XFS_SCRUB_NO_FIEMAP")) + ctx.quirks |= SCRUB_QUIRK_FIEMAP_WORKS | + SCRUB_QUIRK_FIEMAP_ATTR_WORKS; + if (!getenv("XFS_SCRUB_NO_FIBMAP")) + ctx.quirks |= SCRUB_QUIRK_FIBMAP_WORKS; + + /* Find the mount record for the passed-in argument. */ + + if (stat64(argv[optind], &ctx.mnt_sb) < 0) { + fprintf(stderr, + _("%s: could not stat: %s: %s\n"), + progname, argv[optind], strerror(errno)); + return 16; + } + + /* + * If the user did not specify an explicit mount table, try to use + * /proc/mounts if it is available, else /etc/mtab. We prefer + * /proc/mounts because it is kernel controlled, while /etc/mtab + * may contain garbage that userspace tools like pam_mounts wrote + * into it. + */ + if (!mtab) { + if (access(_PATH_PROC_MOUNTS, R_OK) == 0) + mtab = _PATH_PROC_MOUNTS; + else + mtab = _PATH_MOUNTED; + } + + ismnt = find_mountpoint(mtab, &ctx); + if (!ismnt) { + fprintf(stderr, _("%s: Not a mount point or block device.\n"), + ctx.mntpoint); + return 16; + } + + /* Find an appropriate scrub backend. */ + for (ops = scrub_impl; !ctx.ops && *ops; ops++) { + if (!strcmp(ctx.mnt_type, (*ops)->name)) + ctx.ops = *ops; + } + if (!ctx.ops) + ctx.ops = &generic_scrub_ops; + if (verbose) + printf(_("%s: scrubbing %s filesystem with %s driver.\n"), + ctx.mntpoint, ctx.mnt_type, ctx.ops->name); + + /* Set up a page-aligned buffer for read verification. */ + page_size = sysconf(_SC_PAGESIZE); + if (page_size < 0) { + str_errno(&ctx, ctx.mntpoint); + goto out; + } + + /* Try to allocate a read buffer if we don't have one. */ + error = posix_memalign((void **)&ctx.readbuf, page_size, + IO_MAX_SIZE); + if (error || !ctx.readbuf) { + str_errno(&ctx, ctx.mntpoint); + goto out; + } + + /* Flush everything out to disk before we start. */ + error = syncfs(ctx.mnt_fd); + if (error) { + str_errno(&ctx, ctx.mntpoint); + goto out; + } + + /* Scrub a filesystem. */ + moveon = phase_start(&all_pi, "", NULL); + if (!moveon) + goto out; + moveon = run_scrub_phases(&ctx); + if (!moveon) + goto out; + +out: + ret = 0; + if (errno || !moveon) + ret |= 8; + + /* Clean up scan data. */ + moveon = ctx.ops->cleanup(&ctx); + if (!moveon) + ret |= 8; + + if (ctx.errors_found && ctx.warnings_found) + fprintf(stderr, +_("%s: %lu errors and %lu warnings found. Unmount and run fsck.\n"), + ctx.mntpoint, ctx.errors_found, ctx.warnings_found); + else if (ctx.errors_found && ctx.warnings_found == 0) + fprintf(stderr, +_("%s: %lu errors found. Unmount and run fsck.\n"), + ctx.mntpoint, ctx.errors_found); + else if (ctx.errors_found == 0 && ctx.warnings_found) + fprintf(stderr, +_("%s: %lu warnings found.\n"), + ctx.mntpoint, ctx.warnings_found); + if (ctx.errors_found) + ret |= 4; + phase_end(&all_pi); + close(ctx.mnt_fd); + disk_close(&ctx.datadev); + + free(ctx.blkdev); + free(ctx.readbuf); + free(ctx.mntpoint); + free(ctx.mnt_type); + return ret; +} diff --git a/scrub/scrub.h b/scrub/scrub.h new file mode 100644 index 0000000..b0b3862 --- /dev/null +++ b/scrub/scrub.h @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef SCRUB_H_ +#define SCRUB_H_ + +#define DESCR_BUFSZ 256 + +/* + * Perform all IO in 8M chunks. This cannot exceed 65536 sectors + * because that's the biggest SCSI VERIFY(16) we dare to send. + */ +#define IO_MAX_SIZE 8388608 +#define IO_MAX_SECTORS (IO_MAX_SIZE >> BBSHIFT) + +struct scrub_ctx; + +struct scrub_ops { + const char *name; + bool (*cleanup)(struct scrub_ctx *ctx); + bool (*scan_fs)(struct scrub_ctx *ctx); + bool (*scan_inodes)(struct scrub_ctx *ctx); + bool (*check_dir)(struct scrub_ctx *ctx, const char *descr, int dir_fd); + bool (*check_inode)(struct scrub_ctx *ctx, const char *descr, int fd, + struct stat64 *sb); + bool (*scan_extents)(struct scrub_ctx *ctx, const char *descr, int fd, + struct stat64 *sb, bool attr_fork); + bool (*scan_xattrs)(struct scrub_ctx *ctx, const char *descr, int fd); + bool (*scan_special_xattrs)(struct scrub_ctx *ctx, const char *path); + bool (*scan_metadata)(struct scrub_ctx *ctx); + bool (*check_summary)(struct scrub_ctx *ctx); + bool (*scan_blocks)(struct scrub_ctx *ctx); + bool (*read_file)(struct scrub_ctx *ctx, const char *descr, int fd, + struct stat64 *sb); + bool (*scan_fs_tree)(struct scrub_ctx *ctx); +}; + +#define SCRUB_QUIRK_FIEMAP_WORKS (1 << 0) +#define SCRUB_QUIRK_FIEMAP_ATTR_WORKS (1 << 1) +#define SCRUB_QUIRK_FIBMAP_WORKS (1 << 2) +#define SCRUB_QUIRK_IGNORE_STATFS_BLOCKS (1 << 3) +struct scrub_ctx { + /* Immutable scrub state. */ + struct scrub_ops *ops; + char *mntpoint; + int mnt_fd; + char *blkdev; + struct disk datadev; + unsigned int nr_io_threads; + char *mnt_type; + struct stat64 mnt_sb; + struct statvfs mnt_sv; + struct statfs mnt_sf; + void *readbuf; + + /* Mutable scrub state; use lock. */ + pthread_mutex_t lock; + unsigned long errors_found; + unsigned long warnings_found; + unsigned long quirks; + + void *priv; +}; + +extern bool verbose; +extern int debug; +extern bool scrub_data; +extern long page_size; + +void __str_errno(struct scrub_ctx *, const char *, const char *, int); +void __str_error(struct scrub_ctx *, const char *, const char *, int, + const char *, ...); +void __str_warn(struct scrub_ctx *, const char *, const char *, int, + const char *, ...); +void __str_info(struct scrub_ctx *, const char *, const char *, int, + const char *, ...); + +#define str_errno(ctx, str) __str_errno(ctx, str, __FILE__, __LINE__) +#define str_error(ctx, str, ...) __str_error(ctx, str, __FILE__, __LINE__, __VA_ARGS__) +#define str_warn(ctx, str, ...) __str_warn(ctx, str, __FILE__, __LINE__, __VA_ARGS__) +#define str_info(ctx, str, ...) __str_info(ctx, str, __FILE__, __LINE__, __VA_ARGS__) +#define dbg_printf(fmt, ...) {if (debug > 1) {printf(fmt, __VA_ARGS__);}} + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + +extern struct scrub_ops generic_scrub_ops; +extern struct scrub_ops xfs_scrub_ops; +extern struct scrub_ops ext2_scrub_ops; +extern struct scrub_ops ext3_scrub_ops; +extern struct scrub_ops ext4_scrub_ops; +extern struct scrub_ops btrfs_scrub_ops; + +/* Generic implementations of the ops functions */ +bool generic_cleanup(struct scrub_ctx *ctx); +bool generic_scan_fs(struct scrub_ctx *ctx); +bool generic_scan_inodes(struct scrub_ctx *ctx); +bool generic_check_dir(struct scrub_ctx *ctx, const char *descr, int dir_fd); +bool generic_check_inode(struct scrub_ctx *ctx, const char *descr, int fd, + struct stat64 *sb); +bool generic_scan_extents(struct scrub_ctx *ctx, const char *descr, int fd, + struct stat64 *sb, bool attr_fork); +bool generic_scan_xattrs(struct scrub_ctx *ctx, const char *descr, int fd); +bool generic_scan_special_xattrs(struct scrub_ctx *ctx, const char *path); +bool generic_scan_metadata(struct scrub_ctx *ctx); +bool generic_check_summary(struct scrub_ctx *ctx); +bool generic_read_file(struct scrub_ctx *ctx, const char *descr, int fd, + struct stat64 *sb); +bool generic_scan_blocks(struct scrub_ctx *ctx); +bool generic_scan_fs_tree(struct scrub_ctx *ctx); + +/* Miscellaneous utility functions */ +unsigned int scrub_nproc(struct scrub_ctx *ctx); +bool generic_check_directory(struct scrub_ctx *ctx, const char *descr, + int *pfd); +bool within_range(struct scrub_ctx *ctx, unsigned long long value, + unsigned long long desired, unsigned long long diff_threshold, + unsigned int n, unsigned int d, const char *descr); +double auto_space_units(unsigned long long kilobytes, char **units); +double auto_units(unsigned long long number, char **units); + +#ifndef HAVE_SYNCFS +static inline int syncfs(int fd) +{ + sync(); + return 0; +} +#endif + +#endif /* SCRUB_H_ */ diff --git a/scrub/xfs.c b/scrub/xfs.c new file mode 100644 index 0000000..18d9a11 --- /dev/null +++ b/scrub/xfs.c @@ -0,0 +1,2272 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include +#include +#include +#include +#include "disk.h" +#include "scrub.h" +#include "../repair/threads.h" +#include "handle.h" +#include "path.h" +#include "xfs_ioctl.h" +#include "read_verify.h" +#include "extent.h" +#include "iocmd.h" + +/* + * XFS Scrubbing Strategy + * + * The XFS scrubber is much more thorough than the generic scrubber + * because we can use custom XFS ioctls to probe more deeply into the + * internals of the filesystem. Furthermore, we can take advantage of + * scrubbing ioctls to check all the records stored in a metadata btree + * and cross-reference those records against the other btrees. + * + * The "find geometry" phase queries XFS for the filesystem geometry. + * The block devices for the data, realtime, and log devices are opened. + * Kernel ioctls are queried to see if they are implemented, and a data + * file read-verify strategy is selected. + * + * In the "check internal metadata" phase, we call the SCRUB_METADATA + * ioctl to check the filesystem's internal per-AG btrees. This + * includes the AG superblock, AGF, AGFL, and AGI headers, freespace + * btrees, the regular and free inode btrees, the reverse mapping + * btrees, and the reference counting btrees. If the realtime device is + * enabled, the realtime bitmap and reverse mapping btrees are enabled. + * Each AG (and the realtime device) has its metadata checked in a + * separate thread for better performance. + * + * The "scan inodes" phase uses BULKSTAT to scan all the inodes in an + * AG in disk order. From the BULKSTAT information, a file handle is + * constructed and the following items are checked: + * + * - If it's a symlink, the target is read but not validated. + * - Bulkstat data is checked. + * - If the inode is a file or a directory, a file descriptor is + * opened to pin the inode and for further analysis. + * - Extended attribute names and values are read via the file + * handle. If this fails and we have a file descriptor open, we + * retry with the generic extended attribute APIs. + * - If the inode is not a file or directory, we're done. + * - Extent maps are scanned to ensure that the records make sense. + * We also use the SCRUB_METADATA ioctl for better checking of the + * block mapping records. + * - If the inode is a directory, open the directory and check that + * the dirent type code and inode numbers match the stat output. + * + * Multiple threads are started to check each the inodes of each AG in + * parallel. + * + * If BULKSTAT is available, we can skip the "check directory structure" + * phase because directories were checked during the inode scan. + * Otherwise, the generic directory structure check is used. + * + * In the "verify data file integrity" phase, we can employ multiple + * strategies to read-verify the data blocks: + * + * - If GETFSMAP is available, use it to read the reverse-mappings of + * all AGs and issue direct-reads of the underlying disk blocks. + * We rely on the underlying storage to have checksummed the data + * blocks appropriately. + * - If GETBMAPX is available, we use BULKSTAT (or a directory tree + * walk) to iterate all inodes and issue direct-reads of the + * underlying data. Similar to the generic read-verify, the data + * extents are buffered through a bitmap, which is used to issue + * larger IOs. Errors are recorded and cross-referenced through + * a second BULKSTAT/GETBMAPX run. + * - Otherwise, call the generic handler to verify file data. + * + * Multiple threads are started to check each AG in parallel. A + * separate thread pool is used to handle the direct reads. + * + * In the "check summary counters" phase, use GETFSMAP to tally up the + * blocks and BULKSTAT to tally up the inodes we saw and compare that to + * the statfs output. This gives the user a rough estimate of how + * thorough the scrub was. + */ + +/* Routines to scrub an XFS filesystem. */ + +enum data_scrub_type { + DS_NOSCRUB, /* no data scrub */ + DS_READ, /* generic_scan_blocks */ + DS_BULKSTAT_READ, /* bulkstat and generic_file_read */ + DS_BMAPX, /* bulkstat, getbmapx, and read_verify */ + DS_FSMAP, /* getfsmap and read_verify */ +}; + +struct xfs_scrub_ctx { + struct xfs_fsop_geom geo; + struct fs_path fsinfo; + unsigned int agblklog; + unsigned int blocklog; + unsigned int inodelog; + unsigned int inopblog; + struct disk datadev; + struct disk logdev; + struct disk rtdev; + void *fshandle; + size_t fshandle_len; + bool kernel_scrub; /* have kernel scrub assist? */ + bool fsmap; /* have getfsmap ioctl? */ + bool bulkstat; /* have bulkstat ioctl? */ + bool bmapx; /* have bmapx ioctl? */ + bool checked_xattrs; /* did we check all xattrs? */ + bool parent_ptrs; /* have parent pointers? */ + struct read_verify_pool rvp; + enum data_scrub_type data_scrubber; +}; + +/* Find the fd for a given device identifier. */ +static struct disk * +xfs_dev_to_disk( + struct xfs_scrub_ctx *xctx, + dev_t dev) +{ + if (dev == xctx->fsinfo.fs_datadev) + return &xctx->datadev; + else if (dev == xctx->fsinfo.fs_logdev) + return &xctx->logdev; + else if (dev == xctx->fsinfo.fs_rtdev) + return &xctx->rtdev; + assert(0); +} + +/* Find the device major/minor for a given file descriptor. */ +static dev_t +xfs_disk_to_dev( + struct xfs_scrub_ctx *xctx, + struct disk *disk) +{ + if (disk == &xctx->datadev) + return xctx->fsinfo.fs_datadev; + else if (disk == &xctx->logdev) + return xctx->fsinfo.fs_logdev; + else if (disk == &xctx->rtdev) + return xctx->fsinfo.fs_rtdev; + assert(0); +} + +struct owner_decode { + uint64_t owner; + const char *descr; +}; + +static const struct owner_decode special_owners[] = { + {FMV_OWN_FREE, "free space"}, + {FMV_OWN_UNKNOWN, "unknown owner"}, + {FMV_OWN_FS, "static FS metadata"}, + {FMV_OWN_LOG, "journalling log"}, + {FMV_OWN_AG, "per-AG metadata"}, + {FMV_OWN_INOBT, "inode btree blocks"}, + {FMV_OWN_INODES, "inodes"}, + {FMV_OWN_REFC, "refcount btree"}, + {FMV_OWN_COW, "CoW staging"}, + {FMV_OWN_DEFECTIVE, "bad blocks"}, + {0, NULL}, +}; + +/* Decode a special owner. */ +static const char * +xfs_decode_special_owner( + uint64_t owner) +{ + const struct owner_decode *od = special_owners; + + while (od->descr) { + if (od->owner == owner) + return od->descr; + od++; + } + + return NULL; +} + +/* BULKSTAT wrapper routines. */ + +/* Scan all the inodes in an AG. */ +static void +xfs_scan_ag_inodes( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + struct xfs_inode_iter *is = (struct xfs_inode_iter *)arg; + struct scrub_ctx *ctx = (struct scrub_ctx *)wq->mp; + struct xfs_scrub_ctx *xctx = ctx->priv; + uint64_t ag_ino; + uint64_t next_ag_ino; + bool moveon; + + ag_ino = (__u64)agno << (xctx->inopblog + xctx->agblklog); + next_ag_ino = (__u64)(agno + 1) << (xctx->inopblog + xctx->agblklog); + + moveon = xfs_iterate_inodes(ctx, is, agno, xctx->fshandle, ag_ino, + next_ag_ino - 1); + if (!moveon) + is->moveon = false; +} + +/* Scan all the inodes in a filesystem. */ +static bool +xfs_scan_all_inodes( + struct scrub_ctx *ctx, + bool (*fn)(struct scrub_ctx *, xfs_agnumber_t, + struct xfs_handle *, + struct xfs_bstat *, void *), + void *arg) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + xfs_agnumber_t agno; + struct work_queue wq; + struct xfs_inode_iter is; + + if (!xctx->bulkstat) + return true; + + is.moveon = true; + is.fn = fn; + is.arg = arg; + + create_work_queue(&wq, (struct xfs_mount *)ctx, scrub_nproc(ctx)); + for (agno = 0; agno < xctx->geo.agcount; agno++) + queue_work(&wq, xfs_scan_ag_inodes, agno, &is); + destroy_work_queue(&wq); + + return is.moveon; +} + +/* GETFSMAP wrappers routines. */ + +/* Iterate all the reverse mappings of an AG. */ +static void +xfs_scan_ag_blocks( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + struct scrub_ctx *ctx = (struct scrub_ctx *)wq->mp; + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_fsmap_iter *xfi = arg; + struct getfsmap map[2]; + off64_t bbperag; + bool moveon; + + bbperag = (off64_t)xctx->geo.agblocks * + (off64_t)xctx->geo.blocksize / BBSIZE; + + memset(map, 0, sizeof(*map) * 2); + map->fmv_device = xctx->fsinfo.fs_datadev; + map->fmv_block = agno * bbperag; + (map + 1)->fmv_device = xctx->fsinfo.fs_datadev; + (map + 1)->fmv_block = ((agno + 1) * bbperag) - 1; + (map + 1)->fmv_owner = ULLONG_MAX; + (map + 1)->fmv_offset = ULLONG_MAX; + (map + 1)->fmv_oflags = UINT_MAX; + + moveon = xfs_iterate_fsmap(ctx, xfi, agno, map); + if (!moveon) + xfi->moveon = false; +} + +/* Iterate all the reverse mappings of a standalone device. */ +static void +xfs_scan_dev_blocks( + struct scrub_ctx *ctx, + int idx, + struct xfs_fsmap_iter *xfi, + dev_t dev) +{ + struct getfsmap map[2]; + bool moveon; + + memset(map, 0, sizeof(*map) * 2); + map->fmv_device = dev; + (map + 1)->fmv_device = dev; + (map + 1)->fmv_block = ULLONG_MAX; + (map + 1)->fmv_owner = ULLONG_MAX; + (map + 1)->fmv_offset = ULLONG_MAX; + (map + 1)->fmv_oflags = UINT_MAX; + + moveon = xfs_iterate_fsmap(ctx, xfi, idx, map); + if (!moveon) + xfi->moveon = false; +} + +/* Iterate all the reverse mappings of the realtime device. */ +static void +xfs_scan_rt_blocks( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + struct scrub_ctx *ctx = (struct scrub_ctx *)wq->mp; + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_fsmap_iter *xfi = arg; + + xfs_scan_dev_blocks(ctx, agno, xfi, xctx->fsinfo.fs_rtdev); +} + +/* Iterate all the reverse mappings of the log device. */ +static void +xfs_scan_log_blocks( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + struct scrub_ctx *ctx = (struct scrub_ctx *)wq->mp; + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_fsmap_iter *xfi = arg; + + xfs_scan_dev_blocks(ctx, agno, xfi, xctx->fsinfo.fs_logdev); +} + +/* Scan all the blocks in a filesystem. */ +static bool +xfs_scan_all_blocks( + struct scrub_ctx *ctx, + bool (*fn)(struct scrub_ctx *, const char *, int, + struct getfsmap *, void *), + void *arg) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + xfs_agnumber_t agno; + struct work_queue wq; + struct xfs_fsmap_iter bs; + + bs.moveon = true; + bs.fn = fn; + bs.arg = arg; + + create_work_queue(&wq, (struct xfs_mount *)ctx, scrub_nproc(ctx)); + if (xctx->fsinfo.fs_rt) + queue_work(&wq, xfs_scan_rt_blocks, -1, &bs); + if (xctx->fsinfo.fs_log) + queue_work(&wq, xfs_scan_log_blocks, -2, &bs); + for (agno = 0; agno < xctx->geo.agcount; agno++) + queue_work(&wq, xfs_scan_ag_blocks, agno, &bs); + destroy_work_queue(&wq); + + return bs.moveon; +} + +/* Routines to translate bad physical extents into file paths and offsets. */ + +struct xfs_verify_error_info { + struct extent_tree *d_bad; + struct extent_tree *r_bad; +}; + +/* Report if this extent overlaps a bad region. */ +static bool +xfs_report_verify_inode_bmap( + struct scrub_ctx *ctx, + const char *descr, + int fd, + int whichfork, + struct fsxattr *fsx, + struct getbmapx *bmap, + void *arg) +{ + struct xfs_verify_error_info *vei = arg; + struct extent_tree *tree; + + /* + * Only do data scrubbing if the extent is neither unwritten nor + * delalloc. + */ + if (bmap->bmv_oflags & (BMV_OF_PREALLOC | BMV_OF_DELALLOC)) + return true; + + if (fsx->fsx_xflags & FS_XFLAG_REALTIME) + tree = vei->r_bad; + else + tree = vei->d_bad; + + if (!extent_tree_has_extent(tree, bmap->bmv_block, bmap->bmv_length)) + return true; + + str_error(ctx, descr, +_("offset %llu failed read verification."), + bmap->bmv_offset); + return true; +} + +/* Iterate the extent mappings of a file to report errors. */ +static bool +xfs_report_verify_fd( + struct scrub_ctx *ctx, + const char *descr, + int fd, + void *arg) +{ + struct xfs_bmap_iter xbi; + struct getbmapx key; + bool moveon; + + xbi.moveon = true; + xbi.arg = arg; + xbi.descr = descr; + xbi.fn = xfs_report_verify_inode_bmap; + + /* data fork */ + memset(&key, 0, sizeof(key)); + key.bmv_length = ULLONG_MAX; + moveon = xfs_iterate_bmap(ctx, &xbi, fd, XFS_DATA_FORK, &key); + if (!moveon || !xbi.moveon) + return false; + + /* attr fork */ + memset(&key, 0, sizeof(key)); + key.bmv_length = ULLONG_MAX; + moveon = xfs_iterate_bmap(ctx, &xbi, fd, XFS_ATTR_FORK, &key); + if (!moveon || !xbi.moveon) + return false; + return true; +} + +/* Report read verify errors in unlinked (but still open) files. */ +static bool +xfs_report_verify_inode( + struct scrub_ctx *ctx, + xfs_agnumber_t agno, + struct xfs_handle *handle, + struct xfs_bstat *bstat, + void *arg) +{ + char descr[DESCR_BUFSZ]; + bool moveon; + int fd; + + /* Ignore linked files and things we can't open. */ + if (bstat->bs_nlink != 0) + return true; + if (!S_ISREG(bstat->bs_mode) && !S_ISDIR(bstat->bs_mode)) + return true; + + /* Try to open the inode. */ + fd = open_by_fshandle(handle, sizeof(*handle), + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) + return true; + + /* Go find the badness. */ + snprintf(descr, DESCR_BUFSZ, _("inode %llu (unlinked)"), bstat->bs_ino); + moveon = xfs_report_verify_fd(ctx, descr, fd, arg); + if (moveon) + goto out; + +out: + close(fd); + return moveon; +} + +/* Scan the inode associated with a directory entry. */ +static bool +xfs_report_verify_dirent( + struct scrub_ctx *ctx, + const char *path, + int dir_fd, + struct dirent *dirent, + struct stat64 *sb, + void *arg) +{ + bool moveon; + int fd; + + /* Ignore things we can't open. */ + if (!S_ISREG(sb->st_mode) && !S_ISDIR(sb->st_mode)) + return true; + /* Ignore . and .. */ + if (!strcmp(".", dirent->d_name) || !strcmp("..", dirent->d_name)) + return true; + + /* Open the file */ + fd = openat(dir_fd, dirent->d_name, + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) + return true; + + /* Go find the badness. */ + moveon = xfs_report_verify_fd(ctx, path, fd, arg); + if (moveon) + goto out; + +out: + close(fd); + + return moveon; +} + +/* Given bad extent lists for the data & rtdev, find bad files. */ +static bool +xfs_report_verify_errors( + struct scrub_ctx *ctx, + struct extent_tree *d_bad, + struct extent_tree *r_bad) +{ + struct xfs_verify_error_info vei; + bool moveon; + + vei.d_bad = d_bad; + vei.r_bad = r_bad; + + /* Scan the directory tree to get file paths. */ + moveon = scan_fs_tree(ctx, NULL, xfs_report_verify_dirent, &vei); + if (!moveon) + return false; + + /* Scan for unlinked files. */ + return xfs_scan_all_inodes(ctx, xfs_report_verify_inode, &vei); +} + +/* Phase 1 */ + +/* Clean up the XFS-specific state data. */ +static bool +xfs_cleanup( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + + if (!xctx) + goto out; + if (xctx->fshandle) + free_handle(xctx->fshandle, xctx->fshandle_len); + disk_close(&xctx->rtdev); + disk_close(&xctx->logdev); + disk_close(&xctx->datadev); + free(ctx->priv); + ctx->priv = NULL; + +out: + return generic_cleanup(ctx); +} + +/* Read the XFS geometry. */ +static bool +xfs_scan_fs( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx; + struct fs_path *fsp; + int error; + + if (!platform_test_xfs_fd(ctx->mnt_fd)) { + str_error(ctx, ctx->mntpoint, +_("Does not appear to be an XFS filesystem!")); + return false; + } + + xctx = calloc(1, sizeof(struct xfs_scrub_ctx)); + if (!ctx) { + str_errno(ctx, ctx->mntpoint); + return false; + } + xctx->datadev.d_fd = xctx->logdev.d_fd = xctx->rtdev.d_fd = -1; + + /* Retrieve XFS geometry. */ + error = xfsctl(ctx->mntpoint, ctx->mnt_fd, XFS_IOC_FSGEOMETRY, + &xctx->geo); + if (error) { + str_errno(ctx, ctx->mntpoint); + goto err; + } + ctx->priv = xctx; + + xctx->agblklog = libxfs_log2_roundup(xctx->geo.agblocks); + xctx->blocklog = libxfs_highbit32(xctx->geo.blocksize); + xctx->inodelog = libxfs_highbit32(xctx->geo.inodesize); + xctx->inopblog = xctx->blocklog - xctx->inodelog; + + error = path_to_fshandle(ctx->mntpoint, &xctx->fshandle, + &xctx->fshandle_len); + if (error) { + perror(_("getting fshandle")); + goto err; + } + + /* Do we have bulkstat? */ + xctx->bulkstat = xfs_can_iterate_inodes(ctx); + if (!xctx->bulkstat) + str_info(ctx, ctx->mntpoint, +_("Kernel lacks BULKSTAT; scrub will be incomplete.")); + + /* Do we have kernel-assisted scrubbing? */ + xctx->kernel_scrub = xfs_can_scrub_metadata(ctx); + if (!xctx->kernel_scrub) + str_info(ctx, ctx->mntpoint, +_("Kernel cannot help scrub metadata; scrub will be incomplete.")); + + /* Do we have getbmapx? */ + xctx->bmapx = xfs_can_iterate_bmap(ctx); + if (!xctx->bmapx) + str_info(ctx, ctx->mntpoint, +_("Kernel lacks GETBMAPX; scrub will be less efficient.")); + + /* Do we have getfsmap? */ + xctx->fsmap = xfs_can_iterate_fsmap(ctx); + if (!xctx->fsmap && scrub_data) + str_info(ctx, ctx->mntpoint, +_("Kernel lacks GETFSMAP; scrub will be less efficient.")); + + /* Do we have parent pointers? */ + xctx->parent_ptrs = false; /* NOPE */ + + /* Go find the XFS devices if we have a usable fsmap. */ + fs_table_initialise(0, NULL, 0, NULL); + errno = 0; + fsp = fs_table_lookup(ctx->mntpoint, FS_MOUNT_POINT); + if (!fsp) { + str_error(ctx, ctx->mntpoint, +_("Unable to find XFS information.")); + goto err; + } + memcpy(&xctx->fsinfo, fsp, sizeof(struct fs_path)); + + /* Did we find the log and rt devices, if they're present? */ + if (xctx->geo.logstart == 0 && xctx->fsinfo.fs_log == NULL) { + str_error(ctx, ctx->mntpoint, +_("Unable to find log device path.")); + goto err; + } + if (xctx->geo.rtblocks && xctx->fsinfo.fs_rt == NULL) { + str_error(ctx, ctx->mntpoint, +_("Unable to find realtime device path.")); + goto err; + } + + /* Open the raw devices. */ + error = disk_open(xctx->fsinfo.fs_name, &xctx->datadev); + if (error) { + str_errno(ctx, xctx->fsinfo.fs_name); + xctx->fsmap = false; + } + ctx->nr_io_threads = disk_heads(&xctx->datadev); + + if (xctx->fsinfo.fs_log) { + error = disk_open(xctx->fsinfo.fs_log, &xctx->logdev); + if (error) { + str_errno(ctx, xctx->fsinfo.fs_name); + xctx->fsmap = false; + } + } + if (xctx->fsinfo.fs_rt) { + error = disk_open(xctx->fsinfo.fs_rt, &xctx->rtdev); + if (error) { + str_errno(ctx, xctx->fsinfo.fs_name); + xctx->fsmap = false; + } + } + if (xctx->geo.sunit) + ctx->nr_io_threads = xctx->geo.swidth / xctx->geo.sunit; + + /* Figure out who gets to scrub data extents... */ + if (scrub_data) { + if (xctx->fsmap) + xctx->data_scrubber = DS_FSMAP; + else if (xctx->bmapx) + xctx->data_scrubber = DS_BMAPX; + else if (xctx->bulkstat) + xctx->data_scrubber = DS_BULKSTAT_READ; + else + xctx->data_scrubber = DS_READ; + } else + xctx->data_scrubber = DS_NOSCRUB; + + return generic_scan_fs(ctx); +err: + xfs_cleanup(ctx); + return false; +} + +/* Phase 2 */ + +/* Scrub each AG's metadata btrees. */ +static void +xfs_scan_ag_metadata( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + struct scrub_ctx *ctx = (struct scrub_ctx *)wq->mp; + struct xfs_scrub_ctx *xctx = ctx->priv; + bool *pmoveon = arg; + bool moveon; + + if (!xctx->kernel_scrub) + return; + + moveon = xfs_scrub_ag_metadata(ctx, agno, arg); + if (!moveon) + *pmoveon = false; +} + +/* Scrub whole-FS metadata btrees. */ +static void +xfs_scan_fs_metadata( + struct work_queue *wq, + xfs_agnumber_t agno, + void *arg) +{ + struct scrub_ctx *ctx = (struct scrub_ctx *)wq->mp; + struct xfs_scrub_ctx *xctx = ctx->priv; + bool *pmoveon = arg; + bool moveon; + + if (!xctx->kernel_scrub) + return; + + moveon = xfs_scrub_fs_metadata(ctx, arg); + if (!moveon) + *pmoveon = false; +} + +/* Try to scan metadata via sysfs. */ +static bool +xfs_scan_metadata( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + xfs_agnumber_t agno; + struct work_queue wq; + bool moveon = true; + + create_work_queue(&wq, (struct xfs_mount *)ctx, scrub_nproc(ctx)); + queue_work(&wq, xfs_scan_fs_metadata, 0, &moveon); + for (agno = 0; agno < xctx->geo.agcount; agno++) + queue_work(&wq, xfs_scan_ag_metadata, agno, &moveon); + destroy_work_queue(&wq); + + return moveon; +} + +/* Phase 3 */ + +/* Scrub an inode extent, report if it's bad. */ +static bool +xfs_scrub_inode_extent( + struct scrub_ctx *ctx, + const char *descr, + int fd, + int whichfork, + struct fsxattr *fsx, + struct getbmapx *bmap, + void *arg) +{ + unsigned long long *nextoff = arg; + struct xfs_scrub_ctx *xctx = ctx->priv; + unsigned long long eofs; + bool badmap = false; + + if (fsx->fsx_xflags & FS_XFLAG_REALTIME) + eofs = xctx->geo.rtblocks; + else + eofs = xctx->geo.datablocks; + eofs <<= (xctx->blocklog - BBSHIFT); + + if (bmap->bmv_length == 0) { + badmap = true; + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) has zero length."), + bmap->bmv_block, bmap->bmv_offset, + bmap->bmv_length); + } + + if (bmap->bmv_block >= eofs) { + badmap = true; + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) starts past end of filesystem at %llu."), + bmap->bmv_block, bmap->bmv_offset, + bmap->bmv_length, eofs); + } + + if (bmap->bmv_offset < *nextoff) { + badmap = true; + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) overlaps another extent."), + bmap->bmv_block, bmap->bmv_offset, + bmap->bmv_length); + } + + if (bmap->bmv_block + bmap->bmv_length < bmap->bmv_block || + bmap->bmv_block + bmap->bmv_length >= eofs) { + badmap = true; + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) ends past end of filesystem at %llu."), + bmap->bmv_block, bmap->bmv_offset, + bmap->bmv_length, eofs); + } + + if (bmap->bmv_offset + bmap->bmv_length < bmap->bmv_offset) { + badmap = true; + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) overflows file offset."), + bmap->bmv_block, bmap->bmv_offset, + bmap->bmv_length); + } + + if ((bmap->bmv_oflags & BMV_OF_SHARED) && + (bmap->bmv_oflags & (BMV_OF_PREALLOC | BMV_OF_DELALLOC))) { + badmap = true; + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) has conflicting flags 0x%x."), + bmap->bmv_block, bmap->bmv_offset, + bmap->bmv_length, bmap->bmv_oflags); + } + + if ((bmap->bmv_oflags & BMV_OF_SHARED) && + !(fsx->fsx_xflags & FS_XFLAG_REFLINK)) { + badmap = true; + str_error(ctx, descr, +_("extent (%llu/%llu/%llu) is shared but %s is not?"), + bmap->bmv_block, bmap->bmv_offset, + bmap->bmv_length, descr); + } + + if (!badmap) + *nextoff = bmap->bmv_offset + bmap->bmv_length; + + return true; +} + +/* Scrub an inode's data, xattr, and CoW extent records. */ +static bool +xfs_scan_inode_extents( + struct scrub_ctx *ctx, + const char *descr, + int fd) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_bmap_iter xbi; + struct getbmapx key; + bool moveon; + unsigned long long nextoff; + + xbi.moveon = true; + xbi.fn = xfs_scrub_inode_extent; + xbi.arg = &nextoff; + xbi.descr = descr; + + /* data fork */ + memset(&key, 0, sizeof(key)); + key.bmv_length = ULLONG_MAX; + nextoff = 0; + moveon = xfs_iterate_bmap(ctx, &xbi, fd, XFS_DATA_FORK, &key); + if (!moveon) + return false; + + /* attr fork */ + memset(&key, 0, sizeof(key)); + key.bmv_length = ULLONG_MAX; + nextoff = 0; + moveon = xfs_iterate_bmap(ctx, &xbi, fd, XFS_ATTR_FORK, &key); + if (!moveon) + return false; + + if (!(xctx->geo.flags & XFS_FSOP_GEOM_FLAGS_REFLINK)) + return xbi.moveon; + + /* cow fork */ + memset(&key, 0, sizeof(key)); + key.bmv_length = ULLONG_MAX; + nextoff = 0; + moveon = xfs_iterate_bmap(ctx, &xbi, fd, XFS_COW_FORK, &key); + if (!moveon) + return false; + + return xbi.moveon; +} + +enum xfs_xattr_ns { + RXT_USER = 0, + RXT_ROOT = ATTR_ROOT, + RXT_TRUST = ATTR_TRUST, + RXT_SECURE = ATTR_SECURE, + RXT_MAX = 4, +}; + +static const enum xfs_xattr_ns known_attr_ns[RXT_MAX] = { + RXT_USER, + RXT_ROOT, + RXT_TRUST, + RXT_SECURE, +}; + +/* Read all the extended attributes of a file handle. */ +static bool +xfs_read_handle_xattrs( + struct scrub_ctx *ctx, + const char *descr, + struct xfs_handle *handle, + enum xfs_xattr_ns ns) +{ + struct attrlist_cursor cur; + struct attr_multiop mop; + char attrbuf[XFS_XATTR_LIST_MAX]; + char *firstname = NULL; + struct xfs_scrub_ctx *xctx = ctx->priv; + struct attrlist *attrlist = (struct attrlist *)attrbuf; + struct attrlist_ent *ent; + bool moveon = true; + int i; + int flags = 0; + int error; + + flags |= ns; + memset(&attrbuf, 0, XFS_XATTR_LIST_MAX); + memset(&cur, 0, sizeof(cur)); + mop.am_opcode = ATTR_OP_GET; + mop.am_flags = flags; + while ((error = attr_list_by_handle(handle, sizeof(*handle), + attrbuf, XFS_XATTR_LIST_MAX, flags, &cur)) == 0) { + for (i = 0; i < attrlist->al_count; i++) { + ent = ATTR_ENTRY(attrlist, i); + + /* + * XFS has a longstanding bug where the attr cursor + * never gets updated, causing an infinite loop. + * Detect this and bail out. + */ + if (i == 0 && xctx->checked_xattrs) { + if (firstname == NULL) { + firstname = malloc(ent->a_valuelen); + memcpy(firstname, ent->a_name, + ent->a_valuelen); + } else if (memcmp(firstname, ent->a_name, + ent->a_valuelen) == 0) { + str_error(ctx, descr, +_("duplicate extended attribute \"%s\", buggy XFS?"), + ent->a_name); + moveon = false; + goto out; + } + } + + mop.am_attrname = ent->a_name; + mop.am_attrvalue = ctx->readbuf; + mop.am_length = IO_MAX_SIZE; + error = attr_multi_by_handle(handle, sizeof(*handle), + &mop, 1, flags); + if (error) + goto out; + } + + if (!attrlist->al_more) + break; + } + + /* ATTR_TRUST doesn't currently work on Linux... */ + if (ns == RXT_TRUST && error && errno == EINVAL) + error = 0; + +out: + if (firstname) + free(firstname); + if (error) + str_errno(ctx, descr); + return moveon; +} + +/* Verify the contents, xattrs, and extent maps of an inode. */ +static bool +xfs_scrub_inode( + struct scrub_ctx *ctx, + xfs_agnumber_t agno, + struct xfs_handle *handle, + struct xfs_bstat *bstat, + void *arg) +{ + struct stat64 fd_sb; + struct xfs_scrub_ctx *xctx = ctx->priv; + static char linkbuf[PATH_MAX]; + char descr[DESCR_BUFSZ]; + unsigned long long eofs; + bool moveon = true; + int fd = -1; + int i; + int error; + + snprintf(descr, DESCR_BUFSZ, _("inode %llu/%u"), bstat->bs_ino, + bstat->bs_gen); + + /* Check symlink contents. */ + if (S_ISLNK(bstat->bs_mode)) { + error = readlink_by_handle(handle, sizeof(*handle), linkbuf, + PATH_MAX); + if (error < 0) + str_errno(ctx, descr); + return true; + } + + /* Check block sizes. */ + if (!S_ISBLK(bstat->bs_mode) && !S_ISCHR(bstat->bs_mode) && + bstat->bs_blksize != xctx->geo.blocksize) + str_error(ctx, descr, +_("Block size mismatch %u, expected %u"), + bstat->bs_blksize, xctx->geo.blocksize); + if (bstat->bs_xflags & FS_XFLAG_EXTSIZE) { + if (bstat->bs_extsize > (MAXEXTLEN << xctx->blocklog)) + str_error(ctx, descr, +_("Extent size hint %u too large"), bstat->bs_extsize); + if (!(bstat->bs_xflags & FS_XFLAG_REALTIME) && + bstat->bs_extsize > (xctx->geo.agblocks << (xctx->blocklog - 1))) + str_error(ctx, descr, +_("Extent size hint %u too large for AG"), bstat->bs_extsize); + if (!(bstat->bs_xflags & FS_XFLAG_REALTIME) && + bstat->bs_extsize % xctx->geo.blocksize) + str_error(ctx, descr, +_("Extent size hint %u not a multiple of blocksize"), bstat->bs_extsize); + if ((bstat->bs_xflags & FS_XFLAG_REALTIME) && + bstat->bs_extsize % (xctx->geo.rtextsize << xctx->blocklog)) + str_error(ctx, descr, +_("Extent size hint %u not a multiple of rt extent size"), bstat->bs_extsize); + } + if ((bstat->bs_xflags & FS_XFLAG_REFLINK) && + !(xctx->geo.flags & XFS_FSOP_GEOM_FLAGS_REFLINK)) + str_error(ctx, descr, +_("Is a shared inode on a non-reflink filesystem?"), 0); + if ((bstat->bs_xflags & FS_XFLAG_COWEXTSIZE) && + !(xctx->geo.flags & XFS_FSOP_GEOM_FLAGS_REFLINK)) + str_error(ctx, descr, +_("Has a CoW extent size hint on a non-reflink filesystem?"), 0); + if (bstat->bs_xflags & FS_XFLAG_COWEXTSIZE) { + if (bstat->bs_cowextsize > (MAXEXTLEN << xctx->blocklog)) + str_error(ctx, descr, +_("CoW Extent size hint %u too large"), bstat->bs_cowextsize); + if (bstat->bs_cowextsize > (xctx->geo.agblocks << (xctx->blocklog - 1))) + str_error(ctx, descr, +_("CoW Extent size hint %u too large for AG"), bstat->bs_cowextsize); + if (bstat->bs_cowextsize % xctx->geo.blocksize) + str_error(ctx, descr, +_("CoW Extent size hint %u not a multiple of blocksize"), bstat->bs_cowextsize); + } + if (bstat->bs_xflags & FS_XFLAG_REALTIME) + eofs = xctx->geo.rtblocks; + else + eofs = xctx->geo.datablocks; + if (!(bstat->bs_xflags & FS_XFLAG_REFLINK) && bstat->bs_blocks >= eofs) + str_error(ctx, descr, +_("Claims having more blocks (%llu) than there are in filesystem (%llu)"), + bstat->bs_blocks << (xctx->blocklog - BBSHIFT), + eofs << (xctx->blocklog - BBSHIFT)); + + /* Try to open the inode to pin it. */ + if (S_ISREG(bstat->bs_mode) || S_ISDIR(bstat->bs_mode)) { + fd = open_by_fshandle(handle, sizeof(*handle), + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) { + char buf[DESCR_BUFSZ]; + + str_warn(ctx, descr, "%s", strerror_r(errno, + buf, DESCR_BUFSZ)); + return true; + } + } + + /* XXX: Some day, check child -> parent dir -> child. */ + + /* + * Read all the extended attributes. If any of the read + * functions decline to move on, we can try again with the + * VFS functions if we have a file descriptor. + */ + moveon = true; + for (i = 0; i < RXT_MAX; i++) { + moveon = xfs_read_handle_xattrs(ctx, descr, handle, + known_attr_ns[i]); + if (!moveon) + break; + } + if (!moveon && fd >= 0) { + moveon = generic_scan_xattrs(ctx, descr, fd); + if (!moveon) + goto out; + } + if (!moveon) + xctx->checked_xattrs = false; + + /* + * The rest of the scans require a file descriptor, so bail out + * if we don't have one. + */ + if (fd < 0) + goto out; + + if (xctx->kernel_scrub) { + /* Scan the extent maps with the kernel scrubber. */ + moveon = xfs_scrub_inode_metadata(ctx, bstat->bs_ino, fd); + if (!moveon) + goto out; + } else if (xctx->bmapx) { + /* Scan the extent maps with GETBMAPX. */ + moveon = xfs_scan_inode_extents(ctx, descr, fd); + if (!moveon) + goto out; + } else { + error = fstat64(fd, &fd_sb); + if (error) { + str_errno(ctx, descr); + goto out; + } + + /* Fall back to the FIEMAP scanner. */ + moveon = generic_scan_extents(ctx, descr, fd, &fd_sb, false); + if (!moveon) + goto out; + moveon = generic_scan_extents(ctx, descr, fd, &fd_sb, true); + if (!moveon) + goto out; + } + + if (S_ISDIR(bstat->bs_mode)) { + /* XXX: Some day, check dir -> child -> parent(dir) */ + + /* Check the directory entries. */ + moveon = generic_check_directory(ctx, descr, &fd); + if (!moveon) + goto out; + } + +out: + if (fd >= 0) + close(fd); + return moveon; +} + +/* Verify all the inodes in a filesystem. */ +static bool +xfs_scan_inodes( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + + if (!xctx->bulkstat) + return generic_scan_inodes(ctx); + + xctx->checked_xattrs = true; + return xfs_scan_all_inodes(ctx, xfs_scrub_inode, NULL); +} + +/* Phase 4 */ + +/* Check an inode's extents. */ +static bool +xfs_scan_extents( + struct scrub_ctx *ctx, + const char *descr, + int fd, + struct stat64 *sb, + bool attr_fork) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + + /* + * If we have bulkstat and either bmap or kernel scrubbing, + * we already checked the extents. + */ + if (xctx->bulkstat && (xctx->bmapx || xctx->kernel_scrub)) + return true; + + return generic_scan_extents(ctx, descr, fd, sb, attr_fork); +} + +/* Try to read all the extended attributes. */ +static bool +xfs_scan_xattrs( + struct scrub_ctx *ctx, + const char *descr, + int fd) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + + /* If we have bulkstat, we already checked the attributes. */ + if (xctx->bulkstat && xctx->checked_xattrs) + return true; + + return generic_scan_xattrs(ctx, descr, fd); +} + +/* Try to read all the extended attributes of things that have no fd. */ +static bool +xfs_scan_special_xattrs( + struct scrub_ctx *ctx, + const char *path) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + + /* If we have bulkstat, we already checked the attributes. */ + if (xctx->bulkstat && xctx->checked_xattrs) + return true; + + return generic_scan_special_xattrs(ctx, path); +} + +/* Traverse the directory tree. */ +static bool +xfs_scan_fs_tree( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + + /* If we have bulkstat, we already checked the attributes. */ + if (xctx->bulkstat && xctx->checked_xattrs) + return true; + + return generic_scan_fs_tree(ctx); +} + +/* Phase 5 */ + +/* Verify disk blocks with GETFSMAP */ + +struct xfs_verify_extent { + /* Maintain state for the lazy read verifier. */ + struct read_verify rv; + + /* Store bad extents if we don't have parent pointers. */ + struct extent_tree *d_bad; + struct extent_tree *r_bad; + + /* Track the last extent we saw. */ + uint64_t laststart; + uint64_t lastcount; + bool lastshared; +}; + +/* Report an IO error resulting from read-verify based off getfsmap. */ +static bool +xfs_check_rmap_error_report( + struct scrub_ctx *ctx, + const char *descr, + int idx, + struct getfsmap *map, + void *arg) +{ + const char *type; + struct xfs_scrub_ctx *xctx = ctx->priv; + char buf[32]; + uint64_t err_startblock = *(uint64_t *)arg; + uint64_t err_off; + + if (err_startblock > map->fmv_block) + err_off = err_startblock - map->fmv_block; + else + err_off = 0; + + snprintf(buf, 32, _("sector %llu"), map->fmv_block + err_off); + + if (map->fmv_oflags & FMV_OF_SPECIAL_OWNER) { + type = xfs_decode_special_owner(map->fmv_owner); + str_error(ctx, buf, +_("%s failed read verification."), + type); + } else if (xctx->parent_ptrs) { + /* XXX: go find the parent path */ + str_error(ctx, buf, +_("XXX: inode %lld offset %llu failed read verification."), + map->fmv_owner, map->fmv_offset + err_off); + } + return true; +} + +/* Handle a read error in the rmap-based read verify. */ +void +xfs_check_rmap_ioerr( + struct read_verify_pool *rvp, + struct disk *disk, + uint64_t startblock, + uint64_t blockcount, + int error, + void *arg) +{ + struct getfsmap keys[2]; + struct xfs_fsmap_iter xfi; + struct scrub_ctx *ctx = rvp->rvp_ctx; + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_verify_extent *ve; + struct extent_tree *tree; + dev_t dev; + bool moveon; + + ve = arg; + dev = xfs_disk_to_dev(xctx, disk); + + /* + * If we don't have parent pointers, save the bad extent for + * later rescanning. + */ + if (!xctx->parent_ptrs) { + if (dev == xctx->fsinfo.fs_datadev) + tree = ve->d_bad; + else if (dev == xctx->fsinfo.fs_rtdev) + tree = ve->r_bad; + else + tree = NULL; + if (tree) { + moveon = extent_tree_add(tree, startblock, blockcount); + if (!moveon) + str_errno(ctx, ctx->mntpoint); + } + } + + /* Go figure out which blocks are bad from the fsmap. */ + memset(keys, 0, sizeof(struct getfsmap) * 2); + keys->fmv_device = dev; + keys->fmv_block = startblock; + (keys + 1)->fmv_device = dev; + (keys + 1)->fmv_block = startblock + blockcount - 1; + (keys + 1)->fmv_owner = ULLONG_MAX; + (keys + 1)->fmv_offset = ULLONG_MAX; + (keys + 1)->fmv_oflags = UINT_MAX; + + xfi.fn = xfs_check_rmap_error_report; + xfi.arg = &startblock; + xfi.moveon = true; + xfs_iterate_fsmap(ctx, &xfi, 0, keys); +} + +/* Read verify a (data block) extent. */ +static bool +xfs_check_rmap( + struct scrub_ctx *ctx, + const char *descr, + int idx, + struct getfsmap *map, + void *arg) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_verify_extent *ve; + struct disk *disk; + uint64_t eofs; + uint64_t min_block; + bool badflags = false; + bool badmap = false; + + ve = ((struct xfs_verify_extent *)arg) + idx; + + dbg_printf("rmap dev %d:%d block %llu owner %lld offset %llu " + "len %llu flags 0x%x\n", major(map->fmv_device), + minor(map->fmv_device), map->fmv_block, + map->fmv_owner, map->fmv_offset, + map->fmv_length, map->fmv_oflags); + + /* If kernel already checked this... */ + if (xctx->kernel_scrub) + goto skip_check; + + if (map->fmv_device == xctx->fsinfo.fs_datadev) + eofs = xctx->geo.datablocks; + else if (map->fmv_device == xctx->fsinfo.fs_rtdev) + eofs = xctx->geo.rtblocks; + else if (map->fmv_device == xctx->fsinfo.fs_logdev) + eofs = xctx->geo.logblocks; + else + assert(0); + eofs <<= (xctx->blocklog - BBSHIFT); + + /* Don't go past EOFS */ + if (map->fmv_block >= eofs) { + badmap = true; + str_error(ctx, descr, +_("rmap (%llu/%llu/%llu) starts past end of filesystem at %llu."), + map->fmv_block, map->fmv_offset, + map->fmv_length, eofs); + } + + if (map->fmv_block + map->fmv_length < map->fmv_block || + map->fmv_block + map->fmv_length >= eofs) { + badmap = true; + str_error(ctx, descr, +_("rmap (%llu/%llu/%llu) ends past end of filesystem at %llu."), + map->fmv_block, map->fmv_offset, + map->fmv_length, eofs); + } + + /* Check for illegal overlapping. */ + if (ve->lastshared && (map->fmv_oflags & FMV_OF_SHARED)) + min_block = ve->laststart; + else + min_block = map->fmv_block < ve->laststart + ve->lastcount; + + if (map->fmv_block < min_block) { + badmap = true; + str_error(ctx, descr, +_("rmap (%llu/%llu/%llu) overlaps another rmap."), + map->fmv_block, map->fmv_offset, + map->fmv_length); + } + + /* can't have shared on non-reflink */ + if ((map->fmv_oflags & FMV_OF_SHARED) && + !(xctx->geo.flags & XFS_FSOP_GEOM_FLAGS_REFLINK)) + badflags = true; + + /* unwritten can't have any of the other flags */ + if ((map->fmv_oflags & FMV_OF_PREALLOC) && + (map->fmv_oflags & (FMV_OF_ATTR_FORK | FMV_OF_EXTENT_MAP | + FMV_OF_SHARED | FMV_OF_SPECIAL_OWNER))) + badflags = true; + + /* attr fork can't be shared or uwnritten or special */ + if ((map->fmv_oflags & FMV_OF_ATTR_FORK) && + (map->fmv_oflags & (FMV_OF_PREALLOC | FMV_OF_SHARED | + FMV_OF_SPECIAL_OWNER))) + badflags = true; + + /* extent maps can only have attrfork */ + if ((map->fmv_oflags & FMV_OF_EXTENT_MAP) && + (map->fmv_oflags & (FMV_OF_PREALLOC | FMV_OF_SHARED | + FMV_OF_SPECIAL_OWNER))) + badflags = true; + + /* shared maps can't have any of the other flags */ + if ((map->fmv_oflags & FMV_OF_SHARED) && + (map->fmv_oflags & (FMV_OF_PREALLOC | FMV_OF_ATTR_FORK | + FMV_OF_EXTENT_MAP | FMV_OF_SPECIAL_OWNER))) + + /* special owners can't have any of the other flags */ + if ((map->fmv_oflags & FMV_OF_SPECIAL_OWNER) && + (map->fmv_oflags & (FMV_OF_PREALLOC | FMV_OF_ATTR_FORK | + FMV_OF_EXTENT_MAP | FMV_OF_SHARED))) + badflags = true; + + if (badflags) { + badmap = true; + str_error(ctx, descr, +_("rmap (%llu/%llu/%llu) has conflicting flags 0x%x."), + map->fmv_block, map->fmv_offset, + map->fmv_length, map->fmv_oflags); + } + + /* If this rmap is suspect, don't bother verifying it. */ + if (badmap) + goto out; + +skip_check: + /* Remember this extent. */ + ve->lastshared = (map->fmv_oflags & FMV_OF_SHARED); + ve->laststart = map->fmv_block; + ve->lastcount = map->fmv_length; + + /* "Unknown" extents should be verified; they could be data. */ + if ((map->fmv_oflags & FMV_OF_SPECIAL_OWNER) && + map->fmv_owner == FMV_OWN_UNKNOWN) + map->fmv_oflags &= ~FMV_OF_SPECIAL_OWNER; + + /* + * We only care about read-verifying data extents that have been + * written to disk. This means we can skip "special" owners + * (metadata), xattr blocks, unwritten extents, and extent maps. + * These should all get checked elsewhere in the scrubber. + */ + if (map->fmv_oflags & (FMV_OF_PREALLOC | FMV_OF_ATTR_FORK | + FMV_OF_EXTENT_MAP | FMV_OF_SPECIAL_OWNER)) + goto out; + + /* XXX: Filter out directory data blocks. */ + + /* Schedule the read verify command for (eventual) running. */ + disk = xfs_dev_to_disk(xctx, map->fmv_device); + + read_verify_schedule(&xctx->rvp, &ve->rv, disk, map->fmv_block, + map->fmv_length, ve); + +out: + /* Is this the last extent? Fire off the read. */ + if (map->fmv_oflags & FMV_OF_LAST) + read_verify_force(&xctx->rvp, &ve->rv); + + return true; +} + +/* Verify all the blocks in a filesystem. */ +static bool +xfs_scan_rmaps( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + struct extent_tree d_bad; + struct extent_tree r_bad; + struct xfs_verify_extent *ve; + struct xfs_verify_extent *v; + int i; + bool moveon; + + /* + * Initialize our per-thread context. By convention, + * the log device comes first, then the rt device, and then + * the AGs. + */ + ve = calloc(xctx->geo.agcount + 2, sizeof(struct xfs_verify_extent)); + if (!ve) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + moveon = extent_tree_init(&d_bad); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_ve; + } + + moveon = extent_tree_init(&r_bad); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_dbad; + } + + for (i = 0, v = ve; i < xctx->geo.agcount + 2; i++, v++) { + v->d_bad = &d_bad; + v->r_bad = &r_bad; + } + + read_verify_pool_init(&xctx->rvp, ctx, ctx->readbuf, IO_MAX_SIZE, + xctx->geo.blocksize, xfs_check_rmap_ioerr, NULL, + scrub_nproc(ctx)); + moveon = xfs_scan_all_blocks(ctx, xfs_check_rmap, ve + 2); + if (!moveon) + goto out_pool; + + for (i = 0, v = ve; i < xctx->geo.agcount + 2; i++, v++) + read_verify_force(&xctx->rvp, &v->rv); + read_verify_pool_destroy(&xctx->rvp); + + /* Scan the whole dir tree to see what matches the bad extents. */ + if (!extent_tree_empty(&d_bad) || !extent_tree_empty(&r_bad)) + moveon = xfs_report_verify_errors(ctx, &d_bad, &r_bad); + + extent_tree_free(&r_bad); + extent_tree_free(&d_bad); + free(ve); + return moveon; + +out_pool: + read_verify_pool_destroy(&xctx->rvp); + extent_tree_free(&r_bad); +out_dbad: + extent_tree_free(&d_bad); +out_ve: + free(ve); + return moveon; +} + +/* Read-verify with BULKSTAT + GETBMAPX */ +struct xfs_verify_inode { + struct extent_tree d_good; + struct extent_tree r_good; + struct extent_tree *d_bad; + struct extent_tree *r_bad; +}; + +struct xfs_verify_submit { + struct read_verify_pool *rvp; + struct extent_tree *bad; + struct disk *disk; + struct read_verify rv; +}; + +/* Finish a inode block scan. */ +void +xfs_verify_inode_bmap_ioerr( + struct read_verify_pool *rvp, + struct disk *disk, + uint64_t startblock, + uint64_t blockcount, + int error, + void *arg) +{ + struct extent_tree *tree = arg; + + extent_tree_add(tree, startblock, blockcount); +} + +/* Scrub an inode extent and read-verify it. */ +bool +xfs_verify_inode_bmap( + struct scrub_ctx *ctx, + const char *descr, + int fd, + int whichfork, + struct fsxattr *fsx, + struct getbmapx *bmap, + void *arg) +{ + struct extent_tree *tree = arg; + + /* + * Only do data scrubbing if the extent is neither unwritten nor + * delalloc. + */ + if (bmap->bmv_oflags & (BMV_OF_PREALLOC | BMV_OF_DELALLOC)) + return true; + + return extent_tree_add(tree, bmap->bmv_block, bmap->bmv_length); +} + +/* Read-verify the data blocks of a file via BMAP. */ +static bool +xfs_verify_inode( + struct scrub_ctx *ctx, + xfs_agnumber_t agno, + struct xfs_handle *handle, + struct xfs_bstat *bstat, + void *arg) +{ + struct stat64 fd_sb; + struct xfs_bmap_iter xbi; + struct getbmapx key; + struct xfs_verify_inode *vi; + char descr[DESCR_BUFSZ]; + bool moveon = true; + int fd = -1; + int error; + + if (!S_ISREG(bstat->bs_mode)) + return true; + + snprintf(descr, DESCR_BUFSZ, _("inode %llu/%u"), bstat->bs_ino, + bstat->bs_gen); + + /* Try to open the inode to pin it. */ + fd = open_by_fshandle(handle, sizeof(*handle), + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) { + char buf[DESCR_BUFSZ]; + + str_warn(ctx, descr, "%s", strerror_r(errno, + buf, DESCR_BUFSZ)); + return true; + } + + if (arg) { + /* Use BMAPX */ + vi = ((struct xfs_verify_inode *)arg) + agno; + + xbi.moveon = true; + xbi.fn = xfs_verify_inode_bmap; + xbi.descr = descr; + if (bstat->bs_xflags & FS_XFLAG_REALTIME) + xbi.arg = &vi->r_good; + else + xbi.arg = &vi->d_good; + + /* data fork */ + memset(&key, 0, sizeof(key)); + key.bmv_length = ULLONG_MAX; + moveon = xfs_iterate_bmap(ctx, &xbi, fd, XFS_DATA_FORK, &key); + if (!moveon) + goto out; + moveon = xbi.moveon; + } else { + error = fstat64(fd, &fd_sb); + if (error) { + str_errno(ctx, descr); + goto out; + } + + /* Use generic_file_read */ + moveon = generic_read_file(ctx, descr, fd, &fd_sb); + } + +out: + if (fd >= 0) + close(fd); + return moveon; +} + +static bool +xfs_schedule_read_verify( + uint64_t start, + uint64_t length, + void *arg) +{ + struct xfs_verify_submit *rvs = arg; + + read_verify_schedule(rvs->rvp, &rvs->rv, rvs->disk, start, length, + rvs->bad); + return true; +} + +/* Verify all the file data in a filesystem. */ +static bool +xfs_verify_inodes( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + struct extent_tree d_good; + struct extent_tree d_bad; + struct extent_tree r_good; + struct extent_tree r_bad; + struct xfs_verify_inode *vi; + struct xfs_verify_inode *v; + struct xfs_verify_submit vs; + int i; + bool moveon; + + vi = calloc(xctx->geo.agcount, sizeof(struct xfs_verify_inode)); + if (!vi) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + moveon = extent_tree_init(&d_good); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_vi; + } + + moveon = extent_tree_init(&d_bad); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_dgood; + } + + moveon = extent_tree_init(&r_good); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_dbad; + } + + moveon = extent_tree_init(&r_bad); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_rgood; + } + + for (i = 0, v = vi; i < xctx->geo.agcount; i++, v++) { + v->d_bad = &d_bad; + v->r_bad = &r_bad; + + moveon = extent_tree_init(&v->d_good); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_varray; + } + + moveon = extent_tree_init(&v->r_good); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out_varray; + } + } + + /* Scan all the inodes for extent information. */ + moveon = xfs_scan_all_inodes(ctx, xfs_verify_inode, vi); + if (!moveon) + goto out_varray; + + /* Merge all the IOs. */ + for (i = 0, v = vi; i < xctx->geo.agcount; i++, v++) { + extent_tree_merge(&d_good, &v->d_good); + extent_tree_free(&v->d_good); + extent_tree_merge(&r_good, &v->r_good); + extent_tree_free(&v->r_good); + } + + /* Run all the IO in batches. */ + memset(&vs, 0, sizeof(struct xfs_verify_submit)); + vs.rvp = &xctx->rvp; + read_verify_pool_init(&xctx->rvp, ctx, ctx->readbuf, IO_MAX_SIZE, + xctx->geo.blocksize, xfs_verify_inode_bmap_ioerr, + NULL, scrub_nproc(ctx)); + vs.disk = &xctx->datadev; + vs.bad = &d_bad; + moveon = extent_tree_iterate(&d_good, xfs_schedule_read_verify, &vs); + if (!moveon) + goto out_pool; + vs.disk = &xctx->rtdev; + vs.bad = &r_bad; + moveon = extent_tree_iterate(&r_good, xfs_schedule_read_verify, &vs); + if (!moveon) + goto out_pool; + read_verify_force(&xctx->rvp, &vs.rv); + read_verify_pool_destroy(&xctx->rvp); + + /* Re-scan the file bmaps to see if they match the bad. */ + if (!extent_tree_empty(&d_bad) || !extent_tree_empty(&r_bad)) + moveon = xfs_report_verify_errors(ctx, &d_bad, &r_bad); + + goto out_varray; + +out_pool: + read_verify_pool_destroy(&xctx->rvp); +out_varray: + for (i = 0, v = vi; i < xctx->geo.agcount; i++, v++) { + extent_tree_free(&v->d_good); + extent_tree_free(&v->r_good); + } + extent_tree_free(&r_bad); +out_rgood: + extent_tree_free(&r_good); +out_dbad: + extent_tree_free(&d_bad); +out_dgood: + extent_tree_free(&d_good); +out_vi: + free(vi); + return moveon; +} + +/* Verify all the file data in a filesystem with the generic verifier. */ +static bool +xfs_verify_inodes_generic( + struct scrub_ctx *ctx) +{ + return xfs_scan_all_inodes(ctx, xfs_verify_inode, NULL); +} + +/* Scan all the blocks in a filesystem. */ +static bool +xfs_scan_blocks( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + + switch (xctx->data_scrubber) { + case DS_NOSCRUB: + return true; + case DS_READ: + return generic_scan_blocks(ctx); + case DS_BULKSTAT_READ: + return xfs_verify_inodes_generic(ctx); + case DS_BMAPX: + return xfs_verify_inodes(ctx); + case DS_FSMAP: + return xfs_scan_rmaps(ctx); + default: + assert(0); + } +} + +/* Read an entire file's data. */ +static bool +xfs_read_file( + struct scrub_ctx *ctx, + const char *descr, + int fd, + struct stat64 *sb) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + + if (xctx->data_scrubber != DS_READ) + return true; + + return generic_read_file(ctx, descr, fd, sb); +} + +/* Phase 6 */ + +struct xfs_summary_counts { + unsigned long long inodes; /* number of inodes */ + unsigned long long dblocks; /* data dev fsblocks */ + unsigned long long rblocks; /* rt dev fsblocks */ + unsigned long long next_dsect; /* next fs sector we see? */ + unsigned long long ag_owner; /* freespace blocks */ + struct extent_tree dext; /* data extent bitmap */ + struct extent_tree rext; /* rt extent bitmap */ +}; + +struct xfs_inode_fork_summary { + struct extent_tree *tree; + unsigned long long blocks; +}; + +/* Record data block extents in a bitmap. */ +bool +xfs_record_inode_summary_bmap( + struct scrub_ctx *ctx, + const char *descr, + int fd, + int whichfork, + struct fsxattr *fsx, + struct getbmapx *bmap, + void *arg) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_inode_fork_summary *ifs = arg; + int shift; + + shift = (xctx->blocklog - BBSHIFT); + extent_tree_add(ifs->tree, bmap->bmv_block >> shift, + bmap->bmv_length >> shift); + ifs->blocks += bmap->bmv_length >> shift; + return true; +} + +/* Record inode and block usage. */ +static bool +xfs_record_inode_summary( + struct scrub_ctx *ctx, + xfs_agnumber_t agno, + struct xfs_handle *handle, + struct xfs_bstat *bstat, + void *arg) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_summary_counts *counts; + struct xfs_bmap_iter xbi; + struct getbmapx key; + struct xfs_inode_fork_summary ifs; + unsigned long long rtblocks; + char descr[DESCR_BUFSZ]; + int fd; + bool moveon; + + counts = ((struct xfs_summary_counts *)arg) + agno; + counts->inodes++; + if (xctx->fsmap || bstat->bs_blocks == 0) + return true; + + if (!S_ISREG(bstat->bs_mode)) { + counts->dblocks += bstat->bs_blocks; + return true; + } + + /* Potentially a reflinked file, so collect the bitmap... */ + snprintf(descr, DESCR_BUFSZ, _("inode %llu/%u"), bstat->bs_ino, + bstat->bs_gen); + + /* Try to open the inode to pin it. */ + fd = open_by_fshandle(handle, sizeof(*handle), + O_RDONLY | O_NOATIME | O_NOFOLLOW | O_NOCTTY); + if (fd < 0) { + char buf[DESCR_BUFSZ]; + + str_warn(ctx, descr, "%s", strerror_r(errno, + buf, DESCR_BUFSZ)); + return true; + } + + xbi.moveon = true; + xbi.arg = &ifs; + xbi.fn = xfs_record_inode_summary_bmap; + xbi.descr = descr; + + /* data fork */ + memset(&key, 0, sizeof(key)); + key.bmv_length = ULLONG_MAX; + if (bstat->bs_xflags & FS_XFLAG_REALTIME) + ifs.tree = &counts->rext; + else + ifs.tree = &counts->dext; + ifs.blocks = 0; + moveon = xfs_iterate_bmap(ctx, &xbi, fd, XFS_DATA_FORK, &key); + if (!moveon) + goto out; + moveon = xbi.moveon; + rtblocks = (bstat->bs_xflags & FS_XFLAG_REALTIME) ? ifs.blocks : 0; + + /* attr fork */ + memset(&key, 0, sizeof(key)); + key.bmv_length = ULLONG_MAX; + ifs.tree = &counts->dext; + moveon = xfs_iterate_bmap(ctx, &xbi, fd, XFS_ATTR_FORK, &key); + if (!moveon) + goto out; + moveon = xbi.moveon; + + counts->dblocks += bstat->bs_blocks - rtblocks; + counts->rblocks += rtblocks; + +out: + if (fd >= 0) + close(fd); + return moveon; +} + +/* Record block usage. */ +static bool +xfs_record_block_summary( + struct scrub_ctx *ctx, + const char *descr, + int idx, + struct getfsmap *fsmap, + void *arg) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_summary_counts *counts; + unsigned long long len; + int shift; + + if (idx < -1) + return true; + if ((fsmap->fmv_oflags & FMV_OF_SPECIAL_OWNER) && + fsmap->fmv_owner == FMV_OWN_FREE) + return true; + + counts = ((struct xfs_summary_counts *)arg) + idx; + len = fsmap->fmv_length; + shift = xctx->blocklog - BBSHIFT; + + /* freesp btrees live in free space, need to adjust counters later. */ + if ((fsmap->fmv_oflags & FMV_OF_SPECIAL_OWNER) && + fsmap->fmv_owner == FMV_OWN_AG) { + counts->ag_owner += fsmap->fmv_length >> shift; + } + if (idx == -1) { + /* Count realtime extents. */ + counts->rblocks += fsmap->fmv_length >> shift; + } else { + /* Count data extents. */ + if (counts->next_dsect >= fsmap->fmv_block + fsmap->fmv_length) + return true; + else if (counts->next_dsect > fsmap->fmv_block) + len -= counts->next_dsect - fsmap->fmv_block; + + counts->dblocks += len >> shift; + counts->next_dsect = fsmap->fmv_block + fsmap->fmv_length; + } + + return true; +} + +/* Sum the blocks in each extent. */ +static bool +xfs_summary_count_helper( + uint64_t start, + uint64_t length, + void *arg) +{ + unsigned long long *count = arg; + + *count += length; + return true; +} + +/* Count all inodes and blocks in the filesystem, compare to superblock. */ +static bool +xfs_check_summary( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_ctx *xctx = ctx->priv; + struct xfs_fsop_counts fc; + struct xfs_fsop_resblks rb; + struct xfs_fsop_ag_resblks arb; + struct statvfs sfs; + struct xfs_summary_counts *summary; + unsigned long long fd; + unsigned long long fr; + unsigned long long fi; + unsigned long long sd; + unsigned long long sr; + unsigned long long si; + unsigned long long absdiff; + xfs_agnumber_t agno; + bool moveon; + bool complain; + int shift; + int error; + + if (!xctx->bulkstat) + return generic_check_summary(ctx); + + summary = calloc(xctx->geo.agcount + 2, + sizeof(struct xfs_summary_counts)); + if (!summary) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + /* Flush everything out to disk before we start counting. */ + error = syncfs(ctx->mnt_fd); + if (error) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + if (xctx->fsmap) { + /* Use fsmap to count blocks. */ + moveon = xfs_scan_all_blocks(ctx, xfs_record_block_summary, + summary + 2); + if (!moveon) + goto out; + } else { + /* Reflink w/o rmap; have to collect extents in a bitmap. */ + for (agno = 0; agno < xctx->geo.agcount + 2; agno++) { + moveon = extent_tree_init(&summary[agno].dext); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out; + } + moveon = extent_tree_init(&summary[agno].rext); + if (!moveon) { + str_errno(ctx, ctx->mntpoint); + goto out; + } + } + } + + /* Scan the whole fs. */ + moveon = xfs_scan_all_inodes(ctx, xfs_record_inode_summary, summary); + if (!moveon) + goto out; + + if (!xctx->fsmap && (xctx->geo.flags & XFS_FSOP_GEOM_FLAGS_REFLINK)) { + /* Reflink w/o rmap; merge the bitmaps. */ + for (agno = 1; agno < xctx->geo.agcount + 2; agno++) { + extent_tree_merge(&summary[0].dext, &summary[agno].dext); + extent_tree_free(&summary[agno].dext); + extent_tree_merge(&summary[0].rext, &summary[agno].rext); + extent_tree_free(&summary[agno].rext); + } + moveon = extent_tree_iterate(&summary[0].dext, + xfs_summary_count_helper, &summary[0].dblocks); + moveon = extent_tree_iterate(&summary[0].rext, + xfs_summary_count_helper, &summary[0].rblocks); + if (!moveon) + goto out; + } + + /* Sum the counts. */ + for (agno = 1; agno < xctx->geo.agcount + 2; agno++) { + summary[0].inodes += summary[agno].inodes; + summary[0].dblocks += summary[agno].dblocks; + summary[0].rblocks += summary[agno].rblocks; + summary[0].ag_owner += summary[agno].ag_owner; + } + + /* Account for an internal log, if present. */ + if (!xctx->fsmap && xctx->fsinfo.fs_log == NULL) + summary[0].dblocks += xctx->geo.logblocks; + + /* Account for hidden rt metadata inodes. */ + summary[0].inodes += 2; + if ((xctx->geo.flags & XFS_FSOP_GEOM_FLAGS_RMAPBT) && + xctx->geo.rtblocks > 0) + summary[0].inodes++; + + /* Fetch the filesystem counters. */ + error = xfsctl(NULL, ctx->mnt_fd, XFS_IOC_FSCOUNTS, &fc); + if (error) + str_errno(ctx, ctx->mntpoint); + + /* Grab the fstatvfs counters, since it has to report accurately. */ + error = fstatvfs(ctx->mnt_fd, &sfs); + if (error) { + str_errno(ctx, ctx->mntpoint); + return false; + } + + /* + * XFS reserves some blocks to prevent hard ENOSPC, so add those + * blocks back to the free data counts. + */ + error = xfsctl(NULL, ctx->mnt_fd, XFS_IOC_GET_RESBLKS, &rb); + if (error) + str_errno(ctx, ctx->mntpoint); + sfs.f_bfree += rb.resblks_avail; + + /* + * XFS with rmap or reflink reserves blocks in each AG to + * prevent the AG from running out of space for metadata blocks. + * Add those back to the free data counts. + */ + memset(&arb, 0, sizeof(arb)); + error = xfsctl(NULL, ctx->mnt_fd, XFS_IOC_GET_AG_RESBLKS, &arb); + if (error && errno != ENOTTY) + str_errno(ctx, ctx->mntpoint); + sfs.f_bfree += arb.resblks; + + /* + * If we counted blocks with fsmap, then dblocks includes + * blocks for the AGFL and the freespace/rmap btrees. The + * filesystem treats them as "free", but since we scanned + * them, we'll consider them used. + */ + sfs.f_bfree -= summary[0].ag_owner; + + /* Report on what we found. */ + shift = xctx->blocklog - (BBSHIFT + 1); + fd = (xctx->geo.datablocks - sfs.f_bfree) << shift; + fr = (xctx->geo.rtblocks - fc.freertx) << shift; + fi = sfs.f_files - sfs.f_ffree; + sd = summary[0].dblocks << shift; + sr = summary[0].rblocks << shift; + si = summary[0].inodes; + + /* + * Complain if the counts are off by more than 10% unless + * the inaccuracy is less than 32MB worth of blocks or 100 inodes. + */ + absdiff = 1 << (25 - xctx->blocklog); + complain = !within_range(ctx, sd, fd, absdiff, 1, 10, _("data blocks")); + complain |= !within_range(ctx, sr, fr, absdiff, 1, 10, _("realtime blocks")); + complain |= !within_range(ctx, si, fi, 100, 1, 10, _("inodes")); + + if (complain || verbose) { + double d, r, i; + char *du, *ru, *iu; + + if (fr || sr) { + d = auto_space_units(fd, &du); + r = auto_space_units(fr, &ru); + i = auto_units(fi, &iu); + printf( +_("%.1f%s data blocks used; %.1f%s rt blocks used; %.2f%s inodes used.\n"), + d, du, r, ru, i, iu); + d = auto_space_units(sd, &du); + r = auto_space_units(sr, &ru); + i = auto_units(si, &iu); + printf( +_("%.1f%s data blocks found; %.1f%s rt blocks found; %.2f%s inodes found.\n"), + d, du, r, ru, i, iu); + } else { + d = auto_space_units(fd, &du); + i = auto_units(fi, &iu); + printf( +_("%.1f%s data blocks used; %.1f%s inodes used.\n"), + d, du, i, iu); + d = auto_space_units(sd, &du); + i = auto_units(si, &iu); + printf( +_("%.1f%s data blocks found; %.1f%s inodes found.\n"), + d, du, i, iu); + } + } + moveon = true; + +out: + for (agno = 1; agno < xctx->geo.agcount + 2; agno++) { + extent_tree_free(&summary[agno].dext); + extent_tree_free(&summary[agno].rext); + } + free(summary); + return moveon; +} + +struct scrub_ops xfs_scrub_ops = { + .name = "xfs", + .cleanup = xfs_cleanup, + .scan_fs = xfs_scan_fs, + .scan_inodes = xfs_scan_inodes, + .check_dir = generic_check_dir, + .check_inode = generic_check_inode, + .scan_extents = xfs_scan_extents, + .scan_xattrs = xfs_scan_xattrs, + .scan_special_xattrs = xfs_scan_special_xattrs, + .scan_metadata = xfs_scan_metadata, + .check_summary = xfs_check_summary, + .scan_blocks = xfs_scan_blocks, + .read_file = xfs_read_file, + .scan_fs_tree = xfs_scan_fs_tree, +}; diff --git a/scrub/xfs_ioctl.c b/scrub/xfs_ioctl.c new file mode 100644 index 0000000..338b393 --- /dev/null +++ b/scrub/xfs_ioctl.c @@ -0,0 +1,465 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs.h" +#include +#include +#include +#include "disk.h" +#include "scrub.h" +#include "../repair/threads.h" +#include "handle.h" +#include "path.h" + +#include "xfs_ioctl.h" + +#define BSTATBUF_NR 1024 +#define FSMAP_NR 65536 +#define BMAP_NR 2048 + +/* Iterate a range of inodes. */ +bool +xfs_iterate_inodes( + struct scrub_ctx *ctx, + struct xfs_inode_iter *is, + xfs_agnumber_t agno, + void *fshandle, + uint64_t first_ino, + uint64_t last_ino) +{ + struct xfs_fsop_bulkreq bulkreq; + struct xfs_bstat *bstatbuf; + struct xfs_bstat *p; + struct xfs_bstat *endp; + struct xfs_handle handle; + __s32 buflenout = 0; + bool moveon = true; + int error; + + assert(!debug || !getenv("XFS_SCRUB_NO_BULKSTAT")); + + bstatbuf = calloc(BSTATBUF_NR, sizeof(struct xfs_bstat)); + if (!bstatbuf) + return false; + + memset(&bulkreq, 0, sizeof(bulkreq)); + bulkreq.lastip = (__u64 *)&first_ino; + bulkreq.icount = BSTATBUF_NR; + bulkreq.ubuffer = (void *)bstatbuf; + bulkreq.ocount = &buflenout; + + memcpy(&handle.ha_fsid, fshandle, sizeof(handle.ha_fsid)); + handle.ha_fid.fid_len = sizeof(xfs_fid_t) - + sizeof(handle.ha_fid.fid_len); + handle.ha_fid.fid_pad = 0; + while ((error = xfsctl(ctx->mntpoint, ctx->mnt_fd, XFS_IOC_FSBULKSTAT, + &bulkreq)) == 0) { + if (buflenout == 0) + break; + for (p = bstatbuf, endp = bstatbuf + buflenout; p < endp; p++) { + if (p->bs_ino > last_ino) + goto out; + + handle.ha_fid.fid_gen = p->bs_gen; + handle.ha_fid.fid_ino = p->bs_ino; + moveon = is->fn(ctx, agno, &handle, p, is->arg); + if (!moveon) + goto out; + } + } + + if (error) { + str_errno(ctx, ctx->mntpoint); + moveon = false; + } +out: + free(bstatbuf); + return moveon; +} + +/* Does the kernel support bulkstat? */ +bool +xfs_can_iterate_inodes( + struct scrub_ctx *ctx) +{ + struct xfs_fsop_bulkreq bulkreq; + __u64 lastino; + __s32 buflenout = 0; + int error; + + if (debug && getenv("XFS_SCRUB_NO_BULKSTAT")) + return false; + + lastino = 0; + memset(&bulkreq, 0, sizeof(bulkreq)); + bulkreq.lastip = (__u64 *)&lastino; + bulkreq.icount = 0; + bulkreq.ubuffer = NULL; + bulkreq.ocount = &buflenout; + + error = xfsctl(ctx->mntpoint, ctx->mnt_fd, XFS_IOC_FSBULKSTAT, + &bulkreq); + return error == -1 && errno == EINVAL; +} + +/* Iterate all the extent block mappings between the two keys. */ +bool +xfs_iterate_bmap( + struct scrub_ctx *ctx, + struct xfs_bmap_iter *xbi, + int fd, + int whichfork, + struct getbmapx *key) +{ + struct fsxattr fsx; + struct getbmapx *map; + struct getbmapx *p; + char descr[DESCR_BUFSZ]; + bool moveon = true; + xfs_off_t new_off; + int getxattr_type; + int i; + int error; + + assert (!debug || !getenv("XFS_SCRUB_NO_BMAP")); + + switch (whichfork) { + case XFS_ATTR_FORK: + snprintf(descr, DESCR_BUFSZ, _("%s attr"), xbi->descr); + break; + case XFS_COW_FORK: + snprintf(descr, DESCR_BUFSZ, _("%s CoW"), xbi->descr); + break; + case XFS_DATA_FORK: + snprintf(descr, DESCR_BUFSZ, _("%s data"), xbi->descr); + break; + default: + assert(0); + } + + map = calloc(BMAP_NR, sizeof(struct getbmapx)); + if (!map) { + str_errno(ctx, descr); + return false; + } + + memcpy(map, key, sizeof(struct getbmapx)); + map->bmv_count = BMAP_NR; + + map->bmv_iflags = BMV_IF_NO_DMAPI_READ | BMV_IF_PREALLOC | + BMV_OF_DELALLOC | BMV_IF_NO_HOLES; + switch (whichfork) { + case XFS_ATTR_FORK: + getxattr_type = XFS_IOC_FSGETXATTRA; + map->bmv_iflags |= BMV_IF_ATTRFORK; + break; + case XFS_COW_FORK: + map->bmv_iflags |= BMV_IF_COWFORK; + getxattr_type = XFS_IOC_FSGETXATTR; + break; + case XFS_DATA_FORK: + getxattr_type = XFS_IOC_FSGETXATTR; + break; + default: + assert(0); + } + + error = xfsctl("", fd, getxattr_type, &fsx); + if (error < 0) { + str_errno(ctx, descr); + moveon = false; + goto out; + } + + while ((error = xfsctl(descr, fd, XFS_IOC_GETBMAPX, map)) == 0) { + + for (i = 0, p = &map[i + 1]; i < map->bmv_entries; i++, p++) { + moveon = xbi->fn(ctx, descr, fd, whichfork, &fsx, + p, xbi->arg); + if (!moveon) + goto out; + } + + if (map->bmv_entries == 0) + break; + p = map + map->bmv_entries; + if (p->bmv_oflags & BMV_OF_LAST) + break; + + new_off = p->bmv_offset + p->bmv_length; + map->bmv_length -= new_off - map->bmv_offset; + map->bmv_offset = new_off; + } + + /* Pre-reflink filesystems don't know about CoW forks. */ + if (whichfork == XFS_COW_FORK && error && errno == EINVAL) + error = 0; + + if (error) + str_errno(ctx, descr); +out: + memcpy(key, map, sizeof(struct getbmapx)); + free(map); + return moveon; +} + +/* Does the kernel support getbmapx? */ +bool +xfs_can_iterate_bmap( + struct scrub_ctx *ctx) +{ + struct getbmapx bsm[2]; + int error; + + if (debug && getenv("XFS_SCRUB_NO_BMAP")) + return false; + + memset(bsm, 0, sizeof(struct getbmapx)); + bsm->bmv_length = ULLONG_MAX; + bsm->bmv_count = 2; + error = xfsctl(ctx->mntpoint, ctx->mnt_fd, XFS_IOC_GETBMAPX, bsm); + return error == 0; +} + +/* Iterate all the fs block mappings between the two keys. */ +bool +xfs_iterate_fsmap( + struct scrub_ctx *ctx, + struct xfs_fsmap_iter *xfi, + int idx, + struct getfsmap *keys) +{ + struct getfsmap *map; + struct getfsmap *p; + char descr[DESCR_BUFSZ]; + bool moveon = true; + int i; + int error; + + assert(!debug || !getenv("XFS_SCRUB_NO_FSMAP")); + + if (idx >= 0) + snprintf(descr, DESCR_BUFSZ, _("dev %d:%d AG %u fsmap"), + major(keys->fmv_device), + minor(keys->fmv_device), + idx); + else + snprintf(descr, DESCR_BUFSZ, _("dev %d:%d fsmap"), + major(keys->fmv_device), + minor(keys->fmv_device)); + + map = calloc(FSMAP_NR, sizeof(struct getfsmap)); + if (!map) { + str_errno(ctx, descr); + return false; + } + + memcpy(map, keys, sizeof(struct getfsmap) * 2); + map->fmv_count = FSMAP_NR; + + while ((error = xfsctl(ctx->mntpoint, ctx->mnt_fd, XFS_IOC_GETFSMAP, + map)) == 0) { + + for (i = 0, p = &map[i + 2]; i < map->fmv_entries; i++, p++) { + moveon = xfi->fn(ctx, descr, idx, p, xfi->arg); + if (!moveon) + goto out; + } + + if (map->fmv_entries == 0) + break; + p = map + 1 + map->fmv_entries; + if (p->fmv_oflags & FMV_OF_LAST) + break; + + map->fmv_device = p->fmv_device; + map->fmv_block = p->fmv_block; + map->fmv_owner = p->fmv_owner; + map->fmv_offset = p->fmv_offset; + map->fmv_oflags = p->fmv_oflags; + map->fmv_length = p->fmv_length; + } + + if (error) { + str_errno(ctx, descr); + moveon = false; + } +out: + memcpy(keys, map, sizeof(struct getfsmap) * 2); + free(map); + return moveon; +} + +/* Does the kernel support getfsmap? */ +bool +xfs_can_iterate_fsmap( + struct scrub_ctx *ctx) +{ + struct getfsmap fsm[3]; + int error; + + if (debug && getenv("XFS_SCRUB_NO_FSMAP")) + return false; + + memset(fsm, 0, 2 * sizeof(struct getfsmap)); + (fsm + 1)->fmv_device = UINT_MAX; + (fsm + 1)->fmv_block = ULLONG_MAX; + (fsm + 1)->fmv_owner = ULLONG_MAX; + (fsm + 1)->fmv_offset = ULLONG_MAX; + fsm->fmv_count = 3; + error = xfsctl(ctx->mntpoint, ctx->mnt_fd, XFS_IOC_GETFSMAP, fsm); + return error == 0 && (fsm->fmv_oflags & FMV_HOF_DEV_T); +} + +/* These must correspond to XFS_SCRUB_TYPE_ */ +static const struct scrub_descr scrubbers[] = { + {"superblock", ST_PERAG}, + {"AG free header", ST_PERAG}, + {"AG free list", ST_PERAG}, + {"AG inode header", ST_PERAG}, + {"freesp by block btree", ST_PERAG}, + {"freesp by length btree", ST_PERAG}, + {"inode btree", ST_PERAG}, + {"free inode btree", ST_PERAG}, + {"reverse mapping btree", ST_PERAG}, + {"reference count btree", ST_PERAG}, + {"inode", ST_INODE}, + {"inode data block map", ST_INODE}, + {"inode attr block map", ST_INODE}, + {"inode CoW block map", ST_INODE}, + {"realtime bitmap", ST_FS}, + {"realtime summary", ST_FS}, + {"realtime reverse mapping btree", ST_FS}, +}; + +/* Scrub each AG's metadata btrees. */ +bool +xfs_scrub_ag_metadata( + struct scrub_ctx *ctx, + xfs_agnumber_t agno, + void *arg) +{ + const struct scrub_descr *scrubber; + char buf[DESCR_BUFSZ]; + struct xfs_scrub_metadata meta; + int type; + int error; + + assert(!debug || !getenv("XFS_SCRUB_NO_KERNEL")); + + memset(&meta, 0, sizeof(meta)); + meta.control = agno; + for (type = 0, scrubber = scrubbers; + type <= XFS_SCRUB_TYPE_MAX; + type++, scrubber++) { + if (scrubber->type != ST_PERAG) + continue; + snprintf(buf, DESCR_BUFSZ, _("AG %d %s"), agno, + _(scrubber->name)); + if (debug) + printf(_("Scrubbing %s.\n"), buf); + meta.type = type; + error = ioctl(ctx->mnt_fd, XFS_IOC_SCRUB_METADATA, &meta); + if (error && errno != ENOENT) + str_errno(ctx, buf); + } + + return true; +} + +/* Scrub whole-FS metadata btrees. */ +bool +xfs_scrub_fs_metadata( + struct scrub_ctx *ctx, + void *arg) +{ + const struct scrub_descr *scrubber; + char buf[DESCR_BUFSZ]; + struct xfs_scrub_metadata meta; + int type; + int error; + + assert(!debug || !getenv("XFS_SCRUB_NO_KERNEL")); + + memset(&meta, 0, sizeof(meta)); + for (type = 0, scrubber = scrubbers; + type <= XFS_SCRUB_TYPE_MAX; + type++, scrubber++) { + if (scrubber->type != ST_FS) + continue; + snprintf(buf, DESCR_BUFSZ, _("%s"), _(scrubber->name)); + if (debug) + printf(_("Scrubbing %s.\n"), buf); + meta.type = type; + error = ioctl(ctx->mnt_fd, XFS_IOC_SCRUB_METADATA, &meta); + if (error && errno != ENOENT) + str_errno(ctx, buf); + } + + return true; +} + +/* Scrub inode metadata btrees. */ +bool +xfs_scrub_inode_metadata( + struct scrub_ctx *ctx, + uint64_t ino, + int fd) +{ + const struct scrub_descr *scrubber; + char buf[DESCR_BUFSZ]; + struct xfs_scrub_metadata meta; + int type; + int error; + + assert(!debug || !getenv("XFS_SCRUB_NO_KERNEL")); + + memset(&meta, 0, sizeof(meta)); + for (type = 0, scrubber = scrubbers; + type <= XFS_SCRUB_TYPE_MAX; + type++, scrubber++) { + if (scrubber->type != ST_INODE) + continue; + snprintf(buf, DESCR_BUFSZ, _("inode %"PRIu64" %s"), + ino, _(scrubber->name)); + meta.type = type; + error = xfsctl("", fd, XFS_IOC_SCRUB_METADATA, &meta); + if (error && errno != ENOENT) + str_errno(ctx, buf); + } + + return true; +} + +/* Test the availability of the kernel scrub ioctl. */ +bool +xfs_can_scrub_metadata( + struct scrub_ctx *ctx) +{ + struct xfs_scrub_metadata meta; + int error; + + if (debug && getenv("XFS_SCRUB_NO_KERNEL")) + return false; + + memset(&meta, 0xFF, sizeof(meta)); + error = xfsctl(ctx->mntpoint, ctx->mnt_fd, XFS_IOC_SCRUB_METADATA, + &meta); + return error == -1 && errno == EINVAL; +} diff --git a/scrub/xfs_ioctl.h b/scrub/xfs_ioctl.h new file mode 100644 index 0000000..54645bb --- /dev/null +++ b/scrub/xfs_ioctl.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef XFS_IOCTL_H_ +#define XFS_IOCTL_H_ + +struct xfs_inode_iter { + /* Iterator function and arg. */ + bool (*fn)(struct scrub_ctx *, xfs_agnumber_t, + struct xfs_handle *, + struct xfs_bstat *, void *); + void *arg; + + /* Should we keep scanning? */ + bool moveon; +}; + +bool xfs_iterate_inodes(struct scrub_ctx *ctx, struct xfs_inode_iter *is, + xfs_agnumber_t agno, void *fshandle, uint64_t first_ino, + uint64_t last_ino); +bool xfs_can_iterate_inodes(struct scrub_ctx *ctx); + +struct xfs_bmap_iter { + /* Iterator function and arg. */ + bool (*fn)(struct scrub_ctx *, const char *, + int, int, struct fsxattr *, + struct getbmapx *, void *); + void *arg; + + /* Description of the file descriptor. */ + const char *descr; + + /* Should we keep scanning? */ + bool moveon; +}; + +bool xfs_iterate_bmap(struct scrub_ctx *ctx, struct xfs_bmap_iter *xbi, + int fd, int whichfork, struct getbmapx *key); +bool xfs_can_iterate_bmap(struct scrub_ctx *ctx); + +struct xfs_fsmap_iter { + /* Iterator function and arg. */ + bool (*fn)(struct scrub_ctx *, const char *, + int, struct getfsmap *, void *); + void *arg; + + /* Should we keep scanning? */ + bool moveon; +}; + +bool xfs_iterate_fsmap(struct scrub_ctx *ctx, struct xfs_fsmap_iter *xfi, + int idx, struct getfsmap *keys); +bool xfs_can_iterate_fsmap(struct scrub_ctx *ctx); + +/* Type info and names for the scrub types. */ +enum scrub_type { + ST_NONE, /* disabled */ + ST_PERAG, /* per-AG metadata */ + ST_FS, /* per-FS metadata */ + ST_INODE, /* per-inode metadata */ +}; +struct scrub_descr { + const char *name; + enum scrub_type type; +}; + +bool xfs_scrub_ag_metadata(struct scrub_ctx *ctx, xfs_agnumber_t agno, + void *arg); +bool xfs_scrub_fs_metadata(struct scrub_ctx *ctx, void *arg); +bool xfs_scrub_inode_metadata(struct scrub_ctx *ctx, uint64_t ino, int fd); +bool xfs_can_scrub_metadata(struct scrub_ctx *ctx); + +#endif /* XFS_IOCTL_H_ */ From darrick.wong@oracle.com Thu Aug 25 18:58:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B68B883B8 for ; Thu, 25 Aug 2016 18:58:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B0D08F8033 for ; Thu, 25 Aug 2016 16:58:35 -0700 (PDT) X-ASG-Debug-ID: 1472169513-0bf57c55b31c8310001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HK4T6vu5V7Qlvyak (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:58:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNwVnG031027 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:58:32 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNwV16009417 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:58:31 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNwV7q003898; Thu, 25 Aug 2016 23:58:31 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:58:30 -0700 Subject: [PATCH v8 00/29] xfsprogs: add realtime reverse-mapping support From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v8 00/29] xfsprogs: add realtime reverse-mapping support To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:58:29 -0700 Message-ID: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169513 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1916 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi all, This is the eighth revision of a patchset that adds to XFS kernel support for mapping multiple file logical blocks to the same physical block (reflink/deduplication), implements the beginnings of online metadata scrubbing and preening, and implements reverse mapping for the realtime device. There shouldn't be any incompatible on-disk format changes, pending a thorough review of the patches within. At the beginning of this series are imports of all the kernel patches against libxfs/ that are needed to provide refcount btrees and reflink support. Please note that these patches /do/ have diffs against files in the libxfs/ directory (mostly for deferred ops) that do not start with 'xfs_', so the libxfs-apply script cannot be used in isolation. Following that are fixes against db, io, repair, and mkfs to deal with the realtime reverse mapping btree. The repair changes are minimal here, since we can largely take advantage of the existing code in repair to track and rebuild reverse mapping btrees. If you're going to start using this mess, you probably ought to just pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], xfs-docs[4], and man-pages[5]. The kernel patches in the git trees should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to master. The patches have been xfstested with x64, ppc64, and armhf; all tests in the clone and rmap groups pass. AFAICT they don't cause any new failures for the 'auto' group. This is an extraordinary way to eat your data. Enjoy! Comments and questions are, as always, welcome. --D [1] https://github.com/djwong/linux/tree/djwong-devel [2] https://github.com/djwong/xfsprogs/tree/djwong-devel [3] https://github.com/djwong/xfstests/tree/djwong-devel [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel [5] https://github.com/djwong/man-pages/tree/djwong-devel From darrick.wong@oracle.com Thu Aug 25 18:58:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9031E81A7 for ; Thu, 25 Aug 2016 18:58:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 446068F8033 for ; Thu, 25 Aug 2016 16:58:43 -0700 (PDT) X-ASG-Debug-ID: 1472169520-0bf8155c771e9850001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id P26ZrVIMioMFEWTM (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:58:41 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNwdCp004580 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:58:39 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNwc6W005529 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:58:39 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNwbw2003927; Thu, 25 Aug 2016 23:58:37 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:58:36 -0700 Subject: [PATCH 01/29] xfs: refactor long-format btree header verification routines From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 01/29] xfs: refactor long-format btree header verification routines To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:58:35 -0700 Message-ID: <147216951556.7022.6116664987210622262.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169520 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4449 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create two helper functions to verify the headers of a long format btree block. We'll use this later for the realtime rmapbt. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap_btree.c | 22 ++-------------------- libxfs/xfs_btree.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_btree.h | 3 +++ 3 files changed, 52 insertions(+), 20 deletions(-) diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 54306b1..72a6390 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -674,17 +674,11 @@ xfs_bmbt_verify( switch (block->bb_magic) { case cpu_to_be32(XFS_BMAP_CRC_MAGIC): - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return false; - if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)) - return false; - if (be64_to_cpu(block->bb_u.l.bb_blkno) != bp->b_bn) - return false; /* * XXX: need a better way of verifying the owner here. Right now * just make sure there has been one set. */ - if (be64_to_cpu(block->bb_u.l.bb_owner) == 0) + if (!xfs_btree_lblock_v5hdr_verify(bp, XFS_RMAP_OWN_UNKNOWN)) return false; /* fall through */ case cpu_to_be32(XFS_BMAP_MAGIC): @@ -703,20 +697,8 @@ xfs_bmbt_verify( level = be16_to_cpu(block->bb_level); if (level > max(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1])) return false; - if (be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) - return false; - - /* sibling pointer verification */ - if (!block->bb_u.l.bb_leftsib || - (block->bb_u.l.bb_leftsib != cpu_to_be64(NULLFSBLOCK) && - !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib)))) - return false; - if (!block->bb_u.l.bb_rightsib || - (block->bb_u.l.bb_rightsib != cpu_to_be64(NULLFSBLOCK) && - !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib)))) - return false; - return true; + return xfs_btree_lblock_verify(bp, mp->m_bmap_dmxr[level != 0]); } static void diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index ad205c0..df28812 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -4453,6 +4453,53 @@ xfs_btree_change_owner( &bbcoi); } +/* Verify the v5 fields of a long-format btree block. */ +bool +xfs_btree_lblock_v5hdr_verify( + struct xfs_buf *bp, + __uint64_t owner) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)) + return false; + if (block->bb_u.l.bb_blkno != cpu_to_be64(bp->b_bn)) + return false; + if (owner != XFS_RMAP_OWN_UNKNOWN && + be64_to_cpu(block->bb_u.l.bb_owner) != owner) + return false; + return true; +} + +/* Verify a long-format btree block. */ +bool +xfs_btree_lblock_verify( + struct xfs_buf *bp, + unsigned int max_recs) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + + /* numrecs verification */ + if (be16_to_cpu(block->bb_numrecs) > max_recs) + return false; + + /* sibling pointer verification */ + if (!block->bb_u.l.bb_leftsib || + (block->bb_u.l.bb_leftsib != cpu_to_be64(NULLFSBLOCK) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib)))) + return false; + if (!block->bb_u.l.bb_rightsib || + (block->bb_u.l.bb_rightsib != cpu_to_be64(NULLFSBLOCK) && + !XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib)))) + return false; + + return true; +} + /** * xfs_btree_sblock_v5hdr_verify() -- verify the v5 fields of a short-format * btree block diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index f81b2a8..a7770dd 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -513,6 +513,9 @@ static inline int xfs_btree_get_level(struct xfs_btree_block *block) bool xfs_btree_sblock_v5hdr_verify(struct xfs_buf *bp); bool xfs_btree_sblock_verify(struct xfs_buf *bp, unsigned int max_recs); +bool xfs_btree_lblock_v5hdr_verify(struct xfs_buf *bp, __uint64_t owner); +bool xfs_btree_lblock_verify(struct xfs_buf *bp, unsigned int max_recs); + uint xfs_btree_compute_maxlevels(struct xfs_mount *mp, uint *limits, unsigned long len); xfs_extlen_t xfs_btree_calc_size(struct xfs_mount *mp, uint *limits, From darrick.wong@oracle.com Thu Aug 25 18:58:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 780B1829C for ; Thu, 25 Aug 2016 18:58:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4A8058F8033 for ; Thu, 25 Aug 2016 16:58:52 -0700 (PDT) X-ASG-Debug-ID: 1472169529-0bf57b5314209eb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id NCG6zCoQJArpeqHU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:58:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNwmTd031207 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:58:48 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNwmN2020489 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:58:48 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNwlJY005470; Thu, 25 Aug 2016 23:58:48 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:58:47 -0700 Subject: [PATCH 02/29] xfs: make iroot_realloc a btree function From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 02/29] xfs: make iroot_realloc a btree function To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:58:41 -0700 Message-ID: <147216952177.7022.17225150968813335512.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169529 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14284 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines For btrees that are rooted in the inode core, we have to have a function to resize the root. This is fairly specific to each btree type, so make xfs_iroot_realloc a per-btree function. Signed-off-by: Darrick J. Wong --- libxfs/xfs_bmap.c | 6 +- libxfs/xfs_bmap_btree.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_bmap_btree.h | 3 + libxfs/xfs_btree.c | 12 +--- libxfs/xfs_btree.h | 7 ++ libxfs/xfs_inode_fork.c | 129 -------------------------------------------- libxfs/xfs_inode_fork.h | 1 7 files changed, 156 insertions(+), 141 deletions(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 4721cff..f6820c6 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -663,7 +663,7 @@ xfs_bmap_btree_to_extents( xfs_trans_binval(tp, cbp); if (cur->bc_bufs[0] == cbp) cur->bc_bufs[0] = NULL; - xfs_iroot_realloc(ip, -1, whichfork); + xfs_bmbt_iroot_realloc(ip, -1, whichfork); ASSERT(ifp->if_broot == NULL); ASSERT((ifp->if_flags & XFS_IFBROOT) == 0); XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); @@ -709,7 +709,7 @@ xfs_bmap_extents_to_btree( /* * Make space in the inode incore. */ - xfs_iroot_realloc(ip, 1, whichfork); + xfs_bmbt_iroot_realloc(ip, 1, whichfork); ifp->if_flags |= XFS_IFBROOT; /* @@ -756,7 +756,7 @@ try_another_ag: args.wasdel = wasdel; *logflagsp = 0; if ((error = xfs_alloc_vextent(&args))) { - xfs_iroot_realloc(ip, -1, whichfork); + xfs_bmbt_iroot_realloc(ip, -1, whichfork); xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); return error; } diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 72a6390..60969f3 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -664,6 +664,144 @@ xfs_bmbt_diff_two_keys( be64_to_cpu(k2->bmbt.br_startoff); } +/* + * Reallocate the space for if_broot based on the number of records + * being added or deleted as indicated in rec_diff. Move the records + * and pointers in if_broot to fit the new size. When shrinking this + * will eliminate holes between the records and pointers created by + * the caller. When growing this will create holes to be filled in + * by the caller. + * + * The caller must not request to add more records than would fit in + * the on-disk inode root. If the if_broot is currently NULL, then + * if we are adding records, one will be allocated. The caller must also + * not request that the number of records go below zero, although + * it can go to zero. + * + * ip -- the inode whose if_broot area is changing + * ext_diff -- the change in the number of records, positive or negative, + * requested for the if_broot array. + */ +void +xfs_bmbt_iroot_realloc( + struct xfs_inode *ip, + int rec_diff, + int whichfork) +{ + struct xfs_mount *mp = ip->i_mount; + int cur_max; + struct xfs_ifork *ifp; + struct xfs_btree_block *new_broot; + int new_max; + size_t new_size; + char *np; + char *op; + + /* + * Handle the degenerate case quietly. + */ + if (rec_diff == 0) { + return; + } + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (rec_diff > 0) { + /* + * If there wasn't any memory allocated before, just + * allocate it now and get out. + */ + if (ifp->if_broot_bytes == 0) { + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); + ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); + ifp->if_broot_bytes = (int)new_size; + return; + } + + /* + * If there is already an existing if_broot, then we need + * to realloc() it and shift the pointers to their new + * location. The records don't change location because + * they are kept butted up against the btree block header. + */ + cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); + new_max = cur_max + rec_diff; + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); + ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, + KM_SLEEP | KM_NOFS); + op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + ifp->if_broot_bytes); + np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + (int)new_size); + ifp->if_broot_bytes = (int)new_size; + ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + memmove(np, op, cur_max * (uint)sizeof(xfs_fsblock_t)); + return; + } + + /* + * rec_diff is less than 0. In this case, we are shrinking the + * if_broot buffer. It must already exist. If we go to zero + * records, just get rid of the root and clear the status bit. + */ + ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); + cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); + new_max = cur_max + rec_diff; + ASSERT(new_max >= 0); + if (new_max > 0) + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); + else + new_size = 0; + if (new_size > 0) { + new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); + /* + * First copy over the btree block header. + */ + memcpy(new_broot, ifp->if_broot, + XFS_BMBT_BLOCK_LEN(ip->i_mount)); + } else { + new_broot = NULL; + ifp->if_flags &= ~XFS_IFBROOT; + } + + /* + * Only copy the records and pointers if there are any. + */ + if (new_max > 0) { + /* + * First copy the records. + */ + op = (char *)XFS_BMBT_REC_ADDR(mp, ifp->if_broot, 1); + np = (char *)XFS_BMBT_REC_ADDR(mp, new_broot, 1); + memcpy(np, op, new_max * (uint)sizeof(xfs_bmbt_rec_t)); + + /* + * Then copy the pointers. + */ + op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + ifp->if_broot_bytes); + np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1, + (int)new_size); + memcpy(np, op, new_max * (uint)sizeof(xfs_fsblock_t)); + } + kmem_free(ifp->if_broot); + ifp->if_broot = new_broot; + ifp->if_broot_bytes = (int)new_size; + if (ifp->if_broot) + ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + return; +} + +STATIC void +__xfs_bmbt_iroot_realloc( + struct xfs_btree_cur *cur, + int rec_diff) +{ + return xfs_bmbt_iroot_realloc(cur->bc_private.b.ip, rec_diff, + cur->bc_private.b.whichfork); +} + static bool xfs_bmbt_verify( struct xfs_buf *bp) @@ -775,6 +913,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .key_diff = xfs_bmbt_key_diff, .diff_two_keys = xfs_bmbt_diff_two_keys, .buf_ops = &xfs_bmbt_buf_ops, + .iroot_realloc = __xfs_bmbt_iroot_realloc, .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, }; diff --git a/libxfs/xfs_bmap_btree.h b/libxfs/xfs_bmap_btree.h index 819a8a4..843e25e 100644 --- a/libxfs/xfs_bmap_btree.h +++ b/libxfs/xfs_bmap_btree.h @@ -140,4 +140,7 @@ extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip, extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); +extern void xfs_bmbt_iroot_realloc(struct xfs_inode *ip, int rec_diff, + int whichfork); + #endif /* __XFS_BMAP_BTREE_H__ */ diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index df28812..0fdbe78 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -2989,9 +2989,7 @@ xfs_btree_new_iroot( #endif xfs_btree_copy_ptrs(cur, pp, &nptr, 1); - xfs_iroot_realloc(cur->bc_private.b.ip, - 1 - xfs_btree_get_numrecs(cblock), - cur->bc_private.b.whichfork); + cur->bc_ops->iroot_realloc(cur, 1 - xfs_btree_get_numrecs(cblock)); xfs_btree_setbuf(cur, level, cbp); @@ -3166,7 +3164,7 @@ xfs_btree_make_block_unfull( if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) { /* A root block that can be made bigger. */ - xfs_iroot_realloc(ip, 1, cur->bc_private.b.whichfork); + cur->bc_ops->iroot_realloc(cur, 1); *stat = 1; } else { /* A root block that needs replacing */ @@ -3585,8 +3583,7 @@ xfs_btree_kill_iroot( index = numrecs - cur->bc_ops->get_maxrecs(cur, level); if (index) { - xfs_iroot_realloc(cur->bc_private.b.ip, index, - cur->bc_private.b.whichfork); + cur->bc_ops->iroot_realloc(cur, index); block = ifp->if_broot; } @@ -3800,8 +3797,7 @@ xfs_btree_delrec( */ if (level == cur->bc_nlevels - 1) { if (cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) { - xfs_iroot_realloc(cur->bc_private.b.ip, -1, - cur->bc_private.b.whichfork); + cur->bc_ops->iroot_realloc(cur, -1); error = xfs_btree_kill_iroot(cur); if (error) diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index a7770dd..ea15b1e 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -195,6 +195,13 @@ struct xfs_btree_ops { union xfs_btree_key *key1, union xfs_btree_key *key2); + /* + * Reallocate the space for if_broot based on the number of records + * being added or deleted as indicated in rec_diff. + */ + void (*iroot_realloc)(struct xfs_btree_cur *cur, + int rec_diff); + const struct xfs_buf_ops *buf_ops; /* check that k1 is lower than k2 */ diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index e65f633..6ed0254 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -504,135 +504,6 @@ xfs_iread_extents( xfs_validate_extents(ifp, nextents, XFS_EXTFMT_INODE(ip)); return 0; } -/* - * Reallocate the space for if_broot based on the number of records - * being added or deleted as indicated in rec_diff. Move the records - * and pointers in if_broot to fit the new size. When shrinking this - * will eliminate holes between the records and pointers created by - * the caller. When growing this will create holes to be filled in - * by the caller. - * - * The caller must not request to add more records than would fit in - * the on-disk inode root. If the if_broot is currently NULL, then - * if we are adding records, one will be allocated. The caller must also - * not request that the number of records go below zero, although - * it can go to zero. - * - * ip -- the inode whose if_broot area is changing - * ext_diff -- the change in the number of records, positive or negative, - * requested for the if_broot array. - */ -void -xfs_iroot_realloc( - xfs_inode_t *ip, - int rec_diff, - int whichfork) -{ - struct xfs_mount *mp = ip->i_mount; - int cur_max; - xfs_ifork_t *ifp; - struct xfs_btree_block *new_broot; - int new_max; - size_t new_size; - char *np; - char *op; - - /* - * Handle the degenerate case quietly. - */ - if (rec_diff == 0) { - return; - } - - ifp = XFS_IFORK_PTR(ip, whichfork); - if (rec_diff > 0) { - /* - * If there wasn't any memory allocated before, just - * allocate it now and get out. - */ - if (ifp->if_broot_bytes == 0) { - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); - ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); - ifp->if_broot_bytes = (int)new_size; - return; - } - - /* - * If there is already an existing if_broot, then we need - * to realloc() it and shift the pointers to their new - * location. The records don't change location because - * they are kept butted up against the btree block header. - */ - cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); - new_max = cur_max + rec_diff; - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); - ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, - KM_SLEEP | KM_NOFS); - op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - ifp->if_broot_bytes); - np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - (int)new_size); - ifp->if_broot_bytes = (int)new_size; - ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= - XFS_IFORK_SIZE(ip, whichfork)); - memmove(np, op, cur_max * (uint)sizeof(xfs_fsblock_t)); - return; - } - - /* - * rec_diff is less than 0. In this case, we are shrinking the - * if_broot buffer. It must already exist. If we go to zero - * records, just get rid of the root and clear the status bit. - */ - ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); - cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); - new_max = cur_max + rec_diff; - ASSERT(new_max >= 0); - if (new_max > 0) - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); - else - new_size = 0; - if (new_size > 0) { - new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); - /* - * First copy over the btree block header. - */ - memcpy(new_broot, ifp->if_broot, - XFS_BMBT_BLOCK_LEN(ip->i_mount)); - } else { - new_broot = NULL; - ifp->if_flags &= ~XFS_IFBROOT; - } - - /* - * Only copy the records and pointers if there are any. - */ - if (new_max > 0) { - /* - * First copy the records. - */ - op = (char *)XFS_BMBT_REC_ADDR(mp, ifp->if_broot, 1); - np = (char *)XFS_BMBT_REC_ADDR(mp, new_broot, 1); - memcpy(np, op, new_max * (uint)sizeof(xfs_bmbt_rec_t)); - - /* - * Then copy the pointers. - */ - op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - ifp->if_broot_bytes); - np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1, - (int)new_size); - memcpy(np, op, new_max * (uint)sizeof(xfs_fsblock_t)); - } - kmem_free(ifp->if_broot); - ifp->if_broot = new_broot; - ifp->if_broot_bytes = (int)new_size; - if (ifp->if_broot) - ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= - XFS_IFORK_SIZE(ip, whichfork)); - return; -} - /* * This is called when the amount of space needed for if_data diff --git a/libxfs/xfs_inode_fork.h b/libxfs/xfs_inode_fork.h index 44d38eb..ecdf665 100644 --- a/libxfs/xfs_inode_fork.h +++ b/libxfs/xfs_inode_fork.h @@ -144,7 +144,6 @@ void xfs_iflush_fork(struct xfs_inode *, struct xfs_dinode *, struct xfs_inode_log_item *, int); void xfs_idestroy_fork(struct xfs_inode *, int); void xfs_idata_realloc(struct xfs_inode *, int, int); -void xfs_iroot_realloc(struct xfs_inode *, int, int); int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); int xfs_iextents_copy(struct xfs_inode *, struct xfs_bmbt_rec *, int); From darrick.wong@oracle.com Thu Aug 25 18:59:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8D1C583D0 for ; Thu, 25 Aug 2016 18:59:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 24BC5304043 for ; Thu, 25 Aug 2016 16:59:02 -0700 (PDT) X-ASG-Debug-ID: 1472169539-0bf8155c751e98e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 1agNBmMjDE0D169i (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:58:59 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNwvMJ031310 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:58:58 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNwv7o006219 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:58:57 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNwufF025792; Thu, 25 Aug 2016 23:58:57 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:58:56 -0700 Subject: [PATCH 03/29] xfs: support storing records in the inode core root From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 03/29] xfs: support storing records in the inode core root To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:58:52 -0700 Message-ID: <147216953246.7022.3740454279098105542.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169539 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 11053 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make it so that we can actually store btree records in the inode core (i.e. enable bb_level == 0) so that the rtrmapbt can do this. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 201 +++++++++++++++++++++++++++++++++++++++------------- libxfs/xfs_btree.h | 1 2 files changed, 150 insertions(+), 52 deletions(-) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 0fdbe78..26b8e62 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -153,6 +153,11 @@ xfs_btree_check_block( int level, /* level of the btree block */ struct xfs_buf *bp) /* buffer containing block, if any */ { + /* Don't check the inode-core root. */ + if ((cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) && + level == cur->bc_nlevels - 1) + return 0; + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) return xfs_btree_check_lblock(cur, block, level, bp); else @@ -1416,10 +1421,15 @@ xfs_btree_log_recs( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); - xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); - xfs_trans_log_buf(cur->bc_tp, bp, - xfs_btree_rec_offset(cur, first), - xfs_btree_rec_offset(cur, last + 1) - 1); + if (bp) { + xfs_trans_buf_set_type(cur->bc_tp, bp, XFS_BLFT_BTREE_BUF); + xfs_trans_log_buf(cur->bc_tp, bp, + xfs_btree_rec_offset(cur, first), + xfs_btree_rec_offset(cur, last + 1) - 1); + } else { + xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, + xfs_ilog_fbroot(cur->bc_private.b.whichfork)); + } XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); } @@ -2917,8 +2927,11 @@ xfs_btree_new_iroot( struct xfs_btree_block *cblock; /* child btree block */ union xfs_btree_key *ckp; /* child key pointer */ union xfs_btree_ptr *cpp; /* child ptr pointer */ + union xfs_btree_rec *crp; union xfs_btree_key *kp; /* pointer to btree key */ union xfs_btree_ptr *pp; /* pointer to block addr */ + union xfs_btree_rec *rp; + union xfs_btree_ptr aptr; union xfs_btree_ptr nptr; /* new block addr */ int level; /* btree level */ int error; /* error return code */ @@ -2934,10 +2947,15 @@ xfs_btree_new_iroot( level = cur->bc_nlevels - 1; block = xfs_btree_get_iroot(cur); - pp = xfs_btree_ptr_addr(cur, 1, block); + ASSERT(level > 0 || (cur->bc_flags & XFS_BTREE_IROOT_RECORDS)); + if (level > 0) + aptr = *xfs_btree_ptr_addr(cur, 1, block); + else + aptr.l = cpu_to_be64(XFS_INO_TO_FSB(cur->bc_mp, + cur->bc_private.b.ip->i_ino)); /* Allocate the new block. If we can't do it, we're toast. Give up. */ - error = cur->bc_ops->alloc_block(cur, pp, &nptr, stat); + error = cur->bc_ops->alloc_block(cur, &aptr, &nptr, stat); if (error) goto error0; if (*stat == 0) { @@ -2963,43 +2981,93 @@ xfs_btree_new_iroot( cblock->bb_u.s.bb_blkno = cpu_to_be64(cbp->b_bn); } - be16_add_cpu(&block->bb_level, 1); xfs_btree_set_numrecs(block, 1); cur->bc_nlevels++; cur->bc_ptrs[level + 1] = 1; - kp = xfs_btree_key_addr(cur, 1, block); - ckp = xfs_btree_key_addr(cur, 1, cblock); - xfs_btree_copy_keys(cur, ckp, kp, xfs_btree_get_numrecs(cblock)); + if (level > 0) { + /* + * We already incremented nlevels, so we have to do the + * same to bb_level or else pp will be calculated with the + * maxrecs for regular blocks and point at the wrong place. + */ + be16_add_cpu(&block->bb_level, 1); + + kp = xfs_btree_key_addr(cur, 1, block); + ckp = xfs_btree_key_addr(cur, 1, cblock); + xfs_btree_copy_keys(cur, ckp, kp, + xfs_btree_get_numrecs(cblock)); - cpp = xfs_btree_ptr_addr(cur, 1, cblock); + pp = xfs_btree_ptr_addr(cur, 1, block); + cpp = xfs_btree_ptr_addr(cur, 1, cblock); #ifdef DEBUG - for (i = 0; i < be16_to_cpu(cblock->bb_numrecs); i++) { - error = xfs_btree_check_ptr(cur, pp, i, level); - if (error) - goto error0; - } + for (i = 0; i < be16_to_cpu(cblock->bb_numrecs); i++) { + error = xfs_btree_check_ptr(cur, pp, i, level); + if (error) + goto error0; + } #endif - xfs_btree_copy_ptrs(cur, cpp, pp, xfs_btree_get_numrecs(cblock)); + xfs_btree_copy_ptrs(cur, cpp, pp, + xfs_btree_get_numrecs(cblock)); #ifdef DEBUG - error = xfs_btree_check_ptr(cur, &nptr, 0, level); - if (error) - goto error0; + error = xfs_btree_check_ptr(cur, &nptr, 0, level); + if (error) + goto error0; #endif - xfs_btree_copy_ptrs(cur, pp, &nptr, 1); + xfs_btree_copy_ptrs(cur, pp, &nptr, 1); - cur->bc_ops->iroot_realloc(cur, 1 - xfs_btree_get_numrecs(cblock)); + cur->bc_ops->iroot_realloc(cur, + 1 - xfs_btree_get_numrecs(cblock)); + block = xfs_btree_get_iroot(cur); - xfs_btree_setbuf(cur, level, cbp); + xfs_btree_setbuf(cur, level, cbp); - /* - * Do all this logging at the end so that - * the root is at the right level. - */ - xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); - xfs_btree_log_keys(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); - xfs_btree_log_ptrs(cur, cbp, 1, be16_to_cpu(cblock->bb_numrecs)); + /* + * Do all this logging at the end so that + * the root is at the right level. + */ + xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); + xfs_btree_log_keys(cur, cbp, 1, + be16_to_cpu(cblock->bb_numrecs)); + xfs_btree_log_ptrs(cur, cbp, 1, + be16_to_cpu(cblock->bb_numrecs)); + } else { + rp = xfs_btree_rec_addr(cur, 1, block); + crp = xfs_btree_rec_addr(cur, 1, cblock); + xfs_btree_copy_recs(cur, crp, rp, + xfs_btree_get_numrecs(cblock)); + + /* + * Trickery here: The number of records we think we have + * changes when we convert a leaf to a node. Therefore, + * set the length to zero, increment the level, and set + * the length to 1 record. + */ + cur->bc_ops->iroot_realloc(cur, -xfs_btree_get_numrecs(cblock)); + block = xfs_btree_get_iroot(cur); + be16_add_cpu(&block->bb_level, 1); + cur->bc_ops->iroot_realloc(cur, 1); + block = xfs_btree_get_iroot(cur); + + /* Copy pointer into the block. */ + xfs_btree_copy_ptrs(cur, xfs_btree_ptr_addr(cur, 1, block), + &nptr, 1); + + xfs_btree_setbuf(cur, level, cbp); + + /* + * Do all this logging at the end so that + * the root is at the right level. + */ + xfs_btree_log_block(cur, cbp, XFS_BB_ALL_BITS); + xfs_btree_log_recs(cur, cbp, 1, + be16_to_cpu(cblock->bb_numrecs)); + + /* Write the new keys into the root block. */ + } + /* Get the keys for the new block and put them into the root. */ + xfs_btree_get_keys(cur, cblock, xfs_btree_key_addr(cur, 1, block)); *logflags |= XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork); @@ -3522,15 +3590,15 @@ STATIC int xfs_btree_kill_iroot( struct xfs_btree_cur *cur) { - int whichfork = cur->bc_private.b.whichfork; struct xfs_inode *ip = cur->bc_private.b.ip; - struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); struct xfs_btree_block *block; struct xfs_btree_block *cblock; union xfs_btree_key *kp; union xfs_btree_key *ckp; union xfs_btree_ptr *pp; union xfs_btree_ptr *cpp; + union xfs_btree_rec *rp; + union xfs_btree_rec *crp; struct xfs_buf *cbp; int level; int index; @@ -3544,14 +3612,19 @@ xfs_btree_kill_iroot( XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); - ASSERT(cur->bc_nlevels > 1); + ASSERT((cur->bc_flags & XFS_BTREE_IROOT_RECORDS) || + cur->bc_nlevels > 1); /* * Don't deal with the root block needs to be a leaf case. * We're just going to turn the thing back into extents anyway. */ level = cur->bc_nlevels - 1; - if (level == 1) + if (level == 1 && !(cur->bc_flags & XFS_BTREE_IROOT_RECORDS)) + goto out0; + + /* If we're already a leaf, jump out. */ + if (level == 0) goto out0; /* @@ -3582,30 +3655,55 @@ xfs_btree_kill_iroot( #endif index = numrecs - cur->bc_ops->get_maxrecs(cur, level); - if (index) { - cur->bc_ops->iroot_realloc(cur, index); - block = ifp->if_broot; - } - be16_add_cpu(&block->bb_numrecs, index); ASSERT(block->bb_numrecs == cblock->bb_numrecs); - kp = xfs_btree_key_addr(cur, 1, block); - ckp = xfs_btree_key_addr(cur, 1, cblock); - xfs_btree_copy_keys(cur, kp, ckp, numrecs); + if (be16_to_cpu(cblock->bb_level) > 0) { + if (index) { + cur->bc_ops->iroot_realloc(cur, index); + block = xfs_btree_get_iroot(cur); + } + + kp = xfs_btree_key_addr(cur, 1, block); + ckp = xfs_btree_key_addr(cur, 1, cblock); + xfs_btree_copy_keys(cur, kp, ckp, numrecs); - pp = xfs_btree_ptr_addr(cur, 1, block); - cpp = xfs_btree_ptr_addr(cur, 1, cblock); + pp = xfs_btree_ptr_addr(cur, 1, block); + cpp = xfs_btree_ptr_addr(cur, 1, cblock); #ifdef DEBUG - for (i = 0; i < numrecs; i++) { - error = xfs_btree_check_ptr(cur, cpp, i, level - 1); - if (error) { - XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); - return error; + for (i = 0; i < numrecs; i++) { + error = xfs_btree_check_ptr(cur, cpp, i, level - 1); + if (error) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; + } } - } #endif - xfs_btree_copy_ptrs(cur, pp, cpp, numrecs); + xfs_btree_copy_ptrs(cur, pp, cpp, numrecs); + /* + * Decrement the (root) block's level after copying the + * pointers or else pp will be calculated using maxrecs + * for a regular block and won't point to the right place. + * Notice how we don't adjust nlevels until later. + */ + be16_add_cpu(&block->bb_level, -1); + } else { + /* + * Trickery here: The number of records we think we have + * changes when we convert a leaf to a node. Therefore, + * set the length to zero, change the level, and set + * the length to however many records we're getting. + */ + cur->bc_ops->iroot_realloc(cur, -xfs_btree_get_numrecs(block)); + block = xfs_btree_get_iroot(cur); + be16_add_cpu(&block->bb_level, -1); + cur->bc_ops->iroot_realloc(cur, numrecs); + block = xfs_btree_get_iroot(cur); + + rp = xfs_btree_rec_addr(cur, 1, block); + crp = xfs_btree_rec_addr(cur, 1, cblock); + xfs_btree_copy_recs(cur, rp, crp, numrecs); + } error = xfs_btree_free_block(cur, cbp); if (error) { @@ -3614,7 +3712,6 @@ xfs_btree_kill_iroot( } cur->bc_bufs[level - 1] = NULL; - be16_add_cpu(&block->bb_level, -1); xfs_trans_log_inode(cur->bc_tp, ip, XFS_ILOG_CORE | xfs_ilog_fbroot(cur->bc_private.b.whichfork)); cur->bc_nlevels--; diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index ea15b1e..8918b81 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -284,6 +284,7 @@ typedef struct xfs_btree_cur #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ #define XFS_BTREE_CRC_BLOCKS (1<<3) /* uses extended btree blocks */ #define XFS_BTREE_OVERLAPPING (1<<4) /* overlapping intervals */ +#define XFS_BTREE_IROOT_RECORDS (1<<5) /* iroot can store records */ #define XFS_BTREE_NOERROR 0 From darrick.wong@oracle.com Thu Aug 25 18:59:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A001183DD for ; Thu, 25 Aug 2016 18:59:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0361EAC003 for ; Thu, 25 Aug 2016 16:59:08 -0700 (PDT) X-ASG-Debug-ID: 1472169545-0bf57c55b11c8350001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id fzGP7c4YBFqJQpVf (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:06 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNx4A7005101 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:59:04 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNx4ck017103 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:04 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNx35R022403; Thu, 25 Aug 2016 23:59:04 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:02 -0700 Subject: [PATCH 04/29] xfs: widen xfs_refcount_irec fields to handle realtime rmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 04/29] xfs: widen xfs_refcount_irec fields to handle realtime rmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:01 -0700 Message-ID: <147216954146.7022.15337347958538680244.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169546 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 10973 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Change the startblock and blockcount fields of xfs_refcount_irec to be 64 bits wide. This enables us to use the same high level rmap code for either tree. We'll also collect all the resulting breakage fixes here. Signed-off-by: Darrick J. Wong --- libxfs/xfs_format.h | 4 ++-- libxfs/xfs_rmap.c | 58 ++++++++++++++++++++++++++------------------------- libxfs/xfs_rmap.h | 20 +++++++++--------- repair/rmap.c | 26 +++++++++++------------ 4 files changed, 54 insertions(+), 54 deletions(-) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index ed36809..c336f7a 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1436,8 +1436,8 @@ struct xfs_rmap_rec { XFS_RMAP_BMBT_BLOCK) #define XFS_RMAP_REC_FLAGS (XFS_RMAP_UNWRITTEN) struct xfs_rmap_irec { - xfs_agblock_t rm_startblock; /* extent start block */ - xfs_extlen_t rm_blockcount; /* extent length */ + xfs_fsblock_t rm_startblock; /* extent start block */ + xfs_filblks_t rm_blockcount; /* extent length */ __uint64_t rm_owner; /* extent owner */ __uint64_t rm_offset; /* offset within the owner */ unsigned int rm_flags; /* state flags */ diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index 62096cd..5f84f20 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -44,8 +44,8 @@ int xfs_rmap_lookup_le( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags, @@ -66,8 +66,8 @@ xfs_rmap_lookup_le( int xfs_rmap_lookup_eq( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags, @@ -113,8 +113,8 @@ xfs_rmap_update( int xfs_rmap_insert( struct xfs_btree_cur *rcur, - xfs_agblock_t agbno, - xfs_extlen_t len, + xfs_fsblock_t agbno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags) @@ -149,8 +149,8 @@ done: STATIC int xfs_rmap_delete( struct xfs_btree_cur *rcur, - xfs_agblock_t agbno, - xfs_extlen_t len, + xfs_fsblock_t agbno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags) @@ -250,7 +250,7 @@ xfs_rmap_find_left_neighbor_helper( int xfs_rmap_find_left_neighbor( struct xfs_btree_cur *cur, - xfs_agblock_t bno, + xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, @@ -328,7 +328,7 @@ xfs_rmap_lookup_le_range_helper( int xfs_rmap_lookup_le_range( struct xfs_btree_cur *cur, - xfs_agblock_t bno, + xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, @@ -385,8 +385,8 @@ xfs_rmap_lookup_le_range( STATIC int xfs_rmap_unmap( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -526,7 +526,7 @@ xfs_rmap_unmap( * Result: |rrrrr| |rrrr| * bno len */ - xfs_extlen_t orig_len = ltrec.rm_blockcount; + xfs_filblks_t orig_len = ltrec.rm_blockcount; ltrec.rm_blockcount = bno - ltrec.rm_startblock; error = xfs_rmap_update(cur, <rec); @@ -636,8 +636,8 @@ xfs_rmap_is_mergeable( STATIC int xfs_rmap_map( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -860,8 +860,8 @@ out_error: STATIC int xfs_rmap_convert( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -1285,8 +1285,8 @@ done: STATIC int xfs_rmap_convert_shared( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -1672,8 +1672,8 @@ done: STATIC int xfs_rmap_unmap_shared( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -1790,7 +1790,7 @@ xfs_rmap_unmap_shared( * Result: |rrrrr| |rrrr| * bno len */ - xfs_extlen_t orig_len = ltrec.rm_blockcount; + xfs_filblks_t orig_len = ltrec.rm_blockcount; /* Shrink the left side of the rmap */ error = xfs_rmap_lookup_eq(cur, ltrec.rm_startblock, @@ -1834,8 +1834,8 @@ out_error: STATIC int xfs_rmap_map_shared( struct xfs_btree_cur *cur, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, bool unwritten, struct xfs_owner_info *oinfo) { @@ -2060,7 +2060,7 @@ xfs_rmap_finish_one( int error = 0; xfs_agnumber_t agno; struct xfs_owner_info oinfo; - xfs_agblock_t bno; + xfs_fsblock_t bno; bool unwritten; agno = XFS_FSB_TO_AGNO(mp, startblock); @@ -2249,8 +2249,8 @@ xfs_rmap_alloc_extent( struct xfs_mount *mp, struct xfs_defer_ops *dfops, xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, __uint64_t owner) { struct xfs_bmbt_irec bmap; @@ -2273,8 +2273,8 @@ xfs_rmap_free_extent( struct xfs_mount *mp, struct xfs_defer_ops *dfops, xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len, + xfs_fsblock_t bno, + xfs_filblks_t len, __uint64_t owner) { struct xfs_bmbt_irec bmap; diff --git a/libxfs/xfs_rmap.h b/libxfs/xfs_rmap.h index c5c5817..06f7e73 100644 --- a/libxfs/xfs_rmap.h +++ b/libxfs/xfs_rmap.h @@ -142,14 +142,14 @@ int xfs_rmap_free(struct xfs_trans *tp, struct xfs_buf *agbp, xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, struct xfs_owner_info *oinfo); -int xfs_rmap_lookup_le(struct xfs_btree_cur *cur, xfs_agblock_t bno, - xfs_extlen_t len, uint64_t owner, uint64_t offset, +int xfs_rmap_lookup_le(struct xfs_btree_cur *cur, xfs_fsblock_t bno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags, int *stat); -int xfs_rmap_lookup_eq(struct xfs_btree_cur *cur, xfs_agblock_t bno, - xfs_extlen_t len, uint64_t owner, uint64_t offset, +int xfs_rmap_lookup_eq(struct xfs_btree_cur *cur, xfs_fsblock_t bno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags, int *stat); -int xfs_rmap_insert(struct xfs_btree_cur *rcur, xfs_agblock_t agbno, - xfs_extlen_t len, uint64_t owner, uint64_t offset, +int xfs_rmap_insert(struct xfs_btree_cur *rcur, xfs_fsblock_t agbno, + xfs_filblks_t len, uint64_t owner, uint64_t offset, unsigned int flags); int xfs_rmap_get_rec(struct xfs_btree_cur *cur, struct xfs_rmap_irec *irec, int *stat); @@ -193,10 +193,10 @@ int xfs_rmap_convert_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, struct xfs_inode *ip, int whichfork, struct xfs_bmbt_irec *imap); int xfs_rmap_alloc_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, - xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, + xfs_agnumber_t agno, xfs_fsblock_t bno, xfs_filblks_t len, __uint64_t owner); int xfs_rmap_free_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, - xfs_agnumber_t agno, xfs_agblock_t bno, xfs_extlen_t len, + xfs_agnumber_t agno, xfs_fsblock_t bno, xfs_filblks_t len, __uint64_t owner); void xfs_rmap_finish_one_cleanup(struct xfs_trans *tp, @@ -206,10 +206,10 @@ int xfs_rmap_finish_one(struct xfs_trans *tp, enum xfs_rmap_intent_type type, xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, struct xfs_btree_cur **pcur); -int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno, +int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, struct xfs_rmap_irec *irec, int *stat); -int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno, +int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, struct xfs_rmap_irec *irec, int *stat); union xfs_btree_rec; diff --git a/repair/rmap.c b/repair/rmap.c index 597655b..3b3a195 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -1025,12 +1025,12 @@ rmaps_verify_btree( } if (!have) { do_warn( -_("Missing reverse-mapping record for (%u/%u) %slen %u owner %"PRId64" \ +_("Missing reverse-mapping record for (%u/%llu) %slen %llu owner %"PRId64" \ %s%soff %"PRIu64"\n"), - agno, rm_rec->rm_startblock, + agno, (unsigned long long)rm_rec->rm_startblock, (rm_rec->rm_flags & XFS_RMAP_UNWRITTEN) ? _("unwritten ") : "", - rm_rec->rm_blockcount, + (unsigned long long)rm_rec->rm_blockcount, rm_rec->rm_owner, (rm_rec->rm_flags & XFS_RMAP_ATTR_FORK) ? _("attr ") : "", @@ -1043,22 +1043,22 @@ _("Missing reverse-mapping record for (%u/%u) %slen %u owner %"PRId64" \ /* Compare each refcount observation against the btree's */ if (!rmap_is_good(rm_rec, &tmp)) { do_warn( -_("Incorrect reverse-mapping: saw (%u/%u) %slen %u owner %"PRId64" %s%soff \ -%"PRIu64"; should be (%u/%u) %slen %u owner %"PRId64" %s%soff %"PRIu64"\n"), - agno, tmp.rm_startblock, +_("Incorrect reverse-mapping: saw (%u/%llu) %slen %llu owner %"PRId64" %s%soff \ +%"PRIu64"; should be (%u/%llu) %slen %llu owner %"PRId64" %s%soff %"PRIu64"\n"), + agno, (unsigned long long)tmp.rm_startblock, (tmp.rm_flags & XFS_RMAP_UNWRITTEN) ? _("unwritten ") : "", - tmp.rm_blockcount, + (unsigned long long)tmp.rm_blockcount, tmp.rm_owner, (tmp.rm_flags & XFS_RMAP_ATTR_FORK) ? _("attr ") : "", (tmp.rm_flags & XFS_RMAP_BMBT_BLOCK) ? _("bmbt ") : "", tmp.rm_offset, - agno, rm_rec->rm_startblock, + agno, (unsigned long long)rm_rec->rm_startblock, (rm_rec->rm_flags & XFS_RMAP_UNWRITTEN) ? _("unwritten ") : "", - rm_rec->rm_blockcount, + (unsigned long long)rm_rec->rm_blockcount, rm_rec->rm_owner, (rm_rec->rm_flags & XFS_RMAP_ATTR_FORK) ? _("attr ") : "", @@ -1091,7 +1091,6 @@ rmap_diffkeys( { __u64 oa; __u64 ob; - __int64_t d; struct xfs_rmap_irec tmp; tmp = *kp1; @@ -1101,9 +1100,10 @@ rmap_diffkeys( tmp.rm_flags &= ~XFS_RMAP_REC_FLAGS; ob = libxfs_rmap_irec_offset_pack(&tmp); - d = (__int64_t)kp1->rm_startblock - kp2->rm_startblock; - if (d) - return d; + if (kp1->rm_startblock > kp2->rm_startblock) + return 1; + else if (kp2->rm_startblock > kp1->rm_startblock) + return -1; if (kp1->rm_owner > kp2->rm_owner) return 1; From darrick.wong@oracle.com Thu Aug 25 18:59:14 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2C18383E5 for ; Thu, 25 Aug 2016 18:59:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E654E8F8033 for ; Thu, 25 Aug 2016 16:59:13 -0700 (PDT) X-ASG-Debug-ID: 1472169551-0bf57c55b31c8360001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 3TezpKWpXZFF3VDx (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:12 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNxALO031648 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:59:10 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNx9EX017334 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:59:10 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNx9sX005685; Thu, 25 Aug 2016 23:59:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:09 -0700 Subject: [PATCH 05/29] xfs: introduce realtime rmap btree definitions From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 05/29] xfs: introduce realtime rmap btree definitions To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:07 -0700 Message-ID: <147216954775.7022.2077331517114167698.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169552 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3381 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add new realtime rmap btree definitions. The realtime rmap btree will be rooted from a hidden inode, but has its own shape and therefore needs to have most of its own separate types. Signed-off-by: Darrick J. Wong --- libxfs/xfs_btree.c | 4 ++-- libxfs/xfs_btree.h | 3 +++ libxfs/xfs_format.h | 7 +++++++ libxfs/xfs_types.h | 3 ++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 26b8e62..53f6192 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -41,10 +41,10 @@ kmem_zone_t *xfs_btree_cur_zone; */ static const __uint32_t xfs_magics[2][XFS_BTNUM_MAX] = { { XFS_ABTB_MAGIC, XFS_ABTC_MAGIC, 0, XFS_BMAP_MAGIC, XFS_IBT_MAGIC, - XFS_FIBT_MAGIC, 0 }, + XFS_FIBT_MAGIC, 0, 0 }, { XFS_ABTB_CRC_MAGIC, XFS_ABTC_CRC_MAGIC, XFS_RMAP_CRC_MAGIC, XFS_BMAP_CRC_MAGIC, XFS_IBT_CRC_MAGIC, XFS_FIBT_CRC_MAGIC, - XFS_REFC_CRC_MAGIC } + XFS_REFC_CRC_MAGIC, XFS_RTRMAP_CRC_MAGIC } }; #define xfs_btree_magic(cur) \ xfs_magics[!!((cur)->bc_flags & XFS_BTREE_CRC_BLOCKS)][cur->bc_btnum] diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index 8918b81..8913ffa 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -75,6 +75,7 @@ union xfs_btree_rec { #define XFS_BTNUM_FINO ((xfs_btnum_t)XFS_BTNUM_FINOi) #define XFS_BTNUM_RMAP ((xfs_btnum_t)XFS_BTNUM_RMAPi) #define XFS_BTNUM_REFC ((xfs_btnum_t)XFS_BTNUM_REFCi) +#define XFS_BTNUM_RTRMAP ((xfs_btnum_t)XFS_BTNUM_RTRMAPi) /* * For logging record fields. @@ -107,6 +108,7 @@ do { \ case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_INC(__mp, bmbt, stat); break; \ case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(__mp, ibt, stat); break; \ case XFS_BTNUM_FINO: __XFS_BTREE_STATS_INC(__mp, fibt, stat); break; \ + case XFS_BTNUM_RTRMAP: /* pass-through */ \ case XFS_BTNUM_RMAP: __XFS_BTREE_STATS_INC(__mp, rmap, stat); break; \ case XFS_BTNUM_REFC: __XFS_BTREE_STATS_INC(__mp, refcbt, stat); break; \ case XFS_BTNUM_MAX: ASSERT(0); __mp = __mp /* fucking gcc */ ; break; \ @@ -129,6 +131,7 @@ do { \ __XFS_BTREE_STATS_ADD(__mp, ibt, stat, val); break; \ case XFS_BTNUM_FINO: \ __XFS_BTREE_STATS_ADD(__mp, fibt, stat, val); break; \ + case XFS_BTNUM_RTRMAP: /* pass-through */ \ case XFS_BTNUM_RMAP: \ __XFS_BTREE_STATS_ADD(__mp, rmap, stat, val); break; \ case XFS_BTNUM_REFC: \ diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index c336f7a..ae2d958 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1463,6 +1463,13 @@ typedef __be32 xfs_rmap_ptr_t; XFS_IBT_BLOCK(mp) + 1) /* + * Realtime Reverse mapping btree format definitions + * + * There is a btree for the reverse map per allocation group + */ +#define XFS_RTRMAP_CRC_MAGIC 0x4d415052 /* 'MAPR' */ + +/* * Reference Count Btree format definitions * */ diff --git a/libxfs/xfs_types.h b/libxfs/xfs_types.h index cf044c0..749aa83 100644 --- a/libxfs/xfs_types.h +++ b/libxfs/xfs_types.h @@ -113,7 +113,8 @@ typedef enum { typedef enum { XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_RMAPi, XFS_BTNUM_BMAPi, - XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_REFCi, XFS_BTNUM_MAX + XFS_BTNUM_INOi, XFS_BTNUM_FINOi, XFS_BTNUM_REFCi, XFS_BTNUM_RTRMAPi, + XFS_BTNUM_MAX } xfs_btnum_t; struct xfs_name { From darrick.wong@oracle.com Thu Aug 25 18:59:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9FAFF83ED for ; Thu, 25 Aug 2016 18:59:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 730C4304039 for ; Thu, 25 Aug 2016 16:59:20 -0700 (PDT) X-ASG-Debug-ID: 1472169557-0bf57b5312209ec0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id DyzJe9X6umk6Op3P (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:18 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNxGHX005278 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:59:16 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7PNxGoI017561 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:59:16 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNxFWV025837; Thu, 25 Aug 2016 23:59:15 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:15 -0700 Subject: [PATCH 06/29] xfs: define the on-disk realtime rmap btree format From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 06/29] xfs: define the on-disk realtime rmap btree format To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:13 -0700 Message-ID: <147216955390.7022.6251644339676538537.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169558 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16173 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Start filling out the rtrmap btree implementation. Start with the on-disk btree format; add everything needed to read, write and manipulate rmap btree blocks. This prepares the way for connecting the btree operations implementation. Signed-off-by: Darrick J. Wong --- include/libxfs.h | 1 include/xfs_mount.h | 3 + libxfs/Makefile | 2 libxfs/init.c | 2 libxfs/xfs_btree.c | 1 libxfs/xfs_btree.h | 3 + libxfs/xfs_format.h | 48 +++++++++++ libxfs/xfs_rtrmap_btree.c | 195 +++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_rtrmap_btree.h | 62 ++++++++++++++ libxfs/xfs_sb.c | 6 + libxfs/xfs_shared.h | 1 11 files changed, 324 insertions(+) create mode 100644 libxfs/xfs_rtrmap_btree.c create mode 100644 libxfs/xfs_rtrmap_btree.h diff --git a/include/libxfs.h b/include/libxfs.h index e5e1523..60a90dc 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -78,6 +78,7 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); #include "xfs_trace.h" #include "xfs_trans.h" #include "xfs_rmap_btree.h" +#include "xfs_rtrmap_btree.h" #include "xfs_rmap.h" #include "xfs_refcount_btree.h" #include "xfs_refcount.h" diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 97b4ad7..fcc0d95 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -66,12 +66,15 @@ typedef struct xfs_mount { uint m_inobt_mnr[2]; /* XFS_INOBT_BLOCK_MINRECS */ uint m_rmap_mxr[2]; /* max rmap btree records */ uint m_rmap_mnr[2]; /* min rmap btree records */ + uint m_rtrmap_mxr[2]; /* max rtrmap btree records */ + uint m_rtrmap_mnr[2]; /* min rtrmap btree records */ uint m_refc_mxr[2]; /* max refc btree records */ uint m_refc_mnr[2]; /* min refc btree records */ uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ uint m_in_maxlevels; /* XFS_IN_MAXLEVELS */ uint m_rmap_maxlevels; /* max rmap btree levels */ + uint m_rtrmap_maxlevels; /* max rtrmap btree level */ uint m_refc_maxlevels; /* max refcount btree level */ xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ uint m_alloc_set_aside; /* space we can't use */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 6499731..5ccf2e4 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -40,6 +40,7 @@ HFILES = \ xfs_refcount_btree.h \ xfs_rmap.h \ xfs_rmap_btree.h \ + xfs_rtrmap_btree.h \ xfs_sb.h \ xfs_shared.h \ xfs_trans_resv.h \ @@ -92,6 +93,7 @@ CFILES = cache.c \ xfs_refcount_btree.c \ xfs_rmap.c \ xfs_rmap_btree.c \ + xfs_rtrmap_btree.c \ xfs_rtbitmap.c \ xfs_sb.c \ xfs_symlink_remote.c \ diff --git a/libxfs/init.c b/libxfs/init.c index 9134879..e3f8a5d 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -33,6 +33,7 @@ #include "xfs_trans.h" #include "xfs_rmap_btree.h" #include "xfs_refcount_btree.h" +#include "xfs_rtrmap_btree.h" #include "libxfs.h" /* for now */ @@ -690,6 +691,7 @@ libxfs_mount( xfs_bmap_compute_maxlevels(mp, XFS_ATTR_FORK); xfs_ialloc_compute_maxlevels(mp); xfs_rmapbt_compute_maxlevels(mp); + xfs_rtrmapbt_compute_maxlevels(mp); xfs_refcountbt_compute_maxlevels(mp); if (sbp->sb_imax_pct) { diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 53f6192..562e42b 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -1216,6 +1216,7 @@ xfs_btree_set_refs( xfs_buf_set_ref(bp, XFS_BMAP_BTREE_REF); break; case XFS_BTNUM_RMAP: + case XFS_BTNUM_RTRMAP: xfs_buf_set_ref(bp, XFS_RMAP_BTREE_REF); break; case XFS_BTNUM_REFC: diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h index 8913ffa..a9936ac 100644 --- a/libxfs/xfs_btree.h +++ b/libxfs/xfs_btree.h @@ -50,6 +50,8 @@ union xfs_btree_key { struct xfs_rmap_key rmap; struct xfs_rmap_key __rmap_bigkey[2]; struct xfs_refcount_key refc; + struct xfs_rtrmap_key rtrmap; + struct xfs_rtrmap_key __rtrmap_bigkey[2]; }; union xfs_btree_rec { @@ -59,6 +61,7 @@ union xfs_btree_rec { struct xfs_inobt_rec inobt; struct xfs_rmap_rec rmap; struct xfs_refcount_rec refc; + struct xfs_rtrmap_rec rtrmap; }; /* diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index ae2d958..82ff6fc 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1470,6 +1470,54 @@ typedef __be32 xfs_rmap_ptr_t; #define XFS_RTRMAP_CRC_MAGIC 0x4d415052 /* 'MAPR' */ /* + * Data record structure + */ +struct xfs_rtrmap_rec { + __be64 rm_startblock; /* extent start block */ + __be64 rm_blockcount; /* extent length */ + __be64 rm_owner; /* extent owner */ + __be64 rm_offset; /* offset within the owner */ +}; + +/* rm_offset has the same values as the regular rmapbt. */ +#define XFS_RTRMAP_OFF_ATTR_FORK XFS_RMAP_OFF_ATTR_FORK +#define XFS_RTRMAP_OFF_BMBT_BLOCK XFS_RMAP_OFF_BMBT_BLOCK +#define XFS_RTRMAP_OFF_UNWRITTEN XFS_RMAP_OFF_UNWRITTEN + +#define XFS_RTRMAP_LEN_MAX ((__uint64_t)~0U) +#define XFS_RTRMAP_OFF_FLAGS XFS_RMAP_OFF_FLAGS +#define XFS_RTRMAP_OFF_MASK XFS_RMAP_OFF_MASK + +#define XFS_RTRMAP_OFF XFS_RMAP_OFF + +#define XFS_RTRMAP_IS_BMBT_BLOCK(off) XFS_RMAP_IS_BMBT_BLOCK +#define XFS_RTRMAP_IS_ATTR_FORK(off) XFS_RMAP_IS_ATTR_FORK +#define XFS_RTRMAP_IS_UNWRITTEN(len) XFS_RMAP_IS_UNWRITTEN + +#define RTRMAPBT_STARTBLOCK_BITLEN 64 +#define RTRMAPBT_BLOCKCOUNT_BITLEN 64 +#define RTRMAPBT_OWNER_BITLEN RMAPBT_OWNER_BITLEN +#define RTRMAPBT_ATTRFLAG_BITLEN RMAPBT_ATTRFLAG_BITLEN +#define RTRMAPBT_BMBTFLAG_BITLEN RMAPBT_BMBTFLAG_BITLEN +#define RTRMAPBT_EXNTFLAG_BITLEN RMAPBT_EXNTFLAG_BITLEN +#define RTRMAPBT_UNUSED_OFFSET_BITLEN RMAPBT_UNUSED_OFFSET_BITLEN +#define RTRMAPBT_OFFSET_BITLEN RMAPBT_OFFSET_BITLEN + +/* + * Key structure + * + * We don't use the length for lookups + */ +struct xfs_rtrmap_key { + __be64 rm_startblock; /* extent start block */ + __be64 rm_owner; /* extent owner */ + __be64 rm_offset; /* offset within the owner */ +} __attribute__((packed)); + +/* btree pointer type */ +typedef __be64 xfs_rtrmap_ptr_t; + +/* * Reference Count Btree format definitions * */ diff --git a/libxfs/xfs_rtrmap_btree.c b/libxfs/xfs_rtrmap_btree.c new file mode 100644 index 0000000..c62e5c8 --- /dev/null +++ b/libxfs/xfs_rtrmap_btree.c @@ -0,0 +1,195 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#include "libxfs_priv.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_bit.h" +#include "xfs_sb.h" +#include "xfs_mount.h" +#include "xfs_defer.h" +#include "xfs_inode.h" +#include "xfs_trans.h" +#include "xfs_alloc.h" +#include "xfs_btree.h" +#include "xfs_rtrmap_btree.h" +#include "xfs_trace.h" +#include "xfs_cksum.h" +#include "xfs_ag_resv.h" + +/* + * Realtime Reverse map btree. + * + * This is a per-ag tree used to track the owner(s) of a given extent + * in the realtime device. See the comments in xfs_rmap_btree.c for + * more information. + * + * This tree is basically the same as the regular rmap btree except that + * it doesn't live in free space, and the startblock and blockcount + * fields have been widened to 64 bits. + */ + +static struct xfs_btree_cur * +xfs_rtrmapbt_dup_cursor( + struct xfs_btree_cur *cur) +{ + struct xfs_btree_cur *new; + + new = xfs_rtrmapbt_init_cursor(cur->bc_mp, cur->bc_tp, + cur->bc_private.b.ip); + + /* + * Copy the firstblock, dfops, and flags values, + * since init cursor doesn't get them. + */ + new->bc_private.b.firstblock = cur->bc_private.b.firstblock; + new->bc_private.b.dfops = cur->bc_private.b.dfops; + new->bc_private.b.flags = cur->bc_private.b.flags; + + return new; +} + +static bool +xfs_rtrmapbt_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); + int level; + + if (block->bb_magic != cpu_to_be32(XFS_RTRMAP_CRC_MAGIC)) + return false; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) + return false; + if (!xfs_btree_lblock_v5hdr_verify(bp, XFS_RMAP_OWN_UNKNOWN)) + return false; + level = be16_to_cpu(block->bb_level); + if (level > mp->m_rtrmap_maxlevels) + return false; + + return xfs_btree_lblock_verify(bp, mp->m_rtrmap_mxr[level != 0]); +} + +static void +xfs_rtrmapbt_read_verify( + struct xfs_buf *bp) +{ + if (!xfs_btree_lblock_verify_crc(bp)) + xfs_buf_ioerror(bp, -EFSBADCRC); + else if (!xfs_rtrmapbt_verify(bp)) + xfs_buf_ioerror(bp, -EFSCORRUPTED); + + if (bp->b_error) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_verifier_error(bp); + } +} + +static void +xfs_rtrmapbt_write_verify( + struct xfs_buf *bp) +{ + if (!xfs_rtrmapbt_verify(bp)) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_buf_ioerror(bp, -EFSCORRUPTED); + xfs_verifier_error(bp); + return; + } + xfs_btree_lblock_calc_crc(bp); + +} + +const struct xfs_buf_ops xfs_rtrmapbt_buf_ops = { + .name = "xfs_rtrmapbt", + .verify_read = xfs_rtrmapbt_read_verify, + .verify_write = xfs_rtrmapbt_write_verify, +}; + +static const struct xfs_btree_ops xfs_rtrmapbt_ops = { + .rec_len = sizeof(struct xfs_rtrmap_rec), + .key_len = 2 * sizeof(struct xfs_rtrmap_key), + + .dup_cursor = xfs_rtrmapbt_dup_cursor, + .buf_ops = &xfs_rtrmapbt_buf_ops, +}; + +/* + * Allocate a new allocation btree cursor. + */ +struct xfs_btree_cur * +xfs_rtrmapbt_init_cursor( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_inode *ip) +{ + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); + struct xfs_btree_cur *cur; + + cur = kmem_zone_zalloc(xfs_btree_cur_zone, KM_NOFS); + cur->bc_tp = tp; + cur->bc_mp = mp; + cur->bc_btnum = XFS_BTNUM_RTRMAP; + cur->bc_flags = XFS_BTREE_LONG_PTRS | XFS_BTREE_ROOT_IN_INODE | + XFS_BTREE_CRC_BLOCKS | XFS_BTREE_IROOT_RECORDS | + XFS_BTREE_OVERLAPPING; + cur->bc_blocklog = mp->m_sb.sb_blocklog; + cur->bc_ops = &xfs_rtrmapbt_ops; + cur->bc_nlevels = be16_to_cpu(ifp->if_broot->bb_level) + 1; + + cur->bc_private.b.forksize = XFS_IFORK_SIZE(ip, XFS_DATA_FORK); + cur->bc_private.b.ip = ip; + cur->bc_private.b.firstblock = NULLFSBLOCK; + cur->bc_private.b.dfops = NULL; + cur->bc_private.b.allocated = 0; + cur->bc_private.b.flags = 0; + cur->bc_private.b.whichfork = XFS_DATA_FORK; + + return cur; +} + +/* + * Calculate number of records in an rmap btree block. + */ +int +xfs_rtrmapbt_maxrecs( + struct xfs_mount *mp, + int blocklen, + bool leaf) +{ + blocklen -= XFS_RTRMAP_BLOCK_LEN; + + if (leaf) + return blocklen / sizeof(struct xfs_rtrmap_rec); + return blocklen / + (2 * sizeof(struct xfs_rtrmap_key) + sizeof(xfs_rtrmap_ptr_t)); +} + +/* Compute the maximum height of an rmap btree. */ +void +xfs_rtrmapbt_compute_maxlevels( + struct xfs_mount *mp) +{ + mp->m_rtrmap_maxlevels = xfs_btree_compute_maxlevels(mp, + mp->m_rtrmap_mnr, mp->m_sb.sb_rblocks); + ASSERT(mp->m_rtrmap_maxlevels <= XFS_BTREE_MAXLEVELS); +} diff --git a/libxfs/xfs_rtrmap_btree.h b/libxfs/xfs_rtrmap_btree.h new file mode 100644 index 0000000..5eb19f4 --- /dev/null +++ b/libxfs/xfs_rtrmap_btree.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 Oracle. All Rights Reserved. + * + * Author: Darrick J. Wong + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + */ +#ifndef __XFS_RTRMAP_BTREE_H__ +#define __XFS_RTRMAP_BTREE_H__ + +struct xfs_buf; +struct xfs_btree_cur; +struct xfs_mount; + +/* rmaps only exist on crc enabled filesystems */ +#define XFS_RTRMAP_BLOCK_LEN XFS_BTREE_LBLOCK_CRC_LEN + +/* + * Record, key, and pointer address macros for btree blocks. + * + * (note that some of these may appear unused, but they are used in userspace) + */ +#define XFS_RTRMAP_REC_ADDR(block, index) \ + ((struct xfs_rtrmap_rec *) \ + ((char *)(block) + XFS_RTRMAP_BLOCK_LEN + \ + (((index) - 1) * sizeof(struct xfs_rtrmap_rec)))) + +#define XFS_RTRMAP_KEY_ADDR(block, index) \ + ((struct xfs_rtrmap_key *) \ + ((char *)(block) + XFS_RTRMAP_BLOCK_LEN + \ + ((index) - 1) * 2 * sizeof(struct xfs_rtrmap_key))) + +#define XFS_RTRMAP_HIGH_KEY_ADDR(block, index) \ + ((struct xfs_rtrmap_key *) \ + ((char *)(block) + XFS_RTRMAP_BLOCK_LEN + \ + sizeof(struct xfs_rtrmap_key) + \ + ((index) - 1) * 2 * sizeof(struct xfs_rtrmap_key))) + +#define XFS_RTRMAP_PTR_ADDR(block, index, maxrecs) \ + ((xfs_rtrmap_ptr_t *) \ + ((char *)(block) + XFS_RTRMAP_BLOCK_LEN + \ + (maxrecs) * 2 * sizeof(struct xfs_rtrmap_key) + \ + ((index) - 1) * sizeof(xfs_rtrmap_ptr_t))) + +struct xfs_btree_cur *xfs_rtrmapbt_init_cursor(struct xfs_mount *mp, + struct xfs_trans *tp, struct xfs_inode *ip); +int xfs_rtrmapbt_maxrecs(struct xfs_mount *mp, int blocklen, bool leaf); +extern void xfs_rtrmapbt_compute_maxlevels(struct xfs_mount *mp); + +#endif /* __XFS_RTRMAP_BTREE_H__ */ diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index de25489..2e6afe9 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -37,6 +37,7 @@ #include "xfs_rmap_btree.h" #include "xfs_bmap.h" #include "xfs_refcount_btree.h" +#include "xfs_rtrmap_btree.h" /* * Physical superblock buffer manipulations. Shared with libxfs in userspace. @@ -742,6 +743,11 @@ xfs_sb_mount_common( mp->m_rmap_mnr[0] = mp->m_rmap_mxr[0] / 2; mp->m_rmap_mnr[1] = mp->m_rmap_mxr[1] / 2; + mp->m_rtrmap_mxr[0] = xfs_rtrmapbt_maxrecs(mp, sbp->sb_blocksize, 1); + mp->m_rtrmap_mxr[1] = xfs_rtrmapbt_maxrecs(mp, sbp->sb_blocksize, 0); + mp->m_rtrmap_mnr[0] = mp->m_rtrmap_mxr[0] / 2; + mp->m_rtrmap_mnr[1] = mp->m_rtrmap_mxr[1] / 2; + mp->m_refc_mxr[0] = xfs_refcountbt_maxrecs(mp, sbp->sb_blocksize, true); mp->m_refc_mxr[1] = xfs_refcountbt_maxrecs(mp, sbp->sb_blocksize, diff --git a/libxfs/xfs_shared.h b/libxfs/xfs_shared.h index c6f4eb4..0032a8c 100644 --- a/libxfs/xfs_shared.h +++ b/libxfs/xfs_shared.h @@ -39,6 +39,7 @@ extern const struct xfs_buf_ops xfs_agf_buf_ops; extern const struct xfs_buf_ops xfs_agfl_buf_ops; extern const struct xfs_buf_ops xfs_allocbt_buf_ops; extern const struct xfs_buf_ops xfs_rmapbt_buf_ops; +extern const struct xfs_buf_ops xfs_rtrmapbt_buf_ops; extern const struct xfs_buf_ops xfs_refcountbt_buf_ops; extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; From darrick.wong@oracle.com Thu Aug 25 18:59:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 41F0083F7 for ; Thu, 25 Aug 2016 18:59:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA35EAC001 for ; Thu, 25 Aug 2016 16:59:25 -0700 (PDT) X-ASG-Debug-ID: 1472169563-0bf81509b01e1940001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id VN5xiz09RcN9Yc1c (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNxMu7005349 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:22 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNxMXW006981 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:22 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNxL3A005730; Thu, 25 Aug 2016 23:59:21 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:21 -0700 Subject: [PATCH 07/29] xfs: realtime rmap btree transaction reservations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 07/29] xfs: realtime rmap btree transaction reservations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:20 -0700 Message-ID: <147216956023.7022.15229255210665379699.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169564 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 993 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make sure that there's enough log reservation to handle mapping and unmapping realtime extents. We have to reserve enough space to handle a split in the rtrmapbt to add the record and a second split in the regular rmapbt to record the rtrmapbt split. Signed-off-by: Darrick J. Wong --- libxfs/xfs_trans_resv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 5152a5b..7947d8e 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -82,7 +82,8 @@ xfs_allocfree_log_count( blocks = num_ops * 2 * (2 * mp->m_ag_maxlevels - 1); if (xfs_sb_version_hasrmapbt(&mp->m_sb)) - blocks += num_ops * (2 * mp->m_rmap_maxlevels - 1); + blocks += max(num_ops * (2 * mp->m_rmap_maxlevels - 1), + num_ops * (2 * mp->m_rtrmap_maxlevels - 1)); if (xfs_sb_version_hasreflink(&mp->m_sb)) blocks += num_ops * (2 * mp->m_refc_maxlevels - 1); From darrick.wong@oracle.com Thu Aug 25 18:59:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C6E4C83FF for ; Thu, 25 Aug 2016 18:59:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E75EAC002 for ; Thu, 25 Aug 2016 16:59:33 -0700 (PDT) X-ASG-Debug-ID: 1472169570-0bf57b5313209ee0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id BAZIZHaHt6slw1rt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNxSaS031871 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:29 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNxSYd021835 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:28 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNxSV6004207; Thu, 25 Aug 2016 23:59:28 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:27 -0700 Subject: [PATCH 08/29] xfs: add realtime rmap btree operations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 08/29] xfs: add realtime rmap btree operations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:26 -0700 Message-ID: <147216956639.7022.7959437975156604082.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169570 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9941 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Implement the generic btree operations needed to manipulate rtrmap btree blocks. This is different from the regular rmapbt in that we allocate space from the filesystem at large, and are neither constrained to the free space nor any particular AG. Signed-off-by: Darrick J. Wong --- libxfs/xfs_rtrmap_btree.c | 319 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) diff --git a/libxfs/xfs_rtrmap_btree.c b/libxfs/xfs_rtrmap_btree.c index c62e5c8..66c9190 100644 --- a/libxfs/xfs_rtrmap_btree.c +++ b/libxfs/xfs_rtrmap_btree.c @@ -31,10 +31,12 @@ #include "xfs_trans.h" #include "xfs_alloc.h" #include "xfs_btree.h" +#include "xfs_rmap.h" #include "xfs_rtrmap_btree.h" #include "xfs_trace.h" #include "xfs_cksum.h" #include "xfs_ag_resv.h" +#include "xfs_bmap.h" /* * Realtime Reverse map btree. @@ -68,6 +70,275 @@ xfs_rtrmapbt_dup_cursor( return new; } +STATIC int +xfs_rtrmapbt_alloc_block( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *start, + union xfs_btree_ptr *new, + int *stat) +{ + struct xfs_alloc_arg args; + int error; + + memset(&args, 0, sizeof(args)); + args.tp = cur->bc_tp; + args.mp = cur->bc_mp; + args.fsbno = cur->bc_private.b.firstblock; + args.firstblock = args.fsbno; + xfs_rmap_ino_bmbt_owner(&args.oinfo, cur->bc_private.b.ip->i_ino, + cur->bc_private.b.whichfork); + + if (args.fsbno == NULLFSBLOCK) { + args.fsbno = be64_to_cpu(start->l); + args.type = XFS_ALLOCTYPE_START_BNO; + /* + * Make sure there is sufficient room left in the AG to + * complete a full tree split for an extent insert. If + * we are converting the middle part of an extent then + * we may need space for two tree splits. + * + * We are relying on the caller to make the correct block + * reservation for this operation to succeed. If the + * reservation amount is insufficient then we may fail a + * block allocation here and corrupt the filesystem. + */ + args.minleft = args.tp->t_blk_res; + } else if (cur->bc_private.b.dfops->dop_low) { + args.type = XFS_ALLOCTYPE_START_BNO; + } else { + args.type = XFS_ALLOCTYPE_NEAR_BNO; + } + + args.minlen = args.maxlen = args.prod = 1; + args.wasdel = 0; + error = xfs_alloc_vextent(&args); + if (error) + goto error0; + + if (args.fsbno == NULLFSBLOCK && args.minleft) { + /* + * Could not find an AG with enough free space to satisfy + * a full btree split. Try again without minleft and if + * successful activate the lowspace algorithm. + */ + args.fsbno = 0; + args.type = XFS_ALLOCTYPE_FIRST_AG; + args.minleft = 0; + error = xfs_alloc_vextent(&args); + if (error) + goto error0; + cur->bc_private.b.dfops->dop_low = true; + } + if (args.fsbno == NULLFSBLOCK) { + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 0; + return 0; + } + ASSERT(args.len == 1); + cur->bc_private.b.firstblock = args.fsbno; + cur->bc_private.b.allocated++; + cur->bc_private.b.ip->i_d.di_nblocks++; + xfs_trans_log_inode(args.tp, cur->bc_private.b.ip, XFS_ILOG_CORE); + + new->l = cpu_to_be64(args.fsbno); + + XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); + *stat = 1; + return 0; + + error0: + XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); + return error; +} + +STATIC int +xfs_rtrmapbt_free_block( + struct xfs_btree_cur *cur, + struct xfs_buf *bp) +{ + struct xfs_mount *mp = cur->bc_mp; + struct xfs_inode *ip = cur->bc_private.b.ip; + struct xfs_trans *tp = cur->bc_tp; + xfs_fsblock_t fsbno = XFS_DADDR_TO_FSB(mp, XFS_BUF_ADDR(bp)); + struct xfs_owner_info oinfo; + + xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, cur->bc_private.b.whichfork); + xfs_bmap_add_free(mp, cur->bc_private.b.dfops, fsbno, 1, &oinfo); + ip->i_d.di_nblocks--; + + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + return 0; +} + +/* + * Calculate number of records in the in-core realtime rmap btree inode root. + */ +STATIC int +xfs_rtrmapbt_broot_maxrecs( + int blocklen, + bool leaf) +{ + blocklen -= XFS_RTRMAP_BLOCK_LEN; + + if (leaf) + return blocklen / sizeof(struct xfs_rtrmap_rec); + return blocklen / (2 * sizeof(struct xfs_rtrmap_key) + + sizeof(xfs_rtrmap_ptr_t)); +} + +STATIC int +xfs_rtrmapbt_get_minrecs( + struct xfs_btree_cur *cur, + int level) +{ + struct xfs_ifork *ifp; + + if (level == cur->bc_nlevels - 1) { + ifp = XFS_IFORK_PTR(cur->bc_private.b.ip, + cur->bc_private.b.whichfork); + + return xfs_rtrmapbt_broot_maxrecs(ifp->if_broot_bytes, + level == 0) / 2; + } + + return cur->bc_mp->m_rtrmap_mnr[level != 0]; +} + +STATIC int +xfs_rtrmapbt_get_maxrecs( + struct xfs_btree_cur *cur, + int level) +{ + struct xfs_ifork *ifp; + + if (level == cur->bc_nlevels - 1) { + ifp = XFS_IFORK_PTR(cur->bc_private.b.ip, + cur->bc_private.b.whichfork); + + return xfs_rtrmapbt_broot_maxrecs(ifp->if_broot_bytes, + level == 0); + } + + return cur->bc_mp->m_rtrmap_mxr[level != 0]; +} + +STATIC void +xfs_rtrmapbt_init_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + key->rtrmap.rm_startblock = rec->rtrmap.rm_startblock; + key->rtrmap.rm_owner = rec->rtrmap.rm_owner; + key->rtrmap.rm_offset = rec->rtrmap.rm_offset; +} + +STATIC void +xfs_rtrmapbt_init_high_key_from_rec( + union xfs_btree_key *key, + union xfs_btree_rec *rec) +{ + __uint64_t off; + int adj; + + adj = be64_to_cpu(rec->rtrmap.rm_blockcount) - 1; + + key->rtrmap.rm_startblock = rec->rtrmap.rm_startblock; + be64_add_cpu(&key->rtrmap.rm_startblock, adj); + key->rtrmap.rm_owner = rec->rtrmap.rm_owner; + key->rtrmap.rm_offset = rec->rtrmap.rm_offset; + if (XFS_RMAP_NON_INODE_OWNER(be64_to_cpu(rec->rtrmap.rm_owner)) || + XFS_RMAP_IS_BMBT_BLOCK(be64_to_cpu(rec->rtrmap.rm_offset))) + return; + off = be64_to_cpu(key->rtrmap.rm_offset); + off = (XFS_RMAP_OFF(off) + adj) | (off & ~XFS_RMAP_OFF_MASK); + key->rtrmap.rm_offset = cpu_to_be64(off); +} + +STATIC void +xfs_rtrmapbt_init_rec_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_rec *rec) +{ + rec->rtrmap.rm_startblock = cpu_to_be64(cur->bc_rec.r.rm_startblock); + rec->rtrmap.rm_blockcount = cpu_to_be64(cur->bc_rec.r.rm_blockcount); + rec->rtrmap.rm_owner = cpu_to_be64(cur->bc_rec.r.rm_owner); + rec->rtrmap.rm_offset = cpu_to_be64( + xfs_rmap_irec_offset_pack(&cur->bc_rec.r)); +} + +STATIC void +xfs_rtrmapbt_init_ptr_from_cur( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + ptr->l = 0; +} + +STATIC __int64_t +xfs_rtrmapbt_key_diff( + struct xfs_btree_cur *cur, + union xfs_btree_key *key) +{ + struct xfs_rmap_irec *rec = &cur->bc_rec.r; + struct xfs_rtrmap_key *kp = &key->rtrmap; + __u64 x, y; + + x = be64_to_cpu(kp->rm_startblock); + y = rec->rm_startblock; + if (x > y) + return 1; + else if (y > x) + return -1; + + x = be64_to_cpu(kp->rm_owner); + y = rec->rm_owner; + if (x > y) + return 1; + else if (y > x) + return -1; + + x = XFS_RMAP_OFF(be64_to_cpu(kp->rm_offset)); + y = rec->rm_offset; + if (x > y) + return 1; + else if (y > x) + return -1; + return 0; +} + +STATIC __int64_t +xfs_rtrmapbt_diff_two_keys( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + struct xfs_rtrmap_key *kp1 = &k1->rtrmap; + struct xfs_rtrmap_key *kp2 = &k2->rtrmap; + __u64 x, y; + + x = be64_to_cpu(kp1->rm_startblock); + y = be64_to_cpu(kp2->rm_startblock); + if (x > y) + return 1; + else if (y > x) + return -1; + + x = be64_to_cpu(kp1->rm_owner); + y = be64_to_cpu(kp2->rm_owner); + if (x > y) + return 1; + else if (y > x) + return -1; + + x = XFS_RMAP_OFF(be64_to_cpu(kp1->rm_offset)); + y = XFS_RMAP_OFF(be64_to_cpu(kp2->rm_offset)); + if (x > y) + return 1; + else if (y > x) + return -1; + return 0; +} + static bool xfs_rtrmapbt_verify( struct xfs_buf *bp) @@ -125,12 +396,60 @@ const struct xfs_buf_ops xfs_rtrmapbt_buf_ops = { .verify_write = xfs_rtrmapbt_write_verify, }; +STATIC int +xfs_rtrmapbt_keys_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_key *k1, + union xfs_btree_key *k2) +{ + if (be64_to_cpu(k1->rtrmap.rm_startblock) < + be64_to_cpu(k2->rtrmap.rm_startblock)) + return 1; + if (be64_to_cpu(k1->rtrmap.rm_owner) < + be64_to_cpu(k2->rtrmap.rm_owner)) + return 1; + if (XFS_RMAP_OFF(be64_to_cpu(k1->rtrmap.rm_offset)) <= + XFS_RMAP_OFF(be64_to_cpu(k2->rtrmap.rm_offset))) + return 1; + return 0; +} + +STATIC int +xfs_rtrmapbt_recs_inorder( + struct xfs_btree_cur *cur, + union xfs_btree_rec *r1, + union xfs_btree_rec *r2) +{ + if (be64_to_cpu(r1->rtrmap.rm_startblock) < + be64_to_cpu(r2->rtrmap.rm_startblock)) + return 1; + if (XFS_RMAP_OFF(be64_to_cpu(r1->rtrmap.rm_offset)) < + XFS_RMAP_OFF(be64_to_cpu(r2->rtrmap.rm_offset))) + return 1; + if (be64_to_cpu(r1->rtrmap.rm_owner) <= + be64_to_cpu(r2->rtrmap.rm_owner)) + return 1; + return 0; +} + static const struct xfs_btree_ops xfs_rtrmapbt_ops = { .rec_len = sizeof(struct xfs_rtrmap_rec), .key_len = 2 * sizeof(struct xfs_rtrmap_key), .dup_cursor = xfs_rtrmapbt_dup_cursor, + .alloc_block = xfs_rtrmapbt_alloc_block, + .free_block = xfs_rtrmapbt_free_block, + .get_minrecs = xfs_rtrmapbt_get_minrecs, + .get_maxrecs = xfs_rtrmapbt_get_maxrecs, + .init_key_from_rec = xfs_rtrmapbt_init_key_from_rec, + .init_high_key_from_rec = xfs_rtrmapbt_init_high_key_from_rec, + .init_rec_from_cur = xfs_rtrmapbt_init_rec_from_cur, + .init_ptr_from_cur = xfs_rtrmapbt_init_ptr_from_cur, + .key_diff = xfs_rtrmapbt_key_diff, .buf_ops = &xfs_rtrmapbt_buf_ops, + .diff_two_keys = xfs_rtrmapbt_diff_two_keys, + .keys_inorder = xfs_rtrmapbt_keys_inorder, + .recs_inorder = xfs_rtrmapbt_recs_inorder, }; /* From darrick.wong@oracle.com Thu Aug 25 18:59:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 159558407 for ; Thu, 25 Aug 2016 18:59:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CDA76304039 for ; Thu, 25 Aug 2016 16:59:40 -0700 (PDT) X-ASG-Debug-ID: 1472169577-0bf57c55b21c8380001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JGO7zRqfQ9JtQMs7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:37 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNxZcS005485 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:36 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNxZSW021952 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:35 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNxYrO004229; Thu, 25 Aug 2016 23:59:34 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:34 -0700 Subject: [PATCH 09/29] xfs: prepare rmap functions to deal with rtrmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 09/29] xfs: prepare rmap functions to deal with rtrmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:32 -0700 Message-ID: <147216957267.7022.15163577244093085026.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169577 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 21818 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Prepare the high-level rmap functions to deal with the new realtime rmapbt and its slightly different conventions. Provide the ability to talk to either rmapbt or rtrmapbt formats from the same high level code. Signed-off-by: Darrick J. Wong --- libxfs/xfs_rmap.c | 178 ++++++++++++++++++++++++++++++++--------------------- libxfs/xfs_rmap.h | 2 - 2 files changed, 107 insertions(+), 73 deletions(-) diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index 5f84f20..d5057b3 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -37,6 +37,24 @@ #include "xfs_bmap.h" #include "xfs_inode.h" +/* By convention, the rtrmapbt's "AG" number is NULLAGNUMBER. */ +static xfs_agnumber_t +xfs_rmap_cur_agno( + struct xfs_btree_cur *cur) +{ + return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? + NULLAGNUMBER : cur->bc_private.a.agno; +} + +/* Return the maximum length of an rmap record. */ +static xfs_filblks_t +xfs_rmap_len_max( + struct xfs_btree_cur *cur) +{ + return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? + XFS_RTRMAP_LEN_MAX : XFS_RMAP_LEN_MAX; +} + /* * Lookup the first record less than or equal to [bno, len, owner, offset] * in the btree given by cur. @@ -94,19 +112,27 @@ xfs_rmap_update( union xfs_btree_rec rec; int error; - trace_xfs_rmap_update(cur->bc_mp, cur->bc_private.a.agno, + trace_xfs_rmap_update(cur->bc_mp, xfs_rmap_cur_agno(cur), irec->rm_startblock, irec->rm_blockcount, irec->rm_owner, irec->rm_offset, irec->rm_flags); - rec.rmap.rm_startblock = cpu_to_be32(irec->rm_startblock); - rec.rmap.rm_blockcount = cpu_to_be32(irec->rm_blockcount); - rec.rmap.rm_owner = cpu_to_be64(irec->rm_owner); - rec.rmap.rm_offset = cpu_to_be64( - xfs_rmap_irec_offset_pack(irec)); + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + rec.rtrmap.rm_startblock = cpu_to_be64(irec->rm_startblock); + rec.rtrmap.rm_blockcount = cpu_to_be64(irec->rm_blockcount); + rec.rtrmap.rm_owner = cpu_to_be64(irec->rm_owner); + rec.rtrmap.rm_offset = cpu_to_be64( + xfs_rmap_irec_offset_pack(irec)); + } else { + rec.rmap.rm_startblock = cpu_to_be32(irec->rm_startblock); + rec.rmap.rm_blockcount = cpu_to_be32(irec->rm_blockcount); + rec.rmap.rm_owner = cpu_to_be64(irec->rm_owner); + rec.rmap.rm_offset = cpu_to_be64( + xfs_rmap_irec_offset_pack(irec)); + } error = xfs_btree_update(cur, &rec); if (error) trace_xfs_rmap_update_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -122,7 +148,7 @@ xfs_rmap_insert( int i; int error; - trace_xfs_rmap_insert(rcur->bc_mp, rcur->bc_private.a.agno, agbno, + trace_xfs_rmap_insert(rcur->bc_mp, xfs_rmap_cur_agno(rcur), agbno, len, owner, offset, flags); error = xfs_rmap_lookup_eq(rcur, agbno, len, owner, offset, flags, &i); @@ -142,7 +168,7 @@ xfs_rmap_insert( done: if (error) trace_xfs_rmap_insert_error(rcur->bc_mp, - rcur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(rcur), error, _RET_IP_); return error; } @@ -158,7 +184,7 @@ xfs_rmap_delete( int i; int error; - trace_xfs_rmap_delete(rcur->bc_mp, rcur->bc_private.a.agno, agbno, + trace_xfs_rmap_delete(rcur->bc_mp, xfs_rmap_cur_agno(rcur), agbno, len, owner, offset, flags); error = xfs_rmap_lookup_eq(rcur, agbno, len, owner, offset, flags, &i); @@ -173,22 +199,31 @@ xfs_rmap_delete( done: if (error) trace_xfs_rmap_delete_error(rcur->bc_mp, - rcur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(rcur), error, _RET_IP_); return error; } /* Convert an internal btree record to an rmap record. */ int xfs_rmap_btrec_to_irec( + struct xfs_btree_cur *cur, union xfs_btree_rec *rec, struct xfs_rmap_irec *irec) { irec->rm_flags = 0; - irec->rm_startblock = be32_to_cpu(rec->rmap.rm_startblock); - irec->rm_blockcount = be32_to_cpu(rec->rmap.rm_blockcount); - irec->rm_owner = be64_to_cpu(rec->rmap.rm_owner); - return xfs_rmap_irec_offset_unpack(be64_to_cpu(rec->rmap.rm_offset), - irec); + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + irec->rm_startblock = be64_to_cpu(rec->rtrmap.rm_startblock); + irec->rm_blockcount = be64_to_cpu(rec->rtrmap.rm_blockcount); + irec->rm_owner = be64_to_cpu(rec->rtrmap.rm_owner); + return xfs_rmap_irec_offset_unpack( + be64_to_cpu(rec->rtrmap.rm_offset), irec); + } else { + irec->rm_startblock = be32_to_cpu(rec->rmap.rm_startblock); + irec->rm_blockcount = be32_to_cpu(rec->rmap.rm_blockcount); + irec->rm_owner = be64_to_cpu(rec->rmap.rm_owner); + return xfs_rmap_irec_offset_unpack( + be64_to_cpu(rec->rmap.rm_offset), irec); + } } /* @@ -207,7 +242,7 @@ xfs_rmap_get_rec( if (error || !*stat) return error; - return xfs_rmap_btrec_to_irec(rec, irec); + return xfs_rmap_btrec_to_irec(cur, rec, irec); } struct xfs_find_left_neighbor_info { @@ -226,7 +261,7 @@ xfs_rmap_find_left_neighbor_helper( struct xfs_find_left_neighbor_info *info = priv; trace_xfs_rmap_find_left_neighbor_candidate(cur->bc_mp, - cur->bc_private.a.agno, rec->rm_startblock, + xfs_rmap_cur_agno(cur), rec->rm_startblock, rec->rm_blockcount, rec->rm_owner, rec->rm_offset, rec->rm_flags); @@ -278,7 +313,7 @@ xfs_rmap_find_left_neighbor( info.stat = stat; trace_xfs_rmap_find_left_neighbor_query(cur->bc_mp, - cur->bc_private.a.agno, bno, 0, owner, offset, flags); + xfs_rmap_cur_agno(cur), bno, 0, owner, offset, flags); error = xfs_rmap_query_range(cur, &info.high, &info.high, xfs_rmap_find_left_neighbor_helper, &info); @@ -286,7 +321,7 @@ xfs_rmap_find_left_neighbor( error = 0; if (*stat) trace_xfs_rmap_find_left_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, irec->rm_startblock, + xfs_rmap_cur_agno(cur), irec->rm_startblock, irec->rm_blockcount, irec->rm_owner, irec->rm_offset, irec->rm_flags); return error; @@ -302,7 +337,7 @@ xfs_rmap_lookup_le_range_helper( struct xfs_find_left_neighbor_info *info = priv; trace_xfs_rmap_lookup_le_range_candidate(cur->bc_mp, - cur->bc_private.a.agno, rec->rm_startblock, + xfs_rmap_cur_agno(cur), rec->rm_startblock, rec->rm_blockcount, rec->rm_owner, rec->rm_offset, rec->rm_flags); @@ -351,14 +386,14 @@ xfs_rmap_lookup_le_range( info.stat = stat; trace_xfs_rmap_lookup_le_range(cur->bc_mp, - cur->bc_private.a.agno, bno, 0, owner, offset, flags); + xfs_rmap_cur_agno(cur), bno, 0, owner, offset, flags); error = xfs_rmap_query_range(cur, &info.high, &info.high, xfs_rmap_lookup_le_range_helper, &info); if (error == XFS_BTREE_QUERY_RANGE_ABORT) error = 0; if (*stat) trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - cur->bc_private.a.agno, irec->rm_startblock, + xfs_rmap_cur_agno(cur), irec->rm_startblock, irec->rm_blockcount, irec->rm_owner, irec->rm_offset, irec->rm_flags); return error; @@ -405,7 +440,7 @@ xfs_rmap_unmap( (flags & XFS_RMAP_BMBT_BLOCK); if (unwritten) flags |= XFS_RMAP_UNWRITTEN; - trace_xfs_rmap_unmap(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_unmap(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -423,7 +458,7 @@ xfs_rmap_unmap( goto out_error; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - cur->bc_private.a.agno, ltrec.rm_startblock, + xfs_rmap_cur_agno(cur), ltrec.rm_startblock, ltrec.rm_blockcount, ltrec.rm_owner, ltrec.rm_offset, ltrec.rm_flags); ltoff = ltrec.rm_offset; @@ -471,7 +506,7 @@ xfs_rmap_unmap( if (ltrec.rm_startblock == bno && ltrec.rm_blockcount == len) { /* exact match, simply remove the record from rmap tree */ - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), ltrec.rm_startblock, ltrec.rm_blockcount, ltrec.rm_owner, ltrec.rm_offset, ltrec.rm_flags); @@ -546,7 +581,7 @@ xfs_rmap_unmap( else cur->bc_rec.r.rm_offset = offset + len; cur->bc_rec.r.rm_flags = flags; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), cur->bc_rec.r.rm_startblock, cur->bc_rec.r.rm_blockcount, cur->bc_rec.r.rm_owner, @@ -558,11 +593,11 @@ xfs_rmap_unmap( } out_done: - trace_xfs_rmap_unmap_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_unmap_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); out_error: if (error) - trace_xfs_rmap_unmap_error(mp, cur->bc_private.a.agno, + trace_xfs_rmap_unmap_error(mp, xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -659,7 +694,7 @@ xfs_rmap_map( (flags & XFS_RMAP_BMBT_BLOCK); if (unwritten) flags |= XFS_RMAP_UNWRITTEN; - trace_xfs_rmap_map(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_map(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -678,7 +713,7 @@ xfs_rmap_map( goto out_error; XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error); trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - cur->bc_private.a.agno, ltrec.rm_startblock, + xfs_rmap_cur_agno(cur), ltrec.rm_startblock, ltrec.rm_blockcount, ltrec.rm_owner, ltrec.rm_offset, ltrec.rm_flags); @@ -705,7 +740,7 @@ xfs_rmap_map( XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= gtrec.rm_startblock, out_error); trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, gtrec.rm_startblock, + xfs_rmap_cur_agno(cur), gtrec.rm_startblock, gtrec.rm_blockcount, gtrec.rm_owner, gtrec.rm_offset, gtrec.rm_flags); if (!xfs_rmap_is_mergeable(>rec, owner, flags)) @@ -732,8 +767,8 @@ xfs_rmap_map( if (have_gt && bno + len == gtrec.rm_startblock && (ignore_off || offset + len == gtrec.rm_offset) && - (unsigned long)ltrec.rm_blockcount + len + - gtrec.rm_blockcount <= XFS_RMAP_LEN_MAX) { + ltrec.rm_blockcount + len + gtrec.rm_blockcount <= + xfs_rmap_len_max(cur)) { /* * right edge also contiguous, delete right record * and merge into left record. @@ -744,7 +779,7 @@ xfs_rmap_map( * result: |rrrrrrrrrrrrrrrrrrrrrrrrrrrrr| */ ltrec.rm_blockcount += gtrec.rm_blockcount; - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), gtrec.rm_startblock, gtrec.rm_blockcount, gtrec.rm_owner, @@ -792,7 +827,7 @@ xfs_rmap_map( cur->bc_rec.r.rm_owner = owner; cur->bc_rec.r.rm_offset = offset; cur->bc_rec.r.rm_flags = flags; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), bno, len, owner, offset, flags); error = xfs_btree_insert(cur, &i); if (error) @@ -800,11 +835,11 @@ xfs_rmap_map( XFS_WANT_CORRUPTED_GOTO(mp, i == 1, out_error); } - trace_xfs_rmap_map_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_map_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); out_error: if (error) - trace_xfs_rmap_map_error(mp, cur->bc_private.a.agno, + trace_xfs_rmap_map_error(mp, xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -884,7 +919,7 @@ xfs_rmap_convert( (flags & (XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK)))); oldext = unwritten ? XFS_RMAP_UNWRITTEN : 0; new_endoff = offset + len; - trace_xfs_rmap_convert(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_convert(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -902,7 +937,7 @@ xfs_rmap_convert( goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - cur->bc_private.a.agno, PREV.rm_startblock, + xfs_rmap_cur_agno(cur), PREV.rm_startblock, PREV.rm_blockcount, PREV.rm_owner, PREV.rm_offset, PREV.rm_flags); @@ -938,7 +973,7 @@ xfs_rmap_convert( LEFT.rm_startblock + LEFT.rm_blockcount <= bno, done); trace_xfs_rmap_find_left_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, LEFT.rm_startblock, + xfs_rmap_cur_agno(cur), LEFT.rm_startblock, LEFT.rm_blockcount, LEFT.rm_owner, LEFT.rm_offset, LEFT.rm_flags); if (LEFT.rm_startblock + LEFT.rm_blockcount == bno && @@ -968,7 +1003,7 @@ xfs_rmap_convert( XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= RIGHT.rm_startblock, done); trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, RIGHT.rm_startblock, + xfs_rmap_cur_agno(cur), RIGHT.rm_startblock, RIGHT.rm_blockcount, RIGHT.rm_owner, RIGHT.rm_offset, RIGHT.rm_flags); if (bno + len == RIGHT.rm_startblock && @@ -982,11 +1017,11 @@ xfs_rmap_convert( RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG)) == (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG) && - (unsigned long)LEFT.rm_blockcount + len + - RIGHT.rm_blockcount > XFS_RMAP_LEN_MAX) + LEFT.rm_blockcount + len + RIGHT.rm_blockcount > + xfs_rmap_len_max(cur)) state &= ~RMAP_RIGHT_CONTIG; - trace_xfs_rmap_convert_state(mp, cur->bc_private.a.agno, state, + trace_xfs_rmap_convert_state(mp, xfs_rmap_cur_agno(cur), state, _RET_IP_); /* reset the cursor back to PREV */ @@ -1010,7 +1045,7 @@ xfs_rmap_convert( if (error) goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), RIGHT.rm_startblock, RIGHT.rm_blockcount, RIGHT.rm_owner, RIGHT.rm_offset, RIGHT.rm_flags); @@ -1022,7 +1057,7 @@ xfs_rmap_convert( if (error) goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), PREV.rm_startblock, PREV.rm_blockcount, PREV.rm_owner, PREV.rm_offset, PREV.rm_flags); @@ -1046,7 +1081,7 @@ xfs_rmap_convert( * Setting all of a previous oldext extent to newext. * The left neighbor is contiguous, the right is not. */ - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), PREV.rm_startblock, PREV.rm_blockcount, PREV.rm_owner, PREV.rm_offset, PREV.rm_flags); @@ -1074,7 +1109,7 @@ xfs_rmap_convert( if (error) goto done; XFS_WANT_CORRUPTED_GOTO(mp, i == 1, done); - trace_xfs_rmap_delete(mp, cur->bc_private.a.agno, + trace_xfs_rmap_delete(mp, xfs_rmap_cur_agno(cur), RIGHT.rm_startblock, RIGHT.rm_blockcount, RIGHT.rm_owner, RIGHT.rm_offset, RIGHT.rm_flags); @@ -1147,7 +1182,7 @@ xfs_rmap_convert( NEW.rm_blockcount = len; NEW.rm_flags = newext; cur->bc_rec.r = NEW; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, bno, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), bno, len, owner, offset, newext); error = xfs_btree_insert(cur, &i); if (error) @@ -1198,7 +1233,7 @@ xfs_rmap_convert( NEW.rm_blockcount = len; NEW.rm_flags = newext; cur->bc_rec.r = NEW; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, bno, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), bno, len, owner, offset, newext); error = xfs_btree_insert(cur, &i); if (error) @@ -1226,7 +1261,7 @@ xfs_rmap_convert( NEW = PREV; NEW.rm_blockcount = offset - PREV.rm_offset; cur->bc_rec.r = NEW; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), NEW.rm_startblock, NEW.rm_blockcount, NEW.rm_owner, NEW.rm_offset, NEW.rm_flags); @@ -1247,7 +1282,7 @@ xfs_rmap_convert( /* new middle extent - newext */ cur->bc_rec.r.rm_flags &= ~XFS_RMAP_UNWRITTEN; cur->bc_rec.r.rm_flags |= newext; - trace_xfs_rmap_insert(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_insert(mp, xfs_rmap_cur_agno(cur), bno, len, owner, offset, newext); error = xfs_btree_insert(cur, &i); if (error) @@ -1268,12 +1303,12 @@ xfs_rmap_convert( ASSERT(0); } - trace_xfs_rmap_convert_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_convert_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); done: if (error) trace_xfs_rmap_convert_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -1309,7 +1344,7 @@ xfs_rmap_convert_shared( (flags & (XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK)))); oldext = unwritten ? XFS_RMAP_UNWRITTEN : 0; new_endoff = offset + len; - trace_xfs_rmap_convert(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_convert(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -1363,7 +1398,7 @@ xfs_rmap_convert_shared( XFS_WANT_CORRUPTED_GOTO(mp, bno + len <= RIGHT.rm_startblock, done); trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, RIGHT.rm_startblock, + xfs_rmap_cur_agno(cur), RIGHT.rm_startblock, RIGHT.rm_blockcount, RIGHT.rm_owner, RIGHT.rm_offset, RIGHT.rm_flags); if (xfs_rmap_is_mergeable(&RIGHT, owner, newext)) @@ -1375,11 +1410,11 @@ xfs_rmap_convert_shared( RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG)) == (RMAP_LEFT_FILLING | RMAP_LEFT_CONTIG | RMAP_RIGHT_FILLING | RMAP_RIGHT_CONTIG) && - (unsigned long)LEFT.rm_blockcount + len + - RIGHT.rm_blockcount > XFS_RMAP_LEN_MAX) + LEFT.rm_blockcount + len + RIGHT.rm_blockcount > + xfs_rmap_len_max(cur)) state &= ~RMAP_RIGHT_CONTIG; - trace_xfs_rmap_convert_state(mp, cur->bc_private.a.agno, state, + trace_xfs_rmap_convert_state(mp, xfs_rmap_cur_agno(cur), state, _RET_IP_); /* * Switch out based on the FILLING and CONTIG state bits. @@ -1646,12 +1681,12 @@ xfs_rmap_convert_shared( ASSERT(0); } - trace_xfs_rmap_convert_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_convert_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); done: if (error) trace_xfs_rmap_convert_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -1689,7 +1724,7 @@ xfs_rmap_unmap_shared( xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); if (unwritten) flags |= XFS_RMAP_UNWRITTEN; - trace_xfs_rmap_unmap(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_unmap(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* @@ -1813,12 +1848,12 @@ xfs_rmap_unmap_shared( goto out_error; } - trace_xfs_rmap_unmap_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_unmap_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); out_error: if (error) trace_xfs_rmap_unmap_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -1853,7 +1888,7 @@ xfs_rmap_map_shared( xfs_owner_info_unpack(oinfo, &owner, &offset, &flags); if (unwritten) flags |= XFS_RMAP_UNWRITTEN; - trace_xfs_rmap_map(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_map(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); /* Is there a left record that abuts our range? */ @@ -1876,7 +1911,7 @@ xfs_rmap_map_shared( goto out_error; XFS_WANT_CORRUPTED_GOTO(mp, have_gt == 1, out_error); trace_xfs_rmap_find_right_neighbor_result(cur->bc_mp, - cur->bc_private.a.agno, gtrec.rm_startblock, + xfs_rmap_cur_agno(cur), gtrec.rm_startblock, gtrec.rm_blockcount, gtrec.rm_owner, gtrec.rm_offset, gtrec.rm_flags); @@ -1966,12 +2001,12 @@ xfs_rmap_map_shared( goto out_error; } - trace_xfs_rmap_map_done(mp, cur->bc_private.a.agno, bno, len, + trace_xfs_rmap_map_done(mp, xfs_rmap_cur_agno(cur), bno, len, unwritten, oinfo); out_error: if (error) trace_xfs_rmap_map_error(cur->bc_mp, - cur->bc_private.a.agno, error, _RET_IP_); + xfs_rmap_cur_agno(cur), error, _RET_IP_); return error; } @@ -1991,7 +2026,7 @@ xfs_rmap_query_range_helper( struct xfs_rmap_irec irec; int error; - error = xfs_rmap_btrec_to_irec(rec, &irec); + error = xfs_rmap_btrec_to_irec(cur, rec, &irec); if (error) return error; return query->fn(cur, &irec, query->priv); @@ -2074,13 +2109,12 @@ xfs_rmap_finish_one( XFS_ERRTAG_RMAP_FINISH_ONE, XFS_RANDOM_RMAP_FINISH_ONE)) return -EIO; - /* * If we haven't gotten a cursor or the cursor AG doesn't match * the startblock, get one now. */ rcur = *pcur; - if (rcur != NULL && rcur->bc_private.a.agno != agno) { + if (rcur != NULL && xfs_rmap_cur_agno(rcur) != agno) { xfs_rmap_finish_one_cleanup(tp, rcur, 0); rcur = NULL; *pcur = NULL; diff --git a/libxfs/xfs_rmap.h b/libxfs/xfs_rmap.h index 06f7e73..3574377 100644 --- a/libxfs/xfs_rmap.h +++ b/libxfs/xfs_rmap.h @@ -213,7 +213,7 @@ int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, struct xfs_rmap_irec *irec, int *stat); union xfs_btree_rec; -int xfs_rmap_btrec_to_irec(union xfs_btree_rec *rec, +int xfs_rmap_btrec_to_irec(struct xfs_btree_cur *cur, union xfs_btree_rec *rec, struct xfs_rmap_irec *irec); int xfs_rmap_has_record(struct xfs_btree_cur *cur, xfs_fsblock_t bno, xfs_filblks_t len, bool *exists); From darrick.wong@oracle.com Thu Aug 25 18:59:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB7358407 for ; Thu, 25 Aug 2016 18:59:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2FB3CAC003 for ; Thu, 25 Aug 2016 16:59:45 -0700 (PDT) X-ASG-Debug-ID: 1472169582-0bf57b5313209f00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JkfbdXhdDRXMKQh0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:43 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNxf7u005595 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:41 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNxfD8007478 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:41 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNxeiE026040; Thu, 25 Aug 2016 23:59:40 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:40 -0700 Subject: [PATCH 10/29] xfs: add a realtime flag to the rmap update log redo items From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 10/29] xfs: add a realtime flag to the rmap update log redo items To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:39 -0700 Message-ID: <147216957908.7022.9194503620104116045.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169583 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3825 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Extend the rmap update (RUI) log items with a new realtime flag that indicates that the updates apply against the realtime rmapbt. We'll wire up the actual rmap code later. Signed-off-by: Darrick J. Wong --- libxfs/xfs_log_format.h | 4 +++- libxfs/xfs_rmap.c | 17 ++++++++++------- libxfs/xfs_rmap.h | 1 + 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/libxfs/xfs_log_format.h b/libxfs/xfs_log_format.h index 75f9890..34c4cc7 100644 --- a/libxfs/xfs_log_format.h +++ b/libxfs/xfs_log_format.h @@ -647,11 +647,13 @@ struct xfs_map_extent { #define XFS_RMAP_EXTENT_ATTR_FORK (1U << 31) #define XFS_RMAP_EXTENT_BMBT_BLOCK (1U << 30) #define XFS_RMAP_EXTENT_UNWRITTEN (1U << 29) +#define XFS_RMAP_EXTENT_REALTIME (1U << 28) #define XFS_RMAP_EXTENT_FLAGS (XFS_RMAP_EXTENT_TYPE_MASK | \ XFS_RMAP_EXTENT_ATTR_FORK | \ XFS_RMAP_EXTENT_BMBT_BLOCK | \ - XFS_RMAP_EXTENT_UNWRITTEN) + XFS_RMAP_EXTENT_UNWRITTEN | \ + XFS_RMAP_EXTENT_REALTIME) /* * This is the structure used to lay out an rui log item in the diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index d5057b3..dc1e3a7 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -2203,11 +2203,13 @@ __xfs_rmap_add( enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, - struct xfs_bmbt_irec *bmap) + struct xfs_bmbt_irec *bmap, + bool realtime) { struct xfs_rmap_intent *ri; - trace_xfs_rmap_defer(mp, XFS_FSB_TO_AGNO(mp, bmap->br_startblock), + trace_xfs_rmap_defer(mp, realtime ? NULLAGNUMBER : + XFS_FSB_TO_AGNO(mp, bmap->br_startblock), type, XFS_FSB_TO_AGBNO(mp, bmap->br_startblock), owner, whichfork, @@ -2221,6 +2223,7 @@ __xfs_rmap_add( ri->ri_owner = owner; ri->ri_whichfork = whichfork; ri->ri_bmap = *bmap; + ri->ri_realtime = realtime; xfs_defer_add(dfops, XFS_DEFER_OPS_TYPE_RMAP, &ri->ri_list); return 0; @@ -2240,7 +2243,7 @@ xfs_rmap_map_extent( return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? XFS_RMAP_MAP_SHARED : XFS_RMAP_MAP, ip->i_ino, - whichfork, PREV); + whichfork, PREV, XFS_IS_REALTIME_INODE(ip)); } /* Unmap an extent out of a file. */ @@ -2257,7 +2260,7 @@ xfs_rmap_unmap_extent( return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? XFS_RMAP_UNMAP_SHARED : XFS_RMAP_UNMAP, ip->i_ino, - whichfork, PREV); + whichfork, PREV, XFS_IS_REALTIME_INODE(ip)); } /* Convert a data fork extent from unwritten to real or vice versa. */ @@ -2274,7 +2277,7 @@ xfs_rmap_convert_extent( return __xfs_rmap_add(mp, dfops, xfs_is_reflink_inode(ip) ? XFS_RMAP_CONVERT_SHARED : XFS_RMAP_CONVERT, ip->i_ino, - whichfork, PREV); + whichfork, PREV, XFS_IS_REALTIME_INODE(ip)); } /* Schedule the creation of an rmap for non-file data. */ @@ -2298,7 +2301,7 @@ xfs_rmap_alloc_extent( bmap.br_state = XFS_EXT_NORM; return __xfs_rmap_add(mp, dfops, XFS_RMAP_ALLOC, owner, - XFS_DATA_FORK, &bmap); + XFS_DATA_FORK, &bmap, false); } /* Schedule the deletion of an rmap for non-file data. */ @@ -2322,7 +2325,7 @@ xfs_rmap_free_extent( bmap.br_state = XFS_EXT_NORM; return __xfs_rmap_add(mp, dfops, XFS_RMAP_FREE, owner, - XFS_DATA_FORK, &bmap); + XFS_DATA_FORK, &bmap, false); } /* Is there a record covering a given extent? */ diff --git a/libxfs/xfs_rmap.h b/libxfs/xfs_rmap.h index 3574377..0850310 100644 --- a/libxfs/xfs_rmap.h +++ b/libxfs/xfs_rmap.h @@ -180,6 +180,7 @@ struct xfs_rmap_intent { __uint64_t ri_owner; int ri_whichfork; struct xfs_bmbt_irec ri_bmap; + bool ri_realtime; }; /* functions for updating the rmapbt based on bmbt map/unmap operations */ From darrick.wong@oracle.com Thu Aug 25 18:59:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 465CC8419 for ; Thu, 25 Aug 2016 18:59:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E01B38F8037 for ; Thu, 25 Aug 2016 16:59:51 -0700 (PDT) X-ASG-Debug-ID: 1472169589-0bf8155c741e9a50001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 3zljgclq5fcPfxCp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNxmP5032080 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:49 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNxmd9007657 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 25 Aug 2016 23:59:48 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7PNxltq004248; Thu, 25 Aug 2016 23:59:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:46 -0700 Subject: [PATCH 11/29] xfs: add realtime reverse map inode to superblock From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 11/29] xfs: add realtime reverse map inode to superblock To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:45 -0700 Message-ID: <147216958525.7022.10338035699781363413.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169590 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5358 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Add a field to the superblock to record the rt rmap inode and load it at mount time. Signed-off-by: Darrick J. Wong --- include/xfs_mount.h | 1 + libxfs/init.c | 6 ++++-- libxfs/xfs_format.h | 10 +++++++++- libxfs/xfs_inode_fork.c | 11 +++++++++++ libxfs/xfs_rtrmap_btree.c | 2 +- libxfs/xfs_sb.c | 2 ++ 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/include/xfs_mount.h b/include/xfs_mount.h index fcc0d95..8e9c9f0 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -42,6 +42,7 @@ typedef struct xfs_mount { uint m_rsumsize; /* size of rt summary, bytes */ struct xfs_inode *m_rbmip; /* pointer to bitmap inode */ struct xfs_inode *m_rsumip; /* pointer to summary inode */ + struct xfs_inode *m_rrmapip; /* realtime rmap inode */ struct xfs_buftarg *m_ddev_targp; struct xfs_buftarg *m_logdev_targp; struct xfs_buftarg *m_rtdev_targp; diff --git a/libxfs/init.c b/libxfs/init.c index e3f8a5d..3217ec7 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -458,7 +458,7 @@ rtmount_init( (uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels * sbp->sb_rbmblocks; mp->m_rsumsize = roundup(mp->m_rsumsize, sbp->sb_blocksize); - mp->m_rbmip = mp->m_rsumip = NULL; + mp->m_rbmip = mp->m_rsumip = mp->m_rrmapip = NULL; /* * Allow debugger to be run without the realtime device present. @@ -830,11 +830,13 @@ libxfs_mount( void libxfs_rtmount_destroy(xfs_mount_t *mp) { + if (mp->m_rrmapip) + IRELE(mp->m_rrmapip); if (mp->m_rsumip) IRELE(mp->m_rsumip); if (mp->m_rbmip) IRELE(mp->m_rbmip); - mp->m_rsumip = mp->m_rbmip = NULL; + mp->m_rsumip = mp->m_rbmip = mp->m_rrmapip = NULL; } /* diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index 82ff6fc..5fb5e52 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -183,6 +183,7 @@ typedef struct xfs_sb { xfs_ino_t sb_pquotino; /* project quota inode */ xfs_lsn_t sb_lsn; /* last write sequence */ uuid_t sb_meta_uuid; /* metadata file system unique id */ + xfs_ino_t sb_rrmapino; /* realtime reverse map inode */ /* must be padded to 64 bit alignment */ } xfs_sb_t; @@ -270,6 +271,7 @@ typedef struct xfs_dsb { __be64 sb_pquotino; /* project quota inode */ __be64 sb_lsn; /* last write sequence */ uuid_t sb_meta_uuid; /* metadata file system unique id */ + __be64 sb_rrmapino; /* realtime reverse map inode */ /* must be padded to 64 bit alignment */ } xfs_dsb_t; @@ -553,6 +555,11 @@ static inline bool xfs_sb_version_hasrmapbt(struct xfs_sb *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT); } +static inline bool xfs_sb_version_hasrtrmapbt(struct xfs_sb *sbp) +{ + return sbp->sb_rblocks > 0 && xfs_sb_version_hasrmapbt(sbp); +} + static inline bool xfs_sb_version_hasreflink(struct xfs_sb *sbp) { return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && @@ -948,7 +955,8 @@ typedef enum xfs_dinode_fmt { XFS_DINODE_FMT_LOCAL, /* bulk data */ XFS_DINODE_FMT_EXTENTS, /* struct xfs_bmbt_rec */ XFS_DINODE_FMT_BTREE, /* struct xfs_bmdr_block */ - XFS_DINODE_FMT_UUID /* uuid_t */ + XFS_DINODE_FMT_UUID, /* uuid_t */ + XFS_DINODE_FMT_RMAP, /* reverse mapping btree */ } xfs_dinode_fmt_t; /* diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index 6ed0254..b006e2f 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -191,6 +191,13 @@ xfs_iformat_fork( case XFS_DINODE_FMT_BTREE: error = xfs_iformat_btree(ip, dip, XFS_DATA_FORK); break; + case XFS_DINODE_FMT_RMAP: + if (!xfs_sb_version_hasrtrmapbt(&ip->i_mount->m_sb)) + return -EFSCORRUPTED; + if (ip->i_ino != ip->i_mount->m_sb.sb_rrmapino) + return -EFSCORRUPTED; + /* to be implemented later */ + break; default: XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW, ip->i_mount); @@ -793,6 +800,10 @@ xfs_iflush_fork( } break; + case XFS_DINODE_FMT_RMAP: + /* to be implemented later */ + break; + default: ASSERT(0); break; diff --git a/libxfs/xfs_rtrmap_btree.c b/libxfs/xfs_rtrmap_btree.c index 66c9190..e4dbe88 100644 --- a/libxfs/xfs_rtrmap_btree.c +++ b/libxfs/xfs_rtrmap_btree.c @@ -352,7 +352,7 @@ xfs_rtrmapbt_verify( if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) return false; - if (!xfs_btree_lblock_v5hdr_verify(bp, XFS_RMAP_OWN_UNKNOWN)) + if (!xfs_btree_lblock_v5hdr_verify(bp, mp->m_sb.sb_rrmapino)) return false; level = be16_to_cpu(block->bb_level); if (level > mp->m_rtrmap_maxlevels) diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 2e6afe9..14ec707 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -426,6 +426,7 @@ __xfs_sb_from_disk( uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid); else uuid_copy(&to->sb_meta_uuid, &from->sb_uuid); + to->sb_rrmapino = be64_to_cpu(from->sb_rrmapino); /* Convert on-disk flags to in-memory flags? */ if (convert_xquota) xfs_sb_quota_from_disk(to); @@ -569,6 +570,7 @@ xfs_sb_to_disk( to->sb_lsn = cpu_to_be64(from->sb_lsn); if (xfs_sb_version_hasmetauuid(from)) uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid); + to->sb_rrmapino = cpu_to_be64(from->sb_rrmapino); } } From darrick.wong@oracle.com Thu Aug 25 18:59:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8735A8423 for ; Thu, 25 Aug 2016 18:59:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5A35F8F8035 for ; Thu, 25 Aug 2016 16:59:59 -0700 (PDT) X-ASG-Debug-ID: 1472169596-0bf57c55b41c83a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id H2EmjDxvrF668788 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 16:59:56 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7PNxtDf032131 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:59:55 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNxtVg012140 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 25 Aug 2016 23:59:55 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7PNxskJ005990; Thu, 25 Aug 2016 23:59:54 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 16:59:53 -0700 Subject: [PATCH 12/29] xfs: wire up a new inode fork type for the realtime rmap From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 12/29] xfs: wire up a new inode fork type for the realtime rmap To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:51 -0700 Message-ID: <147216959175.7022.847188187496926834.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169596 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 15618 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Plumb in the pieces we need to embed the root of the realtime rmap btree in an inode's data fork, complete with new fork type and on-disk interpretation functions. Signed-off-by: Darrick J. Wong --- libxfs/xfs_format.h | 8 + libxfs/xfs_inode_fork.c | 48 ++++++++- libxfs/xfs_rtrmap_btree.c | 250 +++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_rtrmap_btree.h | 49 +++++++++ 4 files changed, 353 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_format.h b/libxfs/xfs_format.h index 5fb5e52..b3f595e 100644 --- a/libxfs/xfs_format.h +++ b/libxfs/xfs_format.h @@ -1478,6 +1478,14 @@ typedef __be32 xfs_rmap_ptr_t; #define XFS_RTRMAP_CRC_MAGIC 0x4d415052 /* 'MAPR' */ /* + * rtrmap root header, on-disk form only. + */ +struct xfs_rtrmap_root { + __be16 bb_level; /* 0 is a leaf */ + __be16 bb_numrecs; /* current # of data records */ +}; + +/* * Data record structure */ struct xfs_rtrmap_rec { diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index b006e2f..b0dea20 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -28,12 +28,14 @@ #include "xfs_trace.h" #include "xfs_attr_sf.h" #include "xfs_da_format.h" +#include "xfs_rtrmap_btree.h" kmem_zone_t *xfs_ifork_zone; STATIC int xfs_iformat_local(xfs_inode_t *, xfs_dinode_t *, int, int); STATIC int xfs_iformat_extents(xfs_inode_t *, xfs_dinode_t *, int); STATIC int xfs_iformat_btree(xfs_inode_t *, xfs_dinode_t *, int); +STATIC int xfs_iformat_rmap(struct xfs_inode *, struct xfs_dinode *); #ifdef DEBUG /* @@ -196,7 +198,7 @@ xfs_iformat_fork( return -EFSCORRUPTED; if (ip->i_ino != ip->i_mount->m_sb.sb_rrmapino) return -EFSCORRUPTED; - /* to be implemented later */ + error = xfs_iformat_rmap(ip, dip); break; default: XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW, @@ -472,6 +474,37 @@ xfs_iformat_btree( return 0; } +/* The file is a reverse mapping tree. */ +STATIC int +xfs_iformat_rmap( + struct xfs_inode *ip, + struct xfs_dinode *dip) +{ + struct xfs_rtrmap_root *dfp; + struct xfs_ifork *ifp; + /* REFERENCED */ + int size; + int whichfork = XFS_DATA_FORK; + + ifp = XFS_IFORK_PTR(ip, whichfork); + dfp = (struct xfs_rtrmap_root *)XFS_DFORK_PTR(dip, whichfork); + size = XFS_RTRMAP_BROOT_SPACE(dfp); + + ifp->if_broot_bytes = size; + ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS); + ASSERT(ifp->if_broot != NULL); + /* + * Copy and convert from the on-disk structure + * to the in-memory structure. + */ + xfs_rtrmapbt_from_disk(ip, dfp, + XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), + ifp->if_broot, size); + ifp->if_flags = XFS_IFBROOT; + + return 0; +} + /* * Read in extents from a btree-format inode. * Allocate and fill in if_extents. Real work is done in xfs_bmap.c. @@ -801,7 +834,18 @@ xfs_iflush_fork( break; case XFS_DINODE_FMT_RMAP: - /* to be implemented later */ + ASSERT(whichfork == XFS_DATA_FORK); + ASSERT(ip->i_ino == mp->m_sb.sb_rrmapino); + if ((iip->ili_fields & brootflag[whichfork]) && + (ifp->if_broot_bytes > 0)) { + ASSERT(ifp->if_broot != NULL); + ASSERT(XFS_RTRMAP_ROOT_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + xfs_rtrmapbt_to_disk(mp, ifp->if_broot, + ifp->if_broot_bytes, + (struct xfs_rtrmap_root *)cp, + XFS_DFORK_SIZE(dip, mp, whichfork)); + } break; default: diff --git a/libxfs/xfs_rtrmap_btree.c b/libxfs/xfs_rtrmap_btree.c index e4dbe88..503e64e 100644 --- a/libxfs/xfs_rtrmap_btree.c +++ b/libxfs/xfs_rtrmap_btree.c @@ -222,6 +222,42 @@ xfs_rtrmapbt_get_maxrecs( return cur->bc_mp->m_rtrmap_mxr[level != 0]; } +/* + * Calculate number of records in a realtime rmap btree inode root. + */ +STATIC int +xfs_rtrmapbt_root_maxrecs( + int blocklen, + bool leaf) +{ + blocklen -= sizeof(struct xfs_rtrmap_root); + + if (leaf) + return blocklen / sizeof(struct xfs_rtrmap_rec); + return blocklen / (2 * sizeof(struct xfs_rtrmap_key) + + sizeof(xfs_rtrmap_ptr_t)); +} + +/* + * Get the maximum records we could store in the on-disk format. + * + * For non-root nodes this is equivalent to xfs_bmbt_get_maxrecs, but + * for the root node this checks the available space in the dinode fork + * so that we can resize the in-memory buffer to match it. After a + * resize to the maximum size this function returns the same value + * as xfs_bmbt_get_maxrecs for the root node, too. + */ +STATIC int +xfs_rtrmapbt_get_dmaxrecs( + struct xfs_btree_cur *cur, + int level) +{ + if (level != cur->bc_nlevels - 1) + return cur->bc_mp->m_rtrmap_mxr[level != 0]; + return xfs_rtrmapbt_root_maxrecs(cur->bc_private.b.forksize, + level == 0); +} + STATIC void xfs_rtrmapbt_init_key_from_rec( union xfs_btree_key *key, @@ -339,6 +375,129 @@ xfs_rtrmapbt_diff_two_keys( return 0; } +/* + * Reallocate the space for if_broot based on the number of records + * being added or deleted as indicated in rec_diff. Move the records + * and pointers in if_broot to fit the new size. When shrinking this + * will eliminate holes between the records and pointers created by + * the caller. When growing this will create holes to be filled in + * by the caller. + * + * The caller must not request to add more records than would fit in + * the on-disk inode root. If the if_broot is currently NULL, then + * if we are adding records, one will be allocated. The caller must also + * not request that the number of records go below zero, although + * it can go to zero. + */ +STATIC void +xfs_rtrmapbt_iroot_realloc( + struct xfs_btree_cur *cur, + int rec_diff) +{ + struct xfs_inode *ip = cur->bc_private.b.ip; + int whichfork = cur->bc_private.b.whichfork; + struct xfs_mount *mp = ip->i_mount; + int cur_max; + struct xfs_ifork *ifp; + struct xfs_btree_block *new_broot; + struct xfs_btree_block *broot; + int new_max; + size_t new_size; + char *np; + char *op; + int level; + + /* + * Handle the degenerate case quietly. + */ + if (rec_diff == 0) { + return; + } + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (rec_diff > 0) { + /* + * If there wasn't any memory allocated before, just + * allocate it now and get out. + */ + if (ifp->if_broot_bytes == 0) { + new_size = XFS_RTRMAP_BROOT_SPACE_CALC(rec_diff, + cur->bc_nlevels - 1); + ifp->if_broot = kmem_alloc(new_size, + KM_SLEEP | KM_NOFS); + ifp->if_broot_bytes = (int)new_size; + return; + } + + /* + * If there is already an existing if_broot, then we need + * to realloc() it and shift the pointers to their new + * location. The records don't change location because + * they are kept butted up against the btree block header. + */ + broot = (struct xfs_btree_block *)ifp->if_broot; + level = be16_to_cpu(broot->bb_level); + cur_max = xfs_rtrmapbt_maxrecs(mp, ifp->if_broot_bytes, + level == 0); + new_max = cur_max + rec_diff; + new_size = XFS_RTRMAP_BROOT_SPACE_CALC(new_max, level); + ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, + KM_SLEEP | KM_NOFS); + if (level > 0) { + op = (char *)XFS_RTRMAP_BROOT_PTR_ADDR(ifp->if_broot, + 1, ifp->if_broot_bytes); + np = (char *)XFS_RTRMAP_BROOT_PTR_ADDR(ifp->if_broot, + 1, (int)new_size); + memmove(np, op, cur_max * sizeof(xfs_fsblock_t)); + } + ifp->if_broot_bytes = (int)new_size; + ASSERT(XFS_RTRMAP_ROOT_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + return; + } + + /* + * rec_diff is less than 0. In this case, we are shrinking the + * if_broot buffer. It must already exist. If we go to zero + * records, just get rid of the root and clear the status bit. + */ + ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); + broot = (struct xfs_btree_block *)ifp->if_broot; + level = be16_to_cpu(broot->bb_level); + cur_max = xfs_rtrmapbt_maxrecs(mp, ifp->if_broot_bytes, level == 0); + new_max = cur_max + rec_diff; + if (new_max < 0) + new_max = 0; + new_size = XFS_RTRMAP_BROOT_SPACE_CALC(new_max, level); + new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); + memcpy(new_broot, ifp->if_broot, XFS_RTRMAP_BLOCK_LEN); + + /* Copy the records or keys and pointers. */ + if (level > 0) { + op = (char *)XFS_RTRMAP_KEY_ADDR(ifp->if_broot, 1); + np = (char *)XFS_RTRMAP_KEY_ADDR(new_broot, 1); + memcpy(np, op, new_max * 2 * sizeof(struct xfs_rtrmap_key)); + + op = (char *)XFS_RTRMAP_BROOT_PTR_ADDR(ifp->if_broot, 1, + ifp->if_broot_bytes); + np = (char *)XFS_RTRMAP_BROOT_PTR_ADDR(new_broot, 1, + (int)new_size); + memcpy(np, op, new_max * sizeof(xfs_fsblock_t)); + } else { + op = (char *)XFS_RTRMAP_REC_ADDR(ifp->if_broot, 1); + np = (char *)XFS_RTRMAP_REC_ADDR(new_broot, 1); + memcpy(np, op, new_max * sizeof(struct xfs_rtrmap_rec)); + } + + kmem_free(ifp->if_broot); + ifp->if_broot = new_broot; + ifp->if_broot_bytes = (int)new_size; + if (ifp->if_broot) + ASSERT(XFS_RTRMAP_ROOT_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + return; +} + static bool xfs_rtrmapbt_verify( struct xfs_buf *bp) @@ -441,12 +600,14 @@ static const struct xfs_btree_ops xfs_rtrmapbt_ops = { .free_block = xfs_rtrmapbt_free_block, .get_minrecs = xfs_rtrmapbt_get_minrecs, .get_maxrecs = xfs_rtrmapbt_get_maxrecs, + .get_dmaxrecs = xfs_rtrmapbt_get_dmaxrecs, .init_key_from_rec = xfs_rtrmapbt_init_key_from_rec, .init_high_key_from_rec = xfs_rtrmapbt_init_high_key_from_rec, .init_rec_from_cur = xfs_rtrmapbt_init_rec_from_cur, .init_ptr_from_cur = xfs_rtrmapbt_init_ptr_from_cur, .key_diff = xfs_rtrmapbt_key_diff, .buf_ops = &xfs_rtrmapbt_buf_ops, + .iroot_realloc = xfs_rtrmapbt_iroot_realloc, .diff_two_keys = xfs_rtrmapbt_diff_two_keys, .keys_inorder = xfs_rtrmapbt_keys_inorder, .recs_inorder = xfs_rtrmapbt_recs_inorder, @@ -512,3 +673,92 @@ xfs_rtrmapbt_compute_maxlevels( mp->m_rtrmap_mnr, mp->m_sb.sb_rblocks); ASSERT(mp->m_rtrmap_maxlevels <= XFS_BTREE_MAXLEVELS); } + +/* + * Convert on-disk form of btree root to in-memory form. + */ +void +xfs_rtrmapbt_from_disk( + struct xfs_inode *ip, + struct xfs_rtrmap_root *dblock, + int dblocklen, + struct xfs_btree_block *rblock, + int rblocklen) +{ + struct xfs_mount *mp = ip->i_mount; + int dmxr; + struct xfs_rtrmap_key *fkp; + __be64 *fpp; + struct xfs_rtrmap_key *tkp; + __be64 *tpp; + struct xfs_rtrmap_rec *frp; + struct xfs_rtrmap_rec *trp; + + xfs_btree_init_block_int(mp, rblock, XFS_BUF_DADDR_NULL, + XFS_RTRMAP_CRC_MAGIC, 0, 0, ip->i_ino, + XFS_BTREE_LONG_PTRS | XFS_BTREE_CRC_BLOCKS); + + rblock->bb_level = dblock->bb_level; + rblock->bb_numrecs = dblock->bb_numrecs; + + if (be16_to_cpu(rblock->bb_level) > 0) { + dmxr = xfs_rtrmapbt_maxrecs(mp, dblocklen, 0); + fkp = XFS_RTRMAP_ROOT_KEY_ADDR(dblock, 1); + tkp = XFS_RTRMAP_KEY_ADDR(rblock, 1); + fpp = XFS_RTRMAP_ROOT_PTR_ADDR(dblock, 1, dmxr); + tpp = XFS_RTRMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen); + dmxr = be16_to_cpu(dblock->bb_numrecs); + memcpy(tkp, fkp, 2 * sizeof(*fkp) * dmxr); + memcpy(tpp, fpp, sizeof(*fpp) * dmxr); + } else { + frp = XFS_RTRMAP_ROOT_REC_ADDR(dblock, 1); + trp = XFS_RTRMAP_REC_ADDR(rblock, 1); + dmxr = be16_to_cpu(dblock->bb_numrecs); + memcpy(trp, frp, sizeof(*frp) * dmxr); + } +} + +/* + * Convert in-memory form of btree root to on-disk form. + */ +void +xfs_rtrmapbt_to_disk( + struct xfs_mount *mp, + struct xfs_btree_block *rblock, + int rblocklen, + struct xfs_rtrmap_root *dblock, + int dblocklen) +{ + int dmxr; + struct xfs_rtrmap_key *fkp; + __be64 *fpp; + struct xfs_rtrmap_key *tkp; + __be64 *tpp; + struct xfs_rtrmap_rec *frp; + struct xfs_rtrmap_rec *trp; + + ASSERT(rblock->bb_magic == cpu_to_be32(XFS_RTRMAP_CRC_MAGIC)); + ASSERT(uuid_equal(&rblock->bb_u.l.bb_uuid, &mp->m_sb.sb_meta_uuid)); + ASSERT(rblock->bb_u.l.bb_blkno == cpu_to_be64(XFS_BUF_DADDR_NULL)); + ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLFSBLOCK)); + ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLFSBLOCK)); + + dblock->bb_level = rblock->bb_level; + dblock->bb_numrecs = rblock->bb_numrecs; + + if (be16_to_cpu(rblock->bb_level) > 0) { + dmxr = xfs_rtrmapbt_maxrecs(mp, dblocklen, 0); + fkp = XFS_RTRMAP_KEY_ADDR(rblock, 1); + tkp = XFS_RTRMAP_ROOT_KEY_ADDR(dblock, 1); + fpp = XFS_RTRMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen); + tpp = XFS_RTRMAP_ROOT_PTR_ADDR(dblock, 1, dmxr); + dmxr = be16_to_cpu(rblock->bb_numrecs); + memcpy(tkp, fkp, 2 * sizeof(*fkp) * dmxr); + memcpy(tpp, fpp, sizeof(*fpp) * dmxr); + } else { + frp = XFS_RTRMAP_REC_ADDR(rblock, 1); + trp = XFS_RTRMAP_ROOT_REC_ADDR(dblock, 1); + dmxr = be16_to_cpu(rblock->bb_numrecs); + memcpy(trp, frp, sizeof(*frp) * dmxr); + } +} diff --git a/libxfs/xfs_rtrmap_btree.h b/libxfs/xfs_rtrmap_btree.h index 5eb19f4..51adc0c 100644 --- a/libxfs/xfs_rtrmap_btree.h +++ b/libxfs/xfs_rtrmap_btree.h @@ -54,9 +54,58 @@ struct xfs_mount; (maxrecs) * 2 * sizeof(struct xfs_rtrmap_key) + \ ((index) - 1) * sizeof(xfs_rtrmap_ptr_t))) +/* Macros for handling the inode root */ + +#define XFS_RTRMAP_ROOT_REC_ADDR(block, index) \ + ((struct xfs_rtrmap_rec *) \ + ((char *)(block) + \ + sizeof(struct xfs_rtrmap_root) + \ + ((index) - 1) * sizeof(struct xfs_rtrmap_rec))) + +#define XFS_RTRMAP_ROOT_KEY_ADDR(block, index) \ + ((struct xfs_rtrmap_key *) \ + ((char *)(block) + \ + sizeof(struct xfs_rtrmap_root) + \ + ((index) - 1) * 2 * sizeof(struct xfs_rtrmap_key))) + +#define XFS_RTRMAP_ROOT_PTR_ADDR(block, index, maxrecs) \ + ((xfs_rtrmap_ptr_t *) \ + ((char *)(block) + \ + sizeof(struct xfs_rtrmap_root) + \ + (maxrecs) * 2 * sizeof(struct xfs_rtrmap_key) + \ + ((index) - 1) * sizeof(xfs_rtrmap_ptr_t))) + +#define XFS_RTRMAP_BROOT_PTR_ADDR(bb, i, sz) \ + XFS_RTRMAP_PTR_ADDR(bb, i, xfs_rtrmapbt_maxrecs(mp, sz, 0)) + +#define XFS_RTRMAP_BROOT_SPACE_CALC(nrecs, level) \ + (int)(XFS_RTRMAP_BLOCK_LEN + ((level) > 0 ? \ + ((nrecs) * (2 * sizeof(struct xfs_rtrmap_key) + sizeof(xfs_rtrmap_ptr_t))) : \ + ((nrecs) * sizeof(struct xfs_rtrmap_rec)))) + +#define XFS_RTRMAP_BROOT_SPACE(bb) \ + (XFS_RTRMAP_BROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs), \ + be16_to_cpu((bb)->bb_level))) + +#define XFS_RTRMAP_ROOT_SPACE_CALC(nrecs, level) \ + (int)(sizeof(struct xfs_rtrmap_root) + ((level) > 0 ? \ + ((nrecs) * (2 * sizeof(struct xfs_rtrmap_key) + sizeof(xfs_rtrmap_ptr_t))) : \ + ((nrecs) * sizeof(struct xfs_rtrmap_rec)))) + +#define XFS_RTRMAP_ROOT_SPACE(bb) \ + (XFS_RTRMAP_ROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs), \ + be16_to_cpu((bb)->bb_level))) + struct xfs_btree_cur *xfs_rtrmapbt_init_cursor(struct xfs_mount *mp, struct xfs_trans *tp, struct xfs_inode *ip); int xfs_rtrmapbt_maxrecs(struct xfs_mount *mp, int blocklen, bool leaf); extern void xfs_rtrmapbt_compute_maxlevels(struct xfs_mount *mp); +void xfs_rtrmapbt_from_disk(struct xfs_inode *ip, + struct xfs_rtrmap_root *dblock, int dblocklen, + struct xfs_btree_block *rblock, int rblocklen); +void xfs_rtrmapbt_to_disk(struct xfs_mount *mp, + struct xfs_btree_block *rblock, int rblocklen, + struct xfs_rtrmap_root *dblock, int dblocklen); + #endif /* __XFS_RTRMAP_BTREE_H__ */ From darrick.wong@oracle.com Thu Aug 25 19:00:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D1B3842B for ; Thu, 25 Aug 2016 19:00:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 34AF58F8035 for ; Thu, 25 Aug 2016 17:00:05 -0700 (PDT) X-ASG-Debug-ID: 1472169602-0bf57b5311209f20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id RrGbZvAIqCkBkudD (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:03 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q0012f032185 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:00:01 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7Q001It018981 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:00:01 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q000Gn026149; Fri, 26 Aug 2016 00:00:00 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:00 -0700 Subject: [PATCH 13/29] xfs: don't assume a left rmap when allocating a new rmap From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 13/29] xfs: don't assume a left rmap when allocating a new rmap To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 16:59:59 -0700 Message-ID: <147216959911.7022.5271004764125497550.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169603 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1591 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The original rmap code assumed that there would always be at least one rmap in the rmapbt (the AG sb/agf/agi) and so errored out if it didn't find one. This assumption isn't true for rtrmapbt, so remove the check and just deal with the situation. Signed-off-by: Darrick J. Wong --- libxfs/xfs_rmap.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index dc1e3a7..4ed2f2e 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -706,19 +706,19 @@ xfs_rmap_map( &have_lt); if (error) goto out_error; - XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error); - - error = xfs_rmap_get_rec(cur, <rec, &have_lt); - if (error) - goto out_error; - XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error); - trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, - xfs_rmap_cur_agno(cur), ltrec.rm_startblock, - ltrec.rm_blockcount, ltrec.rm_owner, - ltrec.rm_offset, ltrec.rm_flags); + if (have_lt) { + error = xfs_rmap_get_rec(cur, <rec, &have_lt); + if (error) + goto out_error; + XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error); + trace_xfs_rmap_lookup_le_range_result(cur->bc_mp, + xfs_rmap_cur_agno(cur), ltrec.rm_startblock, + ltrec.rm_blockcount, ltrec.rm_owner, + ltrec.rm_offset, ltrec.rm_flags); - if (!xfs_rmap_is_mergeable(<rec, owner, flags)) - have_lt = 0; + if (!xfs_rmap_is_mergeable(<rec, owner, flags)) + have_lt = 0; + } XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 0 || From darrick.wong@oracle.com Thu Aug 25 19:00:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AF9A68433 for ; Thu, 25 Aug 2016 19:00:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 562E6304043 for ; Thu, 25 Aug 2016 17:00:19 -0700 (PDT) X-ASG-Debug-ID: 1472169616-0bf8155c771e9b10001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id zftTjPfGUEwxESiT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:17 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q00Fxu006396 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:16 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00B2R009577 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:14 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q006Ni004414; Fri, 26 Aug 2016 00:00:07 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:06 -0700 Subject: [PATCH 14/29] xfs: wire up rmap map and unmap to the realtime rmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 14/29] xfs: wire up rmap map and unmap to the realtime rmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:05 -0700 Message-ID: <147216960528.7022.7032026127533793722.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169617 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5753 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Connect the map and unmap reverse-mapping operations to the realtime rmapbt via the deferred operation callbacks. This enables us to perform rmap operations against the correct btree. Signed-off-by: Darrick J. Wong --- libxfs/defer_item.c | 3 ++ libxfs/xfs_rmap.c | 63 +++++++++++++++++++++++++++++++++------------------ libxfs/xfs_rmap.h | 9 ++++--- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/libxfs/defer_item.c b/libxfs/defer_item.c index d4cd876..58b646f 100644 --- a/libxfs/defer_item.c +++ b/libxfs/defer_item.c @@ -200,13 +200,14 @@ xfs_rmap_update_finish_item( int error; rmap = container_of(item, struct xfs_rmap_intent, ri_list); - error = xfs_rmap_finish_one(tp, + error = xfs_rmap_finish_one(tp, dop, rmap->ri_type, rmap->ri_owner, rmap->ri_whichfork, rmap->ri_bmap.br_startoff, rmap->ri_bmap.br_startblock, rmap->ri_bmap.br_blockcount, rmap->ri_bmap.br_state, + rmap->ri_realtime, (struct xfs_btree_cur **)state); kmem_free(rmap); return error; diff --git a/libxfs/xfs_rmap.c b/libxfs/xfs_rmap.c index 4ed2f2e..55744b7 100644 --- a/libxfs/xfs_rmap.c +++ b/libxfs/xfs_rmap.c @@ -36,6 +36,7 @@ #include "xfs_trace.h" #include "xfs_bmap.h" #include "xfs_inode.h" +#include "xfs_rtrmap_btree.h" /* By convention, the rtrmapbt's "AG" number is NULLAGNUMBER. */ static xfs_agnumber_t @@ -2060,13 +2061,14 @@ xfs_rmap_finish_one_cleanup( struct xfs_btree_cur *rcur, int error) { - struct xfs_buf *agbp; + struct xfs_buf *agbp = NULL; if (rcur == NULL) return; - agbp = rcur->bc_private.a.agbp; + if (!(rcur->bc_flags & XFS_BTREE_LONG_PTRS)) + agbp = rcur->bc_private.a.agbp; xfs_btree_del_cursor(rcur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); - if (error) + if (error && agbp) xfs_trans_brelse(tp, agbp); } @@ -2080,6 +2082,7 @@ xfs_rmap_finish_one_cleanup( int xfs_rmap_finish_one( struct xfs_trans *tp, + struct xfs_defer_ops *dfops, enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, @@ -2087,6 +2090,7 @@ xfs_rmap_finish_one( xfs_fsblock_t startblock, xfs_filblks_t blockcount, xfs_exntst_t state, + bool realtime, struct xfs_btree_cur **pcur) { struct xfs_mount *mp = tp->t_mountp; @@ -2098,9 +2102,8 @@ xfs_rmap_finish_one( xfs_fsblock_t bno; bool unwritten; - agno = XFS_FSB_TO_AGNO(mp, startblock); - ASSERT(agno != NULLAGNUMBER); - bno = XFS_FSB_TO_AGBNO(mp, startblock); + agno = realtime ? NULLAGNUMBER : XFS_FSB_TO_AGNO(mp, startblock); + bno = realtime ? startblock : XFS_FSB_TO_AGBNO(mp, startblock); trace_xfs_rmap_deferred(mp, agno, type, bno, owner, whichfork, startoff, blockcount, state); @@ -2120,31 +2123,45 @@ xfs_rmap_finish_one( *pcur = NULL; } if (rcur == NULL) { - /* - * Refresh the freelist before we start changing the - * rmapbt, because a shape change could cause us to - * allocate blocks. - */ - error = xfs_free_extent_fix_freelist(tp, agno, &agbp); - if (error) - return error; - if (!agbp) - return -EFSCORRUPTED; - - rcur = xfs_rmapbt_init_cursor(mp, tp, agbp, agno); - if (!rcur) { - error = -ENOMEM; - goto out_cur; + if (realtime) { + xfs_ilock(mp->m_rrmapip, + XFS_ILOCK_EXCL|XFS_ILOCK_RTBITMAP); + xfs_trans_ijoin(tp, mp->m_rrmapip, XFS_ILOCK_EXCL); + rcur = xfs_rtrmapbt_init_cursor(mp, tp, mp->m_rrmapip); + if (!rcur) { + error = -ENOMEM; + goto out_cur; + } + rcur->bc_private.b.dfops = dfops; + rcur->bc_private.b.flags = 0; + } else { + /* + * Refresh the freelist before we start changing the + * rmapbt, because a shape change could cause us to + * allocate blocks. + */ + error = xfs_free_extent_fix_freelist(tp, agno, &agbp); + if (error) + return error; + if (!agbp) + return -EFSCORRUPTED; + + rcur = xfs_rmapbt_init_cursor(mp, tp, agbp, agno); + if (!rcur) { + error = -ENOMEM; + goto out_cur; + } } } *pcur = rcur; xfs_rmap_ino_owner(&oinfo, owner, whichfork, startoff); unwritten = state == XFS_EXT_UNWRITTEN; - bno = XFS_FSB_TO_AGBNO(rcur->bc_mp, startblock); switch (type) { case XFS_RMAP_ALLOC: + ASSERT(!realtime); + /* fall through */ case XFS_RMAP_MAP: error = xfs_rmap_map(rcur, bno, blockcount, unwritten, &oinfo); break; @@ -2153,6 +2170,8 @@ xfs_rmap_finish_one( &oinfo); break; case XFS_RMAP_FREE: + ASSERT(!realtime); + /* fall through */ case XFS_RMAP_UNMAP: error = xfs_rmap_unmap(rcur, bno, blockcount, unwritten, &oinfo); diff --git a/libxfs/xfs_rmap.h b/libxfs/xfs_rmap.h index 0850310..8d9c48f 100644 --- a/libxfs/xfs_rmap.h +++ b/libxfs/xfs_rmap.h @@ -202,10 +202,11 @@ int xfs_rmap_free_extent(struct xfs_mount *mp, struct xfs_defer_ops *dfops, void xfs_rmap_finish_one_cleanup(struct xfs_trans *tp, struct xfs_btree_cur *rcur, int error); -int xfs_rmap_finish_one(struct xfs_trans *tp, enum xfs_rmap_intent_type type, - __uint64_t owner, int whichfork, xfs_fileoff_t startoff, - xfs_fsblock_t startblock, xfs_filblks_t blockcount, - xfs_exntst_t state, struct xfs_btree_cur **pcur); +int xfs_rmap_finish_one(struct xfs_trans *tp, struct xfs_defer_ops *dfops, + enum xfs_rmap_intent_type type, __uint64_t owner, int whichfork, + xfs_fileoff_t startoff, xfs_fsblock_t startblock, + xfs_filblks_t blockcount, xfs_exntst_t state, bool realtime, + struct xfs_btree_cur **pcur); int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_fsblock_t bno, uint64_t owner, uint64_t offset, unsigned int flags, From darrick.wong@oracle.com Thu Aug 25 19:00:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 158EC843D for ; Thu, 25 Aug 2016 19:00:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CC827304043 for ; Thu, 25 Aug 2016 17:00:22 -0700 (PDT) X-ASG-Debug-ID: 1472169620-0bf8155c741e9b30001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 3wJ6qpTi6YUuJYsE (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:21 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q00Jus000384 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:00:19 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q00J9W014199 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:19 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00DXk004603; Fri, 26 Aug 2016 00:00:13 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:12 -0700 Subject: [PATCH 15/29] xfs: scrub the realtime rmapbt From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 15/29] xfs: scrub the realtime rmapbt To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:11 -0700 Message-ID: <147216961151.7022.12610377850464261933.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169621 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 825 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Check the realtime reverse mapping btree against the rtbitmap, and modify the rtbitmap scrub to check against the rtrmapbt. Signed-off-by: Darrick J. Wong --- libxfs/xfs_fs.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libxfs/xfs_fs.h b/libxfs/xfs_fs.h index 2c37d57..112afc0 100644 --- a/libxfs/xfs_fs.h +++ b/libxfs/xfs_fs.h @@ -575,7 +575,8 @@ struct xfs_scrub_metadata { #define XFS_SCRUB_TYPE_BMBTC 13 /* CoW fork block mapping */ #define XFS_SCRUB_TYPE_RTBITMAP 14 /* realtime bitmap */ #define XFS_SCRUB_TYPE_RTSUM 15 /* realtime summary */ -#define XFS_SCRUB_TYPE_MAX 15 +#define XFS_SCRUB_TYPE_RTRMAPBT 16 /* realtime reverse mapping btree */ +#define XFS_SCRUB_TYPE_MAX 16 #define XFS_SCRUB_FLAGS_ALL 0x0 /* no flags yet */ From darrick.wong@oracle.com Thu Aug 25 19:00:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1DDF58445 for ; Thu, 25 Aug 2016 19:00:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D58E6304039 for ; Thu, 25 Aug 2016 17:00:24 -0700 (PDT) X-ASG-Debug-ID: 1472169621-0bf57c55b31c83d0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id jvG10u4FOeNAJY7X (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:22 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q00K35000428 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:00:20 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7Q00Jee021210 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:00:20 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q00JqG006467; Fri, 26 Aug 2016 00:00:19 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:19 -0700 Subject: [PATCH 16/29] xfs_db: display the realtime rmap btree contents From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 16/29] xfs_db: display the realtime rmap btree contents To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:17 -0700 Message-ID: <147216961770.7022.4301373430070142149.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169622 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 21995 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Implement all the code we need to dump rtrmapbt contents, starting from the root inode. Signed-off-by: Darrick J. Wong --- db/bmroot.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++ db/bmroot.h | 2 + db/btblock.c | 100 +++++++++++++++++++++++++++++++ db/btblock.h | 5 ++ db/field.c | 13 ++++ db/field.h | 6 ++ db/inode.c | 18 +++++- db/sb.c | 1 db/type.c | 5 ++ db/type.h | 8 +- libxfs/libxfs_api_defs.h | 1 man/man8/xfs_db.8 | 60 ++++++++++++++++++- 12 files changed, 362 insertions(+), 6 deletions(-) diff --git a/db/bmroot.c b/db/bmroot.c index 7697e61..8ad3637 100644 --- a/db/bmroot.c +++ b/db/bmroot.c @@ -36,6 +36,13 @@ static int bmrootd_key_offset(void *obj, int startoff, int idx); static int bmrootd_ptr_count(void *obj, int startoff); static int bmrootd_ptr_offset(void *obj, int startoff, int idx); +static int rtrmaproot_rec_count(void *obj, int startoff); +static int rtrmaproot_rec_offset(void *obj, int startoff, int idx); +static int rtrmaproot_key_count(void *obj, int startoff); +static int rtrmaproot_key_offset(void *obj, int startoff, int idx); +static int rtrmaproot_ptr_count(void *obj, int startoff); +static int rtrmaproot_ptr_offset(void *obj, int startoff, int idx); + #define OFF(f) bitize(offsetof(xfs_bmdr_block_t, bb_ ## f)) const field_t bmroota_flds[] = { { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, @@ -66,6 +73,20 @@ const field_t bmrootd_key_flds[] = { { NULL } }; +/* realtime rmap btree root */ +const field_t rtrmaproot_flds[] = { + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "recs", FLDT_RTRMAPBTREC, rtrmaproot_rec_offset, rtrmaproot_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_RTRMAPBTKEY, rtrmaproot_key_offset, rtrmaproot_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_RTRMAPBTPTR, rtrmaproot_ptr_offset, rtrmaproot_ptr_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_RTRMAPBT }, + { NULL } +}; +#undef OFF + static int bmroota_key_count( void *obj, @@ -253,3 +274,131 @@ bmrootd_size( dip = obj; return bitize((int)XFS_DFORK_DSIZE(dip, mp)); } + +/* realtime rmap root */ +static int +rtrmaproot_rec_count( + void *obj, + int startoff) +{ + struct xfs_rtrmap_root *block; +#ifdef DEBUG + struct xfs_dinode *dip = obj; +#endif + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + block = (struct xfs_rtrmap_root *)((char *)obj + byteize(startoff)); + ASSERT((char *)block == XFS_DFORK_DPTR(dip)); + if (be16_to_cpu(block->bb_level) > 0) + return 0; + return be16_to_cpu(block->bb_numrecs); +} + +static int +rtrmaproot_rec_offset( + void *obj, + int startoff, + int idx) +{ + struct xfs_rtrmap_root *block; + struct xfs_rtrmap_rec *kp; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + block = (struct xfs_rtrmap_root *)((char *)obj + byteize(startoff)); + ASSERT(be16_to_cpu(block->bb_level) == 0); + kp = XFS_RTRMAP_ROOT_REC_ADDR(block, idx); + return bitize((int)((char *)kp - (char *)block)); +} + +static int +rtrmaproot_key_count( + void *obj, + int startoff) +{ + struct xfs_rtrmap_root *block; +#ifdef DEBUG + struct xfs_dinode *dip = obj; +#endif + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + block = (struct xfs_rtrmap_root *)((char *)obj + byteize(startoff)); + ASSERT((char *)block == XFS_DFORK_DPTR(dip)); + if (be16_to_cpu(block->bb_level) == 0) + return 0; + return be16_to_cpu(block->bb_numrecs); +} + +static int +rtrmaproot_key_offset( + void *obj, + int startoff, + int idx) +{ + struct xfs_rtrmap_root *block; + struct xfs_rtrmap_key *kp; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + block = (struct xfs_rtrmap_root *)((char *)obj + byteize(startoff)); + ASSERT(be16_to_cpu(block->bb_level) > 0); + kp = XFS_RTRMAP_ROOT_KEY_ADDR(block, idx); + return bitize((int)((char *)kp - (char *)block)); +} + +static int +rtrmaproot_ptr_count( + void *obj, + int startoff) +{ + struct xfs_rtrmap_root *block; +#ifdef DEBUG + struct xfs_dinode *dip = obj; +#endif + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + block = (struct xfs_rtrmap_root *)((char *)obj + byteize(startoff)); + ASSERT((char *)block == XFS_DFORK_DPTR(dip)); + if (be16_to_cpu(block->bb_level) == 0) + return 0; + return be16_to_cpu(block->bb_numrecs); +} + +static int +rtrmaproot_ptr_offset( + void *obj, + int startoff, + int idx) +{ + struct xfs_rtrmap_root *block; + xfs_rtrmap_ptr_t *pp; + struct xfs_dinode *dip; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + dip = obj; + block = (struct xfs_rtrmap_root *)((char *)obj + byteize(startoff)); + ASSERT(be16_to_cpu(block->bb_level) > 0); + pp = XFS_RTRMAP_ROOT_PTR_ADDR(block, idx, + libxfs_rtrmapbt_maxrecs(mp, XFS_DFORK_DSIZE(dip, mp), + 0)); + return bitize((int)((char *)pp - (char *)block)); +} + +int +rtrmaproot_size( + void *obj, + int startoff, + int idx) +{ + struct xfs_dinode *dip; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + ASSERT(idx == 0); + dip = obj; + return bitize((int)XFS_DFORK_DSIZE(dip, mp)); +} diff --git a/db/bmroot.h b/db/bmroot.h index 4cb4d23..6e105a7 100644 --- a/db/bmroot.h +++ b/db/bmroot.h @@ -20,6 +20,8 @@ extern const struct field bmroota_flds[]; extern const struct field bmroota_key_flds[]; extern const struct field bmrootd_flds[]; extern const struct field bmrootd_key_flds[]; +extern const struct field rtrmaproot_flds[]; extern int bmroota_size(void *obj, int startoff, int idx); extern int bmrootd_size(void *obj, int startoff, int idx); +extern int rtrmaproot_size(void *obj, int startoff, int idx); diff --git a/db/btblock.c b/db/btblock.c index e0c896b..39037a2 100644 --- a/db/btblock.c +++ b/db/btblock.c @@ -102,6 +102,12 @@ struct xfs_db_btree { sizeof(struct xfs_rmap_rec), sizeof(__be32), }, + { XFS_RTRMAP_CRC_MAGIC, + XFS_BTREE_LBLOCK_CRC_LEN, + 2 * sizeof(struct xfs_rtrmap_key), + sizeof(struct xfs_rtrmap_rec), + sizeof(__be64), + }, { XFS_REFC_CRC_MAGIC, XFS_BTREE_SBLOCK_CRC_LEN, sizeof(struct xfs_refcount_key), @@ -714,6 +720,100 @@ const field_t rmapbt_rec_flds[] = { }; #undef ROFF +/* realtime RMAP btree blocks */ +const field_t rtrmapbt_crc_hfld[] = { + { "", FLDT_RTRMAPBT_CRC, OI(0), C1, 0, TYP_NONE }, + { NULL } +}; + +#define OFF(f) bitize(offsetof(struct xfs_btree_block, bb_ ## f)) +const field_t rtrmapbt_crc_flds[] = { + { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, + { "level", FLDT_UINT16D, OI(OFF(level)), C1, 0, TYP_NONE }, + { "numrecs", FLDT_UINT16D, OI(OFF(numrecs)), C1, 0, TYP_NONE }, + { "leftsib", FLDT_DFSBNO, OI(OFF(u.l.bb_leftsib)), C1, 0, TYP_RTRMAPBT }, + { "rightsib", FLDT_DFSBNO, OI(OFF(u.l.bb_rightsib)), C1, 0, TYP_RTRMAPBT }, + { "bno", FLDT_DFSBNO, OI(OFF(u.l.bb_blkno)), C1, 0, TYP_RTRMAPBT }, + { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, + { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, + { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "recs", FLDT_RTRMAPBTREC, btblock_rec_offset, btblock_rec_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "keys", FLDT_RTRMAPBTKEY, btblock_key_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { "ptrs", FLDT_RTRMAPBTPTR, btblock_ptr_offset, btblock_key_count, + FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_RTRMAPBT }, + { NULL } +}; +#undef OFF + +#define KOFF(f) bitize(offsetof(struct xfs_rtrmap_key, rm_ ## f)) + +#define RTRMAPBK_STARTBLOCK_BITOFF 0 +#define RTRMAPBK_OWNER_BITOFF (RTRMAPBK_STARTBLOCK_BITOFF + RTRMAPBT_STARTBLOCK_BITLEN) +#define RTRMAPBK_ATTRFLAG_BITOFF (RTRMAPBK_OWNER_BITOFF + RTRMAPBT_OWNER_BITLEN) +#define RTRMAPBK_BMBTFLAG_BITOFF (RTRMAPBK_ATTRFLAG_BITOFF + RTRMAPBT_ATTRFLAG_BITLEN) +#define RTRMAPBK_EXNTFLAG_BITOFF (RTRMAPBK_BMBTFLAG_BITOFF + RTRMAPBT_BMBTFLAG_BITLEN) +#define RTRMAPBK_UNUSED_OFFSET_BITOFF (RTRMAPBK_EXNTFLAG_BITOFF + RTRMAPBT_EXNTFLAG_BITLEN) +#define RTRMAPBK_OFFSET_BITOFF (RTRMAPBK_UNUSED_OFFSET_BITOFF + RTRMAPBT_UNUSED_OFFSET_BITLEN) + +#define HI_KOFF(f) bitize(sizeof(struct xfs_rtrmap_key) + offsetof(struct xfs_rtrmap_key, rm_ ## f)) + +#define RTRMAPBK_STARTBLOCKHI_BITOFF (bitize(sizeof(struct xfs_rtrmap_key))) +#define RTRMAPBK_OWNERHI_BITOFF (RTRMAPBK_STARTBLOCKHI_BITOFF + RTRMAPBT_STARTBLOCK_BITLEN) +#define RTRMAPBK_ATTRFLAGHI_BITOFF (RTRMAPBK_OWNERHI_BITOFF + RTRMAPBT_OWNER_BITLEN) +#define RTRMAPBK_BMBTFLAGHI_BITOFF (RTRMAPBK_ATTRFLAGHI_BITOFF + RTRMAPBT_ATTRFLAG_BITLEN) +#define RTRMAPBK_EXNTFLAGHI_BITOFF (RTRMAPBK_BMBTFLAGHI_BITOFF + RTRMAPBT_BMBTFLAG_BITLEN) +#define RTRMAPBK_UNUSED_OFFSETHI_BITOFF (RTRMAPBK_EXNTFLAGHI_BITOFF + RTRMAPBT_EXNTFLAG_BITLEN) +#define RTRMAPBK_OFFSETHI_BITOFF (RTRMAPBK_UNUSED_OFFSETHI_BITOFF + RTRMAPBT_UNUSED_OFFSET_BITLEN) + +const field_t rtrmapbt_key_flds[] = { + { "startblock", FLDT_DRTBNO, OI(KOFF(startblock)), C1, 0, TYP_DATA }, + { "owner", FLDT_INT64D, OI(KOFF(owner)), C1, 0, TYP_NONE }, + { "offset", FLDT_RFILEOFFD, OI(RTRMAPBK_OFFSET_BITOFF), C1, 0, TYP_NONE }, + { "attrfork", FLDT_RATTRFORKFLG, OI(RTRMAPBK_ATTRFLAG_BITOFF), C1, 0, + TYP_NONE }, + { "bmbtblock", FLDT_RBMBTFLG, OI(RTRMAPBK_BMBTFLAG_BITOFF), C1, 0, + TYP_NONE }, + { "startblock_hi", FLDT_DRTBNO, OI(HI_KOFF(startblock)), C1, 0, TYP_DATA }, + { "owner_hi", FLDT_INT64D, OI(HI_KOFF(owner)), C1, 0, TYP_NONE }, + { "offset_hi", FLDT_RFILEOFFD, OI(RTRMAPBK_OFFSETHI_BITOFF), C1, 0, TYP_NONE }, + { "attrfork_hi", FLDT_RATTRFORKFLG, OI(RTRMAPBK_ATTRFLAGHI_BITOFF), C1, 0, + TYP_NONE }, + { "bmbtblock_hi", FLDT_RBMBTFLG, OI(RTRMAPBK_BMBTFLAGHI_BITOFF), C1, 0, + TYP_NONE }, + { NULL } +}; +#undef HI_KOFF +#undef KOFF + +#define ROFF(f) bitize(offsetof(struct xfs_rtrmap_rec, rm_ ## f)) + +#define RTRMAPBT_STARTBLOCK_BITOFF 0 +#define RTRMAPBT_BLOCKCOUNT_BITOFF (RTRMAPBT_STARTBLOCK_BITOFF + RTRMAPBT_STARTBLOCK_BITLEN) +#define RTRMAPBT_OWNER_BITOFF (RTRMAPBT_BLOCKCOUNT_BITOFF + RTRMAPBT_BLOCKCOUNT_BITLEN) +#define RTRMAPBT_ATTRFLAG_BITOFF (RTRMAPBT_OWNER_BITOFF + RTRMAPBT_OWNER_BITLEN) +#define RTRMAPBT_BMBTFLAG_BITOFF (RTRMAPBT_ATTRFLAG_BITOFF + RTRMAPBT_ATTRFLAG_BITLEN) +#define RTRMAPBT_EXNTFLAG_BITOFF (RTRMAPBT_BMBTFLAG_BITOFF + RTRMAPBT_BMBTFLAG_BITLEN) +#define RTRMAPBT_UNUSED_OFFSET_BITOFF (RTRMAPBT_EXNTFLAG_BITOFF + RTRMAPBT_EXNTFLAG_BITLEN) +#define RTRMAPBT_OFFSET_BITOFF (RTRMAPBT_UNUSED_OFFSET_BITOFF + RTRMAPBT_UNUSED_OFFSET_BITLEN) + +const field_t rtrmapbt_rec_flds[] = { + { "startblock", FLDT_DRFSBNO, OI(RTRMAPBT_STARTBLOCK_BITOFF), C1, 0, TYP_DATA }, + { "blockcount", FLDT_RTREXTLEN, OI(RTRMAPBT_BLOCKCOUNT_BITOFF), C1, 0, TYP_NONE }, + { "owner", FLDT_INT64D, OI(RTRMAPBT_OWNER_BITOFF), C1, 0, TYP_NONE }, + { "offset", FLDT_RFILEOFFD, OI(RTRMAPBT_OFFSET_BITOFF), C1, 0, TYP_NONE }, + { "extentflag", FLDT_REXTFLG, OI(RTRMAPBT_EXNTFLAG_BITOFF), C1, 0, + TYP_NONE }, + { "attrfork", FLDT_RATTRFORKFLG, OI(RTRMAPBT_ATTRFLAG_BITOFF), C1, 0, + TYP_NONE }, + { "bmbtblock", FLDT_RBMBTFLG, OI(RTRMAPBT_BMBTFLAG_BITOFF), C1, 0, + TYP_NONE }, + { NULL } +}; +#undef ROFF + /* refcount btree blocks */ const field_t refcbt_crc_hfld[] = { { "", FLDT_REFCBT_CRC, OI(0), C1, 0, TYP_NONE }, diff --git a/db/btblock.h b/db/btblock.h index fead2f1..2c83487 100644 --- a/db/btblock.h +++ b/db/btblock.h @@ -59,6 +59,11 @@ extern const struct field rmapbt_crc_hfld[]; extern const struct field rmapbt_key_flds[]; extern const struct field rmapbt_rec_flds[]; +extern const struct field rtrmapbt_crc_flds[]; +extern const struct field rtrmapbt_crc_hfld[]; +extern const struct field rtrmapbt_key_flds[]; +extern const struct field rtrmapbt_rec_flds[]; + extern const struct field refcbt_crc_flds[]; extern const struct field refcbt_crc_hfld[]; extern const struct field refcbt_key_flds[]; diff --git a/db/field.c b/db/field.c index e0e7066..baac271 100644 --- a/db/field.c +++ b/db/field.c @@ -155,6 +155,8 @@ const ftattr_t ftattrtab[] = { { FLDT_CHARS, "chars", fp_num, "%c", SI(bitsz(char)), 0, NULL, NULL }, { FLDT_REXTLEN, "rextlen", fp_num, "%u", SI(RMAPBT_BLOCKCOUNT_BITLEN), 0, NULL, NULL }, + { FLDT_RTREXTLEN, "rtrextlen", fp_num, "%llu", SI(bitsz(uint64_t)), + 0, NULL, NULL }, { FLDT_RFILEOFFD, "rfileoffd", fp_num, "%llu", SI(RMAPBT_OFFSET_BITLEN), 0, NULL, NULL }, { FLDT_REXTFLG, "rextflag", fp_num, "%u", SI(RMAPBT_EXNTFLAG_BITLEN), 0, @@ -183,6 +185,17 @@ const ftattr_t ftattrtab[] = { { FLDT_RMAPBTREC, "rmapbtrec", fp_sarray, (char *)rmapbt_rec_flds, SI(bitsz(struct xfs_rmap_rec)), 0, NULL, rmapbt_rec_flds }, + { FLDT_RTRMAPBT_CRC, "rtrmapbt", NULL, (char *)rtrmapbt_crc_flds, btblock_size, + FTARG_SIZE, NULL, rtrmapbt_crc_flds }, + { FLDT_RTRMAPBTKEY, "rtrmapbtkey", fp_sarray, (char *)rtrmapbt_key_flds, + SI(bitize(2 * sizeof(struct xfs_rtrmap_key))), 0, NULL, rtrmapbt_key_flds }, + { FLDT_RTRMAPBTPTR, "rtrmapbtptr", fp_num, "%llu", + SI(bitsz(xfs_rtrmap_ptr_t)), 0, fa_dfsbno, NULL }, + { FLDT_RTRMAPBTREC, "rtrmapbtrec", fp_sarray, (char *)rtrmapbt_rec_flds, + SI(bitsz(struct xfs_rtrmap_rec)), 0, NULL, rtrmapbt_rec_flds }, + { FLDT_RTRMAPROOT, "rtrmaproot", NULL, (char *)rtrmaproot_flds, rtrmaproot_size, + FTARG_SIZE, NULL, rtrmaproot_flds }, + { FLDT_REFCBT_CRC, "refcntbt", NULL, (char *)refcbt_crc_flds, btblock_size, FTARG_SIZE, NULL, refcbt_crc_flds }, { FLDT_REFCBTKEY, "refcntbtkey", fp_sarray, (char *)refcbt_key_flds, diff --git a/db/field.h b/db/field.h index ae5f490..4537559 100644 --- a/db/field.h +++ b/db/field.h @@ -76,6 +76,7 @@ typedef enum fldt { FLDT_CHARNS, FLDT_CHARS, FLDT_REXTLEN, + FLDT_RTREXTLEN, FLDT_RFILEOFFD, FLDT_REXTFLG, FLDT_RATTRFORKFLG, @@ -89,6 +90,11 @@ typedef enum fldt { FLDT_RMAPBTKEY, FLDT_RMAPBTPTR, FLDT_RMAPBTREC, + FLDT_RTRMAPBT_CRC, + FLDT_RTRMAPBTKEY, + FLDT_RTRMAPBTPTR, + FLDT_RTRMAPBTREC, + FLDT_RTRMAPROOT, FLDT_REFCBT_CRC, FLDT_REFCBTKEY, FLDT_REFCBTPTR, diff --git a/db/inode.c b/db/inode.c index cac19fc..70019d8 100644 --- a/db/inode.c +++ b/db/inode.c @@ -49,6 +49,7 @@ static int inode_u_muuid_count(void *obj, int startoff); static int inode_u_sfdir2_count(void *obj, int startoff); static int inode_u_sfdir3_count(void *obj, int startoff); static int inode_u_symlink_count(void *obj, int startoff); +static int inode_u_rtrmapbt_count(void *obj, int startoff); static const cmdinfo_t inode_cmd = { "inode", NULL, inode_f, 0, 1, 1, "[inode#]", @@ -204,6 +205,7 @@ const field_t inode_u_flds[] = { { "sfdir3", FLDT_DIR3SF, NULL, inode_u_sfdir3_count, FLD_COUNT, TYP_NONE }, { "symlink", FLDT_CHARNS, NULL, inode_u_symlink_count, FLD_COUNT, TYP_NONE }, + { "rtrmapbt", FLDT_RTRMAPROOT, NULL, inode_u_rtrmapbt_count, FLD_COUNT, TYP_NONE }, { NULL } }; @@ -217,7 +219,7 @@ const field_t inode_a_flds[] = { }; static const char *dinode_fmt_name[] = - { "dev", "local", "extents", "btree", "uuid" }; + { "dev", "local", "extents", "btree", "uuid", "rtrmapbt" }; static const int dinode_fmt_name_size = sizeof(dinode_fmt_name) / sizeof(dinode_fmt_name[0]); @@ -585,6 +587,20 @@ inode_u_sfdir3_count( xfs_sb_version_hasftype(&mp->m_sb); } +static int +inode_u_rtrmapbt_count( + void *obj, + int startoff) +{ + xfs_dinode_t *dip; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + dip = obj; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_RMAP; +} + int inode_u_size( void *obj, diff --git a/db/sb.c b/db/sb.c index 8e7722c..eb308ad 100644 --- a/db/sb.c +++ b/db/sb.c @@ -125,6 +125,7 @@ const field_t sb_flds[] = { { "pquotino", FLDT_INO, OI(OFF(pquotino)), C1, 0, TYP_INODE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, { "meta_uuid", FLDT_UUID, OI(OFF(meta_uuid)), C1, 0, TYP_NONE }, + { "rrmapino", FLDT_INO, OI(OFF(rrmapino)), C1, 0, TYP_INODE }, { NULL } }; diff --git a/db/type.c b/db/type.c index 10fa54e..9d74ded 100644 --- a/db/type.c +++ b/db/type.c @@ -61,6 +61,7 @@ static const typ_t __typtab[] = { { TYP_BNOBT, "bnobt", handle_struct, bnobt_hfld, NULL, TYP_F_NO_CRC_OFF }, { TYP_CNTBT, "cntbt", handle_struct, cntbt_hfld, NULL, TYP_F_NO_CRC_OFF }, { TYP_RMAPBT, NULL }, + { TYP_RTRMAPBT, NULL }, { TYP_REFCBT, NULL }, { TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF }, { TYP_DIR2, "dir2", handle_struct, dir2_hfld, NULL, TYP_F_NO_CRC_OFF }, @@ -98,6 +99,8 @@ static const typ_t __typtab_crc[] = { &xfs_allocbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_RMAPBT, "rmapbt", handle_struct, rmapbt_crc_hfld, &xfs_rmapbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, + { TYP_RTRMAPBT, "rtrmapbt", handle_struct, rtrmapbt_crc_hfld, + &xfs_rtrmapbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_REFCBT, "refcntbt", handle_struct, refcbt_crc_hfld, &xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF }, @@ -142,6 +145,8 @@ static const typ_t __typtab_spcrc[] = { &xfs_allocbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_RMAPBT, "rmapbt", handle_struct, rmapbt_crc_hfld, &xfs_rmapbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, + { TYP_RTRMAPBT, "rtrmapbt", handle_struct, rtrmapbt_crc_hfld, + &xfs_rtrmapbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_REFCBT, "refcntbt", handle_struct, refcbt_crc_hfld, &xfs_refcountbt_buf_ops, XFS_BTREE_SBLOCK_CRC_OFF }, { TYP_DATA, "data", handle_block, NULL, NULL, TYP_F_NO_CRC_OFF }, diff --git a/db/type.h b/db/type.h index 87ff107..5a65900 100644 --- a/db/type.h +++ b/db/type.h @@ -24,10 +24,10 @@ struct field; typedef enum typnm { TYP_AGF, TYP_AGFL, TYP_AGI, TYP_ATTR, TYP_BMAPBTA, - TYP_BMAPBTD, TYP_BNOBT, TYP_CNTBT, TYP_RMAPBT, TYP_REFCBT, TYP_DATA, - TYP_DIR2, TYP_DQBLK, TYP_INOBT, TYP_INODATA, TYP_INODE, - TYP_LOG, TYP_RTBITMAP, TYP_RTSUMMARY, TYP_SB, TYP_SYMLINK, - TYP_TEXT, TYP_FINOBT, TYP_NONE + TYP_BMAPBTD, TYP_BNOBT, TYP_CNTBT, TYP_RMAPBT, TYP_RTRMAPBT, + TYP_REFCBT, TYP_DATA, TYP_DIR2, TYP_DQBLK, TYP_INOBT, + TYP_INODATA, TYP_INODE, TYP_LOG, TYP_RTBITMAP, TYP_RTSUMMARY, + TYP_SB, TYP_SYMLINK, TYP_TEXT, TYP_FINOBT, TYP_NONE } typnm_t; #define DB_WRITE 1 diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 8d57a66..c66e31b 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -142,5 +142,6 @@ #define xfs_refcount_get_rec libxfs_refcount_get_rec #define xfs_rmap_lookup_le_range libxfs_rmap_lookup_le_range #define xfs_refc_block libxfs_refc_block +#define xfs_rtrmapbt_maxrecs libxfs_rtrmapbt_maxrecs #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index 514e3aa..a9d2c81 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -683,7 +683,7 @@ The possible data types are: .BR agf ", " agfl ", " agi ", " attr ", " bmapbta ", " bmapbtd , .BR bnobt ", " cntbt ", " data ", " dir ", " dir2 ", " dqblk , .BR inobt ", " inode ", " log ", " refcntbt ", " rmapbt ", " rtbitmap , -.BR rtsummary ", " sb ", " symlink " and " text . +.BR rtsummary ", " sb ", " symlink ", " rtrmapbt ", and " text . See the TYPES section below for more information on these data types. .TP .BI "uuid [" uuid " | " generate " | " rewrite " | " restore ] @@ -1764,6 +1764,64 @@ block number within the allocation group to the next level in the Btree. .PD .RE .TP +.B rtrmapbt +There is one reverse mapping Btree for the entire realtime device. The +.BR startblock " and " +.B blockcount +fields are 64 bits wide and record block counts on the realtime device. The +root of this Btree is the reverse-mapping inode, which is recorded in the +superblock +.B rrmapino +field. Blocks are linked to sibling left and right blocks at each level, as +well as by pointers from parent to child blocks. Each block has the following +fields: +.RS 1.4i +.PD 0 +.TP 1.2i +.B magic +RTRMAP block magic number, 0x4d415052 ('MAPR'). +.TP +.B level +level number of this block, 0 is a leaf. +.TP +.B numrecs +number of data entries in the block. +.TP +.B leftsib +left (logically lower) sibling block, 0 if none. +.TP +.B rightsib +right (logically higher) sibling block, 0 if none. +.TP +.B recs +[leaf blocks only] array of reference count records. Each record contains +.BR startblock , +.BR blockcount , +.BR owner , +.BR offset , +.BR attr_fork , +.BR bmbt_block , +and +.BR unwritten . +.TP +.B keys +[non-leaf blocks only] array of double-key records. The first ("low") key +contains the first value of each block in the level below this one. The second +("high") key contains the largest key that can be used to identify any record +in the subtree. Each record contains +.BR startblock , +.BR owner , +.BR offset , +.BR attr_fork , +and +.BR bmbt_block . +.TP +.B ptrs +[non-leaf blocks only] array of child block pointers. Each pointer is a +block number within the allocation group to the next level in the Btree. +.PD +.RE +.TP .B rtbitmap If the filesystem has a realtime subvolume, then the .B rbmino From darrick.wong@oracle.com Thu Aug 25 19:00:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E0B23844D for ; Thu, 25 Aug 2016 19:00:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52F36AC002 for ; Thu, 25 Aug 2016 17:00:31 -0700 (PDT) X-ASG-Debug-ID: 1472169628-0bf57c55b41c83f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id YeniwbaR9F8PSbgX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:29 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q00Quo006619 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:27 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00QUw025541 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:26 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00Pqr004905; Fri, 26 Aug 2016 00:00:26 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:25 -0700 Subject: [PATCH 17/29] xfs_db: support rudimentary checks of the rtrmap btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 17/29] xfs_db: support rudimentary checks of the rtrmap btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:24 -0700 Message-ID: <147216962409.7022.6402301314358084964.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169629 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9020 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Perform some fairly superficial checks of the rtrmap btree. We'll do more sophisticated checks in xfs_repair, but provide enough of a spot-check here that we can do simple things. Signed-off-by: Darrick J. Wong --- db/check.c | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 182 insertions(+), 9 deletions(-) diff --git a/db/check.c b/db/check.c index 7392852..7ffd5bb 100644 --- a/db/check.c +++ b/db/check.c @@ -45,7 +45,7 @@ typedef enum { DBM_LOG, DBM_MISSING, DBM_QUOTA, DBM_RTBITMAP, DBM_RTDATA, DBM_RTFREE, DBM_RTSUM, DBM_SB, DBM_SYMLINK, DBM_BTFINO, DBM_BTRMAP, DBM_BTREFC, - DBM_RLDATA, DBM_COWDATA, + DBM_RLDATA, DBM_COWDATA, DBM_BTRTRMAP, DBM_NDBM } dbm_t; @@ -176,6 +176,8 @@ static const char *typename[] = { "btrmap", "btrefcnt", "rldata", + "cowdata", + "btrtrmap", NULL }; static int verbose; @@ -316,6 +318,9 @@ static void process_quota(qtype_t qtype, inodata_t *id, blkmap_t *blkmap); static void process_rtbitmap(blkmap_t *blkmap); static void process_rtsummary(blkmap_t *blkmap); +static void process_rtrmap(struct inodata *id, + struct xfs_dinode *dip, + xfs_rfsblock_t *toti); static xfs_ino_t process_sf_dir_v2(xfs_dinode_t *dip, int *dot, int *dotdot, inodata_t *id); static void quota_add(xfs_dqid_t *p, xfs_dqid_t *g, xfs_dqid_t *u, @@ -343,6 +348,12 @@ static void scanfunc_bmap(struct xfs_btree_block *block, xfs_rfsblock_t *toti, xfs_extnum_t *nex, blkmap_t **blkmapp, int isroot, typnm_t btype); +static void scanfunc_rtrmap(struct xfs_btree_block *block, + int level, dbm_t type, xfs_fsblock_t bno, + inodata_t *id, xfs_rfsblock_t *totd, + xfs_rfsblock_t *toti, xfs_extnum_t *nex, + blkmap_t **blkmapp, int isroot, + typnm_t btype); static void scanfunc_bno(struct xfs_btree_block *block, int level, xfs_agf_t *agf, xfs_agblock_t bno, int isroot); @@ -1060,6 +1071,7 @@ blocktrash_f( (1 << DBM_QUOTA) | (1 << DBM_RTBITMAP) | (1 << DBM_RTSUM) | + (1 << DBM_BTRTRMAP) | (1 << DBM_SYMLINK) | (1 << DBM_BTFINO) | (1 << DBM_BTRMAP) | @@ -2706,7 +2718,7 @@ process_inode( 0 /* type 15 unused */ }; static char *fmtnames[] = { - "dev", "local", "extents", "btree", "uuid" + "dev", "local", "extents", "btree", "uuid", "rtrmap" }; libxfs_inode_from_disk(&xino, dip); @@ -2761,12 +2773,23 @@ process_inode( be32_to_cpu(dip->di_next_unlinked), ino); error++; } - /* - * di_mode is a 16-bit uint so no need to check the < 0 case - */ + + /* Check that mode and data fork format match. */ mode = be16_to_cpu(dip->di_mode); - if ((((mode & S_IFMT) >> 12) > 15) || - (!(okfmts[(mode & S_IFMT) >> 12] & (1 << xino.i_d.di_format)))) { + if (ino == mp->m_sb.sb_rrmapino) { + if ((mode & S_IFMT) != S_IFREG || + xino.i_d.di_format != XFS_DINODE_FMT_RMAP) { + if (v) + dbprintf(_("bad format %d for rtrmap inode %lld type %#o\n"), + xino.i_d.di_format, id->ino, mode & S_IFMT); + error++; + return; + } + } else if ((((mode & S_IFMT) >> 12) > 15) || + (!(okfmts[(mode & S_IFMT) >> 12] & (1 << xino.i_d.di_format)))) { + /* + * di_mode is a 16-bit uint so no need to check the < 0 case + */ if (v) dbprintf(_("bad format %d for inode %lld type %#o\n"), xino.i_d.di_format, id->ino, mode & S_IFMT); @@ -2823,8 +2846,10 @@ process_inode( type = DBM_RTSUM; blkmap = blkmap_alloc(xino.i_d.di_nextents); addlink_inode(id); - } - else if (id->ino == mp->m_sb.sb_uquotino || + } else if (id->ino == mp->m_sb.sb_rrmapino) { + type = DBM_BTRTRMAP; + addlink_inode(id); + } else if (id->ino == mp->m_sb.sb_uquotino || id->ino == mp->m_sb.sb_gquotino || id->ino == mp->m_sb.sb_pquotino) { type = DBM_QUOTA; @@ -2861,6 +2886,9 @@ process_inode( process_btinode(id, dip, type, &totdblocks, &totiblocks, &nextents, &blkmap, XFS_DATA_FORK); break; + case XFS_DINODE_FMT_RMAP: + process_rtrmap(id, dip, &totiblocks); + break; } if (XFS_DFORK_Q(dip)) { sbversion |= XFS_SB_VERSION_ATTRBIT; @@ -3604,6 +3632,71 @@ process_rtsummary( } } +static void +process_rtrmap( + struct inodata *id, + struct xfs_dinode *dip, + xfs_rfsblock_t *toti) +{ + xfs_extnum_t nex = 0; + xfs_rfsblock_t totd = 0; + struct xfs_rtrmap_root *dib; + int whichfork = XFS_DATA_FORK; + int i; + xfs_rtrmap_ptr_t *pp; + + dib = (struct xfs_rtrmap_root *)XFS_DFORK_PTR(dip, whichfork); + if (be16_to_cpu(dib->bb_level) >= mp->m_rtrmap_maxlevels) { + if (!sflag || id->ilist) + dbprintf(_("level for ino %lld rtrmap root too " + "large (%u)\n"), + id->ino, + be16_to_cpu(dib->bb_level)); + error++; + return; + } + if (be16_to_cpu(dib->bb_numrecs) > libxfs_rtrmapbt_maxrecs(mp, + XFS_DFORK_SIZE(dip, mp, whichfork), + be16_to_cpu(dib->bb_level) == 0)) { + if (!sflag || id->ilist) + dbprintf(_("numrecs for ino %lld rtrmap root too " + "large (%u)\n"), + id->ino, + be16_to_cpu(dib->bb_numrecs)); + error++; + return; + } + if (be16_to_cpu(dib->bb_level) == 0) { + struct xfs_rtrmap_rec *rp; + xfs_fsblock_t lastblock; + + rp = XFS_RTRMAP_ROOT_REC_ADDR(dib, 1); + lastblock = 0; + for (i = 0; i < be16_to_cpu(dib->bb_numrecs); i++) { + if (be64_to_cpu(rp[i].rm_startblock) < lastblock) { + dbprintf(_( + "out-of-order rtrmap btree record %d (%u %u) root\n"), + i, be64_to_cpu(rp[i].rm_startblock), + be32_to_cpu(rp[i].rm_startblock)); + } else { + lastblock = be64_to_cpu(rp[i].rm_startblock) + + be64_to_cpu(rp[i].rm_blockcount); + } + } + return; + } else { + pp = XFS_RTRMAP_ROOT_PTR_ADDR(dib, 1, + libxfs_rtrmapbt_maxrecs(mp, + XFS_DFORK_SIZE(dip, mp, whichfork), 0)); + for (i = 0; i < be16_to_cpu(dib->bb_numrecs); i++) + scan_lbtree(get_unaligned_be64(&pp[i]), + be16_to_cpu(dib->bb_level), + scanfunc_rtrmap, DBM_BTRTRMAP, + id, &totd, toti, + &nex, NULL, 1, TYP_RTRMAPBT); + } +} + static xfs_ino_t process_sf_dir_v2( xfs_dinode_t *dip, @@ -4691,6 +4784,86 @@ scanfunc_rmap( } static void +scanfunc_rtrmap( + struct xfs_btree_block *block, + int level, + dbm_t type, + xfs_fsblock_t bno, + inodata_t *id, + xfs_rfsblock_t *totd, + xfs_rfsblock_t *toti, + xfs_extnum_t *nex, + blkmap_t **blkmapp, + int isroot, + typnm_t btype) +{ + xfs_agblock_t agbno; + xfs_agnumber_t agno; + int i; + xfs_rtrmap_ptr_t *pp; + struct xfs_rtrmap_rec *rp; + xfs_fsblock_t lastblock; + + agno = XFS_FSB_TO_AGNO(mp, bno); + agbno = XFS_FSB_TO_AGBNO(mp, bno); + if (be32_to_cpu(block->bb_magic) != XFS_RTRMAP_CRC_MAGIC) { + dbprintf(_("bad magic # %#x in rtrmapbt block %u/%u\n"), + be32_to_cpu(block->bb_magic), agno, bno); + serious_error++; + return; + } + if (be16_to_cpu(block->bb_level) != level) { + if (!sflag) + dbprintf(_("expected level %d got %d in rtrmapbt block " + "%u/%u\n"), + level, be16_to_cpu(block->bb_level), agno, bno); + error++; + } + set_dbmap(agno, bno, 1, type, agno, bno); + set_inomap(agno, agbno, 1, id); + (*toti)++; + if (level == 0) { + if (be16_to_cpu(block->bb_numrecs) > mp->m_rtrmap_mxr[0] || + (isroot == 0 && be16_to_cpu(block->bb_numrecs) < mp->m_rtrmap_mnr[0])) { + dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in " + "rtrmapbt block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), mp->m_rtrmap_mnr[0], + mp->m_rtrmap_mxr[0], agno, bno); + serious_error++; + return; + } + rp = XFS_RTRMAP_REC_ADDR(block, 1); + lastblock = 0; + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) { + if (be64_to_cpu(rp[i].rm_startblock) < lastblock) { + dbprintf(_( + "out-of-order rtrmap btree record %d (%u %u) block %u/%u l %llu\n"), + i, be64_to_cpu(rp[i].rm_startblock), + be64_to_cpu(rp[i].rm_blockcount), + agno, bno, lastblock); + } else { + lastblock = be64_to_cpu(rp[i].rm_startblock) + + be64_to_cpu(rp[i].rm_blockcount); + } + } + return; + } + if (be16_to_cpu(block->bb_numrecs) > mp->m_rtrmap_mxr[1] || + (isroot == 0 && be16_to_cpu(block->bb_numrecs) < mp->m_rtrmap_mnr[1])) { + dbprintf(_("bad btree nrecs (%u, min=%u, max=%u) in rtrmapbt " + "block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), mp->m_rtrmap_mnr[1], + mp->m_rtrmap_mxr[1], agno, bno); + serious_error++; + return; + } + pp = XFS_RTRMAP_PTR_ADDR(block, 1, mp->m_rtrmap_mxr[1]); + for (i = 0; i < be16_to_cpu(block->bb_numrecs); i++) + scan_lbtree(be64_to_cpu(pp[i]), level, scanfunc_rtrmap, type, id, + totd, toti, nex, blkmapp, 0, btype); +} + +static void scanfunc_refcnt( struct xfs_btree_block *block, int level, From darrick.wong@oracle.com Thu Aug 25 19:00:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 505D48457 for ; Thu, 25 Aug 2016 19:00:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 14C568F8035 for ; Thu, 25 Aug 2016 17:00:50 -0700 (PDT) X-ASG-Debug-ID: 1472169647-0bf8155c751e9bf0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id JPXhFc0CQ73foZV3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q00kMX006757 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:46 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00kIH011942 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:46 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00jhO023188; Fri, 26 Aug 2016 00:00:46 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:45 -0700 Subject: [PATCH 20/29] xfs_io: scrub the realtime rmap From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 20/29] xfs_io: scrub the realtime rmap To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:42 -0700 Message-ID: <147216964277.7022.404152059105249323.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169648 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 418 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- io/scrub.c | 1 + 1 file changed, 1 insertion(+) diff --git a/io/scrub.c b/io/scrub.c index 8b93121..82825de 100644 --- a/io/scrub.c +++ b/io/scrub.c @@ -49,6 +49,7 @@ static const struct scrub_descr scrubbers[] = { {"bmapbtc", false}, {"rtbitmap", false}, {"rtsummary", false}, + {"rtrmapbt", false}, {NULL, false}, }; From darrick.wong@oracle.com Thu Aug 25 19:00:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6EEA68458 for ; Thu, 25 Aug 2016 19:00:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 409D68F8033 for ; Thu, 25 Aug 2016 17:00:50 -0700 (PDT) X-ASG-Debug-ID: 1472169648-0bf57c55b21c8430001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id wF0fWpdReetlwtP4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q00kDO006760 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:47 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00bQW025989 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:40 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00Wcx023051; Fri, 26 Aug 2016 00:00:37 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:31 -0700 Subject: [PATCH 18/29] xfs_db: copy the realtime rmap btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 18/29] xfs_db: copy the realtime rmap btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:30 -0700 Message-ID: <147216963038.7022.4032781758440858795.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169648 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3862 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Copy the realtime rmapbt when we're metadumping the filesystem. Signed-off-by: Darrick J. Wong --- db/metadump.c | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/db/metadump.c b/db/metadump.c index ab64fbd..34f5f47 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -616,6 +616,54 @@ copy_rmap_btree( } static int +scanfunc_rtrmapbt( + struct xfs_btree_block *block, + xfs_agnumber_t agno, + xfs_agblock_t agbno, + int level, + typnm_t btype, + void *arg) +{ + xfs_rtrmap_ptr_t *pp; + int i; + int numrecs; + + if (level == 0) + return 1; + + numrecs = be16_to_cpu(block->bb_numrecs); + if (numrecs > mp->m_rtrmap_mxr[1]) { + if (show_warnings) + print_warning("invalid numrecs (%u) in %s block %u/%u", + numrecs, typtab[btype].name, agno, agbno); + return 1; + } + + pp = XFS_RTRMAP_PTR_ADDR(block, 1, mp->m_rtrmap_mxr[1]); + for (i = 0; i < numrecs; i++) { + xfs_agnumber_t pagno; + xfs_agblock_t pbno; + + pagno = XFS_FSB_TO_AGNO(mp, get_unaligned_be64(&pp[i])); + pbno = XFS_FSB_TO_AGBNO(mp, get_unaligned_be64(&pp[i])); + + if (pbno == 0 || pbno > mp->m_sb.sb_agblocks || + pagno > mp->m_sb.sb_agcount) { + if (show_warnings) + print_warning("invalid block number (%u/%u) " + "in inode %llu %s block %u/%u", + pagno, pbno, (long long)cur_ino, + typtab[btype].name, agno, agbno); + continue; + } + if (!scan_btree(pagno, pbno, level, btype, arg, + scanfunc_rtrmapbt)) + return 0; + } + return 1; +} + +static int scanfunc_refcntbt( struct xfs_btree_block *block, xfs_agnumber_t agno, @@ -2152,6 +2200,79 @@ process_exinode( } static int +process_rtrmap( + struct xfs_dinode *dip, + typnm_t itype) +{ + struct xfs_rtrmap_root *dib; + int i; + xfs_rtrmap_ptr_t *pp; + int level; + int nrecs; + int maxrecs; + int whichfork; + typnm_t btype; + + if (itype == TYP_ATTR && show_warnings) { + print_warning("ignoring rtrmapbt root in inode %llu attr fork", + (long long)cur_ino); + return 1; + } + + whichfork = XFS_DATA_FORK; + btype = TYP_RTRMAPBT; + + dib = (struct xfs_rtrmap_root *)XFS_DFORK_PTR(dip, whichfork); + level = be16_to_cpu(dib->bb_level); + nrecs = be16_to_cpu(dib->bb_numrecs); + + if (level > mp->m_rtrmap_maxlevels) { + if (show_warnings) + print_warning("invalid level (%u) in inode %lld %s " + "root", level, (long long)cur_ino, + typtab[btype].name); + return 1; + } + + if (level == 0) + return 1; + + maxrecs = libxfs_rtrmapbt_maxrecs(mp, + XFS_DFORK_SIZE(dip, mp, whichfork), 0); + if (nrecs > maxrecs) { + if (show_warnings) + print_warning("invalid numrecs (%u) in inode %lld %s " + "root", nrecs, (long long)cur_ino, + typtab[btype].name); + return 1; + } + + pp = XFS_RTRMAP_ROOT_PTR_ADDR(dib, 1, maxrecs); + for (i = 0; i < nrecs; i++) { + xfs_agnumber_t ag; + xfs_agblock_t bno; + + ag = XFS_FSB_TO_AGNO(mp, get_unaligned_be64(&pp[i])); + bno = XFS_FSB_TO_AGBNO(mp, get_unaligned_be64(&pp[i])); + + if (bno == 0 || bno > mp->m_sb.sb_agblocks || + ag > mp->m_sb.sb_agcount) { + if (show_warnings) + print_warning("invalid block number (%u/%u) " + "in inode %llu %s root", ag, + bno, (long long)cur_ino, + typtab[btype].name); + continue; + } + + if (!scan_btree(ag, bno, level, btype, &itype, + scanfunc_rtrmapbt)) + return 0; + } + return 1; +} + +static int process_inode_data( xfs_dinode_t *dip, typnm_t itype) @@ -2177,6 +2298,9 @@ process_inode_data( case XFS_DINODE_FMT_BTREE: return process_btinode(dip, itype); + + case XFS_DINODE_FMT_RMAP: + return process_rtrmap(dip, itype); } return 1; } From darrick.wong@oracle.com Thu Aug 25 19:00:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8C5448457 for ; Thu, 25 Aug 2016 19:00:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5C440304039 for ; Thu, 25 Aug 2016 17:00:51 -0700 (PDT) X-ASG-Debug-ID: 1472169648-0bf57b5311209f80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 48JRZZ5bTLui7fJ7 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:48 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q00iIE006744 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:44 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00iZL011800 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:44 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00cOH023163; Fri, 26 Aug 2016 00:00:43 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:37 -0700 Subject: [PATCH 19/29] xfs_db: make fsmap query the realtime reverse mapping tree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 19/29] xfs_db: make fsmap query the realtime reverse mapping tree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:36 -0700 Message-ID: <147216963661.7022.10313609648459852221.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169648 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3504 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Extend the 'fsmap' debugger command to support querying the realtime rmap btree via a new -r argument. Signed-off-by: Darrick J. Wong --- db/fsmap.c | 70 +++++++++++++++++++++++++++++++++++++++++++--- libxfs/libxfs_api_defs.h | 1 + 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/db/fsmap.c b/db/fsmap.c index a25461e..bb08421 100644 --- a/db/fsmap.c +++ b/db/fsmap.c @@ -36,8 +36,8 @@ fsmap_fn( { struct fsmap_info *info = priv; - dbprintf(_("%llu: %u/%u len %u owner %lld offset %llu bmbt %d attrfork %d extflag %d\n"), - info->nr, info->agno, rec->rm_startblock, + dbprintf(_("%llu: %d/%llu len %llu owner %lld offset %llu bmbt %d attrfork %d extflag %d\n"), + info->nr, (signed)info->agno, rec->rm_startblock, rec->rm_blockcount, rec->rm_owner, rec->rm_offset, !!(rec->rm_flags & XFS_RMAP_BMBT_BLOCK), !!(rec->rm_flags & XFS_RMAP_ATTR_FORK), @@ -113,6 +113,61 @@ fsmap( } } +static void +fsmap_rt( + xfs_fsblock_t start_fsb, + xfs_fsblock_t end_fsb) +{ + struct fsmap_info info; + xfs_daddr_t eofs; + struct xfs_rmap_irec low; + struct xfs_rmap_irec high; + struct xfs_btree_cur *bt_cur; + struct xfs_inode *ip; + int error; + + if (mp->m_sb.sb_rblocks == 0) + return; + + eofs = XFS_FSB_TO_BB(mp, mp->m_sb.sb_rblocks); + if (XFS_FSB_TO_DADDR(mp, end_fsb) >= eofs) + end_fsb = XFS_DADDR_TO_FSB(mp, eofs - 1); + + low.rm_startblock = start_fsb; + low.rm_owner = 0; + low.rm_offset = 0; + low.rm_flags = 0; + high.rm_startblock = end_fsb; + high.rm_owner = ULLONG_MAX; + high.rm_offset = ULLONG_MAX; + high.rm_flags = XFS_RMAP_ATTR_FORK | XFS_RMAP_BMBT_BLOCK | + XFS_RMAP_UNWRITTEN; + + info.nr = 0; + + error = -libxfs_iget(mp, NULL, mp->m_sb.sb_rrmapino, 0, &ip, 0); + if (error) { + dbprintf(_("%d - couldn't iget rtrmap inode.\n"), + error); + return; + } + + bt_cur = libxfs_rtrmapbt_init_cursor(mp, NULL, ip); + if (!bt_cur) + goto out_ino; + + info.agno = NULLAGNUMBER; + error = -libxfs_rmap_query_range(bt_cur, &low, &high, + fsmap_fn, &info); + if (error) + dbprintf(_("Error %d while querying fsmap btree.\n"), + error); + + libxfs_btree_del_cursor(bt_cur, XFS_BTREE_NOERROR); +out_ino: + IRELE(ip); +} + int fsmap_f( int argc, @@ -122,14 +177,18 @@ fsmap_f( int c; xfs_fsblock_t start_fsb = 0; xfs_fsblock_t end_fsb = NULLFSBLOCK; + bool is_rt = false; if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) { dbprintf(_("Filesystem does not support reverse mapping btree.\n")); return 0; } - while ((c = getopt(argc, argv, "")) != EOF) { + while ((c = getopt(argc, argv, "r")) != EOF) { switch (c) { + case 'r': + is_rt = true; + break; default: dbprintf(_("Bad option for fsmap command.\n")); return 0; @@ -152,7 +211,10 @@ fsmap_f( } } - fsmap(start_fsb, end_fsb); + if (is_rt) + fsmap_rt(start_fsb, end_fsb); + else + fsmap(start_fsb, end_fsb); return 0; } diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index c66e31b..a6ea865 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -143,5 +143,6 @@ #define xfs_rmap_lookup_le_range libxfs_rmap_lookup_le_range #define xfs_refc_block libxfs_refc_block #define xfs_rtrmapbt_maxrecs libxfs_rtrmapbt_maxrecs +#define xfs_rtrmapbt_init_cursor libxfs_rtrmapbt_init_cursor #endif /* __LIBXFS_API_DEFS_H__ */ From darrick.wong@oracle.com Thu Aug 25 19:00:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3BF9C8471 for ; Thu, 25 Aug 2016 19:00:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0D974304039 for ; Thu, 25 Aug 2016 17:00:56 -0700 (PDT) X-ASG-Debug-ID: 1472169654-0bf57b5312209fb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4jGZ5E8OH2ZDK9MK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:00:55 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q00re7000932 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:53 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q00rAm012417 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:00:53 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q00qoP026780; Fri, 26 Aug 2016 00:00:52 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:00:52 -0700 Subject: [PATCH 21/29] xfs_repair: factor rrmapino into superblock size calculations From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 21/29] xfs_repair: factor rrmapino into superblock size calculations To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:50 -0700 Message-ID: <147216965043.7022.10914570069501280259.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169655 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 958 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Now that we've extended the superblock with a field for the rtrmapbt inode, we must adjust the superblock size calculation to include it. This way, repair won't complain about the non-zero contents of rrmapino. Signed-off-by: Darrick J. Wong --- repair/agheader.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/repair/agheader.c b/repair/agheader.c index cce376f..8eb7f80 100644 --- a/repair/agheader.c +++ b/repair/agheader.c @@ -270,7 +270,10 @@ secondary_sb_whack( * * size is the size of data which is valid for this sb. */ - if (xfs_sb_version_hasmetauuid(sb)) + if (xfs_sb_version_hasrmapbt(sb) && mp->m_sb.sb_rblocks > 0) + size = offsetof(struct xfs_sb, sb_rrmapino) + + sizeof(sb->sb_rrmapino); + else if (xfs_sb_version_hasmetauuid(sb)) size = offsetof(xfs_sb_t, sb_meta_uuid) + sizeof(sb->sb_meta_uuid); else if (xfs_sb_version_hascrc(sb)) From darrick.wong@oracle.com Thu Aug 25 19:01:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1C4088479 for ; Thu, 25 Aug 2016 19:01:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C65AF8F8033 for ; Thu, 25 Aug 2016 17:01:07 -0700 (PDT) X-ASG-Debug-ID: 1472169665-0bf8155c771e9c60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id YuHDP557CtmS8T3n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:05 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q014Xj001595 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:01:04 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q013B9017399 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:01:04 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q013DH026914; Fri, 26 Aug 2016 00:01:03 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:02 -0700 Subject: [PATCH 22/29] xfs_repair: pass private data pointer to scan_lbtree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 22/29] xfs_repair: pass private data pointer to scan_lbtree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:00:57 -0700 Message-ID: <147216965723.7022.951619178919594524.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169665 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2762 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Pass a private data pointer through scan_lbtree. We'll use this later when scanning the rtrmapbt to keep track of scan state. Signed-off-by: Darrick J. Wong --- repair/dinode.c | 2 +- repair/scan.c | 11 +++++++---- repair/scan.h | 7 +++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 11b60ce..843c465 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -1007,7 +1007,7 @@ _("bad bmap btree ptr 0x%" PRIx64 " in ino %" PRIu64 "\n"), if (scan_lbtree(get_unaligned_be64(&pp[i]), level, scan_bmapbt, type, whichfork, lino, tot, nex, blkmapp, - &cursor, 1, check_dups, magic, + &cursor, 1, check_dups, magic, NULL, &xfs_bmbt_buf_ops)) return(1); /* diff --git a/repair/scan.c b/repair/scan.c index f4d6f89..8935be7 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -116,7 +116,8 @@ scan_lbtree( int isroot, int check_dups, int *dirty, - __uint64_t magic), + __uint64_t magic, + void *priv), int type, int whichfork, xfs_ino_t ino, @@ -127,6 +128,7 @@ scan_lbtree( int isroot, int check_dups, __uint64_t magic, + void *priv, const struct xfs_buf_ops *ops) { xfs_buf_t *bp; @@ -158,7 +160,7 @@ scan_lbtree( err = (*func)(XFS_BUF_TO_BLOCK(bp), nlevels - 1, type, whichfork, root, ino, tot, nex, blkmapp, bm_cursor, isroot, check_dups, &dirty, - magic); + magic, priv); ASSERT(dirty == 0 || (dirty && !no_modify)); @@ -185,7 +187,8 @@ scan_bmapbt( int isroot, int check_dups, int *dirty, - __uint64_t magic) + __uint64_t magic, + void *priv) { int i; int err; @@ -469,7 +472,7 @@ _("bad bmap btree ptr 0x%llx in ino %" PRIu64 "\n"), err = scan_lbtree(be64_to_cpu(pp[i]), level, scan_bmapbt, type, whichfork, ino, tot, nex, blkmapp, - bm_cursor, 0, check_dups, magic, + bm_cursor, 0, check_dups, magic, priv, &xfs_bmbt_buf_ops); if (err) return(1); diff --git a/repair/scan.h b/repair/scan.h index ea8c0bf..854897c 100644 --- a/repair/scan.h +++ b/repair/scan.h @@ -36,7 +36,8 @@ int scan_lbtree( int isroot, int check_dups, int *dirty, - __uint64_t magic), + __uint64_t magic, + void *priv), int type, int whichfork, xfs_ino_t ino, @@ -47,6 +48,7 @@ int scan_lbtree( int isroot, int check_dups, __uint64_t magic, + void *priv, const struct xfs_buf_ops *ops); int scan_bmapbt( @@ -63,7 +65,8 @@ int scan_bmapbt( int isroot, int check_dups, int *dirty, - __uint64_t magic); + __uint64_t magic, + void *priv); void scan_ags( From darrick.wong@oracle.com Thu Aug 25 19:01:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6C0848481 for ; Thu, 25 Aug 2016 19:01:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B80B8AC002 for ; Thu, 25 Aug 2016 17:01:16 -0700 (PDT) X-ASG-Debug-ID: 1472169672-0bf57b5312209fe0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id SaMx39n1tyRxOXbs (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:13 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q01BJm007640 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:11 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01AlJ030053 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:11 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q019XW026953; Fri, 26 Aug 2016 00:01:09 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:09 -0700 Subject: [PATCH 23/29] xfs_repair: use realtime rmap btree data to check block types From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 23/29] xfs_repair: use realtime rmap btree data to check block types To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:01:07 -0700 Message-ID: <147216966788.7022.1787278022218422520.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169673 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 18975 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Use the realtime rmap btree to pre-populate the block type information so that when repair iterates the primary metadata, we can confirm the block type. Signed-off-by: Darrick J. Wong --- repair/dinode.c | 170 +++++++++++++++++++++++- repair/dinode.h | 2 repair/scan.c | 391 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- repair/scan.h | 33 +++++ 4 files changed, 583 insertions(+), 13 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 843c465..6718cd2 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -423,6 +423,18 @@ verify_agbno(xfs_mount_t *mp, return verify_ag_bno(sbp, agno, agbno) == 0; } +/* + * Verify realtime device block number. + * Returns 1 for good rtfsb or 0 if it's invalid. + */ +int +verify_drtbno( + struct xfs_mount *mp, + xfs_fsblock_t fsb) +{ + return fsb < mp->m_sb.sb_rblocks; +} + static int process_rt_rec( xfs_mount_t *mp, @@ -439,7 +451,7 @@ process_rt_rec( /* * check numeric validity of the extent */ - if (irec->br_startblock >= mp->m_sb.sb_rblocks) { + if (!verify_drtbno(mp, irec->br_startblock)) { do_warn( _("inode %" PRIu64 " - bad rt extent start block number %" PRIu64 ", offset %" PRIu64 "\n"), ino, @@ -447,7 +459,7 @@ _("inode %" PRIu64 " - bad rt extent start block number %" PRIu64 ", offset %" P irec->br_startoff); return 1; } - if (irec->br_startblock + irec->br_blockcount - 1 >= mp->m_sb.sb_rblocks) { + if (!verify_drtbno(mp, irec->br_startblock + irec->br_blockcount)) { do_warn( _("inode %" PRIu64 " - bad rt extent last block number %" PRIu64 ", offset %" PRIu64 "\n"), ino, @@ -917,6 +929,145 @@ get_agino_buf( * return 1 if inode should be cleared, 0 otherwise */ static int +process_rtrmap( + struct xfs_mount *mp, + xfs_agnumber_t agno, + xfs_agino_t ino, + struct xfs_dinode *dip, + int type, + int *dirty, + xfs_rfsblock_t *tot, + __uint64_t *nex, + blkmap_t **blkmapp, + int check_dups) +{ + struct xfs_rtrmap_root *dib; + xfs_ino_t lino; + xfs_rtrmap_ptr_t *pp; + struct xfs_rtrmap_key *kp; + struct xfs_rtrmap_rec *rp; + int whichfork = XFS_DATA_FORK; + char *forkname = get_forkname(whichfork); + int i; + int level; + int numrecs; + xfs_fsblock_t bno; + struct xfs_rmap_irec oldkey; + struct xfs_rmap_irec key; + struct rmap_priv priv; + int suspect = 0; + int error; + + /* We rebuild the rtrmapbt, so no need to process blocks again. */ + if (check_dups) { + *tot = be64_to_cpu(dip->di_nblocks); + return 0; + } + + memset(&priv.high_key, 0xFF, sizeof(priv.high_key)); + priv.high_key.rm_blockcount = 0; + priv.agcnts = NULL; + priv.last_rec.rm_owner = XFS_RMAP_OWN_UNKNOWN; + + dib = (struct xfs_rtrmap_root *)XFS_DFORK_PTR(dip, whichfork); + lino = XFS_AGINO_TO_INO(mp, agno, ino); + *tot = 0; + *nex = 0; + + level = be16_to_cpu(dib->bb_level); + numrecs = be16_to_cpu(dib->bb_numrecs); + + if (level > mp->m_rtrmap_maxlevels) { + do_warn( +_("bad level %d in inode %" PRIu64 " rtrmap btree root block\n"), + level, lino); + return 1; + } + + /* + * use rtroot/dfork_dsize since the root block is in the data fork + */ + if (XFS_RTRMAP_ROOT_SPACE_CALC(numrecs, level) > + XFS_DFORK_SIZE(dip, mp, whichfork)) { + do_warn( +_("indicated size of %s rtrmapbt root (%d bytes) greater than space in " + "inode %" PRIu64 " %s fork\n"), + forkname, XFS_RTRMAP_ROOT_SPACE_CALC(numrecs, level), + lino, forkname); + return 1; + } + + if (level == 0) { + rp = XFS_RTRMAP_ROOT_REC_ADDR(dib, 1); + error = process_rtrmap_reclist(mp, rp, numrecs, + &priv.last_rec, NULL, "rtrmapbt root"); + if (error) { + rmap_avoid_check(); + return 1; + } + return 0; + } + + pp = XFS_RTRMAP_ROOT_PTR_ADDR(dib, 1, + libxfs_rtrmapbt_maxrecs(mp, + XFS_DFORK_SIZE(dip, mp, whichfork), 0)); + + /* check for in-order keys */ + for (i = 0; i < numrecs; i++) { + kp = XFS_RTRMAP_ROOT_KEY_ADDR(dib, i + 1); + + key.rm_flags = 0; + key.rm_startblock = be64_to_cpu(kp->rm_startblock); + key.rm_owner = be64_to_cpu(kp->rm_owner); + if (libxfs_rmap_irec_offset_unpack(be64_to_cpu(kp->rm_offset), + &key)) { + /* Look for impossible flags. */ + do_warn( +_("invalid flags in key %u of rtrmap root ino %" PRIu64 "\n"), + i, lino); + suspect++; + continue; + } + if (i == 0) { + oldkey = key; + continue; + } + if (rmap_diffkeys(&oldkey, &key) > 0) { + do_warn( +_("out of order key %u in rtrmap root ino %" PRIu64 "\n"), + i, lino); + suspect++; + continue; + } + oldkey = key; + } + + /* probe keys */ + for (i = 0; i < numrecs; i++) { + bno = get_unaligned_be64(&pp[i]); + + if (!verify_dfsbno(mp, bno)) { + do_warn( +_("bad rtrmap btree ptr 0x%" PRIx64 " in ino %" PRIu64 "\n"), + bno, lino); + return 1; + } + + if (scan_lbtree(bno, level, scan_rtrmapbt, + type, whichfork, lino, tot, nex, blkmapp, + NULL, 1, check_dups, XFS_RTRMAP_CRC_MAGIC, + &priv, + &xfs_rtrmapbt_buf_ops)) + return 1; + } + + return suspect ? 1 : 0; +} + +/* + * return 1 if inode should be cleared, 0 otherwise + */ +static int process_btinode( xfs_mount_t *mp, xfs_agnumber_t agno, @@ -1545,9 +1696,13 @@ change_dinode_fmt( static int check_dinode_mode_format( - xfs_dinode_t *dinoc) + struct xfs_mount *mp, + xfs_ino_t lino, + struct xfs_dinode *dinoc) { - if (dinoc->di_format >= XFS_DINODE_FMT_UUID) + if (lino == mp->m_sb.sb_rrmapino) + return dinoc->di_format != XFS_DINODE_FMT_RMAP; + else if (dinoc->di_format >= XFS_DINODE_FMT_UUID) return -1; /* FMT_UUID is not used */ switch (dinode_fmt(dinoc)) { @@ -1947,6 +2102,10 @@ process_inode_data_fork( totblocks, nextents, dblkmap, XFS_DATA_FORK, check_dups); break; + case XFS_DINODE_FMT_RMAP: + err = process_rtrmap(mp, agno, ino, dino, type, dirty, + totblocks, nextents, dblkmap, check_dups); + break; case XFS_DINODE_FMT_DEV: /* fall through */ err = 0; break; @@ -1986,6 +2145,7 @@ process_inode_data_fork( XFS_DATA_FORK, 0); break; case XFS_DINODE_FMT_DEV: /* fall through */ + case XFS_DINODE_FMT_RMAP: err = 0; break; default: @@ -2395,7 +2555,7 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), * free inodes since technically any format is legal * as we reset the inode when we re-use it. */ - if (di_mode != 0 && check_dinode_mode_format(dino) != 0) { + if (di_mode != 0 && check_dinode_mode_format(mp, lino, dino) != 0) { if (!uncertain) do_warn( _("bad inode format in inode %" PRIu64 "\n"), lino); diff --git a/repair/dinode.h b/repair/dinode.h index 61d0736..70d5d91 100644 --- a/repair/dinode.h +++ b/repair/dinode.h @@ -30,6 +30,8 @@ int verify_dfsbno(xfs_mount_t *mp, xfs_fsblock_t fsbno); +int verify_drtbno(struct xfs_mount *mp, xfs_fsblock_t fsbno); + void convert_extent( xfs_bmbt_rec_t *rp, diff --git a/repair/scan.c b/repair/scan.c index 8935be7..7c88b6f 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -824,7 +824,10 @@ process_rmap_rec( break; default: /* file data */ - set_bmap_ext(agno, b, blen, XR_E_INUSE1); + if (owner == mp->m_sb.sb_rrmapino) + set_bmap_ext(agno, b, blen, XR_E_FS_MAP1); + else + set_bmap_ext(agno, b, blen, XR_E_INUSE1); break; } break; @@ -896,13 +899,6 @@ _("unknown block (%d,%d-%d) mismatch on %s tree, state - %d,%" PRIx64 "\n"), } } -struct rmap_priv { - struct aghdr_cnts *agcnts; - struct xfs_rmap_irec high_key; - struct xfs_rmap_irec last_rec; - xfs_agblock_t nr_blocks; -}; - static bool rmap_in_order( xfs_agblock_t b, @@ -1218,6 +1214,385 @@ out: rmap_avoid_check(); } +int +process_rtrmap_reclist( + struct xfs_mount *mp, + struct xfs_rtrmap_rec *rp, + int numrecs, + struct xfs_rmap_irec *last_rec, + struct xfs_rmap_irec *high_key, + const char *name) +{ + int suspect = 0; + int i; + struct xfs_rmap_irec oldkey; + struct xfs_rmap_irec key; + + for (i = 0; i < numrecs; i++) { + xfs_fsblock_t b, end; + xfs_filblks_t len; + uint64_t owner, offset; + + b = be64_to_cpu(rp[i].rm_startblock); + len = be64_to_cpu(rp[i].rm_blockcount); + owner = be64_to_cpu(rp[i].rm_owner); + offset = be64_to_cpu(rp[i].rm_offset); + + key.rm_flags = 0; + key.rm_startblock = b; + key.rm_blockcount = len; + key.rm_owner = owner; + if (libxfs_rmap_irec_offset_unpack(offset, &key)) { + /* Look for impossible flags. */ + do_warn( +_("invalid flags in record %u of %s\n"), + i, name); + suspect++; + continue; + } + + + end = key.rm_startblock + key.rm_blockcount; + + /* Make sure startblock & len make sense. */ + if (!verify_drtbno(mp, b)) { + do_warn( +_("invalid start block %llu in record %u of %s\n"), + (unsigned long long)b, i, name); + suspect++; + continue; + } + if (len == 0 || !verify_drtbno(mp, end - 1)) { + do_warn( +_("invalid length %llu in record %u of %s\n"), + (unsigned long long)len, i, name); + suspect++; + continue; + } + + /* We only store inode data in the rtrmap. */ + if (XFS_RMAP_NON_INODE_OWNER(owner)) { + do_warn( +_("invalid owner %lld in record %u of %s\n"), + (long long int)owner, i, name); + suspect++; + continue; + } + + /* Look for impossible record field combinations. */ + if (key.rm_flags & XFS_RMAP_KEY_FLAGS) { + do_warn( +_("record %d cannot have attr fork/key flags in %s\n"), + i, name); + suspect++; + continue; + } + + /* Check for out of order records. */ + if (i == 0) + oldkey = key; + else { + if (rmap_diffkeys(&oldkey, &key) > 0) + do_warn( +_("out-of-order record %d (%llu %"PRId64" %"PRIu64" %llu) in %s\n"), + i, (unsigned long long)b, owner, offset, + (unsigned long long)len, name); + else + oldkey = key; + } + + /* Is this mergeable with the previous record? */ + if (rmaps_are_mergeable(last_rec, &key)) { + do_warn( +_("record %d in %s should be merged with previous record\n"), + i, name); + last_rec->rm_blockcount += key.rm_blockcount; + } else + *last_rec = key; + + /* Check that we don't go past the high key. */ + key.rm_startblock += key.rm_blockcount - 1; + key.rm_offset += key.rm_blockcount - 1; + key.rm_blockcount = 0; + if (high_key && rmap_diffkeys(&key, high_key) > 0) { + do_warn( +_("record %d greater than high key of %s\n"), + i, name); + suspect++; + } + } + + return suspect; +} + +int +scan_rtrmapbt( + struct xfs_btree_block *block, + int level, + int type, + int whichfork, + xfs_fsblock_t fsbno, + xfs_ino_t ino, + xfs_rfsblock_t *tot, + __uint64_t *nex, + blkmap_t **blkmapp, + bmap_cursor_t *bm_cursor, + int isroot, + int check_dups, + int *dirty, + __uint64_t magic, + void *priv) +{ + const char *name = "rtrmap"; + char rootname[256]; + int i; + xfs_rtrmap_ptr_t *pp; + struct xfs_rtrmap_rec *rp; + struct rmap_priv *rmap_priv = priv; + int hdr_errors = 0; + int numrecs; + int state; + struct xfs_rtrmap_key *kp; + struct xfs_rmap_irec oldkey; + struct xfs_rmap_irec key; + xfs_agnumber_t agno; + xfs_agblock_t agbno; + int suspect = 0; + int error; + + agno = XFS_FSB_TO_AGNO(mp, fsbno); + agbno = XFS_FSB_TO_AGBNO(mp, fsbno); + + /* If anything here is bad, just bail. */ + if (be32_to_cpu(block->bb_magic) != magic) { + do_warn( +_("bad magic # %#x in inode %" PRIu64 " %s block %" PRIu64 "\n"), + be32_to_cpu(block->bb_magic), ino, name, fsbno); + return 1; + } + if (be16_to_cpu(block->bb_level) != level) { + do_warn( +_("expected level %d got %d in inode %" PRIu64 ", %s block %" PRIu64 "\n"), + level, be16_to_cpu(block->bb_level), + ino, name, fsbno); + return(1); + } + + /* verify owner */ + if (be64_to_cpu(block->bb_u.l.bb_owner) != ino) { + do_warn( +_("expected owner inode %" PRIu64 ", got %llu, %s block %" PRIu64 "\n"), + ino, be64_to_cpu(block->bb_u.l.bb_owner), name, fsbno); + return 1; + } + /* verify block number */ + if (be64_to_cpu(block->bb_u.l.bb_blkno) != + XFS_FSB_TO_DADDR(mp, fsbno)) { + do_warn( +_("expected block %" PRIu64 ", got %llu, %s block %" PRIu64 "\n"), + XFS_FSB_TO_DADDR(mp, fsbno), + be64_to_cpu(block->bb_u.l.bb_blkno), name, fsbno); + return 1; + } + /* verify uuid */ + if (platform_uuid_compare(&block->bb_u.l.bb_uuid, + &mp->m_sb.sb_meta_uuid) != 0) { + do_warn( +_("wrong FS UUID, %s block %" PRIu64 "\n"), + name, fsbno); + return 1; + } + + /* check for btree blocks multiply claimed */ + state = get_bmap(agno, agbno); + if (!(state == XR_E_UNKNOWN || state == XR_E_FS_MAP1)) { + set_bmap(agno, agbno, XR_E_MULT); + do_warn( +_("%s btree block claimed (state %d), agno %d, bno %d, suspect %d\n"), + name, state, agno, agbno, suspect); + suspect++; + goto out; + } + + set_bmap(agno, agbno, XR_E_FS_MAP); + + numrecs = be16_to_cpu(block->bb_numrecs); + + /* + * All realtime rmap btree blocks are freed for a fully empty + * filesystem, thus they are counted towards the free data + * block counter. The root lives in an inode and is thus not + * counted. + */ + (*tot)++; + + if (level == 0) { + if (numrecs > mp->m_rtrmap_mxr[0]) { + numrecs = mp->m_rtrmap_mxr[0]; + hdr_errors++; + } + if (isroot == 0 && numrecs < mp->m_rtrmap_mnr[0]) { + numrecs = mp->m_rtrmap_mnr[0]; + hdr_errors++; + } + + if (hdr_errors) { + do_warn( +_("bad btree nrecs (%u, min=%u, max=%u) in bt%s block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), + mp->m_rtrmap_mnr[0], mp->m_rtrmap_mxr[0], + name, agno, agbno); + suspect++; + } + + rp = XFS_RTRMAP_REC_ADDR(block, 1); + snprintf(rootname, 256, "%s btree block %u/%u", name, agno, agbno); + error = process_rtrmap_reclist(mp, rp, numrecs, + &rmap_priv->last_rec, &rmap_priv->high_key, + rootname); + if (error) + suspect++; + goto out; + } + + /* + * interior record + */ + pp = XFS_RTRMAP_PTR_ADDR(block, 1, mp->m_rtrmap_mxr[1]); + + if (numrecs > mp->m_rtrmap_mxr[1]) { + numrecs = mp->m_rtrmap_mxr[1]; + hdr_errors++; + } + if (isroot == 0 && numrecs < mp->m_rtrmap_mnr[1]) { + numrecs = mp->m_rtrmap_mnr[1]; + hdr_errors++; + } + + /* + * don't pass bogus tree flag down further if this block + * looked ok. bail out if two levels in a row look bad. + */ + if (hdr_errors) { + do_warn( +_("bad btree nrecs (%u, min=%u, max=%u) in bt%s block %u/%u\n"), + be16_to_cpu(block->bb_numrecs), + mp->m_rtrmap_mnr[1], mp->m_rtrmap_mxr[1], + name, agno, agbno); + if (suspect) + goto out; + suspect++; + } else if (suspect) { + suspect = 0; + } + + /* check the node's high keys */ + for (i = 0; !isroot && i < numrecs; i++) { + kp = XFS_RTRMAP_HIGH_KEY_ADDR(block, i + 1); + + key.rm_flags = 0; + key.rm_startblock = be64_to_cpu(kp->rm_startblock); + key.rm_owner = be64_to_cpu(kp->rm_owner); + if (libxfs_rmap_irec_offset_unpack(be64_to_cpu(kp->rm_offset), + &key)) { + /* Look for impossible flags. */ + do_warn( +_("invalid flags in key %u of %s btree block %u/%u\n"), + i, name, agno, agbno); + suspect++; + continue; + } + if (rmap_diffkeys(&key, &rmap_priv->high_key) > 0) { + do_warn( +_("key %d greater than high key of block (%u/%u) in %s tree\n"), + i, agno, agbno, name); + suspect++; + } + } + + /* check for in-order keys */ + for (i = 0; i < numrecs; i++) { + kp = XFS_RTRMAP_KEY_ADDR(block, i + 1); + + key.rm_flags = 0; + key.rm_startblock = be64_to_cpu(kp->rm_startblock); + key.rm_owner = be64_to_cpu(kp->rm_owner); + if (libxfs_rmap_irec_offset_unpack(be64_to_cpu(kp->rm_offset), + &key)) { + /* Look for impossible flags. */ + do_warn( +_("invalid flags in key %u of %s btree block %u/%u\n"), + i, name, agno, agbno); + suspect++; + continue; + } + if (i == 0) { + oldkey = key; + continue; + } + if (rmap_diffkeys(&oldkey, &key) > 0) { + do_warn( +_("out of order key %u in %s btree block (%u/%u)\n"), + i, name, agno, agbno); + suspect++; + } + oldkey = key; + } + + for (i = 0; i < numrecs; i++) { + xfs_fsblock_t pbno = be64_to_cpu(pp[i]); + + /* + * XXX - put sibling detection right here. + * we know our sibling chain is good. So as we go, + * we check the entry before and after each entry. + * If either of the entries references a different block, + * check the sibling pointer. If there's a sibling + * pointer mismatch, try and extract as much data + * as possible. + */ + kp = XFS_RTRMAP_HIGH_KEY_ADDR(block, i + 1); + rmap_priv->high_key.rm_flags = 0; + rmap_priv->high_key.rm_startblock = + be64_to_cpu(kp->rm_startblock); + rmap_priv->high_key.rm_owner = + be64_to_cpu(kp->rm_owner); + if (libxfs_rmap_irec_offset_unpack(be64_to_cpu(kp->rm_offset), + &rmap_priv->high_key)) { + /* Look for impossible flags. */ + do_warn( +_("invalid flags in high key %u of %s btree block %u/%u\n"), + i, name, agno, agbno); + suspect++; + continue; + } + + if (!verify_dfsbno(mp, pbno)) { + do_warn( +_("bad %s btree ptr 0x%llx in ino %" PRIu64 "\n"), + name, (unsigned long long)pbno, ino); + return 1; + } + + error = scan_lbtree(pbno, level, scan_rtrmapbt, + type, whichfork, ino, tot, nex, blkmapp, + bm_cursor, 0, check_dups, magic, + rmap_priv, + &xfs_rtrmapbt_buf_ops); + if (error) { + suspect++; + goto out; + } + } + +out: + if (hdr_errors || suspect) { + rmap_avoid_check(); + return 1; + } + return 0; +} + struct refc_priv { struct xfs_refcount_irec last_rec; xfs_agblock_t nr_blocks; diff --git a/repair/scan.h b/repair/scan.h index 854897c..f51f950 100644 --- a/repair/scan.h +++ b/repair/scan.h @@ -73,4 +73,37 @@ scan_ags( struct xfs_mount *mp, int scan_threads); +struct rmap_priv { + struct aghdr_cnts *agcnts; + struct xfs_rmap_irec high_key; + struct xfs_rmap_irec last_rec; + xfs_agblock_t nr_blocks; +}; + +int +process_rtrmap_reclist( + struct xfs_mount *mp, + struct xfs_rtrmap_rec *rp, + int numrecs, + struct xfs_rmap_irec *last_rec, + struct xfs_rmap_irec *high_key, + const char *name); + +int scan_rtrmapbt( + struct xfs_btree_block *block, + int level, + int type, + int whichfork, + xfs_fsblock_t bno, + xfs_ino_t ino, + xfs_rfsblock_t *tot, + __uint64_t *nex, + struct blkmap **blkmapp, + bmap_cursor_t *bm_cursor, + int isroot, + int check_dups, + int *dirty, + __uint64_t magic, + void *priv); + #endif /* _XR_SCAN_H */ From darrick.wong@oracle.com Thu Aug 25 19:01:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2D0BF8481 for ; Thu, 25 Aug 2016 19:01:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 95BEDAC002 for ; Thu, 25 Aug 2016 17:01:21 -0700 (PDT) X-ASG-Debug-ID: 1472169678-0bf57c55b31c8470001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EzP2cMqkCG3QSRzc (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q01GPc001828 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:17 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01GQu030654 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:16 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01Gja005960; Fri, 26 Aug 2016 00:01:16 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:15 -0700 Subject: [PATCH 24/29] xfs_repair: extend ag_rmap[] for realtime mapping collection From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 24/29] xfs_repair: extend ag_rmap[] for realtime mapping collection To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:01:14 -0700 Message-ID: <147216967425.7022.18324030801464543217.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169678 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14238 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Extend the ag_rmap[] infrastructure to have an extra group to store realtime extent reverse mappings. Since we're pretending that the realtime device is AG "-1", we can just play some pointer arithmetic to make this work out. In the next patch we'll actually use this data for something. Extend the ag_locks[] array in a similar manner. Signed-off-by: Darrick J. Wong --- repair/dinode.c | 2 + repair/incore.c | 9 ++++- repair/phase4.c | 10 +++-- repair/rmap.c | 105 ++++++++++++++++++++++++++++++++++++------------------- repair/rmap.h | 10 +++++ 5 files changed, 91 insertions(+), 45 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 6718cd2..f768cdf 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -801,7 +801,7 @@ _("illegal state %d in block map %" PRIu64 "\n"), } } if (collect_rmaps) { /* && !check_dups */ - error = rmap_add_rec(mp, ino, whichfork, &irec); + error = rmap_add_rec(mp, ino, whichfork, &irec, false); if (error) do_error( _("couldn't add reverse mapping\n") diff --git a/repair/incore.c b/repair/incore.c index cb57316..fbb05ad 100644 --- a/repair/incore.c +++ b/repair/incore.c @@ -294,14 +294,17 @@ init_bmaps(xfs_mount_t *mp) if (!ag_bmap) do_error(_("couldn't allocate block map btree roots\n")); - ag_locks = calloc(mp->m_sb.sb_agcount, sizeof(struct aglock)); + ag_locks = calloc(mp->m_sb.sb_agcount + 1, sizeof(struct aglock)); if (!ag_locks) do_error(_("couldn't allocate block map locks\n")); + /* One ag_lock per AG, and one more for the realtime device. */ for (i = 0; i < mp->m_sb.sb_agcount; i++) { btree_init(&ag_bmap[i]); pthread_mutex_init(&ag_locks[i].lock, NULL); } + pthread_mutex_init(&ag_locks[mp->m_sb.sb_agcount].lock, NULL); + ag_locks++; init_rt_bmap(mp); reset_bmaps(mp); @@ -312,6 +315,10 @@ free_bmaps(xfs_mount_t *mp) { xfs_agnumber_t i; + ag_locks--; + free(ag_locks); + ag_locks = NULL; + for (i = 0; i < mp->m_sb.sb_agcount; i++) btree_destroy(ag_bmap[i]); free(ag_bmap); diff --git a/repair/phase4.c b/repair/phase4.c index 395d373..512f774 100644 --- a/repair/phase4.c +++ b/repair/phase4.c @@ -158,7 +158,7 @@ process_ags( int error; do_inode_prefetch(mp, ag_stride, process_ag_func, true, false); - for (i = 0; i < mp->m_sb.sb_agcount; i++) { + for_each_rmap_group(mp, i) { error = rmap_finish_collecting_fork_recs(mp, i); if (error) do_error( @@ -248,7 +248,7 @@ process_rmap_data( return; create_work_queue(&wq, mp, libxfs_nproc()); - for (i = 0; i < mp->m_sb.sb_agcount; i++) + for_each_rmap_group(mp, i) queue_work(&wq, check_rmap_btrees, i, NULL); destroy_work_queue(&wq); @@ -256,17 +256,17 @@ process_rmap_data( return; create_work_queue(&wq, mp, libxfs_nproc()); - for (i = 0; i < mp->m_sb.sb_agcount; i++) + for_each_ag(mp, i) queue_work(&wq, compute_ag_refcounts, i, NULL); destroy_work_queue(&wq); create_work_queue(&wq, mp, libxfs_nproc()); - for (i = 0; i < mp->m_sb.sb_agcount; i++) + for_each_ag(mp, i) queue_work(&wq, process_inode_reflink_flags, i, NULL); destroy_work_queue(&wq); create_work_queue(&wq, mp, libxfs_nproc()); - for (i = 0; i < mp->m_sb.sb_agcount; i++) + for_each_ag(mp, i) queue_work(&wq, check_refcount_btrees, i, NULL); destroy_work_queue(&wq); } diff --git a/repair/rmap.c b/repair/rmap.c index 3b3a195..37da251 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -45,6 +45,7 @@ struct xfs_ag_rmap { struct xfs_slab *ar_refcount_items; /* refcount items, p4-5 */ }; +/* One ag_rmap per AG, and one more for the realtime device. */ static struct xfs_ag_rmap *ag_rmaps; static bool rmapbt_suspect; static bool refcbt_suspect; @@ -83,6 +84,17 @@ rmap_compare( } /* + * Return the ag_rmap for a given AG. + * Note that NULLAGNUMBER (-1) is the realtime device. + */ +static struct xfs_ag_rmap* +rmap_for_ag( + xfs_agnumber_t agno) +{ + return &ag_rmaps[(signed)agno]; +} + +/* * Returns true if we must reconstruct either the reference count or reverse * mapping trees. */ @@ -107,11 +119,12 @@ rmaps_init( if (!rmap_needs_work(mp)) return; - ag_rmaps = calloc(mp->m_sb.sb_agcount, sizeof(struct xfs_ag_rmap)); + /* One ag_rmap per AG, and one more for the realtime device. */ + ag_rmaps = calloc(mp->m_sb.sb_agcount + 1, sizeof(struct xfs_ag_rmap)); if (!ag_rmaps) do_error(_("couldn't allocate per-AG reverse map roots\n")); - for (i = 0; i < mp->m_sb.sb_agcount; i++) { + for (i = 0; i < mp->m_sb.sb_agcount + 1; i++) { error = init_slab(&ag_rmaps[i].ar_rmaps, sizeof(struct xfs_rmap_irec)); if (error) @@ -129,6 +142,7 @@ _("Insufficient memory while allocating raw metadata reverse mapping slabs.")); do_error( _("Insufficient memory while allocating refcount item slabs.")); } + ag_rmaps++; } /* @@ -143,7 +157,8 @@ rmaps_free( if (!rmap_needs_work(mp)) return; - for (i = 0; i < mp->m_sb.sb_agcount; i++) { + ag_rmaps--; + for (i = 0; i < mp->m_sb.sb_agcount + 1; i++) { free_slab(&ag_rmaps[i].ar_rmaps); free_slab(&ag_rmaps[i].ar_raw_rmaps); free_slab(&ag_rmaps[i].ar_refcount_items); @@ -186,22 +201,31 @@ rmap_add_rec( struct xfs_mount *mp, xfs_ino_t ino, int whichfork, - struct xfs_bmbt_irec *irec) + struct xfs_bmbt_irec *irec, + bool realtime) { + struct xfs_ag_rmap *ag_rmap; struct xfs_rmap_irec rmap; xfs_agnumber_t agno; - xfs_agblock_t agbno; + xfs_fsblock_t agbno; struct xfs_rmap_irec *last_rmap; int error = 0; if (!rmap_needs_work(mp)) return 0; - agno = XFS_FSB_TO_AGNO(mp, irec->br_startblock); - agbno = XFS_FSB_TO_AGBNO(mp, irec->br_startblock); - ASSERT(agno != NULLAGNUMBER); - ASSERT(agno < mp->m_sb.sb_agcount); - ASSERT(agbno + irec->br_blockcount <= mp->m_sb.sb_agblocks); + if (realtime) { + agno = NULLAGNUMBER; + agbno = irec->br_startblock; + ASSERT(agbno + irec->br_blockcount <= mp->m_sb.sb_rblocks); + } else { + agno = XFS_FSB_TO_AGNO(mp, irec->br_startblock); + agbno = XFS_FSB_TO_AGBNO(mp, irec->br_startblock); + ASSERT(agno != NULLAGNUMBER); + ASSERT(agno < mp->m_sb.sb_agcount); + ASSERT(agbno + irec->br_blockcount <= mp->m_sb.sb_agblocks); + } + ag_rmap = rmap_for_ag(agno); ASSERT(ino != NULLFSINO); ASSERT(whichfork == XFS_DATA_FORK || whichfork == XFS_ATTR_FORK); @@ -214,13 +238,13 @@ rmap_add_rec( rmap.rm_blockcount = irec->br_blockcount; if (irec->br_state == XFS_EXT_UNWRITTEN) rmap.rm_flags |= XFS_RMAP_UNWRITTEN; - last_rmap = &ag_rmaps[agno].ar_last_rmap; + last_rmap = &ag_rmap->ar_last_rmap; if (last_rmap->rm_owner == XFS_RMAP_OWN_UNKNOWN) *last_rmap = rmap; else if (rmaps_are_mergeable(last_rmap, &rmap)) last_rmap->rm_blockcount += rmap.rm_blockcount; else { - error = slab_add(ag_rmaps[agno].ar_rmaps, last_rmap); + error = slab_add(ag_rmap->ar_rmaps, last_rmap); if (error) return error; *last_rmap = rmap; @@ -236,9 +260,10 @@ rmap_finish_collecting_fork_recs( xfs_agnumber_t agno) { if (!rmap_needs_work(mp) || - ag_rmaps[agno].ar_last_rmap.rm_owner == XFS_RMAP_OWN_UNKNOWN) + rmap_for_ag(agno)->ar_last_rmap.rm_owner == XFS_RMAP_OWN_UNKNOWN) return 0; - return slab_add(ag_rmaps[agno].ar_rmaps, &ag_rmaps[agno].ar_last_rmap); + return slab_add(rmap_for_ag(agno)->ar_rmaps, + &rmap_for_ag(agno)->ar_last_rmap); } /* add a raw rmap; these will be merged later */ @@ -264,7 +289,7 @@ __rmap_add_raw_rec( rmap.rm_flags |= XFS_RMAP_BMBT_BLOCK; rmap.rm_startblock = agbno; rmap.rm_blockcount = len; - return slab_add(ag_rmaps[agno].ar_raw_rmaps, &rmap); + return slab_add(rmap_for_ag(agno)->ar_raw_rmaps, &rmap); } /* @@ -322,16 +347,18 @@ rmap_fold_raw_recs( struct xfs_mount *mp, xfs_agnumber_t agno) { + struct xfs_ag_rmap *ag_rmap; struct xfs_slab_cursor *cur = NULL; struct xfs_rmap_irec *prev, *rec; size_t old_sz; int error = 0; - old_sz = slab_count(ag_rmaps[agno].ar_rmaps); - if (slab_count(ag_rmaps[agno].ar_raw_rmaps) == 0) + ag_rmap = rmap_for_ag(agno); + old_sz = slab_count(ag_rmap->ar_rmaps); + if (slab_count(ag_rmap->ar_raw_rmaps) == 0) goto no_raw; - qsort_slab(ag_rmaps[agno].ar_raw_rmaps, rmap_compare); - error = init_slab_cursor(ag_rmaps[agno].ar_raw_rmaps, rmap_compare, + qsort_slab(ag_rmap->ar_raw_rmaps, rmap_compare); + error = init_slab_cursor(ag_rmap->ar_raw_rmaps, rmap_compare, &cur); if (error) goto err; @@ -344,26 +371,26 @@ rmap_fold_raw_recs( rec = pop_slab_cursor(cur); continue; } - error = slab_add(ag_rmaps[agno].ar_rmaps, prev); + error = slab_add(ag_rmap->ar_rmaps, prev); if (error) goto err; prev = rec; rec = pop_slab_cursor(cur); } if (prev) { - error = slab_add(ag_rmaps[agno].ar_rmaps, prev); + error = slab_add(ag_rmap->ar_rmaps, prev); if (error) goto err; } - free_slab(&ag_rmaps[agno].ar_raw_rmaps); - error = init_slab(&ag_rmaps[agno].ar_raw_rmaps, + free_slab(&ag_rmap->ar_raw_rmaps); + error = init_slab(&ag_rmap->ar_raw_rmaps, sizeof(struct xfs_rmap_irec)); if (error) do_error( _("Insufficient memory while allocating raw metadata reverse mapping slabs.")); no_raw: if (old_sz) - qsort_slab(ag_rmaps[agno].ar_rmaps, rmap_compare); + qsort_slab(ag_rmap->ar_rmaps, rmap_compare); err: free_slab_cursor(&cur); return error; @@ -419,6 +446,9 @@ rmap_add_fixed_ag_rec( if (!rmap_needs_work(mp)) return 0; + if (agno == NULLAGNUMBER) + return 0; + /* sb/agi/agf/agfl headers */ error = rmap_add_ag_rec(mp, agno, 0, XFS_BNO_BLOCK(mp), XFS_RMAP_OWN_FS); @@ -493,6 +523,7 @@ rmap_store_ag_btree_rec( struct xfs_trans *tp; struct xfs_trans_res tres = {0}; __be32 *agfl_bno, *b; + struct xfs_ag_rmap *ag_rmap; int error = 0; struct xfs_owner_info oinfo; @@ -500,9 +531,9 @@ rmap_store_ag_btree_rec( return 0; /* Release the ar_rmaps; they were put into the rmapbt during p5. */ - free_slab(&ag_rmaps[agno].ar_rmaps); - error = init_slab(&ag_rmaps[agno].ar_rmaps, - sizeof(struct xfs_rmap_irec)); + ag_rmap = rmap_for_ag(agno); + free_slab(&ag_rmap->ar_rmaps); + error = init_slab(&ag_rmap->ar_rmaps, sizeof(struct xfs_rmap_irec)); if (error) goto err; @@ -515,7 +546,7 @@ rmap_store_ag_btree_rec( goto err; agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp); - agfl_bno += ag_rmaps[agno].ar_flcount; + agfl_bno += ag_rmap->ar_flcount; b = agfl_bno; while (*b != NULLAGBLOCK && b - agfl_bno <= XFS_AGFL_SIZE(mp)) { error = rmap_add_ag_rec(mp, agno, be32_to_cpu(*b), 1, @@ -533,7 +564,7 @@ rmap_store_ag_btree_rec( goto err; /* Create cursors to refcount structures */ - error = init_slab_cursor(ag_rmaps[agno].ar_rmaps, rmap_compare, + error = init_slab_cursor(ag_rmap->ar_rmaps, rmap_compare, &rm_cur); if (error) goto err; @@ -714,7 +745,7 @@ refcount_emit( int error; struct xfs_slab *rlslab; - rlslab = ag_rmaps[agno].ar_refcount_items; + rlslab = rmap_for_ag(agno)->ar_refcount_items; ASSERT(nr_rmaps > 0); dbg_printf("REFL: agno=%u pblk=%u, len=%u -> refcount=%zu\n", @@ -736,7 +767,7 @@ _("Insufficient memory while recreating refcount tree.")); #define RMAP_END(r) ((r)->rm_startblock + (r)->rm_blockcount) int compute_refcounts( - struct xfs_mount *mp, + struct xfs_mount *mp, xfs_agnumber_t agno) { struct xfs_bag *stack_top = NULL; @@ -754,7 +785,7 @@ compute_refcounts( if (!xfs_sb_version_hasreflink(&mp->m_sb)) return 0; - rmaps = ag_rmaps[agno].ar_rmaps; + rmaps = rmap_for_ag(agno)->ar_rmaps; error = init_slab_cursor(rmaps, rmap_compare, &rmaps_cur); if (error) @@ -864,7 +895,7 @@ rmap_record_count( struct xfs_mount *mp, xfs_agnumber_t agno) { - return slab_count(ag_rmaps[agno].ar_rmaps); + return slab_count(rmap_for_ag(agno)->ar_rmaps); } /* @@ -875,7 +906,7 @@ rmap_init_cursor( xfs_agnumber_t agno, struct xfs_slab_cursor **cur) { - return init_slab_cursor(ag_rmaps[agno].ar_rmaps, rmap_compare, cur); + return init_slab_cursor(rmap_for_ag(agno)->ar_rmaps, rmap_compare, cur); } /* @@ -1269,7 +1300,7 @@ refcount_record_count( struct xfs_mount *mp, xfs_agnumber_t agno) { - return slab_count(ag_rmaps[agno].ar_refcount_items); + return slab_count(rmap_for_ag(agno)->ar_refcount_items); } /* @@ -1280,7 +1311,7 @@ init_refcount_cursor( xfs_agnumber_t agno, struct xfs_slab_cursor **cur) { - return init_slab_cursor(ag_rmaps[agno].ar_refcount_items, NULL, cur); + return init_slab_cursor(rmap_for_ag(agno)->ar_refcount_items, NULL, cur); } /* @@ -1461,5 +1492,5 @@ rmap_store_agflcount( if (!rmap_needs_work(mp)) return; - ag_rmaps[agno].ar_flcount = count; + rmap_for_ag(agno)->ar_flcount = count; } diff --git a/repair/rmap.h b/repair/rmap.h index 752ece8..7069b6b 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -27,7 +27,8 @@ extern bool rmap_needs_work(struct xfs_mount *); extern void rmaps_init(struct xfs_mount *); extern void rmaps_free(struct xfs_mount *); -extern int rmap_add_rec(struct xfs_mount *, xfs_ino_t, int, struct xfs_bmbt_irec *); +extern int rmap_add_rec(struct xfs_mount *, xfs_ino_t, int, + struct xfs_bmbt_irec *, bool realtime); extern int rmap_finish_collecting_fork_recs(struct xfs_mount *mp, xfs_agnumber_t agno); extern int rmap_add_ag_rec(struct xfs_mount *, xfs_agnumber_t agno, @@ -62,4 +63,11 @@ extern int fix_inode_reflink_flags(struct xfs_mount *, xfs_agnumber_t); extern void fix_freelist(struct xfs_mount *, xfs_agnumber_t, bool); extern void rmap_store_agflcount(struct xfs_mount *, xfs_agnumber_t, int); +#define for_each_ag(mp, agno) \ + for ((agno) = 0; (agno) < (mp)->m_sb.sb_agcount; (agno)++) + +#define for_each_rmap_group(mp, agno) \ + for ((agno) = NULLAGNUMBER; (agno) == NULLAGNUMBER || \ + (agno) < (mp)->m_sb.sb_agcount; (agno)++) + #endif /* RMAP_H_ */ From darrick.wong@oracle.com Thu Aug 25 19:01:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E7C5E848A for ; Thu, 25 Aug 2016 19:01:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6B1CCAC002 for ; Thu, 25 Aug 2016 17:01:32 -0700 (PDT) X-ASG-Debug-ID: 1472169690-0bf8155c771e9d20001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id RLO8qCrfe1a7ekSt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:30 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q01SXT007809 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:01:29 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q01S7F018997 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:28 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01MgG023589; Fri, 26 Aug 2016 00:01:27 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:22 -0700 Subject: [PATCH 25/29] xfs_repair: collect relatime reverse-mapping data for refcount/rmap tree rebuilding From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 25/29] xfs_repair: collect relatime reverse-mapping data for refcount/rmap tree rebuilding To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:01:20 -0700 Message-ID: <147216968057.7022.6386690839466970601.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169690 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1418 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Collect reverse-mapping data for realtime files so that we can later check and rebuild the reference count tree and the reverse mapping tree. Signed-off-by: Darrick J. Wong --- repair/dinode.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/repair/dinode.c b/repair/dinode.c index f768cdf..04759dc 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -594,6 +594,7 @@ process_bmbt_reclist_int( xfs_agblock_t ebno; xfs_extlen_t blen; xfs_agnumber_t locked_agno = -1; + struct aglock *ag_lock; int error = 1; if (type == XR_INO_RTDATA) @@ -639,8 +640,20 @@ _("zero length extent (off = %" PRIu64 ", fsbno = %" PRIu64 ") in ino %" PRIu64 */ if (process_rt_rec(mp, &irec, ino, tot, check_dups)) return 1; + /* collect reverse mappings for realtime files */ + if (collect_rmaps && !check_dups) { + ag_lock = &ag_locks[(signed)NULLAGNUMBER]; + pthread_mutex_lock(&ag_lock->lock); + error = rmap_add_rec(mp, ino, whichfork, + &irec, true); + pthread_mutex_unlock(&ag_lock->lock); + if (error) + do_error( +_("couldn't add reverse mapping\n") + ); + } /* - * skip rest of loop processing since that'irec.br_startblock + * skip rest of loop processing since that's * all for regular file forks and attr forks */ continue; From darrick.wong@oracle.com Thu Aug 25 19:01:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D8795849A for ; Thu, 25 Aug 2016 19:01:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F2E6AC002 for ; Thu, 25 Aug 2016 17:01:39 -0700 (PDT) X-ASG-Debug-ID: 1472169696-0bf57c55b21c84a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 3T5cLnenXXqyvl65 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:37 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q01YRF007866 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:35 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01YrF031497 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:34 GMT Received: from abhmp0017.oracle.com (abhmp0017.oracle.com [141.146.116.23]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01Swd023632; Fri, 26 Aug 2016 00:01:33 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:28 -0700 Subject: [PATCH 26/29] xfs_repair: check existing realtime rmapbt entries against observed rmaps From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 26/29] xfs_repair: check existing realtime rmapbt entries against observed rmaps To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:01:26 -0700 Message-ID: <147216968687.7022.9876273075739424824.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169697 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2710 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Once we've finished collecting reverse mapping observations from the metadata scan, check those observations against the realtime rmap btree (particularly if we're in -n mode) to detect rtrmapbt problems. Signed-off-by: Darrick J. Wong --- repair/rmap.c | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/repair/rmap.c b/repair/rmap.c index 37da251..d6a75d7 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -1008,6 +1008,7 @@ rmaps_verify_btree( struct xfs_rmap_irec *rm_rec; struct xfs_rmap_irec tmp; struct xfs_perag *pag; /* per allocation group data */ + struct xfs_inode *ip = NULL; if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) return 0; @@ -1016,22 +1017,47 @@ rmaps_verify_btree( do_warn(_("would rebuild corrupt rmap btrees.\n")); return 0; } + if (agno == NULLAGNUMBER && mp->m_sb.sb_rblocks == 0) { + if (rmap_record_count(mp, NULLAGNUMBER) != 0) { + do_error(_("realtime extents but no rtdev?\n")); + return -EFSCORRUPTED; + } + return 0; + } - /* Create cursors to refcount structures */ + /* Create cursors to rmap structures */ error = rmap_init_cursor(agno, &rm_cur); if (error) return error; - error = -libxfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); - if (error) - goto err; + if (agno == NULLAGNUMBER) { + if (mp->m_sb.sb_rrmapino == 0 || + mp->m_sb.sb_rrmapino == NULLFSINO) { + do_warn( +_("garbage in sb_rrmapino, not checking realtime rmaps\n")); + goto err; + } - /* Leave the per-ag data "uninitialized" since we rewrite it later */ - pag = libxfs_perag_get(mp, agno); - pag->pagf_init = 0; - libxfs_perag_put(pag); + error = -libxfs_iget(mp, NULL, mp->m_sb.sb_rrmapino, 0, &ip, 0); + if (error) { + do_warn(_("%d - couldn't iget rtrmap inode.\n"), + error); + goto err; + } + mp->m_rrmapip = ip; + bt_cur = libxfs_rtrmapbt_init_cursor(mp, NULL, mp->m_rrmapip); + } else { + error = -libxfs_alloc_read_agf(mp, NULL, agno, 0, &agbp); + if (error) + goto err; + + /* Leave the per-ag data "uninitialized" since we rewrite it later */ + pag = libxfs_perag_get(mp, agno); + pag->pagf_init = 0; + libxfs_perag_put(pag); - bt_cur = libxfs_rmapbt_init_cursor(mp, NULL, agbp, agno); + bt_cur = libxfs_rmapbt_init_cursor(mp, NULL, agbp, agno); + } if (!bt_cur) { error = -ENOMEM; goto err; @@ -1107,6 +1133,10 @@ err: libxfs_btree_del_cursor(bt_cur, XFS_BTREE_NOERROR); if (agbp) libxfs_putbuf(agbp); + if (ip) { + IRELE(mp->m_rrmapip); + mp->m_rrmapip = NULL; + } free_slab_cursor(&rm_cur); return 0; } From darrick.wong@oracle.com Thu Aug 25 19:01:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EEC99849A for ; Thu, 25 Aug 2016 19:01:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63EB5AC002 for ; Thu, 25 Aug 2016 17:01:40 -0700 (PDT) X-ASG-Debug-ID: 1472169698-0bf57b531220a010001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 91h8drMgMOsOBST1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:38 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q01aKR002030 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:01:37 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q01aqe019326 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:36 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01YJ1023800; Fri, 26 Aug 2016 00:01:36 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:34 -0700 Subject: [PATCH 27/29] xfs_repair: find and mark the rtrmapbt inode From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 27/29] xfs_repair: find and mark the rtrmapbt inode To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:01:33 -0700 Message-ID: <147216969308.7022.3154890098779808407.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169698 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7045 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make sure that we find the realtime rmapbt inode and mark it appropriately, just in case we find a rogue inode claiming to be an rtrmap, or just plain garbage in the superblock field. Signed-off-by: Darrick J. Wong --- repair/dino_chunks.c | 12 ++++++++++++ repair/dinode.c | 41 +++++++++++++++++++++++++++++++++++++++++ repair/dir2.c | 5 +++++ repair/globals.h | 1 + repair/incore.h | 1 + repair/phase1.c | 1 + repair/phase6.c | 13 +++++++++++++ repair/rmap.c | 1 + repair/sb.c | 3 +++ 9 files changed, 78 insertions(+) diff --git a/repair/dino_chunks.c b/repair/dino_chunks.c index 4db9512..d08e2ba 100644 --- a/repair/dino_chunks.c +++ b/repair/dino_chunks.c @@ -924,6 +924,18 @@ next_readbuf: _("would clear realtime summary inode %" PRIu64 "\n"), ino); } + } else if (mp->m_sb.sb_rrmapino == ino) { + need_rrmapino = 1; + + if (!no_modify) { + do_warn( + _("cleared realtime rmap inode %" PRIu64 "\n"), + ino); + } else { + do_warn( + _("would clear realtime rmap inode %" PRIu64 "\n"), + ino); + } } else if (!no_modify) { do_warn(_("cleared inode %" PRIu64 "\n"), ino); diff --git a/repair/dinode.c b/repair/dinode.c index 04759dc..25c2ba0 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -266,6 +266,12 @@ clear_dinode(xfs_mount_t *mp, xfs_dinode_t *dino, xfs_ino_t ino_num) dirty = clear_dinode_core(mp, dino, ino_num); dirty += clear_dinode_unlinked(mp, dino); + if (ino_num == mp->m_sb.sb_rrmapino) { + mp->m_sb.sb_rrmapino = NULLFSINO; + need_rrmapino = 1; + rmap_avoid_check(); + } + /* and clear the forks */ if (dirty && !no_modify) @@ -1838,6 +1844,27 @@ _("bad # of extents (%u) for realtime bitmap inode %" PRIu64 "\n"), } return 0; } + if (lino == mp->m_sb.sb_rrmapino) { + if (*type != XR_INO_RTRMAP) { + do_warn( +_("realtime rmap inode %" PRIu64 " has bad type 0x%x, "), + lino, dinode_fmt(dinoc)); + if (!no_modify) { + do_warn(_("resetting to regular file\n")); + change_dinode_fmt(dinoc, S_IFREG); + *dirty = 1; + } else { + do_warn(_("would reset to regular file\n")); + } + } + if (mp->m_sb.sb_rblocks == 0 && dinoc->di_nextents != 0) { + do_warn( +_("bad # of extents (%u) for realtime rmap inode %" PRIu64 "\n"), + be32_to_cpu(dinoc->di_nextents), lino); + return 1; + } + return 0; + } return 0; } @@ -1928,6 +1955,18 @@ _("realtime summary inode %" PRIu64 " has bad size %" PRId64 " (should be %d)\n" } break; + case XR_INO_RTRMAP: + /* + * if we have no rmapbt, any inode claiming + * to be a real-time file is bogus + */ + if (!xfs_sb_version_hasrmapbt(&mp->m_sb)) { + do_warn( +_("found inode %" PRIu64 " claiming to be a rtrmapbt file, but rmapbt is disabled\n"), lino); + return 1; + } + break; + default: break; } @@ -2774,6 +2813,8 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"), type = XR_INO_RTBITMAP; else if (lino == mp->m_sb.sb_rsumino) type = XR_INO_RTSUM; + else if (lino == mp->m_sb.sb_rrmapino) + type = XR_INO_RTRMAP; else type = XR_INO_DATA; break; diff --git a/repair/dir2.c b/repair/dir2.c index a2fe5c6..a120868 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -236,6 +236,9 @@ process_sf_dir2( } else if (lino == mp->m_sb.sb_rsumino) { junkit = 1; junkreason = _("realtime summary"); + } else if (lino == mp->m_sb.sb_rrmapino) { + junkit = 1; + junkreason = _("realtime rmap"); } else if (lino == mp->m_sb.sb_uquotino) { junkit = 1; junkreason = _("user quota"); @@ -695,6 +698,8 @@ process_dir2_data( clearreason = _("realtime bitmap"); } else if (ent_ino == mp->m_sb.sb_rsumino) { clearreason = _("realtime summary"); + } else if (ent_ino == mp->m_sb.sb_rrmapino) { + clearreason = _("realtime rmap"); } else if (ent_ino == mp->m_sb.sb_uquotino) { clearreason = _("user quota"); } else if (ent_ino == mp->m_sb.sb_gquotino) { diff --git a/repair/globals.h b/repair/globals.h index efd1d03..0ea9a7d 100644 --- a/repair/globals.h +++ b/repair/globals.h @@ -118,6 +118,7 @@ EXTERN int need_root_dotdot; EXTERN int need_rbmino; EXTERN int need_rsumino; +EXTERN int need_rrmapino; EXTERN int lost_quotas; EXTERN int have_uquotino; diff --git a/repair/incore.h b/repair/incore.h index c23a3a3..0858fd1 100644 --- a/repair/incore.h +++ b/repair/incore.h @@ -229,6 +229,7 @@ int count_bcnt_extents(xfs_agnumber_t); #define XR_INO_SOCK 9 /* socket */ #define XR_INO_FIFO 10 /* fifo */ #define XR_INO_MOUNTPOINT 11 /* mountpoint */ +#define XR_INO_RTRMAP 12 /* realtime rmap */ /* inode allocation tree */ diff --git a/repair/phase1.c b/repair/phase1.c index 126d0b3..3404b0b 100644 --- a/repair/phase1.c +++ b/repair/phase1.c @@ -62,6 +62,7 @@ phase1(xfs_mount_t *mp) need_root_dotdot = 0; need_rbmino = 0; need_rsumino = 0; + need_rrmapino = 0; lost_quotas = 0; /* diff --git a/repair/phase6.c b/repair/phase6.c index 560f9bb..6981b35 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -3074,6 +3074,19 @@ mark_standalone_inodes(xfs_mount_t *mp) add_inode_reached(irec, offset); } } + + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && mp->m_sb.sb_rblocks > 0) { + irec = find_inode_rec(mp, + XFS_INO_TO_AGNO(mp, mp->m_sb.sb_rrmapino), + XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rrmapino)); + + offset = XFS_INO_TO_AGINO(mp, mp->m_sb.sb_rrmapino) - + irec->ino_startnum; + + ASSERT(irec != NULL); + + add_inode_reached(irec, offset); + } } static void diff --git a/repair/rmap.c b/repair/rmap.c index d6a75d7..9f9a47c 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -1035,6 +1035,7 @@ rmaps_verify_btree( mp->m_sb.sb_rrmapino == NULLFSINO) { do_warn( _("garbage in sb_rrmapino, not checking realtime rmaps\n")); + need_rrmapino = 1; goto err; } diff --git a/repair/sb.c b/repair/sb.c index ac13a66..5a2bb60 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -37,6 +37,7 @@ copy_sb(xfs_sb_t *source, xfs_sb_t *dest) xfs_ino_t rootino; xfs_ino_t rbmino; xfs_ino_t rsumino; + xfs_ino_t rrmapino; xfs_ino_t uquotino; xfs_ino_t gquotino; xfs_ino_t pquotino; @@ -45,6 +46,7 @@ copy_sb(xfs_sb_t *source, xfs_sb_t *dest) rootino = dest->sb_rootino; rbmino = dest->sb_rbmino; rsumino = dest->sb_rsumino; + rrmapino = dest->sb_rrmapino; uquotino = dest->sb_uquotino; gquotino = dest->sb_gquotino; pquotino = dest->sb_pquotino; @@ -56,6 +58,7 @@ copy_sb(xfs_sb_t *source, xfs_sb_t *dest) dest->sb_rootino = rootino; dest->sb_rbmino = rbmino; dest->sb_rsumino = rsumino; + dest->sb_rrmapino = rrmapino; dest->sb_uquotino = uquotino; dest->sb_gquotino = gquotino; dest->sb_pquotino = pquotino; From darrick.wong@oracle.com Thu Aug 25 19:01:46 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B344084A8 for ; Thu, 25 Aug 2016 19:01:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48171AC001 for ; Thu, 25 Aug 2016 17:01:46 -0700 (PDT) X-ASG-Debug-ID: 1472169704-0bf8155c741e9d80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5pAoGkPZHQmkCVSV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:44 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q01gUH002119 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:43 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01g2e031740 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:42 GMT Received: from abhmp0006.oracle.com (abhmp0006.oracle.com [141.146.116.12]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q01fcU007949; Fri, 26 Aug 2016 00:01:41 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:40 -0700 Subject: [PATCH 28/29] xfs_repair: rebuild the realtime rmap btree From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 28/29] xfs_repair: rebuild the realtime rmap btree To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:01:39 -0700 Message-ID: <147216969952.7022.7608225228147849784.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169704 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6474 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Signed-off-by: Darrick J. Wong --- libxfs/libxfs_api_defs.h | 1 + repair/phase6.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++ repair/rmap.c | 68 +++++++++++++++++++++++++++++++++++++++++++ repair/rmap.h | 2 + repair/xfs_repair.c | 5 +++ 5 files changed, 148 insertions(+), 1 deletion(-) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index a6ea865..44b9065 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -144,5 +144,6 @@ #define xfs_refc_block libxfs_refc_block #define xfs_rtrmapbt_maxrecs libxfs_rtrmapbt_maxrecs #define xfs_rtrmapbt_init_cursor libxfs_rtrmapbt_init_cursor +#define xfs_rmap_map_extent libxfs_rmap_map_extent #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/repair/phase6.c b/repair/phase6.c index 6981b35..25d6801 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -29,6 +29,8 @@ #include "dinode.h" #include "progress.h" #include "versions.h" +#include "slab.h" +#include "rmap.h" static struct cred zerocr; static struct fsxattr zerofsx; @@ -831,6 +833,61 @@ mk_rsumino(xfs_mount_t *mp) IRELE(ip); } +static void +mk_rrmapino( + struct xfs_mount *mp) +{ + struct xfs_trans *tp; + struct xfs_inode *ip; + struct cred creds = {0}; + struct fsxattr fsxattrs = {0}; + struct xfs_btree_block *block; + int error; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb) || mp->m_sb.sb_rblocks == 0) + return; + + error = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_ichange, 0, 0, 0, &tp); + if (error) + res_failed(error); + + if (mp->m_sb.sb_rrmapino == 0 || + mp->m_sb.sb_rrmapino == NULLFSINO || + need_rrmapino) { + /* Allocate a new inode. */ + error = -libxfs_inode_alloc(&tp, NULL, S_IFREG, 1, 0, + &creds, &fsxattrs, &ip); + if (error) { + do_error(_("Realtime rmap inode allocation failed -- error %d"), + error); + } + mp->m_sb.sb_rrmapino = ip->i_ino; + ip->i_df.if_broot_bytes = XFS_RTRMAP_BROOT_SPACE_CALC(0, 0); + ip->i_df.if_broot = kmem_alloc(ip->i_df.if_broot_bytes, + KM_SLEEP | KM_NOFS); + } else { + /* Grab the existing inode. */ + error = -libxfs_trans_iget(mp, tp, mp->m_sb.sb_rrmapino, + 0, 0, &ip); + if (error) + do_error(_("Could not iget realtime rmapbt inode -- error %d"), + error); + } + + /* Reset the btree root. */ + ip->i_d.di_size = 0; + ip->i_d.di_nblocks = 0; + ip->i_d.di_format = XFS_DINODE_FMT_RMAP; + block = ip->i_df.if_broot; + block->bb_numrecs = cpu_to_be16(0); + block->bb_level = cpu_to_be16(0); + + libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE | XFS_ILOG_DBROOT); + libxfs_log_sb(tp); + libxfs_trans_commit(tp); + IRELE(ip); +} + /* * makes a new root directory. */ @@ -3248,6 +3305,18 @@ phase6(xfs_mount_t *mp) } } + /* + * We always reinitialize the rrmapbt inode, but if it was bad we + * ought to say something. + */ + if (no_modify) { + if (need_rrmapino) + do_warn(_("would reinitialize realtime rmap btree\n")); + } else { + need_rrmapino = 0; + mk_rrmapino(mp); + } + if (!no_modify) { do_log( _(" - resetting contents of realtime bitmap and summary inodes\n")); @@ -3260,6 +3329,10 @@ _(" - resetting contents of realtime bitmap and summary inodes\n")); do_warn( _("Warning: realtime bitmap may be inconsistent\n")); } + + if (rmap_populate_realtime_rmapbt(mp)) + do_warn( + _("Warning: realtime rmapbt may be inconsistent\n")); } mark_standalone_inodes(mp); diff --git a/repair/rmap.c b/repair/rmap.c index 9f9a47c..f5ab167 100644 --- a/repair/rmap.c +++ b/repair/rmap.c @@ -1525,3 +1525,71 @@ rmap_store_agflcount( rmap_for_ag(agno)->ar_flcount = count; } + +/* Store the realtime reverse-mappings in the rtrmapbt. */ +int +rmap_populate_realtime_rmapbt( + struct xfs_mount *mp) +{ + struct xfs_trans *tp; + struct xfs_inode *ip; + struct xfs_inode fakei; + struct xfs_slab_cursor *rmap_cur; + struct xfs_defer_ops dfops; + xfs_fsblock_t firstfsb; + struct xfs_rmap_irec *rm_rec; + struct xfs_bmbt_irec imap; + int error; + + if (!xfs_sb_version_hasrmapbt(&mp->m_sb) || mp->m_sb.sb_rblocks == 0) + return 0; + + error = rmap_init_cursor(NULLAGNUMBER, &rmap_cur); + if (error) { + error = -ENOMEM; + goto out; + } + + error = -libxfs_iget(mp, NULL, mp->m_sb.sb_rrmapino, 0, &ip, 0); + if (error) + goto out_inode; + + mp->m_rrmapip = ip; + fakei.i_d.di_flags = XFS_DIFLAG_REALTIME; + fakei.i_d.di_flags2 = 0; + + libxfs_defer_init(&dfops, &firstfsb); + while ((rm_rec = pop_slab_cursor(rmap_cur))) { + imap.br_startoff = rm_rec->rm_offset; + imap.br_startblock = rm_rec->rm_startblock; + imap.br_blockcount = rm_rec->rm_blockcount; + imap.br_state = (rm_rec->rm_flags & XFS_RMAP_UNWRITTEN ? + XFS_EXT_UNWRITTEN : XFS_EXT_NORM); + fakei.i_ino = rm_rec->rm_owner; + error = -libxfs_rmap_map_extent(mp, &dfops, &fakei, + XFS_DATA_FORK, &imap); + if (error) + goto out_defer; + } + + error = -libxfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate, 0, 0, 0, &tp); + if (error) + goto out_defer; + + error = -libxfs_defer_finish(&tp, &dfops, NULL); + if (error) + goto out_cancel; + + error = -libxfs_trans_commit(tp); + goto out_inode; + +out_cancel: + libxfs_trans_cancel(tp); +out_defer: + libxfs_defer_cancel(&dfops); +out_inode: + mp->m_rrmapip = NULL; + IRELE(ip); +out: + return error; +} diff --git a/repair/rmap.h b/repair/rmap.h index 7069b6b..9fb6ba2 100644 --- a/repair/rmap.h +++ b/repair/rmap.h @@ -70,4 +70,6 @@ extern void rmap_store_agflcount(struct xfs_mount *, xfs_agnumber_t, int); for ((agno) = NULLAGNUMBER; (agno) == NULLAGNUMBER || \ (agno) < (mp)->m_sb.sb_agcount; (agno)++) +extern int rmap_populate_realtime_rmapbt(struct xfs_mount *mp); + #endif /* RMAP_H_ */ diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 4d92b90..9a2f7c7 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -936,11 +936,14 @@ main(int argc, char **argv) /* * Done with the block usage maps, toss them... */ - rmaps_free(mp); + if (mp->m_sb.sb_rblocks == 0) + rmaps_free(mp); free_bmaps(mp); if (!bad_ino_btree) { phase6(mp); + if (mp->m_sb.sb_rblocks != 0) + rmaps_free(mp); timestamp(PHASE_END, 6, NULL); phase7(mp, phase2_threads); From darrick.wong@oracle.com Thu Aug 25 19:01:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4F04184A9 for ; Thu, 25 Aug 2016 19:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B54C4AC001 for ; Thu, 25 Aug 2016 17:01:52 -0700 (PDT) X-ASG-Debug-ID: 1472169710-0bf57b531320a030001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id dbwCWoBYrYFMvXWN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:01:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q01m3W008037 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:01:49 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7Q01m16026657 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:01:48 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q01lTQ006388; Fri, 26 Aug 2016 00:01:47 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:01:47 -0700 Subject: [PATCH 29/29] mkfs: create the realtime rmap inode From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 29/29] mkfs: create the realtime rmap inode To: david@fromorbit.com, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com Date: Thu, 25 Aug 2016 17:01:45 -0700 Message-ID: <147216970577.7022.917857374242640355.stgit@birch.djwong.org> In-Reply-To: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> References: <147216950911.7022.438115723996286926.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169710 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4004 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Create a realtime rmapbt inode if we format the fs with realtime and rmap. Signed-off-by: Darrick J. Wong --- libxfs/libxfs_api_defs.h | 1 + mkfs/proto.c | 51 +++++++++++++++++++++++++++++++--------------- mkfs/xfs_mkfs.c | 19 +++++++++++------ 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 44b9065..e567076 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -145,5 +145,6 @@ #define xfs_rtrmapbt_maxrecs libxfs_rtrmapbt_maxrecs #define xfs_rtrmapbt_init_cursor libxfs_rtrmapbt_init_cursor #define xfs_rmap_map_extent libxfs_rmap_map_extent +#define xfs_btree_compute_maxlevels libxfs_btree_compute_maxlevels #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/mkfs/proto.c b/mkfs/proto.c index 1de77f8..bf31483 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -626,24 +626,25 @@ parse_proto( */ static void rtinit( - xfs_mount_t *mp) + struct xfs_mount *mp) { - xfs_fileoff_t bno; - xfs_fileoff_t ebno; - xfs_bmbt_irec_t *ep; - int error; - xfs_fsblock_t first; + xfs_fileoff_t bno; + xfs_fileoff_t ebno; + struct xfs_bmbt_irec *ep; + int error; + xfs_fsblock_t first; struct xfs_defer_ops dfops; - int i; - xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP]; - xfs_extlen_t nsumblocks; - int nmap; - xfs_inode_t *rbmip; - xfs_inode_t *rsumip; - xfs_trans_t *tp; - struct cred creds; - struct fsxattr fsxattrs; - struct xfs_trans_res tres = {0}; + int i; + struct xfs_bmbt_irec map[XFS_BMAP_MAX_NMAP]; + xfs_extlen_t nsumblocks; + int nmap; + struct xfs_inode *rbmip; + struct xfs_inode *rsumip; + struct xfs_inode *rrmapip; + struct xfs_trans *tp; + struct cred creds; + struct fsxattr fsxattrs; + struct xfs_trans_res tres = {0}; /* * First, allocate the inodes. @@ -680,8 +681,24 @@ rtinit( rsumip->i_d.di_size = mp->m_rsumsize; libxfs_trans_log_inode(tp, rsumip, XFS_ILOG_CORE); libxfs_log_sb(tp); - libxfs_trans_commit(tp); mp->m_rsumip = rsumip; + + /* If we have rmap and a realtime device, create a rtrmapbt inode. */ + if (xfs_sb_version_hasrmapbt(&mp->m_sb) && mp->m_sb.sb_rblocks > 0) { + error = -libxfs_inode_alloc(&tp, NULL, S_IFREG, 1, 0, + &creds, &fsxattrs, &rrmapip); + if (error) { + fail(_("Realtime rmap inode allocation failed"), error); + } + mp->m_sb.sb_rrmapino = rrmapip->i_ino; + rrmapip->i_d.di_size = 0; + rrmapip->i_d.di_format = XFS_DINODE_FMT_RMAP; + libxfs_trans_log_inode(tp, rrmapip, XFS_ILOG_CORE); + libxfs_log_sb(tp); + mp->m_rrmapip = rrmapip; + } + libxfs_trans_commit(tp); + /* * Next, give the bitmap file some zero-filled blocks. */ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index fc565c0..e7bc044 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2141,13 +2141,6 @@ _("reflink not supported without CRC support\n")); } - if (sb_feat.rmapbt && xi.rtname) { - fprintf(stderr, -_("rmapbt not supported with realtime devices\n")); - usage(); - sb_feat.rmapbt = false; - } - if (nsflag || nlflag) { if (dirblocksize < blocksize || dirblocksize > XFS_MAX_BLOCKSIZE) { @@ -2908,6 +2901,18 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), exit(1); } + /* The realtime rmapbt mustn't grow taller than max btree height. */ + if (xfs_sb_version_hasrtrmapbt(&mp->m_sb) && + libxfs_btree_compute_maxlevels(mp, mp->m_rtrmap_mnr, + mp->m_sb.sb_rblocks) > XFS_BTREE_MAXLEVELS) { + fprintf(stderr, +_("%s: max realtime rmapbt height (%d) exceeds configured maximum (%d)\n"), + progname, libxfs_btree_compute_maxlevels(mp, + mp->m_rtrmap_mnr, mp->m_sb.sb_rblocks), + XFS_BTREE_MAXLEVELS); + exit(1); + } + /* * XXX: this code is effectively shared with the kernel growfs code. * These initialisations should be pulled into libxfs to keep the From darrick.wong@oracle.com Thu Aug 25 19:02:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 956F6849C for ; Thu, 25 Aug 2016 19:02:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4AAF58F8035 for ; Thu, 25 Aug 2016 17:02:40 -0700 (PDT) X-ASG-Debug-ID: 1472169756-0bf81509b01e1ed0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id GUmMaBr4JBVKFIG1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:02:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q0267d008500 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:02:06 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7Q025IX027936 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:02:05 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q024j5006460; Fri, 26 Aug 2016 00:02:04 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:02:03 -0700 Subject: [PATCH v10 0/3] fallocate for block devices From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH v10 0/3] fallocate for block devices To: axboe@kernel.dk, darrick.wong@oracle.com Cc: linux-block@vger.kernel.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, hch@infradead.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, bart.vanassche@sandisk.com Date: Thu, 25 Aug 2016 17:02:01 -0700 Message-ID: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169756 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1591 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hi, This is a redesign of the patch series that fixes various interface problems with the existing "zero out this part of a block device" code. BLKZEROOUT2 is gone. The first patch is still a fix to the existing BLKZEROOUT ioctl to invalidate the page cache if the zeroing command to the underlying device succeeds. Without this patch we still have the pagecache coherence bug that's been in the kernel forever. The second patch changes the internal block device functions to reject attempts to discard or zeroout that are not aligned to the logical block size. Previously, we only checked that the start/len parameters were 512-byte aligned, which caused kernel BUG_ONs for unaligned IOs to 4k-LBA devices. The third patch creates an fallocate handler for block devices, wires up the FALLOC_FL_PUNCH_HOLE flag to zeroing-discard, and connects FALLOC_FL_ZERO_RANGE to write-same so that we can have a consistent fallocate interface between files and block devices. It also allows the combination of PUNCH_HOLE and NO_HIDE_STALE to invoke non-zeroing discard. Test cases for the new block device fallocate are now in xfstests as generic/349-351. Comments and questions are, as always, welcome. Patches are against 4.8-rc3. v7: Strengthen parameter checking and fix various code issues pointed out by Linus and Christoph. v8: More code rearranging, rebase to 4.6-rc3, and dig into alignment issues. v9: Forward port to 4.7. v10: Forward port to 4.8. Remove the extra call to invalidate_inode_pages2_range per Bart Van Assche's request. --D From darrick.wong@oracle.com Thu Aug 25 19:02:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3A2B584BC for ; Thu, 25 Aug 2016 19:02:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6702AC001 for ; Thu, 25 Aug 2016 17:02:46 -0700 (PDT) X-ASG-Debug-ID: 1472169762-0bf57c55b31c8520001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id w45mqi6ZwDVDxhDX (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:02:42 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q02Cbx002763 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:02:12 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7Q02Bpp028332 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:02:12 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q02Aw5008412; Fri, 26 Aug 2016 00:02:11 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:02:10 -0700 Subject: [PATCH 1/3] block: invalidate the page cache when issuing BLKZEROOUT. From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 1/3] block: invalidate the page cache when issuing BLKZEROOUT. To: axboe@kernel.dk, darrick.wong@oracle.com Cc: linux-block@vger.kernel.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, hch@infradead.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, bart.vanassche@sandisk.com, Christoph Hellwig Date: Thu, 25 Aug 2016 17:02:08 -0700 Message-ID: <147216972858.7860.4375500103860205870.stgit@birch.djwong.org> In-Reply-To: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> References: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169762 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1848 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Invalidate the page cache (as a regular O_DIRECT write would do) to avoid returning stale cache contents at a later time. v5: Refactor the 4.4 refactoring of the ioctl code into separate functions. Split the page invalidation and the new ioctl into separate patches. v6: Remove the call to invalidate_inode_pages2_range since we don't need it. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Reviewed-by: Martin K. Petersen --- block/ioctl.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/block/ioctl.c b/block/ioctl.c index ed2397f..755119c 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -225,7 +225,8 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, unsigned long arg) { uint64_t range[2]; - uint64_t start, len; + struct address_space *mapping; + uint64_t start, end, len; if (!(mode & FMODE_WRITE)) return -EBADF; @@ -235,18 +236,23 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, start = range[0]; len = range[1]; + end = start + len - 1; if (start & 511) return -EINVAL; if (len & 511) return -EINVAL; - start >>= 9; - len >>= 9; - - if (start + len > (i_size_read(bdev->bd_inode) >> 9)) + if (end >= (uint64_t)i_size_read(bdev->bd_inode)) + return -EINVAL; + if (end < start) return -EINVAL; - return blkdev_issue_zeroout(bdev, start, len, GFP_KERNEL, false); + /* Invalidate the page cache, including dirty pages */ + mapping = bdev->bd_inode->i_mapping; + truncate_inode_pages_range(mapping, start, end); + + return blkdev_issue_zeroout(bdev, start >> 9, len >> 9, GFP_KERNEL, + false); } static int put_ushort(unsigned long arg, unsigned short val) From darrick.wong@oracle.com Thu Aug 25 19:02:51 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0ED1284BC for ; Thu, 25 Aug 2016 19:02:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D5D448F8039 for ; Thu, 25 Aug 2016 17:02:50 -0700 (PDT) X-ASG-Debug-ID: 1472169764-0bf57c55b21c8520001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 368GVYjtDFzVktly (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:02:45 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q02JmQ008612 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:02:19 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7Q02I2K028546 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:02:18 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7Q02HhP027533; Fri, 26 Aug 2016 00:02:18 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:02:17 -0700 Subject: [PATCH 2/3] block: require write_same and discard requests align to logical block size From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 2/3] block: require write_same and discard requests align to logical block size To: axboe@kernel.dk, darrick.wong@oracle.com Cc: linux-block@vger.kernel.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, hch@infradead.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, bart.vanassche@sandisk.com, Christoph Hellwig Date: Thu, 25 Aug 2016 17:02:15 -0700 Message-ID: <147216973554.7860.12766463906492752223.stgit@birch.djwong.org> In-Reply-To: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> References: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472169765 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2259 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Make sure that the offset and length arguments that we're using to construct WRITE SAME and DISCARD requests are actually aligned to the logical block size. Failure to do this causes other errors in other parts of the block layer or the SCSI layer because disks don't support partial logical block writes. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig Reviewed-by: Bart Van Assche Reviewed-by: Martin K. Petersen --- block/blk-lib.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/block/blk-lib.c b/block/blk-lib.c index 083e56f..46fe924 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -31,6 +31,7 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, unsigned int granularity; enum req_op op; int alignment; + sector_t bs_mask; if (!q) return -ENXIO; @@ -50,6 +51,10 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, op = REQ_OP_DISCARD; } + bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; + /* Zero-sector (unknown) and one-sector granularities are the same. */ granularity = max(q->limits.discard_granularity >> 9, 1U); alignment = (bdev_discard_alignment(bdev) >> 9) % granularity; @@ -150,10 +155,15 @@ int blkdev_issue_write_same(struct block_device *bdev, sector_t sector, unsigned int max_write_same_sectors; struct bio *bio = NULL; int ret = 0; + sector_t bs_mask; if (!q) return -ENXIO; + bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; + /* Ensure that max_write_same_sectors doesn't overflow bi_size */ max_write_same_sectors = UINT_MAX >> 9; @@ -202,6 +212,11 @@ static int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, int ret; struct bio *bio = NULL; unsigned int sz; + sector_t bs_mask; + + bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; while (nr_sects != 0) { bio = next_bio(bio, min(nr_sects, (sector_t)BIO_MAX_PAGES), From darrick.wong@oracle.com Thu Aug 25 19:02:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E91F84D0 for ; Thu, 25 Aug 2016 19:02:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D6B9730404E for ; Thu, 25 Aug 2016 17:02:51 -0700 (PDT) X-ASG-Debug-ID: 1472169769-0bf57b531320a150001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 8qIVaj4I9GXqz4y2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 17:02:50 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q02QxD002924 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 00:02:26 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7Q02Po3028681 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 00:02:26 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q02OVl006622; Fri, 26 Aug 2016 00:02:25 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 17:02:24 -0700 Subject: [PATCH 3/3] block: implement (some of) fallocate for block devices From: "Darrick J. Wong" X-ASG-Orig-Subj: [PATCH 3/3] block: implement (some of) fallocate for block devices To: axboe@kernel.dk, darrick.wong@oracle.com Cc: linux-block@vger.kernel.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, hch@infradead.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, bart.vanassche@sandisk.com Date: Thu, 25 Aug 2016 17:02:22 -0700 Message-ID: <147216974248.7860.6130980039718256377.stgit@birch.djwong.org> In-Reply-To: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> References: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472169769 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5028 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines After much discussion, it seems that the fallocate feature flag FALLOC_FL_ZERO_RANGE maps nicely to SCSI WRITE SAME; and the feature FALLOC_FL_PUNCH_HOLE maps nicely to the devices that have been whitelisted for zeroing SCSI UNMAP. Punch still requires that FALLOC_FL_KEEP_SIZE is set. A length that goes past the end of the device will be clamped to the device size if KEEP_SIZE is set; or will return -EINVAL if not. Both start and length must be aligned to the device's logical block size. Since the semantics of fallocate are fairly well established already, wire up the two pieces. The other fallocate variants (collapse range, insert range, and allocate blocks) are not supported. v2: Incorporate feedback from Christoph & Linus. Tentatively add a requirement that the fallocate arguments be aligned to logical block size, and put in a few XXX comments ahead of LSF discussion. v3: Forward port to 4.7. Signed-off-by: Darrick J. Wong --- fs/block_dev.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/open.c | 3 +- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index c3cdde8..4df3fc8 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include "internal.h" @@ -1786,6 +1787,88 @@ static const struct address_space_operations def_blk_aops = { .is_dirty_writeback = buffer_check_dirty_writeback, }; +#define BLKDEV_FALLOC_FL_SUPPORTED \ + (FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | \ + FALLOC_FL_ZERO_RANGE | FALLOC_FL_NO_HIDE_STALE) + +static long blkdev_fallocate(struct file *file, int mode, loff_t start, + loff_t len) +{ + struct block_device *bdev = I_BDEV(bdev_file_inode(file)); + struct request_queue *q = bdev_get_queue(bdev); + struct address_space *mapping; + loff_t end = start + len - 1; + loff_t isize; + int error; + + /* Fail if we don't recognize the flags. */ + if (mode & ~BLKDEV_FALLOC_FL_SUPPORTED) + return -EOPNOTSUPP; + + /* Don't go off the end of the device. */ + isize = i_size_read(bdev->bd_inode); + if (start >= isize) + return -EINVAL; + if (end > isize) { + if (mode & FALLOC_FL_KEEP_SIZE) { + len = isize - start; + end = start + len - 1; + } else + return -EINVAL; + } + + /* + * Don't allow IO that isn't aligned to logical block size. + */ + if ((start | len) & (bdev_logical_block_size(bdev) - 1)) + return -EINVAL; + + /* Invalidate the page cache, including dirty pages. */ + mapping = bdev->bd_inode->i_mapping; + truncate_inode_pages_range(mapping, start, end); + + switch (mode) { + case FALLOC_FL_ZERO_RANGE: + case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE: + error = blkdev_issue_zeroout(bdev, start >> 9, len >> 9, + GFP_KERNEL, false); + if (error) + return error; + break; + case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE: + /* Only punch if the device can do zeroing discard. */ + if (!blk_queue_discard(q) || !q->limits.discard_zeroes_data) + return -EOPNOTSUPP; + error = blkdev_issue_discard(bdev, start >> 9, len >> 9, + GFP_KERNEL, 0); + if (error) + return error; + break; + case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: + /* + * XXX: a well known search engine vendor interprets this + * flag (in other circumstances) to mean "I don't care if + * we can read stale contents later". Is it appropriate + * to wire this up to the non-zeroing discard? + */ + error = blkdev_issue_discard(bdev, start >> 9, len >> 9, + GFP_KERNEL, 0); + if (error) + return error; + break; + default: + return -EOPNOTSUPP; + } + + /* + * Invalidate again; if someone wandered in and dirtied a page, + * the caller will be given -EBUSY; + */ + return invalidate_inode_pages2_range(mapping, + start >> PAGE_SHIFT, + end >> PAGE_SHIFT); +} + const struct file_operations def_blk_fops = { .open = blkdev_open, .release = blkdev_close, @@ -1800,6 +1883,7 @@ const struct file_operations def_blk_fops = { #endif .splice_read = generic_file_splice_read, .splice_write = iter_file_splice_write, + .fallocate = blkdev_fallocate, }; int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg) diff --git a/fs/open.c b/fs/open.c index 4fd6e25..01b6092 100644 --- a/fs/open.c +++ b/fs/open.c @@ -289,7 +289,8 @@ int vfs_fallocate(struct file *file, int mode, loff_t offset, loff_t len) * Let individual file system decide if it supports preallocation * for directories or not. */ - if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) + if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode) && + !S_ISBLK(inode->i_mode)) return -ENODEV; /* Check for wrap through zero too */ From bunkertor@tiscali.it Thu Aug 25 20:01:07 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 839CF7DC1 for ; Thu, 25 Aug 2016 20:01:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55D2C304043 for ; Thu, 25 Aug 2016 18:01:04 -0700 (PDT) X-ASG-Debug-ID: 1472173259-0bf57b531320b480001-NocioJ Received: from tea.teachservices.com ([192.232.206.62]) by cuda.sgi.com with ESMTP id WGpe55tX6mZIpzjx (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 25 Aug 2016 18:00:59 -0700 (PDT) X-Barracuda-Envelope-From: bunkertor@tiscali.it X-Barracuda-Effective-Source-IP: UNKNOWN[192.232.206.62] X-Barracuda-Apparent-Source-IP: 192.232.206.62 Received: from h58n10-sde-a31.ias.bredband.telia.com ([81.231.137.58]:55209 helo=ckdujz.com) by tea.teachservices.com with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.87) (envelope-from ) id 1bd5Vy-0001FY-0R; Thu, 25 Aug 2016 20:00:58 -0500 From: Freeradius-Users To: "trump_zhang" , "xen-users-request" , "wagnermarques" , "xfs" Subject: Re: happy)) Date: Fri, 26 Aug 2016 04:00:53 +0300 X-ASG-Orig-Subj: Re: happy)) Message-ID: <0000683414a4$3c3566b6$89d960b1$@tiscali.it> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0025_0117FEA6.0778C777" X-Mailer: Microsoft Office Outlook, Build 17.551210 Thread-Index: AdH/HsQ9XsdKayDzz1+ZzmpdWD/SCw== Content-Language: de X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - tea.teachservices.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tiscali.it X-Get-Message-Sender-Via: tea.teachservices.com: authenticated_id: matt@prowant.com X-Authenticated-Sender: tea.teachservices.com: matt@prowant.com X-Barracuda-Connect: UNKNOWN[192.232.206.62] X-Barracuda-Start-Time: 1472173259 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2447 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.11 X-Barracuda-Spam-Status: No, SCORE=0.11 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, RDNS_NONE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This is a multipart message in MIME format. ------=_NextPart_000_0025_0117FEA6.0778C777 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hey friend, I'm so happy to hear the latest news from our friends, you may read it here Later, Freeradius-Users ------=_NextPart_000_0025_0117FEA6.0778C777 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

<= span lang=3DEN-US>Hey friend,

 

 

<= span lang=3DEN-US>I'm so happy to hear the latest news from our frien= ds, you may read it here http://thubithinu.sandersdefense.com/oihgp

 

Later, Freeradius-Users=

------=_NextPart_000_0025_0117FEA6.0778C777-- From martin.petersen@oracle.com Thu Aug 25 21:16:35 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 435207F2C for ; Thu, 25 Aug 2016 21:16:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0635A8F8039 for ; Thu, 25 Aug 2016 19:16:31 -0700 (PDT) X-ASG-Debug-ID: 1472177789-0bf8155c751ef080001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id pDrRp59XuWDP6PXW (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Thu, 25 Aug 2016 19:16:30 -0700 (PDT) X-Barracuda-Envelope-From: martin.petersen@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7Q2FxrZ013781 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 02:16:00 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q2Fxtp010688 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 02:15:59 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7Q2Ft1V003673; Fri, 26 Aug 2016 02:15:57 GMT Received: from ca-mkp.ca.oracle.com (/10.159.214.123) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Aug 2016 19:15:55 -0700 To: "Darrick J. Wong" Cc: axboe@kernel.dk, hch@infradead.org, tytso@mit.edu, martin.petersen@oracle.com, snitzer@redhat.com, linux-api@vger.kernel.org, bfoster@redhat.com, xfs@oss.sgi.com, linux-block@vger.kernel.org, dm-devel@redhat.com, linux-fsdevel@vger.kernel.org, bart.vanassche@sandisk.com Subject: Re: [PATCH v10 0/3] fallocate for block devices From: "Martin K. Petersen" X-ASG-Orig-Subj: Re: [PATCH v10 0/3] fallocate for block devices Organization: Oracle Corporation References: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> Date: Thu, 25 Aug 2016 22:15:52 -0400 In-Reply-To: <147216972158.7860.13484490862091226290.stgit@birch.djwong.org> (Darrick J. Wong's message of "Thu, 25 Aug 2016 17:02:01 -0700") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472177789 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 386 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain >>>>> "Darrick" == Darrick J Wong writes: Darrick, Darrick> This is a redesign of the patch series that fixes various Darrick> interface problems with the existing "zero out this part of a Darrick> block device" code. BLKZEROOUT2 is gone. Looks good to me. Let's get this merged. Pretty please! -- Martin K. Petersen Oracle Linux Engineering From david@fromorbit.com Fri Aug 26 01:03:59 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 550697CA4 for ; Fri, 26 Aug 2016 01:03:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1DC3C8F8040 for ; Thu, 25 Aug 2016 23:03:55 -0700 (PDT) X-ASG-Debug-ID: 1472190465-0bf57b5311210f30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id TBrO6deVMv9tHG0A for ; Thu, 25 Aug 2016 22:47:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BICAAz179XEAI1LHldg0EBAQEBAR5WfIZynAMQAQEGjHGGFIIPggEghXcEgVs5FAECAQEBAQEBAQYBAQEBAQEBATdAhT4eHSQ0BSUDBxsSiDLABg4ehUiJPIJjC4MHBYgsA5EdhiCIf4F3jWMChmuJUR6CJIJAKjSEH4ItAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 26 Aug 2016 15:17:43 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bd9zS-0003Es-TK; Fri, 26 Aug 2016 15:47:42 +1000 Date: Fri, 26 Aug 2016 15:47:42 +1000 From: Dave Chinner To: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: [ANNOUNCE] xfsprogs: master branch updated to b64af2c Message-ID: <20160826054742.GR22388@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to b64af2c MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="oLBj+sq0vYjzfsbl" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472190471 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4035 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32334 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --oLBj+sq0vYjzfsbl Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Folks, The master and for-next branch xfsprogs repository at: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git have just been updated. This update includes various reverse mapping fixes and new xfs_quota functionality. It also enables xfs_quota to be used on non-XFS filesystems. This is the first time the reverse mapping support has appeared in the master branch - it pulls in all the previous changes staged int eh for-next branch as well as the commits listed below. If this settles without serious issues, I'll probably tag it with 4.8-rc1. -Dave. The new head of the master branch is commit: b64af2c xfs_db: add crc manipulation commands New Commits: Bill O'Donnell (2): [29647c8] xfs_quota: add capabilities for use on non-XFS filesystems [b20b6c2] xfs_quota: certain commands must always be available Darrick J. Wong (7): [574b415] xfs: don't perform lookups on zero-height btrees [94a22de] xfs: fix some key handling problems in _btree_simple_query_= range [a365498] xfs: simple btree query range should look right if LE looku= p fails [83d4957] libxcmd: fix mount option parsing to find rt/log devices [138ce9f] misc: fix Coverity errors [e2f6065] misc: fix libxfs api violations [2d27377] xfs_repair: fix naming problems in repair/rmap.c Eric Sandeen (3): [74642d8] xfs_metadump: don't warn about unobfuscated log with -o [bb92709] xfs_quota: wire up XFS_GETQSTATV [b64af2c] xfs_db: add crc manipulation commands Code Diffstat: db/Makefile | 2 +- db/bmap.c | 4 +- db/bmroot.c | 4 +- db/check.c | 6 +- db/command.c | 2 + db/crc.c | 188 +++++++++++++++++++++++++++++++++++++++= +++++++ db/crc.h | 21 ++++++ db/flist.c | 35 +++++++++ db/flist.h | 1 + db/frag.c | 2 +- db/fsmap.c | 15 ++-- db/init.c | 2 +- db/io.c | 34 +++++++-- db/logformat.c | 2 +- db/metadump.c | 10 ++- db/write.h | 2 +- include/command.h | 3 +- include/path.h | 1 + include/xqm.h | 32 ++++++++ io/init.h | 2 +- io/open.c | 2 +- libxcmd/help.c | 3 +- libxcmd/paths.c | 20 +++-- libxcmd/quit.c | 3 +- libxfs/libxfs_api_defs.h | 15 ++++ libxfs/xfs_btree.c | 14 +++- man/man8/xfs_db.8 | 27 +++++-- man/man8/xfs_quota.8 | 7 ++ mkfs/maxtrres.c | 2 +- mkfs/xfs_mkfs.c | 46 ++++++------ quota/free.c | 2 + quota/init.c | 48 +++++++++++- quota/init.h | 3 + quota/linux.c | 2 + quota/path.c | 5 +- quota/project.c | 1 + quota/quot.c | 1 + quota/quota.c | 2 + quota/report.c | 11 ++- quota/state.c | 121 +++++++++++++++++++++-------- quota/util.c | 1 + repair/dinode.c | 10 +-- repair/phase4.c | 12 +-- repair/phase5.c | 73 +++++++++--------- repair/phase6.c | 6 +- repair/prefetch.c | 4 +- repair/rmap.c | 104 ++++++++++++------------- repair/rmap.h | 26 +++---- repair/sb.c | 2 +- repair/scan.c | 6 +- repair/xfs_repair.c | 4 +- tools/find-api-violations.sh | 38 ++++++++++ 52 files changed, 754 insertions(+), 235 deletions(-) create mode 100644 db/crc.c create mode 100644 db/crc.h create mode 100755 tools/find-api-violations.sh --=20 Dave Chinner david@fromorbit.com --oLBj+sq0vYjzfsbl Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXv9f+AAoJEK3oKUf0dfodqIMP/juPmogeb0PUxg0bnbVDoqWh BUa0lXfXXvf2OoEQl4uuupKlsnRT92lqkV58wkYX36Y4se/lEg/OQoqdxN+lSXN5 wseSHSS2OjQ9oipDvIHLJKnn31fcECQANhJRdLts0+KixOkDPBePwLFnnkuqReng A9/E8+A2XAgWNS3jQRTYIl2bm62KeQLP6o+12pTIzpxbFSjvr8abOj8ymEtcEg/S 2QRpI6fY4qWJR/KEG1YfcV5j4VYlgjlK62PQvwwrd2gaNSu0B+a5Easvxiwou/DF kQFHdWQc0z2XL2PkY/hthtSYlWRv8a/9CDf8DI565tKTHDV6wnX9/l6VoYmZ6fqe HH72oQ/QcmLEQsWPM8VtRSilP5Uc/21y0PdAswm/LbN9cnRFTyHhYlA6wqfWJoby hsSNM40mU54cYf+Tgqq7y1sH7Vpt14FORuEpYRo/5wx9i8YMTT8vVbCbeDJRGyqQ MFtJ7yzR1vYSec9kPg0zLPtBXrnDKwtOThO33uJeCFKIMT/MZSGEYzYgslto4Jh7 NaL9D0yLvq2y3GcZXdQHIS6ngU5T60hetU2q9cXdsJl7hHIH9JdcVPkr4mrSC5JI NuQBCrudurvU5bu2LDHzRf0I1NIPKJX9XKCRbkzzK2OgvRC2G5xqXtHYCkWWRvSX pvPE6O7a4oIBzqiZurQ3 =TOFf -----END PGP SIGNATURE----- --oLBj+sq0vYjzfsbl-- From david@fromorbit.com Fri Aug 26 01:44:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 377947CC7 for ; Fri, 26 Aug 2016 01:44:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA44D8F8054 for ; Thu, 25 Aug 2016 23:43:51 -0700 (PDT) X-ASG-Debug-ID: 1472192741-0bf8155c741fa2f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 3exjtSCyBzcS2MQB for ; Thu, 25 Aug 2016 23:25:42 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CFCABu4L9XEAI1LHldg0EBAQEBAR5WfIZynAMMBgaMcYYUgg+CARyFewSBWDkUAQIBAQEBAQEBBgEBAQEBAQEBN0CFPjskNAUlAwcbEog3wCIOHoVIjB8LgwcFlAWFR4YgiH+PWgKQPB6CJIJAKjSGTAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 26 Aug 2016 15:55:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bdAZg-0003JC-A6; Fri, 26 Aug 2016 16:25:08 +1000 Date: Fri, 26 Aug 2016 16:25:08 +1000 From: Dave Chinner To: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: [ANNOUNCE] xfs: for-next branch updated to 800b269 Message-ID: <20160826062508.GG19025@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 800b269 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="SnV5plBeK2Ge1I9g" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472192742 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1588 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32334 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --SnV5plBeK2Ge1I9g Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. This (hopefully) is the last set of fixes for the 4.8 cycle - I plan to send them to linus by the middle of next week. For this point onwards I'll be focussing on patches for the 4.9 merge window - I'm not sure how much of the reflink set we'll get through before the window closes, but I'm going to take a good swing at getting that merged for 4.9.... -Dave. The new head of the for-next branch is commit: 800b269 xfs: prevent dropping ioend completions during buftarg wait New Commits: Brian Foster (1): [800b269] xfs: prevent dropping ioend completions during buftarg wait Darrick J. Wong (5): [ed150e1] xfs: don't perform lookups on zero-height btrees [738f57c] xfs: disallow mounting of realtime + rmap filesystems [da1f039] xfs: don't log the entire end of the AGF [7222789] xfs: fix some key handling problems in _btree_simple_query_= range [5b5c2db] xfs: simple btree query range should look right if LE looku= p fails Dave Chinner (1): [f3d7ebd] xfs: fix superblock inprogress check Code Diffstat: fs/xfs/libxfs/xfs_alloc.c | 2 ++ fs/xfs/libxfs/xfs_btree.c | 14 +++++++++++++- fs/xfs/libxfs/xfs_format.h | 6 ++++-- fs/xfs/libxfs/xfs_sb.c | 3 ++- fs/xfs/xfs_buf.c | 2 +- fs/xfs/xfs_super.c | 9 ++++++++- 6 files changed, 30 insertions(+), 6 deletions(-) --=20 Dave Chinner david@fromorbit.com --SnV5plBeK2Ge1I9g Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXv+DDAAoJEK3oKUf0dfodYFYP/jeCAlZh1UFn/0v6gas2TzH9 yxtUJcCN2I/6Dj6+uIT74Ny+v/ELkpwQUC7FUPgvk7nLxokVhgGc+q3EUu2jQhYy sT41gWDs2vrtsFeWBhHoLrKC/qOsyCZrvsDz47K6xYTVj+YeK3VCDUUiwmMuIrZY pJDpwIJwVY84O8kx7j736U8UPsLz+56iVG8lzaJ2YE55tZOUCKLVB2nKNmgMo8XK PeQJB0LtGZvcU7EycqM8t/K1NQl7i4z815VLNAkKPBFtklI+CPOCvVuGX6sbfeaL WaWZBZVDBrwA0HOLcedTRlYO69BlbnYPklWEj1QOkzHLqucafMgBB3+0JAMHk4ec tVQIAbD5RsHl6jdq6n1voSPDeTmXH7HTyEVA9uWfIpPUFizQO+Ovy1TzDwri+Twa AkBRiEpLts93Bfpw17mklJmg5o+PEIJnpEhwTSemRrw3Anf1YnXXWKtaVmXllc+J Ek0Opo34nxUK7shtLmWw1bqUUE7nOcVeYxlHlHcrYmeS4yuI8g3NtIRAKZ7sWRur ZLfNE8HsOZdWes8/1R7C6uN7Scehlxezka/mB1fbKo6/Q6kmKEAuRc7YfDvfZ9x9 rNSnng+fJKlGFQLNLlz78EEzmmjRe7CwUOAZXJCr3A96fW87/Rz0Y8VoYC56q7ZL 6SUoukic2tYzsT/GJPjt =0LS3 -----END PGP SIGNATURE----- --SnV5plBeK2Ge1I9g-- From BATV+5f2fde33e9409180a5a2+4751+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 26 02:48:52 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3580F7CA1 for ; Fri, 26 Aug 2016 02:48:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F40FB8F8033 for ; Fri, 26 Aug 2016 00:48:48 -0700 (PDT) X-ASG-Debug-ID: 1472197725-0bf57c55b41dd4b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 7enCOXsbl15Y5BKZ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 26 Aug 2016 00:48:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5f2fde33e9409180a5a2+4751+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bdBsa-0003LK-Oj; Fri, 26 Aug 2016 07:48:44 +0000 Date: Fri, 26 Aug 2016 00:48:44 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 Message-ID: <20160826074844.GA17137@infradead.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 References: <20160826062508.GG19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826062508.GG19025@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472197725 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 219 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Hi Dave, please consider: "[PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems" for 4.8. It fixes a regression in the iomap-based fiemap implementation, and it's fairly trivial as well. From Sales.69@fashion-business.com Fri Aug 26 02:53:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 080D57CA7 for ; Fri, 26 Aug 2016 02:53:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75445AC001 for ; Fri, 26 Aug 2016 00:53:37 -0700 (PDT) X-ASG-Debug-ID: 1472198013-0bf8155c751ffa30001-NocioJ Received: from fashion-business.com ([14.218.77.66]) by cuda.sgi.com with SMTP id 5CEgNKxj4AW7sTFb for ; Fri, 26 Aug 2016 00:53:34 -0700 (PDT) X-Barracuda-Envelope-From: Sales.69@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.77.66] X-Barracuda-Apparent-Source-IP: 14.218.77.66 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Fri, 26 Aug 2016 15:50:50 +0800 From: "angelbervogue@sina.com" Subject: Re: European style handbags of 2016 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: European style handbags of 2016 MIME-Version: 1.0 Sender: Sales.69@fashion-business.com Reply-To: angelbervogue@sina.com Date: Fri, 26 Aug 2016 15:50:50 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.77.66] X-Barracuda-Start-Time: 1472198013 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1999 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160826075337.2067BD80084@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT48U1BBTiBzdHlsZT0iRk9OVC1G QU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OyI+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 Ij5IZWxsbyZuYnNwO0ZyaWVuZCw8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OyI+PG86cD48 L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWxlZnQ+PFNQQU4gDQpz dHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OyI+SG93Jm5ic3A7YXJlJm5ic3A7eW91PyZuYnNwO1dlJm5ic3A7Z2V0Jm5i c3A7eW91ciZuYnNwO2luZm9ybWF0aW9uJm5ic3A7ZnJvbSZuYnNwO2ludGVybmV0LjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 Ij5XZSBzcGVjaWFsaXplZCANCmluIHZvZ3VlIGJhZyBzdWNoIGFzIEV1cm8tc3R5bGUuIG91ciBm YWN0b3J5IGhhcyBiZWVuIGNlcnRpZmllZCBieSBJU085MDAxLCANClJvSFMsIEVNUyBvcmdhbml6 YXRpb24sIE9FTSAmYW1wOyBPRE0gb3JkZXJzIGFjY2VwdCwgd2UgaGF2ZSBwcm9mZXNzaW9uYWwg DQpkZXNpZ25lciB0byBtYWtlIGRldmVsb3BtZW50IGFuZCBtYXJrZXQgcGVvcGxlIHRvIGNvbnRy b2wgaGUgbmV3IGZhc2hpb24gZmVsbGluZyANCmluIHRoZSBXb3JsZC1NYXJrZXQuIEFsbCB0aGUg cHJvZHVjdHMgYXJlIGZpbmlzaGVkIGJ5IGhhbmRtYWRlIG9mIGNyYWZ0c3Blb3BsZS4gDQpJZiB5 b3UgYXJlIGludGVyZXNlZCB3aXRoIHVzLCBwbGVhc2UgZnJlZSBsZXQgbWUga25vdywgSSB3aWxs IHNlbmQgdGhlIGNhdGFsb2cgDQp3aXRoIHRoZSZuYnNwO2RldGFpbHMgdG8geW91Jm5ic3A7IGZv ciBjaGVja2luZy48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWxlZnQ+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OyI+V2Ugd2lsbCBiZSBtb3JlIA0KdGhhbiBoYXBweSB0byBhc3Np c3QgeW91LjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7Ij5CLiANCldpc2hlczwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgYWxpZ249bGVmdD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7Ij5BbmdlbG8gDQpIdWFuZzwvU1BB Tj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7Ij5Ta3lwZTogDQpkYXZpZTE4MTgxODwvU1BBTj48L1A+PC9TUEFOPjwvQk9EWT48L0hUTUw+ DQoNCg== From zlang@redhat.com Fri Aug 26 03:30:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 148997CD8 for ; Fri, 26 Aug 2016 03:30:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D9B29304039 for ; Fri, 26 Aug 2016 01:30:34 -0700 (PDT) X-ASG-Debug-ID: 1472200232-0bf57c55b11e30d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MieUacdNmSiHCCev (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 01:30:33 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9E33C1634 for ; Fri, 26 Aug 2016 08:30:32 +0000 (UTC) Received: from localhost (vpn1-5-154.pek2.redhat.com [10.72.5.154]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7Q8UVmb002595; Fri, 26 Aug 2016 04:30:31 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: Zorro Lang Subject: [PATCH] xfs_quota: fix missing break after foreign_allowed option Date: Fri, 26 Aug 2016 16:30:06 +0800 X-ASG-Orig-Subj: [PATCH] xfs_quota: fix missing break after foreign_allowed option Message-Id: <1472200206-15728-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 26 Aug 2016 08:30:32 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472200233 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 570 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 New quota "-f" has been brought in by: 29647c8 xfs_quota: add capabilities for use on non-XFS filesystems But Coverity Scan find a missing break in quota/init.c: init() function. Signed-off-by: Zorro Lang --- quota/init.c | 1 + 1 file changed, 1 insertion(+) diff --git a/quota/init.c b/quota/init.c index 44be322..2c18c8b 100644 --- a/quota/init.c +++ b/quota/init.c @@ -153,6 +153,7 @@ init( break; case 'f': foreign_allowed = true; + break; case 't': mtab_file = optarg; break; -- 2.7.4 From Sales.37@fashion-business.com Fri Aug 26 03:54:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1C6FD7CB1 for ; Fri, 26 Aug 2016 03:54:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E115E8F8035 for ; Fri, 26 Aug 2016 01:54:32 -0700 (PDT) X-ASG-Debug-ID: 1472201668-0bf57b531321cca0001-NocioJ Received: from fashion-business.com ([14.218.77.66]) by cuda.sgi.com with SMTP id j57s5RZSjPDPHujU for ; Fri, 26 Aug 2016 01:54:29 -0700 (PDT) X-Barracuda-Envelope-From: Sales.37@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.77.66] X-Barracuda-Apparent-Source-IP: 14.218.77.66 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Fri, 26 Aug 2016 16:19:56 +0800 From: "angelbervogue@sina.com" Subject: Re: ANGELBER bag will be sold in June of World-market To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: ANGELBER bag will be sold in June of World-market MIME-Version: 1.0 Sender: Sales.37@fashion-business.com Reply-To: angelbervogue@sina.com Date: Fri, 26 Aug 2016 16:19:56 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.77.66] X-Barracuda-Start-Time: 1472201668 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2269 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32336 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160826085432.9F55B6430F5@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJMSU5FLUhF SUdIVDogMTUwJSIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBB cmlhbDsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1m YXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPkhpJm5ic3A7ZnJpZW5kLDwvU1BBTj48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48bzpwPjwv bzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTElORS1IRUlHSFQ6IDE1MCUiIGNsYXNzPU1zb05v cm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TIj5UaGlzJm5ic3A7aXMmbmJzcDtBbmdlbG8mbmJzcDtmcm9tJm5ic3A7QW5nZWxiZXImbmJz cDtWb2d1ZSZuYnNwO0NvLiwmbmJzcDtMdGQuJm5ic3A7V2UmbmJzcDthcmUmbmJzcDthJm5ic3A7 cHJvZmVzc2lvbmFsJm5ic3A7bWFudWZhY3R1cmVyJm5ic3A7YW5kJm5ic3A7ZGVzaWduZXIgDQp3 aXRoIHRoZSBiYWcgaW4gU2hlbnpoZW4gb2YgQ2hpbmEuJm5ic3A7IEFsbCZuYnNwO29mIG91ciBw cm9kdWN0cyBoYXZlIGJlZW4gDQpwYXNzZWQmbmJzcDsgSVNPOTAwMCwgQ0UsIEVNQyBjZXJ0aWZp Y2F0aW9uIGFuZCBnZXQgYSBoaWdoIHJlcHV0YXRpb24sIGdldCB0aGUgDQpob3QgbWFya2V0IGlu IEV1cm9wZSwgTm9ydGggQW1lcmljYSBhbmQgc29tZSBvdGhlciBjb3VudHJpZXMuPC9TUEFOPjwv UD4NCjxQIHN0eWxlPSJMSU5FLUhFSUdIVDogMTUwJSIgY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0K c3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPlByb2R1Y3Rz IA0KbWFpbmx5IGluY2x1ZGUgTGFkaWVzIGhhbmRiYWcsIE1lbiYjMzk7cyBicmllZmNhc2UsIEpl d2VscnkgYmFnIGV0Yy48L1NQQU4+PC9QPg0KPFAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxNTAlIiBj bGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJ WkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1m YW1pbHk6IOWui+S9kyI+UGxzIA0KZmVlbCBmcmVlIHRvIGNvbnRhY3Qgd2l0aCBtZSBpZiB5b3Ug d291bGQgbGlrZSB0byBrbm93IG1vcmUsIHdlIGNhbiBzZW5kIHRoZSANCmNhdGFsb2cgZm9yIHlv dSBjaGVja2luZy48L1NQQU4+PC9QPg0KPFAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxNTAlIiBjbGFz cz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6 IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOWui+S9kyI+VGhhbmtzIA0KYW5kIGJlc3QgcmVnYXJkcyE8L1NQQU4+PC9QPg0KPFAgc3R5 bGU9IkxJTkUtSEVJR0hUOiAxNTAlIiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+QW5nZWxvIA0KSHVhbmc8L1NQ QU4+PC9QPg0KPFAgc3R5bGU9IkxJTkUtSEVJR0hUOiAxNTAlIiBjbGFzcz1Nc29Ob3JtYWw+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+U2t5 cGU6IA0KZGF2aWUxODE4MTg8L1NQQU4+PC9QPjwvQk9EWT48L0hUTUw+DQoNCg== From asavkov@redhat.com Fri Aug 26 03:59:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 73A187CEC for ; Fri, 26 Aug 2016 03:59:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 319BB304043 for ; Fri, 26 Aug 2016 01:59:31 -0700 (PDT) X-ASG-Debug-ID: 1472201970-0bf57c55b31e4d10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qq1sThZmwDg8eJ2L (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 01:59:30 -0700 (PDT) X-Barracuda-Envelope-From: asavkov@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AE65CC0467F2; Fri, 26 Aug 2016 08:59:29 +0000 (UTC) Received: from shodan.usersys.redhat.com (dhcp-1-150.brq.redhat.com [10.34.1.150]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7Q8xSnb013285; Fri, 26 Aug 2016 04:59:29 -0400 Received: by shodan.usersys.redhat.com (Postfix, from userid 1000) id 206202C010D; Fri, 26 Aug 2016 10:59:28 +0200 (CEST) Date: Fri, 26 Aug 2016 10:59:28 +0200 From: Artem Savkov To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Message-ID: <20160826085928.GA15715@shodan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. References: <1471967653-2561-1-git-send-email-asavkov@redhat.com> <20160824015551.GB19025@dastard> <20160824080833.GA11104@shodan.usersys.redhat.com> <20160825002408.GC19025@dastard> <20160825082109.GB11104@shodan.usersys.redhat.com> <20160825224215.GF19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20160825224215.GF19025@dastard> User-Agent: Mutt/1.7+2 (e5fcfc5f9c2e) (2016-08-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 26 Aug 2016 08:59:30 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472201970 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6909 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 26, 2016 at 08:42:15AM +1000, Dave Chinner wrote: > On Thu, Aug 25, 2016 at 10:21:09AM +0200, Artem Savkov wrote: > > On Thu, Aug 25, 2016 at 10:24:08AM +1000, Dave Chinner wrote: > > > On Wed, Aug 24, 2016 at 10:08:33AM +0200, Artem Savkov wrote: > > > > On Wed, Aug 24, 2016 at 11:55:51AM +1000, Dave Chinner wrote: > > > > > On Tue, Aug 23, 2016 at 05:54:13PM +0200, Artem Savkov wrote: > > > > > > Commit "xfs: only return -errno or success from attr ->put_listent" changes the > > > > > > > > > > Please quote commits in --oneline format in changelogs - it makes it > > > > > much easier to find the change you are refering to if there is both > > > > > a commit ID and the text string in the commit message. (i.e. text > > > > > string confirms the commit id is the one you meant to quote). > > > > > > > > Noted, thanks. > > > > > > > > > > > > > > commit 2a6fba6 ("xfs: only return -errno or success from attr > > > > > ->put_listent") is the one you are refering to here, right? > > > > > > > > Yes, that is the one. > > > > > > > > > > returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient > > > > > > space in the buffer assuming that setting context->count to -1 would be enough, > > > > > > but all of the ->put_listent callers only check seen_enough. This results in > > > > > > a failed assertion: > > > > > > XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 > > > > > > in insufficient buffer size case. > > > > > > > > > > You have a test case? Can you turn it into an xfstest? We really > > > > > need regression tests that cover issues like this.... > > > > > > > > > > > > > llistxattr02 test from LTP reliably hits this, I'll see how this can be > > > > ported to xfstest. > > > > > > So, after battling the obtuse, completely useless ltp install > > > documentation and having to resort to reverse engineering a working > > > configuration using strace, I finally got this running, I think, on > > > an XFS filesystem: > > > > > > /mnt/scratch/ltp$ sudo ./runltp -b /dev/pmem1 -B xfs -z /dev/vdc -Z xfs -q -p -s llistxattr -I 100 > > > .... > > > Summary: > > > passed 1 > > > failed 0 > > > skipped 0 > > > warnings 0 > > > tst_test.c:756: INFO: Timeout per run is 0h 05m 00s > > > llistxattr02.c:76: PASS: llistxattr() failed as expected: ERANGE > > > llistxattr02.c:76: PASS: llistxattr() failed as expected: ENOENT > > > llistxattr02.c:76: PASS: llistxattr() failed as expected: EFAULT > > > .... > > > > > > And it doesn't fail. strace output: > > > > > > 24833 lsetxattr("symlink", "security.ltptest", "test", 4, XATTR_CREATE) = 0 > > > 24833 llistxattr("symlink", 0x7ffe312356b0, 1) = -1 ERANGE (Numerical result out of range) > > > 24833 llistxattr("", 0x7ffe312356a0, 20) = -1 ENOENT (No such file or directory) > > > 24833 llistxattr(0xffffffffffffffff, 0x7ffe312356a0, 20) = -1 EFAULT (Bad address) > > > > > > I'm assuming from your description that it is the first one of these > > > that fails for you as it is the "buffer too small" test case. So, > > > not as obvious as it first seems - ltp doesn't appear to be a > > > reliable reproducer of the problem, so we are going to need a custom > > > test to exercise it.... > > > > LTP doesn't check dmesg for warnings on it's own, so it is ok for the test > > to be marked as "PASSED" since we get ERANGE after all. But you should > > be able to see the warnings in dmesg. > > Of course. My systems are set up so that any critical message that > comes through dmesg is wall'd to all active sessions, so it doesn't > matter that xfstests or ltp doesn't capture the error, I know it's > happened. > > Besides, I always use CONFIG_XFS_DEBUG=y, which means these things > BUG() rather than just print a warning, and that tends to be fatal > in more ways than one... > > > I'm attaching the config I'm using. With this config I can repdroduce the > > issue with both 4.8-rc3 and next-20160825. > > What I suggest you do is try to recreate the problem manually. I'm > pretty certain I know what is different between our test > environments that is resulting in me not seeing the problem > but, really, we need more people with root cause analysis skills > around here so I don't have to spend time solving every problem that > is reported. > > That is, it's all well and good to send a patch to fix a problem, > but if we don't understand the root cause of the problem being > fixed, then we have no idea whether we've fixed the problem fully or > not. Part of understanding the root cause is finding a reliable > reproducer of the problem, part of it is reading and understanding > the code being fixed, and part of it is understanding the > environment and behaviour that demonstrates the problem. > > So when I look at the fix, and see that it doesn't reproduce on my > systems, it's clear that it's either not yet fully understood or > hasn't been fully explained by the person who understands the issue. > These are some of the questions I've asked myself to understand why > we are seeing what we've been seeing: > > - what condition in the unfixed code leads to the ASSERT > being tripped? > - how does the patch prevent that from occurring? > - at what threshold does the problem trigger (i.e. n=0, n=1, > n=2 .... ?) > - how do the environmental initial conditions affect the > test being run? > - what do security layers automatically store in the inode > at creation time? > - how can we modify the test to always trigger the assert? > > I know the answer, and it would take much less time to tell everyone > that it does to write an email like this. But that means I'll just > have to do the same thing next time, and the next time, and so on. > The more people we have that can think through issues like this and > come to the right conclusion without needing my help, the better off > we'll all be... Fair enough. The problem only shows itself with a minimum of 2 xattrs and only when the buffer gets depleted before the last one. LTP's llistxattr02 test only sets one xattr, but on my testsystem "security.selinux" attribute is automatically added on file creation which allows this bug to be reproduced. So I would assume that on your systems there are no automatically created xattrs and thats why you can't reproduce this. Furthermore if buffersize is such that it is enough to hold the last xattr's name, but not enough to hold the sum of preceeding xattrs listxattr won't fail with ERANGE, but will suceed returning that xattr's name without the first character. The first character end's up overwriting whatever is stored at (context->alist - 1). This should also answer Eric's question on whether it only affects the ASSERT. -- Regards, Artem From zlang@redhat.com Fri Aug 26 06:05:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7D4077CAE for ; Fri, 26 Aug 2016 06:05:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2765AC004 for ; Fri, 26 Aug 2016 04:05:01 -0700 (PDT) X-ASG-Debug-ID: 1472209500-0bf8155c742081a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qED1thxPjvnZywrQ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 04:05:00 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F38D081249 for ; Fri, 26 Aug 2016 11:04:59 +0000 (UTC) Received: from localhost (vpn1-5-157.pek2.redhat.com [10.72.5.157]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7QB4wAk002472; Fri, 26 Aug 2016 07:04:59 -0400 From: Zorro Lang To: xfs@oss.sgi.com Cc: sandeen@redhat.com, Zorro Lang Subject: [PATCH] xfs_db: new -FF option help to continue the command without verify Date: Fri, 26 Aug 2016 19:04:56 +0800 X-ASG-Orig-Subj: [PATCH] xfs_db: new -FF option help to continue the command without verify Message-Id: <1472209496-2401-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 26 Aug 2016 11:05:00 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472209500 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3982 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When I try to do below steps(a V5 xfs on $fsile): # xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" $fsfile # xfs_db -x -c "sb 0" -c "write features_ro_compat 0" $fsfile # xfs_db -c "sb 0" -c p $fsfile The step#2 and #3 all failed, as: Superblock has unknown read-only compatible features (0x1000) enable When the "sb" command try to verify the superblock, it find a bad features_ro_compat number then end the xfs_db process. Even"-F" option can't help more. So we need a "super force" mode which can ignore all "verify" failures, continue the command running. Signed-off-by: Zorro Lang --- Hi, I don't know if my patch is good or not, but I think the "--forceforce" option is needed for xfs_db. As above example: # xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" $fsfile # xfs_db -x -c "sb 0" -c "write features_ro_compat 0" $fsfile # xfs_db -c "sb 0" -c p $fsfile If we break the superblock, at least xfs_db should help to print the superblock info. And as a xfs debugger, xfs_db should can ignore unexpected errors to continue the "expert" command which an expert want to do. That's my personal opinion, so if I'm wrong, feel free to correct me:) Thanks, Zorro db/init.c | 6 +++++- db/io.c | 21 ++++++++++++++++++++- db/io.h | 2 ++ man/man8/xfs_db.8 | 4 ++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/db/init.c b/db/init.c index c0472c8..690e6ea 100644 --- a/db/init.c +++ b/db/init.c @@ -29,6 +29,7 @@ #include "malloc.h" #include "type.h" +int xfs_skip_verify = 0; static char **cmdline; static int ncmdline; char *fsdevice; @@ -75,7 +76,7 @@ init( x.disfile = 1; break; case 'F': - force = 1; + force++; break; case 'i': x.isreadonly = (LIBXFS_ISREADONLY|LIBXFS_ISINACTIVE); @@ -105,6 +106,9 @@ init( /*NOTREACHED*/ } + if (force > 1) + xfs_skip_verify = 1; + fsdevice = argv[optind]; if (!x.disfile) x.volname = fsdevice; diff --git a/db/io.c b/db/io.c index 91cab12..897388d 100644 --- a/db/io.c +++ b/db/io.c @@ -41,6 +41,16 @@ static void back_help(void); static int ring_f(int argc, char **argv); static void ring_help(void); +/* + * If xfs_skip_verify is true, use this dummy xfs_buf_ops structure + * to instead of the real xfs_buf_ops in set_cur() + */ +static const struct xfs_buf_ops xfs_dummy_buf_ops = { + .name = "dummy", + .verify_read = xfs_dummy_verify, + .verify_write = xfs_dummy_verify, +}; + static const cmdinfo_t pop_cmd = { "pop", NULL, pop_f, 0, 0, 0, NULL, N_("pop location from the stack"), pop_help }; @@ -503,7 +513,16 @@ set_cur( xfs_ino_t dirino; xfs_ino_t ino; __uint16_t mode; - const struct xfs_buf_ops *ops = t ? t->bops : NULL; + const struct xfs_buf_ops *ops = NULL; + + if (t) { + if (xfs_skip_verify) { + ops = &xfs_dummy_buf_ops; + } else { + ops = t->bops; + } + } else + ops = NULL; if (iocur_sp < 0) { dbprintf(_("set_cur no stack element to set\n")); diff --git a/db/io.h b/db/io.h index c69e9ce..eb64638 100644 --- a/db/io.h +++ b/db/io.h @@ -16,6 +16,8 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +extern int xfs_skip_verify; + struct typ; #define BBMAP_SIZE (XFS_MAX_BLOCKSIZE / BBSIZE) diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 index ff8f862..c52a5bf 100644 --- a/man/man8/xfs_db.8 +++ b/man/man8/xfs_db.8 @@ -57,6 +57,10 @@ Specifies that we want to continue even if the superblock magic is not correct. For use in .BR xfs_metadump . .TP +.B \-FF +The "force force" mode. Skip all read/write verify to continue the command, +even if it'll cause something be broken. +.TP .B \-i Allows execution on a mounted filesystem, provided it is mounted read-only. Useful for shell scripts -- 2.7.4 From sandeen@sandeen.net Fri Aug 26 07:32:03 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8D0AF7CA0 for ; Fri, 26 Aug 2016 07:32:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F656304039 for ; Fri, 26 Aug 2016 05:31:59 -0700 (PDT) X-ASG-Debug-ID: 1472214716-0bf8155c7720da00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id kaa4ILWGjKzU1tyz for ; Fri, 26 Aug 2016 05:31:56 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E68FF474B81 for ; Fri, 26 Aug 2016 07:31:55 -0500 (CDT) Subject: Re: [PATCH] xfs_quota: fix missing break after foreign_allowed option To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: fix missing break after foreign_allowed option References: <1472200206-15728-1-git-send-email-zlang@redhat.com> From: Eric Sandeen Message-ID: Date: Fri, 26 Aug 2016 07:31:55 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <1472200206-15728-1-git-send-email-zlang@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1472214716 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 699 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/26/16 3:30 AM, Zorro Lang wrote: > New quota "-f" has been brought in by: > > 29647c8 xfs_quota: add capabilities for use on non-XFS filesystems > > But Coverity Scan find a missing break in quota/init.c: init() > function. > > Signed-off-by: Zorro Lang Reviewed-by: Eric Sandeen > --- > quota/init.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/quota/init.c b/quota/init.c > index 44be322..2c18c8b 100644 > --- a/quota/init.c > +++ b/quota/init.c > @@ -153,6 +153,7 @@ init( > break; > case 'f': > foreign_allowed = true; > + break; > case 't': > mtab_file = optarg; > break; > From sandeen@redhat.com Fri Aug 26 07:44:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 53B2C7CCA for ; Fri, 26 Aug 2016 07:44:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 04FBA304039 for ; Fri, 26 Aug 2016 05:44:21 -0700 (PDT) X-ASG-Debug-ID: 1472215460-0bf8155c7720e170001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gK5jSL4gNT43OLGq (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 05:44:20 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 29FA1332F74 for ; Fri, 26 Aug 2016 12:44:20 +0000 (UTC) Received: from [IPv6:::1] (ovpn03.gateway.prod.ext.phx2.redhat.com [10.5.9.3]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7QCiJbj007889 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 26 Aug 2016 08:44:19 -0400 Subject: Re: [PATCH] xfs_db: new -FF option help to continue the command without verify To: Zorro Lang , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs_db: new -FF option help to continue the command without verify References: <1472209496-2401-1-git-send-email-zlang@redhat.com> From: Eric Sandeen Message-ID: Date: Fri, 26 Aug 2016 07:44:18 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <1472209496-2401-1-git-send-email-zlang@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Fri, 26 Aug 2016 12:44:20 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472215460 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5349 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 8/26/16 6:04 AM, Zorro Lang wrote: > When I try to do below steps(a V5 xfs on $fsile): > > # xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" $fsfile > # xfs_db -x -c "sb 0" -c "write features_ro_compat 0" $fsfile > # xfs_db -c "sb 0" -c p $fsfile > > The step#2 and #3 all failed, as: > > Superblock has unknown read-only compatible features (0x1000) enable > > When the "sb" command try to verify the superblock, it find a bad > features_ro_compat number then end the xfs_db process. > > Even"-F" option can't help more. So we need a "super force" mode > which can ignore all "verify" failures, continue the command running. > > Signed-off-by: Zorro Lang Hi Zorro - I think this isn't quite the right approach. I can see the advantage of allowing xfs_db to operate on filesystems with unknown features, in case those "features" are the result of corruption, and we'd like to analyze it and/or fix it. Or, for testing, as motivated you here. So allowing xfs_db to skip superblock feature checks makes some sense to me. However, as I read the patch, it is completely overriding every verifier for every type of metadata; in addition to skipping every read verification, it also unhooks the write verifiers, so now crcs aren't updated: # db/xfs_db -x -FF -c "sb 0" -c "write fname \"test\"" fsfile fname = "test\000\000\000\000\000\000\000\000" # db/xfs_db -x -c "sb 0" -c "p crc" fsfile Metadata CRC error detected at xfs_sb block 0x0/0x200 crc = 0x7e27467b (bad) So I think that if the goal is to be able to dangerously operate on filesystems with unknown features, this needs to be more targeted to allow only that, and not completely unhook all verifiers. Thanks, -Eric > --- > > Hi, > > I don't know if my patch is good or not, but I think the "--forceforce" > option is needed for xfs_db. As above example: > > # xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" $fsfile > # xfs_db -x -c "sb 0" -c "write features_ro_compat 0" $fsfile > # xfs_db -c "sb 0" -c p $fsfile > > If we break the superblock, at least xfs_db should help to print the > superblock info. And as a xfs debugger, xfs_db should can ignore > unexpected errors to continue the "expert" command which an expert > want to do. > > That's my personal opinion, so if I'm wrong, feel free to correct me:) > > Thanks, > Zorro > > db/init.c | 6 +++++- > db/io.c | 21 ++++++++++++++++++++- > db/io.h | 2 ++ > man/man8/xfs_db.8 | 4 ++++ > 4 files changed, 31 insertions(+), 2 deletions(-) > > diff --git a/db/init.c b/db/init.c > index c0472c8..690e6ea 100644 > --- a/db/init.c > +++ b/db/init.c > @@ -29,6 +29,7 @@ > #include "malloc.h" > #include "type.h" > > +int xfs_skip_verify = 0; > static char **cmdline; > static int ncmdline; > char *fsdevice; > @@ -75,7 +76,7 @@ init( > x.disfile = 1; > break; > case 'F': > - force = 1; > + force++; > break; > case 'i': > x.isreadonly = (LIBXFS_ISREADONLY|LIBXFS_ISINACTIVE); > @@ -105,6 +106,9 @@ init( > /*NOTREACHED*/ > } > > + if (force > 1) > + xfs_skip_verify = 1; > + > fsdevice = argv[optind]; > if (!x.disfile) > x.volname = fsdevice; > diff --git a/db/io.c b/db/io.c > index 91cab12..897388d 100644 > --- a/db/io.c > +++ b/db/io.c > @@ -41,6 +41,16 @@ static void back_help(void); > static int ring_f(int argc, char **argv); > static void ring_help(void); > > +/* > + * If xfs_skip_verify is true, use this dummy xfs_buf_ops structure > + * to instead of the real xfs_buf_ops in set_cur() > + */ > +static const struct xfs_buf_ops xfs_dummy_buf_ops = { > + .name = "dummy", > + .verify_read = xfs_dummy_verify, > + .verify_write = xfs_dummy_verify, > +}; > + > static const cmdinfo_t pop_cmd = > { "pop", NULL, pop_f, 0, 0, 0, NULL, > N_("pop location from the stack"), pop_help }; > @@ -503,7 +513,16 @@ set_cur( > xfs_ino_t dirino; > xfs_ino_t ino; > __uint16_t mode; > - const struct xfs_buf_ops *ops = t ? t->bops : NULL; > + const struct xfs_buf_ops *ops = NULL; > + > + if (t) { > + if (xfs_skip_verify) { > + ops = &xfs_dummy_buf_ops; > + } else { > + ops = t->bops; > + } > + } else > + ops = NULL; > > if (iocur_sp < 0) { > dbprintf(_("set_cur no stack element to set\n")); > diff --git a/db/io.h b/db/io.h > index c69e9ce..eb64638 100644 > --- a/db/io.h > +++ b/db/io.h > @@ -16,6 +16,8 @@ > * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > */ > > +extern int xfs_skip_verify; > + > struct typ; > > #define BBMAP_SIZE (XFS_MAX_BLOCKSIZE / BBSIZE) > diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8 > index ff8f862..c52a5bf 100644 > --- a/man/man8/xfs_db.8 > +++ b/man/man8/xfs_db.8 > @@ -57,6 +57,10 @@ Specifies that we want to continue even if the superblock magic is not > correct. For use in > .BR xfs_metadump . > .TP > +.B \-FF > +The "force force" mode. Skip all read/write verify to continue the command, > +even if it'll cause something be broken. > +.TP > .B \-i > Allows execution on a mounted filesystem, provided it is mounted read-only. > Useful for shell scripts > From BATV+5f2fde33e9409180a5a2+4751+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 26 07:56:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A8DAD7CB4 for ; Fri, 26 Aug 2016 07:56:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7970D304039 for ; Fri, 26 Aug 2016 05:56:41 -0700 (PDT) X-ASG-Debug-ID: 1472216198-0bf57b531322b170001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id nTK2tVy0jcWc1oML (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 26 Aug 2016 05:56:39 -0700 (PDT) X-Barracuda-Envelope-From: BATV+5f2fde33e9409180a5a2+4751+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Effective-Source-IP: UNKNOWN[198.137.202.9] X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.85_2 #1 (Red Hat Linux)) id 1bdGgX-00022s-0U; Fri, 26 Aug 2016 12:56:37 +0000 Date: Fri, 26 Aug 2016 05:56:36 -0700 From: Christoph Hellwig To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v8 00/71] xfs: add reflink and dedupe support Message-ID: <20160826125636.GA1548@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v8 00/71] xfs: add reflink and dedupe support References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: Mutt/1.6.1 (2016-04-27) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1472216199 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2272 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32340 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS FTI, with your djwong-devel tree I see sporadic slab corruption when running xfstests with reflinks force enabled in mkfs. And while the trace looks like from the rmap code it doesn't happen without the reflink patches. Example during xfs/313 below: [14751.774252] Slab corruption (Tainted: G W ): xfs_cui_item start=ffff88013afb3748, len=408 [14751.775170] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b [14751.775731] Last user: [](xfs_cui_item_free+0x1c/0x30) [14751.776397] 070: 6b 6b 6b 6b 6b 6b 6b 6b 6a 6b 6b 6b 6b 6b 6b 6b kkkkkkkkjkkkkkkk [14751.777157] Single bit error detected. Probably bad RAM. [14751.777591] Run memtest86+ or a similar memory test tool. [14751.778015] Prev obj: start=ffff88013afb3598, len=408 [14751.778468] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b [14751.778940] Last user: [](xfs_cui_item_free+0x1c/0x30) [14751.779621] 000: 6b 6b 6b 6b 6b 00 01 02 03 6b 6b 6b 6b 6b 6b 6b kkkkk....kkkkkkk [14751.780378] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [14751.781140] Next obj: start=ffff88013afb38f8, len=408 [14751.781639] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b [14751.782216] Last user: [](xfs_cui_item_free+0x1c/0x30) [14751.782885] 000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [14751.783608] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [14751.784287] Slab corruption (Tainted: G W ): xfs_bui_item start=ffff880131b67048, len=184 [14751.785126] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b [14751.785979] Last user: [](xfs_bui_release+0x44/0x70)0 [14751.786636] 070: 6b 6b 6b 6b 6b 6b 6b 6b 6a 6b 6b 6b 6b 6b 6b 6b kkkkkkkkjkkkkkkk [14751.787414] Single bit error detected. Probably bad RAM. [14751.787948] Run memtest86+ or a similar memory test tool. [14751.788477] Next obj: start=ffff880131b67118, len=184 [14751.789002] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b [14751.789559] Last user: [](xfs_bui_release+0x44/0x70) [14751.790259] 000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk [14751.791055] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk From billodo@redhat.com Fri Aug 26 08:36:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 98D7A7CA2 for ; Fri, 26 Aug 2016 08:36:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55E70304048 for ; Fri, 26 Aug 2016 06:36:30 -0700 (PDT) X-ASG-Debug-ID: 1472218588-0bf57b531122cc80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aTjq57B4xyvxzgxe (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 06:36:29 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A5B3E80F7C for ; Fri, 26 Aug 2016 13:36:28 +0000 (UTC) Received: from redhat.com (vpn-59-175.rdu2.redhat.com [10.10.59.175]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7QDaQJ5024327 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Fri, 26 Aug 2016 09:36:28 -0400 Date: Fri, 26 Aug 2016 08:36:26 -0500 From: "Bill O'Donnell" To: Zorro Lang Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_quota: fix missing break after foreign_allowed option Message-ID: <20160826133626.GA1865@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: fix missing break after foreign_allowed option References: <1472200206-15728-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472200206-15728-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Fri, 26 Aug 2016 13:36:28 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472218589 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 923 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 26, 2016 at 04:30:06PM +0800, Zorro Lang wrote: > New quota "-f" has been brought in by: > > 29647c8 xfs_quota: add capabilities for use on non-XFS filesystems > > But Coverity Scan find a missing break in quota/init.c: init() > function. > > Signed-off-by: Zorro Lang Sorry about that. Thanks for the patch, Zorro. Reviewed-by: Bill O'Donnell > --- > quota/init.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/quota/init.c b/quota/init.c > index 44be322..2c18c8b 100644 > --- a/quota/init.c > +++ b/quota/init.c > @@ -153,6 +153,7 @@ init( > break; > case 'f': > foreign_allowed = true; > + break; > case 't': > mtab_file = optarg; > break; > -- > 2.7.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 26 09:08:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 05AA97CC7 for ; Fri, 26 Aug 2016 09:08:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA18B8F8037 for ; Fri, 26 Aug 2016 07:08:53 -0700 (PDT) X-ASG-Debug-ID: 1472220532-0bf57c55b21fb5e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sB83lqDnOqkH54AR (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 07:08:52 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E8215C04D2B5; Fri, 26 Aug 2016 14:08:51 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7QE8pvE016834; Fri, 26 Aug 2016 10:08:51 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 600A61208AB; Fri, 26 Aug 2016 10:08:50 -0400 (EDT) Date: Fri, 26 Aug 2016 10:08:50 -0400 From: Brian Foster To: "Darrick J. Wong" Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v8 00/71] xfs: add reflink and dedupe support Message-ID: <20160826140849.GA17728@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v8 00/71] xfs: add reflink and dedupe support References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 26 Aug 2016 14:08:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472220532 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4067 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 25, 2016 at 04:31:56PM -0700, Darrick J. Wong wrote: > Hi all, > > This is the eighth revision of a patchset that adds to XFS kernel > support for mapping multiple file logical blocks to the same physical > block (reflink/deduplication), implements the beginnings of online > metadata scrubbing and preening, and implements reverse mapping for > the realtime device. There shouldn't be any incompatible on-disk > format changes, pending a thorough review of the patches within. > > (NOTE: In the git trees, this series is preceded by the pending rmap > fixes patches posted to linux-xfs a few days ago.) > Those patches are included in the latest for-next, but this series still doesn't apply for me. I see the git tree includes a4b60f5 ("xfs: port differences from xfsprogs libxfs") which gets me a bit further if I pull that over, but it still doesn't apply in full. I get up to 14/71... am I missing other bits? Brian > The reflink implementation features a simple per-AG b+tree containing > tuples of (physical block, blockcount, refcount) with the key being > the physical block. Copy on Write (CoW) is implemented by creating a > separate CoW extent mapping fork and using the existing delayed > allocation mechanism to try to allocate as large of a replacement > extent as possible before committing the new data to media. A CoW > extent size hint allows administrators to influence the size of the > replacement extents, and certain writes can be "promoted" to CoW when > it would be advantageous to reduce fragmentation. The userspace > interface to reflink and dedupe are the VFS FICLONE, FICLONERANGE, and > FIDEDUPERANGE ioctls, which were previously private to btrfs. > > At the beginning of the patchset is the establishment of a per-AG > block reservation mechanism. This "hides" some blocks from the > regular block allocator so that the refcountbt and rmapbt can expand > without hitting ENOSPC. The block reservation mechanism built into > transactions isn't sufficient for this purpose because it only > reserves blocks at a broad filesystem level, whereas per-AG btree > expansion requires specific per-AG reservations. > > Next comes the reference count B+tree, which tracks the reference > counts of shared extents (refcount > 1) and extents being used to > stage a copy-on-write operation (refcount == 1). We define new log > redo item pairs both for refcount updates and for inode fork updates; > these plug into the deferred ops framework created for the reverse > mapping patches. > > After that comes the reflink code, which handles the actual > copy-on-write behavior that is required for block sharing; and > connections to the VFS file ops for reflink, dedupe, and > copy_file_range. > > At the very end of the patchset is a reimplementation of the swap > extents code that uses reverse mapping and block mapping deferred ops > to implement xfs_swap_extent for filesystems with reverse-mapping. > > If you're going to start using this mess, you probably ought to just > pull from my github trees for kernel[1], xfsprogs[2], xfstests[3], > xfs-docs[4], and man-pages[5]. The kernel patches in the git trees > should apply to 4.8-rc3; xfsprogs patches to for-next; and xfstest to > master. > > The patches have been xfstested with x64, ppc64, and armhf; all tests > in the clone and rmap groups pass. AFAICT they don't cause any new > failures for the 'auto' group. > > This is an extraordinary way to eat your data. Enjoy! > Comments and questions are, as always, welcome. > > --D > > [1] https://github.com/djwong/linux/tree/djwong-devel > [2] https://github.com/djwong/xfsprogs/tree/djwong-devel > [3] https://github.com/djwong/xfstests/tree/djwong-devel > [4] https://github.com/djwong/xfs-documentation/tree/djwong-devel > [5] https://github.com/djwong/man-pages/tree/djwong-devel > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From hch@lst.de Fri Aug 26 09:26:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 327697CC9 for ; Fri, 26 Aug 2016 09:26:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB082304048 for ; Fri, 26 Aug 2016 07:26:20 -0700 (PDT) X-ASG-Debug-ID: 1472221576-0bf57b5314233fa0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id siDBxQrAETxEnXZT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 07:26:17 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 1E5897F131; Fri, 26 Aug 2016 16:26:16 +0200 (CEST) Date: Fri, 26 Aug 2016 16:26:16 +0200 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case Message-ID: <20160826142616.GA21535@lst.de> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-4-git-send-email-hch@lst.de> <20160825123808.GC25041@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160825123808.GC25041@bfoster.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1472221577 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 604 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32341 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 25, 2016 at 08:38:09AM -0400, Brian Foster wrote: > I'm guessing the lockless check is intentional, but is that really > necessary? E.g., it doesn't seem like using ->i_flags_lock > unconditionally should affect performance in the way the AG lock or > radix tree work does, particularly since we're already holding > IOLOCK_EXCL in the current implementation. I could be wrong, but FWIW, > we do already have xfs_iflags_test_and_set() sitting around as well... I don't think taking it should be too bad, but given the ops ordering it also seems entirely pointless to even take it. From hch@lst.de Fri Aug 26 09:33:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 41BB87CCC for ; Fri, 26 Aug 2016 09:33:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EBCD2304048 for ; Fri, 26 Aug 2016 07:33:56 -0700 (PDT) X-ASG-Debug-ID: 1472222025-0bf8155c74219580001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id NAWbOSvc39ddPKmw (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 07:33:46 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 915617F131; Fri, 26 Aug 2016 16:33:44 +0200 (CEST) Date: Fri, 26 Aug 2016 16:33:44 +0200 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path Message-ID: <20160826143344.GB21535@lst.de> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-5-git-send-email-hch@lst.de> <20160825143708.GD25041@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160825143708.GD25041@bfoster.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1472222026 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2035 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32341 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 25, 2016 at 10:37:09AM -0400, Brian Foster wrote: > On just skimming over this so far, I feel like this should be at least > two patches, possibly 3: > > - Kill xfs_bmapi_delay() and pull up associated bits to iomap(). As in just a move of code to xfs_iomap.c or also merged it with a partÑ–al copy of xfs_file_iomap_begin? The first is trivial, but also rather pointless. The second is a bit more work, still very doable but probably also not that useful as we're going to totally rewrite it again in the next step. > - Possibly separate out the part that moves iteration from the (former) > xfs_bmapi_delay() code up to the iomap code, if we can do so cleanly. Well, the major point is that we get rid of the iteration as there isn't any actual need for it. > - Refactor/rework the preallocate logic. But I guess I could do a pass that creates xfs_file_iomap_begin_delay as in the new version except without the prealloc changes, and then separate them out. I don't quite see the point, though.. > I'm not necessarily against cleaning up/reworking the prealloc bits, but > I'm not a huge fan of open coding all of this here in the iomap > function. If nothing else, the indentation starts to make my eyes > cross... could we retain one level of abstraction here for this hunk of > logic that updates end_fsb? We're only having three tabs of indentation. I actually looked into a helper for that whole block, but we'd need to pass: ip, idx, prev, offset_fsb, offset, count, maxbytes_fsb (we could potentially re-derive offset_fsb from offset if we don't mind the inefficieny and recalculate maxbytes_fsb. This already assumes mp is trivially derived from ip) and return alloc_blocks, end_fsb so the function would be quite a monster in terms of its calling convention. Additionally we'd have the related by not qute the same if blocks around XFS_MOUNT_DFLT_IOSIZE and the isize split over two functions, which doesn't exactly help understanding the flow. From bfoster@redhat.com Fri Aug 26 11:02:17 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 152B07CAE for ; Fri, 26 Aug 2016 11:02:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA6F9304048 for ; Fri, 26 Aug 2016 09:02:13 -0700 (PDT) X-ASG-Debug-ID: 1472227331-0bf57c55b12046a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id w8fatV6dWqOY8VP0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 09:02:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0CE48C0467E7; Fri, 26 Aug 2016 16:02:11 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7QG2APF001657; Fri, 26 Aug 2016 12:02:10 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 769081208AB; Fri, 26 Aug 2016 12:02:09 -0400 (EDT) Date: Fri, 26 Aug 2016 12:02:09 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case Message-ID: <20160826160209.GB17728@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-4-git-send-email-hch@lst.de> <20160825123808.GC25041@bfoster.bfoster> <20160826142616.GA21535@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826142616.GA21535@lst.de> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Fri, 26 Aug 2016 16:02:11 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472227331 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 923 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 26, 2016 at 04:26:16PM +0200, Christoph Hellwig wrote: > On Thu, Aug 25, 2016 at 08:38:09AM -0400, Brian Foster wrote: > > I'm guessing the lockless check is intentional, but is that really > > necessary? E.g., it doesn't seem like using ->i_flags_lock > > unconditionally should affect performance in the way the AG lock or > > radix tree work does, particularly since we're already holding > > IOLOCK_EXCL in the current implementation. I could be wrong, but FWIW, > > we do already have xfs_iflags_test_and_set() sitting around as well... > > I don't think taking it should be too bad, but given the ops ordering > it also seems entirely pointless to even take it. > Then why are we taking it? I assumed it at least served as a memory barrier... Brian > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 26 11:03:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 77FD67CA2 for ; Fri, 26 Aug 2016 11:03:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 34FE2AC003 for ; Fri, 26 Aug 2016 09:03:43 -0700 (PDT) X-ASG-Debug-ID: 1472227421-0bf57c55b32052b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yzW3X2t389sBosjK (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 09:03:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 28B3D4E4DE; Fri, 26 Aug 2016 16:03:41 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7QG3eiA025966; Fri, 26 Aug 2016 12:03:40 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6BEAD1208AB; Fri, 26 Aug 2016 12:03:39 -0400 (EDT) Date: Fri, 26 Aug 2016 12:03:39 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path Message-ID: <20160826160339.GC17728@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-5-git-send-email-hch@lst.de> <20160825143708.GD25041@bfoster.bfoster> <20160826143344.GB21535@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20160826143344.GB21535@lst.de> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 26 Aug 2016 16:03:41 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472227421 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7109 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 26, 2016 at 04:33:44PM +0200, Christoph Hellwig wrote: > On Thu, Aug 25, 2016 at 10:37:09AM -0400, Brian Foster wrote: > > On just skimming over this so far, I feel like this should be at least > > two patches, possibly 3: > > > > - Kill xfs_bmapi_delay() and pull up associated bits to iomap(). > > As in just a move of code to xfs_iomap.c or also merged it with a > partÑ–al copy of xfs_file_iomap_begin? The first is trivial, but also > rather pointless. The second is a bit more work, still very doable > but probably also not that useful as we're going to totally rewrite it > again in the next step. > > > - Possibly separate out the part that moves iteration from the (former) > > xfs_bmapi_delay() code up to the iomap code, if we can do so cleanly. > > Well, the major point is that we get rid of the iteration as there isn't > any actual need for it. > ... which should probably be mentioned in the commit log description. In any event, I think it's probably helpful enough to just separate out the prealloc rework from everything else. > > - Refactor/rework the preallocate logic. > > But I guess I could do a pass that creates xfs_file_iomap_begin_delay > as in the new version except without the prealloc changes, and then > separate them out. I don't quite see the point, though.. They don't appear to be related, for one. Second (and IMO), it makes it notably easier to review and deal with any potential regressions down the road. As it is, I made a more thorough pass through the code and I didn't notice anything that looked wrong, but I'd still prefer to see the changes separated out to be confident I didn't miss anything. > > I'm not necessarily against cleaning up/reworking the prealloc bits, but > > I'm not a huge fan of open coding all of this here in the iomap > > function. If nothing else, the indentation starts to make my eyes > > cross... could we retain one level of abstraction here for this hunk of > > logic that updates end_fsb? > > We're only having three tabs of indentation. I actually looked into > a helper for that whole block, but we'd need to pass: > Yeah, I suppose the indentation itself is not so much what stands out. Looking again, I think it's more the combination of that and the multi-line checks we're combining. > ip, idx, prev, offset_fsb, offset, count, maxbytes_fsb > > (we could potentially re-derive offset_fsb from offset if we don't > mind the inefficieny and recalculate maxbytes_fsb. This already > assumes mp is trivially derived from ip) > > and return > > alloc_blocks, end_fsb > > so the function would be quite a monster in terms of its calling > convention. Additionally we'd have the related by not qute the > same if blocks around XFS_MOUNT_DFLT_IOSIZE and the isize split > over two functions, which doesn't exactly help understanding > the flow. > Not quite sure I follow the last bit, but I don't necessarily think the whole thing has to be boxed into a helper to clean it up. E.g., I'd do something like the appended diff (compile tested only). Brian ---8<--- diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 2b449f5..45e5268 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -488,6 +488,54 @@ check_writeio: return alloc_blocks; } +/* + * If we are doing a write at the end of the file and there are no allocations + * past this one, then extend the allocation out to the file system's write + * iosize. + * + * As an exception we don't do any preallocation at all if the file is smaller + * than the minimum preallocation and we are using the default dynamic + * preallocation scheme, as it is likely this is the only write to the file that + * is going to be done. + * + * We clean up any extra space left over when the file is closed in + * xfs_inactive(). + */ +static int +xfs_iomap_prealloc( + struct xfs_inode *ip, + loff_t offset, + loff_t count, + xfs_extnum_t idx, + struct xfs_bmbt_irec *prev) +{ + struct xfs_mount *mp = ip->i_mount; + xfs_fsblock_t alloc_blocks; + xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); + + if (offset + count <= XFS_ISIZE(ip)) + return 0; + + if (!(mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) && + (XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_writeio_blocks))) + return 0; + + /* + * If an explicit allocsize is set, the file is small, or we + * are writing behind a hole, then use the minimum prealloc: + */ + if ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || + XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_dalign) || + idx == 0 || + prev->br_startoff + prev->br_blockcount < offset_fsb) + alloc_blocks = mp->m_writeio_blocks; + else + alloc_blocks = + xfs_iomap_prealloc_size(ip, offset, prev); + + return alloc_blocks; +} + static int xfs_file_iomap_begin_delay( struct inode *inode, @@ -507,6 +555,7 @@ xfs_file_iomap_begin_delay( struct xfs_bmbt_irec got; struct xfs_bmbt_irec prev; xfs_extnum_t idx; + xfs_fsblock_t prealloc = 0; ASSERT(!XFS_IS_REALTIME_INODE(ip)); ASSERT(!xfs_get_extsz_hint(ip)); @@ -554,41 +603,14 @@ xfs_file_iomap_begin_delay( end_fsb = orig_end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); - /* - * If we are doing a write at the end of the file and there are no - * allocations past this one, then extend the allocation out to the - * file system's write iosize. - * - * As an exception we don't do any preallocation at all if the file - * is smaller than the minimum preallocation and we are using the - * default dynamic preallocation scheme, as it is likely this is the - * only write to the file that is going to be done. - * - * We clean up any extra space left over when the file is closed in - * xfs_inactive(). - */ - if (eof && offset + count > XFS_ISIZE(ip) && - ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || - XFS_ISIZE(ip) >= XFS_FSB_TO_B(mp, mp->m_writeio_blocks))) { - xfs_fsblock_t alloc_blocks; - xfs_off_t aligned_offset; - xfs_extlen_t align; - - /* - * If an explicit allocsize is set, the file is small, or we - * are writing behind a hole, then use the minimum prealloc: - */ - if ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || - XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_dalign) || - idx == 0 || - prev.br_startoff + prev.br_blockcount < offset_fsb) - alloc_blocks = mp->m_writeio_blocks; - else - alloc_blocks = - xfs_iomap_prealloc_size(ip, offset, &prev); + if (eof) + prealloc = xfs_iomap_prealloc(ip, offset, count, idx, &prev); + if (prealloc) { + xfs_off_t aligned_offset; + xfs_extlen_t align; aligned_offset = XFS_WRITEIO_ALIGN(mp, offset + count - 1); - end_fsb = XFS_B_TO_FSBT(mp, aligned_offset) + alloc_blocks; + end_fsb = XFS_B_TO_FSBT(mp, aligned_offset) + prealloc; align = xfs_eof_alignment(ip, 0); if (align) > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 26 11:07:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3518A7CA2 for ; Fri, 26 Aug 2016 11:07:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD12EAC004 for ; Fri, 26 Aug 2016 09:07:56 -0700 (PDT) X-ASG-Debug-ID: 1472227675-0bf81509b021ded0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KyYsZlGqBHB1cHRl (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 09:07:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 36F964E4E3; Fri, 26 Aug 2016 16:07:55 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7QG7srX029577; Fri, 26 Aug 2016 12:07:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9C7251208AB; Fri, 26 Aug 2016 12:07:53 -0400 (EDT) Date: Fri, 26 Aug 2016 12:07:53 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path Message-ID: <20160826160753.GD17728@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-5-git-send-email-hch@lst.de> <20160825143708.GD25041@bfoster.bfoster> <20160826143344.GB21535@lst.de> <20160826160339.GC17728@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826160339.GC17728@bfoster.bfoster> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 26 Aug 2016 16:07:55 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472227675 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3286 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 26, 2016 at 12:03:39PM -0400, Brian Foster wrote: > On Fri, Aug 26, 2016 at 04:33:44PM +0200, Christoph Hellwig wrote: > > On Thu, Aug 25, 2016 at 10:37:09AM -0400, Brian Foster wrote: ... > > (we could potentially re-derive offset_fsb from offset if we don't > > mind the inefficieny and recalculate maxbytes_fsb. This already > > assumes mp is trivially derived from ip) > > > > and return > > > > alloc_blocks, end_fsb > > > > so the function would be quite a monster in terms of its calling > > convention. Additionally we'd have the related by not qute the > > same if blocks around XFS_MOUNT_DFLT_IOSIZE and the isize split > > over two functions, which doesn't exactly help understanding > > the flow. > > > > Not quite sure I follow the last bit, but I don't necessarily think the > whole thing has to be boxed into a helper to clean it up. E.g., I'd do > something like the appended diff (compile tested only). > ... and if the function signature is really an issue, trade off idx & prev for a conditional base preallocation size (applies on top of the previous diff): diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 45e5268..c748429 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -381,7 +381,7 @@ STATIC xfs_fsblock_t xfs_iomap_prealloc_size( struct xfs_inode *ip, xfs_off_t offset, - struct xfs_bmbt_irec *prev) + xfs_extlen_t base) { struct xfs_mount *mp = ip->i_mount; int shift = 0; @@ -406,8 +406,8 @@ xfs_iomap_prealloc_size( * always extends to MAXEXTLEN rather than falling short due to things * like stripe unit/width alignment of real extents. */ - if (prev->br_blockcount <= (MAXEXTLEN >> 1)) - alloc_blocks = prev->br_blockcount << 1; + if (base <= (MAXEXTLEN >> 1)) + alloc_blocks = base << 1; else alloc_blocks = XFS_B_TO_FSB(mp, offset); if (!alloc_blocks) @@ -506,12 +506,10 @@ xfs_iomap_prealloc( struct xfs_inode *ip, loff_t offset, loff_t count, - xfs_extnum_t idx, - struct xfs_bmbt_irec *prev) + xfs_extlen_t base) { struct xfs_mount *mp = ip->i_mount; xfs_fsblock_t alloc_blocks; - xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); if (offset + count <= XFS_ISIZE(ip)) return 0; @@ -526,12 +524,11 @@ xfs_iomap_prealloc( */ if ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_dalign) || - idx == 0 || - prev->br_startoff + prev->br_blockcount < offset_fsb) + !base) alloc_blocks = mp->m_writeio_blocks; else alloc_blocks = - xfs_iomap_prealloc_size(ip, offset, prev); + xfs_iomap_prealloc_size(ip, offset, base); return alloc_blocks; } @@ -603,8 +600,15 @@ xfs_file_iomap_begin_delay( end_fsb = orig_end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); - if (eof) - prealloc = xfs_iomap_prealloc(ip, offset, count, idx, &prev); + if (eof) { + xfs_extlen_t base = 0; + + /* use prev extent as base if contiguous */ + if (idx > 0 && + prev.br_startoff + prev.br_blockcount < offset_fsb) + base = prev.br_blockcount; + prealloc = xfs_iomap_prealloc(ip, offset, count, base); + } if (prealloc) { xfs_off_t aligned_offset; xfs_extlen_t align; From darrick.wong@oracle.com Fri Aug 26 11:29:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C0A5E7CA1 for ; Fri, 26 Aug 2016 11:29:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 31FA6AC002 for ; Fri, 26 Aug 2016 09:29:26 -0700 (PDT) X-ASG-Debug-ID: 1472228963-0bf57c55b3206e20001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id I7dq2ubQjAvOsxmr (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 09:29:24 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7QGSwuS023113 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 16:28:58 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7QGSvl8024140 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 16:28:58 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7QGSuw9016525; Fri, 26 Aug 2016 16:28:57 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 26 Aug 2016 09:28:56 -0700 Date: Fri, 26 Aug 2016 09:28:50 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v8 00/71] xfs: add reflink and dedupe support Message-ID: <20160826162850.GE22760@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v8 00/71] xfs: add reflink and dedupe support References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> <20160826125636.GA1548@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826125636.GA1548@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472228963 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2721 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32342 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Fri, Aug 26, 2016 at 05:56:36AM -0700, Christoph Hellwig wrote: > FTI, with your djwong-devel tree I see sporadic slab corruption when > running xfstests with reflinks force enabled in mkfs. > > And while the trace looks like from the rmap code it doesn't happen > without the reflink patches. > > Example during xfs/313 below: > > [14751.774252] Slab corruption (Tainted: G W ): xfs_cui_item start=ffff88013afb3748, len=408 > [14751.775170] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.775731] Last user: [](xfs_cui_item_free+0x1c/0x30) > [14751.776397] 070: 6b 6b 6b 6b 6b 6b 6b 6b 6a 6b 6b 6b 6b 6b 6b 6b kkkkkkkkjkkkkkkk > [14751.777157] Single bit error detected. Probably bad RAM. > [14751.777591] Run memtest86+ or a similar memory test tool. > [14751.778015] Prev obj: start=ffff88013afb3598, len=408 > [14751.778468] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.778940] Last user: > [](xfs_cui_item_free+0x1c/0x30) CUI == refCount Update Item, so it /is/ the reflink code. Will take a look. Sigh... --D > [14751.779621] 000: 6b 6b 6b 6b 6b 00 01 02 03 6b 6b 6b 6b 6b 6b 6b kkkkk....kkkkkkk > [14751.780378] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [14751.781140] Next obj: start=ffff88013afb38f8, len=408 > [14751.781639] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.782216] Last user: > [](xfs_cui_item_free+0x1c/0x30) > [14751.782885] 000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [14751.783608] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [14751.784287] Slab corruption (Tainted: G W ): xfs_bui_item start=ffff880131b67048, len=184 > [14751.785126] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.785979] Last user: [](xfs_bui_release+0x44/0x70)0 > [14751.786636] 070: 6b 6b 6b 6b 6b 6b 6b 6b 6a 6b 6b 6b 6b 6b 6b 6b kkkkkkkkjkkkkkkk > [14751.787414] Single bit error detected. Probably bad RAM. > [14751.787948] Run memtest86+ or a similar memory test tool. > [14751.788477] Next obj: start=ffff880131b67118, len=184 > [14751.789002] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.789559] Last user: [](xfs_bui_release+0x44/0x70) > [14751.790259] 000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [14751.791055] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From darrick.wong@oracle.com Fri Aug 26 13:43:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ECBF77CA0 for ; Fri, 26 Aug 2016 13:43:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AD9EE30404E for ; Fri, 26 Aug 2016 11:43:18 -0700 (PDT) X-ASG-Debug-ID: 1472236996-0bf57c55b420d7b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 4mddH4VHkJCsGdVJ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 11:43:16 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7QIgoOB025273 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 18:42:50 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7QIgn2g019154 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 18:42:50 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7QIgmep010600; Fri, 26 Aug 2016 18:42:49 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 26 Aug 2016 11:42:48 -0700 Date: Fri, 26 Aug 2016 11:42:46 -0700 From: "Darrick J. Wong" To: Christoph Hellwig Cc: david@fromorbit.com, linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v8 00/71] xfs: add reflink and dedupe support Message-ID: <20160826184246.GF20705@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH v8 00/71] xfs: add reflink and dedupe support References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> <20160826125636.GA1548@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826125636.GA1548@infradead.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472236996 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2853 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Fri, Aug 26, 2016 at 05:56:36AM -0700, Christoph Hellwig wrote: > FTI, with your djwong-devel tree I see sporadic slab corruption when > running xfstests with reflinks force enabled in mkfs. > > And while the trace looks like from the rmap code it doesn't happen > without the reflink patches. > > Example during xfs/313 below: Ok, so this was caused by a bug in the deferred ops abort code where we'd unconditionally free a log intent item even if a log done item has already been attached. That in turn led to the intent item being freed three times (once when the CUI was committed, again when the deferred op aborted, and again when the CUD was committed during transaction abort), hence the slab corruption. Oops. Will post patch shortly. --D > > [14751.774252] Slab corruption (Tainted: G W ): xfs_cui_item start=ffff88013afb3748, len=408 > [14751.775170] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.775731] Last user: [](xfs_cui_item_free+0x1c/0x30) > [14751.776397] 070: 6b 6b 6b 6b 6b 6b 6b 6b 6a 6b 6b 6b 6b 6b 6b 6b kkkkkkkkjkkkkkkk > [14751.777157] Single bit error detected. Probably bad RAM. > [14751.777591] Run memtest86+ or a similar memory test tool. > [14751.778015] Prev obj: start=ffff88013afb3598, len=408 > [14751.778468] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.778940] Last user: > [](xfs_cui_item_free+0x1c/0x30) > [14751.779621] 000: 6b 6b 6b 6b 6b 00 01 02 03 6b 6b 6b 6b 6b 6b 6b kkkkk....kkkkkkk > [14751.780378] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [14751.781140] Next obj: start=ffff88013afb38f8, len=408 > [14751.781639] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.782216] Last user: > [](xfs_cui_item_free+0x1c/0x30) > [14751.782885] 000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [14751.783608] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [14751.784287] Slab corruption (Tainted: G W ): xfs_bui_item start=ffff880131b67048, len=184 > [14751.785126] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.785979] Last user: [](xfs_bui_release+0x44/0x70)0 > [14751.786636] 070: 6b 6b 6b 6b 6b 6b 6b 6b 6a 6b 6b 6b 6b 6b 6b 6b kkkkkkkkjkkkkkkk > [14751.787414] Single bit error detected. Probably bad RAM. > [14751.787948] Run memtest86+ or a similar memory test tool. > [14751.788477] Next obj: start=ffff880131b67118, len=184 > [14751.789002] Redzone: 0x9f911029d74e35b/0x9f911029d74e35b > [14751.789559] Last user: [](xfs_bui_release+0x44/0x70) > [14751.790259] 000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > [14751.791055] 010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b kkkkkkkkkkkkkkkk > From darrick.wong@oracle.com Fri Aug 26 13:45:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2C4F27CA1 for ; Fri, 26 Aug 2016 13:45:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED5848F804B for ; Fri, 26 Aug 2016 11:45:21 -0700 (PDT) X-ASG-Debug-ID: 1472237119-0bf57b5312244bd0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id BVlDwWYuIGRCEpAF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Fri, 26 Aug 2016 11:45:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7QIisCv028178 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 26 Aug 2016 18:44:55 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7QIisLk013042 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 26 Aug 2016 18:44:54 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7QIiqq3029006; Fri, 26 Aug 2016 18:44:54 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 26 Aug 2016 11:44:51 -0700 Date: Fri, 26 Aug 2016 11:44:49 -0700 From: "Darrick J. Wong" To: david@fromorbit.com Cc: linux-xfs@vger.kernel.org, xfs@oss.sgi.com, hch@infradead.org Subject: [PATCH 72/71] xfs: track log done items directly in the deferred pending work item Message-ID: <20160826184449.GG20705@birch.djwong.org> X-ASG-Orig-Subj: [PATCH 72/71] xfs: track log done items directly in the deferred pending work item References: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <147216791538.867.12413509832420924168.stgit@birch.djwong.org> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472237119 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4873 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Christoph reports slab corruption when a deferred refcount update aborts during _defer_finish(). The cause of this was broken log item state tracking in xfs_defer_pending -- upon an abort, _defer_trans_abort() will call abort_intent on all intent items, including the ones that have already had a done item attached. This is incorrect because each intent item has 2 refcount: the first is released when the intent item is committed to the log; and the second is released when the _done_ item is committed to the log, or by the intent creator if there is no done item. In other words, once we log the done item, responsibility for releasing the intent item's second refcount is transferred to the done item and /must not/ be performed by anything else. The dfp_committed flag should have been tracking whether or not we had a done item so that _defer_trans_abort could decide if it needs to abort the intent item, but due to a thinko this was not the case. Rip it out and track the done item directly so that we do the right thing w.r.t. intent item freeing. Signed-off-by: Darrick J. Wong Reported-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_defer.c | 18 +++++------------- fs/xfs/libxfs/xfs_defer.h | 2 +- fs/xfs/xfs_trace.h | 2 +- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c index faba739..613c5cf 100644 --- a/fs/xfs/libxfs/xfs_defer.c +++ b/fs/xfs/libxfs/xfs_defer.c @@ -234,7 +234,7 @@ xfs_defer_trans_abort( /* Abort intent items. */ list_for_each_entry(dfp, &dop->dop_pending, dfp_list) { trace_xfs_defer_pending_abort(tp->t_mountp, dfp); - if (dfp->dfp_committed) + if (!dfp->dfp_done) dfp->dfp_type->abort_intent(dfp->dfp_intent); } @@ -330,7 +330,6 @@ xfs_defer_finish( struct xfs_defer_pending *dfp; struct list_head *li; struct list_head *n; - void *done_item = NULL; void *state; int error = 0; void (*cleanup_fn)(struct xfs_trans *, void *, int); @@ -349,19 +348,11 @@ xfs_defer_finish( if (error) goto out; - /* Mark all pending intents as committed. */ - list_for_each_entry_reverse(dfp, &dop->dop_pending, dfp_list) { - if (dfp->dfp_committed) - break; - trace_xfs_defer_pending_commit((*tp)->t_mountp, dfp); - dfp->dfp_committed = true; - } - /* Log an intent-done item for the first pending item. */ dfp = list_first_entry(&dop->dop_pending, struct xfs_defer_pending, dfp_list); trace_xfs_defer_pending_finish((*tp)->t_mountp, dfp); - done_item = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, + dfp->dfp_done = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, dfp->dfp_count); cleanup_fn = dfp->dfp_type->finish_cleanup; @@ -371,7 +362,7 @@ xfs_defer_finish( list_del(li); dfp->dfp_count--; error = dfp->dfp_type->finish_item(*tp, dop, li, - done_item, &state); + dfp->dfp_done, &state); if (error == -EAGAIN) { /* * Caller wants a fresh transaction; @@ -403,6 +394,7 @@ xfs_defer_finish( */ dfp->dfp_intent = dfp->dfp_type->create_intent(*tp, dfp->dfp_count); + dfp->dfp_done = NULL; list_for_each(li, &dfp->dfp_work) dfp->dfp_type->log_item(*tp, dfp->dfp_intent, li); @@ -492,8 +484,8 @@ xfs_defer_add( dfp = kmem_alloc(sizeof(struct xfs_defer_pending), KM_SLEEP | KM_NOFS); dfp->dfp_type = defer_op_types[type]; - dfp->dfp_committed = false; dfp->dfp_intent = NULL; + dfp->dfp_done = NULL; dfp->dfp_count = 0; INIT_LIST_HEAD(&dfp->dfp_work); list_add_tail(&dfp->dfp_list, &dop->dop_intake); diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h index aa57eaa..f6e93ef 100644 --- a/fs/xfs/libxfs/xfs_defer.h +++ b/fs/xfs/libxfs/xfs_defer.h @@ -30,8 +30,8 @@ struct xfs_defer_op_type; struct xfs_defer_pending { const struct xfs_defer_op_type *dfp_type; /* function pointers */ struct list_head dfp_list; /* pending items */ - bool dfp_committed; /* committed trans? */ void *dfp_intent; /* log intent item */ + void *dfp_done; /* log done item */ struct list_head dfp_work; /* work items */ unsigned int dfp_count; /* # extent items */ }; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 8d916dd..7e56843 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2302,7 +2302,7 @@ DECLARE_EVENT_CLASS(xfs_defer_pending_class, __entry->dev = mp ? mp->m_super->s_dev : 0; __entry->type = dfp->dfp_type->type; __entry->intent = dfp->dfp_intent; - __entry->committed = dfp->dfp_committed; + __entry->committed = dfp->dfp_done != NULL; __entry->nr = dfp->dfp_count; ), TP_printk("dev %d:%d optype %d intent %p committed %d nr %d\n", From sandeen@sandeen.net Fri Aug 26 14:03:36 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8881A7CA3 for ; Fri, 26 Aug 2016 14:03:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA8E4AC001 for ; Fri, 26 Aug 2016 12:03:29 -0700 (PDT) X-ASG-Debug-ID: 1472238206-0bf57b5314245e70001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8anI3GFA4zmwrgta for ; Fri, 26 Aug 2016 12:03:26 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 57AF34A1 for ; Fri, 26 Aug 2016 14:03:26 -0500 (CDT) From: Eric Sandeen Subject: [PATCH] xfs_db: properly set dquot_buf when operating on dquot To: xfs-oss X-ASG-Orig-Subj: [PATCH] xfs_db: properly set dquot_buf when operating on dquot Message-ID: Date: Fri, 26 Aug 2016 14:03:25 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1472238206 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1208 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The earlier commit: 66a40d02 db: verify and calculate dquot CRCs added a "dquot_buf" to the iocur to specify when we were operating on a dquot and thus handle dquot CRC updates - but nothing ever actually set dquot_buf to a non-zero value. Without doing so, we don't recalculate the dquot crc when changing contents of a dquot: # xfs_db -x -c "dquot -u 500" -c "p crc" -c "write diskdq.bcount 2" \ -c "p crc" crctestfile crc = 0xfd293c68 (correct) diskdq.bcount = 2 crc = 0xfd293c68 (correct) [ the "(correct)" tag is another, different issue ] # xfs_db -x -c "dquot -u 500" -c "p crc" crctestfile Metadata CRC error detected at xfs_dquot block 0xd8/0x1000 crc = 0xfd293c68 (bad) With this change, dquot CRCs are properly recalculated in write_cur. Signed-off-by: Eric Sandeen --- diff --git a/db/dquot.c b/db/dquot.c index 47740f0..061eca5 100644 --- a/db/dquot.c +++ b/db/dquot.c @@ -164,6 +164,7 @@ dquot_f( } set_cur(&typtab[TYP_DQBLK], XFS_FSB_TO_DADDR(mp, bm.startblock), blkbb, DB_RING_IGN, NULL); + iocur_top->dquot_buf = 1; off_cur(qoff * (int)sizeof(xfs_dqblk_t), sizeof(xfs_dqblk_t)); ring_add(); return 0; From david@fromorbit.com Fri Aug 26 19:43:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E3757CA0 for ; Fri, 26 Aug 2016 19:43:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0ADA7AC003 for ; Fri, 26 Aug 2016 17:43:23 -0700 (PDT) X-ASG-Debug-ID: 1472258601-0bf81509b023d260001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id USsJ7B9f9npdpkN7 for ; Fri, 26 Aug 2016 17:43:21 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2B+FwBv4cBXEAI1LHldHAEBBAEBgykBAQEBAR5WfKMNBoxxhhWEECSFcwQCAoFNTQECAQEBAQECBgEBAQEBAQEBN0CEYQEBAQMBOhwVDgULCAMOCgklDwUlAwcaExuIFQcPv14BAQEBBgIBHwUehUiFFYocBYgmhzWJdI8hgXeIEIVWSIt7g3mFAio0hkwBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2016 10:13:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bdRiR-00055X-0s; Sat, 27 Aug 2016 10:43:19 +1000 Date: Sat, 27 Aug 2016 10:43:18 +1000 From: Dave Chinner To: Zorro Lang Cc: xfs@oss.sgi.com, sandeen@redhat.com Subject: Re: [PATCH] xfs_db: new -FF option help to continue the command without verify Message-ID: <20160827004318.GH19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_db: new -FF option help to continue the command without verify References: <1472209496-2401-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472209496-2401-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1472258601 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5431 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32357 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 26, 2016 at 07:04:56PM +0800, Zorro Lang wrote: > When I try to do below steps(a V5 xfs on $fsile): > > # xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" $fsfile > # xfs_db -x -c "sb 0" -c "write features_ro_compat 0" $fsfile > # xfs_db -c "sb 0" -c p $fsfile > > The step#2 and #3 all failed, as: > > Superblock has unknown read-only compatible features (0x1000) enable As it should. xfs_db *in expert mode* allows you to shoot yourself in the foot. However, it doesn't guarantee you'll have the expertise to be able to fix the hole you just shot in your foot. You have much to learn, grasshopper. :P > If we break the superblock, at least xfs_db should help to print the > superblock info. It should. You tried to write to it in expert mode, though. Try just printing the field in read-only mode (-r).... > And as a xfs debugger, xfs_db should can ignore > unexpected errors to continue the "expert" command which an expert > want to do. You're making the assumption that "-x" makes the user an expert. That is far from the truth - it just means someone read a man page, not that they have any specific XFS knowledge. The talk I gave at LCA 2015 is relevant here: https://www.youtube.com/watch?v=VpuVDfSXs-g I go into a bit of depth about how cognitive biases affect how people learn and assess their levels of expertise. This should explain why "expert" mode still needs /some/ safeguards. Remember: feature flags are the most critical part of the on-disk format because they tell everything that parses the on-disk format what format exists on disk. If it is changed to something the tools don't recognise, the tools should /absolutely refuse/ to run in anything other than the mode indicated by the feature flags (i.e. read-only or not at all). This, however, only turns off part of xfs_db's "make it easy-for-non-experts" automatic type detection functionality. If you know what you are doing and how xfs_db works (i.e. the user is an expert), this is trivial to get around. So, let me demonstrate: $ sudo xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" /dev/vdc features_ro_compat = 0x1000 $ sudo xfs_db -x -c "sb 0" -c "write features_ro_compat 0" /dev/vdc Superblock has unknown read-only compatible features (0x1000) enabled. Attempted to mount read-only compatible filesystem read-write. Filesystem can only be safely mounted read only. no current type $ Ok, there's an error there that tells me I can't decode the buffer that was loaded because automatic type detection was not run. So, lets load it as a raw buffer and set the type manually: $ sudo xfs_db -r -c "daddr 0" -c "type sb" -c "p features_ro_compat" /dev/vdc Superblock has unknown read-only compatible features (0x1000) enabled. Attempted to mount read-only compatible filesystem read-write. Filesystem can only be safely mounted read only. features_ro_compat = 0x1000 Yup, there we go, access to the superblock type parsing is re-enabled by starting with a raw data buffer, then setting the type manually. We probably should fix userspace to then remount in read-only mode so this works correctly without needing this step. (It's probably just a libxfs init flag that is wrong.) So: $ sudo xfs_db -x -c "daddr 0" -c "type sb" -c "write features_ro_compat 0" /dev/vdc Superblock has unknown read-only compatible features (0x1000) enabled. Attempted to mount read-only compatible filesystem read-write. Filesystem can only be safely mounted read only. features_ro_compat = 0 $ sudo xfs_db -r -c "sb 0" -c "p features_ro_compat" /dev/vdc features_ro_compat = 0 $ Yup, I just reset it to zero with expert mode, simply by knowing how xfs_db works and avoiding the error that occurred with automatic type detection. But even if I can't set the type manually, I can still fix this by going back to first principles. $ sudo xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" /dev/vdc features_ro_compat = 0x1000 $ First - manually find the on-disk format structure offset: $ pahole fs/xfs/libxfs/xfs_sb.o |grep sb_features_ro_compat __uint32_t sb_features_ro_compat; /* 212 4 */ __be32 sb_features_ro_compat; /* 212 4 */ $ Now we can just write zeros directly to the raw buffer, then check it by re-reading the superblock using the automatic type detection: $ sudo xfs_db -x -c "daddr 0" -c "write fill 0 212 4" -c "sb 0" -c "p features_ro_compat" /dev/vdc features_ro_compat = 0 Yup, problem solved. But: $ sudo xfs_db -r -c "sb 0" -c "p features_ro_compat" /dev/vdc Metadata CRC error detected at xfs_sb block 0x0/0x200 features_ro_compat = 0 It's not a clean solution for v5 filesystems - I have to recalc the CRC. Previous I would have simply run xfs_repair to fix this, but now I can do this: $ sudo xfs_db -x -c "sb 0" -c "crc" -c "crc -r" /dev/vdc Verifying CRC: crc = 0xdea3392d (bad) Recalculating CRC: crc = 0x3a7763c8 (correct) $ sudo xfs_db -r -c "sb 0" -c "p features_ro_compat" /dev/vdc features_ro_compat = 0 $ And now it's all good. So, as you can see we have /multiple ways/ we can fix bad feature fields with xfs_db. None of them require magic force flags, but it does require the ability to solve problems from first principles. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jhe@cs.wisc.edu Fri Aug 26 20:45:55 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2E2DC7CA0 for ; Fri, 26 Aug 2016 20:45:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E45F430404E for ; Fri, 26 Aug 2016 18:45:51 -0700 (PDT) X-ASG-Debug-ID: 1472262349-0bf57c55b12277b0001-NocioJ Received: from sabe.cs.wisc.edu (sabe.cs.wisc.edu [128.105.6.20]) by cuda.sgi.com with ESMTP id VRKsRiACmpQvMDMU (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 26 Aug 2016 18:45:49 -0700 (PDT) X-Barracuda-Envelope-From: jhe@cs.wisc.edu X-Barracuda-Effective-Source-IP: sabe.cs.wisc.edu[128.105.6.20] X-Barracuda-Apparent-Source-IP: 128.105.6.20 Received: from Juns-MacBook-Pro.local (eagleheights-118-111.resnet.wisc.edu [146.151.118.111]) (authenticated bits=0) by sabe.cs.wisc.edu (8.14.7/8.14.1) with ESMTP id u7R1jf3U027529 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Fri, 26 Aug 2016 20:45:49 -0500 Date: Fri, 26 Aug 2016 20:45:37 -0500 From: Jun He To: xfs@oss.sgi.com Subject: XFS discards more data than it writes Message-ID: <20160827014537.GA4119@Juns-MacBook-Pro.local> X-ASG-Orig-Subj: XFS discards more data than it writes MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: sabe.cs.wisc.edu[128.105.6.20] X-Barracuda-Start-Time: 1472262349 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 802 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32358 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi all, I find that, with '-o discard', XFS sometimes discards more data than it writes. This may slow down XFS more on slow-discard SSDs. Also, could problematic discard implementation lead to data loss? Setup to reproduce: - Linux 4.5.4 - Workload: LevelDB $ mkfs.xfs -K -f -s size=4096 -b size=4096 /dev/sdc1 $ mount -o discard /dev/sdc1 /mnt/fsonloop $ leveldb/db_bench --benchmarks=overwrite --num=3000000 --db=/mnt/fsonloop/leveldb_data0 --threads=1 --use_existing_db=0 I found that XFS discarded ~2.4GB while only wrote ~1.4GB, by blktrace. (This is not due to the mkfs discarding the whole disk.) Some visual https://github.com/junhe/xfs-bug-report/blob/master/xfs-double-discard.png Some spaces are discarded twice in this case. Is it a bug? Thanks, Jun From Sales.11@fashion-business.com Fri Aug 26 22:16:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 778DB7CA0 for ; Fri, 26 Aug 2016 22:16:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 33F93304048 for ; Fri, 26 Aug 2016 20:16:51 -0700 (PDT) X-ASG-Debug-ID: 1472267808-0bf57c55b222bfa0001-NocioJ Received: from fashion-business.com ([14.218.91.168]) by cuda.sgi.com with SMTP id 0JODRAu4xXjJVCYf for ; Fri, 26 Aug 2016 20:16:49 -0700 (PDT) X-Barracuda-Envelope-From: Sales.11@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.91.168] X-Barracuda-Apparent-Source-IP: 14.218.91.168 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Fri, 26 Aug 2016 16:49:15 +0800 From: "angelbervogue@sina.com" Subject: Re: ANGELBER bag will be sold in June of World-market To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: ANGELBER bag will be sold in June of World-market MIME-Version: 1.0 Sender: Sales.11@fashion-business.com Reply-To: angelbervogue@sina.com Date: Fri, 26 Aug 2016 16:49:15 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.91.168] X-Barracuda-Start-Time: 1472267808 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2113 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.56 X-Barracuda-Spam-Status: No, SCORE=1.56 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32359 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160827031651.13F321940060@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJNQVJHSU4t Qk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog QXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IEZPTlQtU0laRTogMTJwdDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+RGVhciZuYnNwO1B1cmNoYXNpbmcmbmJz cDtNYW5hZ2VyLDwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFz cz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5E OiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJn YigyNDYsMjQ2LDI0NikiPkhlcmUgDQppcyBBbmdlbG8gd2hvIGNvbWVzIGZyb20gQU5HRUxCRVIg Vk9HVUUgQ08uLCBMVEQ7IG91ciBjb21wYW55IGlzIGEgcHJvZmVzc2lvbmFsIA0KbWFudWZhY3R1 cmVyIGluIGRlc2lnbmluZyB3aXRoIHRoZSBiYWcgaW4gQ2hpbmEuIFRoZSBicmFuZCBvZiB1cyBp cyBBTkdFTEJFUiwgDQpvbmUgbmV3IGRlc2lnbiB3aWxsIGJlIHNob3duIGluIFdvcmxkLU1hcmtl dCBpbiBuZXh0IG1vbnRoLjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0 IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNL R1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRp bmc6IHJnYigyNDYsMjQ2LDI0NikiPklmIA0KeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZGlz aWduLCBwbGVhc2UgY29udGFjdCB3aXRoIG1lIGZyZWVseSwgSSB3aWxsIHNlbmQgDQp0aGUgY2F0 YWxvZyB0byB5b3UgZm9yIGNoZWNraW5nLjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJP VFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPkIuIA0KV2lzaGVzLjwvU1BBTj48L1A+DQo8 UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05U LVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPkFuZ2VsbyAN Ckh1YW5nPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU4tQk9UVE9NOiAwcHQiIGNsYXNzPU1z b05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJn YigyNDYsMjQ2LDI0Nik7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tc2hhZGluZzogcmdiKDI0 NiwyNDYsMjQ2KSI+U2t5cGU6IA0KZGF2aWUxODE4MTg8L1NQQU4+PC9QPjwvQk9EWT48L0hUTUw+ DQoNCg== From jaonary@free.fr Sat Aug 27 02:58:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 047527CA0 for ; Sat, 27 Aug 2016 02:58:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6B3C2AC002 for ; Sat, 27 Aug 2016 00:58:48 -0700 (PDT) X-ASG-Debug-ID: 1472284720-0bf8155c75259270001-NocioJ Received: from nskntmtas02p.mx.bigpond.com (nskntmtas02p.mx.bigpond.com [61.9.168.140]) by cuda.sgi.com with ESMTP id bkIAabaESzkrnKLZ (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 27 Aug 2016 00:58:41 -0700 (PDT) X-Barracuda-Envelope-From: jaonary@free.fr X-Barracuda-Effective-Source-IP: nskntmtas02p.mx.bigpond.com[61.9.168.140] X-Barracuda-Apparent-Source-IP: 61.9.168.140 Received: from nskntcmgw08p ([61.9.169.168]) by nskntmtas02p.mx.bigpond.com with ESMTP id <20160827075839.HRBC2042.nskntmtas02p.mx.bigpond.com@nskntcmgw08p>; Sat, 27 Aug 2016 07:58:39 +0000 Received: from pzguka.net ([5.15.106.209]) by nskntcmgw08p with BigPond Outbound id c7yS1t00n4X5hL5017ybZW; Sat, 27 Aug 2016 07:58:39 +0000 X-Authentication-Info: Submitted using ID heatherandfrank@bigpond.com X-Authority-Analysis: v=2.1 cv=DL5ymH5b c=1 sm=1 tr=0 a=VdkEeTvIobCZ9P6nMtUXFQ==:117 a=VdkEeTvIobCZ9P6nMtUXFQ==:17 a=L9H7d07YOLsA:10 a=9cW_t1CCXrUA:10 a=s5jvgZ67dGcA:10 a=DAwyPP_o2Byb1YXLmDAA:9 a=0UQhpP3XAAAA:8 a=isZLis2o0q5P_jHvqy8A:9 a=CjuIK1q_8ugA:10 a=yMhMjlubAAAA:8 a=SSmOFEACAAAA:8 a=i5OERPNd3YbO3vsDCKQA:9 a=ZOyVZAh41-ttllsM:21 a=gKO2Hq4RSVkA:10 a=UiCQ7L4-1S4A:10 a=hTZeC7Yk6K0A:10 a=frz4AuCg-hUA:10 a=X81qSitBqtLZ4treTfMP:22 a=BKKCjISod1eDJeS0ORpz:22 a=zjWhRoSqWz9hl55Hdlzg:22 From: Cyril Brulebois To: "discover" , "xfs" , "debian-cd" , "david.given@gmail.com" , "Niels Thykier" Subject: that's exciting! Date: Sat, 27 Aug 2016 10:58:24 +0300 X-ASG-Orig-Subj: that's exciting! Message-ID: <0000be9cfefb$291fd936$942ed1d0$@free.fr> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0006_0176E2C9.255CFAEF" Thread-Index: AdHyn3K9mIgDEYD2VuMimlX9C6kY1w== X-Mailer: Microsoft Office Outlook, Build 11.0.6353 Content-Language: en-us X-Barracuda-Connect: nskntmtas02p.mx.bigpond.com[61.9.168.140] X-Barracuda-Start-Time: 1472284721 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2360 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message This is a multipart message in MIME format. ------=_NextPart_000_0006_0176E2C9.255CFAEF Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hello, I've just seeen something very nice, it's so exciting, you have to take a look Best wishes, Cyril Brulebois ------=_NextPart_000_0006_0176E2C9.255CFAEF Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

<= span lang=3DEN-US>Hello,

 

I've just seeen something very nice, it's so exciting= , you have to take a look http://fomehako.zijasa.com/aehfnk

 

Best wishes, Cyril Brulebois

------=_NextPart_000_0006_0176E2C9.255CFAEF-- From zlang@redhat.com Sat Aug 27 09:51:53 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7487A7CA2 for ; Sat, 27 Aug 2016 09:51:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D7E24AC002 for ; Sat, 27 Aug 2016 07:51:52 -0700 (PDT) X-ASG-Debug-ID: 1472309510-0bf81509b0267850001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HKWrMKIL3WtV1ruT (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 27 Aug 2016 07:51:51 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D1C25CD247; Sat, 27 Aug 2016 14:51:50 +0000 (UTC) Received: from localhost (vpn1-5-239.pek2.redhat.com [10.72.5.239]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7REpn2I000908; Sat, 27 Aug 2016 10:51:50 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH] fstests: test xfs rw remount with unknown ro-compat features Date: Sat, 27 Aug 2016 22:51:37 +0800 X-ASG-Orig-Subj: [PATCH] fstests: test xfs rw remount with unknown ro-compat features Message-Id: <1472309497-11351-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Sat, 27 Aug 2016 14:51:50 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472309511 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4303 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Although ro-compat features cannot be mounted rw, a bug allows an ro->rw remount transition, and this will corrupt the filesystem if it contains ro-compat features unknown to the running kernel. This bug has been fix on linux kernel (d0a58e8 xfs: disallow rw remount on fs with unknown ro-compat features), this case is the regression testcase of that bug. Signed-off-by: Zorro Lang --- tests/xfs/263 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/263.out | 6 ++++ tests/xfs/group | 1 + 3 files changed, 106 insertions(+) create mode 100755 tests/xfs/263 create mode 100644 tests/xfs/263.out diff --git a/tests/xfs/263 b/tests/xfs/263 new file mode 100755 index 0000000..b934e9f --- /dev/null +++ b/tests/xfs/263 @@ -0,0 +1,99 @@ +#! /bin/bash +# FS QA Test 263 +# +# Test upstream d0a58e8: +# xfs: disallow rw remount on fs with unknown ro-compat features +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + # Due to we've broken the superblock of SCRATCH_DEV by + # xfs_db, so clean bad superblock at the end + _scratch_unmount + _scratch_mkfs >/dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# remove previous $seqres.full before test +rm -f $seqres.full + +# real QA test starts here +_supported_fs xfs +_supported_os Linux +_require_scratch +_require_xfs_crc + +# Only V5 XFS disallow rw mount/remount with unknown ro-compat +# features +MKFS_OPTIONS="-m crc=1" +_scratch_mkfs_xfs >>$seqres.full 2>&1 + +# set the highest bit of features_ro_compat, use it as an unknown +# feature bit. If one day this bit become known feature, please +# change this case. +$XFS_DB_PROG -x -c "sb 0" \ + -c "write features_ro_compat $((2**31))" \ + $SCRATCH_DEV + +echo "rw mount test" +# Generally this mount failed as bad superblock +# But still keep testing this +MOUNT_OPTIONS="-o rw" +_scratch_mount 2>>$seqres.full +if [ $? -eq 0 ]; then + _fail "rw mount test failed" +fi + +echo "ro mount test" +MOUNT_OPTIONS="-o ro" +_scratch_mount +if [ $? -ne 0 ]; then + _fail "ro mount test failed" +else + # no hang/panic is fine + $FSSTRESS_PROG -d $SCRATCH_MNT -p 4 -n 400 >>$seqres.full 2>&1 +fi + +dmesg -c >/dev/null +echo "rw remount test" +MOUNT_OPTIONS="-o rw,remount" +_scratch_mount 2>>$seqres.full +if [ $? -eq 0 ]; then + _fail "rw,remount test failed" +fi +dmesg -c | sed -n -e "s/.*XFS.*: \(ro->rw transition prohibited.*\)/\1/p" + +# success, all done +status=0 +exit diff --git a/tests/xfs/263.out b/tests/xfs/263.out new file mode 100644 index 0000000..974e02f --- /dev/null +++ b/tests/xfs/263.out @@ -0,0 +1,6 @@ +QA output created by 263 +features_ro_compat = 0x80000000 +rw mount test +ro mount test +rw remount test +mount: cannot remount LOOP_IMG read-write, is write-protected diff --git a/tests/xfs/group b/tests/xfs/group index 6905a62..ec3c022 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -260,6 +260,7 @@ 260 auto quick quota 261 auto quick quota 262 auto quick quota +263 auto quick mount 265 auto clone 266 dump ioctl auto quick 267 dump ioctl tape -- 2.7.4 From zlang@redhat.com Sat Aug 27 09:57:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E03917CAF for ; Sat, 27 Aug 2016 09:57:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 932618F8039 for ; Sat, 27 Aug 2016 07:57:28 -0700 (PDT) X-ASG-Debug-ID: 1472309846-0bf57b5311289ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xHTYCgos5CvZNOVU (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 27 Aug 2016 07:57:27 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CA4DA1FB03; Sat, 27 Aug 2016 14:57:26 +0000 (UTC) Received: from localhost (dhcp-12-196.nay.redhat.com [10.66.12.196]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7REvPkH018113; Sat, 27 Aug 2016 10:57:26 -0400 Date: Sat, 27 Aug 2016 22:57:25 +0800 From: Zorro Lang To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs_db: new -FF option help to continue the command without verify Message-ID: <20160827145724.GJ10350@dhcp12-143.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_db: new -FF option help to continue the command without verify References: <1472209496-2401-1-git-send-email-zlang@redhat.com> <20160827004318.GH19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160827004318.GH19025@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Sat, 27 Aug 2016 14:57:26 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472309847 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6291 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 27, 2016 at 10:43:18AM +1000, Dave Chinner wrote: > On Fri, Aug 26, 2016 at 07:04:56PM +0800, Zorro Lang wrote: > > When I try to do below steps(a V5 xfs on $fsile): > > > > # xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" $fsfile > > # xfs_db -x -c "sb 0" -c "write features_ro_compat 0" $fsfile > > # xfs_db -c "sb 0" -c p $fsfile > > > > The step#2 and #3 all failed, as: > > > > Superblock has unknown read-only compatible features (0x1000) enable > > As it should. xfs_db *in expert mode* allows you to shoot yourself > in the foot. However, it doesn't guarantee you'll have the expertise > to be able to fix the hole you just shot in your foot. > > You have much to learn, grasshopper. :P So I wrote a *stupid* patch at here... HaHa, I'm not afraid to try more *this* if I can learn more:) Thanks so much you take time to explain lots of things for me. That's my pleasure:) And they're very helpful for me, I'm trying to read more man-pages and code for understand all you said below(Looks like I have much things to do this weekend:-P) Thanks, Zorro > > > If we break the superblock, at least xfs_db should help to print the > > superblock info. > > It should. You tried to write to it in expert mode, though. Try just > printing the field in read-only mode (-r).... > > > And as a xfs debugger, xfs_db should can ignore > > unexpected errors to continue the "expert" command which an expert > > want to do. > > You're making the assumption that "-x" makes the user an expert. > That is far from the truth - it just means someone read a man page, > not that they have any specific XFS knowledge. The talk I > gave at LCA 2015 is relevant here: > > https://www.youtube.com/watch?v=VpuVDfSXs-g > > I go into a bit of depth about how cognitive biases affect how > people learn and assess their levels of expertise. This should > explain why "expert" mode still needs /some/ safeguards. > > Remember: feature flags are the most critical part of the on-disk > format because they tell everything that parses the on-disk format > what format exists on disk. If it is changed to something the tools > don't recognise, the tools should /absolutely refuse/ to run in > anything other than the mode indicated by the feature flags (i.e. > read-only or not at all). > > This, however, only turns off part of xfs_db's "make it > easy-for-non-experts" automatic type detection functionality. If you > know what you are doing and how xfs_db works (i.e. the user is an > expert), this is trivial to get around. > > So, let me demonstrate: > > $ sudo xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" /dev/vdc > features_ro_compat = 0x1000 > $ sudo xfs_db -x -c "sb 0" -c "write features_ro_compat 0" /dev/vdc > Superblock has unknown read-only compatible features (0x1000) enabled. > Attempted to mount read-only compatible filesystem read-write. > Filesystem can only be safely mounted read only. > no current type > $ > > Ok, there's an error there that tells me I can't decode the buffer > that was loaded because automatic type detection was not run. So, > lets load it as a raw buffer and set the type manually: > > $ sudo xfs_db -r -c "daddr 0" -c "type sb" -c "p features_ro_compat" /dev/vdc > Superblock has unknown read-only compatible features (0x1000) enabled. > Attempted to mount read-only compatible filesystem read-write. > Filesystem can only be safely mounted read only. > features_ro_compat = 0x1000 > > Yup, there we go, access to the superblock type parsing is > re-enabled by starting with a raw data buffer, then setting the type > manually. We probably should fix userspace to then remount in > read-only mode so this works correctly without needing this step. > (It's probably just a libxfs init flag that is wrong.) > > So: > > $ sudo xfs_db -x -c "daddr 0" -c "type sb" -c "write features_ro_compat 0" /dev/vdc > Superblock has unknown read-only compatible features (0x1000) enabled. > Attempted to mount read-only compatible filesystem read-write. > Filesystem can only be safely mounted read only. > features_ro_compat = 0 > $ sudo xfs_db -r -c "sb 0" -c "p features_ro_compat" /dev/vdc > features_ro_compat = 0 > $ > > Yup, I just reset it to zero with expert mode, simply by knowing how > xfs_db works and avoiding the error that occurred with automatic type > detection. But even if I can't set the type manually, I can still > fix this by going back to first principles. > > $ sudo xfs_db -x -c "sb 0" -c "write features_ro_compat 4096" /dev/vdc > features_ro_compat = 0x1000 > $ > > First - manually find the on-disk format structure offset: > > $ pahole fs/xfs/libxfs/xfs_sb.o |grep sb_features_ro_compat > __uint32_t sb_features_ro_compat; /* 212 4 */ > __be32 sb_features_ro_compat; /* 212 4 */ > $ > > Now we can just write zeros directly to the raw buffer, then check > it by re-reading the superblock using the automatic type detection: > > $ sudo xfs_db -x -c "daddr 0" -c "write fill 0 212 4" -c "sb 0" -c "p features_ro_compat" /dev/vdc > features_ro_compat = 0 > > Yup, problem solved. But: > > $ sudo xfs_db -r -c "sb 0" -c "p features_ro_compat" /dev/vdc > Metadata CRC error detected at xfs_sb block 0x0/0x200 > features_ro_compat = 0 > > It's not a clean solution for v5 filesystems - I have to recalc the > CRC. Previous I would have simply run xfs_repair to fix this, but > now I can do this: > > $ sudo xfs_db -x -c "sb 0" -c "crc" -c "crc -r" /dev/vdc > Verifying CRC: > crc = 0xdea3392d (bad) > Recalculating CRC: > crc = 0x3a7763c8 (correct) > $ sudo xfs_db -r -c "sb 0" -c "p features_ro_compat" /dev/vdc > features_ro_compat = 0 > $ > > And now it's all good. > > So, as you can see we have /multiple ways/ we can fix bad feature > fields with xfs_db. None of them require magic force flags, but it > does require the ability to solve problems from first principles. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From executive06@buganviliasvallarta.com Sat Aug 27 10:07:23 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.6 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,SINGLE_HEADER_2K,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 575F67CA7 for ; Sat, 27 Aug 2016 10:07:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 80530AC003 for ; Sat, 27 Aug 2016 08:07:17 -0700 (PDT) X-ASG-Debug-ID: 1472310431-0bf57c55b1246a70001-NocioJ Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0096.outbound.protection.outlook.com [104.47.34.96]) by cuda.sgi.com with ESMTP id Yc7Xz3zN5cd0z72i (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 27 Aug 2016 08:07:11 -0700 (PDT) X-Barracuda-Envelope-From: executive06@buganviliasvallarta.com X-Barracuda-Effective-Source-IP: mail-by2nam01on0096.outbound.protection.outlook.com[104.47.34.96] X-Barracuda-Apparent-Source-IP: 104.47.34.96 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=buganviliasclub01.onmicrosoft.com; s=selector1-buganviliasvallarta-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=RzMJbRoWddx3u6ASHKhVm8Z7Qk4z20b0Db7mVUSOCvo=; b=GP8gsPJnQUEujQ/iDna+a6awdprcbQZuWkznBNlC8c48aArl7WHDQoCAylfwcGmQPHMHFfkdBmE2h0WFddPeizLxnzM7pQdxZsXm1nOU0Ebt5fUiZIeK2oIcGiBccAyr9Etuq8CtcggsQbzPjJlXlLO9SYzqfDI9IZGCG6PXI+k= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=executive06@buganviliasvallarta.com; Received: from INFORMATICAPC (189.177.53.45) by CY4PR18MB0934.namprd18.prod.outlook.com (10.173.182.139) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.599.9; Sat, 27 Aug 2016 15:06:54 +0000 From: Franco Aros To: Franco Aros Subject: Redescubre la magia de nuestras fiestas Date: Sat, 27 Aug 2016 10:06:48 -0500 X-ASG-Orig-Subj: Redescubre la magia de nuestras fiestas Message-ID: <050601d20074$aa476e20$fed64a60$@com> MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_0507_01D2004A.C1716620" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: AdH9YCNuZ7X2fmz4TuOCUuJ35Yii/g== Content-Language: es-mx X-Originating-IP: [189.177.53.45] X-ClientProxiedBy: CY4PR13CA0024.namprd13.prod.outlook.com (10.168.161.162) To CY4PR18MB0934.namprd18.prod.outlook.com (10.173.182.139) X-MS-Office365-Filtering-Correlation-Id: 3aed6f2a-0bfa-496a-314a-08d3ce8bcda2 X-Microsoft-Exchange-Diagnostics: 1;CY4PR18MB0934;2:3Yarv+5fsclNkPP+/7Hli6NmaavDk/BDWdIaewOV5v2CVGehkkRYzN5iSEsNhEBzWSa8mQzA99OQXy2USk0Ud3CWw13lVpy+T5PeryaNCq6e1Z7Wzsss8iErGRhKRVJQOy+a2aVinBm5en/EwdlRCdEfvBrTaQrrHDanDjMAm3XODiScBOhK+n3p6ROTxHDE;3:ip7cqjIdfSysQvweiRGh10hoGTUGoqpUKqoGL/qMJI8V6b0Xq6O4ErRbHKuoX7F+RKO8l55lGQvOd6lJwkhgZXdv8Fukg+yHPPuzwShcO3r+tRuaZSbYvS63hZ09CJYy X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY4PR18MB0934; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY4PR18MB0934;25:8kg+jWXBeEve0lVsd464z5fG/tf78G/fXtD6McOdL?= =?us-ascii?Q?Z9rUSQiLnuo5nS8dUCydOkd63WIb5o4sQ/0wO7EJTwmWIuIpBkcido4532xM?= =?us-ascii?Q?1DoE7+4Q+3ZB31Uh02NZaKD6r6UQKkbWn/vdKuX9i97s78N6kZ1LJRby+6Pv?= =?us-ascii?Q?pAASZu6rHLjEgKeQPgMTsyKho7A6zhMCwcKFqg5sz7tH2vr+HypBS8rToLlR?= =?us-ascii?Q?rrrXYZ0w0p0ZV3CJZxc3iXeZj/w5qz4/ruG/XeHSpITvlbnjyx2fG3zMQ3fK?= =?us-ascii?Q?Ue05ZKBesKymBmzG/imsR7/l3WSkeyDCQrPy5Cp9fWJqoV/7d/5OolviVb5N?= =?us-ascii?Q?o2uTeAmKspnSpHRiiS/4CaKIGq6eeBMfbOu7Gp4io8js4D5BJvaMQDRPo9ke?= =?us-ascii?Q?4ZjkCCnzqssLmTgr5JUGCxuYl7B+z7cxOp9M5OF2Ga49RveF+ltzPkuZs1Hb?= =?us-ascii?Q?ScWfXzXpEVhKw42gUdIb/EfTYZD/ZPGEvgzdzzqM6s/yZZLTNv4nbr28/C9p?= =?us-ascii?Q?GGAswiJEY5TCAcFLlBlZraZBA3cuagsnzJsqp3FYCi/vRwWbifuI+VzOJ6px?= =?us-ascii?Q?hdnOP79aPmPR991uBnO4gteP6yMvTqKVF69rliy7hfOPsccK/UGtWY+0bTZd?= =?us-ascii?Q?xVTV5S3hqUNH5swNyflLNNx0UwSk1U0un3xCiDDNAjyUoRXRsqq7/m9O/CL3?= =?us-ascii?Q?anpT9xSL3KNzqMITfrpCnBWKKAiHGm5u1LAADtvVxy/TFYKepT8cZXzHekhu?= =?us-ascii?Q?eAYK9cD3C07bXiYlVk1yzbXChkOw2E1G3fjAiZHvq3ukNfNcXfTG2EObmgXV?= =?us-ascii?Q?WogJqJz0SwJHI+O0KL4nriqSR+cu1LpoCHHd2zcZ+Sd4SP7OFMg/Ygf57cZ2?= =?us-ascii?Q?XdZZ9Yis4uVVHeRi8SIOwv/7ZG+SRlFZrxJXiH2RKrKZS9laqAqWwDVkmoxe?= =?us-ascii?Q?Wbh16kv6q69CFiY5Bc0axAhjMmvNu5CSAxMDb+gJlrEvXCItVFdhqrUSlOTQ?= =?us-ascii?Q?2v+jXhpi+7YKZWp84dHd2s/kNhg7i3j1VBCkKU4tewVWgI/zbbG90ja1k82t?= =?us-ascii?Q?A+7RYWrsRA37JtHpGbJTljdZzrMWucs07BH48ry/xdqEH7hASJlKpQjJouVe?= =?us-ascii?Q?0QEmYP/u/XEWPbUCqzFEEjtgmwxI6Dv?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR18MB0934;31:NgCusk0WikdEbylVX3RKaRZ1CCuDEyr0Lpgqra4cgXF6NohRlR9FheXjE5KPAtgAN35FJfpLqzJ4OLDpS9LXyriLVaXepWvMjwrCCI2BQXunAs3C+EuqxkpCfC9/PFw2zNJWPOEypSNM0oKz4GrGQAgJfaxhOyvwGXVUA+76mig6jeJG9Vb1t+4R1obEH+vgYdFSW/W8h6ShK3cUOpKqkBLI5nH7QEyT7z8ksSms0xkFjInBzQ9/fzsSdRQGcVrK;4:75q+zU8BkwLLPbhSUmP+haumC6luEqvMyXLYB/7f1Ysgaqv1m/mMhBvkXhZ5xPa01sxSvZnsNhTlUYsd/a8EfoBLgozl+7MlPHTl6QNiP03CZb/GGKyKJHHaEyIGcapo4fpdW4ZecLyq5UVpFWp6TaogdprOswjtMYnNBRi8qzLQCVrO7H/Q0VJ/6Nams7pkVk0UiPVRo1hgwpuZcM5qAmWg2Q7fIbihL48HykDV2h85yWRTPyWUS1StsASOa83rfx3FJTlREQthmEAcQBjBwwWdqPbZKjSk0glgYKP9FDu5rnx/NJ5pydKrIyLQs5sP2tzxTTj+DrhZxpUbnLAwODk3ij6ix53xl/GDSB+SzIRcB9H4s22KgKt18E1RN9GISsSedTDR3TzNAkVYb/DNsL3o/o0EnJzlJrjf7rd96VnZWQSVh1EPZyraX8/rfONdOUuCuO7GosHyXU6dEgmgiSq148e0XnnHK7t4WPv4X0j8eTUvcbQ/yRJ68FToVp2CFJnqK0fC1iH2N8y26bwsz7USThAx71JXYS0tUQ3fCb5xLX58eR0uOpz0/7SLWHEM X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(31418570063057)(86561027422486)(21748063052155)(64217206974132); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(102415321)(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001);SRVR:CY4PR18MB0934;BCL:0;PCL:0;RULEID:;SRVR:CY4PR18MB0934; X-Forefront-PRVS: 0047BC5ADE X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(7916002)(189002)(199003)(77096005)(33646002)(42186005)(7366002)(586003)(7336002)(71636004)(81156014)(18717965001)(512934002)(7406005)(19627595001)(81166006)(2906002)(96836002)(106356001)(102836003)(19617315012)(92566002)(8676002)(7416002)(229853001)(19625215002)(15974865002)(6116002)(101416001)(66066001)(50986999)(4001450100002)(7906003)(50226002)(59696002)(84326002)(8666005)(33716001)(189998001)(7736002)(16236675004)(86362001)(861006)(17760045003)(84116002)(1420700001)(110136002)(9686002)(5660300001)(107886002)(68736007)(3846002)(6200100001)(15975445007)(97736004)(61296003)(105586002)(19580405001)(14726001)(19580395003)(19300405004)(18206015028)(7846002)(7826002)(7099028)(7059030)(11686003)(42262002)(19627235001);DIR:OUT;SFP:1102;SCL:1;SRVR:CY4PR18MB0934;H:INFORMATICAPC;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:es; Received-SPF: None (protection.outlook.com: buganviliasvallarta.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;CY4PR18MB0934;23:X//LaA9vd1Sv3lRO6uMktDuJ2l83ikbp+ZM2sTPym?= =?us-ascii?Q?79bNX2Xlo1MPPpNbW4+KsAeQmtrjiqiOTW+KnZu0PW3Lpb0NvcPKsZWdizNw?= =?us-ascii?Q?ypWH9QuancvvhzykwVQk0zlVeL5gfCMOpnqvlUiA84L9OlghTPUGOkJbwiz3?= =?us-ascii?Q?9uLogr5L+AT9WawXFoxdwdoeMYQcOs8pTvLTXpjyrezU0dsSGl1D8cij0oYw?= =?us-ascii?Q?mWIFLRcVP+LckbHfTzQHIbbX9jgqgm/VjdIh1pBAFT9UuNbsR1JaOOX651IC?= =?us-ascii?Q?R2C+Koq/bCgtJ2Iy3tg/oRKzPVJ7UE8Ai6sZcDznyCX6STp54tkX4AWBUz7d?= =?us-ascii?Q?b/z4c9puudopM2xAWaUWrLwjY+40lSFuoIU8SJ/RK7rEGpgx6F3jhPhs9e/Z?= =?us-ascii?Q?tseQp8aV5fE4im+Onj5GOv9oVtbg8LX5tyMwHppPVu3fmx1dJiq/Kd34nSgf?= =?us-ascii?Q?EBH+/AY/buA7G5bCuddaUpshweDLNUkHQIrSalIakQvvdtEcmBDBKyMZt51s?= =?us-ascii?Q?OFXqzkgatzYYEz287JWQ0ERRs+Jj9b2nkODFAzgk1qiX++dAl6UblImHOkzp?= =?us-ascii?Q?L3sfUuPkxGW1XfzDk6mWf2S3v+K/do8tysj/0kIsYXy9yFFIE5fudZamAE7F?= =?us-ascii?Q?ToX4R9V3R3soCJUJhhoWh1irezyLCDIlaTEWnegRr8kWATbZrUvExzxucfvz?= =?us-ascii?Q?nxZFfmjfB7YCGJq7lcMj9RYbNvjk7LFjSW2W9aoenLxbFBu8qgS+wVNQIKVS?= =?us-ascii?Q?A8azchpTY0wWWe1qSyCMtTA449xV+S8uO7C2SHXHfabfvMS8bxXBh/fikzhA?= =?us-ascii?Q?JHdNpu+KAdIGrziMFHz2Kmmm9voyG8LiBx9ugiIk/DxbCQtcmfu3UEbGh5Is?= =?us-ascii?Q?/sMHQhr8i63HRv4LqO2MzUPcYs8RtvRvZpOONS8XzpNqO7g2DxQUli8s0OBJ?= =?us-ascii?Q?G/HatdlRoZiwMXPuJdRv1bG3oP+5yKGcfgkV4j6DFNeXn9YEhKlt4S5LBs4w?= =?us-ascii?Q?ALuiIP78c1Duf/wgI+ZAUMZkwYZOdZL769FzNEZpO1PLsLD8dFJ82kGaDKJz?= =?us-ascii?Q?mVNuSWuxxKfzCKGUISsnMgybCqpPdi4xFvCorq5pkgZvATm73WCc2Nun2KW3?= =?us-ascii?Q?GfcS4zmtUJVate3VqHyk9YfhRO/nRlG9QFGGvKCXvv+b7Tt5X+Dq8YcAuYOV?= =?us-ascii?Q?heJ34Lea5qXSFSnneDZEBPWX8/SXwUV1YsNg8wjzv3yjkxQqYc80I7sDcrus?= =?us-ascii?Q?e/fZyZeUko9NyenZSX24g4oQGmG7+hlbNNSJgFhygbqyin0XYF2J+BKIPD2H?= =?us-ascii?Q?9Nuvmy8qwzGWNbWdCCAYhF0qnQ/6LXmM2bQ5h1ORsplIDR6okGr5jzW39eye?= =?us-ascii?Q?QyeO/A5HYDcUhWjxsGMAIqfQ1TFzGiod5paCJdqZ65WSMaDEeBg367f9vJlS?= =?us-ascii?Q?2lV2QmmSYPnLXj6ZP5RnisRjst5r5DCieGVxp+9eLSrbwOuDgz5qZWPDb+Tw?= =?us-ascii?Q?Q8wTqFbDn/JZ2i/VeMM+dsPmxiP+x4PFndFZpR7q/oMjADtj5/l2PF7+9m3B?= =?us-ascii?Q?2yzCDr3wHOwyxdFLJJe/dRWOLpWtNHIQWedsMzgOo+JZ/vx4s0r2RfamjXYk?= =?us-ascii?Q?j47xwYdZ7d3ZZlD+ZbcC2BdzWy/DPXi7aaGPL8z4x2nxixPq/XB8ia9rESeO?= =?us-ascii?Q?ddxqYMzprpHs9CY5MztPK9nR5RHVWyg7df/GfTbv/xsX9o=3D?= X-Microsoft-Exchange-Diagnostics: 1;CY4PR18MB0934;6:fV76nbMyC2ywqQTO+aj32zDRR8iapR1BU77sVJ1+ho8pht88iSPh5PudmXBwBDYiyMfE4D7y8je60LGE4ZQF+piwEELw1hdwJOdlI0xSLW11vOMJTN4kFcKB7InlXQjsBcNvTUxkC5EK/dequKR3XYVqk1gI7kDtJgmnZvqCFtdsB82V5T+XyOW8m8SWlmNqMblyv1/k4sehLDZXLXv2LlThwrBS5JZwBiGFQMBFE9wZNQU8M8XD1SJF2Q0PrQoKRFWCD9wGmledKgW2cHmMDDUkckYhNmgQvFOqhJCQxDk=;5:KIov1qlx8HoVla237WEiFgZOFujIVMBxxS8hwpOsP5gYIIXuUd5KYC45Eu7FqbfYljhzy9IaFyYxPYO003KJBKeJkZZYw6GWVRbnpXfeeS+j/2sMzdDJnrITf2sIvMqBh9FWADsvE70bWLFwQXBDiA==;24:p5DX39YkDpMOgK6O4KGK8+MSLLz3h58oKzszipa2S6PRei9VB54wXzFpRe/HFTlwgpWuOkZ8GRLE+OcvrHUBbtaWCjYTpX2iP2R1Wz6x4QA=;7:FAu2I3OHeAQ6dM1Jpi0SYBaQCUJvu10pTdl9gudhV9ajmcUFFA7nGIOoSyQiewi9FtCbBf4NNARqytibCusJZvvB6BIigcC+206WuFsCARg+F0D4PGykpDS8tTJsWFiD0QxUXksYfZs5sClW7OBqhBTZXzBH51fDzUj5wqBhZWQ/B6zjw12R9DYGK/pNKYSPcZdDs05uapaPerD3qoG1eR7yG86NJTEHY0DuHc3hruwsoj0vg1M5kOboRNfv2Zbw SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: buganviliasvallarta.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Aug 2016 15:06:54.4360 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR18MB0934 X-Barracuda-Connect: mail-by2nam01on0096.outbound.protection.outlook.com[104.47.34.96] X-Barracuda-Start-Time: 1472310431 X-Barracuda-Encrypted: ECDHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9271 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.97 X-Barracuda-Spam-Status: No, SCORE=0.97 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA090e, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32371 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA090e Custom Rule SA090e 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain ------=_NextPart_000_0507_01D2004A.C1716620 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0508_01D2004A.C1716620" ------=_NextPart_001_0508_01D2004A.C1716620 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable =20 Le invitamos cordialmente a vacacionar con nosotros =20 Franco2.jpg =20 =20 Buganvilias Resort te invita a disfrutar estas fiestas patrias hosped=E1ndote en lujoso hotel Sheraton Buganvilias de Puerto Vallarta. =20 Aprovecha esta oportunidad y al reservar el d=EDa de hoy ll=E9vate = regalos adicionales, una cuponera con valor de 100 d=F3lares en descuento entre otros grandes regalos. =20 ** Un a=F1o de vigencia a partir de su compra. No aplica semana santa, = navidad y a=F1o nuevo** =20 =20 Franco Aros Ejecutivo de operaciones Call Center T +52 (322) 226 0404 Ext. 6949=20 E-mail ejecutivo7@buganviliasclub.com.mx=20 BUGANVILIAS RESORT VACATION CLUB, PUERTO VALLARTA, MEXICO Blvd. Francisco Medina Ascencio 999, Zona Hotelera Las Glorias, Puerto Vallarta, Jalisco. MX. 48333 www.buganviliasclub.com | https://www.facebook.com/BuganviliasVallartaMX | = https://twitter.com/buganviliasclub Respetamos su privacidad, en caso de que no quiera recibir este tipo de informaci=F3n y promociones por favor de enviar la palabra "baja" para = ser eliminado, agradecemos su comprensi=F3n, pues de ninguna manera es = nuestra intenci=F3n molestarle, si no brindarle opciones para vacacionar . =20 ------=_NextPart_001_0508_01D2004A.C1716620 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

 

Le invitamos cordialmente a vacacionar con = nosotros

 

3DFranco2.jpg

 

 

Buganvilias Resort te invita a disfrutar estas fiestas = patrias

hosped=E1ndote en lujoso hotel Sheraton Buganvilias de = Puerto Vallarta.

 

Aprovecha esta oportunidad y al reservar el d=EDa de hoy = ll=E9vate regalos adicionales,

una = cuponera con valor de 100 d=F3lares en descuento entre otros grandes = regalos.

 

** Un a=F1o = de vigencia a partir de su compra. No aplica semana santa, navidad y = a=F1o nuevo**

 

 

Franco Aros

Ejecutivo de operaciones Call = Center

= T=   +52 (322) 226 0404       Ext. = 6949 

E-m= ail&nb= sp;ejecut= ivo7@buganviliasclub.com.mx

BUGANVILIAS RESORT VACATION CLUB, PUERTO VALLARTA, = MEXICO

= Blvd. Francisco Medina Ascencio 999, Zona Hotelera Las Glorias, Puerto = Vallarta, Jalisco. MX. 48333

= www.buganviliasclub.com= | htt= ps://www.facebook.com/BuganviliasVallartaMX= | htt= ps://twitter.com/buganviliasclub=

Respetamos su = privacidad, en caso de que no quiera recibir este tipo de informaci=F3n = y promociones por favor de enviar la palabra "baja" = para ser eliminado, agradecemos su comprensi=F3n, pues de ninguna manera = es nuestra intenci=F3n molestarle, si no brindarle opciones para = vacacionar .

 

------=_NextPart_001_0508_01D2004A.C1716620-- ------=_NextPart_000_0507_01D2004A.C1716620 Content-Type: image/jpeg; name="image003.jpg" Content-Transfer-Encoding: base64 Content-ID: /9j/4AAQSkZJRgABAQEAYABgAAD/4QBaRXhpZgAATU0AKgAAAAgABQMBAAUAAAABAAAASgMDAAEA AAABAAAAAFEQAAEAAAABAQAAAFERAAQAAAABAAAAAFESAAQAAAABAAAAAAAAAAAAAYagAACxj//b AEMAAgEBAgEBAgICAgICAgIDBQMDAwMDBgQEAwUHBgcHBwYHBwgJCwkICAoIBwcKDQoKCwwMDAwH CQ4PDQwOCwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIA7QCVgMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA AAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU MoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG BwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS 8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri 4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APwvooor6w+fCiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAor2X9oL/gn18Zv2VfhN4P8dfELwDq3hfwp4+ij m0LULqSFlvA8InQFEdniYxsG2SqrcHjIOK/7QH7EPxB/Zm+Cvws8f+K7GwtfDXxk0+41PwzNBeJP JcwweT5vmIvMZH2iLhuu72rNVYvZl8sux5FRRRWhAUUUUAFFFFABRRRQAUUUUAFFeu+I/wBiD4ge Ff2LtA+P15YWK/DfxN4hfwxY3i3qNcNfIk7lGh++q7beU7uny+4ryKkpKWw2mtwooopiCiiigAor 074w/sZ/FD4AfCHwJ488Y+DtT0Lwf8S7Zrzw1qkzRvDqkSqjbhsYsmVkVlEgUspyoIBNeY0lJPVD aa3CivT/ANqD9jP4ofsW+ItF0n4o+DdU8H3/AIi0yPWNOivGjf7VauzKHDRsyggqQUJDrxuUZGb/ AIA/Yf8AiB8TP2QPHnxz0iwsJvh98NtQtNN1y5e9jS4gmuZYYogkJO5wXuIgSvTdnsajnja9x8ut rHkNFFa3gHwVf/EnxzovhzSkjk1PX7+DTbNHcIrTTSLGgLHgDcw5PStG+pJk0V6P+1r+yr4x/Yk/ aF8Q/DDx/Z2lh4u8Lm3F/BbXKXMSefbxXMZWRflbMU0Z46Zx2rzilFpq8RtNOzCiiuv+AXwH8Wft PfGTw94A8D6RJrnizxTdiy02xSRIzPIQWOXchVUKrMWYgAKSTgUNpasSV9EchRX2j8e/+CBH7Snw Gk1jb4Y0PxpD4c0i51rWZfC+t2+oDSILc/vRMm5ZBJgEiMKWYK20Ha2Pi6phUjLWLuVKEo/Egoor S8JeD9X8e+ILfSNB0vUda1W8LC3srC2e5uJyqlm2xoCzYUMTgcAE1ZKRm0VJdWsthdSQTxyQzwuU kjdSrIwOCCDyCD1FR0AFFFFABRRRQAUVraJ4D1zxNoeqanpujarqGm6GiS6ld21pJNBp6uSEaZ1B WMMQQCxGcGsmgAor07U/2M/ihov7LGmfGy68HanF8LNX1NtHtPEO6NreW6UupTaG8xRuidd7KELL tDbuK8xpKSew2mtwooopiCiiigAoor6L/ZU/4JKftFftu/D1vFnwu+F+r+K/DaXMlodQju7S1gaa PbvQGeVNxG9emevscTKcYq8nYai27JHzpRXrX7V37Cvxe/YZ8S2Ok/FjwBr3gq71ONpLJ72NXt7w KcN5U8bNFIVOMhWJG5SQAwz5LThNSV0DTTswooopiCitbwl4F1zx/d3VvoOjarrc9lbPe3MdhaSX L28CY3yuEBKouRljgDIyeayaV0AUUV6bb/sc/Eq8/Zan+NcXha5l+F9rqv8AYk2vJcwNFDefL+5a MP5qn505KY+Yc80OSW40m9jzKivSfhJ+yH8R/jp8H/Hnj7wp4WvNX8H/AAxghufE2ppNDFHpcc3m eWSHdWkz5b5EYYjAyBkZ8260Jp6IVn1CivpfRf8Agkr8aNcvPgPBb6Ro5f8AaQhuZ/BBOqRBbxbd I3l845/ckLNH9/rn2rwv4v8Awr1j4FfFrxT4J8RQR2/iDwdq93oeqQxyCVIrq2meCZQ44YB0YAjg 4qI1Yt2TKcGt0c5RRVnR9Iu/EGrWun2FrcXt9ezJb29vbxmWW4kdgqoiqCWZiQAAMkkCtCStRV3x F4b1Hwdrlzpmr2F7pepWUhiubS7geCe3cdVdGAZT7EVSoCwZor698a/8EF/2vfh58OdQ8Vat8DvF EGjaXate3TRXNncXEUSjLN9njmaY4AJICEgDOK+QqiNSMvhdxuLW6sFFFFWIKKKKACiiigAooooA 9N/YztPh/f8A7VHgS3+KeleJNc8AXerRQazp+gIz6leRPlVjhVWVmYuU4Q7iMhctgH3D4c/sseAP 2v8A/gs5o/wo+FugeI9D+GfiHxxHp8Gla/50Wp2WmwMHvllG5pUdYobkgMwcYUMVIJHsP/BHD4C/ D79nr9mzxr+3D8VLC98VaR8F/EVvo/g/wtaEINU8RbbeaGaeQ/ciha4t3HB53NhigR+i/wCCIn7Z GgeJP+Crfxe/aT+MfirwX4a1q28Ma/4msBqmqW+mx3erXLokdnaCZgXbyJLhFRdzbQBznniqVHeT j0VvmdMYL3b9X+B9R/teftD2n/BWr9nv/goD8L4QZm+Amv2/jDwCj26OtpZaVCLC9W3A5VHjsrhh 0P8Ap5OPvLXmf7XP7JOp/t2fso/8Ep/hLpWoQaTdeNtB120e+mQutlAkelTTyhRjeyQxyMq5G5gB lc5E3/BHj/gvfr/xz/bL/wCEJ/aB1j4S+Evh1408P6ppt9qx0Sw8PxxyNAZFWa8ARUVxGy4kbazs g5YqK72L9qX4WfBD4M/sC/FW0+K3w01/SP2V7rWfDHjLR7bXYm1+db57bTTdWdgpaS4jjWKW5JU/ NEEdN6tmuO04SUUrW2+7/M3bjJXb/q6OG/Zs/wCCeH7Av7Qn7cvjD9m/QvD/AMedS8QeALbUxqPi y8161t4L2fTj5VyIolj6eZkKSig7c4xjPxt/wVN/Yf8Ahf8Asv8A7Mf7Mfjz4a/8JUI/jLoGpavf f25dRyzFYZrcW5KRqFjfy5jvCkruHHHX9Lv+CZH7K/wW8I/8FdviX8Uvhv8AtH+BfiVH460fxJqu leF9Isbh9Rs4LtxPJ9pk/wBXEsJcICxDSZGFXkD53+Lf7Pvgj/gqv/wSq/ZUk8KfHn4L+AtY+BWh Xeh+MtN8a6+ulz6cs0kIEwQB3IzasUG0CQSLtbcCtaQq2mnd20ve/VMUoXjayv8A8MaPw/8A+CFX wT8c/wDBTr4S/BtpfF1r4a8ffAO2+IF5MupK9zBq80k8ZkRimPKHlqfLIPOecHjifgt+wb+xt/wU H/Zi+N+lfAbT/jRpvxP+DHhWfxRY654mvbVbfxWsCOSrQIxSESum0L8hQPGxY4da+wvhl+2X8DNA /wCC6HwL8T2fxo+G154B0D9my08OyeJrjXbawsRdpd3RFvMZpB9nuShRzbylZU3gMoNfBn/Buj8e fA/wPk/aeXxr4y8K+Dz4h+Fd9p+l/wBtarBYDUrk52wQmVl8yU5GEXLHsKSlU5XK7ukvzBKPMlZa 3N/9hz4A/sYftPReAfCE3wA/atubnxhPZ6HdePILpJtPsL+by4Zbj90vkrbxzsxJZWKoMspI2j5v 8SfsR+C/2cv+Cy8PwD8dajqOteAdO8f2vhq+v4XFtdSWFzNGkcxYAhXWOZGbAIyrYBGBX63/ABu/ aM1HxL+038JPij8Kv2yvg98Kv2StOt9DhfwhF4mS0vraO3KG407+zo4yxd1ARgzr5asS2FTJ/If/ AILY/E3RPiX/AMFYvjP4p8HeIdK17Rb/AF9LnTtX0a/jurW5C28IEkM8TFWAZT8ytwQfStKEpSk1 fRrz0Iqxiop22Z9CfCL/AIIzeFPE/wDwcL+I/wBmXUE1+T4ZeGbq91C9ke9WK/h0v+zRd2zGYLgk vParu28h8kDmtj4nfsX/ALHX/BPX4GfD/wAcfF3RPil8Ubn46T6hrPhjStB1uKxg0Hw/HcgWszyF Uae4kglibJIRyGACAbm+lPi7/wAFIvg7dfsY+K/2utJ8e+GD+0r8S/g/ZfCyfwtb6nb/ANsaZqZu JYb7Uvs2/wA1EKpFIjlCNsEXOH5n+AH7ZPxL/ar/AOCbv7P+h/sx/tQ/DL4M+Ovhj4e/4Rnxr4R8 YX1jYzXi24jigvoWngnZ0wo5Qbf36glWUpWbnUdnstn01LUIK6W+58lftL/sZfsmf8E0P21vFngz 4t6N8ZfiF4J8XaHo3ij4eTeG721t9Qs7S6Fx50N6JCgkfeqKhUA4jJK5ak/4Lf8A7CP7NH7En7Pn ws/4V5pnxC8JfGTxy0WuX/hTxNqsN7daHorwzAfa0iysM7zeSFXceEmB5Wvcv2IfD+m/FD/gqT4w +JX7XX7Sn7O/xB8bfBTw/YL4SkvvF+nWmga7qchuZbVBcrHGjpZSK5lCQu8ck8Lc7Np+MP8AgrN+ zZ4vg8Wav8bfHX7R/wCzV8afFHjrxAILzT/h544/tq/st8Uro/2cwp5VnEkKwqdx2boV53ZrWnJu ok5PT1szOaSg2l/wD7H+Dt18EdL/AODZD4Tah8fLXx1qng/Tfi5eXFppXhN4YrzV7/yNTSK3kllI EMHltNIzj5v3QUctXg//AAUc/YM/Zy+AGifsy/HrwVY/E+P9n741pNNrmgyX1s2uaX9nMW+KCSTc u+RWkHzF1BhY7wHQCj8ZPjd4M1X/AINkvhP4BtfF3hi48dab8Yp9Tu/DkWqQPq1raG11ZRcSWofz UiLSRjeVC5kXn5hn6+/Z0/bN+A3hH4Cf8Ezo/GvjfwFqFn4A1XWW8TafJqdtczeG55LS5jsri8gD F7dUumgkDyKANgbtmsveg3JX3Za5ZaO2yPL/AIQ/8E0f2YP+Cg3w88eaB8P/AIOftH/A3xx4X8IX fijRte8Wu0+j6u9uq4t5S67cuZFbCBSVDsD8u0854u/YM/ZT/YF/YU+Cfj34v/Df46/FfVPjH4Tt PFF3rvh7UI7LRvDrXMMTpZhwAqyKZlGJC5ZgTnBCD7J+AXx78afAP9pL4uX/AMf/ANuL4M+MPBni 3wxra+EPC9j41iuo5TPmS3ncFY4bbbCuyNC7GQykJu25Pz3/AMEcNJ/aI+BHhD4da7Yfti/s7QfA JjZ6p4m8Ka743ivm0fT5ESa70+S1uYN1ncpGzKY45I1WXncVJZpU52fvaadXr8x2jdafh+h8O/8A BLf9nH4J/tlf8FWdK+GXiCHxfB8KPG+o6rZ6B5t7HBq9rGIp5rAXEkatGZSsccb7VKl3OOOa9F/4 Jzf8EtfBPxX/AGsv2n/D/wAWRrieAv2dPDuv3moXNtfLZXMd5Y3RihV32sOUguSRtxlPoK8f/bU/ aT8J/Dv/AIK5eMPir8BvsNl4Z8O+OU17ww1nH5NnK9vLHIZI0GMQSTJIwUADZIBgA4r9Ef8Agq/+ 2b8C/AH7FPxm8ZfBXx74c13x3+2xqeh3Wt6Rpup29xqPhLTrexjkure7iRi8LyTmdGV0Uk3Tj+Dj pqSndct/eS+X9IzhGFnfo/vNT4If8Ehfhd+1f+yZ+zbonijxN8WNU8TfEX4P+JPEnh20n8TyXOn6 XqtgdKWKG0tpFZIo2W8cmNcBhAoyMDPwT+wZ+wb4F+MP/BNT9qb45fENdVhT4XWOn2PhGW0vxbxS 6tctImyVSreYoeSz+XjPmEAjqPrX4h/8FLvCf7K3wp/4Jf8AjTwv4w8O+INR+FGl6vbeNdI0rVIb u90qzul0yC4guYY2Z4ZHg+0bFkUEtHkA7TWB/wAFw/jb8HP2dv2ObX4D/AT4geFfHmn/ABV+I2r/ ABQ8VXvh3VLa/gtIpJSLLT5WhdtpVTF8hCkfZFOPm5ypupfl11f3Wev4FSUN+3+SsetftB/8EY/h v4w/atGvfEf4gfFnUvhB8KPgJpfxI8Sm9119X1m4lluNSAsbSWdW8m3KWTnYOQchSu/cuBe+MfgJ 43/4Nwv2ubz4AeD/AB54I8Pr4k8OR6jYeJtTiv3e4Gq6ViSJ1JYKUIBVmPI4xX0T8Sf20fgh8dv2 ifGPwaX4v/DvT7L43fsw6N4PsvFC61a3ekaXrUF1rCCyuJo5Csc22/V/LYhsIBwWQN8iaz8NvA37 An/BCL9qX4Ja38dPgv4z+KviTXPD+rx6F4V8RLfMI01WwXy4ndUNxKqW0skiRKxhQKXxuFYxcnZO +6LkkrtW2ZU+Kv7B37FX/BMvUvhT8Mf2gdO+Kvjf4nfEPQrHXdf1nR9Wh0/TPCSXbmFdiNs3pGyS sd5c4j3HAYIPmr9o79gq6/4Jrf8ABaDwz8KH1GfWtL0rxloV7o2pTIqS31jcXNvLEzqpwHXLRscA FomIAUgV9p/t5fs2+Av+C4XxQ+D3x78JfHX4L+EfCNv4R0rRPH2k+KfEkekax4Ya2llluSYmDbv3 crqpLKpMQIcq24fMH/BW7/goJ4I/am/4Lh2nxP0DUVvPh74N1vRLG31WKNnW9tbCWN57lFC7mQye dswCWVVI+9gdFKUm7Xb0d/UznGK1t1Vj2H/grTH8Gbj/AIOGfjvbfGPwL8UfiNbXVpoKaJongi4j huru7/sTTCwl3AyMnlCQgRfNkc8ciX4qf8Eevgd+07+zl4C+Jnwl8O/F/wCBr6l8U9F+G/iDw948 TzGSHULiCEahblxvIU3MZyW2nZINqlct9l+MviJ4E/4b3/a18WfDz9oX4B6T8R/2jfCGgp8KfFEf iy1lfRGsLGG1vbe5mCsLSS4kWFo1G4yLDuA3RlR4F+0d8UtS8Rf8EkfFPwe+J/7Ynwj+Jvxr1j4n 6EYb+LxkLm18M2r3NvGHNzsEjwwFXnmkhiYQhmByy1hGpL3UnbZdfyNHCOra7/1c8A/4Kg/s5/sZ /sFa140+EP8AwqT9o208e6Jp89roPjXUNUgjsdZv1tt0Nx5ThY5bUzPGJDEinbu2gHAPI/8ABsBq XgOy/wCCtXgaHxVp3iG88SXUd2nhK40+aNLWyvRaTmV7tWOWjNsJlAXJDleMcj7w+APxA8ffs9/s t/Eu0/bD/ah/Z9+N3wPvvA93Z6Ho1p4nt/Emt6nqJjH2Y2sxgSaViivhmkdtxjcbcM4/MD/ggf8A E3w38G/+CuPwb8S+L/EGieFvDul3t+15qusX8VjZWgbTLtFMk0rKiAuyqNxGSwHU10QblTnFu+m9 9zNpKcXsfcenfBL9n79pfXv25tb+Et58f/A2rfDnwL4j1rxElx4oW0tNf1aJ7+T50t2Pn2jNG4MU uPlboMmvAtH/AGPf2Wv2Bf2Lfgp8Qf2iNA+JfxM8ZfHrT5ddstH8N6pFpdn4e0xHj2SksA8kzpKh ALbGIIG0Lufrf+Cd/wC0P8P/AAO3/BS3+2fHPg7Sf+E88EeJbTwz9t1q2t/+Eiml/tLyorPe4+0O /mJtWLcW3rjORX0l+z/+2V8S/wBqz/gm/wDs+6H+zJ+1B8M/gx46+GXh7/hGfGnhHxhfWNjNeLbr HFBfQtPBOzphRyg2/v1BKspWsm5R0V7adfLuWuWWvX/g9jD+I3/Bvv8As+/sX/Dj4lfGTxdpfxl+ M3gGzvrAeE/CvhmSNNTisLy1t5jc3rIoc+XJLIm5SgCx5ZWLfL5F/wAEUPGv7LGv/wDBcL4eXHwx 8FfFvw/aX+lTp4dtNZ1W1ul0vWxDem4eRlO6S0axACg5kExbOVwRvfD+3/bQ8e/tN+JvE2ift5/s 5t8QtFSHQtQjj+INolvqFtEiTxyC1Fn9luI43uZI/MMZdJFlQ4GN3pvx6/bI+DPgv/guT+x/4r1/ x98MdS8YeEdBl074seNfDEsa+H59VmtLi2QtMgCfLM77nbHlpKm/aEIVJys4t3bT2v27BaN1JK2p 8m/HrWv2I/Ev/BQjxRbRfCj9pXxW5v8AVLbUdD07UrMy6trYvyXki8stL9nMYnO1drZCcYyR6T8V P+CPfwO/ac/Zy8BfEz4S+HPi/wDA19R+Kei/DfxB4e8dp5jJDqFxBCNQty43kKbmM5LbTskG1SuW 9p/ZI+Eel/sZfH39rPQtM+P37P8Aonxj+O9hJqfwq8WWniqCaLS4W1C7klgmuChFrNcJNasEG8t5 RK7vLrF/aO+KWpeIf+CSPij4PfFD9sT4R/E3416x8T9CMN/F4yFza+GbV7m3jDm52CR4YCrzzSQx MIQzA5ZaOeV0oN9Or/IfIrNtd+x4B/wVC/Z0/Y0/YL1rxp8If+FR/tHWvj7RNPnttB8a6hqkEdjr N+ttuhuPKcLHLamZ4xIYkU7d20A4B8b/AOCCX7D/AMKP+Chn7cS/DT4qL40Nre6Pc3+mHQb2G1jM 0C73W5Z43coY87fL2neBk7civ0l+APxC8f8A7P37LXxLtf2w/wBqD9n743/BC/8ABF3Z6Ho1p4nt /Eet6nqJj/0Y2sxgWaVmRXwzSO24xuNuGcfHX/BpHGrf8FcLbgZHg/VSM9v9R/8AXrRVJKlPXVdb mbgueOm/Qk+HP7Cf7J3/AAU4/Z4+L17+zvp/xd+G/wAUvhB4Zl8VR6T4p1Kz1DTvEdrEuZEDLh0k zHt3bkVWuEJDrwln9hz4B/sYftPxeAfCE3wB/auubnxhPZ6HdePILtJtPsL+by4Zbj90vkrbxzsx JZWKoMspI2jtf2Efhl8N/wDgi58Hvj/8VfFPx/8Agb8Q/E/jDwBe+EfA+i+BPFP9q6hqLXcgPmyx BQ8CebBBksh8vZLkgja31V8bv2i9R8UftNfCT4o/Cv8AbK+Dvwp/ZJ06DQ4X8Hx+JltL+2jtyhuN O/s6OPcXdQEYM6+WrEsAqc5zqSu1Fu3R3ZpCC0ulf5HBfsHfs8fAr9hj4If8FB/hR4utPiH4mX4e Qx23jC/0+4t4W1rQWM8lilqpIEd2EaXzS2EJZdp9Pln9lz/gn1+yH+0h+yD+0F8eNc1T4veAvhf8 MvGFhb6YYmt73Whps8dvH9kaIB4mnkuZ1RZSSqBlLcBjX0b4R+Lvw0/aR/bY/wCCknw70r4s/DbT L347aPY2ngrWNR16GPRNZlhglDrHeKWjbDSoMIWbG8hW2Nj5x+H134T/AGWf+CGv7afwU1z4mfC/ VvHreNNAXTbPRfE1td/2+kV9pckstiuVkuY0VJNzIhC+VJnG0048193d2/G1yXa2ysriftzfAL4L W/8AwRy8EfF34U6r8cLH4ca78XxoVn4X8ReIhJFbWK2d7JNILNWkto7sy27lZFLfLIc5yceg/scf sMfsZ/8ABQfx5ovw48N/A/8Aar+HknjC1uDonxA1WVbiwVo4ZJ45JsKYNsix7RtBBZlUEbt45X4R /tJ/CTw9/wAESP2VfDXi/wAS+EdUl8L/ALSFh4g8V+FWv4LnUk0RG1A3Es1kGMvkNG4XcU2nzFGf mGfvLRP2kPE3gv8A4Ks6d8T/ABT+3J8Fbf8AZi13UJbjw94UtfGkTNd2z2pigt5LdUWOCOKVtzyy SbVMQB+ZsBSlON0m+vV/0xpRdm7dD4S+G/8AwTA/Z9/Y/wD+Cdml/G344eCvi/8AGXUte8Ua14eu LTwZdC007w1Hpl/d2jTzuAHQSG1Zt0jlcOoCrgs35/8Aj/wT4G+Pf7Ytp4a+CGneJ9F8IeMdX07S vD9n4nniuNQtJrkQROkrwja6C5eTYQN3l7M/Nmv0n/Yg0H9o60+Jfjfxt8Av2wPgD4N8H+IfG2r6 hd+FvEHjeKQWkY1S5QTT6fLbyxos8aeYskJzLE8ZD5GF8N/4K9ftTfCHS/8Agt/o3xR+FLaDrvhr whqegavrN34cWP8As/W9RtJY57qS2KkI4YKiFgcM6sdxzuO9KcuZpu7/AC+RnUjGyex7xb/8E3/2 IdE/b2tf2Mrqw+MuqfE+4T+y7j4jR6tbpZ2+rPZfagqWQXaYVzs5BYH5SW5krh9E/wCCYf7NP7Kn /BO3TvjR+0F/wszV9a0H4l618Pr/AEjwjdwJF4gu7Wa6jiTdLj7PEq2czs6tuIAA5Ir7O/a4/aM/ aO+P/wAUdZ+JX7Nv7dnwB0f4JazBDfWNh4i1vS9NvPDbeSnnWtwktnI6lW+f96wcCQAqMAn4R/a8 /aT0L4kf8G83gvwzqnxD8I+Jfiq/x31HxBrmnWmrW0upTJLFrBkvzbIRIsEkkykSeWqHzUxjcBWM HN297e19dev3Fy5FfT0/A4b/AILEfsB/CX4F/An4DfHX4DReLbD4a/G/TbqQ6T4iuY57vRrq38rC bgSxDh5M/M4BhY7sOor6S/Z++HnxH+J//Bq8NN+Feh+Ntf8AFY+K0ky2vhWzubrUfJGBIwS2BkKD I3EDAyM147/wUq+PHgf4gf8ABDb9jDwloXjHwtrPivwqdRGtaNY6rBPqOk7iQv2i3VjJDu7b1Ge2 a6b4T/tuwfAX/g2qj0DwL8XYvBfxch+Jz3Uem6D4qGneI0snGHkEUMq3IhYcFsbT61cueVOKe/N1 JTipt7aH0/8ADT9kq/8AjR/wTI/Y/wDgZ+1Nb+MrPxb45+MF2+m6Zql41r4htNHSw1BnD+erTRxh niyhClTLb5wAFPwt/wAE4f8Agmp8Nv2oP+C2XjP4A+Kf+EgbwFoWq+JbG1NpfCG+2WEsyQFpdhBO EXd8vJ7CvN/+Can7cupab/wVb+C3xO+NvxC8T+ILHQdcihvdd8RatcalLY28iSRhnkmdnESPLubn AG44Nfpt+xl+zV8Lv2Ev+C2HiH4/eMP2o/2eW8FfETUdd1HwtBa+KYpby8j1ITXKtctxBaxIhZRM 8pSRwiL80iilLmpcyvur6d79Bx5Z2dtmfGWj/se/stfsDfsW/BT4g/tEaB8TPiZ40+PenS67Y6P4 c1WLTLPw/piPHslJIDyTOkqMAWKEggbdu5/ctL/4N/Pgb4d/aW/aI0TxT4x8Y2Hwz8F/DTTvih4Z 16MLNqGlaZN9okn+0QKmLh40tZlCgKWAU4ycV6b8AP2yviZ+1Z/wTf8A2ftE/Zi/ah+GfwZ8dfDH w9/wjXjTwj4wvrGwmu1txHFBfQtPBOzphRyg2fv1BKspSvPfgn+1Rr3h65/bs039oj9ob4S/EDx/ qvwLuPDeiavpXiTT2s9YlNpqLR6dZsiQLPcLJOVMcaFw8m3k4qHKo7u+v/B7FJQ000Ok/wCCEfiH 9kA/tr/FOy+DmgfG7ZbfCu8X+0PE91ZLJeWsbqNSYxwuVWSUmzaIgADbLlU4B8B+Bf7Df7HXxX+D /wAYP2o7jT/jNpv7Pfwr+waNZ+Erm9tRreua1MUV0aePcFt83Frjaytl3JYKm1vO/wDg2x+Mfgv4 Tft7+I7Xxv4t0LwVY+Nvh9rHhiw1PWLlbayW9uGt2jSSViFTIifBYgEgKPmYA/QH7MXwK8N+FP2D v2hv2FPFPxp+Cek/E7xTq2leM/DeuReJUuPDeoyq1sXsGvdoEdyBZKChXcPtCkBwGAuonCbs30+7 qKDUktF1+/ofPn7d/wCwv8EfHP8AwTy8PftUfs123jHw/wCEY/Ez+DPFfhTxFexX1xo92E8yK4SZ WJ2sDECjFiftETAKAa9J/wCCUJT9pf8A4IVfts/BRVu21LwvFZ/EnTkiAdpjAI5Zgi+uNMjRu5Ew xyKh/bOvfCX/AATn/wCCJVn+y6PiD4C+IPxX+IPxBbxj4lh8I6yuq2OgWscMKRq8yqAJGFvaYQhT 80hGVALeMf8ABvt+2FoH7H3/AAUi0Gbxnfafp3w/+IWm3fg3xLcahcC3s4LW7VSkkzkhVjE8UO5m ICoXJIxmrXNKk2tbO6+RGiqJPqtT6F/Y/wBZ8H/sof8ABub4h1X4mJ4j/wCEb/aF+LVnpNxD4anj h1e80axMMtwInlGxSXs7uM7sqRIFJG843vg//wAE0f2Yf+Cg3w68e6B8P/g7+0f8DfHHhjwhd+KN F17xa7TaPq726ri3lLrty5kVsIFJUOwPy7T6J8R/2wf2dP2dP+Cm/wCxN8HNH8a+FvFvwB/Z60y7 lv8AxBBqFvf6NNrOoW8/lXcrws0JaC5FvMZMny2mk6EMT7F8Avj54z+Af7Sfxcv/AI//ALcXwZ8Y eDfFnhfW18IeF7LxtDdRymfMlvO4Kxw222FdkaF2MhlITdtyedykryV03r1/I1jGL0ettDlfhl/y G/8AgjV/2DvEH/pJp1fDnjC1/Z/1b/gqL+1XZ/Fv4UfGr4s+JJPip4hk0fTPA10kUMVsuqXgmknV R5xYOY8FTtwTnB6/XvwN/aA+FPiD4I/8E2PiVN8YPhdo+nfs+z3uieMdH1PX47bW7Oe/azs43WzI 3mKN4WkkkbaqQkS5KZYdhpFzbeFPCv7Wvgz4K/tKfADwT8dfid8W7v4kaZ4ntvGdvHFe+GLuZpYr Fr1UbbcQkXDyQqG8sTA7tsm6hNxb/wCG6g43/ryR4HrP/BFT4EfFD4v/ALJ/jDwho/xV8GfDf49e JL/w54g8GeKpBb61o01tFOymOQruVXMDt8+/KmMgjcVXl/BPwj/Ye/ZC/wCCnnw2+GGiP8ePHnj7 wf8AFeLSNW1eUWdlpVtexXRgt7eFSyyOkF8sHmMyfvESUozAotfV2jfti+DtBsP2IdN+Iv7UPwv+ K/jbwH8TtTuvGfiSHxRA9vYo9lebGeWZkP2ZPNjhW4ZVjkKjaea/KL4qfGfwvon/AAXW8SfEM65p 934KtPjxdeIjrFlKLu1m09fEL3H2mJ4twljMQ3qyZDAgjORWlJTndNvRP8yJ8sbNJb/5H1//AMFl /EX7Hl3/AMFX/FFl4o8DfHzWPGEHiKaPxhHol/YpBrcz2SC1jsg251HmmEMNoYjdjJwDkfFz/gmv +z3+0t+wP8Zvib8Kvhj8d/gV4w+CljbavLp/jndLYeI7WV2DrG0gLb0WJ/uldpaPIYNlfqrQfD/w 1+BH/BcD4h/H3Vvjj8Abnw/8cvD2p2fw31mHxPb3k3h7V5bazEN7crgpbxhYrmIS7yCZAvBfFcdq Pxq8XfBv/gnx+1t4G/aI/bE+Ffxb8e+JfB4h8N+HNM8YJqbWpUyeYEd0iVp5TIg+zxhnCxBiACKi M5JRUW9LdX89CnFNtvzPK/8AghT8RPHP7I3gvxb+2X8cPiZ4ktvhDYabd6DpGk6lrU93dePtUI2J bwQu7bhGyMN7D5WBPCJIw/IvxHq//CReIb/UPstnY/briS4+zWkXlW9vvYtsjTJ2oucKOwAFfXH7 VXg+9sf+CUH7PV3P+0d4O8d6Zp2o6lHpnwu0+K1TUfBBvHkuLmW4eOQzybpUXidBs88eWdrnPx1X fh4K8p9/0OapN2UQooorpMQooooAKKKKACiiigD64/4J3/8ABX7xj+wD8MvF/wAPJfBngH4p/C7x xcLfap4U8Xab9rsmulRV89MEDcRHEGDh1/dIQFYbq8y/bf8A2xbL9sn4g6Zq+m/Cb4UfCHT9Hs/s VvpfgXQ10yG4Xdu8y5IJM82eN5A+XAx3rxSml/SslTgpcyWpftJcvL0HVt/DXxqfhr8RtA8RrpWi a6dA1K31IabrNoLzTtQ8mVZPIuYSQJYH27XQkblZh3rAyfU0ZPqauT6E3P0Hn/4OANc8C/DXXtL+ E37P37PnwV8TeK9Ik0XVvFHhLw41vqX2eRMSLbsZD5ILfMAxkxtU8soYfn5TPNHt+dIXz3FZwpxh 8KKlOUiSiosj1FGR6itLkEtFRZHqKMj1FFwJaKjDehoyfU0XAkopgcinKcindALRRRTAKKKKLAFF FFABRRRQAUUUUAFFFFABRRRRYLhRRRRYAooooAKKKKLAFFFFABXuv/BO3/goJ41/4JmftFJ8TfAe m+GNV16PTbjSxb69bT3FmYptu4lYZon3DYMHfjrwa8KoqJwUlZlJtO6CiiiqsSFFFFMAooooAKKK KACiiiiwBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRRYAooooAKKKKLAFFFFABRRRQAUUUUAFF FFABRRSOcD60nsA1zk/SmsdlBbaOOte4f8E2/wBi9/8Agof+2v4I+DcXiRPCL+M3vEGrtYG+Fn9n sri6/wBSJI9+7yNv3xjdnnGDnOairsuEXJ2R4azc9aaZB+Vfu8f+DIu+Y/8AJylp/wCEE3/yxpp/ 4MiL8n/k5S0/8IFv/ljXG8bS7nQsNPsfhEZOaN/+cV+7n/EERe/9HK2n/hAt/wDLGl/4gir/AP6O VtP/AAgm/wDljS+u0+/5lfV5dj8I/OPr+lHnH1/Sv3c/4gidQ/6OUtP/AAgm/wDljR/xBE6h/wBH KWn/AIQTf/LGl9bp9xfVpdj8I/OPr+lHnGv3bP8AwZD34/5uUtf/AAgW/wDljQP+DIe+z/ycra/+ EC3/AMsaPrdPuH1aXY/CMSUqvn61+7n/ABBEX/8A0ctaf+EG3/ywpR/wZF34P/Jylr/4QTf/ACwp rG0+/wCYPDT7H4Sq/rTq/V3/AIKc/wDBrpdf8E3P2KPF/wAY5fjbB4wTwo9ih0hfCTWBuvtN7Ba5 877ZJt2+du+4c7ccZyPygVscV00q0Zq8TCpTcXZkqnIpaYpwafXQtjIKKKKYBRRRQAUUqoW6Amnr aSP0Rj+FAEdFS/YJv+eb/lR9gm/55v8AlQBFRUv2KUf8s2/KmtayKeUYfhQAyineQ/8Adb8qcLWQ /wADflQBHRUv2CU/8s2P4Uv9nzn/AJZNQBDRUx06cf8ALJ/ypGspR1jb8qAIqKkNrIB9xvypvkP/ AHW/KgBtFPFtI3RGP4Uv2OU/8s2/KgCOipfsUv8Azzaj7BN/zzf8qAIqKl+wTf8APN/yoNjMP+Wb flQBFRUv2KX/AJ5tR9il/wCebUARUVL9gm/55v8AlQbGYf8ALJ/yoAioqX7FKP8Alm35UGylx/q2 oAiop5t3XqjD8KQ27n+E/lQA2ipPssg/gb8qT7NJ/cagBlFSrYzN0jY/hS/2fP8A88n/ACoAhoqU 2M2f9W35UfY5R/yzb8qAIqKkNpL/AHG/Kk+zSf3GoAZRUgspT0jb8qX7DMP+WbflQBFRUv2KX/nm 1AsZm6RsaAIqKlNhMvWN/wAqY8Dp1Uj8KAG0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUx/vGn0x/ vGk9gI3PP0r7m/4NpWx/wW8+BvvPrH/pkv6+GJDgk19y/wDBtIc/8Fvfgb/131j/ANMmoVyYh+5L 0Oij8SP676KKK+fPYCiioLq5js7Z5ZnWOKJSzuxAVQBkkk9AKBpX0Q9+c+mK4r4c/tA+E/ir4z8S 6BoerwXuqeFLlLbUIAw3IWQMrL/eQ5K7hxuRh1FfHf7X/wC3hqHxG1C68OeDbuaw8OREwzX0LFJ9 T7Ha3VIvp8zdeBxX5+fET4oeIfgz+0SviHwrrF5oWs2MEJiubZ9pI28o69HQ91YEGvVwuVyqp8zs 7aH6xwz4W4jM6E5Vp8lRxvBW63Xxeq7arfyP39YZ9OKXr9a+T/8Agm1/wUk079snw4+ia4ltpXj/ AEmISXdrGf3WoRcD7RADztzjcnJUkdQQa+ryuT6V59ajOlNwmrNH5xnGT4rLMVPB4yHLOP49mn1T 6Mf0oo60N0NZHmn5+f8AB0L/AMoRfi//ANd9D/8AT3Y1/JYnSv60v+Dojj/giJ8YP+u+h/8Ap7sa /krj6ivVy9+58zzsV8ROpyKkT7oqJOlSp90V6sTgloLRRRVAFHWinRjMi/WgDr/h74EufFmpW9tb QyXE1w6xxxxqWaRicAADkkk4wK+1/Af/AARA+PmvaZDcv8HvH8Ec6h1E+izwtg+qsoI/EV53/wAE wfFFr8J/2lvAHjK505NUh8K69Y6u9oTg3CwTpKVBPAY7eCehxwelf0f/ABO+Nt14P/4KReJ/CXiP 4qaj4T8B2/w1tvFccM15ZWkVpdtqNzbSMkkkW4oI4UOws2GJPcCvPxWInCXLFHpYDL/rF9dlf8j8 HNJ/4Il/GfXZ7yG0+FfjeSawk8q4B0adPKfaG2ncoGcFTj0YHoRUen/8EQPjnqF1cxQ/CPx6GtX8 uTfos6KDjPBZQG4x0z1Fftd4z+Nvxqh/4Jt6B4u1rxXr/hrxfL41sNLstUgs7SC71fR7vWIbSC4u bd4DHHNJbSb9ojQhipKrkpX0h+0zpevS+A9HTQPHHijwxe6L4i0TT7y6tVtpn1W2ur+0gmSTzYmA YxzNh1ClWweRxXL9dqLsejVyWNNpSktW1pdq6tr+J/N3of8AwRL+N3irV7+w0/4VeNZLvTGEd0ku lSwCFioYKWkCjJVlYDOSGB6EGuF+Nv8AwSm+KfwHsxd+Lfh54q8O2PneQt5e6ZLHbO/OFWXbsYnB xg84r+kr4B/F7W/2v/jF8VPs2ua3YeBPhX4gfwPaWWmTJBd6xqNtHE15d3FwQHwjSrGkaMq/LIzb yyBOw8G/APxHq8Hjnwv8Rtbm8ZeER4gsNV8N3WpRWzTLZwm3uPskwjVd/lzxOvmONzxsu4sQxJ9e mn7yMauUqF05WaSdvW2nrrqfzDeIf+CRnxh8IxeHW1L4Z+MrQ+K2Eejo2kzGTUHILCONQpJcqCwT G4jnGOa6LXv+CM/xl8ESWEesfC/xvYvqUy21qH0ac/aJWztjUhTlzg4XqccCv6Gv2U/2nfEXjv8A bE8d+EvGUcMuna/ptr8QPhyQgO3SGU2MkakqNsoKxTMNxI+3uOF68sn7Rfjr9kH9r7xDF4+8UX3i r4HeIvEFt4XsNTv7aBbjwTqcljaXMIuZYkQNaXD3LxCRx+7dIgzDcWavr1S9rG6yKTm6akuZJNLv tovNdu6Z+Hlv/wAEIfjq9qZP+FUeMgBjg6a6tz7EZqGx/wCCHnxuvL2a3T4T+OQ9uQJC+izqvPox UBvwJr94P2jfh58Xh8PPjre+Bfit40i8T+G4Yr/wnaBLCWKPZYxzvasr2+JPNcSKGdiV3Jhhg57F vihcftJfsu/CfVvAvi7xJoWofER9Pmsr62aCS5SBlFzfecJYmQslvFcJkoAJSgH3gDP16dr6EvJ4 qCnzJpuz300T1023+5n8/N7/AMEK/jjaQ5/4VP40Y5C4TSpGOScdgeMnr6c9K4n4p/8ABHj4yfC3 Rv7R1r4W+NtPsN4jNw+jzmJWZgqhmCkKWYgDPUnAr+hz4U614vvv+CjnxJ8AXfj3xXe+FfD3g3S9 UsbOZ7bdDcXb3UUj+YsIdsCJWUMxAbJ5HFUf2Nfjv4m079n3xf4p8Xa9rvjy7tviFqvhy0jvRbRi 2trTUpLaHaIokG4JHuLEElvQdH9cqLXTp+IV8lVODnzLRRf/AIErr8D+fG8/4IkfH+DSDet8GfiG Ilj8wj+wrgyAYz9wLuz7YyK5PSf+CVnxR1z4Xah41tfAPiibwrpUjx3eqLp0n2eAoSHy2OiEEMei ngkGv6S/Cnjzxe//AAVh8U+CJvGHiC88HaZ4DtvE9tozi3EK3c19PCw3iISGMIgCqX4PUmq37QX7 ResfB/8Aa++HtjFbWSfBvUNWm8CeJYUhUodb1SJbu2lkTaR5YYRRliQC2oSZyQMix1TawLI25qEZ Jtx5vwul69Ldz+dn4Jf8Ehfiz+0BpM1/4O+H/iPX7G3bY91b2beQG7qJGwpYdwDkelWdV/4JA/GH QPE2n6PefCzx3bapqpcWds+hXIku9n3/ACxs+faOTjOBg9K/oG+OXx58O/shftC+Bvhr4r1vUvhf 8Hj4RCaHrNs62Wn32rid0kt7m6CkxPHbokq5ZUkM8hfcVXHtvwBvvEmhfD+2j8V+KIvHMus69dQa Pr0AtkNzpsiySWrg26iPeI0CsyhQzBmAAIFEsdUWtjKeTunSVWT0e3n6PbTqrn83Mf8AwQv+Otvb NLN8I/HASMbm26RKzY9gASfwFHhX/giX8Y/GWmfbNN+GPjK6tS7RiUaTKqsykqwBKjOCCDjoQR1F fs3J+0H430z4E/tPas/xX8SQ+LPhv411bRPBNsY7KWW9eGys5rKx+zm3JuDLcTNFwpdg/ByAR3H7 U3x3+IPgT4Sfsx+JPEXia7+Gus+N/FGjaJ43soZLeKztludPuri6jLTI/llJoQoYP8oyCW60/rdX yOp5Dqlzb6de1/1Pw01//giH8ZfDNilxffDDxnBE8iQq39kTON7sFVflU8liAPUkAckVPr3/AAQk +N+gacl1P8LPGDxSJv8A3OmSTsoxn5lQMy/iB+hr957n4va5qPhH4weNvhB491L4nxeBdD1DR4NE mFveW0uvw2tvfQvbSwxqZgY7kRum8jem1Ru3Vz/wA/aV0/452vgXxR8OPjTf+IY/D5Nz8SfDuryW x1L7Otlcbne1aNZLWVLtUysKpGw3AAhVqfrlS17Gccibi5p6LfR6O11ft210Pwk8H/8ABEX40fED w2usaN8MPFl9pjqXjnWwZFmA7oGwXHB+6DzxUXg3/gi38X/GzXg074ZeM7g2Extrn/iTzp5Eq/ej bcow44yvUZGRyK/oE/ZQ8d+Iv2tvgVoPxE8TeK/E3ha++JktzceG9L0aWKCDQbJTKbbO5GE8zRIs jtNvQu4UIEGD5J8Wf22vH+sf8E//AIi60PEF14Z+J3wd8fW/gfV9Q062jhttVP8Aa9lam7EMqSKq TWlyHAH3XY4IAAoWLqPSxUMhc6rpRaumk/Jt2+6+jPxo1X/giP8AGPQLu0t7v4X+NUmvn8uBV0ad /NbBO0FVIzgE49AT0FWrj/ghR8ckzj4TeNG+mlyH+lfu7qnxM+INh+3JofgXwH4uvfGXhPV/Cupz eJHvVguIfCV7Gq/YJhcwxBlkmkfaYZGbKIXVBgk4vijUfH3w/wD2zvgB8N3+K/izWtL8Y+GtavNe u9tkjapc2kNs0c0eyDEaFpHO1OMEDnGaPrlTyCORpytzLVOXySbd+z0PwbH/AARV+N9z4kudLi+E vjtr20iS4lj/ALFnwsbkhG3FdpBKuBg8lG/unEKf8ERvjvPq89mvwg+IHnQIHbdodwEwemHK7T36 HsfQ1/RL4j0fxvdfs2618ONG+MVxqHxms7PVtX0nXLZbJrmSNbuVrGO6i8ryseVNbQviNcmN2UjG ax/ht8dNT/aa/wCCevw61/w94p8Q6H4y8cLaaZFdwPBJe22pmRo75XWWLY4tvKu5GUxj5LY4A6Uf Xqm+hksojKPPGSaTtfXTs/R2fnofzr2//BGD436p40u/D8Hwp8cnV7O2+2S2raPNGyw5IEmWUAqS CAQTuIIGSMVwPhT/AIJ/+L/Ffjc+G9N8Ma5qHiDzmtv7Mt7CWW7EqnayGIAsGByCMZB61/T3/wAF CPij47+B/wCzusXw1mn1bxnotsfElw90Q11faXpckU94nyoQ0k+6ODATGLhyoGAK5P4xfFXQvBOn eBvFvwhstMt/G/7Uut6ZYWniF7RHawsZLQTzXW0jazpbws4jYENM6lwwUimsdNq9hQySU4xnF6Nt elle77K1/uZ+Beuf8ENfj/4e05Li5+D3jlo3UsPI0qS4ZQBk5WMMRx6gVxui/wDBKr4m678MtQ8Z 2vgLxNN4W0uR47vU106Q28BQkPlsdEIIY9FIwSK/puu/A/i5fHXhafwR4+8TahaeHvEKWHjKw1We 3uF1O18hmaRSyBonWRoz+52Ky+YNhwpXhv2gv2jdY+Dv7YHw+sYILJPg1qOrzeBPEsKQqV/tvVIl u7aWRdpGwMIoyxKgtqEm7JAylj6j0shUsnVRpU5J6N/d09X0PwK8Ff8ABEb42eJtEtb+3+FXjWSz vIxLDIdIlUSIRkMAQDgjkHuCCOK6D/hxJ8bWXB+FPjHPUf8AErk/wr9xf+Cjep/Ev9n79m748/E7 SPidrFpc6dHZ3XhXTbOC1NvoUKw2sUgkV4WaR5ZzcyHexAVowuMGk/bUg+I/wQ/ZU+I/xD0D4reJ 4zpPgtNSsLWVbOSWwv49zeaM2+HilRtrK+cGIFSMnAsZUdrW1/4B0UsjjNQamvefKt99NNulz8HL r/gij8ZYvF8Gif8ACr/GY1S7QywwnSJlDou0M+4rt2gsoLZwCwBwTUfib/giL8avC2s2NhffC3xi l1qbmO2SLS5ZxMwBYqGQMMhQWIzkAE9ATX77SfHXxL4y/aC+FXwL0jxNqdreal4Kbx74u15libUp bESx28VvA2zy4zNcOweQJuWOMhNrMHW549+Nuq/AP46fCeC28Q61rPw7+M15ceGnj1F1mvNC1PyH ltbi3n2lisnlyRvHIWAIRk24dWPrlTsZ/wBiO6jzatNpeSv/AJM/np8Vf8EZfjB4Z13T9Kuvhh42 h1HVdws7caNOz3RUZYJhTuKjk46Dk4rF+J//AAR7+Mfwg8Nza14i+GHjPSNHtuZ72fSJhb246Au+ 3agyQMsQM1/QX8Gf2hvHH7PX7TV94H+LPiq68S+BPiJrt3pngPxRd28FvcaZqETOn9kXLxIkZeSN d8EhUF2WReSQB7H8GvBN/qGm+PNE8Y+INa8eafqmuXmjrbasLd4LexMAcQlYootwKMVJbcxJHOMm m8dNdCMRk3sldyTVk01ezv8A5PfzP5p/g3/wRv8AjH8avDEeteGvhp4q1XSZBmK8jsGWCcdzG7YD 9P4c81ut/wAEPPjtdRMY/hB47+Q4IbRpkJ4B4yoz1/zg1++f7MPxivf2nfDes+PNY8Tat4W8FX3i i68JeCtH0Z1s4raC1me2W5ncLueaaWKTCk+VGgjUKTuY8x8S5fjL8LNZ+B2g+IviZ4iXVPFPxKv/ AA/qV3aRaeg1jSAmo3Vo7IICsUphhgVjGEx8wwDgg+u1LtaGkcjXtHSlJKS3WvRXfTpbU/ALw3/w SD+M3jLxNqmlab8KvHd1qGilVv4Bodwj2bMMqsgZRtLDkA8kcjiuo0P/AIIi/Ha81Wa1f4P+P45Y FDMX0SdUwemHK7W/Anoa/oL/AG8Pj3r+g/sg/G/WfCWp6n4R8Q/DS2a6s9StPIke5ljhDfOksbqU PIIIyQBgqRXX/GSy8QS/sxXNjpHjrxXovifR9IttS/4SCFbSW5naVnzvV4mib7j8eWAAVxUvHVLX sYwyqMqcanMkpScevS2vpr0P527j/ghT8c5Lbcvwn8aE8jH9lSA8HHTFfNf7Tf7DnjL9m/XG03xb 4V13wzfYLrBqVjJau6g/eUOBuX/aGQc1/Tr8Z/iJqfwr/b08JeF9Y+Kut+H/AALqXgLVNYvvt17Z W8IubO4s41m854QVJjllZxu28ZAXBr5g/bisvEP7R3/BH/4pa38VozrMnhnxrOfhzr81nEl9qeji +igtbuZY0RU82F5gWCoHURsVJ2ltaeMndc2zKxOTunQ9smrWT69W1+jP5oNd0w6dclSuMHFUK9A+ NuippmsyhBgBjXn9eqndHgBRRRTAKKKKACiiigAooooAKKKKACo26mpKY/3jSewEUv3fxr7k/wCD aP8A5TffAz/r51j/ANMmoV8Ny/c/GvuX/g2j/wCU33wM/wCu+sf+mS/rhxHwP5nVQ+Jep/XfQelF B6V4R6wwHv8AnXzf/wAFLvijdeB/gpb6NZSPBL4ouTayupwfIRd0i5/2vlX6Ma9z+IPxB0b4VeDt R8Q+IdRttL0bSoGuLq6nbakKKOSfU9gBySQACTX5yftAf8FY/hF+0/G/hzV9B8XaJZWtyX0vxEtt HMYDjb5jwBt/lsPvKMtjBxkAV2YLD1Kk1OMW0j7LgvIcZjMbHFUqEqlOm05NK9u3rbeyu/I8nAwP avnX9pD/AJKtdf8AXvD/AOg19LSaQLm0iu9LvLLxBpl04jtr/TJDPBMx6LjAdH6fu3VXHpXiv7Yf wF8bfDvxaNd1zwprml6NfRwwwXk1sRC0m3hCwztY9lbBNfS4WSVS0mf05w3jKFLGqFSSi5JpJuzb utEnrddUef8AwY+LeqfAX4raB4y0ad4L/wAP3iXS7TgSxg4kib1V0LKR6Gv6HPCmvQ+KvDOnanbn MGo20dzGSOSrqGUn8CK/Dv8AZ8/ZFsJdSste+KdxcaN4fiZZ10G3Tfq2sL1CsmQLeFu7yEOR91R9 6v1W/Zs/bn8H/FvXrfwxb2Fz4auY4xFp0Fzs8q5RVwERl4DADhT2HGa8/O0qji6avbdn5p40U6eP q0q2Cg5OmnzzS0tpZX621va9u59BgYFFAOaK+eP58Pz7/wCDor/lCJ8Yf+vjQv8A092NfyVxdq/r U/4Oiv8AlCJ8Yf8Ar40L/wBPdjX8lcXavUy/4PmcGK3Jk6VKn3RTIo2YcAmpUgfH3G/KvViee9xK Kf8AZ5P7jflR9nk/uN+VWIZSxnEi/WlMTL1VvypAdrUAfY3/AAS28N6T8VP2n/APhHWdaj0DTPEe tWunXN85A+zpJIqkgngMc4BPG4gniv6UNT8OfEPQP+Cnmu/EOH4V+KNX8GT/AA8tvCsWoWup6Qpn u4dRuLkssUt6kgiaOcAMwVtykFQOa/kQ8G+Ln0OZGViCD64r6q+H3/BVH4xeF/DFro1n8VPiJb6V ZhVgso/Ed4lvCB0CxiTaMewrgxWHlOXMj0sDj/YKSsndW1v5dj99/wDhiD4g3f7I3xQ8Ii+8O6P4 38YfEBviP4S8Iy6gGt9GtLfUrW6jsSwLKu8wEuYh5KSTnHGa+h7/AMT+IfjBpmnW+ofD/wAQ/D+y i1Gx13xBqHiC90/ybJLCaG58mM29xL5jM8CLuwsYQSMXBCo38xj/ALfXjvVPFsXiF/E+vy6/C4kj 1NtQla8Rh0YS7t4I9c10XxG/4Ki/Gr4seH10nxL8RvG2t6UAA1pe6vcSwyY6F0LYc+7AnrXI8HN7 s9CpnTqK04q9215NpL9Fuf0L/s1/DnUf2dPiv8Sta8LaWvxB+EPxo1tvGdjd6JcQSz6Xf3MSpepN HLIglhlaJGV4izKWZGQBdx5HRfgr8TPhza/F7UNK+G3ifUIfiX4ltrHSNNi8QWIvPD2gNFaw30gM 14scTOFuZYoopC29o93lc7fwI+FP/BTT4o/AZJ08J+N/E/hyK4O6aLT9RlgilOOrIrBSfcjNaT/8 Fgfi9FrFxqJ+J/j1NQu08ue5XxBdrLKgzhWYSAleTgdBmh4Ope5Uc8espRTbSTv1ta3z0V+5+/v7 Tn7NfiT4f/FP4KfEL4TeB/G3iPxD4O1jydWsrjxVHOsOh3NuYry1zqF/sEg/dOixblLwjLAYYd34 d8PXnxf1D44+Gfin8LNV0P4e+LLz7QmoavqWmS2moWQ0yztZN6291JLC4ktpHViowvltuVwVX+bT w9/wVk+Jvg+4vZtH+IfjPSJ9RcyXUllrdzA1yxxy5RwWPA5PoKyfiJ/wVO+JnxI8OrpGu/EPxlre lR422V/rlzc264xjEbuV4wO3YU/qVSxEs7k4JOOqVk9brW+9+j206n9IH7L2meKf2E/hj4ss/i74 jtdV0mz8T6foPhnxBd3KC51jTJEtba2kufmJNxHvdJCQu4W7Pgr85Z+xZ+zdqv7KHjPx1pfiXVLD SvBdt4ov7H4ZxefHFstNVaLUJ40BJDMLgtFGrKGH2eXAKuCf5j/iB/wUD8bfEXStPsNc8W+Itasd JXZZW19qU1xDZr/djV2IQeygVb8Zf8FHviF8TdE0bTfEnjjxTr+naEgj0221HVJ7mGxXp+6V2ITg AcDoAOgAqvqM313FPOpS57pe9a+nVdV2/wCCz+mnwF4O8faB/wAFJviZ48ufhr4nXwl4h8J6fo1h qC3+klZ57KS5kYeX9t81Vk81BGWQc53+WOaxf2TLT4o/s/fAvxrZ6h8EfF9/4hk8YeIfEmi2o1nQ xFdLeXc1xbb5Pt+I+JtrZB2kEjPGf557L/grX8Wn0GDTJPij4+fT7cq0dq3iG7MMZU5UhPM2jB6Y FdAv/BYn4vSXEE7/ABX+ITT24CxyN4kvC8YHQA+ZkD6etS8HU206fgXPO1OPLKCt7vf7Ksuvbc/d 74W+HPjR4P8A237z4neI/hN4q1r7Z8L9M8M3lxp+o6HD9s1aG6kmuGSN9QXZCxkJUnkcjA4zZ+LH 7H+t/Hv9gHxKmteDfH2mfFvXbWTVjpEfiyORLbXiwuI54Yxfix8mK527GJRtkQO1WwK/Btf+Cx/x dtrVYYvit8QUiR/MVF8R3gVW/vAeZ15PPvWVN/wVl+Jdx4uj15/iF4xfW4lKJqDa1cm6RTg4Eu/e BkDjPYUvqdS9y3nz541IxScbbX6bddu5/RX8L/GXxc8eWk+nfGD4L3l74V1zQNPhvNPe40jURaak sci3yPCtwyzWkjCMo3LAsQ0ar8wn/YL+BVj+yP4J1jwTdva6Jc+J/FGreLvC/g430Mtzouml49lp Fhynyn52CMyK1w6h2AL1/PDF/wAFpvjTpeqm+tfiz8QEunXa0jeILp949CGcg/j0ryrxV+354s8X +NT4h1LxNrWoa4ZRKdRuL6SW7Lg5DeaxL5zznNCwc3dbIxrZxzRcYpJNptK9tNt2f0IeCv2D/GPx X0j44Sap4R1X4a+O9Q+I934/+Hniue606eSwl+z2sUCubW5lk2u0MqyxONjRTHq3A3vjxL8dP2gv CXwDvdT+BHiWx8UeAPHml+JvE1vBruhmzeGG2vIJ2tHN/uc5mR1R1ThtpbIJr8Arv/grH8VPEf2E ar8SvHOpjTXV7UXev3U32Zl+6Y9znaR2IxiupT/gs98ZNxY/Fn4iFmXYSfEt5kg4yP8AWdMAfkKp 4SpfobviBtpuKdtt9NLNb3t116n9CnxKm+K+mavq6/CP4T3/AIUu/EcsniXWtU1fUtLWHVNTijs7 eC2KRXU7KJobcLLIqAKsQI3O7Vz/AMcv2WYv2kfjh8LvHx+HL/DfXfCOpy33izX76Szgnm0s2VzH NpxltpXNwJJJYzub5EjWU7lZtjfgFc/8FffincaabST4l+N5bVnEphbXroxlx0baXxkY69ah8ff8 FcPiv8UfDUeja/8AEPxhrelJ/wAul5q880LY6FlZiGI7FskVCwlRPQyhnbhrTST111u0++uvkf0R fsr/AAz8U/skfA7Qvh7qXhLXvHQ+HclzH4V1nS7mz2atYu0v2aObzZo/JnSKRY33KIyUVlc8qvjv xi/Yc8f6T/wT/wDiP4Y07w83jz4ofFrx5D418Q2umanaiy02Y6rZXjWglvZocxR2lukSYXLEA7VV hj8O/Bf/AAVs+MPwy8NPo/h74keM9F0kjAtbPWJ4Yo+MfIA2E+q47egrF8K/8FRfiP4B1i81DSPH nizSL/UHMlzdWWsXFvNcMepd0cMx9yTVLB1E73Kp59KFX2qSu2m99WnfvtfVpWP6LJfgv45/Z0/a QtfHnw0+H2oaj4G+KMPkeP8AwRDfadaXOkXqJth1a3D3C2zOyARTxxzfOAjjcwOHfGf4aeO7n/go X8EfF2h/DnxJqng34f6NrGk6jqKahpabDeQW6wskcl2srqpiYP8AICOqhhX87Wlf8FYvihot9qF1 YfEfxtY3eq/8fs1trt1FJecY/eMsgL8cfMTWTqX/AAVG+Mf9hXGmWXxU+Iltp1yCJbWDxJeJDLk5 O5BIFPPqKPqVTyEs9akpuKb5Wr66pprXXdJ2R+t3xe/as0H9gf8A4K73NsviKO/0QatE+sSM4Y2c N8oa4jk24BMXmlwP9lM8g19v/sq/st6/8CP2mPiXdXl3ZJ8LrvXZPEXgu2WfcRfapHGb/IJ+QRyx yiJVOCL2bAHyiv5PNT+L+oz3rzzTzSSyOXd3cszEnJJJ6k16hd/8FKPil4h8F6X4c1j4h+NdU0DR WR7HTrvWrma1tCmBGY42cqu0cLgfL2xVzwUmlZ+pw4fM5UozglpL/Pf16ejZ/Un4W+Hur/HH4yeO dT8eeBPHHhSythFpXh2WLxRHaw6jpyRqzbk0++3CSS4kuPllXHlpDlgSUX5q+HH7GPxhi+CGj+Hb HwjqPhfV/gH8QLjxP8NZNa1awktNe0Yyy7dLuGtri4kgcwzyxB2UhQkRyMso/CzVP+CqPxO8W2Vj b6z8RPGurQ6eyvax3uuXM62zKcqUDuQpB6YxiulvP+CsPxY8VJYi++JHjq+OnOstp5+vXUv2V1+6 0eZDsI7EdKhYOotj0KWfTp3UUraaatKytp6ptPvc/pJ8O+OPFkk11r+i/BDxPoOvag0d1ri6lfaW Z5QijdbWpS8aOSR2VV3M8UQVmkLMyrE/kvxZ/ZB1z4+fsB+JE1nwd480v4ua9ayaqdIj8WJJHba8 WFxHPDGL8WJiiuduxiUbZGDtVsCvwl8Sf8Fdfjf4nNm198VPH85sGD25/t65UxMBgOCHHzYJG7ry eea5a9/4Kj/FAeNE8QS/EPxo+vQoY01JtcuTeIpIJUS794GQOM9hSjgp3ujKlm6ptSpRSaafXp03 2P6E/wBsfwn8W/2nv+CXWueF5PhfrsXxS8YaJbabf6QuqaT5VtdxvC0svnG7ERhYiQqVYvhRlFPB 6r9tPwH40+Nn/BPLxb4a0HwB4il8Z+L/AA2dDTRZL7S45LKQKwV5ZTdeRsyTykjnBHy5yK/nCj/4 K1fFqPxRJrSfFLx+uryR+S98PEV2LlkGcKZPM3Y5PGe5qDTv+Cq/xR0vxXPrkHxJ8bwazcqI5r9N eulupVBJAaQPuIG48E9z601gqittpqXHO+XltFLlk5Lfd20320R/Rfb/AAA8W6D8bPhX8btK8I6j F4h0Xwc/gfxZ4Yub2yXUZNOZ0mikgeOd7ZpIriMtsMwDRyNhg6hW0vGnwF1r47fHL4V38vh698M/ D74PXtzr0FrfzQf2j4h1U27R2ywxpIyxwxCSdmaUqzPtCgIC5/nAtv8Agqr8TLbxx/wkqfEPxivi ErsOp/21cfbCuc7TLv3Fc9icVJ8QP+CsPxP+J2sWV/4h+IPi3WLvTJPNs5LrVppDZvjG6LLYRvdc Gl9TqdyXnTbUrK6TSfZO+n4tH9IVn8KJv2pfgb8QfA/xY+HWveBdJ1rWru4sLu/1LTZnBluN1ncw Pa3MxhuUcowDAYcAAtnB534efFfXP2EvgB4fn/aA8R6YdcvPGkum3GrQBVXWIDDJBBfGNWYqWjjj mlHBU7+BwD/N/wDFP/gp/wDEn4s2EFt4k8feL/EVtbEGGLU9ZuLtIiOhVZHIGPauI8a/tt+KPiLq MFxrviHWdant0EUUl9eSXDRoAAFUuTgYA4HHFUsDN7vQyqZu5U3TSSje9uz8r669T+mH4D/A/Xv2 bNC8QfD+78Ban8VvhRqXiCfxd4N1bw9f2Ra2jupftBsrmOe5h+7JJIUlRnjkRzu2HruftOeDfih4 08afAjVLP4b3usxeDPGn/CQ6jb6Tf6dDFpNgbO8tI4A1xdRGWdBNG77F2csFZtoz/OP8H/8Agqz8 V/gv4dbSPC/xJ8ZeHtLcHNnYazPBApPVlRW2q3+0oB9629B/4Kx/FPw6l39i+J3juzOoMz3Rg8Q3 Uf2lmzuL4k+YnJyTnNS8HUvubrO/3ntnFOTvd663TTe+7v8Aef0UftL/AA9+Jv7W3gX4i/Daw8GX fgLwh4g8Eajbwajrd3YTHUdbuZYzCMWtzPJHEiLLuYrg+fwP3ahuh0HWPHXxQ+GFp4a1P4Z6/wCF PEN/Y2el63qWoX1hLpdpFA5M0kTw3DyS7lMpiAiUkugk8rDbf5s9c/4Kq/EnxLpcVlqPxF8aahZ2 8onigutcuZoopAwYOqs5AYEAgjnIFXfFn/BYb4weOfC50XWPih441PSXTZJaXGt3Ekcy/wB1wX+c ezZo+pVLWM3m8fZqHKrJ3W+j6vfrZfcf0S/FXQfHsX/BSPwh430z4Y+J9f8AB+g+DdS0K51S01LS I1luLq4tJ4zHFNexylALZlYlF+Z1wCMkfNX7Zt1/wxr+xF+05r3xC+weGYvjfq7t4P8ABQu4pprJ 3ijieYrGzRCZ3BuZhEzIpUfOzMAfxcsP+CtPxV8OeFk0bTPib4707SY1CpZW2v3UVugGMARrIFGM Dt2FeJfHP9rfxL8a9Yk1HxHr+r6/qMi7DdajeyXUzDk43uS2Mk8Z7mqhgp3V9hVc5cqPsrJaJddk 79Xvc4L42aymqatKyHgsf5159WprN1Lq0xYAtk1SbTZl6oa9eKsrHgkFFK8TRHkYzSUwCilClugJ pTEwH3TQA2iiigAooooAKKKKACmP940+mP8AeNJ7ARS/c/GvuX/g2j/5TffAz/rvrH/pkv6+Gpfu fjX3L/wbQ/8AKb74Gf8AXxrH/pk1CuLEfA/mdVD4l6n9d9B6UUhOBXgnrH5g/wDBev8AaPurjX/D PwusLhorOOL+29WRGx5zFilujey7XfHQnYewr85q+jv+Cnt/ffFD/gob4+hsYZ76a1mttPijjG4o sdtHn2A3M3XGOa5z4ffsxwWey68Qyi4l6izhY+Wv++3VvoOPrX22DcKGHgu6v95/avBUcJk3D2Gp vRyipNLduSv+trvokb//AAS41N/DP7Wekalc3Eun6S9tc2730nFnBdPCy27zAkKwDkEZzg4PFe6/ BfwN8T/2SYPiX4i+OfipIvCusaVNbWyXutLqB1vUncGC4towzMpXBbdtUqCOPlJHA2llDY2aW8EM UEEY2rHGoVFHoAK8n/bd0l7HxN4Gmk8zZdeF45YtzEgD7TcA4z06dqwt7ar2T+/TXQ8bF4VZvmTj dQjVUYu8bytBuS5XdWb1u7PZdj1ezvY9WtFuorhLpLj5/OV/MEpPU7u5qzaXk2nXcVxbTPb3Nu6y xSo2GjdTlWB9QQDXyh4L+ImreALvzNNumSNjmS3f5oZfqvr7jBr2/wCHfx/0jxiY7a826VqDcbJW /cyn/Zf+h/Wqq4WUdVqj1Mx4erUE+Rc8Px+aP2S/Zr+KX/C4/gn4f8QPtFxe24W5A/hmQlJP/HlP 513mMmvmL/glprjXvwP1Wwds/wBn6vJtGeivHG/5ZLH8a+nCeeK+Trw5ajifyLn+CWEzCth47Rk7 em6/A/Pz/g6LOP8AgiJ8Yf8Ar40L/wBPdjX8nWhacb+cKOSTX9Yv/B0V/wAoRfjB/wBfGhf+nuxr +Vf4W2a3mrRq3Qmu7AfB8z5nEfEj2j9mb9iTxj+0lrTaf4P8La74nvYkEksWm2Mly0K5xufYDtXP GTgV69D/AMEtPHdjrFzpt54K8TWupWWPtFrNpc6TQZ5G5CuRkcjI5r9Mf2e9c8a/sy/8Eafh9q3w AsJZte1/VHl8U6lpunrf30Dl5VO6Mq+MbIYtxU4UL0L7q95+Mv8AwUC/aI+B37G3wJ1WTR7KD4me P726069sb/Scz3hEiraN5ClfLlkVkJUAcv0HQetQw1etGMqbjq2km9dFe7020PGxWZUMPOUKsZe6 k20rrVpWWuruz8X/APh1n42Vv+RN8Scf9Qub/wCJpJv+CW3jdUJPg3xJx/1C5v8A4mv6G72D9qbw v8G9V8R698S/hZYazoujy6td6Na+F5boxBImk8sym5Tk7Su7ZjIOMivHf+Cdv7ZX7Q/7fvhHxXrC +O/h74Ot/CtxBBKbnwu1ysokR23bvtKBQNvfPWojQqypTrKcXGDSbu9L7dNQlmNKNWnQlTkpzTcV Zapb9dLH4K+O/wDgnV438NafNcy+DvEsUMCl3kbS51VABySduAK+cvGvgGTQZmVkZdvHSv6hte/b B/aX+Af7e3w3+GPj+68Fan4X8c6lFHbatpekvEl/blwJApZzskXKhl5xvUgkMDX5cf8ABZ39j/Td O/bx+KCaFpsdnYT6qbtYYkARHnijmk2gDAHmSOQBwAcUTU6TjztNSV007q17dkbYbEQrqXs004ys 01Z3sn3elmfkkVMcmOeDXdfCXwTe+N/EFlp9lBPd3d7MkEEMalnmkYhVVQOSSSAB713Pif8AZlvN MeRhbuAp/u10/wCymuofB34z+Hdfs4o/t/h7U7fUbYSrlPNhlWRNw7jKjNU56aGqhrqfpD8Gf+DW j436poVrea7qHw/8PTyxq72d7q08k8RI5VvIgkTcO+HI54Jrvbn/AINfvH93eLHp/if4fXli8YZL 831wsTH5gVwIGbII7Ajkc9QPcf2xNF+GX/BRv9gzxx+0BZ+GNZ8K+P8AwubdJ3l1KS5gkZfs6NGI 94iKGJlG8Ro+UUnIGD6L/wAE4v2OfAX7Y3/BKnwDo/jnTr28jtbrWFsZra/ntXtHe8lJfEbhZMGN CFkV1yo4qFQTwixTqNLm5WuVaO17rXX8Diljqix0sEqSb5XJPmdmk0rP3dPxPzk/bK/4NvPif8AP gfrvjW01fwf4pi8MQNd6xYaPdTvd2VuAWacLJEgZFQFm6MFBIDAEj8nfiN4bn8P3roxddpr+gX/g i74VGl+CP2sNE8z7T9l8NfYfM27fM2x6gmcZOM46ZNfk7+0T+zHPcazNstmOWPRa1xNB4XEyw8pc 3LbW1r3Se133Ky7GfXcLHEqHLe+l72s7b2XY+LPtEoH33/Ogzyd2b86+jNP/AGPb28jBW1k/75qS 6/Yy1C3BP2ST/vml7SJ18jPm7zH9WpfNcdGavd739lm8tJNpt3B+lT2f7Jt7dYxbuc+1L2kRcrPA RcSKPvPS/aZR/G5r6O/4Y3vlj3G2f1+6awPFH7MN5pEDMbdwBz0o9pEOVniH2uX/AJ6v+dJ9qkBJ 8x8/Wul13wDNp1yUaMjB9K0fCXwruNdkVViJJPpV3Qjivtcn99vzpvnSDqzV73Y/sq3txah/s7Hj P3a5vxb8BLrQmO6FlAPpUqoh8rPKfPb+8350oupT/G/513OkfCqa+ugnlk5PpXaaX+zPdXsIYQOQ R/dpuaDlZ4xYSzTXKrvc5PrX0J+x/wDse+Mf2uPinpHg3wXo9zrniDWWIgt42CKFUFmkd2IVEVQS WYgCqmg/swXX9qoDA/Ufw1+v3/BuR4K0n4NfHTxNBfSQ6RrXinw1Lpej6lKoIt5jLG5jGcDLbFYD uYgvcCsK9bli2jSnC7sz5R/a3/4Ny/jr+yt8FrvxvqFp4b8R6Ppds13qg0HUHuJ9KiUEtJKkkcZZ VAyxj3gDk4AJH5s+PNBl0a4dSWGDX9Of7B37HfxH/wCCfkvxf8ZfGzxJY3/g/VdKmt5dPGpvejxJ dMwInbeAd7IrxAN87eecgbQa/DX49/soXC30hW2Yc/3acnGnVdOM1NK2q21X6GGFnOtRjVnTcJO/ uvVqz3+Z8baOslzeKoZ+eOtfVv7Bn/BOr4gft3/EhPCvgLRjqN/HCbq7nnlEFpp8IIBlmkbhRkgA DLMTgAniuS8Hfsw3J1pFNu3DY6V+0v8AwQ1+F/2L9mD45fDjw9qUHhX4jeONLjGj6nJI0LS7YZ0C q6/MpRpM5XLASlgDtpVqqVrO22vbz+RtGDs3a9k9O/l8z8+P2+v+CC3xi/YT+HI8V+I7HQtc8MRs kdzqug3r3MFg7kKiyrIkci5ZgobYU3YG7JGfz18Y6PJpF2y4YYr+lj4efsveMP2F/wDgmX8dPDvx k1WxvP8AhYNrJp/h3QEvftggunjlQ3CHpuaSSOUgdBbBjgnFfiv8VP2Obu+vpGS1fGf7tPnjCrKm pKST0ktmZYdzq0Y1ZwcG1rF7rU+N7AySXCjc3519e/8ABNz/AIJvfET/AIKE/ES48OeA7C3uJtPt ftl/d3twLe0sYdwUM7kE5LEAKoZjyQMKxHA6p+yjeaA3mNAw2+1foJ/wQ9/acsv2MvEvjLSvEPh2 fxD4T+IOljSdWt7ebyLlFBcBkbjI2ySqRuU/OCGBXlV6j5bwNqcPe1PRrX/g1P8AiwdOA1Dxv8K7 GWZAsCHUL1y8xHyxn/RQPXlS3TgGvzB/bR/ZA8V/sm/FzXvBfizT5NN17w/P5N1CG3oQVDo6MOGR 0ZXVh1Vga/Y39t79kjwb+yp/wUy+B/8Awg8N9Y6P4t1PSNVezurqW6aCY6kqsRLK7yMGAUkMzENu 5IIA88/4OHvgTL4//bZ8RX8cBcyafYLuAz0tkH9K1rUvYxpVFPmjUTeqs1Z2tuzgwWLliZ1qU4cs qcknZ3Tur32R+FN08sM7Lvfg+tRG4kz99vzr6I1v9lC8S8lb7M3B/u1wPjD4J3Ph523wsMe1NTTO txZ5r9pk/vtQJ5Mcs/512OjfDebULoR+Wck46V6X4V/ZWu9cgVhbuQfQU3JIFFs8DMrnu1J5j56t X0xL+xbfBM/ZpMdfumqb/sc3wYj7NIMf7NL2kR8jPnQXEgH3mFL9slH8b/nXvWpfsm31ohP2dwR7 Vjr+zRf/AGjabd/xWj2iFys8dNzKf43/ADoN1L3dq97tP2T76WDd9mfp/drL1j9mO+s3x9nkH/Aa XtIhys8XM8hH3mP41LZo1zdKpJNe0aL+y/fXjDNu5z/s12Xhn9ji8luYybVyMj+Gh1Yoai2ZP7H3 7Gni39rj4paR4M8FaHPrniHWHKwW6EIqqAWeR3YhURVBJZiAK+xP2t/+DcP45fsrfBa68bahY+Gv Eej6XbtdaoNCv2uJ9KiUEtJKkkcZZVAyxj3gDk4AJH1z/wAG73w80r4F/HbxNbX7w6Prfirw3LpW jalMoxBOZY3MYzxltisBnkxAdSBX0j+w7+yV8Q/+CdUPxj8b/HHxPp994M1PSZ7ebTv7Te9HiW7Z gROd4DeYyK8QDfO3nHIAUGsOdSjOpzqLja0XvK71t6EVJVIVKdKNNyU73knpGy0v6n8x3jrwydHu HXaRg1zVtAZpQoHWvr/4tfszXF/fOUt2wSeNtcJafsrXlveoTbPjP92tY1VY0dNnnvw9+EN54yvL e3tbaW4nuXWOKONC7yMTgKAOSSeABXtXxj/4JifFn4E+CINf8XfDbxt4Z0e52ql5qei3FrBubopd 0AVj2U4J9K/Tr/g24/Zb0ew/ag1XxDqelwX+q+GPDdxfaNFMmRHcmWGLzgTwGCyMoPbzMjkV9Df8 Eqv24/iL/wAFDvjt8QPht8WbrTfFvgnxJ4ZvLyfTnsIYY7EefDFsiKKGMe2fbhyzAqjBgQxaoUq1 SFStTty00m7vXXscuJxlHD1qWHq35qrajZaaW3P5sfFvhR9DlZXXaR7VztfRP7X3ga18K+J7+C0k E1vFM6RS7dvmKGIDY7ZHNfOzdTVQldXOhqzsFFGD6GiqEFFFFABUbdTUlRt1NJ7ARy/c/GvuT/g2 i/5Te/Az/r41j/0yahXw3L90/WvuT/g2j/5Te/Az/r51j/0yahXDiPgfzOqh8S9T+u4D6e1Iy7lI PIxSg8/zrzv9oDx5rXgax0E6Nt87VdSazkAtDdPt+y3EoKIGXJ3xKMZ5BPfFeNSpyqTUI7s78RXj Rg6ktl2PEfij/wAEtPDus3Gqat4Y1i/03XtWuZLy9lvz9qS/mdizNI2A4JJ7EgDoMV8/eNf2FPif 4KuWB8ONq0IJ2zabMsyuP904cfitfZXw6+NWueP9J8S3Au9IUWmlaZf2MtrC0kO64t/NkI3EF0LZ 25AOOvNaeg/GabXk07VbrVrPR9Ovtfn0S1s/sb3Ely0U0sG15Af3bu0TMOMKMA5Oa9T/AGmnpOzt bv1V0vuPp8q8UcdQiouXPHpzdk7b3W35bHwl4R/Yy+JvjPUktofCeoaeGOGm1AC3jjHqSxycewJr r/8Agoz/AMEt/FXxE+HngK98BRQa1rHg7STpOoWbTLDJex5EgeIvhSRIZflYgkOMZIwfq+f42a34 k1LxxpGjyaZZ6pp8dtdaBNd20hguIZHMJMoyCwE0b5ZDwkkZHJGc67/aM1qTTn11VtdOsvD19Z2v ijSriMPc6UHeSKc+YGAKoTDMr42tDlh1GNk8UpqaSTVtPVK333t6nX/xF7GQxlLGUko+zu0rNp7p 312tfa2jufj1H+wP8bJdTNmPhZ4y89Tgk2WI/wDvsnbj3zXuPwK/4If/ABW+JV3DL4ul0zwLpT4M nmyLe3zL6LHGdin/AHnOPQ1+ivxc+NfijwFDqc1rNprBfDWpa5arJaElWhnhWAMQ3KmOU56EnHSu 18U/EK88LfFbSdNlmibSZdCvtRum8kmXfA9uoKkHgEStxg8gYretj8U4rlSV72tfotT6fHfSCzev TlSowhTasnKzb10Vrtr70cl+x/8AsTaF+xvot3Z6FrniXVlv0jS4Gp3YmQumcOihRsPJGAcY/Ovb EOQcDpXg1x+0b4im+GEl+1hIl7pWsXOn63LZae9y+nQpmSK4W2ZlkkjMTwF9uWAckKe3rHw30uLT /D4uoNRutTi1iQ6iJpZmkQeaobEW7lYu6r2BrxsVRqRvOs9W7fcflNXPKmZ4mVerJzlKzbe+u2n4 fgfD/wDwdE/8oQvjD/18aF/6e7Gv5XPg8N+vRf7wr+qP/g6K/wCUIfxg/wCvjQv/AE92Nfy0/AWy +1eJYB/tCtsD8DOTEfEj95f+CM3xc1P9nD/gnb8X/iDC0l9/wjMiSWFjdzyGxM3lpu/dqwwzlogW 64C84zX3j+0v+0r8KfA03wn8c+PtL1a+1vTbKTxD4YSyAe2M08Co+csASodSCw4yGGSOPzr+GGn/ APCtf+CB/jJkJjl8W+JYFDg7W2i4swVzwSCLdhjn7ze+PVP22raXx/8A8E3/ANl/xJvZ57TQl02W TOWkItrdMseSTm3Y8nqW4547JYa2HWIWjcmvlZf8E81YpSxksJJXSipfO/8Awx9Efsz/ALRN3+0d 8Lf2g9bvpN9xceGribZuLLCrQXW2Nf8AZUAAewFeCf8ABELUf7I/Ys/aIujx9nihf8raatn/AIJT 2ctt+z1+0H5hJz4Sfr/1wu65f/gjREZf2Cv2lUHBa1jH/krNXZhYpZXiUv5ofmedjm3neEb/AJZ/ kj6E/ZS/aO8HftOaz8P/AAX400fWtV8W+CNdXVPDOoWg3BNiP/rW3AhEQtuBBUqifxKK6vxd8b9H 1n9tHXfAnwU+H/hbxj8T0Y33ivxbrxP9n+HgpCCIuimR5FGxPKiKcgZLMshXxP8A4JJ6PFoHxL+I Hid40nu/D3hqZ7ZHHAZmDE57HEe36Oa8/wD+CF+tfFHxBbfFvWfBmlfD7xFqetX9m+uXHibWLuzu HLC5ddqQW0ylWZ5iSduTxzjjmwmDjOhVxEtVBJJN2V5P8lvbudOY450cVRw1PR1G3JpXdorZabs9 6/bQ/aF1H4G3vh6w/aY+HXwv+JPwx8YStp6+IvD9jKk2lyYyd0Fw8r5A3MGilDYViDuG0/m//wAF OP8AgnJo/wCxn+0DpV94QuG1HwF42tBrGgXDP5hjjJG+Ev8Ax7NyEN3SRMknNfpz+3X+yB+0F+3L 8DbXwPf6J8EvDltZapFqlvc2uv6lM0ciJKmAhsVAyJXBPufWvmb/AIKx2Wn/AAm/ZY+APwo1nW9E 1j4geBLN7XUU0+4M62kSwxRAZZVZVbYm0MqkiPoMUpOiqNOUGlO7UkndNbp+XZ2Kw0sQ8TUhNN07 JxbVmns13fdFn9nCRj/wQ4+Oyt/BeIP0tK+t/wDgh3/yjb8Bf9hDVP8A0quq+UPgJB5H/BEX4846 Neof0tK+rv8Agh5/yjb8Bf8AYQ1T/wBKrqt5/wDIol/18X/pJh/zPY/9eX/6UfMX/BDjSX8QePP2 oLCNDJJfW6W6oOSxeS/UD9a9b1TRPh/+yT8ZvD3wu+H3w+0L4q/H3xCn2mefVMJYeHYCu4zzSFX8 pAgJCoPMYdSN6K3nv/BvmQPj5+0IfS4tD/5MXtcR/wAE+PGnxD8f/wDBUz46eJPCen+Dta8UytqM TL4j1S5skt7QahGgWIwQSliojgTlRhQPm5wfUzLCRq42vWnqoQi7N2u2kld9keJlWYSoZfhqENHU nJXSu0k23bfVn05+19+0H8T/ANl74f2niT4t+BfhJ8VPhq11HYarFodnNb3Wis52j5Lp5o5VzhQR 5Z3FQQmcjzr9qv8Ab+l/Zl8EeG/Gfhz4G/C/xD8IvGAQeHNZttsDEGPf5E8HkjyZRtkG0ZH7t+cg gex/tT/Ab9oX9qD9nTxJ8Obrwx8DNG0/xGkSvcW3iHUXMDRzRyq4T7AASGiXqe3tXOeDf+Cc+q23 /BLLU/2fPFmr+HtR8aW8F7qelf2fdSSw28wuDcW5BkjjcKZHCsdnSR8ZrzcHLAKnCeJScuazSv8A C1vo9Gn96PTxv9oyqVKeElJQ5bptK6kntqtU0d98DPhp4K/aQ+Gng7xp8VPhh8H9L1DWJYtQ8Mpp qx3izwPbiVPMdokBPzMTH8yZCc7sCvMF+MHxWH7VEnwkh/Z2+ClxrcGlprU+pw6gW0u2tHdo0kkk +y+YpZ0YBDHvOMhdvNYf/BDj4+6f8VP2XdS8A+MpPJ1T4N6n9thF3+7a3siXdC+4f8spBOrD+FfL BxxXuf7G13feIdP1v4uzWYm8RfHHWY7rSre4YobPQbZSlkpOCVU26tMcDG+6HGTg82KoLC168KsE 0tI7211Vte2vU7MJip43D0JUaji2ry2vZaNPTe9lpY8z+E/7Sfhn4l/tc+Mfhr+zz4B+GGh6z4WW 4utX8S6xYlFnmjmWGQWtvbqskqJKygsZY15yowQW5j9pf9pa78E/HPw38Lv2pvhl8MvGXg74gssW leKdEt5o0i3SLHvKTNJKjIXj3mOVSquGVm+7XougeMf2ef2Vv2q/FVl8LvCOo+MfjX4t846tpfhh nvJbYNKJJkeaaVbazj83DOu9NpVAVGEWvkb/AIL9t44164+DsXiLw7oHh62f+1rfRdK0q9kvrpFH 2BSJm8tI9x/dhY4gwXn52yMd+X4OjiMZChycsJR3ekrqN7rW9rr0seZmWPxGGwU8T7TmqRltHWNn JKz0tez163Pgv/grh/wTns/2O/2ttd8L6SJp/D8oj1HSJJuZDazDKqx/iKMHjJ/i8vOBnFe+/wDB Jn9g34V/Dj9mPxT+0l8b7CbWvCfhm8/s3RtARNw1W6+QbnXI3gvKiKpIXKyM/wAq173/AMHC/hRf EP7TvhiUbGeHwlbQsM5Kn7XeNg/gw/Ou9/4JV/D7RvGP/BOvx14b+MljpEXwXg1P7auo6hqL2TQT r5bOI2XB2q6xkMHUl3ZQH3EDyaVWMlH2l2rq9t2utvM+lrwmoSdJpStpfZO2l/JHvX7O3xL+L/xu /Zu0vxv8IfDXwH8FeGdZjmfSvDtxbXU73KRyPGYpJrcwRRSAxyKQIpACOSOa+ZPEngf4d/8ABYX4 N/FDStV+GWl/Dj9oT4ZwS3EjacqhdRkhaRWjfaBvBkQxMH3MhaMq7DK19c/sz/HzQvFPww03w3+z f8MbzVvBXhYSW+la7q8zaPoMcu9lkMbyiS7nfLys7rAclmBcMxr5J/4JIw6kn/BYv4/XWriAXcEP iBdRntldbRJzrVuW2l+VQlXKhjnapznBr0IYaE6eIly8rh70f5kr7NX7dzwKmNq06+FUZuSqPll/ K3bdadGtLHzV/wAEIv2fvhlfftjaza+OdM8M6zqx0KZfC2n6/bpNY3GoebGQdrggyqgbaNpOC5A3 KtfXvxI/bx8W/Bv9qLSfhD4h/Zx+EGl+J9duLaDT5pLtBY3S3EnlxSrL9n+4zgryoIZSMZGK/LXx nraeD/iFkOE2S5BBwRzX6H/ttvJ+25/wTI+Hfxz0e4mk8bfCedNM1yeJmM5jzGpmJGTvD/Zps8AC WU5GKnLYUamJjDERTU9E3fSXTZrRvRnZnc8TTwrrYWTjKGrSS1S3WqeqWqPuy8/Zz8M6Zp15rmhf DD4NSfG9tKtmu9PlURWG9nzKBKsBfJXzMSeUGbbGG2qQR4p+z/8AtF/G/wCPOleL7zwj+z/8JNIk 8HancaMZ7zVCiXl7A5SWO2McO2QKRjeXRD0Dkggd54U/bQsvHH7AWlfG/Sbe3vPiFrWiw+GLK1UA GfW5ZxbJAFIzg3ZDf9c+enNd/wDs7eGdO/Z1i8BfCCxulvrvQtIlv9Wuid0l5eyKzSzOTzukkeaQ 55xIua4dKEJxrU05c1le+lt9mtNkdV5YucJUKrUeW7tbW+26evc+e/2B/wDgoF8RP27tZ+J/h7WP h78PLXVvAtlFNpOlXME8UYvjJIjxzyOZNoyhGUjBUnnNcX4T/wCCgvjjx1+1xL8FLv8AZ9+E+keO YZpYHi1XUAtvlITPkSLA24NEN67QdwINY3/BGOVoP2uv2onRmR0luGVgcFSL265BqL/gsp4b1DwJ 4z+Ef7Ufg5BFqFhcwWOp7NxRZ4WaWAtj+Bts8LE4yPLHOa96WEwizGeE9mlzRXLq9Jcqa67NnzUc bjv7Kp472rbjN82iu4qVn00aR9e/ED4EeGPhd4f8Q618IfhX8H9Y8bJdI+u2V80dhEqJAWcROIWV G3eWcERocyFmDDB8S+FP7Vnxy+KP7MF18VvCPwA+F2maTBBLd21vPeyLqGo20QYvJBCsKhl+Vgu6 RS2PlVgRn1b9or4rad8VP2btEk+HU7QeJP2k/sWiadcocTW1vNAz3NyQMMpt7QTkngq4Xviu4stT 0XQNH8UeAvDsUMGi+APB76Zbwx4xGRDtK8DsqIp/2g1eDScaNNRq005OXW97LR7NbvT5M+lrKpXq OdCq4wUelrNvVatdFv6o8b/4Jx/tY6n/AMFIvgz4s8ReL/Bvw/8A7V8Kar9j8P25tH+yxO1uDGJW kaU/ffBKKOOQpIFeVeJv+Cn/AMQvgt+2TYfB/wCJPwu8AaPo97KIr6PR7O41SXUrWSJmgS1UFRKz uFQBo+WyCqnpnf8ABAT/AJM5+KP/AGMdv/6Khpn7USh/+Dhj4W5HWyszz0/1N1Xt/UsNHMcRQcE4 Ri2t9Gknp/wbnzzx+MeV4XEqo1OU4p7Waba10/I2Pix/wUC8Y/s+ftJ+AfhN4j+Bfw90HwH4+Non /COJGLq9jtbi6a1QyGMC080bWYwqkg5C7xndXx9+3d+zn4a/ZT/4KAeK/DnhOKG00KQ2+pWtlG2R p4niWRofZVYsVHZCgr7F/wCCgf8AwV0vf2U/in4g0yTwP4R8Uap4XvJBot/qKkS2DEA54GTjOPkZ CRjJzyfyn0b9pfxH+1F+0NrnjTxVfi/17xFefabmQDai8BUjRf4URFVFXsqqO1eNKpCpGLpw5bLW zbTd9Hrtp5n0tCjWoymqtRzu7xukml1Wm+p+k3/BWQ/8bGv2XT7aR/6c1r6Q/wCCh2o/Cf8AZUm1 L4wfEzw8vjTUtSnt9N0DQ2VXiuJkgBy4YFABscszhlVQMKzMBXzf/wAFYuP+CjH7LgHppH/pySvt f9u/wL8IPHvwlupvj8mkWvgnQtQiu7C5nv57WYzeTgqghIkdjukGxCxYD7vyhq9HEKm6OCVVNxtK 6W797ZHiYaVVV8e6MlGV42b2XurVnAHxz+0Jcfs5WHjTwV4f+BNzot/pCa1a+Eba2vZJLu0eIShY rkSRxNIUaPA8gKScbuQa+Hf2pPgv8Jv+Cpv7BPiv4z+CPA2n+APiX8PZw/iHTtPC+Rfw4Uu5Cqqn 5C0iybQ2Y5Fbdw1fod8Ifj9rHxh8BaXJ8GPhh/ZvhGysY7DRdd8Uyf2Vp/2JVAH2S1jElzJEFjjA DLCr7Vw+ADX57/8ABGOwZ/2PP2vJJVZLa58JRW6SMMI7/YtUBUHoT868dfmX1FZ08NF4OvWlFKVN xtbe0nZpq/8AwTWWNqQx+GoRk5QqxlzX2ukndNpb/cfJf/BE/wCBPwz1D/goL4dj+J8OjTaJbwXM tnbauiNYXV8IyIUmEnyEcsyhuC6oMHOK/ST9qH/gon8Tv2Dvj14c8Fa58MvhF4b8N65PCYNTsEnu LY6c04juGAXydrqpYlSmF3Dhxyfys8L6Atn8QhwABJ/Wv0c/4K3RK/7Q37JKMgZXtrIEEZBH2m04 qsrpUq+LUKyUoyT3vpZX0/pmmfVq1DBOrh5OMoyjtbW7S1uvM+gfH3xb+OXhLwbqnin4Efs/+BtD 8JKGvh/bSC21jX4Dl2nWygeJot2SypM5lIHMYYhB5l+zT+1x8J/229ObxNZfAHSPEHx20stAvhyz iiSzvg2CL+aaRRDHChAVpJlZ0ZkVd5ZM/cVpqt1J+1Hc2j3M7WsWjZWHzD5aklCTt6V+d3/BCMnT /iT+0s9uTA9tDEYmj+UxYlvsbSOmMDp6VnhVh62CrVJU0pU+VppvW7tZ66/KxOLeKoZhQpQqtxq8 ykmlpZXTWmj9bnZftO/t7fGD9k7xDo+k/Hn4IfDTUvhL4kc28VvpAa7WED78ZaVmiaRVJYIYYw4+ 63DEaXxU/wCCeP7OP7Klv4h+PPiSwbWPhvFaW1/ovh6BWlSee4wFjAJBkVmZCiswUB23/Klc7/wW vupL/wD4JifDq4uJJJ5n8boC8hLOf3Gp9Seew/KvpjwD4E+HvxG/4JUfDjTPisulr4C/4QTRLjUr i8vns1tmjtLZo3WRSrKd4GMMCThcNuIp1IUJYahieTl5pOMlG+qVtk29RUK+Jhi8Tg/ac3LFSi5W 91tPdpLS5y37PHxN+MPxv/Zv0zxx8I/DfwH8F+GtbSZ9K8O3NtdzvcpHI8ZjkmtzBFFJmOQECKQA jk9a8R+HHh74b/8ABYLQ/G3hzxD8OdH+Gfxz8CS7LuayUCO6KSNG+/aAWAdSjB9zIShV2GRX0X+z T8fNB8UfDHTPDn7N/wAMbzVvBPhYSW+la7rEzaPoMcu9lkMbyiS7nfLys7rAclmBcMxr5L/4JHW+ qj/gsh8fbjVUga8hi8QJfzWqOLVLhtbtywQtkhSVcqGOdq98GnHC05UsRJx5XD3o/wAyV9mrvp3M 546rSxGFSm5KbtLrFu17p2Wz2seleDZfAf7J/wC0fpHwB+Afw58LeLPiqluLjxB4o8RA/Z9KCx+Y zOyhpMhWU+XEVUb0XLMSRpftw/ti/En9j0eHr74pfDX4O/FLRNfuGs9P1mwSayjsp1GTFKlwLkrx vIZWIIVs4IweV8SeEbz/AIJ4/wDBWzVPjH4rheb4TfFBJrUeJIA0sGjzXIicLcbQdg82EAH7pR9w JKsoyv8Agph4x0f9t74efD34F/A69X4ma3H4g/tu+1DTD52n6RDsuUX7RcLmNATcuevAhOcEqD0U MJh3iKPuqVJxTlJ33trd6Wt2OfFY/E/V68udxrRk1GKtqrq1k1rddT6L8N3Xxru/Bd/qehfs8fBv w/q8KRT6cz6/DPFfxMrlwjQQDD5ERXcyowZiWBAB8x/Ya/a+8Qf8FQrn4rfDz4ieB/B+jWfhzTkW 2tbe1lFxZ3jvJGzO8jsFZHQEFUUgg5Jr6g+FWkxfDfXvh38Pk1CTU5vA/hePTrq6ZiWuJI7eKIM/ qxEe7/tofU18Rf8ABE6SaL9s39ptrZQ9wt1KYlPRn+3XWB+eK46EKFbC4mpyJOCTi1fq7dW9z0MT UxFHGYSDqNqbaknbor9Etmd54X8afDb4A/tcaZ+z98HvA3g/WviYkTPqnijxVnyoJEgNw8cexGkl lEWWMcZjQYwWJDFbP7a/7WHxA/ZTvNDX49fD/wCFnxP+F/ie5OnS6hodlNBPYygEsjQ3UkwLgCRl 2sN3lt8yEV3/AMXvEH7Of7NX7ZsPi+bQJdd/aC8RRiKDR/Dwn1PUXkeDyyywllggd4RtMknlkoWb OGdq+ev+C6+v+PfEf7H3hm417wfo3grw4/i63kt7JtT+3as9w9nfOzTCJfs8Y+aTIWSUsxB3DnOu Bw1GriaNP2fuyST5tG3rdrXa+1jmzHGYijha9X2t5wk3FR1SWllLS12t/U+gP2eP2a/C/wCzZ+2h pWpeCAI/CPxB0Ca405AzMsSsqzGNSTllwiMM5IDgHOM18tf8EmvCcPwV+PP7W+togt/+FeWF9YJL tC/Z0W4u3xnCgf8AHmD1X7vTjj62+CUsvhz4XfsiGdWt7i38L2trLHINjxmTTbSIqQeQckjHqMda 8b8c/C+8/Zq+B37dvie60y90iDxhqUqWVzc2z2yX8VxFjfE7f6xDLfSrlcru3AdSBy0K6pUcRQvr JJLztL/I78ThniK+ExLVuVtvyvH/ADP58v21NSS51icoQcsa+YScmvdv2qL1rrUZcnPJrwnpXTSV oo6pu8gooorQkKKKKBpXCmOPmp69RSN0NTIaiQyKea+5f+DaRSP+C33wN/676v8A+mTUK+HWXBxX 3L/wbTL/AMbvPgb7T6x/6ZNQrjr/AAP0Z0UV7yP66iOOlZHiXwbpfjFbYalZw3YspvPt/MBPkybS u5fQ7WYZ9GPrWs3zLwazdX067u7uyktrtrdIZSZ025E8ZUjb7EHaQfYjvXhRbUrp2PSqRTjZq/kZ rfCrw4uqW98ujWMV1aQx28TxxBNsUZzHGQuAVQ/dByF7YrwXSNStrX9qzUrW4ltraxuPEM8JaaOD 7Lcy/wBnQukC7RuW83uXWRsFo0lXLEAD6IubfVmudRMVxaLG8aiyDISYnwdxf1BOMY6VFLoMsmr2 rGPTzasrPeBoAXlmGNjg4xwd3XnkV3YXFumpKbvdW32PLxuBVXl5Fy2ae2/4o+aNBF3rHwZ0TUoh p2o60sKWEMMmr29vcXFms0jPDbsYwkMn7iFgH+VvKC7lI3Vs3HjGXxx8NPGur2lybTXreG2jgsLu xhM2uxG0ieCK7hK5k8/zZI8Lwu5gpBU17tZ+EJYrO1jkXTXkFwzXTLaqqzR5cooGOCMrz7H1pb3Q NUmtNQeKfT11FnxYztag/Z48jCnuf4vzrqnmMJP4VvdfetNttO3+RwxyicYpcz2s9N3bfRrXXufP ngu4i+Kfxl1TRfEd6ktpfR63osS3ccBF5DHdoFt7VlXKtCqgyI+d4aJgG2kr3P7P3w00fxnoGoal qZbW54NT1HTYmuXWTyoY7wgLlQDkiKLOTzsU16td6IH0mRIEtLe+Ks8cohBWOcqR5mO5yfqRUVpo NzZ2lhHFJHbmCXzboJyJgVYEZwM/MQckdqyrZhzwcYe7t17b/fobYbKfZzUqnvb7re9rXv2s/vKu ofCnw9qms3OoT6NYy3l4ytPMyfPKVj8sbj3+T5fccHiughgS2iRI1VEjUKoUYCjsAPSsK+0rW77S 9TiXUYLeeWcNZTRREGGMFTtfPDHhh6YNbdokgt4xKwaQKA7AYDHHJA7c1585SaXM7nsUoxUm4xtf XprqfAn/AAdDnd/wRE+MH/XfQ/8A092Nfy3/AABultPEMLMcAMP51/Ur/wAHPsRuf+CJfxeRerXO hD/yt2FfzY/BP4I20X7cOg+BbcSz2H9v29hM1wVIdVZDNuIwuB834V6GATcLLudFPLauKmuTZtL5 v/hj9c/jfPJbf8EJfg4NN3z2mo+Jmlvp4hlRh9R+R+uMPtGcjmMetetXC3PiD/ghr8GRexumpJ4p ksdPWQYe8V59RWNUHHBXbg85Eec818F/si/8FyL/APZDm8U+DLbwn4a8afC2+1Se5tNC1VSBbZcY MbkMArbQxRkZQ3K7ec4n7b3/AAWs8a/tuavoNtd22keFvDvhlidI0bRUZI7dyFXzGYnc7gKAMbVU fdUZYn0amJk8JHB8u0nLmv5WtY8GeU+yzaeKU+bTktbTRrVP5H62ayfhb/wSr+CHxG8MeKPiRDq/ jzxf4YkhGi29hIsjSPDKsQjA3YUvIw3yFQQucLgivmf/AII7/tW/C/4UfC/4p/D34keJX8Ip49EK WmoNbSSwlRHLHICyqwRhuUgvhTnrkYPm3wi/4OdPjx4b03T/AAzquieCvEesW5S0E2p6RdDUrpzg KHWGeNS546Rgknvmul8cf8HSfxi8G6hcWcvg74UxXtqxSWJ7C+cxsOoO296joRngiihio0sLUwsq blz2baklttZcrObF5RiauMp49VFFU7pJwbWu6b5t/wCrH1X8NYtN/wCCbn7e/hvRNZ8RW+r+DPid ovlQanJAII1jnkxGJFZiPlkjjDNnGyXPHKjzT4Ovdf8ABE39tjxjonjrSNUl+CvxGjNpa6zBbSTx eUrO9uSQSWeJJJY5I/v4beARjd+Uv7Wv/BU7x7+2P8Y28XeNtWhuL6KFbS1t7SIQWtjArMwiiQZw NzMcsSxJ5J4r6n/ZJ/4OMPiP8HfAcHhXxLBoPxG8NW8SwQ2uvRF54I1A2osynLKMDAkD4wAMAYqc HVnRhOEo80Zq0le2zumnbdehpmGCWInTqwly1IO8ZWutVZpq+z9T9PdG/aQ+APgzxXH4i8E+Irr4 v+N7wFfDHhjSoGuLlrhh8pYBAIsAjMsu0RgMcFgK+Z/+C8nxDsLLwb8G9M8Zp4dPxxFtJea8dGBW KztWACxPklmUyfcJP/LKUgKHArxn4if8HMeq+FvDF5a/C74W/Dz4dXt4hR76CAXUsROPmVVSOPPA ++rjjoeMfmH8W/2q9e+L3xM1PxR4k1u91vXdXuDcXd9dzGSWd+Bkk9gAAAOAAAMAAVyxpQcl7OLS XVu79NEkkdcHVV5VZpvslZeurbbP3T+Mek+HP2FP+CTPiT4f+LPFVs/j74o6ba6xZ6ItuyzRGRoA 0YOSGEYjbc52jKkAHjPV/wDBIX/goR8HPg3+wto3hvxd4503w7rvhe6vpbqzvEkWSVZZ5ZEaLCnz crIOEywIOR0Nfn9+y9/wc3fGj4SfDPSfC97F4I8U2ujW0VnbXes6fO14sUahUVnhniD4UAbmUscZ JJyT7Na/8HTHxGkh3P4W+GanHaxvef8AybrqVflwjwk6bd5c11JLW1tuV6WPPqYCrLHLHQqJe7yp OLejd735lrfyO3/4IXftWeBfhj+0p8SrDxHrK6PP8Rbm1TQvtMTBLqX7RPiEsoIV289MBsAnIznA PX/Hbwf4g/4JMf8ABT28+NEeh6hqnwm8ezXH9p3VlC0gshdur3ELHOEdbgLKgbCuoCryDt8L1X/g 6f8AiXGhSHwz8M4yQQGFheFh7jN3jI9wa434U/8AByV8UvCXiHU59audF8Zabq0rST6bq1tmCIN1 WEoVZFxwFyyAfw5JNddTNJTxM6/s/dnHllFu91ZJWdlZqxxUuHuTCQw7q+/CXNGSVrNttpq7unf7 j9F4f2pf2XrjXrTxnYePpfEzOwm03wnY2U1xf3Ny3McK2wTzWO7gKwC5xubAOey+K37at78AfhZ4 F8VfFyx0rw94017xA89jolm26703R3Zg6TnJ8yRIGUOVwvmtHgZQmvzg8Sf8HL6+D9LnuPAnwX+G 3hXX7lGEmpBDM24gjeFjSI55Y/MzDnnPOfz2/aF/4KD+Nf2jfife+LvGXiG71nWr44M0rBUijBO2 KNFwsca5OEUADJ7kmvIlRpyVoRaXdtN+isl8z6CgsQnzVZJu2yTS9Xds/W79on9kXxD4T/4K1J4c 8C3rWXg79o2wlfULi1w0Ummz/vdVjVhxkiJpFIwP3yAHmvtX4e/tKaR8RP2tvG/w88M3VrZ3Xg/w 1No+iRhgqLcQsizBc91cIuBn5YM9jX4qfAr/AIOaPjF8DPgXZeDbe08F67Notr9h0nWtVsZZb/To NgRUBWRUk2KFCl1PQBt4AA+dPhR/wUd8XfDf4rW3jTS/EF7Z+KLe7e9S/Dh5GmctvZgwIbduYMGB BDEEEGunF162JUFUXwK1+77v5WRyZfldLCOpKD/iO9v5U+i+bbP1K/4I3/tE+EP2R/Hfxb8JfFrV ZPh/441mWBBqerRt5kbxef50TyMDsfdIHBY4kz1JC50f+C1PxYT4qXXwW8daHpfiW9+Hfhi8ns4v EF1atDFqsxa2kJhWTa7KyQHbKyqkhVtpIXJ8l8J/8HLqeJtKtLrxp8Hvh34o8UWkaxrq7x+UxwMb ijJIQT1O11GScADinf8AETr44OsahJq/hjwLr+h3uNmkT2jpFahegR95JycE79/I4213PNLY5Y5U nfqr6bWdtLrTueVHIKn9nvL/AGy5U9HbXe6vrrr6H0r/AMFP/BnhT9r34L6l+0F8PPHWm+IdG8LW 1ppmoWMVuytGGkXHzsQVlX7ShaNkBC98jB87/a5sdS+JH/BD/wCEt54MiuLvQfD2qyP4khs+fszq 10DJMo52CZ93PA81Gxggj4i/by/4L9/ET9r74d/8IIuneGfBXggzRyy6ZokDobvy33ossjscqHw4 VVUblUkEgGuf/wCCff8AwWo8e/sRTXVpolxpur+GtTl82/0PVYvNtLlioQyAqQ6PtAGVbB2ruDAA V5+DnKhWhXhG6i7pN9PVJa+dj18bg/reGlhak7OUbNpW19L7eVz9qP2N/wDgod8Grr9nX4a2OieI rxNb0LRLfSv+EK0uyln1G6vVgSNkWFUzKN24iTIT5t7MuGx8pfsJfHDRP2WP+Cl/x2t/i5dH4fXf i/8AtDy21Mh44JJrwXKq8iEqd0b7lfO1sfeyVB86uP8Ag5OTSNHuf+EF+E3w/wDBGq3kZSW/gQTO CerBVSME9D8+4ZAyDWfqf/B0B4r0TRoJL74ffDvxB4lsogsGq3NtKjqw6MyK/XPJ2MgyeAK3hi4Q 9rCNN8tRa3autb6O1rX7o5KmUV6io1HVSdJ3Vo6PSzur3vbsfPH/AAWa/ZWvf2EP2i9P0OTXYvEG n69pcet6ffJbm3Zonkkj2OhZsMrRHoSCCp4zgfR3/Bv9+0zovjTxD4o+CXiyVZvD3xX0mawWGRsK blYpBtBPCl4mlAPUusY64r8xP+CgH/BQPxv+3f8AGq48b+OdSgu9Ukt0s7eK2j8m2sbdCxSGFMna gZ3bkklnYkkkmuP/AGZP2idb+FfxR0TWND1GXTtX0a6S+srhJAjQzRHejAnjhlHWuRwkqN3o1r9x 7UKHtKns1rzafefub/wSw+CHiP4O/tC/Efw/47v3j+Hf7O2qXXieeN0/dyakbeW3huh/s/Y0mlAz wfL45r379kv4x6Zqr+KP2lPH3iuz8NeFX1O506KK5ieQEMqBBvBJAXKxqoVixQjjjP5PftK/8HKH xb/aV+At54EvtM8F6DFrUKW+tappNnLFfamiEfKS0rIitgbtq88gFVJWud/YT/4Lr/FD9iDRL7R/ DlxoWsaBqE5un0zW7V7iCKcqFMiGOSORSQq5AfacA4zWmPr1cXW9tUjbRKy/HXu3d9Tiy3K44HDv DU5X1bTav6K3ZI+3v+CSH7V3gHwh+138Yode17+woPilLLDoN1cWztHLJJdylEbb912EykBsAkEZ Bxn62vfhpb/E/Rfi9+yz4o1O3vNRvdKXV9AvXTyxJJtjkSQKSSCkohYqCfuy8kZNfnle/wDB1r8Y HtisPhT4VRMynDrp1+WXjqM3hGR7givkC8/4LCfFGP8AalX4v/8ACSs3jZLkXH2kxIIdoTyvJ8oD Z5XlfJtx90+vNXjMXPEYpYmnBwkrdb6q1mtF28zHLsoeGwbwdWanFuXS2ju2nq776H6l/wDBJvU9 b+Cf7Pvjf4o/EWSQaR8Do7/wx4Y065GPsd7dTRyXqZz1aY2sQIJxvkHavY/gp8TdB/Z//ZS174v/ ABK8ZQWQ+J+m3sWn2ckDvPcy5lI2sCd8khBYLtAAIJbrj8k/21/+Dgz4jfts/De08Iatp/hLwroE d0l/ew6BbTRvqNwoOGlaWVztBO4KMc4LFsDHSfsV/wDBwz8Tv2SvhnB4P0z/AIR7xJoFmzGyg1y0 kmNgGYuyxvFLG+0sWOGLAZOMVGMxE8TiXiakbXeydtPJ2e71em7OnAZT9Vwf1SnNXt8T1v02T6LR an2n/wAEGP2jPAvhT4c+NPhx4g8QR6H4i8Q6rHqOnpNA7pdxRwguFYDG5RESQxHBBGcHHN/tK/tw fDXUf+C0Xgv4mWXiAaj4H8NR2tpfapa28ksakRzK7ooXfIiGUZKgk7W2huM8pYf8HQHxN1uyIh8O /DSCYjJMWn3m9ccnAa6IP5d6W7/4OgvirKX+yeEfhg8g/vaffH+V3XXLOaf1qri3SfvxcWuZaXVr /D2PNjwrivqdHBwqq0JKSfK3ezul8Xcl/wCC4f7Oeh/FH4H61+0h8OPHdv4x8M6nri2eqW8NqyLY NINqsrk5IDeWjKVBBkU+oHxf/wAEd/2ZdU/bD/ar03wXZX/9lRPFNf3180JmFnbwrlmCZG4liiAZ HLjtW1/wUR/4LVfGP9uzwbD4W8SN4b0jwvDcpdvpei2Lww3UqAhGkaWSSRsZJC7wuSDjIUj5/wD2 Qf2vvFP7HPxm07x54M1RNC8R6ezxr5qLNbzxSKVeJ0YEMrA9D04IIIBHjRxKUXBbdNb/AH/5n2Mc krSgqk37y30svlq/uufqv/wVK/ay+H/iv9vr4NaxoGvx+INH+HB08azd2kLFImgv/NkRQcbnCLkg ZGSBnOQO0/4Lp/ECH4+eCfg18SvClxL4t+E0c13HcXFmZFtftPmxDbICAUdlR0BYAgq44PB8O8O/ 8HTnxWeONNQ8MfC2SVFALjTr1Sx9T/peOfYAVsWf/BzN4z1fWWbXvDXgPVtCuIfJuNH+xypBIOpY M0jtuPT5ty4z8uea9uhm/s5UJQpP92mtXe6e/RWeuh8ViOGK1VYiE6q/etPSNrNWtu3daan6QeE/ +Chfwu+LOj2v/CuPEGoeLte1nS/sWleFNItHSezcj706lQlsqYAaWVlRVX5S2Vz8H/8ABH7xr4S8 IeCPjP8AA/x/4gHgXxX42uYNHtI76ElmnIltniUZAMqyOo2EjO4Yzg443xL/AMHHt5oejS2fw6+H ngX4fCcq0s1rAtxI2DngBY07n7yN1OMHmsfxb/wdC+L9K0t7qw+HPw1/4Sox+X/bEltOxzjbu2CQ NnHbzMe2OK5aOLhCjVw8Kb5alt2rpp3XS1vkd1XJ8VUr0cVOa5qd1ZLRppJ9d9NBmj/8E6dcm/4K bT/As69a+dbN9ql1tbRmjW0+yi6Evk7s7irKmzfjecbsfNXon/BWr9prwFqf7UXwSttA8Qp4kh+F Aht9dntICBE8N1DuQBuDJiFiVBIBIGc5x+bGm/8ABVP4maf+1xL8aU8TyDx7PeNdSXpiQxuDH5Rh MRGwxeViMJjAUADoDX274f8A+Dqn4uXFtGLrwv8ACuSRVAL/ANm3oLHHU4vMZPsAKMBi5YWuq8o8 1k1a9t1Z9H3Nc3ymeNw7w9OahdpttX2aatquqP1hj/ab+FFnoH/C93+IOnL4Gv7f+y4rprWUIZRz s6eZ5nyEbNmcgjrX51/8ETf2mfA3gz47/FjRPEWupoM/xRaG10J7mBilxK01wBGSuQrnz0wGIDHI znGfPI/+DoP4rtrzXh0v4f8A2UxhBYf2bP8AZwf7+ftHm7v+B446VduP+DpT4oPEyp4Z+GMWQQGT T7zcPcZuyM/UEVGFxUaOHq0FTbVS2vMtEnddNddyMXlGIrYmhiHUSdO7tyvVtWf2tNNux7x/wXb+ Kfg3wt+zN4X+Dln4ltdW8beG/E0Gp39lHEyyW0DWl04aQcqmftUW1SxJDA1xf7ZHxhtf2mf+CPfw vsfh7qVxrUfwvh0ez8b2FsjrJphSweBJJ0IGYfNjfa4yvQ9uPO9B/wCDob4l29hBDd6F8Or+WNAr XE+n3KySn+8wS5VM/wC6oHtWn/xE++Orqe2Nz4c+H5tEY/aLaK0uQt2hUgoxediOuRjuBnIyD1YX M/YUqUFSbcJc129299Lfdro+5w43h6pXrVq0qqSqR5bJapLbW+vnpqj7j/Y4/wCCh/wavP2dPhrp +i+IrxNa0LRYNK/4QrS7GWfUbq8WBI2RYVTMo3biJMhPm3sy4bHyt+wP8d9E/ZP/AOCnPxzi+Ll0 fh/deK2v3jbU2DRwyy3ouVR5UJX5on3K+drY+9kqDwtz/wAHH1rodtOngX4U+APBepXqlJb+GMSy ZPVgqJGCeAfn3DgZBr62/wCCZf8AwVStf23fixY+GfFekeF/+EjXTpZrDUobcLc3MsW19gBJ2ny/ Nc7MD5OAKzjjaVNVoqm+WotbvVa30drW9UVUyqvU9hJ1VzUnpaLs1azur9tjm/8Agpl8W/iD+yf+ 3F4b+L03h/TPiH8NrfRo7DTdHur1Y00+4lJV5Ei+ZknZsYm8pgUcp24y7D/g4ZTwlat/bnwB1nw5 ZTPtR4NYwJHI5+9axDOB2JPHtWL/AMEq/iLp3gn9sH4zQ/G3U9N0r46Xl2sOm3viQlY8BpvNitXl KlUJMRVVYbogmzKqa+/ta+MMPw10ubVfHnjb4c6d4cijYzvJMIzIuOgLuAScgYwxOcAEkV14yph6 Dhha9D2jiklJNxunroldPfc83BUsViVPGYfEey5m24yipWadtb2a0W3Q8X/Zx/bm+BPxN+HV98Zb HW5/Btnocn2HXrLVstLaTzjMe7BcnzCDsZCQ+CMBgwHxn/wRz/bB8AfDf9tb4rza/rP9k23xIvD/ AGFNcQPsuZGvZHSJioOx2Eq43YGQRnOAfXv2GLiy/Zf039pH9o6bTP8AhEvhz4qunk8HWF7A1sdT QTTPDIsJwUjkeWNUUAYDPjCqDXiXjr/g5e8a+HppIrXQPh8DgqHazuiw9x/pOM/UVjOrQwrr4WjB yjNRW6XLs7bO7T0OqjhsXjVh8ZWqKMqbenK3zXur76XWq0Nb9kH4zaR+xn/wVr+LVx8bJp9A1HxC 9/b6frWoxNJHCZrxZIpN2DiKSJQFkHyqAFO0E47X/gs/8W7T9ov9jDRZPAf9v+NPCvhHxFFdav4q 8hk05pXinjVY3YL5+GlwXjDRx7lUtlsDwvSP+Dkddf0mGPx98MvAfj2+sSTa3lzEsEkWTkEqySLk f7ATgDvk1Un/AODm7xrH4o3xeGfAy+GBB9lGgm0cwiP137w27HGPuY/gqnmSeKp4tUnzRSTV9NFb RWutPMI5FNYSrgnVXJNtp21V3fV3s9fnY/SL9kL4q/DX9rL4M+Btb0LVIfE+p/DbwxbLeaAsX+kW t15Cqqyof4g8EgUDIYgMCQBnwD9i/wDbg1z/AIK5eIfiT8I/it4F0OHwrPo895FdWFvKkmiSLKsc ayPKzDzl3lkcBDuib5cZC/Ifj3/g5x8e+RbW3gzw54G8E2UMwlkjtLIztcHIyrbztCnAB2qG9GFe a/tgf8HKfxJ+M/wd1rwh4d0Hwd4CTxPA8Gtalo1vJ9uvVdSsiq7uRGHViCcM4zw478SdO1Reyu52 5W3rHW76anpewxF6L9tZQvzJLSWllu3Y/Nv9p5ok8QXcMU0dwkUrIssZ+SQAkbhnseteIt1Ndl8Q PE51qdiWLEmuNrrgtDSe4UUA5oqyAooooHEKCOPrRRSauWNYZOPSvb/+Cbf7aD/8E8P21/BHxjj8 Np4ufwY9440hr42Iu/tFlcWv+uEcmzb5+77hztxxnI8RPHNNKkmsZwUk0yoyadz92G/4PcdQH/Nt lof+59b/AOV9B/4Pdb8H/k2u0/8AC9b/AOV9fhKY89qTy/euT6nS7G6rz7n7tL/we535/wCbarX/ AML5v/ldW54O/wCDzDXfHiSppn7OGkS3yfcsX+Ipjubj2jVtPAdv9kHcewNfgR5X0q3oGkTa1q1v bW8tvBNK4CPNOsCKexLsQq/UmpeDp9jqwlXmqqMk5J6WWj+R++XgP/g8i1/x/wCJW0m1/Zr0+3vE ypjuPiAyOGH8IQacXY54wqkj0rd8Rf8AB3f4i8P+GL26b9myA6ro+JtR05vHR3R2rECO6hkWwKzR EnDEY2kjqCSPxy8Q/BbWPjNokKTwSW3xc0yD7VFbRLuPi6wVSRcwSoSk9ygVuUYmVVJ5dTv6/wCB PjKf9o3wg9huj/4Wh4OSS608zgFdegxtmtpQfv8AmKSrgn5iwfvKWqGBpPS2v9aep95geH6E70Kq alJNxffy8pLt1P1B8J/8HmN94y8La3d2f7OtsdS0WMXb2J8ctme2ziSVG/s/qmVJXH3SzZ+U1tfC j/g7/wBR+LPh3Xrqy/Z+sk1PQ7SS8bT/APhN3aSaNVBDKf7P5BOVOOQSnBBJX8RPGekp8DPiRoPj Pw3AX8N61uurOCfLeXglLrT5vUoS0Zz95GRsDfiuz+E/hO7+Av7R/wDwkWlKL7wlYyQXc8ZcGZ9H vAu2Vk/iVVlVWIyFkABxRDBUm0mv67nDgsqUq8aVWF+V8srX2e0l+p+tnhH/AIPNL3xZoHiG8T9n W2juNAslvhB/wnTH7RH5qRvz9g4K+YG6HgHpWBH/AMHt9+v/ADbXa/8Ahet/8r6/KN/hQfg/+2nr XgUlFs9XmutGhYklHhvImW3bPfHmRt9QK8GurJrK8lhdGR4nKMpHII4NH1GC0a8jxM0wksNCPRqU ov1TT/Jn62/8FC/+Dm/UP+CnH7IniP4M/wDCjU8IweLbvTRJrMfittQ+xeRqFvcjMX2OMNvMOzlx jdnnGK+adQ1E+DvjydSs8wf2JofirxOzklWSaZ7u3iY+/wAluB/OvJf2LvDh1rRPEGFEm7VtAgKH o27UF/wr1/45+Gp/D9v8atTmnLvYeC9B05So2+XJfz2tyycnn5RLnHXniuyjh406b5dL/wBfofcc O4J0cqeKb1l7223LzP8AQ+MX1idLhirHkkn3r2f4SeJT8B/hLcfEKRUfxVrU8ml+ExIufsOwD7Tq IBGN8YZI4j2eR3GGiFeY+GvhZ4g8X21jc2GmXM9rqepR6TbTBfkmun5WFT3bBBIHQEZxkZ9G+KXh 9/i9+0VoXw98OyxTaboLQeFdNmGBC/lsRPckjoskzTTEnor89KFFNWR8XluGqU3LE8r5nZQv3k91 6Lb5F7wp441T4KfCW48d3F3PN428cyTWWhzzOXnsrUfLd3wJ5EjsTDG3UYnIwyqR43ceLL6fO6Zz 7knmvafEfhOH9pv4x6nLYXbaL8O/BFtBpkN+0JkNtYxHyoFjjBBlurh9ziMEFpJHJKqGZdn4vaz4 U/Z1v4fDXgTw3bp452+TqWpXrjU7jSmOMW0e4eV9qH/LWREGxsxpjazvWlrnq4zJJ4mHtJTUKUNF u5TlfVpLdt7P/I+e9ObUNc1OG0tYprm7uXEcUMalnlYnAVVHJJPYV6vrnwIvfgnbK3xK1s+ENRlR Xh0CCEXutEMoZWlg3qtspBH+udX9EIr6Ctvhxr/7Cnw4tLzSfDmreJPjz41wJNSjsHu4/CCyrkQx naQ1+4YFiMmPdjrnd8efFPwtr3hzxLO/iS5t7rV7uRpbll1GK9m8wnLea0bth8k5DHOabTTs0c2Y 5DSyigp4iDnUetmrRintd3u5eXQqeIfFW7UZlsbm8lswf3bXCBJSPcAkfkayn1SZ5MljmoQu40Nt HXH51SVkfEylzybStcuW/iO6tj8shH41ZTxvqKjHnNj61lEYoT7wpkXZpt4uvnODMx/E0+18V3xk +WRiByeaycbm6GpskKI48Bj1OaTVzSCu9TVufGl6V2iQsx685xVObVZ5MtM7bj2J5NVuIPubS/dv T6Uza00vJyWPJpKJbn069uhaTWJkUndtzwB60Lr1ynzCQ5PJNVplxIVB4XihozEVDDGRke4pqKIl UltfY0rfxpf24+WZgPrUh8b37jBlJH1rKigM8iqv3mOBTQN4osiVJl6bxFcXB+ZyT9c1NbapfQQ+ YrBVbpk4zUKQR6TErSoJbh1yqHomehPv7VUkmkncl2zzUb7HTaMPj37Lp6m5beMNQhcETkhe26q9 34tv7hzukck9eazIEbeTg4qYIWwe9Jxs7mkfejZKxa06RtV1KGKZyFlcLkdRmvQfDvwp1awi8yyt ZZ57xTHE4BHlA8Fh79vTBNSfsp/su6t+1l8Qbjwr4d1XR7HxTJZyXGj2F/IYv7duEIP2OGTG1ZmX cU3lVZlC7gWFeu+CPEWp2sWqaVc2l7Bc6QfskqzIYZ4nj+R0KkZQhgcgjOetfL5/j61FL2Nn3T+V j9D4JyfC4qUo4i6lo4tbvTX7rHzR4usbvwvr1xYTFlltn2sCe9VI9ZuYx8rkfStXxvoeoWniK8n1 FZWnmlLM8h3ZJOevfisgLDGxEjuOP4RxXu4apzUoyvd26HymNwnJiJq1ld2T3S6XLcWtXm5T5uQP U1UuNWuGdtzn61Ld6PLZwQzH5orgbo2ByG9fyqEKJ43U/eHTJrSMr6rUwqUWvdas/wA9Bg1GQH7x P41LFr91CfkYr9KrRoVbG09fSpRuUdP0rRs5YQNfRvHGp2t4kkU7oyMMHNehWPjm5uNGe7iAheL/ AF5LZDe4HavKYXwclQQP1rb8KatJNq8NqQBBcDynGcYB715uNoc8eZdPyPqMjxcaEvZy15ttOp08 nxM+2RgSqTtOBzmqGteNYJY0UKr+pBIP51hX8h064uLWWEgIxXJXaw/Cs9oY2jHlzK7HqCMbayo4 KF1JHXic2q2dLR91/wAA15PEUk0ZS3ncyRjIDHGfYetUV8fajA3zzOD6E1Sms5YDvZHAXDbgOAOx qO7CznDZ55UmvRppLTdHzWJk5PmtytG1/wALDvHQfvXB/wB41TuPGN3cD55SfqayXgMOc1AzZ471 rGmuhyVMVJaSRpN4guA2RIc1LbeK72M4Epx9ayVIUGjzR7/lTcDH23U3v+E6vI+PNJP1qJvHF+T/ AK4gfWsKRtzU0nNCppCnipPQ3h46v0PE7D8aY3j/AFH/AJ7Pj61iUVaijnnUlJWN6D4h6hHMp85u D/er239mv9r7xL8GPGml67omr3el6vpNwlza3UEm2SGRTkEH+h4PIOQa+dKmtr6S2Pyk0OKejM02 j93PBP8Awca6R8XvDdnYfG34KfD/AOJjWyKn21o44JhjgybJYpl38k/J5YyeAK09Q/4LsfAP4Zga j4H/AGVvAmn65GCYb25e1U2zDoV2Wu/uc7XTtye34S2Xju9sgAsjYHvUtz8R7+dMGRvzrD2Dtypt Lsm7fcDUG+eUE33sr/efe/8AwUU/4LO/Ez9uPUYh4l1S2s9FsHaSy0XTVaCwtmORv2lizyYJG92Y gEgYBIr4Z8WfFPUdTuSxuGPfrXMXmvT3udzE5qmxZ8kk5ranRjBWQp1G9zZXx7qAz++b/vqkPjnU HGfOf86xaK05STWfxnfP1lb86rz+ILm5HzOT+NUaKGrAPluGmPzE0yiijmJkFFIPvGijmJFp3l+9 AHb0NOqhRYzYfanbR6U5VJ6AnAzxSUFNsTYKaYyRT6KVkCdggs5bqURRRvK7dFRSxP4CpE0e5k1B LQW832p2CLEUIcknAGD3qbS9Zu9DvBcWN1cWVwBgSwSNG4HsRzXoXg79o3ULieDTvGqp4y8OHCSw amhuLm3TPJgn3LNE3oFkCnuCOKmzPWwFHCVWqdabjJveyt83fT1szmPEvwO8WeDtFGp6joN/DpmQ rXip5tuhPRWkTKqfYkGn+APiJD4RUWepaHoviDRpm/f2t1bqkxHrHcKBLGw6ghsZ6qw4r6A8Hfs4 +JDp9349/Z+1TxFrWkw27Pe6Hf2yJq8Vvz5ga2+aLULUYIZowwwDvjQdcfwbrEPxEt9Qu/Bej6Fp 3iy3Vp9U8E3enpdafrcajMstksgLJIACWtwdwGWibjYo1aX9f0z62nw+8PUU6UnB20TSkpL+61ZO /Vb27l3wPrdl8M9N0q7sNZ1G++Gd9qKzaPrWzOqeAdVHzrvC/dPygsq/JcRqWUB0xH237T/gq/8A DOvWHxz8K2Vtp3iHRL2NPF1jac2q3bBWW7ixw1tco6NkfKRMvJ3NjhfhlJoWoW+qeIfBmky3Wly2 rxeNvh9cXDSO1kDue5sZDlnSIjzATmWBlDHzEDtX0X+ydpmmXOoWvgC61qHWrHXtKmbQ7nUEWC08 RaC3mEQGTcdt3ayGUFGA2KblA5xEa1w0FKXJtfbyfRn6HkeHji6Sws2lezi77SW3K97X0tutn0PN vjH8OtJ+L+nWkujqkfhr40QtrHh0tj/iT+JoBtnsi3AAuPuHsWkhboleU/Dfxu+lfDTw74knhe6u fh1qT+H9btCNpvNHvfMPlN7B/tKEnoZo+hAr2nwV8FNS8IeI/iF+zXqj3C3mqSN4l+Ht3L8ki6pb hmjiB/heeJJIGAPE0aDtXBWVrbfEDx9a6yqx22mfG3T7nQNXixtSw19Njcj+ENdC2nHYLMyj7ppV F711o+vrf+mcmMw1R1414rlntJeaa/BSs/SRb/4KDeEn8K3fwx8fadcG5aO1TSpb1ety9oVa3nJ9 ZLdon/CvAP2mtFg0f46eIzaKq2Oo3I1S0CjgQXKrcRj/AL5kFfbfw/8ADtx4w/YE8Nat4t0CPV7T wnqqvLb3DLIl7FZyCOaNtrbkYWsoTacMNiHoQa+UP2y/CCeEPiDY2auZn0y2l0aSU9ZDZ3EtvGT9 YFgP41vi6auprZpP/M4uOcmtg3mEdI1OSduztytfNnV/sDWzTi9iBwl34n0CB8DJIE80vH/fqvYP 292Gl/DX40ywmTZqHxH0nw3HuwS0emabcIwz7M8fA9q57/gkV4YtPFvxT8N6bex77W9+IegCYKAW ZFhv3I59lNdX+0H4Qm+OWv8AgXwvbLsm+J/xi8Q33CnKo9zZ2qH0wCsv5VktaSS3X66WO7K6fPw7 TpJ6tNf+BOyX4lDVfCei/s8/CTwLcTW8p8Q+CfCUvi+QvkRWt5ft5VmNnRpmklhcluiWSYHLV41+ yMlx8K/BPin4lx2Eep6zj/hFvC9tNAJhPqd8jo8gjIIk8q2804II3zQ5GDg9b+3v8V4vF8/iG9si BbeO/FU8tmqngaTpimzsQMfwsWm/GIV3mg+AZvBGheDtA08Qw6j4P09Et3nGxB4k1WIXFxdOey2F isZZv4Ht4yfvVlNLnUY7L+k/uRlVw8a+YqnR0VGK2XVpJPztFXOO8Tata/sz/C9JrSW3muvD17NZ aUyYZNU8RFF+26ljo0VipWGAjjzGDr1kFa3/AAT8+E1r8JfDx+OHinQ38SaxdXzaT8OtAl5bxBrR HzXTZ629rkMzHjzCozlTXO/Bv4Np+3l+1NZeHdOun0P4X+B7ErcancAKmlaPa7pJ7uTt50zGWUjn MkxHQcez/tj/ABW8MeEvCdtrGote+H7TWdHGi+CPCmnOq6jpHhgAhHZmBW2kvstJLMytIySFVVlk cqoptprRI0w9KNSTzCo1GlSvy32ut3566I+df2p/2q9Uvtd1jS9P8QvrviDVA0PiPxNA+BdZJ3WN kRjyrJMlTsx5xyx+UqtfOZiDNwOT6da19cFlrmvkaJpt3Z287BYLWS4+1SljxjcEXcSf9mvXbLwJ p/7Nr28Gp6ZD4o+LF3Ii2mhGIXNr4cc42m6TBE93nGLYgpGeJdzZiUbaXc/N8dWxWcYuVatL3E7X 1atfSytdv8Wch4b+AkOjeHrTxD481STwtod4iz2dqsPnatrEZzhreAkbYzj/AF0pRDztLkFai1b4 v6DocLWvhbwPoVjABtF3q4/ta/mHq/mYgU/7kS49TXY+NNL0jwH4gutX+J9/eeN/H985kudCgvj5 dk/b7ddLk7h08iH5lAw0kZXZXJjWPE3x2u30Xw/4U0hYsb1s9E0SNTbIOrNNtMu0d2kkPuacW9y6 1KGGj7DD6TfRLmm35vaPote557quoNq+oS3LxwRPKdzLDEsSA+yqAAPYCoVUA13Gv/A298MW0pvt d8Hx3UIJa0j1qC4m47ZiLJn23Vxz2r2zgOhXeodc9GU9CPUVorfCfJYrC4ilO9dNN9/1I0j2jAHz N0p0i+XlRkEHDeoNXvDtoLvU4432HzfkCN0kzwVz2OM4Prir/inwzPZr9pI3/dWQ45cNnZJ9GwVP o6EdxWMq0I1FTl1FGjOVJ1IrYx7PTPtCg7sZk8ojHKsRlSfYnIp9vaO2nzMUwUO4evHDflkVr6M6 uYLhx8jlbSc7c7JBzE5HfOMZ9jV/WNF/sXXZodu2KUCfaDu+U/JKvvgNu/CsZV7VOR7/AOW50U8L eCn0/wAzltKh8++SMYzKrLzz1U1cksSNIE4GRLbJID6Yk2GlnsX0DULRyHVoyGbI5Do5Vh+a1unR jd+H/KhBIie+gUHA3bPLnH6Z/KnXqqLjJPRv8tWRh6LalF7r9bWObsbYCSCUkjdvIwP7q07QbFLu 7Yyf6qGMyOfToPzrWsdPR9A06XaykJfO0nqFRcAfif1qnpcDL4av2VVL3E8NtHzyTycAflTdW8ZN d/1aNKdG04p6rf8ABMr6jatdxx3TFVa7eSQj0UNgfhkH8qrJAjmRlB2ovX1J6D+f5V0XxH0o6PrN tpioN9jaRRyY6FtuT/PP41CbCPR7S1hZWN1LGLlzkFQH+4APXbz/AMDqaVdOnGXfVenT8DV4VyrS i+m78/Ix/LkY7ScY6AVJHCkA3SOfoK2NY0UxXUFmrKjpEZ7qQDPljqWJ7gDgD+prEuZBcTFlXag4 Rf7qjpn3/rThP2ivHb+rFzSpPVXfn/XQ6r4Sa/eeFPE66vY3c1nc6cpeOWJtjqxG0bW7HJ7elfpB 8YNV0f8AbE/ZfufjrpdtFF4w8NRW+nfEmG2A/wBNkb5INW47yECKY4+/5bk5djX5kW7mz0JQM77i TJ9wOB/WvpD/AIJy/tlRfsnfGK1TX7eTV/APiqF9B8XaQzZj1DS7keXOoX++qtvU9mRSK+ezjLvr F5fl5H2uQ5q8JGPJ8STevn0+aPGPi3cwalfxzwvJIk6lkXeGVMdhj+tZvxJ+Fd98LvEw0vUlR5Jb a3voJU5juIJ4UmikU9wyOD7HI7V6r+35+zof2Uv2hb7wfZX6avoFvCl9oWpxjMWradcjzrW6U/7c TJn0YMO1dx8XtMg+MX/BOr4TeMwscmseB9evvBOpNj948DIl7YknuADdIM9o8VVKvLDwpJfC24vu uqZdWhSx1arNu09Guz7r8dDj/wBlT9knV/j34X1aLT9LvL7Uru4s7TSLaOPd9qaaWSJtp7EOqDj1 NeY/Fb4G+Ifg74z1jQ/EelXekarol69heW88ZR4ZVJBRvQ/KePav21/4NvNJ0W28ERa1cxQF9J0T Wnd5QCsLw3NrIpGehUTkg9Rmvmv9qD4f2f7ZXxo8AeUkbyfGj4hwyXEqncfItrS0gnbPYBpbgmvn 6ee1qeJk5/DKTVuyjbX5n0s+H6NfDeyjHWmo+93crtL0SW5+a3xN+FF/8O72ytr0f6Zc6fa6hLGv WFbiJZoww9TG6N/wKuYtbO4Uv5e5QgyxI4A9/wATj8a+rfiR4YX9qr9v7xvqTo9h4QuNXvr+7miX alho9oWICcYG23iREHdig7ivoL4Y/sTaD4h+G954m8fvB4D+GkFzH4p8Xz28QMzNKhbS9AsgfvzC 3bzGHRTcBn/1Yz68s/jRjGM1zSaT08+h4r4TdacqkLwSdtb39fmfBvwj+APjH4/6sNM8LeEdf8Sa gVLFdKsZLh0X+8VQEAe5xWh8bP2MPiX+znYpeeL/AAfruh2UrBEubi2IhLYyELjKhsfwk59q+jf2 i/2zvFXxV+Euq6b8NrKL4SfBTQrlLC10jTJzAdYuGBKi4mXEl7clAXcvlEXHCgqG+XvDWi+LvE8c lnpbardfbCqyW0DPIJ8HgFF+9z6jvW9HG1Zr2kmoxT1T6fMWJyfDwSpxUpTto0l6f1+ZzfiUm/0i 01DHzP8AuZP95QMH8sVz3l5Ynua+g9W/Yt+I1t4Gubu98CeLdNjCid57nSporfIJBIYrjoRn3rxH XPDNzoN08N1E8EsZwVdcHNd+AxtCpeEJJtefQ8PPMpxVKSrVIOzS1a6lCG/eCLy/vJn7jcipnSC6 g/dgpIpztY54+tVJEyxzke1MU7WyOtek6a3R87HEOPuzV0OkB2lH7VVlix2/+tVtP9J4P3h3psds 0ufamtNzCpD2lrFHGDzx+NAX0qw9mS2SjflULoUOMGtFrscMqU47jWXI96b5Zc96fT1YRmgSV3qR hMUGPd9RU3nCk80EHileRpaHci2Yx7e1DEd6k83PtUbY5pg2ktAYAjNMoBxRQZt3ExgcUA9c0tFB LXYY2D0FJUnSkb7pp3YuUZRSlcLmkpCCkc4Wlppf0oJkOophcn2ooJJ6djOOO1G3JNPxkCtbMzTG lB70nl+9PK4/KjYaLMrmGBCB1pSuc89aeqZYAnGTjPpXpGh/A7Tb/SUurvX7+KNhlp7fw7dT2qfW TCn64U/jRboehgcur4ttUUnbu0vzaPM/L96fBEskqKziNS2Cx6KPWvSh+zRqHiGMnwrr3hvxawIU WtneG3vWOOi21ysUrn2jV64DW9AvfDOpzWWo2lzY3tu2yWC4iaKSM+hVgCKLDxWW4rC2lWptLo90 /mj0/wCGHhB9G8UWGp+DfiloWn+JrB1lszJPc6VKko6COeRFiU+7Ogr7H0jwLoP7bcFno3jr+y/h L+0fYgXGkazAGtE8RlPmSaXYvlOz4yJY23HG5dyjYPzjhQs2MHj0r2L4A/FPxVp2lR6TNoGr+NPC VvOJjYxpKZtMkznz7O4RWa1mHXcvysQN6uBip54wvzJW8/63PveFOI8PTf1avS9yW+ravda63aa6 NP5HrPx3+Cfjrwf4yk8RyabP4T+MHhMHUNSisgq23ia3jzu1axdP3cjAAmdEyrDdIBgShb3wm8U2 3xZ8IrqHh57Pw/e2upx38cSgLD4R1xiqpcRg8Lpt8VWKRT8kMvl7sKED/X3wF+Pfh79oP4e6RoHi OZtWEV6h0fXgpttStLsA/ubiLcRbagNpKuuI7lVO0kh0r5r/AGzv2VdV/Yr+INv8VPBEFtrHgjVZ m0/W7NYdtrFJID5lrPCOY4p03FRwFYHYRtQ1vKioxVWLvF/195+o4rJfqVKOaYVudCXxLqr/AGl5 9/vPetU+GVn+03+zlaeLNT03VfB/jr4fSf2npeqhJVvNLhikAnRgeZls5UyVI8zyFR1O8uG+bP2h fCUp+MOt6XFbLpUPxTiXxJpcUDfudL8S2rN50MTA42yyecqbTgx3Vu3QCvaf2efjq3gLxPpHjfQr 65v/AAl4wNva6xDczZ86WNhFbyXHGBKC32Sd8DJe3nPE2K2Pj98Ov+EF0LWm8LW2n6xeeBox4s8H Pqdil35+lBgs0DJJuHn2wQwPn5gsFsVxkNXTVhCa57W/W3+Z9JjcvoYvDqtFWejbWt1bX5yW3n6H n37K3jAeKfFXxH8LSZk0T4jeGh46sLYksiXSKVvokHYkm6U/9cF9K+X/ANujSn0vxzapLjfdW1rq AYf8tWltIopnHsZrdz/wKvpfw/r+k+D/AI5fDT4g6FbraeFdU1lL23gZ962um6z5kF5alu6Wt4l3 GM8kSqT96uA/4Kc/Ca2tfBfhPxLplrcW6aHeah4H1SOSXzmW4tJvPilLYGBLDc8D/pk3NYTvKg12 af3/APBufGcSUJ1OH60L83I1Jf4ZK7t5J3Oh/wCCLlju8b2F0AyCw8QyakzgZ2C20e/YH2w0q8/S rPhHxFNoPxC8A+IHYSN4C+HOu+K1J5IvLu61AWrH/a86a1PrwKT/AIJLzjw/8NvFeqbcyWNvqkwY nCqRa28Qyf8Atsayb/X7fQPDvifUp4le1tdK8LeHCrDhoYbQapdIB6mS0UEesnvWlaDjhoyW7/zu dOWUVS4fwrlZJq7fo+ZfkjyvRPClp8Rf2tPDfhu6U3Og+ArOKHUI0Xdvhs4mub1RjqZJROB6mRa9 a/a6vG8EeFrfTrLUZdY+InjKW50+e0trXCW99dyrLqjxvuJkk3mKxyFC7YJVBbk0z/gml4Zn0D4f /Ev4xX4hn1ITQaDobXWNlxql3L5oY54IiKLM/wDsI/Y0v7JPw2k/aU/acs7lXnfSLKFtP0y4KEPa aXAzCe+YdfMnYyAEZ/eTTOOYxXNCne397T0Rz5ThHWwqaXv4mTafWMLpX+S29Uem6V4b0L9gX9gq SS+S1u7vxTJHNqQJ48QyKd0NipHJtmkXfIQQDBBwQboY/PH4geNdf+NfxDvtb1i8utZ8Qa5c+ZNK w3STSMcBVUcAdAqqAAAABgAV9/ftn/E3T/jD8btRj0220yWw+H1t9lSW8txd6T4OtR8gAt+Uu9Sm YKNhykZCpg+Wzx56eNE+GuhaRqi+ErW+8Za04svDGjyabb3Wu3srHb5k0yxhkO48rCEEQ/dJmXzJ IbqKMpaaRQ+Isgp5jKOHjU9lh6KSsle9t9bq76L/ADueV/Bz4Awfs62OmXeoSXbfEPX2MFjDp6LN qFic7WhsVPyi5ByJLt/3dthgm+ZSI+e+Kf7Rml/AXTrjw38NbLQbHxFPuTVPEdiou7i2J4a2tb2Q GSR+SJLlCiu2REqxjdJ2nxL1XRvhbqdxoOr65d+PPip4sVbHXLfwq8f+iIdqrpEF0qtHFEowjrbo +/b5YZEBEnH3/wATPht+z9cwW0HgXQ7rxpFu33+najNeR+HHIIGwzPJBdXSHktsEakYUlvmTFKz9 08HHRoYfD/V8LONGMdG3rLppomuZ9ddPxPMbT4N6X8M9Kt9c+I9xd20l6i3Fj4btWCapqCEZWSZi CLWFuCGdS7ggohU7xh+O/jxrHi/SW0eyitfDfhhSGj0bS1MNqWHRpDkvO/8Atys7ehA4ph+HXjP4 papd6xBpHiXxA17M80t+bSaZrhycs7vg5Yk5JyayJ/DUnhLV5bHxHpmqae8gADNE0c9sezhGwHHq DjI6EGjlSjdq5+Z4zE4qCcMNF06b0cmnd+suz7aIw7W3NxMkQaNDIwUM7BVUn1PYe5rd8OQ28WrH R9fU2lsWKCVwd9hIRw3+4eM9RyGFXLvwZHY2dvHdyWyWl2x+wa1Dua0uD18uU9VI7ggOndSvNO8m OKZdG8TCWze3QJa6gq+a1qp5UMFz50BzkFSSoOVyMqearVVSLUHprtuvNd/Nf8MeZTw86ck5/jt6 Ptco+PPh9qHw71eOC6BMcy+ZbXKfcnHqp6ZHGR9D0INdZ4bul8feHJcxxtdaen+lxBwjzRuQGZP9 4hDz92VU/vGtHwRqdrAR4C8chY9Luir2OpI4cWpYfu5Y5OQ0Z42v0wSrcfd5q+0XWv2fPiTD9rt0 kntTvj6+Rqds2VO0/wB1xkeqt6EV5TqTxEfq9W3toq8Xspry/VdGel7OOHl7emn7OWkl1i/P80yC 90RdK8QhbyYGw1Q/ZLm4QYWOQgMkwHbOUkAPq47Gt/xFavP4UtLu7tPL1DRZ1/tCJk/eCI5jlIA/ 5Z9DnvvHNa/xa8I2H/CJW2vadMk/h/xFGGs2bCPCwJ3RMvd45Nw47M+fvCn6HqkHiD4eWt/fSmIw v/YHiB5fmaKJxthucYzu2YTHTMWetYTxEqlKniEm9eV90+3z29bHXToRhUlQvo1ddrb/APB+84nx 94ekttPmEgjMljMu8o2SocGNt3fl4ww9pPetTwCV8QaklsZoFku5wEDfKSZrOSJgPYMgyPp61Xnl nmu7nQrq1MdwtlLaTBsrI1zEAyOxPZhEhC+pP0rQ/ZskF58SLTT/ACoHnvyi2zNEp2ujF87v4Tt3 c9+lehiYSjgJylvFXT8u5xYeUHjqcFopOzXmun4nOQmCw8Cac829mmj1GGPaSAHPlAHp05NdJ8IP CbeI18O2jW8Xl3Gpy3YfHzyeWgGCT/CMN+J+lYWrI9vo1nYbJESK8vYS4OA582PPHXgKOD65rufA Ah8OeENe110nh/szR3itG8rKLJLJtHU43nPJ6Hj05xzGThg247ybX3t2/O52ZfRU8U+f4YrX5Wf6 HHXSRfEP4kudzCC/vJJp3PykQLlnOewEanH0qTwlcDxJ4s1PxPeWgk07Sle8MBXCE4Ihj47AY6dN oq/r+lL8PPC2pW0qRDVXji0c7SpcO6rcXTepwphhHplh3rq/GPhCT4TfCLTdLubP7PdX0S6nrDGT 7ynaY7f0y5KcA/dRietc9atFU4QgtJWjHXpa7d/Naep0QouVSTlpy3b9dkv1PLGsbvU7ryCyx3Gq D7XdFj8tvAPmXceygfMe/wBzuRVKw0SPULm5kSWRNOtTukuHTBVCcL8ufvt0C5657Amve/Af7MI8 TfD27g1KfWdG1a9CXeo6hbWH9o2OmrgvFBfJE32i1jwUkL+WwGVBB28a2m/sK+JJdC0x7K88Paha SO503zLhP7N1uUlVM6Xi5gkI3KPId0lBwmwktmZZ5hqaa5ktbLt63t16fedNPhnF1nGootpq/n6N Hz62lvb6ILqSKRI3bFtGxyyIcnLHA6jpxz16Yqk0PkMGPO4YXB6V6J8TPhfq3gbUrnStV07U7HVr acpcw3sLxXBfH3mRvu5zwB2xyetY9t8NtRGqW9jdWdxaXEk0amOeMxsFbBBIPOCDn6GuyljaUoc7 ktdfkbTyXExnGCg72X3n3Z4J8D2f/BRf/gnTqvgwwQT/ABj/AGdLNL7QrkD/AEzW9AdQ81me7iCV mMfXBkVRjca8y/Z0+F97qf7BfxS01jBdabrlpD4k0wRuXe0vdIukiuY3GBtc2moNKMZyhHoccF+x r+0/c/sq/tp6P48iN02j2981tqUCEhrrT5B5c0ZHf92cqD0ZVPUV+i/wp/ZHPwv/AGnfiH4RtBbX nw0+JKPqXhm6icMifbrOaJkCjoj21xclT0P2JP7or5PNq1TDQWujaevft6n1OXUqUqs+ePw3t6J3 +din/wAEt9J1X4D/ALC/7Qr3xax1jwTpOvac/wA3+rlm/s1FI9QduR9aX/gm94R0O28O/D/4h+K4 rm70/wCFfhPX/Ft1BG2DN9ruZrSCFe4aRo8KRz83tXW/DbTJ1/4JvftVX1wuy+1Hwz4Z1CU9G8x4 ore5/Ez2bZ91NerfshfBOXS/2FPAuh2FiLjxD4y0vR7loWIUGGBbm8gRyeAhuGZmzwAymvncQ3Ug q0d3r6u7VvR7PufTRxEaUKlObsnJL0XJG+ulrJu3meRfs/6qn7fPgDxHoPj/AEzwx4HifVbi/sZL TSY7RNN8O6ZPA+o2MssYB8ln8kLu3EvbyDdk4Pmn/BTWSX47R+EPh9p048PQagZPEv2a5TbH4c0U hnk1K+2n5Z7gDzimN20QxLgKqv8Abmo+J/BP/BP/AOHdjo2m6VperJ4Y8OS3XjbUr23W4k1WMzut rYQq4IQ31+8smCCfKjZz0wMLwX8DrL4nW+meMvE/hvTtC+OHxJaDUdV0i2Q3PnRxtugaK3nYqkkI 8mSVXzbxOI2Ku8QiGUItSU47x1t56W1e9uwe3U5zqSVoS0Xlpq7dFb56/wB4/O7w3+wra/E7xZ4a g8QaR4oh8PWsHleC/hzo0at4j1m2b5jf3hIMditw37ySaUFipCohjRSPXPi58Gf2rP2fkfw98Hfh lY+ANGSEGaHwbYGW9XI4SbUJh9puJfUoQmegHQffHx0+K/wt/wCCffha+0TStIvdc+IesKk2oaZp dxNPqerySMSzXl6P38jE/MY1ZBgAYGSK/O79vXwh8cP2kNEstb1nwH4h8LPp7ebpWk+G/DEq3qAh gftEqKqxK3yNh2eTK5CDOa7vrElOKrTSa6br5hg8SqqboUWo2+JrV2tqk3t2/PofLPjT9tr9pr4E /EIWXinxv8VPDusq/wC9ttRv7uFxzjmOQ4Yfhj61Yuv2uPCH7ZNjPoPx40HT7TxBcDZp/wAQ/D+m x22pWknQNe28QWO9h6bvlWYAEq7H5TUuP2sviZ8J7X/hB/jLodx4/wDB7D994e8VOz3unqcfvLW5 bNxZS45BQhTn5o3HB8h+P/wS0/wZplp4x8Eapea78OfEFwYLS6nUJe6RdBd5sr1V+VJlGSrr8kyA unR0T6mhRpztsm9pLa/46+TPDzPG1oXUryit1JWaX3behwv7QXwJ1r9nv4iT+H9Zazud0a3VjqFl L51jqto4zFdW8nR4nXkHgggqwVlZRwjJ6V61qvxUj8SfBJvCviAyXo0aRrzw7eKN76dK7Dz7Yn/n hKPnwM7ZFBGN8mfLCwPUGvpcDUqyhasveWl+j8z8uzfD0adf9zK8ZK6vuvJ/5kCK0Zyo5qym5o1O OSeeKmhWLyx606JgrHA4Ireb8jChS5Wve0ZZgMRT94CfpVC90+OViV49qfJKwPA4oVSx7Ae9Yxg4 vmud1WrGquRrYy5LXbkd/aomQgHtxg+9aV1EQ5IINVLoFmyBx3rqhK54WIpJXfYq0Uu3n8KVUyK0 sjhG0UUhYCpswb7hty9Lt56dKQHPSpUGSOKT0NKavsR7M9qZsyTirONwP1pQuSMVPMbewIEgbHJy M0rQBR3yKkfAP1pjPj1pXbK5YJEbJ6Uxlye4qbzArGo3O5jTTZjOEejIyuKYV3MalKksKjH3jVHP IbjB5opwwOfWigkuld3FLsPpUhi3AcYFdh8MfgD4x+MjTHw34e1HU7a1OLi8CCKztfeWdyIox7uw ronKMNZOyIoUqlaShSi5N9ErnFYPoaNnt+le0x/sj2mjGNPEnxM+HOhTty8EN9Pq0sQ9zZwyxE+3 mVaX4CfCm1XMvxcvLjaBlrTwpK6+4/eTxn9K5XjKS6t+ibPXhw/jZdEvVpfg3c8V0k3MV/HJZ+Z9 qjYPGY1JZSOhHvXUP8S/HWj34un8Q+K7W47SNfTxt+B3V7Rovhzw5o2j/ZfDfx6l8PwhThD4eu9O 80nr5j2xlZj7nP8ASt3wf8P/AB1rKQLp37R/hSa0csRFc+JL2EyY6jybqKMc/wC1gH1pRxdN9bPz TX4s+iwOQ1o2pwnO7105bJ6dOY8w8GftGpq9tJ/wsGYeMIQwAtbvSYbi7de5+3Fknj9trH3FeoeE PiJ8IvjDL/Yt3r2qaDpskQS10/xxajVbS2fI+WDU7YrdWi+gMbpx8+4VqeMfgTfnTmuPE+n6H4ls hln1WLwnNbwgY6i90vejE8nMgYeorh7H9jzw58UpyfA3i3T/ALYT8lhd3aXQkPosipHcZ68PagDu 3eumLT+Fp+jv+R9bRw2bUrUoKNZLeMmudrz1f3J/I9dtP+CcFp8KdLl8cWOlr8SEaI3Gh+GftiXM V0Fzuu3li2m8tlIAWNFjaRs7htQiTw5P23PiFb+K0h1PxT4t0fTrGQo2l6PdHSIbVV48qGGILFCO MYEeB6HpXp+paL8X/wBnrxa2o67q2i+ANFxDb2Oj6teyXNoYYkVIlT7MshSQIo/egxyElmyCxr0f U/CHhH9vHRWttVi0C88Zxpsh1fQNSt31eUgcDy3MTX6cfclSOcDGJ5funKeDhUfNJO/Z9PTt8z26 mWQqRtlMPq9aLbcJLSWvR9F2TMH4Qf8ABVzSY7xbDxx4SvPE2jTR/ZbmbUtTbUrySHIODLIFmyCA w2SxhWAYAECvtz4ZXmh/tC/CSXXvAOt6R49tJY/st7oerKst1eQff+zXkTLh3G3KTBNwZRIFLK3m fkL8dv2X/FH7PmpSrqFu15pgna2TUreNxEZB1ilV1WSCYd4pVRxjOMYJj/Z1/aL8T/s3ePbPxB4e vGt7m3OJImJMN3HkExSLn5lOB7ggEEEAioSqUk1DZ7roZ5N4hY3LsQ8BnVO0Xo9LWv5bNeaPvK08 IeH/AAj43k8N3lnaadoXjt5bfT7kQrZ2t9cgbZLG7iT93a6gisEJhCxTo8UiqG8pz13gLxNqeh6v baPqET6h4o8H3xeATJh9WRoyjwsCDn7baq0TAZ/0q2T611Pg/wAafDv/AIKV/A/VtT0+zEOrXkMS eKfD/nr9qSVM+Ve27Hj7RExJjk4EqGSKTBO48Rc6DqPim/XRPFWqmw8e/D+2E0+twQM7+KvD6nK3 8KcO13A0aB0OGEka7sEzEehhKq/h/df7/wA9j9mwFajKlH2bUqU1eLXTrZ2/D5pnkPiz4bW3hqx+ InwtsrqS50/SZf8AhJfB8+T/AKRpOoeU6AE44S4SwbHb9+ePmrpv2mIF+MXwG8d4jVpPE2k6P49s 1/uXItSLrHHXZDOD7mtz9qawsNIi+HvxU0y8i1bwxM8+l3l9axeUosLwtHdRmPJ2Nb3EjuqEkKLi HBIAY8raasvh/wAN6NYarElvFo02peG9QCNuC263UVwVBI6C3urlR7IewrWFOL54vZrT79PuuzwZ YCk1WwUmuVp29Ht9zbXyLfwc0XTfhx8CviNHp1hHp1v/AMIdYTmGKRnDzXWladNLJliSC0gdiOgJ 4AAxXzV+0V4oa1+Dum26TbpPE+uanqQ6EmBWhs4eR6fZZh9GPrXu3xD1CTwN8DfHNveu8N7HpGja Q6DP34tLihJ9x8n5muf/AGbv2adO/aP/AGkPBWi+Ii8PgrwD4bsb3W28wxiQSq188W/+DJmlLHqE ikYciuevNulCmui/X/I+az+FWpgqWX048rtb01av5WSZufFjwRf/AAU/YP8Ah/4Q/tLSdB36fPr9 7DdXJhvNSu75UMxgiwd7QWHkRfOVBe5kVSXQgezfAbwQ37O/7K8ED3Ufhbxh8SrRLzVdQJVZvCmh Kh8mCJjwlxJEsj7yP3SCWUjdsDeO6V4ssv8Ago5+3vqPjTxBZWuj/C74fQm/vxGjLCumW0hNvAV6 b5WIBVcFssQCc51v2gvHeu/thfH2+8GaRDLbm4mN34ikKgrpNshVltHAO3cgSNpRnBkSOI4S3BOS kmuZLyS6v/I7csnBw9pRWmlOmtfesrN+Svu/Up+CfHjapqaP4Isr3w54F0ubytA0Syne1n1mdVy2 oX0xOXmZTv3yErbQspABaJZOF+Pnxw1GLxlf+EfBco8TfFHxMDaeJPFECCMWUAUg6ZYf8+1uqZ86 XIdwGDsoLqe/+I/g3V9A8ISjS7uw8LeEdMX7HdazDfQX93AoYMVWON9xndnDDcVWMt5kjK7RiLzL xN8SvDv7MmlC00PTL/wxPJEM6bDdFfEOt7sHzNTuxhrW2OARawhHkHLBMq9KcUlyPp93yOLP6yw+ Hjhak+WO8pbb78q8+/3XZwXhzwDN4Z8PX1r4dvbbSLdR9l8Q+OtTD28KBh89nY8GRgV4PlqZZRnh Y8g8m3xZ8L/C5HtvA2hwajqC8N4i8QW0dxMx45t7Q7oYR15fzX6EMp4rT1TxR8WP2zdfGlRw634o EDedbafbQtJbaVGoxlByIYwMbmJAOMuSea9C+GP/AATfvtUsE1LxXqf9laSsoiluUQQWfmd4lupc LNLkH5bZJ8/jSjBXufm0sNjcxqKOS0mobc0kkvlfRd29ZHzn4v8AiJ4g+IF+bnXNb1TVpzwHurl5 Co9Bk8D2HFdB8Nfh9rnxB010fQLvU9Ehkw+pmVbUacxH/PzKRCBgf6uQ4PbB5r7h/wCGTPhX+z9a 297eeDbKF40eRdT+I+tSabDPx8rQ6ciC8nUZyD9l2t6joee8U/H/AOEE9/bWba9ql/dW6LGDpljD pltGP+nW5vVnkReo2COE56EDpz4qvRjBuTvbXS7a89P+CdFPgx4eTq5rik2+id7+rlZHgXgL4Fxe BrbVr8eKbbxJo0Q26jo+k6YurNdIMEmaAzIoC5/1sMjlf4XFLpnhf4deNtCksvDGkeL9YvLaZp20 G91OKDUrWENuZrJfIPnrt6x+cX4JKk4aveNd+IGuy3BuPBOhaNrc1kQbW31fxNqtxfyfLklN1xFb u4P8KLg54zyK4Wy/bfvovE50nx78MvBkWsaXJ9oSe/8ADcjy6cFy3mSIGW5VV6+YkuAOdpNfN08w p4jnnhqi51Z6LWy6yjfX1SXY6quX5fQ5IU2oxd1qnJO/m7pHj3iq78J23hVdIu9E15PD8s8h07UI dTS9GnTEfOoR4Y3Rs4MkDsM8kDO161NFRfih4Wh8EeKbi2uNXs7f7R4b1iBmuZbmAjPlx7PvsMDM Zw7AbcB0GfTfGP7R/wAOvHWsSzeKfAOl6VL4jCWtxqmkahPNp11Epx5/3z5jL2MqtIg+bkgIfOPE HwR8N7xH4b177DLeN9p0qLVLxWtZWyCstpqUexBLhRlJ44SvG8ggVck6yUKt4zTvGSWl/J/g118j yMXh3Gs3QlGrG1pJWV15qy+XX1MjRb2PxJ4N1fR76eCB0nWXWV2747K4Q+XFq8PrGxKx3CqM4YPg j7uF+z9aR33xYHhrUWZ7LxKsmk3ETMVE8jAmHnPB80IQff3ruI9B1T4heIpkNjJpHxo8OI0s2nzx CKLxjaiMmUbDgfavKJLIPluIySvz/e8j8Q6nG2pW2o6TcTQQEJJZDzN02nlDlY93UmNgNrHll2k8 5A7cHh5VIVsPs5L1tLuvLs/K2jR8zj6ypSp4hL4X10fL2a8uv/BOyX4cX+geK7CTxBCf7Ru72502 YXMmVjuo4YpIXJHZ1kjC56jmsj4CN9h+PnhIDbGTrMEQDMCqbnCfMemBnmvavjhrSfGn4JWvxD0y NLe/vrS1vdUSPnyNY0yZLW446KJIdQs5VA/gh/2ePHWtZNP+Iuj+ITCLex1e5j1izcjcsnl3AMoA HdZFkXB9PcVvSlOrh5U62jlFxa80tUvl+RwuMfbxnT15ZKV+6bVm36r8RPiF4Vu/BHxFubbUriK6 YNHqEYjyI83kSXIwP92Vc+4r0XS9KtdZu/D/AIYdYWimuLY6t5iH57azgN9cHI4AZnKn3CjrxWT+ 2LP9r/ag8UwwrGLfR3g0+PAwFEFtDBn/AMh1s/s/+B7vx14P8V609wITq13ZeDbOSRsrv1C5T7UV XORttkHPI+b8uXNKN8NTqSdrJW9dLP5as9fKMTHmlTt8Tb9Ut189EjmPgnoEv7Qfx48N2NzCbfS7 SabWtXfBAt7VXa7u5yc9kCqv+6gra+IPiu4+I3irUfitqllBHoov5Lfw1prKQL6VT+6VYhwIoz+8 kPRm+QA5OPVfgL8PdN8Z+Bfi94lS9i03T/EM7WNy8DiJtJ0VZXkcjdgEywwvAAM4M0JIwxrlLDx9 p/xn+IdhbeHvGeueFlubePTdK0Oy0WZreFf4Y/3cpLnPJOzBxyOufIxOOVWs40o2jTVpOz0W72Ts 2+vRLzR6+X4JNXqzvKb01V2+lk2rpK3z9Divg5o3iiLxYZ9Fubr/AIS67vRcXd2J2huJJVYSvGk6 ENGEz5k8gYEfLGDkgN+jP7F2t+F/iZ8OfEXivxc9x8PvBiXMdhe+J7qyhnsPGdypB+zSaY6kXj8s 2SrSoCGaZCQtdd+xp+yb418aeIfCfhfULr4UeOY76GXUNemv9C04T2lou1QsUixRS4ZGDszSMfmj HR949c+IXgvwn+058Qj4F8X/AAS8SfDv4WfDFZm0HXbWaRNFFpG4DXGEYI0krkbBl2O8FsfNj43H 4+nmCday5U7Jp2u07Pe10kv66foWSYV4GSw927q7vZtLpZa6vpa9z0zwZ8BPg3+0BbWmkeHfhfov ijRtzTaJrGoXkur6Y8AX5oIZ0cNZMv3vstxhR/Ceci38Rv8AgmH4K1fwZb6d8RfCOk2M+jyiXQNR 8LJeX8+mYJZI2jkaQmM9TArso6pjqdDQ/hAfit8NNJ0b9nXxRD4M+HukOwvJxpqywazIMCWW9kkK tJ8pI8t0ZcNnb93b7T4N07w38KPD9n4Uv7/Q/EzsYJVt7+aaWAR4DGW3Qq5hiVwdkbO+3IIZBha8 yldO9k4rrolr2srvtcrF42pRl+7m73+HVzWu7bdk9rrX7tD8sfi//wAG5Xif4feE/EHjnS9Rt/ib awQG+0zRdPSWxuL4sC5+0hlEke1efKXDyH5QyHGes/4JsfGW/wDid+z/AOHRqsBtvEHwi1uPw7fb ovLiTTbqTfp7Y7eRcoICOoikOSdxr9RPDWt6n4N8Wxy2mn33iHw5fXcQs5tNuJpNS0lpCRJ9riuG 3G2GB827njCLjdXnfxo/4J6WHjH4ryfEzwJqcK6R4n0mfSPEGjWjD7FdxTcm6twMKJUmCSt0Ysh5 ya9qvOeIw/Jfm20e6ts9tV954dLG01iG8Q0nLaWyd900tE/uVzwLxV8AZrr4D/tK+FNNxb/2xJaa Raoy4VRNq0t3Dkegj1Acegr1CCym+A3w3uLi3jURaDqI0CEEHyzp+nxWtgsQ7j7TdwpH67HnPSuw +A+kXXjjxDeWGpQrFN4qn0ae9L4wt3YpcC4U/jZR49sVn/E+wm+J/wAQZHzBF4M8Cb9Xls7p/KTV NUkZvItpCOSivJHLJgEhpWUAswFcNKi1QUl6L5Nu/wCJ0yrN4h0KjVk+Z/NRSS+at/wDyj4zaFJ8 JPDGna/r2jr44+IGr6tHq3h7ws0Qlm1nVXj8u1uLiMci3tIC0gTo000p4AU0nhLxzqX7Idp4jJsL /wCLX7R/iW2F34x1eK6jtdJ8HW+NwtZLxv3VtDEDlguMnOCMLjqPG3x1P7KUa6nc6VF4j+NnjOCS eObU2MT6HYyMBJf3RUFrSFjsSK2j/eFUiTl8Kvy98bLvVNY0qW2+IMt/qthbyrqCeCEmj0mG/lZi 0d7rsmfJsbctgxWjlpnyGcTSEis1Wp0JcidpPW27Xq9rv8F5np0aUq0VGdnG+9/it0WzUF/5M99F Y7I/HBLrwJeXGn/ENtNtruN5tX1fwLoSQG9KnLw2l/esjeUpOJL2R2UkH95HwjfOfjf/AIK3/DL4 NaQ2jaU3xN8WatE2Lq9tPiDdBpWByfMvPJUvg/wQIIzjO9+tefftM+JtC1eZLj4veL2bTolR7Pwn pEcunafEFXCCO0GLy4+UELLcm0XHCMVwK8i1rxHe6jplvP8ADb4FeGfCejRqFj8UeKrSHdLzkOsl 4wtVPfB81h03mu/AYeM5KU7v52X3vf5I7cRjZ0Y8sLK/Rbv15bX+ex9Z+Cf28fhB+2t4cOkfEP4S fErxLouDG2o3KRa4+nFuN6XwiguYiDz80rr6o1fOP7X/AOwI3wE8C+LvEXwR8U2PxX+D+t2yJr1n FKr6n4XkU7oGvbeMkxtHIflnACEFlO0OynwD4vWmt+K5kk8Z/GXRNTdFLR2Vvc3eopBwcJGsUXkK O2EYAVyn7NH7VPjD9kH4w6d4u8G6s0N3p8jJJFIm+11C3biS3niPEkUi5Vkbgg+uCPp8Jl80nKlJ PZ8tnZ633dr/AHHzGZ5zSbUasOVu6un301WrXrfbozzG1VHhls5cI0rZRm6Kayrq0Ns7K33geTX2 1+198BPA37T+gXHxa+C+mW+gTzWb6vrfgy3JK2yJj7TPZDusDk+dB1jjKTIPKdhF8Z6hAbqASDlw cNX0uAxca0bx0ezT3TPz/N8uqUHyTWqV4vunqjMA5GOPapqaY8Z6jFIY8tkfrXoyjc+ep1XEnuCi RKT1qJ5Qg5OMUhjJ960vFfhK58K3NrFcgH7XZwX0TL9145o1kUj88H3BFY8qTUX1OmWIcrtKxjyy F246VDKm4e9bngLwz/wmHjzRNIO/Gq38NodvXDuF49+areKdNht/GWp2dgrywpeyw2yoCxZQ5Cj1 JxitlTaVzGpCbo+2ezfL53tcxvL29ulRuCIyeRVh48McggjjB6it74W/DTUvjB8RtF8MaRGZdR1u 6S1hHZcnlz/squWPsppuSS5pbHn2u7I5cDclMKlmxWx4t0RfDvibUdPSZLhLG5ktxIjBg+1iMgjg 9Oo49Mjms1kIQ0oyTV0ZyTW/Qi27D1NPTI55x/Om7D7Uo+VfehxCFWw8ucfSk809BzTE+Ue5pduB 1qXFI2VdtbiZLHNNdSTTxgL9abQJybGlPSkZdpp9NKZNBPNYQgZ4NRhecVLghvY00jBoInK5GAB3 xRTwvHTH40UEcxrJGynjt+ldt47+Onib4j2tnb6vrF1c2OnxLFaWSYhs7RVAUCKBAI4xgc7VGTkn JJNcjsPtTgmV6D8K7p4eE7OS2McLmNegpRpSsnv5j/7Qe4uMu2N2FLEZCius07xX4Q8LwhIdAu/E lyB80+p3b29sx74hgKuMdiZTnHQdK44oc8AU63RVnUuCyA/MoONw9M0ewitjswmc1qUm1Zt9Wk7f J3R6T4V8ep4t1gW2kfCfwxqs6At9mtY9TnbHrhbnP416f4S+EGj6hAbnxn4L03wjAijZbad4nS11 GYnuIryV1QepfHsDzXh2ufFTWtZ0ldKtp/7J0YkbdN08GC3cjozgHMr/AO05ZvftWtp37Nviq4tY rjUbO18P282CkutX0OnGRSM7lSZ1dlx3VSKhQjZtxR9xlOdyU37OlLEd9IpJv0i3ZeqPor4f/C7w Jps1tc6LN8QdL1tATFJbeKtOnRMZx89mGmXjHSNjx0rq/FHwo1+8gW41Twnr/i63tyCNRMVvrN8o B3AZaKzv1x6hxXyvH8ALeJf3njzwZFIGK7VkvJce+5ICpHuDW14U8E+JvCN258NfErQLSaPBBt9d m0/zeexlWMce+Kh0KL+yrr0v/mfaYXPKkYJV8E0u6cW/mmj6K8D/ABNs9CvH0jS/H76Qs7FLjw54 1tGurCQEHMbxXf8AqV6dLmQ+1ZvxQ/ZA8K+O4H1J9AvPhnqrjzF1fw40mueFrtsbt7RoPtVopPdV kQdlFczp/wAXvjhqWki016w8K/FvTIiU+z6glhr8q7uPlmiY3SfVHU1H4N1Se08QSy6J4P8Ait8K 9YTa040CK41LTt3YPaz7ZFU8/emfjsalxml7rbXZ6/d1/E9hZhhcXGNLE0ZNdOZNNej1X3Sibuh/ EX4sfs9Na2njbQbP4u+AdZKaZDqFtcLqcF6mcJBFeoHyemILgNsPIjVsEWfjB/wTa8PfGWxm174D 69pmpaskRudS8BT6nBLrGnf3hDtkZZgv9wOzD1Y8DuvB3jL4g6HeTX1x4Wj8UrcpsutS8OW8mk6r dx4+ZbiynjRboYPKGJ06896Xwv8ABD4ReKNfs/EmiXd74V8eu7T2uhxXcmiYdGYeZNEN8kTFww22 5x8oIQDg6U3dWa/r1/Q9OfDNPG0Fhpv2sW9FN2nFd4yt73pdo+MPAfjDxv8Asn/FaO8to9T8NeIt KfZNa3MLROR/FHLGwBIPoR71+hfwm/aB0f8Abt8LWFxpN1aeGPid4ZP27TpJnysFxgIY2B5a1nX9 1IvPylM52qDJ8bvj78O7uHTPB3x7+HWoXE7WyJb+MXke+s4piQTGksQjn2KuAzh2bduzE4C55m8/ Y/8AAvwQ0Ww+IHw5U69PqDm5tJL7XW/sm0iyQIlurcRlZXHGbgLGqtiTazbaU6bu3B3t/T0Fw9lW NybEzwlCr7XD396MrqcdL3S/y3Oo+CvwZb4haT478DzT6fpXhv4hi7On+G7qVjqGia/axBry2hXa UZQhGMsGdfszKG8sgfJ3iT4h3cWg6po2qt5eqQCO1vQ5yRdW0cthKRkjLPDNDITnkqeuK+q/GPxS tvjnoNx4g8Pf2v4J8feBJ49Q17w9f/Nf6f5AQ2+s2z4BuBb4CykJvNuxyDtEh+Zv+CjGl22rfEzS viJpdjBZ2HxBtDNeW0Tgx2GqQ/urqAY4wHAZT0ZGjb+KoVVyg4x6frv8r7HfxPjIUcJ9bwkrqO+l tG7O66We3q2eiftSfEx/FH7BngmC3jQy+M9ZtZrqT/lo88OmWUDjOM4Zyx69ar+PPiEnwN/ZD8Za tZuItd+KN++m2ZHyyx2r/KQP9lLOKJf93UzXnnjHWR4p/ZW+BenrONya7fxOxOAjCSHGfouPwFaf xJ8bx+K/jX4dt4oftGnfD+0iNnaFBIs2pTAPGpT+LykWFSpyG+yBDy4rsq8sXdveK/Fa/qeLWx0q ilOL96cYRi97Oau38k3956J8OfCOp/BP4L6L8MvDEVvJ478Q3C6trEjsES3vEj3jz2OAlvp0JEjl ztFw5zkQsK5yW80Xw14Gh8KeFpL++8J3F232y8tN0Oq/EzUVzkISN0WnQnpuGOS7BpGCp2978A/F uqWsehbLZdY8W2/mX9jNq0aav4ijQiVNNh53R2u4+bNM4T7RIGKb/kzL8PP+CfnxR+N+r3AbS5tK 0KTZY6heWEkEclwgHy2MRDFLG0QYAVzvfO4q5+VeecoPfS2mp78sPVpxhCjTtGCUY62tprr59X/w z8WsvEHibxt4zOk+BrODxB4xjjEJurBQuieEoQxIjtSx8vcpzm4ckbyzKXkImPdfAP8AYR0bVPEs zy2cvxg8WLKWvWFzJa+GdNlOCftN4P3ty+Tny4sMxyMV9Ryfsb+FvgH4Zh07W7bVPFun2RYP4M8D P9mspJFU7v7R1Anz5sj73yRDjguABWR45/4KIeGPhr4dm0m60vwNo+kwxmG28L6BYPci2TBGx5Xf JPdv9SSSfvYrl9tJ6Uo6d3ovlfcdLhunP/a8yako7OTtBeibu35tfcQ30fgL4Ezw2firxTbaz4gB /wBF8JeE9KT7PauDkJDpsH7neM8S3rSu2ASgIzWd4q/aE+JHieK7n8MeGY/A1jt3Sat4j1mebVZQ EK/P5Gbi3O3dhVaKMA4wBXj9h/wU2sIt+meG/g/4J03S7lnE5srSS1v7nIOCZICoO3qqyLIAfWvM fiV8Irz9pyBtR8Ia340udat0LDwv4lkMs0nqtlcqqRStgcRNHE5wAglPFKFeMXatfT7jlxufwo4d /UIupa+kbJW73au/kjs9Z8S+ELbUtviLxP4Z1Ge7lWSSSz0/TDIWxypkKXk8hZs/fCsc881g+LNK 8I/E6Zj4U8C/C3xY0DGJvI8QXVheM+CcPGotofXoq88egr5n1D4X+KvDRS5uvD/iKyUEPHcNp08a ZHO5X24yPUHirMHxd1RJ0TVU0bX3hG1P7Xs0mnjHfbMNsw+oetJylNc2DcWuuv5efzPy3F8d1q16 eLw/LF9Gub53knb7j0rT/i5pnwL8WPYa38N9a8KSh9rWVvqsggbGCcRXcc8cg5ByvqMMK9LvP2iv AviawivrTWIr+zgJkbSdctZYL2xOCT9nuI3eWIcAKY5WUs2WhCg15x8Nv2s7XSdNbStUstfTSPLC mxE8PiHTXfP3ms9RViq9c+VOjdOa7bxz+zd8PfiT4YsNZ0ibw9oJ1Xc0GoadcT6XYXDL1T7NeGSF JF4ZoY7pZFVlOwBhn5HM4UHVbzLCON9px1a83bb72a4HNK9WDjhJwndaRlHkafZNJJvbdGJp3gP4 fftA3moWGj3tzoPiC9TzLa2iWJzqcgwNm1cW93L8x2mPyZ5G3cZxv8yi+HHi/wAC2mo2OnR2Wv8A hvU2eOeOGXzLa7miUSFArYlgulQbgpCy4BA3jr6f4I/Zq8R/A11v7+4sL7w1q8hgvYb1JbOzvIVy UuLW/QSQx3CcsjFkZDwd6MwboP2pvhl4j0XSG+IXh3UJ7iWyEd1qd9abVGowsdkWpqyFlWYECO4j VmVZQkybo51YZYDH0aOJjhqNXnpSslzdGraJuzX9fLz8fga88NLFVqTp1IJ35bXs+tr6rv8A1fwr wl4ltPiL9i8LX+pi2iQZ0HWNQmEE+i3AO5ImmHHks/qQEZg42neGh1vWL7wp8WZ5/F3hzdr1nPs8 Q6JdW4tl1WMoVeVQABHKyEsHUYLkSjOSDv8AjL4O3Pxy8Pf8J14E0G5vY7gmLxDpOnRCV9KvuuUh XDGG4XMqBFIUidAAsO46/wCzrruk+LNA1PRPiXpV54n8M+DIhIYIC0Ov+HrdnEUs1rLwXjid4ma2 lyoBLpt2uG+lx9SFGDqwXMkrOKa51ft69tO9+/zOAxFbFKNOtdO91JpuLt0l6d/lsdN8EPB1vpMX inwRaXn9reHfFdnDrfhvUpxgyW1wsmnSMyqcLPG13H5qnhWsScAbWrzK3WHxR+ypNg41T4d+IdoR gVkNjqMZ3Z/3bm39Rjzfeu+tPC0v7P3jPwrfWGu2vjL4UeKL6eDRPEcKtFHavOhguoZojzb3axuG eFuCUSRMjmuF+MT3fw9+LvjvTEka2svEuTeWsYGwh3S8ijZSODG5T3HNc2Gi8TGMoyu1Zp7PT3ZX XSXK7PzFVlHDYhpx9ySaa6K+qs+q5ldeR0H7dHgk+Df2lvEUyOstt4h2avbuG37lmJ3g+mJFdcew 69a7/wDZ88UroH7NduiROLfRdQ1DXgxO9nubXS7vDYHQCW8s1A6nYD1IFXf2ttfs9S+CWm6s86Sa v4ju7exQAqDHbWd9rBdmHUruWA/VfarHguw1j9ln4Dwa/qVjp7avPYprOnWN0nnrHJqM9m9p5sYI wWi05ZGTJ+V8MOSK8mWPdfLlSqJc8Zcqu/iatFv0u7M9qngY0MaqlJ2hKKlLTZfFb8DlP2lZNZ+A 3wE8LfCExSW2ueINvijxfFD8wgkOIbTTFAJP7lIA8gJ5mbpgcy/sgfBS1l8SXRvmmjnhtLi51Vre VEk+xxbfNtYJc/ud5ISW4JUYbykYbpHXjfGc1947+O95Pf6ylvHp80Vvd6tfDzzmBFieUrz5jyuj MF/iZznGSa+3Php8VvEviDQfCnhP4a+Kb3wdouoGTUtZ8S3N0tjJ/ZdsfKMxACxI0rrKUjVAqeSG 53B65M4q18PhaeCopOdW7nJbJ2vq7dtLb2PVyKjRqTqZhXulDSMdL2v0W9+tzZ8O2PjT4VfsKa47 Nrmr/Ef4/wBzNZ2aaFpVzONG8L28gSWCzHljyxcStJH5jhVMUe7klFP0f+z18CfFn7GP7PXhKKz0 XxPLrupL/bP/AAi9neSgy3MibbYak6/vDBFEd3lKu6WWWXhI0QV47+z98WPEX7Q/x71P4teJvin4 rv8A4c+HrmG00fQ9KvdTjttSSKN1tbYBxEkxPkmaZkdztEgwXZSPbv2WvEfjPSdV1f4keOfiF8ZN buL28urizttQtm03S9sQMkksVnNKP3Y/1cW4bdxBC4TB+RzOUYp0Iv4bbKyV93bvp1Pu8ppSpr20 l709XFvVvor67bv5Hvl/4l8U/Cz9nnw9ffFnQ9R8U+J9YX+0DoujaJc2w0xUlEkEFy1iMRwx/eMe 1mkdsHiPNZGn/t7X+kodXl8WeFNIvdYVLjSvC/iKzk0fyecGVrx4RIAQG2CePL4yW2HJ+e9H8f8A xO8UeJ9R8Xan4n1/xbquqzt/ZOmrY6PKs4O8Cbymk88QRMOAGUMw2DADEemfs++Ef2gfjH49t7bx 1pU40C6vftF7LqulWkO+BctKViGov/CMD90QCRkYzXl+0nNWpXT0tvd+b6362PRhl9GNNzxbj1b2 S72in06XVn0ufVmk/tT3Hwx+Dlh4j8X6c9jfeIZPJ02N5o7rzUwNzm5RmjdG3Dy13qWAIBQdOq0f 9sHwT8Kpo9N8S/Z9Hebyk1O8tFY2VjcSDIE4yWhbG3LP/Ex5IUtXz5aanqHxS+Oltq09p4F0jwv4 M03zRHb+JUhuI44VMggeK2maMwCQpGfMBXGTjpXyF4x8CeK/GHxavdQ8NeIdOvfF+rzSPPb6TPJe LdGR8mOZFiWFkbPJdB23NWizLEYWzp+8lorrV7Xb6u7dl2OKlwxl+LUvbe67cz5Xor7LqlZK7v1Z +vmh/DKx8N+LtT8T29xZ/wBkXz/2lbTJtZInkgKySg9MYJbI4PmGvk2b46aRr2uXTeHhH/wgvgFl kutRvlIuNe1Ulvs9sGGXWEBjcS7R5knnxxgAyEHmv2c9M+J0XwovPhl4u8Y+HdOgieVYNLsp3+0W IWMyTW6zyAIYwjE7EMmwnAOOB4L+0X8SPE3gKPw/4P8AAPw91VPCNhvME0enQX82tyuP3spkmVo8 tyDsQsBxkDAGmJzmM3GFOHLu7PvpdX2sjlyzhq05utU59UrrRKK0Tta93qlbbV3N7xh+2xp/w+1b xHDot0NY8b+IpftWs6pHEJ7zfjAwybvL2AlUSNligBI8xGJnPhvinwt4++LOlwalpMWr2dhJ5khu 9MNvDJE7Eh3Gp3LrZWbNn5ntvtFw3IaWStn4a3ev/DnWbm60n4BR6HeXE/2iNr0QzurHnhbiRtmD nbtUFRjniu98T/tX/E2XT5l1fUNH0KWOH92NQ8Wx2Tgf3R+6baPqccYryoTnCopJX/Hc+1jliSth 4xV+7108ku2x8p237P8Apvw6uGurTUhp168rNJN4L8JXvi7Wp3PXfql8sNtHJnq1tgZrjfiD8FB4 hup9Qt/gL8aviVqP3f7S8Y+J2dpD721qiuB7eccV7V4z/aY+JviK3Fla6x8Nb+zgcvFFP8Tbbarn jcFWSHBPtg153fWHxy8TwzvD4T8J+IY3Odtj8Qbm9Yn2SPVMk/hX0uErYi/NKy9Xb8Uzy8TltNxt Jvd9E/w0ufPvjOy+IHhO4ksI/wBm7SfCsgyVWXwnf3kie+67eXI9+RXjfxJ8V+KZNLksdZ8OaJpS ynHyeGLSwmXHo6wq4/A19I/EyH4yfD7zL3xJ8GvFenWarn7Wtz4gWJOeCJftTJ+teReJf2h7/VdD ubeC48ZabeyKUMf/AAk0txbOD1DwyIWI/wCB19dga9VSTjTTXdO/63PiswwdKcJRlVa0enLa/wCH 6nkngL4peI/hB4h0zVtA1W807UNIu1vrSWJzmCVeNwHTkcMCMMOCCOK6T436r4c+I/xHg1nwlZ2m ix+KkSW80gL5NvpN8xxNFETwsDPl4+fkVwh+5k81qfh25ijtpZ7eSJLxDLA7KQsyhiCVPQgEEcdw RXZ/A74c+D9VbWdZ8eXviGLw9oEEcj2egQpJqeoSSOEVUaQGKKNBlnkfOAEUKS4x9M6NPnVWOktd ut+/6Hw169NSpVU5RVmr3urdvVfI8m1zw9deHNbu7C7gmt7yzkeKeGRSrxOpwykdiMGvSP2P/hdo vxx+MVv4K1qYWY8SQyQafdYwYLxUZosn+63zLjuxTivc/wBrv4G2nhXQfDXxG8AeID4qsdPsYNT0 3Wnt1im1fS1kEK/aoclVu7ObFrcx5YMpgcZVyxh/ZJ8B6f8AD34reIPijpmj6ZqvhbTvBWr+JNKt bkLM+k3P2WWOE7W6m1v9se8ZIzCxx5iE6YqqlTVtLrR+fbyZ5OOwKoV06bvCSun3T7+a1R51+yx8 H9I8I6p8SvGHxD0WHU9M+ENg4l0S7LrDqesyzfZbOzm2FWMYl8yWRVILJbOMjOan8eeFh+1Fqfwv 1DTdJ03w8ddt7vR7mx00MttavaTtM/kq5YgeVcowQk4xtBwBX0j/AMFZbHRLn9mzwj8RfByQwaZ+ 0Dq1v4y1yBGGbW5i08W6x4A6G6Gqk5P31bgcZT9i79kf/hDvgf8ADXxH4s8VaF4Z8Qf8JtBqWkaJ fCRpriz1SwkjtxMyqUtmujYsYfMOHwhYoHVjw1K0pU1VWkr7fK35u5xJJSs9f6/yPjn9lLwT/a/x R0vU2JEmja7pKRqTjdJLeIuD/wABV/y9q6z4VfA467+3/c+FdFiUtpGoXssAnfCLLbwySBnb+6JE BPtXq3/BMLwONQ8b+NJr21Md1p/iDS4DbSpteORmv+Np6MrIOK534U/Ej/hVH7S/x68btbtNcWEO oWdoVPMc9zfLHkH/AK4if8BXs0qklh5ySvJPT7k/zPqsrpR/s2E+W7VVtafyxb389D5c1vwc8Nxr 9xZ3C3emaNd/ZzdudhnLyOse0f3mVGbHYK3pXt37ICr8DfgL8UPjLcIo1CytV8E+Ei45/tXUY38+ 4Q+tvYpO2ccPPD61h/D7wHbeJPgFctAn9oXFoWupoA4U3Wo3ky2VhajHLSIiXVwF7hj2zXqf7WHw ae28b/B79mDwSw1DUfDVml5rtwp/d3fiDVEiuLuYnj91b2qWkQJ6LbOxwSa4qleLXJN6a39Fvf1P i61B00qzfxapdd9Lny58NfhT4g+LXjTR/D3h/TLjUdU166+yWUajakjgAuS5+VVRTudiQqKCzEAZ qx8ZNF8PeGPGM2i+Gr/+2rDSR9ml1hQVj1acf6yaJTysG7IjyAzIAzBSxVfpL4xfEPSP2b/g1q2n +EpRNqXjizfwxol+Qu6x8Nwuy3tzDjo+o3YlRpOrRQTgYjmCj5e8I+BdU8e6lJaaVaPdSwwtczHI WO3iTG6WRzhUQZA3MQMkDqQKqhVdSPtpe7Hpf83+RyO6XJ1MWC1e7nSKJHklkYKqKCzMTwAB3Jp2 qaRcaLqEtrdxPBcwNslib70bDqrDsR0IPIOQcGvd9H8Dax8Ar/SPDfh/SdS1P41eLSltDHbWzSz+ HlmOxLa1UAl9QlzhnUZgBCKfOLmLb+JXgjR/+CfsUWkkWXij40TR+Zd6goW40bwUwJDQWrYMd7qC MCrzjdDbuCsfmSL5sbliFzKMdW9l38/JIc6LhpNWfXyPnjxX4K1XwPfxWusWFxpt3LEs4t7hfLmR GGVLIfmXcMEBgCQQehBrL5AFX9S1G51rUri8vbie7vLuVpp55nMkkzsSWZmOSzEnJJOSTUHlZHAr qSlb3tzFNX0IQuaTGKnMfGfWmsuQf5Yo5CvaIhKDPSm439hUyrsGD/KkKelLlBzIth9qTGam8smk 2ECmkQ5EQGBRUuw5ooFzG5hSOSKesQYVEV3U7Yc16XMeVFeY5rcFeMZp1pp8t9dJBBFJNNIQqRxq WZyTwABzmkVe1el/Bz4farLo0ut3Wqw+D/Dc7tbya1NGWuLjAG+G0QYeWTBwdhVRuAd0DDOdWrGn G7/r/P5Ho5Zg3ia6pu9t3ZapfPRerPW/2X/2aL3RNBm1e9n0fSNYjYtK13qX2ebTYh/z0ZEke3JP JCqJto4aIHLeqaD8BtHFnJqlz4ye1s5G4uvC3hSBLZ2Byd2sapPFlvcSSE56V8/a/wDtW2vgnw9Z aB4C0WDS9P0wll1DU40vdQuZM8zMGBhiY9RsTcvTzG615h4l+Jmt+O9VOoazquoarekgtNeXLzuQ OgyxJx7VyS9rUSdOPL3bet/JLb5n7NU4uyPLaFLBYKm5OEVd3sm7au6td/gfoD4b+HPwoh0WC98Q fGn4saFp43A3beKIpYSR1WJYYGV2GRkRO/XqKyNa8Zfs76fqptY/jj8fNbikURiaO0ju1Yf3fLuD Hkf5xXwTrfi+/wDEV8Li+upLl0RY03E7Y0HAVR0UAcADgVa8KXWrxavDNpMF3JfQtuhaCJneNx0I xyCOx7GqVGpy+8zD/iIFKpVjTwtB26vVt97W28lqfoNqmlfs3eDfEUZ1P4sau2omNdtrrvw30y5u NPfu07RMRvUD/VsxwSNwyCtd3Knwp+JYuP7B+PWm2s83lkHUtX1HS0lUAfKbdfNt1HOAojKgZAGK +G/CX7CHxC8S2dpf61pOr6THqBEkEB0+ae+uVYnDbMBUB65meMEHIzXt/wAKf+CT3iHxVqkcV1oO rw6ciq13qd/4gsrWC1BIHzRwLcMD/slsn8DXVBVYx5Y/l/nc+6yjM86qrTCcsJNNc2j9XdPX5H0x o37EnhzxDapNoms6fqF2y74dR8M+MRBIzZ5YIltbnPcZVq5H4z/soeMp7Fbe81u88XWdsnlwWfjb SbbU5QfSK+ieO9QdMbB/OqXgr9gfwR8PfGF5NeaQknh+yTYZ/wC1r++vrl+QvkiJLWJdx5O4ybVB PzHFej6Z8aNb8D6XcaboU+peHLKRsiHStJgkTbwDlrl55icf7WM9BXT9Vqyi4yVvXRv8j9Ep5e61 HlxcFCT83r6tKPyVjxPQPh/430fTrrSZtC1OfRmCQ3FjfsusaMS5wieXd+RdwKCvGWlwRx0rFv8A 9n3xZ+z/AONbjU/hlct4avLkf6ZoMd8ut6Lfp3R0BM8IOSMTRFRk/vFr6O1X9rXxBrsc1ld6jqN3 o+4rFp9/4YkkijQDGd0RQlyeSSOSfTivNPG/xW8KTecl/wCGI9qElI4NMmMKsRwQjxqyjHpIOnBr nngXGF3LVdU0aPKaEqN61T4dnzar0ejt5Hkq/FDRfFPiTT1u7W6+GHxD0KTzLCMSg24cdTYXDHYY S2c2crGMgnynQsUbjP2q9OHiz4Y3UunW1vBai7jn1HS7dT5OkagqFFmtsjeLW4TK7SAYniSJ8eWm ey8Q/Ea0+Kavp1v4e8S6pZzMkZsLiwbV7fg44L/v4zgjGyY7cdK+g/gf4l1PwH8eYvDHhnSSfC/h qyuNPh0a50ho5Lx1t3DXCXs0PmpcNMoZd5kUAIu4KgWvErYiPPdNc219r+p8ri8J9do1MLKSlzac y0eq0utn6q1+x8XfBfQvDXjn9kia31Wa5j8TeGtS1K80WGObbGqrax3M/mKQdwMcRVcEYZgeelW/ 2X77U/C+q2+tWumnxF8RPFk8svh60ZRJ/Z7OxM2qTAgjK8iIMNo2tI3CKG+g/i3/AMEp/Hun+I9V 8beHLSPw34DvLua5iudU/wBDhsI7mMLNG6YPCgshWMOSFG3dxnd+BWi+CPgHa3mmeEfDfi34h6vf RCK/1y50hrOyuQoACIJijGJcDEZ+XABIYgYiWL9pK1ON5fh/XoeRlWQVaVajGrOK9mmrprW1knbX WytraxpfDD4L2/hrTXvNXltdf1G8k83Uby7uWFndyglsyzZ8y7CNhlgi/dAje7TtwvS+Ov2u9G8P XMlr4r13X7zTbuGSKaxhI0HTzG4KtIC6m4lIPzjyLdBuUfMcmsLVE8beP9SVtauPiX4VtLZW8yTT buaIRxt1AhstNI2f7JkGR3qrH8JpYtOtpfEGs6X488L3czQoNS8NaxdX1rIq8OrXZJhdQQ+wDy5A uPmGcdFPB1ZSvVlr22SP0SNSpG9OjHvu9ttejS9GeWwftp+AtDjWy8NfDK21m5ifah0y81O0MpGM MZ/P81+ewjiHsKu+F/ih4N8Z6nfS+K/gn4P8FahqshLaxHqwt54ccBvs188qsePmKICWyTk8V0tz 8BvGXhOwui/gnVNc0aCdhLcWHhewS3kjB+VykKNNGuMN82PeufsU+Elpd3Ta18OLxNVf5VlSxkXy WAx8sfypnPXcprthgXLRzS8rnnQw2Kq1IutNSSfwvRfjd/iYWu/CXQvifrkeneG/2irvS7m5dsaF NO7RNx8q291GILVmYcBZFgwcLkmvLbfWdB+DfjW40W8v/jpNrtpc/Zp0kmGim2YHnfGouJQR6AE+ 1e9x/DDwT4vfb4M8Rvoeoxph7LWY4dLmun44hmSNY+f7sjJ/vMa2r6xvfidpdt4K8dy+NdI8QWat HoeoXd1dWcr8gfZriVpMSW7YIjY/6tiBuEZIEVac6O/vR+9rz1vc8jH8MVIXr4RpTvfXmat2Wtrf Ix7b4p3/AMZvCUN/oXgTSr7xLp7gyXmo61q8V9qUEaHfPPLAls0k6kqWLq4dOW2lCW5bWPiR8WdR vLnTPEnws0e5s71kWO/0TT4b6e0wQBm2vJGhnQ87kIiZsn96ozWVpHwV8JeHPHMcsD/Fi117S7jf sFncXCwOpwysrw8gnKlT6kH0rO8T/sSeC31y7vtL8d+NfDVnPIJIo9Q0W6jW2Djd5bPEjP8ALkpu Kc7fevJWXxUnUvFrpeKT+/T5Hyma4bH4ij8PvRevLKMPnZxuzbi0r4q+DdGZYvCOhXXh196xeIvC /gtQ+mkPhlvrRVEltyVG4qVxzH53WqWr/H74ufACwey8VeANb1vRtfiWG6cT3iaZqtr1Dwm3MQhu EYBkfb5kZGGXBZDV8EfsteL/AA141E3hL4myX8lowaGSw8UwTSlCQpDWsqhpVKlg0ZToSGBGTXol x4bj8N+I5rnVNW8VaIPEDML/AEe40wvo+tNExBlblngYZLho5FRScoYlG2vMxecyw8k9ZRaba95p 2ts7NJ+Wx5NLDZlKg6VWU1G9k7xaS7Pa9nbVanh3j3xBqHh2G38YfC74q/EjQ9HvGjh8vWdVeZtL u8M32K9ZAqo52sY3eHyZ0DEMCsscc3wR/wCChnjDwb4o/wCEZ8eHw9daDelra7vF0aCVrcuApmaN B5MsbKAsoRAZYuNxZYyvpA0W90WLVdb8F+KvGHjTSp3jt9S8Oa5pX26PULRpUYRG3a3zPCMAlkIa Nk3ZQ7Gbwr4y/DrwuZFv38Oav4Vsb2R1huLa2mSKBsn5GinP71QeBJG6DAOVLArXTSxeWZtTdGor SfdWknbTftueDjcPmWEkq1Cr72l7t8sl2avKN9LdDvvi34d8Pfs8fEua9Oi6hoHgbx1bNDdv4dle a1ijJSTMWTxNbuYbi3nR1WRDGSMSSIOQ0P8AaP8AEXw4+J9lpvj2y8P/ABIsrAC0ttfuQU1GTTJ4 igxdoPMuLSW3lLeVcK5Ifho2GR1v7KvxWl1Lwvd/CPWfEcy2epRtD4e1bT7hi0Mm8ssAzgjDnciP t5Z4iAJlKcfc/C7VPGus6p4N8a6taaNr3hNZL2LW7qwkuIbnT1UyyIogTzHxnz49qjcsk+45CgcW HlGbqYHMIpygviW7j0kktb9Gk2cGZ+1p1aeNwi5OZ2lFJJJ9VLpbs7ddzkPjz8MdW/ZN+LvjXwBD fHV/DepND58JwItVtGxNZ3SnBAk8tkdJk5UOVzgstWf2j/imPjr4b8I+J7y3tj4ptrRtL1S+jG19 ZWBh5Ukqj5fPijZVMnWRWXdkpub2D9oTwh4a+OX7F/hnxL4e8eaV4u1/4QQp4a166h069sJLjTpp JG04bZYw2+JhNDvzsw0C7g2BWD+zXdaX8fG1bw7rnhfwdHqeneFNeubC90yy+zS3c8WlzyQvLGG8 ozLJBHiRUVm/i3da6MLilOlTxMo3nTbU3Zp9Fdp7qSs9fLtp52Mw0qVSdFStCavFaNJPWyabs09v mcF8WJIdX+F/w2vpkF5A0+qxXEZIAkjjvTKY89srO3/fyu++MPxE1Dxr8NfDeseILl7q51XVf7Vu CyiQyJarLcpEFBA2ql+FAIG1VAHQV5n4it/O/Z58IwhVH2XW9XQse+6HTm6fRq7O4Sy1PQPBS3+k f2/Z6PocmqS2b3ElslwpmFphmi/ef8u8XyggkMeRnI4V7JxhUSb5ZzXS9m27LW29j0FRrc0qbas4 x3va9ktfRXPMfhh4Nufin8RdK0mNZxHql9HAVV8SYdgGKnB5C5JODgAk9K+3/jR8arfwBcX3hHwT 4f0rSdI8LwW+h3lzFax6hqWoXMkaRJp0Dzq6+dJ5KoxVMKkEkm0ltpi+CXxC0Pwlqt/4g/4QHw7a xeEdO04WOneFdKg04X+p30cTRW/nOktxLIvmqjB3O0qT82cDz74vfthReDdY1fTfhb4A0PTT4dvH eTxHHdXmpTLdOAl1KCzAM0jIVE2QSkYYBRlR52YYzF4zFqEKD91WvzJJJ2u3re/RWT6no4ChhcPT jJ1rp6vR3bS0SWqst90d58XPhn8bvHsmkeEpfEEHgnwb4btDay33iHVP7PGo3TNvu7qC1GbiSPfm GNo4WHkwRYKkmvQPDHj74d/CvxFqOp61pmt/E59L0uDR7Gyksmj0W1sEdQlvGJWZpGd48yTSx5LE 4QEjPyQ3w8f9pRX1jXfH1rHapKIoZbfwzMBqUrsBiJS4lnlDEfKodwPQEGvff2efhh8Gvg/4bvtf +IOr634v0Pw9cwx3Ml6zx6dLeZyLW2ihYme48tt7qskixBwZNmdp8bMpRVONPn99aOMYSvdtdXa5 9dgatSE3iOVqEtU5ST+5Lbc+gvg/+0D8Tv2s9Wmsvh/4UFn4c0WEDUZLm8u7bTtFgJ2Ighsnhhbo VSLyssVIGcE17N8JtV8UfCrwH40gurnQPC0lxd2+hQXOgaRZXmtTEjzrl7xlkWGzyioqRTTjYJDu 8xsE+c/Czwt4j/a4t7LxdqmrWfwb+BsalPDnh3Qy9kl2WLK0tvbiCOR5nAA+1MrzMSwhweY/afEH xj+G37HPwC0C4tlsfDHh20S4vLZSiLfySO3lpIJVLtE0iRZCwiS6fOTNGN7r4MVLVpPmem2t3p63 R0rGyla7vqnaysrarV6O9tdP8z0r4Q/AzQfhr8GdXutWl1y+uPEnk2gHivXJrx/KDeeWlgjjVIEO 1CEWPLAYDEHNeIftV/tpaf8ABrStE8CeEovtni3X7hV0fw54Yslsb3VJJGxHJIw3G0t2425LyuvO Qvzjwn9pv/gpTFd/steEtc061m0+98U6jqc2g6EQGNysckUCX95kEvEHSXbAXcSyA+a0qxtv8M+J etXH7DHwtvLzXdRn1P8AaQ+Lto01/e3b77rwbpU6kOoYklb25UkMfvRRZUYLmu3DZRUqOLmrX0S6 trV3fRJhTxHJN1Jzu229Xoui/Bf5H2H8CrbVtI0PQ9Zvda0rU/E1yb2xtrzTf3lna3k5Y3ZhJJ8x YIxZJ5hJLmRzkgivkf8Aaw/ac179mX9peHVdPt7TV/Afjuwg1u78J6jmXTJGl3JdQeX/AMsniuY7 hEkTDptGD1B+hvDOiyfs/wDhTwJ4Qa1vY7f4c+A11fWZkiIVNU1O3vNTnQt03pFFZRnPTZjivhf9 vfxd/bvxs1fwxKbAL4W1zVEs55HZXa1uLo3EcWCMfK0krA558z2r0Mry2lLFOk4qSs76fivmdNXM ZqnKonZu1r9VfT/Nep9FeDf28/DejeJDa+HPGN34b0u6Ak0+21eCXU9IkjYBvJuom3T20iElDJC8 yHblUVSK7fWf2sLrwp4msl1iTxL8Jjq0Lva61oWqHxL4Q1pV53xxS7jGM53eU7bc4aJecfmTMrRX Z8nGR8qlT/Kvoj9mLxJrfwv0K4g1O9t9W8PauQ134cvE8+xvOMb3BIMcoB+WSMrIvZsZB1zHh/D4 Wl7SLv5Pd+lj2MpzOtjK3JGN7bvp8+/zPavH3xS8TfEy3um/4QH4FfHXT1Vmkl03SRYa9DHz85jt jb3WR13hHX3rwW4t/gn4vtLpbyx+IPwv12JiDbpNHrOnOR1UCQQzRN7M7/7wrd8WfAjRrO5PiHwv eXo015QUgnlxd6VIeQjOuNwyPlkAG7uFORUfiX4g3PifSUs/Hml2/jmwjXy0u7mU2+sWS+sd4AWf H92cSp/sjrWODqUeVQpN28tH6Wd038juxeW1aUnNxS7Lp96Oa8G+H/EnhvUI7r4XfFyKeVTmOzh1 WbQ7/Pp5UzJG57bUkfPpWn8Q/ip4i+LCzeGvGGj6W3xDaNoxZ+KNMSKTVMjAa0vSEmhuDjiKWRo5 D9xgxWJuO1r9nmbxpqkZ+HEtz4uju5tiWEcATVLQ/wDTWJSQUHeVCUGMtsziu00r9nfxF4f8FJZ+ N/iZ8OdO8NTM1t9i1SW61y202Y54MlpDMls+e8cqseeGGRX0eHwaq2qxtK3dWkn11R8RnGInRjKn rGSV217yt5+R4T4B8aW3ge8vvCvjDS7u48N3Nwy3dq0ZW+0W4B2meAPgpMmMNG2A4Xa2CFZfVrXw frPwGvm8X+FoLDW9Nt7ZH1rTTG02keJtMb5ReQgjIBBZZI/9ZA5fgKXROh8dfsyeJPEXw60/UfGU ei6rpisLbQPifo16NS0W7CYVbHVpY/3kaj5USaZUmiBVXDR7TFY/Z98XX/ws8SX/AIZSWfw5qGny SS3Xh/UYvtw0p2jG+eBWyt9YSx48635kMRWWMy7BIPpVWW0l8+i879D5fLMzo1v9kxW32ZbNO+iv 2/4bY+ov2KfgT4O+KH7Pd7oS6sum/DrxFqa678Po9Rt1mu7DUrhDaalo90cBvsrgwxtMDhkdJACw YR+NfD/9ly1/Zj+AXxs1CaK/vNW8PzT2WkafqBH2S402/tSlzFJGAGE7eQImKsNskIxyAa9H/Z00 7xd+xD47jHiXwPrlr8DPideLo+safcLJ5fhDUbghIby1nKkiAs6vFL/y0iO0lnTcfV/2pfh54o/a G+A3x+8IaLYyX/jbw1rNre2MtqgdvEem3EwlSZHBAeaOMtuVRligcf62sE5RUqVRWTd0/O34XMMz w0I050KsdU04tWsm9Gl5NWfqfOPwf0Xwz48+BPh3wJ4l0173wt8HNL0/xDrwa1zLqGlXCnW87cj5 vN+1WYOeDfKM1xfiObV/jH+zB+1a+taiL/xb4J1iw1+Py02rNYHUofs00OPuxRxTTBFAwqTDGAK9 3/Yf+B58T618QvFev6NK+kfE7WJPCfhC2uzJbHW5YHa5+yxyj7lqtxa2sjyqrbYllXGXYj3r4N+F o/id4d8Y6b+z5p1t4JtLrwdeaDqN35QWLXbuK2EemXa3lxul4AtdltIxUxTb8FllrGa1fqn81Y+E nDm1XQ/OP9j6a+1z9oHxFLPdXLT6l8VfDt/dyAhXuom/tWaTdjAwwIJPfrXO/Bn4G3vxI+HHigu0 vm/EDxHYSSSRJk2Vo09zHLJIx4GFnjfp/EtfY+gfADw58J/FOseK/iEk/hzxxqFrpOq654Q0W0UP Z38Gk6oXuGchYLVJdrt5SeYY3jI2qjqBb/YSsvhn8WvhT4bs9Is/Ffhe5vbmSdU1WeHUYZIbSxtr FRLJFFEyCRpmcbVbDxkkY6epKpKOFbjvrf1skvzPrctqSjlukW3eVtNLtRj+TZ8qaT8M4/hn8Z/B 3h3UNIi8P6Ra61f/ABE1y3TANjpcEbraRsRn95Fb291IoJzmfnkmvMP2e/E+t/Ef40+N/iFql8dF TxnBqk2r6mnzT6ZpjnzL9rfI4ZoS1qmO0kijBAFe3/te6fruveO/iNHZwGTxP8R/EFp4I0WJDuLW oKM0qMCQyPFDC2VG3ZqOckGs/wAdfDbQPg74M8PeBNIVPFXizxVMtna6PtX7JcJbzFYzM6nm0WdH nlOQs0sK7f3XmOeGs0pOnFXbsvkt/vZ4eZUoyxns6Svy2SS6vRf8E+XNT0TWf2uPi1rfiKZLfw34 asI0866nGLHw7p0aCO1tlxjeyxRrHHGvzSFSf7zD60+F3w48Pfse/CCz8ceIPDur6VaavdRJ8P8A wnfxLJ4j8c6kAFXVrqAD5LeFz/o0RUokj7yJHA83X8LWfhb4eeEJ/HPime61fwn4NuFuLInEbeKN TfKLcInTzJZInS3GMQQW7ygfuYhNzHxb+NfiH9l66l+LvjiWK/8A2lfHNgsnhXSnjzB8KtHddsN4 YjkR3jRkLaxH/UITM+ZGStqspSnFJ6LRJdX1fojHFYKjl8vaqXNP71fq/lsh3xP/AGh7f/gm3da7 NDYaPrH7VPiy0a31XUDturP4VWkyYayhJz9o1Z0bE8rErAGMSgneo+CfFHiPUfGWs3Gp6reXOoX9 2d0s9xIXdz0HJ7AcAdABgdK19I8G678R9SvbmCG61Cbcbi+vJ5AscZYkmSaeQhV3HJ3Owyc81638 Nf2GtRvNCPifx7q1n4E8ExL5kWo329ZNZ4z5dkmwtMT/AM9FUpjJBfoe6hRpUpO7vJ7vr/wx4+Hw mLzKu1TTberbe3m2fPsVo0zEKrPgZJHYU0JtOK9w8efC7WPFfhObVfB/hvUNP8BWCsDqdzbixtbo g8/6RK2Z3PXG7qfljQcV449mysRgcccEEV1QlGcmk07HFmWGjhansoy5rbtbN+XkUihPbpTDDhvX 8KueQQewxS+QP7orVQPP52VRbF+vSg24AxnJq0YuvBFJ5XH0pOAKrcp+T+tNEPHT6VcaPc/SmtHj IxSsinUKmwUVa8nA6UUuUfMaf2c04W5BxxVswAjqOakWAKK7E2c7gkdP8LvBWlxWFx4n8TRu+gaa /kxWaP5cmsXWMi3VhyqKCGkccqpAGGkSqXxE+J2q/EzXhe6g8YWGNbe1toUEVtYQrnZFDGOERc8A dySckkl/izxOfEtrpdrFCbbT9ItFtraHdnDH5pZD0yzyFm56AqucKKyTbheMVjClzT56i16eS/4J 6tfE8lJYbCuy3k+rf+S2SKLQtM6gAlm46Zya9I8F/s/veMBqS6jeX+0S/wBi6TB513Ghx81xIf3d svu5Zh3THNQaBouk/D2C21TXI21PVW2zWukJI0aIvUSXMi4YA8YjQhiDksnG41D406vrd2n2wwNp 1u/nW2lQRLBp0cvZ2hX5XI7l8s38RPOdZOTXu7Hp5bhcvwjU8zd5u1o72XVy8+y180eraV8Kl8Ba RaX92vw88HQ3cgSzjuFHiXWtRBbb+6hw8JOQQHxEhPG7PFegyftf+A/2bNUhg0VvG/j/AMS6btP2 /Ub+Gy0rTZgPmWCxiWSJmUkjczOoPQNgMfk9dX1vxd4uW8Sa/wBS1mdxsZA0kzHGAFA6YHAA6AAD Feo+Fv2Ktdju4JPGuqaX4EtHi+1zR6jJ5moQW4IzM9qmXjXkYMvlhiQFJJxQoJSPtcv4gxtS6yHD 2aaSlK1kl16QXfbRHcxft7at8WPHTXWtQvBpFlA9xdltRnjkaNR/q41gMK73bCr8uAWyeBw1fip8 aP2nZ7c6D4RhGhWJaPTof7PEtjZxg/d8y5LKzc5LMxdiSWJJqH4dfET4efDDXGs/hp8NLr4m67Fk LrPixDLbYA5lj0+LCRjJyDNLLjAPymvQ/FnxN+KPiNI7nx38RLfwbaTBWi03RVitHC9AodQGwQMA xCbtkVbnzXlUb/r56H1uXZjmWMopY3FTlZu7ppJPsud2Vl5XM6D9lL4pzWsEniXxJ4Q8NW8771WP T7VXLdsERpGx7DD5rpLD9lyz8L3TQ+J/iz4nSYJ5k0GmQtJNCvo8cCyiMn/poyVxPiz4/eCP2ctV a28OWmpeIvHFsZFv9fubj7S0DMB+7hkuUYB1JIaRYI3yCFYDJbpf2a5fE/xmUeLdV8OrrNpHK8Og 6CsUl3J4gu1Yb3keVmaKyiJBldCm9mWJSMu8cV8RTpU3Llu+mt/8tT6DBZnlX1hYCm5Va6dmuec0 rb32jfuer/DH9kL4fa1ouna9rVv4+1HwzfXDQWt5qmsMZdZdeClra2zmSX5uNxeOMHIL5GK6m50/ 4JfDWWO98P8Aw48K297G3lxJq8k+uzO4bB3PNJLal+uY4Ibhh0Yg1jaqbf4RvrWufE7W7Xxh8SLu NPtaW86nTfCds6fLa7wBCsrL8vlRA7EG1EYFseXeAfj/AH3xR+M0EHhfTrWy0zSA95qOq3MLOqpG pMSPgM5RpAihPmZsgJGpOK5YL20VKtZPol+p9m3ltKFNV4L2k3ZRSu/u39Wz2z4zftrax4V8WWPg Ww0PQta8Yau8FtZabBGbex0ppAFWJrbgPKMgtuWFIyCCrEEjx3xD+0V4t8YfE8/Dn4f6tb6tfySO L3xBcRqtquwF55oIFHkwW6gOQ215nVd25SwjXMvdKtPgtoPjKawMmqfEC8sms7u6v9s89q92WWWW 6fc3lyCETnyEJ2F18x3ceWvpH/BO34IWPw9+Fl/441EfaH8Qfa7155wN76PpwElzJ7LNciOPH92J xzznmnhlzLu/8zwcXiMXLExoJ8kXdu2yS0sn1k2rPsek+OPiv4y8Pf8ABILxlY33ibW9e1PSvGM9 naXM9yxe3W2itPtCoQcr81w5wDhfLIz6/Afhe51zxX4Wl117GDx5p9kT/aNvJLLDqtigyWdZImDM oUE7m3hcElcDJ/R74d+B5viR/wAEr/BcmpKFXxmvirUL2QfNtuJ7yVUlYKd3AMZyeMKBX55fBgan 8HviHBPbma0kumMZhHBmwxVo1z/EHUgf7SYznBqcPShFXa0bf5ny1LD1a9elKpJxhNyTatdNuydt mu6ZHafDwfFjwxd6r8PvEF79p0iM3F54f1a78nUbSIDLTRSjEdxCoHzMAjpySm0b6teDP2kfiX8F rWXTNevvEMnh7U7dkNlfxf2hYXS9A6BmCnB5Docjsa9l1v4Npq2p2Hjn4bW6R+I7TbfzaPbAr9u5 4ubPGMPuBUxjGWBQruwsnO6t4GvVt5fGPw7mT/hGNfSS71HwvdRrNDpdxHgXEbQsNnlqx3K4UFEk XJUjNdLo2bSW2vyPRrcP5jh8QpU6kvaR1bjqmuklHr5pP5GBB8Q5viFoh1bwV4jOmarYQNcaj4fu 9SvkECoBme1kMm5kAyWjZmdAM5ZclfQvhn+1l8TPGVnBpj69J/bMMYj0y7stXnu4LpwTtiukEkob P3VkYZXgHK8rx/gq/wDCGseKbG4OlWvg3xVbMs0EV3Iw069bjHk3O7fEW/uys8bZOZFGFrC8f/s6 eDPEvjG9ttO1m8+Hut2z7n07WbZntYWYg482MebGnIwTGwxg7j1ralTg7NNK3od8auOo0o43DSVW SdpQUuS+is0pXSe7tc9G0T9szXdV8TLF4hm1TwpdwK0U0+ma+qYf+89neqVbnqqFP0APdah+1n44 006emt6Vd+OdPjlb7HqMWjaVr8F9CyKHQSLCrLInysAcMvAdelfL/j74XfGn4TaEdXuZtR13ww77 /wC0bC5XWdHkJOMuw3xqx/uyAH1Fcbov7QckWm3Gn6x4Z8OanZzyLKRHE1jIkin5ZE8kqgccjJQ5 BIIIrZUZXeib/rofOrxGWDqujj1OnPWznFW8k7J3XnY+zPGn7QmneK9KtL4eAvhxrt68v2LU/wC2 vhzPb3bXDK0iSsbMlsugZTx96B2HBFVLD4k+EtCWFpPhT4I0VWYK91o+tLpciZH3liv4lc59C5Pq a+dNC+PljqEEwh+IPj/wiuoMkd3YhhqERCurhwyLCsYyP4UdsZHQ4PeSfGCLUdImtrXw3oXxmYBV El0dNW8CkYIMS2KX+cgco46de9fP4mhXhKMVTUo9rLT0cmlp6Fx4uw+KvUpWb3slzX+SvJfOKPTf E/hfw/cTi9h8deP/AAjE6CU3U8M505N3Q+bBHcKemchVUjvXf/DQ/GbwdBJPpXjfw98SdHuYzFHc EW0zKhJIULC/73cCcrKiN/dZDzXzHYfHjRdCih0CXwpJ8JNaK7Vn8JW9lf38gYAhTDOjXbtgf8/S kele0+Cv2XvH+n+KdJGv/FDwNJpusQG5gt/ENnMniO4TKloXsVAnklw3+rEkg9elclXMcPSh7LML KOrStzNrulFWv5I9jKOIMPWrK1N2vZtaJN903Hf0IfH3ieOLxVY2ni7S/Gvw38cWw2WKxeIr630D UyACr26+fCq84xA8yAH+N2+SuG8RyeL9Rjez0XR/h5YeMrCWWaRjodvLBcFm3eVHHeKX06fcSfKm URysSY2U7Uf1HU/i9ofka/8AD/wXpfjTWNSjthJeaZ8Q9Huk8MWgVGLYspDILZiwDLJMypgcMmMV zuq/Gb4c67pem6B8QbnVfDOo3MUMZX4fxSS6Zp1svCzRO4jV4SWIaFZJ4uWKqrEGvCxNOE5qdCjz RVrJrVJq6bj1WuqlZ+exjmUcLW5+aoknopL3Xvpd21a+R8x+Mv2o/jh4cv7jQNW8V+JPD9zbboJd L+xW2nSwnklDHHCjDgng8819B/A7xfqX7Uv7Pt/dQaXol78WvA8WzRtRv7UXX20krLnYSAJ5BE2x nDL5wLAZlkK9/qPwh1D9prW7fwg2jWXjnwTeQLZ+E/Hfhe98zVfDaKGKi++0ujiDOAYZAoj3bYW5 xXM+CfAXgf8A4J0+M/C+m3U/iDx1q3jIEav4s0UOdI0mwRju+wIrEXMsTqGk8zdsUZBUla8vNsww 1WiqFGhyYuDUkopWaWru9Ek1e8W7+p8dg8qxeGxMpYms54eSabk3dX2stW3d3utPM8b+G/7Q2oeN PjdEnjHVpo/AvxI06Xw1ewSxRxW+hLMY8GONVVVFtdJb3C5yfLjTcSSa9G+AH7OFl8BP2qtD8TeJ tSg8MW3iTxH/AMIvovh3ymkudRlm/wBF1RvSKxtHllhErZ81wqryr4xv+ChX7G2seE/2jj/Y8Vre 6R4x03/hJDqlqjf2WIhuMl+rDOyF85K87ZZWiAOEJ4v9rO38UWlr8M/HuoQ6lY+JdS0m2W4F2376 A2sjG3nKE7ojcR7JypAzIZmPJJr1qc6WJ9ksJNU1WVpRVrppX06K+zfku585KhUp06tTEJz9m3Zv rey69t1/wCDQPDR1T9nfwjbalaaezeH/ABD4nhu7eVTH9uWKztrzZM6/MoLBogy8qiLjla9jtfhP 4D1G31rxBoOuXl94JtvDmj20Gi3N6f7V0eeeXzTp94yFQxURmbzkIEsQc4jYMi8Z8Q/DsWh/EWz1 GGQjQviZBr+v2UU+Ejt2mtrqPauP4cTxYOOmBzjNdJ+zJaX9p8EtV1rSYrHUtUlkutbvNIu1M6X+ nQwy2MEkkeQZYo5p5EdewaNuMEjyc35Y0XWoSaV9LPRtybafndNX6Hu5PUnUcYYle8l87csWn+Jh /Cn482ngn4Rw3Fx4V0fXpv7Qmmgha5k0m5uLyQEGQTxnG6C0kI8xkd1eaDBULU0ui+Evhc+n20Wh fEOxj1QtFDaWd5aveRXtxbRklJHSNLj7P5scZygMbyHaSxLLY1/4O6L8ZvGOk674TSxtvAHh+5ni NreXuIdNuoXNzcWshkIe6SWMbo5YVaRowisuYznX1eLxV4B8YWya7plr4g8ODS0vYbaZEu5vFlw/ 76WWydDuDCaSUNNCd0EcSqy7lWM8WNceVThdOV3KLbi9NLLpfrt13tqengNG6SafLZJpKSu1u+qR F4F+Cng/V9Qa9l1jRvG+kRtJYRxam0+h63qt5EoaSCyeaRLaeOTeGMiMREkqnZIxVZPRfCumfD68 8Y6TrHj/AMIXWgP4L04CDQtRvUm8P+Fodx2yTx7Qr5dg4jLyy3Ehy+93w/P/AA/8HaT8Triwu9Ru xpmnXEKy23hHVLS2u4jZIm5PKDhZYIi2dshCvIz+ZvkJcn0/w81n4Zt9K8Px6TrOg6PaNPdaf4c0 +4j1RJjIMiS9lkt5LglN4UJbGRVHQQkkN8bVqVamKlOTkra7tW01Wmjfkov1PqoypUaCWk3stF3W 19fvaNvxT8WLfxMNE8RXHim11q31G1ee3sLu4hsLrXyCFjiDTFY4bTaUzDGNpGAzTKFiPyh+234a +Jf7RvjbTdU1aPU47W2jh0nTbKGxmuLCFycMImgadQZJMk8sxJ5ZutekfFK08V2/g661fXJNH8P6 FNeMPtHgCX+zpJ7dVw0N9dSMxiXOOCJZCwK+Tk15X8ENQ8d/G3xTLoXw50fU/CfgeGVxrOoeF7C4 ubmWEBpXWa9cGWSWREO2FnRJHIAjUdPpsnwmJ5vrOEqJ8vxOS0S3snpr292/c+fzHHwm/q86Vk7J JPW/Vvy+Z9DfBn4U2/w70nw58Z/j9LY+GdM+GehW2meF/DhK3N9e3KzzFH+zIf3QSQyBUkKsWjZ2 H7twfGfg78RPDn7Xn7evhex0/QdQ1bV/GXiSBtU8QeI/KurhoTIGmKW+1oYlSJWC43FVUYIxXPft 1eI9X8c+KNO8I211oel6d4cjCppVrqS6hPNdsgzHst/MZmiXEOXALOsspw0z1qf8E/vhxqvwc8d+ MvGuvy6d4dfwn4I1S6sm1Wb7FLHdXMBsoSYZAJsBrnO9YyMgYJJFfS4fLP8AZnisRJ87TSim0lfb TrfqeHXztfWXhqTWjd20neyvp/mdFrf7XGs/tHftg/F7VpNTu7vQNZsPEt7Y2klw5htoI9MvI7cK mdoARk/KvnT9s7UFvvjvLqeA39r6TpeoOeoLzafbyPj/AIEzV1n7OHhvw5oN34lvJ/FNxqFzB4b1 SMpo+mSSKxnhNsq75zESSZgeFxx1ryX4k+IrPxi1rMH1O5uba2jsg8zIuUiUJGNqr/cCj73avdyz Awhjf3a0Ss9Lb27+hw5pmbllylJu7d437LRq/wCBjJqyxspiyQOQehI/pXbaF8W5rS1iTLsydm+b A9q89s7CeI8o6EDdgjoK6nSvDZNqJzHtyM4J617GOwVCUUpq5PDee47nfsXbumuh6RD8bo7q0Imd 7csm07DjcPQ+tFh8XIfElhJFJ4Zg1+ztMeYwWWOVFz/z1iIIJ/2ww9q8j1UNGxULlQcYxVTSdUk0 29Wa0luLOeIhhJHIyMpHoRyK82nw5hkueK1PcxXH+Ic1h61uXZvqz6g8FeMPDkvgK60bwVq7+GtQ 1UltTs9blWGXVADlLdb5Qsfkr18qRYVZuWLkKF4Pxjb/ABA+DWqjUrjRNW0NHTyZftdhvsryNv4J A6mKaNsZAbKnAIz1r1D4D2mh+M/Dujt8WrG7uU8QukeiWlsIbjxL4gLvsRoF/dOkZYkLNczMjMMJ HIQdv2R8LfAWkfCzw8dK+CfguL4xazpMgbUNK1fXJro6bhQXht1RRazyZLrJ5eEO3aFkxvrieFdG pz3v5N6/K3+R0zzynOlyYOXM3q+j+9ny9+yF4q0LxR4jZvh/qNz8KfFWoWwXUdB1K4ln8K+KnA+Z Y5QrPZSkE7S4dB9z5lcofqnUfgFoGvaXpWqan4X8N+H/AB34biki8I6/ZW0UtnY3wBKQ3NtAWj3Q uTMkSKFZk8yBf9ZbD3Ky+CN/4hlhn1nUPFvw313yoJH8O6Hq0GmtpaCEs6S2wEsdywwoJt4Y/vY2 uwIrB1jw1DF4stp9a0yfXZNRsVeLxJoM1tdXzW2QwTUdLaK3e6jGAxEYaZAAyspAqnOstYdej2fo 97nh08ThJtuV03utGn+Ct8mfCngL4vfEL9nn43/2N8QIRrXiwIx26jdi4sPiBpFwfMeyecnbKJMm W2nBOJOBhiMfd/wq1cTeOGvfCpmbTL238N6zol60hjuv7MlmmU21ypHzPDsdD3HzKSPLQ1tfHT9j rQf2j/g7Lo+uaA+r2piefSL/AESFXfTZm2/6XDLtEgjZ/wDXQumVZwzIp3O3p3wu+B7/AAu+BfhD Q5ru/wBU1rwlZiK/1O62Ay3KxOzJOMk7S08I27jkru3Hg110sTUneFVWduv4HdmGZUK9KFlaS91q 3RWav81vueB/tzftMN+zR4+0m0bC+Fo7e3t/B2mwWuVtbxXa4nkhwB5Ty20y20RXG9nlBzhq9l+G Pgvwf+zN4X0LVbLRtWu9V03xHb6tdaX5KWbeHDrm7DTvMRGVtIJo4ifmKgKg2l2B5rxX4D0r43fB 7wf4hvYrTQbrTb6+srXVNQ2RyaWjXUm65SOUDzbuN0m+yEDAVpHGMDPBfGrXNN/an1aDTtE8W6Hc +FNAtb3wd4l8JpqlxaC91t8XunpaSToPOne4iCLJ1CxttGVxWU6DjJyWtj42rQhOUqezWr/BWKt9 4T8O/FnwnrC+K/itq2ozeINKn0qOw1B11G6W8t21Wye7sJMwIZdjeSRsSFxHsDu/I579lf8AZ++H ui/B/wAQt8N/FGoXmoaDokllZ22tQ+VNazyvNOzSRiNXjbDRBinmhVjUnbgk/I37RWq+I/iz8SvE 2uTQ+JLrxJruuajoY0qCxc/2bZtDBdJFsUGRCn294wmBjY2eSa9K+N/xP8R/C39i+/1GKDUtC8a+ NtaBu5buBob+aWxe3tYHiJwymaWBST3KuelaUMS3GMF0d9fRP9D1sJSqU6UIRn1bs9lon+PKj501 DRtb+GOuR6b4sluvD2o/D60udGbEiyy6FPcAXGo3CyIx+e2sTawKqn5ppFQferof2Ufg/q/x18cX Wtroz23iLx9Cltp1qhCR+F/DEY+zpCr9YZZ44vJEv3kghu5eSDmh8W9duP25/E2h6NHe3mq+NNEi trLxV9miUy+J0jIJu41UbfNVwPOX/loTbE5KuU9M+JXjxfCejL8G/Bcc2ua1rsB1HxzNo90kb6oI 0CRaVFdsQLfTbeNVjmumYK6xuwI3tu6YwcYSrN6vRPy7k5fgnClPHVXqm0vV7tedtvv6GF408Y+D /AXjOz+Ivjiey1jwd4Pu7q08A+HdNaKRPEWpRbUlv2HMXkxtHEhcb440iht0Mvktn5r+MXg7xr8d 31Pxd4y1bT/Bum67ctfrYzzSz3upSOciaZFDSu5z8rTlcjAiQJhR2vxT8GWejeIY9XaW7+IHxDDw 2lvpmg6RLH4f8PW8aYjtrd3PypGBwWTdhSwC584+sfs8fs9a3qmj2firxPfTaFbtIWg1yO3864J4 LwaDbv8A66Yn5X1GTMaMG8syuoLZYfCznU9rF+V7Xt5JfqcmX5R/aVd1KyaV9kr+iX9adTm/2evh gPhOln4d0vwYvjX4haZbHU7bTdYlQW3hiPhjqWqM7LaaXEoCsVYtcnI3zxDajYPxi+Jnh7wx4jm8 V63q+ifG34kSf8zH4id4PBWhED/V6bp7ATans5AlaIQZwRFJ9+tr9rfxn4Mi8At4Qi8Q2vgXwh9r Fy3hnSL/AO2XeqTgn/S9SmVZJLq46kPLkJnCRxD5a+d7D4J+G7+7/tCN49M0KdC6a143vnsIZVHG YLS33XNxgjhkLDkZRa6nSl8Oye9tW/V3/ArPKNelFYLC8sYK14p6rzm1pf1dl0OH+PXxe1r41a8N T8ReL9Y8XaimUDXEHk2dsg6Jbx5AjT0VY4wPSuI07w1e+IrgxafY3l5IRnZbwtIf0Few+KvEfw08 Kgx6RH/wlGoonyX0ukC2soWz0jty6FsDHzTGTPda5N9U8dfFa1ktrFddvdLjYuLWxtzFaRe/lxBY l474Fejh4KMVFKx8lVwVJtRlLnl2gm/k2/0ucDqugXeiXBiu7ea3k/uSrtYfhVVoyAQP5V0GveBb /wAPRq92LNC5+6l5DK6/VVcsPxFZQtuOldR4OIozhUcZRcfJ7/kU/JJHUkU37NuOBV42wH+elJ5Y Xkd6Dns0ymLbBGfSmNDn3P0q4w654qPZg/Wk1cRWK4PTNFTMAO+KKm0R2Z0i6IxPUc9qc+jSYOBz 7VpwRyDBCrntmr1srjG5ep9K61IbwzZzz6ZLH/CRxTfsjq3Q8etdmY0lQ/KCOnIpF0VJfvKFPp60 KaGsNLa5yRhkmcsxLEnkk5JrtvDvwrsdH0211PxXcXFtDdhXs9JswDqOoKehwciGM9ncEnIKo4yR P4d0qPRNUS8+zQ3EsHzxLKgki39iynhgOuCMEgZyMg39G8Eat458UT30l8Y5EJur3VLqRttsCeZH bkk5IAAyzEgKCcCk67tbZHsZXgaPOpzi6k5PRdF3b/Tp3OrX4rTfCWJNI8F6dbWXiS+AiIsEaY6c WwPL8w5e4uOBuLfu0YkIgPzCVPh9p3w1sLxfixqOsvql7Mt7c+GrCVW1S+lwShvbh8i2Ubj8hDy5 Jyi5DU3w38TbP4L6bcyeD7Z4tVZWgt9UuAPtrEjDTHGRCuCQkaHqSzu21RXll1bXV7dSz3Erzzyu Wkd2JZyTySTyaUbNK3c+uzTPfYQjyT9pNJpQX8OC22XxSf3eq0O/8U/tRa8+lf2T4RsNL8B6AD8l po8ZE7Y6M9w2ZGfHBORmvPdGtNa8Q+LreWy+2ahrMs4eIgNPNLLnIOOSTnmu8+Fv7PV745s5dW1O 8j8PeGbQbp9SuRw4/uxrxvY898cYGT8p948DeINK+E/gueXwBoVnHc3cDCLWdaAK28WdpvLgsMbN ysIoiP3jLnygQqvtOcUh5dkGcZxKOKzWu6dKKul1a/uQVkl0Tskcn8H/ANgXT9P1jTdQ+LXiW20J dQikvxodhItxq8trGhlknlxlbdNobBfLO2AE5zX09qv7Qf8AwhPwwKajpLfD3whDax2GheFNOk+z zxacC/76/vCDIjSEOAoBml3ysqDesleW+DL7SP2UPhfceM9SuNR1fx58Q1A025usPf3dosm57qKJ 1byFknVRHLJmQ+SXVBkY4rVfD+o/FLxULrxQRc3emlUt9CDPJZ6I0h+U3HJae6kYEiAFpHbJkbCs p8unJzqurfRaJfmfqORUcLlFK2AilXn0bu0n1nLv15V+WpR1KLxX+2F46t7XT4/7N0e6Z5beRbX7 OixBiZJIYQSIoEx887knCH5iTsPsvi/WtJ/Zm8E6P4O+F+nG78Ua+MaRK+DNhlIk1KQkfKzrnbIx AjjHy4yzBbOSD4WfDGTVIornVoL+6FtfIGG7xLMhC2+nKY+TCZEYyiPEaxQCOMgvukzdfin+BPhP XvHfjG5h1vxv4jlMN8zY2yz4BGnQquAIIRtMxTA4WJcDBbsgrSbe+mvr5+Z9JCH1R1K2Kneq1edV 68kGtoLa72Vte97a+J/FO2T4Y+EovAekyy6x4k8VXcV9qV5HuL3TEMI9qdQreY3lggMUO8j94gT6 9+Peqp8Bv2BPGVmQLe/isdL+HmnCFdoRU3y3zjv++lFyx9pk9q+dv2E/Bs/jr9p+Lxnq85vJ9Puz fieYYD3W15g5A7RiN3wOMoo716v/AMFFtck8TeFvhx4XHn7tXv7vxDcDI2s08q28QPuqQY9ix9au VNcntOmiX5s+awmNnLJ8VnE1yxnanSW9leyfq3qz3jw9CfCvwx/Zi8CKJfK8ReC9d+1QZLJK0kas p29mDwcfWvjW88E23j7SrnMQeW+0tPElrnhsbjbahgjnclxD54A6Lv6Zr7W+OGsQab8bf2WdajRI 9OhhvtMUI2zhLmW3c/jXy/4ctl8CeH59UjhFwfhb42ntbyIfP5+lX+Y3Xn+APCRzxmf3rmppX5Zv S7/TU9DDZjSio0qy9xSaf3Ju/om36oi+EfiC60WO4a5uTYXmjTCe/uIU3yWDkhBqkaf8tIXIWO6i GQflcZJG3o/2kLmOO1HiSzmh8La3DqEFxqUkDNLBaX7JlJiyEFrG7j2yR3KZdWQq2QVJNd8CS/D/ AMZ3EWklXv8Aw+4uNLkm+aPULCZTsRx/HHJETE46YA9a6TwpJo17ZaR51kL3wtqQmsLWC7bcbSJ2 H2rRrls52LIwkhdv9XL5bjaJCU1kqkHY+4VWs6f1alK0raNv9fLr9/U8y8I+FdP+N+uXGlLY6Ho/ jgqssuh6ugfS9ZJwfMh8vCh5BgrNCQGB5XrKWyeKPEzCTwjfazceBdWsh5elXTRwWFzpBQkCOG9h VWktGJbdExBQ7WQuQyvzvxO+FafCrxNc6JqI1C58K2N0Us7mLP8AaPh0sxKOmcEpnkxtgEhl+Rxu HVnULv4rSQeGvG13Yajc3sGzRvEMis1rrgAwqzOo3pL0VZgPMVhslDD7mdSEbWa1ufG1MZQq1J4X HU7Vlo+ib6baq/SS0v0T0PKp/wBpr4s/Brxlc6V4g17xnbalpLfZpZbPWJrS6GP9tCY5lIx/rFcM uMHBzXSzfEaP492yf27aWmuzyfM8+nrH4f13PHJjUG0ueT02ea/qta/jDw/dnwLHpt5Ztr//AAjI 2iwusDU4NPJY+ZBOgxLHE27DruTa2WQba8vv/AFzrWnPqegXb6xaW8e+e3KbLywHcyRjO5Bg/vEy o43bCQKU4KVnY+IxcqmXzdPEN1oNJ2aXMl6/atts2uyO28LfsoeGfFmplfB954e8U63CxNzpXi2N 7DVLNhkkLp0flx3IPYLcufUcYrD8TfErSPhjpx0vxR4U8capf2h2waI8kfhTQEA6loLNfNkjPZXk Y/L8zc1jaJ431JY0h1m2TW7OIBYxcuy3FsB08qZfnTGchclM9VNe7eA/jNpuseHbaC80efx7ewyb o4tduY5LyyxnY0cPliO+KHYVErsx2sNiKa8vH5ZTnadRSlbZKVrfPdJ7OzOLAYvKsXGUcDNUKj7x vfycXu/NN+iPM/Dvx9+M3xF0X+0NF0PQfCHgSCIW7y2tmdLsPJxkR/2g7fa5OM/6uUnk8c1y/hX4 F+Bfjx42n0/w54lvpfHF4wZf7UgvLvT7k8ZKzxRvcEl9wzOgQDGX719AfEj4K3H7SMNv418ceKb6 z8B6fHtj1MyfZ7CIA4FvHYsDJC+cAiFZlywCN3GXrPxWufgl4YlsPhJpdl4C8JTqAfFt40V7f6s7 ADNrGpcG4JHBdpJE7mKvEp4irR9zDU48z0fK/cjr9qTvKUvJK5tjMvqQXLmE3Up73fvTl/gWigvN totWHwv8XfAXwJNoHxj8UaD430W8s5JtK+H00wvLi7252CF5kF1b5btAo2kAlugPnmg+AbP4v+GN U0vQ4m+EeiacLdNVs/FZeDS3dpAqBNQA3pO2QRburFxGC0jEE1T1rwzb6NcwzfEy58Q661+Xu4tM l1DzvEaFm3+bdzs3+hLKxOI/nkZSW2KQrVb8IfFvxDqF5pOn6FEy+IZbsaf4Y0y0t9mkeE1ZsJLa Wvz+ffOTn7RMGZMbzvfaUHhsRGEq1KV23fmtaCt2XWy+07+rehxyzXDwqQoN+5azi23N3tu/N7Jb 9Ulqd7pug337L3wvl0TSdU1nwlrOqX4e00+4vI7KbXJwrxxPc3MRdYICVRljjkQybl80QIfMk4Dw T+1HeeDtcu/DfxH0a9tWklU3v2FWsriznj+5MIgVCTL2liKPgnc0oO06/iDxvefBuxi8K+JdT1Dx dqiqf7XuVvll/sAkEi1tLhxIJpEY7pHbMW4FFG4GQSR/Cm++N2o+E/h1FFb614k19Y7Dw7q0tq1l faBbsFlC3sRYjyljEjYYlY0y0bso2HzaOBhGM6uOipRm23JaOyXxLyXnq+nRGuIzqr7WOHwMmuSy 5GrrW3ut9/NbfefU974mi+LP7Nfhvw7rHiGw8VaP9qWztPEaxQxfboppWkbSLjay/Z7wQxxSJLKI g88cZKrIkclfnz8aL7xV8UP2gfGdzqmm3h1HVtQfGlLC27To7dCkFskYzt+zwqsWB2VyeSTXp/xN /aCl+EHxpm0b4dFJPht4YtY/Dlnpd1GJbHxPaRsGnurqMYEjXM++UPw65jKsrKCD9pbRLf4tfDe3 8ZaNZ3MkdlstZppS73mn7ZEQW924GJjGNqx3BwWQqsmHVN2fD2UVMsqqpUS5K1+W+8bu+va+l0cm c4yjjoyWHb5qfxLWzstbd0nf9TH+JnjiHxD+zH8Hrify2v8AwxqupaYjqQG8rEXysOvy7YsHpgnG etd9+z74D1HSviz8N9V0c2c2j3Whvp0kslu1xBFHazyDWoyi8tH5S3DMr43faAOpUVxfws0OXVf2 aTYoTfQ3fj57Gyjltg8BuDZ2sitgHduIVl2lihUk7dwBHpGk+Kl+EvhLxp4H8Ea9dafrWganLdWm p3j7xFbusIvrtNq4ZRLaiRUI5DqMu/WMwio0nhqSv70k1/dk99tLN/mb4Sbco1JaXjFp9nFLTfW6 R5fqt3pHxd+MGkeFfCNrqk/w31ARafoOnWcTm+09ZmSXIX70t15gVpSxIkEfykKsSr9FeJ5vCP7L cvhr4S+P5INVvtiTy6/LZsdB0a+aQi3t4coxQogmX7cVkZJAwkSVA/l53ws8V+H/AIT+Lbv406Jp kt02o6bNqEdsU82LR3Nw0eoXckY4YQySNIkYPywThip8nNcz4F0/XLH+2/C3i3S7zxna3OphNW06 5824SKS6dHW5hlQNItpd7kk81CzQSyK4AO5Jvms1xH1ypGMk+SCV03aTktG1pvHTyb+R9HlWFeEj JwteWz3Vnqk12f4feN8dfDOy+DHjpX+I9xe68sc1vd+H9X0FRb69rVusisftbxBoZ0CH/j4iJkYY ZC46fpd/wS/+AVt468C39z4z0rShB4ltyZbO1ZpIbm0Zm22+xgJghBjLGY5ZlPyL1PxL8DfhfpGn eEm+Huo6z/wkHw+uLp7nRZN3mXXh5sgi0jvLdZIhOjOMo0saMW3x4V2U/Zf7DKab8INY1XwvZeJd Q1GSLThaQFLOOF1KSB5E+UthhvzllTIYYUDFeRg61L617PFayjs3omtr8v2X3X3GueYWvLC+0wq9 1/Ele6fr1XY+lP2vP2PPCPiH4J20OnW2keH5fDpe40+5NtuFnvAEhCqQGaQABi2QSATnFfkF8avH sngB/wCzZ/Duq6jbi4t715JL8wac/wBkvAixpbWwSMBGmSZu7KI93KGv1p8b/tW+HL34TSWepS6l qTRJPDI9vtl+0oqF3IYBQSEz90ddvOTX5+6r+0N4U8U/Fyx8O3nw80+1SbTLiWDU7m6e9ZvPzCX3 9PmZAWPH+r4POa9fF4qnGpz0FdWvppojy8hpToa4nW7trrZtqzPgC08IeMPH/wAX30bRkv8ASvDF zrT6VdxeHLTyobOXzGjEc/kKGcNtB3SZyGPPBq34z/Z38QeA9J+Kd1NocmhjxJrB0fSH1e5h0yOW 3S5eeR1Nw6biBBEOp4c+1e+6H8dfEXiz9rqPwzKbTT9Pn1m3e9gs7IyKfOlTJQSu42+a8fQA4JIr lPi14n8TeMfAd7Jp2qRw3+r+O9V1eG3skEFzNa8ISqIgOPllJDEMdh4PWvo6OaYmVSClGKi1Hd+f Mm9N9NTCngKMKdSUX715O6V3r7tlr0uct8Pf2d4PD/hy/wBD/tvwzptxZaOF1jUIrtbt0e72vIH8 vcGEUKoi7T/rJuvp598bv2bfD/hu90uw8JXkGqyai/liSKR22S8fJtkAPBPJGQPWvo34Iz6x/wAI dPe+KtXnt7rVplnuheyNgiRm2zMMsSsaHeV2jmNOvOPJ/wBoSzHhuS6vdB08LpeqRDTrC8ecmSyt CTngAEfaBlt5A3KZBjk1OX4zFTzGUVPr0as9Or0btufRYiWW/wBkJ1IKTSsrrVK+y00b6s+cbrwf dWfic6dC51ZonI3W6kiUjrt7leOD6Vu6dcW8k3lXK3MNtGcMY1Vnz9CQD+deiz2Nl8KfAUCSTG58 Q6zB5kij5JYIGThSTykZHXGGkBIysYBk8z1KBtQK3EaxDegYrGAFyecjHGD19unSvuqHNiVdr3Vo n3fV2Pz6vjKeVTtCXvS1cd7J7Jv031Nq70XwZKAZdQ1ZHZcZuNPBjQ+5jm3f+On6VreCvht4KvPF Gl3EE1hr0EMiTXVquvR2yzhTnyyl3DAcNjBCSk4JwR1rh5bF7q1YPzt4IP8AOpNL+Gep60BJb2yh CMl5JEiT65YgV0RoRStKVvmc1bNYYqouXDp6dL3/AMj6t+HH7Jt+8viD4p+KPFllLqmqCW1021vr +20K+vZfLUSpbzO720EawtHCsquVijdhGu9U2+i/CrSfjR+zF4V1TVrrwNrfh6FvDuq3OmP4YcR6 F4RjWxnEcolhaRbnUJTsKzTSSvHE4YFnk/d/Nfwm8GeNta1m2S0e6uIbO3jt4NF07V4YReRJuYxq jb0lZ3LlkwWdpGIByRXoOjeIvGnwm1fUNV1vQ9Q+HOrarbXCz6kL6fSL+YSIR/x7W0IDDk4LQkcj noa87FO14KSfqv8AJ/oepgMj9pKM4xlBO7tJNqy7tfqjk9D/AG4bTxb4Nh0b4j6Re+ObeB1EF7qx e81WzUdTBfCaOaM99pLx56p2r6q+Bf7Y83jfwD4ZsvAF/q3jX/hGtQksH0jxpFHJrEtvKvmWscN0 CFuVjZLhQnyyBSoULj5vkrXfjN4H167b/hJtMfxc7E+ZdxabB4d1CMkfeFxakpM2e9xAxPcjpX0n +xN8cvhPq3iywsZda8Z20Ec0ccb+Ir6W1OmLFun+0pd2jNFL5McLOyzwxxlRjIzmuGrRUVdRf33+ 650YeFOXNTxU00k7Ja6rz6WP01/Zx8S23jiKbStOFjpOn2t29rrOk3YBtNSutga6NoxxIDCSUA2q gVcFMMJK9F+Fuh2GveHPFl2fEtzrvhG+upmsfOtvLutHBR4LiyYsAx8pl+QOu5VYDLLg18O/H/xP o1j8K9J8dX/jrxja+HNPiuNC8N6xZxQXy6tC7xuLmPU2EgjLgvE0k5AZ2lXAZcj1X9gj9uvS/jjb 6v4T1K5h0XxNbx29/aXtyTHJ4ggVxF5kzmP7O8gLIvmRuytuXpgZzjztc0tjmrZfOFD2tO8l1dtF r3OA/a10DV/i/wDFrwhceHbK/srDwNo13d6Z4eXLWl+8HnWtslu/3UlBlCEk4cFMH5cDwD4R+LvD fwb8U6z4I13RvCuv6Vp95PfanrF8jLceJ/GNqFuHisiCPLitirwecAPLDlskyLGf04X4JxeFfhv4 jbUWlilt7y5NnJZ2SI9p5ziYTCJRsaRHYHdj5tgLA4zX5NftOfs4XV5+0Dp134k+IHgjRda0eaNv Dkr6rJLp0ungbreO4HlHCyMX33PmkFi4YOeR3UuWUuZbLTvozPDOFSsm1aF0pd7Pr8j1D9rvVNU8 TaL4Sk8JeLYvDsWqeILHWbfR9Jae31PU9MlgtvPg1KZT+9urRFVv3khka3bcyoFAPyb43/bh8X/E jX9G8Dpbr408O6RDJ9r0zV1a5iR2dmeeOXBmgkiaaYRtEd3+pQB9wQ9bon7P/wAQfgF8TtDTxfeR m5l1tvENt9vmO1Ftle2kmM4ykltcWssMnnISrJA39zn578ZfFPQfhbHrGg/DS21KKPUbgx3viS5Y G+u7Zc4WFdubcMSehLkFdxz0XsklFXu9fT5ne8PTWFcnZJSaT6uyWx7ba+Ej+zN4d0vS/hxYaXde MPidHLBot/P5aajodgg33j6rLuYR3CbiJArLEEjLAKB83i/jv4+2PhDT5/A3woa11Y3Uyz+IfFF1 Gsf9u3cbZ82R3AAtkI/dQDEajDEO7ZXo/gj+y740+PHgZ21jxFZ+DvC3jG6RbSCaCe5vtaFt8gFv DCrSC1jGQ8zbYQUG4sYxt7e18A+GP2PNI0+XR/DOmfFrXtU83+zLvSY5tW0m3aNyrSeeEVZpozjM EQiC7lLO4K1rNwbUZapfd8zzauLp1KsaPNy0oaJ21a7pbXfc6X4BfC/QvhNoNl4++KU9z441jVIN +maNcQC2S7wc5bzTHFbWQIGYyIxJ1csP3Nc3+138ZvGHxh0abVPFvjvwv4W8NXwEQtNKu/NubqPG Nhn2BpVAwu23jeJQFHygZHCfFnXvGnxC1l7jxNo+n6JezyI4uNbni0iS2wuDm3lklnlUf7ZdQBgI Kz/hv+xve/EbUbvWLxrLxbbTKB/a19DqKWEOG4KXEr2luQQMYeccHheK0pVoQj8Vltpbb16Hsyzd RocmCSStazdrrze7v1S36s898M/EzRtFuI9P+GHgCLVNQt28258Sala/a9SYDndGJvNt7VQf4xHv 77l6DN8e+MbfWtZk1Lxrruk3urSArJFZI/iG9fgffmuJGtlyOMxltuPuCvqC4/Yt8IatoLf294nu XazxcNpOlW0x0sA55UqY7RRxjct25PvVC/8Ah94H8CafHHoHgbTLiaVVlEltfQ6xMoPqIEM0TjnI 3yYxWirYaTTSbfz/AOGPNeA9vq7O/RJqK+WibXdydz5Jt/FDalceX4N+H8Ms6jIu7qxGp3RH+4I1 t1HuIcj+9VbxL4H+KHxIv4otWtvEN5IM+TBeOYlTJxhI2ICjOBhQK+4Lf9qzRPCulSaXq/wv0S2u WjaOS81JXllmjboyjUpY0jYDoViI55FeIfEv46aT4gv7tLXxRqXhiNowpttP1mztLWdQeFYaXYKp OO53dOTzXTGtVuoqnZd20vyuc2Iyd25a82ovpeMF62XMeE337IvxC0a2WfUfDVxpMDMFEuo3EFmm f96V1FY1x8IZNLcLqHiHwjYnvt1VL3b/AOA3m1t+MLXwlOJp7eaC8uHJJI1K7eVj6kyWqgn6mvO7 uBRK5RWVcnarNuYfjgVpKNVu3Ml6L/g/ofE5rgqOHklTkpp9m3+PKkXfEHhu00uEmDXNJ1Ns4C2y 3AJ9/wB5Egx+NYjRgdTjirHkD0NNMBP0rSN4qzdzxpxUmmkVH4BOPaomBI4z9atvaFT0/wAaQ2Rb txTuyY02iiwbGemaKvf2fLIvyrk55yKKm6NeXyPXIvAbKQFZWOOQtaMHgB8ZGAD69Pz9a73TPDKx SllUkt1BHDH+laa6BHLIu4MgxxjgD8K5Prmp7n1I83i+H8zRk7OepBYZNWrb4f3AcEq236ZIr0lN HjVhnkL2Pf3qxDYqPmB2tjlQeKPrgPCWPOYvBEquBsAbOMEdK1rjS5/7Fg05YwljE/mOAP8AWy4x vb1IBwB0AJ7lie3i0hXG7HzKcdatLoiIpwoznp0BFL60txwjVppxg7cys/TseXS+B45QMps7kBeK 9E8NfAfw58M9Ht/EPjRPt95dxifS/DiSbJblDys90RzFCeqr95+uAvJ7fw14eg8FaXBrd3b21zdS EnTLOZAyvjrPIp4KKfuqfvsOcqrBorzQo9Qu313xAj6hqOouZ0jnkLPdE/8ALWQ9dme2ct7Dmtfr LR9DluCjhLVakU52TV1dRXSUl1b+yjz7xJYX3xIu7TW/Gd49j4ciJNjpmnosPnqDjZbxnhF+UKZn zjafvsuyuyXULjVvF9nca9o8F9fWaibSfBtnCWstOVVVIftC5LSysfLUI2WxguQoEZ07XQpbfVY9 VmD33iS9ZRp8JjD/AGYYCpLsHAxgCJAMAAHAUIGsaP4YTT7m4sLO6Hm3vz69rAbeyQg7pIomzkhs /MwOZWwoOzJclin1f9eZ9RgMfKNVVKrbcmm293ba68ui2iu7Mv4iX8n/AAmdxdXGomXWdDhii1zx C+JE0e4IJltrMZAkuDMZgrKcDB2FUjMozdAljbQUu40Ph/SLe3eeAq3myaXaOxje4PTzb+6IKIWx hQSAkYQxz3PhN/ip4xs9Ngt5bbR4p5Jktg/zKh+aWV2xhpWCjLkY4UDCqoHWaJ4YsvGepz6re2v2 vwl4fuo9tlEGT/hJNSYbLe2Xnd5aqNoA+5ChwFeQ5VCSUFb+urO+jUniq0sRC1nLli9rtWu/RL5u /eyXpfw50OHUdP8ADF0gTRWg0k6hZxyuTH4Q00g7rxiek7xoTGcZzJJKAGKGvmX9oL4t2/xa+Iiy Wdq1v4a0VTZ6LZsAPKgB/wBY45zJIfnc5PJxnAAHtP7Tnje90Dwpc+GEnjl1/wAUyJqPie4gPAAA 8mzQjjyk2qQo4CpHjGWFeLeAPB0U/iSGW6gaa2sFa6nRhgOsY37P+BkBfq4rqqV0nyvy/IvjfN6m JqU8moNWTXO1om0lZPyS/H0Pef2avByaHp+oMyuraNYLbN5IwPtt6yNMW6Y2W6CEjnDfU1e+Pd5b fEH9tb4a6NEUkt9JGnaexXoCLhnk6/7TPW78G9KPh7wnoYvnmd70y+IdULtguHImO71/dJGw/wB4 15P8IJLjWP2g7TxBOsi3NjDNfbj8wLw2zuD/AN9Lmu2pUhTpwpdZavyvb/M+hz2VCjlmCy2KtKpK Erdkmnr5rQ9s/aP8UR6Vo37OwdPJOk21vdyLJyS13O1yX687i7flXNaD4cttZ/az8feBt0TW/wAS dJkhtiTsVrqSFLu3A9P36qtXf23dOeKz+Hc6iSU2/hHwtPbso5XdphLDH++pP51yXxYvNR8GfHTw r4rs3YXemfZ7hWCfeaGTIJA/2Nma4qdSEqDk1rpd/hb8Dw61Sm6DrxvaMqcn5qScZF7w5rZ8VfAj Rdfbc+reAJzo2qjBaSewkOUZvUxsBgf7BqzZzQ+GNYnSYxHQvERRL4YDx28/3Ybr/dOdjnurKx5Y V1Wu+Frf4dftfeKdKhiSTwt8Q4xNAgG2Py7yNZ4B7YaQxk9gWrnNJ8LTW+n3eg3Uf2ufSmMARhgX Fu2Agz2LL8gI+6wg9KqrVtFST20fqv8ANHuZfmtSNFKUvei2rv8AmjtfynC33M2fin4PuPGHgZtY s0Fz4n8Pgxajayjemr2ZX5w3d3VVBPQsF353hzXjFlplrpOkNLawyah4S1CYebatJifS5+oKt/DI OSj9HAwehA9y8CXN1pccSG6dpY9tvFcqPmmTG6GQcj95gEgZ+/Eyn75FZXxB+GR8PapeavY29uba 7Plavp8YxCS2DvT/AKZvlWUjlCR9BjLEQcbxOfihLGRWaYR2aVpK23n5rpJdtVscVqt4dLh0+/vX uNV0O/kO65s5PJurK4H/AC8279Y5GHLxnKsytkH5GEXiH4SWdhfabrkF+kENzIWsPEdknkw3ci/N 5c6Ln7Ncjof4ScHlT5htHToPCNtLau0114e1g5IIG5HXow7CWPdgjoQ391gar6L4ob4Oapc2sqQa no2qRr9ptHBe11CE/dcDsw5w33lYEcEEVnGSkrXtc+O/t2Mpf7XBOLte+vLLo0+sXunuvzo6rpng rVbue01nRtV03xBEAouI5Egtblsj/WoFO0kH/WJhTgZU5L1Botp4e0vxla6fbfDvVNR1ktm3tG1M XH2g7dwcIYSjIB824/IBhs45rp/iD4d01NOhe1nXVPD08Sy21zEwe60ksqsYm6blUttZf4W6HkF+ Ptb698PJc6Fem9k07UbYx+dYks5gz5jFDkb4vlLPGSFOGB2kHHJUwfNBwUm2+8nbX0exyZnUnSr8 04Rjd3UlGLv2u2no+kvvXb1Pw94y8N6v460+yTw3deJfFG2UalfWuttLp2lWzcGO6uGCQ3Uakjcj L5Y2hRI/CV1fiGDRPC97deL/AAvot/qV/qNusNxdL4gjW3WNdryDTI5kl2xI2QQUWeLCkKgJI+dZ W8S6teWfg+zil1OC/f7Za29m4WG9CjInkZsDZEoJJlIWLBJCnNbHhzx/YfD3W7bTvCmowa9fSTKt 5qEzlLK6kOQYbRXICQZc7rh8NJkkbIzz4ryRKoozm33V5NJbtt308l+fT0MFxbJS9ljY8q6StG6k 0l7qs76bv8tEbmmfDLwH8VtYe20XQ9Xh8UajPIy6OviITi8fBdjFIbRvnAUkiR2JH8RPA9P1rQ/B v7IeiMxfUrjxv4mikW8uxdpNe2FvKq+fFFdCEEB2GDIUDth9pVSCzdH0Dwv8HvCUniSziSW11iZf s0EBYPq8iscQxyFVIsY3XeAoHn7d7nYEjOb4D8My/HTX18ReKTEj3VzNJBe7RHBLHD81xNJuBH2a 23KN5yWkZI8Nk7fJxbjiZOVSclQhdWu7ya6LXb+n1S6IUaeGmqVOEHiZ6qVvdSvu9NG/l+V8PRPh B8I7PyPFA1DVtEtYrgQ22l69ZG6sLy+MRkVGmhCy+UhKu6iE8bVZ130/wNoV58F/h1418Qx6nBqn jb4jXjeEdK1mCQTJFZOgl1O9V1yACpji3AjZ8y8bSBpXfhy/+MPxP0/w9otjBDo2l+ZY2tzcpHdG 2tPMMk15OTuUSSNuldkxywGSFFek3+hazrfh7Xr3SrvTvCfhK6uI/CmiJ4i1D7Daf2dagzXN44fB lkuJJNmxFaQrIxC4UkYYirNONCc3Jys3FtPlineKule/WXdJ+RxwhRip1VT5eVtJpNXlb3nZv5Lz a8z5Jtf2dtS17Tr/AF06YmmaDoyGSyN+fskF7FG4QpCzlRJjgsqEtluBzXoH7Pmg+OvCWkeEdP0P WrvTn8c+J729ZZWaW3ure1giW4hnhfMU8TeY5ZXXDdD2rvPGvw1064isTfalq/iHWPFV8ml2d4IY 7CwijjCsRbwgNm3RWJX/AFKqowEUJg6HgC1h0zx/pzW8l02neFvCF7cLNbNgQXN5diXLgjcF8trf djBbIAPBx0ZznCqUnTptOyurrTRWX/kxz5Dk7p1fa14tcz/NptdvhOd+MXwesrH4O+Jrnw6nhvwV F4c8VL4wWRL6ZrO8eSyjhQWYIZsP5scyIckKCMqQUXE+O3wf0+X4c3es6Bd6RpOl6ppunNqkjZXY Uigl+xwqFLN5txMspONuIc5OCKzZNBv3/Y+1K0urmG4ddSN7c26gy7vliHlbgcRvE00shB55kB4x Xs/xO0Wy1r9jPwNI3nandWegaZcvZp8y3CRSXFja7woyASbUsoOdwZTjt406s8M6U+e6U3Fvvt1f n5nq3hioVqdOHK+RSS7W3t0s12PLPgj4GtPDnhRms9X0LUNT0G7HjLTbRJUliZ4kaDU7K4d1CPDP bO4eMMQij5vLJUj2zwx+z/8AbfC91Z6Hp2LXw5bPNpF1fXLXOn3WhSuxuNKu7hIJQHtmWWNVUtKw ilAcLsY+P/CrwtqXw/u47y28HPdeKPDsEeu2OiSW8kN5crKjWl5BjILBiyMVHDKGzwwJ67Q/H+m/ C/4g2ngSwg1DwzPoV3/b/hORyLp5PNHmvCVXyWd5kB3LI7gywlTkM6t4mc0XWrT9ld636aWtd2Tu 91t3l2PWyubp4enGbSdkut9dV5d//JSHwxc/Db4Df2vbwWsraFqiLDJP4nvb2e582IkFEtTalInT zJCPMDyFXG4hJCK+gvhZP4U+LvgWTWPBOv6W8GlxJDNJem7t9rP86pIQrM4BUgPIZHiJ2svI3c9f eNPBvjn4b6bq+h+Grbx94U1O4u5/7OuLyKO+0+9LBnhtba4j+Zo1OVhLNujdWw4YivONK+I/i/4X f2nq+h+MbrXNEhuIdPbT9U8LfY7vTA6OxtJ7aKNwilQvPlmJyOMHcB5tPBU8QnXm5qps7t6tWW1t H80dlTF1qNsNR5XTeq2VvPrc+hPAzy6Z4j1LQtU8XeAQNWtItU0a1uJ57a7i1SF23ZgdVaOC5jLI VOBu2sMggVg+IPhFo/w28ceGJre68I3k0l/O9jC+iXDQ21vJE5KC43COQgNF82cDbJkfMcc1r95d XlzY/ELwX4R8CeJfFfhvF7qGlNKBey2vlqHZESUSb0wPlYHAUAh8Lu7K/wDjboOi6a2qtoD6bZ2U Ml1pb2cYSSSzuImO0gqjAKzSLhySOATlc11xjUjCPs5ptppXST9Gte+h4VXn9rL20GrOzs7q/Rrv ex4Jpd5qjf8ABTPwfd6dpvw/kspoLYajb2ZsQ4kSIhyCcS5RogRt/ujqKi+HFxqHhHVbq+8RaLoF rcDw1aR6Yk2gQI0N/dzPIx80QgNtimmyRwNoyOufZrrxn8OfiXdfDvxHDLqFhq2r6JrDR3aTyQrZ yx2FykobYJAziRSRuz1yCeleVaj8KG8bePb5/C3i9NTaeaRLPTRNE5EdvEtpA/lq+dwAuCpMQyxT djOa9rlnOHJO0bRS6tuz7+a0uea8ZChWvG71bWmibWv+Z3Pxp8S+HE8JtrGq6VoX/CO2tm2oz2ce lxLJexs4SC3UgAqJH4JHSOJ2Gd2R8sJ4gsfH15deKtb8NaLDPNL5QuWgnjgRHJKYiM+x+jbU4AEZ PyqBj2LUfh1H8WvFWnaHq94LHw14avI7DX2hIjgl1BUcQW1v/E4jhX7PkbTiKSVsb91eJ/E2aLxp 4tefdFbaFaNnT9MTesZQHbkZwADjaZGIJ24CgAIu+VYaEIunKTcur7Lol5nficSrxqcq5FayXV23 duiON1n4a2+o67c6paywQo8/nya9qGZzI552xQlcPhsjcFO7bhcDhqPi74f+HT4dl1e71K9HinUt SuJ7uKbTokF1A6xyRzwRowSANI8oKuvAVGjGDtHo/j3we+r+FtNur6d49Wjl+yvHcnyjGjgNEyRZ 3IAQ6hpNo2lMKABWHpXwr0kzy/2zrdvZmLJaO2ha7kc+ikYQn/gW3n71fTYPGpU03N6aWSu9DHNM P7Sr+4oxV1fmbS330fbp1fdniL+CoZbtjbRvFGOAjvuLfU4HP0ArW0rwPpmnAzayt5NHGfktrR1h MoIOcyMG29uNjZ56da940q58B+GPJjtfCF94leMsXlvZRaCTIGB5aGXnIPJfvwBTP+FxWumar50P w38AmJOEjvdNe4Yd8MS4yfwr1vrspLRtL8T5tYCjSTnUacn2Tsn+Wh5X4N+IGi+DI7gJ4TtESZPK LQyymaRDwd0jsdpI4PlqufpxXvXgH46QeBvhXod5L4VvtQ1fxDLcWmhBCt3daRYIVjecb4nEytKZ I44nVgvlSldhIJyNE+Ml3M1xqa/D34Xx2GmMss2fDEMkbMT8kWJCclyCMcnaHbBCmj4h/tL+Lvi5 a2qeIrXwlLplmiwwWsGhW6W9ugBICIgWNcZxtyCM9K4604c94rXq7u//AA57WBzfGYeiowmra2SS 7318mbGr2N1f6ktr4j+EWqeN7a9TfF5PgWK2lk9f38CW06OBklXR+Rn5lIY+l/Bn/gnHZfFRNP0j wzpmt+CdN8QWk1zqr61pnk3mmWVxMqusTYljllMNqVCbo3KzMdgG4j5r0vx4bP7Vp1t4a8P3drqc ipLBHaTWzXfOFQ+VKrYz0APU19V+FPiJ4Tl+Huqy6D4Qm8E6Ta2yaPpmqNdzamLySWFUuza2uY3u SFgjjEhf5VwX27itEqtZ2hFJv+vxPQhmssTGU6iTb0tZPV9mrPbUy/HHxr8H2vxJuPD3h7xJoGl6 No0H9l+HYr5ryEWYUeWsclslt5TW864WaORmz98qWX5sf4PfAE+E/jP5nh+bTtL0jxtZX/h7WPDW 25tbe01Ke2YRxwpdLGGjM/lPH82/hkGdmapeJPCz69pM0lr4r+IWvNEvm3N8PEsOhxqCVVnurWRZ JIsf3hv3AADJya6L4J6P4Pv/AIr6Zrmm6xrmq61YS28UxvbSbWftt1BKps7iWa3iAgb5fKbKu4Rt 28M5ISk6a0Wu+7/NnrVMU3+7nRcUo6Pbptax9V+F/wBs26vf2WdP8F+PLa61XVBFHZanfaXeu72k fmrGTJcozIZ4l5YKzgbQCxYEV8uft3+K9O+K/i61+EcOgWlvrmmaBFq/grXLWxH2y8uCjzz2c4y3 mebGDHnO4XEJzne2NjwrY/Fv4S/G3xPpura6NI8JJM99b/ZrGFLf7HbXKzMC6xhLeNoQVZW+fkHa SKzLb4reIvjb40+IOr3+gaZq+r/CHXob2zu2tRazm1Mjj7OJUA8vdcxRSOzsFEMlzng4OyxEU7bW 1+//AIJ83JpuU6eik7WW13rt0PXP2ffEFjqHwZ8F6D8QtFN9r3hzwnJY2EcJjJuZzK6vaySLlGR4 2yqhhgo6g5fFeffFD9kXwlD4zXxLdG21Xwxa2zapqOl3ul20lxKNhC2iTBBJGHlKoHJLAOSAxXI9 fufB3hj4j2mlXes+MDZ2XhPUf7Q8PfZjN++K2thNFAZgoV0E1zJIcFlZpRycGvLP2nfG/jjwBodt N8Nr/TopddkGt3cV40a3LrcnZDCjzDBCyCQYUgkyL6gV2UIqpF860uRgak3H2ab3dlfbv5bHy3q3 7YnxW/aK8Sy+BtJ1Xwb8LNNihe1n/sy2WxtY7GCPPlPtWSYwQQxk8cBVJbJ5rzjWvjLor+F9R8Py eLrrxsl/dQXSTXtvLoCJLCHQMjRJIzho3ZSXdCVI4BUEfXOvfBC88efBu+1H4l6FDofjDxJGv2u7 tLiK2sjp8bb/ACJ7uNGLtK8Yd4YA7hIh86szR14PF+y54jge3m8BaZ8IvE9u4SWCw0o37XE5YbhE j3TIzy4PCRTiQ8YXJrKShzNPT8Dy8zVFTTV5L7vl8u9ih8F5fE6xXd1b2fga9sZVVEil1q41yWA8 7JIoTd3BWRDyGMSY9QDWf481n+ytTOu+M9a1ie7ibyYbrU7NZdoAwFiurmW/ki6/djhTHYekSeCd H+Muty6L/ZGh6D8Q9LkcXegavFckXzorNJHb+dELlZ+Di2kZix+5KW+Qw/CzxXpPg/T7u00b4q+B tGt7791Lp+oaTqtzaunQLJDcpJbjaSxHynr1HWp9qqfwxu/662NqOOpU0nQppPzav/XzOH8UftDe Brq6TfZeFNSMCbEuNQ/trW514PRJZba3HIHAi288AVk2n7S3h28Z7eTQdK1mwO7dYywvokDccECK 4KD6nnpxXpvjD4Bf8JMbu40D4jfBO5ttglnt4NChaK1QDBZWkhmk25zkluMnoMAcfo/7L/ivxCk1 5Zat8ONW0yEFJb7TdHaa3gOOMva2bbW9mGOehrqljIODbsntu/x2MK+cY/V8sUn5v8VzW/A8r+IW qeD9fvGksPhm1pvj3/6B4pN75YC8k7UcKM84P59689aXQXUh9CuxnjMepEEfXdGR+lfTmp/s767Y yyT2fjPwfoojwIjqE62ayNxwss1rBhupxsH1rjvE3wn+I8yyahcDRvECyZ8y6tbzTtVDAAZLNGz9 B3PStMNjKkopJJryf/A/U8aUsbPSMU2+0Yt/keAatp9jNOGsYbq3jPJSeRZCD/vBVz+Qqi+jkKMr nPavVdZi1vSrUpe6VY28TnbvfRLaPP0cRA/iDXO3ljHcxxqtrDAVyGePeWk+oZiPyArrU5J6o8XE 0JRm/arll2tb8DiTop2nP6+lEeiFvX+lda2lIj8gH09RUYsQOOAO2RT5mzkvBM5f+wi5HHOO9OXR wB0yRXRPboi4AH071BJGDnAHHNITaWqRiPppQDgHNFakojwNxXHbmigXMz6NsLlZBtDDA46c1eSF FIzJjPHPSuMtdSeSRRglgQc/4itOLWZdo3HcPpjmvJlF9D6hUrLU6RI1edwQeB68EVZ/s5DFlcs3 HynjmuctfEJhO3qM55HT/Cra+LAmR/FjjnGP/rVnyTNG4WNeSN4ichjzjj+VWbK/ht7hWmU+VGNz IDy+Oi59zjn0zWKfF0JiIaQMcYwGBz/9eqr+ILdh8xKgryFbJ9qqMJWJhWhGSlZP8jtdO8RRyGfV r8NKkb7YouguZABhAOyKMEgYwNqjG4ESab4q/tW7u9V1GNp4bbDSA8efI3CRDHQHBJAxhEbHQCuH n8Rx3McSBm2QqVQA8DuT75P9B2rX8P63HbaeLidUkg09jKkbDcJ7h+F3DuoC5xyPlx/HW0VfdHsY etSqzUW9Fq79X3fku3l5nZz+JZ4ZkhMbz6/q+FlVSA9usnAhXsGYH5sfdUheMuKpax40srW3GnWs kbwQndLKD/x8SjI3+6jJC57EnALEVy8Wq/ZbC5vZHke/1INEryElwh/1smT1LZ2g88GTviqmj6Uu p6jBbB1j81gpc8qgz8zH2A5PsKppPQWJqOVoUvil83ZvT5vdnqvhKK4XQIltgkd/4tZrGDcPmFqh Blkz2BYBcjqEkHeu58PavpOh2y6puzovhoS22kx8ZuLjH+kXWOhb7qqc9WQD7tcBoEst3ah7SMrq XiEppumIxB+xWY+UNjPB2qWJHorfxVT+JHjW2k0tLDTyV02MiytADy1vCeZPfzZSWJ9YhXoRUaUO ZdLW/r8/kffYZ0stwir7uKVr9X0/F8z/AO3exn6nfr4g1S4vbpy813IZGPqT6emOgHoBW94D8NW+ riOxjfNzrd5Dp0WRxtLKz/8Aj3lH6ZrhrXWY41VCZAD0P9a9e+AWpaTe6jaIfnurRJrktt/1ROEy fwC159GMqlZRb3f/AA58tw5g/r+YqNSSTle7fW71+dtj0Hxv4gtBY+Irm1dIYo7NrS2jJziJ9kIT 8IZSP+2ftXnvwu0+C31DUrgNEGg0u5I9TlNv8mqx8TtSg0fwdJBE7F7y+RmdlxwEeZh+H2iP/vkV ynh3Xm0jRtSmQ7WmjFoSB/z0DH/2SrxNeSrJS6X/AK/I+g4hqOWbwUnb2cX52er/AMj3b9qKS11e 68L2SxgNpvgbw4rspz5h+xRsD/3zOo/AVy/j60t9S0mwlYqTbW9ux56GSEZH5xH86h/a/N/4U+K8 emeb5ctv4S0KycDoHj0+0BJ9P9WePevPL/VdV1HRJN02dunQvECOd0c3l/8AoJc1zN/FC9tvwPGt N0p0Fs4q69Ltfiz2/wCJ0Z8W/CHwL4hWRmn0yKXQbiZSNymF/NgJPrtkIHsnFR/EDVINYGleKCwE WpQeTfbByGJIYgDGMOHYen7uuA+FGuat4k+AnxA8NzFWvrKO316wxjG6F/Lm4/65Sk/8BrG8AS3/ AIu+Guu6BqFyEMLLeQP0CxORHL9Sr/Z5Mekb12R5ZJLmXvL8Vp+R3YWE6z5Xp7WCd3/PDT8bfid/ Prlm969m86Ry3QkWMo3y+YuHlRSOwbZMoHG1iBktRY/HC18STwwzODcXAOnyoqBgLoAny2HT94uW Ud2EqDrXkuneHNVv9BjgaYw6jZtHFFL/ABxXMOTbn6tGHiIHHyRk9Ko3vhxh4nub0kwaZ4jQGcRq d1nKCGLqf70co3DHJRu26qpuildz0OmhiHhlGUE7Saum9LP/ACenlzeRZ8YeP28JeJvIuLQv4X1I vb3KcvNYXKggP1GWjLBlwcSxnqCTt467uLnUkn8L6vMJboP9p0u9jclWZuQik4BilXBGRwwU8ZYV 6N4y0x/E3hpdYvYfmlZdI8TQRYYiZQTb3sY6BsBxxgZRl4VxXn03gW4ubd9Enk33tiN+m3Ck4kVv m8sHuHB3J/tHGPn47lKnF+78j5/NcvUKrVFXjLZPqnq47dfs9pJrzMn4feMn8Gao6SSXIsrkhbmM HJU9BIoPG9QT14ILKeGNdxc6LcaxDfWUNtcX+mRRfbJl04PK9lE3AvoB18g8B0YjaflbBAK+b3Ph 651G7kmkKmSRsucffJ6n09/xrsfCDa54m0e18OwyXFxPpryXGkxIu4KxXMsJQcMsigkgg5YejtlS qReqep4eUYmpb6jXTcVfluvvXz/P71eXT3+Hmk3vhPX/ABHYpoWsETzNpNx9vknjdVKSo6OIniJj UPCZASQd67lXbl+ALLwzY67JqOvQJdaH4fCS30cl1ufVHJPkwQRKAS0jgZyWRUDFzjGdS1+Htp4g shbear20xeWK2gYEaVPuAZJJ3xHHBIMkOGcDAzyrZqww2HhKWGTTFjuLqOFUf7PvSIsANxaZsStu 5BRBGoIBBbGa8/E1qcoSpQbvLe2j1813WhGIwUoVqcrJwjs308rbtJ2sem+DtU8VfHHx5e3Pia8v NN0aGyN14hksWX/intJUBorO3iOGkmkbaqkjG9iSQEfb3nxm8S22g+CDaareDwiniG1tZbu1ixP/ AGNpMA3WWlW4XAk4YzzOCcySKzFd3Hk/hPxksmhWM+oWFvH4W8JxNcXenhURPEmrzJIkMD7Rl41Q nlyXSJZHYlnFQfCzTJPiT8Tbjxd48vG1XRtHnXUdXkvJCkWo3DlmgsgMEiN5FYmNAxEMMgVSdoPy NXCVJVef4YU1okrttPRLfV6Pbt5nv08RTpwtrOdS93JuyXV97LVb9/I9OHxT074LLo/hXwHomp2n jbx3Z2ktzf6hLG11psFw+YYpFKskTmBmuCqqWjDx7icV5t+0F8Ur3x/4+eSe61rUtJ8PQNpmlR3V 20ty0URYNcOz5+eeXdM27DHcBwADV3Q/Fq3vi7WfEupq01xrRuzd6/cRBLx7mYEObWIMVRlRhGqg t5YcEuFwldz8HPg1oPiyy0y9vdMfw/pltdKLGNLoT32rzggxRHKquSQOSuAvOwKctCdDLpvF1U5S tq73bb6LXpsktlc5q/tcXTVCNowvta1kv83q310O3fwPF4Z0mysPIlUfDvwLJqM0wG6C7v7pTBHI MkDIeaRmAIPQ55qt8MLPS/EQ+JetpdabpumMdN0fT7u5gmkTzEjZfs8IUPM/MaEb/uqCC2TlvpDx H+yrqvxH+CPjJrPSLyP+27+GCK2XdFtt4Q3l8uG3szMG+6oyoxjANeY6t8HNT8NeLPDngHV7axle Iwy3EdvIRJcXmwtJLkAs4AZIR04hQ5HIr43C1XPD1a1Vu7aS1Wzak/ne57OYZnT+sQw2HaSSevnb lVreVtSL4BfsS3/iHwDpPhtikJ1q9nnuJZLaREKT2IidwuPlULIW5A+7jFd58Vf2fbr4Nfs56r4a stZu7nUfDegan9i1OzmdYniUwzq0ToQchoEYqOQbuTnoT9ffs4fG3wjpPgNre5v4bhre9u4YnW12 LCI1GYVJ+YkDC4P0ya83+PXxI0P4qWmuJoF213N4ecXYtTbhIZbaSPyLu3PqoilWU45wg5zXB9aq ToqrOXM3O7j2fS6/E48Li5RxSg1yqUVG/lfV/M/Ov9lXWbDxfptvpWq282uXOkyTvAbeJhO1rcQt HNFGWYCXO5mMLKN+TtO/BPq3w1+F+p3enQ+HfG2k6n4g02yeNLDxBJbx3lvfQ5J3sJCuPKbljvSV QcHdjYfBNIs73TbEvFYwWN/ZXbSKsMQR4doWNY88BlyTnK7jtznrXvvg7VvFXiTwzdSXa6FfyS3C 299p87RLeXc23aGiSRthu0A+UrkXCD5gXUqfZzbC1I1HWpNcsu+6a1urdHd/f8z28rxMIwUKs2ml uktU9NX3VvwOS+Nf7NnhHwV4ji0/SvEWnaLZeKI7WaawuNTWax1FQxaO5jcMNoU78F5EGcqHIyK7 T4T+LNW+Cklxol94j1fXfDdhbNb2zWWgWrtZphiXZllkuPIIyPmjkR1Y4I6jl49Y1f4YXz6HrHhv QvFHhjUN0kMN/bi2G7kb4zuJtpgW2yKmDxg9FevVfBnwU8CeJ9J0y40LRbm5vpbeQnRofGtsNU0y VSRvtSECyhvvBVIbA+aNutVWoOpQSqT54vXpf1T3TR588U6dWUbJPo7NJ+TS0VzL8GaZ4Ptddm8c /D2OHQtaspJfsl3dGceH9XfyMeVOH2mykdmAYFmgYnHmKTgeoeBrnUPGPhW9uNJHiKw1C7M8N74d nnaaTQrwwvkIzb0+zSbt6ZQK2B1JIryn/hUE1/brH4X8fxf2008zG21SJ4r5FO0NDJPbtKt0GCBS siHPTaoOK3PgjpuoWiMdS0OG+v4bhLXSNT0Uq62pYNvKwKQyIHUhowojBPyxxsN1ctShR5LuV2rb 722XqbTrYhzSirWV720vu9evkeZ+Efi9qtx8JkGt2NleX3hzWby3doo1s5o1mtmBX5FMXL7h/q+T +dcb4e+GS+Itb1mTSLu70jVryKK4lmvbYJbWMBwWlaWEHGWIK4RSZPLABbGPpT4cfDe++I97r1xe C7S71A21xFamHISRT5ByGHGF2EZXgIegGD1Vt8Pbn4W6NcaRZNb6jNbpE800EYEl5LG1w0W9yAQE 82MjByqJIF5cms3mVKlOXKkm7bbelmujL+pc9Nc/vS639N7nz34z8K6X8OdIj8Oafqd+NJaCNLSz ksUulW+jljZ7iREdgbmUEt5as0iLIgYKiDHA6L8P4PFWp3l5FJuvLTN9qdxC6MlkN7EzTTjdFbtj lYofNkyGUMpO2vTdb8Ex6Ol5Y+LdT0mPSLicsNIsrqK01KWUDd5r+YymNWz8xlByWysRwCOO+Jfi RtWktILbS/DGm6TpriS0sl1K3vobUMNpIjjZY5HIxuZ1ZyQORjFezg+a1k7t7vQ48VKNkuVWXRX3 87euh5h8Uri18T35lsorfT7C1ZrSO3gHnSMi4ZZpnUlZJJGJJbeTnOOABTtI0CV1cWVppmmtaRre rLdzJPJPHgBx8wwdpBbAUHG7rxW8wvZtbGl3F/Z4UGJYrKzhWMsCcD5VAJ3d+evWo20+xubCPOoj z0VgqNAR8p7ZGe5P517sUlBQT29X9+n+Zz08S4TdZq+ltWk01ZNJttowvEujjbLHJr0t6V4WOOBh G/05A/SuaOiRlsSbY0DZ3Ef0H+c118HhaO5kKR3lsm4cLKzIoOOBkjAHHfFE3hAxIJHZLxcB9ttK q5XoeW5yO+FI967aMoQShzfgl+h5eKlXxdX2nIkr92+vW7ZFq8tt4e8LWmj6faW0gdhd3l3fjMck 7LhQEOA3lo2ACG2s8uOGFV7P4E3HirT31Bb2/vLdEws0Fp+5dxkkAyMnlxgdDjJ7Kegs6jdaXp7i W6k+1ztnzFtovOZuOCZZcqD2JVKht/jHe6FMk2lWNrZ3MClI7u5Zr2cL2x5pManHGURTzWsIqCs3 qeysRgk2sWrx6KLtZL0/U9C+C37MGm6/dapqcXhbW9Vg0KBUNqLtpXuriXCpEWVY2BPzNhFDBVPO cGug8d+IrSLSLLUvEl54RZrAHT4tLS5VoLZFX9zG1vapLtCASqEf0G7uD5Vq3xn8R/EfS5R4l1K6 uLG2Vo1uvPaE2wZcGGFFwnzDAKKoBHLEKCwi+Bfgj+0F1K7kkMWkaZG18l24VUjkQboi2/5docAE HIO7A3EhWTx00nGKSta/mvU9/Lcxg5qGXwik0+lnHTrfR3a3PVNOtrHwjr8WoW+iW8vjZLRbyLS7 Vf7OsNEi3DEl4iszSO6kYtwi8MN6knYH/EvTvFWtztd6jqmnHVLaISTWfhdFvYLBGXKlow48hyu4 4RCBgYCkYGd4b0q6v/CC6fo2nyWmj+Jw0s97qkMs91rEykbnsrRWEt3IcMTNP+6XeVPkAvv29W+K /h79n59C0LwtofhnXvifq81u9pPc6fZSp4YMpVYJ2aJAj3JLKwAJjjBVt0uVIwdWpOV72XRf5nR/ a3sJc9eKlJ6badNtL2S6npdlPfaBoCeImuvEFxq/xZntoW8NXMAuV1a2FvbTTSGydZF+/wCYuGKR qhbLbsV3nhj9nLStS+Fur2tn4Z1DwvaeNrm+XWPDqa3Dc3eoyTM0kLoThpJFPlFo9waJScbjyGaV 8fNPv/Gvh3RLa3knvINFm13xd4tvZGnms7CEybGmxwrS+UjeWvPzrHzg5+N/j18aNc/aM+JFvqdl a6RBp9jdpp/hT+z74yWNswffFDLgrLaTyNg+d+7DSAhhty6aW97nk7pfmeM63tpSULJ97fovzPs/ 9mrVtP1f9lm7t/EeiIDpNrp0OppqJS0XT4kZ3KkKqiHy7UQkjJJ8tQxZgSeh1X4ZaT4I8HP4k1bT tHtmt7yVJZ7rV2trXSNNnKiVg8uRIyhYWSNV+TzFHG41u+Ff2v8A4capf/E2w8WW8cup+F7iCS8X 7OJLfVtsDESL/DLIrRyxtnBPlAEdz4N8ffiNbfEn4+awyR2XiXw14l0sadcahe/aJ/7FvipFu01u HEcdrNDIASqhWYYcggA+nhlUnB9lr9/6Hi4LD1MQ3C2jd27aX00Xq/M8L/aIsfGn7HHimbxlp4v/ ABHoGtYEPi9dYS8giifHlIbaEeRFCw2KokDoG+UFDsK8A3/BULxV4Rv7TU38MWGvW07M2oaYbh0t pMggXNu0CxusbjflG3CORWyqlgo1PhD+1z4q/Z0nvbK/+Fel6l4Rgs54Nf8ADn2mbylt4nMF2nly SSKSjfOCEJETyBiVUmqf7Tn7BljqHgnT/GvwUvZdT8I+IANX0eKKRkurJGA3QZJzHPGx8pwWMcu1 PmSTarp2m1GeqRw4qLpT+r4q9lqtFez7X6eR6n4H/ao8O/tWfDeXS9KtrPxF4kQvd6bpPiq4t9Y8 y6A+WxiuLiM3se/GYixwkgKLKynjxj4z+HdH/aMsL7xjp3gvWbHxVbQPP4x8PabeSJr+mSoWEupQ 28ihLy2PDOsRRomLFxtJYfMGn/FaDS/EaQeO/Cllrk1hOfMuBGbHU4nVzkOy43MGBBWRd3H3gea9 os/EOrfEW8XxF8O/HaeJ4zfi6TQPFaA6tot0zNIEtJy3mdiUeGSPPzA8g56J4Cd06U7r7n6aHM8F 7W31GopPtbll6NN6/Js8k1saj4FlXXfCms2etW1nKsjO9utvqWmngq9wjqJIhk4Mikx5/jqj4j+O 8MXiRJfFPgz+zdV8kv8Aa9CuH0e7uQzZ81iVlicEbvnWMFs5LNivqfx/rOqa9aweKZdJ8OeH/EDF k1Tw5qOnjUdKvZSpBu7Pbi6ijmAdZI0aRllDrsAKivIrzU/hLrWjpbeJ/DniXwDp13OyRX+gXSeJ vDEkrElmFvI0c9s+BkrFcCUKRlOx5adeV3CpG9tPP9PyPFxGJxcG6dR6ro1e33o8tl8SaDfB5/Cv iTxLpUkwxLbi3WOdjwAGWKRVkA/vRqTgEsg5NY39oa1qt2Xh1Tw/4lbzFZ2nkSK7lx0AeYR3BPb5 Gz716J4u/YIvtd046v8ACTxF4e+L2krGZZrXQZ2/tqxUY5k0+VY7kj3SNhwc9AT4Dq9jPo9/Na3l vNa3Vu5jlhmQxyRMOqsp5Bz2NelQ9jO+i+6zRl9bi0lUprzcW0397t+B0fjDXdY0nUFS7s9T0W6l BZ45TIBKp6bd/wA5UAfxM/XqOlYH9qFyc5B6/Snab421XSLU2sF3KbMksbWXEsDH1MbZXPvjIrOv rx725aQQpBnkrHnZn8ScfyroUIxVomOJVOcU4Sfo+no1v9yLNzqm1DnaOO9Zc2pbsks34Dp/9ekl Vm4Kn8e1RGLAxgcGqWx5/smRXOoO+du7HY9xVaS/kk4LYH86sTREsSOB/Wq8keGHc4x9atNEcjvq RmXccluaKaYd3YcetFF0P2bPbhrMiHCgDPB46VNFqZZdxyW/IH3q3F4ZcqASMjocDmpB4Rd1B7Dj 2FeZ7eij6j6piDPm8QFUYL8obGMDkVUW/kl6Mc4xndW6PA0jsNzIrH+8cYqdfh8AoLTLgdORj2rR YqhFaMznl9eb1RzSrI8hJO7nqD/n860rW4MaYYfr/nNbsPgQB8b1Y45IOB/+qrMXgY4wu0j/AHu1 TLG0u44ZXU3sYcUgdlBXP6irqTlIVjB+VGLKp55OAfzwPyrZh8DgDkBec5JzVy28HpGPvr6HcPvV jLGU+jOqGW1Vo3uYnnvdFNxHyKFVR0AHp+OT9TWr4RD3WsJEWaOJ0bzZVHMceMyMB3OzcMd81qw+ FISc7kOeOnP41p2WgR2lpcJGQrXKiNiP7u4E4/FV/DPrWH16knqj0cJgnGrGc3tr626eRa07xRLH 4X1LxAyi3klB0zT4lyRCXA3Mh6jbEFQH2xXIatcm7kt1iDrFbwpGgPbu35uzH8a7nW9KFza2mnps EGnLsAByXkPLnP8AvZx7VTXwkhbqBk/WnWzKndRWy/Pqe1mrqV1GjF3UUk33e7f6eiRxymTbgFmP pjofpXonwrEul/D7xJfLkXl20On23OCWdjvH4Ag/hVWPwkhIOVGe5PBro9D0sWWn2dtERJ9nuTqD rnA3RqT+oFPDZnTjPmfZr71YMgo/VcV7eT1SaXq1ZP1V7mP8U9Ul1TSdIIlEnmyXdwhz/AZvKTP4 Q/pWFZxTx+FrwFmJe6gxn2Sbp+ddnqWhw3ttpisuBa2vlD2HmSN+pYmli0G2/s5YtpJ81mbH0GP6 1lUzOLqOVui/RG+PUq+MlipvVpL58qR6H+35fXN98ZIR5QyNK05y5IZ1Js4flJ6nByD7ivLdJLy2 9hu3ZeC4s9uTlmIYr/49IteqftH2MHir4w6nP5bAWoSxTkn5YFEI/wDQK5jTvD8dpb2ZCEtb3DTA Hv8Acxn/AL5NYVsdH2sv66o2rybxDm3sor7rEPwA1JdL+KFhBOStrqwk0u4DH5SlwjRHP4sD+FUP DEsnhnxFiYGOM+ZaXPGSqOpjk49drNj3rXsfDS2NyskURDwuGRxxyDkEV0nxC0CO48aX93DACmoO L5VC5CCZVlA/Dfj8KzWOXsk19mX5/wDDEwUlhotbwldfNLT0TX4nOwW0yaihkBjN+DBMTx5U6tjJ Pb5wjk+jGrE/h+XVVkhWIJ9tX7TEmAvkzDIdAOwbBAUcn91W8mkyXtofkwWQS45JDD5GH1YYc/QV pf2eby1dyxjlyLgMGJYPwHP+8SFb2ArGWKjql6nQ48ycem/qnv8A5/M5fSNEaRo2ut4tbqL7BfhR nMfBjfHcrtUgesIz1qpc/DWea2a2kijNxYEtbyI330zuIDen8anvluuRXarbR+fIyQ7o7hMlVwuC e3sAwyPbHrWpDChs4pTE4uIG6hgML/Ccj0PGT/siuZ5jpy3M5OUo8rV/1Wn/AA/rc8m1j4YT385u TBGrT5aTnHz/AMWB79eOOcdqpn4U3+VCIihcY2kADBJycdTyeTzXsk6hmbbAApOcEAkf5/Csy/vf s0DKtrEzdjjH41nHM6jdkzzamF55c3X+tTyrV/h7qF0rwnZBaNJ5gt7ckQ7hkA7eckAkZOTjjOKz H+Fl10Q45wRtyTXq811JMg/cwR9ywU5/nUMol83hozvx0HWuinmE4qyOapg+eXNLVnA+Hfhjc3zx W97PMbS2kaVLaNwgd2ADMGYbUJCqCxyRxgEcV6NY+B7CTSbc+KriSax0+U3en+HdLj+ywgOq/vJJ ny8a7QFyVeVwxOcvvOvpWjNY20LrPHb6o7uJpLmESWlpGRhSVCsxkyTxghflP3j8mPcWFxqrt5t8 La1hO+edkLySscnJ5+ZzyFUHA5yQN71y18TKurc3LFdt/wDNX7jpUlTk9G5ba7JfqXpfAs/x68Ty waL4csNJsLO1aY21tKHmMUELzOFllPHypIdqbV4BIZgWNHwVFBpHiLS/EN3aFtK0N2axtojsSRwh wqk9wzLI7dendlFSafoc3jO8dI7pLPStLQSzEruFjbhxumcgDcQXXJ6sSqqMbVFy08MTfEPxNZ6R Z6jBpWkW12LC2upoiXmeUful2g5eSVlJ4O1d4+YIowKnBUFGei1W7ej09W+5hXxDVS0N92/Q/TD4 Fftu+GdU+FR06MXUupaJZwCSJ5llknaVlRAGXgEswAHb5scAmvlx/i7B42/aX8N3XhS/vINXimn1 e4nuQEdIkRpRFn7iRmJDlsDIkBPFdL+xT8G5fhp4V0W31OztLvUfFt4+pSRucixsY4njG8ggGTDu ox/HdoBgq2OD+FOjS+CfFXxG8Z3kVvrniZNHnitNBslNxJC9y/lqkqoCVIX5dgHAZgNqhSfMnhKf LFSleydn01aXTtfqeLRqydec4LSN1b07mEuva5deC/C1/quo3tit/q9xd2t1cq4j1KFUV5JB2kJm yO3LLnAO6sj4F/Fef4bfFrRdXn1OddMM62OqxyufLubVv3UqyJ0bET8bgcEA9q8rufFPiLx3408R apr888Vxodi4FvG3lw2PmTxWpjRV4RUM5OB1IJJLEks+CeuR+KpodH1BrdJ3uozDcXDlVRZA0LfN 91WDPCwLYUlQGOOnVUy+FCnKVk1u7LuezhvaV5KMrJuNl8vP5Hf/ABr8BS/DX4o+JNFupZFNtqDh 8uR58e4yRv77lYMCefmrR8G6LpfjC1Swa1hGrADasN6YG1ZSf9QVKsPO7ow25IAIZyKd+0j4kvPG nwn+Hfja5VIr2e3bw5rP2gkNFeWrFAX4JDlQWYNyAyYHPHl2l+Lp/D+pyosLWOowyGN2PEkLg4I5 PysGHUcjHWl7F1KSjF2a8+2l/R6GmHqRck6u3XTb0Xe57zq3wj1G8s1vNSt7m9nudk1vJdBo59Tw gHAbcBcKAFkTkyAKfmIDtheGvhl4b8TSQSPqY0GRJAiJqEySxu24feeJVeEYOQzx4PIB4NWPhz40 1DxFoVw9lPe3cd5Or62lvAbqfTrgZMN9Hnc2G5D4AHDLld8RWL4ifD2PQb+XUNUc6dNPcGG6tbVh NCWWJG+1I+7DJI0gYBQygPjcMha8yNOcJezcrdrdPK3ZnpVKlOpBaN2V2mt13vbW3Y67UtP+HHiH VbjSvEllqbX6t5cfiHTtsxuEBJMkyrIBLxnMqgv8pLeaaj8cWN4sFnpuoeF2tbSGJLmyvxdpcXf2 aPO2VGwvnRAE85IJXAZe3FeH/EyeHbK7t7WHTrma7CqHn2zxfd3B0jbOHA5Jc4X5gVB4rv7n4kaf 4Y+Hmr2Gt2n9rabaS22I3n2taXMqOysswUuJWVGJBG0qpBwdqKVYczjGSu1s76+tjlpTlTlzw0T6 Wtod5+zJ4l1X4ceEtSk1PU7XU9OluEhlmueml2+0Mdu7G2Us6fIWAUK3UnFdJ8Rf2jL9Nctba0m0 57S4NxbSRR3MQuA0Wzy54mwSDId6gEHgLkAZx8x+OPFcOg6Zb6euovJZ6yserGNEMRy4O1XTJAIX HrjccEgg0/xb4z07xBYaPq4Z3E1mtndAKzNHPDiMvzw26MRM2c5LkHnBrjnlTqT9pN732VvyOxY6 KT5F9+v5+RlfGzUL3XfFNxNFNo13a3KmSKa3srdC2eeWVPkc5G4ZOCfQ1xy+GEht5wbaG+RNubgI yFc/Q4B5x83pXXX+t2U2obbl0ZpQd8mWXfn5lfdzuDcHLDPJzj71ZwW20u8BSVVeFvMRZPlOQc84 JwTwRg4weDXs0Z8kFTXT8Tzp06k5uq+r8rfdscveost756pIGypJ3ZYkAZbPqSM/U1BqrI97Jdwi S3ZnLhRztJ/2uP5V0wWzvLpMIu2Q4aN3O1cnqGHb6+3J61BNa2ihpLKQpJ1aCb/2WQY/Lj8a6Pb2 toXDCympOUlZu7737o43UdblNujCcySqWUh/nAUgYwGHru9+lc/qGryXMW3fhO4UYDY7nH3uvWu3 1G3Fz8pt1YgckgZz65GM/jmsx/D8Nw+HXBbI9Bk/yFdFOqkr2OKtTlKVoyvfTqcLPuK7t7jHp0qn LbzTvtjDs79ABnNdrc6HbqdgCtI3yqqjk/T3rR0/wfb+Hr9DeW/2zUBhhpxfy0ixz/pLgjaoxkoD nAO5kxz0xnKSvEeFy+VSd3pFbvt/m/I53RPBE12bd7tY7+cYjhttxS2tSx+XzGAJdiORFFuZuWJG CG9h+D97o/wg025u9WjuNei12J7YRybTDO0ZWTNrbHKSeUV3G4lPkxhcjeSEPP8AiTVbM+GNPuLV ILmW2jmhv9VktzDbPIW3i3gjH8ID+gaTkttUbl5zVL268S6Zp6XEk7RyRmOAPD513rErTEfdA/1S mNdsIPlh1XIcliYlOEaV95N29D6uE6OHhKnhNXvroktNZPT5I6D4l/Gy6j07WShn1rx/4xRbKCO2 eSeLRbTcAUVutzI4ARcARIPMKKdwJ4v9lbwzc6b+0z4a1DWIm1e6nvJpTZrdoHv1WORp5JJiSqxo FdmfJJZCq/MHaPe1jVdP8D+FJ7W0gikv9SVk1C8juTK9+M7Taxyhsi3GMSzKd0zboo2EW+RpPhT4 NuIvE62s0dnc6nrI/wBPechI7aOJfOW1UIQEiiRFmnVBkJFHAPKJZXMPKaVnu/6sfOYlynVSjNzm 7Wa0SfZI+qviwt5pHwH8aw+ELxD4s1V7iGG1khi+06jCt0Z7q9j4JZZIpY/JiPCRumOXOflTwDMv hb45eG/CGo3uqaVN4UnF94jLhJo2jtY2vryBlwrKoCeUcEgiEnBzz7r8BtWvPiB4mmuV+3XT6VPq dhAjMvm3TXVt51tGzudi+W0BBx0e5tkxhRjyTwdpD61r3xy8Q6pIrC2tr3TrczMN1uLy8EU2xzkg JC0pwcjB6V22UGkul7+vU769VUarocz0u21s3bbTsZfhj46j4mfCnxdf39tp760un6k2oOsjump3 EsEsqXBjG0KCUusjHDNnjfWJJ8Qrvx1YeBdVvba6mbVfC13p2o29rdSIL+C382OSJ1ZipaS3t5tp 4YSeU2QVFefaQV8A+CrlreaVX1N1sr6NW4lt5IGbj3xJxnjKA/Xb8Na7c+APC3hu9dIrv/hGtXmn tkjb5LiO3ltpyM/3XS6n+o7da9KhVjpB9Y/imLDykqajHRSTvbvdtfN2GfF+5u/Afi/TdUEcOp6v pd7JNfl4wtrrIYRW1wWOTlLqEWsxPPN1Ias+BPiF4s+GXwC1fw34Z1PU7KKxuz4q8IXgw3m24kEV 3aOCNpkQMC8e0g4lBDRyfN3X7anw9aXwzo50qGG6sLDT7n94M75VtpIotwGOQ1nPps3oBGT615r8 B/Gen3+gX2ha8WTR9TSSGW6H+s0a9lhaCHUE9UYMI5l/iwhJ3bcGHqwqylGWj/rcwqulmUWnZVEl bzaWt/U625+A2lf8FIvhZq/jHQl0vSviZ4egT+19GL/Z/wC0ML8rQuxIZJArBC+WidfKctG8LxfJ XiT4Jat4UtJLpUneyLtbSuqtG9s6Nkw3CdY5FKglW4yAQWGDXu8Gpax+zJ8a9O1iJ5rOdR9m1SOI glz8vmsmTh1YFJoySVJKkjGVrrfi342h8WeK7nX2u7S21XWAtpezxqn2W5mC7k8xnwBuUh4ZZBsm ibZIVeJ5jx/W6kJO23bs0fJ1ISjU1j/mraNHjvwY/bK8VfCqAaZrkGmeOvDcpUT6frUQnkVRgYjn IMifKNu0loyDgoRxWp4u8P8Ahn41a/Pr/wALNcl0DW7pNl14V110ZrxOTsSdh5d0mQPkuBuxjLMA AKXiz4V6b4w1C4trSJdF8QxqZGtGDC3uVUsGaMEb1wVYMrAuhUhgdssq+ReIPD154Y1aW1uYpLe6 tyrAbumQGV1I6qQQQwJBBBBwRXdQrU6kueSv+dvU9CnjIVIqGJjzRXfRr0f+ZR8S6DqXgvxStybG bQLpZPOga3Z41Qqx+eF8nIyOGViPQ+nqGh/ttatr9hFpXxS8O6D8YNFRBEreII2TWbRB/wA8NTiK 3SHpgO8kfA+Q1yMfxbu5LWaDUDFLPI25pZoRNFdtjGbiJgVd8HiYASjJ+Y8Yx5f7A8Wk/ZwfDl+w yIJXaWwlPoshy8XYASbxyS0igVtKK7X8zzMVh6UWnTd4vbv6M7DxD8Ivhv8AEuOW88Aa3qmjT8u2 h68BPNB1JCSwrmVAAcFYmbAy4QZNeW+LfAWqeDoYZb2yItbgnyLqGRZ7W4I6+XMhMb46HaxweDg0 7XdGufD1/wCReW7wykB07rKh6OjD5XQ44ZSVPUEirGjeNtU8OXFzJbXbkXxzdRTqs8F4ckjzYnBS TBORvBweRzzRTVSO0rrz/wAzi9knscncxMV4GPT3qsbYs3OAPQ9q6/X5NI1eza4trZtJvVwXtVZp bWQE4/dFiXQjIO1ywOGO8cJWF9nLL91fTk11Qq3W1jL2WpktZEk9cdzURsB3PbHXpWvJa5H144qF 7RvMHy9egA6e9PnE6RmHT8fwtn6UVom2kPPQH8aKOcPYnusaTbCCrA56HmnmOVW5VhxzjFeozfDS 3Vf9eOv3c1EvwqjckCQKRznIyPwr5JZrQep+gf2fW7Hm/wBmaQYIZgemTmp00cyDdhh264rvj8Lz GTtl6jqR0p8fwuv4jiNRMDyAMfkatZnR6SRH1Cr1izhYdFkfplCPzq9Bo7gjJA967e08F3FpOPNt iGXj5kxj2rcsfC9uo+eOPjGcGsamZwW2ppDLpy8jzmHSZFJw2CR3PAq1BpUmeS7E9yR+FerWnhXT 2JBtQ2Rg4Gcinr4XtVkyLBmUHAzGeRXI83g+h0LK5rqeZQaVcBejjH4k1bi0m5w2GZMe3WvT7fwZ bSp81hLGehwhHarVr4BsihzBcqRyQCcg1lLN6aWqNFlU+h5hDpEuBiUjB9MA/wCNXbfw4ZgMzZ45 2jNemL4EslICm469JACPzpZPh/DMp8uRF7YIAIrJ5tTZX9mVDgYvBSEc3Eq7ucHoD6irNt4Oe2kZ kuAx2Mp6jhlK/wAjXb2/gSW2mOWjKn0bpWpaeA5MhkcZwRyc1Es1jHVSLp5dNNNLVHneqeDLmW4V YS3EMQx3P7teagXwpqcRwYpSAByFPNem3Hhe7tmBaOGUL6nt7VPZ20hyhKnB6DtQ83u7qzNJ5a5t t3VzF+Pdld2Pxj8SRIrPEmo3OzBJGDM7AfUZ5965ux1K4tSd6SBe/wAvUele1/EvR4Lv4j+IDKu4 vqVyVZW6/vWPFYZ8HwTnMUvzA52uOFzU1c4pc7TXUcctnJKSfY4Wz8QcYdTwe6dT/St271gXmn6d cfeKxNA5xklkYkY+iMg/Cujh8DMQA0YkH+yRUz+FGSExvaBQpJAI6ZAyf0H5Vks2opSj3XfzR00s FVjGUX1X6pnMabraxlcJI0YJyAcEgjB/EjirtnrbReXi3+QZ4U/eB4YfiK0m8Fh2O2Arg8EL2qRP CksanZGBnryTWTzCnprsCwlVWMyG6lRwoi788dKv280hBzCFLDB7gD1q5FodyjACM7h6dqtJoV3j BRvm6jdiueWMhuVHCVDMe3XAIHJ/MVWu4ZgD+5LjrgHIroo9HmQYKcHnhc1JHpG/goVx1+UVl9ci tjaOFl1RxMzXgU+XZJJuHOSOMUW2kX98WEcEcOQSZNxxGvfJ9DwPXnHfB7xNEtiDwRjnpg/Sp30u IwCJFKRqcsq/xt/eY/ToO3PcknSOZRXQTwMnseY3/h7VPEGoW2l2lzZ6ZazSbUuLybyIIzjmSeTB wMDjqBnAHJJ4HxBHqEnlRAXsdvEPlV85YnG52x0JIH0AAycZr6H/ALIgGOGz65qEaHamQkxttBzw Oh9QcV20M9jC14XOOeUe64wdjwf+2L3wpbRaPp6GS6M6y37iMytPLyqwHcPmjQMVK42u7tneojI9 N+DervqPjjwrqKulrBcRXOjaQUbDabdeUdzEk53R+dEEc8kPEc7omA6208CafKP9HTZM7fK+3aUy MHBHJOOOemTjk5G38PvAmi+B9cn1FbBbm4t7KS309hMYxZzsCFuMc5KkuwHq3UVvW4goVINONnbT 1seVU4brLWLu+vmenaR8fCfiH4P0e2Njp7tqtrH5s8Xy2VrHIsVraxQp96Zk/eOcbImmOfmChcbR PGnhvwT8Kdei8I293Fa6peXJuL25LfbtViXdHHJcSDktJI5wuY1AcZBIOeb8HeEk0bx9Za9KxbUJ LoTRvGEjKSAgLKNyOow3IIB+Zfauy+KFtoMEt7oempqFrBb6m6TxNZW3zRJIWbDKFIJkGcdML14x Xkwx6nCzleTer7adDRZIqUuWMLxf57tvvqfNXh/Sb270u8sSYM6tqFkj2yRCJJgjSH7iBV4baOn8 XvXG2Hg+RY7yEh4nuLeVZZGI27VAlVQMcfNHycnIPbGT9FeCvD1tZ6rpkE0KvGuox3DyAZfA4C/7 uSSe/ArnZfDkMYiBtVHlE72Gd0oz0Pbp7V2LO1Zrv/SO+nlC9pZ6W/I5uDx9qesfA/xd4R8Q2Xna leapb63bPNERtl8jZLOx6rI0Yiwf4i3IIY55fWfAVxrtopupPK8S2YW3uYJHVY72JY18mdJc7CSm F64farBmaQA+mWXhNb2+eKOGT7Q7AREkES4OQhHU5wuPcAY5yJdU0lNb0GC0u4zIbRWhhuB8soTI KI3PzICCcHpkAEDionnCTi4Rtb/L8u5dHJ0pyU3dPX5+tjz/AOHnxau/hRcxf2fYxyQ42XVrKpNt qCkFWSVeGdSCcA4wcEYIrv8Axr8SX+LOi22gRNqOpQ2ET3uhSTyH7Q0TAF4pH5V1G0qi5/dujxhj kF8LUfBEl4HEoMhI2lmJO4DjqOf5Gt2/vTfaxLeQWtnpM9qyX1ithAIYo7lUhRsegIi3gdpORjcQ bji8PJ+0t735jrYOtN+87R0WnRdLfqcPp+oRWWrwWSR/YdWtpdyy3Y2xicEfIxbHl7T3OQWBzxgi PTPEF54j0TV7XMjhLiG5eORuJJMsmSpOS7GQknnofauk8d+HIfEE6an84vtUZpbpdvy2rA4EaDqE 24YdgGVedhJy9B0FNI0vV43jhaXyo57Z5F3ESiQKAO2CkkhIOc7fatliqWrW/mYRy5uqm9IvfyRk S6hHrtlY3bSM0j30NqMkkgFdiJ9AI8D2Fc/4P1ttS0jVNPhuHIs4H1GGLBZ3CY85V+YAfut0h9fs 6j0qWXwbrumvG0LGRY5kuAo45XdtOPqx/OjSvCl54f1a3u7e3eOa3IOHjJSVWXDIwHUFSQR6E11R q01FpST7amFbDOdRPlaikk/utf8AUyLP4g3F9JFCFZiARGjtkHq20H3OcDuT71oaf40XX4Gntk2S W6/v7UHdIg/vR5+8o67c57Z6GsbVPhlfWN2/kQzugf5HCkNjqp/EVo6d4ZvplWQ2E9tfBtyzJgCQ 45Bx64yD6kjuMa1alFpShJDweG5W4Vot/wBdH0aNG28VTCcRyeURJCJYpEBKzKf4hxkgHhh94c4B wcQXvi66gO3yERioYFjkEeo7EUl14SvtYdJjE1tJwrYIxuCgZGOBkDJ9/wAhDeeBr67X55MIT8uB jceMn2PSsY1af2pIrEYWEr+yg1Z6PuvNEEvi67ePezxrHnaWUfdPYH04/wA8VS1TXmWbEl4q5UHO 4AEdjxWkngZ4oXVpEyy4bc2QR9P881E/h+G2QpLNEWRNseE4XnOf5/iatYil0Of6m2rWs/6/MqaX 4+j8PHfaFVvWBAuiSXiz1Kf3Tjv970xTovEEdppIuLozJbXB/dQIQJ73B5Y/3YwQRuOQWGFDFXK2 otPsdHIuLgwTSEh44XAKD0Zx3HovfqeMBqN1rQ1zVFKv9qvblwoEabnduiqAPwAA9gK2VdyXKtjK o6sl7O9ort+JVvdfvPFt9DAtvKyglbaziDeXCDjIVeccAZJ+ZsZYk5J1dbng0zzvJuXnaONbS5vE 2qJmCKHtbYqSCn8Lyg4KnjAcLLHc6xb6PE9pHcgyyKReXEZ37F6GKMj7wOcEg4Y8A7fmbnNT8SxT SbiAqouyKMniNQeAPxJOe5JJ5Jqovqkc7i2nBbf5FvQmk1LXJL+6aJjAuYllAMSNjCErg5jjA3FQ rAhAuPnFdXp3iCfwt4I1PxDI0on1UNpmmJJkvJFvEk0znkl3cKGbJziVcBdoHGaLqr69e2+lWZP2 nUJVibDAKQSMA47AgsSTjgdNtaXi3x1/wlvjHTLDTZoY9M0hks7AyAeWEVsmVvZjl2J7da78LeEX Ve60Xr/wDtwNKFCMsVLdaR9e/wAv8j0T4UeMZfAHjjwTpM015D5/iSxa5n+7G8QnkS6dnBO9nnLo G/u2UR7A1vfEfwzL8Mfh78QtEYNLqt1cS3FypQceZerAi9c7iGuPrgHArx6LxfY+KvjDYyxPLb6L Y3NokPQNFa2zIvnOOm7yw8jYwC7Me9e2/Ei1vPGvxG14CKaL7b4us9LkjPzmGNJ7m4w/fJVkwenX 0pQg5wcn0/X/AIY5qGGdSnUk3eVl+LT/AMzwbxFoKyeN9VtBtMMfiCOzj3DgIrSoo47BVFbOj2sV /wDAq4tjCpu/D/if7PcyEfdtby3kiIOOu14mPTjcPauS1nxNNayahdR3KNMmsxSvJ6P+9bOfrmqp 1RrLxHr9oZhIbmzmZy2QW2hZwcevyZH1relOcKkLK+n6nfh6aw+Ipwf8v430X3nr/i7VbjxH+zd4 Qv8AeXn020uLK+iCMWf7IBZ3EeM9Wsrm1c+otCe3HzNpd8/hfVy+Iri3IaOWNs7biJhhh7ZHQ9Qc HqBXtPwp+K8Y+F/jRJ0e6OmTQawluTtEizq1heIP99Lpf++Ae1eK+KtOXQtcu7GRmk+zStGJMECV QeHX2YYYexpz0qKpT/qx5VSmqOJdWk9N0+/9O56lfonxS8Ar4fuZ1udUso0fRL6TCNcRFyIkduwY lojk7Um25OHdl8P8R6xJNZR2lx58V1ZEwTRuCpZV3bdw/vJll56LtAHBrq/BWtQ3KtYKonuLZZJb aJmwtyhX99bk+joCR33rhfmbNWfiBpdn8QtAutes5BPq+mBW1Rifn1C3YhYr7H98ErHN33lHJYvI V9GslUiqsVq9/kdWZUYYiEcVT0b39V+v/DnKaR4sTxnp9ro+o3v2C/smDaTqrMVEJAULDMw5CYVA svWPaoPyAGPWOux+Lll8N+Mbc2euWbtGJmCRszEklldiFSXJyVJEM4JJMUrGd+KmkgWPlgB7Vsx6 3beLdHh0y/liS+tUEem3krBBs7W8rHgJ/cdjhDwSEOU5I+6vdWh8zUoWd0zlfHvgC78I3MZkKXNn cFhb3USkRyFSA6EMAySISA0bAMuVyMMpPLzWe1h06c44r1TSfGI+zT6NrECycCB0nYxCUR5CRyNj McseWEUx5QFo3DQsVTjfGPhaLRrhZLeRp7Cct5ErrscFcbo5F/hkXIDL7gjKsCeylVezOepT7nMz 3btYratLI1ujF0jJyqMcZKjtnAzjrgZzgYpy7RnAwV46VdmgDMR2zVaa3IIGRk5+tdS2OZq5RZQy 5UZwO3Q1EX2OSeKuzIUXqB2xmqzWoYkgjPY55rRbGLiQ/aNjY/L1NVptTaJ2AA/HpU0sIV+qn8ap yWfy7ckk++Me1UopmMua2gi688bHcgJ6UVD9lLZIx1x6mir5YdiOaZ+gSWrggBYjzxxzUn2aVBkC IE/jmuHi8Yk4xLIQB1HGD+FTr4/eMEFyMcHBr8p+o1+h+2qtROzaWeEACLOf7pFTwX92rjMDHHOc A5rjIfiS6ucgMP8AaNXbb4jx7s4Lc9OxzUSwVdbxHGpR6SPQdK1jdEBIjIe/BrRS8tp49zKgOe6D Jrz+z+IkIAAOCeOTVwePIZx8yqB6nB5/wrhngKyd7WO6FWlbc7ZIoF+64GPQ4xVy1vAjDZMMHp3F cFH4yV+UCA85+arUfjZVQZcYPBORxWcsHW7FqVI9Gsb+QyAedGM9B06+9eWat+3Fofh/9oKz8Fvp +tTWUljObmZdCunulvlnWJEiULte3IJJl+6DjmtKHxrbrLtFxCGK7grSruYfT/OK5N/G7y/tc6Ve xXnmWtn4MubJmW4UhHe8Vth5yMgdBxTpYGV5e1i3o7dNenQxr1fegqcktddL6Wv3PoW81GKxglka KMCBSW2FTnA7UiTxTKD9nToD0GRXAX3jdX0u6Kon+qbI9OKvR+LVChWXJAxwPSvOWErLdHofu2zu 4fs7KA0QA7gAA1NBDaScFAex7VwP/CXxsf4sVZh8UI+Pm4HH36l4WsVFU2d2LCzdCBtwDzg006NZ OvAiLe6iuPh8SROeZRk+pqZfEMDOMzk579cms1QrX0ua8lO3Q7LWoU1PVbm5ZIXeeZpXJOBktk/q aghsYiQzQx5HJwxrA1DV4NP1S5hS4YiKV48ng5DEf0qODxApGfOHoepq6lOrzO/ciFKm4rlOrh2R kBVfn0INTeeVGMOPqP8APNcqPETREYlUDvkUDxeDGcvF7d/pWfsKj2G6cVudakpK8k9OOPWng7/7 /wDWuYj8TvKAQ0Iz23dKnh193OPNhJ7gNzUulURShDodFEgP3XY9hzxUiR7VyXznk1gJrTyZw4xn PXipodYk5yx9RzUtVC1RgbywFzxI/T0xT47UMRuZjjoCOlYsPiAgnBzwOnQ08+Jif4TjHUk1m4zH 7GJt/ZEPXcO+e4pjadExbMkiknPynArHbxN8vAUcUz/hJ3YkYA7jNOKqdA9jHqbxghweFx61Lbxp JMiqUXccZZtuPxPA+prmf+EkZXDbypU5yOCvcfjSyao06NKhDD70gHGzJ9PTPpxyOh4rSNOW5DpJ aHW3tp/Zqeayv5chaONyu0bhjcpGOGUEZHUFgRkEEsvoVsYAryFZFVH2rk7g67t2e2AVH41ys3iS a5gTfMGWH5FXPJ9/fAwM+gA6AVNF4l+0IFmkVnghZIA6gpgliQf++mIPPzY+o39nfRGLpSSTl/XY 3BrSRlctv2rhc5wvXH05OfrW1qeoI2uXMqM0lvDZPKXZizETIWTOc/MDKqnH936muAi1tRC7s5Hl qDjHXkD+tb1z4msLezvxDN5jz6Vbhg38MvmwFlH4KT+J9KKVOSu0Z16Ubxi+t/xsXtH1G70nxLai 1WGS8jZSglVSkb4yC2/5flzzu4BU54FVNS1XN1fq0plZZC4kmhIkmIbH1UkEscnsO+KwIPFrWmTE QGYgluOevHPb/AVAdbKqGII7jOOevI/KnyNrRdSvYLm5vK3qdZfaFfy6Ve6ra2rz6TYPCk9ztAWB 5lLRo/P3jhhxxlTWdq1w97bwXEcAjaRPLlAIAZ17gdhtKe2c49Bmaj4jW0s4oXkZ549ysiN8kfzn gnox6kY6bgcnkDPXxSq20qMybwVcMTyMZGB+efwrWNP3Uop3trfvfdadrEezXNzP+kzV+zzNEW4w p5B/SovsshXkqSDycVj/APCW4RlD4zgnng/41HJ4uySFcYPqaSp1eiB049TeQ3MULpszG+Mgtxx0 P8/zPrUljAZrW9d3jTyIQ6KVz5jeYi4B7HDMc+gNco/i9yxzICPr1qSy8VubW+G6IAwjJPXHmJyP fOPwzW0KVXqZTjBK/odRN4ul/wCEPGj/AGPTjEl6b4XQgAvGJjCGIy9TEANwTsxJ71kS3boxDZ3D jOOK52TxMwwDJGB0yT1qvceJjKFbzUyox1960cKsrX6afIlU6aTOon1BJbePOzdgqwIyRg9f1/Sp tdOmWlhpk1i91MLizVrz7Qir5N2GIlSMA5MQ+QqzYLZPHFcNP4kIU5mX8KoTeJioYF8Z64PWtaeG nZpLcznyt37HYXEkEgy2ct/tVQu1iVGYFnZQSFDAZPpntXI3PiY7SzSMv16D3qC98QSW0zJJlXU4 ZWOCD2FbwwlRdTCXszu/GOgaRoviW6tNN1RdcsISqw3627W4uRtBP7t/mXBLLz1K56EVz97pdooc FVO3g/NmuVuPFZIPzKOcZzVWfxgTnJXIHPzV1/VarbcdDncqVrG/f+GLKXkJHI3T5j/Oq76RHpFr IttHapPMpRnU/NHGRgoPQsDz3xx3YVzdx4wkLjEmMDIH69Kp3PiqU5O/3+9kD3rqp0Ky0bOWqqL6 GjeaKPs5QqxjZskK/AxnBx07nH1NY93oMEYOFct2BOar3HieQE4dQfc8E+v0qmfE888iIJVG8hck 5x/9au6nSqnJONJvRHQ6faL4a8PXl7GVW91BXsrboDHERiaQe5BEYPQhpO4rmreymsLC6nR1jl2/ ZogDtYhwQ59CNuVI7b1pNe8Xy39ygSRfIt1EUK46KO/1JJY+7GqWp+ImMEEcEjkRpukLcAu3Ugdu Aq/8Br0pc+kVstP82Y4r2UuWnDaOn6t/Nlrw/GdM0jXXuMxyzWiW0BU8lmmjdvwMccoP1HY19HeO /iBrOl/Hi9azMyS6rLql9eOsW5J4DbosDMOxBh4YYILYzyc/OWnSrqNvb2kzIs0kFzdCQDnIUhFP tmPP/A69x+M+h65J8VCzR+Rt8OxW1tLF1dpYRGTjt8ztnrkDNax53G3micPhJOSUNU+2+llY8c8c +G28D+FdVgurVRcT3FvNEgUglCsh3fnkD6E1VuRIfipbxiI7Ly2t4mYZI/e2sY5/77qPVr+XxHBf G8vI5Lq4lgjLSMcIEVkXJ9AAB7AV32ofD9tS+JsNtHc29jeGCwNvFJMoNzIYYfkQ55AwfmHXjGa6 IyXNBwW3f1PfqYFTxdNtKMUr/dK/6nl3wj1Kf/hLZNMclF122uNLIC8FpoysZI/2ZfLb/gNYvjG5 GpaJo+pPIPNa3+wz7SBmSDCqcenktCM9yrV0vxi8J3Hwe8VzwzyJBfQTCSII/wC+UqcgkD7oPbIB PGOM1w3ifXItSl1lER4Le6uvt1tH12jc2FHYDZIT/wAAFOMW/dktj5nNKCotRbTa7duhmRa1HpVz HcQeYs0LCRJA2CrA5BB7EHmtfUvHJ8M+ILDxFpsUIgu0fdAwzDubK3FsyjGY2DHK9CkoHrXIXBPI x7H/ABpEulbSLyykw0bgSxtnHlyLnn/gQJGPXae1d1CMUmmzzqWIajKntfVPs1/nsM8X3lvb61Kd PkIsJsSwCTBdEPOxj3ZeVJ6EgnoawptXmLAh+Rn+HqKfLYkqSzjjjntVeS2U52ng966IxhfRHh4i U5T5krX6C6p4jutRMbSsHeKNYgwHJVeF+uBgD0AAqvHr13FaTQb8w3O3fGeVyudrc9CuSARzgkdC QVktwCSMcnniqzIQ7DkjqT3FXGMLWSOVxl1ZC1w4zzj/AOvUMjMTnjB9ulTyA7xxggcc1C8ZU5xz 065q7IzsyvMMpjcRiq0gO1gW+mDVqY7cgYzj61WmDEH1q0jCRUfec5JwetQXAkxy3sRmrchZWBx8 vfPeq1xGSTyM45z39quJi12Kjl0Ody+nJop7DYx6H9KK05TM+jrfX3B/1WM8Z3dKtRa25H3Tx0zi uHhuXI+Zi3+9U6TuACWKqvGAT+NeRLLon2SziVtjt4tWkMR3BWBIPTk+1XIdQfg7FVj6GuEiuZcD JYbT2PNTw3cocbZJOnr1+vrWcsuRtDOFvZneRXrM2dowPbOKsJqaxrgqTx271wqX1yrAiWYc8fNV q31a5RVxNLhc/wAWc1lLLfM3jnK7M7iDVAYwNsjc9M4Aq5Hekjb5J+XnluhrgrfVrtUGJpQewzVu 31a9DkiaVtvUg8Y/+tWMsr7HRHOV2f4HXaxr1j4a0O/1K9j2WdhbyXVzIEDsqICW4HJ6dO5rw0/E Pwto/wAStP8Ai/b3zR+H7/Q5oIreTTWYxpFcxxSL1yJt0m4EcdskV6KPGkisYIJPts7A/ugQ8Y7f OegX1z16YrgfFPgePUfFVtb/AGDTLrUI9JkkikNqwiZxOjYCZ2AEgjGMYOOtYSwUorcueP55RcVt qrrrbyPe/D/j/SfHngiDWNJna50rUrcyQTBChdclckHkEEEEHpiuit9VjcjG/aOeGIJryDwt8T7H VdCW0tX0yyktIjF9hhaNFg2DBWNRgBR6AZHcV1R8Q3UDFW+XnjK/rXM8rb2PQhm8EtTvYtQWTJDy Zzkkk8e9Wk1AupHnHjsByTXnieKrvPLEdhgj+VSDXpJBhi5OBjDZI9T/APqrL+x5dWarOafRM9A8 zzc5uEHfB6VZ0Hz59bs4VvEPnXCJgIDklhx/9Y8V59Dquw5Zm5PXrmtzwdrUUfinTCZ1AF1ETkZB +cZ/Cj+zZQ8/kN5nCSelvmdZf6ve3+qXNwLqACWVpGXbwMkmmtqOpFsJPFnGehGfoa44azCxwblx kYyASDTxq0BUE3Ejfng1g8ubd2vwOiOPilZP8Trzdao2N00bDOD84FLFc3CMdxi9Dk5Fcvb6xFMw KqwJAGSh5qe01UwMVVFY9MOpBFS8vaVrfhYtYuD6v77nVQXzbcO8XzH8fpT11LaTtdyQT2/SsGHV ZlQYgiA6cKR/9enf2tcJjMUQY8D1NY/UXfY6PrULbm+mvuWwolPqQxH+RVmHxHMB9+cbuRlu/wBa 5o+JptuVtYs9M5JBqzBrdzJGuIFz0ICnmplgHbWKKji43spP7jp4vFVwowrv1wc/1qZPFlyqrlmc npniuZjvbiTGY1288nP61filO/54ySOm1q5J4GHWKOuGIk7WbNweL7hwDh5B34q5Z+JhOSHDQ4PJ dTj9MmsFWSTAaL5v97FNkn8pdxiLAdg/P8uaw+p03oonQ6s0tzpm12UR4MZKAbiwAO3PqR9Oh9ah l8TTNkAucngE+2K5ePUA/JVxx0Jzn/69WdJmN7qdtCD/AK2VQc9xnn9M10YXKPa1Y0ktZNL7zhxu aLDYaeIntBOT9ErnTPq2ptAENtIXGCknltuXHY+v8+Bg46okOsPprXZhQwLKICCwEm/bu4jJ3lcf xhdoPGc8V0IODRX7VHwiwNtar+5H8vv6Q+Ypvlw0fvZzJl1RYtwSTLHGBC2RjH6f4VNpU12IL1rh Lw7bc+VGISPMcsoAJ64GS3HXbjoTXQUdKa8IsEv+Xr+5EP6QuYy3w0fvZzFnf6lbAsIJWk3DDSW5 ZVA7bSMfmD+GKLrUtUvrt554LyaSU5ZmiIyenYYAA7dq9S+Ffwc1z4z6vdWOgpYzXdnAbmSO4vYb U+UoJZh5jLkKAScdByak0r4Ja7rXgPWvE1sNLk0fw/L5N7N/aVuGjdiQmE37m3kHbtB3YOM1zVfD DK4N054hpq2ll12+/p3Oml47ZzJKpDBpp31u3otX8l1PJhJeMBm1uRyTgxk/0pVtriZQXiuFHPCw MW9s9B+te16R+zN4q1i3sUEel2+p6rCtzYaXc6jDDqF9GwyrRws275hkqGwWx8oPGavhP9n3xJ4v soZo4rDT2vLt9PsYtSvIrKXULlCA8MKyldzKWVTnADMFznis/wDiGWUq7+s7en9dH9zNX4655Ky+ pLXzfkeKPY3RO4WtzkjH+rbI/SoZLG9IP+i3GD1Aib9OK+g9P/ZP8Y6jYQXCxaLHHc6lJo8fnaza RF71DhrfDSD95wML3yPWo7n9lvxfpmgy6lqEWj6VaW9+2lzm+1e1t2gulBYwurSAq+0bsHquD0NJ eHGUp2+t/kN+Nue2u8Crb/a/yPnmXSr8tkWl0B93AiY5/So49HvlinBs7wuyALiNhzuB/HgGvo+f 9lDxhZx689zFotrH4Ye3XUnl1m0RLYXCo0DE+ZgrIHXaw4JyOoNcp47+GWufDS8todZsWtVvovPt J45Ent7qP+/FLGWjkX3VjjvW9Hw3yycuWnibv5dr/k0zmreOGcRjzVMEkl1ba62/PQ8Ol0LUjwLO 8wOo8lj+XFRNoGqHP+hXv/fhun5V9Ixfs3eLn8e/8I0+nRW2qjThqzpc3UUEcdsYhKZGkdgoAU88 8EEdq05f2SvGFvbxSsPD6xzaf/a0bHXLMeZabsGcZk5jBBye2KH4e5VGyeK31WxcfGrO5XawSdnZ /Fut0fKkvh3VCP8Ajzvzk9Rbt/hVe48M6sVIFhqRP/XBxj9K+r/Ef7KfjDwtqGs2N3Foo1HQLN7+ +sk1i1e5ggSMSs/liTccIQ2ACcGsfwT8DNd+IHg7Utf09tIXS9HeNL6a61O3tzamRtsZdXcEBm4B I5INaR8PsrcedYnTTXTrt9/TuZS8ac5U/ZvBJS101vpv93U+XJvCery9dN1Ig8kG3f8AwqC48Hax cysz6bqbOxyWa3di2BgHOOwFfYsv7I3jgaTdXcFjpuoRWemrq7rZapa3Ur2jMy+eiJIWdAVYEqDy DXNf8Kl1c/DP/hL9+l/2P5/2bP8AaMHn+b/c8nf5m7HzY2/d56VrT4ByyXwYm+qXTd7L1ZnV8Zs4 grzwSWjet9lu9tkfKsvgXWSpA03U+Dzm1f8AwqF/A2sjppWqMQcj/RZMfyr7G8Lfs3eKPGGnafLa R6XHdatA13YWFzqMNveXsClg00cTsCU+RyCcFgjFQQKp6/8AA7XfDXgvw/4gvDpMel+KHKadKNTg bziDhyVD5QI3DlgApODitI8B5bzcixLve1tN/wCk/uM34x5vy87wata97u1tP81958kL4Dvm0i7E uk64L9Xje1ZbSRo5FO4SIwx8uPlYHqeRWfN4B1pl40bV89f+POTH8q+5Z/2Q/Gtt4q1DRHh0VNT0 vTxql1Adatd0VvtLGT/WdAmGOOgZT0IqDRP2VfF3ia/0a301NDv38QvPDYNb61ayJPJAFMke4SYD gOp2nkg5AxWa4JytK/1rTfpta/3WTf3lPxbztu31JXvbrve35tI+FZvh/rxbP9iayQP+nOQ/0qtJ 8N9eZh/xItZ54/485f57a+2PGPwT8QeCPCkGu3cFncaLcXLWS3tjew3kCTqCTC5jZtj4GdrYJHIp kPwW8ST2HhO4TT28nxvcNa6OzSKoupFlWEjJIC/OwGWwOc9Oa6VwNl7ipLEaarputX9yTOSXjBmq k4PCK6Sdtdm0k/RvY+H3+GviFQSNB1o5GP8Ajxl/+JqCX4beJGcD+wddKY72MvX/AL5+lfofbfsd +NbxoViTQJPtOoPpMO3XLPEt2oBa3U+ZgyYI4BrK0f8AZu8TatZWEkq6VplxrK7tLs7/AFGG2utT BYqDFG7AkMwwrNtVz90mlHg/LGtMT+X9dH9xcvFXOVZvBJff5HxV4W+HWp3niCJLvRdYgiSExLK9 lKo4hKjtx8w/WvS/i14m8XjRrS1sItTuk1HSbSGVI7Zn+ySRghsEDKMccj3FfQUn7PPi6PwHq3iL +yidO0C4+y6mgnjN1p0m4r++g3eZGNwPLKB36c1R8T/CTV/CPgjSvEF4+lHTdbyLMwajBPLJj72Y 0cuu04DZHBIBwa0pcFZfL3Y4jVu3Te17ettTuh43ZvRSk8ClZX3a0btf79D4o1L4XeJYmnjj0bWW TeeRbOQ2GyDwPp+tRfELwB4sTxhBf2Oka681va2Iilgs5SYZEtogSGA42suPYiv0B/4ZI8bSx2Yg s9Mu7jUdOOq2Vrb6tazXN7bAEmSKNZC0mArcKCflPFYmu/AzXvDngvQfEF4dJj0rxKxTT5RqlsTM QQrkrvyoRiA5IAQ8HFKnwflrklDEXb06ef8Ak/uJxnjLnM1zVMEo2V73lptr97X3n52ap8NvGmp3 81zdeHvE11cTsXkmk0+d3kPqSVySaot8KfF8Dhk8L+JCQCoK6ZP3GD/D6E1+mF3+zP4rsfFM2kyQ 6UZbS0TULy5TVLeS1sLdwCkk0yuUjDKylQTlgy7Qcisnx58INX+H2iabql1Jpl5pOsPJHZ3thex3 MM7xhDIvyncpXeMhgDzW1LhHL5NRjXu3ttr1/LX0PGr+KmbKMpzwqSW929Nbfnofm7L8IvF7jnwr 4kIP/ULm4/8AHaqv8GvF5Lf8Up4m9Qf7Ln/+Jr9K9X+Duu+H9c0LT9RgttOn8R2UOo2T3d1HBC8E udjtI5CIDtP3iMGtWf8AZl8ZWXxd/wCEFutPt7LxKyho7e6vIYI5wQCvlyMwR8g8bWOSCOoNX/qn l8VrX6N9Nlu/RGf/ABE/NpaLCrdLru9vv6H5cS/Bfxif+ZS8THB6f2VPx/45VeX4LeMiR/xSHigj /sEz5/8AQK/Urxz+zz4i+HVrot1qb6CLPxE5TT7qDWbaeC4Abazh0kKhFPBYnAPUir+tfspeL/Dm ka7e3a6EkHhp449SZdbtGNs8i5jQgSZ3N0AHJII7ULhnLrJ/WNHttrrb89PXQT8Rs3u19U1W++ml 9flqflDJ8FvGZH/IneKc9f8AkE3H/wARUD/BTxsxyPBvirkY/wCQTPz9flr9SfiX8Ftd+Et3pkOt DTopNWgW6tlg1CCfdCwBSQ7HIVWByC2AQD6UfEz4Ma38JItLfWRpyDWbZb2z+zahDcGWB/uS4jdi EbBwTwcGtYcJ4GXK41r8222tt7dzmqeJWZx5lLDJctr76X2v2uflhJ8EPGxLY8G+K8dcHSZ//iKg m+BfjggAeDPFXqP+JTcf/E1+qus/BLxToPxIt/CFzpFyviK68jyrJcF3MyK6c5x0bk5wuDk8HDvG nwX1bwR4Yi1qWfR9R0ea6+wreadqEN3GLgKXMR2MWBCjOSMEEEE5qo8K4K8Yqt8W22t9repEvEjM rNvDLTR76W3v6H5PyfAjxwQf+KK8Xc+mkXHH/jlQy/ATx24IHgvxcuT0GjXH/wARX6cUV2Lgyj/O /uRxPxRxT/5cr72fmE/wA8etz/whXi76f2Rcf/EVA37Pvjsg/wDFEeL8/wDYHuD/AOyV+olFC4Mo /wA7+5EvxOxP/PmP3s/LWT9nvx9gD/hBvGBHX/kDXH/xFFfqVRVf6n0v539yJ/4iXiv+fS+9n5+D w/BG5LMobrz2pyaRbNwHBwOeSKw4r2XGcuM89elTLeSk53tk8HmvzRUKnWR/Q6x2H6QN630G2YAG fFW4PDcEhAWRDng881zaXLR4+/x71ZhuZFIAYk1Do1HtI1jjsOt4HU23hOMYIYLnj61ZtfC8ByQx znsc9K5WPUZY2wHkC5/OpheSuhXcxBGOSePrWLoVWrcx1QzDDbezNjU4o7TXNP0WwhN3rOrSrDbR SF44VzzvkkxtRAOck85GK5PUvA8+s+GtQ1XVtV+3HTb5rZdNgJi0+ZVnSIsyg7pOGJ5PUD6VpePb LxZ8OviD4V8TWOsXV74A+IkFzZ3CrF9pudJuIQnnW02xSIomfy2VupXIOAKwPif4su/hX8I/7biT T5lub+a68u63FSI7gM0YRedxwoBPy4Yk18Fh8biakqlXFVVa7UYJveN1Z7a9Nep9o4YJKEcPSask 5SaWibWq3063Wp61D4D0/SoTa2ZjgtoCVjjijVFA+g/z1qi/gNT8Q1c3Un2caKsm0Kock3YXGeuA Oc/hXKfCr4vWvxj8Mx65ZxxWM11JIstgs+9rZweVGfmK8gg4Gea7bwfpdzrHjm7unmS2gh8PSPCZ 9xjmZLgFiF6HbgbmHA4FexmlapSwXtlPl0T8/TTscuUxw1bHKj7NSu3rd2a2v5XPmz9uL4Maf8Ov GFp4l0vU7i2vNWDT3EYiUR2oUBFaIrzl2OCuCeSxOKzP2ffjvqOj6PcJqXiNkaOB3tbWS3NxCrRg EicEggPuADRsWGOVwK9z+PvgrSvipp0mk641tYX1jE+pW88swt4rMbdokdm5Mb9AEyXPIBANeDeI /gYmhjRYLm1yuoS/Z7e3sJy0s8qxvK06qQG2LtA3EZPoMg1jWzqnSnGhOfvtJ6W1R5Msum68qtGF oXatrp06n05YeNbbT/G+n+EvEi2ei+JdTh+0WQhmNxaagBnIjfAKPkEeXIAeOpyK7ODwxEgXfcje eFKoxArybxP8N4/iZqnhzxBPqQsovDAjayt0iG7ULkurSYbqqoFw2eSSAOhruY/ENxlmMjElsnk4 rvy+rVxLqKM78rtdbX3tt00vY2rV8LR5eenurpN9Ntbd3ex18XhSwaEM11NvA+YbcDHt/Or/AId8 JaYdbsy97cRJ50fIjyT8w/ziuFh1+QuWJYvnJ+Y5q9oPiuWLV7VhuJWdD146jp6V2PB1v53+Bf8A bGB5bexX4/5nSp4StWGIL2M+hkUqRVmy8L2kI3SXQPoI+TXHDxLKWwDgnqcZ6U+PxNP689vWk8FX f2zSObZfF83sl97t+Z3ttplhI5Pmyrgck45qZNIsSwP224wTypFcDH4onbuSMgninDxPM0edxyOA c81i8trdJnQs/wAFs6a/E7mXw9YSZb7fOjdOhwCf/rUp0ezUIq3czE9MjJzXFJ4okYEbyoHoOAPp Tk8USEAB2J/xoWX1l9v8jKWdYJvSC/E7aPw7EMH7ayBjnOzH+TU7aPHbk/6bO/HUR5FcJ/wkkwcq HY5/WpP+Enl24Zjt7DNDy6s9XL8EL+2cF0h+L/zO/FhbCJQZ7hDjOVU4PHcfnSLpkYYE3U2eoCno K4VPEsqEYdhjnk9/epF8VTED943PGD0rL+zKv8xos7wj+z+J6BAyqI0SVyC2WLN0H0q0OJAPtJAO DhgCPxrzlPFEzuMSEkD04FA8US72CsWzz7k1m8oqN6s0jxBh47J/eekXDxSLt81FyfQcH2rU8FRR z65EQ4kKKzfcA4xjp25P615N/wAJK1vFkybi/AA/h+p7fh+legfs/XEmrXmpXLknyY0jGf8AaJJx /wB8/rXvcMZLKeZUbu6TT+7X9D47xA4ppU8gxTgtZRa/8C0/U9Nooor+iD+IQooooA96/wCCeWk3 V98adVkgsbi9ih8P36OqROykvCQqEryCx4A6ntzW98PEW+/ZE+JdxF4KbTLSz1fSXuYbcXUguVhm kMwYyuxGwcNjG3dz2r5ttr2azJMMskRbglGK5/KgXs6xNGJpQkhyy7jhj7jvXg4zJ5V60qvPa7j3 +y799b+mh9FgM+jh6EaPJeymr6faVuqureup9M/GnwFrvxP/AG1rHxT4ctrrUPDms3mnajYaxBER Zw2yRw7maUfJH5XlsGBIK7ORXfeNtdi+IHjO0WbwU/jb4d+K9currR9S0oSwXvh+Y3bQTypLECNs jw+eN+A248/KcfFsOtXltp0tnFd3MdpOQ0sCysI5D6lc4J4HWktNXu7CGaOC5uIY7hPLlSORlWVf 7rAHkc9DXLV4elNQTmv3ceVaNO3e6d77arz7nVS4mhTdRqD/AHjcnqmr9rNWt/wOx9ZeLzB8NvgJ Nrc+man41sNL+JV9f2l7JK0EV2AqiO6ldEIeN3XGVKqzZwe1L4P8Xaz40/ZyHjDxH4LvPF8mpfEt dXntILWcZh+xqDJEsZ5QFTGN25D0OTXyR9umFt5PnS+T/wA89529c9PrzT4dUuraMJHczxoOirIQ BWf+rS9mouXvc176rTto9PNq3oW+K/3l1C0eW1rpq+13dPRLZH054c+CPi/w3+zh8YbO/wBJ1S41 PWLTw/dQW0dvLLNHH9pZxCRtzvji2blH3AQDirvhP4ePrPwX+HnhTV9Kvr7VPCd9feJtY0+G3ae5 0+xCtIltIg5SS4dAFiODzkgda+V01i7QsVurgFjkkSkZPT19q6P4Q/C3xN8ZPFU2k+Fraa71JbaS 7kRJhGfLjALEkkDqQB6lgO9XXympGEqlWqoq/Ne1rPlUe+1tSaGdU5VI0qNGUny8tr3bTlzdt7/g e4/HaPVPjv8As8aJ4/0UeI7zUdCnuPD2r3Ulm1vNe2cjGWN2CO4aJGZ4jyeSMgYrD/aq8IeIrDw/ 8IY4NL1mK4l8H2+nFY7aVXeVnm3QYAyWKNynUg9MGvCLN7meRLJJmjErhNjzCKMEnHzFiFUepOAO +K7T4i/Avxn8M9d0mw8Rx2mn3eqxrc2Kz63aOGjYkLKWExVEJU4diF4PNOGWwoTpwlVirOTimrNp rbfW1+22gVM1niIVJxoyu1FSad0mmvLRuyWvW59GftZeAtY8f/G/xpomk+Dryxv76WyvD4mKXC27 WkOnOJ0dzlFBDhPkADFdrZNeefsr6Dez/sufF+b/AIRm78RW902jLFaLHPtvDHduXCtFhiUBDHae OM8GuNb9lb4n3Vt4h8rTGv8A/hFwV1eG01m1upbP5SxDRRzM54DcAH7rDqCByVn8P/EMHw5bxPDJ bRaEtx9maRdVt1kE2Cdnk+Z5u4hSfucgZ6c1hQwdJ4b6tCvFq8NU+qs19rqkrJepvXx1ZYv63PDy Wk9H2ejfw20vq2fRPhvQPHnw7m8cfELQNC1fSDqFiL3RdN+ySvNp9v8A2xAwhkj2/Kjos52jqgdu hzXKftC2XhjVP2crfxN4SeK307xR4kS7udMB+bR7wWsgngx/zzyQyH+6444rzzw/8B/HXivwAvim zW0k0CW4Wya9m160hSOY4xFIJJgUb5gcOBwwPQ1dT9jr4kHWdX0p/D6wXugwfbb62m1K0ieGDGfP AeUb4+o3plcgjORipo4XDUqvtJ4iKaeuy0VlZ3b2dtd7vzKq4vFVaPs6eGk4yjpdN6tt3VktGr6b fce4fCzTLvUV8CaF418NXb2lvotvfaJ490ovaTaDbPbm4VJnAMTrCzMpD4+XnB3c8l8SrBvDv7I3 wZS88INr6yy6vFE1yLuHyzLdq0QAidcmVfmUHJIXK8Zry3WPgJ488MaPoy3VssOj+LJALC4TV7Z9 OvXHQGZZTCGGCAHYHjHUVa8Qfsx/EDw74mudA1CytINW062a9fT31yzMyRJGZC6p52WxGC2FBOAe KUMDh1UVT6xG1+aydr2TTa101lrbS/TUqWYYr2LpvDSula7Wqu4tJ+7rpHS+tuuh9Par4Q1eX9sr x/dDQb64t5fh88aJ9mlEUzNYQoIgw5yzo6AA5yrDORxyf7PXgDW9X/aD+G/iWDwnqfhbQNPuE006 dNDKpNwLOQzXKh8kx/KgaRjkkqOdvHgmlfA/xlqGkaZqM8kGlJ4gA/ssalqkVnLqa5wDGsjg7CWG Hbah3cE81dvf2aviLY6DrerXNrDDY+GLg2uqTS67Zr9hl3BNjqZtwJYgAY+bIxnIrn/s2lGDp/WI puKh+a25rN3dvw6nT/ataU1U+rSaUnPTztL+W6SSv2PVvG3wx1X4t/B3R/Dvw90W8sLGHxEf+Em0 WZJZb6w1GQCOO5lYjP2YxdCFUJht2TyNrW9Of4u/CTxl4S8N2vi1NW+G15barocdxYPbyWi28aW7 wxsrs29o1EwUhWZyzAZJx4HoP7P/AIy1TTtKvyLXSz4l/wCQUt/qcNlPq3OAY1kcMVJKgM2FYsME 1zd/4U17w745uNCvlm0rWY5/IuIry5W02OP77yMqqMchmbGCDnBrqp5ZCXuwrp8j5l1d7rmvrqtG ummjbOOrm04/vJ4eS50ovs1aysraPaVtbvVI9d1fw7rmk/sDaJfiy1a2Nv4ylvxcCGRDFG1sgSbd jhS/AfoT0Oa0f2oPBWs/HH40+H/EPgvT73UdB1zTNPTTLizhaSDTiiLG8MjrkRtE6sWDkFRyeOa8 /wBd/Zb+IXh7xOfDN/Y2ltqy25uv7Nk12yErRKpclU8/5vlUthcnCnjinaD+zh4+lg0/Tbb7NZXn im3S5tNHm1iC0utQhbOx/JeReDhiobBIBwKuFLDwfto14XvJra3LPXv0tvta5M6+JnH2EqE+W0U9 07x07db6o+hvif8AFfUPDPif4heO/CukT6x4XuvE2nWmoMts0ljrFrFYXUF5uYDaYvMx8+doYoec 4rxz9rTwroHhb4e+AP8AhFdQOo+G9SOo32nO3MsMckkJMMnpJGwZD/u571yPh79m/wAdeIvANlr1 lbWLeH9SuVs4bl9dsoYmnbpEweYFHP8AdYA9Kt3H7HvxHgOuRz6DHbN4XiE+pR3Gp2kTWcRUsJSr ygmMgHDrlTtIByDWeDwmDw1VT+sR93Rq61SSir67p9fO1jTHY7HYqhKH1aVpK6dno78za02aX4H0 34M0fU9K8VfCKKXw7qGnCTwJ9juPE4SWKTw4NlxvYlwYFIBH+sXd+8GCMivFPiR4Jv8A4g/sp/DC 38K2134nXwzfa1YXx062eeSF5bpJIS6KCyiRPmGfXFedf8KS8b6lNoFlb2UmqnxQ0qabHYahDei6 MJHmD91I4TZkE78YHJ4BNXF+Avi/QdL1e90++0eS20vZa6u9l4gtQLMSyrCqTESj5GkYLnleDk4G amhgKNGoqirx5k7rs9ZLv/eaW2q9Sq+ZVq9N05YeXK42ffaL00S+ym9Nme1eIGi8cfCb4n+DNECX fi23TQZprS2YPPqEVnZQQ3EMYHMhgmRyyrnvjNYPhv8AZjTX/hx4DtZdP8cpPqeo3d7faZNGNllF AkP2q4CCISfvURUjBx820ZJ6+O/FD4L+KvgHrNnb+IrSLSdQniFxAkWoQTyhCTtf91IxUEg4JxnB xU3xS+GPjH4XeN7Sx8TLcWer6tbRXMUlxdgGSKXhS0hbCgEEHcRtKnOMVtSwMUoxw9dWl7ye97RU Xaz1S0fltsznqZjJylLE4eV4+61sknLmV9NG7210Pc/i5oOo/tXfs+R6toWleJNT1vwRrk9q8Mum tFMbS6dn8qNEaTcIJAFxnKIeQAMnvbXVE+Jv7Vb+FPFyyaR4k8IeJX1bwve3Mflm/svtBkktCSPm UqDJERxwwB7H5O+Jnwi8YfAqa0h8QxLpUupxC6gih1S3neaJ8gS7YZGO1tpAY8HBrj5ruW4mEkkk jyDHzMxJH41EMijXp/u6qcPe5Wle3Na+t9Ve91bqyqvEUqFT97Ram+XmUnZNRvbS2js0079D6D+A 2paL8SP2cr3T/EUkZPwq1NfElsjoGN5ZS/660XI/jnWPr3lHYcR/DzTdf8cfsgfGDVpLDUb241nV 9NvWmS3dhcMJ5nmcEDBClssR0zzXz9HO8UbqrsqyLtcA4DjIOD6jIB+op8d/cRQGJZ5VibIKByFO evHSvRqZJfm5JWvKLWl7WabS16tXfqefSz+3LzxvaLi2na900m9HsmkvQ+lf2iv2efF3xW+KngDS 9N0XUIzJ4Q0q2mupraVLayKRN5hlfaQmzByDzxjGTit7x38G9X1j4hfCzVb7w9rc+j+Evh7p19qK JYSPulthNJ9lIwAZC+xShIIDHOOtfKDa1eMpBu7kgjBBlbn9aG1u8dSDd3JB4IMrY/nWCyTEKNOK qq0U18L66N7/AHG7z7Cuc5uk7zab1VtLNLbuvnc+wYND8SfHWw+GnxK8GNqM/iTw2bvSbq/1Ww8s X32eCSeB5FDMpRwJIGcNjc45U4A83/aGs9J1T4CLrSeF9T+G2s3fiFYrnQHkkFlqRW3kJuoYZQGj KFthC/KN4HJIx4EuoTrbeSJ5RFjGwOQv5dKdqOq3WsTLJd3NxdSIgRXmkLkKOgBJ6D0p4fIp0qsZ c+kXppZ2u3Z62a10006WFiuIoVqMoez96S1u01eyV1pdOy1116laiiivpT5YKKKKACiiigD834EM YAPJ6ipoxtwSR83r/Kufjv5lGfOlyOpJ/nU0N5MQx86UHGMButfhjsf1rCrbodAi/KM4ODg8VLbI NwIwG7Yrnkv5FQ4nkyOfv8ipItTliXAuJevZvzzSGq2qdjp4kKksccc+wqxEvQjjHI5rlotTl35+ 0M4U9d/B/CtC1vpUALSPkj+/zWUmkdNOpd7HW2Hi7UPCnh3VVtGne3uYN89tHuZpipyuzHIkzgZU Z7dK5X4B/DDwZ8VLbUNN8eajdeA9C1Z7SdYZNS+xx61IZZ9sASXc4+QFjOCsaZJYHcorc8F63b6f raSahc3ENg0ckd1MkqRSWyMhBkV2BVCvXcRwAeh5r6o8L6l8P/H37CGqeONXF9quq3M8vh/w1cLo yp/wktm0iJ5t4csqFER9gZs/u1ODnFfhvibia2HxNOGGp2dayU4tRldXa30bstOvbuv17gKEatKc 6suZQ+y02rPTo7pXd307nz7oP7Hf7PGhW/h25j8YnQZdQjVbq/h8ZwKdMlNiJ1mRNv8ApOHZH8uE LgsICS4au68F+FvgRrXi68E3x18SStb6De2pvpPEz2q3EEGEFuS0IS3VmzIVO7zGYKmQGY1fgn8B fiJ/wUA1rQ/g5eXui3ejeBtcU3vi+GztTqNnpjWxUQXJiUNJ5aK5WIFiZH5PHH0X/wAFNfh94S+P Vp4V8P8Awh8PNpfhf4f+Hl0zSrxbM2txeSNIqzbA6Z3LHGGDOMs5bJAr81xeKrU4KOKx0072a9ot L6reN9raaWXQ/SMHhI1Kvs8NhI/De6W1u+u7d0t76vzPjXxl4c+GOmfF23s9F+JN1qumHQbrVrlr nWRdnT7pIotlitwY9l8xYyPtgCn+FcIhJ4L46/Gy/wDDXjTRtc8H6jfeIXSyuEFo0seqLpvlTeXH H9qijWOfMeG2KA67QXLbhX0F4euNS+LnxB1b4s/FLWtK1Dwd4Z87wvY6fpOjWkazyLGFjRol5jmY 7CXbds3Md+CFHiX7TXxCtPiLoOh2msXsHhHSYHt9O0VNJjX7KmW82cMqMHMsSLH5W75JHkO44WvW yiE8VilJwdWMLRnJu6vK+nwJykrrmta3V738fOOXD4eUbKEpaxSTTsra3vZLR7nbweO7r4l6bY69 qFwl3dXljHiWJUjj5AJAVQF+9nOBkkcmmodmOmTzWX4g8Q3Gp6m0slzErFViVYo1hjjVVCqFRRtX gDOOMk+tURqEiMR57jgHO7Jr+kcqw1OhhoU4QULJaLa9tfx6n4Rj8VKpWlNtvV6vdq+h0qsSuOvr xjFWtLkMeoWxy3EqnHRuoNceL+Ugnz5R2Pz9asadqc0WowGOWUMZF6OeDkYr0ro8+VbyOlWRwWB4 wOc+lSDeJNxGOx46+1cj/azqTl5tp/iMnr/jSxam7nh5CcY+/jFNJMj6y0dkjEADDEdMjike8WAg syIT6t156VyKamflzJKMn/npjnpUolRgC6yMB1YuCBRyxK+sycbpHU/2hE7ZEiBs4+8Dn6VLFcq+ Ru64PXOa5Hy0C7fLIIGevT/IpVCMARG7D0U5z7U/cJWIn1R2P2pSRll6Y5IBFKtyuANy4OeCwGK4 8C3wMRMAeME9DQbSDAHlAkdcMM9MUrQSK+sT3SOul1WJIyWmhBHDEuMGo28SWY5e6tQSOPn7Yrlv s9tFyYkPfqOfamSpb5/1KEDr07+lPlgyZYmpc6VvGOnBWP22HAwDgnH8utMk+I2kpny55GVeCdhy 3+Hb1rnfIt14EC4JxnAzj34p8FvZRLvmhKx9cbQWYeg46e/8+lU1S8zN4iqne6Ne5+I+nwtgtK21 dxQKBwRn1r6D/ZVuU1b4dT6hGjIl3eOF3dWVVVf57q+XpDZMS6wxopOcKv3R2xmvp74NfEXwj4G+ FOi2V34m8OWMqwea8c2oQxMjOxcgqWBBG7pX1XCsaMcU6knaye76uyPz7xEr4meWqhBc3M1olfRa /men0VyTfH/wGgBPjbwiAwyM6xb8j/vugfH7wGW/5Hbwj/4OLf8A+Lr9F+vYf+dfej8O/s7Ff8+p fc/8jraK5WL49eBp2wnjTwm5yBhdXtzyeB/HTX+P3gSORlbxr4SDKcEHWLfIPofnpfXcP/OvvQv7 Oxf/AD6l9z/yOsorkh+0B4DI/wCR28I49f7Yt/8A4uhv2gfAY6+NvCPPPOsW/wD8XT+vYf8AnX3o f9nYr/n1L7n/AJHW0VyX/DQPgIH/AJHfwh6/8hm3/wDi6G/aA8BrHuPjbwiFJxu/ti3x/wCh0fXs P/OvvRP9nYr/AJ9S+5nW0VyX/C//AAGOP+E28I5/7DFv/wDF1PefG3wXp9tazXHi7wxBFfRGa2eT VYFW4QMVLoS/zLuBGRxkEU/rlD+dfeh/2div+fUv/AX/AJHTV9Nfs1Xd3+ynY+FPE2q2ninTrzxX rCGOO20c3AvLGMNH9nJaSMq0zSu4ADk+TEwXpn44b9oHwED/AMjt4Q/8HFv/APF0f8L/APAYXP8A wm3hHA4z/bFv/wDF152ZKhi6XsXViovfZ3XbfTXU9LLI4rB1vbqjJyWzs1Z3Wu2ul0fTv7fnwIn+ DP7QesT29nPH4f8AEEv9o2E4RvJzLlpIgcYBR9/y5yF2nGCK7j9uL4f618aNf+HviLwnpl74g0W8 8KWdmLuyhaaGGaOSVnWVhxEVDrneRjnOMHHxT/w0F4Cyf+K38Icdf+Jzbf8AxdTQ/tL+Cbe1kgj+ IHhaO3mwZI11yAI/1G/B/GuCOGilQk68XOkmrvqmktr7/M75YirJ4iKw04xqtOyvdNO+jtsfYPg3 x94t+F2vfEj4h+Dra8v9MtvGcV1JcwRu1nqFlnURIGYDDRnzI8nnaWRuCAaX9sDRvB+q/BnTPG3g mYRaX431lbu503aAdLu0gcTR4HTlwcdOcj5SuPjZv2h/ACjJ8c+DgM451m2H/s9H/DQngH/oePB3 /g5tv/i6UMvw8MRHEKsk1ba3vRSSSeu6avf1VipZhjZYWWFlQk4yTte+jbu2tNE1o0fb3wi0M6d/ wTV8SXGr+HdX1ayPipb8W0LvbefAsNuDMX8tj5IKsGZQPun5lIzXZfssfGTxD+078Sfif4r1jSHe 3PhCTSre2so5BFhSWW2RzuJkbc57kliQMcV+d/8Aw0N4Bz/yPPg7/wAHNt/8XQP2hfAH/Q8+D+en /E5tuf8Ax+uSvk2FqwqqVaPNNtp/yp2ukr9bb6HZh86x1GdHloS5YRSce7V0m3y367H3x8dvA+qe Nvg18KZvh5aXd18ONLu0STSUgaW/0u/Mx837QRlmO95FyAFBJ4wymt/9sD4far48/aK8XaNpngrU JdR8Q2GnwWHieOGf7PZKhiecSOT5ap5aOCyDd8oTB3Gvzo/4aD8A/wDQ8+EMf9hm3/8Ai6X/AIaE 8Af9Dx4P/wDBzbf/ABdRTyanBxccRH3ea2mvvNO7akrtNfM1qZ1WnGaeFn73LfXRWTjZJxdk7/I+ 3/2+fBWpfHjxP4M8YeBdNu/EHhW/0GGytv7OhacWMiPIxhkCg+WQsi/ewchgfu1a8JeFfEeo/sL/ ABsF+LjW9VvdYs5WubZWuVvWintzMyOoxIE2tuZcqNjHOOa+G4P2mPA9lBNFH8QPCkMVwAJUXXbd VkA6ZG/B69/Wq3/DRfw9HXx54M/8HVt/8XXRHLKaw0MN7eNoSTTsr2TUrPXy1Zzf2lX+s1MV9Xne cWmru12rXSt07H3H+294b1D9oT4o+APEHgG3uNU0HWNGtrHT5bKNmj06dJpC0UhQHymTzEJ3YIwf 7tcz/wAFGvE+nfFz9q+S38KqdXmtbKDTpfsMZmN1coXLBNud5UMqcd0I7V8k2v7UXgWxgljg+Inh KGO4XbKsev26rKORhgJORyevrVY/tI/Dsf8AM/eCv/B3a/8Axda4PL6FCUG6yahGUY7faaeuutvl fcxxuPxWIjNLDyTqSjJ7/ZVrLTS+/wCB+kv7Y3gDVviF+0ZrejaV4L1G51TxHpOnWOm+JYYpzBpz rdRSymR8+WiiNHBdRvH3eQxq94fnTxx8S9G8F/E3wDI2reHbVTpnj7Sna2jhit0MsU7vgLGF28hn ZVkJGwV+Zn/DSfw6B/5H7wVn/sOWv/xdTr+1N4CjsHtV+I3hBbaRt7QjX7YRs3HJHmYzwPyrzo5F S9iqLxEfdVk9U07JXT5trJabHpyz/Ee2lW+rS1d2t01vZpx3u372+x966PoMPg7/AIJ6Ty3Og6p4 i0rTvGL31ukbvbLdWycJcOwRiYDjkrjOeHFavwK+LHif9pbwf8ePFWq6P9rl1Hw7FYWNnb28pgkE aXBFuhU72b5snDbsvnjIFfncP2lPhycY8f8AgrP/AGHLX/4ulb9pD4dIfm8feCgffW7X/wCLreWS YaUJqVaLlKXMpdldNq1+tlqYQz7GxqU3GhJQjGzj3dmk2+Xom9D9G/2WLW38J/Fe11TUdCk+Hln4 n0CTw9olvqO+F4tQjht/NkQSc4k28SNhmKBeSa+XJ/gV4/8AA9pr1reaRqeixyoljcRXMLx/2o32 iN0t4RjM7eYiOBHniPcSBzXgo/aV+HJ6eP8AwUf+45a//F1Nd/tT+ANQEZuPiP4Qm8pdieZ4gtm2 KOijMnA9q6cLgoUakpqvF8ySd9dm7WvLs9b311OPF42riKUISw804NtWdviSve0V208tD9FP2tfh Dqnif9q7Q/EdxoOtXnhvwz4at7+7mgsHnSV4HlZbcDhXcyGMMm4HaWOQBmuc+Nvha+/az/Y28J+L NGg8QeIvEPg26fSbiabTTFd6rbsVAkWNHl8za3lglWbnzSccgfBB/aX+G4PPxA8Ej667a/8AxdIP 2l/hwBj/AIWB4Iz/ANhy1/8Ai65qWUxhGlbER5qezsttU01zdb9+2h1Vs3q1JVb4WXLU3V3vo00+ Xpbt3Pu/9vH4H+LPib8aPAVpo2gatdiXwtp9i9wtpIbe2m86YFZZAu1Nu4Fs9AcmvlHXNNOiazd2 XmJMbSZ4TIoIWTaxG4Z5wcZ5rz7/AIaX+G68/wDCwPBOP+w7a/8Axyl/4aY+G6j/AJKB4I4/6jtr /wDHK9bKowwlFUJ1oySWmy6+rPGzdVcbWdeOHlGTd3u+i0WiO1oriR+0z8Nwf+SgeCOP+o7a/wDx ygftL/Dgf8z/AOCOf+o7a/8Axdet9cofzr70eT/Z2K/59y+5/wCR21FcT/w0x8NwefiD4I/8Hlr/ APF0g/aZ+G2f+SheB/8AwfWv/wAXR9cofzr70H9nYr/n3L7n/kdvRXEf8NNfDb/ooPgf/wAH1r/8 XQP2mvhsB/yULwOP+47a/wDxdL65Q/nX3oP7OxX/AD7l9z/yO3oriP8Ahpz4b/8ARQvA/wD4PbX/ AOOUf8NN/Df/AKKD4H4/6j1p/wDHKPrmH/nX3oP7Oxf/AD7l9z/yO3oriP8Ahpz4a/8ARQ/A/H/U dtP/AI5Qf2n/AIalf+SheB//AAe2n/xyj65h/wCdfeg/s7F/8+pfczt6K4f/AIae+GgP/JQvA346 9af/AByij67h/wCdfeg/s7F/8+pfc/8AI/N+PU4iCfPQDGSC5y1TJqaKpC3EORwf3nas6GPdGwCn B64Ix9Bx/k1IibQpCnaPVhzjvX4s0f00qrsaiX+UISe2JbJx5vJqaK4kJI8+3wP9sfjispAsW5lj T73XGcfTirMUecFkEm4ZHT/DApaGsZPqaaXLqf8Aj7scn1YflVu11H5wontn4x8pzn/69YkRYMPl jJGQAEGCf896u2DOFHEUbAkDKAr+lYztY66Ldzs/AvxEsvh14v0nW9XKPY6XcrdSQRkPLdbOkaIc 7ix2rjB+90r1j4S+OPEWk/sCal4c8d+Hda8Hz2HiKPV7SXWtPazS/jlnd2aEybA+1ZMEqONnvx3X wO8HfCH4lfsR+L/CbeLdR8Kf8JFqlkfF13d6XZXGuwpCVkto7GcjCWXnK0jsi+b8pVjg4roPg5/w TZ8A+Avjv4Y8RXXxof4lWfh+7iurXR/E9xb32m6gFO9Y5EMoJjJ2sVXGcc5GRX88cecU5PUx8KeJ m6c6M4vWE73jrpZWs02uqsfv3BWQ5jh8G6lKCnCrFq6atrbq+qa2Nf8AYD+PNx4R1zUX0WK90OTX tIghk1D7LscxoxYsjqMKrq+C7HPzAAgmvuf4/wD7SvwW8E+BPCkWleGUv7vTYPtl9pzK8a3yCNla Dcu4uTIVc4BGBzwSB4v8VPC2j/GfxxqOsnxB4W8FQXGmJY/2b4cNra2VxbByNyh5dr/OQSB3UZHy 1zMH7LnhbT9Fudd/4WjbNLoNtJcCZ7yyUJEozIPMV88rnlR3r+fMVnPPiq8sO1OFR6c0XJ3i9HHm WnNZJ6PQ/XI4PByoUJ4tShUhuoT5ea6taTWrtfSz/M+TPiX+0f4Y8TfAPWdB83TtG1qHWbe7/syS 08qRovMZgY8KC0SAgc8jaTXzRqPxS1fT/i1o8fhPR7nXxZ6ReRzLpdn5nm/aIyrMSFJAQAdfQ461 +nv7dHwaT9sL4V+GfDXijxB8NPCNvoc0N1b69YWVrDqrxLEUSOSd5iWSRWBZQvLqrHGK+fPCn7Cn gD9mPxNY3uj/ABfm1bxLp2rQ6hptoGtZEeSORJVFyqA77cEKXU8MDjHNfo3DfFuR5dgJ4alJy9pL ma5Zuz5UnryrRfpufKZ3leYZrilVcFCy5bqSd1zX+88H0f4W+MtYkhisvCviO/JiWQfZdNeZVXHG 4pkIf9liD7VmeILTVvB2pfZdX0q+027K7xDdWrxuVOcNg884P5V7/wDt/wCreDNJ+JniOaHWNf8A EvxS8RTRapr+sWF5/ZugWMzIg8uC0hAEjeWijk45JZmYmvmUT/aJWLzSyMBkFyxP6896/pPhTNsV meEhjaiSpyV0uVpvs1eT09Ufz7xJgcPga88LTu5p2eqaXdNcqehdj8VyRE7oyA2RnymJH/16tWPi lkvLdhGWYsMfumHfrnNZweKLrMy7uMkY/wAk1PC8EF1Gwu5s7xltvT8PSvrLo+W5pLdkz+JQCUdW DLwV8o5H059qUeJ0Eu1kmJ44EXb61TEELxgre7i3PK4J9ie1TR3NtINizs23ggEHFXoQ3JlgeJVh G7ybgrnBzCKmi8TQJHuMF303DCr19T61Viu7RHctdSB2OAp4Uevela8tJZNizyEle3Q0NK2w+aSW 5cTxZbkAGG5IHJG0EfhUieMra3IBjuWY9CV25PaqiX1ptCG4AbkEbMEntn+VNhu7WVTsuBvOc5GO e4zjGcelK0Wthc81sy5/wlkJcsY5wR1OASPfFCeNFC8Ry7cfwxrnHqOaqC4gOVNwcrg8KPmPbrRb 3cUofbNgI2zlR14/XkUWj1HzT6MuN4uBTKiXbnJGwDFQp4n8wnakjeh8sDB6/wCc0wXSDDG4Ujdg q8akEelRx3kSl8zqQDjcY+Bx6fpVRjEUpyvuW28QrLn5zkDn90MD9aik8SNKgICscY5TB46VACWi GZ4Nvc+TgD3psaeThS8LgZJGw8H1NWkkZyci7Z63Lcz/APLFTjLMyfKoA6n+fFZviSMeIJWCRwxw E/KTF+ZPr/n0qwkxRyiBMN94hTSxyedIAHtkUdcknbjr/LtVNJk3b3Zzl74QS5uNywxRRyKBGGUk 8ccnj0NQt4IWM7dtuWQ8/K2BXYW18TdGSSS3Xb84VQcpgfKvP0FVYb0LyfJQdMhTg+3196UYoSfc z/CfgSEaxYMXh2yXajCo3QYJ/nWPP4MgmmkcbPLJOCyEEemffpXeaLdtbzwOHUiB3lwhyfujP8vr VJlQWrM20sXAxz3z+vAqEo3vYGnpocefBIglBHlggZwVOQasal4HiMEc8XlCOQ7SoQ/I3p16ccfS ujEwExQ8gDKswO2Udyp7gE4OOh4qxA2A0YSORHGGweh7H256/Sl7j1iEoyW5xX/CGR8J5cRb3BrQ 8M2154PvprnTJUtpp7eazkcIHEkMyFJUwwIwykjOMjqCK6FQu7/VhsocncevvUlqnyHKYIBwNzED 68VdopaAoyb0OLj8E24TasUXyj3HHp1pq+CImJIhTk5O0nP1rtrcbwG8nBc54DNkD+tOwgyBASSw O4MQGxxgelQ7dh8rOJPgqKIHCxnJx1J/GpP+EHjktA3kRAlz1YgHAFduYo1dw1pH3DZdsgj8MU1b NjAgNmGVcnknPap0fQq1jiG8GQsg/cQgk5wSeKb/AMITEgTMMXzZ5PP4V3hlW28P3Fn/AGbYtK12 lwL8l/tEKhGU23XaY2LK5yMhkGDgkVSVUKLHtUOR0Ykgf4Zp8q7ENO5yD+DIzJgQ2wB9+AaZ/wAI VC0uCluGI6fzr0nRtV0mx8Ha7Y3ejWNzq2ovatpupm4ZJNI8uRjOvlg7XEyFU+YZXYCOprEaGIfx WzDg8g7v/rUrRXQJppI5NvA0eMhYB6YNRHwPGjEbYBn8q7FwiRKMwiMcDaMkn06VGYI03DeCvTAj z/nFFkLXojmLvwvZy2NoixW0U8AdLiYOSs+W3ISuPlKqducndgHiqcng+CIAtJb4PqCK7J4oSFHm HJ3A4hBB/wD1VFPFbyrw8ny4HyxgAfXihRSE7nFDwhbGLcWiHv5ZIqOTwlArEjyCB3Mddq0UKShj JcFhn5dg2n6ep+tVpGRYyd7lhxggYUU/dvsTZ2uzjH8Jxgfw8dSE/lUUvhdGBC/NjnAj6V1skio+ PtBPUZYjA/WopbyKPO2clmHXI5P0qkl2Icuhx7eF0QnCE5GQBHUQ8Ixkk7CR3BTmuta+ghyv2lsE dU6/h7VBPdRyKAbmQ84IyOPTNUorsZXOVbwrHtyYXIxx+7Ap2p+FVzGfJOSrbvlHB3niuhmvrdyo aaYEgktnocfypdR1CJJQwkl+YFsKQOrHk+lVyrsGvc5CTwsGb/VfLjk7O9RN4UO8YXPvs/8ArV1E 11CxwZp+eD83T8u1Qm7t2Yu00/C5+9wfTijkXYlvscw/hHOcqSSccrjd+lRHwiQu0o2T1ytdMdWt JEHzXDAdeelQC7tzyFl2njIY0+XpYl2ve5zh8KMvIV+uMY/z+VNbwrK3JWRh/u9PrXQPPbnJCzY6 tlzk1E88Lqw2MuD3c5pxh5CbMA+E2QkhXyD0Aph8KSs5/wBaMc8EVtSzRBN20keuSBimTyxQkny1 HHJ3GqVNdiJSZit4PlZyAjkDvwMVHJ4QfcOAM9yR/jWwskJH+rySOOTz6VG08LFv3Z3EevU9xTVN diOd7mQPCGTkjAA/vD/GmyeEdrHJXB77xWsZow2dmQR2POfaoftCK/Kcg5+9nH0o9nElzsjLl8IJ jJKhvYg4pjeFY43OSG2n+8PStSSSJ2+SP5Tzgnr/AJNM81Vjk2wgE8YzkUcitsZ87vsZJ8LxfNll P49eKj/4RiJunJ9m61sOd+BswR71BK6JwEPPqf50+TyL59DLPhmIx5AU4bHzNzRWiXCKGWP5TwOT iip5EL2i7HoYkQBRsQoxJ64Az3IqzEsTQZXOFGBhTgfSq1vpaugxKhOPnYjrjoKt/wBktEcidyjk EBMKSfz7Vk5I9SEe6COaCIFfOHyjjK9j/Wp7WWKRiPMiwT6Y5+lNXQNxZPtO0g5+8CPf86mTQo4E jzNICxyGUjIPt7UnJGsIsljMcsRIntSBnaDIScZxyBVzT7WJiI45LUkkY2sTj3qBNBjScfv2w3O3 aMD0471h3fjnw2V1O2i1aUz2Qa2nijtnyjbTkDjqOeR3rCc0lqzppxbeh7n8CPha3jb4OeLNUtr7 wpb/APCLz2t3dzape3ML+TIzoqxvEGVlZgQVYZ4GCM19HePv2Zvh/wCKLDVNM8MeH7+DxDNZMulQ 3GrSw2puwm4QMSTtDN8oyR16ivkf9j/4yeHfAH7GvxLtH1C4hkv7TR7GFDZXFwZv9Mc9UUqhyRjc fYA5r9Qrfx9J4w1pdFvZ4I7XRvsY0mw8raJLgoXnkzj5pjlS5kP3Djtiv5L8SqGOnnVfE0ZNKl7y 3SlaFN2drJpXZ/U/AeOw1HJ6FCaTc3bdXjeUknaz3t1Pmb4XfskaBZ2kWgfFbSvK1rTdMilhtNJ8 QPex2CSzMXhyo+Vlzkgk5Ytg4wa9h8PfsFfAf/hWfiW/fSNQJ0/Trm6iuJtRmjittsTFGc7seWGC lyegU8YrzjxTd+OviZ+1P4x8AfDW3s77xJe2EEkuqaxGqWOg26yyGW4lCjJC4CRRqpaRmAwcGvXI /gR8X/2ff2ZPiNqHjrWvCPxC8IXfh3UtPuNb0u0m0/UNGvVgeNDNA6hZ7d5CFEq42ErkEHI+AeT8 QYqEcyo1XGnJxlyqUtnZtpapbt2bu/M+ozDN8tov6jN/vLWvoru9rX03t0W55v8AAv8A4JpaY+se MdX+KvhLQLixH2Q6FqOi+KZbyHUt8W6W4b7rAMwG0FVxkgAgA1U+O37Gfga08OeHrPwbpOmeGvEW s6yLI6lq0t9KIlEZb7NhDuyzEFhwMAgV+hPw78FQaJ4T8Ou8YWK30iyn82eMxw2hZY0V3A+YEscD OcOyjvXzf+334sbxT8WfhI2q3Uthrlr4pm0m9u3zvdIB8iuoB3SMrBd2N3vxW8MPm9TD/wBsVKji k2lBNuNoxfRt7tX2d9fQ8zCZnhZ4tYBLmb1ctE910St+XTfc/P8A/a+8HJ4P+P2qaRb3Fk8+mW9v FdGG3W1tBP5QLrbx5LmIZwGkPmMck9q8xOmSfaFy0B+bIKtuznP44r2H9uizC/taeO1LWzNHegDe 2ScRp1PqOntivJxfCCSJysY2n5hHbgge/wCFf2BwZKTyLBvvTg/vimfzbxQ+bNcQ29eeX5kMlqIQ FaZFJwchSxznjP19aWOw8m6jYNan1cnaRn0HX8Kkt9fitiUWVtpJYAWmQOeMelWE8Rxqih5AQV3E fZly5z1/+tX0/M0fO8sG7tkMNusOwCSN1K7ucg/l7dKR5LeJiVihIznByo+nFX08TtasVEQeSQEc W2QB1w3b6AU678QIbdTPCqbiCWIQOD64HShTfYcowa0ZnrdwtMqLEVXIB43bfqfWn3rQSICtiAOr YJHGeOtWxPb4LGOKQKd7dVLHp2PPFIrq6AttDopXI++gPQ4PbHGaOcydOyGIIOd1mqjA24U4Y/XP X1oFxG0khGnorA8fMRx+H8qsTDzIY4xEMBQeWPb3HPpVYKYpTsZ5GkOVbBznPHTjimpXKcbaE9pe RwTRMthBOI2y8bow3gdieo/DrWZZ6pA91qPl2ioUuADGH4AIyAD27/lWnMiM5bnawLMVJzx6+lVB ATJLKhQxvNuVhGScYAxk9Dx0qHy86l/mapy9lKPTfZeS33JLS+VWZFszG7gBSWIzz2J6/hSyb5bk yiwTk4X5sZ9efQ+tBfYpVmw5UqHkjwB+A749KSCQqrKJwvG9vlHoMLjPTFacy3RztbXIJpYFkWTy YF2v8uJW3Y78VPLJCk5fyIkBBJO07Sewo891kMonMaAjcwjVi3PIwe3t71Bal45XVpZnMjZHyhdv pjJrVPqQ07kkl5DLdFBZRS5GThmAbjtk8URywwEKLVdx5yWJ7dyO1NmjW5LgG4k2x+Xsx3z6+tQ2 0MU8kTKr4GRgtjOciqTRD5rltLr594hHK4BBbnscD9fzpkV4shWJFieQZIEm7aB9f1pkVzIcP5Dq qjCksxJHY8VYht7jVLmCO2hur2WZlSOG3ieWWWQnCqEUZJPQADJzT50nqKCclZEVtqbWcoCxrITu XEMLOzZHRfU544Gea7/UvBlj8E4rRfEukf8ACQ+IdUtIdQt7Bne30rTopN4IuXUiS6lUqVMcbJGr K6uzEYrmGis/h/c7tdm+y+JpIBNp2kPKIbi1VuUvLgEhkx1jiwGYgM21QA2j4p1+38UeBfBxm1Iv cWOmXUMTysMTKl9OSoYn5tpY5PUM3evGxeIdSvThCXuSk07XV3ZtarorHt4XDqjRqVKi/eJJq6uk rparu76Hd+PfirrGofAr4ajVdO0/W9Nkl1pJ7G6tVt7VWju02fZWi2tb4icJmNu3zBjyee8H/DPw x8ZNdstN0PxK/g/V9UlaK107XbV7u2VsFiUvbcHKhQRtljVzkc1yV/qU978I/DO7VZZdLtb3VYor HyUCWU5lgaRtwyztIChO7hdoA4JrQ+A17Bo3xx8HX5lWPytZtELkBERHlEZYsTgDDEk56A15+Gwr o4KpUoS5ZRlUats/edk09P63O3EYr22MpU665lKME77q8YptNa/LYzPFfhDU/AWowWur6fLYTX0X 2i0kV0mhvITyJIZUJjljIP3kJxnBweKxjI0jKV+Yj+IHGPauo0Pxpd+B/t2gh7PWdCW8kL6Pfwi4 0+ZkZh5iKCGic9nhZCSQSW4rRttM8F+MrorYXmqeDr2Zvls9RDalpzHHCR3SYmQdt00bYPG6vVp4 2pCF68br+ZJtfNbr5X9Tzp4CnVqcuGlZ7craT+T2f4PyOOt0uHBcO8gUbfnY4Hf86hF0LW3aQ3JU ockrkY/D1xXttt+yN4p1Pw5qWsWWmG60HTrX7Zd3wlVbexTaSVkLMCrEDOOpyMda8Wngh1K2eNoY drfKNrY3H1+uP511ZfmODxLboTUuW17NO1+/YyzLKMVg7RrxcW72v5W2KS67HdKdjTuox/Ecf5NO +2L9kDgS5UkLgE88ZptppK2EUgjYfujnGOBz/jUWnC4aUtOU8kMwxI3+ea9adSjKL5VY8ZQndXZK ZDFEFUAKSSMrg8//AF6gdnjZt2RzkAHsP65rX8+3FuUDRJIRn7w5OOaiXyHgbBlJU4B8wYOe+Mdq 4faGrg+hRe6fzVyFVgPuZHX8O/rmmPPcKwIRWxx9w/n71oyTQyzfNE0yrl96tyg7H8/zprtZJFuc SMTtCDzCct36UlMbg97me1xcJzvkU/7K5OPX/P5VDNNIzo5dsP0BP3c/4+/StT/RIipWOSInOS8g 3A+tK729rEG8gYJJJ84Eg/gM5/Shz7E8j6sxWcyY/fnGOVxnmow4l3MsjHOcA9Dz/nmtdbmOL5o4 1jzyMcjnt7VBcTyOAFSNSq5xgr1PUHFNTuQ4X1TMqVQW2GORlyD07+vPaoZY4kiLujqN3GfX0rZu EmjIZRGDzuG4k4x1PpVTZJuLF4979Rtz/wDqpqV9ROD2M6SFTLgx7QmSRwTn8KiliXGTtIzwMZxV 3ypRIR5i4B3D5cH8D3qCeR2fADNvXrgY9x71aZi4ta2KZPmM37t9yngBc/5zTTbsoBVS2Mgkj9K0 Egnubed4yqrEuWZjyAMD69/1qnGJHR90igKM9OKlVE20nsN05JJ23K81nKuGEMm3vu9/6U2+tpI5 y3lgxqR0GandGDgI+0suGwO3r9aguzJLcMA4HABGOTjirv2E42Ks9mxdiFILkAgg5+tVvs7yOQ+8 dvlXB+mKuzQoiHJdNw6AHn2BNQgoqhizKowPmfuO5qnIjlTZVlt5C33W64GQRx6VWdDC3Q5I44xi rzSW4l2BpDsOcljgZ5xn1qIsJsYj3PjPOeB+NDkJwTKnkHJDB1U85IyTxUTWx2HK/dOOeAKt3CuJ iGC7CudwBOe1QzW7lVZnwBnPy4z7fjVKTsRKNiL7MQ+cKCcgjjj6VFJaDzMNzu6dAKme0YquMMo7 5yaY1jtGNykZJ9iT3pxk9hcumxDJaB4Sfkw3XDDNRiw46R7SCwGfwqQadgMxkjY44PTcfpTBaETE hhluyvjB9P8APpTUiORdhsmlnhiyBvujjjB9ajk0li5JZPm55qVWaGQMDIyk8j2pzXD7huzjBzxT TaBwT6FZ9OlOQrZK9QR2HeoX0qRVXeSVPOQOKvveytGu1Bgn73cfX1NQSXk6r93aTwe+R/ShNi5I sz2tDI2FAcrkYx+efemHSpCoIAUdgev0qTS9Umuri8QROhEpOXUAOPSpJbibA2sARkkYFKMuqFOj FOzRVNtIqhi6hm65GaKkaV41AlkG7sVIGB6Yoq7oztE9BlhsJlUnzyFySSO2evX9McVYSfTFl2oz xZIIcODtx2wOmTWXb2vnwuqsrsVHAPzKeoHsMevWrKaPcXMQ8uEhkGW2suM+/NccZRkrp6HtyhOM nFrVGq9/p8S7jLKm1vmdm3BB7DHH19asNqNp8kaXEiKOu0bmAz9KxH0m4dflYAgD52kQE+47f5zS y6fMiiR7jaT8uwMu4k9cnsPepstrhGo+xtWstkQCsjXeWOcxiPJ67c+v0p8t/YysV3Okb5AYp99s dc56j+QrCFrshSNnWTBzguCE7cj/AApuua9D4f8AD13qdyssttZQNIVhILHsAF/zjqaiaio3ZpGc vhSPov8AY6tWsf2Fvi7LbpJJPAuhqwEhSJ3Nw7Anvt56frX0xo3xp0rx7+0v/wAI/bRwatFLrWit NPDpzGPSpEH8FyrjzS7qd3y4XZhiQwA+FfgJ8dbG2/Yj8Z6ItnrEV/41e2e1l8ljbRRWJPnszr1G 6QAHp64PFU/BXxi074EfFPwV8QtHsb271Lw1qEmq3rT6kRaahHHkRRJHtATJZvnUnJbOARX8951l rr5nmE7Xc1aHn+7gu66pr1P3zK8YqWWYGLdlFpy8rTb6J97n3Rpv7Qfh39nz/goj8RtJ8Ragnh6D xfBZSWWsBii2M9vIzlZJcHywysfnIwGAyQDmveta/wCCm3wq8e/BzxF8P/B/jbQvEE50u/k1KOe9 NzPqUbB98aswCyMzEHC/wAHgV+VHx7+L9z+0d8V5PHWozWLXOuaKlxcwwsBBaySlkEA9Qobbzycc 14h8MtFi8J/HHTrSycSQR6vaCGTILPELiPAUfxEg4xxkCpyvL5vI/qFX3Zwha+9nazJx9Wm85WLW sZSu1ffZp+h/Sp8SPi54e+BHgLwdY63Pp0y6hodkljazqR9rnVo4slc5MSB2LEcqBuBBUGviv41+ PLDV/wBov4HWy+JV8U32oeKbzUZ76GFLdb1mDW6SoYsosQEZjCqSfkBZiSTU37cf7Uvwe/am+JXw 1sJPiM0lp4X0KWeUR2Ujebdm6hX7KVIH73bExKjIIABNfEiftiaX8Pvj98NNXuraS7sPh5JdtcWU UizSPC1/PIqxOgCM4hlUj+6ykE14DwVbF5F9Xinf3mls9Ytfmzoy3ELDZx7aronpfW2/y6I6L9ux LVf20fiKkl3MjJqQjCqQQrCJAwHWvKBZJb3GRfXAk4UEHIVT/d9/au0/av1G8+Ifx08UeMJbSSz0 zxNftd2kxUiBkaNSiLNjZI4Tbu2EgENzXl0+mBiAk8QJXnBLbe/C545r994QUXkmEUXtTgn11UUn 9zR+RcSRnDNMQprXnk/vdzofLuNu6O+kQKM5dlUY98nB9TSytLBGsjzTStKNyhtrcfXjI78dsVg/ YI5kL3d2IjyQDb7t6/7tWEtFnRTHezB2wAxj4Az2/wAPevo1DU8Jy6W/E0YC/kBpJbWNSPlDOOgG TjHftUkdrGiOqz2UyjA+WVtwJ6DBHJ6VRtLGRA6w3Nw8ykBwIiGBJ7HGAOO1E9hc29zbRG0vY55X C7liYqq4Y53dmOOhqJ1Ixi5SdkVShKT5Yq7NQ2Tz25/eoihCWaMlmBB5GCMZ96WLS5pJvJ+027fK Fbltw4z83H4VXFhqTx5P2qAOFHltIDtP+52P+FQTzaokgUPBDE5GXaXaWUDk4JyTVRv0ZLsnqmaE Gmy+fl7lJ2RQ4jClgvtkY9KfBZOIY1RztAJByFC5PU+/tUcMOoLbkPnyXUL5u0jB/DmmRNOqhY9p kXCk5IRsjjke386SdytF0Hyfu2G+Is4Y42yjLEDqB3+p9aj1G7IEKizleSTcFPnKiRnjr3yfzqGc XCxiMxb0dj8qw9cclVPFV9NEi6lcgyygrISkSgKSR37nHajqmCb5ZJf1qi/Daz+WAbG4MsjFcecr b/8AZJqxbW88qMq6f5SEALuYBh7H1/H29apRzSX4Q/vg65zhCMAcZ9O3T+tMeC5kZB5d48UzE4WI YYdiD1z/APXq3clJepsSaJc3ESlbeH73yhZVjO7P5fgeOatHw9O7KssVnGyMFUly2Tk9ccfSuX/s 65hdH82aKMnYTtwRzjGfyp9nFqWmTt5VxdwMpAYpypHrhu+McY/Ki0mrJjU4J+9FnQf8I7ewQyqs tupTIXbyuf6U+38N30qhhLDIjDDMu5Mds/yFZZ1rVoZTCdSuU3rlRGNiHHOfl789frUNx4l1UzEm 5uiQBuU5LEjGMg8enNNKptoDdJbpm1F4Rv5E4bfK77Tk5xzz39P1qXww2p/DbxTputactxJqei3k d1bbJ2tZPMRgQyyD7rcHa+flOD2rGtvGmrGddryyOOG8+1QnHQ8en1qzaeJfEmtzQ2oSOIcopmt0 IUE9CfTHP41nVjNwlGVrNa+hrh5UlNSp3Uk9PXoeK/tAfEvWvhH8ebm21iy0TxDbeaNWtNTaEjUN WtLlGkjlkuSAzSqjFSzL99G6jri/BPxVqfiXxZpyW/jSw1nXNQt/Jg0rV7KWCF5XBZrdJz+7R3K7 Q/RnYDvmub+P3wr1uf4tazLLez3EtxMZMSL90En5FAJAQc4A4A7Vzmk/BvXtRnVFkEbnndg5XHIx j0PT04r5ungKkKa9jNxa66WbW2jvvfW1mfQ1MxVWtL29NSjd6PRpNq+qava2l7o+n/g9oXxO+K1x IW8DfEK38P21ob63W30O8ltRczMBJIu2LH3IwpbofL9q1Nc8GeLvD2t6Tb2nw6+JHiPVriVb+10i TQr2OK+igkRn8zdGoeEtsRwD0kxxkV4x8P8A4SfEXxFobf8AFf8AiDTBHHtW3a8uCpGT8vEgAA5P 4mtvU/h78Wo/hxceD4/ifrt3oms30F5c6Q93ObWSaPKrMwZz8ygnp1wPQY56mLx0YShFwtqndS67 vTf+tTohgMFLlquM+aya96PTZW39D1fxx8Wfhf8ABLxbeaT8RJPHF/4xto/tOu6P4PbTE0fSbuc+ c1nHdOZGZrfzFicICoZWUH5c1q/s5/GbQv2lPGVzaeEfgbDB4f8ADiLf6/4o8T+Nr9bfRog4Mcs8 tvGkUQJAAiVGeYnYmWPHyX4j/ZE8S6TfzWov7SeOIgA7WjGTz0xxX0T+xx4T1rw38HNT8KSXk9hC urLqM0MbM9rqU20qksi5A3xrlUOCFyx4JJrCpQUqC9rWk00tU5RWtukWvkr+pvSqVVXtRoKOr3UW 3bzknr5qx9C/tP8A7W/iX9oALpEc95L4Xs3VnLxfYv7VmAAEpt1ysMQAHlwZLKOXZnJx4vDp1xtl yUVlHzkYz/KunvdN8RaXbz/6FCY1YMskZ3eW3rls/NWKNUu/MUz2shcZYiRtu/vyBXv5RhsLhMOq ODilHy/N+Z4ed18VisR7XGSk5PutEuiRkzxXEz+YY1MZbAbacL69sH8anjhkFopjiDCThv3ag4Ge xPArRfUlmV3lso4hKD8xyvy5zhc/j1pHk86QybUIIJVAiuMY6Hvg969b210eL7DXczFLM7RvCw42 kquAv19qieyuYLgpFbFXznDSAMMnn8P8a1xfeZCTHZpFGSNoLjJI64FKt1FCqJJZMyzNjcZCwweg 9qPaPdIn2KtuZd/aTImXiULwQGG0BemKZ9mkfc0ZEaxckqwAYY/pWnHJaWccg+xwShFyQ4LZX1Xr jFRIbSFgwslYkBDvBJYdcg5AqVUFKkr7lKOH92ytJCrMcFtmST2wf5/jUfmCGNwzsJM/3Qo2/wA6 0rh1eYxwwZUDOAw4HbA/nSyNbyDettfHA3ELGwDE9xzjH+FNyD2fRGRdFftCM0ZVWB43HP5HB6VE FJKqiBjjI3ZArbeC1ezVRYzEMd+FJBb/AA5461HNpsLKFFleLggpGV6Y5zn8+PShVNBex1tcxBAs bHDxcdSAW3Af5+lQMkSq7yNG4bgqCVJ5rbuTbpMIpLU/M2GXeWkAx04HGKpC+SOVgLHy2UbSzuSS fUcY/GrUr9CXC2lzM+XYVjESowCjbGW/AHsKieRpGYsrKehVUAwOmfxrSXVXhQrJal3c5yZSxY+v C8fSoLSR767LLZ+b5a7lUh8b+3XHftVczS1RmqaeiZrfDtLp5/FcUEZuH/4RbUPM5/1SjyWMh+mO nvXISxSkq5f75x1BVeOmK9R+A8U9zq3i5GhKmTwPrZKsnyoRCjYH1I71xD30+1f9GUCSPp5Q2g+v XNc1Or+9kvQ6Z0l7GLfd/p/mYpjcRtvuFY45GACPTAqKaIoz7vNYZwR0GcdvWtS4FzbKDHBHHkcK xGT60s19cRQlfIjGcjLYIY+vHSupT0ucqp+ZgiFpWb908mOB8n3PY5pUs2K4faGwcgDIOO9a0l3L bxBCkbIy4wgB+vPrVN9QdZiihvnHG0AYGPrVczZHItmZwsJBykLFRhRuGMfWkfTrmSTJjlBxg5Yc f41ba8lX5jkFm7Pk4+me1Rz6hP5+GfzCcfMQSB+Aqrt7AoRXUpSaNPcEqy7mHON3Ge5PtTDosgAJ wu3g89DViSaVn3KylSDyvP4c1DKHcDOeeRyAD/WqTdrGTSuRLpbxu2wxDA+9kMBTZbB8kblyDxwP ypSC+D5hVUBz83rUUsu9sJIrMhyCOGxjpVRFooiJpbQIC8kYBJBULjn370w2W5vlAx3Bbj8KaLxo 1Ilzg8dDg1Bd2zazBJFba7Y6LeRqZQJ7ZpvNjVSSwKnC4xjkc1nUqqnFylsvmOhRdWSpxer7k7We 6Pf9wjg85BPaopLCONixZAem48AGuNs9E1HVtLe8sfG/hW8tZXMYMuotZyFtudgWZRzgg9aL74Ke O9Nt45LvR9eubRP3kclo6XUZyMZBRiSMVxLNcOmk5W9dPzOyWU4nl5oxv6a/kdHrd/aaLbiWdpJA OAsUPmMT7gdOK54/ETTotRSD7NqKCY7fNePYoOO+TwKwWs7vw1JJJLDqtreqSB9uspUjXIwTgjB4 7HjNZF7rkTQGMtZ+ajDZJGSoYE8gqT1rapjE481NomhgZKVqsWjq4/HWmW13MtxI6mTLs8fzqGHG 3Pf69K0dM8X6LqcZ8u8SN4gN8cx2Mmexz1/CvMr/AFC0ublh9nhMQ3BcNy3Nb2h+MdHuLnSmv9ET 7NbysLyMIZDPFsIH4hsVyf2hKMW30/E63lkJyS28zsbrxBpNvbrcfareVHYp8jByCO309/eiq0/j 3wLAcQeDZPQkWR5orl/t5/8APv8AFHT/AKuw/wCfi+5noEETXSwS/KEuow5JUbnLAEVJc27R3Wzy 9sinDIDjGRx1PNUPDVtbHQ9PllkK3H2aPzQxzk4/ixx+VUvHvxDtPCtk0NvciTViym2hdTtds+u3 7pGfpXq+1jTpKWysefUhKVWUd3dnQWdusbHYySBicjcGAzx61MDHa4AjhJU4MnGMY9D1Nea/BCx1 y8nujFAyxxztNdCdWcxIzHEanpnOcmvRtc1aw0G0jmu1BhjcGSNZ/LZl3DKqemcZx2z6Vz4fHU6k XK+25dXCSpNLvsOaWAOvzDABARAQceo9fb61jfE34j2nhDwleRyXJbVb62eO0txHvdgw272B6L1G T3rB8KeJNT1zxXc3kE1hDplxcsI4rqUb0iQ/N/u9RznljxwK87+JWp3fiL4n6iyw/aJZbwQwQ25M quqriNFYfe45wO5Nc9XMadSk3Du19xtTwc1NRfXofrb/AMEW/BX7Jf7bnwq0rwf418OWtp8YdG8O z6ffae2oXWm2mtWsHmMJ7dVk8uSUxYM23a5dWbbgZr6Utv8Ag32/Zo+LzQ2/mfEHw7py2zTRw6H4 pF7F0yFImR9igcgZ57mvwK+DXxD1D4W/EvQNd0y+bRtY0DU4tRtrtkLGylicEOydWAIO5MfMMjvX 6k/EH/g6V+IjWccOheGPhrqmqLbrGNZGl3djHg/63fDvyzNhdp3AJhuDnj8ezPh3GUsxWLwVebTd 3B3s7+d0kl0XyP1TLczp18Jy4i0bab2t5pWd7vfToe0eIf8Agg98ENE0zT9L/wCEj+Jupx3TyiG4 fUbWzlS2ikJRGRY9pwzHkckjnpRo3/BDb4EaV8QdD1PS7z4hPPDdpKl1J4gjeRZ4/nU7WT5iCvT8 689/ZZ/4OBfA1m+gP8bfh1pXjGfT7e5e5lsIC0kFxNMHBhSUmMQqgC7S24nnmtP9sT/g4U+D3iWw 04fB/wCEGn6BrMEc0jalqtqsEsTtGyIIRBwCCcszHkDAHNfmeI4W43q0quNpYxxXPb2V2m9bO3Tl e+vTsfYxzDJ4VYU5UlJWvz3jZb2urp3Wmlt+h33/AAUZ/YQ/Zw/ZL/Z4074g22m+PdX1mPV7awgn 1LxXK8dh9pkdmZYwu0hTkqmAp3c1+X3xI8S+G/FHxmjglgWbRp57a2ZGmIcxtMgcMVC/3mGRiu3/ AGmv+Cs/xL/bX+Ccnw/8Ux+DdL8Nz3UEtzPpOlTG9keBg8YR3dtnIJyAOCR3r5U1zw5DP4xaOG41 29tZ33RyNCDcHp94DgkHrwK/RMhyTGcrqZnLlq2aSi24pWWq6J3u3Y+dxuY0qdo4Vc8OZO73flrr Y/cD/gpP+ytZfHX4z/CH4WfDlfB/gLwv4V8L6jfW9tdXa2Gl2SJ5bvIc5BdlH3iMtknOASPzP1K3 gsdTa2DI0cZIBUBBJyRkHqc1N4Q+M/j3TPDT2V5qeo3NrrKXEN3e6vdRXuo6goCDymzucQRkAxkE KjbupNUrXT/tChkazUoMNGQCcHvj2/Ov0HgejiKWB9nVafLKSunpJuTd7dLbNX+4+L40WEWIj9XT 5pJOV91otN9e/wCpYcvbWrCLznZ2Vl2AAEDtu54oLXVyI5DJPEo+XcSGz6gjjH86injliXYl7Esb EIUjiDsnbnGcD9KdJKLS6lT+0p5HDcgQvtYeq8D8s9K+1PjH5lyZRcFAhgDf3pDjzPXk8D8Mmsrx BqP9i6rosczBn1PUVtVMQbcG8tzz83Q4/KpDq1tPOYkub66ePDZt45Dj6ALx/OvLv2iPFC6drPh1 JTqNvcabdfbZEmjKSCIrhXHOc8E+tYYmahD3vI2oe9Oy/A9rhtdULxC2eyRrj5jukkkdgBjhfTH5 VpDRLh7NDcX/AJUijao2BSo9M56/l1r5c8I/EbULnx+bG4F3eRSyicpbyhZ7/ndFD5hPyoTgnHoc 17RZfEjTtZeVo7vz7m1/d3n2W43R2rHs2OeG/iHpSpVHV20HUtBaq/zO9l1KC0KyNq9ojRpyskpD k59+MVFdasLZ1ij1FF3AuY/MB4/vADufesv4K69onib43eHbG+099W0221a0hurVlkI1OPzk8yKP 50L70JH3lBJ6g81s/tf+IPD/AMK/2kPFunaLbjQPDgupZ7PTJlU6ppsG8YilABjjkBYARZYqm3LE 5J4pZlQhjVgm/fcb/K9j0o5bXlgHmCtyqVvO9rkUusQSlY2aOQ3J/diZeSR9D+PPtTdN2Wy3TLLE pkmyCI+hx0Pf8KxrW0lllljgm1K5ljbZJuuE/dkjOMKMgkEGrV1auqhriOaNFJyomyzMB3wOc+te jyq61PPhNuMro37SRbey2RFPm+6hZRx1JOOn+PrUF1qraem2CR0VxuZhtDE8cjJ6dOtYUKfaYUSR ZY5n+8uwhTzwe/OMVK5zGFtxcFumScHHfJA4Of50ezSZPtdNDRXUhAvmPKLmGT5sSTAMD3CgAAfh 2q7DrMcMvm5aSVAcIsJ3BT0G7Jx16nrXP2dl5DSFSuZELNuYnPPbNPmje6VWi/fLkZMTPwR9OtXZ EKo0tjd/t6SQYlgbyFHJYrCAfX3781Fa+KZTMqSGJ4+dm51BwOApxWJJbahC5b7Ja7ZhtR2EjYGc njPPPp0pxub0AxvPCBGcDyrQqW4yQGZsn/8AVT5YkOtJPqbqeJJo49yB5UdsLvlDMPbOOB/hUuje LL4ujS28ZlVi6jklcE/NgcHv+dcuZ7ySdNlsEG370gIIGeoH+NSxaPeWzK6XSW6OfnEabsjsQMdq JUoNNMVPET5k1cg8S6YNd8QzXklsgaRtxAQDb+XQc1LpWiQFjKyKduOAMZHbH6danm0WZ4ld7l54 1bO5Y3Ab1wc559asz6DJAFZGmLyKGKl9gPp2OfrWEoxSUUdlKc+Zza33NTSWGl2iiO1td0ZwxklB K5PYf49Kvf2rbSzwCa2tRHH9/a/zqfUZ6n9axRpDrbRlJZ/KQcIOc+xOBmpIdOghVS6FNvGAcsT6 8Dp9a4ZUKbi/M9aGKmpRa6W7f5GprBtZbqSR443zyX3h2JHAOBj1GahsL+PRUeeGQArljtTOPzOP wqrPpcV3Ap2IWbnbhufVjkde1H9mxkszWttsjGW3x5HtwBzipjhqfJy9DSWMq8/Mi1q3j+eXTSJJ F+cliHwgX0BGTXKXXiS5ksCFjLxMMYBOTzyAR+prnfij8QPEXhQ3UWm+G7XVLcJ8ksE5STZ15jK8 /QV5hefta3c0MsY0TTLd4z5QSR3aTd7qQPyrpw1GnSTSR5uY4mpWkm2e2t4mlQwBngiizgK2AWPb GSeRVjS9aTeXFvHJjgtkjcfT2/KvlLxR8YNW8Q6jZG+lMsUMoe32oIkt3yD8uAMDjnHUV3ej/tQa vqGoz7rLQ7Vgx+eYSmJ8f7Qb5foetdMHFuyOCUmtbn0OtwD5bLZRyhj05yuey8/zqJZ2huj58CK3 RVb5cjHTp14r568a/HPVvFvh+ewGs6DpRuFKyPZlvMdSPubmJ2885HNc34U/aC8VeDljRdQXUrcY AhvAbhGA7I4O5QfUHtTk+XRmXMns/wAD6pST7ROZDbSIGUF1dmVePTj+tTSXgW4AKqNgwIzGcgem fTn8K8f8I/tYeHNfQQ6pp91pl0xJ3ozXNu23q2fvKuPY10Un7QGiSeLtI0Kxnur2XVRuhntHUwkk /KPU5wSc9AOal1I6Nsag2m2d7PdSXKoiO0MWeDGmzB7nf1OPWnQW8FpbKjTXjyHkM0pDIPTJOAao efdXKBlO2RjjDsSQe+McH6Uy+YsiqWVpF+9mLdz+PQfrVWb0uSpfaL/9rQgFYpRGT919qsV5+vX+ dVryYFHDzMxdvm3vg+2MH/8AVVWLTpWcETPHtXnYiopB7gY/yajv9NWyQMZWdsj/AFj5x78DvVJK +jFzSa1RZh1R5EeGOOAlhkkSFSf8n1qsNSS1hlLrbWok4xsaQk5xwSfWm/2fbzqWaaGVUIACkkL7 H/Ch1W2kYIImVhyREQQO3Paq0uQm92TT6zKIfKgncqMbvKhAP4k880/UvENp/wAIzYrbyXcerxTy nUJZpEa2lj48pYo1AZWUbtzMTkkYxVAaoZbltuyQAfOA659MnkkYPrUEt/DFIJHMMYU5UEru/lzU 8qdmNVXFNfI9J/Z0S+m8e+Io5dQhvBfeBtdljWyU4QCyYhXbHEgK5x9K86h8RiDwz9mnsl+1vMJU u2umEioVIMZT7p5wdx57V6L+yTqKXnxc1KFQZEn8I+II+Q2GH9mzHGPX5a+dvAnxUHijWr+3hWOa C0kkKvhVjjt1RXErliDwfl+prjcoxrOnLeyf4s65OToKcdNWu/SJ6TqUNrJpOnXUV3BJc3CSLdWz xOGtWVsKxY/I4dTkBPu4weTWRePDujVQ0sp5bB7+vFVzqsWq2kNylxDLDOA0bfd80dsbsZpJpTCp JQxqTkk8lefXvXoU1Zb3OKrO72tt+GhYkWEksXAA+X9OnrVNY7cHCShpGGNxQ4z6HtUS288qhv4+ Rv2gjPX8KJLKRgS8knTJ2/J81abdTFu7vYWdArALJHEzDkBctisrxYpg0GXypo4Lq4UpbNI+fNcj gDuc/p1q62mxQsqeZHC5+bO4Bn+g61De2dtC0Ms5UywBjGCOAcc/pSm3a0Qp25ryRyvwyfUG0i1s tSNrA8KbIsljI5HZz0yRzx6Vu2YtNZLpDexyeWdvyOCM9x7/AEHSvbP2Bf2IPEn/AAUA+O1h4J8I 3VroitC+oa3rs0Pm22h2MbDzZ5VJXdgsFVcjLOBlRll8b8dfAD/hRP7QvjPw3p2uaXq2l6J4hutJ h1HZ5SXyRXDxieMMzeWsm0NgscZ6nGa8uhiMRStGoubzXbod1XDUJtyg7evcjk0mGSNV3szAnGWI AHaud8eW9zbaPcQ6dAbiWVCC0T4nhJ6OB6A/jzWhr/xEtvB+tXVjqUEkMtrgAJIlwJlJwrDYTw35 gV5Vq/iOfW/EZ1TS7qd725jLXbTIMwhSMRdhgADnqRj0ruxVSpKny0nZsxw+Egp81ZaI9H+Hun6p q/huOS/0/UImijy8rxktJg4JZcfKBx1qbxp45t9E8DX3haODTBdahcRai8ty226URDhEJGAjc7ly N2awfBv7TfxM8XeK7iPSNYtY5BbSCeBYkFtKjYDDaQct6HqOean8L6xqmheDNQ0nX/BXh7xRZX5L veXLSC8gZc7dk8ZyApOdp4OK8ijLG1KDp1YptNWs3f53tqeosPQpVlUptpWd21/lfc4DwncaN4s8 Txpqcdpp2l6jcTSzW8hMNraybPk8tl5Xj146CrQk8deHBZXmjz67pelNGscN1HMVhVN33jgkYGfw r7J/4Juf8EzfD/8AwUK+KsetXWlX3w7+FnhSSzsvFWsT3Ju3vtQujHb2lhp0ToEa5uLhlCo28L5o LA/KrfPf7QHw08P/AAv/AGmPiH4a0K+l1vwfoWv6jpGhzOQRNZQXcqwSsVAQl41UkqAOTgAcDPD4 KvWmoTVr73s7fcy6uKp0oPld305bq/32Me8/a/8AiH4Wxpsus2+s3OnzyJPdTRJdRXK8YAPQhcHD dwa674YfttRanrwPinwr4Ru4IoJW84aeN5m2HywVI6M2AT2615brvhnSE0++eG0eIwRebE0bYX3z USR6P8NtXt0vmub+DUrVTtdFYISevr1/StMRkdFrlmlbq1p5GmGzfEKSnFu66PX8z0u4/bnlbUri a38C+CLYGKNSiQhlQjgknbwT61Pp/wC2zql94m/feFdHtdFDNve0s0lmhUqdrdgxBxkcZGa8xvT4 Tt9XngurPyEZjDK0aMpDLgnn8q0tL0fw1d2rxafrctvEQVK7wRj3J5rl/wBXsvkrOHlu3+p0yz3M ea8Z/KyX6HReLv24PE8epMmmz6PNbLgJNLoqwPLxySmSBz70Vz178F5LiJXstXiuYiejAsVoqf7A wC05F+AnnWZ9z3T9pf4XeGfgF4D8MnwhfeOPE17qt9PbZ1extrFfIjQl2SKJnkLI4ZW3kKhHqePn saHd/GTxDBdWEbwafDKFdXuAwaQ/eVG4+YjqBnGQe9ek+Ov2j4x8KNM0Wxtkkm0aVobeSUbnvYJZ GlkWYjBTJcjg/MBzWJpnxRktLi3SOHS5hp0SxW8sNqsISIgs4jCgFW3nBIHIHWvByqviqGAWHxdR yab1sr2u7eWzWh62bUsJPHutRjZNK613sr/jc7dPDunaTHNo+xba5hkDXs1rKxRVQjK/MeNqnqeS Qe1cd8Tnk8V6DNZaVm8uGVgyhuUTqeejDAzjrxmvRtC8M6n+1H+0lr0XhvS7fRtH1iX7WtsJkFva xRW6mTDADMQ2seB1IHWt7xr+zlZeG/FF4F1qLUtWtrJilja2bWL3D4IlVUf5t6oMncBuUEivJq8U 4fCy+rRVpSSb1b+97Jer9Dz6mGdSrd6pbbHg3w30Nf8AhH1sNQlbTr+M7raQqqg8ZBDHhhznb1PX Ncp4n0qTTPEc2oi4Vro668CEYj3lI1JfIwFGT2x3r6G8G2fh7QL208K3lxb66t61lFaSRxh1gkkf azc5OY1bOQcfL7V4N4iuNNuPEkcNzcvfWK+J703HlsFlaAMq+ZnBxuAzntX1OClGrh+eCd309fLu cdRyhWTk7Lv2s11OUvy39tTyud00s29uhBbB/wD11euby41GCKOUSSMrhySQApx7VVvYrbzbv7PH LM324i1cE4aIBsrj1J2jNbPiKXSodGgksdN+xSOMykyElWI52j069f51pUhblTR2Yed+Zp/iVbe+ mJIWNd5Y8s2MA9KbeJcxp+8hOeuQ/Oai0fR7rxBeRwW0UskznEUMYzIx/kK6Pxd8EPFfg7wpDruo aHrFnolzObSHUZ4D9jlnH3ohMPlEg54Jzn8awnKnGSi2k27a9309dDsp0qsouai2lr8la7+RhaVq Umm3szFo4/MUAsX24Pv+Famia3K2tWsdvcxNOSSoeX5Rwe/pjtTPBOo2cLXSXWl2l7KkYZDLkMjc +nBHFaXwnn0/xBbrY3mn2VvNJK7peKvzRfx4GeOvHPY+1Z1nGMJNx2NKTqOUIxe57t8Iru61r9nG 3vZdY0MLperS2cFlbRj+0Sz5djKzYKw4yyjOCe2afe28EYLTzxJIVLbgcOT+oOc4rrY/Dul3v7JP hh7CxsNPe/8AFGoS3KW0QCSusSxIRuJGQi+vqe9clP4elQMFkuFW2UsSgj2qfTOep/OuzhCrTnhJ yhonOemi1UrPbu0zi4wp1IYyMamrUIa6veKf5Ekb2zeUIbh28oqVG0IFOOmT/KhylzdypcT3e1Dw WO1A34Dn6iq1vpOotIHa5vHjOMLvQBvfg46e9TLpBj3hbW7uG4HLIq59eSc/SvqVJdz5XW2iL1ss VhOEjv2s1x0juD1xySOn419DeIvBfw90f9nb4d67rngf4aazq2uWtvaTahqfhq4u9Rv7i4S5eF2k S4RZGQWxXlRv3gnG0186LpAgmWR7Dyl4JJkifg/xEAnH4VkfGX4y+I/CHw18O6Qtzp+paPfXCajZ xW1xLLeaa9uhhhjcuiiMBZZdqxl1JkJ3ZGK+O4uw08UqNKlNp8zejavZeXrsfXcK1qdF1qtaKaSW 6utWujOB/ad+HVx4d+Omu3mk+G7K20y4ETQWWnw/ZIkhMKyG3WJSxTgHJDknByea9S8A6vpmpeE7 O/0rRrCzivLeM7YIo44yQOY/Xg8EHkViaO1n4ljivry7a81hlRrq5ikljeN8YCHdtJKqAu4DBxwT U2maDBo1zcy6dPe28l4/nzD5Zo3kxy+1hgMRjOPTnNepljdOhCEruyS+aS111OTG4R1K0pwas23b 1e2mh2/hj4q6V8MviZ4f1y+snmGl38F4LW1aITTmNg6gbuByByfavE/28vjrffGf43X3iU6hc33/ AAkWpy6vDcTywyXEJJGEfy/kUqABtOfug11HjKwub3R5YbnxDaabZyRGOYvZRRlwTkgknn0wPWvn a5soriTO5zGWYoAoVcZPOKVbCwlifrMY+9blv1te9u245VK0MIsJK3Lzc3Te1vU+h/gd8TmNhBDq b6Xa25jLtdvOTdancMcmUJ12DkZxyR6Yr0Gy1lnN6pktmUzk73JXI2jHY8fTnrXyH4bvrbQNRmup 4DqFywAR5Jmj8nHGU28+30rvtI/aJ1XwtZweTZWdys+6SNrmWWRohwMEkjPTI+tdtC60lscDi3F2 /rU91i1qOe6I+1QIhGQlqZGDj67Rj86uWdwJ4LjIv5Y1+ZWCndj0weD1rwqX9qXX7mEsbbSYyUC7 wrkgfTOM1nS/tF+JtnlsulZ7kox78dGxXbzprQ5vYyVr2PoK0naK6kWOKblsgrb+YZFxx/n1pbnV gwIRrz5WBxuRdpPoM9OtfO8/7Q/iiGVedGjDAqAtpnB/PiqVt8dPFNtd3Mkd/ZBrzaZA1opRSowN gPC9ecdaOdXI9nLa59HN4ostOnZHjiiY5WMzNv2d8YGeD+HarFn4otr3jzQmxfkVbUqTzzjI6Zr5 tX49+MYTldZjiYnB8uzjGePpVeX48+MnQj/hJb5OcnZGi44x2HSqc4dgVGa+0vuPovxt49k8M+Et Q1KKwudTlt490dssDSGZ842nAyPXd0AryXT/ANsXUNMlsl1PR7zS43tZiEhj8xZZWB8p1ZiG2g4D D615/qnxQ8S+Irb7PeeINXuYZsCQfaWXcue+3GRjPHeus0D4a+DLaxSO41+K+RX81IhOIUVm64zy D0rmq8zfuaGlGjJ9Tlbb9q/xr/wkV/fPdw3Ml7H5aWzI5gtCD/yyTOQfrnNVotR+JNz4e+0wQ+KJ LF53uGnjWY+ZI45yfTA4xwOfWva/Cn9h+EWWXRrXRco2PN3JNICD3JJ5969Mu/j5LrGhwWV1Gy+X IHWSLAGMEdBwfwry8UsTG3s48y667fI97L8tw9Rv21VxfSy3+Z8xWH7WHjnTl+z3U1mzxQ7ZEurH 5mOc7nHB3duMcCu+0D9tGx0+2gt9Q0u/vZ47dJLi5t9iRvMewU8hRxyD+FebftTX63fxqvbuC53G S2tmGwY5MeDk+v8A9euL8MeD9S1i/gFjbXN60zkiKJcl1B5574rNV5pXbtfocNal7OpKMXdRbV/J H2f4R+JWl/EnTpJ9H1Jr02z/AL6NIWDof4s9PcBuhxWjcTXkVrNIIZ1hT52L/PJj2Xr+XNeafs7e HJ/BXhnVZLy1TTr+9mXERP7zYq8Mx9Mnp3rv08WTRRI8kj8ZZA4RDn6bs4xk884r1MK5ypqUlqck 6sHLR/cea+LfH1rH4k1+/s9VMcz21qqb4QoV4cgrtbjDbsHjPFY/iTRPDniywtJ/E1h/ZWpOuTPE p/dPgt83dRgd816jf/Di2+L/AIb8VX+qQaZqUek2EM9k0FzGlzA4kYzBiM5BTYy78gkYBFeX+KvC niXTdBWSzaLxHp1wYryKaSH/AEm1i3ZbegywJVWGRuHXmsPrVKVV078sl9zOv2FSNJTceaL+9f8A DBof7OthpunXz3/2XVrWVo3sb7zdwZTncNqHGc4Gfauv0/8AZ98K6dFAzaVEAuPMEmQJVPTdzzXP +FPF1lofw+8Q6xPL5VveX0eLPBVrcBpSiqORiQsMEccc1r2H7U/hvVdCkupYdT0yOFFYmaESLKfu hE2k5JIPUDpXmYqNdzfLffp6I+ky6GDVNOSS06pd2Z2nfBXQNHsCt5pdhcTmSVwUj5kQsSgz1+UE DPXg9qyJtD0DwZc3v2SzgF1PkbVjDmMEjuTgfhjirHiX4rS6/JJb2kkcEUQBMYwW2sOMkfyFctea n8++Q9ivyr0Hv6V6eFy2bXPVZ5mNzHDwfLRjt1sXr7XJZLoL5AdZIlUiKMAE446CseLTNUh8S6Rr mmxh5dEnaaZFwrRqcc/T+ma5LVfiXqun38sNrBbRQbtqGYF3fHvwPpVnwx8b/FHhOaeWCHSJJ5hg PPaBmj4x8vPcdQeK2rpOk6dLR6fmeO6ylJuf9f0z6X8IeJootJmlN5dz3N5MZriW5UBNzcgRqhwi gcAdfqa2Z/GPlW+UMIY/eIQngHPOf/118oWvxt8SWOpXN0v9ixzXeNyrYLsUg5yB0B98VLc/tE+M 4r4SDV0hiPCHyE2s3XBwDV4apy00qi1RyVqbcm4PQ+ivFPxZh0e2ufMnRZ4EJMexVbcfuqRnJyfT NeY6j+0/qlneRLPpmm2gVd3mRPI+WPTKn19a8n1Lxt58pkuri8ub66fz5XkbBhZhllAHUE8/hWXp s3nXUku6e6WQbW+U4x1yucnj0qoVpc/S3YKlGHs+XW76/wCR7h4N/aBubvxZFBftEthOfmZGKlG5 7DJx7e/tW7rvx70fw3cSQLBdNdrh4x9mYrKM9mJ6Yz0rw3R9am0sbX0xrhS25JWg3/Tnr/MUap4i 1bWI/sh0zfAz5VnUjys9Cp7fSvUnKEqXNHSXoeTSjOFbllrH11RqeDfiXBoHxBv7qWa+l05rppRF E+2RCzEjd22jJyOa9usfHlr4juNNt9LtLnUb3U5kht7MR5mnZyFUQhQQ7FiAF6kkAc189rrb2M72 l/YWrXCoEJSIKXKj+Fu5xX13/wAETf2xPDf7Nf7dPgtNauND8F6B4j1W1stV8V6lAstzoVosu+RL eV8i0W4YLBLOBujjkZg8YDNXm0qlOlGST1+7U76lKVRqVv10/A9b/Yo/Zo+K3jX9r+18E6L4W1PR fGI0XVkn0nWdHliudO32EiqLnfs8jf5sYV5Cqq0qbjzXl9t/wRf/AGj/AIuWviW+8L+Ar+G9tLu7 jv7C5vtP097iazlZbpLfz50N0sLK242/mLuypO7Ar2//AIKt/wDBXjQv+GnviD4f+D3ibWIvDHi7 xVHdePviJ4V1AQ6x4kijKRw2OnuJMpY2tqiRgB1S4lV5CRGyivpb9sb/AIKF/CfTdd00+FfiN8KP hp+zn4UstNtbi08Ja5b+I/HXxZ0+xjimttD+xWz7tK06RnmiliupLfczztIMSOD5VSEZ1vb8zb7d Fb/hztp1nCl7FJJf528z8UPF/wAFvGGjeHtJ8Qa5pXiUaF4hvWsNG1l9NuTZaxKjFZltpivlytG2 0MkZJBOCAasfEPwH8Wv2cvEsWm+JNE8YeCdTlsIr+LTtZsriynktWLBJRDcIGZGKthgMHacHiv2m /wCC4/8Awcb/AA08A6F4Y+Hf7N9r4V8XeLvDMMd9Z+N0tLe50rwXLLbGNf7MTDRPfLDIymVRstxI UUu5kWLz/wD4KRfHv4D/ALZfw8+CPxs8ZeO4viZN4e+FFlpUHw58P6sW8Q6h4kkWR7k63cqN2n2k LGMl95lncybAAuZOuFez97RGLUpaRPyu8A/EXWfGd/aLf3j/AGy2uVRNNtLdmudZL7VjhjRcjez5 BPbIwCSBXsF5qiX/AMUpPAd34C+J/gvx1Lciy/4R3+y3vr8TuARD9ldFnDlSCF27sEYHNdx/wb8/ tVeCv2Jf+CiFl4h+LaeHbbQmsLqIaze6VLql34fuvKbypIFjYlC7EIzpG77TtBQM7V+jH/BND4/6 b8R/+Cm2u6t8Hfh1qWuxSwaj4t+Jnxb8R2H2vxL4jSPzGFho1khljsLa4nMKJF/rniJUkPClJVfZ VXUjJ3duv9fibcidPllDRdbP+kfkp4q/Zql8XeLdW0eHUp5fEnhiYxXmjapBPpOqaVIp2tHNFKoK MG4KnBB9K9A/ZR/4JUfHT9rnWtbXwauk+C/DvhaGKXWPEfjHWTbeH9PV2ykZn8uQljzlUDMARu2g rna/bC/aJ+L3wy+I3izx38R/g3qXg2f4j69daxFLq8U1rdSrLclmVfMQCYIo8oEcLsUcYxX2N+0/ +1d+zfD+wb8FXi+J/gnxf4V0bw7F4gt/hMmp5vPEHi2VvOmk8ReWX8mytjwLdxunbCAqignT+18V LmjUirdGt/XSwVsrwkIwlSlLm6p3t6a7nR/Hfx/o3/BAH/gk0ujTzaNJ8fv2gb+e5tzoN8l9a2dl DlILuO42KWtYUkSeH+Jri5GNyJIB+efxl/4JyftFfDX9nq++KWq/DuaLwdoulW+oarLJqFlFeWFp csFimmsWlF6qsxBDGEKRkg4BNfbHwq/4Lm/svftS/t5fs+/Ev4teFtffx9pGh2XhLVNT123trfwt 4TuI/tLtqlukcjM/nXE0YBkSJbZC0h3GNQPSrD9rr4S/tN/tYGH47/Er4D+G/hr4ivbnUvC/wfs/ G0Or6LfavEfPXV/Fut2RmsnBVdsdrJNJCSbeJUAgYyOhmFaCai99/kcdTCUZNcyWnytfe1j8lP2r f+CevxP/AGUv2fvg98W/E9lY2WifGTT3vNEa1kdpLLCqyR3SyRr5UssLrJHtZwUOcgggW5P+CRn7 UGs/sqX3xyvfhdrdp8MdNsW1O41LUL20sJWs0IBnFtLMt08ZHKuIiGUhhlea/WzVP+CnH7H9l8Tf gv8ACX4navofxs1/TfF2o+KPEPjB5ZJ/AehazqCXEsbrJKGkure3le3tYwV8iGD947boQq/KX7VP xB+Evwm+K2qfFz9pL492n7YXxZ1XM1p8N/hzrMreAbO2MzSwW95qJG17JXhtpPsUEaussKeYsqsX MVMTUk+Zvc3p01FKMen5H5xHwv4y+GulaH8S7bwr4h0Xwb4nnl0/S9b1DTJl0u+kjO2eKKfaI5TG ynIRiQVIOCK6tv2UPiQPiBo2nab4Y8ZaYPHC2934dk1Owl09daeeQLFLbCUKJYXYlFkXIORyea/X T/gr3/wVb/Z6+Jn7OHwI8USeJvCPxbt9B0yDX/D3ws0YCGxg8QiMr9o12FDm1sbJWMcVgWMk5lZS TErufRP2n/8AgqB+zJ8V/wBuv9l7xlr/AMQW+JOjaDp+kf2ONMsnt9H8JXtxcxSXWr6xOHjEcyiG 2VbJVPkGF5JxtKxGFWt8R0wnOXur10ML9uO50z/gjz+x14N8DaXLbx+LdHs5bPwrZ2qBLrxP4ru7 b7LqviiWLDuY7OKU2lmrE/vJG+8sUTV+Zv7W/wDwS5+L37Ev7Kvg74ufEaw0zQtG8Z6n/ZcOkvPI +r6TOYXnjW8h8vZC0kMbOqby4A+dEORX6K/8FLv+C8Xwt/Zv1bw/qHgzwH8GfjR+0Vbz6nMnj77d D4gh8JW4vbkaaIb1If3zGCUy/ZYplitnbGZGO6uN/wCChv7T/wAAfi3+yX8Gdb8ffHTT/in8PvDu j2uvN8M/C9+g8WeOPGFykj3t7rkwIOmwBpZUIVd6rLIIiCyKOmhiXBJW9Tz6lNyd7n58fs7/APBM n4+ftr+CE1z4Z/Dm58QaVe3ElrZ3N3qVlpMOoyopaWK1N3PD9pdFViyw7yuDkCvHb/XYdCs5bbXN NIudNY2ktvNEDJHIhKsh9CGBB96/aH9sn9vv4Z/EPw34fsPhP8WPhP8As4fA6y8PWttq3iLwvqdn e+OvENjcR+dNo+k6HaM02kYnnZZmmS3YyRq5YxQgSfjT+1d8c/BHxT+KcafDTwLZ/D/4f+HbBdH0 awncXWpX0UbyOb7UJs4mvZXlZmK4RFEcSZWJWO0cWnJua0HGnJLTpuVPD+raR4hvFvXshYzS73YM d29iACw/vAjFTXfhnR9EtZ5bfTpNRiu+Jo0+YR44DH0Iz0rzDRdau/C9xHNAXhddwbzBlSD04Pri jV/Fd1PMzLJNbzSsHl8uU7WcHIasHUptNtanX7Wysj0rYfhm0dxpdp9pju4gskxmCxbuu0ZJ5H+N Feaaz46vdc01IbnynSGUuoX5Bkjk49TiisrUuxbrvsfXnwi/ZaHijwpoept4I1rUdC1t5DbXLxOL a8aFGaTy5+nyhWDITnjKjIqt4L/Y88U6j8OY/GeleHNWGhtcNDJqFzG0cETDLRnzWXywjIGwc/MU bANfqd+07/wTG8L/APBOP9jTUvCfi39pPXdW0nRLGXxDD4YWxWxt5rhdqpNGY5GnB811YIpKu+Nw 2lq8T+I3xGfxH+wj8Hx4O8ULqei3Glyx+KfDU9tFCuk3FpPKlte3LjEal0faiDIYAkZwa/HKuMx0 pYhzS5YSSTTuld6KWt79Ha9nbvZfqKy7BVMLCtG7lZbK19NXqlpo7PZ7XPMP2FPCFp8If2mba707 VPDniSx0G6azTXYYjNompusqSOYi4G5ctt2SIAwB45FbH7YPwXHiP9o3xb448KXkGmav4VtWfxVb 3kYsIdHAZUaQK4wIZHuPJDdG4KntXuP/AATx+HWj+JtC0LxjFfaD4q8HJfyahqUccscVtb20cpjK yR8Pl+SqD5mUDAzgV7n/AMFOfjX+z3+zv4JufE/2Xwn8cPFL2DWmmaR4mkxbS/aZN7bPJjEjLGg4 DtiFUGPnOa8fBZDmNfMvr8pfuk5U+TRtuXLq01drT8NNLnj42lShT5o3Vle/TS3Xa/qfil8cPit4 cg+xWvgdZDJHbvLqz6vp8Fo6XDqqPZRCNikluhTckmQx3nIGOfAB4fv4L1FS5TdFGF88lcEf3R7+ prs9f1wavcXMcUMUonleZIXG6KyhLHYpz8xIHAzliAMnvXOJHZWlvdtd21uz2cpQlYgDJn7oUe+e ntX7xlmVxw9JJbvV6/1sfm+LzCdWptp06lTTfD8sdoxmvVtzFLu8tpQgnHcqc9f8K1vGOm/2dY2s 6B7nTtxEV0IyiSsF+4c9x69CeRU+jW9zYxid7a2YuSz2scQDQL22N3Ydx3roNA1NdevNWt/PE9je QxRlHOYSHQ9R1VgR1HIIrbEYJTjdPVHVgMZaVpbM+wbD/glholl+x94L+JVnqPxEudW1iGynmtId BXbJLcnAePLCTajYwSMMoyMZBr6B/wCGbvAnin9joaFY+EPGHjIWxuAdRk0p45rmcNtldbZ59scg ZW6jKngnrn1r9k/9vH4e/Fr9kzw/8P8ASLGe98d6H4bhtn0O6uFs/tE0StbxxJcnh2LKJcoDiI7i AeK8y/4J5/D68/YY+HU3w++O8uqWmu/EnXZZNAn0rxW486CKLzbm3cEgQrIV+WUNlmkI61/JWLx2 NrTnRzTFOlXo1nOMWpc7hq7JRs5KKTd1pbrY/pnLZYWnFSw2H56VSHKmmuW+i1v1d116dz8hbK2W 21i/WP7QqxeZAvnptlZVdlAcDo+AMjsQau/CG0FzdYzu2rKRkY3fKOMetLquo2d74+8TG2tZLSyk v7qSC3kcO9shlk2q7DglVwCRwSM1d+A19HaeJYJAqkoZeScj7nBNf0VXm/q8peX6H4th4x+sRi31 f5n1/wCGPBmreKf2I/CM+lW8V29rr2oPNGYneRkclQUVRyF2ksSRgY61ieHfg3rfivw5Nquni6ub W1KKxt9PaTzHYlcQrgmTGMv/AHRg96+o/wDgl98VfDfwv+EWip4o8OXfiKxu4by7tmiHmRQPHeSL JDLHgktMrpsAzkBgcDmvWPE/7X3wN/Zv/Y9i8MS/CrxU+q61f+Ze3F1dwm4023AaVRE8ZVFYMMeW cBgGJLcAfPcL5rXp4epQo8t1Oo9XZv8AeO6Xn5HqcU5VCvjI1pt8vJBX03UV5rRddz5s/YB/YTvP 2wv2lrP4f6pq+qaHaXunXN0LttLEJtTGhPmYfG9Q2A2DwCT1r51+KOqaF8KvFmq2d14o0HUxourX Wk4s9SW4lmaByhmESAny26qc4bp2ry79or9tLx18fNf1kXHiTU7PwxfzZtdHs5zb20UCbliRgm1n O0ktk4LMSR0x5BY+VG6gqFUDoBjA9MV+h4apWa56ujfRbf8ADnwFWnS5lGD0/r1P0E/4JZ+BPDX7 bn7Z2heBL83dn4SmL3Ws3zjyVEQG2KDI+ZWmmeNQcjjd9Rzf/BUP9n+1/ZV/az1P4Z23jex8aT+H NJthPcwRJAlrLKrObZUDEBkXYTg/xc816D/wRz/4KS2n/BObwdNqem+EdD8T6h4z1jytWmujELm0 sbOJ/KMMm5WiUyytvLgrxlRxVj/grF/wW8k/bO8c6Xa+HfClh4U8Lw6SkepWT29ld3N9qBLFrhLh ELqighACQSBkjmvkMxqzqZgqlKXNKKtbVJK9ndtNX06eR9hhsHGlhIxm1GEtW7pu+603t03aMub/ AIJ2Q+LP+CXWnfFjwD4i1fxR8RdZ1OJE0PRFW4ksLSKJ2uUnCAlGRVZyXK4IAUHv8DeJ9U1tLqSG 71XUJGjIBVpWXP4A1+nX7Bn/AAXq+Iv7O/wI+Hnw28P6B4ZksdK19La7kMKfab+zlBQhowATIGfK uuSWUZBHFfEfxg+D9tqHxZ8ST3eppPHLql08bwMHBQzMVBICqxwRkgYJzxXVw7PEKcqNablJtuzW qV7JJrRrtt5mGc4Wl7KNWjZLbR79btWVn82eAXKeZIpnkaUgnHmsX/LJp8lz+4iVXRmVcEDsc17R p/gHwxo8wf7O1zIv3g52qw91H+NeQav4Pa/1i7MFx9kMNw6MM5VVz8vA+71wM9a+y9lKysj5Oo1F 3bKxG5FYESM3GAP89as6gUitbIuwlAjI+9hlOfyp1j8OLyRGM2prszhWT73rz/jV610KK2a205Ly M3JbyxKYQ5mZmACkk4UgkDnjFKVKcdZK3zRFOsp6Rf4eZlrcLtVVYnIAOe9MNyhYMrxlj23EAV6j 4n+Anin4c+JI9A1CzspNXvLeWaCC2vLG4kkEeGYfJIyq2OQpIZucA1W8BeBdc+IllDJpd9oFnJOp lMWoXtpbMkSybGYqxBB3AgKQCcE9Oa4HmOHcFUjOLT6qV9O+noewsqxPP7KUJJ9uXrppb5o85MyK 6kujY7huCPSnxo0ijar+w5wBjNez/wDCrdS1K9mvYPE3ge0i8xogj6vaqquo2sMYPcE5A78Gr0Hw Qv5NIvI5vH/gWNLhUCSjVDi3IYMeViIORx171FTM6EN6kfv/AMkaUsjxU3pSl/4Db82eFOX8td6y BWPG5SDVRtUCW7NIBFtJ+VvvMB6D1r2D4nfALVdC8MHU18X6Z4ljKO8i6XdSSPFGuN7/ADxqCBkc LzgE9q841jwkur+H1kZrk/ZZRIrOwJ2sApwPqFNdeErwxVP2lCSavbR9e2qR52YYaphKqp1otO19 bbPro3+Zjx6zCWMoK/ul8wBTkgDtgfrWk+qrL4fi1GRID5p8uaIgbo2HG76H17Hisu70uPw5dwNa wSzTTZTzGHBzwVA7k55rFk1F4X8pAQ+7aVfoSCeo61VWUoWtuc9KUY6vZ7Gk2oIbprlIWMEsnJLA 7R0x8orUtdSjX95DLdW+x/LiImZMeuOePpXNLqn+lKjKXw2Nq8McdMH61t+EdVstUt4be4h2yhnM 14xZvvHC5AOTzn6ZzUU5uTsXKpbVMl1XUxeM9zczSz3MYEe+4YSMdv3c+orrPh18V7r4faj5lxYW N1BKFWZPL5j55dcd8fnXF6FBa22rvNPZwy2kc4jZFfeY0JIJCtww9CTxXpD/AAx0/WEWaHUXEUsY KbY9qlexwD6VtTwyq+/bVff6ilVa06M9y0/XNB1CxGow6vpEsF0gKPFE0nbkdOD6jtU8XiLSNO3y rLIwCEsy2xBU+h4ySe2K8G8Dmz8A+PotNtfFVraXFwwE0FxbSG1kOMhXI+6xHQjp3r6es/gf4q16 203VNF0631fSrsIxl0/UI7xEXcNxUEKWAGSR16iscbmWHwsbV5WvfXpddLm+DyfFYlt4aCdrbb69 bXODsfhfN8R/DHiHXtMGseFr3TLAzG7jhYRaupmaOSJ0UYVkUKxYZ4bkcZrjvir8Z7/w3pNlDq+g XWnarbqDDqGkzeVazxrlQUI4XIZvmQ4J6jtX37on/BLn44+Ivg34o8b/AAgjXx54fn+22V3octyo FxHGuBcWBJB8xgSTATuBAUFs1+b3xp+I2m+MobrRm+12+laBLBZ6bZXBkhvo0QSGcPuG3zPMbDA4 J2KAOtfG5Tmyxzc6XvU3qrpp/ildX+XY+xx2XfU4csmlOOjSaav572ON+MXjTXPiVr934wnu7u4t tVP2cyLB5cMCgcQZUKhYKoyQBk5PFcJaao9nHIiKAlwPnBOFZc5BXuDkdRXQaKt7L4+htNBtL+6d 7porawmQzB3IIVHRgAzEZzkA8V1PjTxno/iL4KWNkfB+naNdaRqYga/t+bm5GxyY95Jxhzll2kcD B7V9NTqOCUUtPkrL0Pl5R9teTlZq76u78mcTZeN7uxtrmC2Kwxzt94cyDjsx+n5k1HceLNUuLdVF 5OUXPQDJz2J9K6bX/wBmzxJp/ghfFGn2lzqnhp7lLEXiwskiztGHVXi+ZgG+YI/3W29QeK5Kx0G5 ljE0imBAxQM6lcMOMfXtXVSxTqpqnK6Wjt0OOvha1J8tePLfVX6+a7kd/dy3Vv5cvnMMZG44Ib19 zVZNWubFSsbyMirgK6g81uS6ZJOwhkzNK7KheRcqM8DBqSBZLHVDbEGGSKFphiMbMLzj/wCvW7hb Vuxyu83aOvzOttdV0LRvBdnfTaUlzcrGpkHkkB3xzk84yf5157q96s2oy3Mdo9tA5JMWSQuT6Hpj sR6V738Yv2Z/Fvwo+Hlj4k0yVNe8MX1rDeSz2w23Vi0qK22aIg/Jk4DrlTjJxXzvqYCXkpDyySN9 4OpVlPVgc88Gs3jqGIinh5KSWj02fn1OnEYDFYa8MTBxe6v1XddCZ9UZbPy3eCYS8/NHl1UdOeq5 rp/DWu6r47c6NptrCiG2Z2gtEWPbGgLO+4nOAAScH1rhDLgnBPPUY4Ndp4e163Pi631a1srXTLe2 n3SW0SPIihlA2liclGJOQTxn0qacpt8sXqzCPJpKeyevf1NHTze6bfnTy5iSzUL5Zbd154P+etVr /wAXRxsyGWNXRtuGyCCK6G3vtOs7lVjMaTxoY1DNufAGcA85BGf1rh59Ztro+bLbTzT7g0recqhv nJIHGRlcD2IzXqSlVoq0pKSe3kcnLRru8IuL636ll729u5mnEa3UcysIzEpOePmJ+mM/nVeDS312 ye4j0y5uo45Y7c3axu0McjZ2xlgMBmwdqnk4ptp4gOnKNqOYvLVfLVywLdSw9M/lXsnwC/bKh+DX 7NPjL4b3XhGLWoPFfi3QvFIuzMImtTp0sjNAAVP+tSRl3KQRk5B6V5eL57J01zO60ellfV/JHTQd rxk9Nfy0/E4nxJ8NorXwBaXFwDpOqWlzPY3MU0BjKmNs7ZFIDKwBA554rzfVIfsk/l+ajkfewCAD 6GvrT9u/9p/wB+1R8X9e8deCdCvfBi+MtXl1W40O6u1u0053CK6lwqgl3UuNo4VgDzXyz41gEGuS YaOQOuWZDlWPc5rnw9Kp7PmqaO781v0fY7syVFTjGk0/dTbXdpb+fcr+H2lurg2ltbWtxNdKY1M6 7ip6nZngH9a6HQvC2u6pbwO1yy2csKxq0kzENGmQqlR1CnIwenNYngWaGy8U2txMwWO3JkyeMMBx +tekX3jW2e6Lm8hMRjBCjruOcmu7DUFUacmedKfKdF+zd+yPf/tDfE228Pf2rbabp9vFNqetapLA 8lroemWyNLd3swXkrHEpIUEF3KIvzOoP6m/t+fH7wV/wSk/4JfeBfgT4U8MXXgzxH8Z0HibV9KDx jXLLRlKiD+1ZciQ3d26hnQDyoxHNAihIxu+Dv+Cav/BTXQv+CfHxb8ReINW+G2jfFPTPEGlR6a+n X149kUaK6gvInWQJINgntoi8bIRIEAJAznwj9qf9q3xl+2x+0X4p+J3j3U4tS8T+J7s3EwSLbDbI FCxwRJklIo0VUUZJwoyWbJOtWjBy5enqRHESjqunkbPxs/apl+LXwp07wfLc60NO0m4a6061u74z WlgXYNN5UeSqGQhSxUDcVGc4FeGau6G8/djZFwVA4B49K359UWGBG+yjdg8Kf8msLW5/t9wspQq2 0A8YzWNWnGMbQNpV3Vleb1GaGUkvdsgUxuCGLDnHoPrVm7tEsHR4FMm4cnqF56VU0i5aymZgmSy4 y3Reaveb9pA4VRjBxgZ+tFOC5ddzGSfNdEa324ECInuDnGDV5L9JbdoirKGXBDHIz7e9UVVd2A21 hyMjrSMhySW2n1xwTUSp3RrCo47GbNH5chBOcdyK9v8AAPjy7+GXwr8PmzNv5U7zXl4R+8cpvxtY fwjAGDwa8buLEl8ljubsev1qW2ZrUlVkfawwcHAx7j0+tYzwym0qiTS6P0sdeFxc8PJypu0mrXXT VM9J1eWw+Knjyc6QtvZm9HmxQT223BA+Ykj7vQn3zWdr3wh17SiG/sqaaMqWZ7ZllwOxx1rktK1q 80m/ju7SeS3u4c+XIhw654OPbHFdjo/7R3i3SXUtdW18EUDFzAr8Z9Rg1ova04pU0rLTW5rGphq0 pPEXUm27q1tfI4yXSr2G5AuYblVQkMrQkMvpgEVSkDRuwEUobdkHyyOPWvZrb9sfW7eNCmjaQLgY 3SAM6sA2futx+tZHjL9pHV/F+jyxSiOCWRwyeTbxxYwem4DOKxjUxU58soJR782v3W/U0qYbAQg5 U60pS7ctvldtfkeaSz7yA0ryKEySRgjPaqzDcvmFSVfhea1WW21ECScKsjv847fnWfrOnJa3IKZC MvGO5rpqQduboeRHsMWBElCkOfkzjABH50VUYljksT7nmiseYvlPtX4Pa3N+2f8AG3wxoHi27vro axrlhpt3q2seK5DfxWrukSwRSTkjaO2RgHGTivb/APgsz8K/Cv7Lfww8HfDHwJBdjR4dfvJ9Vvjq c94lxdwIEERfCozBXEnTcPMGNq4zwH7Iv7EFvqX7c2h3XxQtdW8IfC1NdnvJdS0S4tppdPjSR5LX bGWkkMWVjVgFaQI3QkGvpD/guppJ/au8S/C+7+Eb22tW2jWWspq8EKfYIrWWe9SSEkTiPzHeFFy6 gn5QGI4FflWOwzea4SdGVqS55SXNdcyVlfXe70ufUvxCyB5dVhUxlN1HaN1ON7b91pp+O+x8zf8A BNn/AIKHXf7HXxQ0aa+hvPEXhqbw/feHZNFg1LyligunZzOFwUSWMl2XjOXyW5rz39q742R/G/4o apqunW91ouhmOOy0jT5rg3E1hZxRLFGskvR5Sq5Z8ck+1QeGP2K/iFomkPJ/wjAGo3DMGLX9qfKT PABEnVuT7DA9aluf2PviW+3b4bznk51C1H/tWvvspo5fRqPFTqLmd1utE9X138z4XNOPstq0lhli qbSt9tfJb7K/3nkyCO0tfLiRVRPzPuT3NUZNJik10XZJIAXCY43jjd+Ar1o/sXfE0E48NAA55/tG 0/8AjtP/AOGMfiZyD4a6gYB1G1xn/v7X0bzTBL/l6vvX+Z4EOJcp/wCgmn/4Gv8AM85tZfs5Ukn1 AHPJ/wA96vabpsFrfXM0Kqkt0QZf7rEdGA9a7y0/Y2+Jkb/N4cwAef8AiY2pz/5Fq+n7IfxGQg/8 I6cjub+1P/tSs5ZphG/4i+9f5nRS4oydL/eaf/gcf8yH4H/FG4+Hfi231G3FjPcQxywILqEPH+9Q oW9RglWBBByor1j4W/s//Hv9pn4c/D/xBpN94Ve0+Gl3qFvb3evavF9r1WRZj5zTCcMXg8vbEisd oQHHU15xZfsnfEO2uFY+H3I/6/7Xj3/1lddq3w6+Nnh/4dvp3hy3MJdZLae0kuLRlmgmUrIEZn+V uSeo68dK+G4rwNHFKOJy+VL290nKeq5bSTWj3tJ+Wup95wv4lZJh28PjsclSs2lGcU+a8Wnq9NYr Y+Qbe68rxBrKusMTtJKpjhI8tf3jZVcfwg9McYArT+FGo2+m3SySSLGd0g3kgY+X0rtrD/gn78U4 XZj4aMeedo1K0OR6f62n6R+wR8U7SaJn8MMrH/Wf8TKzYcHgf630r0atbDShyc6+9f5nl0uNcmjU 5/rVPS/24/5n1B8Fvj6+jfsqfByfQNbtv7Z8O+I9VtdT0v7YloL+KWRZVimdj/qzgHOM5wBjFeVf t7/tjeJPiX8RtU8LRWOneFPD9lbw2N3o9hFKWu5l/eObiScebI+WHouAuB1J5z4b/sQeOtKm1FNV 8HrIkyJJbOdUtlaKSN94UMrsyh+7AZ4HarXxQ/Zw+MPxY8QXep3nhDyr6/bN3ey65Dd3l4wAXzJJ ZJySxAGTn07DFfMZVk+CwuPlX5uZXk020knKXNtfVptpO113se3mniJkmLwsW8bSjKyVlNNtJW+V 9HufPs115rHPB3cYUCn6chur+1hXGZp4kxx3cD+teq/8MJ/FIgH/AIRXO311O0yf/ItX/C/7D/xP tPFWlT3fhdUtoL2CWZv7QtDtVZFZmwJSTwDwOa+6lmOG5H+8X3r/ADPk6PFWSuolLFUrXX24/wCZ 6N+3FoPh/wCHsnhi3tfDulW9pcRXO6OO3ZY/NXaoYhMZfB7np2rQ/Yo/4Jvah+2D8KfG/iuyjGpD wtoj6kVhuhF9nlEuzymUj532pI2xcn7mSN3HZfte/B7xT8WNM0aDRNMF4bK7nmlH2mKMKHjCrjew 9DXpv7K+t/ED4J/s5aZ4UtdS1DwlNFHd29/a2Fwg+3o88kimRlJGSHxweB1xmvy/PM1xeGyqm8Fd 1HOztdtLV3aSbs2kvmfqeU8Q8J43OascRj8PGCjeLlUiot+6rfEtbXt5nyp+x94d8Rv+2t4P8N+H NLsdZ8QWWvKsH260SSMi2LSyOy3BT5VjR3KsQWC4AJIyut/D7xPrV7fXoscx3txJchjJGnmB3Zgc FsAHOcdga+gtO+Feo2f/AAVJvfiO+nrP4Kl8QzXq3ryR4eF7J4lcx58zAdgCNm7jODXgV5+xl480 bRNashpdnq9zHawR2FzBdxLE8glXzCnmMjDKbvvqOOnNe/gc4rwnCrBxjKUIN3V7PW6votHufPV+ I+FnGdKpjabjGUuW1WKutLddU1sZEnwz8QRSIWgtYwWAG67hAJ6cfP3rlJP2cPEuj6lqq3F1osFx c3SzmK6u4VaHAIZGQt1IYc9ttbNp+xt8Vo9RtXbw0uyOaN2Jv7PgB1Jx+99BW38b/wBlL4m+OPjH 4k1iw8NmSx1O8MsDtqFqhddqjODLkdD717bzvFza5qsfuX+Z5UuIeEOXmWJhvt7WP+Z478RvC9x4 W0s3i6vpEkltP9nmtbe5Bkds8GNFyCo5BJ44+meAuNbnvLqQzlpxL98RKF3HpmvfdU/Y1+K+o+C/ 7IbwcDKL43ZuhqllvZDEE8oZlyACN3Xv0rnLT/gnv8VYbgSP4XYoQdyrqlmG6HbyJfXBNehSzSMo /vqib9UePieJ8gjNewxVO1v54/5nk8OrCNo7mFlSa3Cugz8sbKflJB9MA9SM+1WY/iJqkjxtvjcR XhvtpRWXz+AXzjdk4HfHtXok3/BPf4vtHgeFI256nU7PJ/8AItSL/wAE9fi1DKGXwqXxjbnVLMZ+ v731pvF4R7zi/miI8aZWndYyn/4HH/M779lr9urxF4X+LGqa9NeaNb63faUumDUdS04TytbxMGCy eWoV5eFXeUDEKMmu98Z/tUX3xGsdR03V/GGnXtlrSrGbS20CZjCVlEu6Mggl2bqcdOMV5NoH7E/x UsNB1KyuPBitNezwzQzjVLMmDYzFwMzZG4Njj05q34Q/ZB+LfhHxjp2qR+EHmGnXAnCf2tZpvxnj Pm8Zr5rF5Xl9XEe3i4ppJLbptbsfV4PxLymnRVKpjqb1u/fXV631Kt18PNX0zXbm70fTdUu7nURD rWka8uY7FbKVihS4Rs7QZFdSucnGDxXnXiPSdf8ACty1rPDpkKysXCRoWQc52rk8KM8D0xzX3Fp/ w28e6T+xTpvhfR2g0jxZbWMUU1vMYZRJsuHdofMyyqWVgQ6njGO5I479sH4C+Kv2ifGOi6lofg5f DtvpVg1tLD9utCbmVnDFxtYDA55POPyr38tzajTkqU2ktrppbWtdab6ni5zxFkE6bq0sfTb0dueL 3eqWvS2p8hxTX1pnybu3ikUA/wCoDEfn0Oe/XisZms7Lz3vbdp5533iThG/Pt+HvX0Yv/BOz4gap aurXekWzsBzNcc/T5FPSodB/4J7+M9M8Rz2OtaVa6vZLbkw6jZXUITzCpIXbKwkxkBc7RycjI5r0 6ub4Kd4RqL5v8rnz8eJspguaWJp/KcX+TPmLVZrZtQR7GCa3tyfk3Sl8nuQcetRHWJYLmOWKSSJ0 BAbuOx59+fzr2q9/YC+Ldzp8aHwopmjOM/2rZ5x6f63FUj/wTy+Lp/5lNf8Awa2f/wAdrmWPw0dF UX3r/M3/ANZ8m/6Cqf8A4HH/ADPNPD9rM2CUa4t5iGlUuUMgGcKGHOQf5CvZfB0un+MtD0TTrBbf wYwnkjvfst3vlu12EiQrNk7sgZwQMHAHFaOhfsNfE/StIhjPhYrKi/MF1KzyWPU583rVg/sVfFMO jr4bkRoyCuzU7TOR0OTL/nNZSxuHc4y9qlbzX5X1PRw/FeR06bTxdJ3/AL8fzvdfIxtd+Beiaj/x NbHxbqEniQiOWL7WqLEzA7drSKPlJHQ9Kr6nH42+HGi2gu/EPiC20mQtHE1lrDtZRtxmP5CFRufu kDr3rsLX9kX4qfYZc+GXSQ5wr6lZncRjHSXGKsWf7M3xmstJezi0Aw22pjZqMC6hZNHIF+ZZApkx uDAYPXk10V8XhYx92rGSeutr/wDAMqHGeRSm28VCDX8s1Z/jqdr8Gv2wvGFp8EJfh5onxO8ZaDo/ mG9l0vT9Qktx5uNrSq6OGPHXBAPGRTvC/wCxM37aGk+N/EV940vW8WaFHbLDfX0SsdVlfIX7Sy85 VI8CTBYscsTivPI/2Q/irbRFofDMyTgYRk1GyUjPXJ83vXpvwI8M/Fz4Pw68s3gW8nn1a2jihuLT XLNDbvHIGGUaXa6sNw55U8jgkV89jORYOU8DOMa11Z3W102tdk0fT4PxC4eq4iFHMMXB0rO/vrtZ bPe9jkvDn7Cur6R8MfGNl4qtLKTVns3vdLvbG+eWcXEYdj5ozhtwyPXDGvjiJPm+6eRxxmv0h8Re Mfi9N4ie50v4Z3X2A6g832W816xJezdCr2+5XypBIZWH3eRzXyje/wDBP34uTX8zQ+FFjildiA2q WZ2qTkDJl7DvXTlWPnyP63KKb7Nf5s8zPuKeFuaCwGMptK6fvq/rfQ+kv+CPH7G1/wDtDfBT4q6z Jd6hbxNFFoGlXFvLJv0+52mdp1QMAwUiIFfRzX0pr/8AwSm039ob4cwTeI7fT9C+I8ZMU2seH7Vk sbsKoCG5t2O1n4O90wSckE18+fsi/G79qr9ij4LJ4J8EeBPBdvaNfTahLfXv2S5u5pZdoO4m4CkK EUD5eAK0/G37X37dnjW6jlGo2ui+RKZ0/s2PSYNrYIxncSRg9CTXwOZ4TiCrmNTEYHEU6ceb3W5a 2SS1STuna7Wx95lPibwHQyuGDx1WFRqOvvRerd+r0avZNHN/ED/gkH8UPCPj250a5HhaeXTpl8q9 hv2EUwKhkcIUyoweQ3T3rLl/4JJ/EO08QjWJNW8N2FxEoAy8skcZGCHClMHkdDx9RXMfELQP2uPi zr1xqPiDXfFN9dXQHmyDxDaw7sDA+WOVR09BXF6t+yb8e9eU/bYNdu8nkTeI4XDfnPX19LE55Upp YjHUk+to31+dvyPlv9dPDulLmpK7860Uvwbdj7V8ffBs+APBek6hB4o8P+G9bliC3en3F8g0TUrg L+8kgXdvtdx5KD5Rn7pFfI37Qet+B/HfhPW4dbh8N2XjOzt5HtLmzullaeUNkYli+WQHkYIBGQa4 ST9gD4tTSlm8MeYT3fVbVifzmpP+HffxZ8rafCiAHk41OzH/ALVrXKMBSwitXxSm++itre2j28ic 98Vshxy5aEqcFs06kXfTfpZnghO6QDnBrY0t1tY9zokmY9uCxAPTB47161/w7t+LDNk+GOCO+p2f /wAdqVf+Ce/xaVdo8L8D/qKWeT/5Fr6SlmOGi786+8+GlxPk0lZ4qn/4HH/M8knCvOjxKLd1HBjJ OD3wf6UmwtEFK8HAOAAWHvXsCfsB/F0Lz4YU+n/Ezs//AI7T0/YI+LiJg+FEyTn/AJClpk/X99XR /amFe9RfeSuJco6Yqn/4HH/M8dYAIQFBOefUUx7RFYAxgg9s5Ar2f/hgn4tEjPhNB2/5Clp/8dpW /YH+LDSf8iooGP8AoJ2nP/kak8ywl7+0X3oHxLk//QVT/wDA4/5nixjycjjHH3cZxVW5spHRQuNq AkZPIBr28/sB/FsLj/hFY+vJGp2nH/kWlH7AXxZHXwspPr/atpn/ANG1Msxwr09ovvX+Y1xNlC/5 iqf/AIHH/M8LtkltnORjoP1qyJQynHcda9pb/gn58WSc/wDCKoO5zqdnz/5FpH/YA+LLNn/hExj/ ALCtnk/+RamOY4VKyqL71/mN8T5Q/wDmKp/+Bx/zPGlZgpzlsnqB0/GlQMxIcbSq9QOteyJ/wT9+ LAAx4WX/AMGlp/8AHaf/AMMCfFoEj/hFEwRx/wATSzIH/kWq/tPC/wDPxfeJcS5Pa31qn/4HH/M8 bVirDP3sccflTWl+XJx/LPtXs4/YB+LDMM+FR3JP9p2ec/8Af6kH7APxYOCfCoJweP7Us8f+jav+ 08J/z8X3oFxNlC2xVP8A8Dj/AJni7uxXJAOOgpiyeWuMYIHGK9p/4d//ABYUD/ikxkYyf7Us/wD4 9Q3/AAT++LLKp/4RVQVHT+07P/49WbzLC/8APxfev8yv9Zco6Yqn/wCBx/zPFvP2tjpxgeoFPDMi 4UEZ6ZPX/wCtXsw/YB+LWRjwouR3/tSz/wDjtJ/wwB8Ww5x4UXH/AGFLPH/oymszwv8Az8X3r/Mn /WbKf+gqn/4HH/M8cUgx52DHqfX3pOSTuC84JxxXsy/sBfFpQAPCqfjqlp/8epF/YA+LQJJ8KqQO 39qWn/x6q/tHCf8APxfev8x/60ZT/wBBVP8A8Dj/AJnjQTjPc8dOPwpo6kjqOvPAr2Y/sB/Fx2Of Cq89/wC1LT/49SH/AIJ//Fx8f8UuM9j/AGpacf8Akan/AGnhP+fi+9C/1myj/oKp/wDgcf8AM8ZL 7VyQrAE8dxSPcFE+7gHjB9K9nb/gn98W2/5lYHtj+07Pj/yLSj9gL4t7cf8ACKIPT/iZ2f8A8dqX mWF/5+L7/wDgjjxLlKf+9U//AAOP+Z4qbkgg4B4xUVzIJEOBtK8Z9a9tX9gH4ufLnwomRx/yE7Pg f9/qYf8Agnt8WWYf8Uqqj0/tOzJH/kWs3mOGa/iL7/8AglribJ/+gqn/AOBx/wAzwgkqvIwc9fWi vdj/AME9viwc58JrjPH/ABNLP/47RWX17C/8/F9//BL/ANZcn/6C6f8A4HH/ADP6lf8Ahwp8JP8A oaPH/wD4HWf/AMi0f8OFPhJ/0NHj/wD8DrP/AORa+fP+GUP20P8An4+If/hcR/8AyXR/wyh+2h/z 8fEP/wALiP8A+S6/Lf8AW2X/AEKa3/gDP13/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ/ /ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS 6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR 4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8A gDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GU P20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8A Bi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4 XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP +ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8f EP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDI tH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APku j/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA 6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iW jhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD 9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH /DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGj x/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/Hx D/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT 4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/ AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z /wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo 4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4 h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW6X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/ AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0 f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8A gdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP /wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4S f9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qp rf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+f P+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGu B/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+P iH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hw p8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/ AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n /wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/ APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4/ /wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gD D/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz /hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/ 8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR/ /JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/ AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof 8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH /DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8A W2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A /A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/ AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P +fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/z PoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/ AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8 f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A 8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/D hT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2 X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+ Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/ AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/ AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPo P/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH 7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A +B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDkWvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8A C4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItH/DhT4Sf9 DR4//wDA6z/+Ra+fP+GUP20P+fj4h/8AhcR//JdH/DKH7aH/AD8fEP8A8LiP/wCS6P8AW2X/AEKa 3/gDD/iWjhL/AKGuB/8ABi/zPoP/AIcKfCT/AKGjx/8A+B1n/wDItH/DhT4Sf9DR4/8A/A6z/wDk Wvnz/hlD9tD/AJ+PiH/4XEf/AMl0f8Moftof8/HxD/8AC4j/APkuj/W2X/Qprf8AgDD/AIlo4S/6 GuB/8GL/ADPoP/hwp8JP+ho8f/8AgdZ//ItFfPn/AAyh+2h/z8fEP/wuI/8A5Lopf62y/wChTW/8 AYf8S0cJf9DXA/8Agxf5jP8AiMv/AGYf+hE+PH/gl0n/AOWVH/EZf+zD/wBCJ8eP/BLpP/yyr+aG iv3n+zqPc/I/rkz+l7/iMv8A2Yf+hE+PH/gl0n/5ZUf8Rl/7MP8A0Inx4/8ABLpP/wAsq/mhoo/s 6j3D65UP6Xv+Iy/9mH/oRPjx/wCCXSf/AJZUf8Rl/wCzD/0Inx4/8Euk/wDyyr+aGnSwvA4V1ZCQ GwRjgjIP0IIP40f2dR7h9cmf0uf8Rl/7MP8A0Inx4/8ABLpP/wAsqP8AiMv/AGYf+hE+PH/gl0n/ AOWVfzQ0Uf2dR7h9cmf0vf8AEZf+zD/0Inx4/wDBLpP/AMsqP+Iy/wDZh/6ET48f+CXSf/llX80N FH9nUe4fXJn9L3/EZf8Asw/9CJ8eP/BLpP8A8sqP+Iy/9mH/AKET48f+CXSf/llX80NT6dp9xrGo QWlpBNdXd1IsMMMKF5JnY4VVUcliSAAOSTR/Z1HuCxlQ/pX/AOIy/wDZh/6ET48f+CXSf/llR/xG X/sw/wDQifHj/wAEuk//ACyr+ajUtOuNH1Ge0u7ea1u7WRoZoJkKSQupwysp5DAggg8gioKP7Oo9 w+uVD+l7/iMv/Zh/6ET48f8Agl0n/wCWVH/EZf8Asw/9CJ8eP/BLpP8A8sq/mnsbC41O4WG2gmuJ WIUJEhdiSwUAAerEAepI9al1bQb7QbuWC+sruznhKCSOeFo2j3ruTIIBG5eRnqOaX9n0u4/rVQ/p T/4jL/2Yf+hE+PH/AIJdJ/8AllR/xGX/ALMP/QifHj/wS6T/APLKv5oaKf8AZ1HuL65M/pe/4jL/ ANmH/oRPjx/4JdJ/+WVH/EZf+zD/ANCJ8eP/AAS6T/8ALKv5pbW1lvrqOCCOSaaZgkcaKWZ2JwAA OSSe1WdW8P6hoF9Na31jeWVzbokssM8LRyRKwUqzKwBAIdSCeoZcdRS/s6j3H9bqH9KP/EZf+zD/ ANCJ8eP/AAS6T/8ALKj/AIjL/wBmH/oRPjx/4JdJ/wDllX80NFP+zqPcX1yZ/S9/xGX/ALMP/Qif Hj/wS6T/APLKj/iMv/Zh/wChE+PH/gl0n/5ZV/NDRR/Z1HuH1yof0vf8Rl/7MP8A0Inx4/8ABLpP /wAsqP8AiMv/AGYf+hE+PH/gl0n/AOWVfzQ0Uf2dR7h9cmf0vf8AEZf+zD/0Inx4/wDBLpP/AMsq P+Iy/wDZh/6ET48f+CXSf/llX80NXdb8Oaj4auY4dSsbzT5pU81EuYGiZ0yRuAYAkZUjPTIPpR/Z 1HuP63UP6Uf+Iy/9mH/oRPjx/wCCXSf/AJZUf8Rl/wCzD/0Inx4/8Euk/wDyyr+aGij+zqPcX1yZ /S9/xGX/ALMP/QifHj/wS6T/APLKj/iMv/Zh/wChE+PH/gl0n/5ZV/NDRR/Z1HuH1yZ/S9/xGX/s w/8AQifHj/wS6T/8sqP+Iy/9mH/oRPjx/wCCXSf/AJZV/NDRR/Z1HuH1yZ/S9/xGX/sw/wDQifHj /wAEuk//ACyo/wCIy/8AZh/6ET48f+CXSf8A5ZV/NDRR/Z1HuH1yZ/S9/wARl/7MP/QifHj/AMEu k/8Ayyo/4jL/ANmH/oRPjx/4JdJ/+WVfzRLGzjhWP0FL5L/3W/KmstpC+uzP6XP+Iy/9mH/oRPjx /wCCXSf/AJZUf8Rl/wCzD/0Inx4/8Euk/wDyyr+aPym/ut+VHkv/AHG/Kj+zKYfXZn9Ln/EZf+zD /wBCJ8eP/BLpP/yyo/4jL/2Yf+hE+PH/AIJdJ/8AllX80fkv/db8qPJf+635Uf2ZTD67M/pc/wCI y/8AZh/6ET48f+CXSf8A5ZUf8Rl/7MP/AEInx4/8Euk//LKv5o/Jf+635UeS/wDdb8qP7Mph9dmf 0uf8Rl/7MP8A0Inx4/8ABLpP/wAsqP8AiMv/AGYf+hE+PH/gl0n/AOWVfzR+S/8Acb8qPJf+635U f2ZTD67M/pc/4jL/ANmH/oRPjx/4JdJ/+WVH/EZf+zD/ANCJ8eP/AAS6T/8ALKv5o/Jf+635UeS/ 9xvyo/sykH12Z/S5/wARl/7MP/QifHj/AMEuk/8Ayyo/4jL/ANmH/oRPjx/4JdJ/+WVfzR+S/wDd b8qPKb+635Uf2ZTD67M/pc/4jL/2Yf8AoRPjx/4JdJ/+WVH/ABGX/sw/9CJ8eP8AwS6T/wDLKv5o /Jf+435UeS/91vyo/symH12Z/S5/xGX/ALMP/QifHj/wS6T/APLKj/iMv/Zh/wChE+PH/gl0n/5Z V/NH5L/3W/KjyX/ut+VH9mUw+uzP6XP+Iy/9mH/oRPjx/wCCXSf/AJZUf8Rl/wCzD/0Inx4/8Euk /wDyyr+aPyX/ALrflR5L/wB1vyo/symH12Z/S5/xGX/sw/8AQifHj/wS6T/8sqP+Iy/9mH/oRPjx /wCCXSf/AJZV/NH5L/3W/Kjym/ut+VH9mUw+uzP6XP8AiMv/AGYf+hE+PH/gl0n/AOWVH/EZf+zD /wBCJ8eP/BLpP/yyr+aPyn/ut+VHlN/db8qP7NpB9dmf0uf8Rl/7MP8A0Inx4/8ABLpP/wAsqP8A iMv/AGYf+hE+PH/gl0n/AOWVfzR+Uw/hb8qPKb+635Uf2ZSD67M/pc/4jL/2Yf8AoRPjx/4JdJ/+ WVH/ABGX/sw/9CJ8eP8AwS6T/wDLKv5o/Kb+635UeUx/hb8qP7MpB9dmf0uf8Rl/7MP/AEInx4/8 Euk//LKj/iMv/Zh/6ET48f8Agl0n/wCWVfzR+U391vyo8l/7rflR/ZlIPrsz+lz/AIjL/wBmH/oR Pjx/4JdJ/wDllR/xGX/sw/8AQifHj/wS6T/8sq/mj8pv7rflR5TH+Fvyo/sykH12Z/S5/wARl/7M P/QifHj/AMEuk/8Ayyo/4jL/ANmH/oRPjx/4JdJ/+WVfzR+U391vyo8pj/C35Uf2ZSD67M/pc/4j L/2Yf+hE+PH/AIJdJ/8AllR/xGX/ALMP/QifHj/wS6T/APLKv5o/Kb+635UeU/8Adb8qP7MpB9dm f0uf8Rl/7MP/AEInx4/8Euk//LKj/iMv/Zh/6ET48f8Agl0n/wCWVfzR+U391vypPLb+635Uf2ZS D67M/pd/4jL/ANmH/oRPjx/4JdJ/+WVFfzR+U391vyoo/sykH12Y3NfXOr/8EcviFon/AASltf2t Jte8Knwhc3y240dbh21FbZrz7Es5IXy9xuOPKzuCEMTnKj5GHQ1uH4n+Jf8AhAh4UPiLXD4WFz9s Gj/b5f7PE+Meb5G7y9/+1tz711TUnblZjGUdbo/SL4K33jD/AIKJf8EZ9G8L+Cl0z/haHwE+Imi6 dMsGmwrPqei6g6W2mSzMkJLm3vAEJO7ESMz5zzt33wC8Of8ABZH9o/XJ7rxj4lvND8MeK7D4beGL fwj4VtBFb2ZhSGTxJfXQWK38iaaIymMv50jXBWPAVUPwp+xV+3r44/YUuviBN4LmiRviJ4Uu/Ct7 5pOIFnKlLqPHSeFl3Rt2JPqa7L9lH/gqBrX7K/wBsvAcfgHwR4ui8N+O7b4j+Gr7WGvY5NG1qGJI ROyW08K3KiONdiS5VWJJ3AhRyyozTbh8vnubxqRaSfzPWPEX/BIrwH+zzpmi6V8afixJ4G8T+Po/ Etx4YvRYo2i20GkSzQwveuWMm6+lhYRpGAUUpuLO4jr2L/goP/wTztLrSh8avir8S/HPij4aeDfh r4Lh06az0DTbLWr99RilW1sESNxBEtvDGJJJX8xm3hQWPI+d/jb/AMFi3/aD0FbbxX8E/hpr134d 1jUNV8GXOqT6jejwwt/cG5urd4nuNl9D5zNIkdwGjjY4CGP91Wn8Wf8Agt/rXx00F/Cvij4VeCrr 4c6h4d0jw1qnhu31LU4VuodJYtp08U5uGeC4h3OpdQRKkjLIr4QpHJWbTf6fh8h81KzSPSPiH/wR X+E3wI/Z38ZfFnxf8T/iBqHgjRrXwx4l0Q6D4es3vNX0PXhILXcs1yqx3SSxSpJ8xQCMMu8tsW8v /BvrZ+G/in8UH1DxX4h1/wAA+DPFWmeF9Jl0qOwstTvTfaZb6o1zP9snSFEtra6gV1jMjyu52qgU 14147/4LYeJ/ix8EfG/gDxV8NfAGr+HfGa6LaC2jn1K1j0fT9HULp1jbCO5BWOL96xZiXdpnLMeM TfFv/gtRqH7Quu+Mrbx/8Hfh14m8DeN59O1S98Mtd6nbx2ur2FiLC31K2ukuftEMptkhhkVX8uSO LG1WZnNKNf8Aq3l/wQbpHpnx0/4IP6L+zd+z34s8W6n4z8S+PIdDg1+RfE3grTrbUvDmlz2JmFla agqSvdQPdCKJzLs8mL7SilmCtJXH/sBf8EYYf2o/2d/CfxF8W6/rGiaN8QfEdz4e0mXTm09ItIit zGk2qXjXdxEZIElk2+RApkYRu25flB4Rv+Cu2raZ4U1L/hHfhf8AD/wV4v1Pwvd+CpNZ8PS6hY2x 0i5FwrxPYC5NvLMiXLpHLIrbAF+VmVGTivg7/wAFApPBn7MsXwm8bfDvwh8VPCOh6tL4g8MQ65cX 1tJ4d1CVQspR7SeJpbeXapkt3O1mAIKnmny1uVpvW4m6fMtND690n/ghV8Jk8XfBjwRqXxX8cnxv 8b7PxBZ6PPY6DZT6LZanpE1xDM8souvMa0eSDEflqzOrBiU+7Xm3/BDHwl4TXRf2mPG+rat4o0jx J4C+EuqX2l32jWkTXOjLJJBFLe2srTRut4qO6RgFABI5MgyBWb4T/wCC5mueEvEvwV1qH4O/C8al 8CodRj8PNA2o2luG1Bne6JghuViVTJJIyxooSMMFQKqgDx39k7/goCf2SLD4wWOl/DfwhrOnfGHR J/Dd7a315qITTNNmkMj20DR3CuRkRAPIzSAR/e+ZsihVcGpfp3/yDmpqSa/rT/M+lv2s/wDgnfpH xK/Z28a/tG658UPiF4x1ixi8NeJfEfiK98MJZWXimHWJoYZ/7OjlaGR5LVpowXI8mQqyhkYMqa/x /wD+CMXwP+CPir48aE/xZ+JUuo/s62+j674lc+FrN4tR02/SHZb2eLoE3W64h/eS7IxvI2nbuPmH xV/4LbXPxs0n4g2/ib4JfDq+k+K+gaTpHi2ZNT1iA6nNpbwNYTxol2EtY4/IH7mBUDl2LMelU/i/ /wAFrda+NPij47axq3wo+Hi337QOh6doniB4rvVF8pbFUEEsQ+1YDAw25IwAfJwQdzZUYVkrf5eX /BBypvX/AD8z3++/Yjuv2H/2bf2orv4WfGnxxplnZ+CfBPj21h/sK0trjUbC+u4biyWW7WRp7a6g lM2TbFFPyEs3KD17/gpH8DpfjR4n/bLVPilrHhXRpvil4E0/xLpc/h62utPcXcVrBDe/aAWu3MIa SRo4xHu2qvz5NfG/jf8A4Lmaj4+8GeM/D998FPhudL8ceD9F8EalGuoawC+n6SxayUMLvIZTtyww W2ck5NdHZf8ABxP4v0nx9438UWXwd+FsOuePvEei+KtUmll1O4ja+0kILN1je6KqFKZIAGSc9QDW fsq1+ZrX5eX+RftKdrX0+f8AXU8//wCCkP8AwS60T9jz4C+G/iJ4a1nxnLpereLNT8ITaf4q0hdO v5JLRVkjv44wd8cFxEwdYpkWVQVJyG4r/sof8EzNJ+Jf7HHxh+JXj3Wb/Rdb8OeA5/GHgzQLR0W6 1C3ivIbdtQugyNstHeQxxDhpikzAqsSmTC/ax/4Kgj9qb4C6x8PR8J/BvhPSLzxpceOLC50/UtTu Luxv7tAL1mae4dZjMVH3lCoMhVBwR7x+zr/wW0t9d8EfHl/id4a+FFj4h8SfDk6F4de08F7v7cuY 7m0EOn3JTcPswgibaj7I1EYAKkKK2ftVTS63Ml7Nz8j5+/ZJ/Zj0fw1+zDrP7SnjXxr4w8I+G/DP iy38H6Ang4IuvXusvbG6ZklkdEgihtxvLAlmLbQF61+jf7ffgWHx147/AG5dV0Lx1f8AhPXI7r4b 6N4l1OXQ1mbU9G1az0yzELT+dJIsW4zXE0UMSu7RQr5si5Qfl7+zZ+3fc/BT9n/xZ8J/E/gnw38T Phr4pv4teXRNYnurT+zdXhj8uK+huLWSKZSY/kkTfh04ypya+g5/+DgHxTF4x8deJbH4P/C208Rf EO48MX+r3TS6rNFNd+HpI5NNmEL3ZRQjQxZRcBtnOcmlUhUcrpfl3X/BKjOCVmegX/8AwQB8Nav4 r8BppPjvxdo2j+IvGWqeDpP+Eo0i30u+197PTZL+C50+KSZBCt95RhhjvDGytIjEupG7wH4r/sB/ Dv4Q/t5/Dz4U+Lde+KHw50jxbaWqa0/iTw3CNV8MXtxeT2yJIgmSGe2ASGb7RC7qUkOBuVlXrNY/ 4LfnW/DXjbw7N8A/hXL4V8eeI77xRqenT3mrTvcXmoWslvqMzTPdFxLLujaN4vL8gwrtHJNeWeMf jpD/AMFLP2iPAHh3xx4t0D4O+CvC+hSeHNDv9Ulv9WttGtYjc3UKXEztJcSvJPL5ZkJCoHXCqiBa Iqsviegm6b+Falr9tD9gHQf2MfB3i6LXvEHiqLxtpPxC1Pwho2k3ejQwQapYWSws+omUTswUrPEB tQqzOQD8j49if/gnL8AvF37L3xN13wt4u8ZTn4b+ALLxZD8R72YQeGfEWtSiDzfD0NnLZxOk2+Ro kK3UjiT7y/KyDwP/AIKd/tn3v7a37RNpqsmu3XiXSPB+gad4V0zVbi0+yS6wlnbrHNqDxfwvc3Hn TcgMFkRWAK4r6Y+HX7YvwD/Ze8I/F1/CHxF8a+Lfhl46+H1z4d8N/BzXIL65/srVbyG3MlzeSuEs VEF0s8qy25eQ7htwckuXtLRbvcS5eZpbHj37J/7CHwo+JH7Ani348/EXxt4+0bTvA3jCx8O6npeg aHa3cs8V1E2xoXmuEG4OUZmYABVdQrlgw9Q/aU/4I3fD79hDVfEmrfF3x94xfwQ/xA/4Qbwxc6Bp Nsby7jFpDdy6lciWXakcKTCMxL80kiuQVUc/Onwf/wCCgtz8Kv2JPE3wMm+H/hHxB4b8W+IbPxFq V5e3N/HdzS2xXy4/3Nwiqu0MvygHD56jNet/HH/gt1rH7TniHV3+IXwl8B+I/D19r0Hi+z0Q32px QabrcVqtr9pRxcFzBLFHGJbbIjcxhl8ty7M5Rrc11t8vL/gjj7O3n8z0T4lf8EP/AAv+w18SdB0L 48/Gf/hBb/x34g1XTfBXiDS7P/iW2Vtp8KSjVr95GVo1kkmtkSGIlwWYmTgGvT/2x/2Q/DH7f58E tqPj7xjL8YfDX7Kuh+PIJ57BLrSdWhsbNpZhcXUswuWuLjexDGIBOGYuSUHyt8Qv+C0Pi/8AaL8I ajp/xo8BeA/i9eQeJLrxV4ZvNYS6tv8AhGLu5K+dbpHbyotxZHYmLabcuUXcWUba6DTP+C5Oqad8 R4vE6/Bb4Yrfx/DQ/CkpDc6pBAdFKGMxrGl0ERth2gqBtGMYxWbhW0b3+RSnT26fM9du/wDg3Gi0 WNfDPiD4mWngrxlpUWi3Oraxrc+nr4elF7LbrdW1si3H2vzbRLkPvmSNZjA4AjDBx8x/8FQv+Cf+ lfsE6z4Z0y3tfiVpOsatdalDd6f4u023iDQW5thb3lpdWzPb3MM/nS/cctGYsMOVZtrUP+Cwd54n +IOhfEHxH8FfhH4q+LOmw2thqPivVbe+lOu2dvHHFGs9otwtv9oMUaxPcqodo/lwOSfKv2pf23r7 9ov4Y+CvAGm+G7Pwb8P/AIfz3l3o2jQapfamYJ7tYBOfOu5ZHEY8hBHEu1UGfvMzO2lONbmXO9CZ Onyvl3PDaKKK7DmCiiigAoopYl8yQAckmmlqFz9av+CWXgf/AIQz9jbQZmTy5tduLnUpBjk7pDGh /GOJD+Ir6JrmPgj4K/4Vx8G/CugFNjaPpVraOPV0iVWJ9ywJ/E109fsuAoKlh4U2tkl+B/Nua4yV fGVaye8m/lfT8AoqSzu5bC7inglkhmhcSRyRsVeNgchgRyCDzmvu/wDab+P2j/BPxdKNWk1HW5df 8C29tBopgU2azu7kXkkjNwwII+VSx9emOLM8ynhalOlTpc7nfrba3k+/Wx25TlkcXSnWq1eSMbXv rvfz8ui6nwZTtp2k84HftX1B+2za6x4/034JaTY/bdRv9a8K2brAHLNd3Tqo3nJ5c55Y888mtr9m jwFoniL4N6/8Jr2401PFHjLSF1yGOUyC6hvEHnW0P3AuzyPLkPzlv3sgxjry/wBvU1hI4qVPd6pO 9knZvbZWb28jr/1dqvGSwsamiWknom2k0lru9EfIdFfXXwg8T6R46+CnhD4X+N3k02bWkuv7D1uY FbjRb+C6dIoyWwQh4TGRjAXjIK8F8XL7xD4a/bV8P6dqmqXcmqaHLotjJIlyzbH+zWon2t1w7mQk /wAW4k9TV0M5c606Lp2cU36pPRrTrs+3mRiMjdOjTrKpdScV5xb1aevTp3PAqK+xf2xPGN3pfxT+ JGneHtc8QPq6XljJc6dzHaadYRWyXMk8BDkBhLHDlsIR5m1Q28mrn7SniHU9F/4KNaSbC8u7e0On xPEIpGWEwGBnkIA+UoSmW7fJk9Kww+fOq4pU7c0XLfsou23W9vlc6cRw6qfP+9vyyUXp3bV9+lr/ ADPi6lVS5AAJJOAB1NffH7LepT+Kv2efhXdap4tu9MvpfGM4E1xI8jattW4YWMkhbhZMEfNkZwAC SK4nxSW8PfAb42eKrHQ4fCPjn/hJ47G8htCBcaRZO0BCo642rI5fLoAHz6YxhHia9aVB0tU1Hfq5 Wvtt569uxvLhVqhGuq2jTe2tlHmtvv0sfHzqVJBBBHBB4xTa++vgj5Wq6j+znrupzFfGevRalaX8 pf8Af6pYRwzmIz85kA2wkF8kk57cc/4Q/aB0q++M/g7wLZS6jrGs2njW5mudXu4vJ+z27ySg2UXz l3j5GQ2F+UYU/KVJcSTvJQoX5U29dNHJN3tt7une+wR4WgoxlUxHLztJaa3ai0rX397XtY+Jae0b KgYqQrZwcda+1Lc6R8RP2mLzw3fanq2t6EfGl9J4istTTbZ6ekUqpYRxfOwEb3Epj42l+hQKoNV/ hRqtz8R/2lvjT4b8dz3Fx4Is7LUZJ7a8JW101YLhFt5IgcCEpHnaVwSOeetWuJFyczpdFJ662btp pq+vpbXUzfDD51H2u7cU+l0m7t30XT7+x8YUUpOaSvqlGLV7Hx3tJJ2uFFFFPkj2Dnl3Cvl39ofX /wC3vivqOG3R2e21T22j5h/30Wr6c1G/j0rT57qU7YraNpXPoqjJ/QV8aapqEmralcXcpzLcytK5 /wBpiSf1NZVYx2sa0pyve5BRXWfBv4nW3wm8SXup3Hh3RPEkk2m3NnbQarbR3NvazyoVS58qRWR2 jJ3KrDBI5r9EfFvwv8C6l8af2ZPBd14F8B2+j/GXwJZnX5YdCs7S5+1yxpI11BNHGrxTEqUGwhf3 nAztx4OY5nHCVFCVO6abv/hV3p6fefSZXlMsbTc4VLNNKzv1aS19T8wqK/SL4NfDLwj+0h/wUR+M vwR1zwV4Q0fwHpdpqdrpT6fottaXvh82c0ccV3HdJGJiW5Z/MZlcvzkYFZHxEsvDnw7+BH7IOtW/ w/8Ah9ql18Q5rm18Sxv4Yst2toJ7aFQWWJXRwsr7WjKHcQTnpXH/AKwQ540/Z6tJ/Jxclr3smvWx 3/6s1eSVX2ukW113UlF6X2u0z89KK/TP9sL9ir4efsMfs+/GTxZ4Hs9M1rWrfxfY6Hp0mq28Gqjw xay29rdSQokwkXzSZmTzJV3iNkxz87eF/t9fCbw3on7M/wAAPi3pem6LoHizx7psp1rTrKyhgs76 W3KbbxbYKIk3bvnVU8tt6/KOd14XPqGIcXTg+WT5U33tfVdrde5ljOHMThlNVJ+9FJtLazfLo+rv rY+QKK/Tz41Q+A/gZ+1r8MY7r4Z/D3U/CV58JJ/Fet6SvhmwT7fcRWl5cvIr+UCjsbZAMEKOeOTW NrP7Eng200E6r4Pbw7qfwe+NHiTQbbw/rFxpdrNqfh1Ly8MF9ZrPNG0kUiLtC/N8uDjDh2OMeJKN lKdOyaun03tb10bt1R0y4Ur3cKdW7Ts11Wid99td+h+blFfZn7X3xC0n9nb9tLx58OdK+G/gy68H 6Np0uiaVpg8NWk95FO2nD7Pe/aHjM8kyzushZ2bcoIweML/wVg8Dab4H+J/wd0zwd4V8OaZLrngv TNYktdJ0C1ibUNQmlmUlkjjzJvKoBGQV7BeTnqpZupVKcJQsqi5k79LX18/6ucVXJJQp1ZxqNunL lat1vbTuj4yor76/bj8JeHfh1+1r+zjp+heE/BOn6Z4h8P6JqOpWsPhyx8jUJrq5khneVfKw4ZMA KeFIDKFYA1Fqlno0/wDwTi+MvjX/AIRLwDH4m8PfEttG029j8J6arWlmWtz5CjyNpX52wSCcHGaz WeQlThVUNJO2/d27Gr4eqKpOk6msFd+dknpr8j4Kor9R/ih8I/A13/wUo+Ffwof4d+CD4K+Ifgm3 l1S0s9BtrO6iuZI7t2u4biFEmikUwoeG2bQ3y5OR5p+3B8EfC3/BO39nX4br4E03w14n1LxR4g1h 9T8QazpNrq7XcNnOsUVqBNGyJEVb5ggUs0ZOeSKinxDSlOFNQd5pNLpbXd9Nn0NKnDFaFOdV1Pdg 7N9b6bLrvv6nwHRX1L/wV0/Z98K/s/ftO6ZD4RsI9FsvFPhu08Q3OlRZ8nTLmd5lkijB+4n7sMEJ +XeQMLgD5ar2sFiIYmhGtBaSVz57H4aphMRKhOV2nbQKKKK6eWPY5OeXc/OOiivf9Q/4JifGfS/2 DIP2krjwssPwouL4Waag15ELgqZ/sy3Hkbt/ktcfug2MlsHG0hj+Lykluz+l1FvY8Aor9F/2eP2a 4Pj9/wAELLzWPCvw5+Ed18Sbf4pzeEJPEmu39ho16uknTRfFlur66hia4WeZUXaS3lDAUhWYeif8 FBP2EfDnjXwt+zB4VtNH+BfwT1zxX4E1Txj40160urdbJ5LEOZUhninljuMxoxSKJ2DOCdwUEjB4 mKlyvzNVRbV0flJRX6ufBH/gn9afs6/ss/tMeB/HPiTwXL4W8QfDXwx8QfD/AItvvC8n2vSrS91e KIytG0DX0MwFvJH9nU4LBTkbiw5r4Wf8En9T+Dv7O3xsv5vF3wS8S+CPEnw80zxbpPizVvDepXd7 b6LLex41GwxGHtJ1ZZo5oWDSgxqNhBUlfW4ajVCWh+ZFFfor+2j/AMEdvAfw4/bZ+JHg3wx8VvDn hvwz8PbDR5NR066gv9S1yG5vbWyEcFtbiFWv3lmneXEBbyos7sMAp5F/+CFXjLwR8V9V8M/ELx94 N8BQnxxF8O/D2qXaXEtp4k1eW3S4TyztUxWyxSxeZNJja8qoFdgwW1iabV7kujK9rHwxRX6v+N/+ CZdx4Q1j4FeKPHdl8EJvhX8K/h/P4k8WatoFjd2VtrNtaak8EaX8ixyPfXVxcPHGPLRfOUSAOoKu PMPH3/BIbxF+0f458efFK++Jfwq8OeDtZ8IP8WNO1TS/Dl9YaTd6Q115VysNnBblrZ7VyFeDDyEs mDIWL1CxcHuN0JI/O+ivoT9pT/gnn4h+Cv7Qfw58CeFdZ034mt8YNF0nXvBd7pUEtp/bNvqMjQ26 tFcBGgkM0cilXOAACSASB9leCf2LhYf8E8P2iPgtpHifwL8TfiZ4W8Y+EfC0NtpXhcW114e1S71i aC5t49Tkt0lu4ZJkEe7eVX7McKEKk3OvFJNdSY0m212Pyxxigda+uv2xv+CRPjf9jf4H3PxCn1SP X9M8OeJh4U8QD+wb/T0sL/YzpJAbuFBeWTtHIi3CAKzKvy4cV9B/tsfsSTftpeCPBXj3TtZ8E+Ed U8DfsyaL8RNfsbfRPsP9uE3uoLcTpHaQrAjlzHu6E7hhSFOF9Yjo+g1SlqnufmFRX6MfCz/gmrd/ BLwf8S4NG8T/AAf+J194v+AbfEDS7fUfC+qXV4NNnvPKFxpu+ONYL5HijCPJ84M3EZAJPlPxb/4I ++IPhtoPxN0/T/HnhfxJ8S/gpo8Ov+O/B9nb3Mc2kWTBDNJDcyIIrlrYTRecq427m2l9vLWIg3YH RkkfHtFfqV/wT3/Zp0Tw7/wTb8GeJfD/AIk+Fdv8Qfjt8UpPhvLd+KfCc+tQi1udPW3j0tQ1u5ik E1z9qMsZSMtFCrSMExXmlz/wQW1aOy8Qalp/xb8LeKdH8Dape6D4t/4RjQdV1jU9B1OC+ks0szYx wedI0hikk3fKgjjd9zKY2kUcVC7T0H7GVk0fAFFfoP4l/wCCAuq/CWOSX4i/GjwH4Nhh8fw/Dsk6 Vql68t/c2cV7ZGMJANyzW88MuSVWNWYMwdDHVnXv+CLlh4Z/Y91pLnxVo83xwsfjg/wqtbW3F/La 3l2lrKV01AsBTzZn8mZZ2IiVH2uyMGFH1mn0Yvq8ux+d9FfXH7Zf/BIPxt+x/wDAm78e3Gqrr2l+ H/En/CJeIQND1DTV0+/MbMklu91FGLuzdo5EW5QBWZV+XDg1oWH/AATR8VfCL9nO++Nvhjx98P8A xLr3w30jRPGGt6Hb2aarb6Ra6k6/ZleaWOSznuo/NgeW1cZRZQw3/Lup4iFrpi9lK9mj43or9BP+ Ch37Ien/ALRv/Bf/AMXfBzw5e+HPh/b+KfEGnaPpj/2e0en2Usun2vlxrBbodoZyAAFVQWySoyax pv8Agitpdrp9lqUn7Q3w3XRLfx9J8MdduhpGreZpfiAY8q0iiNuGuQ4LEyjZEoikId8DcliIWV+q uP2MrtLofClFfdXwy/4IVeLPH3xG1rwJc/EnwBYfEK18Ta74U0rQIJJb+a+u9Jj8yeW4MSlrK2kD RiOWZcEyoGC7l3cTJ/wS5sNL/Yy8K/GPVvjb8OdEtvHHhfWvEGgaLfw3lveatcaVcR29zp0TvEIj cb5Nqjd87D5A6BpFaxFN7MXsp9j5LooorYzCiiigAooooAKKKKADrk13n7L3ggfEf9orwXobJ5kN /rFsk4xn90JA0h/74DVwgOAfevp7/gkf4G/4Sv8Aa5tNQZdyeHdNur85HGWUW4/H9/kfSuzL6Hts VTp92vz1PPzfEewwVWr/ACxdvW2h+qzZ70lFa/gjwbf/ABD8X6boWlQfaNR1a5S2gjzgM7EAZPYD qT2AJr9lnOFODlN2SP5thCdSahBXb0RD4Y0vVNY1+1g0W2v7rVC/mW8dlG8lwWQb9yBPmyAC2R0x ntV3xh8TfEXxAntZNd17V9XksQRbyXt3JcNADjIQsTt6Dp6CvrX4WfBnwP8AsvftVeF/CVxHrXif xu1rLcXd6LkWmn2Be0mbZHHsZ5CVBGWYABlPUFRzsX7DehfGv9lmX4m+D4tR8MXEMN1cLpF7fLfQ 3EVuzq4WTy42RiY3xuBGQOmcj5iXEWEdWM6sWoO3LNpdb/NJ200730PrY8LY32MoUZpzTfNFN6KK i+1m1fueBH9orx88kTnxr4p3wIY42/tSfdGuMYU7sgY7Cqg+NnjFfFY1z/hKfEC62IPsovxfy/aR FnPl+Zu3bc9s4qX4a/A3xZ8YFu38O6Jc6hb2Kl7m6LJBa24Az+8mkZY0455YcV3dz+wH8T38NSav p2i2Wv2MW7c+lanb3hyOoCq5LH2UE+1ejVr5XRlyTcE9rOy36fM8ulhs2rx9pTjOS3urvbqvTujz jxl8WfFHxFtYYNf8R65rUFs3mQx319LOsbYxkByQDjjIqqfHuut4sXXTrOqtraMrjUDdyG6BVQoP mZ3cKAo56DHSsy8tJbC6lgnikgnhcxyRyKVeNgcFSDyCD1Bp+laZPreq21naxmW5u5VhiTIG92IC jJ4GSR1r0IUKMYe6kl6K1up5kq2InP3pNyuurvdbfNHSav8AHXxp4htLu3vvFniO7g1CPyrlJtRm cXCf3Xy3zDjocjimXHxs8X3nhBNAl8S61Jo8cXlLaNduYxF/zy6/6v8A2Pu8DjgV34/4J5/GQr/y I97/AOBdt/8AHKP+Hefxk/6Ei9/8C7b/AOOV5ixuUKyU4aa7rc9h5dnbbk6dTVW2lsedt8X/ABW3 hu30Y+JdeOk2jI0Fn9ul8iBkYMhVN2FKkAjA4IGKtH47eNG8QNqz+Kdem1J4fs73E17JK0kX/PNt xO5P9k5FfdH7E/7I+k/C74BXPjG90C31nx80V5JDFdxCcWcsLSRrBGvQEtHyw5JYgHGK86/YK/aZ 8Y/G34/XPhLxxdjxJo2sWdw0tne2URjt5E+YEJtAVcbl24x8w46V4k8+w8/bzw1CMo0vibaTfeys 77dWrn0FPhvFQ+r08ViJRlW+FJNpWta7urPXsz5XX41eLovFj66nifXYtZeH7OL1L2RJ1iznylYE FUHZRhR2FUrT4l+I9O8Wya9Brurw65KxL6gl5It05PXMmdx6Dv2HpXsn/BR74G6D8Cv2gFtPDkUV np+r6emoGyRjttJGkkRlUdkOzcBnjLAAACuA+FP7Lnjv41aZJqOgaDPPpUBPmX88sdtapt+9+8lZ VO3vtJIr3MLi8BUwkcY7QjJdbLTt/wAA+cxeBzCnjZ4KLlOcG9rvXuYuvfGfxf4q0y5s9S8T69f2 l4yyXENxfyyRzup3KzqWwxBAIznBGad4h+Nni7xZob6bqfiPV76ykCCaKa5ZhcbPueYc5k2/w7ic dsV1niz9i74ieE/Cj68uhx6xo0QJkvNIvIdQjjwfmyImZgF6k4wO54NRfstfCDUPid42lvtM13wt od34WMWqxHXbjy4J3SQMoIwdy5X5sjABHrTlicujQlXpOLUO1t9OydugRwmZuvHD1eZOfe6uvm1f r1PL6K/Rfxj4HiuNC8SeKtHu/AGna98X7O30uWe+1WNtOs9qSRzvbuFPnmbaroAPmKFiMqQfg34u /DiX4S/ETVPDs2oadqsmmOqG6sZPMgm3Irgq3sGwR2II7Vlk2fU8fKVNR5Wul79r9OjdvO19jbPe HamXRjNy5k3vay8ut7tK+2hzVFFFe+fOHGftCa//AGD8KdSKnbJeBbVPfefmH/fG6vlqvb/2v9f/ AHOj6Wp6l7qQfT5UP6vXnPwS+DPiL9ob4p6N4N8K2B1HXddm8i3i3bVHBZnduioihmZj0VSa5MTV hTi5zdkt2dWFozqNQgrtuyS6vocxDKYJVdQpZCGG5QwyPUHgj2Nem/GP9sb4gfHaPwsPEOrWm/wV FFBocun6Za6fNpkUWPKSOS3jR1VMAqM4BAPUCvsf4D/sv/Cj9k7xr8ZPBuveP/E3irxlp3w31ePx QmgaPEljpVuVt2mihlnkVp7lQybflVM7gxUgivJ/2mv+CUOpfDL9lnTPjZ4I1y78ReAdTs7fUZLX U7FbPV9PtpyoikdI5JI5FJdSSrAgMDtwCR84s5wFavGNRW2UZNPW66XWl/xPrJZFmNDDylRlfRuS i1ok+tn0f3Hk/ib9vn4k+KrPXGm1DSbTWPFVmdP13XLHSLa01bWbYgAwz3EaBipCoG27S+xd5bvJ N/wUF+KE3hnwppLan4f+y+Bcnw+f+Ea0wyaMzFWLwOYMxuWRTuXkFQQQQMdT/wAE5v8Agmt4o/b7 8a3DW87aD4L0aVU1bW3i34YgN9ngXIDzFSD1wgILdVVvR/2gvjx8Av2OvE974H+EXwq8LfETVNEl +yal4r8bo+rQ3c8Z2uILfKR4DAjeoVSeisuGJVrYJV/qtCipzWrSStHpq3otNLLp0HQo5g8N9cxF d06ctFdu8tb6JavXVt6Hzh4K/a98feDo/EdvLrP/AAkOneMZ1u9e07XoU1S11adTuWaVZgx80MAR IpD/ACjkgYrK+LX7RPiz42+INJv/ABFfwXKeH7eOz0mxjs4YdP0u2jOUghtlURLGOARtO7Hzbq4l juckBVBPQZwPbmivZhhKKlzqCT9F2t+WnofPzx2IlD2cqja7Xfe/56nuXiT/AIKL/FLxfrdlqOq3 3hjUbzTdHfw/byXHhTTJTHYOrI1sN1uf3ZR3XHpI3rXA6b+0R4y0j4Q33gK21y4h8J6hqsWsy6ek cYRLyMELLG23dEeRkIVB2rkHAr6y/YZ/4JM6f48+C118ZvjZrN74O+GNhanUoIIRsvdTt1w3mkkM Uif7qhVMkm4bdoKs3kf7TH7W/wAOPFvhbU/Bvwv+Cvgvwj4XmKJBrGoQyX3iNgkqSCQXTuTCWKYZ Rv8AlZl3EE149Gvg6lZ4fC0VLla5mklGLXn1a7K572Iw2Op0FisZWcHJPlTbcmmrPRbJ2WraOc8b ft+fEf4i6fF/bN34f1DWo7YWUniCXw/ZNrV1ahDH5Et2YvMdChKNk5dSVYsrMDe13/gpB8VvEnij SNdvNT8OS634fsBpulagfC+mfadNgCsqpC/kZTaHfaRgruJGK8K6V6t4F/YZ+MnxM0OPU9D+GXja /wBNmAaK6XSZkhnU8gozKA491yK76uFwFJJ1YwivNJb7rU82hjcyrtxoylLa9rvbZ6Fuz/br+IkH w/0Dw/Pe6NqA8JRC38PanfaLa3OqaBEAAI7W5eMyRhcDaQcoQChUqpGd4T/bG8d+C/gdd/DiwvdG /wCEQv73+0bqyudBsbs3NxuDCWR5YWd2G1QCScBQBwBXDeOvh34g+GHiBtK8TaHrPh3VEUSNZ6nZ S2dwFOcExyKrAHB5x2qhpGj3niDVILGwtLm+vbpxHBb28bSyzMeiqqglj7AZrSODwjhzKEWr32Vr 73/UyeOxyqcrnJStbrezsrfge1eL/wDgo98XvGuux6tc+IrC21yDTf7Gh1ex0Sws9StrPDDyIrmK FZY1w7fcYHk81zPw+/a38ZeAPAsXhVpNH8Q+GLW9bUbPS9f0uDU7ewum6zwiVS0ZPOVB2NuJZSTm tST/AIJ9fHKPw9/ajfCXx/8AZAu4j+xLjzducZ8rb5nv93pz05rzHSPBup654wtfD9vZTnWru8XT 4rSQeVIbhnEYjIbG1t5A+bGD1xWVGll84uNJQaW9raW9NjetWzOE1KrKSb2vfW9u/fQv/FX4teI/ jh49v/FHi3V7vXNe1Nw1xeXBG58AKoAACqoAACqAAAAAK56v1S+CH/BKq7134G+F/AvxG+F+neFv FPgfxLFr114ltXt7seL9FM2bq1eWJzJ5iLIqCNwOERkyS4Py/wD8FQv2UvF/gHx3efEyX4Waf8K/ AHiPUk0zR9Ltri13xFYSVaWGB2WJ5VikkKqNo5HJ+ZuDAcQYSrW+q0rK10tVZ22tZ63Wum1j0Mx4 axlDD/XarbvZu6d1fe99rPTU+TaKKK+iPlj8469Wn/bl+Ll5+ywnwSl8e69J8KY7oXq+HHlU2iyC TzgASN+wS/vAm7YH+bbnmvKaK/FnFPc/plNrY+noP20/ACf8ErX/AGfJvBvjB/EB8bnx6uvJr1st kL/7IbERm3NqXMH2bBK+YHMmTvCnaPorwv8A8FpPhH4fg+EFr/wqbx7GfhV8P9T8AWGrjxPZSanp QvFyNVsWNkFiv4XyEc/KEkbjODX5r0VhLDwe5aqyWx+lPiv/AILP/Cb4mfCTVvCniD4d/FSSPxP8 OdO+Geq3sniy0vb37JYarLfW1+JXtU827PmsZd6hJGAAEYyxyl/4Lc+GW/Z98bfC1vh34oPgy8+G tt8MfCsa+IbdbiwtYZXne9um+yESXM8xVnCYRFwqr8u9/wA66KPqlMft5n6YfEn/AILY/Cb4k+Mv i74ub4YfFTQfHHxq0bRY9c13Q/G1pYXul3WmwwRC10+YWJkt7O5WLE7FndxgbQBis/8Aa+/4LOfC v9vHwlr3h/4j/C34gNo0uuw+NdFTSvFVrBPp+rGwitbuxMjWbA2EpiDBirTIxZhkMI1/N+ihYWmn dDdeex+kvi3/AILkeCPGf7Oeg/CJvhNr2kfD+fwK/gbxBaWfiNJZIohdre21zYtLCzB7efIVZ3ff H8rMWPmDP8Mf8FqfBPhr4QeIPhl/wrrxdJ8P4vhdcfC3w3FFr9rDe28N1c/ar3UblvsrK1xNMsRC IAiKpHzH5j+dVFL6pTH7aZ9Z/Hr/AIKTadrvxg/Zy8d/DPw1rXhjxF+z54c0nQLRtc1OLUoNSOm3 L3FvIyRQwldzSyrINx3KV27CCT674d/4LHfDf4Mav8WPEnw4+GPjnRPGHxX8QaN47ll1DxVa3Wm6 Lr2nX89+kUUC2SySWLTzPuDSrI0bbAYiu9vzvoq3hoNWf9dSFVkndH1Z+3n+3r4P/aottcufDegf EzTdS8aaomuapbeI/HM2q6ToM2+V5bbTbVEiXyWeRSHuPMZFUIipy59g0n/gsN8OrbUdI0eX4eeO 4vBV18D3+CPiKNPENnJqE9okxnt7+1c2iokySNIGVwyMrjgFfm/POij6vC1g9rK9z9cvB37XfhSy /Zaf43ab9i+H9ppHwC1L4J+HrW48ZWeuaxc6ta6nYz6eHs47aGSOUrJNK8jKY2SMPsiGA/zr8Yv+ Cufh/wAZar8avH3h3wDqujfGD9ofw03hTxZd3Oqxz6LpNrKLdb17CERLKWuhbjKyuRDuYAycEfC9 FRHDRTuynWk1ZH3D+zJ/wVC+HnwP/ZX+Dfw/1f4e+M9Y1H4UfFKL4pfb7PxHbW0F/dxFAtv5bWjs sWyKPPzbslvmAwBf8Of8FdvDkHxD/aA0u88OfEXTfhf8fPEo8ZSpofieGz8SeF9W82WdprW6FuI5 InaZ4midBmIJ8+4Et8H0VX1eGrJ9rLY+8Lj/AIKs/De5/Z30LwFJ8OfiJJ/YnxV074ltqN344S/u 76SzsobAJNLNaszvJbxB2K7EErHy1jiCxL2Pib/guH4P1q+8d6nZ/D3xnpmrXXxji+OPg6SPxFav HYa4LP7O9vfA2mZrLeN2yLZIynb5iH5z+b1FL6rAft5n1Z+3l+3p4P8A2qLbXLnw3oHxN03UvGmq JrmqW3iPxzNquk6DNuleW20y1RIl8pnkUh7jzGRUCIqcufefHP8AwWw+GnxI+CnibwPe/DDx9o+g +NPh7png680nR/FVrBpHh+ewmilSXTbVrMiMXDwq0zyFnJbAB2Bm/NrNFN4eDSXYFWlds+1fHf8A wU+8F+Mf+CxOkftRp4D8UW+mWWr2PiC48PNrsDTy3lpCiIEn+zBVhYwxEqULY34fkY2de/4Kk/Cv VPAep6LF8N/iCn9p/G2P4ytK/imzPlzDcjWgAseU8uSTB67thzgEH4RopfV4aeQe2lqfq7Yf8HCn w20j4y6X410z4T/EHQbyx8e6r4x1DT9M8XWtvZ+KTqYHmvqeLLfcy2gaVLVcqqr5e5iVO75d+Pf7 cvwh+Kv7OHwA+GVl8OvHbaB8DNc1O4/4mfie3Z9f0zUdQW8u7eRobWMxTERpGkiEBAzkhjivkSii OFhF3QOtJqzOu+PHiXwh4v8AjN4l1PwD4bvPB/gy+v5ZdG0W61BtQm022J+SJ52G6Qgdzk84JbG4 8jRRW6VlYyCiiimAUUUUAFFFFABX6A/8ESfA+yw8d+JJI/8AWPbabA+OmA8kg/WKvz+r9ZP+CUng n/hEf2OtJumXbJr99c6i4xyPn8hT+KwqR7GvouF6PPjlL+VN/p+p8fx1ifZZVKP87S/X9D6Qrsfg H8So/g98ZvDfiaa3NzBo98k00a8u8ecPt/2tpOM9wK46vTv2PvF/hfwJ+0V4c1TxjbxXGgwSuJmm j82OB2jZY5WTB3BXKn2xkZxiv0bMrfVal4uXuvRbvTZep+M5Xf65StJRfMtXstVq/JH6K+G1+DX7 Snj3RvHGl6hpF94ps4GS3lgvfJu1Ro2UpLBuBJCu33lyOxxXmPxr/Yk8R/Db9n3WtP8Ahh448Rf2 IYZbi40G7kjliu4SpMiQyqisu5c/LyHyQTzVf4h/C9fFH7b3gfxf4K8PQXXhRtLlW51jSBHLaTym C5C7vKJAIUxruIGdyjoBnkP2YvHWq/sMfs+eLpfiBdNp95qm0+HPDdzMr3LShZN8nlgkxxuzx7iw AHlk4yRn8jw9CpBRqYWpzP3WqctXu1b5b7KyfQ/bMRiqNRzpYylyr306sfdWii7+fNta726mD8C/ 26fA3w2/YtvvAt9ot9JrZsry1aGOJWg1BrgyYkeQtkDDqGyMgD5QeAOx/wCCN2l6rYaH451G5W4h 8PzvarA8pKwyTIJTIVzxkKU3H3X04+U/C/wv8f8Awx0DSfiXaeHr+DR7OZLm21KS3WWAEPhXZDn5 C2ACw2nIx1r60/Yc/aXvv2xdU1rwB8QtM0rWLOLT21CB4rYQDYsiRvGyqQOfNUjAGMHOeMfQZ9ga dLB154VKUZyTm73cWndpLy82fM8N5lVq4/DwxjcZQi1TjaykmtG3vr6HzX+314w0Dxz+1R4nv/Dh hmsS0UUtxAQYrqdI1SSRccEbhjI6kE85rzT4cX0Ol/EPQbm4kWG3t9Rt5ZZGOFRVlUkn2AFfRv7Q H7F/hP4Y/tmeFvCv9qyaT4O8WbbjdNMPMsRudWhEj54ZlUKzZI3gHOMmx/wUN/Ym8M/s5+E9A8Q+ FJr2Ozv7s2FzbXE3nguUaRJEbGRwjggkg/LjHOfcy/OcDGjh8DByftI2Ta7K2vnofP5lkePeIxOY zUV7OV2k+raei6rVamp8V/8AgrH41sPiRrVt4YtvDUmgWt3JBYyzW8kz3ESMVEpYSAEPjcMAYBA7 ZPV/Dn/goP8AEC6+Bfizx14ni0C1060A0rQ47e1eOTUNSkGRyzsDHGmXYcZ6A8EV8YfDH4d6l8Wf H+k+HNIj83UNWuFgjBztQHlnb0VVDMT2CmvSP2x/H+my+JNL8BeGnDeFPh3C2nWzqNv267yPtNw2 OCXkBGR6ZHDVyYnh7L1Up4KlTXNo5O2qiv1k9PS76HVhOJ8z9lUx1as+W7UY30cn+kVr9x9Rf8E9 fiV498BfA3Vtc8aWsI+HtuLrVodUvLhhfAEl5PLiCkyo77iMlSWZsFsgV7T8Mo/hb8bdbufHXgS4 0QeJprV4JdRtIlW8t/M25M0LY+f5QMyLnAIBwa868E+MtK/a0/YHuvCfhS8s4/EdvoEVhJpgkWGS CaFEAXaekblMK33cNgkYOPnH9hD9n74ieDv2oNL1K80PW/DemaK0p1a7vYXtbcweW26MswCyBjt4 GR0boM18hVwVPE/WsRUn7GpFv3dk15p73+59tT7mjmVTC/U8LCLr0ppe+9XF36NbWWv6lX9oD9ln xbZ/tk+HtF8aa3J4gTxvqMKxawV8s3EHmKki7BxG6KcbF+UApjg8fSP/AAU+vk+E/wCyFYaFoEMe m6ZfajbaSYYP3aR26xyy7AB2JhUH1yc5rxv/AIKE/te6R4h/aA8DXHhK5h1Q/Dq5e8e6gkzBczNJ CxiVxkMoEKgsMg7yOcV7B+1Xqenft4fsdDUPAk39rajpN1BqbaYjg3kTqrxyRNGOd4WViB0bb8uc jPdWlim8BXxceWC30slro2tldW/E86isHFZlhsDLmqPVa3bVrtJ7uzujzP8A4I4eLrqPxf4x0Eyu 1hNaQ6gIicokiv5ZYehZWAPrsHoK82/b8+HOifAn9saK6t9KgudG1FbXXJ9MDeXDMplZZoQQPkWR oX6DjecDGBXsn/BM34SX/wCz1pfi7x149hfwlYyW8dnb/wBqA2shRWLysyPhgMqgXIy3zYHr80ft q/H+D9pD496jr1iki6TbRJp+neYu13gj3HeR23OzsB1AYA8ivWwFN1+IK1ShrS5bSa2ei0uuv5Hi 5jVjh+GcPTxGlbmvFPdK71s+nqdh4p/bwj8ZX/xDt9S8KW954e8YWEFlp2mvcgJozW8ZSKRCExkb i5ChfmCgEAV87Y4zSUV9ngstw+FuqEbJ26voklv5ff1Pg8dmeJxjTxEua22i6u72W2unYKKKivry PTrKa4lO2KBGkc+igZP6V3nnnzL+0Zr/APbvxWvwG3R2IS1T/gIy3/jxavZf+CQP7QXhn9m39uDQ dd8XXcem6JfWlzpkt9KcRWLzINkkh7JuUKT0UNk8A1806xqcmtavdXkp/eXczzP9WYk/qa+rf+CM fw4+FXxX/a0l0P4p22n38F5pUq6LZ6jIEs7u88yMbG5G6TyzJsU8Eg/xBa8HPHD6jVdRNx5Xe2/y Po+HFUWYUfZNJ8ytzbfP1P1J8Yf8Eufh58Svid8Q/iBoGvalp+ofFjw1e6HqBt5IrqwxdiPddxDA O8+WDjeVJJ4FfLH/AAUj+Cn7RP7Ln7BaeCbbxbonjr4R6TBb6bfXcGjmz1myso3QQRzfvHVoFKxo XT5sAbvlJrA8bfDmf9mr9tr9o3w/8OLPxd4W8LQfDHUrvSbe3NzBarfGC0dnsuRnEjvtK8hi4U7c V2Wn/tQeMPhz/wAEVfFifHbULuXxZ4vhv9D8LWurlhrGpWssUcUcsiviRzG7yuZG6osZJJYbvzWh TxFKdGqpqpG8bRaV9VpbezS89D9ZxVbCVadanKDpTtO8k3bR69k035H03+zr4O0f9kj/AIJQ6cHu p9Gt9P8ABEms6lf6dCJbiO4ntTcTTRqSN7q8h27iM7VHA6fGn/BOj4G/sg/t132teDLX4ZeJ9G8T aNYi8iutR8SXUtxfwBljeZfKkSIOrMmU8rHzgjIzj6Z/ZT+Ldj/wUF/4JN6n4U0XULd/F9v4Om8K 6haOyxyQXqWjQxSMo6Ry7UcMOMMwGCpA+PP+Dez4K+I7f9sHxVr13pWo2Gm+GtEuNMvXuIXh8q8l mh227AgfOFSRip5G0EjpSwsJ08PjKtWcoVYyvo2uul+99RYupCricDRpU4zoyjbVJ2Vlf0sfOP8A wUr/AGHpf2Dv2jZfDFveTal4e1O0TUtGu5sec8DMyGOTAA8xHRgcdRtbA3YHn/7Jfwrg+OP7T3gD wjd7fsPiDXrOzuwSR+4aZfNxjvs3Y98cjrX6Lftq+FvDP/BWP/gp9oPwu0TxTbWeh+A9BuTqerWg W4M84lDTQQc7HZd0Sk5IBEvB24r56/a2/ZFl/wCCP37Y3wu8T6frVx4n8PNfQ6zbPLAiXR+yzx/a bd1ztOUZdrgr/rMcFdx+vwGcSq4SOFqu1eUG0reTs+12lc+IzDIY0sdPGUVfDQmk3daaq6tvZNn6 Lf8ABY/xv4C+F37Ielad41tNdufC9/rdpaf2LoTpatqawpJKlu0p4hhUxo5Kgn90qgDO5fC/2cf+ CdP7Lv8AwUZ/ZXm8R/Dzwtrvw/1pJpdPmlbWbq9n028jVW2yJNK8ciMro2VCkq/8JGB2X/Ba7R4P 2tv+CcuieOvAd0viLRtH1W118yWamUyWbxSwO20DIaNpULg8oEfdjacQf8EGtCb9n/8AYM8T+MfG UyeHNA1bWptVhutQkMEP2OO3hj+0ZbACs6uAw+9tHXivjMO5YfKVXo1JRqqdrJta9muunc+9xXJi c6+r16UZUXC/M0np3T6feeB/8EZf+Cctnqf7WXxEuviJplrqUvwevl0y3tJcSWs2omSUeftP31jW Hcu4YJlRuq8cb/wXN/an8X3P7d194W0zX9b0fS/AVrZxWkNndvboLiaCO6acbCCX/fIu48jyxj39 r/4Jg/8ABSDwv4j/AOCg3xjttVu49H0n4t6vHd+HZroCNGlgaSKOJ2PKyTQshAPG9NowWAbwD/gu 98B9e8Nf8FAL/X49Pvrqx+IVrZS6bJFCZFnnigitGgTaOZMwqdvX94vqK97Byq1M7vmC+wuVPa9l e343PnMdGjT4ftlbv+8ak1u1d2vb/t0/QST4N6f/AMFR/wDglr4Wu/FVnbXfi/UPDYudP1XyR59r qcSFPNU8ELJJH86A4YMR2BHE/wDBBn9jbw/8Nf2ZrH4qXunW9z4x8ZmdoLuVQ76fYpK0SRRf3N5j Z2I5IZQfu4ru/Dvxasf+CYv/AASr8JP4ynjsPEml+HBFaaVNIPtNzqcyNKLVQMklJHw5GQqoxPAz XIf8EHv2uNA+KP7KOnfDafUIYfF/gbz4ms5SqSXdm8zyxzRj+NU8zy2xyCgLfeBPzdWWK+o11Rv7 L2mltra3t5bH1dJYJ5hhnXt7f2bvffm0tfz3Pzf+Gn/BQXx/qH7f+l/El/EmtH+0/EsbT2Ul0/2f 7BLOENoYwdvliFtoAHBAI+YZr77/AOC/37H+g+If2fR8X9MsbfT/ABV4WvLaHULqCMI2oWk0iwqJ SMZdJXi2uckAsO4x+dfwx/Yw8YQf8FBNN+FA0fU21XSvE0cN0/kn9zZRXCl7wnGPK8oeYG6EEYyS BX6P/wDBwB+1p4e8G/szv8KLe9gu/FXi+4tZrq0jfL2NlDMs4lkA+7vkijVQcFhuI+7X0uPUY5ng /qPbW38um/la58nljk8ox39oX3dub+bXa/nY+K/gR/wUd8M/s+fAPwommWHiLVfihfeKLe98catq LrcDU9ItpmdLKGV3ZvLeMxqUIADLIT1Q14j+2d8V/CXxI+NWsN8NF8RaX8N2nW40rRtSmIisJGQe b5MIdlijMhfaoPCnHAwB5HRX12HyjD0a7xEL8zvfXTX/AC2XZHw2Kz3E18OsLUtyq1tNdFrr59Qo oor1Dxz8469Al/ZS+JVv+zvH8Wn8DeJl+Gkt+dLTxKbB/wCzmuAdu0S4xjeCm77u8FM7gRXn9fS2 pf8ABWL4xax/wTvh/ZgudT0eX4XwXKTIh09ft4jS6F2sHn5/1QuBv+7uzxu28V+KVHLTlP6aio63 PTfhL8JvgX4T/wCCQunfG7xd8KtW8X+LYPilJ8PrzyPF9xpkV3A2nNqK3KqsbrHIqlYQNrKdm85J IqT9pD/gjxcSaP4D+JPwg1cS/BT4leEn8XLq/i++hsh4MWGeK1ubPULpQIZHW5miijaNQ8pcgRDY zHP+GXx8+A2uf8EkIPgV4u8b+P8Aw94tl+JZ+Ic1zp3g2HUrS3A086f9kBa+hMhKDzQ/yAFghXjf X0B8IP8AgvN4X8N/C2f4D6RJ41+F3wl03wjY+HPCni20sLTVdd0m/t7w3U2pXlmSIpI7tnIlhikJ jVRsZ2O4ccnUTbhffz2/rsdEVBpJ9vxPlyy/4Ir/ABwXxMNK1a38H+GJ9R1eLRPD8ms+Ibe0h8X3 MltFdRjTXJIuFaC4t3DfKCZ0T/WbkVfhH/wRN+PXxt8LaVf6Jo3h5b/VbXT9SGi3muW9rqlpYX83 kWd7PC5HlQzSYCbiHYMGCbfmr608B/8ABaT4e6ToVrZeL/id8Svip4dsp3j8V+F/GvgPTr+x8dwJ FDFbyWG25H9kzJtlVWz8sZjJMjx7W81+LP8AwUx+EHxB/aM+H/7RsGs/E7TfHmlWvhm18RfDzTrS O003UrvR5LVxcNf+cyyWJFtGy2xgEjSRj5ogfMVRqV30/Afs6fc+cdW/4JQ/GWz0HU72x0jRNdk0 r4h/8KvmsdK1m3ur7+3PNuIRCYA29EZ7Z8PIFBVkYfKSw67wT/wRD+OHxN8QWNj4Xb4f+JI79tSt Re6f4rs5bSK/0+ITXenNIWA+1JEwfauVZAzBiqMR9Y+Av+Cw/wABv2YfGvxA8T+EtU8e+MtW8Q/G uD4xWlpeeFYLC1kinW8iudLMhvHZZYYr1yLgptZ4xtjx81WPgv8A8Flfhh8Mf2m7XWvE/wAbPjf8 Q/A9sdV1PTNMn8G2FjbaM95p91Yx2zxJcb57qNLo7rgOke2EqEcyhoU61fWy/BgqdPqz5y/Zd/4I a+Mvix+0R8PvDnijxJ4Oh8FfEHQ9Z1mw8R+GfFGnarDdHToJTPBAVk2yyxTrEsoTKokhbdgZHmXg P/gkb8WPiNY6XJpl38PZZvFVzdWXhK2/4S6xaTxtNbD9+mmFZClxsfEeSyqZDsBLAgfUP7IH/BTr 4Ffssaf+y3YHWvHmtxfCeTxnpfiKb/hGIrYC08QRFFuoR9scu0DpHujx86s5BDKFbD8P/t+/ASTV /wBm3UNX8SfECVv2Rbt00tbTwrFZyfEK0S9S8tSqi9kFjKJVZJfMdw8eHGHYwq1UrXf+X9eQuSnb /g+h8xeN/wDgmP8AE/4cfBa+8Y68vhnSZ9M8P2/iu88NXOrxx+IrXSbi6jtYbx7I/OsbSTR5BO5Q 4LKuQKl+DX/BLT4ufHb4G2HjzQNP0J7DXrLVdR0HTrnVoYdU8R22lkDUJbOAnMiwc7gSpO07Q3f6 v/bc/wCCvnw5/am/Zz8faTqV1rPjceL9Mtz4c8L694Vtobz4fa20sFxd3dprUcxlewEhuhHbMrEh 0jKxRJ81r/gn5/wUr/Z0/Ze+Dnwjtp7nxf4Z13TNG8Q+HvG9va+ErXVJtVm1KOaOG/GoPOk0drCJ EP2SFRuYEsGYCRm6lbkvbW/6C9nDmtfQ5v8A4JGf8E4I9c8cRzfF7wj8ONV0Tx34C1TxToek61rT ReI4bWGxupbTU7azjmQmCWaNeZVYsih1UJlz53+0B/wTC8Xay3wtt/Dvw+8KeAdMj+Flr4r8S+Kj 43TVNCvojdXER1e4u+Y7UzsI0S3jL8lQm75tvv3gz/gqN+z7rv7WHgP44eKfEnj/AE7xBoXw5uPh nqmg6d4PhmgkK6bdWMWqxSteqEikjljY2uGeN8rvZfnD/GX/AAVF/Z0+KP7I2lfATU9a+IFp4c1v 4U6J4F1TxKvhiLzdE1LRdQkv7O7FuLotPbSvPIkiKyuvlKRu3fLlzVefmt+Zpy0+W1zxXxt/wR8+ Kvwx/ZZu/Dt78F9P1f4n3/xP07w7p+v6Z4vS7vTHc6fLLBYjTUOxYZhsuRcyMjBHXcqqrFeF8If8 EVPjL8SvHOhaJ4Vvfhv4pTX9YufDkOp6X4us5tPh1a3iM0unSSFgRciFWlCKGDorMhYK2Pqf9jX/ AILBfA79h34LWVrp+sfFz4i+KNL+Itn4tuJNf023V9ZgTSZdHnCTfaHMH7idpYUfzSnkpGXOdy0v +Cb/APwVA/Z//wCCbB0DwppfiLx74t8KzePP+E+1XVJPCsUNzbQxafLaWmmJEbrm43TNJNcKfLAj VEDhyy37Suk7L8GTyU21dnyjP/wRz+N1zrXw2stH07wp4pf4o6hd6Ppc2g+JbLUba0v7SIzXdpdT RSGOKWCJXd/mI2oxUtivYv2Uv+CfA+FGj/GDTfid4P8AAvjTS9d+BniT4g+BfFun6jLfQrPYQNGk 1pJFKsZ2Su4dJoiweOMjAHzd1+zB/wAFBf2Wvhv8I/AHg/xtcePfFVr4b+JniPxbJv8ADESWkUV/ YvaWk0sX2tjOsbRwyvB0cSlTuCFZOk1D/gqn8APEPws0nR9U8afEG91LSvhD4x+FUl1D4As7JLqT VLhZLa+jtobxYYIFViogUgqIwPlyKbqVXo1p6DjCmtbnxxof/BH/AOOnirQLRtH8OadrHiaWPS7i 68JWmqQP4h0m21OSOOxuLq0LAwRytNB98hoxMrSKi7ivnv7Tf7GXiX9lrR9B1LV9Z8F+INL8RXl/ p1reeHNbi1OFLqxMAuoJCmDHIn2mHhgMhwRkEE/or4y/4Ln+D/it8VNI+Imo/Fn47eDLHW7bT7LX /h54Z0TT1XSriCO3WW6ttUaVHktS0PmpCUWTzQMkIAD8pf8ABU79uDwn+2FoXgGK2u7Xxt8QtBkv pPEXj+PwhD4Wl8SQzC3+zRTWsMrrJPF5c2+Yhclwq7lXe2lOdVzSktCJxpqLcXqfHdFFFdhzBRRR QAUUUUAFFFFABRRRQAUUUUAFFFFACxjMg+tfuJ+z54J/4Vv8C/CGgmPy5NL0i1glXGP3oiXzD9S+ 4/jX4oeBLzT9P8baRPrCzSaVDewyXiQqHkaASKZAoJALbc4BIGe4r9Lj/wAFk/hSAR/ZvjUY/wCn G3/+P19bwtisNh5TqV5qLdkr/j+h8Bx3gMZi4UqWFg5JXbt8kv1PrCivlFP+Cx/wnfObDxkuPWxg /pPR/wAPjfhP/wA+XjH/AMAIf/j1fZf23gf+fi+8/N/9WM1/58y+4+7f2aPi1b/BP4xaVr99/aD6 faecLiGzwZJd0EiLwzKpwzg8njmuEuLiS6uHlld5JJDuZ3YszH1JPWvlMf8ABYf4SqufI8W/+C+L /wCO05P+CwXwkkzmPxWmPXT4+fykrCOY5cqrrKortJb9F/w7N55JnLpRoOjLli21p1aX+R+t/hP9 urw18R/2Qrj4a+JLo+E9YTTYtKi1M2Ut3ZyxR7FDFIQZFfy1wRtxuII4+URfsr/GD4NfsX2Or61F 4svvHHibUoBbLHY6PPapBEG3eWpmC53MFLMT/CMDjn8lv+Hv3wh9PFP/AIL1/wDjlS/8PePhAv8A y18S/wDguH/xdeDLAZQ4Towr8sJvmlFNWb06tN28kz6KGKz6M6deWF5qkI8sZNO6XonZv1R96fHf 48Xn7XXxyi1fXbq08O2E7JZW+/zJodLtgxOW2KWc/MWYheSegGMJ8evi9pOseEPD3gTwi92/hDwp 5kq3V0nlz6tdyMTJdMn8C44RDyqk55OB8HJ/wV1+D8gObjxCn103r+TU4/8ABXD4PD/l71//AMFp /wDiq9alUyuDp8lRKNP4Y3Vk9r927d3+J49XBZ5UVT2lGTlUfvOzu1dO3ZLS+x+g37PPxZ8O/AP4 S+LtetdQaT4kavD/AGTpFssEmNMgfHm3JkK7N5HCgMWBUcYY48Xxn+GvmYf8Fa/g4R/x/wCuf+Cx v8aI/wDgrV8G366nrKfXTH5/KtsPjcvpVJ1lVTlN63a6KyS8l+epz4nKc3rUqdF0JKME0kovq7tv zfc+ntO1G40e8jubSea1uITmOWJyjofUEcitDV/Huua/YtbX2tate27EExXF3JIhI6HDEivlU/8A BWT4ND/mK6x/4LJKkX/gq78GO2uap/4LJv8A4muh5ll7fM5xv6o5o5Hm8U4qlO3oz6Pq1pWsXehX i3FjdXFncJwssErRuvryDmvmiP8A4KtfBaTOdf1FPrpc/P5LS/8AD1f4K/8AQw6h/wCCu4/+Iq5Z pgZKzqR+9ERyDNYvmjRnf0f+R9O634q1TxMUOpalf6gYgdn2m4eXZnrjcTis6vnn/h6j8E/+hou/ /BVdf/G6dH/wVN+CTA58V3CY9dKu+fyjohmmBirRqRXzQp5FmsnedGbfo/8AI+hKK+fR/wAFSPgh n/kbpv8AwVXf/wAaqUf8FP8A4GsmT41wfQ6Rff8AxmrWa4L/AJ+x+9f5k/2BmX/Pif8A4Cz32uO+ P2vf2B8KdUYNiS7QWqe+84Yf987q82H/AAU++Bh6+OAPrpF//wDGK82/aO/4KF/Cnx1pOm2Wj+Kx dxRzNPOf7Ou4wpAwn3ohn7zdKJZpg7aVY/ev8wjkOZX1oT/8Bf8AkZVFedf8NY/D7/oYV/8AAO4/ +N0f8NY/D7/oYV/8A7j/AON1zPM8J1qR+9f5nSskzFaqjP8A8Bf+R94fscf8FFvGnwr0fx/p/iP4 o+L4rOfwXqNv4chuL26vFh1ZvK+zeV9/yjw+GO1Bk5Izz82+PfiN4h+KviKTV/E+uav4h1WRQr3m p3kl3OyjJC75CTgZOBnAya8h/wCGsvh9/wBDAv8A4BXH/wAbo/4ax+H+P+RgX/wDuP8A43XFRnlt KrKtTlBOVuqO+vh85r0Y0KlKbjG9rqXX/Loex/DX4q+Jvg34ni1nwnr+s+HNWi4W7027e2lxnJUl CNynupyD0INemeO/+CjPxz+JfhufSNZ+J/iu4065G2aCO7+ziZe6sYwpZT3Ukg+lfKA/aw+H5H/I wL/4B3H/AMbo/wCGsfh+T/yMC/8AgHcf/G60qVstqSU6jg2urauZUsHnVKHs6cKii90lJL7j3/8A Zq8Kax4y+MukWug+LdP8CahC0lyNevNW/syPS440ZpJRNuDbggbCplmzgDrj1f8A4KPftcW37SPi 3wl4d0XW9Y8T+F/hrpI0ix1zVmke/wBfuGCG6vpPMJdfMdFCqxJCxgnBOB8U/wDDWXw+/wChhX/w CuP/AI3QP2sfh+f+ZgXj/pzuP/jdZzq4GeJjiZVI3irLVaX3d99tOyN4YTNIYWWFjQmlNpydnqla yta2+re59C/Bb9qr4kfs5tP/AMIP418Q+G4rjJmt7S7ZbeU/3miOYy3HDFcjsas/Gr9sP4o/tE6f FZ+NvHXiPxDYwkMlpcXbC2DDkN5S4Qt/tEZ96+cR+1j8Pz/zMK/+Adx/8boP7WXw+H/Mwr/4BXH/ AMbrT22WOp7VuHN3ur/fuYLB50qfsVCpy9rSt92x6LXtfgj/AIKO/HX4eaDFpmk/FHxdFYwDEUc1 2bkxD+6plDEKOwBwPSvk/wD4ay+H3/QwL/4BXH/xug/tYfD8f8zAv/gHcf8AxurrYjLqytWlCS82 n+ZOHy/OKGtGnUjfsmvyR7X8U/jR4t+N/iA6t4w8Sa14m1DBCz6jeSXLRg/wpuJCrwPlXA46Vj+G vFGp+C9dttU0bUb7SdTsn8y3vLK4eCeBsEZR0IZTgnkHvXln/DWPw/z/AMjAv/gHcf8Axuj/AIax +H2cf8JCv/gHcf8AxuqjjcBGHs4zgl2urESyvNZT9rKlUct72d/vsfXs3/BT39oGbRzYH4r+L/IM fk7lugs2MYz5oHmbv9rdn3rxLXvEN/4r1i41HVL671LULx/MnurqZpppm/vM7Esx9ya8v/4ax+H/ AP0MK/8AgHcf/G6D+1j8PwP+RgX/AMA7j/43WdGtltFt0pQjfs0vyNcRgc5rxUa0KkrbXUn+Z6LR XnX/AA1j8Pv+hhX/AMA7j/43R/w1j8Pv+hhX/wAA7j/43XR/aeE/5+R+9f5nL/YeYf8APiX/AIC/ 8j0WivOv+Gsfh9/0MK/+Adx/8boo/tPCf8/I/ev8w/sPMP8AnxL/AMBf+R8UUUVdbw1qS+GxrP2C +/sg3P2MX3kN9mM+3eYvMxt37SG25zjnGK/JD+hUilRX23+zT+wl8DvH37BHhX4w+OvEvxV0281r 4mD4Y31todjZXMNrdS2pvIruNJCHkiELRqyZDl920EYr03/go1/wRc0n9lf4QeGPDngPTfEvjT4v f8LJufAV69jcm8g18R6Va38c9varGGt2Zbpd8ZeTyzG48xgN1YPEQUuVmioytzH5r0V7un/BMD9o S48X3+g23wi8bX+q6bpA16WGxsDdh7Eh8TxtFuWVSUdR5ZYllZQNwxXH/HT9lfx3+yZ8QNK0L4re EPEPhCfUYItQjhuIVWS7s3YjzYWyUfowBBIDAg4xitFUi9EyXCS1aPODRX6SeJf+CYH7Nvg/4mfD PRNS8V/HO20j4h/DXTfifda6mn6dPaeFdLvC6CS+VfnCROqiR03AeYuM18oW/wDwTM/aAutWisU+ Efjb7XNoX/CSrG2nspGm5mAumz91CbebGcE7MgcjMRrwfl6jlSkvM8Kor3iH/gl9+0Vd+BIfE0Hw W+Ilzod1YW2pQXMGizS/aLe5mMELIqgs5aQY2qCwDKxAVlJc3/BL39oNfiJpnhSP4S+MLnXdZgmu LOG2tRcRzpC22bEqExhoyRvUtuTcu4DcM0q0O6FyS7HgtFeyeLv+Cevxw8BeNfCPh3V/hb40stZ8 eI0mgWz6c7NqYQEyhCMruiUFpVJDRKMuEHNIn/BPz40y/FuTwMvw48St4li05dXeAQAwpYsDtuzc Z8kQEqyiXfsLqUzuG2n7SPcOSXY8cor0C5/ZT+JNl8f7P4WTeCfEUHxD1G9j0+10GS0ZLy5mkOI9 inhkbIZZAdhX5g23mul/aE/YK+Jn7MngGx8V+J9L0W48MX2pvof9raH4gsNcs7XU44/MksJpbOaV YblEyTG5BwCRkAmlzxulfcXK97HjVFeqX/7EHxc0v4EJ8Tbj4feJYfAr28d5/azWpEYtpHKR3JX7 627uCqzFRGxwAxJGfqP9jz/glBffEv8AZC+MfiXx78MfiDp3ibRfB48TeCNRS+WC31GSWa2ht7d7 HyjKTL5zSRuXUSKPlUgFip1oRV2xxpybtY+CKK9yn/YM+K3wk1TxNrHjn4R+Nm8M/C65sn8awqPs TafHP9nkSGScpIIZJI7qAj5HKiUMVwDj6e/bX/4If654d+I3x51f4RaN4kl8B/ChvDMWmWN5DJfX 2ttqWmwXNz5c6qqMbdnZ3+UDDgDBGKTrwTs3/Wn+ZSpSavY/O+ivYfE3/BP/AONngz4c2HizUvhj 4vttD1KS1hhm+wM8oa7bbah4VzLH57YERdFEhZQu7cuW/FX9gj4x/BTxB4Y0rxP8Ptf0zUfGd9Jp miwGNJn1G7jaNZLdPLZv3qtNGGQ4YFxkDmrVSPcnkfY8gor1bxJ+w38YvBuo+M7TVvhp4z066+Hd nDqHiaK40uWN9DtpQTHNOCPkRgrYY8fKfSun+Cv/AATI+Mv7QXgLR/EHhjw5ps8XilLmTw3p93r1 hY6r4qW2LC5bTrOeZJ7sRbH3GJG+6QMkEUOrBK9xKEm7WPAqK9M+Av7G3xU/akXXT8O/APifxh/w jKxtqg0yyaY2XmPsQOByCWyMcngnoDXW+M/+CX37Qvw80rxbf618IPG+nWHgeyXUtaupdPPkWtsY 1lM6uPlljWN1Z2jLCNWBfaKHVinZsFTk1dI8Gor2LQP+Cf3xr8WfDjTPFum/DPxbe6BrLW4sriGy ZmuUuJRDBMsf+s8mSRlRZtvlszABskCrfxv/AOCb/wAeP2a/h9feK/Hnwq8Y+F/D2mX66bd399ZF IbadyQgcjJVWIKq5Gxm+UMTxS9rC9rofs5WvY8Sor3XUv+CZP7QGkpoZn+EnjVX8RTw2tlCtgzzC aaPzYopYxl4HeP5lWYIWAJAODizq3/BLL9orw/4gstL1H4PeN9Ou9QN75f2uwMEKi0lEVw8krkRx IrvGu52VW82PaW3puPaw7oOSXY8Bor3Tw7/wTO+Pvim88Q21n8KfF7XPha8m0/UoZbUQSRXEMayy xorkGVkjdJG8sNtSRGOFdSfSv2Lv2FtJ/bL/AGEvjTq3hbwj4u1z4wfD7U/D8OlfYdSWW0vodRup o5Q1r5IMfkx2zsZGmK4kYkKFFJ1oJXv/AExqnJu1j5Bor23wl/wTg+O3jj4k+JPCGm/C3xdL4k8I XcdhrFjJZ+Q9jcSgmGFjIVUySqN0aqSZF+ZAy81V+Gv/AAT6+Nfxf8MaprPhz4a+KtS0/Rri6s7p ha+VIs9qu65iWNyryPCOZFRWKfxAU/aw7oXJLseOUV9X/tD/APBGv43fAn4m+FfC1r4U1nxTe+J/ C9p4lM9lp8sNtp3m20c9xBPJLtWM25kVHdyq7mUcE4rwbX/2cPHvhf45yfDPUvCWu2Xj+G+XTm0K a1ZL0TsAVXYeoZSGDfdKEMDtINEasJK6YOm07NHE0V9ZfCT/AII8/FXxN+0f4l8AeOLKbwAvgLQL fxP4qvjbf2xLpVlcRxvbRxQWrMbi7nMsaRWysGZyQSu0keI/Hn4YWPhr4/3vhLwf4f8AiHbIs9vZ Wel+KNOW38QTTvHH8slrEDsZ5G+SNSx2sg3MTmhVYt2TE4NK7R53RX0d4R/4JZ/Gf/hoDwB4K8U/ DfxzpA8b6mtqstlpn26ZIY5VW8KKjbDNAhLNE7KynaG27ga9B/bf/wCCZlv8FdF+G7/DrwV+0Rea r8Ubny9N07xb4Wgs5raRYxvsQLd5GnumYiTG2LZHgFGbcUj28LpX3K9nK17HxhRXtWu/8E6vjh4b +JeheEbz4a+JF17xLbXF5pcUcSyw3sNuSLiRZ0Yw7YcHzCXxHxu25FcH8a/gP4w/Zx8eS+GPHPh7 UfDeuRQRXX2W7QAyQyoHilRgSrxspBDqSp9eDVqcW7JkuElujkaKKK0JCiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAUdDX2 Rq//AAWM8Q6x/wAEibX9kl/AXhWPRbW/W6TxHEzJeFFvvtuPKxt84yEqZd2TGSu3OWPxtRUTpxlb m6Fxk1e3U/Q/9nP9si1/Ze/4IsnRfAvxg8E+HfjHF8VX8bw6VJpk15qMOn/2YthsiaaykhjuzMiy BldcRHPmjLJXrf7An7Xnwov/ANnH4NL8Wfj/AC6P45tfib4k8XavNFeapHqge/0drSA3l7HDuiil mjZZpI5GcRzrgjcWT8laKxnhYyu77lxrtNeR+2/w1/bO+BejeFPA1tN8Y/hHoc3hn4K+N/hpPa6L bazHYWup3t2r2n2cTWrTNalHX99ISzFXPzHJr4T/AOCgnxM8EfEj9jH9kfw1oPxE8N+Ide8B+GL/ AEjxDb20d9u0h59Qa6jMhkt1BRYpVUhCzBkYBSACfjSiphhFGV0/6/phKu5K1v60/wAj9gfjb+1L 4a8deF/g/wDDvw9+1b8LdM+Fh+DeifC/4i6ddR626wS27/6be2US2W2Wby1QQu+0ErhlUHNdP4H/ AGt/2bpvjv8AATxppfxr8NaF4Q+HHwu8Q/CtLDWbTUm1ZZvK1CGzuZkitCq28kNxC/m8HcSuzcCB +K9FJ4NW3K9u+x+xvw//AOCnHws/Ze8Q/sYX1r8V7fX/AA94C8DX3gfx5Z+HBqSS2bXaymG9aCWG EXEVtKYZSp/eBkBRC6jEn/BHv4l+DfgT48+A37P1l408LfEvxXqvxd1Lx0dR0Hz59O0DT08O3Nmi CaWOMi4uHJdo1VtiRAPtcgV+N1d5+zt+0147/ZL+IY8XfDnxHeeFfEa20lmt/aRxtMkTlS6qXVgu do5GDjIzgkUPCLlaTCNd8ybP1F/4J6ft4/Bn/gnN+yHffAfxh8QPBXjrW/iJqGvX0PiTTtNutc8N +Bo7vSo7K3+0o8UU063EiMZoYkYrExDBWJrm/if+3H4Y+NH7InxF/Zo8UfFH4O2viLVNH0mHwxrH hPQZ9M8E6Uljq0l4+lG9KCZzMsnnBzAtvG8apvJJI/Lv4g/EDV/ip411LxFr92dQ1nV5zc3lyY0j M0h6ttQBR+AFY1NYWN+ZvXf5h9YduVLQ++Pj7+1B4S+LH7dH7Nem+Fvi7H4CtPgv4K0HwZqfxYtb O6YG7sklee8gRVE80KeZ9ni3ovmBPm/dtmuk/wCCk/jL4UeFf2HLf4b/AAc/aB8J+LvCcPi7/hKt R0MWer3XiTxXq80TQyale309vDBhIgMRKiAEklpHwa/OOir+rK6aexCq6PTc/Zn4aftYfs+eBfgX eaPbfFfwJ4ig8SfAjTvC8CeKpNZl1qbULG4huZtKvP3EtrZWKqksUEMAJcsSfNyrVgfE79pD4MfE r40/td/Ei3+OvgOz079pn4cfYfDOkX0OqDUtJulNgTZ36R2jxwNH5Dxptdw6hWU7c4/IWis1g43v f+v6RaxDtax+wv7Tv7UvwT+Ovi79r7xXY/G34f2DftL+BPDa+GtNuYdVNxp0+n/2eLm3vilkyQy7 raUIql9wwx2qQTe/aG/bK+Bfxc1H9q7QLT4rfDu9tPH0/wAPfFeiz6tDqiaXrEeiW8EF/p0hSykl E5MHyosTh0mUg8SBPxsop/VI93/Vv8g+sPsfs98Kv+CgHwS+H/8AwUP+Nf7QM/xp0+x8KfHvTbHS NC0y3026utY8M3LXGnM95fWrQGOMab9mkaPDOsu1fLDKTj5U/wCCpvxt8CftIeAfAOneF4/BV58W dV8T6jqOq2PwsOo/8IvrKXaWqQXrWN0gMGq3DptaOHc2yNRLhiiL8GVoeFPFOpeBvFGm63ot/d6V rGj3UV9Y3trKYp7OeJw8csbryrqyhgRyCAaccKou6ewnWclytH37/wAFSv2nYfFX7KPwyuNR0fV/ D3xt+L3hrTofigt/arb3F5DoNxd2FnPIhRXD3jxpK+QP+PCDHy16H/wTf+I/wp+E/wAEvhl481/9 qvwna/GDwLZajb+DtH8T2Gs3ekfDSO6eVZPLtYbYC6uW8ySTc0whQsg2TBFavzV+L/xj8V/H/wCI +qeL/G3iDVfE/ibWpjPe6jqNw0087dAMnoqgBVUYVVAUAAADmaHhk42vYXtnzcx94/8ABOL4u+B/ hlp37Yll4y+LXhu1vviF4C1TwnoWqahFf/8AFSXtxcrItyNkDssbiFmYyYYGVQV5OPovwF+1R8IN M+LHw2kvfjt4HbTtD/Zau/hbdOyas0NrrUkNxEqc2f8Aqz9oh+YDOIW+XCrn8g6KJYVSb1CNZpWs fsV8bf8AgpJ4F+I1xbeI/AvxG+Angfwv438D2HgHXNPvPB19ceLrJ4oIbeSz8xYQo07dDHKlzv8A 3SDIiaVBE+r8X/27vgbZftO/tdfEa2+Kvg3xTovxC8ReBPEmgaLDBqP2nXotD1Kzvbq1KvarGsjx W8kab3CFnAZkBLD8YKKSwaWz/r+kU8Q3uj9fvg7+2D8GPg7+0n+0B421T4veD/GGiftIeOdH1zQI Lm31AzaFa2+uHVJbrUozbsbaW0jAhhQF2kkKlcRZcTXX/BSH4e+L/jh+138PX+I3w817Q/i34jh8 UfDzWPGtjfan4MtAL2S6nsLmCSLdavKrxyeYkRj82BdzEqlfj3RR9Ui3dv8Ar+kH1h7WP2tj/wCC kPwt+Juk+GdQ+KvxS+DfxAsNLt7qfW7nStD1fw14q8FX4tYbWGTwvcRx75YZEtLeNkl2eYYxJIqR uVX4T/Yt8ZeC7T/gmn+0z4H1z4i+FPCXij4j6h4WGjafqa3266j068nnuHZoLeVQmJ125OSY2yBh Sfj6iqjhlFNJ9vw1Jddt3aP3P+On7b37O2u/GzxF490X45+DtZk/4SnwTrlzpOsSa4ujrY6Vpy20 95aWcFsBd6uJ43VFnDRKnkSHDKCnJ/EL9sH4E6drXjCHxD8Uvhb8QvBNz4g8Z+JbS/0pdV03xv4H utWv72a1TQ72G3T7RFcRPa+fFJlI5Xn3yGLaB+LlFQsHFaXZbxL7H7NfFP8Aah/Z/wDjl8Rtf+Ii /GzwlZ3/AIz+BukeF9N8K6pd61Zac1/ZGFru01z7Hb72izD+6hjlIuCjKylHUSfHn/BYb4ieBP2v v299C8UeDviR4OvvDvi3w1odnJqbQX1tbaJNb2MNpKLqP7N5kQ8yFyFRHIQqSBmviiiqp4WMHdMi VZyVmj9of2n/ANvX4VeOvi7+0boPgj476Hosvx68EeFLLw34u02TUbGLR9R0FIllsryYwRvbxXYa ZBIgdNoPmbc4Pzd+0x+2D8MPjP8Atrfsl22veO9Tni+D2j6Honj34o6N58l5qN3bXXmvPbyyIJpk tsBUuWUs+WdUYKm/876KIYSMev8AVrDlXbP3N8BftqfATwj8RvhTLdfGT4T2Fr8MvjrrHjTUjpja 5di802+smEVx9oubd5bu7ZwzTyF9okfAIG1a4j9jr/goF8C/2avh/rTeJ/id4X1mXUPjT4r1+3Nj a6lPfaLp+q6Q+mw6nAjWqhnSVi7KrBvJkdl3PiM/jTRUfUo7Nsr6y+iP1u/Yu/a6+Hf7Hn7HFv8A BCb4v/CjxF40XU9a8SiXV9Lu9Y8D3tteQWNiPD13L9nWTy7uJri5d4wqwyW0XmN9+NviT/gqh8Sv hx8UP2mLK9+GEipoVn4b06xvLO01K8v9H0q/jRhcWumSXarN9gjYgRjaEHzbPkKmvmyitoYZRlz3 M5VnKPLYKKKK3MgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiivtXVv+Ch/wAGtQ/4IzW37PkHwSsbT4sW+sLqLeN1it2M jC785rkykef5rW+bUp9wR4wcAKIqSatZXLik73Zh/s8/8Ey/C/xm/ZA8OfGDXPjbofgjTNf8an4f vbXvh28uRYas0LXESSyxZHlPBskMqqVTftPKmuj/AOCg/wDwR/n/AGCfgBoWrahr2q6v8Q38bT+B 9b0WOyjNnFdR2FveLJZyo7PPFLHdQlC6RvhsNGrcD1X9mP4qz/s4f8EI4dbs9M+Dvi3xNp3xrPjK 00TxTq9ldy2lgukLZrqCWAu45HlW6Ty1jdHb5i3lldrj6G/YX+NutftN/BH4IeOfH3xn8H6B8RdS +L/ifxVd399q2kNqU5m0H7LbRx20zGO3eV4JIIWljCRFEIXiNW4J1aifNfRNnTGEGkratH41ap8J PFeiazf6de+GPENnqGlW5vL21n06aOazhCbzLIhXcibfm3MAMc5xVPxR4F1zwTrq6XrWjaro+psq uLO9tJLech/ukI4DYbtxzX78fCD4qtomleBr+z8eeGfDmpWXwG8a+D9RW4+KWmaleQ69He5061uL 0XCC4ukEwZZAAiGVtuwEivzs/wCCqfxH13xR+yj+xp4t1DxvY+IPiFo/hO9t9U1S28U22pa3aXCa k9xZmaSKZ51ZIHiZGY/KTjIbIrSliXKSi1/X9IiVBRV7ny38fv2KfiP+zd8abb4f6/4fuLrxRfWV pqFpbaWrX32uO5tIrtBHsBLMsUq7lAypB7YJ5bwB8KtQ8QfF208Maloni03Ed35WpWGlaQ13q9vG hzNstmKEyKoY7WKgEckDNftj+2Z8Zrn4qav8dtQ8EfFPw2fFPxb+G/hGH4Q3Q8c2SXDrGLUa/Z2y GcvZXNykSxneIjO0RQMxGBynxz+Lml/FX9g6f4cfDfx34eh/a80fwX4RtvG+rxeLrOxu9atbF7x7 qxj1NpkilubXdbNc4uGLiIDBMJNJYqTSuv67jdCN9H/XY/N3/goB+wFN+yp+2Pd/C3wLP4l+IKLo ml61ayDRyl/JHd2EN0waCFpMbPNIOCcAdT1Pmv7LPwT0r44ftIeGfBPivX9Q8FaPq2oCy1LVodEn 1afSxyN32SH96537UwOhbJ4Br9hf+CgXxIT4o+BfjBpfwh+Ifhmf41+PYfAupw6jonjWwF54m0Sz 0mOC7t4bpLgYaK/VpZIy6u6rvAdASPMPCX7SHg7Vf+DkD4T+KPDXjbQrS10vSNJsPiL4mi12Cy0r XdSg04LqM32hpRHPGZFiVsMwkeFmG4AMVDEScNd7BKlFPTufllqXwL8TNrl7BpGgeJNasYWuntry HRrlBdW9u4WScIV3Kqh4y2fueYobBNZ/gf4fX3ilJNUk0vxFP4X0meL+29R0zTmuxpsDMNzE5WMN t3bQ7oGIxuA5H7reDf2gPEXgO9/ZDsrT4waDYWOl/GrxTL4tgh+Imn+Umhy6g8tstyq3WGtjaRz7 Y2yqgBcBioPkPxl+IGsfD/4b/DvVv2dfGXwh8N6B4GvPGmhfEzTta8Taa2lW13qV5NF9vurdZWN5 FNbMgt2gWZl8uOJU/wCWbCxUnpYfsEtbn56f8FGv2Dv+GMP2ltW8H+Fr3xB4z8N6do+j6sNYn0o2 7RjULO3nRZVjaREO+cIBuOSVHJ5PFeGf2abW5/Z9+I3izxDreseGfEvgqTSxp3h248M3cg1uO8kU O7XYxFa+XFJFIBID5olUL1BP64ftb+PJviJ4e/ar+Hvgzx94WuPE3izwP8Mdf8IQ23jnTba3M+jN brqk0U7XSwwXEH2ZWbLq5W3VhkKpr0f4m/G3wFqdx8fNS+Ivj/wX42+FXiC2+EOtf2enjOw1SPWo NOntm1ySO0E7PJIIrYeYnl+ZOsSqBIdoqVip8qT8v0/zH7GN20fkV4J/YQ0rxR/wTl+Ivxmu73x1 o3iPwDPowXTb/QEt9I1eDUrySGKa1uzKXlCJEzN+6UAumGIzXz34i8A674Q0vTL7VtE1fS7LWovt GnXF3ZyQRX8eFO+JmAEi4ZTlSR8w9RX7V+G/HX/CMeIf2mtS+NvxG8I+Mfhj4h+JXhDxz4c05PHu najDqPhe21y5uZ5rKwW5aRYlsvIHkLEHcReUiuybR4b+2P8AE+48L/sy/thw/FXxtpHjnT/ir400 2/8Ag3DD4mg1fzkTUbmd9QskikkNraJYNHEcrGpLRw4BXA0p15c1nrr/AJfkTOkrXR+e/gr9j34s fEv4V3vjjw78NPHeueDdOV2uNbsdCubiwiVN3mN5yoUITa28g4THzYrifCPgzWPiBrkemaDpOp65 qUwZo7TT7V7mdwoJYhEBY4AJOBwK/Yf/AIJzeE/HHhf4W/BL40an8Vfgf4i8XfDXwnf6N8PPBl/4 x0bQbTRbW9Fwhk1iUv580gW5dhbCLnZHvlRzJXzT/wAEm7afwt8OP2mxbeNdBg16zt9JhPh7T/F2 m+FpPE1vFqTSXFxBrE2Bb2dv5SSSfZSrSo6KGQFSaWIdpPt/mR7JaeZ8e/s7/Btfiz8ZNP0HWbPx fDo6T7NZn0LRjqV9pcWSplMLPGoVXxuLuoUbjyRg9z+35+xHf/sd/teeP/hzo413xPo3g3W10WDW H05oxeymHzAuF3KHIEhCBicRt6Gv1g/4KH+MdP8AHqeLpf2f/HHhDQPFM/xX0/4g+L7/AE3xzp2l trfh6TSLcWmoi4NygktYpVm3wFt6yP5rR4lV2t/tufFS7+JWi/tB6J4K+KvhaHWdF+OejfEPSbqD 4g2FtDZeHZLA2095bzi5ARBM0gkijPmfveUJcZxWKk5J20/4Y1VBJNH5m+Cv+CZ//C1v2P8Awh4r 8N3/AImHxP8AEPxXsvhXd+GdX0tLG1s7q6tZ7mOZZfMaQoFEIYvHHt/eHBABrwbxF+zX458O/FLx J4NHhjWtT17wpcT2+owabZS3fleTKYnlGxTmLcpw/wB05HPNfub8Xvjp4e+En7R2reM1+JPgez8P T/tbaF4qurvTvGmnSNN4fk0dbOW5dIrgu1uJZVWQEfKu5mUKrEeL/tOeJ/HmsfDvXvCXw9+KOm6X 8ZdH+OWoeK9dn/4WRYSSP4aYytpd3563hUWFqud9rvDQmTe8SiRWLhip312f9fgKdGPQ/HzRfhl4 l8T+Gr3W9N8P65qGjaYWF5f21hLLa2hVd7eZIqlUwvJyRgc9Kz9H8P3/AIjumg0+yu7+ZE3tHbQt K4UEAsQoJxkjn3Ffvp+1z+0f8JfiVY+MZPCHiXQPCvw0fQ/Ft3pnj3wX4yso7bTLu+S8hurHV/Ds r4vvt9xHK8Donmst3D5YUxGQfjl/wTg/bU1r9gP9sLwX8RtMur5NM02/ji1+xt5XVNX0uRgl1buo ZQ+YixUNkLIqNjKit6VeU4tpaoznSSaVzxafRr210yC/ltLqOyuSVhuGiZYpSCQQrYwSCD0PY13v j/8AY8+LHwo+GGneNfE3w18c6B4Q1Xb9l1jUNFuLeyl3fc/esgUb+q5I3jlcjmvpj/grX4pt/hd8 fdJ/Z1+Hfi+81zwL8K9dvry0l1G+ZLaTVdRvpLotK1zIYx9nhlt7dnlwA8dy7H94xr63/bC8EeMP hd+yX+0j4jvPih8Cvib8Qvj3Y6deePtRtPGGjw2WnQWBEq2ukabG7y3U+cIJpPKYbMpFvPmUniGl F9wVJarsfkZ4a+EPizxpbW02jeF/EWrQ3jSLbyWWmzTrOYxmQKUUhio5OOg61nX/AIP1fS/DdhrF 1pWpW2kao0iWV9LbOlteNGcOI5CNrlTwQpOD1r9a/wBgv40+L/Bf/BMD9mrTvD3xT0/w5qVh8fY9 T1OyHj2z02eHw7iIOs8T3KMLQzRyloXG1iCxQggn2vwN8ePCE3ir4h6n8aPHPgvxP4E8G/tSW/iP RbS58W6dqEWl6AkF3FbT2lus7EW0RnsSYoVztBBQkMBnLFNN6FxoJpan4eXfwY8YWGo29nP4T8Sw 3l3ZnUIIH0ydZJ7YDJnVSuWiAB+cDb71U1j4c+IfD2uWGmX+g61Y6lqscUtlaXFlLFPeJKdsbRoy hnDkYUqDuIwM1++/7K/7U+r+FP2p9P8ADPim5+FXgfRdP1DxL4gttcl+MkWv6hr9te6VcQJOjy3D pHYTXIsZFid0bzQhSIiOVo/Hvgl8avsH7M/wN1L4m/FDwpc/Ga28D/E3w34d8Sa341sdTv8Aw94i v5LZ9GlnuvOleAGKO9SOdzsiaRV3KXUEWKl1X9f0huhHo/60Pxx1T4R+K9E1q/0698MeIbTUNKtz d3trNp00c1nCE3mWRCu5E2fNuYAY56UH4R+LFbWl/wCEX8RbvDcYl1cf2dNnS0ILBp/l/dAgEgvg YB9K/cj9g/41XPw0/Zp0XwT44+ImlWnx00D4beOrXUri98eWQuLBbyRDotjczNdbZbkyiaWEFma3 RznyxKA3K/BL/go9qnxP/Zm+DnxCtH8CfED4meBNR1Oz+KE/ib4jR+FrawlkeO0gvry0idIdTsns EhhDpHOR5JRQ0jMCvrUtlH8Q9hHqz8XL74YeJtM8H23iG48O67b+H7ziDU5LCVLOf5tvyyldjfNx wevFe+f8EtP2DtN/b7/aR0vwX4gvfGvh7RtZke0g1vR9BXULO2uViaYR3MryosIZEKqQHJZ0+XHX 7n/4KjfEPQdS/Ya+I9hNr+neHtSgh8N6Po7eGPHVrrvhL4oWtm1tEj2ulszTaTcWsUW+RYVRAUdX 3GVa7f8AYU+JttN8UP2IfFvw/wDiL4R8K/A/wR4PfQPH+mS+K7PQlsvE7wXovJL20mmia4e5keBk kEb7lTdkBciniJODaVv+GuKNJKST1/4c/F608Ca5qPhG88QW+i6tPoOnSrBdalHaSPaW0jFQqPKB sViWXAJBO4eorpPg5+zD8S/2iodQk+H3w78c+Oo9JaNb5vD2g3WqCyMm4oJTBG2zdsbG7GdrY6Gv 1wi/aA0T4K/snfDS38F+H/hBrnhjwd8MLvwN8Q/7Y+JgtrDQtYkW7TUkudHt3kW/e5mYyQXFtDO0 7FQrbUBr5c/4Jy/F+P4T/soeEPCfijwr8edL8N/Fj4qi0s/F/gvxN/wjVsWFtbWpjE3kytcyRNMz eSfLRufnZoyEpYiTTaRPsoppNnwnf/DbxFpPj6bwpdaBrVt4ptrxtPm0eWylS/iuVba0DQFfMEgY FShXdnjFek/sxfsnQ/Gj4sav4e8beJZvhZp/h+3R9S1DUPD99qEtrNLdQWsFubWBDL5jy3CcEDCq 55ICn7T/AGaf2ebz9lz/AIK8/tH+A5/iz9u8R+GvC3iKysNSvNVstO1bxxczRxYsYtQvt8VpeSxy vvuDudPKlKjqR9geN/jwmmfB/wCM3iLwv8SPCmg3Wv8A7OPhzT9Jew+Jtjd3Da/ZTXEVysd2LnzJ 7mFYfL+1fek8rIY8VNTENWUettfUcKKerPxe/aF/ZauPg7+0HP8ADbw5q7/EfXrBFjun0XR7yNJL nazvFbxzIs8yLGFbzDEgPzEAqA7cVoHwj8WeK9Z1LTdK8L+IdS1HRtw1C1tNNmmmsdrFW81FUsmG BB3AYIxX7K/tE/EP/hOf2ftf0nw9490CX9pTx78FPh/Z2GsWXjKybUdYn06djrtgL2Of5Lsh4GZX kVrlI2CeYEcV6n4e/aH8Ian4G+G2k3/iLQdZ17Rrbw7YfEzxZ4T+JVloXiLwp4i02wjL6zO8sv2f WLGKO8WGYyF4xNaSj94zELP1mSjtf+tynQTe5/PtRXt37b37P0nwm8ZWPilfiD4I+IWm/EubUdc0 +80TUIpbxYBfSxCS+tkVRaSylS4iGVGWUYKMq+I13QkpK6OWSs7MKKKKoQUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFf2o/wDD qz9mH/o3H4Df+G/0n/4xR/w6s/Zh/wCjcfgN/wCG/wBJ/wDjFeX/AGnH+U7vqUu5/FdRX9qP/Dqz 9mH/AKNx+A3/AIb/AEn/AOMUf8OrP2Yf+jcfgN/4b/Sf/jFH9px/lD6lLufxXUV/aj/w6s/Zh/6N x+A3/hv9J/8AjFH/AA6s/Zh/6Nx+A3/hv9J/+MUf2nH+UPqUu5/FdRX9qP8Aw6s/Zh/6Nx+A3/hv 9J/+MUf8OrP2Yf8Ao3H4Df8Ahv8ASf8A4xR/acf5Q+pS7n8V1Ff2o/8ADqz9mH/o3H4Df+G/0n/4 xR/w6s/Zh/6Nx+A3/hv9J/8AjFH9px/lD6lLufxXUV/aj/w6s/Zh/wCjcfgN/wCG/wBJ/wDjFH/D qz9mH/o3H4Df+G/0n/4xR/acf5Q+pS7n8V1Ff2o/8OrP2Yf+jcfgN/4b/Sf/AIxR/wAOrP2YT/zb l8Bv/Df6T/8AGKP7Tj/KH1KXc/iuor+1H/h1Z+zD/wBG4/Ab/wAN/pP/AMYo/wCHVn7MP/RuPwG/ 8N/pP/xij+04/wAofUpdz+K6iv7Uf+HVn7MP/RuPwG/8N/pP/wAYo/4dWfsw/wDRuPwG/wDDf6T/ APGKP7Tj/KH1KXc/iuor+1H/AIdWfsw/9G4/Ab/w3+k//GKP+HVn7MP/AEbj8Bv/AA3+k/8Axij+ 04/yh9Sl3P4rqK/tR/4dWfsw/wDRuPwG/wDDf6T/APGKP+HVn7MP/RuPwG/8N/pP/wAYo/tOP8of Updz+K6vS/2WP2tfGX7G3jvU/EfgiXRotU1fRrnQ5zqek2+pRCCfYSyxzoyCRXjjdWx1TBypZT/Y N/w6s/Zh/wCjcfgN/wCG/wBJ/wDjFJ/w6t/Zg/6Nx+A3/hv9J/8AjFJ5lFq3KNYNp3ufxe+JPEd/ 4y8RX+r6reXOo6pqtzJeXl3cSGSa5mkYu8jseWZmJJJ6k1Rr+1H/AIdWfsw/9G4/Ab/w3+k//GKP +HVn7MP/AEbj8Bv/AA3+k/8AxihZnH+UX1KXc/iuor+1H/h1Z+zD/wBG4/Ab/wAN/pP/AMYo/wCH Vn7MP/RuPwG/8N/pP/xin/acf5Q+pS7n8V1Ff2o/8OrP2Yf+jcfgN/4b/Sf/AIxR/wAOrP2Yf+jc fgN/4b/Sf/jFH9px/lD6lLufxXUV/aj/AMOrP2Yf+jcfgN/4b/Sf/jFH/Dqz9mH/AKNx+A3/AIb/ AEn/AOMUf2nH+UPqUu5/FdRX9qP/AA6s/Zh/6Nx+A3/hv9J/+MUf8OrP2Yf+jcfgN/4b/Sf/AIxR /acf5Q+pS7n8V+B617B8A/2+vi5+zH4Vj0TwV4xm0vSra/OrWdvPYWt8um3hCqbq1+0RSG2mIVQZ ISjHaMngV/Xh/wAOrf2Yf+jcPgL/AOEBpP8A8Yo/4dW/swn/AJtw+Aw/7kDSf/jFTLMoSVnEawcl tI/i41rWbzxJrF3qOo3dzf6hfzPcXNzcytLNcSuxZ5HdiSzMxJJJySSaq1/aj/w6s/Zh/wCjcfgN /wCG/wBJ/wDjFH/Dqz9mH/o3H4Df+G/0n/4xQsyh/KH1OXc/iuor+1H/AIdWfsw/9G4/Ab/w3+k/ /GKP+HVn7MP/AEbj8Bv/AA3+k/8Axiq/tOP8ovqUu5/FdRX9qP8Aw6s/Zh/6Nx+A3/hv9J/+MUf8 OrP2Yf8Ao3H4Df8Ahv8ASf8A4xR/acf5Q+pS7n8V1Ff2o/8ADqz9mH/o3H4Df+G/0n/4xR/w6s/Z h/6Nx+A3/hv9J/8AjFH9px/lD6lLufxXUV/aj/w6s/Zh/wCjcfgN/wCG/wBJ/wDjFH/Dqz9mE/8A NuXwG/8ADf6T/wDGKP7Tj/KH1KXc/iuor+1H/h1Z+zD/ANG4/Ab/AMN/pP8A8Yo/4dWfsw/9G4/A b/w3+k//ABij+04/yh9Sl3P4rqK/tR/4dWfsw/8ARuPwG/8ADf6T/wDGKP8Ah1Z+zD/0bj8Bv/Df 6T/8Yo/tOP8AKH1KXc/iuor+1H/h1Z+zD/0bj8Bv/Df6T/8AGKP+HVn7MP8A0bj8Bv8Aw3+k/wDx ij+04/yh9Sl3P4rqK/tR/wCHVn7MP/RuPwG/8N/pP/xij/h1Z+zD/wBG4/Ab/wAN/pP/AMYo/tOP 8ofUpdz+K6iv7Uf+HVn7MP8A0bj8Bv8Aw3+k/wDxij/h1Z+zD/0bj8Bv/Df6T/8AGKP7Tj/KH1KX c/iuor+1H/h1Z+zD/wBG4/Ab/wAN/pP/AMYo/wCHVn7MP/RuPwG/8N/pP/xij+04/wAofUpdz+K6 iv7Uf+HVn7MP/RuPwG/8N/pP/wAYo/4dWfsw/wDRuPwG/wDDf6T/APGKP7Tj/KH1KXc/iuor+1H/ AIdWfsw/9G4/Ab/w3+k//GKP+HVn7MP/AEbj8Bv/AA3+k/8Axij+04/yh9Sl3P4rqK/tR/4dWfsw /wDRuPwG/wDDf6T/APGKP+HVn7MP/RuPwG/8N/pP/wAYo/tOP8ofUpdz+K6iv7Uf+HVn7MP/AEbj 8Bv/AA3+k/8Axij/AIdWfsw/9G4/Ab/w3+k//GKP7Tj/ACh9Sl3P4rqK/tR/4dWfsw/9G4/Ab/w3 +k//ABij/h1Z+zD/ANG4/Ab/AMN/pP8A8Yo/tOP8ofUpdz+K6iv7Uf8Ah1Z+zD/0bj8Bv/Df6T/8 Yo/4dWfsw/8ARuPwG/8ADf6T/wDGKP7Tj/KH1KXc/iuor+1H/h1Z+zD/ANG4/Ab/AMN/pP8A8Yo/ 4dWfsw/9G4/Ab/w3+k//ABij+04/yh9Sl3P4rqK/tR/4dWfsw/8ARuPwG/8ADf6T/wDGKP8Ah1Z+ zD/0bj8Bv/Df6T/8Yo/tOP8AKH1KXc/iuor+1H/h1Z+zD/0bj8Bv/Df6T/8AGKKP7Tj/ACh9Sl3P e6KKRzhD9K8ZnpHzD4y/4KIXfhbx7rWiReArq+GkahcWKzpqLDz/ACpGTftEBxnbnGTj1NSWP7f2 u6ghMXwu1hh6rdykfmLavy7+O3jb4meJv2zPiVp8njnxlpOhReMtWt7VINVukSOJb2ZURACAAFAw o7CvWNE+El2mnQCw8e/EjVtZvE2x282rXD+acE8KGyeh/I+lfjeY+JVbC4p4aNCc3dpcsbre26TP 17D+G1GWHp16uIjHnSdnurq+uqsff0P7afiu5Tcnwl11l7E3MoH629Sp+2N4vlOP+FT6oh/2tS24 /OCvza1T4H/GO9uzFa6F4o1EZwPMtb+Xd9STitPwr+xN8cdevDNP4GvFGOWuLNkXB9A78/lXs0eK c1qJOOFlZ9//ANk0l4e5VG/tMfTVvNf/ACR+jaftbeLHjLH4aSRgdfM1+FMf99Rikb9sPXYlzJ4K 0qEjqJPFlopH1ytfJvws/YO8XQlX8QeCZZ8cFViSLj8HzXUeL/2A9evLVhoPg8aa5xty6Nj67nNV HinNvbKn9Tn62VvyPOqcH5NCoofXYtd9Lf8ApV/wPoCf9t+8gUB/DfhpM/3vGtiP6VTm/b+NuxWT Q/CUZH97xzYj+lfJ11/wTU+Mc05MVtbqj8432y4/8eq9oP8AwTU+L63I+2R2xhyCUN3Dz+Rr2ZZl mvLzRo/122M1wxkKlaWMj9+n5n06P+Ch9tE37+x8CwDqN/j2yBP4badF/wAFFNKfkDwB/wCF5Z// ABFeZaX/AME99Zh0pUl8MaI95jBne6G7kdeDXl3xB/4Jc/FfUbiaTSJ7O2hLfLDHqKrwfTK8V5ND iHPalX2csJKK7u1jSnwzw60+bGxVvPf01Pp2T/gopp65xB4Dfjjb48suf/Hao3v/AAUr03TyBLZe B1J/6nyx4/8AHa+OZv8Agkv8dPNJM0Tow5A1eIH+VM8V/sq6z+yz4Ti1L4h+ELPWIrgSFHMkN2w8 sBiDyOoORRmmd57h6LqUMNKT7K36o0o8McOSeuMj6X3/ABPsP/h59o0gHl2/geU9MJ47sSf/AEGp 4f8AgpbYXOPL0fwzKT2j8ZWbn9Fr8y734b2H7Vvi3UdL8EaFDo97ptoLyf8AdpbIsbPsGCucnOK9 H/YE/wCCc95bfG3WYPiBpmn6xo39nxG3hnk85BL53JxgYO0YryMFxdnVTljiaDpyfR2uvuR14rg7 IadD6xSxHOuy38+vQ+99I/4KCXviDd/Z3gi21J1XcUs/EEdywX1wkROKsL+3B4pm1G2t4/hZf5uJ RHuk1Jo1T1Yk2+AAAe9dr4J+B2i+CVjOmaNpun7UEavb2scbhf7u4DJFdTForW3AzjrzX1tPMMa4 pyl+C/yPg61DAKTVJXXm3/mZOm/Ha7u4x5mixRybclI73zMH04jFWG+Nd2M40J8Du10FH/oNTajA zv1HPBxxn2rG1Gz35wvIGTVf2hi1vL8F/kVSweEmvg/Fk9/+0Bc6eR5mhKAwJBF51wCcf6v2rPm/ akMRIGhFiFZv+PvAGFVsf6v0b9DWLrlh9puRbyo6xrF5wk/h53KV+uDn8a8/khfzNXHmjba5VJCm 5gjRw5yBjsevpzVf2hiv5vwX+RTy/C30j+LPUrP9q9r21jePw+Szxq5X7b93IzjPl9a7f4f/ABCu vGeny3U+mJp8KZAb7R5gYjrj5V4BzzXjPhzw2qyxBUi8jhY1DgBgAOh5z65r1zwjdTWmgwwf2aWt ouVaK4Vyxznpx3qKOZYl1lCUtNb7eVuhz43B0KdK8Iavrd6d+pS+IHxvuvAsSzf2E1zbyHCSNdeV n6jYcVxF5+261oCT4X3EZ4Go+n/bKtDxfawa/dyNqN7Lf3hc7IHVoYrUdgsZIz7sc59q8T8d6LHp 2tvHCSRk5wPlz6Z9KyWbYlzajPTzSOilltCVJSlDX1f+Z6jH+3czn/kUyOmP+Jn1/wDIVbngr9rO 88a6strD4WWLP3pDqOVQep/dV89abo/2ud0GAwOM9h+NehaO0eg6OYLJ1juMCQSbjhmHIBPoeh+t Y4rOcZGPuS19F/kdOHyfDTveP4v/ADPpZvFtrDYtPJJDGsaF3y/CgDJ5x6U/wj4kh8XeG7PU7b/j 3voxLETzuQ/dP4jB/GvnLxX4muNf0q50a2eVZrmLy7xw2VsI3HzAkdZCCQqjk9eBzXyF4m/bw+Nm j+MddtvD/jVtM8PWWoXEGmWa6PYSC3tkkZYk3vAWbCBeSST61vlueV5T/f6q2yS301ZwYvI/Zx9y WrfXt+J+sFFfjXrX/BT/APaG06crH8QHbnAH9h6bn/0nr0r4Oft7/HHWolk1jxw9wH52jSLBMe3y wCvQr8TYWl8cZfcv8zGlw/iKnwyj97/yP1JY460AD0FfDVr+2F8Qntt0niLLY6mxth/7TrN1T9tT 4kRZEfiQpt7/AGC1OfzirB8X4NdJfcv8zT/VrFd4/e/8j73yfSjJ9K/PBP22fivNPx4sZV6f8g2z x/6KrZ079sr4meWPN8Ss5/7B9qP/AGlSXGGDf2Zfcv8AMl8OYldY/e/8j71yM9f0o3e/6V8Nj9sv 4gAc+Ij/AOAVt/8AG6hf9s/4h5yPEWB6fYbb/wCN1S4twj2jL7l/mQ8gxHdfj/kfdXAFKMEcV8Lf 8Nj/ABFkBK+I8Y/6cbX/AONVm6p+3F8QtNUmTxZFDjs9laA/+i66YcR4aSvZr7v8zN5LXWl1+P8A kffW+gEk/wD16/Oq/wD+ChfxBigzB4qaZ+mE0y1P6mLFZdx/wUU+KTD9z4gYnrltPs//AI1TfEuD ju3+H+Y45Di5bI/SncR70pG4ZxX5jz/8FC/jFIDt8UxxfTS7MkfnFTvC37cfxz8a+J7LR9L8VtPf X8qwQRf2ZYLvY8AZMOBWUeKMJKSjCMm32S/zNnw7iVHmlKK+b/yP022/T8qMAdq/Nv4uftZftBfB DxONH8Q+KUtb8xLNsWx0+QbW6HKwkZ46VzP/AA8Y+Mm3jxkSf+wTY/8AxmprcU4WnJwnGSa8l/mK nw9iJxUoSi0/N/5H6lY9qMn0r8s5P+CjHxmXP/FZfT/iVWX/AMZqCT/go38Z0/5nVv8AwV2P/wAY rH/XHBfyy+5f5mq4ZxT6x+9/5H6p7c9T+lJt9q/KZv8AgpF8aF/5nZvw0qx/+MVBL/wUp+NQXK+N W/8ABRY//GKT4ywS+zL7l/mV/qvi+8fvf+R+sG32o2+1fk4//BSz42IP+R0bP/YIsf8A4xTJP+Cl 3xsXp43/AA/six/+MVP+umB/ll9y/wAx/wCq2L7x+9/5H6z7KAMd6/I65/4KbfHCMceODn/sEWH/ AMYqvJ/wU9+OSR5PjjA99HsP/jFT/rtgf5Zfcv8AMpcJ4x9Y/e/8j9d+g9KXBIr4U/4JnftjeP8A 44/EHxL/AMJ14qOo6PpNhH5cI023hAnkk+Vt0MStwkcgwTj5umQMfZT/ABT0Edb/AP8AIMn/AMTX 0eXY6GMoqvSTSfff8Lng47BzwtZ0ajTa7HR0VzLfF/w6uc6geP8AphL/APE0xvjP4bH/ADEf/JeX /wCJr0eSXY4+ddzqaK5J/jZ4XTrqYH/bCX/4mo2+O/hSM86of/Aab/4ij2U+zD2ke52GOelLiuLf 9oLwigydVI/7dJ//AIioZP2jvBsX3tYI/wC3Sf8A+IqlQqP7L+4n20O6+87jHtQB7VwbftL+CR11 s/8AgHcf/EU0/tP+Bx/zGz/4BXH/AMbprD1P5X9zD20P5kd9j2ox7V5837VPgNOuuEf9uFz/APG6 jb9rT4fp11/H/bjc/wDxun9Vrfyv7mHt4d1956Nk+lGT6V5pJ+2B8O4/veIcf9uFz/8AG6jb9sv4 bp18R/8AlPuv/jdP6rX/AJH9zJ9vT/mX3np+fcUZ+leWN+2t8NF6+JCP+4dd/wDxqo2/bg+GC5z4 lPH/AFDbv/41T+pV/wCR/cw+sUv5l96PVgMZ7UHp6V5G/wC3X8LIyVPigj/uGXn/AMarM8R/8FFv g34SsVutT8ZpZ27uI1kk028ClsZx/qevBrOrQqUYe0rRcV3aaX4muH/fz9nR96XZav7ke4HkcUA4 6184Sf8ABW39nqE4PxHss5x/yDbz/wCM16r8B/2i/B/7TXgyTxB4I1j+29GiumszdC0nt0aVFVmC +aiFgA6/MoK5yM5BA5YV6cnaMk36nZXy/FUY89anKK7tNL8Tu6KKK2OUKG6GihuhpMD4O/4KI+Cr TRvCCanBGyTt4uRpGz13mcn8zR+zZYpF8ffBjjOBKEXJ6YhnI/8AQj+db3/BS2Mp8C9SmXrb+Iba T6fv2B/Q1zX7M2rxz/G7wg7uoCTxksTgDMD9T+NfMZQrqWm0n+Z9DmM5NRu/sr8j7yit/LJOWOaf uA7frVGXxPp0XDX9mD7zqP61B/wm2lA/8hOwwOuJ1OP1r6pQk+h8x7amtLmrjnp+tKRnt+tYz+P9 FTrqdmP+2lRv8SNCj66paf8AfeapUKmyi/uH9Yp/zL7zdwfT9aOfT9a5t/i34fhxnU7f8Mmq1x8b fDVt11FDj0VjVLC1ntF/cyfrNL+dfejrefT9aD9P1rkf+F5eGhFv/tJcf7prOvv2kfDNshMd08zA 4wqGmsJXf2H9xm8bQW81953xBb/9dfKv/BVudl+D2lQgACaS7Bzz0t2r1x/2qPDoViTdYAz9z/69 fO3/AAUa+Ken/Ej4V6V/Z5kzbfbJGLjHH2cis8ThasKbc1Y3wmLo1KqjCSbPmf8A4JV6Y1l+0B48 84b9/h+3CEjsLgE/+hV91/CjSo4/iVOQoBeFDx/vMa+I/wDgmncfZv2ifFEeMeZ4eB574mh/xr7j +FNxn4smM97UH8mx/WvzXM6F8Ypea/Q+8wtW2CkvJnultZqlvjAwB2qG7sstwMAener0QwD1PNR3 QwhHPTivs1hIqmlY+MjN3Oa1G22dARluOOhrKvYxbr5km4LuwSATj3NdPfRGTb2GeaxNcLQxZiwX k/doMcFzwvPseT7CuR4VPY9OjWsjkLzTle7dFH7i2k+YZzuk6lfoOv14riLaz8/xj4gzyrs+T/27 x5ru/iFKnhfw9jc7qB5aleZJZQAQB6liD+deZ6/8SNA+H/iHU18QeIfDmj391HPO9tc6nBA8a+Sg T5XYMQQBzjnnFYVcO1odlPEJ/wBeh2Xh3T4l03TZFHlNHCo9iGVcjHrwK9P8ChIvD1uFYkBQTkdM 89vrXgVl+0T4E0bwT/a03jHwmbaxtElIGrwMznYMKoViSSePqa6nwb8arPVPDVne6R4o8M6hG48u aEX0KNG2PuE7uCB+deR7Pkr8yt/w+34o0xb9rRjFM1fibOkGtXUrhZIxyh25II7V5J4gA1K5llPz scmuu8f/ABT0KYYOtaOZm5kjTUIn2HvyGNecXXxN8OhiE1zR8kngX0XP/j1FLCu17HbGtFQjC+yR dsrM2VpmIASBeDj8s1Jc309vJFDakPd3R2RbxlUbqzH/AGVGT+Q71kxfEDSrqTy4b6zk6DetzFtH 5t9ad4M8Wadq+pXeoi8tzbpI1tbuZkChEbDt1/icEfRR60VqDS1KpV05e6ztr6zh8K+EpQhkaOJG nlkc5aZ8ZZ2Pcn/Cvh9Ps32J+hkkyzd8k8k19HftQfGyX4f/AAx1SN3sppdUt7mGykSQLsAiZjuT JO5RwCOCSD6ivifwz49N+wzIQvcVrlcIxjKT6mGZ1XOUYx6F/U/DMN1qhm2btrcAdhXdeBytgqKO B0WuIufFVnCxMtzEpznG7J/IVdsviZZWgAjS4nI6bV2gfnXh5tCLndHq5c5KCVj2a011REMECorm 6F6AoIOTnp1ryk/Fi5uI8W9tDEOmZHLn8hgVd0W913xZp97LFq9hZrYx+Y0T3Mdq8q+kYPLt7A5r xY0pTdkek1ZXloeiIUtVzNIkSrzuc4GKZc/EXSdOUiS9R2HG2EGQ/pxXlHkTTDfcPJMT/FIxY/rU c2rWmnf625to/YuM1PJbcfsk9z0XUfjHb4KWtlczH+9KQg/IZNUdM8XeJPGmrR6fo9j515cHENvb QtNNIQM8DnJx6CvPp/Hmlwj5ZZJmHaNCR+dVofibPaXKTadb3cE0Zykom8pkPsV5H51pDlUlfbyI nSVtNzutVu9cj1Say1SfULe5t3Mc1vLmJomHBVk4wfY1BHo6zuAcjP8AF3rkV8U+INZnebMSyyMW aR90jsfUsTyaaY9cu5P3uozqp7IAorSVOTd0nYunOC0e56xe/Df+ydHsb37S4hvwxieaExI+04bD Hg4PHH/1q5nWtY07QpvLkvbQyHPCSg/l6/hUPhT4aat47S2tZJdQ1FLfPlQvIzrGCcnaOgz3rkv2 nfhJceAtP0zz7R7aVzK8fGCSqg0Soz5eZLQ3lUg9Opr3vjK0kBCuG7ZHNU4vFywXImty6SKcqwba VPqDXkPhrxggsIpGkYrcNtTJGW5Az+o/Ouy0/Uo7qPKNuAOCR69P6VhCor6PUxqQaWqOrv8AxPca vc+dcyyzyN1Z3LE/iajGsjOMEEVjLcDbx0PpW7beA7668A3HiT7RpiafbXAtmja9iW6ZyAcrDneV 5+8BiteSdRtrVmSnGCS2IJL8ydOnuKTTY4NQ1i1gu7j7LbySqss20t5Sk4LYHJwOce1ZInwT8/FR TXWUJ5rBRs7s15rqyO/+NHh3wl4R1+C28JeI7jxNZGAPNcyWRtAsmeVVSSSMd+K4p5ODwB6Z5rP+ 1gNyf160jX6EdV4qcQ1Um5Ril5L/AIJVFOMVFu/m/wDgFq4ugDnI6dqpvfkDBByT3NQXOpIP4gc1 tX3xlubj4cQeGU0zQYbaKXzmu49PjF/M2SQHn+8Rz0GBgAVzOk+p0KWpjTzjILEelZ2oTeVGSWH5 1DeauI4iWNcl4i8WPdv9ntzl26t/dFKNByZc6qifoH/wSn09bX4W+KNXxg6hqq2oPqsMSsD+czfk a+o5tUBU5YV8OfshfHu0+DHwG0jRn1HQoJ5Hlu5lubgLIWkkYjPP90KPwr23wr8fb3xxFcNplz4f v/sqGWVYb2PcidSxBfOPfFfv+ScM4yjl1KdkotJ6u2+v6n5BmXEGW1cbODk3JNp6N7aHtc1+shzu UVSnuk/vDFfP+s/tVNZ3csIvNCDwnDp9sRnByB90NnqcdKxLj9sWFVlJlsG8kqHMe91BPQAjIJ9g c19BDh3HW5nb7zzFnOWuXLFtv0Po24vYwMmTH0rPub5BnnOK+e7j9rKaYhIxZySOodUjDSMVIyDt HY+vTnrWTqH7Y6WDbbmKBD9oa137giCUJuKbi2Cw+7gEnPB61008hxbdlZv1Inm2Ajq7pPuj6Ku9 SCA84FZ9zqcagkkk9q8Ht/2p/wC1Ht44J9OeW7LCFEk3O+0FjgAnoFJ+ik9qo67+1IvhprwapcQa c1gkMs3n2zrsSVd0Z687l59cdq1/sutCSUmk30ur79iPruFldwi38vme83N8owQADVC7vhzngg4I zX54+HPj5qOmftyah4nk164n06e3u4Hka4Z7drM7mjQAnAjDbMDjBxXtXhXT1+Dnj21u31YC6utK FrNHcRSF1lldJDyVA25ztJPQenNaV8NGhUjTnNJy29VuTQmq8JVKcG0t/wBPU+krm/AY4b8zWfdX 4A4ZePTmvJ7b4sa3q+qaVb2jWl7/AGrfNZxiFdxwEZs5+6TlSOo7YzW34j1LxF4el08T6fLL/aKy MqQx7nh2MF+dc5GSeDyODnHFcrxeGhZyqpXdld21tfqvxOuOArTfu0m9L6K+nybOovNUBJyag0W1 ufFWt22m6fFJdXt4/lwwqPmlbBOB78GvM/iR8WLvwLoss0sMX287o4LS6VoJJpVwWjVThmZVYE7A eCPWvIP2Qf21/inqn/BQ34TeGdY0bRNK0LxN4lTymETGeW0aFypjYOflJXcCeTu54wK68Tio0KLq 8yd1pbW5yUsKpVeVxatunoz9BvhH+zDLJc6hN8QNI1bSbV7NjpqeZseacf3ghLAAEYBxUGj/ALGe qa54guJGbS7PRJrm3+wy3OqbLiWERsLnKBSdwl2beOhOe1fQPjzQo9EtIFijWCJvMKqI2DbixZiS zHPJ/Dn14o/CTQ/tXhW1vTDHPJHPcKHWw8+TBncEB2PsMgDjbjnrXxdfPcTKfMpWv0WyPXhl9JRv yo8St/2FRe+Nbi1ufFFnp2l26li0UD3Fw4BGQudq856nP0NbepfsQ/Cjxz4KjtrvR/EWs26XTK9x qV3LbGZkJGVWIquMjIOM4+ter2ssh+LU0afahL5MvMMQMqgFM8HgDpn8K1PE0csaJ5q6pywIe7I2 nrwMDr/SuDFZliMXD2Vd80OzS6d++p3YaCw1X22HbjNp6p2tfdK2x4J4D/4J+fBHwb4zhu7P4cWe r6pbxyTWtvfXk97AzgD5mildkbHHJU4JzX1j8J7m8n8JRi+tLKwljYRrbWpXyrdQi/IApIGDnivI 9FRb3xpBC0dxP5kcmYoB879Oc9gO/HevXvhfpcej+H5YorS6s1NwzFJ2LMxKr83Pb/CuXAwjGo+S KS8lY2zPFV6yTrzcmu7bt951FFFFeweQFDdDRQ3Q0mB8af8ABSgK37M/jOfqbTUIJvpi7Uf1r5v+ GHi25tdb0a8RysSLGGfqVbhRj8Ca+kv+Cgd1FL+zR8Uo3G/9zOVHoyTbh+qiviTw78RLTwl4YS/1 G7Fnp2myJPdXDZIt4lZSznHYDmvnsmtGcm9lK57GbKUsP7qu3Gy+7Q9/1L4kXMt3nz7tzuwQIz/j Wh8O/Gmp3+pa689zfT2qTwx2qCIL5QEKs+SOTlm71+e/xh/4KGfBu3g8Vz+H/FV7JrV9YtFImnQz CTWAw2jYeNsyD+M7cJu5OBiex/4KO2HwT1CbT9U8TeHNM8KrFbXFtcfZJTMkHkpGI4oy++Yqqx5I jX5mJ5Xp9xjeJcDhqced8zb0UdW9bf8ADn4pRyXNPaTl7OS9U07trZav5n6TDxVcEZCXAz0ySKR/ E10eCsgPvIa+BL7/AILl/s52sII8ReJbsjgbdFcE/mwrHvP+C+v7P1mPkbxhPwfu6VGpb06y16Ec 2w1tZI1jk2cvRUZfPT8z9C5PEM0mcnbnsWNMh1uSRSd8WB/025r83dU/4OFvgbbqRbaJ41nfHQW1 uo/9HVkn/g4j+EVsCYPB3jW5b0EkCZ+vzml/a2F/n/B/5G9PIM5lvSfzaX6n6cjXsknzFyPVi39R UJ8Rwxg4mj3Dk4CjH55r8vtR/wCDkX4d22Ba/CzxTMT3k1SNM/khrA1v/g5T0xoni034QTAsMBp9 X3f+gw1m87wi2l+D/wAjqjwvnMv+Xa/8Cj/mfq4/i6AxndMDxzjaM/8AjtcT+0dq6XfwmkO4jEFw FHuwRB2/2q/Lm3/4OKPEeo3ax2/wt0yKN22/PdTOQPoFWvor4a/t66t+0h4HjHijw9F4c864iisl t45GjnQsruzMzEDAQemc15WZ5zhKlJwUtfRrb1Pbybh/McHV+s4qKUY7u6e+2zZ9DfsF3K6b+1hr UAYgTeHpgPfbNDX2v8JtWz8ZkQn71sR/4+K/Or4BfGnSvhH8d9T8QX3mTQWej3MTiLk/66Nh9eP8 K+ivgH+3v4T+IX7Rfg7TNI+03V94wnuINNtlAEhs4C5kv5AeUizGQoPzN6DrX5pj6tP677O/vRau vW1j9Cw2aYdL2HOuZp6eui+8/R+2kBjHtx1pl5KI1J67QDgck81jnxdbadBmVsHg/nWbq/j+0jlV FcEOVJI7c19nSqc0bHiulJPVG1cXiyE4BzjisfWZBE6TvG4tbNWnc8AF8AD8gWNJFr9tIWw6tuIO c8/54qLWriKWEMwSVSOFbp+IrRRLi0cZrCNrfibdIFubTTp5fKjLYN08qkDb22qufmPQFjX5I/8A BQP/AIJP+Bf2mv29/iPqOq3Orz6/dRWWr39z5qGGM3MbrFBGGUsqxxwrgE4wwx0r9gHmhsVu7iYr GRI4UZy4DOA7n6sR9FUe9fD0WoJ8RP2y/jtqVsJLmK01bTdLARSxRbfS7dmzjoN8x/P3rjxuInhq EqlNK7aWqv0v1OzL8NHFYuNKbfLZt2dtrL9T80vGP/BvboQmkOm6xcIVGQsgRfpzgV5vr/8AwQV8 QWSuLHVYHUHODcqhav2Uk8PRz20khJBzgAPzWFqfh6JDJnfyOPqK+Qr8TYiLtaP3f5H3NHhOg1e8 l8z8VNa/4IpePNJJ8mUyKuVyt3Bk/gWFZC/8Ew/jD4Ogki0eXUY0ZcOkM1uysPxkr9ifF2kRwQfx ku2BzXE6lbjz3fEihQRjHHpXBV4rxFtYRfqn/mbw4SoJ6TkvRo/HjxP/AME0vjCszSSaDql1NnJ2 GIE8/wCzJXOXX/BP74yaXIUPgrxSVT+4zEH8pK/ZyDSPt2pEGbgKDgp179fwFXrjwqwd9oRgx6kV xVOOq9PRwj+P+Z1R4FoTd+eX4M/Hv9n/APZs+Ifwq+NOia34k8P+J9M0/TmkYz3vmeUGMTqq5YkZ yw/KvsrRPG5MamW4YA/3pMV1/wDwUMjk8PfD/wAP2UYKyajqgxsYguqRvkfmV/KvGLDwFcaNp1vP KbZ2kGSizqzr9RXsYTHVczw31lqy20vbQ8TG4Gnl2I+rRbb03tfX0Pc/CPxH0K00y6iu7Zbu5mUC CeKd1a2budqjD59Dj61uaX4mW6gzbWt3MoHBOFArzPwN4Su7iya68krawsqSTMQERjnAJ9Tg/lX0 v8I9a+GGk6Elhql/Nc6zdDALvFb26HGcF3cYHHWsVg/aaTkkl/XzLVacFeEW7/18jz//AISe+Z8L bwxj/aJY/wBKms9W1S9nCrdGMH+4oXFbNxY6Nq99JJZXyJbucxruVnA+oNa9ppOl+HorO7guxe3J LNLDLHhIiD8uT/Fkc+3SvM9jDntfQ9KNOvKN7G74L/Zy8ReOtFa8itL+8hAzvd22n6CuT8TeAJfC eptBd2b28iNyHTB/+vXp8f7ZvjnTdNisLPWYNNsYwFEVlZwxZHpu2k1yHjf4o3HjXXri7lnvZYmc tFHdzee8a+hbAB+uB9K78RTwrppUU+bzsc9DC4znbrNW8r3OUtrHe42Rlv8AdXNbWieGZby6QMgi U/xS/KoHqTVaTxXeWgWWJThW+ViMDI5+h+lU9V8Va54nu7m5WAzO7GWTyUCqCT2VcAD2Arkp4aV7 2O14Rtbnufgzw98OPD2nhte8Q3F5dYyYbO3cqD6ZwM/nVXxle+DNPsotQ0601lrCaVo45XVEWR1A LKMsTkBh2714TBo/jDVnH2XRNZuN3A8qxlbP4hTWzY/s9/FrxRHiy8C+LblG6MthIq/mwAr24Uq9 SHJCC+Sb/wAzgeXqnL2kpv5tWPrr9jL4h6f4+GtQaXpJs10kwo0jyiRpS4b0Axjb+tcP/wAFMleO XwMkiqPMuLsLx94hYuK6X/gnN8F/GXwbsPFreL9AvtBl1Sa1azW6KhplRZN5ABJGCV6461z/APwV Bu9//CvVI5lv7lVPp8kea6MRhp08I41N/wDgnne0j9bsv60Pz1mDaV44h0+2lWW3srmcxwRrlsLL G7A+mN2MH0rvNNnn0nTBhfkjhO7y+iyMc4/DLc/7PvXlvxw0yXwL8etc2zSwRavBbTRlZNgQyuvm nPriN8e+K9Y+HXh5oPg/p9xI0si3RdonYYUxg7Rj1HB5r8eowxLzD2MH7qvf0Vv+Aj9GxyoRwMar 1crNer/rUNO8YGeFUDE7RjBPNXRrjyYPfsa5rWNBeFDcwEo6dff61p+DJRrDrBPPBaynoJW27voT wa+4pUW7JHxdScY6s3Zf7Qg02K9e1uY7Sdikc7RMIpWHUK2MEjuAarHVpH5zzXX2Pgy71yOx0mbX rWOyWU+Slxe7bW2Zur4J2oD3IHasfVfDtro93LC1/ZzmFym+KQMr4OMg9x710TwDSvYxhiot2MVr 1n61DNcE9OM960pdOjksLi6iWSW1swvnzIhMcG44Xe3RcngZ61zupeJdPtyczoP+BVj9UZ0xq3Ok 8HeER4yGpF9Y0TSBptq11/xMbkxG6x/yziAB3SHsOK5ee/5OCar+KPGGg2djYNY6o97NPDvu0e38 pbWTJwituPmDGDuwOuMVyl/8SrKPd+8Tj3qvql0vdKVSzd2b+rTtNEcSFRjt2qpoOhYmZmyR1JNc hqXxNgELSKrmPO3cAcZ9M9M1Y/4aDttUm0HS7G0mh1Ce4EN1LIytFNucBdi7QVwOpLNk9MVrQy+r UqwpU1rJpfeY4jExp05VJvSKbfyPeIUaC0hiEDFYkCjDnPAx0qtdxRSSDzPLjxzlzyKxrvxXdSjk xgnvsAP/AKD6Vm3Hiy58sgMSpyCAv/1hX9wYOHsaEKUdopJfLQ/izEp1a06resm2/V6m9ctHaOPL kG4dHTjH49RVSfU5IIyUuJUBPOGIz+ANc3P4hnLlndFUnH+tGf0qnPrU5O7zYgD/ABB25/8AHa7U +5zqi1omb9zrD27FgrNlfLJDEFlPb6e1Vb7XTNb+UfMkjByEdtyqfpjFYN1qs0uf9MiiByT8mT/K q5me6lIF1cTE/KNkX/161Tj1QJT/AJjbHime2t0jhkWJI38wLj7rYYbgABg4ZxkdmI7msTXEg8RJ Kt6kNwr4Lbge3Q4zjinzaDfPEChvVTOCWAQKfxNMvtCGg6VcalfXUkFlarumkGXVB7kDH4ZrGpPD xi6lSyS1bfbzOik6/Mowbu/MoWzyDxNLqH2fSnaS3Nr5b6VbyQqmAMrGUKK3H3gA3Xnk1bvvFep3 xsoTLbRx2Ft9jiSK1jX91k/IeM7eTx0OT61kWmq6hJeSxzaBqLWN9u/sjUMCO3mTyyyyuXxhNw7f TqQDUuPEmn+LfCFp4aRIv+EkvLQeZd6fP5i3bqgMmMEeTuJ9yORivh8y4k4cpKVSpFTlFO1lvbZX 8+jPq8Dg89fLGE5RTa1b/E6Xw94m1DwsPLjktvsS3DXf2BoV+zq5BGdo54ycDOK5Px5+0XBrmtrm GL7QFY26wxSWFo0zkKuAjgAqVVl8wFWLDscVLokviCx19dNn1XQpENjK0w1hlRoQRtXJQMzyLtOE XJ5BPBFbvjbXfh/8MtRj0j4e2Or39h9nSO+vvEVzFJfXFzhgzwImAAnGzjcCBngV8TmPFGSV/Z1a NFR3vda66aWfrqfX5bQzfDqcKtbmva2t1o+uhyPxM8Gy+OY31XWjfSyWlu0saQtJJMjlOQWLclmA 3NnOPwFewfsoagniD/gob+y5+9QDS7uytJIzIhaEpbM4Vh0yd3f9K4/SPiZrHjvRLTTrDTdY1fxG 4YWLWzFkI4y/kRx5mKKGyTxkMe2T75+wT+xn8QdO/aq8C/FTV9D8OyabomsR3epTWepL9ptQEdDu tkBkWRAdpjKgjaOMcnyc54hwGJUYYKDjG1nd3/Xc9zJ8PioJvES5276pJb99j9dPidIF06BhGIwT IOFQbsY5ypIP6VU+DzJB8PY3kjVQs9wxd7eUg/vmH31PP5cY9BWD4u+KWj+PtOD+H77S9VWzmlgu pobuIpBMMAwuQAVkXurgEbhW18IJjp3gS388wxypNIXljuGRG3SsVAlHyMcEAggY6V8k5pyTR7/K 1T1IrV4Lj4pzpJ9nZZLeQfNO0UZGU6N1+ma2vFO6OCJjamFM4DrdCaN+vTHOff3rntImb/harrvm Ym1mLO0a3LYDR5LY4I9SPwrY8TqiWkcscdiN7bRLaudrcE4MZ+6fwqI7NmrXvx9DC8Mv5vjmJCl2 ymGRilsvztjHOcHAH617L8N2ibQ5vKku3AuCCLgAOh2rxx2/xNeJaBe+X4yTLX7Ksbki0++oAzuP B4H4da9q+GWopqXh+R1vm1BFuGQSMhV1wF+Vs9we/uK3wErzMsatmdPRRRXtHnBQ3Q0UHkGgEflf +1/+14vi3x58Xvh68i/Z7VL2OL/RzGWkivRGyhicuMEg9Bwa8I034Nz/ABq+Ges6Q2oWmmadrG3S pL2dlZIHcKU3R/6wrvK5KjGM81zn7U6Np/7f/ja5Q+bBeeK9Z0+aMdB5tzOoz/wIA/UfSu3+Av7S VzY/BqXw5DoWmi2g1qK5udRsJI4NTvflUqkhlikRgmCABtByOM9fCpU4uUopWTetv66n0GJqOnGE 1rZXPnD4zf8ABA3Uvgn+yV8RPF3iEG6+IHge6/tqye00S4e2fTobWSWaLcT5bAsowxBxuXOOQfkz 9hb9iu3/AOCoWqWHhObxW+jeOdGgvLuCGTTTctqkHmQhIlYvGvmIucRgs23+EAE1+u//AAV8/wCC yfhz4I/sp6r4D8VaB8QdJ1vx7oF3YaXqttBpmpRzXSKoRpxvQRoWGCVjLAMSoyMH8o/+CVng/wAQ +PbnTPEun+Dvi6V8M602s6fqngbQrS4ujNHEE2wtekW+9mkOWB3YQgAk8d8MHQhKMox0vbfb59vI 8KGY4rF80/aXbT5ZKMV12tbV6Wuz72+JP/Btl4U8a/tDat438RTeL9K8ERQ2ch0B7IxT37LBFC8f 20SHy8yZk4TO35F6ZrxnxL/wbmeC/C/iO6spvHnijyYpWETS+H0tXkTPBCyNnH4c8HvX3d8HP+Cx Fv8AtDfFPUfhfdfs8+NNC8W+HdEj1O8/4WLeDT2vVSSOIXBtoY3DOzHO9cLywU44r0b4kfHzxn8X tMtdL1dfDunaPayK8en6bbuoUr93MsjM5A9FCA9xXfGhRjK0oq3q/wDM+ZzriHE0IKlGu1VWr91O 99k3ZJW8j8lvAnwC8A+CvGGqfDfUPD+i+KdP8H6i+mW13qOmxG6ulDKWZ2A4O5zwD0FevTf8E1/g /wDGC907TB4Ms/CMUJluru70M+VcXQVYwsYJDqE3SknjJKDmvNPDWnzP8dvF+qXDhmu/Et+zbiCC fO7HrjC/pX218GNINzfXE0W7bFYW6AK5TO95GPfnhUPPtXg5c4vFyT+C70Pt+JMXWw2RqvCX7zli uZb30u9PU8EX/gi98BYZlEkfjG5AJP7zV2TP4LGK6HQv+CR37PNiV3+E9RvNo63Or3ZB+uJFFfTg 0Vj8pjlH/bwMfjmpE0XY5xFBnoN0jP8ApX1Klg7fAvuR+IPP83k9a8vvZ5L8N/8Agnb+z94WvJLh PhvoQjhAcyXEk04THOTvmI7V4D+2f+1F4B8L22i+BvCXhKx0LWfFOpLBYJECHVfO8iFpI0QjyJAQ UZSdxfgEAsPbv27fiMfh98Gb7RoEuJpdbtppr0wymKO3tYYnlYM2CVD+WQAoLMqyADPI+B/2kfBm q6H8OPBd9czL9tl0m315b20BhurWKIhILgNnIaWZZAd2GX7LkKK83MqdCdNqMFZrVpJadT2MvzPM JxUqtWUl2bbXXo+p6z8P9S1/4TaZP/wtHT1g0nXoLizdrErLdzLColllgBYAtGiYLHhgTjnOPdv+ CakFl8HfiDpmpXlhq9x4d1e0gbSdQjE8urwbMMqXaIC/lSFtwAYR8AEHBr854/23b34n+G5/GXjL xHNJqfhUjTbH9zElxfxXDTSmTChQ7blYSsMAIUGORnvv2dviDJ8Z/Hck9h4i8QxadFpzX+kJZuNP vdUvFMRktklA3F3RZFiWQspMUaY54+RxuFUJurBb2u3u7JdvQ+wyydTnVSrG8k7KySvdW87/AOZ/ RF40+KcY01LmKaOaCaJSrBgQ3HY9DXDW/wAWJrqaOUuQUI+XvxXyf4Q+GVv8ENV8Na34X8b+Jb3R 9dtF1DULHWbmW7ttXWaHfHOI5XZra5QsMlTgrlGUkbq774i/Crxl8V/BNv4k+HPjfUtKt7tpENpP pdu+HileJ8SR5kALIxHyk4r2qcZzelovzf6n0ixFo3qRfy1001/E+s/DvjyS/gQrvKnk8HPeprj4 36LpmtR215qEcMrkxKSWMYcAkqWAKgj61+TXxJg+O/gXxHHPe65rupXGmzieF4rx7uGN0O4M1s2N wBGSrJgjg14L8efj7+1v8bbWb+z9I1t9PVRJd3fhzwLeqL8A5O9IkeMF+5XrnjFe2sJWjBHnRxNO cmlc/e3wt8VvDPjHUIBbXUepLJcpZGOGQOJ97BTkg8gDn8K9Ik+FHhrw/JeahYaJpOm308Riluba 2SGSVflzuZQC33VHOTwK+Uf+CUHg7xhoHwR0fxB8avA/gjwP40jt4xZJpcbR3RtfLVVmvkyYo7qQ EsUT7uTnDEqPrnxl4kgg0AskiSC4A2kNn5T3q5YZykoSV1p00/qwoVpR99aM8d8a/Dvw3qYc3GmR GSVsmWL92SfwqHwd8IPDvh7w3qeqR6e00jw/Y0ErtOrjIdjtbIzwBkVsavpU+oxbYwXO7IUdfaqP xe8TTeHPC1p4f0xkWdV3XZHRmPBXPt0qHwxgVWjUjTV/6/4Y9hcQ4yVL2XO7erPCviP8LvBPi62Z LsXOmyxSF/N0uTZJnoQQcrj2I6155J8BPB3ijVodG0G48SyajcAp595fx+SpxnLAQ8D1xXUeP7SS 31VFeMwS3KAyJ94deP0/pWR4VtVsPH8dnBKFZF86Q5xgHgfTofy96+QzbKMLGUoQguZbH0uX5tip xjJzdj1/w5+w14N8WfD7RBqRfR/E1nYpb395os2YLmZVx5hSRcHI6nCnNY8v/BOeTTzI3/CwbNrM nIMulETD2OJMf56V2mn+OmsbcRW8qsEHLD7prO8S/EiZ7FwZd+3rs65rglwVh8SlPEwTfk2vysaQ 4mxeGbVCs0n0aT/NOx+TP/BfTTLb4GePfhn4fstXbV7ie1vr+62W/lKimSFIyBuJ52S9cV8h+CPi jdyacsbreG0tSZDtiLLGWxk8c9h+Vev/APBc34hHxv8At22Nl5m5ND8O2tqwznDvLPMT/wB8yJ+Q rl/hBpttpPwzvC8aF5ItxyPXivp8o4coQpLD0lywjfu/Pr5nkZhnlSdT29V805Ndl2XS3Q+i/wBn 79my5+LHhGy1WDxt4PtLC/VZAs984kx/tRhMgjpg18E/tWftp+Ivhb8evGXgZL/SHtfC2t3GnwXl naA/aBE5UOGfJIPuBV3wT8QLhvFt5prSyvbWd1K8Me8hQ24gcD61lfFu2isvG6x6bp+jQz3dobm5 kn02GaSWUuwLl2UnPSvnZ5ngaGKeFnSu0r817r7rafifoeO4VxFfD054GrZyto9N1tdbn6H+C9Gg 8S+AdF1GIOJp7OEzBxhhJsUt+p/WvSvgL4S8OL41guPGEt7H4bt1drr7PJsf7pCYJBx85HbpWV8L PDw0j4OaLaXMjzXEtrDcGVgBndDGc/ma63wt4EHjPQbvSZHlhW/eOHfG21sBwxwffbivCxEvYxni FFPlTlZ7OyvZ26M78FThKrHD1Ho2k31s9HY9H1v4w/s0eFLuC2i0XU9UaMbiZbu4K4z3MaAfmaqx /tz/ALPljF5dr8NreZYCUQ3VvPKpP+yXPNfOvxl/Z8fQvivpeg6W7x2t5al7ov8AMRy3zc+2Ki/Z k+H8Phj4xao2sKl9a6eRDYrIq7SWPLYPcDj8a+SxPiTiqbtTw9JOy+y2/wAWfoeH4NymVNSblL/t 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 FFFAH//Z ------=_NextPart_000_0507_01D2004A.C1716620-- From zlang@redhat.com Sat Aug 27 10:24:31 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 719AB7CA6 for ; Sat, 27 Aug 2016 10:24:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B8902AC002 for ; Sat, 27 Aug 2016 08:24:30 -0700 (PDT) X-ASG-Debug-ID: 1472311469-0bf8155c752721d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gVQCmUeDsjfQmiQt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 27 Aug 2016 08:24:29 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 01A6DC057FA6; Sat, 27 Aug 2016 15:24:29 +0000 (UTC) Received: from localhost (dhcp-12-196.nay.redhat.com [10.66.12.196]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7RFORI0002140; Sat, 27 Aug 2016 11:24:28 -0400 Date: Sat, 27 Aug 2016 23:24:27 +0800 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: Re: [PATCH] fstests: test xfs rw remount with unknown ro-compat features Message-ID: <20160827152427.GK10350@dhcp12-143.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] fstests: test xfs rw remount with unknown ro-compat features References: <1472309497-11351-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472309497-11351-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Sat, 27 Aug 2016 15:24:29 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472311469 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4992 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 27, 2016 at 10:51:37PM +0800, Zorro Lang wrote: > Although ro-compat features cannot be mounted rw, a bug allows > an ro->rw remount transition, and this will corrupt the filesystem > if it contains ro-compat features unknown to the running kernel. > > This bug has been fix on linux kernel (d0a58e8 xfs: disallow rw > remount on fs with unknown ro-compat features), this case is > the regression testcase of that bug. > > Signed-off-by: Zorro Lang > --- > tests/xfs/263 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/263.out | 6 ++++ > tests/xfs/group | 1 + > 3 files changed, 106 insertions(+) > create mode 100755 tests/xfs/263 > create mode 100644 tests/xfs/263.out > > diff --git a/tests/xfs/263 b/tests/xfs/263 > new file mode 100755 > index 0000000..b934e9f > --- /dev/null > +++ b/tests/xfs/263 > @@ -0,0 +1,99 @@ > +#! /bin/bash > +# FS QA Test 263 > +# > +# Test upstream d0a58e8: > +# xfs: disallow rw remount on fs with unknown ro-compat features > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > + # Due to we've broken the superblock of SCRATCH_DEV by > + # xfs_db, so clean bad superblock at the end > + _scratch_unmount > + _scratch_mkfs >/dev/null 2>&1 > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# remove previous $seqres.full before test > +rm -f $seqres.full > + > +# real QA test starts here > +_supported_fs xfs > +_supported_os Linux > +_require_scratch > +_require_xfs_crc > + > +# Only V5 XFS disallow rw mount/remount with unknown ro-compat > +# features > +MKFS_OPTIONS="-m crc=1" > +_scratch_mkfs_xfs >>$seqres.full 2>&1 > + > +# set the highest bit of features_ro_compat, use it as an unknown > +# feature bit. If one day this bit become known feature, please > +# change this case. > +$XFS_DB_PROG -x -c "sb 0" \ > + -c "write features_ro_compat $((2**31))" \ > + $SCRATCH_DEV > + > +echo "rw mount test" > +# Generally this mount failed as bad superblock > +# But still keep testing this > +MOUNT_OPTIONS="-o rw" > +_scratch_mount 2>>$seqres.full > +if [ $? -eq 0 ]; then > + _fail "rw mount test failed" > +fi > + > +echo "ro mount test" > +MOUNT_OPTIONS="-o ro" > +_scratch_mount > +if [ $? -ne 0 ]; then > + _fail "ro mount test failed" > +else > + # no hang/panic is fine > + $FSSTRESS_PROG -d $SCRATCH_MNT -p 4 -n 400 >>$seqres.full 2>&1 > +fi > + > +dmesg -c >/dev/null > +echo "rw remount test" > +MOUNT_OPTIONS="-o rw,remount" > +_scratch_mount 2>>$seqres.full > +if [ $? -eq 0 ]; then > + _fail "rw,remount test failed" > +fi > +dmesg -c | sed -n -e "s/.*XFS.*: \(ro->rw transition prohibited.*\)/\1/p" > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/263.out b/tests/xfs/263.out > new file mode 100644 > index 0000000..974e02f > --- /dev/null > +++ b/tests/xfs/263.out > @@ -0,0 +1,6 @@ > +QA output created by 263 > +features_ro_compat = 0x80000000 > +rw mount test > +ro mount test > +rw remount test > +mount: cannot remount LOOP_IMG read-write, is write-protected Sorry, please ignore this patch. I forgot to update the .out file. I'll send a V2 to fix this problem. Thanks, Zorro > diff --git a/tests/xfs/group b/tests/xfs/group > index 6905a62..ec3c022 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -260,6 +260,7 @@ > 260 auto quick quota > 261 auto quick quota > 262 auto quick quota > +263 auto quick mount > 265 auto clone > 266 dump ioctl auto quick > 267 dump ioctl tape > -- > 2.7.4 > > -- > To unsubscribe from this list: send the line "unsubscribe fstests" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From zlang@redhat.com Sat Aug 27 10:28:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 591997CAE for ; Sat, 27 Aug 2016 10:28:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75929AC001 for ; Sat, 27 Aug 2016 08:28:39 -0700 (PDT) X-ASG-Debug-ID: 1472311717-0bf57c55b4248250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hSSgyl2qE85xhgDN (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sat, 27 Aug 2016 08:28:37 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 247454DAF8; Sat, 27 Aug 2016 15:28:37 +0000 (UTC) Received: from localhost (vpn1-5-239.pek2.redhat.com [10.72.5.239]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7RFSZme031259; Sat, 27 Aug 2016 11:28:36 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH v2] fstests: test xfs rw remount with unknown ro-compat features Date: Sat, 27 Aug 2016 23:28:33 +0800 X-ASG-Orig-Subj: [PATCH v2] fstests: test xfs rw remount with unknown ro-compat features Message-Id: <1472311713-12992-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Sat, 27 Aug 2016 15:28:37 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472311717 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4387 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Although ro-compat features cannot be mounted rw, a bug allows an ro->rw remount transition, and this will corrupt the filesystem if it contains ro-compat features unknown to the running kernel. This bug has been fix on linux kernel (d0a58e8 xfs: disallow rw remount on fs with unknown ro-compat features), this case is the regression testcase of that bug. Signed-off-by: Zorro Lang --- V2 fix some mistakes of golden image(.out) file. Thanks, Zorro tests/xfs/263 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/263.out | 6 ++++ tests/xfs/group | 1 + 3 files changed, 106 insertions(+) create mode 100755 tests/xfs/263 create mode 100644 tests/xfs/263.out diff --git a/tests/xfs/263 b/tests/xfs/263 new file mode 100755 index 0000000..a46e250 --- /dev/null +++ b/tests/xfs/263 @@ -0,0 +1,99 @@ +#! /bin/bash +# FS QA Test 263 +# +# Test upstream d0a58e8: +# xfs: disallow rw remount on fs with unknown ro-compat features +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + # Due to we've broken the superblock of SCRATCH_DEV by + # xfs_db, so clean bad superblock at the end + _scratch_unmount + _scratch_mkfs >/dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# remove previous $seqres.full before test +rm -f $seqres.full + +# real QA test starts here +_supported_fs xfs +_supported_os Linux +_require_scratch +_require_xfs_crc + +# Only V5 XFS disallow rw mount/remount with unknown ro-compat +# features +MKFS_OPTIONS="-m crc=1" +_scratch_mkfs_xfs >>$seqres.full 2>&1 + +# set the highest bit of features_ro_compat, use it as an unknown +# feature bit. If one day this bit become known feature, please +# change this case. +$XFS_DB_PROG -x -c "sb 0" \ + -c "write features_ro_compat $((2**31))" \ + $SCRATCH_DEV + +echo "rw mount test" +# Maybe this mount will fail by bad superblock +# But keep testing this anyway +MOUNT_OPTIONS="-o rw" +_scratch_mount 2>>$seqres.full +if [ $? -eq 0 ]; then + _fail "rw mount test failed" +fi + +echo "ro mount test" +MOUNT_OPTIONS="-o ro" +_scratch_mount +if [ $? -ne 0 ]; then + _fail "ro mount test failed" +else + # no hang/panic is fine + $FSSTRESS_PROG -d $SCRATCH_MNT -p 4 -n 400 >>$seqres.full 2>&1 +fi + +dmesg -c >/dev/null +echo "rw remount test" +MOUNT_OPTIONS="-o rw,remount" +_scratch_mount 2>>$seqres.full +if [ $? -eq 0 ]; then + _fail "rw,remount test failed" +fi +dmesg -c | sed -n -e "s/.*XFS.*: \(ro->rw transition prohibited.*\)/\1/p" + +# success, all done +status=0 +exit diff --git a/tests/xfs/263.out b/tests/xfs/263.out new file mode 100644 index 0000000..440ed32 --- /dev/null +++ b/tests/xfs/263.out @@ -0,0 +1,6 @@ +QA output created by 263 +features_ro_compat = 0x80000000 +rw mount test +ro mount test +rw remount test +ro->rw transition prohibited on unknown (0x80000000) ro-compat filesystem diff --git a/tests/xfs/group b/tests/xfs/group index 6905a62..ec3c022 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -260,6 +260,7 @@ 260 auto quick quota 261 auto quick quota 262 auto quick quota +263 auto quick mount 265 auto clone 266 dump ioctl auto quick 267 dump ioctl tape -- 2.7.4 From david@fromorbit.com Sat Aug 27 17:55:27 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E711F7CB1 for ; Sat, 27 Aug 2016 17:55:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AB95F8F8037 for ; Sat, 27 Aug 2016 15:55:24 -0700 (PDT) X-ASG-Debug-ID: 1472338521-0bf8155c7428fec0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Xm5GYoP62O39QiCT for ; Sat, 27 Aug 2016 15:55:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2DjHQD4GMJXEAI1LHldDg4BAQQBAYMpAQEBAQEeV3yjBwEBAQEBAQaMcYgkggEmhXEEAgKBNDoTAQIBAQEBAQEBBgEBAQEBAQEBN0CEYQEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTiDgHD78tAQEBAQYCAR8FHoVIhRWKHAWZT4YgiQGPX4xEg3kgAoQTTSo0hkwBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 28 Aug 2016 08:25:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bdmVT-0006du-7f; Sun, 28 Aug 2016 08:55:19 +1000 Date: Sun, 28 Aug 2016 08:55:19 +1000 From: Dave Chinner To: Jun He Cc: xfs@oss.sgi.com Subject: Re: XFS discards more data than it writes Message-ID: <20160827225519.GI19025@dastard> X-ASG-Orig-Subj: Re: XFS discards more data than it writes References: <20160827014537.GA4119@Juns-MacBook-Pro.local> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160827014537.GA4119@Juns-MacBook-Pro.local> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472338521 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1191 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32379 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 26, 2016 at 08:45:37PM -0500, Jun He wrote: > Hi all, > > I find that, with '-o discard', XFS sometimes discards more data than it > writes. This may slow down XFS more on slow-discard SSDs. Also, could > problematic discard implementation lead to data loss? > > Setup to reproduce: > - Linux 4.5.4 > - Workload: LevelDB > > $ mkfs.xfs -K -f -s size=4096 -b size=4096 /dev/sdc1 > $ mount -o discard /dev/sdc1 /mnt/fsonloop > $ leveldb/db_bench --benchmarks=overwrite --num=3000000 --db=/mnt/fsonloop/leveldb_data0 --threads=1 --use_existing_db=0 > > I found that XFS discarded ~2.4GB while only wrote ~1.4GB, > by blktrace. (This is not due to the mkfs discarding the > whole disk.) Yup. Discard covers extents being freed, not ranges being written. So there's metadata, preallocated (unwritten) regions, speculative prealloc beyond EOF, etc, all of which won't be counted in "writes" but will be counted in "discards". > Some visual https://github.com/junhe/xfs-bug-report/blob/master/xfs-double-discard.png > Some spaces are discarded twice in this case. > > Is it a bug? No. Cheers, Dave. -- Dave Chinner david@fromorbit.com From 3eGPCVxQKAw0q4v8r-5un4r5-014r2yBt11tyr.p1zAs5155.5tv.p1z@doclist.bounces.google.com Sat Aug 27 23:07:26 2016 Return-Path: <3eGPCVxQKAw0q4v8r-5un4r5-014r2yBt11tyr.p1zAs5155.5tv.p1z@doclist.bounces.google.com> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A90D47CA0 for ; Sat, 27 Aug 2016 23:07:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32CE4AC001 for ; Sat, 27 Aug 2016 21:07:23 -0700 (PDT) X-ASG-Debug-ID: 1472357240-0bf8155c772a4020001-NocioJ Received: from mail-oi0-f69.google.com (mail-oi0-f69.google.com [209.85.218.69]) by cuda.sgi.com with ESMTP id hvG3UkKvg71DL9oy (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Sat, 27 Aug 2016 21:07:20 -0700 (PDT) X-Barracuda-Envelope-From: 3eGPCVxQKAw0q4v8r-5un4r5-014r2yBt11tyr.p1zAs5155.5tv.p1z@doclist.bounces.google.com X-Barracuda-Effective-Source-IP: mail-oi0-f69.google.com[209.85.218.69] X-Barracuda-Apparent-Source-IP: 209.85.218.69 Received: by mail-oi0-f69.google.com with SMTP id t127so123693283oie.2 for ; Sat, 27 Aug 2016 21:07:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:reply-to:references:message-id:date:subject:from:to:cc; bh=FMsyzmsFP9mHKdQz0A4kDwxTcQLoWHoZW4KTtmUP9vw=; b=DMBPG7b3eVfL+PVyP2j/CWB0IxEK/MWccSNAvEnAHOHepJc3yradLPZV49BZvtf0cQ EdFXBglKQSc50cUh00ia6dLV6KFScBDi7aeILzFbqSpZeB4xNH/CUKxOh8uTR3ynk4ua etmBSndhbIwDnWCeF5PtOUoI3E1ggoN3f7EJoyml5gy7cJerEBnacJce8H5MrB0tE3Xm mT+Lu20ePklRbK7k9O21cn6uZuPfm3gdNRsEM7NIvsL+5kLjptLT8Jm0jn3/Qavd1xvE +aSiUq63W6ACHONbHHq3u0lNEqlUx4ugUGRa8Jjkhq1Y2fL8QbIMY69EgEHZhbNw+flW H2KA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:reply-to:references:message-id:date :subject:from:to:cc; bh=FMsyzmsFP9mHKdQz0A4kDwxTcQLoWHoZW4KTtmUP9vw=; b=U8n+kfOrwYEGzsuAZwDP4C9f3RiJzfBMUGn71FDTRNrnrYTHUj7r1QbdaWLEm/jo2c BzO3eWxk8u0DA78cb5q/xTOBzsK4oQbOEijMLOHFGliKiHLt6i2wtTBywTkbm6AS9N8b 3vSI+3kuaYmNjHEFEtvlR1CDeoof7TkRO2XcfqNgk7kOU8ZGHhs08JucUDeQwVF7bkWg BLt8m33Vc1htBLjIkSH3a7DthwXsVSkioXfJQkdibOXw96PV6/enx3OA6lUtSi3M6JRI FXxe0K/T4MuBwNyK/41Ted1KsulYoaMDTmSW9YwroxqMik3bhAKMDGCBfpSDkq5milFu x3GQ== X-Gm-Message-State: AE9vXwM99aCY5mixwW2MohtzO/BfYoPuKGwsL97oYfJCpwTv4FO3Cvn6Nn4DehkfE4hKM7knk+WXJQ== MIME-Version: 1.0 X-Received: by 10.107.29.79 with SMTP id d76mr8316315iod.23.1472357240064; Sat, 27 Aug 2016 21:07:20 -0700 (PDT) Reply-To: "Chair hammock/steel ha..." X-Originating-IP: 103.61.136.79 X-No-Auto-Attachment: 1 References: Message-ID: <001a1140a2c246d09c053b19e2e1@google.com> Date: Sun, 28 Aug 2016 04:07:20 +0000 Subject: Chair hammocksteel hammock standrope hammockbaby swing hammock Supply82353 - Invitation to view From: "Chair hammock/steel ha... (via Google Drive)" X-ASG-Orig-Subj: Chair hammocksteel hammock standrope hammockbaby swing hammock Supply82353 - Invitation to view To: xfs@oss.sgi.com Cc: info@rugstreet.com, chris.bone10@googlemail.com, mike.kennedy@sportstrainingacademy.ca, Matthew.levine@OUTFRONTmedia.ca, sales@supplypartners.com.au, anlarchen@vip.163.com, sheds@fxoutdoors.com, karen_neumann@wrdsb.on.ca, bookings@blindtyger.co.uk, donna_sternick@merck.com, mkelly@meetingscanada.com, sgoh@destinationauto.ca, sportingschoolsnt@touchfootball.com.au, rschlueter@cgc-group.com, consumersupport@allclad.com, rugs@prideofpersia.com, ben@bigbensboxing.com.au, info@hirex.com.au, properties@inlett.com, rene@escoconcreteinc.com, andy@turn1.com, ines.luludes@framepool.com, texascarrilon@gmail.com, HA2014_c.watson@havantacademy.co.uk, info@hoteluniverselmontreal.com, lded.folded@ibm.net, info@altitude8000.com, sales@footsure.net, holly.lenk@tourismvictoria.com, ONeill6750@aol.com, mrgregberry@gmail.com, K.Laycock@leeds.ac.uk, familia.angelus@verizon.net, fanaberie@yahoo.com, info@kainya.com, estefanik@mps-edu.org, heathrow@servicepointuk.com, dholt@howardhanna.com, scott@zonenetlink.com, lhubner@timesrecord.com, admin@polehampton-jun.wokingham.sch.uk, rodlockerpro@hotmail.com, thomast@usd230.org, bryan.snelson@raymondjames.ca, tlchoward@hotmail.com, circ@chesapeakeboating.net, reports@trademart.in, donnapaden@northropteam.com, info@styrophobia.com Content-Type: multipart/alternative; boundary=001a1140a2c246d010053b19e2de X-Barracuda-Connect: mail-oi0-f69.google.com[209.85.218.69] X-Barracuda-Start-Time: 1472357240 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7534 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32384 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1140a2c246d010053b19e2de Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes I've shared an item with you: Chair hammocksteel hammock standrope hammockbaby swing hammock Supply82353 https://drive.google.com/folderview?id=0B6MOPZcUkPaGanljZGtlbXZnMVU&usp=sharing&invite=CL6H0ssM&ts=57c26377 It's not an attachment -- it's stored online. To open this item, just click the link above. Dear Madam/ Sir, Good day! Our factory specializes in making and exporting all kinds of hammock and hammock stand since 2002. We mainly produce Chair hammock, hammock bed, Jumbo hammock, rope hammock, baby swing hammock, and steel hammock stand, etc, also supply the fine special style hammock for our clients as promotional items and gifts. All of our hammocks are hand weave. Any of our products all have been passed the international standard and strict test. Hopefully we will be the right partner for you in this field. We would recommend you some popular hammocks if you have interest. Any question or need more information, Pls feel free to contact us. Looking forward to your reply soon. Have a nice day! Best Regards Susan --001a1140a2c246d010053b19e2de Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Chair hammock/st= eel hammock stand/rope hammock /baby swing hammock Supply/wwa62 has inv= ited you to view the following shared folder:
3D"=E5=8F=91=E4=BB=B6=E4=BA=BA=E7=9A=Dear Madam/ Sir, =
Good day!

Our factory specializes in making and exporting = all kinds of hammock and hammock stand since 2002.
We mainly produ= ce Chair hammock, hammock bed, Jumbo hammock, rope
hammock, baby swi= ng hammock, and steel hammock stand, etc, also supply the fine special sty= le hammock for our clients as promotional items and gifts.
All of our = hammocks are hand weave.
Any of our products all have been passed the = international standard and strict
test.

Hopefully we will be = the right partner for you in this field. We would
recommend you some= popular hammocks if you have interest.

Any question or need more= information, Pls feel free to contact us.

Looking forward to your r= eply soon.
Have a nice day!
Best Regards
Susan
This email grants access to this item without logging in. O= nly forward it to people you trust.
=
<= td width=3D"1" bgcolor=3D"#f0f0f0" style=3D"padding: 0px;">
=
<= td width=3D"1" bgcolor=3D"#eaeaea" style=3D"padding: 0px;">
Google Drive: Have all your files within reach from any d= evice.
Google Inc. 1600 Amphitheatre Parkway, Mountain View, CA 94043,= USA
3D"Logo
--001a1140a2c246d010053b19e2de-- From eguan@redhat.com Sun Aug 28 02:35:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 426367CA0 for ; Sun, 28 Aug 2016 02:35:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1408E8F8033 for ; Sun, 28 Aug 2016 00:35:14 -0700 (PDT) X-ASG-Debug-ID: 1472369707-0bf57c55b128b5e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ClYDG1BlfJBMXw0s (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 28 Aug 2016 00:35:08 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5F1554E4C4; Sun, 28 Aug 2016 07:35:07 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7S7Z6RU022078; Sun, 28 Aug 2016 03:35:06 -0400 Date: Sun, 28 Aug 2016 15:35:05 +0800 From: Eryu Guan To: Zorro Lang Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2] fstests: test xfs rw remount with unknown ro-compat features Message-ID: <20160828073505.GD27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v2] fstests: test xfs rw remount with unknown ro-compat features References: <1472311713-12992-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472311713-12992-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Sun, 28 Aug 2016 07:35:07 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472369708 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5831 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 27, 2016 at 11:28:33PM +0800, Zorro Lang wrote: > Although ro-compat features cannot be mounted rw, a bug allows > an ro->rw remount transition, and this will corrupt the filesystem > if it contains ro-compat features unknown to the running kernel. > > This bug has been fix on linux kernel (d0a58e8 xfs: disallow rw > remount on fs with unknown ro-compat features), this case is > the regression testcase of that bug. > > Signed-off-by: Zorro Lang > --- > > V2 fix some mistakes of golden image(.out) file. > > Thanks, > Zorro > > tests/xfs/263 | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/263.out | 6 ++++ > tests/xfs/group | 1 + > 3 files changed, 106 insertions(+) > create mode 100755 tests/xfs/263 > create mode 100644 tests/xfs/263.out > > diff --git a/tests/xfs/263 b/tests/xfs/263 > new file mode 100755 > index 0000000..a46e250 > --- /dev/null > +++ b/tests/xfs/263 > @@ -0,0 +1,99 @@ > +#! /bin/bash > +# FS QA Test 263 > +# > +# Test upstream d0a58e8: > +# xfs: disallow rw remount on fs with unknown ro-compat features Need detailed test description here too. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > + # Due to we've broken the superblock of SCRATCH_DEV by > + # xfs_db, so clean bad superblock at the end > + _scratch_unmount > + _scratch_mkfs >/dev/null 2>&1 This can be done by calling _require_scratch_nocheck in the test instead of _require_scratch, so there's no fsck run after test. > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# remove previous $seqres.full before test > +rm -f $seqres.full > + > +# real QA test starts here > +_supported_fs xfs > +_supported_os Linux > +_require_scratch > +_require_xfs_crc _require_scratch_xfs_crc and .. > + > +# Only V5 XFS disallow rw mount/remount with unknown ro-compat > +# features > +MKFS_OPTIONS="-m crc=1" you don't have to overwrite MKFS_OPTIONS, let the user specify test config, and just skip the test if scratch_dev has no crc support. > +_scratch_mkfs_xfs >>$seqres.full 2>&1 > + > +# set the highest bit of features_ro_compat, use it as an unknown > +# feature bit. If one day this bit become known feature, please > +# change this case. > +$XFS_DB_PROG -x -c "sb 0" \ > + -c "write features_ro_compat $((2**31))" \ > + $SCRATCH_DEV > + > +echo "rw mount test" > +# Maybe this mount will fail by bad superblock > +# But keep testing this anyway > +MOUNT_OPTIONS="-o rw" rw mount is the default, I don't think overwriting MOUNT_OPTIONS is necessary. > +_scratch_mount 2>>$seqres.full > +if [ $? -eq 0 ]; then > + _fail "rw mount test failed" > +fi > + > +echo "ro mount test" > +MOUNT_OPTIONS="-o ro" > +_scratch_mount _scratch_mount -o ro No need to overwrite MOUNT_OPTIONS either. > +if [ $? -ne 0 ]; then > + _fail "ro mount test failed" > +else > + # no hang/panic is fine > + $FSSTRESS_PROG -d $SCRATCH_MNT -p 4 -n 400 >>$seqres.full 2>&1 I don't think this is necessary, because the fs is ro-mounted, but it's fine by me, just make sure there's no hang/panic on unknown ro_compat feature ro-mount. > +fi > + > +dmesg -c >/dev/null > +echo "rw remount test" > +MOUNT_OPTIONS="-o rw,remount" > +_scratch_mount 2>>$seqres.full _scratch_remount rw > +if [ $? -eq 0 ]; then > + _fail "rw,remount test failed" > +fi > +dmesg -c | sed -n -e "s/.*XFS.*: \(ro->rw transition prohibited.*\)/\1/p" We probably don't want to clear dmesg buffer if possible, and I think making sure remount,rw failed is good enough. Or we can write a new helper to look for specific dmesg by following how _check_dmesg does? Thanks, Eryu > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/263.out b/tests/xfs/263.out > new file mode 100644 > index 0000000..440ed32 > --- /dev/null > +++ b/tests/xfs/263.out > @@ -0,0 +1,6 @@ > +QA output created by 263 > +features_ro_compat = 0x80000000 > +rw mount test > +ro mount test > +rw remount test > +ro->rw transition prohibited on unknown (0x80000000) ro-compat filesystem > diff --git a/tests/xfs/group b/tests/xfs/group > index 6905a62..ec3c022 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -260,6 +260,7 @@ > 260 auto quick quota > 261 auto quick quota > 262 auto quick quota > +263 auto quick mount > 265 auto clone > 266 dump ioctl auto quick > 267 dump ioctl tape > -- > 2.7.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From Sales.34@Halloweenmask.net Sun Aug 28 02:40:27 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 88E9A7CA0 for ; Sun, 28 Aug 2016 02:40:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1A365AC002 for ; Sun, 28 Aug 2016 00:40:17 -0700 (PDT) X-ASG-Debug-ID: 1472369974-0bf8155c742af870001-NocioJ Received: from Halloweenmask.net ([14.120.34.72]) by cuda.sgi.com with SMTP id 1h95bRY28fHe6s88 for ; Sun, 28 Aug 2016 00:39:34 -0700 (PDT) X-Barracuda-Envelope-From: Sales.34@Halloweenmask.net X-Barracuda-Effective-Source-IP: UNKNOWN[14.120.34.72] X-Barracuda-Apparent-Source-IP: 14.120.34.72 Received: from 2013-20151114MK[127.0.0.1] by 2013-20151114MK[127.0.0.1] (SMTPD32); Sun, 28 Aug 2016 14:17:24 +0800 From: "sales@maskoem.com" Subject: Re:Res:Re/Halloween mask/supply Halloween mask To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re:Res:Re/Halloween mask/supply Halloween mask Content-Type: multipart/mixed; charset=UTF-8; boundary="QqnZc1pCYELM54DpCuHVWrV3W=_ZEP1Yr4" MIME-Version: 1.0 Sender: Sales.34@Halloweenmask.net Reply-To: sales@maskoem.com Date: Sun, 28 Aug 2016 14:17:24 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] X-Barracuda-Connect: UNKNOWN[14.120.34.72] X-Barracuda-Start-Time: 1472369974 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1522 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.37 X-Barracuda-Spam-Status: No, SCORE=2.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DEAR_FRIEND, HTML_IMAGE_ONLY_16, HTML_IMAGE_ONLY_16_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32388 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 1.00 DEAR_FRIEND BODY: Dear Friend? That's not very dear! 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.63 HTML_IMAGE_ONLY_16_2 HTML: images with 1200-1600 bytes of words 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160828074017.9080FD8007D@cuda.sgi.com> This is a multi-part message in MIME format --QqnZc1pCYELM54DpCuHVWrV3W=_ZEP1Yr4 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC45NjAwLjE4MjMxIj48L0hFQUQ+DQo8Qk9EWT4NCjxQPkRlYXIgRnJp ZW5kLDwvUD4NCjxQPjxCUj5JdCBpcyBteSBncmVhdCBob25vciB0aGF0IHlvdSBjYW4gcmVhZCB0 aGUgbWVzc2FnZSB3ZSBzZW5kIHRvIHlvdSBpbiB0aGUgDQptaWRzdCBvZiB5b3VyIGJ1c3kgc2No ZWR1bGUuPEJSPkZpcnN0IG9mIGFsbCxJIHdvdWxkIGxpa2UgdG8gaW50cm9kdWNlIG15IA0KY29t cGFueSB0byB5b3UgaW4gYnJpZWY6PC9QPg0KPFA+V2UgaGF2ZSBhbiBpbmRlcGVuZGVudCBmYWN0 b3J5IHdoaWNoIGhhcyBmb2N1cyBvbiBIQUxMT1dFRU4gTUFTS1MsIGRlc2lnbiwgDQpwcm9kdWN0 aW9uLCBzYWxlcy5JbiBhZGRpdGlvbi5XZSBhbHNvIGhhdmUgYSBjb21wbGV0ZSBzdXJ2ZWlsbGFu Y2Ugc3lzdGVtIGFuZCANCm1hbnVmYWN0dXJpbmcgc3lzdGVtIGluIG9yZGVyIHRoYXQgV2UgY2Fu IGFzc3VyZSB5b3UgdGhhdCB3ZSBjYW4gcHJvdmlkZSBoaWdoIA0KcXVhbGl0eSBwcm9kdWN0cyBh bmQgY29tcGV0aXRpdmUgcHJpY2VzIHRvIG91ciBndWVzdHMuIElmIHlvdSBoYXZlIG1vcmUgZGV0 YWlsZWQgDQpyZXF1ZXN0cywgeW91IGNvdWxkIGNvbnRhY3QgdXMgYnkgZS1tYWlscyBvciB0ZWxl cGhvbmUsV2UgYXJlIGtlZW5seSBsb29raW5nIA0KZm9yd2FyZCB0byB5b3VyIHNpbmNlcmVseSBy ZXBseS5Nb3Jlb3ZlcixXZSBhbHNvIGtlZW5seSBlc3RhYmxpc2ggbG9uZy10ZXJtIA0KY29vcGVy YXRpb24gd2l0aCB5b3VyLjxCUj5FbmpveSB5b3VyIGdvb2QgdGltZXMgaW4geW91ciBsaWZlIUhh dmUgYSBuaWNlIA0KdGltZSE8L1A+DQo8UD48QlI+VGhhbmtzJmFtcDtCZXN0IFJlZ2FyZHMsPEJS PkZyYW5rIFpoYW88QlI+c2FsZXMgZGlyZWN0b3I8QlI+RW1sOiA8QSANCmhyZWY9Im1haWx0bzpz YWxlc0BtYXNrb2VtLmNvbSI+c2FsZXNAbWFza29lbS5jb208L0E+PEJSPkVtYmVsaXNoIEplZWZv byBUcmFkaW5nIA0KQ28uLEx0ZDxCUj5GYWN0b3J5OiBEb25nZ3VhbiBDaXR5IEVtYmVsaXNoIEpl ZWZvbyBUb3lzIENvLixMdGQ8L1A+DQo8UD5Nb2JpbGU6ICs4NiAxNTIxNzIzOTQyNjxJTUcgYm9y ZGVyPTAgaHNwYWNlPTAgYWx0PSIiIA0Kc3JjPSJjaWQ6aW1nMC5qcGciIGFsaWduPWJhc2VsaW5l PjwvUD4NCjxQPjxJTUcgYm9yZGVyPTAgaHNwYWNlPTAgYWx0PSIiIHNyYz0iY2lkOmltZzEuanBn IiANCmFsaWduPWJhc2VsaW5lPjxJTUcgYm9yZGVyPTAgaHNwYWNlPTAgYWx0PSIiIHNyYz0iY2lk OmltZzIuanBnIiANCmFsaWduPWJhc2VsaW5lPjwvUD48L0JPRFk+PC9IVE1MPg0KDQo= --QqnZc1pCYELM54DpCuHVWrV3W=_ZEP1Yr4 Content-Type: image/jpeg; name="24.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="24.jpg" Content-ID: Content-Description: Photo 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 +ZFbY6x4dc7c62wveRwJ/SO2t/N/SO/NV5ljGwQYjnwIWddkevcHljaWNEMrZJAHJ9ziXPe/896j 6ukHhEhl5XmBiidKva/mTteDuAP0iR/ZBVPPyBdaGt+hUNrfCfzimdkFocR9J2gVZJq81zRlD249 dZfT5Y/90kY7Ro7gqRHtHioNcIgjTme6cWAaEEt/FJpLGBryUpgg+H5UUHHcNA7+7/pKTmU7ZAdx u8DCVpAJvwf/0PLgW7YiSDJ7BScA1oIbtI0PBSdBaBI8T21Q+eeUFx00SMsg68KZdMu8Gk6f5v8A FBEdxJSdP9yS1gkkkipSSSSSkpskR2TbtUNKUl/uFL6hS9QoUpSkr3D3S+oUxtPCHKSSjkl3UTKS SSSxcKfp7u8HzUWcogseCXA86aJJAZ047jqfazme5+CIXgS4AANgAR4zwhVO1JmANTroihw1Mjd3 +B/8ycmG7Z8fDwitO9v/2f/tIQ5QaG90b3Nob3AgMy4wADhCSU0EBAAAAAAAJxwBWgADGyVHHAFa AAMbJUccAVoAAxslRxwBWgADGyVHHAIAAAIAAAA4QklNBCUAAAAAABCaia1dKG26IQLIy6lnBT/b OEJJTQQ6AAAAAADXAAAAEAAAAAEAAAAAAAtwcmludE91dHB1dAAAAAUAAAAAUHN0U2Jvb2wBAAAA AEludGVlbnVtAAAAAEludGUAAAAASW1nIAAAAA9wcmludFNpeHRlZW5CaXRib29sAAAAAAtwcmlu dGVyTmFtZVRFWFQAAAABAAAAAAAPcHJpbnRQcm9vZlNldHVwT2JqYwAAAAVoIWg3i75/bgAAAAAA CnByb29mU2V0dXAAAAABAAAAAEJsdG5lbnVtAAAADGJ1aWx0aW5Qcm9vZgAAAAlwcm9vZkNNWUsA OEJJTQQ7AAAAAAItAAAAEAAAAAEAAAAAABJwcmludE91dHB1dE9wdGlvbnMAAAAXAAAAAENwdG5i b29sAAAAAABDbGJyYm9vbAAAAAAAUmdzTWJvb2wAAAAAAENybkNib29sAAAAAABDbnRDYm9vbAAA AAAATGJsc2Jvb2wAAAAAAE5ndHZib29sAAAAAABFbWxEYm9vbAAAAAAASW50cmJvb2wAAAAAAEJj a2dPYmpjAAAAAQAAAAAAAFJHQkMAAAADAAAAAFJkICBkb3ViQG/gAAAAAAAAAAAAR3JuIGRvdWJA b+AAAAAAAAAAAABCbCAgZG91YkBv4AAAAAAAAAAAAEJyZFRVbnRGI1JsdAAAAAAAAAAAAAAAAEJs ZCBVbnRGI1JsdAAAAAAAAAAAAAAAAFJzbHRVbnRGI1B4bEBSAAAAAAAAAAAACnZlY3RvckRhdGFi b29sAQAAAABQZ1BzZW51bQAAAABQZ1BzAAAAAFBnUEMAAAAATGVmdFVudEYjUmx0AAAAAAAAAAAA AAAAVG9wIFVudEYjUmx0AAAAAAAAAAAAAAAAU2NsIFVudEYjUHJjQFkAAAAAAAAAAAAQY3JvcFdo ZW5QcmludGluZ2Jvb2wAAAAADmNyb3BSZWN0Qm90dG9tbG9uZwAAAAAAAAAMY3JvcFJlY3RMZWZ0 bG9uZwAAAAAAAAANY3JvcFJlY3RSaWdodGxvbmcAAAAAAAAAC2Nyb3BSZWN0VG9wbG9uZwAAAAAA OEJJTQPtAAAAAAAQAEgAAAABAAIASAAAAAEAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJ TQQNAAAAAAAEAAAAeDhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQ AAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoA BgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA /////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/ ////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4QklN BAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAADOQAAAAYA AAAAAAAAAAAAAyAAAAMgAAAAAgAyADQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA AyAAAAMgAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxs AAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABM ZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAMgAAAAAFJnaHRsb25nAAADIAAAAAZzbGljZXNWbExz AAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElE bG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAA AABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABS Y3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAADIAAA AABSZ2h0bG9uZwAAAyAAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dl VEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAI Y2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAA B2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAA AAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRz ZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAA AAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAACP/AAAAAAAAA4QklNBBQAAAAA AAQAAACQOEJJTQQMAAAAABVYAAAAAQAAAKAAAACgAAAB4AABLAAAABU8ABgAAf/Y/+0ADEFkb2Jl X0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwM DAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEM DAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCACgAKADASIAAhEB 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 ZmYAZHrhAKZmZgBkeuEApmZmAGR64QABAKij1wBoAAAAqKPXAGgAAACoo9cAaAAAAAEAqj1wAGlH rgCqPXAAaUeuAKo9cABpR64AAQCtcKMAbCj1AK1wowBsKPUArXCjAGwo9QABALI9cABuZmYAsj1w AG5mZgCyPXAAbmZmAAEAthR6AHGZmQC2FHoAcZmZALYUegBxmZkAAQC6PXAAdMzMALo9cAB0zMwA uj1wAHTMzAABALszMwB2ZmYAuzMzAHZmZgC7MzMAdmZmAAEAu9cKAHj1wgC71woAePXCALvXCgB4 9cIAAQC8KPUAfHrhALwo9QB8euEAvCj1AHx64QABALvXCgCC4UcAu9cKAILhRwC71woAguFHAAEA u4UeAIszMwC7hR4AizMzALuFHgCLMzMAAQC8KPUAj64UALwo9QCPrhQAvCj1AI+uFAABALrhRwCS 4UcAuuFHAJLhRwC64UcAkuFHAAEAuAAAAJXCjwC4AAAAlcKPALgAAACVwo8AAQCy4UcAmeuFALLh RwCZ64UAsuFHAJnrhQABAK+uFACceuEAr64UAJx64QCvrhQAnHrhAAEArHrhAKAAAACseuEAoAAA AKx64QCgAAAAAQCnCj0ApcKPAKcKPQClwo8Apwo9AKXCjwABAKOFHgCoAAAAo4UeAKgAAACjhR4A qAAAAAEAlXCjAKCj1wCVcKMAoKPXAJVwowCgo9cAAQCOFHoAdrhRAI4UegB2uFEAjhR6AHa4UQAB AI0euABrhR4Aj64UAGszMwCSPXAAauFHOEJJTQQGAAAAAAAHAAgAAAABAQD/4VwfaHR0cDovL25z LmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlI enJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4Onht cHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6 MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8w Mi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5z OnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJs Lm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94 YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlw ZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu MC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNv bS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChX aW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTUtMTEtMTdUMjI6MzI6MjIrMDg6MDAiIHhtcDpN ZXRhZGF0YURhdGU9IjIwMTUtMTItMTRUMjE6MDY6MDgrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIy MDE1LTEyLTE0VDIxOjA2OjA4KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHhtcE1NOklu c3RhbmNlSUQ9InhtcC5paWQ6REI3NTMyMkY2MkEyRTUxMTlCNERDN0U3RjMxRUIzNjEiIHhtcE1N OkRvY3VtZW50SUQ9InhtcC5kaWQ6QUNFNERFMDMzODhERTUxMTkyOUM5MURCRkRCODYxOUQiIHht cE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpBQ0U0REUwMzM4OERFNTExOTI5QzkxREJG REI4NjE5RCIgcGhvdG9zaG9wOkxlZ2FjeUlQVENEaWdlc3Q9IkQzQzk5RjRCM0Q4REVBMjg4NTQ4 MzU2QTg0MTU5QzJCIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmls ZT0ic1JHQiBJRUM2MTk2Ni0yLjEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkg c3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkFDRTRERTAz Mzg4REU1MTE5MjlDOTFEQkZEQjg2MTlEIiBzdEV2dDp3aGVuPSIyMDE1LTExLTE3VDIyOjMyOjIy KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dz KSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5p aWQ6QURFNERFMDMzODhERTUxMTkyOUM5MURCRkRCODYxOUQiIHN0RXZ0OndoZW49IjIwMTUtMTEt MTdUMjI6NDI6MzErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBD UzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJz YXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpEMDVENUNCMDMwOTFFNTExODI1QTk4OEVB REVDNTA0NiIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0yM1QwMDoyNDowMiswODowMCIgc3RFdnQ6c29m dHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9 Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0i ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJk ZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBm cm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRm OmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RDE1RDVD QjAzMDkxRTUxMTgyNUE5ODhFQURFQzUwNDYiIHN0RXZ0OndoZW49IjIwMTUtMTEtMjNUMDA6MjQ6 MDIrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRv d3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RF dnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpEQjc1MzIyRjYyQTJFNTExOUI0REM3RTdGMzFFQjM2MSIg c3RFdnQ6d2hlbj0iMjAxNS0xMi0xNFQyMTowNjowOCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2Vu dD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9y ZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5j ZUlEPSJ4bXAuaWlkOkQwNUQ1Q0IwMzA5MUU1MTE4MjVBOTg4RUFERUM1MDQ2IiBzdFJlZjpkb2N1 bWVudElEPSJ4bXAuZGlkOkFDRTRERTAzMzg4REU1MTE5MjlDOTFEQkZEQjg2MTlEIiBzdFJlZjpv cmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6QUNFNERFMDMzODhERTUxMTkyOUM5MURCRkRCODYx OUQiLz4gPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHJkZjpCYWc+IDxyZGY6bGk+MTEw MzVGRDM0MzE0NjdCQjhEQkVDQzNCOTJBMjAxNDA8L3JkZjpsaT4gPHJkZjpsaT41ODI3REYxNjhB NUZFNzIzMEM4QUVDN0I4QUQyQkFBMjwvcmRmOmxpPiA8cmRmOmxpPjdGQjI3MDZENUQyMzE4RDY0 QzU4MUNGN0Q2RDE3Rjk4PC9yZGY6bGk+IDxyZGY6bGk+OTExQkU3NDIyNzAwOTFGMUUyNkNGMjY3 RjAwNUQ5MEY8L3JkZjpsaT4gPHJkZjpsaT45NUNCMkI2NjQ5M0NDMzI4OTdDRjQ0NEQxQzRCQzgw RTwvcmRmOmxpPiA8cmRmOmxpPkFFMDlCNkFGRDMwNjMwQjAwOTY4OEMxRUNFQjQ3ODNGPC9yZGY6 bGk+IDxyZGY6bGk+QUVBRDg3ODUxOTYwODFGQzJGRjMwQTdBRkUxRUQzOTM8L3JkZjpsaT4gPHJk ZjpsaT5CNTlBOTdEMDYxOEIyMkY2MkM4RTVFQUQwRTIxQjhGNzwvcmRmOmxpPiA8cmRmOmxpPkJD QUU0RkIyRTk1QkUzNTM3NkZCOEJFOUIwOUVFNDAzPC9yZGY6bGk+IDxyZGY6bGk+REM3MDc0NUY3 NEI4RTYxMDI5MjRCQTUzNzUwMDM2ODE8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90 b3Nob3A6MDU3YmUzYjktYWEwYS0xMWRlLTkxOTAtY2VkNDkzN2RjM2I5PC9yZGY6bGk+IDxyZGY6 bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjBmNDgwYTkzLThhOTItMTFkOS1iZTg4LWFkZjU1MGVj Y2Y0ODwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDowZjU1MzZhZS0yOTM4 LTExZGUtYTU5OS1hYjlhYjMzYTlkZDQ8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90 b3Nob3A6MTU5MjkxYWYtZTI4Ni0xMWQ4LTlkZWYtYzlkYWNmMTViNDdmPC9yZGY6bGk+IDxyZGY6 bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjI5NjdiZDc0LTY5MzQtMTFkZi04MTRkLThlYzczYzg5 MDhjZDwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDo1MGU2NDM4OC1mMmE4 LTExZDgtYmEzNy1iNTA1NzIzYjI3YTU8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90 b3Nob3A6NjEyYWEwMDItMTQyMS0xMWQ5LTgwNzAtY2NmYTcxYjNkMjc1PC9yZGY6bGk+IDxyZGY6 bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjZkNmZjYWNkLTg5MWUtMTFkYS1iNTE2LTg1NjYwYWMx MWYyOTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4N2JiNDk2Yi03ZDhl LTExZGMtYmZlOS1iMDU3YjcyMTdiMjk8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90 b3Nob3A6OGRmMjQxZDEtNTIxMC0xMWRkLTk0ZGQtZmExM2EzNDZkNDZiPC9yZGY6bGk+IDxyZGY6 bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmIxNzMxZDI1LTEyYWEtMTFkOC05MGU0LWI3YzFmMjdk OTFkNjwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpiYTI2MGQ2Yy1hYjli LTExZGEtYmQ1My1iZDNlYjA0YTJjNGQ8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90 b3Nob3A6YzRmOWI3MWEtOGM2MS0xMWRhLThhNzQtZWVhOWRhOWRjOWEwPC9yZGY6bGk+IDxyZGY6 bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmM2NWRlNDBlLWJlZWItMTFkYy05NWQyLTgxNTYzZDA1 OTNlMzwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjZTZkYzAzYi1lOTdi LTExZGQtODQyZS1mOTk1ZWE1MmQ2NWU8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90 b3Nob3A6ZjUzNjFjZjctZDUxNy0xMWUxLThhOGQtZTU0MWU0YjFhNjc1PC9yZGY6bGk+IDxyZGY6 bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmZjNjc2ZjZjLWJiOWItMTFkYi04NDFjLTllZmU0OThh M2U3NDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MDJCRUM4QjUxRDdDREMxMTk3NTY5MTNBREYzNzE3 MUM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjEyNUVBQzQ4OUZGNERFMTE4RDc4QTIzRjk4NkU3NDlG PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxMkM0ODhDQjEzRTJERTExOEIxNUMxOTA5MzBBRDZCNzwv cmRmOmxpPiA8cmRmOmxpPnV1aWQ6MTg5MTQ3OUUyM0JGREIxMTg4RDRCMTRBOTQ5RDRENkE8L3Jk ZjpsaT4gPHJkZjpsaT51dWlkOjFDNjgxODJBNDg3NURFMTFBOTkyRkQyREM2RTk4MzBEPC9yZGY6 bGk+IDxyZGY6bGk+dXVpZDoxQ0U4OEMxQkQxOURFMTExQTIxMERFRUZCODJENzY5NjwvcmRmOmxp PiA8cmRmOmxpPnV1aWQ6MUQ2QkExNzdDQzdFREUxMUJCN0JDOTVCRDc4NUY0Qzk8L3JkZjpsaT4g PHJkZjpsaT51dWlkOjFFMzZBQjA0QTY2M0UwMTE5NURDOERGOUU0RUZGRjk1PC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDoxRjVBRjNCNjcyMjlERjExOUZGQUIyNkUyNDBDNzFCQjwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6MUY4NjM1NUM3NUJFREUxMUE4MTRCNEZEMUQ1Nzk1QjE8L3JkZjpsaT4gPHJkZjps aT51dWlkOjIwOEM0NDUwN0UxM0RGMTE4ODJGRDM1NTA0MDg1MzgzPC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDoyQzI3RkRBNkZDRURERTExOTIxNTk1OTQ0QkYwQTk4NTwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6MkRCREQxQkZDRTFEREYxMTlBQkVDMTQ5MzMxRDMxNEQ8L3JkZjpsaT4gPHJkZjpsaT51dWlk OjJEQkY3NDUwM0MwMURFMTE5RURCQTE0Nzc5MDQwRTFBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoy RTczRDhGQTFBRDlERjExOUEzRkNFNzBCQkE3MjY5RjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MzJB RDkwMUMxNTQwREYxMUJBMjJFQjgzOTBFNDI3RkE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjMzMTM3 ODE1RkQ4RkRFMTFCRjFBOUY4OUZDNzgwREU4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDozODIyMjc0 MTk2NTBERTExODI4RUI3OUI3RkY4N0I0NjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6M0E0Njc3ODE1 RTI5REYxMUEwQjA4N0RGODk3RjVDNTY8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjNCN0Y1OEYxOUQ2 Q0UxMTFBMzVCQ0Q4REVEMTk5Mjg2PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDozRTA5QTg2MkYzNTBE RDExOTc2MEFDNjcyQTA2NUM4QTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6M0U0MDM3N0ZEMzdEREUx MUJEMzJFRkM4ODQyNEZCQjU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjNGQUFCMzFEQzdGM0RFMTFC RkIzQkI2MUFFMUExOThCPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo0NTdEMDI5NTUwNTVERjExOEI1 OUQ5NTlEOUZDRDUwQjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NDYyMjc0QkZGQTdDREMxMUJBQzNF MUYzNzUwMjVGN0I8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjQ4OEU3RDIxNjQxN0RGMTFBQjMwOTZE QjU5QkU4Mjc4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo0QkQ2NEUzRDU5MUFERjExOUE0NDgxNkU0 MjZEMTRDQzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NEQ0NzUzMERCRkIxREUxMTgzOENCNzlCQjAy OUM1MzM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjUwNzczQjYyOUQ4MERFMTE5QzVBRjk2Q0NGMkIw RkUxPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo1MTc1OTg2NzE3MDVERTExQUE3Q0Y3QTQ3QjMzRTMx NTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NTJBMEYzOUMyNUJGREIxMTg4RDRCMTRBOTQ5RDRENkE8 L3JkZjpsaT4gPHJkZjpsaT51dWlkOjU2NUMzMEQ0M0EwOERGMTFBNjFEQjIyN0VEREY1OUY4PC9y ZGY6bGk+IDxyZGY6bGk+dXVpZDo2OTdFNjcwODdGNjJERTExQTI5OEJEMDA3MjIyMEUwQjwvcmRm OmxpPiA8cmRmOmxpPnV1aWQ6Njk5NTUyRTg4NDYyREUxMUEyOThCRDAwNzIyMjBFMEI8L3JkZjps aT4gPHJkZjpsaT51dWlkOjZBMzdDNkJCRDRGOURFMTFCM0EyOEQ1MTA2RUY0Mjk2PC9yZGY6bGk+ IDxyZGY6bGk+dXVpZDo2QjBDNzQ0Njg2NjJERTExQjkzNEUwQkMzOTgxNTcxRDwvcmRmOmxpPiA8 cmRmOmxpPnV1aWQ6NkMxQ0VFOTlGRjBDREUxMThCNjA4MDg2ODZEMUNEQTY8L3JkZjpsaT4gPHJk ZjpsaT51dWlkOjZDNzA3RUI1NEM0RURGMTE5QkY2OUY1RTdDQzM4NUQ0PC9yZGY6bGk+IDxyZGY6 bGk+dXVpZDo3MUUyMjEyODY3OENERjExODE5NkQxQ0VCQTExQzU2NzwvcmRmOmxpPiA8cmRmOmxp PnV1aWQ6NzQyMDBBODU3RTNEREMxMUI2NjFEMzkwNDEyNTlBODY8L3JkZjpsaT4gPHJkZjpsaT51 dWlkOjc1OTgwMEM0QTVEOUREMTE5QTAwRTFCQzBDNjE5NTFDPC9yZGY6bGk+IDxyZGY6bGk+dXVp ZDo3QUYyNkZBMDc2NUZERjExOUY2MUM1NDNERDE1MjgzODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6 N0Q4MkE0RDlGNTM4REYxMTg5QUZDRDI3Mjk0NjY5ODU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjgz RkExMTM4ODk2MkRFMTFCOTM0RTBCQzM5ODE1NzFEPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo4NEYz QkM5MDkwNkRERjExOEZEM0JFQzc1NzI0RTQzMTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6ODk2QzBG Q0JEQTMyREYxMUE0NzNCMjFDNDlEMTc1N0U8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjhDOEI0RjMx N0UxQURGMTFCQUJDRDc0NDcyQ0VFMEFFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo5MUM2QjlERDdE MUFERjExQkFCQ0Q3NDQ3MkNFRTBBRTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6OUJGQzlCRENBREZD REYxMUEyMzVBMTI3REVGRkRDNTk8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjlEMEMxMTFBNjNDNDEx REQ4NTM2OEIwOEM3MzQ1RjFFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo5REREQzE0QTU4NzJERjEx QUNFNTlGNTgxRTJFRkIzRDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QTA2Mzk3OUE1RjRFREYxMUE4 ODU5RkMwMzRFNUJFQTM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkExRTg3N0Y1OEYzNERFMTFBRDYw QzU5RkEyN0Y4QUM5PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpBMkIzMzhGQzg3NjJERTExQjkzNEUw QkMzOTgxNTcxRDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QTUyQjJCRTJENTA0REUxMTg1MzJBNzUz NjI4RTk1ODc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkE1ODAyRTY0NEQzOERFMTE4N0Q4Q0UwRkUw OEIwMEQ4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpBRkVDOTUzRThCMjlEQTExOURBRUU5OTI3QjNF RDNFNzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QjI4RUE4QzI4NEZGREUxMUI0QTM4QkZDNjk1QzdF RUE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkI1QTE2NTIxREEyQURGMTE5REU1REMwRDc4RTE1ODcw PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpCQzQ2NjEzNUI1MENERTExOTc1NkY4MURDOTk2N0MyRDwv cmRmOmxpPiA8cmRmOmxpPnV1aWQ6QkNDRTYxRUI0NEM0REIxMUI5MjVENTk5NjM0NTgyOUU8L3Jk ZjpsaT4gPHJkZjpsaT51dWlkOkM0QUFERDQxMDlBNkRFMTFBQTU3QzREQjAyRjFGMzdFPC9yZGY6 bGk+IDxyZGY6bGk+dXVpZDpDQTRFMDM0RTdFMUFERjExQkFCQ0Q3NDQ3MkNFRTBBRTwvcmRmOmxp PiA8cmRmOmxpPnV1aWQ6Q0YyNjg3M0U3MjEwREQxMUI5MTBBQTA1MTAyM0Q3NEE8L3JkZjpsaT4g PHJkZjpsaT51dWlkOkQyOTI1NDRBRjQ2N0REMTE4QjAwODk5NzhDNTM1RDI3PC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDpENTc0MjhBRTg3NjJERTExQjkzNEUwQkMzOTgxNTcxRDwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6RDYyM0UyRkNDQjQ0REYxMUE2NTk5OTA0NDY3Nzk2NDI8L3JkZjpsaT4gPHJkZjps aT51dWlkOkQ2NzMzQTU0RkE1MEREMTFCMTkwQUJDNUYxODJGQjM0PC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDpENjdCNzNEMjNFOEYxMURFQjE4MUE4NUU1NTRBQjcyMzwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6REFDQjQyQUMwRDU3REYxMTlFNjE4M0E5MjFCNjBGNkQ8L3JkZjpsaT4gPHJkZjpsaT51dWlk OkRCMjgyNDcyNzY1RkRGMTE5RjYxQzU0M0REMTUyODM4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpE QzBEQzg2QzlGRTVERDExQURCMjlDNUJGQkQ2REZBNDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6REUy ODI0NzI3NjVGREYxMTlGNjFDNTQzREQxNTI4Mzg8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkUxQjBE NDAzOTlFQURFMTE5QzUzQTI0RkY0MDJBOUREPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpFMUNFQzYz QjcxRUZEQzExQUM3MThGMkZCMDRENUIzRjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RTFFRkE4ODlC OUIyREUxMTlBREFGRkJFRDY0MUQwMDc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkU0MjgyNDcyNzY1 RkRGMTE5RjYxQzU0M0REMTUyODM4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpFNkYxMjAzRDJFRTlE RTExQkQ3MkMzN0U5QzVCMEI5MzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RTcyNkFCNjdBMUQ3REUx MUExQUU4QTM4OEJGMTFGREI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkU4REVGRkZDNzU1RkRGMTE5 RjYxQzU0M0REMTUyODM4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpFQjY5QjE4ODg2MDZERTExQjM4 MEM5REZGRjVFREI2QjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Rjg2QUVBMzY3OTM2REUxMTlGQzk4 QzZGNzA2NDYxNzQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkY4REMyNDEwODQ2MkRFMTFBMjk4QkQw MDcyMjIwRTBCPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpGOTVDMUEyRTI1NzhEQzExQUJCN0U3QjBD RjM0RDc4RTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Rjk3NDg2QzFFMjRGREYxMTgzQzc5OTY3MTBE MDk5REM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkY5NzZDNDFDQjE1NkRFMTE4MUQ5ODZFNTQ1NkFB OUNDPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpGQTFFRTY2OTJEM0ZERDExOTZBQzk1NkRBM0RCMTlD MzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RkRENkQwMUNDNzA4REUxMUExNUFCMjgzOEYzQUVCRkU8 L3JkZjpsaT4gPHJkZjpsaT51dWlkOkZGNjIxNjgwRThBNURDMTE4RkZFQzdGMzRGNkJEMTFEPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowMTgwMTE3NDA3MjA2ODExOERCQjlEOEVDQzMxQkNFRDwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDI3QjY5MEVGQzVCRTIxMTlGRDNGRTFGNTIzNUUxMjI8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjAyODAxMTc0MDcyMDY4MTE4OEM2QUI3RkQwRjU2ODRD PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowMjgwMTE3NDA3MjA2ODExOERCQkUyRjM5QzU4RjI0 QjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDM4MDExNzQwNzIwNjgxMThGNjJBRjM1QzREMjQx MUE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjA0RDM0MDEwRkYyRDExREY4MjNEQzFFNzlBRUVF RjE1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowNTQyNjYwRTJGRTAxMUUwQUU1MkFFMjY4RkMw RTJFRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDYwNkRCQzkxMEZGREYxMUE0NTU4NTA5NzJG QzkwQkQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjA2MzVEM0RGMEQ1RjExRTFCMDcwQTI2QTYy RUZEMzYyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowNzBDNkM1NkVCNDcxMURGQjYzRUU2NzQ4 NDAyREMwMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDc4MDExNzQwNzIwNjgxMThEQkI5RDhF Q0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjA4QzYwNzVCMjgyMDY4MTFBMTY5ODcx QkNDQkJGNDg2PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowQTM4OTAxQTRDMThFMDExQjI1Nzk4 RjhEN0ZFMkZEMzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MEE4MDExNzQwNzIwNjgxMTgwODND NjFGNEVCNjA4OTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjBBODAxMTc0MDcyMDY4MTE5MkIw OTRDQUIyRjNEODMwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowQ0U3QzNDMjc1RUVERTExOENE RURGOEE4MTEyRUQzODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MTJFQ0RGQ0M2OTE4RTAxMTgz MTdBNTEyNkIxODRDOUM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjEzQjA4NjUwOEVGQkUxMTE4 NjMyQzM3RUEwOTRFQjk5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoxNTg4QUJBNjRCN0VERjEx OEJCM0ZEM0ZGRkU1MEZCQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MTg0MDdFQTQ5Rjc0REYx MUI5QURGNTAxQjFGRUVDNUI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjE4QTNCMkRGRkUxN0RG MTFBMUEzRjZFMkJFMzg3MkQ1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoxOEE2QTVGQUI5MTNF MDExODBEQUNFQjFFNEIwODBGQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MThCOUJCMEIwM0U3 MTFFMDg0Qzg5MUQ0MjEwREFDODM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjE5NEI1NDM2QTU2 RkUxMTE4NDQ1RERDODM1RkM5MzJGPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoxQjZBODYyRkU3 OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MUQ2RTQzNzNB QzVGREYxMUE2OEVEMjUxRkYyM0VDMzQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjFGNzNFMUJB NTczQ0UwMTFBRDc3QjJDRjVGOTdBQUJEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyMDIyN0Qx QkQ5RUNERTExOEY4NEI4MjhBOEY5NjhGMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjE2QTg2 MkZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjIxQUI0 OTUxMTNGRkRFMTE5N0Q1REI2MDkyNzAxNTUyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyMUND Rjc4MjIyRDJFMjExQjJCM0Q0RTVFMEIxMjcyQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjNC OTgyNUMyRkRFMTFFMDhCODVBQkI0MTg2NUE0RjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjI0 RTEwNTk1NDJGNTExRTE4QkQ0OTUzMjJCOEM2NTQ4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoy NTBGMzdGREJFNjVERjExOTZBMkU1Mzg2RUI3RUZCRjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 MjYyRDVGMUYxNzFFRTIxMUJBQzY4NTlDRTZDQjBFRjI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjI3NDlEQUMxNjlFMERGMTFCQUUyQTlGNEZBMUM3MzBFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDoyN0UwMjkzQTc4RjVERjExOUYxMDgzQjU3QTU5ODQxOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6MjhFRUE5Qjc5QUQ1REYxMTk2NDhGODUxMUI3NDE3RDM8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjJCNDlEQUMxNjlFMERGMTFCQUUyQTlGNEZBMUM3MzBFPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDoyQkJCN0VGMzEyMjA2ODExOERCQkQxRUYyNjc0MkQzQzwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6MkMyN0VBQzdCMjYxREYxMTg3Q0ZFQzg1QTYwNzdBODc8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjJENzYzNTA4MTRGRkRFMTE5N0Q1REI2MDkyNzAxNTUyPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDoyRTRDODA2NkRGMENFMzExQjAyREQxNkVDOTg0OUYwQTwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6MkVBRkEyQkM2OTIyNjgxMTg4QzZGMTZCRUI1MDdGQkM8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjMyQkE2ODE0RDlFQ0UyMTE4QUYzRkU1RkY0NjYzRjBBPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDozMzdBRkZEREU5MDJFMTExOEQ5RUEwNjk5OTc4N0ZCMTwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6MzQxQUIyN0Q0QzEyRTAxMThEMzNBNDM2NDY2RDk1Nzc8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjM4MkJGRjIzRThFRkRGMTE5QzE4OTI5MUQxREJERDc0PC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDozOEU5RDM1RDQ5MTVERjExQjEzMTgyMjNDNkE4RURFOTwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6M0E2Q0FGMjcyQjE5RTAxMTg0REQ4RkJEMTEwMzQwMDg8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjNBNzY3ODNDRDBBOERGMTFCMkExOUQ1MEZGMjFCOEQ5PC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDozQkM2Q0UxMkMzNzBERjExODUwQ0I3MkRCOUQyQ0I5MjwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6M0QwMkU2MkFERjhDREYxMTgxRENDQjhFOEI3N0YzMUY8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjNGMjg0MEJCREFGNERGMTE5QjlGRUQ2NkI2ODc1QTc3PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDo0MTg3QzE0MTc3MzJERjExOUQ3M0JDNjU3RTE5RTMzNjwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6NDI2OTU2QTYzQzdFREYxMUE1QTRFOTA2NUZBQzcwNEM8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjQyRDdBRDE0NDQyMzY4MTE4REJCOUQ4RUNDMzFCQ0VEPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0MzUxNURFM0JCMzdFMTExQjA1QzgzRkU0M0NCRTgyMzwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NDRCQTYxMEZGNzE1RTAxMTg1MEZBOTAxQjRDMUI2NzU8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjQ4MEI3RTQ2QUY3OERGMTFBODI1Q0Y4REU1RDkxREY3 PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0QjRFREFGRjVDRjdFMTExODYzNTk0MjAwQTY5NkQx QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NEQ3QzE2NzdEQUFCRTAxMTg0MzFGNkU1MTFGRjE0 MTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjRFNUQyODcxMTgyMzY4MTFBOTYxQUU1NkQ0OEFD RDUwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1MkQyMkFGRTU2MjA2ODExOTEwOTkxQjlDN0I5 MzlCOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTNBNEJCMEUzNzA3RTMxMTlCMjRFNzE2OTFE RDY4N0U8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU0MDkyRUU3N0QxNEUxMTFBNjkxRjY4QTcz NEQwMDZDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1NDNBNzk4RjEzMDdFMDExODQ2RkU4QzA0 RDNDOERFQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTRDM0Y5RjhCREFFREYxMUE1REM5NTlD ODJBQkM5RTE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU1NERBRTg1RkMwQUUxMTFBN0VERjc0 NENBQzlBMzMwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1NTVBOUVFODExMkI2ODExODcxRkY5 QzMyRjgyMTVBNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTU5RkNEM0I1MjdBREYxMTg5MTRE RUIxMzUxNzYxRjE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU2MTRDMTM0OTYzN0UwMTE4MjU3 RDQ4OTgwNzc3QzE4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1N0FDRjE1MDY5MkE2ODExODcx RkY5QzMyRjgyMTVBNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTk0MDhFNENCRUZGRTAxMTlC NDJGNDgzMTQxNDAzM0I8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjVCNkREMkI3NDU4NERGMTFC NzI0OEI3RERGNzk0QTFBPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1QzVFRDUyMjI4MkVERjEx QTQ2M0JGRTlCMThGQ0FENzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NUM3OUMyRjIzNjBCREYx MThFMkJDNDY1MDZGQTg2OTg8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjVENkNFQTI2RkQ4ODEx REY5RTdEQUFFOUY1RDg4QUIyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2MDY0MEE1QzU4MjZF MDExODJDQUQzOEVDRURDRTI2ODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NjJBNTZFMkVENUU3 REYxMTgxRDdEMUQ3QkM5MjlDMDc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjYyQzIxMDRGRTc5 MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2MzFEMzE2RjBD NDcxMUUwQkMwRUFBMUJBQ0M3NjAzNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NjM5QjFERDI5 N0Q1REYxMTk2NDhGODUxMUI3NDE3RDM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjYzQUVGOTEw NTMwNUUwMTE4NjdGODlCMDIxMUU0RjdBPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2NDc0Qzgz QzY4N0NERjExOEUxRjk5RDY5QjM1MjVDQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NjQ4ODZD QzhCRjNERTAxMTg4QkJDMDU3ODFFQkFFRDY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjY1QzIx MDRGRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2ODlC MUREMjk3RDVERjExOTY0OEY4NTExQjc0MTdEMzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NjhD MjEwNEZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjY4 QzI1QjA2MzJFREUxMTFBNTdCRjAzMzEwNDIyRUU0PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2 OTQwNDMzQ0U3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 NkJDMjEwNEZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjZDNDA0MzNDRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDo2RTI4MkRDQTdGMTdFMDExQjA3Mzk4NjZFOUFEMEM4MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6NkY0MDQzM0NFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjcwMjEyQThDMkZERjExRTA5QUQyODZBQTY1MzM0QTI3PC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDo3MDM5RURBMDUwMzcxMUUwQTJGM0UyM0U3OUI0NkFGNjwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6NzM5RDdFOUZFQkFEREYxMUFBREVBREEzNTYyMjIwODM8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjc1NTE1MzIyQUI1Q0UyMTFBNzgwRUNEQkFENUM1N0RFPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDo3NkJDM0Y3RTUzM0JFMDExODFEQUYzM0EzMDgzODZFRTwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6Nzc1MTVDRTVFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjc3NkNEMjNCMkZERTExRTBCMTMwQkU0ODc4REY0NEQ1PC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDo3NzdDNEFBNDE3MEZFMDExQjQyMjgxNTMwMjVFRjBDRTwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6Nzg4MjAwQjMzMjYxREYxMUIzOEY5OTg4NzVDQzg2NTQ8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjdBQkMzRjdFNTMzQkUwMTE4MURBRjMzQTMwODM4NkVFPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDo3RTBCQkVDMDA5ODVERjExODRCMkVFNTk4RDk5NUExMTwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6ODJDMDFGMzY2RUYzREYxMTlCOEFDRjI2OEEyNzg2QTE8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjgzNDI1NURDNkQzQkUwMTE4MURBRjMzQTMwODM4NkVFPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDo4NEM3NkU1Q0E2MUVFMDExOUI2MkMxQTcyQ0REQkIyRDwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6ODUwRkQzODgzOTBDRTMxMUI1MTg5QzAzRUExMzAyNDc8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjg2MUNCMTI5MTE2Q0RGMTFBMDgxREFDNjU1NDlGRkY4PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDo4OEExMjMxMTY0RDcxMURGQTY5Nzg1MjFENjBERjQ2MDwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6OEFEQkRGRDM3QTZGRTExMTg0NDVEREM4MzVGQzkzMkY8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjhCOTA4NThGQjU3M0RGMTFCRkJCRjAwNzU5QTNENDUyPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4QkNGQTY3QkI5MDZFMzExQTgxQkI5MTQ3QzdFMTYzRDwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTBDNUQ1MjY2NDc5REYxMTg2NUNFRUYwOTg1MUZENzk8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjkxRkYwNTFFMEZEM0RGMTFCMkQxQzUxRjU5QjVGQjI5 PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5NDBEREMzNTAxMjE2ODExODhDNjhBOTQ4MjExMjI1 MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTU5MTZGMzY3MTQ0RTExMUFEODY4QTM4MTdCMzgz MTU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjk2RkFFQ0IwMDE1RURGMTFBODc4QTU0RUI2NjQw RUI4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5Nzg4QURCNzY2M0VERjExODIwMEYwOTc5RDhC OTUyMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTg1REYxOEMxODIwNjgxMTkyQjBENEI2OUZF NUFGOEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjlCMEJDOTBFNzZCNERGMTFBMzY1RUY1MjU3 NzYyMzgxPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5RTY2NDY0QjQyRkRFMjExQUE5RkIwOUQx Njg5NEY3RTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OUU3QzFGNzdGQzIwNjgxMTk5NENCOUZC NUI2MzUzQTQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjlFRjdEOTJGQzM5MkRGMTFBRUQ2QTU5 QjBFRjcxMTQ5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBMUY3Njk3NkU3OTBFNTExOUY4MkMx MDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QTNBNjIyQ0E4NzFGREYxMTg1NDdD NTk3NTM2MTk5OEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkE0NTcxQTk1RTQ1MEUwMTFBRkI5 RTAwQzc1NzJFNjY1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBNkFDMEY5QzczM0NFMDExQjJD RkIyMzNBNDdDRjVCOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QTdCRTEwQTAzNjA4REYxMTky NERCMDM1Nzc5MjEzQkE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkE5NTZGQjA1RTRGQ0RGMTE5 MEE2RDEwMzc3REY1NkJEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBQUU3NjhGRjhENkFERjEx ODI5MENCQjk0QzVDRjRGMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QUJBNjg0REIwMTA3RTAx MUJFMTk4RDc3NTM0NkUzMTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkFCQzNGOEE0MjcxQ0Uw MTE4RkNBQUJEMzA5MjREMjk2PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBQzdDNEY2RTI4MDhF MzExOEZCMURFRDM2NDQ3M0IzQjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QUNFNERFMDMzODhE RTUxMTkyOUM5MURCRkRCODYxOUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkFFMThCN0I4MDZB OTExRTA4NUZERjM1QTMwQkE1NkFEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCMTFEMzYwQzI1 RjFERjExOTQ0NUE1RkQ4OTVENzgxRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjFCNjFCMUNC NjlCREUxMUI2OTVDNkI5NzVENzUxQ0U8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkIxRkJDMkFD MkZERTExRTA5QUU5QzRBNkRGOUE0MUY5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCMkU0QkI2 MzQzRDVERjExOUJCREMxQkIyQjUxMDBBNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjVDMUQ2 QkI3RDlGRTIxMTk1REE4OEIxQzg4RDYzREU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkI1RDVE M0JDQzYwQURGMTE5NzQzQjVGRjk1NjQ0NzlGPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCNkYy NzExQkJFQkJERjExOTZGNUI0NEQzQTlCRDZGNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjlC RjZBMTMzRDlFREUxMTg2NUVCNjBEQjM3RDlDREU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkJD QjcxMTkyN0JDQUUwMTFCNTRFQUM3RDM0NjlFRTQ1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpD MUZENDIyNDAyNEQxMUUwQjlFN0Q5MjNERDc5MTdDRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 QzIzMkI5MzAwRjIwNjgxMThGNjJBNkE2RDQyMjNENTA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OkMyNkMwRDQ5NTI2N0RGMTFCMkU1QzhDQTJBMjBCNTAxPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDpDNDc2MjdCMkE0RjVERjExQUE2QkY2NjFCRjc1MjIxQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6QzU1M0QyREVCNjFCRTIxMTkyRTVDMUIxQjFERTdCMzY8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOkM2NUNBNzUzQTZCNURGMTE5ODY2RDZCMTEwMDVCRTdCPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDpDNjZDMEQ0OTUyNjdERjExQjJFNUM4Q0EyQTIwQjUwMTwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6QzcxMTBFNUY1MDc2REYxMThFNjFBQ0QxNzlEMDYyNDQ8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOkM4QzNBRDBGOTgxMEUwMTE5RTNFRUQ2REE1MkJCMDIwPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDpDQTJEODI5M0UxMURFMDExQjhGRDgxN0NDODk4MUQ0QzwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6Q0M0QUI1OTFBN0RDREYxMUJGNzlGQTYyQjUxREY2Qzc8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOkNERTg4QkNFNEI2RkRGMTFCMjE4QjAwRDg0N0RDMjk3PC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDpDRkJCREI1MjBDNDUxMUUwQTQzQUFEOUM0RTVBODgzNjwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6RDBCRjEyNjUyODA5RTMxMThBMjFEOTVERUExNTkxQjE8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOkQzMzE4NDMxQTg2NEUxMTE5NUY5OTdCQTc0QkE0OUM1PC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDpENDdGQjdENDk2QjBFMDExOTUxRUMzMkMyNkIzNDc2NDwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6RDVFQkY2QUEyQjY3REYxMUIzODg5NDczMzJFNTU4QzQ8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOkQ2NzY2RjYxMTcxMkUwMTE4RDMzQTQzNjQ2NkQ5NTc3PC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDpEOTAyMjIwREU3RURERjExODQ4OEFBQ0E2RTVGMjI1MTwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6RDlFNjgxNzQxREQ5MTFFMDhBMkU5NkQzMjY5NDExNDM8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOkRBQzg1MDc4NTRENURGMTFBMDk0REYwMUU2RURFMzIwPC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDpEQjFFNEMxQ0U4N0FERjExOENCN0ZFQTdDRDc0RDM1QjwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6REMxMDg1MjMyQ0I0RTIxMUI2NDU4NEFDQ0U2QTdFNUY8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOkREMUM2RDJBRkEyMzY4MTFBN0JBODkyMTM1QzEzODcyPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpERTRENkJFMjBDNkJERTExODg2OEQ1RDRGQ0NDRTdFQTwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6REVDOURBOEYxQzIwNjgxMThEQkI5RDhFQ0MzMUJDRUQ8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRFRjYwRkE1MDlCMEUyMTE5M0E3RTI3Njg4MEUxNTUw PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFMDI0MUU0MUI0RkVERjExQTQwQ0QzQzFCMzQzRDU5 MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTAyQzE5MEU0MjZFREYxMUIyNERFOTA4QUNDQUMw OTU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkUwNkY3ODZERkNCMURGMTE5OERGQjIwRjkwRDNB QTZFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFMDk5MEZCREFDM0FFMDExOERDOUJGNTc0NzYx NTMzRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTBCNTA1NzM1MEREREYxMTgyNzFBNjlBRkM2 NTY4OEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkU3NDdDMEY4MEY2NURGMTE5QTk0QzVEOEQx ODg5NTVCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFNzk0MDc4RERFNjRERjExOEE1M0Q0RUZF MjBDMzUxODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTdEMzQ3N0YwQzQ4MTFFMDg4QURENkVE NUEzRDg5REU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkU3REQ1MjY0MUExOUUwMTE5NUYxQkE0 NzRGMkMwQkFFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFODEyQTM3MUZDNENERjExQkU1NTky NjdGNTNBMEJBRjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RThBODJFQTJDQzA4RTMxMTg2MkZC QzJENDU2RjMwMTg8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkU4QzE1NjBFOTIxN0UwMTFBRkZC QTY1NDE5QUYxMENCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFQTEyQTM3MUZDNENERjExQkU1 NTkyNjdGNTNBMEJBRjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RUI4NDY5MjAzQkZBREQxMThC NEE4MjhEOEVGRDUzMEE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkVFQzE1NjBFOTIxN0UwMTFB RkZCQTY1NDE5QUYxMENCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFRjg0NDFDMDY1RTdERjEx QjhBQkJCRjdGRkE2QjBDNDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjFEMjEyQTQ3OTQ1REUx MTk5OEZCRUQyMjkzRDlFMjc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkYyOTg2RjQxNkIxRURG MTE5ODk4QUNEQkRGNUYxMjVFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGNDgwOUVCMkJBMDhF MzExOTAxNjgxRTg0MDRGRkZBRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjVDOTQ5RDRGQjY4 REYxMUJCMjc5Rjk4RjA2NzM2MEE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY2QTNGREI1MDcy MDY4MTE4M0Q0Qzg4M0Q1NEZEMjE3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGNkNFNzI1MTRC MjA2ODExQTEzOEJDRDU3NTRBQ0QyQjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Rjc3RjExNzQw NzIwNjgxMTgwODNFQjgzQzYyQkQ3QzE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY3N0YxMTc0 MDcyMDY4MTE4OTI2QzI3Nzk4Qzk2Q0U1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGN0RFNjcw MTFGRUNFMjExQkM5QTk2RjA2QTk1NkFFNDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjhBM0ZE QjUwNzIwNjgxMTgzRDRDODgzRDU0RkQyMTc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY4RTVC RTQxQzgxOTExRTBCMDMzRUVGQUFGMUUyODczPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGOUQy QkMwQTAzOThERjExOEUwREZCQ0MzOUYxRDcwQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkFD RDVBNzAzMzI1RTIxMTgwNkRCNTA4RkE2NzVEOUU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkZC QkY0OTZDMkZERTExRTA4Mzg3RDMwMTgwNzU3NTg5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpG QkQzRDlCNjA4NTcxMUUwQkE3REU1OEM2MTQ2OUUwNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 RkJGOTlFQjc1NjdEREYxMUE3NEVFNkNFMDM5OTQ0MjI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OkZDMTMzQTgyRDEwRDExRTBBMDhBOTc5NjUxOThFRjdDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDpGQzdGMTE3NDA3MjA2ODExOTQ1N0I5MzM5N0NDRjM2RjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6RkVDNTJEMzk3NjYzREYxMUIyNjE5NEREMTM0MjdGOEI8L3JkZjpsaT4gPC9yZGY6QmFnPiA8 L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJE Rj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5v AhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAA AAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAA FHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALE AAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gA AAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJp Z2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElF QzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAA AAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZ WiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAA AAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVu Y2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNl IFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABX H+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8 AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0B EwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZ AeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC 6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7 BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF 5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfS B+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEK Jwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzA DNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MP zw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW +hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsU GzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qf vx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSr JNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIq NSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+ MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2 cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0i PWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdE ikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwq THJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJU j1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0n XXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1m kmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XAr cIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6 pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VH hauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJ nPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSp N6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYB tnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD 1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+ 0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M 8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23/ ///uAA5BZG9iZQBkQAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQECAgICAgICAgICAgMDAwMDAwMDAwMBAQEBAQEBAQEBAQICAQICAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA//AABEIAyADIAMBEQACEQEDEQH/ 3QAEAGT/xAGiAAAABgIDAQAAAAAAAAAAAAAHCAYFBAkDCgIBAAsBAAAGAwEBAQAAAAAAAAAAAAYF BAMHAggBCQAKCxAAAgEDBAEDAwIDAwMCBgl1AQIDBBEFEgYhBxMiAAgxFEEyIxUJUUIWYSQzF1Jx gRhikSVDobHwJjRyChnB0TUn4VM2gvGSokRUc0VGN0djKFVWVxqywtLi8mSDdJOEZaOzw9PjKThm 83UqOTpISUpYWVpnaGlqdnd4eXqFhoeIiYqUlZaXmJmapKWmp6ipqrS1tre4ubrExcbHyMnK1NXW 19jZ2uTl5ufo6er09fb3+Pn6EQACAQMCBAQDBQQEBAYGBW0BAgMRBCESBTEGACITQVEHMmEUcQhC gSORFVKhYhYzCbEkwdFDcvAX4YI0JZJTGGNE8aKyJjUZVDZFZCcKc4OTRnTC0uLyVWV1VjeEhaOz w9Pj8ykalKS0xNTk9JWltcXV5fUoR1dmOHaGlqa2xtbm9md3h5ent8fX5/dIWGh4iJiouMjY6Pg5 SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/ANAgH/b+6Mv7OlqsKAE565aj /h7pTp7Weuve+myQoqeve/db697917rg319uJw6YcdxPXXu3VeuWn+numsenTpSnwnPXtVuDcf4e 9aPn17Xpw3HrIORwR9b2/wB9/h7b4Hp9aMKgitevP+k/635+v+397X4h16VV8NseXUbWdJX8H/kf t2grXz6QCQhPD8us8dtIt9eb/wC39tvxHSu306B69ZPdOlPXvfuvde9+691w0n+n+9e7VHTBBHHr r3vrXXvfuvde9669w6ye69KOve/de697917r3v3Xuve/de697917r3v3Xuve/de6xj6j/XHux4Hp OMGvXPWP8f8AbD/ivuunq1V/h679+6e69z/T/k4e/fn03qf+Hr3v3TnHrkRb88+9cerEaeBz1zV+ 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 vfuvde9+691737r3Xvfuvdd6j/X/AHr3qg6tqb16ye69Oj5fD1737r1M1669+631737r3XIC5t79 1ZV1GnXMp71np0xjrlp0/T37q+nR8PWN/wBXvw6Zl+Prh73031yVbn3rq6LqI9OnCJABqP4I/wBi 3/GvbLtU9GkSBRqbrMQWX62P9be6YB+fTtGZRnqI97WB/J/2P9D/ALY+3U8+kkgNesYjBtYDi1/p 7vUevTPhLjHXJVsb/X/G1xz9b8/j36opXqwUg9QY4zLVKn+qmA/H01XP+8D28xpGT8uiiGIz36R+ Zk/y56VxYUKxsYTIrEhynGkC1rD/ABHssAMtaNT06HgkXb1iZ7csh4keXX//0dAn3rpf172315VC ig69791vr3v3Xuve/de69791pvhb7Ove/daXh8NOlRtur2/RVcDZvDz5ynqXamraeGdqV6KgmXxS VVBKvH8XjZtcJkBhBUBlbV6bFSfxdF1w8pJ8KQKo4edT6H5etM/s6y7t2q235aatoKkZbbOXE02C zcUaotVFFIFlo6yIF/sMzQ6gtTTsdSEhhqRlY2FaZ49Wt7kXFQV0zL8S+nzHqD5HpFN9f9t7359O PxPXH37qnXvfuvdZYuG54NrC/wDX/Yf63uj8On7cgPniRjqUD7a6Xstft669+6t1737r3Xvfuvde 9+691z966Y64e99P9e9+691z966Y6wr9R/vvx7ueHXgaGvXLWf6f77/be9aet1X+Hrv3rp7r3v3X uve/de697917r3v3Xuve/de67v791XT26euvfurde9+6910Bb34mvVVWn29ZChHvVenjGwA64G49 76bNR5de9+691737r3Xh9B/re/eZ6qpqOvA/ke/dWB4EdZ4JDHKjgA6WDW+vAP091ZdQI6UW0hil R1AqDXoQ6TIGppVfyojlljZWuPSP1Hj029kksIjl+HHHqWNv3d7uyjlacLIWCmvp5npkyUVRkJzI D+2i+OOMEkKFvxz/AKoi/tZbtHAtPM5PQY3eK83a8aRTVEGlQM4H+fJ6TLwss3jb/VFWt/geT/sP a4OCtR0EHgZZtDjzoeniDGxyn9qVDpNvXZSfqLqNXJv7TvOVFWXHR5bbUlwwEEq49SB/h8+stZDM oAFyVOkji1goBbm/JP8AT3SNlNaHHT97BcJpXSSwxjprnV+VkUq34/xB/wBvz7eQioPl0TXKuOyU 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 91+zr3+k66976c697917r3v3Xuve/de697917r3v3XuuGlv6f7yPdqjpP117317r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuuwbf63vRFft62CQajrn7r0/UevXfv3Wq4r11791vrsMRyPfqd bRtOV6liq/bZCBf+yf8AWt/xT234efl0vW9pC0Z4+XXbVbyKNRuVFv8AYfj/AB596EQB689880Y1 tWnUd5Nfu4WnDpLJJqFOsDfj/Y+7jpK54Drgfp7uvEdJpCaju697114UpoV89d+/dO9ZAQfp7pSn Tymozx67/wAffut6qk+vWVQLAkWPvXSmMLpBIoeuLAc+/fLqrKO4+fWP3vpnr3v3XuuZW6ggcfT/ AHx96+3pwpVQVHXMD/D/AIj3rp0Cnl1mXW9hzpH0H1t9L2FuD7qaKK0z08pdzpJ7fLrmY11cCx1W IJub/wC1WH5901t1spHrbBHTggVIwzBT9CCOf+JuQvunRtGkccetippTrA84Ykkf4Amw/wBa/vwW uB0lkuQxLHpvlYuL/j/jftQooAOi2ZiwJ8uo/u3SXr1h/Qf7b37qoUDy69791brkAT71XqyqW65q v5P1964/Z08q+Z49ZBYf8Tb348DTj04pA6z/AEsAPbNSck9PKARWuOschtb6f77/AHgj3dOB+3pt zTrAJbXAv/vv6+3KdJxMBUAdZEl55v8A8b/r7qy1GenUlDGnU+Alr3Nx/X6/UHg+2SKGnRjA2vPE dOES+luPrYcj8H8D/X9ttx6M4o8EngespRipBtaxP+x+v+P591GDXpxkGk9NMwVfpxqN7f7SP+Kf 63t4Zp0UXKotdApXpqc3b6/nj/ez7U9EkrhmIr1jH9r/AH39fe/Tpof6J10v6h/sf9697PDpvrJb 3SvTmv5de+nvfVviXrr37q3Xdz791XSvp14C/vRNOnFXVXPXXvfVeve/de65KbH37qyNpPy6zg3t 710rBrTrr3vqvWNzz/re9DpiUioz1iX6D3Y8emU+Edd+9dW67Aube9dWUajTrOnBH9Bb37pSgpQe XXPm4Fvr7905XIFOpCJf/Af8T/sfbBNTXp+JCx6mKgVrjk3uOLf0/wCJ916XxoVkB056zFvGC3Or QblgDYfU2H9ePdSK0pw6fkbQtT8VOsCOXB408WP5545B928+k0bNKwqeufk8Vje1yBb+v5/4j3og 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 RANKSRwmJiv3JeMvTOHbSVBVyx5uoPtLtNndQXExuUooFAa4OeIH+fh07z/u2w3mzWcezX8czSTh 2AprVdB+MEVRqsBQcSDxAB6CQpqLEE6gymUhCbWvodSpRDILgA3ABP0/JEnUPgUwOpFNS1bxy1KU 1RJBTlQ84QrGjMSoAcrHpIMtyADZWBNiSfbLsilVMgDHh8/8/SyOwvJrea8itna1j+JgDpHDz4Yq K+lRXrmDSJpPk1smksE9Shxf1XbQ6+NiOCCSTwbW96Ck8B0k66FOk3keFoWFyxQMy8G5JWNiBIqg 6bkN/Ti1/euvdYVhd9YicOHGtefUQf1+NSTzrFrX1Hk/Ue/de6iyalPqYIdRVk0+pSDYKVZBa/8A jzcE+/de6xguQDwwP0H9ogMxAuLNcWsT/Qe/de65FtP6VGkDSCCjer83s1wov9f+J9+oONc9e66v FcMWUH0koVdfp9fUpBF/p73RuAGevdPlI8SoreGkaYAaGLxRylI+Q3lEsb62A54BPH+J90NaHVTR 17rNBXmQuaeFwJD+mJZQqKUsya1ZxYavVqvck397C6RTr3ThHK0kKQpFlFMbxtGIBUFxGAzNJARE Ejjspux4HFvdG4n4fz691Hrpalgv20ORIbSRHWyxtrJK3YNNI0gBTgEWH596jAXiw610jZ3ieV5I Y2jRzfRLIGdTb1XZfGv6vpwPasA0oT17qVSpTNGXlp/NJdiAryA6fTZPGnPIvZr8fm/F6sSDQHrf WWStWJWjo1McDsZPGyMAHYAMAzEnSALfi9vpf3Za0zx6102u8kh1MBbm39fx9Tz78NINBx691x92 691hLE/4D+nv3XuuPv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/d e697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917ru/Fvfut1NKeXXK/8A tX+8e9/n1ev9P+XXtXH15/43/tvp711rVjjnrkHJ/JH+x97r1ZWrg8euXlH9T/vH/Rvv3W9S+vXv KP6n/eP+jffuval9eveUf1P+8f8ARvv3XtS+vXetv6/7wP8Ainv3W+va2/r/ALwP+Ke/de668o/q f94/6N9+61qX165XT+h/33+x9+631w1r/Vv+Sj/xT37qupfXrq4/qP8Ab+/dbqPXr1x/Uf7f37r1 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 aCjMz3YlgF9JOn6aAWAQEhvRqHIOkEG1xbkOUHp0W9cg7xPG6yWZU18SKFVXBQrGDqUs0ZPB5N+Q DY+60BU0XrfTuZhUUspjKiUtqmRSoCFtIEqsA3iMrcMBwS3P59tde6a2pi2qQyBV+vqv5ADqB8gV GZWN73tYD/Y+7K1Ps691iana5OgH9TkxTxygR2BLWDEhQGP5Gn8396r17rEIyx9P9ory3p/U1wx+ thYHmxt/T3cP6jr1OplNTyI0VT4aaaIO0RSapVVZxcBpV8ivHyw0kcH/AGPvRIIIqevdLGHPxBUF aTD4/wBNMaNaulkMdxqhqVLS6DpsAeBbkH2wYq/B1qnXcmdpZG9GLleMoojkgp0gV5GFlTRo12H+ q+vPu4UrgtU9b6a6qryKxfcOCsLB4vFG0CyAR6fU7NB64wSQeL2/1/e+vdNyBxHJqgkj8g0xx+UA xqGu5VGQNFAxFvxz9OPetIrWmevdRBTQWu0TqxYlZTZwAHB0gWCO7Brcm3+9e7VPr17rsssN40KG EFUjmIYaH9R8kgjVXLG/Gr6D6e99/wA+vdRKhIFkVvOralEhCKNK3+mlLEAgH6fW/t0cB1rqNcEX BJt/QD6/Tj63HvfXusLEEm1+f8P9v/Ue/de6xG55HPIF7Ac/j/H37r3XD37r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+6913qP9f969+6tqb169qP8AX/evfuvam9evaj/X /evfuvam9evaj/X/AHr37r2pvXr2o/1/3r37r2pvXr2o/wBf969+69qb169qP9f969+69qb169qP 9f8Aevfuvam9evaj/X/evfuvam9evaj/AF/3r37r2pvXr2o/1/3r37r2pvXr2o/1/wB69+69qb16 9qP9f969+69qb169qP8AX/evfuvam9evaj/X/evfuvam9euvfuq9e9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfu vde9+691lW9v+RAH/bC/v3XusihfoRbgj+t7n+nPv3Vvw/n06U7RkMrRK5IXSGW4B/BBOrm/+w/r 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 aSP6f4nnWkfxde6xgkMPxe1tJW4Nr2/QL+q3+PH+HvZX4j17rKssqtw0uo88S88A/WyFWBseDa9/ ftKevXupkNTLUExTzyqCAFWGnjdrAXYBVRHiRAL3F7e6lFFOwde6lGinSPTTyGpikVTHI1Upjje9 5bx6FU3UC44NwCf6e9YPEY691jDzrqRquEOqrF5dIZyAbLrLH91AGtyOR/re/Yrwx17rC6NGAizS vb+hSOwJJU3UO1zf6kgfgce9qKnhjr3UZ2qfUrSSSAEEkzSFdNgRf6KVQm1+QD+PdtHzz17qLIpU 2vq4DXjYHTcX0+oWHP492X4R1rrAVI+t/T/h/r/0H+Pu3Xusbf0uAOPre/8AsP6+/de6xfT/AIkf 8Qffuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+6912Bc29+691nVfoo/3n/b+/de6kIht+Of9h/vX9D7917p+ xn2yGRpwpYBAjSgCLT6w/rJWzOCLci/PtLceKADGPLPRrta2TTSJeAVI7amgr51NRn0qafnTp2me noqm02g08kUUq6pmQqrqFVo5EILqs1wLX4HJJv7qjM8YC4b5j/Uen7mG027ctM9v4tmVDAaiMMPJ lOdJqOOaZ6zTVNJH9vVJJFKJakyU7SNLLWxrRGJlE/7KWtqtGDYHT9be/Hu1LpxTPoajyPSa4LRP HuENxUPISgZg8q6CNJfGOIoTQNpJAoOm2WohrZlkFJUVVW8zyM6xtHLMR5JXkIF9T2a5srFAL8fT 25ShArjpqWS63O41eG0l45YkgVZ2JLMSAPn+QHWAytFrBxrK+kS3cvHK0d1uZSkYJX06ueR/sQPf ukrxyRnTLGVanmKHrEZauSRAVSO2kAOqn0A6oxqkeX0qF4tYaR9T791Wp9es7QMhCvMXUEsgilWH S+tg0umOylg45Labgce/da6yC0ZVmjWoABDRVOuVGaRVUs2kxR3RZQym6kAAG44966eglEEqymFJ AK9rVKmoIzQg4rUZ4gddColp0eCnmeMSRhJxFIR545WuIpAoOtn4t6vpawAHv3Vobq4t1lWCZkWR SrUJGpTxU04g+Y4dPGGiQ1tDUu8lQRI1YaajLtXePHyiaSWQ/ttTqsQJ1qedJIP9GZiRHKlQpIoC 3w1OAPnny+fRxsNoTf7ZdlGmjWRnaOFqTBYQHZuI0CmVbUDg0oQOhHx2CgwsW2cu8+ajzWWrjLHj 5UAipaWedY8hXTx2M7R1NBUIitIRrE7MQNJAIZ75r07rbKsX0USU1Vyz0qFHl2sDWlaUA88SNtWx w7R/VPdpBffvu9utYiPwxRGQCSVsFiGiZVDMRqDsxppFXx6aXJ5bFR5IefbtE0uSrKZiojnyUf3M NEnkVllkkj1giMejSzM34BLw4t7Sd7Zqbk9EU8aLgsacAOOeNaU6Gt1Z3O573sUd7EH5bh1TSAkA NOpdYhg6mK4On4QCxatQOu9vYLB4uqqsjjsvU1ctYFpRTxQ0UFEtMJBKonkged6qoU869SE/kHn3 S/vb67WOGe0VEU14sW1UIwCBQfKh63y/y5su1Xl1uW27q8xlUIFCxhAlQ3cU1eI/DvqpPmDXpD1m 0MzLuhpcnSS12GfIk1VVRSDL1lLj7holqNDTVMEv2i6bunC8gNb2dRbtaDbglvIiXQTtVxoBb5Vo DnODn16jneOTN4n5pkuNxt55tnkuqs8T+PIkBbtDDukWiUALLw+HVToUhvvD4zJ0myqqmX+FzY9M VOVabRjBPro4aWWR2JnpmpZV8puHj1AhiQy+w02xXdxBNvUMx+vD+IuB3aaHhTBqDp4g0oRmvUjT 867Ps+7WPJNxaJ/V97dYHNW/SMlQAWJqyaGXxDUMpJIaoK9MuT21ittY+upsYHK1lWJ5ZZ5IpaxC nkRaEFaaJ1paUKCupmLs5JtblTFuN1uMsctyACq0AAIXNO7JOT9goAPXpq45W2vlbb9wg24MVmlB JcguKah4eFWipxBJJYsa0plOUFNjayjr6TLrMaFoTJNJEJnkp/F6knijhu0rRNzpIKn8/wBQr8S4 jkhktaeNqAANADXyJPCvrx6JY7fbLrbtxt93R/3f4ZZioYsmkVDqF4leIB7TTuxXr//S0QMvl6jK PCtUkVJRQGSOlx8EUtNRwLqZZEURpIXqGUNqY+rUdTXFlDEUSwhiCS7ZJOSfz/wDgOj/AHrmG93t 4vHCRWEX9nBGNMUYPHSuasfxOxZ2OWY9cMVga7LU9ZJQRhhTSQtoT9yovJ5BLFGixl5mjjVrICup jYKwI97luIIGiWU0Lmg8/wBv+c9e2vl/c97hvrnboQ/gAErnUdVTRBTuICmoqCcAVJA6beEuhQxu X0zIrEXiuUeKSMD91tbep3Kk+ofpsfbwzw6I6fg0UcE1/wBXyz16JYmZRMZtAeLVpSPVCHJcgXcK pkla7Mb6QDquGHvdD6dXiEfiJ4ofwq500rT5VxX0r1yq6ioqn8lRJK7+OnUCSNj44lg1UyQeRA3g jhkso0eNQNS2uCGwFQVpTr1xcz3Lh7iVncKqiprRVFFUegUAADgBw6iMAsbpZRpZfTINLKyg31pI GspQ/VmBNhxcge9t8J6Z66ZQxdlsF1E2CBNRIckixjjITyAXIGpjwLKR78MUXz691kjhQm0iME9G nlomYEHh2e4RBrW+kX0x2H+NuvddGnDuyhyqKSURFsb3Xyso8bMg0j8heAD+ea4Ude6jSqb6r3X6 qSBZuGIMl7ktpIXUAF0sDxfn3a3Xuuki8hKlkbhmdmMmoquonVHpJLyix1EHSLcC3vxYDj17rp4N H1mQXJb0hyfCGJ1hnRPIjW4t/r/njytq8uvdZDFCketKqWWb6aYI5FZSwIYM/pIJtaxBOn3XNaUX rfXoIpRJ5mlkhZPIFZdRkDIAzEk6bIA3J+p/HurYqvl17pxA1AFqqVyLgm7uvN7B/qoJJ/HH0916 91xijZWukrahySiJqbgemxTUSf8AaiBf/X53Q0r5de68wZWDF9bIoVVHC8D6WvdgNdwAB9AP6+/D 5/D17rprOulioWwsqKASLA6WIAJ/3k/j2/1rqBKgUHSulR/ZHAJPHJa1z/vPv3XuoLgW41f1ueSP ze9/fuvdR2F/re/9fyPx7917rCbf776f7Dk39+69117917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rsfX/ff8UPv 3Xuso+g5P+3+oPIv9Cfp7917rMkmnjm1v9Vxf8cXH/IvfuvdSo5LkcRWB+shFhc/hbf7b3XQvp17 pQ0lZE8C0BSISeRRTSsYz43laJSZjYhE8o5I0+liD+T7TMjiTxAx0UyP8BHz6O4ryCWyO2PAS2r9 NqioZqVqfSo8vI0Pr1wqHWkMlPVxFJhIGlQxhfGyBUJS5MTiTUPoWDKw5593XvAZfhPRZdW89ncS 21zGUnQ0I/1YIPEEYIyOs+NytDSzXnpvLFK8Ol43kSrpwhv5KXUjweR9YuJEZGXT+n6+/TRM3wPR v5H7f9ih6XbVe21jdLNdWpkiqDVW0yIQQdSHK18irqyMDQgYIVGchfcDJksTkKfKReFRPQU0KUuU giDnySvQh/IyGXh7C35UFDqBfaOtqngTxtHQmhYkqa+Qf/Ic9DLmLbX5gKbrsV9FdxIgBiVVjnUV J1NFqLMNRNSooCaKNPd0lPsslF4qGXD1Uc9aqJRvPTTwz/rXyGJFKQPpRvUHNkU/X2vWWFlZ1mQo vE1FB9vp0E/3RukDLaT7LL9TcUEWpXDVBBOgYViRg1BoDXBz02VM86SSxTwNHJFKweNowvjkFg0c iSBm0+RbOB6bf6/t0IpyDjooljkglkgmQrKhIIIoQRxB+zr339W+lE0kanZI4YhdVN3JRFAj0ur3 NuQthwOPewgzXJ6qNb0VQSRXh+0/5+o3mqGbQGEdyP1MAouxY3tpPLfQgaubf0970L6dVGTSvSrG Pq8ZTRzZSfI0P8Uxcs+AFJLEYpHqgiMK8K8rwUzxyAOCAWjNiSQR7Q+OkzulvpYRyUkrXFM4xkg0 +zoYQ7XJtMEcm7zzwtd2bPa+E60YygKRLmqxupGsfiWoyQR0vpc5kmlx9BXvXYeb+CEyzZ2enpoJ qjHUQ1U8dXCXaYVc0BC3RHVmClS3PshFhCRLNBokiM3CMVIDtxoeGkGpoTUVp6dSBLv25W/7t27c 2ms5voiS1wyqrtFH8AdNRJkZdNCFZGIUqTnpKZqtzuPiggqBUUdZkcdHXTU6Rzq9NRTCUhVVyZIp pliJbm6pe9ibAxsobOWR5Y2DxxuVBqDVhT/Acfb+XQV3rdN+sba3gkSWG+urfxGUKylIySKitSNQ U1Ne1eNCSFU2xKijjw8ix0phq/4pEtXUGZmFTHpfwgQMqJTtANYYDVq1A6uSAi3mKRruMtJWEp2i nA1ya+dcU+w/b0Ifbm4tY9ouVSArdfVIHcsSHWjFQF4Lo7g3rqGfIMGFweYzNbnc7HWy0MdDHkKo 1/lKVEtUsctXDTpJGYn0iMr5GZtCJfg3HswvLi1t1tLN4lfxGVQtAQBUAnzwPLzJ/PoM7PtO8bzu HMG+wXs1ukAmlMoJDlwrSIgNRxABY1oq581B5Y/c2RyU9NjczPha2Cdo4BLnKNRRQoJCJKieuptN esnj5vHIjKx+n091uNut7eJ7i1WZHUE0jbuPyAaqZ+Yp1rbub903OaDbd4ms57aRguq6jXw0BOXd 0CyCg4MrAg/Ppa5vNUepqOlkaeCCGBImRpZh4lhjEbeSZpZX1KRYuxY/kk+yC3tpQNTrSQk14DNT XgAP2AD8upI3XebPQlrasXgSNKZZsaRTLFmOKULEsfMk16asFuWgoshAxlQEOpKOpsw5DIwIKWYX BB9qbnbriS3fs7KcQRUflx6LNk5jsbO/hDSESVrkGn7aU/Inr//Z --QqnZc1pCYELM54DpCuHVWrV3W=_ZEP1Yr4 Content-Type: image/jpeg; name="39.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="39.jpg" Content-ID: Content-Description: Photo /9j/4SHfRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAA agEoAAMAAAABAAIAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAACvyA AAAnEAAK/IAAACcQQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykAMjAxNToxMTozMCAwMDox NToxMgAAA6ABAAMAAAABAAEAAKACAAQAAAABAAADIKADAAQAAAABAAADIAAAAAAAAAAGAQMAAwAA AAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIA BAAAAAEAACCpAAAAAAAAAEgAAAABAAAASAAAAAH/2P/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5v AhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAA AAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAA FHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALE AAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gA AAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJp Z2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElF QzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAA AAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZ WiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAA AAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29s b3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVu Y2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNl IFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABX H+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAA AAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8 AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0B EwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZ AeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC 6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7 BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF 5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfS B+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEK Jwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzA DNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MP zw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMj E0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW +hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsU GzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qf vx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSr JNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIq NSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+ MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2 cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0i PWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdE ikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwq THJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJU j1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0n XXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1m kmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XAr cIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6 pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VH hauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q 1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJ nPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSp N6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYB tnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD 1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+ 0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4Dbg veFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M 8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23/ ///tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8V GBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4O DhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgA 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 Vr/84rR0N3SYIBZ6YfPP6Rro/wC2vpo6Kctx3TA2y/c1s/RH7u4/uqMAuB5jXwTB2vw0CW6SglVg IYT3PKAOVYJBEFDLWgnwSKmYa187R9EAk99E+6SQ7kcHtHdR2vqcWuBbYPzSPFQE8+GiSkorIc3S fdtLR4/m/lUr2s3SydpAg/AQmqskieJBI+E/3qVpLWS8T7vcB2JEpHZTXOmvJTyWuB8PyogOM4aB 33cf9JTcymJAPG4djH3ptpAJvwf/0PLwW7YiTyewUnANaIbtI0PBSdBaBInk/EIZ155QXFu9Ppba XWOeWOqLfTMA+4/R9v53uUMp36axjyCWvLCG943Gf85Pg2muq1zY9QFpYT4+5vCFsOm72h8D1XcC T+cfkndFrXlE2tbWXH6ZIgeAUbGem4iZjuokkoKXDtZS3KKSSmW5LcopJKZByW5RSSUy3J2EGxs8 Tr8FBIGElN3Jtbke46WDh3/fSqhJnz7ptxTTKSmbHQ7T4hXrai6g6y4zuBPGvqD+sqDWzxytRri/ FY4gtLGg68mDtd9JEILTpxydT7Wcz3PwUy8CXAABsAD4zwh1mCQTG0666aIgcNTI3d/gfP8ArOUZ u2zj4eEVp3t//9n/7StKUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAACccAVoAAxslRxwBWgADGyVH HAFaAAMbJUccAVoAAxslRxwCAAACAAAAOEJJTQQlAAAAAAAQmomtXShtuiECyMupZwU/2zhCSU0E OgAAAAAA1wAAABAAAAABAAAAAAALcHJpbnRPdXRwdXQAAAAFAAAAAFBzdFNib29sAQAAAABJbnRl ZW51bQAAAABJbnRlAAAAAEltZyAAAAAPcHJpbnRTaXh0ZWVuQml0Ym9vbAAAAAALcHJpbnRlck5h bWVURVhUAAAAAQAAAAAAD3ByaW50UHJvb2ZTZXR1cE9iamMAAAAFaCFoN4u+f24AAAAAAApwcm9v ZlNldHVwAAAAAQAAAABCbHRuZW51bQAAAAxidWlsdGluUHJvb2YAAAAJcHJvb2ZDTVlLADhCSU0E OwAAAAACLQAAABAAAAABAAAAAAAScHJpbnRPdXRwdXRPcHRpb25zAAAAFwAAAABDcHRuYm9vbAAA AAAAQ2xicmJvb2wAAAAAAFJnc01ib29sAAAAAABDcm5DYm9vbAAAAAAAQ250Q2Jvb2wAAAAAAExi bHNib29sAAAAAABOZ3R2Ym9vbAAAAAAARW1sRGJvb2wAAAAAAEludHJib29sAAAAAABCY2tnT2Jq YwAAAAEAAAAAAABSR0JDAAAAAwAAAABSZCAgZG91YkBv4AAAAAAAAAAAAEdybiBkb3ViQG/gAAAA AAAAAAAAQmwgIGRvdWJAb+AAAAAAAAAAAABCcmRUVW50RiNSbHQAAAAAAAAAAAAAAABCbGQgVW50 RiNSbHQAAAAAAAAAAAAAAABSc2x0VW50RiNQeGxAUgAAAAAAAAAAAAp2ZWN0b3JEYXRhYm9vbAEA AAAAUGdQc2VudW0AAAAAUGdQcwAAAABQZ1BDAAAAAExlZnRVbnRGI1JsdAAAAAAAAAAAAAAAAFRv cCBVbnRGI1JsdAAAAAAAAAAAAAAAAFNjbCBVbnRGI1ByY0BZAAAAAAAAAAAAEGNyb3BXaGVuUHJp bnRpbmdib29sAAAAAA5jcm9wUmVjdEJvdHRvbWxvbmcAAAAAAAAADGNyb3BSZWN0TGVmdGxvbmcA AAAAAAAADWNyb3BSZWN0UmlnaHRsb25nAAAAAAAAAAtjcm9wUmVjdFRvcGxvbmcAAAAAADhCSU0D 7QAAAAAAEABIAAAAAQACAEgAAAABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAA AAAABAAAAHg4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAAAAAA CgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAA AAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////// //////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAA AAACAAA4QklNBAIAAAAAAAIAADhCSU0EMAAAAAAAAQEAOEJJTQQtAAAAAAAGAAEAAACNOEJJTQQI AAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAAzcAAAAGAAAA AAAAAAAAAAMgAAADIAAAAAEAMwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAADIAAA AyAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAAC AAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRs b25nAAAAAAAAAABCdG9tbG9uZwAAAyAAAAAAUmdodGxvbmcAAAMgAAAABnNsaWNlc1ZsTHMAAAAB T2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25n AAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5 cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEA AAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAMgAAAAAFJn aHRsb25nAAADIAAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhU AAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxs VGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVm YXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2Jn Q29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxv bmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAty aWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhCSU0EFAAAAAAABAAA AI04QklNBAwAAAAAIMUAAAABAAAAoAAAAKAAAAHgAAEsAAAAIKkAGAAB/9j/4gxYSUNDX1BST0ZJ TEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMg c1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAA ABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAAC VAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFz AAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0 ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNR AAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAA AGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3 LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAA AAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAA AAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAA AABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkA XgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDr APAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEB qQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKi AqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD 7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08H YQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmP CaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIM KgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8J DyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUS ZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYD FiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6U Hr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2Yj lCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijU KQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIu ty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTY NRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7 qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1 QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdK fUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8 UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVb RVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RA ZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbblu Em5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gR eG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC 9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/ jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ /JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKz OLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBw wOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbO ts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q 3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vs hu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH /Jj9Kf26/kv+3P9t////7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJ CQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwB DQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDP/AABEIAKAAoAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEBAQAAAAAAAAADAAEC BAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQAC EQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2 F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQAC AgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPEl BhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2 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 QcluUUklMtydhBsbPE6/BQSBhJTdybW5HuOlg4d/30qoSZ8+6bcU0ykpmx0O0+IV62ouoOsuM7gT xr6g/rKg1s8crUa4vxWOILSxoOvJg7XfSRCC06ccnU+1nM9z8FMvAlwAAbAA+M8IdZgkExtOuumi IHDUyN3f4Hz/AKzlGbts4+HhFad7f//ZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUA IABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABD AFMANgAAAAEAOEJJTQQBAAAAAAFSAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAoAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAjMzMAFx64QCMzMwA XHrhAIzMzABceuEAAQCOuFEAXMzMAI64UQBczMwAjrhRAFzMzAABAJCj1wBczMwAkKPXAFzMzACQ o9cAXMzMAAEAkZmZAFszMwCRmZkAWzMzAJGZmQBbMzMAAQCR64UAWFHrAJHrhQBYUesAkeuFAFhR 6wABAI+uFABYAAAAj64UAFgAAACPrhQAWAAAAAEAjcKPAFhR6wCNwo8AWFHrAI3CjwBYUesAAQCM euEAWPXCAIx64QBY9cIAjHrhAFj1wgABAIvXCgBZmZkAi9cKAFmZmQCL1woAWZmZAAEAi4UeAFrh RwCLhR4AWuFHAIuFHgBa4Uc4QklNBAYAAAAAAAcACAAAAAEBAP/hWJtodHRwOi8vbnMuYWRvYmUu Y29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5U Y3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFk b2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAg ICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJk Zi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJo dHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2Rj L2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv bW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291 cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBl L1Jlc291cmNlUmVmIyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rv c2hvcC8xLjAvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3Mp IiB4bXA6Q3JlYXRlRGF0ZT0iMjAxNS0xMS0xN1QyMjozMjoyMiswODowMCIgeG1wOk1ldGFkYXRh RGF0ZT0iMjAxNS0xMS0zMFQwMDoxNToxMiswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTUtMTEt MzBUMDA6MTU6MTIrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgeG1wTU06SW5zdGFuY2VJ RD0ieG1wLmlpZDo3NjA0MTE5OEIzOTZFNTExQUU1RThCNkMzREIzRDI0RiIgeG1wTU06RG9jdW1l bnRJRD0ieG1wLmRpZDpBQ0U0REUwMzM4OERFNTExOTI5QzkxREJGREI4NjE5RCIgeG1wTU06T3Jp Z2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOkFDRTRERTAzMzg4REU1MTE5MjlDOTFEQkZEQjg2MTlE IiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2 MTk2Ni0yLjEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9u PSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkFDRTRERTAzMzg4REU1MTE5MjlD OTFEQkZEQjg2MTlEIiBzdEV2dDp3aGVuPSIyMDE1LTExLTE3VDIyOjMyOjIyKzA4OjAwIiBzdEV2 dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPiA8cmRmOmxp IHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QURFNERFMDMz ODhERTUxMTkyOUM5MURCRkRCODYxOUQiIHN0RXZ0OndoZW49IjIwMTUtMTEtMTdUMjI6NDI6MzEr MDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3Mp IiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6 aW5zdGFuY2VJRD0ieG1wLmlpZDo3NTA0MTE5OEIzOTZFNTExQUU1RThCNkMzREIzRDI0RiIgc3RF dnQ6d2hlbj0iMjAxNS0xMS0zMFQwMDoxNToxMiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0i QWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjps aSBzdEV2dDphY3Rpb249ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBhcHBsaWNh dGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDph Y3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGFwcGxpY2F0 aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFj dGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NzYwNDExOThCMzk2RTUxMUFF NUU4QjZDM0RCM0QyNEYiIHN0RXZ0OndoZW49IjIwMTUtMTEtMzBUMDA6MTU6MTIrMDg6MDAiIHN0 RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpj aGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZy b20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NTA0MTE5OEIzOTZFNTExQUU1RThCNkMzREIz RDI0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQ0U0REUwMzM4OERFNTExOTI5QzkxREJG REI4NjE5RCIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOkFDRTRERTAzMzg4REU1 MTE5MjlDOTFEQkZEQjg2MTlEIi8+IDxwaG90b3Nob3A6RG9jdW1lbnRBbmNlc3RvcnM+IDxyZGY6 QmFnPiA8cmRmOmxpPjExMDM1RkQzNDMxNDY3QkI4REJFQ0MzQjkyQTIwMTQwPC9yZGY6bGk+IDxy ZGY6bGk+NTgyN0RGMTY4QTVGRTcyMzBDOEFFQzdCOEFEMkJBQTI8L3JkZjpsaT4gPHJkZjpsaT43 RkIyNzA2RDVEMjMxOEQ2NEM1ODFDRjdENkQxN0Y5ODwvcmRmOmxpPiA8cmRmOmxpPjkxMUJFNzQy MjcwMDkxRjFFMjZDRjI2N0YwMDVEOTBGPC9yZGY6bGk+IDxyZGY6bGk+OTVDQjJCNjY0OTNDQzMy ODk3Q0Y0NDREMUM0QkM4MEU8L3JkZjpsaT4gPHJkZjpsaT5BRTA5QjZBRkQzMDYzMEIwMDk2ODhD MUVDRUI0NzgzRjwvcmRmOmxpPiA8cmRmOmxpPkFFQUQ4Nzg1MTk2MDgxRkMyRkYzMEE3QUZFMUVE MzkzPC9yZGY6bGk+IDxyZGY6bGk+QjU5QTk3RDA2MThCMjJGNjJDOEU1RUFEMEUyMUI4Rjc8L3Jk ZjpsaT4gPHJkZjpsaT5CQ0FFNEZCMkU5NUJFMzUzNzZGQjhCRTlCMDlFRTQwMzwvcmRmOmxpPiA8 cmRmOmxpPkRDNzA3NDVGNzRCOEU2MTAyOTI0QkE1Mzc1MDAzNjgxPC9yZGY6bGk+IDxyZGY6bGk+ YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjA1N2JlM2I5LWFhMGEtMTFkZS05MTkwLWNlZDQ5MzdkYzNi OTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDowZjQ4MGE5My04YTkyLTEx ZDktYmU4OC1hZGY1NTBlY2NmNDg8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3No b3A6MGY1NTM2YWUtMjkzOC0xMWRlLWE1OTktYWI5YWIzM2E5ZGQ0PC9yZGY6bGk+IDxyZGY6bGk+ YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjE1OTI5MWFmLWUyODYtMTFkOC05ZGVmLWM5ZGFjZjE1YjQ3 ZjwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDoyOTY3YmQ3NC02OTM0LTEx ZGYtODE0ZC04ZWM3M2M4OTA4Y2Q8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3No b3A6NTBlNjQzODgtZjJhOC0xMWQ4LWJhMzctYjUwNTcyM2IyN2E1PC9yZGY6bGk+IDxyZGY6bGk+ YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjYxMmFhMDAyLTE0MjEtMTFkOS04MDcwLWNjZmE3MWIzZDI3 NTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2ZDZmY2FjZC04OTFlLTEx ZGEtYjUxNi04NTY2MGFjMTFmMjk8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3No b3A6ODdiYjQ5NmItN2Q4ZS0xMWRjLWJmZTktYjA1N2I3MjE3YjI5PC9yZGY6bGk+IDxyZGY6bGk+ YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjhkZjI0MWQxLTUyMTAtMTFkZC05NGRkLWZhMTNhMzQ2ZDQ2 YjwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpiMTczMWQyNS0xMmFhLTEx ZDgtOTBlNC1iN2MxZjI3ZDkxZDY8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3No b3A6YmEyNjBkNmMtYWI5Yi0xMWRhLWJkNTMtYmQzZWIwNGEyYzRkPC9yZGY6bGk+IDxyZGY6bGk+ YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmM0ZjliNzFhLThjNjEtMTFkYS04YTc0LWVlYTlkYTlkYzlh MDwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjNjVkZTQwZS1iZWViLTEx ZGMtOTVkMi04MTU2M2QwNTkzZTM8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpwaG90b3No b3A6Y2U2ZGMwM2ItZTk3Yi0xMWRkLTg0MmUtZjk5NWVhNTJkNjVlPC9yZGY6bGk+IDxyZGY6bGk+ YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmY1MzYxY2Y3LWQ1MTctMTFlMS04YThkLWU1NDFlNGIxYTY3 NTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpmYzY3NmY2Yy1iYjliLTEx ZGItODQxYy05ZWZlNDk4YTNlNzQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjAyQkVDOEI1MUQ3Q0RD MTE5NzU2OTEzQURGMzcxNzFDPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxMjVFQUM0ODlGRjRERTEx OEQ3OEEyM0Y5ODZFNzQ5RjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MTJDNDg4Q0IxM0UyREUxMThC MTVDMTkwOTMwQUQ2Qjc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjE4OTE0NzlFMjNCRkRCMTE4OEQ0 QjE0QTk0OUQ0RDZBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxQzY4MTgyQTQ4NzVERTExQTk5MkZE MkRDNkU5ODMwRDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MUNFODhDMUJEMTlERTExMUEyMTBERUVG QjgyRDc2OTY8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjFENkJBMTc3Q0M3RURFMTFCQjdCQzk1QkQ3 ODVGNEM5PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxRTM2QUIwNEE2NjNFMDExOTVEQzhERjlFNEVG RkY5NTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MUY1QUYzQjY3MjI5REYxMTlGRkFCMjZFMjQwQzcx QkI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjFGODYzNTVDNzVCRURFMTFBODE0QjRGRDFENTc5NUIx PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoyMDhDNDQ1MDdFMTNERjExODgyRkQzNTUwNDA4NTM4Mzwv cmRmOmxpPiA8cmRmOmxpPnV1aWQ6MkMyN0ZEQTZGQ0VEREUxMTkyMTU5NTk0NEJGMEE5ODU8L3Jk ZjpsaT4gPHJkZjpsaT51dWlkOjJEQkREMUJGQ0UxRERGMTE5QUJFQzE0OTMzMUQzMTREPC9yZGY6 bGk+IDxyZGY6bGk+dXVpZDoyREJGNzQ1MDNDMDFERTExOUVEQkExNDc3OTA0MEUxQTwvcmRmOmxp PiA8cmRmOmxpPnV1aWQ6MkU3M0Q4RkExQUQ5REYxMTlBM0ZDRTcwQkJBNzI2OUY8L3JkZjpsaT4g PHJkZjpsaT51dWlkOjMyQUQ5MDFDMTU0MERGMTFCQTIyRUI4MzkwRTQyN0ZBPC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDozMzEzNzgxNUZEOEZERTExQkYxQTlGODlGQzc4MERFODwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6MzgyMjI3NDE5NjUwREUxMTgyOEVCNzlCN0ZGODdCNDY8L3JkZjpsaT4gPHJkZjps aT51dWlkOjNBNDY3NzgxNUUyOURGMTFBMEIwODdERjg5N0Y1QzU2PC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDozQjdGNThGMTlENkNFMTExQTM1QkNEOERFRDE5OTI4NjwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6M0UwOUE4NjJGMzUwREQxMTk3NjBBQzY3MkEwNjVDOEE8L3JkZjpsaT4gPHJkZjpsaT51dWlk OjNFNDAzNzdGRDM3RERFMTFCRDMyRUZDODg0MjRGQkI1PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoz RkFBQjMxREM3RjNERTExQkZCM0JCNjFBRTFBMTk4QjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NDU3 RDAyOTU1MDU1REYxMThCNTlEOTU5RDlGQ0Q1MEI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjQ2MjI3 NEJGRkE3Q0RDMTFCQUMzRTFGMzc1MDI1RjdCPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo0ODhFN0Qy MTY0MTdERjExQUIzMDk2REI1OUJFODI3ODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NEJENjRFM0Q1 OTFBREYxMTlBNDQ4MTZFNDI2RDE0Q0M8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjRENDc1MzBEQkZC MURFMTE4MzhDQjc5QkIwMjlDNTMzPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo1MDc3M0I2MjlEODBE RTExOUM1QUY5NkNDRjJCMEZFMTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NTE3NTk4NjcxNzA1REUx MUFBN0NGN0E0N0IzM0UzMTU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjUyQTBGMzlDMjVCRkRCMTE4 OEQ0QjE0QTk0OUQ0RDZBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo1NjVDMzBENDNBMDhERjExQTYx REIyMjdFRERGNTlGODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Njk3RTY3MDg3RjYyREUxMUEyOThC RDAwNzIyMjBFMEI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjY5OTU1MkU4ODQ2MkRFMTFBMjk4QkQw MDcyMjIwRTBCPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo2QTM3QzZCQkQ0RjlERTExQjNBMjhENTEw NkVGNDI5NjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NkIwQzc0NDY4NjYyREUxMUI5MzRFMEJDMzk4 MTU3MUQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjZDMUNFRTk5RkYwQ0RFMTE4QjYwODA4Njg2RDFD REE2PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo2QzcwN0VCNTRDNEVERjExOUJGNjlGNUU3Q0MzODVE NDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NzFFMjIxMjg2NzhDREYxMTgxOTZEMUNFQkExMUM1Njc8 L3JkZjpsaT4gPHJkZjpsaT51dWlkOjc0MjAwQTg1N0UzRERDMTFCNjYxRDM5MDQxMjU5QTg2PC9y ZGY6bGk+IDxyZGY6bGk+dXVpZDo3NTk4MDBDNEE1RDlERDExOUEwMEUxQkMwQzYxOTUxQzwvcmRm OmxpPiA8cmRmOmxpPnV1aWQ6N0FGMjZGQTA3NjVGREYxMTlGNjFDNTQzREQxNTI4Mzg8L3JkZjps aT4gPHJkZjpsaT51dWlkOjdEODJBNEQ5RjUzOERGMTE4OUFGQ0QyNzI5NDY2OTg1PC9yZGY6bGk+ IDxyZGY6bGk+dXVpZDo4M0ZBMTEzODg5NjJERTExQjkzNEUwQkMzOTgxNTcxRDwvcmRmOmxpPiA8 cmRmOmxpPnV1aWQ6ODRGM0JDOTA5MDZEREYxMThGRDNCRUM3NTcyNEU0MzE8L3JkZjpsaT4gPHJk ZjpsaT51dWlkOjg5NkMwRkNCREEzMkRGMTFBNDczQjIxQzQ5RDE3NTdFPC9yZGY6bGk+IDxyZGY6 bGk+dXVpZDo4QzhCNEYzMTdFMUFERjExQkFCQ0Q3NDQ3MkNFRTBBRTwvcmRmOmxpPiA8cmRmOmxp PnV1aWQ6OTFDNkI5REQ3RDFBREYxMUJBQkNENzQ0NzJDRUUwQUU8L3JkZjpsaT4gPHJkZjpsaT51 dWlkOjlCRkM5QkRDQURGQ0RGMTFBMjM1QTEyN0RFRkZEQzU5PC9yZGY6bGk+IDxyZGY6bGk+dXVp ZDo5RDBDMTExQTYzQzQxMUREODUzNjhCMDhDNzM0NUYxRTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6 OUREREMxNEE1ODcyREYxMUFDRTU5RjU4MUUyRUZCM0Q8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkEw NjM5NzlBNUY0RURGMTFBODg1OUZDMDM0RTVCRUEzPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpBMUU4 NzdGNThGMzRERTExQUQ2MEM1OUZBMjdGOEFDOTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QTJCMzM4 RkM4NzYyREUxMUI5MzRFMEJDMzk4MTU3MUQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkE1MkIyQkUy RDUwNERFMTE4NTMyQTc1MzYyOEU5NTg3PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpBNTgwMkU2NDRE MzhERTExODdEOENFMEZFMDhCMDBEODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QUZFQzk1M0U4QjI5 REExMTlEQUVFOTkyN0IzRUQzRTc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkIyOEVBOEMyODRGRkRF MTFCNEEzOEJGQzY5NUM3RUVBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpCNUExNjUyMURBMkFERjEx OURFNURDMEQ3OEUxNTg3MDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QkM0NjYxMzVCNTBDREUxMTk3 NTZGODFEQzk5NjdDMkQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkJDQ0U2MUVCNDRDNERCMTFCOTI1 RDU5OTYzNDU4MjlFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpDNEFBREQ0MTA5QTZERTExQUE1N0M0 REIwMkYxRjM3RTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Q0E0RTAzNEU3RTFBREYxMUJBQkNENzQ0 NzJDRUUwQUU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkNGMjY4NzNFNzIxMEREMTFCOTEwQUEwNTEw MjNENzRBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpEMjkyNTQ0QUY0NjdERDExOEIwMDg5OTc4QzUz NUQyNzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RDU3NDI4QUU4NzYyREUxMUI5MzRFMEJDMzk4MTU3 MUQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkQ2MjNFMkZDQ0I0NERGMTFBNjU5OTkwNDQ2Nzc5NjQy PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpENjczM0E1NEZBNTBERDExQjE5MEFCQzVGMTgyRkIzNDwv cmRmOmxpPiA8cmRmOmxpPnV1aWQ6RDY3QjczRDIzRThGMTFERUIxODFBODVFNTU0QUI3MjM8L3Jk ZjpsaT4gPHJkZjpsaT51dWlkOkRBQ0I0MkFDMEQ1N0RGMTE5RTYxODNBOTIxQjYwRjZEPC9yZGY6 bGk+IDxyZGY6bGk+dXVpZDpEQjI4MjQ3Mjc2NUZERjExOUY2MUM1NDNERDE1MjgzODwvcmRmOmxp PiA8cmRmOmxpPnV1aWQ6REMwREM4NkM5RkU1REQxMUFEQjI5QzVCRkJENkRGQTQ8L3JkZjpsaT4g PHJkZjpsaT51dWlkOkRFMjgyNDcyNzY1RkRGMTE5RjYxQzU0M0REMTUyODM4PC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDpFMUIwRDQwMzk5RUFERTExOUM1M0EyNEZGNDAyQTlERDwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6RTFDRUM2M0I3MUVGREMxMUFDNzE4RjJGQjA0RDVCM0Y8L3JkZjpsaT4gPHJkZjps aT51dWlkOkUxRUZBODg5QjlCMkRFMTE5QURBRkZCRUQ2NDFEMDA3PC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDpFNDI4MjQ3Mjc2NUZERjExOUY2MUM1NDNERDE1MjgzODwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6RTZGMTIwM0QyRUU5REUxMUJENzJDMzdFOUM1QjBCOTM8L3JkZjpsaT4gPHJkZjpsaT51dWlk OkU3MjZBQjY3QTFEN0RFMTFBMUFFOEEzODhCRjExRkRCPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpF OERFRkZGQzc1NUZERjExOUY2MUM1NDNERDE1MjgzODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RUI2 OUIxODg4NjA2REUxMUIzODBDOURGRkY1RURCNkI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkY4NkFF QTM2NzkzNkRFMTE5RkM5OEM2RjcwNjQ2MTc0PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpGOERDMjQx MDg0NjJERTExQTI5OEJEMDA3MjIyMEUwQjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Rjk1QzFBMkUy NTc4REMxMUFCQjdFN0IwQ0YzNEQ3OEU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkY5NzQ4NkMxRTI0 RkRGMTE4M0M3OTk2NzEwRDA5OURDPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpGOTc2QzQxQ0IxNTZE RTExODFEOTg2RTU0NTZBQTlDQzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RkExRUU2NjkyRDNGREQx MTk2QUM5NTZEQTNEQjE5QzM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkZERDZEMDFDQzcwOERFMTFB MTVBQjI4MzhGM0FFQkZFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpGRjYyMTY4MEU4QTVEQzExOEZG RUM3RjM0RjZCRDExRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMThE QkI5RDhFQ0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjAyN0I2OTBFRkM1QkUyMTE5 RkQzRkUxRjUyMzVFMTIyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowMjgwMTE3NDA3MjA2ODEx ODhDNkFCN0ZEMEY1Njg0QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDI4MDExNzQwNzIwNjgx MThEQkJFMkYzOUM1OEYyNEI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjAzODAxMTc0MDcyMDY4 MTE4RjYyQUYzNUM0RDI0MTFBPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowNEQzNDAxMEZGMkQx MURGODIzREMxRTc5QUVFRUYxNTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDU0MjY2MEUyRkUw MTFFMEFFNTJBRTI2OEZDMEUyRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjA2MDZEQkM5MTBG RkRGMTFBNDU1ODUwOTcyRkM5MEJEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowNjM1RDNERjBE NUYxMUUxQjA3MEEyNkE2MkVGRDM2MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDcwQzZDNTZF QjQ3MTFERkI2M0VFNjc0ODQwMkRDMDA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjA3ODAxMTc0 MDcyMDY4MTE4REJCOUQ4RUNDMzFCQ0VEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowOEM2MDc1 QjI4MjA2ODExQTE2OTg3MUJDQ0JCRjQ4NjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MEEzODkw MUE0QzE4RTAxMUIyNTc5OEY4RDdGRTJGRDM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjBBODAx MTc0MDcyMDY4MTE4MDgzQzYxRjRFQjYwODkyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowQTgw MTE3NDA3MjA2ODExOTJCMDk0Q0FCMkYzRDgzMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MENF N0MzQzI3NUVFREUxMThDREVERjhBODExMkVEMzg8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjEy RUNERkNDNjkxOEUwMTE4MzE3QTUxMjZCMTg0QzlDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDox M0IwODY1MDhFRkJFMTExODYzMkMzN0VBMDk0RUI5OTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 MTU4OEFCQTY0QjdFREYxMThCQjNGRDNGRkZFNTBGQkM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjE4NDA3RUE0OUY3NERGMTFCOUFERjUwMUIxRkVFQzVCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDoxOEEzQjJERkZFMTdERjExQTFBM0Y2RTJCRTM4NzJENTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6MThBNkE1RkFCOTEzRTAxMTgwREFDRUIxRTRCMDgwRkM8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjE4QjlCQjBCMDNFNzExRTA4NEM4OTFENDIxMERBQzgzPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDoxOTRCNTQzNkE1NkZFMTExODQ0NUREQzgzNUZDOTMyRjwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6MUQ2RTQzNzNBQzVGREYxMUE2OEVEMjUxRkYyM0VDMzQ8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjFGNzNFMUJBNTczQ0UwMTFBRDc3QjJDRjVGOTdBQUJEPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDoyMDIyN0QxQkQ5RUNERTExOEY4NEI4MjhBOEY5NjhGMDwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6MjFBQjQ5NTExM0ZGREUxMTk3RDVEQjYwOTI3MDE1NTI8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjIxQ0NGNzgyMjJEMkUyMTFCMkIzRDRFNUUwQjEyNzJDPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDoyM0I5ODI1QzJGREUxMUUwOEI4NUFCQjQxODY1QTRGMDwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6MjRFMTA1OTU0MkY1MTFFMThCRDQ5NTMyMkI4QzY1NDg8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjI1MEYzN0ZEQkU2NURGMTE5NkEyRTUzODZFQjdFRkJGPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDoyNjJENUYxRjE3MUVFMjExQkFDNjg1OUNFNkNCMEVGMjwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6Mjc0OURBQzE2OUUwREYxMUJBRTJBOUY0RkExQzczMEU8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjI3RTAyOTNBNzhGNURGMTE5RjEwODNCNTdBNTk4NDE5PC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDoyOEVFQTlCNzlBRDVERjExOTY0OEY4NTExQjc0MTdEMzwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6MkI0OURBQzE2OUUwREYxMUJBRTJBOUY0RkExQzczMEU8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjJCQkI3RUYzMTIyMDY4MTE4REJCRDFFRjI2NzQyRDNDPC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDoyQzI3RUFDN0IyNjFERjExODdDRkVDODVBNjA3N0E4NzwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6MkQ3NjM1MDgxNEZGREUxMTk3RDVEQjYwOTI3MDE1NTI8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjJFNEM4MDY2REYwQ0UzMTFCMDJERDE2RUM5ODQ5RjBBPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyRUFGQTJCQzY5MjI2ODExODhDNkYxNkJFQjUwN0ZCQzwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MzJCQTY4MTREOUVDRTIxMThBRjNGRTVGRjQ2NjNGMEE8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjMzN0FGRkRERTkwMkUxMTE4RDlFQTA2OTk5Nzg3RkIx PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozNDFBQjI3RDRDMTJFMDExOEQzM0E0MzY0NjZEOTU3 NzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MzgyQkZGMjNFOEVGREYxMTlDMTg5MjkxRDFEQkRE NzQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjM4RTlEMzVENDkxNURGMTFCMTMxODIyM0M2QThF REU5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozQTZDQUYyNzJCMTlFMDExODRERDhGQkQxMTAz NDAwODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6M0E3Njc4M0NEMEE4REYxMUIyQTE5RDUwRkYy MUI4RDk8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjNCQzZDRTEyQzM3MERGMTE4NTBDQjcyREI5 RDJDQjkyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozRDAyRTYyQURGOENERjExODFEQ0NCOEU4 Qjc3RjMxRjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6M0YyODQwQkJEQUY0REYxMTlCOUZFRDY2 QjY4NzVBNzc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjQxODdDMTQxNzczMkRGMTE5RDczQkM2 NTdFMTlFMzM2PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0MjY5NTZBNjNDN0VERjExQTVBNEU5 MDY1RkFDNzA0QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NDJEN0FEMTQ0NDIzNjgxMThEQkI5 RDhFQ0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjQzNTE1REUzQkIzN0UxMTFCMDVD ODNGRTQzQ0JFODIzPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0NEJBNjEwRkY3MTVFMDExODUw RkE5MDFCNEMxQjY3NTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NDgwQjdFNDZBRjc4REYxMUE4 MjVDRjhERTVEOTFERjc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjRCNEVEQUZGNUNGN0UxMTE4 NjM1OTQyMDBBNjk2RDFDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0RDdDMTY3N0RBQUJFMDEx ODQzMUY2RTUxMUZGMTQxMjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NEU1RDI4NzExODIzNjgx MUE5NjFBRTU2RDQ4QUNENTA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjUyRDIyQUZFNTYyMDY4 MTE5MTA5OTFCOUM3QjkzOUI5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1M0E0QkIwRTM3MDdF MzExOUIyNEU3MTY5MURENjg3RTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTQwOTJFRTc3RDE0 RTExMUE2OTFGNjhBNzM0RDAwNkM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU0M0E3OThGMTMw N0UwMTE4NDZGRThDMDREM0M4REVDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1NEMzRjlGOEJE QUVERjExQTVEQzk1OUM4MkFCQzlFMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTU0REFFODVG QzBBRTExMUE3RURGNzQ0Q0FDOUEzMzA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU1NUE5RUU4 MTEyQjY4MTE4NzFGRjlDMzJGODIxNUE3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1NTlGQ0Qz QjUyN0FERjExODkxNERFQjEzNTE3NjFGMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTYxNEMx MzQ5NjM3RTAxMTgyNTdENDg5ODA3NzdDMTg8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU3QUNG MTUwNjkyQTY4MTE4NzFGRjlDMzJGODIxNUE3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1OTQw OEU0Q0JFRkZFMDExOUI0MkY0ODMxNDE0MDMzQjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NUI2 REQyQjc0NTg0REYxMUI3MjQ4QjdEREY3OTRBMUE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjVD NUVENTIyMjgyRURGMTFBNDYzQkZFOUIxOEZDQUQ3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1 Qzc5QzJGMjM2MEJERjExOEUyQkM0NjUwNkZBODY5ODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 NUQ2Q0VBMjZGRDg4MTFERjlFN0RBQUU5RjVEODhBQjI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjYwNjQwQTVDNTgyNkUwMTE4MkNBRDM4RUNFRENFMjY4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDo2MkE1NkUyRUQ1RTdERjExODFEN0QxRDdCQzkyOUMwNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6NjMxRDMxNkYwQzQ3MTFFMEJDMEVBQTFCQUNDNzYwMzc8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjYzOUIxREQyOTdENURGMTE5NjQ4Rjg1MTFCNzQxN0QzPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDo2M0FFRjkxMDUzMDVFMDExODY3Rjg5QjAyMTFFNEY3QTwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6NjQ3NEM4M0M2ODdDREYxMThFMUY5OUQ2OUIzNTI1Q0M8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjY0ODg2Q0M4QkYzREUwMTE4OEJCQzA1NzgxRUJBRUQ2PC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDo2ODlCMUREMjk3RDVERjExOTY0OEY4NTExQjc0MTdEMzwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6NjhDMjVCMDYzMkVERTExMUE1N0JGMDMzMTA0MjJFRTQ8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjZFMjgyRENBN0YxN0UwMTFCMDczOTg2NkU5QUQwQzgxPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDo3MDIxMkE4QzJGREYxMUUwOUFEMjg2QUE2NTMzNEEyNzwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6NzAzOUVEQTA1MDM3MTFFMEEyRjNFMjNFNzlCNDZBRjY8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjczOUQ3RTlGRUJBRERGMTFBQURFQURBMzU2MjIyMDgzPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDo3NTUxNTMyMkFCNUNFMjExQTc4MEVDREJBRDVDNTdERTwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6NzZCQzNGN0U1MzNCRTAxMTgxREFGMzNBMzA4Mzg2RUU8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjc3NkNEMjNCMkZERTExRTBCMTMwQkU0ODc4REY0NEQ1PC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDo3NzdDNEFBNDE3MEZFMDExQjQyMjgxNTMwMjVFRjBDRTwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6Nzg4MjAwQjMzMjYxREYxMUIzOEY5OTg4NzVDQzg2NTQ8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjdBQkMzRjdFNTMzQkUwMTE4MURBRjMzQTMwODM4NkVFPC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDo3RTBCQkVDMDA5ODVERjExODRCMkVFNTk4RDk5NUExMTwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6ODJDMDFGMzY2RUYzREYxMTlCOEFDRjI2OEEyNzg2QTE8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjgzNDI1NURDNkQzQkUwMTE4MURBRjMzQTMwODM4NkVFPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4NEM3NkU1Q0E2MUVFMDExOUI2MkMxQTcyQ0REQkIyRDwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6ODUwRkQzODgzOTBDRTMxMUI1MTg5QzAzRUExMzAyNDc8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjg2MUNCMTI5MTE2Q0RGMTFBMDgxREFDNjU1NDlGRkY4 PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4OEExMjMxMTY0RDcxMURGQTY5Nzg1MjFENjBERjQ2 MDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OEFEQkRGRDM3QTZGRTExMTg0NDVEREM4MzVGQzkz MkY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjhCOTA4NThGQjU3M0RGMTFCRkJCRjAwNzU5QTNE NDUyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4QkNGQTY3QkI5MDZFMzExQTgxQkI5MTQ3QzdF MTYzRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTBDNUQ1MjY2NDc5REYxMTg2NUNFRUYwOTg1 MUZENzk8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjkxRkYwNTFFMEZEM0RGMTFCMkQxQzUxRjU5 QjVGQjI5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5NDBEREMzNTAxMjE2ODExODhDNjhBOTQ4 MjExMjI1MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTU5MTZGMzY3MTQ0RTExMUFEODY4QTM4 MTdCMzgzMTU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjk2RkFFQ0IwMDE1RURGMTFBODc4QTU0 RUI2NjQwRUI4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5Nzg4QURCNzY2M0VERjExODIwMEYw OTc5RDhCOTUyMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTg1REYxOEMxODIwNjgxMTkyQjBE NEI2OUZFNUFGOEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjlBRjUwNEM5RTc5MEU1MTE5Rjgy QzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5QjBCQzkwRTc2QjRERjExQTM2 NUVGNTI1Nzc2MjM4MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OUU2NjQ2NEI0MkZERTIxMUFB OUZCMDlEMTY4OTRGN0U8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjlFN0MxRjc3RkMyMDY4MTE5 OTRDQjlGQjVCNjM1M0E0PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5RUY3RDkyRkMzOTJERjEx QUVENkE1OUIwRUY3MTE0OTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QTNBNjIyQ0E4NzFGREYx MTg1NDdDNTk3NTM2MTk5OEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkE0NTcxQTk1RTQ1MEUw MTFBRkI5RTAwQzc1NzJFNjY1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBNkFDMEY5QzczM0NF MDExQjJDRkIyMzNBNDdDRjVCOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QTdCRTEwQTAzNjA4 REYxMTkyNERCMDM1Nzc5MjEzQkE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkE5NTZGQjA1RTRG Q0RGMTE5MEE2RDEwMzc3REY1NkJEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBQUU3NjhGRjhE NkFERjExODI5MENCQjk0QzVDRjRGMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QUJBNjg0REIw MTA3RTAxMUJFMTk4RDc3NTM0NkUzMTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkFCQzNGOEE0 MjcxQ0UwMTE4RkNBQUJEMzA5MjREMjk2PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBQzdDNEY2 RTI4MDhFMzExOEZCMURFRDM2NDQ3M0IzQjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QUUxOEI3 QjgwNkE5MTFFMDg1RkRGMzVBMzBCQTU2QUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkIxMUQz NjBDMjVGMURGMTE5NDQ1QTVGRDg5NUQ3ODFFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCMUI2 MUIxQ0I2OUJERTExQjY5NUM2Qjk3NUQ3NTFDRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjFG QkMyQUMyRkRFMTFFMDlBRTlDNEE2REY5QTQxRjk8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkIy RTRCQjYzNDNENURGMTE5QkJEQzFCQjJCNTEwMEE2PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpC NUMxRDZCQjdEOUZFMjExOTVEQTg4QjFDODhENjNERTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 QjVENUQzQkNDNjBBREYxMTk3NDNCNUZGOTU2NDQ3OUY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OkI2RjI3MTFCQkVCQkRGMTE5NkY1QjQ0RDNBOUJENkY2PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDpCOUJGNkExMzNEOUVERTExODY1RUI2MERCMzdEOUNERTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6QkNCNzExOTI3QkNBRTAxMUI1NEVBQzdEMzQ2OUVFNDU8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOkMxRkQ0MjI0MDI0RDExRTBCOUU3RDkyM0RENzkxN0NFPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDpDMjMyQjkzMDBGMjA2ODExOEY2MkE2QTZENDIyM0Q1MDwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6QzI2QzBENDk1MjY3REYxMUIyRTVDOENBMkEyMEI1MDE8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOkM0NzYyN0IyQTRGNURGMTFBQTZCRjY2MUJGNzUyMjFDPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDpDNTUzRDJERUI2MUJFMjExOTJFNUMxQjFCMURFN0IzNjwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6QzY1Q0E3NTNBNkI1REYxMTk4NjZENkIxMTAwNUJFN0I8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOkM2NkMwRDQ5NTI2N0RGMTFCMkU1QzhDQTJBMjBCNTAxPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDpDNzExMEU1RjUwNzZERjExOEU2MUFDRDE3OUQwNjI0NDwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6QzhDM0FEMEY5ODEwRTAxMTlFM0VFRDZEQTUyQkIwMjA8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOkNBMkQ4MjkzRTExREUwMTFCOEZEODE3Q0M4OTgxRDRDPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDpDQzRBQjU5MUE3RENERjExQkY3OUZBNjJCNTFERjZDNzwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6Q0RFODhCQ0U0QjZGREYxMUIyMThCMDBEODQ3REMyOTc8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOkNGQkJEQjUyMEM0NTExRTBBNDNBQUQ5QzRFNUE4ODM2PC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDpEMEJGMTI2NTI4MDlFMzExOEEyMUQ5NURFQTE1OTFCMTwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6RDMzMTg0MzFBODY0RTExMTk1Rjk5N0JBNzRCQTQ5QzU8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOkQ0N0ZCN0Q0OTZCMEUwMTE5NTFFQzMyQzI2QjM0NzY0PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDpENUVCRjZBQTJCNjdERjExQjM4ODk0NzMzMkU1NThDNDwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDY3NjZGNjExNzEyRTAxMThEMzNBNDM2NDY2RDk1Nzc8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOkQ5MDIyMjBERTdFRERGMTE4NDg4QUFDQTZFNUYyMjUxPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpEOUU2ODE3NDFERDkxMUUwOEEyRTk2RDMyNjk0MTE0Mzwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6REFDODUwNzg1NEQ1REYxMUEwOTRERjAxRTZFREUzMjA8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRCMUU0QzFDRTg3QURGMTE4Q0I3RkVBN0NENzREMzVC PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpEQzEwODUyMzJDQjRFMjExQjY0NTg0QUNDRTZBN0U1 RjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6REQxQzZEMkFGQTIzNjgxMUE3QkE4OTIxMzVDMTM4 NzI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRFNEQ2QkUyMEM2QkRFMTE4ODY4RDVENEZDQ0NF N0VBPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpERUM5REE4RjFDMjA2ODExOERCQjlEOEVDQzMx QkNFRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6REVGNjBGQTUwOUIwRTIxMTkzQTdFMjc2ODgw RTE1NTA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkUwMjQxRTQxQjRGRURGMTFBNDBDRDNDMUIz NDNENTkyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFMDJDMTkwRTQyNkVERjExQjI0REU5MDhB Q0NBQzA5NTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTA2Rjc4NkRGQ0IxREYxMTk4REZCMjBG OTBEM0FBNkU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkUwOTkwRkJEQUMzQUUwMTE4REM5QkY1 NzQ3NjE1MzNEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFMEI1MDU3MzUwRERERjExODI3MUE2 OUFGQzY1Njg4RDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTc0N0MwRjgwRjY1REYxMTlBOTRD NUQ4RDE4ODk1NUI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkU3OTQwNzhEREU2NERGMTE4QTUz RDRFRkUyMEMzNTE4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFN0QzNDc3RjBDNDgxMUUwODhB REQ2RUQ1QTNEODlERTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTdERDUyNjQxQTE5RTAxMTk1 RjFCQTQ3NEYyQzBCQUU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkU4MTJBMzcxRkM0Q0RGMTFC RTU1OTI2N0Y1M0EwQkFGPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFOEE4MkVBMkNDMDhFMzEx ODYyRkJDMkQ0NTZGMzAxODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RThDMTU2MEU5MjE3RTAx MUFGRkJBNjU0MTlBRjEwQ0I8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkVBMTJBMzcxRkM0Q0RG MTFCRTU1OTI2N0Y1M0EwQkFGPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFQjg0NjkyMDNCRkFE RDExOEI0QTgyOEQ4RUZENTMwQTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RUVDMTU2MEU5MjE3 RTAxMUFGRkJBNjU0MTlBRjEwQ0I8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkVGODQ0MUMwNjVF N0RGMTFCOEFCQkJGN0ZGQTZCMEM0PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGMUQyMTJBNDc5 NDVERTExOTk4RkJFRDIyOTNEOUUyNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjI5ODZGNDE2 QjFFREYxMTk4OThBQ0RCREY1RjEyNUU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY0ODA5RUIy QkEwOEUzMTE5MDE2ODFFODQwNEZGRkFFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGNUM5NDlE NEZCNjhERjExQkIyNzlGOThGMDY3MzYwQTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjZBM0ZE QjUwNzIwNjgxMTgzRDRDODgzRDU0RkQyMTc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY2Q0U3 MjUxNEIyMDY4MTFBMTM4QkNENTc1NEFDRDJCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGNzdG MTE3NDA3MjA2ODExODA4M0VCODNDNjJCRDdDMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Rjc3 RjExNzQwNzIwNjgxMTg5MjZDMjc3OThDOTZDRTU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY3 REU2NzAxMUZFQ0UyMTFCQzlBOTZGMDZBOTU2QUU0PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpG OEEzRkRCNTA3MjA2ODExODNENEM4ODNENTRGRDIxNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 RjhFNUJFNDFDODE5MTFFMEIwMzNFRUZBQUYxRTI4NzM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OkY5RDJCQzBBMDM5OERGMTE4RTBERkJDQzM5RjFENzBDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDpGQUNENUE3MDMzMjVFMjExODA2REI1MDhGQTY3NUQ5RTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6RkJCRjQ5NkMyRkRFMTFFMDgzODdEMzAxODA3NTc1ODk8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOkZCRDNEOUI2MDg1NzExRTBCQTdERTU4QzYxNDY5RTA3PC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDpGQkY5OUVCNzU2N0RERjExQTc0RUU2Q0UwMzk5NDQyMjwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6RkMxMzNBODJEMTBEMTFFMEEwOEE5Nzk2NTE5OEVGN0M8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOkZDN0YxMTc0MDcyMDY4MTE5NDU3QjkzMzk3Q0NGMzZGPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDpGRUM1MkQzOTc2NjNERjExQjI2MTk0REQxMzQyN0Y4QjwvcmRmOmxpPiA8L3JkZjpC YWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9y ZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+/+IMWElDQ19QUk9GSUxFAAEBAAAM SExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAA AAAAAAAAAAAAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAA AgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAUZG1uZAAAAlQAAABwZG1k ZAAAAsQAAACIdnVlZAAAA0wAAACGdmlldwAAA9QAAAAkbHVtaQAAA/gAAAAUbWVhcwAABAwAAAAk dGVjaAAABDAAAAAMclRSQwAABDwAAAgMZ1RSQwAABDwAAAgMYlRSQwAABDwAAAgMdGV4dAAAAABD b3B5cmlnaHQgKGMpIDE5OTggSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkAAGRlc2MAAAAAAAAAEnNS R0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAADzUQABAAAAARbM WFlaIAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UA ABjaWFlaIAAAAAAAACSgAAAPhAAAts9kZXNjAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gA AAAAAAAAAAAAABZJRUMgaHR0cDovL3d3dy5pZWMuY2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJH QiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAuSUVDIDYxOTY2LTIuMSBEZWZhdWx0IFJH QiBjb2xvdXIgc3BhY2UgLSBzUkdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALFJl ZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAACxSZWZl cmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAB2aWV3AAAAAAATpP4AFF8uABDPFAAD7cwABBMLAANcngAAAAFYWVogAAAAAABMCVYA UAAAAFcf521lYXMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAKPAAAAAnNpZyAAAAAAQ1JUIGN1 cnYAAAAAAAAEAAAAAAUACgAPABQAGQAeACMAKAAtADIANwA7AEAARQBKAE8AVABZAF4AYwBoAG0A cgB3AHwAgQCGAIsAkACVAJoAnwCkAKkArgCyALcAvADBAMYAywDQANUA2wDgAOUA6wDwAPYA+wEB AQcBDQETARkBHwElASsBMgE4AT4BRQFMAVIBWQFgAWcBbgF1AXwBgwGLAZIBmgGhAakBsQG5AcEB yQHRAdkB4QHpAfIB+gIDAgwCFAIdAiYCLwI4AkECSwJUAl0CZwJxAnoChAKOApgCogKsArYCwQLL AtUC4ALrAvUDAAMLAxYDIQMtAzgDQwNPA1oDZgNyA34DigOWA6IDrgO6A8cD0wPgA+wD+QQGBBME IAQtBDsESARVBGMEcQR+BIwEmgSoBLYExATTBOEE8AT+BQ0FHAUrBToFSQVYBWcFdwWGBZYFpgW1 BcUF1QXlBfYGBgYWBicGNwZIBlkGagZ7BowGnQavBsAG0QbjBvUHBwcZBysHPQdPB2EHdAeGB5kH rAe/B9IH5Qf4CAsIHwgyCEYIWghuCIIIlgiqCL4I0gjnCPsJEAklCToJTwlkCXkJjwmkCboJzwnl CfsKEQonCj0KVApqCoEKmAquCsUK3ArzCwsLIgs5C1ELaQuAC5gLsAvIC+EL+QwSDCoMQwxcDHUM jgynDMAM2QzzDQ0NJg1ADVoNdA2ODakNww3eDfgOEw4uDkkOZA5/DpsOtg7SDu4PCQ8lD0EPXg96 D5YPsw/PD+wQCRAmEEMQYRB+EJsQuRDXEPURExExEU8RbRGMEaoRyRHoEgcSJhJFEmQShBKjEsMS 4xMDEyMTQxNjE4MTpBPFE+UUBhQnFEkUahSLFK0UzhTwFRIVNBVWFXgVmxW9FeAWAxYmFkkWbBaP FrIW1hb6Fx0XQRdlF4kXrhfSF/cYGxhAGGUYihivGNUY+hkgGUUZaxmRGbcZ3RoEGioaURp3Gp4a xRrsGxQbOxtjG4obshvaHAIcKhxSHHscoxzMHPUdHh1HHXAdmR3DHeweFh5AHmoelB6+HukfEx8+ H2kflB+/H+ogFSBBIGwgmCDEIPAhHCFIIXUhoSHOIfsiJyJVIoIiryLdIwojOCNmI5QjwiPwJB8k TSR8JKsk2iUJJTglaCWXJccl9yYnJlcmhya3JugnGCdJJ3onqyfcKA0oPyhxKKIo1CkGKTgpaymd KdAqAio1KmgqmyrPKwIrNitpK50r0SwFLDksbiyiLNctDC1BLXYtqy3hLhYuTC6CLrcu7i8kL1ov kS/HL/4wNTBsMKQw2zESMUoxgjG6MfIyKjJjMpsy1DMNM0YzfzO4M/E0KzRlNJ402DUTNU01hzXC Nf02NzZyNq426TckN2A3nDfXOBQ4UDiMOMg5BTlCOX85vDn5OjY6dDqyOu87LTtrO6o76DwnPGU8 pDzjPSI9YT2hPeA+ID5gPqA+4D8hP2E/oj/iQCNAZECmQOdBKUFqQaxB7kIwQnJCtUL3QzpDfUPA RANER0SKRM5FEkVVRZpF3kYiRmdGq0bwRzVHe0fASAVIS0iRSNdJHUljSalJ8Eo3Sn1KxEsMS1NL mkviTCpMcky6TQJNSk2TTdxOJU5uTrdPAE9JT5NP3VAnUHFQu1EGUVBRm1HmUjFSfFLHUxNTX1Oq U/ZUQlSPVNtVKFV1VcJWD1ZcVqlW91dEV5JX4FgvWH1Yy1kaWWlZuFoHWlZaplr1W0VblVvlXDVc hlzWXSddeF3JXhpebF69Xw9fYV+zYAVgV2CqYPxhT2GiYfViSWKcYvBjQ2OXY+tkQGSUZOllPWWS ZedmPWaSZuhnPWeTZ+loP2iWaOxpQ2maafFqSGqfavdrT2una/9sV2yvbQhtYG25bhJua27Ebx5v eG/RcCtwhnDgcTpxlXHwcktypnMBc11zuHQUdHB0zHUodYV14XY+dpt2+HdWd7N4EXhueMx5KnmJ eed6RnqlewR7Y3vCfCF8gXzhfUF9oX4BfmJ+wn8jf4R/5YBHgKiBCoFrgc2CMIKSgvSDV4O6hB2E gITjhUeFq4YOhnKG14c7h5+IBIhpiM6JM4mZif6KZIrKizCLlov8jGOMyo0xjZiN/45mjs6PNo+e kAaQbpDWkT+RqJIRknqS45NNk7aUIJSKlPSVX5XJljSWn5cKl3WX4JhMmLiZJJmQmfyaaJrVm0Kb r5wcnImc951kndKeQJ6unx2fi5/6oGmg2KFHobaiJqKWowajdqPmpFakx6U4pammGqaLpv2nbqfg qFKoxKk3qamqHKqPqwKrdavprFys0K1ErbiuLa6hrxavi7AAsHWw6rFgsdayS7LCszizrrQltJy1 E7WKtgG2ebbwt2i34LhZuNG5SrnCuju6tbsuu6e8IbybvRW9j74KvoS+/796v/XAcMDswWfB48Jf wtvDWMPUxFHEzsVLxcjGRsbDx0HHv8g9yLzJOsm5yjjKt8s2y7bMNcy1zTXNtc42zrbPN8+40DnQ utE80b7SP9LB00TTxtRJ1MvVTtXR1lXW2Ndc1+DYZNjo2WzZ8dp22vvbgNwF3IrdEN2W3hzeot8p 36/gNuC94UThzOJT4tvjY+Pr5HPk/OWE5g3mlucf56noMui86Ubp0Opb6uXrcOv77IbtEe2c7iju tO9A78zwWPDl8XLx//KM8xnzp/Q09ML1UPXe9m32+/eK+Bn4qPk4+cf6V/rn+3f8B/yY/Sn9uv5L /tz/bf///+4ADkFkb2JlAGRAAAAAAf/bAIQAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMDAwMDAwMDAwEBAQEBAQEBAQEBAgIBAgIDAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD/8AAEQgDIAMgAwERAAIR AQMRAf/dAAQAZP/EAaIAAAAGAgMBAAAAAAAAAAAAAAcIBgUECQMKAgEACwEAAAYDAQEBAAAAAAAA AAAABgUEAwcCCAEJAAoLEAACAQMEAQMDAgMDAwIGCXUBAgMEEQUSBiEHEyIACDEUQTIjFQlRQhZh JDMXUnGBGGKRJUOhsfAmNHIKGcHRNSfhUzaC8ZKiRFRzRUY3R2MoVVZXGrLC0uLyZIN0k4Rlo7PD 0+MpOGbzdSo5OkhJSlhZWmdoaWp2d3h5eoWGh4iJipSVlpeYmZqkpaanqKmqtLW2t7i5usTFxsfI ycrU1dbX2Nna5OXm5+jp6vT19vf4+foRAAIBAwIEBAMFBAQEBgYFbQECAxEEIRIFMQYAIhNBUQcy YRRxCEKBI5EVUqFiFjMJsSTB0UNy8BfhgjQlklMYY0TxorImNRlUNkVkJwpzg5NGdMLS4vJVZXVW N4SFo7PD0+PzKRqUpLTE1OT0laW1xdXl9ShHV2Y4doaWprbG1ub2Z3eHl6e3x9fn90hYaHiImKi4 yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A0CFPtojowRjjrLqv 7pTp/wASo6xk+7dMk/PHXj791okUGeve99e64Nx72Om3FCMddD3vqg8q9cre616d0+nXtVvr79Tr 2ulAesgsRwR9bW916eFCAQRWvDrzgaTcfj8+/KTUdelVfDao8uo2shdPHP59u0zXpAJCIzHTHWaO 2kf7H/Y8+6Nx6VQU8MevXP3Xp7r3v3Wuve/de66t731Ujrr37rVOve/deHHrv37qwx13711vr3v3 Xuve/db679+6311791Xr3v3Xuve/de697917rr3vrQOeu7+9deqOve/db69f37rdT1yvf3rq9a06 5Wt711elPPPXNW559+6uj0Oeu29+PVmzXrHp/wBh79XpnR59cT731UgcOuJ976oade9+69XqXS1U lO3BLRk+uIk6GH9CPp7bkjVxnj69LbO8ltmFCWjrla4P5dSJoY5UaohDLqa/j/Cg/UX/AMD7qrFS FbpVcQRTRtcwAgE/D5DqA6lbXPJF7fke3RnosdSmnOeplHlKyhcNTy6bf2WAdD/rq1wePbUtvFMK OvS/b963DbZA9pNQ+hAI/YcdOj7gqKg6p7EniyqFAt+QBb6+2Fso0wvDo5k5pvLs1uSK+gAHXkVa 0PL+nj8C5Zrf8V9+J8Gi9VRF3EPKRp/ynpmqoJYW/cUqD9A1/p/Xn+vtUjhhg9EV5bTQN+ohH2/4 esCm3vZ6YQ0Hy6yj/ePe+nl+3HXL88fT/W+vv3Vq567vxyB711avr1wBP9fe+mwTUZ65avx71QdW 1Z69rt+f959+oOtaqdSomBHPtpga9KYWXz4delZQOP6f7z78gNc9emZOC9Nrck+3h0WyAsT1jt7t XpnT11b37qpFOuJ97HTbceuve+tdcT731Qnru3v3WwOu/eurAfLrl711cCnXfvXVqdd29+63Trse 9dXA65W96r1fTnrkB711cL1nRb+/E06fVR6dZgoH+8e6E16cHljrIVB+o+vutSOHTmkHj1Hkp2+o 5uT/AMiHu4cdMy27YNOozIVtwfdwekrxkU64W976boR5dcT7302cHPXXv3Wuve99a697917r3vXX uuQHvR6cUfPrs+/dWPXXv3VevW9+69Tr3v3XuuVveurgeXXj791sjrq3vfVKHrsAn3rqyqT5dcyT 9Pp70OnWJGOsZ92HTJPXre/depnrKik2sPr7qf5dPxq3p1OSIC1/r7aZ69LkipSvXcraVNvflFTn rczBRQDpsNyST7eHRU1SSevBb+/V62qVPUVx62H+1W/4j28p7R0WyqfGdf6VOlBT0puABf6fX8f0 /wBa/tE8mOhXa2bMQAvb1//Q0Bhce2+lgqKdcwfdenAeve/dbpXrq3Pvdeq6cnrog/j37rRB8uvG 5Hv3WjUg9cAPdumwDWvl1zB916dB68fex1ps8esVyP8AYfT3bpipB45HWXyF+DbkW/3j6/6/uukD PT/jNL2keVOo/tzpH1Ii/T9foT7afj0ttiNFK5r1l916f669+611737r3Xvfuvde9761117917z6 9791rhnr3v3Wx69d+9db697917r3v3Xuve/de697917r3v3Xuuve+tZ697916nXfvXW+ve/de697 916vXd/furV69f3qnXg3XL37q465X96p1fVQDrotf36nVS9euPvfVPPr3v3Xjnh11b3uvWtJ6zQr qdB+SwHH+PurHB6UQIGZB5k9K5sbVzwCGKBYIogryBeTI1rBwSPob8+y0TxI5dn1MeHQ6fZ7+5th BBbCOFAC1PxH1/z9J6vx01IymRWGpdQ1CxIva6/1F/a2KZJK6T0Fdy2q4sWXxkI1Cor6fLptCcm/ HH+39vV6KBHk6sY66AN7e9nrSqa0A6UtLTvFCkwcKt7+Mmzkf630t7QyOGYpToWWdq8Nulx4oAr8 Pn9vXDMTRzpGQLOlrtf9Qtxx/h73bIyaqnHWt9uIrlISFpKvE14jpP8A0+ntX0GMA44dZF59+HTq 91OsmpRxf6/U/wBP629+6cLKMV64tIPp/vv+Ne/AdUaRQKdYS5PvdOmGlJ4ddaj79Tqus+Z67Df1 9+p1YOfPrMj2HvVPLp9Gx1yZ78f74+9Cg6sW8usLe99MsR1jPvfTJHXE+7DptuuB97HTbdde99V6 9791qnXdvfurAV67966sBTru3vXVqdcveurAdd+/dWAz12B711cDrKqn8/7D3r59PKp8+sypzz70 T08F6zBAPp7oW9enAnXMJz/hb3XV04Is/KnXiLc/7z79x60QVyRjrkri1veivTizAilM9YJlBGoA 8e3E9D0nmUHKjqAT9fbg6QMcnrgfdumj11731Tr3vXXuve99e697917r1/eutg0HXd/fqdb1E9cv eurj+XXvfut0z13b3rrdOu/fut9eAube/dWC1NK9cyvv2erlB13a3096r1YCgxw64seffuPTbnNe uHvfTZ49clW5Hvx6ui1I9OnKJAoufqfbDtU/Lo0hQKKnrLYn3Xp6hI6izX+nt1OkcoNesHjv+P6e 7VHTPhjHXNUsfpf6fjjn/invxIp1ZVocdQY4zLVqn+qnt/TjVc/7wPbpOmIn5dFUMRnv44/WT/Ln pYlxQrGzQmRWv5GW4025H1+vHsroZiwDUI4dD8yLtyws9uXRuJHl1//R0CPx7a6X0qB12OPfutjH XdveurEenXh7914H168ffuvHrj731Xrw9+60PQ9KvbFZtygrIGzuGmz9PVSNTV9NDUNSSUOOmXxS VmPmX0/xmItrhMgaFSoDK2r020kj06LrqSZifBlCBeB41Pof6PkaZ/Z1l3htNtuzUtbj6sZja+ZE 02387HH41qoYn0y0VdCC32GboNQWppmOpGIZdSMjHwBAGrj1e3u1uAQV0zL8S+nzHqD5H/L0iT72 OnW64n3vps166976r1kitq5+pFh/xv3R+HT9uQJM8SMdSfbfS4jrr37rXXvfuvde9+691737r3Xv futde9+631737r3Xve+tddD37rQPXr+/dbqOu/eut9e9+691737r3Xvfuvde9+691737r3Xfv3W6 Y669+611737r3XYHv3VgM9cypsPx7r06UIA64m4976oajiOuPvfTfXvfuvddj37rYPXYPvR6uD59 ZoZDFKjgAlWDAfX6H3VhqBX16UW8hilSRQKg16EWkyJqKVXMqo5ZY2Vrj0gepuOAPZJLCI5CNOOP Usbfu5u7KOVpgshYKa+nmemPJxVOQqC4N0jXxxIpJAVT/j9bnn2st3jgSnmcnoMbzDebteNIpqiD SoGcD/Pk9Jl4WWbxt/qtJ/2/P+29rw1V1Dh0EHgZZvDf1oeneDGpKf2pEOk8FyFJ/wAQCeTf2mec r8S9HlttCXDUgmXHqQP8Pn1mqoZksCCSvpOn6WAH+8391jdTWh6fvYLiPSuklhjHTZUI1tLgq349 voRxHDomuVcdkoo3TcykH29XosdCPs66vb6fX37r2rSMceuF7+906bLE1qevE+/dVJ64+99U6979 1uvXK/vXV69cg1veqdXD065A8e9dOAgjrr37rRz11731U9cD7sOmm64+99U69b37rVB163v3XqDr v37rdOu7e9dWA67966t13791Yddge9dWArnrKq+9fM9PqvUhU/P5/wAPdS3l06F6zKv+HuhPT6IS KEdZkX6e6HpTGgx69c9PP++59+6c0UPWN7aST9Bz/r+9rxoOmZAChJGB1E8gJGnj+t/boXjXpFqF Rp65lwFv/vH/ABr3qmerFsdQpNJNwLf4e3B0jl0k16wn3YdJm669+611737rXXve+vde9+691737 r3XY96PVlHn1yHvXVx/Lrl7104PXy67+vvXWwK9eAPv3XgCesqqAL/m/++P9ffun0UKK9eJB/wAP e+tkg9dH349aIAp1xI496pTqhGOHXEC/v3VAtfLqRDHqb6Xt7qx0j59KYo9RoB05xJxdv95Htkno 2giotW687Bbge/dakZUqq9RSLm/u4NB0hKlmr5ddhPetXWxH1lSEn8ce9FulEVqWNQMdcMRSmXJT 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 So6LU5oOvEA35H+39168wBrQ9YSefdqdJi2add+/dW8uuvfuq9e9+6911b3vqtOvW9+68B1737rY 697916nXfv3Xh1737r2Ouvfuvfn16/v3Xq9dE+/dVJ69f37r1euV/furA9e96631737r3XvfuvV6 7B9+62DT7OnehqYYyC506Ra39f8AivtNKjMKDo8266giOp2pQdZ5a+KZv0qABpBI5A+t/wDX91WF kHHpTNuUM7/AKUp02yyjV6TcfW//ABH+29vqMZ6KZpVDEjgeojMWJJ/PtynSFmLEk9dAE+/deCk9 TYKa5GsXvYAf6/059tO9OHHpfb2upl1jj0oYIYYoZYnGlwCw1EWN1PA559o3dmZWXh0Kba3ghgmh kw4FckUOOmGoNuLAC/H9Rb2sj9a9Bq4oCQAAteorFbWB5/N/+I93/wAHSR2TTQHPWNZGQ6kYqfwV JB/2497oDxHTAleM6kchvUdZEq6lG1JPKrf1DsD/ALH+vvRjQihQU6dS/u421pcuG9QT1JbJ1Eqe KUq6Hg3A1E3/AFX+ob/H22IEVtS8elj7vdTx+DMwKfzr6/b1EYC5IPHtzpGwFag9clsP9j78OrrQ cOuj9ffutEGuOuDc+/Dpt8nrjb3bpqmOure/dep13b37r1D14D36vWwvXMxSAAlSFb6H8H3qoP29 XMMoAJXtPXHTzb36vVdBrTrKIXP4P4/2PvWoevTwgc+Wesq0zXsw+gufdS46eS2atGXI66nQLa39 PflNetTpp6i+3OkR64+99Vp13711unXdvfurAdd296r1vT12FPHv1erBCaU6yBT/AE966eVCPLHX Ige9/l1eg66Av70PXy6qBXqUiWH+PujN0+qVHUlV49tnJ6WRp28Osqr9SPr+L+9dKETBI49eCkD/ AHnj/efevz68EIB6jSMTwOebX93UDz6RSyEmi9RJJWU8H6fU/wCPtwKOkckrLw6iM5Y3P1/1re3A OkLuzGpHXQJ9+p14MfXrx59+62c9cfe+myOve/de65e9dWp1737rdOve/dbp13791vrmq3HvXTqJ qFepAjQXuefx/vvz7rU+Q6fCIBwz1jIt72R1oinXuALk/wCw/r79TPWjRRUnrGzX+nA97p0w8lfh 4ddX9+69U0FevBiD7915XIPWUG/9f+J9+HT4NaenXPSSf6ce9VHVyteucYN/6f4296Y9bVc06zLH 67m5/A/oPbZbFB0+sRLitep6oFUf1/PtquejVIgij+Lrq1r/AOx/3n+n+t7t1WlKnz65qt7H3Unp xErQnqTHH/a/21/97H+t7aZvLpUkYFSOk9WZWSeOSnEaohaxZWLFlRvoDYCzEf7Ee1sVsqMsmok0 6Cm4b3LcRS2ixBULUJBqSAf8v+DqBTVU1JJ5YHKNazD6o635V1/I9vyRrINLio6LLO+uLGQzWshV 6UI8iPQj06XNHXCSnWWQaCUDafryw+g/J/w9k8sOlyoz1JW37n4lok8o01WtPmev/9TQII9tV6XF a9cfp731Th1kHI918+lANV+fT/gsQcnUqJg4plazaB65nVdZhjtybLyxA9I/xI97A8+kl1cmFdC/ 2h/kP9XDqfuTE6qior6KkpqWntGTS0WvwJGqBPLTrNJJMVGgGW5Ol2v9Dxquk54f6v8AUOm7eUSK I3P6g8z59JKOBTYvqCseCp59JFyODxzb/En26tTnqlwRH2LlvP8A1fz6EPrfK4bA7roM7mqiSkgx kFZJi5I4pJUizEkLUeKnkaPU8EWPnqTUtJZiGhAAJNvdicMPOnRbcpJLC8cYqxIr9lan9vCnVk2Q xWMn2/t/Jbemjakqcfj4oaCoqDNT5HGpHPUyV8NXOtqxp/KpC6eXPNre2XjVkSVO2T0Pl/n6Depl d1l45/I/5Oi7du9I4/PR1OQ2NjFh3JQ0orJ6OggENFuGjSIyVbpEumGHMQOthHGo8v8Agbe7VCPR alT0vsr9oSEuHrDX1yp/zf4Oip4bMmlWXbO4YZFxhnmppYZ43SpxNZfxSzeJgrpLC/pOrlLG1jf3 51r3rx6EAPwkEEf4elhTVP8ADpXwOahfO7VzkqSNJAYY5MnHTRfb0+Xws1QggoN2Y+FWEcpASvjB ik1Ag+/a9alThh/I+v8AnHp0mliaMi4hajD9nrQ+qH/jJyOgnz2NgxWUqKOkr4cpRqIZaSvgSSJa inqIY6iLywTAS0tZCsvjqIWuYZ1dLnTc2FaZ49LVk8VQ5QqfT5/b5j0PmM9Nq/Qf63up4npYldK9 dlj71Tqxc9d39+62CSePXMX91PTq1/Lru/8AsPeurVHn1737r32de9+691737r3Xvfuvde9+6917 37r3XvfuvddW976rTrr37qvXve+vdde/de67966316/v3XgevX9+69U9e9+6116/v3Xq/PrsH37q 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 /wDbfWtLlKbO722zBHHWUmdyEGWxFDGHgNLrZ6aoUCw+4jpoy0pQMrMb3v73Ugn06MbG7MZjgmPY VFCfL/Y6KnLqEhRw4ZQE0yKVeMgD0lW5Gk+7H1HR6vw/Loa8VIuFiO2d1QDLbZzYppTHQeOSUSpD oXL7aqnCrBubFxMAU4hyUI8Unq0EshhJ8mH7R/nB8x+fHpHNG8bCeA6XH7PsP9E/8ZORjoPN2bWq drZFYPuYcpiK+L73AZ+jWQY/OYt2IhrKYyAPFMh/bqIH/dpp1aNwGX3tWrUEUYcR/q8vQ+fRja3C 3CFlFGBoynip9D/kPAjI6TFve69Kwvr1xZL+9g06o8errHax93r0nK0NPLrmvup6dQdZx9Le2z0r XhTrv37q2eve/dbp1737r3XvfutfZ1179149e9+611737r3XvfutHPXG3vfVaHru3v3W6det7916 nXXv3Wqde976110ffutEV66t791qnXL37q3Xvfuvde96691737rfXre/dbp8+u/fut/Idde/dU69 7317rjb36vVSvXtPvdetBOsg4HunT4FAOu/fut065KPdT06gGK9ZgPyPfsdPgYqOPXEnn6+/HqhJ rx64N78OqPx664/1/futY6yp/j78PPp5KcTw6kkgC/1H5/w/1/dKZp07wFadY/ITx9PdtI49a116 99QLC5HN/wDefe+HHh1vrtSwuCfp/X8f8T70QPTrwJGOsbyEE88H/WJ97oMY6bd9J49cUuxuPx9f +J9+4daTuNeuRAv/ALH3viOrECvXH36g6qevW9+p16nXelfybf7zf3rrZVfM9cSF+t/fuqFUyeuB I/r79npslRkHrGz8f4e7BemXlxSuOsXk4/3r3fT0n8fBHXC5H592p01qINa9Z4/6+226Vw8K16lw zaf8T+P6+22WvHpfDPpyOPTtTPrFz9AeP99/r+07imOjuykLjuPA9OYNxe3HP+2/1vabz+fRqMjh jqJURK4N7f0A/wBbjn28jEdI7mBZFNemqpgAjFrXH0t/vPtQjEt0S3VsFjHr1EhjFyzXsvtxifLj 0ihjANWrjqYAJACQoW/0+t/bR7eHHpaAJKaqBeupDEgACgj88C/H5v72AzefXpDEoooqOoUhUt6R b/evbg6Qy6S3aOsZsPex00aDh11f3unVanrkDYe9dXVtIPXV7+/daJqTXrv37rw675/3n3rq4rn1 65A+9efVweun+nvfn1WT4esPu/SY+nXd/euvV4dcgbe9dOA067BPvXVwTXHWdbni3P8Avv6+/eVT 0+pPDqbGp/3309sselkKE+XUxFta/H+Huh6MokApqNOuUsqICSQLAW5/w/P+PvSqSR1eeeOJTqby 6YJpi7sRe1+P9b+v+x9qlWgHQYuLgvIxHDrirHix97PWkZjTPTrTRVTOv28aByoLTzAlE/Fgo/U/ +9e08jRgHWxp6Dz6OLSK9aQC1iXWRl2rRfsHmf5Dz6cHxyv6qqaWrk/Go2hQn66IV9Kj/b+2BcEY jQKv8/29Gcm0rJR764eeX5mij7EGB0nEtFHVgf2ZNK/7AsB/vPteas0X2dBOMrDDfAeT0H8wOpmP gPjSw9TnUf8AEH6f7x7amfuPoOl+1WzGGOg7mz0sKKLQoYg8W1f7bjj+nsslbUT1IO2QFFDkYHHr /9fQYqWlCRxSOzBL6Afoo/w/1/aRAtSwGT0JLp5wkUMrkheHy+zqJ7v0iFDx67R9DhtCORdgri6c fQspIDKD+Pofd0Fa56SXUmhQo4n/AFfz6l0cUckjyyMEggUySKtg8rfRIYkBHMjHm3Cr/sPdlqSW 8uk1w4igSAAeK3H5fPrkNUiqXFwjBLrfSLjUbWP4H1/PuxoDg9Jgajh044+hkyVdQY2INJLk6mmo olju7tJkKtKdRGgXUZPG/wBB/T3sYGeHTMjhWZycKK/sFerF+y9l4TeO29tR42kfa28qbLbcw20s rR6oatGhH2upqqmCO1NFRU7v+q8RW592BDpGVFG/w9Bq2uHglkYnVEQSynNfP/D0FvX/AGvnNtbr o9r9lNS0uVx8dTjMLup5lSkrpKh2WefLZOR5YqmrazKspt65LPY2PugIJrSpHl/lHSue1SWI3FmD pOSvmPsHp0O+262PcmXz1YYpErqPB4Xbdbj69IycrLmc5lMrUywVMCkVE0mPoozwWBS1wePdCWr8 s/6v59IWXTGo8i1fsovp+fQRb1wtf1HlKjdmy8TLlNnV2RFVurZMqyeDH18UUrJlsYFBFEXicBxp Or9J/Gn3D7QcH/V5dK4mS7RYLiSkoFFf/n0+vyPS/wBp7p2Xu/bFFktutVPS4nFmjzNHW/8AFyxO SqpJYWpc+ir/AJXDIjSPDNGSDGlvqpAfWhQAjIHH/V9vSa4hlt5ikn4uB8iPl/KvRN+/dn0+H3rj f4TDPJLuTERZpYxG4+7aryWQpqeSmTksksVMqqBzdbHn3RxoYDyIr0e7XMWtH8Q0VGp9mAf8vQeb dzlKkUuBzgaTF1RWGOodnFTiHjcPaEkFolaa2q1rsF/At7akjJpIhow/n0YVP5f6v5dLyKSLHpW7 Q3a02S23lal8lTVlKonq6Sukj0/3k20pKK+RhVwtdSXWLJQRkgiZEYU/tQCDpkX5eXofkf5HpMyv A6zwUBAp8iP4W/o+h4qfkT0jt99Z7l2BJQT5KOnyOBzVLDX7e3XhZTX7cz1DURiSKahyCoqrOqm0 tPKI54XBV0FvewagVFDn+XRpbXcNzUKaSjip4j7f84x0H3vfSrroj3uvVSteuI4976oBTrkD70R0 4rdZByPdengajr3v3W6dd+9dbp+zru3v3W6ddEe/daIPXXvfWqdde/dap1737rXXvfuvddD3vrQF Ou/eut9e9+6911b3vqpB669+61Q9e97611737r3Xvfuvde9+69117916vXfv3Xuve/de66v791qo HXWr3unVddTgdd+9dX65D3rqwp13711ateu/furA465D3o9XXrKp496HT6mgweumH5/Pv3VWFc0z 1xI49+6qQaDrq3v3VQtTw6yqL2Hv1cdPqAadTVQBbMRb8/8AFPbRYk46WIihSWbHWCS34AH+H9f8 T7utfPpO+cqOo+sj6cf7x7tx6Y1kdcS55N/fuqmQ5PXAm/vdOmy1Tk9clkKfT8/X62/4379SvVll 8Ph1z8gb68X9+pTpwSq3XnawH0v9R/re/dekbSo9esJc/wBfe6dJ2kavHr2s+/aeveKSAD1x1e90 6prp10W9+p1UyDy6wM3PtwDpG7knrh7t0112OfeurAV6kL9Lf19tnj0tjrpp69SooixH+++vttm8 +l0MVSPXp/pIgi/ggj6f8T/t/aSVift6EtlCI0r69Z5pNAtfi3P9T/T22i1z0pmlCCpOOovmUm34 /r/X/int3T0j+qVm0gY66kdGuGA4HB/F7W59+AI4HrU0kUlQy/Z1AkKgWFhe/P19vLU56K5SooFA 6js9hZeAD/Xkn+vHu9PM8ek7NTA6wtIT7tTpl5a8OsRb/ff4+906YLn8uuJPvfTZJPXrn36nXtR6 71H36nW9ZwOu7+9dXB65D3rqwPXd/furV67v711utOuza3Pvw6s1CuesHu/SQ8eux78etr69ch71 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 FvIT6dDFAVXQCeP9f/D2m8qHj071hMIBcAchtBU3AUKASxYg2/1vrx7r16vWK91KhSQL2seCb82H P9Lce/eXW+o7ccgEgWFv9v8A0HuvXupFPGCdbcAWNv6n/X/oPe+vdZvKoJ9Rvc3Nx/X/AF/euvde 8w/1R/24/wCK+/de64tKpB9Rv/rj/ivv3XuveUFbaje39f6f7H37r3UKZrkc/jnn37r3WH37r3Xv fuvde9+691737r3Xr+916913f3uvXuvX/wBf36o61Tr1/wDX9+qOvdeuf6n/AG/v1R6dep165/qf fqjr1OvX9+r1vrr3qvXuve/V691736vz691736vXuve/E9e697117r3v3Xuve/de697917r3v1ev dd397r17r1z/AFPv1evdev79Xr3XXvdevde96r17r3v1evdd397r1qnXXvRNet9e966913f3uvXu ve91HXuve/VHXuvXP9T71Ude6697r17r3vRPXuve9de697917r3v3Xup0LBYwL8nn6gfX/Y+9160 es/mUfk/7cf8V966317zD/VH/bj/AIr7917r3mH+qP8Atx/xX37r3XvMP9Uf9uP+K+/de695h/qj /tx/xX37r3XvMP8AVH/bj/ivv3XuveYf6o/7cf8AFffuvde8y/1P+3H/ABX37r3UaXSw4J/244/r fnke/de6iG9z/W/+8+/de6yg6h9SD+bc2/p/sL+99e67Ym1vqPp9bcm/45459+9OvdSFiWWAurr5 Y9B8ZJ1MtyCF4sSgAvz9D791queuaAm6tYOlwpB1EsBqIVl4YqB+D72K8D17rNUQx3QwM0kjhvLw EjLi7BoyWBCSRWJDWOoG1xb3anpx69XruLXEQ0erWReJkchlZeSylbFWHBBvx+ffgaZHWuPRmuoc bS1dNh62qkxmMx0Wco6Wt3PNVVVBBSjJ1kMdVic8646vg8FLRYuWdHSOTxrUo7Wtp9r7Wr0AGQcn FM8Aa4HmePlw6TTaa97Y/hoScea0yfIcOjx7pxO6do42c1WJowu7aOnkSnxmdoMjuPL7XyGTrsvi chnsfh62vxkJn/g/rV4aaaZadSqN5Q0pvJqiOtlIQrTgO4Go7VoSaUoSMDJrXopVldtEcymjVahP YwFRqbA86gVrXBA6Dzd+3koc5JuOhr8lJLWUdLBLJRvjpcvXLlzk3nq/LisXiMTRU+Xoi4lgjtUR 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 /PzJHHpm1UwW7Qx1/SYEAmoFakjicHyAIAB4Doie9sw2Z3LkK5Y5JMDt6nqNtYU5pxPJDDj2lFIi vjVhhqKlpWZoUK+BFYA3UD2WMS7NKTVeArjhw/Onl0t4BVBxWtOPGvrmlfPpj2+JqmvllyM8a+Sn RqWmrtVNHXh56eE00U33FKIitPK8y2cmQR6Rw1xuMOz0pUn8v+LpjqruECmnbXj6f8Xw65VlDUYP NUT2oys1ElRULVU7PDTvUtLTrNPSBopJHpWUNGtz61B5F/dWVlYgniBn8v8AD14U04wQT/I/4OmX PbihymSxyUVOKKngWjjl0tK7Tzowilq5FkZ181VpErgKAHNwOSTUyK0qsooMY/1ft62qlUIZqnOa Z/1f7Felv2HkhPWPLHXQzyvRRQNNFDLQCGiILSU1JEa+pIjke3kDs5lAVrg8e3Lpi0jMTVjx/wCK +XVYh2JUEfbTj+XSEw20N3b2VqrF0LVNHRD7c1srJT0UTf5z7dJXADzWOplUEgG5tf2gklCkauPy 6WQwPKSF4fPpSP11V0NOBlKoQzp5NUFKPODrA/VO+ldY+lwvuplJpQUHz6d+jKV1Gv2dJCswFLSs wR5mZWJGtgOP62Cgfn3oO1eqmJB5dJyejRGOnULXvcnj+n1+nHuwJ6aKiuB1FaQooVQOAfpf63Nj /sfduqU9Oohdrm4F7/4/8V9+6111rP8Ah/vP/Fffuvde1n/D/ef+K+/de69rP+H+8/8AFffuvdcS b8n37r3XXv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/ de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917 rmHI44/33+x9+6917Wf8P95/4r7917r2s/4f7z/xX37r3XtZ/wAP95/4r7917r2s/wCH+8/8V9+6 917Wf8P95/4r7917r2s/4f7z/wAV9+6917Wf8P8Aef8Aivv3Xuvaz/h/vP8AxX37r3XtZ/w/3n/i vv3XuuJN/wAAf6359+6914Eg+/de6kBdQvcHi44v+QALfk8+99e6zUw0SarXDXBH0B4/Ut/yv1t7 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 +qdRG/Uf9f8A3vn37rXXXv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X uve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69 7917r3v3Xuve/de67H1H+v7917rIVBN/x+Rz/t/fv8HXuvIxja39lrXH1uD+R/j7917qb9AW03uo sOCRYi7Dg2Yj6Ee7de+zpwxdf4J0SQSyxMDGIRIECs9xrVXBiJF+Qwsbn6fX3ZW4Dy9OqMOJ8+nK npScjAl6eGPKvItEAUjp2qJnFNDSswmMdEI5nDBpHUIoBY2+tqEEYx/q4deBoOP+r1PUeqpKikq2 imV4STLoRWLBxDK8Rt6hrVnVrH6Eci/v2VND1viOug6+ScWNOsaLpBaRdOp42sgudXlALgMbX/P0 9+yK04U699vHo/PV25aGbZdXLUbhO3E2ptreMGAyGZwc2ci3Rl4YaLLYrAZZMbTZiPGT5qti+0x9 VUKaaOokRS0d5ZgeW7hY1FVoNQq3nivz4HgPOvqeie5VmeoRtZKkBfw5pU1pX58eHoOu9j0mXwrY uau2jNUHNRyQRyZCsmpky+QG5KOqxcGEpYKWnaDMUUbCl8TTTS1LSFlZGksK25C5dGzWvADyp+fr XjXHTlwtQoDLilPMnBBr6A/Knz6GiomraSopa+D+MjZwptzbfwU2apahsg+Ky+IqXO2KtaJvu2zW 0nq2irEkqJPJDE02gqpRl3eqrpUJFq8xXjU5pxPGvEjOcHovYIA2lQXIGBwNCMiuAvpwHD1HRRNi vU4bvfZm2t5I8CZXetbgd21Bo6ePIS0XYGjaWXgqswxNbkaCfCVmpopSEp3mm8YuzEkNyWZpFkWj mtajPpT/AGKCnR5bRqBGIj2UAGar5k/nU0rU16L7lcXWYDKV+HylIBkMPXVmMyVFVM06w19JM1FW RSNEUgZ4JAdLAqLKBcj2T06MoJRDKsphSQCva1SpqCM0IOK1GeIHTeJ5KdHggmdC8fjnEUo/fjlY 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 kRdyKgAmvHPDB/0pHzHU3HfGjuOgxeTz1X1PuugFZApxFbXY2aCujphDKJD9lJLTsn3hdbmVVIVA ALMblZ3Hb0L0uRqrg0PD8hT59Hi7FupUN9LinAla/LFaj8+i77s653vjKuY1e1c/GokYNLJi6gEl bku5iRxrcct/Q+2vrbNj23C/4OmW2vcYvjtH/ZX/AAdctib0rti1c+PycFaMVXupqaZ45IpaOdfS KuCOXQLsptIvGoAH6ge3TomVaMCRwIP8vs6YXxbZyWQgHiCP559OhDy+4sZlUaWhrEniZb3WQXH+ Dpw6sL8i3tsqwwelPiq4JVh0GGRqFZn9d7/Q2BPP+HNrf4+7DpO/SQqmuzDn6n+n4A/2P193HTJ8 +mZzc/j6n3bqh8uop+pt/X37rXXXv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de67X6j/AB4+l/fuvdSlW5/4j3rq3Dy680VuCPT9P9iPx/h78D5Hj14r TI4dZ6WZYpkjqYzKn4Uvo9TE6TrFyACb/mx/w92Hz6rny6lGEo/IsCTqXSrAsnBN/VyGY/Tg+7fl 1r06X2GpMbX4PNY+WjNVKHo5qOt8j0tXjFBmWSp+1vLBVQCTQCpZWCn62Js+mgh1Iq1MeX5/YOm2 L1RhgVz549B8z1LosHmd7xwTY+nnrMxiooosrJJNBDDRQ08stPE9TU1k6ssUmqEI9tK/RrAA+9MQ xjr8fD/Jx4D5V68AUVv4Bn5/s4n8unqj60zOSoINx4wU9dj2wM2YyyM1HR1tC9JkqTG10aUclXLP V+CesikX0q0sXkbRpjciwikcVVSfXjTH+bFaevWjJGrFHYA1FK+deH+X8h0bGn23XbT2JsHbUtRt OuqN1w5alp8zk8y8mLwUMeQQYqSpkw1OlRR07wLUqSySkGdZGb0FFMkRorYVSpZscB6EUPnk+vy8 ui+WVZLghXoIwCTQkjjUfbSlABX8z0/9h1WZfEx7hrqbF5bFGB5dtVO2MiMDSChxtLSUjyUG3YYS 0VHl65BVCoSRZmqBcx6iATKSRzaltKmNCPh8qLk5rxNO6pyKDpCioZwhcmRlqdY41JoMUA0j8NPh 49OdZPkMtkti/wATzRgjov4Nl8a+Uiq4aPI1eVwtfIY9wVmWjqayTIzrTw0kksSTUlZTRR6dRVWK X9R0BD41A14iprxOADTH+Ek9PMkaGSiEyEUpTIAANQoqSK5rn5UHRTuwquqpN+1O4vsRSmDL0uUx haqjnhFPVVn8WxdNRPSolD4qKlZPGIRHB4VAULcKEF2g8XNfUV9Dw/1efS2xb9NU1AuMH5kDJ9eP SZ+QDVmP7r7OhitJTZLemc3Ni/FTCMvht2VL7pw1QIBeNfvMNmoHZQSVU2uBx7J2QBmzivRrR3IR VJIrTz+Z/wAp6BcVVTI3jEgiuberSACzFiTpCsLv+lraubf0960gdVAJIFQPt6U4oazG06TZOoyV CuUxss2AFJJGYnkqlRJFr0V53p6UxvZw31jNibqR7R+Mk7FLfSwjkpJWuKZxjJrT8+hfDtku028T 7vPPC93Zs9r4TrRjKApEuarG6kaxTuWoyQR0vZc3k3lx9DXyV2HkGE1TTZ6anpYpp8dQ+qBKqAyN OKuaAhbqjqzBSpbn2QCwiIlmt9MkRm4RipAduNDgaQanjUVp6dD+bf8Acrf93bdubTWkv0RJa4ZV R2ij+AOuokyMumhCsjEKVJz0lsxWZzHxwwTioo6zJ46Oulp0jnR6ajnEn6RITJFNKsRLXN1S97E2 BhZQWcsjzROrxRyaQag1YU8/kcD59BXe9036xt7e3kSWG+urfxGUKylIySKitSCwU1Ne1eNCSFUu yKikjxDrHSmGq/ika1U5mcioSzmnUUzRxJTNAAwYDVq1A6iSQEW8xytdR6paxFO0UyDXJJ864p9h +3oRe3NxaxbRdKluVufqkDuWJDrRioC8F0dwb11DPkGPDYPL5etzmcSukoY6JchVGv8AMUqJKpY5 auGnR0McgQRafIzsURL8G49mF5c2tqlnZvCrmRlULQUArQk8eHl5k/n0GNn2jeN63HmDfoL2a3S3 E0plDEOXCtIiA1HEAajXSq/aoOWg3HX5CWmx2ZqMLWQztFAJM1SAUUCiQh6mevpyK4SeOxvHIjI5 tYcXrPtsEEctxarKrqCaRtk/IK1Vz8xTrW3847pucsO2bzLaT20jBdV1GvhoCe52dAsgoODKwI+3 PSszmao9Zo6WRp4aeKFEZGlmHiWOMRt5JnklfWtuXYsfySfZBb20oGp1o5JrwGamvCg/YKemOpJ3 XebMolrasXt0jTTlmxpFMsWY4pQsSx8yTXprwW5aCiyEL+VQyyLdXU2IuQUbgrZgCCD7VXG23Elt I2j9OnEEVH+Xot2TmSxs9whVpSJK1yDT9tKftPX/2Q== --QqnZc1pCYELM54DpCuHVWrV3W=_ZEP1Yr4 Content-Type: image/jpeg; name="22.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="22.jpg" Content-ID: Content-Description: Photo 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 4Fu2IkjU9gpOAa0Q3aRoeCk6C0CR4ntqFDnnlBcezNlkHXhTLpl3YNJEeP0f4oIjuJKTp/uSWsEk kkVKSSSSUpJJJJSkkkklKSSSSUpJJJJS4U/TDjzB81FnKIHvBLgedNEkgM6cdx1PtZzPc/BELwJc AAGwAI8Z4QqnakzAGp10RQ4amRu7/Aj/AMk5MN2z4+HhFad7f//Z/+0gvFBob3Rvc2hvcCAzLjAA OEJJTQQEAAAAAAAXHAFaAAMbJUccAVoAAxslRxwCAAACAAAAOEJJTQQlAAAAAAAQx10X5XS1bvXb vjmUwOl5XDhCSU0EOgAAAAAA1wAAABAAAAABAAAAAAALcHJpbnRPdXRwdXQAAAAFAAAAAFBzdFNi b29sAQAAAABJbnRlZW51bQAAAABJbnRlAAAAAEltZyAAAAAPcHJpbnRTaXh0ZWVuQml0Ym9vbAAA AAALcHJpbnRlck5hbWVURVhUAAAAAQAAAAAAD3ByaW50UHJvb2ZTZXR1cE9iamMAAAAFaCFoN4u+ f24AAAAAAApwcm9vZlNldHVwAAAAAQAAAABCbHRuZW51bQAAAAxidWlsdGluUHJvb2YAAAAJcHJv b2ZDTVlLADhCSU0EOwAAAAACLQAAABAAAAABAAAAAAAScHJpbnRPdXRwdXRPcHRpb25zAAAAFwAA AABDcHRuYm9vbAAAAAAAQ2xicmJvb2wAAAAAAFJnc01ib29sAAAAAABDcm5DYm9vbAAAAAAAQ250 Q2Jvb2wAAAAAAExibHNib29sAAAAAABOZ3R2Ym9vbAAAAAAARW1sRGJvb2wAAAAAAEludHJib29s AAAAAABCY2tnT2JqYwAAAAEAAAAAAABSR0JDAAAAAwAAAABSZCAgZG91YkBv4AAAAAAAAAAAAEdy biBkb3ViQG/gAAAAAAAAAAAAQmwgIGRvdWJAb+AAAAAAAAAAAABCcmRUVW50RiNSbHQAAAAAAAAA AAAAAABCbGQgVW50RiNSbHQAAAAAAAAAAAAAAABSc2x0VW50RiNQeGxAUgAAAAAAAAAAAAp2ZWN0 b3JEYXRhYm9vbAEAAAAAUGdQc2VudW0AAAAAUGdQcwAAAABQZ1BDAAAAAExlZnRVbnRGI1JsdAAA AAAAAAAAAAAAAFRvcCBVbnRGI1JsdAAAAAAAAAAAAAAAAFNjbCBVbnRGI1ByY0BZAAAAAAAAAAAA EGNyb3BXaGVuUHJpbnRpbmdib29sAAAAAA5jcm9wUmVjdEJvdHRvbWxvbmcAAAAAAAAADGNyb3BS ZWN0TGVmdGxvbmcAAAAAAAAADWNyb3BSZWN0UmlnaHRsb25nAAAAAAAAAAtjcm9wUmVjdFRvcGxv bmcAAAAAADhCSU0D7QAAAAAAEABIAAAAAQACAEgAAAABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAA P4AAADhCSU0EDQAAAAAABAAAAHg4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAAB ADhCSU0nEAAAAAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2Zm AAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gA AAAAAHAAAP////////////////////////////8D6AAAAAD///////////////////////////// A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D 6AAAOEJJTQQAAAAAAAACAAA4QklNBAIAAAAAAAIAADhCSU0EMAAAAAAAAQEAOEJJTQQtAAAAAAAG AAEAAAB9OEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoA AAAAAzcAAAAGAAAAAAAAAAAAAAMgAAADIAAAAAEAMQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAA AAAAAAAAAAADIAAAAyAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAA AAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcA AAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAyAAAAAAUmdodGxvbmcAAAMgAAAABnNs aWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAA B2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2Vu ZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAA AQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxv bmcAAAMgAAAAAFJnaHRsb25nAAADIAAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAA AAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxi b29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6 QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdk ZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAA CXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRs b25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhC SU0EFAAAAAAABAAAAIA4QklNBAwAAAAAFNsAAAABAAAAoAAAAKAAAAHgAAEsAAAAFL8AGAAB/9j/ 7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgT ExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4U FA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAKAA oAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEB AQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEy BhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80Yn 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 HgCLMzMAu4UeAIszMwC7hR4AizMzAAEAvCj1AI+uFAC8KPUAj64UALwo9QCPrhQAAQC64UcAkuFH ALrhRwCS4UcAuuFHAJLhRwABALgAAACVwo8AuAAAAJXCjwC4AAAAlcKPAAEAsuFHAJnrhQCy4UcA meuFALLhRwCZ64UAAQCvrhQAnHrhAK+uFACceuEAr64UAJx64QABAKx64QCgAAAArHrhAKAAAACs euEAoAAAAAEApwo9AKXCjwCnCj0ApcKPAKcKPQClwo8AAQCjhR4AqAAAAKOFHgCoAAAAo4UeAKgA AAABAJVwowCgo9cAlXCjAKCj1wCVcKMAoKPXAAEAjhR6AHa4UQCOFHoAdrhRAI4UegB2uFEAAQCN HrgAa4UeAI+uFABrMzMAkj1wAGrhRzhCSU0EBgAAAAAABwAIAAAAAQEA/+FbGWh0dHA6Ly9ucy5h ZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpy ZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0 az0iQWRvYmUgWE1QIENvcmUgNS4zLWMwMTEgNjYuMTQ1NjYxLCAyMDEyLzAyLzA2LTE0OjU2OjI3 ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIv MjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4 bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5v cmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFw LzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUv UmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv c1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20v cGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2lu ZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDE1LTExLTE3VDIyOjMyOjIyKzA4OjAwIiB4bXA6TWV0 YWRhdGFEYXRlPSIyMDE1LTExLTIzVDAwOjA0OjQzKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAx NS0xMS0yM1QwMDowNDo0MyswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiB4bXBNTTpJbnN0 YW5jZUlEPSJ4bXAuaWlkOkNENUQ1Q0IwMzA5MUU1MTE4MjVBOTg4RUFERUM1MDQ2IiB4bXBNTTpE b2N1bWVudElEPSJ4bXAuZGlkOkFDRTRERTAzMzg4REU1MTE5MjlDOTFEQkZEQjg2MTlEIiB4bXBN TTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6QUNFNERFMDMzODhERTUxMTkyOUM5MURCRkRC ODYxOUQiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdC IElFQzYxOTY2LTIuMSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDph Y3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QUNFNERFMDMzODhERTUx MTkyOUM5MURCRkRCODYxOUQiIHN0RXZ0OndoZW49IjIwMTUtMTEtMTdUMjI6MzI6MjIrMDg6MDAi IHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIi8+IDxy ZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpBREU0 REUwMzM4OERFNTExOTI5QzkxREJGREI4NjE5RCIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0xN1QyMjo0 MjozMSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2lu ZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBz dEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkNDNUQ1Q0IwMzA5MUU1MTE4MjVBOTg4RUFERUM1MDQ2 IiBzdEV2dDp3aGVuPSIyMDE1LTExLTIzVDAwOjA0OjQzKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFn ZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8 cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFw cGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0 RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBw bGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RF dnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpDRDVENUNCMDMwOTFF NTExODI1QTk4OEVBREVDNTA0NiIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0yM1QwMDowNDo0MyswODow MCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0 RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJp dmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkNDNUQ1Q0IwMzA5MUU1MTE4MjVBOTg4 RUFERUM1MDQ2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkFDRTRERTAzMzg4REU1MTE5MjlD OTFEQkZEQjg2MTlEIiBzdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6QUNFNERFMDMz ODhERTUxMTkyOUM5MURCRkRCODYxOUQiLz4gPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4g PHJkZjpCYWc+IDxyZGY6bGk+MTEwMzVGRDM0MzE0NjdCQjhEQkVDQzNCOTJBMjAxNDA8L3JkZjps aT4gPHJkZjpsaT41ODI3REYxNjhBNUZFNzIzMEM4QUVDN0I4QUQyQkFBMjwvcmRmOmxpPiA8cmRm OmxpPjdGQjI3MDZENUQyMzE4RDY0QzU4MUNGN0Q2RDE3Rjk4PC9yZGY6bGk+IDxyZGY6bGk+OTEx QkU3NDIyNzAwOTFGMUUyNkNGMjY3RjAwNUQ5MEY8L3JkZjpsaT4gPHJkZjpsaT45NUNCMkI2NjQ5 M0NDMzI4OTdDRjQ0NEQxQzRCQzgwRTwvcmRmOmxpPiA8cmRmOmxpPkFFMDlCNkFGRDMwNjMwQjAw OTY4OEMxRUNFQjQ3ODNGPC9yZGY6bGk+IDxyZGY6bGk+QUVBRDg3ODUxOTYwODFGQzJGRjMwQTdB RkUxRUQzOTM8L3JkZjpsaT4gPHJkZjpsaT5CNTlBOTdEMDYxOEIyMkY2MkM4RTVFQUQwRTIxQjhG NzwvcmRmOmxpPiA8cmRmOmxpPkJDQUU0RkIyRTk1QkUzNTM3NkZCOEJFOUIwOUVFNDAzPC9yZGY6 bGk+IDxyZGY6bGk+REM3MDc0NUY3NEI4RTYxMDI5MjRCQTUzNzUwMDM2ODE8L3JkZjpsaT4gPHJk ZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6MDU3YmUzYjktYWEwYS0xMWRlLTkxOTAtY2VkNDkz N2RjM2I5PC9yZGY6bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjBmNDgwYTkzLThh OTItMTFkOS1iZTg4LWFkZjU1MGVjY2Y0ODwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBo b3Rvc2hvcDowZjU1MzZhZS0yOTM4LTExZGUtYTU5OS1hYjlhYjMzYTlkZDQ8L3JkZjpsaT4gPHJk ZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6MTU5MjkxYWYtZTI4Ni0xMWQ4LTlkZWYtYzlkYWNm MTViNDdmPC9yZGY6bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjI5NjdiZDc0LTY5 MzQtMTFkZi04MTRkLThlYzczYzg5MDhjZDwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBo b3Rvc2hvcDo1MGU2NDM4OC1mMmE4LTExZDgtYmEzNy1iNTA1NzIzYjI3YTU8L3JkZjpsaT4gPHJk ZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6NjEyYWEwMDItMTQyMS0xMWQ5LTgwNzAtY2NmYTcx YjNkMjc1PC9yZGY6bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjZkNmZjYWNkLTg5 MWUtMTFkYS1iNTE2LTg1NjYwYWMxMWYyOTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBo b3Rvc2hvcDo4N2JiNDk2Yi03ZDhlLTExZGMtYmZlOS1iMDU3YjcyMTdiMjk8L3JkZjpsaT4gPHJk ZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6OGRmMjQxZDEtNTIxMC0xMWRkLTk0ZGQtZmExM2Ez NDZkNDZiPC9yZGY6bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmIxNzMxZDI1LTEy YWEtMTFkOC05MGU0LWI3YzFmMjdkOTFkNjwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBo b3Rvc2hvcDpiYTI2MGQ2Yy1hYjliLTExZGEtYmQ1My1iZDNlYjA0YTJjNGQ8L3JkZjpsaT4gPHJk ZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRmOWI3MWEtOGM2MS0xMWRhLThhNzQtZWVhOWRh OWRjOWEwPC9yZGY6bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmM2NWRlNDBlLWJl ZWItMTFkYy05NWQyLTgxNTYzZDA1OTNlMzwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBo b3Rvc2hvcDpjZTZkYzAzYi1lOTdiLTExZGQtODQyZS1mOTk1ZWE1MmQ2NWU8L3JkZjpsaT4gPHJk ZjpsaT5hZG9iZTpkb2NpZDpwaG90b3Nob3A6ZjUzNjFjZjctZDUxNy0xMWUxLThhOGQtZTU0MWU0 YjFhNjc1PC9yZGY6bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmZjNjc2ZjZjLWJi OWItMTFkYi04NDFjLTllZmU0OThhM2U3NDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MDJCRUM4QjUx RDdDREMxMTk3NTY5MTNBREYzNzE3MUM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjEyNUVBQzQ4OUZG NERFMTE4RDc4QTIzRjk4NkU3NDlGPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxMkM0ODhDQjEzRTJE RTExOEIxNUMxOTA5MzBBRDZCNzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MTg5MTQ3OUUyM0JGREIx MTg4RDRCMTRBOTQ5RDRENkE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjFDNjgxODJBNDg3NURFMTFB OTkyRkQyREM2RTk4MzBEPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxQ0U4OEMxQkQxOURFMTExQTIx MERFRUZCODJENzY5NjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MUQ2QkExNzdDQzdFREUxMUJCN0JD OTVCRDc4NUY0Qzk8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjFFMzZBQjA0QTY2M0UwMTE5NURDOERG OUU0RUZGRjk1PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxRjVBRjNCNjcyMjlERjExOUZGQUIyNkUy NDBDNzFCQjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MUY4NjM1NUM3NUJFREUxMUE4MTRCNEZEMUQ1 Nzk1QjE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjIwOEM0NDUwN0UxM0RGMTE4ODJGRDM1NTA0MDg1 MzgzPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoyQzI3RkRBNkZDRURERTExOTIxNTk1OTQ0QkYwQTk4 NTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MkRCREQxQkZDRTFEREYxMTlBQkVDMTQ5MzMxRDMxNEQ8 L3JkZjpsaT4gPHJkZjpsaT51dWlkOjJEQkY3NDUwM0MwMURFMTE5RURCQTE0Nzc5MDQwRTFBPC9y ZGY6bGk+IDxyZGY6bGk+dXVpZDoyRTczRDhGQTFBRDlERjExOUEzRkNFNzBCQkE3MjY5RjwvcmRm OmxpPiA8cmRmOmxpPnV1aWQ6MzJBRDkwMUMxNTQwREYxMUJBMjJFQjgzOTBFNDI3RkE8L3JkZjps aT4gPHJkZjpsaT51dWlkOjMzMTM3ODE1RkQ4RkRFMTFCRjFBOUY4OUZDNzgwREU4PC9yZGY6bGk+ IDxyZGY6bGk+dXVpZDozODIyMjc0MTk2NTBERTExODI4RUI3OUI3RkY4N0I0NjwvcmRmOmxpPiA8 cmRmOmxpPnV1aWQ6M0E0Njc3ODE1RTI5REYxMUEwQjA4N0RGODk3RjVDNTY8L3JkZjpsaT4gPHJk ZjpsaT51dWlkOjNCN0Y1OEYxOUQ2Q0UxMTFBMzVCQ0Q4REVEMTk5Mjg2PC9yZGY6bGk+IDxyZGY6 bGk+dXVpZDozRTA5QTg2MkYzNTBERDExOTc2MEFDNjcyQTA2NUM4QTwvcmRmOmxpPiA8cmRmOmxp PnV1aWQ6M0U0MDM3N0ZEMzdEREUxMUJEMzJFRkM4ODQyNEZCQjU8L3JkZjpsaT4gPHJkZjpsaT51 dWlkOjNGQUFCMzFEQzdGM0RFMTFCRkIzQkI2MUFFMUExOThCPC9yZGY6bGk+IDxyZGY6bGk+dXVp ZDo0NTdEMDI5NTUwNTVERjExOEI1OUQ5NTlEOUZDRDUwQjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6 NDYyMjc0QkZGQTdDREMxMUJBQzNFMUYzNzUwMjVGN0I8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjQ4 OEU3RDIxNjQxN0RGMTFBQjMwOTZEQjU5QkU4Mjc4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo0QkQ2 NEUzRDU5MUFERjExOUE0NDgxNkU0MjZEMTRDQzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NEQ0NzUz MERCRkIxREUxMTgzOENCNzlCQjAyOUM1MzM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjUwNzczQjYy OUQ4MERFMTE5QzVBRjk2Q0NGMkIwRkUxPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo1MTc1OTg2NzE3 MDVERTExQUE3Q0Y3QTQ3QjMzRTMxNTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NTJBMEYzOUMyNUJG REIxMTg4RDRCMTRBOTQ5RDRENkE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjU2NUMzMEQ0M0EwOERG MTFBNjFEQjIyN0VEREY1OUY4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo2OTdFNjcwODdGNjJERTEx QTI5OEJEMDA3MjIyMEUwQjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Njk5NTUyRTg4NDYyREUxMUEy OThCRDAwNzIyMjBFMEI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjZBMzdDNkJCRDRGOURFMTFCM0Ey OEQ1MTA2RUY0Mjk2PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo2QjBDNzQ0Njg2NjJERTExQjkzNEUw QkMzOTgxNTcxRDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NkMxQ0VFOTlGRjBDREUxMThCNjA4MDg2 ODZEMUNEQTY8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjZDNzA3RUI1NEM0RURGMTE5QkY2OUY1RTdD QzM4NUQ0PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo3MUUyMjEyODY3OENERjExODE5NkQxQ0VCQTEx QzU2NzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NzQyMDBBODU3RTNEREMxMUI2NjFEMzkwNDEyNTlB ODY8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjc1OTgwMEM0QTVEOUREMTE5QTAwRTFCQzBDNjE5NTFD PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo3QUYyNkZBMDc2NUZERjExOUY2MUM1NDNERDE1MjgzODwv cmRmOmxpPiA8cmRmOmxpPnV1aWQ6N0Q4MkE0RDlGNTM4REYxMTg5QUZDRDI3Mjk0NjY5ODU8L3Jk ZjpsaT4gPHJkZjpsaT51dWlkOjgzRkExMTM4ODk2MkRFMTFCOTM0RTBCQzM5ODE1NzFEPC9yZGY6 bGk+IDxyZGY6bGk+dXVpZDo4NEYzQkM5MDkwNkRERjExOEZEM0JFQzc1NzI0RTQzMTwvcmRmOmxp PiA8cmRmOmxpPnV1aWQ6ODk2QzBGQ0JEQTMyREYxMUE0NzNCMjFDNDlEMTc1N0U8L3JkZjpsaT4g PHJkZjpsaT51dWlkOjhDOEI0RjMxN0UxQURGMTFCQUJDRDc0NDcyQ0VFMEFFPC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDo5MUM2QjlERDdEMUFERjExQkFCQ0Q3NDQ3MkNFRTBBRTwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6OUJGQzlCRENBREZDREYxMUEyMzVBMTI3REVGRkRDNTk8L3JkZjpsaT4gPHJkZjps aT51dWlkOjlEMEMxMTFBNjNDNDExREQ4NTM2OEIwOEM3MzQ1RjFFPC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDo5REREQzE0QTU4NzJERjExQUNFNTlGNTgxRTJFRkIzRDwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6QTA2Mzk3OUE1RjRFREYxMUE4ODU5RkMwMzRFNUJFQTM8L3JkZjpsaT4gPHJkZjpsaT51dWlk OkExRTg3N0Y1OEYzNERFMTFBRDYwQzU5RkEyN0Y4QUM5PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpB MkIzMzhGQzg3NjJERTExQjkzNEUwQkMzOTgxNTcxRDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QTUy QjJCRTJENTA0REUxMTg1MzJBNzUzNjI4RTk1ODc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkE1ODAy RTY0NEQzOERFMTE4N0Q4Q0UwRkUwOEIwMEQ4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpBRkVDOTUz RThCMjlEQTExOURBRUU5OTI3QjNFRDNFNzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QjI4RUE4QzI4 NEZGREUxMUI0QTM4QkZDNjk1QzdFRUE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkI1QTE2NTIxREEy QURGMTE5REU1REMwRDc4RTE1ODcwPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpCQzQ2NjEzNUI1MENE RTExOTc1NkY4MURDOTk2N0MyRDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QkNDRTYxRUI0NEM0REIx MUI5MjVENTk5NjM0NTgyOUU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkM0QUFERDQxMDlBNkRFMTFB QTU3QzREQjAyRjFGMzdFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpDQTRFMDM0RTdFMUFERjExQkFC Q0Q3NDQ3MkNFRTBBRTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Q0YyNjg3M0U3MjEwREQxMUI5MTBB QTA1MTAyM0Q3NEE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkQyOTI1NDRBRjQ2N0REMTE4QjAwODk5 NzhDNTM1RDI3PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpENTc0MjhBRTg3NjJERTExQjkzNEUwQkMz OTgxNTcxRDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RDYyM0UyRkNDQjQ0REYxMUE2NTk5OTA0NDY3 Nzk2NDI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkQ2NzMzQTU0RkE1MEREMTFCMTkwQUJDNUYxODJG QjM0PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpENjdCNzNEMjNFOEYxMURFQjE4MUE4NUU1NTRBQjcy MzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6REFDQjQyQUMwRDU3REYxMTlFNjE4M0E5MjFCNjBGNkQ8 L3JkZjpsaT4gPHJkZjpsaT51dWlkOkRCMjgyNDcyNzY1RkRGMTE5RjYxQzU0M0REMTUyODM4PC9y ZGY6bGk+IDxyZGY6bGk+dXVpZDpEQzBEQzg2QzlGRTVERDExQURCMjlDNUJGQkQ2REZBNDwvcmRm OmxpPiA8cmRmOmxpPnV1aWQ6REUyODI0NzI3NjVGREYxMTlGNjFDNTQzREQxNTI4Mzg8L3JkZjps aT4gPHJkZjpsaT51dWlkOkUxQjBENDAzOTlFQURFMTE5QzUzQTI0RkY0MDJBOUREPC9yZGY6bGk+ IDxyZGY6bGk+dXVpZDpFMUNFQzYzQjcxRUZEQzExQUM3MThGMkZCMDRENUIzRjwvcmRmOmxpPiA8 cmRmOmxpPnV1aWQ6RTFFRkE4ODlCOUIyREUxMTlBREFGRkJFRDY0MUQwMDc8L3JkZjpsaT4gPHJk ZjpsaT51dWlkOkU0MjgyNDcyNzY1RkRGMTE5RjYxQzU0M0REMTUyODM4PC9yZGY6bGk+IDxyZGY6 bGk+dXVpZDpFNkYxMjAzRDJFRTlERTExQkQ3MkMzN0U5QzVCMEI5MzwvcmRmOmxpPiA8cmRmOmxp PnV1aWQ6RTcyNkFCNjdBMUQ3REUxMUExQUU4QTM4OEJGMTFGREI8L3JkZjpsaT4gPHJkZjpsaT51 dWlkOkU4REVGRkZDNzU1RkRGMTE5RjYxQzU0M0REMTUyODM4PC9yZGY6bGk+IDxyZGY6bGk+dXVp ZDpFQjY5QjE4ODg2MDZERTExQjM4MEM5REZGRjVFREI2QjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6 Rjg2QUVBMzY3OTM2REUxMTlGQzk4QzZGNzA2NDYxNzQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkY4 REMyNDEwODQ2MkRFMTFBMjk4QkQwMDcyMjIwRTBCPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpGOTVD MUEyRTI1NzhEQzExQUJCN0U3QjBDRjM0RDc4RTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Rjk3NDg2 QzFFMjRGREYxMTgzQzc5OTY3MTBEMDk5REM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkY5NzZDNDFD QjE1NkRFMTE4MUQ5ODZFNTQ1NkFBOUNDPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpGQTFFRTY2OTJE M0ZERDExOTZBQzk1NkRBM0RCMTlDMzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RkRENkQwMUNDNzA4 REUxMUExNUFCMjgzOEYzQUVCRkU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkZGNjIxNjgwRThBNURD MTE4RkZFQzdGMzRGNkJEMTFEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowMTgwMTE3NDA3MjA2 ODExOERCQjlEOEVDQzMxQkNFRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDI3QjY5MEVGQzVC RTIxMTlGRDNGRTFGNTIzNUUxMjI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjAyODAxMTc0MDcy MDY4MTE4OEM2QUI3RkQwRjU2ODRDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowMjgwMTE3NDA3 MjA2ODExOERCQkUyRjM5QzU4RjI0QjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDM4MDExNzQw NzIwNjgxMThGNjJBRjM1QzREMjQxMUE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjA0RDM0MDEw RkYyRDExREY4MjNEQzFFNzlBRUVFRjE1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowNTQyNjYw RTJGRTAxMUUwQUU1MkFFMjY4RkMwRTJFRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDYwNkRC QzkxMEZGREYxMUE0NTU4NTA5NzJGQzkwQkQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjA2MzVE M0RGMEQ1RjExRTFCMDcwQTI2QTYyRUZEMzYyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowNzBD NkM1NkVCNDcxMURGQjYzRUU2NzQ4NDAyREMwMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDc4 MDExNzQwNzIwNjgxMThEQkI5RDhFQ0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjA4 QzYwNzVCMjgyMDY4MTFBMTY5ODcxQkNDQkJGNDg2PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDow QTM4OTAxQTRDMThFMDExQjI1Nzk4RjhEN0ZFMkZEMzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 MEE4MDExNzQwNzIwNjgxMTgwODNDNjFGNEVCNjA4OTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjBBODAxMTc0MDcyMDY4MTE5MkIwOTRDQUIyRjNEODMwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDowQ0U3QzNDMjc1RUVERTExOENERURGOEE4MTEyRUQzODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6MTJFQ0RGQ0M2OTE4RTAxMTgzMTdBNTEyNkIxODRDOUM8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjEzQjA4NjUwOEVGQkUxMTE4NjMyQzM3RUEwOTRFQjk5PC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDoxNTg4QUJBNjRCN0VERjExOEJCM0ZEM0ZGRkU1MEZCQzwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6MTg0MDdFQTQ5Rjc0REYxMUI5QURGNTAxQjFGRUVDNUI8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjE4QTNCMkRGRkUxN0RGMTFBMUEzRjZFMkJFMzg3MkQ1PC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDoxOEE2QTVGQUI5MTNFMDExODBEQUNFQjFFNEIwODBGQzwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6MThCOUJCMEIwM0U3MTFFMDg0Qzg5MUQ0MjEwREFDODM8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjE5NEI1NDM2QTU2RkUxMTE4NDQ1RERDODM1RkM5MzJGPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDoxQjZBODYyRkU3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6MUQ2RTQzNzNBQzVGREYxMUE2OEVEMjUxRkYyM0VDMzQ8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjFGNzNFMUJBNTczQ0UwMTFBRDc3QjJDRjVGOTdBQUJEPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDoyMDIyN0QxQkQ5RUNERTExOEY4NEI4MjhBOEY5NjhGMDwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6MjE2QTg2MkZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjIxQUI0OTUxMTNGRkRFMTE5N0Q1REI2MDkyNzAxNTUyPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDoyMUNDRjc4MjIyRDJFMjExQjJCM0Q0RTVFMEIxMjcyQzwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6MjNCOTgyNUMyRkRFMTFFMDhCODVBQkI0MTg2NUE0RjA8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjI0RTEwNTk1NDJGNTExRTE4QkQ0OTUzMjJCOEM2NTQ4PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDoyNTBGMzdGREJFNjVERjExOTZBMkU1Mzg2RUI3RUZCRjwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjYyRDVGMUYxNzFFRTIxMUJBQzY4NTlDRTZDQjBFRjI8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjI3NDlEQUMxNjlFMERGMTFCQUUyQTlGNEZBMUM3MzBFPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyN0UwMjkzQTc4RjVERjExOUYxMDgzQjU3QTU5ODQxOTwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjhFRUE5Qjc5QUQ1REYxMTk2NDhGODUxMUI3NDE3RDM8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjJCNDlEQUMxNjlFMERGMTFCQUUyQTlGNEZBMUM3MzBF PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyQkJCN0VGMzEyMjA2ODExOERCQkQxRUYyNjc0MkQz QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MkMyN0VBQzdCMjYxREYxMTg3Q0ZFQzg1QTYwNzdB ODc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjJENzYzNTA4MTRGRkRFMTE5N0Q1REI2MDkyNzAx NTUyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyRTRDODA2NkRGMENFMzExQjAyREQxNkVDOTg0 OUYwQTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MkVBRkEyQkM2OTIyNjgxMTg4QzZGMTZCRUI1 MDdGQkM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjMyQkE2ODE0RDlFQ0UyMTE4QUYzRkU1RkY0 NjYzRjBBPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozMzdBRkZEREU5MDJFMTExOEQ5RUEwNjk5 OTc4N0ZCMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MzQxQUIyN0Q0QzEyRTAxMThEMzNBNDM2 NDY2RDk1Nzc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjM4MkJGRjIzRThFRkRGMTE5QzE4OTI5 MUQxREJERDc0PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozOEU5RDM1RDQ5MTVERjExQjEzMTgy MjNDNkE4RURFOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6M0E2Q0FGMjcyQjE5RTAxMTg0REQ4 RkJEMTEwMzQwMDg8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjNBNzY3ODNDRDBBOERGMTFCMkEx OUQ1MEZGMjFCOEQ5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozQkM2Q0UxMkMzNzBERjExODUw Q0I3MkRCOUQyQ0I5MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6M0QwMkU2MkFERjhDREYxMTgx RENDQjhFOEI3N0YzMUY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjNGMjg0MEJCREFGNERGMTE5 QjlGRUQ2NkI2ODc1QTc3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0MTg3QzE0MTc3MzJERjEx OUQ3M0JDNjU3RTE5RTMzNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NDI2OTU2QTYzQzdFREYx MUE1QTRFOTA2NUZBQzcwNEM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjQyRDdBRDE0NDQyMzY4 MTE4REJCOUQ4RUNDMzFCQ0VEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0MzUxNURFM0JCMzdF MTExQjA1QzgzRkU0M0NCRTgyMzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NDRCQTYxMEZGNzE1 RTAxMTg1MEZBOTAxQjRDMUI2NzU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjQ4MEI3RTQ2QUY3 OERGMTFBODI1Q0Y4REU1RDkxREY3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0QjRFREFGRjVD RjdFMTExODYzNTk0MjAwQTY5NkQxQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NEQ3QzE2NzdE QUFCRTAxMTg0MzFGNkU1MTFGRjE0MTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjRFNUQyODcx MTgyMzY4MTFBOTYxQUU1NkQ0OEFDRDUwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1MkQyMkFG RTU2MjA2ODExOTEwOTkxQjlDN0I5MzlCOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTNBNEJC MEUzNzA3RTMxMTlCMjRFNzE2OTFERDY4N0U8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU0MDky RUU3N0QxNEUxMTFBNjkxRjY4QTczNEQwMDZDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1NDNB Nzk4RjEzMDdFMDExODQ2RkU4QzA0RDNDOERFQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTRD M0Y5RjhCREFFREYxMUE1REM5NTlDODJBQkM5RTE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU1 NERBRTg1RkMwQUUxMTFBN0VERjc0NENBQzlBMzMwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1 NTVBOUVFODExMkI2ODExODcxRkY5QzMyRjgyMTVBNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 NTU5RkNEM0I1MjdBREYxMTg5MTRERUIxMzUxNzYxRjE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjU2MTRDMTM0OTYzN0UwMTE4MjU3RDQ4OTgwNzc3QzE4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDo1N0FDRjE1MDY5MkE2ODExODcxRkY5QzMyRjgyMTVBNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6NTk0MDhFNENCRUZGRTAxMTlCNDJGNDgzMTQxNDAzM0I8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjVCNkREMkI3NDU4NERGMTFCNzI0OEI3RERGNzk0QTFBPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDo1QzVFRDUyMjI4MkVERjExQTQ2M0JGRTlCMThGQ0FENzwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6NUM3OUMyRjIzNjBCREYxMThFMkJDNDY1MDZGQTg2OTg8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjVENkNFQTI2RkQ4ODExREY5RTdEQUFFOUY1RDg4QUIyPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDo2MDY0MEE1QzU4MjZFMDExODJDQUQzOEVDRURDRTI2ODwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6NjJBNTZFMkVENUU3REYxMTgxRDdEMUQ3QkM5MjlDMDc8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjYyQzIxMDRGRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDo2MzFEMzE2RjBDNDcxMUUwQkMwRUFBMUJBQ0M3NjAzNzwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6NjM5QjFERDI5N0Q1REYxMTk2NDhGODUxMUI3NDE3RDM8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjYzQUVGOTEwNTMwNUUwMTE4NjdGODlCMDIxMUU0RjdBPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDo2NDc0QzgzQzY4N0NERjExOEUxRjk5RDY5QjM1MjVDQzwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6NjQ4ODZDQzhCRjNERTAxMTg4QkJDMDU3ODFFQkFFRDY8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjY1QzIxMDRGRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDo2ODlCMUREMjk3RDVERjExOTY0OEY4NTExQjc0MTdEMzwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6NjhDMjEwNEZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjY4QzI1QjA2MzJFREUxMTFBNTdCRjAzMzEwNDIyRUU0PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDo2OTQwNDMzQ0U3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6NkJDMjEwNEZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjZDNDA0MzNDRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2RTI4MkRDQTdGMTdFMDExQjA3Mzk4NjZFOUFEMEM4MTwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NkY0MDQzM0NFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjcwMjEyQThDMkZERjExRTA5QUQyODZBQTY1MzM0QTI3 PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3MDM5RURBMDUwMzcxMUUwQTJGM0UyM0U3OUI0NkFG NjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NzM5RDdFOUZFQkFEREYxMUFBREVBREEzNTYyMjIw ODM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjc1NTE1MzIyQUI1Q0UyMTFBNzgwRUNEQkFENUM1 N0RFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3NkJDM0Y3RTUzM0JFMDExODFEQUYzM0EzMDgz ODZFRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Nzc1MTVDRTVFNzkwRTUxMTlGODJDMTA5RENF NTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjc3NkNEMjNCMkZERTExRTBCMTMwQkU0ODc4 REY0NEQ1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3NzdDNEFBNDE3MEZFMDExQjQyMjgxNTMw MjVFRjBDRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Nzg4MjAwQjMzMjYxREYxMUIzOEY5OTg4 NzVDQzg2NTQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjdBQkMzRjdFNTMzQkUwMTE4MURBRjMz QTMwODM4NkVFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3RTBCQkVDMDA5ODVERjExODRCMkVF NTk4RDk5NUExMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6ODJDMDFGMzY2RUYzREYxMTlCOEFD RjI2OEEyNzg2QTE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjgzNDI1NURDNkQzQkUwMTE4MURB RjMzQTMwODM4NkVFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4NEM3NkU1Q0E2MUVFMDExOUI2 MkMxQTcyQ0REQkIyRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6ODUwRkQzODgzOTBDRTMxMUI1 MTg5QzAzRUExMzAyNDc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjg2MUNCMTI5MTE2Q0RGMTFB MDgxREFDNjU1NDlGRkY4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4OEExMjMxMTY0RDcxMURG QTY5Nzg1MjFENjBERjQ2MDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OEFEQkRGRDM3QTZGRTEx MTg0NDVEREM4MzVGQzkzMkY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjhCOTA4NThGQjU3M0RG MTFCRkJCRjAwNzU5QTNENDUyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4QkNGQTY3QkI5MDZF MzExQTgxQkI5MTQ3QzdFMTYzRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTBDNUQ1MjY2NDc5 REYxMTg2NUNFRUYwOTg1MUZENzk8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjkxRkYwNTFFMEZE M0RGMTFCMkQxQzUxRjU5QjVGQjI5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5NDBEREMzNTAx MjE2ODExODhDNjhBOTQ4MjExMjI1MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTU5MTZGMzY3 MTQ0RTExMUFEODY4QTM4MTdCMzgzMTU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjk2RkFFQ0Iw MDE1RURGMTFBODc4QTU0RUI2NjQwRUI4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5Nzg4QURC NzY2M0VERjExODIwMEYwOTc5RDhCOTUyMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTg1REYx OEMxODIwNjgxMTkyQjBENEI2OUZFNUFGOEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjlCMEJD OTBFNzZCNERGMTFBMzY1RUY1MjU3NzYyMzgxPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5RTY2 NDY0QjQyRkRFMjExQUE5RkIwOUQxNjg5NEY3RTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OUU3 QzFGNzdGQzIwNjgxMTk5NENCOUZCNUI2MzUzQTQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjlF RjdEOTJGQzM5MkRGMTFBRUQ2QTU5QjBFRjcxMTQ5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpB MUY3Njk3NkU3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 QTNBNjIyQ0E4NzFGREYxMTg1NDdDNTk3NTM2MTk5OEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OkE0NTcxQTk1RTQ1MEUwMTFBRkI5RTAwQzc1NzJFNjY1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDpBNkFDMEY5QzczM0NFMDExQjJDRkIyMzNBNDdDRjVCOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6QTdCRTEwQTAzNjA4REYxMTkyNERCMDM1Nzc5MjEzQkE8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOkE5NTZGQjA1RTRGQ0RGMTE5MEE2RDEwMzc3REY1NkJEPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDpBQUU3NjhGRjhENkFERjExODI5MENCQjk0QzVDRjRGMDwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6QUJBNjg0REIwMTA3RTAxMUJFMTk4RDc3NTM0NkUzMTI8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOkFCQzNGOEE0MjcxQ0UwMTE4RkNBQUJEMzA5MjREMjk2PC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDpBQzdDNEY2RTI4MDhFMzExOEZCMURFRDM2NDQ3M0IzQjwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6QUNFNERFMDMzODhERTUxMTkyOUM5MURCRkRCODYxOUQ8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOkFFMThCN0I4MDZBOTExRTA4NUZERjM1QTMwQkE1NkFEPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDpCMTFEMzYwQzI1RjFERjExOTQ0NUE1RkQ4OTVENzgxRTwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6QjFCNjFCMUNCNjlCREUxMUI2OTVDNkI5NzVENzUxQ0U8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOkIxRkJDMkFDMkZERTExRTA5QUU5QzRBNkRGOUE0MUY5PC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDpCMkU0QkI2MzQzRDVERjExOUJCREMxQkIyQjUxMDBBNjwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6QjVDMUQ2QkI3RDlGRTIxMTk1REE4OEIxQzg4RDYzREU8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOkI1RDVEM0JDQzYwQURGMTE5NzQzQjVGRjk1NjQ0NzlGPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDpCNkYyNzExQkJFQkJERjExOTZGNUI0NEQzQTlCRDZGNjwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6QjlCRjZBMTMzRDlFREUxMTg2NUVCNjBEQjM3RDlDREU8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOkJDQjcxMTkyN0JDQUUwMTFCNTRFQUM3RDM0NjlFRTQ1PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDpDMUZENDIyNDAyNEQxMUUwQjlFN0Q5MjNERDc5MTdDRTwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzIzMkI5MzAwRjIwNjgxMThGNjJBNkE2RDQyMjNENTA8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOkMyNkMwRDQ5NTI2N0RGMTFCMkU1QzhDQTJBMjBCNTAxPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDNDc2MjdCMkE0RjVERjExQUE2QkY2NjFCRjc1MjIxQzwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzU1M0QyREVCNjFCRTIxMTkyRTVDMUIxQjFERTdCMzY8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkM2NUNBNzUzQTZCNURGMTE5ODY2RDZCMTEwMDVCRTdC PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDNjZDMEQ0OTUyNjdERjExQjJFNUM4Q0EyQTIwQjUw MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzcxMTBFNUY1MDc2REYxMThFNjFBQ0QxNzlEMDYy NDQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkM4QzNBRDBGOTgxMEUwMTE5RTNFRUQ2REE1MkJC MDIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDQTJEODI5M0UxMURFMDExQjhGRDgxN0NDODk4 MUQ0QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Q0M0QUI1OTFBN0RDREYxMUJGNzlGQTYyQjUx REY2Qzc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkNERTg4QkNFNEI2RkRGMTFCMjE4QjAwRDg0 N0RDMjk3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDRkJCREI1MjBDNDUxMUUwQTQzQUFEOUM0 RTVBODgzNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDBCRjEyNjUyODA5RTMxMThBMjFEOTVE RUExNTkxQjE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkQzMzE4NDMxQTg2NEUxMTE5NUY5OTdC QTc0QkE0OUM1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpENDdGQjdENDk2QjBFMDExOTUxRUMz MkMyNkIzNDc2NDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDVFQkY2QUEyQjY3REYxMUIzODg5 NDczMzJFNTU4QzQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkQ2NzY2RjYxMTcxMkUwMTE4RDMz QTQzNjQ2NkQ5NTc3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpEOTAyMjIwREU3RURERjExODQ4 OEFBQ0E2RTVGMjI1MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDlFNjgxNzQxREQ5MTFFMDhB MkU5NkQzMjY5NDExNDM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRBQzg1MDc4NTRENURGMTFB MDk0REYwMUU2RURFMzIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpEQjFFNEMxQ0U4N0FERjEx OENCN0ZFQTdDRDc0RDM1QjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6REMxMDg1MjMyQ0I0RTIx MUI2NDU4NEFDQ0U2QTdFNUY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkREMUM2RDJBRkEyMzY4 MTFBN0JBODkyMTM1QzEzODcyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpERTRENkJFMjBDNkJE RTExODg2OEQ1RDRGQ0NDRTdFQTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6REVDOURBOEYxQzIw NjgxMThEQkI5RDhFQ0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRFRjYwRkE1MDlC MEUyMTE5M0E3RTI3Njg4MEUxNTUwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFMDI0MUU0MUI0 RkVERjExQTQwQ0QzQzFCMzQzRDU5MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTAyQzE5MEU0 MjZFREYxMUIyNERFOTA4QUNDQUMwOTU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkUwNkY3ODZE RkNCMURGMTE5OERGQjIwRjkwRDNBQTZFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFMDk5MEZC REFDM0FFMDExOERDOUJGNTc0NzYxNTMzRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTBCNTA1 NzM1MEREREYxMTgyNzFBNjlBRkM2NTY4OEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkU3NDdD MEY4MEY2NURGMTE5QTk0QzVEOEQxODg5NTVCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpFNzk0 MDc4RERFNjRERjExOEE1M0Q0RUZFMjBDMzUxODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RTdE MzQ3N0YwQzQ4MTFFMDg4QURENkVENUEzRDg5REU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkU3 REQ1MjY0MUExOUUwMTE5NUYxQkE0NzRGMkMwQkFFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpF ODEyQTM3MUZDNENERjExQkU1NTkyNjdGNTNBMEJBRjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 RThBODJFQTJDQzA4RTMxMTg2MkZCQzJENDU2RjMwMTg8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OkU4QzE1NjBFOTIxN0UwMTFBRkZCQTY1NDE5QUYxMENCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDpFQTEyQTM3MUZDNENERjExQkU1NTkyNjdGNTNBMEJBRjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6RUI4NDY5MjAzQkZBREQxMThCNEE4MjhEOEVGRDUzMEE8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOkVFQzE1NjBFOTIxN0UwMTFBRkZCQTY1NDE5QUYxMENCPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDpFRjg0NDFDMDY1RTdERjExQjhBQkJCRjdGRkE2QjBDNDwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6RjFEMjEyQTQ3OTQ1REUxMTk5OEZCRUQyMjkzRDlFMjc8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOkYyOTg2RjQxNkIxRURGMTE5ODk4QUNEQkRGNUYxMjVFPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDpGNDgwOUVCMkJBMDhFMzExOTAxNjgxRTg0MDRGRkZBRTwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6RjVDOTQ5RDRGQjY4REYxMUJCMjc5Rjk4RjA2NzM2MEE8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOkY2QTNGREI1MDcyMDY4MTE4M0Q0Qzg4M0Q1NEZEMjE3PC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDpGNkNFNzI1MTRCMjA2ODExQTEzOEJDRDU3NTRBQ0QyQjwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6Rjc3RjExNzQwNzIwNjgxMTgwODNFQjgzQzYyQkQ3QzE8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOkY3N0YxMTc0MDcyMDY4MTE4OTI2QzI3Nzk4Qzk2Q0U1PC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDpGN0RFNjcwMTFGRUNFMjExQkM5QTk2RjA2QTk1NkFFNDwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6RjhBM0ZEQjUwNzIwNjgxMTgzRDRDODgzRDU0RkQyMTc8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOkY4RTVCRTQxQzgxOTExRTBCMDMzRUVGQUFGMUUyODczPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDpGOUQyQkMwQTAzOThERjExOEUwREZCQ0MzOUYxRDcwQzwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6RkFDRDVBNzAzMzI1RTIxMTgwNkRCNTA4RkE2NzVEOUU8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOkZCQkY0OTZDMkZERTExRTA4Mzg3RDMwMTgwNzU3NTg5PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDpGQkQzRDlCNjA4NTcxMUUwQkE3REU1OEM2MTQ2OUUwNzwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkJGOTlFQjc1NjdEREYxMUE3NEVFNkNFMDM5OTQ0MjI8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOkZDMTMzQTgyRDEwRDExRTBBMDhBOTc5NjUxOThFRjdDPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGQzdGMTE3NDA3MjA2ODExOTQ1N0I5MzM5N0NDRjM2Rjwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkVDNTJEMzk3NjYzREYxMUIyNjE5NEREMTM0MjdGOEI8 L3JkZjpsaT4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPC9yZGY6 RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iDFhJ Q0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZU AAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGEAAAAbHd0 cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJYWVoAAAJAAAAA FGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4 AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMA AAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2FyZCBDb21wYW55 AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0IgSUVDNjE5NjYt Mi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVog AAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BY WVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAAAAAWSUVDIGh0 dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2 Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2MTk2 Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAAAAAAAAAAAAAA AABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4x AAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQTCwADXJ4A AAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAACjwAA AAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUA SgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADV ANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFnAW4BdQF8AYMB iwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksCVAJdAmcCcQJ6 AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64D ugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6 BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbABtEG4wb1BwcH GQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6 CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7AL yAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQOfw6b DrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFPEW0RjBGqEckR 6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4 FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZ kRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1wHZkdwx3s HhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7IiciVSKCIq8i 3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgN KD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last 4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQzDTNGM38zuDPx NCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/Obw5+To2OnQ6 sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGs Qe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1J Y0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91QJ1BxULtRBlFQ UZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9WMtZGllpWbha B1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLw Y0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/bFds r20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1KHWFdeF2Pnab dvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqB a4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/Ixj jMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+XCpd1l+CY TJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiailqMGo3aj5qRW pMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqx YLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6E vv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4yrfLNsu2zDXM tc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY6Nls2fHadtr7 24DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDq W+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH +lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkQAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgMDAwMDAwMDAwMBAQEBAQEB AQEBAQICAQICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD A//AABEIAyADIAMBEQACEQEDEQH/3QAEAGT/xAGiAAAABgIDAQAAAAAAAAAAAAAHCAYFBAkDCgIB AAsBAAAGAwEBAQAAAAAAAAAAAAYFBAMHAggBCQAKCxAAAgEDBAEDAwIDAwMCBgl1AQIDBBEFEgYh BxMiAAgxFEEyIxUJUUIWYSQzF1JxgRhikSVDobHwJjRyChnB0TUn4VM2gvGSokRUc0VGN0djKFVW VxqywtLi8mSDdJOEZaOzw9PjKThm83UqOTpISUpYWVpnaGlqdnd4eXqFhoeIiYqUlZaXmJmapKWm p6ipqrS1tre4ubrExcbHyMnK1NXW19jZ2uTl5ufo6er09fb3+Pn6EQACAQMCBAQDBQQEBAYGBW0B AgMRBCESBTEGACITQVEHMmEUcQhCgSORFVKhYhYzCbEkwdFDcvAX4YI0JZJTGGNE8aKyJjUZVDZF ZCcKc4OTRnTC0uLyVWV1VjeEhaOzw9Pj8ykalKS0xNTk9JWltcXV5fUoR1dmOHaGlqa2xtbm9md3 h5ent8fX5/dIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhED EQA/ANAcH20R0uVqdc9XvVOnddR1x976oTTr3v3Wqjr3v3W+uLe9jppxnh1x976oOudveq9O6fMd e1W4Pv1Ova6UB6yCxHBH1+nunT4oRUEVr15wNJuPx+fflJqOvSqvhtUeXUbWQunjn8+3aZr0gEhE ZjpjrNHbSP8AY/7Hn3RuPSqCnhj165+69Pde9+611737r3XVve+qkdde/dap1737rw49d+/dWGOu /eut9e9+691737rfXfv3W+uvfuq9e9+691737r3Xvfuvdde99aBz13f3rr1R1737rfXr+/dbqeuV 7+9dXrWnXK1veur0p5565q3PPv3V0ehz123vx6s2a9Y9P+w9+r0zo8+uJ976qQOHXE+99UNOve/d er1LpaqSnbgloyfXESdDD+hH09tyRq4zx9eltneS2zChLR1ytcH8upE0McqNUQhl1Nfx/hQfqL/4 H3VWKkK3Sq4gimja5gBAJ+HyHUB1K2ueSL2/I9ujPRY6lNOc9TKPKVlC4anl02/ssA6H/XVrg8e2 pbeKYUdel+371uG2yB7Sah9CAR+w46dH3BUVB1T2JPFlUKBb8gC319sLZRpheHRzJzTeXZrckV9A AOvIq1oeX9PH4FyzW/4r78T4NF6qiLuIeUjT/lPTNVQSwt+4pUH6Br/T+vP9fapHDDB6Iry2mgb9 RCPt/wAPWBTb3s9MIaD5dZR/vHvfTy/bjrl+ePp/rfX37q1c9d345A966tX164An+vvfTYJqM9ct X496oOras9e12/P+8+/UHWtVOpUTAjn20wNelMLL58OvSsoHH9P959+QGuevTMnBem1uSfbw6LZA WJ6x292r0zp66t791UinXE+9jptuPXXvfWuuJ976oT13b37rYHXfvXVgPl1y966uBTrv3rq1Ou7e /dbp12Peurgdcre9V6vpz1yA966uF6zot/fiadPqo9OswUD/AHj3QmvTg8sdZCoP1H191qRw6c0g 8eo8lO31HNyf+RD3cOOmZbdsGnUZkK24Pu4PSV4yKdcLe99N0I8uuJ976bODnrr37rXXve+tde9+ 69173rr3XID3o9OKPn12ffurHrr37qvXre/dep1737r3XK3vXVwPLrx9+62R11b3vqlD12AT711Z VJ8uuZJ+n096HTrEjHWM+7Dpknr1vfuvUz1lRSbWH191P8un41b06nJEBa/19tM9elyRUpXruVtK m3vyipz1uZgooB02G5JJ9vDoqapJPXgt/fq9eCV6iuDrYf7Vb28D2joulU+Kw89VOn6CmNwAL/4n /eP9v7RvIPXHQotrRmIAXHX/0NAUce2+lQqD1yHvXTgPXfv3Vuurc+/V6ppzXrxB/HvdevFTxHXR vb37HWjqI64+99N0P5dcwfeunQa9dH37rRzjrHcj/YfT3bpmpB45HWXWX4P5Fj/xX/X910gZ6f8A GaTtI4jqP7c6R9SIv0/X6E+2n49LbYjRSua9Zfden+uvfutde9+691737r3Xve+tdde/de8+ve/d a4Z69791sevXfvXW+ve/de697917r3v3Xuve/de697917rr3vrWeve/dep13711vr3v3Xuve/der 13f37q1evX96p14N1y9+6uOuV/eqdX1UA66LX9+p1UvXrj731Tz69791454ddW97r1rSes0K6nQf ksBx/j7qxwelECBmQeZPSubG1c8AhigWCKIK8gXkyNawcEj6G/PstE8SOXZ9THh0On2e/ubYQQWw jhQAtT8R9f8AP0nq/HTUjKZFYal1DULEi9rr/UX9rYpkkrpPQV3LarixZfGQjUKivp8um0Jyb8cf 7f29XooEeTqxjroA3t72etKprQDpS0tO8UKTBwq3v4ybOR/rfS3tDI4ZilOhZZ2rw26XHigCvw+f 29cMxNHOkZAs6Wu1/wBQtxx/h73bIyaqnHWt9uIrlISFpKvE14jpP/T6e1fQYwDjh1kXn34dOr3U 6yalHF/r9T/T+tvfunCyjFeuLSD6f77/AI178B1RpFAp1hLk+906YaUnh11qPv1Oq6z5nrsN/X36 nVg58+syPYe9U8un0bHXJnvx/vj70KDqxby6wt730yxHWM+99MkdcT7sOm264H3sdNt11731Xr3v 3Wqdd29+6sBXrv3rqwFOu7e9dWp1y966sB13791YDPXYHvXVwOsqqfz/ALD3r59PKp8+sypzz70T 08F6zBAPp7oW9enAnXMJz/hb3XV04Is/KnXiLc/7z79x60QVyRjrkri1veivTizAilM9YJlBGoA8 e3E9D0nmUHKjqAT9fbg6QMcnrgfdumj11731Tr3vXXuve99e697917r1/eutg0HXd/fqdb1E9cve urj+XXvfut0z13b3rrdOu/fut9eAube/dWC1NK9cyvv2erlB13a3096r1YCgxw64seffuPTbnNeu HvfTZ49clW5Hvx6ui1I9OnKJAoufqfbDtU/Lo0hQKKnrLYn3Xp6hI6izX+nt1OkcoNesHjv+P6e7 VHTPhjHXNUsf6/7Djn/Y/j36op1sLQ46gxxmWrVP9VPb/Yarn/eB7dJ0xk/LorhiM99HH5mT/Lnp XFxRLGzQmRWvrZeNNvp/vHstoZiQGp6dDsyLt6xM9uWQ8SPLr//R0BvbfSzrse9dWGOuXv3Vuve/ de697917rr37rR4Hroe/daH2dKnbVXt6hq4GzeHmztPUu1NXU8M7Ur0WPmXxSVdBKvBy8RbXCZAY QVAZW1em2kkcei+5klJPhSBQOHnU+h+XrTP7Osm7drNt+WmraCqGW21mBNNgc3GmhaqKJ9MtHWwg t9hmaHUFqadjqQkMNSMrH1CKV49Xt7pbgEFdMy/Evp8x6g+R6Rp97HTrdcT7302a9de99V6yRW1c /Uiw/wCN+6Pw6ftyBJniRjqT7b6XEdde/da697917r3v3Xuve/de69791rr3v3W+ve/de69731rr oe/daB69f37rdR13711vr3v3Xuve/de697917r3v3Xuve/de679+63THXXv3Wuve/de67A9+6sBn rmVNh+PdenShAHXE3HvfVDUcR1x976b697917rse/dbB67B96PVwfPrNDIYpUcAEqwYD6/Q+6sNQ K+vSi3kMUqSKBUGvQi0mRNRSq5lVHLLGytcekD1NxwB7JJYRHIRpxx6ljb93N3ZRytMFkLBTX08z 0x5OKpyFQXBuka+OJFJICqf8frc8+1lu8cCU8zk9BjeYbzdrxpFNUQaVAzgf58npMvCyzeNv9VpP +35/23teGquocOgg8DLN4b+tD07wY1JT+1Ih0nguQpP+IBPJv7TPOV+Jejy22hLhqQTLj1IH+Hz6 zVUMyWBBJX0nT9LAD/eb+6xuprQ9P3sFxHpXSSwxjpsqEa2lwVb8e30I4jh0TXKuOyUUbpuZSD7e r0WOhH2ddXt9Pr7917VpGOPXC9/e6dNlia1PXiffuqk9cfe+qde9+63Xrlf3rq9euQa3vVOrh6dc gePeunAQR11791o566976qeuB92HTTdcfe+qdet791qg69b37r1B13791unXdveurAdd+9dW679+ 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 6rJZLD0UlRtmKaSS0DGWppYKWrOME8pcM5eplhaXi4CNc290Dgmle7pDb3ayBUlNJT+w1z/sdIrD 5mFYmxeYtPj6hCKectrkoi5/UvPo1kesnkWHvzLXuXiOl3D7OlhjspLg6arxGbimy+1czLFLNHA0 QE80MTQw5fG1DqyUO6KGBiI3IMdZHeKYG4t4FJBocf6vUf5emh41vKtxayaJQCK+VDxUjzQ+Y/Cc jpGbi2+du1UU8cyZnDZPyT4LPxBkiyFNE4V45oXLtQ5OjLBKmlc+SCT8sjI7UdG+ENRf8PRtZX0M uppYSbkEVqalT/lB8j0laqUSMhHFk5HJsxJv9f8AAD3uNSoNfXq97KsjR6fJf5nrOjqyi5tZV+v5 45t7qRQ9LopUdFqc0HXiAb8j/b+69eYA1oesJPPu1OkxbNOu/fureXXXv3Veve/de66t731WnXre /deA69791sde9+69Trv37rw697917HXXv3Xvz69f37r1euiffuqk9ev7916vXK/v3Vgeve9db697 917r3v3Xq9dg+/dbBp9nTvQ1MMZBc6dItb+v/FfaaVGYUHR5t11BEdTtSg6zy18UzfpUADSCRyB9 b/6/uqwsg49KZtyhnf4BSlOm2WUavSbj63/4j/be31GM9FM0qhiRwPURmLEk/n25TpCzFiSeugCf fuvBSepsFNcjWL3sAP8AX+nPtp3pw49L7e11MuscelDBDDFDLE40uAWGoixup4HPPtG7szKy8OhT bW8EME0MmHArkihx0w1BtxYAX4/qLe1kfrXoNXFASAAFr1FYrawPP5v/AMR7v/g6SOyaaA56xrIy HUjFT+CpIP8Atx73QHiOmBK8Z1I5Deo6yJV1KNqSeVW/qHYH/Y/196MaEUKCnTqX93G2tLlw3qCe pLZOolTxSlXQ8G4Gom/6r/UN/j7bECK2pePSx93up4/BmYFP519ft6iMBckHj250jYCtQeuS2H+x 9+HV1oOHXR+vv3WiDXHXBuffh02+T1xt7t01THXVvfuvU67t7916h68B79XrYXrmYpAASpCt9D+D 71UH7ermGUAEr2nrjp5t79Xqug1p1lELn8H8f7H3rUPXp4QOfLPWVaZr2YfQXPupcdPJbNWjLkdd ToFtb+nvymvWp009RfbnSI9cfe+q0679663Tru3v3VgOu7e9V63p67Cnj36vVghNKdZAp/p7108q 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 W5sb2sffhx6JNwjk1CbjFwx5fb0OeKrYctHl6WJJhLV1tRhmwVUqMwowzy1TU9E0YUxzwoVFtIDH n2moxZs4rgdISKBPMUrXoCd0/wAQ6u/jVPsGlr6/aG5KHLpk9ruXkrdtV1DTwpW7moQglNCsPnVX jsEkBC/0s+r0qprp+fEHpbEUu9IuXAlUijfxCvwnpc7erqmqp6bdeJqKOHbVf44sLX+OLyvHFFSU wx1ZCjlYaqERfuKxDeTn6e6gkVIAAr0nlUKzQuD4o4j/ACjoB+1+uKXJ0+c3ptqGOOspc5XwZXEU UYaE0pdnp51AsPuEp0LSFQysx+t/e6kE+nS+yuzGUgmPYVFCeIP+borcuryaHDgqAmmRSrobD0lW 5Fj7sfUdHi/D8uhpxUi4aJttbqgGW2zmhTSmOh8ckolSLQuX21VPpWDc2MiYApxFkYR4pPVoJZ1C T5MP2j/OD5j8+kkqOjLPCaOP2fYf6J/4ycjHQfbr2tU7WyKwfcw5TE18X3uBz1Gsgx+cxcjERVdM ZAHimQ+iogf92mnVo3AZfdg1cEUYcf8AV5j0PRhbXC3CFlBDA0ZTxU+h/wAh4EZHSYt79XpWF9eu LJf3sGnVHj1dY7WPu9ek5Whp5dc191PTqDrOPpb22ela8Kdd+/dWz1737rdOve/de69791r7Ouvf uvHr3v3Wuve/de69791o5642976rQ9d29+63Tr1vfuvU669+61Tr3vfWuuj791oivXVvfutU65e/ dW697917r3vXXuve/db69b37rdPn13791v5Drr37qnXve+vdcbe/V6qV69p97r1oJ1kHA906fAoB 13791unXJR7qenUAxXrMB+R79jp8DFRx64k8/X349UJNePXBvfh1R+PXXH+v791rHWVP8ffh59PJ TieHUkkAX+o/P+H+v7pTNOneArTrH5CePp7tpHHrWuvXvqBYXI5v/vPvfDjw6312pYXBP0/r+P8A ifeiB6deBIx1jeQgnng/6xPvdBjHTbvpPHril2Nx+Pr/AMT79w60nca9ciBf/Y+98R1YgV64+/UH VT163v1OvU670r+Tb/eb+9dbKr5nriQv1v791QqmT1wJH9ffs9NkqMg9Y2fj/D3YL0y8uKVx1i8n H+9e76ek/j4I64XI/Pu1OmtRBrXrPH/X223SuHhWvUuGbT/ifx/X22y149L4Z9ORx6dqZ9YufoDx /vv9f2ncUx0d2Uhcdx4HpzBuL245/wBt/re03n8+jUZHDHUSoiVwb2/oB/rcc+3kYjpHcwLIpr01 VMAEYta4+lv959qEYluiW6tgsY9eokMYuWa9l9uMT5cekUMYBq1cdTABIASFC3+n1v7aPbw49LQB JTVQL11IYkAAUEfngX4/N/ewGbz69IYlFFFR1CkKlvSLf717cHSGXSW7R1jNh72OmjQcOur+906r U9cgbD3rq6tpB66vf37rRNSa9d+/deHXfP8AvPvXVxXPr1yB968+rg9dP9Pe/Pqsnw9Yfd+kx9Ou 7+9derw65A2966cBp12CfeurgmuOs63PFuf99/X37yqen1J4dTY1P+++ntlj0shQny6mItrX4/w9 0PRlEgFNRp1yllRASSBYC3P+H5/x96VSSOrzzxxKdTeXTBNMXdiL2vx/rf1/2PtUq0A6DFxcF5GI 4dcVY8WPvZ60jMaZ6daaKqZ1+3jQOVBaeYEon4sFH6n/AN69p5GjAOtjT0Hn0cWkV60gFrEusjLt Wi/YPM/yHn04Pjlf1VU0tXJ+NRtChP10Qr6VH+39sC4IxGgVf5/t6M5NpWSj31w88vzNFH2IMDpO JaKOrA/syaV/2BYD/efa81Zovs6CcZWGG+A8noP5gdS6CA+NOOXOo/7H9P8AvHtuZ+4+g6XbXbEx Rmncxr/m6V9FFoXUQeLX/r9P6f09lkraieh9tsGhdZGB1//X0FKhpAqRu5YLfSD9B/re0qBalgOP R9cNKEjikckLw+X2dRhY/X3fpKKE568raHBCoxF2AflePoWW/qAP4/Pu6ivSW4fQAB59SqSJHd5J GCQwgyOFsHkP9iKNARy7fX8Kv+w92GTq8umJ38KFYgB4h/l8+uYu6gvyFYLdblRxqNueLD6/n3si hx0nBJGeHThQ0cmQrKHHRhpJMhUU9HEE9bM9dVJCojUC5fxv9B/T3YYFemXcKzN5Lk/kK9H+7D2h ht2bf27HjqV9tbup8pt/EbWydLqiqkMQ+31tU04RzTxUcDt+q8ZUE297BDpHQUf/AA9B23neGRy3 dEQSwOQf9R6DfYfaOZ27uek232I1NTZOgSpxuH3O8wSkrZKhyJ58pkpHliqKprMqyG3rez2tf3QE E1pUj/VjpTNbJJEZ7QHSeK+Y+wenQ57crE3Flc3VmJ462jwuG27W0FciXysuXzeTylRLBUQqfuJZ KCjjPBYFLXB490q1flnpGy6Y1HkWr9lB/s9BXvLD1/VGTqN1bNxUuT2hW5AVO6NmSq/hoa6KOV0y uNCqRR6onAcaTqtY/jT7h9oOP9Xp0piZbtRBPJSUCiv5/Y3+ToQNqbo2bu7bNFkdvNVPS4rFmjzF HWAfxHFZKqkkhNNno1X/ACuCRGkeGaMkFEtxYgPpTQARkD/V/h6TXEMsExSTgeB8iPl/l6KB3ztG DD7zxv8ACoZpJtx4mLMiMRv/AJU1Vka+ngkpl5LJLHTqqgc3Wx590aiFQOBFejzbJS1q/iGgQ0+z A6D/AG9nKVIZcFm1aTGVRWKOodnFTiXRw9oSQzRKZrFrWJIX8C3tqSMkiRTRh0vr+z/V/LpdxSRU CVu0d2NNktt5WpfJU1ZSqJ6qkrZIwo3JtpToV8jCrha6kusWSgQ2ImRGFP7UKQdMi/Ly8wfkf5Hp MytBIs8FAQKfIj+Fvl6H8J+XSP311puXYMlBNko6fI4HNUsNft7deGlau27nqGojWWKahyCoqrOq m0sEojnhcFXQW97BqBUUP+bo0truG5qFNJRxU8R9v+cY6D/3vpV10R73XqpWvXEce99UAp1yB96I 6cVusg5HuvTwNR1737rdOu/eut0/Z13b37rdOuiPfutEHrr3vrVOuvfutU69791rr3v3Xuuh731o CnXfvXW+ve/de66t731Ug9de/daoeve99a697917r3v3Xuve/de669+69Xrv37r3XvfuvddX9+61 UDrrV73TquupwOu/eur9ch711YU67966tWvXfv3Vgcdch70err1lU8e9Dp9TQYPXTD8/n37qrCua Z64kce/dVINB11b37qoWp4dZVF7D36uOn1ANOpqoAtmIt+f+Ke2ixJx0sRFCks2OsElvwAP8P6/4 n3da+fSd85UdR9ZH04/3j3bj0xrI64lzyb+/dVMhyeuBN/e6dNlqnJ65LIU+n5+v1t/xv36lerLL 4fDrn5A314v79SnTglVuvO1gPpf6j/W9+69I2lR69YS5/r73TpO0jV49e1n37T17xSQAeuOr3unV NdOui3v1OqmQeXWBm59uAdI3ck9cPdumuuxz711YCvUhfpb+vts8elsddNPXqVFEWI/3319ts3n0 uhiqR69P9JEEX8EEfT/if9v7SSsT9vQlsoRGlfXrPNJoFr8W5/qf6e20WuelM0oQVJx1F8yk2/H9 f6/8U9u6ekf1Ss2kDHXUjo1wwHA4P4va3PvwBHA9amkikqGX7OoEhUCwsL35+vt5anPRXKVFAoHU dnsLLwAf68k/1493p5nj0nZqYHWFpCfdqdMvLXh1iLf77/H3unTBc/l1xJ976bJJ69c+/U69qPXe o+/U63rOB13f3rq4PXIe9dWB67v791avXd/eut1p12bW59+HVmoVz1g936SHj12Pfj1tfXrkPeun B1mRCfdT0ojQ8epscX0+t/bbNXHS2OKpGOpiqFW5sLc/T23x6MFQRrVgBTqPNUqv6Tz/AIG/uyoT x4dJp7pV+E9Ncjl2LEk39vgUHRNLIZHLV49Yre7dM0qc9S6eIsQTcKOb/wBf8PbbtT7elttCWIJw o6UEEmjgAD6C1+f9f/be0ci6uhTbSaAAAB1KaQcKOT9b3sP9ifz7aCnj0qZwaKOPSLkLNLLAv+7K lv8Ab62AH+3Ps2UDSrnyXqPZWdpprZR8cx/wkdLWhowircfQAD/ADgeyqaXUT6dSJttgqIvbwHTh UTCCOw4b6D+pP9Lf09sIpdvl0b3dwLWHSnx8Ov/Q0KZMe705Zhd0AZSOeLXI/rx7LRMokoOB6HEm 1yPaFmzIuR9np0zSRFBcixH4PtUCDw6IZYigNRQjrnGkk4SnihDsxLrZR5GawHMh5EYHAHAJ9u6a YBz0UmZdbSyHsX/igPt8+pslJFSyih8qNUO1qqS3oD8XgiYclI/oT+W+n093+EY8uketp2LnC1x/ q/1Y6wTiKQLHBHMSmozEEqrITpWynkHgfi596FRknHThxw49KXaeWxuF3TiszlIqyTHYqqNZMlAk L1YMcbQUzKszJFpSZlZiSCAOObe9t8NK56Syo0sUiJTWwpnh0fvE5vD5+r2IMDO1bh2i3Fn5ZYmY NHLS4lMVAsUSt+3MKjKOPG4X1ob88+9R0EmmmKdB90dFmEgpJgfzr/gHSG3Ls3H7pBw9Z9gE1RCj MZWWqggnkmknqEVEVPvo2lu9/obA8e6sveNLCvV4Z3h71rX+X/FdJTbGQyPVmWm2vn66qnqa2ooc jt/P1CBaSSnx1FLTQY/ytOQlUoi0xji5b6m9vd6cQeP+EdPyAXYE8KAUBBA41Oa/Z0ZaHcse7sbX 1bYoOKOhx2RzuO1MlRW0iyvNX0kMUhH+UrEsbx3HJBv9fda6V4dv+qo/Py6RaNL8fOmP8P7egM7H w+V2tuuq391Zjmmoxt+hyu/sZTSoKWppc3VTU+NhnxMQlNNkBDSSTOxsVJDAckGzOrUdcA/yPSu3 KvCbW7bGqiH0xU59OAp0Xjde+6XcXYu2Nw0s1VLj8KNrUkMNWhikpkoqsVtXR+MtZFiqqiVT+G+o 4PupY61r5dG0FsY7KaJgNbavmMjB/ZTpb9o9VNXPld0bfo46GuhanmyO3KcHRV0/2iNNksavMnnd xrki0/ViV/oXDjNKdIbO906IZWrGeB9Pkfl0DOCzNO0H8Fzus0NY8Rgr0VpK3FvAB4oqJzYxyNUK qNc+i+r6D2mkQkh4zRh/q/Z0c/I5XoUsZubcnXuNbGVIo8phK5jDl9q7gj/iWxN30zt94tRRTOxX CbjiIa7xeIu1pI2uWU6UpKCCD/gPpj9v2jpJJb1k1gHyoy/Gp4fmv+rh1ByXWmB3xS1+d6ilqhXU NOa7O9X5meNtz4ZEjd6ybbtU3iXdmIhdLxiNfvFR1VkdgWOu9GCsCV9f8/8An6UwbgYtMd4RpOBI OB/038J/l9nQCOrIzI6sjoSrqwKsrA2KspsQQfwfd+PRvggEdcfe+vdcbe/V6qVPXYJHv1B1sMR1 lHI90PShcivXdvfurUPXdv6+9dWpnPXem49+z1bRUddEH36vVCp66sfe69V0nj11b36vWitOuve+ q0669+69Tr3v3Wuve/de697917r3v3Xuure99ap163v3XqZr163v3WqDro+/daPXH3vqlM449e97 60euuffutGo4dde/daz59eHvx60AeuY966dAp13711vrv37q465e9dXpjrsfT3rqwrSvWVVNr+9f Pp9VOnrmoJPHvZPVwDXh12y/6wv/AI8e68etlQePHrgePe8dUOOu1Nj9L+/eXHrYx5dSQ/HNuP6H 6+6Uzjp4NihHWI+s8WHNv8fdh29UNDXrGyG17ce98T1Rl/Z1hYW97HSdwFx1ivY+706TFqGnXifz 711skcSc9ev731qoPDr1z711up69b+nv3WqE8OuiDa3597qOtFWpTz642P5PvdfQdN6SCdTdcSeO Df3sDqjNjBr1wtf6e7Vp01pLHHHr2k3t79Xr2g1p1zCXI44Hupbp5YqkCmOswIB90oT0qDKDSnUq CQlgq/1/2/ttgKGvSyCQsQqjp7gLL/X+pH9B7TMB0IrYsoz1inYkix497UU6YunYkAHt6hu+gX/2 3t0CvRc8mgVr1GNSbWNj/X3fQPTpMbrFDnrCZXY8nj3bSAOmDM7Mc466J4/4n37rxbHDrgfe+mif Trr3vqoJz163v1evaTx66t791qh67A9+62B13711brv6e/dbrTr3v3W69d+9dbrTz68T7914kUPX C3u1emtPXIC/vRPTirXqRHCWt7oSBx6VRwk06nxw2H0PtpmJ6MI7fzp1J9KDixP++49049LKpEuK E9N1VOSdCng8mx/3j/D28i+Z49Fd3csToU46gMTe1/boHRY7GpFeuI976oPXrIguwH1v7qen0WrA dOsa6Vt9f99z7Tsano3iXSvDPU2BNdv8L8/776+23ag6MbdNeSepBtawFyOBb8j+vP8Ah7pmta46 WYpQDPTFR0/ky4iI4WaRyDzwAzi/+vx7VyvS21fIdBnb7Txd+8EjAkY/sBP+bpcnTEth9bcf63so FWPy6kslLePSvxdNdRKSdRsbcWI5v/h/re1Ea1x0RXcxZ9THh1//0dEiJgsankAKCf8AbC9xb8+y FhVj1L8LBUVhWlP9WOmDJSRRyiUIrFn1BWHoOgXII4BGq1x+R7X2qsRQnAHQP5ikiSroKSSNinkB xp/g/PrnRQtSR1OTqFEbrZKeJUCo9XIPKTpT6JTIQ2kWGsqPx7Xrjzz0B53DlYF4Dj/q/l+3pvSp qKKUS1FMs0UjX0TKQw/NhILFGJYarc+6mjcDnp1V0jAz1hpKmzFXiHkeTWZCzKmlQX8ZAubengD6 m1+PeyK0r1puDMD0LfT2KTN126aFqSnrpajBRr9vK8S1ElJ9/G1WtGklkefTGpNjwoPB90m4CnGv RfeNoSE1IUP/AJOhGxu0929ZY6p31tCSn3Lt3Jo2OzmCpXqqbMYSZSKpVeHQZkNOWurJqVxcEH8O KrFNYINP2j/Y+fSZp47orb3HZID2txB8s9DJs7O4Hc9TiMxichMYKRXTcdCqR/xmnpo9JrDUY8t5 IpIJQRr02e1xwfbQH6gNaU6RzRPEGR048D5fkfMdQOxMLt7cebxu2XrajIYmvzcNJTVtLUyu1LjI sVV1cLmMxh6aqpKt1LXJUHgj29Lp1gq1VA/1fmOtWzyQq0i4cD0+Y/ydMO3d6LtDcFNQ5qtrqrEV KwUVNu+ppnjavmqjBFDi930sE0kMDRJBogqorB4wpcHkjxKmgHCn7enGh8ZGaJQJRkqP8K1/mD+X RgNmqtJvHseAwinqs/uDCbdbBFIahDHt/btKoqK92XWorDXSMl+GVgRb2nkJiDClVP8AKvD8vn0n dtcUI8gCf2nP+D+XVdndlNS0Xam94sZAKKlizkqQU0aGJYFjhgNlX6o6yA/43v7srVoD5U6EtiP8 UgzXt6OhtDJYrdW3Ys1R1bT01bJTwPkJWTz0OTVHnqcVk1QCanqLkaWvpZG9JK29qUAK1Ip0GZ43 gmKMMjy8iPUdBP2L0VPWY/Lbk2/RVEWXaugqqjBwmN8Rk6U0M1ZVZHF1MkcaQ1ojj8zJrKOoZbX4 NTEeI/1V6XWm4+GyRTN+jQivmP8AY/z9F2x+75segw+46B8vjo6UQpj8gHhnoo5yszSU3mTXFVVK Mr6uboFCnSfaZ4icqaNXo/UigYEEfLp3GIWGel3FsPK1070Aavhhp6o0+b2+bhodEsbCQy6wwVPU rgG/HuiysDpmX5V6o8SOGpTPEeR+0f6j0uMhT7d7EpVbctfi8LvOvnAw/YNLDJS7b3VVLEDUYLed FZf7ubkiZkAqPGqOf1BkZZPb3h6dRXIJr+f+zx+3pFDcTWbaURmgX4oye5RX4kP4l+X+A46AncG3 c1tbK1OFz+OqMZkqUr5KedR6o3GqKeCVC0NTSzoQ0csbNHIpBUke6Agio6EEMsVwglhcMh/1UPof lx6Zbe99OEde97611njA/wBj/T3Q9K4QKH1656feqdO6fl13pH+2F73HHv2Ot6R69ZIwL/W/HPvT YHV0A8jXrIY1Nz9P9b3UMeHVygyesLhE+p592Br5dNNpXieuOjULjkf77+nveOtaQ2RnriYz79+f VDHXrhp9+r1Tw+OOuNve69UK+XXVvfuq0p12ffutnrr3vqvXXv3Wqde9+691737r3XVve+qkdde9 9V697917rq3v3WiOuNve69UK9cgPeurAdd+/dW67A966sB13711brv37q3WSNTIwQfUmw/1/dSaZ 6eiTxGCDieHTzJBFDSr5VaOU+kWP9Pzb+h9p1dnkOkgp0eS2sNvaJ40bLcHA6bgwXj/Y/wDFPb5B PRWCK065cP8Aj6fn/H3rh1v5dY3Fr/737sMjqr+fWG/9PeumS3p15WP+P+t72etIxNa9SIhc/wCH /E+9McfPpRGK06yy30+ke6Lxz05JWnaOm5gRe/8At/bw6LZAwrXj1jPu3TBFevW9+68BXr309+63 SnXfvXXhnrl7105w64sf99/T3sDqjsQOuBv7sOmWqadcT/re9jqjD5ddc3976rmteudhb/X916eI AFRx661e906qHPAcOuxyfejw62tS1eptMP3AT9B7ac4PRlaAhwTw6ePJYfn2m6PxLpAp1gdyTe/0 /HuwHSSSVmateok9iATz9eR9P8PbqefSKahGTXqCy/n24D0XOhOfLrtRb349WQU49e59+69U9et7 91sjHXgvvxPXlTNOuRX/AHr3qvVyvXD3vpsinXvfutde9+691737r3Xvfuvdd+/dbFeuVv8Aff77 +vvVer068FPv1erBCTw6lRxXt/T3Rmp9vSqOLgOp0agfW9hySP8AD20cnpfCqgVNaDrOrBv0/Qf7 z7rw49K0dZPgGB1hkZf0r/jc+7D16Szsnwpx6bJFAJsP+K+3xwHRXIBmgz1G926SEE8RnrkFJ4Hv 1erKhY0A6lwxHUCb2H+9+22YAcc9LYITqB6eoKYv9eOP94/w/wBt7SvIF6P7a0L8R5fy6cIoCFVQ L2v+Lf43/wBgPbDPUk9GkFqQqqBWnWfwAfS3+P8AS/H0901E+fSn6QLSmT0y0rxxZ+pB+hiZR9P8 4IoWP/Qp9q5AzWcf2/yqeg/YyRQc0XmrhoI/MKp/yHpzlnF2Or6k25+n+HtOqHGOjie5qztq4nHT e8pY3YjSqm39Tf8APtQFAGPPoreYlizMNIHX/9LQ/hkJCgn6qB/tgP8AiPZI60qR1K0EhKqK8R0y u71ddHHDHG6mdlh1ji8Q9UhubCFG9TG3IAHszt49KKD8RFT1H++XxmuJnVh9OhKr+QoW+2vA9S6q ZWq6WlifXTUAIDtyrzX8jyv9FZ5JiWP59vngeg9CvFyMnqJNNVf5RBPrELt4wTYJH47uzEsLh5Pq 1v8AW91AGCOPSg14eXTVEjJqZmIjdbrYHm5sr2b9J0g2/Pu9c9UfCjHQudPVuQxu6llxmKTLyy4j NLXUSyxQ1smPpoqeollxUkxERycIQtFGSA5Gm4v78QTiuekF6FaA63IAYUPlXPH5evR1dnZnb+Tr KAQZExCDIvjP41XQvR1KTyQU838O3NQPHGUkaa0DFhwQNLkXPutHAOk0YjomdWyrKK0rjIPzHy6C U9bRVEe3MptPPvtrsalGcnyeRip5IYsjkZcrXTypMUMsFbS6nMQ/VpjADBgAPbeuhamSDkf5ulgu m7kkjDW5AoPQU/kem3bW6s/uff2M2punGYvCbgws2bmnqMZP9hTZ6rqIaSkh8cTXiYxBJHIRrNc2 VSCPdXfw1eYZUj04dWkgiS3MsLExNTj5Z/1U6XWPweLqa1duZbHxVozOYxlDV01RBIlA+ONdHJM8 rsY/HTKYdKSodatwCPbkbIWU+RHSNmkGlkYigJr51p5dJLdlBuPo3sCprdo5Wv3HjsjJLV1mGy1b NU1lRQUsUCLFDVyeSf73GUzJFDMrEtEqgg6bFyWivprgioP+EfP59KIZI7yLROoVlwGApk+o9DxP z+3ornYW4qfd29Nwbko/L4szViuWOdQk8ck1PB5IJlFx5IZtSEj0sVuOCPbBXTg8OhBbIY4I424q KdGpwvWu4cXhsduPr771twZb+LVGV2dUtIuJz1GtZXVMMlB5ZCi5JsPJA1JKtisqsvFxd1W7tGrz 6IZJ45CY7kVjFKN+JSKfyrxHofl0O2xdy0O6dkbkkxsVckmEpMtFncLlqloMvtqoxu3KqOWbIUQe VklqMhr8TMgRyrAWI0h+GTuMZGf83p0XXELQsuqhU5Ujga+h/wBXHqDvDp7Cb5odoUeRpAJc/hMZ TxZWmioIavGy4zbEtTSVzVKx/czrKsCrURu1ioUcEX93Kh9LVzw+z7erRXUttJK0bcCTTiDnhTh8 x0RPcvX++uqsga9YamXGoXmhy1LDKImpPO9LE9dGVb7YTOhAViVP4PPtM6V7XGehFbX0N0BpbTL6 H/J69R8Tl6bcdVPJ5cbis1UUz00tPVwK2DzkbxuHjq6YrpiqOV8bqRIjDUrAge2QHhPblOlMiLIA HqCMgjBH2f6qfb0qV3Bj58ZT7N39S1uQwePMsOMqAy1W7djSTIl6nbuQkZE3JtUyqDJQSt6AfR45 LMbgI+UOf9XHpHpntpTPAQsh4+SSfJh+FvRh/gx0He7di5Pa8dLk4p6fO7VyrP8AwPdmJ1y4nJKp OqnkZlEuOysAFpqScJNEw+hXSxrQ+Y6OLa+juQUoUuB8SHiPs9R6EdIce/dKxx6zwkBwW+n0P+x9 0bgacelUBAcauHUmUePk/m9v8P6Ee6qdXSqX9Id3UIn250Xk1PHHWZHEYuOT9Df/AIj3UiuOlCuE UEZ65vVXWwWx/rf3oR0NervdhloFz1Fdy7XJ5/3w9uAUHSKSUyNUnPXkZlIKki3P++/1/eiAeI63 G7oRpPTqul1DD8jkf72PbBJBp0cKFdQw9OuJhv8Aj/ff8T72H6oYT6dYWhP4Hu2oHpoxH06xMhH1 92GeB6aKU64lSPx791UpQVp1wt79XpvSeuNve+q069b3vrRHp11791qnXvfutde9+6911b3vrVPX rq3v3Vadet7916h697916nXY9+62B13711br3v3Xuve/dernrLDJ4pY5LX0MrWPI4N/p70w1KR69 PQS+DNHL/CQenzI1kNTFDp/WPUb/AEGr8f42HtLBG0bPXh0I90v4LyK3Cf2gyfz8ume/tV0R1zXr wf6gf77+vvXWg/EefXFjce/V605JB67QAixHH+Pv3l1tACKUx1yKgcC1/wDD37iOHWyoAoOPXQV0 Fz9Px+Pfqg460FZRUnHWZJSfwTYf778e6lR06sleHUeUg3/rc/7A+7DFOmJiCvz6jfT3fj0hAK9e 9+62euj/AF976qfXr1/fuvVHXd/eurV68fe+tEVHXWkn6fT36vr1rQTheHXHQfe69UMZHXgOffq9 eC0PXiffh15j1x976b6yJ/S3+v7q3SiLOKdToSAwH0/r7abgejKEiqjp0iQsfp9eP8facmmeji3j MhyMHrPJSALcfX3RZanpRLYrox8XTe8IF9QJt/X6f8b9vhz0VyW+itR1AkWxP++/1vboPRdIua9Y fdumCOux/t/eutjrIEv710+ErnrIUCi/+v8A8T78OPV9CjPn1ib36nTT9Yz7t0wRnrr37rXXvfut 9e9+6113b37q1OuQF/eq9OBSesioT/r/AO+/2HvR4dOLH5nrOqAEBiAT9Afqf+Ke9E8aDp4AYBIr 1ld4oVtcM/8AqQf97P49tgMx+XTzvDCpqwMnp177yMqEsRxYkf76/vfhkHj1b66MxiOlDShp1nha yXDX/oR+f8f9f3VuJx09A4WMkN5+XXQBJJA/4n3rrSgsWIHWOSLV9Bz/AF92V6cem5Ia8B1G8BJ9 31DpL4NTw6zRQWP9T7qz+nT0MBJAp0809J+SPra3/G/aV5fIdH9tY0oaZ6dYoLD6f6/4H+w/2HtO zV49HkFqQK0z1IC/XSOBxc+6V4V6VqozoGB10SLAfj3sA8etMy0Cjh0h5nMeadvp/lViB/RrJ/vR 9myrqtQP6PUbXEhj5hkbh+tT8jj/AC9PNS8cas36uLafoP8AkftLGGag6EF1JHCjMc/LprR2lP5H +H4/3w9qGUL0So7zMB5df//T0L2kYR2jP7rL6ATbm31/xt/vfsvjiMj0I7Rx6G1/uS2NmWDfrsKL 9vr9g/w0HUaNTSwmcuVcgo4FmaXWRoiEoN0Vn5a3LBbe1gJMjrTsFP29AuaCM2dtcM7G5kdjTy0j 8XrWuM8cny67WljanB/ymepLM0S0w0L9wzp43aRhbR6eLWsov72WNa+X+TptQFFB1AmqC5LNJ4ZQ GBjW8qOSCkhaVtQLkAAfWwH1v7sB+zrRr6cOsMQ8gYa2ewUsfpaykpGPrzqJ5/oPd/XppzTTjoRO tqqNN87Zh89NTrNV1tLJPWSmnpY1q6OogUTS60VQ0hHLELqtfj36pFadJLpSbaZqeQP7COjO5mJK +aLL09VUYTckE+KphlaKVbyUTV9NE8dRSu32uXx7EgiKddS/VWt73VXPz6KIyUXTpDR5wfWn8j8x +fXWA3hW9e7qTHb7ONTBVGWyJhzeNSpnw9LLUTyzJT19KwkqsS8dTMXSZGYKGsRpF/bEkXeWGG6c 0C4iBgqXAFVNK8OIPn9nSx3rsHaW6KtDVzxCOvgimxO5sTMHyGMrZ6gTisMtJrStp5TJoVvo3BNj Y+260ZiDkngf8HVILiWKoHl5HgfkekXDuXcnXm8Nvdf9l1SS4ra24MTMN9R0zzU0OOy9PWy4yDdE ZUMyGchyWkDLGGLBrA+7ouk6lFD5j5/5OlBiiuYnmtxSQg9vzHHT0OlVW0ucwE8lT/v43neVcNUY 2GOaSWneql81bh6p0V8hRpE0QMKHWEta59qmZWj0sK+nRUFKv/CfOv8AgPVefZ2Ekxe9vsaOgjhk f7anipo6dqf7meOoemi8tKQkkdTMEQSKQGL3J5PtMP4WyehPYyhrUsW4Vr5/Po73VO+cHuLD7YSo q6qiGKoKbHStSyJR1e381SSYtHWp8ss07wV1YnjQNbyRMR9b+7UQnPHy6JbiF4pXr5moPGozT+XS g3b1JuDN5LL712BuGXbO+ZaSpizE1JGzUW7tv5yWOlrpsxA4kFVMKUzFotBsdJ4IUi4qXOn0r+Y/ z9NR3IiTwJ4tduaY/hOaEenlXpr2T3ZV4rdeI2n27tyj2nk2oloKfPTGWkwGRmSOmjx9RSyyAU2H kq2jk+4QkQuAqnR7tG+TXB63LaLIjT2chdDnT+If5xw6Gvc9Bj3wX2eTNPfI4jbmPlpbRVtDP5N0 QysBIPI1khlHpJKMrccG/vxmAYRkZYkfmcjpFGCXUg+Y+3hQ9Es7L+OFTPk8tkdi06fdNuDMUj7d keKjp2NDTJVuMXKxQQVEauSqX8chIC2tY+MbatI6N7TdNCqlyTo0/FxI+31HRZ6HcKNAMRuKGaen pJBFSVwRkym36gSgyTqQQ0jpItiG/p/Xj2maMhtceH/w9HwOoU4qR+XQgYnc+W229cqDE57a+54h HmcfXJMu2N3HzKKc18MaoNtbojC6oqyIxMHGostzeyuHJDCjen+bpFLbUCsjMNPwkfEn2eq+qny6 TW5NjUk1NW7g2T97U42ikf8Aju2Mgt9z7OY+rRkIkVf4niByI66JdJA/cVD9fMBUacg9LrTcalIr qgkPwsPhf7PQ/wBE/l0GKC/0+nts9HsY1cOHU6RWkgRyLlToB/1v+Ne2waOR0vlRpLdHI4Y/Z03k WNvbvRay0ND1xPvfVD11731Trq3Pv3VaZNeve/dW4dZfLJYAMQB+Bx/vXuukenTpnkIA1GnXXkbj 1Nx9OT79Qda8V/Nj14sx5LMT/iT79QDy6sXdqEua9dl3P1N/9c+/UHXvEfzPXXkfnk8/4+/UHXvG fOevB/68g/7x79Tryy0+IVHXMlfwf99/j7r06ShFQcddWB+nv2etAK3Dr1j/AE97r1oqfTr1vfq9 eK9cbe/V6oV9OvW9769Trr37rVOve/da697917r3v3Xuve/de697917ro+99VI69791sdctVuPeq dX10FK4671e9U62JPTrrVz73TrWsV+fXK/N7+606c1VNa9ZNduB/xr378undYBA65o3N/wDfW9+O QeroamteuUjluP8AG445HvQFOHHrbsTjrGuoAkXt+fe+qKGAJr1jY3+o97HTUjVBqOuHvfTPXXv3 WiOuPvfVKdde99aHXvfutU4ddj3rqwFeuXvXTgGOuJ976bPHr1vfuvUxXrife+qEDrifdumzx6yJ x7o3T8OB1Op01HWTwDwPbTmgp0ZW6F21k46f6RQoLfW/A/w/PtHLmg6EtmoRS3GvXU9RpDAWJt/t /wDW9+ROBPWri50BqfFTpnlmZgSSTe9/r/vr+1aoB0QyzO1WZuoLMT7c6Qu7N1w976ayesiD/Dn3 queno1I8s9Zhdef98fejQ46fAIHXBnPP++/1/fvkOqNIRXrBc+7U6Slj69de/dar1737r355679+ 69TrsL71Xq4Q9ZFT3r59PLH5dZgqr+ojj6D+v+Fvevs6dAVeJ6zqUsCbLc3NyBa/5+vJ90Ncjp5N HbXz6iVRAkujBhYcj8e3E4UI6SXhUS1jao6jqrSMFFyzGw/xPu5IAqeHSREaVwoyxPU5KJwD5Awb 8Afgf4+2TKK44dGSbdIB+opDdTY4QFsosBwb+2yxPE9L4bcaexcdSli0fj/XNv8Affn3TVXpckHh genXTLc297Bx1qRASR5dcVhueBf/AI170WA49UW2BOBjqZFTH6nj6Hj200oGB0uhtfOnTrCgsOOB Ye0zHj69HltEO00wOs5cKbc2/wAPdQK58+lbSqh0/h64NIv0Hp+v+v73pPn000yUoDQdYNd7cf8A G/8AX926S+IGAoOkLkmIyNQw+vlDC3/BVI/2Ps4gFYEHy6jTeHI3e6fz1g/yB6nVM/lI/Cn1H/Y+ 2o00g+vRnc3Hjsv8PUmkj1sFUXIA/wBh/j/rn23I1KknpVYR+I+lVqev/9TQaMk5Uc08LPwPU005 ubABRdRz/rWHvS0XtUY6blZpnaWZyzn/AFf8UOs8cdQ6lWnpkmomMixTFXNS/BVVCDS1iwVfrqJ/ p70SPTB62BkVPAY/zf6vXrC2RrKedkqQDYPEUX0RAEFSF8dgY0ueFNif6+/BVIx1s16gzTeV7pYR p6Y1sBZP6KAPSWPJ93Ap1U449SI5LQKllXVJJyOCUAXWxaxF7gge9+vTTjurXy6ccYtL/FcMlciz 437ig/iEJcxiSnmyGmaMyKGYDQfr9ePevM1OOqvXw304kzQ/lx6NTFtfdGB++otmtX7228uNq5p8 JVSQU+aw4RkaOpwVbMsi5KGMWtEl2IQiwPPuv4loTqP8/t6JTNDLRp6Ry6uI+E/6YeVfXoRa3O4v emEyGWwAFWaaaBs1tvKpBTV9Cq0j001HkqSpiaaUtbUCPQVvY+3no65PcB/g6S+G8DqsgoDwYZB+ YPQJuczsXKJVYynrarbUkuSyL7UjqhDLhw4XyV+DnLSFhAQZFQEoV4I/ITMoOG4nz/z9GIKXK0kI EwoA/r8m/wAFehx2Duuj3lmt4V1b/B92YXc1LtrIZehlGuvlGLoJcU0dbFOgZKqH0XiIOouWDEc+ 9KJGFa/qDiD5j1r/AJf29I7iMwLGrKysC1D8zmo6RGQylX1ZlDhqVKzcPTtVlp6qv23TIYMxtyKq NO+ZkweQDpUwu2lrJ5SnoB4/V7cV1J0n4a5H+r/D0+oF4i+IdN2BhvJvSvQM9w74w2a3pi8xtCsn rcRi4qSvxdbXRquUec1KzquWfT5JK+mSmijkLFrspIvck1k0+IfDrT59GW320kdtIk60kYkH0/L5 dd9f4Pc+4a/I7r2iKRsvj6jJZrL4zKoZcZWwR5Olq6ekqA5VJis0ykX0sG0m68H3YAsKgVHHpq7l ih0wzgmKgAI4g0IqPt/z9WI9OdobZ7A21DFhaQ0meplan3jssz+HMYOUtHHJlcWKhUmyOCq5rayh L07PpcC1z4YYNXyp0R3lrJA4BzEeDDgfl0IW+Nq0G+cXLRZLD0G5sM1ZDR1WOqYxSZSjx1E09JVy RTuwlaSml/ehkjKtqAHIPu0grR1OcY/w9JI2aJxJG5V/Ij/L/qz0UqPA9hdSY7fIoJ17L60xWfwe Mq5PJWSbu2pjvt8VmsXmaBNDJU01HShYZYbsivELBFJPu2lFJYUZf9WejPxbe7MBceFct5imliDw PoT6/Po0sGV2/ueho9+YTK025NvNUV+UpqnHny1cMnhaOSGqpG0NT1d4V1RyBWRr8WF/boqCpGad Frq8LGORCr04H/V/P06Jf2J09RbsrtyZPGBaCrpYdv1dHkYYbR1C5DBU1e+Nr6IFSXWBjJrQF2cE G/ttkqdSDtIr+3o0tr57dY0buXNR9nmD0WKrx+6+rss+Jz+JWXH1tPTVU+OqSZcNm6OsiMlNPTVC qyRySRKSrKQ6lSCOLe2XjDAH8Xr0fQXEc6643rnI8xT1H+XpypspPStR57aWQqg2KYzwVEEYXcG3 /M41Y+VGdkze3zLqCwy6iIz9QCymocrRZP29Vkt0fVQAg/Ep4H5/I/Mfn1x3LDtnceMm3NjIaTbW 54EFTl9vUYY7e3BTvIv3GY2rJc/Y1FOZg1VjmsIUDNHZVKCsmKY7SafZ/sf5T09t1zPbzCGRi8PA E/EP6Levybz6QCOkkAWJrm13XTyp/q3+A9pSCGJYdDhHjltlWB6niRTh9vTZKmlyD/vv8fb4NRUd FMyaXoePWNgB72D026gdcLe7dM066t791qh69791rr3vfXuve/de65e69OAGnXre/daIr11b3vrV Ovce/deoOvcj37r1SMdeDEcj36nXg5U1HXMStqu5uv5H04/4j3rTjHHq63DhgXNU6yxny3AHI/pz x7q2OJ6URMJq0HXZT/Y/63+9+/dWKdcCp9+6oUNeuJHvdeqFfl11b37qtOvW9+69Trq3vfWqdde/ daPXvfutde9+691737rXXE+99VPHrr3vqvr1xLf097A6ozny65BveiOrK9fPPXO/utOntXXNWsfe j07G5B+XWQsPeunS4pXr2v8AHv3W9fl1wb34dNvnPXC3u3TRB69b37r1OvW9+61Trq3v3WiOvW9+ 69T5dd29+r1sL163vVet6evab+/V68I6nPXiAPfq162VC1HWM+7jpO3XH3vqlM565j3Xp0cR04Up JNv7Itx7Zfh8+jO1Oo0/D09iQKqqn9Of639ptJJJPQjWRVRVT06jyWPPF/z/AF93HSWWjZJFemyV l1f4f7x7fWoGeieRk1GnDrGQtgb/AF/A/H+Pu3VCFNM9e8am2nn+vvX29e8NTSg6zLEAPV9PdS3p 06I6DPXFm+v+F+P6/wCPuwHVSaZ6isSSfe+kjEknGOsZ92HTLYrnrjq97p1QP173vrVa565L7qen ErXPDqWiKQCTYXt/sfwP9j7pWnAZ6XIoIHp1NSH+gt+f9v8AT20Xr59Lo7YmmM9QKr0PoP6vqx/p /Rbfiw9upkV8ui67/Tfwz8fn1EJP9fbnSEkk5PXY9+62MjPTpjqctKshBsvPPFx/UH2xO4CkefRz tVqxmWUg6R06zuL/AF/px9fp+Ln2njFB0dXTgefWENpPP0t9Px7uR0wrhD3fD156gsQo/H0/P1/3 v3oIBU9ae7LMFXrn9eT/AMj9+6dyaEnqXEAoOo2tyf6WP09suSSKdLYgqg6j1IjlRm+th9LWsfp/ xHttkI6VRTxs+T2dSWqUUWHA+lz9fdAhJ4dLGvI1GlOHDrEZXkYKo4Avf6fn/e/dtIAqek7TvMwR Bgdc9A/tEkjnj/if9b3WvHp3wxguSWHUCoqRr8cdjx6rfk/S3+w9vxx41N0WXV4PE8KLJpnpIV9z VzE/W6X/ANjGnPs0h/s1H+rj0Ad1qb64J41H/HR04QU7zmMC9iE+g+npH+29sO6oD0cWttJcGMKM UHShAjo4iBzJYAAfqJP9o2+lvaLulb5dCcLDYQkDMvADz+3r/9XQgNGskiwIqI2lpZSLuyR/pRbs SWd2N7cWA5911UBPSdQTXqNWVStMXRNRZIo21AK3ljjEfoC8hU/3k+/Kppnp5jqpTAp1yWtKRzF4 Y5HePwIZhqES6NLCJDwH1G+r8e9lfn1UY6aW0k+i6j+hN+bfUf6/u3VhXz6nxlvHThgw0xOQLG5D TMwIB/Df19+6Zf4mp6/5OpiRyySUaQ+mWXSI2XizRzeVZCeeI/x9bAe/EgA1HTY+I4x/n6Pf11V0 u88GatK6OiyGFmqcfWyTVU0Va0lfQr/D5ftIyUs1X6RKiaHB9ViD7YoG06TpZeiG8ha1koVrG3A+ WPL5Gnl+zrjnOu8Xk8bS52WprcLmpIVSn3RiJoRVwzqoEkWUgifw1+LB06gWB0ngD6e76iQa9Nx3 To5TSGj/AITw/L0PSCqcrWR7gpdnb8iXG5tf8nwu4MNMsmCy9LXwCCCooo5ldBUyM4Jh1BXYlSFN r7oBTVlf8HSnw0aIz2uU/Ep+IU9fl8+oC0dXhshidwYSkhxu5KPGzY/JUkb/AG2M3cMXN4KyhrYy Q2LrKqGH9tzfTJYEkc+91AoQOrKyurxSEmEmo9Ur5j1HqOhW637G2luSufFzuaDOzVtHI23twUl8 m1WrtG8FL5YhTV6wxsbKCJXjJ1RgC4ZkQmjoe8f4Omri0nhXVTVD6rw/P0/wfPolu99vVNPu3ese PovDT4Gsaevgj4SlSSenhkkSM2tD95UiyjhFYW4HtxTqAqOj62lX6e2q9SwoPn/qHRgPjhJlN2Sd k4+keCGrn27NlGSKSKKVTTSY15JEjcqXppxQCOUi9vIL/W/t+ME1WoyKf6v8HRXuyCMW7AEgGn+G n+Ho2uY6cx+587BnMHWVWz8rSYeon2ruvbEv2VfRZIaMnKmQEckf38c4q2idJb3guoPuzoKigwR0 Ux3UkKuhAeMnKtkEVp+X5dMG1u7dy7Di23H3LgqiTbuSxsb4vtXbtFUtFJHXKqPNuXFt5yC9VEwe WAqrObiP6+6BafL5/wCTp1rWK4L/AEj0lH4GOflpPn+fQ0YfKUNZuLsBMDV49qSfE7E3PTZagqYq /E1FPU4+txrU88cZaKoilGOHnRubta1/dyPi08KdIXUiNBIKEOwofsHRYt4bV3H19lq3szqiSi27 WTTRfxbZqwM+0920uVqKbG070eNldKcu0taSwOl4ydSMp5LQGn4Wz/q4dGFvcJMgtbwFk8m/EvE8 fTHQkdcb+252PV7kxFZjG23vEU23/uNlZlxDXPkMJhqjFZGt27KzR/xSkpZoUdFuJ1XhgwuxVo6v grmnTNzbSQIjo4eCpow8gaUB9D1D3dsfH1lZkNr7joxX4fN7WoZ2lYswxNRgs3kYEbHyy2bGS6Mi ukgkMePpf2060IBPaf8AJ1WKZkAljbTKrY+dRwPrw6Ib2B1XunqutgyUFQ9Xgqg+SjzFGCywxySM sUFeqE+NpENtRGkk/g2HtllwA4qD0IrW+juu0ik44j1+z/N00UFXj9wU09LRU9PTV8xikqsC5K4/ KTqjxtkcRKo14uvpoBYabmS9mDC49s1eLB7ov8HSt4w5Dg6ZV4Ef4CPMfL9nQcys1FWzpCZF8M0s aiTQZAquV0S+NniZhazaSVJ+nHvWlZUHmD0bW11PbssitSX/AFV/LriZDJ6yblibj+h/w/w91ppx 0r8Uy0kLZPl1wv731Spz1ySKSQkIpawubD6Afk/096LBeJ6skMktfDQmnXWhrE2Nl+v+HvdR1rw2 oW04HXH37qnXVve+tUHXre/V69pHXMFSLXsf8foT7rQjPToKsNNaHrtCoNmFweLf4+/EE8OvRsgN H4Hrp1KnkW/3n3sHrUiaSajHXH37punXvfut9dW976qB69Y392HTEmOHXFHZDqUkH/A+9kAihHVI 5XjYMrEHpyiqEkUiT0uPo1uGH9CB9D7YZCp7eHRvDcxyoRKdMn+HrK0Y4I5BF/8AYf8AEe6hvI9P tHSh8usBS31Hu4ofPpop8uuBHvXVCo64ke9jqjCnXH3vqlB11b37rVOve99VI669+611737r3XH3 vqhFOuj731U8OuFvdq9NFevD37rwGeHXMH3U9OqT1yB966cB65X966vXrv3rq2Ou/eut8cHru1/f urBajrmEv7904Er14p/t/fvz68YusZHvYPTLLTr1vfq9a09eA966sB13791s9cCfdqdNFqdcCb+9 9Nk166976r163v3WqDr3v3W+s0UpQ3Bt7oy16UQzGM4PU2Kdifr/AK/++/1/bZQU6XxXDE1BPUgu Tzf23TpQ0hYVr1BZblj/AI/T2/0hKVJNeuUcdzyLe9E0Hz6skdTw6zeMq1xwLf8AE+6agR8+nTGy kenXnYAc2/wH/FfflGevO2M9Q3f/AI17cHy6SSPQceo5f3cDpG0hNc9cSb+7DptjXroe/HqoFT1z Av7r08BXHWX0qATyf6f8V9149PkKignJ69rUqbsfrwljb/Xvfj36hrjrXiIUOo59OnOlqEWFy8wL xp+3Gwtx/TV/a9suhLABcHiejmzu0SB2ecGRF7VP+fz6bJpDK5cgAn62+nt9V0ig6JriYzSGQjJ6 xW976ZoepdPBrIYsoUMLg/Uj+tv6e23egpTPS21ttZDswCgjj096wi6V5U/7D/bf4e0xFTU8ehH4 ixLpQVQ9RSwJuT/iB7vQ9F7SAtVj1jlkNr/QDj+nuyrnpuaUsB5L10kqfh1LGwt+f959+Kn0x1qO VBwcGTqfFyAL/nn6cf1/23to4z0aQVKququepgjBW5P+F7/42H+wsPbOog0p0vCVUmvy6yrHosQv IFgf+J90LVrnp0RslCF64yRFgDf6fi/B/wB6597VwCRTqskLEBi3XNZVhVtPLBfz/wAT/sfftJdh Xh04k626MV+KnUSWtZUsthI97kH9I/rb/H24IRWp+EdIp9wdE0rTxm9PLqElwDyDI3554/r/ALf2 8f5dF0VQGzWU+fTRkIWWVXIIEq2B/qyfUf7Yj2phYaSK5B6Id1t5FnV2XDrj7R/qHS0jSGjpo1fS rmJTa4DW0jkj8D2VMWlkYjhXqRIo7fb7OISUEpQGnnSnn6dJerrfIx8ZIsTdgeG/1v8AD2YRx6QK 9Ay+3DxnPgkilc+vX//W0MRGlBhpMpPxU5KplhoYT+vwRAK88h/EYZrAfk3/AKe2jUuqDgOm1HaK dJR21MChOoW5/JIN7/4G5v7e62BTjw64MxNhz6Rb6/X8n/WuffutgdcPfurdOcjOqxK4KsKeFbEA FV9RUm1jchuP8D78OkxyTT16zGslonopo2HmijUhSPSsZH6WB+pkN/8AYe9GhqPLqyLUsaY6VOE3 tWUOWoMjTz/wyqoZ56uOpiUOHnaJooYpI2UrJTgOSVa4vzwefbXh6alT3U63JGroySLqRuI6NnsT tLDbwwzbUMGPweYo6qWpkQzCSHMLWAQT/YLIgafSp1NET6L8Aj3WR2VO5e0kcPL7fkeg7dWL27eI pLReXqPt/wA/TfncNia6Onw2Uo/usbFlMd6YGqKqXHxtLV0ldLTTDRJRIspBMLEMki/ke6JINLAt ny/2OqwyOtZEeklD+fy+f29Zdu1cWBWDZW8qqOfE5avmyWx+yJ388UlYQ0kuDzlXLfRWStGqKshU WIB4N/auMh1KHzzX/V/MdWkXxqzwCkiijp8vVfl5465dg7Kxe8c/iaSsYYzJztQRUm5sbG7+HzGW KGoqV1eRqSCp0Exgho+dDD3Z+4jhX18j1q0uZLdWKZXNVP8Aq408+i/UFOcNujfe198ZposvW0eT opstPMaylymQWjqKimaqyk7idEyMrQyJIwJZrByp9sgZwR0cyMZYbWe3j7AQacCBwOOGOkDt6app KatrsOuZhz+OcVi12NLrTQYuONhWx5F0lTRTM1tVwwcDSeCfdq9KJl1MiyFfCOKHiT5U+fVlPxr7 KzG/MllK7O5LFRbrnqqfITbXXH1OLRcOuMpI6DLUrzV1Z95RZGnqApEaKItAa1mDe96yTQnyA/Z/ m6De4WyWxURKfBzmtc1yDgUPQo4LL4Ku63o9r7ipqeGiqp9zbehpMhoaiq8NRbjy9DA2lg2kCFFC OpP7icge1gZTGfmei9tRkjdSdQVTXzBoOi7VWwt2fHyuyG9urKN9xbar4qWm3ZszJBpJJqCCY1VP WUFWl5SI5lYDQrvGrkFWU+08kTIA6k48/wDVxB6Mluo75Vtr19Mlaq49fQj7OlDX9k7P7M66r8xt wtS5TGVODrMrtPXrr8NS0u5sND934yiqETWdLR3WQLZgPxUsCDihGf8AL0w1rNazxrIO01AbyOD0 pN5bH23veGNsjFPR1tPVVNVjNwYofabixdWaidnlpauCQBJvuEj/AGWBBB/ssAQ/QSKrA93TEE8t uSUI0kZBypGcH16COo7G3zsPPYLC9z0iZDESbdymAo9+YqJq2euohkMbkaWuy0EZeKoagkp1SchR Pok1HWQSzbagArDyx0v+nt7pJJLJisoYEocevA/njodMbiKPdeISsllpZo5sZUUStJAtXjM5haxx PjaqejYeGrpJaWYoWFmUqPoR78qF0B/EK/s/2Oi9iY2IyCCPtDD5+Xr0RTfXSsm38TJuPBeaakpM ZDV5CkqXankgKgLPl8bMT/lFGk6MphYh11C1+LMupUNX4f8AZp/hPQisNw8WeOCX4i2D/MA/P59F 20+6V6EmgV6zxoptdtP4Fxx/rn+g9tknpXFGhpV6HrzqFYqGDAG2ofQ/4i/49+BqAadadQrsoYED z6fMO9KnkEpHkYAqp4vb6gH6e0lyJCF08OhJsMllGZhOf1CKgf7PWPJ1EA/ZgQA6mLtxwPwvH1Pu 1uj/ABuemd4urdSbe3joamp+XkOmIn2rp0Gy3XgfeyOtBuuV/der1HXE+7DqjefWP3bpmucdZAxI 590Ip0+shYCvXL3rq4z1737rfXj791ojrC3u46TPx64e7dMnrkvH5596PTiVHA56daWZfH42J1Xu l/pz9R/vHtNIprUcOjqznUxeE5OquOvPqYmw4/HB5/HvYoBxz1ZqsTQdcPHYc34/J/r/AIf197qO HVNFBnrEbf4f77/W97p02SM1PXWn+nv3VdPp14r7914rnriR79XqhUjrq3vfVaHh11YkgAEk/gfW /vfWiOs/2lUeRS1BBIAIhkPJ+g4X6n8e/VoK+XVTToQdodM9tdgTpTbI613zuuWR1RRgtsZjJIGe 2kPNS0ckMYYkWLMByP6+9jI1KCR8s/4OmiyAV1jTT1/1fZ0afbP8tD5j7lhSqbqsbbpHBYz7r3Jt zCyRKGKs02PfJTZWHSR9GpwxHIBHuhlRQSWx+3/B/h4eVa9MmaLyNfs6lbr/AJZXy52vpMOyMDum M0/3Dttjeu2qiWMAFmj+wy9fhsnPKoH+6YJAb2BJ91FzExADfyNP29WV0YVoR9vRTd99M9sdYVAp uwuud5bPd2KwyZ7b+Sx9LVWtdqOsnp1pKyPn9UTuv+Pt1WVxqVgV9RkdXBXgDnoNgrE2Ctf6WAN7 /wBP9f37q3WZKapf9NPOwP0KxSNf/Wsp9+6stT1k+zrPr9pU2H/NiX/o33rq1eu/tqhf1QTKP6mJ x/vYHvXTyitPTrIsQP5590Jp5dKljB6zBAP6+6lq9OhPXrgyfkD3sN5dVK0z1HYAc+74PTLADPWM 2966aNOuve+q18geuiePfh1pjjPWI+79Jyanr3vfWuve/de66P09+60TQEnrhqH+PvdOmvEHp1yF z+PejTpxSxpjqTHcEf0/Puh6XQgg/LqZfi4ub/8AFP8AjXtumc9KqinXCNGLXPA/HvbNQdajRmPy 6kgafzx7bOelCjw/PHWKeYAWB5I4/wAPdkTzPTVxONNK9QC5P159u06QGQkdcCfex00xJ49Y/d+m DxPXXv3WuuQ96PVl68Tb36letltI646z/r/4H3vT1TxST6jr3v3WqGvXIe9dOAEdd+9dWyeuXvXV x5DqfEixo0xdmK2AQcBiTbm/Nre2mJJC049GcMSRxtMZCSKY9a9ZJauJfwXa3CA+leP7Tf1/1veh Gx+Q6vNfQJQlSz+nkPtPr9nUNqstYqqr/UfW/twR0rU9IGvNdCqAdYGkdzdj/wAQP9gPdgAOA6Ya V3JJbrq5vf6+906rqYmpPU+jdwW9RA0/Qnj6+2ZAKDGa9Gdi8gLnWQKdPdM8jMAwFls4H4/P+39p ZAACRx6ENpLKxAcCgoeppk1BtLLZf1H+yD/qb3+vtkLQio6MDLrDaWGkcfQfLqDLOZGCpcAcX/B/ xH9fb6JpGePRdNcmRgqYA8+oryqpIuXf6aQeB/ifx7cCk54DpHJOiEjVqk9PL8+obTRqzXJ1fnSL gf1F7/j24FJA9Oi9polZiWOr5dc462BGu0buP6XC/wC88+6tG5GCAenIb+3jarRMy/bTrBk8gtTH FFHF41R9YYnU9wpW1/8AU8+3LeHQzMWqSOku87ot3FBDFDoVWrWtTwp+zPUHyO/qZmYsOSxJJ/2/ tzSBgDpB40knc7kk8anr3v3Xs9f/19CHLVorHpkpSzUdFTQ00AmQI76UvNMyfpjMkxY2/ofdVABY niem/LPHphYFSeNDccAcD/W936tx+zrH791brLCgd1UglQC7BSAdKgs3JBANh711RzpUnz6mu2pg zX/RECD9eIwPz/qVFv63926YNeH29YKuNlkudTBgNDnkFQq2W/0LIPr71jNOnY2BHl1gaJ00BlIL gFf8Qfpb+vvXTgYGp8uuUU09LNHNDJJBPTyLLDLGzJJDLGwdJI2UhkdWFwR79/g60QrAgjB6MZtb uKOrgo4tzKj5Wmym2zO6xSpS7noKLMpNULk/tuYsrHDO7eYLaYLZubApfA0PVPgrw9MeXy+XRNPt xRyYR+kQ3+1NPKvl0cXMbQwlbt6np8w0dTtXe4ec0CUoDYivhmaNJnWMD7Kog8ilJlt6GGvj2oiA 8LVXBofsp0SJJIkqsh/UTgf9X8x0W6mztNsGpyG2971mQr8Thnozs/c1IjTPTinrI6o4LJCBJXd2 o1bxudS3W36SNLiMtGDevRmYzdhZbcBZT8Snz/pD9uegF3UmV35vjM1dHiJMbV5KOTLR42vmjpp4 8dR4mOoFRI1SYVMlRQU3n0pcEvZLgD22AdRx0cwlLW1jVnqq4qM5r/nx0m8PkstTU+WwUORpaLH5 FRLk46mRI6etOHiq6iGiWuijkkjarBeJVR0SdnCsbW97rQUHmenJEjLRyshLrw+VaZp8uPy6O1sz YUW+MPhc5hMrkevew8LjcRNs3NRlqSmShjoalIsPX1DmNZDrMShj9Y3NxpNjcRqwoThuHp9n+z0H JbhraWWNlEsLMdQ9T6j0PHqDtruvI7doarr7vLAvGtFuXcKUO6aShijqMBXVuTmq8tR1eMpYIDVY 6XJSPPFLCSQshUKy/StSoZAe75/L5+vV5bKO40Tbc+dI7T5inr6jgQfTo6G2EqK3D0Ro6mPPYWpj oanbmeh8FXGaaVnVK2ld42SRIYE4QqzLYgj+iiGUMjA8P8B6KJAQxV10uDkenRUc51FhNyUVNmNn 1NRtjd+NbL4msqqVJY6TM1uJz1bBPHl6SMR3ppXpk1/W/p4IFvbUiDOngcfbk9L4L2SKiSqHgIBo fKoGQfI9KTZvYNNW1tTtTfsMm0N5VGSkmioPtXjoclUisjnXI4DIMEp61JpD+jWJFB4DW9+jOldJ Jp/Pj/kp1Sa3IUTW5129BnzHHDDy+3ofPtIIKzE4fKU9BnMH/DN5w5GjrqcTI9LksbQyPAPIhlVP NCDrIDCxNiPauPtFCQyGv8+kdQQxGGAFD9h/ydABkNk7v6yEFf1karcGxq2BMzl+v6mrE+RoIGqI qiuqNmTyhp4WkghVtHqSVCRpP4adGCdh7SPzH+fpaJorntu6LOKAP5edA49K+fTGN1bf3fsfdmKx cnnpMpg92aKasjaPObTy8dFWy02Ey2NcyuGrZ3fwureN3jCryLe2iQUkHkan8xn+fTsUUlveWzP5 OmQcMKgVB9AP9nqu+3tLXoe6eu/eurddE+99VJ9OuQJ4t70R04rE0p1xY8m5597A6bkbJqc9Yifd h0nY1zXrwJ9+I62rEEV653HvVOndQ9evce/daqMjrhyPe8dN9wGR14E+/U60GPl1kB96I6eVuuV/ dena4643PvdOmyx64G592HTTVJ+XXG3vfTdKnrmPej06vHqXGinQSbfk/wCFj9P9f20Sc9GEca0j atOpMs1v02H+tyPp7oqjz6UyzcSKdQWd2+rHk3t7cAA6QNI7Vqcdcfe+qddgkfQ+/dWDMOB6HvpD 40d7/I3KTYjprrPcm95qQr9/kKCmSlwWL1pM8Zyu4MhJSYXGrJ9uwUzzoC1h9SPfqHJHVzcKi/qc erYOqv5H3Y+Sjpazu7t7anX33NLDONubPoZd+7khqDJ+7RV9QtVh9tUytF9JoK6rKtwY/dG1immM semjdHgkRJ6Plsz+UB8QdqwRrmsZvvsGtT7eSon3Tu1MPSSTRsGeKDH7doMbJBS1RUqUaqlkCniS /Pug8Y1BAAP24/2fyPTIlnc0wPy6MjtX4Z/Ezrymp2290h1pS1ENQBE2XwI3dVQFVIvFkN1z5ytM 1+A+v/e/dTBMxOqRgP2f4P8AV+zr309w+S7Z/wBXkOh+xW0Nk4dZXg2XtlUMMQWm/u7hKekgCqEE miGjQaQo9KsePx78LcoRSZqelTQfzHT6WL0oeGcVNM9RMtnMdjR4KaagoqZVN4aUU2PijC28X28F BHGpjDsdai5A559uNEnFmLH1OT/Pj06bIMSSSTjP8uOfLA9OkPLn/wCM1E9PSx1EjPFoEyxSKZZQ CxdnZNLqb6bEe7GOGg0HPSYRKhyvSfOHmmVZzTfbhJJBNUVNQQSHurReMCyup/SBxY+2iooRTp0o lD2ig6c46PFGlkp8nFS1dFVQvSyU1RaopZEIIkFVR1EcsDQuGK6SrA39t+CC4KVD+owekzsK0UDT 0HVH8ffjx9+9fF0x1Kla5apknp9j7dDVM2lb1DxyULQvKL/qCA2v9NRu+sEtKav20r+3j/PPnw6o QR3Ctft/ydCxhet9g4+i/wBwmy9r01NAAC+N2zgKaGIEawY44KBRAIyL3S1/dfDnU1EjD8z15VkG RWvyxTqQ20do6ZHXEbclUopkpRh8YzO0iIxJjej/AN2OTqH9P9f3po5G/wBGbUPmaj+fVhBIckUr 59NGU6w2FlFSGu6/2RW+RCPDV7P23Vgto5CJUYyVW4H054/w9piso4zNT0qf8/n1tYHICioA/l9n QSbh+Lfx7ySNT5z49dTTwVBV5Ps9k4vAV07uCpnNXt2PFVekhvqJAbj/AGHupMvFXNR+f+GvS5LW YAUlYfn0XTeX8tP4lbmheGh67yuz5vIxaq2TvPNJOpcaz+3uQbopQFYW06FAv/QAe7gzDJH8v83T paeId0hP2gdE/wCxv5PmGdK6o6x7enxlWZA+Pwu/sQJ6E04F2Rtw4Ay1UkrXsp/h6rf62978UqQD GadN/VOxAZKn5V/y9Vid1fDD5FdFrPW7z6/yFVt6KQJ/ezbDJuTbh8jSiFZ6/Fmf7Gd44tZinWOR FI1AHj2pSRGwrdbdwy1oR0VAn25Tpgtwz1xv7tTqgbrsn3oDrzNXHXD3bqnXfv3Xuve/de6xyfQG /F/p/X3Zf59MzcAa468lj/sPfmx16KjVx1nHts9LFoOpUSX+v0/33090JoOlcSinU0IoAH+x/wB8 fbRYk9LhEoUVPXXABt79k9aIVQaHqK8h5t/vgPbgAHSV3Iz1EYkn24OkTkseuPv3VeHXBj7sB0y7 cc9dC/vZ6qoNK9d296r1bT69e9+639nXAg+7DphgePXQHv1etAdZAPdenwOuQU+9V6cCE9ZGjZfq CCRcD/jX1HuoIPn060ToMih66K2C3Nza9v6e/V68yaQpJzTrlLOZAqgBQosbf2j/AKo/4n35VoST 1ua5MgVVWgA/b8+oxN/bg6RMa+XXYHvRPVlWnXL37q3XNVv7qT06iaqdONOqixN7W5/2HNvbLny6 NLZVVhq+EdZGynjP7MYDC6kvYqV/wH1HvXgah3HHTz7yYz+hENQxnIp/k6hmqYtqF1B58YPpufqb fn25oHn0gN4WYsKgHyHCvXMTswsSFH5PPA/w5960L6dOrOzChag6xSyKQAl/9qY/Vj/xQe7AHz6T yyqaCOvzPr1H926T569791qp6wS/Uf63txOB6SXJ7lHy6kQxsyKQOOfx/T3RzQnpXbRl40NMdZDE /wDqT7pUdPmJvIdf/9DQLm1O92YNYBLAkABQByR9bkX/AMffh69N1wOozEsefxcAfiw/p731cY64 e/db6lRhFicklndGNlJHjW4VSxBFyzfj+nPv3TTVLr6A/t6k1NjNKebFC4sb2JjVvqSOQT735dNr jT9vRgI9qYDPbRxIyUMWLyIxtM1FVUUUyTzExRANUwxK1PUK6r9WVTck6vrdsH5fn0WmaWK4kKNV dRqD/qqOkXvDqvdOyZMfVVEC5vF1VMk1BX4xJZYiTQtWzRy0w11ELUK3aQ2MYte/vdagg4J6VwXs M+pa6ZB5H/P0FTR+QlwRc3JF/wA/0/2Huw6VhiMU6jcqb8gg8EcWI/ofwR7105UHo1HWXd+SWqwu Oy9TBT1mOrWanrJJPDRZiirKaPH1mHyUMmqkjkqECus1lXUpvYnlrRoroJ0+np9nRJebcqh3iFUI yPTzqOnjsPEpl8dkqOknUiuhWqhpo4o5RFl6SofVRGrSQNJEtPEmg2+l7fXnytViB0xayGKRHYcP 8FOPRW1pUgzFLQ7gkraFEq6Slys0sDyVeOpRKkU7JAzaqk09H641BAYWA459348D0f66xs8QBxUe hP8AxfWaspsZ/FMjHjp5DQpoTHQOJ55Mo6yQxinRoEjYxyzamViFBAFube9/IdVVpDGhkUa/P5dH d6/r/wCFhNj73z89JHnpahttZ2aKOLGVMcO3JKXHYTJ5WMxQ09f9xQx0qj0mVpQQbj3uuniMV/1f s8+g1cIJS08CZUVYeda1qBxoePy6GHfWD2zuKq26NwUVPBQZTEU1PU0FWWK08qxwVC5GOpVRVihl pprGQllDqR+D722k0b/VQ9JImeMyeGxDA1r0isvtffXS9RS5XpnMCr21V/xCfI7Eztb/ABLDzQU9 VepqsbLKyfatJHIit4Xikj1KSebe/AHJ+X8v8vSlLiG6qm4J34o44+lD6/b0I/WPZu1ez8bl3kpa XaO5qLM1ceW295p5szST5KQMK5U+3hlyGMetEkcsioZIGZfKLEMbI2nWXytf8P8Al6YurR7Ux92q JhhhwPy+WP29cO1tkUG79vR4LccTqkmSwRwG5cXSiqlpHkyApaiWnmjRws80MgV1HD6LnnkONp0i vDFD/n6rbTyW8viR01UNR5EUPSfw2c7S62ylHQ7q2/lez8ZSfwqDGbq2tTUr5EYdqSoxtRTZvFSO k9ZmIafT4pAzNKIrNc8iyF42zkcP5/6h0662lyGeN1ic1qrVpU5qp9D5jy6V+K7AwmfCz7Zy9JX0 iVVRi2MktTDLHC70s8cUq1EdPXYWuSoqTCYZIggLlQSPdi6iuk9J3gkjISZCCR+37CMEU8+g/wB4 9I47Ny1Oa2XkKrbm9Gy+fhhykaOuMyCVOSn14XOwS+Mo0MdS0cdRYrdAbmwIYZVcOAc+n+T/AGel MF60RRJFD2+MHyp+Jf2ZHn1WpPTyU80tPKAJYJZIZACGAkico4DKSrAMPqOPaOvUk6agEdYLe916 oV64N7sOmXBFc9Y7H+p92r0zpPGp6483tyfe8dN1YGlD14XPv3WxU8R12ePeuPWzVSD5ddX9+p17 VSlOuV/fqdW1dde/daqevc+/daqa9dg29+p1YNTrmD7r06D10b+/daNfy66976qKHz67t791unXY 966sOHWUN6QPdaZ6UB+wLTrv8f7z711alR1w976ap1NoMdX5Wuo8Zi6KryWSyFTBRUGPoKearra6 sqZVhpqSkpadJJ6mpqJnCoiKWZiAAT79XqxWgqTjrYp+DX8lOWv/AIT2f8zzWYPFtTQ5PDdGYqoM O5K/yo0tFNv/ACVM0hwlEPRI+NgJq5F9Erw3ZfbgQcWPTHiFjSPh69bA+N25s/r3bdFszYGy9vbG 2NijDDjMBtXGUeHxEaQwpH5Xgo4ohVVZCrrml1zzOCzuzXJsrAeWOnEiQGrZboOMzmNM8scR0Jd9 QgXyPEgKlJmd7kaiOFvwPb4uFpQ8elYKMPQfZ0iq2fOVxInkq3hYMYTqLMzCxikMcYurBBwPr9fa CSRXZq1A6cRYgQQQT08Y3B1MMaz1dRF4ZlQqkszySkOQyEs3JYkG9vofbugFaAkjp1WINadLN4op oPtZNc5qY40aFY1UyRwklf21/sqT+q/tp4CxoSQR074tBlekvVYnF0TpL/CqR3iZg6yQ63vKwJbW 40qeLWHuogIxXpmWcAGnHoOs5XbkVpjjMfS08NNHrYRusReVtVolFgGkIOqw90IKmleiyZ2wAcdI b+I5xIvJU1Qqp5ZvHNBHCbI8rBohwtkMdjdj+B7ejSJgNTUPSQkipPTtDNPU3p62khkme0ZkkZ0V Yhyrq62vPb62+o9vqsaHHn1TXXh1mhloqecxIiKyOVWndmZ5EAKs6SE+gKeSD+Pdg6AtU8Or6iuR w64yZKvpFl8FXaLTZ4YwVDqxtYsDpdjcAfS3tM8zEUp216M7Z1AFRg9NuM3Eq1oiyRqYolLtdWUt UO36Y/Ogvp5uQfpbj3pZADWlOlzLVSAOl9js3i1qIpappGp5SAo8jCWJbXaMRs10Jv8AUW9qDHES WAwekEjEMQvAdCBSU2Iya+Glyk0NRUBxHNJGZYUMYW0IBJa6J/txz7TyRhKlBQdWiuXFAaU6aa7b 0+LlEySGMSoj2ibXHIt7B3X/AFUjD0f7G/tnS2BQ9beRm4+XXdZgoMjGsFVTxyINKIwURSjWuovq T/Nsn4/F/fijLQsvVInUMNRqOocG2ZcVI0NG33dHUQzRVlFWr5oqunkTRNSzKQ0cySxelwbhlaxB 5Hv3gpLWhyOln6RWgGD1X78mv5X3RXyNjyWd68x9L0p2xJqqRksNSpBsfNztfjcO1qWPx0Uk11/f oPAVsCY2ufbeuWAkOCyfz6baz8Qjwsf4OtaX5A/HTtf4y79rOve2NuS4bKRB58XkoS1TgdyYwSGO PLbfygRIa+ikI5/TJE3pkVW49q45ElXUh6LXV42KstD0BZYe3KdNlxwJ6467f4+90r034mknzHXY k/r9P8Pfivp1ZZh+Lh1zDK30P0/r/T3WhHl06JEeoB4dcG9X+sPexj7em3o+K9o67UEfj34562gK jh1lU+6EdPo3l1Mh+v8AX223DpfEepOr/kXulOlGvHXBn+p/2H+x/wAfdgvVGYsa9RWN/wDD3c9M Oa8esJt+Pex0nYjy64Hk+7dMk1NOure916rpHp17gfT3rrdQOHXdvfut0x8+vW9+r14L13p/PvVe raMV8uuJHvYPVGUddg29+PVlNPt6zCcqAqKq2N9VrsT/AK5910V4np/6kqAqIAPXz64Fy5LHkk8n +vvdKdNmRnYseJ64k/4+/DqjH59Yyfd6dMluuh7914AnrIB7rXp0L13b3rq4HXLUF+n196oT1bWq cOPXflkPBY2t9BwLe/aR6db8aQ8Wx1jPuw6aYVz14e/daAOOuQ966uOve/deI9Ove/dboaU6yRwv KbIpP9f8P8f8PdWYLxPTkUEkzaY1JPXGtpWp3jDcl4tf/JzD/iPdoZA4ankemtys3tpIg3EpX+Z6 UOKp4GpICSrySeS6j+xaRgNX9DYe0Vy7iV6Ciin+DoV7JaWz2FqSQ0z6qj07jx/Z11kokpljhjs0 013Mi+kILkaQOfr73AzSFmOFHXt3gis1ighAM8mdQwAOFAOv/9HQFL+j8FmP4H6VAta1wLm/v3n1 SmesPvfV+skcbyusaAszGwA/25J/AAHJP4HvXWmIUEk46m6ljdEUppeWHWRfQFRwdIJ5ZB+Tbkj3 vpgVbVX0PXb/AOcmAvc+Xk/0ZXH9Lk3PvfVRgKT0YvA7noMthsFjWhNE7UtHj0pa9DCuSFADDVzY nIIqUrxhkKmJiJQeDfg+26lSw4joumgZXkYGoqTUeVeFR0JlDuGrpK7ZlHkaRaPGxV2Uip5JqiUl VqsIY441WUss6soHo/PI97DKTQiq9I2jBWYg1eg/w9Sd19c7E36tVURUsW2dxxRrrrcUi09PMwvp mrsUQsMkc4IYyJpf8X9u6BnS37etQ3dzbUzrh9D/AJD5f4Oilbt6/wBw7TeWSsgFZi1m+3hztEry 4+VyA6rISPJSyFT+mQKb/S/unR3b3UU1NJo/8J4/l69IMqR+OP6/j36nSyo6F7ZO9NbQYbMS00Sx 0q0mLrnj0nzecvFDkZtVpYSkhjDGxVOL+2WQKS4HHj/q/wAPRdd2tAZIga1yP83Qn9rbI25ltuZD e+Jp6rbuXwkeAostgaiqNbQ10X2lPQSZHGVtRqqmTzxnTcsugaQfp7spqCa91OktjdSpKls9GiYm h8weND9vQQdY5HGYzdsNXX0FVNQRUk2uphJkqMGbwI+beWKIutJjizOzBDojJuCAb2UjUCejC+R3 tyquNRP2V49v5/zPR5zt3Hb4xUm13kgyuI3EKVaKvptAjadp3pqXIxzAFkqIqhFZXQaGDgkWJ9qd IdaVx69BlXkgkWRQVkU8P8n2dNqZfe/U1KuO7D/im+dmx4mo21i9z4SCCXL7NFGwgegzOMaHy1NJ DJYiYSeQoCQTcL7oUMRVjSmc/wCr+XThEF9qaACO4NDpJw3zB8uFKU6GyDO7L3Vt2n3Dsevpc7RY KjpZaiOKL7iroo62mqMfuBaqFlR4FanCt45Y0ZiAw5X3qikHT8Q8v8NPy6RSRzRSGKZCpOM/yz9v mOi35Tr3DVLWSTKY3eeJzs+Ro8xROsG46UzmCfH1iNaFMrSpFCjhW/dsbqbm3tocSCKY6Xx3Mqeh hK0IPDHH7D0ocZ23mcDjKjbnaVdUJSRfwOjwO/sHTSHEz1FDnv4tLT7pxtMgqMPkKylqCDNGgBCc qeW9uBgBoJx5dbNrHMyvajurlCeA4dp8x/PozU8dPkMhRV+3ZqSt25nPuKjHVFLXJWYvIUX71Qk+ Ey8DFYq6mkPk8dw8aekgHj27Vqgn4T/q/wAnRbpK6kkUhh5HBH+rHQK776kw24crRZfZuQr9odmZ OWurKnJUlDOcVuFkgeoNPXx+RKGYGSn8jMY9bEXIYi/vTqhWnBulcF26L4ciiS2AHaTlc8VPEdMP XHZEce5KbZu9Zo6TdmP3DmKXJ4fzTfbZ1Z4pJ6XJ7fyDrHBM4rI51aGUBvUmnX9A0unxF1+tD1ee 2/S8eAE2xTB81Pow/Pj0RDddBDS7l3BT08Zjp4M1lI4I3jaJo4ErpxEjRyetCsYAseR7LQxGPTqW reDxLO0mwdUSn9oB6Ss0ahSQLEf7z7cVqnPTE0YCEgZHTe1z7eHRY9T1wtY+7V6a0kHrv37rdOvW 9+r14L10be/DqrU4U6x/T3bpnIz14e/dbBPXL3rq3Xvfuvde9+62B1zHup6dUUHXZ9+62eurf74e 916qFz12AfeqjqwVuptJSfctpLab3A/JuBfkf0I/3n21JJ4YrToxsrH6t9LNSvD7enE42FF9UjBw SDq4Un8afz7ZE7E4XHRq20W8ad0p1j14ddxUwVSrIDf6XHNvwffmkqag9bgs9Ksrpx6PV8K/5dff Pzk3FVwddYym211xt2qSLfHb26Y6qn2bti0a1L46mkghkqdxbpqKZgabGUgaVyyvM0FOJKiNyMO+ Rw6RX/09soUish4Dz/2B1tV/D3+Vz8ePh9DT7iwFBUdodtKqip7Y3tj6SOtxR8XjnTYm2UkrsZtO CZyxE+uryBVtBqdPHt5TTIHRK4lmoXOmP06Pjk4njime8VIGBjeadElrKg3JlaoeQ6jcC/4Pt4gO Fbq6aUqOgYajqNzVpxoyQpKEzG8zR+iNVk0KukPYMhBu2sf6/vfhgcenAwrUZ657ixey8HBUUSZB 6vIFGjarjpmf9xE/U0d9Fr/VgbW91ZDSo6271yR0ErY2sirpKulr3kpnKFDcaZGUD1eJVMgJBNrX tz78IATWhNemfFpTIHS2we25asGedI44mYqstW0pADIzF1UhbWY83Pu9NPbTHXkumY0BNenCpfHU NV9uiMUpFjLyKwQys4AaNJGQEwE8lQGtYEn3Ry5JNMdPCR2FSekZuDO40CXW9PTxrrjjiKnQr3sk kt7Gb1ra62t/X20Woc9Vy3QNZTdZixc03iXzipqV8zqLsoFwKaOxDXB/URx7bZg2Qo60Y1NNR6Bq s3eWmFRH9zFHHH9vIlNIqozSnyEOPGS0jji9+D7bI6ZeNge0Ejp2hq66r+yljyCKrgMwN2Gn6hUX UAHDEBjYWPvx1GlePXlhPEinSpjMsdNBB9slTllqWlGssbwTkABjICSQFuLXufdACfPPTwjX066b J5OmaWCuxlKIXIGqLWXUFm0yyU4jZb6h/ZPP+Htwiop06uKY6xmiSojZlpwrKqQ/cSIrh31XblSL XYcCwNv6+9faelYn4Bh16qxzztqWB0mjXytUU7HVGyLZYpEZrsjDmxHv2R59eISQ9p7uusRlMpia zX5qgU0LhopmRiTIq6WAQsFBtcernj+ntQsi+GQzZ/1fPpG0Dh+1T0Kf96/NSR+qQiSKFjezyaS5 Vo1sWHKkk/Qce6iTHDpTDASe8ft6Za3ddfiVlqYUmkjkmsxfQE8SfpWIlpAyR2/23vZkTJbI6XRW KykUoD8ulRgOw6fNeGOraF5CrktFpVWuEu5py72kVrWANiRfj6+/BI6gitety25hGKaehrwVNDDK MrR0wq4alGE0UqAzIx/WQsd28bL9GJP9efbjAZqvl0XtLJGdKnpAd+9EdQ/KTYdd1v2ftVNx42og q5qWsCpSZnamS8DQ0ua2vm1Uz4vN0RfXGyiSnmAMVRFNA7xMTsslu+uM+f8Aq+3rzSRzr4coyPyz 1pvfNr4Odl/DHfv8Iz6zbm633BUVUnXvZdJRSQYvcNFC2psdko1aaLD7qxsTqKyiMjhWOuJ5IWSR jO3nWZajDeY6KbiLwmIOR5HokPtR0l67Aube9E06sqljQddlSB9PfqjrZRgK0x1kQG3P+w90Y9KI lIFT1ltce69KKVGOu1Xn3onraIQa9SUH5v8An8cf64/1+fdeliL516kFgBz/AL7+nulK9PVx1geT /fD3cCnTTyKOHWAtf3unSZpK9Yi3uwHTDOB11f3unVdXz69f37r1RWleuQHvR6uor1kC+6k9PKle sgQDn3r7enhGAK066Yr799nWmKEdRz9be7jpG2DTrr3vqueve/db69f8e/U61qpgceuvr791oZ49 esPfq9e0iteuQHvXVwKdcr/0966vX049dXPveOtEt163v1etBakZ65Gw+p/2A966uQBxOeualCP0 m/4N/ejUdOIUYfDnrxAHvWetsFXA66H1/r731oUrQZ6kRU0kh4U2/r7ozheJ6VQ2kkrUVCR1LjoW eVYoxdyRcn6AH6kn/D3QyhVLHh0si2+SSdYIgDIf5dP0WClF0+8kiidv0wIsbWtyXlOp2Yn8ce0b XanPhAsPXP8ALoUQ8sXAqhv3SFjwQBTT5tkk/LHSLqlkSomidzI0MkkV2Yv/AJt2W125I49msZUo rAUBAPUc3qzRXdxC8hZ43Zak1+EkefU3GGpJlNFrWeJfIQDeGVAQDE8ZBAdr+k/4fj6+2p/D7RL8 BP5j516Mdna8JmbbwwuUGrB7GHAqVPmfI/Ly49P2Lp/4nL52uSrFHRvrG4sSrD8W9o7h/p10Dh0J 9ls/3zN9S9aqaMDxU+hHX//S0ADa/H0/F/6e99a669+631PpA4DW/TKAG4Nymr6FgNQRm+tvrbnj 3sfPpNMwqAPLrNLTeKop0qCoaVtRjQi6RcCNntfQ0nJC/W1ifr7115GqjFeAH8+oyn9y5/1RU8m1 iOeRybX976t+HHp0O/UuIxu9aTL7HytYkMvgqM7t6CslC0k9UlOY6qnhYMslPWzzU8enQQWBI9tO KMGrT/Vj/L0hu3eLROg4Yb7P+K6WeR21vnbVHhq7BV4zuFgeLIYvBZ1IqiaGGuiameOgycga6xkG Mp5FeJl4BN70oCW1LRvUcek6S28pdZU0vwJH+UdKJt347dlIsFptsbuojTw5bF5UrTVTU8X7aSUT kwNkoJJvyoDpcXUghvbpYlRqap9f8/TDQNC2oUeA8CP8vp0/YTIUaV9Lh8/SU1bhqypC13nIdXdN EUUFdG5ZGhDmxuv6T79UAUPw9MSKxBeMkOBj/Y+fQSZPp3G5ygp6jZVX486tJJNkcFUyJLj6uWKS ZZpMbVr/AMBHYCyRNqHp+q+7YJovHpdFuDxki5FY/JvMfaPPou2TxeQxNXJQ5KiqaCsiJWSmqYmj kBUkEqGFnS44Kkg+/YPDo4jkR11K4K+vS+wvYlcuAyO1s1O9Rj6nEz0GPqHVZXpGLGaGGo1Xaam8 gsh/VCTfkXAoVoajpJNZL4qTxCjhgSPX/V/Pp46MhM2/qZhUU1LJHhNxyxvWTmCmdmw1VGtPK3+b cVTSeMRv6HLWP19+TDfLr26Glo2K9y/4ejN09Rkujd6VElFjqrO9b01HhshV4uZDDkdty5XGrkqu bbr1FS33ElBLG88lO3okS+i3LBQjaGBI7PPomql9HR203VSA3k1DTu/kK/t6Olj1292FgIcpTx0N djsnQS5akyFI0bR1jVM0kcDTy3MgmYppkia+h10MAfbSOWFBxHH5/b0VOjQuysCHX+R6KL2J07ms Xl6beXWFbNt/MSSpBkavEM8FBWLWQmR0q6eK1NPBrbxyIVKEfqVvr78SCdS4Hn0YW96AjQXa64fI HiPsPHppk7Qkiq6Nu2MJTYLM4/H00Bz2FopcjitxU0VMnh8b0qSTYbM4syRtpv4mEbqdNh7vUNp1 DI/1fs6v9KG1NZSFkY/CTQj9vEGn8+n+to6atgOWwdTi81PmsdLUU0tqHIY6pnpBLC0VUkoaiqZX hfxASksb+oKbe7YOVA1f6uHTALL2SAqAR6g0+XmPXHUPD7Y3X1hUYncHV+RWp881bWZPrjdCTNti aSuiMtQmFqDL4MfmY8aTE1iHRUDamUW91QsoPdkHh8v9VR0oa4iuKx3acBQOvxD7fUcD0KWG7P2v vvDUlXNWyYXI7T3JSwZvbeWqPHumigz08WLMcBYGPJ4mnrq4KlUpsFa7qtvbcrFgSvEEEfZXI/Z5 dJntJYSte5GU0YcD5j7DjPSW7H2LiN+Y3HR12IrjKNz/AGr72pUppM7haOjp6OrkqJIaVUfJYzKG dokkAZoZVDHjn3ZmXWVAoa8fl1u2nktSXVx8J7TwJ/z+fRDN00FRjNw5SimyM+X8dQXjydWzyVNd TzIk1NU1LyFpGnkp3UvqudV78+y+UASOPn1LeyTPNtlowWg0Up5CmCPsxjpHzkkMPx/re9oB+fWp yTqUjHTeV9ug9FzIR1jI926aI66976oR5jrrn3vqueuNvfuqkVPXVve69VK9et79XrQU165e9dOU 66t79XrWnrsD36vWwvXIe9dXAOB1zKMPqD/r/jn6e9VHThjcVx1nppFie5QPcEAEauT/AEH9fdHB YcelVpIsMlSgYn1Fenqjx8FYJXTV5VBYQ/Qgj6ta36R+faWWZoioI7T59CCw2u33ATvHXx1FdHn9 v2dQKec0lRISFGklHBHOm9rp+NQ9uugkQdFtrcmyupCQARg/Z8vn051AkqY1eJ43RxcMp9SWP6WH 1Vh/T2wmmMkMCCP59G10st3EjwujRsK1ByKeR9D8urufhB/JV7x+SG3dvdnds1Ff1F1dmUpq7CUl Rj/Jv7eeHmaNkr8Ziakqm38RWRNeGtrkvKtnihkjIf3YKNZLAhei273YW0a28LCS4AoW8h/nI/Z1 uU9UdIYTpvqzaPXG2sPt7amzdi4aHEbW2RtugTH4jHRG5qchlzd58/n8pVFqmtyFW8tTU1MjyyOz sWJlHKNGlVoOiFayMZZKtIxqSeomUQ1s1xopo6Z7VUsGgFyWZVpkW3DyMtxf+z/r+9liASFFelXh sRkdBdn6CX7SpllX7ammlblLGWRVPKyAMXDMf9v+PeklzV1pTpmRNJHRfq/d+BpNx02Boaaqrq+r IFbGsJRKAuvpWXTZOQ5JX+hH9Pb5kR1qDnpOZVU8c9PU3XeQy+SdqVJKiGVkSWG7IoCp5FeKQWaS 4uCAbce2WcD7erhvEGDjp9oNn09Fi5MrSQLKKeSSlMBmV5UKhLuIWu63JJ1WIPPt1ZAAKU6bMSkm ta9SBVU0GPnKJJEYUvM89nTxuSsvot6bBrC359+LlgARTqyjSAPLoHtx/YmBCayQ0TPeGdJZEWMq xZxKx9SayNJvwAeB7owqpzw6UCvl0HlfTSbhZKpkR6Slpmp3LyaY0Fyshv6VkCKQL/m/tExLVZRg dOUHCuegl3nQmgxaZGrlhkkasSFUW6xaZgURxCOA2lbn8cc+9VKih8+mmXSWfVw8ukJFQ4CjhStl lqJIPJrNKCNcsn1kjjF/2ygFwT/Z9648R1tJFY4rXrDW10MEUn2NXSwUsbl6emk0llc6W8Rbh2aO 9z/X/Ye7LIEB1KD0w/i1JyB1hoN6ZGC9NX1EU8YCnzQaJHVjdogJPo0avaw/2HvTSBgO2h6vFrJN T0rI8/S1gEdRTTNJ4UkasidjDIxU+XRo4VkNroLEX49teID59GC2rEVLeXSuxrTfZCsXToKEUp1E rrR9KLJCTc3HK/mx97IPn1swN8j1ylqtaKZBIlcQxmZCEjVSRdZ3/wBWQDYH34YI9OmjEyHURjqF jpYHDU0snlZtctWKZgyw+NmEKFX1E3H1K8D3dWAr6dOrMQKN1yp5ZEjqPIhZVZ2p10WECgcJJptr uCTqPvYJc0UdbM5FQo/Pp6p4qerp5FfTMWhLOqsrJCIQPorcMzrzb+h91aNiRqBr1uO6cNSuOk5W 7CkqHTLbdlkp6tI+YHLIs92GsqVsV9P+2B/w92BFKHpWXd1IJ6MP1dubMYSaDGZqNYpfHplkqHYr JGwAVFYlvSb2H9L+/eOiqatU9IJ4pDQ6cdGBzG26ppaPIYmgqYMVUU5/jEnmRo8Lk7hqdYI19csF fGxYN9EYe0rTIxPXvAencB0E/cfR2yPkB1hubp/tPBQ5rau7KGak+9pfH/EsHmPC8WK3NiJ6iKZa DPYieTywyhSGN0cNE7oyZpWjkEkZ6alt9QKkHT1o0fK/4x78+JPdG5un99xNUPjZBkNr7lhp3gxm 89pVksy4fc2KDPKohq1heOaIO7U1VFLCxLRkk6hlSZA6HHRNJGY2KnouUf193bpyHjw6zAi/I90P y6UqRWjDrlx7rnpztpw65Dge9Hq60A69e3v1OvaqdZUcAc296+XT6OKZ66eX68+9gdaeYAEDrAX9 2C9JGl9euGoH3unTesHriT7sB00W64gkn3s06qpYmnWUD3QnpSq9ZQPdD0+oqepAGhbkcn6f77+n vXStV0DPHrEW9+yemmfyJx1iJHuwHSZmHr1wJ926aJ8z1x1e906oX64s1vofewOm3enA9dKSf9j9 fez1qMknjx6ze2+lIHXrge99eJA+3rq9/fqdaDV65D3o9XHXj79149cb+99VJPl12oJ96PW0BJ+f WYIw916VCNh1zWGRzZVJ/wBhf6fX3rUBxPVlt5ZGoqmvTlSYuWZrAGwtqaxAA/w/J9sSXCoPn0bW OzXFy+lUOnzPS1psVTwxXfgWAte5bj+n4J9lUlw7tQdSLZ7FaW8NZfT9vUulx8Rb9uPT/iB9Rf8A J9tyTMB3NXowstqt9dYYaf5unWSnjjAvYEHVb+p/BA/HtMHYk9Hc1rFCoLEA8ft6DveKj7mkIiVC 0UmqZVVWlbWvpYjk+MAEX/1Xs82s/py1auRj06iT3BQG8sCsAUlGqwABY1GDT+EUIr/EevbYoRpe veTlw8Cx24ADKWZyfqSRx/T3u/lyIQuBnq3Je2gJJusk2WBQLT0IqT6n09OlC9KKOthydKyxrIGj yFOTZZYyjaJwPpricC/5I/2N0IkMsT28gqR8J9Pl+fQqlsht+4wb1ZMqo9VnTyZaGjj+kppXzI/O v//T+f8A+99e6zQRGeVI1/tHk2JIA5PH5NvfuJ6o7aFLdP6qiBvHaJASHndgTdAFASIcvMCfSPov +v730hqTxz8v9Xl0zuxepS3Gk3Gogv8A1Otj9XI/H+w96PSpABGa+f8Aqx1xIszcf2vz/h/tvduv eQ6e8CaYZnBiorKzGxSZGOOoyVG+ipoo5JI4RUwPcW8Bl1sPyPbb6qNpFWp+3qjg+HLQAmnA8D0c PE5bcPVkUu3+xoarL4GKsrocduGOM12JWnypIqKHcNE0T1VFTmY+aCVB6GY2uCD7ZBDAFBRgOH+b oldY7thJbUWWlCpwceanzPy6ybmwkO7NnHI0yYvP4einemXJh0qazC1TQialhpcjC6VSUMtrRSam Uk6SAR78MZz/AID+fWopGhmKtqWQ/wA/tHCvy6D2HJbho6OGopTU7uwcCLJHS1ywx7sw4TxOY46j Sf4tQIqkAXMhP0tz7e01FPLp1lhdiG/Tl9R8B/zH+XT31/mMZkpqJqSrQvTV1ca1YFemrKWmmrJ3 gnq4D4gGVZgnqNmItf3VAFKhsAU6buYpEBDLxAp6HHTxvra0O4adKt2p87j/AD/avJRw3yFHKriI VWpbzUwmVbH6qzfX24UrqdWr03bzNEwpVGPrw/2ei57k6q3Fh4qnIUFNPlMXDWTUxaCJpKyFY6cV QkqII1IMYgJLMv6SOQPegT5jo4g3CKTSkhCuR+Xp0zbC3LjNtZWqlzOOfJ4vJYusxNXHE+iogirD GWnguQrFTFZl4OkmxB9+pxPT13C88arG9HDAj8urBtk1+O7GzNZtzKVIy+B3D1xiv4LlpqdJIYJ9 vZMUaM85vJTZKhx+TKTAnVpsSOD78HKihypx0GZY2iRmHbMsmfzHp6Hphkw3YHSUuWptptQZvbtN U08md6/yHlaKqUSlJc1tnIxapsQ9Skcc0pQqnkOrSV9PutCa548CP8B6341veBVuVKycA48vQMPM Dy8+nmi7g27nYtw4fJ5DIbDzcVdt+uoNsb2NPHSSPS19Mcs9DlqOKmoq+GOnSSwcROy/RTa/uoQm tTx/1cOqmyljEbx0lirxX54FR5cel5uOPHR5CooqyhoqMyUdfWYXJYmZK3HVSzxNPHGlWoelqqOQ zzRhn4YEKbWv7fQEKFNMDpKlaYPmKg/b0HEXV75xP7wbTqoNs7oxEQp8nSJQJUbY3NLTEtRx5rDm SFRUSEkfcRHyqn0JKg+7qviDhRx0qFyUHhyrrgORmjLX+E/5Djp06u3QZM7J19unbmR21l8xSVGS x+KyNeZaGpq6SN2afbGUqD/lv3ccjiOmZjKo9J1gn3sfEFK/Fg1/l/Pz69PD+n48UoeNfMcR8mH+ XgeoHYPVVBuGDGVtfXVUGSoMlmDRZakhioqyljkg+5xtOllRpKqjycFvDI3jZmAQrb3po6KCtag/ nT/Vjr1vdvCWCAFGAqPI+v7RX59MVDu7cWzKmuyW9c5NgxTYSJNs7gx1JNXbSy9c9fNVVH8SoxDK 2BzVdiKe0NJIfBLOupGAuPad0OacacPX8/l8+nfCjmFLZNTFsqfiAp5H8Qr58R59F173q6Sp3lDk qCphraTKYDF1MVZTSrNBUaDUUyywvEiwKhigUaEuEIs3qDe0snfM588f4B/l6HvLM8kW0GFhlZGH zBwft8+gR8itcH+oF/x71pI4dHHiBsNx64SQhhdf9497DevVZIQwqueoTIVNj7cB6QMhHHrFb3bp gjr3vfWuuvfuvU69b37rVB11b36vWtPXXvfWuvXN/p79jqtWJ4dd3966vU9d8j37HWwWHDrI80sl gzEhQFA+gsPpwPqf8fdQqjgOnXuZpaB2wAB+zryuQQfoRyCOCPfiOtrIQQfMdZ1q5YyGjd0cXs6s Q3P1ub/n3UxqwowBHSlb6aJtcMjK48waHqPqJJYm5PJJ5Nz9Tf8Ar7tTgOkgclmYmrHrau/kC/yh 8R3xi5fm/wDJvAGp6X23mJYOk9k5OnDUfZu68HXS0mW3ll6SVT99srZ+TpGpoIiDDkMsrq5MdJJH LVoQzLI3AdPfvSSC3lsLf+1c1JHED0HzPW33BjsSKmSmx6UtNRvU3aOoCx/5qyqz6tCU1LDHb6+m 3HvynUaA46TxREKCQdR6ZN95HB0dDTrS1sdY9f6lmSSNiCAUYQSoLSRsVsGJ5A4Ht8KBQAZ6Xxwr ioz0WKXcONTJVkNNaRpGMc88cQ8VPKq+pZg9pGXSbatJte497Izx6fI0+fQD733NPEXx2KCUv7xa olbTUTJCGDF/FI8WlNX0JtdfdtAYfLpLNQjhx6atj7Tx4aPKxQyVu5a+qjmSBlFZKapmBhhipkOl wXPKgtwQPp7qEVM149IHg1keXQ0RkYqmqKbLUr0c8SStoVXhWFlDSN6QSVkVxYISCD9PemCtUjj0 5HCVPaMdA7nKqupZpa7GvFBH9pBO5qF8UaQafJVv9bzmaQjQfop+vuoArTp9UGrSR0iJ8tLV0NYk Z1SVR8pkVT4pYyNZiZVNyT/hfn8WPu5mRMHj06lvRqg9BVlZ6mhVJZ6SJqSqJM6VLlg6f4wMFWwb /YC/PPtO92a0ZO3/AA9KRFmg6hpuCGaGCGTECljenanskLpAwjnMslo9Xqjn9IDfgjj3tZIitOA+ XVGVAxJpUdAV29nMHBjUjohJaGPySxpINJtJpl1l3vEjMPUgJv8Ai3ujFWNVGOkrDOOHRS5d0ztU T1GKmrpXjR4dM7pGkf3DCxiUu4kiVeNKjVyDf3TIGT0nRTFqdyKn06b0zFdmK8xtLJTzSPFIEASU CXSIz5jx43kH9fx9Pe1ArU8OnRMjUFD0I9BhkSmiao+8cPOkcsSjxxyCIIHk8zX0ohNuLH3pgupq cOnAmqlFz8ujB7Sxm2JqcU8zGma6gJ5yzgkgESSErq1qLXAvb3VVQHp3XMvCtehMo9nUlYkYxlXI GhkWVW5jQ6YwQqAkRkKSQLm9j7sdPlx63HNIWAPTXmdt1CB6gxsZSTodyYkEjDQs00Sk2jJNubjm /Hv1VOK93S0gEVAx0lMRjZo3DUwhkr0rFnEqJ5Kf7HSY6ujkK8TuJBqBBGn3XFT0jeiuaKKdKKTH 42ip53lqW/iVQxkXwO01JLCwe6m1wXXT9P8AHgfX3ZX0cK9aPgkZB6Y4BUuxeaFFiiYahErprPKm WyMGkBW3H0X8/wBPbzTo60Ze4efVVaJT28ehW2XlFanqKdjBLWwhlgMzKJzC11LwgBgr6GPFuV/H HtPIQVPStJ0HA9PcGNmgZMhEvkd0Kosz6yqq+rSmqzqCxJB/p7SgLXPDq31qio/F9nQr7c3pl1ZK IuzUrKqvI8WuGRo2vF+4XXyRhwbFv08+3SkBFRWvXvEU5x0MuHrKHNUL0xbxVDlkaSQIos5BkiaO NdbqLeiRL2Ptlrck8cdUMyjIA+zoh38yH4IYP5l9DZLGYHHQp3d13R1+4OqM9MywVNdUwgS5bZFd KFJmx+6IIgkasQsNakMoIs4akEr2soDDtJof8/SK6jE6AgUby+3rRVyeJyeBymQwuaoKvF5fE1tT jsnja+CSlraCvo5np6qkq6eVVlhqKeeMq6sAVIt7OyQRUcOitAVx1Bvzz/sPfurVIOePXMMPdadO BwOuWq/vVOnNdeui3vdOql+vav8AH3qnXvExx6xs3+PuwHTMkh9esRN/d6dMFieuSj3o9WQHieue m/vVendFeuwtj70T1ZUoajrKo591J6fRST1IQAfUX/oP+K+6ZPS2NQPt65SXNvwAPfqY624PUZjb 3YdI3NCfXrHx/X3bpg0rx6xlvqB7sB0y0lSQOu+QP6+9cergEDrrSPr9T73U9V8NaVOT1yVf6+9E 9XjShqRnrkzBR70ASenHdUXrjywv73gdNdziteu1B96J6uikdZbe616fCnro/wBPfh1pqZA65JEz mwH/ABQD+vvxYDq0cLOaAdZyiw2uQXPIH9B/X3Suqvp0pMaQUBPeeuAkIYfnnm/5v9fe6Y6qJCCo Gc9LShgiKxsqi2gNxxb+oa/srmdqsCfPof7ZbQOsTBcaa48vWvT9E0US+kAsP7KgEN/S5+pA9o2D Mc8OhXA1vCg0KNfoPPqRFGZDrkNwBwPoBf8AA+l7e6M2nC8elUMRkPiSmo9OssldDTLpj5cECw+n P1590WF5DVuHT025W9mhWE1lGOoS1MsrFnJYn6A/gj6cfn2/4argDouS8mnZnkJJPD5enSAzss9V VVEjWEVE8cOi/IeVdZfT/RiLf7AezizVI40UfEwJ/Z1FnM891e311M+ILdlSnzYVJp8+H7OuGFq6 iKRKa7GCeRkj/os9g1h/wcfj+v8AsfdruJGUuPjAz9nTPL1/dwSpZ1JtZXIX5PStB9o8vX8+lpU0 sjU2mSYxluSByx/2n/C49laSASVC16kW8s5Xs9EtwUJ/afl1/9TQA4/pb/ff8V97+fWs9O1Ehij1 kMjTA6SptLLGLeiIWugJBLN/Qe/DpLM2pqDy/l1wnm80h8fpVV/s/phRb+iL/VMfy39fe/l1tU0i rcf8P2/5uoSC1Qg9PDr9WAW4I+rfT6/n3rp8/wBmT8uspsTwCByTyDwSSCf9v7301/h6kKgCSK9x YMPoDYyKCfUONQ0j/X96PVSSKHo8vXfZlJuDb2Dxm7UNXXx4qPGGoqXiaorKaKMJTsWlTw1qokYB imJcg+k29p5B3VHRFd2rRyyPF8Na48v9XqOsdZsLPbfy+QfrfJUFDQ7jxceWk2Xk6cttzMvRStFk aWBZWZqGrh1xyx6CpVWNmAA91DGg1g4PHzHVVuo5I0W6QsVNNY+Ien29ICDw/wARytOKbK7er8dL RV8m1cjEjZKn+5lj/ijUFYkg++xMTO8kEoBIThgPr7dRjQacr08woqMCHQ1AYcPlUeR9R+zpz3Hs ++jKY2auwWehWsp6vI0a+A5XGM4lo6w0ekCup5ItJmjcFgQCCRb3aocHTn5f6vPqsVxTscBojTB8 j9vl1C2tvSkwEs0e6IBQXoqn/clQpU12380sk0NK6VMUMbVGCrFJ1qWPiD/XTdb3RgDWnl1uW3Mo HgNXI7TQMPs/i/w9Quwd7Ve1pM7j8cktPLnmpMhtushqGfx0GRxzY7JyiVSYJ0X7QNG49QeQEGwP vzMQWAGP9jh05ZWqztG75VKhgfUGo/w/y6Re1Oq6LdGyqnLRVUlLmIjkqmiOktFWQUP26PE0TC0k bWlKMpDXH5+nuo+FmrkdK7q+aC58PTWLFfzr/sdOOwM1u7pfeeJ/iWMrJMPkEqYq/D/xD7agzlBk aM0UxoKuQNTU+VXUrx6lQ61VZLLz7q9SDmhxnqsywbhDIUYeIB6ZBGfzH+odHjn3jgt7YSk31sZq vJyUr4XD7hw0S68hR1Vbajio8xRAtUpPTowWRoi8ciIbarXFxlaMKOP5/PoPSQvDIY5hQNkHyPzB 9D0GPY1Pgc/V09LuOgOSSWqyMdG1Tjy0lOaSSjNcsFSstLN4EV2RnVvIvpex597IAOOr2zyxDVC2 lqCtDxrWmOgpmxPYXW+HNNt/L/xjbqVGR1bSz6GY4qqop6qCpko5HIOPmdU9MYYJMJLsrah73pYd wOejATW144M8emXHevnUDiPP/JToZusezcPuDISUgqzR17xU8dZhMlEuPqadhTuoMdF5HFSkExvH NCWADjUF+nu6MWw3HpHc2skK6qVjzRhkH8/L8+lhujF4bfm2K/C51JIq3DZZ6imkWZoslQR1Mf3e Kr8VVaDNGcfXvKrN9Ahte3u6sJFcNh1/1f4f8PTMcj28kc0XEih9D8j9o/wdBmu/uwOvmqds9m09 VvDaclNR1dLvtKSKpztFQPNKwOSS5mzcFLVBWlmUmoi0BgzqdHupd0J1Zr0sMNtdBXtSI56/B5H0 p/D50HA8Oljko8Bu/aMWUwtbQ7iw9HMq/bwhclj8rAs9TJWUOTo5Vjlp5aVy0kccipIQQyWHvRCu oYA16SgSwTaJAUf9hGMEHok/Z+1qTblXR/wt6yLGVBqXpsZUGaWmxsjx0s9QuPqJCVlpKiWZiLWI ZSLXufaSUKHUjzH+D/i+hzy/O88NwHoXUjPrxpX546CUXv7pno8Hy6mxNqsOTYc/j/YH204pnpZC 1SFIwOpD0qyKCeDb8e6ByDTpY9ksiBq06gTUjJe30/3v/W9urID0WT2Tx1x1CZCL+3QekDREV64W PvfTVD1737rx6697611737rVQcdcTce98eqGq166v791UHrl+PeunDkDrq9vz731WtPPru/v1Ot6 uux711YGvRg/iz8aey/l33rsLoPqjHCs3TvfKeGavqNSYjbG3qGJ67cm79wVSq32mD21h4JaqdrG RwgiiV5pI422o1GnVJGCLXr6mnSvUWK6g6h6p6Q2cIsf151X11tXrvbVG1KlJVZTG7XxVNj/AOPV yU8cMLZPcNZBLXVsjIHmrKiSRruxJellXSka9UtYas0rcadKzcG14lhcTxLHRyRD7iop5lWWaIk6 qHS1iz1Ngjj/AFGr20FWuqmejiEEjouG/sph5fuWNI9bUwstBFQxqIxTLGgEdL4VACRqoADfixPt l2BrStejm3sZJKZwegOy2NqkSWWnFPTVUkTtURiUyJBpVSCpIIiaIchR+sj3oMw8jXpYdqNBXoo2 doMtUZBXkqpXglebxzkeMVCF21kBrO6MRYf4/wCsPbyrJXB4dJJ7IRijL0rcJhqmKiTMBkWhx0yQ zRrXaK2jqY2CQoYI3SbXJ4w6EXANrn2oCM5qTjoulh0fZ0v8tvSVYZJZoJ6yKpMbyRyhSyXCxmSW V/TJUE+o/wBBwfbDVU44dFzakbHHoPMxmMZlxIKd1FQ1M/goXuqSQRuIW8jg6BHrc/8AEe7Cpyen 0YsuRnpM/b1EVTEsTKaRGPmg4ViTGAYmZlsADbSfwPbHi5+AdKK6FLE46Q2Tpo62atqMpDHU0OPa SXwIXQR2No9Wg3EETEFl5Dn68e07EutAuOt+IpNFY16DbNPUPFO1NpkaKmdl8UgtIJGJYQkHStlQ af6Ej35YWUVPD+XVWCZLDoveQqsfWzlMpKEpCNNRPIvjdFRLiKRiCHs3Jte5911ZIr0Wzuwyg8+k ANuYOtqq6VYJzE5kWkqomjjknKoXR9JtdZALWFrWHvYJ4E9MKkjglj0G2Hjnod0zIoVfuvEkaTtG lQ0KnT5ZYSLU4U8qTzx/iPb6mPTRq16VxW5DEr+3ocal0oPtY5vHVCl0K8SFoxDI6FSwkUnVYeoX 4J9t1FQAaE9GCKUoB04nM01OlNHQtGmhlIkb1P4lOppGs369R/J4A9+YU4HrbkhGI+LoY9nb4grD GXnp5lDrHHCp0P8AtqtywJGsEjgf4XHvQFeI6QFqEA8ehfq9xUGQgWSppozAwSOIrcSa2IUalb1c Mb3+lv6H3Roie4HB6Mou4fl0j1w8ePyUy00ohpmhkqjBEXCzRy31SxfmNww4/r+fahIwV7vTqsqr XIFemCphraibyUoeruAHgjITQtmAVYwSpdgvJB+vtkjpI8dAe7HUWmnp4W+3rXkSVJZklkaEr4vG bLEyixVLjk/2vfsEfZ0jlPbVTw6dKOSSiniq3h1+KRGjIspETWMcll/UlySl+ePdTTpnxWHn0N+J y2PycUzrBBJklSnNoGZYxCyeKQRwD0SyBgSAfp7acHiB07G+qtT05yYivWpjFCoalihjnlXyqiy+ YkRsEB+gPD2H149tpx4dKkIHE9CtterpGqIKfJNWQtTLApqKVdAjOoej8B4AT9eR7uXKio6c7KA1 z0ZHEw0C5CByRURLPE0SKfJLHTro8VUJlNiwYtdeL8j8e2Zdbg4oemyc6Rx61Wf57n8uyv21vvcP zE6iw1F/dLPU9DX9vbew1E9OcVlHeDHpv6lp4FMDUOUd4o8pZYzBVgTsX+4coqsbitIJPi8ukdxA wrIBjrWZ9mXSWteu/eurUxXrsH3qnVg3Xj/r+/DrTZ4Hrj9Pe+q8BnriTf3anTRauKdeVSffiadb RC3WZV90J6UpHwr1kC390r0+ErQdcwh96rXp1Yj58OsyxMTwP9j7qSBxPT6xGuOPWcRBeTf3XVXA 6e8PSKnrE7X/AALfj3cCn29UZv2dRXFyfdh0hkAJPr1H5JsP9ifbmKV6RdxbSP29ctNvp/t/eq14 9OaAo7ePXf45PvXn1b8OT1xJH4P++/p7tT16bLDOk569rsP6n37T1rxaDhnrsAtyfp/T3okDA6sq s51Nw6zBfyfdCelSx4qeHXIW96PTigeXXMIzfQH3qvVwjHy6zQ0rO4DAhSefdWeg+fT0FmZJFBHb 0+rjD47xkAW/PF+Pz/Tn2kM+cjoSLs5MWqI0FOmOohdWBYG7HSCL8/gD2rRgRjoPXNu6uNanUTQd ONJhZpEEst05ui2uSBbkj8A+2JLpVOlc9Gtly9czRieWq+gpk9KqlpWjiAP0F+bfU/Wx/wBh7L5J AzEjobWFi8UIVsD/AFcep0SBQDa/+9/4W/w9tEk9GsESoAdOepEgLobSgMPoFI/PP/I/dFwfhx0p lUyRsElo3yPTPK6x2h4eTVdmNzYX+n9L+1Cgnu4L0Hp5Uhpb4aeuT6dToFLCyrf+p9tsQOPRpaqW FFX8+kpuSm+2macqTFWw+JrcAVEGlonJ/J0cf6wPswsZNahAe5DX8jx6A3OFoLS4a6Kkw3Mek+VJ EoVP7P5A9Q6MBcK1UovLS5KCdABydBiDAn6gWe/+t7dlzdBD8LIR/h6L7ABOXGvUH60F4jj1NCoI /Yf5dLpo2lAlqCI01DgfUj/iPZQG0kqmT1JjxNOqzXXZFXy8+v/V0AlUO4W4UE8liAAByST/AK3v fVSaLXz6nSPIw4cqHURBRcOY/wCyH+gRLDgfn8+/dMKApyM8euKrdDJ/ZuAqW1XROB+QbXF/8fe+ vMchfP8Az9QxYyC50guLk86QTyTb62968+n/AMNPl1LPH9NJuoP01WN72+vvfTHU5rimqVW3rjSR jzcBZAL3NuW18/ni3vVeqrlhX16U2L3XRUlOsT07ARQwKEY6g8kKBNSN/YJYav8AD22Uqfz6q8D6 iR69Dxjuxs9iMbhjVFsjBjspTVuKqTODW08M8P2uQpIKi5Welqo5tLxy3A0ixB9t6BU+vn0WyWsc jORhiKH0Pp+fz6GCCXYnbdFGKgTRVFLKoWqjrTRZ/CpUoY/JTTi8i0/mJ9P+bIuDf2y2uEllOD+z 8+i0i5s2qvA/mp/1ft6SNdiMhssVOM3Jkqqvw1UVoaHsKFjNT4loSy4mm3TjmDTY2BZ9MclTCWhk jkBIBHt+NqnUMfL/ADev2dPK6XPfAoWXiU/i9dJ8/sOemiWjiocZgN0PX4ZZJqyroc/Qqi1VPLBG yxzGaJQ0NdiMnQyeWKVQwJjsbEe1AIOeraiXeIKeGD5g/wCQg9FOz1XDkc1Vvi4jTY56yop8TQee WaCko5Kh2igpWqGZoYpGkLhRYKXNvbZOonGOhHChjiXxDV6ZPqfn0bvrLOU+Akodo5qGpo6tMYlD BhchLToKwZCR5I8xt7IRKaTKUxaVi6qysyN+Sp9ttrSv8NOP+foO3kRmL3CEFC1ajyp5MOI6Haj2 ++5Mfj6isx2Jy+JzG266hzeIr1iqqCXLYGeGhmjGkxVNDVJJTyMsiMksMi/W/txZAIwa0zTov16X NCRICGUjBFf+L/PoGd6bH3F1NWUm8eoM7NNSSY6MZHb2RkV8vDRNM7R01bDojj3FiY53tTVBIqad lIDcD3pGJr8v2dGUVzFdr4F8mSfiGM+v9FqcaYb06bYe4+vd701PQ7rxdRt/JivSSaHLqazESTZO kjpMzLDXRClmpk1xJLHHMgKcHyEj3Zify6q+3XMBLW7h0p5cRQ1GP5VH7OhHFRNVHIYYk12Op5sH WQV81RHUztSZfHRwxVSZMM1PkKKaqojqWe8iMv6m593Vqrp+fSEBe1+D5+WQa5HqK+XTflNlbX3J R0tRkwtPVY/cNNSS5nFBqGqoKStDRUWRp5IHSqjcVSgcakuPpYe6gAMATj+fT0c80TfpnDLwOQT8 /Lpqq8p2DszOU8tZLWb/ANtGlyOKhydBTRvu3H0eInWvlqa6OMwpmjRUbyLzoeWMm5uvN9JDagfz Hy6dC206GlIpsGhPYa4p/Rr+wdCrDVYfsfZVJlcBWvlqbD5Ojxj1+PlWHJYuPLeBl00k+qaJ6eVY xURTIECFvrf26GWRQpwR/qx0kkSS2m0yCjEcDwNP9XEefSOrOvMlj4sruDZC5DZe9IYa6uqaXFUw gxGRrsLUE1OMyWBZXgrYK2EiSFkjJjZ3X6Nb3vQxFRUNn9o6eS6UlEnAkt/nxAPmDxFPP8ugr3lk cfv3bsmFzQg2x2Bj4zkaOlUKm1N5QQLqhqNs11QVejyPgmdDRO1zeyksNIS3AVk1Ad4Nfl+X5f4B 0dbOxsr6ORGLWUnY1fiSpwW9QD5+leiotTMhuCtzfi1wD/QD8e0QcEZHUhvaPH3Bhnr0J8X67ML/ AKT+f9j78/dw69A3hElxVfTpwadLgBdItx/gf6H+vtkKfM9Gj3SVAC0WnUyBI6hLWU8Wv9Of+K8e 2XLI3Howt44rpKUBx1GqMWT+gXFvz9fbiXA8+kd1szf6GvTPLQvGSCCP9hx/t/apZQRjohmsJIjl eoTxlTa3twHpC8RB4dY7e7V6Z09cSPe69UKnrx9+6qeuNj73XqpUk9e9+635de9+6113b37rYHTt g8HmdzZjGbe27icjnc9mq6mxmHw2Io6jI5TKZGslWCkocfQ0kctTV1dTM4VI0VmZjYD3rq/D7Ot/ r+Rp/LIrvhb1VJ2h2xhKdfkt3hS4x9wYWdaKrn6x6xSpTIYLZJq4FmlpctuWrRa/NBXCF6algsRT mSRv6lUqEy3Tar4zCo7B1sH1LTzGox9IyNUw2lYQ3DU0dlMdIJWvHrQn1Di3192jOvJXPRhHCoUa Wp0HO76xKBloqpmkmWmmrZopJCsBq5FMdNEsvKE3b9QPp1X9vaCwoOltuBGQaVHRfpsM2QWtkVTU 5GYq88aRyjxsw0xyTTxgpJSIh+t7tbn2mNCSKGvRqLvwwBXHQDdqU+Z2Ohj8q/d1C3+3pBGrQx+E hhoGvyEQ3ZmexCgfn34MFNaHHTybi2aGoPVfm8d15Oir4G/i09XGyPIv3RUj7eRyzx39KxqPwy8m 3uwuRUYyeqyXTSAhhnqL19vmtzuWhhqZ3eN53WFXKggioKo0zpy0ZWzEG5BHtZBJq1AjopmcHJ6M JuKGragipXlsFkKPFGCWkgqBaKodzYNz+PepdAPEcekukMeAPQYY5RTTzwtIKYxzRQsX1maCJLmN RG31Esn1B4t9faIyMagkU6UiKhBPWLPZbMQwUIxrxisevipngkBaR6VnKz1BZgyxTsxGkHjSfaQy kcadO6A1QRjrnmsnCMfU0TosUssaNJ4/3HkEgHoEg0gvfhgPfhcgDSVxXpLLb6e5egN3NUyok9ME alEVGZHSNUErxWU3gFyyWGmxtyW9+8UuBQ9M8RQ8Oim7kyn7tVUSMZS0ZVQQGpIPUAPJElmErgck fRvr79oHnx6bKiteocYeTHpkYJqhPHHGYtLg6QeHKwnT6ri3HNh7sQQtV4DpTDErHuFBXpJ5XLYO eqerXHTplWijL1bTeISmAAs0l/WBpX6L7oolc1B6OFhhRQxPUej31/FxJSkvDMrxeJmCmJo7EWaT lplI/tG59qVi09zHNOkcpQMdHCvUurz0cEU4ZPHGy6XCyKqRM/6WeYEBoywuAB9L+66/UdIZpagi hA6jYPd89FNQ5COYxoaqSMqWILyRhdKoi8KGhN7n/D8j3rX8ukYeprXFejabE3jDlqKVqpnjggiM /mY/dBWDHTSmRrWkYjkfgH3sswGDjo9tWjopb06XuM3j95moqeSj8kFNCXDM1wI2VQYdSnWBwf62 v7uknbU8KdNXTx6mIbp4qHo5pmbDxxwxQwvNUST1gRo01EtDTqQP3CzaRGeW+vujEE44dFn2nPSX eo11yaZHr48i+ioeddBp2QEOkiW4iAHpIPB906pIqEHpV4ySJIvAjiVEbxxSyHzFV1AfucksiEWX ni3496KVFQOkEkLLkDHSixdZjsXXwtO6Uhna4kdWjGhRYhQOJFQ/gc3592RcgEcemu5cDoU4njxq pkoojKk6PJFPLPdJ4wVu0MNw5hi1cj8e9NGqtgdKEcjjWnSwp0eWliyVBM9TG4D1FpLyxopBkQKt yVWQ8f4e2nYCoI6VRAPTJ6EDbO7v4dVR4+tgq0dXhaOc6kQxSL6PXe8ig3Jv+De3PtsNWmOl4tWW j1rjoye79tY3fWy6Zc3jcbmMHUQzbc3bhczQwZHC53bWeo5KDLY2tpJAwqMdlMbUSQ1CmwZHP59t SRhTqDU+Y6TNXuRsdfPW/ma/DqT4SfLjsDqnFQ5Butcy9Pv/AKdyGRcT1NV1vuzyV2HxtVWIkcdd ktqVHnxFXMEjE9RQtMERZFUG8EvixK34uB+0dFrx6JCPKuOq/wD6+3evE1B66t731SleurW97r1r TTr1iePfuHXqFsdcwn9fdS3TixevWQL7rXp8J1kC391r08sdes8cLXBtx/vfupYDz6UxwtXA6mrT Ekce2y/S9LR2pjHWcpHGPUeQPdKlulDRwwjuOR03SVN2OlRpFwP8fbypQZ49FUtyCxovaOohdnN/ p/gBx7coB0iMjyH5dcGP4v72OqOaigPUYGxPt2lR0XhtLH06yFhb3Shr0oMi6Qa9Yib/AOHu4FOk zMW66976r1kRb8n3VjTp+KPUakdSwAB/j+PbJNejJVVV4Z65BS/Av71WnVgrPjy6mQ0pJH0+vttp AOl1vaM5AA6fafGoRcsLj+yLe0j3BrgdCS02eNxqLgn06cBTrCLJHc2+p/4r+efbBcuct0a/Ri3U COIk049SI4f2jx9f1W/H+3+vuhbu6Vw2w+nOMefXJKWN2XUikAjTcfn34yEA0PVorCGRl8SIFQcd OiQp9Wv/ALTf8W/A9pyx8uj2OCMdzfl8h1wd78fpA4BH5/4r72Bx9eqyPq7a0UdY1njj4uW4IFvr c/8AEX920MemVuoYe2tTmnr1CfyprdhZSLgD8f63twaTQdFcv1EfiysKKeAHWCngad76TqY3/wCR n/W93dwopXA6R2lrJdS69J1E9LCgx72F1/wNx9fpwPZZNOPLqQ9s2p6DUn+z1A3LQUE1NHTSsWmS VJ0WMrdSoYFZDY2Vg3P5t7esJplkaRR2kUz0V84bZtlxZxWc7VnVw4C0qKVqG+RBz8ukLtmVfHVQ OA3jkWZQ30YMNDXH9BoH+39m9+prG48xTqM+TZo/DvbWQAlGDAHga4P+Aft6U8kjzG7myj6Dmw/2 /tCqheAz0MpZZLgku1EHX//W0DY4kSWW92WAlQSp5cG1yt+ACpt730wzMVX1PXmIF2a5JU2A/wCO j8D+oAUe/daUcAP9Q6nx0h+2NRP+1TCLREbHXUuqk/tfhUMhsZDwQOL+9/Z02z9+kZev7Pt/zdMY NiD/AEIP+2916WHIPTm95pJHACjX5dBsXIexBA+gFuf6D3byHSXgP5dSIg1VJ4Fu/kienjAa2qVl vEoA06ryW4+nvR8+vV0jUfWvTXPS1FM/jqIZIXvbTIhUn/Wvwefeun1dXFVNepFPk6+ljEMdTMsI IPhLExizavShNl5/p79QeY600aPmmel3hdzCmmxNVRVc2NzEMUsU9ZFIyrIROxgSRb6JIBHxoa4J PvWnjjB6RSw/GjLWI+vRmds9q0O5KWtwG50RGyNFPQySuSaWrp51FMrIz/trMsZB8b2BZR7bEYVq rjPDolmsnhIkhNQpr8x59ITc2BzGxNs7np8W2LrMLLAIMhSVLyMcXWymBKPNbYqllaSL+I0lbeWB mMZ9YtdVs5UgkHpXbypdTwGQESg4I8x5hvWlOPHoJurtvRZ/PvLUrqo8RSyVs41xL+8xFPRhhMba BO4J4Iutj9R72i1cA8OjO/m8KCgPcxp/n6MPkNuU8u2psdkKFslR0WQnqcE0yvT5GjpYFSSup8LX wO5WpoxMJVhB0soDKCL+3CnaR59EiSssodGoxGfQ+lR8+s+1d/5/Y9F9lkJZs7s6qyFfUJuxGLVl Ecw0fml3HSaXnjeGePmZVKNclr+05XtZfw14ehHp9vW5beK4NYxouNIGnyNP4T/kPRisbvTEZCLa GcWPF5Sgq8Lk8VmIEeCsikxxrnhkSPxqbOY1WojceqKUnix4pCTHKVbK/wCfouaNg8kbVBx8iD/q /l0AO8eqsZktsiprsjTiaj3DksNQTY+OIzjDUslbHg8lUaSVyNkiMNUWF1YqQRf2pxpr516WwXrx SgqtapU19cVHy+XQMYbE7866qcjW4+tyUuLhFFTzVVHRy5rbVRTwySVK0+4ceH+4gpNUjFWjBMbF 7Wv70RjURjoxlltLwIjqolNSATpav9FuFft49CHt7ffX2Uzuez24qrMbMzuUx1JQ0ooKx8v19V5G gqaWoBpmMT1eMp5ooQVjlDRws5Ibkj3UZNa46SyWt3HEkUIWSNTWhFJAD5HyP2jozUVamJy2Crch FSVGLqZoXocvSHy0dTQ5inbHvlKSqp5TFNPT1EqJIpUgpf8Ar7eoVIIOB0V6dSuoqGAoR/kPSN3v 1vjkylNmdo5et2ZuCohnpcnmdqyyw0VWkTxilbL48GGGqF+HBCvwL3I97dFwB+f+fp6C6cKY5UEk IyA2afYfLpjfsLd2z8hSxdwx5CSWhr/uaLf2EpS9LVfxJj5l3JQIsMtDUSKFaGeFQCQLqwBPveso Qj1x06LeGcarE0JGUbiKfwnz+YPTdvSjw28arGUoqaHMLkHyefo4h4Rhdx45mgfLriaymVhjstEj CdQmgo2q6AXIqaSMc9/HrULy2+pqFStAfVeNK18vLouHYW1o9v5qNKcMMXlYRkcVUSyLKfGxAqKO eZLBqmlkPqvZtDoT9bkpmjMEjFQTGeH2f7HDqWOX9wXeLCKGcqt3F2seANOBP2jz9a9ISXHxsDou Wvewa6jj+yfr7ZWdgc8Oj6baoWB8IkvXyNR+XTeElLmEodOrlv6A8X/r7fJWmoNnorWKYubdkOmv H5dPcEbQ6AFP0/3v2jdg5Jr0IraN7cxhUNKdPCrr/wBt/tv8PaYmnQjjjEgFR5dcJaNJBYqP6+7L IynHTc+2xSihXpkqcRc+gcH6D+ntVHc4z0GrzYTqJjGD0zyYyVG5Fh7VLOp+3ohl2ieNqFe3qJJR un4/4j24JAfPpFJZOlar1AcqhIvcj8Dn/jXt5QT9nRVK0cZIJq3y6xgyNyBYf4+7do4npkGZ8qtB 10RIPqePzb/fD34FetMswyTj5deAb6qxI/P0uP8AYH34kcCM9eVX+JHJX+fUmCCoqJ4aaCGSoqKm WOnp4YI3lmmnmdY4oY4kDO8ssjBVVQSSbe68eHT2U/tBj1/z9b8/8nz+TptL4lYvavbnbMFFuz5Q by2zj85lYchQxJQ9C7bzNNHVHbWChrBLJ/fWvidYcjkyI5olL0kKRp5nm9JGQmSM9M6vFk0j4etj qiwabfrGmkjigieJyksdxLNVNHppHmI1SNFa6qtjb/gvPthYgDVqE9Ph0jBVRU9KKTGCjoZ5EUiS rV3lmEfkDEqwVo9AMkge4/x9ql+EADpXAK1JPHoLa/BfxUUkCpJPLOToMsYGoK2gRsznyxyK3HIs NXuwU8fLp95Ao+fSmy+Do9m4g0lLDTxVddTO+Q9KFYZnSy+qxtCP03Nl+pHttiQadJWkdsE46re7 Piiyk+Uq6hJaaqp41poqdpPPJWSCcp5UlF44qVo/RyeR9Tb209OP4ulNqWJ017eqtO56ipx+5c9R mCnnpaCkp5nClAv27qWKQyKNEcsPKmMc3/w9tL4eqg6Mikvh1pjrj8fcbPltwV2Qx9LHFVLRqKep a8tMWaVYUYxygIG8jgf1IPtREWBeh7T0hnRmIFejmZmKopaOninmSqrNDw1kbReNfIoKu6IAx03v ptcW5H092KeKPi6tFHpGegnRMXFWGbIOXhKTzPIT56u7hytgP8+3mt/hYf4e08kLAg68DpQGFaef SDyGUo4MnU1C16SBreOlJVXeIKoWWW5LUzlgbLawtb2gdWUtXiOnFIoPTptz+WpKtHen/YFLoklk RlaSZpLadCgkvc3BUgEN9L+0ZbUx7cdbGlmIp0Be6JdUtdWSVk8VXPA0VPfValjK6ZTJcD0pGeB/ U+1sOkCp6aeFCfh6KdncfM9XNUUskpiicR1csbao5wAp0wwXPM8v1Iv7usy6iCemAipU06S1duqS lqKalp5TD5pVjlik1PFHGU0slgPQ5PPHNz/T2oDCmDx62JVzU8OomXrI8m8S06NNUIr8KmnygDSV UHSrgD9Wq3090CkHBovTqzKAasD1HosVD96UTyRRfbCQR6LspUBT5NPMMBbgAcnn255U6be4joeh Cj2nSilhWJvO9VCAzSskiRWXUzpGSbiP6i/IA96Pp0nEsMvxf4f83SVl21NTVqmmlqoyt5AZYUaK Vm0sxEZsSluNQFx7uoWtGNB1R0jRdSEdCxtenyYgCxO/i1uailiZo7ngmTQdJdU/Lfj3pgo+E1X1 6T/VBAaNn06G/CO2L0VJKz1GmzNIGUguqs7RAAs8MYsBccn3TAz0neVnrk0p0uBn8fUVLvBSGOWS NZJFREVHlCojFA5AkdQA1xa3vRIPn1USlaBuHTHlcrG1Y04oWpFjRwfBKWV5nX0Mw4K6z+Px7ukZ f4c9OiWIULNx6kYHI6NDOigBm1rAzM+o+sxMnGnWRyfoBz70UZMcD1pplNdGenuukqZMhRCMzZeB ICPALotAfqUZubvGpuWBPuh1UqOkzVpg06NNtPDR1Wxw+QjNTMhiNA5V/uaaOWX1wLe5SFiRqP8A Ue6hXbgMdULGnHpQ7Wx9RQ1sh/VSKCkaRozJq1cGV1HjUM4/rx+fbphqhBPTsMrKcdCVT0nnyUMl VCH8EfkDwBHji1solDhiq3UcLa9gPaEx6GArjozFw7pxPRmOvpYaylyu1MnNHFTZqDwQF5LUztxJ SvC9rxymQC44tf2+6akK9MK7OxLL0Qj+aR/Ll2N86Pj3t+vlI273n1kuRxmw94RqkkNHTZComrBt zc8MYNVPtafMGUM6gtA84mS+koyGG7ktZKaaxk5H+UfZ0uewW5jDKaSeXXz9uzes979O7+3T1j2N gKzbO9dmZaowufw1chWWmq6cgrJE/wCipoquBkmp5kJjngkSRCVYH2fK6uodTVT0UlGUlWFCOkJb 3uvXtPXre/V69p65Ae9E9WVfl12NTGyAH+rfgf4f4n37A+Lqw1uaRLX5+X+z1yFNO76F1fgsxGlB fmwtyT79rQCpp1v6W6kk8JC3zPAfl69cmp3D+KmeWaYf5xYwdKf1JYGw5/2A/r78HFNUgAXrb2sg kEFpI8k4+ICtB9p8s/8AF9TFpMpCmoMl/wDUs0btz/i4Zf8AefbXi27mlD/PpeljvVugdXWvoSpP 8wR/PrD/ABCrhJWZAf8AkHSR/wAFK+k+7eDGwqh6Z/e24QMVuIwfyp+ymOuBqfKT6vr+Dwf+Nn37 wyvl1X6xZyTryfXj1iJA97oemyyjriX/AKf7x7sF6aaUUNOsDOfp9PbgUdJHmbIAoesfu3THXvfu vde9+691zRb+6k06djTVU9SFHtsnpbGtKDqXHCzkccf776e2yQOPS+OFnIoOnWno2YgBT/rj/iT7 TvKBxPRzabe7kAKa9P0WPGlfSQeL8fn2jaY5zjoTwbTVVohH5dOFNj3BGnj+l7/74+2HmGa9G1nt MikFePTn9lZSJiWFrgL9P8QLD2n8ap7B0dHb6IRcGop1FfxqxjC8DgX4Fvrc/wCI9vCpGqvSN/CV zBox12roSABwBx/if8f6e9EGh6sksZZVUYHXJ5RezMOP7It/sffgvp1eSZQ1GbPp1HaVHJRQb8W/ 2Pu2kihPSNriOQtGg7us0FDJI3Cnki/H9f6f6/urzBRk9P2u2SSPhfPp0mx8YjCOfW30W/qFuPUB 9L+0yztqqBjo7uNri8IRyNVzwHn0743DJEoZgPwSD9APqSQf8Paae6LGg6Pdo5dSFQ7KAOOeFPPr BkM7T04alx5WSVRpef6xoTx6OPWw/wBt7vBaPJSSfC+nn0m3Xma0tA9jtRDzDBk/CPs9T0i5XkaR nkdmJJLsTc/7H2bKFCgKKDqOJ3maZpJZCxrknPSDx08sVXIIG0NKkkYbSGsNauPSQQeFt/sfx7N5 0Vo11jANeoy2m5nhvphbSaWdWFaV8weB+z/ijnpRGtqoGhFXGftg1nqYrsitcaHkHJRCTYg/T8E/ T2iEUbhjE3f5A/5PXoVHcr63a3F/EfowcyLUgHyLDNAa0INfkTkdf//X0D0UiFQbkzSC9gSxLWNg OSSR/tyfe+mCavjgOnWlxrCdWqlQFSGNPJ6liBFw9Xp4XSp4j/UTwf6e/Dh0w8oCkIT9v+b/AD9c shK9Q86QEmnhRppZGsAWVNMesC6RC3CRjkf6/vf59VjUKFLcSRT/AFf5ekx7r0YdOmpfEjKoUyRm /Ook/oH15sLf7C/vfSY11H0r1npQEmppGbT4qqKU886kaNhqPACWBub+/dVJwfmOjOV23KLL0Qnl xyrFJ4ZmMWia4mKkGNGFyXjcf4ce7AA5rnolWRo2oGzn+XQSZvrKeDI5imo6lYpqOSiqaajqI2DV OOyEWqOaJk1lWhmDIyn/AHj3VgQadGMN/wBketaihFfmOg/zG3svgXjGRpJadJl1wTlW8MwH5jks BcX+hsffh8ulsc8U1QrAn06kY/cdXQRSRiNJFmEKOWFzohmE3pP1VywHI96IBpXqrwBjg9LDcO+a zLYaqoJZ3qKfItSuyyvaWCSgmjmQmygTqfK6i/I/x96YYp59J7e2VJg4FCtf59LXYO0MTWbTTIS6 zmqiqqKuCWm8sFZRUlM8ccElJVpeIss8LMyOCpNgwt72gqDnPSa9uXFwUH9mBT5E/MdPVHuHKbZp qyj3DFkq3HpM9TSbrxh8klJK0ganlyGPBSSklp2LLIU4KtbSw+tlJAIz0yYo5mDQkB+Gk+f2Hz/P pZNUx1cdLl4DTzY3NUk0OT/hsiDHzTKpVxCF/aLVNG5leAqrLIrArb6bNGFaZ6TFSpKNUMpxXj/q 8q9QsJtPdeAqqbc+xZKKmqMVXLTZzbAkmbF1gjpY5YMhJRSLN9lHmcRIkjyIGWNy17Ae2yNQpXNP 9VOnHnikBhugSrDtbzGeFfOh8j5dCztvs3blbUZ3Fbrp6bZm5pM1icjjdn10C0mGyUdUEp9wQ4rc TNJRqauogWogLeBRI5ADWIHiCV49w/n+XSOeykCJLCTJFShK8R6VXjivzx0Ku2cNRVmayL45U15a CPJzU+SNomyGJXIYeSOqpFWOCriqjChcp6WKsw96jkOR+E9IHZ9CoxqBw+w0OP5/Z0WXsjoClpUg loJosZn6tq5TQUUF8VNkqYzTVlK1KrSvSNLTFTTuAFlUiw/Ac01rT4uje03Rx2yd0I9fiHlx+3j0 B+H3lvzrXXhqyF8rtutgqqf+C5CR63CyCphZPuMNXLragrYJPXqhKEOnqU297DMqkHh0aPBa3vep pN6jB/MeY6OXtjtDbW/aGjqdt1cVHuU0MUWSwuSniSP+J1UEP3EwhlKNURPUxSqpTUACt/6BzWGI K4f+XRFPZzWrMJFrDXBHoD/m6mbtzC5TEVcclLHT5SlWL7qlmhevxuQbB1UWYo3p5ZZGE6SwQaHj /WpksRY29+d8cMj/AIvpqJNLqwPYf25x/qPSfq+razD57+9/W32mDq/J/F6LaeWMk2xs3FXUJSvg xqrrlx81XQVCGNlaxDlTpA97MZD6lwfLpQLsPH4F2Cy8NQ+MU9fWh6CzPRx79wuS2q+36nbW88VD X7qo8Tk42gnqzj6cSZTH4BgWhyUMlFHIbI2t/DEbcH2nnXxEoF/UFT+XmP8AL+XR3stz+7r2OVp9 VlJRGYeVT2s3pQ4/M9FV++aNpPC36SFPBI/H4Nv6+y/wQwXWMdSQNyaN5fAbgadZqKu11KeUAhjY 8/n8e6yxUjOny6f2/cA95GZwCpOelesayqHUixBt/h/gfyPZZqKmh6kBII50EiEUPXIQSoQ3Ok/7 170XVqjz6strPEwap0dSV9QBPP8AX/inutePS5BqUE8OuTQ2F7X/AOI/31/dQ1erPAPIdN1V4oIp JptKxRoWcnjgD6C/1ZjwB+T7ej1uyouWJ6Kb5YLaGa4uaLAi1P8AsfM8APM46Qp+8zNVJ9orxwKA CCxEaISQDKV4Lvzxz/vF/ZwPCtY18Ugv/q4dRfTcOYbyb6BGS1HHJCgeWojBJ9P2YFenKPArCt3P kcfVmFlH/BU5/wB59sNelzQCg6OIeV0tl1SVeQeZGPyH+frG+OHBAv8A7D6e9ievHpqTah+HqO2P Yf2Tzx/vuPdxMPXpK22SAfBjqK1AQeLqfwQP9tccg+3BMPPPSJ9sYGqgqfl/qz1Z1/Ju+OtF8kP5 i3xz2PuHGU+Y2lt3c1b2lu+gq6VqnHV+3urMRXb4qsZk1DL4aXMz4WKj1c2knUcXuHodMkqgdIrm N4YWMlKnAI6+mpsXEyU9Pks5URxT5TK1ElXXTMmupqWlckPUzCztHGWPjQDSPb07iukcOkasqoKc ehtmxcNWlP52jDhYzLKIwULRRBUgnLqQJlVrjj9IA+g9p69MljUmvn05fwejqMS8GiMmnu3gbVKC CbmxDEBC3Iv9D+PexXy6VQO5IGadNmC2djlyM1W9PLDLTyIImmZTF4AC00ihHfVrMlgXAuR/Tj3f Uwx0pYniegr73jRKP+J0tWUbHpPEaTyxxeeOpjCr5RbTL4A5KrYqxJ9t1JJqOm61NKdVsbzydLAY 8bLSIwpHmj8MLGWOSlMUf77lAvjXXJc2U6Sbe2plc1AAr0c2Cr2k/n1Vn2dtDcm4t0S4yjglljrK 5p5jSf5/R5zbXGQ4ihijsNN7Ecnj2kWGZSCTjoSPPaiDQAK06NZ151JLi8UtHhayKKvw8uNrKwQu aaXO06QsK7G0wlgalh0F1cvrRwQUBuASq16B3HHRDJR2LAddbvyFQ089JR1McUlDWLBMskDs1NDG lgj+SxkJD6dRuNX5PtxJACdND00y1pXy6DOtpnnqIjTNDE8cbMqyuYpgIY2cU8yBiFiqi4JBNw35 +ntqWaowc9bVdPHoDKmiOWydfEsVLja2n8byRmZ1gleqm06bK0hEUjc+NTZQGIHN/Zc6ueHVyys1 PLqJ2Lt/I4aiMr0xrKWc00VS1PHMKRqhPXDUs5IeHwORZj9Bzb22qjUQenANPDotOR3RJDM0aVUX 3AQ08tLIyyn7pGuFhbVd7BR6uL3HHtUGU4JzTpl2diajoPcoax4aqKlUvNLEapPKWssd/UhiYak0 A+snkH6H22IA5rq6SyFgKlsVx0BNZR5Gvnnf+HO9RGUdV/cjSOAE/vkyAI4iIsCpvze/tXGiooFc dJmYAFienKNamiio2hlpDJRu88puokRKhx5ZFkZQAFUf1uT9Pey4r0mafHaOlRgJMdSVFTlKGodp KkhXjLs0JlOoGmMTtYCUnmxP1t73q9emGcse49Kj+8FSsMYho0AkmkEpbUXpmcldEarpCJcfRfx+ fftQPn1SoxQ9cabMSzVAcXk8ICrI6q0QS+ktpK+ixULzzx/T29GiODqkp1stihOOlvgaytlqqeYi VZELp5JShib/AFIUhF03/B4B9+lVEQhG/wAvTFONT0vaXcsbM1O8R1RBnLrCohZxdVKOqskjlvqP 9j7SAtUAnq4JrSvSomyTLDRvNoUSqI4mKPGVuLOVYk6nDHgiyn6e7+GK8eraR1Ils1BPBPCqtPCH MzyCNkC8otgdTO55H4IPHu41LmOteqMF4A56x4GsminiimTzzFrklFv9uAiOr/TUq25+nFx/T3bv ZSXU6vXrcYzjoXaXM0ysr4nx+IeIyxOsQLSRgrIQwBYRAqQpPJHB91PmfLp9omAqwx0Y3AbgWsw2 GpCxP3ivrALRmOeInx05KgEGRLFSCVb6Ee9KstQ1KKekpxg8ehy29QNjMfI6BTLUzKJ4JAjyeAAE whVWwkAH1H+8+1Hr69eBoD1yxpnk3DFTQQtLjWml0eR7LJFULqfyOqgMSSdK3sLfS9/bXgqcnj0r WZQFGnow+NoJaBaaSJopDTVEE0TsmnRILyLFrBYeNVQqxC8/W3vfhihA49WMq4oD0OVRRUGewOep aQPJT7ipAxDao/HUwKkqaipYARzREAjg39pZ7XWKj4ujKzua0UnHWsT/AD4vgni+0vj5H8vevttQ r2l0Q1Bhe2qjHgiq3L1JNUNQ0uVr6ZCqVFbsXNVcbNOVMv8AD6mTUSkK6WrJ2hkaBz2nh8j/ALP+ Hpy/iVwJ0Ar5/wCr5daZen2aV6LQnXYU/wBPfq9bCH06zxwM9uOD/vX590LU+3pTHbF8acdTfF4E GmNmJsAqLc8/S/0Cjj8+29Rc5ag6XGE28a6YiT6AV/4r8+uSxTSi0zimiYcpHZpWH+1P9FH+t71q VPhGpvnw6usFxOALhxDAfJcsftbgPy6daampqYO0C21hA12Lfpvbk8+q/P8Aj7TSPJJQOeHR1aWl pZiRreOhYCua8P8APXrBUShvobf4f778+3EXSKefSa6mDcDTpseISknTq/wPI/3o+3wxWnRO0QmJ olR1Hlxr21R2B+ugn/eAfx/sfbizjg3DpJNs0mnXCaN6HpuYyRko4II4IP8AxX8j28ArZHRU7Twn w5Bkev8An65ggjj3og1z06GUr29Y2B/p7sD0y6k5I64Ae916aCk9ctHvWrq4iJ65hB71q6dEI8+s iIfoBf8AwHuhbp+KI8AOnakx8sx/Sbe08kyoOOejyy2ua4YUU06VdJh/08XN+b+y6W545x0N7Dl8 9h05r0pKfDiOzBQ30uBwPr7QvdVx0MLTl8RdyoD07rj/ABjU1r2+luBbn6+0pm1Gmej5Ns8JdT0r Th5dYCQvKqDza1v8fz7sMnJ6TsyxjVGgOemfIZmOnbxIgZwfV/RQPqOPauG0aQaicdB7deYorV/A iSso4/LpsFWak+Tjkf61/wAf7x7UeGI+3omF+16wkoAeuWpxxH+TyT+f9b3qg4nq4klHbCfPJPWa OmllIaxN/wDY/T3RpFUUr0pis55mDkHPT9RYxGIZ1seLn66Rb6c8e0ctwRgHHQo2/Z4yQ7pQ9OwQ 38NIrOxOnXawBH+pP5PtMT+KQ0HR2sRJFvYoWfhXy6nLR09BGaqvmVbfVnIJJvyqL+piD/h7Z8V5 m8OFOjRNus9rhN7ulyBTzP8AgA4n9nSZyW4pqzyUtFGYKU/t+U8TSrfluOFB/p7MILFYqSStWT08 h0DN45uuNw8Wx22Ex2B7dX42Hr8vs6TbAKQiWBA9R/I/1v6k+14qQSeHQPdVRljiADUyfT/Oeuma CG/mnRWKs2hjdrfi4F7X97Ad/gQ06qzWttqFzdqr0J0k5p0H2NP+5CnA/tSFSfrw6sD/ALwfZzOP 0Hr6dRTtBrutqAcM9P2g9ChR0qta63Q3Daubj6H6/Uew/LJQYOepq2+xRwAUqh41/wBWR1//0NCq OP7GPyx+I1DxlY5ZCLU4b9X2ym48qr9ZD9P7PvdPPz6LyxY0NdP+H/V6dcIFeSIPI5hgZn0silpZ zb1eFG4Jb6eRr2H0976q1FNKVb/B9v8Am6i1LSPFKkMYSljRjoVv2wwHqdm48sxvz9bf4e/YHTkY 71LHvr/q/Lph916XdOas5ip3f1DS0aWQDSENgB9NRBH1/wAefex8ukzAam6lRAtTvoI9QVmsLBtJ Xg/14/2Hv3VDhs9Gp2ZkXrsBTtHKAVoEiWOQEK08BKkrJe6sNF/9Y+7DoouFAlYU86/t6dKndtJR 7kweUrcTFDBkaNdvZSpjCyT+aOQT42vp/IgUSCYFHH9pT70Tqp69NCEmORFepBqP8o6Xu5afb+Vp 7pTU01LXAmqoqiMVLRTAATSRRyDXTRsTrGm63v7oajJ6TxeIh40I4U6LvvXq3G06VE23RKkwDTxU YtNBPpjLNHTsSXQBlP0PB/HvQbHRnBeuWHi5Hr59AHkcbUY8Un3CgNV04qk0uGUxuxVSLfTkEG/0 I92rno3ikD6yOANOnfCbozW2JytNK6xjWJKWRm8TGTSzGwPpJtzb6g839+I8xx6bkt4rgVPHofsH uvF5ygnq6TxVEqQFcpgKsLDUCBxadopEZ/vKWJTqR9Ppawaw92FeI6KJrd4WCsO2uGH+rB6xZXbG UxFZVy7JnEBnpaaqyG2aoRzYzLzGFpoZqdC/2/3E9HJ5YmQqdQYKwPHvfAinHryTpIoS6Wqg0Dea +X7AcGvSm2b2R/GslisRlaGoxW9KuKPCtFWtLQUOUNHDMMNLS1g8bUFVCiGldZQyTrMBcke9LnFO 7pu4s/DR5I3DW4NcZIrxqPMHjjhToc9x7JwuVyFQuUxtRlaXLtHJLhMwlNS1VJI+iM1VDWJoWJRU l1eUEI+nVYN7cZKDhmnRdHNJGAYn0kcCPP5HpJUVRvzp7cVK2Dirt7df0f29RTbWylSqZ7EYmWeY 1tJiMyUk5oqwzRFJNcRIHpBbV7SgCoPoeI/yjp8m2vR+v+nc/wAa/C3pqX5j0+fT/Dvbbe/amvy2 2crk5coaqnZqTJutBuTbMcN6aeoqqaIlSsFPTRgOjMmtQbgsR78hdGb+CuP9Xkfl0ne3mtSizKPD NcjKt5jPSapMZg8jhjR5umlgw0NbS4/+JUNGKvHvFLWPQ1eSytHLo1Rz00vleZGDajcc8e1I0slG rTp7XIkitG1JONDxGOAP24p0WzeHUuRwWYyzbYnkqHxeQqpKamhltOMdEqVlHksdVmRHnp2ppAyk 2fg/n23Q0px6OrbcRIiCdaVGT8+BBHUzande6McsmJ3MkGeoqeb7p4c0RS5CCSKCKlkaHICPzfcP FGqlJUkDqLGx5911MopxX08/yPVpttt5aSQnQ54Fcr65Xh+wjoyPTHbe3KuGgx9Pl6WmqaeGrw8+ 39xzGmeamppZH25l8XX6jTCooaYiCRAwfSLEFbe345ACteH+r/B0UXtlPGWZo6qc6l8j5gjjnpQd jYHFbm2/X4qkLVedw1em4sRRIXocrBXxSLJkKHE5SMiaOny9Cp0ut4xMi2sbe9uVGpa4r/q/b0xb SPE6twQjSTxBHzHyPr5dEV37tyh2/mIJ8HXVOU27nqGDMYesrUKZAJKNNZQZRLLoyePqbpLwNQKu OHHtHIFBovD/AFf7PQ52m6kuI2EqgTKQGA4EjFR8iKHpC6ubjj88f8V90p0Zlsk8OplLkqmCRWSZ yqkXBJKn/iD7akgRwQy56X2W73dtKrxXDUB9TToSqLIwVMSaiA7LyG/JI5+vHsjmgeNjTh1Lu27t bXkMWpgJSvn06JAvFtNrXA/4r/T2mLn8+j2O2U6dJGk9dyaII2lldI4kBZ5JCFVVHBJJ+nPvQ1Ow VQSx9OvSiO2heeeRUgUVLMQAB8+gnzOUlzVX46ZZFpIiBGnNmOvT9zMFHpvqAF7hR/iT7EtpbraR 6pCPFP8AqoP9WeoL5h3ufmK9ENmjCwQ0VfXNPEenDiAK1Cj5k1EnHYiHH0qU8Sg2sZHN7ySkAO5v e2q3A+gHHsgnunmkMjH/AGB6dTFtOwQbVZR2kCjHxHzZsVY/bTA8hjqVLTKRpYWI/oLX/wAPdFkI yOlc9ojAo4/l02y0Sr+ldQt/TkH8/wC29vrLXzz0Uy7bGtNKVH2dQZKXk8Ef7D8f7b28H6LJrAGt BTqBJABe4+v0Nvr7dVz646KJrXTWq9bpH/CZr4TZHa/V3ZHzH3dhRS5LueWbrDp+sqYilZD11tHL Cp7G3JRMzaRR7n3bQU+IjYAOf4VUgeh/UcWqsIzLjoAb7Or3S2yfgGftP+Yf4etv/beNWLG6lpRT wFo4oIiFc+CIgFX/AKXbm559t+JVmJHE9FY4celQqSxxSQwyR3FUCoKakSRVuJdI/Vpe1webf649 34560QD9vUemgeki+7kZfLVVSRuoNk8YGguPwxubhf8AG3vY4449P27BZaEY6aa3LZXB5aSrhdKq iqHgpZ6WKn1PEGRgaksTpQKApK88XPvR8XHRu3guuOPQM9q5DEzYyqlp2pquGpnY1NbPEZhABqWp giKl9NQkotEp0r+b+2meRadtOkIid2ATh1XfuPFUuTqEqcbHUT/eRJQwSpykMBd1kWdARPFJFHwH tcn9Q978QkaiAT0eWcWjtJx0DmV6+h2jUrW01Ioy80zPHLPMymsozwyuxJMRJXSSAbg8+6tMwA7a 9GbxwaCdefTrFlDVjF5PJ4uplhwlCuMqRFVSiHO4+Opsr1Y0CMZCGCr/AM8B6khcXvz7qp1ihXz8 +ieZ1iJI4dI8UjpJLV5Cq++IpHMnkjCmopimuaUm+qT0tdL88X9qFt6CoIHSQ3eDVc9IOvpcNVoV WN4I0Ms8bo+uZomQlAz3/cDsgBYmwIHtPJGVYiQZ63rlKk4p0kNoR7fTJtUyUS6KIZMPkZohMq1S 07ukTSm8UlYgcrp50gj3VUqe1c9aV5WOCKdMu8tw0EuLyPlgmqEqpBAsDuVCoqEQz6SttDk3+twB b2ke1kZjpGOlqMFShPRGq3AmTOVFcaCKZYoKjWtJAzyM8CB5TS3AVZH1WU/23I90SFkPec9VMrjt HDpry2KrtS09DjKn+NT481U1C8qq0VKsbTNG00hVZJhH6pI4tTG1he3t8ZNOk8qKy1Pl0DGU3BS4 xzT12qIPRtHTS0oWdPI/9iVP1IjkleR9LH6+7BmXtI6QNHVsEiv8+gQzu5JoqmKQQxT0GkLUwqRH MEc6TOwb0rpNtI596AFanp0xqFz0z0+4paNVp210w8prKdnZZJE0uPHIwU6XNiQf8R/h7eBHp0jm pUADPQkUW5qiWP7g15RvJFGW0BoKkH1tIR+pCo4/3k+6aK4HScoPLpZpVzrFDIKWKSKXVIJVkKem NFOhovyB9Tb+1f8Ar73oAwT1XSB+LpaYirlrRFHLUyRxVC64WX0v6Rp9I+iBb/nk29qI41cV8QA9 WqPJcdLCgTJTVJonfx0EhBSUcFBGLMdX58qjkD6+22ABPr1cxEdxXoRmE1VjGpnlFRLQmI0TzcNG A48MYIF9Be5PHHuoJJ49a6TQ3DUT1U330E0cxHonjIkiVYF8YYxqbEX/AEk29vRyNGaDh1XSOPSl xOYio4itRok1wwP52VmSQykx6ZJR+4kjANqUccX9uySlxTRTHSiBFpqHHpe4Sqo1eOop54BqEsFX TsBZY2IdjGT/ALuUW5t6j7ZCliFUdbnalFrjo1XWejOUi48Uw+9oKhaqmQuI2miUAxMgb9TggWA5 F/ZiIWCAgjA6RBWJJFadGvxdFU1tXTmGM0hSEKykk1CTBhIJW1AgtqXm4+nHtLJ8R68UIHz6m0FL /DM8KlLVFPJOQIQrCOGoN/JJIig6Y2ckC35v7Tya6VU9VHQ+U9GamghnTWfvpQlKsCemn+3UCeRu f82BwB9btce2tZ+LVmnT5Ip0Nmx6U46nMVTD5BFjDWJC7DSrtJYwk2AYKQLj+yvPuwZmWpPTkEuh hjpDZnYe39wZDdOwt1YxK7YHbmAyu3N10ioklPWbc3njqrbmeoKdiGQhcfXy2NtSNZvxf2hnBVg4 9a9CGCVJo9LLw6+YB8kui8l8e/kD3L0dk6uhyNb1V2NuzZEtdjata6iqkwWXqaKCWKqTh2anjXyA +pJNSsAwI9rPqFKg149Ow7bJIoYLgjoGkxb3tYEH82+nupuRTj0tj2WUmlMfZ04RUAiXU9rj2w0x bC8OjWHaxbpqkAr1EluQx0kWJAsPr/h/sPby4pnpDLVgxCmv+HrCsEjWJH+t/sefey6jz6TLayvQ sOpC07nhmt/re6mVeIHStLaQ9rPTrKaRLWZvz+R9R/xHunjHyHTxsYyKM3XExwwBrc/631t/sP6+ 9hncjqpigtw2kdNVXU2GlBpB+n+8X59qY08zk9El7d/hjFF6ZJDrvfn+n9fapccOg7MRJXV1HBKH /ex7cIDDpGrNE2R1nA1AEfn23w6VgawCOHXYT/D3ot1ZYqeXXMRsTYAn3rV06ImJoB1Ngx88xAVD b+tr+2nmRBUnowttrubhgEjNOlRQbeYEGQEnggAf72f6e0E16MhTToZ7Zyo+pWmB+wDpa0WEIVf2 gB9SeALfj+hPsplu8nuz1I23cuFVUeCAPXpRQYyGKxZefxb6f69h9faJ7hm8+hZbbLBDRmTPl0n9 wVEUGT27Sh9C/d1FfKUNjoo6ZwiEAj0ytMVt7W2SM8F9JpqdIUf7Y/5KdBbmu6gtt55Ssll0r48k 7U40ijNFPyYuR+3rhWZ6L6LcJ+ATb/jfPvcVm3nx6b3Dme3GEro6S9bnKmVWSBfGpFifz9frf+vs wis41ILGp6BW48y3s6MlsmlKcfPpvp6dpz5JCbt9b8n/ABJPt93Cdq9FNravdHxJTk8fXp5jgCAB V/Frmw/2y/W3tIWJyT0IobVYgFVPLif83TpT0RcrdSQT/rE/61vp7TySgVzno7tNuLlaoSK9KSno 2VbabfS3HIH/ABv2heUE1rU9C61sHRAFSnp070lIlVCGQgwuNV0N9YBsfUPyCLEfW/tLLIY2oR3j 16P7Db0vbdXVh9M2ceflx+XmOpFc8GHpDIqB5D6Y4r2u5H6ntzYfX3SEPdSha0XzPSzcpbXl+wMi RhpjhV86+p+Q6DyZqzKVBeZ2lbj/AAUX+oVRxx/tz7O1EVulFFB1E9w9/vV2ZLiQu38vmAPl1KZa WkBjChnQeuWRlWGM2vzJ9Li/tsGSXJNAfIcT+XSt0srFWiVauoyzEBF/Ph0harOLBIxpog7eRv3Z QCr2PHji/p/ifZwloXUeI1McB/n6jS85kS3lc2UIZ9Z7myDnGlfT7eoYikqC08uoNIGkkBBBHpLA C9rf4f09uaggCLwGOi0QSXTPcz11vVmx+eP8nTNh0Z8pj1UXLVMQt/gWF/rx9Pau6YC3mJ4BT0Ht giaTetrRBVjMv+HP8uhwjpBTQeWUhdPC/wBWJ/AA+tz7CLSmR6L1kpDYrZ2xnuDQDh8/sHX/0dCg Rxp4ZKtA8ccatFDISv3BH0klHDLTA824L/63vfRcGIJC/Ef5fZ8+oFTNJNMZqg6pJrCOFbxKsROl B41IMENraR9SPe+nVWg0rgDieOf8p/wddMJJYKpyEOlNR0qFREEiRIkQSyhQF/p/xX3rqy0DJTpm 966VdOlOpkgjYa2WBpfJc+iJW0sAo4u0nPFz72OmJME549TkIX0X4dFfSBYDg8f4D/e/e+mT5npw xecyOHqA1NV1EBUKFNPKVjZQ36KmnN4ZAx4vYMf6+9U9OtPGkq5Wv+ryPQnncb7lwMePpI6KoyVF WQ1tLqqhRVU1RFPHUJTrHVWop1up0qrxyc2sfexXjXpH4Ihl1NXQRQ4rQdGMknx+6Ett2QPPDEsU uJjiMeSgD0wklFZjXRKuIU0rEGRA8bAXBt7s/dkdFigxH9Th6+X5H5/PpJw5IpSU0aVVNVTUs6TR NUI7TQtFMoqKVfENZuFPBBvxx7aKDp0rUk6SAR5dFhzaU1Zv6uoaGZa3HrueXE4tygjjlxy5aVYQ q2GmNkc2v+D7rQ4rx6PYQY7NSwo2ip+2nQvbv6hoaqSoqsCWxskh8qQVRaWhkJGsxI6KTTMwYWPK G309uUI4cOiqC/dKCTuA9OP+z0X6txGd2zUxT1NPVUEyS6qaqjv4mK/2oKqO8TkXsRe/4I9++fRw k0VwCqkEEZH+x0Ku0u1KambHQZ6lDNA4p5atAPt5qHzJNCs0Kr5Keoo6kFw8Z0MjupUfX3YHFPLp Bcbex1NCcennX5eo8qHPQ+ZDF7d3xQa8nSrWUVPSyV1DlKKYRVtPGT6J6SdVDMUj0to9WrR9L+94 PHj0VJJLbsCjUetCPL8x1mxeQ3ttOHGtUjJdnbPkp2x1PIJYqXdOBMEUtWkNPUSo8OWpaiFf2o6j mRxoXSwF7ByMNnrbC2nLGqwz8f6B/LiCPl5dL/G7x2nvDHxZLb9TLWJh4zVZnDSxtSZmgxlfppMy uQxom8sQEwSoimpy8Ia5Nvp7bbTXUBjgf8nSWW3mgbRMtNRoD5VGRQ/tFDnPTRuHZu1MpIa2maqw uVBE+H3bg3+1ytOZ3h8yZGNCkOYpJVZJbS8lXkAI96Kjip69FPcRjQaMlco3A09PQ8cj5dB9U12e 2pSxrnKIV+OSZ4p957UlqKjEVdAJZJJU3Dtkq0lBOZpkaQqpiH+ptydqSqgDh0rCRTsTE2l6V0Px r/Rbz/w9ZKOLB1eZrawZV8hjqrFwy4zO40tUYyOVaU0tbHUxxyO9BNCmRTTE6hboQQB72tCc8OtN 4iJpKUcHIPH5fbw6Su5djYmsyksO4DSwVlRSYbIw1FIVpqqcVMc9JV16K2sPd1glePSY7Cwt79oA ahPEV6fhuZI1BhJ01Izw9af4egG3V19nNuWqzG2Rx0iGb7+lhlAhF7kVcWkmnt+G5jYfQ+6kEU9O je3vYpsE6X9D/k6fdqdwbswSxUdXkZMlRU6xih+/AqZ8e8bKUFPVtepSnZRpZCXS39nj3U6saada n2+2nJYoVc+YxX7RwP8Ah6X+Tz20d/bOzuI8NTj9043KV2b2aavQUqccYlrstg0rYYoqeeLzGqNE r2lCmNLkL7rJpYA0o3+Q+X5cembRbmwuo5B3QMultPr+FqcfStMcT0W0AuLtz/RfwP8Aivup7cDo RqDKAzmvy8v9nqRGpYn6DSLn/AD22Tw6WQqST6Dp0hyP2w1OdSKOF+jlh9Av+uR/sPbLweJgceja DdfowHlyi8B518gOua5/N1beCGpjpAoudCrHxqA5dxJLxf6D3U2VpGNbxlj+3/MOnV5q5lv2NtBe JABxoAvn5k6m/Z+zqFlKnLlUp6+teoif9xFEuqNtJtcqApuD9Lj/AFvb1vHa1LwwhWGOGeizer3f ikVrum5PLA3cBrqpp5kY4eVR9nQgbXw1HFillnjSabIIkspa3EOpZIYVIN9PpDH+rfX6D2S7hdSt clUYhUNB9vAn/J1LHJHL23wbGk1zEslzdqGatMJUMiA+mAxGKnBGB1ab8S/g7ke0duTdxdk00+O6 3o5AMDhXlkosjvarWURCZRGBVxbfWVXjEsel6iRW0sERi1bSyMyGaXEQ4fP/AGOknOvOw2h/3Xs7 K25t8bYIi+VOBf7cKOOTgfe3Pj91BuGmOFh21S7frMTSTQY98Gq46XDa2eUQ3hC02QjjZi1po5AS xN78+1j2kcgppp6U8uo52vmnf9une4+rabWwLrJ3Bv25XHmCD1UHvLa8m0ty5Xb01VBWtjql4o6u D0pUwEa4JvESzQPJEwLISSp4uRZiUyxvC5RuPU5bVuFtvdjBf26lQ4IKn8LDiPKo9COI9DUBHvCG B4FyP9Y+9ByKdPSW4IOBWnQo9AdD7v8Akf3l1V0TsSAT7o7W3zt7ZWJeRJGp8e2ayENNVZjIGMao cVhKFpaurl4EVNA7kgKT7VwN4siRr8TGnQd3aJLK0ubyb+xjQn/MPzOB8+vqn9TdbbF6U2V1r0V1 5SQ47Z/W+2dvdebSo0hjilbD7Xx1PSS1VVLTxQxTZTKSwtVVVToT7irnkkclnJIiuJAqLDGOGOoK RmmneeRu9mJP2k16MytK9LRKAZY9b/tRTRiPQGfU4tGAZQQPqSCL+06AVpx6dm06aD4ulJS0peCW oWFWMSaDCFbWdaXLh/oZIhz9Cb24/Pt7pMSB9vSdnWSq/h6vRyQTG37QZZUjLH1pUOERQVH6SFuT 7uqEmunHV0dVqQoJ6RO8czFgnel8oll0tLVquhZPtQoDAyDWVdRdbW1Et7dBTFSOHSpGYN0XPfkG Ok2nTZOqyD0zZOKplWmx62SSZJz9u1QigsVlUaSF9Kk3PupAPljpbG4NTwPRcMbt2DFGLJRS1FVT StJIYoT4zDSio8wKqxEEmqRioP6ubX/Hv1FqewZ6UiVgKKcdJ7s3H1mfyX3uOwkklFTPGsddEi8y NDqa1k8TSPYo1lHI5F+ffgIlyyY68WYmuomvRb9xV7R1UVFJ44jDS1FDPTBlPhnWN4pIJ1T01Cxp IDfkXB/K391Phk1UAdMNGzGpJp0Ekm7hUS5gmkD1m36KloYaZX00yVdUWNRUgsW8skVEnqv6fUPd w1AScjpiSIKtQc9BbXbtgraCtrKWmVWNsZSLEuiemkUspkngVjHNHMZLknhbf19sFvE4+fSR5HRl Vc9KbaxxeU29QUS14+4xc0tTmcfCv/ACvlPjWapomsVjqYvVrAKyKDbkH26qCNagZ6qJ5S3Dh0Bn d+YpMBhKn7Sqhllp1lDx0zIsk8MeoVEinUFmT8iwDj2xJVj20rTo0gldsHh0jOuKGb+BUuZrWkE9 VVQzrSzxLUxPjailkel8by2PkmlKhl4Klf8AH2iaKQnjXpYgT8ZHSA7U3DSmkDUEUENfSNIklFXO sVbUhdXkejfQBpJJNle9jx734bCmc9Ul8EVzjonWSyEbt5v4aoVW/cMvpdPI1wHRlu6/hWBJt78U rTPRTNJ6DHTHW4bb+QlmjqRpapoljii0AwmVwwLRkAatQa1yRp/PvegeQ6bjcmoJz0j67a+KxMUf hpJqiaNVhF5HmVGAJLx/V9CBeAT9f8PbgUAVPTh0/jp1jNNJDTQ6qSasiaRYUVwY2SOQeuQo1wxV j+R/vXu6SqjGq1x0XyMSSFwOn/A5aqiYuskka0uqCnjnV5okT6liZNSqXTgWHNv6+3JU10deHTCh 60LY6FbFVcNfAqrUvAWi11Bp1HjLA8hEIVoSCAODY3+lvacVXjnpWnZToQNt5mWKSCmqZahadR6X CIRC1/1gEWD3N7X5t72z44Ejq8krEZGPl0M+PFLJAVeeeZZKdi7oqRyLIJD4dMoW2mVm9Q/Vxxz7 qhrX16bDV6TNXgPO06pHK0zThPKGZVEYXUA7IdIhe/F788+/GQL5569508uk44rKSukpZqacVVJJ 4JHVVMckQSP1wtZo2VA4BIF/qPdGlJ6dRmUUAx0vxQU8P2XgrZvNXqjNq4PlUXkjBYK+jUDa/wDr e3IpyjBgMjptjWpPn0eHpiR4BSZCuiiSVBFEkcGpqhUQBWJgddCsSt1sfawTyuCW68gIOleHRwaC tkoIoZYtaz1zXiqKhwFZHLeZpiiExnRxpbge/UJ4nPSrw1bjjrhlaWSWrgaCoqGSU0qqYLLHNSu5 WVkdNMknh+qgEcNzzf224PdnFOkk0YUinR0dk7XpKzCUchJjiQpFTyNwJJkQCSofQo02H9kai/N/ aXwX9Oma16E2iooUMVPJTxeMQyIrKXVagSIykcs1gGBAufpx9QPd1hIFa562rAHPDpsmoFanp5oU dXx1Q0CwRPaaBJjci3OqNbcC3ovx7T3CYFcdGtpKakjyHWgV/Px2HtjZ/wDM/wC+xtjFUmIg3VBs zfOZhowEiq9zbt2zRZbcGUdAAEqMlkZXmlsBqkZmPJJ9oXfTRfkOpS5ctxcbZFNJxLMP2Hqmxo4o lubf1sP6f8b90BLHo+MUEC1PUGo0SBgv09vJUHPRVeGKZWVOHUGURRJckcD6f77+vtxdTGg6K51g gjBY56E7qHqrM9v5TL4/D1MOMpsTjpZ5slWI707ZOeOYYbFLoBIlyFTEdTf7rhjd7EgKyyK1eQ56 C258wQWKL4SVct/LzP5f4eo/ZnR/bnUkEWQ3ntSqgwlS6x025Ma8OX2/LK4ukEmToGmioamTnTDU +GZgCQhHPtxrUrTUtB0lg5gS4BMbgv6GoP7OgTOQlc25A/wP/GvfhCo4cenDuc7tQfD1z85fi9zb /Y+9aKeXWzdNINJOeoFSRwP98P8Akft1Oi66OOHUPSb+3a9INBrw67+3klYBQb6WI/xK29N/wTf3 4OFGfXrzWcszAIudJP7PLrDE/hks6kgGzqeCCDzx/qh7uy6hg56TQSm3lIdTStCPMf7I6UNPHj5L M9XToCAbM4U8/gq3II/p7RO064ETHoV2sW1yhXk3CJVOckA/sOfy6VeNw9DVrqgmgnA5LRyI5X6f qCsSv+x9ls91NGaOhH2jod7Py/tt8uu2uI5R5lWBp9oBJH59KqmxlNCBa3BAuB/T+hsR7LpJ5H6G 1ns1nbgUGR09JFFEF1WS6+km1/8AX549pSzNXz6EEcMMKpqoopjpPz5+uwx1VUcGVoyxAnoVMFbE CwNpqR2eKUKDbUjL9OQPa1LOG6FI2MctODZU/Y2CPsI/PoMXPNO5cusWvYor2w1fHCCkyiv44iWV gOGpGXhlRx6xNvGOsuaIqUI51cSKf9rQ8rb3YbW0VPFGf5ft6Tye4MN+S23kaCM1ww+0eXSKraye u3AjtJqaCjNiBwNZYsAPxcSD2bRRLDZMAMM3+r/B1HG5bhc7nzVHI0tWitzT8ya/8e/l1JaEn1Hk n8Hn/bX+ntoPTA6VvbuRrY1J6yQ0hb6iw54PvTSU+3p62sHk+IUHTrBSEEafr9bfj/Wv/X2neQUN eHR/a2GkjT8X8ulBS4ppnDaTwBcn+z/xUH2iludAIqOhTY7I9zIrhDWn7OlLBQRw2FtTH8f0/wBb 2XvMXr6dDK22mK30girny6eYae6jgcfUn/ffj2ld/XoRQWoCCgHDj0wYKvhx2AiklZTJ91ldAJ+t srXBB9foFAHtbeQtPesFHbpT/ji9BTlndYNq5WhmnYGXx7nSPWl1MB/KnSayOTFVIXeVUB/3YxJt c/pVf629r4LfwwAFr8ugdu28i8laSWZVUn4if5AdNn8S8Y8NIhjUghpyLyMD9dA/s39v+BXukNT6 eXRN++fD/wAXsYyqHi5yx+z0r0kc1VTtUNENXgXSGXUQAbXMkg/I55/p/vRpaxoEDfj/ANWOgFzH e3L3bwDV9MKVFcV/ib/L6fZwzUOGJkSae0kgAZYhzGotdSW+jEf090muhRlTC+vSjbOXz4kdxcUa QZC/hHoSfP7OlZDhJJo5GYepo30/65B0/T8ey17tUYU9ehxb8uSzxSM+XZDT9hp0HW2gBncYxUMq SNKwP0tFFI//AET7O78/4pcCuSKftI6ifk9VXmXZXKgqrliP9KrH/J0M0riqAZmBUeoItyFB+pH9 fp7Cygx1AGeshZmF8Azt28QBwA+zr//S0INTTVDPLMjyvrlnllLssEcNiFXgI8hPAA1AH3YcekIW ijFAOHzJ/wAnTZreSZpLM51PIeLn6gKzH66QxHPv3T1AFp8unOVI4MfJApEtRLI+udW0RiKnVWZU BN3u5sf6m/vXVAayBqY/z9J73rpX0844B6eoj/tCSJv9gySKeSQBa3+x97HSebip8uuQfm+v1IdI BFwRpAa4Bv6SB/Uj37psjrjFUKNYksEa+oFSfUPp/tTHn6ce9/l1sqcU6xCVo3V4WKsOVuAo+n6u Lgtb+v09+63Soz0Je3t0VYigqMhNLNNTOsuOkWeemyOP8YsaiiytG6ZOiaVuFKs6ccqRx7bZyrUU VHVDZI4Y6yrH0AIP2qcEdLSHchSlr8jFWJk1aGurZ6HNvDjNwxTRxM8s9Fkkgjxm4ERkDsumGpYX 4JPvYZTwND0ja0kRkRo6AkDUlSvHzHxL/MfPoJdh0zZLeWBhVTJKtQ9RpdgrSS0kU9cLkg8sYh/i T7qB/h6MbtgltKeGKftx0cyDKLS0lSv2zP8AbzCnyLoyT1FK8KRpDIsUvono5GYaha41ce3CcAgd BkrVga8eHz9fz6TO4sXj3eeOppnraOrP31MY6Y/YzRPA0VRBPSFr08p1WuD9RcG/vRwQfI9OxlqA qaEft+0Hov8AkOsJp0lmws63hqpKX7epay1CvGauhqKab6FKijYAhuRIjg+/VPHo1jvip0zDyrUf zx/q49MuB3Vu3r2sNO0dRHTCQPJja5H+3cq9zJTFwUQsR9UurfkH3sH06elgtrwBgRq9R/l6NRs7 f2D3vTfwmKf7GeWB3gjN4KvE5SNkmo5wqSqs1GlSifS62BuAPfiT9h6Iri0ltW1EVH8iPT9nXs9t jb+66OnqLybb3Vgqh8Xkp8PI0EtFKzFKiZpEtOaP791kQHWn284seB792nPA+fXoZ5ITgaoXFQDk H/Zpj7emSPfe5tpLBQ72xH3v8PVqeDceMp18ksUElh/HsQqNHVAwmWM1ENm0P6lJF/dBVW+XV2to bjU1s9C34Sf+Ot5eWD6YPQ40jY6emxmZwkkkmHz9BHVUn8PqFiM9FGB50gnlRRPUAM0U0MygrLFY nj29RWx5f4Oi06w0kUw/UQ5qP8I/mD6dA1ktg1WK3PJn9n1VDisi9NWvPichAi4fKyzr5loclQx+ NKc5Ol1oXjtpmjBFrg+6lSta9GKXSvEIrhS0dRkcRTzB+XGh8unLJ53E5vI4Og3Bh5No5/7GooKj GZ14YaOpp56OVhNtTdCEJXwS18MJp4JNMsbNpLOLn3skNQefVFhkjWRoZPEhrWo4j/TL5UFc8D0/ JQ1NDNTVFelRNR0iUK5jB1ULRSUlNXoK6iiikqxHrjqILmNGJjLO6j+nu4Iw1O30+XVNSnUooCa0 PzHQF726hoauavrNsTos8E9bJNTQ0s8dNLHUAZHGymE3fHieGZ4ALFFkhtx9fdWQcUNR0ZW24PGF WapU0+30P2+vQJZGsy+NjbbNfTrRT0896x15qJlMSvTxs6sUEQjYH0W1gi/09pmUVZvMdCC0Ecrx MDVGyOmXQB+mxNv94/w90qT0d+EqjsArTrhYjn6f4/j/AGPvXVCpGeHXSHWxkNjb0x35CNcXlI+h IHI/x92OAF/b/m6bjJmdpzQ0wvoD/FT18x1kSVY3pJdCnQuiQEW16wTqc35IZib+9FSwkXVxyOrx zLC9jcGNTQaWHrWuT86mtevZSoSolhZBpCwBWH9H1yE2/wALW9+t0KK4Jr3f5B1re7qO6ngMa0Cx gEfOp/yU6OV8ROlM18j+5+pOl9vxS/db0zmMoslWRx+ZcRtyjiGQ3RnahdSWpcHt+kqKqTkeiIgc n2SSwNNesgyC5/w9SzZbtFtvKUV1/oqWihfm5UKo+XcR1tNdyQU2w6uDbW26SOg2ZtbDjE7YpqCR UFPjcNS/w2mV/KzSSKaSnQhzc3J5JJPs5meoCBaDqD0gbxHnkYlyxJPqTk9Vjb4zDymtqX8iPXlp TJI4CiFGLiIMTdOB9D7YAPStXKig9eqYew8/Dld7Z/IqXb+I5qsSE3BJSnEio7EnhWhprj6/Ueye ZWmmnf8ACP8AYXqdNmli27adltiD40qClPIlWlNfTFR55p9vSVapXjUwv/UnkX/r7YEZzTo8e7GN ZFetpX/hLr8ZoN9/I3uL5VZ/FrUYboTZK7Q2RVzqQsPYnZsNZS5DLUEjKY5qjAbDxtdSTxGxCZ2N h7ONmtwJZLh+Cig+0/5h/h6jz3E3giyttsh4zPrah/CnAH7WNR8163M+vMhJnM7X1UtPNBJicrXy MahLRyw1EhWljWRls4fRyqkhfzz7MHVWYt59RWjUVQejZ0ePeenjeV0MC07yrFIC0nmf6K300i/K n8290VaHj1Yk8adOS45ftoYqfyrDFD5rrcxyu7MXVebu7MtuTxf28lK549MEk56R71EiT1kzwrEy sYtUqGKRXjNoxDGLoQTyxPJv7uwNMHrymhFegH39hqiqqxNFqqVmLpVEIrCCRlXS0jX9QWQ3AF+B 7ZJA6XxHUtB0WnejGOip6SpIkajkaCCRFk8BhD6zSCIHUZGcXJFyL/6/t3xCaY6c1aak9AwcxkZG lpEeI0vlWNWFM7ijLyBpXqac6VeG5CvyL3FvflfJrw6o1wwI0tX8+lxn9xY+PFxTPQIIKCeOkjEG kUrwiLSapo1cFmjeQn/D6c+2ZgSO046WQtI9QePVfvYELQVtfma6p8QTIxU8DuojE8ju5KiSAFJV lEtuf1Hm9/aWkoaoPS2hVRmvQQ7k2ZPFQV2Sx7Va1VYUq9FM+tJlPqaSV1/TCifgHV/X3dTKG446 a8VJCFKcei37qoa+knEoMsFIza1kp30+WWc6FjKraSyM/PHAP9R7tU+vW/Aj+fSOObrtq+TRlZMT kKXIhpMm0j+WophTtIlGscilqmD1EKr30m309+Fw5AUNjpPJDGpOkdvTVPK2+qeLLZGiFfh4aiN4 KrxMsU80bHUlTyGSomb62BVfdNXnTpvxPQdOlTuiuWjWJ5fsoqCJngpqZYyIFpFdYGAuqlY4nY/4 2497EinHXjIx4k06L1v3cENfSSy5VVHmZDSZN18ckyRFo2ZIvqk8n0NuP8fe9Q8uPTbMQpI49FEz izfeVEsNXWVdLVN5IP3SwSNQFNw3IOo20j6AX90ckUp0ieViTU9Ttt0mQyJ8wNqelXxXMpaSJkZW d/Ha5Rh/jcn3QM1aDqmpjgDPQoLgaR9Na1TWOs8QaJA6CGVgoYyOp9Z0kkfj6f4+7d7EUr+zrxZv M9MdeuupjIVKeGOJozEFLyNITZZCDwq3sbk/4e7pA7k4z0mMkuqtBp6dEgqjS01XRRRLCyNARJBz JLGusyOtiCJHchR+Pr+R70yGNqaun19a06dschbwPLDHEI6UiZ40OoSGS6I9rck/n6D34kDh07qX 16WtHTJPRxJJKYX1zVLubGJ9JGiJQD6ZHvx9R7oJM5XrRYdLPEblp6GWtp6aWUyPSozUM4jkjSaE hlniQXcRO9uTYj3bUCK+nXsMelpgKqqNes9fI8weIq6llNMwcBk0qCWLhyAfwB7aJ1CoSp6dVSeH CvSxOBiytZ9zqFOYInEyswiAYAP+2FB5aK5HPNrjke9iM+fSoLTAHSeoUp1yghefSIamNY/MpaQx I5uZQ30DPySPp7UaQBSnTckZIAUZr0d3qGkraipYmOOV6+FKennSQmOXQjKosLiJhe+vjn24gI+z pOyutTTPRq3wmVWgnpV81TW01O1VAHGpamSlAD0MfAMwY/W+m9v6e71P5dW8fTgjPSux2MrosZj3 qKdPKscEskbu6NRzS6XlWJyFEya2KjTwQt/p78SaEV6TvIZCCejobGlX+BUKwlpqWKNT40D+MVer 90OxsYwSBa/19o9EhYgVPWuhGp6zHQ1sCVNdoyayM1LEiqySOHfzsebBbOFJ/wBUB/j7UICqgHqp 49NkEay5UyKwUV08hhVTqEcK28jSEgWkEv049p7kdKbVyHA9etCT/hRdisnt/wDmZ9j19dFVRUG5 evup8xgZp49MNZjodl43E1dTRy6V+4gfOY2r1NzplDrwFACAxamUjOKdSdsO6pBtLQ170kP7DQ9U F1OZa5CkHk8n8f7D2rS1HE9F93zBIxIVqmvTa+WnDEoQT/iOPrf2+LdKZHRQ+93KsWRhXqFNVz1B 9bm3PANh/vft1Y0QYHRfPfXN01ZH6s0+LtGdpdSQZwoIKrLZXIZxpZVUM0SMMZS/X9xkWnoxJH9R +4bfU+1EUuk6FGeg9fR+LITXK9WO9Okdg0WTxGVqY8ztrLUSw7iwNZQw1eOymHqnEVZjq+kmBvG6 HUpsCsgV1IZQQ5I0hBNPLh0Wq3hMpX4weqQ/l30Y/wAe/kF2D1pTRSrt6iyFPm9mTTSGaSq2Tuaj gz21p5ZmVRJUjD18ST2vonR1JJU+0YbA1cehXZs08Eb1+3ouUaWH0/17/X/kXurN8+l8cZ4gddmm Ln/XFx/r+/a6Dq5tWkIAHHpwpsQzlbi5P4AJ9sSXIWtOjSz2OSVlqtSelRR7eJCkp/j9PoP8R7L5 b7jQ9DXb+U2IVmTHSV3fikx1VSug0/dQsXTn/ORMFLk3/tq4Fv8AD/H2Y7ZcGeORT+E/4egPz9sk W0XtjJEKeNGaj+khAr+YIH5V8+uWB23SZSietqa6SELNJD4YokJvGqNqMjsRyJPpp4/r71eX8lvK Io4gcA1J+3y/L16vyvyfY73t0m43m5PGokZNCqK9oBrqJPHUMafz6ZsnRJjazwUlVJPaMOZNHhaO 7MLHS7caQDfjg+1dvKZ4tckYGeHGvQe3rbY9n3H6awvnkooYtTQVqTg0Y+VDXHHpY4PcVVEEoKm/ 3kQspl9fmQDUCWudTBOb/wBocgn2VXdjGxMyf2R9PLqQeWubbyFY9rvK/vCPgWzrFKg18yBmvmMg np3qMjUVHLEC/wDqSRf/AAH+HtNHBGnDo+u93u7o1Y0Pyr/LpvYk8yHgcgfkn/H2/wAOHRS7FqmU 4HScycBjmgqaGMpUtIVIQcSehnsV/SxIT/Y+1tu4ZXjmasYHn5dBHebYxT215tsRW8L0IH4u0nI4 Hh+fXDEz/d5eafTp1UnKH/VKIEbSOfTrBt/h7tcp4VsiV/F/n6b2G6+u36e500rBkfMaAafKv8ul pHCZben88A/7f2VF9Nc9SPFbGcDtxXrLJVY+ieOGaQyVT6QlJTxtUVLki4AhiuVuP9VYH3URzygs i0j/AIjgftP+Tp+W92rb5IraeYvetQLFGpkkJPDtWtP9tQfPpc0eKBsStxwQLWI/qLc+yiW4pXOe pL2/Yw2kle3pQxU2gAIpBA/HHH0H9B7RNJXLHoWwWiwgLEndTrMlI2sO1wFBZiT9LC9yTxx7oZBS g6UR2RMnisKADJ6TeY3bicdrp45kln/TpiBmfVxfTEgZ2N/zaw/r7XWu23M9HZSE+eP59A7mDn3Y toMlrFcq91wooLGvyUVJ+34R69B3jp5shC1N6kNNJO0yH9UaT1E1RG7AEjRIr3FuL3H49nk6LCwk wdQFPyAB6iTaLqfdrZ7Q1VoXcuDxUPI8ik/JgcEedRxHXB6fyzKqqWA/Qp5NgbayP6+9h9Kkk9Ul s/qLhFVSVHAf5en2KgjpoTU1DKuj+otyR6FX/VG59pGmaRvDjHHoSw7bFZW7Xd0QNP8AqAHqfl0z 09B53kaJBJJKzM88guq6j9Be9+Px7UvNoADGijgB0QWu1C5eZ4UDyuxLOwwK+n5Y6c6GjTF1EcdR d6CpeOKGoOnRR1Ta7QSn06aaYgLEbmzkJ+V9sTSm4RimJlFSP4hjI+Y8/ln16Odt29NluoYroltr mZVWTFIpDWiNwpG+BGamjkR/iTpVz1yRoIaRVOr0yVBW7DjSVQfkey1Iix1yH7B0OLncYoYhb2CA g4aQjI8qAdAxt2CJctO8n+ZpjNF/UAvKUS9+bFUI9iq9djbIF+JqH+XWPHKVvAm+3Mkv+48Otfsq 1B8+APQpweSZiIo0iiBVYpEV2J+l9PFo0P0ufr7Dr0XLMS/mOpttvFndhDGEhFArAEk+tP4QeFfP r//T0EV9Iv8ARQEiIVSC7P8AuFNX5JNr8e9+XSY5x58f8nWZ45Yn+zBHkLxxOhCguT+8yM6n9Cuf p+SPe+tDPf5U/wBjqTWRxwQx0yqGkjpHed7gnySsWKgWsqqOTbn37qqkltX9IdJ73XpZ074clppo AobzQtYEXs0R1hhyLELf37pmYdoPXnQRs124JK6tJta4sbckm4P5926a4/b1iB9Lgn0l+CCD67mz WP0Fvr791v0x16nQzzpHcetjqJvwoBMjD8cKLe/E0Gerha0HSmqJYoUEx+31RQiNAqsknjWzBAjO quQp/Bv7YAJPT2OFOk4a6YRVSySuWnSwAZhG6Ow9WjhTpUafpwPdtIxjrfA16ctq1dNRZP7mrpfv IkhdQglkhljkYqVmgmglhqIZowp0uhLL9be/NUZXpuWMSpoLlT6in8weI6MngdzPVNE0FbDumnBj 8mEzlVDR5zxoLKmM3EqpSZRowLLFWpHKfprPvSyDg3HoluLN4gWZaJ/GlSv+2Tiv2io6V1FmKLKz HF0kz43NFpIKrAZykaiysdEbvFNFTVEhiqyGtaSmkkB+vt3FKDpGUZV8TDReTKaiv2/5+meqozjc 3S0kM32kWVlWjqGqYRJSJWjXW4SoKCxVZpvPStazL9wP6e9DBp69X1a0LEVK5/Lz/ln8upGWx9Bl 4YaDO0dNphmemkqadTPHTUZvacsbSFVRwbN9ebe7ihqCOqozIdcbGtPsz0EGU6wy+MqKfN7Rrw1U s9RPRQ0jMjAUbqC9LKzM1mHOhxyDb6e2yCBnK9GMd8jqYrlO3zP2+v8An6UuzuyY6rcEP95KRMXl MvTxQ1c8+ulxuWmXXSNLMW1fbPXUhMJsPGJo1Nwbgapxpw6ZnsikbG3bVEp4eY/4rj0L9bB9tJTw 1LU9UH81MY6rXK7q6KYyk2kH1xlGV/yGN/p78CCNPSAENUgHh5dZqTH5Gkiq/wC5k82OmpsfHLDt bOqi4nIVYmTIvF9o8sUdJVZCNHRK6idGlLDyIzMT7sSy4I8+mmdSQLgVGr4l+IClOPy/hNR6U6c6 HcmA3FDPtvMrXbUymWKLSUWUaKRRUuIJKZtp7sVWpMlpmMc0EE6RzFUZQCb+3A6kUrjrRhmT9SMi RF8xxp/SXy9CRUZ6UMGLptyYaqpK7F0+WoVElPkMFmo1aooq+mBgrpaenmVZ6KqjlQToUZQ8Li1v fguDTI6qXMbK6uVfiCPnw/Ly6Q2Tar2dqpMXFkd3YCtoWw+W2ZlsgWr8JVsomwGV2nmK3zT1eLhq 6UAUc7OsT6o1IEgI8HUYr5cP83+bpUmm4FZKJIDUOBg+ocDzp5jiM+XULF5XDbipY8ziqisgroIj S7kw3kmpcrjzSVa1VJDUwVTJLUqKKeoKkgozRAFuPewwJGKH/N1qSKSFvDkAMZyp4g+R4fl0XzvF cdUbrhy+MiNOKqmWlr6daZ6aGOupArLPTxOzskFbRVETgFj+4HsbDhqSmtwOBAP+T/JX8+j3aGdY 1RjlWx54Pl+Rr+XQOI/Pq+ntkrjHQhjmOrvOOpiiOQaL3v8A7ci9yP8AYjj22SVz0vASUaAePXNY ggcEixcsP8AbG3+3961EkH5dbSLww61FCxPUWVULqg5UXY/0/oo9uKSAT59JZlR5Ej/CMn/AP8vU KQWci9wvAP8Ah9R/sQD7dXhXotnGmRlrUDH5dbKv/CeHpiPfO9vkt2xXukFN1p03SbdxdcwKvS5T eOdpZqqSinCkx1hw23ainbSQTDUsp4Y+2IoQJ5pacB/hPR3e7lIdn26z1jRWvH+EUof96/aOjwdv ZOGoz26YK0tWTUwWGgMcoIKQyHT51uQYpUJ1ILer3VTGznXSnRSZP01QdVS95Z3I4SHNZGenQ46K jq5HEThTG8UbGJYlPCXtb3djCtSP8PXo11OiD42YAfaeqbctVSrkaFUSWqqENTVzxRkeTxyRPCJC WIFy8h+v1t7KoEDwzszBVNACfWtepY3m6e23PaLe1haWeIO7IlKhChQHOOJOPlTqZG7zKjmOSLUL +OUAOp/owBYA/wCx9sMApIDA/MdGsUstwscjROlR8LDI+2hI/n19M3+SJ8ZaT4n/AMs/qeGvx7U2 9+6MRN3tvl5IZKWqgreyKejbbtPVQyEyx1WH2NRY2lI4HlhZrDV7PYAsFqq07zk/n/sdRDv11JuO 73MgNYkOhfsX/Oan8+rQ+usXTJj6yviqKufFyVLQU1RUyFpp/GQZ3dyimSqmlazELYAD3oEEAjor ZQAejMz5Kmp8ljcSiVE71WOSSokh9VHRU4fxRxyWuVqGHqBP49+6bqfXrLmqo0cQgx0chESi8g4E Ed/oyXA1MeQfr7eGlfPj1roKstXUdSsNXU1sq01HkIhVCLVMBUzNoimlYm8cF35/p7t1rpP7iliT HSVPkEsUL60eBHcmFrjyqPpK0h+tvwP8fbZjqeOOnEcjz6AiuwlQGoc8KR5sdNK7zyGMvC5Yi8RJ BSF0RtQP1v7sFA+fW2kJPr1ky/RlXm8TWVuBp6Krlplq63TTt9vXVVMIhIUqY/7Yi8hW7CwNrn3S Q5Y0oOnIT3KadE07DzlBtHFw0ebxTLkqGlMFZj3IMDJqZUVm1aPOFbULckjn2mMhYUX/AIvo1t0y vp0THdmJyW4c5h8VQQM+Miq3rq8y1cjU1HRQTRqklw1pKqZHLRi1lKMPwD7bBeuVx0qf4TU4+XSk 3DFT45Wx2PZ5aQU6GH7ogPUKPU5RkU3bVcKDYEe1cZEiEHjTpKtA41cOiidk4qsirvNSwSxJUTGa hkuwFTI8jNUrUJwiMSSVNuB9Le2JW0E1THy6MoYhIANeei8dlbpMWFFDVYyGrSaokppKl6RBWzsY 9CRwSsPIrwyXGq5Vlvf2nEqFqKM9MXMAXNc9JDA5asqKY4aOSrJmj1Y2jSeOnjx87EPadUGkMWPJ /tDge32KUqeHRaSoOn8Xp0ns9DWYZquDceqKpmWKQPTyBQC2onysDpvLCt7D8/X22NPker6Ay46A rdVPX5CSenaOKspYKcSQVDysZPE5DoA2oqkodv0ji3193FDwHSaVajUOHn0jKLa1RU080SFWnSSB JIw4bWramkMWs3U6z+OCR7bevpjpIc+XDpc0e1qjAYTNVMYkijeknWYyKhWaVVPjmjQeuNGBIN+f 6e/IVVl1jHWsgg9Atj1ztbQTx44S/dU3rrKtZ3amgo+GtTxysNbsv1/pa49meqNUqpGnr2qvEZ64 Yeaekx2QhrK6Srq5Klo2WR5DIKeP1CJC/pYAfW3tJJcF2qgoOq0HQi7aqZ3EAjlm8JCaxrFmA0+p A97yRfkG2ofT2nrU8c9e6VlPR1v8QlqEqqSWEWjqaUsykRMRrHjsFSYryrWIBPv3XuhALw6Y4oIv GGiMkcRjtcJYlNYBGsKfqDf/AHj3vSNNT09HHrBpx66osHJX1dRkIo4XlpaYQySRXWdQ7axYi5Zw OPVe9v8AD3rSoPHPVzbyLRuhLwOPjoo3rauSWeCQJoEGlmTQxGlTzpjv+qwuT7uKA8Otq7J5Y6Wl LmaatJooTItTIqK8ilZHiLGRCWjjsNapcAn+vu2PTp8XIPEZ6VcNGlJHSwz+CapqYZtUMlMhqauK NiEmEoX0KjDS30P+9+7K4BqQD9vTutf4qdGk6PmiOQpYhEKJ5j90sUUzilAjYRtB9Szu7C62sL+1 iEyAHTnpBNJQlVPVhEPhpZ8S1WkqQ6FncyksViYaWnkLWMov/Xgjj3pk4+vSTXXBPDqWtZi89XVE +sCOHywM6uXiEVJcGSCJb6fMjKVbkpbT+fbB1DiOtBifPoeOvap4aSrhiDVEBSKbx3uDTwSDVIth +oEhdI9R+vvTNpQk9XWp49KTG42XNbvizkclPNjXwdSgNN4jH5Fl9TiWMsDZjctcAkn2lErqKA/P qx6my1n2071EaKKWIiJpCfFI00TI2iE8a1tyXH6h/X2xK7FTWpPVoz3DrU4/4VLdPVGb2x8WPlRQ QzFoqnd3RW7arR+xFFFId69fxLIrWEtRT1GaLAqOIhz+PdrI1MiMOGR+fHozhnkjDxo1FYf4OtN8 Ann2Y9bCs2T1kWJmPAPvRNOPToiJPDrk0RjtqBB+tvfgQeHVmi8OmoGvVrfVWOFLtzaOIqWcUtDh sY5Cgy66jwr5YinKleebi1vdAkqSagOJ6JHIZnPzPR2enNw02F3OzY42V0ehFPArWmapZdLThfSy RAE2/BHsxRTIlCaHosuqIdVO3oKP5s3VlRuXY/R3yKxsJljp/vel91VK6biagWr3Js2RkX1Wlo2y SF2/EUa3vYFFcqIgHIoK0+X5dH3LokuWktACGI1AfyP8qdUjUeOapiilW5WQArccgH/Wvz7L5ZxG zKRkdDzbtoku4YZ0qUYCnSpo8CxAvGfxyR/T839l0t5n4uhvt/K5IGqMnhx6VlHiYoLFlFxYg2/r 9QfZdLcs/A46HO37FDb0LIKjqbJLTwXFwD/QW/3r20A7dGUstrbggEV6CfsCdZqjG6fosNR/vLxf 8U9iTZVKpPXjUf5eoJ91blLi62fRwEcn8yvUba8hOPqIr2C1Ze3/AC0hiX/rn7vuA/WRqcV/wE/5 +k3JMpO1XkOqiiev+9Io/wCfeuONpvvFy2SYErOZ4YQy3vEiX4JvqBsB/hp97nfwvpoAcihP2/6v 8PVNmshfrvu8uvZIXRARXtUfzrgY/h6xDGTSY+CbWv3EEVPUUVQWs/j8Ucpgl/BCOSEv9Bb/AB92 +oVZ3WnYxIYfOpFR/l/4rpP+5LiTare41j6uKNHhcmh06VYo3yBqFr5U+fTrQ1kdbSpNcKzXWVFu THIv6h/gD9R/gfaeaJopCvl5fZ0ebbuMO42MdxqAc4YD8LDj+3iPkes4QP8AT6X/AD9f8PbZNOlC xCTh8NfPqTDSknVGLtyf9h/h7ozilDw6XW1g2oPEO7PSMpqGprc/VUtDMaSUTVPrQsoURMQ62Qgk M4+n09msk0cVlHJMupaD+f29R1abbebjzVe2O2XH08/iSdwqKaT3DtpxPlw6Vn8G3AlficXUZhxH k2q7vTwrHNFFRwrNKfLo1q0gYKpvwTzf6ey36qyMNzcJajVHTiagljQY/n0O/wCr3NabrsWyXW/t 4N60tWRArqsSh27qagSCFBrQEiteHQoYTbWPxi+Okp1EzD92pk9dRMb3JkmI1Ek82Fh/h7D13fzX B1SP2eQ8h9g6mvlrk7atlQRWVoPqD8Ujd0jepZjn8hQfLpWxUumwW4J4+n+9j2WtJXj0PIbKgAXB /wBXHrhUVNLRI0lRIoCcAKQXc/6kKOfp72kckpCoOm7u8stsjaW6lUBfQ1J+VOgv3Puyoqb0NCyU scoPkdjYxQRsoeeX1LYFmCqCRqJ/wPsQ7ftqR0mmGojy9SfIf4fl1CnOnPV3dg7btjrBFJXUSfhR SKu2RQEnSASNRPoD0jqaiRF8hYzGQlmmYhjKf9UzD6/4fgfj2aSSkmlKU8vTqPbPbI0Xx2YyFzUs TUsfUnz+XkOA65VFNVIPuaNWhqIlJJVmCTw8s0MvqVdH5Um9mH+v70jxn9OU1Qn9h9R/q4dOXdle xAXe3oY7tFOQSA6cSjZAp5gmtG4YJ6d8LuHGeejiqKVg9RG5MrSKza0LLdkFvCC6EWJJBHtLd2Vw UkZJMKeH+rj0fcuc2bMbnb4buyPiSoasWBNQSMj8NSCKEmhHpTp7rAtfNFrB8QDSRwxG6gM1wzWv d2HtJFWFGp8XAk9CTcBHudxB4gPgAFlRcgA8CfU9OMcEMcS618ca/RF4J/4N/Vj7ZZ2ZjQ1bo1ht 4IoVEi6IR5DFft9T035erAoZoDAkkcoFPFA1l88r3McbOSAmnTqZuNKqT+Pb1tGTMr6yGGSfQeZ/ yU869Fe/XyrtdxbG2V4XGhUONbGpVScUpTUWxpVS1RTpNfe5fH0kkyzU9VTUkPMlTE0MrmwXWs8V 0aRjwislyPqb+zDwrWaUIUZXY8Aaj9h8vXPQOO47/tdhJcrcRT2cEfxSKUZvKutagsThVKVIpU1z 027X/h1JBNkM1JUQtVzXpwaSpZarRq5hmSFoZJJJdY0htVx9Pb24ePI6w2gBCjPcMfaCagUpmnRR yWdpsLafdeY5ZY2nk7B4UhElK/A4QozM2oaQ2qo4dLIDJ5yMIUlwWIYMq0ykLlKtCCAahirLSRn+ gu/+I9lRNvaNUETXXr+AfZ/Ef5dSCv755kiEfhybZsBBAjGLmUcO8kERD5AFvmOv/9TQSSXxmnNt VmeptfVdmsEHqBtpVR730nIqG/IdcWlWSpVlDLH5Gc6m1EAm7MzCxuSffuvUIRqnNOpDuXjqpjYl 1ZAWJ+j825+h0rxb375dUXDIPn0ze9dK+uSsyMGRirKbhlNiD/UEe/de48enlK+OqXRVnxzWA8yI njnW/wCmZbAxsL31r/sR+ffv8HTDREZXrhLF4neMkt4+VcgaWU8qVIN9NvowNj731TjQ+XUujgQQ l2fRUVSn7VSjFnjjvqIflUMjD63tx7o5rw4Dp5O3jx/1f8V1mEkjq3ljSRNJUtpjcDi1wVZwNX04 t/r+60Hlx6sMfZ0xSlft40JJkjlkXkcqoJ4B/pe3H9fd/P5dW6m4iNJHlDqWHouFK6+CeVBAP5/q Pem61506UyE0t6mmkBlVQYSJmjRyT+moVhzYnlG4PtqlcEY63WlSOPSjj3hVl4cduDGUe5sUhH2t NWoRUY9ZCNTYrLRSmtoj+QAWQsBZBf3sVGQ3SSSziZmkhJimPEpwJ/pL8Lfbg9CZiMzT5haOLF56 DIxU89JU4/GbyHiyNHNQ1KVlPTwbhRWFZDHLHZY6lWuOOAfbiuCaHB6LJraWDU7w9vmycD5Gq/h+ dOltW5aCGperlo6jCVFXHXo9BmPtpKHRJNLJSUtDlqcrjMpAKeQJ9Yai6/5v8mw1D4s9JFQlQFYO opkcfzHH/COoUFa6RQtSpPBHFVJUhQivFT1fhEQkT9M3jKN9L6WX+tvd8EEHh14qC2aVp/LqFXbV 29llqcXl6EI0plzGJlMugwrVlY81TU0qj0KlSyVSAnTplbgWPutAOrrNNGweNvkf8lf8HTXJT7t2 XRp5pane+26ZqOop4ZZX/vDgUR5Y2+0DXNbQzwytG8dyoIQgJp5rpoa06cJguTwEcvCv4W+30Pp0 Je396YbcyR1mFrYpK+hlpwmFmCnM/bipeKalmoq1mhlaknWKSP06SjML8H3cnWoU/F0imtXhJ8RM Hz/D6g1H5g/l09ZaHG5L+Mbfy2FSShyFLU18GKmopoazEVcNSZcxi0o3K1L01NUN97SSIx8ccsiI 2lLBsAjyofPphGdGSWN6MCM1wR5Gv/GTX5V6RuNwW8cVk6rKbT3pJXUlFj1io6PcMKVmPlpY5j9v icxUu33xSkLmnWpYianR09fjFhoNk47h/q/n0qM8LgJcW4BJyVwa+oHD504HPn0oaXfO3d5TQbZ3 VSydf71kDxwx5FEOOq43CEDH5UMkVTHUSAFEfSxcHSSfq6dLgGvd1preSBWmgIltxxpxH2jy6gZH Z9Pk60ZLKLV4PcOCqZqCrz2CeIz09ZRxkJWRxyrorsZXUUiTNHJqDxsy8WJ96DUNT1tJ9CaUoYmF dJ4Z/wABHqPPoFu26LKUtBPj91Y3xZbGNjXxu4MXBJ/As1SyJrg1QsvlxNVUUNQz6DeF3jsrD6Hz 0ahHxD/Af9Q6NNuZPGVoX7GrVTxBHz8/T1z0XUqD7Zr0JigPXG7L9OPdqA8em9UiGimnWdKh7aG5 /wBf/iPdCgGR0qiu3pobruR1VS39pgAB/W17f6wF/fgC2OrTSpGpf8ZH+DqEAWNhyT7dwB8uisBn agyx63C/5IO15esvgF2hvufzUVR3V2FuWjpspEsgMuD2zi6HAJRghlVkhy8NYyutyjs4P+DqrWNm pg9NyKfEEbHh/KvSW3bjtztJnZzFH/DIKyWNpXdTUSiNpFWojL6p5YtI1E82P1/r7LAqgmox0oCA Cleq6vk/Toer93ZBik08eNkqUli1kTNTsGEMosohaUAKeOL+6nuqtaAin2dL7VhFNbTrHrdJFbTW lSCDT8+HVOmEqHnnyVXVWFbLOiNG17wwAa40TUSViJJAt9dPtLdoqJBHH/ZAcfU+dfn/AJ+pG5Zu 5Lm53i/vqfvJ5QpU/gjpVQtThTWg9dNc9HG+FfRE3yd+U/Q/R0NJW1dDv/snbeM3J9jBJUT0mz4c hHX7xyOmLlIsftijqpWYkBQtyR7TW0TS3MUfkT0IN4vls9nvbyP+0VDp+1u0EfZWvr19WuBKKnxS 4qgxgwuFw2Ex9Lh6IRlMdR4+l8WJwVAoiRkiEEcUf7TA2Vh/X2IbmNSQoHDqFIAVQluJz0JFDjYY MfjacNqeCCSKSGKIqiyEKZ510qV1u5PqAvwPbKqFFB0klYs2el9gcZ4padwCpqdEbvJqaZo1F0jk NxdtI4uLj3dV1efTfSqzdDTyUNRTU62Lqxdl9RcqurUshW8fpYn+l/dgnqevV6BzPYnDQ0U+Lq9D RZLw1ZMb6DJLCwcxVQRWe7izWFr3+vtzrXQf7vzOKo8bURRVEc9VBJClGY1KwQ1U8doafxoUjEcM cOooWOsA8gn3omgr14CuOgMre7azZVLKYtsVG6WojA1RiKWopEhqZax46WaOiXItTUklRTreSVZJ FCotlLN70rBvt6tpP59DltjfPW0zxZza25Q24MktRRRSJlSMfJhqameqz+EyWDkh88GT9IVWBB0W Yn37ww1aDPWsihI6L58jeqMH2Rjoctt6LHS19dWw4+tFBJFWGqkrV8sFNWU8Z8dNUU9gPIjnShJe wufaKS3YEkdGltdaQEfqvSv6r3Ls2SuyMWNrZXV46CoKTmogMrxtMKbwsqOXporAsoKaRwL8+2tT gU09GImjkArToOqmOpgmpKvLU1ZjXBFNHNMjmOpaPW4WmRonBQD/AAufb8Sthj0lkYVbTwr0XPuL KR01FU19E1VVPoUxwpDMk8fj1CekiV09NdOt9KGzAE8AXPt2UilCM9Ximdfi4dFT3Lm4d1YuPFx4 2NIqZg8IqZYfv6dWp2EVMHj1SSypKSSwvZvT7LGjXUSB0reQONLEU6BSkwkuLfLVlJkiZjVQVDx1 DHzaYBoiiWSJWFN4yCrK4BP1v7dVQcMadJGjj8RSo6duz56HMbaweUpDLSxzS/a10pu6vWQRapl0 iN54zKr+ghSCgJB96aNQwA49XaPSGzjopu4Y83RZGUzJU46lSK7xpLeMLHIUhM8dzIhl4+nK/T28 DRadF8rELpAwen7D5GikxsdRTyKtRSDymNkbRLGCzFw/DMBKvIYAL/S597qOk/XdZ2DU1ONlgSOS qSWUTV0hiA0sSUW7MQojANgtjfj88jeD1rB6QEOPz1NBXTLVtRYupX7lYBGksjmYAxpMwCn1XBUD nTb375dewMdMGOwVdQLWVlfXCpSrm+5TyaUETaDrggRCXBf6Xv8A4e6mh8+tFa+fTxiK2peeKlhg npYDLFHNqYAnW6KWuxUqqr9SCbAf7apWnWtHz6EumrawVrU0IjrFp3McUvqjkJQeuJpRYS8/QG4P 9fexQdbCfLpcY7LxxaKUvJHWG8q46ZhHrYBda03kAs8YbUoBu17AH3rWPM9GUMeBkD7ehA2alY9b X05q5YXpL1kKrEocVEg/zVSjaXaB4iV5udTgge2HkFTTpUqpSjOK9P1LNkKJaiOSGWkhq2kgxztG piZ0clljLtZJCzcD6sfbIkJJp1SWFFA+fSs6/wBq5CbMwTS+WijmrWhr5JkQtDSLDPVu8oV1kd6i ojWNSpYgtz9famORsA9IXManTSoHQo5qrx2KyFLTS1EU5qE8sVpdM8MEM/jDzMV9CEr9V5b8j26a 0OOk75+AdGQ2Tl8fknxORozFTIlZQ0UzRem8ZmDzzeOHSVvTqVBBBU8j8+1cBLKDwA6St/Po3u4t 2jJpTfYSt4FpBin8jWeOBG/YVJPIBrUGwJsLNyb+3jjPVGBNKdKDYWHyGNSPF1jNHXyws4hVBIZY Z210zpdlUFgSp59R5v7oXXIr1TSR0cLaFBPjaWZnB0RUy09SqsqzRaULD9hbHWSb8cN9Lk+0VwwN NIwOn4xgA9CliKClXXNRr9lR0NOsMlJRwQwxtr1kwLFEugyks2pRqBvf2mUknPDpxgAOkzlcZUZK hrqalpY4pD5ajyawFRbWjTST6H+gv9B9Lfn2sGgoaAE06pwPVWf85b4/Q9//AMrT5C4yiTz53pvH 4XvbCWjtFHU9c1RXdtUyuSxcbDyGSUKtmDkWVvaKJvDnFBhqj/L0tiNXjJ41p/k6+bfFRuRfST9C eP8AfH2saUDFehDDYSMAdJp08UtAb6iCbLcD68/j2lkm8h0f2O1k1fSTQdcqfDT1lbTUzAI9TUww prvZTNKsakkX9ILe3FnUUCmvSK82ydFmmmUrRS37BXqzbC5httY+DyDyTmKClKBRG0WlFUSqeVjQ gXsfqPaoXDFlAUU6j4jjnodurN4R4/dWMqTHKiCoQAnQlPMrKT5ZmCXvcmxFrn/be1qaqmnmOkN0 QCK9WD927VoO3P5eXeeEjaGOu2XE/bHgWhjbJ0h2ZMucrrLNqnaOqwtJLH+1pOiQn9N1KS7jkkiZ BlgDT7ejPlq+jst4sJ5j+gJAGPordpJ48Aa061iNmU9PNt/HzlVZysyvexIMVTNGAR/XSgP+sfYW 3V3W9mSuMfzA6yc9vLW1uOVdquSoMlHB+1ZHX/AAfsp0rGeKP62H4/wB/r7LgGbocvLbw+Q/zdNU 2UA1KqEn9I4+n9Sef6e1C2/mT0R3G9ULKsZ1cOmwq0t3Nze/0/r7fqFx0TGN7jVKakf5eg33opWe hB+vjn/6Gj9n20mqTH5j/L1EHuKhS52wE50P/hXpt29HPWPLjoiyRTPFNVSqSrLTQ6hJGrAgq07O q/61/b98yRBZ2ywBAHzPA/lk9FHKcV1uEk+0QVWCRleVgaERrUMoIyC5Kr9leldh4Psp8pjPUVgq FqKZG5tT1KArpY8sEK2P+PssuX8VLe4/iWh+0dD3l62/d11vWy50RSh4wf8AfcgxQ8TSlD8/t651 UJjp3jRAixwtHEgFhpVCFVR9f8Peo31OGJqSenb+3MVrJFFGFjSMqoHoBQAD+XTRjcbJCkEiDSZK ZVqIubtKNLI9voGQMyn+vtVPOrl1Pk2D8v8AVToPbPs81vFbSoKa4QJF9WwQftFSD/sdLLHYWWYq ShsefVe3/Iz7Kp7tUBAPUh7Ry5POUJjNPnw6U8eNpaOSmjldY3qXaKAScJLNYN4kcjT5WFyqk6mA NgbGxe08kokZVJCipp5D1+z1Pl0NYtms7CWzhuJVSSZiqasBm46Q3DURUqtdTUOkGhoF2w1es3fP K6gs0ORqJNINgXlW9hc2GuQD6+xFvBEW2IoOKqB+z/N1CXtcr7hz/dTyICxjndqcASw+3FW6FqWk FRu3Dx6gposRl6yRR+FnmoKOO9vw7arf8FPsNLJo226amHlRR+QZj/q+fU8z2IvOfeX4g9DbWF1K R8neCIftNaf6U+nStqa2hxq3lddYHpjjIL3/AMR+Pr7LI4pZz2jHr0O73cts2dazyDxQMKuT0k6r P19c7R0Y8UYsPQLOVP1JPsyjs4YQGly3QFveat03OSSLbh4cPDHEj5npmq1kpaWeeZzJPay+RiwD NxcA8ggG/tVERJIiKKJ0HL5JbKzurm4k13NMajXJ+3/J0lZXpKWPyVTojT6TJf8AzkyoDpP5OhC5 Nvpyf6+zJRJI2mMEgcPQdAqZ7Cxh8W9dFeUDVX4nArT8hU4+Z8yekbPlKaCeRsYktOiEsGQgwygG 58lJIDEAx4uuhufr7M0t3dFFwQW/mPsYZ/bUdR5db1Z21zK+zRvDGprUUKNT1ibtoTiq6Wzx6iyZ PM5FvDHNKVZlfw00ZjQEWs721NYH+pI9uiC1h7mUV9SekUu8cw7u/wBPFcOUYg6I10jHmaVNB8ye nObbFdGgnnqIqrJ1VSkcFIS7tV+Zdby+XXE6GEBmYn0gLyf6p03CFjoSMrbqtSfSnlTPHgPPo4ue TNzhjF1cXaT7zPMFSLLGXUKltWpSNIqzEjSADU8KveMqIOKPLV+UoclHaCPGwscXAoBIWRKqE+Wp QKONUnJ+gIsfaS4jf+1toY3gOSx7z9lDgfs/PoSbNd2tBt+/bne227p2LbofpkA8mEid0gpwrJk1 opFD1Ox2Poq3IZdK2Wuq4aaSjpqZWyNfI7SNTmSe9qkO4LMBzcC349tTTyxQWxiVFZgxNFUedB5d GO07Vt247tv0e4T3M9vC8UcYM8zEsU1PX9QE1JAzgU8uodfiqA5AJSLU0lNRVGOpvDDVzODVVr2l fySyTxpKkMiEhQb6+f8AFyG5m8GshVpHVjUgcF4cAMVB4+mOkG6bFtbboI7BZoLS3lt49Cyu36kx ox1MzqGCMpIUGuuh9C2bpqK6jhhxE9QlTEwWpV1QRTCJS6JHUxRgQuxZbh10k6eR7UbekMrNcohV uHqK+oPH8j0Tc7Xe5bdBb7Fc3azQGkgIGl9IqAsijsJqK6lCk6cr0pJmpjgcB45UnWmyWEjkI40P HOqyqyGzxMG1AggH2gQP9ZeVUgskn7KY+3oX3LWh5Z5W8KdZUhvLNSR+Eq4DAg5U11VBAPS3q6iO go6qtl/RTQSTMCbavGpYLcA2LkWHH1PspijM0scS/ExA/b1JN/dRbZt97uM39lDEzn56RWnnxOOH n1//1dA0koHA+vjWIXX1BTbVY/RSbWP5t730n4kV9a9ejVQsh1AEsqD+pX+1b+gHvfXmJOnqUQfE 41DxesltJsB4yqBR/aY2J/wHvWOqDiDTPTP710r697917r3v3XupcFU0dkk1PBf1ICA4B4Jjcg6T Y8fi/wCPfuqNGGzwPSlkr8fWLAtKVpDTghIJyVdyulYUWUhorDljytzb21pYcc16uaeXWJqSshnq HtINLajLwFlj0q9gQCknDCxB+vveoFQOtEUJPSeqlZJiWVhG7tIoa1yGNyLjjj3YUIx1v7enTExs 0MhjMZcyfodvGSqhSdEl7Bzc2B96bj8uvceB6n/esjGOQKGQ6RDONTLwbWk/tKB/sL+9aTSo4dVJ pg8euQelckuyx/UytBJpNtQsND8Am/BKgj3qh9Ot46iPJPExkp6hlVGIJKqpJJIIfS2iRWX8nn3s AHDL1okqag9LvBdjZvHQmhr4Is1hZRoqcfURrUwtGCWCiGYsVi/JAuCfx79laUbHof8AP0kls4Jz 4ir4c3ky4/aOH7KdCHj8hh6+hddnVcVHUGVT/A8nVSy0EwjKSGlgSoY1mNqQt9Lws0ZXgoPd1Nce f8/9noumhlibVcrWP+Nf8v8Alr+3p8h3JDIhx1Tj/tc5TyNkMdQZmp+z86R3jraHE5JF+wyiZGge SIRyFHDFeAQfdgfzHTJiI7w1YiKEjNK+ZHEUND6dCXSNjsjFo1SR0s9I8PmCuskdN4kkpalwT5Ke anRlY2BBKm9+feyQKGuOkxDrXOa/z/2eg83RsJM5CczTpVxZujqVpEyGOH2te5MjLDUPJAFSpfWj KG/Uykc391YUIp0ohuTEdBI8Mjgcj9nTNkOwuwKXA0lVuJW3MmLk04TdFETS7m2zlMadCQ5PQGWs opo1dZ0lFpVkfU1+PesmjA0z1cWlpJKREdDNxU5VgeNPQ+npjoXsZmKbce2J924OA1Rpo0rqk4aI MitLGYs5hczRqWlpkqqYkoGXSWVStxz7bZVrQGjen+Uf5ei6WFoJ/BkwDjPp5EHzoemTK4Pbmegg w2cgSpgnpxVbaykepo5cRWxJqkoaplIjeCSWNhHq9LAi1xb3RCdWPzHTscs0bGSM0cGjD5/Medf8 B6hYiq3f1XkKmk3ElZuvYKUsVLI6wtU5rE0UjLHTTAkK2QpMVUMYpYrlkjkGmykD2+rnB8v5dPML e9UNHRLmvrQE/wCQkefy6EWugwGboIanCZVMztyqRXpp0lNdSTYq4iqKVoKtHko6/EyuSaeQKwMd gAH92BDFhwYeX+A9Jh4sblZE0yfsNfI49fXolfaWx5tkbjeCPxS4jJq9diKqn1mneEyFJ6ZS6Lpk pZf7HJWNkJPPtilMeX+r/BwPQx228F5bgk/qrhh5/I/n/n6DbTf36vRkUr1xayi5+v4H9fexU4HV H0xjUwz1HZixuf8AkX+t7cAA4dI3dnNWPXlDE2W5J/Avc/7b3408+tKHJogNfl1vUfCLYtLsT+Vn 8XsTVRz01RPg6zeuSkqZlEdZj+yNzZrelLF4ksximoszDoH1ZTyePajxFEPHpOiyNNKKZDf4MH/B 0XnvPI0mLwEgx8PhtXvVzDyq8rCZtX7Q5aKKOOylWNuOPZfoVx+mM9G4CKO8CnVY3ydooK3pvsGe nc+ja+SrnZSqxrJT05qBEF/UHvEL/wBfdFWjqGGa9Nu6juiNCOqI6evnp5TMreoroN7kEA3W4J50 n288KOukjFenrXdbm1nM6N3laH/J+zre3/4S7/BCbBdObt+eu+cPT/3n7TzNd1b0g2QpS1Tidn4K pRd5boo4KmmUW3duBEx8MsUjA0+OnB4kN/QwR2weY/EcDoyud2ud2WG1d/0QdTD1by/YPy62wN2T S43C0iVFG1VK+cwaVyUrFCqR1cLMZNJBcKw1FR6dVvafxfEz1SaJIIiV49DfTp5qiBaaJ7SER0qg 6ZWedizPM2kho9HAA4v7e6ICQT8ulnFEIWWMo/noxreUaVuHBjaEL9blW59urp4Dj1XrqRXgFg0K Ui+jRKDoVCrHxxnlpR9P6kE+9M5rQcOvU6Kz2Fkal8fJT0MU2a3DT5GeGKnxwMX7ELmJpI6hl9Ap eCwb0ki491DNwr1bTTJPQX7l2tuDJ4mjSbGT08MgjrKqvFUS0UlHFIHnNtAkqJFZlaYg2X0/T3pm NDU9WUioAGOi2bmwTbmrTjqXI1+Ekp1dsP8AbqzNU1QQsGqKhkPlWtflNRZVI5HtHIzkdp6eFARX onuZ627Rx0sVccxkcTn6LPR5GtTDVtTQw5GamJEb5CNGCTyVdOAk0KLpeO4It71BJKGrnHTzPCw0 kdK/Zny83h1jBk9tbl27QT4ajrJKoZehpDjBjauoYyyUuVMfikyM9Wb2la7EWUm3szEsbp3DJ6aM FCdJx0tNtfL7rbsWsq6XKAz1tLrqI8dWCOGqFb55IoanQ4UeHxuqkj1AAnkH2wyxBjSnDpQutFFf 9Q6C7d+T29k8iK16iMRTfchY0qPJTUU8rEliA2pLqBdvz7cjkWMfDjqxuQCRT+XROuzqb7iRKHFV Uc+Ry88T5FpqjVqjQsJainKFljkLWCEk2+ntPJKHpQDHTkd0grWlP2dF5zXUu64aVVw1bQ0lVUTS v5JYYpXC1P7b08UrAkVSpdgW+uqw49p9I+fTpnVuC06Q+99o7dwCS0xao/iUMdFDVTOqs1flnEfl WPxMUBIJ4N7/AF96KnyPVHdhShx0Wje5yONq4MNUxTvHTVNTkqCZGmhkHnWOQMgDkOElhTVGDYaL /n3ZYx5nplpyuCxr0Fm4I8nmKcZGFjSzZpYJq+nQtJA9bGxFZTuHUtaSQXQ/T3aqL0mklVvhwvQc y0FXQZCYUSyCKrgSKYzzeOSnJJVo0JNiruD/AMGt701CKg46ZY4weuZylPTU+TM81PSQ+OOmqW12 iDobh6cX0syOLMTwT794bLSox1QZNOkjD2UtU8dPpllxcEMrVSSINCeN1jSbUeW8hQFb/g+7FmwC elFMFukVmOw2r1qkepeCMTpFRQUalJGhRixkvGNMjWFtJFre9AdV6ccLueodxA33TQVeueISBhJD bhvMxt5Ef+z9bN9PejQefWiwHQvYDNTJRQyxs0kchCpWWZmgUMLrKh+khJsD7bEbEVDV6UpKpUVO R0J7wvmno5oJCjUioJnfWrqw+kmkcISeb3t714I4t1fx19ehqxEc3giyZrmnmpFgWsWNwVkkiDhF Lt630cEsb2t714SevVDdEDoR8QtfuLM44ZbwGlxziqpKNFMUqzQkvHM6HSXilA+pPqHPvw8NeCde 8eR6AHPSmz3aeB2/S1dFT1KS19Q7o60VMErZcgCQzAJYRQJGUUjV9bt/T35jqIoOreFWhLE/6uHQ VCuyu6JamrFdHHPTxr4GqX/djDPfQ7sSxHjFiqEEfU+6CorQ9J3ShK9DBtPctdh6ZZHiUwUUYnho aUuY6lgP3ql3BLkiQ8auLe3lZlIIx0np5efQs4LvWqq6/FUeqPwU00TeMyMktRErADztf9yKIkgh uSPz7Xq4daM1G69oIqej57U7Yq83kKKTJVSU1RA0EUf28cUblIBCtONQHMEUNlXm+kD/AB91YEed eqGvCnVlG2cqclEt44VMtNC0LQpeRmaIaZi5vYm/LWI9sypUavPqy1oPXoScZGhwL0V/DXysKryR SAqFjlWaKEaRz5GBW9r3Iv7R6SCKcenK1r02x5AQZbJBIFkQUbEgAxRKWRJpEDC3lb0Ne3549vRq WbT506oafl0wZTZWK3zszsjrzIwpXYHsDb259sZGhqxrpKnAbuwVVRV1C0L8vBLHUFJFN2B+hBAI SykxyK5GRQdKYWIzTIHXyn97daZHYG9t4bG3DF4c7s7c2d2tmIbBfDksDlKrGV0enSNJjqaVgRxY i1vZbLdsrso8iesi9q2G2ubG0uyP7SJG/JgCOmCLEQxm6f7Akcf7H/D2w10zcejqDYYIiDGP8359 O+IwxqM1i0jCCVsjRCNiCVv9xGQbWJHI9vWkpa4hSuK5/LJ6KeatvitNi3e7kUDTAwr82GkfZkjo 309HWVdRRwy6EWnkSepOlm88a6Ska2vcIn0t9fz7FiGKv6YHWMDSAEVPb/l6MrsLC1YraSOCmWji r5KeWlqERfuRcLriYMtogUW4P1X2sgUkVpk9F87ls9W9dTYTEbf6c39UbjpVyGPqtq7qbN09dkaT Fx5LCzYWqSsp3zORnpaClmkguqvO4p0HLnTf27PEpVw3mKH88dNWsxWZGQ9wI61D8zQVPWPYe6Nk 5cGmjpczkaJxOxiTH5DG1tZQ1sDIw0Rj7yneMi/pCrc/X2DZ4WvrRZlFbmIlGAGWof8ANn9vWSOz bvBypzFJYSuE2Hc4o7mEs1EiMilivCgBaqcRQBCTk9OpnhrUYwyRzAX9cUiSLf8AoSjEA/4eyrQ8 RGsEfaKdSKbq33BGaCVJF9VYMP5HqMlKzOQVICi5J4Cgc3Zvpa3u5cAVrx6TJZF5CCtABX7KeZPp 0y5HdOBx0bQR1JrKlSbx0aeRQ4NrNOxSC1/6MxH9PauDbrydg5TSn9LH8uP+DoObvztyvtEUlvDe Ge8BNViGoA/NzRPtozEenSS3hiaxMdhNwVWSxUhywqh/AKWpaTLYGKN0NK2XhaJERspE3ljKM9gN L6DZfYktrdLVRCpq9Kk/P0/If6uPUA71zJLzHuM07xlIUwi8RTzz5knifspinTDtfKRYzKwvUm1F P+xVHTfQjcpILcjxyAE/7Tf21uFu1xbMIx+quR/m/Mfz6OuSt6h2XfIJLxqbfL2SGlaA8G/2rUr/ AEa46Getw7R5Cky9PGjRSUdRSS6SCJI2Mc9JKtj6lEikXF+HH4v7CsV0GhltXYhgwI+RyCP2f4Os iNx5fkh3Ww3+1jVoWt5ImoQaqSrxMPUagRUVww8qnqF/C5qiW8ispa3pItb/AFv6e3fqFRe09F/7 muLqesqEMfKnSix+3ACGddX1tx9P9v8AX2hnviahT0Ltp5RAo0qVPSspcYEAUoABwBYW4/x/Psuk n1Gtc9Dqy2cRKF8Oijy69kaWkmoamKohjmj8DyaJF1KJIgZI3W44kjdQysLFSARz79BJIk0bIxDV 8vnx/aOvbvY2E+23sF1brJF4RNGFRqUalIrwKsAQRkEAjPRa9h5ZMTm5qmVuZsfUwICWtJM8tPKi tYi9zETz+R/X2PN4tjc2iRqODg/YKEf5esOfa/fY9i5kuLyd8yWkiAZ7nLIwBp/pSc8SKcSOhIfO VM9WtfYLXPSGiLr6I1phKZlVVv8Ah2Jv/t/x7IRaRrH4P+g6tXqa0p1MUnMt5c367oQBuTQeDUYU R6tYAH+mJNePr5dOFFClY5M1ZT1ExUs0YqInm0ggFzGrl9KkgXta59sTMYh2xMqfYaft6NNttk3G QtPuEUtxSpXxFL08yVrqoD50pUjqYJ6WnkaKmaMyKDrLsARb6j+twPbeiR11SA6ejAXNnaStDZMp lAySRj1HSTzOYhjjLS6V8kjeMynUxC8CRIl9XJ/r7MrW1ZmovkM0/wAp6AnMHMFvDEXmoC7HSWyc cGCjP7eg2q2avrBokkmOnW/lIjVQBqZUH1QafoPr7PYwIY8gD7M9Q/fySbpffpzNIaVOrtGMkAeQ pgDpxbEx1MEVTFRS00DSQQU1OH1VddI9REJfISLIqxBinHJt7YFy0btG0oZwCSfJRQ0/nSvRs+xx XdtDexbc8VqXRI4wayzMXXVqrgALqKYFTT5noRqeipqNRUVqwUU7xIY6aFQZlTSAI3jQDytbgn6D 2RvLJKfDiJdAeJ4f7HUu2m3We3qLvcVitrhkGmNANYFPhIHxH1PAdQKWU11ZU5FWEMCoKKjlkKiR KaF2+6mDmyx/cz8X49CL/X2/IvgxRwEVeupgOFTwH5D+ZPRVZTnctwvd3RxHbBfBiZiAwjQnxXrw HiPiv8CL69ccnLtiaNaatlirpHBEMFL5JqryX0hozTCSZGLDj/Vf4j363XcEYyQqUUcScD860H+b qm8z8mTxJZ7jNHcysKIkep5K8Kgx6nBr/vXnUdI2mqsltytamSJ6eiyTGSJsuv2rHSFAeaRBLJGI jwR6SQbkC9vZpJHBfRCQsGlj46M/sBoM/wDFdR9Z3u78o7k9mlu0W3XhLIboeGcUy7DUy6OB+EkE Eha06fsbjM9k1aaStp8fTTV0VbE0dGWkmZJIjHUKlSNccKrEpj12ZgBqFj7Rz3FnbkIsTPIEKnu4 cajHnnNOHl0KNo2fmjeVa4l3KK1spLlZlKxVZyrLpcCTKoAo0assANS0OUNnHqpsvVpPOtZJHUNS LMIxCsop28CssYd1j1lb2Btc+zezEa20ZRNKla040rnj59RpzNJfXG/30dzci4lWUxBwugN4Z0Ah QSFrStAaVJ6Ve5siqpEuQxFTi8wr00sUkc8c1LVwU0ygiV4pI1k02JTUjFbDkX9l9hASWMNyslrQ gggggkeQIP55FehvznuyrHCu67DNZb+GjZWV1eOVI2HxMrKGpSq6kYrQAEV6Uu5MhTZ4Yzb2FrYq pszWR/cvAySiKkpz5X8oBujBlEmk2Nozf6+y+whks/qL67iKiJTSuKk4x/g/PoZc4brZ80LsnKfL e4pNJuNwviFCG0xR9zavNSCNenBohrg5/9bQMf8As/XTyRcj8m5uFvax974dJxmvWaBAQosbqkkr c/U/pVR9L2JH59+605yT1yOubVEtz/YjVR+WIvq/2oRx3Pv2OvABaMemr3rpT1737r3XvfuvdZA2 mMiwu/BJH0A54974U6rxb5DrgeD711YdOFJkK2jBWCY+Jv1wSBZad+LWaGTUh4/NvfmRW4jquule o1RO07l3sp1MRGi2jQG3CXYkDj6e/UpjqwpTHTjiXDtJA0kUREbyQvLwocDkFrgi45/P090aoyOv Ur1IknWqkiGpTO0QRtDOQNC2aX6AozadWnm/v3CppjqmTTrIP27LLEsp1MVk0LqsAbEagNVr3sfz 9ffuPA061w+zqPI2kBU0stuDYAxSaibMCDZf6/19+GeJ68TTh1ijc/rQASJyCpaOTm41oVurf6x4 /wAPdj9uOvDpyhe0qTgxpMhDRzRnwiS2kj0sBaUsQObf4e2yPKmOrgn16EDD79EUf8I3nixnsPI+ p0qYx95TCwXXTVBJVpFAurMb8fqHvwJGeP8Ah/2ekM1ghPiWzGKb/jJ+0DhX5Y+XQo4IiNWl2Pl4 tz4BoyiYHOTyU2Txykf8BYa5NdTj5Yj6QkwlgIPpax4uuePRbNVSBdx6Ja/EOB+fof5H5dCVgNz4 iuEmCf8AiO3M8aVKapoqpfHUwTwN5KWrmpZGZMjTRMB+/Ss3pUMQOfez5Uz0llicUkFGjrg+X+x+ fUXI4qOurKmfIlKJ815WNfQF/sZMtRr4shTVkYjAibIU7eQEqQHN/wAn349oAUY/yf7HVVeigJnT 5HjQ+n2dBy+0a7EtV123Mtktp5+kaOmOQoZZI8fuDDyxn+HVeRpKUtC4qWjaKYgNGZozdbn3qmog efSpbhX0xzIskfoeKnzof59N2K7Gy+368xb0xyJjVSeqjjpqRqnBT1k6eOqgEMJjbER5J4tTeG4j nOsIAT70Vrx4/wA+rSWccyVtnq/zNGA+3zp8/LHQ44rL4zdeJgym38jPMQGhlwOTcFplWAs8dNWK RHM8kAMZvYlghvcD3qmkgj/V9vRe8bwuVlT/AGw/zdNku1ZEFZuPZFTHt7ecEP3c2NkhZsXuijqk jeSjy+LLJAJ6iONHE0aq2tSeGAPuynSRTh/g6dE4osdwuqDhXzUjzB9Pl/k6D3dFRQ78wuR25kqZ ts7soaf+N4LDV0vko66q4M8e28hIQamnyEReLwtpkVwlwdDe6vkahxH+r/V9nRhZSNZTxyq2u2Y6 WI4geWoeVONfSvr0VB1aBnSVGjaNmSSN1KuroSrIysAVdWFiDyD7bHdSmehpqVF1t8FP29QHYuSf x+B/Qe3wKCnRXJIZGLHh5dSqelMlmfhPqB+W/wCKD228mnA49LLWyMtHkNI/8PTrFAicKoH9bfU/ i5J5PtMzljk9HcFqiDSiAdfST211rtvZ/wAQ+oNlU8VJM2zOk+tcbCjU7tFl0xG26PGFkcB44khp 6VWUkhitvqb+1lxERCCDjoH2+p55i3m5/wAPVNnyIwJoK4QwxqxmvMAlpY4I5I/LTx1irdWRhbTz 7RJIUyPTpfIKdpbh1X/3xhpsn0/vOnko0jqaraOZV1jV0itLQ1C3syganYC3Jtb8e1TeGwRiw1D7 Ok4qTTqgrZGDi3HvLaO3KtpYKPcm5MDgqidVXXFBl8pS0Es8LOrJ5IknLKSCLjnj3egY0Dd1fLp5 C0NHaImJhmowfmD/AIOvsxfHzonYnxq+MXRnQXXNA+O2n1R1vtTbWChlfz1dXJR4xK/I11RO0YNT kMtlq2oqp5AqlpJGIABt7veLpVKcOnbEsGZh06Va09XX42hr42iasq/OwZGK+WnEcsays1/E7KF0 KSCT7SIBp+den7qZtJFTnodcHTxU7rPPHIRpHiUrIrrYgqqtb06jxYXHHu9D6Y6LOk68laamqqpK x5XnrPBS044SABidUjlh6m5vyfbgKDI610sMjXUNNhUjlMckzsGRQGXTLESFkHDNIqs4JZLj8fn3 ViGpTj1senRQd5zT0MubppGr0rGoyZa+mlRHpzpaRECIoSKndbAGxka/qH496UgeWetlW9Ok7j+8 Nj5HLrtrPTVZf7CjoqTLzSxmmQ0VMIaimnp4i8bVFXNayjT5Afwb+7FVkBp16jAVA6x7rweErloK rauRoKM1r12PxNZTRR5THPl8lQl6d67+H1ctdj4JSNCNJD445L2I9tmAcKY6sHqAGHQGbu2PvCCm 21RZNIKqWoajr6bKUVTBVvjq7wfbViV9OVjr45y6afFMgJUhhq+vu5SNQBpz06pUEdFR+Xe2cVRY /CDM0FGuYyOPmxpMqfb00tXTFZsfkZljijV4HksGYm5HBA4ulatSB8PS+MLQY6rm7c2mM/tjblbR 49tvbgwWOhx1flcCkg/jeRiWno9cppl81QKiuMlig1RjTa63PugSTj5dKH0KKLluo20tt7t69o1h 3FWZbI5eqoxM9LkIqmb7WjldFlCyBXhaWJCVe7hgDcge91Yih6QyIzMCB0oc/k9px0dVK9LPE8MJ 0PDM9OI3ZbMrMVk1+vS1gOB9D+fdft6r4BIGo9FR3D2JLnJ6jCouVkhMAp5hR1YpReEMB46tGV42 K8qxIN/eya9WVVQnu49Fw3PQblp48lU4LPZRTLLr+23LWHIz0ngQJAsFTZfBIwHDsX/r7oWpUAGv T1Tpp0Ace9d55Gvp6HcaTmtxVczJCsiLUsJPSqrI4McsEsLHU99JU3H6fdq0Bp0ll41r5dPdRuHd eNWojNC1RHIoNNTUYpiVRnuGNawACxcByFOr3QCtSePSXprkrJ6uh/iM1EfumhdRRvTliZlYhyZV 0rZRqZbm5I97p1roq+98t92tVAkNbBQLJJ5HigkjjmqICSLym8d73BsbD8/19uCVlXSOHXqdJLYW Dze8crT0NDLNFR10hiqJoEaZx5Y9SILak/ShBABta/HtaoQIpNKUHWtTcK9HJxXR2O27SA1UENbX Q+IlI08s6hgDZ3c2/wBe3I9pZSGbtAA6cWN2GB0pItsYKGVZ6ejx6KUEGuoHkY+m2gqHGpI2v6lF r/6/tOVYcR1oqRinS/2rtjH1MjYqipaVXbS8szU37ILchgD+sNbgC/u+qi46ejQEfFjpzr8XXbeq ZcfT0KtPJIi6ogDdNShg8ZBLtY/Q2sPbL62WlaHpcIVoOwUPQrU2OxlTj8Zh8DHOu6qmopUqWppY arEKXcrVPVwqQyfsy24P7bj1XB9pyJhUFq9MyoinhjoRd0Y7G7cpKaEutRnDCKaqqfuTHLJHTIl6 OPSrRpCp/SS6/wCw9ss80fBePy6oKAgr5dFsy9dk6mqlePblRBVJUBEqKmFftUgc3d4KlLx1JCtd iGJuPbsTSN8WD1tpiB5dQqWhyT5BFkq0gZD5dBDLCS41MVClTyOCG/3n2tRVArXu6Z1avOp6NDsD ZNbXvTvBNLH93peBvuf8mKxFdYMjksrGxXx2vz9PencUGk562ukZYV6C/tTHZzZG/JVqSKVfNFV0 r08TKJaf0zKzXCxsiMNJtcte596RzUDiOrOysNKr29Hk6By0m6sfFmZ5nZ8ZCtRHIp1wrE0wMolC elkQp41B/TY+1kFXBB/LpIxr5dXY9LZWumxtPkBDUxUWPpCkdTV0jGllTIw3gjo5GF6iGlYG45ID fX3uUNQr+KnWhQ0I4dGE2rWRz5rIU9RTwwyUR8CwllAAjCl11AqpMoa6D6m3+v7Qmq18j1cHPSYy kTxV32kDS/xDGZdXhiRyFajq2MsRnBIBjkjDC/K8fXn3ZHIYMR14j59csDuGhO5lpY6ulSrhp/vP tElWSWFqWsBlV40LqSy3sob9PvV2gcE0pXp63FW0+VevnI/zVeuW6w/mJfLrbLRGEVncu5t6xQFl Yx0/ZEkXYVKBpAAV6bc6Mo/1DD6/X2GrntncfZ/MA9ZVclsbnljaJGNaR6R/tGKf8+9EBVR9OALe 0xPQvRB8J+GnSz2FTrJuWknZDKtAslX4lbS7uq+OILwTcSShjxew9m2zReJd6mGFU/tOP8/UZe69 +tny19Kjd08yLT+ivef5hejfbZospMVNJRiS1pFlmBddbNeSIrJY3iB+gNj+PYsVFXgvWMjRh8tx 6O30V11lMlmYKmuiqcgZGgkEAQg1UmoCGkjiAk0aQb2UAt9PauOQDAHSCeLTWj9XY/H/AKtwm/Bl sNu7F0GW2/j8dkcNuLauQxpqMNkKeqx00WQxWUoqxWgkglpJCkkTkDk349+uC7DSDnpHbqyyasjP Wjx2+1J2T3P2tuWWtYbfXfe7qmnr3dYZa18nnshkpJZ5phpjaMVAL3ANyP8AGwSa6awjAhTVczOW pxoK0GBxr1kna8uw843Ifc7kQbBtNrFb6wQmqQRqZAXaqqIzg49PUnoC87Qbbx1mwubqqyrWRbRr GrxpY8v99GKdAVtcaA5v/T6+zOzmv58XdoqRkca5/wB5Nf506A/M+18n7QA3LnMk9xfKwooUFRnj 4y6Bjy0B804cemafN5eqpzS1OSrJ6diC8cs7ya7fQOzEu6g/gkj2qS0to3EiQKH9QOg9c8yb/e2j WN3vFxLanirOWrThUnJHyJI6UG0sOlRK2Xrow9FRM328UhVI6ytiQTaXaRTH9rRx2kmJuP0qQdft TUKpcj7Pt6DU7szC3jPewyfRf854DrnkcdBVwmuWTOhqiR5qiqyUMU8DSyEu92oWlYByVOvSAP6c e2yxqQAP8vW4gUIwukYoMY/PpGSoI5HjWRJQjECSMko4H0ZbgGx92BqOHSpgAaBqj/V/qPQsbA3c iNBgMxNGtKo04uolAUQys/FLLJwvifUSjN9G4vYiwa3rbCQ15aqfE/GB5j1Hz9QOPHqevavn5I3t uVuYLhBZgUtpGxoYn+zZuGk1OgtwPbWhUKPSUMeoM6KW45sBf6cEAc39g4zNQgHHWUcW2RB/EkQa /XqaqBSF9I/oLgN/hx9fbRaoJ6MFjVCFFK+nn1jq54KZC800UCINTNIQB/tvqT73EryGiKWJ9Omr 65trSFpLmdI41FSWPQZ7m3fQvQZGkpxO/wDks4WqhllgZWVGdGjeF45AA6i/NmHBuCR7EFhtkwmg keg7hggH9tajqGecef8AbJNr3axtFlb9B6SIzIQQCQVZCrAVArmjCqmoJBL/AItJZJJY4IjNNNGk EKoGadZXnicSUyKrNJOixkgAqfyDcWIzuGVVVnaiA1NeFKHj8s9YrbLHPLNPDbQGS5kQIgWpcMXU 6owASzgKSAKHiQaihWmWba8FJTpjZ0rK0yRzVM9Ys0ulOGMKCuYmOUsLSLoB9lVsNweSQzoVipQB aD8+3y9DXqRN9fku2sLSPZ7pbjctatI8odqDiUHjE6WriRdA4ceuEVZNlchHPDUU0dS3ohp6AJTR U6KpOmnghAULYXPvbRJbwsjoxTzLZJ+0npuHcLje92iube6hS8OESECNYwBWiImKUFT5+vT9V00W HhWsyU+qqkIaGkjmH3E735eS12iS35I59o4pGumMUCfpjiaYH2evQpvrKDl6Bdw3m51Xr5WJX73P q3mo+ZGfTpMw4/IZ/JNLSqywM5K1E4YxQKttQS49ZQnjj6+17Tw2cASQjX6Diegdb7XunNG7NPZI wty2JHqVQDiBXjTyp/LpSts6JqmGCmee50yVFbMdSzyartGAtvGD/sfaAbowR3cD5KPIdC9vb+CS 7trSzeWpo0kz5DtXKilNNfz/AD6UmWjjT7emoBaspKqKfyqkUkMRigmiVQJA8bkPIGN1Yem1ufaG 2Zj4kk39kykUyCakHyz5eXQw32GGP6Sz2uo3CCZX1BVZFKoygAMCpoWDGqkYpTNQnkoM5lJMmRkW qJYYvAagw00UrVZj1CkErfsRRRIyFyEBGqw5HtaZrS3W3rBpUmtKkileNOJJzTPl0FE2zmXfJt6K 7uZZo00eIUjVjLpr4Wo9iqoKlyFBGqi0IPTlXY3BbWxsMslDR11ZZYKSPIWqpZpWAUyQ09S0qrEr EMxUKiD/ABsCnhnvNxnZVmZIuJ04AHoSKZ9PM9HG57PyvyTtEE022291uVAkSz/qM7HBZY5CwCg0 LEAIgp56QZ+MpKbCUsrAxLUOZ6nK5CNVjilLXdvBHoQU9LClwo4AUXte/tq4lku5FBB0YCKckfaf Mnz6M9nsrPlyxmZWQXbF5LmdQFVq9x0LQeHGgwoxQCtASemPJYqfdFJNPeSjptBmw9M6oZZpAh8d VVyuvkWOrBsqAgKhDG54CuC5Tb5UTDScHPkM5AHCo8z644dBneNkuedbG4uatb2WnXaRkAszBTpk lYjUFlrRVFAEKu1WwI20M9Uz47+GCiqq6som0nx+BI0p76YWnqJ5Y9AS5WwDMdI4Ptzc7ONJ/qDK qRP9ta+dAAft8uknIHM95dbR+5l26e53C2NO3QFEfBC7uy0C5WgDE0GCekBX09aufmpY6YffNkiY qZX837s0yyxJrKorqSw54FuePZzC8Rs1kL/o+Hk8MAUPUW7ra7inNE9jFZj95m8OmMHX3OwZRWig jIzjGTQdDvt7aX2MpyGVlORytcCKmudQRCWXmnpkItHCv0uANQ4sB6QD77cvGXwLZdFunBfX5n1P +rJz1k5ynyH+7Jjuu+Tm73y5H6kxAISozHGCKKg4VoKjACrRQm91YZcPuzbNfhzSYuoyMs9MJDAp pTWKqxJJNACqhKtasRuVs31Yer6r9uujdbbuEN0GkSMA8c6eJAP9GlRX7OHQQ545dXl/nvk3c+X3 gsru7d49RQGPxQAoZ0wKSiUI5WhGXHfk/wD/19A6ZW1iO4GvQOCLKSAACRexUfUe7efSdKUJpw6y x6fKEJJQMbgG4McS6rf19R96+fVTwJp/xfXKN7aCeNRnlLcXPo8SWNhYAk3/AK+/cetnAP5dNPvX Snr3v3Xuve/de65/6n625tf/AA976r69cVUswVRcsQAP6kmwH9feutnA6keJxe4kXn6i5HB/2/ve PXqlfkOsTrbkkm/9f+K35t78erKa+XXJERgOTf624HH+AP1N/fqdaLEVxjp1p5aRFCT05jP1E1O7 LIW+g8kUrMkiH8hSp/p7oVbip69qBww6cDBJPE/21RHWxBlvDZop4l8noAWQ+WMHT9SWAH590rSl Voet0rWjdQniU2s7CQaiwcxq4JIGm+oCS7ccE+7A/s60R5EHriUsmgup021RshZ1lJClQLK/6RqH 1H4v73XNetH06jj6s9yoN1IOrSgBGlWP1svFuD735Dr3mT8+pkNRp0QTjXA3p1G7qqtyqryDcE34 I/p7qRWp8+rA4zw6caGoqsRP99jauponVin3NNJpePSSFM4SzPBpBIJ/2Ia3uvGnr15lVlKOoZDx B4f6vnx6F7GdgUedo4KXd9NS1GRoy32WTRCi1qppdaaSWmaKSCqe945YTHNFJY2Kkj3vUQakY/1e X+bouk24qSbV6V4qT/gP+RuPr0LNFW7npcLDuPamSbeW2Vlieoxs81Ou4dt1SPeJat3UU2Rpb3jZ p0jfSbF24JtqFKnK9FbpF4ng3EZjn9fJv9Xyr0o6TcFBkZYs1tOtnwFdTx1NJufbVfTeSOnpKho6 mpFTQN/lVGtNOn3MEsAaNijBSQ3NaOKEGoHA+Y6TvEUrHKoZDQqw+XDPn6EHqbl9v0uUNTLW4+nx mQUCOvXXT1GEzVOQNE8SnQt6uFlqFJCFkPBv7uW15Xz8uqI7R0CMSvp+JT/scPPoEcv17kdu5Kll 21VzYOuCSn7Cp874CurGjeWlemlL/wCTfxWjRlQEXWSMqDyD7bDEGh/2ejKO7WVSs41D1/EPX7ac fs6WO0d7Sw5aPbu58fLisoJqf7OkrZY46qVpWZ6mXDZiRlgyFM851LA/IDkKTz73x4nH+rj01NbV QyRPqT1H/Pw8j8+l7ksLgdxxy47L0dPlMZFBUZjHVcDvHkGhp5UTLYyNXVZqGqjjk+5UI2tJ4iQC L+6dwyDQj/V/xX29J43khOtGKtwP+Q/P/NjoqHcHWlbsmujycWQnzOGylXMiZOpk81U1XIDWRS1c hJaU5SkfzRyG5ZllU+qNveoWX4FULjAHD5j8v8BHQhs75rqMRSYdBwHD8v8AB9lOgfp4DKdTcIP8 P1H+n4/2Ptx304HHo4tLYzHW4/TH8/8AV59OIcLxb6cC1rW/H049sla5r0cVC+WOsq1AWxI/1wPd Cnz6eS40kGmOvpJfFfdU/afws+HW73rVknzXQmwshkJYClQ0+RpNvx4/J0NcdH0WuiYFCbq5t7NZ CDCpNKGn+DoIwrpuZl1UAdh86VxX59Vn/I3btbgNw7hhqKWaFUkd2p5kUstOzmaGVrXS95CqqeQB 9PZUYmYkKuejGSLtLas9EM3vjYsxtPLwJbx11LVAxSAlXRoyjwyL+q4J/wBYce2GDK2k9JAKMTXH Wud9vV7C7Lo4mopZqrZ+7qKuFAkcvlnXDZWGriRFRHezxwDmx+vtdGulmkb16V390jWlrBG1O0av yx/hqf2dfZK6A7WxndPx46W7DoKWohh7F6i6z33j5auKWGqpxurZuJystDLE5EkDRGoKnj8f4+1d 6mtEkU46YtHIelcdTtLZDs6npkUQUtDQSvUL6ZDNUVcoEagyDnwLScALxfk+0SA+YxXp65YEkA9D q4plxR8U1VJI1RTwSrSMNdIJH0uJiOPE/Bk5/T7UGnn0j66noKXwrT1ccdQ0TKAtKn20Zlcm0kQ1 elP6sCdXtpivADrfSE3ZNRyianq5xHQ46kejpo4hd6qoss0h13XxKrxoiBSNTHke6dWCk9E83puu uxA3XKNjbh3HiXx1LUjJ4toVytH9qplmlq6cSJJGiW1O1wAFsL8+99Kljrlqjqr7sTNbnr56Tc+J 1SYjcpkymFyOVcVWMz1DG0lPVVOGydJK4np6Vg0MmhwVmB/I9+1UyDnqhWhI6Duj7qzmxsni6tJv vKahmEgE1xNA8MY1VMQRxK6wp/hZlPPt9JKkAqK9U0a608uhRh/mG5OhzUFfuDbyZvaUUT1WTrlj 88/2voBox5OfAyJ6kAuLfUe3dCMCadNujJWvAdGd72o9t/KHqTER7RyFOd7PhKTc+0IseUjkp6Ku 0xvD59EkMcVPEwE1NIzLYXK359pZoiq1U9LLedSNLGnRScf1RuinpMRjN8YtaTLYKroclOcIzUNB lFxUskjyVcExZjTSRtC8sI9LTKWHFh7YV8aG4dKGdeIfPSk3fgcBU4pmjiiyNXUr9y8sE0n3jpMS 7API4QxKo9WmxcDj6e2Zoi2oK1R0/DIoI1joiHZXVVbCkxjqnp6eeSorIJaoTLLW0yFZCNaj7cLG raFACsfyPacK6MCxx9vSpgrq2kDoim6MfV4Oqr0iq5sfS1zrSzTyG86xS3DlSAFYj6rcWv7fU1Hq eiyaBwx6CDcVf9rQy0FLI1StPE7mR2+4mqVXVqqGLlgjKwJH9PemJHAdbUNgMDWnRJN2bozE258S 2Orq6lYx1Rq4U0I9RSBkiHjlAulTErMVt+D/AIj3rUfMdJJjkgdC1tPcFdVS0saSVDUbMY5lqEUM f+bkZNtIDH1EWP597oa9JgykkAgnpdhspKJw9ZSimQGSdUkaMhRIVjDsxb6i3A5b37rfQGdiYf7n btV9pWiXxNLUTyyRBWjlfVoipLMTEjE8lrrb8e9ccDr3Tj8UcdM2dmlmNOpSn8IYR3m5IWMxFdSA yqG1CwuSPb+iUID5enVQ9HAC9HyzuGgkk+6AFO8UCw01NEj+CPnS8lQoBDVKm17n8+2AGZqnh0qS UjgMdImu2xQNSAQ1sYyJIDhPG/2s36nWdeDC7AiwHJF/b1MU69RmqaV6WfWsK0ZmilnNR5UeKSoZ Q6xvYqGgf9UcCn66Tcn6e66V62pVD3L0Ik+ORIZkqozX0f8ADw9MIV0ZI5GZnRIZzIGSNahlvGzX Fvr+fbcunK6qHowiYEYOOgYyNNU7aq5aynmbF1TqrVEROmokkWMaohIoCzNzaVgAD/tvZfkMO7HV pFDgDT11jMtlc7RtUZPIstZ9yjUkDlzBNTKbnzCQEsbfS/PtQCGpUZ6SPAwJK8OhMoA1REKeKjhq YJ7K7iTXHFLZiXp1kYMVZhzf6aTz78SQTReHTBQ5DCh6FTa3WGOqKimqMgInd8dU5WmL05ejyH2s vjkoIqiYEfxCCVbMjfqHIPu9SRXqgUA4NT0qcLvfC7FyFVItIJ6epVKaroZZSKfHTRs6x1EcbRss UyswFrm4ub+/AE9PxpqGpjQdJLuTaeb35hcdvOGkkORoTUw1NGhMv3+MWz66Mm6yqiEPGQTrAI9v KQO0dakCimmnQzfEPbeW3JuLEYXEwVKY8zQ0+VgMDDHfwxjJPUyVCmRfFPH4nAINuTx7U25Olh5d F0rNTSozx62KdjYGmxm2aLC4iWSox1JTeVPKIRFRao2UxwFVWaQnkksSVv8AW3uzAjJPTUTO9SwF OlTtiKVarIvkYoqZqCYU/lcnzVMS06MjHQpWRHcFQRcsAPbTsgGAC3SkeXTPnguLrxl5IFq5Z6Bq eSAG86SujmlheVl8XkViOLWA9sB9JLUHVuPRavO+M3PLkEpjSZT7cTOFjKGaaZ2004YG9iW5vew9 t3EuoCmel9olC1eHWm1/woI2lX435+5DfzYGuxuO7V6s6/3BHlJom+yy+a29j5tl5mOkqigWebG0 2Ao1lW5ZFljJsHX2Q3ygNG9eIp+YP+YjrIP2uvGl2m+sQavBPUfJXUU/40rnqj4RufqOD+L3PtAW UcD1KKwytlxjoYOk8G2Z3dUrZ1ix9HBLVTKABEtTUaEiZiCEaTw/7b2I9hFFnmY9pIH7Mn/D1Afv RdxLcbLt4P6yK8jfLVRVBHr2k/YerJtnYWnjlpaPxo0zElNC/smVW4Ep5bSFNuDY3ufYlQCStD1C DtRCfOnVoPS+yBFhYc9T44U0+KR62KdYrvHWJGYpZFOoKrrGw08X5/p7WQwgCvn0TzTZyerOd9dh bU+K3wh7X773HTOtRs/YGa3FWRs4TIZjc2diiwu18AKtg0keRz2cyFNSRMf828wY2C39p7hqBqMA QMV9fKvyr09ZJJO8YVCxY0AArX5fPr5sFdJkfNKmQNWk0sr1M0VUJY2aWdjK8zRSBfVKzXvbn2kj 8FgHi0kUpUUPDyr0Jb47nDI9tuInSQsXKSBly2S2g0+LjWmelLtfaU2dJqakywY5dSiSLQJqiVTp KQa1dQiH9TlSLiwub2L9w3JbMBI6Gf0PAD5/5B+f2jXknkO45nZry8LxbQKgMtNcjDFE1AgAfiYg io0iprpE+k2NgKSMvJTo6Ro0kkla5mISFGd5ZT6Y1CqCSEUavoATYeyiC/v7+4WCOTSDxIwFHmfX 7KnjQefUl7xylyZyVsN1vN/ZCVUACLIdbyynCJ5KCxy2lQAoLEUXGek2vBltu7o3LNHJj9nbPSkx 5ihQocvuXLzj+CbVpFUpaeW71eRZGuiqE4svsVotVLk1VRQV8/nXrGC7uX+oAVEW7uHLEKAFReJA HkFGFHQc4umqK+uaghnaFpXkqJqpF9FFQxKGqqjRcH0rYKt/U7W91GQCR08xCgnpP7iwseImhenr Y66mrGqmiZIZYHh8M5TwzRy8rKEZW4JFm+p+vvyNqxTI6UqSwqR0nPd+t9DLtDsOqgxNbh8hKZ6u Ckc4SoluWIjjcyU08xa7NFGoMJIubFb/AKQQtuexxvcxXUC0jZh4gHzOCB8z8X7fXrIXkD3ZvbbY 9y2Ddp/Ev4oCbORuPapLRu9clVAMVRU0KFvgBTCbj3NVTed8nVquoAWP0sTpW4FwR/t/a82Ngi6B brXoGx83c5Xlx9S+9ThS3/FeXHp7avyOQ0irqZqhzZfUx0gcW9J4PH59pBDBDXwowB0I33Xd920i /vJJZDQZJpT7OH59S9w0NFjduVcsk0b1NQkUUKIysWaWVCePqAiqST/h7bsppZ7+NVUiNSSfyB6M ObNt27Z+UL6eW5RryVVVACCSWZa/ZQAk9BdiJ2pq6GZZfCUZgstwNDyRSRK3+HDmx+gJHsQ3SB4W UrX5etCD1CewXLWe5W9ws3hlSaN/CWVlB+XE58jTh094isxcFVLJkKaSfz1EzrJDFFUPEitp9UZZ ZFF+bjg34+h9pLmK4eNVgkA0qMEkV/Ph0I9h3DZbW8ml3azeXxZnIZFVyqg0ypIYZzUca44HpcJv LbsESxUheGRbATSUso0cclFRZef63FvZQdqvnYtJkegI/wBjqS09wuUraAQWBaOUcHaJsfYFDZ+0 dMUGSwGRpnmybiqzsztC80rPSxMsbaY6kOdEKrJGB6QFINxYe1j297DIEgGmzArQZOeI9cHzz0Gb feOVt3tJLjepPH5lkYoWYmNSFNFkqaLRlp2gKa1FBjpdReRIqZKVV+2jijiSGnP7RX6vI0guWZ2H Njz7J20lpDIe8kmp4/ZTqTYPFjgs47JF+kSNVCxntI821eZY8aHPSrpm1RBJVtIvJlsApY/REQC+ lfpc+y6QUYlTj0/z9DuxkDwrHOlJF/FQAE+QUcaDhXqJWpDQ0dZXeMXp4ZJtIUFpGt6EUcXeWQhV H5J9uQs80sUNcMQPs+f5DPRfucNvtm33+5GLMUbPSlSx/CB6lmooHmSOuAji29g9E7w1cyRvLWqC WapmqbyTiNlYhZp62UhFve5A92LNe3dUBVCaL8gMCvyCjPTQih5U5a8O5lSe4VC0wGTI0lWfSQcM 8zUQV4lVHSeqMdUSYrKVdbL/ALkazH1MckjP5I6OGGKSSioIZSBpp4GsXIADuCx/Htak6Lc28cS/ oK4IHmxJAZiPU+XoMdBO62i7l2Ter/cZ/wDdrcWkisxOpYkRWaGBGNKRoaFyAA7guRwonchkZ8vL S0dHRytHLAtb9kyxCWtkiNPPDHWRzyRfa4ly5u7WMun0grYsuhgS2WSWWUVB06s0UGoJUgGr/Lyr k14BPdd3ut+mstv2+wdoXjE3gkLqmZfDdFmV2Xw7Y1NXajS6e1StCygrM7DT7fGTIkSWejlWJIYp JfBWLG0ZilYJphWmqBoZm0gEf6w9oorNnvfp8FVYVqQKrWtR61GcdCncOZoLXlT98trWeW3YKEVm 0ShSuljSiiOTtZmoKinGg6DKSvqsBWUVbiqKtx00WMpaSvFdSyRxVdXLFKJJmiY6Skxj1oD9Wj1W 4Ps/WGO9iliuZUdTIWXSRVVBFBX5VofkadQzLud7ytuG3blsW33NpcJZRxTiaNgssrK2pipNCHK6 kB4tHrpg9QcVl/sc1TZeqEtZLHUieoMjfvSvc62uwIDC/APFxa/t25tfGtXto6KpWgpwHRdse/Db OYbTfr4SXE6zB5Cx72OamprnPA4qKV6HnG9l7WqWWGWapomcgCSspwIQxP8Aq4pJtI/xYAD2D59h 3GMalRXA8lOf5gdZPbP7x8lXjrbzXM1s7Ed0qAJX7VZ6faQB8+o/Zixz4TG5yjkjn/hWSo6xJ4JQ ytTzER3jljJADT+KxB932Asl3PZyqR4kbLQjzGcj7K9JfeWOG55a2fmXb5Ul+hvIpQ6MCCjnTVWX 1fw6EHr/0NA9PVMptYJrk9PpAULpHH45t72ekxwp66R1BctewRl0g8tq/F/rybD3vrZBIAHXNYns plJUtpCxC3lZBq9RVjaNdX01WuPevXrxpwHDrLUhftAiRpCqMGKgh3kIOnyPKV1tqDcC4Ufge/de RiZM56aPeulHXvfuvdZ5omhKqzKSVDlVNypYXs39D73WvVR1iS+oab3+osSD/sCOb+9dbPDqZ5JF LA3NrD62awXkBgQeR73QdN+nWKo0kREagWVmIYL/AKsoLMqi4Oj8+9Z6utKV6z08Tuimw0kMdTqS igMoNnU+kn6c+/E460Rk9ZSukkSIfr9bKePwVP0II/33Pv1QRg56rShFR1xAAIcNo08K4uuk/n6H Vf8A1j79nhTrX2HrO07sirOqzIp4uq3K82/dA1ajf6m59105waHqwY8PLqUn2spWKFmAYj92okVX jNgSYZDY318aSTf/AA91OoZP8v8AL1YEE9cZaNQAS5Z2A5WRWKk6uT/aYXH0PJ/rb3oP1unUDRMj Ml2Ia5b9S8CxGpSLWuf6cH3eop1SnHPU2OSKNBJdvKgA1pIyrHa4CSwsrHQbm5Usp/p7qanqw9eu fkRpi2mySaSwshRyba+UI9LX/H0P4HvXljj1utKdKDEbly22a2Kvw9ZXY6pCCMzQT3ElNGQrQVSa Whr6SW+kpNGVtx/U+6iuSD1WWKKePw5o9Sf4PmDxH5dDVgN/7U3EFi3bjIMdNCVfG7m24lTT1+Ob 6SU89HHJ91FDra6iDy0+klWS1ve60Oe1v5Hopn26eMFrSTWh4q1K/wCZv5H59DFhsruDblFTu89D v7a50Ljs3T08GQmhoWMgWjyNC9lmNOshRSml0X0lBb36oGDgnz8uip0jkcqVMcw4qcZ9fUV6zS5f a274J8JhN14d8hA/2cGHq2/h89LEsoameEVywOKrD5ERuApZWTUo97fNGpn/AFf4evCKeErI8LaT 58a/s9R1wq8XiNyYNsZuHEQ1VXSSTUtVi6gSQPQ5Cn8UWROLyKIKmlAm0yRsCUMbK36W96D5FR1Z HeJ9cTkA+fy8qjz9COghzlBuzaMMmTwGQq9xYbF1iKIalpX3RgKuRViSKujjsmSokkXxiUEM8cpB 4I97NKU6XoYZiFkUJIR/tW/zH5dCdmK3a3a/WMtRjZoKR6WndM1SEyGagjWoiqmqRAh1E4WpX7pA oDPA0yfRj7adG7WUd4OPtoQPyIJUn514jpiIS2V2niAlf8I/2eH7OiWZDGT4itqcZVReGpoZ5aWa MHUoeJijMjjiSN7XVxcOpBBIPtkPr7q9SbEIWhheD+yZQV+wj/VXzr03OgANxYDk8f63+9+3Acj1 60yEVquB1FZNJtf/ABFv6fX3cZ6TMoB45639/wCRnuM7w/lvdO4OfJrV5PZeS7ColM7BqiKgquxN wfY47ySNzHQJUR+MAeiIotvSD7MYkDW4Jzx6C9yfC3KTSONK/bQEn7ehv+ZPWtBFt6fJ0sMD5zym iz0bAvJUmM+nJSl/82ixyBDb88j2mqqvwoacejQOHXubqnHdm22xUclEsIaB6eeOOVBrRfJb9wya SskcRPN/V7bdomqWYY4fb0nbBwOqQvlNtbI9d9gHN4iCnaLdctBjnr6intJT181XDTzS09WykRee NlN/xoJH+LumqKR0jngScgk8D+37evqodJ4aPrrojpzD43EjHUWP6j6x25gsMsssz44Y7Y2Fp3xY q5ADO1FMniEhVbqtzz7UXJpEqdKLZwGDYoOnnD0Nfjt90mcyNWt6iJ6erLxsSxXyNHHTKzAKlPHI I7/2zz9faYaaCnV5GBOo4J6Mbj5oxRVipTtEs08VQqKw1sxU21IDyE4JBuOfeipbzx1RcCvr080+ lpDJJIrLGqHwtCLLIRpJB/oSRYD6e2ypH2dW6D7M7J/iU7T+SSarEks70hUrAFYHS8dvQ0kYP45B APvQNCD1YEj7Ogmzu39q46PO+SnqhlNz4qTbtFLWVcsVFXQ62lzOIrWiUhamkpUZoC4DENYHn34m uonpSkh8s9EL3t0/RVVDtHBYujoMVtWOWopcLt/FwLS4bAUjTyvTjHUZIfHyTtLMZUsqyTeo3Le2 iseqpbr0kykcM9Fx3B8ZcHLC2ZpaqlqqqCPKYXC5Yyio1QVVW8p+7owq+dXkJQsRdR6foPe2YoCa Z63bkV7jx6Jb2j8fdxY7R/BMeiVUNQtJmqdp3FDNJIuiOeOHlNasLyAXVAOefdBdMp7K9LzAJEzS h/b0sfjD2buvoTeogztXU1OzFWCgytDSRDKRYkVMngfKx0zKzorAlJBGRZTq/HtfHMswp5/y6K5b co4C9Wq75x+F3dhP4rQfc11AyplKXI0zxLPXYyojp2WloZQ5YyJ5WQo4B/aP+B9p54gCWDDq0cb0 oei2bm21SVGzdyRZyZ6KoxFBLLgK3GxeKuSGBTJR/somp5kcBWv9Bfi3svqVqAx6WDgB59Os2zqH dvTdFW7ppKaHOUYqpq2CGm0U9ZEwDxvM59azNTMBqQDRLqH09p5BIxJ8h0vgftAZcdUF/JvD123n rZcFi6iooppqlUglbVCou5jfzmxQ01uAOCbX+vvcDOrUYY6euQCurAp0RHH5DNVBq466ngNKL3aX W06NIrKYVb0iVR+bng+1haoByeiWSd1JUcOix5ytpYd3SUbxCNKNpZYKlmBKrrNnVbG5Aa1ibWHP u0VTIvbXpExJqT0J+xJ6uHHQmpMQEjVZo8gD55ljdtYBNtCSM3ABvYfT2/cMaKKY9f8AJ02iKCzA Z6eZK2eomGOYuks7ksyqfM7lvRqS+kiNPoPp/h7RmvpjpyhpWmOg07EkrKbFZb7Spmp6YRLE8DBS JFVgJGaUXW0v4A/T7vDEXbj02+BqHEdCp8UsK81LW5aCKoieoMQR1bW1QIRdhGjXMcYZvTb8+18g KRFq+XTEU2t9JGeji7gydRTxx0VG809QKSWWueBf2aaqF7wTayA8sagXIJ5+ntACQB0YoBTPQGCb M1kvnpTHKs1SiS1CLeoFQmq4tdRLqDWvY2v7uDXHWwzDtqeh52pTV6NBG0TiSrgKqssTLEP2xGoe JQGOmRgbixPvWnjTr2T0OFPiM1lcOmLhik9ARMnWLGfPP4NRi1ylV02biNFJOn68+22ty1TXq6My MCvQT7i6tz+XyI/iX3cMaRrFFYuXAuoMkJNxHqUC4PPHupt1Ga16f8ZxXVw6W+G6ugxOPjkyWRpl sjxRrUyxpKIkW2tkcXJJ9Sn/AF+PfgEUjGeri4FOPTk+L2dgzDPU7gx3jlC6Aok1RTxhmcEAjTEV Nyfyfd80+HpNKVpUNnpVQ7/2lX4qHE/3xoG/hjxyQywSrBpa+rxqLm6MR/S9/bLByDpA/b0ytK8e uVNnOp8jURtLuGnqcvJIWnoQUaCd+EkQRyagGdRyfz+P8aoJxhkNK+nThUnNMdH42NsHBZTbeOx1 N9tk8Zkqf7URU8kdVNSU0sJAigjXTJBLCW9BH0PtQCtSGRh+XTRqOPDpf9F9XSdL77zOOkdjBmqi ARQzwgvR0vhlEzwzfpkmqBMHbTdkIIPJPt9BoFRw6YYBvt6sdxWWrMduKmxUTpVQZKkcUlasiRQU f2tNH9tTNCFsairjZlIaxJW/uzSj4SMdaEYBxw6ddj78oNybqzuOx0ddTx01K1M9LlKd6WoTLYus qaGuV6OS7tFEsaNDMpKSxurDg+9FVYE049X+Q6VG5ZIBDXVUolaOObHRmKZAsPnNQiu2sG95Pyv1 H9faOaMqaA9XVgOgW3ZhJJOxps/US+LDz0EdPUYsIqQ00sBURzxBQGDMnq+ouTyfbHhA4Jx0oWfw zgVz1RH/AMKaOnsGPht0V3zQV2Cotw9ddx/3LpqjMu0By23eydsZGursdSpEwqKqsXJbLoZUjTUY 6eKWQjSrEJ5bVJyI3R2AP4aV9PPGOJ6HnJ/Md3sV1dS213BF4sXGcOYiVOoBvDOoEjUoIBoxFRSp 60sOv8lP2BXyYahhpMdlVoqishXJZWnoKGvFK0aGjxlVUqhqchUPIPHT6dTc2JI9sPsE2s+FOjKP XBz6jP8Ah6kD/Xr2yCyhkvtiuluXfT+kVaMgVqys2k0qMrTFeJ6sI6c66xu3sXFRZJ5WzNQYcruF oVsktUVtFjRKQGMFFH6APoxBP19iKC0SCGOFCNKj9p/2eoF5h3ubmHdrzdb498jVAr8KjCqPsAp+ 0+fVjnSHVQ3VkWyoE0EEVDLJQwxkpKphskUE8Ulk0zH6EElhz7NIYwACOHQauJEB7cKOrpeoepaz K4jaWHnplpqDzR1GfqdDU0cGHoWDVtbLIthVM80SxAEXe35Hu8jgKSGoei9R40qg+vVOP/CiT5bb y2yOrPiThaP+CbFzO3MZ3HkgAaeu3NIKzN7e2cK+KPQExGNegq6hoH1NLUGFzpMan2T3Ub3RSIPS KtW+Y9B/q8upI5Yv7Pl9LzcTCHv1TRAMYdgayHzoooMUJ1EV8+tS55/MamaoV56moYMJmewR2kDy SFQPWzgaQLgKCf8ACygJp8NUIEa+X5Y6KpLr6g3txdq0l7MahyaBSWBZqUySO0DAAJOTSgv7Yy2W zU2M2psrBtNUtCkZllMa6RGplrK2omd1paKmFmkkkkcIt+T7Izs5uJpJ7qarEk0HADy/YMdSt/rp 2+wbPZ7Zsm3CG1hiVS75d2/GVUHi7VbicnpfZXEVOV3Di9h7Mrk3Lmck1NQ1uRj1LiGyyj7jItQT MkUjbe22lpZ6uRQs8qDSoCG6+0s4rVSka9zfEfOnkPlX04+vp1GnM/Om4c1SR325Ex7fAW8KOtcn BdvIueAAFFFQOJJVPb01JhcVtHrPa1ZfaOz8dLnq15KcrUbs3Dk5ajHvuatmB06qudZnpEN9MChr nixpJQKEHDoD2FZ5p7yVf1WNB/RAyR/gr0XfHZdsTR7hpogjV2RipI4agxr5IY9TuYhJb0RIPXpH 6nC/09s+XRsY/EKE8Aelz1yYsvSVuJz8S5VzokhGRSOqEcMQKhIjIGdXGu+q+r+h49hnmMTwC3vb aVk0kg6TTjw4fZ1kF7EybLud1v3K28bZb3C3EazJ4iK/9lVWA1A0NHDAihFCek3vvrmPCiTKYacP RsZZZsdK6+ekQHWWpnJ1VFOik8Ea1Vfq1za+zb6bvTb3SUlwAw4N9vof5H5dX9zvaOLl4Tb1y7cB tvJZnt2I1xDjWM1q8aiuCNaha6nqSAiBIIINiOQRwQR+R7E3UCAkEEHPQp7OrMPkYjRZI+CqgXUr Fhpq0J+qAAN5kH6hzcc3+tg7ukV1A3iwZjb+X+x6fs6m/wBvdw5e3eE7bvJ8O+iFQaiko9R56h+I Zx3VyQFTlZsXQx6YItMf0T6GaUkfQL9Qh/r7LrdbmZqu2f5Dobb5cbLtcIW2h0w+X8bH5DyHQUbh yL1Ei0qp4ok0yFCSX1MCVDm9rBWuBb8+xJYwBFMhNWOOoL5s3iW7mSyWLw4FoxFTWp4V+QBrSnn0 z0j+GXRKYo4qqLxSSTRGcQxSMLzCJLuZI9N1H54/HtVKNS1WpZTWgNKkeVf8PQfsJPp5wkzIkM6a WZl1hVY/HpGSy0qo88HgenunydVghLT0UYihqagNTZSpx4jqJKZGAcFJVkWWK1jp50n/AF/aR7eO 8KvKasoygaoB/KlD8+hJa7ze8srPa7dEEt5pax3MkGmRowRXDBgy8DpzQ8OPQh4ramPzb/xKryAz juBr01SERqQbJ4acoKZFJNkIGn6AD2R3O5T2g8COAwj7Dn8zx+3qV9j5F2nmST98X+7DcpGpWkg7 R5DTHTwwCT2ECnAAdJ7ce0oIdy4zE41YaePLwxhQ7yN9sySss841y3b9uM2W5DG4AvY+11juTtYX FzOSzRE8KZxgcPU8fLoK84ciWttzjsuxbOkcUN/GoGosfDIYh3y2e1SQtSGyANRB6y5vamT2UpzO KzSeBSkPrHhqnaR1AiEBWaCqXUNRBtYLe3HulpuVvuxFrc2h18fUY864I6f5j5G3n24RuYdj5jX6 ZSEyNEhLEUUIQ6Sio1GtKAV04r1yoewszjJ4VzeLSoXTdmaKWhq3RjfyLqDU7WvxaNQf6j6+/TbJ a3CObS4Kn7Qyj5ev8+rbZ7scw7NdW6cybKsq0qSVaGUg51CtUPypGoPCo49L+TKndFLTjH1EEePk qqeWqRWKHx0sgqRHU8GTymaJAVIF1N/p9SUW/wC75H8aNjMFIH5ilR5UoT1Kku+HnWxtF2q6iTan nRpADp7Ym8TTJjVqLqooQKg1pTqY9DHV/aeSRtFHVJVNFYBZXjjkEKsdXCQzMsg/2pB7aEzReJQC rLSvpUiv7Rj7D0YvtcV/9B4sreHbziUrTDFVbQCa/CjkSfNkHTFkzUbiqY8Xi6tEoKWRJcvXxKk0 RkXS9Pj4fUY55GvrkBBRbKGvyhWW+ixjNzcREzMKIpwaebHzA8h5nNPXoM7ybvm69i2TZL9F2qFg 11OoDoWFDHAmdLsfikFCq0UNXKM847B0uOgoY4I1Bo7l5NNmq5XgaGSWc3LMzXB+vpsB9OPaWe7k neZnbDfyFagDoQ7PyzZbTbbXFbRANb1q1MysUKMz8SSag8cUAGBTpDZljFnX2qgLUmay+IyJFvRE ksmvIoL8skssSyAAWB1f19m9qA1mNxP9pFE6/bQdv7Aafs6jPmJ2g5ml5GjBNhuO4Wtx8lDNW4Ue oZlEgoKA6q8epnZtE0NIKvRZKqrw0QcsLmamp8+JlABuBomjNz9SePofbXL8oaTw65VXP5Ex0/wH ow959ueCxF/4X6c9xaKDUfHHHfawPMCjRmp4k44GgTZGPxV9XF9m+PMUzI1FJI8r0zp6ZI2kcB2s 4Nifx+T9fYkgbVDE3ih6j4hivoadQRu0Pg7pfwfQNaFJCDCzFmjIwyliATRq0r5eZ49Ga2ZteDGb cp6XJ0NJLVVkcktaDBDKWjqmLJBNIQ3mEcRCnkgcgcc+wDuu4PcXzyW8zCNSAuSMjzA8qnrMr285 Lttm5RtbLeduge8uEZpgURqrIaqjtQ69KkA8QDUCoAJw7i2zjaDZ25KPGQPTwSwS5Iwh5ZUSWj8V SFhDuzRxsaYcA2BP0/Hu1juE826WEtw4ZwQtcDDVGf29M82cnbPtnt7zjt+zWzRWzxNcaAWYBotM lFBJKqfDGAaZJpTHX//R0DY9eqQxldIUReRuBb6sQDyWYj6cn3vpggUXVxOadcldYb+IAyW/z8oB db/UxRi6xm/5JLf63v1Ot1rxGPT/AFceufkUMNN5JGIJLguzMfzYkAt+Ob+99UoTX069ICUKswuV Iso9K2FwL/QkH/Uiw/r791pcEEdN6oz/AEH4JueBwCfqePx7r0pJA8+sgRF5LBje/wCf98frz/T3 sdUJJwOuDEtrc8lz9Te55uSL+/cB1bzA69FcNcX4+hH4P4Pvw685x1nuLG9v1BiPqwPGog3+tj73 031wqABoAJuEAZWNyuq8gA5IC2b8W919enFxjrLTa1AaN2RweNLab/64tY82+vHPv2KZ6qxIOOp8 dQUDeSFGJsC41QyDn9JADQnUP6gG1vdSo8j/AKv8PWwxHEdZPHSzEskhikNiscp8bHk8ayfC1/63 B967gPUdborV9esUlLPAxBVg1rhStrqDwQDdHX/Fbj34OD9nWivUUgE6GAB5JvwtxyVYWvf3bhkc OtdckqJYQRG4aNrF4ZAsga1hY/2gpBtwRb3ogNxGethiB8unKOsop1RWL0rWAaKdnlpdV7CSlnAM tKVH9lw6n8ke6FGHDP8Ah6vVT/q/1f5es8tHPC0Y8SuxWyuos0yrcqIZAXoqxWHICMW/w96qCCP9 X+fr1KZHUFolRiXQoupgW8ZDAixcENwbX/FrH8+/VJxXrVBg9edlOnSthpIjuCEYCwUgK37baRzY nkX9+z59e6zoqKhZ3dGDAIAQzoCVCujX/LsOQQV96z1sHpWYjdOawEztTVtXSTSqjT1GOnH+UWXh q/GvqocnqB5LKrf7UPdfKg4eh4f7HVJreC4AWaMMRwPmPsPHoTKPsijygNXkMfjp8z4o4pcnR0Iq afIUsA9UOdwsqtXUE6x38dVAZUQ21ekcaA044Cvrj8j/AJ+iuTbZEr4EheL04MPmPI/Z0L2066mz 1DBXYRhDjKqoKVSz19J9nTViximjjqPPN5o1SEaSichACDYC1SWB7v8AL0WSo8blH+MfLy6f5sFU 1UCw6mllqIEp5q6mqsezvDGQkEkzwVJAiiaImKQg6iPrcW9+8VU+M0z14SAcRivz49BzX7Grquoq sztcy7e3tQrLLkoICI6DMBdUbSVFFHqgqKaviDNwukhz7eUq1NLgj06VLcKAEk7oPL1H5/LoBdwP mszX0dJVYVqbc9NRSLWRhF8NfjKNVOPq4ySJHqqemvTv9bxQR25De2zb6nYr8Jz+fmfz4/bXoVbb uy2FqyYeMN21FaV4j5CufPiesdPsvMzrLLkzR4WCEapnrJwWZdJNoIlABNxblvdlt6HLYHTtzzGJ VpDb954mtR+zH+E9cGptjYMH7uap3DWNGqmGJjBRxzDSXIdVBkXXcD8ED26Ao+3ome5vbgnu0r1t t/8ACejuLDZ/p7sjaOiSF+rOxo8pV4ugjUfZ7M7Ew1JS08gV7q6JuPblTPIynUoc2/HtbAwMbL8+ kjK8UiOxJr1sF9nbWx27NuZKonSnrZKiM2LWnDk6ys1rkiF4rFmbkG3tFcKQSFHRzEwZQeqR+59i 5TbOTzFJTRw1mNRxLDCZF8tL5kY+CPUAQjkfQ/q49lxBrx6cZScjquDsr48S97766I2NVYqVaHdv efWG189HIsqtS7fyG5YYstWvJTPHLHHBjDLdlYMpKm5t7N49LrGCcdI2UgtUkdfRWwOQqs1k6WT+ GHH7ZwlPFHiYZWULWT6IoIlEAJEdOIo7L9ABa3ty801FPXqsK6cenXt641zmNmVevStHlMjHUIWZ I6iCpp4yvl+iSNCYwEH9knj6+0qhclT1dxXJPSvmyd62hxdHLKSs0UtUCWijjiYr418wN/uD/wAk lfd+thlwK9DLTVMYeniaNpdcxpYvFGzFXVNTyTNwFjQ39R5J+nv3VuoW5azIQRY6XGUxlyOPlleR OEhkpZg0MxmmUcI6k/TkHn2lkdVOOno0LEV6LF2TuXbe1sTkNwbnyjQ09O0tXU0YUM1PUzg+HwNJ cq07gqTxx9PaR53qEUcf9R6VM6W4QHzPVe24d07k7EpMpkYcxPgsbU1UTYHb+LpZKjMy0ESOIalF SN30xSMZb2+vsytrUEx6lrkVPV1txOC4Bx0XLIR9n7TM6suShhknjbTlVmhjaip1DQVNNrjjDCWw e/1DGx9iKWGyKtQDj0jBIIIHRUd+fJDKwZPL0FfkKrbzRSTOctV42ebBZYTx+OSI1Zi8MdSzxA8N qXT/AI+ymSyjlJaJaIPPyr0pVbpwXi+Hh0UTtHt3sfC1u2t7bU8eX1Hx5yClMf2mSpSCgZ4QrNIz Rm/HtPPt9yIwLcAsekyrOtzG0jUUE1r0OvVv8z2kxELbQ3F13k6+OhpdECpUrH9vLYtpQSEERiT9 I/A9pjYXTdpDA9LNdDginQjbZ+eKblGSpo9mVeHhrGkkjGZdHlaBnK/5AxAWphIB/TqF/aUQhZGi kUiRTQ8MnqyEsxJOCejfYrt7FZTa0VT9rm6OhrKP/LXrKKUQM0hBdYWMIX1nm4/HvVwiwoG8iadG OERW86/5Oim9gRdS7qFTSVucxkEcdRJEIqyaCMjzXLKVldLElbCw9ollQH4x03I+paeXRIuwOnNo Zmiqv7mU1O9IjSXAXW8tuNZaO9wTyPa2Ehq56StGKHqprtjZ8+xt9geKnPlpTEIZoQ+q84Vo3Vxz +q4/J9rY9KjC0HRZPVWz1B2tJPJURYtgaeBp/ONETuHNxYLb0RprH4+o9+nJ8M6ePTY49LPL0VBi qiL7WqkqquaTXX1UZN42lI8dNGGB8am/4HH59oGLGnV6k8T0EvbyfbbXZIaSrqaVJBFVIJLSwRMC 0k0zp/nArn9X9PegWBwadaIBBB4Ho6Hwxx2PTaeOqYohNUHHvopmciQ+bUpkUtcBPpz/AID24WkI 0M3b03HCFOM9DV2DHUYdPAlNBVSTxMgjgA1amDuaeZEHLp9Wk5LWt7SvIARTo1hUaOHTh0t03V7h qqauqYjBTyMJdWg+NJ9RLG1gBIQRf8W9urIGyOqOgDFqjPR/4tkdZ7Wjxs2cyVPTyUkTNWySxKSq ogtbTY2exPPvxuEhIDsKtw6ozhQKDoB+2/lb0v11hauTZeOTclXJUmBvHLDDBBV8xxzkFgF0ykEn 629ql2vcL6PxLViwPkPn1oSqKVFOiB73+bu56nI4+iwUEDNVhY6ympFjqVinYkH92NXVfVz9fbtt sm62zp9ShK+fn1SeZQDQ56BzceX793dlo6SGir1nqWiy1PUvW+OkFDWXEMdhpAKmM8e111Zusywi LJUGvyPTVvBNdJ40bdtafs6UmO6i+Q2QqosbXLDNI6rLTymuMsceoXfWiyk6Sht7XQ7UW06gOnHs LnSTXqRuXqXu7Zs8FdFtSrylKCj1NVj4qmaCK318hQOthb/D2oba0iIKwg+tOm1sroceh16y3p1z iqKCg7Q2dXYfMZGd6eizxgkjBmCqBIzvYAIWvb8W9tSXDxAxPY/pg0Bpx+fVmlMY8Jm71werfel6 SHrlF3XgczT9hbZq8dSUqUkM/jnxU1o6x6yOQsA5jUaWI59pZS9wp1QBUUV6aVzIaA5HVn+2afbX bHXtHW4poYNyJPUVL5J3jZYFhkXxUkRiJaLyqLMb8g8839lCPrlMYFV6c01Gep+Bmycj1tNk6aOD cWFVZMpTwNr8SxJI1M0gJDxzFUGgkc39vywKulvwnqxXHz6ddhNNLvjE5uSMQ19VT/aVaqAyv5FV pI6kD03EKLf6829pzgnpkr0Km9psfJjcvCkhjQywKbK5khtVRBBDG17sW+h+p/HtqSpXhXrQJHTB k9tzV74+erjDxVNVT09TWu/ijliDKFWa/p8pT6gcE2HtOThqDNOrqdRx1rm/8Ku93YrF/B3489cg pFlc78psduKhpS6vI2H2T1T2VicjKFAFgtZvShBYfW9vzzex7pHYHFP8vS+47Yowc8P5DrVK+KPR tXiqeg7A3PQ1EuVrhqwWLmFhjcSyXbIyxuD4qioFivAKR8DljYyRBU6QKnpFcTyzLGjOSi8B6fYO rS+pNgy763bQUMNG74SlqopMvLSwi8FOz6A/pUyPOXAAVj9Df2+sfmT0V3DUAqDTq5vYPR0eKfHR YrF1EzyrBTBvCsMdDTyjyNJVJYH7gwfoI/rf6D2oCsFA6KZgztQDHVnvX+AyUmGNHURQpSYunxdB m8iq+KI0VMBPRYCCjVdVbUPJ+9PLa1hY+087KqVYjpTY27GQsU7cdafH/CgfOdWdofOSl2nkexav a2f6r6c2Rt6vpZ9ty5XF1VXmFyW86aaKox9RHLSvLh9xUa+IhtIF+L8poO5Ca5J6XXVzcQSr4duH ioPOhr1Re/T20apV/hPdWx6tpIoZo48hSZfCsyuA0yaqmCVFkgFwQTYkfj6+3VQV+IdNvus1CHsH AHmCD9nQnf3EyNFi1wewc1sCfbUkcdfuB4N84wbk3SqQSSrS5CdpaQQ0sZQhKWLTEGvq1Ekm5jJ+ Flp5Anz/AMp6Lmulkk8S9WXxBgUXC/ZXz+Z6E7qHYVPs7EVW5d01CY2tyW3psvuipWaJzs7riKSW SkwlDUo5Vs7vWanVSym/h1EfXmsaAEFjjzP+X7PIdM7hdmdhDCtYlICD+Jzw/IdFe3NvRd8ZPdO4 UV4f4vngaemEXjp6HC0NOaXBYunsxbRRUQFxYAOTxzf3RmLNqIoOjeC3+mjjiqCVXJ9WPxH9vD5d A/W1IaoqfHazTlWK6rCNLRXBJuNdj/re9heHSzgKdLfbNVJjJ4Z6cmAlnRC+slBNFpiDahcpqHP9 faW7gS7t5beTIYf4M9G/Lu93XLu97fvVk5WeF+PqrAqw+wqT0pXatq5GqsjPIrfk1HFgbiyp+OPp x7DQEUQ8KFB+XWRhlv8Acn/eO53bdwqGc4oeGkf4Ogsz2HWjkapoxehZgvJ5ikJPAU8iNvx9bf7b 2IbO6MqiOX+1H8/9nqEuaeX026V73bxXbWNP9Kx+XHSfLjTgfLpPxSyQSJNC7RyxsHjkQlWRlNwy kcgg+1zKrqVYVU9BOGaW3ljngkKTIQVYGhBHAg9LmlzE2Vinqqqrw9JUUFNqkkrmlNRVABtK4+kj VI5ahtIBUva5vYD6E8lqlsyRxxysjtgLSg/0x8h86dSZZcwXG+QXV7e323wXVtDVmmLeJJStBBEo Cs5oBp1Uqa0A4IeaaSpmeaZ9Ukrlnc2AuT/RRZVA+gAsB9PZuqrGgVR2gdRrcTzXlxJcXD1mdqk8 Mn7OAHkBgDA6e6mPHy01PQ4amrK6uppKqoq8gkDjzwhU5ip0aSVaaIJfU4UrySBqICSNp1kea6kV IWACrXgfmcCp+Vf5dCS8i2qeytNs5esri53OF5JJZwhGtAB8KAswjUCtXClckgaiAtaCl3lu2Oau pI8VT0mRphjZaiYwMiwU2tZolikFbU07VE51sVQMWCkEKB7KZpNr21khkaRpUbUAK8TwNRpBoMCp pSvz6kfa7H3D57huNzsYrGGwu4fp2kfQQEjqHUK3jSIXfuYqgYsEYEKF6iZDZe4doxDL0uXpIzCF 8jwVhopQ49RjQVJijq0JXhLln/1B+nt2DdbLc2NrJbMa8KrqH24qR9vAevRfu3t1zZyFAu/WW/W6 NGBqKS+C1eJUCTSsoxhKln4eGeHTXS7snqNyYTN51fMKGIQSSRRBTJEGrAtSIVAjLwyVF7KACU/B v7USbaiWF3aWZprNQCeB7cV40IHn69Etjz1c3fOHLnMnMyeILZNDMq01LWWkgUdupGkrRQASlMEn pdR5Gk3puH7h5kOLwgQ4qgL+KSrqpLO9bUROVl0I4sOLXCj8tcnaCTarHQFP1EvxtxCj+EHh/qPy pJsO72PuJzZ9VJcKdk20D6aGulpZWoTNIpIagOBimFAGX1KHM02LqKGVMv8Abx0aj9crLF4m+oaK S4ZJSV4tyfpz9PaK1e4SVTbajL8s1+0enQr5hs9mu9tmj38Qpt6jixC6T6q3ENjFDU8MjHQHU1Xk MJVVNdhpZ/sVneCOpkh1QzwO7mnM8csYUNKkdwSqm4NrWPsXPHDdxxw3SjxqVIByDTNCD5V/wV6x qs77deW7283Pl6aT92rKUWRkqjoSfD1qy0qwWoJANQ2kgg9CHtmqxO5JFjy2SrqnIlbtjKqUQUE7 A8/a01IsMNQoU3KyamIBupAv7I9wjubBSbaBFg/jAqw+0mpH2jHz6lrku92HnGVIt/3i5m3ciptp G0QOR/vuOIIkgAyVerEA1UgE9Lilo0wuQjooVihxmWkmekgRVjFJkYoVeanTSoDQ1cETSKP7LIwH BABRJIbuAysSbiMDUeNVJwftBIB9QR8+pLsdvi5a3aLboESPZr9maJFAURXCoCyCnFJUVnX+FkYD tKgKqOmJJFlBbkO3IAuAyhf9U3suLjocRWmtqUArwJ8vUU9T0g8tEknYG16IHV9tR5GuYfldcFSs Woj+slIP9h7ObViuy7hKR8TKv8xX/D1F2/wJP7qck7erVMNvcTH5VSQLX/bRD8uuHba227j2J9TZ mAEAAKLUOQA/5C975aP+PTAcPCP/AB5em/flCOUdqdj3ncErThiGf+fQHVKzyT1k1bMZKs+KeR2c M0rVBVmJa/LBXBsPp7FyFFSNYkpHkD5U6xqu0uZbncLjcLgvfnS7EmpYuQSa+oBBxw6OBiJhNiMT Mv6ZsfRPqvf9VPH6Rb6k+4xul03Nyp4h2/wnrPrYJxcbDsdwvwyWkTV+2NcdS54klikimUeB4pEk RjwUdSJA5/1JQ8/j22jFWDKe8EU/ydGM0EdxBPDcKPpWQhgeBBBBr8qHPX//0tAxpLgAEWUWAVQq j+v1sQWP1P1PvfTFDXPXUZ+puB9Dc2Kr/jb8n+nvfWm+XWRbCTU5YIwJ1ngtYc6SQDYnjj6e/V61 mgA49cmqgB+0ix3uGdrMSCeAoYMRYf6/vXVgnrk9Qmk/C3P+J+n+wH09+r04Frk9ejPqLNyPz/rX Hv2T15gAAB1wP9P6Mf8AX/Hv3Vh6/LrLFcBmBt+AR/X/AIpY+/Dqr8R1zFiAPqSbW+pNyPp+Tf3v qma9ekhmkeaRVdlRyhZvr6eADc/UAfT8e6CmM56d4CnWBXZRYHi9yD9L8e7DrxAPWX7h7fVv6/Uk XH+uffvtHVNGePWNpWa/PBv/AK5v9b/4+9dWCjqfDUT08aqJHEZUHxtZ4jrub6HDLcjjix91Khjk Z60SQSBw6kipglF6mFkfkNLDyL2BBaM2tp+pCsb+66T+E9bJHAjrG0YkBaI+QaSW8QDFTa/6WAlU AfmwHv1SMEdep5jqM8ZUjWCCeLkcG5NzYcG3+Huwavn1Wny6zwVlRSh4YpCaeUq0lO58tHPpN1Mk B41D+vDL+D70QDkjPVgxGAenePI0tQnjqFNIUv4TaWenjcqeTLdqqIG9rN5Bb8290KHyz1YEE5PW E0hZC9MQ5axJR43jcaOb3CoGJHI496r5Hr1K+XWON19MUjFHViPE4AWxF7xiRQwNyeBf3o1/LrwN Pt6z659JdWAFgBEQLDm7KrEFk9Nv9t9fesdb6xaWjkhuJVcMnilVzFUQt9V0OttSjmxBN+Pe/XPX unh2pZonjytMleGZXOQppFpMpC2nQpdlQ09WL8Eyozf7V7qCVppNPl5f6vs6thqkip/n1GqMZBGI QJYZsfIbvUQwtFkIljXUKaspkkkjhVy3Mi3Qk34Puwc546vTy6oVpkCv+HpyEAgMNbST1UKSftwV UGTqjJEsQ4h1w1IfTFey29I/A96DGtPP7OmyiEZUU+wdLDbGVrs3lUxuTylTXNSY9zi6+bQ1fRiB i9SkFV4xNU/aRzGYK7MSiOv0931Mwr5jpHPCkal41oK5Hln/AGaft6DfcUe5YctXYnJzVVZVUc7x zMjSSRTA2dJ0t6THPGQw+nB93BBAJPT8Qh0q6gAHpvhw0ruwrKmOndLj7eO9VVsVAYoIYNfjNyBd yAD/AK3vRYAYHV9flGhP+Dq8v+Qn8h8L1B8tMv07k5XjwXyZ2dLsKGasqYI/t99YMVOe2lUSwp6Y ROv3+PhHk8jz18Y/wL8DtrK+R6T3KO0etqYPl1u7UO3JpNuw0GLf7efJA4+qRjOxpq2CFQ1LUsXM sTyIQwWxBU3uPdnQhmqcHpXaklF9adEb7q6uX7LMY+WihTKTmSOrn8ZktLBqcssx1OywOoY2tYe0 LIuSR0aQqWThUdFJ6O6+kznyP6AxNNURU+Spe4dnw1VB43mNbSUleZauoiZUkjRZqf6c6tJBFvd4 VpXPTEsNCKdbmBpaDH0742nSKBo5BHFBo1NIKVgGljYAsrgX4JA/1z7vIT9vVFhOT5dJ/sqmrpaD DS0dI9RJj6mprFhdvG8oRNDN4roSAq6wG4IH9fdFanl00y1qK46T+0c1j90Un8XoKsTQUEq3q2gQ tkBdlli8LOr6qadCv0H9efr7dwadN6BUZ6MzhRLDhaSRRK9ROPuYysiFTqDORUKLsYyv0A4v71qH Dz6uBXoHe0+w8HtTbmTrK/IsqTUkqLSxuRLLIz+swhLSrpIIAFj7SSRtK+lRnpSiHqg7ub5HS5Pd OSpcpLkqDbZUxUiuktdJknuypFNDMJQRFxpJF7n3cbNJcOlWYAH/AA9Ko4NXxLX7f9npixWK70oN mS9jYzcK9Y7XrZUpsTldxQxz5GugqDoRKKGpEs9NDIklhoVQt/Yks7G3hrE8uqRRWnGnSnwZFU0q BTpt7m2GkPXVLm96du9h7r3TWUCR4nE4eNI8UC2nSi1UUqTlAT/rW9qFnjYsPCAT+f7OkX7tlnA8 MkmnRdqT4sdqdpdeLRid6XE1EUjpHnURq2I2a8qRM0ikFSLN9Sfr786W8y0aXQOFP8vT8Gy3kEgq 7040qeiVZ7+X12LCmSxmE7Fz9TURCeNqKCpqBHHJJqRFiZpgsIVyLAW+ntOm0w6lpfuB9v8As9Cm G3DQNE0QLkenSIp/5c3cdPtbI11bltz/AMSw1HI8stMImnmCWPrlNRrdmC8XJ9vfuq30gG/bVT16 LLmwIP8AZAdRev8A4+Lmdv0VLkt/bwxO7Maq008FWiv9jFFMylVDu3it9bLxz7o8VqiLGWrIvmQC fz/z9JBYyAYXHRmsr1B2ViMJRAfJOvkwf26UlHiRDFLMs6xhryRoHa2hSvI9llwFnBRZBQf0R04s Lwkl1ND69N2yOndyz1cktbuY5gM/k+5yGHp2WVz9D+5AwJN/r7I5bcJJmhH2DpwkEfCOhw3NQSbY x1TQ1UENDNGWhHghWm1t4UKsPEqA3vfn+vu3ioeC9MSSpwAFOqgfklj4k3Ht2vqKBatnlqHCuw/d d3Kxs7EEXW5IJNr/AOt7VQyxlCMCh6K5lWSStBw6ROAx6xTUsk9M3mZp56l4kCNDSKvEADAxmQJ9 OOPaeZ9ZAHw9JtIBpTpMZnIwy537fFhP3CktJNIEKLIhKssioFIKry1iefbJQ4p1sr6DoFfkBNkq PbjwxVokdpY6irWnkGmVFX1R6lTTZmFiD9R9faiBRrIOT5dNPUeWejr/AMv/ACR3LSx4hqN5Fgp4 YpY6Y6JUj0reJbv+4tx+CL2PN/bs0S0Dk56ZgkbUQw8+jtdg7F/h+5qelkSaKF2kZo3cBoYXYMPJ ZmeQMPoT9BwPZSwWpFOj2IllU6ejX9U4WmpNun/LYaVEY6LQxjUjKLG6i7OwP+HtQjoKAJw6YaNm ZjSueg27X2pT5Cr04mnqsvXZHzRs8skywU2hfSxQERuHvbkfj3do0uWWkYJX+XTkW2m7Y9xAX/L0 Sur+FlXuPMSVO8ayopqKWcSpRYmmVI3/AHBJokEYAsQLEnnn2JdudYI2DykCnAEjo5g5fxr1cM9H T2V8Hus8fgqKoxu3zNWgamDwU7ylgARqZvWxB4/r7dF6irTUT9rHp47bq4xD9g6UuM6bpdrZGeOo w7mjbTEIJoUkmjRb2KMdZSKx4UEAf09pZ7pHk1VzQD1/w9K4LHw4CqqAak8B0YnBbJ2xlMbTUdLS Q0M8A1+WSCJKiQINRjMgXWwsv9fbZua4Ehr8j0jeB1enAdKnC7Z29k6iXDmnmhBBhLtxTSE8cof2 2v8A4+yy6lmFaSv+09V8B6nHQM5zonE0u5dw0VfhcbVLlKlcZjquvoaSro6aCosvmp4p45I4Jjr+ qhTx9fZ1YXo+mgV2Jovma9NS2a6dRjGrzx0He5PhD3H1ThM5B1ruKrzVBmpIqqbDRV08c9DTiNK8 1ECRTLppWI8RUWHNrezywFtdiaIOAKVz9tOiK8sZHVfCwQfL06WPxm+We4+r93f3c7FoXx0CUq4e bHNFNTmQrpjM+nRpL6wTrNz/AI+y6+5eMxYI2g8RTH+DpAQbY0cnq7Dasuz96Trv3b1VHWQ19BBQ 5DLU8gkjqDLHpjiyEiMRO8Je2twStvYfnDxgwucjh+XS3xFmynp1Gx2ObEZuhaiT7wYyp88tOXbV ItRI1MArixd44muo1W0ge2FGvuOOmHjaMmp6UmTgqqvOYukEt6TI5ch/KgFQWoh91HG9zJaCBV9O n6k/X3Uihp5dNHhXoRstAz0FFOkJkiaRneeTVJSwywMdIeKx0uyLdH/1X19tzLQE+Xy6vANTqCet TD/hRxsdu0+yPgzi85U1ybe27QfIPc9djJ2gamykslV1BSUiyhZdf3BkphyYmj8JkGoE6TS0IQS0 Gcf5ell0p/SzjP8Ak6rF2Xtc/YQmhpY55DHFTQxRS6lp6cBb+RAVWLRGBpAJJH49qEmZCanpEVFa Hh1cD8Q+kZKbCy7qloqc4zIwfYy1UFkmkybNI/2yIdTtPHSxlix+gK2A59rlfxE6QXYoFx1bZt/G Q0mFxkMeJjoMjWjx05liNRVTVZURR1ZjMjNJT0kK3bgaTyPe9bKOPSKIElQwzXpX5Pe9H1n0xvDd 2dnoaLHbLXPbgr69qhXNdi9uY6TKZHIzQq9O0VVJHE0PiZwAjglrixLZZWkelcV6OowEArw6+al8 m9+dl93d6dp9w9j7PFdk+wt4ZzdRWSWNq3G4TJ5Caow2JoqrFyUxnhwmKaGli0IypBEo0gCwWBfD AUVAA6LfHgnZniuSDX7R+YP+x0XepgwMBZKza248WyLrU02Rc2jmUCGR/vaR0CO5/BBI9+GuoNR1 fvORcxsPmv8AmPUNaDbldVUOPxVLuabI1tfS0NLRs+NqIax55Y4Gp4JoFikEsszALweGF/dqniaY 62GmAZ2MekCtcj+R6Of3lV5fM1G3+g9lNBXbqyc1FWdgtQyftQVtHRxpTYurq0ukOJ27SWV1Jsoj +mpiDsMSoUVJpU/yNP59E23RxqZNxuCRChISvmfxMPt4D7T0Xvsrb+I2Bn5tkYqb75dpY+kgzmQ/ R9/uR4DW5WZAC5ip42qI4UQ2ZVjH5Puh+Jh86dGdpM9zEbhhQOx0j0UYH7TU/n0B7+BlLCOaN2u2 jyBo+STqBdNbIT+Lk+3BXhXHSok16UGKlP01khoUVDIykgxfRgbKSA3F/wDU+22NG/PrdNQcefQi 0lD/ABgJU+ZpFdUupfUUkVQjgj8DWp/2HsN7hILSZgEoGz+3qfuQrZ+ZdngMlwWkgPhFa8NI7cem mn5g9PyYLHpE0dUq1KujKYFAYEMLWkJBF+fZSbycsGjOkjz/AM3UpJyxtUcDxXyiZGBGgZBr/F5f y6AXO4g4quqI4RLJQiokhp6plYo7xgeWAy6ERpqdyVcD8j2MrO5FxEhagm0gkfbwNPQ8R1i1zPsL bHuV1FAHfbBKyRyEGhK01JqoAXjJKtTzHTH7V9BvqdjaCfKV9Jj6YKZ6ueOBC5IRS7WLyEXIjjW7 Nbmw9s3EyW8Ms8h7FFf+K+3oz2ba7net0sNps1BubiVUWtQoqaamIyFUZNM0GOhz2TiVptu7hgpo 6aLNxVWWw0te50XlhTxwMJX9a06SNewAuV55HsIbtcmS+sXdmNoVRwvyOTgedP8AD1k17b7Etlyl zZbWcMKcyRz3Vo05x3INKHUciNWNaCgJXIqMQqLNUexJtyYhVlrYvuqWrwcEVy0710DB4Vut/FDJ AqlwDwDwWNi9Lay7wlhdGitpKyE+Wk8ftNa0/wAnRZt3MW3+2NxzhsCLJcQeNHLZotau0yEMgqK6 UZApYA4BIBYhTJotvT5qoiy+62evrpbNT4suY8dj0Y6lheIG8rqLahqCk8Nr+vtuW9S0RrbbgEhH F+LN86+Xy/lTpbt/KdzzHdQ79zy7XW5vmO2qVt4AchCoNWIFNQqATUP4hz0GG9aqmn3HVJTlWp6I Q0GmFBDCppV0TRUyhdKRRy6lBC6SRcXBBIg2mORLGMv8b1bOTngT6kih/l1CvuPeWd1zdex2hDWl sEhogCIPDFHWMUoFVtSggUJBYVBBPe39o5LO0kuQo6mnplgqGgjMzTI7TRxxynQ0SOV0iVefrf36 93OCzkWCWNmJWppTgSR5/Yercqcg7xzPYz7rt15FCsUpRdRYEuqq2CoNKahnjX7OmLK/xGOslpMn UzVFTSOYG8tQ9SEKgAqjszcWA+ntXbeA0Sy28YVGFcCnQZ307vFuE9jvV5JLd27aDqkMgBGKAkn+ X556VuL3fRh1gy+OVqF8THiqpKREInWnl1UszQM0SxmJZJL6WvdrrawHstuNslIL209JhKXFfKoy K540HH0z0PNk5/25ZEtt/wBnDba1gttIIgKOI2rG5QlQukNJXS1asCoFAOk7mY8bQ5JJ9v5B6ikZ YqumkAmiqaKXUdVPL5UjfywSJcMLgqRyTf2utWnmgKXsOmXIIwQw9RTyP+HoI8wxbPtm8x3PKm6t LYMFljajrJC1TWNtQU6kIqGGCpXJNel6Ow/4hiIqKoxs9RnY6iGallpEXwGekkSemqQut5xMzIRI qrpZSbEA6QTHZPAuWljnC2ZUghuNDgj0p6EnjT0r1KK+7P712GDb7vaJZeZ0lRomiA0F4mDxyUqX DEikiqullLUIVioUcO9N71qxTYvZp+3mRHhknjrJkkVwCkiTg0UZRgb3tYj8+0LbVtMJZbjdO8HI BUU+VO49C+D3F9ytxjgn2X28P0kigqzrK4YMMMH/AEV0kZrwpmtOkZ/eDN4HeUWY3ZQStV/bNGaR TFAYqKbyRI1KFMkbJGQ+kFvUb3a5v7NforS82trXbZh4eqtcmrChzwOcfZ5DqO/618ycr+4UHMHP W1O194JUxDSmmF9SgxAalIXuoC3ca6nqS3Sq7Hz2Gzu1MbPia6KovmIGkpywSqgtQ14PnpmIljsz WvbSfwSPZdsVndWe4zpcwlf0jQ+R7l4Hgf8AD69Df3f5o5e5n5G2i52Pco5f92CFo60kT9GeuuM9 y0JpWmk/hJFD0G+6I6JMsfspRLGcfjGltyI6oUFMtRDq41Mjjm17MSPqD7PNvaU2w8VaHxHp8xqN D1EXOkO2pvjfu6cPF9JbFqZCyeBGHSvqDx40NV4g9GM2pX0kezsFWVVTDTRR0EUPlqJUiiVqZngI LSMqg/tH8+wPuMMrbpeRRxlmLk0Aqc5/y9Zbcj7pYRe3/LV/e3kcMCWqpqdlRQYyU4sQPwnpg3dv rBLgsrBQZSmqshUUstJTw0kjSkGqHgeYTxqYlMEcjOPVyVsPazbNnvDeW7zW7LCrBiSKcM0oc5NB w6C/PnubyxHyxvlrte9wz7rNA0UaRMWzJ2M+tQVGhWLjuyRQZPX/09AtUP0IAt9Xb0qtvr9eLj+n 1974dMca065GZEsYwGf/AI6yKtgRfiKPlAtubm5v79+fWwvkeozys5JYs5P1ZiST799nTgXrGTf6 +9dW4dde/de6n0iQ+KeSWMyn0RRLrKDySk2YkfhAt/ejXAB6qftwOobroYrxwT+k3X6/g/kW9762 pqK9ZohdDYDk/qP15soK2/ofe+qNx6zKCZFFwlnBBb6KxIBNv6C59+PCvVftPT7QmnFJIrNArK9Q 8iSMVkaQqBE2n6eNla35+nttgfTy6sDU8emKojRKl1UxhHTVx+lSU1MFv6gNSm3+B92Bp1biB1CY W/1vxf6+7HrYNeuPvXW+nCSy2UXJTRpsvJHjAtf+qsf9ifeh/Lps8eopbk6WIF7qGuOObA2vzb3v 7et0+XXIMVa4Av8Ajn+t72Km/v2COtdSUqGvqZAzc+otZxcWtcXDADj1A+6FRwr1aueucSRmRdDn 1MCyuln1HkgWJjdAbcgg/wCHvRrTh1ug9eucqMqudLCzH0svAY/gEgarX4uOPdQa068Rxpw6jRyy RFvFI8LNydBsrAG9mW2lufdz8x1oE9OwykM6eLI0qSfQfcRDkW+jGE2sTbkqRf8Ap7b05qh6sGHA jrK1Gjo8mNllniIGoRESlRbhZVdlmiFr8Mtvpz71UjDDPW6fwnHXCFJNYWSMMmkFh9QoUHlUYltR Kn6XIPvxI9evCvCnUqRlVS0bmSJbMV1gvGzPYgEqGKKrfnm/uvW+HA9YS7gsYJnp5GmV2kj1xa9J KWSRSpYgWNvz/re/V9c9e9epq19O+vzslDMymM1tAimnqH/UrVlCwVFYAW8keiT63J96zwGR8/8A IetmhrX9vWejq6jAV9Dl0fU9DWRVdIyPJJQV0S6lnpRUaRo89O7xmOQBgG5v7upoaj8/XpmSPUjo x7WFP9X2dCd2NjFy2KpNxYSSPIJSxwCWKGWWRajF1RjFJJPTARTipopXCOJBbxkNyvu4H7D0XWr6 HZJRQ/P1/wAFD0E/928pZUrapKVGp5qh6aEi6osioiNFGUj/AHZDYfW2k+94B+HPSw3C/gFel31j WZTYO+Np782pWVFNubZefxW6MHkIWaOehy2DrqfI4+tjIKiJqeqpwwJ/I97UsWGempJmKkHA6+mP 0B3Zt7vjqrqLvjacBO2+ydlbcy2WMOmeKl3Nk6aOHJY144WZVyGKrxNTzN9bxEH2YSHVGpHW7VmB Ck4UnpT9r7IqsvWZRKCemEn2sFGjShlmheoTxz/cU+nUzvG3pPN+B7R6a/ioehFbTIBpI6KVs3qe HYHenT+fMMQyOK7P2vkKSuR5Y1SaPI+I00xBFw0FSV9QILAj8e7t5UPXpypNVHWy9kKc+enq6k00 M05qZWU3DeaQmRYw1wCebc2FvaZiSxr0nMlAVUZ6Z8tUxVeW+4qpJDF9mtLGrjQsaB2jM8SMRraY Gxb+hPvSkA56Qyaj9vn0GmPpKOh3XHiHiaGCeUPj4KX0UoQzBzUvYBJNYBDFeb+3emRmgHHo1OVq IcTQlw6xRwQwxQxp6fTKtli4sqA3v+OD7bkalBTp+NTSg49VS/KHtBGy9TSUElPVU+DhmeRaimEN NLU6SftfMDYhZDbV9CfercESBj5no2slMp0laU6re27kcXWbsXPZzBU+6p6+Z5aDGUzaqOKWBtZV ZQrB9F/6cn2fNOWiVEGgjz6MYzolaPwq9C1veHN72y2A/vTBlclSiSCPHbfmLUeCwlOrqFLUg1x1 QhQXJNrge06hlB0XFB5/PoySEyAjR5f6j0MmZxu2Bj8ZSxzwVlVSaaSKhhAOMi08CWOD9C30/wCw 9o5rvwSxDVH7OjjabFEK6skfLpLZTdkWEo6yWON4hiYVpXhQ+RKkLe4Ui326HVYDm3snubyWQeOH KjhT7PPoR3FvbM4UkK5UYpXouQ7KwFPnmlmkp6Wkr2WWupBaRmKuJEUy8FLSgfj29bvPLbvdC5IK +X2461FsFw8iSqSUBrgdCTht7UWZzFXgqSWRafIQLXSVKcxSRSDUaNlHCLZ7av8AD6e9fV3OD4pr 0kvtquI6jwa9Rd1dWbAp3lqMFiqKTMzAyZMGNZfHIy3kgM3+7SQb6rD6/Tj2+t1K6AOan19ei5bG QKCyUx0XyTrHHV9aZ6TDpQVEFSihEkMqyK0ojN10rYXa/wDvHu1p2yyOx4r/AJei/crakMdOOr/J 0J+TNLsmoTb1Zi6KvC0MdUJtK0sis66vFpAe5B/P59s3Uis1Rg9E5t3pTopff2c/iNRXGFTGTMtV qEV1jRYkAi16ub6eD+fZZCWcha06Lbi3eOp1V6pf+RG5Hrd54PDqzTeaAeFQulkf7lToUAnWrE24 /Ps3hijSNi/29Fle6h+LpXZ8x4ilz+Gip3asixYrBIwKpGHhRmZj+pXQMRY/X2wdFDpqAen40VgT +LojmGz8VFujMVOXldqWGmNDQUcDs0n3M5AWaNFuFWTV62/AHvaOqVJWvTU7+SgU+zpPbwnxdbt7 JwVNVNUvFSTmJy9pVBZjLBPCCeY3PpP5Xn3RpGJLKKdMGpXPDoyHwc3EdruK6CrqaWOsx/2uss48 PBiMl2v6o9WtLfm3updmFHNR1oAV4dXC7neLMJs3JComnepxET1dXVX89f4WCxzSP+JJBwfx7ZYL Wtc9GUUmBjPQ09b1kNLCtLXMKhA5eCAKECoSSqEgknSCBcjn35IS7U106NorMyDVXj0K/wB/RfxF jW46nelZF+zp9IRxYHyEyi5/p+PZnawCAOS+rUP2dHVhs7zl6XOilPKta/5ul1t/KbXWVl/h0UMk imORJZvKAjjSSCUGn6/X3eSJ2DES08+jyPaZIwSLutM/Dx6hrvCnxm4VosQXkjT9tINZCD8X1/0H +t7bEDG3M/jHArTp2OLxOMQA6yV+Y+xesqcrJFNXVd3gVgHSCB7+JV5tI4P449pIZDLE8h4hiP2d aniCDQi1J6j4nO0ddDEQ0MdRRsxlkVgraHBQa4udP1/r78lzokWiZ6LmtCy+I1VYeVOPWet3LHS1 tDSUFZER5EaWRIwH/wAQSD/X3uWXxK4p019Mc8adLzK0tHl8TVZHI5RqGBIYZaQlfI0tdDdo5UbU NAcgC34t7vCHBWj46Sz1Sq+HgY6E/qDLZrPrV1O7hJQVc9FBjMTl0qNS/bRyJpaSjsFlDxpzdvz7 Oonkt8o/Hoo8VkZybcH8+l12T8Qtm9l7WzOexkFDS70x1Kz0mSjpkd8iwU3YxXHhMgFvqbX9mlvu siOiuSUP8ug5uFu07Flqv8+g3+MeOznTlZUbSyVZLQ7P3ZUtFJtzJya6jbOXgbU1DHVvZq6mnNmE hVbB7W49oby0RlLq1SOH59JbGNoWGo1HR366GqhqaPOUw+3pMhWmkaAoFdYYoSslTGdX7q3VTcC4 BHsnVAqla5HRlcL43fTSAKU418+nbCO43LLLK8lRj8Zg3alBVTVLLUu0bOo4MjFTbV/ZB91K1Izn osckY6XeECzbVd5/OgqKyWnEbks0yiRvGCjECKIrzcc8e2bkUQdOWzapV7Rx61gv56tJQSfIz4r4 WoaYSQ9Ndr1MhILmGmrN59bCMKtiC1TJQva5sSlvpf2ltmqjmvn/AKv5dGU0Wsxnyof8n+z0STor r6nraI5YUpqoqirPhpxGaUSCBPGsbScopd7lh+dPHtYsauyg8Oks8SqtQfPq/v4f9O32W+QYmHGp WLXyUpDJDHVyJBTyyIrsw4jC6SoB0kj6X9qNAQdo4efr0TzRByBU06NA+Ix9LlqveSzJDjKDIptl ZKidIxV0VdGadspRNcpG0dXaNbA6l+ntmS4IIGk9PJCAAKZ6rU/msbxpeovgf3y82XTH1G+ZMfsL F19VW0uOqnyu9spS43Jxxz1zrS0s6bcpq0xt+bDjVb2ijYNKMcDU/Zx6vclo7eZlFW04FK/yHWj9 BQb1FBLHNW7f31j4oGQUO7KObD5CSkptCLT0e4sMyUpqvs3V1meIlgDdj7MvEC49egqWg11CtG3q pqK/MHP5V6hUFJ/eDAvjv9C2BnMVHHi465d/UccyJFLNNQTUT1OMNUwZSIxI0hkkZCDYe3taafhq aeh6ux8N9X17A1r8H+HNP5dMtNRUm3zjM9ierM3j904rMRU+2CaukymPrt31TPR4uETU9fKspgq5 lYhol9MSkke29JZSCBpJ+z7endTyExm7UxsO48CF8z/qPQqYbbz9R4+oooalM12/vOky2c3NueaN qyjxiU8slRlslVVukCLB4qfyBRdXyFcvpBUAK+QB2g93r0luJfqqBRpso6BV8z5DHqf5D7eiBZmu nr5sjWTV1RXT5jIPLJW1ZJqa8STGR6yYXKrJU+liL2UGw+ntkZNfn0JI1EaIqrQKoFPTHl9nTRLi q55IaeOlmeZ5BTRIgdyzvbRpK+hVIbk/T3cZNOtK6gsSccelhuHbNTh6CkycEsVQKOKCkroqdAwp pFVbVCyBmE1M9QGUn+p9+ZAM16bhuBI5QihPCvn8un7ZuQE9WaS4WOtg+5hAIsJ1IWeAf0I+oH9P ZDvkNbZZwO5D/I/7PUxez26fT8xS7PK5EV5Hj01xgsP2rqH20HQtQUCj+mm17fn2DHmJ+3rLO12x FHAaekNu3H4yl2/T7fa2q0lfLWSxiaogjp5kaoq4I1Kl67JV1YsCKLBmnb8KfZvts08l7JejhhQo wDUYUn+FVUsT/RHr1GfPm07NY8q2vKr0rRp2lZQ8iLGwLyoopWa4mlWFFFAWmbNFPReqqlqKKomp aqJ4KiBzHLFINLow/BH+I5B+hHsbRyJKiyRsChGCOsTr2yutuu7ixvYGju4mKsrChBH+qo8iMjHT 1tXJQYjPUGQqWKQU7ys7hGkK3hkVDoUMX/cI4tz7S7jA9zZzQoKuwHy8x0IuR94tth5o2vdbx9Nt EzEmhanYwBoASe6mKdC6k2fyfkbCY6DDUtVLNUvW5VAKmeWZzJJPHQRa1iMjszXkuGvfi/IYK2Vv QXc5lkUAaU4ADFCx404Y4dT9Hcc1b14r8t7RFt1jO7yGa5H6js51M6wLUKWJZqvUNWtBXOLb+FWD PZqorZ3yeRpPsI0rZ0RSv3FKs0jRRDUsJFgq25CCw4Jva9uy9naJEgjgbV2j5GgqfP1+3pjlTlxb bmnmS63G6a83a38BRM4AI8SIOxVRUJ5KtMhRQYJrK3dueHA0pgp2V8rUxuIY1KE0moELVSqdVtJ5 QEHUR/S/tvbNve9kDuKWynPz+Q/y+nS7n7nW25WsmtrRw2+zIdCgj9KvCVhnhxQEdxHpU9IDY1Tg MYchnM7PA8sWmnoaR0FTUySyfuzzxwEMwYLpUSGyjUwJHs63eO9uBDaWaHScsa0AAwAT/OnyHUUe 2d5ytsrbrzNzPdRtOlEhiK+JIzN3O6pQmtNKhzQDU4LDqL/fGroUykG36YUePqshNVwyTxrJNRLU xovhhAP2sAZ4yyizW+g+ly5+64pmt3vZNc6oFIGA1PM+Z454dIx7g3+2Rb3bcqWgt9pnu3lVnUM0 IkUDQlP00qVJUUanBeFS0U0eElElbnMvXVNRNeVqbHU7yVTSyAljU1uQWKEOrn1aRID+G9qpGu10 xWdsioMVY0FB6KtT+2n2dB+zh5anE248y7/czXkncY4ELSFmyTJNOFSoPxaRID5N0yVJpWmb7JKh IPoi1Mkcsx/xYxRQoL/0ANv6n2rj8QIPFKl/kCB/MnoOXhsmuG/d0Uq23kJGVnP26VUZ9AD9p6j+ 79JOpVE+irp2+7koP3FBrIvKXpg3pM1oCJiqA+rRdtN7Anj23KKxuPDD4+E0z8s4/bjpdtsnh39q /wBe9r3geMuqsYOC/Z30AOdNWpWgJwVnt7J4qkq0G4avJVFLOqmkr8fmK1J8S8PkDLLSwlZX1sVs wAAAuuq5sVXtvcyxk2McayDirItHrTgTj1/y06kPlTeNjsL6JebL+7lsJQDFNBdzB7YpqBDRIQxq dNGAFANSBgTpE2ux+D/vh4c3OtZh12Kss1XmJ9TgS5p/A5q5PHItQNYEbAiT8Ak+yCGe8/deq0TT dfWUCoMYTOBUU9Rw6mbc9q5a/wBcAQcx3IuOXxywGaW7erd142hvFbSwfICMCHpgEmvQNbhxuIpq l5tu1tXksWfV5pqGpgFNqZVWNqiWKJZxrbSG0pzxY/UimxnuZIwt9Esdx6Bga/OgJp9lT1jzzZs+ wWd3JPyluM95svHW8MiCOpACl2VQ4qaBtKZxQ8SxyzrIsKpCkRjjKySK0rvUOzs7TS+R2UP6rAKF FgOCbkq1ShYlianAxj5Cn+WvQamu1kS3RIFQolGYFi0hJJLNqYiuaUUKKAVBNSVxtmqk+1UwbIn3 RPTu6Csqfvq+igDEP4Folp5aKIhCDc+ok3/w9lF/GviEPuwt0YfCNKsfnqqGP+DqSuTb2YWSNa+2 8u9XUTEeLJ400KAmugQiNoVNCDU91Tq4UHUXeWVr8hU0NFUbfXbv2sRaPGwwGHzSVL6fufEIICS6 xBF4NtJseT7d2u3hgSaZL3x9R+MmtAPKtT61PSH3C3vdN1u9s2275WXafBjJW3VNGtpDTxNOhOIU KuDShockdf/U0BHlZiLm9vpf9It/QfT/AIr731QL1jJub+9dX4dde/de65KrOQqqWJ4AAueePfut EgcT10QVJB+oNj+eR/re/dbBrnqRGhdFFwihvUxNvr+B/U2976bY0Jx1gc3dv6AkD/WHA96PVxwH UmIAJ9SL2N+CDp5YH+lr+9+nTbceHTlioIqnI08U4kanvrqNB0uUjUyGzc6blbX/AB702FJ68Pn1 1kUjjq2EKNHExDRLr8paMsTG5k/tk396U1Br1pqeXUGs8wqb1CMkoWMsroUNhaxIP4I/PvwoOHDp xQSKHj1jq42ik8UiaJEvqswZWBsVK2/w/wAbe/A1yDjryileo6KWdFH1ZlUf65IA9762eB6cjqd1 VTpJlYi9ifqSbseGIHPJ/r7r5VPp1SmadR46czyw08di8sywqbWHqIAJP9bHn/W97JpUnrYOenSt xskZUxxMYgrcqwcpoLfq+hRLLc+21f1OetkdNTL41hY3/dTUDYFfqV/B5Nxb/D3epJI68V66I/PF rfqA4Y3/AMPrz/sfeq9aoes0dRLGNIbWn18Uv7iXH5Unlb2txY+6kA/b1upp1z100v61MDk88loz +fSwGqNh9OQR71Qjga9b7fMUPXnpZQuqMrLHYkMttQ50i+k2J/H9fftQxXB62V9BXqOpeKRXR3hk HCuhdGB+jWdCGuAfduI4VHVeHn06w5mVSRVxpUgqU8wtHUAcANqUBJSoHGoX/wAfdSgPDB6uH/i6 mtOtTGIqWSV76Wmj0oksiOjDQInYyyEMb+gsLe6UK1qOt4Iweo0a2hV2Ro9bOFszPGZF4JKmzRSJ YFrcW49+OfPrw/l1gYTA6QNd1bVpAYgXNhYkXvwQePfhTrXTxj6wxegsIUbxJJTyw6qWZXYqI5oX Uq8YYWva4P591IzXqwNOPQl4TdEdNHSY/J04pxSRvS4/J0EgWqpaSUsPsJJJSYcpjiGIFPUXZFsE YWHvwJB49I57IOWeI0Y5IPwk+vqp+Yx1Hr8e9FBWZGCohyOPIpY3qaeNzUUEECsWeugkLTw3lkJu oKi/t4ODU+fSajBljkQrJ8+B+w+fSEm3HRwmpWggqqqaS6mVnKQlQGAZgoMsiaje3pB/PvwU+ZpX p8QsaayAOt2z/hP72fnN9/ByLr7cKV8eN2p2dvDDYzIUImhXH09S9LuvDytNI+lNGVq6uIxxLYw6 LNq1D2ZwMpgCHy6bd0il0D5dbBqxwZNqCrqVqjl4qKnxk066QtRMtWjAT6m1LItgQWsCOL+0hpU0 6NoMhegl3J1/lavcuMaqmiX7femHzkMkNpqiCnxmXp6ryub+OPVNGyqoPJB4+vvfS1tNCDx6uszO WhempKmEBpZKCB41AAadJYk1Sq4BVGSxIv8AU/T2ncHUcY6Rlskk9BtmKgVO4KJkR2go6R41e2oe TylDq5Ks147BjwALj6+/BK8emCa9NlHTZmffeEqaaKOqxin7KbUEFRFJK4cPG5eNo6CnC3ZfWSba fbmB1UL5AdCJ2lvP+GSfwpI6aQ5KA0lPTzzGJpMgkYKteNWV0RELabXOn6/X2mmYCvp08iknhnqi P5B7uky1Tuihqa2SrmrZJ4oKampmSKoFPUhWlDw6kjRpj6SxBJXj2ps1DsrNw9ehNtMIzXH29JXp HrnPU2ITdElMnhp2jXEUImGqifUTUS1GtiVFQLWvwSPavcbm3gECa1BNfMenR1aWIeaVmQ0x5ceh i3Z2NTfw+tXP416Wux48C1FLNCxVHGhpLINRCqbn/Y+y7xaRSvH3DQT+wE9COCyTRUjND0T7ePyW wO2DTYeGtWsieqCmWGeNauMOSqvIhYyID9RcD2DLbdZJghdHz50PSzbbdQ4DCn246CnfPeE+A2vm ci2UqKOnytW7xCulVVaORV9cckgVWFvwD7e3C7CW1IzVj6Z6Eg2H6iZL5mooAGccOiQUnau3snXZ nKS7uqJIIoEaWX7hfto5HlUBElB8esyGwF7n2o2ia4exuC8cmkgfhNOP2dDeyKxW2hbdmQDJAqB9 p4dGz6/35WTY0zY/PTUUc+LSKOpriaaV/SoH25mCmQ/0039r/EVV720j+lj/AA9Em6TRZ/R4/Lo2 nVm7M0aSohmknykMR8Bycqs5nuQfLI5HDnVaxP49rYxrjRlFVPAjz6Lp7WxayilE0YlZalajUDnB Fag9Ckuaw+KrBIssLTSgNO7vGIEa+sB3LaUfUOAfdm1qK6TnoBz2jPMylD4fEHh0A/YeTymWz9Tl 3b0GIQ0qs9vKiqSfEfo3H0Iv7KbmfSaV6YawGe3HRM+5e0sJtba+SrchX09RKTLGPLJEJhKEPoKN 6jpt/T3a2BNCASadEm42YQE6SPy6piodz5Ptj5I9e0dHEPsJs9jEaUxKiyv975o6YEroVZDGFv8A S5+ns3SKRoyxB/PH7OgXcJGkhqQD0Y7vqr3Fs3uHPYvKY5Y1yW1pqmvSq9IpZfXHSKkjJEJWIAuA CxB+vNvadgxalSKdaVwFcZr5dVxVO6pMdjcrUhMe1b/FJy0csUaKGiFg0R5mOm4IQn8X/HvRUk0B z0kY5PQVT7hl+w3FNMjzT5GPUC2qXyhl0iKO6AJoJ1XIA45v7ssEhPDHVdQHE46Mb8at0If4Rgmn jZITC7q7sKmSoWRGVdFyrekf4ah728MgWuOnEFSPTq5ld8JJjsXysMtPZYTI4Zo6WGIAxhS3jgVT c8gfX2hKnX2irdCC0tQ2kac+vQ+9eZuljkpMtUzxzxOQytHIrxk3JHKkpyCPa+3R9QJQ/sPQ1tbK MqoU5oOhlyu5aaonirVaIJApYIsiE+sAcgHgG3szRTQdp/Z0cxW30w1EEBvUUrT7em/CZl8lWVEt PrJ0Oqxx6me5X0gKv5v9B78xGlh50PSuJovFiRpFALAZI8yOkdtvd2Rp931cVW0YoYJjDUVUrqFp 5QG1RyuxtHKCD6SQb+6LqSydZAQaeeOhBfWVpV4rOWOSQeSEMf2CvQL/ACy+VfXnU2Cko8Tn5c12 hlZKKn2zt6hqIqtlnndwk08MRklSNja9xYAew014LawnZVLSNIQAATU46KNssvH3UQXCFIwuS2AP lnz659a91bpye24I900kGN3dU4mkqsyEmRVMcxjaNIluCZVZhqA5Av7bhlmokk0ZUgdx8h9p4Dp/ mDbBbXca20ZaA8WAqB9pGOhm2tvBqeqFXW+WpUkNqGpwq/6/0+vtZHMr/CwP2GvRC0OnDED7elpm N3bnzVfQ04mMO2nkSanTURqiH6RxweQfayGVA6Auo9cjpia1gZamRSSPUdHC23u6CLCY1vN6qB6b 9nUokljGhSkaDl2vzYXNvZpNNGiKRKmT6j06KWsYmJKmvR6OutyUccP3lRWyMldSII4FfV47qBol UX0k/m/ugl1AaCOPRTcWCgmqGnSX7l63qM/iE7LxjrNJT1kdFNR0ptUEKPRWQQReqWbk6iBxpF/Z msoDC3oeFeg4ttQkkUFeljh91VGS2fBRZIp/EaKBRWVTFPBFF9vS+HxWKsWNNCPIy3COGDc+y6SE rKzUIU9XmWkZA6dcfkPsdGWq6hpKfKx08QdJFlRKRpFWnRI7CRUlC3BAK/4+0xySB0Qycc9DtRPB XU38PCxDVC8sTQElNJs0cjIpbQCPrc+01wG0BSOrQsNQ+3rWO/m74et3h849jYvLJNR4DafQuBpc XVeENDU1uS3Jm6uuKO0N1DNj6dWBkYWIIX+qFGVFKg+f+To4pqKmuAOkn8b+vMjLBhaF6c1JElTh zR0yMaWpmSeSOKtmXVYNCyD13DEcWt7NbdK9/SKfSDls9X57LxtL190rj8XTVlLkM9UIuJmo4qZI JJMnl5FipqeFrazFSyhjrKsdCk8C5CjpFSpoOu9x7Wgm2ONtVGmqp6eOB6SULEtYtRjZBOJyi3eS anmJIkcAmwIb2zIVKnGerBWrTrW4/wCFCXaT7Z6P+NuzMvianKY/dPYe8tx5yhXFVOTjmwO2MNjM LQ5nP0Pjnkp4Er83VxL9VdhqUFgCEkAOpsUoMft6S7kGaKONJArV9aE09OtWGjyWz8sUXY/YFRtT JxGrmpcfT1dPlMIafmR4K7bWZiikDEHT6bMi8W49rmjr5g0/I9EDJNGP17bWnqQQfyYdOdHtzsKk Spmo907DY5GKCrpKep29Uu88qeKpDw08mRFLRVDOASoBj0k6eDb3pE+Zzn5fZ1TxLY0DQyEj+l/s Z6dtvtu7B7gxWRqztzP1O4Kgz4DC4PbsmKMW46qkp9NVNWmuq5aPA4ynp2nrZDayxlU/UPbgoGAp XP8APrTeC6EIGXSMktXFfSgz6dRO3M1itkbM3Rt6izM+4N9byqqSh3NmnAV1SpR6yopUi1suMpYc UVFPSggokuphqYn3d+1ZDWpYgdbsojPcQsUpBGKgfZ/hOqlT8qdEeWMGugpJZoYVgLXWSnWeNlA1 Lezgkqlh+D7ZHmehA5opPn07Q4iUzQsamnlopKqCB5YpamD9p5gJB4JDrJPksfUBb34kAE+g6Thq MKDI9c9NmQxzQ4morfFCsf39Rj4pI4ViDSwTWeBGQgtoiUE3uD70rhmFOBH+SvSlWPaDw49RcBXS Ubx1Mb2lo50nhFmu2qyOgsD6XU8396njSZHicdjCh6XWF9c7XfWm42b6bqCVXU/NTUV9RjI9OjKU mV+7pUnptR82l4pCAPGhUExaCPUQTbnm3uObmza2neGXgv8AP0PWdPLXNsXMmxWu62P9pJx/4Ww+ OOnnQ8CeK0Pn0012Nqq/LUeQfSYIYEaoJKnW9E8kmOjjjK+lFnq5ZnN7l447/Qe3YZ44baWEfGTj /bfEa/YoUfInpJumzXm679t+6yAG2jjBkOMmEk26qtMAPLJK5rl0irwHQIdheGXOGrpdUkLxClmq Ap8UlfSG1TGkv6ZWgiliDkfRuPqD7Fuya1s/DkwwNQPMK3A08qkGn7esa/dgW8/Mpv7IFrdk8N5A Oxp4v7RQ3BiitGGI4Ht4g9IUEgggkEG4I4II+hB/BHs56jAEggg0I6NZgaqLLYagyIYPLPTRNMi/ 2ZguicE/i0yMB9Pp7ji9ia2up4CKKGNPs8v5U6zn5Xv4d95e2rdlcNNLChcDyelHr/twwH2dJ2oy VNg6/d+QqyBHC+HEcasoeeZ8YpjgjDkanf8A3gAn8e1yW73kO2Qx8SHz6DXknoI3O82fLO68/wC6 37ARRtaaVBFXc240otSKk/yAJ4A9ABkK6fJVtVX1LFpqqZ5nuWYLqPojUsSRHEgCqPwoA9jSCFII o4Yx2KKf7P2nifn1iruu53O8ble7pePW4nkLHJNK8FFfwqKKo8lAHl1D9u9F/TlHicnMsDrRVGmq iq5aVpEaMVMVBTNVVT05k0+ZYIEudNx9B9SB7Ya5t1LgyrVSAfOhY0FacKn16OIth3q4W1ddul0T JK0ZYFRIsEZkkKaqagiCp01HADJA6k4jEjMSwUdPLprZ5qgyNMUho6KhpYY55q2eZiTKBH5CUXSV Ed/VqADdzcm1V5XX9IAUplmYmgUDyzTOa18qV6WbDsS7/Na7faz03GWR9RchIoYY0V3mdzUtRfEJ VaFRGD3lwoVuE2pHmDlsnjR91idvm0Mb6oajPNCVmqY5SrpLSrW0gfTb9GpV5IZiWXe5G1+mt7jt uZ+J4iOuAR5HS1K+tCfQdDvlvkaLfzv287OPH2LasIpqkl6Uo0isQQ0YmiD6afBqRMkOxEmg2Xtr cWFqqeKaiKvkKuvw1ZjpIXq6GjrUinSkqo45CGFJUSPE0bECyC1jz7IZt2v7G7jdleoQK6sDpZlq NQPzABr8z1MO1+3XJ/NvLt9awT22hrqWe0lgKGWGKYK4ilVWNfCkZ4zGSBRBQq2egQ3JtfKbXrft MjGCkl2pauK5pqpAF1NExAZWTVZlYBlP+BBIusNwt9xi8SBsjip4j7f8h6xt5w5L3rkrcfod2hBi fMcq5jlApUqTkEVoysAwPqCCYuHno6aZp6hYGmp2SpgjrI2noayONZRVY6piWORlNZGwEcgFkZbG 2rWjl0ksihEJCNglTRlJpRgaj4TxHmPsoUXL9zt1pcNdXaRm4hIkRZVLwyqobxLeRQrEGZSAkgHY woaag8axx2OpK2WPdmRoqj+5uPr48f8Aw+Wtkq6mkpn1MnjJjjebG0tdVLqUHUQ5A1WNyueeWJW2 2CVf3q6atQUAE/PjRioNDwxXGOpB2jaLDcpouet226X/AFvbS6WDwGmaWSKM1I09qlreOeRdSg6q MVGqjEjNvPIYiLak0EkMVRTZWnSlw9FSeO9XUTgPRPSiNWULDJpkDAECw/qAQrtUFy25K6sVkjar sa4A+IGvqKjrIf3E3bYIORri3mgSazvohHaQxU/VdwGhaPSCAEbTICAQKDBJAJVfVC7RutirlZEI AYMhZSL/AFBBJ49yNhwCD5Y6wdBe3keKRKENRgeIIqCPUEZ/y9CVsLfdJtaKtpa+lq6inqpop0al MLNE6o0cl4pZIVbWun+0LafZBvOzS7i0UkMiq6gjNc+mQD8/Lz6mH2w9zrDkmDcLHdLK4ltJpFcG LSSpAKt2syg6hp/EPh6gb93JjtwZmgyuIaoQwUMUD+eFYpEmgqqieNgA8iNYTDm5+nt/ZrCeytZr a50mrk4NRQgD5enRV7o837RzVzBte+bC0qtFbKh1oFYOkjup4sD8fGp4df/V+f8A+/de6mUtBV1r Wp4WcAgM59MSX/1UjWQf7f37qjyInxHqXUUMFHanaT7uvfQBHDcQws/4Z7Xmcf0Fh791RXZ8gUj9 esFmpVqBwJFKpqAIs9/WB+LJ9PfuI698TJ6dN/v3T3UspIkUbtE6xSAMkjKwVihKkoxGlhz72CPX I6bI6ifn/ivvXTnTgqt+k/UgDVbgggEn/AlffjjPTXHpywxiWseWcCy08jIhZU1F9KIFLHSxN+b/ AI96eumg62MHrHC6fxOCW6rHBKJP3fUhFMS+gL/aXj0j37ITrXn11n6n7zISVGosJIafSxFiy+NS pI/BI91UUoOnRlQeoORbXPExfWTSUhJ/oTTxsV/2F/8AX9+TgftPXvTqNT6TPFrvp1gmxIPHIsRy OfdjwNOPWjgZ4dTPTqTU1iFbRYgAuFNnLWta4/1+Pfs0NOqdPW32iTJ441sgjgjaVo30AItTLCyQ LKx4QGS1ieAfbb8Gpx62vH5dK3OJFSYwjx/u1okp6eQeq4MdndpEOgWjTn/H20v2fPp0n59I+DFR zUdFPLKf3LrHGCigoJGV9Wr6OGU/X6/7D24WILU6oBUDpvyNOItfjjZVjkSMixskgB1KfpZifwfz 9PfkOcnrZFOmkm3HJ/1xza3HP19u061SvXtZ/wAP9j79pHXqdcoi+uysVuG+l7cKT9Pz9PempTh1 vqaksTXWeNyb3EsRAsLH0tEbA/4kEEe2yPQ461X1HXbwa9ckAWSJSOENmS49N0YiU83v6SP8ffq0 48evUrw6hMrqQwvYfQjixubEWtp5HHu4IP29e6dKKteWeniqXjMeshpprCSOOxZw0hIEgIB4a5J4 v7qyDJHHrxYgHFT04LFTzgeCaCRpkEqRpITPEAw1QtGVD+SEAkWJuB7bIZeIx1ZSGwAa9eZijrHI skh1MfUNC8LqjsDZr/Qn/H3ry62epkMrMpD6ZkAvdU9a6mICSKx9QUe9dbr07UORq6KRZ6CrcOg/ RqGpQWN0DsXDQEE3jcFD9Le9fMdaZUkUxuoK+n+rh9o6dI6nFViVApqOlx9XI5kqo0jK005ADO4p Rcw3tdlRvH/RR7tqr8XSVrZ1zG5ZR5E9w+w+f55623v+Ez2bO4dp92bCkyTSR4rs/YmYpIVjJoqa DO7d3NHUXhPqZKqqwqnn6Ffxf2YWh7WFMV6SSKPEjLLmvW1PFFUY7eOaxzUcdHNGaaoSJykyViPI DTVsCgFEWXSCQTcWt7rItCwr0dQEdvSyyGyoKmeizdTFWypVV9MYFKqFjqaeTXORGLeXVqB54DN7 Z0lBUHh0tOkivRmcxlY6Ogo4pFmREx6Wp5nMTwNAhZKeVwLpKXsdP9D70XrgDPSGVSpAPSbgzdSa jGh0WP7y5tpbS/kkHgSJj+qRDqLBuNI936Z6EbHJkxXUWYokRqaH7tI7yxxwVdUsehTIVswZXuFX 6XPujngOrJg18uir/IXsevxe8cdG0s9FksOn8Xrschk0Cnr4RS4oqJYxG0MkmpmKFiByfaGZxlSe l8K8WI6qkqt2ZbKb/wB3xZynpf4BQ1tVNT0tDFGsK11RHdJpZYwfIxeQ8/jm3J9mYAa3j0HNB0Ot pht2EZdhqoOor71ze39vS0f8SOLaWR3gQSlRNBFZ11WNiqqbj2hvYbWQx+PQHOmvr59SJt9haSIe 7hTqs35G/LvI4VazDY3O0tTkqzz03ipdc1Q5CsgQLErEO5Fh/ifaGUXar4VktQcYFcHo5XbLOOkr 00r3HhwXP+ToBejeo+/e693U8G3dt19fm9xJQ/ZxZFHVIIGjBM0rTOAPGpubn2POX+W9uSxaXcnC rTz9OgrufNW2yXi/RWBJr5Do3vyL6Z+PHw9wlJuPv3tbL9gd7hiZuhWrok2rQYWaFDj8j9zTytUr Vyyh1dBcAL9PZVf8ye3vK7SbdcWqyzsPEVq1J1EigWmAKcehly/+8t/uoDJavHt1ADUYqOPHqnnK /LDr6ozNTuLbPXtLjqCOsqHG3kHlwMLFXWn++aqVZZljchlsresD2DH5vW7uFlsrVk2/zHAU8q9T tbbRYW1uLNXH07r3f6vt6DjenzG35CuKzFVkqCnpxVItLiaGRrQRarIoQW0gC309h7eLu5vSJBTS Tw6INx2TZO4ax/Lo8nTf8x/BUm2RhdwV1TQV8EEc9lqJUFZIvq121fQge9WnMc1rGLNlI8MUHQau uTdoeJbuBl8RxXy6Mpsn5y4nc8LhUplSWQSmWrmUxvELgOQxIJv7N7Lf5LhmWZaJTFT0Fhy5NNLL EFqirUdCzlO4Mn2RhpKihytCoxUbrSpjiWkIVDYehQbC349rXs2vwXU4+Weg3ue2tZsVYZ6Kzufo HN75xNbu/e2Rlo4IY2amxjkIsgkBYyLG59bqLG1ufZzZQG20NJ8Xp1He8XIZSoPRX+qNn43HfIja yQoRRbcyNHksjLGFCR01NOkCTyA8KQ8wJA/A/wAPZrLKXK57adRhey0mY08+h0+Xu3a/dm6c7u2a CopqVEfGNWVU3qgo6cmOEupJIDRLqT83PsqlChzTietxSiStB1T/AL6o8Jhnlx1EZfBVxSVFPWVR /eqZ1LF50J1Kp1rYqfVxb2wV9OrstM9ADPWV743JCOXX44nEjwRh5NDsQivdSAWYXJH093iNGGti AOm2TWpXpc9L5Gtx+Sp8zDI1JVQw6VkYM15lOnU3JtrFre1qtHJVQ1T0/CpqB5dWY9d9nVWQyFLT Zu/3UEbedHYrDVgxfr0H0kSAAW9l1xFLanxkUg9DTakLac9G72p2hhKZqenrK6HAYSA+asaqljQg X1yLEpYkD8ce0zblcr3aiB59SPtthE2kxGsp/bXps7K+V+2s94Nm9WI5rI5D95mppP26mKH6+Fgf ol+fp71BvrSGaIE6hShP8+hracsXm4Rt48Z0Jw/PpE0Hy7j69R2yOYQV8Lw6gsxLu8TqZCNJOq1v Zfc8wx2zGSRx2Z/ZnpifkOYntiOs8BTz8qfn1h7B+SmPTpreW/6HN09q+SprihmEMjVUmoqQgKuW u/1tf2ti32PerWWaKQGvQtteRouT9kud+3BNF0VNKih6rV+GlZSdn9zbi7G7GyRzOQQT1OBpqqQy imjR2+20ySlmULb8fT2UFJ7MMhVqadfE/EfP8wB1H3LLTb7Y3u5SZAvJFH2LSn+Hq3WrNRNWUeep 6qICeUx1Sh1PhgXiMXBv9QB7e22a4u43hu2paue4n5ZA6EUxIt5LYeY4dGG23vbF00NJRSOjXCiV wwtyObn6e025SrZCllxp5dAXc7VjXGehYnzlHSrQVFLVfdxGNHhplbWsSm/oAH0APtm0kaTwpZPj YVP29B/6RR5dLOv7llxeFVYcSq1J0x0TlSGFRZVuvH10ez4ReOigDIz0qs7Wkj6f4ejR9S7/AMvH jcTkc3kPBFUlTKgLem4FgwJ/F/a2Ob6cAEZ6T3VsRUeXVju0s7RZHZlHisbXLVrNItXPUAs3ijcl tUbk+mzD1f4exE0rCXURxA6BEsLCo1E5PUObHR0NBV1uIaOd6o1UEBlj1UtDVyQvCPuFX1yU0s7A sAOQT7pcOZQa8R0glXQpHl0pxt+asw+26WoME5xcGMpKqaORS9RIhZ66ZEFmjpg8mmJTyVHP09oS KEdEVxTUfXoVcLoG4K+EzU6BKY0cFPTgpGNMa6T/AKqe6j/Ye258x18uk8Z0v1VV/MC6Zpd9dz7C 3XVNUUVLh9u4rH5SqEYkx70ZydQRFUTn108+tgLfkMAPr7LhEKmi9HcWkoBq6U3xz6bwlDNW5eWR /wCG4jI1S0NUsEyU+Sk1ByqPEo8jU9O1vrpZjxz7N4k0IAK9F8sVGNDjo3GNosVXb2x1S0DGjwcc mXgSYkxwV8ySUmOL2IGqmpCwVCOGkuefepHyR59biiqKDpV/wmorsrWUkIkUS0GTqZfGw8muWIiB IASA8wJ+n9PaWZwFFDU9OCJq0Ix1qQf8KI9/x4fv7467JOKyU4pOkJZQ9HkaCmqKOszm9s1S2NDX IIqv7lcZGzxq4sPwQR71bh2DMcZ6It5iJeJSwoAT59aw+XyWzMpPLQbrxv8ABq6nVqesXcm3qylo /vY6l4dcGZxcVZFF5IGD62EaC1ifr7VVdeK1+z/Zp0XxpcKNUL1H9FhWn2HrPjsJTxUiHA7xy8NB SmeMS4TcMWdxoSMgIipVU9VUUYEU6qdJ0qOQPew65zT7cdVaQk/qQLqPqKH+VOl1sHKbj23R7vSh ymVy28Kp6LZ20489WLk6XbdHVJHV5PdTqYITFTtR1USUsX1nkBFtIa1o85WlK46amEUnhakCxnLa RQmnBftx+Q6L/wBsV1NDuSl23jJ5J6HbFO331bM/3FVmNx5LRV53MZOc/uVWSnSNFYk2jACJZQB7 9I2QPToy29CY2nYULnHoFHAD5VqegVV1mqZqpWkMAlkJDpIdCSKQHdjqAsTYC9/daED59L200AIH UoPVYyPGVJjZnPhrtFVGxWQ0tVHKgUsRaB9IBPIYe9+Zrw6ppQk0/wCK6cK/K5DJ0tYiQ0cNHUZe qyoSES3hmnL+WmiYHQYgTc+kG4/p7r2j8NOtrGoUAvU0p/s9JXHzeCpTyEiK+mZLka0vylx9Pdzk cOnWA/b0NW0szS0b1lPWVLqkNOksak6o0jh802qFQjO0pEliFuWFuOPZBvNi11EksK1mU0+0HH8u P2V6lj2m5zt+W9zuNu3WXTtNypbVn9OZBVTgE0cAoQASW0enThn6/cEtThcfS42vpYMpLO321NWU 8OUqqeF4ZpoamSRUhxt6JZGAjnL3YamQrpYnsobJY7ueSdGeMDJUlATUAgDLd1OK0xgGtRMfNW6c 1T3vLm1We0XUFveyOfDjljS5lRCjOkjMAlv+iHICTF6spdoyuh0xv4tJQU2JjwUWOmx8X8YMcVVT yGixxcUkyNDTp4k81XUISVdgShPP19mGzUWaS5a8Lq50VII1N8Qyc4APEDj0C/dMtLtdnsMXLKWl zaJ9XpWSNvBgqImBSNdI1yyLUq7AlGOcHoHPYo6x76Wuyt2Da1VWyTxT1FJWUojaCBkB+5ikV4JT 5CFsiF1P59Xsp3bbTuMcIRgsiNWp9CMjH5fs6kf2456Xki+3KW5gklsbiDSUQiviKwKN3GmAXB8+ 7pjzmbqs9karIVAWH7mRHFNEzeGMRRLBFwx9cixIAWsCTf6Dj2ss7SOzgjhQ10jieJqan8q+XQZ5 m5kveZ92vd1ulEfjOD4ak6F0qEXjxYKAC1ATnABp13t/CVO4ctSYum9LVD/uzaSy09OtjNO4FrhF +guLkgfn3q9u47K2kuJOCjA9T5DrfKnLl3zXvtjslmdLSt3PSojQfE5+QHAVFSQPPoxkO0Np7Pxr V8tAlfUwJGPPWRirqqqqYqsEFJTvqgiqKipIWMIoILC7fU+wM257lulwIVmKRtXC4AHmSeJAGTX9 nWXdtyDyJyBtD7nPta3V3Eq98qiWSSUkBEiRqorvJRYwig1IBY5PSEzVDlc+9fXQ+aetw6VFVlai lqpo6Wgo/E8Mu1cM8OuKprPtWkNVJos0i6b2NicWk1tZiGJqCKUgICBVmrUTPXIWtNArwz1GPMe3 b7zRJum5QeJJuO3rJJcyRyuscEWko+2WhSqSS+GZDcvpo0i6K0NGD3AU9VmMpT4LFyR033kuVjiq JtV1pqukRagSaTc/5JR2sBc6j/sDu9eO1t3vLhS2gISB6qcU/Nuom5VtL7f96tOWNlmSH6h7lVd6 1EcsQEgahz+lFSgydTDzwMe2sPKtVn9pUXno8ZR5XVmK23jqayhfH0MVHQUzixieuMU0k8igFY2G k3cEBbcLpTHZblNR7h4+xfJW1MWY+umqhR68eHWQnJvL8yXnNPIm2+Jb7Nb31bub4ZJYTBCsUEbD 4TNpleaQAFUICEGQECBV7T2zVBfJhqKOVABHNRx/Y1SWFl01NEYKgaR/tXsli3LcI60unKniGOof sao/l1Kl/wAi8m3wTxeXrZZlFFeJfBkFOFJIdDin+m6Se4tn4pca61+ez0VDqRY6SeuOV1znUIEp KetiqZzVMxAVYmDH6C1z7MrHdLk3AMNlCZvNgujHnqKkCn2inQF5t5A2JNndN05o3RNtqAsTzfU1 fIQRJMsjmQnCiNgx4CgJPRY5VRZZViZnjWR1jd1CO6BiEZkV5FRmXkgMwB/J+vuQFJKqWFGp/q9O sMJ1jSeZIXLQhyFJABIBwSAWAJHEBiAcVPHoUdgZaimx+f2xlZFioa3GVdbE8jEiKWmgZ6togoL6 xTRrLYA/5liOTb2Ht6tpUnstwtlJmSQKQPME4r+Zp/th1NvtXvu23G1c08l75MqbZcWcsqliaK0a EylQM18NVl0gH+xZhk064bWzVNGa7J5FX8mAws7bXpKnS1DFXTLJUVCwu0anzSTgvCh1MsOoAnxg je42kh8G3gIpNKPFYfEVFAK54Uwx/ipX4um+SeYrKI7lvW7o3ibVtznbopKGFZnDSOEYqO9nq0Kn UVi1KpPhKQndn7fbc+RyMDlmeHE5CsRjzrrWQQ0ockg81E4b/HT7Xbpejb4IHHAyKv8AteJ/kKfn 0EeQOVX5z3bd7aQlpI7GeUH1mI0R1/5uOG/2vSk6zxuNyOaqaXJY6lrI2xskgjqoVk8M0E8CMVRh 6WKyc/T2g364uILWOSCdlbxAKg0qCD/m6GPs7s+z7vzFeWe7bRBcRGzZtMiBtDo6AkA8DRs9Ze09 t4jBS4ebE0a0YrhXipSN5WjZ6c0ZiKpJI6xcTtwoUf4e68u39zeLdLcylimmlaVzqrwGeHn07728 obDyzNsFxse3rbrc+P4gUsVJTwitFZiFw7YWg+XX/9bQop8bQ0lzWEVEuhiFJCRKwF+Vvdgv+P1/ p7rU9JXkdh24HXdTm5W8kFIoRANEboAqqoTkqgAVb/63vYHr1URcGc8eodPTvTmOWT1VlUxWCO5Z kRwdVS9vVqsePfurs2qqj4B/qp1iyaxwBKSOzeO7SOSCzMxudX9Gv72M9biqxLnpmHJA9+6UdOlV WNMBF6hDDHGiIf0xhVu5C8DVK55/w9+ApU+fTdD256bVBLKBa5YAX+l78X/w9+6ueB6msW1Sjgkm wAb0qwFiQF/PH+tb3seXTf5dTKaINGzOLWkgX0soKR2cu/jJs/6OCeAfdWNKUPr1sef5dRdcgkap 0rKwkL6ZUVla4NiyABTx/sPdqYoOtVqc9cMhUpVVc0yR+OOTRpjsAIwEUFVC8BQQbf4e6hSOJz04 vDqLK/kYN/SOJP8AqXEkf/RPvwx1vrnTg62YC+mNyfpxcaQefp6mHvx60eHSkw8EM1VUeS6xRUYl XSEMhkaWBEjTXf6Ate3Pttz2j1r1UDy+XSjjwTz0KsZIg8ryJ4ZomCSqzKsDB0YEE3t9Dz7pqoa0 6tQ0p1Fq8alFBADVNWJpmiihidjTUTSI8lSUSSx4CG9uR71Uk9WGAOm7HpX09OJqWan8VRpslQof wHWQwjDahZ/o3F+b+9sw4EZ60BWh8uolQYKx4UMc8VTMgnqi91isisSqBzeW7jg/4+9ZUEg9vW8E j164VSUz01mjb7oRU+uQQhUprx6yi6D61Om1zci592BINfKvVSRw+XScddLMpsbG115B/wAR/h7e BqK9b65w/qJ/IRiP9e1h/vfvTcOvdcpGsSPqbm9rFTyf9v8A6/vSiueq064B7EEEg/UEGzLY8WI5 HvdOt06kfdvJ6ZEWVmIHkA0znn6F1/zhN/7QPupQeRp/g63k8c9TMZTpWZCjhUR+uUllqCBGY0WS Rmc/S2lbW/r71kVBPTchojkVrTpYy01Mn20CJDS1DMGqAqQhkaKR3Y3srRJ6kS31FifdDWuek1Tn JI68i09QKkSztVtCUUOlOLhnDPOCwOmRIQUUEm/J96Kjy6dWZ1oCtR1DnxUqWenYtdWKqoZbIoLH UAfIpUm3Btf3o1GSOlCSRvhWz6efUEuyn93yU8xAAksLMQQSDYWYA/W/P+t711frg1SouZ0UuhDq yD9wMwIUr6wWGprW+nv1PTj1utOPDrcD/wCEt+1cvFivkrvaWjrJJZtxbHwlJHAiLTzLjdv7pyck V9Ok1rtkVAdSWQG/09mNsAEenRZc0kkQr1tfbzopqHH4fcirWrXU9JBQ5WS5mlnoGltCo0nyCTHV DBmb66AfdG49GkC1VVJ6Ue0t6TZWp23gapo6ZKPJKZg7eSWceaJx5FOkQpIjKA/Ppt/T3Q1ZDjpW BwOrHQ49niphrqf7dS7Nmko6qmLXgkjrIgkT6x61eO/pbm/9PbYRqg9MygEn59SdpYtMg2UJnnFR B4sZixMIwj18EYjqhT3YtJNAD+5YcE2+ntzpMBU0HQj0mKqMVjViq5p6anxtQrK9MySCWSN9VRIl K50FdJKhif1Hge2nYZ+XSqGGua46q2+ffcNZtdmz6V7Sy5OhbCYHbLQJJT0lHjUJkmykk3+UyVkl wEMT2P0NvaFUWeYKfh6MFh1Dt8uiLbM3BhU6srsllDBFuHcM9Pkq99EmuCJ4y609Msjt9ug1/T1H j/G3s1vJra18MKtFCjzrnoV7ZaLWMktWg8+i2d5dmYnGYqqnapM+ReiakxNMKjxRStKjI1zyImRb c/U+w/utxtM/0DXEcznUaBGK+XnQZ+XUl7JtU04fwCcAVrn7OiK7Rk6M6SqY+w+4o4d27sz04fC7 Zh/3NCGWpk/YEka6AjeWUDV/Z+v49mf9Z7Hlu2jFvZt4kmBrGs5wD5eZ6F8XLV5MjJk1BHH16few f5jOf6rkyGQ2BQ0WyGfGPFBIIE/itHIqhAtNJdGQC/0Hsi3bmreHt3hjKaNP8Of8PQ95W9sOX7a0 O47zbv4q5+Ogx8qdUQ/IT5P7s733dPujem5shuHPSziZ6ur1I2jUdMZUu+pEH059gmwsjeq09/GZ brxCdTZoPIfYPIdJN+512TaXba9sWJLIKDwq2rz7vy6A/NdmnwUlGjK8a+qaER+l2CEAEA8gHn2O rWxS8WLbmhAhfBC44CuD5dADc/cuKz227FvcKSQOIqeI8+g+i3PLlK7y1dPJIImvAoJES25Fk+n1 9uSctQwsPCV+Hm3+x1Hd17kXNwO2Zaf6X/Z6HvZmxchuzbeW3hLnYcKccWpI6OokDVlbS2AX7Cku rO5JNiD7Jdx2uCKJ58LMDmp4/YOpX9vry+36xmuLskwotUoNOPn69OEtJ2Z1dLho9zf3jo8dn6Zq 7EJkYpMbNJixJYVEas0hlRmt/rg+0V9tkiWNnKquHZ/sqKen29H9vvy2UwW6KBJJPDGM+vHq+j+W 7nMNvbaqBJYa7NU2RlirKeRBO/2muykqSSWZOb2BB9i/l1ylnRgNQ9eivn+226xs474E1YfxVGfl 1Z9u/rSp3rR1uI2tgMpms1lK2HE4bHUpaKiFW6amNfVTKIMVTBVLsXN9A9IJ9m8jMzhfLrG3dJV0 sa9A7N/L53L1lvSlr8nmcHmMzXJEchkcYZhR0RkEVQ1G1PUMs9XT4qaRQWICylGN7W90LhVK1z59 Ae5jErFh0Evemw8JuCTdmMy4ye59v7M3hBReGmnfH5XKyxRJDlKvG1MEf2T0T1KEDzJcLddQPq9o G1Fia9ejiYCig06p77T6L2DmNx5mpx1bW7WhmrK16fCQ1cFRjaOFLLClKTLUSUtUCD5Y/I4ub3/H uheRTXq5ikoK8Oi6S9AVFPJNQ4XIPVffya1DyCR/Hpt43Ci1nY6tX9L/AOHu/czAtx6poYGlOkTi Ng7q2DvCkxe4qGeDySBKOaDmglQEyLpkAszc2N+Rb2qhMSHzr0/CKkKOjL7sy9DtnAY7cswqYq2l eT7aKmHNU8MWpi5QANEWUD1ce1V3Oy21QAQOGK9DjZILnUpAGnosNb2hubcGVfJ7jr6uKmK+SnpI nMNIkcvrSKWEEiQqDY+wrdsWoxB1U4eVepB5df6K+Vrg9muv8+uCdnz7TinzEGQIaqiliij06o6Z CBraKPUPG8g/N/x7Jjb7jN4jxECNONBTj1kpLzfyTsuwpcXhP1br2UbFRxqOkFjt6V++K5alZJZ/ tXkdTIpIfWWLGQE+s2P+w9k91DtHfHuIl8UqQAGpkig/n0H+TOY77nG/MlgkRs4nDE6M6QanNfQd TszU5bfox/X0GSqqWhmnd8jA05WmKByQCLWAIHs45csNhsrZULTLcDyLkiv2U/l0p95uYr3mGC12 HbGi8JjQhVzQn1r0Y/qDA7b69RjTZSnxc8EX2dVOtn1Ol9bJyttV/Yjbd7S8DLOFAUacCmB0j2D2 8udg2K3hE6pbuTIQxq2puJrjGMDo1lR2XR4vadTksPuVcjT0UfmrYw/3dXKR+hKemDKzF3sLA8X9 tTrYzWFxZ2ZbW4HA1ODXHRJf7bbWsrTyXIeJeIBz0uev/knsDIbapJ8pkayjzdRP4Gx89E9PPT8h QzqXJGr8H2TJayQxqRmQ+TZ6Bm62huCfo1wfXPR7Ortyw5LHUuXplesoEhR6czAsTAx9Ja/JYkH2 YW9kAfEdT4nnThX5DoLfS3CSNDKP1AaGnSp3TvuHJ5agohSrQ0tNMKhGK2Es+kReO/0Itzb2tE8t sQYgBXGRXo0t7EKHYg8Ohkw/Z9VQ0MNLJSNU06qunQnAFwLgj6f7D23IXnIMgz8sdF93bVJxn06P 90H3njq6nodnaWpKwRxWqZFJRwjahGpJsAb2I+h9iFZHkNTQ0A4dAncLFYQSiUH7eju4DdWMzGU8 xipYaJap8TXw0OqaJCyLHFUUAVtNTItUQsrgWTkf2fbwUhKnj0D7xmAJNK9CwcbHQUr6dNS0FVST qtxMIYqc6jPG40FpYyOCbg/Q+07NmvRKQHqW49PO3I6OqzdfkkcSSUUV6geSypIV16mAC+vT/vft pnLVY8B0yqgN0Wn5aYGLcL7ZiMx8WQqsXJU00iARVEWNyEOWhEEp/akZpaYiVG/A49tqQGHRpEpA B8z0qKTHw7V66xWGgefHNQ0MswVpF0rTVEpqaqjiewaodFf0uRqHA/HtYHoAKdVYUz69BZ19uOau 3TX1tbIKbFVk5QRs3lkjamlVAXUE+IGBAfrc8+9MBJWo6ugK9GQqPu4o4sxRujSJkWWJDNzPQVDB I5jwvitGeY7m30BN/aK4VUUGnToGonrSe/4Uhtu6o+Z2zMPRSUVNRw9CbTENPk8U+TSWor8rmquu qKSqhkSooy0qxg3VwNAItbly0IZDTiSeg9u+lbiISA4XFDTz/n1r0SZzPNT1UFdi1mmgNMstJhsj TZGGpkWMLPO+MqngrJIqpuBGBIUNx/T2tDcQeirRHqBVsepH+UdJjNtsavq4ayoimwWRIjjyGMqY KzATywr+1JJK+inpiUJ45PCj629tjywenUFwFIB1L6/FnoVsbDDgtt/wnb7fw+Ggwkm7d/7qSY1l XQJ9oI6GmoqyVpvucvkKNdNOgOmjhmDcuReykgV/1f6j0kk1SOWfJrpRaUBznHoDx9eimPVrMZJz E7/dPNpgc+WQCYmVw80p1TGGMhS5OpiefbR4nPR4BQKteAp1PpKJTQo6wTqZo5HqDonP7hkKIiRq WB0qvBsBx7t007d1Pl031dA7U0UYr4qqWmgZTF46yKaCBUklIZaiCNAqC35+vvfn1YNnhTPUvFU7 tQVMjqrQQks7RyxFtRYIWCqW02Labngk/X3U9XOD0k6+nNPVuCQQ7O/p50jWQQSvpJH1492U1HTg NV+fSgpXlRUYOfOsaeN9QUa41EsDEkm2pRpPuhINQRjquQwKmjevofKnQ67XrG3HXLlaqjkg/hmP hpKRanQ0yVtTJVCuqVZS2lZaaCFf6n1D2Bt2g/dyG3ibslcsf9KKaR86MW/l1mV7Xb63PM0O8bkq NebbZxwAnLePIZRLKPNfEiSIfM+IowOmvPYOfM7kzEMM0eKpVwNMuXr5GSSargqvuTBDDr1RUtGJ Mb+8WKsNBIHqJN7O7S1sLZ2QySeMdC+SkUqT5lu7tpUZzwp1Xmjlu65i5w5gt7a4SxshtcYupmIZ 5Uk8TQiVqscQa3/VLFWGkso7yxLcQQSD9QSD/rjj2PBkV6w9YFWKniD1khmkgfyRNofxyx6rKfRP E8MgGoEAtHIRf6i9xY8+6siuNLCoqD+w1H8x07b3E1rIZYH0yaWWtAcOpRuIPFWIrxHEEEA9Yvdu mejA7C/gmBw61NOtRl8xWQLWVr4+mmkipINAkSinrZxBjaT7cC8nklQ6ybkgL7BW8/V3l0Y3KxWq nSuogFjw1BRVmr5UBx9p6ys9rzy3yty+t5aJNf8AMFxGJZjBG7LElNSxPM+i3i0DL+JIh1kgkhV6 eGaq3rOtRmqKrxOBxVDBnqahiq9FXkXmarSCarkh0vCkaUMhRUKtZwdXIslAj2lClpKst7I5jLEd q00kgA8a6hUmoxSmOhAz3nuLcpd8xbdPYcsWNsl7HCstJbguZVRpWShRVEMhRUKtRw2vOIkWTnoN mHH4lIqcUW35Mjmclc+HH1ORhOQTGUqkEVGUqWqdIubQBlZrkhS41uk26+PcktrnConmwU6dZ9EF K/0qECmT0gg3m52z27O17CiQi22pp7u4/BBJOnji3iGddzIZNOTSAMjtqJVCD+06iHG5Cetlkijl gx8tVQTNp4rKI02V8MLuCizVFNTvTsPr+9p/texRuSNPAkSglS4DD+i1UqR6AkN/ta+XUAciXVvt G63W4Tyok0Vo0kDmmJYfDudKEigZ442gYcf1tP4uhq2RFlsTVtNm3Ft5h8pDLrdmp8ggmqP4fICN KyzY5jIDwAISn9kXCm7tbXMYS0H+4nYR6rgah8g2PzB8+sjPbaDfdivmuOY5ARzFW5RqkmOdQ0ng N5BntyZAcACJo+KiooyyxUsEtTUOkUUEck00rEBUijUu7sx+gVASfYdVWkdY0BLMQAPmeprmmgsr ae7upFS3iRnZjwCqCSxPoACT0GW5K56HC1+48o6UuWyVGaDb+NlkTyYuCsSONtPC3rv3DPUuOFCr HchAWEFhCJbuGxtwWto21SOB8ZX/AJ9xpUedS3E4hnm/c32zl3dObd5kWHfby38Cxt2YarZJQqmm B+t3Ga4cYUKkVWWMFgpym0ZVXNQ0hpI6LbdVioqqqu8kkk1fRY+CvmZlMkq01LURNMy6fSHa36SA I7fc1JtGlDGWdXIHAAKzFR5CpBoPWgrxr1B2+chTIvMdvYNbrt2zz2yySVZmZ54YEnckam8ON1Mr DT2h30jtKhBVlJUUFVUUVVGYqmlmkgmjJB0yRsVYAjhlNuCOCORx7OYpUmjSWNqxsAQfkeot3Cwu 9qvrvbr2Ix3kEjI6+jKaHPAj0IwRkYPSry+eo8phKZVgipMhAuOxhp4gTE+PoaVyajlCA5qguglt aB5FBKsxJdbWctvdyEuWgOp6njqY8P2Vr5GiniB0Od/5o2/e+W7REtkg3WIW9v4ajtMEMZOvI4+J p0ktrUPKoJV2JE7pihVaDNZIrd5quChViBwtND53Cm1xqaqW/PNh/T2Hua5iZrSCuApb9pp/kPUz /d321E2vmLdyn6kk6Qg+gjTWQPtMor9g9OotPjKfGdm1tAaqppIMtDPUU70cxp5BJWKtU8DShdaK 00LgaSD+kX9uPcPcbBFN4as8ZAOoVHbitPsI4/PpHa7Na7N7x7jtbX00FtfRvJGYn8NqygSFCwFQ C6OBpIPwivTB2ouOp6rHUNDPW1U9MKl8hJVZPI5IRST+D7eG9bVVEdPOUidmRAp0lSRa3tby6Z3j nmmRFRqaaIqVArU9oFRkCprmvQV9702i1vdo2zbbm5muYRIZ2kuJ7gKz6PDSs0kio9FZmVdJ0lSR SnX/19AgCWRv7cjXJNySTbk8m/PveOmiVp09U1NBRwrWVrEMWUwUoALOw5HkN9QX+o96r6dMsS7a V/b0400Up+4yUqp5JVZo0uAViACrGpJ4DD3rqjMAAg6StWX88gcAOXJYDkAnm1/zb3bpVHTSCOHW AgAqQR9L3/xF/qP9h795jq2SDUdZnI8b3HqZlIPN2WxvyePr78eqKDqFeuEC6pV5ItduF1H0gkAC x+p966cPDqWy3+tlJ9VhfhidRWwHAI/2/vw6oen7FU+PmpmqK5CxR5dLc3AVIwgdLqDGJWPH1v7o 5IPb1scM9ORxNFURQrHFBSVJEjSFZpAGcxEU8SCQsNMjjUwvcfQe9amFc1HXjQ9IWpTRKRx+fTz6 CrMjJz/RlPtzjnqy4Hz6we/db6m0ak+WwuGEcZA+vrkVuOR/xz/1vej5dVavT7jHZPuqiOwngp1d GZ0VShnKMHV7lpAZ1Zbf0t7bYcB5V/ydeB6nU+XyFFBVapV8jO0KaVSWQVYRJIGTX6aeCmuA/wBQ WJ91Kg09P9X+odbrx6dZpGjw80VQYxUfZoE8aq6moqZfDLKXUEHVAQ1wfqxt7p+LHDrefz6TtNT1 ZgZ4UWaOJXYIdakNOPE7qb6WRXUEix+nuxIPHj14Y6wtMJlSNUdWo6ZnYOCXLh4VeBLM+pSFLKbg 3NuPfqcTXietjODxp1iOSikidahJWlYS65I3VRNMzhoyyaToSNeTY8n3vSfI46rXJ6YWILMRwCxI H9ATx7eHAdb6y04BZv8AVafSf6MWUf70T7q/Ada6zGJHEVrl5I5WIUFiGWR0RSo+hAW5/wBf3WpW ucY63ig9eo0sbROUb62B/H5Fx9Cfd1bUK9e66jbTIjf6l1P+2IPvbCqkfLrw4jqfQytDUpMlOahk SRhCoYhwUZSX0jVpQm5/1vdCK4rjptwNJFaDp8OUyMk8irjI0qJIhDqlDXUSN5C5aTSNTE3JuLD3 rSv8XTWhKV8THU2lTMqiQmWkozOk1RI8iF3INQiKQjWi9TrpUC4IUk39+oKnj1UmPjQnqa1LNU1E MVRkK2pussk6CRaKnMECtq0eGNTpaWUAC/8AW/vY9KdV1ACoQD+Z6xzRh2SnETSyQRq0669RjB+j PJLxKES39GJPtsoK4x06lw4+PuX+f+r7emuKhqTW00iyRS+SR5IU0eWYJE2vlCNaorMB6jz/AK3v ag+merSyKy0Umn+D5db5v/CZ3bMm3vh/ld4ZOGreTL9w9iVVMsEKRPUU+Mw+08fTtKqhBVSxS1NS qsTcRtpBsAAYWynwyaeZ6YVC0gI+GnWx3kaKs3VGr0sJoImFQK6lqICWlopYyY6WAoSVrXj9cYAL H+nth2AJPRrCAoAOD0V5sNuPAdm7Y2xUGWlb+LY2qo6ipV45K3CT1TvEHkXieqihgaN0JurDn3Xx B6dLCopSvVl+69uxZHMLKgeZGpcXWwRk6YpKyIx2LqOfIrKLkXA97YhePSN6knp4xG33x9ZW1tPT QrHVVE1ZJSuFRoci0jQyT07n1Qx1Ksn0H6lBP190Laek/TjvB32/tXJPk6pIZZRGabILQTVrUs0r rFGghjGqpeSocKEAJJN/aWZwFJPShCy0PE9Ui/OHbSZGgi3HuLedLFmNuM0EW2q2Gmjq6mtrPVH5 kuFp0poQpKC7WPq+ntNA6LLreunoVbVGZyuoZPVUdD2Xl9w7T3LgoqikhzmCqylZTKDCsVC5c0tR HO4EUiSx/TRcC/tRupsrhFWCYmSmRQ46Fu0tBJcGFT3KxHA8R1VP8gt87mot8jH7glydU0HhbEYa iE1TPlXqrpEIIacNI4XRyVFh7L7Had6dpbnbttFzBCFMmplUqDXSQGy1TWtOHn1MOyyJtS6pyF8U ADzrp+zhx8+sO/W2r131/j+yO2clDBuqRYzhtiROZcpSxsqyQT10k7PFRshKnS4VuPbG9cxWwSGG TbVN6WChBQkEmnH5Hz6kfb5ZZUM6KohQaiSQO1ck0PyHVQPZXb0u9t0VmWNRMaGWraJaaWpE/Gpu AsR0AX/w9tW+0XBn1XcICA04g/njqOeevc+kL2+2XIa3I8jToB6yrkkyNdVQRykJUvGqNw3iUKw0 LYErc8ezw7TGlZoEHgDB4DI44PWL+773Jd3DzpcM1R8+P2dOeGwOU3ROpoqZxHz555/8nEQ5PBm0 6r2sLe6SbhYWkTtFLS8Xhg8eHHpdsHKXM/M13bxW1mzWjnJZgo4V8+lamz6inmSJJwso4kDjxqDf 8OwCsP8AW9lk283k5pDlvXh/h6kSy9vEtpfp75QsteFQf5joWNp0dZjFkc1qGOAX/wAqqkp4451F 0jpXkdKc82te/sJ7rNc3LnNZge4E0ofkeHWSnIGz2mybLLaTFVLR0TzqM+fl+fRm/nR2VtHurH9K ZLZ+cytbXbH6yG3tyRzwLRimzSZGnmENP44YlrlNNGSJE1Lbi9/Yl/eW33ENolzOwdIqUAJ7qj0H oOPUb89cvbvY2lpdmFAhvKpR1ydJNMHH59Gk/ky4LsXJdwZnI4rz/wABkphSUweV0p6iuSJSyvxp ilDLwx/Ps226xuwJbhEH0rUpkD+X2dRvv+77pPax229DRCowQwb/AAdbpvWu2H2psunnip6efJZW oafKt9qaioSoDF5aiWrt4B+02lTxpH0PszkFT6dRNd3PiFhqqOsWd64Xc2ahq8s81OJYmirjEnmy EePbQ9NLqcpHBTyypGjyfTTJb6ke0siMBq6K0YBjq9eqL/nDsbe+Xrs5SbJyslBtqJocfV7oowmL irqqLKyU9qtS8dRNiMlQCMRSIDUPVkixVr+0ZnCmhXHRxDJHownVCnYm6IKLOVFFTz1UsdB5qf7m CMQSSVNPM1LUCop2/wAzIKmFtan1Ejn2pho5XGD03MnYZF9eHQi9I1Rq6fMVwhhqKeCjp2atrrpJ QVCtrcQfkyz2sq/Qg+1z26lMceil5X1UJwD0bnZ0e0e4acYafG0s84Vqc+SlQNKoXSTTSAeaKrRz ZW+hB59ojEyMAM16dhajAqe+vRefkf8AHHN7R25ksTLnaXFUEWHyeYwZryZKqq8MUsooWnNk+5Ux 20j639mMf0oiK3UulAK8K8B1JW1PLLaBLRdVwRw4Z+3qrHHY+szeLx1VVPNMxEUTrHBIE8yIPN5S FsihweW49kcVhNKfHdP8WY1B9QeBpxGP2dGnMl9Ha2UAtpB9WEAYejAZFfPPSE3LE+Wzn93cdTtM tHxVlD6F1fgMPSzD+g/Pvd7dwWY8C2FXfDY9Og9yttXMPPW629jcqfpom83HBscPy6X0MWL2ZiEh xJLZN4XWoV42jEDGM3WSV7KsovcIfUR9Pr7BN1sMl7e2k4HYJkLZ4KGBOPs8uswTbbP7R7HJS4CX EsDLgE5KkcR8z0h9s5Sux2UrqjIVBjeuWN6GpJIkJ0+tQOHjsT+fZ7vuweLfu21HVbE4Pw/yNOoQ 5U5ohl3v67dbmkC001BbNPQdd7s7AyMb/Y0c7QXk/elJZy8ZtaYlDyWsePr7pHssccKxykiStT54 /Lo35+573PdJvB2+7KoIlUAGgIFc/LpcdG56nxe+9v5SXcEsstPkIKtYa0TPipfCwmkgq6aTiSOZ VKC4sCb+3xa2WyL+9fGasRB+EniacBk8eizk4xXDJHvO5t9S1aLk1/Ph8+rlJsd1zvN5d85Oj2xi 582lLElHRCmRKVolt5VjjkABck3sPb9xzFZXVZsAtw7aU6E1xbsZDDtQ8ST04f4ejE47f+y9jbJq XTOUVBjKFEher1L40RBq9C6ruOT9PauLcLIwCUy0JHp0judru7FVudzt9DPk07v8HWDY24dv9lVd DkMLuiizVBJMBTGnkXWKn6nXEHMiJ4wbE8X4+vtxVivFVo31LXrytayxgwk1+wj/AA9CL2Jk93bW jghxCGQvoWOzAr6SCSWtYcDkn3eS3aMAIufy6JryJD9vQhdTdrZWkz1LOsjw5CKnZRGLG3li8cji UDx6lBJX+h9qLG4SVu1vl0Gd/tBBGfEWmOrqvjPWHL7cqc7h6iCbK4WCGkgxNVVKojFRWoXrXLEx hJ6QyJp/UZlufrb2ZeGzVNMDqKL8xtqVej+7cmSopq9DGqQQs8Rlkt5ZVb1Mkak3KQ6+SvpNufZd MgdiK9EZ7QfXqXt2lWLJZOOIxGOooEqLqjF6xwfA8iyEaOCouL/j20ISKgNg9NVqeg37PosbU5nb lDVwT1M60DzxQhXamWGKdTWMEYMvnVtJAB1Wvxa/t+OIcT0bQAFVHlToKux9zx020swswWsqafC1 dZSBj4UieCkcxaFK3AkWxsTa4uffnlVSRTp8xx8Dx6Lv0dlFg29LVZVnmlpaKknqKl2DxCWveaXX U3+iSPeNdOqw/PI9trcLkVqf2dPG2VlGno5/X2TptxYWSbHzwSrH6qmGoYOKNIJBTmGrHJ88jgFQ OU/oR9azsrLpANekhDRuVpnrSz/4UwVu36z5n9TLk8xPjty47pTFxVWWx9dU4xaShbNZF6SJGgsh mUluWvqLc2HutodKELgauiXd/FMkZSPUunOK9a6KmeeOtno9wU2eCmM1FXkJ6eWeSnNQYopI6ih0 zCpSZgW1owYf63tbUkZ6JcBgDHpPoP8AZ69VTVma/heHXG1j18lbFi6eWFqfJU8iZMmGGWczSI8C xVEZchkIABt/T3smtB59eAC6n1ALSvpw6deydyYPB7Tl2HtmKpqqevyMUOU3D5WFHkBgpIVq6Wjk BDZOSryCXnlH7UdggvawbqSa0x/sf6qdatImklE8mNIqB554fZQcPM9F7fwtN9q8LyzJG0Qe+qOG SQLK8qqjL64gbMDcce/Zpx6NeH2ddzGppn0RVavZo4nUw+FACwEZBjYtqGq5/p72CPTqulT5dRZa utkZZZ5rownjdllf1+MNE+q4JLMnCj6Ee9mlPn1ZUCnBz1Lw01MYsosrTq6Uiy0qIqlHMc0LtHKt wTq08W/PvTDgTx62w4EdZs/AjU9JVQ3KyT5DlQugaFo5DGCpPKGYhgRwfe1PWl4kHqBjJWlE0JN5 JIdURPqIanJcckEjUtxb/H3VsH5dXpUU8x0J+y9wSUVVRApK8VSTTVyBbxxyAqsM0SAFiZFs3HJK sByfZRvNmLy0dR/ap3L/AJR9h/zenUie1nN0nKPNdrI5Y7ZdkQzKAThj2OAMlo3IOASVLqPi6f8A dM2Sl3CcdSUyslTWYZKiZm1QyhqOvbECaJSPNSQ133E00TfqWAf6oeyLblt1sfHkfKq9B5juXXQ+ TFdKqfLUfTqe+dZ94n5sbabCzBjmuLRXYmqNWKc2odQe+JJvHlljb4hAv8Y6BjeOHfB7graJpZpw RDUrUz3MtT9xCkks7mwBZ6gve1wDx+PYq2u6F3ZRTBQOIoOAoaAfsp1jt7g8vyctc1bjtrzySghJ BI/xSeIgZnJ4Ely9aVANRWoPSY9mHQL6l09OZYKyURyyGCKIgxqxWIyVMMQklYekKdWgD6lnFhwb NO+l4l1AaifzoCcf4fsHS+1tTPbbhMIXcxIpqoNFLSIupjwpnQBxLOtBg0MRs6shxdHhZItP8B3H TQwNFf043ctPH9vURXdrpTZZqZ7D1HzgAAeS5BG6RNcS3Qb/AHMgYmv8URNQftSo/wBr9nWWvt7u EGy2HLskFByxu8KIVri33CNdEi9xqI7oxtQZ/WAAA8WpddzTy0lRmaiE6ZZdmVMEESn6P95JDDIB +SJawf7x7T7eiyR2qMKqLsEn/agkfsXo750uZrG75iu7dqTvy7IiKPXxWRCB8mlHWLd2FMWAxuCo oUx+345DU56siCBaehx0X3b3VpFmmnrJ0uD6i0ijUeed7Zd6r2e8mcvekUjU+bMafYAo+zHAdMc+ cumLlbaOWNtt1tOVVcyXsq0pHDbr4pqCwd3ldag9xLgamFcohdv1DYLHY2NhSpiqrFZnJ1c1Mk8q ZTPV1NFTUxE0fjb+HYqZZKhQCGOgEW49m5vUF5POe4yK6IoNAUjUknBr3OCFP206jdOVbpuWdo2e JxBFYz213cyvGHZbm9mjWOMh10nwLZ1knWhDHwwwoadCDRwVFbtGnp1BhzG31gis+r9vJ4ExgKQw DGHIwRA34LwT3HB9kkrpFubuTW1nJP2pJX+ak/ky/LqVrC3u9x5Cs7VQY+YNqCLQ17bmypQZFdE6 KM4LQzVGG6VNSkWboaFopz9nPLQ5BwqavvKWMpVxQEhxojmkEZf9QZAVtZrgujLWk0wZP1QGX/Sk 4J+0CtPQ0Pl0NruGHmTbdtaK5pt0jwzmgr4sa0lRCajSrsEL/FqQMlKMSEwMZDuV87lK5Gmp3gyG Bw6WEvipYRLTV9dSr9BUVtYHVWHq8ca2NmI9mBuGsFs7eE0eqyP5VJoVU/JVpUepPp0DF2a35wl5 n3ncojJaNHPZWgw2mNA0c80Y4eJNKGCsM+HGgBoxHQZU2QG3NmZpaqGao3BnKjJYvIRzuJRB9nK9 LUVdW2suZIjkQga7anZPxe4gkh+v3W08NgtlCqupGK6hUAfI6a/IV6hez3Uco+3fMS3tvJLzTuUt xbTq5DaPCYxvLKa11L9QFBqdTmMcASUT/djKVdFW1cVMgfEYzFV9XGkjTVFXTZdZqyKsAUNZ4qdh rQ2Kol/qOTb94W8csUTSGksjqDSgBSilfzPA+p6jn+pe93+3bjfwWaiSws7aeVQxeSWO6DyrLQVo VjI1qaaUWvEZSfsy6AnRq+rUhXZlA0V9clRXvUXN/wB4VksYsLnSPAiccf1/PuOeYi53WYNwCrT7 NIP+GvWcPsnHbp7ebU0P9o0s5fP4/FYcK47AmPzpnoOO05J8du3HV9LKY6kY+kqIXABMUlPVVKh7 EWYekcG4P0PHs85dVJ9tnhkWsetgfnUDqI/eua52nnvaN0spyl59LFIhoDpaOSQV9DwGDUHgcdI/ clfSNj6ShpGeSSryFbnKx5y0tT/lEcFLjzNO1i09TSwtUSAAKGnAAFrA0sIZRNJNIAAqLGoGBgkt QegJ0jz7egBzhulg21WG2WLs8s93NeTM5LSfqKkcGtzxeSNDPIANIaYAAUoP/9DQeFeI4nSlgVS9 1MjcyfgEr/tRH096pnPSUrU9x6mUOPkl0zTyLJoBdlZXdoyfUSxI0m4FrC597x5dNs4rRR1yytQ6 pHTpy9gUYGwSO2sKVHANuefx791qNQSS3DpMufLItjckKpJHJbm5tzf3sDpWO1DUdc4ad5J1iFg1 yGv9FH5v/gB78TTPW61XHn1xnTxnSra1HIYEkEXIBvYWBIuPeq1HDrympJ65UvDOdVvQRpBsXDEA gE8cfU/4e9HrbeXUlm1KTbSVsCD9babXB5OoD/YD3sCh6oelrgZ6aTFxUolRZVkn8iyQiYMzsXDL ESFNkFubi/tqQEMSerqRSlenyKBypApqdkHpmsx8spHKvGrEx3HBA4It7pX59b/LoLMoF+8nKabG af8AQLL/AMCJwBb6A6QPpx7eXgv2db9ft6bvduvdTaUelubFpEUX9Kn0uSS30Gnj/b+9H/J1RvLp 5oHKQyEspSRo42jeBJoiqIWVpdagC5f8H8e6OMgU6suAeuzNDG4vS055tGImlhYxkghHD61ZdXPP 1H1491yfM9bx1KrKpZFpYtEkMCFDJGhDppBuFUKQGVV5B/JsLW90AySevU9D1LGZgheE0crTRpH4 9Eo8fhRCxAdGVV0s8hvYk2HvxU+Y63WnA9RHkFPPkUOhpKiGN45oh5EiLIsrvGR6Ws3p/wAPr78c genXhxPTbLTj7czaKcGZ1McUZMjqqqL6W+gUEHXf8+9g0NK8OtU8+mD2o691KphcSKLXbQLn8AEs bf1JIHtuQ0p16nTwuPT7FKxKo/ciN5vtrKPGqtp1F7kkMv4/r7bLUJWmOvUqPn0xzljI2o3t9P8A W+v+8k+3kppFOvdcYra11DUOeP8AEqbf7Y+/NwPXunvCOy1rMtmX7adG+q8OsY/B/LEfX8X91PDp mUDR+Y6UqN93UJFA0Zgik8lZNGPI9jdjFGrgAeRoyP62H+HvXn0xSgJIz5delqCJqqraUQ05kggp pZXjKutKtpCiEW8YnduVvz78SScdeAqFAGf9X+Tr1NlaVXnIjqshK8cUKfaQvIhiBeWUEyaEUNI4 Bt/qPz72MZPXijGnAfb1DkrMrUVXjixSQTksS1SSEVY0L6WLtHGtkN+T9be9GmST1YLGBUvUfLqd RUWXKCdK7HUbLEUMsMIlmjQEu48jXQOfyQf9b34UGR1otHWmknr6Nn8inbqbU/l9fGWT7eWc7hwe 9d5ZOWnKyHIVGR3ZkIIJpYw1hVSLQxqBxoVR7WgkQDSM8etwvqcppoAervJMpS4KdY8lN/wOaWor HkLmLHSGIvSGoqBII4Z4iQrMGGhfbNAePRkAWoPPquHefyUxVZ8melusaLIx5KryvZMFB4aieKeU zVkMkc0tLLDrqFieKmBABCtGoJ+h9urEpXHH7OrMJhkjH29XcYyOCqr/AAygf5JTwpKzEGMRqzC4 06dDlvoAfr9fbLVQ0I6rWoPStZY6Ro5J6YB5pI4YonCrfUt/IVUPqWOJlJ/Fyb+6MAR0yvHoHuwK vI1mZaips1XUa0USzBKWJZI5EBMglDNfwSvp03FgB9B7SyjyB6M7SMPWo61rvmU+7N8bh3Dt/b9P WZ3KYPM1Fa+XrAUiqKaQuXbUSFPjI0ki1/ofbQhOmpNGPQmsv0dJAp1WJlo91wRVm0cRkaWNuwGp cDuDKQQiTJYiQ/tolIVjYhYwhCm4uPYg2DaBcNI857K8fQdDi0jt1jSSGnikAn7ehN7NwPQXwcpN hd37xqm3jv8AxOy5sWlDvFVqlyOZenY0lVR0MoqmhFNIwLHSvpI+vvW+80bdtKTWVg6icjS2e404 dDLl60vtwe7lmBMFuFb/AHon/N1rD9x9n7j7733vXsDM5QVlduLLV08uCpg8OPpKaqmf+Hw0kNkR FhDRjhRYD2Atgs4JLm73Ddx+o9StfU/D+zHRTzVvu636tt+xykdpVqehBU/4ekr0l8XN8dw7m/up hoJRXRwVVZItMvmk/YmjUkC9yBq9iSyt7i7lMeoAjPQO5Z5CjDJ++txJQep8ujD9o/DHN9O5enw+ 562WgywoaTOSCvjWB5qKs1LGArHlSYTY/n2RczvfbdeLawzYMYb9pIP+DqfuWvZzk+8iHMC3StaI xjIqKalyfzz0hK2hx2cgp8LhpafFGABKqoGlDUND6rqRa+pk9hFRd3U8TMxCA1PQkulsbKVdv2Oz HgUpqA4U6DzeM9VShKSqgYfbgCOaMEGbT9DcW+tvZ5EWUkEcOo35nsL6xD3orXpoinjz+KxNIyyy JQ5CGqrqGNiJ50RwXhIBBOpRb/Y+08kfiyM6oCdWfsPQfk5o3O62zbbaykP1CoK0J4gnowHfLVW6 MPtzc20NonBYzH4emwEGJpU1V1RlJxFAlZVRgBxCdf1PGo+z2OO2jkjnltwsRQKo8yxP+bpdudhz Nu2yWqzs7GOXX5/wkdbCf8v/AKS3F8ZPi7tbcMssv9991VX95alpYE89DFIyzRxm6t+2UJUg8WPs XXsLw2sMEBzQE/aeoi3S6mLtBcnuGM9X2/Hz5J4PObYqhTs2Vr5PBDitt0irUT1uQipycjRVRiLj ELBU3V2nKBlsR7qEBGo/FToFzrQtnoQafftXltxJg2xkUm6NzUDwiGsyH2UFCW8wnpWEKeB8XQxr GI3DLqdLP9AfaZirAg9JNAFCTjqu/wCXGAwg2zuHC4rdlF/HKumlNbNPhRk8Oy0rmYRPmImSNjTw jVGoBaViCASPZdLEa4UU6M7YJpNGwOtZ3tKfZEFVkI6fG1mQqY6x6etzJxC4ulqpUazTDGmkgqVD sWPlZrt9fzf25E2kL5HpXcyReGwqKEdCL1PsTH/wGpzyLU4rbono0nkjaQU+TqJeY0np5Cxn+0a7 8fot9R7W/UUjqKmnHoPvTUQPPo3vT+yKfbu46bIU9R91M1RHX0sBe1TUQuweBpoyTCVuDwBcD2ik ZpfhB49KIbchTIDio6MZ82ekj3V8fshDS65c/Ty0mQxdZSoonoaghGqKWJ1Cu4MKMCt7W/Htbaxw yK8dyaAj/B0NNmvDZsrE4r1QFVy7P2HtbcdJWNT0WUxNHPSS42q0JVVFbCvhlmjQjUC8oP09n07W 8FkaYAXA/wAHQZvId1u9wkkckwtKxH2E1H8ui4fG/b9D2B3HsvC1Ec32WZ3VFX5ilT0zvg6WdJK2 UyMV8cUMTXJuBY+wD4YuL+zBB0mQk/YOp99u4F2tmulHfpX9o6HTsbdddXDsXr3Dbb2hBgszv2pz 2Lrno0lzdJR4mOPD/Yiu+2YgSxUHksJPq1/ZvHIzLPbxxJoaWoxnFB6fLrXvLzebyK3tg1WOPzOO ihb023UyRy5KNXpxRglQBpt+bH6cge3riM5cYp1BFvcX9lipr5/l0ANZkJJKhmmYmwCaj/gTb/Ye 0scfiAsQTnq9xud/cXAcMfhA6cKFq+pKCjqHpj+pahWK+MJ6vqCLX0+1UNrbO6reilp+KvD5fz6O dt3HcoriF43NQT/g6HTqDf1ZBueOj3VuOtfDoQkK/cyePUBYWu9gbj2GN22uwmmZbRwE8qdSvybz MYbxfreNfPqz3am8doz7UrcDmqmhzm38kwFPHMS1RSwNayyvoa7i5/PtRtk22W1vHY3bIzJ2n1/P qaXu7HfiY1AIHRjOpNkdf7apUq9nZB6dIoo6ww0sxiVbyD067pcBj9PYhlXbhbx/REA6q49KdEF7 ZwRMYYgNQ6N1BGMri5P4hHXVD5FRDiyZ9TPM1goj1SkEs3vQFVyD0E76ClcdBzvfH7g2vR49ds1K fxqAmKSEutpHsbxmUErf8f0v7Y+nNlpIpXoCb1c/Uq48ujm/y/u+8lhd1ZLD75rhBWVVqVsfVeRR NPPPDEi6QytKKWUI6WBAufa+K6LowIFSfLqKNxXw5qevWxDtHPv56CafI0dVT0tDNVTFNclExqIz GqmpGomdn/SjXNxc/T2ndaGvRPIfToasRHE1PjqkKkaGB45VsIwhkkfQJtIUa7fRrEWPtl20ivTI GR0Cvb+Yx+C3DiZaqcrVnAVxpRdNUS/xClpxUwjXdiIneMsy6CH5BPuqzEUqOjGGulc9Fm7LzNDu OjyyU4ST+I0C0b0Ts3gnlkOou0hawQD9YB5/Nhx71IdbE0pXpVGNTU1dF4oMnS09PFsmSGmgmqUN HkmKMhNJKsiUIEbFYZaellHpAHNwT+PdFhUMST0uFUUUPRy+iVFBiqjCTTT0tRFmDBXSoG80lLNG GWYu7qI46jhWcD0t73cqI1qpr0heQs/z60tP+FS1JUYn5sdSzpeGDLdD4upgj0owaCHcWVog0cyk tKBNTyLfizKffrQBo2qPxdFl4zB1z5day61bRyeVVYNqRlcMUkDpzG5a4N1/A9qKH+KnSMkN8agj oWet/wCP763KmOny08NFQ42WeurYRHTV6UlNKvhSnqkCmOqkmlCeZv8ANxFyTx7s/atTx6L7pYre LUqDUTQDy/Z6fLqJ2Nmsblt2vS4RIF25tunptv4GKnI+zXHYo3qagSXYSGvyckjGX/dnDEm/uoBU ULVPmfmenLRGWLW9fFc6j/k/lToOoYJ6mpmMEHnmuS4pyZCGlflhpt5CLke7Cv5dPMRip6eqjG5F 2d48dWzJojkcxQM4UxzMh/QC62At9OPdOval/iHTFUQyxx63p6iECWpRVmhnQBGfUPWyKGIBtb6j 3f06uDU0BHUehbTK4DFDJ+0QSUBU2OkseRyL+/NWgB62Rjp9qJDOkAItAzzRABV4eaipvJrUHg3j HJHutcdUFRXpN08klLUAg6Wicgkj6X9JuP8AUn8+7tkfb06DQg9CZsmSk/vNRw1Uk/20kiVFNEjl IHrkUimEyC+vwzNeP+j2/HHsn3nxTt07Q0rTP+l/FT8uPyr1IvtMNpXn7Yxu6krrPhegnp+lX/bf DT8enyrUwGPoHglyVRO4aWvrvuQFNxHDFSUtFTxC6KV0pTayOQHduTf2Ap5gywRoO1Ep+ZYsT/On 2AdZubVtkltcbxd3Mgaa6ufEFPwosUcUa8BwWPURkB3ahNa9F97ghij3JRujXeXEQNKl76dFVWIj f4a1H0/w/wAfY15YdmsJQwwJTT9i9Ype/wDBDFzht8sb1lksELD0pJKoP5gcPlXz6Cj2JOoM6F7a mFet2PV1lFTSVVTDuWmqK2mgGqprqbHRUskVNGDcMsBrHl0ga3I0jm3sMbjdrFu8UUsgVDbkKTwU sTU/npArwHHqfeRuXZNx9tb/AHDb7R5ruPeY3ljQVkmjt1jZY19QnivLpA1ORpXJHSo25TSwVWa2 Rmpmeoy1DBnoJgPHJT19VHHLXrBz/nKStUSR2tzEW+vsvvpFeO03a1WiROYyOIKgkLX5FcH7adDX lCzntr7mL225juS1zfWyXqOBQxzyqrTBM/FFMBJHSmY2agNelXTUFRmKrGz5eGeKpOIytBkVRdEJ qMbm8PJG6Ex6RFWvA8iD6NEePpf2WyTJaxzpbMDH4qMvrRo3r58VqAfQ9Dq02y63+82e5362kS8+ guYLgAUQyW95alWU6aBZijun8UZ7eFenzPUs+TNDiViLUFTULUZSYqDGtHQPFOtLzx5K2q8aW+vi EhH09pLKRLfxrkt+sq0Qeepqiv2KKn7adCLmexud5O2bEsFdsmlD3L07RFAVcR/6aaTw1p/vsSkZ FenOsoKespJqNwUScDW8YVX1goVlF1Kl1KCxIP09p4ppIpVlBqR6/wCD7OjncNttdwsbmwkXTHKM lQAa4IbgRUEChIPAdRYqB4MvWVqEfb5GkphUpqsVrKJnijlC29XnpZQrG/HhX+vtxpw9rFCfjRjT /Stkj8iK/wC2PSKDbJLbftw3GIj6S7gj8QVyJYSVVgPPXGwVj5eEvr1NpaOKipIqKlBihgiENOP1 eKNQViRb/VYlsFv+APbUkrSytLJlyan5nz/b0YWdhBt9jBt1kCltEmhBx0qMKBXyUUAr5AcesdFS 0+JxtPSiQJTY+kjiM0rBAI6eIB55nYhQSFLOxP1uT73LI9zPJIRWR2JoPUngP8A6a26ytdi2i0sV lC2dpAql2IHai5dycCtCzsTxqSeiz5BGyFdVx00baN87iSTF1jo6k4o5eril0qx9BmrY4XdWVWCx IeQfSP4SIIYmkbNnB3r/AE9AI/YpYAivE8KZw53SN913K/htIz4fM27hraUhh/i31UqtQHhqmETu rBWAjQ9wbsFbBQ+HLVWbhVftK7ceQ23Mn0jfGUdFTY/FyaR6CIa/GeNBYDTUN7Dd4+q2jtH/ALVI FlHrrZizj81ep+ajqceWLf6ffb3mO3QfQ3O7z7e4/CbaKGOC2anDsnt/DXFNM7Y6A/fGCG39yV9F EmiklYVtCObClqSzLGt+SsEgeMHk+j2LtovPrbCGZjWQdrfaP84ofz6xr9yuWV5U5v3TboY9Ni58 aEeQikqQo+SMGjHn2Zz0JvTeZZo8lgZCLRkZKlN+dLmOnqo7E30hhGwsPqzX/Hsg5ptQGt7xfPsP 8yD/AIf5dTL93zmFnh3jleY4Q/UR5zQ6UkXjwB0MKDizE+XTN2fDPWyQZ/n7X7ytwlMlvpFjnZPK 1ha9TXpVFeTeJUP9QFXL5WJHs6d+lXJ+bitPyXT+deg570RzX9xaczNIBamea0iXFdFu2kvT+nP9 RQ1IMYjOCSAiNv4KhymuqymVNJR0lXRQVdLR0lRX5qSlnEnkqaKnCR0Pipkh0sZqiIB3Qc34FAyD pHWPNzPJH8KanIwScYwATx9OHl1//9HQ2pMKl3aVgEiJ+l/UR6rkLa7Jx9OPesnPRe0h/M9TsjVQ 4+kaNBZmdAirZVBty3F2YkHn3unkOqIC7Y6SF3naR3/tFleRjYHVYKoB9QVF/A59+OOlOFAA6gMS k7MCLqxtpFuf9pH4/wCI976e4oB1lVzqZ+A5VkAB/SpUqzcf2uf9v72c+XVfhoBw64n0qQQLgEm/ 04AAFjzZffvLr1akU9eu6YkA2sLsPXYE+lTdBf8ADBr/AONvdT1duPWVyeLWbTpAIA5LamIY8XBB /P497A6qepkwMM0KRmSnmEMDkWKMkxFwoHH0Njf8391GdXpU9eNQRXj04xZevpI4ACojicyG3kBq ZNXk8k0jE+oH6WsPdSiknqwJAHSYnkEsrSKLaizc/W7MWNz/AFufdwKADqw869Yffut9TYGKxiwB u0nBvblAoNh/aU8g+9EV6oTnqdT1NIkLxzLUCVtQ8iCN0/QiorRsQzW0fX/H3VlJNRSnW1IAp59d AxNbTNBZWcqrB4rC91BLgg/X63/Huvd5g8OvYP2dcnDhwVZmQLdjGzyJcqNQDqDYm/8AsPesUyOt mtcdQjckG34P5IPB+h55Nh/tvdsda67We1gx0mwI0FkYEG4sL6GJP1BsPeivp1sN1KWZQFjdY2X1 soS8boZb3GtOLMn5t9fdKH59bB+XWFKWjluPJUU7XI9SLURg2uPVGY5LH/gp931sPIEfs62KH7es RhEH6Zo5btcFA4I0Bls6uilT6v8AH3otq8qdaPyPT4KCp8EExZVphQi1nbSVaBp3YAkDyc8j8+6E 8fWvWx0mZQoK6Te8aM39AzC5A/wANvb61oa+vWqUA69CF1ks2nQjuv8AtTopZV/wuR781aY6904U vlHlmh0WghUuHcpqUsqm3F2LkDjg/wBPdPt6belFB4E9O0dLWfasj1iQQ1RaoamplGoTBfGBM9i6 hQ1iL2+v+v79gcMnposoOFqR69TqTF0dOUkqIpq54AZI/K4+10/pghZSynR5Gux5U/S319+LdVMj HhQdKCSOajTxxsscrFWmSGLWqow1jxn0qFS/AJA/r7qTTpoUJqeo2Pp4a+tIrKx5UQRK+mzyBqpT UPISgMepYokWwvybe/DPHh1tqquBT/Y67qslRiKoEdJoSOoKwvUlVIhiP0twNMpHqP159+JBFAOv BTUZ6+i3/IZzzZ/+XB8fctT1JOMwWJ3jtWt+5aLy0eZxG8shVSx0c4YCnxQpMlFqDjUW+nA9mMYr bCnEDp+3h1SkerDpXfzCfmEdv0G59l9dPVCTD44UuazcNW/jyOVni01dM19EawwxjSrcavr+PZY0 jCTT5dC+2sogqk/F1Vb/AC4t45XsX+YL0Lj8rR1GTrWO/N41+Wri80mJp8Nt2tmjqYDqksTVzKqF iNGuw+o9mUT6lFR3dJLtUVgF63ZNg10WUeqpnnAqIJqKeZ3JDyxzNZQosQAQOL/n2mmY66A0PRW6 lScYPQsbjgpcXiK/K1EisaQf5xnu1L5TGih1+jHyMi/09sEmtT02qn06LpBWVDU+fy1cFqHmyeoQ 2sYqeGI6F/BC8kgfQH23ICR28T0ItpjR20txI6o2+Umd2DszNbzzUGVyMj58S0bUNOrBFmkLhpG9 Nli1nSQP7XI49sAS1BYjSD0KLXbzLJpLGh+fVc/RmzcUu69x713pUy4mDbUT7kxlMyN466npYJJa MyR3s5VWUW9na3sseyXrQSlJQSKg0NOhTcWTGewjsuygUNp8z519eteP59d+9gfI7trduWpsnkst Swbgq8PtXHyzmnoqChpdMLl4SGUxMltF/wCh9xHYRi9umv7ldTGSmoipIHr+f7Opi5sS623krZ7D l+0EW5XwZZJEwx0gFanzpU9Eix2Nrtg7fycW4KV8hm6h43WrjqdSY9mKkBHCWWOMkEj+nsU38yTR wQRYbWMg8MjqNrfYN+9v9pTc95gMzTkDU/cQGND/AIerXv5dfyM6L6Mwvc79h0UkXbE2zRu3qbdi qZ6Cqr6GkiWo29LKLItNX1cwaSMmzFR/T2e/1kttnW5sntgbiuJKVJqOAPEZ6ch2E7pcpuKX5WzX imrtIHqOq8vkz8vu5fkv2Hk97byydCKuXx00OPx6R01FicTSSSLR4WnhQlUgpgSwW/1c+yKx2vc9 9uvq7ydpATQAnCrxA+zP7anpzmb3KHK0KbJs9uE24IGbQO0yHDMfUmgr0X/Abxr4a9pKinlmWUGO J3BeCll02DqvFiW4B/qfbm9bObYmGNtDEcRinRJyz7otdTxRLNJ4zNhfX/UOjC4/YvY3Ym0585j9 oZBNu7flijy2761j9tTzzAvHGWZAPH6CLX9kfi3FlAWeEvGnFjnqdbixl502YQRMUmZePA9IjFbA 3pDuWGHEVVIdwmsCveINjCfT+6p1aCpW3+xHs1sbtNwWDwrZFmYcacfz6jCx9vuYdlv51CNJFExF Sa1pmvWxB8Cvg7vLtjeO3Nz9uY3BHBbcoqTLVlLR0aR0G46WOaONKPJKrMtVAsxWQLx61Bv7Gy7O LKGO93EI9cKtK0alQfyHR1zLzZdQ7THtqp9PKj5ZcFhpppJ9PPq7rsbrfO1MUew9g4qN5qmJoqPQ njoMJiUGkSTSkeOlpYVNlS92NgOT7SPLLMxYSNpHl1jzeStdXEjsxc16NR1L0nsP449QNtnD0SZf dObmTc+7dx1BihyGXz1b4xUymYsAmPxqkRQRxtwgJJJ9uCTt4Z6DVzI5Y1GK9J3PDcz7l3Fu7P5T Z+2qSupsPRSVGQqIsYKcUdPKMDVYSqIVDTukrvUQMUWUyeR2JUe2u0CrDov1M329VffIrd3U+5aH IZHH9rU0WZw9bX4/J7crp1pcbOaXQ1LmMa9M3+5eJEPpIUFHurC3JSSMpppPSq3k0BqtTqiT5C9m VlVu1m2/gJK/Hx0pilzNdTnz5KtjARp5TTI0To4A8a2AK/4390UamArnq8kvHvBB/l09dM915LJ4 iPY26cFW0GEyFXClFXw0ckMVDlJmKKyiZVC0tbyslz9eQfa4IqgqOHSNmCmp6sd6h6/zdLubEV+U tV4+rptUGQlmX7dZWkEVOjBHDwVUZIZVPBAvyPdBFoOAR0vtp66V/D6dWgYzBYiTZmZwz1kUeVWs oop4pioX7ZzEGmhBBElTMGPqS4A+p9uJES1WNRToQW9Cnw561zv5rPw2rMHvDFb36/28GoMhF/uW elTxPLVSzFp5HQXDOZAx/wBf27uivPbwSRE6lFD/AJOpM2zZIuaIoYLQiGRFAqvaSQMk9Vw/H+il 6q7UmyuXx2bc0e089SVjyQSTx0ceQpEjVnl9IpVTRwefYbS3mk3C2aN3CRhi/wBhGM/6q9SDy5yr dbFZ73Hd3LSuyp4ZY1IoTUj0r0/rWUMGLyUsBkmWqyFVXY2SOb72SYVFRJ5ZJAApUxKx55tb2d3G 3GS3R7K5K0bUaHJoamvWOfON7dW26lL6FpVL0GrIBrinRWO0t5mcT4SmmlgSTQDWRejyMDZ1L/m5 9p3umkYR1ND0geW5ckSxFei711NVS1a08MyvBIfIZnI1LcC8YP1AH4/1/ZhCY44CukZJ/LpLrKyB AfLpSbawuVzCZDRVmloMWgaomicIJFNlAvb1XPtEW+pMkLH9LzHkejuyWa3mjuXdjEOP7OokVbB9 xLRUsSvPTP6ZVHr1i/qDf6rj2yIbfVpEC1Hy6Yjv5nvz4EzKK+XQu7I7Zy2CpaihrNcqRMY9Mh1M 5H0Zv6v+PZfLaWqvPI9lGXYkkkcT69SftPODbesdt9QwnQAMfMn59Hg6d+Rf8TpoMDUQV6iRoUpz EWRVk8ij1EDmMqPp79FMgARYqZxToa23NUVyWYjVJp4nierD9idrZ/J5uLF1BRMbiKN2pkc6grtF xJH9NEij8/19va7gy6NbBQOmLvcTOCVj6z7k7TE/mTLGSlkSFxTu11LspZRpNwORz/r+11u8jYuW Lfb0Cd32541Zg56HbpfN7d7GoKHZprIqPeFS0DbY3XUSulV93FKkj4GoSFUnkWppPIIZQbiQqDx7 NUWECkaLx6ifeiY5KOSTTrYr+CudztTiE2Vn2mraDC/b11FWZATPV1OKpWkgnp0qpFMck8E62n8r B1jHvTIW6DolLDierLUfUv3P7KUk0kaRaZArNEz2p5qiMjSBNcaWHBA9oLiMAA14Hp6IsWIrmvRM vlTTTVPZO1BHFOUl2auKpIfGAtRVpm6dzAJkJb7h52UMliLEC/sskkKE5J6EdtBrodPl1rdfMn52 5rbPyYzmztgZkJtHpmkg2Qs0FZDLSZ3e1SiVm+amWppJpaWvTD1kn8OVWsYpKZh9faiOUOFDE1/w dKGtWjYyUoOha6v+YWA7H+2yean0ZcU9PT/cTVCpUIYFhA0IAiyFnjspB5A/1/a8wAqCr16Rm8K1 Gnq5H4/9s7drIP449XDXTZuoxtDNULOs0RmEAWkKw3fxPoTUy2+v1/r7TTRMyaTg9JNYLs54da2/ /CpPqCOn67+GvctZPLVbqoJ+wOsM1VgFoajG1NYm8MMzyAMuuneWZFBY+k8fn23aEiSRDwwekl0K 6TXGetOgz6knLeppTGwb/UlH5/1rg/j2sA4DpGOPSoosnVYjB1OKppvtxmnimzZg8kVVNSwKTRYu adSGWnnaUyyItgRpDX+nvzcfUjh0wUWSRXYVCcPt8z/kHTJpjMdp5JIfuADaKDXohiJCLpLoEDOO P6ge9DGacOnq+fSkxTx0CSCnq08zR2eOroo49ayAEGOQPIxI4tYA39+r5+fSdzqPDHTmsiSQT6ch RPJ5lkdKp3pmjLkBlid4h6NSj/Annn377eqk08j1lkFYaSSiM2NqJJSs8LxZJXe8QYLZZGQMp1aW AFre9EVxjrwOltVOmuigr6UF6mKCaRgyxfby01UZCeJWYAyA+NUH+29+C04cOrl1OAesqVCtEqTU BaZC0aSrRRiQC+kuzBNU/pOkC3I+h979B1XgcN/PpHZNVWQOkZXUrJKxWRNb62szxyIhje345HHu yeh6fjNcE9ZqCqlhXyxu6z0k0VQkkZ0yCEkBmRgbhoJFUg/gH3R0R1KsO1gQf9Xz6UQTzWs8F1by FJ4nVlYGhDKagg8QQRjo2+3s3SZ/GwV1M6l9Kx1UQ/VBUhFMiEX5Rr3Q/wBpT/W4EYX9nLY3DwSD trVT6jy/2fn10N5K5r2/nLYrTd7KQePpCzJ5xygDUpHpXKH8SkHjUAv/AG9SvBuhJ3kMi1mPp5ox pZRCkZamMAJYq/7kDSXAB/csfpf2M+WJFfbigWhRyD865r+wgfl1i77+WUltzrHcyS6luLSN1wRo C1j0cSD3Iz1AB/UoeAPQV+xH1CPRi+mpicJlabSR48mKhSfowqKWGLj/AABpPYG5qUfV20leMdP2 En/n7rLj7vVwW5b3u0K/De6wfXxI0X+XhHpVbpwyJUY/dVOVirsFUQzVT6SXqcQpmStptQICkQ1L sGseLj+nsu266JSfbpKmGZSB8nxpP7QB0OOdtgRLvaeeLQiPc9rlRpTQ1ktRqE0da47JHYGhFKg+ VF57JepOIHXEj3uvVCuM9dAX97r1ULU9ctPvVer6BXru3vXVqDpL5jTk8hQ4DWn2shSsywL2eWJZ kXH4xQHVmbJ1KtdRctHCw/I9mlkkkcUl3HGzT/DGACckdzcD8IpT5kenQA5rvbC5vrPYb/cIINoV PqL1pJFQCJGXwoWLMoAncMWrjw4nBpqFUFl9u7gqanDU1HtnK/c46LO5IzhJqL7YyZLIfw2rgKsk v21BNUeeUojB7It7X9iuws7h1u2LAq4jGnBJAVdeoHgWA0jVSmT6dYzc0e4HKbXew21hcK9xZSXj GWJnCRSvNO1qUeKtViMnjP4YYSUjjBNGAErZe1q2Ono9qZaq2/j5sflHGXzGWzCRYahvkDkjlqjI 0UFbSSmkqJo/NFFI8sUt1YXVrNXHL11eX0twJ1jiZQPUgaQpXyriuRUdGWye+/LvLvLFhsJ2G5v7 qGaRzISsSSP9Q08coB1SAlyGIZBpI4t0z9i7I2pJkoZ85uvHVslJT11Cxxk64WCnTzxHH5KWozCT 1eRophLJKkcNLHIVZQSL+zjbtq/dkTxR3OrU1TUcPsHzA9eoq599zL73Cv7O+/ckVq8EWgUZpCyl i1CaKKgk0wAKmteknjItibUNTmMLUrkZ4sbJFh5AtbNU1uaqTEtTNPSPJFCm2cPAHOuYA1MwAUWB 9mUlvbzJ4c8YkQngQKfaegft297/ALVdfV7ZuE1rd0Kl420MFPEahmrYwOHSR3dueOswj7XxuSnm xEM8VelJJjKOmqKrJvJJMtZLJjZalnhjjq544VqaiUxRSkBFJ4bWKBCzIlGP7Meg4Dqolvbq6F7f TySz0pqd2ag8wNRxkAmgFT59BdjarIU1UEoZJYqiptS6I0MjuzsAsYhCsWcuAALE39uA6cjpVKiO v6gqoz1//9LRAly6RI6qxjLtKpchZD+n0Oo/soD+Pr7rU+XRdoqc9JSokepOoNdnJZh+pxpF7s3N gebAe7cOPShaKOubx+KCFHsgLiVmCl2PpNhwbcn+vv3rTrQJJb1p01lg0jNc8kkf7H8n3sdP0ooH WUemzM40sGQ6RyLqPp72eqjNQFz13pup9VgFIu31IBAv/txb37qtaHh59coUISNyAFaRyGP1uigE i3NgT7r6jpwnPWZ01FlUE83KryLKqoDp/oW9+B4dV6UmMoo8jJLPkYjI86y00VRJN4oY5oxHHGEK kfuQaePxzz7bJoAF4ceriua/Z1mzODSlhpkhqppTUypTQ04kilUzyMA13XS4SOME8g2Nrke9K5Jy B1vSPLpHTRxwPVxI3lVHaFJCBzolUMwsSBqt9R+D7vmo635dQ/duvdTIgPGn6lJ8jBgBybAaR+Tf R/sPfumzxz1jmb1ABSCqrqJNyWAN2B/Aa/8AsPfvXqwAoOuAfkXvbgf48/U2Pv32da0inXJTblHC EkLfUyMb/k2NtP8AX3o9bz1nEjklyxkPN3Yarm2nUG5bi3H+391IHWqn8+svnjNg8KEAmwRtH4AX 0uG1Efnm59008e7rdfUdZFNEwsZJ4rBioMauNRYWu6Nzq5J4Frce9Ub5HrdR1yjiuT4ZoJT+FMqw vccHQsgFxZrD8n+nvx+YP+Hqw+R6xzK6nQ8bR3FwCb672AOr6fg+9D7etHjw6daipimxbJJKjzM1 E0cYaxhjp4vtxGdNgTpjN7/W9/es6q09f59exTpNTW8jWjMf6bob8HSNR9QBszc/7H2oXgM9e69E pYlgLhBdrkCwJCX/AMeW96Y0HXunig8AYx1TGOmd6USTWN40WVntxewlsATY2+vtuvCgz024Omoy elJVzBohDj6dpI9flknUKBKv4s5IVFDNcsTb0+61znHSYDNWOepNTlsZQRqkc8cssbUwlSmbzuxi jbVAJWHieISPdmB5NwPp72ATwHWhG78Vx0w1u6HqGlMVFCPIwfVNqcqwXTqWNGVVt+Bcge7eGSas 37OnlgpSrdMy12RkWbxF18sqSySQp431WEUaq6AFEsbAC3u1ExXpzTGCK9czjMjL65wykkAtO7Fr f1udXA9+1KOA614iDh19AL/hPruSfZv8oLcudnqWqpsd3D27RY+eadqhqKoraXbccGLpqdND/wAP LxCYKdWmWaRr2IUGEBVrYinrj9nT9uPEkBWvEdBV3Tts5OmwkmRqq6ePLrNV5GnYgQZCpmqzNNTm RFjfzU7EBdaWA+nspY6mNRnoVorIqj5dIH4R53DdGfzA+kt05Bv4bhc/VZ/qSasljlqEx3+kfHLR 4mpkWJ1WcR5ikp0Z29KBzx7NYNJjWoz0mcI3EZHW591ui02/KaBapqihq8dVRSTII9H3eLkUC6iP jXLcqLj2mnGg8MdIZkShAFD0OW/0aTauSo43Yy1kLxsS4SR/uI3RGGrWsctKyq/INmH559pPP5dI A1D69F8xERpcQKPMwTTU4hCVdZTsoeOZU8QklBBXVIBqNiVJvb3cD0PRxYOUYEceqWfl/HtzIbqy 0+CxtLVLiZJKKvooYRJLUVNwrtUU7x2KabO5UEc3+vvRqKDFSeh7s9tNNIJFuQB8wetfLufc+8Ov 9+ZnKbz3xVbb2nlsBloMXjVDVSVrRyLBDj6VKVG8SnhU1/QDn2jgtLh7a+t5b1VSQtTBxnhjoUWO 6Q2l6q3Ns7MrUrUCtPMV9eqzN49TUi43Eb2q94Ybbx3CqZqPbOYgqajOVlNDJJNN4HoGSKlmrEtZ pRb2Qvaw7XtfgSyjxhkE+f2fPqcYJ915jg2yDa9seJIiT4j0ZVqMfDny6Bf5K1eHycu1abr3an8M wtVj42zK18qT1VRWRBVMjy07eNYZHS5BsQp9le3TR3F0qR8CRx8mr5/Loq929v5xm2G021bmK8kH lErCn7eifVG3dxtkI6WGkybQwytUwU9GsxpikgZp6SkrSrQxxNIQQGe1h7HTRbNaTeDutq8tzX4l IC/sbPHrF2a09zLA/QR7VcKhxXNP8HT7131H2t2Tl6Xaez9nZDK7gr8hUtUqsEwUBRH5Vep0eG8K EE88349mFndQQUjtLlDKakIBQ0+3h09tfIvPG77rbbdfWbC1loTKysVBJyCOOPl1Yx0F8Gt4V2O3 jkxiE3NktuT/AMOMVLBLWY6jy3ivPTVs8fkjilpiWupYNdb/AE9g3fl3yf6q7gsJCi/iJBAOONP9 Wesudk9kuSeT7jZl3TeLWXd5gSulWXSdJJqGNT+XXe94ew+rdt1HSlfkqyGm3zl8dJW7dxgWR5qi ESIEURRvKiyPJwCRwOfZVslpuu5uNt3CFoo5GAq2R/LPSret427lBq2J8ZF8kIFf29WDfHX+WdnN 7bZ2XmM5m5cfufc1ZRMNrfZVa5aLGSzKv36zuuiOnWMkkN6uPcqxct2G0wJbCQNLEtC4wppmornq P7j3XvImu7xrVjBKSVSq6lHoTwJx5dbX/UHRmK6d2HgOuMBTPW5KggpaOpmnRfLUxiCMzStUKOIo H5YMfqBx7KNwuZroonifpqcD7OoC3/mi733crmSQFYaEgHyNfl0MmT2Xj6GmhpaCOV/MgqZaiJ1S sr6zUkTkSR6D4I3IVI72AF/rf3SCYQqVK16IID4bF5M/6vn0WfuCr31msi+FpK9cbt2SiGHangX1 5GaBT5UcSxSz1UMZTWSjKL3IIA96Mh8hXojl1OWOnPVLPyP7c2lX183XOO3Q+RrKSKrx9ZTrP91U jP0jLHU06p5pgEgp5FEeoHUGIB9PCcys1Ay9Jx2nPVWnaybj2tHFl69qyEUkRglqUVqfTC8p8TxH 9MrlOHe1h7vG8QqXGa9aJ1DjjoBanttEp5npaSOpqU0SrUVLfcNoSymGeKQFDp/UtuD+fapTE61Q ZB6aGDnh0/7J7Jq8nko463KLAVkWSlijVF87IwkWBYh+3KyNdlUgBbWHukrhADpr04AjUqOj9bG7 vy23UpGmyVFPi01CpaoWCRqbhDZPST5Et6QfUObe7RMj/D0st0UFTgdWU9adw7e7Qx2GoIMlQjIU FTTVAyEYBV9BQrDUqCGLErZiQAB727iMFjwPQhtO+lGHQ4d0bAwXbOGpKDNLEuXp01RMkaPSVABH jHAIkRgv1HP+Pu8U4AoQadCKwv77bplksbkLnPHPVGvzQ6OyPXGwOwN7bEc4TL0kdDjc7hP4fC38 doat54lKyvA58NMAT+3pJDe2L9pVsrySzYrMVFeHDqYuXOav3oPAumKmOmokjur6fZ8+qetwZ6q7 B25gcPgdn0m1a7b1FEk+Zx3nb76V2vVeeJXcjyBmvccewXa7/fWpEE1o0n4aqaDOPP7ehDuXIGy8 xGO+N9AnhMHIZSSQtGoCPM0oK46L/wBovtt9hwbepsdP/faizEks9eskDRVNMZXZYY41vUh1X+vH HsTWztcRJCtk6XAbJJB/ZTqL+foNmWKWTbbYpUfL/J0W6CGoaodZoK0GUrSxIsb3inW2st6foAw+ n19mMtqUGmWdUlI+E1rT16g7b7OWedpJJgo1EZB6XdfU023sYuFxs0hnqYQ+Vqg1kAA1iNov86W1 2H+v7SLZSrPGEmBTNTQ06P8Aed1sbParmzVtV2QNNPkRX58OmrZ2Br6/Jzy0cflkVI5nBDHyCTT6 QfoGW/N/enJtnONRA8v9nos5bs5Li4WYzKBWtCD0Ku9etK/bVTA9U0VO1bGlUKllf7VzIoay2N/9 59uXBTQhZCNQr5U6P76z+lu5bgyB1d60Fa+X+boV+osdlM/DLjsW0FFkKREkirQLqumQDzHR6zG1 rWHNz7SogdUC01V6GvL8MaqZnyCtKefHz6PBszL7q2I0eRrXXKtVJ9rI8cc72YALrPDcG309r4Nv lr4hlXh5g9DqG6sY4yrWjEj5joU6vc2399/a0eQp6vGzQw645qilkjDSGw08IoYE88/j239RDdAq EKsPXqOd43R31ChHHo0Hxx6tG590YSOjys+Cy/8AGaSPbuTiZY41r7loZFMl0iL6AvrBjbVpI5v7 W20TKvxY6ijeJTI+onNOtvT42Y7B7b2viM+p1Y16Rqbe0bUEk2Qo90JJBRZSNaaMaY2ml0PIY7qE a4I9vSy+GuOPRHHQrj16HDrHcA3Hity0VdTtQ5fY278ztbP0M8kT1lKcfVyzY6aVlBdoaiimjkju OEIt7LZJAVYkVBPSyAUZPt6rz/mq9r5DpH4vbt7wx1FX1u5NtJFtrC1ePhWQYms39U022MFnMk7o yUuGwmdqYKqaVlOnQAR6+CN3DOxA4Z/z9DWyIREHlTrRhpsmrS05qIJKmCOWWXISVJa9TXyyGaas mmv66iomkZ3Y8uxJP19qLdWNZAc+fXtwm0qyECnQ37KrcgsaS46SogD1CvFN5NTQwNJdtDIR5I7A 3U2t/X2sRnDDPb0QOwagAp1tIfy8FxuZ6wjzK1KyT02Vx1PUo1nV55TFTo6xt5QsiWsLDgH+vtRO S5TSOmYgp1I3HorP/Cl7Z8e7/g5sfKxIsL7C7OhyFPSGIaqyGfCSYyoq4pCgeOCBpgLaruXJt6fS mhKiYmuadN3SgRjTXB60HtvwIa+OSKkORr4ikmNxjxM9PVT62Jmq/oqUdEq63DEB7WJAv7Xg8eim Q0UktRfM/wCb7esVUJXmaWonSVzLPUzzKAY5JZHeSd00AAxluBb8Wtxb3StSacenBwUAY66x8VXV 18cKJMzTMU8a82jDxgABmHKngf4+9Yp1s0ANRw6fquniRqqRSimJbh5CCxkjqKZJyinUrFGf1W+o Jtb3sfb01QYFOseRnWlmnWOKnKu8ZCiigeOOxJAvKrEowuf9f3Wvr14Kp8uoVVVxPTpUR2as+4qF aZadokEPk00wgMbBCy29Vhxfn3b5Dr2gDHl1zokXIJZpG8peOzxtrJ1qjSaorgq8dza1uPr70ajF OvFACT5dSRTU4aOF2r4GDTjzfcCSO8UZl9ERiQoWsLgOdN/e6inDPWtHz/l00Vskr0v280ssmnyS KGfU8bI50o4e7aGBvq1H34NkHqyqA1R03UjiOQxzaFC6ldW5LagAVvcDk/4+/OK0I6d+ROOhB2Lu KTb+WSmlkZsdXMIwNNwxdrQFr20c/n8Hj6E+yvddvTcbYqMTLlT/AJPz/wBnod+3vPN3yLvi3qAv tktEuIx+JK4ZfLWmSp86lSQGPSi7mgWSLb+Risysa+md9X9ftpYl0fggrJq/IIsfZTyszI99bOKM NJp+0H/J1Lnv8LXcbHk/mGwmWW0lEqh1NQysI3Sg/J6+YODnoCfYw6xp6NR1VRR0+0qSqEISaumq pJJOdUyQ1dRDCSCSAFAIFrf1/PuOuY5mfc5I9dUQAAelQCes3vY7bYbTkOxvRbhbi5kkZm82CSui V9KUNKU9fPoRZoYqiGWnnRZYZ43hmicXSSKVSkiMPyroxB/w9kSMyMroaODUH0I4dS3cW8N3bz2t zEHt5UZHU5DKwIZSPQgkHrJ7r091lgp6iraVKWCapeAQtKkEUkzRrUSNHCWWNWIEkiEf7D2qis7q aJpooGaIGlR64x6+Y6C29868p8uX1rt2/b/bWl7MupFlbTVakVLHtUEggaiKkUHUaSSKEyLLIkTQ StBMJHVDFMhAeGQMQY5VY8qbEe2jDMG0GJtfpQ16Nod42e4tRfW+62z2VAfEWVClDkHUG05rUZz1 ggrqarqloqJnrqtioEFDDLVsutgqtK1OkkcCFmA1Oyr/AI+1sW0blKKraOF9W7R/xqnQR3b3U9vd kVze812pZRUiNvGPGlKRB8/Lj1jranGwSSx5XJ/wqmoKuNayqhalrVlUU88k9JAsMsvkqAo4YavE 63Kkj2Kti2AwmS6vVVjQBRxHzJqOPACnqescPdn3utuZdts9l5JuLqOF3LTSkNCzBaCNEIYNoJJZ 6ha6UHAnpDNvrYs2TzUW38Nmq3FCGSLG0yvPFLRahqmy9NkWElWasoll8oUR8lBYexYAgGlFAUfL /V+zrHK4jvZSJryfVMxqWY6ifkanPz4/PpFLu3N0SSxJNQYXGOyV1UK3IPW53KFAWxc+RrC5qMkK RpkkhplCw3j1FTYk6QBK0oF49OC3RqBVZnp5Cij1xwFfXj0js1uQ5OWWorK/LZiVqlZ0iM8tHj4a SFgzx+CwV5JmGq6iy3/JJ9+Y148elEVuygKFRBSnCp/2OuRzGWz87vjcIrVNRTinqJqahny9SVQC VbTSq6QA6AGHFl+pt70WNSfXq3gQxACSXANaE0/l13Nt3dE9euLzU1Rj1q5aNKha15ZfC0savTSP jsZHUSO6w3KRqhb6jg8+29anOoED8+qi6tVUvFRqV4D045PQzbX6Z2/BPBLm8y9RTxRyVlacik+C xi0Z8aIIIHdMhXV0sj2SBpIAbXew49sl3kcr4gSOnHixPoBwFB5notm3OZyRGoQGgxRmr8vKg9aH oP8Atfae19m5XBzbWr5TRZHHR1T4/IVkNTnqOaCd1p8lkIIVCUi5NU8scVyQovwHUe33FNIWuRXP +r+Xp0Z2NxJcpIsydw86YNfL7R/m6//T0FIo9SxmUyGMOSw55sCRptybj6396PnTj0mJoTSlenGb xqpMcKpcRkSAFU/xAtcm3+v791TOKnqJOjrTvM7gGwVFB/V5L3NvyFVrD+nvfVlALgUx0zA2/wBf 6j/b/T3vpSRXpxpxTCGeao16yUSFFsBqZrlmP4CqL+9HVUAcOm/UDNOoclwt/wAPc2vyAW1AH+tx b3vj1taavmOpUCu8KKByrvpH6SdY5NzZbDT/AF964HrzHPXf7ulyASzoSfp+kMQCvFwffsfl17OO l9TJSQU+MZoIJUlhLUjRPrWTxqHqFmS+rylrkkcgj2ySat1seXWPcEniho62gCOKCeSoIW8kKpWx gK+rg3Vvx/r+9LkkHz6vig6DZm1f65uWP9STc/717eHXuuHvfXupgH7aXJsqXueQC30AH+v79w6a PE9SaiNRFTyKikiKOVyBpL3VQUdQQTbSTq4vf3UE6mqfPq3pTh16cRFYBECGSEJM7ACNvSrDSbAl gb/7D8+9LWrV4V62aFR69eixk8kBqHBSH12cgX1Bbj/HSzce/FwDQcevCv5dZoMdI0KkLJrk0HQP +Oct7SRn+0VUeofXn3Utn5dbpXPn1Ekp5GZ1SGSMJcC4Yll1EFiACLk2vb34MBSp69w8uoBuCfwf zbi/PtzrfXVyfqfe+vdSomtHYX1NqX8/S6Wt9QPofx7bb4uteR6V+DxULQvk6mJKgNYUsMiHxnUd MtRIq3EhVzpVePyf6e22JHaOtjPHpLZVzJkq5y2otVTXawFyHIJAHAXjj/D27H8C9bPHqJEQC9/o Y2B/2Nv96PPvbcB9vWupLRhoXldiAh8aWFzq0goW/wBpcRt/rH3RTQ0HXvz6iiR7BDJJ4wCNIY2A JJIC3tYsbn25T0GetU86Z6WlFh8cVo2DxVSyUb1E82saIxJaIpIoYmOWKRiACA3pP+v7bJYkjpM0 j1auM9OU9NiaNNMCxlgzaRZXBW4sWIudIIvz/X3444nPTep2IJPURp6VEpjBCryiTWQYwI1jpYyV kYG2oyTSA888e9VHl1bSc5x1MMsckcUFTMxaVS0kcCaSvkIAMjkEWC8kf09740BPVacSOt3r/hNf uzB7/wDgN8pOjK6nqKir2N2pQZnBzQnxAtv7bdTKWZpfQUFXtoBiv6NQvbUt19uV8Jlr59KLaVlk UcDUdDN8n8ZBQ12LoYoI6XKnHztNBSEijSsp7xz00UyFojL4VJZ1Nixv7KZZVWRlpnoc29tJcRhl bHVbONqKnPb+xGFQSxZaHM4zMYSreokpZqbM7Troc9QQirivJHJWy0ax3Xkl/wCl/ay3uQUC9F11 BLDI1Tjrdq6F3w+68b1NvTHYpMPQ9ibap8zksbLUAT7dylTj4xLRwIPIKjy1UDF/VcXv7clOpaDj 0gNXOlh0a7dFUtXTyUyKXeZPHOOTL4hYswj4skq2Gv6WH+J9pKevSdoyrcMDoLoEehocni5yRUEu Kd5U/YfHzfQRDka4Abc8i/twAUFPLj0utiBIB5dVxd29L0tLvefsfARGWqwtI8OYppk8tBkp6lDD HVy06hkkOhlV+L+/UBKk+vQ0sLzwaUbrWO/mY9X57C7owOfw8NBPS1NVDlYKCriMtDAa+rSTIpHd ZAiQSknT+AQPZPayy/WOBQjxPy49Cu8SO6NncKcqqk9Bn2L8Js12t1Di+y8HPj8nuqfC0lDTUGNQ GKgShQsV0BEVRMJLD+tvYk3bliHeYmYNpnCgjgB1LkXuo+2cvWuzbXEBdMCGb7OHl0VTpb4x9u57 eW3dsbr62GRxwyNNTZcsVimXGR1SivcJIyNGTRq2kkAX+ntBy1yVLatJPclNMYLZIFdPd6/LoJ7X zxzFtFzLdbkwl8T4Ac0J4fzp0MPzZ2X1X8YqOXbuwcbSZxM3I1Wm35YY5MphYWkIVVqEQuwVTz6j 9PYd5guJNylRLYVZyMenUm7R7gusf1W/WkRC8eHUn+WRkM72bvSpymTiwG2uvOrcpRbsqds0L0VH v3s3LVlUqY/bGJrKh6eSOkWeltORKvokF+PYw5d5cFvaeNfNS6BqPOoIxU+goft6KubPfraLXbUk 2vb0CiTTgGtRx8q9XBU1bRfH/aGc+PmwY9s5Hc3ykzWc7b3Zm8SsVW3U0sdZVY+m2dVVUUOgZYUE aySEsbtq9R9mN1PIqtbBP8WJavDz0mtPP5fYeor3rnSbmu52zdondLmP4eIGQa06K7t7qHpbae88 ZWBJe0O1sllI3getQ1sOMq5HOiyqsyxohN+bW96i3qwnT6C2gC3P8RBr9tfLorn3K9YVu5SR9vV8 HQPVlbg6Zd2bkigqOw8nDT09FRwxrFQbcoahQkdNGUspmii5CKbn/efZdd3UoUWuqqr8Tep6Bu4b kTNNDXsDUHp1YBR0uL2/tSorzOKyWbVTPlKkWnMwXVVRQg+oU6SLaw5a1/p7I0d3lOKAdBt3RWZq 8egdwG6/udvbRzOLSLNGuqax6eQEPTyxtmKqjqJWnUskcVKsTEMTpVlsfz7VkFVZ6dJnuQAFBz1T p/OK+UjfFToenyuDyFXQ767krsltnbLyxgyYfH4kE5dqBICGoJ6iNrLKTrZDfgEe0ElywbtyOjKC 3V11suKdaImV+RPaFPu6Le9JujIRZyHKNX0tWsrSRpUQSsYVkgYsGESNyGLFvybe1tufEGQKmnRH ujLr0pinWwJ8PN70X8wfqndmxqfHU9X33QYSOnhwcHqjydVAWnkraHGkeatqM1Rp4KaGI3FY1jYe /SW7Rscfy6R2zeJj8XVUvYOIr9o5uuxD47O4tkrcpSz0eaopcflcVU0NdPRVOEy9BKPNj8rjqmna KaJgGVxzx71HIUrx6UyQNpL0wOu9gtUR1VbmJIqiKlxyPJJV1BKCOKONmaaINZVuPSLX49+mlD0V RjpMBTNegV3v8os9FkZ8Xja1oqA1AbTBqXWsbMglkF+ZHH6eQbH3qJGdhmgHVxIV6PX8LvlPXf3g p8a2Vmh+40iUlmYhkF9JI+pYA/nj2plQMOjC2vfD+JutqXqDesG+ertq7sqJKbTBkKjDPPHKXRvG wMaVMhB0TNGA6fghvbRQoKnI6Pbe9Vsg16jd47D2zvvb8mG3bjFGMzkE2PpcvCup6SvtaGWZDxLH pN9J+o9uwyKaqT2no2t76SI1iehPz61x+5Pj9m+j92ZfCUKQRkVL1tNUSRA0WUx00uqNqaQroeKd W0mxut+efbw2SJ4pJLeniUJH20wP29Caz5rvbYoHmPhAjVny8/5dFJ7RwW2szhEr4NgpjM/SVBav r6UlowgYh3X0qrED/H2Erm25pgjDpGBKOJHQ5seYOUt3bTPHVD8uizUmJ2rFXM2IyEdbVvVuZ4ql EJp6icIsigkHiMqLeyyNt2a5FzfTFpxinyHRudq5Lkm8OONQCtcEf6q9HF2x8ANib821Dnv7/tj9 xZRUnqKciIxReYX0KCbcX9yLtUsF0sdo0pE0gyf5+fUf8x8i7DcXBls2GscMinWDtj4IR/HLYGI3 hjN7HPy7jrXoWVfEZKZdZUOUiJdUFhyQB7SbztwtIS8UpYk0P59e2rk6O3K6Tj5UP+DouuL2VuXt LKY3YWRqzJR0MSwjImwk8MZJ1l2NiLPb6/j2T2/jXSQW0mQo49CS05LjvLiQPgA+f+z0e3r3pfrD rSikpWr6ytysNN42dOLzIhcLIykAxlh/U+zV4re3iRVrqB/ydOXeyLs70Vu048uhO2blsfnPFham ipoaaOsZYpYojLM3qstyENySfZlZXQdArAD59JnZAhAbFOhoTZdTkaLLUVRiaNqzFVKwwzmOOJwC oKXVVDm6Ee6+AoB4dRjuZA158z0e/wCIfVFZTZHb1dkoRHSitjKzRyCM0cSnR5ZqlgyxOwFojb9b Ajn26pCrSo6jrcatIQB1sz9VUlJt3BTpjMc8FHRStlpI6qYCSeoyMEUU8k8vrM8rxRh5Q3IPPHtB O5b7Oi2NNFV8/PpaYnH4DCZLMZSnEaZPd00dTmY4kKVFfkKSlWlpJ6zSzCedKRFDMbekD2nK6l09 K4gdS049Fm+VWy8X2z073F1fuWkWr25vvq7fOBybKqStQJWbeyEdHk4opFMIqMRXxxTxt9UkiVhY gH2UyQKkhOAAehbbSAwgdfPJ2/USnA4qCpZpTU00X3cjIpudFppww9LeQgH/AGPty3OgtGOHWr8t JGG0ivRlercatVNjaCCN9FTJHCVEhBSJmuwQ3ssjxi/9Bb2rUEsKevRIcA162iPh307ubqHq7EZl 5YZMVvWCjr8dFO0sUsORSvjm8ks3MZWOlAK6betSPat10UHr0zHIGDEDI6JV/wAKRN9Ntv4h7Bwc Vcs1Lvzc2Uo2gFKWijrsTjKSuqHeu1FUkeSvRliUXaxb9IsUkS/rOSvWrlv01B60iKZqDZ+xlok8 Lbt3kWOQqQQ9RhttqoIoo5BxTVGSv6hw1m54A9q2bJpw6I6NPcajXwI+Hzb/AGOguq5GjYxAqH1x SELbSihl8cYHIIAAPFvp70Bmp6WD16zYyoiOXp5p2mUPVIzyRMA4kWVZfKgI9KOyci/F/ewMDrTd KaJYKlMqAHRKfEZ54C5Da2jmp50LyCwklIJNuCL3H09+FK9Uzj7R0zZUtIga4Hr1MqXdgFZhcLwN On/H6/j3QcerDiesNM6LU08bwtNBDVVqvAXaPUWbyo7lGAXxFQ1r/UW92r+2nXj8jnpyxNRM01fH DVUWpaGYiaWJUvpgEcX24WMOrIV5/wATc396zjrR+zqbNGy09NVrMr0/3UMYRSW0Crx8obyIq2Vm 8XINm/wt736+nVfMimekrXi0pCAKFhY3Pp1Kg5F2sWuvAt/T3tfn04KU6b62JIp5fEwaNZNKXJ1l GUOrc/VebA/4e7qeA62Mj59TKQeaNrga6cpKqhwrFSbO6chtStZv6i3HuhwetGpyOlLUQVFdteoj SqlqXo8pJkzBUSlmijemcVTQs5JfzMQ5F7ko1gSeUwjRLv6gAAlNJ+ecV+zh+fy6Ojvt3JsMfL0x LWkdz40dT8BKMsigej9reVCpwS56S9Dt/N5It9jiq+oVCiySJTSiGIylRGJp3VYYdZYW1ML39r/l 59EjTRJTVIB0bLAwS7f2zhqKohElVS0lJDXU1JUUdVLQVNSy2WsjhqHeHXPNYWDXP9fYGu9jv76/ uplCrEzkgk+X5A5p5GnWVHLPvfyFyxyfy/tWu6uL+G2CukcJAWQDUwLymNSCxIqhb1pTp0rK9qSk aqmego4/I0equrI6ZoEjjWR6qqhqDTSLECdCIt5ZJLAD6kKIeUTxuLug+Q/yk/5OijcPvOFgybRy kddMGWav/GI0z9msfb1DrtzbUSkxNJFnsjU5usoqtsnDgMamUeCv+8LYynxUAjm1xVNARrknYWYN ZRx7NIuWNrjC+IHdvOp/zU6AO4feB9x755DaGztIR/BED/OVpOHyHSVyfYEppcdS0mCySw4qTKyU OZqdwHbGUqJZ2aaSSWKjj+7D+KnCKsx0lYxotb2cQw21vCsEUarCK0H51J+efXqJd53HdeZNwm3X ftya53CQIrMyhsKKKKABQAM0UDOTkk9R8h3RuSoh+xinwOFelo6wAKxrZh9xOcitNQLQU9fKla1R qvO1SHeV9UjKAqq8HA0kAUAx0Xx2Qpp7yhYY4L6VNaevpgcOg1q+yK6th+2qZavRN5XyJp5BTS1k tmEDNM80p0wpI142BGokixPuxav2dPiwpSlBTh5/5OmyDNKDHS4fD08jVFo43q5KrM5CV5HeF4Io 0URGaqMp0KIwSCQPr7r4hyAuenzbLUGSTHGgoox/PoQl2F3LksOwp8JuOhw0X2zfbvTxYp0hqnJU xY6lVa+enpKaRmk8nKRmxsSAb6ZSM8B0wJ9vjkOkqZDXPHh8zgE/4ese3up4srT1cVSu5qSrpaiS KatrsOmG29IIlApKKCul+/yNVkatrv41jjKRJyLnhomlCB/q+z/Z6pNeyJ8IShHrqP2kCgAHQs4/ oOSi29Vbjr8XQ4jFVcdH9jPkcbX5TN1ZoZDPlmx1LW1Kx4il8UQLVc8LkxuNCj6HwSVl1UNP2fmR 0gfcZDRfEOr5EACvCtP8Fft645Sp6+pJhIhoqeARCiocLjKisytVUU5lVairmkw0atLPUVOlJAyR qka6bWNilrK7FYlIHmaf6uPy/l0lU3spZIlOcliAPWg7uGP29CFsrA5bdLSz7bmShqhJTTtXZJIc ZkHWJb5Sg27jZZRkKnHK37s1dVyQPFGPGqAXX3ZLYOAJAAqnA9fSo4Y4+nDj0w0Q1UmAKLwANa+h amBTypUE049LGl6oSjOGqa7tPdeV3YDJOuGosFhshjcRDkFqIQKqT7TIx02chDahNKXaJmDKAQB7 XRWkMbCRABN9nT3iwICEtEVacan7eNRj1p0EHdx2PSbF3A4ovs955WvwcjpujNU829Pt462Jg74n RUZJopKGFZDJM8Nka2ngKbTsrIyr8f8APow20Tm5jr/YqDw+Hh5eXE9f/9TQoiQLDDdXjMrIikCx X6i7avqQR7qekROTnqLXyqrEh3ZmOmxNgmk2uq20ktbm3uw+XVkUny6a55zIukk/UcG1gFFgBYcf 7f3vp1Foa9Rl/wB8Pfh06epa6CLSXC3Tm1wGNybgH8ge9npnNO3rjN+hWsSdRF78C1yB/UG3+8e9 dWT4j9nU6nXXBEoOqym1lb/OF20oTY/QG5I91PHqx8+uJJSW0ZUu2mMKDqUSBwAbN+NQuL+/AVGe HVTgjp5qaujSJJ6b/Jq9mWOWhgLmBI0ZdYKyErd9FyR9b+6AGtCO3162SKV8+usrlYaiGdaCepgh eJEamqGYo0RcM1OgOoXjb6G/A4HvyqR8Q8+rAiuOkiTf/evbnVuuvfuvdTtJWIAkWsL/AE/WBqUH 88f19+6aPE06d/saw0r1AjlmgWIM7xxFo4UK6SHZLlU0i1yLfX22SK04Z6sK9RKeSTwNThVkViGd GUljZCiGNwCbaWBt/tPvbAVBPXq4OOnFXEdI8RjXiARSF2ZGSpMrAQFOLPE6XuOeeTb23xYUPn1v gM+nT5f7PEUk7IZKpJJKaWJZ2XUaeZ6d5FcI1gjRgC3FvdcFiRw/z9W4L1GleCTHzVqEoY11qslx JDULK2pGt6XFwAD/AGr/AE9+pmnn1759JSpplSnEx1Bj4QDY6XZ0Jkvf+2WBv/re3FarUHDr1PPp s9u9e6kofSluSGuR+bB1/wBh9PbZ+I9a8+hTevo3o1dZoXpggiijjJTUVjUyatFgvi1c/jg+2aUw ePVvmOgpqHMlRPISGLzSMWH0Opybj/A39qVwo+zrR4nrlCV0upUF2MZRze62YhgPx6w3+8e6v5en Xvy6mOVSNkuypOgCOQPGXiUaxx9GBIsf8efbagnupwPXjxHTX7f691Moq6ehlMkJBVxpmha5imT/ AFEi3Fx/Q/UH3oivVWQOKHp6XKUTXkWnnEjhlaCL1BIx+lRI3OhV+lh7b0EfZ0z4bDiRTqMK2qaU SJRsQIyiq5kAAdrq3Gn6tY/42960gcW63pUChfqXGMnNTyTJLSUyO2iQ3/ebxyG7EkO3BW3H1Hu1 APXqtYwRUE9bVv8AwlV7Tp4O+/kt0bnM/BFT9hdWYrdmBp6yaGEVme2tnosdWpSeRWnllXB5x5NK gLojN+dPtVasKuhFOtEhZIiBQV62Pfkz0dRx1GVoshTsaunw0opYbq1BPQhyWqKarhVZoKs6rlb2 P0N7+ym8iIkIAz0OdouaxKS2OHVMuZ2JBs/Kf3zxlJ/EK/HVdScaZ9UxoJ4S1NJI8aACcSKGEZsd K2I+o9p7YmNyr1HR1epBNCTqGrq1z+VD8p9z53LZ3ove09bPXbfaXfnUNfk5VAixtFXRzbv2DEs2 maWGGJ/u6ZgX0R6wLAez9NMig0z0EbiitQL1spM8FRItdj0pyTLTyzM+pj9nPDK1TCoLXJCyIVP6 Vt9OfaWRdLMPLpOTVW6DncUkUNbTgXlhdZEL8KoKEkAcASj6XF7D22AGNCemkfQwFT0HOQx+LNTJ ipRHLV7txuQqIaWcQtFVx0NzWBUJFpqYOrr/AKpeR7dki1JpHRxbXhWhr1TX8v8A4UZHe2Jqvs6d asYEVNbRQxwGUTSNJJWJAbc6XIsVBsb/AOHtELdo3ElK06FMG4kxqC3l0EWx9j7m/wBl8XZG2cPj cVu/aFa01ZR0cBo62qpEdUjirQVYyRU+kkG1vZ+b/XHCzt8Ip8h0ot78RuwrluiZdyU+56DL1uRw 8sO2dyz42locllKGHyEThkWQs8JUJP6Tob/VW9pGlEoZFPxGn7cdCCD6GVPFmk7wKj8s9FHqfiFu /wCQuVx9BvfetJgJaWoY/wB48rTM+flx8z6jKzl1aQEMAQDce6w7LaWulnlBK/LP7ekUm7CYEFsH oTqP4RdP/FB0r6Oap7N3G8IKZWnlqpMbRwz3vUvGrftzqwva5Ye37ndHtZRbWkZ8EqOPqePTS21n MhuZZB4wx+Q6c9u1eQ3flarZnXlDPhZq1NeZ3vMrQ/wpSvlkSlll1FlaNTGbH8+0iKFmW+b41z+Z +XSWXfFhBth8B6O78QOoNnY/suHa22svNu3fldE+X3TlJvFUQbW27TtGMnuDJ1ziZKCBLmOlQ2kq ZzpT6H3q5umlBCggH+fQX3DeEbg1ernxUYjAbmoNqYv7Ojo8XtfJZzF09V6q6qpKKOOnky09QfVW 11VNJqax1KtlHtpC+kL0HZL5pa1OK9J7vTsXK4jH4bAYspA+W294hP4/G1Nkt0wyYzDyRQSeqKSK nY1DE/kgfX3tI1H29I2lJNesG2kg2Ds44iilWuh2RgcfgKWGWKGFa2skpJawVBc+kUlVlXklYkfr JHJPu8mUI6qjEupPr1qm/wA6PfZ+QGwMVV0tBR1G7ujc3lf9IUFHXSU9PhMfuWYR0GUpse7SQ5Co y9baKQRBDCEufSfZFJA5Y0Ip0JorlFShxjrVFdKWpSOleMIPPNJ5BwplJ0qbj9J/AB49rE1IEzkd Ed2BLMz0wejw/wAurd+9eo/mR8eMnsfMV2Kr9y9jYXaVfHSzmH7qiz0/2+iV0YaWgnZZEYepGW/s y+sAQAiuM9VsbL9V21dnVmH81qBs98w+2N31O3cVtbMZ7LU2U3NittVHjxEu41pYsflspEj311eV koRPUPa8lRIzG9/ZXLNrZQozXoVLDGtuQaE06r53rTTYDpipydOZBJXTzxmiMl5khQ+KIyEC7i51 Naw9ulagU6CciDW1PXqtiuxQm88rSkVErl/KSSDJISQtrE2BB4+g92SRo6YqOmmWnHox3xmTJ4/I VNfHK8DUEuppFvrkU+hFS3BGv68g+1UdZGYg1XrWnGetuf4l5+orfh5vHOy5GpifGbhfLSU0KGJ0 rsXHt2GknXQ2thIsLxrHYA3ci9z7deumhXgOlMF49qrFDnox3a3YNWPjjjN70VS0sdBm8fV1M7kS /bg/tyhdF7vIX0kfj2XOqF8Cny6dFy5kZ2NCeg33r1dt/wCQnR+RoMlLiocxi6WlzW1Nw1LvIcRW 18AknxFbUof+LZUmQK/J0NY/19rIL5reue3oyju9QpXPVAPbWyd5bFqstt7PY2poIaATwNTEnxT+ op5qOfSUqaaQDUrLe6ke1f14uVK1x0bWu4m2j8OvVfmOwH2m5WhTFP8AbS1pqZql3KFQzi6DjgKP 979ln0wWQgJ2k1r0pi3GSMaVbBNejvYDsKh279u/8ZrYYKeCGNaYTv4wUQAF1HJUMLf09vMaUAY0 6MotyllpG57T0sc32NHvmjFJkMutTRkMqQzOSukjlUBJAIt/T8e1iksoBNR0Mtm3gWmnu4dMG1MZ tegr1raWrpKaeENCgiXWzG5IGpSB+f6+2hBGsjMAAeja55qkZ3o3bXoS9x5uOqNFiMDpqKyrX/KJ 4I7EFgF0F7m4F/8AeffpUVwEUVPReu9fWs6Tt2KK9GR6f2pJiFxEUuNCVjT6qmv0BihfS1tTf2gD 7ultoVRpAPRbebhaoCNXQ/YfalVP3bW4mjq56ymztVQQ1TlkjjjnZAzKhkOlpgv9kAk+35VYup8i Oo73K/WUsAR8uruuidkYnYvXFbufcUNBjcegjqZ4K9Y6TxUMU0ZVrSfty1NdOoESfUH8XPtMQVFC OgXcs1TVvPo6/ROa3FT7QyOR3FLPWVG73ymfhaZA1Pj6GLVFQQ0lMCRFStSpGSpsTpY+26ADu4dN IKmtelPszdc+5c/WyyQrTUFDHT0cckA0feVLoqpMCbBJZwpYqLaU+vtO5YDHDpVCaNWleimfzEO4 4enfjD8huwYp/BWDrzcPX2zoYZXjnrd3b8hj2VhHpEDr5vscjn/uGC/RKdmtZT7K5G1PU+X86Z6E FvRkGk8R1oy7c25SY2joaKeWSWBKWKkh0SOFaWljUaVB4PlIvY/Vve4FbUX6dupPDRVWmejfdF7c qczlp6HHJEtXR0/3sb1T+JFeMXFM7/VHqFYqG5CNa/swh1F1x59FE0tAcYPW3x8asbW76+NfV2Ly KtUUO2ca0OUq+YnonaQv9pMhJcvFGmm9wWtdbj2ouThSD0XI1GJHDrVY/wCFHWSyWV7Q+LfV1VuS vi2ph+qt39l7upzJGkFDkK3P02BpBRUp/cSesoNvxIrupL3uCdJAaiIOtiPPpq9mZVSgrIaAD5nr VnyMtM9VJNGjw05ZpoI3ZpGSFeIVllbUXmnWxbVzqP4Hu3Gp6oi6VCE58+kwPLU1EhazPIVNvpYa /oLcAIo/23u5ppFOr/Z1Lp08VZGjfRUnBJVmBvGbMCAbg/QEe/fhJ8+qHI6eLKlHOroQiU0ztY3d RUQARyaSQWVndRb688+9AUP59VHHrusppFsHF3NM40fkkiNkZQoFiAbH3XgT1YfLpuiVik6+IxkV DiNiWK3eJX8b3vruBqF+efdvIdePEdYqZHheoZlMcgRF13H+7HAIsCeZNQ/1vejkDrfl8unryOae GGJzp+6x7SQWA8jxisi82oAXbSxHJvb3716qOJx0z1aXaQMSChnUFl1egxXQKCLhbm3vYNOtjqLV qDCjoCfRBrk024enjPiPqP6WBt/X6+7D4j14ceoUEjLKjAgMCALmykHizXuAPdmAoer8OB6EXA56 DbizvF9lNUVSiKaSaY1RCH91Y1oo6Sb9lZeXdWBJ4AsPfkpgkCvSKdGm7QDoB+z+denybsapnMpq ar7+tmIiigjwqPBTUzIFmp6WKtqWLyPIdKa4z41WygCw931sfLj00LMjgNIHqf54/wA/TfHlN25G lNNhMbuNqGtnZ2KSS0kNZUSMyxqBQwUUUkdPGfQisVUm5vx70XoKswA62YoIzWWZagf6jmuepB2J vp4/PkafD4eOlREeuyVfR1Lwx0yyKZJGSTKzpGgQkkKt+Dz7YW6iZgFcmvyP+Wn8+mfr9vqoR2dm 9ARx+2g/1U6Xm1+mN17neFMZvOjhrjDDUZWSqp8zicDjKWamkqcfNU561HBKs2i5sg8diSSoF34h 42rSD51J/wBXn1U7hAh/3G7AaDhU0OcZ/wAPWGm6OpzJnZKvcsG5Y8XIIFl29PSLT1+SddEFF/Fs g9QQ9RVOFsqFkhVpGA4BdEQz3YB62dxNIwkWkt6+Q+wU8v546U1J05hcLSzbszku3cLjMJVeGvos imX3PjDI0gMdCaiOXFNlco4b1rEFijRbsLn36lG8gR5cf2/5uk7XssjeGjuxIwRRT/loPzz1ANTR 1M9P/EKel27jqCnlTG4PBbWxdLWVMAu1LkK77PE5POlatJC8RmeSRjyrD6+9GQAlWBIUeQHn/qr1 rU1SqKzyHiSxIHqOIFfX+fQ2bKl33jKSPKbH2hJjftnpFpdzZ2DEbarKhoY5I4afGtuVa/Kyy5OK QgMlKss0osulV92RpCgfwgor9v7ft9B0mdELESSqCa1AJb7a6aD+eOlLLkd17pqcrQbgwqYetbN1 NNW1k+7IY8M9RQRstDkaCPGimmq6yKsa1QJn+1RUOkM5OnUjhsMat6evTPhogXRLqFK8PXjXyGOB 49OuA2UINuI2+e3q+q24Gr/4PtPb+M29snLbmymhjk5o8pU1DV1Jj4hIjy1rCNmZ9aFgNJbjyKCg X/VXj5fPqzSRhqx21JfmS1B9nAfZ0FVZl9obXhzT56LPUcVc9PMdoZHdWR3MNwZaSkZqR6jE10pk /hlBDAFeWtFR5GBaNVuoF66SfEc5/Ov2/wCXy6uDLKUESqaDBCgUFRXPlx8qfPpv2fg917qp3zm3 9uw5KtWpFe01FAlDTYlZkC42LJpPj6TGQiapCLDBTuzRx3klOq3uja5FohAHnTj+Xz6vM6UaLxKe RJz9tDXjSuT9g6Va7IyNOlNVbp3HtrD19Q4pIMBtN5svn5EeSalyNZW7kSSDG0kKzry+hy2kxqST 73FbgHg1eNPU/M8cf7HTJMMQ0xVb1J4D0x/k6VWY2J1/hrnH4Xc+UzSLUJFjhurcs1FJuGoraYQQ U1E1XTRV7/veeVpmNIvkZDrI0e1LRqpyDq/wny68k8rjDIFxnSvAfOn+z0WnvTI7LotuUe2trVG1 nrabdVVPmxhEiStlqoaaohmSphgoqaKmo8dKEhisx8jlzzYktS6dOlePRvtqzGQyShtGjFeBr5/n /g6//9XQysVJlI/3USl2byFUNjJySoMt+BYce68ekHy+fSbrXDyqyiw0KLE3+v1PBNj/ALz7sOlE YwQeoTfgf7f3s9Ojz68Abi1r8f7Ann/ePfv8PXieNeHUpNYuwHkBADX5sbkhuf8AD349NnTw64u4 EWj66rckf7cj/Hj/AHn3s9eUVavkOniDUIoOCqpEspC2UyFVIKaiRyVPP+Hto8T1cnFPLrBDGZKy ERlGMsiFNbhEDA8FmJsEjP4/NvduCkdVrkHpTJSRU5VDiVySpY1EsTg1La1ss8YPpZWa9gDxYX9t E1/FTqygefSQyaBJyqQVEEcY0hKmIxyKxJJDckG30Bvzb24pqMnPV6U6bfduvde9+6905PGV9JB+ kduQL/sXJsf8SOffq14dNUzQjoQcXKyyY5I2fxU6xySwgEqySRqGllS370Wliukixv8A4e2GoKnq 46xZvb1LolyeJdo0Q6p4YXtAI5G0CaA3uiEScr/Z5HvQYjB4dbI6SbReGeB55DUinnVidGoaRIJG 18XlZyPqbkj3cHjQU6108UtYsz1KI6MIJqx4EkvpNPUzNOjqOf0ys3FvyPdCtAD8h1atT1EzMfih p6ewWSaR3lUA6SkQVtfH11M3N/6e/Jgk+g68cDppyNbXVUCJURxxwRTlYkRNBRxGLrY+sgoQeR7c QKDg5p16p6ZvbnXupcNkeFiodQ6s6k2DgMGZD/gypb/Y+2yeNetefT3T0lNkaqUoJKeiecq0tjaN pELw0+hTZfK6Hm30HtupUDOf9X+DrYp0m3XS7L/qWZf9sSPb4yB17rLCpHr/ALGoIT+CxBYLbn6h fdX9PPrxHn0p5aUNt3ESvTukf8XzdLJUeIkNIY8XIAJP6QxIxt+Df3Qk0xxoOma/ruCfwj/Cekkw 0sV+tiRcfQ2NuPbwyAenuuvfuvdclZkYMjFWHIINiPfutEA4Ix07DIxzBjUiRZjYh4TaNmX9LPEe ARYfTj/D22U9OHTRjI+Hh06pUY94liiqlURqqr5A0byuR6mYshsrPc/4X9+p8umyr1qV6sS/lW9y UXR3z16B3I+YOCxG4N2Umwc3n6ethhr8HRb5QbcnylDIUkheSkNYLCVCgUm9jZg9bmkq9uD/AKq9 NtXTWhqP8/X00d01+Dlo8XQ77xVFk8UKN8RBkJx5ck1PNF4KeoqAsceqplZtUp1FSfpz7euYkJ1D /V9nRlZzTR1UHH+qv+r06r03L8U9mV2fze4uu66auxGNljlymLrYWqaaA1k1QyRRwlD9tLMiMEBJ X03/AMPZdJAo7uhDb3byDQR1Xx3FQ4741919a9pzy1m3azr7dWM3lh4lq1o6eShEq0ueockPQHxm Rws80TKToIb6ce10DRhQA2etzQFlJI623Oq83Funa8MyVDy089AHp5YlLmamqF8tHUF1JuklO6WI P6QOfergVAbondihKj4unTOQUWumRpI1FBTs1Qrtdoo442Y6ovSFM1jb639pRUnHSYsQasOga3nt DJ5vIYjKYSvpqWSno43xYd/RQ1lJUfeQzh4lacU1XQSNTzR/RrC449qA5UZp1YT6fPpY02Mhy4ah qoI42RUaMzEaJ5G5RC7MlwrMf8NP1+nujEnI6WRbioIBY06IZ8jNnRbfp6PcO2KWppMxu6bIbPw1 LCaWilqsxUTTQvna5jIixbax8EMjPLNZZFT0XJA9pzrUkqOPHozivkNCrnHH/VTqrfDdf5HsSrps ts+jbO9fZCqkxmWy6z0U1QNyYuvmos1iq8081X4WjqIBUxlT/wAB2GoAhgLpXtZjnr025aSoErDo 22C+Hu1u0YO1tq+aeDN9dVuNpRSU002E3OIfsEqK6SpUrIK2gjdrRTU90kX1G3090nlkapZiPs69 HuQbVpP7eiSb46xyvQ+HyuYxVbLn8Uc1NhpsNnIpcsBk0XzlYJ/DLUSyLCo1KBoW/NvaSHcDCDGE 1GvE5PVZ7m4c6lei04A9Fq7Q3H2Pnsz1z1vsfZOMou0e2CkmI2Tt5Y44qLGQKaqt3LuqqJpkweCx 2PiapqBI6kIv9ePZjDN4wq65PRTNcyGuomvV1Pxu+P2B6P6d3btTbVfFWdkZLAxb33PvWtijx+Q7 KyaLkKGlFXUSyGXH7QpM/DPS0FMNMUEKRhz5izM+6Lp4dF7dzA16M9s3Z9Tu7EdUdjZOm+43NNh2 x+TgpkvFSQ1UglraeLW4DUv3VL6Lhla31PtlqBSB1YdFw7lyybi+X3UmxqOqZKWhSorM3iqpTKuT 8WFglp8fVRqhKtjqh4pYyxRCzDSwN/bS0DA1z+fW2OCeo/ZiZuDYvyINMaimyWKUS4OrjpK2ppKx 8dRuMewp1jZxVUE806y6GVPUCSTb3uZ6Yr5dXhGphnrVB+VzGi2N2JV5uSgmq+xK6KOtvLJ/FcQa CA1DRshWJq2Cec2AN9A+o+vsv1Zx69GzLWOua9a6dTjmos5V0U0EjRNK7IWsqX1sUEfAN1VgRz7s SainHoueqmgPRwvhVjKmo+ZXxinpMfW1dBtvsOi3Dlmo45ZRRw4inmn+6rJAp+3pI5wmuRrBCw93 AGhgx4j/AC9O23i+IrLWgPR/vnJn4N7d25HI1dUlJWZXL1JmpgzzVbpJVyiLXJISGjVXvq51XB9o wrhlxgdHgnkMUiniBjoqTUiZza+9th5Jga+hZKrBRykCFqWOBvMs9gJVqyfVGRdOLH6+1ZJNRWnR CQ1TqB1HquatxE/nlgeKQzwzEShlOpX8hjCgImpmQg3Fhbjn21EWoQ1dXVSRUDo6vSPXc1AmMpdW mfNS0rVD/wBmlp1ZXRmiA8up3N2ItYX9mtmTVzTh15ihQ1Xh/h62e+n9gptn4ibzSM/Zbr3fm+us hn8cjyRnG4+jy2IbbNJT0qtJJHXbiwa/cMnjQytUhiCGB9rpJU0kHj0hkTUtOnzq7bmXzXxz7O6+ nq3ymSw+7czueaGqLDRiK7NLUQ0n7kTeOKmMfijitqU3I9lhkjrJppUE9KM0APXeyMHWbd+NfdlT Ufcr/GM9SUdJBHK6VME5yNMpgow37kUNHDTgqUX1cnm/tF2Oraj3V6dD6SCDnpNU2z9hfI3H0+wt 3YqDK1cGM3RQ5DM09LJTV+Lq6HGvVYWsx1UI2VatUhJOsmNnVtS82F44XT9ROHT/ANQGNS2eqVfk F8Tt4dO9iZbbVZ9puTEjHR5/am5MbDKlJntvm7TNqjVlizOMN46umBYpILglSD7eaY4rx6VC+KDi P59A2/VO363FU+XgzkkNdUwl4MfNFKqlUJWSViyF4gijkMPx73oYrq6oN7ZWoSMfI9BNkMZDis7/ AAGiznnnKLIRFFUtFoYDUglWEqhA/IJHvQuXWnCvSuPmEKPj/kf83QxbJx1TkammxODqZMhUMjyz SUmNrKmKnWNgpikkWFtRZhfVx7VKZD3OuOnhzOlFUOK/Yf8AN0enaXTVXg2wlZuSOqi/ilO+Tp3+ 2qQYlhi1M7IIvJDH/wAG+p9tG5ETnFT0pXf0zV/2A9CSc9Xbaz1Lh1hmqpUipcjCJ4ZooP8ALIfu I5aoMi2RY3B/FzYXvf24l4ZCFp0VXW6PLUq5/n0ZDpbCSz7h2Tlty/cQ1X96Vz1TVAOZZa2OrH29 TEjmNjGIbKYrlQPrf2qJY0Jb9nRJc3DPJHSuk9Xh5XM7az+0ainy0FJnMPS11VlGo6IF4avLyxLS 00E0as0ZaSrlkqdBIWN7EAW9sszAEeXSKNmZ21NkdCZ8dN4VmY2Z/EJaPJR4+kjyWKghrFmofuaW hkdHmmpp4/KI0liEcKrfXydXNvbeksATgdKE8yCOhm23QtiMFLUmIrXZSsbK1LsABBLVtrpqaDSC ieKAgAWBB+p9ppSQrU49Ko/MdUkfz2RuWk+NnSGBlyNOWyvyTxMlZNRJLRwTUdFsLfubpIqqFpJW llhqaeIP/ZMln4P0JnodVeNP8o6O4mKshBx59ayEsstOIEpKjzNJOjyXCqI2vpESJ4/9v9D/AK3t Vbn9MDpud2ZgG8urVfgz1lXb5zUVJTYpY6uOogcZespKqohmQlROB9uh/c8ZawYCM8XPsztxgkrw 6STEUAPW2ZtvE43rrqHZew8HOYcvm1Ndlmlgjp55o6RQsbOFdoxThTp5HqP0t9fe7lwsfw8ekFKs evn+fz9u6133/MN7Z2fiasS4jrjAbF6+yEjB1L5LBYCkr8vjqUuSIaNMvlZDJb9cl7ce2Iq+GK9M SRgzCQk1AoPl8/t6ouzNQistNdNalZZyB6wzAFIS35CKbkf1Pt4AnNOrjHTXSSosxYkqfHdH9PBB JPDcE6SQPdiDT8+qscY6eaKEzVcpQ3WKkyGlBIraYqeEEurMQF9TfQ88ce9Dgeqnh051dJTChmkk iqpnjqFpkmhcCJFahYqs2pSUCzRA2/x9+4Z6qDnrjkZkknoCw0yFFE3kYh1lhi0MAVAvESB/vj7p 5nqwwD1AQKk9QgbxmMUsryqSfSFRNK/XTJqH6jx7sOFevHqPED5JptIEnhhlZ2tqF6kkSAWAAZVB PHvR4D7etjqfTy6p6OZpQpkaCfSwPjaQztHx/Z/Q354F/ehxI695HrDUlUmlDK2pxCZCQraRofUi AnkAj/be9+nXqdQBpNLGfoGEUTTfpv6E9KC3qeMEg/Tj8+7HjnqvmenXauyM7vTNU2FwlOklROIm 8tQ/ipYYZZNKGaYXAbRdgo9RUEj6H3cN/h61LOkKhpDjo22I6Y6xwWSTHZ+Sj3pk6WlmnqIMTV1O IwdL4KfXKs0n31bmMxOZFbx6fAsnHpXke7ADgWJb/Vx6KXvJ21NGzBfnT/N1Fgwu2sbXf7h2oMHi qWHJSYzEbYycEmfyplpHinqtw5hqqTIrTiMXWHVHEqk8WXn2KZ4dUeSRx+oCxNASRgZ8h0nWyuzo MPJQYgaDJS5Goq8ZTY3I1cwoKJy1ZWUDzL46NFjhUt42jjfxmRm5X2kPiOcmlD+WR/xfTDLcvIdY ooIzXGeAPr5/t6VuBoKvcFFR1e3Nr5XN08dFPEBTLFjNtUNW9NKsNPkJ8ikNTkaiWVkeVIYphAoA udVw9FbMweiE54/P/iuqNH4eoSOFavnknOaU4U+0VPWKpO88vDW4irbbmIqXWdTDRSy1VM88KJT0 r1kb00dPBFS06aViQVE762Fx7fEIZAjsaA+vH0FPTy6sY7ddDVdh+z54z/m6V23eu8nSUNGDuKtp aFxHRVH90MbHgqCokqFb+JVlVNuCGpl+5XwxrUTosYjUGxUce3UjC8GNQfL58QK/4em2lXU2mIHi RqNT8qUpj0HSX3DNtKsqFw64nIbkyqB6TEU+5t0ZPJYmkqKmdYarLxq3+T033Gk3IAEim9wBzSR4 4UOpeHz/ANXHqwkeNSzOFi89IAPrT16hbY+7wlTVVGNgzWTnpKiKjp8H1/jUkxKu9PMKmefIhEp6 iCnhAsHf1zNpuRf3VZmJoiValaUoB9v+rPWmMk6gqlFIrqc0/KnH9nl0MuPj7CzuWpKLE7JzudzL VcMlbSbwzUWM2zh4zA0tbIuRop5ayHLwQOkM0lPGqwq7Ij67e7tIxoWyaitD/g/ln8h1UJGqlpJV VKH4RUn8sY4+fS0ymI3zUU9PLujcexNr49aVKalwOzNu1uMgiSlppY6WdMlumrqZIo6MyuzywUck szDVqDOCfU1HgFH+H59Ns8CklFdm9WIoPyA9B644dB7mqfY1B/Dpd4Us26K3J4cVgze8ctTZH79J F8dKHjnijqcLBRUyiWR4dKwxoFYO7E+6GSNRU0p5VPH7R5DrwlkqdB00alF/1ZzjPQbZzeWxmnkw GJwsPklqaSGav2pgHyqZVxZZMlVVkwoqOWZC6imBkeONpQZLWuWpGeRlKrRKGpyDX5D/AIrp5Yrt wJtWmKhwx00+QHHPnjhw6kZfLb73NgdMtRHsrEUJq8bhMbmJXqKjeEWPUJNHLhaOqWM+sl6qu+4k UPwEVF1B2NO0AtVRwr59aSK1hfNZCaE6caSfmf8ABT7enFc9lsos9HQ7f2Nj8lkvDBHW7UytVWZW nrse8Mwy7VNVXPR/wzHB3khhpoYqN5HOrXYE2M7B/AjTvNM0JFft4GnH06acIGHc+M5GM+X2+tTj y65UXWm1qGpFbuWr3Bm5aESVMMmV3FVVzVlHBUzPT5CqwtOY4abExa0mm9VoyTZRpb3uUpAVaRzX yHn0+982jSiotcABRxpwB9fIdFH3/vGj3plaUUtJR4TBYyOopsXQ4+mkMFNA7mXWfI33NVU1DqGm mk0szH9ICi7LMWpRadH1rA8EbM+ZGp59f//W0KHljTTG3qDRIq6yV1EWPKglyPeuPDpDQmp6YqqR Gf0ABQSBa17A/m3F/dvLpRGppnqIeT/r+9ceneA65EW4v+P975HP+w9260DXPTqs5WlgpokXySmV 5XKAt6gI0s1rqqpc+607ix8uqY0/n1BnK6EUfqDPq4sf7IHP5HHvfp15AdTenTxTAILD9xoVQqps eJkCu3FwAoP5/B9t562fXrhB4/u4Z5bCCGb90MOFiFwwGgABhzp924AjrQ40p0qqSVKyCtRDUCCB IqulRJFjeaTyg/btIbWSKJGOk/W59tN2kE8erA1qB6dRNwSrV0VRWpA0aPLAuphbTd0Ijt9NVh/s B/r+/Lg0rnqwyekCfrx9Px7e6312LEgE2Fxc/wBB/X37r3TtPoKsFsdDEBjq1OhN1tf/AGk/7b3o A1HTPSyopBT1kVQKilMHhFP6ZgfJCj3S6NoeKbWRa/B5Htk5B6dAoR07smvzLEVjp5ik0kC3CAOh jnDCzKSkgDWv/j7pXj141r1A29BEtOJpo45neohmYliyimcTQIrqQx9TxEi3vb5NOrJ8+udbt6mZ nmoZXjqI5ikGk20MzNoPk+hu4IF/xx70GIx5deIHHpmxEE1RU1tdWyLM9Ipp2jZlUKZUkR/QfSie n6gfr92agAAGD1oDOfLrnu0L4EkPjLyzw2ZVF2CU2gFCLDToUXI4PvcfxdeHn6dIH2/17pzoUDz0 KmxD1MakEXHEtzcfm6/7wfbTcX+zr3+fpQZqldbVFIGiKAiRYvS0kZUESenk+Njb+tj7opHAjHXv LpGfXk8k/U+1HXupUD6Y5V/GqNvxpHDqbg/U6W49tuKleveXS8qa/XsrC0j4fI08dDncvOuZQGbH V6ViqslPIhCrFV0rALyTrQ/i3NaAile6g6Taf8aZg4oVGPMdB7Np8smhgya20sBpBW/BtYW4/Htx a6RXj0p6x+7de697917r3v3Xuve/de6V+1RVYzI4/cFLUTUeQxdfS5LE1MRKPTVuPqI6qnrg4B0m nniUrxyR7qWocdMSyU7Qevplfyovm3tf53fELbm/s/NRP2l19DB132ntmgpFVsbubGUlPJj83LFU SSs2E3jhzHUwG7BalZ1BvEQDAf4xCGHEY6etpQlDT5U/y/6uHDo/UE0HVuGzmT2/HQy5LeNXhXzM L0v3Zo0p6k0aSLREl/OIaw2t6f7Vvr7SspKsh49HdvKpYMDjoqvzJ+GeO+a3X+/aHHZXFbY7O2/Q ywbKqscjMuZojj7/AMI3RRm0L1FfVE+B47W/tfT2mWBwWOrIHR2bmIpQjNOra+i6OTae1tv7eqZU jrMNtDBYSr8jB3fIYPF01DUibQQuqZo73HF/bzBtFG49By7T9Qsimh6ybny8WLkzldXRSR4z7GWC aeNXeI+ZfHPE9mMsTN5RYj3RV0j1+fSFzwHTjkcnSbN2hicrLE32NFXYakr5IFMrY+LKMlHR1FRO FMi0FO5Hlt+nUC3HvfHyx0nNWNAOo+amo8XkY5ZshLBTTViolbSyiSjjqJtKKMqroyrTy30rIpAA Oq9x71XPVMg/PoBvkN1XP2H1ju6uauFS2FwklZsqgpXWnrocxQGd8ms4iKzVlIYJy0QThR/h7bbD N/D0a25opA49FM/lx4DrbZXVOc6kmrqWk7Y3C+e39lNpV8qsDiWqooZ92wI8THC016yHHuhYL5WL gXcn27Eiqp0t01camIxjo4vYKZXZmJou9Nk47H1e4sdTR0O8oaJ6Woj3BjKICinx8WQRVQ05oYyq yp9HX+p9pXWo+fWlqBQ9Fu+QOxNsboptu9t7SaOPYG8aWLPbny1TFCMVgMLQUcldk6mloWVGgyNR 9qyVLixkaE8/j20lurtWnSkXBoag16J38Veldr1XU/ZHzXyWCn3JvTu+rahwFY7TU+W2z0JtfcV8 BDtqj/zCZPcmRxyz1SRKktZTARlitwV0cfhrXGD0lJ1sMcejb74pZcD37R4ulkvtXJ9IbzocphQZ IJ8dUU26qPsDCZXGSW1IaCeodDDezmRrg2Ht7xVY0p1toSoBr0ZDq6DJ5TYmxayCFKCkkniWqmSR 45IpTFWvIRTR/tEQPpAjFlOon6+2iASK8OkxYA/b0Qjc2wN8138wDf8AueKrmZsR1VsmChTQBicp VZGp26c7U0hGmZchj8JRKqsp4kLk/j2+Iofi1CvVGDE8cdD98naGoo6fcsGMpZaXam5MfTU2QqAW NXXSx1by0sACku7SS6fK0djoPP59oblVIND0otm0uC3CvWqx/Mm6nzOUfb1ftPBino8gMpFNDbSY KmICVqOoDkvUVLgEqbAAcey5YxqpXPr0JYpIDHQtx6pRxXxxPYk7V7yVeBbHPLDlsvKqDG44r+3J NU+QLBBIBqCgsNVifx7WCFiNVKjove3DXB0sNP8Ak6Px0n0hjOj9h7j3vtqJZ87BJFgqeTISfa57 MQVSolbl1jVleHDUkXqAFo2ZbG/vQSmPPowCQwpUnovPauJnqOycZuPNTGpxyTUUWMrJCI4qujiZ QGeJbqxafUfSSLgD8+7hwAQY6k9JGmkJx8J6ATdeTo4N/wCXmxmQeeaSotHS28PhKgFldrjkgHj+ lre6UDZPSlYkaMal8uk7XnbMdR/FBQ0Qqq2b/KPJTqZPOtiSQR6tF/U1uT712/n0WvAiyHNejOfG XDx7h7B2vSyZGKhqchn4ad6hipp6aghH3FRIig6VcwRnSvHPHtfAxKVVft/z9J5iI6rTj1sw9d4v ++HVDZKgylNhcLnM9Q7gMtUq1ddlJ9tVlLHBR+YqssFHHS4lacSE+hgVH0Pu7Bm4gdF+vNDw6m9a YJMVDTYXJVqUEW98tvLJ5bxpaJ1JkWGIBDrliEEv7KcB5BqHI9opU0q+jieOOnAwqPt6gfIQUmy+ vdu02ODwYWPdeZOXDoFhanOHopMbXSsTrkE7BiSbgOpA9l9GqK/LpWkWsfLoF+i8XmtuT4fc+OeK njyhqq2vL+mkjwu555MPj6sgXkmqhM2qNx9UkZfa2IMBg46pJFoz0yd3bIzuael64zWGUVEm3K/N bZyjo4bB53Bq321RNVqplpcXnJYmp5hI1nBBsfr7qYgKmvTYGMmnRTO1/h1tjLbLwO7cVFV4TdVd j4q2twCyPDQ/eFdGRpaeqjfxFqiaNzD6isgCr9Wt72xdB8ZA6baOMngD0T3GfGmomqMhFT4uoWqx heXJ5F4gZqWnRuY4Q2nlkU8fTjn3e3CMx1Hu6TSwsvwjHVmvxD+NW22zeXmx+PaiixG3aPM1hqI0 WSriqQqzksRpaeSTTpEd1AJ4/Pte1VB4dJ4wS+RgdGx+Qu0NsbeG0dp5IQUvYNXhZsvhcfDLHL/C dsJH5RlM5SQkSJHNGNcAk5qCCFv7LLjJoOjGNtIFeif7g2NQ7v39gchWI+AppcpjMJn1rIRT1dDS RlWx7Bl9CS5KmgSaRWBCGQgW9sJq9DXrbSx/Z0Z/P4LFH+FvTV9OcZFNka3E1MMguKPHY6aQ4+Zk AZWqDBdXPHq+tx7NImeqhjjpNKQ2kqc9GO2rDuDA0dPgcvjquNc3VUFfmF8J+1FMJaaKaGOUsFi0 yWQpp1MVvfn2qKK2a0PSSVSXXQwDH0PVr2y8JQ47Z1VL4IoYp6H7aOhX0mg8oV4vMoCtFJLGtwL3 F/aeVtJoOHSyIMNIJyB0q6WSnGqhjU1SU/hZyV/aJVOLuBqKxyKSxvf2im+Hoytk8RiKdax/8+Xu yKs390j0Nj4Fqq7b9Jn+4sxNFUCafHPm6OfZe2KOogUH7Za6krMrUQqfURT3HB9l4iQgkN2k0+fz 6ORHopQ9oyeqj+hOtcHk90Yyq3xX1T49pRTnH4qNDXVUczlpXRqnWiykNwbXDc+zW2tVYL6dFNxO zSsK93W298NPj/srYOCwOc2xQ1GOweRix2TppsqqT5mvaEMft56mH9iI63PndRoKKBbk+1jKqr2i g6RGQ5rx6NDm6mOv7U3RVZHIVT4vD0mNjra4hlpcfjaanNdWaFCBKOlQLy4F3t7L7rUdIXq0dKg9 fLs+Zvb8Hc3yw+RPbFPWQ5Vd+du77zuKrFZZIXw8u4K6HB1kjAmKR5sTDC6ovpUkfi3uyqQoqMdN 0qT0WamoqSukd556nm8ksokgLNIx5NmW/rv/ALC3uwYg0oOvEACtc9OAwuPW5Stms8ckY8sNMy6S LsdSzgl1vxxfj3Yt8vPqh6wxQU9A7GDJzEyw1UJH2cerxVUXjYsGqfSCLG/1961fLrxHWcRPNDVw S5qVKepkgaR2opXM0samzemoIA0tYm5vb3oN/RPWqDB8+oFRSLNUywipiRQzFZ5POyuNKc6I1klQ k3PN7Ae/A049eA9TjrDLQpA8t6+jLsqAG9Yh4IvYtB6tRHN/pf3sGopQ9bp10uPliEgaogd2gCos dQRe7i1wygCID+p9+LA0+3r3pTr0FM7mFWYiNJnVg8wsukggqo5HqW4twQPeq+fWqHNOvS0s4lIM l4z+5f7mB3IZbKNPk1E34Fgfr73ih61kCtOnXbW3c/ufI4vb2GpZaisqKhnYSRH7eijV1E1XVuAx SkgiszMf9YXJANwAzkDqsrrGrySYQf6v29Hzw3VWyOsdqQruyetzmSqaesphQ0Jmw1Fk5JlWL7mr heoE1QYoHEaamU24Avf28Ai5I7h0TSzvPIWUU4U86f6j/qp0hKzIbBpccNr7f2VhKCaglNVUNU1M OZyq5HQ8clfXQY6aoqamWjhZjFHJI0fq5UEH20C1SFQk/wCDrzNOWDliRSnoKfn6/LrBhc515DBl ctWvgKqvxFOwxtBJhpEkwU5b7SfJrh0oY62R1iKrHFd4lZtXP090XUve57qUHpn/AFfZ00VuBTUz DUfXj509K/4OhMoN27ShbE4nb+Jr9zVuThXJZjNQY2HHxx1EfkFNQmeujiFJQzOynwKkstTMup10 KFFlOFZlYsxwoGfs/wA58h1Xw3ZWeSiBfU/5q/6vn1h3ZujeEW3Kp8lh8FhJcVCK+V3zdbmaJmVl FK9e4hgIqHimM3ju2qWSwQkk+1pBC0IA8+PVEWIyCjsQccKfs649b9eby3Kkme3Bnk2bizQQVtfJ TVlDDFgMGEM8mT3DWz0dSlDlK5YgsMDNHLHGQNILe21J+FKAAf6q9elkhBKKNVDxzx9BTiemnsTK 7Tzk0+3KbLVdVtctNFjZH3hHlqySk+3aWSpqhPJHBR0khAMscetwZLEXA90aZUFGBK0wB/q/1Dpu OQxkOIyHH9H54FfP/OOg9myfXOAEeGSY1lTkKBKGppvLkMqkE/28QinpaiKkNdlptfJigHi8oVbk Bj7QkzTspRdCg1Hnw8yTnNOHkPTqoS9unDhKRg1rgefn6V+flnoVtlb9rKKilnp9hdh5jByJko6C CinwWKw1TS42FokqZcfPLSLQTVDKgZm1+OJdKqZWPtchaMUatT58NR88ZNP8nV2gZ2pJcR1FKnPn 6Y4D+frTpzXe2/FoqPDUGG25t6uSabKVeRx9dmdwsYZ0anemqkoMdjYFoIDq8aiZKdZCzFmI9+01 OtjUj9n5D/L1UxwaiRIzKPsH55J6DbsOt2VkqmF87vXJbpqnOMw8tJi4qygxuRdoalq80WIx8kgg qqWok0MrqZGFmZ78e9GUE6fPGB/q8v8AD07CzhisMNCKn1IGM1Pl1z21Q4PFfcS1fR29s9jo56Z3 y9Zg8tmZ5v8AjnjHp8llKlo8e8MRYcuyLZnUA6TeIKPihrnHVn8aTSfqolfyAYCnn5AZHTxU9jUe YytRj5dl75y0c9ZS/aYtqbFbKpn8JvTU1EJGWnosTBUSanaenqJZViVzoF7PFvENdJ0/s/Z1Q2zR qGNxGuKk1LHPr8z8jjpky2a39DHW5uol2pPgswzbJxFKMa1SMLTIKjI5WhwOYmb7hamqkkNLXVcE ampcahpjQKfOXqSgAJwPl58f8P2dbVIGARQ4lUaia8fSo8hXIBP29ZNl7f3TXNnMlU7ppNsSVeFT HYZaGBSsrPLWRLhcNFQtS1T1WJFL+20swSaq0BvQHIbij8PCN304/wCrhXrUhgjC0jLaTU1PH1Jr jP8Ag6CjuDM5rDT4rCyb83PuSPIUTnIyyLi6SFcVIlFDJS4/7CBJZKiWGExTNLpVzGSVZX1FqY1O ktqYf6s9GdjBDNqmNsi6TjiakeeTwHl/sdFulahE1WIIphTyNJ9qKiRZaiCLyFoleSJYIpZygAZt IT9Vl5BWoqePRsQ1Fz3Dj1//19A6eYs6MFC2IIte/C2+v19+p0wgw3UIm/8AtyT/AIkn3vp4Drwu Dxz/AK3N/wDbe/deOR1y5Nyfra30t/tv8Pfuq8KAcOpQcBVIS+lGVmuRpJ9IP1/x9+pxz1QivA9Y p0KhCbA+oEf7Yg3/ADcH3s9bjOWHTtEdWtAx1yQKgt6QXUKfV9LAW9t8CfSvW+IHWJonlDIXUBTK 7CxF2iF5NJUc2dvzx73WlD14efXeOmELlZJkjCsHaOZnRJkKvG8asobSWVvzYW9+bPWqeY6UmVqI o8E9CrJ49UcsJEiszETLqLoDqP0Kg/Sw9trlgenFp5dID271vrsfUf649+6906OrFAP02ZQY72PF l1FT9Tpj5t/W/vw49Neny6eKqfUW8ihg7sVEiJGwKlQPoQAocjkXt7aUcKdOk8a9YqeeSF5DrniA uVELOVViGLForm4Km5vccD+vvxAIFOvVPDryZKop3MlPLG5ZDGVki9Ag/Vo1RlF+vIt9CePetNcH rVQMjpyptxytxUU6OdccoeFjGyeMlgixsTGSzEkkm9/emSmQeth64p16mr6cyV3ldoTXVRqNDqyo iWVi5mAKPIhH04Av71TC/Lr3mfn03Z2V5oYjoYjy3J0LeFYozGqSNGzLeQesD8D3aOmo58uvfl0l vb3XunCAPrpvF+sPF4wbgeQsCNVvwf8AevbR/F1rpazzAKWkAicJIrAkkMVQgeP6nxub2/wH19tH h1sdB17Vde6lU17sovZiAbG39l7c+25OAPXvMDofcbQV79NVHKmBHOehGh2QRQ52OnqZWZSGSoia BlbjQYyPz70Rk+lOi12AvlI44H8v9novcgs7iwWzsLD6CxPAvzYe3BwHRl1w97691737r3Xvfuvd S4qSYyReWCcRu1v0FS4UXKqX0qCR+foPdC60NGFevGtMDPSmE9Uv7ccdPSKEsgkrIlCoPSdSRmQt b8j23qHr00IDxJHV5P8Awn1+Vcvx/wDn1s7rrP7hp6Pr/wCTdBU9NZilaWsGOffeWBqOqsnJHYU/ 38m84ocXDIwGhMtJdlUk+1NpNok0EGjf6v8AY69oEYLFqj/J19AxaGsyP37rRKckiRtRJ9v5JoWi heoW0JKvNKCpYsDZQoAseS9OCrlgOPS23etQD0p9kTwxYSjzOHnhgr2y9TDXu9OimfJUkgiWNJWC CQaGu3kYshFgOfaYkmhrQ9HMPwD0p0vdr5rKU9VLX1UqVIO4Mhj5YqZDN/k0kECSQyPGNMcsc4JD n6En/YVLVBoeqXNFUVHSpr52zf3m1iSkWZpqmhdzD5p4BPCz00xbgRyQut1kPAIsTz72nw9EzgUJ 8+lRsrL0dXiMpg8jUwZeLEQw7czUVVNDLUJX00UUcoydCrMI6qThwhA+oJ4926ar0j8KIaiXc20c 3T5asl2v97R5SCspZaJMvg8nBJNhKyhnX/J69Io3MDvDKfC0dmUEge/daNGHTbs6p+x3vBtDKQTN EcdWz7Prq0PUGWjpQtFk8VBKNQacUYV21XkKkjkc+2nQE6vPp6KUxnHDoNst8X22/wB17u7Z69q1 ocnuakx8NNSzRQ0VJj6E/aDLYGngsYanE5iekjqCjusUU0IOnUT78hKceHT7Shx2jPRgtjo83V82 Cy+DjpDQZDIbbjxDQGSFYqcvaWd7Os7rKWZJUOiQH+vvYo5J6TaiBQcOgLi2Ljsj1rvv4/7jqKyS CtyNXBt6SmjlmydRt3Ow/wAQqalYGXTUw4+PyxSfb/txxsoIBJvsJSvceqlift6a+3NvYvb/AE2O u9sUy4imo5+v8JtGjwqJQVEdZhsrRNjqOOihY+EeKN5ZEZULAtcWufeyO2g6urmoAHSJ+RXU+b3P vnE5eTKZHG1eQr46SirsZWmlqqhMLhoaqsoYgoVWhrJXCNoLiaKykAqbtBiumnTxZmBBPSg6U3lD tjsTIdOZbHVtKMvthN77UyIlkfF1ZeURZjEIlQUFLWxSjyLoUC11J59vA6hUDHSYp506E7tfbKJk aXtLbogg3FszC5GCpVgumuwdPDTysa2E6FnKEuqtqVgosTa3uvdX4sHr3QOrmYexcaMsuMp6jEU2 K8s88VYxSkqalllqLTO0gM6RkkRheABZj7sVBrUdVAp546pa+b3VdHjJMLkaCfJZEZWtqsrRLFKt fTVjso1Mkj6I4ZFSSzpdAbXufaCVVjY0XHDpbFrcLxoOqNuy9qZPqTL702ZPjMfV7H3fS43dU01V VyPjoc1jWkraejqKWGSJKozmcRzQS+SNllKi5NxeK4dVCjhnpQxmRqoPLo825d4dedzdbZXceHwd Fht4U+0trbdraDFoJ7QUlOKdshLC3rx02UA8s6i8YZgBa1vdtLsviFaKT1QXMkjqr/Z1WX8kcJjq PAdd0aTmCq25TvK0QS0tbS1FWxhqBCWDPIs9wDfgD6e6nhjpWj6GBpUdVudkYKg/ilXlsdmakVyP SMKSGpaRDkg3kcz3AsGtwhb3qp9OnvrUGKZ+3oO6vLZyaaSWKnq6yrQrCtULPTxLIBK+mPVoBaUg OwJUabe66fn0gllUklTk9H8+EONmh3ljjlaa8SVUddWJZ5tEolRmJkJtE7D9BH0v7WQqY8k8ekE0 1QSeHWxn07vLFY7Gbd2xkJ3lo8btishpKalnEsc9etTkMvlI3hiWU6KOoqp/GSdIuqk2sfauteHD pCJA7FQM9LTv6prNh5r4c43FEYncHcPYWXrMHQZAyRz5LaW2KSM5KsrT4niho45a8PcOHfSQFtz7 0xSjBwadKUjYmgHQ0fLnZGHHUPY9TW5CSDa2MpIiKaux89LmcZV00cGMnmSKXSldFJX1KtH4nfXE ykAEEeyqVo6jT8NejiCLAXHRfuoIJ9wYfZ23cbj6sx4TIbPwW4skIZPTQw0/iwdJC7R+utjyayyy oNQUOmsr+XI6acHrcyaCQ1KdCH8m5MfkMrh6SbJtt6GknWfc8tPUaK7cOKSYz0eIhuqPVVcsMZ88 cYPj1XJv7sdQIo1B/qx0gNCWFMdFb3Pn6nee1s7RTRnE0mWrHpuuVeeMBMdtipoa6po6WmB1yVNL UTwPKJPUrSrbgk+6FJJFNQeP8um9NPMdCL0T1h/fUwZqKmpK2jy2zZK3LzVMcwo5IMhRxxwyZPQj ulUJGZJEjazPbSx9vxRCMCta9a1EGlejbdNbNpOpdmZHFtDR5TM0O56jbdCdMf39bQ42dKmmh0uU lg/brfty1vQIQTb3aV6DAqOmGBLGp49FX+T8VB1h8ju0+6I8fX783BuDD7e23WYeqlWki23TV1FC r5SoaUTQw4jbOEWaCjhhV2aR9Y0jn20WRj3DPTL1Qhq9BLvWPc26N4x4/E0kMHk2dRbiX7QVAvmd wRUGSwlXkmIeWaKm248SyRhf22kY3t7amAWhUZ60CZHUfLoec3skbc231TsvJVrybi3rvTEVO8qm mMKUGG2jtymhy+VwreJZJKFs9Vwxx8XaSF2Btf35JmY6SOtyxoqcc9WTbfx1ZlnxVfWR0L5b7XI5 /HUtMsM4qpoKCjNNFOHLwrDJO6ACT1rM309Nva0PRSKUPSNEJYFeNejbS5Gqrev8VBLj1xWVy+Zo Gy1K0sbFPTCPK88MavIAyuFKjnkfT2wTUk+XRnGKDp88cXijisRTrNAKkRS+FZIFkUHySKCQtmJc ggH/AB+vtFdkgAjo329STw8+tKf+YVg+ytxfzKfkRtzd+NzjboyO9MavW2PqsVXUz57q3H7Sw/8A dzI7diSmYZPa1DWTZBEqoTJGJy4kZWIBSKRWNgcEflX5n1+XR04YxOoGeh263+Im78TkdpLmcZXf c5WmpK+SnoNcmQp46mRVjWBrMJIVmPrlAso4sLeziGUpQA4+XRDKihDWg62qupMTVbH6n6/2hW5L Ctumn2zHjsfhklppTRxyPHHDNLVN4kRKllk8jnXqZTb6H2+8h0sRw6Ladw+3qmH+fL8yqz4cfDeb qjbmZOP7p+T0GW2NQZOkbx5bH9c0aiPsDdn3dLJFJTSrQVkeLpXR1kjnr1lQERtZBrZ3JPl/qHTx GlSPM9fO0qGjapqjGpVWkYqDcFRe/wDibsfrf2qFdKHpk9OePnkDrSLRrUPIusEVE0BNvr6kuDYf 4e6lRQmpp16teJ6VFVjK6mW82Iqo3DKrIK2e4NrAo3hYWY/8V91yOI60CrfiHTbU0tRGv3EmLqkU FVKySMwuSVABaDSzfQ24v71XPy69QHgR1HUVSM0n8LrH8jARq0ZKpoa2qIrFZmBvxbj/AGHvYK+v VipB49ZdFQJGE0NZBq1EoEhliuwFhGbI5fnleNPvRIp1qhPmOsEsN5Vi8kxYWs4igJT6X1xNLrJY m/vYI61p6wlDHJJ4lnIQjyKYoXZmINj4hKLLc/T36o9evaT6Z6jvCUsz1bXdbhfBKWX6kpI0X9pR f+o92BHl14g+nXsfRy19bT0WOheurquZKajoqdJZJamWQ6Qqkx/tsCbkmwC3P092oSaU6qxoCzGi jz6O3171/Js2ioo8nmpMbNk52rtwV2DENBWVtLSRRywbfbN1TtJBh4JwPKKfxNMSTf6e3qFFUAU9 fs9eiiedZmJ01UDAPCvrT1655sdNYaOWgoK56uqetizVfX1OfrJ8hWyUMkkv2+LqJqmurqejgqHK 6YgHqGuSSAPbMjhV8yx8h5D/AD9MtJcEKRGaAUFBTJ9f9npNx72wVPGajHR4xHndGoU2riAcnmKi VllGMqZ6WmnyLrHrvKrEM1xqN+PdQ8pUKsdM8PP8z1UpcOQuk/Op4D1zgdPEU+9MxlYYMLtLITZe SMxfxbKYqCPDYtwXK1ZmyRaqrsoIm5VowRe4jJA9+igkZhUmlanh+z5Afz6aWNUUtJN2V4A5PyAG APzz1Po03jtugehov7n1NfNJUSS1NNR5Wuymo0ki1JSOeSmoaStrq6V4kDPaOAg2UEj2tRGj1MXB r5+g9B+fH18+nJDA5UsWCgfIDjxPE4HTMYPCmJbcvZUNHSYWWqr5vulo8djKSqhiQzJBg46St/vL kap2RY6mo1U5kssai1/besS9qSigOTxGPKnTayCbUtvDVz9rGn2/h+wZpx6zZeu67xGEG3afc9Tk aHP1Q3FuKkyufy2Q2/kcjSw08tNDKvhgxUuarK3T5wGYRGIIoQKxLwCKqivxZP8Aq9T1YfUF0dIf hFBQAH7acaAf8X1Lx79bS4mGjo9ibY3RVV60fmkwJxi1VPUz1/3iPk6uBposbg6WmQq8bNDNKVC8 agffmlijjZ5EFPIYqf8AYA6ZkluEDNLM6IPWufsHmT+Y6UZ7BTIVWEp9lbcotoy0FLU0sb47HUGQ mORcxU9Rl8vkmg+3MYhTxfb0kTfbs1mYsD7YN2XeNIowFp58T/mH+HpP3k0cko3qSMfZ/lPHgOnS Re1Mjhata3D4fbaPX0NPHWsktb/DsLVRTotPDQzmhoY6+rpo1fUGmlbUCojA9uAPpZiBXhX0HoPt /l04RAjrWRmGTThnjxyaDp1211/vyKly1bmt+52hoM7JDX5TBYaLG0WTfELMkGHxr7jqkhM8iRSB xSUkcMEJkLyF2HuxV6a3amPL09B16SS3IVY7cVGKk4r60r+0mvDpLZ3F9XbEyUFEmU2JX7uywWkE K5JIaLD4wtGlLQT1UP3DPlalV/eqWeMCRnJN7H2ywApXgf5fb08n1Uqmqv4a5Jpgn5fIdLYbr2/j cLJvPNmmrMJS1yw4P+EVtatLufKvULBR0mLoGvLWbaxVVEPvZkSX7gx21ke3VBIXWCEFDx418h/l 6aMchfw0X9Ug4P4ccW+foOg/n7J2UEyORzn96KmjzclNlcxuHP7Qy8D7orHjklyNLj3oIIaajwNl jhjTXCsdNEbG5JL5eMYJ7vsOf9jqy2lwxCoEJXyDCo9K/Pz+3pMZ/O5PtE1NdjaiN8ZiQkGAhWOv xey8Nj6WGNK3D44UVIr5nNVSgvIaJGaMOAWst/dGetSM4/Kg49PJCLcqJVIJyeBY/OhOB9vTrh96 9mYhlrsV15tGSUUpwmIyOJrv4ZjpcTQSyGCJaVZKzKxVkojk/dkqINdMCGXUzksCY4CoNJ9OP5n0 6s9vavl7l/UggHP8h9uDnoG+0hv3H46hyu7zi5cu9QlTgt0YqtShFNFkqWSTMbYxuLx9HBSVP2sl SGqppQZlbRofTqVqeGUqxGWPS+0e3ZjFCD4YGVIr9jEk4/LHRZg7BDGLaSwY8C5IFh6vrYX+nv3R rTNev//Q0A3a7arfk2/3jj/Ye98OqKKCnWP3rq/WdAEOtiV49IN7kfQ2sPx7t8+mmqw0gdcXlaQ8 /pH0AAH5/wB4966sqBft6mvHOtOjOoSKdAyBuC9mAJH9QWP+8e9Agn59VOOo9U+qXgEKoUKD/rC/ 155I/PvfXox2n1PTkpJqI3RTpIUXUWN5tQ4uLhgQbAf091pQU68c9SKUoKlElZ0EwqkZggcqZAPJ qBYegKL8cg+9HgcenWx1Hig/iFSkNPCl5mWIG41IWLkSEH6qq/U+910jJ60PTqdWYFqRZi08BCQs 3CNqZUDEsBf0EBb/AOPugkr5dXocZ6Svtzq3WSFdc0S2vqkRbXte7AWueBf37r3Tvos6PqkDWmIt a8RCuygNzc6iOOTb3quCKdN48z59YGydXKEFQ6VKISwSdEcXa2q5UI/q/wBf37Qvljq1TwPWRMhE CS1KFJLEeCeVNOrggBy/oVTwL+9FDwr16o9OuKvTurKJ1ia5JEkTrqWwugMZlQsf8R70QajFetUq DnroRCRQY7N6lChmj1Mz3NgiEWA/N/yPfiacePXqV8uvL5omMciNoBK6dV1Z/wCyCDyFDDm3HHvR 0nIOerZGPLrmk8sd/G5ibUXBicgm976jazKfpzx7rpB8uvVI6ktL5oh5o6aoZuAzwaZubFj5qcox AP8AW/uuVJoSOrVx1CYhZVeMeNVdSouxEaoQL3J1tp0n68292FSDXj/n6r+XTlNJN4g7PHIVDqZF 9QdHRzDp/ov9PpYgfW/unWx8ukz7U9e6n0MDSzQKAD5p0iS54JDLrBA54R7+23Pl8uvVpnoeqXcf 2+xqfDJia+aWvoc9iMe0OmSkzdHV1VRNM4kRRJSZTDyxq4hddE8SNZ9RA91XgOFOiySLVO7eIMFS flQD+R/l0XpiHd2ubs7MAFufUSf6j25kAY6Mz1lUQ2UlHv8AnW4Cn/CwCkD/AGJ91JbNCOvVHpnr IssUUmtEhuLWVlMyD8fR9QJ96o5Ga/4OvefDrIa1WWxD/wCKIEjS9weAAbC/PvXhn163X9vWBqgt 9V1G4F3Zm4/1NgR/t/dtHz61XjXroVEgsECRg/hUBt+CfUGPPv2gZJyevV6n4jP5rA5bFZ3DZSux eXwmQo8ticlj6mWkrcfkcfVR1lFW0dRCySU9TS1UKyRupBRlBH092CgUIFD1sE+vX1ZfhB8l8V8p fil0t8ksZWJNmuz+tMRld1Q0MEi0mL3vRUk+3ew6CnR7zxU2M37hslTI1rNFCCPSw9r3KvGredB/ q/1f5Ok8LsjaAcjH5eXRp9u7rx2ysfW0+Wx7/Y1kK5e1JDqeHIC3mmVGW0aVUDFyBzxf2yyoQaHP R7C8tABk9KmTMQU+Oq8zSVNOkOdyuOkp6mBfSqVPkoxMEbVdIljRNVrG9zz7SmOlSOPVpJS9A3TL nclkEy+Ir8fWTwtBJLj8xSKhYvTpGyvOZ+OEFnUD9X0Htxe1VxnouZTQg9TNq5al2pWQ5GriaqXO VqVObzNOhjmy7RuYVrKuM211MkehSeDpX3tm1Dh0nZTSh6Evf2+qf+A0NPJBWZGcV0wpWofH9viq XV5IUq5i2qdvUeL312UDn3Sh9cdbRMU6KdW5zO1WTo5VydBUYiOq/j2ydzY+WVBBkYpV8+HdZYkm grlZilQi6UcAWJF/dg8eQePTmitKdWB47Nf3rxUUJn1VDUoeSZoyKmhq6enRqqFYHGmRpVMgAJ08 j8291JjYFR06sLKKgdPNDG0X3WQeSKjoZ6qF4a4xNpEk1L4jTrChUR/cMvqLA35UW91ZlFNHTZU6 qEZ6rs+YPaz9c13QHdWLrK9NsbX7SlwW9I8LSSM9Vj9w0U+EnhgWmeNqiTG1CAOj3CIS1ifb0YEl a9bkTSASKdPvyN3fteq6got+7lauG0K/snrfHnJ7WWlmz8OPzWXpMfRVeJimYpUFnqVE7H1wQszi xHv0keO09UHE049GW7BMNRv+PH088U0u3WpvuKCSMM9JkKimpqqKOil4a8tDMG1P/aJHPtMQVND0 6D+3oA+x8fh4t+7J33j61UrcdnKdEq8dT+OgNG2qnqcdPpJX9yo/XZFVm+ov7uitTBoOqr9pp9nQ 9ZjM0D5s4MY81Eu6sPNEuPjjJoaiJ0WglZdQ/dEbVCBwLNzc/T3sjIBbPXvCJrSvRIeit14yq3f3 v1qzz5XFbQ3mmxqWKogjo8VkBW42eCWoochIgSaKmr6gRoWeS0kH4F/dzQHPT8Nk85IXqrNe9drd l7o7q+L/AGq2e272F8Uuq+8u3MHlEShrdk5aPq+g8S52ucPDkNrbtysFRT0lXQpqSrjInQi9vaSc VBJAxUdCW02GcJCzoTqYAU/n+zqhDt7J5XsfbXXG6NxV74fb+YQbxnpcg88UdZ4UnNBS0sMiLLUU stetiOb+M2Nj7LUkkV6EY6ML3ZxbRMUUkjoJqDsbL9YbxXOxQzSYfLxU9RXYSZ5jQBmulIslLdVM NNJyEfkj8ezaBtaGJ+gVNGySElaHpN90bpG+dkNuqKsrqgNVT4lkZBSvBUNMa6bH4aBSHSkVZlYt +foPdpYUVSVY46p4shFK0H8+iEmnIlNJFEUZiskzzLqMinmUyqbhplU2Vvrx7QefHpk8ePSzweGo paaWa4pYIrBVKWWVHJYzSLeywhb2LfT+nvdSAQ3TyK7A9HJ+NGXxVLnavFwyRJJmvtac+NxItPRU J8089PI2oRySKtgW9qoGZyQzdvTE8JCkUp1at1DvirpsblZaOodquoocViaeWZQiF6iQzVkEUvqk R54tDBB/ZYA/S3tdVEAFcdJ4oVEgJOKjo13yX2Z2Z2v2h8BabFUck+39px7uxBz81ckNHgqreECw boyG4JpnQUuGwe2opJ1mVgGeOzC/tprgEaQhJ6EMSQaVyOrFfk1js12NsPaeztsUlGmNzvZuL6o2 PmoJXmxW7ttbWxOOQ9iZaatYuI66mLxIsTaJ2ZWAuvBdNAxAND/qp0viKB+2nDoHtr7e2l1luvrP o/GU80GS3FS7+psJjKlJvu8pVddz1mZyOQnnlOuv8cVYQH9QVIi5NkN9oGjXhk8em7qIuK4oB0Un dBqp8/t6n3RnaXJHJbozNDTZNIgXq5JpJpKQQwsrRAS0arrZQACpsBf3Ys5Kn59B6QlGK9AnkqfI Vm6syMMk0MW08vTSVSP9zUY2o3XQRRVVKkWOfkUMdFU3mQW8j2ANwPZgjMcHpBJM4J9OrVPjVT7e y2Ap5MfUDFZZYsjikxbUVR9usWQIyGOJrNBilVLExxNqaGIjn21cLIFLDj09E4danoCeut/UFP35 vXYu9KXJtU4zO5bP1HgR6rGUc9dHNPT4yirow9HLKaenWd4rkqtyQLe6xRMf7TIr1dqceizdA5LL /I3s35RZ7PQxZfaW+MvTbcxcdVWTO1BR7RoKpMdkcYrSW/iSywaGTgaT7U/TR1FePRa8oYvU48uh n6khx2S7V7vr8jjZp5c3htm4raNPV+aJ6Gvrdt4pa1qaMoKeqo8TS0DwuQwMTEfk+9yW8Z/LrUQk b4Wp0OfYW3KGt7c2FjVWji/iNFLXBvHJVR0jY3GLTVEs82hhMiQ31avqW0jn2mMSqTpA6V+FqoWa v+r06N9isjSY7b24KedJaifF47GiWbGwhMlHTR+OSnjimUIsfmLgtyLH6/Tj1RwNK9bApkDoYevc 5LvVaaviklakEsiKsyALS1UcMcS8MoVp4kBueVJP1910AA049OKxJp5dDTRQn7wRKhCKg1RzlFaY uCVgdbWa78gfn2llh8Th0aW0hUk6s/6s9Mu9UxmPx1Vujd2JwtVBhMXNFDUZGhpJ6qlMsqrHR09T URPUsKysKReNWAkaReCRyh+mNfix0ZPcuUo1K9Afjcbj9pUqdhZeixbSZc0sOExU+MhGSp6KaSMT Y6OOQrJD9kzMXVPqDfSLX9q0JRkHl0TTMWPy6X2Omq9z5uuxuP281JR4aqp6nH5LIKPK1VMhngbH yQtb7BFZwC551Fbe3ZpCFUV8+k65Yk+vXzxP54vyR3L8lf5g/c0WXydQNpdE5NektpYM1XlpKOg2 aZDnavw2CNUZXdk9a5e2swpDGxPjW2l7QKDj59WY6m44HVKajXNMXuCbm3JszHgkccc/T2p/CoHT LV6mxRSaI5kq0hlFSIoor6ZFYqP8oUhhZQQB/jf3Wop8PXhwPSwpcjkKpoUoMg/3EEcX3FNMjT00 k4uv7UU9yxYr6k4t9QfdDinp1UjjVenls1WKkn8QoHqCyNGanC1DK0UusXeqxz/uROiC5A497JBr 3ft6qFHbQ/7PWUZ9Y6S8NFnqqUSsrRyqUTlhpdmIHi1W4te/PuopSlR1Zl1PWgHTVW5PMSU1OQab FQurjUP8oqULORMaipcLHG2ngBQWPA/Hvfbw49VAArTJ6YnpJjFPNDIh8dUrJOHY1QLhQJWZraqe KxIF7kuePfgRUVHVvPp5TKZMxQvVpR1tJp8ZM0EUEtPWoAFiNRD6ljmQalcix1cgW9+7fXP+T/P1 UinrXpZ4Kjl3LUx0mMwE/wB0h8VdJk6GSnoKGIJrM0uTpPLG8jkXVBHqcfT8n3sigLEjSOmZZUt0 LSS0X7ak/YOl8mzqTGeOvpspXbdZhPFLlMTUY5KrJRIGapWliSN6iiRtHp0OZfGCG+tvevFRFJjU s/7B/n6LX3DXqRY9XoDWnyJ9euFPW4ynkkNBtU56Z4BkJsjuc5CXE42hpw0pknpJaiXXWVhcG5ie RnYWX27EXAbxPiP+rA68olodcmnPlxP2fLpfYwtUyUzUGyaKriakgev3KaOnws0TsXE2Ng+8iFXQ 0kIlITTGJpSLabX9u9oNeqtUhgZfPhx/4s9KnD5bOU2NzZx2Mwe0BjlY4ypEiZObJsxR5qmOnjSK SlYqnj1yvFwT+fdkIYlqZH7OmnUEoDIWrxHD+fWHK777NVMRSZCpweAyeZp5nylDtjG1jZKlxTQp BRSUE+UmjpsPlsiUkKPTxSIqNrkkBA9uvOIVGvA/n/sdUKWw1uGJUeZNBXz4DIAxTHy6DVduY2as XMZzI/wqlx8oSkqK6tnyMs2RpaN3hgWaonXHVmRWkgYySOvggt5G1kge0LSvdHQqkQj4if8AB9p8 h58TQdUM7ygxQR9hGTSmD8uIr5AZNaY6kZzcu0aaKnxMuQpqmjWJ83WRzZugranLtUpFJjHrZvEm lImaNo6cR6I+ZPGCFCvlkWJUgjooNOH7T/sn/N1aKORBVImpWmFIFf8AVxJ+zqCNx7XqZo6jK5LD E1kcUK43EQT7vyjU0dNakkwuOekjp8VChTXIWjeee3kkblV90luZdZiggLEAAseFR6H/AAmnHrzi 7BZLe3YsK1J7VB9CSc+noOnDLS5eg2lFl8J19lKDZzZfG0P8eyGMqcT9xVyVsggyFLhKP/chkWaa KRneRRJrj9NhayVba4ek87dwxQZp8geAJ6YW3klmBubofUUJ0gg0FPh1HA/LGenijk3ZhzBlZtjm KlZFmgh3NmcZiBlq2qNVT42fNYLKF8rDtqGV1nhpVWP7upjBZmGolVGhUVIxx/4v19Ps6cVYxUeK C3yBNKehGK+XyGeu8VN2nkEwlfmdz7bwWJc1cJraqnyVVkkjQpS1+QxtI0clBDU1KTpQ0KBl06l0 KCWYOpUkMPhBx6V6cb6RS4VHaSnCo/IHz+Z9elrubqaHcCT1GUbc8tRh637LK0ec3W/jxmOqNaYq hqkoKpZavOywhW+0i8cdLHIDI1uGfCmTyPb/AKv2npqK5aGgXRQ+enz86f5T69NmUwu0JqXG4aj2 lTYqnwtUIzWVOGw1XRfazxtVtSwFPI2TzNS8h0S1LNFT6Qtjpc+6mMZFCFU/4fX5n/Y6ss0oq7Sl nYcAT/qA9acesu2sBgKKsw8WJKsce9X566lqautkxO3qMypjcVHU1jVM7TVTgjQqQUqSapmuAB7f VfhpSv8Ag/2f5dMyyu2syn4vLhUn7P8AZPl0POEjoodspuXPSY6LA0s8z7bx3ip85k8pTxQyUYp8 KuVEqyVMwgsmpPGbF9CqF92Jj7lDAqPs/wBX2V6Yp3ac+IePl+eOA/n0HmRdanFNuTKxVVNgaWhi myVdh4qVcjtLaWYW2IxNEaVjeuz8dFI81WEDwh5XcqCgCd0RRg9nE08gf8pzX/N0oXWXKihbh8mY D5+g/wBVegS3B3XT5SODGfc12PoIWpXxkCbSkxxxVGqyVVLVZR44j9/GrLDTourQsZLnVck0L6lo xFK4wBT5Y/l6celaWci0Yquqme4Gp9P9X2dFo31vafcngok8aYzFipXGUNL5TDG1Q7fd5KpWR5Qa qZQEU3uIlF/rzRmLUH4R0bWlsIQWPxtxJ/wDoN2RVpke12kci5H0CXuAfza4v/r+69LASXI8h1// 0dAH6sP6XA9761wB9eubrZm0j069INjY2/4r791VTgV4067kZmKLa2hdA/x/qfxa59760gABNePX AAWv/iALg83PP+tb3rq1enWqneeoiDG0cMUaRJayoLAFgBYfqufdVUUPVCaDh03zeqUAn/UqT/Sx tf8AN+Pdjx62ldPThC6agoaw131slyjILgKTfgN/X6D3U/PrVOsxF5JJYmAEK1UjuqgOQzKF0gnQ Ga/+wBPvXlnrfmfXp7wtPLDj56yFfFUBWMdTLb0ggWYAj0w8fW/qPush7gK462PM9Yc5kg9MPzNW xRBm0MjKitqdiSeBIQQB/Qn3pVofkD1seR6Rnt3q3WWAAzwgkKPInJNgPUOSbG3v3Wjw6eqn9VyL gEzaEBBZSqjQV5AJBHug4flTqp49NHgk0GQC6rp1EEXAJKjj62LD25io69qGfTrisLG1iLsDp5HN hdlB/Lfi35Pv2Ot6vl14JITZQW+h4BNhwLm17KL8+9H7cdaqDXrs3VmAs+m92W9iFP6gSLj36uB1 6g9esqVk8Yskrqp/s31LYf4PqFv9b6+9FQeI62Kjges/8RLALLT00gFyCIvEQSQR/myBZbcDge6a PQnrdT6dc1qqRhbVV0xOoHQyTRBSB9FYK/LD+vHvWhvket9dIU12f/NMjr5SnJE7CzhSwtpU888X 91+Xn/m61wr1nFHK1NUyCpAigZxFEpYLUeMtraJh9REq6v8AH3uoqMZPXvPBr0x+3ut9P2D9VRAD e0FQ03pIBAeMIzWP+o0g+2nw1fUdab4fz/1f4OjQ7KMMu19v0rxSVsUYqaqTxtEaqjWqyWQhrFSJ QkjRxIy6OSR5SL/T222Kkf8AF9Et1iec1pwH29o/1fl0ViqoBDLMIWN6aaWFyQVctDK8QfRbhn0X I/F/d1c+fDo3VtSqT5gdQZPInpkQEsL6xxqDE8ni39f6e7AKcqerfn1F9udW697917rkguwH9fz/ ALA+9E0BPWj14DkA8X/3r8e/V406969cfe+t9bcf/Can51R7Ag7H+LO6txY56ibNxb96p23lqs01 TmKSvx1XD2JgMRU1cn2rPSvjqKvpqKMCRpJ6yUBrt7UwP2lCfs6acUYOOtxPHTY3e9G+Wppp6zb9 W0VXFJLUJDJQgqUnoKmBCW80cw8Y/Dj6fX2wwdTgilel0M7aRx6n7Hx8tbFkcCZFMJSimw5Gsw08 EOTkqY6PkAxosYKqp9S21H8+/A1GePT7SKRjgehMzdBTiOt1JLDMaeqkKuEKa4yghAK8Mrc2NwQP r7akzQeXVUbUSunHRVOzMxuag/h1L9lWVGC8MtFXHHrNJNCZCs1GwjjdfG8M/qMl+V4Nvfo1rny6 00SVHTXit6ZDJYeuwFeIqqegq6A1P71ZF9zqVqpK9dGl4JoBCqBrkBuefe3qWA8urxxI2NIr0BOQ 7N3JW7rfb2LrcxkWmrYqF8bWQRphoKKae02USCljWrEtJGPQ6NqdvqPe1T4sYp041vpOqlP8HVn/ AFvvusr8LUSQwV7/AMKxa0dRWNRVNLUVr0KNAmRNLUwxGFYJQCyhpGcWJbnhpjoqtc9LLeJXFenD YPZw3ZnM5t/ypkHhemTJ0UzS05jrXgOhLtZIZ4oCJkZLqGNib+2VapJ8un5bWICtO7ov+/8Ab4os l2btKNqvKU+Yz/Xm5ozNCmSwuLlpDVUQosTT1kf2tDkstHLJ5JotTSyEMwBAPt9WMZqp49E9wO3h 1J7O61TKdDNsfDYyOAbL3dtTdu2MZH+/UVMGBzlPX7ixwSTVHUzfw7yqqAljc25A9uqzEdxz0iBo 2ejXZ3bdHld1VG8ZJZEmkwuGoFWnLx1NXlpGnmkqJ7XWdVxngQtbUpNvx72X8vPpZEFYDoL9wptS hjp5sktQ2KlytXEYzRmlegytFLrkOlXb7mgL/osdTPz9feg9fTpUIa0ovTXhsvkd4b0pcOaSTHNS 7Wy+VpK77sOaOH7+rxlO2qO8tK81ZB5bFvULD8D2yxWoOqh+XV0RgQlOiy5Jc71tuPc+UwNEM1jq ih2Zvb+CT0iS4/L5Ha+42h3aiSwhZYlmoJZJpnYgstyOQfb9Y2jYgVYD/iulFpHLDNTyPVCP837q zdOwPkBB82tgUmLwHWPy3x1RXdb1uCWd4/43isNSYLsnYm9E0pQZSlyseL+4iQkrNDZmUMh9kd74 ppMg7an/AFU/n1OfJIsLm1FnNMJL2AAPWlaNUq386EjGD1ULjMuOzt77FzvYNfkq2jweVo8VisNV zCSgSAUU5otVOiwU8eHw+SWOTxKo1yMgJILe6w+M4EjA9a5js7WASRogINT/AC65/L7a8+xtw5Pa riCHK46R6TPzxTxVIbLQuVlWjKMYnpIRbSwJW/IJ+vtSs2kcaN1DO42JMsmle0/6sdE6G4KitwWP w1IWikxMktVKksg8801QBFHI1yYjNGLsDe39falpWkFPLoPPbupoy9ccPtKLJPSxOPuKx6sTmq0q sbrcMVKrfyD8ED/H2yY24gGnSdlocdLfd+z8Qu3Mrj6SnkqKpxH90KY+F4ppw2tA6aT6W+i2+nv1 DjPT6MUx5dJ7474HK7TrpPv6sy1ERq1p/uIniqhHOQkVO45V5IRbSRYlf9t7UQkKdIrU9MzsXPCg p1aF1dk63I5LbuLxhMpzGQirKOihczOajHQwrXzRKlvT5oDcX/bHHPtSAxIBrTovZZFNQcevV9NV jKbeeyurdv7Xo4a2m3BW4/beIzFVkaePD/xLcBOMz+MqMhLKifdU0QkV6Yk+RnCKWJt7dK0GOlSO wI1dHW7C29R7x3X0lt+j27WQ4vqLeO1tsYja9HUTY2pky2ExkIqxT0rCFoPsS7PJI6sjoT/gfbMl CtD59GcEzIaqOg+7968irPkBQZrdssWzdy/H7be5+3ums3gRFW1O8NhbwgyXV/Y20M5Vq0tBE1fV 72p1jjicVJjR5lsYmPto0bFOHTzzsw6J3ndr4mTceEFDiYKQVeSmzW1KN0M8dO09OKeomQ1GqSO8 oJUA+kE8+32RO08SOip6uxJWtekPltmUce4s1PisTW5HM5Hd2RzlaKIMYo4aXD43b9djpJWfxjQI DVRenySSN6bFb+7q6oKnpI0R1Gh8/wDJw6GLLboy3WvXNSmzdwQDJ9i52jlnxeTqVan2nTLh48Jl sntmOnijmpZMDjhanRmdHluHuefe2nD9o6usYStPM9ILcOWxvWvRWXx+0IVmzVNSZCgw9XklFXuX cORy2Oqkl3HWuiNV/fVCVBC3Pova9uPbKq2oEnrUraUI+XSL+L+w6jpHqOgkmhxsm6d1xStkgWbR SVOYLGCaokBZocxHHKWlUD6D2qElB516KmFSKDofcVENr4PJ5Qx009fiBjqF5AtRq89VauRSs8CL NVTUkiSSeJmVtSqTe6hHK8hNakdK4kkQ08j69KHZFZT1tXVZasad3qKV5aE1ZMNRBBNMZ5qIl18k EDyAelbE3+nHtoE1yelwr8uhNwW48tkFyeITGSFcjOmNrGhlKeSIzLpk89hamtHcg3DC/wDh7uqo M168R50x0b/rTHy0cEFJJAtNB45BTVVNKEpnMJCykAKHTQv1PNyfe2evDrwpSvQtVWiGsnqGV5DT LBJTmMo0tUwlA87R8kKg4INjb6Ee0zueA6VRAkr11vXH4ncONAz6ifb4lp8jNAVV46meilhkpl1E qQ9PUqsi8g67W9pXJPaD0qZC4A1U6Ix2zX13YvZm1cJh/wCJjF7Pyk9RnK/7dqXEzyTRrNFS0zxz SO8kkVhLMSn1Isfe4letCM9NyRIpqDjo+nWWJiw+Nw9Jqp6abLtBNW1daWkoKKWMxeFZWNwkApyQ xDEC1/8AH3e5J1AVzTphFFcdfJa+X+9Mb2l8qPkt2Xg5lfBb5757U3fj3SUslRitz7+zuYxwR1/U iUtaoT8BbD28mFUHjT/J0y3xNThnosasGqKkgfV20gH6aSSo/wBhb2/wVOm24nrNKkYpXDRjzeZi CFGpQRewP6rAc/4n3oE1FDjrQPHp+bzUsmPy9AWjdaeFpljDEu0A/WwB512swP190rxU+vXqAihP T0u46CrjlmyFIKqaWnmKyLEvkp2EoDAOmmZSysLre3vxBFa9V0ZUA0z1lgz+DpaZHFGtStnjiDht YKjWWaSaWQqokfjSL+9UIwVz150JOG6bpayrzlWklU8NPRRGIQxr+iNDeQyIhte4IGojn8e/HH29 bCFRgHrIqWlq6eVlWGNCsDByFiUsGRuQDJr1cA+9eXWs9cYK58aNc1MlZTeL7WqpnUM1RASYxKCQ wSpV7FOPobe9gA460Vr9teh02/sOixWJkyGb3HlMbbxVcmLTcgxkOFoq/WlBBk1pJZZ3qqwObKwD hLKov7cZWChNALNx9APU/P0HRfJMJGoqKVHmVrU/L5Dz6mbZfauLy2Tnp4cjkkxInqqgVWGr5RQr 6VmaPJ1rwUdOkzAiJVWSaU30gk+7qoBqBSnn006sVU4FfmP8HS4G9KiepVtpbJ3VkMS7qIZIsZAs +Xr6kLN4jQ10sVU1JC6gs7IwjUA/QW93BpQDz/n/ALHTXhDOuVQ328APmMdd5CXtObL0kVLQYBKa GJ6uXH5bJtFbIBmkqaypNB5IpKeJ2/zcZAKoF1XYg6CF2ofX/V+Q68vgBSXY49B5emek4u8d4RpQ rlNyRY6opnr/AL6oweLomnybVJqUpKqZamjjoqSKkjYeKIK7hrSs9wPezKwpoXz6bPh95jiJGKVP 7eHHpoxeMpo6WWolrM5lFlgpn3JlzPU5GpxtjOaahx1VUyyNV1+WEdwGvHEpLWAB9p1SW4c1BCg/ s/2emGaSaTKgAHHCn5jhjy8+lxhsBtR6ltqR0eDqKzJUAhrH3PX1OSnhrazw1xpqFJpD4MjPQQuB 4xErJEzuQrAFcvhoRAtNTDz4/afQ9bMjLRtRFMigpw8yeHH1/wAPQ07UwvRuAxGSp8/BhocC9PPL FiZMJTS1Gemg16cVR12MeqyFVQ5CdDqqDIGqSpWPTAlzcvAjKjuBWuPM0+zyr5/kOmJLiYyIDI3j nIyfL18gB8/tOeklnt0bd2pQZ6slTae1s3QSUVFBjsRi6Gnp8T9zStNhsRt+l8SxVYWNUFXXO0ya rnSfSPemkSmcAcAM/wCr7erKJJCqjU4ap88+pPoPTpCLvtYa1a2oq5MtlIoVpoaU1Us1GmdrKo5S bcNXigrTwUGOppRFSpUapJpSXEUam3tgyRDuYnTn7D/q/n1Yp2n8KfZ5DFAfn/qJ6jfx/D/emTIU H94Ioamqzk9NT00see3luXJQtT0+QrZvBKpw23bShIhIIo3MZH04bSdXrVO30rk/5h1QOWU6QVNA BU8AP8FfXp3623NBuurqMtPjKzP7kxWPqKGnp8zimpds7bkeepTHzV+UjqYcTDlVgSJndITIKdSq vrLOFUZLCuKAeXAf5/t6vNG0a97qImNe05PrQHNOP29I6qqe4KzJtioMrhzFixVyVcsW3GiqNdNq nyLsvknqKqKmeQLHJNIBLKUXm3HizrRQcD/V/Lp8CzEZbwnqf6X5en7epdVX72xu26uqNNR5/I1d ZB4qdMPVYuiocejlKmmWhoKanxkNFUIXeWoaeaSSRo0jUl7G1HC8CST14pbvIq6tCAZoak+mTn+Q +fDp9l3VuGakqnbF4vq7MVixP5MPVHL5fA7dLwCWryuHqGpsJE9dNEqRNJI9dIi+FEQMX9+U1Yro II/l034UMZjPieKv2UBPyPH/AADz+1Cy0Ha25NxAjK5SvoKx8g+28zubD1WPrtMENNNkMtjMDh6m DH48NLwzEyWjb1k/T200Zj+Ek1PH/L08gskjJ8OjAdwVq/YCxqT/ACFehIx2D3BtJqyefcm5t2Vm apqaXKUrTR0GA+5llWCNP7uPDJAMLR0dJd6uskSClp4m0QszD35EILLxPH/Jx/4rpl5YnXtiWNB+ Z/b619BU9Fw7S3bHuXJ5KhxOQYbToK2R0mpnllkzlWVgjqaj7yaOCepxhqomamMqC+okKAVA02Tj h0Z2kPgqrun65H+8j0+2nH/i+gl+3WKlljiVYm+3eSpfVcgetkEpY3VR+lRe7P8AT3U9LAxZwTwr 0mmkdkjjJ9EWrQv4GttTH/XJ/wB69+6U04nr/9LQAUXYAfkj37rRNAT1mXUbLe9nJUfi7EC4/wBe w926oacaeXXIppBBfSwZlZTbUAPof9Ynj/X9+6rWuQtRTrh+QfppIsCOP8L24J9+6twqPXqRcFUk DXYqUZTyF0/oIv8Ai3vXVT6enWFgPLHyWLFGew+hJBIAF7kD/D348erLXSepV08jEFhqaQopFrqQ xAJvc3Fh71mgHWvPh1Mj1yRyxKjuyr5Z2U3tGkjhFAUWk1tIL/nj3rGD171x1K8eXkijhKNU0zgQ RRxsrIzQn0JJpPrK/kf4+61Sta563mmOmeuaQHxS6o5I5H1U5QqIT9CgJJJC24H4v7sKYI/b1Za5 6b/e+rdZqddc8S2BBkW4JsCAbnn/AFh78cA9e6fIlLvDI76YmdYJGUqvjEfiZvV/qtP0PPup4EU+ fVPMdNqsA5jYWjJYpdj9QSylyvBDaP8AWB5928vn1U+Zr1PWKm8EdU0j6hWQCaJQokHj8rTvEL6t Gkpb6AEn3Qk1p8j1sfCeuVLB5JpJJAYRIlRJHIXMUTmO7Ea9JR0kZgpX8g+/MaADrw4nqK0ELsVp yyqYo1PkN9Mk1UkYUFQAw08/4e/VI4+v+Tq3z6lPim8MjqrlRqJBUgIyXDcngRm3pP5911mor16n TAy6f95/3g/kfg+3etg164+/db6cZ7eOMKpIshHFlN0Xi3454PtlfiOfPrR4AefU2LImHHmjlWVy oZ6V00KsInQeQMSNdr34+hB9+K6mqOvDy6Yfb3W+lFhbCCtZGHnETBVJsApULqJ/HLcf4+2pPLqr eXp0MODze7cXjMA0CY7I4midMzQUTRihyqUtXVS0eRoqHI3SOVXnBLxyB7FgwHHvXGlT0XypC8kt ahjgniOApUf5fl0GO5ajHHceaNPR5TGUtXWy1EVLkVWHIUZnLTSQ1SACJzFUMwUj6rb3rS1ARTpV ArCGMMwJA4jh0zWR1DhlcJ6Tc6Sqmx1lbfTUBz9Ofdfl096dN1XGEcaVKXFyPrwQCh4FrlTY/wCI 9uxkmvWx1E9udb65xkBlJ+gv/rfT3puB611x/p731vrr37r3Tzt7cOd2lncTufbGYyO39xYHIUuV wubxFXNQZPF5KilWelraGsp3jmp6iCVAVZSCPfgaZHHr3W1h/Lw/n9YnDYug68+WlXlNpbhjqKEw d24CiqsltrOtSSRGBN87UxcE9bhK2q0aZazHwz0crPrkgpgrSMpE6EBXHd6+X7PLrQ7eB622fil8 itk/ISrfcWwt37Z37hKfC4/I0+69pZjHZfC5Jq6oyiurnFyywrLTNB4rEh7r6gCCPdGWtWBBHy6U eLrxSnRpt+ZqXH46hljjaWvyleIsZS+PWqzMju8VRa2mMxobBvSQefachK1Jz1sEg46BWp+23Hic 3Q5GkElbKolioB5IpqeCWPSskbQlSxp2DW/FveyUXNRnq6uzsFpk9AhPlK3YlKaKurMrlHlnjhDQ +ONoMYFvDHV1QUvJHGZLRA+qw5+ntlphXAz0YQQMTU8Ogu2Wy1u+sfJjaiQ1UFdMjvT/ALks1Mk7 F4q02vKsLg6gLEMOfb8bEsAME9KinlXq2Otqkix9BkqOqEOaxuFjFBKzKU+41pVEmmitFLA9Mzq4 e+o/4j3SWI6q6sjh1RE0cDjpoabC5KqyWZp8bBtqqp8bia2oq4VBgyc88CJopo4lErg1AJZjyL2+ ntoIdXccdWaZKFdRr0GG+a7NZT+JUca1OPrUyW14qNppS2KEIyST5aTxKvlBEI4c30t9Bz7fUAkn z6L5UBBCntHQ15+jfG7MzdDjZqKrylBi6iuSsrJ4pqdZmjNQzDxHUoeEFVNwwY8/T3s8DQ56ReCx bj1Oxu8amu27syaloavDSyRtQfa7hhjpMs9HjPLSpkPtzcrHloaNKilkY6pqZlb6t7aArxPRjBbl WDfhp0iN7bXWvxx3ON5ZrFy4mrrq6kw9JTUP8DqWmUCSmrpZlaaqrpmuym4CfT2iudcbgKxp0NNm toLoUljFR0V3YG/MtF8qsRs4ZaSKll6Zzc523UQ/ZVyU0NeMxFl5xLpTI4unhyAj+4Qmz8Efj2ys jVBY46N7zYLdQzoO6vWLvvsmj67y+w90mWiOFxu79kYbdC1eXpsFQz7T3dn02/mKCbL1KGgxkVZD kjZ5QUDW1exDZRw1V9XQaWyK3BVjkHHVdf8ANzpqTpeo+TvT/wAgfuM/0T8tsTtruf4N1WCyRrIe h+7Om8ZjcQNrYnGKqwYPZ2945JZcn4iIpZJC/KtwzuItY07VzXP2+o+3/Y6H3Je33F3dRz7dct9R bnROpHxBhUf51YeVVzWvWpplM8YI8WJSlNTmryGJrmhlaNkjyEC+WOmmuCSkUjKG4YC1ubew1DeI mpfwV/1fl1J287HJLD3J36c46c/kF2zD2EcSMrUfxjJS0mKlzO46zGrjJYsjHTpSxbbxdHBphh2/ h4FCrKf3alru/qJ9+1eI1R6/5eom3PavALFgD/k6APA4+sjavqqmOlkxrzf5MKeeMvUKqyKNFySi OFJUn6Nx7PI2SIgsK/LoBzQq1dIqQehP2vlsPj0WqB05BF10tDKUWoSF30sZV/SJVsQD+fr79JOt CEweiuSwZySMDpm3L2hgKKtkpcfHMimUz5CWUpK8k8fKIkanVHGLnST9T7R8eDdMPt8oFVNf9X2d OWztw0FXkRW1FbD46qF3oYopETxORqLVX0kDv9PbiMFZSekLAqxBXPR3/iaY8nuioXIZ2LBSUGI3 HU4iekq0/imONfQ1NJrxPkN5KpWmaQLY8En8ezqJg/Dh0mkJ46QPs62Gds7WoI/5fuxsjl5c1vDe 0eT2vPmNi0lMq5nP0OxN1wZTB53qaop1io6bszd9fTU8uQV2Hk8R8fN7vEA8Rjq0JqWx1Yl1J2hi N79tfIjeuRoc5U7qweNwWc2xtKmx38VzEGN3DjKXG0lTRwyBIYt87gyrzR1tG5EtHTxmQixv7alh xqAz0qzivn0R35q1PYHX+5OjulNoVlb2jge2M/vzee7MzBFT0+4OodobQ22uV3vs7a+5oVbF5Krf OGmjpqKdm1SxzCMazwVSvoYior0Yw24dQ1eq/H+QVFu35SbW2VjauehptkH+HxM5DxVeaxKvVz01 EQWU4+rpqlFlvdldbAce34pEYAMe7ouuonjY0FAejHR7tyFdicpT0WHfLb6zn96qfbWDxGbmwub3 zumnr0yuK2dsXIFfs6reNVTUcz0cTENVGOSI3XUDqcYAX06Yhhqav8PTFiur99VPbFX/ABitG4tu 4zaWx6eeir6ebG1GL3LmZ1rc9WxY3iShfCyuYZoW9ErJwPaOsisD5jpTJHGi9C72DBLVdobT6325 HRwUEkVRXbsyk41ZGjpKeZXoShI0wV2XCkrCdICDV9B7UoJidZpx6KJ3UVqaqOPTnTZVf9Iu54cl JQ4/BYKOlpBBlY0haozMKLbJwuVWOoc0tooVHoNyfr7UaqHHHpLbpqZmp29dQ5XJZSVMFUznL1VX mFrZWppIvtxHVRo+KgxkS3vDS00SamItqLX/AB7ZZSxyPz6XqlBXqdFgsng6bNZupjnVKWSSmiTy eSKOre8Ylhk/SdTE2Nj6h9PbZFDTq3Rg9ozRVOMwMcOKK1YeKeeBZSJQU1sz1LRg3SOzk/jVx79Q ny690bzaEcSIgMREQo3Ku1xHHUSkkFT+nV6gQPqbD23JWmOrJ8Q6Zd45SuwOQwU0VVMx85GUqHBE clC0Y8sErm0ceprEkcr+PbHRhGAAvqekf2BvJa+iwm3cbUPT/wAfq1ihvJJI1XMw1stMb61BiTUF H0UA+3PAyKkV6cNB606EDAbZweJx8kbNHT+byNOxaKSrqGgGlZ66Y3EToARDY/pN/boj8MDGei+V 9TkA46q3/nC/zLsB8HviruzDbMzyP312bhsns/qTHxSxyVeJkzOMnxud7Hnp1ZlWi2ZjqiRqaR+J MxLSKEljWcIjAMkgH4a9bqYlqOJ6+bPUVKyUtTGdPll8VQ0w4aVi95EIHpFjzYfT2sUHUp8q9Meo 6bqRmDswHLMovYHlyRbn+t/bjjgOqnpwaIuxMksiO/m8YQC10dFJa/8AYA+tvdR9nVSfl06Yyr0U 6J5CHo5HkLA3PjHEY0k6GDcnm/090YZrTB638jw6jzVlPUTSWTyeRtOuK0OkSh5JFCqvrMbLf+l/ ftJAz14ClOlbTUONON0QowkikSOUn92WKdYUdGWIgkxyqQTpuC3PuprxPHqv4jQ46ZYkklpZSUeU IWihYqwJUNIAGA/S6AWH9Px796dW86V6lU9bHVGGKoiqULGnho3ipvK5mkQKtMEjZnd5GT0k3uR7 tQ5pk9U4VNehUwu1MTiIxX9jTUsNbV0p/he1Fq6amqoopl0x1+YlkYCFZrXVV1FRz9Tw74YBFSek klwzgpACVHFqfyHS1w1b1/io3TBY6lkqMisXlyE00sdPA1CzGWrQ5R3lkMAYkSKmsm2kgce7hlrp oT/g/PpGzzMwVq49PL5Y6wZPsOh8kuLxbJmYKQpMkRFRJNWzqusVE1DChqamGJ/81HZQSdTH8e9M QTRcjrYicgErQnpZYTsTDZOkoqHGCXN5atpUp6lqXHz1C0jskk9TTSsClFh8eGshLyNLMTduLL7u AtcjPTbwyJqLDSo9fP8Az9YMtTb4rI/tshJtXbOLqDIajK00+QyuXr4aNWlpcPT4eER/avISP2oy iC4LE+7hTTSKAHrX6NK9zN6YAr5mvSDlw2VnTEyQYrNVErpP/HafPzY7FysJqhAgxFJSz1dNjHVV FlmZ5ZfSDpFx79pXiq56t2AuNQp5Uz+3h/Lh095AbtpM9gds4XG4ytyEv3MNHskS11VS4KjraJhV ZvL1FDLTVM9QqyPNUSyOnpUKPTZTZVZSEUdNoIWjdmYiMeYHGh4Cv7OlLVdYdbU+FqJs49NVbnoX p6qry+Wz8OFfK5XNQyTgz0ZNTLBRBoVgo6Bwaggl3BL292IUVDGjU6r9VOGAQkR8KAVoB/l8yeg9 r+usLNV0FBg9yZSDFzZCpM1ViMPlEokpHnWPLVsxjjSKKhwd1hkqdLL5GWJBzb20yoWFDnzNOnRc MKvLGpamKkV+Xzz5Dz6e6TZNPkKyHBVlWwhpMcyrm81V0dJkHx+UyUd55KKoWbLVGSqoaAxQx0im V430ro0k+9aSzBagKP8AL/q/LpgzEfqhaV4gVpUD9lBXz6cMftDbtDPW4ePBxZLM1VNPVyzosWOl w9Hq8lKtPUNU1ccWdq6dR5o55ZJxDMOIrE+2J3EYKgjVnj/Kvpw4dMTXMgj1K+MDJqP8GRX0FK9L ODHUOIp8rJLTxVOQGLjneoXP0cGK27SGYVMlJX477oVGSnxvkBSGF2eq8YBRVX2hghlumDq1Lda6 iRx+w+vy8q8ei0CScpRqRAmp0nuPDH2548OPSep+3sRS4mi2ZTRnOY+vyn8Jyu3WxtFQRHFSVdLW 5KrxghjlqJshk42MjtOwiVFADBePZqJY40ChT4YGfs/znoyFu41TMCAorWtaUrStfn6ZPTbl+zNt QSvUT1M+BlykMlLjcXtgvXVGO25TT6JKjcMc8yQ5DdE8erRFpWnQR8tp+r4kjqC3n5DNB8/n07Hb yMBoStCKk4yfT0X1PHr2U7twNfSsmEwL5Stx+OqqXbWPjifLTYyOqipJ5stl5zEtCssccIUBWbwu r34N/dzMBUqO7/Vx62tjOD+odKE9xJoDQ8B5n9mR1Eod34So20uXr8tiYHzNJO0mOGVxmY3xLkEY Sz5D7Z4oqWJqiolSlx9OYmMEXkmYggMKrJpirXJrimePH/N/k6q8E3isojYlTStCFp5fOnEk8Tgd P1Nkt11+CpGxuJ3btbMVE9Rj6rdO6KqbddXX0ssUEdBi9v00P29DQCNYDJK8nijZmXSGUMRRmVyF K8PtP+x/k6sUjjYBpVZBmi9v+9E5/wBXl0A+Y3bvr7jdW3spvbK1lLX5CX+8Jo8jTGhr3pv25Iaq uoorVlP47AxRukJfVw1/bRqtQDk8ejCGCDTFItuoIGK1r9tD/lz0GvlWeUNFCfEbJTU5cqamw9Je wUhCQrWFgFFv6+9fac9K+GPPpmydWhAoqZg0MekzyrwKmoUEEg/UwRXsg+n5/p798+n41p3Nx6Z/ funev//T0CYKd5I5pgpK04VnFuNLErcn6AA/7H3sdNu9Cq+vSgipIRTqiASCZFLSkaVBfkMSQSFQ n/ePdvLpIzMWr6dNzYypjDvoDmNyJLXZrAXL8/qUe9V6dEgYeg69T0pkUyltKFWZdKh2Kre7cH0g W/17+/V60xpimeo00Ipn0ag0oVJG0m6KGUtz9LMNQHuoNenqMePDqKlvMtyRZhcrcEW5uCObj3s9 X/D1NdNDKYmLMQhUrdrXvcAFSRYn34HjXh1TP59PeEljhlqZ50V4hTxs8jEjQ5lKpb8csfpa3Htt +AAOa9bX+XThQyTFJQiskENbM1PMpQB2lS6xaSwClm+h/JNvdSPhzmnW+mDcFLJTVETSEaqlDOyn /Oo5IDif8CQtzYcAe7qcU9OtgefTB7t1brLAwWaNjeysCbWJ4/oDwffuPWjw6dLgxLH6WZ0qDpA5 VnRiVN+Rp8fvR418hT/J1QccevWCKSEtF50lcIQSgOnyhTeOO9rqtrrcfg+7ZzTrXXKYJ5ZZYEeN XJdYy3rjjY20ahw9wbX+vvQ4AMa9eJ9MDp7rYQsGJVNR8kESoqlWi+8Tx6/JGRpBRZgrWPB9tD4n +3+XVjw6g1Cmkq30W0QSRyldQ9So6kKDcgHXc/4e9jIz144NB091c5fDiaRislSzSBfqGH6Y0U3I BUN9B+PbdO8D06tWor0i6hVVzbm5N/6fg8f1+v19vLw60Oo/u3VunWcjycjWokC+NG08EBhZ+QvL D/be2F8/XrxI/LqJKxu4uCVAF/8AVC1hb/BV93A4HrXn1F9udb6e8Y96eriKll9EtgBqYxujFFJI 5ZU+n9AfbT8R69Vb7ejObQSkqNmbdpBJSSiOmlkqaepGpA1YZ2nX7u7eCZFnJCkcEi3upFTjoqmr 40jEHj/goOkX2vt+NYcJkWpKunqoJajA5Gpq5UqYKx44Y6vG1MNTGxAWeAuFFgffg1VJBz05Zyd7 pqFCKj/AegUNF+ydE5jPkMbo12iLpxfUOVFiObH6+/a8gsOjHqJPJIyRrOv6U0LKtvWqm6E/g6OR /Wx92UCpKn8ut9QvbvW+ux/vv9t7917rr37r3Xvfuvde9+691mjNkk/xCj8/1/23NvdG4r17163N f+EklHCMj85jJWVEtRTYjoqahpFlqvto1rKntFa6oWjcGmSV/tIlklQa2CKC1lA9q7NtRkFKf6j1 Rq1WnW5lkMRHkUppzSCoGPp9OjTGFqWngZWNJLMT4pV1emTgqfz7Suja2pwr0rRSVFPTot+5HhwN VA9BUS02TXHSVQxsxeZUpHneAVFS92ImWS4K35+oFvbZQ8CMdKIVVSP4ui75TG1b5Fa7KmvqKyrn skyyLFSlZZlKS1kFR/k0UEKD0FgWZePflhWoqcdGatRQF6hS4SDJ7z2JT4Iph5P7zRRZ2HHRyUUt fjRE04EFTSoKWEic6ma15foxN/a5QFDafTq0eWoej8QZiHBimpK+pp6yklx82Jr6t6djNUUkslrN AVDwyrA2nULi9mBHtPK51AseA6Mo7PxaKoJY9LOs3RsXEZdtr4zOU1PlalaGnx9NnGdacHwLOtJT ZLwP9vOvqCiUaC4ClvbDyoq6q560NgvHqUhag6CPL7qxs+XytMa+OdcLG2QSSR2imx1TTIaiXKOP IBN4I4i00ZJRH4te3tjxK/izXrzbJdoGJgYinp07bXyFNmMXhsljq7FZXH5+iyX3Gap5mbF14qDI yRU1HAPHrZWYuzDVquP6+1KCoBPRTJayRuQy0z0tpM9isjX5DbslFUzZLa9VRY2njkX7amqoFoKH I48Y6RpFWp+zp8hChJIuwZSOPdypNe/pYkL6BRRTp73kKGHr/e0uWnkSlx9LI9XBDUQLKs7NB9lV xgsYlkeWT9XOlVP9PbUsDsOPRlaXM1sysF6CPuXrDA4Tfnxq7MhgqX3bg9iZ/qmnhpiyZKojzmHb OYimGeMEsNdHWVgeN6d2tKmhtaFbHRtxRRShA6MZN6lCtXAY5/Z/sdAB8yNjba3b0NhPv6zHyba3 pi8rtPJbjroquhxm2OwKKhWqocDkquKknYSw5WHwLV1KLTCcr+4ALly2BUMCQf8AJ0otTHdsH00Y H14/6uH5dVBfMPujeXyl/ki7b3f2zjdqZ3tL44fJOk6mk7IljioclW7awkMcNEuDR6x6mm3C2Flp qLIUxVjWyxNKFXULJtxSPwRpJKUpU/4Ps9OpD5Mgn2zf5GhmHgSwglAAMqx7vnWtPy61Euyd4xIM RQLUMs2NzcldM0JfVITpKq0dtJQLdSGBN+B7CsaRsaa8g9Snve5NHA3aMr0hNydgVtbj6lJylVDN k/uVaQEyxCVQ0cTuFVDDp/s2vbj2cQBEKhvt6g7ebqSfxNBHH/L1Fi3ukkEOPFVPFSxR+cx0v7YF QQHNNARZirEA2v8AQf4+1rEmlOHQLcIGJPxefTPit5Vg3YlYEmijFKY2gZ30yM19DN5CE1Ej6XGn 3ZoQagN5dMiUgntqenPJSU+apszLBV+Grgp5Jp6nQR55g4aOMqH5WNgRccAD21HCVJpJXpuW4qhU xUbpQbX3BWUNBh/2qVY3gMmVyEKpMXjX0rrs3ljmY8Wa4H19vn4uia4h8UpjHDo3Hxh35i6Tfm2c jlKyXFYfD5eebNZV2WrngxTQz/crjYWVo5cjNEvjhVrLeQAnj2vtCFahOK9PxbWLhO1etmv4hfJK b5OfF7LfCOl3Rjdo9pZLZ3bPZ/Xe9cbGuTyWzsTt/J0Gf2btKlabQ9Ru+oFKHmgjKGDyME0j1ezj SpGpTX/V/g6TXO0tbHhQfZ1cz01tLMR9Gdh7g3FiqShy2dosHnewcrHSz082Vz+Kxv2dbloq6Ktp smuShnhhY+OouFvHZvoUjFwDUnj0TzMQAAaGvU6vhr9ydf7P6xx1FT7T7Eh2vW5nr3fmVxNJSom+ oYZsjh6/bmMyBSDcdfX19eHqKCRROYNTMPqwLrqBmBboxsJ+CMME9aw3yD6J3V8ev5i3xm6LpqGe LtHdXUHXW/8As6tW9Rhd0djb1rsxPv2fbkTwwUkEGLpBFFLFAHERTUSfaeNGVlLU4jozlEcyMoHV ruVwdJSfIzpv40YTD127MxuLEfxbc8OMgmgfpTcOOy+Yz2C7NrgWpjTZbApiaOsoGSZZ3E7eJisj xsZGJQc9FiwItQWoOjE43bWd2HuLsOs3jQ7gztTgYdq9fvurPUa4ek7C3rW4ymy+7d3UlNJEtQuL M0pjpioMMZGjWX9p5AKgefSaSFSzUPQH7dxe9t99o9m9k7dwM+Si3RR5fb+1sbPDSUeVqsdtbAVl GMpLjZXSer21NlKWSljyThb1B8Y9voraRq6Kp4VqVr0JOX66pM5sajgy2EmXLZbAY/GrTY1krsma 4pErmasluInp2ZgSx1ALYHj3SQAaacek8SmOtDUddbU27PsXLZamNDh8FSPRx02MkghgyVbFTRU6 i38QaFpYIiAYyU+hW97H2w79pC8elyVqATjpjlq3z+VnwNMKuRaWYsJbA0qVU6m6qp9VTP4ueOAT 7ZTVUlurtpPE9GhxOCqtqbZwTUlHjXytQ9YaamyUj0bV4jSJfsxVtr8dTLqGgFT9D/r+3w4PHj0z TobcLJFNQpHT+aaR3SauPodVqSihlh0gAClnJRm+jheB709OPn5/Z1tMkdIftfAY/MviaXKzVVC+ OkJgroJ6xoYJp1SVFloYZ4Y67yEDiRWC829o3UA44dL4tRUk/D0Fme3XtcLBlxkcdPlcPUU9Bhq0 UsVNBDmITFDPU4+AzRJLUAUxuhvqt4/ybvawFqT1V0kZjSmjqsz5t/zKNg/FejnpZM/BuzsSreaX C9Z4fIBchM06F/4puWriElPtXERRv5I5J1eWWP0wxn6itZJWAIFPX06S3EkNsGLt+rTAH+X060TP lN8nO0PlR3RvjtjtbOy5TMZWebHYTGRTSNhdsbeoaqVcVt3AU7u60uMoIpGa49dRPI80haWR2Loj ACU9c9NCRpArvxI6LSpZo5mFvoqlRxZSb3A+luPdyACg60OpeOi8kjxkkH02sQpvyeLkWI/r705+ E9e4g9SqmJTS3Km9PJLHGTI2oqSrE/0Yhgf8PdQTX5dVzXpqMhjdmiuqvzpZtR03uFYng/4+3KBh Q9b49ZKVgZPW7KjAhiv0sb2/2IP091YUGB149Llsx9nNPVQu4aemiSQFU1XXT4pQbWD8c/7T7Yp1 UgEAefTThlzmXqWosRBV1srMZWWnDGKn8rshnqXUaKeMmW2piBe1rm3t4Rk4A607Ig1O1B0NuE2C mNWkyldvIY+SCmkFREojw1QJFkZQaSXLRpPeFl5qIl1WHo5Pu2gJT1P8ukL3IcFRFj9tftp/g6E+ LA7TqDT5nN1WBqLQwJjnr8lRVGT8SLohqohWP9zVVbhS0ZsQp5tx7cAHHpKZJB2oGH2dIfJZHZ9F UmgosZjZ5oKWWtikqS9QlLNNIZGraqqMVTJJVvp9bDVo/AsL+22YYFcdOKXoGJOT5f4OpeImhiP8 Qmk268WXpZNFHtqhk3Nk8lHBGTI1ZX0jx0uDgViEjSpmDtIPUqgWNwKCp62wYilGwfxYH+z+Q6WW K7Bp8dt/7rB9fZvF4/FzR09Q81DQY+mmq3eOBxRQxyVMuZqYYz5WHpDsFuQOPbqsoBovTMkLFxqm UsR8z/xQ6m1G5paGvWTFbA3VVyxxxS0s2VOFxZofvImFVUy4yWom1VjSPeMSykX9ZB4Ht0Mo/Cf9 XHpoRVB1TqP2n+YHTPLmuxaKvoDSbWx2Hlyay0+MpNxZBait+/q2Vf4zVR0MCxGsjiDSxo3pjUBi Dx71rYGukCvW9EBBDSkgcaD+Wf59NgxOZ2+aiPbm/anGbhqa4y7iy2OoJZ4K+alUyeCmlrVmyNas 0kmt5ZpdEmgKF0j3RiFJXUePl1YMkmZYNUYHaCaEfbT/ADdPZ2zuCDM0mawu666ozMeVD1s24q6J cFXMn265aqqxRUqy46JqYtDM9OIwAzJG5c+/As1WLV+3z/1evVdcWlkeIBKeQyPQZ454Vrwz0x7z nfd+TxUVVunIZNsRStRjJ7dV9v0LQLlZMhNS0+KRAtPTR1KrLTGZy6AIXBYAe/OS/EjSB+XVYisS uVhHd/F3HhTj9mDTqdjtkplNwQboGc3TDkYYZDU7gTxrlamCLHlpqqfN5A1EdPF4o1pYmhCSvdrW 596WrGq1/wBXHrXjaYzD4a6D+HyGfQefn0r36S2ktI2SylPlkqcoKrNV9FQ7jNPDiGWoCzvkDVyB JGyBlSCBkkLSyc8hSPbjQppqVBf/AAfb/k6Y+rckBdJCilSP2D/Lw6WOzetNo04kq6Tau1MXBTTV 8tbmZYsnm56WKTHO32NdUZESySxRxW80tNHGEkmClxqUe9oqrin/ABVP9Veqy3EzaQ8rU8hw8/Qf yr0HG6evtiVNOi0O3IaOnpI6SaqzYeWgz009fJ4bzUVPWM0f3WvRTwAt6AzaG1L70VWhqtOnorm4 B/tKjyHl/q9T1nbaOBwqZHCUlNii+QqVxcuUXG46hWIQU8FZVY+mR4Gnoo61fFHLLIzSO+tW1G4N 2VcqB+YH8vl1oTyMQ7MfWlT9lT6/L+XXLbOx8TkabLZGWtjw22sJHkH3LLTzx42Rar+HCLSz09PH UVWRiSc6pEVYlUFIl8hutdGpSMBRx/zf5+tPI4oOLmlPP/ih/h4nqAtR17syipanG4ChxTx0INNB nKuHF1244moFihzk0tStVnpKuumqTLNGdEUQcRRR6wx96AVEyM09af6vn04xuZmILkn0GQvy9PLH rxrTpC717VroKSTaO354qeqeIQ57J0JmaOmhf7jzU1LPXKZZqqWGq0fckqyRjSFBPDPiAppQUX/L 07bWokInlqU/CDitPPHl8vPovtU0aRJBCFSmiVdQUBxfkL5AB6pZCdKqLk8n8X91+fRqKkmvHpoy UzUrmMAJWSRIsoRwxpY2Uaqf0m0c8lruAbqDpPN/fuP2dOxrXJ+Hpnlg8ccDXJaZXJXj0kOUC/1v xz715kdP+VesUaNI6ovJYgD/AIk/6wHvfWiQoJPX/9TQrqGWOllpkSenMjyzsrojLPHyxKspuioT 9Ppb3bpCKllatadSKZ18FNqUgLEnJPpFl9PHNwT70a9Vb4j1Bnr5PFMsZUhrxhtJDWP1IJ/tc2+n v1Pn1dVFRUdZaGRf4XVAm5p0kVhYAhSh8bE/XSdVv9f37rbisi/PptIRZHADEvBCjnks0jx+VuPr f/W91p8PTxY0Y/b02qT9wp/q4+n9Ppf/AGA92Pn1cYQUPTpQ6vJcAlVsCf6EI+kn8jT7q3WhxHWf GV0tLFPFHHDL9xeArMxVRfVZ/TbUVN/r/X35wDSvWhgn16f6WrjUGGiFHTv6PLBWMzK2ghg0JVfq fzcauePbZB4mtOrVHrnpNZyb7iZJfG8RLSq0byCTQyFAwRrB/GXJ06rm3u6inWx59M0g0tb+gW/+ vpGof7A+7Dq3XOnbTMh4+pHqGocqR9P9j79x602AT0+412SvxrBR5EnQXKqQ5tOGBDDSwBb1XP09 0cAq2cU60hocDp7r8YlRUhoGpqQ1Kx/ZwtJ4388SnWykB0p4/MAvrKhiwt7qGIHqOtEZr0nHFTTs RVUjJ4pHSR3Emhp09QjZ+VDr/QH8+79rfC3VaUz1M/iFO6UdEzaYonkd5kJCxa2YtCo+jxyAKzN9 b+9aTlvPq3AdZqaBsr95UNL4iHSKNtAKOAOWfVzci3091Y6NIp1ugNc9Yshi1o4Fm88jlJEupBSM yPyFSO7EMgHJ+h9+ViSBTrxGDnpirNLSl0XSjFrW+l1Yhrfm1/d1rQA8etjz6ie7db6faWFKidIJ CdIady0YDMPHGLjkC30P1/r7YJpU9eA8v9XDqXV4qMRVFQt4vtqcftMVaRmsCHlI4UsjjgfTj3pW NQD69epnpL+1HXun6hjqIKYOi3atR5IdJGoRxPJAXJF9IMgZbcEj/X9tPk08h1Vv5dCdgdt1q0VP kMFnp8dX5KkjinpUCy08ktapaCFRIGS7+PSrHkMAVI968h59I5JBrZXjBUH/AAdZ81mt1R7eq8Nu LHPUIv20tJlqJRG0dbjJZpYhlKd1Ku+jyQ610FUNvVx792nP+rPTapF4qSRPQg8D6HBp0GhqKZ7S B1WJ7CV4/ojEqUklhP6A2oq1hzx7ppNaefS8Vr1HkjjkV0SRJEdQ6lLkLILeRQCTp1oQQPfqkU9R 1bpklTQf8L/63+PH+BHt5WqPn14dY/8Ajfu/W+uvfuvde9+691737r3WWM2B/pdf9vf/AHr3Rskd a8+tv3/hJlumPb3afzY2m88E02e626kzyRwXc+Dbe5d40FZMZJFjHggXdUfkte1x7VWjg+JSvAf5 eqS4pnPW8pgcbFkccJow09I0VZFT08bhnlKnWJeWuREh1KPofbE2oOx8ulMTkKpr0G++Osts1Ese Z3BFO37UHjqYZ5oGpqZG1pDE8bKZIZXuzBri/tgH06Xg8COgk3FtjbVVRVdG2Rgjx8rRw0dLk3WA TwRhZleGu9LyTgRlQvOpmsOT7dBqOlcTFhnyHQL7d2/WzZ2gy23Wo6fEYXK+SWedSGmxsRMc5nik F5G1BvGF5CWa/vxkaNgBwI6XQQ+ITQ9Cvjd+Y3cO4v4FlTTJDWVf2FPHUyQ088AqL00VRPknIjmx LuiKiqdYZx/j7S3EjuFIbIHp0MNmt5VlX9IkdEr7/wBzy4zuTd+2Yc42QyWEqBt7JVaP6oaWOJJI WWFXEcNTTREN5By68+ySWaeNiWPE9TrsWzQXkQMtvQU6Amv7sykVTv8A2zJK2UzFZsyk2bt+npXm gqqrJ52pVf4lQT2ZqqGGCIyVSkm1rMefblvcsSdR/wBno6vOWtuSJT4KkA5Hn1YD8HZ22/tKXozJ buz+987sCTI5ifcmdxMdFBWYDLxR1mPhxZi1L4sG7SxGMEsQuo/X2cJLqpQYI/Z1BHN+zxQ3TyW8 WiME4/1cejQ9g4TfdTFVQdX7ixVLuaqwmYxFPHm8c2YweS/iYpZcNuSWGlR66LK7W+2kMDx/RpmE nCi1XmdHICdBuytoJQA7UzToMsFveLeewqjD7gpM9je1MJsF6vdsC0MlTtWsePITYGoyC1pX7aet qZKbzxxSWIV7Ace7Q3ErnTpz0cTbRG0eqMinRrOnkT5L7T6VmzNTVUlLsDc7NkajF/ZCSn3DhMOM XTUNZ9w3np3yscryBYQyrpBv7NEQGNi+CM9AvdYWgWQig0ivRe++O/8A4ky7nzPxN3Nk9zSbC7O3 Nlfj9gNrbV2pl6/dNd3DOafceUzGOzlHHKkeEhioyhqrWjqCxJ0g+0ZSTU5Q5p0bbHabi8MUxUeR zw0n+fDPp5HrVY+Xw3zsv+Vfiq3Kx4navXHf3zu7Q3nS7FyLrJu6lynWjZHa+Onx1RFITXUUn8HW pykzKojn/a559obt59OiWMaPL/P+fEdTHsf7pO4EqzC+ig0njp0sajPDiCaVqPPiOtUbfWcNXnWN HKZ5JWJYqWVtTEKG1afqVBP+sfZHFFHqdqcT1fmfcwipErCg9D0ndy19JTUuOx8ckkayU6zVN2Ky mUmxYMwGq/8AX/D2ujiLkVPbw6im93FVDCvfnqNj8glKsELcmxeE/wBgh008t/akUL9fwfZiE0qA OHQUkkLsW869OVbub7toYyI6eVDoV9C/uBV0qHcCxJt9fbb6m0hT1pLpkfSG6hR5fJyK1MAIacTW mkXmV9R8ZRSCAyH834v7usZ1YbpTqEpOocelhFBPjxWx0cjvRVSQiqaNvHJfghWAOmMK/Fx7cYN+ FR04LQZ1PnoTetMpJiK2WKonKQVbCmjYujKDGzAte9jL47W/oefdUWXxRQ9CPavAQEFAWHV/X8n/ AGlltwfILcO6Nn+aHJ7Q663DV7XrpZzC65/L0rYfK3k+grI8PVvJTIws8qi3I9n9tKANLeXTPMDx GIU4062+9i7OzOb67696N2xuqsqMftav25n+ytw5MrLU7gxFBVvV1+38mxGtp8zkXSSUr6g0IH0P ukzLWvz6iybU87U4k9Fd+WPdm3YPl58Ftv7upoaGfZO//kZ3JsxIqtFp8LvrqrqbcM22KzN1UMiR ZXau7qKWpppo7FqWskgUL6ffomil7Cc06ObPb7iXvCVFOix/Gneu0P5l3zF6b+cuYo9ttvz4wfy9 anP9hdZUMqTYrr/vPeeXzeRxkEMi6pa+J9o0k6x+T9ylkYK/PtSbOPEmkdPSwXMYOqqk9GY+Ifb/ AFZ2fiMn8/tljcWKw3ylqoptt7I3hjqWDd/Xh2LVZLY+bxs1ZCz/AMT2hmM1tvy0Ey+lYpuf1+2H AkoaY6RRpJLV2bB9ep3efaO4uxqre7VYqJ8L1jg9vlMbA60OIw+Q7Gm4ytfnxql8uAxBNZJERZI0 H5b2XyAgsadynpZHbCozWo6Ll8BtwVFXl+2+06lnzPVG6uq+oM90rQ5GRpETG7V33vnZecioKw3e kwG8MjTSZiqjLa/JOuofT2YRsCBxwOia5hKknFejwZraS7eo8dRJlKeTPZL+9OWqKKqlgoZZMfhI GyORyGJRTeahoVmSmjY2Mn1tx7SyIupj0hIJ6BN5SWyWSp2kKClXEYmkEQ0aJJTHWeV3/cdWQhTY W9PH1PtKwqM8evKWBo3DpU7P2ZhduY6jrMTRQ1c1Xk55Zav7o1c1NLL62STUxJiDE2H9i1jx7aJ0 gnTU9O8el3u7LRV9FSPNTpUfwysxpx00ekvQ1U7tSGZGchDWIlSxaxuADp590jZmGVoOvH5HoW9g TYmkxUqsxdoAqRyvBPHE9QKjS/qI1a5lJYX5vz725IU06dijLtjh1Sz/ADAf5svRXTHZe5+sttVe 7d0dh7UyVfid14TaeEgnig3Dg4QsdB/Etx1mDoKKSmksHaA1KSE3Grn20FqKucU6ckv7O31xySHx FoKAHH2n/NXrW571/m1fKDe9DVYDrzZ3+ivG1FdGKPdGZnxWU3jFU5d6uYVkTUs09FDkFqqiVYZK OGllhRi3kLWK3URk4IP2dIJN116hEQBTiK1/bQAfs6q4yzy53LV25u0N4Vu5sxVzzVta+by0lVLK 0tQi1VXLRUr+ereafgyTGVieLn28opUDAHRU0jtUqp1Hz8z+Z6KHljSPmso0IQUJydeaddLwoIPP IYQEUB0W34sD78aj4eNOjWKvhxBuNB1BSSL1Rx6A0pVAERrWvflnJNveiHoCfLp3rPTHxVEzP/YK FgBdm4udP5H+9+/HgvVBwPU2rhjKgSVRhQNLcWZvIspLhrX4Zbgc+/Kfl1r8umenpxPLHHqaziQn SVvaMn+vHIF7H3etBw63wrTp0kxElOKZ4Xc+WYU7kjgs4dlAtySVU8D6e9E6gajrQata9Kba+xcz unMLjBURY2gMiNWZerdmpKSFI5CXKaladio4HH+uB72ig0r03NMkQBpVjwHQ5Y/ZezcPLLBt3P7o jWaZKSqqoK2WkosxHTRoJWp1FMkc0Ky62ExOhNX7ZJXV7cphqn7Oi95pHAMkan09R1JNLsvETJX4 yix+WzMySUtIMmktSlFRIrL9/UT1byR0MMeu3lc+V7en6+/CmM9a1yuCGaifL/B0ljS7blgnoqHC xZZ8h4XhyYpXMVXUhyifaMr+WjpVmsqjUL2/xPttnUDJ7fXrZkZalnpTyr084n+FbbxxlWgiX7+J ErK7ORHHR1Ip2tNSUctQvkGApqo2ldeagrb9PvakHSQF/wBj/V+3qmouRU93kB8/P7enOPK4Oghi pHy1Fl8rWyUjUeI2z46PDQrUguE8tNBEaipeZS5N9CpbUQPdgVrStW+XAdarIxODQVqT8upWE3hg KCP7jJ7hosvn6SrnqJIaukqclg9lUNO7xIsEaUqw1+TkqbM0ialNgdRt7cUjNRjrTRSE1WMhSPzP Wbb+66abcNNXVKboyc2RmevwceTo/LQbgyMEg1LiItQndpZjr0vGqGwGoKCfdh8VRk9VaNlSg0im DQ5H29PC7lz2UzmXmrtnZ3JZ3D09SMtVSZXHPt2jllYSGm/jan7OgWRAFlMazyNInjUHj3ss1TjI 4/6vXqhiQINMqhCfnX9nXoO28VV0s824cDW4CVlnw9RPDRNOuWjJeSLH7ZhGOjnnrJwkZeedYQkT WAvx7r4lcle6n8utfSPqokgbz48Pt9B8gTw6REfaNMtJTVVLsbPY6hkrpYqqujenL1C0Mbti8d93 VsZGp4qlhNVKzW1Fm/1Nqhs4UU8+nDbHWQ1yhoK0z+3/ADdKTbeJ3lndtNutMfiNpTCKXK0FVkaL +KzbgWaqio6eAYyqemxNLT19dIohXTJMwR3/AEWJ0pqpqvcP9VB025hjlEeouOBANAPz4mgGelhu Kq3njaDCZaLAUNPXUkEGIq8GdyV25cjJSzRyVVQ+KxeKqMLtx4Up1m1xSl7GQR6hosXxqUVrRR5d MKsLO8fiGnGtAB+ZNT6cOs25pt95LAQ7vwaiKVK6F8bt7c1Hj2rc5IMgJpq84yWu/ge24MPA4pqe GJJPIAHJDEkWIYqGB4Hh/q8v9R69CIEk0SE+eQTQY+yrVPUnKVvZ/YEL7Tknxu0oMLh/vYsXteup a2SjnxqwQfx7dO6amM0MOMlyUzM0dGqmeqlKliyXX3flKivy61S2hPikNIa0JOBT0VePl5k+vSEr Ny9m4qizWO3Ts7a25DBUUlXj9xTZY4iKkgwsj46ppsfTpUrNWVdfVRCR2YGoEjhhbUtqAuMMlaeZ /wBXHp8RWbGJ45nWv4aVrXOeGB0iaDJdlZCsyeGo8NjaDGLEtTl5KHLRUr0uN1ifJw/xvNZGOnil qhHoqZQRIEj0qV/PgXpTFOnGS0ULIZGZvKowT5YArjy+fWCqy+7M3Dh8diqmiw2C8jVtRHV1RdIc hQ1UtG2fJphT/wAQkpYlCxs0skBb9HAB9tMGI9E4/b/n60kcILs9S44U+Y4Zr/g6xdqTbNglhw+G ki3Xk46Gnkqdz1kuRp63FyXjmrBVQSRxpW1Va4Lxgyt4oxqPLge3JSg7cFqcc46dtFmJLuNKemKH +fl9nyHQKtKZXkZFIjYG3mZi876ReaUkERo7G4UX+n19sj06X4AA8+o1RWLRIkpIlrSNVOpuBBf9 NVNHwvlAH7S82HqP4HvXHq6IW4/D0mGdncyOzO7uXdmN2ZmN2ZieSzE8n3vpRwFB081cYaGmkY+o JPpU/kAazID9bqT9D7qvF+tE0VB6/wCx020d/uYwt7nUBY2NyjW/3n3brUnwHr//1dBs0dWVZZ54 lCLdEetp2I1WFnCysyKV97qOktVFCoyfl14RVXjUJW0dgoVY1qYmfgkgcLzb8c39+r1s6amqHrka CRirS1dGC/rZjUcC4sLroB1A/X6+/fl1XUowFNOuE1O1MkwWspj5IShiiaRmk02IW4QIb3vyffq/ LqyEMVwePXBXgkSASSSeU/uTSxoHKRRQ+OKEISAWYjk+9Gtfl1cigbHn1Fi+2WuAf7g0iSm9nSOo KWPGoqyIzH68Ee/GtMcergjSCw6e1/galnSWujYlboK2nuVvcoW+xseedXuh8THD9n+z1vFcDHWe GLCeF011ZZrlGerpGeO31KKKQG5Y/wBeRz70TJg9axXAx1iFBRVBEkuRkhSw1TOIZtGkAAMEEVyb 2FiT/W3vephgAdbovp1DyuPoKY0/2tdUT+SRkkFTBHG0a34lTxVEwdGHI+h96VmNaqOrAAcOpcu3 6YsxjzdNIb6mL0tTCLMf1jhwVPvQc4qh63QevWSPbDB9ceZwpVbm8008X9VuVMBsP6G9r+9+J6oe tEAileuc236hfGiZXCOY2LhxknW7MQbWeFdBH+v/AI+/CQcdB6roxQt08UWOqo4Wnj+yqHmlQzP/ ABOjnEhQARiIgq0QMvqNxwPx7oWHzH5de0n5dRKjHZWphmp2+y0tVvXeSbJUUbyTMipJ41SRlMPj iFtVj72GUFTnhTh17SSDU9YRt5Srp5KYyDlwaukIjbmyq6MAx1/j+nv3ide0EdeocZXM70Y1tB51 qGNNPSqDGE0sPXIvAdRex5HvTMpz5062FNOs+RoctNHK64qVoCr+tKimqdMpKhHYQzuEK6bfn6n3 oFcVYceraT0lpMRlyQDjazgEgLTyMbFvqdKni5+vtzxI/wCMdaCkeXWL+D5bUqfwyvLPcIBSVDF7 cHTaM6rW/HvfiJx1jrdD6dP2MpamkrBJUUdZCGhqY2eWhqlVGeNQjWMQAva5P49tEggjUPLzHr1o Ag1p/qp1GrKubTXQCmmc1E8+uezPbUYvEiuBYjRHY/4fT3tQO06h1vNSadJ3xS3t45LgXI0Ne39b W+nt6o9etdKbGSsaQobqYqKWNS4YD05GKp0I2hhcmQ3H5B9tPxJr6dUbofdlSwZzaePFNJGjY2lO CzEcY11ML09Q0mLyK6gqqQCGVj+mxXkD3o1q2PmOi6YFJWrwJqPz49Lukx65CCJ5w8S10L0WWgnV KmJMzQNBFVCKa7KKSupTrQMNQN+bH3Rs0p0mfBIH5U9P9joouawhxWUyOKnUifH1lXRForFZGpnt G1yfUkkRRxb6hv8AD3cORSnRvHJ4kcbjgQOmdqWWE64X1qpBul7ji4LJybc2921hsMOnK9YZZNQI kjs5uSwPF78GxBII/PPvagVqpx1vqN/T2517rxFv9tfj+n496r17r1j9be9163XrloN7cDm1yRb/ AG/vWodaqOsqxsFJ/rIq8G/J55/FvdSQT+XWsE9bJv8Awl23S8H8wfsTZ7yeCDffxc7Ix8cULKqy ZDD7r69zUDGJwRK0dFR1JAFiASfpf2/arpc0OSvTVxXStDTuHX0Rdi0lZQbRwVDKqTVdLGrTs0ll LOPQwd1jLFlF78Lbj3aUd7A/D0phoRQdM+9K5I3gpW01cyu8T4nzGURysf22kCRyN4XJvyQB+D7S sqj4T0YRrTtzToqHdK/cx09BTPiofGVqaqhNJ5qqg+2vM/jq51ljp2klRfGQmoEn+vug8QEVpp6W RMi1HDHQPbE35X4+ulM2HZvvknEmHnMj/dY1rR1DRrBK0XnhZuGDsrj8W97npSgOT0Y2RPirTPDo n/yazGzf4RvrA0+eyuA3LiMdR5/aVMksqVmQr5ZTJLBJUxPF4aKkhZo/GyyBren+vshnnmjDAeQ6 yI5F2yG6khM0YNT6dU61Pae+sPumDcOY3dV1eQyf21PVS11RLI8gpQggORrZZXjqUqIQIw7WNwFv x7TC58QASLw6yXtuW7YWlYIwGp5dWRdcdq7D3jTbW3DncMtDJtw1SJlMfUT07jKTRwmCnrfA0JrT TMrBBdFCt6gw9tmca9SYHQZveXrqroVJBPQjbA+S42X31NkabN1NRiKgU2OaEs1NFW0RKvJTk07B zK0rcM2oFQV02PtdbzM6ahxHUa80cnzNG7GPy6ti313Pk+r9gY/tfalDgtyVWFqJarakS5KSGrrH ypq6eupMvT6pJop8WK8iSngt9xH4xGQzn2YwTMxVpExnqFbjl0xSSIFP+TqJ8PKbKt0H3Tt/vesr sR3Wa7+KZDD52akxFXN13W17ZzalfDhaCqr4sXHXTTODE8zVAAAexPtY08EYZxx9a/7HSb6fcGu7 dUiJtwDmmQ3nn0I8qfn0FXVny02b1Nn+o+qc7VVFDlF7Vz2+MvuChkWHFR4ShxD01LHWU0ECVmWa eadolicxrGyhg1/ad91RezVmnl0aHk+/v1kYRVDCn7f29UR/Kj5JV/Sv8yeh7Pxpyb7SxHyQxu4Y No0CRVVfn9odrU2Owf8AE8Hh2rYW/vAGlmVJYauKqiDH91NVvbsFyJF1Ixr0In2Z7OwSIxlbhVzS nEfs/wAHTF/PS6z37vuP44dO9UbIqdu9WdT9R7u7HzvbGY3DRx7Z3XU7g3dkjuHEbJ23LWVOVjzu 2clVSxZTWomnlkDtIyi/tLf3aqnDu6J7G1v/AKmWjDw/QCmfmfP1GB6Z4nTpz64+h3pNT4+aqno6 WpWn8kiJ5pDC2mRyysVYSG5NgeCP6e09sUlGrTj7P9WOgtzG1xbzusrnV9v+rPTJkZ0zmVnfxiSG mCRQahpEeg2VWc6EF+eLE+1oooAAoOgNPd6mOpsj1PUmvmhBpKdA6xxPEy8KCytpF7glRHquLi/u +oUpTPV4isgHcOHWOup44ZFVvUrAG99QNlvpFhbg/S/B90qp4HrT2wOVrXpxgtBilqai5mml8VPG n6nW9mcixJKmwBYXPt0aRQmnTiCRQO416ev4oYqVqZ3Z9SBTOdQMZI/zMtiUkIJB+g9615NB0r8d gtGPSy2zFLXwxNBOxFJXQFS8rRsUGgyEIF9Ss30PBPt2JgGJIz+3o3srgJmuadbT38oenbaewH35 4Gvld6TQ1UlF54q9YoKdaagparSYw8L1EmtFNw/1tccmOlUAIOfWvSXcmedtIOOj9bl+cO5to/Of PxbS3o+O6W+PfQtdS7zwGProaKn7H+QXY1atPtzCZCqrGMVTT7WoBrC3h8TtqJJYAF1xc6iUQivS O12FpJBKyYJ4/wCbqq35IfKPP9hdp7D7J7ByUU20+ge5Ox+rcRV4doYJp81uPrBNz1ONy9REkhyt KlfO/k5DSxo0eoBdftNbiYzlhIQcV6GthaRQWzKEyP5dGj/kdVObHVn8xfN7dzE23JNwdf7X6igy 2OSWTK4fcG46bJfwvNU0aRk1MdFRVsi3JAiViSQPYmR28OrscdBjeyXcIpNR8ujmbl7/AOoegOp9 n7QwOX23HS7D2u+39jYunqYKzD4PA7SdtvirzFTRsKiZcxl6Satq1La6mplZFa4JBZ9SNRAGK9Es W23bxDSlOuGyPmNsTtT4+57rSPFVUG+Oycbnd+borqmkjau37iaDD5OOTE5DEx1E/wDBqXLIYDjt MzlIbIVRuPa2JI5FJYY+fW/AmtzRxQ9CB03vHGdddB9B9D7U28MpW7B6o2Xhc7FRPVo+Mz0E8+86 6iq6ymlpJJqnF1Wd8U1OWKBU0yKSQPfiqKCFOadF81sZvPPRqt+9n46up9g0VZmKKXO1eY/u3UVE ixpV1mSzlL56bZmMlgeKSkpquMGoqoiWjIjs4HsvmlC1FemmsGoKAAjpJpnYZ45shDBUCh/iqUWO SCSWSeXRIZZ5GbSSsEtmUvYqeLcnhMX1jHDosljMbUp0ssNNHjWrqjyl5czWLHRRISjRmo0kwwox jMEsQvd9LBgDfm3u6pUVPDpo46EPP7Xoa/ZmWWWorF+yWhzqCnnGmabG1H3EdUrOsFwr2LxXDHSF /rfxjAwOvV6WODmravGYuPFzinrslFi63xBWkDNWTLGZV4itN6i1gzBTxyB7L7pmUjT5dL7IVJ4U 6+YH81u89071+YnyT39jM5XrT7k7n7Aq4hUfbzo8VPuCsx8fAhRShjpgfTYe1cQqihhmnRZcQxSy OzJUknoJNr5vL7tjav3hvSXFY6KoSWGOnWipKipNOjQ3RxDJOtzKyJoXVe5HPPu1FQ0VcjovmSOG iww1b8+lfTVm3BMybUxQeZXWI5HIQ1Ahp4YmYtPUZCv/AHpwh9QQXu3PHvw1cWPTNJD/AGjY/wBX p0V7ItryeRPkWXVWVjeVP0SXqHPkTkjS34/w92PAHo1T4F+wdYqXSoqSULuvhZHAPotJ6ySLgAj3 p8hadODrmrs88rAsWIPAIBOkXHLA8W+vvXkOtVwenqiglqnMojpWRAYzJW07TLFYK6eOAMFZvTYk 8WPvwwD1Q46n0cLtX1Xlo6SWSOmhcpRxrSRBSzvdgboGBS3H1+h97xTzp1o16lZGpr1qMXHS49Gl E6VNJCGEqzs8LL4wIyuor5PUeApH196XJp1rABJOOl9QbJlno4YXyOQXJ5WojNScXPUwUcFJT20R x0YUw1MEM+q0srC7L6RY39u6BRQf8/SV5qt8IKj1HS0n6+D1LLHXZxKKL7WjmyVRkmkp3gghV50o aVkK+QEEPIxCIzHSLW97KCgHkOk5kBFNArxAp02NT7YpHqmixc4qqgPSJOYDJNLFATqvPUNLC1VU kW8hX0KPx7oxoKgY68WcACuB/q/Z1Bxu2NqVcRX7nOmadnlhxiVlWEhm1HRNHNC6x+ChDXhJsSzN xx79QUyKt1bxGwSi19aD/Vnz6f6faMNZVSUFNBlMvUVMCU1XnsnPLXutHTlQ+Px1RKzRw0pXioaM XFrA8e3FRRgKAD6daMukcABxoP8AV+zqScLhp/4fSUWPxdJhcFJ9jUbhaT7RKutqJm8mF20skjyV eSntaaUs8gT8KPd8A0AHVQzjUxJ1N5fL1PT9SZLDV0tXDHmtnYClxM6J/CZ8niKaczwoUp4J46qo hNTRqLmR1ZyDx9fewRmtAK9NsjgKfDZiw40P+r7OuW5d24yObGR0e7MJhYCY4IKqlydNkGplAaCT IVEGIadKKN4dehGZXYFVtck+9s4ABB6rHEzA/pE/aKf4ePULP7mwWMhi23j8wkWKEgqzHSQ0lTur MZqphKxbjyMKVroJKWeQmmpGAMWoMygKfdC4p24H+E+vWgjmsjJ/mp6D/P1Dm3hgIqSDISVFY+Ri paV6HF4egR4nyL6qSPFCtraoyU8UKeQ11U6I8s72jBVT71qBUjUa04/P/MP59a8ORnKgACp48ABn 8/l0mMJn8FV52myO+slTy4vACgrKPa1EhrancGTqqldGBoKASQpT4WFYy1VPPJGZAguSHCnYPBRw H869OGNwjeAhLGtWOAAPMn1+Q6HtOxtk19VQDKbzosTJUDH5+pxgpXrJRTVEDilx1IkAXDpmolYL KxkWKCJBY3Fy6gUcWzx/2OkfgTqrFYSy5FeH5+tP8vTlNlcS1Q9TJlcTkqSlIweJxtHLikzu8Kl4 oaSjweImj+8+3p2r5446qqCRLJOXYBUSzOVQtWtVH7T00FfSRoIY5PGg+Z/nToKs5lqvcmVbAw1W 3qDG1O4IMLncTQNUZiOGXEJ9zV4qDKwpUxY6kPj8L1ygJVSySvfTGLtu5aiqONMen/FeZ6fVREut 1Yyaag4HHGqmK0408hToTRiMRNjMfWzVVTQbZp4UqczicFTznHU2NevfJUV8nUxGbJz5BizKHHio gdSgnk7ZFbS2shB5D/V6/s6Y1ujMukMx8yck8KegoP29Bxnc7Jmcw1RFQUtNiIMlX122sN+zkKaC mqneWOpzeZmkjrsnXOkoch3tBax/cYBbEjV8uIzinTyR6Uy1ZCKMfP7AOA/y/Z11TTQUlPUuyUsG EWGJ6fHS0X8TGYqamqiWKgdUk8tWGkVpZQrPEvjEQ9OthqqgVr1ahJQCvifsp8/9X29ISftHKYmu zYhwscORqqCOkw8laaSqhWraeRnzWUpp6eySY+k5paSIRU33LCWXyaAC14lCW093l8ula2iOsYZu 0HuHDHoPt8zxAwOgYqZI5WYs89VK7eaaSpneWWqnlLNJqYEGWSViWe508f4e2snJ6XDAoAAP5DqD UTRUMYmlCyySKPBTksY5ND+iWUH6xRlT9OGPH097OcdXRS9PTpLTTS1ErzTOZJZGLO7fUk/7wAPw BwB790pAAFAMdYx9R/rj6/T37rZ4HpQZAA0tAE9WiCqJ5JtdgfzYHgfT8D3Vfik/1evVWwIxX/Vj pqoB/lUdyQLP6hbi6MoPPFgx926rL8B6/9bQUk8ekaQSygAMGXgC/wBLKCfp+T72OkueuI0NYtrB Uk2sWF78Nx+Afr731vIrSnUpPF+VuRcmzSHXf+lvoxJ+h4Hv3VDXrxdbkCM/S1yj3BH1BB9PB/pb 37r1D69YY5FBZEhU6v1BUsx/p9bW5+n+39+6sakZbpvViJyxAJ1NcG9ubg3+v0966f8Awj7OnOOS QABFT6KV1hbj8cXU8G9/dSBXJ6rXqersQBLBFIuog2S4sFsNNuLkDkj3WnVges8MyxqAsMCFTqWO zSRkkW1AEhedNxySPdT9vXq/LHTNlZI3liKxhG0uzhVtctpNydRuQR/QW92Awc9XBHSghq4pEQiD WpiTUxiF0JUNb0DkEn/be6UI60T1lE1OdTkRx2vZfCzgfn9t2e6/6xFr+/UNB16v7OuUVXAP2lAc 21MJIVUeokEowvquL/Ti/v1OvVpSnHqNLUqys8lEiIr2BjQX0rYGVwdJRl4FgeQD/r+9gf0s9er8 umyWVJG9Z45GqNtKvYECwU3dg35PFve6EeXVa149dxmH/dh+gIRo5Jo2VyVW7fUOPpcf096yeHVq 9SIbIIxE0gVGY2u0TF2fjUrMVKkg2B+vPvRzWvXh6AdduYNDq1mLBpGTymMKfwrgJpZlI/s/n3XP l1auOoK8G6yPBf8AIqHDgf0VVYtbggD3Y/t/LrXU4SyqiqldUshm8YAqHGlXGli+u2kWAuOSb+6U zwHW68a9QpKiexVamVUBJVQ8v9bchho4Knkfg+9geo6rX06zGunj06KyrEqAESR1M8Vyyqb2F7WA 4I+g9+0j+EU6tqPrjp3p6mXwO9TW1LissPuWecGVYVMbRCaap8IRCTe4LG3A96oPTptjkU4jrgci kN/DPlZUg1aQJwIVZIwyMFlsjRi30Avb8+/aR9nXhXqFturqTkVpafMVeIkrZTasp5JB5piwaGKo jRlEytUBSL3A1H8H24RgVHVJgCCxQNToVKXN9l4WpkaKuoMxBMIvNTSxpGKmWgAOtY/HC8dfJBEU Lg3cLY3IHv1ARwPSQrbOBVSp/wA/+TpCb5z1Pl83JlExdfiKmtpaOXIUtQIipydOpp5amnkQJrgq YAoNwp1XFvofetBNMg9P20ZjjZNYYVx9h/2a9J4y0QkZ4qgNyChTUrgO3qADhLsrH/H6n3Sjeanp /PHrC0YmWQlUZlAdZLafUzHUrLZVJIHPBt78CRTPW+mWUANcCwP+9/7x7fU1HWx1xI5/xIH+w4/w v/T3sHr3XMcIL83N/wDWA/3j6+6nietHj1k0ji/0BNzY8Dng8fU+9da6kQj9qY2uqlCL8gNrFiPx wD7qa1HXhxHV03/CeDeFTtX+bP8AG6ghmFPT76ou2djZKVhfTSZPqfeWSi0C4HlORw8Gm/8Aa9qr ckSpT/Vjqsyh1IPyPX1A6vx43FyoyITS4hImbmxWnjVLRgEMZL/qAvYH3e4HdTzK9KrVc1rnoMc/ mmyDqKJY/vzRQwxSRQKZSUtJI07NwqWAC39onXShAGejmGLVRmJ6JzuRKJt01GQz2Sra01daoyGH oyFjgEAeR6cPMAbFB5JbcEL/AI+2RJpNHOOla7e9w1IhX/P0g6zt/pebb2785jqupxtL1Wq0+az8 NYhp2qMl+5jdsYnwkqZMi8YMrElkW639szXSEUU8a9DbY+UruSRZJMLXqnDtTf2d+QEXYmYw+wM1 uPcs9PE8Wc2vRVE8GHp6SZaWHG09JSI6iOqSZbsbEte3J9k00jlcJUdZC8pLabS0fjSgEdUr/KWm 7f6wocXBvjBZ3ZNXHeto6LMwVFDX5Gmp5DJDI1FWLHM1MQLBiOD/AI+0RuBpoO1jjqZbfmS3C0jY Mn29L3pn5IUe+9jVtNgKutxuax9FTS5zDNM5hoa5z4RW0UsjH7lKgJqR2+jXU/T376ZixWtCM9G1 hvdvcOC9Cpx5V6l5/wCR8+1azE5KeqqoYKTI0j1bM+uaWrYqq1OvVwoILsfpq9mEBMSAA5HH59Pb lb2N4jVQAU/1Dq3RflvkZumkm+6pKukgxVNVBZ5LSSTmMmGppvV+5Vp6L2sXEaH6jlYsqyadRA6j jcuVrEh5VRamvl1aP8NuwaT5B7Vpd6DK1eRqoMJtddyZx4PvMnLiaOCpxtUjwa2Fazz6lvMSac2Y cj36ePUgJJ+XUQ7pHDtt2UWMV8uir/NbYOD6U2jlu8t0Z1svFPS02D69p8TjlpMu1NUNLPNV5TVK LrQoitUSoP1kX5PsinhDODqNaU6GPLN4sqhHjHGtSOtfTN7krPkRt3c+UizkdTvnrrGZDtLZme1q c3k6br3J02663btLUqWmNaKXFEwJyy2Okc+z7bwYLc6ulvMlhaXFvcBTRmSlRT+Xz6sd/nN924re 3Q3Rm/du1EseG/ie+aatelq2XH19P2htfB72pUpQhGqIVVbJJrHDm/FvaG9XxixAo38ugfBYJZKx bKMoPDP7etMXKQTeWtyaSKEjlaXxB1MqrLIWDIw5LW/r9Pavb0ZYwD1AnPM7teSaGFKnpqr5Bj6W h1kyPWLJV1MbAq4d/wDgOC1gbRp+B7Xga8V4HqMmck/EepWUheo29ickPS+mSnBW91ELekgA86r8 g8+/EYIPEdL7ORtYUtw6XnYVHBSxbUeKCKmXIbdxk06R3OuoZbM2sD0yTN+oXuD7r4RFSGx0frIB xFelFsraNbkabIZKWkMyYihkrzTG+qno0ssla6fgoXA/oL39uUIAr1o1pUDHSMhmxuYrpaaGSSli 01J+2B/cnrwGEZQ2IWOQ/U/n3qprQDpM0tHCqeltsUVdFSss8bx/cV8SBnuyKqHTpHPHBuSfpb2p t4y7U8+PRhayihrx623f5XOTrK/4xbujeGmgxWF3bTRwZr9kCompKP7kyiQWVjTEWkLH0jk+93br EpGo6ul0cRllBHEZ6pi+enyS2lj+xtw9X9Q5WprYN37zn3h2PuXyCQ1uYcx00eMx80bEyUlOYRZ7 3H4+nslQvJJQdCCG4W3QM44eXQWZfe9BV/GYbed4aauofkKd7196h5pq58x15l9sRV8is3lApFlM bliTeQezW1XQSSK9Xa+Rz2jFOr8PgN2PnPiB/Kv3F3lTLTUO6Ox94dlVlDRVjU1NlN2NXU67W2YX nqCurFYaOmmqvItyI7293urx1iZR0WRxR3FyxkHb1rQdid7Vm6+wKLbmCq1pdswzNW5OLEtLT47c O4HaomrM9kEEj6pWqqqUBL+JNbOBqYn2X2byO+qnRjdXUFpGIolHiEY+XVuv8urtM4re2+e7N2TV mX2707sKapylNNCamGankQ47buPkpl/WKvJNGiIl7Bbnj2dTXqogpjopSBb3tA7j0JvUfzk3htTt 6g6xMlVXSpl87nd/bhqXhj+13BvGs/jWRooqiEtGlPSUstPTJFf0eO3149tRStMQVOK9PSbNHHHW uerG8LWZzvrsfqHITBqPYfRu7tz9t5GCjq0o8juvLna1bisbjqyudlSPHUnmMplYlY2HIt71cIEY nyp0Sz2wUdvr0ffr3dGH3btDr/LF5avH7ixS5OnyeMcywztQeOgnhHgtK/gq6KWEt+TCWb9XtIrK K1PQY3C1KsX4fb0qqXJV53o1cxpa3DMEgxUZj11tJUUpLidyt0EixA3U8gD29UgYPRUVoK9GbxcN Q2Jrvv5Fq5aqpp45YZpNVLDqgEgBj4C0zqVLMfq4Nvp7cVwMH06rSvTN2NvHG9a9adgb+8a03+i3 qvf2+fK8joIZNp7SzO4qGlhBswWpq6BI405LMy2uePZdcdz08iR0vt0ZI3kPkOvlC7oqZ92bvyWZ q5dNVunOZHP17wRM8VMc1kajJVkqRwx8xwGoPAFuPa1cVPkOix3wXPQybeqsFi/tIsZs3J1phEqr WS0UdKdIj/alWetdnLVLr9Qq6dRJt70eBzk9Fkmshi0oB6Yd8ZfIS4yaWsEOPerCCmw9HULL9lC1 zNPXVChWlCoDY8KzkAe7cMDpyBF1qoNR6+vQL47GR185japMMfjcgpB5mUDlFKmWNQX/AODG3vwb yK56MTQCtelfQbfxEU4hkyWUAnpwJjHSUgVzYEoBKZtADHgkH3onVSo6bLGhIpTpNVtFRUWQmpoz UzRrNpGuSNH0gale8UAX1IfwOPetR4EDpwU0g9ONNFQ6ph5K1DIU9EORkiVdAHpfRT+ogDgn8+9V PoOtGg6eaGjSprY4KFcjPW1zLCqnIoWkVCdPkWWnsY4hduPwDbn3sVOMdaYqqksaAdLKfZc1RTxx ipDzwTwmTOTN5JqdY3DGmxNMXpUijDuFLFbOb6j+PbwXSPn0iM9WJp2+n+fpTpTS0dRVLPu7Oha0 GaQ0VTjKeJPt4zHTQw1H2rNTNPJIfRCVQnm1gD72owCTmnTZKkD9Ncfb0ypiMjXUlfA27sgTVVMA aDz1NZQ0QilppIjlK9gJKiOEsDIIgsd+LEj3odw/PretQQRGP9Xp051u2A8EIrqvJ5LKVsH7UcFb Jh8JDECyyvph06fISb31Mb/X34r5dVEigmigL9lT1wXa4NG+Pyu6clkZFliUSx1MtLR42WmdYUih mW1VVyR0zaI/I5W/IS5970qPt634grVIgP8AL1JzcmAxMsdA2Tq65oIWNNj8hurISeOnWABvvIKe ejp6andl1mMj1WseL3twwD1oamqwQAfZ/wAX0jMFjcFVIsuXydAKCjmlq6PFT5P/ACH7mVlfRQ0k U6g2LASLEq34Ukj34U6u7yDCg6vM0z+Z6EAUVFLGjfwGhemkkpIz5cTQiWpSWaSTyqyxk08bpFfl tSRAcf13TFaZ6YLEfjIP29POc2QKjA1eLhx1HjaXIGOsqa2gx8dMKOeSSPwvVVev98TXZQrDUCPS v193ZcAAY6bWcq4YtUjGekLl9sYWOCgosVJQx0FEkUzZGgpqmaomnCJSzVNdVLBHPHk4axXCQI7e QlfqQbNFcULZ6cErlmLgkny8v+K64UOz9pUlGZsv/GBjBCtXW1UNNXfaUdPGy0yZCteGKOaoyU01 crRxtwo/SpvzZQPPh1pppGYaSNXD/YHyx08VG3dr5F6UzRYbGbVo6dZ1hpLtW5R1qUgx6AUzVOZy ldlJ1EDhCrRjXJpCpf3agY14Rj9p/wBXn1QSyrVgSZD+wevyAHSpylDtDJzY5ott4vcNUJKoYrGY 6heLG1U1JBTUC0Jio6rHrjdv4ipq4jUVFS/ll8QVb6mteidqgV/y/wCx00sk6aj4xA8zX7c+dSfL pNDrqidMflcfs+CkxjZOOkx+Sq6qpmbI5U+epygqVhrIqCjxWJ+2ZEkZ1iKKf1sfdNJYigGn/V/q /Lpz6qQBlecl6Vp6DFPmSa+nSowuw9w7ayuVfZ+b3DjauSGmizMeCjwNRt+tFXDG9Bj4qlqmXGGr yC1LQx0sdyur1sgJ93CUJ8Pj5/n8+mmuElVBPEp40JrqHrwz6Z6Sm5drbqrK7O4qq3tnquop62eK qxVDO1HtjE1ddLT1TY+WoNRT4qeHEaytQ0C+JpYwkIcer22VY6h5L+yvy6ejmhVIitutD5nLEDz9 c+X216asnsaLPtHQYv8AiWfyip45crlKmscUmNp/GZ8pLTQ6KalxcCgyFj6liUnTe3u2g0BbJ/wd bS4MZJACp6ADj6VOa9enlwvXe3VpKDN1G5N6VdX4SUkZ8Zt/FUdpIHp6ed3VDWsVCxjSwS4Y2IX3 RgOFan+X+z/k62viXUpJULCP2k/b0ElVVm1Yat3q8hUyvPW1RYSvLPNIfHFd/rdiSQvA+n0Hug8v TpcFAChRRRw6il4YKdqyqkQRPcQQRKfJVSKTrp4240UqmwkkHDcqt/e/kOPVgpY6QOkpU1EtVM88 zXdz9BwqKP0xxr9EjQcAD6D37pUAFFB1g9+631ljjL6j9FQamP8AsQAB/tRJ49+6qxoPn0pquNpK LF2F28NQpNzc2aL6jg3GsW/r7qnxP/q9eqvhY6nP/FdNOMjQyTGVimhFjFvqHllVASPyFJ5928+q zE6VA9ev/9fQQYpaw1W44eQgnj+np+v9Le7dJs14dcbiwUFwTxcNwPzzfm3Hv3XqeZp1KS6qpUF1 a51OuktY/VbMf6e9dUOTnrqRZAeFYA2/qQBe5ubhRb/W9762KdYHIvcg3/Fxx/jyb/W/0H09+62O sCBVqASfSbsbFvyD6bjS1x70engaoKjpwVg0aooYqv8AaIYKL3uQVBsbfS97e6kZqePWvs4ddSSG JRdCoOnSwbQT+Dp4DODb629+AqePXvy6n0sRZiVirGNizM4URRNYFVLKLksp+thYe6tw8urCta9N 1dHLNURRrHZjG1lVW/1TlvrywJB5/wAfewaA9WHUigmmMASMSjQSkjIqAKAbgiQ8q1iB70QK9eyC enJWqRZWWQ8Ne6BmNgQL2ZUY+r+nuvWusUj1AAOgazdFUxMvpKgWJ1G5Dc/jn3vHXsjrmokZfKis oIvx5SpdSf0rqsx1L/r6T7917Neo0kI1KXRGLAX0RGNtQAPEUbt+D9f8ffq+levEeZGOvBQscrhJ wgHqZQg0XXgkyDgnT9PqT70eIrx63wB67pUE7nyF3YqZU1qwFxYqsmhSt5OSPoRY+/HHDrw49Z5W kESqixKdSgaXuCOSQupQSfyb+69brivUVJZgL+KWRV/Tos6hy12/Sv8AT+rf63v1OGetVPp10JCw 9MU+tTqQBGVUdj6VW6kWLfX3r9nXgadY9Ex0lozrBClXlYG+rjUoGrluLf4+/Y698z1zkgkIEk0Z i1gMojSQelRp+usFF1/1Hvw+XW6V6cBTOaaKlDBQqeQLJDo0zSAlTJJJMxLEm3AHpsfz72ePTZyT TqLVUlbHTyyPK0icIUKN9XcC4IZ19JQ2Fz70CMdbGTQDpmh1IwdC2uNxJHb0sdDWBFuQSB+Pdznr TcSPLowmLqzmcTT5CGUCpGkGQ6VKVkaxusiknlZBYMPrc2/Pv3+HovddDlaY/wBX+odQd4Y+PJ7d pc3FDAlVQ1VM9Vb+zT1cz0MrSL6kEcNakbPq49+bNKdWhbTIUrg/8X0ENfiNUf3cEPjBVjJGnK+W JiJlVFLNEQASB9CBx70HIwT0tDEYJ6booK6Eh0DBGIss1wGVgSpK/wCpa3vxKnBGer1Hr1EqNfqV oNBUjlblR/rH6WPuygChDdeH29RgL83tb8fm3A493OMU62cYp1lIUAD63UfU3N2vyLW4tbj3Wueq 5rXrkD6fVzcj6EgEj6e9eeOtdSIjpgqyRwTGPrwDrBH+sCR70eK9bHEdHX/lp9jS9RfzAvhx2DT1 UVOmG+RfVVNkJ53VKePC57d+M29nTO5ZFSD+C5WfWxYKq3J4v7cjdlkTHmOttlWHX1tqmSWWHJYo GSWGZnq6GrVXWVIpAwq4dTIGZYGsPy1+T7WXgFa9P2dar0jspt2tnoXq8OKenkgLivrq2SZmSAQL FG8gijCunm/zjGxX6+y96Fcno/gYYA49El7Vx+MxlXQzU0NVkZZ5J4K3LSV8ryTVkgjjlSnpUAgk x8sUkiksGkIAFwDb2imWoqDjo6sbkwyIacT0Src/XHXfTG1cntzG7VkmxHc26twb/wByYPIZXJVV JNmaGGlpaPH4dqqollw23o44ReCJgis76QL+yx1RWLVz/m6mzltbi9REVcEeXz6Lr/s7uyvhPic3 V7c6+xeU7EzFTLlMXgqYRUu2cTKKZUxRro4Y2etoMYzCRIHIEzoL3t7340JWgINfPoepyNeXbapJ XVKfZ1rK/O75X9k/Jnema7E7P3LV7n3TlVMdTPOEpqajo4Cxpcfh8fCsdLjMfTiyiKFVVrH6m/tk wRyHFKnh07foeX7TQrHSgp0Wf4a72fH9wSbdneL7bfO2M1gzTyt4itQkIyNAKZgWvM0sBCj6kEj2 qSIFChNKEZ/1ceiTlfmgyb9bxSzGkgYUPBfT5Z/b0qvkLueelWXGzGMtTVLRaQGhkQRs1mKDkqgU fq/PtKsMiyRFjgt/IdSvvm+rYWskrP3acGvn0fDrLs05f467OyVRPGVO2mx1S5CyKuTwjtRuiSM+ oyyUkaSsTyNdvwfa+CFAxZiCtek237ob6zSZqV05zxx1aV/wn1+QWQyXa3e/SMmYnShp8fS7roqc uumXa9RkAtfREzkiOODKMsrabaFv+D7MJI4fDCo5B6inmkRvuKqBkCtKGtK9Ab/PB+QEMXaPZWz9 ubkjqKDbsjYSlSiyn3GHkyniWTLNiY6d/BS0pLeMKl1aQEgn2G5Iv1Qw8ulVvuS7dZNIVyBXrX7+ IPysr+ie1sfnM1HLVbSyiZPBZ5QYpKrH0u4qSbDVWRpFnDiKSlgrC7KvLBT7OFjPhAJwIp/s9R/F zxLf3zwXL0Svr6+WOrgf5hFXPT/CvrHaNNImQoNsnbAo8hQBpEymOxmBbE4TJyzy62jSfDinYBSL njkD2WOrGrMDQk9SSKttrFTXTH/k/wAvWtoakyyxUbWZamojWS1y6xk6WW6/VjY/19m8CqsdB5Dr FrmqRnu5S5Na/wCXpmy+ShrMlI1UHMUassFjIqKUGiIiwFwFUe30QhW08SegUePTtjHebASaSzLT 17qY76lAliDCTkgL9DyPfm+IY6MbFNTgeR6FHtGppZ4tkR0R8sEe1sY8xKsrQVzKDPG5AAfS4Fr+ 9liRTy6PQuk16VmW3JPs/q2uroKiWLJ7o+0waTofFJJTREVVekTA+pNIVXP0tb3oAnA6Zml8NCxO egD29OlP93k/K8klKFkECcyCSQ8kfULGB9SOOfx7q9QaAY6I/qXL1B8+lDh90ZQ5BJjIPt5JERqS J2WIq0qB7AlvHKAL3/PtZb4D1+LozgunJQA8ethqD5CyfGT+TntKPEipoew+7u0ezcJt+tWYIG2t AaZsjkkKOs3EDGmS9wzMfp7LrpWkOPz6FdtPoWSRgKD/AA9a+OEWszuVpsotRK9R92lXUzVTKWdi 5eZYyzeRvEeSLW9twRUBLca9F11uTtKoU0+XRhpsktVhMnRuplapqYyFi0oZSIW0uvAXyoxFrX59 qmn+nUE8ejXbC11IKtSnR+f5jfyaqIeh/ip8Udr1Ro8L1D03tA7tVS0VXWdjZ3Dx5LLLKEZR48RR ZARBlvrd2B5HtDJcmY0AxXP+odGUkcdnFLOz1NDTqq/pbcdDtfsjaGfy+z8LvXDYGriqMxsncM2Q p8PurGDUKnG1tdiaikytD5FkDJPBIkkciqQbXHtdbqiUHQLuL6SeegNVA6uA617DwnRPwl7w7WWJ KLK979p47rLZeIkElTHisfg1XK1tTTzzMaiupsQDoXUdTONTG/vcyBxx/wBVej+wvhCU1LwHRKtl 72kqqnLZXHw1klfl62Sqr66ebXNUSmTXGEpUKx05klOrUCXJPJ9rrBY4SA7dLp9w8ZTpGettrZ/b vU2I/lvbl3lS0FJTbzpOhd0YvcBR2Srx+cyGPbFytUVI8dTHXVvlAiCfQ25Pu15parA46LlWTDMu K9Db1P15uTYXWHQa5OoyU+P21gMrAldVM8VVUx53PZrIMuVBeOm1Tff3QlQFUoo+guUBQCSD59Eu 7uqg0Ar0Z/Z2Jq/OlZTVcdFQRSSGOGUtPKjF+Y3K+qWpljJIP6QOPb6SBsefQSateOOjM4TI00u1 JfGZJNMpWQFUMtT63WDyaNBjEaKSLmw/xv72+sAlfh6sgqanqrH+dX3Hj+kf5cPe/hq6pdxdj4/b 3XWHipKg/fKN3ZuiSqlNROSJYMdg6KrZil3AIX6HhCgLXNa9oz/LoxnIS0K+ZAHXz7ti09fRUNTm FwlLV1OWpjT4+oyFc0Sw0URILIiQySRrPU+rjllUfQfUyKnhXoNXDBiI9RAHGg6WVRldz0dIzVrb fw9E1PIjzqaisrKeEoq2p3maNJKipkublCfVwPetIrUmvScJGTQaia/YOgz3RW00lCuMpEkaWQrU 5GvqwVrat41UwRsrcxU6C5VDb+tve2x2jpbbJQ+I32Af4T0HtPlzQp4Y6GkkCsWaVmqVeRjf16o5 kHH4t7sFqBUmvSggE8epy7oqkYSGgoHBRVVHNXZVXgEEVIYkj6m/v2kVpqNetaR021uVkqqpqg0l JDI6LHaHzmMAcA6ZJXJbn639+Cg5qadWFAKdScaa+etpqCkhhllr62kgCvBI4E9TKsMIOlgVVnb6 fU296VQ2PLrTEIpY8KdGR/0cY/b96XLpJXZ2mkgraZMfO+PYVJhvTVDzQh6ihip3b9IkAPF7n3dU IrXz/b0XNctIarhOH+r16YItk1kVPSQZOvrpvvaurp6THUtW8MDTSTh0pUlmE2QrtMztrYlFVdTX H197I/b14yKSaLmn+r0A67m62U5BKXHVv3EsTpLWgQLXmhmj1R8Tu0kNLRwqzX4d2cAXBHvwX8I6 qJsGooKfZ09UW06mCrxbUWYy+IhxkPrymQGPrKaqEzuTGKOeLxzo8qnTqteO7XNr+9hSDTz68ZFo 4Kg18h025vM7ur8/WzU+Zerx5hihqJMqkZxcsyQinhkx2NoEpIoaeniUMLNoubkH82INa162oiCD UvdXy4/mT05Y3Zn3UElVumbIy4wpEiSRyOKiuqmQtpxGMjRaakm0W/fZXMKkE+r3umatw6qZQKCM Cv8Aq8+pdXs/E0GPrJ/4TjaRqtUpKPFTQyNLSRkSPBVVVdOsldX5OYW9JddTG9gtgN0+Veq+K5Iq xP8Aq/YB0i6rbUdVSRY2ixNBBBHD5KqVKeNIqSqkbwmMZCsaaVppSAqsSW1A6RYce04z04JSG1Fi f8vSnwOyamlwgi3hmMtl8OKmSSh25j6p0ctK8DlJJypYyV3ijViGBSEG1tXvdCPiP5dNySguDEqq 9OP+r0/w9SUw1fBjqfb0+cqDhslVZKbHbUolpcJDSZWpvKtVNJSxnJZFKIlV1eQFiukNa/uhqoNT j/L1VpFZwwQax+I5x/gqem1sPuyZp8NDumpyOWxsNRWQVtJLHQRLJDRz0dOtVXTwu01RHTSskZjb US3oGr1e9EEmpOetF4gdfhARny4/sHz6yU2C3O23MVFuDOQ0kMqPVw4WOT/IHpUUq9TmUF2n+zlQ SNJeRnKBEuxv7vRSDrNfl1VmhMjhIyRwr5/l1gouuMJLAkFJuLIVFFWSPMtakkVHHNWQY6oZP4bB DJBRSVsKCaMIzgRMzGQ2B96A1Y8z1drhgGYxCo8uPn5nj/qoOs23d1bvhx2foK/bmRzqSUMtBBns GuLlmqczQVNNMkzZZoVpZ6fD0SiN4qZJdcxBkYsQfdwSFJIx69UlggLIyTBTWpBrw+z5nzNMcOmz N7wy8VQYosXSJjXplranGzVMmUrW3NV4xafJ7jqlpkpqOWfQH/yZFSFItIC62JNCrMqqfhrWnr9v W1jj8ifErQHy01wB5/YT/g6WGT3DnKnGjIZ1BQ7dXJUC0dBWZKTE1tRSTS0sT5Cq21i6GSurpKiH HypTrGkZCpM91Nj7suthqkIKV4DHyxT5DppY01mOI/rUNTSoB9Kk08wT+XUybeO2KmjzeQ2HR1GS jonqKiKnqMNk/tJa2V4aah0eWKSixUdNSqz6JHnqZ5XRUUklvbjSKSSiUHkP8g60trMpjW4YAnia j/UanyGB69IDNbs3LBgMTRpj32fS/f5moYx5WTJ12RNRUxT1VJSQTteLHwcJLJLriMt1H0KhpifP 4fLp+KGHxHo5kNB5U8sV+foOgjyVbVVtfVVlTJ5aqeR6mcizO8sgMtmCjQH5ACgALe/HHuo4dLI4 1jREUUUDqGiwuzV9W8q0MJOpgpVqqqa7y01Mzc6uQpP0UAn3qtPt6doTRQO7pgrqySuqHndVjXhI YI+IqeFeI4Yh+ERf9iTyeT790oRQigDqH791brNBC07hFsB9WY/RVH1J+n+wH5Pv3WmYKKnpyUJD FPClzeYrqYDUUWRNJB/1Rt/tvfvMHpOTqIY+nTrNqSkxKszBlhlbQUJ0kMrjQwJEhbQL3+n+t7qv xP05IMJ+fTLTTGOoqNJ9Mjm44GpVZ3FyVP5A+nu3WpVqq+o6/9DQQNW41Xija4ABNyQB+L8m/wDX 8+906YCD+LrE1QhCg08fGrlXkBufqT6vr79nqwTjRupK5OwRWpYnCAAXeVeBx9VcWNvz9feq9a8E fxdc/wCLcafs4dNrEF5jcf8AJf1/x+vvWfXr3gj+I9cDkoybmih4vpCyzgKxBGq2s34P097/AD69 4X9LqLHUKlT9wYUILMfGWbQNSlfr+r03v79xFK9OBaADy6d2qGZRH4x4wFYIZ5QrEgmx0BTZrf7D 3WnHPWsHT1gqa4yCMfZUitEUCPaod7KbkSCWZ1IINjcXt9CDz78E9GPWwwoMY69FlpYg+mhpVRij OUFYliF0pqdKkm3H0+hPvRT+kf5f5ut1Hp1ibKO1ZDVrTQB4gR4y1TLHJq1X1iWd2tZvoCB/h73o xSvW6gZp16kyclHLUFaWmdZ31PBIJQi2LemMpIjqvq+l/oB78UrTuNevahThjqc24KltJTH49PGb kiKok4JCgMZKhwB/xX3rwv6R69rHoOumzdehGulorBWUAwPaxNrcTBvSV4/p794Y4aj1oSDFOuEu drDbXS0AZQUV1pmRgNP09MoH9q/9b+/eGP4j14MG8h1HGZnBulNRRkhwSkLg+u3OoylgUI4sQB79 4Y9T1uvy65PVS+Qq609gx1J4SUdlB9Uis5Lt/Qk8e96RTFeqaqkYx1iXJVMbuyw0yXGl0WHQjN9Q zKrrd478E/T37QKcT1bUMdSVzddpRBDRFUOhf8lRv13vfUTqLf1PPuuhc5PXtQ68czWAj/J6BH0g KyUqowsPSw0sF1D6gke/aF9T14MPTqO2ayTLpM6/jkQwA/g3uI/z72I1Hl1up66iydd638ykiwu9 PBJy1z/ajsGuP9f3ooopjrxJ6yDJZElpQYCY7+o0dI+kSauPXCw0XJsDex960pgU69U8epUm5s8/ BqkjKlCvioqCBlPKjQ0NMjLw1jY8/n3vSnp1XSPTppkra6Rj5KqdmVnbmRwAxJLkKCADcn3vSlPh HWxjrJEpEYNyWtrNj6tBHqtyCSPr/sPdTxI6oeJ6VG3s9kcQtdT0cUFSJ18go6qJpIpzpYOITGyO lRGWEq2POm3v32npqSNX0lvLz6XeG3di8xJlMNmYht+PM009I7TO5o4ql1OlfI0aPBrqNDuG9FwT x78QaYNemHidArxnUR+3oP8A7iOmYQ1Uyo5Qq8scgkhmanPjussTPGxCrY3+vB/PugBPAdKqVFQM dZWVJIGlheKYQK0gtpLeCRrqyi5IZCPzyLe/H+fWvt6iykFDJduE0S/QWR106itrMAeb/wCx968+ t+nr0n5I/EzxOiAo1mJCrq/II/IBB93qTQ16vX59YGtrWwt+nj/W+pv7sOB6912V1XI5Okn683B5 P496rTrXp0/YIqaxC+logxLJIiMr3hfQHWUFG9Q4Fvr7qcU69T9vT3DXvh63HZrHA0mQxOWoshQ1 9PHHFNTT0sqVFPOulF/cjmjVl/oR71UgijdWU5oeHX19Pj53pR969EdN9xY80L4ztnqzr7sKi/h0 6VEGMfee1cTma/Gu6s5WbHZGqlpp42IeOWNkcBlIBvdASwq54kA/y/z9Xtu16V6GE5jFmjyEVTGz QGoj8lmvTVcvJkheYFVEdren8ni3ss0V45HRzCH1BgOgV3HjNnZHK06Vj0kUdGXFLj00CChaoBnQ PTtZpWepRWAXUxJ/Fh7bnCLGaL0a2iO8yfaOqxfnbNX0EWx3wopZ8XRS5PFu9KyCibIV8InEFTUO RJCyqgbSh0i/JHsOSxly4Ip6dZLcgqIY/EJqRTqmk9LdTdn7c7T3n3z3nj+vs3icdNNtvbFDQjJ1 eWGLppWoaCKsd1ijyNdVr4UQmwVtX4v7TLZ8FDDTx49THPzHdQFY47JmjIpq4DrWc73zUM246qhp zUpTUsk6ItQAkrwxSEIxsbeZgRdR/sOPaq3tplY93z/LqK+et6je1kLChI/1DoFdnbpq9jb+2Zve lBjfbu4MXkXaMrGZqeKcLMoPOl3ppHF/8fZqkbI2o5qtB9vHqBts3Z03OCdW0mOUN58OB/w9Gx75 2/l9/dk4/BbSxddm81vrI4uHa2GoY3nrayszxR6KkjRFZpGYSgFiLKtz9B7ZkH6iVc4HU37xuP7w sw5IoVUDjxPD+fRi9uYLBdYdZZXrSPf2N3plNrZesbc1RhqWo/geLzmRpP8ALcHjauoCfxSjx0tG VNag8M0hbQSgHtPJONYQHBPR1y/9TbbZ4UvxD58B0N38nDsqk2p849yUOSmlpaLevUO+MFJNjGlW oJoPtMqq0ipp1TNT0zixIHH19qPEfSc+dP8AL0R7odd6k7ZPhkfsPRLf5hnZ+U7K7q3pUSUUOPp3 q55hjKe8dNRR007wwR+jUHrGhAMvN2Yn/D2x4bNcJqB49BXm2/8AptreNWAcjqs+qkIKmOyAjSwF 9Xq4KsTcM1/9j7NVAVCAMg9Y/wBvev8AWsSaVPV3HXXaLd8fBnI7ezNZ91uDrWhg25Uxzzr5poaG Jv4LUFGJZ1WgAU2/K8W9o50I8RQuOI6yf5X3qO/2GESU8TTpPnkVGf8AD1TFTlqbLSMV1mFqoqih ifRHMga3JKqW+vPt+Niyg+VB9v59QBzVB4d1cVOdbf4fLpI1rR/cSR6fSU4ViCY5Da3q/ofayMNp +XQDbBPr0t9hwNkoctjVj1TyQRzQorlRqgZlYMtvVqU8/wBLX9tsDqFOjbbnOVpjp3zVRPPV4ujf T54UgpyrN+koQpJJFrBT/j79o8yejcvQYp0796T/AGmT25tOJl+1wO2sdUTxrcIcll4vvqioUk8u 0MsSn/gp97BJJPRTezUFMUr0HO28itG72plqjKq07EKSTCwBaPTyCWt9ffnjkIqCKenRSGoa+fWa hlabMxJTwxU6mubRCX06TfUEa5sGOnj/ABHuylwrevRnYUZ0J9ej/wDzy3vPR7R+JfREVe5oepuj aLJZKhViyUe6OwslLnsmJkto88lPDGCCNQB/ofbZqy/Dno7muTGrKPh/1f7PRDcPNKhqJlZopo6R 0po11kqSwOpRwAWH1N+Pp7pSnljojSZpJnauAf8AiujRfHbBT9h9hbL2nI8lUmW3dtrGNHrCuiVG SpjNo/rpVP8AWA+vvUsaulCtcdCzbrgwKX1d1OkP8n9/Sdkd79nbiVU/hdTvLPQYOM3dExFFXy0d FPCbhRE1PAtgOAOPbMduFo3AnpNuW4tKojDY6DPEVs9BPRyU6nVIY4HkdD5iDIAyoV4Asbgf0/1v apRmtOiy0h1Nr8+jefIrfQXr7onp+GWZaDa22KrfeUoWkcFd0b5qJKvyLHbQ4ixrol/1L/T3R9QL BR0YyEKrZNegT6e3C2I3tizWNL9gtQhlhLMYnN1IBvexR7H6e3owSMny6dtHJcr+GnW438V6Dr6q 6ay1HvikTI1dR1//AHiy2AqEAxD0z0j1OIqM0QHjWBxGshnN9Fr/AI9uMqlaA06N5pZVgFAKdXC7 UyEWT2N1tR5GCgyKVO3sBTqD/lOMqCu2KGrBpVYCaqpaqWF3jlcBmuGNvbDW+kVDcegPucju2ePQ j0mB2ZXE5TKJN5KMU7Giw+Rlo4/LTeuCWpoo0ZZiUGhhcah71HGEqa56KKk466w1S9EauiLxJT5S okylJCbypTyIWtDFObFoadQAAeW/1/ep2UIQT0/BHqcA8OtWH/hS73cNy5z44/FjB5aAVFPTZ3uD sV4pFQUUUyDbe1YpqdmQBJKda+WND+p2BtwD7atFDB5D8h1bc5hEFUcQP5+XWspBhctMadDu2pgp KWGMRfbw46BI1jjIiX/NsoRoluB/sfayvlToPFlFf0xU/b0zVFTQ0iPlJHrM8MYkYTJZSW9Irq7C kij9CLV1MsrEkqpPH1sPe6gVPVlUuQg7a+n8z0EGSyFSDUSyyGWorvK7yvYsxmYtI62AICghV/w9 0UajkdGAAXSBwGB0n5GWyWB4RATYDlVAIFv8fbgBqet+eOumI0R8fi39T9fr/vPvwHc3WzwHr1IC JJWRRGTSjzxIZSl9CFwGk8Y0glRza/Puq5U+nXjxp0MWVy21MXt18DhcJVVYmp4Z5MrWVQo6uXJr eSLMCSmWVmkpXb9mEERpGSDckn3USZBApTqngyag0jj5U8x0mjvvdVXjRR/xmeCmPkWqmgrPFkMj USMf8qyVRP5airkjWyoFZVVeAPz7uZXGAKHrS2kGovT9vl9nXPE74zmHqK2qp8gtRUVtGaEVmXhj y9TRKJNdQ2PcywrSNUEaXYKzFePevFbIK9ae1iIHdQA+WK/b11DurOpmKXPwVkVRW0k0fkiMZXE1 UaamWlqsbTyQRzRM7FiGJLk8+9CUhqkdWNpEUKKf89fWvSrre0s3lPv6nJ01M1dLBHS0q0OLip8Z FGsZjeaoWUNkJqixsqhxGq2A4v7c8cU4VPScWNCoX4POp6aD2LuBql5oajEUqK0LUtEMIslNEUhE RRfPM8lkK6jrLBn5tbj376g8AtOr/RLShqT61/2Onyo7i3hPSQRmox9NW02l5ctFSGskm8JYwU8d DII6Ggp9RGsopLEXa/uxuD5DPVBt6aiSaj0r/l8+mep7J3lkKqOtyGfiqahIwuiXCwx005K2kWR0 8B1ENyy6S1rXA91+oNQaY6uLGMAgLSvzPTpXdn1AGK/geMihSilirK/+KzUFZLkqlbI70cVPSrS4 xTFqC8SOtxY8c3M61BHTQsWKvrbPy/1Z6W9L3CuUqZ2z0uL25gqOhZcZiqKkrszlchUOo+4jXJRi np0knZBqd41IUKq25b3tZw2qvl0w9hJGFCIzOTxwAPy6hr2PsuWCnhqcTuiF5GMVXuFqSkVsZSSO HioKejFS5mp4zHZpA4YKSQrHj3oMhJJNeqm0uBU1X7M5+fDrHkOwdpbUrBLtHMbp3OtTHVSVtW8t bQ43GOad6alFBS5KNmq6kxSGPyOqJCgBVWcm1ywUrRqt/qwOqLbTSikiqlKU4En1rTh05bN39syP xwSrjMnk6iRXo5s9T53XT17BKWIQ1MRaGJIUk1pEzx0cYjLlSx9uKU9QW6bmtp6EmoQelP8AV/l8 uhwpMDiFwEW7qutgyu1MNRz7Wpmo8/S12Xymam8Znx2zYVhio6mZ3jWKvqNAjihdkQswv7c0BULg igHH5/Ly/wA3SJzIHEWmjk1ocY9W86D+Z6B3eOTl27NV0uUoaSfPZ+ihyFLCKhIqTauKaZZ6STF4 +gla9ZkI3cCKwaZj5GHPulFUF2P6hFa+g/znpREoloqk+Epp/pj51J/1Dh05ba61ymIZEzmNnmzG bpTU01DC8ifw2np/8sV546UVDDI0+qOSoVygUMkbEMbFvS5DFgQtMev+oen+x1qSdTRUYVB/2KfZ 6fPpY023cz9vHnc+1ZBtWPVS5bI0lVFiqnI6p62g+yjkoRUPU0tVU2jMcLmSodPChI13ajSTTXTS MYFTwHr9v+XqrvFXQgBkPyrTz/b518hnrnufPYHZ236Fa6CuxYoaXJJt3a9KsWJr8lla4vNUU9Vj aWeX7CjEjqcpXTO50xingu17K6qq1JOkfl+QH+E+Q6pHHJPIwUgnFW4gAfPzPoo+09E5zGUr8tka vL5epFZkasqztFHHDErKgjipqemgSOCCjpowFjiUBV/pf2lJ1GtOjpEWNAiDtH7ftJ8yfPpmKr4y pdo4I1vXVIH6F1XESi+k1MrMQq/qsL/T3uvTgGRjNcdMuRr3rpEABipadTFR02ossENyx/4NLIx1 O31Zj/re6j+fShECj+kePUFEeQ6Y0Z2+ulFLG39bKCfe+r1A49SI6KslYLHSzuSCfTE54HJP6foA Pfuql1HFh08UtFVojqtJM4JBv40ViQrjUxZxpRXPHvXSd2qa6h1hNFXqrJ9q4k1IxBaPk8kgHX9b Am3vdR1vtrUtjpyaKoSChBhb/Jo5fIo8baWYvdXOskqQxt7quGY1werO6tpoc/7I6TNKC0wCkBmD hSZBGA2kkXZuPr+Pz9PdunHHb1//0dAcjgECwI/3m/8Ar/j3bprrEwPB/H0/2PvR6uvn1w966t17 37r3Xvfuvde9+6909kHxjUOWjZ+Abkhbc/T+vuvmem/t6ikfoa9mLsCP1HngGx5P+v7t69e+VOHT nSnTJIVRCppoAVJ1WYPIgLE2Aa4P+tf3Q5H59bAwOmepi8UqBh43JJbj6erUp4/wb3YGvW80NesD SFpWdm1ksSXtbV+NVvwSPexinWyKinWZZUCyjVpLKlrqTfTIH08fQn+v+HvZ8uqBT07LJBUB/Edc vjKBRA7WvIB5CxQj9J4+n190yMHh14inl03VYAjH6h+62i4uSpBB1P8AllKAWHu3Xk4npv8AfunO nSQHhiS3Klj9S2pbsWb/AFj9Peh6dNHrMPAKSrQq5qXnUxvrGkRRxsz3Qj68/UH8W91z2ny6sePU eBVLaiB/noGW/wCk6tfDX/Fve24fOh68vHpwnpgadZQihmjSQguNRDKgWyggkeq/HAtz7bBOqlet 0+XTJUo0c0iMCrIdLA8EMAARawtyPp7cXI6t1kplusvNv82P+Si3+xHurmlOvdONNHeBri66YQ2l ufGwnNjc8i4HujHu/wBXy68OHUNXKzKxVSUaMhGF1Yo4srA8Nc2uD735f6vTrXmeuD62lkkZC2ou WCgfqdWvYKOLEH6ce9jgBXPXvOvU91ISBtJ1t5bq4sW0sVAC2HpK8X/1Q91B8uqMtDXy6wxyPC6m I6ZI2FmuVUq3B5NtN7/7A+9/b1rj9nQ3YiSj3FiBU1FPTyySeOjroxHq/wAuhUI7NwSIqmArIp4v cj8e74NR59IXDROQDjy+z/Y6QO5MLSQZmq8dOYYaiNJ44gAqIJ0C64rWTRHURMDb6X91YkcD0phc lAK5HSajoKqmfyUdS0RcGPi9ypIur8WYG3It71qqAGFentXqOuDnKhnp2RJwtxbQhUryNSgaSLgf 4fT37s+fXu3pvnnfUPuKdfKAEcvqBYL9LgEWbj3ZVHk2Ot0HkcdYQwYswHjtp0hbkDT/ALUxJF/e yKUHXiPLrmCTc3sNWrk/Q6TdST+efdetf4envETtC/kjhimmZwqrKHkDHS2k6UIe4LD6e6nrwFTT p1FJk6zz00dLjVVHVJjaoB1OiyKwZ5ddhq/pa490qtPPpzTQ/Z19A3/hOz8p8b2L/L+2j1hLUtPn /jpvLd/WObSoqYnqo8XufJ13Ye0MhJDcscZWHN5GgpC3P+4xlB9PszgOuDR5j/B5dPQBfEFRw6vo fM1WVhekpDTRGOpiZagzaIvNCARC1JNeGNwo/Xp1MT9fbLJpJzjoRIgABHDpM4vZNbns5XV+Uq5K fHy+eZGp4Q00c6MsaFqm7EBVL/Q3INr+0MkZOsVwelcU/hsjL5dFy+VXUlB2N1zuDH0+PakgwkVT lcRV4+dKfJVsmI1TyvVpLqSOnqSp1Ko1MguTz7IrkOpI/Fw6mzkffYo5IlmfSCR1qmfLvp75B4LE U+4Iev8ANUnX+562jx+Fz8NMGxeXy1e0iI8NVAT4jdGQCVgDz/h7LVM8fwjrIqK/26+tSEkUtT/i sdUQd8bI3Ztfc9Ti91Ax5dZXiraQWeop5wC5DvGLNqRvwefZlay3BK6+J/wf6v8AB1B3P+1maGVo QdIFR0AGQp5NK001C4ZoyiMB6y5FlcC/o082v+fYhgt2lYf6s9Y3GWayumDKckD516ub+IlMesvj rmPnP2fTVOO3OcDvT45fC8CRYTu7tWfAy4rsXvWvRmaeTbvRu2a9YKRowFqs9UwKWGhvdpLOOhr8 PCvrQ+Xy6kjYt8udx8KBGbwIzxJrqI8x8gcfzHRIOncvLWSdobf1rV1GRwMmSpGJDK82FkaJpGNj pf7etvf+nsjmtwGqmaHqWId0AjjBehPl0Jv8vbL5DGfMjZMmOnAyT4DsujpZZJFihinl2RnLGQyA gqFQgfkta3u8ZYwMRTVq6LtxuF+vsdZOkKx/bTooPfmVyNT2Buieqqpp5Z6+dBUO5Yt45meUTkXf Wx+hvz/X3uGFjLqbiPt6AHPt7qiVFYaQMf7PQAV0peGKPTFHYN9Bw503P1AsbG5/PsyiU5cHqDg+ hww6O58Mt2QUO0fkLtmtAkbKbDx2SxIMhUwV9BkjFNPGAdU7faSkW5t9fdJdY0tX1Gepe5K3S4gF 1bpNRSoND88Y/wBWOiliM/xTNOxAeBJtMuqw9chjBNj/AKmQcWvf21EoVAQeg1zbK8lzM7DFT/Po PHnMju0niYh24HpJTm9v9UPz/j7MU4UrgDoAnj0uOtJJhvDCxQlR9zVyU662PjeNoZWAfTY86bW/ PtmQEEGvSyzkKOQOlPnI1O+KSCJkkJycEWg+tdRqVQhlThkQH/be6ajpYHoylnxVeFOmzu2s/iHa G7ZUmjkWnqsdQpp4QpQYjH0TRxr+FWWE/wCIN/6+7L8I+fRPNIzNnpFYldP3EtvEE8ZFzyJDwCbE Hnj2oIqKdMdLXY+NGY3fgTP4vt5M9iqefSbyny1kMd1X+0rsxuf8be00jFTpB6M7FworxPQ9/PnI LP8AL3uKkicSUOCy2E2/jFW3jjx+L23iIYoWAHq8bO3+PPvwLFFoTnj1a5mJ1148P8v+XosNJVCm m0STFI2iaJzEdLAuAVszceDjkfj3U68gnHSOByJKjz8ujj/FrPU/WmT3R2fXSJr2Bsnde5sO0QJC 7mfEVWM2qZDcWD5yug0kckjj3sUoBk9COKqxUBoOg16n69Pcj4LrTH1VPDvzP5hqLaFbWsRDkM5X wyzQ4OqkF5B/Gp4zHExJVZiL8e7lRQHy61JGrqur9vSX29tupqty4TASsaKqh3NDg8olQn71BVUt c1JlGKj9X8NEMmvj+x7qw0NT06eiHhAEGvWHsnc396d+bhzFE5ejSqNFjJCGDfwzFKKKg8IuQF8E QP8AsfdGKk44dIrq4oD3cfTps2rNPHufFSB5NRq6dmnH1dnkXVdSfooFiD7dj+YwOl216mddXD/J 1uHfEKHI5rqXBYrCyY3P/wB8sDj9hZWljzjY3LY+irXSavmrpIUlro6fGYxXlXSCmn0/n3Z2yaJn oRXbhYipFOr0DLj4cPSS08cEEOHMVHjxCHVFNJSSRU0aLqWOOjhjcRKkdrKLfj2nL0NKY6BF6TIx UHPSV2DuSrrqySSeJ2pskJ/JXSEKKGuppjFVUciaPNGWjbUt7jT+fbqlSMHoqYMh0+fQxZetx2Bx DZbJVMFHRUcUta+R8sS01JSJC01TU+SRvHFHDGpJa4FgT7Q3J4rXj0qtlbLkYA6+dt81O55/lR8p O6O785jq7L47c273xWx/uGln/hnWu3IxhdkUlLTyyiShOSxtOtfUQkAx1NXJqF/a2GPw0RCeA/n5 /wCx0Q3t149w7I/Z5dFanxW0MNCKs0FM1VFI7ypUy1ENNRimUqstSTJpdXZ7AIGvb25XuoBRacfX pLqkbt1dBhunNS5N6egRljoqVnqZI4ojTxM+kKJTExJXxxCyLzYHnn3UmtPl0thi0As3xn+Q/wBX HoNKqcVEzvyU0eOJSeVjVrJe4+rfU/4+7gEAfb0/1gZSARb9IN7cH+h+t+b+/A569151sEuOSiMN JvcHn6/Qf7b3scT17rI9lnViAQJFJB/oDyLD3VcqR8utnB6e4qhmhp6aSMOF1mGUMyyqBqKxmwcN CBf8XHtulST59W19tDwBx1CEQZoxoTmJmN1AYBkPGqxsQRwf6+7VOemyeuJUxmdQI2ClXB0rICgu BZhpIUk2IHv38PWxmoH+rPUbzgNZqaNtNiTG0sLFibhvS+klbkDg+7BRx1Hq9fUdOEdbDEwMsVYw Gn1rV62F7gWWQAckfQ/j3XTqHEV6tqA49SUqKWYa0qchA11QF1WRfVqbTeMg29JN/dSpXjTrYYHh XrsrKrDxZGNy3IEkrISoBtdjEB9f8bH340/h69n16lL96issk9KbafXNNSMIyfULaVJAYDi596oD SnW8jieu0SkcsJa/GRAsuriAqSP1aioLgW/p73Rv4T16vzHUjRjwT/lmKcNwFiq3XRY/qAlie5I/ AYH36jfwnr1QPMdZEAJ1RMJNAOowzRzmOwJb9hChY3A/2Hv3W60PWIyxOhp3qhEkjXkiqYahFkYN rV/TeIMj3sCeLcD3vIyPLqp0GooM/LqeFlqEaD/cfVxygB0WSFo/2EVEso0eLhQLhQT/AIm/v2o8 akHqvhpUdo/I06m5XJ7jytBisblqvI5DG4EmDBUMdU8NDjIHVEZaOlgMNLSLHoFpFTyO2osTf3fx SaDUKdNC0hQu6JR24niT9pNcDp32TueXZGfj3HHicduKaijkbG0W4qqZ6DGZMRBKLJERqWyM2OdF aNJRpsoB492EoqNSkmvl/q4dNXFj4yaFl0eppXH+TrjuLee6M3nKHcdTl5JsjHUBKXEo9dDiftRV JVfwuloKWoWorYchWFpKkLpMsjkk88X8YswFDQcOqR7fDDCYxp0niTSpPrU+nl6DoasrvDtg4XH7 g3/mIdn7cw1e9Vhdr7co4MPl9xZysgK0ePlo0adsZRxU0RAMmkU1NcxxhmDe7GZzSnHovFraAssa 63IySagepBoKn/iuiz5vNZLLZSuymUeN8zXSmScx6vDRIPTHEiszFUjissaXsDdjyb+/HuqSelqI iIERaRjh03KkjrrRxDFCodqmc6Y6VLAagACXqX1HQLfX+p96Pp1cZPCp6ZMhXip0U9OhiooCTFGf 85NIRZ6upYf5ypl/JP6RwOPehXz49KFTTUn4j02AE8AXP+HvfV+n7HyrRo4jeIyzAeRzqsqAXCAq jMBqPq/BIH9PfqevSZ2LH0A6kJVVkTOpcTxutyy+RkjsTZkcqNN/8bn3ugx69VoD1y+8lkDC7S+n SCBHciymxBZJLXXn6+9UHXqdYhUPfUqkFh+lTFD9dIK+okFbixI5v79Tr1K8T1yapnsweLT6WuJX BNwukHUUIPB9+x69bAAIp69MNMWE8RQ2bWNJvpsfp9QCR790obKmvX//0tAsBSt+bfT+nJJ4+v0P vfTXr1gkuLKfpe/+vbgf7x78erL59Yveur9e9+691737r3XvfuvdKIMglERFhJb6G5VSFI4tYWHH 1590oc9UqMdYZro3mBUDlPSpFtWtDfkgEKfpe3vY9OveZPTpYNVTBY9AakpXXkC4DuuoW4tJ+fdf Lj59eHAdJ2va8ujSwKXALEH03IADAm6i3Huy8OrAefUO4+v0bVewA0gfX/e/dut/4OnSGBpIDIrL GPtwX18CxqfEojsQzk6SbfgKfeq5pTz6bIofy6UzU7UtC7maJpXrmpWeBiJFkMiGQAG4MLxkf4g+ 2wakelOvfPpgydjT2QHxx1063YDWCdTLcqALafp/re7DiPs6sooT0xe79W6eiE4V1uAyl7PZvH4Y y+km4BbX9f6j3UV/1fb1T/V/Lr0Y0QyS6A8q1ohCOLFg6OoUH6khiDxa3vVa0FcU68Rk59OpklLB RTinqIHleKSi8pSURAoafWQGFwZXlk+v4C2+p91JLAkGnHrYx9vUqqkEtPF4UCJFixIwe0lpp9Gv xtYMqtYcH9JPugwxqfPrfkPs6TVdf7qW5JJ0Ek/Ulo1Y6v8AG59vJ8I636depGKs9vwuq1hyVIsL /UcE+9Pw60enhAAjKVRfLSUpX6EFTJLGJDYfX+v+t7ZOf2/5B1byHTaBeZ3PCRyQlm/sDVMvP9dJ H9Pd/wAI9c/4OteZ65lk+2JRWWWOomeZi4PokA8aqLatI0/4nk+/eY9KderWvUwrLppGnvJ5oJTH pYlh/lbNq/27j/YX+nvQ86evWmyp6izveS5jW/CNYkatNiNSG+iXSef9qB44978sdNgHh59LTYGd XE5qSjqpGGNzMIp5mZwi086kS09WzcBPC4ZXP+oY+9+VfPpmdNaAgdy9LbfdIw/h9cvhkgSafGTy RTxVESJVr9zSPqhZ1K+VCV55D/196YgjHTNu2WX1Ff2dIEINTxTLpd14WxS0yhuVb6aXHqH4sfdP s6Vk9RZLFIZtRUpeOVif1RtcHUQQCQRa/wBR715/Lr3z6hVNIXfxlw6uF/cHrW/1jBZhqVtHBve5 HvYND8+tg/LpOSRtDLJE1gVaxvz/AI/717erUA9W4gdc7EDXwdQ5B/rb6ggACwPuvy69Xp5wxSnd Z5JPF46mJhIPqiqRrNhzax/2IHurmv7OvD4lPz6UNRkJo3rP4TLB4jCkNS8sTfcCaMMs1RTyFv1P f8/T22AKd1enSeNOrp/5DHyYn+PvzIw3Wmfzn2XWXyVNFsXcNHkJ3hxkO8ooajK9XZ51hBKZKDcM r41JPosOTlvYG4UwSESaCcHHW0coSw49b+m2slJlZWSWkQ4qeKllhpKt5aaolnSVoqwfcab6ltdH vz+Pbk9UJPqeju2k8RVUnPQ4ivpKymXHYSKphrmMMFNFrtEYY5L1TSBrMyxqTdgGJIHHPtMXJxTP S5YxxJx0H09EuTnq8bPVR5CpjMlHEZ4hDTVdPKhjmhngUETU9Rq0+QEahxb2nMavIQw6PbK6eJB4 bkMKdFn7Aw20NzfE75k9d7i2bXbzpOqsDW1W0sBia/GwUFBNlWhlifHO8jZFa/bua0zTSKgWOA+N Tqa3tp7VC4wKAZ6lDlXd75b7b1e5pA7ZrUk0rwPAYHnx+fWj53d07ktwy7n3fnqmnq8wtMuXrXhd ZKtIkXxLDWwoAlLWDSBoADW/HstOtGcJWoPUt7+bW5sahDkU4cf9jqv/AKs6O3b8je+uu/j3sBY6 TePau+cJsXDZPIuYsdhIcvWpDlNxZeYunjxuAxnmq5LEMVisOT7FW3uY7fvNGJ/Z8/y6xe5g2u4k u5mtrc1OFPofX7aVP206Ph/Mc7L2TH2dT9MdPVtRS9A/FDaNL8aOmoagSj+L4/ZU8g7A7GmoiiJD le0N+/dV88ulnljWHUzaR7Zv9wgCrFGQBSg/1fPoY7PszbftUJEZDaKnH55+fVbfUm7f7t9h7cqP uaWjoc1LW4DJz1au9MuPy0LU7vOsSvIzAuGXg+oC/wDX2ThFcMQaAeXr0xHvTJJHGy5Lceho+PW4 xsf5P7SzMEgMMOX3FjWdQI1kpsjhctjTGNZUqWjqAR+b+9RBlUilRXHQ2SSO8jt3FNdOPRfe6UpJ t9buMXkpYhVz1CxaxKoIlKiKnf63kY3N+fagavFq6ivy6jjnqLSZl8iPy6Cvau2c1vrdGD2hgaao yOYz1bHQ0FLFEzzTOQS/jRQdToikt/tI5/HtWWKoafs6hbSfz6FzrVKjrHuGjxFVMjU2Rev2fk9L NYJlIpKVy6EWLxVFiAbcj2mlJMbrTNK9C/ZroxPFIzEEDT+XlXpB1+Eq6fcWZxEcVTNWzZyXDUdL FTyTT1NQKpwkMEEYMtRUSzKixoqlnZrAXt7bhLMqrp8ut77L4+twdX+brN3H1PVdObzn2bX5nC7h qY8Ht3cDV+GrqDJQLSbmxVNl6ehrf4bVVkOKzdDBUrHWUUjiopJ1aOVUcEBeDIq9wFOgcePCh6Re yaoU+58LPzGI6wMnpswIVtACkcswJta/ush1dO25pItTjoQsCiSdirU1kd6Ojq5q6ssCs6wqTIGU 8AOCfbXr0Yuf0zny6CXPVX8Qz2ayDyvKK3J5CrWYet2SWqkMDsbcsI7X9qEFCKHAHRU5qesmFn01 BSYaoqiCaFNQIPkZf2nLcC+occfX271ToSOuEOO3FgaySzFc7QTTa/U0VLjKiOtnYgG1iI+T+CPa aU1alOHS+2jKjUTx6T3Z266vffYW8t4V85kqtx7krciZGYs7iSURRkOSeVhhA5Nrf4e9rnT0nnqG ZSTx6TZ/3WzaWJbhSf7FuFZuRY25H597kB1H0p163AMi1HQy/wAaah6mzFMJY4aveW4cPiUjRz/x aMAHylRG6XB8BrYYb8aSfbQyCDxp0fLLpjWvHqb1RvefrXfvXnYOOR5KzYu9tsbrp0s2mWTD5Sml nQ6Rey0kkjBrWFufavxB4S6VH+z1eJ431KSa9Dx84dp43oL5Q9zba2dlf4tjMxl4d/bDzsDRSo+z u3sFR76xteJ4naJqmPG7kaDUpt6CeDx7TSa6oSPt69JNFHC8atUgnjnjnHRNcWZvDSSFnLOxSRSp MszFj6lubLybn/H20fOnDokZ2kYZxXoxPVmwqqvzVDkjV0MVOs8TSirBkMMZbU2tV1fuqtzz/T2p ixigr0LtuKR0NM063MP5fXSG1OsOn8Z2vQZKHce7t70MuFp8dUMhyW1cFHLG81fQ483jjp8qAV+9 mNgpsOOPap3jZK+Hnq24XRdaDj1Z1JNFmYcPSwH7NaWprqhqJAKhIo6ekipYmdox+7FKNbcBtNyR e3srfRqx69BO4kOrPxdcNsxtj6mGGeOPRPPVCf7Yo9O8jXQ1LuGI0SxEX1AMpWxA97bSitRjWnTU YLMtVx1UX/Oo+Z+2+mejMl0RgNz/AML7O73xNRhKSlpaqKnqsH1vI4oN35qV7TRUcWXjEmIpGOnz GWqkiYNTN7Swo0sokb4F/wAPl05uFyILXwYl/Vc/sH+rA604Fx+YgpFzNJu9/Erj7anmix9dFURP L6qh5biUeVQRrZix5IsLezQEZBHQX1LXR4efz6QWdz8GSeaVKdzSCUH7isVHny1VA9xURU4Aiocb SsmmGJdWs+pibW9tkkmpP7OlsEOjvbj5fL/Z6DjISCXVSPUMkxPkqmeNpm9Th44dUfKsBy/+wH9f ex20NMdKwK8T02fwxRFJMtV+kqFH2tSNVzyQxFhpP9b+7eJ/R69QAgdeioGqUZY6uPyhifFMjRA3 JvpkYkepvpqAv71qAIqvWwtfPrBPT1qBY5KZ7xqEuiB1styDrjLA2/r72NBJOrj1oqeB4dR3ch01 KVYFfUVKn6cn1Wtz72FwaHrWfMZ6nRSmMFtTlkVxYSWD3BAINrXLEH68gce6daPHqMs7eRT6AFje NlMhAcIur1Hm7Fvp/j7vpwetdSY5Q0U7+n1IpkLaF/cDkBgbj9Z4IHttgagdWFe4fLrqlpKisOim pqqrJYsFp6eadiA1yC0aWsL/AFv7tpbB4dbqADU06cqrbmfWSQPg8qpVIWCx0ck2lTYoXaLWoJX/ AGN/r72BSmR1ouhJOodN8ompYmjkoKyIrMHeSZJIdJjBQoUaKwIZje59+CE51DqwYAY9eoq1f0sr G9lsRqW4+lvUD9D/ALz794dBx63q6nSSLNQOeSTUIG1KAbqG0gErbj6W/HugBVx9nWzlTnz64LTK 1nsbalUAIp5CjUTa17Ee7ajkV6pp4dcVgVGuyNZWTQUBTnULNY/2rAng8+96j17Txr04l1RpGuCB JKxuwSTR6tCsU/tg2vb/AGPunkKdOeZNcdTIayZ9KT+GekcoGaqiEmlQpJIkiaOQtrFgfrb6+/U9 OPXuPXP7zFQRQVVTR1yLLK6AUVbDIFaDxsNQq6Z2dbvqA1DRa1z73RySqkcPMde7QKmvGmOs8eUw DaitXmqCQkMs70kcxKpq0ALTVsSpckkkg2PI9+0S+gPWtaeRI6cYqvFVARIc+ZZGDDw19GzSNwb3 kkpXAIvcev6Dm/upVxWqY+XVgVPBulrs7NVeEyczYnIYCmydVQKKaqpY6SXLPJCWdUoZa6GaWkaa B2v4GQy6bE/T3VndVZlqKcetNDFPpSVQwrwqR/g4/n0y71z+Xz0tBX1uRFcMf5sfHAIUggxla8zz TVbQR2QVGRhUHW2p/Qo1abD25DIzkiT4iKj5jz/Z0xLaxQqDCKJWhzU18uPr0haWCWaX7eFHmqZp JTrMZlklYAyeUrqYlUAvcjkj2oPz4dJSeB655eFosfNEsc6Uy+OSNpoZUmnmEqq9TOZFQqSrEBbW At9D7a16mFDivSuKLSGZx3kfs+Q/y9IxEeV1jjRnkdgqIgLMzE2CqouSSfbvViaZPDpRUmLrqcah STGZgCA1PLcWsTGCQEsVPJ4/w9+qPXpM76seXTl9nVEgLTPGwAZvNACyEEjQsinTIt/px/r+/VHr 1TqUKKsYMw+3BQBrtkFBAPDqI0iLEAjlTwpXn3qozQ9eqPn+zrCInt6kgDA21fxCmXQh03UlowNF hyefeq9bP246jrGrMVSqxqXIRAtf5DZzpVYo44dcpYn6cf7D3sn1Bp1uhNME/l1wMUcaIwqKZVmS TxkQTVHk06ksPKyabupW54B9+rXh16hByD0mKUBqiAG9jIt7KGP15AUn1H3vpQ3wnr//09AwgWIt Yrb6k3+pP0/qf9797/PpnrBJYi9hckG4/wBjx/h791dePWH3rq/Xvfuvde9+691737r3T41gYncq Boi1E/WyooK/Tgc+6+o6ofKvXnV5QqA31yRhV/VwzWX/ABBv/S/vQxnr3r05ujU8tAztr+5xzSK1 9fpjqJ7AgEHjT9Dcj3XiD9vWxgDpjr4ruJARcqgZdLA6igYk3/BJ93X069qp02lSrFSLMCQR+QRw R7t1bp0hppY6dpiFeORWVbMSI51+iuBbTKFYEfizf196rn59UJ4Hy6foqWT+GNWSPGIochDVqpcr 5UqIlDeMhWOpWTgE8m/up+KlPKnWuIPUfJ0oFBXTlrstdjm0+rSYqukqnidWa1yDEVPH49+Byo+3 qy+Z9R0lPd+rdO6sFjjJ0uBEjMpuC947ePVwQPT9fx7rnqh49c2k1LOQDoFZHNHE1y6lihI1Wa91 491A4ZzTrxPHHl1zqJVDkSKjzRPGZ2vqWYo8WkRgAaSkR0k8g2v78Afy63/m6dKueAfbLFEBEuIn iZRpZ3Z/M0YZuLlEIJJF+OPbdOPrUdb8x0yZxQuSmGoP+1SEuo0hmajgYkD8cn27H8P5n/Cet8KD 5dQacgMxP10ccX5LL+Pzx78/AdaPShqTCY6Ax/7rwlHrIPCymWsMgIU3a5I4/B9tHi3+m/yDqw4D 8/8ACemZ7ambSBqEbBVJVV/eQ2Vfpp08e9g+vz/wda64S3AsBYLIW5FieADcn8DT/vPva/P061Tr MsjK1Ncm8CR2BNh/nRKo+hsDx795k+VevE9dTSCR5pguktUSeQA3YGSSR1ccAgDgf66/4+7Uwv2d VbjnrkjNGwPGtSkkZsAA4P0IN9Ucg+v4sfevPqvQm47aNJuTbE2bwtTJjqmlSoTKYuOeRqf7+mUy UriFyWENWCqggkI7f0v79XybpO8rRyBXAZTwPQfmny8oikNVK48SshZ3LJoA0owP6baiB/re9ak/ h6U1X06yj+MQiVXghqeQXDrqJUrYOpjaO6kfn639+Og4yOvdh6iS11Q6qzUZjUXjOkyhGBNwDq1E Oji4N7j37SuQH68FHr1CqZUkKN4pI302YyWGoAfXhVLE3+p597VSPMEdbAoOuKH03vc/0NjbggWB 4I49+PHHWun/AA0Ec7S007ExN+45VghYoNWkSFToDabHi/urcK9bWhcV6m1Uv26yRk65auKRqYRD /dcjEhGGkFz40Fz9fz7bUZ6cbqTBuHIbalo8tgpa/E5jG5TCZ3A5fH1JRsVWYxaSqo56eqQiohra erhEilSNLe3VHeDXzPWhw639/wCU/wDzIcB8x+oKZ85VUmI7O2TTUFH2TgJ543ifJLA0P8cxUTvE 7YvcxpzOE0gQTM8YJCAlatJFofiHT8Exib5dX4bVq6XMYPF5WikaI1+nHz+cla+igaST/MSgmRqM ICz83I4+vthguqgHRulwGAzjqBuKsocbkY0o46ievpo2qAkFNM1M0cbNFTrT1SoIVyQF2KOBaMjn 2imkMZJApno72wB5QpPHqvL5A94V3x/7nwlDltv1+Y6g3hX0O9N07dwEMUWZ3rQz7drds7p2vhXk MUVRmZp3hnigYjyTL6RqYMGdYcUI/wBXy+zqYuXoUSIrFKgm00UsCVB9Twx50rX59a7u8vjZ2/Bu OmruyNoVWwsx31nd057rXo3dS1Cdm4DrObK1EW3NwdhYOJWptk0OYpNLUMVTUmaaBTM6RoR7Lru1 kVmkhJqf9Q/l1Ke37xt+5Wz25iDKnbqxQnzK08q+XEdQOpPi9j/jV2RQ93Zanrjksfjs7Pt6ong+ zxORp6qKTFyZnbM4tWZnCQ1IkgFcreNpY3Ed7X9sh7yjeI5CKM/bTH5Dq8XL+13n9lErVamM0oc1 40PyPVKHyhoqiXee58ggtHk85W1ThfVAPPUyTk3QrZG1c/S5+t/aaCOSSWrMT9vRVzXaR2dg6RKB QdEfycv29QCjf5iZZUZNbKDGwZWDXDKFAtzwPYghRQoBH+r06xjv7iRb2XSaAN6/Pj/q9Oji1u28 ht/I9cdpjwU+FzzYTMw0rERZGOGDxQV01RSHVNRwyOGMZk/zq+oC3vRKox8uHUh7JeTyW2mprSvp +zoCO3GSXee6JEWSZJal5oJFkWQnzOWRlYWV0CG4P9OPbsdGYsVqft/w9Bbmm4aRXDPU06Hb4eY2 k2Rh+3PkrnKWSZeqsPjdrdepPTwS47I9n9h1S4bHSSGcETf3YwUlVkmjis5MAuVXn249aLTz6ju3 tS7tXFD5/Z0W/eGcqKzPyblqHC1c+XiyJkiJYsfuUmZkY8Ry+P6G3H5v7ZKmpHqOlEjPaBQGqOp+ 8dx4Ss3FmMph6yojptVJlMPLCWSaCuLwzyPPIhWSJo5QWLqdepBb2Y21iGTW7UB/ycetC+ErOr00 gdGn/mAdLbe6Q3V07hsXLkl3nvv4z9J919sYnLpStWbX7D7Z2tSbqqNsqlNBC0WPGErYKynjnMlV Gk2mWR2BPu1xZeApck6gB/PrbWpeBZHQBmUf5+q/9tzLTbowFQ6K0EWUozPqC3aPzqJAQ+pR6SR/ re0rU0E9EwFHI6FSqnGMze7coh8EtW9TBTsxLRQxSRli0YuCdacAgkXPtny6VNXQBrFOgTp6dqqd YwUj1yBPITpF2JGorYji9yTe3tUikCo9OkJ49SfDJjqswTcyQy2J06fIgsVYXA1f1FgOOfdyQK5z 1roX9j5Rcfi92ZiqSOb7XHVtNQ/T0VFdD9upCjlVCm5N/r7TyPqxpz0qjd1AocdBJj6V6qZVkMek /Vz+k/RiWt/T+vPu6EBgPPptquTnI49GT2t0tB2J1P2lvbZ0sx3B0pjsNune2HqGjKZHYebyRwjb gwcdvIz4DLBVrkdiPHMjqPr7q2tvs6MIbeNad3fQH8j0EG7KgxzYfBCoheLB45RrgA0zVlcY6moZ lUWMqehD9fp7oBQNQdeuNURC/i6X2yIY6mirJWiMhldaVUC6zEs8ZjmjUMHALazz+PdVHn59O2am pYmuoZ6M98kqKg3Xsv4p79yFJUvT/wCjKv6nzuRSXzStWdbboyNPjV8zapJmo9r5uijCG6pHEFHF gNngRQ9GYsopJNLcSKf6v29I7sz43VGxtudc9w7Djze5epeyo3wNHl6gRyT7Y7UwVMJN2dc5tabV HjshJH/l2KMio9bjZEkTUbj2y0gRdXkP29Xg2dWlMSjPEHy+z1rj7OuPV5qaSpqKKlo8jEdQaeGW 4ieVwbgM3LFAbG/Nv8Pa+1eJirse0j9nRiltJb1VxSg63WvhpjGqPjf1xgqq64zbGBw0dMREaXJN VyBqqSOaWR0+8pqdpLRkqQL8e1E8sKqQCeie8Ooknj0cPGZmHC1sBrzFSSY3HSVdRWpHeE0hbRFS yQgOzVQjfUSCCQwP+HspbSTXoiZNchA6CPt/u/afU+1t29n7mzNPidm7LwtRla/LyfvTSO5Ginhh TStblchMywUkC2aaokVBybhM9ZXVF6Vrpt4mkkYaQK9aKvyt+SO+PlF3hvTtjf8At2oFFnso6bfx OOr/AOJxbW2Xj3kg25tmmSoip4nNBR2eqeGONKiskmnKh5W9mMMYjRUHAf4fXoMzzfUTPNqoTwHo PToqGZk8k8oxGEODwUghimqK9BBU5MxammSKkjfSukcJbhQLk8293YilK9egUEjU9X4/Z0kq6tYa XVV1TSLT0SEWXyEaRLexCw04txyS3+x91Geloofs6T6Y50af7kxyTLKI/F55Iqqolla0bxPYpKpZ geRcj88e/Fq0oOrAca9SavEV9DTCao85pxaOQw5KJlWVm1ACJhrIC8WtfV73qrXh8sdaqOB49Nck ppCDTpURtYNJ90ocS3F+YnUrax9+A1Hup+XXq4xXqR9+kRgmelCtLHrkajmlpmtqZLBT5k44P0A9 +0A1FetAkefWaSWIyLSipq0Y6WEdTTpMpaRQyqZYZdRBLfmP3rTgkcOt6j5jrDEv2lZGagRMtO4M 2qNpoVRfo7ppIkUFgLWP19+9aHquDw6WVNlMFHCj5T+IvFMSYYMNQ42mgZH9IaSoqUWdJSwvZQOB +ffhU4PHqpDfhp0vaSLYFIgmqVoYJ1j8Zky9HWVFQWCqyBPOJYCyo3+69TG309+BHAdNkS8PL5dS H3rg4B48dj8hXIqssTIkGLo5FEd7+Wr+1Ro7L+nx3/2PvfDz60I3PGg6T9X2PXRxyikiw2Isuoxq 9RlaoMPSDYCnhhcCxDLqAN/fq8PPq4gHmSekflNzZrKxj+JZ3IS0byRoE1xU8DJIAzSGKGNPIuo8 3N/qfdQatQLnp0RKBWgHScx2Iqq6bTSUNdWMJpI7UdHLURAIx/XUIyIFa/1B+nu5JpxFKdb7V+M0 PSvg2BnquFYHgosUrymcfe1ZcqAoRx9vSx1UwbUL82496ANak+XVGmjoQK9Kek6zmaExjMs1UUJi emx6faxFQQqzmoq45tMh/Okf1Pv2kVr0149PwdRKrq3eIjaWgyWPqdDqyxASUczeQi0gdoZKVVBP /Hbj3sBfNOrC5X59B5nNubj2yxGWhhjUyGNXSsoaxXcjWSognllsf6lQPx7sNDcBnq6yK/wnphSs kXkhWF+QSf6WOmwIAYe7aB1fUa/LpzyTSNi8U76bv9ywUDnSfFYt6VUk/wCB+nuqAeI4HoOrHMa/ b15KKKwkZtSCOnOk/q9XpkQBb8+q4Pvxc+XTWmoGes8KLS1EUosSPLpUAk8gRrdtNvpfn36tVI62 o0sD1HzE00GZV4LwTUq0fgaM+pGSKOWN1Kj9Wpr+/RgFTXgSf83Tr/hoPL/Z6XqZTCZqlZ6qohoK zIoqV6lZYUFTEton1BHhdY5VuCCCFIHtL4csTdoqFyP9X2dPF4pVIc0LChP+X8uP8ukZUzzxohpJ tEcbKJaimeRJZmiDeRYXAWVYFsSv9b3PtZUMaHh0XqhU1PGpp/n/AD6d6qrrpaHI081bXTwvilqx BNO0oVpKulSMlSSdWnk24/w9s0AK4FdQHSytamv4a9JShiMavOrnyiEsAlg0aszI/qJAD6VP+3t7 U9JJGqaeXUNq2rJNqqpAJJA80gAB/wAA1hx7104FWnwjrgampYWaonYfSxlkIt/Sxb37relf4R1h 1H+p/P5P5+v+3v7916g9Ouvfut9Z6Z/HUQSaS3jmjkKgEkiNw7cD68L70cgjrY4jpR1U9NNDE9O7 FI6MwqPINURaQs8bISWAMjki/HPvSCla8a9MS11inCn+fpPohSqCFCSkjDRcqeL8XHK2/wAPdvPq 7GsdT6df/9TQJY3NtRseSCOA1/oD/Qe9gdNdY2tpbm1rWA/PP+xv78erL1h966v1737r3Xvfuvde 9+6909OdcYIXXeNAliNI1Kqs7Gwuy2IseB7qMHj59U9cdTSRTz01QIiRFNTyBfQWdoZV9AIJB1W/ p9fehmtT69bpQjqbWCE0m3n/AHFaTH5EyLwrrOuUnf08Cw02A/2Puvm35dewR+fTLWklWVIVDqze SQSMWcfhWVja0YX/AHn3ZetY8z02mPRMELavSrlrW5aMORz/AKljb/H3frZyv5dTpnCmEhAqrFGH 9RIkkTl5GF+Cb/T8W9+A45z036dS6aob+FtTs3DTxMFJbkR2dPoGuok+tveiO4EdWr8XUuonX+E5 SCaTyTTS4aqhJB1KkArqeSPVzwnmFhxwfdKdyUHr/g6sDX/V8+kn7c6t1PVwUQkjhFFrHTePjk/6 x59+Az00eJ6ctN6msu2hVqaeUj8eN5o7MgsR6F/3j21XtX8/8B6ueJ+zpukKM1zcaxEvHAvdddzb m9r/AOv7uKgdV8/n04hnSYi/EcUkCG4PHhZlUW+pI/p+D7a8vn04MMOmquv57lixMNOdRNyf2I7c nn6e3U4H7T/h68DUDrBFe7afrp4ANj9R9P629+bhnh1o9PUSHRBwpBoFLAclbVFQEJJ+gLMAf9f2 03E/b/kHW64HUCUssItbmNo245us97XJvqBHHvaju/P/ACde4U66nQnXf0upIYMQD/ZTSB/qwx/3 j35TQ/LrXXMJqRZA/wBBCgLXA8jI2lCbWKi3v3Anr2eovl0zyNa6u7ahewPq1Ag/UaWAI9uAdoHn 145Hz6mTqoZlX1hTcMxsSjAcBeb6Tfn6W9t16bHS169z9Phs7HTZBimGzS/w7IsnLxLMCkdSgNlL wMwJvcWv795dM3CF4yV+McOnzdeKo8BmI46HVHTTRtG0rM0lLNUwylamSEOXMa1UbxzeMn06jbj3 UjgSM9VgdpFOo5H+D/Y6azjqqby/b/cVTwwvUTxUkazyijiAeeYRouthSL62tchL8e6Vz0+SBk4H TYyxCWWmaRHcgl1KaSHv6j43CuuoEH6X593Hr17yx1FqIEkiaNgLq3j1G/qBHoc8AjVyCP6+98M+ fXuHSWe8TGMgAg2JP0awax/P4Puwznq3T1i4Gq0qacC5mCqPVoZjrVuG508f1HPupNBX062uWA6z QVU9JGFIWZpolSIyqPIgWUr44mUGysqmzX4/PumCTTpw/M9RJZf9w3iuoRpWaOMyHXG6z/QrezBo W44Fre7j416qPM9HA/l6fIzeHxu+UXW+5Nrlqug3ZuHC7D3TgZKn7eizWE3PlqTG2md2SKOoxtXU R1MMjW0tGQSFZvahWKOrDr329fTt6R3A2Q2vTU0VQHqo5JoJ3eJPLT11G3iyuM0k60akcSBCbXAD C49uXIFdVKEdKbZyCV8uhqqIYaoS1FLJLBPFVyzVtLIQYKoKD/lMUgv4ix/H9Dx7LnUmobIPR/az N8QI1Don/eGHl3lhs/iKzbuN3Vm6fFZFNoYytpfJk8Tn4IDXYbO4NohGKaooqqESPUu6CJQvB59o ioRipOKdSPsFxJNpJfiQP9Q6pbp+297diUPdG6tzbkx+7O1d0rSbcymE+7in3Tm4KHDNiY4KnPTM /wDBsRQQpoURSjyMNIAHtPJc1BA/tKY6yJ5W2OKWOE+GRED6UH/F/PoieYG4KHZdNhauszzZKOnp cNUUmfydZlTtvFYynEVPt/Ax1TuKDB0CI0kdPHZGlnd+Sb+ypxNIDrc0/l+XUortthtduxghVanU fmTxJ+fVT3z16yzPTO7aDb+aqBU124MHht2RyU5PjTG52mNTQoR+WCr6h9V/PtyLxkdFJIPUNc6X 1vLFcBAKZHQPfD3qnrXe+/c/2P3PjctuPp7o+gxu+d5bFwbNS13amQbKAba6wkztjHtPEboraZ1y ORZXamo45NCFiCD9LiNIwXNPL/Z6xtudomu7xhE2NWo44j0+Xz+ynn0h++e1sp2DvbObokpsVgqX deYyGQXb+2RIu2do46WYritl7cjmAmGJ27QrHTxO/ql0Fz+r2wmiZu0kCtfn0eXVw+12yoB30ocd BBV0D5LbDZiepSaTFz1FBI4IWVoKeD7lJn5vzGxXn8i3s6trZJFZuAHQLnnku5SXbFK/kOjvfJFZ un/jh8RehsPNVriNx9V4/wCU2/6Cup6aF5O2e4K7cW3sPVRVEcMdTU4/D9eYGSCGNi0UUtaxUljc Ulj0DUONPlivTNlEyIryqKNk0/iPp8qVFPz8uq79xfrmRQWTw8sAV0yIOSBYg6gPr9Ln2kUkUJ49 E+5urOyr5dMG3MXJmM3hcPExjlyuXxGOj1m9nyVdS0gLgG5jXy3sPr7M0uNMPh/Ij9vSG0h8QyN6 4/bjqxf+aR2pS9y/ObujcGPpBisFTZTbHXO2qTzrMIdn9XbRxOxNrzvKn65ajEYeN2H1Ba3tq6vf qFagopp/LoSXJ0QgBaUX/ih1WhMFpa9+bfbz2BN1H7TACQXsQT/vXtoKHjFcdBEsQxI49KjcE1YY 2SqkdopI4dPrDOjaQ4AA50MB+b8j3pYQCDqz15nJwMdCR8aeuqXs/trC7brcDntyYOlxG6tzbix2 3sljcNlmwO2dv12ZyVdDkcuwoKeHGJTiaUN6niRlUaiPe3bSpoOHTkULSOq+Z6XXfm58RvzrHoXc uOwO19tVGysPnuqsvTYGgmpcluVsFlZsnjt6bhqmTxZPI5OiyAhaUOW/YA0gWu0jVLVGT5+vT9xa PCqt5dAaRFHs6qWKVaRp6sOsUwZWq1uNSRuD6rXvpP090V3LgKKgdJOGPLpgoViYWV/VpMcZAu3l PARl4ARfyfb/AIiKwquetoK1zjo73wGrqPJd45bp3P5R8LtH5EdW9ldL7sykapO9FTVWBk3lhK6l ikYI1VT7i2rDGrEgBahvdC5zTyyP9X59GyEARk5OmhHqOI/ZnoitZNU1OSrJpYQk89ZL5ljWyo8M zRP4zzpRNBH+v70BpJB4DpNcS+LQ0GuuflTowOw6Q0O2JMg0gjMle6qrvpE4UG6azwCbfX6D35RW p6NrOIKsda56PhiOsNzd1/ENjtrGTZGp6T7gqt0VlPRxeWan2rvzDYDGVjQpGxLwUubxMLStzxNq HANtqO7HRsq/qgg46su+BHQtZ2Buup6w3Vt/J7l+N3Y+CxeB+Q+Ix7webZOWxML1HVncO0mZnkoN 4bJziiNKqFCaqklaCXUige1aQxSrRjn/ACdGMVUdWBoR0YHIfy2tt9gbRxuQ6RwVRW9ybX3ruPKZ PA5GSXG4rtjqLZO56bbW7Jto01UIxDunZE5MmQZlQVlPUDxA6blMVWJtI+H/ADdOXFzGUYuan/VX q5nqrZAxmy8dJgYpKAYuCmxlLQVKxMFp7okkEDVGmGmaLxlV1glbXNvendTFTVVvToG3zM8lFOOn zf2SosDSVmGx1NHU5GRiZy5E80T+JDPHJKfTKNQCxqvDH/W9l8jlcDjTpq1tmJ1Ux1qlfzk/kDm8 j3Bj/ijkckcPtHYmC27vSuxWNydRDU7i3juiilrqSbKCIpDPJt/FVCpTQNrSB6l3IJ0kP2kdU8Tz Y9FW9PIrrCnwrx6pNp6n7GLLUrblSspaWIJUVEEdJ/GaBdDH7OGqN6R5UJGotENViL3PCwkjA6JC CxQiOhJxxoegwzGenyTLU1kzNBSU8UCjSkTrCosoWGMiFKmqtdrfk+2gKnHRhHGIwVHE5P8Aq9Ok zTQDLCSrnqmp9E/jp4lniRadVXUlhLYnQPyLXPP193PaaADh08ACPl05Y+koZquqr82Z6rFwnwQV dLHUCGWpQISjvArvGVjbg+lWf+170OApg9VY+Vc9R46OqqYqialyEVSI5DTilr1aOZqQSho5QXDi 7Gwb+3x9ffiRTIp9nWhkj16Z6yYzQKriMNTu6OEcNzchgq3LBARwSeffgKNjqzcKdRqpLQ0P5LUx b8WNpTx/W2n3YcWPlXqvr1JncJlIZvT9ackXuilo1UC9v0i/9Pfh8BHXgepktManKx0yVEMEs7IP LUER00TtDciVyC3jIB5A+tvdfWvDrS8B061G2VpIqIzV0M5+4CS07M3qgVGYSRRRapzEStgeb3/H vxY1JA49WqPnXrqaSUUtW1HUVE1CDH9rO4kRhOtPKZfE0vqCq0YBP0vx7qagLq4168DVhT06b6UG bGVDTyHUWdTNLZ9ekDTCLm6k/j35viFOHTijiD1DEDvWLFYC1MisQAeDCnkPJHPPJv79Xt/PrxqC Ps6XdFn9v4+opKGDZFE8sohAqZMh/EZvIbqaimWsgMSFipIU8D6X934gtXPTDI5x4pp0Ki7mwrQT RVtXX0C+nxR1lN9vQ6Y4w7MyUQlgRgB+o25+vvwI6ZMbj4RX/V8+m6o7D23SL48fFUZVhLC6vR0T rHHKSAyS1NYYoSJLfqBtb3uh9OveG5rUgDpiquxM7VMyY3G0WPjDzKWn8+UqIwbgl4aNEp0ckixL G3v1VH4utiIHyJ6RM2czuZSVn3DXOkMZTTFL/DqaIqykwLDDGJXBL8XYNa/vxZRxGenVi8goH29I 0rHVmstGTPTjz2eR5JKmKFv8qBllZ3V0U6hb+yD+fdqkBT5H/UOrhDUgtkdZqaehjMTLTNCT+tis dX+sEAqZNBHC/T8e/EMfxY6tVf4epOcMiUOJpm0hY0qnVF02VmeILY21C0agW+nvUfxsfPHW3+Bf t6nQqVjjvH5VCRqdNj5NR4dwL6Qo+n+w90Jr1qmOuSeWariCxw6omvpkuqHS6TPc8AMtMpAH5N/e xhTn/V/xfXgKtQD/AFf6q9MucPhzbMLkpHjXN+Dq+xpXYHi4Nzz7vHlPlU/4etyca/IdS6dFR3jf XGsVTqLeSyokgtEeP84X03JH4A9+Y1ofOn8+qkcR8+pohCusqkFCHWzkEguGVbWGk+QH6/7D3SvV aGnTpp8D1zKFcR4ZVdGVmkjXzweH1EhAshv/AIi3vaHIHzP+A/7HVpx+kw+Q/wAK9JiOIiGV0IIE Nb9yqAWQrK1oiWvewYWP+Nvxf298ukxNWHpjptioVYNrkfix9CAj62cEyMn0+nH59+6sZj5L10aG 5ZVZwVNhrjADcA/UOQBz/j7914TcKgdZDQRAMfI/ptc8MAeLj9IJI/w9+614zeg6xGnhSN2JLEsB HckAqAGZxpCkm5At+Ofe+t62NPLqbiKctX0WnSJJKj0Fm0gJCrSTOGa9mAWy8cn3VyArfZ1dCzOB XrNlko4TBo8izS0wmaZFVAWeWUaZkH9pQgBH+F/8Pek4dWbVrNKFeminmgSoMlUskyHVqMbKjljy GBdWAv8Am/8AX3vrTKStBg9f/9XQLZR9QObfp/IJPH+J976a6wsOG/w5P4vbjge/eXWxxHWH3rpz r3v3XuvD37r3Uh4VH6JNQufqpBtfg25vx73TptZCeI6cjE6IgZbqYIyrACzKVDC1rEBri/H1918z nNetjIBpjrKZZikUiqBJG0KDjV+4sgKkBieRx/hz70B3U8uveQJHDqROWH2RkZvTU5GG/BC3Y61j W9lGsnj+p969fs695HqNKumSZGGjVGGFxchtINja9uT72OA+3rXnTptqtKyRFWYnwR69QtZvUGVS CdSkD68fX3sef29WX4epUjMGVvoGGtCym9jcEfm978+9ilCOm/MdZYtL09MeVIYofpYqGX1X/qOA T9Le9fiPXj5/b1ml9VNUBhpf7KI6b2BaKqIlJW5BN/ofyOfevn5V6svEdJ73bpzqdGpMAY39N7E/ psW/p/ja3v3n02eJ6lpHJ5pbgg+OCVxbkJ5YlAAv9CxHHumKfn1vjT0p1wqY9Ep9JjJdHKWOgRl1 KupP1DBgf9j78Djr1M8OpbBR55heOMzNGgYBrXhZgePyCwt/r+2/Tq3n001p1TkglgFVFc3u6x3j Vuf9UqD26nA9b64U66jJb6hOOR+XUH6n6W96c0A+3r3Hp8oGb90BST9vHHGoKizGoK6TfgK5ube2 j5etetdQJP8AMmMkal85a4/tF+Ev/UE+9j4h+XVvXHXKXVaRWJKGb1km+phHNock+okWIuOD78PI /L/N1rrksHkAj1+NHhRxf9OqOlMwa35IAa35+g/Pv1ck08z1oeWemh7amsQRfgi4BH9bHke3hwHW +psDCWMqf85EtwDb1xg8jm3qRTxfi3ujChr5dUbBr5Hrhex4sq3DKf6fW3+NlJ+o96610KdNJPuz CVVI9eJMrjIochR0c9OqipShQxtFSyxC8lSIHKSBrsy6G/rbxyM9JTSGQNp7Dg/n/q/w9NuB3XNh cpjciKCkqTRT+R0aoqYhWxJG0NTTzBY2KrJTuQwF7kfQ+2igbiSOnmUMjKfMfs6GzKU+Mz8dJS5L DULmojhq8dko5leV6f8AzkKU88S005ENFIEKlyWKg/4e9iMpU6sHpArMhOliKcR0jtxdb1tNS1WQ 29VDMQQxCd8ZOvhyZom9X31DIAEq4IW4aNrSoQbk+91yART59PpcgkLIKH18vz/1U6A2ugmLyu6M skTlJoyjJJEV5YyROFkjsf6j6e7rjB6WKRTrLQSmOCrkV2WRY1A0EhlB+kilRcEEWvf3phkenW81 HUYltRZSumw9RdmKg8XAFioN+QPesfn1vrpoDZruhRresgi5+qkcG1rWJ9+DcDTr1enHb9TLh9xY DJKZYHosxi6+nnKvGytR10Eyyp+k3Rkvcf09uAk0PWj19SnqLc8u1N74KjyM1OMH2Bt/CZWiqNDL BFkZsHT1KPOCwZjkoXYXFtRAv7VzLVePH/N0pijJBNc9WEYuggykNTTS06NXVIc0sZEkUDTL6Iyr RFZIdEgAccce0JBU0YdLYi8Y+PPQOVu2d1YbN56mpqMVFRk6F1o6tUWIRSfZZANF99UB38EE6qzx /VlsQb8ey25NM4rTqQuVJS1xGpP4geqCs11x17sfaPU+c2nQ4yTJ70we5avcu6ooKeies3yu7qp8 zjJsf5Xmp6zARN4oxc/tW1AX5K2YFxUd3WZnJkhe1Go9nl0FfYOCoQ+6KytxsFVlavDzU1K1P49U UiJ4YaqmsNCyoGBAIP8AsPb4AjAITHR/vsr+GVDeXVPH847+F5T5RZjF7agmyWE2f1v1ZtN8gyNI r5ig2jSVGZlkqSAAkVVVWA4UkH6293SSGvfx/wAHWPfMcF1cF1UcWP5j16C3oxq7qn4B/IZ8lR1m IyHcfbGwcRh4qyA0tZXYXau267LzVwWoRHfHVE+UARhbWOVJDAmt2yGFQGzToLbVtFwLx9URHD+X HqsnN42T7B8jysRr3aOIXVJAw1Oycmw/w9tWbKpwxr/k6R827cQpwO3j0x4/FZXdObwez8OWWr3V lMdt2lp445HUy5WdKT72SFF1S+MTFjb1WX6+xXBcxpbsnmeokEU0ks0K4LAqPlXH8v8AVTqwz+ap nUm+TZ2fRwpQ4Dq7qPo7p7aNKFiEn93+u9iw0/3lQ0BaE1WQz2WrpyhJZEdQxv8ARLNdwSaljNQa eXp0JPojbWgOnyp+QGP216q+zFRJJK6tIxePSh0tpDKoseBYa78n22oqfUdR/fMfGkr69Ln48bbq t298dQYGkpqitqMn2Vs2kjpIIzLU1OrcNARTwRAEvJOPQPwCeePdmB0tXBpToz2eDxPDYeRr+zoQ PkzWHc/yV7Qr4FhihrN85t6VI5BIkNPDVSKnjkHpIUR2Jvb2njiaIFWbo23miwkqudPRZMuJfu6g OSZxNKA6/pazMGa9gNN7e1qGkcZAxToDnpY7/wAhtmtzlTLtCKrptvulEaCkr5jNXReOjhjqPupQ FHkaqDm3HpI91iZ2LeIO3rdKkAdHG+K2G3Lsno/5T9xUuOrqfDZPrkdJY/dMbfapSZPemRosjuDH 0kpUSS/ebYoJophEwKLINRsbFp5VWiscdCbb7CpWQitBToJt3w56P4mdWy1dDRptio7e7CqsHWBI RkJMiMZi6bI0vksZZKCNYYyoa6h72+p931d1MZ6Y3GNdFBUUJ/1fZ6dFolrqiSiShfT4InMiFjxJ Iy+p/wDYX4sefbyUoT59B814dTqJNVPqEmkQtpjVV0sxb9Tkn66eR/h7TOAWr+Lp6NRg9Dt8a63L Q99dYfwVRLXUm5Vq6KJoFn+4b+HZCOSGTUG1rPTyOpBH0PAv79kD5U6MgcUHD/N0EubpmO79waKf w23Jn0+3UWaG2YrLQMh0mMRWtYgfT6e7uQceeOk6QamFDUV6N7sbYzVnX1Vl8ljJpcREWxlEsSqg qM5LEJpUkP6V+3iZSVtyT70lNQrw8+hJDayeGKA9WsfykN4NsCPufKZKD+KYrr+Ha2ayO3apUnjy bfe5Fkxs9IBJ99HksbTVVOqFH/dKWW9vZzFBBoBFK9NXAkikUBqny62s56j4fbb+WvVe1sXm06l7 j+TfTM0W2qLGYKlo9mdgR7UpP4jXbFTIpKlBDv3GKreCIwpJK4KK2v0+2ZYirAJTPSM3d4hCFqgn Hz9fLovWze3cV2N8otjdhddT7ih6lxXR3aXX2AyOQxlVt3cmY3HUbtmo9z1822a2OOqxuMOSxj0v 3NSB9wyalBWx9lko0Uz59GopJGWJ8vs/PoztBHlc3tWfH4WmpcUtFUTpNNUFlU1QAJidg2mbUv62 Xgt/X2yRViPKvQbuH0yvmp6T+I2ZUZaulz2UmlfF42rpKCmaYCVa2uWaMPOrFS7LDqt/QAr/AE9s XCgEgDpfZyYJpx8utG3+ZJ3VsDfXzn+RWXzOPkqafDdm5PbFR9uYvuqiPakEG3cfLQo6EPj0kxar UiNlkAUsFa9/a6EFYkUHoL7kk017O6HBx+Y9eq1t25rD1WUnXBRwvDNHE1fXwwtTpWyCxWOlgcKa XHQWARWBY2uxJ97Y1xTHTUEbqKyfF5D0/wBk9IuphtSVOoiVvNTS+VTpUaxcAqf1kAlb/j3oHI9O lH+HrvFUuNq4WhmZY655XCSO3EcYXWriPWobTa39De3uzFqih7evYAzx6VeOrKZqAUdHUeOvq2gp 66hhRqcNQpqbIVHkmUwJUSkaQVI0r7rnyGOqZOT1KrKXbEbVDCgydNJPF+2slNWlR4fS5pZIbrcA etgSD78AacOvA5XOOg7rQwUeiSNGD+IPCiftKfQNY9bsB9dXPuy8R1c9cKo3SgXSQqwREa2DXRnL XuvIVj+P6e9ji1etefThKKefNxLOAlNJIkZCAEAGG0QAH+12t70K6Wpx68KefUmJVlysInSOWMnT NAwuZF0G91KkXU2I54/HvRPHrS8AfLp9f7GkpJ4qkSUCS1kCDyRRSlqWWN5JQ1w9UnMJVSpC3PvQ BNKdaNSeHWXL1kE+HIgemL2NTPT0rxP9okxMUEMwiJCMinlfwb+9Hy9K9WTDCnSZpdX8KqEW2pql gCT6gQEUaQR6mN/9h783FT8unlzXrlSHVXyaSOI3WzWBeTxCMoF5uP8AW/A91Pw9e8x+XWKpVPso XBImicx6gLcunjdQ3BXSyXFvofdlwccD16g0j5f8V1zosxkk+3iaonqIXeeBo5mEjaHURvoeXkFQ 1xzb3Ygd3rTqlOGM164SxTfa15mZTLTyQRayzB2j1FQwANrMCP8AXHvVQStDg9b8NQHFM9LDESum DhYMFjs6HVr1sFYvIVtcaRa4/qfbbU1H16sMqKcOmiTyYquMt2TH5gIsjFVNpSvkhkCLqRDL9D+Q Cfdx3Lp/EvDrxwQ3l59JSJzS5GeRBZqeaoZVPIYKzKYnvxodbqf8D7f4xgHgadNtUOTwp1LWJYa6 OOIF6Scw11NcXvTlxI0b3vfwAOjf4qfda9pr8Qx/q+3q1BrU07TQ/wCr7MjrNnSfDjRYX8VQdQBs dbREDUbEhQfp+B79F8Tfl156aF+3pQ0cFiWAQM6CIxj0iQIiCQMfqrcFif8AafbTHqwGf2desGnh LaNSQ1hJj/TqDJCjfT9xQjN/r+9jgfy/1fy68B50zU/5v8vSWzY156pUcAtAikEH0ClhRT/S5UC/ tyL+zz6n/Ceqy/EfsH+AdOUEH3Bp73QVNAPVHGOGpSiTNdzbyDxsDp5sfeiQNXyP+Hr1K0+ynTka UIfIHBRFDafqHUSLYAi6liFP0Frm/utetU4U49TpmdaSujsTbDxcAxlY1FbTwhgVAZmdSOGv9OPf k+Mfb/k63P8A2TVPp/x4dJQJqpJLPqSVBIeVDBVkKKj6eWFjqN+Tce1Hnw6R8G+fWAIzMq2Q/wC6 0jBYcKwZvr9SV5549+6qOsvjqdRDLYC3jAtpspuzEG3Pjaxv71Xh1oaesMkExKvdf85YK5JufSFF hcE/nj3vh1YUyOsDoWl8UdnSMpFGLg6mK+m9uL6iSf8AD3bq3lXqbi2H8YpGjJ8dO0kakMQWVIZR K6H6apGJI9tvlG+fT0fayjz6xZ8aKhIgzWEULBSOCJE8isz8EsdR/r78nD8z1ane35f4B0we7db6 /9bQRlXn9Q+gHpvpNhdmte4Iv+PfumfIevUNgRdQQeOPp9PqSL/QW976sONesPvXTnXvfuvddqbM DYGxBsfobG9jb8H37rxyOnGxESN6VIZtSkepVIuoAPPA5H+Hu3SbGo46ylxIImPpKoiEkMQCi+gq AQbvYf7H3U8T04vCh4dZNemnKkkMAHZgTYuSWVg1+Baxtbk+6/iHVvLqcBJMKVWRdMtdJMg0gu8U 6MHYkGy/pNv6+9evyHWq8fTr00YFTClwdayJfVYMq2C2JFw5H1/1vehWjdeoKjpiq10sn+swuTe5 U/0/HBHu/Vl8+ptmejjmNnVf2f1AmMpHESbA6gCn1/HHvwOadVIyes9Gof7WJgviFVIhYjk6tRaz A3AsB78fP7Oqnj1xnZTC0YUicro1XJX7cJLIVVf6lwLn/D34fy/4rrYoD/q+fTD730705wgNTpdh 9ZABz9VIZdX1BF2968+HVDTPU+mcmXzyMCVpYn1W0sL10S6iL+v0/wC2H490xkfP/Ietnh+3rHI7 SPCHGo6qUoQzv6BIFsSzG6touB9B78P9X7OtDHHqfFTrUTCESBRPUVyjXcKkiwIR5Gvb0hW5/r7p wHDyHVzx6TdUFDoEkMqiJRqKlbG7alsf9S3+39urkHHXhw67pFZmk0jVaO5X/VjWgsD+Df3pyABX 168OnakfSrIQNIhazBdRBWZ35dvpzccc29tHP29eHDqBIf23UAk6WNwb8lo7kki1vqPe1+IHr1ev SOtoyeQIWAAtbXolsSD+ATc/7x72Bkj/AFeXWs9OtQlPTVaU5djCObagzq0uMi0Ne/AZ3/2w91zQ mmf9nrZFDjh0mj9ePp+L/W34v/sPajr3WSGUwyK4/Fwwte6MLMCPzcH3oiop1oio6myRqPoQVJGi T/A8q3+CsCOD7a6br05YytnoqiOeN/FLTzRzAOGsjoRpkIT9cbC6uB9Yyf6e/HiPTqrAMCDwPS6y OGwGTMmbos7gcH93IjT4fJvUrUY+tm4qBGkAmeWldwZI3CFGQ8kce/UqePTCvItEaNmp5jzHQt7I THnbNJiqytosy9BWzMJsZVR1L42FiRRyU7l0mkpGK+oMqEKbfj3ccCD0mnJ8QsFK1Hn5n59PlXur ae1pRQZDK1eLyUbfdCirKauqI4BUxKZGpZo6eSOXH1yLyuojUfwQfeigNaDqgjlkyi1ThX/P0jty wbI3Cf4pHXUaQS0vnhy9FU08FdT6bK8U1HMxepjiJ0tFINWg8Hj3X5EdOoZozp059PLoGcbh8NT7 ipaauzGNrsBO4+8qoKz7TxwusgQSi/lp5EmK306wPr9Pdjw4ZHS0yOY2IQiSmMdPe59m0+CplyGP raDKYWXxyeWOpppsjRLMx8fmFO5+4gYiwkVQQeGHuhzw49NxTFzoYEP/ACPSDhqqWOUaIp6xzYhV QKot6rLHpZ20W/wv+fe9B88dKTqoakDpSUWD3FutVWnxbwSQNzXVTVMELy8mJEZ18UMhRdLEekmx Njz73RUzXphpI4Tlqg+Q6+mlmMTWydYdPbypAfuKHZ3XeUhp2YGcyRbdwrBjLZAQQNNgLGx45t7X ztpRGNKdCKGBiozjq2zqnJQ5Tb2LrkgjmkqqBaiWsNjLJFVwiaRyV1aCuq1jY6vaB31Y6RSR6JAC T0x7+r5RjcpV0lE9bT0uA3FkIVd5KbWuOxeQkaMSeN5klkMBAlINiwIB9l1yhLUbIp1JXJ+gSRV4 6h+XWsHk9lSv150XuOvSMyby7I7X7N2xhhOz0EE+6cg22Ehz1X6Z4a2CrTyGONfHY6mXV7KHilSr otQB1lvy/u9pawBZW0ig/wAHSZ+UvS/ZPx1wmz67fVXRV77+p8hJHWYZppqPb2ThqminwFXUTaLy pSyLLTSEBXYFQSRb3tL7wu2ZDppjo2utwg3khLaUFqUOekr3Duzr/tnZ21+1arqXrSs31trYeF68 q6avwcuRx/YGZx0iUtDuXcmGasx/8Tz/AINIkk88EKopZtVgPb7XNvMlYxR/9Xn0XWXIkrSySXUj SRsxbuOBX8K+ij9vz6qb+bW4MvvzKU+PenwtBSS1L5mTb+3TJ/d6hq56eloZY8ajRwv4KanpEiiU KIo0GmP0AH2jMMkh416e3HZ7La7disQD6Tw+XDqoLsiilw1ZTYumnmSmdHqGiezRu68EEHhV/HH0 9mNpaEvkGvWN/Oe45cA5J6Nt8D+jd0Z/edX8iK/auRrOrelKiGgr9zy04GITsjLUa1WG27FNK8aV WVgxMgrXRLmCKSN2sGHsxmDKigDz/Z0E+VNsTctwMdCzqKn5E+R+dKH7D0n/AJ4ibcvcq7sklSrX cVLSVUYg8JEJWFotMvisnkfSCb8n8n2gjYljwOeh5zHsMdlt6kKdX+x1XhmkXzlVjKSswLMTyWty nJtY2/F/ZlGSAGHw06x63BNN1Ivnq6O98AqSp2tvXe3fKyR0E3Su1Mnl9vZKanjqYqbfe4sbkds7 PESzMFFfS5LJCrgf1aJKbXY6fbN3MUoBxI/LoZctWAdGYjII/wA59Oih5yrep3ZP97UyQf5TP9xU Pdqhw0peV3dvVJLK17k/W/vULeJEHrmtP9Xr01zMRFJJHTy6ZdzY9aCr+48RNLMoaJUZ0YJIAY2e 5PLD6i/tRBLxQ9AI+vXWxdn5nfu58JtXbWPqspl85kqbH4+ipQ01RUyyyelioH7cMaglnYgIoLMQ OfbszEKQOJ6V2EayXCB/hHR/O5N7Ynb3Qu3ulNkxvj9tbTyWUO4JocjJWSbw3zkqhKbPZ+pELfYm CnNCtNR6NS/bxagx1+yZg7vVvLqT7a2t4rcEEVp0CvZOUEPxe6w2nMxn+w3Vn8/jmCftxQZQQRzK rkAo0skZ1D/D2Yw6m0MTnoJbzFRn0DAH8uik0o8rRxqFGrSV1EmzkiwYm4C+kcf4+1agdwHQSYEM a8ehOwW3iaZ62rKfwuh8rVEnlA8kircroIDspY8ge2WictgDpQiHSPTox3wX2ym6fk/1/jRUTUdP Nka+d8hEyU0mKSmxdfLT1gmk1LCq1BXU/IX+ntqUECjDh0Z20KyKTXA6csj8bewsZ2fuqhzWFrae Sn3VlJ6qtr4pBDkKWqrZsiMnHO6otVSVUM4cSoCHBuB7tECTVx6dG0NnHGFKkaT1c3sz4P7nqPiP uOnyeCrcB2hA0PdO1sBMslNW7h2HkYYabFBIZwgD5alpnnpUOmSRAOPdZoUUhi3E9C+wRZUoKEU/ Z0A3w4wEWwN2dib6ov4nX5ebD43euCwVNUrTHG5jrTcuPzeTl+2lPiyOQXCGtSGCoRoEMjswI5Bj BcqsYUEV6pf7K1RIuCKfz/2Or0/lp8YdrfIjaXxX7HxO/d8bBynRFBgc7t7ceJlxmR36m5t5Sxbu 3LkspUyT0GOpM9SZmcxRsrpFThdJDD6pbm8YMCp8+kVvtySFkdBQHH+x0l+ku7+yuye4sx15iqmj lzewaQ4nc9HWw0km4t7mtz8z1G+8plID/kNII3EbUsdo/u5HYXUj2n75KMT1a/2+O3iLA5I6thhr 8rhPusTlp6eC1Gq06Q0iwxTTTIdEJClnWZWb0u1rn8e3/DCVzk8egHMAZGqM9CPUU1Pt3ZmAprRg xtDPX+s3hnqBNOzOXCk+qKzEAW08+y26ajUHCnS62XtU0yD/AJuvmBfKbLS5z5K98ZoukkuW7Z35 XzFD+1PLU7jyEs0i3PpMkjE8WAvxYezMaSq4xT9nQclP6svzY/4T0B8VSJVaEqyVEmiKN9ZtbUBp JPI4+nv2kjINR1QnhXj1N8U+gRSahGGXzyXDKJGYRrpP0k4W9vwfdcHr3D7enuhrUx9HUU8NF9xN W1giXXEUjYQlNCNVMCuhVJJAIYNz72MkZ6bap48OnOhXGU8ddT5aZFry1RHULISdEcygj7RhyVUm 2oG39fe8UrTqp1cB030dVUwQ00/8UqadtJekJYVFMiqWgaOemexUSogN9QFj9OPfq569jOOkzV1j 1wdpBCugyNoiVlXU36mBLOSrfUDi3v1AGFOnPIdcZ4/I2PRRy8VKiluASzabMbWUaj/Q+9ji359e 4E06yqjHKw6QCy1KNZb2AhUNIQeLgaeP6+/A0B+zrQ8+p8MlOcqpqQqU6yyGolMrxaUJJI1izBmB A9IJF+PdR14cOnjKHAinmixsb11dMYZkkUzVv28KsrSiWpdj/k4AsB+rnm3v2a54Dr2fPrJJkJa/ GZKGooMfReCljmp/sKWOFp4dTBTJMrWkMZH0PP596PDjXraUDVr0nKcsuPQoQbVTjR/qS6xx/X6G 2u496Px59OnVwDTqRRREZWcG6+GbWdQ1XC+lQPpZre9H4FPW/wAZ66rVApKi4FhVSInIBXTP5Ofy S4l/P19+Xiv2f7HWz8L+n+o9Msl0igY/kzyJyRazBQo/1iCfbnFj+XTZwB+fTmDKcQ0rOzB0iDXY G6rOyoDfk6C3+wHupA8SlP8AVTq2fDJPHpY4OGV8dAry2iAEnjLKiOutw8ZB4JPH0+vttvi6sOFe pmVoDU0lVCZUMTooi1cGKWFA8Xi5Oh0f9QFrg+9A6WBHEde4ginHoLohJ5qkS6vKsVQZC3J8irZg 3PJ1Lyfas00rThUdM51EHjnpyppHejjtfzY1DV03pJEtHI7LX09/ofGSJAP6a/dWFGPocH/J1da6 QPMZH+X9vXHLljDiUOooIJGXVzxJMhsCeeEC/wCA+g9+j+J+vNlUpw/2OhKemhp6N/J6NamQMSNA ZUmjYLKtynnBH1+oB9piTUdXHA/6vLpPunjaQP6WikpqNEVvIFYx+SYpILugjmltc/1A9uDgKD/V w63wJ/1fPpMViq+5ChZSPNTo7ABhrSmiVxbgEiRSP9f26uIyft/wnqj5YD5D/AOlBFD4brYn7LKz QPIr6hoyEMbxpGg/RIrzN6rEf737pWtPUr/gPWxgV9D/AIesyohgYiB1ljWpj0s2poGiHEpUAAKo JH+FvdamvHrwGOHr1kmR0osgRJqKY2lYyIQ5Kirjki1FgGIcs3Fr+7p8Y/Ppq4H6efVf8PSWF4qW RowDqm0RC5H+7kkHHN1KqL3/AB7UenSWvdU9drCAxZ5DH5CzLKBqVFbUWUA2P1b6n6H3U+XWgfl1 lZWEbyeRdLiRUZkIeTQtrmxtqjCWsPr7114Zx1jUpEjzK7kG6R6uFLoPVJGCSeEYLb+v+PvY63xp 1H0tTUrTcieZxBFdQCHmUtK9uTeKGwv/AFb3Y+nVgAT/AER1npKJ4ZYSpAeKOpnK/V3WGAyOukgD 1Lx+fdXIof8AV59WjbVIP9XkT11uA6X08nyCmIcm5KLTRizfQE6x9QLAcD3peH7f8PVxmVzXh/mH SZ926c6//9fQV8bi2lNQZVYA/QXFv8b3t78fQ8emRkA9QnFgVsNVrC1/96978utjiOo3vXTvXvfu vdeH1Hv3XunEnUq83uXBkNrOEusf1HA0j/Xt7t0mIyes4RvHDpsS0Rc6eDqj1/UEc8f05t7qeJr1 dSPL164lg6BAXUMikggG7xRFTYC55/HvR49W9BTqTESssBWRnSCahSJmAUlXcvpJ+npLH/X9++3i a9e8zQ46m1dzLDUMyMvmkVAmq6sWUjVxax/qPdBwI+XXj69MVaOIzyCzSmxN7foX/ewf9t7uOrL5 46zUhb7e4AYLMUYELe0iC6m/Okqpt/j78adaapPTlSIjwUYawKTVQDhbl5AXYRlbHSjX/Ufp/X3o 8T9nVT1ymp6ZaOjqGnMbEVlK0caeoTU8Ru72HIqGZQPz9ffgSSaDy68PL7ekt7t0707UsTNTa0IU qZFJPNyCjWX8BtP+3HupNDnqpHn13qBqYVVW0NEqWNgxs4JAH0uHX3qnx+vWicDqR6TVWdrSCWj8 SgErdqpDIylCI1/1vp/T3ocMcK/5OtjiK8en1oadMhFSSSt448jlVViCHEkUs0axk34SYi4HJXkf ke2c6a/0eref59ImoAWVkVtYj9GofQ2JuQPwL+1C8K9e6k499Ekhva8Wkn/BpY1P+9+6yZA+3rw9 eptOSsdSp0qQ0KEMbfWWdWZSbWYX90bgvXqcR1Da+mdbj0o/4+v7ka/XgfQX49+FKqfn14V4dYXk UtGeLBFUj68iMAmw/BJPu4Boada9OupJjIytdmfRClz9SY0Cf1ueAAPewvGvDPXqV64NBMqeR4ZE TizOpUG/AtqA1Xt+Pe9QrSuet0PWH3br3U6mkEgMDk3ItEQLm4Jbxm34Yni/090Yfi6ow4EdStTR E2ABjBC2N0ZbarNxf1H3TqnT3SNRyVFHJkIUqKQI0ba0IlSkZlEugj1PLQEmSMHlowy/ge956qdV CFND/q/w9C+dhbZSKWqp5JPGnjMlRRNIiPBOgMM1HNFIGEciksLgg8g/T3sGo9OkfjyVAb9h6lUm xsLUPUq7100dOaeLIUNYXyD0kTgmmrIGkZnNNUK19UbEqeCOLe/Dz+XWjM+DQA+RGOnT/RZtedJa aKOjkdlssiVL01VGDYRyqr3QkPw6kn3s48+q/UzA1qaft6Zptj7exsyUWVw6RtCixTtF6nkMoYRV SNdWaFuLsCSDb3pWDZ6uJpGyr9RaPZO3oqyGoo6Ri1NOksIqZpUgqUjNpKepRg6v+r1f1H496JIN K462ZpCpDNg9LJ8RTU+YiaOjx9BU6Y4oJkCiMzxr440Z41IZijhH4tax/qPdccfLprUSvxEjpY4m Ba6bwTGsmaJXdIv24xUUEbGOogmcAH77G1BBUi/khIP491ah6afC1FP9n/Mevo3dewQVHx86WaaO lkX/AET9fwMKy9TBCldtLHCM2Hq1RS+sE+pWAv7Wzn9JQTjof2jsY1qM9HO6EzQo8GuFq/2oqaFa eknVgwqo6Rzoiex1K0sBAX8ce0pAoo8uktwA0pJHQ457FVddPX4oRUlZSV1LVYiSGBkWc0+ToHge kV3Iiu0NUdbfn8cj2iugQQwPAdDPla4VZUUj8Q/l1rH4Z6bC7e6lod01ZOL6f+UvZuwTK8L1vn29 k8qmfxAlWX1S09PVT+MEABrAfi/suWcrrBFTTrIRWZrOqCgK1+zqwrv6nw2+9wbm2/vvAYWr2ZnZ qGiz65Rkmr1o8uyjFxYiOMv/AA7JU0VO1RE6keNyL+25FjkUF04joist5ubC9QxyEAHqr3bXxUq5 1+S3W1BlqWo3H0a+2919c5GcSS/f7ez8k1TDDXwoxjb7zEKyNIAxMiWFvaJjHFTwh1OWyc5LdJEk pGorTHVYWY6sod77Ry27cYkYzeLyWVoKxZ1Lip8dM8jwTRvcRAMf22FgAQD7ctp5nfSB0q5hRLmz Zi2SOiZ9d/y2vkF8o8RB2dtDbdNSdbLuLMbQqew8/laHG7fpNw4UmfKYqno55VyVY9BSMryGNCra gAbn2IbZpIV8SQj5dYv80bbbz3rQIKyjJH246tNrOsofiv8ACan+Ne090Vu5Ntwbiym+t/ZfJ4rH YqLN9n5anjfOVOKFLF94uNgpYYKSn8rvKtNCiE8W9oby+cq+kZp0JuQuV1sJhM/xO1W+dcn8vs4d UD9xZun3BgaxYqWGSt27kJKoVJUArSSrIppGkZdRAdgADYX9o7VZDSjivRtz4oWB1VcU6I/S7ZzW 6auRMVQtUzNMFczsixUzEj6ysQiIob6/j2eqGEYP4adYwNtlxe7gwVKd/n9vVkPbPXFf8P8AojrP qnL0s8PZ/YsP+mbs+lkVVjx9Bk6WOh6u29NCG8waHBPXV7rLa/30MgH09ltzO2sAA1I/l1KmybC8 Fo8kg7QMn5+fVZG4qtcjnKnIzBddRM8jpBHoWN78jSLkX+g/x9roTVFwAOo65oKmeWrcOvZCKfIY 2kCa6iUy6PE1/TqUKkaX4IW3HN/d07WavDoFFDwHQqbDyVR1fj8hUYzyRb9zUH8MhycDstTtfEVv 7WRgoWjI8mQzlO/hdiLxQkhbH3ctq48OjbbIDqJ86jpdb/pIosJtXblPChlq5KNJIlUK0LyIkaIk KW8RieQAX+ntoLWg8uhmpYKM9Cf3hg8Vj/jzhNr4+jpBldhZejjzeSkXVWzLlYGl8cc99UlPHMB6 bcN7fCDAr0R3+r9U56IFjkZpItChlEiawSB9DYXPH6NR/wBt723A9BM/2hJ6G6vxkQ2Vop9ckpkQ qUJHmdjdpGP1sP8AH8e21BqBnj0YKAyjSBno1/8ALxx9HjO9trVtdEv3L0m4qdvPOqIjvh5xTSFj yNUxAN7Cxv7MQsbUViM9Lba3fSSD1utfELrnoHuiIYjvzrTAV2e2bNsSs2xWx5Kman3NjZNtPKGm nBErtR5GhISlkJL2ubqbe9yLGidorTq4MquVqdPQIfMHuDN7+yu7+x9ixVm2Y+l+187t3K+GKm/h O8NhbeWLb+39tVdNACyY3GRpdIhpaOUE20+wtfTy1wpoD1I/LVuhWrNkj/D1SnHsTfmf+UHW29um Y8Vjdh7kz+4spuuuyspodv4Gk3FtnObT3QlfSqA1TSU1BuCqlWKPlniDryq+9W90CcjoS31sRCwZ 6gZ6tu66lrtsfHXEZbAYrKZjc0/WEdRQ4TNZOaso97ZylgKUOck88njSDcCIJhHIFlSKytZvbktw qj1boOURSzFqCv59Lb431e29nzVfYj4Db2P7D7Eo46jdGUqKFMjUQY+cUk+S299xDY09BQZencU7 EaY5Bwfa+O7VwBShp0TbjDPmrVTo8O0vJuTeFPSVs01VS5HI0VXPLUTmSfwU6icDymxdwgFkAChV +l/butvJuPQOuEQHK9/RoN4xRDa2bLItQslLUg6otNQg+1q1FRFJaw0gkKLfXn8+y24y+Onregj4 +fXymOz8hPlOx9/ZOoXTNXbz3NVSqTfS0+brXZeLcqWtf2bjgPs6Cstdb19T/h6S0aicWRVkcelp dAZ4kOkEspIGlf8AVfXnj3XIPy69inWQPU0cb0c9mgMsc6SD1DVGSBb8kEN72aNQjj141AI8ulHS Us1RQyRyTlKSatUFZIkkSCRQkpqA/mRkZiLH08j8+9fZ00Tn59cVjesmhp566jgM9OIGg8pvHHEH kjSod43kdiTcKrAkgXPHvfr1qpHXKfblPTUIlXK0VSjTQKiPRpG0sZlUMwl8ruHPOq1+B73qFa9b rnh03biMLV04RY1QQRiEwKiKdK/gIOQo4591Xjjqw+EDptBs2MkcgIj0V7mwA8lywtchQBzwfdhg sPt616+vWeOIVOaVQYYyaiocmSQrFohV2QKQVOuRR6R/aY29+GAc9eGF6lUngGZR5pESESTJ61AT X4itmZwQCD9P8ffvXHWh8PXKasKQwSrPHCyiSlAWDQDBG7BF8Scyl1OpmP1PuoycdbpXHWXHCU47 KgxtoWgdtUkUiTShklVWiLDQYV0cgfQ+98COHHra8c9NVIRLE+rlkcTkElTqHjCMFH9n02P+v7q2 COnRkdOtDf8AiuRZI1sWLFLC/MgN0F/wb291PwKCerfiPWHLxOkNS0uoE1sQAUgaY/BHqYjjgt/v PvacVp8+vNwb7R00ygRR0MhCsNFQzBlV0b1q5Vha7cm3u4zqH2dUP4SPn1LeRZMSziFY0ayL4tem MtNqkRdROo/Q2+g9+oQ+Tnq1aoTTpW4iUDF0Q0MwIdyxHp1Kx9Cs9wCy/wC3Ptp/iPW1yB6dT2ni DWlVgxicLGbEJqRwPINVmBZLBhZuPdadX8+g0iRmrapFAvavve5AAVm/pccD2rr2LX5dMEfqEDj1 NoK2ogFLTRlWjkidjHLGkiaW8pl0luUEijSbW4J96dQdTHiOtqzDQo+E/wCc9eywF8Qnj0R+BB6X MgIMy3COxLFVWwF/p79HxkNc9bf4Y8dCk7RUcbycvSzrLTJEysfG0crz6jYAqyxpcE/k8m3tKM6a /b/Lq3EnpIMHkYsWQCGOOpmY2GqXI1v3CAFT9Vp6ZT/hqN/bwP8Am/YP9nrx41+0/wAx/m6YfCr7 qnjV2KrV1T61HqbxxyObA/hmFv8AWPu4P6NaeX+XqrDvPShqopaWpr45Es1RBT16ODpIko5FGlQf y0FUq8/U+6KQQvyP+H/iut57h5kf4P8Ai+n2OJzTV8YheSNoKpo5CEPjSspnmJ5KnWCRZW+vq59t tQEfb1bpkneMUGTaQM8klBiYxpHjCxvIZCgUhipCwFW/p7eX4h9p/wBX8+mZv7PhklR/q/Z0lwod Ir3EbzDStuf3LqD9R6mJX/WAJ9qP8PSQYPHp7jo0TyLUmIKtwWdi78KoBV9QIQEtc/Tn3U9UDYBH HqLVRxBPFDpln8i6AJdcRaayRiJRdYnK3IuT9Ln3odbFa1PCnUOpRfNFTRfuJAo12Ntbl9NwQLDy TX/1wPdwMcOtitK+vWGRWraopBqkio1CLw1ncMDPJ/gGYEX/AAij+nvQwK+fVyQoFfPp3ijket8h dAfFOGsfoDGFYA/iLxPcWuT7bamk9egHeoA9f8B6ZM+V+6dFJJSpnVQbk+NBHGpvYXVnVrf0+nuy fCp+XToH6kp8qnpolpZIDGJSi+T6EOr6bEBtQUki1/durBga049f/9DQY8pCxlrEW/SB9SF0/wCP 196pk9ND4QOoUoIJ5DagLWv/ALaxAP49268KY6h+9dO9e9+691737r3U5QCqKwPoGo2+p5AsD+m5 1e7dMHixrx6zRuQsbCxZDZBz9WZgbg2H9q3vR49eApXrJ5dEYYaS6MWZraQS0bKw9J+p/rf3Wmfk er165ws8ABCLqRqKUeTgm0wZdAJIZWD/AO297IB/n1oVqR8uptZpB1KePJJKtiVPEujSALDTa549 tr5DrZxxPTLWMG0kWBDyAgfnngk/S9vdxw6stKnrulKlFDOEUzqGYi4A0k3IH6h9fe/Xqr8elRRU wamoahWCOa/NQFFDGwgggq1dlFyFtLpt/Tk+6HH2UH+HrxzQV6i1KRSYtaryCNocjVaobsCC8cbI oIF/Iurk/m3+HvwqCBTy60PMep6SR4936d6dqJg1P4SeHmkAAF2VjEpjYfTnWtvr7qeNfQdaNOHr 1lNlmx7SgBZGkdvpyrTkc88cL/hb3ofiA6qeFeobOQ7sCbhWIsPoySM4P9PSRwfexwHXsV6mZGoL VlRUFi0kkyVN9SkrJOqySHg/q1e6KvaB1Y1J6aJGVm1KAL3Jt/Usx/oPoD7cUECh631mpVd3KRpJ I7KFVI0eRmbWp06YwWNwOP8AH3p+GevZ8unf+D5hwzmA00L3JatkipbgNrvpqXSU8n8C59thowBU 1Py63pJrjrIuCBN6ivV21C60kEs/1GtgZpvtoVYL/QkX4968Wnwp1bT6nrP9hjqYKft/K91sayqJ 1aj+IKRUtYDkFj9fdTI58/2deovWCWohVx4Y46dteq8EMdOQPqo1MJW/bZeGBHB96yeJr140HTVV u813ZmkJAbUxZzdm9V3YnkH62sPbkeCOqk1PTf7e6112rFWVlJDKQykfUEG4I/1j7917p5Z1lp0q IgAwulXCBxq/Usi/0WXk/wCB4/p7aIoaeXTJFDQ/l1nppwLIG069LowI1JIDcELxcqQfr9feutEe fQ/9Y7lpKqlO1cs0QaITzbZqWEQRJDqlyG26uSUorQTRkz0mrlSCoP0HuklV/UHDz/z/AOfpFcxH +1Wvz/z/AG+vQm1sFPjhFlo5acUkEX71c0qw060KqTVU8stxGZVWO8Z1XWQfTk+/KwNCDnpKM1Wh r1hyme2xgpEWvyeC8NdTQZKll+7iaatx9WgamqjHCZWSZkAupCni9vdwdRYZ68iSv8KtUGn2H06b 6rcmws1i3/382HiqKD0h6icRSSJYOkVP5Qssq2P4BCsPr7r3KwNMdbEdwjf2TUPQdU3Ye2vNVUUv 8SyJMd4KigoPN5WUFo3igkkikjnH6ZSwKFeQb+7sGIGOlJt5aBsA/M9cqzftLkqilOH2lnq2IRFJ 1qqn+GRiqEgKsZoknjcSKpV+UIFrc+6gMAQWH+HrYgK11yqD8s9QsnmN+7iggplgottwenVVwVFR /ETJDK4ulQrLIkixEJJpA1r9Sbn3sAetetqsEZJqWP8ALr6SnxCy0u9vh58XdzyVBq5dx9Ede1lY tw7vXJt6Chkklb91o3E1KS97cr/S/tXNAzwxuK9DvayjIhYDK/7PRpNj5iDbuWpoap2o4pEjjlla UskcmosiRx3ADODb6C4t7TKtKqRilenbqBK1AHR0aExVlPi5PKxR8nSZAJLdpJMdAVUyjRMXXxyC 6hjdj+B7TXMZYUA6XbGUguF1UpXrW83ntnKS7Bh342Klrtu9gd87jzmzcdFIq12foqB3xqzUNayo jxSV8RjWQcFjYMT9EcVuta+XU92e4RPZMglAITP7Oj/z9Rdi7x27s7N5jG0uPiNPRtlMZPQ1aZvG ZRQREMnA0xWoTFRaUF3MkjXbUV4FpI0KBiMdR1d7rW+KIf8AZ6BLNYSfrv5p1WHqRFHQ73+JTz5O eGcpRZbPbHz8SY8R0/jLeUUtU1tbcngCwJ9lc6rGTQCnUg8szNI0bO5BDevVJO4Javr/ALU7Q61r qMpSUGaGXpoyyBMjFJUxVFG063IWnq0qFVgNJ5I+vBRfVFJjpB/1f6q9Tessd3ZIhYVpT+X+odSN tdk1W3OxanaGdMW3MHkKkZrA4fFeTHYTF5fIIixLBQyymGnaSwWSRCWmP6r/AE9vi5ndgNeD5dBO XlqGZ2nEVWHnTPQjDrOXt7feX2VuWavqMJitiZXPUCNXTwUb1tLj6utmrauVNCT6XRNchVCWkVfo faaWC4JBMh00/wBWOl1t4dmuhYtLV/1Z619t07RjrM/vPbbCOnochO33vihKVUX29QzRHxyuQAzI L8jjm/vdmZ4p1aRu2nr1bd9gTd7QhRVqenRrfgLu34x/GnEd8717n6KwvyI7no22bD8Xdpb4r6nG 9XbO3PBNPUZnsfsBcdXU9XumLFVHhaHCPBUQZDx6W8YufYvS/tBD3P8AqimDw+f8/wCXUQ3Xtvuo u1NvOI7MMC1Fq7CmVqRRani2ccKdAL382W7L3FuvNdkbtyG79/7/AMhm9857fFVQQRPl9wV1IWSG nxdKY6TDYCkp6WGioqSARw0FJGiIlkt7K2millLBqjy6Mtwsjtm3GCNCBShzXPVTuWhqKStqoJUE ckMzxuHIUqyORpLepWU/j2vh0lBTrHLmQuLmXVx1dPNPLKtFTSxDwqKhXRDIGPlABeWONQCwun54 96yCQfLoMhifLpW4daur3PiKqqSVvvayGV53VSGSNrkBPqLAfX8fn3cfPo823tpXoUp89hB2ti6+ nZq6LHVjVlRTSXFOGoYyaaEyEWY+QajYcH3ai4CnoRi7iUUJ8uhtweJl7U2v25imaWrqqrEJn8ei JGzNXUNbG70yhiJnURuQmhWZmsPe38ukFw0coOk8eiLrt+spsrLgzBItTHWFJ9amN4AjESibUEMJ UD+0Ofda5rXPQfltgrmtehhqTT0NDRUAnUw08FvOzqPVwdUiEHyG44+gt/X36rUpXzr16ihgPl0M HxthjTeDSzVOQWPJUORo6fLUFLN5Pua2SCjh+y8IMkpjZiHIDBVJvb6+3FPaS2ehRtkavGC5z1sA debs7Og+OGZxtDlf4Nldk7l27uXr3c2Mro/4tUtt/LRUc+DykjSlpDRy0Mjoup1MM7re3Hur3IpS pp0aTbdA2Rx6EPcXZOTwXTnaGWr62kip03tQxdn4KLFSUX2Gc7SyqLg+wKuarDx5LG7knrPH93E7 JGUs6qR7LJ2MmsgV6P8AbIFtlSrUHQebL2Pv/YW5t+db1kmOel2dmqRc9CC9ZPG1VClVNjcFImin Bq0ZRrkkIKl9KsOQlijMZOoY6NL/AHOAxhddDTo4+f3pmMRsKsy+WaOjx0OEmlXzR8yLTr+xSIkO lKZlIC2VRqA49ql8ImpXPQXY+PKRGwI6U3RWwZf7tQb9mkrHrdwYqnmnWIzJi6XFSMa5aOaNi6Rv LNMZFQqzavz+PaxUjPco6KL+7lUMhbA6sS6k8M2ZopoKeSGkxkMEMVVLHNUtFPMo85qXVGLeOImw stuL29uGNqVHHoG3MpJZgTk9Gxy801Vgpw8C+ERmkSIeuomkN4/I4UMwSTygi/BH0Jt7LpxRj07b SMwIr5/y6+VH8htqV+yO9+4do5ZCmR292ZvbFVgNxpnpdx5BJAV0poZSOVsLEWt7NVNVB+XRRKCJ HB41PQPRcSE6kA0NqD6grAWJQ6LNqJtb3by4dN+fUySdZo7JqsFUlGsWjK/UKRyRf88X91pQivVq grjqahiJV5DMGEKkFZXKAhQraotJQgj6397rSop1QdOUBo2VHEMzjVrapUlZZHYEF9fjsdRY8X+n vRJrkdaoD69SDFQRLoTHy3Usyq7VMoUmxZkUArHrH1A4v79X169T9nUPE7d/vDNLBSZGkx9R45XE WSadIS6tpWCKpjilaN5A30cWuOT7spFcjrb9qBgK54dNuTpZaHKLi6sHVSSQ0kjQLIqv4G0vLAWU 6wxBsw+v492pxPl1oNVdXXCT/KMkiomrRNJJ6bkkRJrLEc8Lp591BoCeveVB1IpqjyVyP9vFVamZ mgqZI4oHlexWRmkZVWNSOb+9Dj1r8NOnyjFQ2XWZpMVI7NUVr/w+qjmSJXjigFIFC2i8YswtcGx9 2/1cOtHh59KvIyx1lM1PHLCHjjkSqlUmRYI5YpY/JoUC6sW1WHJI91OQOtx8T0F0MM9HIY6hSgnQ GKVfXDUKqg+mVLi3oBsOb8H3pqMAVOB0+AQc9OGOlVshVSOWXVIpJX9QAkALL/ZIA/H9L+6t8I62 PiPXPMuGp5CspktKxFz+RKFccn+yLe/JxFevNlW6aWNoadmVGiSOqcK6BrEsFsy6voeCP9f3fzNO OOten59SFkDYepIi8UbT0xSNHbShLsCV1XJRmHN/z78QQ4Fanr1exjTpaYJBJjIOW/bQSMF06WOt hoIKm40i/HI9sv8AET1ZOAx1lrHZp5IHETAq7syJ45fHGyiHyMCZHsZLkG3+296U+fVqfLoO4WaS pyD+knwZByfoD9SbLe4uPx7VkURPy6Z4yN+f+DqVQ0yO1HM1SiN4mUROhUmMCQ6kZSRJbUbjjj3p ie8acf8AFdbVQdHdRv8Ai+suaS9Zi00iNpaeK8ai2jVVSKh+lixHPv0R/tPt69IMJ606EPIyTNTS 0pIIkdYYnT0mb7x45YxYn/dcEZB5vqI/2CZQMHpzyPSfAEiT1iKzFsoVuEUGOLHoEp2KX0lPFEzf 7USfdxgqPlX9v/FjrR+JvStP2f7NemOgjkO7p1dvV93X+VtYX0sswb1Gwt6vbmPAHpQf4etPiQj/ AFcOlVXvJ97TO8a+Fp6mhZlGtzFX0rQKi/Un92NdJ/r9PbS0KkedK/sNet1oV9P8+OpdHJLPj5aM BwPtnTyrGxjWTHtKTDI36ixjlAIJ+n0497alQfn1r06ZMhJ46LOqH8kjpivQFAjiCrPFeEix0SOS SDe3txMsp+3/ACdNzU0AV4sv+XpggjAgp2Fjpkp35UsXdmXTHpA9IulhY3Nz7UV6SE9x6UPlMkmo woqN6Wd9GpLsAVeJgSgcf4ke6E16ZAoOJr1Gq5qaMzywQqhEop6diiIAxi11dQigj1JCoQE/RnNu R7sKdWXUaBj5f6v8/TFJKIIZ6luJpxpgS3KtImhW+nKwQg2P4Yg/n34+Qp08o1EV4Dqdj/HTpBCm oSWdZWU+PUJUKtcHmwv/AK/9Pej02wLFieHWerqlonk/b8s1RR+CkRYvV5zNDctcXANOWBH1591I qKfMdXt/jrTyP86dJqrp5tM8tTqeqaZmmcnUFOpzIBpuBdwf8OPdhSgpw6dD1cjyr01k6iv+wFvo Bz/r+7dXAoD1/9HQLLeiPm5Fzckfg2AXgk/4+99NeuOsbs1he4Bvp54/H4H09+62B1gINzf/AGP9 PeurgjHXXv3W+ve/de6lrzEApH0OoMSOdV7344sB9D7t5DplsOajrIf83IARcADUvINyTz/goHvx 4jrQ+zry8gIeAxBP5Nwthwfwb+9H16t6dc3nlcR6v91wxxoRYXSKbWoP5uD/ALYe9UGft69X59dz NI3DOTbUtn40aSeD/Sw9+UAZ61XI6jOt4iw5tJpLDkXt/vZ97PW1wc+nWFCwBtb9S/X+tm5/23vw 6swHn09/fyiilpxrURZEViMLqymel+2lUMAGHlRFBH5t7ppGoE+nWqkgDpu8rFZIGY+J5I5HH1Op WClx+L6Sf9h7vTzAz1oYz1BP+3966d6m0iSTBoold5GdCipHJI/9rUwSNWb6Dk+9GgyeqkZ6dXwu cms4oZ4oYQ3jafRTBQLM2nzujG5+n59t+JGPxCp/Pq2k04dY48RdmWsylJTMq+qNDPXTAar6RHRx ypezE21D3syU4KT/AC/w9b09ZhQYeI2LZSvY20aI6bGxnm4LmZ6yXS6/T0qfdC7n+Efz/wA3W+31 J6kJNjIjeLFUUbAsFFRJUV8hW36isrpA7Dkf5uwI+l/eu88XP+Dr1QPw9OP8TmKiAiSOm0h9EMi0 EcbsWYBoqQQBtAW6/X8j3TT5+f7f8PW9WPl1FNUGIbREuksLIGdzqIBJ+gF7g/k+9gdarXrrRVzq SICEa92lkESKAQLi7KhF78fkc+9VHW6E9RnaJFcrUCbxgPMtHC0pjUII2L1B9CqLf1/1ve9JNMU+ 3HXsevUaeMvMYTTaJClNIiTzvKQksYkEumP0KDHYtc8X92GMhv2daPrTpsq2lJBd1OouNMYCIBHI yABVsLenj24gHkOtEn16he3Otde9+691Ipqg07klQ8brolQ/RkJB/wBcMpFwR70RUdVYVHz6cmi8 ZjAIMbgPFKv0Ukal+ovwP68j219vTf8Ah6mQOjCXzqWhnXxVShBqNj6ZkBvaWFjqXj6Aj8+/DFOt GuKcfLpW7a2cudpaqA5Crc4yWKStx0UpCGjlYvDX0yNqjeKVSRe11c8/X3YnNcZ6bkmKEMFFD0Is XWO3np0mo6eqmkj8MwqZXaenS3ELzqG/4BzuuhwR6GH+Huus1oTx6TG5lzVsdT4NlbeLVE5w8EC6 ZIsjTPCGNBPGuqcFJOF8bWkjKn1RsR+Pd+ORWn+Dqpmkx3k+nz65SYGnoxCMZRwUk8IJpa2BCXVo 0MirZV1/bzKQy3P0Nj9PdaU4jrwcmpY16401NWytNPM8euYrHMAuiNxKSDOIGYNFKshs9v8AA+/Z rx60aDp+kpBPD5TM0s9Kq08gYglYFB0NCqqpJU31Egkj/W9+wOqg08sdb/H8qHOR5/8Al6fGSqhY yfw3ZlXt0zuzySLVYDd2Wx00C6bB4kSMqL/Qf4ce1+utoAvp0NNpf9KNgcUA/kAf59HT3EsMsNdE Jo1lQNUtHNcTLJyiBGQXsGAY88X9oRNTByOj2VNakDrNsvu3LQ4Dc8c1BkMruHbm38xPhtt0dVSw Vu8/tMfPJS4Tb1fWK9LT5bJToYIDMDHHUMjMLfViSQ5anb1q0RQ4q1DXrWm6I3P8h9lbf71yXyK2 BvzYOSyXyB23vXbD77FTDX4vZ1fhosbR7U2wKmRqOHFYeSPyLFTKkIkJktz7ajmUnK4+XUjQ1W2Y xSklh5fs6289j7opt2bO2vmcctoc3tTGV7zaENRAs+MpmUunEX3U1iXYf6u4+vuk0iGLyqOgm8Mv 1wOeqhPlNvTBUnz86x21WecYjF9c1+143p1f7zI5jclHPXPjaQqLNJX1USQMSdCIST7LpIkMauWz 1KOwwXMccT8EP7eq9/lb1smD7wpqvJSQUuV3Z1jPlK+CmqPOs+4aOoeLGwaZCW8SQ0Coy8C6BvZZ cQ1dWCjy6ljY7gooWQmlcdF++Www+Q2F8fu8MeaOlxmXopNh7xFKdLYbN4Rkj+5qlRfJplkB5HLa ePatIUCKxA4evQxsrmMSSRE9PXVG8c9srd29MDuuTy5nH9cZnBUL087SQ56DIUsVdjKiC73qIKun qBoYck2BuB7ZmeTUVVDWnr0l3GKGmsHtr6dU89vyZPrn5G1K5vB414s1WYrI1+PLJUUEOKy9NAjU fhUkRVq2ZnF9SSNf8+0oiuKgMnReu8xxRsgkNB06fLfofO/HPKbZzNTHJHhtzUNDkaZ1qUq4KY5W ljyVHha6aHVDBl1oZFkMTHWqEE/X36TVGyAjNekZ5gS4SWP5dFJz3Z1XU0stXOsSGppzSw0o4aJF h8UWmY3c3LkkA2P+w9mUEevgtOol5o3X+1RpP59FLyEFDUTSrXTEQzTtJFIqvJU00gcE6BYtNrue Df8Ar7OY1KIAOPWPu9PJLNI1ajrO1HA8sMMEck0AYTvWEBWRGTS0YW1hIF502vf35QcnoOqpFSes mLybpk5qyANCmOo5o6PWCyomnQxYONInkBP4v7c8ujK2lMahvl0lqLNTDKBxJoWumSOpmsHaNWcE 6VPKut/r/sfdiPMenWxcB3I1jP8ALqxP4y7zrunspFvjH4w5fJYOornpK2olE1LFjqymMVPLWUzg opoKhxLHKPo4H0t7aeXQVGmv+ToTWNsssdfEFei97koYIcxl8/BpqKiuepnqzJI0rB3mM0k7yXJL /uE3b1Hg+3cEVHSS9iCmlOPSCyFI2Vpk8Mzmkllg+4ZDq8qO92jXmy6bfn6+9aagfb0itrYSPRq1 r1al8Wtm7bwUdJuSogafKy4zGY7Emedf4diUkq42qKqkoiPXU1cPDa/SQv8Aj79IzqdKpjoZ2NjG IgWPR9Nr4jch2jHhqOklFPm8rurH4tqp5KcyR1Oc80GQWJ2URUiqrMh4tZrcAe0pNCSydLfBiLAK +OkN8lM53fH0L2N0rXbOmydXvrbmy9rYubARVGQ3Dnf7uZRM7jcbTR0y6618FXReVma/+029srOi 17Tg9CGGC0aKkkoyOjofHrCb23Lhtvb87UxOZ2r2TvPa+zYexdvblp3oZ8tmNt4FMFT5pRPb7MZO kxQl8YBYTTtex9vgeICaDoD708QcpA9V6O/v7bfXVd1FkMFm6SOoix+ZwGXgSeZFaFcPWCeKGolN nqIJ5DZ0Y2cCx9tmMqaKP2dNbVqMgLcM9Rqzd+Giw2FxOHrjkJ61EqMXisbTtSQ0KQyIJzkGAWJv A0l0U3DKBp+ntXBk0YdF27FV1gN5no+PTtVTbfw8FPA5mFWiVNfOxNRNLJKnMxBBaFEkbSljx9fb zE6T0D3kVzpHCvRo6OGf7cwwxqRNSQ1kMv3EcS06UrnzRhnFtLpbTe+q/wDX2UXPr0a2YAYKBmnX z9P573w+7K6Z+aXbHdUOysm3TPc+co95YPe+OovNt+HcO4qT7jM4PJT0qmLFZhMjSzOI5tBmU+RS 2r2ss5lkiVA3euCPs6Q7jayQyvIU/SbzHAV/wdUbgqjt5FJOn0kP49B0n1A2IY2/H59rBwx0WHHX VKmqo5tbwyG5H40cf65t72x7fz69WlenqjpC8UU3nqQ33UdLNDFItOBDIDZmqHukQa4LFuAPdfUC nWhT59PT0wp3KPkKJopapYP+LzWVcdMTFqR5vt4I1nhiZbMU5JYAH3Ug/wDFDqysp/CeoMmKEYSZ MnLXL9z+8tMKyBmidTZI1qNMgl18KDyR7tq+Xl1qoHl1Fx+ROHqdVRBN9rIZFQ6gKyBGkuHcX0v9 OVJF/wAEe9gAnj3fy682RTy6ELHZqWNahG8OXoDFJIIKyO7UflQaJaeRiKmknGoWF9B/IPvQ6YZA 1K8fUf6s9Jtds0KRzZSnzpnqaankqZcXPRihrCWBDiNmqnSqgXXy0d2t9VHvZPaVA6sXYGmjtPn0 kqWSKOod6iBp0RGBjWMPeQFVj0rq+mr8m/8Are/DNKHq/lxp09xTLJVtN/CcgY5KZ0VUoCdU7OCS bFLqoBtz9fx78R5VHWqeVenqmeNBkKqbH1dHAKGmjaN4445KkU8U8ksgQN6GUKtlv9CT70R5V8+r Dj0xQ3+3E9M4lhQ28UigqGW7WKSC6Mv+2/x9tkEGhHSgZFQeo6x0sjmaCSTG1JuW8v71LKdJYgJ/ nY2NvwWAHverFCKj+fWqCta0brHkKasFOTIqTXuWkoi00HiYoyvdQSgLA3vb3tSNQp/PrRBCn16g UsJqYlKSwOQHjemkd4XYaeCstitzxYG3093PaTUdVUE0p1OYiPFzw+JlKpECrlSR/lBZSCpKsDbg /n3Xi4NetnCMKZ6VmCkZcZAYaguzLoMLop0OZDfxkkG4A5vf6+23+M9XSlOpCSMIslLURapiyAza 9RVXexjFhbSPoB7rio6v516DujI81YbfWlyFg3Fi0bgf48E+1bfCv2jpMMucevUqkgnJgqVMfjjo ZVv5UUxNJDMqlwxuoZm4PvTEUdT5n/N1ZQe1h5A/5epOSif+O46EC76cYoBsCS7qyXH0UkNzz70h 7JD5VP8Ag62/GMedOlbWVE6TvrVytBStUiBgSJa+R3pMf429VxJyVt9L/wCPtkDt+3H+fpxcZPAC v+brhFH4qfGY3TrqFfRLIoZdLinRWDEjlgxI/J9XPHvfFmby/wCK6qMADz6SdDql3LVSGUNaprma S1tamR4tQAuBq1g/63tzhAuOIH+fqrZkP2/7HSyynkXEw1AJQo8FRIDYu7UMqzhY7j0oBfn6fj20 nxj0/wA+OtngessPnpxWRRhZFjn0S86nT7+ndYXV1sGDmFTcC9uD9fe/iCnz/wAx6scE9N9fGv8A C6+QfqWop4jLHbSxU1MkmpbWbWUX6/n6e3I/jA+X+bpi4FUX/T/5D0nKawMaXUgT0xsA1gPJGdRZ T+oMPr+Pag+fST16UNXIpg8bxxmSeWKJY0BeSTUC37n4T/X+g5P090OSKdNKPngdJ6rMflSGEf5P GNI0B2Evq9Wm4uXmk5P+AHu/Tqg8Tx6jM2uuVWV2goWSO6AFVqmca2a1/IAylbn+yo96r59WIolP xH/B09SgQK05Csyy8G5LDWLuqqQLksPzyLe6H06bGaAdYo2eWrNRM1/tVTTr03SWqlMtkWxYu8UR W/496bAFDmvSm3ABP2f7H+fppr7TPIycpPNVlbMfSQ0rMWv9XYuSf7NrW+ntwDAA9OmwSCST59ME OnyAuodVuxVmKhrAm1xzyf6fX34dPsaDHX//0tA5JlVdDQwSLc2EiEm5NzaRGV1v/gbe9kdM5/iP Wa1E/wDuuemIXnS33MZN+LBgjqCf6n36hHWqt6gj9nXJKAzANBVUr3/3XM4pZfp9LT6Vv/Sxsf6+ /VpxHWtQGCp/w9YpcfURFRNBIqn+3GBMpP59cXkX/effsHqwk4kMP8HUQxJyA5BB+hW/F/qbcggf 1Hv1Oraz/DjrsEhWBIawA/Nja1hYgfQe9+WeqkAlTSnWZADE5ueNHI+n1Nhb34/h69/F1luodF+o B/Uv6iQ3Om/5v7r69b8usVRJGzkBdIRGUA8NxcqWA4LFvr78BTz63Q16yPVxtrvcBgtgg51lVuxJ HNiDwfrf3qlPt60FPp1GDl0MUaO7O6MLC5JAIsAoubk+9+YPVgtOPWSmpamolamghBmJJKyOkJXx Eh1JmeNeL8g88e9F1XNcdW01p05jEVARzUZLHwaiS0K1P3MrNELj0UaTpe30uw918QeSn/V9vW9A FOuX8Ox0ZZXmr6qUKpssEdHESVuAJJmmkYMSAPQv59+1OfIDrXaOB6zhaWIgRY2AWChZpfPVu91L FjHK6U4e9uNFrfT3U18369qHkOnpayq8fgjmmhh5UJA8NBFp8ajTpp0jYl3J+pPHumkeef59WqfL pslD6YpHAcRKdMsk1mugYXHkJsytxcfX3v19eqk+ox1HhZ5pQkd1mYsVESnVqFyihgqqAS3ILfXj 34gAVrjrYJNPXrgYLaxJJGh0sCJ50iUMOR+pg4YL/tz71X0HW6cesQejiPqq0QgH/MK85dDZhGX0 8OSBdg1v9j73Rj+Hr1B69ZPu8fIWULWVJJMhQmKCnAH0PPkk4Y/4C5P9feijCnAdbqOnajLzU8k8 aw0yxypGRCokmVViW5eeoDhWZhxYXt9PdSM+vXgfl00yQx1dbBHVZCR4PMiT1M7SER65dJWxssIX 6FrWBa/uykgYXNOvHPE9P89LDDSywqsUYoEyFO/7y3lhmhM66BY/cBSwUSf15+nugJOScmnWyM46 bp6Cs8P8SqJ4qeZqSm8NKkgkllpIo4YwZGuQrGO1k+pP+w92qPhGc9V45r0nKyGOOOkdDd54nlkH HpBlYRgqOVYoLn/X9uxk1YeQ695DqB7c611737r3XvfuvdOtDKsqGjk+pJena4AV+S0diLev8f4/ 6/ujjz6bcU7h1nilKl9WrUv6gL/pX6H/AAYH/bjj3TqhHDpS7fzNVgshRZGkXyyUjMRTl2SLJY5j 5K7ETkXNnS7R8HS3I5t738icdUZVdSrYr/I+R6NFS5SgeOlrsLVsMTnIRNR1ARI/tBV8VeLqHN44 Ynki0SBhpSddXGr3XSeB6LirAsrDuH+qv+bqLW12DjrlWrzNFTyVZp8fNHVV2OjrXMhK4+rkjilK zSwyXidzY+Mi9re7jhXrwV6YUkDPA9Jmu3hg8PFPS5WvRclRSSQxRY0pVztLGf8AJwn27vFJEGII LEABiPdunFidzqVTpPrw/n0F82+6Goq5J6HH5RpZoWleLTE6CoFg6JGhLLARwW+q3HHvRByelHgM BRnWnQt9TdT/ACD+Reakw/TO1N1bkyBl+xFBgsBPWtQzWEkS5fMeJMdiqad43tPUSxICpBt9fdSR XOenEgqQqQlz504db/n8pvoXsr47fAfqnqrtyWkp9+bbyO9Mjk6TGV4ycNBFuHfGQ3HRUs9fAZKe eooqeuCTiEywhg4VmHPtWsq/T+GSAM9CWxjlRURloo8vz6PLuqagWCryESxzVCXo5lB8Soj+qWeP 0/uw2a+q/wCR7JJLhVJC+XQpigLKpbzHRXNxVL46k+/xwZZcRO9YUhdQDTh1WRy59Yshv+PVY+6i cuCtfLr0thpo6cegs+RmWj7f+N3ZOGrp3yuTxuMXcm16KXxPVNVUVOzyQQzzhp/NGL6LSHkcW+nt pEozMXx/PoUbTI6IqljWnRhPid3RQZL4mdKVkOdRpJ+vaOiqMxpnqSuUw1VkcVWw1LTBZpZ6VaNE caQQy8XFj79IU0Hu6f8Ao5DdrIv8X+rHVZHy33th9q/JLrnf2SrqxaOfK7Pr6XOwPKKinebKRUmQ rKeSVHURRQtaSMCyq2m359pigeLUrVPUh2JliQalogHS3+UGwKzKd89SZuPHyVMu4cJmqJKVS8sl NS0i5O1fXCpaONDWUpEqJy6iwI1EgJ5Imwf9Q6EVhukcQcE9ITsP400O5fhL2BRS1FNT4Ta+523D rr41WvqclWV0cSnGPY1EsURmYFR9FN7+2520pVRwHR1Y7tqu0p508/8AVTqtTvmik2N1T8eezNmj IVWdxGPTbe+c1UTPUy1eW2nl5/4e5mleRal48cscMkWj9rQNQI91hnR0Bdc9DQp465bBHQU/ITq9 pcN1H37lcdEcbvWqqqrGglGnqMlTuctkJ6mqldRVVFQ8RALkIoUKtgOFTMsoWgoOgheWyRTSovTf /Mmyv97uguoZtvUGRpNr4+aPcO6M9lJKaCkz+/tw4uBq2PE08c889VBhKKOKkapdUiDoY4y1r+2Z gqhTTHr0FLhmikeooxHD06oc+8qp185nlFNS3i9RD+oNdHBa1h+OPx/r+1lvOygCmadRXv48ad21 dtT1O+3GXjEtFHKlRTTfdiSKLUpEcYDBFC6mYi9/wLezVXLitOo9vIlLMPXpuwVI0U0j108a08NQ 9QBLUBIpZCS+sCSxuuq1v6+9dBqeIxucY6hbpry0aS0tOiUjSq0k0TIBLIeEuEYgggcf4+7DJoT0 yXIAWuOkrisLk66oaelp1fRKjllbQp1svrAYWaw/2A92ZhwHHpoGrA06OZ1nmKynU0ofyxVNLPh8 tT1kZZJ1mQoBKiFf8nYn6j6Wv70tD8XHoR2ruUXSTWnSVze38vtOsydBnKaO0zBI5IKhXRkn1Shw CfSuiQXXki1ifftUYqoI6VOkz01Anp52tgMTT7UkikiklNblYrSxEalWSZY4gGkt4yGe7fiw9uqa /hx0qsoWLggVP2dWn7RwMO2diQzRwrHJj4Ii9Q4IaunipEZI1nClooYkBA4IB+ntHJKTIa9DK1hJ iBaor0Zz445Tcfd+QaqyrzDE7UoKt8YYpnggbJV0AxFKJvGoaY0VDNUSRA2BkALD26sPiKGrnosv p47Z8nHVgVDsfddKmGrp6eaar27MtXRVtVIstTUwxxBXkieOMSLU1SqQb2H4J90ECgjWeHSCTcWd SI5DXoa9xVG2dz4CLKV1ZPjctjXSWWLJuFq1kYGR0o5GkdlpjJHyASLni1xd19KIT59FwhkmkUaq jopvbe96vKvtXYuEFJTT7lhnymaySyJKaHbODqLtV1kczPJD91UtojJUeST/AFvZaxkY9h6EUCra LqenS06wxaY7FTwyVNXV1eTzlYqV1ZIGqqWjxkUTQ0ePS4VIHZ76ieQTYD2thEg+Lz6A+8XPiyMA cV6ss6jy9H44YaipUNL4YYY01lAVj5gikL3jLOATe6/6309qGKjj0HwM46NlUZ2nbbbJVQmKopYm jGtQ8usMqQRRxwkEysWshv8AX8XHtK6owoR0YW0pQj1HQAfIfrrD9i7YqsVuPA47d22c9gXwue2h uCCOtx+4KEsvkp6zHTROagxgkowCujAMpBAIL3h8NwyGhHn0KbaRJ42jdAVpQ18+tXT5YfyMNnbp rMnvD4l7kXrzL1ERq6nq7fFTUVuyyCrmWPbm6jFWZrBqWAUU9bFVRhrgTRqB7URXrrRZkqPUf5uk V5y1qBls2of4Tw/I/wCTrX77v+IHyM+M+UaDt/q7cW28YWaCm3XBTjM7MyBkZo4DR7pxZqsPqqtB McMkkVQR9Yx7MVljlU6Gr0FbmzubRis8JHz8v29A1g5ciqRw46mraqWZDI6QNBLEo87IGlSQqBI2 m1nP0/Fve6A8ekh+3rhTpUJrmWXHRzQQ1SrTSJGsrx09TLKYZ5UlURzFnKjSLce9+nW9XUrJzS0y CcZWi1zvTSmKjElZOyhSjyWkOiBoEf8AFv8AX96p+zr3HPSNrpVqJrCV5EaZU1SRLA6qxC2EQeSx Ufknn3ZAQfn1auF6n1Us2OzJWmlcFfBTyarFZ4gqqUlTlXRkUX97Bqvy61StR8+nWOvpa4zRgGnq YEkIja8sEiq4Ummkt5ImZbXV+P6H3og0Br1ShA+XTZjDJFWSFQmtEkQ3lijBJkvfXPIiAi3HN/ej 1aleniXIyMzRvWUikG0vkr0Yx2+pUr5Lk/7SfeqeimnW856xRSIuIzTRTCqWUukpH0EnhRI3RyAX uslv8be7AEaa9bpnPXPCMiUcIuo1SS+QuOELTFAo5+rC5/2Htl8t+XTqjHUioip/JK7ReiNm9cQV 3A8pA/bPpkH0/ofeqmnVvkeo8cMsTeXHzuIuVZUNlUEEkMh0yRG3+w92Pz63xyvUWdYHic1FAGmX 1R1NDaGdQDZtTRAJKdI/tKfewTXDY+fDrRoa1XrHLRLLRulHO0zuIgIqjRFMFVnezSAiIsA1rEA+ 9g91SP2daIqtAepOLr0pEho6uNaSohkayyoYZCWsVZZpA0ZDH6jj/D3511HUuR1pTpADceprTxBJ z5XkSeKWol8JXxpLHPbSVJVudd+OCfdAOHy6vUUz0i4PW1a39oUtSxN/yzDUePwQT9Pao4C/aOk4 rqb8+s1FIxqKUgLpipnssgGhgAwYEMQHufpf6Ee/MO1/mf8AN1tTVh8gf8vTvWfu7npFJLFWoLMW 06mSFZFa/Gka7f4D22uIn/Ppx/jT7OnqoaSpMMALXrsrGS9gpjpcciIPUp9LGpkW/wCCQLe6DFT6 D/D/ALHVie2nqafs6eKjVJWYuJisRkFZICsbWVy9KiNJJq/WxBsB9Qf6+6CgDn5deHxL0jNqxiXL VjqvkKQysg5GoNUR/Tg8kfj29JiJK8cf4OqfjYjh0tK+narglh4X7mjmR4mAiEMkGtROVb1LFrbk /k+2QaEH59X9emumqWvTTRhQtXjI5GVhZTPTQ0znQ5Ww/TID/XVx7cIy48w3+E/7PWhwU/L/AAdc ah74ipneyNJlK8hYw4jCLTNGBYt6/UqgN9bc+3I/i+Wkf4ek9warGP6Z/wAHSeomLinDsqgtGpN9 LEM07+Qjm+kqt/8Ab+3jQdJjTux1LNTFShpZXVpmSaCFmGp3ZbJUPp+gJU+NT9QS3uo9etaSeAx1 BWQ0kE1XIdM36KVVW4NVIAUaLVcKKWPki31sPz72c46uBqIHl59dUEZhhRpFDM0kc4C6vNIQxvc3 A0kHm5596PWmOpjTp7Y+VI3ql0O6ks3jHNtRUsV5EhB/2N/eum8KSF6x00WipDJa8ktO4MjGymNj cOTbUAjH68X491cY6UW5/UYfL/L0n69TqUQWs4lYkEWIkkKFgxI/Sw0/4X9u9VQ4FemeKJWZg76A jAEhS9/1XAA/Jtwfp78OPTzNQdf/09AptJ5PA5H05B/1IIJBFvdumBWmOsoV0FwAbGwZDdf6j1KS v0H0Pv3Wj8+uaOWFnSNgebaluQPyQTfj37rRFOBPXKGeWF7xSyxG1laNzYfWw0ngjn3rrRyM0PU6 OpLxhaiGmq7MW1yqI5i1xdDKqq2k2PB/P09+9eqnBxUdN9Wq+YtHAaaMqn7RYsAzBifWRcjji9j7 2K+Z6cU441PXCC3jmubGysFt9SGsPxaw91Pl1f1+zrki2dG/F2J+oe4v/S9vV78eHXupkcVJKvlm ilnnMrrIGmKJpUalPpUEMy/7Va/9PdDq8qUp1cEUzxr1zDiFrQUdDHyCHMRq3VgbkaqhpFUc88G3 9ffqV4sf8HXi1PLrKK+uHCVLoAdSrCI4VU3IYKIQPQ4/wPv2hfTr2onpgVtNSGPq/e5Deq4Lc6i3 6rg83928urdKBpoyQEKa/oPEv7gJsEKpGrDUAoB+h/PulDThjrVc0Jz1n+3qXu/2jxKVX92rkEII IHjYCRuZBIDa/F7j3qo4auvZ9OsLvTQsprq9ZWUjVDRL5nugYOrSXSFS17CzMB/sPfsn4U/b1unz 69HkYNBFPTsyKViElXKWexLuZBHEEAIS40lmH5HPvZU+Zp1okDh1hlkyk0YqFbxURnjiEiKiq8r6 RpYt653T/aibe/AICFPxdeqaEgY6d6zb8kRX7qavaPW0ZeJfKWVdRLmO9ku5so/N/bYkrkAdXII4 9N9PhHilq46h6V0SkSZH8ivrWoRmgZdBYxuNB1D6qwsfe2kqoIrWvWgprk4p0zVnhMNI8cXicxsJ BcWYppQOAANIZgePbi11NnHWsU6xUZ/dIuAWjYAn6CxD3b8kWX35/h60fL7enIxulEahZZEc1xgl jDaY19CSQM41XJJLEG3Fj7bwSAOFOvDIJr0JFPgaemSXHLL54shTyNV1TvB5p2NlY06PGSAkvC2N zw3tlmJIPAjpwYr0nzS/wzJwYHISrUQoYauCoRQkk9LHG860E49T8tHpUXPJ/pa1viBcDPmP8vW2 FKDy/wBWOpWUophLLkqxHQCklqhQwyBpR5tUbkrpCCGAlLn6gf63vXqB1XzqekHXNenoA1XHUSJE 6GGOIIaVE0Ikcr6VMkhKn+tgB/X2oT4nOmgP8+teQ6bPbnWuve/de697917rsEqQQbEEEEfUEcgj /WPv3XunsyCqgFUp0TxWjmRBwSblZdI/Elv9YH/X9tEUPy6ZI0kjy6yRSLZCSFBa6shOqKYcqy8i wJH+wv71XrVDnpa7a3fk9vrUUNNHjJsblqiOGpp8xFPNQY2ulHjOQRInV1hqY/1jlDp5HA92GRTp qSJZAGNdQHlxI9OniPrmCdkeu0U1aZ5WqIaDWMe6yTN4FpVfU6Iy8ABrWta3u2fXqhuWFQp7fnx6 Nn0H8HOz++8tQp1nsp5KOjrBHkN3Z4z4vaWPhZvJJLVZKojkeeroFIL09PFUVTRsGWMix96JAHHr ca3E5Kiuk/s62Cfj1/KB6H2bHQ53tuKbuHeUT0kn2kKT7b2HQVCBCEjw9LL/ABbPDjRK1bULTVUf JpkJsU0kxqdIz0e2W0RAKZm1E+vDq6rqTprbez6CPC7E2ptzaWHiQQHBbbw1HhcXTxxxgg/ZY+On jdbgC9ix+nstmkl1GnDoUQW9rEqgKP2dHT2kr0e3aOgTXFUQmsiEJsL6xHrchQY44BKq6b8k3H9f bUbzcAc/5OlDxxhdScK9ILeSzvR5RKaO74qfVBNBKEikMqB9MhvpmQpJZx+Rxx7eaOoLfi6vDK6N pAJHQJVcbSUmSpzHA0TwLHVR0LIsCOQUqqalAOgpeQ6l/H+PtKWZOHDoQwKsmkMP+K6Lk/lx1PVY aR5o5cbLK8Zn0PHV0UwcmOSNgwmTxNYD6D+nt2ORW8+PSmVjaJVBw6n9GwbV27hD1ZtCnqMdDT5/ P7pxWMrK77iikfcM8dZnIaYTkMlOtWheGBfRFraw5Pt941EYNQR0itt5l+qUOSBXpGfKfqOg3X2J 0xt3JUVCZMv9tNTUdTMVpzNPXRpTIWZgkR8qjSynQzH/AGPtqJKBlDefUjW+567dcjIz0OHeWGod yS7c7NweeiyGF6wlrdsZERmanrKfdtbmc1tWbbiicIcrlaWTCPJMYg0cUM0eo3Yn27JENA1YHSRL wiZhwWo49OPyz2zLsX4Y79wmOimTMUe2qGuwiA3FRuHIPT1RRGhuKuVJJrlOSALe0L2viRtk9H9j uttbzxGR1+Lqkyn6N7Nj+H0uY7exdftKGl3nmNx7frcrC8aVtPlYYaqsg8VSFkjrTXyOum2mxH1P ste3kgB+X+rz6lfbd6tLmNFjerdBT33lt5bq+JvXFasaU/UvXmdwG2cWzBaaf+MeeeaojVpF+5yM 8rVBDyqTFFbn6Ae2o7qXSU046XXNrZyEsWHiHopfy27Lm3d8WttbTxYFVDT1qfaIRq+xxmOVgWeV raBJI50qP7RLH6j2ogkklXS+SD1GvM8KWxd4iaFSeqedtPTTYnO0lVKy1CAPTDSCnkQquhuObqbX +gPsSW8cdNdO/Hl1j9ul3O0rpXFTT7Ohd+PFC2Q3XNQT+II9BVh45AtnidLOAzahGQo/V9R/h79L MYyABx6KRA8itI3EHHQM9x7fi2vvbIQ4xmfGTS+aADUQhPEsYU+korfn+0Ofe4JPELBh59Eu5oIw TXy6C9ZZ5nVFZpkjJZVbhSb8r4ydIP4F+QPakqEAJ4nogJ1HhjoZsJRinxVNPFpRZ4y7soDtGVYW so5Kg3sPp7axw6dxw6WG385LiJZqqdpGMaBIwvDyK72DeM+ltI55591ZdQp0Y2E3hMSeFenPP7yp N35RAjzeePxRaZ5CJJoY9KrILmwZgOT9f9490jtQCe/PQji3JSSNAPRouotqUO4zLgpYRNU0mLqs sh161pkpY/uZJnN7Fo0j9IPswVCUorHo7sCjESU8+rR8ZtKn3b0xPFmKyDa2Dze2cTiqTc1UrRtS Z2qyCU8KrFAFeJqpAI1lN7m4v9PZe9pMWJrjpTdbktqDp4jo/fTfxjfojFbdgoKla7HbixAeprI6 to6ihr6F4mM5hVtSR1IlJKuTZQfp7WxRtEqhuHQKvb83MrlwejhpulKahqYclivDJJBTiiydPKsc cMSEqywxfpMpBN2+hHHusgGWrQ9JIZGMlScHoCN9VVZuXLY3a2Einq5c8RTUdKjocrXo8zJECqgm mhaRS4YWQItyfaBtTY1Ho0hvRb0Y56TUfTOJwVFmq/M1lRXb9z1dRUk86xO1HR4imlMVLtzHQy3a KioZxqqHb0ySkv8An27GhWjnj16fdPqR4daD/V/q9OlNtPb9cBj8BJRKuXwWRrJndWl8VVTyyI76 2/VHKE4U8iwv9PagOtAvRFKocktno83V2OqIKSaKoSipRBVNHW+ZiahaaUDRKJgNMcduTexJHtpg VqeI6apGMGlejMyY3JQxYqBfDWOnrqJ4w0gePUWhqoS5FlEdtYbgnn2wr+vTyeHQGv8Am6xxwTZT FTCqDUtTjM1Vikmqkv5qQ6DFGJDbQHcsCPppNh9fey9KsRjo0hm7l0HoCN2UlBS5ZsnWeKmoP3kk kgRXQIH9HnUAcskJDsByAOP61QwymhFD0dRTTlOw8Og53Ftjae9cRU4zNYXC5nD1tNOJ8Lk4qXKU GWoJkZLSUFbFJSzCRHNwyG6m3t/6dUoVNOk05eQFXWoJzXqnr5BfydvjFv8Ax2ay3VFHL0PvetrZ Kxqjb4yWY2NPWavIkNbs6pyMMGIptRIjTGS0cMKsbxSABfejJJHlhWP16I7jbLWauhTHJXy4fs8v yp1rzfIL+Xr8mPjOchXby60beWzhNNMvYWxJBuPaEqmpMcM1fULTU1dtxz5F/arqeDU7WRntf2+s qNShz/PokuNvuberMtU9Rn9vmPz6IfXx1EldJQoKelqWd0aAT04FOrx65KeoMEV2kDqSRyVPHu9P 2dJD0nKukmpKjwTNG0qSxepWLobsLXYgMw92Uip6t6HqUxM2cTXcf5UWfxgniPk2Dk+gaf68D3pf gPXj+LrlQKTX1klgViWR2AIW8bTqAwU/qVfyP6e/HgtPXr34Sfl1HlhaadlhXyM6TVLhrFQoLMDY 6baVPv1cE9erw6n00dN9g8QRBWSOlOiBg8jNJdjMvpKKgWwuT/sPdWqTXiOthhTpzNOKba0sRCvI 2XF1J0yL+5AjA2sWVxD/ALAe91rk+n+fry0J8+pGOaGGmpYro6SwQvJD6WLzlneT13JUqvqt9PbL /Eenl4dST5XXzLTLD4pLSBD6XjW+mRYzwzci5vx70OrHNadMmUn9MzxXha8ciSozI3DXsCPz6v8A Y+3F8uqmtD05Y53mggaXxzOQrB9Yhka6XYM8a6bKv5K8e6thjjrYJ0ivXF6aOVtUMsYJK+gyLHNq e4UAMVSfUBxpN7/j3v8ALrdAfPrvRNAHgqY466CRlbRUQ/uoSCOBKA44UjUtj79UcQaH5deIIrUV HWOnoaAJMaWaWFpI/G1JM+qNbSI7GKVgJUsy/Qg3/r7szMaVHVQAOGPl0wPQ1OJqiMlTOlPVI8Yl DaoJY5SG1RVEOtCQpvxcj8j27qDqApyPLqhUq1SO09OMVOpRRST+ekWI+iVY2mgDMQVSeMeORC/4 bS1ube6kn8Qoet0H4TjqHNO8O4DLIReAkJa3CpS2hHAILWIuPz7sADEaDj14nvWvy6VlAjpd01eS kGNogBZrygiuq2t9LiWZV/11t7Zbj8iT/m6t6AeQ/wAOenavmb+IRAMFEcCPZ0KgshkkFg9riJ+L gc3v7oB2N9n+Tq65cfb/AJekTs1JDVVskTaZI6cFSSFClmPrZj9FW3P1P9Paib4VHz6aTiR0vZ4n mi4CjQktPI4GtmhgjDOWk+jRPNc2/Nr+0+B1cZ6TeOQTUWOSQwBKSryFGQQdTRPMJ1DqBYiQ1ChQ OSB+Pbp+InzIH+b/ACdaAqoHzP8APrFlZ2bEDUYhqrMoPGBZlYyU8Sl7re6glQD+QT7cjAqx+Q6T zklol/0x/wAHTVEjLJSJAwFQQwLlDaFREru6hrh1iUMWv+fbp4dJsUYnh1iK/d1o0WaCFdMSG4YE avF5WNuSSzufwb+/cB1vAU+vUN5mqKyMU7GWno2fxvImtZJCTJNOU4/zjjgf0AHv3qerkALQjJ6f B6zYaYniaPWRH5Wcm8kkaJcLGAFuf6fj3XpngD5jqQZUMsbxxpMHCszOS1kk4TSoJVSbA3Jvz78e PWqUqCc9cYWMjuwdFMcjyRuFuw8FO8kgKmw0MFB/PI90b8P+r0/1fn0pg7VkI4gf5D0l6xvSTpNl TQhU+lWcqzqSQQRcggD+vt7qiCtOmmMubooY6/qqi5Nrn6D+nvw6fYDBPl1//9TQRX/MEAEkS6r/ AI5Rvpx9T72eI6ZHn1HcFTcApwBxcE3ANx9L3v8A4+/dW+3rpah47oApjupKML3t+NXDi9/6+/V6 9oDZ8+uazQsbkNEefoPInHKjk6hf6e/V6qY2HDPUqnQyEqjqx0sxAm5P5sqMAzG3+x97r69NuKcR /LrhVKyizjxFVBKG5Ltq/wATwUB/3n375163Hx4V6wwk6ZVC3DKdVuAADe5P4s3vR8vt6cyD+XUw RgBiDpJNk1BgyltOoA2sdQa3vXp17rJHC8pkjihEhhb91tWnWHIC8X0qEI+o596rwNcdbA49S3o6 gqHkWGC+prSPHEPwNX7snr9N/wAf4D3So6tQ9cI4IWJjSVpiP1PELIvP+dLkRp4x9DzcD+vvZJ4k UHWgB69MlSixTTx+OzalZbvqMYYB9Pp9DGzWv7sM9X6dGyuREceiSKmRtLaKWKOJ3v8AkuFaRmI/ x/2HvQjTNc9V1kVAFOuVdTyRwediJYWZBrkeR5r31lT5GJRybhh+OPflIJA8+tZNT00VkQhqJEAU L6HUISyqsiLIFDHk6Q1r/wBfewajqw4dZ6HlJhY8NDJcWJspYWH5uSwHvx8uvHp8pfvKqgOOggnm ghrZK2UqE8CBYDYDV62l9N7XseLfX201AwcnNKdeFSpUevUyfPM1MsKpN948NquZmsHqFVoUmJuF CaTqUAcH6+6eHU1r2dWLUp69eoNuSJCKirqjTwSyoohhYNPURBRIsnmXUsUbl7AWJJ/p720gOAue vAepx0y56mhppoftlWOnqBJNFCGdjEA5jJvJ+5ok0XF/8fdoiTWvEdeIp9nTVSW8y3HH0+tls3pI Y/0IPtx/hPVSaEfb06F/8gmQaA4r4XA0kuV8JC3NtOkSAGx55P8AX20PiX7D17yPSrxGcnlYUNOy UAREPmrDHNKKhnlMxp/IoEf3Osc8+McD6+6lRStcdWBz02ZRajKV1ZkKWneojxviqsjeb0wXcIKZ GKpJ4444SvBNwL/X67WgGTx4dWY16zHJVGVrUoaON45KuFKBXms5gpCJJqoMDqLeP6sTfUqD3oAU qeH+qnVa9R920tNSx4qOmjVI4oZYVOhElkjTxMstQVUF5pWdnJN7Brfj3aI1ZuvGlOkZ7f611737 r3Xvfuvde9+691IpqhqaUSABh+l0P0dDbUv+H04P4PvRFR1VlDCh6cpEEbXS/hm0yRuCLDXyBaxs V59s+eePTfy8+lZtbbed3jkIMTgsZUZOeoZKaoihBEKwykkz1FQwENKsOkvrcgLpPvfDPXlUlgF4 9XWfDX4eYAtjj2eI96ZSnFPUUeMUSx7epqRJ1kT752dJc09KNI0OI6e4IKyLz70XVgCB59KBYAtr bifLyB62PeqNpYjGwYfEY6KkxtPjYUjhpcbSwUtHBSxgiFKanhRIKVJEA9MS2N/z794dSc46XQhU IAHRvtpYVY6lvDSSiNBGNc4BHia5Fo7E2jb6E8hfr723hoDVKjo2twzkANQ16Mrt2BKQ0sSLSzRs WqawuUUSKARHpCguzBwLLcDi59st4LZpSvRuts+CM9LF615qOajh8QIa0E0RUpNMbyaG0qrL5mUr /rr7TnSCdPDpUtu6jgT0h6moGQp6jGSQrRtBFUywKQzrMsiFZ1n8jfruSQPx9fdHIK4PW0cRMGK9 F/zNBQ0SUsdIsjPL5Kqpq7KKebwswSKKBLBQdA1kepmufaJo6g6h0Zw3KMvac9Fs7FgqNGNymNfR WCc1BewtUw2K1cTBjojD8gL9QPdPpzQuvSwyeJ2tgU6BDKbhrMZXQZHFzy002LQ1VNUJHqqBKpvE A41H7Yk6ZFI5S/t4GilWbommgMM8bqKgnj0H3yC79h3ts/oruWKqkp4dudi4zrrsTHRTeGfb2WxG bpKxfuUs08dBXUOqoha2meNSqkN7egoykj4hjoaWUha2YaakCo8urC+2+3qPIfNj49fHHGbXy2ay e7tj7umy+4Nx7ZqH2NtTr/NS01TU742xPRiHEZXs3M7nWHFY2OexoaWOoqZNbVMdjBVR0TX0Hr29 ngm06qVrX/V8+rBup9k4Ham6dqL3g2O33hsLXbrEmCy1RTy7fhGOYSYHJ5NKtkgeXCRU+thq0l7k jSPbphgoeFf9VeiK43G9mcGNyOFKdEF+WOY67+fnUvy17LyfZu3+teivj1uGv21srNbaigqqLdmb xNDH9olAsSpS1NVuLcl6OBI2dVBL8hT7ILy1+NdXb1LPJ2+T2i26FCzMfXrXQ+XG+aLYfwo6c65y dJumfcY3FS1rfwx6U7D2xtydJ64UtYw82UzO/czXsEnX9qkpo1JUyMRYjBELBHrTV5enUs/XS3Cm VKAacA8a+f5dFN/uhFl/jFnt3VNPU1yUOCZ5chWxin23thclUmIUcVdLKBX5qUqCsEKNKrH1W9mV uikEla56jnmO/kkk0V6qdwWGlGYrIYJ5ainEbyK0cbt5YVDF1kXSFjQEG5J9rfFZV0gkdRi9oJLh pGX4j6evQ09ZS0OFzBysMg0QiX7qWEh51KJzE0P6fX/jwffoy7OCRx8+q3kUcMThWXoNe30fKy1e VqFkE1TV+eEuIw3gYMukxx2EYC2uAfz7NFFCvr1H1+1dS0wD0A2NGqQQEB0aRTI3CoFvyB/a1Ae3 XJ0rXoqU0atK9Gio8HAMfjXcSU0BoyIpLCPU8SeYh09Qs97KfyfbVfTp2SVXHaPt6S+XdY6GUhVX 9hyJV1akc3ABHNvr9D9Tb3rNccOmlEmoFRjpCbYxTZPM09RPMyUrVA8zwyEVAWPkt6QCOPweLe3F rUAdGtqrakrx6se+G+V29T927PweWjrK/bu594YrZuYqJUk80eK3BVR493Up6wIpJRduQFuSPazg ooTXoWodMXnw62Ed2xYvaW0Ozejuxus6Hb2BGf2tjKStyOSVo6bG0+ZlbbeYxFdB4nqcbmlhjqNU cglVxYj6j3XVIrEN8PRNdF3IYsT0dyo2/Jt3Ze2KqvqKrIUlbhy6z0TRzxiGJVswZwTNNKApKqbl Sb/X3SRioq3l0TtUtQjoG98byxVDtyoyuWyUVDhsNi6jI1EwqvBFJFToxWExSp9wHqGBVE+hbgD2 mNZKVPSlLbtyxB6rw2n8tI49z1G8oEXFwTsaPH0YYGuGOWRkiiEhGuleVRqKCygm/wDUe6pCNenU K9I7mN0HE+vVhnQ3YtB33g8lHV1iUO5Y6oU1S9XJFFPHSMpNHWVJRVT7aoFkeQMB5Prb2pkfQuni B0khJLU6MNtfFVMFbDVVNNTrkdu038Kr6jyALWpFUs/mrCFMpUwi0UjckD8j2WlmJxWnSrFM0p0K 9BXmjz+SjoIDJSVeOpqnQLLrjkYaV0tex1D0sQeD7VqGKEHpvtf59GEWs+6w8TRvLHFrp45HLMt4 ICgeJSxu7zIbAWtx9PbBqKEfs6dWOq46W1VSxVNFGtaxjx80TtVEy2FLSRxFw7FR6PGLNdfULe6s usdOxKySCg+fRcN81KVEOOlg8OThgjKQT42Dy0lS1QFaOVnjJLeRACdX6dQJ+vttLdhVqdHkNw66 adIH+H06xxxSOFq5Elilp4AzQ066WZoTUKQWkUEWX8e7OWSgZhTowjfxK9p6R1XPJSvKhlnZmj8c CeJH8kq2BaSSZfoqfS4sD9PaqFkYdzV6LruBxVlUgdJWsxlLWXWCulx1W8bgSU7ssLzxBmKkN+3U cn1BgQL8fT2oaKNqHTT7P8/RcsrqeNft6rx+QXwh+M/dslQ+/ep8Xg9zSRTR0fYHXcdNsvcEE81S tVV1VTBjKWTbWXqKyZbzPW4+eZtbFXVm1CrRyKOwY+fTUsVpckiaILJ6rj+XDqg35Ifyme3+vJa/ P9R5uHtjbceurTH1MUWC3xSpF9uzUwxBlnx2al1vK6fZVEn7Md3CuQnuivRtLih/l+3oun22SPML h0p+f7Oqsc3iM5tnc1Tjc5iK/EZenmqIKrH5OiqaCpglKNFIWgqY45gFdW+q2493GUIr0WkFS2oU PTVh9TVs44LzU7pcNbl2Umy8hhcfT8e7H4R6V6r+E9ZYrLLKXqKenCQ3KyvpeqgR9UkKSG5EkoXT Ye6gfKvXiOnzKZ6mlojS0UBJ/bkaeOGOGOCV3GhLx6r+MAAsxBPvQBx14L5nqTR0L5zDUlElZj6G Va+d/ucg0lPSySxswiWSoRHEbztN+uT0C31HvYoOPCnVjVakLXqPTUi0AGOqHonrYquqWV6OtirG EbKiF9dOXR0VlOm3PPtuQGtaYp1eJw3CvD06eoaxGTxNqgTmMTxqkyGJUMbEIxGkTSEar/0uOPdP t6c+fSWziyRS1CtoeN6eA6o1KqpjOldNyQrPzf8Ar7unl9vWm+H5dOdOktNSU06Ql1ajXkaVIV00 FomuQ5ufp9Tb3pvjb7etj4R0xZZ9VNpVdCtICBcFrop0sbW06j9Pz7cj+IHqrnt6UlNY0MWtVnRK FGVpHLlZLD1CQ/uIQxPBuvttj3HHn1ZfhHXAU9NO4hSSFquGylTpjmDOAVaByfHICCfobn3sE8fL rdAT8+sumroC0dmnidGEtLVRaY2QMpBCTL45Bq5LHk/T37B+3r3cvn5dQ1psXLL54YpMZUMhSaKC 0lK6tdb/AG0jeWPUik+gnn6Ae71elCajqtF8sHpkyVDUU+RbIPAZ8e1R5fND+7H478LMEIaFrLyr WI9uI40aK0fqrg6tVO3HTxi6iSSBStSsjyucg0UcqhhVmou8djyJHhcix4GkEe22ABpTAx+XXga6 j59OWUq2mq5HkJKpiKooCB5W4l8fruV1NCSG+mm3uoFFb7R1deK46YNpABchK0hiCfbFWCgkyAy6 VseSo1XI/p7dmzpFOm0OT0vJ1rIqKUH90kzgyoVN1ZoVAZbFQFsStvw3PtPg06crQkefTHTxoaww zLbXUUNWrLZREKnGSpfQObpLRrze+r/X9uVwD9o/mD/l60PxCnmD/h6Zcw96Shcx6TUvkJW4JZ5T UCG+kgBSCC1/qx9vReY+zpLP8aGnkf8AD/sdNsxES0/iYeuCVJWOrkPoCJrPq1PcFiPx7d6Z8j9v XRc01Ixj1GoqmeCEAeqz6TUy2ub6YyEF/wAsfejk08utqM1PAf6h13TxRUckRUCXRFE0muNdN3Ys wJLXLFANPB/P9fejnHWiS1Sen4yRokxA0FpFhCKrN5VIsCSLinDE2DH3odN0Jp/q/wCL6ipJMFC0 8Tw62aUPLLGqKAQ2hUBswT6J7950r1YgcW64RyMUqmeMESUVeaeTVfyyzLHTTDUBZSAxNjYG/Hup FWXOcf4a9KIzpjdv9XkOk/K7OkgBCxBVbS/Ivo/1K3OsgAf7D271RcEfb03Uv+eAIdgfqqFwSAQS P2wX+g/HvXTr1pjr/9XQShLFJVX6emQXvq1D0r6weFsST72fI9MD+dOscoOpmt/qdNgCLAfQW/Bt 795U6t1EkBBX6cqCLf7Ef7e49+PTi8OsfvXW+ve/de6kiaSRQjs8mhSIwxLeMMQX03Nxew97Hn02 ygZGOs1PcSAeoawV4F9R0+kWA5+vvx4HquKrnz6lJ5Ap9TDVHcox/oAFP5sxcAgj6291JHW+p+Mp ZK2eeKOcwqYRKwDtGrjU0YZmWzEAvyB9b+6udIrTNeroK4+XXLL4tcZUUzI8kkshZn8x1RIVICxx u/re/wDU/QH/AGPvyNqrUdaaooOvVDwSIFp6aoinnC/cGRg9MB/xyRHAOrUbhh9Dx70OOSKfz69/ hPSfqEaOVw2o3BUs5uSwAvz/AFU24/p7vXFR1YCvSkw1fTYxUqJoVkmng00000aSwU4ieZZlKFSR NI8a6W/Ab22wZqgcP8PWzQH59eyOTpK6FooIpnkqZRUMZvGhjYszSrqUXkdm+jCwt72qFSCSKDqh Iz69JurklldGlKkrDFEulQto4l0IGCgDUFXk/n25QCtPXqwNQOudECzTLq0gw6jx+UkQjkAlbX+v vR8vt68eB6Wm369aKGvVozKyTQVKISFWS0bUrRB7gCQyMpA5ut/bEi1KkfZ1dCACPTqbWUNFQ477 esirJKmbyVEs8MKSfY1gDrHT6UcOaYyyn+v0v7oCSe2n+frxoOPUOapkxZo6Rqz9ieiE+uQFTj6v x/5RShgjSPELgICbgm3u1A2o0yP5jqoqAOkvXrV1cBycqSGmeUU9PMQNBEQ9agA3Ugn+lifbi0Vg g+Lz63k58umynOmVGsD61FjexF+fzxx7u3A9UbpS4ylpq2SQTM/hjWmkaDUyNUyGpEGlJNLhGANz wL/S4+vtk1WnVgOP+rz6U82Exqz6ZII1gmxWRZY3fVMtTRfvL4rkvDL9u5BU3J0X911Eefp1cAY6 csBi6eiw0clStRLLUQNWulPaU1GseiJrkJJGYZFHN7P9PofenNWPoMdeA7fn1ix0ePqM1kcjRoY0 iSKmjhKjQlZNI/nnWQEF4VSM6iBZiSBx79nSAetEZPSI3TXQVtZppjeKmLrcMzKzytqYKWJ9K2/3 m349uxihPz60f59J+pSQMHeN01BQS0ZjBdVAawPH1HtxfTqiniK9Rvdurde9+691737r3XvfuvdC LsPadTumqSknL02NMgP3lhqD3GuKEH9QcCxb6IeeTx7qy/i6oVJNRx6tK6D66xeIhpKbHUopohIr zsq6pqtmNvLNK/rncWFtX0tx7rTyHDpTElDWnVz3RWMpcClJMkMX3CKoijKlxOSlmgl44TSdV+dJ H4v734dOI6XKhbjWnVmnVu3q6vq6KtlLLKDq8USM1NHE7XC3cBH0WFhfj6e3AwQUAx08xVFqo/b0 e7D49KHGxzR0jyRTVFMlQkg1zTv+kRoAWaJXuRpuASfbbLqPDPWradlYVeor0JmNgMUs32mO8TVl 6eOOTxxvQReL0ykOQGVSbuoN/wAD2naAEZ6EdvfLRQT1GeCaBGIc1Bx7a0hA8DSTxhrNLEvIp5JC CRckD2nlEMYycjozieSTIyD0iM3kCmSWerqBGlVTlVjQxsqVYFvEHW7lGZeGt6vp7LGuU1UTj0+1 sGUinQY5mWFagJHU6nEX3C08wRYVkqCbeIelrXQ2X8XJ971uc9JDFoJXR0WHtJqqOno4vDV0sl53 8Ma2Rpon/bnUG2kSx/Vb3I59+V2+GvS6GZV0hjn19Pl0W7d8M0VDTVtBLEazGU8s0lPTsWkqaWVf WrRkDWwINgeR72wB49beZSaHh0S/ccsNevYOOp8YJMfvXB/Y5fGxoXkp8vQOtZgc5SBvRBlsXWor LLpJeLUhNj79EwQ0r1Y3TJGND0qadXA0HyZqN3fFnqDsulGPTfWE3R1zicpHJH+/Q57atauH3JSU tSYxVvRx1+PEojJAZGQkH2aWxDDSvHpBeeJJRic06up2N05tD5QDKbDzkMVDicph2ztVqqJoclk4 aqmiGap3mpzrpaXItVGKRF9QiY/19mTWumMNXuPQcuNw+lkQaagnomH8zT4UQ7b+D2/sPsObC4Ha Wwt57LpcVtjauGpNu7cqafFSU2EgwuIwtEqw1mabKVl1qp2d7RuzHU3stkgkGuoqvr/sdDzYuZra LwUaOklK06pJ/mJfGLYGxPgD0DuGfF5iLJ1/bf8AAE3lVVaU+HyFdj9sVdRksZJiipqK6SorXaKm nlI0NA+i/HspeyDB2KYqf+L6kzbeYWuJvABBogwONCTTPp8uq8PmD1h/oW+G/T22N2THag3nuSn3 lFt54kjGagqMHT1lBl6hozeCgbzginezPIuo+2g6wR0BNcdK7yxivrjXJSnVQc85zO2K6i2pQNLT LE1HV5WnoliqJqmXTIqBo1utGgTUTcekEn29Frlpnt6CG8xWVmrBT359Oi24Nq3C5aspHqNM7u8F QSf2Q4IVxq+jSEKAD/X2aJEFWnn1E25XE0zSAPVPt6U+76eTI4aSqMMuhY4afTDeSRZEBKrp/si4 /P1v7tQ9Bp45CR3Vr/LoHaCCCmsxpWmqpplVGN0WAiygSpYg62H492pWlT1sQD8Rz0bHbuH3Dl9u wo+EZw3jcVIZh44kj0yiNCoDhieLci3vRHV/BSowelBt7qnE5Ckrqv71qmrp0aRqB7EtECFN9RBL IeSB72orSo6NrS1SRQKft6bMPsekxmQInijSQTeIRxCJSqamN7MNLalX68kWP9fd3DL8I6PbfbAp DHh0P3xwxdfifkn1LVUU8URl7a2FXoiwx1UUVPQ5+gqJXlpZbwzxCCEmSNvS6XBte/vcc7NVWXpZ cRNHE9G49beGzazqLvXIybQ+Qm2/4vtzC7tyOQkq0imwThcXkMhPh6qjlCs8eNpp51aKFiYwrgLw PauRMAo3d/q49BaRn1tU9Arm974SvJptsbqaHauF3Rl9tUNHVVOmaigxj66hgpJF4IAgJ4DLY8ah 7Qzs5B1NnqyQhs6eqs+3u3j21X7jxeAxuaxm1cNuCfD42bIwzU8u+BiJisufWnm0LHinqw/24+ki AN9D7YRXw2rB6UMAigl89FJz+EnTzV+LeKI086rNTlAsbvq9aLY/5xWP1HA49uFiPLopnbWSfLo7 nwv7TpsPuM4WrqGjrVoKgEE6I66la/loJpDYs0RGpSeCOfr789y3n6dJlRa9q56uM2dvSnzePrcn NQ1J+4pFoacwBWmytLD6UeYfR5qVyUDHkp7YFwGOF686dhJbowmzqKmydVUSkS6WgpHJpX8k/ihC /sqwDCN1ZbFOB/T2oWTFadvTUS/Ea+fQySxQ1VVjvDUPS0cNWsckJIkSZlTSYhbhmUC4/oDzyT7o 2knAx0rVgKAHPSuqauR1hhZo0QVvhEJceVoYkU69IuvikW4Kn6+/KQMDpSkmmlU/PpJ5mgiop5/s sJRpToVlSkxTpHNVCZYyK6SKbTHGYXujxp9UQEfX36SQrkUr0YQMvBugm3Vjp5K2Cqp/2Yyoqykc AASo/wA3Kk9rC0l+frbj6e0bPr/FTo6QAKCPToOdxTPDS0Mxx0VRSU8VR/uVhiVvt5owVFLU0rkF 0qGHL3sv9fe0iYEMDivTjzrhGXNOkVSRPlqqgYLSBpNTNHC6qYpvVJHFoF1CxlA1/q30Ps1jXINa 9Ek4WStEFelnvHCY6DBFchiYzK8LNIfGiEmNDJrQj6lSOT+R7fZCAO7PRXJCMVww6J/WptXcQNJX Jpp9Et1hbxGKVWbxNE3646qOQgrbhrW90ZARpYjV00BIhoPh6IJ8jvj/ANS9syZTA7+2vTZ+rpYV ix+73p2x24KUNCwWXG5yKJa2T7e9nRi0ZtyPbYtnX4Djqlx4ci0lUV61RtzYHFbW3/2BgaOZft9r 7yzmDxgqHZqiXH4zL5PHJIzWs8qRU6F72Jvx7uyOoBIOOiKQULKPXpgwogqZqx5kj8EEVPIfMoPk cz6tCBh/uzTaw/HtvAAJ49aIJp69ZJ6SJq2Z5ZBTUT00dasAB+3kKStH4WiRVWVUBFgP6+61pw41 6v8AKvl0oMVTLPCRQTt5omkaWhl9UwUlnV0iYkSLoYAqOV/p78COBPXjjyx0mjjTWmbQiRz0rvpe DTBUXaWQKQQFSTRoIN7Efg+9BmHDh6dOkrRdXHrOFyWKETZGm81NAzMaynvKlr6V+6jXhkLsBqH5 45PvZQN8OD6dU1UOTj16i5R2qMZJUcSKZI2jcAhDEPKhGoWBt9PrwePe0FGAI6sSKD8+lHTVlO2J gpfQWEESRxyi9idIjKaeSwVyb/S/tpgdR+3qwGB0jcmOfER+29SqXDEteNljKn+oKG4t7dj4g/Lq r8OlbPRrNA6QTrDTuyrGHI9MiDUEYcaVbTc/jn2zWh+fVwKgjptqVMKOHjeNmjlfhdKRjSVLIQx9 Nl4N/r7uucA9bOMdR8HU18tNIKrVkMekqQJFUs8jQsVBJpJiS8DAMBb9J/p7clC6hTDf6uPTUbMV IJqOnaXHRzWFKXLFrrTyOfu9JuzhJBpSXSLgWINvx7oHpx6uQDw68q5CFtULHUG1NTyAcgPpdZIG 5YhABpP1PPvZ0kZGOvUOaHqNLSYmtIfxS4rJJoPnpbBRKqFiZKb9uKQuzAnxsrfix97DOMA1X59a ojcRQ9ZJ6PIRY+qkkkjrEShqUFXTMWkkkkYoqS0rRpUQnS4W+m3BN/eqqSBSmRjrYBGQfI9JvA1i UyVUDuI3nkhFndUJ8ZPpUt+l9R+vt6QVC06aXBJPp/n6Wc1VK1PBTU8pm80o/wAokA1IkAMrjQlk dZDdSf1c/X2xQDJ4Dq3E9Nxqnq8pHUQqY1+wcOAR4isEoaGVASbhiCRf88fn3YABGB9evD4hTpsy yhI8SkcrtE9MZI2Yqzss9ZI6/wBo8sFJvxybW9vR17iRmv8Ak6TzU1/7T/CT02uJJp4kuTeUqPoE CtcKzN9Aq+JifwAPbnTPkfXrLTNHPWea4FNSqKemJPBCMbyszcapWJc/nn3rNOHHrz4XT58T13JU RpM30YGZGLsCsQaKO2lWtcpYf64uPes9eAJAp04PXqrFIPHIkjMCY2uNbg2vwxN7EgW4Pv2emwpy T1HjjyFS5Y0pUhTFedxTqhRi4JZ7NwpFyAL+/H7er4A4464RK4WpSZ4w9TdSLuTHpk8vkW6+NkcC wAOo8e/EdwI8urh9KFAP9VR1HyEeNpqYiE1FVUTyLpaXRAkdlHkb7aLU7SN+kam/xtf3418uHW46 ls0oOoOOkmpK0vFfXCrnVGAti6aGB1lXC2Yg25/p79T59OSZTr//1tBOmIWSzfR42HOoFbg8gXAv /T8e9tw6YHHrzRl0Fjzo41XXhSQef034966sOoMv9ngCwI+liTfkn+ov72err59Yfeurde9+691k jNmA4sSLki5Fv6f4+9jqjjB6lxHTNCylks6WdvoObGw5uADb3s5r02DSvDpwKqDKLtYuy2HB0+Qh FFwbWBuPbY8vs6t1OwMJqMilMrgGehqQ/BPEK+ZVIH9DH7rLhCacDXq8QBYA+eOsMs9blJI4ypcq yQQIoYsza9CMzEsF+vJ4Fve1CrT1PXmqSaDHQgUO36aNfDkXgyE0iSwOIZHkSiLKqxeMLwJV5YsT cH6e2WYn4cdWC0weg9ylA8EVWCCZMfWrFKVKsumTXC0jaf0l5IV5/tX9uo1afMdaAoT1Eoz91TxU SKXnSqleNAP1JMkScsRZUjZCT/r+98DqrinWpM9KjFY001PnYKmnU1+haCAPZ/CJIZKl5I7D1Cay 2I/A90kfVooe3j15RT7ekPU30U4K20o63Nrn9xm5P1412559vYqSD1teHXqM/vWvbVHKp/2q8bEL 9R9SB/sfejw68elPiIymRhRlEq+Wnkkpfo8rRkykITqsYyt29tOe3/L1pTRuldmqyalTzQ0bfbtJ ElVO4Z3Cawx4JDLO7HSPqAPbKgE0rnpxvXpAyRS10sxjSpmES1FZO0uotody0r+NiQpVUA/qbe3q hRkj06boSadPMsNT/dTSixiIA11RqI+4Anq1jgVUdrRweNAfSvqP5+vumPFH2/5OnBwx0i4iVKta 4WRDzYi4+nB+v+PtQc46ab+dOlbichDjaqd6oSeJ6Z4VSAqGZ1qI5dWkG4DGI/T+v+PtgioAHr/q /wAPVwaGp9OptZmKnLSUNFQUoWQyN9o5XTNLPUU7xVIfWAHQiU3YkW0391C8a9WJwKdQcxiclt+o paOorZJKVgtRC8MksKkoVSoSFWa6+Ing/pI5Hu1VJJ056rkAZx13VGnFHDpmqIpUlMNPArllMSGP VGxhPkfQj3u39fT70K6uvdRq2rx8tPTY2lpYjJFUU6NkYgVjmRXYO6o6rI3lke5v9BYe7KDXUcfL z68xorfZ06VVOlWkkEirzrKy3b9phcoQLAWUnn+o93HEEdJFJBB6QkkbwyPFIpV42KMp/DKbH24M 56VAggEcOuHv3W+lFtPae4d87jxG09qYqrze4c7WR0OMxlFE0tRU1Ep+gVQdMcaAs7myoiliQAff uvdGR7I2xsPrHY0PXOKhhznaKZSLJb33epWWhpDBGVTbWAksQtBRs7eWUeqplu3CBAN6SDXy6dKA KDTJHSs6YwP3OMxtRVRswlgp3AIJd7opuG4+oP8AsfeuvIAadWx9J4CkjWiaSnUQhV/asQLgjljf lQfejgVPDpVGpPl1aT1FhqevqYKakjAH7QMjExx6ywVgsjByQo+ukXPuuo0wuOlgCopJPVonXWFh o6CGOCriSRqdUZ5V8saNHJoZ1UBSBIiCwNi1uPyPdqZzw6QTzKxIrjox2IzNTPMKGikgXh1hrKrx UtG8ej94xXdzHUuUsqk3H+H5tXpOshGR0MlDTQY7FBa6dZa/LNCszu2lWRhw1HM7GRFEj2YkAs1/ z705XSQ3RtZrI9CK0HSM3HVLhggLtI9G2kR2IN2KhQupQJgUYnUSfpa1x7JbqDJp0N7AnQK8egRy lbkqnJCCmeGmdHkmSoDayVnLNJDDGInEKMeCTyCSbeyfwdLnOejoBaV8ug2zDVpqHrIfto0gppF8 KzS1BR0e8lwNLlr8qQ2qxPFvquRqdJZYkfAwekHvjz5vEPkqZv8AK8esZeyuV86xETzMrEKNcN/S ALfX24NJANBXormj8NiAfPogu/spUY3TkcXMqRSoytH6/wDK0ST1EPIztGsWosPSvH9femCgfPrc Sh/ibh0U/dW78cKuGpFXSjKjzS1KQ1hE9NDYiOLxRIGkWQ8rruDc+9IFrQjosvZPBJKtgDrN1R3h l9m0W8tvVxbJ7B3NX1FXuelp2lqMvt6orKOjij3xgaRptJOLmxtL/EEiQSGFfMoZg4c7sUjEgqoG OkJvpJQI9R9Otjror5z0HU/cHwn7Irqmhz/Svauzc50ZvrNYLKfdx7X3DkKakqcLuqhjREkzLDIU qRVaJCJI4pSQCwt7ELRCaMaGFK1Hzp5dUbaLy9ZPDWr0qPKv29L754d+5DuXdPwi6G2jNm6/YPyB 3zv/ALuzuMxyQ0c8+x8TJnMX1oM0z6J6HAVeYpXqZm0NMxZDcFb+yfctUBIUg1zjoW7ZtcUTz+Oo DR0U/bQHB+VafaOtZ/8Ambdt9j9w/PPqv4jVeV3VkNi7Cm65wGe2TjF3HR4LZ7sz1W68lSYusjps fmNy1lFZZszFBNE0DhI6h3LqCzQ7rUilc9GI3eK1naO2PcAFqD0VX+cjuhKjN7FwVXkKyvzNLjXy tTrMiUWOxLiOl2/g6GnM0sFPFjsfTrFZBf0+slibF09vAtG+fQqsdzvLhHP4aenVWdVuqWLYVNR4 OuFDRVeGCZJaN2i11MauXRyFLC+o6rmxBsf6e1ltQgADtp0Ad/uma5KlqtXoDttUSZzclBjqmVRT yVMfmdvWLMygmSS6+lr/AFv6Pa2gIp8uguxDVHl1YRu3rbE7d2K9HDDTrkanGeR2RItEqmJJaced yRJEATz9f9v7ppqaA8Omxbx/E3VZ2cyiUe50o2pEiiSqg1PGFaNruEZhYhf1fSxA96A4muOkz6El AAx1arS0+Jx/T2HahqYDlhFTSRtDGEJeYG1IGuQJnUhmKi1za/uw0H16UhI3FQMdF9w1Tk4c8ftE kWRpGWpjhhWRJVkurxs1lVDHe5ve593AApnpTbERyKPLpuz9S+K/jNQ9NLHPSQyyh3bzNEDJZWKE 2iVlY2P4HujzEErTJ4Z6G1nPD4SlmwOPQ1fDTcz5juTZeeoIqetr8R99UxpLG0wj8FLPFLMILFjU QxSsUK2INj7upJUEgDos3S6i0sI2B62T033Q4r49bg3aF1PR44LUqaYmN9dRGIwqraaOT0lpCCAR cn2muLmRdQXoP2sYkloVrnoiOEmq6bbeNpFmjFVUQZ3c1UkRGipr94ZX7iqqnCySOTHhqOFFf8q4 N+Le2IvFkqzEU6Mb1lhi0Kor/k6Ldns1VY3K1viEc1L5PNTMdaoo8hVoQ0jm6vb6f7x7UqAMYr0F 3kLE1Pn011kcGQeoyFGkcTy+WpXH/pSaKOEB3RSG8c6OTYAm9rj3U19OtAqw49MG3I59uZqh3ZQy eCalphXEI5iESFgrw1AZR+8/09X+297UA8R0wY6OWWQgjq5LpHf8e8NsUNbjKuWheRadZKdFWQ01 ShQzSNKyLJGsiCwCaQwP0B91MSAE+dequkjfjJHVjvXuYFLhpDSSB5vDEjTNGXnTxB2qFZy6yMAz cMfqD9D71UGo6skTKc8OhTx1SgEEgqg4+4/ycBlSQySR6pnEasmhnh0sgv6uL2960eYPSxBGKasH 7OlzTU9RWIan7lJp6YpPJKV0O0bK0ZOkEBJYwbN9QfeljFOPShZIiQv+fqTvTGT7k2fJFhMg2PzD UVTBSz6Y0jp5liYQKSY2KqCQ7MCv0tf8hzw04U6vgGo6J9k8vltsYiKi3HX1OUzGMp46TK1MC1NP TVkzRSMMnTUSVFfMlPKBpULI+oqxuPp7p4Efpnp9Ll0/0vTHHLFnsVLJeoUhoKiaGGomgifQv7aV 1NJHqEMt7kiwYfS3t+O1IpRu3rZu2Zq0z1A2XFDjc607im8TMIIjCHqGp5pnH7DR1Cw+NiHbSRe6 kn+p9mMKBdKk8OtNcKtK9DRvKv2tXYvH455xOaOR13FT4x1+6oPLESVkgnlMkE0gbVpccIeOCPfp QWFQM16SySeJU46r43xjI8CM9U7Yj+6qqNJcjjUeKxqKWGQPKqwxgnyJCr6eDdhz7SnWGNDjqqld OegRx+Qbc0EaVg80VP5a6neZCpSeZCJUvMLWU3uGNuLfn2qiV6VJ6R3AQiladaYneQ0d29wBbcdq dgKNI0rYbty44UE2H9B7271BVj0RNxcfb0HlJUSU0iyRGxDhWA5uh/ULf4j2kZSTw6VwoppqGKdL kUWFzYvT5SekyMUcgSiqkLUrNIPUqyRsJUBf6W4H9Pe9ApQHPSmSzjOYpfnnpKT0tRRyxxxy2rIw ZTURNLE4lQgrpm1EM8duGBBP+t7qcHI7ekDxtGdLDPT9islTtUSJnmkpJqpAqZWJNULys+vyZGJD cq1/86gJH1Knk+9aRUlP2dVLHSBTh0qJI6mhaFtMNXAVEsM0TiZJVDAtJHceCaJhY2/3j3XjTrQO D1Gq8XSZah+zhrY8SnMsZlh10LyszSFaloQZaRHdy2tUZVJ5AHuwNCCetZAGkV6TEz1GJqkxGUji hqqVURXSWKaneNkV6eeCphZkkjkRgVINuf6+6shNXXI6urggVB6b8s7CemLMQRIrtawYsrLaQcXI bT+fe0HH7Otv5dPkKNVzCNxInmRpgFFriPTpYAa7vJyR7b4fl1f/AAdcMygpQYtZeN6TU7MS2rXq SIED9PqI5+hPuyZx51602AfTrrbVLPJSCUeqATTyMgkKAOPHGG/K3sv5vz73MQGoONOqx4X5dPVc GSRHlRQkZAjCG7WETguVHI1LJb6/09tr59OefSaweWyEtW9E0hq6ciUqKpA7RRrf1fdMGmh0ILjk +ri3tQ6qFDUo3TauQdI+GvSnmp4aiMiNppGAWQ08wWQAx2v4al/FGZFvwDpNwefbINDx6c49Q3hr KYokc0kK6SdE8ZJa2osEk13bUb2KMy8H3aoNajrWR1zlq5Wh0VeKpquW2iN3ijDx62B1PWIqSqnP 5Om5t72AAaq5HVWAZaSRgjqOuOxM6RinrshjHFw5UCeGOpvZo1g80Y0NyTa/A921nOpAemxEQQUk I+R/z8euP2tRSJJHNU0csT0jGmqqMNGHjpnXyR1Mcqq9NKTpsCNJW9iR7rUHgDx4H/J04AR8XHpn zIXy45Na6koKWMBAAqkw6xoK21BXmBv/AE+nt+PgftPSWU/qN5igH8q9RvtZqhqhY5qeIKkUUsk0 pHomBDSRxKrPIQWZWIHANvdjjpoEAio65DG4+nCLNkZp0sZFWkgMaSOtwhEk7KAlgbm2r36tfLrZ ZiSdIqfU9ZVbGx3c05n1atJfWZEAYclGYxBfpzyT79nqvcaZp1wNZPcvRxU6xh1jMapFEwBX1GZV VQoA/N+T79TrYFB3E164sayfW0shQEWJkkSRRI5/TdXDEFT+b8+/CnXhpHDrEtK0o5Z24UGzOiM1 iCC7hUEd1/rf+nHv1QOvVzgdNtYII3pSukggtIEOr0q+gE+oKzHS3559+rXp6MGjV6wRVfhlmkWJ JPITpEpchRq1C4VlLH/Y29+6sUqFFcDr/9fQPjMYmTSbR+SwYkv6G9IubIePzwD7t5dMZ4kZ6zgF BMC2rTJaxHDtc2KA3FgvPPuvEDq3n1CnUWuALcHUSNRvxwF9Nr/09+6spFcdRffur9e9+691zT9Q 4B+v1NgODz9R9Pex1VuHUhfqCdRCkG1xccg3A+o/x976aPypU9OcoYOXYHXIWYKo+qnxvrUfj6H6 G3ug9PLqxrQH/Vw66pRM1TCkDmGaYiGJ42KTa50cfqNyAWNiAeb+/GlDXh1sEggjj0LEUOL29QCC Z46UuUllnkRhLUNZfIVMgvrBvwDYe0epnbGelRAUdRmr6PGiSX7qnpaRVk8cGhTlq53KukojVysM bX/U2om97Ae7ZbAFT/Lps4+Q6Q2XqkroqirWjmo2rFjX7eKVpIpZEIIlmk0qpNgX0/QsPbqDSaVH VK1Nem/a8Xly0UZfQXVkADaWcllJVf6kKpNvzb3eQ9vWyMdLjJVi0NdMZDNJ97SLDBHDCJJfuKVi lPI7H0pKEdrX/A/p7ZA1DHXhQHpA18b/AMOp5pIpFmNfWpM7FdKsUgYQlLBlkUAk/ix9vCmqgOKd bpg1Ga9NdHp+5h1XsXA4Fzc308cf2re7Hgfs6q2B0oqKqqaWooamlEclXTuqwJKhdZp6hNDxSJcG 7K55Jt6fbbAEMD8P+brS1B+denqojyVRU4yly9e1RBkK0sftgTpkNTpkpvI1lPjazAc8e2hpAYoM gf5OPVySSKnFenHIxUmIx81LSuP8udopZVkD1HjhjBllZhyQfGwKEj6+9AliCfLr1aDHSGho5axa gLqmkipJJ2eWVgsEFOoYILmzG7BVH0B+nt0sFNeAr+3qoFSOmZL/AI5II44t/T6H68+3T1punenj +5mp4XYxtMQFmRCZNTaWY6R9RpJ4/J9s8KkcOtjNOhYxdLjMNBLWJK8irC6SVtRH52hpzrm1wRaA ASGAYIPUR7aqSR05QUx0n9w5ajy9HCkEfjqEroTEK0rDVAXigUyEjTFTSpLqKA3VbEi3u4BBPp1T yA+fTVgIo1lrC5ilrI2MetPXHGEZowYyBpYMy3BX6rb34nA9OvDifXqLlMdTxmCWnVqeeesSKyXK qSzPqVCSQ0bAXtxz72hNaVx1p6BWPTXTpkappUWuZEhYh5HayakNja3qIH5P9Pbv+16YJRaVTPUf LUlTHK1RPNDVaiiNUQlQHYIBygVSNIFibc+9j06vG6ntAI6ao45JpEiiRpJZXWOONFLO7uQqoqi5 ZmJsAPdunejZbKyG6PjjSz5qlp6eg3durCTY2bMsFlrNvYrIx2qcdRsLtTVVZEQKllsxX9u9r32h GrPVlhldhQdvQJ5DL1GThr0yFR556mreuevcXlnLXJjY/qtf247Ky0XpRIjLGpY/Lo/HQmIjn23t kpqlMmNoW4QtoVo0ZmI5vptf2103GKhSerg+l9qRSU1G32cjx/sqYyjK9Q7OqiNXH6bFyQfx9fei AePDpYp0ivVi2zKf+CVsK0sMFBJQt9mVqaWVIWkMYlV4JG4mESjSSAQzHj3UtQj/AAdecl8A46O/ suskraSJJauZ5Jlhd5JYI4A2hQwWNVIKRDSNJ+pH192B1Vx0heIjBHRndv09Dl6ykpcWzlI6eOGt msq06LrWaqqpwLkVMqxmNAvP5PPu2FqWOB1uKOrhB0LLDG1GTgoonjW8VGlOrPJNPHFToZTCfKST E5t6z6gf8faOVv4T0LbCClAV4dILdqVkv+UTVMdVUwVDO80URRTChf7SIKTZAF0p/ixv7Rusxypx 0I4nhWnkOg5raIvoi0+KeZzrmjjJRHZiVRnvr1uTe4AU+0pt5CwqPPpYLiOh7ug2yJQTVNE4WneF j5S6+SaYaWSeqKAesqzhVt9D/X3UxlScdJ2nDHoFdwZRqePJ4yaojpjVKZ6RZXKh44/2w9RpJYM0 h4HP19+WuodNs0ciGoz0Q3fmLykQq6Wtllhq0E1bjZ6ZlniFOzlTE0JAYhL2AtyPb5EYWrA9JmTS tVqfl0TLL4vHwVVTXVlVQyZKlgq5aYw4+Zq+tlBMsFCwCiKSNpBwbjQhPvSvGKGnDomvbSZ9RCmt es2z8RtjJ5jE1GTSraPxR1lRjcXW/YZKavjEVVKBXOhiRJZNSCM8FBoP0PtSsoJopz0TmK6t3VmQ 6cdHFzmagxnX2D3Tt7bOVxmN637B252VR7ZRoo/IcBkaSPcMGNpoNdKiV2H8jeSGwmZb2v7faeWg VSdI6H2wblAlFnWjfPq1f4ZbGpewfkZme5N39t4nLVvTW3c71BsPr4iVc7hNk5yvOZxtUH0mKnwi x1jmJx6i0jAe1KkykBzXPHpVzFucUkCraxUYDj1x+Se88ZRNujf747b+Sz0GZrdo0u9o9s46BqDB 4pXqI8Hj89Up/EsjVY+GJ5ZyXCKP6e0d8+gAIMjz6AG3zSSXpZqnz/PrTX/mgbzrt6934/LVNbU1 xk2lh6HHwOyLTUOHpvK1HFS00VkihkDmTUfU7Pck+w6/jTTUI7R1L233TQ2LauFOim7fk2/juqKi WqQ1uYmar5GkQ08cckbQiRGJJZ+QbDkezmDVGgp1H+5SLJdyFh59AztmurYMxT1dOsZl++SeJAgA kRHDBNAH7kQHB/PtWjEqPXoqZlUmi06PV2buyrqutsRVZaomhkWFI6fyMI/P+yTURpToAxp6e3pY /iw967s+nSbx21HNB1V5lKw1eTnkhMjK8jCFpWOlIy7MTGT9Cri9vbqKAAX6K5mbWp1f8X0d/Z/Y uayGxsHQzRiUYiLwSsBeUx06AR1V+P7FgLn22aZoelMd1oHWXbGanosxUz6pUWo/dMkkl5FVjcMF VraefoObge9VrwPW0vDI5Ff29Iff+85ardeWx8TqtHXxRoFJKv4TTwMYpr8GSQrqI/De/BBUtSrd HMV1IFVddMdGu/l6baqKfeW6dw/5VTy4z7b+ByRMWDmpqB/EIpuCf3KVbA/T2ooaV0mnTLOXNC1c 9W+dvdlVmU6Xx239r1MFLW7w7MpYstRxTBKekwO2i02fppY7WP3q1AQEem/tO8ccla9L7aYQUJ49 F1y+86jFZ9ctjKiOOgrPHiZaNLmGKggiFLRUkS3JUwU8PJt9L+9hFQaUPSC9vXkYqOPQLbh3bT02 QlNXPopJKx4g015BFHUAoPEhsCsb8gfX3ULnj0WMuqnr0pNu1UdVBHDFJJJV0peaIlCI3Mdtag/U +ZCpA/p7fTwshwOkctUeqHj0N+KwcOYqKOJ8fGtLVxQ/fQqQTUo1rFAAQk0bmzKefetFaslCOrRz L+PjXo1HUVPkuv8AcNRDRqVxEv2syidm0PDYiQVUbWVHieyqVuTb3VQTjh0/qOmtcdW69F7p2hmT U0VTFK2RqriOFNarCamIKkTOfS0ZbkEc3+tvbUkJA7en4pRqHicOhZXC5Og3BLAKiKppKQxVqrEy CWRZ4ovUjsbKYkFnBFhp9px4gI6Ws9uwOc/Z0JqB7q6TNDAwDBdN1mQWJWZl/SV+gF+fa1ChTQTR v9Vei+oDA1qOlDJDVLD40RZIKxvEICoAIkWxYEMoUgMy2JFy3tO47u1ujWBNdABk9FW3viZtt5tt uZesapxhno8nRTPH446ajrGkMUBncCZEo5AVZD6Tq4uPd0OKEV6V/RknjjpIGqwwy0NJCkUDpUND VT0X7qT0MiaESqlYhZWJIKk/pB9vrcMKrxp8vLpua18Iahw6WFXHjcTDSrBTmnkrAzS5SWnaooJP t45I4IJgnqjn0htDL9SBf2oU6gG1Y6JbkNXHDoDtyTLSxQZHJ4yowmXyU9SH8NYJ5shFB6aHK5KW Hh5KmFQumTnStrcD3bXpWgbPXoUlByvb0DmeyCVTwyxSqtRNG5aoQWlKm4ZeAoRFYEn+vunirmte nXDaS3mOgvyNB9stMkNKkMUkkzx6dXjqUY3eSxX0Xf6qf9f26spUU4jovcfxHz60j++1K9690AgC 3bPYwsLWFt4ZjgW/A90OTXorOS329BYjhATfm9x/r/j3s56VRuArE8QOswdUUVSVeiqJ5iCkW/HD e/cOmTK+okcD1kOSm0BdaymTmTUvIIBtYn6H/W96NCMjHWxIzYfh1mpqiKVWgnAQEARO12C3uGW5 J0qR7ZZCMp1o6fLp4oM1V4KTQI1r8WWfzY2oL+EGTh5aWRSWpJiP0svFxyD70KNgnu9eqkeY6XVL PSZWCSqw1QapURXnoKkKlfjha5LqOKmFCP8AOoCP6296NVw3WgeAPSWykdLVyQmRASQY9ZGiUGB7 rYn1ICh+n0PvRJBqOnVoQQek9k4qhp1qkjaenjCu7JfUouf1L9Qv+NiOOfdk00IJox684JIPHp7p K6CeEPBIVki0EaWMUiOSFJZbkWiFyD9D7oylTnrwNfPp3zrKdtRTyBGaWSGKGV0CTeJJtD6Co/dO lL/ji593jxQfb0257j6U6k7XApsVSSf8CAyyzy0rMih7tIVseGKsSC1z6SvtqU1dunFHb1kz0sKL STUjCOOTzpKGvIlPKI0kQCVhaSNgeOLAHnn35BXV69bBOoDpDbZdUnqpnLgJEmoopZhqLtqCgEsQ wvax+ntRNwUdNrxNel6VE1L/AJI8cIh9UqcmN4CsbM8XBTyyszBvqAT/AI+03DJ6czwHTnH43SAJ TokdWWdBMoliEOuy+VbB2JH6Sunn3WtPPI6uQfXHUdko42eKaOqgVI1KT0kqVMKh3UO0sNQutVUX v6uFvY+7A/Prxzw6Z5sXIymamghrUZX1TULRO1w1lLU8bGcPY3vpN/8AW9uBvn1QqPIdNdpFgqNc kgQY6aSMSIL3bVGJZQbgNrBW1gQLXHHu9QT+fWhUV+zpvy8EyZcQyOC8dLBCTYWCRQ06xh14HPj+ o/Pt2P4BjpJIQXl8+6n7BT/Y6a/3HWV0LpGzEGxsVXytoQMbIq+s3Juefd/Tpv5Hr0VPPK0jRQSz Bk+siFANXCMjqAo0/lv9j+feqgde4ceuWingv9y0Ecinx2MvlcKGUljFGZCTb6XIufe69bGo0oDT rzZPHxKVjWsrGKFSXdaOP9QZb+LySyKo/BI5HuueriJjxpTpukylTJdFWKFXckiKO7+q4sHcu/AP FiPe6Dq4jUdOcwEZRpTJK6h5m1gkkOYgobUSoKG9wP6+6rmvWpABpAHTNWRuGVyp0BY49Rtp1FSx VOeUUkgH3bzPVkIpTrqnpPKFdiQjNoFrXLfQAFiBb3qvXmemAOv/0NAhCQAbi4/ABuLG4v8A48f7 b3bplhmnU9jrZmtqMoZk1C3qIGsrY/i3H+HutKdb49YViWWSOF2sGbRrspKEDgi1r8/X3vrVSKkD I65T4qeJ2WJknCwtUXVlRjEjFXYI7AsUtyBc+9dbWZSO4Uz02EEfUEfnkW4P0Pv3Tta8OvD6ji/I 4/r/AIe/daPA9SPoCp03+hB/USDyQf8AD3by6a+dOnhZdXjdf+OaAXC8SxKU/VcaQQTf8H3Q4J68 PhAPUZSUkgcEiTVCyyM5ujLLfUugtZQW45uLe98a9b6foaJ8pb73KSvIgeOPzGacRupssYjYWUyN e9vxyfbNdHwpTp+mumpvXqUuOFBUxzrTwTKpVGFYA8Jl9SMksZs3hOnjn6e9aiwIr1UrQjqduCoz kWOljr/sIqKoVVhjpKaGOKPwhVRad9RdXYNe3JIJ96QLqFK6uvGv5dBwkxhqEmp2kQwyrJCxIEi+ NtaklbDULe36Yz1vz6E+nkpazN63cSU0FJTxqSxMbT1wV9Yb/OaUSRArfW4t9L+0xqEPrX/B1vgR 9nSY3UVirshTiVZhLUUtWDERoil+3aGaJlUsokAAueDx7ciyoPpX8/PrzHuIPE9JWB/HNE5F9Dq1 v62N7f7H29023wnpRwxSNJIIw4lWO0IiupNSH9EgIJJMLckf2hx7bxQ9UJoVPqenCGhzTo1ZMUpY 8Mfu4qetcwxrNT6H0Rq4LSzTGPlfqb+6EopoBWvTgBPy65VtLV5KCpyUOPShhF3kiEjyVFSznXL4 kCenh/yLkce9CikLWv8Ak69xqeuVRi6jE0lNkypkUwGGvhBYAx1aMil76bLG7AMtragD71UMSv7O rUIofMdIUD+pt6rf77/D2o6qf8nT9h3CZDGSSs4QTqGKRmoYBxLHZYlILMbcAG/tpuD09OvLxHS0 bOyf5LAiQzVQnMLYl6VllVY1i8cbO0hFPG2u6uCSOQeB7aA8/L16vXFOuCUUNPSGv3DOtUKatq0p sfrRqRKhZAJXmJv55JyvCjjQP6W92rmijPVfI14dJmiqKZKuqkSSpp4HZpIVhbwqV/cHjkjUWDeo BR+FA9+NaAHj17AODjrrLzSWXTcM8izwm5LlTfSYxdrgIefoQRyPe045602a1GOmtIaqFFdJYUUg SKusOSzrwr3XTqb+h4B+vtyo6aJQmlCT1i8suicO50yIEkuA5POoWv8Ap9QB49+88deoKrQdLvZ0 tFtmSoymQpWfNGlVsKJk/aoPMAwyLKws1S0fEN/0AlvrazgyOlKA4YjrNuDeNbuR1FfI1R4RpDMx a+ni5v71TpQJivYT0jpKevLecxt9u3oR7Wjt/QH6Xt73+fVJpmcBT8NOrj/i5tZZtm7KqfE7+XA4 mdwi3JBpo2AXj9TseDcAe6lgOnYkqq9XY9NYalpkxkU71CK8aPFSCnjZopHUBl1xBA8fBsTq5P8A T3XVq6e8F+IGOj+7d2PSV7QVVTlJRHTw+SDy0plb7hP0UK2J1XsbCzW90JAOTnq4glP4cdDzQUiU j0kUdIsDVH28UaLAomCPpS8y2VIrREAAcnjm/u6HFSOPTckLVCnj0aSkNJtPG4fb1NHHFKaSTK1t WiKtWkk6j7GjPAk4YlypuAebfn2xcTqpIrjo423aWmOsjqZtqrpnywmqIWWadnCySSh62OGnFh5A hcrHVuSdJ5I+vsv8cNivQo+j8BaaTXrjmJRXfxSoacQxRyqkLiFELaJGjk9GlSFjTn1Ajjj2vidq Ubh0XSaQcdBtAJYqYZCORZ1hmqFqY5GW8YiexqWUglQy8c8j2qJjYKRx6bBP5dJDNU+Lr6yTK0Ty U8iwRxRrURjwvC0qtITMGLArIRpYXJHJ49lc0TNw4dOidVFCeii9pR1uPzGcqXoIExOOq1hpHJH3 lU1QqnUGIZAsUxNr8fTj8+2QhQHFelsKtIaDz6Kf2nmMXR0dG0uTkpq3LU8xpYZYIxFHLGbSR1mQ cFgoha94xYn/AB9p5KsSOlqwyRnIx0Q7e2epXpjDDClZNA0ml42MPjUX/wAzNdDKjfUAi9vwfaR4 XAJVurlQR3L0GOGqXNSDrkMdU6qI3mkgkepYnUJJWcgxgryQAFvx9fb0CupHiHot3ARBSSvl0drp 3dmOxVBJh6xmosChq6iUzyV+ZXGxCMz1dHTCqqJpp4agoVipxcktZRzb2cBlUVr0GY7gQ3GOFR0I +D7urPjx3Fi/kDQz5Kk693ptF9kZ2YUUiHEZMw+XaNfm6GR0khopJIxCXlAEBezC3tHJetF/pa9D KCOG/hRK1NOgp+VPyS3p3lt2j2/LLQ4fHGN1yWRoqgS4zHUMrirykGOoaUhZK3LEhWb9Emq5uAPf jN4w49Ff7vFlcGQKSlf8J6oD+Z+axuV3pBU4c1VTRPQUFNFWy3aRXoU8bAIDZIUtZQLhR+PdltnJ JJx0ZHc40g0kkD09Ogow2NOb2TJMk5hhpllaVYkJ8qBP3S5UgBnJ5vbiwHtUoIGnyp0TnwJnMjsK npM7DrMTidyU0mUopsnFTVkc+o3GiNTysaEeJv8AEW49+AYVAPb0nulhA7GrjoRuxeyG3XueajKJ Bijh5qGixzGyU5eMsj/T0ytpF7Ae7A/PHRI2ig0seifGKWOscPBKI45mTyqGKqysTpAa6gm3BNr3 +ntwsNNK56RuwLUAFfXo2fXMuMXbUhrvLOGlsKeAhCWsNCy2Kqqi5sDwT7bp5dNOhQ6T0tqfBotR HWtUig+7/RQyh/uCq8rrdnKqB9Rbgge9L2j5dehOlh51PQTbpxEOQ3lUvp8MFFSw1NWyWUswQ6WT +0NXjub/APE+7xutCR0IIYyAtePVw/wr2xtXC/HGDsdajVX7w3BmabQk0TVCf3ecUpjmVSJkMryB gtgD9eR7VS3FY9FOqTTBX1EY6UulaKtjkrJJJDUyNWQUcchqKeGhlkaRo2BsyVGu5kAAJJ+lvaVU EhAJ6QveF693SN3J9vWV02QjDxwxD9sKdStLe+mEhgsaIosSbWta/wDV1ogikg9IjM4YmuOi57kn hyGQk+/JKxPJDSiNQ8bSEkiWW1nuh+hI97SSPSAy9PoxbIOOhP2LUzBKGeSqlZof2YZ1YkFbIqBn NiJLLY6h+n3ZokkFUbHVJcgq3Do7PVtbj6qrxlVkl/bx88yCbyOlpJk8ckkkKER1MJADKGuVfkD2 0LdxUBcHpMCo4dHXwlDSVNE9cKmOaGhW0jCMtIq+QMC7i7M7FgyqLavoB79UIMnh0qjDacjp46z7 FMe96OXEZKomjhyEMNZGXETx6JhG/wBbFSjWJUEen254gZQKdaaNq6g3VxFK0VVhn3BQmB50xMUk 86qXnnhAs0Rj1epI2kYqTzpP9PbbRgn06crX7enWjzFNNSYREikCy09qq7KvCOAGW11C6Twf94Pv fhAAgZ6tnpWUteWlgjg0hGldUlmCTCSLTfUo+riORhY24+oI+vth4XHd0Y20hBoK9Ah3XjqGqwW6 Mkzy/wAWx9Bj6zG1LzeNZGgroYJcfqkEvlknWQ8XX0/Tnn21oYdoJ09HiXgCAUz0Tytra2GuWjjr As9HVU61kbwxtH4hZpRJLqDM2l7Cw4/Ht+KGtBTpFdXRao6M5icTJujDxCnqiAvgT7RgY4dCK7iM xKCZBMzfVzrJPJ9qHjoCAaHosMgDLqFanoBu0duZOogqp6mbIUKxJULJR00bxGCQxMaCeKSTSYvK y6XUg2HIPtPokJFWNelUbpprgjoruJ2nkMrBR1lbRy4qaxnnw0E7vBSfbDxOFlOhJTW8SsG5DMfb kcYPxE1HTM9CpKjrvdeUrtt0kiS41WoKKF6qWp0+RVpUjMs1XK5fxxxwICXPCoov7UBgoAp0UzVp U9aNfdeSocx3L23l8ZUwVmNyvZu/clj6umlWemqqGu3VlaqkqaeZCUmgnglVkYcMpBHu3RceJ6DL 37rXWA/U/wCuf979+6912n6h/sf96Pv3Xus3v3XupMNU8PFlkQ3BSQXHIsSp+qm3ujIG+3r3ThBH NTGOtx881PVQhZY3hfS/IOooy86fxpP1Fx7a1UOluHXqefSmhzlBnIYaXLpFQZEzxn78KEoKpWNp GqVUD7SYrwWHob829+Zf4OvKdJJPCnUN6aooJVdi3h8nJVg0Ohr2PlXWoQgixBsfdAQcdP0pnrjP j6OorqdoJJKWV6iDXNTojXhaRFmlWEMiPLGhuACoc8H6+7qxGDleqsAQSPi6fN3pJHioaSnlqa2K mqXc1CUggVqeITL91UwIHFGZDIhKg6QxIufdkABwMdJ6nBegY0/4rrDiamJ6amRUdvHSwpGYiR6l C/co72Kstvp9Of8AW9suDqY/Pp9eA6cM0EkxEkqRkiOoDshWwm8tJVFZIyAUGgRgMOP9b3ZeB+3r Q+P8j0wbSWFaHLzSsY3R6dYpEuGMjRyBIywVrRSMbNf+vu09SVp8/wDJ1WP/AFfz6fYKWSJ4tclo WVDKbfsmZQ+pV0kE3ZgHvxwDb6+2Sag9O0p04yRzUMqJTv50VSgEcp9DePS0OhreaNEYsB+Dz7rg 1r1cD04dQZq2GrvP4ZUEkeiQBgioyR+BDUCTT46dm5YAFz9QPdtJXFR1qoNDTPXB1SlpKbxWSt1K qeGS5DlQWUSKAPGsjcG/1t/T3sZY+nVPSvHqNK9RMs8tX6q1mjo1cBPI0M8i+JXMSgM0SsNdxck3 PtwUoKcP83XuODx/z9MOTcNlsj6w6mVoWL8ajHMzMDp9JuqH+n9PahMKo+Q6QudTOfVj/h6ZKuum pnMFMwRAXYsURpCxkazBmDGMAKNIH097+3q6ICKnpsnq6qqcvUVEszHgmSRm4/oATYDj6Dj37p0K q8B1wigmmNoonkN7elSQP9c2sP8AY+/deLAcT1NTFzlEllaOFHZlGptUnoLBiI1vexX6Egn3qvTZ lXgMnqccZDAiSmR5HQo7i2hTypsFK6goB/UTzf6e/V6p4hY0HA9ZK5zeQN/ahCglmsNbySXupsLW +n5v71GMV+fTkhGsdSMpRsmMWZpEYRfbqqp+gl1GrQCARouB/r3978yemYmGsLT167x1N5RAo1xR xKpeXRqAkmBdiTawJDBVF7n3rr0hoW6//9HQFU/X68Ef0sL/AIsfz7t02fLqaJFCRsRqYar6geBy AFN7EWP+396pUnqvWNBqkS7Mt3AXQbFdXpBvf6+ofn348OtjjTrl5ZoyImYkp5AEkVgw8q6XTn1c jn/X97FOqEAitOn7HV1LPClDkqaGSSLSsLVH7WuNrqoMukSRGNTwwNrcn3o9UdWU64zj5dercHj3 85oKh4KiFVc0M7CdHDi6rT1MYGvV9VuDcfn36nWluHFNa1X16TQAB0n0/QWccg/6/wDrm/8Are99 PHOR05wLeKM8KVma7AhvqulAODwLkn6+6txz6deXgfkesMoCpoUEOq62sbg3k9Cpxe/r596HHr3+ Dpb008SA1IjTTUiJlRhIGV9OiVUJYGOSM8k25BHthga6en1bA6h5Z6uU+JKSJkgMLR1D1IikPltH G/qJRo5Q4AANxbm3vagcfPrzUPTflshkK3D0kdXRweGKoEK1CThpvJArIy+K5aNyo9RNwf6e7qBq wfLqlRxr0j7WIvYX/J5H1/w9udWBBz0oqWVqiSHHUssiw1k2PhcmwYvGI4jKr/qiUhQbarC3+Huh Wg1txFT1UtU6R09ZrA4/HYucpURvVmQujtLdpQkqh4gPo5RWJ/rf22sjMy4x1egHE56Qa8MP9f2+ OqtwPSxxNQIK+nqFMg8FTTyzCEeWWSN9LymGG+l5DYgDj22Rgjy/4vplj8J6eK5pK6VcvLTyzUC1 cQp6SsmUTKI2XyTTKNRbVEQbHkH22MY8z07Xj0uqoFETxPGsQuUKc3px+6JFPIA8f590+0dWr0lM 7WLUxjFUrionnR3lEUqMkERHlaSokGtFCkahyLe/AU7uAHW61+3oKTbUwBJGprEj6i5twfyR7U+Q 6qep1LrD07xNpkWojKsPqsnmARh/Urwf9b3VhXHy60Mfb0I8eLp1jWamLfxOGpUVs9Q5M8grWmjS UoeBKXjYKPpYj2nJ4fw06cpx9R02VWMhpK2WYVC1dFSRQT6ZBKYKaeVAEFUL+L79BEx0i4cKP6+3 M6QPXqnHprqvu6+p+8jjNG8s8UFM86pShtESl3YFFRWlABNhZbj36gGOtV6j1dIUx0NfO0pqZgs+ mRSEEczOIRTsF0qwSztcgEE29+4NQcOt/b0zjVL41MZij9KO1MSyDUeGaMEjWB9efV7c/PpvArmp +fS3xG0K7JzxzRJTQRU0auHnRmp6uWN9Vil7MFUer8c2597XPSmyh8XVI/wD/D1D3NX1dZXVMcse qeEBKmVAAshUWug/sLYAW938+lcgFCBwHSdLJDSMI0ZZWsSzG4A/P9Offj60z0XOTqHT/QbgVsNJ i6imaUq5kjmFrLwABYjn6e9DrSV1EH4etgf4ZbRSfq/rbITwmSKbaeAbUxayLJQRFZL2sLnkc8e6 Mlc16NYD2L9nVyvWOA+1alqmgUl/HDTORZYI1VGBFryWvfkD8/7doofn0ZpN2/CK9Ht2glBJLQUv qJN6qpjNwutL3lj8ZJAAIt9Df3YRni3Dpzxq4A6XOKH8LzclfWlHjpaz7wmoPjgDxEhIvGblkUpc i31I/r7auJDEuhX4dLbOy+pcFxjpVJncnuHN5TJLGEp6uRD5KtCQTDH5PJAqi0UboNKr/h7DV1JM WIpg9D3bra2t49TsPh6XG3GTF5OB5DPJUZKhlkTxsGKRyPqMhU8RyIBwBdgOePd7QPqox6S7jOGB Kp2j06ftySyfw6oqqfUs0lJVIkyadMUpQ+KVbC0i6rXuLkjj2J4YlIBJ8ugTLIWdsUz0EGE3HjKz JjDVMlK81LRwploFnSKrx710YkpK2upXIaOjrAupS49YIt7syhCAoPS6EKw7uHTFuCeGlq8lj4hU SUc7CBZpgkapPKyIrJEDb7ZDYqBx6h/X3VBrYgr59WmiUDtPQc9gYSfIbay1UKGOWQ6DVPoYB0jp h4KgMQR5ZSCLf1F/dLkKgYD8uvWchSUdV79q7QpMvRYaeRWCuzTR64z4qRY10aY1uyp+i5B5YH2S lixI6Ewuda0Xoume2PNWwRVEdFQGnx6eWJpKYRSyyWbTNJfSzXH0uPdxC7Co6RyzBTQcegurNu4u iqmyORAglipZmoStG0sEsoN7FEAEc8quSrn02W/ttg6DAPSKaJZKBuBz1Axc3grBU07TzUmqCrhL sUgpqyHVpnOkj1hCdIsRf27DI5bNadB2+s1QnTxHQ7AUG8dv5LD5qODJ0OZp6emyNDXtI8E+OiR0 khijY2DzOynycsGHH19qXt1lHDre33s1s4WvDqr75RT7w+PePwI2flqbNdcY776k27RVsTnJbdq6 6oWbIYWsrLk5aKFwDTtJdol9P09p40VGWnCvQqk1XUJOmj06KhWdH9gdx9fYLe9Un8DxWVqK6owl Q7xhaq0rCVY21B2hEgNzzbkezRgAPi6CdxGwLoW4dFx3JtnevVtO+I3NR5COjr0m+xylMjmgrkVv EwV4x42MZtdfr+fbdQfPorlEyjsl7f8AV/PoL9vVeRnyjw08r0rE6g0hZgwf+wEC6rsx/A97btA6 RtcSmqu5x0qqjam9MlUyV0kH2zH9uOR2EZkA1IukAFv0f1t9fbeo16Y1ny4dJrJ9d7yxMMlfLTzv C15Kh4pGljYLZgiqA12P9RwD7dDh8MPz68CxrTqPhN11dE6U8voRf1wyXjcHV6vItgGKabj/AB9t kNQ04V60SRUHoVRvAE6psiJ0KBY4mYvJciyCIKdSsPoLfX3tFLYI6vG2k18x0r9g4ak3FuOKo3/U 5ikxWSmpcXjttYeHVujctVLIIoaaXWEGMoWLAyTSW4+ntSsDDBp0YjcWC00+XVz/AF/tLZXU22qb a+GxFZQUKJNXfazVclSKY1kIedRI4I84/SzhR9PboiQVNK9I5J3l49Bnubc0Ez1xpkkRFCrTy2U+ dtVlQyIfQiJ9f6/n3ZVVdVF6Zr8+gD3buwCnXHwT1i16VARhAGSD7cx+Uh3BKzK5Nrj2jWWQPTJX 06o3Hj1Ho8XS5RhLHVmjnEUE1RCx108mpALrI1wpa9yPrf2o8FKVBPV1c8RinS321hayjmEUNTEa LU3iDBwal5GVOC1iZU1ekn25AyBqLXr0jMxGo1PR7ensCmSiyGGqv+BUdAtTD5WCSzVKN+1TQKBp QIp9TfVvavjxz01w6Oxsvb0OH2rlIMpVVGPqZqmnNLLUIxp6mcUk3giqJPoPHNpsxsLj2gkt6uTq x0pidu1fw9N/R2wKvEZynjzCyTotXPNU1TIjCpM87T+cMpIWMswBtfgf4+7RwLGSWz0866vs+3q4 jr/JQxV0GMq5l8dXR+OEQiwRDTJAkc39ixBBQf0Xn359NQfPr0bAHTXp1p8bXU1X/D61ponp6qpj OpVP7Sky08sag2kp3QgXU6fdfs6cLqAc56EiKSMmBWjjJkj8jTx6VFSGI8iU6qLofEgAsdP4Pujo 5UE9VS7KsCK06BvsLI4/MtUbYjsGrCWbzAyP9ql3aNgwsGk0fX6j8fT22VegFKjoxW6r3EUPRY99 YKH72nmxKzzVlKsJqG8IB+0NlaJ4hcysjDhzzx7dRZEPEFT/AC6sXD0Jwf8AD0L3Rz1uQyMeICTC OjdJqxpprzXSUPHPEqX1CJhZkv6gD7u2ft6SSrkevSh+QGQphS1lRFPAkiwssYaER6Wprqiyhxyd a/Qix9tuzIQoYU6U20RIJboneFy0kscUtTQx+DIGaeQyqHlil/TIsUYPLS24I4Fh7oZHAqeHSs2+ Ph/n1VZ/OW7ppeqvjrTYjamTrMZu3uDKPs3wwTGllgwNHTCr3RkaVYpFkigq6UpRvb+1U396hZ5H LN8PRLfoIsA4PWoZr5tb82+v+P8Are1fRV1lVdQve3P9PfuvdYjHyefyfx/j/r+/de68Esb3/wB4 /wCN+/de65+/de697917pxoqoxh4nv4ypOsAsYyLG7Ac+Pjm309tSJXI49er69Sp4fIp8SpIo4LK pta4JYD+0Px7aGD1YjHUyhr6nGLpVfu6EsfJRyE6UViLvTS/7qlP1tyv9R72dL8cN6/5+vBivnUd PS0tBko/u8RO+tXEk1K+lamnYso5hT16L/2kLJ+eD7qdSGjD8+nAVbI6WuNyuRwtQk1HWVFFkfHJ DFVwuZ45oZLnwVdHO321XTl7honVlZfqPdz0nYK6kOAVPTpPR7S3A5eQLsncEqr58rjoGbauTqXt pavwihhiWmdhqaA+NOTxz73UEUYdMhZoaGM60/hPH8j5/nnpLbmxOQwGEyGMy0VLFWQVMU4bG1S1 tJUQTUv+TVlNVxO8bU9TckAHi5B9600IA9a9OxTLN3rXgR6Gvof29ITApI1NUaXBQzgNAH0NJo8b HSxutzGCOATa/vcxyMZ/1f7HTsfDoQq2sppqJKWSRDOi2gSPUEiRrLIJY35kCqfUxuSwFvacA1GM dO+p9eo1PXDyCKkTxxQMGmQFplqFe/ikTzAm4PLc/pbT72QaVPWwfIdRlmqo18EsayUYmcgeIyJC KhR5iSDdiyqBzewPv1F4jj14mnXCWGopZfuPA8FKUjhgWniaaFmv5BKG1K39sD/Ugt/h73UEUrU9 U8wa9QRI/wB1j0mQgTV0CTK+tQFjiTROXjAIU6V12udI9uAdrfYetCoIJ9f9X+TpNPMHq53YaNfD WW6M6eZ3B1WIIaUfT2qA4dIBlV+3/D1ITFUcsMVVUsqSyaHeJpnB0Ea2JCxkgeL1Xufr7qSQeveI wOleHWaOgo41V6ajiqHe9vuGIWMBSVfSzX1k2Iv9f6e659etGRjhnoOpCYqoSKTVIkccMeqUkBIa mRiJFDIoD2FrEji39fe+qmRajHHrFAsOnXYzzFy+uONwqJ6m1yMbpGALWUct798qdbNa08uu6yom PiifQpqZ1aRvQimKIL4oSONNwAefqSePfjwOfLq0KqXUjy/w9NFShd2FlQFirE2VSsccaNYXIBVg WsPrfj3tcKOnH+NvWvXLNVgnp4UjAKFv84LhW0AXsv8Ai3J/Hvw49ahWhJPXVLUTR0cZhfk3JIuC hAKG7X5LBT/rA+9efWnA1mo6/9LQEHB/H0/w+v1sP8T7t1Q5HUiO5RwFJ4ANyQAAQ3+34966p59c Xa44AH0+lwG+ltQH5sPfut+fS2opkdInaOKTyhTYgL9B6DfSzDT9CffhQU6SSDLDy69n6Raul+4J kWqpFLESKpDRM1njV0F2CA3Fx/X+vuzevWoH0tT8J/1DpNUs1W0SxpVvHDCxsY+ZkBF00W9bxqR+ PoD7169PNpDVKdx/Z1EqVZJW1vqZ1Vy1rks310sL/ge/dWTKig6z05/ZnClPQVf031GzAMdPF1VS f9Y+6t5dXWuesslr20rZmX9ROv1FWfSb8Ek8W/p70K9bOB0oaTImOOFWkid/DFIBNpYTCJTAAVZQ Q7GKx+osPbbLxPVwaeXUuOfHwhxUzRqpjWWRWZZJHYushEIBAZgVGkHgfX3WjeQz1YEDj6dMjSVe TWeKnh00Rrpq5Q4I8Qlsr6nJIEa3Y8XsT7uKIV1Hup1Q91aDHSbqI0VzpvYBgPrzY3vz/r+71OOr KMHp1SQ0mPgV1R1qHjraOdOJIZoZnjlpp/oQj6Lgm/8Ah9TatKv9nHrxpnpTZjcWOqscaSjx12mp m1yTMJZ6eaT1SmNlQKLOD6uLofbaxMDUnh17WD0HsfDA2vb8f7x/xPtQOtNwPSoomVIKRk9Lx6ZC XNjK8dQxlKyEWEcaWHP0Pts8T0y3E06fJFqskwpoqYww48StMwmhaSaVpWjB4GgqVkW5PIt7bxSt c9PfZ13VS7irIKWiqJI6KlWWDGtJAVE0xcKsZk8XptJF9bflSD78Ata8T16tOA6xVi0GESWDHPUS eWopKWYOyGWZAA9XEgCrrhmeKwva17fj37LkV68Dx6Rdejx19UJE8bmoldowVYR+Q+QJqX0+kNY2 49uL8Iz5debPXcH+bP0DmSMowJHqBSyn8i4BJ96PEenXsHpe47Ows9PV1AWKLHS1bBZ2sJPKuoU+ oMWmekteIkEn6e2CpFB1cHPTW8lRmMnSEjwDJVhrURXZV8EBEdOCpJVykVMbGxsWJ93+GvqB1U+V OmvMZaqzlQZZNZggiZYY3KsyAsF8spFlE0r6VJ+lvpx7sAF+3rXyHUQTyMKOCeaWWjiaMJA7nwqr uPIr25CC5t/qR9Pfv4jTPXq9YqWiNYSlJDJOyBnmCsQVRfoeAVIPIB/x97d9NCTx6qSwOeHQsbb3 xjqCmejkp/AYKcwRRMLWA/si5uWLX5+t/bi5UV6VLNpTT5dB8Mt58nkZpQvjqnawYWsuu4/2497H Ww5kr6dR8ioki1RDj/af6G39PfiR1sRFzqK4p02QyeKIg2ub/mx5H5/qPfgRTHVXhKhT1tJ/DCmm /wBAHUBgjs1TsnarNYXaRnxkB1KSxA9Nj9Px70jqdanj0Zw27CKN6YIHVtvXUdKsVE0jvDHTBAvk JQoGjAfyBbCxf8cnTp/PvzAEYI6VIoFKjoxu22jonWWeoFD5lPrkd2eVGYB7N+qJ5Izx/Ti/toxu agVI6Ux+GGBIH+r16XNQyvWLAGeskrF84md1mjp4bgxxPGTZPJ4h9ASRa/tlogfirX59G9vcqgoo FOhk2zNBBUantP8AZ401E0KlmaSpltHDFOpsAgW7IB9CDx7RzBKgaadGKXDUJDVXoUKylpVGHq0l hjWWnklcLYNDIQASABrZAP8AYWPPtOsYBDU6Zlvg1Q3DpIV2R+3ysFPKQ0H2NZkX8imSOdoDHCiL GBoVU8oYA8XIHtdCaGik1HRRKyMagceghyu1Z5Kv+9WAix0tTVyUlHuqesjNHLV4qCZlhqpauNPu KmbGxgpTIT41HBA9mYPYC46aj1agFOK9Qt0o1Bj1etX/ACmoRZKWBkPmkpln8tNNJISdTyqgsfpc e/K6+Q6NER9I19MOJq6ypwGQpchUhIdU8olsGvAE0mjMwJUzhxe5BAB96mh1gmlemHIifGOi8b72 zQ1eHo66iUNGo1VNESJZ/MSWWoL20yxBBpIFgP6ey5oCh1Fc19OlEdwxWgNF+3oqG98FJikXI0lR BLC7SKaZg3HlRjABGfqQ30/Fvr7o0jgkUp0uQowArU06K9Ht6o3Jmaihrs7UJFqmqp5KgxhDEgCp B6kWNiUsFjX8Nx9PdE7yxqOtzINIArXqTBtRMdHLjqarb7SsJUP44f2tL3stix1NYgC/pHuzAdFM 8QNSxzTpcbfwFbVUtG9KY7U0k0UksjmIUywsAn7SfunyvzyfbqBwM4FOi0qiNqHHouHy1+M3Zfcm xcZgOtMfiHqqDcRy2XpMjVwYsPDUL45s1TzyK5lCyPqkisGfi3PuqpkVA1D5dLF3VYVIZsfb0LtD 8aMJidgdY7EjlkNLtbDQUCTTeU+TKzp5shVQK1446erq2Y+oekWPuxUhc9Est0LiYsGxXotnyT6O fK7Fye06MU8z4xJ3pJZqVKiSjlkhA10qgArTykepx6jx/T22EqWFelqpGQCRUdVI7a6rymw6jMyZ uShqsjFT6qV4YC9LDGvAPklu3lUfUf7b3emAOiO6io1VFB07YambKZWkgVp1eWRDUTA/sFXkANRE L6liYEj6XH1910fZ0k0no78tHjqU0VM+Lxyw0tJDTLGKWmmWQiILC09lIZpGJZifqfbiqTQDj04h CUJz03br+F+xe1tlUe6Ujba2fOSkRcziIIjDWQRsBLFVUBtFIyStw3B9vrBIGqeA628iOML3dOnR Xwz606x3bQ7j3fUz78ytFMKzHQZGihhw1A0TB43ahTX95KhsVMl+foPasigqOmgFrw6l9nfGvOZz 5K4Pujbr4XHbNjy1Pn92RTO1I9PXRvLGYaWgRVimNVJGpVUCqrG9re0TOzcT0uCIV4YI6G3fWY8V BLUJEVaqFZE9Qqs7JHIkkUbsAb2KPaw/I9tqxVwasfs6QEUrQ56L/mU/huJoscJXkaRPHK0Q4gpX UGFmdhdm5559utc0rpX/AD9Up5V6CPJ0OqKSeSr0NAEpxf8AcVQvK3VQSGIAJP1t7ramrtUZOet0 qc9PG0K5pfN9xBFP45QAJArDwxkAHxAAiHT9f7R9myxqynTx6qDQ0B6HikoUiakyMaSpGuqSFNDC lblDdJG1B2Qm6j6g8/j2zoUcSethmrTo43WMiRZfGVDnyUVRTo0tSt44xMwW8MjKdQF/qfx7sAdI 0HpwadRLjHViOTqkj2jS4eNJWp65o53I8T08gjSMxJK7A1CSRzNeMKQGF7+2SQvE9WU0yOhY66wr y0dLL44KyqMqFo0YQtIV/bKs4WytZrD+zf2y7M1dJ6URkMAfPoZP73Lt3O0tPAVljpalI5dEoEsQ VQZE4LO3jBvzb0n22iSVOrj09pHEAZ6OPhquj3BtbG5qi8NdEqyMauJhJJTM1wyySMOCVOkJ9APa hBQVrx6RyCjHPUKpWaGnrxRzo7rTu0MerTFIUQ63RiCYihW31HIPukkukFaY63EqlhnIz0T6o3UP 7+KlTBJPPSRkylJLtYEl0i1E+YgEm/8AT22sinHS4qQK9OFNJHFuCrrw8jxVYZ45PGitTtyyI0TX EwNwv0AHt5HoR1tZWoFJz0u+hsnDjqjdWQliSnqZJp5HWdVEzxrMPFLEBZreVjdV+q/63urtxeg6 0NTsoBr0g/khkzV06am/byEqxx1EbRNqOrhZ7G6TzXuoNhawPtNqqalhXo2jBUDOfs6Ao46hxwo6 iuqNeiiilhpacIlVK4ACUrC6pE5IuW/p/r+2XJLBa46d1MRw61Xf53/aH97vkPsHYsFWZKfYHXgq qyiM0btjcxuvL1U81LUQxH/J5/4RiaKUI4DeOZT9GF1sK0Bweg5ubVnVQa0Xqk/+3/yF/wAT7e6L upafT/Y/8QPfuvdYz9T/AK5/3v37r3XXv3Xuve/de697917qRSVUtFUwVcBUS08iyprRZI2Km5SW JwUliccMrAqykg8H37j1ogEEHh0I9ThcbmcXNuDa9TBj5YYGqsttiqqVhSlbUVllwtXM6ieB5ORT t60BsC3HtlqVo3HqgZ0IVsp6/wCf/P0naZVnpFkJJSRGJNgLG+jTo+hseSfyfbRqGI8+nuI6gSUV RSTxVNJMYplcvE8LlDCU9QdW4uvHK+3A4I0sMdVoQag56EDHbmos2q0u4Ghx2QMgMWUaP/cVVTaf GrVojGvHzvcfuAGJjywX6+/UoarkenVeGAMdO8dNU0LCKsQlbyESwS+RalXUPSziS7wyRGO4OglT /W59649erx6h5iKKpxdVSyymHWmtSnpPEiB0ZCApYJHcLcf64v79wyOrDiCTx/y9BnPQ1eHkd4rV lGLuJk1JJEr+kSOisZKeRkFrm6/4+7hlfjg9XKlcjI6daesoquUTQvKJEaMJAy3dCzoGZPU+pSzf T+ov7oVZcECnXtQPyPSopkikEviklMtT4kiHKqqpKA6gRozoHkRLHli1x9B7ZNcV6cFM9PlJV46C KGFyPuXm+ysRpFT5neKaqjVxd1jiS73I0lQAOfeqE8OtGvGvXOcU8QloBTtLTRROY3QNI5adTGgd Br8GnSPwf6+9fOvWvt6RAusyTozMUjqJ3juxNo0mGkEm9wFW/wDgD7UjhT7P9X8+qMaKx+R/wdJO FAxVml9JFQ/5t6oiW/F9bSA/63tQekfDh8unaloTPD5XuIysZeJHvoUwhV16iGVbAmw4/B909aev VWeh6UqQ06IZQ/7MTGzuNepo0BBt+jxqWsOebe94A6YJYkDz6b1qKV9MlS7VFQ2t2hIZKdQTpijn jU/uCReQv096rT59XowwML6/5uo89VHDFN4XELNqeGBSRySsRGgfi44H0A9+z1sCpFc9NEsdPNIR Us8saRyNrHGltKBVAAHJJP1PH5t78agYOelEPxfKnTc8LQJE8NS9iks12IaNTGSrAKQwJb02+t7+ 7fLrddRIKjj02zVEtQUMpB0LoWwAAW97WHHv3TiqFrTrPSvG2mGaQohY2DFhCC301aOeT9b8W9+4 dVcNxUdf/9PQLeDSQ0T+aPk3UXdB+SyC/AH5/wB697+3poMDUEUbrpBf0m41fSy3OocA/wBR9ffu tefXN1sLXAI5P+PPpPH4I/Pvw691NpqxIo1jsedQlXjSyN/xzk4Mci/0PB/2Pv3n02yEknp4pqxq OciCaeppFiIOtXqY4naIuWUC7+LSbN/T3bh9nTRXVxAD/s6YZNME8oTgK5MacxmzhZYybi+lb2H9 R7106KsoJHEf7HXKt8ZFNJCF0tCAxUkoHBF7Ib6Gv9R/h798+vJUalb169SmNmmR2Vg8RC2QiS5H Gni2rVx703DHVxUEY6ziMSAuj30KrHUQrBljJMaggDVf3Xh1brIlOZ6Zaol3ip546ZhYARCoDS0y h/8AVPIrjTb8+9E6TTzI/wAH+x1sCor5dKvE4TE1NBSTVUM7VNbLKkIMzKAsMzKWjjQqLKBpYG5/ p7aZmBoDjq4VaVPSioqVqK9DCKV4YmaO5KpIFdvJpIJtIqn/ABuT9fdGNe48etj0HQSZYxNWVMlO xMD1dV47kHjWLkWC+kk8cfS3tQnwrXjTrQ+Jus2KWlqA1JVAI0zhYKp5tENMbMXEsZ4YSX9J49XH 5PvzVA1Dy/n1ogavn0/YLDUuTq6tDXTNS0cMJJhhMMtRJNdFhKuWMSRtGQzC5+lvr7pI5VQdPcet KgrWvSO0FGdG/UjlTb6eliD/AI249urkA9eY0PT/AEgWSgRl5aESwSIfwWlM3kXn+3GbD/avdTg9 NH4ultg5tX8ZqxHFGpq6aBRCp8bLFCWllQNrXW11Zhe1z7aYUoPt6cXgD8h1i3FWaY6Gjpws1cZx V+KNQ7lUUqusAA65nk+lvop9+UZNeHVuApXpINFMa1I6xl8z1VKksjn0kXuWDI1mFhp4+nuwpQ0+ fVft6hZuJY8nKQoVZVilVQTwXQfTVyPUvuyfDTrZ4dR6UDTIGs1irG4uQWDqDa/CqTz70/lTj15f 5dP2CoMdU1muqs9NDSRNISHKvX1B8cEJK20oztc3+lv6e6OWANPXqwpxPDrnlKqAVi1FLLrqIRLR tTRgxvDopmj8qWAQBppSAF/A/wAfdVBoa/Cetnj0xmIIAkehiDG6uhVwAf3UExNlYu5A08kW593q fP8A1fZ1UH9vT5jtsV+TnCUkDT1UscZp8dTqZZp6lpFiSDx3BLyKCSP7N/wPddXAfPrdKkdLfcmH TZWBo8d45KHOVU6SV9wqy2WS4iHLMFWM2N/zf3UqXdC2RTpT9OpTJ7ukjuJoMhXxTQU8UAWGLUIl C6iqDUzf4kjn2oCgCnn0lMYBK16Ti00lbP4oo+V4ug5Nvr+Pxb3bq4JUUHXOeYUiNSlX8g49Q+pv a3vwA6fW5ZRgdNmkzkoitrH1U2sB/X+vHvwAFadVkmMnEdbdXwf26a/48dFOUtLSddbQrEKfVZIs TSkPIWAXTpNrf8T7LW1eLJQHj0MrJUNnbaqfAv8Ag6sn2jG4eyhnWSTyxrKPqYH8TKY1UlS5+hIH I/2yiFS2GNPz6tNGhqQMdC/i8sT90klItW6ioWNWPpp1VGIEmvUCCw9X5UD6e1EnaAVahH/FdJli UeWOn6mrZqhqIwFUXUHlZXYSnSqMDDYBjqcfkWAFvaR3fGK9KY41Fc06GvYsgrqxIfXN92FnqJ2k qBHTIf8APQyALEZDIF+oPpHthdZbuTpQWRVpr6MPO8H8XxNP41ipnaSIVUKrKkqCH0hyS6QlhYBe bj/H2rSIEMafy6L3bu41z0xQbVqNwZWvyNBV+aPB46ooZaLxuKcNLOlUky1KehjEsBTx2Zv3bn6A e3o4lAqePTTZ8+sNXBTQTMKmiY0FVHPTS41FY0ukpoYSuLMrrMpa4vzb6+3wKggdORSKnn0DOSx9 Z90KauLvSxwTUizySrU1UNKoC0UUYCsAkYPDWsBccG3tto2FSFx0YLdoRQca+vUPNYanweya/KwJ 5lQ0lJLGo8cKVFZUM08kTH0vojYEqPqT7aDyqKE9NylJKnz6ASppIazE1n20n7RqSDFfRIHZjHZm NvFGQbKp+t/brMNBJ6TiUKdABr0TbeWIbKJUU0SkZL+JNEYqeYSqggfTF45fIyte1mXjTc+0bKJR TpbBL4bajwp0G+Q2NPNViVllQxyRpK6RJ4klVkjdCQQQ9wQbX0WHPtn6JyahujBb5SpDL0z5Shji zVFT0tOjQTO8VRNKwpUR1QXLR6mZWH4YA3+vu4tnGDU9E91MruQCadLGijxIjqcdQ7i8IENOlTLH SytHJOWLeGmqvAVqdAFndeL+7DUR3Dh0lKp5HoRMHSQ1TtTx5FDF9ui1jtDKsx0EAA+YFku1rngf T28kTCppjopuowxOn4ehJxZxePxRoclBFUS1Wungae5qIVIZUliOhx6ibEWtb8393MZHGnSWNQlV 9T0UDuTDVsOSkjEMDU3gaGsmjjICgciJBYnSacWPNyf9t7TP2swAx0aJKojHqOqo+8tp02Mgz1Si pO9coNMqRuFcO5V5AFChREq8i4/1vdBUmnkekczVDV6QHUnXVZUY/K7kq6QQrDQzfb+XRHDQUccX FQ7OSrmRl4Qeotz7WlIgq18h0XrUkVOOlrLmaTHU8VQ4Z2NLBAjBSXnYA2MqsALD63F7D3eCnFV7 eruI1GTU/b1ZT0rtyhyXWO28bk1KwzLLk0dSo+5lq5Wkt5ibFP7NlvbT7fc4PSXUQcdYMjs1afNL jWgqoXqJvLDKsDNGgRrxopAJanRW9TfkfT6e2TwNOngRx49c85tKOpSgxlVVNLPCGb/JiPsKioCr IVmMtpJRH5OCbAWv+PaE1BIPHpYGZ1ICgD5/8V0Tvs+unEUNLQs7eOplhMsDAxB6YsgV248kaN9d JF/ekk0NUefSc25Pn0VPJ73rpZ6ileWlNTD+2qRyXR1gk5ADEaZCLXvx78xDGpHWhGEYBweuGLyN O8tRHJIhqZ4lZ4nBXVI7cgMBpIUN9Ta3Ht2FgHP2f5utOyA9oOk9CngtvUWJ8WT0RjI/dQzNUSMr 0z08kYURGIsEcAH6i/PtW8wTJ4dJgteHQjUuYraKCMSRx5DDz1LwPShS70slRqjSREVWlW5J02sA SPeo7lWbuPT6jSQdNadGk6jrDNU0UcYkfGxSpDBHKgjdtDWYyMTZgGNjzwR7UeIOIPTTvqY9vR6Z 66vNfjsXSKtZRS0UdW49aPDVodMwjZtIKLCNQ0+nj2ndC7Ypp6dBoM9Hb6hx7rRoXEElMyXiMep5 ZICoZ5RIAyx+J+G+lvqPbRQr9nTsS91QMdJTtTa+Wxu8MvnYBSQUmZGNaj8CTNVxV6xvTVpql0JT rF4REE5uwDXsefegZA4AGP8AB8+jWNUeIVGa9CR8e+11wudi2nm50jx0tUKKspp53MfmYFYqrQFv FTSk/Uj0n8n29WuPPouniIJHl0a/edB/E6PIV2BrHWiipHIFJpkglkDkgKVeNjF67Mebj2y9GOkj qkChW+Y6IjXYeupN1y5fJPFREusSjz+MiaXSqyRF/XoqDYFSPbsaRgYXu6Mm/s8+nSg+5mxVVOah S1YJFBj0yFkjkN5Bc2CAhrrxx7oyszEAeXSBiy0oOJ6U22Mni6PcDsGmqEdQQPuPtnW6PqZVZRrV ZWGoG1/bTt2t69PQyNVWIoekFvjI4ncecMT1qGA1KOlWpTQzxPpbyJKUhVkccNwbey2YOWNOj6Am mRnoDu487s7YVPU5HO74xFHhMZRmWTM1uToqJaOo0STRUEdVUyrTzVlQIpCi6jq0mwNj7rDHK7UC ksBXGaD16UyTRLEfEovWiZ3r2XW9xdw9jdmVs1VM28N15bKUf3jmSpp8OahqfB0Urn9TUGGggh/6 d+zzyHQGlfxJHf1PQS6Be/P1v79031kDEcC3v3XuuJ559+691737r3Xvfuvde9+691737r3Qode0 9Tk4sjj4Kb7loRHVhDGJIwhZY2EoF30s5W1gfVb+vtPPihr1o9CFPg5aYqj42shSymIGhGmXUwuj R+E8qwtbUPrf+vtN55PXq9JrIQ4SiPir45YGdmKo1DOklr+u4MDKqg/m4PIPvYJ9etgnpjlg27OG 8VFXzqysdEcjCbRZtWsfaFFAYEm9hp97Dt69eoT08Yd6yGkaho8VuCTHMPIlNVxQ1tMoFyWpZJaT y06uByqsqsf6+9lmPdivXqD16cZcd/EcZXpRyvPNTRSnIYtCEyeJkRDKkv2cpjklonp9LMVVlVuP x7dBOkEjj1StGAP+rPSIgnlp1IlCDycRVKqCwARg6zkxnVbk6T6T+QPejnpUMGhHUaTE4mZ5qtDP ROkgjKx1EcYjmkKGFhGE8lyD6rWHNx9D7ursKA5B6bkXUOxgG+fD/Y+3qVHUZWlktJTyVXjAtW0l LPKqxhgt6iKCJlYBjYPYHnjn34xqwLIcf6v2dMiUqwSQUb/D9nr+XTnSzU9UpqZAsokeCnimiLPE CQqtMpCFoFaS5a4Uhvr9PbJBBpwPTwYca8OslJW1lLUx/Y1TTS65nkpkKeSpMKEwzKSx0rBYmxtc /g+/EAg1FBTq1a09em2Q3hq6gILxYmazkXI+5WKFjq/tSs8x4+v+29vLxUA+f+DpuX+zavmAP2kd JXQYo5woAFqlUDNpKvI4iWVuDxpBW39fajpJxIr09LW1A8cELUqv4zCZPCQ5WMEpKxay/tqbLcc3 PugJ6bKDJzTj/q+3rDM5Eal5TJHHpVo411ISsgJdVUglS1zY/qPvVPLrw+QoeuSVToZatrxKCBEp jVVD/UsQRyQDa314979OvUFNI49N0k8tbM7xwSVbF3t44tKABdKsG/SqqLkAfk3PvdD59WC0FK06 4/ZVETqZp6ahAARoRIZpkvZvXFFqALAXN/fjQ4p1dHC1Kgk9YqiGEU5CPLLNHEUhjOmNNDH1M13L PYcgC3PHveetKe4V4V6T0ceslS6oQOA1xqN7W/oP9j790pJp5dZaMwCqg+5RpYBKnkSP9TrqAKj8 8/4c/wBPfuvGuk049f/U0Bld0YOjFWBvx+f9ce99N0BFCMdZIzdxe6gtckXNr88WBP8Are9nhw61 +fWWQHTpsQVYqdX0/VqAsPp7qD8/LrfUmnjjmhmTT+5CwmBUWbxGyuv9DZh73005IKkfZ1Phgp6i qjWF5MXIscnqVWPmdVGnxrdVu8eq/wCDb3vpsswB1DV1hnxU1NFPK6pVwhV01EUv7kBWwUlH5MQv pYc29+OOrCTUQAaH+R/2eoDRxilWRH1P5AXTkKmpSA1h/bBU/wCv79/h62CdZUjy67pywlUMb3HA uA9z+mx49YJvb3o1oerYqKDz6mowVG1C5QOv7i2X0F7yMQCTIRYf091Oer+fTzg4kn/iVBNZYKmO kkcgkGJ/K6xSLf0F49YAPHuj/hI4g9WXgfTqdjsjTYlKqmyMkvmo6uSOnaMLM8Ik0l5IFZgvrY6j zfnj3UgtpKjiOt4Feomazv3MP29HVvOHNxMFMMq8lpdYI1G68D/b+9qme4U68WHAdJ6sxwgx8E+o mV9EzIBdY6eYWgZieVd2Bv8A7D3fVViPLrS+vmeusVEKlZKYxllbySu6qhaKKKNTPKWb6JEnq/x9 6Y0oa9bOSB59KjbMkdFk5Yx5BHV0NQpLlQzGmYSxlBH9Neggj6gH3SWrL8wf8PXloCfTpI5OLwZK ti0201U1ltawZjInBJIGl/bsZqinz60/E9OWN/4BTtYNpkkj1BQHjuizCTWBazMmm5+g9+biB003 EHp8p8lX45TBSLStRzTF5hMjj7dYxFAameoUadFYVI5v6h7aYA1rxp/qHTqEafz6i4uOaYzZyapp 0nkqZIkeoJSBmmjZqh3NwyrDCQqgci9/fnxRKYp/q/n17ia9RqgSwwY2vCRNM1bWSCaACQSquktA QSwDR6W02+t7/n34cSvlT/V/h696j59NGWn+8qFqU8jIyeJWmAVj4m/AH4CyD/H24ooCDx69wGeo 1MTql9ZVfGLpa7P6v0KP6i/PPAv78wFBjrw8h0ocY9QIqqjpaZnmr5KWEuCBTU8AZR5HmYERvLOd JY8KDxz7aYA0JOBXqwOPn1NxeNSrkraqsYeWneOmvFKDIs5Dk1pHp1lQAVPAPvXkKcP9WOqnj8+u ZxmPxlXjY5qrymarkjqiQohjK6lhq2+vjZpHW97hRe/0961Fq0Hl/qHV8UHr0K+HzFb1rFNvfHQ0 1RlZYhRYuGRRN9hGwlE2QYW0rNMJiqk3YKCR+PdgtVB9etigPQUbkye4dxZKPcWXmTIVVWxkFPCy t41PNvGtyB/Xj3o6aUY0r59PByQanFOmtqmprZ3go4CWK82W9iLXX/YHj2o9OmSaknqXg8kuDnmN fCqykNpVxze3J5F7+/da6T+RrhWV0lSsX7ZfUAAbfUm/+Nj7917rBTSs1Q7qv6lINyAPx/Xi59+6 91uPfAnzzdCdFxsiLGOpNpaiqLoKnC0pvK7EqzBfoDxcD3oRrRjTJ6E1mzmCIE4CjqxCDJ0O1scu Rip3qZZTKsENWFRlarcqrxqTrafyKWJtYW/2r2zgmnRugGnvPXOqmkyFBtKtwtTURu1VlqLclLHC LtlpGieha8mqXwxwhiL2VmPtR4IYE1NKdMvNEraaY6EzZ23M/XZCpnpKJp6hIJNDzKgp0SRiXSUs 2kR6ifX+o8fj3QRIAfM16aaYHCdGd2LjkwcNVHlvDBW6KdJFo9LQ3cHVAjDV4440Oo6SNX0PvZoB 2J0lDsWNW6i1Gfz1VvSgo6eJYsNTytTYulp01O0nj1VOTrmBZlV/pGW4X6c+2g0tadKQYtJYt0Le K23nqjBY/Ew5ePB1lbuGLLZ2qpFSFpcPSyvO1KinUddeyRwzt+I2YgA2Pt/SfUAdIWljUlQ3SZ3R /EclmauqWsooMfTQzq1MNRjE0bkCd5lvIxZR6QA2s/n28rIBpRs9eLgLUcOkTtWnk3rQU01Thsth acTSJDR54omQnaKraOOvqYKOSSNKebTrjQ3coRex4961kV6TrcsCBTz6be3/ACYnH4vaFNUQxQUk rZfNQKSY6iaqJWkULJeQMp9ai45Nvx7bBYkDpekrkZJp0C+2sLNXUlfPII2U1UaLUTrw9TB+/wCO RUsQ0KkNcC39PbjoAvdnreqnDos/Ye0JtrVtZV4xTWRzVUztNBGiRR1FWxmmkjkJbySEseRY+06t ErEDpYj1FKZ6D3VlpoKCDLyLSpLHVGCCXh3EksYmkmlX0sQ0ZsTf1Xt+fbpYae09Vkl0D4T0BGUx dfmMxUQxvDCY6iRqFo4nj+4hDaZFLSNaVwBe/wBLe02nU4DEnpP4gOQM9DnsPbdPXl8xnpi1NSq8 1RS0XgpKLHLDCEp46MQxElIfHwvLOzEkkn2p8Cq11Z6oSAK06FzHY3bRENfS6oo8nBLC0dXGkfnU aXFgSylkIBtYG55HuhYx4oOkE717R69Ydx7WWOgSpgmaKp0y1cMI9MoSA65VnAsiLpFwfoR7qXVh kY6T91Rwr0BG4cf/AHgWTx6qpKminqUkkYIzvFGzSm7C0mmI2VfdG8Onr/q9erBnB4dV9d67Yx9Z 9jgqaQPlq3wrU62jSPH4mN3+8rqiVv2oEVAF08FtPp9sFVJ7KafTzr1SaQgUI49FA7X7XpduQSdb 7Hnoanb1PR0VNlcsIwHyMnEk0NK5JNPGrgKLeprfWxPuhjmqcdIi2ePReMBu6syuTx9NlKhPGapa aCBgSIEdvHEthxIiIbv9OBz7MYzoATy6bYlurZup+3afHQYLZVS7DG0MFPTUlWyKrQOzB3dZCeIz MxUDjSp92eprpzjreg9GA3HV6XmyBqHDBwKdUAcR00qaGIK2LI2oADk839l5lmBKtjpxKDHSIzyC KlgelfxyVkQlSqR3DSm2jxo9ysRbTY351Aj2ySSanj0tjBC0IwOiQ9o5YRz5GJNS1lKkrKiKZLzM Brdgx9c0ZW5F/biop4tjp2tF4A9FIzG3UyFalXTlTVZDSJDqKRLKVHknWMkKJy3+w49+NAcGvSWQ qxqFz01oa7E1coqIJZKimCJFMZI/FUHSQoaNfWLkc/4H2ogbBWmemHoKEivRq9v1mOyewc3kJII/ uqOmW1OG/wAwVQFk5trAI+n0Ue9TOKaAMdaQknhjqFtDcFYYaDKWdKamnj106uUnMyDUsgaw0KVs AbH6/wCv79DGGNTxr1dqgZ4dHv6fjir6dM08AWoerknqaUaNIDMdKxgAXR7cnhr8+1ZjbBp1VAHY evRvdsbnq8tmqk/wijo+KXH0SVCXcQoqiRwkbBJIfSTc/wBbe3EiBoDx6UeGowePVifTSSNiXaPS qozCBiQVYqLyrCg0rGqSWBH9PdZY1Sg49WiWn29O/a+zH33tjOYEZHKYyoyMVE1Hk8JXfYZmhfHT UteklPPH+4iStGFksPXESv0PtKZUWozXpVpkUDyHRBMnVZqfJZvN4ho8PnNsyviqs1HgnkyEUCp4 6uSnjBkpqKrdefJpZuWW319tNcngFx00y5JbodOh/lvRYd6rb++tYNWjUZp9R8NDWIGil+2mkBSp iZ0vE/1aO3592EmsAHB6SmORWOlT0I26t7bUrZ48rLNSVEDyIi6XBZtD6xIhl1ETDgk/UAce7qxX FelQY0APp1EyNTjq+OfMQTLOgijjSlmmZ2qWf6TQsCTITbk3t7bZnY0Ar9vVho9cdJehlqIKuSZV /dUzhAjmzRtG14CSSwdUa/8AS9uPdwvbXSC1M9PQhCTnpJbreOPFCoenElVOStVSpI6SGnZnMc0c 7DUJm4F+CCbj2l7c1APS7xNArq7eqcf5mm+qnEfGLebZDG4mjqstW47a+DqK6oSqyFFX5CrMdRBQ QyK3mrp9qR1qma4aJXLD1Ae1VvEkYeQEqxxT1Hr0V310ZI9AAp1qwe3eifr3v3Xuve/de697917r 3v3Xuve/de697917r3v3Xun7buar8FX/AHWPqXppHieOQq1hJH+vxutwHBdQQCRyPbUwqh69QHj0 ov72Z6JmkjzVVKrqZnjqZxLINXoUJG6OobnlVH6fqfaSla463QenU7+92ZkqaesqcrNKEVVK1Klt Mbp41Fkj8R8cg1LdCfoPx71pFT69bpinWWfcGQyNZHIPBKsMZjdY44VWN9K6XBjSFjcc+ok35J9+ GBw6rQAdKDGVFXJGUY1RVvUzGoEKlQdIVFZWR9JH9SbHi/vdOtH5dBtWVNZTZqXK0E1TTTvLMUmh YiojZiwIJ5EiNHcMGurL9R7VoRp0n060VFOHTzRZ2gyAWmy+iirGAC1qX/h9S7Wv99EvrpZnPPlS 6/1AHtto2HdHlfTz/L/N08sgagfB/wBXHqXPR1VA/kYBo2VWjnR09d7jyxSAlZIVUtq5KqeePegQ 2OrUIz5dK3ZW481tvLNW4TLVuMr5aP7eeSnmgSLIwB1WWmq6SoEtHXUrRMbROpRtN/rz7svGo6Yn jSWPTIoYV8/8np9o6V1ZHsvcMlXXeCTYG5Hcas9tmmnOzauRuDPuLa9qx8LA2ol5KZ5Iw3OhQfdz pOG4f6v2dJAlxDTw21p/CT3fYrefyB/b0gczt7cO0MnQy5XHU6LlJaUYfcOHZa7bOYeUh1lp66Mm FKh9QYxE6hflQPdCmKA1H+r9vT8VwkoIUkOOIOGH2jrnu2lijpM5kmBSojlxFC/jaOCKoGRlmrUk NOo0ebxUtmZbfW9r+7LTWOqljo0cQT+ymegzUsKVNQsZJNJI0/5tXeWd2udepgPrbi/+Pt7zx035 nrIkss80kkaSTB1MbmBNY0RC5Hmc6VYJ+T+fdQPLrRAAA8+pjiqKFP2MfAEGmOndJp5Q7FdKzFvE JFH11MCL+7YA6qAK1NSesaDHIrNqMzIdYeacsyax+Fc+JSdJuVBIv/X3rOOrd3lw6wy5VQCkMccS MTruoUWbV+B5HIRvzx73T5deC149NjySyHlWdlFtR/tL9AQGtqH9LC/PvYx1ag9euDagpLzomkXA DKurgkai5MjFvyF9+62M8F6ZfeulPUqkhaaR7P4hDDNUGS9ivgjZ1Ckc6mcAD/E+/cOtE8Ov/9XQ E/x/B926p8uucZA+ovYj8WsQb2BH+Hv3VW446nsUBYgACzMCWLA6gCwB/qAbg/090691ip2ZZQFZ kJIA4JDXN7MQR9VJ+v1926q+VPp0/V0SeESxziJ4is0VV/q2As0LMOY5CeV/B5HvY4YPSdD3U0Vq OHUBarISKzSxNPAxPmWNRGXDWLKVXkqRzcD3qvV9EeNLUPTclzDUKEDRnxys/wDbjCvYKPqDrJt/ h73/AIOnfxLnu4fb15SQ8RIBsyh1P+B5LH9QspFj791XGenCzpNUK1iVAdkTkWBHjCm5AJvc/wBf bfkOnKceuaGZGL0bap3WRmZyAXQWd7R30sU5AH/E+/GnA8Ot14Hz6cKHD+dPJVvJ9zIWKxNGAWPI RzLI1tNwL8e6s9ML8PVgtePHrOI6ZcTjyngkrKmqyJqEiKfcR/bRLAkL3PpVxLqB/PvWdR9Kdb4A YzXpnlqJnhq42HlE9PDGWOlAiwSK66AOW0FD/rrz7tQYNfPqlaHPUOguIpNAKu+uHyqzatNQEjKB QQD6Qwt+dX+Hux+fDrzHOOPTpVRSQeNaczQyRFwknlPlVha2jRzEzayCp5t7qCDx4HrQ8sdNuWqh W18lVpCmeKAkAjhooUhctYCzF4r/ANefdkGkU62eA6csIivHVKZCoilppuUUiRAk6NHJ6lARybH3 5/Lps1qDTy6zzNKYZVpg4imSRKlxKpMkFPITGpgb1Rx6iOORxf3Q8anj/l6uhwQD5/5umuKoghhE FRrZUkWpURWdJWdFBjlQnQpRfz+QSPdiCTVfs68PTqXVtW/a+JAKKhgl+4gxusSSxu6c1DvbWzOD 9SeF/Huo06qnJPn1YnyHTJN5BHCHX0FTNG3BJ1EI3I/qYfoefbmKk+fXgTSnUmgI+4juqsGVwRfS FspNyT9Ddef8PdX+E9VX4h0q8PGCAirPHarrY8hLFEZYTSPTwzQxlNQLmGqQHixsePbLf5P516cH n1OqMlBS5WukYyxpPRwxCFqdfuA9I0XjR40LAMyytyTzb3qhI/PrVfU9O2ztq5DfO42pWjVYoUbI VcMsilYKVbNMJWFj5ZohZYhci1z/AI3RKjBwPPq3GvWff28IslLWY3D0QSkpZRTSuq+mTxXja45C gabAfQD241CADjrVQOk7R46XD4uPcKnUzro8YOoJrGjgEkA2b2mkGrQAfPqpcVpXqVSYyXGaMj5Q iuwme/N/IRIf8Lce1fp1fqBuuqx1fHFUwRReWMXkdba3v+Dbj6+/de6QjnUoZDpFgNI+g4/P9Le/ de6X226zBROgyVPTyLoA9fALW51A/wBffuvdbpfwxw2Kx3xX6KzUEEUdNleqtkSQwQIWVYjh6Ntc z8hRJzptyAL2+vtoSFWYMO3oTWhpDDT+Ef4OjY0WAbJ0OPn0LPOcgl1qJCPTqdRpeQBDFGLaR+bn +vtxRHWqnHS4ysq8ehY27gngqqmMJCk0kUZRwgZXYDh5jYAMgPpIAIH+PtSJFCqAat0hZiST516E d8jW0lBDEjQGAopmWK0clWeUkQPHYyorgaRew55590d1P4TXr2ogVHSr21iZ62pxOWjpqyqeGSpp ammkyLUuPWKSwaoraJA01SKYEaQvq/pf2z1QnJJ6XGwcDvD+NZCsrZMc1VkKutejp0jBjx8NGhWC BtLCVYjAvBci7Nz/AE93QgGh4dUahBq3T7ms9WQTRPDSvR1ccE+PkkmlSR8eZ9SmonijbQsasEYq Tyv0+nt2ikcc9NeFE4+Lu6ZTUZGSgwjVFJLlpfGlBKlKgNTLlZJhFHlVcinWWmFNaSQX0RBiBf3r wamtOreA3kcfPoUKemx+2YarJZbRenAMrwB3etrIotcdPBHEjGSOXQF1elUW5JJ9skj4V8uvRwlS GanRT4cNnOyMzX5bJysjVWTmlqTMCnkRHZaakjUKBGtPEB+SdRPuyNTVTj1Se4ZMKaHoYW2JS7ew 9DjtaLrNTNVRCNVlnaVS6yEjVMWWKyAH6jn3cEn4jinVYJZGarNUdFS7dxFHRY4KU8ccbq7RmMNF Tw1Da00vquattPKj2naIMToU0r0bwyKMN0VzK4TKV9KaemnWQzPIlBX+NS1GjAlP2zqXRZrkn6Ek n6+6skiZA/MdKi0ZwQOgJXZWSGRetrsxVV6Uz/ZUpeN6WkmcMRURX9KSSuR6bG1ufp7prPE1r69N lYT2lehmxVE1BSLhqSRceZpErq6p8tjTU8QRoV9SlUI0km9yT7sbiQ8emWRc6RjqVDj8fR1eGjzl c9FR5vLNjtpJOlVG+48jJG1QY8eqqxadlDMzEKGta/497KmVfPoulZdRUDoZshjq+CohjyUZj+6x rOy+M6I6SOEqI5hpdkWoK2LGx9uoioO/h0xQOaVp0R7eu+Ice4PjWipKLIVLw04kWMGOzR/tlTYp J9Qt9I/P9PaOV1agUUA6dEahfiqeq5e8N5Yh48zTVUzibIVL1U1a0gUyawQkSSKQscKL9Evpvz7Z VTU0PHqkig6RTqt/L4nHV2QqavF1aVVHAkstxIzsZI7HSsY4eQPc34At9R+XdThdIanRfJGAzCme khHLBRVIqfuGesikjka40MVJFwBawc3/AB/T3VWmqKHPTRWnEY6O31LuWDP4ak89azVUbfvPPpDS 3cmJUa4KFAAo/wBa/syjYr8TZp02ST59Hu2FuLMZWnO3s3AVlV1/h+RlOpKqNVAip6i/AkRR6WuL +25pY1WjDj1aOqsCPLpWbnxck+Mmx65CGmdIKqeZVYuAkbuYoKNRp0STTliSSPpcfUey+q04Z6M0 l1fh8uqze4qOTDCeRmq0krHldZGnkJ4J1tHI3HkuLHm5Pu2kHqzKrA16L7tCozFag1zmrqFqJfHJ UMFjijGriPQxt6QQT/X3U4pQ9F7kilDjoYqXDx6Ja+opx4TTFGGgvLGq38k2qSynU3pW1zyPapIq 0IfJHl02SW8upNXU/wAP29W4qnZg+VMUqBCdaU5sXEmhzYD6m45v78LemS5PV1JH4cdOezMhVR1l LjGcVVLoiWKQREMSxUaP3CDIYi31Avx7VooOB5dVbVih6su2EaPF4WHHzaVqqmOmlje3iBJ9bsZl NizKRwL2+ntwyBa1bh1aNHPcD/xfRgcFUSYRaSUy+FXcTUssjGSWRANUsfrGpgzH0gXHPtkXWcr2 9LNJ40z1ZB0RmJ67AColVFpCCrJDbzBpDcyJGt2DWBLEfT28GVs0oOlUQU5PHoT8vUvTlfDVshW3 gMiq0saTi5MryFSpiRRx9LH2w4iZqkdOSMVU/PotvZXUlDvdsRmsbnn2ZuXAbmos9WZnCIr43d2N hhkpZNtbsQIY8nja2KZlNwDC1ivI9thYlyF6RgM3xHomW/Nk19HW18YoIxNR1CKk8DDw0dlNShXS QxSz+gnhWNgfx7bkUtpoB0+uksASadMuIzEn7OIyVdVTytGE8sgIKyq3MU0d1eNyONYB1ED28iDw 6k56rLGQQQcdDDt/c1ZjPDR0ck8iQtGiJN5OXkbS0a+T0JKQbqb2/HtrproQafdpklMq6KIUlUXq 6aSRJ/uVjikiWNpo2JiIn0yBgDci30v7spXTkZ60dQOD0nN4ZrIVGDjkSsjTJMLIZozNIsEg1hJV jbxySgH0kNZb8+2xGrYoB053UyTTrWs/m+9mtkt59cdWQVWt8Jh6jeG4ooZrwvXZiV6HAxVtNqIh ydHjKaeUm1zDXL+LXdTVTST2g46QXBBYU9M9Uz+79J+ve/de697917r3v3Xuve/de697917r3v3X uve/de66DBWW97X5A/1x/iPx78RUU690q4qGBfDLFU3eaFSY7FvS3qbUVDte4J+hI/p9D7QtWhU+ vW69Z5KegqYo3jqZjPqMRVYZgtlACzIzaQrhr+k8m/vQx17qRTUU0MqCCX12RTT1EQSQhQ0hZnU6 EB451A29648B17pR0sskjU1FTRVFRWzB4oYISzmqqKm3hp6eBdGmoLsFW5K3N7H34cQK9VJABJ4D pHiSeRqhJVkjqoXYyQSIUqIJU0xyxTxyIvjN7ix+p+ntRp0063UMKg46419IJ2VkAR/3QjaTpYxX bR/iEbi/+t7sjU+zrRWvXDE5+uxEZpZoFrsWzhpMfUllCvcapKCpAMtHNcXOglT+QfdnjV8qe71/ z9eWRlweHS6wkFHmaqKTCM1Zop55KjHVOn+J0vjjLs8cJ9NUFQMQ8V/z6QfbXchAYfn1d2UoxBx/ sjp0kBgnLQ+SWNeJYFOl1LBTp0Ehome9z9Sf6+7dNeVPLpypcvPRUFZicfkDQYvJExV+HmjeajqC jqRKlLK7wRVcTBVE6CKojubNbj37h9nVGjRyrMKstKHz/bxp8uHy6Y92SQyYz7UVgRsjk4cjUO1P qslFQGmjpkHkaQz0z1DAg2jtze/Hu6DNaeXVHqtMVyekFI+Mh8KNHUVTQsjFqpxTqZCo/VTxKxsf 8WPHtyp9OmxqzkAf6vPrCcn4gCvjtGCqREukRQltRQqIy2om1tB/x59+p1vTU9Qnqpp7ppISzBig 0oWY6hzaxQD+1YEe90p1alM9dLRxyW0hrx+rTGDJbV9FM9iVS/0uLf4+/de1HI6x1H2UClWZi30C RypJMg/1DSIzxKl+eDq96qT1dQx8umaRldj40IFzpBZna34ueATb/D37p4YGT1lFJLp1SWjWxPq+ psLrYC/6jwPfuqeIvAZPXoljETSMmojVY/VbkWCsPxa9x791pi2oKDQdOWOx7T05nWRixdkMChlZ o18ZuJLSIBJqI5jYce6lqHh04RXFOv/W0BWAVmW97E6T+CPqGH+uD7302MgHryfVh+Tb/C9vwPe/ XrzcAepyqQiGzP5EAXi2lxcMgBuCePr7qetfMdYrGQ2JAd3UarlSrE2GtiABp+vHveOvcOpssNcj eKZmlhVg5CMoVwg1KWsNQsB9SD78M9NakpVRQ9eFa8kiyLE4n51PDL6m4JusZVgrWJvbj+lve+q+ GBjVjqPLKrzPJCskSOLMpAIuylXuoIBuef8AXPv3VwMUYgnqO3K/4+lub3+pBA+lgLXI9+6sOPTo TeUOq63eCNtK3GmTTpLym92CgXP+v7ofMfPrYNQD1JxraKygYheaoQWDfqSYGLkixUs8gtzz703A j5dWHr0sDGYWkViPIkh1LIhdUdDquGBDDTyTz7ZPy6v0nxFFT5epVdDtLqkppVIjR3mgaSLU5BYB nZl45BA924oP9X+rHXjTVxx02TeGBGdrxponjBK65JJ/GAq6b3g0sQbngj6e7ip6rSpHTfi4Kiqk aGlBaVFM2kEjUkQLk6v0jQVFhbk+7EgceHXnHDpW4zEtWVlPFXSaoE+7nqIovTMWpzTN4qpCPIC7 TKATYf090ZqV08etAV48Ok7uGhFBlaiJYTTpIRPHTMRqijkYgLxf0kcj/D3aNiVoeI6s9Bw4dewo 11M6koIvtxLNq4bRFMhIA/4MwJ/wHuz9MthR9vTwuPjyVdRcyRRSpJJVS35MMMiIUjUBdLSLICST Yhvxb3QkqCadbj4kdPe66CjpIqCtoaakgWGfwCmWNESrTUZG8wHLeMqF550k+2oyakEnPTjUp0n/ AOE5XLj7+mx8VHFPOkbMZrPpkiJDqklj9vphNmt9ePbgZUwST1rGT1wz2FfG0y6a16inp5o6eJJI Ep30SI8okGln8mlnZTexHvSNVsrk9bBrWnSahYLNCTwoZdWk82J9Q/ryD7dIwaenVfU549PaTtFD UHzCPUsd38jJIJG8iSsLN65NMQsCOb/Ue2iOH29XFfI9epmDQRvKECyTSyxu5vVzhgsZDNcjQCp4 P05Pu+nIr00zNXQnHp0x2QmxrPkaLIzYyWHXDTiJ3X+Ju90kMtiDobj9X49vU0px6UqgVaauHWCP KGjjq0rII3rK8s0jAoVBbkG4uOR9f9f2w9SMdNtU4pjpvky2SShOOklBpnZZAl78XuFH9ALe2tIO k04dJ9I1Vr1LyW4J6jHxUoawCKnB5CqLf1v9fajpQpJArx6T6RzGCxb0ycAFr6fxzf6Dj37q3XKS LwwaeSbXY/gH/D/W9+691giiDxyNIxARdSL+Gb/kXv3Xut574H0ePrvgn0H5Trrf9GXX0FIselY4 JWwNEJZGtcvMyfqLf4W9pHWRnbScdCS2KrBBX+EdHh2nhsjQ0NJUCNZ56Zo1amEQ0spBbyuX1Mjo o55PPujB0p0bxaJRwp0qMPlhNU100GhWjqJqUnToWoLJzNGWILPEWtf8H25DPRlqvVZLVQdZPUfJ TSYyFKypqFeGkKoUVTKPuHJTQYF5ch2Urb06gT+PZjqjcVZOk0iKBQDj0LWzstNjKakkSolanKtK 8BF6mWoYai7ytxH49XCixP8AsPbLSRiv8PSB4GdsHoQabcEuGhXI0UiivnWoV3lkN5I57lFtbU8l jcWsT+T72oRx1URBcMc9Iijc04nWpqJMlWVc8000SODEv3A8yhjfUGUxC1ySCLDg+/FdGQetqijg M9KTHZOmxFK9dl6+aIzOopw58lQCGsIoUb0wg/T0gAfnn3TxSxOlzUdP9y0LDp/yeUo89lcVFHPU Jj4sdUTwxpMPL5FQRSyszGQSSanUDgqov/re7oAVBYZ6TSylagcelttagoMfQ+WedYoaaOGBUEl6 mSRj50KPxHK8shs7H6r+Pe6AHt4dF7DUc9Ts1HTZWOapqhJH5lLQyIbLAdQj9CtYPIth6eUYfUe6 nP2dKICARXokfeezYcxNjcxBU1qthayR6ZaeZ0pp2qKeSCWKto42WjqIpY7lAysUb1AiwIbM+g0N cdHEUQda689Fk/hQpIZXNdMqQeUKivIXhEKXlV3PpZT5f6ckAe9tPrAFM04daZDXBx69BlTQZTO5 6joMZSzx0cDioBnCiOdHc+epdpfRG5X9BH0/A9sOzMdJ62qhe4mp6MPtrYX3uVpY6mBa2UxvKUkm X7OmhB8cM9co0todlIjJ/UUP4HL0UaEBq56TyzhTToZJtvbZwFfhc7PNV1+4Ns09ZSUL0w+8w1P9 4gjkano2LUc2ViDExSWPiJ1cG/tx2K0p0XNViWr0CHY2QqKXbueytVUVReAFsfQitkeCR3mtDTx6 CheqdnvIzekKOAB7ZNWPy68q8Oqgvkfvii2zFkRV1MwqxVMY/KfqNKvI8MYLWh8pKL9NVwfaVxpY mmK9KTFoXUTjqrrf++Bu2KfHQxhomqhPFI9wYREAAjAEiNR+bjn+vvS+Z6YaZBxz0CdY9Fi1QRHx 1c4ZZ5lOmKRANXpC3azE3vf1e3AjMAQMHpCzrqPp0nP2almVBJ5VJZj5CIXQm9w7cLIAfpx70Vlh 7xwPTLEMel7sjeD7dqqaFJo40dzcsGAk9VlaVyWJYcgH/H+ntREzupZhjrRFBXqy/q/eslRPipJp 5FSNoFbW4mWE2R1Yg/SxIsef8ffpk1IaDPWgejC7uz0MUpipUM0tTRrKakojRRzI5/ZZQLHzHmw4 Ui/5t7RDPlnpVHJQnFeiV9+fZ5HBQM1OTJS5GlpqhFQOiCqDSMYmUDQwkFyx497oelPiArUkY6Lh hMFNgqQSQqrvNJK3r0iVKVyWVjcFCHYgXHvRqcdJGGr7ehmxceRqNuVlO0aLNGnkfVa0bkBoyv1K gg2tcjUPb0UQc1JIp1WgFPXpAZeCBZqeOqlkWecBtVK7rFDIx9Tygm8i2J44HtYo0rSterGQAYUd O2yQV3ZRrOAKNDoMrgMTFCQ4YMeVL/j6Gxtb3skeZ6oXBJPR7+uquvyeXpjLOaymkcx08E9jHCkr DQYZCeQoFrEMf6e6M8YFGYZ62H0UIrXo5+dnpsHRUNOrNLXfbrKqG4jUCzNHAwu4dl/1POn3WsIN COl0as5Gc9HG+OmZqsjRU0HnjBkRSyxsIVUhgxQqFCloxwtx9fa1AmkUpTpciooAxXozO/amCjp2 jlEQeSGaVbRt5ZVMZRdTqSI9N9X+P0/HtpkUMgyVJ6sVVqefRZ8NuwSQZOF2X7dWVER3uHBl/ckK KWV5ox+Lge3GiWg6baJAK9J7LiOvygOPArIamognniqVjBqZBpUqVYNrETMdNyQLkD/BO0ZUVrjp po/4ekju7rugq60VTUsePIUCepgGjTMpLKuocF2vZjccC3vQJGK9eCpwf4+g4r6XJ00b0lOlN4Vl VRUMrJMFKguzXAUKyg6eG+t/dz4eeFeqSIoFQc9Zpaulo6URPFHqqGRoJ4i1kRlEQT8M1xd2udII /wAfbDsg4DpKXKmhGeg/3Fn1hydLQXkqYpGiiQSyKxmXSjpJGjAqVFyQfp7Z8Uah/qr1dpFINeJ6 1Mvmxu8b2+UvdGXSV54KXeWQ2/TTPa8lNtopg4GGnjQI6ABbcaQPazGlaDFOi48TnorPvXWuve/d e697917r3v3Xuve/de697917r3v3Xuve/de6xv8Aj/Y/8R7917pTYueGeiWCeRw1NNqjNwbByCBy TdASSRpPP59ppRRq+vXvPp5poqeaWNWq6uNTIw0iJIwNNgv7wm0sS314UqBz7Zp149OfgjhDSx5G tP20bWYLbWSfSUYuEdmJ4ubf09+pjr3yI69SqRV09ZStVrV0bLUxOdUMiyQnyI/milkEE6yAOrK3 BA/w97Udwr1o8COhGrnwPYJE26Kj+7+7Vjjgpt10SRlcozMIaaLc2OUxxzEuVX7uLS5/tq1r+1Ab yOR0m8N4amAVT+E/8++n2HHpToNcxiMnt7MfwXNJRmaOOSSmnx1VFW0dbGW1yVELxSOUdrEtHIFd T9VHHupGKg9PxuJRUV/PphengkaSnAtd3ekLqQkhDEuPIBcFIzYCw9Qvz72CRQ16sRk+nUSKmnpZ op6OSanrIdUkdRTu0E0TB9KOksZUgkX4/I931V49Vp5eXS/x+/8A7r7el3bCXk9Qj3BRU8UleFX9 v/cjSAeOrjIFmP6iPwT70U4lD1UDNR0oavHkUxyuMeLIU0qoIcnQyaqHxjnxTRllamqFYf5qUC3N mFvdQfIjPXq5Hr0G+5KiV5KKNi0TimlkkDhwNU85vGB6FlFk4YgGw/PtxOJPWnIxUZ/1efSajtcI t5mYgC2pSbH1aQp0H6/kH6e3Omz5465G0JPkaGmuGYLLeSQi440xJrQsDx9PfutgE8B1glyMYuIo dYNv88WMd9NifFqOrnnkn3rq4iPmesD1FfW+ksxj0/ojVYYQiH/UoEjIX/Y+/dWpGmfPrNFj4rOJ pwXCXVYiCAxNhqY3J/1rD3sDptpjjSuK+fUomKEeNIlVzo0hVXUSVsbsdbXtf8jn+nvxpx6bGpqV NR1lFM/iDTpJTiZHkjMgszpGl9aoeWQ3AB4BJ/PvRPW/PHTKjs8K0qAlnl1X+vBAFgByP03P+t71 6npTpq4Y9L7G4qV5YMdGVd/K0KSD0PCwN5mLIdX7ZHPP9ke2XcKrOcDq1KmnHPX/19AySArYgFlN /oLlQOL3HP0/qLj3v7emA1ft6wAEMP7QPH1t/t/e+rnIPkenSnZTGwN7htVhexDC9rH0qQRwR/X3 VuIPVV8x1hnQeRgQmocgA+nj1XP+JFrj34cPl1Y9ZhUq0JQ2Fx41ZiCUUMWiLOOeW444A+vvfTOg g9d0UYjmqPL6ZaaNmSzWJkQk6VZb2Yr9D72OtOcLTgT1lqanH1KGZfJHVsQX0p6JTY3ZwBZZAPqR 9ffq/s60EkXtI7emsrbi1x6xdzbULXRrni1jf+vv3ToPn/q+fTjHJeOB1K3jR1dRfU1pEcMSeAHb 0/7D3U8c9eFAOHr10JGilZ0UqUm8scdvo0RDI91uv7RF7Hgj3ryHVh0q6vLwRzyyAtOsxkZo4tSu iyA+R3DCxCEi3P8ArG3tsJUAdWrQ9M1a7T1LzOqRoscbGKBvLJS0kQUrLK0d0jkZzwCbhiB72BQd bOafZ1Fq6SUy04mu0FRBLUU+l0YGMwvIpbRwsqkDUCSQD7sKAEeY6rXPU7ZMwjzYj5tPR1EZAtcl VE/5sL6Yz703D8+rvwrTpe1sDw57G1cbrI2XgyGPmnUcqlK0NVScqVLTLCgTWQeB7pxDCuMHqgag FfLpI70mhqWp5UCmaOSVJ3CWe7/oVm+rAFPp+D/r+7R4Y+nVtVRSmek7hWVMlRltISZpKZr35E0b xaja36XIP9ePbrfCemTUah0soHFJlYNTSxpWRTUIWUIVH3UFoaiReV0ySwKP68/1HtlxVD+3q0VN VOnnJUKZHEyo0QSRVaVXmYGSGRdbyeMAr61f02sCV/w9tA6TWvT1K0HTvHkKVqGhZVQCShpCHVdK o328SLHdf91oSef7P5978yPn036VHQW5eulyVNMVjaOKllPkklmVzMdbCMIPoTqYkn/UgW9uqNJW vHrY4kdJQG1jcfXj8fQ8D+oJPt3r1PLqbMhl0oACTIAjLzfVa/k/ppB+vuvXg1Kny6e4Ifto4pEC yMwlRZHIJURHRdIvrEGLMvq9RIP4+ux69ajUmshNM46aquWMS/uqXNvoPp9SP6gD37pzqG3rOpQQ p/SCRwP9v7917rrS3++P/G/futUHGnXH37rfXYtcajZb8/4e/de6fmeEUgTUvCg3IuR/sbcj37r3 SfAAuVNwT/h/vvz7917rd2+B+cWl+G/QtDF41desNh1igxqdcseCokkDki4BWxv9f6e02pg7eleh DBpMMP8ApR/g6sJwm7aiaKlhV4aT7uCNFWZfJaRVIUM8YAb6WvYlj9eB7cFZGB4dLo30DqTiaQyy 1dNLeKrjndtUehRLHK1zPHdQgZjxp92eNAKg5+zp36kGig/l05ZiZCVo6URyVTlVCshYyAGMGVod IkQQiPVqt9fabUP4unAusBiuOnaikqnr6Sjkkra2qmjkm8MFKUpVjplXRUPNfRGZFPAPqcj3dV1H LCn29NyYHand0pqjOY2JjHW5RKadW/ybGppqJ7Rj6vMD+00rXsCf8PahXCCmOkJR2zpPTLlN7xNQ QQYiOClqHsJoiscmQheOcSkykHTG0vjBH+vb35pGcGlKenWwDXIoOkZmq3dFemPl2qYp8rV5OnpK vJZx2lpcLiJH/wByOQNKFMVRUrDcRKBYyW5t7YGhampB6dNWArTofttvTYaCkoIGSqpo4RBRZGrY tWSM0rSTS1L3JIq5SWZE/SBwOB7UB8UGekcsZb0r0s8/uurwWPDywUhWanSWnpjGW9QtGEgMf6pG 5ZGNgB9fewSePHpCY2Hl0r8dnhmcDSBaZY/FSvNUiSRWcRGUCSWbgiMc8cXBPukjEVA9OvJGzOBU jPRW+6s261BpcFZcfSujYmGkZLy1aowmmnBUlS8pta5t9faGQFqN5E56OYsLk8B0VrKZPMRyyLVQ ULRmkZ2UaQBJKXPjKRpqkmaQk2F7Kb+34i6kBB5dW8VBQ6s9BRhpczk81kPvK/GxU1FGppaClWX7 mrdHLR06u5jhhuV03Y2v7toYsC3VXkVhQHo12yG2ZBj8hl8hlKqWuyMdMuWoKT7h6vw0EH29LCbH xRikRSqqCBzq5PPtQuMDouMbkk06w5Peu1WoWgp3lx0UTLFS0up2lYJqazql40lcH1EsWY392aRa 91M9X0yMNOjHRK+1+0MpXUVdQwFamWKSYUNPSRPHBEkCnwNUl/VI0LfrI+vtM0iGoUdXFs/EnqlX 5EyZeSkoMtnchUVeRyuVrqappZY/Hp+xjWeQ08CsfFRszoI7nmxP9fafhx69LGErnonMMiUFLU1N a9NTVDa0jjk4Mhc6mjJJJKrq9XvRpn06K5FUE6TX16D6vyL1byxOysTdSbBfCz/pVBY+mwGn3YOU FE4dMMoFMdS6IrHHCzyKHDAMxsQQv6iUvoa2nkWv7bJZ/ir+zqv5dPscURVZ4YYpGX16wjP5NJWx iisdLDm/9Le1EBk4E9nXmB9OjM9S5qWgrIyk0jBwrzB3YrrjIkClSbqLf4fT2u0ClPPpvNeje1W+ ZMpSRyssMVaYVhRYTpiDIvpUX9KyaFNyfrf208MROBnp9KqOgF3pnauiQrUQCsjyDiFElZDCNTjV Mx5W8Avzb/D3pY0Q4WvV2bVwFOoWV23T5TEU8lDKjLTUqqfEyNLMmoPpBXSPEtuPyPeyiE10jqtT XpUbWpaqsxuZxTx/tigVoxGC0siU4VgUcAMsglA/2HvRBVW0Y6959BhnU8UlNJkIxFaXxI+kCWaO OwXWCFOkNyTb8W9p1lfUAWFOtlaginTrt2SSsqaiqvHK1PGQg9CnxBLlnFr3VVFj+Pb0sZkppPVF QihPRuujJ/4jUTSNIstRTmIUaqwtPJ/mkUgCyKhH1/BF/e44NBDPnHDrZatej+7soJ1x2zJwIdUe Fkkq5qhVcSVRZkkdTYMjILKLXB+vthwAVoPl0bQGlKny6FPqLc3936nGpUNEaeo9QjjBWUMvI5/L k/g2PswjVNIrXh1totTE1z0ZLMb0p9y4iatSpmFE8dZHFNJE6VEFTRtJC8U8TBJUPkQoLjTzcXFj 7qzGPp1EZBSuOii4/c8tPNm4adWp1D38M1z4ZSxcvqsRyebD8/4e22uR6jp7QSK0x0sNvbgkqsxQ wCaGRIKWNmmmtGCbDSJF4ZQGLEH82908apoOPSOaMoxoxB6WOZzUldT1ZmmSYppAjVBFHK0dzHUB OQ+srz/h7qK9M8eJ6B7KVsixPRyzGqnDLU091DNAJAVcEcHwqDxza309tkMKgtX0+XWmbSCSMdMF Vkko6SYO6NJMqrIPKrD9oEkwJICY1J06l96c4Oc9JSxY56A/d2ajhmqMtHPDJHiqKpq6amSNNbfa 0zShZJtQshaLTx+PabR3ggdUNeI4U61Ad45Cryu6tx5Gvm+4ra3O5apqphe0k81dM8jrfnSWPH+H s0YUIx5dJ+k17r17r3v3Xuve/de697917r3v3Xuve/de697917r3v3XuvH9Df778N7917rNjnK1U YBUazo1ONSqWIAYi4+l/dJF1KevdCAKYGtpzIsjINDvBEhBuSSWiBdVPq/JCt/j7Snj1quD1kqSY p2EMB0XIkZ2EjxlvoDodnbi344tb37163X16iVlXUUMP3FM708sMBnjJgkXyMGjjBcVAZZE/eNhy P9492Qdwr1taEn7D0osPWUmdgVxSS01Q7KkkYDCPVLKkYkoKplINP9yQWQ+qJiLH8+3CNJpXHVCP XjTpLzCnqt3ZRwno+9yvjHpRnP3Qp4CwWysdTc/159+NREOrLl2zw/zdTqmmljZF0i8kXlAUXTwx qwWUi1gzrcAH6X90DDPViOHUaOnLAFlZQqDgnUfq1ghFvWWI5P8AT3avHqpA6bpqFEZdLepNZ08E TLYFiD/ZYc/7Ee7149VpjqLQZTMbaqmmxVXNAs2hp4GGuiqkX16KmnfVDURj6fS4vwfd+1hRhnqp 9D1yzm4I8pUtWrj4aV5YIYjDFITBHNGr+aWAf51YZXbUqMfSSRz78qla58+tadRFTinTFJXVVR6I wkS/Xx0sSxDgWuWUeRrD+pPu1Ot6EXJ/n1H8DfV2GosLqt5JDckMSFv+kjm/59769rHkMfs6lrTG FC8kI9RsjSsVYLxd/CLNwT+ffumzJqNA37P8/UhUkmcJFFLVOdX7Sowi9SluEiuLcX5Pv2B1UV48 B1OSjFzJU1MUAjVR4oCHYIQxIDLdL/i4uVPJ96r6daxwAr12tTHTlxRwO4JCxzSFS7AXSUmQ2Ki5 IANuTcfT36h8z16n8X7Om6qqSIHBcPJNJpJKkMFj/AvcaFPA/wBv70RkenTiLVgfIdZMRSJM8Dm5 ZqkJ+rToVNDs45ueDz70xoD05kyKvlx6ErabeWsqqgNoVYNSgcozz1CIJdOnUNSHk3ubm/tFd1Ea LTiR/IHp+HLkn5n+fX//0NB1qTzRmagkEyhdUsOgirhAJuwW9pQAeWH1H+PvwPkePSbh8Q/zdQTD rAKuC5v6SCC4H5BYlS3+BIPu3Ww2SKY6yU/6mjNwXU2sStmQk+pfwQPwPdW4V6sOPXTHUokK2ZTZ ibDWvAB0EfRR9T78MY8ut8ft64MgMKuqDUocSuPoyE6Vcp/ZsfyOLe7dVJ76E/Z1j0TIvqV9LgXJ BGoJ6rBuSCo9+69qUnHWLSV4uDzYAckfQj6D37q9a+XWQBkNyDdTyGN7E3U3H45B9+6oaHh1KiP7 UguQyi6hb2J1CxcfRFUD8/n3U+XXhxPUk2LIF58i6Gs3pbzJZUQk6rC/I96pjI6tXp6ocdJkXgnq 0MVPJAtMGhcBnMKFWLAC+osvP0490JC1oc8et0rQkY6cKyXHY3By4+MqKqaKdJftELxuxf8Aa+4n P6wUt6STZh71QswPVq06Tcs0UtBQxa3M0TQxKpazBtbLMiovJXSy8n629ucGJAx1UH9nWHbchjze PZSVPldGsbEhonWwP41Xt7q3A9XbgehD3JViB8TkAsrHH19pow1iS8DOpiINrMbqwPBI/ofdVrkV 4jpoUofTpBZ7IrkagvAb06OxiJhEMshaxd3QM1wDcj+l/biCmTx62OJHTPBL4ZIJRcGOaOUEW48b q3F+Bwvu/WiKk9LXITxp4qll1RQV8CyI2oSTiGUTLwoHpnik/qACB7apUU+XVU+Lp5rs7HKkdPRU zVjy3nWZlKRRGfU1MpW4DOI25ubL7ZCepp0/q9M9JpqhMfDLTLlJJ1I8cdHTKrQxM4JlZqmXUkKi U2AS5a9zb27QtTt/PpskKTU56Yw+pY4QDMC2qOBFDFpORyVXW9g1v969ugZr59NFmNc0HXM0CQaZ K9HjDDUKWAjzgFgD5eGFMNIv6+T+B71UHA6tqemDn5+f2dSKeGLQYxEk5Ul0kjeRalDo4QFWSzaQ P9pufeutLrdwF4n9nXGpRZaxWhaWB2VTUwu2oiRRa9x/gB730qI00UdY2MJ1WAmaMeskcgj6i/8A sD791rqOhSY/tqOf7PHH/EfT37r3XJ08f61C/wCuB/xHv3XuoB+p/wBc+/de64kXFvfuvdZXAMYA fmyg/wBeAL/n37r3XEIixA6vXqNx/h/vh7917rce+GG5aDF/GH47UNXJLMV6r2RUyeCIzTwxNg6X TBEq+mRntyG/T/t/eok1FiR59CKBkEMFf4B/g6P9iM5mq6ogqMXjKakxkLxquSyEyvIjqdLQLTR3 GkcEWsRyD7cZQo6vrUGteh7xlJiaeKR5swJ6idvJMzP4oBbS7QrIPURI1+F5HumCc8OtKwDAj16U 0mT2/NJFJTxBqiFRAsdJGRUTSaw4WaoIYxwsEAZf68e2mtBKpKmnSyO6ZQAMjpEboq8t56qpMz4x HCXERZpoJItPiaIRiwKA2a/H9faN7eWIVrgdGEMsclAVyegizW7q6jdVxqU1XXqqLatjU01IZHu9 TUVCgJK7P+kLyCefbYlkFc9KWt04EdYXzlVKIqeean+/M0b1bxxqkb/VinmHIZbnSL3uR7fRxQks Af5dIZLfWwCA9KaTef2cVPHHKV85EcSMwVFqFkWNImJJvq/s8m/19svMhIAY9OJYyKSCpr/k6FvD 7jd/8mop0lqqWJpYopiDqniQeYG17SIXAtwCG9vxvpBOrpNcQUJNOnbd293r8dhaiB6a8fkgrkYi RqdorWbVzraQ30sosv093+oqQB0l8Ci16ELr3c2NkxVXStLLLUzRKGmmk8Hik0mXgv6dNlGoE2F7 /U+3wdWR0imjIPQC7y3hj2qjLBS0zO9Q9KBWSFYqZnkKytCwZVeQkcE8m/8AT3oqMAjpou4ABY0I 6BXO4fdEs9XFJN9vRMkcNJ4FS1MAkl5vNGpbySsSA/8ArW9uwodWryHTD44Y6DDMV9BsLGUn8ToR Nk6mcR+erqlYVUwJMStTxMWEhUaiDyfr7edgCWp0phEhoG4dIzJfIOhxVFPR1GagxE85RIY8bjkI EkdyXYkHUzLy973PtJ4iVyel6wSGlFJHSdl7i2RkMei1WRytVMimt1orRfeMQzEqwARWYJYEDj8+ 9tJEwyK9KBBJ5VB6LlvTvjGjGVy4zbFUFlgnparIVBklmFIpbXIDp0q5H0P4HtOKEkjA8+vSRPHU MK0HVV/a/YMOXknp0keo1ymoeaocPJHbyRxxwDVpCAGzEc+9ABWqcjoquVZi2OI6KpWTyzRy+ZtY imCoKi8lja7K7j13/wB4v7VDQwqqZ6JnDKaZHUNKNal5PGk0bysrGRSpiYJY21EBQ5+gsfp7pKdI Hhpn/B1SpNanpV0tItRE5Sk8qE09Mkrqf8mnuNctlADkILE/09p1lkr/ALHVlUk9oz0MG2tnzeBZ i8LKbqi0976mZg6EsLHn/W9uieSgBXHTug0qVNehD29t98fVeeaKWORZ7KPxLGvAVlW4Dni309q1 mDcB14wMvHoW6elq1i88Im0IWWWL1nQNbMFJbgsFb/Y+08khFVXq3hNTUeHSc3FRx1riGpV3pkRH hh03ZCSAYz+Va/q/p7bSVhQVqOn1jDIKrnrJhhWYzSpSSKlmJgpyELLJErFm/aS9wASefz7daYUO kft6baE8RTob9s0dOWWppJS7VOjwI0Ogq4LEmZEFgmn/AGHtOZZW7T8PTFGByOm3svr+gydBHkIo FlqqZ0CpApKNDU8zMluB+4Pofp7ZOvGk9LEGlQPPoP8AHbbbF0EnjgETBRAQRcNHILEfVSyAcsfx 7UxSurCp6ZmzUUx0ZPonD+KR5YXEEk5jK+NS2mUOLRiP+wssZuDz9OfZhrqKnHSMqct5dWI7pnWX G4SHxQqKHEwwTSlwwlmk9TRxG40qAQSbcH8+0zRh2rTozt2QBNTdNhiFLT4bL4seKWKaE1EKMZvJ dgt19RVGdrfXm/tRH2Bixx0YAqKUOOhC3RvF6Z1dpWp46iiSGYKQpDFSoOgn9wn6EkXJ/PtNJMpa vl1vHqB0VDJ5ut/vLVCOud6KsjdysTKQWB0pr5JjLAG/+PtMzVwPPrbzKAQvHpY4yvqMbM08bvI1 VBEIJ3JssQH+UKWVuZUYnTxyDf28gEfcxqD0ko0mRx9ellXbypJcPJHBKrVIIWrWRnasp9IKiSGx t4+btb6g8e/OylCFNOnljIU9ueg3rNwVNRUrWyVXgqBpppE4ZBSEeiNEb1RpLbV+eb+0wJFc46QX Brg8OoOTzkIAPmia8XqZnDagikIhQjSST9eeR73Uniek2OgO3XuKMYvc5iEUiPh8r4tKKAG+wnVQ OR6YgeBb27CpZxTy6o7UGOtUjMknM5ck3JymQN/63qpfpf8AHtY9MU6Z6bfdOvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+6914n0t/vvw3v3XuuNObSBr20+q/+tY8f4+/de6FWLMxNT0fnkr0 dqePyGmoJp0kJuCFdZdDjUPpbgj2yVNTnHVSMnrDWVYZwEoM2qC8gkbEm0lxwdEkBdEJ+pJNyfdN JPmOvV+Y6T+ZrTV0szMKhfHDAqieE0wtLOgIiQgXQCH6/wBfdlUgrnz6stKOfl0rtjEyUc5uzCmk xUMcMoPgupqq2p0ycFHaJbmx44Pvbmn7T/Lqp+L8h/PpN4BYqnI108iOqmKOoSVXDfbTTVpqYJCW N5VUsoYfkfUe6y1CIB/qxTraZLnzr/q/wdP0Ukj/ALr3kmBNO4W8cKxGYKsdj6mZpL3P41f0HtrA xTHT2Tx6yTQ0yi6NoleGRvoShaOMtcAgAfSwI4J92Uk16ow6TlRT1Rd0gV5pAH0xSlQwdB6zGxPr SW/pT6/4+3QR59UPnTplLu0bQTSsqCSQSJJEVankWwaH8sqLf/WFvdvMEDrXma9RpKKOnVGYmZ3L 6IgpcICupWaxGpufp/j7uGJ49NsTU0PWeGhEnk8jtCAFvHTqrMOSNElrIpI+ouSD9fdvl0yXpwFf t6kwQhFaKnqEpotbs9RJGzzPqJRQum2o3QhVB+vPF/etWadbKllEj5Hp15zQwstg1ZLoJLVbFYPI QACYYyZrWH0Zit/fs+fDrwBoaCg65PXzyKIoAlOjix8SimiBFlACxAE3X+pBP59+p5+fXtI889Ri iRqslVOFuQ6RMvN7/XxoPIwJBHAsb8+/V8qdWFWrQdSpUWOF5Y0k0iQRrrso8cYLOFT6AhrC3JA9 1DVJ62UK6a8T0xTR+SWljHLPEC1yD62uSx4FvSB/sB7t04nBj5V6ccJbRMQrs0UVXLZNVyVprR/p I0gO3uj8PtPVgO8sfJelhs6tiiySQN+0a2laCLkGJp4ik0Ki9wCzxEX/ACT7TXS6oifNTX/V+3p2 I0cVPHr/0dA6OaWCRZYneKVDw6mzL/UH8FT+QeD7tjpilQR5dTmkirmGrRSVrWu44pKmQHi4HFNK 39QdBP8AT3WhH2dVAoD5r/Mf5+oDI8dR45VaNwwDArq06h9dLEXve972974jq44VrjrixILD1/04 HJUfQH6m3v3z62M46kU1RojlhZjpkUpo45U/XSb3IBPKng/jke9jzHVJFJ0sOI6coNVTSqjudaAw mQgsyFSViI03+oI+vBF/fummoGqBjppljnhfxyIutQ0asR/ZTgqh4V7D6e/dOgqcgmlesK3Fze92 5u2kmxBB/wCQf979+6sc9SaYr5HUn0spv9fX/aCtp/F/ejw+fWhXHWV2UJEyhVKgqSVJAtIxRhxp LD3UZPVvLHTxTZM0mPjh1ytGZKiERqNLlQ+t5g5HLESgW4IX3UrVjUdWPDJ66o8fNlAii1HjY5S0 rO/7kzgr5PGourSIh4/HvxbSfVqdaAxjrNk4cHQPT/YVcstdSyRmS8bOs2mb1CU/ojcIfrc3+nvy ljxGOvEcR5dJ6gkWhy0LtpIpqsg3vpOhmX8XuCfezkfl04cqelHlzVzsqzRywjXDM8sq+No2ZSqg JewDpdv8bf4+9LT1z0z0ww1EFMk6PA800iSRI910pE1wOGGpXUn8fUH3cgmmcdbFOmoGwt/rj835 PNufz731ama9KJqplio3LRG6UsrJ+4xm8KNFpcD83j0tbn+nupHHqgFGJr/qr03/AHNXXqlMXK08 QRVp4V/Vp1BB4k9c7/1Jube/BRWvn1d2CL04JiZQgnraiCjhI9COdUrqfoIKeIMzmx4H4/2HvZcD FKt8umVDP8K49T1llyRo0EWIpjRKwVjkJgJK+Yhm9UcgutKoPFk5H5PvWkv8ZoPTrYCJkdzf4Py6 a0kUsZJEkZyfXUQy+ssLlndH1eQvfkm3+v7vTrRJP4v29CXn+rN+ba2ntffWTxM9DgN3xGt2/kJo Hp3ykCTvFE4iYAaZdGoFbhlIIPPuvy6VwoUTWcN+3pDS08sEkk85/wAplP76fmKQgeg/S3HPv3Wm oTUdN1/F5B9fLcm3H9Rz/r39+611xEYhQMos1he/5v8A8T7917royl+JDfji/wCAP9f/AB9+691D P1P+uffuvdde/de697917r3v3Xutpr4p70/hnQnREEZRBTdZ7Sin1toSXTh6YBH0nWy6fr/r/Ue6 K7BmocdG8bUhjNc0HVgeD34a2go6OeqaghWqE8dFRhY4JfynkZCSR5GLE/n8nge3gTTIz1QSmp9O hZ2zuJZKmWaeZ5jHMrLA9Uwg1P6A8EZYC4vexYC/NvdgoINR08GOKjod8Lu2kxqMtMAW1LJNSBV+ 4qzIscsjVVRLMGcRaQADYcXufblVVfTPT6tgHrHund0GVaCSlhkpBVRFZ7FVaIkFGKKWOt2+oY2t +L39o52LA+lOltvOFK18j0AW4Mo9AKd6dkeinmKyCRI1dqmEkWe40RseCfr/AF+vstKqPPPRv9Qz ghQKdBQu+Up6+eBskiS07+WUBzPI0iyLpZSSRp0MQR70x1CnTtvVKMR0rKHOpXVVJk/4hC0NMKgx SVEvoiklCiwjU6Y2X/VSAkXsPddERPzp0omuDpqAK9GO2pnoqaixUrocXPTz1VdVwtD5P4zIaU05 keZpS/gkYqyotiwH045uY8UBz0VSOzeeM9MdfnDJPT42lnnnqp6yesmMjIsarUHV4biOJFihPKk/ gW5Nz7tGMhTw6RO7Amqnp5xm7csq5TGQwo8pjvJVRv5oBbhqioaEM1mAAso+ot+PZiigAgMCek7r rPDoKt21FVTrE00rV0CSGukYIulWdlHiSNNRChrWDWIHPt0ICDjPSSdD+Y6dKHcmdyVFkqc1k1HK KKn8awASRiON1MiVBsECwRkWKjUTcWPtxABQUz15CjZIGrotfZuNkleqqKip/dadCs0peYCapAjW ZUYxtFKw412XSp91l7k0gf7HTyvTI6LBvPErHX4qnpPCEkMQjZhLIfJciQxu10bWFIuARf2haMag KnPShLt1yPLrJhfu6SenZqWhkjLyLMk0ZlRUWQCGljp1Uukjgkub2J5/w93KKoUk1HS23vg5ox49 Bl3vumKsxMmCw4gx0Lgmtlo0VZ5I3JvTKx0xxBSDq0rz/X2kZyDQDH+To0YRMhJ4U6qs3hjHkq2/ yZ5KaE+hVYs8kas+rVYgOdSg8H6H26AzA1HRDc6QxAHScw+yp8rLM0iyLE6lo4jqUR341SS6ryFe Bb3sOymo49E8sAOTXH8+ljhthVUtTBBT0YY+S8VmZxP6graQoJCpbm3093aaooBTpG0HcRXHQrYz ZtLSK1DJFG9W07CKmCln9YCrrjjA9Lar3P8AT20McenYUK+VBTod6XbtDs/AGmSlgnyNFBDU1ofh W8+tgqkXJlAUki1wSPp72D59KwpbKjp+bbcVKtLkYVSOTN00NXTAv5lEcyAiWM3AJW1iB9Pp72CQ ar02f4WGOlFj8TWVlBJTxTwRwRxiNysQjlksxGouSQ/F7D8f73ogny6sM9oHWCTa6LKhkdaiNoyr T2DSjR6VjmIUKpP4/wAPdWUqK9Pm3JFFPTtR4OiZkT9lPIfTJpF4gim4KLZtcv0A4v7pXViuOqGB 6Gmep1M+OoZ45Gc07AFdbaokswKg6EIAlDWst7+3RWleveEfl13k80FgipYj45qmXVZgWSYoACYg LcFR9Prbn3UrnHHplhQ9NbYioqSBLAqRyFSp12Zr2dmVfWFJtYfjn3eOJzmnVG+EinQtdZGLE5RZ Ga1PSeqo9bhUdFvEUQWUFSPqTz/Qe1GiYLQHH8ukTrQ08uh0r94nKzxpBWeVzFKK53caEXhiRC7B IrRf0uffg0tSNOPXq8fHPT/it4Jrpo5f8wjfuRoSQ8cYBVotR0liBcE+oH6e7OjutCejCLUPM06e uxNwU89NMYJAdEVLNStI2qVIPEupGKkamhYtdmFyCPqRf2kaMqckV6uwYHzI9eix0GTiqM4RJI4m c6AdZAlDk2Ux+QcBRfUbW97AHBq06a7q4I6W1TkJmqHgWubwiJFiWPSEVlYCwJa6Agc2NyR/T3vS K01V6VwsdJx1AXKPBKrvUiExa7zsRJIyqpGmxsxvfliP9v70VHkerSGiny6mwV1NlaKAxzyNPTyN I+sIPJFGWaEq/wCplW97Ece7x6Kdwz0WSqW4dJ3OV88tJNFDNDKjNEksjRMtlkZm0CzDSBpHq49u 1gGSOk7I6/Z0BW5MippspTzSMDJi8rLYkJGwFBOgBYagjcf1F/bKMiTce3plyTjrWnzH/F3yn/ax rv8A3Jl9qeqdN3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de64P9P8AY/8AEH37r3Xo uXA/qR/vY9+690vcDlKtIZaeKYQrTEeMsNQF+bgWJuLf7b201dRPWjQqPt6enydfKS9RMSQoAlD1 PkOkXOnSiRcW4449t0J6pQZoOkVlqjyxVLEswNVTwq0hJe0cM0jrck/R3/3n/H3dRlfsJ6cHwPQe Y6XG3Y3o8NUGYiIy/wAUroyshqEeKkwLelo09Ucg1hSDY2PvTeWf9VetefD0r+XSbwAkipZ6mMkK lVSeq12H21O0pQk6k/d8gXkEXP8AW3vU3FR8j1aL4Wx59KvzPRqPKjGZonqGMaGRGkl0+NNPpIId ivPAN/bPGtOHToz1nhp1mpqhnQl4KdoJEUmQlgpaUQG9g5DG5H6T72OJ9OqNj7a9NU9Lobz07y1c MSMsiL66yLSiBRZeamJiLah6rj6e3Aa/I9Vp0wN9q1bTTIYVkaVjUfWTzyAsSkoPOvyW1D6W93Gq hB4dVPy6bqynqXmhiV1u2oO5Uohad2s5cXBTRb6fQD3dTxx0yxUcePUmOkgV1Dzz1Md5nKIWgjka JVCv6Tr8YYHkn6c+7Ej8umNTUNFAPUaeQClVVUKss5URx3ssaAApaS4Egdz9Prb3pcsTT/V/qHSg 1EUYr3cf9X7eo9S8dIItY1CRZCIkIuAshGollNgzkkDkXHu3VFUv9nUGbKTuGWILArgBtPqdrfS7 texH+0hffunREo456kUkDTxUx1DVUZGNZJXI1hVHABJ1Mv1JP0Bt7qcMfQDq5IAC+ZP+r/D08ZI+ jQP1aXcgnTJqmks1k5UmURXDcXB9+j4cMdNyn9T7OmiZHWupHe6rIFW9iFKgBHAItclTY2/Pvfr6 9aX+zf16y40xQ0uVknSXxAwU8gp5RDIUln9UasySLe0dxcEG3PurZZB08K6SRx6dqegWqVZsFkpa 7xrrOPZYqXN0bJZg8FOWaLIKmn6wNq45Ue9n5jqgND3YHX//0tA4MhBSbg3ssn9P8HH1K/4+99ME HivXBg0XpZeCPoblWU/Qj8Ff6EX9768M+eeuTP5AA7OSqqqliXKov6VF+GRfxzcf63vXDr3DPl1z eGoCrOoDxmxDRtqCk/2HA9UbA/g+/Y4dbDDgePUXR/vV7Nx/r2/wv791bV1Mp6n7duATGXV/T+pG tbg/2rf0/PvfTbLq4/F1Pkq4J4pUeMyDT5IGUjXHJz/gCAD9R/T3rh02AykdQXpv8kWpU61Oi5KW 0ktYqH/2lvrx7959OBqPpPXCnJMsVh6iQgsdFzYrbUbgcH/W9+OQet/Ca1x1zKurlHBU6dYBWxsw BGm402On8e9db/Pp8xM0QirEmiaWWGSGqp7OoeN2/YmILGxuFTVx9PdG8vTq9cdcKfz1cslBBNJD jvuZZ28XpZQ4F1MrchS4/PF/fsAAkd1OtVJ4dd1GNghhqFZZUIcmCYSM6sjR8JLCUOp3f6tq5Hvw c44da8x0zcLkaWfxBUqJKeoSMCw/dYaggF/QswYD82HvZ4EV6cHw9LTc1Uz01BBNZq+rlWSZpAgU U8EZSFwFP7bOH5H+HttBk04DqlBQk9I4wpIreJ2lchBpSKypp51zSN9PUv0HNufb9TjGOqYXic9R Zadlb9SGRzcxoDwxPCpYHWxv9AD731sPq8sdKNMLl4qCjfJUc+KpJPuJaatyULU6yRN6QaJHVaip ZXckBRpub3A9tlgKUyevKVZm0sDTj141VLQQrDj45hYGR62SNGqpJm1KwIi1eGLQCQLk/wCJ967m 4mg62VTVVsn5/wCQcOmbzM7KagSSxyOSHMmlprsblZuUU8+oD8/X3cKB5daZia6TkdOCVv28c0VA 0jUUzxmSjq1WWQBCrWNQqoUDuWuRpBX68+7V/Z0wU1EFsP6j/N1lxVFHkMnT01QgpgZQz3jdHWBp BrMcyaQ/jX9OoW966djUkihJXz6GDsHvHfu8dvbY2DuCtpKrb2y1Si2pHAhT7KnprRQRyG/KxogF v6e9CgJ6XNJxAFB0GGcqI2U3jb7yS0lbIT+3LOQt3hAHCaR+ffumR0lJB5WjZSVEf1B5vYg/i3v3 Xussc6yzePSdP0+v9ByeLfke/de651NDI5DI6hfwOQfx/j9L+/de6iPSvELu6n/Wt/t+PfuvdRWb T/j9f8Pfuvdc1GoDmxP4+v8AvPv3XusjRFVDXBB/H59+691f78d90p/oE6sK1iRPS7UxFC6qV1f5 FAtMFsePSYrn3RcFvWvS+OQaUB4U6Nvsjse9SsazrNHZJPIXZPFwya7WsS9j6f6Ee3g2Knj1cyKo Pr0O+2ux6dq4xfcQkq1tMrlY0Lf2tf8Ax0jIuLfT3uhArXHTRkY5rjowGC3c9aymoyTVMrEhpRII ig0iwZwNJVT9PyQbe22rg+XT8JahqesOQ3vT0EFXPLllM9LDUTfbVEhRJdPESIoPpseeOSPfqJwP S+NDQNXoNKDedLvjaNcpqAtZS10nndVdE8MZJWZFLagJWJU3/Iv7SSQgsT59LY5ilBXpI4tsVHNJ LXIUaEapGJ1mRSSNLc6lYlOL8cf0HtvwlNR59Om5ZaN5V6Eb+LY+iXFSbcpzWzVdR9tkJGiIWSlk OgyQQDULov0Jta3vS26149W+r1eR6EZdwVdJTfZ11QZKaNHNL5nlFTcg2csh/RSNZgPqWFvp7uzK i0A6dSEykEnrjnt3NjqejraiRnZoU80sbBBNKwHjsALlCB+n6X+v191j/V4Ch6tOiRDjnpx272dS Qmmgjop4hPCwqJovVUSR8tpktwhLH6jmwHPtbHE9QT0gLCuB0iqredViaHI1+5Q8+Jr8zJHSviI5 55qeFpLUtLMJFLGZQNUh4X6/j24w8+kswNdR8+n/AGvvOn0ZaGOopVjnKRJVKDqNIwZx9vIwtrZQ Cw9+Unh59IHDVwOgx3ZXuxqZfuYKuMXDS6HaSopw1oi8ZH1Rubj35iwz69eDOuM9AlkBk8jVU0LQ 0UeNSNpRI1yysR6G8hW6Ffrb6D3pdJrqHVg5yG6TWXOT2pRx5OJlySVlQUNYkhlhpo47l44wgJdn IsSfp7ZkaPyNelCFga8Oir79yrbjyElUsJp2heU1bSroinRhpZ0HCrpB+lj6vbOPi016XxzuQELU HQJ5fEbepse+gvVVCIJUlkBDXnIPjVlB1AW4/wAOPe1cU456syE5PDpMGKryc9OkFMKLH6xEqoCz yG4CvIyr6FDD6C3vxaoyOkVx2KQOh5pMBU7d22KnFUH+XVAFLHlJIgwpllj1SJTLpa00hP6jwB7o QKinSEjUM8emXa2y8tj6uPcWer/tZayQ3kkF5FbWbmUvZYoytrc+7qRjHXiDSg6MjBsilfGrlppI q2mrkiWWTgR/byEWlUjlmsv1P9T7UggqdKgV68niA5OOk5vKux8MmFELwStjlOPpqOmuRDSxEBFk ZBZbsxJIvf2nYLihz0p06uPXPFYOsmqIJq/KCkgZ3lihgLq0rsqqLWFli9XqJ59+SUrUUHSfQC4x 506Xv8OxFF5mfIQPUfblVRG1ESE8GQEclr8e6s6kivRglQOk9V00rCOSnnhkaRSwIQjTPGbF2svq VP6f19sqVU101PVmA4gnrDVQyTU4amSKSdBrcBToYqQHZgVuCpBP+N/akBmAoOmiyqTXj1gx+zoa mtp8oGkqK2Jy0E9RLrCOxPlaCnUrHFEFOkXuSPetDChIx0nkJbupjp9npRHTzNUxx/suZKchyunQ RbUoNm9bEkfS3txpxSiDHSanTzt/KUaUFdVCBTIAkLqF/W6twQEHq+n1/oPdVkfzz008ROQepGKY 5Gqkl1T08i2UCYMsQ1XIIJHqHNvbiyFq6lz1aOAk/F16u3FUQ1Qhi8tOaFyh8LELVIqkuyi3AZuR /X3R5Sajh0bLbNpDUqvSjymdasxCEShvPAjTcEya9Wp1BHIW5vYfX20KEE6um5CUU0XoKafKx0ma WdUn0RkxS+l7yg/RkYj1qwP+wPvwp+XSfxQa1XpTy5Wonl1I4EazEinHolCyCy825PPI+gt732+R 6UJKtBQinTqpnSI1HkjCvaEkofWLgiNQw1fTgn+vuvmAOmppQRQHHWCkr46asihkR0kkEjDSf20I DfukWUIASAL8H3skg8OkMkhHavHqMcmUWeFdVTLUzR65JyqpKVLMjsEGkIhsD/T3Uipr1rxFK93H oP8AO4qor4Moh9E0lDXooREJdqilmjWPkEGLyMAv+PupCihJ6YoCM9az+cHhzOWj/VoyeQS/9dFV Kt+Rfm3tcOHTHUBV1X5tb3vr3XE8Ej+h9+6914c8e/de6yeP/H/eP+N+/de6xngkf0Pv3Xuve/de 697917r3v3Xusb/QD/H/AHr/AJH7917rnEtmDX/AP0/xB/r7917pRYqTwLOxDetg+pRJpC8owd4+ UA5P+Pujgih9eqkV6lzV0AUKs1M3N9WqtZuTzdQFV7j+tvbfHrdDjphqZGliRtQImrZZAoFh6Qiq 4uSQp1fT3cUDfYOtj4T8z0uIJJI9uzVDMFEmNybIgXwtJNW1UNALyKNUgEUZI/1QNvoPdSMgfZ1W uWPnU9d7ehLY4KJBEKmvnsAWI0wtTqGDC+mxh0gH63v+PdJT3j5Dq8YovTxLK7IY3aR/8p8S6gOI ybMP0c3MSm4va/tqgrX0HTox1ljR4MVX+JmcOKpSwe4gnb0tp0i5trAuPrz72M8OHTbEAivSOoMl JHUQRVSNG6sqeWAMoe0LCFGA58kbp+Lkj2+yChKnqoNcHj0510FK0kz1VIRUrDUVLSKPAzvOwFNL YlAzLKOSP7BI91BOKHrTcek+4hgmZan7poIg1mi0q89QliwU+pkjW/4/Fh7dXIHSdw1SFIr1OqxH HT2aH7WaQKEp3cPVShyrB5RrZo0dGFg3+292pQV6bUF20g1zx8umyqU6qOEMdYQzvqH1eQPI178D 9Yv/AEt70nA9Pykajjy/w5/wU6acgrSVfijDOIY4oRw3pKoGkBLX48rtz9PdgPQdbQqiZNOo/wBt pUNJIBeNXAUEkamKhW4FiLX/AD7tTFevGXu0hfPpSUlojj1DRr9vS1lUfR6kZovEBIT6SHY8G3F/ bLcHP5dOCpZRXy/2f83WKsAaq8RUfWKE/QghUBkupIY6Sp0sfwbj3dRQA9MMalj5f6h021hk1QVM jEp5gIwfroUJ6lBsPGSpA/wHvw6slKMo406jCYCjrIlP+eqqdzc8skYqPx+fVIPfqdwPlTp2tAoP HrhAHAVlur2Zo2UlWDXCq6sOQyN9Le7eXTbHuPX/09A2YAlh6r/jURcgf14t78Om8A16jpMQAj3e MX9N+Vv+UJvp5/H0Pv3W2QHIw3XMqti0Z1Jf6flf9cfj/evduq5rRuPWaCeSnfWmhtQs8cih4pU/ 1EqH9QP9fqD9D70RXrRAIoeHUx44Kz10gEExYD7OSRnJZ/8AlWcj1LrFwCbi/vWRx4dUFV45Hr/n 6gNHLE9pAY2B+pH0IJBJH9Q3+8+7dWqrDGeuZs4BIQN9C8fpLXIFyPo55/wNvfutZH2fPqbTyhIa mjlK+KoSQwObhUmVQQDf6ByB/sR70eq8SrjiOPTWDYg8XHPJ/pyL/g3t73075dKYoklPQTTp57rI miJljIhYqyMFNmaQc2/oo90PoOm66S3WKGklWcwUslnmjqEhD2Ds3jMqxDSCXmc09h/tR/x91ORU 9XDca+fTrjFpVx5tIFaOaeTIJUOsca+G3gW36nXQdX9S/wCOPdWJqD+zq4H7eokuXo/E3haolmHo T9oeBUKm2rURqZSf9e3vYRq8OvMBT59J+V5kjx8hIX7YlYm0gMi+dp1BHGoLIWIJ5INr+3CBn060 rVqOn87dyf8AFaOirVSmqKqConX7ydXuix+QsyU5qHjSSMgpcDUDf/H3oEY09NeIDG7VNMdCRi+r quWkXJZzLQbawbFbZTKJJj6KqjAYiKghRZMpk6mS3oWNFjN/1Ae/E+vSM3AqVjTW/oMn/MPz650F ZT0tS9J1lt+td2cePceQoIv4iyRRBpZYJpZJzFGzKzCODQ+iwZjyPdasQR5dXKiga8kHn2g4/wBk /bjqNU7Iz+c+wlevaurJ5Jqd0chq8XJDmiWtenpp4fTcxI8cq8gKxtfygVApjy639UqaqLRQP9XD qFSde5qojqWwtZh9x/aEitTHyV0VbTugJdaikqaRKhGjLaX1p6SCPpz7vXNKdaa4TUNasteFaH+f TfU9fbmVbwYeqkjlZRDLBJR1MFX6ishgkinaKZY34KldYH9Pp79+fWxcITlxj7cdJ/JbbzW3mEGc w2Xx1bKQYo6nF11NZRZkMLTQxeSGQH0vC7hh+OPfiaUrgdOq6SfA4I+3/V/Pp0joJ1xNPHRF4amt nFVJHLUeWSJIhKkHiRkSWGOYOWIIubi/0976WQrQFjSvTdBhxHQR1FY6/cCqBVGe7frNz/Xn3rr3 XDc8sRnRYTwsahrAD1/Tn/YD37r3SXRyEN/6/X+n0/oPfuvdcYTokD/Tkkk/n6/7D6+/de6cxNq+ jg2/1vfuvdQaiXVx/r35/N/9b37r3UK4bVx9Abf7z+Px9PfuvdeR7fU8/jj8W/23v3XuspcsLXv/ ALH8f09+691Yb0T2fJTdWYvFJUfvYCqraSSHUL2aolnp1K6tRT7edfpYX90p3dKENVFTw6MztbsW pSJaiSeVEDEOdTAspAu+hiGYW+n++Pu9ePVyRSg6G7F9qYyjoZqmWslarE8Mismp456cxsChVFMv lVv6D8+/D7Oq8OjRbA7cTN4im8TyUU8tPHIizEJUgyx+oVI1uEZQOV5Oo+/HqySFT8upuSz807ua ursCpDTE6yCb+tRqOoEf1uPflC4Pn0uSc0FDjrBgdzyYiU0lNIZIJwsbOrg38nr1s1xGE1Ne1+Pd jUg049KFcsDjPSxwmSiiqMg+Rn+9nqpEeldhGBEpQxurAErMApv+OTx7Y8M+menCRTj0KeFzdJRQ wzGbwrFcqiOqNGycFH1adMbAf7H3vwwB8+mvEoT3ddZDfEVTO5gqm1lGQlbMvhKkyOpLM0LBQPqO T9PbJiDcel8Vy6jB6aMlueP7GNdZlqA4XxTlmSKOVwwZ0Z7eRyT9OVHt2OKgyMDpuWUk1Y9Z8Fmj R17mqr0hEmsxhHLGFbcxRgFvGSTz/aPFvajWRUUr0jZ2JJFenLM7tizmKg2/FkJKOKo1iQNpDJTR lyWcsw0GX6fqLEHn3SvEHrQc+Z6Que3FBhsdRUeCnkmqI5fDJX1suinljY+R6laaLQHji8pjGoBi E55N/ewQpBHDqrUNOpGQzMmax0bxVIp6qOKKIyJGipUFFHqWFXvGrE8Dg/4e/NJjh1oLwz0np1qc pQVtPQ1ckWTqcc9IS6BYKSrikjdpWsxdo6mnv9F16zYW9tFlIpXrZoMmlOnXC0bDZtfgphGlS4D0 BkePxUcUbf5S0kcrvPLVTMfSqm3PI9pHX8S9PxOteiGdtbRz8WRmxcVSCuuVlZXeHyxyPrkjDglQ t+ASAR/r+6oWyM9LqRkVHHqLhtlVOQhp6SvWNKXQiIaf165URIwiyNo12RidVuCP9a9vCJNa9NCV 0OcjoVcb1jSQGlkLwRiBlVop+FMYW5CKsn+Uzk8EsQLc2/HtQiKQQeHTEuqQ8MdCQauKSmpsDTtF HTwIks9SYwEBjDLFCvpOpF5twCf9b36SMDz6YMNT0EW/qRKyqpqFJVkWNw5WRw0coUjTdQdLlG55 4A490C+QHWzgU6GDD5ujk2pDi0jV6xqQ00iVIKKGRNDOtmKD9Iccm309uhqDSR1oLUVrjoPMfi4l lSWpAqpqRyrQ+O0Oi5KsGGv1KvH9rn3SgPEdOcPxZ6ErFxUFTCxqkSGpVmIGpT40jLj9oKLlmv8A Qf4e7KgY5GOqkqBxz0wtUw0tbXKYoCivG1NUzIGapDDTIAjC6SQXtYk3vx732Dy6rVuNemzLZf8A hbxyIGKw2aKnRRHrqCtzdWZmLW5P4PujFDwHVvFx3N0nKbcFQPLUP5aISkeSUMJUIZrG68aT6vod X1596q/EcOmXlUnHHpXUm5cVS07S1dYqIQwhjOkExkWLF0Flke3HFh/X3RmcjB6qJc4A6DrMb3pq 5pKWnmMc0bs0Gpm/ylCL+Mm4BKMB/Ue6itMjPVZH4UHl1C2tumeFJIZtbwKwPm8hREPLFTa7soPB /HtxXp5dNFiehGx+742ZtE6TSOAkVOJCTExB1vqNtYt9Bbj24ZWHT0bAUxnqPU1cU5krIqiQvBIW kVgQj+PlvSCp0KTxxY+2mBYjOOjETlUoD1Poq6VqcrHK06EAimWyeO4uzC7HmPmx/obe9rH5gcei 2e5NSK46bzUzSTqER1QAudC6ljkbkGRmNgCBc/4fQe3TEaYPSMzEkAHrhJX1MAMjpD4wWUyIwViA wsNJbUz8fi30591ER8x04rigPn06U+TrJTqapaWS6mzcxoNPHpjaw1AC/A92ZCq1B62ZAa1GKdY6 ipkhUtG6yTToxknlJIUObKpAcH0n9I+nHtsxtXA6TlgTUDrisppaYkSvLJMkETuGNoyWu0iBmPBA twP8L+/MjAZ49eHUXK5KmRQGM0cx8ccYp9WueUAFhGAUSzgcgcD8+9CAvk/D1YPpWtOPVD3y32JB sjuXPNQRLBi9023PRwIYgtPPknY5WlWOIBIY6fKpMEUcCPT7VU0gDpOTUk9FsBI+nv3Wuuvfuvde 9+691mckDj+vv3XusPv3Xuve/de697917r3v3Xuscn4/2P8AxHv3XusikgC39B7917pygkYmOG4C zCx5IUNc2Jtza/vUlNKnz6fWIuuB3eXWWSgf1vFW0QEaF2EU4DgKCTZSxJPFrfW59tgCtCK9J6+X UUQyy0UEsTK/geUugN2BLCQkj/VWH0/I+nvZIDGvn1bioA9elnVN4dsQoQ48lNjBYESCNZ6hqplZ rgRh40JUDkXt70Pi/PqhyCepmAmEWKpyup9CVEjxaBZWmdvU9/wLg3/IB9tS/GenU+EZ6mz1YR3i e/opUtIkg1CeQv8AtxsAUMUpF3+vIHulKkfb1sefUmi+6+1hp3QxxxxzIroF/cWS7FXNjbxu6m/1 P497PEkHrR6Y6vGihylNMzGeJaqkkeKf/NKae5CyOosglcMefoPz7cDVUjz6oBQ16yZiAT/cGWt8 xkqIoYjUyRxpFTuktXFFMNQUrGr8lT6z/j70DQ4GOtcBUjPScWoaiZ1ERDTwxRxJDGUU04YO0mp2 LqjhfqTcj2+OkukNU18+uDLLKA80is8sx/yeDSQojdQPJK3qkkJa4/HH19+JwerxjvUL/PrhI4mq 5AWjYnWiODpiVSCh1gckAC5At9fexhQD15zVmann/sdNskqyB2ksvL+OJSQzNNI0hItzoiTj/bD2 4MCnVaHVjhXj9mP59YQWKlRcgugbgsWIXSqsR6UFmNh9Sfeq/s6uFGoE8f8AP0oowXqKgA+hIqOk YohuyakqHjNxYn9oXv7ZPwqPMmv+r9vTow7k8AP8HWBVepyMEa6WeR55HZmA8UTEoHkaRhd1QC30 /wBj7c4AjpNwRmPWXO0sMVGQshkkhmi0crpEJVkYIOGsHt9R/j7158evQsxfIwekiCwjcf2SyX/1 /Vb3vpUQNQ9eneKIxxKSbsbonIOlYkEkl72KhpZRyObDj3vphiDXr//U0DXN+L3Iurf7C4Fr/wBR 78OmuobCzEf4+/dODgOvIxRgVJH9f8R+Qf6j37rxAIp1INmtb6m54HH+uOBx7t0zkdcwQPrf6ggq fUpH9pWFvzz+PfuvdPC1cM8KR10JmVLaKuKQpUre9jIoDLIFP1PBH5v71SnTZBqSuD6eXWKWhsol pJIqqNl5VR+6tr8yItrnT+V5P5Hv1et6ifiwem4syei4df8AjnIAQG/ojjkH/evfvn1fBzTPy6xM QGbSLDUG0khiBb9JYcfnnj3vrfEDp5ptMlIsgAZ4PIpDXY6SNN2vYC0VgAPoD7qePVDXVT16kRVB hqKaouSUqoZLx2sqrp1qw/Duqn8j6j3o+Y8qda8s9MtWyxzzp5DORPKGILBWs7BXYm+sutj78DgY 6f01zXj13A0a2mqSfyYolCqOLXZrj6EcAgE+7dNvUnSg+3rHUy+RARqAaQkDSwWwFhdz+s/7Djn3 o9WjUgmvQj7N3FPRZXE5amo8UlbicfNSUVRn1NVQVeWaaCMVECzxJQrW09HJGESoZ1Deu/KKtSSO HGvTM6LoZCW7jUheNM/nT7OhVhpP4tlkzW7aj+8ucRStZit4eYU/ruIfsYY5o6eGDS2mJGDRm10P A9+DZJPxfP8AyenSHUVTRCNMX9H/ACniel5R0EUFLDLgKihWBBKIcBkah6uiilpykbUlDlYQKzHO nmGlJB40A+oBv72acQadJjUsdakn1HHPnTgenmkbC5XIx4jcFLDj808UmmKrSWjXJCaMrDU0klOJ kmqV4JkRgTp4diSPewyk5/b5dVYOq6oySv8Ag6j5XDPj5YKfLUIpNyU8JfBZbF+TEZ6pgWMlkxO4 VFLRZ9G0emlq4/ItyCePdxQ4Pxf6vP8A1HraliCVPZ5g5H5jy+0dJUmpfzU887V8wX7iSalop6bN LBZ2qU3Nsid5KbM068hqvGuJ1axEZ96pWtBn/V5dODTgjFPzH+1biPsOOnBIZf4SKyCeCfCyyoT9 tUVWa2pkJYInjqMZWY+ZaifbOXhjuQk6wPflSDx7rTFQMfy6dijMkqR6SGJ+wj518x0VzNTGlzFR lIK1Jpmq5UaCEuRCLkBLMTaFPoB9be9jo/oBgcOk88lVUVAcTMx8gkEbE6QxIawA/HvXTXWbKip8 6/cBA0qB7Le3+x9+691BEQ08lrH6i3+9cX+vv3XusbLZbA3t9OLX/wBh/sffuvddCR1+h+v+Hv3X usUhuGJ/J/4ke/de64qot+fUBf8A23/G/fuvde0D/H/eP+Ke/de67Chfpfn37r3Qh9f7nlweQlo2 kK0mSAUgmwjqU/zTj8XkHp/xNvej1ZT5Hh0ZPF75n8scYqAEEdiLkkf8j9+r06KDoUMLvjxKhLhA bMSpuTpPH4JI/wAPex5derx6MXsHsZhT1cslQY+VaNmY3T6WsB9Cbe/dVJ6Fel7NWan/AHahGqmH jLPISBCWJ/PCk8/T8+6HHDpRGy/n07UHZVLDDIbhZB6JWeyhgpYxyfk6mPFvbepwcHowiKEcenik 7MYtH4qkLJrQMP0hfrqK6b2I4A9uAt5nPW3Ipxx0ItNv8VsSwTVkrL6JJnuwjjUfVBbgg/093pTp Nq49Oy7wgXW1ExdG9B0MQ5c8aZl51RKl7A/Q8+23Oajp1HNOPUnH7iNXS1EInmnipyCzzytJUTSf pszm121jm3Pvyg5qcHqxkzTpTUm4cWxeaqcJGkbag8rq61AQkfuE306+bHjj3XSamnTq0YDrgm4a ltEyymIR00zROG1yEVHBZNQ/Sw+p5/w93qygV4dVYCnWeoy2Jq0hDQtMYV9WuRx5GlUAaha5ICnj 6WHurEHj02KjpkgyUMVWgBLJNPEZo1LesQsCviP0VUAtb3cACnVSG9en6s3AcdUVFQlVChkRBCiJ p0Kw5Z+NRZD/ALce7H5ceqnPGlOu6askj+1rKbKGczxzmWWoDhaWeQq2mkjX9cMgFnLc3t7bZAc9 bD6eHQabtmgNRJV5A/cVioylFZZWhkccAsotqKn6fUe07jTWnGnSuJz+XQeybrkpYVp6aliL3Jhm ldjKkZWzMun0xnV+D/X/AA9tLJ+3pR4inpymzvnippmdvKYGZ5C8gWPSAOIxdbu17H6n28uqvaet F0pWnURN3BFkSGRmm0rEoMfqJPJBNgDwTz7sdZpnPVPFHAJjpF1+5KoT1KxUcbSSWMcco9Ngf3JF uNSBDyP6n8+7odNa06oYy4qB0u9ozzVatVVpZYGdIB4iFBC6dbSL9VLm3092orGtekzVQlel/j8t i6vOw4Wm8sDLHKZZZQVoy0StMyQkAE1Eir6QPqfeiqjj1oFziuOodLlkfK1Y4p4aaVokeqRx52Vi riM/QOpsXP8Aj72HHXiDx6T28cwKcu9HUh1KoQz39MoB/StrvZvz707ihFOqkNQ56CDO5bK1sEfk kJYFZJKhZG8iBlGgpz/bt9PbOOk7j1r0iKveNUI56WSeSGEcEEsXchSCxH9oXFxb8+7eQ9OtDAFT 0jJ98xQ2jvV1T6D5Eu7InIs7Jf8AVf6+9EE/Z1uvn0o9v5HI7nEs1MsawY1lM9TM4jFKsgIsxNta yc8C5uPe6VHVseY6XlOYnp7Q1tjFL+88ZPpAsSy/82m/29vdT21p1oFQM8enSGd3m8tIxRIozrmg DNqaP1MC/wBACf6e/V1UHT0agmp4dONHuGrqj9vKxA9QLFCG0v8Am9vUp+g/xPvXhny49ONIFXjn pTYapq5dWpHUXJ4L86eDEx4JbSvH449upUZPRVKxfPp0qaevjp4tCuwkmJsGViwH9C3NkF/9v7UE +Q4dM9cKiojJ/dC6QGQhwRYt/bRrcG/HPHupr5dXViOJ6gUdUIG038Megs0n1ZrNbSvB1C30P9fe lJNRTrZc0NOnVsrReNUdleUqxjLAjWPwGsLI9/x7sCfXqncfs6apa80tOstWYzePUBdlJAd9EcbM Lftlr/4e9MVFNXV+kvkNwgBJpqiHWzGMU3IYxjkOrR2WOQC17/q92Vkrop1RnYZJ6q8+bMENdltm 5yKkSGSSLN42sqF1tJK0NRS1dOssjEqwBqpStrfU/X34tU0r02rFq1HRGfeur9e9+691737r3XZY n6n37r3XXv3Xuve/de697917r3v3XuuioP19+691yUC6j8XA/wBh9PfuvdTYygXy+rVBMir/AKkq Tck/n6+6ygFAPl0utpKMjDyPQiV23J4WxuYpKzHrS11Mk6U9fTJMpqfHaop9EimKZWuWAJBsfaVZ hQqVJI6c3O0EMgkQfov/ACPmP8vSMqsbXUjCWCenBmUhkpdKR2Gq6yJrcKVHHqA9uCVDhlNOi4VH DqFUZLJyUv2U6AwRywyWEIUo0EDwRqSllCeOQ/Ucnn26NFag561Tj0647cCxwRUjRpEUQQ+ZpPS8 ellAIKaVYM2rUTx7akQ11AV6sDQU8ulBFKmRU+OJWkWSJLrqYlEk1sxUWDR2JuBfj82t7ZDZ63gg 149LBnSLxRtGPGyNUhxINXkaRkljESXYsQo4/sgD34cPl1Q5r01VEDGUxqgeOYEN5WIAjqtKmR43 Jdks5FyQb/S3vderLwIPSUk1Sw+KNQIYUdkMwRjL4y0ULMrkyIGRgfyBYEf09urxqeOOm3IoTXA6 iUKtCmRqJGjlSBI1LqQxeoC3W0jjWQPpp/Pt49JjnQBxPWGJYTJqVbFVMjTqusX8fkIUE3VkYcX+ p/Hup4U+fTsXxFjwA/1f4Oo8BYJLLGrNIyPHGyst5ZpGWmV2JC2BWexA/oPblMgdNVApU8P+L6xf Z06TRQGbygzRpOYlMcSrGbzKrE+SWyoV1Gwvzb25pGATXPWvFY6mC0ABOePy+zrgr/d1UChRGhmU rDEnoii13AUD66Ao5+p91kPbXq8K0fjXp4iditRUAMRPV1U/4EZEaokTEW1cPdRa9jYD21wKj0HT lT4TnzJ6h0jFpZ38hDeLxxtwzBQV1uFIA1W/3v6+7ngOmW4DHXqlBJA6KdTzOsYZyWldi5UfUlUi RRfi5PvXAE+XW0y6j59JyEFmC2uC6MwN7FUDsb25tb3vpSxwT08aizs4CH7eMAjn9yWWTWwf+0xR Vt/rAe99J/LPn1//1dAxiTzbggc2HJ45H+sffvKnTXXjB5Kdp0uXidUkUD+yw9LH8/qFve+vBqMA eB6he9dO9S4WAZC3K/RgP9Sbq34FjY3978umjg9Zn9LFX550hwo5X8FgLBgbXvw3vwNadaIHl1xi JW+liOTwASrgfUhvwP8AYe99VYV49ZYaiWnlDRNoJIJ+jRuL3AkQgrIp/wBj711oioz05J9pXhhU COhq24SRQ32lQfr+4i3aE/0Kgj37I4dVPbTSar01VlNJTSiOS19PBEnkUgXAKMALp/TgH+vvw6cR ga+nUnHMl3jb1NdXRC2lWsNLXJsL8Afn6+/EV6048+prKY40vcklGddZdTItxrewAJKg3BsQLe9V 6r8+n2k2LntxNU5ekgpqLBxMsU2bytXBj8U1TDGiy01LPI4auq7DV4IFklAPI91qFr9vXvqI4wqs 3f6ef2n5dCdtrr3A06fcJQzbkq9HkfJ5GjqEwGPvFdQmDppWrqqNybLUVcsUKm14rjm6hiAaAfz/ ANjpHNdP8Iag9Bgn8/8AMK9JHs7EV2IgxtNkaqOo+2WCnx7x1LU/kokik8XkwD3jpDCvpM9Mxhc/ qAZgTXTpr69KLOQSFiFp648/t8/zz0ntgdhbl2RWPDh5aOox+WP2mSxGVxmMy+OrIajTDL/kuWpq mmhqClrSLoYEC5sPdg5WtOnLm2inUlwQ4GCCQR+zoa5I48p68JSUtHj6aN2XD18lR/DscZ0RpnpQ 0r12EiExPjMcv2ivey2uPdDR8U6LBVPjYlj5jic+fkf2V6bqqTIYGpgSpE9BVzMslNR15ip0rW/S tRi89Tk4bcEU0agDUaeoAIUqTz7aZGGTkdOrokDEGqjjTy+0cV/wdP8ASbtx2TRMVnaTymCZWFJk A9Pk8VNrWWGbH1J8dZTPHImpV+v5Gsce9ByBkY600TCrIfLiOB+3p+3DuTc89K9PNVJu3ASnyHb+ UiaGqoWYBp67HNRzD7SZlTUJICjrIpJQhivt3WSKfyP+rHTaJHXNVf1H+DP+Xy6z4yFM/iFr8TXN UT0NRGlPh8+vjyEcLrdlo9zwyo0kM7D9sSrDKrC3BtdxGLDBrT1/z9VYaH0sAK+Y/wA3TVuDeNLS 4nKVlRi6hN15GD+G6a6ho4Mj46OT91arK0KU0mehukeh6tJZYyhKvZjfbGvAU+XRvt8ZALk1Xy9P njy6KtI0ySz1tTCiirmYaVZWIlJuwK8lfr7qOlnrUdQ5S2sPH6OQb3txf/eeT79031lmlMrqXbWw TSCeePyP9j7917rC8mkWJP8Arc2/4n+nv3XusZ5Gr8H+n/E/6/v3XusTLfn/AG9/fuvdYG/Sf99+ R7917rsfQf6w/wB69+69137917r3v3XuuwSpBBIIIIINiCOQQR9CD7917pc43PSaBIznyBVVgDY6 hxcC/wBG+o9+6tX1PS7xe6JYtN5OQRzfgm1+QfqffurV6EXG9gVEUaxpUMvKg6W4uD+oj8ke/DPV c9LfH76mOlxUSF73/wA4QBf6gEc3v72RXrY8qHpbUO93a/kqLg6eC3HBuCfx9fbZShx08shHSqod 96ZgzSNfWushhpNvUDybC59+oa9O+KD59CVjN/BtIE5MRBBXyaXZjyPUebL7sAa/LqwZaUr0tsRv 3SFWSVTG5Bco1pguvSAef6ce7+VOnA40mnQkYbeVIqvHFNqnS7OWYBtQuQXX6adPHF/bbCvDrQfN T1OrNy/e8iQxR/1OnSzsoItpNtKn6g+6BD69PicaaU6Usu6gcbj4Pu4vukhKGeNQdCAWEZ/1JueP 6e7iOgqemzIT1ypd0yxxRFtMy6kDKGF2CoVLPa51f7170YwwyvXtZ6zTZdWpzJAzxPHIJdHB1Sge gKwtcMfr+fdSungcdOBq+XSQr9yVlcIkSV5qrWsa2OgJFqJdpLn9Q/r72rEYPWyFOa9Ou0c7lpJ8 0uQqZ/4ZQTqYdKcCNgF0LMfSzSG7cerj26ua9MNUcD1H3ZnYaalkNCimnqGZwzAtpIH+dk5MjsbW +v09syJX9nV42YAdAhNu6tCWpKNJ59cgaV+Yo7kgy3NxpUjUAfyOePbKoBWo6eLt0JGLrKufbVJW 5iIUohilq3dTaQxqSQJX40RzqNSggG3twqAAFPVkY1oRjoPIt51NZVCSnjpooAzEBrsXiQ2Qsx/Q 1vfgG9elA0FeHS6xmQWoE9bUmlCyU8lJTs0almMg1NFG5Opueb/j3sREkk9NmUBaDpR4iuk+2hWm 8b0pZo54o5FV2aNbK/8AtVpSCSb/AE9uqgXzz0xI4OSc9Kui3LTYrHzS5CCkNb5GkpKmaRPJHo9L FXNlWoA4BH0B97Kowzx6YMqr506BrcnbbUjSxU8aVtidUkRGgamYk6SbMbWB/qRf3UoKdUM1eB6D iXfVZl5nkl+6aN0KmNjp8LKOFjJsLsPbJUcPLrwZqgk9vWeTM1FbRIFhljZuF8jHW6AE2sbDUCOP px7aaMngetlwfLpCy47N5RplSjqpRFMQ0odVEbt6luxbhVC3/wAAD7soYceq6D08bf2ulJIkuXkg leou0VKNEkxGoqRUOhta4vY/j26tTg8OqGgJxnoXY6XHRUUlNDRR0sUojDCFvVUTpd4l0Cxvq/J4 F/diDpoo62M19eolEKelmSEGKRip+5iJUxoE+ocg2Zvx/Qke/Kn8XW9PCvXGHc0WNlqft0WKI6S6 W8kJ9RJGgki5A5sL+2CQCRXpwLL5HHT5T7noKuIyUyR07LYSqQg5YagyMf7HHA/Ht1GFOqSavxdP uM3AZWAjmAX9ErA6tduNSNewJtY/n25pYUPl0kcgkjz6fDl4GKW1OQ9lJYBAPwR+WNz73npqnWR8 hDpcTTWkN7PYEILaSfpyeAP9b3v7evChOT1C/iEBGnziSJdLMf7TW/r/AMU9+OBk9b09N1VuOGmE spnhsqtoRwv14+rXBJX+nuusClR14Yx0Hea3rUzyRwyyaYQpKN5FZbtwzBTc6QCLge9gK9T14/b0 g63cLStUMalyS3EdwuqxI1gn8G34tx9fetCr6daIqKeXRS/ktlKar2djYZGL1X94YnpS5uyxJRVI qgv9VLSR39+DKcDpsIVapGKdEf8Adur9e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3XY+o/1x/vfv3XupJlKxtAqG8jBr2+tv6f19+emkdWibvx0N22a6gzO1avD1M7RV1BC1TQsrFHE0 K6gga4IDqCp55v7KWqsxamD0KmRbrb3iJyoqPtHSNH3BV2SsnaVk1srweUP5AALTLp/cRF/Nwbe3 yOgr03NQT1EjrrrZJCAXcNOSxayh5UP6FF7WI+vv3D0p+XXuoea219hCKlJhrZlElMRI0qF1+pug PqIJ+p/1vbkc5rpI7fXrVOmmhr6qgEQbU1KsoYgM40sCOQVIKlf+NfQ+7OqSE0+Pr1OhJjliqKSL I03hyEug8NkaylqzpYvd4hJp8ZII/wBpbgk8e0xqGKmoPWuHUafOwiSCCWnpqNmMZdp5XqagqxYu ymJ2udaWA1Mq3+lzx4BskEkde+w46eKVsXWMZZaKgdxTJFERK7GnkmYJoaUaYw1luAw+oII+nv2t xwY9aIBFG6kjHYqZ5IITt1YPJ5TbKtLNr0FW/bWN1Mga55C2P+Hv3iyYqWr9nWgi/wAPXv4HT0kk Tx09DXUBDx1CUsUX7iuFH3EdTFQySekrpdFYE/gH3vxHP4jXrdFoRTqb/AMCjKq02MiiRdS6JJyy srg6mMxJXxyXtcAni/u3jS0rqNeqlFP4ePUao2vtymQTePWU51RGqdXd1ZH0s0sSqpQH8Bgfe/qJ fXrwRDUaePTHS4rb9UTJQqUljfRCVSWpjLR/QtavjIZVHPpbn3syykUY+XVgiqagZ6ck29joo1je PXE8SqxAqxIzPL5D4yKgAI7G6/i/+t794rk1rnrWkUpTFelTTbYxtFQTUzUNGkFVJTVGVFfJOumg gUsEWcSmeJ4Gcl1jIJLaSOLe2WuGLkajqAxjz/wft+fQ8g5bmg2KOaSKGskgkm1nKQrQLSncDqYm TSCwqgPmOmHM7Mx2MyCmKnkqItCVdC4qZ0tTS/5kcEL5Ivo2n+n+Pu8dw8qZweB+3z6DW87SNovn gWTVCQGR80ZGypz8ukw21sapN6KWlm8R8bQVjyay9wS0brKVNiRwfx7dEz5z0UkDh5dRhtuExukU hV3kZnQ1MLSEiPTYI6B2F+fxf+vuwnccR1UxqfPr/9bQMjP7d+DzYj/gwuGH4/HvR49N06z07iOR o3IVJ0MTsf0rqPoY259JPu3VHFVwMjrI1G0/rjQMShLJqAbXGdDmN7aW5FwD9b+/dVV6Y1dNyqys VIIBF11C3H0JsRz/ALD34dOMQQD1NIDohBW7LpItb9xD/Uf1X3rgT1qvDqOS8TFlPIJ5/skf2lN7 XBB/2PvfEdboDg9cg0couhKsLftH6knk+Ij68/g2Nvex1UqV+zrIkgUlWHFvoy30m/5Uj03v+Pfu qkHrJU3eBfWWWJhpR2BKK31CEjUUJH0+gPv3Xkrq6w0zmKVWX+16GAAOq5HAD+m+ofXj37qxyKdK J7MTdVsG/cUqz/rSxVm9KqzABgebX+vumeHVPMdcsPujJYGogNP9tU0SMWfF5GH7qgmZwBLKKeXU lHVMoA80WiQccn3YD06rJEkqnVWvqOI/z/Z0YDZO7MLuCtgoMbkP4BlORj8bn6mnijqRMyGfG0m4 aalpPIiyEmAT2c/pN/bikE0GOi24hkjUsy64/Mr5fMqf506YO9sDVF8LWS43JwZfG00mPz8NVHrf wuTV46ugFLH9rJRafKrzxmxYqHsbXrKCKevSjbJQRImoaCaj/KPt+XQJbVwEe4tw4nDSVclEuTqv tUngpRV1KOYpHiMND5oDVSNMqosQcSSMwVQWIHttckDoymcxxSSBa0FacOh0wW4aOnqoNpbho1kz GDNbRH7zIV2LxmRjIZKaoxmVjTFZ/bkrayxhqGkpg5uYUB8CW4Ypw8v9WeimaJqGeI/pN8gSD8xk H7Rn5+fQhNjsY+NqKHZmcyTfex/f53rnsmgxuZxIeKnVK+fFZyi0iraCbS6zUqanjfWUGlvdqLSk ZNfQ9JvEIbVLFgfC6Gh/Mf5D0G1S2PyUOPp4cXTJNQhVm27lciahXjaQqx2pu1TJlaWgqALCGSSo p0ax0qfqyQCccT/q/PpSrFWarmh/EBT/AHpeFfng9M0GQqqXJmkoqXLfb01RrbE1NfGu4I6IAGWm pJrSUeZSMgeqK8g+vjHuvA44f6uPT9AVDEitOPl/nH59T/v6KrZ2pfuse7yiOCsopp/4hCWJK09d Eioky+T9UckWg/0X3sNSucde0NgGhPp5fl1A7E3k+WrNvYiClenm2vhkx9VXPH45slU2Z6qqmS7a Wnndmtc6Rx+PdAzVLA9HMUaxIEUY/wBVegdjD1Evn0rpkqG1Jfi973/w9uVPrnqp4t1mnlME/jen jKkXHHAt/Q/4+79N9M8skgkY3K3JIH4A/oPzYe/de6xFnb8sf+N+/de65iVgoUluPx/vI/x9+691 7yE2ALfUf73/AK/v3XustQFAugABAvb+vH+8+/de6wKfS31uB/xHFvfuvdcLn+p/259+69165/qf 9uffuvdeuf6n/bn37r3XJJJEOpHYH/X/AN79+691JWvq0/TMw/2Pv3Xq9SY81kojdKl1P9eP+J49 +691MTdOdj/RXyD/AGA/3q1vfq9bqepI3ruUWtk5uAB9FAsPpwAB7916p6lr2Fu5fpl5v+SU/wCI Av791vUelBQ9yb2ogF+9hnUAD96BSTb+rLYn3utOvB2HA9KOH5Db7g0+P+HAqfSft2LfUH6lzfn/ AA9+r1bxW6f4fkz2DEmoDGGQXbX9s2rV+ST5LG/+t7117xW6kv8ALDs3R4r4sqVI5pWGkH66QsgW 5t/T3up634z0p1yT5bdoJGkYOJ0o2oE0rar2tywkHvxJPE9b8Z+nbH/Mns2jfVLSYaqW99Dwyxj6 3teNwTf/ABv711sXDjyHSxoPm9uRT4sjtehaB2LOaKsqIpEZz+5JF5fKupv6Hj3ojGOPVxcnzXHQ h0Pyr2XlEp5Wr8hhKq8bTRV0DPHqBs37sDSKw0n/AA/1vdQtCCenxdIRTgehO2/8l9lS1Yjqt442 GilktJA7SqkigALI+pFRWY/1+g9vgr1XxUJ+LoS6ztDaGex8kVNunATotej0qRV1MHenZRpLAS3M YYm4PPuhA4eXTiyKPPpuotx7eSQUkeVxuqZjeQy07x+prBlAfkLe4/r7b0jzOenPFB6mb63lC2IT FUNdJK08YQrEdYEMbWBmdPrr+tvrb2w5I4dK4aEA+XSHxWUjpaCZvtDJpj06pQQryE3ViTYlSR72 jNwPV5DQCnT3j8xog+/ytYZYRbwQxG0SECzEBSb8cf4+3VfjXpE+o9Zsh2hiMbTx+CbworMQsFvr azPIdRuLn3bVw6YJ9ekBU9i02XvBS1TShixdpXdrBrkkLcgm/uhzx4dJmUnz6ZIsj5qjxRkkkal1 BioAPLHUDbUvPux0U68odfPpU4yuiaVleYeMEXUrpGpQebj8E+66SeHTus0oT1LavlmlN5y0Ooqk UfqKAfou/wDYCkc+96CPPpwFRmnSgxtVNDCVmkaRXUsURipkc3uSRwSqn6/0PvWg+vWix8jjrnHV wxSSkR6fSWV0F9OkcK0ht9D9f6+98OmT1j/jcpUnWfJcFSrMAQAwspPHqF7fgX97Br59UDN6Y6l0 WVJhZpnVDJZEjK2c3Yj1t/gP8fdjw6cDmvHpryeQgkbQ1TBGfMEMEZVpLf6tgOSLC1z7TtFnj0qE /lTrhFUUsQUtUgRowveQImk/6oEj6Wt7cRaGh6YkkDVp1lG/NvYqRUFdGAjE6EYeO7EklSSLt/X2 79nSRienii7R2vXVsUUNcVe9hG2rQz/lmb8qf8Pfs+fVa9Ket3bQwx+T1SnQrGQAlALE+nnlbfT/ AF/futdIOs7GmqbrQQmjUX9GkSM+m9yCCeT/AE/HujAngeqsxBoB0nZtwVrB5ahtUn6vFJ6kRD9H YKSNRvwPbVPXqy1Oa9JmpzEt2aoIKeoxljfSWF9Itx9fyP6e/fZ1bpJ5LcIRLrIF4PJ/1I/qSRY/ 8V9tyV9enoQDXom/cG8Ytx5ShoKOoWopMQk4eSPmNq2pdPN43BtIiRwot/pqBtx7egUhSWGT1Wdl LUXgOgeuf6n/AG59vdM9euf6n/bn37r3Xrn+p/259+69165/qf8Abn37r3Xrn+p/259+69165/qf 9uffuvdeuf6n/bn37r3Xrn+p/wBuffuvdeuf6n/bn37r3XYZhyCf97/3v37r3WYyyAqwb1J9D+fe sHB6ouDXpyx1XPBMJo5WSRmAcg21BjYg/wCDA+2njVhkdHFrM6qQDxHS0NbjKsLFSxVMdXGLJ5qj 9qMhrMYTGNQBsTYcW/N/bFGFc46LDgnqXR1bUtKxMwgq1kNrFg0y3DM2lSNYZV5LAkgWH+OtIavp 1ZU1BsgUFc+fyH+ry9eu6iSlnQLLlaWMrMkzTCHxSVDH/dZLyMHVQLAagBYe6UPkD1U9M01Fh6MM z1fkVnBls+koCzBDCpZvMstyXFrAW59+72OF690wU2ZkoKl4qSqlGPLGyMgsVIsQY7ObFfxc/j+n tQYmKVI/U61g9LzE76o6SOaOuxGJyVPUDU0dRjoGmjZVVH0O0ZZUm8eoi4IP6bXPtM0L1GSD8j1U rUg1PSlw27NoapY5I6yBRolpGg8cUdGQCLRoDyiM1/Ure6Okg/2etFTxr0tcdjetsk7uKjIS1LRl pyi0TzIrrrkqHIiErag1tOq3PupMg9KdbqR1GyOA2JhqylikyuUIqLEA09NHNHrEbRkiGpUCJowP qpsTc8+9qzsMAdeqenP+D7JpKSOojkytPC1YyTSySGCSZHkDBojqZJBHcDSVtz+fe6tWmOvGvTtV 7d2xU4d66LeTU8AA8VLVY/HVTM4LWSyiKUO30uhNhzx72RQ4HWwPnnpN47YOMrz91i6vGNV0xmmI mL061KBSZZKeFZSsn6QCCtifzx7uKnJ69XpSHbggjNXVVy1LxwJJRwpSxMhLgMrCZZ2ZPCg4BB0n 6AGxCS8l8CEspIYkAH7f9joY8k2CXu6SSyKjiCIvpNajgqsooQSrlcNih1CpHTEZJzIRotd2Lccs WPqLEcksfr+T7KtRPcXNft6kyrqzBVoCSTTFS3EmnEk5J8/OvT0yVLxAIfMzJIxp5pvGjqEFwGkj lja/5DWuPb9m+tnXxyH/AMP+z1Xe7y5ttt+qbakvLeNSJAxAKqaBSBpNRk6qZAHCmQwypSmUCDDY xldFKmZqotUT6tPjR6eoihQeRSOFIuP6ezULJQapc/YOoku7/amuBNDy8iQOAQpkkPyNCCPMHyx0 ns1kcpj3SOl2fipW1lJRPDOpLJ9Qk8c1MskaqDc2Jtzf3alaapT/AC6an3WylZDBsVtHGKYrIxNP U6x/g6//19A+zJLJGPobkD6Bl/Uun8C4PHvXkD02PLOeuDgA3INvxq4ubcgD+nvYNevU6dsWY3R4 rkPFIJIwfo0Ug9YIU86WX6j+vvf29MyVqD5EdR6xWjPg8a6XfzwNdg8eslZFQ/peNmHIP0NvfvPr ymoqfs6ixDVHIt7MpWQD+oB0SA2/p9ePej5dOjz66lHqY/UEahY/T+tySfwPewevA9QCCpI/IPvX TvUlakn/ADt2YLpWUf5wL+AebOAf68/4+/dUZK8On+mw+TycR/htFV5FHRmLQUsjlWS19RRCE/2P Hv2oDiemQpB4GvXodrbkfS0eEyTaXUDTTyXLAsbD0m5Gk+9a0z3Dpwqa/LpSRbbz0iKn8LqNIEAA Yxr6YT+hRI6NPLYhbAfX3Qyxgmr56b0njTpO1uBy9NIGqKGohXSzx+YpGrpGzLcc6G4B9P197E0Z 4MOnNJpTqBLRypFEXEAWcgxoaimLkEFrmMS6k4FiTpPvfixn8XVAjg1pnoUNq9n5LErTYTdlEu8d qpLCHpZpgM7i44VaPXt7PLrlo54I3sI5TJEUGggA392EqcCcdJprHX3xgpN6j4T/AKYf5ukhUUtR RwVVXj6aqjocNmosni6yqH2OVFBNIwpmIR9TyIIIXcxFxE5JDWNy2rqcKwrXpZQmmviy0PpX/VXo 124sNtzfOKhyeeytRWo0NNVbf37hI6LcW5MPULTwCTD7rpqSWlevoEC2CVBjqI2BKMV1Iys94qxx 68T+fRHDJJA7KE9QVNQpzxFa0P2Y6b8xtyfb2Ox+49gbrx+4YaFIKutio5XgoxW08SXq8ZRVgeuw FVK5YtRzI8KsDpAFvdGXSA6NUefVVdZHeKaIrU4NM0+fkR8xQ9BBLu2lkWYVeOx2SgqZqhqvG5Gk eilp6qckyVFDNjHhFPUGQFw0ZaLUOUF7e2GkTJwR/q9OlgtZMUJB8iM4+df8uekxkt5YiSk+2EVR klZR+xVRhBSyI5KCGtUxVJK2BUkEofpf6e7VrQ06UR2sgatQv2f5uHWXYVbkMjuKkqVjkejwrHIy K7+SUxxG1NBUVOhJKmLzED134vz+PbT0FSOJ6MIIF1gkVp/q4dc+w5oajInKoEjed2WZI7A8nn0i 1rfT3RRX7elJNDU8OkHSUZq5GamlCxRL5CC1rsfqP9f270weJ64ZCFjyXJI4JAJAI/xH0HtzqnTO QSCCwYgkA3vxx7917rlCBcg2/V9b/wBP979+6913Ii624/P9T7917rhpX+n+8n/ivv3Xuutevg3u b/U8e/de64EFf9jx/r+/de64+/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve /de65La5v+Bf/fW9+6913rbmxIB/3r37r3XC9/r7917r3v3Xuve/de697917r3v3Xuve/de65rJI n6Hdf+Csy/70R7917qb9/XRgGOsq4yCLFKiZCPr9NLi3v3Xq9PFNvbd1GoSn3Hl40U3C/ezOtwb/ AEdmHvVAfLpxZZF+FyOnxe1+wAqI25a+VEIZVlZWW4+hI0i/+x9+oPTq31E3nIenL/TRv9qYUkuW EsIYsFaGMEE3vyoB5v79pHp176iU8W6YqnsPc1WhSWs4LFroLMCfqQTqH+8e/AAeXVDI54nrLjuy dzYw3p6lW/5aoHJ5vybAE/7D36nWg5Hn0s4e+98RrZRjj6dIY09mCji3pcD/AHi/vWkdW8Ruua9+ 73jUjx4xhe9zA4IJ440yKP8AePdhjh1UuT1nj+RW/YgFQYsKP7P2vB/1yGBP+xv791vWepUfyW7C Q3tin4sNVKeB+OVdTx71T59b8RuuK/JPsAFiRi2D/qVqZtP+8OD71pB694jdR3+RW/HctbGAEEFB TtoN7E3Gu/NvetA61rbrG3yH3+xJMmPv+P8AJyQv/BQXNre7aeveIeoq99b5E3nLUTNe5/yYWYjn 1Eeo/wC3960jr3iN1gyXee98lqEstJCrG5WGJlBP9SCx597p1osTTpH1fYG5K03mrGH+MXobn+hY SAfX+nvfVeueN7C3Hi5xUU1VqkUWVpwsjKP8CqoOf9b37r3QhH5F7/aCOBmx7LGoQMYGDEC/6tLh SOf6e9U691F/0/b2CKqrjkK39aQEOQf7JOr6e9afn17rge/N8FWAahBc3LCA6r2sLeq3H+t79pHX umaXuLeUoYPUwEMSf82eL2vazf4e/aB16vSUzO89w51PDW18op+dVPATDE9/r5AhBkHH0a497Cge XW6npK+99a697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rnwT/AL19 feuq8B1miYq6f8GXj/Yj3phw6VRyUAPShaOL7hQqvHI5PM2mKMH6ADQVcLb1Cx549pz0ya1J+fXC SapSGeEyo1OzkhQ+hpxpEd43s7BgQNVyLge/Yx17Uaaa9tem3XIsSurIn0XQ7ajY3CuqOTdbcD+h 97oCxrU9e6iTA6vJMJbM3oueJFBs4SQg8g/4ED6e3EOAFp1o9RiLW+nIvwQbc2sbfQ8e3fXrXXas V+n+296IB6910GIN1JXm/BI/3r36gOCOvdKDEbiq8SQIxcKG0vGRFMpYH6yBT5U5/S1/9h7ZeANk Gh690+puSTIT+apIkqgF8Zem8xd1uyxDUzNoLgXsRYXsPacxsg+XW6dPefzM1XPRJIpJhoabTHFN G6o9leSSSKXimleS5AvcAgf191AAqevADqFXy1VSaetgREdYYWcQztGGijuiu9nMLySjh7AEnn3v 1631KxlRXY6nTIpWIldVzzxfwqQvraGARMZZ4kKyxRSPNoj0teQhr203NSTrKUxTj+3A+fr+XSkR RxwRXTSIzFyAnnRQCS2QQprRfM0bhTLkm+d2QVDNDVRpEL6sbBDDLSJpYs6KsiNUJoC+u7l7cX9t yQRyxtHICVPrx+37elltvN3ZXsN9ZhInT8KiikeasK1YN51JPz4dCNkNxx0OAxubqqQQVlaqTPQx K010VmEpWQsqQxsoUhmJK6voxHskhtXe4ngBJjTGrh9n59Svd79bWmzbdu1yojnnAIjHcW/i08KC hB1Nw1Adx6ZsVujB1uTqZ5sllfJl4aei/hdQjT4qhnbxxLLR1CxcO0i2jZlQKzNcc8GBgmhiRYkU 6TWvAkfP/i+i7bt+5c3O+lN9d3kf1SLF4DHVEjUChldT65WsYAZjqqM9Qsrtzc2PSSoxmZqa+OCR WFNHDGuSjp7/ALhgQQtHJJAB9Y2VityFH09vQ3sMxC8HPRDvnIG47atxPZyi4toz8IB8QD1K5Bp5 lSfWnQa1eQy8xZpJp6hlYeGSoqJNawg2AUggG1iCDx/sfawKvnw6AQqKinX/0NBnKVNLPkqypol8 dLJWVD08RXSUhad3hAX8KEIFuLfT3SMMEVXNWpn/AC9PX8kM19ezWqaLZ5nZBwopYlR+QoOo8hDc CwP6gPoCtr/Tnm3vYx9nSY5p04YnD1tYz1kaxRUlKks8k9VMKaIrApaSOJzy72H4FgeCRf3p5UjM au3cxoBxr/sep4Do1sdkvtzguZ4QqQRxsxZ2CqdIJIBPxHHkKeRIqOpb6ZY0mULIKeRZNAIu9OwH 3KBeQ1gdXH0tf3fogGKgniP+K6Z6qMU1YwBvG+mVCDf9qYX0m35B4P8Are/cR08pqoPmOsLn+wL2 BJB5sVva9rDkE+/D1PViOuK0wc6pJkp1KalaVZWDWJX0mKN+OPz7qzAGgFT04ox1Lg8VG6SwzRSS Kbh5KVKhVIIKskdSjREkgWuvtou5NKdXoOlJLvncjUlRj4svKlNV+ETBYY4HcRpoVB42tGluLJYG wv7rp8yP59aoB1CpcvnoWD/f1BWEk6o60wyh7ag6zRyag6BjYg3sbe6N4flUHqwzTp5Ofnahmiae sqQZVdIDVGaJQpuSqSM80UzMSWP0I4tf23Q1FRTrdPTrmtXWvSSyS4qr8AjaammjpZiCj6VZZWSq RIYkb6MqEkHkfT36grhh16ny6aadpJxIj01PApUkLOsUT3e2h0d6Qv4xbkKRe39frs1XAbrYApw6 iaK7yIkwpyqOAlhIqzIBb1yxukuh1HJIufx9fez4fkD1qh67rKVZ6HUuShneORTHj6eCtksWYqyf cSgxwiNfpf63+p92RtLZU1pxP+brxUeRz020n8SoZ0noRkKeY6tLU0k0c6oLhg607JMF/wBewI9v awQV1itOqFQcFajpyhi3LlW8EL1lc88gleGeSY3kiHpeb7yRYi/qut2Y8+6s0f42P7a9eCKPhQA/ Z1PkwWfmqh/HJXpfBEkZesYPIkUICpDTrCWEjKG+gPAufx7bLxgdg/Z1vTTy6y1OJwdARE96ubRr Zmn8TqwJumiLUoYjgA8i3vYdz50HWwAOI6E3bsUGM2zNk8MkkEmZq5KWRJ5vLI9NQIAQtwCqfcu3 0+pX/D3UV4E56VxDtLDoH8m0v3VU1QSWZibEkjm/0H0Ht0cOmjx+XTElQ0BBjBXUxB/Fx/xPt0DH THmenOmyBNNOrgXN7XFz/Q2vf+nu/VemDVa9ubsT/sPfuvdZFOr/AG9vfuvdcGJViP6cf4fj37r3 XfkH9Df/AH1/fuvdYvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Uj37r3WJ/r/sP+JPv 3XuuHv3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6ypIVFrXHP+ 8+/de64Frtf8A/7xf37r3XR+p/1z/vfv3Xuuvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691zX1ED+nv3WjjrIB45lP4 1A/7cj3o8OrKaHp1MRlaZhK5EbFm8jFlub/tqvH+wHPtg8eHW+o7vJdELSFUsp9Asqlv0rf9JuPy eT79QEE0691xMQlWSRnaOKMERXjGqSQkWUaLD/E3Y2/qfew2mgABPXuPXPROYaiUSJah8XBbWytN Iqgw8lQCzG/1At/W3vy0qooc9aPl01e3+tde9+691737r3XvfuvdTKeVIJS6NIxW3jIVQbfVibs2 krfi17+2nUsBwHW+neOamlAap80Ls4YStEWUR83ZyrC9yBfgf4e0+g1IBB630qqOlr3p/IIIaqnj KK4Vo45YwxDx+OJ1tMQeSoJHuvrXrRI67qbOI4hUTPVCJpXH2oi+1lE8iGOYuQ0q+FVJ0gjnj6H3 UEktUYr046oFiKSVJWpwcGpFPnihqPXp0xlBKcjSwSFBHWpT1sFDD4zV161MzRl6Nq11haVERmbV 9E/Bv7bmlWKN5NQoAc+QPzp0Idq5dluryyivEIjkVJFRWVZJY2Yg+GW7agAsa5AFQD0L2WWmhp2x ksImoVpjRrE9yfBo8dg9tQJUA3Fjfn2Hbd5GPjh6SMan7fs6mC+t7aG3+geENZLH4YU57AAoAJzW gGag1zWvQV7voqajxMOVxUaUVRTVNLCzQHxsY1GmCQ2dFeSGSFSGCs/5PHPs5spnlmaKVqihP+f/ AA9R/wAzbbaRWEW5WUSxzxSItRg0AIXFQCQQMgFvM4z0Iu2NxDO4Klr55FbIU8jU9YEHhZp0AdZg oN4vuImB4NtV7ceyy5gNtdsqDsNCPP8AL9v8j0Ndi35932+Hc5j/AI8pMctMVIA7scNSkH0DaqCg 6BjdeBn29WIyLUS0NTGzUlU0ZiElwvoebT42mVTyAb3BNh7PLedJ0qGGrzHp1E3MGw3Wx3IDq7Wc lWikKkB148eBIr3AHBr1/9HQanpw6OmhY5kLCyAhHKtYWFyVP4+tz+fdAc9Ng5r5dZMNPDDWwx1W PSvaZkpo4pSQ8byyKqPErMsLuTwNfFj9QeQ/CYwxEqEqfQ0I+zy/b/Loz2uREuVjNik7yEKobNCS OAqFJPDuwPkchWbimXGY9KCpWEZSthj8tNTM7U1BTLMJY+WJ9UqxqFT6Wu30K3LYlhnujdQV+nC0 BJJ1N5kas6Rw+2tMdCzf5Dtu0rt16E/esyiqJ8MSBgy8MVYAUA8qk4pVEw6g6CIKynU/hka37iL6 jERYozre34J4Ptd1HhyDXj69R5SzqDIHWSK0VnDXKG5S5+gItb/H3sdXAoTQ4PXOKKeoKpTxPNIq k6UFzpv6ibH9IJ5J91LKvE9WAJ4dT6fFZeodKeGhLShTZdEYlcSFbFlYsWIv6bC9vbJaPJJ6dz+X TkNn5xLvLCtOLE+SaZacKFtr1LMkTG1/oB7qZUoKZ68B1LTaKpORkcvR0scqCZXgL1KsHNlAcohY 6zzYWH9fdTNgUXPW6cc9OsOAwsDOEzVNIFOh5NVUjMRZAIljKLIjuwFrk/1A4u2XY5PXuHWYUlBD IzTz0jRxhEWNKFZZJCvEbqrVCMn6eSObm9j7rTqwbqTqyOTC0tBUV06ryKbH09HA0IXlfJUP6lS/ IUEX+tvfsLnH59e1V8+pb43I4vwpPUCinq/VbMzQvUThblmphG8hDAXB9P8Ahf37DZH8uvajw8+l BT7VjroZJKvemOop5wqotZjagzxu8quSj08spj/qPSSVHv3l1UtTyr1lq+uDBLjJYt346shmjqgJ aKl3AgBgVXEcq1n2sQeoJOhQx1W+g4961UBHViVqKHqcvUz64KyTJVlTEUMzxwwGnleAKXCK0dTO S8xHAVWNr/n22XoD1ag8ummu+xxkwpcdjIaSeIaXrqjITVDVAsV5aahkgidFJ9KFiWHH0t7sASBX h1Un5dJuatydZA9LNVw1StrvTBajySBH9ImmeBFsARcg3Pu4XNadVJ8q9NwpBC61MBhrdJ8dQPMH k8iE+lkkjdxGiCxB544Pu4p1rPS73jkFwcGKxEFKqTUWPiesMKiOCKadfJK6pZTZnf8Aw92EbVrT HS0DRGtegKyVYampZ731G5Fv979vKpp0mLivy6iyTIwjVQLqeT7coadNk9RgxUSD6avpb8n/AHr3 bqvWI2sP9jf37r3XgxH09+691lFjzYE8X+nv3XuuBQ/jn/ePfuvdcPfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3XLW39f94H/FPfuvddEk/X37r3XXv3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de65La9yf9ha/v3XuuPv3Xuve/de697917r3v3Xuve/de697 917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3X usi2FiDY2/3n37r1Cesq2Mqk/puP97A91atPn1Wh/PqRVRyrOSC3rditjxwAQRYH+yf9f3WozUdX 9OsaR3WztJG0jALI7WhIvyXBUu1j+R9PfqjyAp17qY4WINGtaZCg9IWgHika/wDZdyDoJPDFRcfj 22KHOj+fW+o0sU8MAZkulSisJPG6gBGDlV+isAfza39D7uCpYUPD59a6b/bvWuve/de697917r3v 3XupVHCJqmGNiqK7WLyBii3NtRC8sFJuRxf23I2lSetjpYS0uRijitW0VYmvwpUOk6tyGCRk+LiM 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 e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917rkPevP q44dZR9B/vvz783VfPpzlQaBIAhRvGAzNd/0AEhPqNJ4uR7abj1s8eu6YySIVPEcbXbyTAR35KhR IwUSG/NvqPdGA8uvdTE+4VgwoleNySqM5NPIEGq7sDZgSL2Jtx+fdKAfiP8Al63Wvl1xNPkZ2leD EytT05M1THF5GRVK2lVZE0yJE6cleSLf4e7ARgZkz1Uny6TjfU2Fhf6XJt9eOefx+efakde64+99 a69/xH19+691LgoaupBaCCSRArOzgAIqqbMWdiFAB45P190Z0Xi2evdO1HR/bwrWPDJMit45Qghd VkZgFBDicWsR9UFvbDsWPEU6t0oaPJJJGIoqY1MisXlhEIeRYxdVVXhp2QOrHm9r/Tj20VI49br1 IpI8nFVmdcfWfcxh1SMUknKTQvCtLaWMRt5FfUxP4BBPv1BTJFOrxOY3DqwDjIrkH5U4EHzrgjHS hxlDlMYabNwYaoSqqRJDURVtDFkaISRcTvTUtQCyl1eMrqLKrawosAQ2wWQMjNgHyND+f8+j+DcY drSy3OysFF64cHxVSWE0NCUidT5EDuLAEHT5UH7BSQz4JMvlcVTUeTqaaOBoWpo4h9vTNIY5fAAy xwTOxeKNtRS5I4IJBu7TSNdizhnLRhtRIOVNKaaj+fywesm+Xt0ttw5UstxutghtN1khER0IFWSJ DqR9FAACxZkBGNRK9pHSDzuepMfFPUZGmqKukqnanNNACDNe0hV5dSCFPpc3J/w9rrS2kkKrA4WR BWp8vLh59AXmDeLDbraaTc4HktJSY9C8XqKkE6l0rStTU14UOenfHbk22aT+FUeOfD10sqMkH28K wPLIFVWarichzLwAz2J4t7TXG3bolwbmeQSQAZNcgcfhPCnyr1raOauUJrdNo22IWt20gCpoAVnO MSJVWrgamIJoPl1HqsmJqd6WZQJFut2A1LyNSgnkAlRcf4e3EiCPrU4PS+4ukkjaF1o4qPn8/wDA K/l1NwtclPBURPEknlVQkjfWEqedN/oWB9tXMRkeJg5AUnHr9vSrbJ1jhmQxq2rgTxX7Ov/T0GCd RBZm1sRqDKCpUsQssQuC54b9I9Jvp+g964cDjrVOhB2ZjY801TPU0wqqnHRUwgJRpAVlWeRp6lFU iQUvg9JYkXsWuAPZfuEtxFD/AIsjFzWpArQAZPy+3y6HnImyW+5XF3dzoHMBQIhFV1vqoxHmFCGi 8CxBNQCCqdwZYbXiWOlaKbOVkbSl5h5P4fTMdIq2iZXWSeVydCvawGoggi5NYWJvGMtwpFuDgfxH 5/L/AA8PXoZczb/Hyun01k6yb/KKlj3eCp/EwNayNnSG4DvYGq1CWetqq6V58hLUTTyXb7iVpZpB drAEyOzxqsgtYkC1/wDD2JlVUUKigKPIcOoXuru7vp5Lm8uXluGOWdixJPzNeoTMwMhD8AhXW5AN xoR1vqKm/PIsLfX3cHpMasACcdKHC1EeOjpqieqyMcj1mqA45wEpFViszVTKwd3dZA2kBzoH+1W9 skMXDAgL6mvRlYvcW09tdQXDQuHAEgqNBxU1GcA1IGaeWel6m4sV5WEmWzD04XTHVx5FaOqMwKkq 1OIZJRTuxJGtFFrG3tlkoSq0IB9OjS73a8t9yln27fLuShxKXdGbAqaaiQta0BzppUDh1Jr5sfnA KJcjCanx3hmWphqa2c04uiz08KQ01U8URciS4cKoBHAvpqiJ2WKpRa0ApUClflUcf29GyXUnOl5a 2u5yIm4pEw8dUrJMFFVV1DIrMBqPifGQArVwegjrkEOQnpWZ5o6eoeEsAELiKVlawKsVvY2vci/5 97A7QeB6Cd3B9Jd3NtrDeHIy1AIrpJFaHIrTh1jZ42KmIMsYZm0PqVuTcaWVHCn8/Wxt71TjXj0n 67LywqpMmoMJBbXJdCw0l2XhdTqSB/X/AFx70BWtOvfn1H8hCC5sAQrFgobS1z6LEH1W/Knj8+7U FTjrX59O0FfUU8MkqSUDEMqPFVQU05lWRWUPDTSI9wipaRgAVYj+vFKAngadaI6UFBuOuQUvnatq aPzs82KoZaSKDxyzK8X2EU9NVrBEki6SJA36rLb86KDNKA+pr/OnVdIFfXpWha/IzWrZMfi6acKU gpKV5JxVI2qKlyE87jyGQM2tk0EsQAdJt70QFA0gk/6uHVK0OM567qDCJamClr6eVxPHBKqZZYGl IjWUOKeppYVMULkqQGAV1IDEe/DyJGOtg18jSnUeqgZYBeVdSR6Jv3UMs7IoZdcEUswEllOm1+D7 svVvy6S5liidljQK2gWhmeqcMOeVWMIVZm/sjgtfn+lwOtH7OhG6mpqObdkuQzFKP4djsZXVNUml 7SB4TSRAF3dQVkqFax/p7ejFTx6vGaOCeg37GyWMr9z1RwKCChUlER7XUqeSbce3/Tp92JWleg+m lJGlypIHJH0P1t/j+ffuk3UPjj6/Xn/W/wAP8ffuvddsQTx/T37r3XH37r3Xvfuvde9+691zDn/X 9+691w9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3XvfuvdcipAvx/sPfuvdcffuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691yH0966uOHWRebD/H/AIn348B1o8eniamqJH1RKNARCAHIsojGv0H06Tzf22aD j15uPXMULyAAzwI2oenUfVx+GUWuBwRe/ulaeXWupiUcMUbD7uAvHbyQeSUM6G4HgIcKXJsBfkH6 X90Na8OvdOUWJniqoEgqWlWpgWdjTVTK1JqBVoq2Wc04vGTzpuDfi/umqtajrxpTrktNtzySRGjy NSI0Jq6ynq/JHK7szLIqRXeJNAIsVY3Fz7tqfGR8sdaz00Pj8JVSOaWWuoKcXeOSrRam6sFEakwp ESjODZtIPNrEj254rrQMAW6saUApmvHqVT7boGZgcmZAE1rKkaRwELby6zKxcBL/ANPr70ZmPBeq 9ZXjhgD0MKyTJ+1onDU1vGkur0T+RI7uy2/qB7b4mpPW+uP2nhIaBjKJASYCYi5BF11gSwl49X0J 9Q9648R1uvUPwO880lOqRPFoM0Ms0cRk1kKdImrC8+o82HI+vu1cZ68ehN652umfykrSis8GPjSe fXNIsFXrnWM0xemn9A9RLEOJPGLAfVlK923AbdaNMRViaAfM9SJ7acqW3NO9y/vGp221j8V0AP6t GVRFqqAuotk1rpBoD5DT/c3A0dTTT1Araqnx3negxE1QzYmnlqJfPJLJC2uet/dN1WeWVQLCxAAA Rbfb+5iZIVSNn4uMtThjyB+f+Dqa35B5XgvLe5a2ma1t9Rit3cNEhZtRNdIdxqzR2I8jUCnUXMZR py6k6FubKOB/h/QAC3u1rbiIA8W/n0r3O8LBgT/q/wAnSdgyNCwlpKyGnqKUoz1IniSSKKNUbXMx cELoW/PB9rWSUFXhdll8qHj8vnXogju7KXxLW5hjeAgl9ahlVQMs1QQABWpxTyNekdtDY9fuH7vI 1L1OH25NJJLi5vs6Qz1oSqmihSnaoR28dOiENKARqFuTcgz3LelsBFboFkvqDUK4UUyTT18h/kHU acre355kuLzcpvFtuXtbeCw+KTuIAQtXCAdzkHNFGakOuUaKOeVYKuWsNI4o6qWoianq/uIV0Fqu BooSsk2jUHVdEn1BPNkcJZkV3jC6sgAgihzggnArSlajz6F1+I4pHSK6aZoiI3LgrJqUUq6lVNWp UOBpfJBOeoEeTeJWFzyPbuipGOkcd+Y1bPX/1NBuRBHoe/7blQxYSEFboS6DWJAWYAtpYNcmwA+u q/t60CD9vUunyWQoopaWnraikVpknnWmd6Z5JfG8esyQKszeFCbqSRZiQB9ffsitDTH8vT7Ol8G4 7jYwy21reSRRM4ZgjFalQQpJWhNAxoK0yT1hiqw4EdWXlUh2WV3vJHIQdRDMLujaeFuf6cH3qnp0 gcs7F2JLE1JOSft6zCgq5pFSmgknkcNIrRK0rSRgLrc6f86gC3P1Fzxb3qoAJYgDp62tbi8lEFrC 0kpBNFBJwKk/kOsdHTR1FRItVJ9qgWc6Y6dSTOqFo6Txu8SRapVANyNKkmx+nvZIFa9Wt4rczPHe SvGiq3BatqAOlaEilWopJPaCTQ0oX+nw9I1DDUVWSraeOSSQ00VLjpGWWUWSpene4jWBJAFZy1ms QLkGzYaobW1ABgca/l5fb0uWyZbRbi+leK3ZWMI0k+IQaHTkKFBFGevlQBiKDNBS1tLeClqg1GzD 9qaCP7qpdpQQiWVashy2olf0jm9h7aJ1GpGf5f5ukEUUszpFChaRjQACpJ6c41zLZKLGfdT0OOkE c9YMVV1DQRwC4kmMrWHnfTpW9/WQPbJmjSMziQFVBPHzHkPmTj+fQi2nZL071a2twskKrR3dCKpH 5srioDH4VOe4gU6Q9dB9jV1lMUuIZ3iBlIkksj+ltV2Cs68ki31t7dVvEVGB4ivRJfW7Wl5dWr1r HIy544OD6ZGesJVrksAC3qJJAZri9ls30t/yP3rpN17m1iHa5vYksVP1P1JI5H9ffs149a6wkWCu xkDFyG/JItYEamIN/ofoPdvOlOvdTpk/ydWFXSSxppihp1lleohef11DRL4YnARk9QNlFwVuT79T NKGv8j6dV8+pmMytXizWtQnHMZIoRIK6lpnlJj1hDSM6q8Tx6iSUIPAJv70VB06gfyPWmUNStf8A B0rhn8tAIq+vian+4jkp5c3NHS5p6iRg6U0dDSrJSUdMiRMQXVXbVc3B900qTpB/Lh/n6pp4gfs4 dSqaqkVIPtahDODI165ZEkXWdUxkgaZ5IXqJnLqY3kFzwRe3vVONeHVwBk0z1w801k9FMZH1/cSB 6lGnUszkyaXIDLYg31H+lvp73T59bxXqBG8+pmBZZAXAkszggj06xM0SooBsp06gPrz7t16g9OlR i5q+mwmaq7hFcU9G5jGkASa5fUVkdQpCCwFhce34vM9eGDw6ByqianqJQwLipYsJTzze/B9vefVi aV6aXj9R5v791Trg1ibCwte5/qfeuvddEW+vB+tvr/T8+/de64+99e697917r3v3Xuve/de69791 7r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuv e/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6979 17r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xu ve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de65D 6e9dXHDrmv8AxT348F60fLpwnTyPG1hfxAgn63UD6cjgf4+6E/PrzdeRZEIaMi6rrMl1GnUdIKlm Gq5P+N/r7oc9V6cBUSRoq+XwygK61MetmkIb9IZACht9b6v6/wCvWnHHW+pYeomSOWeaNICpcSfb UrzMQCrAqQHYkj6mwt7qaV4da+zqZR4aqrpkRZyY42MklSsVNH9tGi2eSV1KukNvrbgn8En3qoz2 9erjoToNu4umo6PHRRxTx1KQ1NfJJW+N6+VbtTmwpk8cNGHOlL2LMSSTb2wWNWJ8utUYnHHplyO3 8SklSKZVlmQpNJHLBF40RzJcQxx+phrX6fn3ZWODw62NRKqBUnHSbmpYQmiCGBYhIruyw08c5BU6 YwY2SayN9eNXu+fPj1bIqDgjrtqMzTvT0lDMZZSmqnjZaiWZXCsI40mleaZ1KknSpKjk2A91JCir HH+r9nT9raXN7MlvZwNLcNwRQWY+eFGTjJpwGelDtvZOZzDmVPusPQRyPF5KyniY00iKDZaeWohk s4YDVp8YP1PtHe7la2SgySVcjCjJP2Doa8ue3XMG/wA7CWA2VitdU04KKpArQKaOxPDtBAPEjow+ 3cImzcN/D0qhWSTVU1bPVJAkIaWpSFLBEeVSDHApJBFyTwB7j7c74bzdiVY2WFVoAeOCakj1zT8u siOUOXn5O2P91m9WeR5mlZlBVSWVVWgJJICrgmmSceuPIVZkRjwPqRbjkm5P9OSSfdraHQQOjK6k LBieg6ykr2fT9ebf7H2eRDh0Bd2kNGC9IbcdPCMAKq1SayOugSOOKd0ilSTyPJ5YrPGzokZKtYML 2v7NtudzdeHQeHpJ4ZBFOB/ydR9zXbQjlxrtpJFulnRVAY6Tq1E6l+EkAGjcRwBpjoQ+r8hXybNr 4K5HSnxuRjGKZnje8dVC9RVQKUVCFgl0sARcGU/4eyXmG3iXdraSP+0kiOv/AGpAU/zI+wfLoWe1 V9eTcs7jbXBJtLe5AhPprUtIo+QOlvtY+vWLcuTNcmmTRqUaR6QGspOkE2ubXNve7SAQii+Z6NOY r1blAjU1Af4P+L/n0FVfWpBcFgCfx7OoYjJTqNru5ERIrnr/1dDCUUaQxNTSyTSSEtVU0lMIUhV0 STyRFJioSQMQLpx/ZtwBtggVSjkt5in/ABden5VtRDC0Mrm4/ECoAHD4TqNfMZA6apYrAaSBzICV OoD6a2GkAomkgA6pAwb63HugPScHy6z01BXVkVVPS09RUCjg8tTLHGzJFDZz5ZJCG9CWB9XqKg/g G1WeNGRXcAsaDPE/LpbbbdfXkV3PaWryQwJqkKioRfU/LifsBPAEh2xG4p8NTzUpoKSohlkWUSVC 1P3MIRQhWmkjq44ZfIygsrKwBBsV1E+9yRwzRNFLCGB4HNR9lCP5g9L9p3652hHjgt4XRmJOpTUm gABYEGgpUCtK19T1FlhetqGqImeSSteR/wBldWuomJYlUYqYWCE8G9gfTcG/uhoqgUwOiiWaS4nl nmNZXYsx+ZNT0JGVkrqPEbeq4pmhghpIaOpjZI7fctBAiJIrxt6ZVpZCmkCxVr/j2jURma4X8RIP 5EDh0PebVlm2blG+VQLb6QJ/pWAAp9jBdQ+erpjpiiVEmYLXaok0VJM9P4ZomARnUvBrQuosAmly D9efalWC9rKGSlCCPI8Rx6Bljey2FzHcw01DGRWoOCPlUYxQ0PHqVNuAeOWmp6mOnpdReMN4HmS3 0fSoN3seblgvJHtg2tqpokAKg1Fa/wAxUg/s6Ek/OW4lZ4LSOKO3Zu06e8DOmp1EEgE8QQCTppXp L19Us1L41qaWqkZbl3poDKHZywkjqo40qNXp+rEk39uAUNTXoIs7yM7uxLsaknJJPEn59J9Qb2bU wuRwXjJuCOSpIJBP0+vHvZPp1rrpkU30SPqt+tiDcgnhtX5/pxz78G+Q691HZJwDpkUqbiztH/qh cD/E/wCPPHu3Z5jP59aoeuUkrMwV3F19VxGgOtQbEsNBJHJHNxYe/AUFQvXvz68ElkSNlc6CzKF8 b+ItpGopJJIVaQ2FxcW497JArVc9e6zwVqwTKk9O1RDFITFH9xKVikCteSFdSRo3mIb+gN+CPfit Vw1DTrXTnU14++oK2epq8lKiwTVUup4FpryMxo4GFOgj0FrEqpXm6n3QCqngB6deAAwBjpVUuSfL yvDj6CeGSRGmdv4gXAKA6TeRPEzHj0kAE8n3Q0UVbh1444nqM00lIjR106xVflKS+SUMssXDaDEr gIbuDctYqP8Ab7GeHXsdCTjs7gx05uOlmEH8ZyG7LUMqIIGNFS4ihNlhtrQCpqGHq5Nr+1MYop+3 rXRfnWokSNKiQ8X0XN2sL2/P092rmnW+oDJoJAJYX+p/3r8/S3u3Wuo7Agn/ABJP+8+/de66uT/v v6+/de669+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737 r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 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 pgaUp/Pr3TtXbqWiuKKKnKaFEUCwRxx08as7pLriurPNJIxsCG/B96WItSvWqdJh9wNWzPJVxwxM wZS8FOrag1tRYSOSG9N+D7d8IqBQ169wr16pliqqWL7dpjBTyOxBj8QaRhHqNgzX9Kryefx+B7dQ EL3Dz68em9pg8bFwRItgl+OP98ffh8Xy618uoLnm54/H1B/4n3fr3WF/p/sffuvdY/fuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69 1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6 91737r3Xvfuvde9+691ytwP99/sP9uPevXrQ49ZFH0/1/dq8OnvI9PuOGqRyRqZtIRbGxNtIJP6i F/oCLk+2349N9OCUKvMY/EIyoUyrpmQLcuAGVgwJNr/43+o9tnHXuhCqaSKXb2PDkaYAiSKAqcK7 RBbE2EjRyKRY35vf2Wxalv7pdPayqf2Y6kC/UXXI+33CnEThT/plZ1p8qqynpppEooQXWkkN3PrS aMIQLaWjLGMsrKQTz+q/P09rDqrQHHQAoOosl1aW0Eig/tFXctJPFGxkWKQI00NTplVSxFx6QT+D 79xp04kssayxxyEI4AYA/EAQwB9QCAftA6GOOWnGHoa+jhEdK8ccEcEumnb7tWET0zuQyrDDID6l uNC3Avx7CZgln3K4gnYlx3E8ezyoPXgKevWRVpudhDyvY7pt8CpakLEiv2DxSfDCsxwED1Z5K0Kg n4sCFUUlRlYpceIkNVSJNM/2pFRGKIuTrjEqtoELki4IPqFrC1zlLi1tLe3aWcrC5AXWCCCa4OKj 8x/LqPNz2TeeY9zmsjZ2o3W1hLSPEzaZUJ7DpOogrXTXtFNIIHaSHdVTxISzGRirG4WBmCICVYSG XRBM+u17G49mea06jd43id43UhwSD8iMEdMuMyWSo6yrXG5efHyzxExvFPJQRS+MiTROY5FhfQFb i5Ori/tua2t7hV+ogRwOGpQ37KjHRltW4blZSSLt24zW8jr+CXwgSM9x1KKUrSprWgHHoRKLszA0 8tLUZqTJ1mWqsBR4vLVlGVkoozTTS1VNNHRS+Ly1k2tfuG1KEJYKCSw9hufYLsrJHZmIWyTF0Ugg 9wowLeSjOkUNcVIoOpa2/wBxtmguNuvd0S5m3WSwSG4kRgUXQxZCIzTXIw0+K2pQpqFBOqsyHe+1 sjXx0VJXVyPUSrDT1VVReCiaZwPGskplZ4Y2kbRrYAKeWst2FTtN/FAZZIkqBlVJLU86YoT50/Zn o2T3C5cvNxhsYZZ1SQgCV1VUDHgG7iwUnBY0pxIpnp/i++89RDT+KLIxxVKU61ijwpVhHWMVEbqV KrLbUpFjax9oW8HQrSBjBUV08SvnSmeHpn06EwN7I93BbMq34jcRl6aQ5UhS1QQQGIJqCDShwepW 44oDMFiFPpjRUJpoIqaJnA/cdIIlWOMSSXawFufbNiX8Kr6tRJPcST8gSak0FBnp/ebWGKO3iiCU RAO1Qik/iIVQANTVagAyT0hd0V1VjdsftUss1PWZKCOslSESxU8VNG88YmupCNNUFWQ8cxH+vs72 pY33AlmHiLGdIJyakA0+wcft6jnnlruLlSOOGN/p5LpfEYA0UKrFQ3pqY4+a/Z0ndk1dfV5VhHQV UtFlzVUlVkPBOlMauCnmr01zLF4HqVaAMVY6ipJH5Hsx3kRJaa2ZQ6FSBiuWC/bQ1/bToHcgG+fm CKOOORre5SRHNCQaIZASeGpWUHOaV9ehGx+Plkkq1gpY6yrlo6yGKmklEAnM1PLCYvOWTxmRJCAd S8/kfX2HZJki8J5JCsSupJArQAg1p58Opdj2yWeHcore1Sa8eCRVRyFDFkZaVPCtaVqM+Y4iTvDK ti9rtiFjm8dNQY/EmOG8jiZ441qNcgcLZVje7FrE/k35rtFslxuX1rkankaTOMVOmlc+Y6pzbcyb RyS20QwnxEtYbeigmjFVElStfwq+eFftz//X0QIctWw181csscbSssU02hVhSLUjmAop1x0yNCFK r9AgEZsq3oURwEkQNH5g5/1f4ejWDedwh3CfcIZljuJidVFAWhYMVCgUVagUCgUAoMdLKfBQRP8A 3lTRNDjqqnq544njkpq6AVcJlVHjW0FRUBgS/wCf7Qtx7Kfq5RO1hJGw16gjHjQA0J8mxxI4nqRr jl22hP8AW1GWSC2lSZwp1RzBXXUFI+FmrXNR6gdZt8ZPCVGGp0w9fDUvPVx1E8PpSSOExMV+5Lxt JTPrbSVBVyx5uoPtLtFpdwXM5uY6KBQGuDniB/n4dO+4G7bFebNZxbNfxzNJOHYCmtV0H4wRVGqw FBxIPEAHoIymosVJ1BlMtkJ02J0uhUohkFwAbgAn6fkiKtOoeGMeXUmlpax45apKaeSngIDzhCsc bMwAAcrGUIMlyADZWBNiSfbbsoKqWAY8Pn/n6WRWF5NbzXkVs7WsfxMAdI4efDFRX0qK9ZtVImhv IHZNJYJ6lDjV6rt43XxsRwQSSeDa3vVCekvXQp0m8jwPCwuWKAsvBuSVjYgSKt9NyG/pxa/vX29b +zrCIZH1iJw4ca15BYg/q8aknnWLWvqPJ+o9+Pz691Fk1KfUwRtRVk0+pSDYLpZRa/8AjzcE+/U+ XXvl1jBc2PDAjgf2iAxI5FmvxYn+g9+oPz6912Tp5VBpA0ggo3q+pvY3Ci/1/wCJ9601zXPXuvao uGLKD6SUIdb2+t2Ugi/09+o3ADr3T3SPEqLI0NI0oA0MXijlKRjhvKJY31sBzwCeP8T7qa+fDrXW eCvMhc08UgDn9MayhUUrZk1ozrYavVqvck39+pTHXup6yGSFIUiySmN42jEAqC4jAZmkgIiCJGAp ux4HFvej+XXuo1dLUsF+3iyJ1aSI62aNi5JUEhppTIAU4BFh+fflAHmOtYpinSNqHieVpYYmjRzf RLIGcG3quy6F/V9OB7eA/CT1vqTSJTtEXmphNJqYgK8gJX02TxpY3IvZr8fm/F/MSDRTjr3WWWuW JWjo1McDsX8bIQA7ABhdiTpUC34vb6X93WunJz1o+vTa8kkp1Mo/Nv8AjZ96FK4PWuuPP+x93631 hZiePx/xP+v7917rj7917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3 Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de6 97917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v 3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de697917r3v3Xuve/de 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 sfdgetdYmp2BJ0A/ViYp45QI7AlrBj6QGP5Gn839+691hERY+k/qI5b0/qa4Y/XiwPNjb+nver16 91NpqaRGiqTDTTRBzEUlqVVWcXAaVfIrx8sNJHB/2PupIIpU9b8+lfFnogsf3hMPjFlpTRrV0shj BGqGqXVLoOmwB4FuQfbej+Hr3XOTO0rt6MZK8RRTHJBTxwK8jCwQJo12H+q+vPvemnE9a9emuqq8 isQqGBWFtcXijaBZAI9Pqdmi9cYJIPF7f6/vwpXPXsdNyKwjkLQSxeQaY4/KAY1DXcqjIGihYi34 5+nHv1BXHWq+nUUU0FrtE6sXJWU2cAKwOkcBHdg1uTb/AHr3bz49b68WSG8aeMxAqkczBhpe7HyS CNVcsb8avoPp7tnrXDqFUJAJFYTq2pQ5CL6Rf6WWxAIB+n1v7uOHXuo1wRwSf9YD/W4+vvw60OsL G54vz/Uf7f8Ar731vrCbnkc8gXtbn/e/fuvdcfe+vde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuv de9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+6917 37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691lW9v8P8LA f7wPeuvefWVQv5H9R9b/AO8c+99X8unSlaM61aJXNlsGXgH8EE35v/sP6+6N1qvUu0k7qPEtraF0 ER2HIGlSy6uRbVe/4N/dD6162qszBVFWJoB1malqKZpYGiZJI2USgsC0a6Xvcq4VlbX/AEII/qPe gRp+2hr/AJun5o5rVprWeIpMrCoOCCK/4a9ZBHFAHMNQya0EFVTrGz+QGzOGQykGNnVSfpf6gD36 vDqkc80AmWKRlDqVYDFVqCVPyqAftHUNRAoU3lJEiqxJVlUAgBIxq1n0n6Xtz9Peumun+uGLpfAK KqetaWETzv8AbyU8dO/jFodUk6l3SRiSbcf2Te9m0LsG1ppoxHGtR5H8/To43W02q0Fmu3bobp3j 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 qR9b8f4f6/8AQW/Pvfn17rG39LgD/G9/x/t/e/Pr3WP6f77/AHg+99e669+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r 3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+6912Bc259+691nVfoB/wAR711706kIht+Of99+P8ffurdP2MFMhkM6rqsgjaWwi0+sSeslQGa4 tyL8+005lCgxj7ejPals2mdbwCpHbU0FfOpqM+lTT86dO0z09HU6ZtJp5IopVDTshUOgUNHIjXdV muBa/A5JN/ekZniBGH+Y/wBR6fuYLTbtypNb+LZlQwGojDDyZTnSajjmmes01TSR/b1SSRSiWpLw NI0stbGtG0bL9z+yhFtVowbA6frb3v4tSafLPoajyPSe4LRPFuEM9Q8hKBmDyroI0l8Y4ihNA2kk Cg6bZaiKtmWQUlTVVbyySNIsbRy1BHkleQgX1Nzc2VigF+Pp7cpwFemZZLnc7jV4bSXjliSBVnYk sxIA+f5AdYPKU1g45lfSJSXZ45GjutzKUjUlfTq55H+xA96p88dJXSSI6ZYyrU8xQ9cDLVySICsc dtIAdFI0D1RgNI8t1ULxaw0j6n37HVST5nqS0DoArzF1BLIIpVh0uGYNJpjspYOOS2m4HHveOvdd i0ZVmjWoAB1RVOuVGaRVUs2kxR6kWQMpupAABuOPevz6dglEEqymFJAK9rVKmoIzQg4rUZ4gddCe WnR4IJnTyRiOcRS288crXEcgUHWz8W9X0tYAD36grXq0N1cW6yrBMyLIpVqEjUp4qacQfMcOnfDx Ia2hqHeWoIlesNNRl2rvHQSCaSWQ/ttTqkQJ1qedJIP9GZzSORdQUkUBb4anAHzz5fPo42K0Jv8A bLoo00ayM7RwtSYLCA7NxGgUyragcGlCB0JGOwUGFi2zl3nzMeay1cZY8fKgEVJSzTrHkK6eOxma OooKhEVpCNYnZiBpIAfuL5r07raqsX0USU1Vyz0qFHl2sDWlaUA88SNtWxw7R/VPdn+u/fV7daxE fhiiMgEkrYLENEyqGYjUHZjTSKvb00uSy2KjyI8+3aJpclWU5KrHNk4/uYaJfIrLNJJGXBEY9Glm ZvwCXiRbe0ne2am5PRFPGi4LGnADjnjWlOhrdWdzue97HHexh+W4dU0gJADTqXWIYOpiuDp+EAsW rUDrvb2CweLqqvI47L1NXLWBaYQRw0cFEtN5BMBPJA88lTUKedepCfyDz7pf3t7dLHDPaqiKa8WL aqEYBAoPlQ9W5f5c2Xar263Pbd1eYyqEChYwgSobuKavEfh31UnzBr0h6zaGZl3Q0uTpJa7DPkSa qqopBlqylx5OqJajQ01TDL9oum7pwvIDW9nUW7Wi7eEt5ES6CdquNALfKtAc5wc+vUcbxyZvE/Nc lxuNvPNs0l1Vnifx5EgLdoYd0i0SgBZeHw6qdCiN94fGZKj2ZVUy/wALmx8eKnKtLoxoqNdHFTSy O5M1M1LKvlNw8eoEMSGX2Gm2K6uYJt6hmP14fxFwO7TQ8KYNQdPEGlCM16kafnXZ9o3ay5HuLNP6 vvbrA5q36RkqACxNWTQy+IahlJJDVBXpmye2sVtrH11NjFdlrKsTyy1EkUtWhTWi0IK00TLTUoUF dTMXZyTa3L8W43W4yxy3NBpWgABC5p3ZJyfsFAB69NXHK22crbfuEG2his0oJLkFxTUPDwq0VOIJ JLFjWlMp2hpsbWUddS5dZTQtC0k0kKyyS0/i9STxxw3aVom50kFT+f6haJLiOaF7WnjagADQA18i Twr68eiWG32y727cbfeEf93+GWYqGLJpFQ6heJXiAe007sV6/9LQ/wAvmKjKPCtUkVJRQGRKbHwR zUtJAuplkQLGkheoZQ2pj6rnU1xZQxDEsOogku2STkn8/wDAOA6Pt65gvd7kh8dUisIv7OCMaYow eOlc1Y/idizscsx644rA12Wp6ySgjDJTSQsY09dRd/IsscaLH5JjHGrWRSupjYKwI97muYYGjEpo XNB5/t/znqu18vbnvcN9cbbCHEABK51HVU0QU7iApqKgnAFSQOm24TUjIYnL6Z0UkXiuVeJ4wB52 1N6ncqT6h+mx9vDNKdEpoBpK0cE1/wBXyz11EsLMomaXQHj1aFjvCrlmsNThVaSVrsxvpAOq4Ye9 0zwNOrReF4ieNq8KudNK0+VcV9K9c6uoqKp/JPJLK/jp0AkQt44lg10yQakB8CQSWUaPGoGpbXBD dAvlTq09xPcuJLiVncKqiprRVFFUegUAADgBw6iEBY3SyjSy+mQaWVlU31pIGsCh+rMCbDi5A9+P TXXTqGLstguq9ggTUSHNxYxxnR5ALkDUx4FlI9+GKDr3WSOFCbSIwT06eWiYg6uHZ7hEGtb6RfTH Yf46695deNMJHZQ5VVJKJGtje6+VlXxsyDSv5C8AH8874de6iyKQb3uv1Um1m4YgyXuS2khdQAXS wPF+fYPXuuo4TKSmpGNmZ2YyXKrqJ1R6WOuQWOog6RbgW9+rTr3Xng0fWZBclvSHLeEMSJAzInkR rcf7f88eB+XXj1lMUKR60qpZZuRpgjkVlLAhg7mxBNrWIJ0+9fKg6916CKTyeZpZIWTyBWXUZAyA MxudNkAbknk/j3o+nl175dOQGoAtUyuRwSS7rzewa91uSfxx9Pevy611wijKtdJW1DksqJqbgemx TUSf9qIF/wDX53Tz6315gytqL62RQqqOF4F7WvdgNdwAB9AP6+/D+XXuuDWdSrEBbCyotiQQPSxA BP8AvJ/HvfXqdQZUAB0rpUf2RwCTxyTYk/7z7317qA4H41W+tzyf63+vvfWuo7C/9b/1/I/HvfXu sJ/2/wDvX+w+t/fh17rr3vr3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+ 691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9 +691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XY+v9P99/rH3o9e6yj8cn/b/j6i/0J+nv w691mR9PHNv+DcX/ABxcf8i9+PXupUc1yOIrA/WQji/9B/vXutOt16UNJWwyQJQFIhIZFFNKWjbx vK0SkzEghE8q8kafSxB/J9ssjiTxFY6KZH+Aj59HUV7BLZHbHtyW1fptUVDNStT6VHl5Gh9euFQ6 0hkp6uJkmEoMqGMKY2QKpKE3ifyBh9CwZWHPPu69wDL8J6LLq2ns7iW2uYik6GhH+rBB4gjBGR1I xuWoaWovPTGWKRodLxvKtZAFP+cpWZHgLvrFxIjIy6f0/X3WWJ2HY9D/ACP2/wCxQ9Ldpvraxull urUyR1BqraZEIIOpDla+RV1ZGBoQMEKfOQybgKZLEZCmykfhUT0FNAlNlYYtZDzPRB/IyGXh7C35 UFDqCC0dbRPp542joTQsSVNfIP8A5DnoZ8xbc/MJTdNivoruJEAMSqsc6ipOpotRZhqJqVFATRRp 7ukr9nkovFRS4eqjnrQi0bz088NRfWvkMSKyQyFUPqDmyKfr7XLLCys6zIUXiaig+306CX7o3SBl tJ9ll+puKCLUrhqggnQMKxIwag0Brg56a6ioqI5JYp4GjkildXjaML45FsGjkSQM2kyLZwPTb/X9 vBQQCDjooljkglkhmQrKhIIIoQRxB+zr339U+lECsNTMkcMQuqm7EogAj0yK9zbkLYcDj37T69aG t6KoJIrw/af8/Uf7iodvGHEdz/aICi7FjewU8t9CBq5t/T3vSOtKKkCo6VIx9XjKeObKT5GhGUxk s2AFJLEYpJKpUR1r1V5np6Vo3AcGxaM2JJBHtF46zOyW+lhHJSStcUzjGSDT7OhfDtkm028cm7zz wtd2bPa+E60YygKRLmqxupGsfiWoyQR0v5c5kmlx9BXyV2Hl/ghaWbPTU9LDPPjqH1U8dXCZGmFX NAQt0R1ZgpUtz7IBYRESzQaJIzNwjFSA7caHhpBqaE1FaenQ/l37crf93bdubTWcv0RJa4ZVV2ij +AOmokyMumhCsjEKVJz0lM1W53HRQQVAqKOsyeOjrpadI50emopvJwocmSKaVYiW5uqXvYmwMLGC zlkeWJg8UblQag1YU/wHH2/l0Fd73TfrG3t7eRJYb66t/EZQrKUjJIqK1I1BTU17V40JIVS7EqKO PDyLHStDV/xSJauoMzEVMelzTqKZkjSmaAawwGrVqB1ckBHvUcrXceqSsJTtFOBrk1864p9h+3oR e3Nxax7RdKluVufqkDuWJDrRioC8F0dwb11DPkGHC4PMZmtzudjrZaGOiXI1Zr/MyVEtUsctXDTo 6NG+kR6fIzNoRL8G49mF5c2tqlpZPCrmRlULQEAVAJ88Dy8yfz6DGz7RvG9bjzBv0F7NbpbiaUyh iHLhWkRAajiACxrRVz5qDzx+5sjkpqbG5mfC1sE7R04lzlGoooEEhElRPXU2mvV/HzeORGVj9Pp7 rcbbb28clxarMkigmkbdx+QDVTPzFOtbdzhum5ywbZvM1nPbSMF1XUa+GgJy7ugWQUHBlYEH59LP N5qj1GjpZGngghgRGRpZh4lijEbeSZ5ZX1qRYuxY/kk+w/b20oGp1o5JrwGamvAAfsAH5dSTuu82 ZRLW1YvAkaUyzY0imWLMcUoWJY+ZJr014LctBRZCFjKoYOpKOp0sLkFGuClmFwQfaq5224ktpG0f p04gio/Lj0WbJzHY2e4Qq0pEla5Bp+2lPyJ6/9k= --QqnZc1pCYELM54DpCuHVWrV3W=_ZEP1Yr4-- From zlang@redhat.com Sun Aug 28 07:50:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B66127CA0 for ; Sun, 28 Aug 2016 07:50:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5CE8E304048 for ; Sun, 28 Aug 2016 05:50:30 -0700 (PDT) X-ASG-Debug-ID: 1472388628-0bf81509b02bf020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yzDxkiSHcvy3UklF (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Sun, 28 Aug 2016 05:50:29 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A42BA61E4C; Sun, 28 Aug 2016 12:50:28 +0000 (UTC) Received: from localhost (vpn1-5-195.pek2.redhat.com [10.72.5.195]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7SCoRDX023365; Sun, 28 Aug 2016 08:50:28 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH v3] fstests: test xfs rw remount with unknown ro-compat features Date: Sun, 28 Aug 2016 20:50:25 +0800 X-ASG-Orig-Subj: [PATCH v3] fstests: test xfs rw remount with unknown ro-compat features Message-Id: <1472388625-28049-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Sun, 28 Aug 2016 12:50:28 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472388629 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4488 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Although ro-compat features cannot be mounted rw, a bug allows an ro->rw remount transition, and this will corrupt the filesystem if it contains ro-compat features unknown to the running kernel. This bug has been fixed on linux kernel (d0a58e8 xfs: disallow rw remount on fs with unknown ro-compat features), this case is the regression testcase of that bug. Signed-off-by: Zorro Lang --- Hi, V2 fix some mistakes of golden image(.out) file. V3 did below things: - Write more case description - Change _require_scratch to _require_scratch_nocheck - Change _require_xfs_crc to _require_scratch_xfs_crc - Abandon overwriting MKFS_OPTIONS - Give up dmesg output - Change .out file, due to case is changed Thanks, Zorro tests/xfs/263 | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/263.out | 5 +++ tests/xfs/group | 1 + 3 files changed, 99 insertions(+) create mode 100755 tests/xfs/263 create mode 100644 tests/xfs/263.out diff --git a/tests/xfs/263 b/tests/xfs/263 new file mode 100755 index 0000000..bcad627 --- /dev/null +++ b/tests/xfs/263 @@ -0,0 +1,93 @@ +#! /bin/bash +# FS QA Test 263 +# +# Today ro-compat features can't be mounted rw, but a bug allows +# an ro->rw remount transition. This bug has been fixed on linux +# kernel (d0a58e8 xfs: disallow rw remount on fs with unknown +# ro-compat features), and this case is the regression testcase. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# remove previous $seqres.full before test +rm -f $seqres.full + +# real QA test starts here +_supported_fs xfs +_supported_os Linux +_require_scratch_nocheck +# Only V5 XFS disallow rw mount/remount with unknown ro-compat features +_require_scratch_xfs_crc + +_scratch_mkfs_xfs >>$seqres.full 2>&1 + +# set the highest bit of features_ro_compat, use it as an unknown +# feature bit. If one day this bit become known feature, please +# change this case. +$XFS_DB_PROG -x -c "sb 0" \ + -c "write features_ro_compat $((2**31))" \ + $SCRATCH_DEV + +echo "rw mount test" +# Maybe this mount will failed on bad superblock +# But keep testing this anyway +_scratch_mount 2>>$seqres.full +if [ $? -eq 0 ]; then + _fail "rw mount test failed" +fi + +echo "ro mount test" +_scratch_mount -o ro +if [ $? -ne 0 ]; then + _fail "ro mount test failed" +else + # no hang/panic is fine + $FSSTRESS_PROG -d $SCRATCH_MNT -p 4 -n 400 >>$seqres.full 2>&1 +fi + +echo "rw remount test" +_scratch_remount rw 2>>$seqres.full +if [ $? -eq 0 ]; then + dmesg | tail -n 15 >> $seqres.full + _fail "rw remount test failed" +fi + +_scratch_unmount + +# success, all done +status=0 +exit diff --git a/tests/xfs/263.out b/tests/xfs/263.out new file mode 100644 index 0000000..15364d9 --- /dev/null +++ b/tests/xfs/263.out @@ -0,0 +1,5 @@ +QA output created by 263 +features_ro_compat = 0x80000000 +rw mount test +ro mount test +rw remount test diff --git a/tests/xfs/group b/tests/xfs/group index 6905a62..ec3c022 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -260,6 +260,7 @@ 260 auto quick quota 261 auto quick quota 262 auto quick quota +263 auto quick mount 265 auto clone 266 dump ioctl auto quick 267 dump ioctl tape -- 2.7.4 From david@fromorbit.com Sun Aug 28 17:55:13 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 420667CA0 for ; Sun, 28 Aug 2016 17:55:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC9308F8033 for ; Sun, 28 Aug 2016 15:55:09 -0700 (PDT) X-ASG-Debug-ID: 1472424903-0bf8155c752e7b80001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id sMVm6rgEa9ggZsNO for ; Sun, 28 Aug 2016 15:55:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BNCgDpasNXEAI1LHldGwEBAQMBAQGDKQEBAQEBHoFTgnmDeYY8lVoBAQaMcYNrgiqCD4IBhhcEAgKBMDkUAQIBAQEBAQEBBgEBAQEBAQEBN0CEYQEBAQMBJxMcIwULCAMOCgklDwUlAwcaE4g4B7x2AQslHoVIhRWBIIJyEQGFeAWOJIsrjyGPX0iLfIN5HoRkKjSELYIfAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 29 Aug 2016 08:25:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1be8yj-0008Mg-3K; Mon, 29 Aug 2016 08:55:01 +1000 Date: Mon, 29 Aug 2016 08:55:01 +1000 From: Dave Chinner To: Artem Savkov Cc: Eric Sandeen , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. Message-ID: <20160828225501.GJ19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] Make __xfs_xattr_put_listen preperly report errors. References: <1471967653-2561-1-git-send-email-asavkov@redhat.com> <20160824015551.GB19025@dastard> <20160824080833.GA11104@shodan.usersys.redhat.com> <20160825002408.GC19025@dastard> <20160825082109.GB11104@shodan.usersys.redhat.com> <20160825224215.GF19025@dastard> <20160826085928.GA15715@shodan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826085928.GA15715@shodan.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472424903 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3145 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32407 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 26, 2016 at 10:59:28AM +0200, Artem Savkov wrote: > On Fri, Aug 26, 2016 at 08:42:15AM +1000, Dave Chinner wrote: > > So when I look at the fix, and see that it doesn't reproduce on my > > systems, it's clear that it's either not yet fully understood or > > hasn't been fully explained by the person who understands the issue. > > These are some of the questions I've asked myself to understand why > > we are seeing what we've been seeing: > > > > - what condition in the unfixed code leads to the ASSERT > > being tripped? > > - how does the patch prevent that from occurring? > > - at what threshold does the problem trigger (i.e. n=0, n=1, > > n=2 .... ?) > > - how do the environmental initial conditions affect the > > test being run? > > - what do security layers automatically store in the inode > > at creation time? > > - how can we modify the test to always trigger the assert? > > > > I know the answer, and it would take much less time to tell everyone > > that it does to write an email like this. But that means I'll just > > have to do the same thing next time, and the next time, and so on. > > The more people we have that can think through issues like this and > > come to the right conclusion without needing my help, the better off > > we'll all be... > > Fair enough. > > The problem only shows itself with a minimum of 2 xattrs and only when > the buffer gets depleted before the last one. This sentence needs to be in the commit description. :P > LTP's llistxattr02 test > only sets one xattr, but on my testsystem "security.selinux" attribute > is automatically added on file creation which allows this bug to be > reproduced. So I would assume that on your systems there are no > automatically created xattrs and thats why you can't reproduce this. On /some/ of my systems. I have a mix of selinux enabled/disabled test machines, precisely because of the way always having an attribute fork in the inode can perturb test results. I happened to try to reproduce this on a machine that doesn't have selinux enabled.... > Furthermore if buffersize is such that it is enough to hold the last > xattr's name, but not enough to hold the sum of preceeding xattrs > listxattr won't fail with ERANGE, but will suceed returning that xattr's > name without the first character. The first character end's up > overwriting whatever is stored at (context->alist - 1). That should probably also be in the commit description - that way when we have an idea of what problems it fixes when trying to match upstream fixes to problems with older kernels (e.g. for distro kernel backports). Yes, I know it's a lot to put in a commit message, but in a couple of years time nobody will remember these details. We regularly have to work out why something was done 10-15 years ago in the code base, and having good commit messages makes this a much easier job. Someone like me will thank you in future for writing a comprehensive commit message for a relatively simple bug fix.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 28 20:16:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 234AE7CA0 for ; Sun, 28 Aug 2016 20:16:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D9CA6304039 for ; Sun, 28 Aug 2016 18:16:37 -0700 (PDT) X-ASG-Debug-ID: 1472433394-0bf57b5314315a30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id iX34jNE7C8wEONr1 for ; Sun, 28 Aug 2016 18:16:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BLCgB3i8NXEAI1LHldGwEBAQMBAQGDKQEBAQEBHoFTgnmDeYY8lVoBAQaMcYYVgg+CAYYXBAICgTE5FAECAQEBAQEBAQYBAQEBAQEBATdAhGIBAQQnExwREhAIAw4KCSUPBSUDBxoTiD+8ewEBAQcCJR6FSIUVihwFmU+JIYYAgXeNaIZshViDeR6EZCo0hkwBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 29 Aug 2016 10:46:32 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beBBf-00005S-Qc; Mon, 29 Aug 2016 11:16:31 +1000 Date: Mon, 29 Aug 2016 11:16:31 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: rework log recovery to submit buffers on LSN boundaries Message-ID: <20160829011631.GK19025@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: rework log recovery to submit buffers on LSN boundaries References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> <1470935467-52772-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470935467-52772-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472433394 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4262 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32410 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 11, 2016 at 01:11:03PM -0400, Brian Foster wrote: > The fix to log recovery to update the metadata LSN in recovered buffers > introduces the requirement that a buffer is submitted only once per > current LSN. Log recovery currently submits buffers on transaction > boundaries. This is not sufficient as the abstraction between log > records and transactions allows for various scenarios where multiple > transactions can share the same current LSN. If independent transactions > share an LSN and both modify the same buffer, log recovery can > incorrectly skip updates and leave the filesystem in an inconsisent > state. > > In preparation for proper metadata LSN updates during log recovery, > update log recovery to submit buffers for write on LSN change boundaries > rather than transaction boundaries. Explicitly track the current LSN in > a new struct xlog field to handle the various corner cases of when the > current LSN may or may not change. ..... > @@ -4221,8 +4223,39 @@ xlog_recover_process_ophdr( > return 0; > } > > + /* > + * Recovered buffers are submitted for I/O on current LSN change > + * boundaries. This is necessary to accommodate metadata LSN ordering > + * rules of v5 superblock filesystems. > + * > + * Store the new current LSN in l_recovery_lsn as we cannot rely on > + * either record boundaries or transaction boundaries alone to track LSN > + * changes. This has several contributing factors: > + * > + * - Metadata LSNs are updated at buffer submission time. Thus, buffers > + * can only be submitted safely once per current LSN value. > + * - The current LSN is defined as the start cycle/block of the first > + * record in which a transaction appears. > + * - A record can hold multiple transactions. Thus, a transaction change > + * does not guarantee a change in current LSN. > + * - A transaction can span multiple records. Thus, a record change does > + * not guarantee a change in current LSN. Consider the case where a > + * record holds one small transaction and a subsequent that carries > + * over to the next record. Both transactions share the same LSN as > + * per the definition of the current LSN. > + * > + * In summary, this means we must track the current LSN independently > + * and submit buffers for the previous LSN only when it has changed. > + */ > + if (log->l_recovery_lsn != trans->r_lsn) { > + error = xfs_buf_delwri_submit(buffer_list); > + if (error) > + return error; > + log->l_recovery_lsn = trans->r_lsn; > + } I'm not sure this is the right place to be submitting buffers. We can have multiple transactions open at once because the writing of the transaction to the log is split into two parts: xlog_write() which writes the changes to the log, and xfs_log_done() which writes the commit record (via xlog_commit_record()) to close the transaction. Hence we can get the situation where we have multiple open transactions such as: CA CB CC CD +---------+--------+--------+--+--+--------+-------+--+--+ trans A trans B trans C trans C trans D where the changes in multiple transactions are written before the ophdr that contains the commit record ("CA", "CB", ....) is written. With the above code, we'd be doing writeback of A when we see B, not when we see the commit record for A. Like wise B when we see C. And worse, partial writeback of C when we see the commit record for A... i.e. We are very careful to write commit records in the correct order because that is what determines recovery order, but we don't care what order we write the actual contents of the checkpoints or whether they interleave with other checkpoints. As such, ophdrs change transactions and LSNs without having actually completed recovery of a checkpoint. I think writeback should occur when all the transactions with a given lsn have been committed. I'm not sure there's a simple way to track and detect this, but using the ophdrs to detect a change of lsn to trigger buffer writeback does not look correct to me at this point in time. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 28 20:26:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 457AD7CA0 for ; Sun, 28 Aug 2016 20:26:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C50C7AC001 for ; Sun, 28 Aug 2016 18:26:14 -0700 (PDT) X-ASG-Debug-ID: 1472433972-0bf8155c742eafe0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id EpCNorA2643OpG1H for ; Sun, 28 Aug 2016 18:26:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CJCwBPjsNXEAI1LHldHAEBBAEBgykBAQEBAR6BU4J5g3mGPJVaAQEGjHGGFYIPggGGFwQCAoExORQBAgEBAQEBAQEGAQEBAQEBAQE3QIRiAQEEOhwjEAgDDgoJJQ8FJQMHGhOIP7x/AQEBBwIlHoVIhRWKHAWZT48hgXeIEYVXhmyFWIN5HoJqHIFeKjSEICuCAQEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 29 Aug 2016 10:55:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beBK6-000068-EQ; Mon, 29 Aug 2016 11:25:14 +1000 Date: Mon, 29 Aug 2016 11:25:14 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: don't warn on buffers not being recovered due to LSN Message-ID: <20160829012514.GL19025@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: don't warn on buffers not being recovered due to LSN References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> <1470935467-52772-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470935467-52772-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472433972 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1861 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32410 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 11, 2016 at 01:11:05PM -0400, Brian Foster wrote: > The log recovery buffer validation function is invoked in cases where a > buffer update may be skipped due to LSN ordering. If the validation > function happens to come across directory conversion situations (e.g., a > dir3 block to data conversion), it may warn about seeing a buffer log > format of one type and a buffer with a magic number of another. > > This warning is not valid as the buffer update is ultimately skipped. > This is indicated by a current_lsn of NULLCOMMITLSN provided by the > caller. As such, update xlog_recover_validate_buf_type() to only warn in > such cases when a buffer update is expected. > > XXX: other issues here? better to not validate in such cases? I think this is OK - we really want to ensure that buffers that are in cache always have the correct verifier attached to them. Hence if we've read the buffer in, even if we are not modifying it because it's more recent that what is being replayed we should still attach the verifiers to it. If it changes type due to later recovery replay, we'll change the verifier appropriately at that point. > @@ -2557,6 +2542,16 @@ xlog_recover_validate_buf_type( > xfs_blft_from_flags(buf_f)); > break; > } > + > + /* > + * A NULL current LSN indicates the buffer update is skipped due to LSN > + * ordering. Don't warn in such cases, we skip the update for a reason > + * (it's no longer valid)! > + */ I read that the first time as "we skip the update for a reason that is no longer valid" :P perhaps rework this to make it clear what is being referred to here. e.g. No need to warn if the the buffer contents are more recent that this recovery item and hence recovery did not modify the buffer. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 28 20:29:28 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1ADCF7CA0 for ; Sun, 28 Aug 2016 20:29:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7E724AC001 for ; Sun, 28 Aug 2016 18:29:27 -0700 (PDT) X-ASG-Debug-ID: 1472434164-0bf57c1b0817020001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id mD3ToHToO5Fn2Akd for ; Sun, 28 Aug 2016 18:29:24 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CJCwCAj8NXEAI1LHldHAEBBAEBgykBAQEBAR6BU4J5g3mGPJVaAQEGjHGGFYIPggGGFwQCAoExORQBAgEBAQEBAQEGAQEBAQEBAQE3QIRiAQEEJxMcIxAIAw4KCSUPBSUDBxoTiD+8fgEBAQcCJR6FSIUVihwFmU+PIYF3jWiGbIVYg3kehGQqNIZMAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 29 Aug 2016 10:59:23 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beBO7-00006a-3b; Mon, 29 Aug 2016 11:29:23 +1000 Date: Mon, 29 Aug 2016 11:29:23 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: update metadata LSN in buffers during log recovery Message-ID: <20160829012923.GM19025@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: update metadata LSN in buffers during log recovery References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> <1470935467-52772-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470935467-52772-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472434164 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1438 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32410 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Aug 11, 2016 at 01:11:06PM -0400, Brian Foster wrote: > @@ -2552,6 +2562,27 @@ xlog_recover_validate_buf_type( > xfs_warn(mp, warnmsg); > ASSERT(0); > } > + > + /* > + * We must update the metadata LSN of the buffer as it is written out to > + * ensure that older transactions never replay over this one and corrupt > + * the buffer. This can occur if log recovery is interrupted at some > + * point after the current transaction completes, at which point a > + * subsequent mount starts recovery from the beginning. > + * > + * Write verifiers update the metadata LSN from log items attached to > + * the buffer. Therefore, initialize a bli purely to carry the LSN to > + * the verifier. We'll clean it up in our ->iodone() callback. > + */ > + if (bp->b_ops && current_lsn != NULLCOMMITLSN) { > + struct xfs_buf_log_item *bip; > + > + ASSERT(!bp->b_iodone || bp->b_iodone == xlog_recover_iodone); > + bp->b_iodone = xlog_recover_iodone; > + xfs_buf_item_init(bp, mp); > + bip = bp->b_fspriv; > + bip->bli_item.li_lsn = current_lsn; > + } > } Of, so now we have two things we do when current_lsn != NULLCOMMITLSN. I'd change this to something like: ASSERT(bp->b_fspriv == NULL); if (current_lsn == NULLCOMMITLSN) return; if (warn) { .... } if (!bp->b_ops) return /* add buf_item */ Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 28 20:31:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3585A7CA0 for ; Sun, 28 Aug 2016 20:31:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E88B78F8037 for ; Sun, 28 Aug 2016 18:31:15 -0700 (PDT) X-ASG-Debug-ID: 1472434273-0bf8155c742eb0d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id uQ4jorrbvxcZYTQE for ; Sun, 28 Aug 2016 18:31:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CJCwCAj8NXEAI1LHldHAEBBAEBgykBAQEBAR6BU4J5g3mGPJVaAQEGjHGGFYIPggGGFwQCAoExORQBAgEBAQEBAQEGAQEBAQEBAQE3QIRiAQEEOhwjEAgDDgoJJQ8FJQMHGhOIP7x+AQEIAiUehUiFFYocBZlPjyGBYQEVhF2JC4xEg3kehGQqNIZMAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 29 Aug 2016 11:01:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beBPs-000073-1Y; Mon, 29 Aug 2016 11:31:12 +1000 Date: Mon, 29 Aug 2016 11:31:12 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 Message-ID: <20160829013111.GN19025@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 References: <20160826062508.GG19025@dastard> <20160826074844.GA17137@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826074844.GA17137@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472434273 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 447 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32410 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 26, 2016 at 12:48:44AM -0700, Christoph Hellwig wrote: > Hi Dave, > > please consider: "[PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for > extent based filesystems" > > for 4.8. It fixes a regression in the iomap-based fiemap > implementation, and it's fairly trivial as well. Oh, damn, I thought I got that one. I'll append it to the series and push it out. Cheers, Dave. -- Dave Chinner david@fromorbit.com From Zoe23@soldersleeve.com Sun Aug 28 22:20:08 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CD2F77CA0 for ; Sun, 28 Aug 2016 22:20:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88CDD8F8039 for ; Sun, 28 Aug 2016 20:20:05 -0700 (PDT) X-ASG-Debug-ID: 1472440764-0bf57c1b0b1c380001-NocioJ Received: from soldersleeve.com ([180.162.212.10]) by cuda.sgi.com with SMTP id Kvad0072EwE2qf7L for ; Sun, 28 Aug 2016 20:19:25 -0700 (PDT) X-Barracuda-Envelope-From: Zoe23@soldersleeve.com X-Barracuda-Effective-Source-IP: UNKNOWN[180.162.212.10] X-Barracuda-Apparent-Source-IP: 180.162.212.10 Received: from WIN-4450DMVE46C[127.0.0.1] by WIN-4450DMVE46C[127.0.0.1] (SMTPD32); Mon, 29 Aug 2016 09:22:12 +0800 From: "ZoeTang1999@163.com" Subject: Re: UL Approval of Hampool Shrink Terminal and Cold Applied Splice To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: UL Approval of Hampool Shrink Terminal and Cold Applied Splice Content-Type: multipart/mixed; charset=UTF-8; boundary="7Y=_hrhjVfy5uZrBTF51S2tvEHqTsVBuIA" MIME-Version: 1.0 Sender: Zoe23@soldersleeve.com Reply-To: ZoeTang1999@163.com Date: Mon, 29 Aug 2016 09:22:12 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] X-Barracuda-Connect: UNKNOWN[180.162.212.10] X-Barracuda-Start-Time: 1472440765 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 18230 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.52 X-Barracuda-Spam-Status: No, SCORE=1.52 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_FONT_FACE_BAD, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32412 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160829032005.60BF91940062@cuda.sgi.com> This is a multi-part message in MIME format --7Y=_hrhjVfy5uZrBTF51S2tvEHqTsVBuIA Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE4OTM0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpj bGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5EZWFyIA0KU2lyIG9yIE1hZGFtLDwvU1BBTj48 L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwcHQ7IG1zby1wYWdpbmF0 aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQt RkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1 NSwyNTUpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PC9TUEFO PiZuYnNwOzwvUD4NCjxQIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNv LXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJn YigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUp Ij5HcmVldGluZ3MgDQpmcm9tIEhhbXBvb2whPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpj bGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj4mbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0i Rk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigy NTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNv LWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj4m bmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJv bWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDAp OyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1z aGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHls ZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1v cnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5 O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xP UjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAu MDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+SSANCmFtIGhhcHB5IHRvIGlu Zm9ybSB5b3UgdGhhdCB3ZSBoYXZlIGdvdCA8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1J TFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1 NSk7IENPTE9SOiByZ2IoMjU1LDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1r ZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjxGT05UIA0K Y29sb3I9IzAwODBmZj5VTCBhcHByb3ZhbDwvRk9OVD48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUs MjU1LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZv bnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj4mbmJz cDtmb3IgDQpvdXI8Rk9OVCBjb2xvcj0jMDA4MGZmPiBzaHJpbmsgdGVybWluYWw8L0ZPTlQ+IDwv U1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OzsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLXNoYWRpbmc6 IHJnYigyNTUsMjU1LDI1NSkiPmFuZCANCjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1 KTsgQ09MT1I6IHJnYigyNTUsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PEZPTlQgDQpj b2xvcj0jMDA4MGZmPmNvbGQgYXBwbGllZCBzcGxpY2U8L0ZPTlQ+PC9TUEFOPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBCQUNLR1JPVU5EOiBy Z2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1 KSI+LiANCkhlcmUgSSB3b3VsZCBsaWtlIHRvIHNlbmQgdGhlIFVMIGFwcHJvdmFsIGRvY3VtZW50 IGZvciB5b3VyIA0KcmVmZXJlbmNlLjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjog bGVmdDsgTUFSR0lOOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9 TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21h biYjMzk7OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsMCwwKTsg Rk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tc2hh ZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIHN0eWxlPSJURVhU LUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIg DQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMg TmV3IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2Io MCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7 IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj5BbnkgDQpyZXF1ZXN0cyBmcm9tIHlvdSB3 aWxsIGJlIGhpZ2hseSBhcHByZWNpYXRlZC4gPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpj bGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgc3R5bGU9 IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3Jw aGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtU aW1lcyBOZXcgUm9tYW4mIzM5OzsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6 IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAw MDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPjwvU1BBTj48U1BBTiANCnN0eWxl PSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgQ09MT1I6IHJnYigwLDAs MCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+TWVl dCANCnVzIGluIEF1dG9tZWNoYW5pa2EgRnJhbmtmdXJ0IGZyb20gMTMgdG8gMTcgU2VwIGZvciBt b3JlIG5ldyBwcm9kdWN0cyBvciANCiZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQt U0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdCI+PG86cD48L286cD48 L1NQQU4+PC9QPg0KPFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMHB0OyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxl PSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgQkFDS0dST1VORDogcmdi KDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBt c28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSki PnZpc2l0IA0Kb3VyIHdlYnNpdGU6IDwvU1BBTj48U1BBTj48QSBocmVmPSJodHRwOi8vd3d3Lmhh bXBvb2wuY29tLyI+PFU+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCww LDE1Myk7IEZPTlQtU0laRTogMTJwdDsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmU7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUp OyB0ZXh0LXVuZGVybGluZTogc2luZ2xlIiANCmNsYXNzPTE1PjxGT05UIGNvbG9yPSMwMDgwZmY+ d3d3LmhhbXBvb2wuY29tPC9GT05UPjwvU1BBTj48L1U+PC9BPjwvU1BBTj48U1BBTiANCnN0eWxl PSJGT05ULUZBTUlMWTog5a6L5L2TOyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xP UjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMz OTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUs MjU1KTsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1z by1hc2NpaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWhhbnNp LWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7Ij4uPC9TUEFOPjxTUEFOIA0K c3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7OyBCQUNLR1JPVU5E OiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBt c28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovk vZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUs MjU1KSI+Jm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O1RpbWVz IE5ldyBSb21hbiYjMzk7OyBCQUNLR1JPVU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdi KDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1z by1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0 OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSI+PG86cD48L286cD48L1NQQU4+PC9QPg0K PFAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMHB0OyBtc28tcGFnaW5hdGlvbjog d2lkb3ctb3JwaGFuIiANCmNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlM WTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgQkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1 KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5 O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJu aW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJnYigyNTUsMjU1LDI1NSkiPiZuYnNwOzwvU1BB Tj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5Ozsg QkFDS0dST1VORDogcmdiKDI1NSwyNTUsMjU1KTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZh bWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLXNoYWRpbmc6IHJn YigyNTUsMjU1LDI1NSkiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJURVhULUFM SUdOOiBsZWZ0OyBNQVJHSU46IDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQpj bGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3 IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1LDI1NSk7IENPTE9SOiByZ2IoMCww LDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1z by1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1G QU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IEJBQ0tHUk9VTkQ6IHJnYigyNTUsMjU1 LDI1NSk7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQt a2VybmluZzogMS4wMDAwcHQ7IG1zby1zaGFkaW5nOiByZ2IoMjU1LDI1NSwyNTUpIj48bzpwPjwv bzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwcHQ7 IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KY2xhc3M9TXNvTm9ybWFsPjxCPjxTUEFO IA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYig3MSw0OCwyNDMpOyBGT05U LVNJWkU6IDEzLjVwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMm IzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzog MC4wMDAwcHQiPldlIA0KaW52aXRlIHlvdSB0byB2aXNpdCB1cyBvbiBvdXIgYm9vdGg8L1NQQU4+ PC9CPjxCPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYig3MSw0 OCwyNDMpOyBGT05ULVNJWkU6IDE1cHQ7IEZPTlQtV0VJR0hUOiBib2xkOyBtc28tc3BhY2VydW46 ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDAuMDAwMHB0Ij4mbmJzcDs8L1NQQU4+PC9CPjxCPjxVPjxTUEFOIA0Kc3R5bGU9 IkZPTlQtRkFNSUxZOiDlrovkvZM7IENPTE9SOiByZ2IoMjU1LDAsMjU1KTsgRk9OVC1TSVpFOiAx NXB0OyBGT05ULVdFSUdIVDogYm9sZDsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmU7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IHRleHQt dW5kZXJsaW5lOiBzaW5nbGU7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAmIzM5O1RpbWVzIE5ldyBS b21hbiYjMzk7OyBtc28tYXNjaWktZm9udC1mYW1pbHk6IENhbGlicmk7IG1zby1oYW5zaS1mb250 LWZhbWlseTogQ2FsaWJyaSI+SDExIA0KaW4gSGFsbCBOby4gMy4xIDwvU1BBTj48L1U+PC9CPjxC PjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgQ09MT1I6IHJnYig3MSw0OCwyNDMp OyBGT05ULVNJWkU6IDEzLjVwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vy bmluZzogMC4wMDAwcHQiPmR1cmluZyANCjEzLTE3Jm5ic3A7U2VwdGVtYmVyLCAyMDE2OjwvU1BB Tj48L0I+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmk7IENPTE9SOiByZ2IoMCww LDI1NSk7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsg bXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsiPiZuYnNwOzxB IA0KbmFtZT1PTEVfTElOSzY+PC9BPjwvU1BBTj48U1BBTj48SU1HIA0Kc3JjPSJjaWQ6aW1nMC5q cGciIA0Kd2lkdGg9ODAwIGhlaWdodD0yMjU+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBDYWxpYnJpOyBGT05ULVNJWkU6IDEwLjVwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAx LjAwMDBwdDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTsi PiZuYnNwOzwvU1BBTj48L1A+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmk7IEZP TlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYmlk aS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OyI+DQo8UCANCnN0eWxlPSJU RVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsg VEVYVC1JTkRFTlQ6IDBweDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgRk9OVDogMTJwdC8xOHB0ICYj Mzk7VGltZXMgTmV3IFJvbWFuJiMzOTssIHNlcmlmOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRU RVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgV09SRC1TUEFDSU5HOiAwcHg7 IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCIgDQpjbGFzcz1Nc29Ob3JtYWw+PFNQQU4g DQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xPUjogbmF2eTsgRk9O VC1TSVpFOiAxMy41cHQiPjxGT05UIA0Kc2l6ZT0xIGZhY2U95b6u6L2v6ZuF6buRPjxGT05UIGNv bG9yPSMwMDAwMDAgc2l6ZT0zIGZhY2U9IlRpbWVzIE5ldyBSb21hbiI+QmVzdCANCnJlZ2FyZHMs PC9GT05UPjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1UUkFOU0ZPUk06IG5v bmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7 IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEZPTlQ6IDEycHQvMThwdCAmIzM5O1RpbWVzIE5ldyBSb21h biYjMzk7LCBzZXJpZjsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1h bDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ry b2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IG5hdnk7IEZPTlQtU0laRTogMTMuNXB0Ij48 Rk9OVCANCnNpemU9MSBmYWNlPeW+rui9r+mbhem7kT48Rk9OVCBjb2xvcj0jMDAwMDAwIHNpemU9 MyBmYWNlPSJUaW1lcyBOZXcgUm9tYW4iPlpvZSANClRhbmc8L0ZPTlQ+PC9QPg0KPFAgDQpzdHls ZT0iVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1 NSk7IFRFWFQtSU5ERU5UOiAwcHg7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEZPTlQ6IDEycHQvMThw dCAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7LCBzZXJpZjsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsg TEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzog MHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFsPjwv Rk9OVD48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlm OyBDT0xPUjogbmF2eTsgRk9OVC1TSVpFOiAxMy41cHQiPjxGT05UIA0Kc2l6ZT0xIGZhY2U95b6u 6L2v6ZuF6buRPjxJTUcgYm9yZGVyPTAgaHNwYWNlPTAgYWx0PSIiIGFsaWduPWJhc2VsaW5lIA0K c3JjPSJjaWQ6aW1nMS5qcGciPjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1U UkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IFRFWFQt SU5ERU5UOiAwcHg7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEZPTlQ6IDEycHQvMThwdCAmIzM5O1Rp bWVzIE5ldyBSb21hbiYjMzk7LCBzZXJpZjsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQ QUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Vi a2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IG5hdnk7IEZPTlQtU0la RTogMTMuNXB0Ij48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5z LXNlcmlmOyBDT0xPUjogbmF2eTsgRk9OVC1TSVpFOiAxMy41cHQiPjwvU1BBTj48U1BBTiANCnN0 eWxlPSJDT0xPUjogc2lsdmVyIj48bzpwPjxGT05UIHNpemU9MSBmYWNlPeW+rui9r+mbhem7kT48 L0ZPTlQ+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGp1c3RpZnk7 IFRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUp OyBURVhULUlOREVOVDogMHB4OyBNQVJHSU46IDBjbSAwY20gMHB0OyBGT05UOiAxMnB0LzE0LjI1 cHQgJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5Oywgc2VyaWY7IFdISVRFLVNQQUNFOiBub3JtYWw7 IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBXT1JELVNQQUNJTkc6 IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4IiANCmNsYXNzPU1zb05vcm1hbD48 U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2FsaWJyaSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJn YigwLDUxLDEwMik7IEZPTlQtU0laRTogMTAuNXB0Ij48bzpwPjxGT05UIA0Kc2l6ZT0xIGZhY2U9 5b6u6L2v6ZuF6buRPjwvRk9OVD48L286cD48L1NQQU4+PC9QPg0KPFAgDQpzdHlsZT0iVEVYVC1B TElHTjoganVzdGlmeTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9VTkQtQ09MT1I6IHJn YigyNTUsMjU1LDI1NSk7IFRFWFQtSU5ERU5UOiAwcHg7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEZP TlQ6IDEycHQvMTQuMjVwdCAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7LCBzZXJpZjsgV0hJVEUt U1BBQ0U6IG5vcm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7 IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xh c3M9TXNvTm9ybWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBDYWxpYnJpLCBzYW5zLXNl cmlmOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpFOiAxMC41cHQiPjxvOnA+PEZPTlQg DQpzaXplPTEgZmFjZT3lvq7ova/pm4Xpu5E+PC9GT05UPjwvbzpwPjwvU1BBTj48L1A+DQo8UCAN CnN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5OyBURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dS T1VORC1DT0xPUjogcmdiKDI1NSwyNTUsMjU1KTsgRk9OVC1WQVJJQU5UOiBub3JtYWw7IEZPTlQt U1RZTEU6IG5vcm1hbDsgVEVYVC1JTkRFTlQ6IDBweDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgRk9O VC1GQU1JTFk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTssIHNlcmlmOyBXSElURS1TUEFDRTog bm9ybWFsOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1T SVpFOiAxMnB0OyBGT05ULVdFSUdIVDogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtp dC10ZXh0LXN0cm9rZS13aWR0aDogMHB4IiANCmNsYXNzPU1zb05vcm1hbD48Rk9OVCBmYWNlPeW+ rui9r+mbhem7kT48Rk9OVCBzaXplPTE+PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsLCBzYW5zLXNlcmlmOyBDT0xPUjogbmF2eTsgRk9OVC1TSVpFOiAxMHB0Ij5BZGQ6IEZsb29y IA0KNCwmbmJzcDsgQnVpbGRpbmcgMTIsIExhbmUgMTc1NSBXZW5iZWkgUmQuLCBOYW54aWFuZyBU b3duLCBKaWFkaW5nIERpc3RyaWN0LCANClNoYW5naGFpLCBDaGluYSZuYnNwOyZuYnNwOyBaaXA6 IDIwMTgwMjwvU1BBTj48L0I+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IENhbGlicmksIHNh bnMtc2VyaWY7IENPTE9SOiByZ2IoMCw1MSwxMDIpOyBGT05ULVNJWkU6IDEwLjVwdCI+PG86cD48 L286cD48L1NQQU4+PC9GT05UPjwvRk9OVD48L1A+DQo8UCANCnN0eWxlPSJURVhULUFMSUdOOiBq dXN0aWZ5OyBURVhULVRSQU5TRk9STTogbm9uZTsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI1NSwy NTUsMjU1KTsgRk9OVC1WQVJJQU5UOiBub3JtYWw7IEZPTlQtU1RZTEU6IG5vcm1hbDsgVEVYVC1J TkRFTlQ6IDBweDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgRk9OVC1GQU1JTFk6ICYjMzk7VGltZXMg TmV3IFJvbWFuJiMzOTssIHNlcmlmOyBXSElURS1TUEFDRTogbm9ybWFsOyBMRVRURVItU1BBQ0lO Rzogbm9ybWFsOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0OyBGT05ULVdFSUdI VDogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDog MHB4IiANCmNsYXNzPU1zb05vcm1hbD48Rk9OVCBmYWNlPeW+rui9r+mbhem7kT48Rk9OVCBzaXpl PTE+PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xP UjogbmF2eTsgRk9OVC1TSVpFOiAxMHB0Ij5XZWJzaXRlOjxGT05UIA0KY29sb3I9IzAwODBjMD4m bmJzcDs8L0ZPTlQ+PC9TUEFOPjwvQj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQ2FsaWJy aSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigwLDUxLDEwMik7IEZPTlQtU0laRTogMTAuNXB0Ij48 QSANCnN0eWxlPSJDT0xPUjogcHVycGxlOyBURVhULURFQ09SQVRJT046IHVuZGVybGluZSIgDQpo cmVmPSJodHRwOi8vd3d3LmhhbXBvb2wuY29tLyI+PFNQQU4gY2xhc3M9MTU+PEI+PFNQQU4gDQpz dHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBGT05ULVNJWkU6IDEwcHQiPjxG T05UIA0KY29sb3I9IzAwODBmZj53d3cuaGFtcG9vbC5jb208L0ZPTlQ+PC9TUEFOPjwvQj48L1NQ QU4+PC9BPjwvU1BBTj48Rk9OVCANCmNvbG9yPSMwMDgwZmY+PEI+PFNQQU4gDQpzdHlsZT0iRk9O VC1GQU1JTFk6IEFyaWFsLCBzYW5zLXNlcmlmOyBDT0xPUjogbmF2eTsgRk9OVC1TSVpFOiAxMHB0 Ij4mbmJzcDsgDQombmJzcDsmbmJzcDs8L1NQQU4+PC9CPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFN SUxZOiBDYWxpYnJpLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDAsNTEsMTAyKTsgRk9OVC1TSVpF OiAxMC41cHQiPjxvOnA+PC9vOnA+PC9TUEFOPjwvRk9OVD48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQ IA0Kc3R5bGU9IlRFWFQtQUxJR046IGp1c3RpZnk7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNL R1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1NSwyNTUpOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgRk9O VC1TVFlMRTogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyBNQVJHSU46IDBjbSAwY20gMHB0OyBG T05ULUZBTUlMWTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5Oywgc2VyaWY7IFdISVRFLVNQQUNF OiBub3JtYWw7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05U LVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hUOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Vi a2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiIA0KY2xhc3M9TXNvTm9ybWFsPjxGT05UIGZhY2U9 5b6u6L2v6ZuF6buRPjxGT05UIHNpemU9MT48Rk9OVCBjb2xvcj0jMDA4MGMwPjxCPjxTUEFOIA0K c3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlhbCwgc2Fucy1zZXJpZjsgQ09MT1I6IG5hdnk7IEZPTlQt U0laRTogMTBwdCI+RS1tYWlsOiZuYnNwOzxTUEFOIA0Kc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6 IHdoaXRlIj48QSANCnN0eWxlPSJDT0xPUjogcHVycGxlOyBURVhULURFQ09SQVRJT046IHVuZGVy bGluZSIgDQpocmVmPSJtYWlsdG86c2FsZXMzQGhhbXBvb2wuY29tIj48Rk9OVCANCmNvbG9yPSMw MDgwZmY+c2FsZXMzQGhhbXBvb2wuY29tPC9GT05UPjwvQT4sJm5ic3A7PEEgDQpzdHlsZT0iQ09M T1I6IHB1cnBsZTsgVEVYVC1ERUNPUkFUSU9OOiB1bmRlcmxpbmUiIA0KaHJlZj0ibWFpbHRvOnNh bGVzOEBoYW1wb29sLmNvbSI+PEZPTlQgDQpjb2xvcj0jMDA4MGZmPnNhbGVzOEBoYW1wb29sLmNv bTwvRk9OVD48L0E+PC9TUEFOPjwvU1BBTj48L0I+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6 IENhbGlicmksIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMCw1MSwxMDIpOyBGT05ULVNJWkU6IDEw LjVwdCI+PG86cD48L286cD48L1NQQU4+PC9GT05UPjwvRk9OVD48L0ZPTlQ+PC9QPg0KPFAgDQpz dHlsZT0iVEVYVC1BTElHTjoganVzdGlmeTsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEJBQ0tHUk9V TkQtQ09MT1I6IHJnYigyNTUsMjU1LDI1NSk7IEZPTlQtVkFSSUFOVDogbm9ybWFsOyBGT05ULVNU WUxFOiBub3JtYWw7IFRFWFQtSU5ERU5UOiAwcHg7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IEZPTlQt RkFNSUxZOiAmIzM5O1RpbWVzIE5ldyBSb21hbiYjMzk7LCBzZXJpZjsgV0hJVEUtU1BBQ0U6IG5v cm1hbDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQtU0la RTogMTJwdDsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IC13ZWJraXQt dGV4dC1zdHJva2Utd2lkdGg6IDBweCIgDQpjbGFzcz1Nc29Ob3JtYWw+PEZPTlQgZmFjZT3lvq7o va/pm4Xpu5E+PEZPTlQgc2l6ZT0xPjxCPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlh bCwgc2Fucy1zZXJpZjsgQ09MT1I6IG5hdnk7IEZPTlQtU0laRTogMTBwdCI+Q2VsbDogDQotODYt MTg3MjE2MzU4NTEsJm5ic3A7PFNQQU4gDQpzdHlsZT0iQkFDS0dST1VORC1DT0xPUjogd2hpdGUi Pi04Ni0xNTAwODQzODc1MiZuYnNwOyhXaGF0c2FwcC9WaWJlcikmbmJzcDsmbmJzcDs8L1NQQU4+ PC9TUEFOPjwvQj48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQIA0Kc3R5bGU9IlRFWFQtQUxJR046IGp1 c3RpZnk7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDI1 NSwyNTUpOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgRk9OVC1TVFlMRTogbm9ybWFsOyBURVhULUlO REVOVDogMHB4OyBNQVJHSU46IDBjbSAwY20gMHB0OyBGT05ULUZBTUlMWTogJiMzOTtUaW1lcyBO ZXcgUm9tYW4mIzM5Oywgc2VyaWY7IFdISVRFLVNQQUNFOiBub3JtYWw7IExFVFRFUi1TUEFDSU5H OiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDApOyBGT05ULVNJWkU6IDEycHQ7IEZPTlQtV0VJR0hU OiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAw cHgiIA0KY2xhc3M9TXNvTm9ybWFsPjxGT05UIGZhY2U95b6u6L2v6ZuF6buRPjxGT05UIHNpemU9 MT48Qj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWwsIHNhbnMtc2VyaWY7IENPTE9S OiBuYXZ5OyBGT05ULVNJWkU6IDEwcHQiPjxTUEFOIA0Kc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6 IHdoaXRlIj5UZWxsOi04Ni0yMS02OTkyNzY1MSANCkZheDotODYtMjEtNjk5Mjc2NTI8L1NQQU4+ PC9TUEFOPjwvQj48L0ZPTlQ+PC9GT05UPjwvUD48L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1G QU1JTFk6IENhbGlicmk7IEZPTlQtU0laRTogMTAuNXB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVz JiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5 OyI+PG86cD48L286cD48L1NQQU4+PCEtLUVuZEZyYWdtZW50LS0+PC9CT0RZPjwvSFRNTD4NCg0K --7Y=_hrhjVfy5uZrBTF51S2tvEHqTsVBuIA Content-Type: image/jpeg; name="wps4D94.tmp.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="wps4D94.tmp.png" Content-ID: Content-Description: Photo iVBORw0KGgoAAAANSUhEUgAAAyAAAADhCAYAAAAwLNHkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz AAAWJQAAFiUBSVIk8AAAIABJREFUeAEAi4l0dgEBAPv/AwD3AAIA+wAAAAEA/wACAP8AAQAAAf4A AAAAAAD/AgABAP8AAAD+AP8BAQAAAAIAAP8BAAIA/gD/AAAAAAD/AAAA/wAAAAIAAAAAAAAA/wAA Af8AAP8BAAEAAQABAAAA/gAAAP8AAAAAAQAAAP8AAAMAAAD+AAIAAAD9AAAB/wAAAAAAAP8AAAIA AAD/AQAA/wAAAAAAAAAA/wEAAAABAAAAAAAAAAAAAAAAAAAB/gAA/wIAAAD/AAIA/wAAAAAAAAAA AAAAAAD/AAAA/wAAAAABAAAAAAAAAAAAAAH/AAABAP4AAAAAAP8AAgD/AP8AAQAAAAAAAQD/AAAA AAABAAIA/gAAAP8AAAAAAAAAAQD+AAEAAAEAAAAAAAAA/wEAAAABAP8A/QAAAAAAAgAAAAEAAwAA AAAA/gD/AAAAAQAAAAAA/wD/AAIA/wABAAAA/gAAAP8BAAAAAAAAAQAAAAD/AAABAAIA/wD/AP8A /wABAAEAAQABAP8AAAD/AAAAAAAAAAEAAQAAAAEAAAD+AAEAAAABAAAA/gAAAP8BAgAAAP4AAAAA AAAAAAAA/wAAAQAAAP8AAAAAAQAAAAAAAAAAAAAAAAEAAAD/AAAAAAAB/wAAAgAAAP8AAAD+AQEA AAD/AAAAAAAAAAAAAAAAAAEAAAAA/wEAAAABAAAAAAAAAAAA/wAAAAABAAD///4AAQAAAAEAAAAA AAIAAAAAAP8AAAAAAf8AAAAAAAAAAQD+AAAAAAD+AAEAAAABAAAAAAAAAAAAAgAAAAAAAAAAAP8A /wD/Af8AAP8AAAL/AgAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAACAAAAAP// AAAA/wAAAQAAAP8AAAEAAgAAAAAA/wD+AAABAAAAAAEAAAABAAD/AAD/AP0AAQEBAAAAAAAA/wIA AAD/AAAAAAAAAQEAAAAAAAAAAAAA/wAAAQAAAAAAAAD/AAAAAAEAAAAAAAAB//4A/wAAAAABAAAA AAIAAQAAAAD//gAAAAAA/wAAAAABAAAAAAEAAP//AAAA/wAAAAAAAAABAP8A/wABAQEAAf//AAAB /wD//wAA/wABAAEAAQAAAAAAAAEBAAAAAQAAAAAAAP8AAAEA/gAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/AAAAAAABAP8AAAEAAAD/AQAAAAEAAAAAAAIAAAD/AAAA /wAAAAAAAAAAAAAAAAAAAAEAAQD/AP8AAAAAAAAA/gAAAQIAAP8AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA/wAAAAABAAAA/wAAAQAAAP8A/wAAAQEAAAAAAAD/AAABAAAAAAAAAP8B AAAAAAAAAP8AAAEAAAD/AAIAAAEAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8B AAEAAQAAAf8AAAD/AAAAAAAAAAIAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAf4AAAAAAAAAAAAAAAIA AAAAAAD/AAABAAAAAAAAAP8A/wAAAf8AAP8AAAAAAQAAAQEAAAAAAAAAAAAAAAAAAP8AAAEAAAAA AAAA/wAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gABAAEAAAABAAAAAAAAAAAA/wAAAAAB AAAAAP8AAAD/AAH/AQD/AAAAAQABAAAAAAAAAAAAAAAAAP8AAAAAAf4AAP8AAAEAAAAAAAAAAAAB AAAAAQAAAP4AAAAAAAAAAAAAAAIAAAAAAP8AAAAAAQAAAP8AAAAAAAAAAP4AAAEAAAAAAQAAAAEA AAAAAP///wABAQEAAAAAAAD/AAABAAAAAAAAAP8A/wD/AAAA/wEBAAL/AAAAAAAAAAEAAAAAAAAA AAAAAAAAAAAAAAAA/wAAAAABAAAA/wAAAQAAAAAAAAD/AAABAAAAAAABAP8AAAAAAP8AAAEAAAAA AAAA/wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAABAAAA/wAA/gABAAMBAAD/AP8AAP8A AAAAAQABAP8A/wAAAAAAAAAAAAEAAAAAAAAA/wAAAQAA//8AAAAAAAABAAEAAAD/AAAAAAAAAAEA AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAP8AAAEAAAD/AAAAAAAAAAH+AAD/AQAB AAEA/wAAAAEAAAAAAAAA/wAAAAABAAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAP8AAAEAAP// AQAAAAEAAAD/AAEAAAAAAAAAAAEAAP8AAAAAAP8AAAD/AAAAAgAAAAAAAAAAAAD/AAABAAAAAAAA AP8AAAAAAQAAAP//AAEAAgAAAP8AAAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAABAAAAAAAA AP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQAA AAAAAP8AAAAAAAAAAAEAAAD/AAABAAAAAAAAAP8AAAAAAAAAAQAA////AAAAAQABAAEA/wD+AAAA AAABAQEAAP8AAAAAAQAAAAAA/gH/AAAAAAAAAAAAAP8BAAIAAAAAAP8AAAEAAAAAAAAA/wAAAAAB AAAA/wAAAQAAAAAAAAD/AQAAAAAAAAAAAP8AAAD/AQAAAAAAAAL/AAD/AP8AAAAAAAEAAQAAAP8A AAEAAAD/AAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAA AAAAAQAAAAAAAQAAAP8AAgEBAPwA/QAA/wIAAgABAAAAAAAAAP8AAAEAAAAAAAAA/wAAAAABAP4A AAAAAQAAAf8AAAAA/wAAAAAAAQABAP4B/wAAAAAAAgAAAAAAAAAAAAAAAAD/AAAAAAAA/wEAAQAA AAAAAAD/AAAAAAEAAAAAAAD///8AAQD/AAEAAQAAAP8AAQAAAP8AAAAAAAAAAgACAP8A/wD/AAAA AAABAAAAAAAAAAEAAAD/AP8AAAAAAf4AAP8AAAAAAwAAAf8AAAAAAAD/AAD/AAEAAAAAAAEAAAAA AAAAAAAAAP4AAAAAAQAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAD//wABAP8A/wAAAAAB AQAAAAIAAAABAAAAAAAAAP4AAf8AAAEAAAAAAQAAAP//AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA AAD/AAD9AAAAAAAAAAEBAAABAAAAAQAAAAD/AQAAAAAAAAEAAAD/AAD/AAAA/wEAAAAA/wABAAAA AP//AAAAAAABAAEAAAABAAAAAAD+AAAAAAEAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABAP8AAf8AAP4AAgAAAQEAAAD+AAAA/wAAAAEAAAD/AAIAAAAAAP8AAAD/AAAA AAAA/wEAAAABAAAAAAAAAAEAAAD/AAABAAAAAAAAAf8AAAAAAAAAAP8A/wD/AAAAAQABAP4AAAAA AAEAAgABAAEA/QD9AAAA/wABAQAAAP8BAAAAAQAAAAAAAAD+AAIAAAD/AAIA/wAAAAAB/gAA/wAA AAACAAEAAAABAP4AAAAAAP8A/wD/AAIAAAABAAAAAAAAAf4AAP8AAAAAAgAAAAAAAAAAAAIA/wD/ AP8A/wEAAAD/AQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAB/gAA/wIAAAACAAAA/wAAAP4AAAD/AP8A AgAAAAAAAQAAAP8AAQD9AgEA/wMFAAACAwAAAQEAAP8BAAAA/wAAAQAAAP8AAAAAAAAAAAAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD/AAABAAAA/wEAAAD+AAABAQAAAAEAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD//wAA AP8AAP79AAH9/AAC/gAAAgAAAP8AAAD+AQAAAQAAAAEAAAAAAAAA////AAAAAAABAQEAAAAAAAAA AAAAAAAAAP//AAAAAAAAAQEAAAAAAAD/AAABAAAA/wAAAAAB/gAA/wAAAQAAAAAAAAAAAAEAAAD/ AP8AAAD/AQIAAP8AAAIAAAD/AAAAAAEAAP4AAAD/AAYA//8EAAEMEer/YWMSAAME/AAAAP0A//8E AAAAAQABAf8AAAAAAP//AAAAAAAAAQAAAAABAAD+/wAAAQAAAAIBAAD+AAAAAAAAAP8AAAABAAAA AAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAP8AAAAAAAABAQAAAAAAAP8AAAABAAAA/wAAAAAAAAAA AAAA/wAAAP8AAQAAAAAAAQAAAAEA/wAAAAAA/gEBAAAAAAACAAAAAP8AAAEAAAD/AAAA/gEAAAEA AAD//wAAAAEAAAAAAAABAAAAAf8AAAAAAAD/AQAA/wAAAAAAAAAC/wAAAAAAAAAAAAD/AQAA/wAA AAAAAAAAAAAAAP8AAAEAAAAAAAAA/wAAAAAAAAACAAAAAAEAAP4AAAAAAQAAAP8AAAL/AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAP4BAAAAAAAAAv8AAAAAAAAA AAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4A AAADAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAP8AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAEAAQAA AAAA/wD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAA AAAAAAAAAAD/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAAEAAAD/AAD/AQAAAAAAAAAAAAAA AAAAAf8AAAAAAAABAQAA//8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAD/ AAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAABAAAA/wAA/wEAAAAAAAAB/wAAAAEA AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAEAAAAA/wAA/wAAAAABAAAA/wAAAAAAAAAAAAAAAQAA /wAAAAAAAAAB/wAAAAAAAP8AAAAAAAAAAQEAAP8AAAAAAAAAAf8AAAAAAAAAAAAA/wEAAAAAAAAA AAAAAf8AAP//AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAA AQAAAP8AAAAAAAAAAQAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAQAA AAAAAAAAAAAA/wAAAAD/AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AQEAAP//AAABAAAA/wAAAAEBAAD//wAAAAAAAAAAAQAAAAAAAQD/AP8AAAAAAAAAAAABAAAAAAAC AQAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAQAAAAAAAAAAAAEAAAAAAQAAAP8AAAAB AAAAAAAAAAAAAAAAAAAA//8AAAABAP8AAAABAAAAAQAAAP8A/wAAAQEAAP//AP8AAAAAAAAA//// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQEBAP///wAAAAAAAAAAAAEAAAAAAQAA AAABAAAAAAAAAAAAAAD/AAAAAAAAAAEAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP8AAAAAAQEAAQEAAAIAAAAAAAEAAAD/AAAAAAD//wAA////AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP8AAAABAQAAAAAAAAAAAAAAAAAAAP8BAAEBAAABAQEAAAEAAAAAAAAA/wAAAAAA AP///wAAAAAAAQEAAP///wAAAAEAAAAAAAAAAAABAAAA/wD/AAAAAQAAAAAAAAAAAAEAAAD/AAAA AAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAA/wAAAAAAAP8AAAAA AQAAAf8AAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAQAAAQAAAAD/AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAP8AAAABAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA /wEAAAEAAAAA/wAA/wAAAAIBAAD//wAA//8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP4AAQABAf8AAAAAAAH/AAAAAAAAAAAAAAAAAQD/AQAAAf8AAAAAAAAAAQAAAP8AAAAA AAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAABAP8AAAABAAAAAAD/AAAAAAEAAAD/AAAAAAAAAAAA AP8A/wAAAQEAAAAAAAH//wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wD//wAAAQEBAAAA/wAAAAEA AAAAAAEB/wD//wAAAAABAAAA/wABAQEA//8AAAAA/wAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAEAAAAAAAD//wAAAQAAAAEAAAD/AQAA//8AAAEBAAAA/wAAAQAAAAAAAAAAAAAAAAAAAAD/ AAAAAQAAAAAAAAD/AAAAAAAA/wEAAAH/AAAAAAAAAAEAAP//AAAAAAAAAQAAAP8AAAAAAP8AAQAB AAH//wAAAAEAAAEAAP8A/wD/AAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAP8AAAABAAAAAAAAAP8A AAABAAAAAAD/AP8AAAABAAEAAAAAAAAAAAAAAAEBAAAA/wAAAgAAAAAAAAD+AQAAAAAAAAEAAAAA AAAA/wAAAAAAAQAAAP8AAAAAAAD/AQACAP8AAAAAAP0BAQAB//8AAAEAAAEAAQD/AAAAAAAAAAEA AAD/AP8A////AAAAAAAAAAAA//8AAAAAAAAAAQAAAAABAP8BAAAB/wAAAAAAAP8AAAAAAQAAAP8A AAEAAAD/AQAAAAAAAAD//wABAAEAAAAAAAAA/wAAAAEAAAAAAP8A/wAAAAEAAAAAAAEAAAACAQAA AAAAAAEAAAD//wAAAAAAAAABAAAA/wAAAAEAAAAAAAABAAAAAf8AAP4BAAAA/wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA/wD/AAAAAQAAAAAAAAD/AAAAAAAAAAEAAAD/AAD/AAAAAQAAAAAAAAAA AAAA/gAAAQAAAAAAAAD/AQAA/wAAAAAA/wAA/wAAAAEAAAD/AAAAAAAAAQAAAP8AAAAB//8AAAAB AAEAAAD/AAAAAAAAAAEAAAD/AP8AAAAAAAAAAQAAAAAAAQL/AP//AAAB/wAAAP8AAAAB/wD/AQEA AP8AAAAAAAAAAAEAAf//AP8AAAAAAQAAAAABAAAB/wAAAAAA/gABAAAAAAAA//8AAgABAP4BAAAA AAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAD/AP8AAQAAAAAAAQAAAAAAAAD/AAAA/wAAAAH/ AAAAAQAA/wABAAAA/wABAAAAAAAAAP8AAAAAAAAAAAABAAABAAAA//8AAAABAAEBAAAA//8AAAAA AP8AAQAAAAAAAAD/AAAAAQAAAQAAAP8AAP8BAAD/AQAAAv8AAAD//wAAAAAAAQEBAP///wAAAAAA AAABAAABAAAA//8AAAABAAEBAAD///8AAAABAAEBAAAAAAAA/wAAAAEAAAAAAAAAAQAAAP8AAAAA AAAAAAAAAP///wABAAEA/wAAAAL//wAH/v8ADfz9AAr8/AAD/v0AAAAAAAAAAAABAAAAAf8AAAAA AAD+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL/AAAAAAAA/gEAAP8BAAAC/wAA Af8AAP0CAQD7AgIA9QQFAPYEAgD7AQAA/gEBAP//AAACAQAA/wAAAAAA/wABAAEAAP8AAAAA/wD/ AQEA//8AAAEBAAAAAP8AAAAAAAAAAQABAAAAAAAAAAH/AAD/AAAAAAEAAP8AAAD//wAAAgAAAAD/ /wAAAAAAAAEBAAD/AAD/AP8AAAABAAABAAACAP0A/wABAPf3BACko+kA8+8XAAT+A+YA5/TlAAMM wQD/APsA//wWAAD/AgACAvMAAAD/AP7/CgABAQIAAQH3AP//AAAB/wkAAAD/AAEC9gD+AAcAAAEA AP///wACAgMA//8AAAEAAAAAAAAAAAD+AP8AAAAAAAAAAQEBAAD+/wACAQEA/wECAP8AAQABAf4A AAABAP8AAQABAAEAAAEBAP8BAgAB/wAAAQD/AAD//gAAAQEAAAEBAAEBAQAAAAAAAAAAAAIBAQAA AQEA/wEDAP8AAQABAQAA/wD/AAEA/wAAAAAAAf8BAAAAAAAAAgMAAAEBAAD+/QACAAAA/wEBAAAA AgAAAAAAAQEAAAAA/wD/AQAAAP8BAAH/AAAAAQAAAAAAAP8AAAABAP8AAQH/AAABAAD/AAAAAf8B AAH//wAA//4A/wAAAAEBAgD//wAAAQEAAAAAAAAAAAEAAQEAAP4A/wAA//8AAgEAAP//AQAA/wAA AAEAAAH/AAD/Af4A////AAEBAAAAAAAAAAAAAAD/AAAAAAAAAQAAAP8A/wD//wAAAAAAAP///wAA AQAAAQAAAAD//QAC//8A/wABAAAAAQAAAAAAAAAAAP///wAA//4AAf//AAAAAAD/AQAA/wIBAP7+ AAAEAgMA/v7+AAEAAAAAAf8AAAD/AAH/AAAA//4AAAEBAP8AAAD///8AAgEBAP0A/gAA//8AAQEB AAD+/gADAwMA/fz+AAEDAwD///wAAAABAAAAAQAAAAAAAf8AAAEBAAD//v4AAwABAP3//gABAgMA /gD/AAEBAAAAAP8A//8AAP/+/wACAAAAAAD/AP///gAAAP8AAAEBAAIBAgD///8AAAAAAP///wAB AQAA/v7+AAICAwD/AgIA//8AAAEBAgD///0AAAD/AAH/AQABAAEAAQD/AAAB/wD//wAA/gEBAP// AAAFBAIA/vz8AAAAAAD//wAAAAAAAAAAAAAA//8AAAH/AAABAAABAAIAAAICAP7+/wD///8ABQMF AAD//wD7/fwAAQEBAAD//wACAAEA/gD/AAAA/wAA/f8AAgMDAP8BAQAAAP8A////AAIAAQD+AAEA AQICAAEAAAABAQEAAAABAAABAQAA//8A/wEAAAEBAgAA/wAAAAH/AAAAAAAAAAAAAQEBAAABAQAB AQEAAP8CAAMEAwD9/f0AAQL/AAEAAQAAAQEA/wEDAAD+/wADAQEA/gEAAAEBAQD/AAAAAgIBAAD/ AgAAAQEAAAAAAAIBAQABAQEAAAAAAAAAAAD/AAAAAgEDAAD//wABAP4AAAMCAAAAAAAAAQIAAP// AAICAgD///4AAQABAAEBAAD//fwAAgUEAPz9/QACAgIAAQEBAAEAAQD/AAEA//7+AAEA/wD/AQAA AwMDAAQDAQAGAwQAAwQEAAEBAQABAwIAAP8AAAIBAAACAgEAAQACAAEBAQAAAQAAAgEBAAEAAAAB AgIA////AAIBAQAEBAMA/Pz7AAIDAQD//PwAAwMEAAAAAgAAAP8AAQH+AP///gACAwMA+/r6APb3 +QD4+fsA+/z+AAEBAQD///0AAQEBAAAA/gD+//wAAwIEAP//AgABAgIAAAEAAP///wAA//4AAQAA AAEBAQABAwIAAP8BAAAAAAABAQEA///9AP8AAAACAgIAAP7/AAICAgAAAAAAAAECAAAAAAD///4A AwICAP7/AAACAgIAAgMDAP38/AAKCw0ACAoHAAcHBgAHBwQA//3+AP7+/wD09PYA9vb3AAD//gD+ /v4AAgIDAAEAAQD///8AAwMDAP8A/wABAgAAAAEAAP8AAAABAAEABwUFAA0MCwAGCAUAAwUDAAEA AgD+/P4A/P3+APn6+wD+/fsA+fj4APz9/QAFBAYA/fz8AAECAAACAgEA/f38AAMDAwAA/wAAAAEC AAIA/wD9/v8AAwQGAP///QAAAAAAAwIAAP3+/QACAgMAAAAAAAD//wABAgEAAP//AAAAAAABAgIA AAAAAAD//wAAAQAAAQAAAAIAAgD+AQEAAv//AAAB/wD//wAA/wAAAAICAgAA//4AAP//AAECAwD/ //4AAQD+AAADBAD//v8AAgEBAAEBAAD///8AAQEBAP/+/AD+/f0AAwMEAP//AAAAAAEAAwMBAP7/ /gACAQMAAAABAP///gACAgMA///+AAAAAAABAgIA/v/+AAEAAQABAgEA//8AAAAA/wACAgEA//8A AP//AQACAQIA/wEBAAEBAgD/AP8A///+AAEBAwABAQAAAP3+AAEDAwAAAAAA/v/+AAICAwD///4A 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 AP8A/gAAAAAAAwECAP7+/wAA/gAAAQL/AAAA/wAAAQIA////AAEB/wAAAQAAAAAAAAD/AQAA/wAA AAAAAAAAAAD/AAAAAQH/AAEAAAD///0AAf8AAAAAAAABAAAA//8AAAABAgD/AAAAAQD/AAEA/wAA //8A//7+AAEBAAD/AAAAAgMEAPz9/wAFBAUA/f36AAECAQAAAQIAAP//AAEB/wD//v8AAQAAAP8A /wD///4AAwICAP3/AQAAAAAAAgMCAP/9/gADAgIA/P39AAMEAwD//vsAAQEDAAAAAgAA//8AAP// AAECAQD///4AAAAAAP/9/QACBAIA/v4AAAAAAQABAQEAAQAAAP8A/wAAAAEAAAD/AP///QAA//8A AAEBAAICAgD///8AAQABAP7//gABAf8A/v7/AAUCBAD/AQEA/v4AAAECAQD//v0AAQIBAAAAAAAA /v4AAP8AAAEBAQAAAAAAAAIBAP7+/wAEBAIA/f39AAEBAQD//gAA/wD/AAIBAQAA//8AAQIAAP8A AAAAAAIAAQICAAAAAAD+/v4AAwMDAP///wAA/wAAAQH/AP/+/QACAgIA////AP//AAAB/v0AAgMF AP8AAQAAAP8A/wD+AAIBAgD//wAAAAIDAAABAAABAQEAAP8AAAEBAAD///8AAAABAAICAgD+//4A AQICAAAAAAABAQAA//8BAAIBAgAAAAAA/wEAAAUFBQD8/PwAAQEBAAIBAQD+//8AAgICAP7/AAAC AAAA/wAAAAEBAQAAAAAAAgIDAAAA/wD+AAAAAQEBAAABAQABAQAAAQAAAAH/AAAAAQAAAAECAAD+ /gAB/v4AAAMDAAACAgABAAIA////AAIDAQD///4AAf8AAAEBAAD+/f0ABQcFAPv9/AADAgMAAP8A AAEAAgABAQIA//78AAEBAAAAAgAABwcGAAUDAwAJBwUABgMGAP4AAAADAwMAAAD/AAEDAAADAgIA AQEBAAIBAgAAAgEAAwEBAAEAAAAEAwMA//7+AAAAAQAGBgYA+fr3AAUEAwD//f0AAwQEAAD/AQAB AQAAAgL/AP79/QAEBAUA+fj4APj6+gDv8/YA9fj6AAIEAwD9/PwAAwICAAIA/gD9/vwAAwIDAP// AwAAAgIAAgIBAAAAAAD///8AAQD+AAECAgABAgMA/wAAAAD//wADAgEAAQD/AP3+/gADAwMA//// AAQCAwD+/wAA/wEBAAIBAQAA/v0ABAQEAPz+/QADAwUAAgIBAPv5+AANDQ0ACw8QAAoNDAAMDAoA AP/+AAH//wD08/MA8vDxAPr5+gD8/P0AAQIDAAABAQAAAP8ABAICAP4A/gABAwIAAQICAAEA/wAD AQIAEA4PABETEQAEBQUABAUEAAEAAAD7/P0A/P4AAPT19QD7+fcA9PLyAAAAAQAEBAQA/fr7AAID AAACAwIA/P7+AAYEBAD//f4AAgECAAAAAAD+//8ABAYGAP3+/gD//vwABwYEAPz8/AABAQQAAgIC AP///wACAgIAAAD/AAAA/wACAgIAAAD/AAAAAQABAQEAAAAAAAICAwABAQIA/v78AAIB/wABAAMA /wEAAAECAAABAP8A//4AAAIBAwD/AP4AAAH+AAEDBQD//v8AAgD/AAMDAwD9/f0AAgMDAAD//QD9 +/sABQUFAP7/AAAAAQIAAwQCAP/9/QACAQMAAgEEAP7//AABAwIA//8AAP///wACAwIA//7/AP8A /wADAgIAAP/+AAAAAAACAwIA/v7/AAEBAgABAQIAAP8BAAACAQAAAAAA/v79AAIDBAABAQEA/fz8 AAQDAQAAAAEA/v3/AAIDAwD/AP4A///+AAMDBAD+/v8AAQAAAAMDAgD9/f4AAAEAAAQEAwD8+/wA AQIDAAEEAwD9/f0AAgECAAABAQD//wAAAwEAAP78/AD/AP8AAwUFAAH+/QD7/P4AAwYFAP7+/gD/ /PsABAQGAP///wD///8AAgICAP3//gD/AAAAAgEAAP/8/AD/AQIAAQQGAAD49QD/AgIAAgYHAP36 /QAAAP4AAgMCAP38/AAAAQAAAwICAPz8/QABAQIAAwMBAP38/AABAgIAAAIDAP78+wACAwIAAQAD APv6+QADAwIAAwMEAPr7+gADAwMAAgACAPv8/QACAwEAAQH/APz6+gAEBQYAAAEDAPz48gAEBAcA /wIEAPv7+QADAwIABAMFAP38/QABAQAAAQEAAPv9/wABAgQAAQH/AP78+gAAAQMAAAQGAP76+AAA AQEABAIEAPv8+gABAf8AAgMDAP37/AAA//8AAwMDAPz7+wABAgMAAwMDAPr6+QAAAgMAAwUGAP75 9gD8/wAABgcKAPz7+gD//wAABQUFAPz7/AD///wABgQDAPv9/QD8/f8ABgUHAP39/AD7+/wABwoK AAcAAAAIBP8ACgcFAAICBAD7/f4ABQQDAAIB/wD+//0AAAEDAAEAAAAA//8AAAECAAABAwAA/vwA AgD+AP4DBgAB/wAA/v38AAMCAwD/AAAA/P7+AP7//wDx9PQA7e7uAPv6+gD//v0A/Pz8AAEEBAAC AwcAAgQGAP8DBwADAwIA/Pv6AP///QADBAUA/Pz/AP78/QAHBgQA//7+APn8/AAFAwQAAf/9APf4 9wACBgoABAYIAPz07wD/AwUABwgIAAoFAQATDAkACAUFAPn7/AD/AQEAAwIBAPz6+QD+/wAAAwUG APz8/AD9/PoABgMEAPwCBQD8/PkAAf//AAEBAQD+/gAA/Pz9AAMDAgD/Af8A+Pn3AAEBBAAFAgMA 9fX1AP8CAAAEBQgA+fn6APv69wAGBgkA+vv8APr5+QAGBQUAAAAAAPj49wACAgIAAAAAAPHz8wD5 /f4ACgsMAPn49wD59fUADAsLAPz//wD39fUABgYFAAUFBwD3+PgAAAEBAAgHBwD6+/wA/Pz9AAgK CAD9/fsA9/X1AAUFBwAFBgYA+Pf5AAD//AAJCQkA+fr8APz/AQAHBwcA//38APf3+AAFBwgABgUF APn39AD7+voADRESAPj6+wD79vUACwoKAP0FCQD39vYABQQDAAcFBgD4+foA+vz7AAsICAAD//0A 8/X0AAYHCwAKCwoA8/HvAP8AAQALDxMA+Pr6AAD38AAECAwAAQQGAPn29QACAP4ACQoJAPj6/QD4 +vwADQ0LAAH//gD09fYAAgQHAAoJCQD9+PIA+fr6AAULEAAEAf0A+Pf3AAQHCAAFBAYA+fj1AP79 /QAJCgsA/v7+APTz8QAJBwYABwoMAPX2+AD+/PoADAoKAPz+AgD59/UABgYBAAUHCAD29/oA/v7/ AAwMDAABAgIA+vv/AAUICQAFBQMA+vb0APr7/AAFCQwAAP39APv17wD+AAIAFP/8ACbz7QAa8eoA BffzAAP6+QAA/vwA/wD/AAAAAAD/AAIAAQEBAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAABAP8AAQABAAAAAAD/AAEA /wD/AQAAAAAAAAEAAAAA/wAAAQAAAP8AAAAB//4AAAD+AAEBBAADAwYABAgJAPsLDQDkCQ0A2ggN APX//wAIAwMA/P37APL3+QAJCgoAA/8AAPn7+gAFCAgAAwICAP37+wD6+vkA//8BAAcICAAKCAQA BAMEAAUGBwACAgUA+vr6APT3+AD9/P4AAQH/APr39gD9/f4ABAYIAPr7+gD++/cAAgQMAAMEAwD/ /ukA+/kDAAD88wD4+zoAAAAAAAT//wcA/P4SAPz/HQD/APwAAv4TAAD/AgD/AQ0A/wD+AAH/CgAB AAEA///4AAABAQACAQgA////AAD/+QD//wUAAQD/AP/+/gACAAIA/f//AAIAAgABAAAAAAD/AAH/ AAD//wAA/wECAP///wABAQAAAP7+AAMCAgD+AQIAAf/9AP///QABAQMAAf4BAAH/AQAAAAAA/wD/ AAABAQD///8A///+AAACAQAAAAIAAAECAAEBAQAA/f4AAgL/AAD//gABAQAA/v7/AAABAAD/AQEA AAACAAEAAgABAgIA/f78AAEA/wADAQEA/gAAAAAAAQAB//8AAQEBAAAAAQACAQEA////AP///wAB Af8A///+AP8BAgAAAQIAAAAAAAAAAAACAAAA////AP///gADAgEA//79AP8A/wABAAAAAQECAP8A AgAAAQIAAQAAAAAB/wAAAQAA+/7/AP/8AAACAgIAAv7+AP///wD/AgQAAAD/AAD//wABAQAA/wAB AAAAAAAAAAEAAP8AAAABAAABAQEAAAABAAEB/wD/AP8AAAD/AAEBAQACAP8A/gACAAABAQD//v8A AQD/AAEB/wAB//8A/wH/AAABAQAA//8AAQADAPwC/gD/AQYAAAP8AAEAAAD/AgIA////AAD//wD/ Av4AAgEBAAD//gD///8A/wIEAP0AAAAA/wAAAgICAP8B/QD+/wAA+wH9AAQBBAD/APwAAQACAAAA AgABAgAA//7+AAEBAgD/AgAAAQH/AP4B/QACAwIA/wH/AAEAAwD/AgEAAwABAP8BAAD/AAAAAAD/ AP///gAB//8A/wAAAAIAAgAAAAEAAAH/AAAA/wAAAAAA/wABAPsBAQABAAIA//8AAAABAAAA/vwA AAICAAAAAAD///4A//7/AAEBAQACAQEA/wD/AP4A/gD/BAQA/QH9AAL/AgD/Av8AAP/+AP8CAgAA //8AAAEBAP8AAQAAAQAAAAAAAAEAAQD/AP4A/gIDAP///wAB/wAAAQIAAP7/+wABAQEA/wAAAAIC AQAAAv0AAAEDAP7/AAABAP8AAAD/AAICAgD+/v8AAQEDAP8A/wAB/wIA///+AAIA/wAAAAAA//8A AAH+AQD/AP0AAf4EAAAA/wAAAP8AAAABAAEAAQABAQIA/v/+APwBBQD8/v0AAv8AAAIAAQD9/vsA AwICAP///wABAQEA/wEAAAEAAgD+/v8AAwICAAAAAQAAAgAAAQECAP///wAAAf4AAf8AAAEB/wAA AAEAAQIDAAD+/wACAP0A/v0CAAEBAwACAQIA/v7+AAMDAwD+//0AAAEAAAMBAgD9/f0A/gMFAPv9 /QADAgMAAP8AAAD/AQABAgEA//38AAMDAAACAAIABwEKAP8AAwD8/QQA/v8CAP///wAD/gQAAAD+ AAL9AAACAwMAAAIBAAIBAgABAQEAAQICAAEA/wAFAAIA//39AAAAAgD+AQYA+vwJAAABBAD9/f0A A/8FAAABAQABAf8AAv7/AP///wD//QQA/f/6AAQGAwAGCPgA9P31AP0CAQD8/vsA/wADAAIAAAD+ Af0A/gEAAP8AAQACAAIAAAACAP8BAAD/AQEAAAD/AAEBAAAAAAIAAQEBAP///QABAAIAAAH/AP0C /gD/AgMA//7/AAABBAD+AAAAAAABAP8B/wD/Af0A/wADAPwA/QD9/wQAAwABAPz/+AD3+ggA/PUK APsEEAABCQ8ABAIBAAUDAAAFCRIACP30APv/9AD7/PcAAQACAAABAgAB/wAAAAABAP7//AAA/wQA Af8BAAQBAQAIBwkACA0SAAIIDwD8AQAA/wEDAAD//gD7Af4A+wH/APf98gD5+vMA/P8IAAEBAQD/ AAUA/gP7AAMCAgD+AAEA/f/9AP0BBgD/Af4A/gEBAAEBAQD/AAAA/AIEAP4A/QD/Af0A/QIGAP0B /AADAgQA/QICAP///gD/AgMAAAD/AP///wACAQIAAQEAAAEBAAABAQEAAAABAP8BAgACAgIA/gH8 AP8AAQABAgEAAAABAAICAAD/Af8AAP4AAP8BAwD/AP4AAAD+AAAEBgD+/f4AAQEBAP4CAgD+Af4A AAICAAAB/gD+//oA/gUGAP//AAAAAAAA/QMCAP4B/gACAQMAAQADAP///AACBAIA//4BAP7//wAE AwEA/wL/AP7//wAAAgIAAP/9AAAAAAD/AgMA/gD/AAEAAAABAQEA/wEAAP8CAwAB/wAA/gH8AAIA AgACAQEA+wD7AP7/AQAAAAEA/gD/AAMAAwAAAP4A/wH/AP4AAgD+//4AAQABAP79AgD7/f0AAQIC AP79AQD9/fwAAAACAAL+BQD9/fwAAQEBAAECAgD+/gAABAIBAP7++wD9/v4AAwIGAAL9/AD7/f0A A/8IAAD+/AD8/fwA/wMGAP3/AAD//f8AAwACAP4A/wD+AAAABAAAAP7+/AAAAQIAAQAHAAAB9AAA AQQA/wAGAPsB+wAAAAAABAICAPsB+wABAAAA/wADAP0A/QAAAAIA//8BAP0B/QACAQIAAAACAP0B +gACAAQAAQIDAPwB+gD/AgIA/wECAP4B/AABAQQA/gICAP0A/AD/AgEAAQAAAP8D/AD+AgUA/wEE AP4CCwD9AggAAAMGAP//+gD+AgAA/AMDAPwA/gADAAAAAwICAP8A/gD+AgQAAgIAAP4A+wAAAQIA AAMFAP4D9wAAAQMA/gQEAP4A+gADAgEA/wECAP7+/AABAQAA/gICAP0A+wABAgIAAAICAP3++gAC AgQA/QUHAP/89QD/AAEA/gMHAP3+/AD///8AAQIEAPwD+wD+/vwA/wICAPz+/QD+Af4AAgEGAP4A +wD8Af0AAf4IAAACAQAC/v8ABP4CAAH+AwD9/wAA/v0BAAMA/gD9/v0AAQMDAAIBAQD//f4AAQIC AAACAwD//v0AAwD9APwABgD+/P0A//39AAQEBAD//wAA/f38AP3/AAD5+wYA9/r/APz8+gAB//0A +/z7AAEABgADAAYAAf4GAP8FBgAE/wQA+/v4AP7//gAFAAYA/fz+AP38/QABAgQA/f7+APn5/AD+ BgcAAP/8APf89wAEAwkA/f0LAP38AQD//wUABgENAAECAwD8/wUA+f0DAPr9/AAAAAEA/wMCAPv+ +wD/AP8A/v4EAPz//QD9/fsAAAIEAPz/BwD+AfoA///+AAIAAQD/AP8A/QD+AP8AAgAAAP8A/AD6 AAIBBQABAgMA/gL0AAABAAD/AggA/QL5AP4D+QD+AwgA/v78AP8E+gD/BAYA/wD/AP4F+QABAQIA AAEBAAAG9AD//P8A/wQLAAAD9wAABvYAAAYLAAD/AQD//PQAAAUEAP8FBgD//vgAAQMDAP4GCAAA Av4A/wT9AP8HCAAB/foA//zzAAEGCAD/BggA/f/3AAD9+gAABwoA/gD8AP7+AAD/BggA/fz6AP/9 +gD/BggA/QQEAP389AD+//gA/QIQAPwB+wD7AvUA/AMKAP0CCQD8AvUAAAEBAAEBBgD7AfoA/AD7 APv/BwD7/vsA+/8MAAH/CgD6/QkA+v4GAP//AgAD/BAA+fz4AP/7AgAEAwwAAv0FAPf4BQADAf0A AAMIAPj6/gD3+vwABwYNAAD+/AD29gIAAQUHAAECCQD9+P4A+Pr5AAYDCwAEAP0A9/YDAAP8CQAG BgUA+vYAAP79+wABAg4A/QD/APb2+wAA/gkA/gMOAPb5BwD/+vkABAIJAPz+AgD3+P4A/f4EAP8A CwD5+PkA/f7/AAYHEAAAAwQA9/v9AAgGCwAB/gMA+f0IAPn7+QD/Bg4A/wD9APv+AwAJ+/4AGPn1 ACrvAQAu8QIAHvoGAAb+BQAB/wAAAQD+AAD/AAAAAQIAAQEAAAEB/wAA/wEAAAABAAEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA/wAAAAEA/wEAAAD//wABAAAA/wAAAP8AAAAB/wAA/wD+AP4BAAAMAAMADPcEAAL5 AwD2DwkA7QEPAPUCBAD4AQQA//78AP399gD7/QsA/QECAPz/+QAC/ggA/f8BAPz9/AD7/PgA/wAB AAL9CAD7/AMAAAAFAP78BwABAgMA+vz7APr8+AD8/wAAAv7/APj99AD+/v8A/f4JAPv++gD//fUA AgEMAPsBAwD+/f4A/f4DAAL+DwAA/wcAAAABAAT/AAMA//8FAP/+BgAAAQIA//4FAAD/AgD/AgYA AAD/AP//BQAA/wEA/wD+AAEBAAD//wUAAAABAP/+AAD//wIAAQEAAAAA/wABAAMAAf//AAD+AQD/ AAAAAAAAAP8AAAAAAAAAAQABAAEAAAAA/wEA/v77AAD/AAAAAgQA/wADAAAA/wD//wAAAAADAP// AQAAAAAAAAAAAAD/AAAAAf8AAAD9AAH+AAABAQIAAQAEAP//AQD/APwA//4AAAEA/gAAAAIAAQAB AAABAAAB//4AAQEBAAAAAQAB/wIAAgEDAP///wAB/v8AAwICAAEAAgAAAf4AAQEBAP8AAQAB/wAA Af//AP4BAAAAAQEAAQD/AAEBAAABAAAAAAAAAAAAAgABAQAAAAEBAP///QAB//8AAAD9AAIAAAAA AP8AAQABAP8AAgAAAAMAAAEBAAAB/gAAAP8AAQAAAAABAAACAQIA/wD+AAEBAAACAQIA////AAAA /7tkyH0AACAASURBVAAAAAAAAAAAAAAAAAAB/wEAAQEBAP8AAAAA/wEAAAEAAAD+AAAAAP8A/wAB AAD/AAD/AQAAAf8AAP//AAACAAAAAQH/AP8A/wD/AP8A/wABAAIAAgD/AP0A/wEBAP//AAD/AAMA AP8CAAAA/wAA/gIAAP//AP/+/wAAAP4A/gIAAAD/AAAA/wAA/wEDAAEAAAD//wAAAP4BAP/9AQAA AgAAAP4BAP/9BQD+/QIAAQEBAAEBAQD/AAAAAAAAAP//AAD//v8AAwIDAP///gD//gIA/v7+AAEB AQAA/QEA/QECAAAAAAAAAv8A/wABAAD//wAA/v4A/wD/AP8CAwD///8AAAABAAD//wAAAQIA/wAB AAD/AQABAgEA////AAH/AQD+//sAAf4CAAAAAAD///8A////AAAAAQD//wAAAAD/AP8A/wD//gUA /v38AAABAAABAAAA//7+AP7/AQAB//0A/wECAP8BAQD///8AAAEBAAEBAQAA//8AAv4DAP7+/wAA //8AAP8AAP3+AAADAAMA/v//AAMCAgAA//0AAP8BAP3//wACAAEAAQABAAAAAgD9/f0AAQACAAAA AAAAAAIAAAAAAAAA/wAA//4AAAAAAP//AAD/AAMAAgACAAAA/gABAAAAAQECAAD/AAD/AQIA/wD+ AP79AwAA/gEAAQEBAAH/AQAB/QEAAf8AAAAA/wABAgMAAQAAAAEAAAD//v4AAgIFAAABAQAAAAEA AgIDAP7+/gAAAP4AAgD/AAH//wD//wAAAQEEAAEB/wACAP4AAgECAAABAQABAQIAAgL/AAIBAwAC AP4AAAABAAMCAAAB//4ABAAGAAAB/QABAQQAAQAAAP8A/wABAQEAAAIEAAUDAwAGBgQACgUJAP// /wADAQQAAAAAAAABAAABAQMAAgH/AAEBAQAB/wEAAf8CAAMAAQAAAAIAAP8CAAIBAQACAAIA/QD8 AAEBAQAAAAcAAQABAAEAAwAA//wAAQEFAAEBAgAAAP8AAQD/AAEA/wABAAQAAQECAAQEBgANCggA /f8GAPf6+QD9/wEAAQEEAAEBAgABAf4AAgEAAP///wABAAIAAAEDAAAA/wABAAEAAQEAAAAA/wAB AAAAAQEBAAAB/wAA/wIAAAAAAAEA/QABAAMAAP8AAAEABAACAf8AAAEAAAMB/wD9AfwAAQEDAAEA /gACAQQAAwACAP4CAAABAQcA/foBAPn1/AD6CwIAAwgGAAEBAQAFBQQADAwIAAL/CAD9/O8A/P7/ AAEBAQD///0AAQEBAAL/BAAA/wMAAwADAAoICAAQEA4ACAkMAAECCAAA/wAA//8BAP8A/gD+//0A +/j6APr2/QD/+gMAAQAHAAIBAgACAQQAAAEDAAIBAwABAQEA/wL+AAEABAAAAf4AAgECAAEBAQD/ AP8AAgEEAAAB/gAAAP4AAgAFAAMB/QACAQIAAAEBAP4A/wACAQIA////AAEBAAACAQMAAAAAAAEA AAAAAP8AAP8BAP//AQAAAQEAAf8DAAEAAAAA/wIAAAAAAP//AAAB/wAAAP//AAEAAwAAAP4AAP// AAH/BwAA//0AAP8AAAEBAwD+/fsAAgEEAAH+/gD//gAAAP4GAAD/AAD/AAEAAAAAAP///gD/AQQA AAECAP/9AAAAAQMA//8BAP7//wD/AQMAAP8BAAD//gAAAQEA/wD+AP///wAB/gMAAP7+AAAAAQAA AQAA/wAAAAAAAwAAAAEAAf4CAAIABAAA//8AAf4CAAEBAgABAAAA////AAD/AgAA//0AAQEAAAH/ AwAB//8AAgABAAABAwABAPwAAP8AAAD/AwABAf0AAAACAAEAAgAC/wMAAQACAAEAAgD/Af4AAQAC AAIBBAABAv8AAgEEAAEA+wADAf0ABAAIAP8A/AD+AfsAAgIIAP/+AAAAAv4AAwEBAAEAAQABAAAA AwIBAAED+wAAAAIAAgEHAP8C/gAAAAQAAQEGAAMC+wABAf8AAwIDAAAD/AABAP8AAwIDAAL//QAA AQMAAgIBAAEB/AACAgMAAAEDAAH/+AADAwUAAAEDAP4EBgADAwIAAgAAAAIC+wADAgQAAAICAP7+ /AABAQEAAwAAAAAD/QAAAAMAAQAEAAIACgABAAcAAQAFAAL/AwAD/wAAAP8CAP/+/AD+AQEAAf4C AAD+/gACAQMAAP7/AAD+AAABAwMAAP8GAP/9+gAAAgQA/v4FAP/+/gD+/gEAAgECAP78AQACAgAA //8BAP79/wAB/wMAAv8CAP/9/gD9/gMAAgIDAP/9BAD//wEA/gIDAP/9AAD///4A/gADAP79/wD+ /gAA/gEDAP79AQD+/P8A/wIEAP39AAD//gEA/vwEAP4DAQD9AAAA//4EAAAAAwD+//4AAgEBAP8B AAAA//4AAf8CAAEBAgAAAP4A//8BAP38AAD8+f0A///+APwA/QAA/v4ABQMDAAUEBgAAAQAA/wAD AP8AAQD/AP4AAAAIAAEAAQABAP0AAgEEAAEABQAC/wcAAQIEAP//CQADAAMA/wIDAP7//QAEAQUA AQL+AAAC/AABAgIAAf/+AAQCAgAEAQcAAQMFAAYEAAADAgoABAEKAAEECQABAwYACgcOAAsHBAAE AwAAAgMCAAP//QAA/wAABAMDAAH/+wD9AP8AAQMFAAEB/wADAPwABAMBAP8CBgAB/QUAAQL/AAEB AQD+/v4AAAH9AAMCAwD/AP8ABQQFAAMCBgACAgIAAwP+AAABAAACAQcAAQIDAAMDAwACAggAAgH7 AAICAwABAgUA//7/AAEAAwABAAIAAAEAAAID/gAB/PwAAf8IAP7+/AD//gUA/v8GAP/+AAAA/gcA //8EAP78AwD8/AIAA/8EAP8DBQD8+/sA/Pz/AP4EBAD8/PwA/fgAAP0A/wABAQAA/foBAAD+AQD8 +gEA/fn/APz+AAD9AgAA/f0BAPv5/gACAAAAAf3/APz3/QD8+/4A/ggAAP34AAD7+P8A+wUBAP/+ AQD9+QAAAgMBAP7/AQD8+QAA/fsAAP4CAQAA/gIA/Pn/AAMC/wD9BP8A/Pn/AAAA/wD//AIA/vsC AP/7AgD9AwIAAAQDAP/9AgD+AQAA//4FAP39/AAA/QAAAP0EAP/+/gD//AMAAwIFAAL+BQD+/wcA AgD/AAH/BwAA//0AAf/+AAH/BgAC/wYAAf/6AAIBBAABAQgAA///AAEBCQACAQkAAgAJAAMAAQD+ AgIAAwIJAP8BAAACAwsAAgIFAAMBCQAFAgIAAgH/AAMCCAD/AgUAAwP9AAQCCgADAwEABwT+AAD+ AwAGBAkAAAEAAAgE+QAc9/QAL/X3AC71+gAb+f4ABv0EAP0BAwAAAQEAAf/+AAABAAD/AQEAAQEA AAIAAAD/AQEAAAABAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAP7//wAA AQAAAQD/AAAAAAABAAAAC/wAAB/3+wD0A/cA7gL3APQHDADtAwQA/QACAAMA/QAB/gUA/gMDAAD+ AAAC/QQA/QACAP/9AgAB//0A//8BAP/9BQD//QQA/QADAAAAAwAAAgMA/Pr8AP79BQAAAAAA//// AP/9BQD///8AAP8EAAD+/wAA/wgA//8FAP/+AgD//gUA//8FAP//BgAAAAEAAP//AAQAAPwAAgH2 AAQB8QABAf0AAQIHAP//AAD/AfMA/wD/AAEC/AABAQAAAAL3AP//AQABAPsAAAAAAAAC+QAA/wIA AAAAAAABAQADAgMAAQD9AAEBAQAAAAEAAQACAP8A/wAAAP8AAQEAAP//AAABAQMA///7AAMB/wD9 AgQAAf//AAABAAAAAAAAAAABAAABAQAAAQEAAP8BAAEBAAD/Af8A///+AAL//gABAAAAAQACAP8C BAD+//wAAgEAAP/9/gAAAAIAAQICAAICAQAA//8AAQD/AP4AAAAAAQEAAP//AAMBAQAAAf8AAAAA AAAAAQD+Af8AAAEBAAL/AAD/Af8AAAD/AAEBAQABAQIAAAABAAAA/wABAAAAAQEAAAD/AAAA/wAA /wEBAAEB/gABAP8A/wD/AAAAAAAAAP8AAQD/AAEAAgAAAQIA/wAAAAEAAAD/AP4AAwECAP8C/gAB AAIAAQD/AP///wAA/wEAAQD/AAAAAAAA//8AAgEBAP/+AAABAQEAAf8AAAABAAAAAAEA////AAD/ AAAAAP8A/wACAAAAAAABAP8AAQAAAAD//wAAAQEAAAABAAEA/wAAAP8AAAABAAIAAQD/Af4AAQEC AAAC/wADAgMAAP/+AAAA/wAAAP8AAQABAAACAAD/AP0AAAAAAAABAAD/AAEAAwEDAP8AAAD/AP4A AgEDAAIB/QADAQAAAAH9AAMDBQD+AP4AAAAAAAEBAQABAf8A/wD/AAABAQAA/wAAAwECAAIB/gAB AgMA/wH/AAD//gABAQIAAAABAAAAAQAAAf8AAP8BAP8AAAAAAv0AAQAAAAABAgD/AP8AAAEBAP8A AAACAAIAAAIBAAAAAAABAQEA/wIAAAEAAQAC//oAAQIEAAAAAQD///4AAP//AAAAAQABAP8AAAD/ AAAA/wADAgYAAQP7AAIBAQABAAAA/gH+AAEAAAAAAP4AAAEBAAAAAQAAAAAAAAEBAAABAAD//wAA AgIDAP8C/wABAAAAAQEBAP0B+wACAgIA/wAAAAEBAgD//fwAAAEBAAMA/wACAQEAAAABAAIBAwAC Av0AAgIBAP8AAAAAAAIAAAAAAAIBAAAA//8AAAAAAAAA/wD/AP8AAgECAAD//wABAQAAAQAAAAEA AQD/AAAA/v7+AAMEBAD+/v4AAwACAAEAAQACAfsAAgICAAAB/gABAQIA/wAAAAEAAAADAgAAAwL6 AP8BAgD/AQEAAwICAP4B/gAAAP8AAf7+AAIBAAD+/wAAAQIEAAAB/gAC//0AAQIDAAABAgABAAEA ///+AAICAgD+//8AAAD/AAMCAwAA//0AAQAGAAH//AABAAQAAgEAAP8A/wACAQEAAgP+AAkGBgAG BgUABAL9AP38/gAB/wMAAQMDAP7//wACAgMAAgD/AAEAAAABAAEAAQADAAIBAQABAAAAAAEFAAEB AAABAAIAAgD7AAAAAgACAPoAAgD6AAD/AQACAf4AAAEEAAABAQABAAAAAQD/AAAA/gAAAAMAAgL8 AAMCBQAHBgEAEAD8AAQC+QD8+vIAAAADAAECAwAC/v4ABAECAP8C/wABAQIAAQICAAAAAAAAAAAA AP//AAEBAAABAgAAAQICAP8B/wAA/gEAAgEBAAIA/QACAQIA/wL/AAQCBQAAAAAAAAEAAAIB/gAB APwAAwEEAAEC/gAEAgYAAgMCAP0E+QADA/wAAP//AP359QD69f0ABQIMAAYDBQABAP8ABgUAAAMN /gD8/P8A9vf4AP79/gD+AP0AAgIBAP8B/gADAQMACAYIAA8NCAALDf8AAgT2AAEA+QAD/wAA/wAB AP7//gD8+fgA+fP0AP/49AADAQAA/wH9AAICAwAEAgMA/f78AAMBAgACAQIAAAD+AAMBBQD+Av4A AgABAAEBAAD/AAAAAwEEAAIC/wD//v8ABAEEAP8B+wACAQIAAgECAP4BAAACAgAA////AAH/AAAD AQMA/wEBAAABAAABAQAA////AAEBAgADAAIA/wD9AAEB/wABAQQA/gH/AAIBAQACAAAA/wD/AAID AgD///8AAP/+AAEB+QACAv8AAgEAAAQDAgD//vsABAEDAAEBAAACA/sABAL7AP8AAAAAAAAAAQIB AP/+/QABAgMAAQEBAAAA+wACAQQA/wICAP0A/wAEAgMAAP4BAP///wACAwEAAAD/AAD//wABAgIA //3+AAEBAQABAQIA/f/+AAABAwACAQEA/wH8AAQCAwD/AAAAAgH8AAMDAgAB/wAA/v/+AAICAgD/ //4A/wAAAAMCAwD+Af8AAAAAAAIEBAAC/f0AAQD/AAMDBAD8AfsAAAICAAMDBAD+/vwAAQIDAAAC AQAC/v0AAwIBAP8A/gD/AP8AAwQEAAH/+wAAAf4ABAH9AP4A/AAAAfsABAH8AAED/wD/Af4AAwEB AAH/AQACAAEABAIAAP4D/AD//wEAAAH6AAAA9AAAAAMAA/8IAP4A+wAB//8ABAADAP8A+wAA//8A AgADAP4A/QAAAAIAAQACAAH++wAAAAMAAgEFAP//+AAC/wQAAQEFAAMA+wACAQAAAQABAAIA+gAB AAQAAQADAAIA/AAC/wIAAgH/AP7//AABAgQAAAIDAAEB8wABAfkAAgEFAAMB+wACAQEAAQECAAMB /AABAAEAAwEDAAAC/QABAQEAAgEAAP0B/AABAQUA/wL5AAEB8wAAAgYAAgMDAAD7+gADAQAAAAID AP8D/QADAf8AAgIBAAAD/QAAAQIABAICAP8B+QABAgMAAwH8AP0D9QD///8ABQMHAAP+/AD///8A AwMEAAIA/AD/Af4ABAQDAAQA/gD8Af0ABgQFAAMA/QAEAv0ABQb/AAUBAAAGBAAABQQFAAIBAgAD /v4ABAQDAAECAQD+/v4A////AP39/AD6+voA//8BAP7+/wD7+fcAAAH+AP8DCgAGAwIABgUFAAYF /wD+/wAAAgH/AP0AAAAF+vgABQb3AAEB+gAB/f4AAP/8AAEC+wADA/wAAwMFAP4F/wAEAgIA//77 AAMA/gAEBPsAAAD8AAD//AADAgMAAP/8AP4B/AADAvoAAQH+AAIC9wADAf0ABAH+AP0C8gAEAgcA BwMFAAQCBAABAP4AAQADAAEA/QD/AP8AAAEDAP8A+wD//f8AAAEFAAD/AQD///oA/v4BAAAABQAA /fsA////AAIDAQAA/v0A//38AP8AAwAAAAEAAP36AAAABAAAAAMA/v7zAP8AAAACAwgA//34AP79 +gD9AgkA/v77AP38+QADAgUA//8AAP/++gD/AgIAAf8BAAH+9gADAfwAAv/8AAEA9QAA//UAAQD7 AAH/AQAAAPYAAf8GAAIBAgADAPcAAgAEAAMA+gAEAfoAAAH+AAQA+wAAAPoAAwLyAAMBBgAEAPoA Bf/4AAEA+gAEAvwAAwL7AAD//gAFAfoAAwH+APwC+AAFAv0ABgMCAP8D8gAC/voABgMHAP4E+gAB BPQACAP/AP8D/AD+A/UABgUDAAYF+wD//fkA/QH8AAkF/QAB//0A/Ab2AAcGAAAJBgAA/Aj4AP8A AQAJBvYAAQD6AAD++QADCAQAAQP+AAL++gACAf8ACAf6AAEC/AAFA/wACAgFAP7+/AAL/PwABQb8 AAkH+wD7//oAAgL9AAYH/QACAfwAAP/7AAQGBAAGBgEAAP79AP///gAGBvoA////AAkH+wAGBwIA Bwb3APz8+QD9A/sABQcCAAEAAQAG/v0ABQQBAAQE+QAEA/UAAP/9AAMDAgD+AgYAAgH8AAIB/wAC AAEAAgH1AAEA+QACAf8ABP/+ABD66wAr9esAMPTsAB367wAFAfoA+wQAAP8BAwAAAAAAAAD+AP8A AAABAQAAAgACAP4BAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAP8AAAAAAAAAAQABAAEA /wD+AP4A/gAAAAAAAf8AAAH/AAD/Af8AAf//AAr/AQAl+PUA9AP2APQCEQDXCREA8AMCAP8E+QAG BP4AAAQGAP3/+gAHBfwA/QABAAEB/QAEAPkA/wABAAYHAAAHBgUAAwICAAQGAAD/AQIA///5AP8B +wD+/wAAAf//AP/9+AD+/v0ABQX+AAL/+wAAAfoAAQQDAP8DAAD+/fcA/QL9AAEB+gAAAfwAAAAA AAQAAQAAAAD9AAAB/gAAAf0AAAH+AAEAAQAAAf4AAAD+AAAA/QAAAQEAAAD/AAEB/wAA//4AAQEA AAAA/QAAAQEAAAAAAAAAAAABAv4AAgD+AAAAAAABAQIAAAD/AAD//wAAAP8AAQECAAAAAQAAAf4A AAL/AP8AAAAAAv4AAP8AAAEAAAAAAAAAAP//AAEB/wABAAAA/wECAAABAgAAAAAAAAH/AAAA/wAA AAAA/wD/AAEC/gAB//4AAQD/AAIDAAABAP0A/wD+AAECAgD//wEA//8AAAAB/wAAAgAA////AAAA AAAB/wEAAAD/AP8A/gAAAf8AAQEBAAD+AAACAQAA/wD/AAIA/gABAP0AAAEBAAAAAQD/AAIAAAAA AAAB/wABAAAAAQEBAAAB/wAA/f4AAAIAAAEAAQAA//8AAAD/AP8A/AAAAAIAAgEBAAEBAQD///8A AQL+AP8A/QAAAP0AAQACAAH/AAD/AP4A/wD/AAEAAAABAf8AAAABAAABAAAAAAAA/wAAAAEAAAAA AAAAAP//AAAAAAAAAP4AAQABAAEAAQAAAAAAAQEBAP///gAA/wAAAAACAAAAAAAA//8AAQAAAAAA AQABAP8A//4BAAD//wABAv4A/wD/AAAA/wD///4AAQD/AAAAAAAA//8AAQEAAAAAAAD//v4AAAIF AP8AAAD/AAAA///+AAAAAAD/AAEA///8AAH+/wACAgEA/wAAAP//AAAAAAAAAAD/AAH/AQD//wAA /wH/AAH//AAC//0A/f7+AAABAAAA/wMAAgEBAP///wD+/v8AAAABAAD//wABAAAAAQAAAP8AAQAA //8AAgABAP//AQABAAEA//3+AP8AAAACAgEAAAABAAICAQD//vsAAf/+AP//AAAB//4AAAD/AAEB AQAA//8AAAD/AP/+/gACA/8AAv/9AAEAAQAAAAAAAP/+AAECAgD///4AAAABAAAAAAAAAQEAAQAB AAH/AAD9//8A///9AAD/AAAA//8AAQIBAAH/+wAC/wMA/gAAAAEAAgAC//wA/wACAP8A/gABAQEA AP8BAAAA/QACAP8AAf8AAAEBAAAAAAIA/wAAAAH/AAAAAP8AAP8AAAAA/wAAAP8AAAEEAAABAgD/ Af8A/wAAAAIA/gD/AAEAAAH+AAAB/wAAAP4A/gH/AAIAAQD/Af8AAAL/AP8AAAAAAf4A/wEBAAEA AQAA//8A/wL/AAAB/gABAAIAAAH/AAD//QABAQEAAAMAAAAAAAABAAAA/wH/AAEAAAD/AQAAAQIA AAAC/wAAAAAAAP7/AAADAAAB/wAAAAEAAAAB/gAA//4AAgMAAAIAAAACA/8AAQAAAAAAAAADAwEA BQMFAAUGAwABAgAA/wL/AAAC/gD/AgEAAAECAAEA/wACAv4AAP7+AAABAAAAAgIA/wIAAAACAQAA AAEAAQL+AAAAAAD/AP4AAAH+AAEA/wAAAf4AAAH8AAICBAAAAf4AAQL9AAABAgAB/wAAAQAAAP7/ /gABAgEAAf79AAEBAgADAgMACAgBAAYECAD8+/YA9/v9AAAB/gD/Af4AAwEAAP//AQAAAwAAAQL9 AAD//wAA/wAAAAEAAAEBAAABAQEAAQEAAP4A/gABBAIAAv8BAP8A/gADAv8A/gD/AAECAQAAAAEA AAH/AAIBAAD/AP8AAQP/AAIB/gACA/4AAgEBAAIB/wACAf4A/wH/AP7++QD49/MAAgUAAAUFDAAF AwEAAQEBAAUIBAANEAwAAgMAAPb19wD8/QEAAQMBAAL/AAAHBAIADg0JAAwOCgADBwMAAf8AAAIA /gD+AP8A//8BAPz6+wD49vUA/Pn2AAEA/QACAwQAA/8CAAACAAADAgAAAAP/AAMC/wABAf8AAgD+ AAIC/QAAAAAAAgEBAAIBAAD///8AAwL/AP///wD/Af8AAgP9AAL+/QACBAEAAgH/AAEAAAABAgAA AP//AAAAAAACAv8A/wD/AAEBAAABAQAA/v7+AAECAAACAQAAAP7+AAAAAAACAv0AAQAAAAICAgAC AAAA////AAEC/wD//v0AAAEAAAAD/AAAAP4AAwACAAIC/wACA/4AAgMBAAL//wAAAv4AAwP+AP3/ /wAA//8AAgECAP4B/QADAv8A/wAAAAAB/AABAQAAAQIDAP7+/QABAf8A/wEAAAAA/wABAAIA///+ AAEB/wAAAAIA/wD+AAH/AAAAAQIAAP//AAAC/gAAAAAA///8AP//AwD/AQAA//78AAACBAAAAQAA //78AAAAAwAAAQAAAf8BAAAAAAD///0AAQEAAP8A/wD/AP0AAgABAAAAAAD+//sAAf8EAAAAAAD+ APwAAwD+AAEAAgAAAf4AAAABAAAB/gD///8A/wABAAAC/gAB//8AAQH/AAEC/gAB/v8AAQH+AAEA /gAAAf8AAQICAAL+/gD//wEAAQEBAAEC/wD///8AAAL9AAEC/wAAAf4AAQL9AAL+/gABAP8AAQEC AAEDAAAB/wAAAgL/AAID/wABAf4AAQEAAP8C/gABAgEAAQL+AAIAAAACAf8AAAH7AAMD/QACAwEA AQEBAAD/AAADAv8AAQH/AP8CAAACAv8AAQEAAP8A/wABAv8A/wIAAAEEAQAEBgEAAAH/AAD//wAD AgAAAAMAAAQAAAACAQEAAgEAAAABAAAAAv8AAgEAAAEAAAAAAwAA/QEAAAQEAgD/BAEAAgMBAP4E AAADAf8AAAH+AAD//wACAgEAAgEAAP3//gAAAgEAAQL/AAMD/wD/AP8AAAH+AAIB/gD/AQAAAgH9 AAAA+wAAAP8AAQEAAAAA+wAAAP8AAP8AAAAA/QABAPwAAP8AAAD//AD/AP4A/wADAP7//wD/3l/o kAAAIABJREFU/gAA/wD/AAAAAgD+/v0A+/sBAP3//AD5+fwA/v3+APz9+wD6+vgABQQGAAYGBwAC A/8ABQMDAP8DAwAA//wA////AP79AAD+/wAA/f3/AP0AAQD+/vsA/f/8AP///QAA//wAAP78AAAB /wD/AAEA/v//AP7/BAD+/wQA///8AAAA/wD+/wEA/v/8AP8A/QABAAEAAQD/AAAB/wAAAf0A/wH+ AP///QAAAf0AAAH8AAD//gAEA/8ABQP+AAD/+wD//wAA////AP///QAAAAAA//8AAP7//AD/AQAA AgACAP4A/wAAAPsAAAEDAAD/AQAB//wA/wD+AAAAAwABAv4AAgL/AAIC/gAAAAEAAgL+AAEB/QAB AgAAAQL9AAAAAQAAAf0AAQL+AAID/wADBP8A/v4AAAMD/wADAv8A//8BAAMDAAADAwEAAwIAAAYG AgABAwQABQcCAAb+AwD+/wMABQcDAAL9AAAG/gMABQYDAAQDAgAF/gQAAgIDAAUHAgD/AAIAAQP/ AAQHAgABAwQABfwIAAQGBAAFBgQABPsCAAH/AwADBgMAA/7/AAD8/gACBAMA/wEAAAIGAwACBgMA AQIAAAEDAgAA/wMAAQQBAAAD/gABAv0AAQH8AAAB/gABAf0AAP8AAAAA/QABAP0A/v/7APz/AgAA /v0A/f/8AP7//AD+//oA/v/5AAAAAgD9/vkA/f35AP789wD//AIAAgD9APv79wADAgAA/PwBAPz7 +wD8/PwA+/wCAP/+/QD6/PcAAAMCAAT8AAD6+vcA+/v8AAEG+AADAPwA+/v2AAACAAACAv0A+/v1 AP/+/gAGBwQA/f79APv69QADA/0ABfwEAPv79wD+/fsA/P0BAPv/AQD8/PkABAH/AP0EAAD7/vgA /f78AP7+CQD/AQAA/f37AP/+BAAA/wUA/QD8AP7//AAD//sADvr5ACP17gAq9OoAIPbuAAz8+gD9 AgEAAP8BAAP/+wAAAQEA/gH/AAEA/wAD//8AAAEDAP4AAQAB/wAAAgD/AP4BAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA AAAAAAAAAf8A/wAAAAAAAQACAAEAAAAAAAEA/gD/AP8AAAAAAAABAAAA/wAA/gEAAAL//wAS+vsA KQH/APADAAD2BwIA+QYJAPgC/wD/Af4AA//7AP8C/gD8AP4A////AP//+wD+//sA/wICAP8A/AD/ AAAAAAIEAP8A/QD/AP8AAAD8AP//+wD///8A////AP//+gD///4A/v4CAP7++gD+/fkAAgEEAP8A AgD+/fsA/f3/AAH9+gAAAP8AAAAAAAQAAAIA/wAIAP3/CwAAAP4AAv8MAAH/AQAAAP8A/gD/AAAA CgAA/wAA/wADAAEAAQABAAoAAf/+AP8AAgAA/wYAAQICAAAAAAD//wAA/v/9AAAAAAAB/wAAAQAA AAD/AAAAAQAAAf8BAP4AAQABAQIA/wD+AP8BAAD//gEAAP/+AAMBAQAAAAEAAAD/AP/+/wABAQAA /wABAP8AAgD///8AAAEAAAIBAQD//wAA/wD/AAH+AQAA//0A/gABAAD/AAABAQAAAAEAAAD+AAD/ /wEAAAACAP///wAAAAAA//8AAP8AAQACAQEAAAAAAAAA/wD+/v0AAQEBAP/+/wACAgIA/wD/AP// /wABAP8AAAD/AAABAgD/AQMAAP8AAAAA/wABAQAA//7/AAEBAQAA//0A/wABAAAAAQAC//8A/wD/ AP7//gAAAQEAAgACAAH/AgAAAAAA/f8AAP3+/AACAQEAAf8BAAEAAAD+AQEAAf//AAAA/wD//wAA AQEAAP///wAAAAAAAAAAAP7/AQAAAAAAAAAAAAAA/wAAAP8AAAAAAAIBAgAA//8A//8AAP///wAB AQEAAP8BAAD/AAD/AP8AAAD/AAEAAQABAAEAAAABAP/+/gD//gMA/v7+AAAA/wAA/wAA/QH+AAAA AAAA//8AAgABAAEAAAAAAP4A//8DAP8AAQAAAAEAAAECAP7//wAB/wIA/v8EAP4ABAD//wAA/wEB AP8BAQABAAAAAQAAAP8AAAAA//8A/v4AAP///QAB/wIA/wD/AAAAAgABAAIABAEBAAEC/gD/AQAA AQABAAAAAAACAAAA////AP8BAQD/AP8AAwEBAAD/AQAAAAEA///9AAEBAQACAQEA+/7/AAABAgD/ Af0AAAADAP8BAAAAAP4AAAD/AAEBAQD/AP8AAQEAAP4A/QABAgYAAwP+AAQBAQAB/wAA/gL/AAEC AQD///8AAQECAAAAAQAAAQAAAAAAAAEAAAD///8AAAEBAAAA/wD9/f8AAAAAAAMC/gACAgIAAP8A AAIBAQABAv0A/wIDAP7//wACAQAA/wEAAAICAwD///8AAQEBAAAAAAABAQEA/wAAAAD//wABAAAA ////AAEBAAAAAP8AAQIEAAICAwABAf4AAgD/AP8AAAD9/wIA/P39AAABBAAAAf0AAAIBAAABAQAB AP0AAAMDAAAA/wAAAAAAAQEBAAAAAAAA/v4AAAEDAP8BAQABAAIAAAECAAAC/AAAAQEAAAAAAAAA /wD//wAAAAIDAAAAAAAB//4A/wABAAD/AQAAAgIAAAH/AP8AAQAAAQAAAQAAAP4A/gD+AP0A/wEJ AAAB/gAAAAIAAAD/AAABAAADBAQAAgMCAP4BAgD+/v8A//4DAP4A/gAD/QIAAQAEAAAA/wAA/AEA AP7+AAIBAQACAwIA/v4AAP4CAgACAQMAAQEEAAAAAAAAAQAA//79AAIAAQD//wgA/f0AAP4EBQD9 /v0AAwIDAP8AAQD+/wAAA/8AAP7+/gAC/QIA/vwDAP4BBwD+AgEA/v/+AAYGBQAMCgMA/fX4APr8 /QAA//wA/wACAP0AAQAA/wIAAv7/AAD//wAA/wAAAQEAAAAAAgD/AQIAAP4AAP8AAAADAAAA/wAA AP///gD//wEA////AP7/BAD/AAAAAQABAAEAAAD///wA/wADAP7//gD+/wYAAgIEAAH/AwD+/wMA ////AP7/AQD6+gUA/vL+AAMC/wAKCAYAAQYFAAQDBAAICQsAAwINAP798AD19vUAAf8DAAMDAAAK CwwADA4PAAQHCgD/AAIA///+AP8AAQD9/v8A+vz+APT0/AD39QEA/v0HAAABBgAAAgQAAP7+AAEA AQD//wMA///8AP7/AgABAAEAAAD9AP4ABAD//v8A/gMCAAD/AAAAAP8A/wAFAP7+/gAAAAAA/v8C AP7/+QAA/wUAAAEDAP/+AAABAAAAAQH/AAAAAAD+AAIA//8AAAEA/wABAAEA/wD+AP/+AgACBAMA /v/9AAEA/gD//wQA/wECAAD/AQAAAP8AAP//AP/+AwD///4AAAH+AAH/BAD+//4A/QEBAAD+AwD+ APwA/gADAP7//wD+APwAAP8FAP//AAD///4AAP8CAP7//gAA/wIAAQEBAP8A/AAAAQQAAP8BAP// /gD+AAIA/wAAAAAAAQD9/wEAAP/+AAEBAAABAQIA/wH9AP0AAAADAAIAAQEBAP8BAgD/AP8AAAH+ AP8BAQABAQEAAAH8AAABBAAAAP8AAAD9AAAAAwAAAQEAAAEAAP8BAQAAAv4AAQEBAAEBBAACAP0A AgICAAIBAwADAvoA/wECAAAAAwABAf0AAQEBAAEBAgAB//4AAQECAAAC/wAB//8AAAIFAAAA/AAB AP8AAQMHAAH/+wABA/oAAAIHAAD//wAAAf4AAgEDAP8C/wD+//8AAAABAAAB/gABAAEAAAEFAAEC AwD/AgIAAAIGAAEC/AACAAAAAAECAAAA/QD/AP4AAAEEAAEB/QD/AQAAAQECAAAB/AABAQMA/wEC AAD/AwAAAgQAAP8BAP/++wD//wIAAAACAP7//QAC/wMA/wABAP4A/gABAAEA////AP//BQAA/wQA /v8DAP///QD+/gYAAAIDAP3/BAD//gAAAgEEAP///QD+AAIAAQAAAP3+/QABAAIA/wAAAP7+/AAB AQUA/gMGAAD//wD//wUA/v4EAP3/AwAB/wAAAQECAP3//QD//wEA/wAAAP3++gABAQQAAP8CAPz/ BAAAAAMAAP8GAAAAAAD9AAAAAgAHAP7/+QD///8A/gAFAP7++gD+/v4AA/4FAP///QD//v0A/v8F AP7/+gD+/f8A/v8HAP3/AAD9Af4A/v8FAP7/AQD3+foA/v/9AP79AAD8+wIABAUIAAUEAQAFBPwA BQUGAAYGCQAA//4AAwIAAPv/BQD8+vgA/v8AAP3+BQD/AAEA///+AP7/AAD+//4AAP8LAAAA+gAA Af0AAQL7AAICBAAAAAUAAQEFAAECCgABAwQAAv0GAP8BAAACAwQAA//9AAD+/AADAgUAAQD/AP8F /AABAwMAAQD8AAUEBgACAwoAAQIKAAQE+wAICAsABwcPAP/8/AABAQEAAAECAAAA/AAAAQEAAAAD AAMC/AACAAAAAwMFAP/9/QD9APoA/wACAP8ABgD+AfoA///+AAH/AgD9/v8A/gD+AAD/AQD///8A /f4FAP4BAgAB/gEA/P78AP//AgAAAwcA/PwBAP78AwACAgcA+/wCAP39AAD8AgUAAAABAPz8AQD/ AAIA/v8CAP3+AAD+/v8A/f0JAPz9/wD7/f8A+/sJAP3+/gD7/f8AAf0FAP8BBAD8/QEAAv4DAPr7 BwD5+wIA/P7+AAL9CAD9/PwA+Pn8AAECBwABAwYA+v39AAL9AwAD+wcA+vsCAP7+AAAE/goA+v78 APn9AQAB/QcA//8CAPr9/wD5/PoA+v0KAPr8/wD6/fwAB/4KAP38CAD6/PsAAAEEAAL9CAD7/QMA /P4EAPz+BQD//v0A/P/+APz+CgD7/gcA+/35AAEAAQD8/gkA/P0CAP//+AAB/woAAP8GAP7//gAB /wAA//8JAP3+BAD9//sA//4IAAD+/wAA/wEA/wEKAP8ABwAAAP0AAAD9AP8ACwAA//sAAQD/AAEB CQAAAQUAAQH8AAIDAAABAAoAAgH+AAIC+AADAQcAAgILAAIDBQAB/voAAgELAAIBAgAFAgQABAMG AAQEBQAEBQAAA/3+AAMDDgD9AgQAAwP9AAQCCQADAwYAAQUFAAX8+AAN/wgAH/n7ADD1/QAi9/4A D/oCAAL/BwD8AAQABP//AAT+/gD+AQAAAAIEAAIA/gAC/v4A/wEBAP8BAgAC//8AAv8AAAEBAQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAA AAAA/wAAAAABAAAAAAAAAAAAAAD+AAAAAAAAAAIAAAEAAAMAAAD+AP4A/wAAAAD/AAAC/wIA/wEB AP8A/gAC/v8AE/oDACn2/QDwBvwA7f8CAPEDCQD8AAgAAf3/AP7//gD/AQUA////AAD++wD/AAUA //8DAP//BwD+/wIA/v4DAAIACgD/AAIA/v8CAAAABAD//wAA//79AP3+/QAA/wAAAAAHAP8ABQD+ AAIAAAAJAAD/AgD//wkA//8FAAD/BwAAAAQAAAABAAQAAAAAAP8BAP//AAAAAAAAAAABAP8AAgAA /wEAAAD/AAD+AAABAQEA/wABAAABAQAA//8A//8BAP8CAAD///4AA/8AAP8AAAAA/gIAAP4BAAAB /wD/AAAA//8AAAAAAQAB//8A/wH+AP7+AAAEAQEAAAAAAAD/AAAC//0A/gD/AP7/AgAAAQEAAAAB AP8AAQAA/wEAAAAAAAEAAQAAAP8AAP//AAEBAgD///8AAQEBAP///wAC//8A/wAAAP8AAQAAAAMA AP4AAAIB/gAA//8AAgH+AP8AAAAA/wAA//8AAP8B/wD//wIAAQAAAAEBAQABAAIAAP//AAH/AAAA /gAA/wECAAD/AAD/AQAAAP//AAEAAAABAP8AAQEAAAD/AAD//wAA//8AAAAAAAAB/wIAAQEBAAAA AQAAAQAAAf/+AAICAgAAAAAAAQAAAAEBAQD/AAAAAQABAAECBAABAQAAAP7/AAABAQABAAMAAQH+ AAEA/wAA/wAAAAAAAAEC/gAA//4AAQECAP8BAgD/AAEA/wD/AAEBAgD/AAMAAf/+AAAA/wACAP8A /wD/AAEAAAABAAAAAQABAP8AAAD/AAAAAAAAAAEB/wD///8AAgECAP8BAgABAgMAAf/9AAEBAAAB AAAA/wD+AP///wABAQAAAgEDAP8AAAAAAv8AAQECAAIA/wAA/wAAAwEBAAIB/AABAf4AAwMCAP8B AwAA//8AAQAAAAEBAQAAAAIAAAAAAAEB/wAAAP0AAQABAP8CAgD/AgQA//8BAAIBAQAFAgAADQgF AAkFAgD/AAAAAQABAAAA/wABAP8A/wAAAP8AAAAA/wAAAgAAAP8A/wAAAQMAAf//AAEAAAD9AQEA 8vn+APf8/wD9Av4AAQICAAAAAQD///8AAP//AAEBAAD//wAAAQEBAP8C/QD+AgQACgYAAAsDAQAF AgAA/v8AAP8BAAABAP8AAAEDAAD/AAABAAAA/wAAAAAB/wD///8AAQEBAPn9/wD0+v4A+v4BAP79 /QD+AQEA/wD/AP8BAwAAAv0AAAEDAP4A/gD+AgEA//8AAAEAAgABAQAAAQAAAP7//gABAAAAAQEC AP8A/gAAAAAAAAEAAAEAAQABAAAAAwEAAAcFAgAJBAIABQD/AP4CAgDy+P4A/Pz9AAD/AAD//wAA Af4AAP8B/wD//v8A/wH/AP///wAAAgEAAP/+AAAAAQD///8A/v/+AP//AQACAP8AAAAAAAD/AAD/ AgAAAQD/AP7/AAD///4AAQABAAEAAAD//v0AAAEBAAABAgAAAAAAAP8AAAH+AQD+//8AAgD/AAEC /wD//v8A///+AP7+/gABAAAAAQEBAAEBAAAA//8A//3+AP7/AAD+//8AAAABAP7+/QD/AP4AAgD/ AP///wAA/wMAAP7+AAECAQAC//8AAAEBAAACAAD+AP8AAf7/AP8AAAD/AwEA//38AAD//wAAAAEA +vv7AAEAAAD/AP4AAAACAAECAQABAP8AAQEBAAIAAAAAAAAAAAAAAAAAAQABAAIAAQAAAAAAAQAK CQgAAAEDAPT19gD5+v4AAAIBAAIAAQAAAQEAAQEBAAEAAAABAgAA//8AAAIBAQAAAQMA/wIAAAH+ /gACAQIAAQD/AP4A/wAAAQMAAQL/AAECAgABAAEAAAABAAEBAAACAP4AAwECAP8BAAABAQEAAQEB AAEAAAABAAAAAQABAP8AAQAC/v8A/vn5APn0AgAEAQAABQUFAAEAAgABAQEACQgKAP4N/AD9/PoA /f3+AAkICQANDg4ABQcHAAIAAAD//gAA/f4BAP0CAQD8/f0A9/f5APj29QD9/PsAAgEBAP8AAAAC AAAAAP8CAP8BAQABAAIAAQECAAEAAgABAAEAAQD/AAMAAgD+AP8AAP8BAAEBAAAAAAAAAQACAAEA AQABAP4AAwEDAP0BAwACAAIAAgACAAAB/wABAQEA/wEAAAAAAAABAAEAAQIBAAIAAQABAf8A/wAC AAABAQADAAMAAQIBAAD//wABAgMA/wEBAAIAAQACAP8A/wH/AAEBAgAA/wIAAAH+AAEBBAACAv4A AwICAAEBAgAB/v8AAQEEAAEC/wAAAAAAAgMDAP7/AAAC/wIAAgECAAAB/gACAQMAAgEBAP4DAgAD BAQA/v//AAMB/gADAgIAAAEBAP//AAACAgIA/gD+AAAB/wACAgIAAQACAAAA/wACAQEAAAABAP8C AQD//wAAAQACAAIBAgABAgAABAABAAIDAgAA/v8AAgIBAAECAwD/AP8AAAEAAAIBAgD//wEAAQEC AAIAAgD/AAAAAAACAAICAgABAQEAAgECAAL/AQD/AAEAAAAAAAEAAAACAAAAAAAAAAD//wD///8A Af8BAAD+AAD///8AAAH+AP///gD//v8AAf//AAL/AAD+/gAAAAEAAAD/AAAAAAEA/wAAAP/+/wD/ AQAAAv8AAAD/AAAA/v8A/wP/AAABAAAA/wAAAP8AAAH+/wAAAAIA/wABAP7/AAAAAAEA/wEBAAH/ AQABAQEA//8BAP//AAD//wEAAQEBAAD/AAAB/gAAAQIBAAEAAQAAAAEAAAAAAAAAAAD/AAAAAQAA AAD/AAAAAAAAAQABAAAAAQAB/wAAAAABAAH/AQABAP8AAQEBAAABAQACAAAAAQACAAMA/wAAAAEA AQIAAP/+AQACAAEAAQABAP8AAAAA/wIAAQEBAP8AAgACAQAAAgICAP//AAACAQEAAgH/AAMCAwAB AQMAAgICAP4DAgABAQMAAwMEAP/9BAD/AAEAAQIDAAIFBgAB/v8ABAMEAP4EAAD//v4AAwQEAAD9 AgABAAMABAQEAAEAAQD/Af0AAgMFAAMA/wAEAv4AAwIFAPz+/wD9AAEABgUHAAYICgAB/wEABAcG AAMDAAD9/PsA/f7/AP39AAD4+PkABAMAAAMHBQAGBwgA//78AAEDBAAB/wEA//7+AAIA/wABAAIA Af8BAAD/AQABAAEAAP8BAP//AAAA/wAA/v8AAAD/AAAA/wAA////AAAAAAD//wAA/v7/AAAA/wD/ /v4A/v3+AP39/gACAgIAAP8AAP79/wAAAv4A/AL9AAH+/gAFAgEAAwEAAPr+/QABAQMAAf7/AP/+ /gAAAAAAAAEBAAD//wAA/wEAAAIAAAD+AAD9/P4AAAAAAPsA/QD7+vwAAQD+AAIBAgD8/P0A/P7+ AAICAQD+/v0A+vr7AAICAwABAgAA9ff4AAEAAgAG/gIA+Pj8AP/8+gD//gEA+/z8APz8+gACAgEA /v4AAPz9/AD/AQQAAwAAAP7+/wAA/gAAAP//AAAAAQAB/gEA//8BAP//AQAA/f8AAf8AAAD/AQAB AAIAAgACAAL/AAAA/wAAAQACAAL/AQAA/wAAAwD9AAMA/wADAf8ABAECAAMBAQAEAAAABAH/AP8B AQAEAQAAAAIBAP0CAAAFAQAABQIBAP4EAgAA/gIABgICAP4EBQABBwcABAUHAAAABAAFBgUABgUF AAYFBQD9/P4AAgEBAAgFBQD///wA/vz+AAUGCAAFBgcABwcIAP//AQAGBQcA//4BAAD/CQAEBwoA AAIEAP4H+wADAgAABgcIAPwAAwAAAgQABgcIAP/9/wAH/AAABAUGAAQFBAAABgYAAAH+AAQGBwAE /gEABfz7AAQEBgADAwUABQYJAAAAAAADAwUAAP3+AAICBgADAwYAAgIFAAMC/wD/A/8AAQIDAAIA AgADAgMAAQEBAP8AAQAB/wIAAQABAP/+AQD8/wAA/v79AP78+wD/BAUA/f4AAAX8/AAS/PMAIPLw ACP08gAR+/oAA///AP8AAgAAAAEAAAEAAP8AAAD/AAIA/gEBAAH/AwD/AQEA/gEAAAAAAgD/Af8A /gAAAAAAAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAP//AAAAAAAAAAAAAAAAAAAA AQAAAAD/AAAA/wAAAQAAAAAAAAAAAQAA/wEAAgAAAP8BAAD/AAAAAAACAAAA/wAAAAIAAAD/AAAB AAAAAAEAAf8AAP8BAAD9AgEABf//ABn6+gAl9vYA5QMJAO0JCAD0AgQAAgH/AAH9+wABAwIA/wME APz+AQAAAP8A/wACAAMDAwAEAgMAAwECAAICAwAAAgEAAwICAAUEBgAC/f8A/gECAAQDBQAAAAAA BQQHAP7+AAACAP0AAgQGAP4BAQACAQUAAgAGAAH/BgABAAEAAAAAAAQAAP4AAgL7AAMC9gAAAP0A AwH3AAAAAgD+APYAAQD+AAEAAQAAAAEAAgH3AAEBAQABAf8A/wEAAAAC9wD//gIAAQACAAABAgAD AwMA/gH+AP///gAAAAAAAQEBAP8AAQAAAQAAAf//AAIC/gAC/wIA/wAAAAACAQAB/v0AAgECAP8B AQD//wEAAgEAAP8AAAAAAAAAAP8AAAICAgAAAP8AAP//AAEBAQAAAQAAAQIBAP8AAAAA//wA//8A AP8AAAABAQIAAP8BAAAA/wABAP8AAgECAP8AAAAAAQEA/wEAAAEA/wAA/gAAAAAAAAEAAgAB//4A AQEAAAAB/gAAAAIAAv8BAAAAAQD/AAAAAAEAAAEA/wAA//8AAAAAAAAAAAACAAEAAAH/AAEAAAAA Af4AAAACAAAAAQABAQAAAAD/AAAA/wAAAQEAAgAAAAAAAQAAAP8AAQACAAH//wABAP8A/wEAAAAB AQABAAIAAAD+AAD//wAAAQAAAAAAAP8A/wAAAf8AAAECAAEAAQAAAAAAAQEBAAEAAQAAAQEAAAD/ AAAA/wD//wAAAAD/AAEAAAAAAP8A/wABAAAAAQABAgEA////AP8AAAABAf4AAAEBAAEB/wD/AAMA AAH+AAAAAAAAAP8AAAAAAAEB/wABAAEAAAEBAAAAAQABAAAAAAIBAAH//QD/AP8AAAECAP8B/AAB AQEAAAH+AAAA/QAAAP4AAf//AAAAAQAAAgIAAAABAAEBAAAAAf8AAAAAAAABAAAAAf8AAf/+AAEB AgADAf4ACgT+AAwGAwABAAAAAAABAP8A/wACAf4A/wAAAP8AAgAA//8AAQD/AAAAAAD/AAIAAP8A AAAA/gD1/AEA/QQHAPkCBwD+//wAAAD/AAAAAQD//wIAAP//AAIAAAD/AQAA/gECAAEA/wABAvsA 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 AQD///4AAwD+AAIA/wD+/wAA/wD/AAAA/gD//wIAAAAAAAMA/QAA//4AAAD+AAIAAAABAAAA/gAB AP0BAwD/AQUAAP8AAAEAAAADAAAA/wAAAAABAAABAgAAAAD/AAD/AAAAAQAAAQABAAABAAABAAEA AP//AAAAAAACAP8AAAD/AAEAAAAAAAAAAAEAAAAA/gD+/wEAAAIBAAL//wAAAQEA/gEDAP8AAAAB //8AAAD/AAAAAAACAf8ADQcAABsVEAD/AAIA5+vwAPP5/AAA/wIAAP//AP8BAAABAQEAAAEAAAD/ /wABAQAA/wAAAAAAAQABAAEAAgH+AAUB/gD+AfwAAAECAP4BBAAB//8AAQEBAAD/AAAAAf4AAv78 AAD//gAAAAMA/gEBAAAAAgAAAgMA/QACAP8CAgAB//kABQL9AP7/AAD/AAIAAAABAAAAAQD/AQAA AAECAP4CAgAB/wAAA/77AAT/+gD9AP8AAAEFAP8BAQACAgEAAwEBAAEBAQAAAAAA/wAAAAEAAQD/ AP8AAAEBAAH/AAAAAAEAAP//AP8AAAAAAQAA+Pz+APL7AwDyAgsA9QcNAP79+wAC//0AAAABAP4A AgABAP8AAQD+AP8AAgD9AQMAAwIBAAL98gD7+/YAAQcCAAIBAQAA//8AAgAAAP8AAQAAAf8AAP// AAABAAABAQEAAAABAP7//wD2+fwA9P0GAPUFDwD3AgkA/wL9AAP//gAAAAEA/gABAAIAAAAAAAAA AAD/AAAAAAD/AAAAAAABAAEAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAA/wAAAAEAAAABAAABAQAE Av4A+v74AP/99gD9//gADAIAAAABAQD+AAAAAP//AAABAAAAAP8A/wEBAP4A/wAB/gAAAP/+AP8A AAABAAEA/wD+AP///wABAP8AAQABAAD/AAD/Af4A/gAAAAH+/wAAAf4AAf8AAP8A/wD///4A///+ AP8A/wABAgIA/wD/AAD/AAAAAP8AAP/9AAH/AAAAAP8A/v7/AP8A/gD+/v8A/gD/AAH//gD+AAAA //3+AAP/AwD+AAAA/v//AP///wACAP8A//38AAEBAQADAAMA/gD/AP7+AAAAAP4AAgEBAAL+/QAA AQEAAwEDAAIAAQAA/wMAAAEBAAEBAAD+//8AAAD/AP3+/wD8/f0A//3+APz7+wABAgIA/wAAAP7+ /QADAP4AAQAAAAMFBQAA//0ACAgIAAQFBwAFBgcACQcGAAH//AAHBAUACAYEAPr7BgD3+/wA/P/+ AAEA/wABAQEAAQABAAEA/gABAf8AAQEBAAAAAAAAAAAA/gEAAAEAAAACAQEA/wD/AAIBAQD/AAAA AgEAAAAAAAD/AP8AAQECAAEBAgACAQIA/wAAAAIBAgAEAgIA/QICAAMCAwD///8A/v7/AAIBAAAA AAEA//0AAPn3+QACBfYABQMDAAcGBgD/AQMAAwQDAA0ODQABAAEAAgMFAAEEAwD/AP4AAAABAP8A /wD+/f4A+/v6APj29QD8+/kAAf/+AAEAAAABAQAA/v8AAAABAQAAAP0A/wEBAAABAgD/Af8AAQD/ AAH/AAABAQAAAQD/AP8A/wABAAAAAQEAAAAA/gABAP8AAAH/AAD//wABAf8AAAD/AAEAAAAAAf8A AAD/AAAB/gAA/wAAAQEAAAEB/wAAAAEAAAH/AAAAAAAAAAAAAAD/AAAAAAAAAgAAAf//AP8A/wAA AAAAAQAAAAEAAAAAAQEAAQIAAP//AAAAAAAAAgEBAP4AAQABAf4AAAEDAAIBAAACAQAAAQH/AAL+ AAACAf8AAAACAAEBAQABAf8AAQEAAAEB/wABAQAAAAD/AAEB/wAB/wAAAAIBAAICAgAAAAAA//8A AAICAQAC/wAAAAEAAAICAgD+//8AAAECAAIBAQD+AP8AAgEBAAEAAQD9//8AAgIAAAICAgAAAwIA AgICAAAAAAD/AQIAAgICAP7/AgAAAP8AAgICAAIAAQABAAEAAgIDAAAB/wAAAQEAAwMCAAD/BAAA AAAAAgICAP8AAwABAQEAAQL/AAMBAQACAQIAAgECAP8AAAABAwEAAf8DAAMAAAABAQEAAgIBAAAD AgACAgEA/wABAAAA/gABAgEAAf//AAIAAQACAQAA/gEAAAD/AQAAAAEA/gEAAAIBAAACAAAA/f// AAAA/gAA/wEAAP/+AP8AAAD+//8A/v79AAIBAQAAAgMA/wD/AAH//gABAgEA////AAH//wAAAgIA /wAAAP///gABAAAA//7+AAABAAAAAAIA//7/AAAC/wD/AAAAAP//AP8AAAD//v4A///9AP///wAA /wAA/wEBAAIBAAAA/wAAAP8AAP8BAAD/AP8A/wH/AAAAAAD9/gAA/v8AAAIA/wAAAAAA/wEAAAAB AAAA//4AAAAAAAEBAAAAAQAAAAD+AAABAQD/AAAA/wAAAAAAAAAA//8AAQABAP8BAAAAAf8AAAD+ AAL/AQADAQAA/QEAAP7/AAABAAAAAQEAAAAB/wACAQEAAAEBAP8AAAABAQAAAgIBAAMDAQADAQEA BAD/AAEA/wAAAAAAAgIAAAQDAgADAwEA/P36APP09AD5/PwA/f4AAPv7/QADBwgABAcJAAIG9gD8 /PkA//79AAIDBwD//wAAAQEAAAABAAACAwAA//4CAAMCAgAEAwIAAf8DAAD+AAABAAAAAQMGAAEB AQADBAQAAgUFAAMDAwD+//0AAAAAAAUFBgACAgIA/f38AAUDAgD9Av4A/gABAAUEBQABAP8A/QX8 AAMEAwABAwEACAYFAAUFBQAAAP8AAAABAP7//wAA/v0A/P39APz+AAAB/P0A+/r5APz7/QABA/kA /P3+APn4+AAEBAIA/AL+APv69wACAP4AAwMEAPr7/QD8/P0ABQQDAP79/AD7+fkA/v4GAP8A/wD7 +voA/wT/AP7+/wD5+fkAAv76AP7+/gD4+PgA/f39AAX7+QD9/fwA+/v8AAYGBgAEBAUA+vr+AAQD BQADAwIA+/r8APv7+wD8/fwA/fz8APz6+gADAgEA/gEBAPv8/QD9Av4AAQIBAPz9/gD8/v0AAgQF APz9/QD4/v8AAf4AAP39AAD4/f4AAf//AAD+AQD5/AEA/P3/AAEFAAD9/gEA+f0BAP8DAQD9AAEA +v3+AP7+AAD7//8A/P7+AP39/wD9/f8A/QL9AP38/AD9AQMA/QL8AP3+/AD///0A/f//AAD//wD+ //4A//7/AP/9/gD+//8AAQAAAP8AAAD+AP8AAP8AAAAA/gABAf8AAgECAAEBAAAB/wEAAQAAAAEB AQACAgAA/v//AAEB/wADAgMABAIEAAACAgD/Av0AAwMBAAMBAAADAwAAAgMBAAQEAwD9BAMAAP4B AAQEBAACAgEABwcFAAcGAwAHBQMA/AYFAP7+/wAHBgUAAv4BAAIHBQAFBgcABAUGAAD8/AAB/vwA CAcEAAEABAAD/v4ACAcHAAIHBwAIBAIAEvUBAB749QAd9/IADPz5AAQA/wD+AQIA/wEAAAAAAAAA AQAA/v8BAAH/AAABAQAA/wD/AP///wABAAEA////AAABAAAAAAAA/wD/AAH/AAAAAAAAAP//AAAB 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 AAIAAAD/AAAABAAAAQYAAP8BAP4A/wACAQEA//78AAABAwAAAQMAAAADAAEBAwD//wEAAQEBAAAA AQD+/v4AAAABAP//AQD///8AAf8AAP8AAQAAAAAAAQACAP//AAD/AP0AAAEDAP3//wD8/v0AAwID AP//AQD+/gMAAAEBAAD/AQD+/v4AAAADAP///wD///8AAP8DAAD//QAAAQEA/wAEAP7+AwABAQEA /v0DAP/+AwAAAgIA/gACAP0A/QAC/wEAAv4AAP7//QABAgMA//8AAP3//wAC/gIAAf//AP0A/QAA /gQAAP79AP///AD+/gUA/QAAAAD/AAAB/gEA/f//AAAAAAABAgEA//79AAAAAQAB/wYAAP/+AP// AgAA/wUA//8EAP8AAAD//wMA///9AP8A/wAAAAEA/wD9AAAAAwACAQMA/v/9AP//AQABAAIAAgED AAAAAwD/AAMA/wADAAAAAgAAAQIAAAD7AAAABAAAAAEAAQH9AAEAAwAB//8AAgAFAAIABAAAAQIA /QL8AAABCQD/AgUAAf/7AAEBAQACAQEAAf/+AAEBAQAAAQAAAAL/AAACBAABAAAAAAD5AAECBAAA AQQAAQEAAAECBAABAgMAAQMGAAIB/wACAgIA///9AAAAAQAAAgEAAv77AAICAgADAQIA/gH6AAIC BAABAwcA/gMAAAAAAAADAgcAAgL7AAEB/gACAgUAAwL7AP7//gABAAMAAAD+AAEB/AAAAAUA/wD9 AAAA/AABAQkA/v78AAABAAD/AAUA///+AAEBBAACAQgA+Pr4APT6AwACBAsABAcGAAIH/gADBwgA BQYGAPn5AQD38+4A/vwGAP//CAD9/f8AAQEEAAAAAQD+/v4A/v8BAP39/QD9/QYA/P0AAAH+/QD8 /P0ABAEHAAEBAQD/+wIAAQQGAP8BBAD9/QEAAf8AAPwABAD7/QEA/v0CAAMAAwD8/f0A/P39AAMC BgAA//4A+/v8AP4CBQADAwYA//8JAPz+BwAB+wUA+fr8AP7+/gAAAQAA+fn+APr8/QADAwMA/PsA APz8/wAEBQIAAAEDAP3+/gAC/gUAAgMKAAQCAgACAf8AAwMDAP4A/gABAv0ABQQEAP/+/gD9/vcA BAUGAAEBAQD8/AQAAwMDAAECBQAD+gMAAQIGAAIDBgABAgMAAP77AP//BAD9/foA/PwAAP7+AAAC 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 AgECAP8BAAD7+voAAAYFAAH/AAACBAMABgQDAAcFBgAAAP4A/Pv8AP///gD4+AMA/P38APv7/AD1 9fUA9vX1AAIAAQD0CwsACwkLAAQICAABAQEA/wD/AAAA/wD/AAEAAP8AAP8AAQD/AAEAAQABAAEA AQAAAQAAAAABAAD/AAAAAQEA//7/AAAAAAAA/wIA//8BAP//AQABAQEAAAABAP8AAAAAAAIA/wAA AAAAAQAAAAEA/gACAAAAAQABAQIAAAEBAAEBAQABAgAAAgEBAP8AAAD8+vsA9vb3AAACBAACAgQA BAIBAAIAAAD+AQEA/f7/AAD+/gD8/f4AAQEBAP38/AD39vUA+Pb2AP7+/gABAgEA/wACAAEAAAAB AQIAAAL+AAAA/wACAQIAAAAAAAH/AAAA//8AAAAAAAAAAAAAAAEAAAAAAAECAQAAAAEAAP4AAAIB AAD/AAAA//8AAP8A/gABAAQAAAAAAP///wABAQEA/wAAAAIAAQD/AAAAAQAAAAEAAAD/AAAAAQAB AAD//wAAAP8AAAABAAAAAAD/AAEAAQAAAAAAAAD+AP0A//4CAAIAAQABAQAAAAEAAP7/AAACAQAA Af//AAD+/wD9AQEAAQABAAAAAAD//wAAAAABAP8BAQD+AAAA/gAAAAH/AQAA/wAAAAABAAAAAQD/ /wEAAAECAAAAAgAAAQAA//8BAAAAAQAAAAAAAQIAAAABAAAA/wAAAQEBAAEAAQD/AP8AAP/+AAEC AgACAAIAAP8CAAEA/QACAQEAAwECAAICAQD/Av4AAgIDAP//AAABAP8AAgIBAP/+/wD/AAAAAgIB AP/+AgABAQAAAQIBAP8DAQAAAAEAAAEAAAACAgACAgIAAAIDAAL/AAADAAAAAQIBAAH/AQACAgIA ////AAD+/gABAgIAAgD+AAECBAACAgIAAAD/AP0AAwADAwQAAf8BAP///gACAgEAAf//AP//AAAE AgIA/gQBAP8AAQAAAwMAAQMEAAMDBAACBAMA//4BAAAA/gACAgIA/wD+AAEBAQABAgIAAf8AAAIB BAACAgIAAwP/AAECAgAAAQIAAAICAAIDAgD+AAAAAwICAAIBAQACAQEAAwICAAMCAQD/AAAAAgIA AAMBAAABAAAA/wH/AAD//gABAQIAAQABAAEBAQACAAAA/f8AAAEA/gAAAQQAAP8AAAAA/wABAQEA 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 AAD+/gD19/sA+QEMAPwB+wD///UAAgAAAAEA/gD/AAIA/wAAAAEA/gAAAAAAAAADAAAAAQAHAPwA CvzvAAz/8AANBQQABAD5AP7+AQAA//4AAQEAAAIBAgABAP8A//4BAAEAAgAB//4A/QD9APf6/AD3 AgEA/P8IAAAB/gABAP0AAQD+AAAAAQAAAAIA/wABAAEA/gAAAP4AAAD/AAAAAQABAAEAAAEBAP// AAAAAAAAAAD+AAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAEAAAABAP0A/gADAPwBBgD5APwA+f36 AAT99gAC//kAAf4HAP3+/gAC//8AAgACAAH//gAC/gEA///+AP4BAAAAAAEA//8CAP8BAAACAQEA AQABAAAAAAAB/wIA/wD+AAAAAgACAP4AAgABAAAAAAD//wEAAP/+AAL//wAB/wUA/wABAAP/AQD/ //wA/wABAAABAAAA/wIAAgMEAAIB+gAEAf4A/f79AP7+/gD+//0A//7/AAAAAAAA/v0A/wIBAP7+ /QAB/gMA/v7/AAAA/wD/AQMA////AP8BAAD9/v8AAAAAAAECAQAAAQEAAgIBAAECAQAAAwMAAQAB APwCAgAAAP8AAgICAP3+BgD//P0AAP8DAAECAAAFAQcAAgEDAAMBAQAFBAIABQj/AAQGBQAKCwkA Af//APv7/QD39/cA+vz6APf39wD19fkA9/fwAAsODQAGCQkABAT/AAEBAgABAQEAAAABAAEAAAAB AP8AAwIBAP8BAgAAAQEA/v79AAMAAQACAgIAAgH+AAMDAwD+//8AAQP9AAH/AQABAAAAAgIBAAL/ /gACAwIAAgH9AAMCBAACAgMA/v36AAMD/QAAAP8AAP//AAEBBQADA/4AAwEBAP/+/wAAAQIA//z/ APr5/QD8CP8ABQcGAAUBAAAFBP8A/f/5AAD/BAADAgAA/v75APv69gD8+/MAAP/7AAMCAgAAAgIA AP/9AAABAQAAAvwAAv//AAQCAgD//v0AAQABAAMCBQACBP0AAgECAAAA+wABA/8AAwMDAAH+/wAC AQMAAgD/AP8A/wADAv4AAP/9AAEAAAACAf8AAwL7AAICAwABAQEAAgL/AAICAgD/AP8AAAD/AAMC AwD/AAEAAQIBAAAB/wAB//8AAAEBAAEAAwAAAQAAAQH+AAEB/wABAAIAAgECAAEBAQD///4AAgMC AAD//gAAAf8AAwAFAP8B/wABAwAAAgMDAAD//wAEAgMAAAH9AAD+/AADAwEAAv8AAAEAAQADAgEA /v79AAEBAAAAAv8AAP/8AAMD/QD+/gEA//7/AAMEAQD///8AAQEAAAEBAgAA//8AAP//AAICAwD/ //4AAAACAAECAgD///8AAQH9AP8A/gABAf0AAgL8AAIBBAAEA/0AAgP8AAAAAQD+/f8AAgL9AAAB /QD//wAAAwT+AP3+/QABAAEAAQH8AAMB/gAAAAEAAwUCAP/6+gAAAgQAAwEEAAAA/AADAgAAAQEC AP3//QAAAAEAAP79AAH/AAAD/wYAAAH7AAD//gABAQQA/wD+AAIA/QACAv8A/v7+AP///QABAQMA AQAAAAEAAAAAAAEA///8AAABAAABAggAAQH3AP/+AgAA/wcAAAH5AAD//wABAQEAAAD9AAAAAQAB /gIAAf/+AAAAAwD//wIA///7AAH/AwAAAAEAAQD3AAAABAABAQMAAgD8AAL/AgAC/wEAAf/8AAAA AwAA//4A//78AP8AAQABAQAAAP78AAEEBwABAAMA/wH3AAEA/gACAAQAAAD6AAH//wAB/wQAAQD+ AAIAAQAD/wEAAP/9AAD/AgAA/f4AA/79AAACBAABAQYAAgH5AAAB/AAAAgIAAQD6AAIAAAAC/wIA /gD+AAACAQACAwIAA/38AAMBAQADAQMA/wL5AAADBQACAv8A/wL3AAACAwADA/4A/v76AAAA/wAE BP8A///8AP7+/gAEBP8AAQH+AAEB/gAEBQAAAAH8AP39/wADBP0ABP77AAQB/wADAgAA/wD+AAH/ /gACAgQABAX+AAUBAQAEBv8AAgD6AP/8+gADAQQAAgT+AAQE/AAGBv0ABQX8AAEC+gABAvkAAwL/ AAAAAgACA/wAAv//AAUE+wAGBf0A/AH8AAAC+wD9A/wAAgMAAAIDAgACBQIAAgb+AAQC/AAB/voA //8AAAID/wAAAf0A/v79AAED/QACAf8ABAD9AAME/wAB/vwAAwP4AAMDAgADAgIA/vv1APr6+AD9 AAEA/Pv8AAIBAQAEAgUAAAb9AAACAQAKB/4A//79AAH/AgAEBv4AAP8AAPwB+wAEAv4A+wL8APwA +wAB/wAAAwADAP4B/AAAAfwAAgADAAECAQADAfkAAAH8AAABAQD+/vQABAEDAAIC/gABAfcA/gD6 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 /v4AAAAAAAEA/wD/AP8A/wABAAD//wABAP0A////APb8/QD1/QcA+gQHAP7+AgAA//4AAAD9AAAB AwAAAAEA/wACAP8B/wAAAAEAAAEAAAP//AAH/vgACAL9AAkGCAD//voAAAABAP///wD//wAA/gAB AAAA/gABAP4AAAAAAP//AAD7/gEA8/v+APn/BQD9AQQA///+AAAA/AD//wAAAAACAP8A/wAAAP0A AAD+AAAAAgADAPsABf//AAYA/gAB//wAAP/+AAH//wAAAgIA+wAFAPkDBgD9/gIA/wD/AAEA/wD/ AQAAAAABAAAAAgAAAP8AAAACAAAAAQAA//8AAP7+AP///wD///0A//z7AP///gAA//4A/v4BAP4A /wACAgEAAP7/AAL+AwAB/wAA/gD/AP///gACAv4A/wECAP8A/wACAv0A////AAICAgAC//4A/f// AAAAAAABAQEAAQD/AAIAAAD9/wIA//8AAP8BAQABAAEAAv//AP3//AD///8ABAQEAPz8/AABAf4A +vn3APv6+gD///8A/f/9AAIA/gAA/v4AAQAAAP7+/gADBAQA/fz7AAECAQACAgIA/v7+AAICAgD/ //4AAP/+AAICAgD+/wEAAwIBAP8A/wABAQIAAAABAP36AQAAAAAAAgIBAP76BAD///0A/QICAAAA AAACAwYAAAQEAAQCBAD5AwEAAwMCAPkG9wAC//8ABwkIAAMEBgABAQIABQQCAAYGBQAEBA4ACAgI APz9/gACAgIA/v8AAAEA/wD/AP4AAf8AAAEAAQAAAP8AAQH/AP4A/wABAQEAAAABAAIBAQADAgIA /f//AAICAgAAAP8AAQEAAAAAAAAAAAEAAQEAAAEBAQAAAAAAAQIBAAABAQABAQEAAgIAAAECAQAA /gAA////AAEBAQABAQEAAAD/AAEBAQACAgIABgYFAAoLCQAFBwUA///+AP/+AAD9/v4A//z9AP4D AwABAAAA//39AP/+/QD///4AAAAAAAEBAQABAAEAAf//AAEA/wABAQEA//8AAAAAAAABAQEAAAAA AAIBAQD9AAAAAQD/AAAA/wD///4AAAAAAP8A/gAAAAIAAv8AAAAAAQABAf8A/wH+AAAA/wAAAQAA Af/9AAH+AwAAAAAAAQAAAAH+AQD///8AAAAAAP/+/wD/AAAAAP3+AAAB/wAAAAAAAQH+AAAAAAAA AAEAAP8BAAEBAQD///8AAAD/AP//AAAA/gAA/wH9AP8A/wAAAf8AAQH/AAEAAAACAgEAAgABAP3+ AQAA//8AAwIBAP79AAD///8AAQECAAABAAAAAP8AAAD/AAH/AQAAAP8AAAAAAAAA/wACAQEAAAEB AAL+AAAAAAAAAgAAAAIAAAD/Af8AAQAAAAICAgD+/wAAAQIDAAABAQAC//4AAAAAAAEAAAAC/wQA AwMDAAAAAAD9Av0AAgEFAP7+/gAB//0A//8CAP79/gD/AP8AAf8AAP39AAACAQAAAgEBAP39AgD9 /AAA/gQCAP38/gACAgAAAwL8AP/9/QD/AgMAAAIAAP7//wACAv8AAv4AAP4A/wAD/wAAAgADAAIA BQACAgcA/wT8AP8B+wAGAwAA/P8CAP4CAgACAgIA//8AAAAA/wABAAEAAgAAAP8AAgD/AQMAAwEC AAEAAgABAAEAAQEBAAECAgACAQAA/gAAAAACAgABAwIAAP7/AAIBAQACAQAAAAH/AAIB/wD/AP4A AQEBAAEBAQD+//0AAQL/AAICAgACAQEAAQEAAAH//wAAAP8AAQD+AAAAAQAAAP8AAP//AAH/AAAB /wAA/gAAAP/+/QD+AP4AAP7+AAABAgD//wEAAAD/AP///gAA/wAA//4AAAAA/wAAAAAAAP//AP7+ /gAAAv8A//39AAEAAgAAAP8A/v7+AAECAQABAPwA/v79AAAAAQAAAf8A/v39AAACAAD8Af8A+/39 AAEAAAAC/P0AAPz9APwA/gACAwUA/v3+AP7+/wACAf8A/P3+AP79/gABAQAA/f39AP7+/gD+/v4A /P/8AP3//gD7/wEAB/7/AAECAAAA/wEA/v/+AP4AAAAAAAIA/wD+AAECAAACAgIAAAAAAP8A/gD8 /fkA//z4APTy7wAA+PkA/w8AAAABAAAEAgIABQIAAP7/AQD9/wIAAwD/AAEBAAAA/wAAAP//AAH/ /wACAAAAAAAAAP///gABAQIAAgMDAAMDAwD//f4AAgIAAAMDAwAA/wUA/v39AAQEBAD+Av8A//sA AAMGBAAC/gEABv8AAAMGBwABAwMA/vsHAP//AgAEBgkABQMCAAgGBQAGBgUA/f3+AAEBAgADBAEA /f38AAICAgAEBAYA/Pz8AAIC+wACAgIA/QEEAAQFAQAB/wAAAgMDAP3/AAD+/fwABAICAP7//wD9 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 /v0BAAEBAQACAAIAAf//AAEBAQAAAAAAAQEAAAAAAAAAAgMAAAEAAAL/AAABAAAAAAAAAAICAAD/ //8AAgH9AP7+AAAA/vsA//v9AP0B+gACAwIAAAICAPn+BAAA//4A/f/+AAQF/QACAgMA/gUEAAEB /wAEBAQABQQEAP8AAAD+/wIA+vz+AP4AAAACAgIAAQABAAD/AQAAAQEAAgIBAAL+AQACAwAA//8D AAIAAQABAgIAAAAAAAICAgAAAP4AAgIBAAD/AQD/AAEAAQEAAAIAAgABAgEAAf8CAAICAQABAf8A AAAAAAABAAACAwEA/v0AAAAC/wAB//8AAgICAP//AAAEBAQACAgIAAoKCQAFBgMA/v4BAP77/AD+ //8AAwQDAAUEBAACAAAAAggHAP/8+gD3//0A/f7+AAEBAAAB/wAAAf//AAEBAQABAQAA/wEAAAID AAD//QAAAAEBAAAAAAABAf8AAAABAAEAAAABAf8AAAEAAAEAAQACAgEAAgAAAP//AAABAAEAAQEB AAD//gACAf8AAgIAAAIBAQABAgIA////AAMBAgD/AAEAAAD+AAECAQAAAQIAAv8BAAABAAAAAP8A AAIBAAIBAgD/A/8AAP//AAECAgAA/v8AAgEBAAICAQD+AP4AAgIBAP8AAAAAAQIAAwECAAAC/gAD AwEAAgACAAMD/gADAQIAAAAAAAQDAwADAwMA//7/AAAAAAABAgEAAf8CAAIBAwABAQEA/v7+AAIA AQD//wAAAgABAAICAgAAAAAA////AAICAQD/AP8AAAACAAEBAgD+/fsA/fz9AAAAAQD9/f0A//8B AAD/AAD//P8AAQQDAAMDAQD//wAAAwL9AP/+/wD7/P0AAwL+AP79/AAAAP8AAgMDAAD+/wACAgAA AgQCAAL/AAABAQAABAAEAPwA/wAEAAAAA/8BAPz//wAA/wEAAP4CAP7//QACAP8A/v4AAAD/AQD+ AgAAAf0CAAABAQD8+v4A+Pj6AP79+QAODwwA/wAAAP///wD//wEA////AP///wAAAf8A/f79AAAB /wAA/gEAAf7+AAEAAQAAAgIA//7/AAAA/AD/AAQA//7+AP//AQAAAAAA/v79AP8AAQABAgAA///+ AP79AAD/AQIAAPz8AAEDAQACBAMA/vv+AAAAAAAAAgAA///9AAAAAQAAAP8A////AAD//gAAAP8A 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 AAEBAQABAAEAAwIBAP8AAAABAf8AAQEAAAEA/gAAAQMAAQAAAAAAAAAAAAEAAAEBAAAAAAAAAAIA 9v3+APX9BQD5BgcA/P4BAAAAAAABAf4AAP8CAP8AAAABAP4AAQD/AP8AAAAAAP8AAgD+AAX/+QAJ AfoACQP+AAIAAAD9AAIAAAL/AAH/AQD/AgEAAQECAAH//gAAAQUAAP//AP4A/gD4//8A+AMHAPoC BwD9//8AAAD8AAEAAQAAAAIAAAABAAEB/wD/AAIAAAECAAUB/gAJ/fYAD/7zABIGAQAIBwUAAwID AAIBAAD//v8A7Pf2APn+AgD4AwYA/P8DAP8AAAABAAAA/wD/AAAA/wABAP4A/wABAAEAAgAB/wAA AAD/AP///wAAAP8AAAAAAP8BAQAAAAAABAABAP7/AQABAAMAAAD+AP8AAAAA//8AAQEBAAAA/wAB AAAA/wD/AP///wD9/QAA//8BAP//AAD+//4AAAAAAAL+AgD/AP8A/v/+AAEBAAABAAEA/gEBAAAA /wAB//4AAP8BAAEBAAD//wAAAQAAAP7+/gD+//8A/wEDAAEDAwD//v4A/f3/AAEAAAD//v8AAQL+ AAAA/wAB/gEAAQECAP3+/wACAP8A//7/AAAA/gAAAAAAAQAAAAEAAAAAAAAAAQH/AAABAQADAQIA AP8BAAICAAAB/v4A/gECAAD//wAA/f0AAAD+AAD+/wD+Af4A/gABAAEA/wABAwEAAQEBAP36AwD8 /v4A+Pn6AAMEBQADAwMABwYGAAEBAQAGBgUABQMDAAQDBAD/AwMA/v/9AP3+/wD+AP4AAQACAAEB AQAAAP8A/v8CAP8AAQAC/AAAAAD/AP4BAQAB//4A/v7/AAMD/wD/AP4AAgAAAAH/AQAAAAAAAAEA AAD//wD/AAAA////AP/9/gD//wAA/v7+AP/+/wAAAAAAAAAAAAD//wD///8AAAAAAAIBAQAHBgcA CQoJAAIDAgACAAEA/f/+APr9/AD+/v4AAgICAAcA/wACAQAABQUEAAsKCwD7/PwA/vr6AAAAAQAC AQAAAAH/AAD//wABAAMAAAAAAAD+/wAAAP8AAP8CAAEBAQD///8AAQH+AAAA/wABAP8AAQD/AAD/ /gAA/gAA/wAAAP8AAAAAAAAA///9AAEA/wAAAAAAAf8AAP/+/QAA/wAAAAAAAP8C/gD///8AAQEA AAD/AAAAAP8AAAH/AP//AAAAAP8AAf4CAAEDAAD+/f0AAAAAAAD/AAAAAAAA/wAAAP7+/wD///4A /v8CAAABAAAA//8A/v7/AP7+/wAAAP0AAAMAAP4A/gAC/wEAAP7/AP/9/QD+AQIAAAABAAAAAAD/ /gAA///+AAAAAQD///8AAAD/AAEBAQD///8A////AAACAQD///8AAAD/AP//AgD+/v8A//7+AAD9 /gD49fMA+vn2APz8/AD5+v0A//8AAP39/wD8/P4ABQYIAAQGBAAEBAMACQYGAAMBAwD/AP8ABggH AAgEAgAEBAUABggIAAgGBgALCAcACwgIAAMEAwACAgIABQQDAAICAgD/AP8A/f39AP7+AAAA//8A /P79APz8/AD9//8A+fr8APv+/gD7/v4A/Pr6AP7+/QD09fYA7+ntAPb3+AACAwoACAoEAAEB/QAC Af4A/gD/AAEBAQADAgEAAAD+AAABAgAAAwEAAAMBAAACAgABAwMAAf79AAEB/wACAgMAAwQBAAAB AQADAQAAAQMDAAABAwADAgMAAP4BAAEBAQAAAQIA/gD9AAMCBAAAAgEAAwMDAAQEBAAAAAAAAP8A AAMCAgABAQEAAQAAAAEBAQACAP8AAgQAAAEEBAD+/wMA//0BAAIEBAAAAgIA//3+AAMBAAADAwMA AQICAAABAAABAQAAAAD/AAEBAgAAAP8AAf8CAAEBAAAAAQEA/gQBAAECAgABAAMAAf/9AAAAAAAC AQEAAgMAAAEAAAACAQEA/gAAAAEBAQADAwMA/v39AAABAgABAQEAAAMAAAEBAgAC/wAAAQEBAAIC AQABAAEAAf8AAAEAAAABAf8AAAAAAP8AAAAAAAAAAAAAAAH+/wAB//8A/f4AAAMAAAD+BP8A//// AP7+/wD9//4A+/n5AO7s7AD/AQIAAf/+APr29gAFBQMACQgJABYUFQAPCgoAAwIBAPr6+QAC/v0A AAEBAP//AgD8/P0A/P//APv7/AD7/PwAAP7/AP7+/gD9/f0AAAMCAP/8AQD6//sAAv/6AP8EBAD8 /f0A////AAQA/wD7+/wA/v38AAAE/wD8/PwA/P39AAEBAAAA//4A+/r5AAQAAwD//wEA/fz8AAAC BQD7/f0AAP7+APwEAAACAgAA/Pv9AAACAgD//wEA+/r6APz+/gABAvwA/P39APn2+AD/AQAA+wAC AP35+QAAAP4AAAEDAPj7+wD9/f4AAwICAP39/QD5+voABQYGAP78/wD29fMABgYEAAUGBQD09/YA BAECAAkI+wD7+/wA//8AAAD//QAAAAEAAgH/AAMEBAD///8ABQQDAAECAwADBQcAA/4CAAkA/wAR CQUAIBkSAA0B+QDl3NQA//v2AD84MQAXFhQACwoGACMjJQAHCAsAycjHALm5uQAsLC0ABAQEAPHx 8QD9/v0A5+fnANrZ2gAGBgUAERIRAPHz8wAEAwQAzcvMALSysQA8PTsATEtNAN7e3gCnpqYA+Pj5 ABESEgAeHh4AODc1ADIzOAArIx0AIxwWACgmIwDL1+MAztffAOTn6QDxAv0AAgYKAAQHBwAH+vYA AwIAAAYFBAD7/P4AAwUEAAQGBQD/AQMA//36AAMB/gAFBAIA/PwEAAAAAQAFBAIAAQD8AAQBAgAE BAMABAICAP8EBQAA/f0AAwL/AAL/AQACAwMAAwMDAAMAAAABAf8AAQAAAAIB/gACAP4AAwH/AAIA /wABAP0AAf/8AAAA/QABAP0AAQD+AP8A/wD//v0AAQABAAH//QD7/gAA/v4FAAEA/wAEBQUAAP39 AAT59gAP9fQABgH/APkfGwAQMjEACx4dAPv7+QD33N0A+8/TAAbp6wAE/v8AAAEBAAb/AAAAAQEA /gAAAAD//gAF/f4A/f78APsDAQAAFBIA/wkIAPwLCwD4DQwA8w4KAOsLCQAH/gAAFvHzAAT49wD4 HBgADkNDAAgdHQAB9/cA89HRAAH19gAXPj0A/TQvAAIGBgAP4+QA+N/gAAQHBQAD+/wA9fT2AP4N CwAEMC8A8wD+AOTq6QArIiEACjMxAATx8gD+DQwA99DRAPXX2AAQAAMACQ8PAAMaGgD+3OEAA/P3 AA/6+gAK//sABv//AAP/AAD9AQAA/QEAAAX+/wACAAAAAgEBAAQCAgAAAAAABAICAP3/AAAAAgMA AAEAAAIBAgAAAAIAAwECAAIBAQAAAAAAAwMCAAABAwACAgIAAv8BAAABAQAAAP8A/gD+AAD/AAAA AAAABAAAAAD8/PoA//37AAD//gD//fwAAQACAAAA/QAAAQAAAf7/AP7//gABAP0AAP8AAAD+/gAC AgEA/f7+AP/9/QACAP0AAAIAAP4BAQAA/gAAAgD+AP8A/wD+Af0A/AD/AOjs8wDe5OkAJiQkACIa EwDb298ALyUjABcTEgDW3OUA0driAPT4AQAGBAIA/v7/AP0ABAD+AAIAAQD/AP39/AD7/P0AAgMB ABYYFwDh8ekAxdXkAPL7AAAC/wIA/f7/AAAA/QD9AQEA9/8FAPH7AwDz+gEA+v4EAPn9AwDv+AEA 8vkBAAD+AQAEAP0A/QD6AP8A/QD8AgEAAwMAAP7//gD/AAAAAP/9APz69wD7/f4A7P33AP38+wAi HhwAF+HzAPDi6wARDAAAMicdAOju8QCuuMIAzd3uAPD8BwD20uIAFxDMAEtEPgAiHhsAy9XeADEn HgAjHhkAy9DUALTAzwDi8AAAAAT9ALfI2QAdGhUANS4nACEbEwDU3eoA8fb8APj8AQD5/QAA7/cA AOr3AgAB/QIA+fr6AAL9+wDy9PkAuMTQAM/c6gAB//4AFdLgADItKAAZEgsAEw0HAOby9gD9/f0A Bf/6APwB/gD8Af8ABP38AAD//gABAQAACAcHAA4JBwAC/gEA//8CAPwBBQAHBP4ACAcFAP0BAQD+ /f0A/fz8AP39/QABAAAA/gD3AAADAAD//foA/wAAAP3+/QD8/PsA/QIEAAD//QAAAP0A/gAAAAAA /AAA/AAAAP/7AP///wD//gAA/f7+AAAB/gD9//wA/v4AAP4BAAD/AAAAAQEAAAEAAAAAAAAA/wD/ AAD//gD5/P0A8/z/APgCCAD7/wQAAAD/AAEA/QABAAEA/gEAAAAAAAABAP8AAAAAAAAAAQACAAAA BwD7AAb99AALB/4ABgMAAP8A/QD//QEA//8AAAACAQD//v4AAAEAAAD//wD/Af0A//8AAPT6+wD0 /QIA9wEHAPoAAQAAAP4AAf//AAEAAQD+AAEAAQAAAAAA/wAAAAIAAgABAAf99wAMAPgAEQkCAAUD AQD2+/0AAAIBAAYA/gAA//8A/gEFAP//AAAB//8AAgEAAP7/AAAAAP8AAf8AAAAA/wD/AQAAAAAA AAAAAQAAAAEA/v79AAD//gAAAP8A////AP7+/wAAAAAA/f7+AP//AAD+/v8AAAAAAAAB/wAA//8A AQABAAAAAAD/AAAA/wEBAAADAwAAAwIAAP3+AAABAAABAAIAAf8BAAECAgAAAAAAAAD+AAAB/wD/ AAEAAQABAAEBAQD/AP8AAQICAAIBAQABAQAAAQEAAAEBAgAAAgMAAwUHAAIDBAAC+voA+/r5AAD+ /gD+/gIAAAD9AAAA/gABAgEAAP8BAAEAAAABAQQA/wH9AAIBAAABAP8AAgAAAAIBAAABAQAAAQH/ AAAAAQACAwMAAQABAAQBAQAAAv4A/wECAAECAgD+Af8AAv/9AAICAAABAgUA/gEAAP/+/QACAP8A AgIBAP8CAgAB/wEA//7/AP7+/gABAAAA/Pz8AAAAAAABAQEAAP8AAAEBAgADAwIABQQDAAMAAQAA AAAAAP8BAAEAAQAAAP4AAAICAAAAAQACAP8AAQEAAAABAQABAAEA/v7/AAQEAgD+/v4AAgICAAAB AQABAAAAAgD/AP///wACAwMAAQEAAAIAAgADAwMA/wAAAAQEBAD//wAAAAAAAAQEBQD+//4ABAMD AAcHBgANDQ0ABwoJAAEBAAAA/wAAAf4AAAIDAwABAwMA/fz9AP7/AAADAgMAAwMAAAgDAwAM/fwA 9QEAAPv8/QABAAEAAQACAAABAAAAAQIAAP/9AAICAAD+/gEAAQECAAAAAAACAgIAAQIAAAIBAgD+ /v4AAgEBAP8CAgAAAQEAAQAAAAH+AAACAAEA/v8CAAAA/gACAAEAAAAAAAEBAQACAgAA/wD/AAEB AAAAAAEAAAAAAAICAgD/AP8AAAABAAEC/wAAAAAAAAAAAAAAAAACAgEAAP//AAICAAD/AAIAAQEB AAEA/wABAgIAAAIDAAD//wABAP8AAgEBAAACAwABAf8AAgEBAAICAgACAgIAAwEDAP0B+wACAgIA /v8AAAEBAgABAQEA/v8AAAMCAgAAAQEA///9AAMCAgD+/v8A/wEAAAIDAwAAAP8AAP//AAAAAQAA /wAA/Pn+AP/5+QAE/PwADAcFAAQNDAAAAgYAAAECAAAAAQAAAgMAAAEFAAEDAwAEAgEABgMBAAIC AgD//wEAAwQDAAMCAQABAQIAAAMDAAMCAQACAAEA//z7AP///wD9AQEAAv79AP4CAAAAAgMAAQEE AAH//gAEAf8ABwUEAP8EAwD8/gAACAQAAAEBAQABAQEA/gEAAAMCAQD9/P0ADgQMAM3R2ADa1eAA FhoRABQVCwADBgIAAP8CAAACAwD//wAAAv8AAAABAQD/AQMAAAMCAP8BAQD/AQIA/wMCAAIB/wD/ Af8A//8AAAIBAAAAAgAAAf4CAAEAAQAAAAAAAQEBAAABAgAAAAEAAgECAP8BAAAA//8AAAABAP7+ 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 /wD//wAAAAECAAAAAAACAP4AAf8AAAH/AQACAQAAAQD/AP8BAQD/AAEA/wACAAEAAAAC/wAAAgD/ AAAA/gACAQEA/gACAAABAQAAAAAAAAAAAAAA/wAAAAAAAAD/AAEA/wD+//4A9vv+APP7BQD2BQcA +wADAAAB/gAAAP8A/wABAAAAAQAAAP8AAAABAP8AAAAAAP4AAwD/AAMA/QAAAwQA9/0HAPr6AQD+ AAEAAQICAAD/AAAAAAEA/wACAAD//wAAAQAAAQAAAAL/AQD6AAMA9gIMAPgBCAD+/wEAAP//AAAA AAAAAAIAAAD+AAAAAgAAAQAAAAAAAAUB/QAK//oACwP+AAUDAQD4/gIA+wIHAPn/BgD7AAMA+gEC AAD//QD+AAIA/v//AAAA/wAAAAAAAAAAAAAAAAABAP8AAAD/AAAAAAD/AP8AAQD+AAMA/QAFAf4A BAH/APz/AAD/AAAAAAEBAAL/AQABAAAAAQH/AAEB/wABAAAAAAAAAAAAAQAAAQEAAP8BAAAAAAAC AQAA/v/+AAMBAgD/AAAAAQEAAAEAAAABAAEAAQAAAAABAQABAAAAAQAAAAEBAQD///8AAQEAAAEB AAADAf8AAAEAAAABAAADAQEAAAH/AAIAAAD/AQAAAQD/AAIAAAD9AQAAAwMDAAICAgACAQEABP0G AAEBAAD//v4A/v39AAD+/QD4//QAAgD9AAMB/wACAgEAAgMAAAEBAAACAwEAAwMDAAMEAwADAgEA BQQBAP/+/gACAgMABQYFAAQD/wAFBQYA//4AAAIBAgD+/vwA+vv7APr6/AD3+v4A/AEBAAABAgAD AwQAAQACAPr5+QD2BAIA/f38AAH//wD+//4A/Pz6AAMDAgAEAwQAAQAAAAIC/wABAQIAAQECAAAA /gABAQEAAAIBAAABAQAD/wAAAAH/AAICAQD+/wAAAgIBAAD/AAACAQIAAAEAAAABAAABAQAA/v7/ AAEBAQACAgIAAQEBAAIBAgABAQAAAQIBAAEBAAAA/QAABQMDAAkICAAJCggAAwQDAAEBAQABAP8A AQEAAP8AAQD8/v8A+vr6AP78+wD//v0A/PkBAPoFBAAEAwIAAwQDAAICAwACAQEACAgJAP39AAD4 /P0A//7/AAEB/wABAQAAAP8AAAAAAAD///4AAAABAAD//wAB/v8AAQICAAEBAQAAAQEAAQD/AAEA /wABAQAAAP8BAAABAAAAAQAAAgECAAEBAQACAgEAAQECAAAB/wAB/v8AAQABAAAAAAABAQEAAQEC AAEBAQAAAQAAAAAAAAAAAgABAQEAAAEAAAIDAQAAAAEAAQECAAD/AQACAQEAAQEAAAABAgABAgEA AP8AAAIA/gABAgIA/v7/AAACAAABAQEAAf8AAP///QD+/P0A+vr8AP/9AgD+/f4A/Pv8APr6/AD1 +PgA+vsAAPr7/wD7+voAAP7+AAD8/AD/+/wA/f7/APf5/AD3+PwA/f3/AAIBAwDn5vEAAQD+AP7+ /gD7+foA/Pz+AAACBAD/Af0A//32AAEBAwD9/v0A/wD/APr9/gD5+PwA/v3+AP//AAD/AQMAAAED AAABAAADAQAA/gD/AP8BAgAC/f4A//8BAAgCBAAR//sAEwL+AAwGAwD4/wAA7/j7AOUAAAD5AgIA BgIAAAMAAAABAQMABQABAAgBAAACAPwA/QICAPsCBAD6//4AAQICAAAB/wAAAAAA9fX3AAfs+QAI BQMAAgMCAP0BAgD8/wAAAQIBAAkGBwAFAPoAAQICAAMFBAAGAwAABgUCAAIGBQD9AQAACAkEAA4P BgAHCQUACg0MAAYJCgD/AQIA//8AAAEAAAD///4AAAACAAEAAAAA/wAAAAEAAAAA/wD///8AAP8B AAAB/wD///8AAP4AAAABAAD///4A/v4BAAEBAgD//v4AAQL+AP8AAAAA//4AAf8BAP/+AAAA//8A AQABAAEA/gAA/v4A/wIBAAAAAAD//v4AAAH+AAAA/gD/AP8AAAD/AAAA/wD//v4AAQABAAD+AQD/ /f4AAQEBAAABAAAA/v0AAAL/AAD/AgD///8AAAD/AP8AAQAA/wAAAAEAAP8A/wAAAAEAAAAAAAAA AAAAAAEAAgEBAAEAAQAAAQEAAAEBAAEAAQABAAAAAQEBAAEBAQD/Af8A/v7/AP//AQAB/wAAAQAC AAEBAQD29vUA5ufnAPz9/gACAQAA9/b2AAQFBAAHBwkAERESAA4NDgACAgIA/v7+AAD+AAAA//8A AAABAAAAAAAAAAEAAAECAAICAQD/AgIAAf8DAAD/AQABAwQAAAICAAIDBAACAgIAAwMBAP39AwAB AQAAAgICAAQEAwD+/gEAAgICAAIC/wACAgIAAwIBAAEAAQD+AwIAAgQBAAADAgD/AQAA+Pj2AP3/ /wD59/cA+/v6AAkKCQAHCAcABv8HAAkICQAA/v8A/f7+AAQCAAACAgQACAkIAAkHBgABBAsACQgG AAMBAgAEBAQA+vv6AP///gAEBAMA/Pz8APv7+wAFBQYA////AAIDBQADBQcAAgIDAAABAwABAf4A BQMEAAEDBQD8/f4AAwMDAAP7+wACBAUA/gEAAAQDAgAbExAAHRMLAOjf2ADo5N0AKCUlADo7PAAW FxcADg4OAO7u7wDy8vEA5ubkABcYFgASExAA/v3/AP/+AADl5uYA6enpABEREQAXFxcA7+/vAO7u 7wDy8/MAFxcWACclJQD29vYAzc3OAO/w8QAWFRUALi0sACwsKwAWFhYAAQMEAAkKDAABAgMAAQQD AOny+AABAgQAAgH/AAUDAwAFBQYABQQCAAQB/wABAAIAAwMAABUQDwA7LwoADQgFAAH79wDR2uMA +fr5APr5+gAB+vsA/wT6AP8B/wD5+/oA/v7/AAEEAAD8+/wA+/z+APz7+AD9/PsA+/r5AAUH+gAB AQQA+/v5APz8/QAABvoA//38APz8/AAD/fwA//z7AP38+wD+AP4ABf0FAP39/AD9/P0A/vz9AP4D /QD+/PwAAAD+AP79+wD+/fwAAf79AAAA/gD+/wEA/v/+AP/+/wAA//8A/gD+AP///QAD/wMAAP39 AP8CAgABBQQAAvz8AAr4+QAP9fcAAOXqAPv+3gD3GBMADjMtAAMbHADxycoA6c3QABlSUQACJyUA Bvz6AA7q7wAJ+/4A+/PxAPwHBwABBQUAAQgHAP8BAgAEAgMAAfz9APn39gAHAP4AAvv8APft7QAJ EBAABygnAAkHBwAGIiAA/BAPAAYVFAD/6f0A/fLzAP74+AAI/PwA/evrAP7n5wAKIh8AHxkXAPjg 4QAL+v4AJAkJAP4AAQD44+QA/M3RAPrV2gACKSYAAf/+APju7wAE7/IA/+TkAAL6+wD8BQMAAwD/ AAv5+QAC+PgA+gUJAAICBAAC/f4A+/39APwA/QAA+/oA/f78AAD//gAD/QAA/P7+APv5+AAEAwMA AAIFAP38/AD+/f0AAQAAAP8A/gD8+vkAAgEAAAEE/QD9/fsA//77AAEC/AD9/f0AAAAAAAAAAAAE AAAAAAAAAQAAAAEAAAABAAAA/wAAAAMAAAACAAEAAAABAQEAAP//AAAA/wAAAP8A/wH/AAEAAAAA AAEAAv8AAP4AAAAAAAAAAAD/AAEB/wD/AQIA//8AbPCd5AAAIABJREFUAAMA/gD/AQEA/wEEAOTq 8gDU2N8ARjcqADYxLQD2+voAws3aAP4CBQAAAP8A/wAAAP4BAQAA//8A/wAAAP8CAgABAf8AJh0V ABcSCwDw8vIA7vcBAN/o8wD6/AIABgUCAAQEBAABAAIAAQABAAAAAAD/AQEA/QIGAOzy+gDx9PoA GxcUAC8nHgAAB+4A4+bpAP3/AQABAAAAAAEAAAABAQABAQEAAAAAAAIB/wAUDwoAMycYAA0P9gAT DwkARjosAAQGCQDU3dgA6vT5APr49ADS1+AASzoqAEtCOgAKzdoA9Pn+ACYbEQA+Ni0A+ff1AN3f 4wDw9/4A2N/mAODk5QAvKyQARjroAMnU4AD+AgQAMCcZACwpJADk6e8A19/lAPH5/wAAAPwA7fD2 ACcgGAArIxsA9f8KAOnr7wADAAAAAv8AAP8A/wACAAEA/gIGAP0BAQD+AAMAAP8AAAH//gABAf8A AAAAAAABAAAB/wAAAQAAAAABAAAA/wAAAQD/AAL//gAC//0ABAD8AP8A+wACAAAA/gEAAAQAAgAD //wAAgD+AAAA/wAAAAAAAAAAAAABAAABAP8AAwAAAAIBAAABAP8AAQH/AAIBAAAAAAEAAAECAAAA /gABAAAAAwEAAAIA/wACAP4AAAD9AAD//wAA//8AAP8BAAD/AAAAAP8AAAABAAAAAAABAQAA//// AP8A/wD6/f8A9PwAAPgDCwD5AgcA/wABAAD//AABAAEAAAACAAEA/wAAAP8AAAAAAAEAAAAA//8A AAD+APoBAgAAAw0A+QILAP8BAgD+//8AAQEBAAAA/wAAAAEAAAAAAP8A/wABAAEAAQAAAAAA/gD+ /wIA+gEFAPv/AgAAAP4AAAD/AAAAAAD/AQAAAgAAAP8AAAAAAAIAAgD9AAf/+gAK//kACAMAAP7+ /wD6/gMA/QIEAP0AAQD+//8A/wD/AAAAAQAA//8AAQD8AAAAAAD/AAAAAAACAAEA/wABAP8A/wAA AP8AAgAAAAMAAgH/AAQA/wAIAwAABP//APv8/wD//v4AAQEBAP//AAD/AP8A/wD+AP8AAgAA/wAA Af//AP8BAQAA/wAAAP//AAAAAAAAAf8A///+AP/+AAABAAIAAP8AAAAB/wD///8AAQAAAAD//wAA AgEA/wAAAAD/AAD/AAAAAAAAAAEBAAAAAAAAAP8BAP8AAAD//wAA/v8AAAL/AAAA//8AAQEAAAD/ AAABAP8A//8AAAD//wAAAgAAAgQCAAICAQAA/gQA/wT/AAIA/wD7/PkAAP3+AAABAQD/AAAA/f4B AAABAAABAP4A+/7/AAH9AAABAP8ABQMAAAH//gABAgIABf39AP/9/QD9/gEAAgEAAAUDBAADAgAA CQYBAAgDAgAFAv4A+v8AAPsAAwD/AgQAAP4AAPr7+QD68fsA///+AAL/AAABAP8A/v38AP3+/AD+ AP4AAAD/AP///wD/AP4AAQEBAAD//gD+AAIA/wAAAAD/AAAAAAEAAP/+AAAAAAABAP8AAAADAAAA AAD/AAEAAP//AAH//gAAAgAAAf//AAD/AAAAAAAAAQAAAAAAAAAAAQAAAQEAAP///wADAgEABwcH AAgJCAACAwQA/v//AP/8/gD+/v8A/f//AP///wD5+foA+/r6AAIA/gD//vwA/fsBAPf19QAA//8A AAgJAAQDAwAEAwIAAwMEAAoKCAAB//8A+fn5AP//AAAAAP8AAQAAAAAAAAAAAAAAAQEBAAAAAAAA /wAAAQD+AAEA/gABAAIA/wD/AAD/AAABAQAA/wAAAAAA/gAAAP8AAQEAAAICAwAC/v4AAQD/AAEA AAD/AQAAAAEBAAAA/wABAAIAAQEBAAABAQABAv8A////AAIAAgAAAAAAAQH/AP/+AAABAQAAAQAB AAAAAQAAAQAAAAD/AAEA/wABAAEAAQECAAEAAQAAAAIAAAH+AP7//wD//f0A+vj6AP78/QD29PgA 9fX5AAAAAwAB/gAA/vv9APj5+wD3+v0A9vn9APX4+wD8+/0A/fz7AAD9+gAC/wAAAQAEAPv+AgD+ AAIA////AP39+gD9/v8AAAECAAQCAgD++/0AAQEBAAEDAAAAAP8AAQACAP8A/wD8/f4AAQICAP/+ AgABAQYAAgP9AP7+/wACAgQAAAECAAD//wAAAP4AAf8AAAIAAgD/AQIAAQD/AAoCAQAcAAIAIgMA AAoAAQDj/f0A9/8CAPwCBQD+AQEA9/z8AP7+/QABAf8AAgEBAP/9/wD//vsAAAIEAAACBAD//v4A /wD7AP4B/wAEAwQACQEAAAMC/gD/BQAA+wP/APX9+wD4/f8A/wH/AAQD+QAD//sA/QAAAAMCBQAD Af4AAgD/AAADBgAAAgEAEA0CABgVBQAHCP4A9gwMAA0TFQAIDQsABwgHAAIBAgABA/0AAQICAAAA AQD+Af8AAQICAAAAAAACAgIAAQECAAEBAgD/Af4AAgICAAAAAAD+Af8AAgECAAECAgD+Af8AAgIB AAABAgD//gIAAgIBAAABAgAC//8AAgICAAIAAAD//wEAAAMBAAAAAAD//wIAAgIBAAABAAAA//8A AgEBAAABAQACAQEAAwEBAAEBAQD+/QEAAQEAAAICAAAEAwEAAgIBAAICAQAC/QEAAQMDAAEBAgD+ AwIAAgEBAAMCAgD/AgIA///+AAQCAgAAAv8AAAABAAIDAgD+AAAAAAEBAAMDAwAB/v8AAAD9AAIC AwAA//8AAAECAAECAgABAP4AAv8CAAICAwABAAIAAQECAAcGBAAJCAkADw0NAAgICAAICQoAAgEC AAIB/wD/AgIA/vz8AAICAwADAgQA//8BAAICAQD//wAAAAABAP8AAAD/AP8A/v/+AP0A/QAAAAMA BAABAAACAwAAAf8AAAACAAD/AAD/AAAA/gD/AP7+AAD//gAA//7+AP7+/wD+/v0A//4BAAD+/gD+ /vwAAf/+AAH//gD6+fUA9fT0AAIDBAAAAP8ABgcIAAgICQABAQEA//4BAAcEBgD//vwA//4CAAQG AwAAAAEAAgAIAAgGBgAAAwcAAwEAAAIAAgAEBAQAAQICAPz+/AAFAwMAAgIDAP//AQAEBAUAAAEB AAP6+wADAwIAAgMDAAICAgAAAQEAAgQEAAH7/AAA/f8AAQEAAP4BAAD7/f4ABgUDAB4XFAAtIhsA Cf72APvsCAAtQkIAPD0/APDw8ADGx8gAIiEhAPz7+gDl5OIA09TUABjsGQAcHB0A6ujqANbX1gAJ CAkANTQ0AB8fHwDNzc0A4eHhAB4eHgAhISAA+fn5AMnJyQDz9fMACQkJADk5NgAvLzAAJCUmAAcI DAD1+PwA6/DyAOPm8QDt7/IA8/f3AAECBAD+AgQABf/8ABAMCwASERAAEg8MABQOBwAPCwcABQUG AAEA/wAOCAIANSkcAAYCNwALCwwAz9vmAPz7+wD//gUAAwQDAP8BAgAFBQMABQMBAAQEBQAE/P8A AAABAAUEAwADAAMA+gUFAAUFBQAEBAIAAAUFAAMCAwAEBAMAAgIEAP/9BQAGBAMABAIBAP0DAgAA AgEABAMDAAEAAAD8BgQABAQDAAQEAwAFBAMAAP8AAAUEAgAAAQQA/f4BAAYFBAACBQIA/gUEAAMD AAAEBAQABgD9AAUFBQABAAIAAgMDAAX8/AAC+foA/gMDAPkNCwDyCQgABPz+AAYODAACHhkA/BcW AP4CAgAG5+wAB9jcAADk5gD/IRwA+AkJAPP14wAA6/AA9fLwAAMRDgAK/fwAB/X2AAL+AQADGxsA Azk0APsTEQAA+foADNnbAPn19gABMjEACkVBAAIJCQD59vUA+d7gAAP8/QARDg0ACQMFAADg4AAB 4uQADuLlAPz3xAD54OMABfLvAPPi5AD9As4A/wsJAPv+/gD87ewAB+jqAAb8/wD919oA/gL/AP/3 +AD9+vwAAf8BAAEA/wD9AgIAAAEAAAX+/QAF/fwAAf3+AAEDAQADAQIA/QABAAEAAAAAAAEA/wAA AAEAAgABAQIAAgEBAAAAAwABAQMAAAIDAAEB/QABAQIAAgEBAP8AAQABAQEAAAD/AAIBAAACAgAA /gAAAAECAgACAwEAAAAAAAAAAAAEAAAAAAAAAQABAQIAAAD/AAEAAAABAgAAAAICAAABAAAA/gEA AAIBAAABAQAAAAAAAAACAAABAQAAAQMAAgH+AP7+AgAAAgEAAAAAAAH/AAAAAAAAAAAAAAABAAAC /wAA/QACAPn9/QDa4+oA3ufwAC8pIgDY1dcA2uPqAP0CBQACAP8AAwD/AAAAAgD5/QIA9fn+APj9 AAD/AAIAHx0YAEg7LwADAwAA/wQKABIOCwDi6PMAw9DfAPD1+gAb/gAA9fr/APb6AQD+/gEAAAAB AOTr8QDa5e0AJSUhAFpSSQAWzNoAoqy3APz7AgABAAAAAQAAAP8A/wAAAAEA/f4AAPj7AAAkHB0A UEwPAPT5/wAEAv4ABwH/AMLM1wC/y9UA7/b8AAH9AwC8xtIAGBAJADExMQAhIyYA+vv7AAsIBQAA //0Aw83VANTc4wD0+vwA3ejvALK/zABOQjcARUA7AC4vLwD9/gAAEg4GAPL2+wC8yNUA3+ftAPz+ /wDz+PwA3OTtADQuIwBNR0EAJy31ALa9xgD68OcA8vr+APv//gD8/wMAAAECAP8BAQD8AAIA9vsA APf8AAD8/wIAAAICAAD//wABAgQAAQABAAEBAQAAAgMA+fz/APT5/QD4/QAAAQEBAAACAwACAQEA /wEBAAABAgD4/QEA9Pn/APr+AgABAgMAAQH9AAEBAgAAAAIAAAAAAPz/AAD1+v4A+/7/AAEDAgAC AAAAAQABAAIAAwAAAQQA/wABAAACAAD5/f8A9fn9APr9AQD/AAIAAAEAAAAAAgAAAQAAAAABAAEA AwAAAQAAAQEAAP39/gD6/gAA+gIIAPoACAD8AAQAAP8AAAEAAAAA/wAA/wEBAAAAAAABAP4AAAAA AAAAAQD/AAIA/QECAP4BAgD7AAIAAQIAAP8AAQD/Af8AAQAAAAAAAAAAAAAAAAABAAAA/wAAAAEA AAAAAAH//QD/Af8A//8BAP8A/gABAP8AAQAAAP8AAAAAAAAAAAAAAAAAAQAA/wAABQH+AAj++QAN BPwACQUDAPf9AAD6AAMA+gAEAP4AAwAAAf8A//8BAAAAAQAAAAEAAAD/AAEA/wAAAAAAAAACAP8A /gAAAP8A/wACAAAABAAAAQIABAL9AAX//QAGA/8AAwABAAL9/wD9AQEAAQEBAAEBAgABAgEAAgIC AAICAQD///8AAAICAAEBAgACAQEAAP//AAEA/wABAgEAAgECAAEBAgABAf4AAgICAAAAAgAB//4A AQAAAAAAAgAAAgEAAAECAAEBAgABAAAAAQEAAP/+/wD/AQEAAgICAAD/AAAAAQIAAgMBAAIDAgD/ /gAAAAEAAAEBAQAB/gEAAgAAAP8B/wABAAEAAAD/AAAAAQAAAgAAAwECAAEBAQAGCAoAAP4GAAIA /wD+/v4AAAECAP8A/wD/AP4A/v//AP/+AAD//f4A/Pz+AAH/AAD+AfwAA/sBAP/+/gAEA/gAAgAA AAMCAQAFAwAABQMBAAYD/wAFBAAAAP8AAPn6/AD8/QAAAP8BAP4A/wAA//8AAP//AAAAAQACAAIA /gEDAAMEBgADBQUAAgMCAAECAgAAAAEAAQEBAAABAAAAAQIA/wABAAAAAQABAP8AAQABAAEBAAD/ //8AAgIBAP//AAACAQAAAAABAAEAAgACAgEA/gD+AAICAgAAAP8AAQECAAAAAAACAQIAAQEBAAIB AgAHBgYADAwMAAUGBQADAwIA/v7+AAD/AQAAAQEA///9APv8+gD8+/oAAP3/AAIDAQAAAQIAAP// AP37/QD59/kAAwIDAAIHCAACBQMAAgIBAAUGBQADAgIA///9APr6/AD+AAAAAAEAAAEAAQABAQEA AAAAAAECAQABAQEAAAEAAAAA/wAAAAAAAgACAAEAAAD///4AAQEAAAEAAQACAQAAAP//AAAA/gAB AAEAAf//AAAAAQABAQEAAAAAAAAAAQAAAAAAAAEBAAAAAAAA/wAAAQEBAAAAAAAAAAEAAQAAAP// AAAAAAEAAQEAAAABAQABAAAAAQAAAAAA/wABAAAAAAEAAP8AAgACAgEAAPwAAPv6/gD08fYA8O3y AAUDBAD19/kA9vb6AP79AQD+/f8A/Pn5APr6/QD8/QIA+f3+APv9/QD+/gEA/f39AP/+/gAAAAEA AP//AAEBAAAAAf8A///9AP/+/wAAAQEAAP8BAP7+AAABAwMAAAAAAP///QABAAMAAAECAP8A/QAB AQMAAgIBAAAA/gADAAIA/wABAP7+/QD///0A/wH/AAABAAD+/v0AAgIBAAEB/wD9/v8ABgH/ABUD /gAaAgAACf/+APD//wDl/wAA8QMCAAABAgAFAQAA/AMBAP4AAQABAf8A/wEAAPz/AQD/AAAA/wID AAABAQACAAAAAQD+AP//AgD9/gEAAQIAAAUA/wAB/v0A+v3/APX8/QD3/P0A/QD+AAAAAwAA//oA /gACAAEC/gACAQAAAAD/AAEAAAABAgIA+fz/AAgG/AAS/PwAA/v4APb+/QD/ABYABQUFAAEFAAAB AgIAAAABAAAAAAAAAQAA/wD+AAEBAgAAAAAAAAABAAAAAAAAAAEAAAABAP///wACAAEAAQABAP// /wD/AAIA/gD/AAEAAAAAAAEA//8AAAEBAAAAAAEAAP4AAP8B/wD/AP8AAf8AAP8AAAD//v4A/gAB AAIDAQAA/v4A/wH/AAEC/wD+/v4AAAIAAAEA/wD9AP4A/wABAP///wD+//8A//8AAAD//wD///8A //7/AAIB/wD///0A/wACAAH9/gD9/f0AAAD/AP/+/gD//f0A//8AAAECAQD//v0A//7+AP8CAgD8 /f4A/f7+AAL+/gACAP8AAAH/AAAA/wD//wAA/v7/AP7+/wAIBwcAFxUVAAMEBAAGBgcAAv//AAIC AgADBQUAAP//APz8+gD8//8A////AAD/AQD//wEAAAABAAAAAQD/AP8A/wD/AAD//wAB//8AAAD+ AAAA/gD//v0AAAIDAAIAAAAAAQAAAAAAAAEBAAD/AQAAAAEBAAEBAQAAAQAAAQABAAICAQACAgIA AQICAAABAwABBAQAAQECAAICAQD///8ABQUDAAkKCwABAQIAAwQEAAgHBwD+/f8AAAEBAAgFBQD/ //0A////AAUGBgAAAAAABgMDAAUFBQD9AwkABAIBAAEAAAACBAQAAf0DAAT9/QAFAwIA/f3+AAEB AgAFBQUAAQEBAP38/AACAwMAAgQEAP39+wD+/f4ABwcIAAD+AAAFA/sAAwUEAAMEBAABAf8AGBAM ACUZEQD27OQA7vLuADw7OgArLSwAEQ8RAM7OzgDMysoAy8nJAAgIBwD29fYAIyIkAB0fHgAFBQUA 0dHSAPDv7gBAUFAALy4wANra2gDe3t4AKioqADo6OgAJCQgA4ePkAO3v7wASEhIAODY1AC8wMgAK DBAA8vj9ANPf3wDc4ucA5eftAPb7/ADv8vMA9fb3AAYHCAD+AgQA/vn2AA4KCQAPDg4AEAwJACAX EAAmIBkAGxoYABEPDAALBwAACwYCACwlHQAABgwA/gPRAMnP1ADz+gAAAQEBAP8AAAAAAQIAAAEB AP//AQD+/gAA/wABAAD/AAD+/v4A/v3/APz8/gACAgMA/f4CAP7//wD+/gAAAP7/AP39/QD8/f4A AAH/APz9/wAB//8A/v3+APv9/gD7/PwA/P39AAL+/gD8/v4AAf7+AP38/gD8/f4A+v39AAP9/gAG AP4A/Pz9APz/AAAH/PwA//38APz7+wD3BQYA/QEAAAX3+QD96+0AAQICAAAeHADtIh4A/QMEABwy MQAQFhIA+QcEAP77+wALIB8A+iglAAAVEwAA9fcAAtPXAPfFyQAJ8vUA+AQBAAcZFgAA9PUAA+bo APvz9QD/JSQAGC4sAAUAAQAB19sAAsPHAADx8wD17/MAAiAcAPn6+QD22NoA/t7hAP8HBwD+DgwA +vb3AAPz9AAK8/UACPHyAP3s8QD24eIA/fz8AAL19AD6/P4AAf//AAEBAAAHAAAABP//AAP9/wAG 9/gA/gH/AAEAAAD+AAIA+wQDAP8A/gD/AAAAAAAAAAMCAgAGAQIABwMBAP4BAgAAAgIAAQMDAAQE BQAFBQcAAf8CAAD//wAEBgYAA/8AAP3+/gAEAwMAAAEDAPsC/AACAgMAAgMCAAEBAQAEBAQAAAD/ AAECAgAAAAAAAAEBAAICAgABAgMAAQAAAAAAAAAEAAAAAP///gD///4AAP//AAD+/wAAAf8AAP// AAEAAQAAAAAA/v8AAAABAAD/AAAAAv8AAAAA/wD/Af8A/v4AAAAA/wAAAQIAAP8AAP///wD///4A AAAAAP//AgD+/wAA/wH+AP4AAQDb4+oAprbEAMzX4ADd4OEA6OzwAPz+AgAAAQAAAwH+APv7/wDS 2eMA+Pv+AN3k6wD1+vwA4ebqANDV2AAXDgYABQcHAOP7AAC55+kAu83lAPb3/QDk6e0At8LNAPn6 +wDw8vUAAv/7AO/0/gC9y9YA9/n3AAkKCQDq6OgA/v7+AAABBAAA//8AAAABAAAAAAD9/v0A5urw ALS/ygAaFRAAAAEBAP8BAQD6+fkA6ertANPa4gDf6vEA+/0AAAH+AgDT3ecAm6y+ADgyKwASCwUA BAL+APP3/ADf5u8A0NrjAOTt8wD8/wAA8ff/ALXF1QDt7/QAJyAYAAkHBAAAAQEA1vP1ANbh7QDS 2+UA7/T7AAD/AQD8AAIAy9beAAYE/AAcFg8A8ff+APPy8ADv7/UAssDKAP7+AgDp7/MAAv/8AAL/ AQDq7fAAusbPAPr5+ADr8fcA/v4AAAD/AAD9/gEAAAIAAAL//wD+/wMAz9riAPn8AADl5+wA+v4C AP8BBgD+AQIA/wACAPH3/gDJ1eIA6PL6ANnh5gD7/fsA/wD/AP//AQD+AP8A+/4AAOXq8QCxvccA 2d/jAPz//wD+AP0AAgD/AP4BAAD///4A/wACAPb6AADT3ucA/r3JANbd5AD+AAIAAf7+AAAA/gD/ AAEAAAEBAP4AAgABAAEAAf/+AP3+/wD1+wEA9wEIAPoBBgD+AAAAAAD+AAEAAAD/AAEAAAAAAAAA AAAAAAAAAAD/AAAAAQAAAQIAAAEBAP8BAQD/AAEAAAAAAAAAAAABAAIA/gD/AAAAAAAAAAAAAAAA AAAAAQAAAAAAAAAAAAAAAQAA//4AAAD/AAH/AAAAAAEAAAEAAAAA/wAAAAAA/wAAAAD/AQACAAAA BgD7AAj+9gALAv0AAwEAAP3+/gD8/wAA/wABAAEBAAAAAAAAAgABAAAAAQD+AQIAAP8AAP///gAA AP8AAAABAAAAAgD/AAAAAAADAAEBAQAEAf0ACf/5AAoA+wAGAgAA/f4CAP8B/gD///8AAAEBAAAB AQAA/wEAAP8BAAAAAAAAAAAA/wD/AAAAAAD///8AAgAAAP//AAD///8AAP8BAP8A/gD+//0AAP4A AAEBAQAAAAAAAP//AAAB/wABAQAAAAD/AP8A/gAAAAEAAP8BAAAA/wD/AAEA/v//AP///wABAAAA /gD/AP8A/wAAAP8A/v3+AP4AAAD//v0A/wECAAD//QAA/wIAAAACAAEAAAD///0A/gMCAAIBAgAE BQcABAIJAP///gAAAP8AAAICAP//AAABAQEA//79AAAA/gD9/f0AAf//AP7+/QAA//0AAQICAPz6 +wAA/gEA/wD+AAD8/gABAP4AAgH+AAUDAAAFAgAAAAIAAPr6AAD+AAAAAQICAP7+/gABAv8A//7/ AAECAgACAgUABQUGAAYGCQACAgQA/v//AAH+/gABAAIAAAH/AP8A/gABAv8A/wACAAIBAgD///4A AQD/AAD/AQD///8A///+AP//AAD/AQEAAAD/AAD//wD+/wEA/v//AAL//wAAAAAA///+AP8CAgD/ AP8AAP//AAQFAwAHCAgABgYFAP8AAAAA//8A////AP8AAAAA/v8A+vj4APr6+wD9/PoAAP7+AAAC AgD/AAAAAQACAAAAAAD8/PwA+vj5AAUDBAD/BgYAAAEBAAIBAQAGBwYABwgHAP3+/QD/+/8AAAEB AAD//wAAAAAA/wEAAAABAQD/AQAAAP//AAAAAAABAAAAAAABAAEBAAAAAAAA//8BAAIBAQD+/v8A /wD/AP/+/gD//vwAAQQFAAABAAAA/wAAAAAAAAAA/wAAAAAAAAD/AAAAAQAAAAEAAAD/AP8A/gAB AQIAAQADAAEB/wAAAP8AAAAAAAEA/wABAQEAAP8AAP8AAAABAP8AAP8BAP8B/wD+/v0A+Pf6APHv +ADr5/EA6+rvAAYFBgD7/f0A+vv9AP//AQD9/P0A//3+AP7/AAD9/QAAAAEAAP7//QD//wIAAgIC APz+AQAAAAIAAAAAAAAB/wAA//0AAP/9AAIAAAABAAEA///9AAEAAQABAQEA/v7+AAEBAQABAgIA //77AAEA/wADAf4A//3/AAEAAgAAAQAAAgEBAAIDAQD9/v8AAQD/AP8BAAAAAAAAAQICAAAAAQAF AP4AFAH/AB8FAgAQAf8A8vwBAN//AQDmAwIA9gD/AAL//AAD/wEAAgD+AAIB/gAB//4AAgD+AAAB AgABAQAA/AD9AAACBAACAP8A//79AAQAAAADAAAABgEAAAMA/wD8//4A+gACAPsAAQD7//4A/v// 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 AgACAgIACQkJAAEAAAD39fcA/wABAP8BAwAAAf8AAQEBAAEAAAABAAEAAQEBAAECAAACAgEA/v4A AAABAgABAQEAAP7+AAABAAAAAf8AAP//AAEBAQAAAAAAAAAAAAEAAQD/AAEAAQAAAAEBAgAAAAAA AgIAAAAAAAAA/wIAAP/+AP8A/gAAAf8A/wAAAAABAgAAAP4AAAAAAAAA/wD//wAAAAD/AP8A/wD/ AAAAAP7+AP78/AD5+/4A8fD5AOno9ADo5/AA9PT6AAMD/AAAAQEA/fz9AAABAAAA/wAAAQEBAAIB AQD/AgAAAAD/AAD+/wABAgAAAP/+AP/+/gABAQAAAQABAAD//QAAAf4AAgH/AAL/AQABAQAA//8B AAICAQD//v8AAgECAAADBAD///0AAQH+AAEAAAAA//0A/v8AAAICAgD/AAEAAQEAAAABAgADAQEA AQABAPz+/wABAQAAAgICAP7/AQAPAAAAIAQCABwBAAD5/f0A4v4AAOUAAgD2/v8AAf78AAABAQD9 AAIAAP4AAAT+/wD+AP4AAQIDAAMAAQD///8ABAD+AAEB/wD/AwIA/v8CAAP//gAIAf0ACQMDAP7/ AgD4/P4A+gQAAAADAgAB/QIAAP39AAH//QACAQMAAgD9AAD+/QAC/gEA////AAAA/QAAAAEA/P4A APv9AAAFBAQACgX7AAD9+gD7+P0AAQoDAAb+AwADAf0AAwIAAP8AAQAAAgEABAMDAAABAQD/BP8A BAECAP8AAAD+/gAAAgMBAAH/AgAA//4AAQEAAAEBAQD/AgEAAgIDAAAAAAD/AQEAAQEAAAEBAAD+ AQAAAgEAAAIBAQAC/wEAAAIBAAH/AAABAgIAAQICAAAAAgABAQIAAAECAAEBAQABAQIAAwIAAAEB AgAA/gAAAQEBAAEAAAABAf4AAQEBAAECAQABAQEAAQEBAAAB/wACAgIA/QECAAABAQABAgEAAP8A AP8AAgD/AAIA/wD+AAAAAAABAAEAAAABAAAAAAACAAAA/gEBAAEBAQD//wEA//8AAAAAAAAA/wEA /gABAP4AAAD+AAAAAQACAAD/AQD+/v4A/v7+AP8AAAAC//8A/f/+AP7+/gABAAAAAQEBAP39/AD+ /wIAAQAAAP39/QD9/wEA//7+AP/+/wD9/v8A/f3/APz9/wACAwAA/gH+APz//QAB/f8A/gIAAP39 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 AAABAAABAAABAQEAAAAAAPz7/AD49/gAAgIBAP4IBgACAQEAAQEBAAQGBwAHCv4A/P4AAPv9/QAB AQEAAgIBAP7+AAABAQAAAQABAP8A/wAAAAAAAAABAAAAAAD/AP8A/gD/AAIAAAAAAAAAAQEBAAEB AQABAQEAAAAAAAAA/gD/AAAAAgEDAAAA/wAAAAAAAP4BAP8BAAABAP4AAAEAAAD/AQAAAAAAAQAA AP8BAAABAQEAAP8AAAAAAAAAAAEAAQABAAIA/wD29fcA+vj9AAEBBwDu7fUA5ufvAPT2+gAAAQMA AAH+AP/9/AD+//8AAQAAAP/+/gAB/wAAAAIAAP/+/gAA//4AAQICAAAAAQAA/wAAAgEAAP8AAAAB AAAAAP7+AAEDAgACAQMA/f38AAEAAQADAgIAAAD/AP//AAACAwMAAAEAAAD++wACAQAAAQABAAIB AgD+AgIAAwMDAPz8/QABAP0A/wACAP39/QABAQIAAf/9AP8A/gAAAP8AA/3+AA0A/wAZAQAACAAA AOn9/QDi//8A8gICAP0AAAADAf8AAAAAAAAAAAABAP4AAQH/AAEBAAACAQIA/gABAAAB/wAA//4A /wD9AAD+/wAAAQMAAgEAAAYCAQAGAgAA/f39APf9AAD3/fwA/Pz9AAECBQD/AwUAAQACAAEA/QD9 //4AAQABAAEAAQABAAAAAP//AAECAgAAAAEAAP8CAP39AgD8/wIAAQMFAAT9/QD99/IA5+nvAO/w EQAODB4ABQUIAAAC/gAB/wEAAQEDAAABAAAB/v4A/wEBAAEBAQAC//8AAQECAAAA/gAAAgIAAAEC AAACAgAEAgMAAQEBAAMCAgAA//8AAwMAAAABAQAC/AEAAAEBAAECAQACAP8AAgICAAD/AAD9AgIA AQMCAAAAAgADAwUA/wEBAAIEAwAE/gMABAMBAAEBAwAA//wAAQEBAAAAAAD+/v4AAwMDAAMBAQD+ /gIA/wIDAAMDBAD//wQA/gACAAMCAwAABP8AAAAAAAICAwAABQAA///+AAMCAgAAAf8AAf7+AAID AQAC/gAAAQD+AAMBAwD/Av4AAwIAAAICAQAAAAAAAv4BAAIA/wACAQEAAQABAAD//wABAQEAAQEB AP8AAAAAAQEAAQICAAH+AAD/AQEAAgACAAH/AAACAQEAAAABAP4BAAABAQIAAgICAAQEBAABAQAA /gD/AAED/wADBAQA////AAIDAgACAgIAAgIAAP4CAwACAgIAAQICAAABAAABAgEAAgEDAP4A/wAC AQAAAgAAAP4A/gACAP4AAQEAAP8A/gAAAAAAAgICAAAAAQD//wAA//7/AP8B/gD+/f0A/gABAAAD AgD+/f0A/wECAAIDAwD+/v4A/v7+AAABAgD9/vwA/fz7AP/+/gAB/f0A+vz7APz9/AACAwIA/f39 APj49wAEBQUABAMDAPXz9QAHBwcAAP79APr49gD9/f4ABAAJAPv7+gD//fwAEQkOAAwD+wDIv70A +/byAGJiYgAxMTEABAQDAP38/QD8/P0ACQkJAOzr7gDg394AGRkYAC0sLQDc3NwAx8bGABEQEAAd HR0A3t7eALGxsQD39fYAFRYVAMHDwADh4eIAxsTGADEyMwAmVisADw8MAMPO1AC7yNUA4ur1APHz 8wD6+PgACAr/AP8AAQD59vcAAwH/AAQFBQD4+fcA+fj0AAUC/QD/AgQAA/v0AAwJCwAQCgcAAAoJ AAMBAwAICAgA/PwEAO3w+QDu6+gAxsnuAOLf2gBDPDYAPDUwABgVEwA0LCQA6OvuAMnV3wD9/f0A +wICAAH+/wD8/f4A/wABAP8BAgD+AQEA//8DAP4AAgD+AQEA/f8CAP8AAwAAAQMA/wEEAP8A/QAA AQUAAAEDAAECBAAAAQMAAAECAAECAwD/AwQAAgUHAAEDBQACAv0A///+AAECBQACAgIAAgQAAAID BAACAgAABP3+AAACAwADBAQAAgAAAAUC/gACBQgA/AYLAPgHCQD7//8ACO3uAP7y8wD8BAMAAv8A AP/7/AAC/f0AA///AAAAAQAA6ekABP//AAEAAQD7AgEA+wMDAAD/AQD5AgIA8QkIAAATEQAJDQwA BvL0APfu8AAJExMAEB8eAAD09AD119cACfn5AAYAAQD3AQEA+wMCAAEB/wAAAAAA/v8BAAMBAQD/ //8A+f/+AAMAAAAG/wIA+AEAAPv+/gAAAgEAAwQCAAAKCAADCgwA/vb2AAXz9AAI/PwA/gIBAP4A AQAF//8AAgD/AP7/AAAAAQEAAgAAAAH/AAD+AQAA+QIFAPYCBgD7BQcAAQMEAP///wD9/P0A/P38 AP7//wD+AAAA//v5AAD+AAABAv8A+vr7APz8/AABAQAA/v7+APv8/AAB/v8AAgICAP///AD8/PoA AAICAAAB/AD7/PwAAP78AAD++gD7+voAAAAAAAAAAAAEAAD/AP//AAD+//8AAP7+AAL/AAD/AAAA /wEAAAD/AAABAP8AAAD/AP4A/wAA/wAAAf//AP/+/gACAf4AAAL+AAD/AAAAAAEAAAAAAAD/AAD/ AgAA/wAAAAD+/gD///8A//8BAAAAAAACAAAAAwIBAAAA/QD/Af4A/wACAAAAAAAAAAAAAP//AAD+ AAAC/v0AAQD/AP8AAQD+AQEAAf4AAAMB+AAGAPsAAgH/AP/9AAABAQMA+v8KAAAA/AACAP0AAf// AAAAAgD//wIAAAEBAP8AAAABAP0ABf/+AAAA/gAAAAIA/P7/AAADBgACAAAAAgAAAAAAAQABAP4A AgH/AAEA/gD/Af8A//8AAAEBAQABAAIAAAABAAAB/wAAAAIA/gD/AAAAAAD/AwIAAv4DAAQA/AAB //gAAv/+AP8AAgD+AgUA/QEFAP8AAQAAAf4A/wEAAAEB/wADAf8AAQD5AAIA/QAA/wIA/AACAAEB BAD/AQQAAQECAAIAAAAAAgEAAv/8AAMA+wAC/voA//4AAP8CAgD/AgEAAAL/AAX+AgACAP8AAgP/ AAMA/wABAP0AAgD/AP8BAAAAAQIAAAECAAEBAwADAQMA/wH/AAD//QABAAEABAAAAAAB/wAAAgAA /gEFAAD+AgAA/wEA/wEAAAEA/gAF/v0AAQD+AP//AAD/AgEAAAEDAAEBAQD+//8AAgEBAAAB/gAE /wAAAAD/AP//AgAAAAEAAAH/AAICAQD//gAAAAEDAAEAAQADAf4AAAD+AP//AQD+AQAAAAMCAAED BQABAQMAAQD+AAEA/gD8/wAA+f8CAPkBBwD8AQUAAAABAAH+/wAAAP4AAAEBAAAAAQABAP8AAAAB AAAAAQABAAIAAwH9AAgB/AAOAv4AEAgCAAUCAQAAAAEAAAD/AAEB/wD//wIAAQEAAAAHBAAA//8A /wIBAPn7/QD6+/4A/f8HAPsAAwD/AAEAAQAAAAEAAAD/AAEAAAEAAAD/AAAAAAAAAAEBAAX//gAH //sADQYBAAgFAgABAgMAAP//AAAAAAAFBAAABAAAAAEBAQD///4AAgAAAP7+AwD+AQAA/v4EAP8A AAD/AP4A/wAAAP///wAB/wAABQICAAMEAgADAgMA/wABAAICAwD//wEAAwL9AAMD/wD+AgMAAQAA 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 /gAB/wIA////AP8BAQD//f4A/wIBAP8AAAABAf4A//39AAMB/AD/Af8AAAAAAAABAQAAAAMA/gD/ AAD/AgABAAAAAP/9AAAA/QABAAEAAf//AAEA/wD+Af8AAAEAAAH/AAAC/wAAAAD/AP4CAQAAAgEA //7/AAICAQD/AP0A/wACAAD//gAB/wEAAQEAAP//AQAAAP8AAQD+AP///wD/AQEAAf7/AP8AAQAB AgAAAwD/AAD++wD/AP8A/wAAAAD+/QD5+/4A+PwFAPwBCQD8/wUA/gABAAABAAABAAQAAAABAAEA /wAAAP4A/wH/AAAAAgACAAAAB//3AAcA9wAJBPwABQMDAAAAAQABAAAAAQD/AAAAAAD/AgAA/gEA AAP//wAAAf8A/v4CAPb9AQDy/gcA9gMJAPz/AgAAAAEA/wEDAP//AgABAAAA//8AAP8BBAD//wEA BgH+AAv+9wALAPcACQL/AP8AAwD9AP8AAgD9AAABAQAAAAEA/wECAP/+AAAA/wAA/wEBAP8B/wAD AAEAAwIAAAIBAQD+/wEAAAIAAAH//gD///8AAQIBAAAAAAD//v8AAAAAAP///QD/AQAA///8AP/+ +gAB/wMAAAAAAP/+/gABAQUAAPz9AAAC/QD/AP8A/QEBAAEAAQABA/4AAf78AAEAAAD/AAAA//3+ AP/8AAAB/f4A/wECAAECAgAA//4AAQH+AAAAAAAA/v8AAQABAAID+wD+//4AAQIAAAH+AQABAAAA AQMCAAAAAAD/AQIAAv3+AAP9/gAAAP8AAgUGAP8CAwD8+/oAAP/+AP/+/wD/Af8A/v79AAEBAQAB AQEA//4AAAIC/gD///8AAQH+AAAAAAAAAP8AAwECAAAA/wACAAIAAAADAAIA/wAB/wEAA/4BAAAB AAAAAAAA/fn7APz8/AD+BAQAAQEBAAEDAgACAgIABAICAAUDAgACAAEABAYFAP8A/wAGBgYABAIA AAL+/AADAP8AAgD6AAAAAQD//wEAAP//AAH9AAD///8A/wD/AAAA+wAAAQEAAQEBAAAAAAAA/gMA AQEBAAEBAAAA/v0AAQAAAAL//wD8/f0AAQUDAAEBAQD///8A//8AAAAAAAACAQMA///+AAEBAAD/ /v0ABQQHAAkGCAAAAgEA/f/+AAIA/wD+/f4A/gIDAP7+/gAAAP4A/wD7AAAA/QACAAAA/v//AAH+ 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 /gACAgUABAQGAP3/AwD///8ABQQCAAD+/wD4+fsA/wAAAAIAAQD8/PwA/wT+AAMB/gD/AP4AAAD/ AAAAAAAEAP8AAAEBAQABAQQAAQEBAP8BAgAAAAIAAgECAAIAAAABAQAA/wIAAP8BAAABAQEAAgMC AP/+AAACAgUA//8CAAECAQABAQIAAAAAAAD//gD/AAAAAQEBAAAAAAD/AgIAAAEAAP8AAAAAAAMA AgEAAAAAAQAAAP4AAf8CAP8AAAD///8AAQICAP8BAAABAAAAAAAAAP8BAgABAAEAAf8AAAAAAAAA AAEAAAAAAAAA/wAB/v4AAAMBAAACAwD+/wQAAAD/AAEA/wABAAAAAAABAAEAAwD//wAA/wEDAP4A AAAA//8AAQEDAAD/AQD/AAEA/AABAAT//wADAP0AAAD/AP4AAgD/AQEAAAECAAAA/gABAP4AAwH/ AP/+/wAAAQAA/wEEAAIBAAACAv8A/v7+AAD/BAD/AAIA/gECAAIAAAABAAAA/wACAP4AAAD+AQUA AQECAAAAAAABAQAA/wAAAP0A/gACAgIA//8BAP8BAwAA/wAAAAAAAAIBAAAAAAAAAAABAAABBAAA AAAAAQAAAP///wABAAAAAAEDAP3+AAAAAAUAAQH8AAIAAQD/AP4AAgEAAP4AAAAAAAMAAAICAPwC AgD//wAAAAD/AP///wACAwAAAP8AAAIA/wABAAAAAQEBAAAA/wAAAP8AAQABAAD/AQABAf8AAAEA AP8AAgD9AAMA/gEAAAEAAAACAP4AAAP/AAD/AQAAAAEAAQECAAED/wAA/wAAAAABAAEBAAAAAP8A AAAAAAEBAAACAAEA/wL/AAICAQABAQEAAAIAAAEBAQACAQEAAf//APsBAQD3/QAA9v8FAPoCBQD+ /wAAAf/9AAEA/gD/AQAAAAABAAAA/wD/AP8AAP8CAAABAgADAQAACP77AAgEAQAGBQUAAwEAAP// AAAAAgIAAQACAAEAAAAAAQEAAAABAAL/+wACAAAA+//+APj8AAD8AgYA/QEEAAD+/QABAf0AAP8A AAAA/wAA//8AAQEDAP//AQABAAAACAL8AAn/9wAJAPsABwQGAAAAAAD/AP8AAAAAAAEAAAAA/wAA AQD+AAEA/wD/AP8AAQABAAIBAAACAgEA////AP8AAAABAAAAAAD/AAEAAAAAAQEAAQECAP//AAAA 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 /wEBAAAA/wAAAAAAAQAAAAH//gD+AP4AAQAAAAEBAwD/AAIAAv8EAAABAQD/Af8A/wEBAAABAQAB AAEAAQEAAAUD/wADAf8AAwIAAP3//wD9AAAA+/r+AAABAQAAAgEAAP4BAAABAQABAAAAAAABAAAB AAD/AAAA/gABAAEBAwADAv8ABwMBAP8A/gD9/QAA//8DAP8AAAAAAP8A/wAAAAEAAgAAAQAAAQAA AAEBAQD///4AAQEAAP//AAD/AQIA/wD+AAAAAgD//v8A/wH/AAABAgAA/wEAAAAAAPn8AADz/QUA 9QIKAPcABQD+Af8AAQD+AP8AAAD/AAIAAAAAAAEA/wAAAQAAAP8AAAL/AQAGAf0ACf73AAoCAQAG AwMAAAD9AAABAQD/AAEAAAD/AAAAAAAA/wAAAAD/AP8AAQD9AP8A9/wBAPP8AwD1AwkA+P8BAAEA /QAAAAAAAAACAAAAAQAAAf8AAAD/AAAAAwADAv8ABv/6AAsB+AAJA/4AAwECAP0AAAABAAEA/wAB AAD/AQAAAAEAAf//AAAAAQAAAP8AAQICAAAAAAACAgIA/f3+AAEBAAD/AP8AAgEBAAAA/wAAAQEA AQIEAAEAAQD//wAAAAD/AAEAAAADAgIAAQMEAAEC/gAAAQMAAgMCAP7//gAAAQEAAgMCAAIDAgD+ /f8AAgMDAAAAAgAAAgAAAAD/AAEBAAACAgIAAQACAAMEBQAB/QAAAAAAAAEBAQAAAAAAAQIBAAMC BAAAAAEAAgAAAAABAAD///4AAQABAAEC/gAAAAAAAgICAAAA/wADAwMA/wL+AAEEAgAC/gAAAP// AAICAgABAQEAAgIAAAD+AwACAgIAAAAAAAACAwACAgMA/v/9AAMDAgAC+/sABAQCAAH+/wD///8A AgMDAP4AAgACAQMA/v7+AAABAAABAgAACAgIAAQCAgACAgIACwsJAAIEAwD8+/wA+vv7AP7+AAD+ /wAAAP38AAEA/QD+//4A/wAAAP79/wD5+fsA/PwBAAMCAgABAf4AAP3+AAMCBAACAQAAAwMDAAAB AgD8/P0AAAECAAECAAACAAIAAQABAAEA/gACAAMAAAEAAP8BAQACAAQAAAH+AAMDAwD/AQEAAwMD AP8AAAAAAQEAAQD/AAH//gAAAQAAAAIBAAMEBAAICAcABggIAAICAgAAAP0A/wAAAP7+AQD9AP0A Af39APn5+QD+/fwAAwD/AAIDAwACAgAAAAD9AAABAAABAgIAAQACAAIDAwD9/fsAAQEAAAECAQD/ //8AAgEAAAEBAwABAQAA/wD+AP7//AD8+vkA+QICAAQFBgAB/wEAA/8BAAEBAQAJCQkA/wD/APf3 9QAAAQAA/wEAAP///wABAAIAAAAAAAECAQD/AAAAAP//AAD/AAAAAAAA/wH/AAABAQD/AgIAAgED AAAAAAAAAf8A/wAAAAAAAAAAAAAAAAAAAAAAAQD/AP4A/wAAAP8AAQADAAAAAQH/AAL/AwD8//4A /Pj4AP308gAQCwgACQkNAOHl8gDU2eYA9fb9AAQDAwD9//0AAP/+AAAAAgAAAP4A//7+AAIBAgAA AwIAAAD+AAD/AAAEBAUAAQECAAD+/gACAwQAAQMCAP0BAgD//f4AAgICAP///wD/AAAA//8AAAEC AQAB/wIAAP79AP8AAAABAwEA/wAAAP7//wACAQMAAgICAP4AAQAC/gQAAgMCAAEA/QAC/v8AAgAB AAICAgAB//8A/gEBAAIBAQD/AgIA/wAAAAMAAAANAQAAEwMCAAv/+wDo/gYA7v8BAPsDBQD/AgEA AQD/AAD//gAA/v0AAwICAAICAgD+AQIA/wH/AP4AAwAC/wEAAAIDAAABAwAA//8AAgABAAYCAAAF BQIA/wMCAPn6AAD7AAEA/v//AP8BAAABAgMAAP7+AP8A/wAAAP0AAAL/AAD/AgAA/wAAAAAAAAIC /wAAAAEA/wEBAAMBAQAB/wAA/v//APv8AQD3+v8A/QAEAAICBQAA/v8ACggCABALAwDq8wMA7unz AOfm7gAfHhQABQgAAP8AAQABAgMAAAEBAAAA/wACAgIAAgABAAAB/gACAwAAAQIBAAEAAQD+AQIA //8AAAECAQABAAEA///+AAAAAQABAQEAAAAAAP///wAAAAAAAQAAAAEAAQAA//4AAf//AP0A/wD/ //8A//7/AAEDAAAA/wAAAQD/AAEAAAABAP8A/v79AAEBAAD+/fwA//8DAAABAQD9/vwAAAIEAAP/ /wD+//8AAAIBAP7+/gD8/P0AAAD+AAQAAQD9/f0A//7+AAEABAD9/f0A/f3+AAAA/wD9/PsA/v7/ AAMC/QAA//sA/v38AAMBAAD+/gAA/v78AP0DAgAA//4A/v3/AAABAQD///8A/v38AAAAAQD9/wAA //3+AP38+wAC/gEA////APz8+wD///4AAP//APv9/gD+AAEA/v79AAD//wABAf8AAQH+AP4A/QAC AQQA/v8AAPr7/QAEA/0AAQEBAP39/QD+/v4AAwAAAP38/AD//v0AAAMDAP39/QD9/wAAAf37AP/9 +wD//fsA/vwFAP8A+gD9+/kA/fv8AAAC9wD08vAA+ff1AAQFBgD6+/0A////AAsLCgAEBAQA/v7+ AAYFBQD8AAEABgQEAAYFBQACAQQAAPwHAAYFAwACAgMAAP77AAIA/wADAP8AA/7/AAIAAgAFAgQA AgMAAAAG/AAGBgYAAQEAAAECAQABAgAACAcJACwkIAARA/YAytHfAAoHJAABAQEAExMTADExMQDG x8gAy8rLAPPz8gDc2tsADg8OACwsLAAcGxoAxsbGAO/v7wAjIyMA2NnYALy9vQDb2tkANjU1APf3 +gDz9vcAqqmmAPXy8QA9PT4A5uzwAMjR2QDV3eMA/wMGAAQF/gABAAEABQUEAAH/BQD+/v4AExAL ABUQCwAI/fMACfzwABMJBwATGxoA+fn7AAsICQAB/voA2trbAOrr6wD29vcA8/TzAPn39gAFBQUA DA0MAAUDAwDT0dQA5OHkAO3s6gDk5eIAAQIEAPj09AAPDw8AIB4YADozKQD6/wQAytbhAOrv8QDt 7+8A+vwBAAgKCwD8+QMA/QABAAgJCwACBAMAA/4MAAD+/QADCAwAAf0FAP8CAQAGCQkAAwQGAAIB AwADAgAABgkIAAEG/gACAQIABgkIAAQEBAAG/wIA//8BAAYICwABBPsAAP4AAAcIBwAFAf0ABgAD AP8DBAAEBwkAAgEBAAUCAgADBQcA/v//APQKDADxBwoA+Pb3AAX8+gAAAP8A/wAAAAEAAAABAAAA /wEAAP8AAgAB//4AAAAAAAAAAAD+AQIAAv/+AAL9/gD87e4ACO/uABsVEgD1GxgA9cjNAPnY2wAB Dg0A/zEuAAA3NAAHFhQA/fX3AAIsJwAC+/UAAQIEAP4JCQDmsLIA9e7uACdNSgD9Dw0A/ujpAAUQ EAAEJiMAARkVAPrl4wD/CgoAFD88AP75+gAAuL0ADOfpAAb+/gD2BAQA/QAAAAf9/QAAAQAAAQD/ AAAAAQAAAAAAAgAAAP0AAAD0BQcA6wgJAO0GBwD6BAQABAMDAAEAAQD9AQAAAgMDAAEFBgACBQcA AAYGAAQEBgAKCgwA/P7+AAT49wAFBAQA/vwAAAEBAAAB/wIA/f79AP79/QADAgIABAYHAAQAAgAE AfsA/AD9AP8ACgAA9wcAAAEAAAAAAAAAi4l0dgQAAQAAAQEAAAIB/wAAAP8AAQIAAAH/AQAAAQAA AQEBAP8BAQAA/wIAAQACAAAAAAAAAP4AAQL/AAACAgAA/wAA/gABAAIAAQADAP4A/wD/AAECAwAB AP8AA//+AP8BAAD9AgQAA/78ACceEwBLQTUA3N/kAMLN3ADs9PoAAQICAAD9/QADAAAAAQAAAAAA AQAA/wEAAv8AAAAA/wAAAQEAAAAAAAAAAAAB//8AAQH/AAD/AAACAQIAIhYKACwlHgDy+P4A0Nrh AO7z9QD/AAAAAAACAAgEAAAjGA8ALCUdAOTq8QDJ1t8A/AAAAAIA+wAB/wIA////APwBBQAAAQMA AP39AAEA/QAAAgMA/wAAABoVEABaTDwA+vf3AKm4yADe6PAAPjUtAEQxHwC9ydoAs8HMAPb7AAAB //8AAP79AP8BAgAAAAEAEQwFAC8kGQAaFREA4+nxAM/a5QDx9/wAAP8AAAEB/wACAwEAHhULACce GQDx9voA1N3mAPL4/QAA//8AAgD+AP8AAAD/AAIAAAEBAP/+/wADA/4AAP/9AAIAAAD+/wEA/wH/ AP4A/wD//wEAAP//AAMB/QAQCAQAKCAWAB0WDwAIBwMA/f8DAOrw9QDT2OAA7fb8APr+AgAB//wA AP8CAAAAAAACAQAAAAAAAP4BAQACAgAACQT9AB8VDgAoIhwA5uruANbf6QDz+wAAAwABAP7++gAA AwIA//8BAAD/AQD/AAAAAQIAAP/+/gABAQEA/wEAAAIBAAD+/v0AAP8AAAEAAAAB/v8A////AP4B AAD9/QAA9fwBAPYABwD4AQcA/QACAAD//QD/AAAAAAADAAAAAQABAP0AAAAAAAD/BAAAAQEABAAA AAgA+gAKAPoACAMFAAEAAAD/AAEA/wACAAAAAAAA//8AAAD+AAAAAgAAAgMA/v8BAPv8AQDx+wAA 9gEKAPgACQAAAAMA/wEAAAAAAAAAAAAAAAD/AAAAAgAAAAIAAAIBAAUA/QAG/vcACQT/AAgGBQD9 AAEA/v8AAAAA/wABAAEAAAABAAAAAQD/AAIA/wEAAP8AAQAAAAIA//8AAAD+AgD+//4AAQH/AAD/ /wD+AAEAAAABAAD9/wCvlYt0AAAgAElEQVT//v0AAAEAAAEBAgAAAP8AAAECAP///wD///8A/v7/ AP7//QD///8A//7/AP7//gD+//8AAf3+AP7+/wAAAAIA/wL/AAD+AAACAP4AAAD/AAEBAQD+/wAA /v7+AP39/QACAQEA/wH/AP//AAAAAAMA//8AAAEBAQD///8AAAEAAP///wACAQEAAP//AAD//wAA AAAA//7+AP4AAAAA//8A/wH+AP/+/wAAAAAA/wD/AP7//wACAAEAAP39AAP//wD+AAEAAv8BAP3/ AAD///8A/v/+APz9/QABAAAAAgD/AP///wAAAQIA/wD+AP4BAAD9/v4A/wAAAAL/AAD6+vwA+gD+ AAEAAAD9//wA+vr6AAH/AQAB/wEAAwICAAQBAQD/AwEAAgEEAP7+/wAAAQEA/f38AP//AQD8/P4A +v77APr6/gAA//0ABv79AAIBAgAEBAQAAwQEAP3+/gAAAQIAAgABAAAA/wAAAQAA////AAD//wD+ /wIAAAAAAP7//QACAQEAAQEAAP/9/gD9AP8AAAD/AAABAQAAAAAAAgABAAEBAAABAQAABgYEAAcH BQD/AAEA/f4AAPv7+wABAQEA/wEAAPv7/QD4+vYA+Pn3AAIAAAD/AgEAAAL/AAEBAQAAAAAA//79 AAACAAAAAAEA/v7+AP//AQD//wAA////AP//AgD/AAAA/wD9AAEA/wAAAP8AAP4CAP76/AD6//kA AgMFAAMDAwAEAwQAAwD/AAEC/wAKCgcA/v76APr6+wAAAAEA//8AAAD/AAD//wAA//4AAAIAAQD/ AAEAAAACAP///QABAQAA/wEAAAAA/wAAAAAAAAAAAAEAAAAAAQAAAAAAAAH/AQABAQEAAAD/AP8C AgAAAAAAAgEAAAAA/wD+AAAA/f//APv2+QAB+vcAEw4MAAgJEADg5fQA1NrmAPDu9AAC/wAA/f79 AP3//wD+/v8AAAD+AAEA/wAAAP8AAQD+AAD/AAD+/v4AAgMDAAEBAAD//v0AAAAAAAABAQAA//8A AP76AAABAwACAQIA/f38AP7+/wD/AQQAAgEBAAD//wD///8AAQEBAAEAAAD+//4AAAEAAAABAgD+ /wAAAf7+AAICAQD/AAAA/P8AAAAAAwACAAMA//8AAP4BAAADAP8AAf//AP3/AQAAAQIABwD/ABEB /wAPAgAA//z/AOsCAgDu/v8A/AAAAAEA/wD/AP8AAQEBAAEDAgAAAAEA///+AAD//wAAAAAAAP/9 AP///wABAAMA//8BAAMAAAAGAQAACAEAAAH+/QD6/wIA+wECAPv//AD+AAAA/wABAP//AgAA/wMA AQH+AAEAAAADAQMA/QEBAP/+/wAA/v8AAgEAAP3/AAABAP8AAgAAAP4AAAAAAAMA/P/+APf7AQD6 /gQABwYGAPv79wACAf0ACwcBAA4JBADy+PgA39zkAAgHBAAZGg8ABQX+AP79/QADAwQAAAABAP/+ /gD/AQMAAAABAP7//wADAAAA/f8AAP//AgAAAAEA/v3+AAD+/gABAQIAAQABAP//AQABAAAA//// AP/+/gAAAQIA/v//AP7/AQD+/v4AAAEBAAABAAD/AP4AAP8BAP7//gABAAAAAQEDAP//AAABAQAA AAAAAAAAAAAB//8AAAH/AAH//gAAAf8AAAAAAAD/AAD//v4AAQIDAAEA/wABAP8AAQEAAAEBAAAA AAEA////AAH//wABAAAAAwAAAP8BAAAAAQAAAgD/AP4AAAABAQEAAAAAAAAB/gAAAP8AAQD/AAD+ /wABAQEAAwQEAP/+/QD8/gEA/wEBAAICAgD9/f4AAQEBAAAAAQAAAP4AAgIAAAEBAQAAAQEAAv// AP//AQACAQIAAwECAAIDBAD+//8AAwMDAAACAwACAQIABAMBAAQCAwACAgEAAAT8AAEAAwACAgMA /wP/AP8CAQAEAwMAAQAAAAL/AAAFBAMA/gIAAAEBAAACBQUAAgMDAP4CAgD59/kA/f//APz8/QAB AgIABgYHAAIE/wAAAAAABgYFAP7+/QD8+/8AAgEEAAcHBgAKDPwACggJAP8DBwD6CQcABQQCAAMD BAD6+vwA////AAQEBQD6+/sA/f3+AAUDBAD9/fsA9/kIAAMGBAABAQIAAfb4AAMDAAAcFRMAAvz4 ANPSzwDy8fIAAwIDAOnn6AANCgoABwcHAOvr6wDExcYAGhkYADc6OQAtLC0ABwkLAMHAvwDX19cA CQkJAMXFxQDo6egA5ebmABAODgDd3NwA2djaAOLk5QAAAP4AW1tcADE0OQDF0tgAztfcAPX4+gAI CAYAAAIBAAH+AQAA/wAAAgAAABUOCQAaDgQAB/7xAAH89QAWEQ0ANTIvAAICAgDa3N0A4OPiAPj4 +QDj4+QA8/PzAAgIBwAEAgEAChERAAwLCwAMDg0ABwcJAOnq5wDs6ugAGxkWADk3NQANDxAAGRkc AA8MDAAEAQEAGhURAEI7MwAbHR4AztPXAMvR1ADo7fUA+fv7AP77+QD7+fcABQYIAAD9BQD8+fgA //8AAP0E+QAA/PcA+/n3AAECAQD+/f4A+fn2AAQDAwADAwMA/fv7APn49AAGAwAA//8FAPj4+AAB AQEA/AYDAPv6+wD6/f8ABQH+AP8DAAD5+vcA/wIFAAYDAQAA+vkA+/j3AAEG9wD4AP8A7gIFAO0G CAD3BAUADfv7AAIA/gD+AQEAAP8AAAIA/gD///8AAAAAAAAAAAAC/wAAAAEAAP0AAQABAQIABvr7 AP7R1AD/DwwADy4sABAjJgABFxwA+iPVAO7i4QD//v8AAO/xAOXJygAJ8vMAIj8/AAEXFwDz/f4A EwEDAAT29wAF7/AA+fDwAPsCAQD72twABSUjAAstKQAEDQ0A7Lu/AA0MDQAPR0QA9+3uAPn29QAP +foAAf//APEGAwAH/f4AB/39APwCAQD//wEAAAEBAAEA/wAB/wAA+wECAPEFCADpCAoA7AMDAPj8 +wAC//8A/QIDAPr+/gAC/wAABwUHAAcKDQAB/vsAAAABAP8A/wD7+vkA+ff2APsC/wD7+v0A9/f3 AAEAAQACAgEA/v39APv9/wAF/fwAAwACAP37+gABBf8AAgMEAAMFBQABAQEAAAAAAAQAAAAAAAAA AAAAAAAAAAAAAP//AAEA/wD/AAAAAAAAAAEAAQAAAQIAAAEBAAH//QABAAAA/wABAP4A/wADAP8A AAD/AAEAAAD/AP4AAAABAAABAQD///8A/wD/AAH/AAAA/wEAAAD/ABsYFAA2MCsABgUHAMvW4QD9 8/kAAQAAAP8CAwD//wAA//8AAP//AAD/AQEAAQH+AAH/AAAAAAAAAP8AAAAB/wABAAIA/wAAAAAD AgACAwQALCEVAF5MOgDk7vcA5uvrAO/y8wABAAIAAAEAAAkGAgAyJhoAYFNEAMHN2ADP2uAA+/0B AAEBAQAAAAIA/wAAAP0AAwABAAQAAgIAAAL//gD/AAAAAgAAAA4JBAAnHBQA+ff1AA0IBAACAQEA GxYPAC0hFADZ3+QABQP+AAH8BAAAAP8AAgH/AAABAAAAAAAAGRMOAFBCNAA5LyUA2+PsAJCitQDQ 3OoA/P8AAAAA/gAGBAYAKh4UAFdJOADg6fEA6O3xAPTq9AD//v0AAQAAAAAAAgD+AAMA/wD/AAEC /wD/AgAAAv8CAAMBAQD+AwAAAQEBAP/+AQABAgEAAP8AAAgFAgAkHRYAT0Q5ACUdFAAEBQMACQkL APf3+QC8xM0AssLRAOLu+QAAAQEAAQD/AAD/AQABAQEAAQH/AAkFAgAaEw8AKyEWADsuIwA0LykA ucLLAOLm7AD1+/4AAQEAAAUCAAD9AAEAAQD/AAAAAAABAgEAAAEAAP4BAQACAgIA/wD/AAIBAQAA AQEAAQEAAP///wABAf8AAgEAAAEA/gD7/v8A9v0CAPsCCAD+AAMAAAD/AAEA/gAA//8A/wH/AAAA AAABAP4AAAAAAP8AAQAB//8ABwH7AAwB+QAKBQAACAUDAAIA/gD/AQAAAf8AAAEAAAABAQEA/wAB AAEAAQD///8AAAECAPf+/QD1/AAA+wQIAP3/AwAA//0AAAEAAAD//wAA/wAAAQD/AAAAAgD/AQIA BAD/AAf/+AAK//gADQcEAAQB/wABAQMAAgIAAAEA/wD//wAAAQAAAP8AAAAAAQEAAgEAAAD/AgAB AQEA/wD/AAEA/wADAQEAAQEBAP4B/gABAQAAAAABAAADAAABAQAAAAABAAEBAQAB/wAAAQIAAP4A AQACAgIAAgICAAEBAwACAgIAAAQBAAMCAAD//wEAAwICAAMAAAAAAgIA/wMDAAABAQAC//4A//79 AAEAAwACAv8AAgICAAADAwACAf8AAQAAAP4BAQABAQIAAgEBAAEBAgABAf4AAAECAP8A/gABAAAA AQACAAEAAAADAgIA/QH/AAQCAQD9//8ABAIDAP4A/gAAAQEAAgIBAAH+/gACAgIA/wABAAECAQAC AAEAAwIDAP8AAAAAAgIAAwMCAP///gADBAMAAv/+AP7+/gADAgEAAAAAAP8C/wD/AgAAAP8CAAEA AQD+AQAAAQAAAP3+/gD3+fsA/Pv9AAYFBQAEBAQAAQIDAAABAQAA/wIAAwEBAP7+/wABAwEA/v4E AAAAAgD+/QAA+vv6AAD//AD9//wA+fr5AAQDBQD/AAIAAAH9AAICAgACAwEAAQACAAEBAQABAgEA ///+AAIDAgAC/wEAAQEBAAD//wAAAAAAAwMCAAAAAAADAwIAAP/+AAAAAQABAAEAAQEBAAICAQAF BgUACwsIAAQFBwABAAIAAwEDAAAAAAD+AAAAAAEBAP3+/gD+/P0AAQAAAAECAQABAgMAAgICAAQD AwD+/f4A/gD/AAABAQD//gAAAAAAAAMCAgABAgAAAQECAAEBAQABAQAAAAD/AAIBAQAAAAIAAAEE AAIAAAD//v0A+/n5AAIGBwABAAEAAgEDAAMEAAAEBQIA/v/+AAAA9gD9/P4A/wD/AAICBAAB//8A AQEBAAIA/wD///8AAAEBAAIBAwAAAQEAAQEBAAEBAgABAQEAAAAAAAAA/wABAQEAAAABAAAAAAAA AQEAAAEBAAEBAgABAP8AAf/+AP4AAAD9/v8A+/f3AAD39gAUEA4ACAsRAN7l8gDX3ekA8O/0AAMA /QAA//0A/f7/AP8BAwABAv8AAP4AAAIAAAAAAgEAAP//AAH//gADAQAAAgEBAP7+/gAA//4AAgMD AP//AQD+//4AAP/+AAECBAD+//8AAgD/AAABAwABAwQA/gD/AAAA/QACAwIAAQECAP8B/wACAP8A AgIDAAABAgD+/v4AAQIBAAQCAAD+AAIA/gABAAYEAQADAgEA+f38AP8BAAACAAEAAP//AP4AAQAA AQEACQD+ABAB/gAHAQAA9gIBAPMBAQD5AAIAAgD9AAAAAAABAgEA//4BAAABAgABAP4A///+AP8A AgAAAQAAAP/+AP8A/QAA/wEAAgEDAAQAAAAIAgAACAMBAPr+/gD8Av4A/gECAAEDBAAE/wEAAQIC AP8AAQD/AAEAAP8AAAAAAAAAAP4AAQD+AAH/AAABAP8AAQEBAAEAAAAA//0AAQEAAAIAAgD8//4A /P4AAPf5/AD4+/0ACwkDAP4BAQACAAAACAYFAA4J/gD4+P4A8O/yAOHi6QAOEAkAEhEJAAUD/gAB AQEAAAEAAAAAAQACAQEA/wAAAAH/AgABAQIAAwECAAEDAgACAQMAAQABAP4BAQABAf8AAgMCAAMB AgABAAAAAAD/AAAA/wAAAgEAAQABAAEAAwACAQIA/wEBAAEEAgD/AgIAAQECAAMCAgADAgEAAQEC AAICAgABAQAAAQEAAAQDAwACAgMAAgH/AP8EAgABAgMAAAICAAECBAD9AQIAAgICAAIDAgAA/wAA AQEAAAICAgD/AP8AAwIDAP///wAAAP4AAwMCAP7/AgABAP4AAgICAAD/AgACAP8AAgMBAAD+AwAC /wAAAgIDAAMCAgAAAAAABAMCAPwA/QABAv8AAQACAAEBAQABAf8AAwMBAAABAAD//wIAAAACAAMD AwAAAAAA/v//AP//AAABAAEA//7/AP78/gD9/f0A/f39AAED/wAGAwUAAv//AAEA/wAA/v4AAP7/ AP8B/gD///4A/v79AP8A/wD//wIA/wAAAP/+/QD//wIA/gD/APz+/gAF//8A/f//APf2+AD09fYA AQUFAP8AAAAEAwYABQQGAAL/AAAAAP8AAwMEAAMCAQAEAQIABQYFAP8BAgAH/ggABAYFAAICBgAA //4AAgH/AAMEBQAD/wIA//7+AAIEBAAC/wEA/wD9AAIEBAD/AQIAAPv8AAECBAAAAQMA/wH6AAQB AgASDQsA6uLZAOLh4AAoJiQACAgKAMjHxgDs6+kA8PDwAPLy8gAfHh0ANzg3ABkZGgDs6+sA09PC AMLCwgAICAgALCwsAPv7+wDv7/AAKyorAEJBQQAKCgkA4eDgABUWFAAhISEARUhLAO73/ADQ2N8A 4ujwAP4BBQADAwEA+fr7AP8AAgAFBQQADwwJABkOBAD88eMA+vv3AC4uLwA4ODkA+Pj2AMfIxwD7 +/sADA8QAPP05gACAwMACgoJABEREAAJCgoAFBQUAAcGBgDs7OwA/vz7AB8cHAAlJSYAFhgYAAoL DAAKDA4ACAkKAAYEAwD3+v4AAwMDABcRCAASDQkAGQwBAAX89QDC0t8A9PoAAP4A/gAB/vwAAf78 AP/+BAD+/v8AAAD/AAAB/gABAP0AAf//AAL/AAAB//4AAP78AAECAQACAAEAAP7+AAEA/gABAPwA AAADAAIBAQACAP8AAgD+AAMB/wAC//4AAf//AAIAAQAEAAEA/wH/AAEA/wD/AQAAAwEAAAcB/wAA AQMA9AgKAO8JCwD1BwgA/Pr4AAP+/gAAAQAAAf//AAD/AAAAAAAA/gEAAAEAAQAC/wAAAAAAAP4B /wD9/wAAA/7/APnj5gD4w8YACertAP8oJwAELisACElEAPvHyQD7/v4AB+vtAADT1AAB9vgAACor AA8KBwDt7ukAAg8UAAsdHAD7//wA/gUEAAv2+AD64uYAAAQGAAszLwAD/wAAA+HjAAX7/QABLi0A //n2APnz8wAL/v8A/wACAP4BAwAAAf8AAf//AAAAAQD/AQAA/wEAAAH//wAAAQAA+AMEAOwGBgDq BwgA8wICAPz7+gAF/v0A/wQGAPwAAQAHAwQACQgLAAcJCwD69/IA+/r5APr6+gD09PQA+/j3AAEA /gD6+vkA+fr8AAEBAQACAAAA//79APv+AAD7/PsAAgADAP789wADCPwABQUJAP39/AD///8AAAAA AAQAAAAAAQEAAAABAQAAAAAAAQACAAEAAgD/AAAAAAD/AAEBAAD/AP8AAAD/AP8BAQAA/wAAAAEC AAEAAgAC/wEAAAEAAAEAAAAAAAEAAAEBAAAAAAAAAQEA/wABAAD/AAABAP4AAAEBANrg5gCirbkA 6u3wAPDz9wABAwIAAQAAAAAAAQD//wAAAQD/AAEB/gABAAEAAAECAP8BAAAA//0AAgH/AP4AAQD+ AAEAAAACAAIA/wABAQIACAUAABAKAgDw9gQAAwICAP//AgD/AQAA/v8AAAAAAAAJBQIAEAoEAAwH AQABAAAA/gECAAAAAwAAAAUAAwD6AAQA+gD//vwA/wAAAAAAAgAA/wIAAAH/AAAA/wAAAf4AAQAA AAD/AAAA//8AAQD/AAEB/QD///4A////AP7+/QACAAAA/wD+AP8BAgACAAAAAwIAAAwIBAASCwMA MyoeAEY7LgDn68IA5e/3APsAAQAG/wEABgIBAA4IBAAMBwMAAgD+AP7+/QD///8AAAAAAP4A/wAA //wAAwD+AP3//QD+AAMA//4AAAEBAAD///4AAgEBAP/+/QABAf8A//8AAAEAAQADBAMA6O3wANvg 4gD1+PsAIRsVAE9ANABXSTwA2d/mAOXu4wD7/v4AAv//AAEAAQD+AQEAAQD+ABsZEQBMPzQAMycc AB8XDwASEAsAAv/8AAH+/AD+/gAAAAH/AAD//gD/AQEA//7/AAABAAAA/QEAAQEAAP///gD+/wIA /wAAAAD//wD//v8A/wH+AP///wD9//8A//78AP38AQD3+f4A9vwHAPgEAgD+AAEAAQD9AAH//QD/ AAEAAQD9AAH/AAAAAP4A/wECAAAAAAADAP0ACAD3AAkA9wAIAwAAAf/9AP8A/wAA/wAAAAAAAP// AQD/AP4A/wACAAEB/wAA//4A/P8AAPX7/QD6AQgA+v4AAP4A/QAC//wA/wACAAD//gABAP4AAQAB AP4AAgABAQAABwH6AA0A9gANAPkACgMJAP38/QD/AQEAAP//AAAAAAD/AAEA/wD/AAAAAAAB/wAA AAABAAAA/wAAAQEAAP//AP8BAQD//v8AAwACAAD+/gD+AQEAAQEBAP///wABAf0AAQACAAACAAD/ //8AAf4BAP8BAQD//v8A/v39AAACAAAAAAAA/v7+AAEBAQD//v8A/gD+AAAAAAD//wAAAP4AAAIB AQD+/v0A///+AAEBAQD//wAA/v7+AP3+/QD+AAEAAwIBAP7/AAABAf4AAAEAAAMCAAD/AP4AAQAA AP///gD/AAEAAQD/AAIAAAD9AAAA/f//AAL//gD//f4AAAP/AP4AAAAAAP8AAf8AAP///gD//gEA ////AP//AQD///8A/gD+AAAAAAAAAAAA/wAAAP/+/QD+/gEAAP8AAP7+/gABAQEAAAAAAAD/AQD/ //8A//79AP8AAQAAAf8AAQH/AAD+/gAAAAAA+vz8AP8BAQAEAQMAAgD/AP8B/wAAAP8AAAD/AP// /wAB/wIA////AAICAQAEBAEAAQEFAAECBQD5+f4A+Pj4AP38/gD9/f4A//4EAAMEAwAFAAYAAgIB AP//AQACAAAA/wEBAP7+/wD///8AAQEBAAIAAAAAAAAA/v7/AP7//gAB/gAAAP7/AAECAAABAQAA /wAAAAMCAwAFBAQAAgQEAP///wD//v0A/QAAAPv8/AD8AAAAAQAAAPn29wABAAEA/v/+AAEAAQD9 //8AAwAAAAACAQABAv8AAP3/AAD/AAD//gAAAgEAAP8A/wD//v8AAgICAAAA/wAAAAAAAAD/AP8A AAAAAAAAAAH/AP4AAAAC/gAA/Pn4AAH//gD6BgUAAAYGAAAA/wABAQIABQUFAAYGBwD6/fgA/v/8 AP//AgD/AAAAAQEBAP///wAAAf4AAQAAAP8B/wAAAP8AAQAAAAEAAAAA//8AAAEAAAD//wAA/gAA AP8AAAABAQD/AQEAAAEBAAIA/wAA//0AAAAAAP7+AAD7+fgAAvr1ABgTDgAJChEA3eX0ANLX5ADx 8fUAAwD+AP/+/AD9/v8A/wAAAAEB/gD//f4AAAD/AAICAAD//f8AAAABAAICBAAA//0AAP/+AAEA AAACAwQAAAD/AAD//QABAQIAAAIGAAEBAQD///4A/wABAAQBAgD///8A//7+AAAA/wABAgIA/wAA AP//AAAAAQIAAQEAAAD//QAB//8AAAIBAAIBAAD9/v4AAf8BAAAB/gD///8A/gD/AP8AAgAAAAAA /wD+AP4AAgAFAQEADf8AAA3/AAABAP8A8QAAAPkA/gABAwEAA/0AAP//AAAAAAEAAAD+AAH//gAA AP4AAAACAAECAQAAAQEAAgADAP//AQACAQIABAIAAAgEAQAJ/wMAA///APoAAAD+AP8AAgMCAAEA AwD//v8AAgH+AP8BAAAAAAAA/v4AAP3//wD/AAAAAgIBAAIB/QAAAAAAAAEBAAMCAQD+/QAAAQEA AAMA/gAEAf4AAAABAPn6/QD4+f4A/v8EAAD/AQD9AP8ABgMCAAwI/gDyBP8A+/4DAO7s9QDr6vIA DAsJAAICAgAAAQEAAP8BAAD//AAAAf0AAQD/AAAA/wAA//0AAQH/AAH+/wAAAv0AAAECAAAB/wAA AAAA//79AP/+/gABAQAAAAEAAAABAAAAAP8AAf//AAH//QABAQAAAAACAP7+/gABAAAA/gH/AP7+ /gABAAEAAgIBAP8AAAD//wAAAf//AP7+/gAAAAEAAQEBAP79AAAB//0AAgL+AP///wAA//8AAP// AP7+/wAAAP8AAf//AP7+/gD//v8A/gABAP7+/gD+/v4A/v/+AP7+/gD+/f4AAwT9AAD+AAD+/gAA /v8BAP7/AAD9/wAA/v//AAH+/wD+/v4A/f7/AP7+/QD9/f4AAQAAAAD/AQD8/PwAAQD+AP8CAgD/ /f4A///9AP79/QAAAAAA/v7/AP7/AAD+//4A////AP4A/wD+/gAA/f7/AAMCAAD///8A/v7+AAD+ /wABAP4A/P38AAICBAABAv8A/v/+AAD/AAD/Af4A///+AP7+/gD+/v4AAP7/AP/+/gD+/v0AAQIB AP7+/QADBAMACQoLAAEA/wAFAwIACAYIAP39/gAAAAAABgYEAP79/QD/A/8ABQUGAP8BAAAA/gYA BgQFAAADBAD//gQAAQH/AAMEBAAAAAEA/f7+AAMEAwABAQIA/AAAAAUFBAD+BQQA+v37AAQEBAAC AwMA/vv6ABgPCgAJAvwA7Pn0AC0tKgBEREMA9fT1AL6+vgDh4eAAGBgZADIyMgAXFxcA5+noANa+ vQDf3d4A0tLTABMTEgBZWVkAMDAwAM/Q0AAMDQ0AODc3ADc4NwDn6OkA3+DhADg2NgA2NzcACBIU AMjI1QDl7PMABAYJAP8AAAAFBQYABvz+AAICAgAYFA8AFgwDAAP37AADCgIAIB0oABkZFwDc3d0A 9/f3APX09gACBKKIxaAAACAASURBVAIA5+noAOzr7AAaGRgA/fz8AAICAgAYGRkAAgMDAPb19QAS EhIAIiMjACUmKgAGCQ0A7vL1AOjq9gD66fkA+vr7AAkC/AAQDgsAExIQABMODAAOCQIAJxwRAAI9 MwABCRIAzdnkAOvp+wD9BgcAAwYIAAADCAADBgkAAf/8AAQFBAABAAcA//7+AAQFCAABAwQABAT7 AAUFBAAEBAUA/P7/AAT8+QACBAQABAMDAAMDAwABAf8AAQMCAAH+AwAD/gIAAgQFAAAD/wADAwMA AAEDAAICBAD+A/0AAgIDAAQBAAD/AgMA8QUFAOsKCwDtCgsAEvj2AAz6/QABAAEA/wH/AP//AAD+ AQIA/wD/AAP/AAD/AAAA/wIBAAAA/wABAP8A/wEBAAQVEwADKCgA9xMSAO7r6gAH7xkAGxwbAPkH CAD47e0AC///AAwFBQD9+vQAAPL0AAUDAgD+3uAA+h0AAAkqKAADGxcABxAPAP/a3wD/5ucA+/X0 AAQeGwD+CgkABuLmAP3r7AD7srQA/QQDAAHk5wD/AAEA/gEBAAL+/gD//gAA/QECAP0BAgAAAP8A AP//AAP+/wD+AQEA8QUHAOgHCQDtBQcA+QMDAAIAAAAEAgIA/wQGAAgGBQAKAgIACAcHAP///gD7 +foA+vj4APv9/AD6+fcAAAD/AAD//wD//wAAAwQCAAEBAQAA/v4A//8CAAICAAAAAP8A///9AAAB /wAAAf8A/f78AP/+/gAAAP8AAAAAAAQAAAAA/wAAAP8AAAABAQMAAAEDAAEAAQABAAAAAAAAAP// /wAAAQEAAAEAAP///wAAAAEAAQACAAH/AQD//wAA/wD/AAEBAQD/AAEAAf8AAAAA/gABAQEAAQED AAAB/wAA//8AAP//AO7y+ADV3OUA9PX3APb5/QAGAwMAFxAMAAUC/wD39/oAAgMBAA8NBwAA/wAA 8Pb6AO3z+QD6+wEAAAAAAAD//wAAAgAAAP8BAAH+/wAAAAEA/wECAP4BAgD9AQIA/f8CAP4AAgD+ AQMA/wACAP8AAQD/AQMA/wEDAP4BAwAAAQIAAf8AAAQBAAAQCgQAEg0IAAwHAwD+AAEA9Pf8AO7x +ADy+v8AAAABAAAAAgD+AQMA/QECAP8CAAD+AP4A/gACAP0ABAD+AQIA/wABAAEBAQACAv8AAf4B AAABAQABAQEAAQD/AP7/AgDy9foA+fv2AD83MADZ3uIAt8bWAPH9BgABAAEAAAECAP4BAgAAAQEA AQH/AAAA/wABAQAABgMBAA0KBwARDQkACgUBAP7+/gD0+v8A7PH3APn6/gD9/wAAAQEAAAEBAQAC AQAA/wEBAPv9AADb4usA5evwAO3z+QD4/QIAHRHcACcdFAA3LygAFxIMAAYFAQD9+gMAAwH+AAAA AgD+AQIAAv//ABANDAATEQ4A4OLiAPXxCgAuLSsAAAACAAEBAAACAgIAAgEAAAL/AwAAAQMAAAH/ AAEBAAD///8AAQEBAP//AAABAQEAAAECAAEBAgAAAP8A/wEAAAD//wAEAwAAAQECAPz+AAD2/gMA +QQLAPoCCAD9/gIAAQD/AP8BAwD/AAEAAAAAAAEA/gD/AAMA/wEDAAAAAQAHAP0ACP/6AAoC/gAJ BQMAAwEBAAEAAQD/AAAAAAD/AAEBAAD/AAIAAAACAAIBAAAA/wAA+vn+APcABwD5Aw0A+/8FAP// AAAAAQIA/wABAAABAwAB/wAA/gEBAP8AAgAEAP4ACf/6AA4D/AAMBAUAAgIDAP4DAAABAgIAAP/9 AAEAAAACAQAAAAACAAD/AAAA/wAAAAEAAAAAAQAAAQEAAQEAAAEAAAD9Af0AAAEBAAECAgACAAIA AAIBAP7+/QABAQEAAQACAAEBAgAAAAAAAQEBAAECAQABAgIAAwMDAP4CAwACAgIAAAAAAAICAgD+ /v4AAQICAAAAAAACAQIAAAEBAAAAAAABAgIA//8AAAIDAQAA/gEAAgICAP8ABAAB/wAAAQMCAAIA /wAA/wAAAQEAAAAB/wAAAAIAAQIBAAD/AgAAAAAAAQABAAABAAAAAQIAAgABAAEDAgAB//0A/wEB AAECAQAAAAAAAQD/AAEAAQABAgEAAP8BAAECAAAB/wEAAQEBAP///wABAf4AAwMDAP3+AgABAQEA AgEBAAAAAwABAQEAAAABAAECAgD+/v4A///8AP79/AD9//4AAQEAAAEAAAAAAAEAAgEBAAICAgAA AgEAAAABAAIA/wD/AQAAAgIBAP8AAAABAgEA/f8BAAAB/wAAAAEA/wL/AAEBAQACAQMAAAABAP39 /gAAAPwAAQEAAAECAgAAAAAAAQEDAAABAwAAAQAAAQH/AAECAQD//wAAAQD/AAABAgAAAP4AAgID AP7/AAABAQAAAQIBAAEBAQABAgEABAMCAAgIBwAEBgYAAAECAAD/AAAAAAAAAAAAAAICAwD+/v4A /fv8AP79/gAEBAMAAQABAAAAAAAB/v8A/wL/AAAA/wAFAwIAAwIAAPz9/wAAAAAAAgIBAP7+/gAB AQIAAQAAAAABAAABAf8AAAAAAAEBAQD/AAEAAQAAAAEBAAAAAf8AAAD/APv6+gD4+fgAAAEBAAQD AgAA/gAAAgACAAgHBwAEAQEA9fT9AAAB/wD+//8AAAAAAP8B/gAA//8AAAD+AAEA/gD/AP8AAgAB AAIAAQACAAAAAP//AAAAAQAB/wEA/wAAAAAB/wD/AP4AAf8BAAEBAAD+AP4A/fz9AP35+wAF/PoA HBYTAA0MEQDY3+4A0dXkAO/t9AAEA/4A//36AP79AAD/AAIAAf/+AAD+/wABAP8AAAABAAAAAAAA AQEAAgEDAAIBAAD+/v8AAAAAAAECAwABAgMA//38AAD+/wACBAIA/QEDAAD+/AAAAAEAAQIFAP8A /wD//f0AAP/+AAECAwABAQEA//79AP8AAQACAQMAAAD/AP/9+wABAP4AAAEGAP/+/gD+/gAAAAAC AAEBAAD+/fwAAAADAAECAgAAAP8A////AAAB/wAEAAAACgH/AAkB/wD7//8A7v8BAPr+/gAAAP8A AAAAAAEAAQABAAEAAQEBAAAB/wAA/wAA/gEBAP8BAgABAQEAAAEAAAAAAAAEAQEACAMCAAkDBAAD /v8A/v3+AP4AAAABAgIAAwEBAP///wAAAPwA/wH/AP8BAAD+AAEAAQACAP///QD9AAEAAf4CAP4B /wAA//0AAQABAAEBAQAAAP8AAAEAAP/+/gABAP4A/wEEAPn8AAD3+gIA/wAFAAMDAwD8/PsA+gIF AAkFAAAJBwMA9/gBAPr4/QDn5e8AEA8OAA8SCQAEAgEAAf//AP///wD//wAAAAD/AAD//wAAAP8A /wD+AP8A/gD/AP4AAAABAP8A/wABAQEAAAH/AAAA/wD/AQEAAAAAAP8AAQABAAAA/wABAAH/AAAB AQEA/wD/AAEAAAABAQEAAAEAAAABAAAAAAAAAAD/AAEAAAABAQAAAAAAAAEBAQABAQEAAAEAAAIC AQABAwIAAQECAAABAQAAAAEAAP8AAAEBAgABAAEAAgECAAEB/gABAgEAAQIBAAIEAwAA/gEAAQEC AAMDAwAAAAAAAgMDAAAA/wAAAAIAAQECAAEB/wABAQAAAQEAAAEBAAD//wAAAP8AAAEAAgABAAIA AAAAAAAA/wACAQIAAP8AAAEBAQD+AQAAAP8BAAIBAQAA/wEAAv8AAP4AAAACAgIAAwUDAAEBAAAB //8AAgIDAAIEAwADAgMAAwUFAAIFBAAA//8AA//+AAIBAwADAwMAA/4EAAEA/wADAwIA//0AAAAA AQADBAMA//3+AAYEBQACAwMAAQACAAoJCQAHCgIACAkLAP/9/QAEAgEABQUFAP3+/wABAQAABAMD AP///wD///8ABQUFAAEAAAAFAP8AAQMCAP4CBAD//gMAAf//AAIDAgAAAAAAAv4BAAUFBAD+Af0A +f79AAMEAgADAQAABQMCAAUDAgACAwIAAAcFACEZEQAF/vgA7+zoAB4tKwApKSgA+Pf5ANbW1gDf 398AFhYWAAsLCwDDw8MA3+HgACMiIwAdHR4A2dnaADEyMwAvLy4A+fr4AN/g4QAHBgcAEA8OAOjo 6AC7vL4Avby7AFlUUQAHCAoA3uPpAM7X3gDw9PkA/v8BAAAA/gD//gEAAQAAABUPCgAdFAoA9evj AAH99gBAQD4ADQwNANTV1gDd3N4AISAgAB8fGwDj4+UA6+npAAcHBgAGBgcABwwNAAwMDAADBAMA +Pn5ABwcHQAjJicABQkOAN7r9ADg5NwA3N/kAO/z+AD9AggA9Pb1AAoB+AAXFRUAGRcWABwWEAAm HRQAIR0WABsbGQBABA8AAQEDAMTw6gDx8P0A+fv+AAMA/AD7/PwAAQD+AP/7/gAA/P0A+vv9AAEF /gAC//4A+vz+AAAA/AADBfwA+/z+APr7/wAH/P8AAAD9APv7+wAAAAAA+wf+APr7/AD8/P8A/fz+ AP///wD6+/wAAgH/APz9/QD6/fwA/Pz9AP37/AD8BAMA9QEBAOkHCADpCg0AFfb2AAj7+QAF//8A Af8AAP4A/wD+AAAAAQAAAAAA/wD/AQEA/gAAAAAAAQACAP4A/AQCAAQbGQAIOzkAAh0bAAvx8QAA DQsABeXnAAXh4gAC9fUAABwcAAIEBQD0+/oA/uHjAAHxDgAE1dkA7+PpABElJQAACAUA9dfaAP7N 0QD+7OwAA/DwAPq1uQD9BAQA/+LkAP3x8wD2tLkA+AMCAAX0+AD+AQIA/gEBAAX//gABAP8A/QAB AP//AAD/AQAAAv/+AAL//wD0AwUA6AgJAOQJCgDtBAQA9/3+AP7+/gAABQYABQgJAAQCBQAD/PsA +vj3APv9/QD29fQA/fv7AP7//gD+/P0ABAQDAAEBBAABAv4AAQD/AAEBAAD///0AAAH+AAH//wD/ /wAA/v39AAH//gD+/P0A/P/5AP77+QAA//8AAAAAAAQAAAAA///+AAAB/wAAAQAAAf//AAABAQAB AQAAAAEAAP4AAAAB//8AAAAAAAAAAAABAP8AAAD+AAAB/wD/AAAAAAABAP8A/wACAf8AAAAAAAAA AQAAAQAAAQAAAAAAAQAAAAMAAf/8ACUdFwBHPzgAz9PXAMXP3AAGBgMATD8wABcOBQDo6e0ABwsO ACAcFwAFAv4A2uPpALzJ2ADc5e4A/f3+AAEA/gD/AP4AAAABAAEBAQD///4A/wEDAP8BAgABAQAA BAL+AAYC/QD/AgIA/wH/AAYCAAADAv8A/gEAAP0AAQD/AP8AA//7ABMMBQBDMB4AKispAA4NDAAB AQAA7e3vAMrR2ADM2eYA8Pb6AP//AQAAAAEAAAABAP8AAQAAAAAAAAH/AAIAAAAA/wAA/wEBAAEA AAAC//4AAQD/AP3/AQAAAAAAAgD+AP8AAADu9f4AxsnNADk4NgBEOi8A2+HoANDh8wAAAP8A/gEB AP4AAQD+AP8A////AP4AAAAEAP4AIRYOADcuJQAmIiAACQgFAAIA/gDu8PQAzNXfAM7W3gDs8/sA /v8CAP4AAAACAAAA/wAAAPv//wDu9PcA8fX4AP0CBgD/AQEA+/3/APb6AADx9foA7/H0APv7/AAA //8A/gABAP8AAQABAAAAAP8AAOTo7QCuusYA9/LsAEA1LQAlKCoAAAD/AAD//wD//wAA/wD/AP7+ /QAAAQMAAAD/AP///wD//wAAAAL/AP///wAAAAAA//7+AAICAQD//v4AAQEBAAD//wD/AQAA+/8A APj9AADzAAkA9wIKAPsABQAAAP8AAQABAP4ABAAAAQIAAAD+AP8AAQD/AAIAAAEDAAMB/gAJ//0A CP77AAwGBAACAfsAAP/+AP4AAQD+AQEAAQAAAAIAAAD//wEAAAH/AP///gD/AAIA8foAAPQACgD2 AgoA/AACAAAA/gD/AAEAAAABAAD/AAD+AgMAAAABAAEBAQAGAPwAB/75AAcE/gAEBAYA+wADAP4A AAACAQEA/v//AAIAAQAB//8AAQEBAP8BAQD/AAIAAAABAP8A/gACAQIAAAD/AAH/AQD/AP4A/gEB AAD/AQAAAAIAAf//AAEBAQABAAIA/wABAAAAAAAAAAAAAAAAAP7//wD///8AAAEAAAAAAAD9//8A ////AAMAAQAAAAIA/gACAAAA/wABAQAAAf//AAEAAAAAAf8AAQEBAAAAAAAAAP8AAP/+AAEAAgD/ AP8A//8BAAEA/wAAAP8AAAAAAAAAAgAAAAAA//8AAP///wABAQEA/wD/AP//AAAEAwIAAP7+AAD/ AQAAAAEA////AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAQD/AAEBAQD//gAAAP4A AAEAAAAB/wAA/wD/AAD/AAAA/wEAAAEBAP8AAAD///8A/f39AP/9/AAA//4A/wEAAP0AAAAD/v0A AP8AAAEFBQABAAAA/wD+AAD/AAAB//8A/v/+AP7+/QAA/gIA/v//APv8/AAA//8A+/39AAEAAAD9 /PsA/fz9AAAAAAD+/v4AAAAAAAQEBAABAAAAAAD/AP///gAAAAAAAP//AAEBAwAAAAAAAAAAAAD+ /gAAAf8A///+AAAA/wABAAEAAQEAAAEAAAABAAAABQQEAAcHBwABAgIAAwAAAP7//wABAQEAAQEB AAD/AAD+/PoA/fz9AP///gAAAAMAAAAAAAAAAAD/AP4A/f79AP7+AgAEAwMAAv8BAP38+wD///4A AQACAAAB/wABAAAAAAD+AAD/AAAAAAEAAQAAAAABAQAA/wEAAAIAAAAA/wAA/wAAAgABAP3+/gD6 +fkAAQEBAAEHBwABAQYAAgAAAAMEAgAEAQYA+voFAPz8/QAA/wAAAP//AAAB/wAC/wAAAf//AP/+ /wABAgAA////AP///gD/AAEAAAAAAP//AAADAQAAAAD/AAAA/wABAAAAAgAAAP4AAgD9/f8A/fj3 AAoB/wAYFxEAEA8VANng7QDQ1uIA7e7zAAIBAQAA/v0A/f3/AP//AgACAP8A/v/+AP8BBAACAAIA AP/+AP7+AAABAQMAAgICAAH//gAAAAAAAAECAP//AAD9/PwAAP7+AAAAAQD+/wAA/f79AAH//gAC AwQAAgEDAP7+/AAA//4AAwECAAEDBAAAAP4AAAEAAAIBAgABAQMAAAD+AAEA/wABAwIAAAIDAAD+ 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 BPz8AP0AAgDwAAoA9QIHAAf+9wAC/vsA/gABAPoCBwD8AAQAAwL9AP4AAQD9AQUAAQD+APH/+wAE //0A+QIDAPoABQACAPoABf/6AAD//QD+/wQA/gEHAPwBBAD3AggAAAD+APv+/gD9//4ABf78AAT+ +gD/AQEA//8GAPoBBAD+AQoAAAMHAPr+/AD9//oACfv6AAgBAAACAwAA/wEBAAMAAQAB//8AAQEA AAMEAQAFBAMABP3+AAMBAQACAgEA/f4CAAUCAgACAwMAAgIDAAAAAAAAAQEA/wAAAAIBAQACAgEA /gIBAAMCAgAB/QAABAQDAAD8/wAFAwMAAAEAAP4A/gABAgIA/wAAAAH/AAACAwEAAQICAAEB/wAB AAEAAf//AAD/AAADAwEAAf4CAAECAgAC/wIAAQICAP8EAwD8/QIA/fz+AP/+/gD9//4AAP/+AAD/ AQAB//0A/gECAP///wAAAAAAAQIDAP/+/AAC/gIAAAEBAAAAAAD+/v4AAgICAP79AgAAAP8AAQEB AAEBAQD9/f8AAQMCAAECAAD9/AEA/v//AAMAAAAAAQEAAAIAAAMBAwADAwMAAwIBAP8A/wACAgEA /P37AAEAAQACAgQA/v7+AAEDAgD//QAAAQEBAAEBAQABAQEAAAEBAAEBAAAAAAAAAgACAP8BAAAA AgEAAAAAAAEBAQACAgIAAQEBAAH//gAAAQEAAQEBAAECAgABAQEA/wD/AAEBAQABAgEAAAIBAAEB AgAC/wAAAAAAAP39/gD+/f8AAgEBAAABAAAAAAEAAAABAAAA/wAAAQEAAAABAAEBAAAA//8AAAAA AAAA/wD/AAAA/v8BAP8BAAABAQEABQMDAP39/gD/AAEA/wEBAP4BAQACAAEAAAABAAEAAAAA/wAA AAIBAAIBAAAA/wEA//4BAAAB/wABAAEAAAD/AAABAgD9AP4A///+AP3//gD//gAAAQACAAIBAAAB AgEAAf4AAP8AAAAA/wAAAQABAAEBAQD//wAA/Pz8APn5+wAD/P8AAQEBAAIA/wABAPsAAPr6AAP9 +gAMDg4ACQwOAOvx+wDLz9sA5OXrAP7+AAAA/vwA+//+APr9/QAAAAIAAwH/AP7+/gABAQMA/wD/ AAH+/AAAAAAAAAEEAP8A/AD+/PoAAv/9AAECBQD8/wEAAP/9AAL//gD///8AAgECAP37/AABAIMr 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 9ff5APb29wDo5uYA7vTzAA4MCwAMDAwAAAD/APf39QAIBwEACgkKAPP8/ADy6eMACAsJAA8QDAAB AgMA/v39AAH//gD/AQAA/Pz8AAIC/wACAQAA/f38AP8AAAACAwAA//z8AP4A/wABBAYA/v39AAD9 AAAABAMA/Pz8AAAA/wADAwMA/f3+AP79/gABAP8A/v38AP//AAD//f4AAP78AAD+/gD/AgEA/f// AP7+/QD/Av8AAQEBAP79/QABAgEAAQH9AP7+/gAA//8AAwQEAP79+wAA/f4AAP4DAAL/AQD6+vkA AQYHAP8A/wD6+/wA/v8CAP79/QACAgMAAQMEAP0A+wACAAAAAQADAAH+/wAB/f8A/f3/AAL+/QD8 /PwAAwQEAP8BAQD8/PsAAgEBAAEAAwD//v4A////AAD9AAAA//8A/f/+AAL//wD/AAAA/f37APkA AQD9//oA+fn4AAAB/wADAwIA/f//AAIAAQADAwIAAAYEAP3+/wADBAIABAADAAD9BgAEBQMAAAME AP/+/wABAAEABAQDAP7//wD9/vwABQQBAAMAAwD6+f0ABgUDAAP/AQD9+QQACggGAAgFAQAJBQMA DwwKAAwKBwAUExMAIiIhALOzsQC7urkA9/f4ADU3OABFRUYA+Pf1AMTFwwDn5+gAoaGhAPb29gDe 398A9vX2ANrY1wAICQkA+Pv9APv7/ABAPDkAHBwbAPf4+wDs7/MA+f0BAAAFBgADAf4A/wMBABcW GAAE+O8A+Pj4ADg4OAAfHx8A1tfXAODf3wABAQIAGhoYANDQ0AACBAQAISIkAOLg4QACAgIA///9 APn5+gAeHSEACw4PAOPc4QDy+fsABAgKAP7+/AACAwYAAgcKAA8JCQAdDgEADgoEAComJQAhHyAA 8vLyAP7/AQDe3uAA//7/ACIkJQASExMABgcIABQUFQAOERQA2ePsAMzZ5QDs8vUA8+3sAPLx8QAI EAQA8vb8AOvm9gDm5uoA5PD5ADIoIAA2MzEA+QEIAM/Y4gD+/PsABAcDAAUHCQAI/gUA+wMFAAMG CAABBAQAB/0CAAEBAwADCAkAA/8DAAT+/wAGCAoAAgH/AP8AAgACAwQAAwcJAAQBAgD9AQEABQYI AAEB/wAE/A8ABAYFAAMEBwAA//4AAgYJAAIECAAAAwQA+AUMAOgN/QDVBgkA/QgKACfs5wAZ9/IA CP39AP4BAAD9AAEA/AECAAABAQAAAAAAAv//AAAAAAAB//8AAgAAAAD/AAAA//4AAP//AAIBAAAA /wAAAQD9AAD/AAAAAAAAAAD9AP/9AAABAAEAAAEBAP0BAQD/AAAA/QEBAP4AAQD+AAIA/AAAAAQC /wAE/f8AAgD8AP8BAADwCQoA5AwOANkMDwDYEBEA6woMAPr6+AAD//4AAgQEAAMHCAAEBgYA/fz7 APr6+wD9/gEAAgEBAAMBAgD+AQAA/gH+AAIBAgABAP8A//8AAAABAgABAgIAAQABAAAAAAADAwMA AQECAAEB+gD/Av8AAQICAAMDBAAA/wIAAQECAAACAgD/Af4AAQMCAAIAAgAA/f4AAP39AAEBAQD/ AP8ABAAAAQD/AQAAAP//AP8A/wD///8A////AP8CAAAAAQAAAP7/AP8AAAD/Af8AAgAAAAH//wD+ //8AAgL/AP7+AgAAAf4AAAABAPwCAQAA//8A///+AAEB/wD/AQEAAAAAAP///QAAAAAA1+DsANjg 6gACAgMA//4AAAD6+gCywdAAAf/+AAECAAD9/wAA///+AOnv+gC1xtQA/v7/AAECAwD+AAIA/wAA AAD/AAD9//8A/v8BAP79/ADW4+4A1uLsAAAAAgD/AQEAAAACAP/+/wAAAP8A9vkAAM/d6QDS3+oA /wAAAP8BBAD+AAEA4u30AOTB1AABANIAAAD/AP//AAAAAAEAAADdAAAAAAABAQEA6O30ALTC0AD/ //8AAgMDAP7//wDK1dwAzNUAAAEBAwD+AQQAAAD/AAAAAAD/AAIAAAD/AAD/AADp8fgAucnYAAID AgD7/P4ABAUFAP8AAAD+/wEAAQADAPP5/gDE0+IAw9HgAAACAgAAAQIAAQH/AP8BAwDr9gAAvczd AALM3AABAQAA/QAAAP8BAwD+AAEAAQEEAAEAAADu9v4Avs7dAAEBAAD///8AAAEBANXf6ADV3+YA ////AAECAwD//v8AAgIDAP7+AAAAAQMAAgH+APP3/QDE0NsAAAH+AAAAAgD/AAEAAwH+AAEBAQD/ AgQA2uPsANrk6wD+/v4AAwMGAAYBAAADAv4A/QMDAAEDAwAC//4AAP/+AAAA/wACAgEAAAEDAAIB AAD//v4AAQICAAL/AAABAAAAAf8AAAEBAAD9/f0A/wEAAAgB8wACAP4ABP/7AAYC/gAFAgAA/P/8 AAf+9wAHAfoA/wD9AAACAAADAv8AB/74AAQB/QAFAPoABAH/AP///QAAAQYA/gEBAAD//wADAPkA BgD/AP4AAAAA/QIAAgH/APz+9wAFBQYAAAEDAP8AAAAE/gEABAD8AAEB+wAG//4ABP8AAAH9AAD/ /wAAAgQEAAX//wAK//4ACgL/AP3/AQADAwAA/f3/AAAC/gABAf4AA/8AAAH/+wAAAP0A/wIDAP0B BAABBAEA/v7/AAECAAAG/vwAAwH7AAT++gAE/v4ABwECAP0ABAD/AgMAAP8AAP8C/wABAf8AAgD/ AAH//gD4/P0A+//8APz9/wABAAAA/wAAAAACAAABAv8AAQH/AAEC/wD/Af8AAP8AAAAAAAAAAAAA AQEAAAAAAAD///8A////AP8A/QAAAAEAAP8AAAH//wABBAEAAv8AAAAA/gAA/wEA//7/AP8BAAAA AP8A////AAAAAQD/Af8AAP8AAP///QAAAP4AAgAAAPz+/wADAQAAAQD/AP4A/gAA/QAA//7+AAEA AAD///0A//8BAP//AQABAv0AAP8AAP38/gABBQIA/P//AAD9/QABAAAA/v//AP8AAQABAQEAAQIA AP3+/wAAAAAAAAD/AAQAAQADAQIAAQD/AAMDAgADAgMAAwUCAAH+/gAA/wEAAf7+AP///wD9AP8A /v38AP39/QD+/v4A/v8BAAIDAgABAAEA+gX6AAAA/wADAwQABQYGAAEAAAADAwMA/v7+AP8AAAD+ AP8A////AAEBAQABAQAAAv8AAAEAAAD/AP8AAP8AAP///wABAP4A////AP7/AAACAAAA//7/AP/+ /wD/AQAAAP7/AP7+/QABAQIA////AP79/QAA//8A//4AAP39/wD+Af4A/v4BAAUCAwD+/wAAAAH/ AP///wAAAAAAAAABAP8BAQAB/wAA/AD+AAD/AQAEAAIAAQABAAEAAQD+AP8A/wAAAAAA/wAB//8A AQAAAP8AAQD//gAAAgD+AAAAAQAAAAAAAQEBAP//AQD9/v4AAgICAP0A/wACAQMAAgIEAAAAAAD+ /v4AAgECAP/+/wD//v8A/wIBAPv8/AD8+fcABAcHAAL9/AAB/wUA/wD/AP7//wD/AP8AAAECAAH/ AAAAAAAAAgEDAAIDAwACAQAA/QABAP4A/wADAP0A/v3+AAICAgAEAwEA//4AAAEA/gABAf4ABAEA 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 AAAC//8AAf/+AAEBAQAB//8AAgEAAP///QD+AwcA/v8CAAMAAAABAP0AAf//AAAA/wAAAP8A/wIB AP3/BAD/AgUAAv/9AAIA/gADAAAA/gABAP0BBAABAf8AAP//AAEBAQABAAAA//79AAEB/gABAP8A /wACAP0CBgD/AP8A/wD/AAEA/wAAAAIA/QECAAMA/wAEAP8AAAD9AAABAQAAAAAAAQD/AAD/AAD+ AQMA/AEEAAH/AQAAAfsAAAAAAAIAAAABAP8AAAH+AP8AAgD//wAA/wECAAIBAAACAP0AAP/+AAAA AgD+AAQA/wICAAH/AAAAAP0A/wD/AAAAAAABAP8AAP/+AAD//gD+AAUA/gAEAAH/AAABAP0AAQAB AP7/AAD/AQYA/wAAAAL//wAB//4A//8BAP/+/AACAQAAAQH+AP4AAwD+AQMA//8DAAEBAAAB//4A /wD/AAD/AAD///8AAQH/AAD/AAAAAP8AAAD8AAL+/AAE/wUA/f/9AAD9AQAAAP8AAP8AAP4A/wD/ /wAA/v3/AAICAQD+/wIAAgEBAP///gADAAEAAP78AAD//gD4+wEA/wACAAEB9wD/AQEA/QEAAPf7 /gD3AAAA/QABAP8B+wABAAAAAQAAAAAAAQAA/vkAA/79AAIB/wD8//0A/gIDAAD+/QAA/v4AAAAA AAD//gD/AAAAAgD/AAH/AQD+AP8AAQEAAAUA/QAD/PsA/f//AAAAAQD+AQIAAf8AAAAB/wD5//8A +/7+AAEB/wD+/v4AAAMEAP4BAwD+/wEAA/v3AAD9/QACAAQA/f79AAP/AgD//gAA/wEBAP8AAAAC Af0AAv/9AAD/+wAAAAMAAP78AAICAQAC/v4ABgMDAP7//AAAAAEAAgD/AAAA+wABAAIA/wAAAAIA AgAAAAAAAgEBAAAA/gD5/f4A/v39AAMDAwABAQIAAAAAAAEAAgABAQIA/wEAAP///wAAAAAAAAEA AAEAAQAA/wEAAAH/AAEBAQACAgIAAQEBAAIBAQACAQIA/gH+AAEB/wACAQEA/gAAAAEBAQAAAQAA AQICAAAAAAABAQAAAAABAAEAAAABAAAAAAEAAAICAQAAAAAAAQEBAAIB/wABAf8AAQAAAAEAAQAB AQAA/gEBAAICAQD+/gEAAgIBAAD/AAABAQAAAgEBAP8DAAAFAgMAAAH8AAMBBAAAAAAAAQH9AAIC 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 /wQA/wD/AAEA/gAAAAEA/wECAP4CBAD/AAAAAP8AAAIA/wAB//4AAQEAAAAA/wACAP0A//78AAAE AwD9AAQA/gIDAAEAAAAAAf4AAwAAAAEA/wAA/wAAAAAAAAEB/wAB//4AAAD/AP8B/wABAQIAAv// AAAA/wAAAAAA/wEBAP4BAgAAAQAA/QIAAAH//wD///4ABQQEAAcEAwAAAP8AAgABAPj5+wACAP0A A//8AAYCAwAHCAMAAgICAPr9AAD7/P4A//8BAAH+/wABAfwAAQD+AAL//wAA//4AAf8AAAAAAwD9 AAEAAf7+AAIA/QAAAPwAAAAAAAIBBAAAAAAAAP8AAP8BAAD/AAAA/wEAAP8AAQD+//4AAP8AAP// /wD+/v8AAf7/AP8AAAAB/wEAAAEBAAAAAQAAAAAA/v7/AP8B/wD//v4AAAAAAP79/QD+AgMA/v79 AP4AAAADAQEA//8AAAECAQD/AAAAAf4AAAAAAAACAgEAAP7+AAAAAAAAAgAAAP7+AP8CBAD+/gAA AAL/AP7//gAA//8AAv8AAP///wABAP8A//7+AP0A/gD+//8AAAABAAIAAAD/AAEA/f//AP/9/AD/ AgAA//39AP4CAQABAgEA////AAD//gD+AAEAAP4AAP/+/gAAAP8AAf8AAP4AAQD/AQEA/v7+AP8E AAD8/P0AAwMAAAEBAQAAAQEA//8BAP///QABAgIAAgICAAQDBAD/A/8A///+AAD/AAADAgMAAAD+ AP38+wD7+/sA/v7+AAMEAwADAwQAAgEBAAUFAQADAAQA/wEBAAEBAgAAAP8AAAAAAAAAAAABAQEA AAAAAAECAAABAQEAAQEBAAEAAQAAAQAA/gD/APz9+gAAAAAAAwMCAP/+/wAA/wAAAwECAP8CAgAB AQIAAgICAAMDBAAAAP4AAQH/AAABAAABAgAAAgECAP8BAQABAAAAAgABAP8BAgACAgIAAAABAAD/ /wD9/f0AAQEBAAMDAwD+/P4A/v/+AAEBAAABAAAAAAACAAAAAQABAQEAAAEBAAAA/wD/AAEAAAEB AAMCAgD+//4AAP//AAH//wAA//8A/fv8AAL//gD+/fwA/gL+AP/+/gD///8AAPz8AAP+/wAEBQUA //z8APH3+QAG8PIAGBMQAAMC/wD//wAAAAMBAAEBAQACAf8AAQICAAEBAgAA/wAAAgEAAP8BAQD/ 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 AAABAP8AAQAAAAAAAAAAAP8AAQH+AAIBAAD/AP8AAQAAAAAAAAD///8AAP8AAP8BAQD/AAAAAAEA AAEBAAAA//8AAQABAAAA/wAAAQAAAQIBAAD9/gD/AAMAAAABAAAAAQACAAAAAP8AAAAB/gAA//4A AAEBAAAAAAD/AAIAAAECAAEAAAAA//wAAgMCAAQCAwAHBQQAFxAMACIdFwAHBwUA2N7lAOLo7wD+ /wAAAAD/AP4AAQD/AQIAAf//AAIA/gABAP8A/wABAAEA/wAB/wAAAAD/AAH/AAD/AAEAAQABAP8A AAD//wAA/QAAAAQBAgAA/wAAAQABAAAAAAABAP4A/wD+AAAAAwAA//4AAv79AAAB/wAAAP8AAP8B AAABAgAAAQMA/wABAAD//wABAP0AAf/9AAAA/wAAAP8AAQEAAAEAAQD+AAEA/v//AAIB/wABAAAA AAEBAP4AAAABAAAA/wD/AAIA/gAAAP8AAv//AAD//QACAAEAAP8AAP8A/wAAAgIA/gAAAAEA/wAA /wAAAAEBAP8AAAD/AP4AAf//AAH/AQABAAEAAwD/AAAA+wADAQEA///+AAEAAgABAP4AAAAEAAAB AQADAwEADAkDABEMBgD6/gEABwQBAAEA/QACAAAAAgH+AP8AAAD9AQAA/wEAAAAAAwAB/wAAAAAB AAEAAAABAQAA/wABAAAA/wACAAAAAv//AP8A/QACAgEA/v7/AAIBAAD+/wAAAv8AAP8BAAAAAQEA /wACAAABAAAAAAAAAQD/AAEBAQD//wIAAQAAAAQBAwAEAgAA/v7/AAAB/QAAAgIA//8BAAAAAQAB /wIAAQEBAAABAAD+AgAABAQCAAoHBQANCgcACAcFAAMDAgAAAQMAAQL/AAUFAwAPCwYAEQwGAAoI BAAFAwEAAgEAAP3/AwABAP4AAAL/AAEB/wABAP0ABAABAP0A/wABAAAAAQICAAAAAAAAAQIA/wEB AAIA/QAAAQAAAQABAAL//wABAAAA/gICAP8BAgABAQAAAgD/AAEBAQAAAQAAAQIAAAH+AQABAQIA AAEBAP8B/wAAAAAAAAAAAP8BAAD/AQAA/wIAAP/+AAAAAQEAAQEBAAAAAgAA/wEAAAAAAAEAAAAA /wAAAQEAAP8A/wD/AAAAAQEBAAACAgD/AAEA////AP8AAQAAAAAAAf8AAAIAAQACAAEAAAAAAP8A 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 AwIA/f38APb3+gDx8fUABREEAAUFAgD+//8A/wADAAIBAQAA/wAA/gAAAAABAQAA//8AAAEAAP4B AQAB/wEA////AAICAAD/AP8A/wAAAAH//wAAAAAA/v4AAAEBAQD/AP8AAP7/AP8AAAAAAAAAAP7/ AP8A/QAAAAAAAAECAAAAAQAA/wEA//8AAAEBAAAA/wAA/v7/AAEAAAAB//8AAAAAAAACAQD9/QAA /wH/AAEAAAD/AP8AAAICAP/+/wAB/wAAAAEBAP0BAQABAQEAAf7/AAEAAAAA//8AAAL/AAEA/wAA /wEA/v/+AAL/AgABAQEA/P7+AAD//wAB/wAAAQH+AAAAAAAA//4AAAAAAP8BAQD///8A/f78AP7/ /wD9AP8A/v//AP4A/wD+//8A/v4AAAAAAAD+//8A//7+AP///gAB//8A/v7/AP///wD///8A//8C AP7//QABAgAABAH/AAQAAAAA//wA+/r6APH39wDw8fQA7PHzAPL1+QD6/P0A/f4BAAUHCgAJBgcA CQQCAAYEBAAHBAQABAP/AAMCAQADAgEAAwEBAAIA/gAA//4A/vz8APr6/QD8/f0AAv//AAMC/gAE Af8AAP//AP//AAD9AP4A/v38AP3+/wD//wEA////AP///gD/Af8A+/4CAPv8AAD7/QEAAP/+AAD/ /QADAQIABAP3AAQHCAAKCwsAAgEBAO3t7gD5+/oA9fb3APQWEwAVEw4ADgoGAAgEAgACAQEAFBER AA0sDgAbFxsA19vaAOXo7QD/AggAERUUABMTEQD5/v4A9eL3AP///wACAgUAAQEAAAEBAwABAAAA AgIFAAACAwABAQQAAAECAP4AAQABAgIAAwMBAP///wABAQIAAQECAAECAAACAgMAAgL/AAAA/gAB AQIAAgICAAAAAAABAgMAAP38AAICAwABAQIAAQEBAP7+/wABAAEAAP8AAAD/AAD/AAAA/wEBAAAA AQD///8AAAD/AAEBAAD+/v4AAP4AAP//AAD+//0A///9AP7+/wD+/wAA/gACAAEDAgAEBAQA///+ AAAAAwACAgQAAQH8AAEEBQAGBwkAAgMDAAL//gACAQMAAQMDAAEDAwABBP8AAQD/AAICAwACAv0A ////AAECAgACAwMA/wAAAAICAwD+/v4AAgMDAAIDAQAEAwEAAgACpxLliwAAIABJREFUAAD+AAD/ //8AAP//AP///wD+/v8AAAABAAD/AAD+//8AAQAAAP8A/wD//v0A/P0CAP38/QAAAAAAAQL/AAUD AgAGAgEABQMCAPr/AgAAAAQABQQBAAD9AAD+BwYA6+/wAMrQ1wD+/fwA//8AAPf19AD4/gcAAfsD ABoVGQAOCwkA7vkAAPXl7ADp7fAA+Pn5AP39/AABAREABgYHAAkKCwBaWlsAKioqAAsJBwAAAQIA /wADAAwMDAD39fIA6uvrAAD+BQAEAwQAAgECAAIB/wAA//8ABAD/ADMxLwAPCgYA7uvrAM/S0gDo 6OYACQkJAElKSQDr6+0A2NjZALW1tgD19fMA7/DyAMrKywDg4N8AFRYWAAQFBwD9/wAA+/3/AP79 /AAA/v0AAQEAAAMA/QAIA/4ADQoFAPz7+gD09vkACAgKAOLh4AD39/cACAsNAPv9/AAGBgUAGhkb ABAUGQDmzd8A9vf3AAYHCwAJBAIAAQYBAP//AAALBP4A+gQAAAEFAwAMBQAAAQH+APoE/wAEBAEA /QP+APj+/AD8/PwABf37APr48wD79vsACQYFAAgCBAD8BPsA/P77AAgC/QD6/PsA+/r3AAMDBAD9 +wIA/fv7APz+AgD8BfwAAf77APr4+AAA/wEA/AMCAPr7+gD8/PsA+/z4AAD/AgD6+vgAAP8GAAMC BgD7+/kAAPr5AP/+AgD9/v8A/Pn4AP8BAAACAQMA/gL/APv8+wADAf4ABQH/AP38/AD9AgAA9gMB APf/AQD6BgYA5wgGAAr+/gAGBQcADfv6ABQAAAAM/foAAvj3AAQA/wAICAoA/Pv7APz9/gD9BQUA +gUFAPcBAAD3AQMA/AcKAPgCAQDv/v8A/AgLAAILCgD3/fwA+v8AAAP8/QAC//0AAPz8AP3/AAD/ /f8A+/3+AP77+wD//gAA/gACAAAA/gAAAgEAAAECAPz7/AD6+fgA/vz5APn6+wD/AwUABQQEAAEG BgABAAAAAP//AP37/QD8+/oA/wEDAAACBgAEBAIAAgIBAAD//AD6+PkAAgMDAAABAQAAAAEAAQEC AAEAAgD/AAEAAP/+AAAAAAACAQEAAAMDAAUFAwD+AQEA/v/+AAAAAAAAAAAABAAAAAABAAIA//8C AAIBAwABAAEA/wEAAAAAAQAAAf4A///+AAEBAwABAAIAAQH/AAABAAABAAEAAAECAAECAAAAAgEA AP//AAEBAQAAAgEAAP4CAAAAAAABAQEAAgAAAP8AAAAAAQMA/wABAAABAgD/AQIA/wH/AP8AAwD/ Af0AAgD/AAABAQD/AwAAAQD/AAD//gABAf4AAAAAAP8AAAAAAQIAAAECAP///wD/AAAAAQAEAAAB /wABAQEAAP//AAAA/wD+AAAAAAABAAABAgD/AQEAAAH/AAD+AAD/AAMA/wEDAP4AAgADAv8AIiAg AFJGMgAzLCQAFAsDAP//AADO2eUA/wEEAPwBBAD8/gAAAwAAAAEA/QAB//0AAQACAP8AAQD9AAQA /QABAAIBAQAA/wEA/wD/AAIBAAAA//4AAAAAAAIA/wABAP8AAf//AAEA/wAAAAAA/QD+AP4AAQAC /wMAAAD/AP8A/AD/AAMA/gACAP8AAQD+/wAAAQACAAIA/wAC//0AAP/+AP8BAgD+AAQAAAEBAP8A /wAAAAAAAQEBAAD+/gABAP4AAQAAAP///gAA/gAAAQIBAAEB/wAAAAAAAP8CAP4AAwD+AAMAAAEA AP4BAgAEAAEAAQD+AAD//wABAf8AAQAAAAAAAAAAAAAAAAD+AAEA/wAAAQMA/wEDAP4BAAD/AgQA /QIEAP8A/QABAQQA/QL/AAQAAwACAgIA/wEBAAAAAQACAQIAAAEBAAABAQAAAQAAAQECAAACBQD+ AQQAAP79AAAA/wAAAQAAAAD/AAEAAAABAf8A/wABAAEBAAAAAQEAAgAAAAABAQAAAAIA/wABAAAA AAD+AgIAAAD+AAACAQAB/wAAAQEAAAAA/wD/AP8AAQEAAAEAAAD/AAEAAAECAAEBAwABAf0AAgH/ AP7/AwD/AgQA/v8AAAEA/wAAAf8AAQAAAAIAAgD/AP8A/wD+AAEAAAAEAwUA4ufwAOfr8wD/Af8A /wH/APj5/QAEAwUA/v/+AAEBAgAAAAIAAAEBAAEBAgABAQIAAgIBAAH/AAAD/wAA/wACAAADBAAA AQMA/wEAAAH//gAAAgEAAQAAAAABAAABAgIA/gADAP8BAQABAAAAAAD/AAD//wAAAP4AAP79AAIA AQAA//8AAAAAAAEBAgABAQIAAgECAP4B/gABAgEAAAAAAAEAAQAAAAEAAAEAAAEBAAAAAAEAAP8B AAAAAAD///8A/wIBAAAAAAAAAAAAAP8AAAABAAAAAAAAAAEAAP8AAAD/AQAAAf8BAP7/AQABAQEA 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 AAAAAQEAAAAAAAP+/AACA/4A/v//AAP//gD9Af4A/gEDAAH/AAABAAAA////AAAA/wAC//4AAwD9 AAEAAAD/AAIAAP//AAL//AAC/vkAAAEAAP4AAgAA/wMA/wIBAP7/AAAAAP4AAAD/AAD/AQD/AAIA ////AAEA/QACAP8AAgD/AAL/AAD+/vwAAQACAP7/AgD/AQMA//8BAAAB/wD+AAEAAP//AAH/AAAC AP4AAQL+AP7+/QD9AQAA/fz5AAP//AAE//8AAAAAAAABAQD/AAEA/wADAAAA/QABAAAA//8AAAD+ /wD5/v0A+fsAAP8AAAAAAQAA//7/AAMB/QD//fwA//79AAEA/gABAP8AAv/+AAH+/gD+/v0A/f38 AP7//AD//wAAAwL+AAH9/AACAgAA/f79AP7/BAAAAwMAAQAAAAH+/gACAP8AAAEAAAL//QACAP8A /wD/AAABAQD9//8A//4AAAABAQD9/v4AA///AAAAAAD/AAEA/v8AAAH+/AAAAAAAAgECAP8AAQAA AAEA/wABAAAA/wD/AP8AAAAAAAAAAAACAAEA/wEAAAAAAAD/AAAAAgEAAAABAQABAgEAAQAAAAIA AAAAAAAAAAAAAAAA/wABAQAAAQEBAAECAAABAgIAAf//AP8AAAD+/v4A/f39AAL/AQAAAAAAAQH/ AP8AAQACAgIAAAAAAP8A/wACAQAAAQIDAP8B/wABAAEAAQICAAEBAQABAQEAAwMDAAIAAAAAAQMA AP8DAAIBAAD///8ABAQEAAAAAAD///8A/Pz9AAD/AAAEBQUA/wIAAAAAAQAAAQEAAP//AP7//gD/ /v8A/gABAAECAgACAgIAAQIFAAEAAAAEBQQAAgECAAYFBQACAgQAAQECAAICAAD+/QIAAgEBAAAB AwD/Af8AAAAAAAAAAgD/AAAAAQEBAAEAAAAAAQEA/wD/AAABAQAAAQEAAQECAAH/AAD/AP8A//8A AAABAAD+AAAA+/z8APj5+QAAAQEAAAH+AAACAwAAAQIABQUEAAEB/AD6/PwAAAD/AAAAAAAAAAAA AAEAAP//AAABAQEA////AP0AAQACAAEA/wD/AP//AgD///4A/P3+AP8C/wD+/wEA+vf5APfu7gAA +fUAA//9APwICgD6CQkA/wEBAAUFBgAHCQYACggJAAAC/gD//wEA+///AAMBAQADAAEA///9AAEC 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 AAAA/gACAAIBAQABAP8AAP/9AP7+/AAEAgQAAf/+AP78/QABAAAAAAABAAH/AAAB/wAAAgEBAAAA /wACAP4A/wEBAAD+/wAA//8AAAIBAAAB/gAAAP8A/gH/AP8AAQACAQEAAAD/AAAAAAABAgIAAv8B AAUEBAAEAAIAAgIEAP8BAAAAAQEAAf//AAEBAQACAgIAAgICAAUFBQACAgIAAgMDAAEAAgD+/f4A AQICAP8A/wABAQEA/v79AP3//QD+/wEAAwMFAAEDAQD//f0ABAQCAPv7/QAAAP8A/wD/AP7/AAAA AAMA/f7/AP38/gADAQAA/f//AAMEAgAD/f8ABAICAAL/AwD//wAA/wEBAAICAgAFAQQA/f39AAED AgD8/PwAAgH/AAIAAQD/AQAAAAIBAAD+/wD/AAAAAAIBAAD+/wD+AwAAAP8AAAAA/wD+AQAA/wEA AAD/AAAAAgAAAQAAAAD/AQAAAAAA/v7+AAEBAwABAQIAAP//APv7+wACAP4AAv8CAAMBBAACBgAA BAcCAAb8BAD//QMA//79AP///wAA//0AAf/+AAEAAwAA//4A//7+AAH/BQAB//8A//z9AP77+gD/ +/cA/P/+AP8AAAADBQYAAwYEAAYIAgAJBwMADw4OAAIEBwD49PMA//z3APr0/wABAQEAAwcPAPP4 8wDj5OoA/Pv/ABUYGgAKDg0A/wD/AP8AAAD//v8AAQMCAP4A/AABAP4AAgEBAAICAQD9/f0A/AH/ AAIAAQAAAAIABQUDAPz8BQD6+/wA9vb4AAgAAgACBAUA/v3/AAMD/QAA/wAA////AP8AAgAAAP8A AAAAAP8CAQAA//0AAwIBAAH/AQAAAAEAAAH/AP4A/gAA/wAAAP8BAAH/AQACAP0AAP76AAAAAAAA AAIAAQADAP3//QD/AP4AAgEBAAD//wD9/v0AAAICAP3+AQACAP8AAQEAAAAA/gAA/v8A/v7+AP8C AwD/AAAAAP3+AAEAAAAAAfwA/f/+AAEAAgAB//8AAP39AAADAAAFAf8A/f0AAAD/AQD+AAEAAAEB APr9/QD+/wAAAAAAAP8A/gD+Af0A//7/AP//AQAAAAEA//8AAAD8/wD/AP0AAP/+AP7+/gD/AQAA Af8BAAH+/AAGAP8ACwP+AAf+/gD5+vwA7/b5AO3z+QDx9foA/gACAAcHBwAICAYAAgICAAQEBAAA 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 AAABAAABAf8AAAD+AAAA/wD8+/sA/fz8AAQFBAAB/wAA/v3+AAQCAAAEBQUA/gAAAP7+/gACAQEA AwICAAH9AAAAAP8AAAAAAP8AAAADBQQAAgIAAAEA/gABAQEAAgIEAP///wACAQEA/gAAAAAAAAD/ /v4AAP/+AAMCAgACAgMAAgICAP///wD//wAABQgHAAH9/wAA/vkAAQMCAP38/QD/AQEAAgEBAAAA /wD/AP4AAgECAAUEBQAAAQMA/P4AAAL/AQAB/wAAAP8AAAQAAP8A///+AP/+/wABAv8A/wAAAP// /gAC/vwAAP//AP/+/AD+/wAAAP/9AAMAAAAB/f4A/v7/AP4A/AAC/wEAAgAAAAEAAAD/AAIA/v79 AP//AQAAAAAAAgIAAAD/AAD///8A/QEBAPwABAD/AQEA/v/+AAUBAQAB/v4AAQEAAP7//wABAAEA AAECAP8AAAD/AP8A/wD/AAAAAAAAAAAAAgEAAP8B/wD+AP8AAAACAAICBQD/AwEAAv//AAEA/gAA AP8A/gH9AAACAgABAAQA/wEBAAD+/gAEAgIAAP8AAAABAAD+Af4AAP8CAAD//wADAPwAAgICAP4C AgABAQIAAAABAAABAQABAP8AAAD/AP///wD//wMAAQD/AAMB/QACAAAA/gABAP4AAgABAQEAAgEB AP8BAAD/AgMA/gABAAL//gAB//sAAAAAAAABAQD+AQEAAf//AP///wABAQEA/v//AP7+AAACAAAA /wH/AAD/AAACAP0AAgABAP/+/gD9AAEAAAACAAEAAAAAAf4AAAD/AP/8/gD+APkAAQEBAP7//wAC /vwA//8BAAEB/QAAAP8AAQD/AAAA/wAC/wIA//8AAAABAQD+/gAA/wEHAP0BAQACBAMAAv/+AAL/ /QD/AAEAAf7/AAH//wABAf8AAAEAAAAB/gABAAEAAP//AAAAAAD/AAMA/AEEAAABBQAC//4AAAEB AAEA/gABAAEAAAD/AAABAwAAAP4AAQABAAAAAQAAAQEAAAD+AP8A/wAAAAEAAf8AAAEB/wAAAP8A /wEBAAABAgACAgIA/wAAAAD//gAD/gEAAgEAAAABAQD/AAEAAAIEAP8AAgD/AgEAAAEBAAH+/QAC //wA/wAAAIrnKDwAACAASURBVP//AAACAgMAAf4BAAEBAQD/Af8A/wH/AP8BAQAEAQEA/v/+AAMD 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 AQEA///7AAEC/gD7/wAAAf4BAAD/AAAE//wAAQH+AP8BAQD+AQMAAAACAAL/AQAAAP4A/wAAAAAA AAD9AP8AAAEEAAH/BAD+/wIAAAEBAAAA/wAB/v4AAwEAAP8BAQD/AgQAAf8BAAAA/wAAAP4AAAIB AAAAAgACAAQA////AAEAAAD/AgEAAgEGAAD/AQABAP8AAAL+AAL//QAAAAMA/wACAAABAAAAAAAA AP//AAEAAQAAAAAAAQEAAAP+/AABAQEAAAD+AAICAgAAAAIAAP/+AP8A/wABAQIA/wACAAAAAQAD AvwAAQD+AAUAAQACAQMA/wIAAAAAAgD///8AAAMAAAAAAQAA/wQAAQABAP8B/QD/AQAAAQACAAEB AQAA//0AAQD9AAAAAAAAAAAAAAAAAP//AAAB/wAA/wABAP8AAQD/AQEA/wD+AAH+/gAC//4AAQAA AAEAAAD/AQIA/wEBAAH+AAAAAAAAAAD+AP8BAAD7/gEAAf//AAD+/wABAQEA/QAAAP/+/QAA//8A AgEBAP///wABAQEA/gIDAAD/AAAC//8AAP/9AAH//AD+BgIAAAAAAAMAAQD/AP8A//8AAAH+/wAB AwIAAAD/AAIA/QAA/voAAQEEAP0ABAAAAQAA/wIAAAL9/wACAAEA/wAAAAACAQAAAgMA/wECAAAA AAAAAAAAA/79AP8AAAD+Av8A/wACAAH//gAD/wQAAAQCAAABAgAAAAIA/wEAAAMBAAD/AgAAAQIC AAT+/wABAwMABgAAAAEAAAABBAUA/Pz8AAICAwAB//8AAAAAAAABAgD+AQEAAv/9AAH//QABAQAA /wAFAP8AAAABAQEAAQICAP8EBQD+AgQA//z9AAMCAQABAAAA/wAAAP8BAAAAAf4AAf8BAAEAAAAC AQAA/gD/AP///wADAf8AA///AAL//gD+AAEAAQIBAP//AQD/AQAA//79AAEBAgAAAQEAAAD9AP0A /wABAQIAAQICAP/+/wABAQAA/v7+AAIA/gABAf8AAP8AAP8CBAD9/gEA/wMCAAD//QABAgEAAAAB APz8/QD6+vkA/fr5AAMB/wABAQEAAgICAP8AAAD///8AAgL5AAEBAQD+AAEAAAABAAH/AAAAAP4A /QD/AAEDBAD//gMAAAL8AAEC+QAAAP0AAf8CAAAAAAABAQEAAwMDAAACAgACAgMAAQIBAAACAAAC AwQABQQDAAIBAQAEAgEAAQAAAAD8/QACAAIAAAIAAAIDAAD/Af8AAgEAAP39AAAAAQEAAQIEAP8A AQAAAAAAAP8CAAEBAwAAAP8AAP8AAAICAAAAAAAAAAEBAP0A/gAAAgIAAf8AAAEA/gABAQAA/wAB AAEBAQAA/wAA/wACAAEB/gAAAf8AAQICAAD+/wAAAQQAAAD+AAEA/wABAAIA/wL9AAEB/wAA//8A AQEBAAMGAwAGBwcABwkKAP3//wAA//4AAAICAP8A/gAEAv8ABP/+AP4A/wD+AQEA/QIAAP/+/wAC /v8AAf/+AP8AAAABAP4AAgIAAP7+/gABAQMA/wEDAP//AAD+AQAAAP/7AAABAAAAAgMAAP8AAAT+ /gAA//4AAgMCAPwBAAAA/wAAA/sBAAABAQD8AgQA/wUDAO7+/AAEBQMA9vr6APgABAAAChQA8fsF ANfY2wD69e4AAgMDAAMFBQAFBgUACAcIAAMDAwAFBgcABwsOAAgJCgAKCQUACAUEAAUDBAD7+wEA 9/j6AP7++wD///0A/P8AAAL+9wD//foAAAACAAEAAgADAwQAAAABAPz8/gABAwMADQ8NAAoKCQAE BQUA+v4FAP3+AgD//wAA9fP0APTz7gD49vMA+Pb0AAYEBQAKCw0ABAcIAAECAgAAAwMAAQIEAAYF BAAKCAcABgQAAAABAQD3+wAA9/v+AP4A+AABAAIA+vn7APn0+AAAAPoA/Pv3AAAA+QD+//8A//8E AAcFCAALCQoA/QACAP0AAQAJBwQACAL9APoBAQD6+/8A+Pn7AP8BBAAhISUAGQAKAP3+/AD5+/kA 7/LyAPDx8gD+//0A//78AAD9+wAC//8AAfz+AP0B+wD//vwA/v/9AAH/AAD8/PwAAgICAP///wD9 /wAA//8AAAH//AAAAPsA//8BAAACBAD+/v8AAAH9AAH+BAD/AP8AAQIBAP///wD++/4AAwEAAP// /wD+//8A/v7/AP7+/gAAAgAA/v7+AP8BAQABAQAA/vv6AAABAAAA//4AAP7/AP/+AwD+AAIAAQL+ AP///AD///8A////AAD+/wABAAEA//4BAPn5+wD29vcA//37ABIVGgAJBgkA9vLzAAL79wADAwAA +v4AAAAABAAMCAkACQUBAAIB+wD/AAQAAQD/AP///wD4+wAA5+z5APLw8ADw8O4A6+/uAPn7/QAL BgoAAQEEAAICAQACBAUAAAMCAP79AAACAQIAAQECAAABAAACAgQAAQEAAP4CBwAC/wQAAgECAAEC AgD/AgcAAQMFAAEA+wAAAP8A/QMCAP7/AgABAQEAAAMBAAQDAQACAQEAAwMDAP8CBQAC/wMAAP4A AAMEAQD/APwA/wAEAAMDBwAC/gAA/P37APr+/QD4+/oA+vn6APPz9QD9/f8AAQcHAAH6AAAEAQMA AwYHAAH99wD+/wIA/v4FAAAABwACA/0AAwcHAP4BAAADAwMAAgH/AAD5+wAGBQgAAgQDAAEEBgD/ /gQAAP0BAAEEBQABAgIAAv4CAAICAwAAAf8AAAQCAAICAgABAwMAAAAEAAIE/wACBQcA/f3+AP0A /wACAwcA//8BAP///gD+/gAAAAEDAAABAwD+AfsA/wEAAAIAAAD7AAAAAgEGAP7/AwD8BQcAAAIE AP8CAQD9AgoAAP4BAP4BBwD/AQIAAAEBAAEC/wABAAAA//7/AAAA/wABAP4AAgH/AAEDAwD/BAYA /Qb9APb+AQDz+fwA/f7/AAEAAAAAAAAA/gAAAAICAQACAAAAEhAMAB0bGwDs9PsA/wAAAP4A/wAC AgIAAAD/AAMAAAAOCgQAKSEYAAUALgD19/oABAQIAP8A/QD9+/gABAgHAPL4/QDZ2NoA+/z+APr9 BAAJ/wEAAgD+AP8BAAADAAQAAwIGAAUFBwADAwMAAAAAAAEBAgAAAf0AAAAAAAECBAD9/wQA9vwC APP8BwAFAQIA/QMCAPn6BgD3+gIABAoLAAEECwABAQQAAgD+AAECAQACAQAABQAAAB4YEgBFOzIA KiQiAAUGCgAFBAEA+vn1AAEAAAAGBQkA5OjsAPf5+AD2/gQA/AICAAIA/gAA/gIAAAECAP///wAB AwAAAgoKAPv6/gDu8/oA+Pf5AAAA/AAAAAAAAQECAAAAAQAAAP4AA///AP8AAQAAAAEAAAICAAH+ AAD/AAMAAwgMAAQLEAD+CBAAAQUIAAMG+AADAQMAAggPAP/7CQAE/fgABAcNAAIFBQACCgAAAvz6 AAAKCgD//fwAAf0OAAMJCgABBAoABv8BAAADAgACCQ8A//4AAP/5/gD+AwEA/wQHAP8EBAACAP0A /wIIAP8CBAD/BPsA/vz8APwBBwD/BQAAAf4BAAMFCgAAAv8AAAT9AP7/AgD7AgUA/gAAAP0CBwD+ AwkA/wQKAAIE+wAFAvsAAAIFAP3//gD+BAQA+wQDAP0AAAD7/gAA/f8FAP3/BgAEBQQA/wT6AP0C BAD/BAYAAQUIAP/8AgD7/wIAAAEEAP0C/wD//fwABP8AAAECAgD//gMA/wIGAAMEBQACBP8A+vr+ AAAAAQD//wIA/v4AAAMEAQAAAAEA/f4AAP7+AQD+//8AAP8BAAEBAwAA/wEA//8BAP4B/wD/AQAA /wEAAP8AAAD+AQIAAAEBAAAAAwD9AP4AAP8BAP/9/QD++/0AAgH+AAH+/wAEAQMA/gEDAP38/wD/ AAIAAAABAAQAAAAA/v/8AP8A/QAA/fwAAPz9AAD//gD///sA/wD/AAH/BQAAAAEAAAL+AAD9/QAC AAQA/gEBAP8B+wAB/QEAAAP+AP///wABAQEAAAAAAAEBAQAAAP4AAP0BAAIA/wABAAAAAQD+AAAB /wD//wAA/wAAAP8AAwAB/v8AAgEAAAAB/gAC//0AAP3+AAACAgAAAAMA/wECAAAAAQAAAQAAAQAA AAAAAQAAAAMAAgEAAAECAAD/AgEA/v8DAAAA/wAAAP8AAgEAAAAA/wABAP8AAAABAAEBAwABAgMA /wD/AAD//gABAf8AAAIAAP8AAQACAQEAAv//AAAA/QAAAwMA/gADAAABAgACAAAAAf/8AAAAAAAA AAEAAAEAAAAAAAAC//wAAf/+AAAA+wD///0A//4CAAACAgAAAAAAAAAAAAD+AAD/AAEAAAEBAAAB /wAB//8AAP8DAAAAAQD9APoAAP/9AAAA/gAB/QAAAP//AAEAAQD/AQIA/wECAAABAQABAfsAAP// AAEBAQAAAAAA////AAIAAAAAAP8AAP8BAP8AAAD/AgEA/wAAAP//BAD///wAAAD/AAH//gABAgEA AQAAAAAAAAD+/wAAAQEBAP8AAgD/APsAAP//AAEBAAAAAgAAAP/+AAD//gAA/wAAAAECAAEAAgAA AAAA/wAAAP///wD//wAAAgIDAP8A/QAAAAAAAQEBAAD//gD+AAAAAP//AAEBAQADAP8A/wAAAAAC AQD//wMAAQD/AP8AAAABAgMAAP8AAAEDAQAA/v0AAQABAP4BAAABAQAAAv8CAAEB/wD///0AAAEB AAEBAgD///8A/wEAAAEBAgABAQEAAv4AAAECAAAB//wAAv//APz/AgAAAAIAAAD+AAAAAAAB/wEA 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 AAAA//4AAQEAAP//AAAAAQMAAAEAAAAAAAD+/vwAAQD/AAEBAgD/AAAAAP8CAAIA/wACAQEA/gAC AP8AAgAAAQEAAQAAAAAAAAABAQMA/wEAAAAAAAABAQEA//8AAAACAwD/AAAAAQEBAAIB/wD/AAIA /wAAAAABAAAAAgEAAP8AAAEAAAABAP8AAQABAAABAQABAQMA//7+AAAB/wD/AgEAAAABAAH//wAC AQAAAQEBAP8AAgD+AAEAAQEBAAEBAQD/AP8AAP8AAAEBAAABAf8AAf//AAAAAAAAAQEAAQD/AP8A /wAA/wAAAf/+AAAAAQABAAAAAAD/AAL//gAAAQAA/wECAAD+AAD/AAIAAAEAAAEBAQD///8A//8A AAD//wAAAAAAAAACAAAAAAAAAAEAAf//AAD/AQAAAf0A/wAAAAAAAAD+/vwAAQEBAP///wAAAP4A AAAAAAEBAQAAAQAAAQD/AAD+AAAAAQAA/wABAP7//gD/AAAAAAABAAH/AAD+AP8A//4AAAABAgAB AAEA/gD/AAD//wAAAAEAAAEAAAD/AAABAAAAAQACAAACAAAAAP8AAAAAAAAAAAAAAP8AAAACAP0A AgD/AgIA//8AAAECBAD+//4AAwEBAAEA/gADAgEA/v8BAAABAgAAAgIAAgIBAP3+/AAAAAEAAQEB AAAB/wABAQIAAAECAAAB/wACAP8AAAABAP8B/wABAP8AAv//AP8AAQD/AQAABAIDAAD+/wABAP8A AAIBAP3//wACAAAAAf7+AP8BAQABAAEAAQEAAAEA/wAAAAEAAgACAAIBAQD///0AAQECAP8AAQD/ //4AAgIAAAD/AAAAAP8A//8AAAEA/wD//wAAAP8AAAABAAD///4AAQD/AAD/AAAAAf8A//8AAP4B /wD+/f4AAgMBAAACAAAA/v4A/v7+AAAA/wAAAP8A/v//AAD9/QD+/f4AAQEDAPz+/gABAf4AAQIA AAD+/wABAP8A/gAAAAEAAQD///4AAQEBAAH//gABAQAAAP4AAAH//wAAAgEA/wAAAP78/QAAAAIA /gAAAAIA/wAA//sAAwMEAP7/AQD//v4A/f3+AAMD/wAA/wAAAP8BAAAAAwABAQAAAAEDAAADAQAA AwMAAP4CAAMCBAABAQEA////AAIBAQAAAP8AAAECAAAAAQACAf8AAgH/AAABAAAAAAIAAAACAAAA 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 /QD9+fsA/QX7AAQDAQD+/fwAAAEAAAH/AAD9/f0A/fz7AP///gD+//0A+fj5AP7+/gD+//0A/f37 APz6+QAEBQAAAQMEAAIAAQABAAAAAgAAAP78/AD+/PwAAAUBAP8A/gD7/PoA//z6AAABBAD//wMA /v79AAMAAQD+/v8A/P38AP38+wD7/PsA/wAAAP38+wAA/f4AAQABAP8A/gD///8A/f37AP8A/QD9 /vwAAAEDAAIAAgABAAAA//z9AAAAAAD+/v4AAAH/AP///gD//v4A+/3+AP7+AAD++/wA+Pf1AP7/ AgD/AQIA//3/AP3+/gABAP8AAf7+AP8A+wD7+/8AAP79AAABAAAAAAEABAAAAQABAP8AAQEBAP8A AgABAAAAAAICAAECAwABAf8AAP4CAP//AQAAAQEAAQIDAAH/AwAAAP8A////AAEBAQAAAQAAAv8A AAEBAQAAAAEA///+AAAA/wD/AAEA/gACAAABAgABAQIA/AEBAAABAQAAAP8AAv8BAAAA+gAAAQQA +wD/AAAABgACAgQAAAD/AAAA/QAAAf4AAgAAAP//AAD+//8AAAD9AAAA/wD+AAIA/f8AAAEB/wAA AAAAAgABAP8AAAD+AAAAAf4BAAABAQAB/wAAAAD/AAIAAAAAAAEA/QECAP4AAQD+/AAAAQEBAAMB /gD9/wQA/gADAAIA/gAA/fsAAAEBAP4BBAD8AAIAAQEAAAEAAAAA/wEA/wACAP4CAgD+/wEAAAAB AAAA/AADAQAAAf/9AP///wAA/wIAAAAAAAH/AAABAAAAAAABAP7//wACAwAA/wD9AAEAAgD//gAA /wIDAP0BAwABAQMAAQEBAAEAAAACAP4AAQD9AAAAAgD/AQIA/gAAAAAB/gACAAIAAQECAP//AQAC AgAAAP/9AAEB/gACAAAAAAABAAEBAQABAAAAAP4DAAACAgD/AQMA/wEAAAMA/AAFAgIA/f4AAAAB AwD+Af8AAf8AAAAAAgD/AAAA/wICAP//AAAA//8AAgD+AAAA/wD//wAAAQEAAAAA/wABAAAAAP8B AAEBAQD///8AAQAAAAAAAQAAAAEA/gADAAAAAAAA//4AAwL/AAEAAQD/AAAA/v8BAAABAAAB/wAA /f//AAAAAQABAP8A///+AAMBAQD/AAEAAAAAAAABAwD/AP8AAAEAAP8AAQAAAAEAAQAAAAD+/gD8 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 //4AAQAAAP//AAABAAAAAQAAAAAA/wAEAf8AEwwKABwVEwAHBAEA//7/AAH/AQABAP0AAQICAAAA AAABAP4AAQD/AAAA/wAAAAEAAAD/AAAA/gAAAP8AAQD9AAYDAgADBgYAAwIBAAL//wACAQAAAAD+ AAIB/gAGBQIACQgGAAUDAgADAAAAAv//AAD//gACAf0AAwIAAAYGBwAGBQYABgcGAAQHBwAEBgMA AP7+AP8BBAAHBwcABgUEAAQCAAACAP4AAQD/AAAA/QACAAEAAv/+AAAA/wAAAAAAAAH+AAAA/wD/ AAAA/wABAAIA/gAEAgEACQcHAAcHBQADAgEAAQD/AAAB/wABAP8AAAD/AAYEAgAICAcAAwQFAPX6 9gDq7vEA9ff4AAkGCgACAf0AAAECAP8AAAAAAP4AAAD/AAEAAAAAAP8A///+AAICAQAFBQQABgYE AAAEBQAFBgYAAgYIAP8ABwAEBgYAAQD9AP39/AADBQQAAwUGAAUGCAD+/fsABQUFAP4BAAAF+gQA BAQGAAIDBAAEBQQAAgAFAAIDAwD+/wIABQYHAAcFBAADBAQAAP37AAICAgABAAMAAQEBAAUDBAAA AAEAAQECAAEBAQACAgIA/wECAAACAAABAwQA/wIEAAACAwAAAgQAAQMEAAAAAQAAAAAAAQEBAAAB /wD/AAAA/P7+AAAA/wACAgMA/gIDAAECAQADAgMAAQAAAAAAAQACAgIAAgIBAAAAAAD//gAAAAID AAAAAwAAAf8AAAD/AAEBAgAAAQEA/wEAAAABAQAAAP4A/P39AP3+/wACAwQAAv//AP///wD9AP0A /v78AAD//wADAQIAAgMDAAEEAwAB//4AAP4AAP7+/gD9/f0AAAD/AP7//gD//gEA/f8AAPz9/QAC /vwA/Pz8AAABBAD+//8A/v79AP79/gABAf8A/Pz8AP4A+wD8/QAAAv/9AAAAAAAAAgAABAAA/wD+ /v4A/f38AP8C/gAC/v8AAQD+AAAA/QD/Af8AAf/+AP//AAAA/v4AAAD/AAL//gAAAP4AAQH+AP3/ /AD/AP8AAAEBAAH9AAD/AAEAAP//AAD/AQACBAEABQMCAAMBAgAA//8A/wEAAAAB/wAAAAAA/fz9 AAEB/wADAwAAAQECAAAAAgABAP8A////AP4AAAD9/gAA/wABAAD//wACAQAA/wEBAAECAAAIBAIA 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 /fz+AP39/QD7/PwA/fz9AP8B/QD8/P0A///+AAT+/wD+/v0A/v3+AP79/wD+A/8A/v//AP78/QD8 /P4A/vz8APv6+gABAgEA/f0FAP37+wD9/f0A/Pz8AAH/+wD8/PsA/wAAAPn5AgD/+/kA+vr8AP4D +wAAA/oA+vv5AP78+wD7/fwA/f7+AP39/gD7+/0A/gL9AP79/QAA/QAA/wL8AP8AAAD6+vwAAP8A AP8CBgD5+/sA/AD+AP3+/QD+AQQA+/z8AAL//AD/AAIA/f8CAPz6+gAA/wQA/gEAAP39/QACAQMA /wICAPz8/QD8/P0A/Pz+AAAAAwD+//4A//3/AAAB/wD+/f0ABAIBAAD+/wD+/wAA//3+AAEAAAAC /wMA/f3/AP7+/gD5//oA+/n4AP4AAQAEAgUA/P3+AP/9/QAAAvwAAwMCAAECAQD///8A/v/+AP8A AAAAAAEABAMA/wAMCAUA/ggDAAAB/wAAAwQAAAABAP8CAwABAQIAAf8DAP/+AQAAAQIAAQECAAH/ BAAA/wAAAAEEAAECBQD8/gEAAQAAAAIAAgD/AAIAAAEDAAD+AAAKBQUABAICAP///wD8/PsA+/v7 AP7/AgACAP0ACgYBAAcFBAAAAQMA/P7+AP39/AAA//wABQMCAAAAAgD3+PsA///+AAsGAwD+AfoA LCQdABwYFADb4OUA0djkAGEoJQAuJiIA3+XxAPT19QAKBgMAAwMEAPT4+wDw7OwAAwgLADcuJgDa 2d0ACQX/AAIDAwD+/v8ACQQBAAoFBQADAgQABwMCAC8kHQAQFxsA7fL1AMDN2ADh6PEABQICAAYF BAAFBAUA/gACAPz8+wD5+fUA+gD+AP///wAHA/4ABAECAAMB/wAAAv8ABgUCAAoGBAD5/AAABQMC AAECAgABAQIABAMCAAQFAgACAgAA/f8AAPr8+gD8+vcAAwwKAAQGBwD6+/0A/P39AP8AAQD2/AAA /f0AAPX8AQD8/wAA+f0AAPT6AAD0/AAABAYEAAYG/wAD/wEAAQICAAABAwABAAIA/f/9ANbg5wAA AP4AJh0UAPr8/wABAv8ABgcEAAgJBQD+//4ABQAAAP4BAwAFAgIACwgGABMNBwAsJx4A/AACAOPr 8gD6/gEACAcDAAD/AwAFAAMA/f4AAAQDBQD9/v0AAwD9AAL+/gD0+fsA09zkAAcC/gAMDg0A/f8A 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 AAECAQABAgIAAAABAAEBAQABAgEAAAABAAAB/wAAAQAA/wIBAAACAQAAAQEAAAEAAAAA/wAAAQAA AAD/AP8A/wAAAAAAAAABAAABAgABAQEA/wIBAP4B/wD/AQAAAQH/AAAB/wD///8A/wAAAP0A/wD8 /vwA+fj4AAEA/gACAQEA+fr4AAQA/wAD/gYA+vr7AP//AgACAfsA+/r5APr59wAB/v4A/gAAAAD/ /QABAf4A/gD9AAAA/AAAAQEA/gH+AP8A/wAAAAAAAAH/AAAA/gAAAAAAAAAAAAAA/wABAQEAAgIB AAMBAAADAgAAAwIBAAEBAAABAgEAAgMBAAIEAwABBAIAAQMBAAP/AQAEAgIAAf7/AAMCBAADAgIA AwEBAAMCBAACAv8AAwMDAAQDAwD8AwIAAwMEAAMDAwAEAwMAAgACAAMDBQAEBAUAAAD8AAQDAwAB AAYABv0BAAQEBAAEAwIABgUFAP7+/wADAgYABQP9AP8EAwAEBAQAAAQDAP4FBAAA/wIABAQEAP8B /wAGBAQABQQDAAQEAwAFBAMAAAACAAQEAwAGBgYA/v8AAAYHCAAFBAQAAAQDAAECBAAGBAUAAgUF AP/9BgAGBAQAAwMCAP8FBAAABAAABgUFAP7/AQAGBAUABgMDAAEDAwAFBQUAAwD+AAUEBQAB/gAA /QQEAAUDBAAEBAIABAQEAAAAAAADAwMABAEAAAYGBAABAQIABQQFAP8EBQAFA/4ABQQDAAUBBQAF +wUAAQUGAAcGBgD9//wA/QT+AAYFBQAGBAMA/AICAAMFBgAGBQYAAP8AAAIFBwAEBAUA/gIDAP/9 BAAAAQEAAgQDAP//AAD9AwEAAwQCAAMCAwABAAEAAwMDAAMDAwAA/gEAAwIDAAMA/wACAgIA//8A AAMCAgAEAwIA/v//AP4BAQABAwEAAQECAAICAwADAwAA////AAMDAwAB/gEA/v//AP//AAABAAAA AwIDAAQEAgAEAwMA/gIAAPz+/wAEAgIAAf7/APwBAAABAP8AAQEAAAMBAgADAgIAAwICAP8AAQAB /wAAAAABAAACAgABAwMAA/4DAAEAAAAAAAAABAQC/gASDgYAAAsGAAMBAwD/+wcAAP8CAP8C+gAB AgIAAP4HAAD+/gACA/8AAAEAAP/9BgAAAQEAAgP/AP8AAwD7/QAAAgEAAAL/AgAAAAAA/gEGAAD/ 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 AAADAP8A/gD+Af8A/wH+AP7/AQD+/v4AAAH/AP8A/wABAAIAAAACAAACAQD9/f8ABAH+AAD+/gAB AAEA/wADAAD/AQAAAQEA/gABAAICAgABAAAAAAAAAP8C/wD/AAEA/wIBAAEBAAAA/f8AAQABAAIB AgACAAEAAQEBAAMAAAAAAAEAAQIEAP4BBQD/AQMAA/79AAEB/wAABQEAAgMCAP38AAD/AgEA//8D AAAB/gD//v8AAAD/AAAAAAD+//8AAwEBAAEBAgADAQIA/wEBAP8AAAD/AAAAAAAAAAABBAAAAQEA /gD+AAQAAQD/Af4AAQEDAP8A/gABAP8AAP//AAEA/wD/AAIA//4DAP4AAQAC//8AAQD6AP/+AQAB Af4ACf7+AAUA/wAA//0AAv/+AAX+BAD/AggAAAD/AAAA/QAA/v0AAf//AAIAAAD+Af8AAgEDAPwA AgADAAMAAwD+AAMAAQD+Af8AAAD/AP//BQABAQYA/gD+AAEAAgABAQAAAQD/AAAA/wD/AgMAAQED AP0A/AAFAAEA/wH+AP4AAQAAAQUA/wD+AAIBAAAA//8A/wEAAP///wAAAAAAAgABAAQCAgD+AQUA AP8BAP4AAAAAAP8AAwIBAAAB/gABAP4AAP/+AAH//wD//v4AAwH+AP8CAAACAQQA//8CAAAA/wAC /gIA/f/8AP/+/gD+//8AAAH/AAAAAAD//wAAAAIAAAD//gAA/P8A39viAOfi6QDv6/MA//z+AP4A AAD///0AAQAAAP/9/QABAgIAAP8AAAACAQAA/wIAAAIBAAD//gAA//4AAgABAAD//QACAwAA//78 AAT+/wAC/AAAAQECAAICAwD+/v0AA///AAD//QAAAQIA//8AAAEA/gAC//8AAf8AAAIAAgD+AAAA AQH/AP/+/QAB/wAAAv8AAP4BAAABAQEAAP4BAAABBAAB/wMAAAAAAP8CAQD+Af8AAgAAAP0BAQAB AQAA/wEBAP7/AAADAQEA/QD/AAIAAAD+AQAA/v8BAAIAAAABAAEAAwABAAAAAAD/AAAAAQEBAAIA /gADAP8A/wABAAIAAgAAAQAAAQD/AAH//gAA//8AAgAAAAIA/wAEAQAAAwADAAH//gABAQAA/gEC AAIDAAD+/gEABAIDAAICAgD+/v4AAgABAAD/AAAA/wAA/QAAAP0AAAD/AP4A+/39AAIBAQD9AP8A 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 AQEAAAD+/wABAAAAAAAAAAAAAAD/AQAAAAACAAEAAQAAAAEAAQEBAP//AQAA/wEAAAAAAAAA/wAE /wABAPkBAgABBQUA/wABAAD+BQAAAQMAAAIDAAAA/wAA/wIAAAECAAACBAAA//8AAAACAAAAAAAB AwIAAP8EAP/+/QABAAAA/wEAAAECAQAA/wMAAAD/AAAAAAAA//8AAP/+AAAA/wABAQIA/gECAAIA AAD/AQEAAgAAAAD//gABAP8AAAD9AAAA/wACAQAAAf8AAP//AQD/AP8AAv//AAAA/gD/AP4AAgAB AAD/AQABAAEA/wD9AAABAQAC/wAA////AAMBAAABAAAAAQAAAP///wAAAAAAAgEBAAAAAQAA/v4A /wEAAAMBAQAA/wAAAgD+AP///gAAAAEAAQABAAH//gD/AAAA//8AAP///wAB/wAAAAAAAAD/AAAA /gAAAAD+AP///wAC/wIA/v79AAP+AgD9/wAA/wD/AP8A/gABAAEA/v8AAP8BAgAC/QAAAQD+AAEA AAD+/gAAAgAAAP/+/wABAPsAAAH+AAEAAgAB//8AAf//AAAA/wABAAIAAAD/AAEA/gAC/gAAAP8A AAEBAwD///8AAQEAAP///wD/Af8AAQD9AAEA/wD/AP8AAAABAAAAAAD//wAA/wD/AP8AAQABAQIA AAABAAAB/wD9/f0AA//9AAD+/gABAQIAAP8CAAD//QABAQEA/v8AAP8CAgABAf8AAf//AAICAwD+ /wAA/wAAAAMCAQD+/fsAAv0CAP79/QACAgIAAP/9AAH/AAABAgIAAgECAP8AAgACAfwA//79AAEB /wD//f0AAgMCAP7+AQAAAQEA///+AP8B/wAAAAAAAQAAAAH/AAD///4A/wD/AAIBAAACAQEAAP// AAEBAQD+AP8AAQEBAAAAAAAA/wEA/v8BAAABAQD9AP8AAQD/AAAA/wABAAEAAP8AAAABAAAAAAAA AAEAAP//AgD+Af8AAf4DAAACAAABAQMA+v8AAO/09gDn6u0A8/b4AP4BAQAA/wEA/wEAAAEBAAAA AP8AAQAAAAACAgD///8A//8AAAD//wAA//8AAv//AAL+AAABAf8AAf/+AP//AAAC/gIA/v8BAAEC /wAA/wAAAQH+AAEBAAD9//4AAQABAAIB/wAE/v8A///+AP8AAgAAAf4A/v/9AAAAAQABAAAA/wAA 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 AAAB/wAA////AAEA/gD//v4AAgICAP//AAD/AQIAAP/+AAIAAQD///8AAAH/AAAAAQAA/wAA/wAA AAAA/wABAP0AAAEBAAD/AAD+AP8AAgAAAP8A/wABAP4AAAAAAAEB/wAAAP4A/wH/AAABAQD/AAEA AAD/AAH/AQAA/wEAAP//AAEAAAD/AAAAAP//AAD+AAACAQAAAP//AAD/AAAB/f4AAQIBAAD//AAC AQAAAP/9AAIBAQD+/f4AAf//AP//AAAAAQAA/wAAAAABAAD/AAEAAgACAAIAAAD//gEA/wEAAAAA AQAB/wEAAP//AAEBAAAAAAAAAQEAAP///AABAAEA///+AAQBAgD9//4AAP0AAAD//wABAQEAAAAB AAAA/wAA//0AAgH9AAD/AAABAP8AAQD+AP4AAAABAAUABP/7AM7W3gD0+v4A2drjAPP7+gAA//4A AQEAAAIDAgD//v8AAP//AAMAAAD9/v8AAQH+AP7+/QAFAP4AAf/+AAMBAgAAAAIAAQIBAAD+/QAE Af4AAAEAAAD/AgD9AP8A//8BAAH/AAD9/v8AAgH8AP/+/QACAgIA/wAAAAAAAAAB//8A/f/+AP4A AAD+/wAAAQH/AAEA/wD+AAEAAQABAAL/AAAA//8AAAD+AAEA/wAA/v4AA/8CAP///wAAAQIAAAD/ AAEBAAD/AP8AAf4BAP7+/wADAf4AAv//AAD//gACAAEA///+AAEAAQABAAIAAf8AAAAA/wABAQAA Af/+AAH+/QD9/wAA6+/zAAEAAAABAAEAAwECAP///gD+/vwAAwIBAAH+/AABAAIAAgD+AAEB/gD/ //8AA/4CAAEAAQD/AP4AAP//AAEA/wAGAQIAAgEAAAH/AQD9AP8AAwD8AAP/AgD/AP0AAQACAP0A AAABAAEAAQAAAAAAAQAAAP8AAAIBAAMBAQAB/v8AAQIBAPwAAQD+Af8ABAEBAAD//wAAAAAA/gH/ AAIA/gACAv4AAQD/AAIAAQD//wAABAABAAAAAQADAP8A/wAAAP4B/wAHAAAAAAEAAAABAQD7AwIA /f8AAAMCAgAA/wAAAAMCAPwAAQABAAAAAv3+AAQAAAAEAgQA/f39AAQCAQAD/v4ABAD/AAAAAQD/ AAAAAQABAAEBAAAAAAAA/QEAAAAB/wAA/wAAAAABAAIBAgD5AgEAAAAAAAH//wAAAQEAAwIBAPwA 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 AAAA/wAAAf8AAAD//gD/AQEA////AAAAAAD/AAAAAQAAAAAAAAABAP8AAAD/AAD//wAAAP8AAP8A AAABAAAAAAEAAAAAAAAAAQAEAf8BAAT+/gAD/fwA/wD7AAD9/QAB/v8A/wH6AAD/AAAB//sAAAEB AAAC/AAAAP8AAP0EAP/9/QAC//sABAAAAAEB/wAAAP8A//8AAAIAAAAAAAAAAQAAAAD/AAD/AP8A AQAAAAABAgAA/wAA/f/+AAIAAwD+/wAAAv8BAAAB/wABAAAAAAAAAAEAAAAA/wEAAQAAAAEBAAAA /wAA///+AAABAgD//wAAAAAAAP4A/wD///4AAf4AAAAAAAD/AAAA/wAAAP8A/wD///8AAQD/AAD/ AAD/AAEAAAAAAAAA/wAA//8A/v//AAEAAAD+/wAAAAIAAP7+/gD9AAAA/wAAAP///wABAQEA/wAA AAEB/wAAAAEAAAABAAAA/wABAP4A/v8AAP8AAQAA/wAAAAIBAAIAAAD+AP8AAAACAAAAAQAAAAAA AAEAAAH/AQAAAP8A/wABAAAAAAAAAgEA/QAAAP8BAAAAAAIAAAIBAAAA/wD+AgAAAf8BAAD/AAAA AwIA//8BAAD/AQABAQAA//8BAAAAAQAAAv4A/gECAP/+/wABAgIA///9AP4BAAAA/wAA/wAAAAEA AQAAAAAAAAAAAP//AAAAAQAAAAEBAAAAAAAAAQEA/gMDAAD//wABAQEAAAEBAAD/AQAAAAAA/wAA AAAAAQAAAP8AAP8AAAECAAAAAAEAAAAAAAD/AAD//wEAAQEBAP8BAQAAAQEAAP8AAAAAAQAAAQAA AAD/AAAAAQAAAP8AAAECAAEDAgD//QAAAQIDAP///QAAAQAAAAEBAAEBAwD/AQIAAAABAAH/AAAA Av8AAAH/AP8BAAAB/wAAAP7/AAECAQD/AAAAAAAAAAD+/wACAQIA//4AAAIAAQD+AgEAAQABAAD/ /wADAAAAAf8AAAAAAAAA/wEAAgAAAAD//gACAQEA/wEBAP//AAABAP8A+/z+ANrf5wDh5OoA+/r+ APwAAgAAAf8AAAAAAAEAAQD+AAEA/wEBAAIBAgmZLhMAACAASURBVAD+AQAAAgICAP3//wD6AAIA AAAAAAMAAQD//wAAAP4AAAD/AAABAP8A////AP8B/wD+/wAA/gABAP/+AAD9/v4ABAIBAAD9/QAC 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 AAAAAP8BAAAAAP4AAP8AAAH/AQAAAQEA///+AAAB/wABAAAAAP4BAP8BAgD/AP8AAgH/AP39/gAC AQIAAAD+AAABAQAAAAAAAAAAAAAAAAAAAAAAAP//AP8AAAAAAAIAAAAAAAECAgD///wAAgIDAP/+ /wACAQEA/wD/AAD/AQAAAAAA//8AAAABAAAAAf4AAAD/AAICAwAA/wIAAP//AAEAAAD+//wAAgMC AP78/wACAwIA/v79AP//AQABAQEAAAIBAP8AAQABAgIA//8AAAAA/wD++/oAAgMDAP///wAAAgAA AAABAAEBBQD/AAEAAAH/AAD//wAA//8AAP//AAIA/wACAQAAAP7+AAABAgD//wAAAQEBAP/+/QAC AgQA/v38AAICAQD//v4AAgICAAH//wAEAQAAAf//AAH//wD///8AAgECAAABAAD+AQAA////AAEB AgACAgEA//7+AAH//wACAAIAAAH/AAEAAQD/AP8A/v8BAAICAgD9//8A/f/+AAIDAgD9/f0AAQIB AP79/wAABAQA/v3/AAIBAAAAAP8AAAECAP7//wAAAQEA/gAAAP8BAQD//wAA/wD+AAABAQD//v4A AwICAP/8+wADAwIA/f//AP4AAQABAwUAAP/8AAH+/gD+/v4AAQABAAABAQAAAQAA/gICAAEBAgAA //8AAf3+AAAA/wD//wAA/wICAAD//wABAf8AAP39AAABAAAAAAAAAQICAP79/QACAgIA//8BAAD/ AQABAAEA//76AAEBAAAAAgEAAP8AAAH+/QAA/wAAAAEBAAH//QAAAQAAAP8BAAAAAQABAP8AAf7/ AAAAAAD/AgEAAQD+AAD9/AABAwQAAP8AAAACAwAA//4AAAEBAAD/AAAAAAEAAAABAP/+/QABBQQA /vz8AAICAAD//v0A/wACAAEDBAAA/f0AAQD/AAIA/AACAAEAAf8CAAAA/gACAP4AAf//AAICAgD+ AAAAAf7+AAkCAgAE/v4ABQIBAP///wABAgIAAAACAAEBAwAAAP8AAAD9AAH//wAA/v0ABQIBAP/+ /QAAAwIA//7/AP4AAQABBAUA+fv7AAEBAQD/AP4A///+AAIEBAD//wEAAgIDAP4A/wAAAQAAAQEA AAAB/wACAQIAAAABAAMCAgAA/v8AAQH/AAEBAAAA/v8AAQEBAAL//wABAQEA/wD/AAQCAgACAP8A //7+AAYDAwD9/vsAAwIDAAMCAwAA//8AAwMDAAAA/gACAQAAAgD/AAP/AAAEAwQA/v8AAAMCAQAC AQAA//79AAEEBQD+//8ABAIBAAMEBQD+DAsA+AkLAO73+AD39/sA+vn9APj7/QD4/P8A+Pn8AP79 AAAA/v0AAwH/AAD//gD7/v0A/wEBAP8A/QAA/v0AAP7/AAD//gACAP4AAP78AB8fHwAcGBQA7+rl APjy7wALDAkABAkKAAUFBAAA//4AAgQEAP4AAQD/AQEAAwECAP/+/wD+AQEAAQECAAIBAgACAQMA AQEAAAUFAwD+AAIA/wEEAAIDAwAAAP4AAgICAAEBAQABAQEABAMEAP0AAAD9AQIAAwIEAAgEBAAM CQYABAYEAAQGBgAHBgcABgUFAAgIBgAJCQYACgkIAAwJBwAJBwYACgkHAAgHBwAFBQYABgcGAAME AwADAwUAAAECAP///AACAAAAAP4CAAD//gD+/f0A/fz7APv9/QD6+voA+fn5APr6+gD4+fkA+Pr7 APf6+gD29vgA+fr8APv8/QD8+vsA+vr4AP7+/QD8/v4A/Pz8APj5+wD7/QAA/v7/AAH+/AAD//0A //7+AP3//wD+AP8A//7+AP/+/gD+/v4A/P39AAEA/wADAQIA/Pv6APz9/AAAAAAAAQD/APv7+wD9 /f0A//3+APn39wD6+PcAAgIAAP7++wD29/YA+/8FACYsMgD09fgA19LMAPPu6QD//v4A/P4BAP3/ /gAA//wAAAEAAAECBAD9/QAAAP3/AAMDAwABAgIA/P78AAAB/wACAQMA/gEGAAoMEQAJDAwA9vT0 APbz8QAA/f0AAP8AAAMDBAAFBwQABgkKAAgKDQAHBwkABQYFAAcHAgAEBAIABQcGAAsICQAOCwgA BAD8APj39QD+/gIA8PL0AN/g4gD18OYAISgzAAYPHAD/AQMADA0KAAUEAwD5+vcA8OzoAO/q5QD2 8/IA+Pf4AP78/QABAQAA//8BAPz7/wAMBwAACxEQACAiJQBRSk4A9eLjAObSzAD/9vIA/gEBAPsB AwD+//8AAQD9AP//AAD+AAEAAwACAAP+/wAA/v0AAQEAAAEAAQAE//8ACP8BAAgBAAAG//8AAQAA APsA/wD0/v8A9QAAAPcAAAD5/v0A+/8CAP7/AQD9//gA//8DAAEAAwD//v4A/v/9AAEBAgD//wAA /v//AAAB/wAA//8A/f8AAP8BAgD/AP8A/f79AAIBAAD/AAQAAP79AAEBAQABAQIA/v//AAAAAAAA AAAA//8AAAABAQABAQAA//79AAAAAAABAgMA/v/+AP/+/QACAgUA/wABAP3+/QACAQIAAAAAAP39 /wAAAQAAAQD/AP7/AAAAAQEAAAABAP/+/QD/AAAAAQMDAPz9/wD///0AAQICAP8AAQD+/v4AAAIC AP8AAgD9/v8AAAEBAAIBAQD8/v0A/gEBAAIBAwD+/v4A/f/+AAEFAwD//gAAAPz9AAQFBQACBQQA Bv/+ABYDAQAYBAQAAAH+AO7+/gDwAAIA9QACAPj9/gD8AAEA+v79AP79/wAFBgUA/v8AAP7+/wAC AQAAAQAAAPz9/AD+/wAABgQFAAEA/gD9/v4ABAUFAP7//gD9/PsABAQHAAICBAD8+/kA/f7/AAEC BAD//v8AAQEAAAUEAgAAAAAAAQIEAAoKCwAIBwUAAP7+APv9/QD+/wAA//79AP7+/QD7/P8AAP/9 AAYGBgAGBwgABAQDAAIA/wACAQEAAAEEAPr8/QD///8ABwgGAAABAQDx8vMA8fT0AP/+/gAFAgQA BgcHAAQGBQD9/wAAAP//AAYFBAAAAAAA/f7+AP8AAAD/AP8A/Pz8APz7/AD8/P4AAf//AAMCAQAC AwEAAwICAPz+/wD/AQIAAgMBAAEAAAABAgIAAQMGAP3+/wD6+fgA/Pz6AP79/gADAQQAAv79AAIA /gADAwMABgAAAAQCAQD/AAEA/P//AAAAAQAAAgAA+Pz9AP0BAQACAgQA///+AP8B/wABAQIAAQEC AP7//QD5/fsA/f8DAAEBAwD///0AAP/9AAACAwD//wIAAAD+AAEAAAACAgMA/v8AAP8A/gACAQEA AAAAAP/+/wD/Af8AAAEBAAAAAQAA//8AAQECAP8BAQD+/v8AAQACAAICAgAAAAAA/wD/AAAAAAAB AQEA/wD/AP7/AAAAAQMAAQD+AP/+/wD/AQAAAQEBAAD//wAAAAAAAQECAP8BAAD//v8AAQAAAAEC AwD///8A/wD/AAABAQAAAAAAAP//AAAA/wAAAQIA//8AAAAAAAABAAEAAAECAP///QAAAP8AAQAA AAAAAQAA/wAAAAECAP8A/wAAAAAAAAABAP8AAAD/AAAAAAAAAAIAAAABAAAA/wAAAAAA/gD+AQAA AP8AAAAAAQACAAEAAQAAAP//AQAAAQAAAAD/AP///wACAgIA/wABAP///wAA/gAAAQEBAP8A/wD/ AP8AAQD/AAAAAQD//wEA/wAAAAABBAAAAPwAAQH0AP//CAAA+DEA/exGAAD0NAAAi4l0dgQBAP8A ////AAD+AAD/AQAA//8AAAAA/wD9AP4AAP//AP3+/AD/AAIA/gD8AAEBAAD+//wA/v8AAAP//wD+ /v0AAAAAAAAAAAD//wAAAf4AAAEBAAAAAAAAAP8AAAABAQD/AAEA/wH/AP8BAQD+/gAAAgABAP4C AgAAAgAAAAIDAP8BAAD//wIAAP/+AAD/AAAAAAEAAgEBAP8A/wAAAAEAAAIBAAD+/wD/Af8AAAH/ AP///wAAAAEAAAABAAABAAAA/gEAAAAAAAEBAAAAAQAAAAIAAAAAAQAAAP8A/wACAAH//gAA/wEA AAEBAAAA/wAA/wAAAP//AAH//wAAAAAA/wAAAAAAAAABAP8A//8AAP///wD/AQEAAQABAAABAAD/ //8AAAD9AP/+AQAA/v0A/wH+AP//AAD/Af8AAAD/AAEAAgAAAAAAAAEAAAAAAAD/Af8AAP8AAAAA /wAAAQEAAQABAAEAAgAAAP8A/wEAAAEAAgAAAQEAAQAAAAAAAQAAAAEAAAEAAAH/AAAAAP8AAQEB AP4AAQABAgAAAQD/AAIAAAAA/wMAAAIBAP8A/wAAAAEAAQAAAAD//wAAAQAAAP8AAP4AAAAAAAAA AgAAAP7/AQAC/wEA/QAAAP8AAQAAAP8AAAAAAAAAAAD/AQAAAQEAAP//AQAAAAEA/v8BAAD//wAA /f0AAQL/AP79/AAAAAMA//7+AP//AgD///4A//4AAAEBAgABAgAA/wAAAAICBAAA/v8AAgD+AP78 +wACAP0A/v0AAAIDAgAAAAAAAgEBAP8AAAAAAf8A/wD+AAD//gADAAIABAABAAQBAAAA/v8A/wL+ AAAAAAACAQEAAAMCAAECAQD+AAQAAwEAAP8BAgABAgIA///+AAEB/wABAP8AAP4AAAAA/wAAAAEA /gAAAP7//gD+AQAA/v//AAD/AgD/AAMA/gD+APz//wAA//8AAQL/AAD/AQD+//8AAP//AP3//gAA /v8AAAH9AP39/QAAAAIA/v/+AAH9/wD+/f8AAgEBAP8A/wABAQEA/v7/AAEBAgD/AQAA/wAAAAAB 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 /wAC/fgA/wD9AAr8/gAGBgcAAP//AAD+/gAA/f0AAvoAAAACAAD+/wAAAv//AP//AQAC/v0AAQH/ AAEDAgD8/f0A/gAAAAIGBAAAAQIA//4BAP4BAAAAAP8AA//7AP/++wAB/gEA////APz+/wD7APgA /f//AP79/QADAQIAAwIEAP39/gD9/v4A/wMBAP7/AAD7/QAAAwH/AAQC/gACAAAAAgABAAMAAwAL AQAA/P/+AP79/gD+AAIA/P78AP0A/AD/AQIA/wEAAAABAgADAQIAAQEBAP8BAQAB/gEAAQABAAAB AQD+AAEAAAAAAAIBAAAC/wAA/wACAAEBAAAAAAAA/wEAAAABAAAAAQIAAAAAAP8AAQAAAQEAAAEB AAECAQAC/wEAAgAAAP8BAAD+AAAAAAAAAAIAAAAAAAAA/gEBAAAB/wACAAAA/gIAAP7/AAABAQEA /wD/AAEAAAAAAQAAAAEBAP4A/wABAQAAAP7/AAEAAAD/AAAAAAD/AP8AAQAB/wAAAAABAAAA/wD/ AAIAAAEAAAH/AQAAAAAA/gAAAAABAAACAAEA//4AAAAAAAABAAAA/gAAAAAA/wAAAAAAAQAAAP8A AAAAAAAAAgACAAD/AAD/AP0AAQEBAAMAAAD+AAAA/wABAAABAQAB/wAAAAD/AAD/AQAAAQAAAAAB AAAAAAABAAAAAAACAAEB/wABAAEA/wAAAAABAAAAAAAAAAABAAAAAAD/AP8AAAEAAAEAAAD/AQEA AAAAAP///wD9AP8AAAAAAAQB//8AAf7+AAL+/QD/Af8A//79AP8A/wABAf0AAAAAAAD+/gAAAf8A AAD9AP8AAAD///8AAAABAP///wD+/wEAAQEBAP8BAAD+AAAAAQEAAAAAAAAAAAAAAAAAAAAAAAD/ Af8A//8AAAD/AQD+/gEA/wQCAP4AAAAAAQAAAAD/AAD/AAAA//8AAAAAAAACAQAA/wAA/QAAAAD/ AAAAAf8AAP8AAAAA/wAA//8AAP7/AAAAAgAAAAAAAAH/AAD/AAAA//8AAgACAP//AAAAAQAAAP8A AAEB/wD//wEAAAABAAACAgAB/wEAAAEAAP4A/wADAQAA/gD/AP//AAABAQEAAQEBAP8AAAD+AP4A AQD/AAD/AQD+AQIAAAAAAAABAgACAAIAAAD+AAABAAD+/gEAAAEBAP4AAAAAAgIAAP//AAAA/wAA AP4AAAABAAEBAAAAAQIA/wEAAAAB/gABAQEAAAACAAD/AQAA//8AAAAAAAAA/wABAAAAAAAAAAAB AQAA/wAAAAAAAAEAAAAA/wAAAAEBAP8A/gABAgMA//8DAP8AAgD/AAAAAQIDAP8A/wABAAEAAAAA AAEBAQABAQAAAAAAAAAAAAAA//8AAAEBAAL+/gABAwQAAf//AAABAAAB//4AAAAAAAAB/wAB//8A AQACAAAAAgD/AQEAAAICAAD+/QAC/fwAAv/+AAAEAwABAwMA//z+AAQBAgD///4AAQABAAABAQAB AP8AAAAAAAMCAwAD//8ABAH/AP/8AgADBAMA/v8AAAIBAwD+//0AAgECAP7/AAD+AQEA/v78AP7/ /QAC/wEAA/8CAAD//wD/Af4A/wAAAAEA/wAA/v0A//8AAAAA/QAA/wAA//4AAP7//wD//gQA/f/+ AP4B/wAAAQEAAf8AAP///wABAf4A/gH/AAD/AAD+/wAA/f//AP4AAQAAAAEA/wAAAAAA/wAAAQEA AQD/AAABAAAAAgIAAAIDAP7+AQAAAP4AAgEAAPwC/wADAgIA/wEBAAEBAAACAP8AAQECAP//AAAA AP8AAgEAAAEB/wAAAP8A/wEBAAABAAAAAAEAAgAAAP8B/wACAAEA/gIAAAIBAAD+AgAA/gH/AAH/ /QAAAP8AAAAAAP8BAQABAQAA/wD/AAAA/wAB/wEAAP8AAAEAAQD//v4AAQD+AAD//gACAgIA/wD/ AAAAAgD+/gAAAAEAAAD//wAA/wAAAP//AAEBAAAA//0A//7/AAEAAgD//v4A//8AAAD/AAD///8A AAAAAP8AAAAAAQMAAf//AAH/AQD//wAAAAIBAAD/AAAAAP4AAQD/AAD9/wACAQIAAP78AAQAAQAA //8AAQH/AP///wACAQIAAAH/AAEAAAAFAAEAAgMBAAYDAQD9AAIABAQBAP8EAQACAQEAAgIDAP// AAAEAP8ABAD+AAMBAQAAAP8AAAD+AAECAwD+AAEAAgICAP///gAAAP4A/wABAP8AAQACAwMA/v/+ AAADAwD+/wAA/wIBAAABAQD/AAAA/wICAP0A/gADBAMAAf8AAAQEBQD///8A/wD/AAMEBAD+/v8A AwEBAAD//gAAAf8AAwQFAAD/AQACAgIAAQEAAAICAQAAAP4AAQEBAAQBAwD///4AAgMDAP8BAAAC AAAAAgAAAAH//QAEAQEAAAABAAEDAwACAQEAAwABAAIBAAAA/v0ABgIDAP/+/QACAP8AAgIBAAD/ /wAEAAMAAf//AAMB/wADAP8AA/8AAAcCAQAEAP8AAwMDAP4BAAD5AgUA/AgHAPoBAQABAwIAAQAA AAQEBAAEBwcA/O/wAPz9/AADAwAABgYBAAQFAwAB/wAAAwEBAPv7AQACBAUAAwMCAPn6+gD9/AAA 9/kHAP38/wAC//4A/vr7AP/+AAD6/v8A/P//APj5+QD+/v4ABgQFAP4CAgADAwUABAUFAPr9/QAB BQYA//0BAP3//AABAAEAAwICAAAAAwD+/v4A+/3+AP7+/gAA/v0ABAUCAAABAAABAP0AAf8BAAL+ /QAAAf8ABAEEAAUEBAAAAAAA+/v7AAD6+gD+AAAA+P7+APkBAQADAgIABgQFAAIDBAD+Af8ABgUF AAUGBAD//wEA/v0AAPn5+AD3+PcA9/r4AAH8/AAQAP8AFgICAAQDBAD1AgEA9wMDAAcEBAAOBwUA BgcJAPkEAwD3AAEA/P79AP/+/QAAAAEA//8AAP78/QD//v4A/gD/AP3+/QAAAAEABgMFAAcJBwAC BAEA+Pj5APf1+AD8+/wAAwIBAAEB/wD+/v8A/Pz9AP39/gAAAP4A/v78AP/+AgAAAP4AAAECAP/+ /QD///4A//z+APv//gAA//4AAQD9AP79/gD//vwAAf78AAP9/AD6+fcA9/TvAPXx8QD1+fwA+f4C AP8DBwD/+f8A0NLVAAAEBQD7AQcAAwwUAAEEBgADBQkA/v7/AP/9/AAEBAUAAwUHAAwC/wD8BPkA AgUDAAAGBgD+BP8A//8AAAQCAQADAwMAAgIEAP8A/wAICQoABgICAAUC/wADAgAABAUFAAEA+gD+ /P8AAgEEAAAA/QABAfwACQcBAAsJBQAMCgYACAYDAP///gD5+fsA+/v+AP39/wD///8AAP39AP3+ AAD+//8A+vn3APHv6gD38OYA7+roAPPx9AAAAP8AAQIAAAECBAD+AAEA/f7/AAD//wABAQEAAQAB AP3//gD7/PoA9/j3AN/h4AAE7/AAAAEBAAIDBAD/AQIAAQIDAAL//wAE/wIAAgAAAAEBAAAB/gEA A///AAP+/wAH/wUABf78AAD/AAD7AAEA+gEBAP0CAgD+AQIAAgMCAAcBAQAFAP8A////AAEAAQD+ /v8A/gAAAAL/AQD///4A///+AP///gD///8AAAABAAEAAAAA//8AAAAAAP///wAA//8A//8BAP8A /wAA//8AAAIAAAD+AAD/AP8AAAAAAAD/AQABAAEA////AP///gAA/wAA/wABAP///wD///4AAP8A AP//AQD/AP4A///+AP8AAQD/AP8AAP8AAAAA/wD//wAA/v4AAP8A/wAB/wAA////AAD//wD/AQAA /v7+AP//AQAAAgIA/P7/AAL+/gD+AAEA////AP///wD/AQAA/v8AAP7/AAAAAAAAAQABAP7+/QD+ AP8AAAABAP///wD/AAAAAAACAP0A/gD/AP4ABQQFAAABAQD6+/wAAwIBAAgFAwAMAAEACvz8AAoF BQARBAUA+QAAAPv4+gD8/fwAAAUDAAQDAwD//v8A+vn7AAICAgACBAQA+fn6AP///wAEAwIA//// AAABAQAGBwYAAQD/APv6+gD8/f8ABgYHAAEDBQAB/wIAAP8AAP7+/wABAwEAAgICAP7+/wD5+PkA /v3+AAD9+wD/AAAAAwcFAAYHBAD9/wIAAQIBAAIBAwADAAAA/fz9APz4+gADBgUAAAD+APz6+gD/ //8ABQYIAAIFAwD3+PkA//39AAwCBQAECQYA/wD+APv4+gAEBQIAAwYDAP7//gD6+fwA///9AAUG BgAAAQIA/v/+APv8/AAABAAAAwYFAAIDAwD8/P0A/Pz+AAIEBAADBAIA+fr+APn4/QD8+v0A/v7/ AAIFAgAFCQQAAQIBAPz8AwD6+fwAAQIAAAILBgD8AP8A/f7+AP/7/wABBwEABQYDAAICAQD8+foA APz+AA4KBgACAQUA/v78APv5/AADBAMA/QEGAPX6+gD+AQIAAQIDAPn+/AD9/AAAAAD/AAAAAAAA AQEAAQEBAP///wD+AAAAAAH/AAIB/gD/AQIA////AAAAAAAAAAIA/wEAAAEBAAABAQEA/wAAAAAA AAAAAQEA/gEBAP8BAAACAAEAAQEAAAAAAAD+/wAAAAECAAIAAQD/AP8A/wAAAAECAQAC/wAA/v8B AP4BAQAAAQEA/v8BAAD//wABAQMAAAEAAP4AAAAAAAEAAQACAP///wAAAQAAAAH/AAD/AAD//wAA AAABAP8AAAAAAQEAAAAAAAABAAAAAAAA/v8BAAAAAQABAAAA/gEAAAEBAQABAQEA////AP8AAAD/ AAAAAQAAAP//AAAAAAAAAQH/AP4A/wAC/wAAAQAAAAEAAAD9AQAA/wAAAAAA/wACAAAAAAAAAAEB /wD/AQEA/wD/AAAA/wAAAQAA/wAAAAEAAAAC//8A/wAAAP8AAAD/AP8AAQAAAP8BAAABAP8AAQD/ AAAAAAD/AP8AAAD/AP8B/wAAAP8AAAAAAAQEAAAACQAAAAj//wAA//4A/P/9AP8A/gACAP4AAQAA AP3/AAAAAP8AAAL/AP4AAQD///8A/v//AAH//QAAAAAAAP8BAP//AAD+AAAAAAAAAAAAAQABAAAA ////AP4A/wAA/wEAAAABAP//AAD+//8AAf4AAPz//gAB/wEA/wD/AAEBAAAB/v4A//8BAAACAAD/ AAAAAQABAAD+/wABAQAA/wEBAP/+/gABAAAAAAAAAAAA/gAAAAAA/wD+AP8BAQABAAAAAgEDAP4A /wAA/gAA///+AAEAAAD/AAEA/wABAAEB/wAAAP8A////AP7//wACAAAA////AAEBAgAA//8A/wAA AP8BAAD///4AAQAAAP4A/wAAAf8A/wABAAIAAAAB/gEAAP//AAADAQD8/wEAA/7+AAEAAgAA/wAA //8AAAEAAAD///8A/wD/AAAAAgABAQAA/wEAAAEBAwAAAAAA/wABAAAAAQAAAQAAAAAAAAAAAQD/ AQAAAAEBAAAAAQAAAP4AAAECAAIDAQAAAv8AAAMBAP8AAAABBAMAAf3+AAMCAwD+AP4AAQECAP8A AAABAAEA/wD/AAAAAAD/AAEAAAAAAAD/AAAAAP4A/gAAAAD9/gADAgMAAf78AAEBAgACAAIAAAD+ AAIBAAD/AP4AAgEBAAEAAgD/AQIAAgQCAAH+/wAC/wMAA/4BAP8AAAACAAIA/QH/AAMBAgD/AQAA AAEBAAEAAQABAQEAAAD/AAICAwACAQAABQICAP4DBAAFBAQA/v7/AAECAgD+AP4A/wABAP3/AAAA /wIAAAD+AP/+/QD+AP4A/v8AAP7+AAD8/v0A/wD+AAD+/wAA/wEA/wD/AP/+AAD+AP8AAQEAAP// AAD/Af8A/gEAAP8AAQAAAQEAAQEAAP//AQAAAgAA///9AAABAgAA/wAA/wABAAABAQAAAP4AAAAB AAAABAAAAAAAAAD/AAABAAAAAQMAAAIDAAAAAQAA//8A/wD+AAD//gD9/wEAAP8AAP4BAQAAAQIA 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 AP///wAA/v8A/v//AP8AAQD/AAIA/wD/AP7+/QAB/gEA////AP4BAQD+AAAAAQEBAAABAQAA//8A AQEAAAAAAQACAQIAAAAAAAEDAwAA/wIAAAH/AAH//wD+Av4AAQECAP///wAB/QAA//4AAAL//QAA //0A/wIBAP///wABAAEAAAEBAP4AAQD/AAAAAQABAAIAAQABAQAA/wD/AAD//wAG//4A/wD/AAUB AQABAQEAAP8BAAMAAAABAgIAAQAAAAAAAAADAv8ABAEAAAEDBAADAgQAAPz9AP78+wABAP8A+f8A AAAA/wD9/f0A/AH+AP3//wAAAQEA//8AAP0CAwD8AAAA/AEDAP38/QADA/0A/wD/AAECAgD+AQAA /wABAP0AAAD9AAEAAQIDAP7+/wD+Af8AAAEAAAEFAwD/AAQAAAAAAP/+/wD+/v4A/P38AP/9/gD/ /v0AAAH/AAACAAAAAP8AAAAAAAAAAQAA//4AAAEAAAACAQAAAAMAAAABAAABAQAAAAAAAP//AAEB /gABAAEA//8BAAEAAQAAAP8AAAACAAAAAQD/AQMAAQEDAP8A/wAAAf8AAwAAAP0BAQAAAAAA//// AAD/AwABAQEAAAAAAAAA/gAAAQIA/wMAAAABAAAA/wIAAAAAAAD//wD/AP8A/wIBAP//AQABAgQA /v8AAAABAQD+AP0AAAEBAP8BAwAA//4AAAEAAP8AAAD/AAAAAP//AAAAAAD/AQAA/v8AAAAAAQAA //8AAAICAAD//gD+AAEA//7/AAAA/wAAAP4AAAIAAAD//wD+/v8AAP/+AP7+AQD/AQEAAAACAP4B AwD/AP8AAf/+AAABAQABAQEAAgICAAAAAQADAgMABQUDAAQBAAABAQAAAQMCAAL/AAADAAAAAgIC AAAAAAAFAwEAAf79AAUCAgD+/wAAAgMDAP8BAAAAAQAAAAECAAAAAQACAAEA/f/+AAEFBQAA/v0A AQMBAAD9/wD9/wAA/wQCAAAB/wD/AgAA//8AAP8CAgD/AP8AAAAAAAIBAgABAgQAAQIDAAABAAAA AgEAAwIAAAAAAAADAgMAAP39AAO3sB0bAAAgAElEQVQDAgAAAAAAAQICAAMAAgACAAAAAwMDAP// /QAEAgAA//7+AAMCBAAB/wAAAgH/AAUCBAD+//8AAgEAAAAA/AAB/v4AAgIEAAAAAAADAgAAAf8B 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 AAEA/wD/AP8A/gACAP8AAQAAAP8A////AP//AAD+AAAAAAD/AP7+/gAA/wAA////AP4A/wD//wAA AAAAAP///wD+//8AAAAAAP///wD9//4AAP//AP//AAAAAQAAAgAAAAEAAAAAAAAA/gD/AAEBAQD/ AQAA//4AAAEBAQAAAAAAAAIBAAD/AAABAP8AAQEBAAAAAgD/AQEAAQACAP8CAgAAAAAAAP8AAAQA AAAA/QH/APsBAQD/AAIA/f8CAP8AAAD+AQAAAAH/AP8B/wAAAAAAAAD/AAIBAgD/AAAA/gEDAAAA AgAAAAEAAQIBAP3+/wAAAQAAAAEAAAD//wAAAAEAAAAAAAICAQABAAAA//8BAAAAAAACAQAAAQAC AP//AAABAQAA//8BAAEAAQACAAEA/wICAAAAAAAAAQAAAP8AAAAAAAAAAAEAAQAAAAABAQABAQEA /wD+AAH+/wD/AAEAAP//AAABAAAAAgEA/v8AAP8AAAABAQEAAQMDAAH//wD//v8AAQECAAABAAD9 AAAAAf/+AAD//gABAwIA//0BAAECAAAAAAAA/wAAAAEAAAD//wAAAQABAP4AAAABAQIAAQAAAP7/ /gD///8AAQEBAAD//gD+AQEAAwMCAPz+/gABAQEA//8AAAEBAAD/AAEA//8AAP8AAQACAQEAAQAD AP8BAQACAgIAAQIBAAICAgABAf8AAAAAAAAAAQABAAIA/wD/AP8AAAD+/v0A//7+AP///gD/AP8A //39AP79/gACAgEA//8AAAICBAAA/vwAAP8CAAEAAQACAgMAAgMCAAQEBAD+AP8AAQABAAD/AAD+ /v0A/f3/AP8B/wAB/voAAv8AAAL//gAAAAAAAP//AAH/AAAAAAAAAAAAAAAA/wABAAAAAwECAAAB AQABAQEABAIDAAMGBQADAwEA+vz8AP0AAQD+/AEA+QD+APr8/AD8/f0A/P3+AP0B/QD+AAAA/QEB AP78/QD//gIA/f3+AAADBAD/AAAAAAEAAP4BAAAAAAEA/wABAAAAAAAAAP4AAQEAAAQEBAAAAAMA AwQEAAADAgACBQUAAAAFAAD7/QD7+/sA/P37AP39/AAA/wEA////AAEBAAAA//4AAAEBAP4AAQAA Av8AAP8AAAEAAAABAgIA//z8AAEC/wAAAAAA//4BAP8BAQACAAAA/wAAAP8AAAABAQEAAQMDAP3+ /QAA/v4AA//+AAH+/gABA/0A/P7/AAP/AQD///8AAAEAAAEA/wACAQIAAAABAAABAAD+AAEA/gAA AAEAAAAAAAAAAP//AAAAAQAAAQEAAAEAAAEAAgABAgAA//8AAAEBAAAAAQAAAAAAAAEAAQABAQEA AAH/AP8BAAD//wAAAAH/AAH/AQD/AP8AAQD/AP8BAQAAAAEAAgABAAAA/wABAf8AAAEAAP8C/wAE AQAAAP4BAAIBAAABAQAAAgQDAAQCAQABAgQAAAH+AAAAAAACAgMAAQIBAAAAAQADAwIABAAAAAMB AQD/AQEAAQIBAAH/AAACAQEA/wIBAAAAAAACAgAA/v38AP4CAgD8/wAAAwQFAAAAAAD+//8A/wH/ AAIBAQD+AgEA/v4DAAEFBQD9/QAAAgUEAAD//wAC/wEAAQMDAAEB/wACAf8AAAD/AAECBAABAAIA AgH+AAIBAQAAAgIAAgIDAAEBAwADAgEAAwEAAAIA/gADAgMAAP/+AAUCAgAA/wAAAQECAAQCAQAC AAEAAgMDAP/9/AAFAf4AAPz7AAIAAQABAQEAAv//AAMC/wD///8AAQH/AAD+AAADAQEAAv/+AP// AQAEAQIAAf4AAAL//wAAAAAAAQH+AAUBAQD///8ABP//AAAA/gAC/wAAAv8AAP/+/wADAwEAAQED AAEBAQABAgIAAAECAAECAgD9/QIA/QMDAAAB/wABAgMA/QQFAP0BAQABBQQAAAEBAAEBAgD+AQEA /gIDAP8EBAD+AP8AAQIBAAECAgD9AP8AAgQGAP4A/wAAAwIAAQEBAAIGBQAFBAUABgYHAPj4+gD4 +PkAAAABAP3+AgD9//4AAAcDAPv8/AD//f4AAP//AAUFAgAD/gIA+voAAPr7AAD4AQAA/v8EAP4B AwD7/AAA/v/+AAIC/gAHAwMABQQCAAEDAgD/AwQA+fj6APPz9AD39fUA/v8AAAEDBwD///8AAf/+ AAEBAQD/AgIAAQEAAAIBAgD+//0AAQEBAP//AAD/AgIAAAAAAP8A/gD+/wIAAQEFAP/+AQD6/PwA /f7/AP8B/gAAAP8AAf/9AAEBBAABAQEA///9AAH+/wAAAf4A8/8AAP7//AD+/QAAAgICAAEAAAAA AAAA/wAAAAEAAAD9/gAA+AEDAPwAAAD4/f8A+/78APj89ADv//0A/f78AP//AAAAAAMAAQACAAEB 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 //8AAAEBAP8BAAD+Af4AA/8AAAEA/wD/AP8AAf/9AAUBAAABAQAA/wD/AAH/AAAAAgEAAgMCAAMC BQAGBAQABwQGAAMCAwD/AP8A/QD/AAD/AQD+/PsA/v/8AP7+/QAA//4A//4AAP///gD+/vwAAP/+ AAD//gD+AAAAAAEBAAEA/wAD/wEA/wEBAAIB/QACAgEAAgQEAAQDBQAGBgYABQUFAAICAgD8/vwA /P38AP38+gD9/fwA/f7+APz+/gAA//4A//79AAD/AAD9AgAAAwAAAAIBAgADAwMAAAMDAP4AAAD/ /gAAAQABAP7//wD/AgAABwcEAAUFAwAEBQUA+/38AP3+/QD+/AQACQICAPz/AAD9/f0A+/v7AP4A AAD8/PwAAQICAPz8+wAAAgIA+wD+AP3+AAD///8AAP7/AAAAAAAB//4A/wD/AAAAAAAA/wAAAP// AAL6/gAA/wIAAPz8AAEEBAADBgIACAcGAAgICgAB/f4A+vr5APb39QD8/QAA/P/+AP8A/wAAAAMA AAECAP8AAQAAAgEAAP/+AAEA/wAAAQEA/wIEAAAAAAD///8A/wQBAAABAQAA//0A/v8AAAAAAAAB AQIAAAECAP0AAAABAgIAAv7/APwA+wADBAIA/P7+AAICAAD+/gAAAAEAAAEBAwAAAAMA//78AAAA AAD+AAEA/QAAAP8A/gAAAQAA/wACAPwA/gABAP0AAP77AAAAAAAB/v4A/wEBAAEA/wAB/v4AAAEC AP7//gAAAAEAAAAAAAMDAgD9//8AAAABAAEA/gD//vsAAQEAAAH//wAEAgIAAwEBAAQCAgAAAgAA AAIBAAEBAQAFAQQAAf7+AAQCAQADAgAAAgAAAAQCAQAB//8AAAEDAAABAwABAgIAAQIBAAEAAQAB AQIA/v/+AAACAgD/AQEAAQICAAD/AAAAAAAA/wIBAP8BAAABAwMAAP4EAAADAQADAAIAAAMDAAEB AAAEAAAAAQEAAAEA/wABAf8A//4AAAUEBQAE/QIAAwMDAAL//gABAQEAAgICAAAAAAADAf8AAgEA AAEAAgD//wAAA/8BAAICAAD+Af8AAwL/AAMA/wAEAQIAAAD/AAAAAQAE/wAAAP/+AAT//wD/AAAA AgD/AAL+/wAB//4AAQAGAP78/QAGAf8AAPz7AAT//QAB/wIAAAAAAAID/gAB/vwAAwEBAAH+/wAB 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 AAAAAP//AAEAAgAAAQAAAP8AAAAAAAD+//4AAAAAAAH/AAD/AAAAAQAAAAD/AAAAAQEA/wAAAP// AAADAQEAAAAAAAABAQABAQEAAAAAAAAAAAABAQEAAQEBAAAAAAAAAAAAAAAAAP8BAQACAQEAAgEB AAEBAQD//wEA//8BAAAAAAD///8A/P78AP4A/wAAAgEA/vz9AP79/QAAAAEA/v8AAP8AAAD///8A AQAAAAAAAAAAAAAAAP8AAAH/AAAAAAAAAAAAAAQEAQEABwMEAAUCAwAAAf8AAAMCAP7+/wACAQMA /wH/AP/9AgABAQAAAQEDAAD/AAAAAQEAAQECAAIBBAD+//4A/gABAAICAgAAAQEAAQD/AP7+/wAB AgEA/v8AAAEAAAAA/wAAAf8CAAACAQD/Af4AAAAAAP8CAAABAgAAAP4AAAMBAgD///8A////AAL/ AAAAAAAA/wEAAP4A/wD+AAEAAAABAAAAAQD+AgAAAf8AAP//AQD+AQEAAwAAAP8A/wD+AAEAAAEC AP///wACAQEA/gIAAAAAAQD/Av4AAAIAAP4BAQAA/wUAAQABAAIA/gD9AP4A/wABAAEBBAAA//8A AAAAAAAAAAD/AP4AAAEAAAEAAAAAAAAAAP8BAAAA/wAA//8AAQH/AP/+/wAB/wEAAgIAAP///wAC AQEAAgEBAAcEBQAFAwMABQUEAAYEBQADAwEAAP7/AP///QD++/wA+/z8AP7+/gD8/fsA/v7/AP3+ /QAAAf8AAf//AAEAAwAA/wAAAQEBAAEBAQABAAAA/f8CAP4CAQD7BAAA////AAcGBwACAQMAAwQG AAMFAwABBQIA/QIBAPj7+wD5/PsA+vv7APz8/AD//wAAAAICAAICAAD///8AAAAEAAAAAgAEAwQA BAQEAAYEBQAEBQQAAgMBAAEAAQAA/wIAAAABAP///QAAAAAABAQCAAEDBAD///8AAwICAAD//wAA Bf0AAgICAAEAAAACAAEA/v39AP7//wD9/v4AAwEBAP38/AAAAf8A9fn5APj6/gD9/gEA/wIDAP8A /wD9AP0AA/7+AAIA/wACAAAAAAD+AAD//wD+AP4AAAD+AAH+/AAB+QQACAQIAAkLDQABAP8A/QT2 APX8/QD5//sAAv//AAIA/QAA/v8AAAD+AAABAQAA//4AAP//AAD/AQAAAv8A/gAAAAEBAAABAP8A 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 AAMA+wD+//8A/gD/AAICAgAAAAAAAP3+AAIA/wABAQMAAf/+AAEBAQD///8AAQMCAAABAAD///4A AwIDAP8AAQAEAwQACQcHAAoICQAGBQUAAwMDAP7+/gD6+vkA9vj3AP39/QD9/f0A/f/+AAAAAAD/ AAIA/gH/AP8DAgAAAAEAAv8BAAACAQD+Av0AAP/9AAAAAwD///8AAAEAAPz/AAABAQMABAICAAMI CQAEBAQABAQGAAAAAAD9Af4A/f39APv9/gD7/wAAAQMEAAUEBQAB/wEAAAAAAP//AAADAgAA/wAA AAMDAgADBAUABgQEAAUCAwACAgAAAQIBAP8AAAD//gAAAgACAAD//wD+AP0A/wEAAP//AgD/AwEA /gACAAQDAwAA//8A/QAAAAIAAQABAAAAAAT/AAECAgAD//8A//39APsA9wD6/fsA8v3/AP4A+wAD //0AAv//AAABAAAFAAAA/wIDAP0AAgD9AAEA/wACAAEAAgACAQAABgL/AAcDAwAJBwMACAf5AAYB +gD3+voA9/n9AP//+wAEA/8A/AADAPwBBQAAAAEAAQAAAP8BAQAAAQAAAQD/AP/+/gAEAgUA/f79 AAICAAD///8A/v4BAAAAAAAA//0AAQAAAP8BAAD//wEAAwIDAP7+BAD9//wAAgEAAP4AAwD9BQQA /f39AAIBAQD/AAEAAAABAAAAAQACAQIAAQD/AP8AAAAAAP8AAgIAAAEAAQD///8ABwICAP8AAgAC AgEA/vv9AAQDAwAAAAAAAAAAAAIDAwD//vwAAP8AAAEA/wADAQEAAAAAAAACAgD/AAEAAAEAAAH/ /wAA/wAA/wICAP8A/QAEAwIAAv7+AAIBAAD//wAAAgAAAAABAQAAAgIA/wD/AAEBAQACAgIA//8A AAABAQD+/v4AAgICAAABAQAAAQEA/wD/AAAAAQACAwIA/wD/AAIBAgD9//4AAgIBAAIAAgD/AP0A AQABAAD//wAC/QEA/v4BAAP8/wD9/v8AAgIBAP8BAAABAgAAAQADAAH//gADAP8A/v/+AAL/+wD9 /fsABgIDAAD//wAAAAIAAgP7AAH//gACAf8AAf//AAABAQD//v8AAgD+AAMAAQABAAIAAQICAAH+ /wAFAQAA/wD+AP///wAEAwQAAP7+AAMAAQABAP8AAwMCAAEA/wD//v4AAwIDAP3+/QAFAwIA/vv8 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 AP///wAAAAAAAAEAAP8BAAD///8AAAABAAEBAQD///8AAAAAAAEBAQD+AAAA////AAAAAAABAQEA ////AAAAAAABAQEAAAAAAP///wABAQIAAAABAP///gD//wAAAQEBAAEBAQD9/f0AAgICAAEBAQD+ /v4AAAAAAAEBAAD+/v8AAP0BAP8AAQD/AP4AAAD/AAEAAAABAQEAAQEBAAADAgABAQEAAP8DAAEC AAACAgMAAwABAP7+/gD+/v0AAf8EAAL+/AD+AfsA//4FAP8CBAAAAQEAAAD/AAT9AQAA/AUEAP8G BQAAAAEAAf0GAAD/AAD8AgcAAQD/AAD+BwD/AAAAAQIFAAABAQD+/QUAAAECAP8D+gAC/AQA/wAA AAABAAACAQMA/wABAP7//gD+AP4AAQAAAP4AAQAAAAAAAAABAP8A/gD/AAIAAwD/AP8DAgACAgYA /AL/AP8A/wACAQEA//4CAAAA/wAAAQAAAgABAAD//wABAQAAAAAAAAAAAAABAQIA/QD/AAABAQAA /wAAAP//AAH//wABAAAAAQIAAAAAAQACAQEA/v3/AAECAAACAAMAAQAAAAIBAQABAQEAAgD/AAAA AAADAAIAAQD+AAL//wD/AAAAAAABAP8A/wABAAAAAgD/AAEAAQACAQIAAf8AAAIBAAAA//8A/wIA AP7/AAAB/wEAAAMCAAAAAAAHBwcACwsLAAUFBgD//wAA/wAAAPn4+AD0+voA+P38AP0BAAAABAQA /wAAAP8BAQD//f8AAQH/APz+/gAB/wEAAQECAAEBAAD+/gIAAAAEAAD//wD/Af4AAQEBAP4A/wAC BAYA/wABAPcCAgD5/wEAAfz8AP/+/gABAP4AAQEBAAQFCAADBwMAAgMCAAIBAAACAAMAAwICAP4B AQADAwAAAQEBAAICAgABAQEAAv8BAAAA/wD+AP4AAQEBAAAAAAD///8A/gAAAAD/AAD/AQAAAAAA AAEAAAAFAgIAAP/+AAICAQAAAQEAAAAAAAD//wABAAAA/wAAAAECAgD9/v0A+fj5APv9AQD8AgIA AwoIAAT/BAD//fwAAP/8AAIBAQD//wEAAgECAAIBAQAAAAEAAQIDAAMCBAACAwMACQQDAAYDAgAE Av8A/P77APj69wD4/PoA9v/+AP4GAwABAgAAAQADAAEBAwD/AAEAAAEBAAH/AAAAAQEAAAEAAAH+ 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 WT8mADgjEQAFAf4A/gEDAP8AAAAD//8AAAAAAP4AAgD/Af8AA//9AAAAAgD/AQEAAAD/AAAA/wAA AAEAAAAAAAAAAAD/AAAAAAABAAEAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAABAAEA/wAAAAD/ AAAAAf4AAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAEAAAEAAAAAAAD/AAAAAAD/AAEAAQAAAAAAAAAA AP8AAAAAAAAAAQAAAAAAAAAAAAAA/gAAAAAAAAAAAAEA/wD/AAEAAAABAAAA/wAAAAAB/wAAAAAA Af8AAAEAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAB/wAAAAH/AAAAAAAA AAAAAAAAAAD/AQAAAAAAAAAAAAAAAAAAAAEAAAH+AAAAAAAAAAAAAQABAP///wAAAP8A9vb4ANbV 1wD/AQIA/wAAAAEAAAACAAAAAAAAAP4A/gD+AAAA/wABAAAAAwAC/wAAAQH/AAAB/wAA/wEA/wAB AP4AAQAAAP8AAv8AAAIBAQAAAP8AAQAAAAAAAAAAAAAA/wD/AP8A/wAAAQAAAf8BAAIAAAABAQAA AQAAAAEBAQD///8AAAABAAAAAAABAQAAAgABAAD//wAAAP8AAAIBAAAAAAD//wEAAQD+AAABAgAA AAAAAQEBAAAAAAD///8A/wAAAAAAAAACAQIAA/8AAAIA/wD+Af0AAQAAAP8AAAAB/wIAAQACAP/+ /gABAP8AAQH/AAABAQD/AP8A///+AP8AAQD//wAAAP/+AAEBAAACAgIAAwABAP4A/wD/AQAAAAAA AAAAAQADAAAAAf8BAP8BAgD/AgAAAAAAAAD/AAD///0AAQIBAAH//wAB//8AAAEDAAD//wAAAQEA AQAAAP7//wAAAAAA////AAECAgD6AgEA7/r5APb7AAD/AAIABAIBAP7+/QAA//4A/v//AP///wAC AgEAAP7+AAAAAAAAAgMAAAABAAD//QD//v4AAAABAAAB/wD/Af8A/wAAAAIBAwACAAEA//7+APz9 +gAKAgQACQUFAAUBAQAB//0AAAAAAAEAAQAAAAEA/wH/AP0A/gAC/gIAAwABAPwA/QD8AP0AAP8D AAQCAgADAf4A/v//AP4AAgAAAAEA/v/7APn5BAD08RMA+/QOAP7/AgD///8AAAAAAAAAAAD/AAAA AQAAAAEAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAAAAQAAAP8AAAAAAAAAAAAA/wAAAAEAAAAB /wAA/gEBAAAAAAABAP8A//8AAAEAAAAAAAAA/wAAAAEBAAAAAAAAAP8AAAACAAAB/wAAAgAAAAH/ AAABAQAAAP8AAAIBAAACAQAAAQAAAAEBAAABAQAAAAAAAAAAAAAAAAAA//8AAP4AAAD//wAA//8A AAEAAAD+AAAA/v8AAP4AAAD+AAAA/wEAAP3/AAD+AAAAAAEAAAIAAAAA/wAAAAAAAAD/AAAAAAAA AQIAAP//AAAAAAAAAQAAAP4AAAABAAAAAf8AAAABAAABAQAA/v8AAAAAAAABAAAAAQAAAP4AAAAA AAAAAQEAAAD/AAD+AAAA/wMAAPwAAAD9/AAAAv8AAAIBAAAAAQAA/QAAAP//AAAAAAAAAAAAAAEA AAAAAAAA/wAAAAEAAAABAQAA//8AAP8AAAAAAAAAAQEAAP8AAAAA/wAAAAAAAAAAAAAFBwAADxAA AAMHAAD18QAA+/UAAAD+AAD/AQAAAP8AAAEAAAABAAAAAAAAAAAAAAACAQAAAQAAAAIBAAAC/wAA AgAAAAME/wADAwEAAgIAAAP/AAAEAP8AAgABAAACAQD8A/8A/gP/AAEAAQABAAAA/gEAAP0BAAD/ AAAAAQAAAP0BAQABAf4AAAAAAP//AgABAQAACAkBACAfEAAVFwcAAQH6AP//AgABAAIAAP//AAEA /gD+AAAAAAACAP///gACAf4AAgAAAP///wABAAAAAQAAAP8AAAD/AAIA/gACAP8A/gABAAAAAAAA AP8AAQAAAQEA/wD/AAL+/wAAAP4AAAAAAAH//wD/Af8AAAABAP8BAgABAAEAAQAAAAAAAAAAAf8A Af8AAAAB/wD+AAMA/gECAAH//wAAAAAAAAAAAP8AAQAA//8AAAAAAAAAAAAAAP8AAAEAAAD/AQAA AAAAAAAAAAABAQABAAAAAAAAAP///wABAQEAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAD/AAAAAP8BAP///wABAP8AAP// AAIAAQAAAAAAAQEAAAEB/wAAAAIAAQEBAP//AAAAAQAA/wH/AP8BAQAAAAAAAAAAAAD/AAAAAAAA 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 AQD8/v8A/gH/AP//AAAB/wEABAEDAAQCAgAAAf8AAQAAAP8AAAAAAAAA////AAICAQACAgEAAP4A AP//AAADAgIAAQEBAP3+/QAD/wEAAwQBAAL/AQABAgAA/gAAAPz9/gD8/v8AAQAAAAUDBAAFAgEA BQEBAAQA/wABAAAA+v7/APz9/gAEAgIAAP3/AAECAAAAAf8A/QIAAAEBAQD//v8A+vz9APz8/QAA /v8ABAQDAAUDBAABAQAA+/7+AAED/wACAQIA/P39AAAAAwAAAQEAAAAAAAMCAQAC//8A/wD/APz9 /QACAQIA/wICAPz9/gACAAAAAwABAAICAQD/AgAA+f39AP/+AAACAgEA/f39APr9/QD/AgEAAQAC AAD//gACAgEAAAEBAPz8/gABAgMAAP/9AAEBAAD///4A//8AAAIBAgACAgIA/P7+AP7+/wABAAEA AQEAAP8CAAD9/f0AAAABAAUDBAABAP8A/Pz6AAUCAwADAQIAAf8AAP8BAAD/AQAA/v8AAP///gAA AAAA/wD/AAUAAgADAQIA/P/+APf9/AABAQIACgUGAAgGAwD+/f4A/P4BAPv9/wD3+/cA6ejzAPHl BQAF9hUAAQAEAP8A/wAAAAAAAAAAAP8A/wABAAEAAQD/AAAAAAD/AAAAAAABAP8AAAAAAQAAAAAA AAAA/wAB//8AAAEBAAAAAAAAAAAAAP8BAAAAAAD/AQEAAAAAAAH//wABAP8AAQAAAP8AAAD/AAAA AAAAAAABAAAA/wEAAAH/AAAAAAAB/wAAAAAAAAAAAAD/AAEAAAAAAAEAAAAAAf8AAAAAAAAAAQAA AP8A/wAAAP8AAQD/AAEA/wH/AAEAAAD///8AAgABAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAABAP8B AAAB/wAAAQD/AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAAEA/wAAAAEAAf8A AAAAAAAAAQAAAAAAAP8AAAAAAAAAAQEAAP/+AQD/AP8AAQEAAAEAAAD/AAEA/wAAAAAAAAABAAAA AAD/AAAAAAAAAQAA/wAAAAAAAAAAAAEAAAAAAAD/AAAAAAAAAAEAAAAAAAAAAAAA//8AAAAAAAAB AAAAAAH/AAAAAAD/AAEAAAAAAAAAAAAB/wAA/wEAAAH/AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAD/AAD//wAAAAAAAAABAAAAAAAA//8AAAL/AP8AAgAAAAEAAQD+AAH/AAD9AQEA/wAC AAEA/wACAP4AAQAAAP8AAgD+AAAAAAEAAAH/AAABAAEA/wABAAEA+wAAAAAA/wAFAAEAAAATFQQA BkUqABUXGgAAAP4AAQABAAD/AAAAAAAA/wAAAAAAAAAAAAAAAQEAAPD3/wD5/gIAAAABAAEA/wAA AAEAAgEBAAkFAgAJBAAAAQECAP8AAQD/AAAAAgD+AAAA/wAAAP8A9PwCAPj5/QD+AQMAAAAAAAEB /gABAQAA////AP8AAAAAAAEAAAAAAAABAgD//wAAAwH+ABAIAQAHAfoA/gEEAP4AAAAA/wEAAQD/ AAEAAAD/AAAAAAAAAAAAAAD///8AAP8AAAAAAAABAQEAAgAAAAAAAAD+/v4AAgEBAAD//wAAAAAA AQEBAAD//wAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAA/wD/ AAIAAAAAAAEAAAAAAf8AAAEBAAEAAAAAAAEAAAAAAP8BAQD/AAAA/wEAAAD/AAAAAAAAAgIBAAAA AAACAAAAAAD/AP4A/wAAAAAAAAAAAAEAAQABAAEAAAAAAP4AAAAAAf8AAAD/AAAAAAAAAAEAAAAA AAAAAAAAAP8AAAABAP8AAAAAAAAAAQAAAAEAAAAAAQAAAf8AAP8C/wAA//8AAQEBAAABAAABAP8A AP//AAAAAAD/AP8AAAAAAAAA/QAA/wAAAQAAAP8AAAACAQAA/gH/AAAAAAD/AgIA//4BAAEAAAAA AAAAAAD/AAD/AQAAAAAAAQH/AAAB/wABAQEA/wAAAAAA/gAB/wAAAAD/AP8A/wADAQEABgP/AAEA /gABAAAA/wAAAP//AAAAAQAAAQD/AAEA/QAAAAAA/wACAAABAQD/AAAAAQABAAEA/wD/AAIAAAD/ AAAA/wAAAP8AAAABAAAAAAAAAAIAAAD+AAAA/wAAAP8AAP//AAABAgAAAAAAAAH+AAAAAAAA/wAA AAAAAP8A/wAAAAAAAQACAAEAAAAB/wAA/wD/AP8CAQD/AAEAAf8BAAH//wABAP4AAAAAAP8BAQD+ AQEA/wL/AP8BAAAAAAAAAQD/AAD/AAABAQEAAQAAAAAAAAAAAAAAAAAAAAH/AAAA/wIA/wL/AAAA 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 Af8A/wAAAAAAAAD/AAAAAAABAAD//wAAAAEAAAABAP8A/wD/AP4AAQABAAAAAQAAAAAAAAAAAAAB AAD//wAAAQAAAP8BAAAAAAAAAQABAAD//wAAAP8AAAD/AP4AAQABAAIA/wH+AP8A/wAAAAEAAQAA AP8AAAD/AAAAAQAAAAEAAQAAAAEA/gAAAAAAAAABAP8A/wEAAP8AAQAAAP4A/wAAAAAAAAAAAAMA AAH/AAEAAAAAAAAA/wABAAABAAAAAAAA/wAAAAEAAAAAAP8AAQAAAAAA/wD+AAEAAAAAAAEBAQAB AP8AAQAAAAAAAAD/AAAAAAABAAIA/wAAAP4AAAD/AAD/AAAAAQEAAQD/AAD//wABAP8AAAADAAAB AQAAAP8AAAAAAAAAAAAAAAAAAAABAP8AAAABAAAAAP8BAAEA/wAAAf8AAAD+AAD/AAAAAAAA/wD/ AAAA/gABAQIAAP8AAAH//wAAAf8AAAD/AAAAAgD+/wAAAAD/AAAAAAD/AAMA/wABAAEB/wAA/gAA AAABAAEAAgD/AP4AAAAAAAEAAAAAAAAAAQAAAAAAAQAA/wEA/wABAAABAAAAAAAAAAAAAAABAAD/ /wEAAQD/AP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAP// AAABAQAA//8AAAEBAAAA/wAA/wAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAAAAAQAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/ AAAAAAAAAP8AAAABAQEA/wD/AAAAAAAAAAAAAAAAAAAAAAD/AAAAAAABAAAAAgD/AQMAAAAAAP8A AAAA//8ABP8AAAAAAAAAAgEAAP8BAQD/AAEAAgAAAAAA/wD/AAIA/wAAAAEA/wAA//8A7fT4AMrX 4ADU4+wA+QD4AAH/BAAC//0A/wAAAP8AAwAKBwEAIBYNABIOCwADAf0AAAABAAAAAAAB//8AAAAA AP8BAQAAAAAA///+AOv1/AC/ytQA1ufyAP4AAgAC//wAAQAAAP8AAwD/AAAAAQAAAAAAAQD/AQIA AAD/AAAA/QAA/wAAAAEBAAD//gAAAP8AAQECAN7n7gDj6+8A9jIlADUnGgAMBwMAAAACAP8AAgAB AQAAAAD/AAL//wABAAEAAAEBAAEAAAD/AAIA/wAAAAAAAAABAQAAAQD/AAEA/wABAAAAAAABAAAB AAD/AAEAAQD/AAAAAAABAP8AAAAAAAAAAQAAAAAAAQEAAAH/AAD+AAAA/wAAAAABAQAB/wAAAAAA AP8CAAAA/wAAAP//AAIBAgD/AAAAAAAAAAAA/wABAAEAAP//AP8B/gAAAf8AAQABAP//AgABAf8A ///+AAAAAgAA/wAAAQD/AAEAAAD/AAAAAAAAAAEBAQAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA//8AAAEAAAABAf8AAAH/AAH/AAAAAP8A/wD/AAAA /wAAAP4AAf8BAAEAAAAAAf8AAgD/AAAAAQAAAAMA/wD+AAAAAQD+AAIAAAD/AAH/AAAAAAIA/wED AAAA/wACAP8A/QAEANvr+QCxxtgA+QINAAAAAAAKBgMAJyQgABwbGQD2/wUA+gANAP8BAQDa6fIA y9vsAPD4BAAB//oAIA/9AGROOAAQBPoA8f4DANvyCgAAA+EAAP4EAAEA/wAFBgYABAQDAAAA/gAA /wIA/gABAAEAAAAAAAIAAAABAAAAAQAAAP8AAAABAP8AAQAAAAEAAAD/AAAAAAAAAAAAAAAAAAAA /wAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAA/wAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAQD/AAEAAQD/AAAA/wAAAAEA AAABAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA/wAAAAEBAAEAAAAAAAAAAAABAAAAAQAA AAAAAAAAAAAAAAAAAAAAAAD+AAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA AQABAAEAAP8AAAAAAAABAAAAAQAAAAH/AQD/AQEAAP//AAEA/wD/AQAA/wABAP3/AAACAQIA/wAC AP/+/wD9/wAA/v8CAAAAAAD/AAEA/wACAP0AAAD///8AAQD/AP3//wD+AAAA/f8BAP8ABAAAAAEA /f/+AAEAAQAB/gMA/v//AP/+/QD8AP4A/QD+AP3+AAAA/v8AAf//AP0CAAADAAMA/v//AAEB/wAA AAAA/v//AAAA/wD9/v4AAgEDAP4AAAD//f4A/f7+AAQCAgAEAgEA/f7/AP//AAABAgAAAAABAAMB AQD+//8AAf8CAAIAAQAD/gEAAAEAAPwAAAABAAAA/v8AAAIBAgD/AAAA/wAAAP39/gABAgEAAwID AP4AAAD8/f4A//8BAP4AAAABAP8AAAEAAP//AAD+/v8AAQIAAP8AAQD9/wAAAgIDAAH//QAC//8A AwEBAAEBAQD8/gAA//4AAP//AAACAAEAAQAAAAD//wD8//8AA/8AAAMFBQD7/P4A/Pv/AAD//wD+ AP4A/f79AAEBAwACAAIA/gABAP4AAQABAP8AAQEBAAICAgABAgIA/QAAAAEC/wD///4A//8BAAD+ AAAAAAAAAAECAAEBAAD/Af8A/wIBAP7+AAD+AAIAAgECAP3//wD+AAAA/wICAP3//wAD/fwAAgAB APz+/gD6/f0A+/7+AP/9/QD+AgIABwECAP0B/QAA/wEA////AAQBAgAAAAAA/wD/APr7+wAB/v8A AQABAAYFAgANAwsA/A70AAsJ+QAGBfYABgUEAP8AAAAAAQAAAf8BAAAAAAD+//8AAAD+AP79/AD/ /fsA/v7+AAEA/wAAAAAAAAAAAAICBAABAwcAAQMDAAEA/wAB//0A//39AP///gD///8AAQIAAAAC AwAAAQMAAAAAAP37+wD+/PsA/v3+AP7//wABAgEAAgICAAABAQACAQIABAUGAAEEBAAA/wEAAQEB AAABAAAAAAAA//8AAAAAAAABAQAAAAAAAAH/AAAB/wAAAAAAAAAAAAD/AQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAD/AAAAAQAAAAAAAAAAAAAAAf8AAAAAAAD/ AQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAD/ AAABAL6AagsAACAASURBVAAAAAAAAAAAAAD/AQAAAAAAAAD/AAABAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA 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 DAADAgMAAAH8AAEA/wAAAAMAAAACAAIA/wAAAAAA//8BAAABAAAAAP0AAP8AAAD/AgAAAAAAAAAA AAABAAABAP8AAP//AAEA/wAAAAAA/wACAP4BAwAAAf8AAv7/AAMA/QAAAAAA/wH/AP8BAQD/AQQA /gAAAAAAAAAAAP4AAQD/AAAA/QAC//8AAwAAAAH+AQD/AP8AAAAAAAEBAQD//wAAAAAAAP8AAAAC AAAAAAAAAP8AAAD+AAAA/wABAP4BAQAAAAEAAf8AAAH//gD/AQAA/wAAAAAAAAAB/wAAAQAAAP8A AAD/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAP//AP39/QD7/PwA/gAB AAMCAgD///4A//8AAP///wD/AQAA/wAAAP/+/wD/AAAAAP8BAAD//wACAAAAAAEAAAEA/wD+AP4A AAACAP//AAABAAAAAAEAAAAAAAD///8A//8AAAD+/gD/AgIAAP8BAAIA/QAA/wEA////AAEDAQAK DAwABgYHAAQAAgAQEA4ACxAOAAcKCQADBQMA/fv8APwFCgDy+fUABAMCAP36/QAA/f4ABAABAAL/ /wAAAAAA//8AAAAAAQAB/wEAAP8BAP79/QACAgEA//8AAPz8/gACAAEAAAEAAAAA/wD/AAAAAP8B AAEAAAACAgQAAAEAAAACAAACAAAA//8CAP//AAAAAP8AAAEAAAAA/wD//wAAAP//AAIA/gADAwMA /gMEAPUA/wD/Af8ACAICAAYEBQABAgAA/QH9AAEBAQAC/wEAAwEEAPr9/gD9AQAAA///AAUC/wAA Av8AAQACAAH/AQAC/wAA/wAAAAEBAQAEAAAA/v7/AAQDAQD///8AAgECAPz9/gAC/wEAAAIAAAD+ /gD/AQAAAAAAAAD+/wABAgEA/wEAAP7//gD9/gAA/AABAAEAAQAA/v8AAQH/AP3//gD7//4A/AD/ AP79/AD89vYA8O/uAOnn5wD5+PUACAcHAAEFAwACBgcAERAGAP4BAgD/AAAAAv//AA0FBgD+AQAA AAD9AP4BAAD+AAAABQADAAMEAwABAgEAAAD/AAAAAAAAAAAAAQEAAAAAAAAAAAAAAAEAAAECAAAA AgMA/gACAP8AAgAA/wMA/v0BAP79AAD9AP4A/QD/AAEAAAD8/P8A+Pn8AP39BAAAAAAAAQEBAAEB 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 AAEBAP8CAAAABAMA/wQDAAL/BAAHBQAAAQMBAPoDBAABBgUAAAQFAAEBAgABAAEAAAAAAAEA/wAC AAAABQECAAIDAQD+AgMABAP+APv7/AD8/QAABAMEAAQCAAD5+fkA9/4AAOr0+AD2/wIAAAUFAAD7 +gACCAgADg8XAA8JAAD/9/UACAgFAAQHBwD+/PwA/fr6APkA+QD/AQMABAICAAgGBgD+AgMA+/X+ APH9BgDu7/gA7PLiAPPy8gAoHxUAEg8OAAIAAAAB//8A/v7+AP0AAAD8/f0ABgMCAAYCAwAFBAMA /wACAAEBAAAGAwQABAABAAAAAAAAAAAAAAABAAD/AQAAAAAAAAEAAP8AAQAAAgMAAAEBAAEA/gAB //4AAf/+AAEA/gABAP0AAf/9AAAB/QD///wAAQD/AP4A/wD///8A//8AAP8AAAAAAAAAAQH/AAEA /wAAAP0AAAD8AAD//QABAP4AAAD/AAD//wAAAf8AAAD/AAEA/gAAAP0AAAD/AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAAAQAAAgAAAQEAAAMBAAADAAAAA//+AAD+/gAC/v8A Af8AAAEAAQACAAEAAv//AAP//gABAP4AAgABAAMA/wAA//8A/v7+AAEBAQADAQEAAv//AAEAAAAB AP8AAf8AAAL//wACAf8AAP//AAD/AAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABAP8A AAAAAgEA/wEAAAAAAQAAAAAA/wH/AAEBAAACAAIAAP//AAEBAQAA/wAAAAD/AAH//wD///4A/gAA AP8BAQD/AQAA/wEAAP//AAD/AP8AAAH/AAAAAAAB/wAA//8AAAAAAAD/AAAAAQAAAAAA/gAAAAIA AAAAAAD/AAAAAAAAAAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAQD+AAAAAgAA AQAAAAAAAAAA/wAAAAAAAAEBAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAA AAAAAAAAAAAAAAAAAAEBAQD///8AAQEBAP///wD///8A////AAEBAQAAAAAAAAAAAP//AAAAAAAA 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 ///+AAL+/wABAAAA+//8AAD+BAADAQMA+wAFAAUECAD/BQIA//8AAP8AAAACAQEA/v//APz/AgAB AAMAAQECAP8CBAD/AgMA/gIGAAABBgD+AgUA/gAGAPz7AwD+//8AAAD/AAAAAAAA/wAAAAAAAAAA /wAAAP4AAAD+AAD9+wD37+UA+O7iAAX/8gD9/PQACQL0AAT8+QD9+O0A+/77AAAFHAAB/woAAAD/ AP///gAC/wAAAwAAAAP//QAA/wEAAAIDAP4AAAAAAP8A////AAAB/gAC/wAAAwH/AAECAQACAAAA /v7/AP8AAAAA/wAAAP8AAP8BAAABAAEAAAD/AAAAAAAAAAAAAQABAAAAAAAAAAAA////AP3//wD+ AQEAAf8AAAEAAQAA//4AAAABAP7+AAD+AAEA/gECAAAAAgD+//4A/gABAP3/AQD9AAAA/gABAAAA AQAB/wAAAQECAP4B/gABAQEAAQAAAAAA/wAAAAEAAAAAAAH/AAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA/wAA////AAEBAQAAAAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAA AAABAQEA/v7+AP39/QAAAAAA////AAAAAAABAQEA////AAEBAQAAAAAA////AAEBAQAAAAAAAAAA AAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAD///8AAQEBAAAAAAD///8AAAAAAP7+AQD39fAA APzxAP/+9AD9/PUABAUEAAIBAwAAAAEA////AP//+AAA/v0AAAD4AP8DCgDz9P4ACQoVAAUFBgD8 /PwA/v7+AAAAAAAAAAAAAQEBAP7+/gAFBAQABgoGAAUFBwDi4+YA/Pz8AAIBAQABAf8AAQEBAAAA AAAAAAEAAAAAAAEBAQAICAgAAAEAAAAA/wD+/v4AAAABAAAAAAAAAAAA////AP///wD//wAAAQEB AAAAAAAAAAAAAAAAAAAA/wAAAP8AAAABAP//AAAAAP8AAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAA 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 AAABAAAA/wAAAAAAAAABAQAAAAD/AAD/AAAA/wAAAP//AAAA/wAAAAEAAAABAAAAAAD/Af4AAQED AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA//8AAP7+/gD+/v4AAAAAAAAAAAABAQEAAAAAAAAAAAD///8AAQEBAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A//8BAAEBAQAAAAAAAAAA AAAAAAD7+/sA/fv7AAwMDQD///8ABAQHAP39/wD7/AEA+/wAAAQDBQAFBxgACQwXAAEA/wD9AgQA 8/TsABwdCgABAQIACAgIAP///wABAQEA////AP39/QD+/v4AAwMDAAEBAgD39/UA+Pn5AAD+/wAB AAAABAECAAICAQACAwIAAAABAAEAAAABAAAAAQAAAP8AAAAAAAAAAAAAAP///wABAQEAAAAAAAAB AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAQABAQEAAAAA AAAAAAABAQEAAQEBAAAA/wAAAAIAAAAAAAAAAAAA//8AAQICAAAAAAAAAAAAAAABAAAAAQD//wAA AQECAAAAAQD6+voABQUGAAEBAQAAAP8A//7+APf39gDx8e8A/f77AAsLCgAgIB0AEBAQAAYGBgAC AQAAAAEBAP8AAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAP///wD///8AAQEBAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wAAAQAAAAAAAAAAAAAAAAAAAP8A/wAAAAAA AAABAAAAAAAAAQAAAAD/AAAB/wABAAEAAQAAAP8AAAAAAQEAAP8AAAEBAAAAAAAAAQAAAAAAAAAB AAIAAQH+AAD//gABAAIAAAEDAP3+/gAAAQEAAAD/AAABAAAA/wAA/f7/APn5+AD7/PsAAAD/AAEB AQAAAAAAAAAAAAAAAQAAAQAAAAAAAAH//wAAAQIAAAABAAD/AQABAP8AAAAAAAAAAAAAAAAA/wAA AAEAAAABAQEAAAAAAAABAAABAQEACQkJAAcHBwD+/v4A+Pj4AP7+/gAAAQAAAQEBAAEAAwADBP8A BggFAAAECAD9AAQAAwD1APHsxADw5rQAB//eAAMA+gD+AAcAAQEDAAAA/QAAAP4AAv/8AAMB+gD9 AgwABg0pABIdSAD/CyoA/QEHAAcA7ADm37gAAPHMAAgE+AD8CyYADRpBAAcPKQACAQgAAQAAAAEC AgAAAAAAAAAAAAAAAAAAAP8AAAABAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAP8AAP4CAQAAAQAAAv8AAAD//wD/AQIA/wAC AAEA/wABAAAA+PwBAOTy/QD3DhoA/AT/APwJCgAKEBEA+OTjAPr6+QD+/PwAAPv6AAD7+wAB/PwA /vr6AP77+AAA+/kA//r4AP/7+AD//v4AAPv9AAD/CAD/AP8AAg0NAA0XGwACAf0A/PTfABD8ywAt IdUAPSznACwe5wAaFO8ADAv6AAQHBQD/AhYA9/4FAPz59wDz8wMA4MkCAMWj8wDu0RUACv0FAAUG 7wAF/wAAAv0KAAD8AAD89esAA/bsAPff7wACEREABQgBAPH1+AD47fYAA/L2APsU9wAGFwYABQf/ APr7/QAB+gIA/wIFAP8DAQD7C/MA8xr1APfy9gDw8uwADPkIAPsJIAAHIS0A7uX5APvs5gD+9O0A 8vT1AAEBCgAUCwkAERQHAPkPEQDr6AkA4Nr2AOPe8gAqIgYAMzc2ABcO9AD99vMA9fP3APXyDwAe IhsABQsBAPf26AD//OQAAwPuAP7/CwD9AjEA/wU2AP0AHgAAAPEA/P/rAPv69QD3+d8AAPzmAAH/ 7gAIBOMADAjjAAkIAAD69wkA7+brAAUB8wAFHOoABwzzAAQA+QD8AP0AAAD/AAH//wABAP8AAAEB AAAAAQAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAQAAAP8AAAAAAAAA/wEAAAABAP8AAAAAAP8A AQEBAAABAQAA//8ABAABAAMDAgAGAgcACQYFAAUFBgBAKioAEQwNAL3X1wDx6uwA+/7+AAABAgAE AgEAAgABAP3//wD/AAAAAQH/AP/+/gD//v8A/wABAP//AQACAAMAAwAAAP4A/gD/AAIA/wH/AAEB AgD/Af8AAAAAAAAAAAAC/PsAGPj0ADr47wA99uoAJfnyAAUA/QD4BQYAAv//AAX//gAD//0A/QIB APwDBAADAAAAAv8AAAAAAgD+AQIAAAEAAAH//gAC/wAA/gEBAAAAAgD///sA/wIBAPgGCwD8GiUA DTE6APofJwD5BwoA/wABAAX9+gAB//8A+wACAPwAAAAB/PkAAv36APj8/gD6/PwA/Pf2APr29ADx 8fEA8QEBAP4FBwAB+/oABAIEAPz/AQACAAIACAICAPr5+gAFDAoABAYJAPb6/AAIBAIA/f8AAP77 /gAGBAIA/P38AAYEAgAD/PsABQD+AP4C/wAAAgMAAgIFAAQFAwAOCQcA+vX0APv7+wD7AAAAAPz8 AAT9/AD/AQEA+woLABcxNwAhR04ABiAnAP0EBwAG//4AAP8DAPwBAwABAP8AAP7+AAACAAAAAQIA BwYEAA4HBwAEAwIA/wD+APX29wD+AAEAAgMAAPv8/AADAwMA+wECAPv7+wACAAIAAgEAAAIDAwD+ +/0A/v7+AAIBAgD///4AAgIBAAMDAgAFBAQACP8GAAH//wAODxIAEhccAP7/AQARFBUA/gADAPn7 +wD+/vwABAIBAAYGBwAFCQkAAwcGAAUHBQAFAAAAAP73AP365gD8APIA+fsGAP7/EgAJChsA/gIH AP4A/gD+/OYA/PTTAP/83wD/BPwA/P4MAAcJFgALDSEAAQMJAPn5/gD7APsAAgMQAPr8AwDz8u0A DA4RAAEEBQD+AAYAAf8BAAEA/gAAAf8A/wABAAAAAAABAAAAAAAAAAADAgAB/f0AAgAAAP8CAQD+ /vwABPn4AAPx8gAGAwQABhQYAAgC/QD69+8A/Pf2APj9+wDy//wA6gUDAAQlIQAABAkA+v7+AAP9 AAAAAv8A/gMBAAH/AAAB/v4A/wEAAP3/AAAAAAAAAP//AAEAAQD/AQEAAAH/AAEBAAABAP4AAgID AAH+AAAA/gEA/wD/AAAAAAAAAAAA/wEAAP//AAAAAQEAAQH/AAUEAgAAAQYAAwEDAPsC/AAFBf0A /f3+AP///gABAQEA/v79AAABAAD9//0A/v/9AP/+/QAAAP8AAf//AP//AAD2+vgA+Pn6AAL/AwAB /v4AAgEBAAwJCQAEAP4A/Pn4AA8KCAAIDAwA+/8AAAYCAgABAQAAAAAAAAABAAD//P0A7+fnAOLZ 2wAYEREAAwL9AP7//AD9/PkA/Pr4AP3+/AAAAf4AAwMAAAEBAQADAgEAAQADAAEABAAAAQQA/wD/ AP8AAAAB//8AAAD/AAH+AAAAAAIAAP8DAP/+AQAAAP4AAAABAAEAAAAAAQIAAAH+AP8CAgD9/wEA Af8AAAMA+wAAAAEA/gEDAAD/+wD88+EA8ePJAAL35gAKFBsA/P/+APn16gAC/O0AAPsCAAD9/QD/ //4AAgEEAAL+AgAB/f4AAv79AAT8+gD/9/YA9/sIAP4HCgAIBwQABQP/APr97gD4+/UA+vsMAAb+ FAADAQwAAgABAP7+/gADAwAAAAACAP8AAQABAP0AAQD/AAAA/wABAAEAAAEAAPT19wDv8vIAAgQF AP///wAAAgEA8/j4APn39wAB/v8A+/4BAAIDAwACAP8AAQAAAAABAAAAAgEA/P4AAAIJCwACAwIA /AD/AAT+AQAFAgAABwkKAP8A/wAB9/YA+fj5APr+AwDw9PUABAEAAB4JCwD/AQIAAAABAAEAAAAA AAAAAQAAAAAAAAD/AP8AAAAAAAEAAQAAAAAAAAABAAAA/wD/AQEA+/z9APj5+QD+/f4AAAD/AAIC AQAJCQcABAQDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIAAAAAAP///wAAAAAA AAAAAAEBAQAAAAAAAAAAAAAAAAD///8A/v79AP39/QAAAAAAAQEBAAEBAQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQABAQEAAAD/AAAAAAABAQEAAAAAAAAA AAD///8AAAAAAAAAAQD4+PgA/f//AAcGBQD+/fwAAAD8AAMEAQABAgIAAAD/AAD//gACAgYAAwMI AP8CAgDs6+oACwsOAAIDBQD9/wIAAQEAAAMDAQAAAAEAAQEBAAUFAAAAAP8AAAD/AAICAgD09PQA +vn6AAEBAQD+/v4AAgQFAAIBAwABAAIAAgIBAAEAAQD/AAAAAAAAAAABAQD///8AAQAAAAAAAAD+ AAAAAAEBAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAA /wABAQEAAAABAAEBAQAAAAAAAAAAAAAAAQAAAP8AAP//AP7+/gD+//8AAwEAAAAAAAAAAAAAAAAA AAAAAQAAAP8AAQAAAP8AAAD5+fkABAQFAAH/AAD6+PkA5OTiAPj49gAmJSQAEhMSAAgICAAHCAgA AQICAP8AAAD/AAAAAQAAAP7//QACAQEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gEAAAAAAAAAAAAAAAAB AAEAAAAAAAAAAAAAAAAAAAAB/gEAAQAAAAH/AwAAAAAAAAAAAAAAAQAAAAAAAAH+AP8B/gD/AAAA AQABAAAAAQD/AAEA/gECAP8B/wAAAAEAAAAAAAECAAAB/wIAAAD/AAD+/wD///0A/Pn2APz7+QAB AP8AAAEAAAAAAQD/AAAAAAAAAAAAAAAA//8AAAAAAAACAAAB/wEAAP8CAAABAAAAAAAA////AAAA AAAAAAAAAQEBAAEBAQAAAAAAAAEAAAAAAAAHBwcABwcHAP///wD29vYA+/v7AAEBAQABAAEAAQAB AAICAgAGBgMAAQUFAP4BAwAC/vsA+/HXAOfbrgAE+tUABQD3AAEACgAAAAUAAQH9AP8A+wAA//8A AQD+AP0CBQD9BRwAEhhBAAUONgD9AxAABgDvAPHgtwD247sACwLwAP4GGAAJFT8ADBQ3AAEBDAAB AP8AAgEBAP8AAQAAAAEAAAAAAAEA/wAAAAAAAAAAAAAAAQAA/wAAAAD/AAAB/wAAAAIAAAAAAAAA /wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAB/wAA/wAAAAAAAAAAAAEAAAD/AP8A AAAAAAAAAAAAAP8AAQD/AAAABgQBABoWEQDi8fkA7/v2AAn+9wD65e4A9dfWAP/9/AACAP4AA//9 AAcBAAAIBQIACQcFAA0NBwATDwwAEw4XABYVEwASEhIA7e7vAM/j8gD3AQkA/AkJAAkN/AAOAcAA GxHWACkn3wAuHuYAIBbqABEN8wAHB/4AAgUIAPr+CQD4+gYA+fgAAPXtCADkzAcAxKX0AO3SEAAK +goABwP7AAQAAQD/AQcA+QAAAAH69AAA5eEA9AsTAP7/DgALChsAAQQEAP7z6wD9+/wAC/8AACL+ 8wAH6OYACOvYAOcA7wD1Bv8A/wADAAH/AgAAAQIA/gf5APoM8ADuAPcA8/cCAP79+wAIECIABw8m APjpDgDu7d8A9/HwAP338AD6BP0AFxUXAO8QCwD2/w0A+gf6AOn4CgDz8PsA39L8ADMqGQAgERwA EALzAO3r9ADv7/IAFBgWABsfMQATFTQAAgb7AP0BDAD6ABsA/AEeAPz/CgAAARQAAAAZAAADAAAA ACoA/wLzAP//9AD4/ugA8fTjAP/y8AAB/fwA8v4mAPXy4gDzBSMACQAqAP3/DAAAAP0AAAD+AAAA AAAAAAAAAAD/AAAAAAAAAP8AAAAAAAAA/wAAAP8AAAABAAAAAAAA/wEAAAAAAAAAAQD+AQAAA/8B AAEBAgAAAP8AAAAAAAAAAAABAQEAAAAAAAD//wABAf8AAQAAAAsIBwAJBwYAFxAQAC8iIgBDMDAA zeDfANDl5ADr9vUA9QEBAPkAAgAAAQEAAgIBAP8CAgD+//0A+vz/AAAAAAD///8AAAAAAP//AAAB AQIAAQABAAAD/gD/AAEABv37ABD59AAg+PMAMvryADH37wAe+PIACgD9APoDAgD/AQAAAwAAAAP/ /wAAAQAAAQECAAECBAADAP8AAf8AAAAAAgAB/wAAAAD9AP///wD+AAAAAAAAAAL/AQD8AwcA9QsR AAQhLAAPMToA/BUbAPwGCwD+/v0AAf77AAD+/QD7/v0A/P8BAP79/QAA/PoAAPz6APr6/AD5+fkA /PbzAPj08wD07/AA9fX1APsABAD5AAQADAUHAAMNDAD89/YA+f39AAwPEAD3+vwABQQDAPn6+QAE BAcA/v39AAIA/AD9AQMABQICAP3//gADBAQAAwH+AAQA/wABBAQAAgQFAAEBAAD49fYA/AX6AAEE BwACAgMAAgICAAAICQD8DRAAFTA1AB9DSAAJISYAAAgKAAMCAQACAQAA/v//AP8B/wABAAAAAAEA AAEAAQADAAEAAwD/APz69wD9AwQABAUEAAYHBgD9/wAAAgMEAAQDBAD8/v0A/P79AP8AAAABAQAA AQEBAAIBAQAEAwMAAAEAAAAAAAD+/v8AAP//APwCAwAEBAQA/f7+APsB+wADBQgACg4SAAf19gD3 +wAADg8MAAgEAgD+/vwAAwAAAAQGBQACBQQABAQCAAMB9AACAe8AAP/mAAEA6gAA/vcA/v4DAP/8 8AD8+PkABwwhAP3//QD7+OUA/PfjAAQB9AD8AAwAAQUZAAYIIAD+/gcA+vn0AP7/+gADAwoAAwUP AP38AADy8u0A+vv3AA8QFgAGBgYAAAD+AAAA/wABAAAAAAEAAAD/AAAAAAAAAf8AAAL+AAAAAQIA /v//AAL+/QAC/v8A+wABAPsTEwDx8PYA/gsHAPoIBgD+AgkA9wgIAPP19QD2/f0A5/n7ABEYFwAG CRAA+wACAAP9/AD+AQQA/wADAAEA/wABAP8A/v8AAP0AAAAA/gEA//4AAAABAAD/AAAA/wD/AP3/ /wABAgAAAQIAAAD+/wD///8A//8AAAAAAAAAAAAAAwICAP8B/wD+/wAAAQL/AAEBAQAAAQMABAEE AAUCBAD7/v0A/f39AP4A/gD///8A/v4EAAAAAAAEAP8A/P/9AP79+wD//v4A///+AAH//wAJBggA Eg4NAPfv+QD5/PYA+/v8AAj7BgAOBg4ACQQDAAH+AAAIBgYABAcGAAQBAgAA/wAA//8AAP/9/AD2 7u4A5djXAP7v8AD4/PsAAgYDAP3++wD++/oA//38AP/+/gABAgAAAAIBAAD/AAAB/gAA//8AAP8B AQD+//8AAP8AAP/+AAD/AQAAAQACAP//AgD/AAEAAAICAAAAAQAAAAIAAAMEAP8DBAD/AAIAAQD/ AP7/AgD+AAMAAQD8AAD/+wAAAAMA/gACAAP99gD48eQA9vT4ABMQJwADCREA/Pv5AAH05gAC/ugA AgIZAAMAAAD9/fsAAQEHAP/+BgAA/gIABAMAAAEA+QAA/P8A/f38APj7+AAA/AQACAYFAAoEBwAG AvsAAf/3APLkywAQ/fYABv/1AP8BCwD9/f8A///7AAMDAwAAAAEAAAABAAEAAQD///8A/P79APHy 8QD19PUAAgQHAPr//gD6/f8AAgYEAAIBAwD59/YA9fX4AAUEBAAIBgYACQUDAAMCAAACAQEA9vv7 APb8+QAAAwUA/gABAAb/AAACAAAA/ff7AAICAQAG//4AAAEDAOn7/QDN4eYABQH/APwFBQD9BQIA CPIHAAMDBAAIBAUAAwMDAAQCAQAAAQEAAAECAP4CAQAC//8AAwEAAP0CAwDy+vwA5OfpAAoHCAAY EhAABwD/AAACAQD/AgUAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAA AAAAAAABAQEA////AAAAAAAAAAAA////AP7+/gD9/f0A/f39AP39/QAAAAAAAAAAAP///wAAAAAA ////AAEBAQABAQEAAQEBAP///wABAQEAAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAP///wAB AQEAAAD/AP///wABAQEAAAAAAP///wD29vcAAAABAP7/AQD5+v0ABwUEAP7//gABAQAAAQAAAAD+ /wD/APsAAQEFAAICAADv7+0AFhUVAAEBAQD+AAAAAgEBAP8AAQAAAAAA////AAEBAQACAQIAAQEA AP7//wDv7/AA+vr6AAIDBAACAgIA/QD/AAMDAwACAgIAAgECAAAA/wABAAAA/wEBAP8A/wAAAAAA AAAAAAD/AAACAAAA/wAAAAAAAAABAQEAAQEDAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAA AAAAAAABAAAAAQAAAAAAAQEBAAAAAgABAQAA////AAEBAQAAAAAAAAAAAP4A/wD+/wAABQMEAP4B AAACAAAAAQAAAAEB/wAAAAAAAAD+AAD+AQD5+fgACQkBAOnn5ADz8u4AFxgWAB8gLgANDQ0AAgIC AAEBAQAAAAAAAAABAAAA/wAAAAAAAAAAAAEBAAD+/gAAAAD/AAAAAAAAAAAAAAAAAAEBAQAAAAAA AAAAAAEBAQAAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAB AAAAAAEAAP8AAP8AAAABAAAAAAAAAAEAAAAAAAEAAQABAAAAAAAAAP8AAAAAAAEAAAD/AAEA//8A AAABAAAAAAAAAAAAAAAAAAAAAQAA/wABAAABAQAAAAAAAQD+AAD/AQAAAP8AAP8AAP///wD6+voA +/z8AAEBAQD///8AAAABAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAEAAAAA AAAAAAEBAAEBAQD///8AAAAAAAAAAAABAQEAAAAAAAQFBAAKCgoAAgICAPb29gD6+voAAgICAAAA AAABAQEAAgEBAAYFAwAEBgUA/wECAAIA9QAA994A5tuuAAP21QAJAfoAAQAIAP4BBQAAAP8A/wD7 AAD//gAB/wAA/gEGAPsCFQANFz8AChY/AP8EGAACAPQA9+7GAOXSpgAM/+MA/wcKAP4MLwAPG0UA AgUgAP//AwAAAf0A//8DAAABAQABAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAA AAAAAAAAAAABAAD//wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAD/AAABAP8AAQD+AAAA/gAA//4ABwH8ACseEwDz9PMA5e/4AB8JCgDz5/EAJicbAA0L CAAOEA0ADAoJABANCwAODwoADA8LAAkIBgAKBgMABQUBAAMFAgAAAwIA4ePjANPq4gDz/AIAAwsL AB4N7QA5FtQANRjGAB8X4AAND/YABQgHAAMEDQD+AQcA/fv8APr39wD39e8A8/T8AOHTDgDMp/gA 7c4gAAT+DgACBfUAB/8FAAL8DgD2AgEA+wLtAAL79AAJ7AEA8wHfAAUuMwACDQkA+fwGAAT18QAA /vsABQP7ABn24QAV6MYAC/fTAPkQ7wD2/wcAAAD9AAEB/QADAQMA/P4LAP//AwD/BPkA+gnzAAD7 9gD0/SAA9wofAAEfIQAKFg8AGBASAAHz+wAGGx8A8RwYAOP8+gD6CPwACR8FABQMIgAFCQoA/AAE ANQD8wDz9esALRAEABMtiKXEAAAgAElEQVQGCQD+/P4A5eXyAOPn+wALEh0AFR4rABQZGgAGBwIA AQPzAAAA9gD9/gYA/f0LAP0B/gD+/w0A/AIBAP4AAgD/Af4AAAL7AAD/8QAEAOwABR3uAA38/gD6 AhYA9f4aAPn+BgAEAPwAAgD+AP0BAgAA/wAAAQAAAAAA/gAAAAAAAAD/AAAAAAAAAAIAAAAAAAD/ AAAAAAEA/gAAAP4BAAAAAAAAAAD/AAAA/wAAAAAAAAAAAAAAAAD/AAEA/wD/AAAA/wABAAAAAAAA AAEA/wAEAgEAB/8AAA8NDAAfJyYAOx8dANHs6wDK4+EAz+nqAN7t7wD0+fkAAwICAAABAQD9/wAA /gIAAP///wD6//wAAAABAAIBBAD9//sAAgICAP3+/wABBAIACwABACkB/ABB/PIAMvXoAA/49AD6 BAUA9AMHAAb//gAO/fsA/gEBAP0DAgAAAQQAAwEAAAL+/wAA//8A/wICAP4AAAAC//0AA/78AP4A AQD9AgUAAgD/AAP//gD+CxIADi46AAIuOwD1EBUA/QMDAAn9/AD9AP4A+wEBAPwCAwD//v0AAfr4 AP/5+gD7/PwA/Pv6AP769wD69/YA+Pb1APXz8QD78/MAAPj5APsCBQD9BAoABAEEAAcN+AD09PMA /gMEAP/+/gABAgEAAwH/APwCAQD6/P0ACAQEAAD9/AD8+fwA/wQDAAYCAwD5AgEABQMEAAQA/wD/ //8A/vv7AP4AAAAC/v8ABQQFAAX//wAKBAQA/wYGAP0KDgARMzcAGz9GAAomLQAHDQwABQUCAAEC AQAAAAEAAQAAAAL//gAAAQAAAAABAAIAAQABAAAAAwIDAAMFBgD9/v8A//8AAP39/QD+/v8AAP7+ AAMDAwAC//8ABwMCAAcDBAD///8AAwABAPz/AAAEAQIAAP/+AAAAAAD+AgMA//7/AAYFBQABAQIA /Pv/AAQE/gACA/oACQwOABIUGgD29PQA/gEBAA0LCgD+AP0A//8AAAQEBAACAwAAAwH9AP/87wAA A90ACQbuAP8A+wD4/vwA+/71AP7+9AD49PgA/f8AAAsMDwD1+OwA/PnxAAED/QABBAcACAgcAP3+ EgD38vMA+/zuAAgH/AD//wgA+vv6AAwXBgAEBgYABAUDAP79/AAA//wA/wEDAAABAAABAAEAAf/+ AAAAAAD/AAEAAgABAAD+/gD/AAEA/gEAAP/9/AAD/wEA+AYKAAElJAD+//8A9PX3AP0HBAD3Dg4A 8QQGAAH/AQAOAQQA//b4AP0ODwD9CQkA/wMEAAT/AQD9AP8A/gH/AAEBAAABAAAAAQAAAP4AAAD/ /wAA/gAAAAD//wACAQEAAP8AAAAC/wABAgIA/f79AAMAAgAAAAAA//8AAAEAAAADAgAAAQH/AP8B AAAB/wMA/wD/AAIBAgAAAgAA/wD/AAIBAgAB/v8A/gQEAP0A/gD8/fsAA/3/AP/+AQAAAAAABAAE AP0CAwD8/fwA/QD/AAP//gALAQQADgr9APb6AAANCwcA/Pf1ABsMBAAI/vgAAf8IAAAABgADBAQA /AH+AAAB/QAAAAAA+/v5APPt7wD16ugADQD+APkB/QD38O4ACRAQAAEDAQD+/gAA//0BAAD/AgD/ /gAA//7+AP7//AD8/gAABQr8AAIA/gAAAP8AAAIFAP8AAAAAAP4A/wECAAABAgAA/gAAAAEBAAIB AgD//wAAAAIIAP8AAgD+AgEABAH/AP8BBAAA/gIAAgD6AAL//wD/AAEA/wD+AAD69AD79fMAAwkb AP8MDwDy+fMA9+vSAPbtzgAQDfoA/wwHAAL/AgAC/fkAAAAMAP0ADgAAAggA/wH/AP7+/gABAfwA AgEAAP799gD3+/oA/AQDAAkMFAAFCBIAFAX7APf86ADz5vkAA/4XAPj+AgD5/AEA///+AAYGBAAD AwYABgcDAAEAAQABAAEA+/r8APn2+QD//f4A+v35APH5+gDz+vwAAQgGAAUCAgAHAgMABhARAPj7 +wDw9/YA/e/1ABIKCAATEA8A/f39APL0+AD6AfoA/wD+AAX9/gAA/gAA9/8CAAMCAQAIAPwAAQQF AN/4+wDi+PsADw0KAOf5+gD/6+wABQEBAAIDAwAHAwMAAgMCAAX/AAACAgMA/QIDAP4AAQAD//0A Av8AAPkCBADd7vEA4OjqACAXFwD3+fkACwH9AAoGBwAaGhoABAUCAAEBAQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP8A/wAA/wAAAAAAAAAAAAD///8A////AP///wD+/v4A/v7+AP7+/gD+/v4A/v7+ AP//AAABAQEAAAAAAAAAAAAAAAAAAAAAAP///wABAQEA////AAEBAQAAAAAAAAABAAAA/wAAAAAA AAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAPv7+wD7+/oA/v7+AAQEBQAD CgcA/P37AP7//gAFAwQAAAABAAAB/wACAv8AAgD8APr49QABAPsACgsIAAEBAAACAQAAAAABAP8C AQAAAAAAAP//AAEAAAD/AAAAAAEAAPf3+ADy8vEA+/r5AAYHAgACBQQAAAAAAP3//wAEBAQAAQIC AAACAgAAAAAA/wD/AAAAAAAAAQEAAP8AAAEBAAAAAAAAAP//AAAAAgD///8AAQEBAAAAAAAAAAAA AAABAAEBAQD//wAAAAD+AAAAAAABAQEA//8AAAEBAQABAQEAAQECAAAAAAAAAAEAAAD/AAAAAAD/ AAAA/wEBAP7+/wD9/v4AAAEBAAAAAQAAAAAAAAABAAAAAAD///8A+/v6AOrq6gAeHhoABwgHAAYF AQAwLycABwkJAAIDBQAAAQEAAP//AP/+/gAAAAEAAQEAAAEAAAAAAP4AAAABAAEAAgD/AP8AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA/wAAAQAAAAD/AAAAAAAAAAAAAP8BAAAAAAAAAAD+AAAAAAD/AQEA/QAAAAIB AAAAAP4A/wAAAP8AAgAAAP8AAQABAAL/AgAB//8A/wL/AAAA/gAAAAAAAwAAAAH9/QAAAAAA/gEC AAD/AQAAAP8A/wH/APv9/QD7/f4A/wEFAP///gABAf4AAgD+AP8A/wD+AAAAAAAAAAAAAAAAAAAA AAAAAP8BAAAB/wAAAQAAAP/9AAABAAIAAQIAAAAA/wAAAQEAAP8AAAAAAAAAAAAAAgMCAAkJCQAC AgIA+/v7APj4+AACAgIA////AAEBAQABAAMAAwMDAAYGAwACAQMA///+AAD76wDr48AA+/DLAAcA 8wAB/wgAAAAHAP8B/QD+AfcA///+AAH/AwABAgEA/wIJAAoSKgASGz8AAAghAPwBBAAA9+MA59q4 AAn+3wAHBvoA/AcbABIgOwAFDycA/AAHAAMC/QAAAP8AAAAAAAH//wAAAAEAAAH/AP///wAAAAAA AQEBAAAAAAAAAAAA/wAAAAAAAQD/AAAAAAAAAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAABAEA/gD/AQEAAAACAAIA/QAAAP4A/gACAP8BAQAAAQEAAP4DAAAAAwAAAQYAAQD+ABkNAQBS NyEA/wEVAAEBCgABACgAAQEBAAQCAAACAv8AAgH/AAEB/gADAf8AAgIAAAAABAAAAAkA/v7/AO7p 3gC9tKAAysS0APv4/QAWEOgAVFQOAEtLBQAPEOwAAwEEAAL/CgAEAxIAAAMBAPf+AQD4+PwA+vT5 APnw+gDy8QgA8PMHAM6eHwDq0+wACv4CAAYD/AAIAQMABAH/APn/9gD4Af8A+v37AP0A+wDrA/YA 9QwDAAMPEwALCg8A/PPxAPP7AgAH8+cAOPDTAGrv9AAO4tQAxRMBAOsjCwDoEAEA/Af6AP7/AgD/ BAUA/wf+AAD+9wAB/QEA//sNAAL++wAC7+EAAvLbAO4OLwDwDx4AEh0gABQJBAAHBQsA9/8HAAf6 +QAeBAAACwgHAAkHCgD8+PkA//38AP8GFADsAhsA8hsLADAeBwD03cwA8+zmAAAC8wD87scA3eG6 AOAKEwAiLz4AFx0mAAIECQACAgIA/QD8AAT//QD///gABP7+AP4AAQD+/wIA//8DAP4ACwD9/wgA /gEbAAEFAAAA/v4AAv/8AAUC/QD+AAMA/f8GAAH+/QD/AQAAAAD/AAAAAQAAAAEAAAACAAAA/gAA AP4AAAABAAABAAAA/wAAAAAAAAL/AAAC/wAAAAAAAP8BAAAA/wAAAQACAP8AAAD+AP4A/wD/AAAA AQAB/wAAAgABAAIA/wAAAAAA/AEBAAECAgACAf8AFAUMAEINDABBHx8A+/v7APH29QDX5uYAyN7d ANPp6QDl/PcA9QMCAPb8+gAI+/sABQMCAPf7+wD6AwUA+wIEAAf7/AAw9u0AQfbpAC727AAR+/UA /gD9APcHBQAFAAEACgD+APwDAgD2AAUAB//+AAYA/QD/AQEA+wACAAAA/wABAQMAA///AAP//QD7 AQEA+gMGAAf/+wAL/PgA+QMJAOsXIgASQ1EA/B4lAP0EBQACAPwABP/+APwBAQAA//8ABP//AAMA /gD6/v4A+///APz9/AD6+fcA/Pr4APz6+gD69vYA+fX2APv2+AD+/vsAAgL/AAcDBAD7CgoA8/4H AAwICAD79fgA9vLwABIKBwD5+fgA9/j5AA0JCwD4+fkA+Pv6AAYGAwADAQMA/fv9APYA/gD///8A AAAAAAMCAgAFAwIABQEBAAQCAAAODAcABwQDAAQGAwDxAwgA+xcbABo0OgAeOT8AEh0gAAoMCwAD AwQA/wECAP8AAAABAAAAAQABAAAAAAAAAAAAAAAAAP3//wD/Af4AAQH/AAcEAwD7/PwAAv//AAMD BAD9BP8AAAAAAAIAAAAA//8AAf0BAP8B/wD/Av4A/AEBAAD//wAA/v4AAQD/AAICAwD+//wAAQEA AAP/AAD7AQEAAgUDAAL8AgAIBAcAAAoPAAkGCQD9FPsA////AP///QACA/4A/v36AAEBAgADAwYA BP7fAPv71QD9+vUA/Qf0AAkGAgD6+ggA/f4TAAUD/wAA/+kA/PHPAPr9GAAC+/QA/fr7AP0GAgAG ARYA//3/APTy3wD9/foABgT8AP3++gDv8v4AHyUlAAQFCAADAgsABAIHAAEAAwD/AP8AAQD+AAAA AQAAAQEAAAACAP8BAQD/AP8AAAEAAP//AAAAAAAAAP0BAP/+AQD//wAA/gIDAAEQEQD7ExQAAQj3 AAQHBgAFCQMAAgQAAPH08AAAAAEAAgACABMUGQAGCw0A/QYHAP8DAwD//wAAAf3+AP8BAAAAAQEA AP8AAAH/AAAA/v8AAP8AAAACAAD/AQAA////AAP+AQACAQIAAP4CAP8AAQD/AP8AAQD+AAH//gAA AAMA/gAAAP///wAAAP4AAAECAP8AAQACAQAAAAD/AAEBAgADAwMA+wH8AAH/AgADBAcA//3+AP/9 /gD+//8A/v8AAAD+AgD+/gEA/v/8AAkGBQAA/fkADgcHAPkOAgD7/gMA/AP6AAIC/AD1+v8ACv4H AP76/AAGBgEA/P0DAPv9/gDx8+8A++zrAP328gAG/PoABAP9APP08gDq6+0AGwIiAAgPDAD+/QAA ////AAP+/QAB/PsA/Pv7APr//gAABgUABQIEAAACBgD/AAMAAP8EAAED/QD//wEAAP//AAACAAAA AwMAAv8FAPz/AAAAAQAA/gIBAAACAQAAAQAAAAABAAIA/QAAAf4AAP//AP3/AwAAAAEABPz5APPm 1gDx6N0AEQ4IAAD+9QD58NgA9eXHAPPs5AD8Dw0AEh3ZAAgDBQD8+wwA+AAMAP4KFwD+BAcA/fvo AAf/8gAEAAMA/gANAP3+/wD//fMA/PjtAPr53gAJDxYA/wwgAAsIDQAK/u0A/u7mAPz4DAD9CiQA 9gIUAP37AAAKAfoACggDAAUIBgD9AgEA+fv4AP7+/AD/AQMAAQD+AP3+/AD0/vsA+vb+AAH+/wAF //0ACAUEAP8GBwDq+v4A6e3yABP09gAuCAsAAQAEAP///wD7AAEAAAABAAD/AAAAAP4AA//+AAH8 /wD9AQAAAAD9AAD49wAC9PIA5/HsAPTu6AALBgUABAMCAAMCAQAFBAEAAQIDAAkBAQAIBwcAAgcI AAICAwAKAgEABAUDAPYCBADn8fQAAgUAAP3/+QD09fUA/AQDAP//AgD///8AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAAAAAQAA//4AAAAAAAEBAgD//wAAAAD/AP39/QD9/f0A////AP///wD/AP0A///9AP// AQD///8A////AAAAAgAAAAEA////AAEBAQAAAAAAAQEBAAAAAAAAAAIAAAABAAEB/wABAQEA//// AAEBAQAAAAAAAQEBAAEBAQAAAAAAAAABAAEBAAD///8AAAABAAEBAAAAAAAAAQEBAPbz9AAC/wIA AAD+AAADAgD4+/oACQkGAAICAAD9/f8A/f3+AAEEAQADAwIAAwYHAPTx8wAHBgwABQMHAAICAQD/ /v4AAwICAAD/AAAAAAAAAQEBAAAB/wABAAAAAP8BAO3u7gDz9fYA/P7/AAH8/gACA/0ACwsHAAIB /wD9//wAAQMAAAICAAAAAQEAAgABAP///wAAAAAAAQEBAAAAAAD///8AAQEBAP///wAAAAIAAQEB AAAAAQABAQAAAAAAAAEA/wAAAP8AAAAAAAAB/wAAAf8A//7/AAAAAAABAQMAAP8DAAEBAAAAAP4A AAD+AAAAAQAB/wIAAgAAAP/+AAD+/fwAAwH/AAL//wAAAAIAAAAAAPv69QDb2NYA6+vrADo9PgAZ HBwAAQABAAEAAAADAQIAAAIAAAAAAAABAAAA/wAAAAABAQAAAAAAAAD/AAAAAAD//wEAAAAAAAAA AAABAQEAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAACAAAAAAAB AAAAAwAAAAAAAAAAAAIAAQAAAAAAAAAAAAAAAAAAAAAB/wAAAQAAAQABAAAAAQAAAAAAAAAAAP4B AQAAAAAAAAAAAAABAAAAAAEA/Pv7APj3+AAA//8AAQH/AAEAAQD/AAEAAAEDAAD//wACAAAAAAD+ AP8BAAABAQEAAAAAAP///wAAAQAAAQAAAAAD/wAA//8AAAACAAEBAgABAAAAAAECAP///gACA/8A CQoLAAUFBwD/AAAA8/X0AAMDAwD///8AAAD/AAIC/QADAgQABwgIAAIDAAD//QIAAv/2APPqzAD1 6rcABgDZAAUDAQD6AAgAAALyAAEB+AAC/QQAAP4IAAEAAQACAvwAAwwZAA4dTAAADjkA/wELAAoA 5wDn3r0A/OnFABIK7AD5AhsACB1WAAoZUQD+AQ4ABf71AAH9BAAAAgYAAAH/AAABAQAAAAAAAAAA AAEBAQAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAABP8AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAP8AAQD7AAEA/wAA//oA AAEEAP4ABAABAQEAAQIGAAMC/QAD/wEAAQH/AAABAQD/AQIA/AADAAL/BwD//wIAAPz7APj17gDp 48cA1M3BAM/KxQDw7PEA//0HAP8GCQAyNQ0ASkwWAAgJ3AD9/BkACQUMAP8E+gD5AfQA+vj7APzy AAD18/wA7fj7AO/yCgD03RMA07nrAOjV6gAJAA0ABgQDAAcB/gABAQQA+v//APn+/AD///cA//76 APT+CgABFCkAGCIvAAcSDwAKAvkADhIMAAH3GAD96QgAD/z8AP357gAD+vsAEPcJABb1BQAJ9v4A +An+AAAGAAAB/wAA/wEAAAADAAD/BAAAAAICAP4FAAD/+OkA/fHJAAHy8wAD8icA8/MWAPUODAAI DgMADQwEABMNCQAFBAIABwsMAPLy9ADg2tgA9OnoAA0ICgAgIB0A9wwBAAgoFQAhNjcA7OnlAOXl 6QD37+0AEwjyAPX49gDWzMAA3dfPAB4gJgAQFh0ABw4TAP8CCAD+AQQA/QEBAAAA/wAAAP0AAAD8 AAL/AAD//wAA/gABAP0AAQD+AQMA/v//AAH//QAD//0AAAD/AP///wD+AAEAAAEBAAAAAAAAAP8A AAD/AAAAAAAAAAAAAAAAAAAAAAAAAf4AAP//AAAB/gAAAP8AAAAAAAH+AAAAAAAAAQD9AAEA/wAC AAAA/wD/AP8AAQAAAQEAAAAAAP4AAQAAAAIAAAH/AP8A/wAC/wAAAQD/AAAAAQD/AgEAAwcIAAMI CgA1ExUAMjAwAPn+/gDw9vYA7vLzAO/19QD1/v8A+wECAP77/AD/9vQA/PLuAPLW0gAD2OEAGfrx AAr++QD/AQAAAQEDAAL/AAAAAQAAAAIBAAQA/wAEAQIAAAADAP3/BAAB//4ABf/+AAEAAAD+AgEA +wACAAABAQAD/v0ABf/8AP4DBgDuDQ8AAR8nABwzPQD+Fh0A+AIBAAMB/wACAAIAAAD/AAMAAAAA AgIAAP//AP0BAQADAgIA/wICAPwBAgADAQEA+fr9APz5+gD5+voA/v7+AAIAAQADAwQAAQYCAAQF /wAH/wAAAP8BAAQA/QAOICQA69jUAPz2+AAQBwQADAkCAPz69wALBQQA/v38AP/6/QAB/v8ACQQE AAQDAQABAP8AAf7/AAH/+wAD/QAAAwMDAAQICgD9AwUA9AgMAAEQEgAOGx4AIDAzABsrLgAHFBgA AwgJAAACAgAAAQEAAgAAAAABAQABAAAAAP8AAAAAAAAAAAAAAAH/AAAA/wAAAAAAAQECAAIDAwAF AgEAAv8AAP7//wD//v4A+fv7AAICAwABBQQA/QABAP3+/AAB/gAAAf/+AAD//wACAAEAAAMCAP4A /wD9/f4A/v//AAIDAgAGAQAAAQAGAAYDBgD5BAMABgMAAPn9BgD9/v8A/v/7AP/++QD+/v4A//8H AAEC+QD//e0A+/jlAP/97gACAfgA+vkBAPn7EgAGCSAAGRYWAPj15wDy/P4A/wcCAPb5BAAHBhAA /v8KAPv+/gAB/PgA+fPnAP//AwAJCQoAAPz8AO7y9QALESIAAAIPAP8CBQAFBQMAAwIAAP8AAgD9 /gEABAMBAAH//wD//AAA/wAAAAAA/wAAAP4AAAEAAP//AAABAQAA/P3/AAEBAQADAwEAAAgFAP4M DAAGGBcACwABAPz//wD9Af4AERAMAAD8+ADy8u8ADQ4SAA8TFQADCQsA//8BAAD//wD+AP8A//0A AP4BAQACAP8A/v//AAABAgABAAIAAQH/AP//AAD//f8AAQECAAEBAQD9+/4AAQH/AAD/AQD///8A AAEAAAACAgD/AP8AAf4AAAEAAAD/AAEA/wAAAP8A/wAA//4AAwIEAAH+/wAAAQEAAwEDAAD//wD/ /gAA/wMBAP8CAQAC//8A//4BAP78/QD+AgIAAgMGAAICAAAEBAMADQsKAAMJAgD19vYAAwkPAA8J BAAKBQEA9vPzAPb+9AAMBwkABAMCAPTt7ADy9O0ACPr6APv29ADs7e0A9ezrAPXu7gD7+PsA9O/u AAkLCgAB/P0AAPr7APz6+gD7/v0A/QEAAAYMCgAJDQkAAQYDAAICAAACAQEA/wD+AAACBAD/AP8A AQADAAEBAgADAAIA/f8BAAL+AAD/AP4AAwAAAAD//AD+/v8A+wEHAAcD/AAE//wA9gAHAPsDCQD/ /PQA9+rVAOzj1AAJCgoAAQL9APfv4ADs49YA8ejsAPn0/gD9/vgAEhbyAAEGBAD+/AMA/AgMAP4E DAD5+O4AB/3rAAMD+QAABBAAAAD9AAP99AD/+/AA//71APr8+wDw/fAAAvTpAAQJGQAOESIADwoN APH1+gAF/fUABgALAP39CAADAwoACg0PAAYFBgD///8A+/v8APv7+wAA/gIAAAEFAP/+AQAC/v0A AAEAAPz//wD5+v0A9Pv+APr3+wDq9fQA+gcGAPwNDADq+fgABPr4APf6+QD4/voA/v3+AAT/AAAD BAQAAAcHAP///wAA/PsAAPv8APX5+QDs8/MA3u3pAPv++wAJAgEABgACAP/+/QABAQAABPz/APz2 8wAMCwsAAQcHAP4DBAAFAAAAAwQDAPsEBQD9AAIAHRAQABMfHwAUBwoAAwMEAPsBAAAAAP4AAQEE AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP///wD9/f4A/f38APz8/AD///8A////AAAAAAAB Av8A//8AAAAA/+4fU0wAACAASURBVAD//wAAAAACAAEBAQAAAAAAAAAAAAAAAAD///8AAAAAAAEB AQABAf8AAQEAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAP7+/wACAgEAAAAA AAAAAAAAAAAA/f39APb5+AAAAAAA+fz8AAAAAQAHBwQA///+AP7+AAACAgMA//8AAAUFBQD///4A /v7+APT09QAKCgoAAAL/AAEBAQABAQEA/wABAAEAAAAAAAAAAAABAAEAAgAAAAAA/v7+AOnn6QD2 9PUAAwQGAAAA/gD///8A/Pz8AAEKCgAB/wIA//0AAP//AQAAAAAA////AAAAAAD/AP4A//8AAAEA AgAAAAEAAAAAAAEB/wAAAP4AAQEBAAEBAAAAAP4AAAACAP8AAAAAAQEAAAABAAAAAAD//v4AAAAA AAAA/wAAAP4A/wD8AAAAAQABAP8AAQEDAAAAAAAAAQEA/v8AAP39/QD8/P0AAP//APr59QD29PYA 8/HxAPj6+QAjJSUAQENDAAQEBQD+AQAAAP8AAAEAAAAAAAEAAAD/AAAAAAD+/v4AAAAAAAAAAAAA AAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAP///wAAAAAAAAAAAAEB AQAAAAAAAAAAAP///wAAAAAAAQECAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wD8/PwA+Pj2AAEA/wAAAQAAAAAAAAAB /wABAQAA//4AAAEBAAAAAP8AAAABAAAAAAD/AP8AAAAAAAEBAQD///8A/wAAAAAAAAD/AQEAAAAA AP8A/wAAAAAAAQH8AAIDAgAJBwsABQUFAP///QDw8vEA//3+AP4CAAAAAAAAAQEDAAEABwAEBQIA BAX/AAH/BgAA//UA9vDPAOniuwAB+eYABAADAP3/AQACA/0A/gAAAAH/CQAC/wQAAAADAP8B+wD8 BhgADRQ/AAwOKAD9AAUA//7vAO7lxgDu4b8ADQT0APn9DgAFETEAFRs2AP0ADAAAAAIAAAIDAAAA AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAgAAAAAAAAAAAAAAAAAAAAAAAQAA AAAAAQAAAP8AAQD/AP8AAAACAgIA/wABAAD//wABAAEAAAAAAAIAAAAAAP8AAf8CAP8BAgD/AAIA AAAAAP78+gD08O8A3dfQANLNwADh28sA9vLpAPz6AAD9AQ8AGBslADtDMQBFO9kA//27APj48gAL CCIA+fsDAAQD+gADAf0A+PL/APHp/wDv8wAA5PUIAOHdCQDmuvsA/c0ZAAz+DAAGAQUABwMBAAT/ AAD9/v4A9//8APf/+gD9/vsA+/3+APoJCgALJykAyPP2APDi5gAQ+v0AHRQUAPwPEgArIR4AH+7K AALs9gACAAEAEfj/AB70/AAT9/0A8vv/AP0EAgABAf8AAgIAAP4FAgAA/AEAAgP/AP7+AwACBfAA CwfeAAn2+wD65/EA9fIlAPgXIAD2+wAA/v3+AAoEDgANDA0A/P39APLy8wABAgIAAQICAPTl5QDb 6usAFP0mAPIqFwAZDw8AEhwKAAkUIgDz7ewA7eTdAP/t5AAGBfcA//zzAOfYxwDk3dQADRQcABUd JwALERcAAQYLAP4BAQAAAAEAAQAAAP8A/wAAAAAAAAAAAP8A/wD+/wIA/wAAAAEAAQAAAP8AAf8A AP8B/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQACAP8AAQD/AAAA////AAAAAQAAAP8AAQAAAAABAAAB /wEAAQABAAAA/wAB/wAA/gD/AAP//wAKAP8ABPz8AAT//wAdBQUA/hMUAP0WFgD6AwUA/P3+AAb3 9gD64dgA3s3QAO3RwwAB7+gACP76AP8BAQD8AQEAAwABAAMC/wABAgEAAAAAAAIAAQACAP4A/QAA AP8AAAADAAIAAgH/AP4BAQD//wAA/wEAAAIAAQADAQEA/wMIAPkRGAAFKjcAAygwAPEPEgACAgQA AwAAAAMA/wABAAAAAQICAAH/AAAA/wEA/wAAAAEBAAABAP8AAgD/AP78/AD//QcABAX5APv49wAB /wAAAQEBAAQEBQADAQIAAAYAAP8BAAAA/wEA/wABAP8CAgACDQ8AGQkIAOvZ2ADt8OwAEQQAAAcG AwAA/PsABgIBAP/+/wACAwEAA//9AAH8+wABAAEAAwEAAAYEAwD/AwMA/AYGAPsLDgABFBgAESUp ABwuMgAVJSgAChQVAAQICQD/AgQA/gAAAAEAAAAB/wAAAAEAAAAAAAD/AAAAAAAAAAAAAAAAAAAA AAAAAP8AAAAAAAAA/v7/APz8/AAEAgIA/v7+APn8/QD/AgIAAAECAAABAQAAAAAA///9AP8A/wAC AQEAAAAAAAP+/wACAQEA+wEBAP///gAFBwYAA/7/AP79+wAE//8AAQQDAAQCAgADAAkAAQD8AAD7 BAD5/P8AAf3/AAIEAAD+/v8A/f7/AAMB9gD6++MA/vvfAAL/8AD+/v8A/AIXAAkOKwAGCSIA/QD8 APr77QD+AQoAAgUFAP//BwAEAgMABQocAPv47gAB/PwA/gD1AAYFCwD9+vkA8fL2AAkMGAAKDh8A /AALAPv7/gAJBf0A/wAFAP7+AwD9/QAAAgH/AAEBAAD//wEA/f4AAP///gAAAP8AAAAAAAAAAAD/ /wEA//8AAAH//wD/AgEAAQcGAAQREQD9AAAA8vn5AAMCAgAFBgcACA0JAAoB/QAWFhQABAgJAAUM DAD/AwgA/wMEAP/+AAD/Av8AAAECAP7/AAAAAAAAAQECAP8AAgD/AAAAAAAAAAAAAAAB/wAAAf// AP8B/wAAAAAAAP8BAAIA/wABAQAA/wABAAABAQAA//8AAAD/AAAAAAAAAAEAAQAAAP///wABAAEA BAECAP8C/wAEAgIAAQAAAP77+wABAP8AAQMBAAABAQD/AAEA/f0BAAIA/wADAQQA//8AAAEA/gAB AQAABgQBAAQAAgAOBQsAAf/9AAoGBAAFAQAAAgcHAAIBAgADBQIA/vf+AAL5+QD+9PQA7+vrAO3s 7QDx8fAA/Pf3AAL6+AAA/wAA/fj3AAP7+wD99fYA/fr6AP///gAABQUABAsHAAMKCAABBQQAAgMG AAIDBAABAwMA/gMDAP4BBQD+AAEAAQABAAMBAgAAAP8AAf//AAIBAAD9//8A/fz7AAIBAAAEBAcA AAUHAAL/9AD/AQAA/gIIAAD//gD879wA69q9AAf9+QAKDBMA+PPnAPDl0QDu5NgA8+73AAD+AAAM BfwAAvjxAAD/BwD8ABcAAAcVAPwDDgAB/+wAAfrwAAID9QAA//0AAgL4AAL+8wD+/e4A/v73AAAB +gD//PkA//nqAP358QAABwkABwUDABMNCADw+O4A/PwCAAEFEwD//gkAAAACAAEAAAAAAP8A+/v9 APb6/AD/AAAA/QH+APn8+gAB/wAABAIAAP4BAAABBAMA/P4BAPP7+gDi7e0A9vz6AP8GAwAEBgEA DAMCAAAMCQAB/P8A//n6AP37/gD+//8ABAD/AP0B/wD6//4A/Pv9APX7/AD2/fwA8fz8APf9/AAG /wAABf//AAD9/QD+AAAAAvf6AOzl4wAUFhMABgwPAPwAAgACAAAAAAD/AP0AAQAIBQUAEgIFAPz5 +wD7/PwA+QMEAPv8/QAA//4AAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/P38APn4+QD9/f8A /v79AP///wAAAAAAAAAAAAEBAQAAAAAAAAAAAP//AAAA/wEAAQEBAAAAAQAAAAAAAQEBAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAQEBAAAAAAD///8AAAAAAAAA AAD//wAAAAAAAAEBAAAAAAAA+/v7AP7+/gD/AgEAAAAAAPr6+gAGBgUABAQDAAEBAQD+/v4A/v7+ APv7+gAFBQQA/f3+APb29gAQEREAAgICAAAA/wAAAf8AAQAEAAAA/wAAAAAAAAAAAAAAAAABAQIA 9PT0APHx8wD6+vsACQMEAAQCAQABAQAAAAABAP//AAAAAwIAAQACAP//AQD//wEAAgIBAAAAAAAA AAEAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAQH/AAECAAAAAAEAAP8BAAAA/wAAAAAAAAAAAAAA AQABAQIA/v79AAAAAQABAQEAAQEAAAEB/wAAAAIAAQECAAAAAAAAAP4A////APz9+wD4+PcA7Oz6 AP79+QAPDQ0AIiIgABIUFAAEBQUAAAEBAAAAAAAA//8AAAAAAAAAAAAAAP8AAAAAAP//AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP///wAAAAAAAAAAAAEBAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA////AP7+/gD7+/kAAQAAAP8AAAAA AAAAAAAAAAAAAAAAAAAAAQIAAAAAAAAAAAEA//4AAAAAAQABAQAAAAAAAAAAAAAAAP8AAAAAAP7/ /gABAQEAAQEBAP//AAAAAAAAAAD+AAUFBQAEBgUA/v7+APf39wD//fwAAgIDAAAAAAABAQEAAgED AAQFBgAGBgEAAQIAAAD8/gD69N4A7uW0AAL5ywAGAPEAAP8CAAABAAD+//oAAAAFAAL+BAAE//8A /gICAP0DEAAIETgACxhJAAEHIAACAAAA9u/WAOrdsAAK/9QABAP7APkHKgAWH00AAQYlAAEABgAC AP4AAAEBAP//AQABAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAA/wAAAAAAAAAA AAD/AAAAAAEAAAEBAAD/AAAA/gADAP8AAQD/APsAAv/+AAL//QACAf0AAAD8APz/BwACAQQA/f// AP/8/QD+/PUA+PTtAObf1wDKwbcA29XLAPz6+AABAgoA/wEXAAwUEAA4PjEAS0w/ABYQ2wD/+d0A Dgn1AAkJCAD2+vMA7vPuAA39+wALBREA9PEHANns/gDg7gAA2tP5AO3K/AAM2A8AGPkTAAQEAQAE A/8AAwECAP//AQD7/vkA+f/4APj//gD8/gIA+wH9AAUQ9gAJFe0ABusIAAQIIAD7CxgA7QUBAPHz 9AAPA/kALxoQAADl+gD8AAQACAD5ACgPCADSBv8A4/v/AP0GAwAC//8A/wb+AP4DBAAAA/8AAQL+ AAABBAD/BPsA/wTxAAcEAAAM+/oA/OrqAPz36AACGSgA+f4cAPcMCwAOBQkA7eboAAH8/AAUGBsA AggKAPsKCwD36+sA0tHUAL8TBwAJQjMAERMIAAQGBgAQGRsAEhcVAPLr6QDi3NYA+vPrAAsJ+wD4 +fgA7+LYAOzk3gAWHSQAFh4mAAUMEAAABQoA/wIFAP8AAwD/Af4AAv//AAL//wD///0AAAEAAP4A AAD/AQMA/QAAAAD//AD/AQIAAQD/AAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAA AAAAAAD+AQIAA/8AAAAAAAD/AQAA/wABAAAAAgAAAAEAAAAAAAAA/gAAAAAAAP7/AAEA/wABAQAA /wAAAP//AAD+AQEAAAACAP8A/wAB//0AAf/+AAUAAAADAP8AAf8BAAABAgD+AAEA/gABAAX8/QAE 9fQA++/sAO/TzgDYubAA/uriAA359QABAP0AAAEBAPwBAgAFAgEAAgEAAAQAAgD+/v4AAAEBAAAC AAD//wAAAv7+AAAAAgABAQIA/QEAAP4AAAAC//4ABf/+AAEBAwD6Bw0A+RMaAAosNgD/IioA9wkO AAEDBgAIAgIAAgEAAAMCAwAEAgEAAQEBAAAAAAAA//8AAAADAP7/BAD9/AMA/QICAAH/AQACAQIA AP7/AP/9/gAA//8A+gABAP8CBAAA/v4AAAD/AP8B/wABAAIAAAABAP8BAgD/AQAACQoJAA0PEgDr 2dYA6+TgAA8EAAALBQcA/fj4AAQCAQD+AAAA/wD/AAIDBwD/AwQA/gcHAP4JCgD/CwoAAxEUABUl KgAnODoAEyAkAP8ICgD9BQYA/QMDAAEBAgAEAf8AAgAAAAAAAAABAQAAAAAAAP8AAAAAAAAAAQAA AAAAAAAAAAAAAP8BAAAAAQD+AAAA////AAAAAAD7/v4A//8AAPn8/AD+AAEAAwQEAAIAAAAEAQAA BAABAP0AAwD5/f4AAQECAAABAAD/AP4AAP8AAAAAAAABAf8AAQL/AP79AAD/AgIAAv8BAAMCAwAF BAgAAQD8AP7/+QD+/v0A/QAFAAEBAAABAwMA//37AP/89wD//OoAAv/xAP7//wD7/hAACQsjAAUF GQD9/gIA/Pv0AP399QAC//QABAMKAP8BBQD+/wgABQocAPv+BgACBAQAAQEIAAIFDAD29fkADg8g ABAVIgADCxcAAAIDAP3+/AD8/gEAAgMDAAECAQABAf8AAAEBAP4AAgD//wAA//8AAP//AQAAAAAA AQEAAP7+/gAAAAEA//8AAP4A/wD+AQAAAAMGAAIMAgAHBwcA//79AAH/AAACAQIA/gL9AAIA+QAG //4AAQMGAP8DAwAAAgMA+wD/AP///AAB/QEAAv8CAAECAAAAAQEAAAABAAAA/wAAAAAAAAEAAAD/ AAABAQAAAAABAAEA/wD/AAIA/wD+AP8AAQAB//8AAAAAAP8BAAABAQIAAQH/AAAA/wAAAAEAAAAA AAMAAgD/AAAA///+AP8AAAD///4AAwAAAAYCAgACAwEA/wEAAP4A/wD9/v4AAAMAAAYAAQACAgQA /v7+AP///wAABwcA+fv8AAEBAAACAAAABAACAAkHBgAD/wAABwMDAAYFBgAFBgcA9PPzAPLu7QD2 494A6NjZAAH+/wAEBQIAAQD9AAMAAQAEBgYABAH/APr69wD6+/oA/gD/AAQIBwAECAcAAAcFAP4A AgD5/AIACgQIAAIHCwD+AwgA/wECAPn7/gD//PwAAgIBAAAEAAACAgEA//8AAAAAAgAGBQUABwgG AAUFBwAA/wQA/wD+APn5BwD5+/4ABAH9AAj65gDn3MMA+fHnABIYGQD8+e8A9OzaAO/n3QDw6/UA +fcEAAoF/gAC//0A//n9APcBDQD/DRwA/QMPAP7+BAABAwwA+/0IAAT97QAF/eMAAgUFAAAC/gAC AvcA/v73AP8A/wAA/wEA8ezyAPb07gD58/4AFR79ABMNHgAGBgQA7/bvAPX+AgAF/woAAv/+AAEA AQAB/wAAAAECAPj9/gD5//4A+v/8APT8+wD5/wEA/wEBAAMAAAAGAv0A/AEBAOz09QDy8u8A8vn2 AAD99gDyDQwAEAwNAAsJCgAJBwgACAgKAAX+AQAD/PwA//3+AP/+/gAB//8A/P/+AP7//gAEAAAA DAQFAAMCAgACAgEAAwD+AAH/AAD9/v8A/wABAP8HBQACBwgAAgkHAAQBAwAE/wAAAf39APz//wD9 //4A7PHvAO/08wD5+vsAAwIDAP4GBAD+//8A////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/Pz8 APv7+wD//wEAAAD/AAAAAAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAAAAAA AAAAAAAAAAABAQEAAQEBAAEBAQAAAAAA////AAEBAQD///8AAQEBAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAD///8AAQEAAAAAAQAAAAAA+vr7AP///wABAQIABwcHAAEBAgD///8A/Pz9AAEB AAD8/P4ABAQEAAUFBAADAwMA7u7wAAEBAQAGBgYAAgICAAAB/wAAAAEAAAD/AAAAAAABAQEAAQEB AAEBAQAAAP8A8fHvAPT08gD///4A/f39APv9/gAFBwMAAAAAAAICAgAA/wAAAQEBAAICAQABAf8A AAABAAAAAAABAAIAAAAAAP8A/wAAAP8AAAD/AAAAAQAAAAAA////AP4A/wAA//8AAgABAAEBAAAA AAAAAAAAAAAA/wAAAAAAAQEAAAICAgADAwMAAAICAAD/AQAAAP8AAP/9AP38+gD7+/oA+/v7APz7 +QAODgkADAwLABwbGgAODAsAAQEDAP8AAAD/AAAAAAAAAP///wABAAAAAAAAAP///wAAAAEAAAAA AAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA AAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/v7+APj4+AD///4A AAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAP///wABAQEA/wEAAAAA/wAAAAEAAAAAAAAAAAAB AQEAAAAAAAMDAwD///8AAAAAAAIDAQAAAQEABQMGAAYGBgABAf8A+fn4APr6+gACAgQAAAAAAAAA AAABAQMABAUDAAcIAQABAwIAAP7/AP775wDv6r8A+vLJAAX+7AAC/wMA/wABAAAC+QAD/wEAAP0I AAIBAAABA/UA/wILAAILLQANGEUABgwoAP4CBwD99+UA8OO+AAb50wAGA/AA+QUgAAoaRgAIFDsA /QEQAAL//gABAf0A/v8CAAD/AQAAAQAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAA AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAIAAAECAAAAAAD///8AAAD/AAAA/gAA/wIA/wECAAH/ AgD///wA+PTyAO3p4wDj3dYA3NbLAOLb0gD28uoAAQH/AAgKFQAWHSwAJywxADQ0HAAiIfAABQS+ AA0GyQALD/QA//0SAOnp/QDz9vgABggEAAsHDADk8QoAxt34AMXc9gDj3wEABNoQABPdEgAS+AoA BQb5AAICBgAGAQMA//4BAPf//AD3APsA+//+AP39AgD3AfsABRDzADI0BgAOFuEA/vwdANgA/AD9 A/kA/gD0ABD98wAo/usAEPDnAAL6/gD0AAUA/Q37ACUkCQAqDAIA0/L1AOv7AQD8Bv4AAv/+AAAB AwAAAwMA/wX+AAP8AAD9AwMA+AX/APUC9AATBf8AFQbwAAn29AAQ/gsA+foJAP71EAD6+hYA+Pr7 AOzl6AAIDQ0ABg8QAAMLCgAEDw8A9urmAK6/zQDY3OAARTouAC0sHwASFQ0AAAQGAAgUHQAjDhUA 8evnAO/r5AAH8uwAEwbyAPr28wDw5NcA8OngAA8VHAAQFyAACBIZAAEIDgD/AQMA/gABAAD//gAC AP0A/v8BAAEAAQD+AP8AAAEAAP8AAQAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAABAAAA AAAAAAAAAAAAAAAAAQABAP8AAAABAAABAQAAAP4AAAABAAD/AAAAAP8AAAAAAAABAAAAAAAAAQIC AAH//wAAAP4A/gD/AP//AgAAAQEA/wD/AAEAAAABAQEAAQAAAAEAAAD8AAEA/AMDAP4CAgD///8A A/n4APXr5wDy3NYA5crFAPDZ0QAI9vAABf77APkFBQD/AQUAAgEBAAMA/wAD//4AAAD/AP4AAAAB AgIAAQAAAP///wABAAEAAgIAAP8AAAD+/wAA/wABAAIB/wACAQAA/wIDAPoKEAD9GCEAAygyAPcZ HwD+BwkAjRMflAAAIABJREFUBQD/AAf++wADAQQAAgUFAAMDAwACAgIAAwICAAECAQAB/wAAAAEA AP/+/wD+BgUA/fwFAAQFBgAFBwcABgYGAAkJCQD29QsA9/X0APr4+AD++/sA///+AACA/38A/v/+ AP//AAAA/v8AAP//AP8A/wD9AgMAAxESABkxNQASHyEA8ejlAPX08gAD/PsA/gAAAAMCAAAFBwYA Bw0QAAsSEwALFBUADRcYABEdHgARHSAABRAUAAAFBgD6AgIAAgIAAAMB/wAB//4AAf0BAP8AAgD+ Af8AAv//AP4AAAABAQEAAAAAAAAAAAAAAQAAAAAAAP8AAAABAAAAAgAAAAD/AQD9//4A+f39AAEA AQD7/f4A/AEBAAQDAwD9/fwAAQEBAAcCBAAA//8A/QACAPj7+gD//wEABwYEAAD/AAACBAMAAf4A AAICAQACAAAA/v//APz8/wABAAIAAgECAAQCAgABCwoA+v3/AP0A/AD8/P0A/v8BAP//AQADA/0A +/r6APz89wD+//0A+/4LAAgKJgAMDSUA/AADAPr36AD++ugA//nmAP735QD1+AAAAgkgAAYJFwAA BBAABgoCAAMEBAADBxAABAMKAAwOBwAMCxMAAQcQAPwCBQABAgAAAAIBAPn9AAADCAcAAgMBAAEC /gD/AAEA////AP8A/gD///8A/wABAAAA/wD+/f4A/v7+AAAA/wD/AAAA/v8AAAAAAQD+AgIAAgAF AAEBAgACAAAAAQH/AAAAAQD+/vgA/f76AP//AwABAgAAAgEAAAABAAAA//4A/wAAAAIA/wD///wA AAAEAP8A/wD//wAAAAAAAAEBAAD/AAEAAAAAAP8BAQAB//8A/gAAAAAA/wAAAAEA/gD/AAIBAQAB AAAAAf8AAP8B/wD+AAAA//8AAAD//gAB/wAAAwICAAABAAD/AP4AAAAAAAABAgD///8ABAQCAAAC AQD+//4AAwABAAICAgD8//4AAAAAAAYDAgAAAAIAAAAEAPf7/QABAAIA/v7/AAUDAwAEAgEA/f38 AAQCAwACAAIAAwEDAAIAAQABAf8A8/LxAPzn6gDn4+UACAUEABESDQAEBgUAAgcIAAoPEgAECAkA 9/j6AAAEBgACBgUA/wYEAP0EAwABAgQAAAAEAP7/BAAFCQ4ACQ0QAAEE6QD8+vsA/Pb3APn28gAQ EQ8ABQYIAAMGBQADAwQAAgEDAP//AAD7+/0A9fj3APv7/QABAgMA/v/9APz69AAKBfQA9uX0AP31 6gANDxYA+vr6APTt2gDr4tQA8O3wAPr7AQAA/v8AAQH/AAIFAgD7AQkAAQchAPwIIgD7AAcA///8 AAAEEQD8CCUA+fn7AAH72wAF/fEAAwUDAAADAAD/A/0AAgUJAPz+CQDv7PAA9PH3APbz1wDz9PQA ERwoAAgPIgARBxgACQIGAPr+7gD9+O8A/PoLAAMFBwAGBwYA/gMDAO7y+AD0AP8A/gABAP0CAgD/ //4AA///AAX+/QD5/PwA9vf1AAgFAQAICAkABgL9APf17wD29/UABAUGAAkICAAJBwgADQgIABAH CQANCgYAB/4AAAEE/gD79/kADw0AAC0gIAAZ8hAA7PLwAPL08wD1+fgA+//9AP0B/wD/CAQAHRgU AAsIBgACBQIA/wEDAAUAAAAEAQMA+gECAPn/AAD8BQYA9QMDAPQBAgAC/v4A+v79AP4BAgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD//wAAAAAAAAEBAQD///8AAAAAAAAAAAABAQEAAAAAAP// /wAAAAAAAAAAAAEBAQABAQIA////AAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAA AP///wABAQEA////AAAAAAABAQEAAQEBAAAAAAD///8AAAAAAAEBAAAAAAAAAAAAAP///wD4+PkA /Pz+AAICAQABAgIACAkJAAIBAQAAAAAA/v7+AP7+/gD9/f0A/v4AAAMDAQDp6eoACgkMAAUEBQAB Av8AAAABAAD/AQAAAQAAAQEBAAAAAAAAAAAA////APz8+wDv7+0A9fb2AP39/gD9/f4AA/7+APz8 /AAJCQkAAQEBAAMBAQD+//0AAAD/AAEBAQAAAAAAAAAAAAAAAAAAAP8AAQEAAAAA/wAAAAAAAAAB AP///wACAgIAAP8BAAEBAQAA//4A/v7/AAEBAQAAAP8A/wH/AAD/AQD+/v4AAAAAAP7+AAAA/QAA AAH/APr5+AD28/AA+fv4APz8+wADAQMAExUVABgbGwAEBQQAAgECAP8AAQD/AAAAAAD/AAAA/wD/ AAAAAAAAAAAAAAAAAAAAAAAAAP8A/gAA/wEAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD///8AAQEB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP7+/gD5+fkA/v79AAEBAAABAQEA////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAA AP///wAAAAAAAAABAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAAAAD/AAMCAwAGBgcA AwMCAPv7+gD5+foAAQEBAAAAAAAAAAAAAQEBAAIC/wAFBgIAAAP9AP//AAD/+fEA8Oq/APXuvQAD /OcAAf8EAP4ABwAAAfwAAAAAAAL/BgAAAAEAAwH7AP8C/wD+BxkADRdBAAcQNAD+AAYAAfzsAPLn wQD67cQABP/qAPsEFAAGFj8AFSNJAPsCEwADAAAAAwD7AP//AQABAAQA/wABAAAA/wAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAEA/gAB//sA AAD/AAEB/gAAAAMA/QAFAP0AAQAAAAMAAfj1AOji1wDd1MwA2NPNAOzo4gD49vIA/v8AAAYKGgAW HCUALDEzADIzIQAaGPMADQfMAA8J0wAQCugAAgHtAO3wDgDv8icA/P4YAAwIBwAJCfgA4O/pALfS 2QDA1O8A8eYKAA3iDwAR3g4AE/UMAAgCAAABBv0AAQD+AAH7BQD7/v0A9QL1APgA/AD/+wYA/P7/ AAAT7gArPgEASDwJAN23wwBD6iMAOhYBAPUR5QD5AvoACvr8AB7o0QAH4twABP7/APIEBQACHA8A EB4JAC0IAADL9fMA8vr8APkFBAD9AP0AAwD9AP4D/wD+CQIAAAL9AAD8/wD8AQEA+/4HAAEFBgAO Af4ACvntADIjAwATJx0A3vgFAO368AAQCgYA9wkGAPju6wD9+PIABRETAAoVFwD6Cw8A+OzqANHq 5gDkr8EAONogAD47MAAhIxoABgoFAP4GCgAMGSIAChQaAPfw6wDx6uUA9OzkAAH48wAB/foA/vHk AO317gAK8x4AEBwlAAIJEwD+AgYA/wEEAP0AAQAB//8AAQD/AAH//AABAAAAAP8CAP4BAAAAAAAA AAAAAAAAAAD/AAAAAAAAAAEA/wAAAAAAAAEAAAAAAAAAAAAAAAD/AAH//wAAAAAAAP//AAEAAAAA AP4AAf8BAAAAAAAAAAAA/wAAAAAAAQD/AQEA/wAAAP8AAgD+AP8AAQABAAEA/gAD/wAAAAAAAAAA AQD+AQEA/gABAP4BAgAA//8AAfn3APzt6QDv3dgA5MzGAPXf2gAB7+sACfz4AAIA/QD/AgMA/gIE AAEBAQAB//8AAf//AAEB/QD/AP4A/wABAAEAAAAB/v4AAQAAAAAAAgD9AQAA//8AAAIA/wAD/v4A AQEBAPoFCAD6DhQA/x0mAAEgKQD7FBkA/wYJAAcCAQAGAQAABgECAAIDAwACAwMAAgMCAAMDBAAD AwMAAgMEAAEB/wABAQEAAAAAAP///wD//f4A/v7+AP38/QD8CgoA/fr6AAv5DgD5+PgA+vf3APr4 9wD8+vkA/P39AP79/gD9/f0AAP38AP/9/gD9//8AAAAAAAD+AAAJExUAESImAAD9+wAD//8ABgUE AAsMCgAOEREADxMUAAoOEAAFDAwAAwkKAP8FBgD9AQMA/gECAAEBAQADAQAAAgH/AAEAAAACAAEA AAEAAAEBAQD/AAEAAAABAAD//wD/AQIAAQABAAAA/wAA/wAA/wEAAP8BAAAB//8AAQAAAAIA/wD+ AAEA+v3/AAMCAgADAwQA/f37AAD//gAEAgEABgQEAPwAAAD9AgEA+/7/AAEFBQD+/P0A+Pr5AAYH BwD///4A//8BAAEAAgABAAAAAAAAAP///wADAwIABQIDAAIB/gAEBwcA/gEBAP3y8wD+/gIA/vz8 AAD/AQADAwUA/QEFAAH+BAD+/QIAAgINAAsLGQAAAAcA+vrwAP755gD99eEA9+7YAAD+9QAFBxUA BwkNAP8CCgACBAUAAQADAAABBwAFBREABQQIAAoIDAACBgwA/gIGAAECAgADAwUA/gACAP4BAwD8 /v4AAwACAP4A/wAB//8AAAD/AAAB/wD/Af8A//8AAAH/AQD///8A/wACAAAAAAD///8A/v//AP8A AQD9/wAAAgAAAAQDBAADAwMAAgECAP8A/wD+/PoA/PsCAAAABAABAAMABAEAAAEA/gD//wIA//8A APz++wADAwEAAgMBAP7+AAAEAwYA//8AAAAA/wD/AAAAAQEAAAAAAAD+AAAAAAAAAAEBAAAA/wAA /v//AP0AAAACAP8AAQECAAD/AQAAAQAAAAAAAAAAAAABAQAAAgMBAAECAAD+AQIA////AP8B/wAA /gAA/gAAAAD+/wABAQEAAf//AP8AAAADAQAAAwIDAAEAAAD//wAAAQIBAAD/AAAEAAQAAQECAP78 +wAA//4AAQQFAAQCAgABAAEAAQEBAAMDAQAFAwIA+/j3AP349wALCQoA/gH/AAIJDAAKEhEADA8S AA4QEQAACAkA/AMEAP8FBAD/AwMAAAMDAAEDAgACAwIAAAIDAAIEBAABBQMAAgMAAAQB/wD89/UA +O/uAPLu7QASDAsABgQFAPz+AAD5+vkA//z9AP38/gD9//8A/v//AP7//wD+AwoABP/wAALz1wD7 /OkA+Q0PAA8RFwD39/cA7uvVAPDk0QDw6eUA9/X8AP//AgADBP4ABQgDAAYNEQD/CR8AAgspAPwA EwD//wIA/wD8AP4BCAAACSEA/wT/AP339QAB+fIAAv7zAAQE/wAAAwIAAwEGAPr8+gD69f4A+vcA APn4+QD09t8A7O3xAAoP4gATGSgAFR4uAPkC/gD57QIA8f76AAwSGQAMCAgAGRQSAO/z9wD09vkA 9/39APn/+wABBQQABwQFAAUBBAD4/gEA7Pr+AOz19AAJBwAACAkHAAgDAgACAwAA/wD8AP728wDv 9PIA7QMCAAkGCwAPCgoAEAwNAAcGCgD6/AUACwYHABoYFwAEAf8A9PX0AOrs6wDl6egA6O/tAPP3 9wAEAgEABQkFAAL9/QD9AQEA/QD/AAIA/wAAAAAA9wH/AP8BAgABBQUA9wQFAO3+/wD8/P4ACf39 APsAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAQAAAAABAQAAAAAAAQEBAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA////AAAAAAD//wAAAQEAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAQAAAAAA AP39/gD6+vsAAAABAP7/AAAC//8A/v4AAP4A/wABAQAAAQABAAQDBQAFBAYAAAEAAPb29gD39/gA FBMVAAICAgAAAAEAAgEDAAABAAAAAAAAAAAAAAEBAQAAAAAAAAEBAPf4+ADu7+4A+fj3AAIBBQD+ //8AAP//AP///wD///4AAAD/AAECAAACAgEAAAAAAAAAAAABAQEAAAAAAAAA/wD/AAAAAP8AAAAA AgAAAAAAAAAAAAAAAAACAgMAAf8BAAIB/wD/AAAAAQEBAP8AAAABAAIAAP//AAD/AAD//wAA//4A AP/8/QD6/vUA9PPxAPP08AD7+/oAFBUTAB4eHAAPDhAABAYHAAABAQD/AAAAAQAAAAAAAAAAAAAA //8AAAAB/wAA//8AAAABAP8AAQAAAAAAAAEAAAH//wD/AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA/v79APv7+gD9/fwAAQEAAP///wABAQEAAQEBAAAAAAAAAAAA////AAAA AAAAAAAAAAAAAP8AAAAAAAAA////AAICAgD///8AAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAgED AAYFBwADAwEA/f39APj4+gD//wAAAAAAAAEBAQD///8AAQEBAAQFBAAEBAMAAAACAP/99QD1784A 8ue5AAP32AAC//wA/v8KAAEC/wACAAAAAQAKAAEABQACAvoA/wL7APwEGQAHETkADBY2AP8FFAAB /vcA9+vSAPPitwAE+toAAQQIAAANNQARHUsA/QMaAAAAAgABAPsA/wABAP8AAgAAAAAAAAH/AP8A AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAA/wAAAf4AAP8BAAH/AgABAQAAAAAA AAAA/wAA//8AAAAAAP8AAgD/AAIAAAEDAAIB/QD9+vUA59vSALeupADs49cA/vz5AP0BAgAIDBAA FRoiACgrNAAvNDIAGxsCAAsHzAAPBcIAEgvcAAcE9wD39/wA6vIXAPP1KwAABkAACBAoAPr+9QDQ 5s4AvtXpALzY+AD47hEAGeINAB3eCQAZ8QoABwH/AAIDBAAG/ggA/gH6APv9AAD4APwA+QD5APr+ AQAB/wEA/wzyACE4+QA9TRIA/9zhAAzT6wAY7fQAAOvaAP3yDgACDw4AAu75AALh4QAF8vYA+AEO APoTEQAaNiEADB36AB324wAnBQIA3vX9AOz+CAD/AP0ABAL5AP0EBAD8CQoAAvz8AP/9+wAABgAA BQoOABMEIAAC6/UA7eXlAOPgywA8QDwAOyAoAM/l9QDf7vkAIREgAPnv7QD48fEA7/vwAOzy9QAD CxMABxsfAPwMDgDs6OUAtczgAN7l7wBBOSsALCseABQYEQAFBgUA/wQHAAgSGwAHDxgAChMaAPDq 5AD/9e0AAPjxAPX08wDw6OAA/wICAAkR9wAFCRAAAwcMAAABBgD+AAMAAf/9AP8A/gABAP4AAQD/ AAAAAQAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAP8A /wD/AAEAAAABAAAAAQH/AAD/AAD/AQEAAAABAAAAAQAA//8AAAABAP8AAAABAAAAAQH/AAL/AAAA AP8AAAABAP4BAQD/AgEAAP7/AAL49wD+7+sA9eLcAOrRygDq0swABPLtAA39+wAA//4A/wEAAP4C BAAAAAEABQD/AAL//wAAAP8AAAIAAP//AQACAAIAAQAAAAH//gAAAQEAAQABAP3+AAD/AgEAAAD/ AAIA/gABAQEA+gcLAPgRGAD8HicA/x0kAP0NEwAEAwUACAD+AAcAAQADBAQA/wYGAAEEBAAEBAMA AwQEAAIDBAACAwQAAwMEAAMCAgACAgEAAQEBAAABAQD//wAAAAAAAP39/QAA/fwA/fz9AP37/QD9 /fsA+/r7APz7+QD9+/sA/fz8AP39/gD+/v4AAP/+AAH//wABAAEAAgEBAAIDBQACBgQABgYIAAUH BgAHBwcABQgIAAQFBgABAgIA/wEAAAABAQD/AAEA/QEBAAEAAAAE//8AAP79AAMDAgAAAQIA/QEC AP8BAgD/AQIAAgIDAAEBAQAAAAAA////AAAAAAACAP8AAAABAAAAAAAAAAAAAAAAAP8AAAAAAAAA AAD/AAEAAQABAQIA+/z9APwC/gAHBAQABAIDAAUFAwD9/PwA/P7/AP0A/wD4/PwA/QD/AAcEBgAB //4A//8CAAMCAgD4+foA/v7/AAMBBgADAwMACAUFAAUCAQD/AAIAAgADAAEAAAADAf4ACQoGAAz+ CwABAgAA+fj/APn7/wADAwQAAQYOAPwEEwD5/+cABAMEAP39+AD5++oA/v7wAAH55QD27NcA//rw AAEHCwAIDBwACAsZAPz8CwD9/PgABAMKAAMFDQAFBQgAAQEBAP8CBgD+AQMAAQMEAAIBBQD+/wUA AQIGAAECAgD9/vwA+/oAAAIGBgAABAAAAQH+AAIAAAACAgAA/v7/AAAAAQABAgEAAf8AAP79/gAA /v8AAgEBAP4AAQABAwMA///+AP8AAQD+AQIAAAABAAABAAAAAQIAAQIEAAAABQAA/wIA/v8AAAIB AAD+AP8AAP//AP3+/AD///8AAQEAAP8AAgACAgQAAAABAAAAAAABAAAAAQAAAP///wAAAAAAAAAB AAEAAAABAAAA/gABAP8A/wD/AQEAAwIAAAD/AAD+AP8AAQEBAAICAAADAgIAAwMBAP8B/wAAAAEA /wAAAP7+/gD/Af8A//7/AAAAAQABAAEAAAABAAEAAAAEAAMAAAEBAP7//wAAAP8AAwADAAYDAwAD AAIAAAIBAAMFBAD//fsA/f39AAEBAgAEBAQA/wIAAP4A/gAEAwEA//7+AP/+/gAQGRgAChERABge HwACCAUA//4AAAMICgAAAwUA/gIDAAADAQABAgEAAQECAAECAQD/AAAAAf/+AAD8+wD68e4A8vn1 AAD59gAB/PoAA/z8APv19ADx7O0A/wIAAP8DBQD//v8AAf7+AAEAAAD+AP8A/gEBAP///wD/++0A AfvbAAX41AAHCQUABQkdAPf8BAD08esA8efWAPDp4QD59fkA//wAAAMB/gAFCAUACxQYAAsWIgAC DSAA/QMXAP0ABQD9/wEAAAAAAP4A/wABAQcAAAYZAAABKAD9/fgA/PrhAAL98gADBPsAAgL3AP/3 9QAC+/oAAv8AAPn7AQD3+P4A8vLrAAMG8AD89/QABwT6AAwWJAAEAvgA++71APH37QAJEBoAFgsM APEOBgD5//0A6/P7APT4+gD3+PgAAAMCAAIEBwD7/wMA7v0AAOf2+gD/8PIA8AcCABMHBwASDAwA DAoKAAgGBQD5//8A9fv+APX28gDv8u4ABQYIAAQIDQD5+P4ACwIDABUKCQAVDw4ADwwNABUQEgAp ISEA8PLyAO3y8wAHAP0AAwIBAPz+/QD9/wAAAgD/AAL9/QD7/fsA8/z9APL8/wD0/P4ABAIDAO/1 9QD6AgEACwH8AP3+/QAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA ////AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAAAAAB AQEAAQEBAAAAAAAAAAAAAAAAAP7+/gABAQAAAAAAAP///wABAQEAAAAAAAAAAAABAQEAAAD/AAAA /wAA/wAAAAAAAPf39wD8/P0AAQIDAAAAAAAAAAAAAAAAAAAAAAAAAAEA/wAAAP7/AAAB//8A//// AO7t7wAKCQoACgoKAAEBAQAAAAAAAAAAAAAAAQAAAAEAAQH/AAEAAAD/AAEA/wEBAPT19ADt7OwA +Pf2AAYGCQAF/AYA//7/AP///wD///8AAgEBAP///wAA/wEAAAD/AAAAAAAAAAAA////AAAAAAAA AAAA/wEBAAAAAQACAAAA/v7/AAAAAQAAAAEAAAD/AP///wD/AAEA/wABAAABAQAA//8AAf//AP39 /QD29vUA9/bzAPz49wD//foA9vfzABASDwAlJzAACgkLAAACAgAB/wEA/wAAAP8AAAABAAAAAAAA AADJxSqWAAAgAElEQVQA/wAAAAAAAAD/AAD/AQAAAAEA/wAAAAABAAAA/wAAAQAAAP8BAQABAAAA AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAP///wAAAAAAAAAAAAEBAQD/ //8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///0A+vr6APz8/AABAQAA////AAAAAAAA AAAAAAAAAAEBAQAAAAAAAAAAAAEBAQD///8A//8AAAAAAAAAAAAAAAD/AAAAAAABAQEAAAAAAAAA AAAAAAAA////AAAAAAACAgEABgUFAAUEBAD+/v0A+fn5AP7+/gABAQMA/wD+AAAAAQABAAAABQUF AAYIBgAAAQAAAP7+APr13QDz67sAAfXXAAX9+AD/AQgA/QIAAAIC+gAD/v0A//8OAAEB/gABAfsA /QMNAAMNNgAPGkgAAggbAP0A/QD89+cA8uTDAAP10wACAvgA+QUpABEYRAAHDCsAAAEJAAAA/AD/ /wAA/f8FAAECAQD/Af4A/wEAAAEAAQAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAwD/AQUAAP8BAAIA/gABAP4AAPv0APHt5ADi3s4A08jG AObi3gAEAAIADxMZABUdJgAgKDEAJickABoW/gAE/9EACv3WABkL3QANB+AA+fj3AOLsGAD0+yYA /QA9AAYMLgACBykA8/v9ANTkxQC/1NIA0+DlAPvrCQAc6AoAJeIMAB/0CwALBQUA/gT/AAH/AwAE /AQA9P/7APcA+AD0APkA+/wBAP79AAACCvIAHTj3AEBXDwAZEvcA4q/rAA/6DQAZFgkAAhTwAAEB 9AAE7/YA9/n2APz99gD2/wEA9gUHAAUpKAASNzEA9QDRAAn05QApERAAzfsAAO7+BgD9Af4ABAT6 AAEDAAD8AwIAAfwBAAABAAAACgAA/Ab/AAoVFAAWFCAA+vT5AOXk3wDBvq0AWFwcAEUsKgDl9PoA 8vj5AAf/GQAJ/QEA4ejpAMjZ5QDT6OkA8QELAAQQEAAFCQwA+Q8SANXp4wDnuckALNjdADozKAAx MCQACQwHAPwAAgD7AgUAChMcAAcNFQD68+0A+vLqAAX28QD8/v8A+Pj6APbl3gAHBwgABwsPAAgP FwAECRAA/QIDAP4AAwAAAAMAAf//AAABAAAB//8AAAAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAAA AAAAAgD/AAAAAAAAAP8BAQAA/wAAAAAAAP8BAQD+AAEAAAABAAABAAD/AAEAAQAAAAEA/gAB//4A AQABAAP/AAD+AP4A/wEAAP4CAwD+AAEAAAABAAAA/gAE/PoA/O3rAPLe2wDv2tUA8dvWAPzq4wAM +PQABf/8AP0BAAD+AQQA/gEBAAIAAAAAAP8AA//+AAEBAAAAAAAA/wD/AAEAAAAC/wEAAgD+AAAA AAD+AQEA/QEDAAAAAAAFAP4AAAAAAPsDBwD9CQ0A+BUcAPwZIAD7Fh0A/wgOAAYBAgAHAQAABgMC AAQEBgACBQQAAwQEAAMFBQAEBQMAAwMEAAMEBQADAwQAAwMDAAMDAwACAwMAAQECAAEBAQABAQEA AAABAP7+/QAA//4A//39AP7+/wD+//4A/v39AP7+/QD//v8AAP7+AP//AAAAAP8AAgEBAAEBAAAA AAAAAwICAAIBAwAAAgIAAAICAP4DAQABAAIA/wEBAP//AgD/AQAAAAEBAAIAAAACAP8AAQAAAAH/ AAACAAAA/wEAAAECAQD+AQEAAQEDAP8CAgABAQEAAQEAAAAAAAAAAAEAAAAAAAABAAAAAAAAAAD/ AAAAAAAAAP8AAf8AAAIBAQAAAAAA/wABAAAAAAAEAQEABgUDAPv+/QAAAv8AAf8AAPr7+wAAAAEA AAD+AAAAAAD//vsABAIEAAH+/wAHAgQAAAUDAAMBAgD/BAQA//8BAAEBAgAD/wAAAwECAAEDAgD+ /gEAAgABAAD/AAAA//4AAwICAAsIBwAFBAEA9wgCAPDy9wD+/QAACAkTAP8NIQD4+OgA/v/5APj5 8QD+//MAA/3rAP323gAC/u8A/AIGAAEGGgABBx4ABgcVAAYGCAD6+fYA/wD/AAUHDAAGBggA/wD+ AP8AAAD+AQEAAgICAAEBBgACAAgABQYGAAQFBAACAQIA/wABAP7+AQAC/wAAAAH+AP4AAQABAAEA AAIBAAD/AQAA/wEAAP39AP79+wD++/wABggKAAD/AAAAAQEAAQEBAAIAAAAAAAAA/gH/AAAA/QAA AP8AAAAEAAEAAgD/AAAAAAABAP8AAAAAAQEAAAH/AP8A/gD+/f0A/f8AAAECBAD+BP0AAgMCAAEB AgAAAQAAAP8AAAAAAAABAQIAAAD/AAEAAQD/AP8AAAABAAICAwADAwAAAgD/AP4A/wACAAEAAAAA AAMBAQACAQAA/gD/AP4A/wAA/wAAAQAAAAL/AQD/AP8AAQEBAAD/AAD///8A/wH/AAAAAQACAAEA AP8AAAD/AAAAAAIAAAACAAH/AQAAAP8A+vr7AAoGBQAHBQcA/QL7AAACAQAEBQUA/gH/AAACAAAA AgEABAkJABAdHwAVFhcADhYWAP8CAQDu7u0A+/v5AAD9/QAKCAsAAgMDAP4A/wABAP4AAv/9AAD9 /wAC//4AAQD/AAIB/wD46/kA+gICAP77+gD++vsA/fz6APr49gD08e4ABgoJAAUKDAAAAAAAAP/+ AP4A/wD+AP8A/gD/AAD+/AAE+dkAAvziAAsMBQAJEiEA9P0MAO7q5gDq3coA9urZAAD79wD+/gAA AgEAAAQGBgAMExkADxkoAAYPHQD8BBIA/AAKAP4BBAD/AAQAAP4AAAH/+wAC//gAAQH+AP8CFAAA CCcA/P8EAAD54gAE/O4AAv/4AAX8/QAHAwAA+gIAAPwCAQD7/QQA+PP6AAQG/ADu5+QAAAD5ABj4 7gASGPAABwgYAPHu3QD47hsABA8cAAv9/wAdA/wACwkAAAUABQDs+/8A9Pz5APn58QD1/f8A+v37 AAEFCQDy8/IA+PTxAPAB/wDsCvQAEQ0KABIOCwAJCQcACQMGAAwDAgD6BAIA9f37AObr6gDr7fQA Cf4BABUMCwAXFhQADw0PABIKCgATCwkAEQ8SABMUFwAN/v0A9wECAOjy8wACAP8AGg0JAA8CAAAD AP4A+f8AAPX8/wDo8PEA6vP1APv8+wAEAgIAAv3+AAL+/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAEBAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA/v3/AAECAQAAAAAA AAAAAAAAAAABAQEAAAAAAAEBAQABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAAAAAD/ //8AAQEBAP///wABAQEAAAABAAAA/wAAAAAA/v7+APb29gD//wAAAQEAAAAAAAABAQIAAAAAAAIC AgAAAAAAAAAAAAD/AAD/AP8A/f39APb29gANDQ0ABgYFAAECAQAA/wAAAAEAAAAA/wABAQAAAAAA AAABAQABAAAAAQD+APP08wDz9PQA+fr3APj39gABAAEABAYGAAX+BgD//v8AAP8AAAAAAQAAAAAA AAAAAP///wD///8AAAAAAAAAAAD//wEAAP//AAAA/gD+AQAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA AAAAAQAAAAD//gAA/fwA8/LxAOrq6AD3+fkADw8RAAcICAAMCw0AFhYnAAsODQD/AQIA/wACAAEA AAD/AQAA//8AAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAAAB AAEAAQAAAQAAAAAAAP///wAAAAAA////AAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAP7+/QD8+/oA/fz8AAEAAAAAAQEA //7+AAECAgD/AAAAAAABAAD/AAAAAAEAAAEBAAD//wD/AAAAAAEBAAD//wAAAAAAAQEBAAAAAAD/ //8AAAAAAAAAAAAAAAAAAAAAAAEBAgAFBQQABQUCAP8A/gD6+f0A/Pz9AAEB/QAAAAEA//8EAAAA AAAFBf8ABgcGAP8ABAD+/vgA/vfjAPLowAD88cwAA/32AAEABgD/AQMAAQH8AAH//AD/AAAAAQD6 AAEC/QD9AAcA/wgmAA4aQwAFDS0A/v8HAAD87AD068sA/PLOAAYB8QD8BBcACxY+AA0YOAAABRAA Af8AAAL/AAD+AAMAAAEBAAAAAAAAAAAAAP8AAAABAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAEAAD+AP8AAQD/AAEAAQD/AAAA/gAA/wIA/gABAAAAAQD//wEAAf79APv47wDv6OEA4dreAOHd 1gDx8OMAEhMaAElRXQAAAwQAEBISABkfKAAQFBwACAXuAADytAD/9KkABQDeAAP8EADn8g8A8fYz APkDQAABCTgABwAgAPkFBQDp8OUAzte7AMLYswDc8dsACfkEACLuDgAo5AkAGvIKAAQABQD+BQQA BwMDAAX/AAAAAP0A9PoDAPcA7wD3//4A/fwIAAAG+QAXNPMAPF4EACks/AD2we4AB+YCAA4PFAD7 EAAA9gn7AAQAAwAK/AkA9Q0KAAgQ/wD68vUA9g8QABQyNQAFJCIA+N/UAAT9AQAqGyYAKAcBAN/t 6AD2AvoA//4AAPz8/gAAAv8A/fL8AAD7/AAABgAA9wb1APUI9AAsLD0ADvsGAMnHwQDMzccAGh0k AFNRGwAoEw0A+wIAAAD/AQAD/AQAHhkHACUfFADL1uMAwtTkAN/w9AAACxIACxoYAPkODADv6ekA yeLuAO752QDz/wQALy8jABEMBgAD//sA/gACAAEFBwAGEBoABQ0VAAn8+gD//v0A+/r2APfx6wD2 8OoA8ungAPTv6QAIDhQACxEYAAIIDQD/AwcAAAAAAAH/AAAA//8AAAAAAP8BAQAAAAEAAAABAAAA AAAAAAEAAAAAAAAAAAD/AAEA/wACAP8A/wAAAAAAAAEBAAAAAAAAAAAA/wAAAAEAAQABAP8AAQAA AAH/AAABAAEAAf8AAP8A/wD/AQIA/wEBAP4AAQAA//4AAvz7AP3y8ADt4NsA7tXSAPTf2gD97ekA Avj2AAX//AD/BAUA+AAEAP7+/wABAAEAAv7+AAIA/wAAAP8A/QACAP8AAAABAP4ABP7+AAIA/wD/ AAAA/wD/AAD/AAD/AAEAAAAAAAIA/wAB/wEA+gQIAPYPFQD7FhwA9xYdAP4OEQABCAoACwIBAAsC AAAEBAQAAwcJAAQGBgAHBgQABQMEAAEHBgADBAQABAQEAAQEBQADAwQAAwMDAAMDBAACAgMAAQIB AAAAAQAAAAAA////AP7+AgAAAP8A/wP+AP///gD+//8A//8AAP///wAA//8AAAD/AAD/AAAAAP8A Af//AAAB/wD+AAAAAQABAAH/AwABAP4AAAEAAAIA/wABAQEAAQAAAAAAAAAAAAAAAAD/AAAAAAAB AAEA/gAAAAEDAQD+AAEAAAEEAAEFBQADAQIAAQEAAAL/AAAAAf8AAQEBAAAAAgAAAAAAAQEAAAAA AAAAAAAAAAAAAAAAAAAAAf8AAAABAAD+/wAAAAEA/wAAAAAAAQABAf8ACAUEAP/8/wAA//8AAP7/ APv9/QACAwQABAIBAP/+/wAEAgMA/QAAAP3+/gAFAwMAAwACAPz7+wACAAEA/wD/AAIA/wADAQEA /v8AAAIAAgD/AAAAAwEAAAICAwD+Af4AAgEDAAEGAQAGBQIABwgEAP8AAgDz8fUAAgEKAAgMHwAI 9uYA+fnqAAICBQAB/vcA9/LjAAX98QAFCA0AAgQcAAUMKAAEBhgABAMLAAoKDwD5+QwA9vn5AAIF BgABBgoAAQIBAP3//QD/AAAAAQIIAAQCCAACAwgABgYGAAQDAwAAAAMA//4BAP//AAD/AAAA//4A AAAA/wABAAAAAAEBAAABAAD+/f4A/Pz5AAIA/gD6+PYABQYGAAIDBgAAAP8AAv//AAEAAAD/AAAA /wD/AP7//AD+/v4A/v79AP7//gACAQIA/f39AAMCAAACAgIA/v7+AP/+/QADAQAA///+AAEB/wAC AwAAAwIAAAEB/wD+//8A/wACAAEAAAAAAP8AAgICAP///wD+/wAAAAAAAAD/AAAB/wAAAAIAAP8A /gAAAgIAAgEBAAH//wD/AP8A/wAAAAAAAAAAAQAAAf8BAAMDAgAB/gEAAQD/AP8BAAD+//8A/AD/ AP///wABAAAAAwECAAIBAgD/AAEAAQECAP8BAQAAAv8AAQEBAAMEAwABAQAAAv8DAAMDAQAAAf8A /wD/APz+/wD6/gAAFB0gABofIgAEAwQA9Pf2APj39QAFCAcADg0NAPv2+AD++/kABgQIAP8BAAAB AP8AAf/9AAL9/gAA/v0A/fv6AP38+wD8/v4A/Pz6APn6+gD8+/sA+/b0APv38QDy7fwACw8QAAMH CgD/AP0AAQD/AP8AAwD9AAEAA//zAAH55wAG984ACQ8SAAcTKwD7BBIA+fHpAOveyQDk29EAAPny AA0JAgAGBQQA/wQFAAcLGAANFCcABw4hAP0FDgD7AQoA/P8HAP0ABwABAQYAAAD/AAD/+AADAPsA BAH7AAD/AgD9AxQA/QcCAP4ACAD/+N8AAPjuAAEAAAAHBv8A+Pn+AAYB/gD+//8A+QIBAAIDAwD1 9PoA/OXnAPr39AD27ucACgwTAAAHFgAHEicAAwP5AA8FEgAEAPkAA/79AAECCgAPBwsA8QMGAPP7 /wDu//oA/wMAAAYQDwD1A/8A+/cHAPz8+gDx8/QA8PP1AOnv7wALCgcAEggHABMLCQAICwsABgMH APrz8QAB9vcA/Pz9APsFAwDz+PoA9wD1APH3+QDs8fIADQcGAAoLCwARBQQA9f8CAOLs7wD79fUA 8AUAABwGAQAKAf4A/wEBAPwBAwAK/wAAHgYFAP8IBgACBAUAFgoIAAgCAQABAQEAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAABAQEAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAEAAQEAAP///wAAAAAAAAAAAAEBAQD///8AAAAB AAAAAAAAAAAAAAAAAAEBAQAAAAAAAQEBAAAAAAD///8AAAAAAP///wABAQEAAgICAAICAgABAQEA AAAAAAAAAAABAQEAAAAAAAEBAQD///8AAAAAAAEBAAD///8A+/z8APv7/AAAAQEAAQEBAAAAAAAA AAAAAQEBAAAAAAAAAAAAAAAAAAABAAAAAAIA+fr4AP39/gAKCwkAAwUCAAEBAQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAACAQAA+/z7APPy8QD9/vwAAgIBAO/v7gD6+foAAwQDAAcGBgD//wAA//4A AAAAAAAAAf8AAAABAAABAAAAAP8AAAAAAP//AQAAAAAAAAAAAAAB/wAAAAAAAAABAAAA/wABAQAA /v7/AAICAAD///0A/Pv7APPy8ADs6ecA8/LxAAkKCAAbHB0AGhwdAAwMDgAGBQYAAgIBAP8AAQAA AAAAAAAAAAAAAAD///8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP// /wAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A //8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////APr5+gD+/vwAAQEB AAAAAAD///8AAgICAAAAAAAAAAEAAAABAP8AAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAUFBQAHBgYAAgL+APn6/AD7+/0AAP//AAEC/wD/ /wEAAgECAAEA/QAHCAQAAQMDAP/+AAD/+uoA8+m8APXpvAAE+uwA/wADAP4CAQABAf0AAwD/AAAA BwAAAf4AAgH2AP4BAgD7AyAADRdCAAkTNQD+AgwAAfz1APbs0gD25bYAAvvdAP8DCgAFEDgAEBtG AAAHGwAAAQMAAgAAAAAABQABAAEAAAH/AAAAAAABAAIAAQD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAEAAAD/AAAA/wAA/wEAAf//AAH/+QD58vEA6ePfAOHdzQDh 3doA9fP8ABYZGwA2PEUAHyYvABEVHwAAAgIABAMBAAIEBwD/AAYAAQHxAAsOCQAKDhgAAgD/AOn2 IwDz+TAA/wY0AAQGLAD/AhYA9fzvANTixQDI17IA2N3EAO3z6gAZEh4APCI4ABT59wD/2OEA//v8 APIB+gAD/P4A//wEAP8DAQACCQQABgAAAAD4/QD+/v4AAAkDABwxCwA0VvsAITPxAP/tAAD22QUA C/MFAAH68ADr6fcA+w0KAAsJCwD09fQA+A8VABsICAACDfcAAhkXAA8sMQD5C/0A/wL9AAb//wAU DRYALhQdAMHPwwD2AO8A+fr6AP36BAACBgUAAf/5AP35AwAA+/0A/wH8AP3//QAZHB8AGjkZAOfk 5ADY4dEAxMS8ADEtPQAoLTIAAwH8AP7/AgD/AQEAAgP+ABkTCABBMyIAGRQOAMjV4wDO4usA7/oI AAcJEAAJICIACwEhAPb++wC62vAA4PffAEk3JAAZDP0AAAD/AAEAAgD+AQIA/gMGAP8CBgD///8A BAcMAAwIDAAIDRIA+PPuAPTx7QDz7ecA9fHuAAkLDwAKDhEABg0TAP8ECAD9AAMAAQH/AAEAAAAA AP8A/wD/AAEAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAEA/gD/AAAAAQD/AAH//wABAAAAAAD/AAAA AAAA/wEAAAEAAP4BAQD9AAIA/wAAAP0BAAAAAQIABP/8AAf6+AD57ewA8OXhAPDf3ADz39oA/ern AAT59gAD/PsA/wEBAP0BBQD9AAMAAAD+AAIB/gAC/v8AAQEBAAEB/gD/AP8A////AAD//gAA/wEA AAABAP8AAQD+Af8A/wAEAAAA/gAC/f0ABQH9AP0BAwD1BgkA9xAXAPcWHgD8ExcA/Q0PAAQGCQAI BAUACQYFAAcHBwACCAkAAwYIAAUHBQAGBgQABAQEAAMGBwACAwQABAUFAAQEBQADAwMAAgICAAEB AgACAgMAAAAAAAAAAAD///8A////AAEBAQD//wAAAQECAP//AAABAf8AAAAAAAEBAAD///8AAAD+ AAAAAAABAAAA///+AAAAAAACAQAAAP8BAAEAAQAA/wQAAAD/AAIBAAAAAAEAAQAAAAABAQD/AP8A AAAAAAIBAgABAwIAAQAAAP8BAQABAQEAAAAAAAMFBQABAQAAAv8AAAEA/wAAAAAAAAABAP8AAQAA AAAAAAD/AAAA/wAAAAAAAQAAAAAAAAAA/wEAAAAAAAEBAQAA/wAAAAAAAP4B/wD9/f4A+/v7AP/+ /QABBAMABAQDAAIFBAD7/f8A/P7+APv//wD7AQMA/QD/AAH9/AABAAEADAQFAP/+AAABAQAAAwMD AAD//wABAAAAAQEAAAH+AgAEAQAAAgEBAAICAQABAgUA/gD/AAH+/gAFAwIABQMHAAIOAgAC/dtB /a8AACAASURBVP8A9vbzAP4CDQALDSMAAAEJAAEABAD7/PkA/v8BAAAEFAAJCxgAAwokAAMGGAAC BAsAAQMGAAYHCwALDBEAA/T0APv//wABBAcAAAECAAUAAQACAAEABAMHAAIDBAADBQYABAQFAAH/ AQACAAQAAAIBAAECAQAA/wAAAAAAAAABAAAAAQAAAAAAAP/+AAD7+/sA+vr3AAcBAAAGBgMA+/v4 AAgHBQACAQEAAP0AAAH/AgD+/wAA/wH/AP3+/gD9//8A/v8AAP7//wD///0AAPwBAAUGAAABAQEA AP/+AAAAAQAICAgA/gD/APz9/gABAP8AAQEAAAEAAAABAQIAAQABAP///wAAAAEAAAAAAAAAAAAA AAAAAQEAAAIA/gABAAAA////AP8A/wABAP8AAQEBAAAAAAD//wAAAQABAAD+/wABAQEAAAEAAP8B AAAAAQEA/wEAAP///wD+/wAA/gAAAP///gABAAEABAIEAAEAAgAAAP8AAQEBAAECAQABAAIABQIC AAQCAQADAP8AAgQCAAADAQD9//4AAgH/AP0AAAD5/f0ABQkLAAEDAQD9/PwACAoJAA8NCwAHBQYA BQIBAPHo6QDt5+YABRAPAAcNCwD9//0A//r5APr4+QD6+PgA9fTxAPj09AAEAwEAAQD8APz7+QD9 +/oA/Pj2APrz8AABAPwA/vz6AP/+/gAAAP4AAf/+AP8AAgAB/vgAA/ziAAX30AAMCfEACRAkAPwF FAD9+fQA9+zQAPLozwD39PEAA/0AAAEIAAAHBwcA/AMUAAMMIgD/BhkA+v4LAAH/CAD8AAgA/AAH AP4BCAAAAAUAAQH/AAACAQD/AgIA/wACAAD//QD9/wYA/QEOAAMFHQABAQQA//rlAAL97wAGC/kA APj0AAH7AAAGBvwADQ3/AP4BAAD6/gIA9/n+AP3s8QD49fYACAfnAAQKEgAQ9/kAEQMCAAkT/QAG CwwAA//7AP/77AAJ//cACgQNAAkACAAGAAcADAD4APkB/gD7AgoAAg8JAAsPDgDh6uoA4ejoAPP4 +ADu8PUA9gDzAO4HAwAGCw0A/QYKAPLw8gAMAAMAEQkHABMODAADBgYA+wAAAPn8/AD9/PsA9fv6 AAT4+wDrAgIAAQIBAAQBAgABBQUA9PfzAPL9AAD///sAAAABAP0CBAAEBQQADggGAAcGAwAABQUA DgYFAAUBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAEAAQAAAAABAQAAAP8A//8AAAAA AAAAAAAAAAAAAAAAAAAAAAEAAQEAAAAA/wAAAAEAAQEBAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAA AAEBAQABAQEAAAAAAAEBAQAAAAAAAQEBAAAAAAABAQEAAAAAAP///wAAAP8AAQEBAAAAAAD/AAAA +fn6AP///wABAQIAAQEBAAAAAAABAQEAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAEA+Pj5AAQEAwAG BwYAAQIBAAABAAABAAEAAQEBAAAAAAABAQAAAAD/AAAAAQD/AAAA8/P0APDv8AABAAEABgcIAAgI CQD08/AA5+X8AAUFAwANDxAA//8AAAD/AAAAAAEAAAAAAAAAAAAAAf8A//8AAP8A/gAAAAEAAQAC AP8AAgD/AP8AAQAAAP///wAB//8A//79APf49wDv7esA8O/vAP7//AAKCAgAJCYlABsbGwAOEBEA AgMEAAAAAgAAAQAA/wABAAAAAAAB//8AAAAAAP8AAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAA AAABAQEA////AP///wABAQEAAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAA AAD+/v4A/Pz8AP39/QAAAAAAAQEAAP///wABAAAAAAAAAP8AAAABAAIAAAAAAAABAAD///8AAAAA AAAAAAAAAAAAAAAAAAICAgD+/v4AAAAAAAAAAAABAQEA////AAAAAAABAQEAAwMDAAYGBgACAwMA /Pv+APv6+wD+AP0AAAH+AAAAAQAAAAIAAgH/AAYGAwACAwMAAAABAAL+9QD279AA9Ou/AAT74QAD /wIA/QH+AP8B/QADAf8AAAADAP4AAwAAAPwA/gAAAP0BEQAIFjUACxk8AP4DFgAD//kA+vTbAPPm wAAB89AAAwH7AP8KKAAKGD8AAgsmAP8BCQAB//0A//4CAAABAgAAAAAAAQH8AAAAAwAAAAIAAAD+ AAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAABAAAA/wABAP8AAAABAAAAAgAA//0A +fLsAOLd0wDc0dYA5ODcAPr68AAdICUAMjc6ABohKAAQFhEAAgcNAAABBQACAP8AAQL8AAEA/gAB APsAAAEJAP8HLAD7AwkA/f78APv9IAD+ByQAAgIUAP4E/ADz9t0AwNGqAMncwADk8dkA+/X4ACUY NABKOFoAMRMtAODowgDZAuUAAf/3AAEBAgAEAQAA+Pz5APT5/QAHAgsADAL/AAT/DQD+CP8AIDcT AD5YAwAdN/EAAAIBAPf1IwD9/wQA/vzeAPvx5AAC/PkAEgYRAAT8/ADx6O0A/e79AAQL9QAHDQYA CSQgAAsmKQD4AtkABP79AP7//QD+AAQAMic2ABve4ADw7uYA/P7+AAD6+wAAAP8A/wYBAAD5AAAB +AEACvkJAB4OIgATER8AEQ0NACjY0QDo798A7ejiALCupgBnHyQAChISAP8AAAAD//8A/gADAP8B /wAJCgEALCQWABgTDQAj3+0AwdLgANzq5QAUGxwA8vb3APcCBwABBBQA2Or2ADPy+gAXDAQA/QAC AAEA/wABAP0AAv8AAP//AAD+AAIA/gADAP0EDQAADQsACAkSAAcPFgD89PAA9PHsAPfv6ADz6+QA ChUeABEcJAAABAoA/wAAAAIA/wD/AP4AAAEBAAD/AQABAAAAAAAAAAAAAAAAAAAAAQD/AAEAAAD/ AQAA/wAAAAEAAQAAAP8AAAEBAP8AAAAAAAEA/wABAP4BAQD+AAEAAQD/AAP//wAD/PgA++3pAOrX 1ADz4d4A+ermAP7v7QAD9vMABfz8AP3//gD+AQIAAAEAAAIA/wADAf4AA/7/AAH//wD//wAA/gEB AP8AAgACAP4AAv/9AAH//gAA//8AAP8AAP//AAAAAAEAAQAAAAAAAQABAQIA/QIDAPYHDAD0EhkA 9hQaAPoQFAAECgwACAUGAAkGBgAJCAgABgkJAAMICQAHCAcABgYGAAUGBgADBgcABAYFAAUGBAAE AgMAAwMGAAECAwACAgIAAQEAAAAAAQAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAEBAAAB AQABAAEAAAD/AAAAAAAAAP8AAP8AAAEAAQAAAQIAAAACAAAAAAAAAP4AAgEBAP8BAAAA/wIAAAAB AP8BAQAAAAAA/gEAAAEAAQD/AAAAAAD/AAIDAwADBAIAAQABAAAA/wAAAAAAAgAAAAAA/gAA/wAA AAECAP8AAQAAAAAAAAABAAAAAQABAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAB AP8AAAEAAAAA/wD9AAAA/P4AAAUEBgAFBAEAAgECAPz9/QD6/PsA/AABAPf+/gDx9vUA+/v7ABEJ CQAMCwgA+///AAQEBAACAgEAAAEBAPn5/AD+//wABAQDAAEDAQD//v8A//79AP3+AAADBQIAAAEA AP/+/gABAwMAAv8CAAsGBwAADgwA+/n2APv6/wAEBRQACAYBAP389wAABPcACg4jAAUFCQAFBxkA BQcXAAECCAD+AgIAAQEGAP8BBQAKDBAAAQUIAPD19gD/AAIAAgIDAAEABAAB/wEABQQEAAMGBQAE BQYAAAABAAH9/wABAAAAAgMDAAAC/wAAAP4AAAABAP//AAD/Af8AAf8BAP/+AQD+/f4A/f38APr/ /QADAAMAAP4BAPz9+gAFCAYAAAIBAAH+AgAB/wEA//4AAAEAAwD//gIA/P38AP3//gAFAgMAAwMF AAIBBAD+//8A/P78AP7+/gD8//8AAAIBAP4AAQD+/gEAAgICAP8AAAAAAAAAAP8AAAD/AAD+//4A /v7/AP///gADAQMAAQEBAAAB/wACAwEAAP8AAAD/AgAA/gEAAAD/AP8B/wABAAIAAQAAAAEBAQD/ AAAA/f//AAD//gD//gAA/wEAAP7//wD+//4A/v//AAAAAAD9//4A/f7+AAQCAwD/Af8AAQD+AAD/ AAADAAMAAwMCAAH+/QACAwAAAAMBAP0B/wAA/f8AAwIDAAICAQADAwMABgYFAAwHBgAGAQAA//v7 APz5+gD6+fwA9vz7APf09gDv5eUA+O7sABIaGQD6/v0A/vv6APz5+QD4+PcA6ejlAOvl5QAPDQcA CwoHAAD++QAB/f0A//39AP3+/wAHBQgABAIDAAD9+wD//v8A/f79AP/99gAA+uQA/vjNAAX/1QAE DBwAAv/+AAL36AD+8tsA+e3MAAP+7QAHBP8ABgUAAAsIAQAGBwoAAQgeAAELHgD5AA0AAfoBAAAJ CQABBQ0A//8EAAEBBgD/AQMAAAABAP8ABgD+AQkA+/8IAAIAAwD+AgAA/v3/AP4AAQAABAQABgIJ AAX97QAKE/EADAH1APns8wD/+vMABgUAAP8C/QAA/QEA/gABAAH+/wD39fwA8PD9APT5+AAM7PkA I/37AB4E9QAGECcAEg0JAAUEAgDs8fEAAv37AAICEQADAgYACwMCAPf9/AD3+PcA//3+AAsBAgAj BQUADxQUAPP9/wDs+vcA8/TzAPD39QDz9e8A+wL0AAD8/QANDhEADBAPAA0NCwACCAcA/QIEAAEB AAAA//8A/AAAAPr+/wD8+foADwcDAAj/AAABAgAAAgkIAAYIAwAGAfsAAQAAAP0CBAACAgMACAgG AAsIBwD+AwQACAQFAAEA/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD/AAAA AAEAAQEAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAIAAAD/AAD///8AAAAAAAAAAAABAQEAAAAAAAAA AAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA AAAAAAD9/f4A+vr7AP7+AAAAAQAAAAAAAAEBAQAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAA 9PX0AAQGBgAFBQUAAQEAAAEBAAAAAAAAAAAAAAEBAQAAAP8AAAABAAEBAAD/AAEA7/DyAPHx8wAF BAgAAQEFAA0O/wD//vwA9fTwAODe2wAPERUA/Q0NAP7+/gAA/wAAAAAAAAD/AAD//wEA/gD/AAAA AAAAAAAAAP//AAAAAQAA//8AAAAAAP39+wD39/UA29nXAPP08AATERIAHR0cAA0ODgAPDw8ACgwM AAMEBQAAAAAAAP8AAAAAAAAAAAEA/wD+AAH//wABAAAA/wACAP8AAAAAAAAAAP//AAAAAAAAAAAA AQEBAP8A/wAAAAAAAP8AAP///wAAAAAAAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP7+/gD7+/sA/Pz8AP8AAAABAAAA////AAAAAAAB/wAAAAAAAAAAAAD/AP8AAAAAAAD/ AQAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAACAgIABgYG AAMDAgD9/f0A+fr8APz9/QAAAf0AAAECAP8ABAACAQEABAYBAAQGBwD/AAQAAf33AAD41wDy570A APbdAAT/+gD+AQcAAAL6AAAB/QD9AAQAAv//AAEA+wAAAPwA/AAOAAQPMAASHUgA/gckAP7/AgAC +eUA9Oi/APzvxwAJAfIA+wQcAAsXPQAJFDEAAAQPAAIAAQACAP8A/gD/AAAAAAAAAP8AAQACAP8A AQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE/gABAAEAAAAA//8A/gEA AP8AAADx7esAyMKyANnRxgAD/QcAGh4hACkwSAAcIikADA8fAAMHCgAAA/wAAP4CAAED/gAAAP8A AP//AAAAAAAAAP0A/v8JAPb+JwD3/yEAAf8EAAH/DAAAAQUA+P7wAN3mxwDEzLIA1ObEAPD19QAI AQ4APChKAEc3WAAfGS0ADv4FAAoV1gAACAQABAEBAAcDBAD8//0A9Pv5APv7+gD+9gIACgMAAP4H FAAZMhQAOVsFACQ10gAFCPMA6u8hAAoRTwAHKgIA7MeoAP734gAKCgMACQkFAPjt8QAK9PwAAffu AAIBAAD+GxsAEDMyAAEbGwD+8N4ABP0AAPsC/gD6/fsAGw4bAEgrRwDvx+YA5/zzAPsB+QD//PoA AAkAAAAHAAAA+QEAGgsdADklPAAWCxkABwAHADM7QQDa3dIA+PPQAM7KvAC7tisASVRgAAQFCAD/ //wAAQAAAP3/AgD9AP8AAgIAABYSCgA6DAoAHBcRAMjR2wDt9fgAytzdAPD+BwAMExYAJyEZAA8M CAAA//0A/wADAAD//wAA//4AAAD/AAAA/wABAP4AAP//AAAAAwD/AQIA/wQIAAMCBQAGBw8AEQ4U APry6wDq5uIA+Pf2AP///wAAAAAAAQAAAAABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAABAAAA/wAA AAAAAAAAAAAAAAEAAAACAP0BAAD/AQEA/gEAAP8AAQAB/wAAAf//AAL//QAF/PwAAfb0APru7ADl 3doA8d/bAPzp5gAC9fMAAfn3AAT8/AAB/vwA/f//AP//AQAC//8AAQABAP///gAA//4AAQABAAEA AgD/A/4AAf8AAP/+/wAA//8AAgAAAAEAAQD/AAEA/wD/AAH//gAD//4AAf8AAP4BAAD4AwYA9gkP APMQFwD4FBoA/A8QAAYLDQAKCQkACggKAAgKCQAICQsABQoKAAYIBwAIBwcABgYFAAUGBwABBgcA BQYFAAMCAwADAgIAAgEEAAACAQAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8AAQEBAP///wAB AQEA////AAEBAQAAAAAAAQEBAP///wAAAAEAAQEDAAEAAQD/AAAAAAEBAAAAAAAB/wIAAQEAAAAA AAAAAQAAAAEBAAD/AAD/AQAAAgEBAAD/AQABAAAAAAEAAAICAQACAgMAAQAAAAAA/wABAP8AAf8C AP//AAAAAQAA/wABAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAD/AAAAAP8AAAH/AgAEAgMABwcHAP3+/gD19/gAAAEAAPz+/wD6/gAA+gAAAO3z8wAC Af8AFg0OAAwHBwAAAAAA9fn4AAkEAwAG/gAAAwMFAAMEAwD/Af8AAQIBAAEAAQD9//8AAQEBAAMC AAAAAAEAAQABAAMDBgACAQAA/wD/AAIBAgAHBgcADgwOAPz8+gD5/QgAAQMMAP/6+wAEBRQABQgR AAQEDAAFBQ4AAwQKAPr//gD/AAIAAAEEAPv/AgD7AAMABwsPAAsABQD4+fsA//8CAAMBAwADAwIA BwYFAAQEBQABAQAA/v8BAAEC/wACAgEAAAH/AP8B/wD//wAAAAAAAAABAAABAAEAAP8AAAD/AAD/ //8AAAEBAPv+/AACAwMAAwICAPn49wACBQIAAwIDAAAC/wAA/f8AAf//AAIBBAACAwcAAwABAAH/ /QAGAwYAAwIGAP3+/gD9//4A+fz5APz7+QD89PwAAQICAAQECQAEBP8AAAD+AAIDAQABAP8A//4B AAL/AQAAAgAAAAD/AAH//wABAAAAAgIBAAACAQAAAQAAAgABAAEAAAAAAAEA//7/AAICAQAAAAAA /wAAAP7//wD8/vwA/v//AAEBAgD//v8A/gAAAP8B/wD/AAAAAAD/AAAAAAAAAAEAAAEBAAAAAAAB AQIAAQD/AAMB/gD+//4A+/r8AAcGBgAAAf8AAgL/AAEAAQAAAv8A/wABAAH/AQADAAAAAPn5APn4 +QD5/f0A/fn5APz5+wD5/v4A/P7+APjv8QD07u4A8fn3AAH//gAACAcA+/v6APz49QD49/UA9Ovq AO7k5AD/DgcA/hIQAP8CAQAGBAEABAMFAAUJDwAKDhUAAf//AP349QD9/wUA/v77AAL54wAA8soA APzYAPsG9ADw7vUAB/ncAAME3AD59NsAA/vlAA0J/gADEgIABAH/AAkIBAABCBMA/woaAP8GFAD+ AwUA+gAFAAL+CwAJAwoAAgADAP8BAwD/AQUA/AACAP/+/gAGAv8A/v8DAAACAwAA/wQA//4EAP// BQD8/wQAAQMEAP8DDgAEBPUAEAoAAAAK8QDr5dsA+fXrAAH9/gAFA/8AAgIAAAEAAAD5+gUA7/D+ AO70/AD4/+0AEOjWABMQ9AACAf0ABgsbAA4JFgAFAgYACvPyAPD27gAI/woA9AIMAO8C/wD/AwYA /Pz4APnw7wD///0ADQEAAAoDBAASDAsA+wsMAPH8+wDu+PkA7Pf3AO73+wD2BQgA9gwOAPcHCAAH AwIABQMCAAYCAgAFAgEA/gABAPr+AQD/+PkAEAYFAAf+/QAA/gEAAwACAA4LBgALAf0AAAD+AP0B AwADAQMACAkHAAYGBQAAAgUABQUEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA AQEBAAAAAQAAAP8A//8AAAEBAQD///8AAAAAAAEBAQD///8AAAD/AP8A/wD//gAAAgIDAAICAgD/ //8AAQEBAAEBAQAAAAAAAAAAAP///wACAgIAAAAAAAAAAAD///8AAQEBAAEBAQAAAAAAAAAAAAEB AAAAAAAAAAAAAP///wD9/fwA/f39AP8AAQACAQEAAAAAAAD/AAAAAAAAAAAAAAECAQABAQEAAAAA AP///wD7+/sA+Pj4AA8PDgAEBAQAAQEBAAIBAgD//wAAAQEBAAAAAAAAAAIAAAD/AP8AAAD7+vsA 9fX3AP7/AQAHCAsABf3+AAQCBAADAwIAAwUGAPb09wDv7ewAExETAPv9/gD//wAAAAD/AP///wAA /wEA/wACAAAA/wAB/wAAAAD/AAH+/gD8+vgA9ff4AO/v7wD5+vkAERAOACMjIQAREhIACwsLAAQF BAACAgMA/wEBAAAA/wAA/v8AAAAAAAAAAAAA//8AAAD/AP8AAQD/AAAAAAD/AAAA/wD/AAEAAQAA AAAAAAAAAAAA////AAEBAAAAAAEAAAD/AAABAgAAAAAAAAD/AAAAAAD///8AAQEBAAAAAAAAAAAA ////AAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAA AAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA/v7+APr6+gD7+/sAAAAAAAEBAQAA/wAAAAD/AAAAAAD+AAAAAAAAAAAAAQAA AAAAAAAAAAAAAAAAAAAAAAEAAAEAAQD///8AAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAbZqbTQAA IABJREFUAAAAAAICAgAFBQUABAQEAP///gD6+vkA/Pz8AAEB/wAAAAAAAP4CAAABAwAEBf8ABQYF AP8CBgAA/f8A/vjkAO/jswD78soABP34AP7/BAD+AfkAAf/7AP8AAgD+/wEAAP/8AAUB+QD+AwcA /QQdABMbRgADCTEA/v4JAAL/8AD48M4A9+vBAAb+4wD/BAwABRM0AAsZPwACCBsAAAADAAL//QAA AAIAAAECAAAB/gABAAEAAAACAAAAAQAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAEAAABAAH/AAD/AP8AAQAAAP8AAAAFBQIAFhUTAAkxNAAbHC0AFh8nAAoSEAABBgkAAAAJ AAAA/wAB//sAAwAEAAD//wAAAQEA/v8DAAEBAQD/Af8A/wACAP79DAACAAQAAgD+AAEC+QDz+eMA xtW5AMbYuQDj8dwA+Pf0ABMHHwBON1sAOylEABYSHgAABP8A9+3qAPTp5AAH+fkACgMDAPoAAADy /PsA+P35AAQC/wACBP4A9QgHAB0yJQAvXiIAGC7CAAgM5gD37w0A/gFCAPsVSAASM/8A+MPSAPve 1wACDgEA8Qb7APD5+QAL/wwAAA0EAO4RCQD2Ji8AFzw9APYIBgD//QEAAf8CAP4CAAD6/PkABvsD AEsyTAAFBQEAudGpANnl2QD2+P8A/Af9AAAGAQD/BgAABQQJAA8IEAAIAgMAAf8AAB4iKQA8QU4A 8e7sAPrk3gC5s6MAIyUmACsyPQD9//8AAAD9AAH/AgAB/wEA/wADAP4B/QAGBv8AIRoKABMMKADs 8foAGA0JANXf5gAMEgYAPS0YABYNAwAB/vwAAQH/AP//AAD//wIA/QAAAP8A/wABAAAAAgD/AAH+ +gD9AP8A/wEBAP0BAwD9AwkAAAMHAAMECgAYDBQAAP/9AAEDBgD///8AAQD/AAAAAAABAQEAAP// AAAA/wD/AAEAAAAAAAD/AAABAAAAAAAAAP4AAAADAP8AAAD/AAAAAAD/AAEAAP//AAH//wAF//8A Avr4APfs6ADt4+EA9OXiAPjl4wD98OwAAvbzAAb8+gAA/v4A/v//AP7//wD+AAEAAAD/AAL//gAB //0AAP//AP4A/wD+AQEA/QACAAAA/QAAAAAAAQD+AAAA/wD/AAAA/gECAAD/AAAAAP4AAf/+AAH/ /gAAAAAA/gEBAPkFBwDyCxAA7xAXAPcSGQADDA8ACgsMAAwKCQALCwwABgsMAAgKCgAICAgACQgH AAYHCAADCAcABAcHAAUEBgAEAgMAAwMDAP4BAAABAQMAAAABAAEAAQD/AP8AAAAAAAAAAAAAAAAA AAAAAAAAAAABAQEA////AAEBAQD/AAAAAAD/AAEAAQAAAAAAAAAAAAAAAAABAQMAAAAAAAD//wAB AQEAAQAAAAAAAAAAAAAAAAEAAAH/AAAAAAAAAAD/AAIBAAAAAAAAAgD/AAAB/wD/AAAA/wEAAAIA AAAC/wAAAAEBAP4BAAAAAAIA/wABAP8A/wACAAEAAQD/AAAA/wAA//8AAAACAAAAAAAAAAAAAAEA AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAAEAAAAAAP///wD9/fwA/v38APz+/gACBAUA AAICAAL9/QAA+/wA//z9ABILDQAJBAEADgcHAP/9/QD2/fwA/wIBAP0BAAACBAQAAgEBAAH//gAA AP8AAAABAPv9/AD+/f0ABQMDAAECAgD+/f8AAQICAAEAAAD//f4AAAP/AP7//wACAgIACgoKAPn6 DAD6+vgAAQQFAAUKDgD+/fwAAgIFAAABAwADBQcAAgMFAAIAAwABAAQAAAABAP4BAgD09/oACQkF AA0LDwAGBf0A9/j6AAAA/gAFBQMAAwQEAAIBAQAAAAEAAgAAAAAEAgAAAQEAAP//AAAAAAABAQEA /wD/AP///wAA/wAAAQABAP4A/gAAAgEA/wACAP0AAgD7/fwA//8AAPv9/wAAAgEACgoMAAIA/wD/ /gAA//7/AP//AQACAgMAAwAFAAMABAACAgUAAAACAP7//wD8//4A/P39APz+/QD//f4AAQIDAAIC AAD+/v8A/gH/AP8A/gADAQIA////AP4BAAACAQIAAQECAAEBAQACAQMA/gEAAP/+/wAAAP8AAQEA AAAAAgD/AP8AAAD/AAAAAQD/AAAA/wAAAP7//wABAQMABAMAAAEAAgD/Av8A/wD/AP8A/wD9//4A /f3/AP///wADAwIAAAH/AP4A/wAD/wMAAAD+AAMDAwAB/wEA/wACAPr8/QAFAgEA//3/AAQCAQAC /wEA/wEAAP8AAAAC//8A+PP0APH3+QACAQEAAf3/AAL+/QABAQEAAgEBAAAB/wD7/f0A9vHvAPLr CgAACgkA+Pv5APz59QD9+PYAAvz7ABENDgAFBgIABAcNAAQMDQAEBQIADg4PAAUIDwAHDQ0A/QAA AAD9/wD+AgIAAAD7AP344AAF+tkABQT2APoAFAAC+wMAAPTtAP777QD9+egAAv78AA0IAAAJAv4A AAEEAP4DDwD9BxYA/wYRAP8FCwD/BQcA/gUIAPwBCwAAAQYAAgMCAPwABAD+AQcA/Pz/AAID/wAA Av4AAf/+AAEAAgD/AAUA//4HAAAB8gAB//QA/P0HAPr9DgACAfkAAQT/AAcQFAAO/QgA7+vhAPfy 6QAD/fUACQL9AAIBAAD3/f4A+fn/AP/+AAAFAv0ABP/vAP72+wD77QEA//nuAAUNJwAMBhMACAfz AALy4gD78fYA/QMZAPwDGwADDhAA+fsJAPr69wAC+vcAAvz8AP3++wAJ+PoA/QEDABAFBAAhEhEA 9AMVAOL3/ADg9fkA9P8CAAT9/QANBf8ADQUEAAIEAwAGAf8AAwECAAf9AAAD/QIADAUFAAX/BQAB //0ABQH+AAwGBAAJAAEA/wD/AP8AAgACAwQACAQGAAcEBQAAAwMABQMCAAEBAgAAAAAAAQEBAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABAQAAAQAAAP8AAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAEBAAD///8A AAAAAP7+/gD+/v4A/v7+AAQEBQABAQEAAQEBAP///wABAQEAAAAAAAEBAQAAAAAA////AAAAAAD+ /v4AAQEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAD7+/wA+/z9AAEBAQABAQEAAQEBAAAA AAAB/wAAAQEBAAAAAAAAAAAAAAAAAAAAAADx8fEA/v79AAkJCAACAgIAAP8BAAABAAABAQEAAAAA AAAAAAAAAAEAAAABAAD//gD6+voA+/r7AAkICwD+//8AAP7+APwHBwAFCAcACAsNAPv5+gAA/wEA 8vLyAA0PDwD+/v4A//8BAAAAAAAA/wAAAf//AP8AAAAAAP8A+/r3AObk4wDz8/IADQ4PABkZGgAQ ExIACggJAAcGBgADBAMAAQEBAAAAAAAAAAAAAP//AAD//wAAAAAAAAAAAAAAAAAAAAAAAAABAAAA AQAAAAAA/wD/AP8A/wAA//8AAAAAAP8AAAAA/wEAAQEBAP//AAAAAP8AAAAAAAAA/wAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/v4A+/v7APz8/AAAAAAA////AP///wABAAEA AP8AAAAB/wABAQEAAP8AAP8AAQAAAP8A/wAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAFBQUAAAAAAPv7/AD7+/wA///8AAEBAQABAAUAAf8CAAID AAAGBgMAAQIGAP//AQAC/ewA7efAAPXrwwAG/ugAAP8JAP7+AQABAvsAAP4CAP8CAwAAAf8AAAD+ AP4BBwD4/RIAEiA9AAgSNwD9/xEABP/6APzz0wDs4boAAvjeAAICAwD+CiUADRk7AAEMKAD/AQoA BP/8AAAAAAD9AAQAAAH/AAAB/AABAAMAAAADAAEA/gD///8AAAAAAAABAgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAEAAABAP8BAAAAAQEAAAAAAAH//wALDQ8ALzdAAAD//AADAxMAAAQKAP4D /AD/Af8AAf7/AAEA/gAAAfwA/wAEAAAAAQABAAEAAAEBAP4AAQAB/wAAAAD/AAIB/AAAAfsA/QH3 AObw1QC2xKYA2OXPAPL38wD19voAKRc7AF1NZQAjFC4ADAYOAAMB/wAA7+0A2LS5AN+6xAAJ9PsA /AEBAPH++QDz/voA/gUAAAYICgD6AwIACDEoAD9kMAAIJc0ACwzaAPz3AwD09y4AAhFBAAIFHwAG B+cA/AD5AAIFAQAMCQgA6/T1APD9/wDyBg4A9x0ZABc2LQAjVFkA+R8kAP4A/gAC/vwA/P//AP8B AAAB//oAAP78ABEKEwBMNFIAPCsuAODx4ACgsK8Ayuy+AAADAwD+BfsA7PXsAOHn3wAuIS8ABQEL AAUGCgAxNz8A3dzYAPHx7QDx7+cAsKqcAB8kJgAKDhYA//4BAAAAAAABAAAA/v8AAP8AAwD+AP0A AQEBAA4OBwALCwkAFhIQADs0KQAAAwEACwgCAAQB/QD+AQEAAAD/AAAAAAD/AAAAAAAAAAAAAQD+ AAAA/wD/AP8AAAAAAAAAAf//AAEA/gACAQEA/v8BAP4CBwACBwYAAgD8AP8BAgACAAAAAQAAAAAA AAD//wAAAQD/AAAAAAAAAAAAAAEAAAD/AAABAAAAAP8BAAAAAAAC/gAAAAD8AAP+/gAC//0AAfz7 APrx7wDv4uEA6t7dAPfq5wD/9PIAAfj2AAT5+QAF/voAAv79AP///wD9/gAA/v//AP7//gD///4A Af/9AAAA/gAAAP8AAAD9AAEA/wAAAP8AAAD8AP8A/wAC/gAAAv8AAP///wAA//8AAP/+AP8AAQAA //8AAAD/AP8BAgD5AgUA9gcKAPEKDwD0DhQA+hAUAAQPEgALCwsADgwNAAoKCgAKDAwABQwMAAgI CQAICAgACAYFAAcHBwABBgcAAQUFAAMBAQACAAAAAQIBAAEAAgABAQEAAAAAAAAAAAAAAAAA//// AAIBAQD//wAAAAAAAAEBAQD///8AAQEBAAAAAAD/AP8AAQABAP///wABAQEAAAAAAAEBAQAA//8A /wAAAP8AAAAAAAAAAQEBAP///wAAAAAAAQABAAABAAAAAAAAAAD/AAAAAAABAAAA//8AAAEAAgAB AAAAAP//AAAAAAD/AQAAAQAAAAEAAAD/AAAAAQEAAAD/AQAAAf8AAAAAAAAAAAAAAAEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAEBAAABAQAAAQD+ AAQCAwD9/f0AAgMAAAACAQAOCQgAAwIEAP//AQD///sA+vv7AP/9/gD//wAA/f/+APP8+wD6/f4A CAMDAAUDAwACAAAA/P3+AP//AAAFBAUAAwMCAAIAAAD9/P0AAQABAAMBAQACAgIA/P78AAAA/wAB AQAABgQFAAgHCgD/AAQA/QIGAAMFBQD++voAAgEFAAgHCAADAwMAAgMFAAcAAwD/AAQAAAMCAAAA AQD//gIA/fv9AAIFBQAJBwgAAgAFAPz8+gACAP8AAv8CAAICAwABAQMA////AP4B/wD/AAAAAAEB AAEA/wD/AP8AAf8AAAEAAAAAAAAAAAAAAAD//wABAAIAAAEDAPz9AQD9/fgA//39AAQHBgAB+gIA /AQIAAMCBwD///4A/wAAAAEAAAABAQIAAAACAAEBAAAAAAEA/wEBAAEAAQABAQEAAgIBAAQBAgAC AgIAAAQEAAAC/wD//v8A/gL+AAH/AAABAf8AAQECAAAAAAAAAAAA//8BAAABAQD///8AAP7/AAIC AgAB/wEA/gD/AAEB/wD+/v0A/wAAAP4BAgADAQEABAICAAMBAQD+//8A/gH/AAEAAQD/AQAAAgEB AAIBAAD+AAMA/gMAAP///wACAAAA//7/AAD//QD/AAEAAQEBAAABAgABAP8ABAQCAP38/AAB/wAA AgECAAIAAgAFAgIA/P//AP4BAAAAAAIA/P7+AP39/QACAwMAAgIAAAQCBAADAgEA/gQCAP4MCgAE CgkA+uj8APTy8QD/+fcA+P37APz7+AAB/fwAAgUGAA8ZGQAQGxoAIigqAAUKCgDm5uQABwMFAAEC BQACBwYA/wgFAP4EBwACAQMAAfjrAPv86wAEA/kABAYNAPoDGAAAAwUAAAMAAAD//QD38u0AAv4D AAoG/QD7AwMA+wAQAPsDHAD/BhoAAQQQAAAFCgABBwcAAwUKAAAECQD/AgQAAAEDAAACBwD+/wQA /QH9AAAA/wD/Av8A////AAD/BAACBQcAAwAEAP0CBAD+/QYA/gD3AP3++gD//PkA/Pj4AP37AgAB BxwADhgTAAAF5AD1790AAfzrAAcF/QAEBf4ACQn/AAUHAAARDf8ACwb7AAL99QD+++YA+vH2APz5 8gAFCRgA9PP4APTt5gAD+PMAA/3fAAsJJgAKEDMA9QgXAPj8CgD8+vMA/fz6APn6/QD++PcA+/79 AP37+gAC+/sADAUGAB0GCQADCwcA8fr3APv0/wD2/f8AAgEDAAIECQADBQYACwUFAAX8/gAMAgAA CwgIAAD7/QD++/4ACAQEAAgGBgAE//wAAP8AAP4BAQADAwQABQUDAAQEAQAAAQIABAQBAAEB/gAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEAAQD//wAAAAD/AAAAAAABAQEA//// AAAAAAABAQEAAAAAAAICAQD+/v8A+/v7AP//AAAGBgYAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAEBAQABAQEAAQEBAAAAAAABAQEA////AAAAAQABAQAAAAH/AAEAAQD8/P0A/f3/AAEBAgAA AAEAAQEBAAAAAAABAAAAAQAAAAEAAQABAAEA/gD/AAAAAQDz8/MAAwMCAAkJBwABAQEAAAAAAP// AAAAAP8AAQEBAP8AAAAAAf8AAAAAAAH/AAD7+/wA/f7/AAkKCwAAAAAA///+AP39/gAK/wsA//8A AP//AAAEBAQAAP//APP08gASEA8A///+AP///wAAAP4AAP7+AAD9/ADh498A2tnXAB0eHwAtLi0A EBITAAcHCAADAwMAAQIBAAAAAQAAAAEA////AAEBAQD///8AAAAAAAAAAAD/AP4AAAABAAEAAQAA AAAAAAABAAAAAAAAAAAAAP8AAAEAAQAAAf8AAAABAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAA////AAAAAAAAAAAA////AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A/Pz8AP39/QACAgIAAAAA AAAAAAAAAP8A/gAAAAD/AAADAQIA/wD/AAAAAAD/AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA AQEBAP///wABAQEAAQEBAP///wD///8ABAQEAAUFBQABAQEA/f39APr6+wD//gAAAQIAAAD/AwAA /wMAAAL+AAYHAQACBAQAAAABAAUB8QD288UA9Om6AAb96gAC/gAA/gD+AAIC/gD/AAAA/QAFAAL/ AQADAPoAAAEDAPb9EQAIFDoAEBxJAP0DHAAAAP4AAfffAPPkvQD77tEACQP4APkEFgAJEzcACREu AP8ADQAA//8AAAD9AP8ABAAAAAEAAAH/AAEAAAAAAP4AAAADAAAAAQAAAP4AAAACAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAP/9AP4AAQAAAAIAAQD8AAIBAAD9AwYAAAYTAP8BAQD/ /gkAA//8AAMA+AD//v8AAf8EAAADAgD+AQQA/gACAAMAAQD///8AAwH/AP8A/gABAAEAAf/+AP8B +wD29/IA093LAL3QrADh9c4A9frsAAr8EABFLEUAUz1vABwTHAACAQUA+QT9APz28QDhuL8A367C AAnm+AD/AAIA8AD5APYD/QAbIx4ACQwKAAUDBwAYFBkAHFtNAAglzQAFCsgACgDlAO7vFwD7BDQA AggmAAX7AADw3tcA7uXYAB4F+wAP+wIA8e3yAAQACQAuTkUABlRSAAMoIgDvFBoA9gMNAAn++AAC //wA+QEAAAH/AgAD/v0A/P/5AP4AAAAMARIAFwYoABwYHwDhK/gAzsDBAP3//gAABQEA8PftANji 1gA4LD4AFw8MAP/+/wALDBAAOj1EANfTzQD9+/oA0dPIALCuqQBTWWsABAQBAP8AAAD9//4A/wAA AP8AAgD//gQA/QABAP7//AABAvwACAn+AAgIAQD9/v8A/QD/AP//AQD8AQQAAP8AAAAB/QAA//4A AgABAP4AAQD+/wAA/wACAP4ABQAAAAAAAAD9AAAA/AAC//sAA/8CAP8AAgAAAgEA/gAEAAAAAAAB AP8AAAAAAAAAAQAAAAAA////AAEAAAAAAQAAAf8AAP8AAAAAAAAAAAABAAAA/wD9/fwA9e7uAPfs 6gD15+MA8+PhAPvr6AAE9fIABfv5AAn8/QAB/vwA/f8AAP8BAAD9AAMA/AABAP7//gABAP0AAv// AAP+/QAA//0A////AP3/AAD+/v8AAf/+AAL//gAC//4AAv/+AAD+/wABAAMA/f//AP0AAAAB//4A BP38AP4A/gAAAAEAAAEBAPsCAwD2BAgA7QsSAO8RGAD/ERYADg4NABINCwAKDA4ABg4PAAgLCwAL CQkABwoHAAcHCwAGBwgAAwYGAAIDBAADAQIAAwEAAP8CAAD+AAEA/gEDAAAAAAABAP8AAAAAAP8B AAAA/wIAAQH+AP8AAAAAAAAAAAEBAP8A/wABAAEAAAAAAAAAAAAC/wAAAQICAP8A/gABAAEA//// AP8A/wAAAQEAAAEAAAH/AQAAAAAAAAEAAAEAAQABAAEAAP8AAAAA/wAAAQEA//8BAP8BAAD/AAAA AP8AAAAAAwAAAAAAAAD/AAACAQAAAAAAAAEAAAAAAQABAAAAAAD9AAIBAAAAAAAA/wAAAP8AAgD/ AQEAAgAAAAAA/wAA/wAAAP8AAAEBAAAAAAAAAAAAAAAAAAAAAQAA/wAAAAAAAAAAAP8AAAH/AP8A /gAAAAAABAMFAAAAAAD+AP8A/f3+AAEAAAD/+voAAwT/APv//QDq8fMABgsJAAYCAwAC/wAAAAAB APr//wDv9/cAEw4NAAQAAAACAgIAAgMBAP79/QAAAQEAAP7/AP7/AAAAAQIAAgICAAH//wAA/v8A Af//AP8B/wD///8AAQEBAAwKCwALCxAA+P7+APv/+gD5//sADQ8PAAgEBwD//gMAAQEDAAP+AQAA AQEAAwcFAAICAwD+/v8AAwMBAAUCAgABAgIAAgACAPwAAQD//v4AAQAAAP7+AAD9AQAAAQEBAAD+ /wAAAQIA/wD/AAECAAAB//4AAAH/AAD/AAD/AAAAAAAAAAIBAQACAQMAAP8EAP39/wD8/PoAAAH7 AAMAAQD+/vwA/Pv9AAMHAQD9/wAA/wD/AP8A/wACAAIABgMFAP4A/wAAAQAA/wD/AAACAAAB/QAA A/4CAAMBAwACBQQA/wQDAAECAQABAgAAAgECAAECAQABAgMAAwABAAIA/wAAAAAA/gAAAAAAAQAB Av8AAf4AAAH+/wABAwQA///9AP8A/wADAwMA/v//AP3//wACAAAA////AAEAAAADAQEAAQAAAP8B AAD+/fwAAgMDAAL/AQD//f0ABQMDAAIDAgD//gAA/v//AP4AAQD+/v4A/gD/AP9HWVZFAAAgAElE QVT/AgAAAAAAAAD9AAUEAgAFAgIA/f39AP3/AgAEAwEABAP/APsAAAD3+/wA+v4AAAIEAgAFAgIA AgEAAAMBAQD+AwMA/wMBAAEGBQAJDQ0ABgkJAPz8/AD/Af8ABQAAgP9/BQQACg4QAAgKCQAIDAwA BAkIAA0cIQAJFhgA7uzqAPwEBQD/AAAABwP/AP8DAgD+BQoA/gQKAAYB+QAA9/QAAf73AAYGDQAE Bg0A/wUNAP0DCAD7AQIAAwMLAAIH9AD+9PIAAgMAAAMFCAD+AxcA/QMaAAMFFgD/Bw0AAAYHAAQF BwACBgYABAUFAAIEBgAAAwQA//4DAP3+AQD/AQEAAAAAAP3/AgAAAQgAAQL9AAIA+wAEBQUAAQIN APz8BwAAAvYAAgHzAP39/QD6/AQA/fwAAP39AgAAAQgACxMKAAcIDQD379UA/P3qAAUI/AAaGQAA BAMAAA4QAgALCQAA/wABAP3/+gAC/usA/vTxAPHw4wD7AxgACAsMAAkG+gAP+O8A9v3cAPn9GgAG DRsA9/0HAAAH/wD7/PwA9fsDAPoK9wD7+/oA+/v5APz8/AAF/f4ADvz4AAgEBgD0BAYA9QQGAPkB AwD6+fsA7///APf8BgD4Bv4ACAIDABEJCAAUExQA/vf3APDw7gANDg0ACwsFAAP9/QD9/v4A/f8B AAIBAAAEBQMAAgEBAAAC/wABAQEA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB AAAAAAEBAAEBAQAAAP8AAAAAAP///wABAQEAAQH/AAAAAAABAQEAAQEBAP//AAD+/fwA/Pz8AAMD AwACAgIAAAAAAAEBAAAAAAAAAAABAAAAAAABAQEAAAAAAAEBAQD///8AAQEBAP7+/gD///8AAgIC AAAAAQAA/wAA/Pz8APv8/AABAQEAAQECAAAA/wAAAAAAAQABAAEBAAABAQEAAAAAAP8A/wABAf8A 9vb4APn5+gANDQsABAQEAAEBAQABAQEAAAAAAP///wAAAAAAAAD/AAAB/wAC/wAA/f4AAPr7/AAD BAYADQ0PAAAAAAD///4AAAD/AAMDAgACAgMAAAEDAAEDAgACAP4A/fz6APb19QAMDQoA+/v8APXz 8wDu6+kA8O7pAA0OCgBHR0QAFBYaAAYHCgABAQEAAAAAAAAB/wAAAQAAAP//AP///gABAQAA/wAA AAAAAAAAAAIAAAABAAEAAgD/AP8AAAAAAAAAAAAAAAAAAQD+AP//AQAAAAEAAAABAAD//wAAAP8A AQABAAABAAABAQEAAAAAAAAAAAAAAAAA/wAAAAAA/wAA/wAAAAAAAAEA/gD+AAAAAP8BAAEBAQAA AAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAABAQEAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAICAgAICAgA+vr6APz8/AAAAAAAAAAAAP8AAAAAAAAAAAABAP7//wAAAAAA///+AAAA AAABAQEAAAAAAAAAAAAAAAEAAAABAAAA/wD//wEAAAABAAAA/wAAAAAAAAAAAAQEBAAICAgAAAAA AP39/QD4+PgA//7/AAAAAAAB/wIAAAACAAABAQAGCAMABAb+AP8AAQAA/v8A+vbeAOfdtAAE+tkA Afv5AAABCgAAAPkAAQH7AAD/BgAAAQQAAwD8AAQA/QD7/wYABg4jABgiRgABAycA/P8GAP8A8QD2 8NIA9erRAAwC9gD/BAUABRMjAA4ZNQAFBRcA/gAEAP8B/AD+AP8AAQABAAEAAAAAAAEAAQAAAAD/ AgAAAAEAAAEAAAEBAQAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDAAEAAv// AAAA/gAAAQAAAAEAAAT/AAAA//wA/wD/AAD/BgAA/wQA/wEJAAAC/gD9/wAAAAD8AAIA/AAB/wgA AP/+AAEC/gD+AfsAAQACAAH+CAD//gIA5e3aAL/SqADO47cA8fnmAPvyBAAfCzgAUkdlADMpQAAS AwUA+P8CAP4FAQAE9vUA8MHLAN+puAAG5/AAAwH8APH/9wDyA/wAHDs2AEBnXgAAGxcAAwMGABEF EAAHAcEA/QS2ABAL2QD15w4A9PhIAAEbTAAAAxAAC+/sAO7R0gAD6u8ADwkEAPz5+ADw+wcA7ygw AABeYADtMTwABAD0AAH//wAC/PwA+v8AAAL/AAD///8AAQH8AP3++gD//v0A/wAAAPwC/QD5BfwA AQAEADQkNwAWxxcA5/npAAAH/wD4+PMA2+XYAOPp4gAWEB0A/wACAP4ABAAfJDAANztKALiwmgAN CP4At62fACYiJwAtOkYAAQH/AAAA/gAAAAMA/wABAAAB/wAD//4AAf4BAP4ABAAAAP4A/P/+AAAB AQAB/wIA/gD+AAL//gD//wMAAAADAP8AAwD+/wAA/v//AAAA/wABAAAAAQD9AAAAAAAAAAAA//8D AAAAAwD/AAAAAAEAAAAA/wACAP8A/wADAP8AAAABAP8AAAD/AAAAAQABAQEAAAACAAAAAAD/AAAA AAAAAAAAAAAAAAAAAf8AAPru6wDqraMA9+bmAAX5+QAIAP4ABAD/AAAAAAAB/wAA/P8AAP4AAwAA Af4AAgAAAAD+/AAB/gAABv7/AP/9/AD/AP4AAP4AAAD/AQAAAAAAAf//AP///wD/AAAA////AAEA AAD+AQIA/wD/AAAA/wD+//8A/wD/AP7/AAAC//8ABf//AP0DAwDvBgwA6AcPAPALEgD/EBIADBER ABAREgALDxEACg0OAAsMDAAJCgoABwwLAAYHCAAEBwkABQUFAAICAgACAgIAAQEBAP8AAAD9AQEA AQABAAEAAAABAP8AAAAAAAABAQAAAAAAAQAAAAAB/wAAAAEAAAAAAP8A/wABAAAAAQABAP8A/wAA AAAAAQEBAAEBAQAAAAAAAgQEAP///wAA//8AAP//AAAAAAABAAAAAAEAAAAAAAAAAAAAAAAAAAAA AAAAAQAAAAABAAAAAAABAQEAAAAAAAAAAAAAAQAAAAD/AP///wAAAAAAAQABAAAAAAAAAAAAAQAA AP///wAAAAEAAAEBAAAAAAABAAAAAQAAAAAA/wAAAAAAAAAAAP8BAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAABAP8BAQD+/v4A/v39AAcFBAAB/wAA+/8AAAYDAwAB /wAA/AIIAO788gAQ/QAACQH9AP0A/wDuAQUA6vb6AA4B/wAX/wAAAQD+AAMBBQABAAEA+f77APwA AQAFAgMABgICAAYC/gAAAP8A+/3+AP8AAAD/AwMA/Pr8AAEBAgAFBQQAAgb/ABAQDQD1+vcA9Pb+ ABIOGAAIBAcABQIFAP8B/wABAwIAAwECAAICAgACBQQA//8AAP/9/wADAwQAAwMGAAABAQAEBP8A AgAEAAD/AAD9/wAAAgABAAABAAABAAAAAP4AAAEAAQD9AP8A/f78AP4A/QAAAQEAAAIAAAD+/wD/ //4AAQIBAAEBAQADAwMAAAAAAP79AAAGBAcA/vwEAAMIBgD8/fkAAv0BAP8ABAABAQIAAQD/AP8C /QAAAAIAAv8BAAAAAAD+AP0A/wABAP///wADAgMAAQADAAQEAgD9AP8AAQAAAAABAQD/AQAAAgAA AAD//gD+AP8A/wAAAAH+AQAAAAEAAAQBAAEAAwABAgAA////AAEB/wD/AAIA/wD/AAD+AAACAf8A AQH8AP0A/gD9//4AAwEBAAUBAgADAAAAAAECAP8EBQD9AAAAAAABAAIDAgAA//8A/v3/AAAA/wAB AgEA//8BAAABAQAAAAEA/QAAAP3+AAAA//0AAgIAAPj9/ADx8vQAAgMDABALCwAFAwIABQUCAAYC AQD/BAEABAACAAMEAgABAQAAAgAAAAMA/gAE/P8AAv8CABINEQD6HR4ADRMPAAAE/wAFBQYAAQEC AP4BAgD+AQIAAP//APDs7wDx7fIAAQH+AAEDCQD9AwYA+QMDAP8EBAABAgUABQQDAAIBAQD/Av8A AgQIAAQIEQACBgkAAQQGAAQB/wAB/vsAAP32AAUD/wD4AAMAAwMIAP0DGQD9BCAA+QQeAP4HEwAB BgoAAwcJAAEECQABBAgAAwYHAAEHBwAGCgwA9fL4AP8A/wAB/v8A////AAACBQABBAAA///8AP// AQABAQQAAQH+AAMCCAD/AwgA/gMLAPj7DAD7CPUA/gH1AP359AAB/fcA/QAIAAMNIwAKCRQA+/La AAP52wAPBfAACQoAAAcKAQAGB/0ABgD3AAT+/QABAQsA8vkGAP4CDwAHDCAA+AALAP368gABA+oA A/n7AAUA8gAEBfcABAcPAP39BgD+/fgABv39APv9BgD8/PwA+/v7APz8/AD7/P4A+vv7APz/AAAQ BAQAAwkFAP4FBAD4AQIA9gAAAPT6+wD1/P8A8gIDAPD5AgD/FQYACQH9ABESEgA0JyIACAIAAP// AAD9/f0A+/r5APPy8wD6+voAAAACAAD/AAAA/v4AAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8A AAAAAAAAAQABAQEAAAAAAAAAAAAAAAEAAAAAAAEBAQAAAAAAAAAAAAEBAAD///8AAAD/AAQDAgAA BQIA+/v7APr6+gADAwMAAwMDAAAAAQAAAAAAAAAAAAEBAQAAAAAA////AAEBAQAAAAAAAAD/AAAA AQAAAAEAAAAAAAAA/wAAAAAA+vr6AP38/QABAQAAAQD+AAIBAgAA/wAAAQEAAAACAQD//wAAAQAA AAMAAQD+/gEA+Pf5AAEBAQANCw0ABAMDAAEA/gABAQEAAAABAAIBAAAAAAEA/v8AAAH/AAD/AP8A /f79AP3//gAHBwUABwcGAAEBAAAAAAEAAwMFAAUFAwADAwMAAgICAAQEBAAAAQAA/v/+AP75/QDu 7uwA7OvkAAMC/wAeHiEALjEvAA0QEAADAwIAAgABAAEBAQAAAAAA////AAEAAgAA/wAAAAAAAP8A AAD//wAAAQABAP///wAAAP8AAQEAAAAAAAABAAEAAAAAAAAAAAAAAAAA/wACAP8A/wABAQAAAAAA AAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAQAA/v7+AAABAgABAAAA AAEAAAAAAAABAQEAAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAAAAAAEBAQD///8AAAAAAP///wAA AAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAQEBAAAAAAADAwMACAgIAP39/QD6+voA+/v7AAEBAQAAAAAAAAAAAAAAAAD/ //8AAAAAAAAAAAD///8AAQEBAAAAAAAAAAAAAAAAAAD/AgAAAQAAAQD+AAAAAAAAAAAAAQEBAAYG BgADAQIA/v8AAPv7+QD8/PkAAQEAAAABAwAA/wcAAQL+AAQG/QACBgYA/QEKAAH+AAAB+9YA6dqf AAbzyQAF//EA+wEEAPsA/gAEAQIAAQAFAP4BAwABAvkAAv/4AAH9BAD+BB8ADRxNAPsNNwD+/wsA Bf74AP351gDu4rIABv3OAAQCAwD/CTYACBdRAAMNNAD9AQwAAP8AAAD/BQAAAQMA/wAAAAEBAAAA AAIAAAAFAAABAAAAAP4AAAAAAAAAAgAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAT/AAEAAAEAAAAAAAAA/wIAAP8CAP8BAAAAAQAAAAABAAAAAAD+AvsAAAL4AAD+AAAB/gYAAQEG AAAC/wD+AvkAAgACAAD+AgAC/gsA/wD/APT/7wDZ5MgAvcqpAOHt0wD7//YA//YQAC0aNwBYSmUA IRYrAAUABAD0BAMA/AH/AAX29QDnxswAxZmkAArq8QAEAQMA9vz+APEBAgAUMC0AO15YABAkJwAA AwUAAgL7AAAB8QAB9bgADA7uAPb2CQD09CYACRE9APcJGgAA//oA/uriAPLY1gAJ+vgABAoDAPPy 9AD6/gsAGi4yAP0gHwD9//4AA///AP4AAAD/AQAAAQABAP//AQAA/wAAAAABAP//AQD8/AAAAP0A AAIC/wD+/v8A/gABABYVFgArHC8A6Ne+AAAF+gD+Bv0A4u3fANTd0gAnHy0ACwUQAAL/AgADAwcA RkxPANTTxADm3tMA+fn3AKyqngAVHiYAGRseAP0BAwAAAP8A///8AP8AAgD/AAAA/gD+AAAA/wD+ /gAAAAACAP4A/wAA//0AAP8BAP//AgAAAAAA/v//AP7//wD//wEA/wD/AP//AAAAAP8AAAAAAAAA AAD/AAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEFBgD8Cw4A+PriAAX7+QD+Af4A/QEDAAL//wAC/v8A /wD/AP8BAQABAAAAAf/9AP8AAgD+AAEA/wEAAAECAQD+/wIA/wH9AAH/AAAB//4AAf79AAP//AAB AP8A/wAAAP//AQD9//8AAgD/AAD+/wADAP8AAf79AP//AAD8AgUA9AMFAPIECADuBAsA+AwTAAkV GAANFRYADhMSAA0PEAAKDQ8ACw0MAAYJCgAJCQkABQcIAAEDAwABAgMAAQEBAAEBAQABAQEAAQEB AAAAAAABAQEAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA AAAAAAEBAQAAAAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQABAQEAAQEBAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAD/AQAAAAAAAAD/AAH9/wD//f4ACQoJAAD/AAD8+PgA //7+AAAEBAADAwMACAICAAgC/wAAAP8A8gIEAPL19gDq8uwAAwIDABQYFwD9/f4A+QIBAAIBAAAA AP8AAAAAAAIA/wAC//4A+vr5AAECAQD/AwYAAQICAPv6+gAGAQMABQIDAPv//gD5/PsABQYDAAwJ CQAaFBQA9/kQAP///wAA//8AAAABAAEAAAAAAQAAAgICAAMDAwAA/wAAAwIEAAEDAAAEBAUAAgIC AP8AAAAEBAIA/wEAAAD/AAAD/QIA/f8BAPz//AAAAAEAAAH/AP8A/wABAP8AAwEAAAAAAwD+AP4A Af//AAECAQD//wAAAP8BAAECAAACBAMACQoNAP7+/QACBAEA/wEBAP4B/wAA//4A/f3+AAMEAQAA AAAA/wEAAAEBAwAAAQEA////AP/9/gACAQMA//4AAP7++wD9//8AAgEAAP4AAgD+AQAAAwIDAAD/ AAD//f8A+v39AAEBAAAFAgMABAQEAAIDAAABAAAA/gAAAP39/QADAgIAAAAAAPz9/QD+//8AAgMC AP4BAQD+//0A/f7+AP0A/wABAgEAAgMDAPz//gAC/wIAAgMBAAH8/gD8//4A/P//AAQEBQACAQEA Af7+AAEBAAAAAQEAAwD/APv8/AD//wAAAQMFAP7+/wD+//0A/v4BAAYFAwAHBQUAAgMEAAEAAAAA AQAA/v7+AAIDAwAFAwIABv4CAAYAAAAA/wEAAP3+APv7+wD69/cA+vj4AAEJCQAwPkEABAoIAOHh 4AD7+fkA/f7+APz/AAD/AQEAAwMCAP8DBQAFAwEAAwIBAAAEBwABAgQABgL9AAYEAAAEBAMAAwUH AAQDAAD/BggA/AQHAAAECQABBQkABQMEAAP++gD7APcA+/zvAP377gAA//4AAgUSAP4FGgAABBUA BAMQAP4GCQABBgcAAgQHAAIFBwAEBwcABg0OAA4SFAARFBUA8dvbAP74+gACBAQAAP//AP0CAwAF BwgABwUBAPz49gD//PsAAQP+AAP++wD+AgMA/wIDAAEHAQAE/gMA/gIEAP4ABAD++wUAAPz2AP/+ /AAEBAsACxAjAP31+gAA/PoABQT1AAYD/AAFAQMA////APz7+gAAAAYA+PX+ABUeGwD6CBAAA/4H AAMC/gADA/gAAAL5AP4DAwD/AgAABgUDAP0GBAAA/gEABv7/APv9/QD8/v0A/Pz8APv7+wD9/f0A /Pz+APv9/AD9/wAAAgQCAAMIBwD+BQUA/QEDAPsBAwD4/gAA8vn5AOXw8gDPyssAGw0KADM8NwAQ DAoABQIBAP8BAgAAAAAAAQD/AA8ODgDy8/QA+fr5AP/+/QAEBQYAAAEDAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAEBAAABAQEAAAABAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAA AAAAAAAAAAAEBAMAAAAAAPz8/AD8/PwAAQEBAAICAgABAQEAAgICAP///wAAAAAAAQEBAAAAAAAA AAAAAAAAAAEBAAAAAP8A//8AAAEBAQD///8A+fn6AP7+/gACAAEAAAABAAAAAAABAQEAAAAAAAD+ /wAAAAAAAQICAP4AAAD9/v4A+fn4AAUFBQAICgkAAAECAP8AAgD/AAEAAQABAP8A/gAAAAAA/QAB AAL//wAA/wEA/v3+AAD9/gAICAkAAgICAAICAQAEBAQABAQFAAUFBAAFBAQABQUFAAUEBAADAwMA AQMBAAQCAwD9/fkAKCYjABEQDgACAgMAAAECAP8BAQABAQAAAP8AAP///wABAQEAAAAAAP///wAB AQEAAAAAAAEBAQAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD///8AAQEBAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAD///8AAAAAAAAAAAABAQEAAQEB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAQEBAAEBAQA+fn5APr6+gAAAAAA ////AP7+/gADAwMA/v7+AAAAAAAAAAAA////AAAA/wAAAAIAAAAAAAAA/wABAAEA/wABAAAA/gAA /wAABwcHAAMDAwD+AP8A+vv6APv7+wACAgUA////AAAA/gAAAf0ABAQAAAYGAQD/AQQAAPwAAAH+ 6ADr4rwA/PTTAAb/+gD9/gcA/wAAAAIB+wAA/wAA//8CAAIB/gAB/vwA/gEHAPkCFwANGDwADxQy APwBDwADAfsAAfvfAObZtgD+8tgABAP/AP8GGwAHEzMADREqAP8BCgAAAAIAAAH+AAEBAAAAAAAA AAABAAAAAAAAAP4AAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAQAAf8AAAAAAAAAAQAAAAAAAAD/AAAAAQAAAAEAAAD/AAAA/wACAP8A/gD/AAAA AgAA/wEAAAAAAAD//wAAAf4AAP8CAP//AQD6/vgA6/LgAM3cuQDK27QA7UY5Kt0AACAASURBVPXe AP78/QARBiEAOTROAEE0UAAYDx0AA/8CAAAB/gD4AQQAB/ryAOvKywDWpa8ADebxAAoA/wDzAPkA 8AUCAA8tKAA5XlQADCwnAPcFDAAI/foABADlAPn80gAbDbcA+P//AOzuGwACBEQAAQgzAPr/CQAQ /O4A99vXAP/g2gATA/wA/f78APD6/QD5CxEAJjg9AO0TEAAE/AAA/wABAP8AAAD+AAEAAAD/AAH+ /gD///8AAQH/AP8A/wD//v4AAP//AP3/AAD+//8A/gACAAYDCQBBK0cAztrRAOsA9gAACf4A8Pbt AMnZxQAtJjIALh8zAAL/BwD/AAIABQsQAExSXgCil4oADf3rAOnl1QDDvLIAUFhjAAIHDAD+//4A AQD+AAD+/QD+/wIA/wAAAP///wD+AQEA//8BAP//AAAA//8AAQAAAP8AAQD///8A/wD/AP8AAAD/ AAAA//8AAAAA/wAAAAEAAAAAAP8AAAAA//8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYLDAARJy0A9eHh AP/s8wABAf4AAAIBAAD/AAACAP4AAAABAP4B/wAB/wAAAP7/AAIB/QD+AQIA///+AAD+/QAA//8A AP/+AP8A/gAB//4AAQD+AAAAAAD/AAAAAAAAAP4AAAD///8AAP7/AAP//QD/AP4A/gEDAPsCBADw AgYA7QMHAPELEAABExgADhgaABEVFQAPEhIADQ8QAAwODgAGCgkABgcJAAIEAwAFBAcAAAAAAAEB AgAAAAAAAQEBAAEBAQAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAABAQEA AQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAABAAD/AAEAAgAD AAYEBAAIBwcA+/z9APj7+wAAAAAABwYFAAYDAwD8/P0AA//7ABQLCgD1/v8A7PP0APT4+gANCwsA HBIRAAoA/wD//P4A/P4AAPj7+wAFAwMAAwMFAP37+gAAAv4ABgYFAP4AAgD6/v8A/gD9AAQFAwAA AAEAAAECAAMBAgACAwEAAgH/AAQFBQAACAgA//v2APn7/AD9/wAABAMEAP///gADBAIAAwMEAAMD AwAA/wEA//8AAAMEAgAFBQMAAQEBAP7/AAD///4AAQIAAAD/AgD//gEA/v7+AAICAgD///8A/f78 AAQCAwD//v0AAAH/AAAA/wABAAAAAAEAAP//AQAAAAAAAAEAAAEC/wAEAgIA/wUHAAYHDAD+/vsA /gD8APv9+wADAgQA//z7AAcDBgAAAQEAAAABAAD//wD///8AAAAAAAABAQAB/wAA/gAAAP8B/wD9 AfwA/vz7AP4B/QD/AgUAAQL/AAAAAQAAAAAAAQACAAIBAAD/AQAA/f79AP4AAQAGBAIABQEAAPz/ /gD+AP8AAQECAAEAAQABAAAA/gAAAP8A/wD+/wEA/f8CAP8B/wAA/v4A/wH+AAABAwD8/f4AAwD9 AAAAAAACAQEA/P//APr7+wABAQAAAwEBAAMCAQACAAAA//7/AAQEAwAAAAAA/v7+AAUDBAD9/v8A BAQEAAIAAAAMCwoAAP8BAAQDAAD/AP8A+vz9APr6+gAA+/wA//n6APv//gD8/f4A/P39AP78/QD9 /f4A/AABAAAKDQDr9/sA8+7xAPv9AwACAwkAAAQCAAECAQABAwIAAgECAAEEBQACAwIABAICAP8D BAACAv8AAwD/AAID/wADBwcAAwcGAAICAQACChEA/ggQAAAB9wADAwMA/gIBAAAA/wAD/vYA/wDt AAEF9gD9AgQA/wYYAPsFHQD8BRkAAAQOAAMFCgABBQoAAQUJAAMHCAAMEhQAFBocAAwREgAAAQEA AAIEAAAC/QAAAAIAAAEBAP8EBQAHDQ8AFhUTAPPw7gDz7u0A/vv5AAAAAQABAv4AAQIDAAIHBQAB AQQAAfkFAAMBCQAA+woA//nvAAH79QD+//0A+wERAAQKIQAA+fYA/f7jAAH99wABBP0AAQADAAQA AAD3+f8ACQkYAAkMGAD+AQkABP0CAAEACQACAQ8A/f74AAQCCAADBgQABQkHAPj8AAD//f8AAP7+ AAMDAwD9//8A/Qb+APz8/AD+/v4A+/v7APz8/AD+//4AAwQFAAYIBgAAAwUAAAABAAAAAgD+AwIA +ggFABUNDgDu7e4AGg8MAPTw7AD4DAMABQwNAAABAgAAAAAAAAAAAAgICAAGCAgA/wAAAAH//gD/ AAEAAAECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQABAAAAAAAAAAAAAQEB AAAAAAAAAAAAAAAAAAAAAQAAAP4AAAAAAAEBAQD///8ABAQAAP///wD9/f0AAgICAAEBAQAAAAAA /v7+AAEBAQAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/PwA+/v8AP/+AAAB AQEAAQEBAAEBAQAAAAAAAAAAAAEBAQAAAAIAAAAAAAAA/wD8/v0A/Pv9AAkICAAGBgUAAAIBAAAB AAAAAAIA/wD+AAAA/wAAAQAAAQABAAAAAAAA/wAA//8AAAEBAgAIBgcAAgQCAAMDAwAEBAQABgYG AAYHBAAFAwQABAMDAAUDBAADBQIAAwQDAAQDAQACAQkAAwICAAIBAgAAAQEAAAEAAAEAAAABAP8A AAEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// /wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAQEB AP7+/gAAAAAABgYGAAQEBAD5+fkA/f39AP7+/gD+/v4AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAA AAAAAAAAAAD///8AAAAAAAICAwAFBQEABgYEAP7+/wD8/PwA+vr6AAAAAQAAAAEAAAD/AAEAAQAC Av8ABAUDAAEBBAAA/gEAAv7xAPLpxQD367wABv/gAAACAQD+/wkAAP/6AAMA+wAAAAQA/wEEAAIB /AACAAAA+wEPAAQSNgANHEcAAAQjAAIABQD//eYA7ui/APvrvAANAOQA/gAOAPwMLwAOFz4A/wUg AAD/CAAAAvwAAQH9AAD/AQAAAAIAAAAAAAAA/gAAAAEAAAAAAAAAAAAAAP8AAAABAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAP8AAP8BAAD/AQAAAv8AAAH/AAD/AQAA /wAAAAEAAAAAAAAA/gUAAv8IAP8B/gD/Af0AAAH7AAAB+AAB/Q0AAAD/APX77QDb5sgAydm0ANzo zQD2+fEAAfsHAB4QKQBCMlQANCZDAA4IFQAAAAEA/QAAAP8AAQAH9/gA+9TXANmkrgD82+UACgIF APj89ADyAvsACSgnADRbTgAYMykA/wYGAP7+AQAAAvYABQPRAAsDtAALC+QA7+4jAPX3NQAPEkAA +wQSAAj9/AAI7O4A7dLSAALs5gATBv8A9fb6AOwACAAEKCkADy4tAOcDCAAP+wAA/QD/AAAAAgD/ AAAA/wAAAAD//wAA//4AAQD+AAD++gD+/voAAf//AP7//wD9/wAA//8AAAABAwApGi4AJRonAO3r 6AD+BfsA/gf8ANvm1gDT3M0AIhomAAwEBQD+/wAA/v4DACQoMgAyN0YAw72pAAUE+gDHwbMAICIj ADA5RgAAAgUA/gABAAAA/wABAAAA/gACAP4AAAD///8A////AAAAAAD/AAEAAAAAAP///gD/AAAA /v//AAAAAQD/AP8AAAAAAAAAAQAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAIG BwANIycAEiHXAPTv6QAF/P0AAwD9AP8BAgD8/wAA/wD/AP3/AAAA//8ABQEAAP///wD//vwAAv7/ AAP+/QAAAP8A/gD+AAD//wD/AP8A/gEDAP4AAQAA//8AAwD+AAP//QAE//8AAAD+AAD//wD6AwYA 8gIHAO8ABADvBAoA/hIVAAocHwARGhwAExQVAA8REAAMDw4ACAgLAAUGBQACBQQAAQIEAAEBAQAA AQEAAgEBAAABAQABAQEAAQEBAAAAAAABAQEAAQEBAAEBAQAAAAAAAAAAAP///wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAEBAQAAAAAA////AAEBAQAAAAAAAAAAAAEBAQD///8AAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA /wABAAAAAAAAAAAAAAD7/f0A9v78APj6+gAEAQEABAD/APv/AAACAgMA/v79AA4HBwAF/f0ACwoK APn5+wAJBgUABwD/AP37/AABAQIAAwIAAAEBAAD7/v4AAQAAAAYFBQAB//8A/wIBAP7/AAD7+vcA A/8BAAYLCwD//gAA+Pn5AP4AAAAICAYAA/4AAAECAAAHBQYADQoAAAT6+wD7/f8AAQACAAECAQAE BAQA/wEAAP39/QACAgEABQUDAAMDAwABAgAAAQAAAAD//gD9/v8A/wAAAP/+/gD+/wAA///+AAD/ AgD///8A//8BAP7//gABAv8AAQAAAP7/AAD//wAAAAAAAAAA/wD///8AAAD/AAICAAAEBAIAAP8C AAcGCQD5/AAA/v3/AP3+/gABAv0AAP/8APz9+QAEAwYAAAACAAAAAQABAQAA/wD/AAD//wD+AAEA /wD/AP39/AD59vIA9OzoAAcHCAAHDREABA8HAP8D/wD//wAAAQEBAAAAAAAAAAAA/gAAAAL//gD/ /gEA/wEAAAMDAwD+/v8AAP8AAAD//QABAAAA/f0AAP0A/wD+//8AAAH/AAIB/wADAgEABAIDAAEA AQABAwIA/v//AAAA/wABAgMAAwECAP/+/gABAAAA/gD/AP/+/wAEAv8ABAMBAP7/AAAAAAAABAQC APv7+gAFAgQA+/n6AP4CAAADBQYA/f/+AP77/wAEBgMABAQEAAEBAQD5/PsA9vr4AAYCBAD/AgMA AQQFAAMIAAACAQMA/v39APj5+QD69vYAAQH/AAYHBgACAQIAAQMEAAABAgAAAgIAAAICAAEDBAAD AwQABAICAAIC/QD/AQEAAAEEAP8CAgACBQEABQQBAAEBBgACChYAAggVAP/56QADAPkA/wIHAAEE AAAFA/sACgH5APb4/gD1Ag8A/AUbAPoHFwD/BQ0AAwMKAAIDCAABBAcAAQYHAAoPEgAXHR8ADRIU AAEDAwD29fYA/v8BAAEDBAD/AwAA/wAAAAAEAwAABAMABAkLAAj9/wD09vcAAAACAP/8AgAB//0A Av8DAAQEAgAAAAEA+wEEAAMC+wACBAYA/wMCAP/5BQD//PcA//77AP8AFQACAiYA/fwAAPz95QAF /PYABAP9AAcBAAD0/QQACxYdAP8DBgAFAv0A/wAAAP7/BgABAAwAAgQEAAIACAAFBQgAERIUAPL3 +QD39v8A/v39AAL/AAAB/v4AAgAAAAQEBAD9/f0ABAQEAP39/QD///4ABQUHAAYHCAAAAQIAAQEC AP8AAQD/Af8A/gD/AAwABAAjHhgADAgEAAX8+wD19fYACgoMAAMCAAAAAQEAAf8BAAABAAABAQAA AQAAAAEAAgAAAAAAAP8AAP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQABAAEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQABAQIA/v7+AP///wACAgIAAQEBAAAAAQAAAAAA+/v8 AAEBAQAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAQAAAAAAAP///wD7+/wA ////AAECAgABAAEAAQEBAAAAAAABAQEAAQEBAP///wABAQAAAAEAAAAAAAD6+vkA/P78AAsJDgAD AwIAAgH/AAAA/wABAP8AAAAAAP8A/wAA/wAAAAAAAAD/AAD9//8A/P39AAMEBAACAAAABAMDAAYG BgAFBgUABwUEAAUFBAADAwIAAwMDAAMDAwACAgIAAwQBAAMBAQABAQIAAQICAP4AAAABAAAAAQAA AAAAAAAAAAIA////AAAA/wABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD///8AAAAAAAEBAQAAAAAA////AAMDAwAKCgoA+vr6APb29gD///8AAQEBAAAAAAD///8AAQEB AAAAAQAAAP8AAAAAAAAAAQAAAAAAAAD/AAMDAwAFBQUAAAAAAP7+/AD5+fkA/v4AAAICAQD+/vwA AP8BAAEBBAAEBAAAAQEGAAD/BQACAPQA+PLLAO7kswAE+d0AAQH5AP4ABgD/AvoAAf7/AAAABAD+ AgUA//8CAAMAAgD+AQsAAgslABAbQQABCigA/gEFAAIA9QD38tYA7eK+AA0A4wADAQAA/gkpAAsY QQAFDygA/gAJAAL//gABAAAAAAAAAAAAAQAAAAEAAQEBAAAA/gAAAAEAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAP8AAAEAAAAAAAAAAAAA AAAAAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAAEA/wD/Av8A/wAAAAIAAwAB/gYA+f/vANLfwQC1 x5kA8//eAAEAAAAMARkAJx48AEMzUgAmHS4ABAIIAP4B/wD/AvwAAQEBAAD8/wD51NgAzJuiAP3U 3AAKAAoA9QD9APEF/AAFHxsAK09LABY0MwD+CQQABPv/AAL//wD9BfUA//7XAAsBwQDs9xwAAAA9 AAsNSQD8CiMA/QP/AA/48wD919YA9NbUABT89gAGA/8A6fUAAPAMEwArSkkA+BMQAAD9AwD+/v8A /wAAAP8A/gD+Av8AAAD/AAH//wD/AP8AAQEAAAH//gD//vwA////AAD/AQD//wAA//8AAAAAAQAP CBQAMiY0ANPrzgDz//sAAAf8APP17gDX4tQANu/oACEUDwAB/wEA/wD+AAMGDgA7Q04A1dXKAOzn 9QD08OQAsKuhABIVHAAcIyoAAAIDAP7//wAA//8A//8AAP///wAAAAAAAAD/AAD/AAAAAAAAAAAA AAAAAAD/AAAAAAAAAP7//wAAAAEAAAAAAP///wAAAAAA/wAAAP///wAAAAAAAQEBAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP8AAQADDxMAESUpAPXe2gD+6+cAA/3/AP0C/wD+AAAA//7+AAL+/wAAAAAA/AD+AAL/ AAAE/wAAAP7+AP7//gAC/wAAAQH/AP7//wD/AAAA/v8AAAABAQAB/v4AAv79AAH//gD8AQIA+/8E APgDAgDxAwcA6QMKAPcNEQAOHiMAFRwcABMYGAAREhIADQ4NAAcKCwACBQcAAQECAAEBAQABAwIA AAAAAAIBAQABAQIAAQEBAAABAAABAQEAAAAAAAEBAQAAAAAA////AAEBAQABAQEAAAAAAAEBAQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAABAQEAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAQEAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAD/ AAAAAAAAAAEAAAAAAP8AAAH/AAAAAAD+//4A//7/AAUEBAAIBAQABQMCAP///wD9/f4AAQACAAH+ /QAKAwMA/AD/AAP9+gATBggA/Pv8APcBAgABBAQABgUBAPn7/AD5+/wABwUFAP8BAQD6/fwAAP4A AAcEBAAMCAgAAf8BAP/9/AD//wEAAwMDAAIA/wACAAAAAQEBAAEAAAAEAgMACwsJAAUGBwD09vkA Af8BAAEAAQAB/wAA/f8AAP7/AAAFBAMABQQDAAACAQD///8A/wAAAAEAAQABAAEAAP8BAP8A/wD9 //4AAwMCAP79/wD9/v0AAP//AAABAQAAAP8AAAH/AAD//wD/AAAA//8AAAABAAACAgAA/wABAAD/ AAADAgAA/wIBAAUDBAD//wYA+f37AP///wD7+voA/vv1APb/AQAMCxAABwgOAAEBAQABAQAAAAAA AP8BAQD///8A/gD+APr59gDd2NUA6+HdAAwMDQANFBoAJy8NAAYFCQD/AAAAAgEAAAEBAQD/AAAA ////AAIAAQACAQEAAAD+AP3+AQAAAQMAAP8AAAIBAgABAf8AAf7+AAD+AQACAAEAAgH/AAQB/wAE AgIAAAAAAAAA/wD9AP4AAQICAP7+AAAC//8AAwEBAAECAgAAAQAA/P7/APz+/gD//v4AAAAAAAIA AQABAQAAAAAAAAAA/gAAAv8AAAACAPb7+gAEAAAABQMFAP4A/gD//f4AAQQCAAMCAQADBAUAAwsM AAQEBQD+AgIAAAIDAAACAgD+AP8AAPj5AAMA/wAJ//4AAQIBAAACAwAAAgQAAQMDAAEBAQAAAAEA AAIBAAICAQACAgQABAEBAAMB/gABAQAA/gACAAICAwAGBP8ABQL9AP4BAwABBw4AAwsYAPn12QAI +/IACAf1AAED/gAC//YA+vj0APX1/wAACB4A/wodAP8DEAABBAgAAgIHAAIDBwAABAYABwwNABMZ GQAMDxIAAgMFAP39/ADu7e0AAAEAAAIEBAD9AP4AAgABAAECAQD8/PwA+/v7AP4BAQD/AwUAAggB AP/7AwD/+/kAAgD8AAQE/gAAAAIA/wIDAAIC+QAABAIA/QMCAP4DBQD/+/AA//z1AP/9CwD+BB4A AP8HAPz9CwD7AeIABf7yAAD9+wD///8ACQkEAAMC/QD/Af8A/QIBMtXKpgAAIABJREFUAAEDAgAA AAMAAQIFAAQDDAAAAQkAAQIFAAcE+wD/BgYA/wACAPz//gAD/PwA/v0AAPz//QACAvwAAwMDAP// /wABAQIABQUGAAQEBAD/AAEAAAICAP8BAAD/AP4AAf//AAv+/QAIBgQABwUCAAACBAD+/wEA/v8A AAMAAAAB/wAAAAEAAAAAAAABAAAAAAAAAP///wAAAAAAAQAAAAEBAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAQAAAQABAP///wAAAAAAAAAAAAEBAQAAAAAAAAAAAAEBAQD//wAAAQEBAAEB AQAAAAAAAAAAAAMDAwD//wEA///7AP39/QACAgIAAwMDAAAAAAAAAAAAAQEBAAAAAAD///8AAAAA AAAA/wABAQEAAQEBAP39/QD7+/wA/v0AAAEAAQAAAAAAAAAAAAAAAAAAAAAAAQEBAAEBAQAAAAAA AAAAAP7+AAD49vgA/f39AAkKCQAAAQEAAAAAAAEAAAAAAQEAAQAAAAD/AAD/AP8A/wD/AAEAAAD/ //8A/v7/AAMEBAACAgIABgUFAAcGBQAFBQQABQUEAAQEBAADAwIAAwMDAAEBAQACAgEAAQEAAAIC AgABAQEAAAAAAAEBAAAAAP8AAAABAAAAAAD///8AAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAEBAQD///8AAAAAAAAAAAD/ //8AAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAABAQEABQUFAA0N DQD09PQA/v7+AAICAgAAAAAA//8AAAEBAAAAAAAAAAD/AAAA/wD//wAAAwMCAAUFAwABAQEA//8A APr6+gD+/v4AAAABAP3+/wAAAAAAAQIBAAMDAwAEBQMAAQEEAAD/+wD799kA7eOzAAT70wAEAPgA /v4LAP4A/wAAAfoAAgIEAP8ABQD+AQEAAQD5AP3/AwD9BR0ADhY9AAcPLgAAAgwAAv/5AP/43gDq 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAEBAAAAAAAAAQECAP7+/gD///8AAAAAAAEBAAACAgEAAAACAP//AwD7+/sA+/v7AAUFBQAA AAAAAQEBAAAAAAAAAAAAAQEBAP///wAAAAAA//8AAPz8/QD8/P0AAAAAAAEBAQAAAAAAAQEBAAAA AAAAAAAAAAABAAAB/gAAAAEAAP8AAPb29wDz8/IAExMQAAMA/QAB/gEAAQIEAAABAgAA/wAA/wAA AP//AAABAQAAAP7+AP7/AQD+/v8AAwIDAAUEBAAIBwUABwcGAAQEBAAEBAMAAgMBAAMCAQABAAEA AQEBAAEBAAABAQIAAAAAAAEBAAAAAAAAAQEBAAAAAAAAAAAAAAABAAEBAAAAAAAAAAAAAAEBAAAA AAEAAAAAAAEBAQD//wAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAA AAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAABgYGAAUFBQD6+voA+/v7AP7+/gD//wAAAAAAAAICAgAG BgYAAwMDAAAAAAD6+voA+/v7AAAA/wD+AAAAAP8AAAEBAAACAQEABgQCAAMEAQD+AQAA//zrAPTp wAD37MEABP3qAAEBAgD+/gMAAQL6AAL//gD+AAUA/gACAP8A/AAC//sAAAIKAAUPLAANGTwAAgok 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAAAAP8AAQEBAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAABAQEAAAAAAAEBAQAHBwcA AwMDAPv7+wD9/f0AAAABAAUFBQAEBAUAAQEBAPv7+wD6+vsA////AAAA/gAAAAMAAAACAAMBAQAF BgEABgYCAAABAQAA/fIA9e7OAPLnwAAD+eEAAAH/APv/CAAAAP4AAv/4AAABAgAAAQUAAP7+AAH/ /wAB/ggAAAkmAAoXRAAFDSoA/AEJAAQA+AD79tsA8OS/AAf82gADAfsA+AUfAAgXQQAJFjYA/QMO AAEA/wAB//8A/wACAAEAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAP8AAAABAAAAAQAA Af8AAAD/AAAAAgAA/wAAAAH+AAAAAAAA/wMAAAL/APT76ADX4M4A0tzFAO7z3QApHz0ALyQ8ABoP KgAEBA0AAP/+AP4B/QAAAP8AAf8CAAEAAQAA/wIAAAEBAP8C/gD+AfsACxEQABUdIwAD4eoA/AIA APoOBgAlSEAAF0JCAAYYFQAB//wAAP0DAPsCCAD/AP0ACf/aAAwCzQD+++MA/wVFAPoBOgAC//kA +wH/APwCAgAC/vwAA/LsAPfd2AAB5eMACvr1AAABBwD/FBIADDMwAAIgIgD3AgUAA/7/AAH+/AD+ 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAQEBAAAAAAD//wAAAAD/ AAAAAAAAAAAAAQEAAAMDAgAAAAQAAAAAAPz8/AACAgIAAgIBAAAAAAAAAAAAAAD/AAAAAAAAAAAA /v79APv7/AD//wAAAQEBAAEBAQABAQEAAAAAAAEBAQAAAAAAAQEAAAAAAQD///8A+Pj4AODh3gDW 19QA4uAIAAUEAgAFBgQACAcHAAgGBQAEAwIAAwQDAAMEAwACBAcABwYHABYZHAAiJCUADQ4KAAcH BwAEBAQAAgEBAAEBAAABAQEAAAAAAAEBAQAAAAAAAAAAAAEBAAABAQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAA AAAAAAEBAQAAAAAAAAAAAAEBAQD///8AAAAAAP///wAAAAAAAQEBAAAAAAAAAAAA////AAAAAAD/ //8AAAAAAAEBAQABAQEA////AAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAEBAAD//wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAA AP///wAAAAAABAQEAAMDAwD+/v4A//8AAAICAgABAQAA/Pz8APr6+gD+/v4AAAAAAAAAAQAAAAAA AQEAAAMFBQAECAMA/gAAAAL//AD79NcA9Oe8AAL42wAC//oA/f4FAP4BAAACAfsAAP8BAP3/BgAB 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAA AAAAAAAAAAAAAP//AAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQEBAAMEAgAAAAAAAP/+AAAA AAD8/PwA/Pz8AAAAAAAAAAAA//8CAAEB/wADAwAABAUCAP0ABAD/APsAAffjAPTowQD+8ssABP3u AAAABgD/AAUAAQD3AAEB+wD+/wkAAf4HAAIB9gACAv4A/QURAAgQOgANFz4AAAcXAAD/AwAA/e4A 8enKAPbryAAG/eQA/gEEAP4KKQASG0AAAgggAP7/BwACAP4AAQH/AP8AAAAA/wEAAAEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAgAAAAAAAAH/AAD/AQAAAAEA/wH+AAAA/wAAAAIA+Pr3 ANjgyADT3rYA6/LjABwWLgAvI0EAIRknAAcCFgD///wA/wH5AP8C/wAC/wIAAf8FAAAA/wAAAf4A AAEAAP4AAAAA/wAAAf4BAP8CBQD2CQMAETk1ABciKAD4AO0ABhMTAAAKGgAB/v4ABAH5AP0ABgD9 AAcABQDyAAkBzAAEAdEA9PkNAPkCSgD8/SoAAQH2AP7/BQAAAP8AAP//AAD/AQD/DBMACy41AP3p 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAQAAAQEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP8BAAECAQD///8AAQEBAAAAAAABAQEA////AP///wD///8AAAAAAAICAQAA AAIA//8EAPv7+wD6+vsABwcCAAEBAQAAAP8AAAAAAP///wD7+/sA/v7/AAAAAAAAAAAAAAAAAAEB AQAAAAAAAAAAAAEBAQAAAP8AAQEAAP7+/wDy8/QA8PHzAAcHCgAEBQYABgcIAAkJCwALCgoACwoJ AA0NCQAPDw4AEhIQABEQDwAQEQ8ADw4OAAkJCQABAQEAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA AQEBAAAAAAAAAAAAAAAAAAEB/wAA/wAAAAEBAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABAQEA//8AAAAA/wAAAP8AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQEBAAAAAAAAAAAAAQEBAP///wAAAAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAA AP///wABAQEAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAQAA AP8AAAEBAAAAAAAEBAQA/v7+APr6+gD+/v4AAwMDAAMDAgAFBgQAAgMAAPz/+wD/++oA8+nAAPTq xQAG/OcAAf/9AP0ACAABAP4AAQH8AP//AQAAAAMAAgH+AAL//AD/AQgABAwnAAwaPwACCyUA/wEE AAH/9wD28NcA9OfDAAX52gADAfwA+AMgABEaQwAIDy4A/gAJAAMB/gABAf4AAAADAAAAAgAAAAEA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAA/wAAAAAAAf8BAAAAAQAAAAAAAAD/AAAA AQAAAAAA+vv4AOTm4QD39vkANy5HACcbQQARCiAABQP/AAD//gD/Av4AAAD+AAEAAQAA/wIA//8A AAEBAAAA/wAA/wAAAAAAAQABAQAAAv8AAAD+AQD9AQIAAAYFAPwcEgADAg8A/AIEAAP//AAE/voA //0HAP0CCAADAvEACQHMAA0DywD7+vUA/QE7APj/MAAB/w0ABwPnAPz+DAAAAP8AAf/+AAAAAgD6 Cg4ACTU+AA4fHwAH8+sAAwIEAPkZIgD2ExwA+wEDAAQA/QAB/gAA/AECAAD//wD9//8AAQD+AAAB /gD9AAUAAQoXAAMRJgD56+QABg4gAP8HEwD8AQMABP/9AAH//QAAAAIA/v8CAAP/AgD/AP8AAQAC ABcSHwBOPlwAPvlKAAEDAQAPBxQADQUSAAEAAgD+Af4A//8AAAD9AAD//gEA/wH+AAIBAQAKDxkA ISs6APTy7wDDvLIA2NHGAA8UGgAIDhYA/wEEAAD9/QAAAP0AAAABAAAAAQAA/wAAAP/+AAAAAAAA AAAAAAABAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AP8A/wABAP4AAf8BAAAFBQALHiIAETA3AOn19QD76+QA/P39APD/AwD6Cg8AGScoABsjIwAKFxoA Bg0QAAMKDAACCAkAAQQGAAECAQABAP4AAgAAAAL//gAA/wEAAAIAAAAAAQAAAgAAAgABAAAAAgAA /wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP8AAAAAAAAAAAAAAAAAAAAAAP8AAQAAAAAAAQAAAAAA /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAB AQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB AAAAAAAA//8A/Pz7AAEA/wAKBgQAAQEIAPz/AAAEAQAA/wIBAAIICAABAgIA8ff3AAwHBwAIBQQA /fv7APr+/gAIBgUAA/7/AAP+/wD6/v0AAAICAAEAAQAAAf8AAwABAP3+AAD4/wAA7fb1APj5+AAQ BwgAFQ0LAAD/+wDy9vkAAwUFAP39/wD+AAAA//4BAAMDAgAEAwIA/v7/AAQEBAABBAMA/wD+AP8B /gD9//8AAP8AAAEBAAD///8A/gAAAP4AAQAAAAEAAQL/AAD/AAAC/wEA/gEAAP8AAQD/AQAAAP8B AP7/AAD/AAAAAwIBAAQAAgD/AAAA/AAAAP3//wABAAAA////AP4BAQD7//8A/wABAAD//wAA//8A AQACAAIDAQAGAQEA/wb/AAsLDQD6/fkABQUBAAQEAwAEAwMAAQH/AAAD/wADBAEA//4BAP79/gAC AQEAAwMDAP7//wADAgAAAAAAAAECAwADAwMAAP8AAAD//wAAAgEAAAABAAEBAAD8/vwAAgECAAMB /wAA/gAAAgEDAAD//wD9//4AAgEBAAAAAAABAAEA///+AP7+/gAAAgEA/wAAAP3+AAD5+/wA///+ AAsHBgABAf8ABAECAP3+/QABAQAAAwH/AAABAAD///8A//4BAP7+/wD8/f4A/v7+AAIDAQD8//4A AwECAAUEAAD9//8A/P/+AP78AAAABQQA/gIAAAEAAAD8+/0A9vv9AP//AAACBQUADgoDAAUKDgDy AQ8A3enfAPL4/QAAAwQAAf/+ABEF+gArFgcAGwv+AAoA+gAHAfgABAAFAOf5CADL4fEA6/T6AP8A BgAA/v0AJhYMAEsyHwAiEgMA7/0HAOn4AwC/1egAAAD/AAAAAAACAgIAAgMEAAECBQABAf4AAQIB AAEAAQD/AAMAAQIBAP7+/wD9AAMAAAIEAAcMDgAQFRYABwoKAAEBAQAA//8AAAEAAAAAAQAA/wAA AAAAAP8A/wAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAABAQEAAQEBAAAAAAAAAAEAAAABAAAAAAD/ AP8AAAABAAAAAAABAAAAAgEBAAECAQAAAgEAAgMGAAICBAABBAQAAvgBAAD8AgADAf0AAwAFAAEA BgAAAQYAAP8EAAD/AAD+/QEA+wABAAIKDAACAwkAAAH/AAMA/gD+/wAA///+AAAAAQAAAQEA/wD/ AAAA/wAAAAAAAAEAAP//AAAAAAAAAAEAAAEBAQAAAQAAAP//AP8A/wAAAAAAAAAAAAD//wAEBAQA CwwMAAr//wD9/Q0A+Pj5APr7+wAKCgwABQUFAAABAAABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAA AAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wABAgAAAAAAAAD/AAD///8AAQABAAAAAAAAAAAA ////AAEBAQACAgIABAQAAP///wD9/f0A+/v7AAYGBgAAAAAAAAAAAP7+/gD9/f4AAAEAAAEAAQAA AAAAAAAAAP///wABAQEAAQEBAAAAAAAAAP8AAP8AAPv7+wDu7u8A+fr8AAsMDwALDAsADw8RABIS EwAREhEAExMRABAPDgAPDw4ACwkHAAcHBQAEBQEABAIDAP///wAAAAAA////AAAAAAAAAAAAAAAB AAAA/wAAAAAAAAAAAAEBAAAAAAAAAAABAAAAAQAAAQAAAQABAAAAAAAAAAAAAQEBAAAAAAAAAAAA AQEBAP///wAAAAAAAAD+AAAAAQAAAAAAAQEBAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAD///8AAQEBAAAA AAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///wAAAAAAAQEBAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAAAAAAAAAAAAAAAAAQEBAP///wABAQEA ////AAAAAAAAAAAAAAAAAAAAAAD///8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA AAAAAAAA/gD//wEA/wACAAAA/wADAwEACAgIAAUFBwD5+fcA/v36AAUGCAACBQcAAAD6AAX96gD1 7ccA9+m6AAL74gAB/v4A/gAEAP8A/AABAf0AAP4BAP4BCAACAAAAAgLyAP/+/wD6AB4AERY/AAYR KgD9AwsAAv/5AP355QD06MQAAfHOAAf+7QD6AxEABxQ4AA4aRAAAAxoAAf8CAAEA+wAAAQIA/v8E AAEBAAAAAP4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAA/gABAAAAAAD/AAAA/wAA AP8AAAEAAAAAAAAA//8ACgkLADgzQAD9/zIADwoaAAgAHQABAP8A/APsAAH/BQAC/wMA/wAEAAD+ AAAAAf8A/wH7AAAAAgAB/wEAAP8BAAABAAAAAAAA/gH+AAH//gAEAP8AAf4CAP0D/AAB/gsAAv3/ AAMD9gD/Af4A+wAOAAH+AwAC/90A/v3PAPf98AD8/SQA+wQsAPwACwAD//sAAP76AAEB/gD///8A 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 AAAAAP8AAAAAAAEAAAAAAAH/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABAAABAAAA/wAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAA AAEBAAABAAIA/wAAAP///wABAQEAAAAAAAAAAAABAQEAAgICAAQEBAAAAAAA/f39APv7+wAEBAQA AAD/AP39/QD+/v4AAQACAAABAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAP/9APr6+wDy 9PUAFBUWAA0NDQAVFBQAFhUTABITEwAPDwwADQ0KAAYFBQAGBgYAAwMCAAIBAQABAv8AAv8BAP4B AAD///8AAAEBAAAAAAABAAAAAAAAAP//AAAAAAAAAQEAAAAAAAAAAAAAAQEBAP8AAAD/AAAAAQAA AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAP//AAAAAP8AAgIBAP//AQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wABAQEAAAAAAAAAAAAAAAAA////AP///wAB AQEAAQEBAAAAAAD///8A////AAAAAAABAQEA////AAAAAAD///8AAAAAAP///wABAQEAAAAAAAAA AAAAAAAA////AAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQABAQEA//// AAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAQEBAAAAAAD///8AAAD/AAEBAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAQEAAP8BAP///gABAP8AAQIDAAECAgADAwEA Af4CAP8DBAD+AQIAAP/7APz13gDz6MMAAPbaAAP++AD//wYA/gEDAAEB/AAAAPoA/gAHAAD+BgAB AfgA/QL7APsDFQAGEjwAChQ7AP0DDwAAAP0AAPzvAPHnxgD268QACP3mAP4CBwAADCoAEiBEAPsD HwADAAQAAwL/AAD//gAAAAMAAQABAAAA/gABAP0AAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAABAAAAAAAAAAAAP8AAAAC/wAAAf8AAQACAAABAAD/AAAAAwEHABMMHgAAAfoAAf8GAAH+AAD/ Af0AAgD/AAAAAgAA/wIAAP8BAAAA/wAAAv4AAAAAAP8A/wAA/wEAAQABAP///gD/AAAAAQAAAAAB /wD//wAAAQAAAAH//gAC//8AAQAAAP7//gAAAgAA/v8CAAMA/QD+/v4A+/8YAPX9EwD/AiUA/AAa AAIA/AABAPkA/P4JAAAC/gABAAMA////AAAA/wD/AP4A/gEDAPwCBQD+AQcAAQD/AAb//gAC/v0A AAD9AP4AAQAAAAAAAAABAP4AAAD+/wAAAAAAAP/+AAD+Af4A/f4BAAD+AAAAAAAA///9AAD+/wD+ /gAA/gABAP//AQD///8A/QD/AAP//wAAAAAAAAAAAAD//wAA/wIAAf8CAP//AAD/AAAA/gD/AP8A /wD+/wAAAAAAAAD/AQD+AP8A/v8AAP8AAQABAPwAAf8CAAwRHQApMT4A4uHeAMnEtwAPFBgAEx4q AP8AAgD+//0A/gD9AP4AAgAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAACAAQAAAD+AQAA/w0NABkz NgAaKi4AAwMCAP8JCgD8BgoA/wICAAMA/wAAAQAAAv//AAL//wACAP8AAQD/AAEAAAD+AAAAAAAA AAAAAAAAAf8AAQAAAAAAAAABAAAAAP8AAAAAAQAAAQAAAQAAAP8A/wAAAAAAAAAAAAEAAAAAAAAA /wAAAAABAAAAAAAAAAAAAAEA/wD/AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA AAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEAAwMEAP3+AAABAwIAAwIFAPz+ /gD9/v4AAAMDAAH+/wALBQYAAgkIAP4AAAD4/f0AAAEBAAUDAgD//gAA/wABAAAAAAAHAgMAAgYB AP7//gD/Af8A/v8AAPz+/QATDAwAGAcCAAkIAwD38/QA+AEAAAECBQD4AQAA8/v7ABACBAAPBgMA //v7APz8/wADBAQAAwEDAAUDBQAB/v4A/f4AAP3/AAAAAwMA/v4AAP4A/wD/AAAA//4AAAEA/gAA AP8AAAH/AAH/AgADAQIAAgH/AAAA/wD/AQEA/P7+APz++wADAAEAAgEAAP7+AAD+AAAAAAECAAEA AAAAAP8AAP8CAAIAAAAEAP8AAQAAAP8CAgAA/wAA/wH/AAAAAQACAgIAAwECAAEBAgAAAP8A/f4A AP3+/AAAAPsACAcIAP7+/gD9/PwAAwYEAAECAgAAAQAAAAAAAAEB/wD+/gAAAAAAAAYDAwADAgEA AP//AAAAAQAAAAEA/wAAAAEAAAACAgMAAQAAAAAAAAD8//4AAwABAAAAAAAAAQEAAAAAAAAB/wAA AAAA/f4BAPz+/wD9/wAABwQCAAMBAQABAQAAAAAAAAH//wABAQIA/wD/AP4CAwD//v4AAgEBAAMC AwAC/gAA/v//AAICAQAEBQUAAAAAAP//AQAA/f4A/wL/AAEBAwD+/v0AAQAEAP4A/gD8/f0A//// AP3//gD5+/0A/P77AAcJCwALDQoABQb/APsCAwDS4OgA1+byAPoBBwAAAP4AAP/9APcBCADV7gEA 4/DwAAYC/gAB/vsA+wADANLl8wDf7vkA/P8GAAEA/AAbCvsAMSAVAPL6/wCjxeAA6ggAAPL6/wD8 AAMAAf/8AP//AgAGBQcACQUBAAQD/wD6AQUAAQACAAEAAAAAAP8AAgEAAAEB/wACBgYADhISAA0Q EQADAwQAAQABAAAAAAAAAAAAAAABAAAAAAAAAQAA////AAD//wABAAAAAAABAAAAAAAAAAAAAAAA AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA/wEAAP///wAAAAAAAQEBAAAAAAAAAP8A /wAAAAABAQD/AQIAAQYGAAMFBQAB/PkA//wBAAH/AgAAAP8A/gEAAP0DBgD8/QQACQkIAAECAQAA /wIAAAACAAAAAgAA/gIAAAADAAAAAQD/AQAA/gD/AP0A/wAD//8A/wEAAP8AAAD///8A////AAAA AAAAAAAA/wAAAAABAAAA/wAAAAAAAP/+/QD///8AAAAAAAABAAABAAEAAAECAAIAAAD/AP4AAAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAEAAQAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP// AAABAQAAAAAAAAEBAQD/AP8AAAAAAAICAgD///8A////AAAAAAAAAAAAAQEBAAMDAgAAAAQAAAAA AP39/QACAgEAAQEBAPz8/gD9/f8AAAAAAAEBAQABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A ////APz+/gAJCQkAJiYlABMSEQAUExIADg4NAAsLCQAIBwUABQUDAAICAwADAgEAAQAAAAEB/wD/ AAAA/wEAAAD/AAABAQEAAQAAAAAAAAD///8AAAAAAAEBAQAAAAAAAAAAAAAAAAACAAAA/wAAAAEB AAAAAAEAAP//AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA//8AAAEBAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ////AAEBAQAAAAAAAAAAAAAAAAABAQEA////AAAAAAD///8A////AAAAAAABAQEAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// /wAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAIAAAD/AAAAAAEBAAEAAQABAAEAAAAA AAAAAAABAgIAAgIFAP3/AwD///8A/fr3AOvp3wDy7+cADP/+AAEAAAAAAf8AAf/8AP8BAAD/AAQA AgABAAIA+gAAAP4A+v4TAAQQOQAUIk0A/wYfAAEAAAAD/+wA9O3MAPTowAAD+9sA/wMBAPcEJQAQ GUcAAworAP0ABQAAAAAA/wD9AAIBAwD//wEA/wD/AAAA/wABAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAABAAAAQAAAAAAAAEAAAD/AQAA/wIAAAABAAAA/wAAAQAAAf8EAAEABgAAAv4A /gP5AP//AAAB/gQAA/4MAP8ABgD/AfsAAAH9AAD/AAD//gEAAAACAAEBAAD/AP8AAAH9AAAAAAAA AAAAAP8BAAAAAQD8AQIAAAH/AAT+AwD8Av0A/gD+AAUABAAD/wEAAQD4AP4B/gD+ARUA/QM9AP0A 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 AAAB/wEAAAABAAABAAAAAAAAAAAAAAEAAAD/AAAAAAD+AP8BAAAAAAAAAQABAAAAAQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAQEBAAAAAAABAQEAAAAAAAAAAAABAQEAAAD/AAAAAAAAAAEAAgICAP///wD///8AAQEBAAAA AAADAwIAAAAEAPv7+wD8/P0AAwMCAPv7+wD+/v4AAQADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA AP7+/gAAAAAAAAD/APz9/QAZGRkADQ0MAA8QDwAMDAoACAgHAAYEAgADAgIAAwICAAEBAQABAAAA AgABAP8B/wAAAQAAAAAAAAEAAQAAAAAA////AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAIAAAAA AP8AAQD/AP4AAgABAAAAAQEBAAAAAAAAAAAAAAEAAAAA/wAA/wEAAAAAAAAAAAAAAAAAAQEBAAAA AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAA//// AAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A AAAAAAAAAAD///8AAAAAAAEBAQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAA AAAA////AAICAgD///8AAAAAAAAAAACM6K1tAAAgAElEQVQAAAAAAAAAAAEBAQD///8AAAAAAAAA AAAAAAAAAAAAAAAAAAABAQEA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A 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 AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEA////AAEBAQD+/v4AAAAAAAAAAAABAQEAAAAAAAAA AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAEBAQAAAAAAAAAAAAAAAAABAQEA//// AAAAAAABAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAABAQEAAAAAAAAAAAABAQEA AAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAP8AAAD/AAAAAgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA/gD//wAAAAABAAAB/wAAAQAAAAAAAAAA/gAAAAAAAAACAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB AAAAAAD/AAAAAQAAAP8AAQD9AAAAAAAAAAIAAAAAAAEA/wAB/wAAAAEBAAEA/QADAP8AAAENAAgM PAAaKCIA7eTAAPPjxAAK/NAABwTpAP4B/QD8/wYAAAAAAPwBAQD6ARgADxlHAAUROwD8AA8AAv72 AP777QD06dEA/evFAAb/7QD8AQ0AAgstABEdQgAFCSEAAAEGAAAA+QACAQAAAAAEAAAAAgABAP8A AAD/AAEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAA/AAAAf8AAAL1AAAB /AAAAgwAAAEAAAAC8gAAAAEAAAD+AAAAAAAAAvYAAAAAAAAA/gAAAAEAAAH2AAAABAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEBAgAAAAAA/wD/AP8AAAABAQIA/QAAAAIB/wABAAAA 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 AwP+AAMD/QAFBfUAAgIEAAICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECAAAAAAABAAAAAAD+AAAAAAAAAQIAAQH9 AP8BAQAAAAEAAAD/AAIAAwAAAAAAAAAAAAAAAQAAAAAAAQECAAAAAAABAAIAAAD/AAAA/wAAAAAA AQEAAP/+AAAA/wAAAQEAAP///wAAAAAAAAAAAAD/AQABAQEAAwL/AAAAAgD/AwAAAgQHAAYHCwDu 8eIA3N/hAPr6+wD8/f4A/Pv9AAICAwAODQ4AFhgXAAwNDQAOERIAERATABcXFwATExIABwgGAAME AQACAgIAAgECAAAAAAABAQEAAAAAAAEBAQAAAAAAAQEBAAAAAAAAAP8AAAAAAAAAAAAAAAAAAQEB AAAAAAAAAAAAAAAAAAEBAQD+/v4AAAAAAAEBAQAAAAAAAQEBAP///wABAQEAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAAEBAQD///8AAAAAAP///wABAQEAAAAAAAAAAAAA AAAAAAAAAAAAAAD///8AAAAAAAAAAAABAQEA////AAAAAAAAAAAAAQEBAAAAAAAAAAAA////AAAA AAAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP///wAAAAAAAQEBAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAA AQECAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAgABAQAAAAABAAD//wAB/wEAAP8AAAABAgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AgAAAQAAAQAAAP/9AQAA//8AAAAAAAADAQD//gAAAAEAAAABAQAAAP8AAAAAAP0AAAACAQEAAQAB AAABAAABAQAA/QEAAAIAAQAAAP8AAQEAAP//AQD/AQAAAAD/AAEBAQABAQEAAAAAAAEB/wAAAAAA AAAAAAAAAAACAAEAAAAAAAAAAAAAAQEAAQEBAP8BAgAA/gQAAP/+AP8BCQD/AgcA/v4LAAH9CQAD /AUABPwDAPv8BwD+/QMA/v8FAP7+CgD+AAMA/QILAAP/AQD///8AAAABAP//AAD/AAAAAAAAAP7/ /wAAAAAA/wAAAAD/AAD/AP8AAAABAAAAAAD/AAAA////AAAA/wD+/wEAAP//AAD//wD/AAIA/wAC AAUKHgA/SWQA/vz5AA0OGAD+/AgAAgABAP8BBQAA/gAAAQADAP8A/QAAAAAAAAAAAAAAAAAB/wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAQAAAAEAAAAAAAAA/gD/ AAEA//8CAAEA/gAAAP0AAAAAAAD/BQAAAAEA////AP7+CwD+/v8AAf/9AP8BAgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAP8AAAAAAAAB/wAA/wEAAP8AAAAAAAAA/v8AAP8AAAD+AQAAAgAAAP3/AAD+/gMA//wLAAMA DwAFAPkAAwAKAPr9/wDy/gAA4uz3AAkFBgAY/wwA+vj9APz8CAABAQQABgQKAAcCBgAAA/8A/Pr8 AAsCCAAODAcABwMEAPz7+gAKBgwAAwQDAPb3+QD9+PgACw4NAAT9AAAFBAIABPsCAAwA/wD8+f4A AgMBAP8A/wD//fsA/Pz5AP8AAAAEAwgABgQEAAABAQD7/f0AAwAAAPn9+wD9AQAA/wEBAPz8/gD6 +/4A+Pn8AP37/wAFAQMAAgYFAAQGBQADAQAA/QD/AAAB/wD4/PwAAf4HAAH6/gAIBAUAAwD/AP/9 /AD7/QAAA/8BAAAA/wD//vsA/AD/APz9AAAA/P8AAwIDAP3//AD/AgEA/v79AAUAAAADAwIA///+ AP79/wABAAEAA/8HAAL9AgD7+/oA/gH9AAMCAgD8+wQA/wACAPz+BAD9/QEA/v0BAAD//wD9/gEA //8CAAMCBgD/AQcAAQMFAAH+AgAA/wEA/wD/AP8BAAABAP8A//4CAP4CAwAAAAEAAv8BAAIB/wAA AQEA/wEBAP/+/wAA/P0AAP8AAAQCAAAHBQIABP8EAAEBAQAABP0AAQAFAPz7/QD7+/0AAQIBAAUE AwD7/f4A/vr7AAIAAgAGBgQAA/8CAP///gAB//4ABgEAAAMAAQD+/f8A+fz8AP4ABwAHBQMA/f0A AP8AAQD9/gAAAf/+AAMAAAACAQIA//z3AP/8DAAA/AYA1dzxAOTp/QD+/AgAAAEHAAH+/QAmGR4A KxweAAf+AQAE/AYAAv0FAPv8AwDj5fEA4uf8APn8DgABAAIAEwj8ACYXHQAJAAgA+fwIAP8FCgAC /gMABAACAAP//AAEAAEA+/4BAP79BAD9AAUAAAIIAAIBAgAB/vwA///+AAEBAQACAgIAAgMDAP7+ BAD//g0A/v8FAAEAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAP8AAAD//wAAAgEAABAPCwAIB/kA+vr6 AP3+/QABAAEABQUEAAcHBwAEAwYAAQEAAAgHCwAGBf8A/v7/AAAAAAACAgEAAgIBAAAAAAABAAAA BAUAAA0EDwD+//8A//7/AAEBAgACAQAAAQEAAAEAAAD//wAA/wAAAAEBAAAJCw0AAxgTAAQG7wDu 6uoA+vz9AAIDAgAA/wEA/wIDAAMHCAAOERMADg8NAAMDAgABAQAAAQAAAAkKDQAH/gAAAgAAAAEB AAAAAQAAAAAAAAUEAAAPDg4A/Ar8AP7+/wABAQAAAgICAAMEAwADAgEAAP8AAP8BAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAP8AAAAAAAAAAAAA/wAAAAAAAAD///8AAP/7AAAB+gABAQAAAAAAAAD/AAAAAAEAAAD/AAAA AAACAP4A/gECAAEBAQAAAQAAAAH/AAAA/wABAQAAAAAAAAAB/wAA/wAAAP//AAD//wAA/gAA//8A AAEBAAD+/v4AAAAAAAAAAAADAQIAAAMCAP8FBQAHCQkA/f//AAEDBQAHCAwADxEVAAD//QAFBAQA CwwKABAQDgAQEBAABAYFAAEAAwAAAP8AAAH+AAIBAQAAAAAAAQAAAAABAAAAAAAAAAD+AAAAAAAA AAAAAQEBAAAAAAAAAP8AAQEBAP///wAA/wAAAAAAAAAAAAAAAf8AAP8AAAAAAAD/AAAAAAAAAAEA AAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAP8AAAAAAAAAAQEAAAAA AAAAAAAAAP8AAAAAAP8A/wABAAAAAAAAAAAAAAD/AP8AAAD/AP8AAQAAAf8AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAA/wAAAAAA/wABAAEA/wD/AAAAAQAB AP8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAB/wAAAAEAAAAAAAAB /wAA/wAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAAAAD/AAAAAgAAAP8AAAH/AAAAAAAAAAAAAAAA AAAAAAAA/wAA//8AAAAA/gAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP0AAAABAAD/AQAAAQAAAAD/AAAAAAAAAAAAAQEAAP8A/gAAAf8AAAIEAP0BCgAABgsA FCFAABMXGwD06SwA9vTqABIWLQABCiUA+wANAAEB/QAB/OcA8urGAPrw0AAIA+8A/wEKAAAMKQAJ GD4AAwsjAP8CBAACAPwAAQD/AAACAAAA//8AAAH/AAAAAAAAAf8AAAD/AAAAAAAAAAAAAAD/AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA AAEAAAAA/wAAAP8AAAAAAAAAAAAAAAAABAAAAQAAAAAAAP8CAAABAQAAAAIAAAABAAAAAQAAAAAA AAABAAAAAAAA/wEAAAABAAD/AgAAAQAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAD/AP//AAABAQIA////AAAAAQAAAAEAAQAAAP79/wABAgEA//8AAAEAAAABAAAAAAECAAEB AAD+AAEAAgAAAAEAAQD//wAAAAD/AP0AAAAB/wAAAgIBAAAA/wD//gAAAgEBAP8AAQAA/wAAAAEA AP//AQD/AQAAAAEAAAAAAAD/AAEAAQAAAAD//wAB/wAAAAD/AP4C/wD+/gEA/wACAP4AAAD+/v4A /v8DAPr+BwD5/gkABf8JAPz/BAD+/wAA/gD/AP3/AgD+AAMA////AP3/AAD//wEAAQACAP///wD/ AAAAAAAAAAD/AAD/AAEA/wAAAAAAAAD/AAAAAAD/AAD/AQD/AP4A//8BAAD/AQAB/wAA//8BAP8B AAD/AAAAAP//AP//AgANFB4A//8AAP8A/wAB//8AAAAAAP4AAwAAAQAAAP//AAEAAgAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA AAABAAAAAQAB/wEAAQECAAEAAAAAAP4A//8BAAABAgD/AAAAAAACAAEAAAABAAEAAQABAP8AAQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAABAQAAAP8AAAAAAAABAAAAAAEAAAD/AAEAAAD/ AAIA+/4BAPj3+gAEAgMA/v8BAPf/AQDp+fsA7Pb5ACoYFQANAwUABQICAAUHBwD9AQIA+Pj4AAQB AQAHBAYAAQECAAIDAAAHAwIA+Pv8APv8/gAGBAIAAv8BAAYGBgARBQYADAYFAAD9/QD+/v8A+/7/ AP8BAQD+/gAA/wECAP8B/wAHBQgA/wMDAPv9/AAEAQQABAADAP37/AAC/wAAAwQDAP3+/gAAAQAA +v79APf3+AD9/gEABAEFAA4LCgALBwUAAwAAAP7//wD4/PoAAQAAAP8AAwD5+/wA/wICAAYBAgAH AQMAAf7/AAH/AQD9/f0A/v8AAAIB/wD9AAEA/QAAAPz+/gAA/f4AAgIDAAABAgD8/f8AA/8DAAIC AAABAAEA/v//AP8BAQADAAEABAIDAAYGCQD9AAIA/P/6AP4A/gAA/wIABAMGAP8CAwD6+fwA/f79 APv6/AADAgQAAwQEAAD/AAD+BAAAAAAAAAD/AQAAAAEAAAEBAAAAAQAAAAAA/wAAAP8AAgABAAEA AP8BAAIBAQD///4AAAABAP//AQAA/wAAAP//AAYDBAAFAf8AAgACAAEAAQACAQAA/v4BAAAABAD/ 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD///8AAAAAAP8AAAAAAgEAAAAAAAEAAAD/AAEA AQAAAP8B/wAAAAAAAAEAAAACAAAAAAEAAAAAAAAAAAD+AQAAAAD/AAEAAAAAAQAAAQABAP8C/wD/ AQIA/wD/AAAAAAD+AAEAAQD/AP8AAAABAQEAAAEAAP8A/wAAAAEAAQAAAP4BAQACAQEAAP8AAP8A AAD/AAAA/wAAAP0C/gAA//0A/gH7AAABBQD7AvkA+AULAPYPIgAFDx4A/wUAAAEB+AAB//wA/QP6 AP3+/AD/AfQA/wD4AP8BAAD//wAAAAAAAAAAAAD/AAAAAAAAAP8BAQAAAP8A///+AAAAAQD//wAA AAACAP8B/gAAAAAA/gH/AAH/AQD//wAA/gAAAP8AAAAAAQAA//4AAP8BAgD/AAEA///+AAH//QAA AAEAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAP8AAf8AAAABAQAAAP8AAAD/AAD/AQABAQEAAAD/AAAA/QAAAAIA/wAE AAEA/wAC/vQAAQIKAAEC/wAB//sAAQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAEBAAAAAAEAAQAB AAAA/wABAf8AAAACAAIBAAAC//4AAgIAAAAB9gD6/O0A/QEQAAEFBQDz+vIA7/n7AOz3+QAGBPgA EgkOAAgA8QD+AP4AAgUGAP7+/gAEBPsABgUGAPv/+AAB/vsABAIDAP7/AAD8/vwAAAUCAPv//wD0 +/8A+v7/AAoGBQABAQMAAwUAAPDz9QD9AgIAAwIDAAUFAgD//wIA/v8AAAX/AQAEA/8A/v77APv9 9gD+/gIA/f37AAgHBQAEAwQABgMAAPv//wD7/vwADAcBAAMCBgACAQQAAf79AAIA+gD8/PwA9/z9 APr++wAAAQIABAIDAAQE/QD2/fgA/wQFAAYAAgAFAgAABQAAAPz+/AAAAP8AAQIAAAL//QAD/gAA +//6AAUGAgACBfoAAP79AAL9/wAFAQMAAv7+AAEB/wABAv4AAf7/AAICAgABAv4ABQL9APwC+gD/ /PcAAQD+AAIE/AABAfoA/P8AAAAC+gAHBQAA/Pz6AP39AAD9/fYACAYIAAME/QADAwQAAwIDAAEB AgD/AAAA//8AAAAB/wABAQEAAAAAAAIBAwABAwIAAAH/AAAA/wABAQEAAQAAAP8D/QABAAAAAgQE AAMDAQADAQEAAAEAAAMAAAD9AAEAAgICAAkF/wAAAP8A/v//AAAC/wAJDAQAAgABAAAA+QD+/v4A AP7+AAD9/QD+AQIA/f7/APwA/gD9AfoAAgIBAAIAAgADAAIAAP79AAAA/gAAAwMA/AECAP///QAA /+8A/QIHAOHw7QDR4uIA7fz7AP4EAAAAAPMAEQfzADkyGwAJB/0AAPv6AAEF+gD5BP4A4vT4ANrv 8AD0//wAAAP+AAYD8wAtHRAAGQ30AAIFCQD9A/gAAAIAAP8B+wD+Af0AAP/+AP8AAwD+Af8A/QD7 AAL//QACAAAAAwIBAAABAAABAQAAAgABAAIAAAD//f0A/wIFAAEC8wACAQoAAAACAAEBAAAAAP4A AAAAAAAAAQAAAAEAAAD/AAAB/wAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAQEAAAAA/wAAAP8AAAAAAP8A AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAD//wEABgMAABcZCAAFBQkA+/f4AAMFAwAKDQcACg0C AAQD+gABAQAAAQH/AAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAABAQAA/wAAAAEAAAAAAAAA AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAABAAAAAP4AAAAB AAEBAQABAf0AAAABAAD/AgAAAP8AAAABAAEBAAAAAAEA//8BAP8AAAABAAAAAAAAAAAAAQABAAIA AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAQEAAP7//wAAAf8AAQEAAP7+/gAAAAAAAAAAAAEBAQAB AQEAAgIDAAQEBAAJCAAA/wEBAAICAgACAgIAAgICAAIBAgAAAf8AAgEAAAEBAAABAAQAAAH/AP// AwAAAAAAAAD/AAABAAD//wAAAQAAAAD/AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAD/ AAAAAAAAAAEAAAD/AAAAAQAAAP8A//8AAAAAAQAAAAAAAAD/AAAAAQAAAAAAAAD/AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAAAP8AAAAAAAAAAAAAAAAAAQECAP//AAAA AAAA////AAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAABAQEA////AAAAAAAAAAAAAQEC AP///gAAAAAA//8AAAAA/wAAAAEAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AQEAAAAAAQD//wAA////AAAAAQABAAEA/wAAAAAAAAD//wEAAAABAAABAAAAAQEAAP//AAAAAgAA AAAAAAADAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD/AAAAAAAAAAD//wAA AAAAAAD/AAAAAQAAAP8AAP8CAAEA/wABAf0AAAEBAP4A/QAAAP8A/QEEAP8CDQAAAQ0AAAH7AAEA AgACAAAA/vj0AOzj1QD78uQACAL6AP7/EgAGEjgAChM4AP8DFgAB/wEAAQD8AAAABAD//wUAAAIA AAAA+QAA/wUAAAADAAAA/gABAP4A/wAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAA AAAEAAD/AAAAAAAAAf8AAAAAAAAA/wAAAf4AAAD+AAAAAAAAAP8AAAAAAAAA/wAAAf8AAP/9AAAA AQAAAP8AAAD9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAAAAAAB AP8AAAABAQAAAP8BAAAA/wAAAAAA/wAAAAD/AQAAAP8A/wEAAAEAAAAAAAAA/v8AAAEB/wAB/wAA AAEBAAH/AQD/AP4AAP8AAAABAQAAAf8A////AAEBAAD/AAAAAf//AAAA/wAAAAAA/wEBAAD/AQD9 /wAAAAABAAAAAAAAAAAAAAEAAP0A/wABAQEA/wD9AAH//wD9/wMAAhQpAAwPHgD+BQgA/AMKAAL/ 9wAAAP8A+/8CAP8BAQAC//gA/wD+AAAAAAD/AAEAAAEAAAD//wD/AAAAAAEAAP//AAAAAP8AAAAA AAAAAAAAAAAA/wD9AP//AAD/AP8A//8AAAAAAAD/AAAA////AP8BAQAA/wAA/wD/AAL//gD/AP8A /gEAAP7/AAAAAP8AAQD/AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEAAAAAAP8AAAD+AAABAAAAAAIAAAAAAAAA /wAAAP8AAQD+AAEA/wAAAf4AAQD/AAEA/gABAP4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAAD/ AAABAf8A/wABAAAAAAAA//8AAAH+AAEAAQAAAP8A////AAEA/QAFA/8ABgQCAPP5+AD3+/wA/gAB ABMHAwAPDRAADAT/AP8B/QAAAwMA9vb2AAEAAAAMCAcA/wH+AP37/AD+AgAA+/79AAEBAAACBAEA +vz8APv/AAD2/gEA9ff3AAEB/gAQBAcA/QH+APX+/AD/BAgA+/n3AAwBCAABAgAA/v39APz8/wAJ BwUAAf3+AAEDBAD6/v0A/gIBAAL//gADAP8ABAEAAAIBAQAGAQMAAQEAAAAAAAD9/PsA/f38AAME AQABBAEA+f4AAAICAQD///4AAP4AAAgEAQD8/P4A9vj3APv+/gAPCAkABQICAAcEAAD+AAAA/gEA AAD8AAAD/v8ACwYGAAEB/gD+//0ABgIBAP7/AQAFAQEAAQEBAP3+/gD+//8A/wD+AP//AAACAgEA BAQAAAX+AQAAAAQAAP/+AAD/AAAAAQAAAwAAAAYDBAADAwAAAf//AAEB/wABAQMACAgGAAUDAQAB AP4AAQECAP8B/QAAAAIAAAAAAP///wD/AP8AAv8AAAQDBAD/AAAA////AAIBAAABAAAAAQEAAAAB /wD+AP4A+/4AAAIBAwADAwIAAQABAP8B/wD/AQAA/vv6AAEAAAD/AP8A//8AAAAAAQD9+vkAAQEA AAABAQD//wAA/f7+AP4A/wD///4A+/7/AP3//wACAgEAAgIAAAD/AAAAAAAABQIAAPz+/gD7/wEA /QAAAP7+/AD+AP0A+v/9AOPi5wDs6+kABwQAAAQF/wAE/vYAPCcTADAiEQAF//oA/gD5AAcB+QAC /fgA7+7rAPPv6gAKAQIAAAIAABkNAQAwHQsAEgX5AAQC/QAA//0ABP/5AAP++gAAAf8AAQAAAAAA BAD8AAAAAQD9AAAA/gAAAQAA/wECAP8CAAABAAIAAQAAAP4BAQD/AAEA/wD8AP/+/QAAAP4AAAH/ AAAAAQAAAP8AAAAAAP8A/wAAAAEAAQAAAAEA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAP0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAQAAAAUGBQAVFxQA/Pz8AAEB AgAEBAQAAQIDAAAB/gAAAAAA/wAAAAH/AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAA AAAAAP4AAAAAAAAAAQAAAP4AAgAAAP8A/wAAAP8AAAH/AAAAAQAAAAAAAQH/AAAAAAAAAAAAAAD/ AAAAAQAAAAAAAAAAAAAAAQAAAAAAAAD/AAABAAAA//8AAAAAAAICAAD///8A/wAAAAMBAAAAAAEA AQAAAAEBAQAAAgEABAACAAAAAgAAAAAAAQEAAAAAAAABAP8AAAH+AAEA/wAAAAAAAAEAAAEBAAD/ /wEAAAAAAAAA/wAAAAAAAAAAAP///wABAgEAAP//AAAAAAAAAAEAAAAAAP8AAAAA/wAAAQEAAP8A AAAAAQAAAP//AAAAAAD/AP8AAAD/AAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAQAAAP8A AP8A/wABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAP8A/wAAAAEAAQAAAAAAAAAAAAAA AAEAAAD//wD/AAAAAAD/AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAEBAAD/AAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA AAAAAAAA/wD9AAABAQAA//8AAAEAAAD//wAAAP8AAAABAAAA/wAAAAAAAAEBAAD//wAAAAAAAAEB AAD//wAAAAAA/wAAAAAA/wAAAAAAAAEAAAAAAAAAAP8AAAAAAAAAAAABAQAAAAD/AAAAAAAAAAAA AQAAAAH/AAAA//8AAQH+AAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAABAAAA/wAAAAAA AP8AAAAA/wAAAAEAAAD9AAAAAAAAAP8AAAACAAAAAgD//wcA/wABAAAA/gACAf4AAgD9AAD/AAAB AP4AAAD+AAABBAAA/gAAAQEDAAIGEQACCBsA+vn9AAYMJgAMGToABQobAP0ABAABAP0AAAAAAAAA AgAAAAAAAAD+AAAA/wAAAP4AAAACAAAA/wD/Af4AAAAAAAD/AgAAAP8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAD+AAAA/gAA AP8AAQAAAAAAAAAEAP8DAAD+AQAA/Q8AAAD8AAD9DAAAAAAAAP8AAAAA/wAA/wkAAAABAAAABAAA /wAAAP8JAAAAAAAAAAIAAP8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP// /wAAAAAAAAEBAAAAAAD/AAAAAAACAAEA/wAAAAAAAAAAAAABAAAAAQEAAAAAAAABAQD/AAAAAAEA AAAA/wAAAAAAAAABAAAAAAAAAgAAAf8AAAABAQD/AQAAAAD/AP8AAAABAQEAAAAAAAAA/wAAAAAA AQEAAP//AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAQD/AAEAAAD/AAD//wD+AQoA/QIQAP8HAAAA AAAAAf3/AAEA/wD/AAAA/QABAAAA/wABAAAA/wABAP8AAAAA/wAAAAAAAP///wAAAAAAAAAAAP// /wAAAAAAAAABAP8AAAD//wAA////AP8BAQD///8AAP8BAP4AAAAA/wAA/wD/AAAAAQD//v8AAP// AP8B/wD/AP8AAAEAAAD/AgAAAAAA///+AAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAgAAAP8AAf/+AAAAAAD/ AQIAAQD/AAD//wAAAQAA//8EAAEB/wD//wIA/v0LAP7+AAAB//wA/gECAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA/wAAAAABAAAAAAAAAP8AAP8AAP//AQABAf8AAf8AAP8AAwAJBBUADgcWAP8B /QAICAIAAwIDAAoEAgALBAEA//z9APL5/gAAAgQA/fz6AAYDAwAA/QQA/v7/AP/8/gD4/PwAAQAA AAgGBAAEAwQAAP36APr9/wDz9/gABAEEAAgCDgADAAMA+fv8AP8ACgD9/AQA9vfzAAUCCwD//v0A AP7+AAMFAgADBwoAAwX/AAEBAQAA//wA+wACAPj6/AD9+gAACwgEAAD+AAAA//8AAgEAAAD/AQD+ /gAA/f3+AAEBAAD7/wEA/Pr6AAL+/gAAAAEAAgABAP4A/gAJAgIAAAIAAPj5+QAC/wYADQgFAAUC AAD///0A//4BAAP//wAF/v4AAgICAP4A/gD7/PsABAECAAD/AQABAAAA+/z7APwAAQD/AAAA/f39 AAIDAQAEBAIABAD9AAgE/QAEAf0A+/z8AP39/QABAQMABQICAAUCAQD8/PwAAf78AAcBAQAFBQYA BQAFAP/8AQD+AAAAAP8DAP8BAAAA/gEAAwMEAAD//wD+AP8AAAABAP4BBAAB/gAAAQEAAAABAAD+ AQAA/v7/AAD8+wAAAP8A+v0BAPsBAQD9AwUABwYFAP0C/QAAAQAA/gD+AP/9AAAAAP8A/v3+AP79 /gD//v4A/gD/AAECAwD/AAEA/f39AAAA/wABAgIA/v8BAP//AAACAgAA//z/AP8AAAD//wAABgYG AP///AD6/P4A/QEBAP8A/AD8/vgA/foKAAcAAQA+JyUALCIDAP0AAwAI/vUATTghABADAQAA/gUA AP4KAAL+DQAC+/daAAlVAAAgAElEQVQADQEKADIbGwAiGggAAf/9ABwRCAAnFxMABf8JAP39DwD9 /xEABP4BAP8BAQAAAQEAAP//AAIAAQAD/v4A/v3/AP3/AAAAAwIA/v8DAAABAwAAAAEA/gAAAAAB AAD/AP8A/f38APz8DAAF/wgAAAAAAAIAAQAAAAAA/wAAAAAAAAAAAAAAAP8AAP8BAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAA/wEAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAP///wABAgAABAcAAAD/AQAAAP8A//8AAAAAAQAAAAAAAAAAAAD/AAD/AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAA//sAAQD7AAAB/gAAAf8AAAAAAAAA AgAAAP8AAAAAAAAA/wAAAAEAAQH/AAAAAAAAAf4AAQEBAAAA/wD///8AAAAAAAEAAAAAAQAAAAAA AP///wABAQAAAQAAAAAAAAACAAEAAAD/AAECAAAAAQAAAQEAAAAAAAAAAAAAAQAAAAAA/wAAAAAA AAAAAAEA/wD/AAAAAAD/AAAAAAAAAQIAAAAAAAAAAAAAAP8A//8AAP8A/wAA/wAAAAAAAAAAAAAA AAEAAAAAAAAAAAD/AP8AAAACAAD//wAAAQAA/wD/AAAAAAAAAAAAAAAAAAABAAAAAAAAAAD/AAAA AAAAAAAA////AAAAAAABAAEA/wD/AAAAAAD/AP8AAAAAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAA AAD//wAAAP8A/wAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAEAAAAA/wAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8A/wAAAAAAAAEAAAAAAAAA AAAA////AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA/wD/AP8AAQEBAP8A/wAAAAAAAAEAAAAA /wAAAAAAAAD/AAECAQAAAAAAAAD/AP8A/wAAAAAAAAD/AAAA/wAAAQAAAQABAAAAAAAAAAAAAP8A AAAAAQAAAP8AAAH/AP///wAAAAEAAAEBAAAB/gAAAP8AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAA AAAAAAAAAAAAAAD/AAAAAAABAAAA/wAAAAEBAAD/AP4AAAD/AAAAAQAAAAEAAAD+AP8AAQAAAAMA AAAAAAAAAwABAAIAAAD8AAEC/QAAAP8AAAABAP8A/wABAQEAAAcNABomQgDuCQgA9erYAAcXJAAE ECkA/gIHAAEA/gACAQAAAQACAP///wABAf8AAQD/AAAAAQAAAQAAAAD+AAAA/gAAAAAA/wAAAAAB /wABAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQD/Af8AAQD+AAAB/QAAAAAAAf8AAAAAAAAEAAABAAAAAAAAAAAAAAABAAAAAQAAAAIA AAABAAAAAAAAAAIAAP8AAAD/AgAAAP8AAAABAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wABAAEAAAAAAAAAAAEAAP//AQAAAAAAAQAAAP// AAAAAAAAAAABAAAAAAAAAQAAAP8BAAAAAgAAAf8A////AAEBAQAC/gEA/wD+AAEAAAAAAAAAAAAC AAEBAAD//wEA/wD/AAEBAQAAAP8A//8BAAD//wAB/wAAAAAAAAEBAQAAAAAAAAD/AP//AgABAQAA /wD/AAAAAQAA/wEA/wACAAAA/wD/AAAAAP8AAAD/AQAAAAAA/wEAAAH/AAAAAAAA/wECAP///wAA AP8AAAABAAAAAQAAAAAA/wAAAAAA/wD+/wAA//8AAP8AAAAAAQAAAAABAAD/AAAA/wAA/gAAAAD/ /wAAAAEAAP8BAP///wD/AP8AAAEAAP8AAgD/AAEAAP4AAAAA/gAAAP8AAAABAAAAAQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA /wAAAP8AAQAAAAAAAQACAAAAAAAAAAIAAAAAAAAA/QAAAAAAAAEBAP4AAQD/AAIA/wACAP8A/wD/ AAIAAP8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAQEAAAAAAAAAAAAA /wEAAAAAAAH/AQAFAAEADgYHAAAA/ADw9/gAAv/8AA4FCAAFAAEA7vn6APj/AQABAgAACAIDAAUG BwD/AgAA+fn4APr/AQD8AAMABQIBAAgDBQAA//8ABgIDAPv9/QAPBQQAEAwKAAgAAQD//wAA/wAD AAMB/gD9/f0ABQEEAAYDBQAEBAUAAf/9AAYCAQAA/wAA+vr8AP7+/QAAAgMAAAAAAPf4+gD+BgUA CAADAAEAAAACAgAA/v8AAAIBAAABAv8AAAABAPj9/gD3/P4A+/8CAAEAAgD/AAEA+v//APr+/QD7 /P0A9vwAAPwBBgD//AEABPr/APwEAAD8AAAA/wEBAAUDAwAGAv8A+/v+APv8/wD8/wIAAf3/AAYD AgD+/f4A/P4BAPwCAwD7/f4AAP4BAAgEBgAA/v4AAf//AAIAAQADAgEAAAUDAAMD/wACAAEAAQIA AP///wAAAf8AAAIBAAcGBgAEAQIAAP8BAP4BAgAAAAAA/v8DAAMBAQD/AP8AAQACAAEBAAD9//4A +/4AAAACAQAEAf8AA/8BAAAAAAD+AQEA/gD+AP4AAgAA/wEA/QEAAP7/AAD8+v4A/AH+AAQFAQAD BAIAAgIEAPz8/AAAAAAAAwECAAMEAAD+//8A/gAAAP4AAAAAAAAABAIEAP/+/gD9AAAA/QD+AP0A AAAFBAQAAP7+AP39/AD///8A+f3+AP38/wD+/wAA/wEAAAABAwD+AAIAAwIEACsmIgAvKSIAAAMC APj6AQAIBf0AFAwGAPb4/QAGBwMA+fsAAPH+CgD5AgsAGxoIAEcXHwD5AAQAA//7ABAH/wADAv0A 5/cBAP/0BADs/QsABP8AAP78AgD/AgMABQMAAA0D/gAGAvsA/wL8AAD/AAABAwIAAgMDAP8BAQAB AQEAAAEBAAIAAAD+Af8AAQABAP4AAQAAAAEAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAD/ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAEAAAAAAAEAAAEAAAAAAAAA/wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAAAAQAAAAMA/wD/AAAA/wAA /wAAAAABAAAAAQD/AAAAAQEAAAAA/wABAAIAAP/+AAAAAQAAAAEAAP//AAAAAAABAAEAAAEAAAAA AAAAAAAAAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAIAAAD+AP8AAAABAAEAAAABAAEAAAAAAAAA/wAA AAAAAAD//wAAAQEBAP7//wAAAAAAAAH/AAD/AAAA/wEAAAAAAP8AAAAA/wAA//8AAAD//wAAAQEA AAAAAAAA/wAAAP8AAAAAAAAAAAABAAAAAP4CAAAAAAAA//8AAAAAAAD//wAAAAAAAAAAAAAAAAD/ AAAAAAAAAAAAAAAAAAAAAP//AAAAAAAA/wAAAAAAAAEBAQD///8AAP//AP8BAQABAAAAAAAAAAAA AAAAAAAAAAEBAAD//wAAAAAAAAAAAAD/AAAAAP8AAAEBAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQEAAQAAAAAAAAD///8AAAABAAABAAAAAAAAAAAAAAD//wAAAAAA AAAAAAAAAAAAAAAA////AAAAAAABAQEAAP//AAAAAAABAQEA/wAAAAAAAAAB/wAA////AAAAAAAB AAAAAAABAAEAAAAAAAAAAAAAAAD+/wAAAAAAAAAAAAEAAAD/AAAAAAAAAAAAAAD/AP4AAAACAAEA AAAAAP8AAAABAP8AAQAAAP4AAP//AP//AAAAAAEAAAEBAP8AAAAAAAIAAP8BAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAAAQABAAD/AAAAAP8AAQAAAAAAAQD/AP8AAAH/ AAAAAQABAAEA////AAAAAQD/AAIA/wEBAP/+BAAAAP8AAgABAAAAAQD/AAAA/wEKAAEHIQAOHRQA ChQ/AAIHCAAABBIA/gEEAAMAAAAB/wIAAQAFAAAAAQAAAAEAAP8CAAAABgD/AAAAAAEAAAD/AwAB AAAAAAAAAAABAAAA/wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD/AQAAAAIA/wEEAAD/AwAA/wAAAAAAAAAAAAAEAAL8AAAC/wAABOsAAAH9 AAAAAwAAAAMAAAPxAAAA/wAA/QsAAAABAAAC9gAAAP8AAP4JAAAAAAAAAvcAAAAEAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAAEBAAAAAAAAAAAA//8CAAAAAAAB AQAAAAABAAAA/wD/AP8AAAEBAAABAAABAAAA/wABAAABAQAA/wAAAAD/AP8BAAAAAQEAAAH+AAEA AAAB/wAAAQEBAP8BAQABAAAAAAAAAP8BAAAAAAAAAAAAAAD/AAAAAQAAAAAAAAAAAQAAAAAAAAD+ AAAAAAD/AAAAAAAAAAAAAAABAAEAAQAAAAAA/gAAAAAAAAACAAD/AQAAAAEAAAH+AP7/AAAAAAAA AQEBAAD//wAAAP8AAAAAAAD/AQD/AAAA/wD/AAD/AAD/AAEA/wAAAAD//wAAAAAA/wAAAP///wAA /wEAAAD+AP8BAQAA/wAA////AAAAAAABAQAA/wAAAAD/AgAA/wAAAAAAAAAA/gAAAP8AAQEAAP8A AAD/AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAf8AAP8AAgAAAf8AAP//AAAAAQAAAAIAAAH/AAD//AAAAQEAAAAEAAAAAQAB/vQA AgQCAAMC/gADAPoAAQADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAH/AP8AAAAAAAAAAAAAAAAAAAAAAAAA AP8BAAEA/wAAAAAAAAAAAAID9QADA+kABwQYAAb++QAGAfcACQgFAAgHBwADAgIACf78APj5+wD6 /v0A//3/AAwDDQD9AQEA8fvyAP8ICAD5/P4A/Pz8ABILDQAGAgEAAwYAAAn+/gD9/v0ABAP3AAMB AQD9/v4ABQQDAA4E/QD3+voACQX/AA0K+gAFAwIAAP78AAAAAQD/AAAA/wT7AP//AAD+AQAABAME AAoC+wAJCAYA/f3tAAgGBQAA/wIAAP//AAIAAAAB//8A/P7+APn6/AD7AwAA/gIAAPz+AAD4+/wA 9/z8APj8+wD6AAEA+v3+AP/7/gAPAgIACwcIAAEDAwD7//8AAQECAAcEAwAA/v4A/Pz6APoB/wD7 BAEA/Pv7AA8FBgAFBQAABfr9APj7/AD8AP8ABwQBAAMEBQADAQEA+//9AP7+/gD8/PsAAwMBAAUG AwAA/v8AAQIBAP3//gAEA/wAAPz9AAMGBgAEAgQA/v8AAP7/AQD8//8ABAMEAAQEAgD/AAAAAQEA AAP/AAAEAgIA+fz9APn9/QABBQQAAgEBAAMBAQD/AAEA/AD9AP4F/wD+AP8AAAAAAAH/AAD9Af4A /QQHAAMDAQAAAQAAAAMAAAQG/wD+/P4AAQEBAP8CAQAAAAAAAQAAAAMBAQD8/f0A/f3+AP4C/wD/ //8A/AEAAP0BAAADBAQA/vr7AP4A/wABAQEA/P//AP4B/AD/AQMAAQQDAAMC/gAFBeoA+v76ANbh 5AAmHBMAFBMOANra1gAsLi0A4u/2AMjKywBEREEA2dneAPDv8QD+/f0A5ufqAPwCBgDr7vEAAv/6 ACQbEwDp8fkA9Pr/AA7f2wDz8/IA/fz7AAcGCQD6/f0ABAH+ACsfFwAjFw0AFw4FAAsEAQD8/PoA /v79AAH//gD/AQEAAAABAAIAAQAAAf8ACwsHAAcJ8AACAQcAAAAAAAEAAAAAAQAAAAAAAAAAAAAA AAAAAQAAAAEAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD/AAAAAAEAAAEAAAD/Af8AAAAAAAD/AAABAQEAAAAAAAAAAAAAAAAAAAD/ AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQABAAAAAAAAAP8AAAEAAAAAAAAAAAAA AQAAAAAAAAABAAEA/wAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf4AAAACAAAA/wAAAf8A/wABAAEBBQAAAQIA /wACAAAAAwABAP8AAAD/AP8BAAAAAAIAAAAAAAAA/gAA/wEAAAEBAAAAAQABAAIAAAAAAAAAAAAA AAAAAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAD/AAAAAAD/AAEAAAACAAAAAAAA/wEAAAAAAP8A AQAAAAAAAAAAAP8AAAAAAP8A//8AAAAAAgAA//8AAAABAAAAAAAAAAAA//8AAAAAAAD//wAAAP8A AAAAAQAA/wAAAAAAAAAAAQAAAQAA///+AAAAAAABAQAAAAAAAP8A/wABAAEAAAAAAAABAQAAAAAA AAAAAAD//wAAAAAAAP//AAABAQD///8AAP8AAAABAQAAAAAAAP//AP8AAAAAAAEAAAAAAAD/AAAA AQEAAAAAAP8AAAAAAP8AAf8AAAEAAQD/AP8AAAABAAAA/wAAAAEAAAABAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAEBAAEAAAD/AAAAAAD/ AAAAAQAAAAAAAAAAAAAAAAAAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAD/AAAAAQABAP8AAAAAAf8A Af8BAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAABAQAA//8AAAAAAAAAAAABAAAAAAAAAP8AAAAB AAIA/wAAAAAAAQAAAAAA/wABAP//AAABAQEAAAAAAAEAAgD/AAAAAAAAAAH/AAABAAEAAAAAAAAA AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA AAAAAAEAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAACAAABAAAAAAAA//8AAAEAAAACAQAA/gAC AAD/BAACBgYABQYTAAEAAAABAAEA////AAAA/wD/AQEAAAABAAAAAQAAAAAAAAABAAAAAAAAAAAA AAD/AAAAAAAAAAEAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAgABAAEAAAAAAAAAAAAEAP//AAAB AAAAAP8AAAD+AP///wAAAP4AAQD+AAAA/wAAAP8AAAD/AAAB/gAA/wAAAAH/AAD/AAAAAP4AAP8A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAP8AAAAAAAAAAAAA ///+AAABAAAAAAEAAAAAAAAA/wAAAAAAAf//AP//AQD/AP8AAQH/AAAAAQD/AAAAAAAAAAEAAQD+ AAAAAP//AISX+BgAACAASURBVAEAAAABAAAAAP/+AAL/AQD/AQEAAQAAAAAAAAAAAAAAAAABAAEA AAD//wAAAAAAAP8A/wAAAAAAAQH+AAEAAQD/AAAAAAAAAAAAAQD/AAAAAf//AAABAQD/AAAAAAAA AP8A/gAAAAAAAP8AAAAAAAAAAP4A//8CAP///wAAAAAAAAAAAP//AAAAAQAAAP//AP7/AAD/AP8A /wABAAD/AAD/AQAA////AAAA/wD//wAAAQAAAAAAAAD///8AAP8AAP8BAAAA/wAA/wD/AAAA/QAB AAAA/wD/AAAAAQABAAAA////AAAAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAQEAAAD+AAAAAAABAQEA//8AAAD/AQAAAAAAAAAAAAAAAAAAAAAAAQH/AAAAAQAAAf4AAAEA AAD//wABAQEAAQAAAAAAAAD//wAAAAAAAAAB/wABAAAA//8AAAAA/wABAQAAAAAAAAAAAAAAAAAA AP//AAAAAAABAQIA////AAAA/wABAQEAAAAAAAD/AAAAAP8AAQEBAP//AAABAAAAAAAAAAAB/wAA AAAAAAABAAAB/wAAAAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA AAABAf8AAAABAAAA/wABAAAAAAAAAAABAAAAAAAAAAAAAP//AAABAQAAAQAAAAAAAAAAAAAAAAAA AAAAAAAAAAEAAAD/AAD/AAAAAP8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8A AAAAAAAAAAAAAAAA//8AAAEAAAAAAP8AAQAAAAAAAQAAAAAAAf8AAP8BAQABAf8AAAD/AAAAAgAA AAAAAQIAAAICAAAAAQAAAAD9AAEBAAD//wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAABAAAAAAD/AAABAAABAAAAAP8BAAABAQABAAEAAAAAAAAB/wAA//8AAgD/AAAB /gD//wAAAQEBAP8AAgAAAAIABAD+AAAA/gAAAAAA/wEAAAD/AQAB/wAA/wEAAP8AAAD/Af8AAQAC AAAAAQAAAAAAAAAAAAAA/wABAAAAAAD/AAABAAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBBAAAAP4AAQD4AAAB AAAAAQMAAAH9AAAAAAAEAP0OAAD4AgAAAiUAAAH/AAD8BgAAAAAAAAIQAAAA/wAA/gMAAAAAAAAC /gAAAAAAAP8CAAAAAAAAAf0AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAEAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAD/AAAAAAEAAAEBAAAAAAAA/wAAAAD/AAABAAAA /wAAAAABAAAAAQEAAQAAAP8AAAD/AAAAAQH/AP8AAQABAf8AAAAAAP8AAAABAQAAAQAAAAAAAQAA /wAAAAEAAAABAAABAAAAAAEAAAAAAAAA/wAAAgD/AP8AAQD+AQAAAAAAAAEBAAAA/wAAAAAAAP8A AAAAAAAAAAAAAAAAAAAAAAAA//8AAAAAAAAA//8AAAEBAP//AAAAAAAAAP8AAAAAAAAAAQAA//8A AP8AAAD///8AAAABAAAAAAD//wAAAAAAAP8AAAD///8A//8AAAAAAAD/AAAAAAAAAP8AAAAA/wAA AAAAAP8AAAABAAAAAAAAAAAAAAAAAQAAAP8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA/wAAAAAAAAAA AAAAAQAA/wAAAAEA/wAAAAEAAQABAP8AAAD9/f0A+/cFAPgDAAAD//4A/wABAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gEAAAL/AAAAAAAAAAAAAPPz+ADY1voA7u4K AP4B/wD/AP8A/v8AAAIA/wD+/fwA/P8BAPH3AQD4/AUAEg8NAAX+/QD/AQEA7fYCAPH5/AAFAxAA Fg4LAOcFAwAA/f0A/Pz+APz//gD9/wUA/gAAAAAAAQAAAP8AAQAAAAYFBAADAAEA/wD/APv+/gD5 +vsA/v8DAAMCAgAJBgcAAQMBAPb6+wD4+/wABgQFAP77+QAGBAQACwcHAAEAAAD///8A/P39AAQD AgD//v8A/AAAAPT7/AD6/v8A8PX3APX6BgACAwoABgUEAAABAAD+AQEADAcFAPwEAgD3BQMA+/z9 APf6+wD/AQEA/fz8AAQCAwAHBQYA+v0GAPj8/wD1+/oA/wD/AOgGBwAE/v4AAAABAP0AAAD/AP8A AP3+AAYCAgD8/v8A+v3+APz//wAGAwMAAwEAAAMBAAD+AP8A/v4AAP3//wABAQEAAQEAAP/+AAD/ //4AAAICAP8BAAABAAEABAIDAAIA/gD+/wAAAgMBAAQDAQADAAEAAgEDAPv/CgD4+vkAAwQDAAQB AgD8+/4A/P//APwA/wD8AP4AAf7/AAT+AQACAAAACgkHAAUDAQADAwIAAP//AP//AAD/AP8A9fj6 APj9/QAAAgIAAf//AAEAAQD/AP8A/wAAAAAAAAD///8A/gIBAP8AAQAEAv8AAv4AAAAAAgAAAAAA BAD+AAMBAQD4/gEA/AEBAAUA/AD78foAJSQXAB8UIQAgGAAAEREEAOsdGQD48xEAHBMJACQZJAD4 9wkAEAgcAB8XIwDy8/wAAf8CAAMDAgAPDQEACwgAAAQAAAAOD/0A/wMHAAcIBgAcMCUA+vr+AAYE CgD9EPwAAh34AA8LBQD69wEA8PQEABIPBgAPDgMABgX9AP79/gD9/wAAAQAAAAMDAQADAwMAAgID APr6AQD/AAAAAQD/AAEAAQD/AAAA/wEAAAAAAAAB/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAEAAAL/AAAA AAAA/wAAAP8BAAAA/wAAAgAAAAAAAAD/AAAA/wEAAAAAAAAAAAAAAAAAAAAAAAAB/wAAAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8BAAAB/wAAAQAAAAAAAAD+AAAAAAEAAAAAAAAB/wAAAQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAEAAAD/AAD/AAAA/wAAAP/+AAD9/P4A///4AAEA+wD/AAMAAf8DAAEA/wAAAf4AAAEA AP4AAAACAAAAAAAAAAEAAAAAAP8AAQACAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA AAAAAAAAAAAAAQAAAP//AP8BAAAAAAAAAP//AAAAAAD//wAAAAH/AAH/AAABAAAAAAAAAAAAAAAA AAAAAAAAAP8AAAD/AP8AAAEBAAAAAAD///8A/wAAAAABAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA /wD//wAAAAAAAAEBAQAAAAAAAP8AAAAA/wABAAAAAAAAAP//AAAAAP8AAQAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA/wAAAAD/AAAAAP8AAQEAAAD/AAAA/wAAAQEBAAEBAAD//wAAAP//AAEAAAAAAAAA AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAD/AAAAAAAA AP8AAAAAAAAAAAAAAAAAAAD/AP8AAAAA//8AAAABAAEBAQAAAAAA////AAEA/wAA/wEAAQEAAAAA AAAAAAEAAAD/AAAAAAAAAP8A/wAAAAEBAAAAAAEAAP8AAAAAAAAAAP8A//8AAAEBAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP//AAAAAP8AAQAAAAAAAAAAAAAAAAAAAAAA/wAAAAAA/wECAAAAAQAAAP8A AQAAAAAAAAD/AQEAAQD+AAABAgAAAAEAAAECAP8A/wAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAA AAAAAP8AAAAAAAAAAQAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAABAAAAAQD/AAEA/wAAAAAA/wAB AQEAAP8BAP//AAD/AP8A/wEBAAAAAAAA//8AAAAAAAAAAQAAAAAAAP8AAAAAAAAAAQAA/wABAAAB AAAAAAEA/wABAAEBAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AQAB AAAAAAAAAAEAAQAAAAAAAP8BAAAAAAABAwfv/xse8wAABvMAAAD/AAD+BQAAAAEAAAH9AAAAAAAA /wIAAAAAAAAB/gAAAQAAAP8CAAAAAAAAAP4AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAEAAAD/AAAAAAEAAAAA AAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQH/AAAAAAAAAAAAAAAAAAAAAAAAAAEA AQAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAf4AAAABAAD/AAAAAAEAAAH/AAD/ AAAAAAAAAAAAAAAAAP8AAAD/AAAAAQAAAAEAAAAAAAAAAAAA/v8AAAICAAAAAAAAAAAA/wD/AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAP8BAAAAAAAAAAAAAAEA AAAAAAAA//8AAAABAAAAAAAAAAAAAAH/AAD/AAAAAAAAAAABAAAAAAABAAEA/wD/AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAQD/AP8AAQD/AAAAAAAAAAEA/wAAAQIA/wD/AAD/AAAD/v0ACwf7AAYD/wABAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAA/wEAAAEAAAAAAAAAAAAAAPz9 /gDx8vwAAwMDAAD//wD/AP8AAAEBAAAAAQD///8A/gIAAP3+/wD//wAABAICAAL/AAD+AQAA+/8A AP3+AAAEAQAABQIBAAIB/wD///8A/AAAAP8AAQD/AAEAAgD/AAAA/wAAAAAA/wACAAIAAAACAP8A AQAAAPwAAAD8AAEAAAD/AAIAAAAEAAAAAQAAAP7//wD+AAAA/wECAP//AAABAQAABAEBAAD/AAAA AQAA////AP8BAAAAAAAAAAAAAP///wD9AAAA/P4AAP7/AQACAQEAAgH/AAL/AAAAAf4ABQABAAMA /wAAAAAA/QABAP0A/wD/AP8AAAAAAAAAAgACAQAAAP8AAP4AAQD9//4AAgABAAIBAAD//v8AAAIB AP8A/gAAAAAAAP8BAAEBAQD//wAA/wD/AP//AQADAAAAAQAAAP8BAAD/AQAAAP8AAP8AAAABAAAA AAAAAAEAAAD+/wEAAAAAAAAB/gAC/wAAAQEBAP8AAAD/AAAAAAEAAAEBAAAC//8AAQAAAP8AAAD+ /wEA/wEAAAD/AgAAAAAAAAAAAP4A/wD/AP4AAAABAAL/AQAC/wAAAwEAAAAB/gABAQEAAAABAP8A AAAAAAAA/P//AP0AAQAAAQAAAP//AAEAAQAAAAAAAAAAAAAA/wAAAP8AAAACAAAAAAABAf4AAP// AAAAAgAAAAAAAQD/AAAAAQD/AAAA/wAAAAEA/gAA/fwACggFAAMDBQAJBf4AAwQBAPX4AgABAf4A BQIAAAICAAD5/AEA/v8CAP0AAgD+/QAAAv/9AAQA/AAHAvsABAL/AP//AQD3/gYA/QADAAAAAAAD A/4A/f8AAP7/AgAAAAAAAwEAAAECAQD6/gQAAgICAAcE/QAKA/oAAgH+AP8AAgAA/wAAAAAAAAAB AAAAAAAAAAAAAAH/AAD/AQAAAQAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAQAAAAD/AAAAAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA AAAAAAH/AAAAAAAA/wEAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAA AAAAAf8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP8AAAABAAAAAP8AAAABAAD/AAAAAAAAAAAA AAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAKHrPgQAAHdBJREFUAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wIA/wH5AAEAAQAA/wcAAAEAABgYAABSUh0AOjsOAAIC /gD/AAEAAP8BAAIBAAAAAP8AAAAAAP0AAAADAgAA//8AAAABAAABAQEAAgIAAAD/AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAAAP8BAAAAAAAAAAAAAAD/AAAAAQAA AAAAAAEAAAAA/wAAAAAAAAAAAAABAAAAAAAAAAD/AAD+AgAAAAAAAAD/AAD///8A//8AAAAAAAAA AAAAAAABAAAAAAAAAAAAAAAAAAAA/wAAAAAA//8AAAEBAAABAAAA//8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAP8AAAAA/wAA/wAAAAEAAAAAAAAAAAAAAP//AAABAQAAAAAAAP8AAAAAAAAAAAAA AAEBAAABAAAA/wAAAAD/AAAAAAAAAAAAAAAAAAD//wAAAQEAAP//AAAAAAAAAAEAAAAAAAAA/wAA AAAAAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEBAAAA AAAAAP8AAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAA//8AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD/AAAAAP8AAAAAAAABAQAA//8AAAAAAAD//wAAAAAAAAAAAAABAAAAAAAA AAABAAAAAAAAAAAAAP8AAAACAAAAAP8AAAAAAAD/AQAA/wAAAAYDAAAKCwIAAAD/AP//AAABAQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQAAAAAAAAAAAAAB/wAA/wAA/wAAAP//AAAAAQAAAAAAAAIAAAAAAAAAAP8AAP8AAAD/ AAAAAAAAAAABAAAAAAAAAAAAAAEAAAABAAAAAQAAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAP//AQABAP8AAgL+AP8AAgDq6gEAS03WAOTiJwABAAD8/wAA/QAAAf4A AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA/wAAAAAAAAABAAAAAAAAAAAAAAD/AAAB/wAAAAAAAP8BAAAAAAAAAAEAAAAAAAEAAAD/ //8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA /wAAAf8AAP8CAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAQAAAP8AAAAA/gAAAAEAAAAB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AP8AAP//AAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAEAAAAAAAAAAAAAAAAAAAAA AAAA/wAAAAABAAAAAAAAAQABAP8A/wAAAAAAAf8AAAAA/gAAAAEAAAABAAABAAD/AAAAAAAAAAAA AAABAAAAAAAAAAAAAAD/AAAAAQABAAAAAAAAAP8AAAD/AAAAAAAAAAEA/wAAAAAAAQAAAAAAAAD/ AAAA/gAAAAEAAAACAAAAAAABAP8AAAAAAP8AAQAAAQAAAP8AAAAA/wAAAAAAAQAAAAAA/wAAAAEA /wABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAP8AAAAA/wAAAAAAAAABAAAAAAAA AAAAAQD+AAEAAAAAAAAAAf8AAP8AAAAAAAAA/wEBAP8AAQAAAP8AAAD/AAABAQAB/wEAAAAAAP8A /wABAAAAAQD/AP4AAQACAAEA/gAAAAEB/gD//wAAAAACAAAAAAAAAP8AAAAAAAEAAQAAAAAAAAAA AP8AAAAAAAAAAQAAAP8A/wAAAAEAAAAAAAEAAAD/AAAAAAAAAAAA/wAAAP8AAQABAP8AAQAAAP8A AAAAAAAAAQAAAP8AAAD/AAEAAAAAAAAAAAACAP8AAAAAAAAAAAD/AAEAAAD/AAEAAAAAAAAAAAAB AAAAAAAAAAAA/wAAAAAAAAABAAAAAAD/AP8AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAP8AAAABAAEAAAAAAAAAAAD/AAAA/wAAAAIAAAAAAAAAAAAAAAAA/wAAAAAA/wAAAAAAAQD/ AAEA/gAC//8A/wABAP8BAQAC//4AAAAAAP4AAgD/AQEA/wAAAAAAAAABAAAAAAAAAAP//QACAP0A AAAAAAAAAAD9AAQA/wABAAAAAAAAAf4AAAAAAP8AAgAAAAEAAQD/AP8AAAD/AAIAAAABAAAAAAAA AP8AAQAAAAAAAQAAAP4A/wABAAAAAAAAAAAAAP8AAAABAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA AAAAAAAAAP8AAAEAAAD/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAD/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAD/AAABAAAA/wAAAAABAAAAAAAAAP8AAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAABAAAA /wAAAQAAAP8AAAAAAQAAAAAAAAAAAAAA/wAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wEAAAH8AAAAAQAAAAMAAQD/AAQF9wAP EPAACwvxAAEA+wAAAAIAAAACAAEA/wABAP8A/wAAAP8BAQAAAP8AAAAAAAAAAQABAAAAAAAAAP8A /wAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAEA AAD/AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAD/AAAAAAD/AAAA AP8AAAEBAQAAAP8AAAAAAAAAAQAAAAAAAAD/AAAAAAD/AAAAAAABAAEAAAD/AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAP8AAAAAAAAAAQAAAAAAAAD/ AAAAAAAAAAD/AAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAD/AAAAAAAAAQEAAAAAAAD/AAAAAAAAAf8AAP8BAAAAAAAAAAAAAAEA/wABAgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA/wAAAP8AAAAAAAAAAQAAAAEAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAAA AAAAAgAAAAAAAAD/AAAA/wAAAP8AAAH/AAAAAAAA/wIAAAACAAD/AgD+Af8AAAH/AAL//gAAAAAA AAAAAP8AAgD/AAEAAAAAAAIA/wAAAP8AAAD/AAAAAAAAAAAAAQAAAP8AAAAAAAAAAAAAAAAAAgAA AAAAAAAAAAAA/gAA/wEAAQABAP8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAQD9AP8AAQD7/A8A5+cRAPz6FAABAAD+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAD/AAAAAAAAAAEAAAAAAAAA/wAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAEAAAD//wAAAAAAAAABAAAAAAAAAAAAAAD/AAAAAAAAAQAAAP8AAAAAAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AP8AAAABAAAA/wAAAAAAAAABAAEAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA /wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAEAAAD//wAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAA AAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAD/AAAAAAAAAAAAAAABAAAAAAAA /wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA//8AAAEBAAAAAAAAAP8AAAAAAAAAAAAA/wEAAAAAAAAA /wAAAAAAAAABAAAA/wAAAAAAAAABAAAAAAAAAQAAAAAAAAD/AAAAAAAAAAAAAAAA/wAAAQAAAAAB AAAA/wAAAAAAAP8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/wAA AAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD/AAAAAP8AAAAAAAAAAAAA AAEAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAQIAAP/+AAABAAAA/wAAAAABAAAAAAAAAP8AAAAAAAAA AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAEAAAD/AAAAAAAAAAAAAAAB/wAAAAAAAAAA AAD/AQAAAP8AAAAAAAAAAAAAAAEAAAD/AAABAQAA//8AAAABAAAAAAAAAAAAAAD/AAAAAAAAAAEA AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP8AAAAAAAAAAP8AAAABAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAAA /wAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA/wAAAAEAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAEA AAABAAAAAQAAAAAAAAAAAAAA/wAAAP8AAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAA/wAA AQAAAP8AAQAAAQAAAAAAAAD/AAAAAP8AAAAAAAAAAQAAAAAAAAEAAAAA/wAAAAAAAP8AAAABAQAA AAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA/wAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAEAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAABAAAAAAEA AAD/AAABAAAAAP4AAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAABAQAA AAAAAAAAAAAAAAAAAAAAAP//AAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAQEAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAD//wAAAQEAAAAAAAAAAAAA//8AAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB AQAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAAEBAAAAAAAAAQEAAP// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAABAQAA//8AAAAAAAAAAAAA//8AAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAP8AAAABAAABAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAP8B AAD/AACtGoOCeBTrQAAAAABJRU5ErkJggg== --7Y=_hrhjVfy5uZrBTF51S2tvEHqTsVBuIA Content-Type: image/jpeg; name="25391_25391_wpsA(08-29-08-57-21).jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="25391_25391_wpsA(08-29-08-57-21).jpg" Content-ID: Content-Description: Photo /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCABaAe4DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+r34/ D/gsH/wtfxZ/wy2f+CcH/Civ+KfPgT/hff8Aw03/AMLZH/FNaN/wlB8V/wDCvx/wiWf+Et/4SL+w /wCzM/8AFMf2GdTxq39pV5Cf+IgbH3f+CP312/tpZP1//V/M5/ZTBBwWA9cEj9Og/Ol2sf4uQPQ9 Prx/WvVpZ0qGHo0VkvDuIeHSi3UyrnqSsrXnN42nzS7+5T3eiI5H/wA/ZdWtbef8v6v9T8ad3/Bw H/1h7/P9tH/4qjd/wcB/9Ye/z/bR/wDiq/ZXj+6P++x/jRx/dH/fY/xro/1lX/RPcHf+GVf/AD7J 5H/z9n97/wAj8at3/BwH/wBYe/z/AG0f/iqN3/BwH/1h7/P9tH/4qv2V4/uj/vsf40cf3R/32P8A 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 B/hNG8IaVo2p+J/Aa/eNFFflR2BRRRQB/9k= --7Y=_hrhjVfy5uZrBTF51S2tvEHqTsVBuIA-- From vicky@m2510.fivestargroup.cn Mon Aug 29 02:02:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,LOTS_OF_MONEY, MIME_HTML_ONLY,SPOOFED_URL_HOST autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9EAC17CA0 for ; Mon, 29 Aug 2016 02:02:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 367748F8033 for ; Mon, 29 Aug 2016 00:01:58 -0700 (PDT) X-ASG-Debug-ID: 1472454114-0bf81509b02ec830001-NocioJ Received: from mail163-166.dm.aliyun.com (mail163-166.dm.aliyun.com [42.120.163.166]) by cuda.sgi.com with ESMTP id hM3fYBquVeFWuZ3a for ; Mon, 29 Aug 2016 00:01:55 -0700 (PDT) X-Barracuda-Envelope-From: vicky@m2510.fivestargroup.cn X-Barracuda-Effective-Source-IP: mail163-166.dm.aliyun.com[42.120.163.166] X-Barracuda-Apparent-Source-IP: 42.120.163.166 X-EnvId:82911964909 Received: from JIANSHE-PC(219.148.52.6) by smtpdm.aliyun.com(127.0.0.1); Mon, 29 Aug 2016 15:01:53 +0800 From: "vicky@fivestargroup.cn" Subject: =?UTF-8?B?UmXvvJozNTg=?= fence To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?UTF-8?B?UmXvvJozNTg=?= fence MIME-Version: 1.0 Sender: vicky@m2510.fivestargroup.cn Reply-To: vicky@fivestargroup.cn Date: Mon, 29 Aug 2016 15:01:52 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: mail163-166.dm.aliyun.com[42.120.163.166] X-Barracuda-Start-Time: 1472454114 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 19672 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32416 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20160829070158.84490D8007D@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIiB4bWxuczp2ID0gDQoidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiPjxIRUFE Pg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWdiMjMxMiIgaHR0cC1lcXVpdj1D b250ZW50LVR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJNU0hUTUwgMTEuMDAu OTYwMC4xODIzMSI+PC9IRUFEPg0KPEJPRFk+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0i QkFDS0dST1VORDogd2hpdGU7IFRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7 IExJTkUtSEVJR0hUOiAxNS43NXB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFs aWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1GQU1JTFk6ICJUaW1l cyBOZXcgUm9tYW4iLCJzZXJpZiI7IEJBQ0tHUk9VTkQ6IHdoaXRlOyBDT0xPUjogYmxhY2s7IG1z by1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+ DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFDS0dST1VORDogd2hpdGU7IFRFWFQtQUxJ R046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0OyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyAN CnN0eWxlPSYjMzk7Rk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7IEJBQ0tH Uk9VTkQ6IHdoaXRlOyBDT0xPUjogYmxhY2s7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5 Oz5EZWFyIA0KRGlyZWN0b3IgTWFuYWdlciw8L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxl PSYjMzk7Rk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjogYmxhY2s7IG1z by1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBj bGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFDS0dST1VORDogd2hpdGU7IFRFWFQtQUxJR046IGxl ZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0OyBtc28tcGFnaW5h dGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxl PSYjMzk7Rk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjogYmxhY2s7IG1z by1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+ DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFDS0dST1VORDogd2hpdGU7IE1BUkdJTjog MGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ct b3JwaGFuIj48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiVGlt ZXMgTmV3IFJvbWFuIiwic2VyaWYiOyBDT0xPUjogYmxhY2s7IG1zby1iaWRpLWZvbnQtc2l6ZTog MTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5n OiAwcHQmIzM5Oz5OaWNlIA0KRGF5ITwvU1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9JiMz OTtGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiBibGFjazsgbXNvLWJp ZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1z by1mb250LWtlcm5pbmc6IDBwdCYjMzk7PjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNz PU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0ZTsgTUFSR0lOOiAwY20gMGNtIDBw dDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxT UEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMt c2VyaWYiOyBDT0xPUjogYmxhY2s7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpw PiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFD S0dST1VORDogd2hpdGU7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIj48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHls ZT0mIzM5O0ZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOyBCQUNLR1JPVU5E OiB3aGl0ZTsgQ09MT1I6IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+VGhp cyANCmlzIFZpY2t5LCBmcm9tIEFucGluZyBGaXZlIFN0YXIgV2lyZSBNZXNoIENvLixMVEQsIHdo byB2aXNpdCB5b3VyIA0Kd2Vic2l0ZS48L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSYj Mzk7Rk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjogYmxhY2s7IG1zby1i aWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBt c28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFz cz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFDS0dST1VORDogd2hpdGU7IE1BUkdJTjogMGNtIDBjbSAw cHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIj48 U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJv bWFuIiwic2VyaWYiOyBDT0xPUjogYmxhY2s7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBt c28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5 Oz5BbmQgDQprbm93IHlvdSBlbmdhZ2VkIGluIEdhYmlvbiBCb3ggYW5kIFdlbGRlZCBXaXJlIE1l c2guPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiQXJp YWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVw dDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0 JiMzOTs+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9 IkJBQ0tHUk9VTkQ6IHdoaXRlOyBNQVJHSU46IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdIVDogMTUu NzVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PFNQQU4gDQpsYW5nPUVOLVVTIA0K c3R5bGU9JiMzOTtGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiBibGFj azsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFO PjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0ZTsgTUFS R0lOOiAwY20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IG1zby1wYWdpbmF0aW9uOiB3 aWRvdy1vcnBoYW4iPjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1GQU1JTFk6 ICJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7IENPTE9SOiBibGFjazsgbXNvLWJpZGktZm9udC1z aXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDBwdCYjMzk7Pk91ciANCmZhY3RvciBpcyBpbiBBbnBpbmcsIGVuc3VyZSB0aGUgZ29v ZHMgaGlnaCBxdWFsaXR5IGFuZCBkZWxpdmVyeSANCnRpbWUuPC9TUEFOPjxTUEFOIGxhbmc9RU4t VVMgDQpzdHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6 IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+PG86cD48L286cD48L1NQQU4+ PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9VTkQ6IHdoaXRlOyBNQVJH SU46IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdIVDogMTUuNzVwdDsgbXNvLXBhZ2luYXRpb246IHdp ZG93LW9ycGhhbiI+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULUZBTUlMWTog IlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsgQ09MT1I6IGJsYWNrOyBtc28tYmlkaS1mb250LXNp emU6IDEwLjVwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vy bmluZzogMHB0JiMzOTs+UHJvZHVjdCANCmxpbmU6PC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpz dHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6IGJsYWNr OyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWu i+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+PG86cD48L286cD48L1NQQU4+PC9QPg0K PFVMIHR5cGU9ZGlzYz4NCiAgPExJIGNsYXNzPU1zb05vcm1hbCANCiAgc3R5bGU9IlRFWFQtQUxJ R046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW47IG1zby1tYXJnaW4tdG9wLWFsdDogYXV0bzsgbXNvLW1hcmdpbi1ib3R0b20tYWx0OiBhdXRv OyBtc28tbGlzdDogbDAgbGV2ZWwxIGxmbzE7IHRhYi1zdG9wczogbGlzdCAzNi4wcHQiPjxTUEFO IA0KICBsYW5nPUVOLVVTIA0KICBzdHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJv bWFuIiwic2VyaWYiOyBCQUNLR1JPVU5EOiB3aGl0ZTsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41 cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBw dCYjMzk7PkZpZWxkIA0KICBGZW5jZS9DYXR0bGUgRmVuY2U8L1NQQU4+PFNQQU4gbGFuZz1FTi1V UyANCiAgc3R5bGU9JiMzOTtGT05ULVNJWkU6IDEycHQ7IEZPTlQtRkFNSUxZOiAiVGltZXMgTmV3 IFJvbWFuIiwic2VyaWYiOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9u dC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpwPjwvbzpwPjwvU1BBTj4gDQoNCiAgPExJIGNsYXNzPU1z b05vcm1hbCANCiAgc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7 IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW47IG1zby1tYXJnaW4tdG9wLWFsdDogYXV0bzsg bXNvLW1hcmdpbi1ib3R0b20tYWx0OiBhdXRvOyBtc28tbGlzdDogbDAgbGV2ZWwxIGxmbzE7IHRh Yi1zdG9wczogbGlzdCAzNi4wcHQiPjxTUEFOIA0KICBsYW5nPUVOLVVTIA0KICBzdHlsZT0mIzM5 O0ZPTlQtU0laRTogMTJwdDsgRk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYj Mzk7PlRlbXBvcmFyeSANCiAgRmVuY2U8bzpwPjwvbzpwPjwvU1BBTj4gDQogIDxMSSBjbGFzcz1N c29Ob3JtYWwgDQogIHN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0 OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuOyBtc28tbWFyZ2luLXRvcC1hbHQ6IGF1dG87 IG1zby1tYXJnaW4tYm90dG9tLWFsdDogYXV0bzsgbXNvLWxpc3Q6IGwwIGxldmVsMSBsZm8xOyB0 YWItc3RvcHM6IGxpc3QgMzYuMHB0Ij48U1BBTiANCiAgbGFuZz1FTi1VUyANCiAgc3R5bGU9JiMz OTtGT05ULUZBTUlMWTogIlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsgQkFDS0dST1VORDogd2hp dGU7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz4zNTggDQogIEZlbmNlKDc2LjJtbXgx Mi43bW0pPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQogIHN0eWxlPSYjMzk7Rk9OVC1TSVpFOiAx MnB0OyBGT05ULUZBTUlMWTogIlRpbWVzIE5ldyBSb21hbiIsInNlcmlmIjsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+PG86cD48L286 cD48L1NQQU4+PC9MST48L1VMPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9V TkQ6IHdoaXRlOyBNQVJHSU46IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdIVDogMTUuNzVwdDsgbXNv LXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9JiMz OTtGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiBibGFjazsgbXNvLWJp ZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1z by1mb250LWtlcm5pbmc6IDBwdCYjMzk7PjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwvUD4NCjxQ IGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0ZTsgTUFSR0lOOiAwY20g MGNtIDBwdDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW4iPjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1GQU1JTFk6ICJUaW1lcyBO ZXcgUm9tYW4iLCJzZXJpZiI7IENPTE9SOiBibGFjazsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41 cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBw dCYjMzk7PkZvciANCm5vdywgdGhlcmUgYXJlIHNvbWUgbmV3IGluZm9ybWF0aW9uIGFib3V0IHlv dXIgbG9jYWwgbWFya2V0LjwvU1BBTj48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZP TlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6IGJsYWNrOyBtc28tYmlkaS1m b250LXNpemU6IDEwLjVwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZv bnQta2VybmluZzogMHB0JiMzOTs+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNv Tm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9VTkQ6IHdoaXRlOyBNQVJHSU46IDBjbSAwY20gMHB0OyBM SU5FLUhFSUdIVDogMTUuNzVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PEI+PEk+ PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULUZBTUlMWTogIlRpbWVzIE5ldyBS b21hbiIsInNlcmlmIjsgQ09MT1I6IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMz OTs+RmllbGQgDQpGZW5jZTogMi41LzIuMG1tIDEuNXgxMDBtL3JvbGw8U1BBTiBzdHlsZT0ibXNv LXNwYWNlcnVuOiB5ZXMiPiZuYnNwOyA8L1NQQU4+VVNEIA0KNDIuNS9wYyBGT0IgVGlhbmppbiA8 bzpwPjwvbzpwPjwvU1BBTj48L0k+PC9CPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxl PSJCQUNLR1JPVU5EOiB3aGl0ZTsgTUFSR0lOOiAwY20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDE1 Ljc1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxCPjxJPjxTUEFOIA0KbGFuZz1F Ti1VUyANCnN0eWxlPSYjMzk7Rk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7 IENPTE9SOiBibGFjazsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PjM1OEZlbmNlIA0K OiA3Ni4yeDEyLjdtbSAzLjUvNG1tIDIuMngzbS9zaGVldCBVU0QgMzUvc2hlZXQgPG86cD48L286 cD48L1NQQU4+PC9JPjwvQj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iQkFDS0dS T1VORDogd2hpdGU7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0OyBt c28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIj48Qj48ST48U1BBTiANCmxhbmc9RU4tVVMgDQpz dHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOyBDT0xPUjog YmxhY2s7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWls eTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48bzpwPiZuYnNwOzwvbzpwPjwv U1BBTj48L0k+PC9CPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5E OiB3aGl0ZTsgTUFSR0lOOiAwY20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IG1zby1w YWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7 Rk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7IENPTE9SOiBibGFjazsgbXNv LWJpZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PklmIA0KeW91IGludGVyZXN0ZWQgaW4gdGhvc2Ug cHJvZHVjdHMsIGZlZWwgZnJlZSB0byBjb250YWN0IG1lLiBXZSBjYW4gZ2l2ZSB5b3UgdGhlIA0K b2ZmZXIuPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAi QXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEw LjVwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzog MHB0JiMzOTs+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5 bGU9IkJBQ0tHUk9VTkQ6IHdoaXRlOyBNQVJHSU46IDBjbSAwY20gMHB0OyBMSU5FLUhFSUdIVDog MTUuNzVwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiI+PFNQQU4gDQpsYW5nPUVOLVVT IA0Kc3R5bGU9JiMzOTtGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiBi bGFjazsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PjxvOnA+Jm5ic3A7PC9vOnA+PC9T UEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0ZTsg TUFSR0lOOiAwY20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IG1zby1wYWdpbmF0aW9u OiB3aWRvdy1vcnBoYW4iPjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1GQU1J TFk6ICJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7IENPTE9SOiBibGFjazsgbXNvLWJpZGktZm9u dC1zaXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250 LWtlcm5pbmc6IDBwdCYjMzk7PkhvcGUgDQp0byBoZWFyIGZyb20geW91IHNvb24uPC9TUEFOPjxT UEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNl cmlmIjsgQ09MT1I6IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+PG86cD48 L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046 IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0OyBtc28tcGFn aW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0 eWxlPSYjMzk7Rk9OVC1GQU1JTFk6ICJUaW1lcyBOZXcgUm9tYW4iLCJzZXJpZiI7IEJBQ0tHUk9V TkQ6IHdoaXRlOyBDT0xPUjogYmxhY2s7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz48 bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0i VEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdp ZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZP TlQtRkFNSUxZOiAiVGltZXMgTmV3IFJvbWFuIiwic2VyaWYiOyBCQUNLR1JPVU5EOiB3aGl0ZTsg Q09MT1I6IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+QmVzdCANCnJlZ2Fy ZHMsPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1TSVpFOiAxMnB0OyBGT05U LUZBTUlMWTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQ7IG1zby1iaWRpLWZvbnQtZmFt aWx5OiDlrovkvZMiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCAN CnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0ZTsgVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20g MGNtIDBwdDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBo YW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULUZBTUlM WTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiBibGFjazsgbXNvLWJpZGktZm9udC1zaXpl OiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5p bmc6IDBwdCYjMzk7PjxvOnA+Jm5ic3A7PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05v cm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0ZTsgVEVYVC1BTElHTjogbGVmdDsgTUFSR0lO OiAwY20gMGNtIDBwdDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRv dy1vcnBoYW4iIA0KYWxpZ249bGVmdD48Qj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtG T05ULVNJWkU6IDE1cHQ7IEZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQkFDS0dS T1VORDogd2hpdGU7IENPTE9SOiAjMDA5OTMzOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz5NaXNzLlZpY2t5PC9TUEFOPjwvQj48U1BB TiANCmxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNl cmlmIjsgQ09MT1I6IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNvLWZhcmVh c3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+PG86cD48 L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9VTkQ6 IHdoaXRlOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5h dGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxl PSYjMzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsg Q09MT1I6IGJsYWNrOyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1r ZXJuaW5nOiAwcHQ7IG1zby1uby1wcm9vZjogeWVzJiMzOTs+PHY6c2hhcGV0eXBlIA0KaWQ9X3gw MDAwX3Q3NSBzdHJva2VkPSJmIiBmaWxsZWQ9ImYiIHBhdGg9Im1ANEA1bEA0QDExQDlAMTFAOUA1 eGUiIA0KbzpwcmVmZXJyZWxhdGl2ZT0idCIgbzpzcHQ9Ijc1IiBjb29yZHNpemU9IjIxNjAwLDIx NjAwIj48djpzdHJva2UgDQpqb2luc3R5bGU9Im1pdGVyIj48L3Y6c3Ryb2tlPjx2OmZvcm11bGFz Pjx2OmYgDQplcW49ImlmIGxpbmVEcmF3biBwaXhlbExpbmVXaWR0aCAwIj48L3Y6Zj48djpmIGVx bj0ic3VtIEAwIDEgMCI+PC92OmY+PHY6ZiANCmVxbj0ic3VtIDAgMCBAMSI+PC92OmY+PHY6ZiBl cW49InByb2QgQDIgMSAyIj48L3Y6Zj48djpmIA0KZXFuPSJwcm9kIEAzIDIxNjAwIHBpeGVsV2lk dGgiPjwvdjpmPjx2OmYgDQplcW49InByb2QgQDMgMjE2MDAgcGl4ZWxIZWlnaHQiPjwvdjpmPjx2 OmYgZXFuPSJzdW0gQDAgMCAxIj48L3Y6Zj48djpmIA0KZXFuPSJwcm9kIEA2IDEgMiI+PC92OmY+ PHY6ZiBlcW49InByb2QgQDcgMjE2MDAgcGl4ZWxXaWR0aCI+PC92OmY+PHY6ZiANCmVxbj0ic3Vt IEA4IDIxNjAwIDAiPjwvdjpmPjx2OmYgZXFuPSJwcm9kIEA3IDIxNjAwIHBpeGVsSGVpZ2h0Ij48 L3Y6Zj48djpmIA0KZXFuPSJzdW0gQDEwIDIxNjAwIDAiPjwvdjpmPjwvdjpmb3JtdWxhcz48djpw YXRoIG86Y29ubmVjdHR5cGU9InJlY3QiIA0KZ3JhZGllbnRzaGFwZW9rPSJ0IiBvOmV4dHJ1c2lv bm9rPSJmIj48L3Y6cGF0aD48bzpsb2NrIGFzcGVjdHJhdGlvPSJ0IiANCnY6ZXh0PSJlZGl0Ij48 L286bG9jaz48L3Y6c2hhcGV0eXBlPjx2OnNoYXBlIGlkPeWbvueJh194MDAyMF8xIA0Kc3R5bGU9 IkhFSUdIVDogMTVwdDsgV0lEVEg6IDEyOS43NXB0OyBWSVNJQklMSVRZOiB2aXNpYmxlOyBtc28t d3JhcC1zdHlsZTogc3F1YXJlIiANCmFsdD0iaHR0cDovL3Jhem9yLWJhcmJlZC13aXJlLmNvbS9z eXN0ZW0vaW1nL2ZpdmVzdGFyLWVtYWlsLWxvZ28uZ2lmIiANCnR5cGU9IiNfeDAwMDBfdDc1IiBv OnNwaWQ9Il94MDAwMF9pMTAyNSI+PHY6aW1hZ2VkYXRhIA0Kbzp0aXRsZT0iZml2ZXN0YXItZW1h aWwtbG9nbyIgDQpzcmM9ImZpbGU6Ly8vQzpcVXNlcnNcSklBTlNIRVxBcHBEYXRhXExvY2FsXFRl bXBcbXNvaHRtbGNsaXAxXDAxXGNsaXBfaW1hZ2UwMDEuZ2lmIj48L3Y6aW1hZ2VkYXRhPjwvdjpz aGFwZT48L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULVNJWkU6IDlw dDsgRk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjogYmxhY2s7IG1zby1m YXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7Pjxv OnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JP VU5EOiB3aGl0ZTsgVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxCPjxTUEFOIGxhbmc9RU4tVVMg DQpzdHlsZT0mIzM5O0ZPTlQtU0laRTogOXB0OyBGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1z ZXJpZiI7IENPTE9SOiBibGFjazsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNv LWZvbnQta2VybmluZzogMHB0JiMzOTs+QU5QSU5HIA0KRklWRSBTVEFSIFdJUkUgTUVTSCBDTywu TFREPG86cD48L286cD48L1NQQU4+PC9CPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxl PSJCQUNLR1JPVU5EOiB3aGl0ZTsgVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBw dDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9 RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtU0laRTogOXB0OyBGT05ULUZBTUlMWTogIkFyaWFsIiwi c2Fucy1zZXJpZiI7IENPTE9SOiAjODg4ODg4OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz5XZWJzaXRlOiANCjwvU1BBTj48U1BBTiBs YW5nPUVOLVVTPjxBIGhyZWY9Imh0dHA6Ly93d3cuY2hpbmFmaXZlc3Rhci5uZXQvI3ZpY2t5Ij48 U1BBTiANCnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZOiAiQXJpYWwiLCJz YW5zLXNlcmlmIjsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vy bmluZzogMHB0JiMzOTs+PEZPTlQgDQpjb2xvcj0jMDAwMGZmPmh0dHA6Ly9jaGluYWZpdmVzdGFy Lm5ldC8jdmlja3k8L0ZPTlQ+PC9TUEFOPjwvQT48L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTIA0K c3R5bGU9JiMzOTtGT05ULVNJWkU6IDlwdDsgRk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2Vy aWYiOyBDT0xPUjogIzg4ODg4ODsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNv LWZvbnQta2VybmluZzogMHB0JiMzOTs+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9 TXNvTm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9VTkQ6IHdoaXRlOyBURVhULUFMSUdOOiBsZWZ0OyBN QVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWdu PWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQt RkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6ICM4ODg4ODg7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PkUtbWFpbDog DQo8L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiA5cHQ7IEZP TlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6ICMzMzMzMzM7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PnZpY2t5 QGZpdmVzdGFyZ3JvdXAuY248L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtG T05ULVNJWkU6IDlwdDsgRk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjog Izg4ODg4ODsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2Vybmlu ZzogMHB0JiMzOTs+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0K c3R5bGU9IkJBQ0tHUk9VTkQ6IHdoaXRlOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAw Y20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4g bGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZOiAiQXJp YWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6ICM4ODg4ODg7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PlNreXBlOiANCjwvU1BBTj48U1BB TiBsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULVNJWkU6IDlwdDsgRk9OVC1GQU1JTFk6ICJB cmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjogIzMzMzMzMzsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+Zml2ZXN0YXIxNTgwPC9TUEFO PjxTUEFOIA0KbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFN SUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6ICM4ODg4ODg7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PjxvOnA+PC9vOnA+ PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0 ZTsgVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246 IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5 O0ZPTlQtU0laRTogOXB0OyBGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9S OiAjODg4ODg4OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJu aW5nOiAwcHQmIzM5Oz5RUTogDQo8L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7 Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6 ICMzMzMzMzM7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5p bmc6IDBwdCYjMzk7PjMyMjQ5NTI1NjM8L1NQQU4+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9 JiMzOTtGT05ULVNJWkU6IDlwdDsgRk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBD T0xPUjogIzg4ODg4ODsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQt a2VybmluZzogMHB0JiMzOTs+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIA0Kc3R5bGU9IkJBQ0tHUk9VTkQ6IHdoaXRlOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46 IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+ PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZ OiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6ICM4ODg4ODg7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PkNlbGw6IA0KPC9TUEFO PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtU0laRTogOXB0OyBGT05ULUZBTUlM WTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiAjMzMzMzMzOyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz4rODYgDQoxNTEgNzY5 NyA4NjgyJm5ic3A7PC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtU0la RTogOXB0OyBGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiAjMDA5OTMz OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQm IzM5Oz4oV2hhdHNhcHAgDQopPC9TUEFOPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZP TlQtU0laRTogOXB0OyBGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiAj ODg4ODg4OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5n OiAwcHQmIzM5Oz48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpz dHlsZT0iQkFDS0dST1VORDogd2hpdGU7IFRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBj bSAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBs YW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULVNJWkU6IDlwdDsgRk9OVC1GQU1JTFk6ICJBcmlh bCIsInNhbnMtc2VyaWYiOyBDT0xPUjogIzg4ODg4ODsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+VGVsOiANCjwvU1BBTj48U1BBTiBs YW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULVNJWkU6IDlwdDsgRk9OVC1GQU1JTFk6ICJBcmlh bCIsInNhbnMtc2VyaWYiOyBDT0xPUjogIzMzMzMzMzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+MDA4Ni0zMTEtODkxODA0MzM8L1NQ QU4+PFNQQU4gDQpsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULVNJWkU6IDlwdDsgRk9OVC1G QU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjogIzg4ODg4ODsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+PG86cD48L286 cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IkJBQ0tHUk9VTkQ6IHdo aXRlOyBURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28tcGFnaW5hdGlv bjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSYj Mzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09M T1I6ICM4ODg4ODg7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDBwdCYjMzk7PkZheDogDQo8L1NQQU4+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSYj Mzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09M T1I6ICMzMzMzMzM7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7IG1zby1mb250LWtl cm5pbmc6IDBwdCYjMzk7PjAwODYtMzExLTg5MTgwNDMyPC9TUEFOPjxTUEFOIA0KbGFuZz1FTi1V UyANCnN0eWxlPSYjMzk7Rk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5z LXNlcmlmIjsgQ09MT1I6ICM4ODg4ODg7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1mb250LWtlcm5pbmc6IDBwdCYjMzk7PjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNs YXNzPU1zb05vcm1hbCANCnN0eWxlPSJCQUNLR1JPVU5EOiB3aGl0ZTsgVEVYVC1BTElHTjogbGVm dDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQph bGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQtU0laRTogOXB0OyBG T05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiAjODg4ODg4OyBtc28tZmFy ZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQmIzM5Oz5BZGRy ZXNzOiANCjwvU1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9JiMzOTtGT05ULVNJWkU6IDlw dDsgRk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjogIzMzMzMzMzsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0JiMzOTs+ Tm8uNiANCkNoYW5nJiMzOTthbiBEaXN0cmljdCwgU2hpamlhemh1YW5nIENpdHksIEhlYmVpIFBy b3ZpbmNlLCBDaGluYTwvU1BBTj48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0mIzM5O0ZPTlQt U0laRTogOXB0OyBGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiAjODg4 ODg4OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tZm9udC1rZXJuaW5nOiAw cHQmIzM5Oz48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9 Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxTUEFOIGxhbmc9RU4tVVM+PG86cD48Rk9OVCANCmZhY2U9 Q2FsaWJyaT4mbmJzcDs8L0ZPTlQ+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1h bCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDBwdCI+PFNQQU4gbGFuZz1FTi1VUz48bzpwPjxGT05U IA0KZmFjZT1DYWxpYnJpPiZuYnNwOzwvRk9OVD48L286cD48L1NQQU4+PC9QPjwvQk9EWT48L0hU TUw+DQoNCg== From asavkov@redhat.com Mon Aug 29 03:12:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F04CC7CA0 for ; Mon, 29 Aug 2016 03:12:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B261E304032 for ; Mon, 29 Aug 2016 01:12:52 -0700 (PDT) X-ASG-Debug-ID: 1472458371-0bf81509b02ef210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BHMKjPfAsmgN2Pph (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 01:12:51 -0700 (PDT) X-Barracuda-Envelope-From: asavkov@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AF75B15F42; Mon, 29 Aug 2016 08:12:50 +0000 (UTC) Received: from shodan.usersys.redhat.com (dhcp-1-150.brq.redhat.com [10.34.1.150]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7T8CnRm025518; Mon, 29 Aug 2016 04:12:50 -0400 Received: by shodan.usersys.redhat.com (Postfix, from userid 1000) id 131D72C010F; Mon, 29 Aug 2016 10:12:49 +0200 (CEST) From: Artem Savkov To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Artem Savkov Subject: [PATCH v2] Make __xfs_xattr_put_listen preperly report errors. Date: Mon, 29 Aug 2016 10:12:33 +0200 X-ASG-Orig-Subj: [PATCH v2] Make __xfs_xattr_put_listen preperly report errors. Message-Id: <1472458353-19615-1-git-send-email-asavkov@redhat.com> In-Reply-To: <20160828225501.GJ19025@dastard> References: <20160828225501.GJ19025@dastard> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 29 Aug 2016 08:12:51 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472458371 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1471 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit 2a6fba6 "xfs: only return -errno or success from attr ->put_listent" changes the returnvalue of __xfs_xattr_put_listen to 0 in case when there is insufficient space in the buffer assuming that setting context->count to -1 would be enough, but all of the ->put_listent callers only check seen_enough. This results in a failed assertion: XFS: Assertion failed: context->count >= 0, file: fs/xfs/xfs_xattr.c, line: 175 in insufficient buffer size case. This is only reproducible with at least 2 xattrs and only when the buffer gets depleted before the last one. Furthermore if buffersize is such that it is enough to hold the last xattr's name, but not enough to hold the sum of preceeding xattr names listxattr won't fail with ERANGE, but will suceed returning last xattr's name without the first character. The first character end's up overwriting data stored at (context->alist - 1). Signed-off-by: Artem Savkov --- fs/xfs/xfs_xattr.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index ea62245..6290093 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -147,6 +147,7 @@ __xfs_xattr_put_listent( arraytop = context->count + prefix_len + namelen + 1; if (arraytop > context->firstu) { context->count = -1; /* insufficient space */ + context->seen_enough = 1; return 0; } offset = (char *)context->alist + context->count; -- 2.7.4 From Clgsale29@hongli.com Mon Aug 29 04:36:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 70A347CA0 for ; Mon, 29 Aug 2016 04:36:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C89FAAC004 for ; Mon, 29 Aug 2016 02:36:45 -0700 (PDT) X-ASG-Debug-ID: 1472463400-0bf57c1b0a292d0001-NocioJ Received: from hongli.com ([218.75.68.58]) by cuda.sgi.com with SMTP id wDoeyJ9QIxtabxtv for ; Mon, 29 Aug 2016 02:36:40 -0700 (PDT) X-Barracuda-Envelope-From: Clgsale29@hongli.com X-Barracuda-Effective-Source-IP: UNKNOWN[218.75.68.58] X-Barracuda-Apparent-Source-IP: 218.75.68.58 Sender: Clgsale29@hongli.com Received: from NTSS8N1EXB1YPG9[127.0.0.1] by NTSS8N1EXB1YPG9[127.0.0.1] (SMTPD32); Mon, 29 Aug 2016 17:32:58 +0800 From: "clg0628@163.com" Subject: welding fabrication To: xfs@oss.sgi.com X-ASG-Orig-Subj: welding fabrication MIME-Version: 1.0 Reply-To: clg0628@163.com Date: Mon, 29 Aug 2016 17:32:58 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[218.75.68.58] X-Barracuda-Start-Time: 1472463400 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2593 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.94 X-Barracuda-Spam-Status: No, SCORE=0.94 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32418 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.20 BSF_SC0_SA038b Custom Rule SA038b 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160829093644.DA4011940060@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTAuMDAuOTIwMC4xNjU0MCI+PC9IRUFEPg0KPEJPRFk+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0i Rk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgQ09MT1I6 IGJsYWNrOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdCI+RGVhciw8QlI+V2UgDQpwcm9kdWNl IDwvU1BBTj48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5O0FyaWFs JiMzOTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0Ij5D TkMgDQpNYWNoaW5pbmcsIHdlbGRpbmcgYW5kIEFzc2VtYmxpbmc8U1BBTiBzdHlsZT0iQ09MT1I6 IGJsYWNrIj4gd2l0aCBoaWdoIHF1YWxpdHkgDQomYW1wOyB2ZXJ5IGNvbXBldGl0aXZlIHByaWNl IGZvciAxMiB5ZWFycyBpbiBDaGluYTsgSG9wZSB0byBmaW5kIGEgd2F5IHRvIA0KY29vcGVyYXRl IHdpdGggeW91LjxCUj5FLWNhdGFsb2d1ZXMgd2lsbCBiZSBzZW50IGlmIG5lZWRlZC48QlI+V3Jp dGUgbWUgYmFjayBvciANCmNhbGwgbWUgcGxzLCBsZXTigJlzIHRhbGsgbW9yZSBpbiBkZXRhaWxz LjxCUj5UaGFuayB5b3UuPEJSPkJlc3QgDQpSZWdhcmRzPEJSPjwvU1BBTj5Jdnk8bzpwPjwvbzpw PjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAw cHQiPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5 OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQiPkNPTVBB Tlk8L1NQQU4+PEZPTlQgDQpmYWNlPUFyaWFsPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiDl rovkvZM7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tYmlkaS1mb250LWZhbWlseTog QXJpYWw7IG1zby1hc2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWls eTogQXJpYWwiPu+8mjwvU1BBTj48U1BBTiANCmxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1GQU1J TFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgbXNvLWJpZGktZm9udC1z aXplOiAxMC41cHQiPkhBTkdaSE9VIA0KSE9OR0xJIE1BQ0hJTkVSWSBDTy4sIExURC48bzpwPjwv bzpwPjwvU1BBTj48L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46 IDBjbSAwY20gMHB0Ij48U1BBTiBsYW5nPUVOLVVTIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiAmIzM5 O0FyaWFsJiMzOTssJiMzOTtzYW5zLXNlcmlmJiMzOTs7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAu NXB0Ij5BZGQ6IA0KWGlhb3NoYW4gb2YgSGFuZ3pob3UgY2l0eSA8bzpwPjwvbzpwPjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxTUEFO IGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3Nh bnMtc2VyaWYmIzM5OzsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQiPjxBIA0KaHJlZj0idGVs OigrODYiPjxGT05UIGNvbG9yPSMwMDAwZmY+VGVsOiArODY8L0ZPTlQ+PC9BPiA1NzEgDQo4Mjc3 NzE3MTxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFS R0lOOiAwY20gMGNtIDBwdCI+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULUZBTUlMWTog JiMzOTtBcmlhbCYjMzk7LCYjMzk7c2Fucy1zZXJpZiYjMzk7OyBtc28tYmlkaS1mb250LXNpemU6 IDEwLjVwdCI+RmF4OiArODYgDQo1NzEgODI3NzcwNzA8bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8 UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAwcHQiPjxTUEFOIGxhbmc9 RU4tVVMgDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYjMzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2Vy aWYmIzM5OzsgbXNvLWJpZGktZm9udC1zaXplOiAxMC41cHQiPkNlbDogKzg2IA0KMTg3NTgzODY2 ODg8bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJ TjogMGNtIDBjbSAwcHQiPjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICYj Mzk7QXJpYWwmIzM5OywmIzM5O3NhbnMtc2VyaWYmIzM5OzsgbXNvLWJpZGktZm9udC1zaXplOiAx MC41cHQiPldlYjogPEEgDQpocmVmPSJodHRwOi8vd3d3Lmh6aGw2NjYuY24vIj48Rk9OVCANCmNv bG9yPSMwMDAwZmY+aHR0cDovL3d3dy5oemhsNjY2LmNuLzwvRk9OVD48L0E+PG86cD48L286cD48 L1NQQU4+PC9QPjwvQk9EWT48L0hUTUw+DQoNCg== From eguan@redhat.com Mon Aug 29 05:38:02 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2A5467CA0 for ; Mon, 29 Aug 2016 05:38:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E13808F8033 for ; Mon, 29 Aug 2016 03:37:58 -0700 (PDT) X-ASG-Debug-ID: 1472467076-0bf57b531232ac60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vCBHVzqkWfFSIGFb (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 03:37:57 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C69A9C057FA7 for ; Mon, 29 Aug 2016 10:37:56 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TAbsF8032227 for ; Mon, 29 Aug 2016 06:37:55 -0400 Date: Mon, 29 Aug 2016 18:37:54 +0800 From: Eryu Guan To: xfs@oss.sgi.com Subject: BUG: Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c Message-ID: <20160829103754.GH27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: BUG: Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="FN+gV9K+162wdwwF" Content-Disposition: inline User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 29 Aug 2016 10:37:56 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472467077 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6383 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --FN+gV9K+162wdwwF Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, I've hit an XFS internal error then filesystem shutdown with 4.8-rc3 kernel but not with 4.8-rc2 [ 8841.923617] XFS (sda6): Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c. Caller xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [ 8841.938286] CPU: 3 PID: 56 Comm: kswapd0 Not tainted 4.8.0-rc3 #1 [ 8841.945073] Hardware name: IBM IBM System x3550 M4 Server -[7914I21]-/00J6242, BIOS -[D7E120CUS-1.20]- 08/23/2012 [ 8841.956526] 0000000000000286 00000000c8d39410 ffff88046890b7a8 ffffffff8135c53c [ 8841.964818] ffff8804144e4cb0 0000000000000001 ffff88046890b7c0 ffffffffa02d99cb [ 8841.973116] ffffffffa02e5537 ffff88046890b7e8 ffffffffa02f53e6 ffff8801ad37e580 [ 8841.981402] Call Trace: [ 8841.984134] [] dump_stack+0x63/0x87 [ 8841.989900] [] xfs_error_report+0x3b/0x40 [xfs] [ 8841.996813] [] ? xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [ 8842.004891] [] xfs_trans_cancel+0xb6/0xe0 [xfs] [ 8842.011803] [] xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [ 8842.019684] [] xfs_map_blocks+0x1a9/0x220 [xfs] [ 8842.026593] [] xfs_do_writepage+0x16b/0x560 [xfs] [ 8842.033695] [] xfs_vm_writepage+0x3b/0x70 [xfs] [ 8842.040584] [] pageout.isra.41+0x18d/0x2d0 [ 8842.046993] [] shrink_page_list+0x78a/0x9b0 [ 8842.053501] [] shrink_inactive_list+0x21d/0x570 [ 8842.060396] [] shrink_node_memcg+0x51e/0x7d0 [ 8842.067000] [] ? workqueue_congested+0x70/0x90 [ 8842.073799] [] ? __queue_work+0x142/0x420 [ 8842.080112] [] ? __queue_work+0x142/0x420 [ 8842.086425] [] shrink_node+0xe1/0x310 [ 8842.092351] [] kswapd+0x301/0x6f0 [ 8842.097889] [] ? mem_cgroup_shrink_node+0x180/0x180 [ 8842.105172] [] kthread+0xd8/0xf0 [ 8842.110614] [] ret_from_fork+0x1f/0x40 [ 8842.116636] [] ? kthread_park+0x60/0x60 [ 8842.122784] XFS (sda6): xfs_do_force_shutdown(0x8) called from line 985 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa02f53ff [ 8842.522306] XFS (sda6): Corruption of in-memory data detected. Shutting down filesystem [ 8842.531358] XFS (sda6): Please umount the filesystem and rectify the problem(s) [ 8842.540470] Buffer I/O error on dev sda6, logical block 56162821, lost async page write [ 8842.549431] audit: netlink_unicast sending to audit_pid=1123 returned error: -111 [ 8842.549433] audit: audit_lost=1 audit_rate_limit=0 audit_backlog_limit=64 [ 8842.549434] audit: audit_pid=1123 reset [ 8842.552890] audit: type=1701 audit(1472234261.632:184): auid=4294967295 uid=0 gid=0 ses=4294967295 subj=system_u:system_r:syslogd_t:s0 pid=2064 comm="in:imjournal" exe="/usr/sbin/rsyslogd" sig=7 [ 8842.552909] XFS (sda6): xfs_do_force_shutdown(0x1) called from line 203 of file fs/xfs/libxfs/xfs_defer.c. Return address = 0xffffffffa02b5459 [ 8842.554230] audit: type=1701 audit(1472234261.633:185): auid=4294967295 uid=0 gid=0 ses=4294967295 subj=system_u:system_r:init_t:s0 pid=1 comm="systemd" exe="/usr/lib/systemd/systemd" sig=11 [ 8842.555324] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b So it's likely a regression introduced in 4.8-rc3, and my bisect test pointed to commit 0af32fb468b4 ("xfs: fix bogus space reservation in xfs_iomap_write_allocate"). The test I ran is "bash-shared-mapping", it's available in autotest(bash-shared-mapping.c from ext3-tools.tar.gz). https://github.com/autotest/autotest-client-tests/raw/master/bash_shared_mapping/ext3-tools.tar.gz You may have to do some modifications to make it compile. I attached an updated version of bash-shared-mapping.c, you can downloand and compile it directly. I attached a script too to reproduce it. Please note that the XFS partition needs about 40G frees space, and it may take hours to finish based on your memory setup on your host. I reproduced it on multiple hosts e.g. host with 64G memory & 16 cpus and host with 16G memory & 16 cpus, but I haven't seen it on my test vm which has 8G memory & 4 vcpus. Detailed information of the host with 64G memory is: [root@hp-dl360g9-15 ~]# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 16 On-line CPU(s) list: 0-15 Thread(s) per core: 1 Core(s) per socket: 8 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 63 Model name: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz Stepping: 2 CPU MHz: 2400.000 BogoMIPS: 4802.86 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 20480K NUMA node0 CPU(s): 0-3,8-11 NUMA node1 CPU(s): 4-7,12-15 [root@hp-dl360g9-15 ~]# free -m total used free shared buff/cache available Mem: 64305 38757 224 5 25323 61944 Swap: 16379 65 16314 [root@hp-dl360g9-15 ~]# xfs_info / meta-data=/dev/mapper/systemvg-root isize=256 agcount=16, agsize=2927744 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 spinodes=0 data = bsize=4096 blocks=46843904, imaxpct=25 = sunit=64 swidth=192 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=22912, version=2 = sectsz=512 sunit=64 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@hp-dl360g9-15 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home systemvg -wi-ao---- 2.54t root systemvg -wi-ao---- 178.70g swap systemvg -wi-ao---- 16.00g If more information is needed please let me know. Thanks, Eryu --FN+gV9K+162wdwwF Content-Type: application/x-sh Content-Disposition: attachment; filename="bashmemory.sh" Content-Transfer-Encoding: quoted-printable #!/bin/bash=0A=0A# point this to the actual bash-shared-mapping=0Abash_shar= ed_mapping=3D/path/to/bash-shared-mapping=0A=0AITER=3D30=0ATASKS=3D10=0A=0A= # modify as needed, make sure it has ~40G free space=0AMNT=3D/mnt/xfs=0AFIL= ENAME=3D$MNT/foo=0A=0Amemsize=3D`free -m | grep Mem | awk '{print $2}'`=0Ae= cho "memsize is $memsize MB"=0A=0A# Use memsize * 1.10 to put pressure on t= he VM:=0Absmemsize=3D$((memsize * 11 / 10))=0A# limit memsize to 2 GB due t= o 31-bit seek() and mmap()=0Aif [ $((bsmemsize)) -gt 2000 ] ; then=0A = bsmemsize=3D2000=0A echo "limited memsize =3D $bsmemsize MB"=0Afi=0A=0Aco= pies=3D$(((memsize + 1950) / 2000))=0Aecho "using $copies copies of: bash-s= hared-mapping"=0AFILESIZE=3D$((bsmemsize * 1000000))=0Aecho "bash-shared-ma= pping : FILESIZE =3D $FILESIZE"=0A=0Acp=3D$copies=0Awhile [ $cp -gt 0 ] ; d= o=0A date=0A prms=3D"-v -n $ITER -t $TASKS $FILENAME.$cp $FILESIZE"=0A $bas= h_shared_mapping $prms &=0A cp=3D$((cp - 1))=0Adone=0Await=0A=0Adate=0Aecho= "done!"=0A --FN+gV9K+162wdwwF Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="console.log" [ 2872.431497] run test /mnt/tests/kernel/filesystems/ext4/576202-bashmemory [-- MARK -- Fri Aug 26 16:20:00 2016] [ 3073.429520] INFO: task bash-shared-map:9527 blocked for more than 120 seconds. [ 3073.437589] Not tainted 4.8.0-rc3 #1 [ 3073.442163] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3073.450903] bash-shared-map D ffff88036e207c30 0 9527 9522 0x00000080 [ 3073.458795] ffff88036e207c30 ffff880150f34000 ffff880457f55a00 ffff880457f55a00 [ 3073.467090] ffff88036e208000 ffff8801ad37e790 ffff8801ad37e790 ffffffff00000000 [ 3073.475386] ffff8801ad37e7a8 ffff88036e207c48 ffffffff816f49e5 ffff880457f55a00 [ 3073.483683] Call Trace: [ 3073.486419] [] schedule+0x35/0x80 [ 3073.491961] [] rwsem_down_write_failed+0x218/0x390 [ 3073.499157] [] call_rwsem_down_write_failed+0x17/0x30 [ 3073.506654] [] down_write+0x2d/0x40 [ 3073.512459] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3073.520578] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3073.527883] [] __vfs_write+0xe3/0x160 [ 3073.533829] [] vfs_write+0xb2/0x1b0 [ 3073.539578] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3073.546593] [] SyS_pwrite64+0x87/0xb0 [ 3073.552540] [] do_syscall_64+0x67/0x160 [ 3073.558671] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3073.565880] INFO: task bash-shared-map:9532 blocked for more than 120 seconds. [ 3073.573950] Not tainted 4.8.0-rc3 #1 [ 3073.578531] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3073.587282] bash-shared-map D ffff88037663fc30 0 9532 9516 0x00000080 [ 3073.595190] ffff88037663fc30 ffff88037663fc40 ffff880459ff0000 ffff88037663fc30 [ 3073.603520] ffff880376640000 ffff8802a0f514d0 ffff8802a0f514d0 ffffffff00000000 [ 3073.611820] ffff8802a0f514e8 ffff88037663fc48 ffffffff816f49e5 ffff880459ff0000 [ 3073.620112] Call Trace: [ 3073.622848] [] schedule+0x35/0x80 [ 3073.628390] [] rwsem_down_write_failed+0x218/0x390 [ 3073.635580] [] ? rwsem_down_read_failed+0x10e/0x160 [ 3073.642869] [] call_rwsem_down_write_failed+0x17/0x30 [ 3073.650352] [] down_write+0x2d/0x40 [ 3073.656122] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3073.664201] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3073.671490] [] __vfs_write+0xe3/0x160 [ 3073.677420] [] vfs_write+0xb2/0x1b0 [ 3073.683149] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3073.690151] [] SyS_pwrite64+0x87/0xb0 [ 3073.696080] [] do_syscall_64+0x67/0x160 [ 3073.702204] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3073.709414] INFO: task bash-shared-map:9535 blocked for more than 120 seconds. [ 3073.717492] Not tainted 4.8.0-rc3 #1 [ 3073.722077] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3073.730822] bash-shared-map D ffff8801ca7dfc30 0 9535 9531 0x00000080 [ 3073.738702] ffff8801ca7dfc30 ffff8801536ca000 ffff880468985a00 ffff880468985a00 [ 3073.746998] ffff8801ca7e0000 ffff8801ad37e3d0 ffff8801ad37e3d0 ffffffff00000000 [ 3073.755295] ffff8801ad37e3e8 ffff8801ca7dfc48 ffffffff816f49e5 ffff880468985a00 [ 3073.763593] Call Trace: [ 3073.766326] [] schedule+0x35/0x80 [ 3073.771871] [] rwsem_down_write_failed+0x218/0x390 [ 3073.779062] [] call_rwsem_down_write_failed+0x17/0x30 [ 3073.786543] [] down_write+0x2d/0x40 [ 3073.792311] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3073.800391] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3073.807680] [] __vfs_write+0xe3/0x160 [ 3073.813630] [] vfs_write+0xb2/0x1b0 [ 3073.819389] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3073.826390] [] SyS_pwrite64+0x87/0xb0 [ 3073.832321] [] do_syscall_64+0x67/0x160 [ 3073.838449] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3073.845643] INFO: task bash-shared-map:9538 blocked for more than 120 seconds. [ 3073.853706] Not tainted 4.8.0-rc3 #1 [ 3073.858277] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3073.867018] bash-shared-map D ffff88037338fc30 0 9538 9531 0x00000080 [ 3073.874909] ffff88037338fc30 ffff8801536ca000 ffff88045a3fc380 ffff88045a3fc380 [ 3073.883206] ffff880373390000 ffff8801ad37e3d0 ffff8801ad37e3d0 ffffffff00000000 [ 3073.891502] ffff8801ad37e3e8 ffff88037338fc48 ffffffff816f49e5 ffff88045a3fc380 [ 3073.899798] Call Trace: [ 3073.902529] [] schedule+0x35/0x80 [ 3073.908073] [] rwsem_down_write_failed+0x218/0x390 [ 3073.915266] [] call_rwsem_down_write_failed+0x17/0x30 [ 3073.922768] [] down_write+0x2d/0x40 [ 3073.928556] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3073.936668] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3073.943969] [] __vfs_write+0xe3/0x160 [ 3073.949904] [] vfs_write+0xb2/0x1b0 [ 3073.955640] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3073.962634] [] SyS_pwrite64+0x87/0xb0 [ 3073.968564] [] do_syscall_64+0x67/0x160 [ 3073.974689] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3073.981884] INFO: task bash-shared-map:9539 blocked for more than 120 seconds. [ 3073.989947] Not tainted 4.8.0-rc3 #1 [ 3073.994516] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3074.003256] bash-shared-map D ffff880386eefc30 0 9539 9532 0x00000080 [ 3074.011160] ffff880386eefc30 ffff880386eefc40 ffff8803baed5a00 ffff880386eefc30 [ 3074.019457] ffff880386ef0000 ffff8802a0f514d0 ffff8802a0f514d0 ffffffff00000000 [ 3074.027752] ffff8802a0f514e8 ffff880386eefc48 ffffffff816f49e5 ffff8803baed5a00 [ 3074.036047] Call Trace: [ 3074.038783] [] schedule+0x35/0x80 [ 3074.044325] [] rwsem_down_write_failed+0x218/0x390 [ 3074.051516] [] ? rwsem_down_read_failed+0x10e/0x160 [ 3074.058806] [] call_rwsem_down_write_failed+0x17/0x30 [ 3074.066293] [] down_write+0x2d/0x40 [ 3074.072066] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3074.080146] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3074.087437] [] __vfs_write+0xe3/0x160 [ 3074.093366] [] vfs_write+0xb2/0x1b0 [ 3074.099103] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3074.106099] [] SyS_pwrite64+0x87/0xb0 [ 3074.112028] [] do_syscall_64+0x67/0x160 [ 3074.118154] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3074.125348] INFO: task bash-shared-map:9546 blocked for more than 120 seconds. [ 3074.133411] Not tainted 4.8.0-rc3 #1 [ 3074.137985] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3074.146724] bash-shared-map D ffff8801b9e2bc30 0 9546 9531 0x00000080 [ 3074.154615] ffff8801b9e2bc30 ffff8801536ca000 ffff88045aa30000 ffff88045aa30000 [ 3074.162912] ffff8801b9e2c000 ffff8801ad37e3d0 ffff8801ad37e3d0 ffffffff00000000 [ 3074.171207] ffff8801ad37e3e8 ffff8801b9e2bc48 ffffffff816f49e5 ffff88045aa30000 [ 3074.179505] Call Trace: [ 3074.182236] [] schedule+0x35/0x80 [ 3074.187778] [] rwsem_down_write_failed+0x218/0x390 [ 3074.194968] [] call_rwsem_down_write_failed+0x17/0x30 [ 3074.202441] [] down_write+0x2d/0x40 [ 3074.208194] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3074.216273] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3074.223563] [] __vfs_write+0xe3/0x160 [ 3074.229494] [] vfs_write+0xb2/0x1b0 [ 3074.235231] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3074.242227] [] SyS_pwrite64+0x87/0xb0 [ 3074.248165] [] do_syscall_64+0x67/0x160 [ 3074.254292] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3074.261484] INFO: task bash-shared-map:9550 blocked for more than 120 seconds. [ 3074.269545] Not tainted 4.8.0-rc3 #1 [ 3074.274116] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3074.282855] bash-shared-map D ffff8801c962bc30 0 9550 9531 0x00000080 [ 3074.290745] ffff8801c962bc30 ffff8801536ca000 ffff88045aa35a00 ffff88045aa35a00 [ 3074.299040] ffff8801c962c000 ffff8801ad37e3d0 ffff8801ad37e3d0 ffffffff00000000 [ 3074.307335] ffff8801ad37e3e8 ffff8801c962bc48 ffffffff816f49e5 ffff88045aa35a00 [ 3074.315632] Call Trace: [ 3074.318362] [] schedule+0x35/0x80 [ 3074.323904] [] rwsem_down_write_failed+0x218/0x390 [ 3074.331095] [] call_rwsem_down_write_failed+0x17/0x30 [ 3074.338577] [] down_write+0x2d/0x40 [ 3074.344346] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3074.352424] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3074.359713] [] __vfs_write+0xe3/0x160 [ 3074.365660] [] vfs_write+0xb2/0x1b0 [ 3074.371417] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3074.378438] [] SyS_pwrite64+0x87/0xb0 [ 3074.384374] [] do_syscall_64+0x67/0x160 [ 3074.390503] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3074.397698] INFO: task bash-shared-map:9562 blocked for more than 120 seconds. [ 3074.405759] Not tainted 4.8.0-rc3 #1 [ 3074.410331] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3074.419071] bash-shared-map D ffff880198ab3c30 0 9562 9527 0x00000080 [ 3074.426960] ffff880198ab3c30 ffff880150f34000 ffff88038d37ad00 ffff88038d37ad00 [ 3074.435256] ffff880198ab4000 ffff8801ad37e790 ffff8801ad37e790 ffffffff00000000 [ 3074.443554] ffff8801ad37e7a8 ffff880198ab3c48 ffffffff816f49e5 ffff88038d37ad00 [ 3074.451849] Call Trace: [ 3074.454581] [] schedule+0x35/0x80 [ 3074.460141] [] rwsem_down_write_failed+0x218/0x390 [ 3074.467339] [] call_rwsem_down_write_failed+0x17/0x30 [ 3074.474818] [] down_write+0x2d/0x40 [ 3074.480586] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3074.488665] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3074.495955] [] __vfs_write+0xe3/0x160 [ 3074.501884] [] vfs_write+0xb2/0x1b0 [ 3074.507623] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3074.514618] [] SyS_pwrite64+0x87/0xb0 [ 3074.520549] [] do_syscall_64+0x67/0x160 [ 3074.526674] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3074.533866] INFO: task bash-shared-map:9563 blocked for more than 120 seconds. [ 3074.541928] Not tainted 4.8.0-rc3 #1 [ 3074.546500] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3074.555241] bash-shared-map D ffff880198a33c30 0 9563 9527 0x00000080 [ 3074.563133] ffff880198a33c30 ffff880150f34000 ffff88038d37c380 ffff88038d37c380 [ 3074.571428] ffff880198a34000 ffff8801ad37e790 ffff8801ad37e790 ffffffff00000000 [ 3074.579738] ffff8801ad37e7a8 ffff880198a33c48 ffffffff816f49e5 ffff88038d37c380 [ 3074.588039] Call Trace: [ 3074.590774] [] schedule+0x35/0x80 [ 3074.596317] [] rwsem_down_write_failed+0x218/0x390 [ 3074.603507] [] call_rwsem_down_write_failed+0x17/0x30 [ 3074.610989] [] down_write+0x2d/0x40 [ 3074.616754] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3074.624833] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3074.632122] [] __vfs_write+0xe3/0x160 [ 3074.638054] [] vfs_write+0xb2/0x1b0 [ 3074.643792] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3074.650789] [] SyS_pwrite64+0x87/0xb0 [ 3074.656710] [] do_syscall_64+0x67/0x160 [ 3074.662825] [] entry_SYSCALL64_slow_path+0x25/0x25 [ 3074.670016] INFO: task bash-shared-map:9576 blocked for more than 120 seconds. [ 3074.678079] Not tainted 4.8.0-rc3 #1 [ 3074.682648] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3074.691389] bash-shared-map D ffff88037066bc30 0 9576 9534 0x00000080 [ 3074.699279] ffff88037066bc30 ffff8801a0df7000 ffff88032eaf8000 ffff88032eaf8000 [ 3074.707577] ffff88037066c000 ffff8802a0f51890 ffff8802a0f51890 ffffffff00000000 [ 3074.715874] ffff8802a0f518a8 ffff88037066bc48 ffffffff816f49e5 ffff88032eaf8000 [ 3074.724165] Call Trace: [ 3074.726895] [] schedule+0x35/0x80 [ 3074.732437] [] rwsem_down_write_failed+0x218/0x390 [ 3074.739628] [] ? block_commit_write+0xe/0x20 [ 3074.746237] [] call_rwsem_down_write_failed+0x17/0x30 [ 3074.753719] [] down_write+0x2d/0x40 [ 3074.759472] [] xfs_file_buffered_aio_write+0x64/0x260 [xfs] [ 3074.767552] [] xfs_file_write_iter+0xed/0x130 [xfs] [ 3074.774833] [] __vfs_write+0xe3/0x160 [ 3074.780762] [] vfs_write+0xb2/0x1b0 [ 3074.786499] [] ? syscall_trace_enter+0x1dd/0x2c0 [ 3074.793514] [] SyS_pwrite64+0x87/0xb0 [ 3074.799460] [] do_syscall_64+0x67/0x160 [ 3074.805589] [] entry_SYSCALL64_slow_path+0x25/0x25 [-- MARK -- Fri Aug 26 16:25:00 2016] [-- MARK -- Fri Aug 26 16:30:00 2016] [-- MARK -- Fri Aug 26 16:35:00 2016] [ 3909.818209] perf: interrupt took too long (2511 > 2500), lowering kernel.perf_event_max_sample_rate to 79000 [-- MARK -- Fri Aug 26 16:40:00 2016] [-- MARK -- Fri Aug 26 16:45:00 2016] [-- MARK -- Fri Aug 26 16:50:00 2016] [-- MARK -- Fri Aug 26 16:55:00 2016] [-- MARK -- Fri Aug 26 17:00:00 2016] [-- MARK -- Fri Aug 26 17:05:00 2016] [-- MARK -- Fri Aug 26 17:10:00 2016] [-- MARK -- Fri Aug 26 17:15:00 2016] [-- MARK -- Fri Aug 26 17:20:00 2016] [-- MARK -- Fri Aug 26 17:25:00 2016] [-- MARK -- Fri Aug 26 17:30:00 2016] [-- MARK -- Fri Aug 26 17:35:00 2016] [-- MARK -- Fri Aug 26 17:40:00 2016] [-- MARK -- Fri Aug 26 17:45:00 2016] [ 8179.104300] perf: interrupt took too long (3151 > 3138), lowering kernel.perf_event_max_sample_rate to 63000 [-- MARK -- Fri Aug 26 17:50:00 2016] [-- MARK -- Fri Aug 26 17:55:00 2016] [ 8841.923617] XFS (sda6): Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c. Caller xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [ 8841.938286] CPU: 3 PID: 56 Comm: kswapd0 Not tainted 4.8.0-rc3 #1 [ 8841.945073] Hardware name: IBM IBM System x3550 M4 Server -[7914I21]-/00J6242, BIOS -[D7E120CUS-1.20]- 08/23/2012 [ 8841.956526] 0000000000000286 00000000c8d39410 ffff88046890b7a8 ffffffff8135c53c [ 8841.964818] ffff8804144e4cb0 0000000000000001 ffff88046890b7c0 ffffffffa02d99cb [ 8841.973116] ffffffffa02e5537 ffff88046890b7e8 ffffffffa02f53e6 ffff8801ad37e580 [ 8841.981402] Call Trace: [ 8841.984134] [] dump_stack+0x63/0x87 [ 8841.989900] [] xfs_error_report+0x3b/0x40 [xfs] [ 8841.996813] [] ? xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [ 8842.004891] [] xfs_trans_cancel+0xb6/0xe0 [xfs] [ 8842.011803] [] xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [ 8842.019684] [] xfs_map_blocks+0x1a9/0x220 [xfs] [ 8842.026593] [] xfs_do_writepage+0x16b/0x560 [xfs] [ 8842.033695] [] xfs_vm_writepage+0x3b/0x70 [xfs] [ 8842.040584] [] pageout.isra.41+0x18d/0x2d0 [ 8842.046993] [] shrink_page_list+0x78a/0x9b0 [ 8842.053501] [] shrink_inactive_list+0x21d/0x570 [ 8842.060396] [] shrink_node_memcg+0x51e/0x7d0 [ 8842.067000] [] ? workqueue_congested+0x70/0x90 [ 8842.073799] [] ? __queue_work+0x142/0x420 [ 8842.080112] [] ? __queue_work+0x142/0x420 [ 8842.086425] [] shrink_node+0xe1/0x310 [ 8842.092351] [] kswapd+0x301/0x6f0 [ 8842.097889] [] ? mem_cgroup_shrink_node+0x180/0x180 [ 8842.105172] [] kthread+0xd8/0xf0 [ 8842.110614] [] ret_from_fork+0x1f/0x40 [ 8842.116636] [] ? kthread_park+0x60/0x60 [ 8842.122784] XFS (sda6): xfs_do_force_shutdown(0x8) called from line 985 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa02f53ff [ 8842.522306] XFS (sda6): Corruption of in-memory data detected. Shutting down filesystem [ 8842.531358] XFS (sda6): Please umount the filesystem and rectify the problem(s) [ 8842.540470] Buffer I/O error on dev sda6, logical block 56162821, lost async page write [ 8842.549431] audit: netlink_unicast sending to audit_pid=1123 returned error: -111 [ 8842.549433] audit: audit_lost=1 audit_rate_limit=0 audit_backlog_limit=64 [ 8842.549434] audit: audit_pid=1123 reset [ 8842.552890] audit: type=1701 audit(1472234261.632:184): auid=4294967295 uid=0 gid=0 ses=4294967295 subj=system_u:system_r:syslogd_t:s0 pid=2064 comm="in:imjournal" exe="/usr/sbin/rsyslogd" sig=7 [ 8842.552909] XFS (sda6): xfs_do_force_shutdown(0x1) called from line 203 of file fs/xfs/libxfs/xfs_defer.c. Return address = 0xffffffffa02b5459 [ 8842.554230] audit: type=1701 audit(1472234261.633:185): auid=4294967295 uid=0 gid=0 ses=4294967295 subj=system_u:system_r:init_t:s0 pid=1 comm="systemd" exe="/usr/lib/systemd/systemd" sig=11 [ 8842.555324] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b [ 8842.555324] [ 8842.555327] CPU: 2 PID: 1 Comm: systemd Not tainted 4.8.0-rc3 #1 [ 8842.555327] Hardware name: IBM IBM System x3550 M4 Server -[7914I21]-/00J6242, BIOS -[D7E120CUS-1.20]- 08/23/2012 [ 8842.555331] 0000000000000086 0000000061573c1d ffff88017e223c28 ffffffff8135c53c [ 8842.555332] ffff88017e1b8b00 ffffffff81a28e80 ffff88017e223ca8 ffffffff81198014 [ 8842.555334] ffffffff00000010 ffff88017e223cb8 ffff88017e223c58 0000000061573c1d [ 8842.555334] Call Trace: [ 8842.555342] [] dump_stack+0x63/0x87 [ 8842.555346] [] panic+0xeb/0x232 [ 8842.555349] [] do_exit+0xa1b/0xb30 [ 8842.555350] [] do_group_exit+0x3f/0xb0 [ 8842.555352] [] get_signal+0x1cc/0x600 [ 8842.555356] [] do_signal+0x37/0x6d0 [ 8842.555359] [] ? handle_mm_fault+0xee4/0x1300 [ 8842.555361] [] ? mm_fault_error+0x11a/0x157 [ 8842.555365] [] ? __do_page_fault+0x430/0x4a0 [ 8842.555367] [] exit_to_usermode_loop+0x59/0xa2 [ 8842.555370] [] prepare_exit_to_usermode+0x38/0x40 [ 8842.555374] [] retint_user+0x8/0x13 [ 8842.557801] Kernel Offset: disabled [ 8842.759432] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b [ 8842.759432] [-- MARK -- Fri Aug 26 18:00:00 2016] [-- MARK -- Fri Aug 26 18:05:00 2016] --FN+gV9K+162wdwwF Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="bash-shared-mapping.c" /* * bash-shared-mapping.c - Andrew Morton * * Create a huge and holey shared mapping, then conduct multithreaded * write() I/O on some of it, while truncating and expanding it. General * idea is to try to force pageout activity into the file while the kernel * is writing to and truncating the file. We also perform pageout of areas * which are subject to write() and vice versa. All sorts of stuff. * * It is good to run a concurrent task which uses heaps of memory, to force * pageouts. * * A good combination on a 1gigabyte machine is: * * bash-shared-mapping -t5 foo 1000000000 & * while true * do * usemem 1000 * done */ #include #include #include #include #include #include #include #include #include #include #include //ssize_t pwrite(unsigned int fd, const char * buf, size_t count, loff_t pos); long ftruncate64(unsigned int fd, loff_t length); #ifndef O_LARGEFILE #define O_LARGEFILE 0100000 #endif int verbose; char *progname; loff_t size; int fd; char *filename; void *mapped_mem; int got_sigbus; loff_t sigbus_offset; int ntasks = 1; int niters = -1; void open_file() { fd = open(filename, O_RDWR|O_LARGEFILE|O_TRUNC|O_CREAT, 0666); if (fd < 0) { fprintf(stderr, "%s: Cannot open `%s': %s\n", progname, filename, strerror(errno)); exit(1); } } ssize_t my_pwrite(unsigned int fd, const char * buf, size_t count, loff_t pos) { if (pos > 2000000000) printf("DRAT\n"); return pwrite(fd, buf, count, pos); } void mmap_file(void) { mapped_mem = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (mapped_mem == MAP_FAILED) { perror("mmap"); exit(1); } } void stretch_file(loff_t size) { long c = 1; int ret; if (verbose) printf("stretch file to %Ld\n", size); if ((ret = my_pwrite(fd, (const char *)&c, sizeof(c), size - sizeof(c))) != sizeof(c)) { fprintf(stderr, "%s: my_pwrite returned %d\n", __FUNCTION__, ret); perror("my_pwrite"); exit(1); } } /* * If another thread truncates the file, we get SIGBUS. * Who cares :) */ void sigbus(int sig) { long c = 1; struct stat statbuf; int ret; loff_t new_len = sigbus_offset + sizeof(c); if (verbose) printf("sigbus - stretch to %Ld\n", new_len); got_sigbus = 1; /* Instantiate the file up to the sigbus address */ if ((ret = my_pwrite(fd, (const char *)&c, sizeof(c), sigbus_offset)) != sizeof(c)) { fprintf(stderr, "%s: my_pwrite returned %d\n",__FUNCTION__, ret); perror("sigbus my_pwrite"); } if (fstat(fd, &statbuf)) { perror("fstat"); } if (verbose) printf("length is now %ld\n", statbuf.st_size); } void set_sigbus_offset(loff_t offset) { sigbus_offset = offset; } void install_signal_handler() { signal(SIGBUS, sigbus); } void dirty_pages(loff_t offset, loff_t amount) { long *p, val; loff_t idx; if (offset + amount > size) amount = size - offset; if (verbose) printf("dirty %Ld bytes at %Ld\n", amount, offset); val = 0; p = mapped_mem; amount /= sizeof(*p); offset /= sizeof(*p); got_sigbus = 0; for (idx = 0; idx < amount; idx++) { set_sigbus_offset((idx + offset) * sizeof(*p)); p[idx + offset] = val++; if (got_sigbus) { if (verbose) printf("dirty_pages: sigbus\n"); break; } } } void write_stuff(loff_t from, loff_t to, loff_t amount) { int ret; if (from + amount > size) amount = size - from; if (to + amount > size) amount = size - to; if (verbose) printf("my_pwrite %Ld bytes from %Ld to %Ld\n", amount, from, to); if ((ret = my_pwrite(fd, (char *)mapped_mem + from, amount, to)) != amount) { if (verbose) printf("%s: my_pwrite returned %d, not %Ld\n",__FUNCTION__, ret, amount); if (errno == EFAULT) { /* * It was unmapped under us */ if (verbose) printf("my_pwrite: EFAULT\n"); } else if (ret < 0) { perror("my_pwrite"); exit(1); } } } #if 1 loff_t rand_of(loff_t arg) { double dret = arg; loff_t ret; dret *= drand48(); ret = dret; #if 0 if (ret < 0 || ret > 0x40000000) printf("I goofed: %Ld\n", ret); #endif return ret; } #else loff_t rand_of(loff_t arg) { return rand() % arg; } #endif void usage(void) { fprintf(stderr, "Usage: %s [-v] [-nN] [-tN] filename size-in-bytes\n", progname); fprintf(stderr, " -v: Verbose\n"); fprintf(stderr, " -nN: Run N iterations\n"); fprintf(stderr, " -tN: Run N tasks\n"); exit(1); } int main(int argc, char *argv[]) { int c; int i; int niters = -1; progname = argv[0]; while ((c = getopt(argc, argv, "vn:t:")) != -1) { switch (c) { case 'n': niters = strtol(optarg, NULL, 10); break; case 't': ntasks = strtol(optarg, NULL, 10); break; case 'v': verbose++; break; } } if (optind == argc) usage(); filename = argv[optind++]; if (optind == argc) usage(); sscanf(argv[optind++], "%Ld", &size); if (optind != argc) usage(); if (size < 10) size = 10; open_file(); for (i = 1; i < ntasks; i++) { if (fork() == 0) break; } stretch_file(size); mmap_file(); install_signal_handler(); srand48(time(0) * getpid()); srand(10 * getpid()); while (niters--) { dirty_pages(rand_of(size), rand_of(size)); write_stuff(rand_of(size), rand_of(size), rand_of(size)); ftruncate64(fd, rand_of(size)); stretch_file(rand_of(size) + 10); } exit(0); } --FN+gV9K+162wdwwF-- From allison@ek58.com Mon Aug 29 05:50:22 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=WEIRD_QUOTING autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7DF27CA0 for ; Mon, 29 Aug 2016 05:50:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9934D304048 for ; Mon, 29 Aug 2016 03:50:19 -0700 (PDT) X-ASG-Debug-ID: 1472467814-0bf57c1b082c560001-NocioJ Received: from xm.wvchi.org ([222.245.5.89]) by cuda.sgi.com with SMTP id GSp7zDA5w68NXVd5 for ; Mon, 29 Aug 2016 03:50:14 -0700 (PDT) X-Barracuda-Envelope-From: allison@ek58.com X-Barracuda-Effective-Source-IP: UNKNOWN[222.245.5.89] X-Barracuda-Apparent-Source-IP: 222.245.5.89 Received: from abcddefgh ([127.0.0.1]) (envelope-sender ) by 127.0.0.1 with ESMTP for ; Mon, 29 Aug 2016 18:50:10 +0800 Date: Mon, 29 Aug 2016 18:50:10 +0800 From: "Guuwwx" To: "xfs" Subject: =?GB2312?B?eGZzLS2hvsDNzvHTw7mkt6jCybfnz9W55rHc0+vT0NCntfe42rX30L2hor3i?= =?GB2312?B?uc20x83LvLzHyaG/?= Message-ID: <201608291850107863333@EK58.com> X-ASG-Orig-Subj: =?GB2312?B?eGZzLS2hvsDNzvHTw7mkt6jCybfnz9W55rHc0+vT0NCntfe42rX30L2hor3i?= =?GB2312?B?uc20x83LvLzHyaG/?= X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 X-Barracuda-Connect: UNKNOWN[222.245.5.89] X-Barracuda-Start-Time: 1472467814 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16566 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE, WEIRD_QUOTING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32419 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 WEIRD_QUOTING BODY: Weird repeated double-quotation marks 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS RUs1OC5jb20NCg0KW10gICChoaG2wM09tq89us89zaw9t6iht6GiobbJ5z274T2xoz3P1T23qKG3 oaKhtrmkPcnLPbGjPc/VPcz1PcD9obfKtSCy2SDTpiC21CAgIKGhDQpbXSAgICAgILLfIMLUINPr INPQINCnILX3ILjaILX3INC9oaK94iC5zSC0xyDNyyC8sCDOpSC8zSDOyiDM4iDUsSC5pLSmIMDt ILy8IMfJIA0KW10gICChoahUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSo VKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFQgDQpbXSAgIKGh IKHxob7KsVy85Fy12Fy146G/DQpbXSAgIKGhICANCltdICAgoaGhoaGhMjAxNsTqOdTCMjMtLTI0 yNUtLS3Jz7qjo6hBtaXUqqOpDQpbXSAgIKGhoaGhoTIwMTbE6jnUwjI5LS0zMMjVLS0tsbG+qaOo QbWl1KqjqQ0KW10gICChoaGhoaEyMDE2xOoxMNTCMjEtLTIyyNUtLcnu29qjqEG1pdSqo6kNCltd ICAgoaGhoaGhIA0KW10gICChoaGhoaEyMDE2xOoxMNTCMjgtLTI5yNUtLcnPuqOjqEK1pdSqo6kN CltdICAgoaGhoaGhMjAxNsTqMTHUwjQtLTXI1S0tLS2xsb6po6hCtaXUqqOpDQpbXSAgIKGhoaGh oTIwMTbE6jEx1MIxMS0tMTLI1S0tye7b2qOoQrWl1KqjqQ0KW10gICChoaGhoaEgDQpbXSAgIKGh oaGhoTIwMTbE6jEx1MIxOC0tMTnI1S0tLbnj1t2jqEG1pdSqo6kNCltdICAgoaGhoaGhMjAxNsTq MTHUwjI1LS0yNsjVLS0tyc+6o6OoQbWl1KqjqQ0KW10gICChoaGhoaEyMDE2xOoxMtTCMi0tM8jV LS0tLS2xsb6po6hBtaXUqqOpDQpbXSAgIKGhoaGhoTIwMTbE6jEy1MI5LS0xMMjVLS0tLcnu29qj qEG1pdSqo6kNCltdICAgoaGhoaGhIA0KW10gICChoaGhoaEyMDE2xOoxMtTCMTYtLTE3yNUtLS25 49bdo6hCtaXUqqOpDQpbXSAgIKGhoaGhoTIwMTbE6jEy1MIyMi0tMjPI1S0tLcnPuqOjqEK1pdSq o6kNCltdICAgoaGhoaGhMjAxNsTqMTLUwjI2LS0yN8jVLS0tsbG+qaOoQrWl1KqjqQ0KW10gICCh oaGhoaEyMDE2xOoxMtTCMzAtLTMxyNUtLS3J7tvao6hCtaXUqqOpDQpbXSAgIKGhqFSoVKhUqFSo VKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhU qFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUIA0KW10gICChoSCh8aG+v84gs8wgzNggyauhvw0KW10g ICChoSDPocix0NSjurTLv85es8y9q8DNXravXreozOXPtbrN0L1es+pevKhe0Ke53MDtzOXPtb30 w9zP4L3hus+jrLn6xNq8q8nZs/bP1rTLwOC/zl6zzKGjDQpbXSAgIKGhINXrttTQ1KO6v85es8zE 2sjdvqvRocHLuf3IpTXE6sC01ve9ssDPyqbH19fUtKbA7bn9tcTH0tTasrvJ2dPDyMu1pc67xNqy v9Ky1Pi3osn6uf21xA0KW10gICChoSC0+rHt0NSwuMD9o6zV4tCpsLjA/c3qyKu3+7rP1tC5+s/W vde2zrXEtPO7t76ztPPG+Lryo6y8q77fss6/vNDUus3G9Lei0NShow0KW10gICChoSDKtdW90NSj usq11b3Js8XM0d3Bt6Os0afUscnuyOvLvL+80+uz5LfWu6W2r6OswM/KprrBsruxo8H0x+PE0s/g ytqju9Gn1LGw0bTtzvPB9NTaDQpbXSAgIKGhIL/OzMOjrLDR1f3It7XEudu146Git723qKGiuaS+ 36GivLzE3LT4u9jIpaGjDQpbXSAgIKGhIKHxob6/ziCzzCDK1SDS5qG/DQpbXSAgIKGhIDGhosir w+bBy73iXsDNXrav08O5pLn9s8y1xLeowsm358/Vo7sNCltdICAgoaEgMqGiwO294tPrXsDNXrav 08O5pNPQudi1xNX+st+3qMLJt6i55qO7DQpbXSAgIKGhIDOhosXg0fjUpLLioaK31s72XsDNXrav 08O5pLeowsm358/VtcTLvM6so7sNCltdICAgoaEgNKGi1cbO1dSkt8C6zdOmttS358/VtcTKtdW9 vLzE3Lywt723qLmkvt+hraGtDQpbXSAgIKGhqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhU qFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSo VKhUqFQgDQpbXSAgIKGhIKHx16IgIMP3o7q4w7/OL7PMMszszqrSu7j2taXUqqOsv827p7/JuPm+ 3dfUvLrQ6Mfz0aHU8bLOILzTQbWl1Kq78tXfQrWl1KqjrLvyQUK1pdSqvvmyziC806OsDQpbXSAg IKGhICAgICAgICAgICBBtaXUqtPrQrWl1KrE2sjdx+u/tM/Cw+a1xL/OL7PML7TzL7jZo6GjoaOh DQpbXSAgIKGhqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhU qFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFQgIKGhIA0KW10gICCh oSCh8SBBILWlINSqIL/OILPMILTzILjZo7qjqLmyMszso6wxNbj20tTJz76tteSwuMD9o6kNCltd ICAgoaEgDQpbXSAgIKGhINeozOLSu6O61dAtxrjI69awDQpbXSAgIKGhIDEuyOe6ztSkt8BewM1e tq/V37XEobDTpsa4xtvVqaGxo6zI57rO1qTD917AzV62r9XftcShsMbb1amhsaO/DQpbXSAgIKGh IDIu1dDK1dOmveyxz9K1yfqjrNOm16LS4sTE0KnPuL3azsrM4qO/DQpbXSAgIKGhIDMu1dDTw7Tv tb23qLaozcvQ3cTqweS1xMjL1LGjrNOm16LS4sTE0KnPuL3azsrM4qO/DQpbXSAgIKGhIDQu1dDT w7T9uNqhosTazcuhos2j0L3B9NawtcTIy9Sxo6zTptei0uLExNCpz7i92s7KzOKjvw0KW10gICCh oSA1Lsjr1rDM5bzs0OjXotLixMTQqc+4vdrOyszio78NCltdICAgoaEgNi7I69awx7C689PDyMu1 pc6706a45taqXsDNXrav1d/ExNCpx+m/9qOsyOe6zrGjwfTWpL7do78NCltdICAgoaEgNy6htsjr 1rC1x7zHse2ht8jnus7J6LzGo6yyxcTcxvC1vdSkt8C3qMLJt+fP1bXE1/fTw6O/DQpbXSAgIKGh IDguXsDNXrav1d/O3reozOG9u6G2wOvWsNakw/eht6OsuMPU9cO0sOyjvw0KW10gICChoSA5Lsbz 0rXI57rOyunQtKG2wrzTw82o1qrK6aG3o6zG5Leowsm358/V09DExNCpo78NCltdICAgoaEgDQpb XSAgIKGhINeozOK2/qO6wM1etq9eus9ezay2qcGiDQpbXSAgIKGhIDEu08PIy7WlzrvX1NDQxOK2 qLXEwM1etq9eus9ezazOxLG+yse38dPQ0KejrMrHt/HQ6NKqvfjQ0LG4sLijvw0KW10gICChoSAy Ll7AzV62r9Xfvei5ys3P0dO78r7cvvjHqbapwM1etq9eus9ezayjrNPDyMu1pc67yOe6ztOmttSj vw0KW10gICChoSAzLs60x6m2qcDNXravXrrPXs2so6zQ6NanuLa24LOkxtrP3rXEy6uxtrmk18qj v8rHt/HK3LW91tmyw8qx0Ke1xM/e1sajvw0KW10gICChoSA0LsDNXravXrrPXs2sxtrC+qOsvMzQ +MH008NewM1etq/V36OstavOtND4x6m6z82so6zKx7fx0rLQ6NanuLbLq7G2uaTXyqO/DQpbXSAg IKGhIDUuyrLDtMqxuvLOqtfuvNHKsbzko6zHqcrwwM1etq9eus9ezayhotPDuaTQrdLpo78NCltd ICAgoaEgNi63qMLJvfvWuTK0ztS8tqjK1NPDxtqjrMDNXravXrrPXs2sxtrP3rrNytTTw8baz964 w8jnus7UvLaoo78NCltdICAgoaEgNy7Tw8jLtaXOu8rVubrG5Mv71+nWr8qxo6zI57rO0+uxu73T ytW1xNSxuaTHqbapoaKx5Lj8wM1etq9eus9ezayjvw0KW10gICChoSA4LtOmt/HT68r009rWsNK1 vq3A7cjLtcS3qMjLtPqx7ceptqnAzV62r166z17NrKO/DQpbXSAgIKGhIA0KW10gICChoSDXqMzi yP2jusrUXtPDXsbaDQpbXSAgIKGhIDEuv8m38c/IytTTw7rzx6m6z82so6y/ybfxtaW2wMeptqnK 1NPDxtrQrdLpo78gDQpbXSAgIKGhIDIu1LG5pNb3tq/J6sfr0dOzpMrU08PG2qOsuMPU9dH5stnX 96OsssW55rHcxeKzpbfnz9Wjvw0KW10gICChoSAzLsrUXtPDXsbawvq687THzcvUsbmko6zX7snZ xeIyuPbUwrmk18qjrLjDyOe6zruvveKjvw0KW10gICChoSA0LsrUXtPDXsba1+6689K7zOy0x83L 1LG5pKOsxeKzpbjFwsrOqjdPJaOsyOe6zruvveKjvw0KW10gICChoSA1LsrUXtPDXsbawvrHsLy4 zOy0x83L1LG5pKOsxeKzpbjFwsrOqjVPJaOsyOe6zruvveKjvw0KW10gICChoSA2LrK7t/u6z8K8 08PM9bz+tcS3ts6nsPzAqMTE0KmjrMjnus7Iodak1qTD96O/DQpbXSAgIKGhIDcuobbK1F7Tw17G 2rTHzcvNqNaqyumht8jnus7K6dC0o6zS1LHcw+LOpbeoveKz/bXExeKzpb3wo78NCltdICAgoaEg OC6z9s/WobC+rbzD0NSyw9SxobHH6b/2o6zTxc/IssO19MrUXtPDXsbatcTQwtSxuaSjrLrPt6jC 8KO/DQpbXSAgIKGhIA0KW10gICChoSDXqMziy8Sjus7eucy2qMbaz97AzV62r166z17NrA0KW10g ICChoSAxLs7eucy2qMbaz97AzV62r166z17NrLW9tdfKx7K7ysfM+re5zeujrLvhsru74dT2vNPG 89K1s8mxvqO/DQpbXSAgIKGhIDIuzt65zLaoxtrP3sDNXravXrrPXs2sveKz/bXEzPW8/qGiwO3T ydPQxMTQqaO/DQpbXSAgIKGhIDMu08PIy7Wlzru+3L74x6m2qc7eucy2qMbaz97AzV62r166z17N rKOs09C6zrfnz9Wjvw0KW10gICChoSA0LseptqnBy7nMtqjG2s/ewM1etq9eus9ezay1xNSxuaSj rMbavOS5pNf3wNu8xsL6MU/E6qOsxNy38dKqx/O9q7nMtqjG2s/eus/NrLHkuPzOqs7eucy2qMba z966z82so78NCltdICAgoaEgNS7BrND4tqnBorb+tM65zLaoxtrP3sDNXravXrrPXs2stb3G2qOs 08PIy7WlzrvE3Lfx1tXWubrPzayju9SxuaTM4bP2x6m2qc7eucy2qMbaz966z82so6zTw8jLtaXO u8Tct/G+3L74o78NCltdICAgoaEgNi66z82sxtrC+l7AzV62r9Xf08nT2tK9wcbG2qGiyP3G2rXI 1K3S8tD40dPAzV62r166z17NrLW81sJewM1etq/V38Gs0Pi5pNf3wvrKrsTqo6xewM1etq/V38zh s/a2qcGizt65zLaoxtrP3sDNXg0KW10gICChoSAgILavXrrPXs2stcSjrNPDyMu1pc67xNy38b7c vvijvw0KW10gICChoSANCltdICAgoaEg16jM4s7lo7rM2Mri08O5pNCt0ukNCltdICAgoaEgMS7F 4F7Tlrf+zvHG2tPrwM1etq9eus9ezazG2s/e09C6zrK7zayjrMDNXravXrrPXs2sxtrP3tPrt/7O 8cbaz963osn6s+XNu8qxyOe6zsrK08Ojvw0KW10gICChoSAyLsXgXtOWt/7O8cbazrS1vcbao6y2 +MDNXravXrrPXs2stb3G2qOs08PIy7WlzrvW1da5wM1etq9eus9ezay1xKOsyse38cr009rM4cew veKz/cDNXravXrrPXs2so6zI57rOueax3KO/DQpbXSAgIKGhIDMuXsDNXrav1d/Rz9bYuf207bG7 veK5zaOs08PIy7WlzrvE3Lfx0sC+3bf+zvHG2tS8tqjSqsfzXsDNXrav1d/Wp7i2zqXUvL3wo78N CltdICAgoaEgNC7U2sqyw7TH6b/2z8KjrL/Jx6nK8L660rXP3tbG0K3S6aO/DQpbXSAgIKGhIDUu 1NrKssO0yrG68qOsxvPStbj809DW97avyKjHqcrwvrrStc/e1sbQrdLpo78NCltdICAgoaEgNi7O 3tS8tqi+rbzDsrmzpbXE1qe4tqOsvrrStc/e1sbKx7fx09DQp6O/DQpbXSAgIKGhIDcuvrrStc/e 1sa1xL6tvMOyubOltcSx6te8yOe6zr3ntqijvw0KW10gICChoSA4LtKqx/PUsbmksaPD3KOsxvPS tdDo0qrWp7i2saPD3Lmk18rC8KO/DQpbXSAgIKGhIDkuxa7WsLmk0N2y+rzZzeqxz7rzo6zUrbja zrvS0b6t09DG5Mv7zazKwri61PCjrMWu1rC5pLK7vdPK3NDCuNrOu6Oszqq0y7eiyfpewM1etq/V +dLpo6zG89K1uMPI57rOu6+94rfnz9Wjvw0KW10gICChoSAgIA0KW10gICChoSDXqMziwfmjul7A zV62r7nYz7W94rP91tXWuQ0KW10gICChoSAxLsurt73QrcnMveKz/cDNXravXrrPXs2ssqLUvLao 1qe4tsrKtbG1xL6tvMOyubOlo6zKwrrzXsDNXrav1d/Xt8zWvq28w7K5s6W1xLLutu6yv7fWo6zW 2bLDu/q5udPQv8nE3Nans9ZewM1etq/V3w0KW10gICChoSAgILXEy9/H86OsxvPStcjnus6x3MPi sLi8/rDcy9+jvw0KW10gICChoSAyLsTct/HT66GwyP3G2ri+xa6hoszYyuKxo7ukxtq85LXE1LG5 pKGx0K3JzL3is/2jrMjnus655rHct+fP1aO/DQpbXSAgIKGhIDMu1LG5pM60zOHHsDNPyNXNqNaq xvPStby019TQ0MDr1rCjrMbz0rXE3Lfxv9u89cbkuaTXyqO/DQpbXSAgIKGhIDQu1LG5pMzhvbu0 x9aw0MW687XEM0/M7MTao6zG89K1xfrXvMbkwOvWsKOsv8nE3NPQt+fP1aOsyOe6zruvveKjvw0K W10gICChoSA1LtSxuaTM4b27tMfWsNDFuvO1xDNPzOy686OsxvPStcX617zG5MDr1rCjrNKyv8nE 3NPQt+fP1aOsyOe6zruvveKjvw0KW10gICChoSA2LrbU09q7vLKh1LG5pKOsxNy38b3is/2jrMjn us6y2df3ssXE3L21tc23qMLJt+fP1aO/DQpbXSAgIKGhIDcuyrXQ0MSpzrvM1Myt1sajrNLUxKnO u8XFw/vOqtPJveK5zdSxuaSjrM35zfmxu8jPtqi3x7eoveK5zaOsxvPStbjDyOe6ztf2o6yyxbHc w+KwuLz+sNzL36O/DQpbXSAgIKGhIDgu0tShsNfp1q+83Lm5tffV+6Oszt66z8rKuNrOu7CyxcWh sc6q08m94rnN1LG5pKOsuNC+9bfHs6O3+7rPs6PA7aOstavN+c35sbvIz7aot8e3qL3iuc2jrMbz 0rW4w8jnus7X9rLFsdzD4rfnz9Wjvw0KW10gICChoSA5LtLUobC+rbzD0NSyw9SxobHD+9LlveK5 zdSxuaSjrLjQvvW3x7Ojt/u6z7OjwO2jrLWrzfnN+bG7yM+2qLfHt6i94rnNo6zG89K1uMPI57rO stnX96O/DQpbXSAgIKGhIDFPLqG2veKz/cDNXravXrrPXs2szajWqsrpobfI57n7se3K9rK7tbGj rM35zfmzyc6qXsDNXrav1d+08tOuudnLvrXE09DBptakvt2jrMbz0rW4w8jnus7K6dC0o6yyxbHc w+KwuLz+sNzL37b4s9ANCltdICAgoaEgICAgtaO3qMLJ1PDIzqO/DQpbXSAgIKGhIDExLr3is/3A zV62r166z17NrMewzrTNqNaqvLDV98fzuaS74bXE0uK8+6Osyse38bm5s8m3x7eoveKz/aO/DQpb XSAgIKGhIDEyLsDNXravXrrPXs2stb3G2rrzo6y+rbOjs/bP1rjD1tXWubXEzfy8x7DswO3W1da5 ytbQ+KOsuMPQ+MeptcTN/LzHsOzA7dD4x6nK1tD4o6zG5NL9t6K1xLfnz9W3x7OjtPOju8THw7TG 89K1uMMNCltdICAgoaEgICAgyOe6zrnmsdy358/Vo78NCltdICAgoaEgDQpbXSAgIKGhINeozOLG 36O6yedeu+FesaNez9Vet6gNCltdICAgoaEgMS7Tw8jLtaXOu83Px7fJ57Gjt9GjrNPQyrLDtLeo wsnU8MjOo78NCltdICAgoaEgMi7Tw8jLtaXOu7K71+O27r3JxMnJ57vhsaPP1cjnus60psDto78N CltdICAgoaEgMy7UsbmksrvUuNLiwvLJ57Gjo6yyotPrtaXOu8ep09DQrdLptcTH6b/2z8KjrLjD 0K3S6crHt/HT0NCno78NCltdICAgoaEgNC7K1NPDxtq85KOsyse38bHY0Ou9ycTJyee74bGjz9Wj vw0KW10gICChoSA1LsjnufvO3rLOsaOjrF7AzV62r9Xf0vK12sj9t73U8MjOsvrJ+rXE0r3BxrfR 08OjrMTct/HSqsfztaXOu7Goz/qjvw0KW10gICChoSA2Lsbz0rXQrdb6tMfWsNSxuaTGrcihyqfS tbGjz9W98KOs09DKssO0t6jCybfnz9Wjvw0KW10gICChoSA3LsWu1rC5pM60u+nPyNTQoaLOtLvp yfrT/dX50unI57rOtKbA7aO/DQpbXSAgIKGhIDguu7PU0MWu1rC5pMzhs/azpMba0N282bGjzKWj rNax1sHQ3s3qsvq82aOsuMPI57rO0K2197TLzsrM4qO/DQpbXSAgIKGhIA0KW10gICChoSDXqMzi sMujul7AzV62r9X50um0psDtDQpbXSAgIKGhIDEu08PIy7Wlzruw3MvftcTUrdLy1vfSqtPQxMTQ qaO/DQpbXSAgIKGhIDIu1tmyw7vyt6jUutTatKbA7bC4vP7KsaOsyOe6zsrK08O3qMLJt6i55qO/ DQpbXSAgIKGhIDMuyOe6zsXQtqjV/rLft6jCybeouea1xNCnwaa1yLy2o78gDQpbXSAgIKGhIDQu uau/qsnzwO21xL+qzaXQzsq9o6zT0LrOt+fP1aOsyOe6zrHcw+K358/Vo78NCltdICAgoaEgNS7J 6sfr1tmyw7XEyrHQp8jnus68xsvjo7vI57rOwO294qGwXsDNXrav1fnS6beiyfrWrsjVobGjvw0K W10gICChoSA2Lsjnus7K6dC0tPCx58rpo6zT0MTE0KnXotLiysLP7qO/DQpbXSAgIKGhIDcuv6rN pcbavOSjrNbK1qTT67HnwtvQ6NKq16LS4sTE0Km52Lz8zsrM4qO/DQpbXSAgIKGhIDguvtnWpNTw yM7I57rOt9bF5KOszt63qL7Z1qS1xLrzufvT0MTE0Kmjvw0KW10NCltdICAgoaGoVKhUqFSoVKhU qFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSo VKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFQgDQpbXSAgIKGhIEIgtaUg1KogxNogyN2jqDLM 7KOsMTW49tLUyc++rbXksLjA/aOpv827p7/JuPm+3dfUvLrQ6Mfz0aHU8bLOL7zTQbWl1Kq78tXf QrWl1KqjrLvyQUK1pdSqvvmyzi+80y4NCltdICAgoaEgDQpbXSAgIKGhINeozOLSu6O6vKhe0Kde udxewO3T67jazru199X7DQpbXSAgIKGhIA0KW10gICChoSAxLsbz0rW1pbe9tffV+7jazrujrNSx uaTN+c35v8mxu8bIveKz/brPzayyosv3xeK+rbzDsrmzpaOsyOe6zrnmsdyjvw0KW10gICChoSAy LrX3uNrKscO709DK6cPmyLfIz6Os1LG5pLW90MK42s67uaTX9zK49tTCuvPE3Lfx0qrH87vWuLS1 vdStuNrOu6O/DQpbXSAgIKGhIDMuv8m38bbUobDI/cbaxNqhscWu1rC5pL340NC197jaoaK199C9 o78NCltdICAgoaEgNC7UsbmkyM/NrLyoXtCnveG5+6OszqrKssO01NqhsLK7yqTIzrmk1/ehsdL9 t6K1xNX50unW0Lu5ysew3Mvfo78NCltdICAgoaEgNS7Oqsqyw7TG89K1uPm+3byoXtCnveG5+9an uLbUsbmkvKhe0KdevbG98KOs1+7W1bG7yM+2qLfHt6i/y7/buaTXyqO/DQpbXSAgIKGhIDYut6jC ycnPyOe6ztakw/dewM1etq/V36GwsrvE3MqkyM65pNf3obGjvw0KW10gICChoSA3LrbUvKhe0Kde v7xeusuyu7rPuPG1xNSxuaSjrMjnus66z7eotMfNy6O/DQpbXSAgIKGhIDguvKhe0KfV/cyst9ay vM35zfnHv9bGu6631jUltcTUsbmkzqqyu7rPuPHV36Osyse38brPt6ijvw0KW10gICChoSANCltd ICAgoaEg16jM4rb+o7pewM1etq+xqLPqoaLQvV6z6l64o17A+w0KW10gICChoSANCltdICAgoaEg MS65pNfK19y27rD8wKjExNCpuaTXysP3z7ijvw0KW10gICChoSAyLtDCvfjUsbmk0L3XyrncwO3O yszivLC0psDtvLzHyaO7DQpbXSAgIKGhIDMutffV+7mk1/e42s67uvOjrL/J0tS199X7XtC918qx 6te8wvCjvw0KW10gICChoSA0Lsjnus7NqLn90L1es+petffV+7SmwO3UsbmkyqfWsKGizqW8zbXI zsrM4qO/DQpbXSAgIKGhIDUu1rWw4MvjsrvL47zTsOCjvw0KW10gICChoSA2LrzTsOC807XjuaTX ytanuLazo7z7zvPH+KO/DQpbXSAgIKGhIDcu08PIy7WlzrvI57rOyei8xrmk18q5ubPJ0tS9tbXN vNOw4LfRs8mxvqO/DQpbXSAgIKGhIDguzrS+rdPDyMu1pc67sLLFxaOsXsDNXrav1d/X1NDQvNOw 4LXEo6zKx7fx0OjWp7i2vNOw4Lmk18qjvw0KW10gICChoSA5Ll7AzV62r9Xf1vfVxcjr1rDS1MC0 tcS807Dgt9GjrMjnus7TprbUo78NCltdICAgoaEgMTAuXsDNXrav1d/U2rmk1/fI1Vy3qLaovdq8 2cjVvNOw4KOsxNy38bCyxcWyudDdtviyu9Po1qe4trzTsOC30aO/DQpbXSAgIKGhIDExLrKhvNmh osTq0N282aGiu+m82aGisvq82aGiyaW82bXItcTP7crczPW8/rywuaTXyrT90/ax6te8o78NCltd ICAgoaEgMTIuwOvWsNSxuaTN+c35u9jNt9e3zNbE6tbVvbGjrNPQv8nE3LXDtb3Wp7PWo6zI57rO ueax3LjDt+fP1aO/DQpbXSAgIKGhIA0KW10gICChoSDXqMziyP2jus6lvM3OpbnmzsrM4tSxuaS0 psDtDQpbXSAgIKGhIA0KW10gICChoSAxLl7AzV62r9XfzfnN+b7cvvjHqcrVtKa31qGiveK5zc2o 1qrK6aOsyOe6ztOmttSjvw0KW10gICChoSAyLs7KzOLUsbmkzfnN+b7cvvjM4b27oba87MzWyumh t7vyt/HIz86lvM3OpbnmysLKtaOsxvPStbjDyOe6zsrVvK/WpL7do78NCltdICAgoaEgMy621NPa zqW8zdSxuaSjrNOmuMPU2sqyw7TKsbzkxNq0psDto78NCltdICAgoaEgNC7U9dH5wO294qGw0c/W 2M6lt7TTw8jLtaXOu7XEuebVwtbGtsihsVtdDQpbXSAgIKGhIDUuyOe6ztTaobazzbejzPXA/aG3 1tDD6Mr2obDSu7DjzqW8zaGxoaKhsL3P1tjOpbzNobG8sKGw0c/W2M6lvM2hsaO/DQpbXSAgIKGh IDYu1PXR+cDtveKhsNHP1tjKp9awo6zTqsu9zuix16OsuPjTw8jLtaXOu9Tss8nW2LTzy/C6pqGx o78NCltdICAgoaEgNy7I57rOvee2qKGw1ti088vwuqahsaOsobDW2LTzy/C6pqGxyse38bHY0OvM 5c/WzqrU7LPJ1rG907XEvq28w8vwyqejvw0KW10gICChoSA4Lsjnus7Xt76/obDRz9bYyqfWsKGi 0c/W2M6lvM3OpbnmobHV37XEt6jCydTwyM6jvw0KW10gICChoSA5LsTct/HWsb3Tuea2qKGwvfvW ubzm1rCjrLfx1PLK086q0c/W2M6lvM3OpbnmobGjvw0KW10gICChoSAxMC7Wsc/fsr/Dxb6twO3J w9fUv9rNt7THzcvUsbmko6zW2bLDu/q5uc35zfnIz7aoxvPStbfHt6i94rnNo6zG89K1uMPI57rO 1/ajrLLFsdzD4rC4vP6w3Mvfo78NCltdICAgoaEgMTEuXsDNXrav1d+yu7THtvix8KGizt65yr/1 uaSjrMi01vfVxbG7xvPStb/azbe94rnNo6zN+c35tcO1vdbZssO7+rm5tcTWp7PWo6zG89K1uMPI 57rO1/ajrLLFsdzD4rC4vP6w3Mvfo78NCltdICAgoaEgMTIuobDCvNL0wrzP86Gx1qS+3aOs1tmy w9Prt6hc1LrKx7fxsslc0MWju8bz0rXE2rK/T0HPtc2zyc+1xNfKwc/E3Lfx1/fOqtakvt3KudPD o7sNCltdICAgoaEgICAgtedc19Nc08pcvP6hosrWXLv6XLbMXNDFxNy38df3zqrWpL7dyrnTw6O/ DQpbXSAgIKGhIA0KW10gICChoSDXqMziy8Sjur6tvMOyubOlDQpbXSAgIKGhIA0KW10gICChoSAx LtPDyMu1pc670OjP8l7AzV62r9Xf1qe4tr6tvMOyubOltcTH6dDO09DExNCpo78NCltdICAgoaEg Mi7KssO0x+m/9s/C08PIy7WlzrvQ6NanuLbBvbG2tcS+rbzDsrmzpaO/DQpbXSAgIKGhIDMuXsDN Xrav1d+/ybfxzazKsc/y08PIy7WlzrvW99XFvq28w7K5s6W6zcXis6W98KO/DQpbXSAgIKGhIDQu vq28w7K5s6W8xsvjtcS7+cr9vLCx6te8yOe6zsi3tqijvw0KW10gICChoSA1Lr6tvMOyubOlxOrP 3tfuuN+yu7Osuf3Krrb+xOq1xMrK08O3ts6no78NCltdICAgoaEgNi7I57rOvMbL46G2wM0vtq8v us8vzawvt6iht8n60KfHsLrztcS+rbzDsrmzpcTqz96jvw0KW10gICChoSA3Lsjnus7A7b3iobDB +bj21MLS1MnPsrvC+tK7xOq1xKOssLTSu8TqvMbL46O7srvC+sH5uPbUwrXEo6zP8l7AzV62r9Xf 1qe4trDruPbUwrmk18q1xL6tvMOyubOlobGjvw0KW10gICChoSA4LsDNL7avL7rPL82sL7eou7e+ s8/CobA1MCW27s3ivq28w7K5s6W98KGxyse38bzM0PjKytPDo78NCltdICAgoaEgDQpbXSAgIKGh INeozOLO5aO6ueZe1cJe1sZetsihotSxXrmkXsrWXrLhDQpbXSAgIKGhIA0KW10gICChoSAxLsbz 0rXIy8Gm18rUtLncwO3M5c+11tDExNCpxNrI3bj6XsDNXravt6jT0LHYyLvBqs+1o78NCltdICAg oaEgMi7Iy8Gm18rUtKGiXsDNXrav08O5pLncwO3WxrbI06a4w7D8wKjExNCpsdixuMTayN2jvw0K W10gICChoSAzLtbGtqi55tXC1sa2yLXEs8zQ8tKqx/O4+NPDyMu1pc67tPjAtMTE0Km358/Vo6zI 57rO06a21KO/DQpbXSAgIKGhIDQut8e5+tPQ08PIy7WlzrvI57rO1+m9qKGw1rC5pLT6se2087vh obGjvw0KW10gICChoSA1Ls7e1r27r6GizfjC57uvsOy5q8/CtcS5q8q+o6y05tTaxMTQqbfnz9Wj vw0KW10gICChoSA2Lsjnus65q8q+u/K45taqo6y4/Lf7us/W2bLDu/LL38vPtcS+2dak0qrH86O/ DQpbXSAgIKGhIDcuuebVwl7Wxl62yMTct/G55raottTUsbmkvfjQ0L6tvMO0prejo78NCltdICAg oaEgOC655tXCXtbGXrbIzqW3tLeowsm3qLnmo6xewM1etq/V37/J0tSxu8bIveKz/bKiy/fIob6t vMOyubOlo6zI57rOt8C3tqO/DQpbXSAgIKGhIA0KW10gICChoSDXqMziwfmjurmkL8nLL7GjL8/V L8z1L8D9DQpbXSAgIKGhIA0KW10gICChoSAxLsr009q5pMnLt7bOp7XEx+nQztPQxMTQqaO/DQpb XSAgIKGhIDIusru1w8jPtqjOqrmkycu1xMfp0M7T0MTE0Kmjvw0KW10gICChoSAzLtT10fnA7b3i obDJz8/CsODNvtbQobGjrNT10fm/2NbGxtq85LXEt+fP1aO/DQpbXSAgIKGhIDQut6LJ+rmkycvK wrnKo6zTw8jLtaXOu9Dos9C1o8TE0Km30dPDo78NCltdICAgoaEgNS65pMnL1LG5pL3oucq+3L74 uLS5pKOsvei5yrK7ts/Q3bzZo6zI57rOtKbA7aO/DQpbXSAgIKGhIDYuttTT2rXayP23vdTss8m1 xLmkycvKwrnKo6xewM1etq/V38Tct/HSqsfz08PIy7WlzrvWp7i2uaTJy7T90/bT1s2syrHSqsfz tdrI/be91qe4tsjLye3Jy7qmxeKzpaO/DQpbXSAgIKGhIDcu08PIy7WlzrvE3Lfx0tTJzNK1saPP 1cDtxeK/7szmtPrWsLmkuaTJy8Xis6W0/dP2o78NCltdICAgoaEgOC63osn6uaTJy8rCucqjrMur t73Lvc/Cus294qOssrmzpdCt0um4w8jnus7HqbapssXT0NCno78NCltdICAgoaEgDQpbXSAgIKGh INeozOLG36O6wM0vzvEvxckvx7INCltdICAgoaEgDQpbXSAgIKGhIDEuwM3O8cXJx7LTw7mkxKPK vaOs09C6zsD7sdejrMD7tPO7ucrHsde086O/DQpbXSAgIKGhIDIuwM3O8cXJx7K6z9f30K3S6bHY 0OvXotLitcS358/Vz7i92tPQxMTQqaO/DQpbXSAgIKGhIDMu0MK3qM/CwM3O8cXJx7LD5sHZtcTW 99Kqt+fP1dPQxMTQqaO/DQpbXSAgIKGhIDQuxcnHsrmkobC12sj9x6mhscqxo6zE3Lfx0qrH88ep tqnO3rnMtqjG2s/ewM0vtq8vus8vzayjvw0KW10gICChoSA1LsTE0Km42s67v8nS1Mq508PFycey uaSjrLio1vrQ1KGiwdnKsdDUoaLM5rT60NTI57rOwO294tPrstnX96O/DQpbXSAgIKGhIDYu0MK5 5raottTT2s2suaTNrLPqzOGz9sTE0KnQwtKqx/OjrMjnus655rHczay5pM2ss+q358/Vo78NCltd ICAgoaEgNy6yydPDwM3O8cXJx7LTw7mkt73KvaOsxNy38dLstdiyzrGjo78NCltdICAgoaEgOC7T w7mktaXOu8jnus7Q0Mq5ttTFycey1LG5pLXEzcu7ubvyzcu7u8ioo78NCltdICAgoaEgOS7I57rO tKbA7c6lt7TTw7mktaXOu7nm1cLWxrbItcTFycey1LG5pKO/DQpbXSAgIKGhIDEwLtT10fm55rao xcnHstSxuaS1xLTH1rCzzNDyus3A69aw1PDIzqO/DQpbXSAgIKGhIDExLrK/t9bAzc7xuavLvrrc v8nE3MPmwdm52LHVzaPStaOs1K3AtLXExcnHsrmktcRewM1etq+52M+1yOe6zrSmwO2jvw0KW10g ICChoSAxMi7Stc7xzeKw/NPrwM3O8cXJx7K1xLG+1srH+LHw09DExNCpo78NCltdICAgoaEgMTMu yOe6zsm40aGz0LD8t72jrNDov7yy7MTE0KnPuL3a0qq146O/DQpbXSAgIKGhIDE0LtPDuaS1pc67 yOe6ztOmttTFyceyus/X99X50um6zV7AzV62r9X50umjvw0KW10gICChoahUqFSoVKhUqFSoVKhU qFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSo VKhUqFSoVKhUqFSoVKhUqFSoVKhUqFQNCltdICAgoaGhvteoX7zSX73pX8ncob/XyiDJ7iDAzSC2 ryC3qCDXqCC80iDW0y3TwC3ppg0KW10gICChoSAgIA0KW10gICChoSAgILn6xNrW+MP7XsDNXrav t6jT69SxuaS52M+1udzA7cq11b3XqLzSo6xewM1etq/W2bLD1LGjrLn6xNq12tK7zruzq7W8oaK0 q7KloaLKtcqpobC5+rzSoaGhoaGhICAgICAgDQpbXSAgIKGhIF7AzV62r7eo0+vG89K10L1es+pe vKhe0KfT0Lv61fu6z6GxtcTPyNDQ1d+jrLn6vNLIy8Gm18rUtLncwO3KptfKuPHIz9akxeAu0bW1 vMqmo6y5+sTa1K20tCAgICANCltdICAgoaEg0M2hosq11b3QzaGiucvOytDNtcTWsNK1xeAu0bXK pqGjuePW3crQyMvBptfK1LS6zcnnu+Gxo9XPvtahornjtqvKocjLwabXytS0udzA7dCtu+GhoiAg ICAgDQpbXSAgIKGhIMnu29rN4snMxvPStdCtu+G1yDVPtuC80tX+uK67+i65uaGixeAu0bW7+i65 uaGiucvOyrmry76hotDQ0rXQrbvhtcTHqdS8vbLKpqGizNjGuLnLzsqhoyAgIA0KW10gICChoSAg INbTwM/Kpr6rzahewM1etq/V/rLft6jCybeouea6zV7AzV62r9bZssOhosvfy8+zzNDyo6zJw7Ok XsDNXrav08O5pLfnz9W1xNPQ0KfUpLfA0+tewM1etq/V+aGhoaGhoSAgICAgIA0KW10gICChoSDS 6bC4vP61xL6r17zTprbUo6zJxtPasNFewM1etq+3qMLJt6i55tPrxvPStcjLwabXytS0udzA7dPQ u/rV+7rPo6zNqM/+xvPStV7AzV62r9X50um3wLe2oaGhoSAgICAgIA0KW10gICChoSC7+tbGtcS5 ub2ous1ewM1etq/Tw7mkudzA7czlz7W1xNDe1f3N6snGoaPW08DPyqa+rbOj1Nq/zbunsOy5q8/W s6GhosXgLtG1z9azoc6qv827p6Gi0acgICAgIA0KW10gICChoSDUsby0yrHG8LLdoaLJ87LpoaLQ 3rjEz+C52NbGtsihorrPzayhos7EyumjrLvyt9bO9r7fzOWwuLz+tcTTprbUy7zCt6O71tPAz8qm tsC1vbXEz9ahoaGhoaEgICAgICANCltdICAgoaEgs6G1xNeo0rW5prXXo6zDv7TOtrzTrrXDueO0 87/Nu6ehotGn1LG3otfUxNrQxLXEusPGwNPrMU9PJbXE0MW3/qOhDQpbXSAgIKGhoaEgDQpbXSAg IKGhICAg1tPAz8qm1PjIzteo1rBewM1etq/W2bLD1LGjrNT4u/GhsLnj1t3K0NPF0ONewM1etq/W 2bLD1LGhsbPGusWjrMnzxdBewM1etq/V+dLpsLi8/jRPT7bgIKGhoaGhoSAgICAgIA0KW10gICCh oSDX2qO7tPrA7V7AzV62r9X50uk1T0+24Nfao6yyztPru/LW97PW0L1es+pevKhe0KfXydGvz+7E vzJPtuC49qOsyfOy6c3qycYzT0+24LzSxvPStbXEyMvBpqGhoaGhoSAgICAgIA0KW10gICChoSDX ytS0udzA7bnm1cLWxrbIoaO49sjLs6TG2rWjyM4zT7bgvNKjqMDbvMYyT0+24LzSo6nG89K1tcTI y8Gm18rUtLncwO23qMLJucvOyqO70tTW08DPICANCltdICAgoaEgyqbB7M/OtcTXqLzSttPO6aOs s6TG2s6qxvPStczhualewM1etq+3qLOjxOq5y87KvLC499bW16jP7tfJ0a+3/s7xo6y/zbunwvrS 4rbIuN+07zk1JaGjICANCltdICAgoaEgMk9PNMTqv6rKvNbTwM/Kpsirufq497XY0bK9sl7AzV62 r7eooaJewM1etq+52M+1W12/zltds8yjrMrc0ubG89K1tO8zT09PT7zSo6zWsb3TytzS5tGn1LE3 T08gICANCltdICAgoaEgT0+24MjLo6zF4C7RtbXYtePJ5rywMk+24Lj2yqG74bPHytC8sNHYuqO1 2Mf4tPOzx8rQoaPW08DPyqa9q7/d1O+1xF7AzV62r9X+st+3qLnmyNzI68q1ICAgIA0KW10gICCh oSC8yrncwO2wuMD9tbHW0KOsvavIy8Gm18rUtLncwO3T617AzV62r7eo09C7+rXY1fu6z9Ta0rvG 8KO7Xr/OXrPMxNrI3ThPJc6q1ebKtbC4wP2hojJPJc6qICAgDQpbXSAgIKGhILHYsbi1xNbYteO3 qMz1o7vRp9Sxss7T68zWwtuhorultq+jrFtdv85bXbPMyfq2r9PQyKSjrMnuyOvHs7P2o6zKtdW9 0M2zrMe/o6zIw9Gn1LG8tMqx0acgICANCltdICAgoaEg1sLTw6OhW12/zltds8zC+tLitsi437Tv OTUlo6zW2rbg0afUsb75se3KvqO6obC12tK7tM7M/bW9yOe0y8q11b2hosq108Ohosq10Ke1xF7A zV62r7eov85bXbPMo6EgICANCltdICAgoaEg1tPAz8qmt8ezo87xyrWhorK7y7W9zKGiw7vT0MnM 0rXOtrXAo6zW1dPazP21vcHLyMPO0rK71Nm687vatcS+q7LKW12/zltds8yjoaGx1tPAz8qmz8i6 8yAgIA0KW10gICChoSDU2qG2yMvBptfK1LSht6GiobbEz7e9trzK0LGoobehoqG2uePW3cjVsaih t7XI16jStdTT1r6hosO9zOW3orHtXsDNXravudjPtcDgzsTVwjJPtuDGqqGjDQpbXSAgIKGhoaEg IA0KW10gICChoSDU+M6q0tTPwr/Nu6fM4bmp18nRr7nLzsqjqLfHuau/qltdv85bXaOpt/7O8aO6 1tC5+sjLytmhornjt6LS+NDQoaLQr7PMwsPQ0M34oaK7qramtaOxo6GiICAgIA0KW10gICChoSC9 qMno0vjQ0KGixanStdL40NChormkyczS+NDQoaLW0Mz6vK/NxaGiye7b2rv6s6GhorvGutPLrrXn v6q3oqGi1tDRzLyvzcWhosTP1MHO78H3oaKhoaGhoaEgICAgICANCltdICAgoaEg0MLEz7e9vK/N xaGiye7b2rCuyqm1wrnJt92hosnu29q/4bavyv3C66Gius/J+rS01bmhotbQuqO12LL6oaK3vdSy tdiy+qGi1um9rbzgwO2hotbpoaGhoaGhICAgICAgDQpbXSAgIKGhIL2tzbbXyqGiyP3QwrXYsvqh otH4yfrMw9Kp0rWhotK7xre67NKp0rWhor6n1Le8r83FoaK549bdtefQxaGiufrRts2o0MWhosvJ z8PA5Mb4oaLS5qGhoaGhoSAgICAgIA0KW10gICChoSC6o7yvzcWhos36tPO8r83FoaLW0NS2zu/B 96GiyNXqzdSwwdahosW3yrHBprf+17Chornj1t3K37n7vK/NxaGisNu07rn7ss3S+8Gsy/ihornj tquhoaGhoaEgICAgICANCltdICAgoaEgvbvNqLyvzcWhotbQyb27qsypoaLW6bqjv9qwtrnjs6Gh otfduuHM7LXYoaLJ37/atKzO8dTLyuS5ybfdoaKxsb6ptcPQxbzRus3SvcHGoaK358nxoaGhoaGh ICAgICAgDQpbXSAgIKGhILyvzcWhotbQ18m5pLPMvODA7aGiuePSqbyvzcWhorjfyr/P39K1oaLA +7qjvK/NxaGiu6+9qLyvzcWhosnu29rLrs7xvODA7aGi1Mu3oryvzcWhoqGhoaGhoSAgICAgIA0K W10gICChoSDQwrnjufq8yryvzcWhosPAtcS8r83FoaK9rcvVtPPIq7yvzcWhotHYuqO12LL6oaLJ 7tvau6rHyLPHoaLQxdS0vK/NxaGivqmzx7/YucmhotbQufoNCltdICAgoaEg08rV/i0tLS3Hp9Pg vNLG89K1oaMNCltdICAgoaGoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhU qFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUIKGh DQpbXSAgIKGhob6x6j3XvD230T3Tw6G/ss4gvNMgQSC1pSDUqqO6MjhPTyDUqiAvIDEgyMujrDVP T08g1KogLyAyIMjLo7sNCltdICAgoaEgICAgICAgICAgICAgICCyziC80yBCILWlINSqo7oyOE9P INSqIC8gMSDIy6OsNU9PTyDUqiAvIDIgyMujrCANCltdICAgoaEgICAgICAgICAgICAgICCyziC8 0yBBILrNIEIgtaUg1KqjujVPT08g1KogLyAxIMjLo6i6rF7Rp17PsF630aGi18pewc9et9Ghos7n XrLNoaKy6F61416hraGto6kNCltdICAgoaGoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSo VKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhU qFSoVKhUICAgIA0KW10gICChoaHvob6xsS2+qaG/ob7Jzy26o6G/sagtw/sttectu7A6ICCjz6Oy o7EtLSCjtSyjsSyjuCyjtyyjsyyjsiyjtSyjsA0KW10gICAgICAgob7J7i3b2qG/ob654y3W3aG/ sagtw/sttectu7A6ICCjz6O3o7WjtS0tIKO2LKOxLKOyLKO4LKO2LKOwLKO4LKOxDQpbXSChoSAg ICChvsGqLc+1LcjLob+hoVzV1CDQoSC941yhoVzA7iDQoSC941wgDQpbXSAgIKGhqFSoVKhUqFSo VKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhU qFSoVKhUqFSoVKhUqFSoVKhUqFSoVKhUqFSoVA0KW10gICChoaHxob7Rp1zUsVy21FzP86G/tq3K wrOkoaLX3L6twO2horix19y+rcDtoaLIy8Gm18rUtNfcvOAvvq3A7S/XqNSxvLDIy8rC0NDV/rnc wO3Iy9SxoaIguaS74bjJDQpbXSAgIKGhICAgICAgICAgICAgICAgICAgICAgICAgICAgICCyv6Gi t6jO8cjL1LG8sM/gudi53MDtyMvUsaGiz+C52MLJyqa1yKGj From Sales.69@fashion-business.com Mon Aug 29 06:47:34 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0EE2A7CA0 for ; Mon, 29 Aug 2016 06:47:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF7EC30404E for ; Mon, 29 Aug 2016 04:47:33 -0700 (PDT) X-ASG-Debug-ID: 1472471250-0bf57c1b092df60001-NocioJ Received: from fashion-business.com ([14.218.165.234]) by cuda.sgi.com with SMTP id yEmHf37bTnSqX3S4 for ; Mon, 29 Aug 2016 04:47:31 -0700 (PDT) X-Barracuda-Envelope-From: Sales.69@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.165.234] X-Barracuda-Apparent-Source-IP: 14.218.165.234 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Mon, 29 Aug 2016 19:45:22 +0800 From: "angelbervogue@sina.com" Subject: Re: ANGELBER bag will be sold in June of World-market To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: ANGELBER bag will be sold in June of World-market MIME-Version: 1.0 Sender: Sales.69@fashion-business.com Reply-To: angelbervogue@sina.com Date: Mon, 29 Aug 2016 19:45:22 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.165.234] X-Barracuda-Start-Time: 1472471250 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2113 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32420 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160829114733.1FC7D1940060@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJNQVJHSU4t Qk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTog QXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IEZPTlQtU0laRTogMTJwdDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+RGVhciZuYnNwO1B1cmNoYXNpbmcmbmJz cDtNYW5hZ2VyLDwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFz cz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5E OiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5 ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJn YigyNDYsMjQ2LDI0NikiPkhlcmUgDQppcyBBbmdlbG8gd2hvIGNvbWVzIGZyb20gQU5HRUxCRVIg Vk9HVUUgQ08uLCBMVEQ7IG91ciBjb21wYW55IGlzIGEgcHJvZmVzc2lvbmFsIA0KbWFudWZhY3R1 cmVyIGluIGRlc2lnbmluZyB3aXRoIHRoZSBiYWcgaW4gQ2hpbmEuIFRoZSBicmFuZCBvZiB1cyBp cyBBTkdFTEJFUiwgDQpvbmUgbmV3IGRlc2lnbiB3aWxsIGJlIHNob3duIGluIFdvcmxkLU1hcmtl dCBpbiBuZXh0IG1vbnRoLjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0 IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNL R1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRp bmc6IHJnYigyNDYsMjQ2LDI0NikiPklmIA0KeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgZGlz aWduLCBwbGVhc2UgY29udGFjdCB3aXRoIG1lIGZyZWVseSwgSSB3aWxsIHNlbmQgDQp0aGUgY2F0 YWxvZyB0byB5b3UgZm9yIGNoZWNraW5nLjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJP VFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPkIuIA0KV2lzaGVzLjwvU1BBTj48L1A+DQo8 UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05U LVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPkFuZ2VsbyAN Ckh1YW5nPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJNQVJHSU4tQk9UVE9NOiAwcHQiIGNsYXNzPU1z b05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJn YigyNDYsMjQ2LDI0Nik7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TOyBtc28tc2hhZGluZzogcmdiKDI0 NiwyNDYsMjQ2KSI+U2t5cGU6IA0KZGF2aWUxODE4MTg8L1NQQU4+PC9QPjwvQk9EWT48L0hUTUw+ DQoNCg== From Sales.37@fashion-business.com Mon Aug 29 07:24:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF45D7CA0 for ; Mon, 29 Aug 2016 07:24:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 301BAAC001 for ; Mon, 29 Aug 2016 05:24:42 -0700 (PDT) X-ASG-Debug-ID: 1472473479-0bf57c1b0b2f040001-NocioJ Received: from fashion-business.com ([14.218.165.234]) by cuda.sgi.com with SMTP id Qx0oznp0t970eMwM for ; Mon, 29 Aug 2016 05:24:39 -0700 (PDT) X-Barracuda-Envelope-From: Sales.37@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.165.234] X-Barracuda-Apparent-Source-IP: 14.218.165.234 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Mon, 29 Aug 2016 20:14:24 +0800 From: "angelbervogue@sina.com" Subject: Re: European style handbags of 2016 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: European style handbags of 2016 MIME-Version: 1.0 Sender: Sales.37@fashion-business.com Reply-To: angelbervogue@sina.com Date: Mon, 29 Aug 2016 20:14:24 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.165.234] X-Barracuda-Start-Time: 1472473479 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1999 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32421 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160829122441.B190F1940062@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT48U1BBTiBzdHlsZT0iRk9OVC1G QU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OyI+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 Ij5IZWxsbyZuYnNwO0ZyaWVuZCw8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OyI+PG86cD48 L286cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWxlZnQ+PFNQQU4gDQpz dHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OyI+SG93Jm5ic3A7YXJlJm5ic3A7eW91PyZuYnNwO1dlJm5ic3A7Z2V0Jm5i c3A7eW91ciZuYnNwO2luZm9ybWF0aW9uJm5ic3A7ZnJvbSZuYnNwO2ludGVybmV0LjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 Ij5XZSBzcGVjaWFsaXplZCANCmluIHZvZ3VlIGJhZyBzdWNoIGFzIEV1cm8tc3R5bGUuIG91ciBm YWN0b3J5IGhhcyBiZWVuIGNlcnRpZmllZCBieSBJU085MDAxLCANClJvSFMsIEVNUyBvcmdhbml6 YXRpb24sIE9FTSAmYW1wOyBPRE0gb3JkZXJzIGFjY2VwdCwgd2UgaGF2ZSBwcm9mZXNzaW9uYWwg DQpkZXNpZ25lciB0byBtYWtlIGRldmVsb3BtZW50IGFuZCBtYXJrZXQgcGVvcGxlIHRvIGNvbnRy b2wgaGUgbmV3IGZhc2hpb24gZmVsbGluZyANCmluIHRoZSBXb3JsZC1NYXJrZXQuIEFsbCB0aGUg cHJvZHVjdHMgYXJlIGZpbmlzaGVkIGJ5IGhhbmRtYWRlIG9mIGNyYWZ0c3Blb3BsZS4gDQpJZiB5 b3UgYXJlIGludGVyZXNlZCB3aXRoIHVzLCBwbGVhc2UgZnJlZSBsZXQgbWUga25vdywgSSB3aWxs IHNlbmQgdGhlIGNhdGFsb2cgDQp3aXRoIHRoZSZuYnNwO2RldGFpbHMgdG8geW91Jm5ic3A7IGZv ciBjaGVja2luZy48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWxlZnQ+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OyI+V2Ugd2lsbCBiZSBtb3JlIA0KdGhhbiBoYXBweSB0byBhc3Np c3QgeW91LjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiAN CnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7Ij5CLiANCldpc2hlczwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgYWxpZ249bGVmdD48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7Ij5BbmdlbG8gDQpIdWFuZzwvU1BB Tj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249bGVmdD48U1BBTiANCnN0eWxlPSJGT05U LUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7Ij5Ta3lwZTogDQpkYXZpZTE4MTgxODwvU1BBTj48L1A+PC9TUEFOPjwvQk9EWT48L0hUTUw+ DQoNCg== From Sales.11@fashion-business.com Mon Aug 29 08:15:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0451E7CA0 for ; Mon, 29 Aug 2016 08:15:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C8C478F8039 for ; Mon, 29 Aug 2016 06:15:54 -0700 (PDT) X-ASG-Debug-ID: 1472476548-0bf57b5311332940001-NocioJ Received: from fashion-business.com ([14.218.165.234]) by cuda.sgi.com with SMTP id NdbUg4BE5OGMcRvk for ; Mon, 29 Aug 2016 06:15:49 -0700 (PDT) X-Barracuda-Envelope-From: Sales.11@fashion-business.com X-Barracuda-Effective-Source-IP: UNKNOWN[14.218.165.234] X-Barracuda-Apparent-Source-IP: 14.218.165.234 Received: from MS-20160127DZCP[127.0.0.1] by MS-20160127DZCP[127.0.0.1] (SMTPD32); Mon, 29 Aug 2016 20:43:39 +0800 From: "angelbervogue@sina.com" Subject: Re: European style handbags of 2016 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: European style handbags of 2016 MIME-Version: 1.0 Sender: Sales.11@fashion-business.com Reply-To: angelbervogue@sina.com Date: Mon, 29 Aug 2016 20:43:39 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[14.218.165.234] X-Barracuda-Start-Time: 1472476548 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3451 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32422 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160829131554.99FB26430F2@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgOC4wMC43NjAxLjE5MTA0Ij48L0hFQUQ+DQo8Qk9EWT4NCjxQIHN0eWxlPSJNQVJHSU4t Qk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTj48QSANCmhyZWY9Imh0dHA6Ly9tYWls LjE2My5jb20vanM2LyI+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JP VU5EOiByZ2IoMjU1LDI1NSwyNTUpOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TSVpFOiAxMnB0 OyBURVhULURFQ09SQVRJT046IHVuZGVybGluZTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogVGFob21hOyB0ZXh0LXVuZGVybGluZTogc2luZ2xl OyBtc28tc2hhZGluZzogcmdiKDI1NSwyNTUsMjU1KSIgDQpjbGFzcz0xNT5EZWFyJm5ic3A7cHVy Y2hhc2luZyZuYnNwO21hbmFnZXImbmJzcDs8L1NQQU4+PC9BPjwvU1BBTj48U1BBTiANCnN0eWxl PSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5 O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj4mbmJzcDs8L1NQQU4+ PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+ LDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTog MHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBG T05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOWui+S9kyI+VGhpcyZuYnNwO2lzJm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5 bGU9IkZPTlQtRkFNSUxZOiBBcmlhbDsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPkFuZ2VsbyZuYnNw OzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0laRTogMTJw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TIj5mcm9tJm5ic3A7PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBBcmlh bDsgRk9OVC1TSVpFOiAxMnB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPkFuZ2VsYmVyJm5ic3A7Y29tcGFueTs8L1NQQU4+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0Niwy NDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0Niki PiZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULUZBTUlMWTogQXJpYWw7IEZPTlQtU0la RTogMTJwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZh bWlseTog5a6L5L2TIj48bzpwPjwvbzpwPjwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJP VFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFy aWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsg bXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0NikiPldlIA0KaGF2ZSBkZXNpZ25lZCBhIG5ldyBi YWcgZm9yIHRoZSBsYWRpZXMgTWFya2V0LCB1c2UgdGhlIEdlbnVpbmUgbGVhdGhlciB0byBzaG93 IA0KdGhlIGZhc2hpb24gc3R5bGU7IGl0IGlzIGEgbmV3IGFwcGxpY2F0aW9uIGZpZWxkLCB5b3Ug Y2FuIHVzZSBpdCB0byBzaG93IHRoZSANCmZhc2hpb24gYW5kIGVuam95IHRoZSBsaWZlLjwvU1BB Tj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0Niwy NDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0Niki PlRoZSANCmRldGFpbHMmbmJzcDt3aWxsIGJlIHNlbnQgdG8geW91IGlmIHlvdSB3YW50LjwvU1BB Tj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFzcz1Nc29Ob3JtYWw+PFNQ QU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JPVU5EOiByZ2IoMjQ2LDI0Niwy NDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6IHJnYigyNDYsMjQ2LDI0Niki PkIuIA0KV2lzaGVzITwvU1BBTj48L1A+DQo8UCBzdHlsZT0iTUFSR0lOLUJPVFRPTTogMHB0IiBj bGFzcz1Nc29Ob3JtYWw+PFNQQU4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsOyBCQUNLR1JP VU5EOiByZ2IoMjQ2LDI0NiwyNDYpOyBGT05ULVNJWkU6IDEycHQ7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLXNoYWRpbmc6 IHJnYigyNDYsMjQ2LDI0NikiPkFuZ2VsbyANCkh1YW5nPC9TUEFOPjwvUD4NCjxQIHN0eWxlPSJN QVJHSU4tQk9UVE9NOiAwcHQiIGNsYXNzPU1zb05vcm1hbD48U1BBTiANCnN0eWxlPSJGT05ULUZB TUlMWTogQXJpYWw7IEJBQ0tHUk9VTkQ6IHJnYigyNDYsMjQ2LDI0Nik7IEZPTlQtU0laRTogMTJw dDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog 5a6L5L2TOyBtc28tc2hhZGluZzogcmdiKDI0NiwyNDYsMjQ2KSI+U2t5cGU6IA0KZGF2aWUxODE4 MTg8L1NQQU4+PC9QPjwvQk9EWT48L0hUTUw+DQoNCg== From billodo@redhat.com Mon Aug 29 08:40:18 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4C5007CA0 for ; Mon, 29 Aug 2016 08:40:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1184B8F8033 for ; Mon, 29 Aug 2016 06:40:17 -0700 (PDT) X-ASG-Debug-ID: 1472478013-0bf8155c74302980001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qz56OcRQxMfwDiiY (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 06:40:13 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 752FDC057FA6 for ; Mon, 29 Aug 2016 13:40:13 +0000 (UTC) Received: from localhost.localdomain.com (vpn-60-194.rdu2.redhat.com [10.10.60.194]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TDeC8b010745 for ; Mon, 29 Aug 2016 09:40:13 -0400 From: "Bill O'Donnell" To: xfs@oss.sgi.com Subject: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Date: Mon, 29 Aug 2016 08:40:12 -0500 X-ASG-Orig-Subj: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-Id: <1472478012-23627-1-git-send-email-billodo@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 29 Aug 2016 13:40:13 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472478013 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1682 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commits b20b6c2 and 29647c8 modified xfs_quota for use on non-XFS filesystems. One modification in fs_initialise_mounts (paths.c) resulted in an xfstest fail (xfs/261), due to foreign fs paths entering the fs table. This patch reverts the behavior in fs_initialise_mounts back to skip populating the table with foreign paths, unless the -f flag is thrown in xfs_quota to set foreign_allowed true. Signed-off-by: Bill O'Donnell --- libxcmd/paths.c | 5 +++++ quota/init.c | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 4158688..7375c0e 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -34,6 +34,7 @@ extern char *progname; int fs_count; struct fs_path *fs_table; struct fs_path *fs_path; +bool foreign_allowed = false; /* foreign filesystems not allowed (default) */ char *mtab_file; #define PROC_MOUNTS "/proc/self/mounts" @@ -311,6 +312,10 @@ fs_table_initialise_mounts( return errno; while ((mnt = getmntent(mtp)) != NULL) { + /* don't populate if not XFS, and foreign fs disallowed */ + if ((strcmp(mnt->mnt_type, "xfs") != 0) && + !foreign_allowed) + continue; if (!realpath(mnt->mnt_dir, rmnt_dir)) continue; if (!realpath(mnt->mnt_fsname, rmnt_fsname)) diff --git a/quota/init.c b/quota/init.c index 44be322..65e4dad 100644 --- a/quota/init.c +++ b/quota/init.c @@ -24,7 +24,6 @@ char *progname; int exitcode; int expert; -bool foreign_allowed = false; static char **projopts; /* table of project names (cmdline) */ static int nprojopts; /* number of entries in name table. */ -- 2.7.4 From darrick.wong@oracle.com Mon Aug 29 09:53:26 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8A1C97CA0 for ; Mon, 29 Aug 2016 09:53:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5AE5B8F8033 for ; Mon, 29 Aug 2016 07:53:23 -0700 (PDT) X-ASG-Debug-ID: 1472482399-0bf57c1b0933750001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Kv61lUKbpbNQZ1a2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 07:53:19 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7TEqq0o015336 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 29 Aug 2016 14:52:53 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7TEqpxR003816 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 29 Aug 2016 14:52:52 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7TEqo4r016908; Mon, 29 Aug 2016 14:52:51 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Aug 2016 07:52:50 -0700 Date: Mon, 29 Aug 2016 07:52:49 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: Christoph Hellwig , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 Message-ID: <20160829145249.GF22760@birch.djwong.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 References: <20160826062508.GG19025@dastard> <20160826074844.GA17137@infradead.org> <20160829013111.GN19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829013111.GN19025@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472482399 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 866 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32424 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 29, 2016 at 11:31:12AM +1000, Dave Chinner wrote: > On Fri, Aug 26, 2016 at 12:48:44AM -0700, Christoph Hellwig wrote: > > Hi Dave, > > > > please consider: "[PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for > > extent based filesystems" > > > > for 4.8. It fixes a regression in the iomap-based fiemap > > implementation, and it's fairly trivial as well. > > Oh, damn, I thought I got that one. I'll append it to the > series and push it out. It might be a good idea to pick up "xfs: track log done items directly in the deferred pending work item" too, if it fixes the slab corruptions that Christoph reported. --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From darrick.wong@oracle.com Mon Aug 29 10:13:32 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 19CFD7CA0 for ; Mon, 29 Aug 2016 10:13:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3A9D304064 for ; Mon, 29 Aug 2016 08:13:28 -0700 (PDT) X-ASG-Debug-ID: 1472483605-0bf57c1b09340c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 5LxRVCt7U5Sgc1uy (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 08:13:26 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7TFDOsb009867 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 29 Aug 2016 15:13:25 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7TFDOI9011147 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 29 Aug 2016 15:13:24 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7TFDOHX032379; Mon, 29 Aug 2016 15:13:24 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Aug 2016 08:13:23 -0700 Date: Mon, 29 Aug 2016 08:13:23 -0700 From: "Darrick J. Wong" To: "Bill O'Donnell" Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160829151323.GG22760@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472478012-23627-1-git-send-email-billodo@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472483606 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2084 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32424 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > non-XFS filesystems. One modification in fs_initialise_mounts > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > fs paths entering the fs table. > > This patch reverts the behavior in fs_initialise_mounts back > to skip populating the table with foreign paths, unless the > -f flag is thrown in xfs_quota to set foreign_allowed true. > > Signed-off-by: Bill O'Donnell > --- > libxcmd/paths.c | 5 +++++ > quota/init.c | 1 - > 2 files changed, 5 insertions(+), 1 deletion(-) > > diff --git a/libxcmd/paths.c b/libxcmd/paths.c > index 4158688..7375c0e 100644 > --- a/libxcmd/paths.c > +++ b/libxcmd/paths.c > @@ -34,6 +34,7 @@ extern char *progname; > int fs_count; > struct fs_path *fs_table; > struct fs_path *fs_path; > +bool foreign_allowed = false; /* foreign filesystems not allowed (default) */ /me wonders if this would be better as a parameter to fs_table_initialise_mounts() ? --D > > char *mtab_file; > #define PROC_MOUNTS "/proc/self/mounts" > @@ -311,6 +312,10 @@ fs_table_initialise_mounts( > return errno; > > while ((mnt = getmntent(mtp)) != NULL) { > + /* don't populate if not XFS, and foreign fs disallowed */ > + if ((strcmp(mnt->mnt_type, "xfs") != 0) && > + !foreign_allowed) > + continue; > if (!realpath(mnt->mnt_dir, rmnt_dir)) > continue; > if (!realpath(mnt->mnt_fsname, rmnt_fsname)) > diff --git a/quota/init.c b/quota/init.c > index 44be322..65e4dad 100644 > --- a/quota/init.c > +++ b/quota/init.c > @@ -24,7 +24,6 @@ > char *progname; > int exitcode; > int expert; > -bool foreign_allowed = false; > > static char **projopts; /* table of project names (cmdline) */ > static int nprojopts; /* number of entries in name table. */ > -- > 2.7.4 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From billodo@redhat.com Mon Aug 29 10:43:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 578377CA0 for ; Mon, 29 Aug 2016 10:43:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25E61304066 for ; Mon, 29 Aug 2016 08:43:54 -0700 (PDT) X-ASG-Debug-ID: 1472485432-0bf57b5312337da0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iZx6dIewJEoIpZ0d (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 08:43:52 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 43B5AA1F40; Mon, 29 Aug 2016 15:43:52 +0000 (UTC) Received: from redhat.com (vpn-60-194.rdu2.redhat.com [10.10.60.194]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TFhnv8000752 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 29 Aug 2016 11:43:51 -0400 Date: Mon, 29 Aug 2016 10:43:49 -0500 From: "Bill O'Donnell" To: "Darrick J. Wong" Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160829154349.GA4643@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> <20160829151323.GG22760@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829151323.GG22760@birch.djwong.org> User-Agent: Mutt/1.7.0 (2016-08-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Mon, 29 Aug 2016 15:43:52 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472485432 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2427 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 29, 2016 at 08:13:23AM -0700, Darrick J. Wong wrote: > On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > > non-XFS filesystems. One modification in fs_initialise_mounts > > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > > fs paths entering the fs table. > > > > This patch reverts the behavior in fs_initialise_mounts back > > to skip populating the table with foreign paths, unless the > > -f flag is thrown in xfs_quota to set foreign_allowed true. > > > > Signed-off-by: Bill O'Donnell > > --- > > libxcmd/paths.c | 5 +++++ > > quota/init.c | 1 - > > 2 files changed, 5 insertions(+), 1 deletion(-) > > > > diff --git a/libxcmd/paths.c b/libxcmd/paths.c > > index 4158688..7375c0e 100644 > > --- a/libxcmd/paths.c > > +++ b/libxcmd/paths.c > > @@ -34,6 +34,7 @@ extern char *progname; > > int fs_count; > > struct fs_path *fs_table; > > struct fs_path *fs_path; > > +bool foreign_allowed = false; /* foreign filesystems not allowed (default) */ > > /me wonders if this would be better as a parameter to > fs_table_initialise_mounts() ? Hrmm, it could be, but my notion is that keeping it global is a bit cleaner than having to add automatics in 4 function calls. Thanks- Bill > > --D > > > > > char *mtab_file; > > #define PROC_MOUNTS "/proc/self/mounts" > > @@ -311,6 +312,10 @@ fs_table_initialise_mounts( > > return errno; > > > > while ((mnt = getmntent(mtp)) != NULL) { > > + /* don't populate if not XFS, and foreign fs disallowed */ > > + if ((strcmp(mnt->mnt_type, "xfs") != 0) && > > + !foreign_allowed) > > + continue; > > if (!realpath(mnt->mnt_dir, rmnt_dir)) > > continue; > > if (!realpath(mnt->mnt_fsname, rmnt_fsname)) > > diff --git a/quota/init.c b/quota/init.c > > index 44be322..65e4dad 100644 > > --- a/quota/init.c > > +++ b/quota/init.c > > @@ -24,7 +24,6 @@ > > char *progname; > > int exitcode; > > int expert; > > -bool foreign_allowed = false; > > > > static char **projopts; /* table of project names (cmdline) */ > > static int nprojopts; /* number of entries in name table. */ > > -- > > 2.7.4 > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From wrizzo@premium-yachts.com Mon Aug 29 12:06:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=FILL_THIS_FORM,HTML_MESSAGE, LOTS_OF_MONEY,MONEY_FORM,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B79E87CA0 for ; Mon, 29 Aug 2016 12:06:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85A2D304064 for ; Mon, 29 Aug 2016 10:06:37 -0700 (PDT) X-ASG-Debug-ID: 1472490386-0bf57b531133b1d0001-NocioJ Received: from srv.globalaviationsa.com (126-75.eport.gr [93.174.126.75]) by cuda.sgi.com with ESMTP id AhhjaTNvSrFfZKVS; Mon, 29 Aug 2016 10:06:27 -0700 (PDT) X-Barracuda-Envelope-From: wrizzo@premium-yachts.com X-Barracuda-Effective-Source-IP: 126-75.eport.gr[93.174.126.75] X-Barracuda-Apparent-Source-IP: 93.174.126.75 Received: from globalaviationsa.com (localhost [127.0.0.1]) by srv.globalaviationsa.com (Postfix) with ESMTPA id 202C4241136; Mon, 29 Aug 2016 20:05:54 +0300 (EEST) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=_95ae1b8045c1de85015f100ef882472a" Date: Mon, 29 Aug 2016 19:05:54 +0200 From: William Rizzo To: undisclosed-recipients:; Subject: Charter for September 15th - Reply-To: X-ASG-Orig-Subj: Charter for September 15th - Mail-Reply-To: Message-ID: <182fbf44d6c28ea594556f047f759053@globalaviationsa.com> X-Sender: wrizzo@premium-yachts.com User-Agent: Roundcube Webmail/0.8.7 X-Barracuda-Connect: 126-75.eport.gr[93.174.126.75] X-Barracuda-Start-Time: 1472490387 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5206 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.00 X-Barracuda-Spam-Status: No, SCORE=2.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC3_MV0579, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32426 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 2.00 BSF_SC3_MV0579 Custom rule MV0579 --=_95ae1b8045c1de85015f100ef882472a Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Dear Brokers, I am William, from Premium Yachts. We have 3 weeks charter request for Sept 15th, budget is 60,000.00 - 80,000.00 EUR It is a 7 persons group from Italy that wish to charter a private yacht to Turkey - Greece or to Montenegro and Italy , but wish to have 2 alternatives. 1st alternative would be just to take them to Croatia. 2nd alternative would be to take them to Turkey and Greece Croatia Montenegro , and then have an overnight on board. In that case we have to find a yacht with at least 8 cabins... Please view the attached document for more details of Yachts requested, the Charterer is a Celebrity. Charter for Sept 15th - 2016.scr [1] ​ WILLIAM RIZZO tel : +33 494 964 540 mob : +33 607 612 586 fax : +33 494 565 962 email : wrizzo@premium-yachts.com web: www.premium-yachts.com [2]   PREMIUM YACHTS – SARL MBCM RCS Frejus B 799 486 857 21 rue de la Ponche - F83990 SAINT-TROPEZ Siège social : 9bd Louis Blanc, 83990 St-Tropez Premium Yachts is the yacht charter branch of www.aypioss.com [3] Links: ------ [1] https://drive.google.com/file/d/0B2a2-P06mx5yNzVMMGFzUVdNTGc/view?usp=drive_web [2] http://www.premium-yachts.com/ [3] http://www.aypioss.com/ --=_95ae1b8045c1de85015f100ef882472a Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8

Dear Brokers,

I am William, from Premium Yachts. We have 3 weeks charter request for S= ept 15th, budget is 60,000.00 - 80,000.00 EUR

It is a 7 persons group from Italy that wish to charter a private yacht = to Turkey - Greece or to Montenegro and Italy , but wish to have 2 alternat= ives.

1st alternative would be just to take them to Croatia.

2nd alternative would be to take them to Turkey and Greece Croatia Monte= negro , and then have an overnight on board. In that case we have to find a= yacht with at least 8 cabins...

Please view the attached document for more details of Yachts requested, = the Charterer is a Celebrity.

=E2=80=8B

3D"Des=

William RIZZO

tel : +33 494 96= 4 540

mob : +33 607 612 586=

fax : +33 494 565 962

email : wrizzo@= premium-yachts.com

web: www.premium-yachts.com

 

Premium Yachts – SARL MBCM

RCS Frejus B 799 486 857

21 rue de la Ponche - F83990 SAINT-TROPEZ

Siège social : 9bd Louis Blanc, = 83990 St-Tropez

Premium Yachts is the yacht charter branch o= f <= span>www.aypioss.com

 

--=_95ae1b8045c1de85015f100ef882472a-- From bfoster@redhat.com Mon Aug 29 13:17:29 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BE1577CA0 for ; Mon, 29 Aug 2016 13:17:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 838AA8F8039 for ; Mon, 29 Aug 2016 11:17:26 -0700 (PDT) X-ASG-Debug-ID: 1472494644-0bf57b531233dfd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UaGBtZ0NrEOeNrll (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 11:17:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 49D477F7A6; Mon, 29 Aug 2016 18:17:24 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TIHNE6030987; Mon, 29 Aug 2016 14:17:23 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1FE0C1208AB; Mon, 29 Aug 2016 14:17:22 -0400 (EDT) Date: Mon, 29 Aug 2016 14:17:22 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: rework log recovery to submit buffers on LSN boundaries Message-ID: <20160829181721.GA54904@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: rework log recovery to submit buffers on LSN boundaries References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> <1470935467-52772-2-git-send-email-bfoster@redhat.com> <20160829011631.GK19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829011631.GK19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 29 Aug 2016 18:17:24 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472494645 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 9128 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 29, 2016 at 11:16:31AM +1000, Dave Chinner wrote: > On Thu, Aug 11, 2016 at 01:11:03PM -0400, Brian Foster wrote: > > The fix to log recovery to update the metadata LSN in recovered buffers > > introduces the requirement that a buffer is submitted only once per > > current LSN. Log recovery currently submits buffers on transaction > > boundaries. This is not sufficient as the abstraction between log > > records and transactions allows for various scenarios where multiple > > transactions can share the same current LSN. If independent transactions > > share an LSN and both modify the same buffer, log recovery can > > incorrectly skip updates and leave the filesystem in an inconsisent > > state. > > > > In preparation for proper metadata LSN updates during log recovery, > > update log recovery to submit buffers for write on LSN change boundaries > > rather than transaction boundaries. Explicitly track the current LSN in > > a new struct xlog field to handle the various corner cases of when the > > current LSN may or may not change. > > ..... > > > @@ -4221,8 +4223,39 @@ xlog_recover_process_ophdr( > > return 0; > > } > > > > + /* > > + * Recovered buffers are submitted for I/O on current LSN change > > + * boundaries. This is necessary to accommodate metadata LSN ordering > > + * rules of v5 superblock filesystems. > > + * > > + * Store the new current LSN in l_recovery_lsn as we cannot rely on > > + * either record boundaries or transaction boundaries alone to track LSN > > + * changes. This has several contributing factors: > > + * > > + * - Metadata LSNs are updated at buffer submission time. Thus, buffers > > + * can only be submitted safely once per current LSN value. > > + * - The current LSN is defined as the start cycle/block of the first > > + * record in which a transaction appears. > > + * - A record can hold multiple transactions. Thus, a transaction change > > + * does not guarantee a change in current LSN. > > + * - A transaction can span multiple records. Thus, a record change does > > + * not guarantee a change in current LSN. Consider the case where a > > + * record holds one small transaction and a subsequent that carries > > + * over to the next record. Both transactions share the same LSN as > > + * per the definition of the current LSN. > > + * > > + * In summary, this means we must track the current LSN independently > > + * and submit buffers for the previous LSN only when it has changed. > > + */ > > + if (log->l_recovery_lsn != trans->r_lsn) { > > + error = xfs_buf_delwri_submit(buffer_list); > > + if (error) > > + return error; > > + log->l_recovery_lsn = trans->r_lsn; > > + } > > I'm not sure this is the right place to be submitting buffers. We > can have multiple transactions open at once because the writing of > the transaction to the log is split into two parts: xlog_write() > which writes the changes to the log, and xfs_log_done() which writes > the commit record (via xlog_commit_record()) to close the > transaction. > > Hence we can get the situation where we have multiple open > transactions such as: > > CA CB CC CD > +---------+--------+--------+--+--+--------+-------+--+--+ > trans A trans B trans C trans C trans D > Ok, thanks for drawing this out. I hadn't thought about it from this angle... > where the changes in multiple transactions are written before the > ophdr that contains the commit record ("CA", "CB", ....) is written. > With the above code, we'd be doing writeback of A when we see B, not > when we see the commit record for A. Like wise B when we see C. And > worse, partial writeback of C when we see the commit record for A... > ... but I don't think that accurately describes the behavior here. At least, I'm not sure there is enough information presented to describe when buffers are going to be submitted because we don't have the mapping of transactions to records. That aside for a moment, the current recovery code makes a couple passes over the entire dirty log. The first pass is for management of cancelled items and thus not really relevant to this problem. The second pass constructs all of the transactions in memory and on XLOG_COMMIT_TRANS, we iterate all of the items in said transaction, perform recovery on the actual filesystem metadata buffers and submit the buffers for I/O. As you've outlined above, I believe this corresponds to the commit record as this flag is written out by xlog_commit_record(). Given that, this change can't cause writeback of A when we see B because the buffers for A still aren't read, recovered and queued for I/O until we see the commit record for A. Instead, what this change does is to defer the final I/O submission from commit record time until we see a metadata LSN change. This effectively means that the current "per transaction" buffer delwri queue becomes a "per metadata LSN" queue and ensures that a subsequent transaction that happens to use the same LSN and modify the same block(s) does not submit the buffer for write multiple times from contexts that would stamp the same metadata LSN. In other words, this change can be viewed as batching or "plugging" buffer submissions from commit records to subsequent metadata LSN updates. It doesn't actually reorder how transactions are recovered in any ways. Getting back to the example above, what should happen (in pass 2) is: - Allocate trans A and start populating ->r_itemq. - Allocate trans B and start populating ->r_itemq. - Allocate trans C and start populating ->r_itemq. [Note: buffer_list is still empty so any current LSN updates cause no actions to this point.] - Hit CR A, recover all of the items in trans A and queue the buffers onto buffer_list. Now that buffer_list is populated, the buffers will be submitted on the next metadata LSN change. - Hit CR B. We don't know what's going to happen to buffer_list here because the example doesn't define record context. We'll look up transaction B and if transaction B started in the same record as A, for example, we won't actually drain buffer_list. If they started in different records (e.g., different LSNs), we drain buffer_list and proceed. In either case, we perform recovery of the items in trans B and queue B's buffers to buffer_list. - We revisit trans C. Again, the starting LSN of trans C and B determine whether we drain buffer_list. Note that buffer_list still only contains buffers up through transaction B (i.e., possibly A as well) as we have not yet recovered or queued anything from transaction C. - Allocate trans D and start populating ->r_itemq. ... ... and so on until the end and we drain buffer_list from the last LSN in xlog_do_recovery_pass(). > i.e. We are very careful to write commit records in the correct > order because that is what determines recovery order, but we don't > care what order we write the actual contents of the checkpoints or > whether they interleave with other checkpoints. As such, ophdrs > change transactions and LSNs without having actually completed > recovery of a checkpoint. > > I think writeback should occur when all the transactions with a > given lsn have been committed. I'm not sure there's a simple way to > track and detect this, but using the ophdrs to detect a change of > lsn to trigger buffer writeback does not look correct to me at this > point in time. > That is precisely the intent of this patch. What I think could be a problem is something like the following, if possible: CA CB CC CD +---------+--------+--+-------+--+--------+-------+--+--+ trans A trans B trans C trans C trans D Assume that trans A and trans B are within the same record and trans C is in a separate record. In that case, we commit trans A which populates buffer_list. We lookup trans C, note a new LSN and drain buffer_list. Then we ultimately commit trans B, which has the same metadata LSN as trans A and thus is a path to the original problem if trans B happened to modify any of the same blocks as trans A. Do note however that this is just an occurrence of the problem with log recovery as implemented today (once we update metadata LSNs, and is likely rare as I haven't been able to reproduce corruption in many tries). If that analysis is correct, I think a straightforward solution might be to defer submission to the lookup of a transaction with a new LSN that _also_ corresponds with processing of a commit record based on where we are in the on-disk log. E.g.: if (log->l_recovery_lsn != trans->r_lsn && oh_flags & XLOG_COMMIT_TRANS) { error = xfs_buf_delwri_submit(buffer_list); ... } So in the above, we'd submit buffers for A and B once we visit the commit record for trans C. Thoughts? Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Mon Aug 29 13:17:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2431A7CA0 for ; Mon, 29 Aug 2016 13:17:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA4EC304039 for ; Mon, 29 Aug 2016 11:17:46 -0700 (PDT) X-ASG-Debug-ID: 1472494665-0bf57c1b0b3cc20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1VD9MeNuDJplP8oI (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 11:17:45 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 41926BAEC; Mon, 29 Aug 2016 18:17:45 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TIHiDt031226; Mon, 29 Aug 2016 14:17:45 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8E0F11208AB; Mon, 29 Aug 2016 14:17:43 -0400 (EDT) Date: Mon, 29 Aug 2016 14:17:43 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: don't warn on buffers not being recovered due to LSN Message-ID: <20160829181743.GB54904@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/5] xfs: don't warn on buffers not being recovered due to LSN References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> <1470935467-52772-4-git-send-email-bfoster@redhat.com> <20160829012514.GL19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829012514.GL19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 29 Aug 2016 18:17:45 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472494665 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2274 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 29, 2016 at 11:25:14AM +1000, Dave Chinner wrote: > On Thu, Aug 11, 2016 at 01:11:05PM -0400, Brian Foster wrote: > > The log recovery buffer validation function is invoked in cases where a > > buffer update may be skipped due to LSN ordering. If the validation > > function happens to come across directory conversion situations (e.g., a > > dir3 block to data conversion), it may warn about seeing a buffer log > > format of one type and a buffer with a magic number of another. > > > > This warning is not valid as the buffer update is ultimately skipped. > > This is indicated by a current_lsn of NULLCOMMITLSN provided by the > > caller. As such, update xlog_recover_validate_buf_type() to only warn in > > such cases when a buffer update is expected. > > > > XXX: other issues here? better to not validate in such cases? > > I think this is OK - we really want to ensure that buffers that are > in cache always have the correct verifier attached to them. Hence if > we've read the buffer in, even if we are not modifying it because > it's more recent that what is being replayed we should still attach > the verifiers to it. > > If it changes type due to later recovery replay, we'll change the > verifier appropriately at that point. > Sounds good, thanks for commenting on this. > > @@ -2557,6 +2542,16 @@ xlog_recover_validate_buf_type( > > xfs_blft_from_flags(buf_f)); > > break; > > } > > + > > + /* > > + * A NULL current LSN indicates the buffer update is skipped due to LSN > > + * ordering. Don't warn in such cases, we skip the update for a reason > > + * (it's no longer valid)! > > + */ > > I read that the first time as "we skip the update for a reason that > is no longer valid" :P > Heh, Ok. > perhaps rework this to make it clear what is being referred to here. > e.g. No need to warn if the the buffer contents are more recent > that this recovery item and hence recovery did not modify the > buffer. > Yeah, I'll try to make that more clear. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 29 13:17:58 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AD4EF7CAF for ; Mon, 29 Aug 2016 13:17:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F662AC002 for ; Mon, 29 Aug 2016 11:17:55 -0700 (PDT) X-ASG-Debug-ID: 1472494674-0bf81509b0305530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ttFbGW47p5cp965H (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 11:17:54 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 001C84E4C5; Mon, 29 Aug 2016 18:17:54 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TIHr91004646; Mon, 29 Aug 2016 14:17:53 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4F4F41208AB; Mon, 29 Aug 2016 14:17:52 -0400 (EDT) Date: Mon, 29 Aug 2016 14:17:52 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: update metadata LSN in buffers during log recovery Message-ID: <20160829181751.GC54904@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: update metadata LSN in buffers during log recovery References: <1470935467-52772-1-git-send-email-bfoster@redhat.com> <1470935467-52772-5-git-send-email-bfoster@redhat.com> <20160829012923.GM19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829012923.GM19025@dastard> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 29 Aug 2016 18:17:54 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472494674 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1905 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 29, 2016 at 11:29:23AM +1000, Dave Chinner wrote: > On Thu, Aug 11, 2016 at 01:11:06PM -0400, Brian Foster wrote: > > @@ -2552,6 +2562,27 @@ xlog_recover_validate_buf_type( > > xfs_warn(mp, warnmsg); > > ASSERT(0); > > } > > + > > + /* > > + * We must update the metadata LSN of the buffer as it is written out to > > + * ensure that older transactions never replay over this one and corrupt > > + * the buffer. This can occur if log recovery is interrupted at some > > + * point after the current transaction completes, at which point a > > + * subsequent mount starts recovery from the beginning. > > + * > > + * Write verifiers update the metadata LSN from log items attached to > > + * the buffer. Therefore, initialize a bli purely to carry the LSN to > > + * the verifier. We'll clean it up in our ->iodone() callback. > > + */ > > + if (bp->b_ops && current_lsn != NULLCOMMITLSN) { > > + struct xfs_buf_log_item *bip; > > + > > + ASSERT(!bp->b_iodone || bp->b_iodone == xlog_recover_iodone); > > + bp->b_iodone = xlog_recover_iodone; > > + xfs_buf_item_init(bp, mp); > > + bip = bp->b_fspriv; > > + bip->bli_item.li_lsn = current_lsn; > > + } > > } > > Of, so now we have two things we do when current_lsn != > NULLCOMMITLSN. I'd change this to something like: > > > ASSERT(bp->b_fspriv == NULL); > if (current_lsn == NULLCOMMITLSN) > return; > > if (warn) { > .... > } > > if (!bp->b_ops) > return > > /* add buf_item */ Ok, I may still invert the bp->b_ops check as that seems more clear to me for whatever reason, but otherwise that looks like a nice cleanup. Thanks. Brian > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon Aug 29 18:12:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3FBFD7CA0 for ; Mon, 29 Aug 2016 18:12:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B4797AC002 for ; Mon, 29 Aug 2016 16:12:12 -0700 (PDT) X-ASG-Debug-ID: 1472512328-0bf57b5312355870001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vvAGGBNRU5iJWZvM for ; Mon, 29 Aug 2016 16:12:10 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjweAPS/xFd5LDUCEGdsb2JhbABcHAEFAYMqAQEBAQEegVOCeYN5nBoBAQEBAQEGjHGGFYQQhhcEAgKBXU0BAgEBAQEBAgYBAQEBAQEBATdAhGIBAQQ6HCMQCAMYCSUPBSUDBxoTiD++AwEBCAIlHoVIhRWKHAWZT48hgWGNfkiLfIN5gzuBRyo0hxYBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Aug 2016 08:42:06 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beVio-0002MN-2C; Tue, 30 Aug 2016 09:12:06 +1000 Date: Tue, 30 Aug 2016 09:12:06 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160829231205.GO19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472478012-23627-1-git-send-email-billodo@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472512328 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 430 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > non-XFS filesystems. One modification in fs_initialise_mounts > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > fs paths entering the fs table. What's the failure? I'm not seeing it here on any of my test machines... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 29 18:16:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 87A5C7CA0 for ; Mon, 29 Aug 2016 18:16:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 005FDAC002 for ; Mon, 29 Aug 2016 16:16:53 -0700 (PDT) X-ASG-Debug-ID: 1472512611-0bf81509b031c720001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id D0FUBwezjuHsEw7E for ; Mon, 29 Aug 2016 16:16:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlgfACHBxFd5LDUCEGdsb2JhbABcHAEBBAEBgykBAQEBAR6BU4J5g3mcGgEBAQEBAQaMcYYVhBCGFwICAQECgV1NAQIBAQEBAQIGAQEBAQEBAQE3QIRiAQEEOhwjEAgDGAklDwUlAwcaE4g/vgcBAQEHAgEkHoVIhRWEEBeFdQWZT48hgXeIEYVXSIt8g3mDO4FHKjSEaAElgggBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Aug 2016 08:46:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beVnN-0002Ms-Ky; Tue, 30 Aug 2016 09:16:49 +1000 Date: Tue, 30 Aug 2016 09:16:49 +1000 From: Dave Chinner To: Bill O'Donnell Cc: "Darrick J. Wong" , xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160829231649.GP19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> <20160829151323.GG22760@birch.djwong.org> <20160829154349.GA4643@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829154349.GA4643@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472512611 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1960 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 29, 2016 at 10:43:49AM -0500, Bill O'Donnell wrote: > On Mon, Aug 29, 2016 at 08:13:23AM -0700, Darrick J. Wong wrote: > > On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > > > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > > > non-XFS filesystems. One modification in fs_initialise_mounts > > > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > > > fs paths entering the fs table. > > > > > > This patch reverts the behavior in fs_initialise_mounts back > > > to skip populating the table with foreign paths, unless the > > > -f flag is thrown in xfs_quota to set foreign_allowed true. > > > > > > Signed-off-by: Bill O'Donnell > > > --- > > > libxcmd/paths.c | 5 +++++ > > > quota/init.c | 1 - > > > 2 files changed, 5 insertions(+), 1 deletion(-) > > > > > > diff --git a/libxcmd/paths.c b/libxcmd/paths.c > > > index 4158688..7375c0e 100644 > > > --- a/libxcmd/paths.c > > > +++ b/libxcmd/paths.c > > > @@ -34,6 +34,7 @@ extern char *progname; > > > int fs_count; > > > struct fs_path *fs_table; > > > struct fs_path *fs_path; > > > +bool foreign_allowed = false; /* foreign filesystems not allowed (default) */ > > > > /me wonders if this would be better as a parameter to > > fs_table_initialise_mounts() ? > > Hrmm, it could be, but my notion is that keeping it global > is a bit cleaner than having to add automatics in 4 > function calls. For some definition of "cleaner" (i.e. less code change), yes. However, hiding behavioural state in library globals hides the connection between the program code that sets it and the library code that uses it. It's better to explicitly pass function behaviour control parameters as function parameters, that way you can just follow the call chain to know what is supposed to be happening as you read the source.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 29 18:23:47 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CFA6F7CA0 for ; Mon, 29 Aug 2016 18:23:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 91B178F804C for ; Mon, 29 Aug 2016 16:23:44 -0700 (PDT) X-ASG-Debug-ID: 1472513021-0bf8155c74325210001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id kxeKE2qRzt42ffE4 for ; Mon, 29 Aug 2016 16:23:42 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjMbAGTDxFd5LDUCEGdsb2JhbABcGwEBAQMBAQGDKQEBAQEBHoFTgnmDeZwaAQEBAQEBBoxxhhWEEIYXBAICgV1NAQIBAQEBAQIGAQEBAQEBAQE3QIRiAQEEOhwjEAgDGAklDwUlAwcaE4g/vgoBAQEHAgEkHoVIhRWKHAWZT48hgXeEXYkLjESDeYUCKjSHFgEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Aug 2016 08:53:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beVtU-0002Nn-Qx; Tue, 30 Aug 2016 09:23:08 +1000 Date: Tue, 30 Aug 2016 09:23:08 +1000 From: Dave Chinner To: "Darrick J. Wong" Cc: Christoph Hellwig , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 Message-ID: <20160829232308.GQ19025@dastard> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 References: <20160826062508.GG19025@dastard> <20160826074844.GA17137@infradead.org> <20160829013111.GN19025@dastard> <20160829145249.GF22760@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829145249.GF22760@birch.djwong.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472513021 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1043 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 29, 2016 at 07:52:49AM -0700, Darrick J. Wong wrote: > On Mon, Aug 29, 2016 at 11:31:12AM +1000, Dave Chinner wrote: > > On Fri, Aug 26, 2016 at 12:48:44AM -0700, Christoph Hellwig wrote: > > > Hi Dave, > > > > > > please consider: "[PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for > > > extent based filesystems" > > > > > > for 4.8. It fixes a regression in the iomap-based fiemap > > > implementation, and it's fairly trivial as well. > > > > Oh, damn, I thought I got that one. I'll append it to the > > series and push it out. > > It might be a good idea to pick up "xfs: track log done items directly > in the deferred pending work item" too, if it fixes the slab > corruptions that Christoph reported. Doesn't apply cleanly to the 4.8 tree, and the xfs_defer_finish() code is quite different, so you'll need to rebase and resend that patch if you think it needs to be applied to the 4.8-rc kernel. I can always send it to Linus later. Cheers, Dave. -- Dave Chinner david@fromorbit.com From billodo@redhat.com Mon Aug 29 18:26:19 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AEB657CA0 for ; Mon, 29 Aug 2016 18:26:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E916AC004 for ; Mon, 29 Aug 2016 16:26:19 -0700 (PDT) X-ASG-Debug-ID: 1472513178-0bf8155c743255d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UI0Hmv4ikOPZk7on (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 16:26:18 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id F007E37F1F; Mon, 29 Aug 2016 23:26:17 +0000 (UTC) Received: from redhat.com (vpn-60-194.rdu2.redhat.com [10.10.60.194]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TNQFbC021141 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 29 Aug 2016 19:26:17 -0400 Date: Mon, 29 Aug 2016 18:26:15 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160829232615.GA29648@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> <20160829231205.GO19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829231205.GO19025@dastard> User-Agent: Mutt/1.7.0 (2016-08-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Mon, 29 Aug 2016 23:26:18 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472513178 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 874 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 30, 2016 at 09:12:06AM +1000, Dave Chinner wrote: > On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > > non-XFS filesystems. One modification in fs_initialise_mounts > > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > > fs paths entering the fs table. > > What's the failure? I'm not seeing it here on any of my test > machines... On my box, there are a few ext4 mounts, and test xfs/261 populates the fs table with those paths. So when xfs_quota commands in 261 are executed, a "foreign filesystem" message is thrown. My first notion was to add a -f to the xfs_quota command in 261, but then I decided it was better to change the xfsprogs code back to the old behavior. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Mon Aug 29 18:27:06 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2297B7CA0 for ; Mon, 29 Aug 2016 18:27:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D82C1304043 for ; Mon, 29 Aug 2016 16:27:02 -0700 (PDT) X-ASG-Debug-ID: 1472513220-0bf8155c743256e0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id SaAyzGgi3mCrtXVz for ; Mon, 29 Aug 2016 16:27:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak0jAGTDxFd5LDUCEGdsb2JhbABcGgEBARYBAQGDFwEBAQEBHld8gnmDeZwCAgoMAQEBAQEBBoEQAYtghhWEEByFewSBYU0BAgEBAQEBAgYBAQEBAQEBATdAhT47JDQFJQMHGxKIP74tDh6FSIwfC4MHBZQIhUeGIIkBgWGNfAKQPYI2DAGCPyo0hxYBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Aug 2016 08:56:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beVxD-0002PD-1z; Tue, 30 Aug 2016 09:26:59 +1000 Date: Tue, 30 Aug 2016 09:26:59 +1000 From: Dave Chinner To: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: [ANNOUNCE] xfs: for-next branch updated to 17de0a9 Message-ID: <20160829232658.GR19025@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to 17de0a9 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Sw7tCqrGA+HQ0/zt" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472513220 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 610 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) --Sw7tCqrGA+HQ0/zt Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated. -Dave. The new head of the for-next branch is commit: 17de0a9 iomap: don't set FIEMAP_EXTENT_MERGED for extent based filesystems New Commits: Christoph Hellwig (1): [17de0a9] iomap: don't set FIEMAP_EXTENT_MERGED for extent based file= systems Code Diffstat: fs/iomap.c | 5 ++++- include/linux/iomap.h | 8 +++++++- 2 files changed, 11 insertions(+), 2 deletions(-) --=20 Dave Chinner david@fromorbit.com --Sw7tCqrGA+HQ0/zt Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXxMTCAAoJEK3oKUf0dfodhAUP/jcofy10tyqEdkXshhC9GLlF 4Kls0FWopRHhKxbr3ahH5NxQhHmNGOv2ZIzUF7+T3j4gxAzvA8JiNgIxIoU6iw5x OxzYl+IrGzEfMSB8H9LGEPJLeFkEc3tggkfqYjB0CFMciIU8UqH0FcvrxhcgQnJf kVs6kqYzo4bKTuRGd6agA18rqi/KrI+yQap1xLzvoxWhtS6UWFKke8gWrxN8wws3 6ncEGQekn9r6EnYTtVynUhA+ML9q7anOEyRmIj5LVQCiK2k9rEZLdyB4LiyWP6hg iZCqk/Up9OEKG8M4D0D8+XnMywFB2cCuEekTy72iT5dJA8h93IBicmpic1h4UvcT eT3FZ0kV6aWGAtxYSHwy4O/hNIUT0A7O+HjjT88GvJK5/m2i6fcg56jB9J/CPFhc nVUikXxGz3wxkm7QvXIBY8b5lMYZ0QPb1g/sehCRVFTG2aSdBAVY00hObkEzWJZc reuUrXmcsn2z/5lSvxYxzlszakJ12LDFRrlbxqXX29nnmPXwy0RdRCt4LD5z63xE 5cpFNBC4X9ZrqhC2JBcnf+Al7k2OkW/j8KLKbyJnT7mekk5l0rLRcKThfigrAjjo FAn3OAaUrqeBXEpeV4YZIUoytwB0Lf/vAZUf43xjj41ny3tzi+wkd+G/SnBuazEH 9sz+1FLCn1dUwDr46OeS =d/eI -----END PGP SIGNATURE----- --Sw7tCqrGA+HQ0/zt-- From billodo@redhat.com Mon Aug 29 18:28:11 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5719F7CA0 for ; Mon, 29 Aug 2016 18:28:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8D16AC004 for ; Mon, 29 Aug 2016 16:28:10 -0700 (PDT) X-ASG-Debug-ID: 1472513288-0bf57c1b0851130001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v7hEGK7beaEwUM4K (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 16:28:09 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AC9D4821C7; Mon, 29 Aug 2016 23:28:08 +0000 (UTC) Received: from redhat.com (vpn-60-194.rdu2.redhat.com [10.10.60.194]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TNS611001962 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 29 Aug 2016 19:28:08 -0400 Date: Mon, 29 Aug 2016 18:28:06 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: "Darrick J. Wong" , xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160829232806.GB29648@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> <20160829151323.GG22760@birch.djwong.org> <20160829154349.GA4643@redhat.com> <20160829231649.GP19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829231649.GP19025@dastard> User-Agent: Mutt/1.7.0 (2016-08-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 29 Aug 2016 23:28:08 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472513289 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2291 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 30, 2016 at 09:16:49AM +1000, Dave Chinner wrote: > On Mon, Aug 29, 2016 at 10:43:49AM -0500, Bill O'Donnell wrote: > > On Mon, Aug 29, 2016 at 08:13:23AM -0700, Darrick J. Wong wrote: > > > On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > > > > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > > > > non-XFS filesystems. One modification in fs_initialise_mounts > > > > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > > > > fs paths entering the fs table. > > > > > > > > This patch reverts the behavior in fs_initialise_mounts back > > > > to skip populating the table with foreign paths, unless the > > > > -f flag is thrown in xfs_quota to set foreign_allowed true. > > > > > > > > Signed-off-by: Bill O'Donnell > > > > --- > > > > libxcmd/paths.c | 5 +++++ > > > > quota/init.c | 1 - > > > > 2 files changed, 5 insertions(+), 1 deletion(-) > > > > > > > > diff --git a/libxcmd/paths.c b/libxcmd/paths.c > > > > index 4158688..7375c0e 100644 > > > > --- a/libxcmd/paths.c > > > > +++ b/libxcmd/paths.c > > > > @@ -34,6 +34,7 @@ extern char *progname; > > > > int fs_count; > > > > struct fs_path *fs_table; > > > > struct fs_path *fs_path; > > > > +bool foreign_allowed = false; /* foreign filesystems not allowed (default) */ > > > > > > /me wonders if this would be better as a parameter to > > > fs_table_initialise_mounts() ? > > > > Hrmm, it could be, but my notion is that keeping it global > > is a bit cleaner than having to add automatics in 4 > > function calls. > > For some definition of "cleaner" (i.e. less code change), yes. > > However, hiding behavioural state in library globals hides the > connection between the program code that sets it and the library > code that uses it. It's better to explicitly pass function behaviour > control parameters as function parameters, that way you can just > follow the call chain to know what is supposed to be happening as > you read the source.... Agreed. I thought about it today, and it is indeed "safer" and better understood to use arguments instead of an external variable. I'll fix it. Thanks- Bill > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From Sales.63@xinhui.com Mon Aug 29 18:33:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CC5AE7CA0 for ; Mon, 29 Aug 2016 18:33:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5A4C7AC002 for ; Mon, 29 Aug 2016 16:33:18 -0700 (PDT) X-ASG-Debug-ID: 1472513594-0bf8155c77325f90001-NocioJ Received: from xinhui.com ([218.58.172.234]) by cuda.sgi.com with SMTP id 9H2s9C4s6xIlfgo2 for ; Mon, 29 Aug 2016 16:33:15 -0700 (PDT) X-Barracuda-Envelope-From: Sales.63@xinhui.com X-Barracuda-Effective-Source-IP: UNKNOWN[218.58.172.234] X-Barracuda-Apparent-Source-IP: 218.58.172.234 Received: from PC-20160114ISKQ[127.0.0.1] by PC-20160114ISKQ[127.0.0.1] (SMTPD32); Mon, 29 Aug 2016 17:41:37 +0800 From: "yihedianqi010@163.com" Subject: =?UTF-8?B?UkXvvJs=?= poultry fan To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?UTF-8?B?UkXvvJs=?= poultry fan MIME-Version: 1.0 Sender: Sales.63@xinhui.com Reply-To: yihedianqi010@163.com Date: Mon, 29 Aug 2016 17:41:37 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[218.58.172.234] X-Barracuda-Start-Time: 1472513594 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 7900 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.56 X-Barracuda-Spam-Status: No, SCORE=1.56 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160829233318.6CF93D80079@cuda.sgi.com> PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC4xMDU4Ni41NDUiPjwvSEVBRD4NCjxCT0RZPg0KPFA+PFNQQU4gDQpz dHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBGTE9BVDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDEzcHggVGFo b21hLCBWZXJkYW5hLCDlrovkvZM7IFdJRE9XUzogMTsgRElTUExBWTogaW5saW5lICFpbXBvcnRh bnQ7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4 LDI0OCk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+ SGkgDQpmcmllbmQgLDxTUEFOIGNsYXNzPUFwcGxlLWNvbnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQ QU4+PC9TUEFOPjxCUiANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6 IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxM3B4 IFRhaG9tYSwgVmVyZGFuYSwg5a6L5L2TOyBXSURPV1M6IDE7IExFVFRFUi1TUEFDSU5HOiBub3Jt YWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4LDI0OCk7IFRFWFQtSU5ERU5UOiAwcHg7 IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iV0hJVEUtU1BB Q0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGTE9B VDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDEzcHggVGFob21hLCBWZXJkYW5hLCDl rovkvZM7IFdJRE9XUzogMTsgRElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IExFVFRFUi1TUEFD SU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4LDI0OCk7IFRFWFQtSU5E RU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PC9TUEFOPjwvUD4NCjxQ PjxTUEFOIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBU RVhULVRSQU5TRk9STTogbm9uZTsgRkxPQVQ6IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05U OiAxM3B4IFRhaG9tYSwgVmVyZGFuYSwg5a6L5L2TOyBXSURPV1M6IDE7IERJU1BMQVk6IGlubGlu ZSAhaW1wb3J0YW50OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiBy Z2IoMjQ4LDI0OCwyNDgpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdp ZHRoOiAwcHgiPkdsYWQgDQp0byBsZWFybiB5b3XigJlyZSBvbiB0aGUgbWFya2V0IG9mJm5ic3A7 cG91bHRyeSBmYXJtICZuYnNwOy4gPC9TUEFOPjwvUD4NCjxQPjxTUEFOIA0Kc3R5bGU9IldISVRF LVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhULVRSQU5TRk9STTogbm9uZTsg RkxPQVQ6IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxM3B4IFRhaG9tYSwgVmVyZGFu YSwg5a6L5L2TOyBXSURPV1M6IDE7IERJU1BMQVk6IGlubGluZSAhaW1wb3J0YW50OyBMRVRURVIt U1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjQ4LDI0OCwyNDgpOyBURVhU LUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjwvU1BBTj48U1BB TiANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1U UkFOU0ZPUk06IG5vbmU7IEZMT0FUOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTNw eCBUYWhvbWEsIFZlcmRhbmEsIOWui+S9kzsgV0lET1dTOiAxOyBESVNQTEFZOiBpbmxpbmUgIWlt cG9ydGFudDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI0 OCwyNDgsMjQ4KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDog MHB4Ij5XZSANCmFyZSBhIGxlYWRpbmcgbWFudWZhY3R1cmVyIG9mJm5ic3A7Jm5ic3A7dmVudGls YXRpb24gc3lzdGVtcyZuYnNwOyBmb3IgcG91dGxyeSANCmZhbiZuYnNwOyZuYnNwOy4gPC9TUEFO PjxTUEFOIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBU RVhULVRSQU5TRk9STTogbm9uZTsgRkxPQVQ6IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05U OiAxM3B4IFRhaG9tYSwgVmVyZGFuYSwg5a6L5L2TOyBXSURPV1M6IDE7IERJU1BMQVk6IGlubGlu ZSAhaW1wb3J0YW50OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNPTE9SOiBy Z2IoMjQ4LDI0OCwyNDgpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ryb2tlLXdp ZHRoOiAwcHgiPkF0IA0KcHJlc2VudCwgRm9yIHRoZSB2ZW50aWxhdGlvbiBtYXJrZXQsIG91ciBz dXBlcmlvciB0eXBlIGlzIDUwJiMzOTsmIzM5OygxMzgwbW0pJm5ic3A7Y29uZSANCiZuYnNwO2Zh biBhbmQgdGhlIDcwOTAvNzA2MC81MDkwIHR5cGUgY29vbGluZyBwYWQgLCBxdWFsaXR5IG1lZXQg Q0UgLCBJU085MDAxIA0KLjIwMDAgc3RhbmRhcmQuPFNQQU4gY2xhc3M9QXBwbGUtY29udmVydGVk LXNwYWNlPiZuYnNwOzwvU1BBTj48L1NQQU4+PC9QPg0KPFA+PFNQQU4gDQpzdHlsZT0iV0hJVEUt U1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBG TE9BVDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDEzcHggVGFob21hLCBWZXJkYW5h LCDlrovkvZM7IFdJRE9XUzogMTsgRElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IExFVFRFUi1T UEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4LDI0OCk7IFRFWFQt SU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpjbGFz cz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+PEEgDQpocmVmPSJodHRwOi8vd3d3LnlpaGV2aWRlby5j b20iPnd3dy55aWhldmlkZW8uY29tPC9BPjwvU1BBTj48L1NQQU4+PC9QPg0KPFA+PFNQQU4gDQpz dHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBGTE9BVDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDEzcHggVGFo b21hLCBWZXJkYW5hLCDlrovkvZM7IFdJRE9XUzogMTsgRElTUExBWTogaW5saW5lICFpbXBvcnRh bnQ7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4 LDI0OCk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+ PFNQQU4gDQpjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+PC9TUEFOPjwvU1BBTj48QlIgDQpz dHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTNweCBUYWhvbWEsIFZlcmRhbmEs IOWui+S9kzsgV0lET1dTOiAxOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBCQUNLR1JPVU5ELUNP TE9SOiByZ2IoMjQ4LDI0OCwyNDgpOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc3Ry b2tlLXdpZHRoOiAwcHgiPjxCUiANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQ QUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05U OiAxM3B4IFRhaG9tYSwgVmVyZGFuYSwg5a6L5L2TOyBXSURPV1M6IDE7IExFVFRFUi1TUEFDSU5H OiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4LDI0OCk7IFRFWFQtSU5ERU5U OiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iV0hJ VEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25l OyBGTE9BVDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDEzcHggVGFob21hLCBWZXJk YW5hLCDlrovkvZM7IFdJRE9XUzogMTsgRElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IExFVFRF Ui1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4LDI0OCk7IFRF WFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpz dHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNG T1JNOiBub25lOyBGTE9BVDogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDEzcHggVGFo b21hLCBWZXJkYW5hLCDlrovkvZM7IFdJRE9XUzogMTsgRElTUExBWTogaW5saW5lICFpbXBvcnRh bnQ7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4 LDI0OCk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+ SWYgDQphbnkgcHJvZHVjdCBtZWV0IHlvdXIgZGVtYW5kLCBwbGVhc2UgY29udGFjdCB1cy4gV2Ug YXJlIHN1cmUgYW55IHlvdXIgcXVlc3Rpb24gDQp3aWxsIGdldCBvdXIgcHJvbXB0IHJlcGx5LjxT UEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48L1NQQU4+PC9T UEFOPjxCUiANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsg VEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxM3B4IFRhaG9t YSwgVmVyZGFuYSwg5a6L5L2TOyBXSURPV1M6IDE7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJB Q0tHUk9VTkQtQ09MT1I6IHJnYigyNDgsMjQ4LDI0OCk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJr aXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PEJSIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3Jt YWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigw LDAsMCk7IEZPTlQ6IDEzcHggVGFob21hLCBWZXJkYW5hLCDlrovkvZM7IFdJRE9XUzogMTsgTEVU VEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI0OCwyNDgsMjQ4KTsg VEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1BBTiAN CnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFO U0ZPUk06IG5vbmU7IEZMT0FUOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTNweCBU YWhvbWEsIFZlcmRhbmEsIOWui+S9kzsgV0lET1dTOiAxOyBESVNQTEFZOiBpbmxpbmUgIWltcG9y dGFudDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI0OCwy NDgsMjQ4KTsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4 Ij5CZXN0IA0KcmVnYXJkcyw8U1BBTiBjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5ic3A7 PC9TUEFOPjwvU1BBTj48L1A+DQo8UD48U1BBTiANCnN0eWxlPSJXSElURS1TUEFDRTogbm9ybWFs OyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZMT0FUOiBub25lOyBD T0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTNweCBUYWhvbWEsIFZlcmRhbmEsIOWui+S9kzsgV0lE T1dTOiAxOyBESVNQTEFZOiBpbmxpbmUgIWltcG9ydGFudDsgTEVUVEVSLVNQQUNJTkc6IG5vcm1h bDsgQkFDS0dST1VORC1DT0xPUjogcmdiKDI0OCwyNDgsMjQ4KTsgVEVYVC1JTkRFTlQ6IDBweDsg LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij48U1BBTiANCmNsYXNzPUFwcGxlLWNvbnZl cnRlZC1zcGFjZT48U1RST05HPjxFTT48Rk9OVCANCnN0eWxlPSJCQUNLR1JPVU5ELUNPTE9SOiAj ZmZmZmZmIj48U1BBTiBsYW5nPUVOLVVTPjxGT05UIGZhY2U9RGVuZ1hpYW4+PFNQQU4gDQpzdHls ZT0iRk9OVC1TSVpFOiAxMXB0OyBGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1z ZXJpZjsgQ09MT1I6IHJnYigwLDAsMCkiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTRwdCI+ WmhlbnRhbyB3YW5nPC9TUEFOPjxTUEFOIA0KY2xhc3M9QXBwbGUtY29udmVydGVkLXNwYWNlPiZu YnNwOzwvU1BBTj48L1NQQU4+PEJSPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgRk9O VC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMCwwLDAp Ij5UZWwgDQphbmQgV2hhdHNhcHA6IDg2KzE1NjEwNjE4ODA3PFNQQU4gDQpjbGFzcz1BcHBsZS1j b252ZXJ0ZWQtc3BhY2U+Jm5ic3A7PC9TUEFOPjwvU1BBTj48QlI+PFNQQU4gDQpzdHlsZT0iRk9O VC1TSVpFOiAxMXB0OyBGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsg Q09MT1I6IHJnYigwLDAsMCkiPlNLWVBFIA0KOiB3YW5nLnpoZW50YW8xPFNQQU4gY2xhc3M9QXBw bGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48L1NQQU4+PEJSPjxTUEFOIA0Kc3R5bGU9 IkZPTlQtU0laRTogMTFwdDsgRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2Vy aWY7IENPTE9SOiByZ2IoMCwwLDApIj5FLW1haWw8U1BBTiANCmNsYXNzPUFwcGxlLWNvbnZlcnRl ZC1zcGFjZT4mbmJzcDs8L1NQQU4+PC9TUEFOPjwvRk9OVD48L1NQQU4+PEZPTlQgDQpmYWNlPURl bmdYaWFuPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTFwdDsgRk9OVC1GQU1JTFk6IEFyaWFs LCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IENPTE9SOiByZ2IoMCwwLDApIj7vvJo8L1NQQU4+PC9G T05UPjwvRk9OVD48L0VNPjwvU1RST05HPjxTUEFOIA0KbGFuZz1FTi1VUz48Rk9OVCBmYWNlPURl bmdYaWFuPjxCPjxFTT48Rk9OVCANCnN0eWxlPSJCQUNLR1JPVU5ELUNPTE9SOiAjZmZmZmZmIj48 U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDExcHQ7IEZPTlQtRkFNSUxZOiBBcmlhbCwgSGVsdmV0 aWNhLCBzYW5zLXNlcmlmOyBDT0xPUjogcmdiKDAsMCwwKSI+eWloZWVsZWN0cmljYWxAb3V0bG9v ay5jb20gDQosIHlpaGVlbGVjdHJpY2FsQHlhaG9vLmNvbTwvU1BBTj48QlI+PFNQQU4gDQpzdHls ZT0iRk9OVC1TSVpFOiAxMXB0OyBGT05ULUZBTUlMWTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1z ZXJpZjsgQ09MT1I6IHJnYigwLDAsMCkiPldlYnNpdGUgDQo6IGh0dHA6Ly93d3cueWloZXZpZGVv LmNvbTwvU1BBTj48QlI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBGT05ULUZBTUlM WTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgQ09MT1I6IHJnYigwLDAsMCkiPldlaWZh bmcgDQpZaWhlIEVsZWN0cmljYWwgQXBwbGlhbmNlICwuTFRELyBTaGFuZG9uZyBYaW5odWkgWWlo ZSBUZW1wZXJhdHVyZSBDb250cm9sIA0KRXF1aXBtZW50IENvLiwgTHRkLjwvU1BBTj48L0ZPTlQ+ PC9FTT48L0I+PC9GT05UPjwvU1BBTj48L1NQQU4+PC9TUEFOPjwvUD4NCjxQPjxCUiANCnN0eWxl PSJXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06 IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxM3B4IFRhaG9tYSwgVmVyZGFuYSwg5a6L 5L2TOyBXSURPV1M6IDE7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IEJBQ0tHUk9VTkQtQ09MT1I6 IHJnYigyNDgsMjQ4LDI0OCk7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zdHJva2Ut d2lkdGg6IDBweCI+PC9QPjwvQk9EWT48L0hUTUw+DQoNCg== From david@fromorbit.com Mon Aug 29 18:40:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CB7157CA0 for ; Mon, 29 Aug 2016 18:40:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46E02AC004 for ; Mon, 29 Aug 2016 16:40:49 -0700 (PDT) X-ASG-Debug-ID: 1472514045-0bf57b5311358560001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id yrRD1DXplFSsZNyN for ; Mon, 29 Aug 2016 16:40:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aj4eADHHxFd5LDUCEGdsb2JhbABcHAEBBAEBgykBAQEBAR6BU4J5g3mcGQEBAQEBAQaMcYYVhBCGFwQCAoFdTQECAQEBAQECBgEBAQEBAQEBN0CEYQEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOIOAe+DAEBCAIlHoVIhRWKHAWZT48hgXeEXYkLSIt8g3mDO4FHKjSHFgEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Aug 2016 09:10:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beWAW-0002QT-A0; Tue, 30 Aug 2016 09:40:44 +1000 Date: Tue, 30 Aug 2016 09:40:44 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160829234044.GS19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> <20160829231205.GO19025@dastard> <20160829232615.GA29648@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829232615.GA29648@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472514045 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1209 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 29, 2016 at 06:26:15PM -0500, Bill O'Donnell wrote: > On Tue, Aug 30, 2016 at 09:12:06AM +1000, Dave Chinner wrote: > > On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > > > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > > > non-XFS filesystems. One modification in fs_initialise_mounts > > > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > > > fs paths entering the fs table. > > > > What's the failure? I'm not seeing it here on any of my test > > machines... > > On my box, there are a few ext4 mounts, and test xfs/261 > populates the fs table with those paths. I have ext2 and ext3 mounts on these machines as well, and they don't throw any errors. > So when xfs_quota commands > in 261 are executed, a "foreign filesystem" message is thrown. What is the output that is causing the failure? When someone asks you to describe the error that is occurring, please quote the /exact error/ that is occurring - describing it via paraphrasing does not tell anything useful about the error as I cannot correlate that description to the code that is throwing it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From billodo@redhat.com Mon Aug 29 18:47:09 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 419117CA0 for ; Mon, 29 Aug 2016 18:47:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96E52AC002 for ; Mon, 29 Aug 2016 16:47:08 -0700 (PDT) X-ASG-Debug-ID: 1472514426-0bf57b5312359020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8jm49UEEHzNAsqei (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 16:47:07 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A47F8C056800; Mon, 29 Aug 2016 23:47:06 +0000 (UTC) Received: from redhat.com (vpn-60-194.rdu2.redhat.com [10.10.60.194]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7TNl4vX028691 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 29 Aug 2016 19:47:06 -0400 Date: Mon, 29 Aug 2016 18:47:04 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160829234704.GC29648@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> <20160829231205.GO19025@dastard> <20160829232615.GA29648@redhat.com> <20160829234044.GS19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829234044.GS19025@dastard> User-Agent: Mutt/1.7.0 (2016-08-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Mon, 29 Aug 2016 23:47:06 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472514427 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2853 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 30, 2016 at 09:40:44AM +1000, Dave Chinner wrote: > On Mon, Aug 29, 2016 at 06:26:15PM -0500, Bill O'Donnell wrote: > > On Tue, Aug 30, 2016 at 09:12:06AM +1000, Dave Chinner wrote: > > > On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > > > > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > > > > non-XFS filesystems. One modification in fs_initialise_mounts > > > > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > > > > fs paths entering the fs table. > > > > > > What's the failure? I'm not seeing it here on any of my test > > > machines... > > > > On my box, there are a few ext4 mounts, and test xfs/261 > > populates the fs table with those paths. > > I have ext2 and ext3 mounts on these machines as well, and they > don't throw any errors. > > > So when xfs_quota commands > > in 261 are executed, a "foreign filesystem" message is thrown. > > What is the output that is causing the failure? When someone > asks you to describe the error that is occurring, please quote the > /exact error/ that is occurring - describing it via paraphrasing > does not tell anything useful about the error as I cannot correlate > that description to the code that is throwing it. Ahh, ok, I'm sorry about that. [root@dell-pesc440-01 xfstests-dev]# ./check -d tests/xfs/261 FSTYP -- xfs (debug) PLATFORM -- Linux/x86_64 dell-pesc440-01 4.7.0-rc108052016bill02+ MKFS_OPTIONS -- -f -bsize=4096 /dev/mapper/fedora_dell--pesc440--01-csdf MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/mapper/fedora_dell--pesc440--01-csdf /mnt/scratch xfs/261 2s ...QA output created by 261 Silence is golden. print command is for XFS filesystems only print command is for XFS filesystems only print command is for XFS filesystems only print command is for XFS filesystems only print command is for XFS filesystems only print command is for XFS filesystems only print command is for XFS filesystems only print command is for XFS filesystems only - output mismatch (see /root/xfstests-dev/results//xfs/261.out.bad) --- tests/xfs/261.out 2016-08-09 15:45:47.471465224 -0400 +++ /root/xfstests-dev/results//xfs/261.out.bad 2016-08-29 19:45:58.166965834 -0400 @@ -1,2 +1,10 @@ QA output created by 261 Silence is golden. +print command is for XFS filesystems only +print command is for XFS filesystems only +print command is for XFS filesystems only +print command is for XFS filesystems only +print command is for XFS filesystems only ... (Run 'diff -u tests/xfs/261.out /root/xfstests-dev/results//xfs/261.out.bad' to see the entire diff) Ran: xfs/261 Failures: xfs/261 Failed 1 of 1 tests > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Mon Aug 29 19:29:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B81247CA0 for ; Mon, 29 Aug 2016 19:29:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 87A9B304043 for ; Mon, 29 Aug 2016 17:29:54 -0700 (PDT) X-ASG-Debug-ID: 1472516990-0bf57c1b09563f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id SBHiASCHng6mdJ2n for ; Mon, 29 Aug 2016 17:29:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjweAOjSxFd5LDUCEGdsb2JhbABcHAEBBAEBgykBAQEBAR6BU4J5g3mcGQEBAQEBAQaMcYYVhBCGFwQCAoFfTQECAQEBAQECBgEBAQEBAQEBN0CEYgEBBDocIxAIAxgJJQ8FJQMHGhOIP74OAQEIAiUehUiFFYQSEQGFeAWZT48hgXeEXYkLSIt8g3mDO4FHKjSEd4IfAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Aug 2016 09:55:14 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beWrZ-0002Ur-Av; Tue, 30 Aug 2016 10:25:13 +1000 Date: Tue, 30 Aug 2016 10:25:13 +1000 From: Dave Chinner To: Bill O'Donnell Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160830002513.GT19025@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> <20160829231205.GO19025@dastard> <20160829232615.GA29648@redhat.com> <20160829234044.GS19025@dastard> <20160829234704.GC29648@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829234704.GC29648@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472516990 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3809 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32442 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 29, 2016 at 06:47:04PM -0500, Bill O'Donnell wrote: > On Tue, Aug 30, 2016 at 09:40:44AM +1000, Dave Chinner wrote: > > On Mon, Aug 29, 2016 at 06:26:15PM -0500, Bill O'Donnell wrote: > > > On Tue, Aug 30, 2016 at 09:12:06AM +1000, Dave Chinner wrote: > > > > On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > > > > > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > > > > > non-XFS filesystems. One modification in fs_initialise_mounts > > > > > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > > > > > fs paths entering the fs table. > > > > > > > > What's the failure? I'm not seeing it here on any of my test > > > > machines... > > > > > > On my box, there are a few ext4 mounts, and test xfs/261 > > > populates the fs table with those paths. > > > > I have ext2 and ext3 mounts on these machines as well, and they > > don't throw any errors. > > > > > So when xfs_quota commands > > > in 261 are executed, a "foreign filesystem" message is thrown. > > > > What is the output that is causing the failure? When someone > > asks you to describe the error that is occurring, please quote the > > /exact error/ that is occurring - describing it via paraphrasing > > does not tell anything useful about the error as I cannot correlate > > that description to the code that is throwing it. > > Ahh, ok, I'm sorry about that. > [root@dell-pesc440-01 xfstests-dev]# ./check -d tests/xfs/261 > FSTYP -- xfs (debug) > PLATFORM -- Linux/x86_64 dell-pesc440-01 4.7.0-rc108052016bill02+ > MKFS_OPTIONS -- -f -bsize=4096 /dev/mapper/fedora_dell--pesc440--01-csdf > MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/mapper/fedora_dell--pesc440--01-csdf /mnt/scratch > > xfs/261 2s ...QA output created by 261 > Silence is golden. > print command is for XFS filesystems only > print command is for XFS filesystems only > print command is for XFS filesystems only > print command is for XFS filesystems only > print command is for XFS filesystems only > print command is for XFS filesystems only > print command is for XFS filesystems only > print command is for XFS filesystems only Bill, slow down and work through the code from first principles. I don't care about getting a fix quickly - I care about the process you use to find the problem and whether you end up fully understanding the problem. Walk through the code in the debugger if you have to - it will show you the flow and how the pieces connect together. The question that needs to be answered is this: what set of initial conditions is causing this error to occur? We don't really care about what previous changes caused the issue at this point - working that out comes /after/ diagnosing the problem when we are trying to work out a fix. So, yes, the issue occurs because there are foreign fs types in the fstable, but that's not the underlying problem nor the problem that needs to be solved. Use the debugger and cssope to connect the dots between the fstable initialisation, the fs_path initialisation, and the function that prints that error. That should give you a good idea of why the error is being printed. Then have a look at print_f() and see what it does with the fstable. Then tell me whether we should even care about checking for foreign filesystems before we run the print_f command. At this point, the fix should be obvious. And then have a look at printpath() and tell me what the foriegn filesystem handling bug it contains. And, yes, I could have written and tested the patch to fix all this in the time it took to write this email, but then you don't have the opportunity to learn from doing it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From billodo@redhat.com Mon Aug 29 19:53:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6E40F7CA0 for ; Mon, 29 Aug 2016 19:53:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B0AA8F804C for ; Mon, 29 Aug 2016 17:53:47 -0700 (PDT) X-ASG-Debug-ID: 1472518422-0bf57c1b0958800001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dXhaq2ZMJpMksz4n (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 17:53:42 -0700 (PDT) X-Barracuda-Envelope-From: billodo@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 64B1E15561; Tue, 30 Aug 2016 00:53:41 +0000 (UTC) Received: from redhat.com (vpn-60-194.rdu2.redhat.com [10.10.60.194]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7U0rcaS023474 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Mon, 29 Aug 2016 20:53:40 -0400 Date: Mon, 29 Aug 2016 19:53:38 -0500 From: "Bill O'Donnell" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed Message-ID: <20160830005338.GA21506@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: don't populate fs table with foreign fs paths unless foreign_allowed References: <1472478012-23627-1-git-send-email-billodo@redhat.com> <20160829231205.GO19025@dastard> <20160829232615.GA29648@redhat.com> <20160829234044.GS19025@dastard> <20160829234704.GC29648@redhat.com> <20160830002513.GT19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160830002513.GT19025@dastard> User-Agent: Mutt/1.7.0 (2016-08-17) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 30 Aug 2016 00:53:41 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472518422 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4086 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 30, 2016 at 10:25:13AM +1000, Dave Chinner wrote: > On Mon, Aug 29, 2016 at 06:47:04PM -0500, Bill O'Donnell wrote: > > On Tue, Aug 30, 2016 at 09:40:44AM +1000, Dave Chinner wrote: > > > On Mon, Aug 29, 2016 at 06:26:15PM -0500, Bill O'Donnell wrote: > > > > On Tue, Aug 30, 2016 at 09:12:06AM +1000, Dave Chinner wrote: > > > > > On Mon, Aug 29, 2016 at 08:40:12AM -0500, Bill O'Donnell wrote: > > > > > > Commits b20b6c2 and 29647c8 modified xfs_quota for use on > > > > > > non-XFS filesystems. One modification in fs_initialise_mounts > > > > > > (paths.c) resulted in an xfstest fail (xfs/261), due to foreign > > > > > > fs paths entering the fs table. > > > > > > > > > > What's the failure? I'm not seeing it here on any of my test > > > > > machines... > > > > > > > > On my box, there are a few ext4 mounts, and test xfs/261 > > > > populates the fs table with those paths. > > > > > > I have ext2 and ext3 mounts on these machines as well, and they > > > don't throw any errors. > > > > > > > So when xfs_quota commands > > > > in 261 are executed, a "foreign filesystem" message is thrown. > > > > > > What is the output that is causing the failure? When someone > > > asks you to describe the error that is occurring, please quote the > > > /exact error/ that is occurring - describing it via paraphrasing > > > does not tell anything useful about the error as I cannot correlate > > > that description to the code that is throwing it. > > > > Ahh, ok, I'm sorry about that. > > [root@dell-pesc440-01 xfstests-dev]# ./check -d tests/xfs/261 > > FSTYP -- xfs (debug) > > PLATFORM -- Linux/x86_64 dell-pesc440-01 4.7.0-rc108052016bill02+ > > MKFS_OPTIONS -- -f -bsize=4096 /dev/mapper/fedora_dell--pesc440--01-csdf > > MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/mapper/fedora_dell--pesc440--01-csdf /mnt/scratch > > > > xfs/261 2s ...QA output created by 261 > > Silence is golden. > > print command is for XFS filesystems only > > print command is for XFS filesystems only > > print command is for XFS filesystems only > > print command is for XFS filesystems only > > print command is for XFS filesystems only > > print command is for XFS filesystems only > > print command is for XFS filesystems only > > print command is for XFS filesystems only > > Bill, slow down and work through the code from first principles. I > don't care about getting a fix quickly - I care about the process > you use to find the problem and whether you end up fully > understanding the problem. Walk through the code in the debugger if > you have to - it will show you the flow and how the pieces connect > together. > > The question that needs to be answered is this: what set of initial > conditions is causing this error to occur? We don't really care > about what previous changes caused the issue at this point - working > that out comes /after/ diagnosing the problem when we are trying to > work out a fix. > > So, yes, the issue occurs because there are foreign fs types in the > fstable, but that's not the underlying problem nor the problem that > needs to be solved. > > Use the debugger and cssope to connect the dots between the fstable > initialisation, the fs_path initialisation, and the function that > prints that error. That should give you a good idea of why the error > is being printed. > > Then have a look at print_f() and see what it does with the fstable. > Then tell me whether we should even care about checking for foreign > filesystems before we run the print_f command. At this point, the > fix should be obvious. > > And then have a look at printpath() and tell me what the foriegn > filesystem handling bug it contains. > > And, yes, I could have written and tested the patch to fix all this > in the time it took to write this email, but then you don't have the > opportunity to learn from doing it.... OK, will do. Thanks Dave. -Bill > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From dan.j.williams@intel.com Mon Aug 29 20:50:12 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1EE667CA0 for ; Mon, 29 Aug 2016 20:50:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E203E304043 for ; Mon, 29 Aug 2016 18:50:08 -0700 (PDT) X-ASG-Debug-ID: 1472521806-0bf57b5314367140001-NocioJ Received: from mail-oi0-f48.google.com (mail-oi0-f48.google.com [209.85.218.48]) by cuda.sgi.com with ESMTP id viqu2DEr71goAfAs (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Mon, 29 Aug 2016 18:50:06 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f48.google.com[209.85.218.48] X-Barracuda-Apparent-Source-IP: 209.85.218.48 Received: by mail-oi0-f48.google.com with SMTP id l203so7392582oib.1 for ; Mon, 29 Aug 2016 18:50:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=oqMPF5TwI7QpcOu+GzVdGwzTxAbOaGQnMgiumR7tvoc=; b=ByJHdtqkKgGiX1xNDre4ZERYV5bihPFWbpMp1uhKL84a9nsCCQuufzwHadF49B2oFj xCaJ4BOUOcgwHUD1bjF2GD5q9FiqLujTxLXv/txqmZJeOoaq+G3iVubZBw4+yOw71Ar4 Mz9R2ZK60OjUdtjDETRMPVJrNDSkgmxiWVw1T5CUtZMSTVLRdrEvuueiuNm7VIkH2If2 wHw5VtWyRciEsav/prOjmnk64VeZYG2DuV0U3awizn1Y3xWDT56lCKwWRalqZwOUFdhs gBCH8XR2I/YllYB7w8EaGTKkiMtQWcLEUc8JCU9iIae8s7elDP5sxzT3c3tjs/QB9YKJ 0rwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=oqMPF5TwI7QpcOu+GzVdGwzTxAbOaGQnMgiumR7tvoc=; b=EJtmyKUf4mIYwDM8vFCp4r318MXRxDfaApU2Jr1UshlL6n1sYQgGSvovcEPR1dR1Jh EWY+2KY8vV9JOJoAPAW0T7Ci6Qx+A4wic0Q8wbijqqcqxaK0Ffb/FELQ/+kzIF2xrJ2F UyNuHzy220xFmW/kcsI9VP0tRifk/jPgmmIFWWVU9aWmN63Wbnm7wyPNwYov4YmSejNV ciMgsKSR/ipBuCm3vyyvCxahLuaA7m8idlkazQd5c3EVPhdxT1PcXSdix/jrI4xa3a1+ 9XepaCdl6F6LfnvfpgUW0SO2FqcyGvSA4ymQlbmO1vWTD9+rSrJdSkjMiAkv/fY3Hzn3 +DZg== X-Gm-Message-State: AE9vXwN8dP/VWOgdybJS2yVWTJd+l+Rq4T1e5r6iMno/ewsemVVXem9KQUpd//V8QSONOKaPoOPTKPyjOt48iOrm X-Received: by 10.202.228.69 with SMTP id b66mr1118192oih.168.1472521805952; Mon, 29 Aug 2016 18:50:05 -0700 (PDT) MIME-Version: 1.0 Received: by 10.157.7.232 with HTTP; Mon, 29 Aug 2016 18:50:05 -0700 (PDT) In-Reply-To: <20160804024514.GA2906@xzhoul.usersys.redhat.com> References: <20160804024514.GA2906@xzhoul.usersys.redhat.com> From: Dan Williams Date: Mon, 29 Aug 2016 18:50:05 -0700 Message-ID: Subject: Re: xfstests xfs fuzzers fail with DAX To: Xiong Zhou X-ASG-Orig-Subj: Re: xfstests xfs fuzzers fail with DAX Cc: linux-nvdimm , XFS Developers , "linux-kernel@vger.kernel.org" , "Darrick J. Wong" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f48.google.com[209.85.218.48] X-Barracuda-Start-Time: 1472521806 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2711 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature [ Adding Darrick on the off chance that this triggers an "aha, of course it does!" ] Darrick these corruption tests you added to xfstests last year all fail the same way with DAX enabled. They spew: "pwrite64: Structure needs cleaning" ...reports that are cleaned up by running without "-o dax". Alternatively you could sit back and watch me try to figure it out, that should be quite entertaining... as a start I'll try to pin down a stack trace when the error is returned. On Wed, Aug 3, 2016 at 7:45 PM, Xiong Zhou wrote: > Hi, > > A few xfs fuzzers in xfstests fail with dax mount option, pass without dax. > They are xfs/086 xfs/088 xfs/089 xfs/091. > > xfstests to commit 4470ad4c7e (Jul 26) > kernel to commit dd95069545 (Jul 24) > > + ./check xfs/091 > FSTYP -- xfs (non-debug) > PLATFORM -- Linux/x86_64 rhel73 4.7.0+ > MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 > MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch > > xfs/091 104s > Ran: xfs/091 > Passed all 1 tests > > + echo 'MOUNT_OPTIONS="-o dax"' > + ./check xfs/091 > FSTYP -- xfs (non-debug) > PLATFORM -- Linux/x86_64 rhel73 4.7.0+ > MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 > MOUNT_OPTIONS -- -o dax -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch > > xfs/091 104s ... - output mismatch (see /root/xfstests/results//xfs/091.out.bad) > --- tests/xfs/091.out 2016-07-18 02:57:47.670000000 -0400 > +++ /root/xfstests/results//xfs/091.out.bad 2016-08-03 22:38:14.948000000 -0400 > @@ -6,6 +6,70 @@ > + corrupt image > + mount image > + modify files > +pwrite64: Structure needs cleaning > +pwrite64: Structure needs cleaning > +pwrite64: Structure needs cleaning > +pwrite64: Structure needs cleaning > ... > (Run 'diff -u tests/xfs/091.out /root/xfstests/results//xfs/091.out.bad' to see the entire diff) > Ran: xfs/091 > Failures: xfs/091 > Failed 1 of 1 tests > > # diff -u xfstests/tests/xfs/091.out /root/xfstests/results//xfs/091.out.bad > --- xfstests/tests/xfs/091.out 2016-07-18 02:57:47.670000000 -0400 > +++ /root/xfstests/results//xfs/091.out.bad 2016-08-03 22:38:14.948000000 -0400 > @@ -6,6 +6,70 @@ > + corrupt image > + mount image > + modify files > +pwrite64: Structure needs cleaning > > +pwrite64: Structure needs cleaning > + repair fs > + mount image > + chattr -R -i > > > Thanks, > Xiong > > _______________________________________________ > Linux-nvdimm mailing list > Linux-nvdimm@lists.01.org > https://lists.01.org/mailman/listinfo/linux-nvdimm From darrick.wong@oracle.com Mon Aug 29 21:37:39 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AC1527CA0 for ; Mon, 29 Aug 2016 21:37:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7C1A08F8050 for ; Mon, 29 Aug 2016 19:37:36 -0700 (PDT) X-ASG-Debug-ID: 1472524653-0bf57c1b0b65c60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id EXVeSmJPJ96GMlcv (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 19:37:33 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7U2bUFI026790 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 30 Aug 2016 02:37:30 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7U2bTVx014793 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 02:37:30 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7U2bSR9010039; Tue, 30 Aug 2016 02:37:29 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Aug 2016 19:37:28 -0700 Date: Mon, 29 Aug 2016 19:37:27 -0700 From: "Darrick J. Wong" To: Dan Williams Cc: Xiong Zhou , linux-nvdimm , "linux-kernel@vger.kernel.org" , XFS Developers Subject: Re: xfstests xfs fuzzers fail with DAX Message-ID: <20160830023727.GH22760@birch.djwong.org> X-ASG-Orig-Subj: Re: xfstests xfs fuzzers fail with DAX References: <20160804024514.GA2906@xzhoul.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472524653 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3905 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Aug 29, 2016 at 06:50:05PM -0700, Dan Williams wrote: > [ Adding Darrick on the off chance that this triggers an "aha, of > course it does!" ] Aha! Of course it does!!! :) > Darrick these corruption tests you added to xfstests last year all > fail the same way with DAX enabled. They spew: > > "pwrite64: Structure needs cleaning" > > ...reports that are cleaned up by running without "-o dax". I think this happens because in non-dax mode, the pwrite is a buffered write and so long as we can create a delalloc reservation, everything is ok and nothing fails. Whereas for dax we have to allocate the blocks for the pwrite immediately, thereby triggering the cntbt verifier error. Proceeding from the assumption "DAX behaves a lot like DIO", all the tests that rely on buffered mode semantics are going to choke if DAX is turned on without them knowing about it. > Alternatively you could sit back and watch me try to figure it out, > that should be quite entertaining... as a start I'll try to pin down a > stack trace when the error is returned. As for how to fix this, probably the best option is to change line 98 to 'pwrite -W -S 0x62...' and update the output to include the 'structure needs cleaning' message. Or get rid of the mount option and require explicitly turning on DAX on a per-inode basis, which I think is where Dave is already going. --D > > > On Wed, Aug 3, 2016 at 7:45 PM, Xiong Zhou wrote: > > Hi, > > > > A few xfs fuzzers in xfstests fail with dax mount option, pass without dax. > > They are xfs/086 xfs/088 xfs/089 xfs/091. > > > > xfstests to commit 4470ad4c7e (Jul 26) > > kernel to commit dd95069545 (Jul 24) > > > > + ./check xfs/091 > > FSTYP -- xfs (non-debug) > > PLATFORM -- Linux/x86_64 rhel73 4.7.0+ > > MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 > > MOUNT_OPTIONS -- -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch > > > > xfs/091 104s > > Ran: xfs/091 > > Passed all 1 tests > > > > + echo 'MOUNT_OPTIONS="-o dax"' > > + ./check xfs/091 > > FSTYP -- xfs (non-debug) > > PLATFORM -- Linux/x86_64 rhel73 4.7.0+ > > MKFS_OPTIONS -- -f -bsize=4096 /dev/pmem1 > > MOUNT_OPTIONS -- -o dax -o context=system_u:object_r:nfs_t:s0 /dev/pmem1 /daxsch > > > > xfs/091 104s ... - output mismatch (see /root/xfstests/results//xfs/091.out.bad) > > --- tests/xfs/091.out 2016-07-18 02:57:47.670000000 -0400 > > +++ /root/xfstests/results//xfs/091.out.bad 2016-08-03 22:38:14.948000000 -0400 > > @@ -6,6 +6,70 @@ > > + corrupt image > > + mount image > > + modify files > > +pwrite64: Structure needs cleaning > > +pwrite64: Structure needs cleaning > > +pwrite64: Structure needs cleaning > > +pwrite64: Structure needs cleaning > > ... > > (Run 'diff -u tests/xfs/091.out /root/xfstests/results//xfs/091.out.bad' to see the entire diff) > > Ran: xfs/091 > > Failures: xfs/091 > > Failed 1 of 1 tests > > > > # diff -u xfstests/tests/xfs/091.out /root/xfstests/results//xfs/091.out.bad > > --- xfstests/tests/xfs/091.out 2016-07-18 02:57:47.670000000 -0400 > > +++ /root/xfstests/results//xfs/091.out.bad 2016-08-03 22:38:14.948000000 -0400 > > @@ -6,6 +6,70 @@ > > + corrupt image > > + mount image > > + modify files > > +pwrite64: Structure needs cleaning > > > > +pwrite64: Structure needs cleaning > > + repair fs > > + mount image > > + chattr -R -i > > > > > > Thanks, > > Xiong > > > > _______________________________________________ > > Linux-nvdimm mailing list > > Linux-nvdimm@lists.01.org > > https://lists.01.org/mailman/listinfo/linux-nvdimm > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon Aug 29 21:39:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EA0CA7CA0 for ; Mon, 29 Aug 2016 21:39:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D4CFAC004 for ; Mon, 29 Aug 2016 19:39:39 -0700 (PDT) X-ASG-Debug-ID: 1472524775-0bf57b531336dce0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 5BKpM8HEKR6YKId0 for ; Mon, 29 Aug 2016 19:39:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqsVAFXxxFd5LDUCEGdsb2JhbABcg00BAQEBAR6BU4ZynB8GjHGDa4Y6hhcEAgKBX00BAgEBAQEBAgYBAQEBAQEBATdAhGIBBTocIxAIAw4KCSUPBSUDBxoTiD++EQEBCAIBJB6FSIUViX8dBZlPjyKBd4RdiQ1IjACDeYUCKjSHFgEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail06.adl2.internode.on.net with ESMTP; 30 Aug 2016 12:09:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beYx7-0002fY-Iv; Tue, 30 Aug 2016 12:39:05 +1000 Date: Tue, 30 Aug 2016 12:39:05 +1000 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: BUG: Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c Message-ID: <20160830023905.GU19025@dastard> X-ASG-Orig-Subj: Re: BUG: Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c References: <20160829103754.GH27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829103754.GH27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1472524775 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2164 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 29, 2016 at 06:37:54PM +0800, Eryu Guan wrote: > Hi, > > I've hit an XFS internal error then filesystem shutdown with 4.8-rc3 > kernel but not with 4.8-rc2 ..... > I attached a script too to reproduce it. Please note that the XFS > partition needs about 40G frees space, and it may take hours to finish > based on your memory setup on your host. Ugh. can you try to narrow the cause so it takes less time to reproduce? This is almost certainly one of two things: 1) a ENOSPC issue where an AG is almost-but-not-quite full, but fixing up the freelist results in there being not enough blocks left to allocate the data extent; or 2) we've split a delalloc extent so many times that we've run out of indirect block reservation and we hit ENOSPC as a result. For the latter, I suspect a test case where we take a large delalloc range and use sync_file_range to do single page writeback to "binary split" the delalloc range. i.e. start with a 128MB delalloc, then sync a 4k block at offset 64MB, then 4k at 32MB, then 16MB, then 8MB, ... all the way down to writing the first block in the file, and also all the way up to the final block in the file. Then write every second 4k block to cause worse case growth of the bmbt and hopefully then exhaust the indirect block reservation for that delalloc region... > [root@hp-dl360g9-15 ~]# xfs_info / > meta-data=/dev/mapper/systemvg-root isize=256 agcount=16, agsize=2927744 blks > = sectsz=512 attr=2, projid32bit=1 > = crc=0 finobt=0 spinodes=0 > data = bsize=4096 blocks=46843904, imaxpct=25 > = sunit=64 swidth=192 blks > naming =version 2 bsize=4096 ascii-ci=0 ftype=0 > log =internal bsize=4096 blocks=22912, version=2 > = sectsz=512 sunit=64 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 Does it reproduce on a CRC enabled filesystem? Cheers, Dave. -- Dave Chinner david@fromorbit.com From darrick.wong@oracle.com Mon Aug 29 22:39:54 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8D3957CA0 for ; Mon, 29 Aug 2016 22:39:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5C7858F804C for ; Mon, 29 Aug 2016 20:39:51 -0700 (PDT) X-ASG-Debug-ID: 1472528388-0bf57b53143743e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id JH59KfXfGgWaYVmo (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 20:39:49 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7U3dKoi011601 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 30 Aug 2016 03:39:21 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7U3dK4j029305 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 03:39:20 GMT Received: from abhmp0003.oracle.com (abhmp0003.oracle.com [141.146.116.9]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7U3dISq031402; Tue, 30 Aug 2016 03:39:19 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Aug 2016 20:39:18 -0700 Date: Mon, 29 Aug 2016 20:39:17 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org, Christoph Hellwig Subject: [PATCH v2] xfs: track log done items directly in the deferred pending work item Message-ID: <20160830033917.GI22760@birch.djwong.org> X-ASG-Orig-Subj: [PATCH v2] xfs: track log done items directly in the deferred pending work item MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472528389 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4650 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32446 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Christoph reports slab corruption when a deferred refcount update aborts during _defer_finish(). The cause of this was broken log item state tracking in xfs_defer_pending -- upon an abort, _defer_trans_abort() will call abort_intent on all intent items, including the ones that have already had a done item attached. This is incorrect because each intent item has 2 refcount: the first is released when the intent item is committed to the log; and the second is released when the _done_ item is committed to the log, or by the intent creator if there is no done item. In other words, once we log the done item, responsibility for releasing the intent item's second refcount is transferred to the done item and /must not/ be performed by anything else. The dfp_committed flag should have been tracking whether or not we had a done item so that _defer_trans_abort could decide if it needs to abort the intent item, but due to a thinko this was not the case. Rip it out and track the done item directly so that we do the right thing w.r.t. intent item freeing. v2: Push patch to the head of the stack. Signed-off-by: Darrick J. Wong Reported-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_defer.c | 17 ++++------------- fs/xfs/libxfs/xfs_defer.h | 2 +- fs/xfs/xfs_trace.h | 2 +- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c index 054a203..c221d0e 100644 --- a/fs/xfs/libxfs/xfs_defer.c +++ b/fs/xfs/libxfs/xfs_defer.c @@ -194,7 +194,7 @@ xfs_defer_trans_abort( /* Abort intent items. */ list_for_each_entry(dfp, &dop->dop_pending, dfp_list) { trace_xfs_defer_pending_abort(tp->t_mountp, dfp); - if (dfp->dfp_committed) + if (!dfp->dfp_done) dfp->dfp_type->abort_intent(dfp->dfp_intent); } @@ -290,7 +290,6 @@ xfs_defer_finish( struct xfs_defer_pending *dfp; struct list_head *li; struct list_head *n; - void *done_item = NULL; void *state; int error = 0; void (*cleanup_fn)(struct xfs_trans *, void *, int); @@ -309,19 +308,11 @@ xfs_defer_finish( if (error) goto out; - /* Mark all pending intents as committed. */ - list_for_each_entry_reverse(dfp, &dop->dop_pending, dfp_list) { - if (dfp->dfp_committed) - break; - trace_xfs_defer_pending_commit((*tp)->t_mountp, dfp); - dfp->dfp_committed = true; - } - /* Log an intent-done item for the first pending item. */ dfp = list_first_entry(&dop->dop_pending, struct xfs_defer_pending, dfp_list); trace_xfs_defer_pending_finish((*tp)->t_mountp, dfp); - done_item = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, + dfp->dfp_done = dfp->dfp_type->create_done(*tp, dfp->dfp_intent, dfp->dfp_count); cleanup_fn = dfp->dfp_type->finish_cleanup; @@ -331,7 +322,7 @@ xfs_defer_finish( list_del(li); dfp->dfp_count--; error = dfp->dfp_type->finish_item(*tp, dop, li, - done_item, &state); + dfp->dfp_done, &state); if (error) { /* * Clean up after ourselves and jump out. @@ -428,8 +419,8 @@ xfs_defer_add( dfp = kmem_alloc(sizeof(struct xfs_defer_pending), KM_SLEEP | KM_NOFS); dfp->dfp_type = defer_op_types[type]; - dfp->dfp_committed = false; dfp->dfp_intent = NULL; + dfp->dfp_done = NULL; dfp->dfp_count = 0; INIT_LIST_HEAD(&dfp->dfp_work); list_add_tail(&dfp->dfp_list, &dop->dop_intake); diff --git a/fs/xfs/libxfs/xfs_defer.h b/fs/xfs/libxfs/xfs_defer.h index cc3981c..e96533d 100644 --- a/fs/xfs/libxfs/xfs_defer.h +++ b/fs/xfs/libxfs/xfs_defer.h @@ -30,8 +30,8 @@ struct xfs_defer_op_type; struct xfs_defer_pending { const struct xfs_defer_op_type *dfp_type; /* function pointers */ struct list_head dfp_list; /* pending items */ - bool dfp_committed; /* committed trans? */ void *dfp_intent; /* log intent item */ + void *dfp_done; /* log done item */ struct list_head dfp_work; /* work items */ unsigned int dfp_count; /* # extent items */ }; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 7e88bec..d303a66 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -2295,7 +2295,7 @@ DECLARE_EVENT_CLASS(xfs_defer_pending_class, __entry->dev = mp ? mp->m_super->s_dev : 0; __entry->type = dfp->dfp_type->type; __entry->intent = dfp->dfp_intent; - __entry->committed = dfp->dfp_committed; + __entry->committed = dfp->dfp_done != NULL; __entry->nr = dfp->dfp_count; ), TP_printk("dev %d:%d optype %d intent %p committed %d nr %d\n", From darrick.wong@oracle.com Mon Aug 29 22:40:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C66357CA0 for ; Mon, 29 Aug 2016 22:40:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96B988F804C for ; Mon, 29 Aug 2016 20:40:49 -0700 (PDT) X-ASG-Debug-ID: 1472528439-0bf57c1b086c3c0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 5houIhDvzUuF2DGp (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 20:40:39 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7U3eEPQ020156 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 03:40:14 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7U3eDM2003045 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 03:40:13 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7U3eDln032366; Tue, 30 Aug 2016 03:40:13 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Aug 2016 20:40:13 -0700 Date: Mon, 29 Aug 2016 20:40:12 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: Christoph Hellwig , linux-xfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 Message-ID: <20160830034012.GJ22760@birch.djwong.org> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfs: for-next branch updated to 800b269 References: <20160826062508.GG19025@dastard> <20160826074844.GA17137@infradead.org> <20160829013111.GN19025@dastard> <20160829145249.GF22760@birch.djwong.org> <20160829232308.GQ19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160829232308.GQ19025@dastard> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472528439 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1481 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32446 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 30, 2016 at 09:23:08AM +1000, Dave Chinner wrote: > On Mon, Aug 29, 2016 at 07:52:49AM -0700, Darrick J. Wong wrote: > > On Mon, Aug 29, 2016 at 11:31:12AM +1000, Dave Chinner wrote: > > > On Fri, Aug 26, 2016 at 12:48:44AM -0700, Christoph Hellwig wrote: > > > > Hi Dave, > > > > > > > > please consider: "[PATCH] iomap: don't set FIEMAP_EXTENT_MERGED for > > > > extent based filesystems" > > > > > > > > for 4.8. It fixes a regression in the iomap-based fiemap > > > > implementation, and it's fairly trivial as well. > > > > > > Oh, damn, I thought I got that one. I'll append it to the > > > series and push it out. > > > > It might be a good idea to pick up "xfs: track log done items directly > > in the deferred pending work item" too, if it fixes the slab > > corruptions that Christoph reported. > > Doesn't apply cleanly to the 4.8 tree, and the xfs_defer_finish() > code is quite different, so you'll need to rebase and resend that > patch if you think it needs to be applied to the 4.8-rc kernel. > I can always send it to Linus later. Heh, I forgot to shove it to the head of the queue before mailing it. Will resend with that fixed. --D > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From darrick.wong@oracle.com Mon Aug 29 22:44:16 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9FB027CA0 for ; Mon, 29 Aug 2016 22:44:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 71005304043 for ; Mon, 29 Aug 2016 20:44:16 -0700 (PDT) X-ASG-Debug-ID: 1472528654-0bf57b5311374d00001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id wpEoGY7tyJFbFKlV (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 20:44:14 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7U3iCrr023155 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 30 Aug 2016 03:44:12 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id u7U3iCHp004916 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 03:44:12 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7U3iBdS003375; Tue, 30 Aug 2016 03:44:11 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Aug 2016 20:44:11 -0700 Date: Mon, 29 Aug 2016 20:44:10 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: [PATCH] xfs_repair: don't crash if we run out of space midway through rebuilding a btree Message-ID: <20160830034410.GK22760@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs_repair: don't crash if we run out of space midway through rebuilding a btree MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0022.oracle.com [141.146.126.234] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472528654 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1383 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32447 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines During btree rebuilding, the cursor setup function checks ext_ptr to report ENOSPC problems when it grabs the first extent for the btree. However, subsequent grabs for free space don't check ext_ptr and so we segfault if there's no space. Therefore, move the ENOSPC check into the loop so that we always complain about insufficient space instead of just crashing. Signed-off-by: Darrick J. Wong --- repair/phase5.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index b464b56..28aaefe 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -231,8 +231,7 @@ setup_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *curs) * grab the smallest extent and use it up, then get the * next smallest. This mimics the init_*_cursor code. */ - if ((ext_ptr = findfirst_bcnt_extent(agno)) == NULL) - do_error(_("error - not enough free space in filesystem\n")); + ext_ptr = findfirst_bcnt_extent(agno); agb_ptr = curs->btree_blocks; @@ -240,6 +239,9 @@ setup_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *curs) * set up the free block array */ while (blocks_allocated < big_extent_len) { + if (!ext_ptr) + do_error( +_("error - not enough free space in filesystem\n")); /* * use up the extent we've got */ From darrick.wong@oracle.com Mon Aug 29 22:46:42 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DD5727CA0 for ; Mon, 29 Aug 2016 22:46:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6C483AC003 for ; Mon, 29 Aug 2016 20:46:38 -0700 (PDT) X-ASG-Debug-ID: 1472528795-0bf8155c77344de0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id WkjebfEonaPm9l9O (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Mon, 29 Aug 2016 20:46:36 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7U3kYeJ025082 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 30 Aug 2016 03:46:34 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u7U3kYBI016133 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 03:46:34 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7U3kX1S001208; Tue, 30 Aug 2016 03:46:34 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 29 Aug 2016 20:46:33 -0700 Date: Mon, 29 Aug 2016 20:46:32 -0700 From: "Darrick J. Wong" To: Dave Chinner Cc: xfs@oss.sgi.com, linux-xfs@vger.kernel.org Subject: [PATCH] xfs_db: pass the inode cluster offset when copying inodes Message-ID: <20160830034631.GL22760@birch.djwong.org> X-ASG-Orig-Subj: [PATCH] xfs_db: pass the inode cluster offset when copying inodes MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: userv0022.oracle.com [156.151.31.74] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472528796 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1186 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32446 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines In copy_inode_chunk, we try to determine whether or not an inode is free as part of copying the inode records. The macros involved in testing ir_free require both the inode record and the offset of an inode within that chunk. Prior to sparse inode support, the loop index "i" was also the inode chunk offset; however, when sparse support was added, "i" became the inode offset within a cluster and "ioff" became the inode cluster offset within an inode chunk. Therefore, it is necessary to pass "ioff + i" to do the free-ness calculation correctly. This was discovered while trying to take metadumps of fs images for scrub testing. Signed-off-by: Darrick J. Wong --- db/metadump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/metadump.c b/db/metadump.c index e82b660..c769958 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -2292,7 +2292,7 @@ copy_inode_chunk( /* process_inode handles free inodes, too */ if (!process_inode(agno, agino + ioff + i, dip, - XFS_INOBT_IS_FREE_DISK(rp, i))) + XFS_INOBT_IS_FREE_DISK(rp, ioff + i))) goto pop_out; inodes_copied++; From zlang@redhat.com Tue Aug 30 02:35:40 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D6807CA0 for ; Tue, 30 Aug 2016 02:35:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 31C0D8F8039 for ; Tue, 30 Aug 2016 00:35:37 -0700 (PDT) X-ASG-Debug-ID: 1472542535-0bf57b531238ef30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YjW0hjBFvkY897T5 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 30 Aug 2016 00:35:36 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 19DFB1555D; Tue, 30 Aug 2016 07:35:35 +0000 (UTC) Received: from localhost (dhcp-13-34.nay.redhat.com [10.66.13.34]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7U7ZXCc011490; Tue, 30 Aug 2016 03:35:34 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH] xfs/187: fix new sb_features2 ftype stop case running Date: Tue, 30 Aug 2016 15:35:32 +0800 X-ASG-Orig-Subj: [PATCH] xfs/187: fix new sb_features2 ftype stop case running Message-Id: <1472542532-16497-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 30 Aug 2016 07:35:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472542535 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4302 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This case is too old, at that time there's no "ftype" feature for XFS. Due to this case need to clear features2 bits when mkfs.xfs, so ftype bit stop case running for long time. We care 6 features2 bits in this case: "ATTR2, LAZYSBCOUNT, PROJID32BIT, CRC, FTYPE, FINOBT" ATTR2 and LAZYSBCOUNT bits will be tested in case. FINBOT will be disabled if CRC=0. So this patch only check and disable PROJID32BIT, CRC and FTYPE features when mkfs.xfs. Signed-off-by: Zorro Lang --- Hi, I think we shouldn't skip this case if user doesn't specify suitable MKFS_OPTIONS and MOUNT_OPTIONS. Because this case need complex options, nearly no one will specify these all options for xfstests at same time. Thanks, Zorro tests/xfs/187 | 51 ++++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/tests/xfs/187 b/tests/xfs/187 index 836b924..5e7c677 100755 --- a/tests/xfs/187 +++ b/tests/xfs/187 @@ -31,7 +31,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" -here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 @@ -58,24 +57,32 @@ _supported_os Linux _require_scratch _require_attrs -_require_attr_v1 -_require_projid16bit rm -f $seqres.full - +_scratch_mkfs >/dev/null 2>&1 # Reset the options so that we can control what is going on here -export MKFS_OPTIONS="" -export MOUNT_OPTIONS="" - -# lazysb, attr2 and other feature bits are held in features2 and will require -# morebitsbit on So test with lazysb and without it to see if the morebitsbit is -# okay etc. If the mkfs defaults change, these need to change as well. -export MKFS_NO_LAZY="-m crc=0 -l lazy-count=0 -i projid32bit=0" -export MKFS_LAZY="-m crc=0 -l lazy-count=1 -i projid32bit=0" +MKFS_OPTIONS="" +MOUNT_OPTIONS="" +ver2=`$XFS_DB_PROG -c version $SCRATCH_DEV | sed -n -e "s/,/ /g" \ + -e "s/.*MOREBITS\(.*\)/\1/p"` +# clear features2 bits which we won't test +for b in $ver2; do + case $b in + CRC) + MKFS_OPTIONS="$MKFS_OPTIONS -m crc=0" + ;; + PROJID32BIT) + MKFS_OPTIONS="$MKFS_OPTIONS -i projid32bit=0" + ;; + FTYPE) + MKFS_OPTIONS="$MKFS_OPTIONS -n ftype=0" + ;; + esac +done # Make sure that when we think we are testing with morebits off # that we really are. -_scratch_mkfs -i attr=1 $MKFS_NO_LAZY >/dev/null 2>&1 +_scratch_mkfs -i attr=1 -l lazy-count=0 >/dev/null 2>&1 $XFS_DB_PROG -c version $SCRATCH_DEV 2>&1 >$tmp.db if grep -i morebits $tmp.db then @@ -90,13 +97,13 @@ echo "*** 1. test attr2 mkfs and then noattr2 mount ***" echo "" echo "attr2 fs" echo "" -_scratch_mkfs -i attr=2 $MKFS_NO_LAZY >/dev/null 2>&1 +_scratch_mkfs -i attr=2 -l lazy-count=0 >/dev/null 2>&1 $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version echo "" echo "noattr2 fs" echo "" _scratch_mount -o noattr2 -$UMOUNT_PROG $SCRATCH_MNT +_scratch_unmount $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version # adding an EA will ensure the ATTR1 flag is turned on @@ -105,7 +112,7 @@ echo "*** 2. test attr2 mkfs and then noattr2 mount with 1 EA ***" echo "" echo "attr2 fs" echo "" -_scratch_mkfs -i attr=2 $MKFS_NO_LAZY >/dev/null 2>&1 +_scratch_mkfs -i attr=2 -l lazy-count=0 >/dev/null 2>&1 $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version echo "" echo "noattr2 fs" @@ -115,8 +122,8 @@ cd $SCRATCH_MNT touch testfile $SETFATTR_PROG -n user.test -v 0xbabe testfile $GETFATTR_PROG testfile -cd $here -$UMOUNT_PROG $SCRATCH_MNT +cd - >/dev/null +_scratch_unmount $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version echo "" @@ -125,16 +132,14 @@ echo "" echo "" echo "attr2 fs" echo "" -_scratch_mkfs -i attr=2 $MKFS_LAZY >/dev/null 2>&1 +_scratch_mkfs -i attr=2 -l lazy-count=1 >/dev/null 2>&1 $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version echo "" echo "noattr2 fs" echo "" _scratch_mount -o noattr2 -cd $SCRATCH_MNT -touch testfile -cd $here -$UMOUNT_PROG $SCRATCH_MNT +touch $SCRATCH_MNT/testfile +_scratch_unmount $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version # success, all done -- 2.7.4 From hch@lst.de Tue Aug 30 09:40:15 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9507E7CA0 for ; Tue, 30 Aug 2016 09:40:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5618F8F8064 for ; Tue, 30 Aug 2016 07:40:12 -0700 (PDT) X-ASG-Debug-ID: 1472568007-0bf8155c753966d0001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id 8POcGzQmuYcV0nw9 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 30 Aug 2016 07:40:08 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 4235A68DC5; Tue, 30 Aug 2016 16:40:06 +0200 (CEST) Date: Tue, 30 Aug 2016 16:40:06 +0200 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case Message-ID: <20160830144006.GA14504@lst.de> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-4-git-send-email-hch@lst.de> <20160825123808.GC25041@bfoster.bfoster> <20160826142616.GA21535@lst.de> <20160826160209.GB17728@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826160209.GB17728@bfoster.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1472568008 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 442 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32456 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 26, 2016 at 12:02:09PM -0400, Brian Foster wrote: > > I don't think taking it should be too bad, but given the ops ordering > > it also seems entirely pointless to even take it. > > > > Then why are we taking it? I assumed it at least served as a memory > barrier... I meant to take it for that early check, not in general. I guess this is another hint we should try to look into using proper atomic bitops here.. From hch@lst.de Tue Aug 30 09:44:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9C6B27CA1 for ; Tue, 30 Aug 2016 09:44:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 600238F8040 for ; Tue, 30 Aug 2016 07:44:30 -0700 (PDT) X-ASG-Debug-ID: 1472568267-0bf57b53143c3e40001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id T9FBsiA9JTUyz78q (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 30 Aug 2016 07:44:28 -0700 (PDT) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Effective-Source-IP: verein.lst.de[213.95.11.211] X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id 9FA8C68DC6; Tue, 30 Aug 2016 16:44:26 +0200 (CEST) Date: Tue, 30 Aug 2016 16:44:26 +0200 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path Message-ID: <20160830144426.GB14504@lst.de> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-5-git-send-email-hch@lst.de> <20160825143708.GD25041@bfoster.bfoster> <20160826143344.GB21535@lst.de> <20160826160339.GC17728@bfoster.bfoster> <20160826160753.GD17728@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826160753.GD17728@bfoster.bfoster> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1472568267 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 590 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 26, 2016 at 12:07:53PM -0400, Brian Foster wrote: > > Not quite sure I follow the last bit, but I don't necessarily think the > > whole thing has to be boxed into a helper to clean it up. E.g., I'd do > > something like the appended diff (compile tested only). > > > > ... and if the function signature is really an issue, trade off idx & > prev for a conditional base preallocation size (applies on top of the > previous diff): These two patches together look pretty reasonable. I'll retest with it include and will pick it up for the next version if it works. From eguan@redhat.com Tue Aug 30 09:48:57 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1C70F7CA2 for ; Tue, 30 Aug 2016 09:48:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7DFB2AC004 for ; Tue, 30 Aug 2016 07:48:53 -0700 (PDT) X-ASG-Debug-ID: 1472568531-0bf57b53143c4800001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2i2IQe7cWMIMKMpm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 30 Aug 2016 07:48:52 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 763E53F729; Tue, 30 Aug 2016 14:48:51 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7UEmoPI022614; Tue, 30 Aug 2016 10:48:50 -0400 Date: Tue, 30 Aug 2016 22:48:49 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: BUG: Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c Message-ID: <20160830144849.GL27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: BUG: Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c References: <20160829103754.GH27776@eguan.usersys.redhat.com> <20160830023905.GU19025@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160830023905.GU19025@dastard> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Tue, 30 Aug 2016 14:48:51 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472568532 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5289 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 30, 2016 at 12:39:05PM +1000, Dave Chinner wrote: > > [root@hp-dl360g9-15 ~]# xfs_info / > > meta-data=/dev/mapper/systemvg-root isize=256 agcount=16, agsize=2927744 blks > > = sectsz=512 attr=2, projid32bit=1 > > = crc=0 finobt=0 spinodes=0 > > data = bsize=4096 blocks=46843904, imaxpct=25 > > = sunit=64 swidth=192 blks > > naming =version 2 bsize=4096 ascii-ci=0 ftype=0 > > log =internal bsize=4096 blocks=22912, version=2 > > = sectsz=512 sunit=64 blks, lazy-count=1 > > realtime =none extsz=4096 blocks=0, rtextents=0 > > Does it reproduce on a CRC enabled filesystem? Yes, it does. And I tried to reduce the test time by reducing the workload (less processes forked 30->10, less iterations in each process 10->5) but failed. I'll continue work on that. [root@hp-dl360g9-15 ~]# xfs_info /mnt/xfs/ meta-data=/dev/mapper/systemvg-lv50g isize=512 agcount=16, agsize=819200 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 rmapbt=0 data = bsize=4096 blocks=13107200, imaxpct=25 = sunit=64 swidth=192 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=6400, version=2 = sectsz=512 sunit=64 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [39200.052565] XFS (dm-3): Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c. Caller xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [39200.117990] CPU: 2 PID: 13175 Comm: kworker/u33:0 Tainted: G W 4.8.0-rc3 #1 [39200.155312] Hardware name: HP ProLiant DL360 Gen9, BIOS P89 05/06/2015 [39200.184549] Workqueue: writeback wb_workfn (flush-253:3) [39200.208417] 0000000000000286 00000000ee09c3c6 ffff88005208b7a0 ffffffff8135c53c [39200.241625] ffff880316eb8bc8 0000000000000001 ffff88005208b7b8 ffffffffa02e99cb [39200.274892] ffffffffa02f5537 ffff88005208b7e0 ffffffffa03053e6 ffff880fe8d28f00 [39200.308115] Call Trace: [39200.319060] [] dump_stack+0x63/0x87 [39200.342241] [] xfs_error_report+0x3b/0x40 [xfs] [39200.370008] [] ? xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [39200.402497] [] xfs_trans_cancel+0xb6/0xe0 [xfs] [39200.430260] [] xfs_iomap_write_allocate+0x2d7/0x380 [xfs] [39200.461871] [] xfs_map_blocks+0x1a9/0x220 [xfs] [39200.489701] [] xfs_do_writepage+0x16b/0x560 [xfs] [39200.518171] [] write_cache_pages+0x26f/0x510 [39200.544290] [] ? blk_queue_bio+0x1ab/0x3a0 [39200.570043] [] ? xfs_vm_set_page_dirty+0x1e0/0x1e0 [xfs] [39200.606240] [] xfs_vm_writepages+0xb6/0xe0 [xfs] [39200.636151] [] do_writepages+0x1e/0x30 [39200.660355] [] __writeback_single_inode+0x45/0x330 [39200.689176] [] writeback_sb_inodes+0x282/0x570 [39200.716875] [] __writeback_inodes_wb+0x8c/0xc0 [39200.744181] [] wb_writeback+0x286/0x320 [39200.768725] [] wb_workfn+0x109/0x3f0 [39200.792110] [] process_one_work+0x152/0x400 [39200.818480] [] worker_thread+0x125/0x4b0 [39200.843463] [] ? rescuer_thread+0x380/0x380 [39200.869279] [] kthread+0xd8/0xf0 [39200.891301] [] ret_from_fork+0x1f/0x40 [39200.916321] [] ? kthread_park+0x60/0x60 [39200.941595] XFS (dm-3): xfs_do_force_shutdown(0x8) called from line 985 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa03053ff [39201.097512] XFS (dm-3): Corruption of in-memory data detected. Shutting down filesystem [39201.137777] XFS (dm-3): Please umount the filesystem and rectify the problem(s) [39201.170534] Buffer I/O error on dev dm-3, logical block 2653783, lost async page write [39201.206111] Buffer I/O error on dev dm-3, logical block 2653784, lost async page write [39201.241644] Buffer I/O error on dev dm-3, logical block 2653785, lost async page write [39201.276902] Buffer I/O error on dev dm-3, logical block 2653786, lost async page write [39201.312405] Buffer I/O error on dev dm-3, logical block 2653787, lost async page write [39201.347927] Buffer I/O error on dev dm-3, logical block 2653788, lost async page write [39201.383415] Buffer I/O error on dev dm-3, logical block 2653789, lost async page write [39201.419254] Buffer I/O error on dev dm-3, logical block 2653790, lost async page write [39201.454723] Buffer I/O error on dev dm-3, logical block 2653791, lost async page write [39222.364615] XFS (dm-3): xfs_log_force: error -5 returned. [39252.572790] XFS (dm-3): xfs_log_force: error -5 returned. [39282.780966] XFS (dm-3): xfs_log_force: error -5 returned. Thanks, Eryu From dan.j.williams@gmail.com Tue Aug 30 09:53:48 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BFFC37CA4 for ; Tue, 30 Aug 2016 09:53:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F9BF304039 for ; Tue, 30 Aug 2016 07:53:45 -0700 (PDT) X-ASG-Debug-ID: 1472568822-0bf57b53143c54b0001-NocioJ Received: from mail-qk0-f180.google.com (mail-qk0-f180.google.com [209.85.220.180]) by cuda.sgi.com with ESMTP id WyBPClcvTGilrcQV (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 30 Aug 2016 07:53:43 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@gmail.com X-Barracuda-Effective-Source-IP: mail-qk0-f180.google.com[209.85.220.180] X-Barracuda-Apparent-Source-IP: 209.85.220.180 Received: by mail-qk0-f180.google.com with SMTP id l2so20858013qkf.3 for ; Tue, 30 Aug 2016 07:53:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=tiOMl2pradD81jb/Y7uqUR1x52+F2sodVzUfLf7OFjk=; b=yktrb6e0DR4m1JVXhPMsuhGn0JR8SWOFOSzPBuES+frxfUlShscLInhwg1+Bz3jPST Hb0LLOxx2rZukTLrH6VQ35Oy5+hj092sSM2+xK7NYDAsRnKSpk0LS/iEHNRqOcWEztAi Ja92YlE9V53wWec1YVr/ivfLIzhrhw8n6h77ogagO3Rt6PTxhfPbF4DT8Dm7yrkUBWyE 5i2zWp2dFxMM0MIGb+lDwn2P8TyTCitmTGglVgzwrkyZCJVYPZ/UoF3oZGw/YsZhm0fa cvUrDCdB8bLFGslnCqxk8Z+LHv2xkwyLYgZ5m8veBL6N65siOi4lsP1AEJokjE+StDqo N+CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=tiOMl2pradD81jb/Y7uqUR1x52+F2sodVzUfLf7OFjk=; b=iaq9C/ZGJ+//BLz0H1c8Zt1d35w0z7bMhEhkd1EKxAdy+Hmac2i+rmb4FiVR1im53I gk/1CPQ6LRaHmZdj2hYkk9ac8ZgqmiLZoDuoGdZv1K3y+YVKG94hqYtrkfixzjldA1BL tNOAJ+Pnra6/47PoYJawEsRs0ysM+ccEa20piK2sctmkvbKmrT8sy+g4/iKkZvapvNRS UiXfx8Des/u+2+lcgVgga6ohKoN9Lp6oaCbUO5yD0YsIctKJbj9iXZpzj088HoBTyCS2 d7ClrkLU9WQcuOIg02/Ps/vGmqxbJZ8MFY1ggCijfXne10ijogcqM1dLfQkFfGrCXVeE ytCA== X-Gm-Message-State: AE9vXwNkBYAnOYKk+tmYayglmsxfN58atoHqs+E8qrsentkS/Hb+sUjAQtiRN2e//j/pSQR+IHBQm8CC8jlT/g== X-Received: by 10.55.23.28 with SMTP id i28mr4622635qkh.232.1472568822546; Tue, 30 Aug 2016 07:53:42 -0700 (PDT) MIME-Version: 1.0 Sender: dan.j.williams@gmail.com Received: by 10.237.50.102 with HTTP; Tue, 30 Aug 2016 07:53:41 -0700 (PDT) In-Reply-To: <20160830023727.GH22760@birch.djwong.org> References: <20160804024514.GA2906@xzhoul.usersys.redhat.com> <20160830023727.GH22760@birch.djwong.org> From: Dan Williams Date: Tue, 30 Aug 2016 07:53:41 -0700 X-Google-Sender-Auth: B1fnBI9qM3pHp7QczHsqNpFEhzE Message-ID: Subject: Re: xfstests xfs fuzzers fail with DAX To: "Darrick J. Wong" X-ASG-Orig-Subj: Re: xfstests xfs fuzzers fail with DAX Cc: linux-nvdimm , XFS Developers , "linux-kernel@vger.kernel.org" Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qk0-f180.google.com[209.85.220.180] X-Barracuda-Start-Time: 1472568823 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1950 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Aug 29, 2016 at 7:37 PM, Darrick J. Wong wrote: > On Mon, Aug 29, 2016 at 06:50:05PM -0700, Dan Williams wrote: >> [ Adding Darrick on the off chance that this triggers an "aha, of >> course it does!" ] > > Aha! Of course it does!!! :) Heh, thanks :). And apologies to Dave for missing his earlier note pointing out the delalloc failure, linux-nvdimm list ate the response. > >> Darrick these corruption tests you added to xfstests last year all >> fail the same way with DAX enabled. They spew: >> >> "pwrite64: Structure needs cleaning" >> >> ...reports that are cleaned up by running without "-o dax". > > I think this happens because in non-dax mode, the pwrite is a buffered > write and so long as we can create a delalloc reservation, everything > is ok and nothing fails. Whereas for dax we have to allocate the > blocks for the pwrite immediately, thereby triggering the cntbt > verifier error. > > Proceeding from the assumption "DAX behaves a lot like DIO", all the > tests that rely on buffered mode semantics are going to choke if DAX > is turned on without them knowing about it. > >> Alternatively you could sit back and watch me try to figure it out, >> that should be quite entertaining... as a start I'll try to pin down a >> stack trace when the error is returned. > > As for how to fix this, probably the best option is to change line 98 > to 'pwrite -W -S 0x62...' and update the output to include the > 'structure needs cleaning' message. I'll give it a shot. > Or get rid of the mount option and require explicitly turning on DAX > on a per-inode basis, which I think is where Dave is already going. Yes, I think we can't run away from the dax mount option fast enough. The semantics are different, so an application / administrator needs to explicitly opt-in to DAX semantics per-inode otherwise we are guaranteed to cause surprises. From sandeen@sandeen.net Tue Aug 30 11:25:30 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-100.0 required=5.0 tests=USER_IN_WHITELIST autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA3B47CA0 for ; Tue, 30 Aug 2016 11:25:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F0FC8F8054 for ; Tue, 30 Aug 2016 09:25:27 -0700 (PDT) X-ASG-Debug-ID: 1472574324-0bf81509b039c0b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id EWmwgUEsrSCPzMzk for ; Tue, 30 Aug 2016 09:25:24 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 95625170B5B for ; Tue, 30 Aug 2016 11:25:24 -0500 (CDT) To: xfs-oss From: Eric Sandeen Subject: [ANNOUNCE] Mailing list migration to vger.kernel.org Message-ID: <548eff95-ae10-d1ae-a785-e1ffc9e04c94@sandeen.net> X-ASG-Orig-Subj: [ANNOUNCE] Mailing list migration to vger.kernel.org Date: Tue, 30 Aug 2016 11:25:24 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1472574324 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1132 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32460 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- (3rd try, with still more obfuscated information, ugh) (2nd try, first was caught in the spam trap?) The XFS mailing list will be moving to linux-xfs at vger.kernel.org by the end of this month. As of Oct 1, we plan to disable this list hosted on the oss sgi server. We are unable to transfer the current subscriber list to vger, so anyone who wishes to remain subscribed to the xfs mailing list will need to manually subscribe to the list on vger dot kernel.org. Please see the URL: vger.kernel.org/vger-lists.html#linux-xfs for details and a helpful link. The kernel.org list is active now, so please start making the mental and technological transition to using that list for new emails in the coming weeks. It is probably be best to cc: the old list for the time being, for the benefit of those not yet subscribed to the new list. In addition to list migration, we will also be moving all other resources - git, ftp, etc away from the sgi server and onto kernel.org infrastructure in coming weeks. I'll send out periodic reminders as we approach the deadline as well. Thanks, -Eric From dan.j.williams@intel.com Tue Aug 30 11:25:49 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3CF367CA0 for ; Tue, 30 Aug 2016 11:25:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA5DB8F804C for ; Tue, 30 Aug 2016 09:25:48 -0700 (PDT) X-ASG-Debug-ID: 1472574346-0bf8155c753a41a0001-NocioJ Received: from mail-oi0-f46.google.com (mail-oi0-f46.google.com [209.85.218.46]) by cuda.sgi.com with ESMTP id kwtpTBsAQW1UB9Lu (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Tue, 30 Aug 2016 09:25:47 -0700 (PDT) X-Barracuda-Envelope-From: dan.j.williams@intel.com X-Barracuda-Effective-Source-IP: mail-oi0-f46.google.com[209.85.218.46] X-Barracuda-Apparent-Source-IP: 209.85.218.46 Received: by mail-oi0-f46.google.com with SMTP id j203so33249474oih.2 for ; Tue, 30 Aug 2016 09:25:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=YcSSKRoms9I7PyIc9Do2dfbyUpu9BoQmo/CT2tTpNQw=; b=fccwvwGmblrlC9QfILmSv+iHXZ2rc8dDD26tzPuGA5Uq8UuH6oitvll0gzsNOFDrt6 oTqtMxOHAAMrjUZvSsOuwKh2vXPF2xZFzJh9KoaP0U4Fc7M77JPw+PrEp8xIY2cYP/Gn PutHY2+T5Bb//LksNmJU4aDe4vHJVyM6z1D8Qn/DM0lXw+Lmka7//HrmcFV2nCLmBNWt vG+z1yDrWxhvHqwFrgaAcHyeaICWSb0KWmsQhSdXVuJy0OE1usmv+yWpCOzh+8xENHVW NFmQCqriuNIeJh/a4UXUaiAX5AAe0Mfgi+k53l8adtXVYaYZb2v/ECXkbGtoeF4eNslR 9TdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=YcSSKRoms9I7PyIc9Do2dfbyUpu9BoQmo/CT2tTpNQw=; b=VfgxFxtXLCQE+ZmsGr4tcjUGsJAIU86EeGBQT3L43UGHIh8ghvblnTDcdT26KxsX85 2Fqtz01bqK++Ly3dA8WwIXFK2qef+LvUKesPCmKQIqEOjM46MPVt26NREpxxSZT4jeMO kkpiTWPB680Fwb9uJNhBPFZIKZRM9ZhV3zhQVL/2BiuSvAG7XMTKwWnCS2/iny6F+9FP k3o5b1JP+u/HsaRKYCl0Er9VJ+hTIGAZCNnt8ojeqCRkO9SJQNZbHkcPlIF9pUJXj4ui zhOz67+BIjpSbyxzet2SODDYe/3FMfmQX4WiQFbnjGBSAPA5984Mnk8EB22FEF7Xt7wr aKZA== X-Gm-Message-State: AE9vXwOBA1pXB72ODcQAXWhuRtwqQDRIlmJDWlDCWJ9JfiSY77mRfpe6FIWPqeZWrJqeZUAE6vUtkwpOEagm+IUx X-Received: by 10.157.46.113 with SMTP id c46mr4971552otd.29.1472574346314; Tue, 30 Aug 2016 09:25:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.157.7.232 with HTTP; Tue, 30 Aug 2016 09:25:45 -0700 (PDT) In-Reply-To: References: <20160804024514.GA2906@xzhoul.usersys.redhat.com> <20160830023727.GH22760@birch.djwong.org> From: Dan Williams Date: Tue, 30 Aug 2016 09:25:45 -0700 Message-ID: Subject: Re: xfstests xfs fuzzers fail with DAX To: "Darrick J. Wong" X-ASG-Orig-Subj: Re: xfstests xfs fuzzers fail with DAX Cc: linux-nvdimm , "linux-kernel@vger.kernel.org" , XFS Developers Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oi0-f46.google.com[209.85.218.46] X-Barracuda-Start-Time: 1472574346 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3071 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32460 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Aug 30, 2016 at 7:53 AM, Dan Williams wrote: > On Mon, Aug 29, 2016 at 7:37 PM, Darrick J. Wong > wrote: >> On Mon, Aug 29, 2016 at 06:50:05PM -0700, Dan Williams wrote: >>> [ Adding Darrick on the off chance that this triggers an "aha, of >>> course it does!" ] >> >> Aha! Of course it does!!! :) > > Heh, thanks :). And apologies to Dave for missing his earlier note > pointing out the delalloc failure, linux-nvdimm list ate the response. > >> >>> Darrick these corruption tests you added to xfstests last year all >>> fail the same way with DAX enabled. They spew: >>> >>> "pwrite64: Structure needs cleaning" >>> >>> ...reports that are cleaned up by running without "-o dax". >> >> I think this happens because in non-dax mode, the pwrite is a buffered >> write and so long as we can create a delalloc reservation, everything >> is ok and nothing fails. Whereas for dax we have to allocate the >> blocks for the pwrite immediately, thereby triggering the cntbt >> verifier error. >> >> Proceeding from the assumption "DAX behaves a lot like DIO", all the >> tests that rely on buffered mode semantics are going to choke if DAX >> is turned on without them knowing about it. >> >>> Alternatively you could sit back and watch me try to figure it out, >>> that should be quite entertaining... as a start I'll try to pin down a >>> stack trace when the error is returned. >> >> As for how to fix this, probably the best option is to change line 98 >> to 'pwrite -W -S 0x62...' and update the output to include the >> 'structure needs cleaning' message. > > I'll give it a shot. So, that did not modulate the failure or the passing case. However, using -d at line 122 makes the no-dax case fail the same as the dax case. Would a change like this be acceptable in the interim while we figure out which tests are delalloc sensitive, or did I just invalidate the test? diff --git a/tests/xfs/086 b/tests/xfs/086 index 143915bafaa1..26607c7a4697 100755 --- a/tests/xfs/086 +++ b/tests/xfs/086 @@ -96,7 +96,7 @@ _scratch_mount echo "+ modify files" for x in `seq 1 64`; do - $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full + $XFS_IO_PROG -f -c "pwrite -d -S 0x62 0 ${blksz}" "${TESTFILE}.${x}" >> $seqres.full done umount "${SCRATCH_MNT}" @@ -119,7 +119,7 @@ echo "broken: ${broken}" # Try appending again, now that we've fixed the fs echo "+ modify files (2)" for x in `seq 1 64`; do - $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres.fu + $XFS_IO_PROG -f -c "pwrite -d -S 0x62 ${blksz} ${blksz}" "${TESTFILE}.${x}" >> $seqres done umount "${SCRATCH_MNT}" diff --git a/tests/xfs/086.out b/tests/xfs/086.out index 6c053f42deea..e2ec84e6b90f 100644 --- a/tests/xfs/086.out +++ b/tests/xfs/086.out @@ -16,5 +16,5 @@ broken: 1 + mount image + chattr -R -i + check files (2) -broken: 0 +broken: 1 + check fs (2) From darrick.wong@oracle.com Tue Aug 30 11:40:04 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B2D837CA0 for ; Tue, 30 Aug 2016 11:40:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0A5A3AC002 for ; Tue, 30 Aug 2016 09:40:00 -0700 (PDT) X-ASG-Debug-ID: 1472575198-0bf57c1b08bc890001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id H9DvLtjf8ZOJMhai (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 30 Aug 2016 09:39:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: userp1040.oracle.com[156.151.31.81] X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7UGdtCx017528 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 16:39:56 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7UGdtaN019027 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 16:39:55 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id u7UGdteM002199; Tue, 30 Aug 2016 16:39:55 GMT Received: from localhost (/24.21.211.40) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 30 Aug 2016 09:39:54 -0700 Date: Tue, 30 Aug 2016 09:39:53 -0700 From: "Darrick J. Wong" To: Dan Williams Cc: linux-nvdimm , "linux-kernel@vger.kernel.org" , XFS Developers Subject: Re: xfstests xfs fuzzers fail with DAX Message-ID: <20160830163953.GA26710@birch.djwong.org> X-ASG-Orig-Subj: Re: xfstests xfs fuzzers fail with DAX References: <20160804024514.GA2906@xzhoul.usersys.redhat.com> <20160830023727.GH22760@birch.djwong.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1472575198 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3387 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32459 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Tue, Aug 30, 2016 at 09:25:45AM -0700, Dan Williams wrote: > On Tue, Aug 30, 2016 at 7:53 AM, Dan Williams wrote: > > On Mon, Aug 29, 2016 at 7:37 PM, Darrick J. Wong > > wrote: > >> On Mon, Aug 29, 2016 at 06:50:05PM -0700, Dan Williams wrote: > >>> [ Adding Darrick on the off chance that this triggers an "aha, of > >>> course it does!" ] > >> > >> Aha! Of course it does!!! :) > > > > Heh, thanks :). And apologies to Dave for missing his earlier note > > pointing out the delalloc failure, linux-nvdimm list ate the response. > > > >> > >>> Darrick these corruption tests you added to xfstests last year all > >>> fail the same way with DAX enabled. They spew: > >>> > >>> "pwrite64: Structure needs cleaning" > >>> > >>> ...reports that are cleaned up by running without "-o dax". > >> > >> I think this happens because in non-dax mode, the pwrite is a buffered > >> write and so long as we can create a delalloc reservation, everything > >> is ok and nothing fails. Whereas for dax we have to allocate the > >> blocks for the pwrite immediately, thereby triggering the cntbt > >> verifier error. > >> > >> Proceeding from the assumption "DAX behaves a lot like DIO", all the > >> tests that rely on buffered mode semantics are going to choke if DAX > >> is turned on without them knowing about it. > >> > >>> Alternatively you could sit back and watch me try to figure it out, > >>> that should be quite entertaining... as a start I'll try to pin down a > >>> stack trace when the error is returned. > >> > >> As for how to fix this, probably the best option is to change line 98 > >> to 'pwrite -W -S 0x62...' and update the output to include the > >> 'structure needs cleaning' message. > > > > I'll give it a shot. > > So, that did not modulate the failure or the passing case. However, > using -d at line 122 makes the no-dax case fail the same as the dax > case. > > Would a change like this be acceptable in the interim while we figure > out which tests are delalloc sensitive, or did I just invalidate the > test? > > diff --git a/tests/xfs/086 b/tests/xfs/086 > index 143915bafaa1..26607c7a4697 100755 > --- a/tests/xfs/086 > +++ b/tests/xfs/086 > @@ -96,7 +96,7 @@ _scratch_mount > > echo "+ modify files" > for x in `seq 1 64`; do > - $XFS_IO_PROG -f -c "pwrite -S 0x62 0 ${blksz}" > "${TESTFILE}.${x}" >> $seqres.full > + $XFS_IO_PROG -f -c "pwrite -d -S 0x62 0 ${blksz}" > "${TESTFILE}.${x}" >> $seqres.full > done > umount "${SCRATCH_MNT}" > > @@ -119,7 +119,7 @@ echo "broken: ${broken}" > # Try appending again, now that we've fixed the fs > echo "+ modify files (2)" > for x in `seq 1 64`; do > - $XFS_IO_PROG -f -c "pwrite -S 0x62 ${blksz} ${blksz}" > "${TESTFILE}.${x}" >> $seqres.fu > + $XFS_IO_PROG -f -c "pwrite -d -S 0x62 ${blksz} ${blksz}" > "${TESTFILE}.${x}" >> $seqres > done > umount "${SCRATCH_MNT}" > > diff --git a/tests/xfs/086.out b/tests/xfs/086.out > index 6c053f42deea..e2ec84e6b90f 100644 > --- a/tests/xfs/086.out > +++ b/tests/xfs/086.out > @@ -16,5 +16,5 @@ broken: 1 > + mount image > + chattr -R -i > + check files (2) > -broken: 0 > +broken: 1 There shouldn't be any brokenness left over at this point in the test. --D > + check fs (2) From darrick.wong@oracle.com Tue Aug 30 14:10:05 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 685927CA0 for ; Tue, 30 Aug 2016 14:10:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A167304039 for ; Tue, 30 Aug 2016 12:10:02 -0700 (PDT) X-ASG-Debug-ID: 1472584198-0bf57b53113e7980001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id Xnu0JeCpsI7aHUAm (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 30 Aug 2016 12:09:58 -0700 (PDT) X-Barracuda-Envelope-From: darrick.wong@oracle.com X-Barracuda-Effective-Source-IP: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u7UJ9qOv007946 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 19:09:52 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u7UJ9qSF021539 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2016 19:09:52 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u7UJ9piN002038; Tue, 30 Aug 2016 19:09:51 GMT Received: from localhost (/10.145.178.207) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 30 Aug 2016 12:09:51 -0700 Date: Tue, 30 Aug 2016 12:09:49 -0700 From: "Darrick J. Wong" To: Andreas Dilger Cc: mtk.manpages@gmail.com, linux-fsdevel@vger.kernel.org, linux-api@vger.kernel.org, linux-man@vger.kernel.org, xfs , linux-xfs@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 3/3] ioctl_xfs_ioc_getfsmap.2: document XFS_IOC_GETFSMAP ioctl Message-ID: <20160830190949.GA8262@birch.djwong.org> X-ASG-Orig-Subj: Re: [PATCH 3/3] ioctl_xfs_ioc_getfsmap.2: document XFS_IOC_GETFSMAP ioctl References: <147216758326.32321.8525481353986871349.stgit@birch.djwong.org> <147216760214.32321.8331561706153372268.stgit@birch.djwong.org> <32A3DAED-21FC-4252-B53E-3503764342E8@dilger.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <32A3DAED-21FC-4252-B53E-3503764342E8@dilger.ca> User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1472584198 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 16637 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32464 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines [add a few more relevant lists to cc] On Mon, Aug 29, 2016 at 03:34:11PM -0600, Andreas Dilger wrote: > On Aug 25, 2016, at 5:26 PM, Darrick J. Wong wrote: > > > > Document the new XFS_IOC_GETFSMAP ioctl that returns the physical > > layout of a (disk-based) filesystem. > > > > Signed-off-by: Darrick J. Wong > > --- > > man2/ioctl_xfs_ioc_getfsmap.2 | 294 +++++++++++++++++++++++++++++++++++++++++ > > 1 file changed, 294 insertions(+) > > create mode 100644 man2/ioctl_xfs_ioc_getfsmap.2 > > > > > > diff --git a/man2/ioctl_xfs_ioc_getfsmap.2 b/man2/ioctl_xfs_ioc_getfsmap.2 > > new file mode 100644 > > index 0000000..0d9ed47 > > --- /dev/null > > +++ b/man2/ioctl_xfs_ioc_getfsmap.2 > > @@ -0,0 +1,294 @@ > > +.\" Copyright (c) 2016, Oracle. All rights reserved. > > +.\" > > +.\" %%%LICENSE_START(GPLv2+_DOC_FULL) > > +.\" This is free documentation; you can redistribute it and/or > > +.\" modify it under the terms of the GNU General Public License as > > +.\" published by the Free Software Foundation; either version 2 of > > +.\" the License, or (at your option) any later version. > > +.\" > > +.\" The GNU General Public License's references to "object code" > > +.\" and "executables" are to be interpreted as the output of any > > +.\" document formatting or typesetting system, including > > +.\" intermediate and printed output. > > +.\" > > +.\" This manual is distributed in the hope that it will be useful, > > +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of > > +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +.\" GNU General Public License for more details. > > +.\" > > +.\" You should have received a copy of the GNU General Public > > +.\" License along with this manual; if not, see > > +.\" . > > +.\" %%%LICENSE_END > > +.TH IOCTL-XFS_IOC_GETFSMAP 2 2016-07-20 "Linux" "Linux Programmer's Manual" > > +.SH NAME > > +ioctl_xfs_ioc_getfsmap \- retrieve the physical layout of the filesystem > > +.SH SYNOPSIS > > +.br > > +.B #include > > +.br > > +.B #include > > +.sp > > +.BI "int ioctl(int " fd ", XFS_IOC_GETFSMAP, struct getfsmap * " arg ); > > +.SH DESCRIPTION > > +This > > +.BR ioctl (2) > > +retrieves physical extent mappings for a filesystem. > > +This information can be used to discover which files are mapped to a physical > > +block, examine free space, or find known bad blocks, among other things. > > + > > +The sole argument to this ioctl should be an array of the following > > +structure: > > +.in +4n > > +.nf > > + > > +struct getfsmap { > > + __u32 fmv_device; /* device id */ > > + __u32 fmv_unused1; /* future use, must be zero */ > > + __u64 fmv_block; /* starting block */ > > + __u64 fmv_owner; /* owner id */ > > + __u64 fmv_offset; /* file offset of segment */ > > + __u64 fmv_length; /* length of segment, blocks */ > > + __u32 fmv_oflags; /* mapping flags */ > > + __u32 fmv_iflags; /* control flags (1st structure) */ > > + __u32 fmv_count; /* # of entries in array incl. input */ > > + __u32 fmv_entries; /* # of entries filled in (output). */ > > + __u64 fmv_unused2; /* future use, must be zero */ > > +}; > > + > > +.fi > > +.in > > +The array must contain at least two elements. > > +The first two array elements specify the lowest and highest reverse-mapping > > +keys, respectively, for which userspace would like physical mapping > > +information. > > +A reverse mapping key consists of the tuple (device, block, owner, offset). > > +The owner and offset fields are part of the key because some filesystems > > +support sharing physical blocks between multiple files and > > +therefore may return multiple mappings for a given physical block. > > + > > +.SS Fields of struct getfsmap > > +.PP > > +The > > +.I fmv_device > > +field contains a 32-bit cookie to uniquely identify the underlying storage > > +device. > > +If the > > +.B FMV_HOF_DEV_T > > +flag is set in the header's > > +.I fmv_oflags > > +field, this field contains a dev_t from which major and minor numbers can > > +be extracted. > > +If the flag is not set, this field contains a value that must be unique > > +for each storage device. > > + > > +.PP > > +The > > +.I fmv_unused1 > > +field must be zero in the first two array elements. > > + > > +.PP > > +The > > +.I fmv_block > > +field contains the 512-byte sector address of the extent. > > Why would you use 512-byte sectors in a new interface? I started designing XFS GETFSMAP with the intent of making it feel familiar to anyone who'd already used the XFS GETBMAP interface. Hence you pass in an array of struct getfsmap[N] where the start of the array are key fields and the rest are filled out by the kernel, and the units are 512-byte blocks. As a result, some things (special owners in particular) are strongly influenced by XFS. Ofc then LSF happened and the btrfs developers expressed a desire to have a similar call, so now it's out for review on fsdevel. Now there's a question of whether or not we can create a generic enough interface to fit the major filesystems so as not to expose a bunch of balkanized fsmap ioctls to userspace. I also haven't heard much from the btrfs list in previous review cycles. (I say that more in reference to the 'special owners' below than any other part of GETFSMAP.) > I recall for FIEMAP that some filesystems may not have files aligned > to sector offsets, and we just used byte offsets. Storage like > NVDIMMs are cacheline granular, so I don't think it makes sense to > tie this to old disk sector sizes. Alternately, the units could be > in terms of fs blocks as returned by statvfs.st_bsize, but mixing > units for fmv_block, fmv_offset, fmv_length is uneeded complexity. Ugh. I'd rather just change the units to bytes rather than force all the users to multiply things. :) > > + > > +.PP > > +The > > +.I fmv_owner > > +field contains the owner of the extent. > > +This is generally an inode number, though if > > +.B FMV_OF_SPECIAL_OWNER > > +is set in the > > +.I fmv_oflags > > +field, then the owner value is one of the following special values: > > +.TP > > +.B FMV_OWN_FREE > > +Free space. > > +.TP > > +.B FMV_OWN_UNKNOWN > > +This extent has an unknown owner. > > +.TP > > +.B FMV_OWN_FS > > +Static filesystem metadata. "Static filesystem metadata. This information must exist at this disk address; on XFS, this is the AG superblock, AGF, AGI, and AGFL headers." > > +.TP > > +.B FMV_OWN_LOG > > +The filesystem journal. > > +.TP > > +.B FMV_OWN_AG > > +Allocation group metadata. "Allocation group metadata. On XFS these are the free space btrees and the reverse mapping btree." > > +.TP > > +.B FMV_OWN_INODES > > +Inodes. > > +.TP > > +.B FMV_OWN_DEFECTIVE: > > +This extent has been marked defective either by the filesystem or the > > +underlying device. > > These above ones are relatively clear what they are. The next items > are not very clear what they are, These all are very XFS-specific special owner codes; most of them correspond directly to the special owners in the XFS reverse-mapping structure. OWN_FS = AG superblock OWN_AG = free space and rmap btrees OWN_INODES = inode records OWN_INOBT = inode btree pointing to inode record blocks OWN_REFC = reference count btree OWN_COW = extent being used for a copy-on-write OWN_LOG = internal log For ext4, we could probably reuse the owner codes: OWN_FS = superblock + group descriptors OWN_AG = block/inode bitmaps OWN_INODES = inode table OWN_LOG = journal Granted, we could also just smush everything into OWN_METADATA such that the only special owners would be FREE, METADATA, COW, and DEFECTIVE. I don't like that because now the kernel decides to throw away information that userspace might be able to use, because I prefer more expressive APIs. Though I do see the counter-argument that userspace should not have direct access to metadata and therefore needn't know more than it's metadata. I'd much rather just add more special owner codes for any other filesystem that has distinguishable metadata types that are not covered by the existing OWN_ codes. We /do/ have 2^64 possible values, so it's not like we're going to run out. > and whether they need to be exported as specific items, or could > they just be lumped under "FMV_OWN_FS"? If they serve some specific > purpose, at a minimum they need better descriptions. > > > +.TP > > +.B FMV_OWN_INOBT > > +The inode index, if one is provided. "Inode indexing information. On XFS this is the inode btree and free inode btree." ? > > +.TP > > +.B FMV_OWN_REFC > > +Reference counting indexes. "Reference count information. On XFS this is the refcount btree." ? > > +.TP > > +.B FMV_OWN_COW > > +This extent is being used to stage a copy-on-write. I'm not sure if you found this description to be lacking; I think it's fine. > > + > > +.PP > > +The > > +.I fmv_offset > > +field contains the logical address of the reverse mapping record, in units > > +of 512-byte blocks. > > +This field has no meaning if the > > +.BR FMV_OF_SPECIAL_OWNER " or " FMV_OF_EXTENT_MAP > > +flags are set in > > +.IR fmv_oflags "." > > + > > +.PP > > +The > > +.I fmv_length > > +field contains the length of the extent, in units of 512-byte blocks. > > +This field must be zero in the second array element. > > + > > +.PP > > +The > > +.I fmv_oflags > > +field is a bitmask of extent state flags. > > +In the header, the bits are: > > +.TP > > +.B FMV_HOF_DEV_T > > +All > > +.I fmv_device > > +values will be in dev_t format. > > +If this flag is not set, the value is merely a 32-bit cookie that will be > > +unique for each physical device. > > +.TP > > +In a non-header, the bits are: > > +.TP > > +.B FMV_OF_PREALLOC > > +The extent is allocated but not yet written. > > +.TP > > +.B FMV_OF_ATTR_FORK > > +This extent contains extended attribute data. > > +.TP > > +.B FMV_OF_EXTENT_MAP > > +This extent contains extent map information for the owner. > > +.TP > > +.B FMV_OF_SHARED > > +Parts of this extent may be shared. > > +.TP > > +.B FMV_OF_SPECIAL_OWNER > > +The > > +.I fmv_owner > > +field contains a special value instead of an inode number. > > +.TP > > +.B FMV_OF_LAST > > +This is the last record in the filesystem. > > + > > +.PP > > +The > > +.I fmv_iflags > > +field is a bitmask passed to the kernel to alter the output. > > +There are no flags defined, so this value must be zero in the first > > +two array elements. > > It seems like there are several fields in the structure that are used for > only input or only output? Does it make more sense to have one structure > used only for the input request, and then the array of values returned be > in a different structure? I'm not necessarily requesting that it be changed, > but it definitely is something I noticed a few times while reading this doc. I've been thinking about rearranging this a bit, since the flags handling is very awkward with the current array structure. Each rmap has its own flags; we may someday want to pass operation flags into the ioctl; and we currently have one operation flag to pass back to userspace. Each of those flags can be a separate field. I think people will get confused about FMV_OF_* and FMV_HOF_* being referenced in oflags, and iflags has no meaning for returned records. So, this instead? struct getfsmap_rec { u32 device; /* device id */ u32 flags; /* mapping flags */ u64 block; /* physical addr, bytes */ u64 owner; /* inode or special owner code */ u64 offset; /* file offset of mapping, bytes */ u64 length; /* length of segment, bytes */ u64 reserved; /* will be set to zero */ }; /* 48 bytes */ struct getfsmap_head { u32 iflags; /* none defined yet */ u32 oflags; /* FMV_HOF_DEV_T */ u32 count; /* # entries in recs array */ u32 entries; /* # entries filled in (output) */ u64 reserved[2]; /* must be zero */ struct getfsmap_rec keys[2]; /* low and high keys for the mapping search */ struct getfsmap_rec recs[0]; }; /* 32 bytes + 2*48 = 128 bytes */ #define XFS_IOC_GETFSMAP _IOWR('X', 59, struct getfsmap_head) This also means that userspace can set up for the next ioctl invocation with memcpy(&head->keys[0], &head->recs[head->entries - 1]). Yes, I think I like this better. Everyone else, please chime in. :) --D > Cheers, Andreas > > > +.PP > > +The > > +.I fmv_count > > +field contains the number of elements in the array being passed to the > > +kernel. > > +This count must include the two control elements at the start of the > > +array. > > +The value must be specified in the first array element; in the second > > +element this field must be zero. > > + > > +If this value is 2, > > +.I fmv_entries > > +will be set to the number of records that would have been returned had > > +the array been large enough; > > +no extent information will be returned. > > + > > +.PP > > +The > > +.I fmv_entries > > +field contains the number of elements in the array that contain useful > > +information if the ioctl returns a non-error value. > > +This value does not include the two control elements at the start of the array. > > +This value is only set in the first array element; > > +in the second element, this field must be zero. > > + > > +.PP > > +The > > +.I fmv_unused2 > > +field must be zero in the first two array elements. > > + > > +.SS Array Elements > > +.PP > > +The key fields (fmv_device, fmv_block, fmv_owner, fmv_offset) of the first > > +element of the array specify the lowest extent record in the keyspace that > > +the caller wants returned. > > +For example, if the key is set to (0, 36, 0, 0), the filesystem will > > +only return records for extents starting at or above sector 36 on > > +disk. > > +For convenience, the > > +.I fmv_length > > +field will be added to the > > +.IR fmv_block " and " fmv_offset > > +fields as appropriate so that the (fmv_device, fmv_block, fmv_owner, > > +fmv_offset, fmv_length) fields in the last array element can be copied > > +into the first element to seed the next ioctl call. > > + > > +The key fields of the second element of the array specify the highest > > +extent record in the keyspace that the caller wants returned. > > +Returning to our example above, if that example key were instead > > +passed in via the second array element, the filesystem will not return > > +records for extents going past sector 36 on disk. > > +For convenience, the four key fields can be set to ~0 (all ones) to > > +signify "end of filesystem". > > + > > +If > > +.I fmv_count > > +in the first element of the array is 2, then > > +.I fmv_entries > > +in the first element of the array will be set to the number of extent > > +records found in the filesystem. > > +Otherwise, > > +.I fmv_entries > > +will be set to the number of extents actually returned, and the subsequent > > +array elements will be filled out with extent information. > > +In these > > +subsequent array elements, the fields > > +.IR fmv_iflags ", " fmv_count ", " fmv_entries ", and " fmv_unused1 > > +will be set to zero by the filesystem. > > + > > +.SH RETURN VALUE > > +On error, \-1 is returned, and > > +.I errno > > +is set to indicate the error. > > +.PP > > +.SH ERRORS > > +Error codes can be one of, but are not limited to, the following: > > +.TP > > +.B EINVAL > > +The array is not long enough, or a non-zero value was passed in one of the > > +fields that must be zero. > > +.TP > > +.B EFAULT > > +The pointer passed in was not mapped to a valid memory address. > > +.TP > > +.B EBADF > > +.IR fd > > +is not open for reading. > > +.TP > > +.B EPERM > > +This query is not allowed. > > +.TP > > +.B EOPNOTSUPP > > +The filesystem does not support this command. > > + > > +.SH CONFORMING TO > > +This API is Linux-specific. > > +Not all filesystems support it. > > +.fi > > +.in > > +.SH SEE ALSO > > +.BR ioctl (2) > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > Cheers, Andreas > > > > > From Sales.37@Halloweenmask.net Tue Aug 30 14:29:49 2016 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7D6857CA0 for ; Tue, 30 Aug 2016 14:29:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42EE58F8054 for ; Tue, 30 Aug 2016 12:29:46 -0700 (PDT) X-ASG-Debug-ID: 1472585318-0bf57c1b09d05e0001-NocioJ Received: from Halloweenmask.net ([14.120.34.120]) by cuda.sgi.com with SMTP id OFpAxZj0AYtkrQcr for ; Tue, 30 Aug 2016 12:28:39 -0700 (PDT) X-Barracuda-Envelope-From: Sales.37@Halloweenmask.net X-Barracuda-Effective-Source-IP: UNKNOWN[14.120.34.120] X-Barracuda-Apparent-Source-IP: 14.120.34.120 Received: from 2013-20151114MK[127.0.0.1] by 2013-20151114MK[127.0.0.1] (SMTPD32); Wed, 31 Aug 2016 00:59:45 +0800 From: "sales@maskoem.com" Subject: Re:Aw:Re/Halloween mask/supply mask/Re:Vedr:Re/Halloween mask To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re:Aw:Re/Halloween mask/supply mask/Re:Vedr:Re/Halloween mask Content-Type: multipart/mixed; charset=UTF-8; boundary="gas1mX1Qbw=_aozdAkx6HFIG1JQwAFicKK" MIME-Version: 1.0 Sender: Sales.37@Halloweenmask.net Reply-To: sales@maskoem.com Date: Wed, 31 Aug 2016 00:59:45 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] X-Barracuda-Connect: UNKNOWN[14.120.34.120] X-Barracuda-Start-Time: 1472585318 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3449 X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32464 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160830192946.1FF531940062@cuda.sgi.com> This is a multi-part message in MIME format --gas1mX1Qbw=_aozdAkx6HFIG1JQwAFicKK Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVU Ri04IiBodHRwLWVxdWl2PWNvbnRlbnQtdHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCAxMS4wMC45NjAwLjE4MjEyIj48L0hFQUQ+DQo8Qk9EWT4NCjxQIGNsYXNzPeat o+aWhyBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeSIgYWxpZ249anVzdGlmeT48U1BBTiA/Q2Fs aWJyaT8mIzM5OyANCkZPTlQtRkFNSUxZOiAxMC41cHQ7PkRlYXIgRnJpZW5kcyw8L1NQQU4+PC9Q Pg0KPFAgY2xhc3M95q2j5paHIHN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5IiBhbGlnbj1qdXN0 aWZ5PjxTUEFOID9DYWxpYnJpPyYjMzk7IA0KRk9OVC1GQU1JTFk6IDEwLjVwdDs+RnJhbmsmbmJz cDtmcm9tIEVtYmVsaXNoIEplZWZvbyBDby4sTHRkLCB3ZSBhcmUgDQptYW51ZmFjdHVyZXIgb2Yg SEFMTE9XRUVOIE1BU0tTLCBCTE9PRCBNQVNLUywgQ0xBU1NJQyBNT05TVEVSIE1BU0tTLCBGQU5U QVNZIA0KTUFTS1MuLi48L1NQQU4+PC9QPg0KPFAgY2xhc3M95q2j5paHIHN0eWxlPSJURVhULUFM SUdOOiBqdXN0aWZ5IiBhbGlnbj1qdXN0aWZ5PjxTUEFOID9DYWxpYnJpPyYjMzk7IA0KRk9OVC1G QU1JTFk6IDEwLjVwdDs+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIGNsYXNzPeato+aWhyBzdHlsZT0i VEVYVC1BTElHTjoganVzdGlmeSIgYWxpZ249anVzdGlmeT48U1BBTiA/Q2FsaWJyaT8mIzM5OyAN CkZPTlQtRkFNSUxZOiAxMC41cHQ7PkdsYWQgdG8ga25vdyB5b3U8L1NQQU4+PFNQQU4gP0NhbGli cmk/JiMzOTsgRk9OVC1GQU1JTFk6IA0KMTAuNXB0Oz7igJk8L1NQQU4+PFNQQU4gP0NhbGlicmk/ JiMzOTsgRk9OVC1GQU1JTFk6IDEwLjVwdDs+cmUgaW4gdGhlIGxpbmUgb2YgDQpIQUxMT1dFRU4g Q09TVFVNRVMsIHdvdWxkIGxpa2UgdG8ga25vdyB3aGV0aGVyIHdlIGdvdCBjaGFuY2UgdG8gYXMg c3VwcGxpZXIgZm9yIA0KbG9uZyB0ZXJtPzwvU1BBTj48L1A+DQo8UCBjbGFzcz3mraPmlocgc3R5 bGU9IlRFWFQtQUxJR046IGp1c3RpZnkiIGFsaWduPWp1c3RpZnk+PFNQQU4gP0NhbGlicmk/JiMz OTsgDQpGT05ULUZBTUlMWTogMTAuNXB0Oz48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgY2xhc3M95q2j 5paHIHN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5IiBhbGlnbj1qdXN0aWZ5PjxTUEFOID9DYWxp YnJpPyYjMzk7IA0KRk9OVC1GQU1JTFk6IDEwLjVwdDs+V2UgZG8gaGF2ZSBtYW55IGRlc2lnbnMg aWYgeW91PC9TUEFOPjxTUEFOID9DYWxpYnJpPyYjMzk7IA0KRk9OVC1GQU1JTFk6IDEwLjVwdDs+ 4oCZPC9TUEFOPjxTUEFOID9DYWxpYnJpPyYjMzk7IEZPTlQtRkFNSUxZOiAxMC41cHQ7PnJlIA0K aW50ZXJlc3RlZC48L1NQQU4+PC9QPg0KPFAgY2xhc3M95q2j5paHIHN0eWxlPSJURVhULUFMSUdO OiBqdXN0aWZ5IiBhbGlnbj1qdXN0aWZ5PjxTUEFOID9DYWxpYnJpPyYjMzk7IA0KRk9OVC1GQU1J TFk6IDEwLjVwdDs+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIGNsYXNzPeato+aWhyBzdHlsZT0iVEVY VC1BTElHTjoganVzdGlmeSIgYWxpZ249anVzdGlmeT48U1BBTiA/Q2FsaWJyaT8mIzM5OyANCkZP TlQtRkFNSUxZOiAxMC41cHQ7PldyaXRlIG1lIGJhY2sgYXQgPC9TUEFOPjxVPjxBIA0KaHJlZj0i bWFpbHRvOnNhbGVzQG1hc2tvZW0uY29tIj48U1BBTiA/Q2FsaWJyaT8mIzM5OyBGT05ULUZBTUlM WTogDQoxMC41cHQ7PnNhbGVzQG1hc2tvZW0uY29tPC9TUEFOPjwvQT48L1U+PC9QPg0KPFAgY2xh c3M95q2j5paHIHN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5IiBhbGlnbj1qdXN0aWZ5PjxTUEFO ID9DYWxpYnJpPyYjMzk7IA0KRk9OVC1GQU1JTFk6IDEwLjVwdDs+PC9TUEFOPiZuYnNwOzwvUD4N CjxQIGNsYXNzPeato+aWhyBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeSIgYWxpZ249anVzdGlm eT48U1BBTiA/Q2FsaWJyaT8mIzM5OyANCkZPTlQtRkFNSUxZOiAxMC41cHQ7PlRoYW5rcyZhbXA7 QmVzdCBSZWdhcmRzLDwvU1BBTj48L1A+DQo8UCBjbGFzcz3mraPmlocgc3R5bGU9IlRFWFQtQUxJ R046IGp1c3RpZnkiIGFsaWduPWp1c3RpZnk+PFNQQU4gP0NhbGlicmk/JiMzOTsgDQpGT05ULUZB TUlMWTogMTAuNXB0Oz5GcmFua1poYW88L1NQQU4+PC9QPg0KPFAgY2xhc3M95q2j5paHIHN0eWxl PSJURVhULUFMSUdOOiBqdXN0aWZ5IiBhbGlnbj1qdXN0aWZ5PjxTUEFOID9DYWxpYnJpPyYjMzk7 IA0KRk9OVC1GQU1JTFk6IDEwLjVwdDs+PC9TUEFOPiZuYnNwOzwvUD4NCjxQIGNsYXNzPeato+aW hyBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeSIgYWxpZ249anVzdGlmeT48U1BBTiA/Q2FsaWJy aT8mIzM5OyANCkZPTlQtRkFNSUxZOiAxMC41cHQ7PnNhbGVzIGRpcmVjdG9yPC9TUEFOPjwvUD4N CjxQIGNsYXNzPeato+aWhyBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeSIgYWxpZ249anVzdGlm eT48U1BBTiA/Q2FsaWJyaT8mIzM5OyANCkZPTlQtRkFNSUxZOiAxMC41cHQ7PkVtYmVsaXNoIEpl ZWZvbyBUcmFkaW5nIENvLixMdGQ8L1NQQU4+PC9QPg0KPFAgY2xhc3M95q2j5paHIHN0eWxlPSJU RVhULUFMSUdOOiBqdXN0aWZ5IiBhbGlnbj1qdXN0aWZ5PjxTUEFOID9DYWxpYnJpPyYjMzk7IA0K Rk9OVC1GQU1JTFk6IDEwLjVwdDs+RmFjdG9yeTogRG9uZ2d1YW4gQ2l0eSBFbWJlbGlzaCBKZWVm b28gVG95cyANCkNvLixMdGQ8L1NQQU4+PC9QPg0KPFAgY2xhc3M95q2j5paHIHN0eWxlPSJURVhU LUFMSUdOOiBqdXN0aWZ5IiBhbGlnbj1qdXN0aWZ5PjxTUEFOID9DYWxpYnJpPyYjMzk7IA0KRk9O VC1GQU1JTFk6IDEwLjVwdDs+TW9iaWxl77yaKzg2MTUyMTcyMzk0MjY8L1NQQU4+PFNQQU4gP0Nh bGlicmk/JiMzOTsgDQpGT05ULUZBTUlMWTogMTAuNXB0Oz48SU1HIGJvcmRlcj0yMCBoc3BhY2U9 MCBhbHQ9IiIgDQpzcmM9ImNpZDppbWcwLmpwZyIgYWxpZ249YmFzZWxpbmU+PC9TUEFOPjwvUD4N CjxQIGNsYXNzPeato+aWhyBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeSIgYWxpZ249anVzdGlm eT48U1BBTiA/Q2FsaWJyaT8mIzM5OyANCkZPTlQtRkFNSUxZOiAxMC41cHQ7PjxJTUcgYm9yZGVy PTIwIGhzcGFjZT0wIGFsdD0iIiANCnNyYz0iY2lkOmltZzEuanBnIiBhbGlnbj1iYXNlbGluZT48 L1NQQU4+PC9QPg0KPFAgY2xhc3M95q2j5paHIHN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5IiBh bGlnbj1qdXN0aWZ5PjxTUEFOID9DYWxpYnJpPyYjMzk7IA0KRk9OVC1GQU1JTFk6IDEwLjVwdDs+ PElNRyBib3JkZXI9MjAgaHNwYWNlPTAgYWx0PSIiIA0Kc3JjPSJjaWQ6aW1nMi5qcGciIGFsaWdu PWJhc2VsaW5lPjwvU1BBTj48L1A+PC9CT0RZPjwvSFRNTD4NCg0K --gas1mX1Qbw=_aozdAkx6HFIG1JQwAFicKK Content-Type: image/jpeg; name="21.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="21.jpg" Content-ID: Content-Description: Photo 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 6JyGDm9gp7YrcHj3nkfE7Y/tIg289woEt2t8XHcSgljbbbTUaw3dTUDLocSA90sa537u/dsWa+xr nEjgn6K1mZm2jK10t2VEdiG7rHf9J6zbHPOg3OaPGFFI6rgikAtHmkW+0eKk/aPpDQgHtKh6oGhB LfDumpYmBryUpgg/6yig47hoHf3f9JSdXTtkA8bvAwlaQCb8H//Q8uBbtiJIMnsFJwDWiBtI0PBS dBaBI8T21ChzzyguOmjNlkHXhE3btZEf68BAEdxJT6+aS1sGHCGn4kDUwiB1xYayNzTr7oEEazqq ocPEjy1Ug5nl80qUlNtoed8acAahWK8tsAuKolze2iTbA3lEEhVN63KY90O1BG0aeJ1/6KM3Oxfs 9s1ze942PE7msb7fT2z6Xp/Sf/pPUWZuLte6fdyEeI3aKbpym9gePJQ9fyPw0/vVQv2nx/BMXk68 eSXGVUG2cmw6NH5EL1bJAcDohC0jQCUxe49wPhqUDIlNBKbnensA01JmO6GLAD7mz4a8qMgnXVS9 oHAQUjcdxk99fFL05PMHzRNwn83VN6jwS4HnTRJNMqcdx1PtZzu7n4IheBLgAA2ABHjPCFU7UmYj U+CKHDUyN/f4Hz/rOTTds+Ph4RWne3//2f/tILxQaG90b3Nob3AgMy4wADhCSU0EBAAAAAAAHxwB WgADGyVHHAFaAAMbJUccAVoAAxslRxwCAAACAAAAOEJJTQQlAAAAAAAQ08mfSz2N6iiFSDVqhBWc KzhCSU0EOgAAAAAA1wAAABAAAAABAAAAAAALcHJpbnRPdXRwdXQAAAAFAAAAAFBzdFNib29sAQAA AABJbnRlZW51bQAAAABJbnRlAAAAAEltZyAAAAAPcHJpbnRTaXh0ZWVuQml0Ym9vbAAAAAALcHJp bnRlck5hbWVURVhUAAAAAQAAAAAAD3ByaW50UHJvb2ZTZXR1cE9iamMAAAAFaCFoN4u+f24AAAAA AApwcm9vZlNldHVwAAAAAQAAAABCbHRuZW51bQAAAAxidWlsdGluUHJvb2YAAAAJcHJvb2ZDTVlL ADhCSU0EOwAAAAACLQAAABAAAAABAAAAAAAScHJpbnRPdXRwdXRPcHRpb25zAAAAFwAAAABDcHRu Ym9vbAAAAAAAQ2xicmJvb2wAAAAAAFJnc01ib29sAAAAAABDcm5DYm9vbAAAAAAAQ250Q2Jvb2wA AAAAAExibHNib29sAAAAAABOZ3R2Ym9vbAAAAAAARW1sRGJvb2wAAAAAAEludHJib29sAAAAAABC Y2tnT2JqYwAAAAEAAAAAAABSR0JDAAAAAwAAAABSZCAgZG91YkBv4AAAAAAAAAAAAEdybiBkb3Vi QG/gAAAAAAAAAAAAQmwgIGRvdWJAb+AAAAAAAAAAAABCcmRUVW50RiNSbHQAAAAAAAAAAAAAAABC bGQgVW50RiNSbHQAAAAAAAAAAAAAAABSc2x0VW50RiNQeGxAUgAAAAAAAAAAAAp2ZWN0b3JEYXRh Ym9vbAEAAAAAUGdQc2VudW0AAAAAUGdQcwAAAABQZ1BDAAAAAExlZnRVbnRGI1JsdAAAAAAAAAAA AAAAAFRvcCBVbnRGI1JsdAAAAAAAAAAAAAAAAFNjbCBVbnRGI1ByY0BZAAAAAAAAAAAAEGNyb3BX aGVuUHJpbnRpbmdib29sAAAAAA5jcm9wUmVjdEJvdHRvbWxvbmcAAAAAAAAADGNyb3BSZWN0TGVm dGxvbmcAAAAAAAAADWNyb3BSZWN0UmlnaHRsb25nAAAAAAAAAAtjcm9wUmVjdFRvcGxvbmcAAAAA ADhCSU0D7QAAAAAAEABIAAAAAQACAEgAAAABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhC SU0D8gAAAAAACgAA////////AAA4QklNBA0AAAAAAAQAAAB4OEJJTQQZAAAAAAAEAAAAHjhCSU0D 8wAAAAAACQAAAAAAAAAAAQA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgAB AGxmZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0A AAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////////A+gAAAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD///////// ////////////////////A+gAADhCSU0ECAAAAAAAHwAAAAEAAAJAAAACQAAAAAMAABRAAQAAGAAA AABKgAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAADNwAAAAYAAAAAAAAAAAAAAyAAAAMgAAAA AQA4AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAMgAAADIAAAAAAAAAAAAAAAAAAA AAABAAAAAAAAAAAAAAAAAAAAAAAAABAAAAABAAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAA AAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21s b25nAAADIAAAAABSZ2h0bG9uZwAAAyAAAAAGc2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAABXNs aWNlAAAAEgAAAAdzbGljZUlEbG9uZwAAAAAAAAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9yaWdpbmVu dW0AAAAMRVNsaWNlT3JpZ2luAAAADWF1dG9HZW5lcmF0ZWQAAAAAVHlwZWVudW0AAAAKRVNsaWNl VHlwZQAAAABJbWcgAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcA AAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAyAAAAAAUmdodGxvbmcAAAMgAAAAA3Vy bFRFWFQAAAABAAAAAAAAbnVsbFRFWFQAAAABAAAAAAAATXNnZVRFWFQAAAABAAAAAAAGYWx0VGFn VEVYVAAAAAEAAAAAAA5jZWxsVGV4dElzSFRNTGJvb2wBAAAACGNlbGxUZXh0VEVYVAAAAAEAAAAA AAlob3J6QWxpZ25lbnVtAAAAD0VTbGljZUhvcnpBbGlnbgAAAAdkZWZhdWx0AAAACXZlcnRBbGln bmVudW0AAAAPRVNsaWNlVmVydEFsaWduAAAAB2RlZmF1bHQAAAALYmdDb2xvclR5cGVlbnVtAAAA EUVTbGljZUJHQ29sb3JUeXBlAAAAAE5vbmUAAAAJdG9wT3V0c2V0bG9uZwAAAAAAAAAKbGVmdE91 dHNldGxvbmcAAAAAAAAADGJvdHRvbU91dHNldGxvbmcAAAAAAAAAC3JpZ2h0T3V0c2V0bG9uZwAA AAAAOEJJTQQoAAAAAAAMAAAAAj/wAAAAAAAAOEJJTQQUAAAAAAAEAAAAfjhCSU0EDAAAAAAV0wAA AAEAAACgAAAAoAAAAeAAASwAAAAVtwAYAAH/2P/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAA 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 500STTKnHcdT7Wc7u5+CIXgS4AANgAR4zwhVO1JmI1Pgihw1Mjf3+B8/6zk03bPj4eEVp3t//9kA OEJJTQQhAAAAAABVAAAAAQEAAAAPAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwAAAAEwBB AGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAgAEMAUwA2AAAAAQA4QklNBAEAAAAAAdQABgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAEA AAAAAAAAAAAAAAAAAAAAAAAAAQCyPXAARhR6ALI9cABGFHoAsj1wAEYUegACANij1wAgo9cA/mZm ACR64QEBR64AdcKPAAEA/hR6ANeuFAD+FHoA164UAP4UegDXrhQAAQDfrhQA1hR6AN+uFADWFHoA 364UANYUegABAN5mZgDWFHoA3R64ANXCjwDb1woA1XCjAAEA1hR6ANHrhQDWFHoA0euFANYUegDR 64UAAQDSPXAA0o9cAND1wgDR64UAz64UANFHrgABAMa4UQDNwo8AxXCjAM1wowDEKPUAzR64AAEA wFHrAMx64QC+uFEAy4UeAL0euADKj1wAAQC49cIAyFHrALj1wgDIUesAuPXCAMhR6wABALUeuADC PXAAtR64AMI9cAC1HrgAwj1wAAEAsuFHAL64UQCy4UcAvrhRALLhRwC+uFEAAQCsKPUAwPXCAKwo 9QDA9cIArCj1AMD1wgABAKdcKADAUesAp1woAMBR6wCnXCgAwFHrAAEAphR6AL4UegCmFHoAvhR6 AKYUegC+FHo4QklNBAYAAAAAAAcACAAAAAEBAP/hWv1odHRwOi8vbnMuYWRvYmUuY29tL3hhcC8x LjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+ IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBD b3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJk ZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt bnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMu YWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRz LzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxu czpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQj IiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNl UmVmIyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAv IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXA6Q3Jl YXRlRGF0ZT0iMjAxNS0xMS0xN1QyMjozMjoyMiswODowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAx NS0xMS0yM1QwMDo0NTozOCswODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTUtMTEtMjNUMDA6NDU6 MzgrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlp ZDpBQ0YzN0JFMDM2OTFFNTExODI1QTk4OEVBREVDNTA0NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1w LmRpZDpBQ0U0REUwMzM4OERFNTExOTI5QzkxREJGREI4NjE5RCIgeG1wTU06T3JpZ2luYWxEb2N1 bWVudElEPSJ4bXAuZGlkOkFDRTRERTAzMzg4REU1MTE5MjlDOTFEQkZEQjg2MTlEIiBwaG90b3No b3A6TGVnYWN5SVBUQ0RpZ2VzdD0iQzc1RDE3RTU3NEI1NkVGNURCQkUzOTk0QzBFOTc5NUMiIHBo b3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2 LTIuMSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNy ZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QUNFNERFMDMzODhERTUxMTkyOUM5MURC RkRCODYxOUQiIHN0RXZ0OndoZW49IjIwMTUtMTEtMTdUMjI6MzI6MjIrMDg6MDAiIHN0RXZ0OnNv ZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RF dnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpBREU0REUwMzM4OERF NTExOTI5QzkxREJGREI4NjE5RCIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0xN1QyMjo0MjozMSswODow MCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0 RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0 YW5jZUlEPSJ4bXAuaWlkOjM1QkQ5MTQ4RUU5MEU1MTFBQUE5QzYzMzkyNTdEM0NEIiBzdEV2dDp3 aGVuPSIyMDE1LTExLTIyVDE1OjU4OjQ3KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9i ZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0 RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9u L3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlv bj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24v dm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9u PSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDozNkJEOTE0OEVFOTBFNTExQUFBOUM2 MzM5MjU3RDNDRCIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0yMlQxNTo1ODo0NyswODowMCIgc3RFdnQ6 c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5n ZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4 bXAuaWlkOkFDRjM3QkUwMzY5MUU1MTE4MjVBOTg4RUFERUM1MDQ2IiBzdEV2dDp3aGVuPSIyMDE1 LTExLTIzVDAwOjQ1OjM4KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3No b3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06 SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzVC RDkxNDhFRTkwRTUxMUFBQTlDNjMzOTI1N0QzQ0QiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6 QUNFNERFMDMzODhERTUxMTkyOUM5MURCRkRCODYxOUQiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJ RD0ieG1wLmRpZDpBQ0U0REUwMzM4OERFNTExOTI5QzkxREJGREI4NjE5RCIvPiA8cGhvdG9zaG9w OkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT4xMTAzNUZEMzQzMTQ2N0JCOERC RUNDM0I5MkEyMDE0MDwvcmRmOmxpPiA8cmRmOmxpPjU4MjdERjE2OEE1RkU3MjMwQzhBRUM3QjhB RDJCQUEyPC9yZGY6bGk+IDxyZGY6bGk+N0ZCMjcwNkQ1RDIzMThENjRDNTgxQ0Y3RDZEMTdGOTg8 L3JkZjpsaT4gPHJkZjpsaT45MTFCRTc0MjI3MDA5MUYxRTI2Q0YyNjdGMDA1RDkwRjwvcmRmOmxp PiA8cmRmOmxpPjk1Q0IyQjY2NDkzQ0MzMjg5N0NGNDQ0RDFDNEJDODBFPC9yZGY6bGk+IDxyZGY6 bGk+QUUwOUI2QUZEMzA2MzBCMDA5Njg4QzFFQ0VCNDc4M0Y8L3JkZjpsaT4gPHJkZjpsaT5BRUFE ODc4NTE5NjA4MUZDMkZGMzBBN0FGRTFFRDM5MzwvcmRmOmxpPiA8cmRmOmxpPkI1OUE5N0QwNjE4 QjIyRjYyQzhFNUVBRDBFMjFCOEY3PC9yZGY6bGk+IDxyZGY6bGk+QkNBRTRGQjJFOTVCRTM1Mzc2 RkI4QkU5QjA5RUU0MDM8L3JkZjpsaT4gPHJkZjpsaT5EQzcwNzQ1Rjc0QjhFNjEwMjkyNEJBNTM3 NTAwMzY4MTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDowNTdiZTNiOS1h YTBhLTExZGUtOTE5MC1jZWQ0OTM3ZGMzYjk8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpw aG90b3Nob3A6MGY0ODBhOTMtOGE5Mi0xMWQ5LWJlODgtYWRmNTUwZWNjZjQ4PC9yZGY6bGk+IDxy ZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjBmNTUzNmFlLTI5MzgtMTFkZS1hNTk5LWFiOWFi MzNhOWRkNDwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDoxNTkyOTFhZi1l Mjg2LTExZDgtOWRlZi1jOWRhY2YxNWI0N2Y8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpw aG90b3Nob3A6Mjk2N2JkNzQtNjkzNC0xMWRmLTgxNGQtOGVjNzNjODkwOGNkPC9yZGY6bGk+IDxy ZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjUwZTY0Mzg4LWYyYTgtMTFkOC1iYTM3LWI1MDU3 MjNiMjdhNTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2MTJhYTAwMi0x NDIxLTExZDktODA3MC1jY2ZhNzFiM2QyNzU8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpw aG90b3Nob3A6NmQ2ZmNhY2QtODkxZS0xMWRhLWI1MTYtODU2NjBhYzExZjI5PC9yZGY6bGk+IDxy ZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjg3YmI0OTZiLTdkOGUtMTFkYy1iZmU5LWIwNTdi NzIxN2IyOTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4ZGYyNDFkMS01 MjEwLTExZGQtOTRkZC1mYTEzYTM0NmQ0NmI8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpw aG90b3Nob3A6YjE3MzFkMjUtMTJhYS0xMWQ4LTkwZTQtYjdjMWYyN2Q5MWQ2PC9yZGY6bGk+IDxy ZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmJhMjYwZDZjLWFiOWItMTFkYS1iZDUzLWJkM2Vi MDRhMmM0ZDwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjNGY5YjcxYS04 YzYxLTExZGEtOGE3NC1lZWE5ZGE5ZGM5YTA8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpw aG90b3Nob3A6YzY1ZGU0MGUtYmVlYi0xMWRjLTk1ZDItODE1NjNkMDU5M2UzPC9yZGY6bGk+IDxy ZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmNlNmRjMDNiLWU5N2ItMTFkZC04NDJlLWY5OTVl YTUyZDY1ZTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpmNTM2MWNmNy1k NTE3LTExZTEtOGE4ZC1lNTQxZTRiMWE2NzU8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpkb2NpZDpw aG90b3Nob3A6ZmM2NzZmNmMtYmI5Yi0xMWRiLTg0MWMtOWVmZTQ5OGEzZTc0PC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDowMkJFQzhCNTFEN0NEQzExOTc1NjkxM0FERjM3MTcxQzwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6MTI1RUFDNDg5RkY0REUxMThENzhBMjNGOTg2RTc0OUY8L3JkZjpsaT4gPHJkZjps aT51dWlkOjEyQzQ4OENCMTNFMkRFMTE4QjE1QzE5MDkzMEFENkI3PC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDoxODkxNDc5RTIzQkZEQjExODhENEIxNEE5NDlENEQ2QTwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6MUM2ODE4MkE0ODc1REUxMUE5OTJGRDJEQzZFOTgzMEQ8L3JkZjpsaT4gPHJkZjpsaT51dWlk OjFDRTg4QzFCRDE5REUxMTFBMjEwREVFRkI4MkQ3Njk2PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDox RDZCQTE3N0NDN0VERTExQkI3QkM5NUJENzg1RjRDOTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MUUz NkFCMDRBNjYzRTAxMTk1REM4REY5RTRFRkZGOTU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjFGNUFG M0I2NzIyOURGMTE5RkZBQjI2RTI0MEM3MUJCPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxRjg2MzU1 Qzc1QkVERTExQTgxNEI0RkQxRDU3OTVCMTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MjA4QzQ0NTA3 RTEzREYxMTg4MkZEMzU1MDQwODUzODM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjJDMjdGREE2RkNF RERFMTE5MjE1OTU5NDRCRjBBOTg1PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoyREJERDFCRkNFMURE RjExOUFCRUMxNDkzMzFEMzE0RDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MkRCRjc0NTAzQzAxREUx MTlFREJBMTQ3NzkwNDBFMUE8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjJFNzNEOEZBMUFEOURGMTE5 QTNGQ0U3MEJCQTcyNjlGPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDozMkFEOTAxQzE1NDBERjExQkEy MkVCODM5MEU0MjdGQTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MzMxMzc4MTVGRDhGREUxMUJGMUE5 Rjg5RkM3ODBERTg8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjM4MjIyNzQxOTY1MERFMTE4MjhFQjc5 QjdGRjg3QjQ2PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDozQTQ2Nzc4MTVFMjlERjExQTBCMDg3REY4 OTdGNUM1NjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6M0I3RjU4RjE5RDZDRTExMUEzNUJDRDhERUQx OTkyODY8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjNFMDlBODYyRjM1MEREMTE5NzYwQUM2NzJBMDY1 QzhBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDozRTQwMzc3RkQzN0RERTExQkQzMkVGQzg4NDI0RkJC NTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6M0ZBQUIzMURDN0YzREUxMUJGQjNCQjYxQUUxQTE5OEI8 L3JkZjpsaT4gPHJkZjpsaT51dWlkOjQ1N0QwMjk1NTA1NURGMTE4QjU5RDk1OUQ5RkNENTBCPC9y ZGY6bGk+IDxyZGY6bGk+dXVpZDo0NjIyNzRCRkZBN0NEQzExQkFDM0UxRjM3NTAyNUY3QjwvcmRm OmxpPiA8cmRmOmxpPnV1aWQ6NDg4RTdEMjE2NDE3REYxMUFCMzA5NkRCNTlCRTgyNzg8L3JkZjps aT4gPHJkZjpsaT51dWlkOjRCRDY0RTNENTkxQURGMTE5QTQ0ODE2RTQyNkQxNENDPC9yZGY6bGk+ IDxyZGY6bGk+dXVpZDo0RDQ3NTMwREJGQjFERTExODM4Q0I3OUJCMDI5QzUzMzwvcmRmOmxpPiA8 cmRmOmxpPnV1aWQ6NTA3NzNCNjI5RDgwREUxMTlDNUFGOTZDQ0YyQjBGRTE8L3JkZjpsaT4gPHJk ZjpsaT51dWlkOjUxNzU5ODY3MTcwNURFMTFBQTdDRjdBNDdCMzNFMzE1PC9yZGY6bGk+IDxyZGY6 bGk+dXVpZDo1MkEwRjM5QzI1QkZEQjExODhENEIxNEE5NDlENEQ2QTwvcmRmOmxpPiA8cmRmOmxp PnV1aWQ6NTY1QzMwRDQzQTA4REYxMUE2MURCMjI3RURERjU5Rjg8L3JkZjpsaT4gPHJkZjpsaT51 dWlkOjY5N0U2NzA4N0Y2MkRFMTFBMjk4QkQwMDcyMjIwRTBCPC9yZGY6bGk+IDxyZGY6bGk+dXVp ZDo2OTk1NTJFODg0NjJERTExQTI5OEJEMDA3MjIyMEUwQjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6 NkEzN0M2QkJENEY5REUxMUIzQTI4RDUxMDZFRjQyOTY8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjZC MEM3NDQ2ODY2MkRFMTFCOTM0RTBCQzM5ODE1NzFEPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo2QzFD RUU5OUZGMENERTExOEI2MDgwODY4NkQxQ0RBNjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NkM3MDdF QjU0QzRFREYxMTlCRjY5RjVFN0NDMzg1RDQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjcxRTIyMTI4 Njc4Q0RGMTE4MTk2RDFDRUJBMTFDNTY3PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo3NDIwMEE4NTdF M0REQzExQjY2MUQzOTA0MTI1OUE4NjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NzU5ODAwQzRBNUQ5 REQxMTlBMDBFMUJDMEM2MTk1MUM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjdBRjI2RkEwNzY1RkRG MTE5RjYxQzU0M0REMTUyODM4PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo3RDgyQTREOUY1MzhERjEx ODlBRkNEMjcyOTQ2Njk4NTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6ODNGQTExMzg4OTYyREUxMUI5 MzRFMEJDMzk4MTU3MUQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjg0RjNCQzkwOTA2RERGMTE4RkQz QkVDNzU3MjRFNDMxPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo4OTZDMEZDQkRBMzJERjExQTQ3M0Iy MUM0OUQxNzU3RTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6OEM4QjRGMzE3RTFBREYxMUJBQkNENzQ0 NzJDRUUwQUU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjkxQzZCOUREN0QxQURGMTFCQUJDRDc0NDcy Q0VFMEFFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo5QkZDOUJEQ0FERkNERjExQTIzNUExMjdERUZG REM1OTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6OUQwQzExMUE2M0M0MTFERDg1MzY4QjA4QzczNDVG MUU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjlERERDMTRBNTg3MkRGMTFBQ0U1OUY1ODFFMkVGQjNE PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpBMDYzOTc5QTVGNEVERjExQTg4NTlGQzAzNEU1QkVBMzwv cmRmOmxpPiA8cmRmOmxpPnV1aWQ6QTFFODc3RjU4RjM0REUxMUFENjBDNTlGQTI3RjhBQzk8L3Jk ZjpsaT4gPHJkZjpsaT51dWlkOkEyQjMzOEZDODc2MkRFMTFCOTM0RTBCQzM5ODE1NzFEPC9yZGY6 bGk+IDxyZGY6bGk+dXVpZDpBNTJCMkJFMkQ1MDRERTExODUzMkE3NTM2MjhFOTU4NzwvcmRmOmxp PiA8cmRmOmxpPnV1aWQ6QTU4MDJFNjQ0RDM4REUxMTg3RDhDRTBGRTA4QjAwRDg8L3JkZjpsaT4g PHJkZjpsaT51dWlkOkFGRUM5NTNFOEIyOURBMTE5REFFRTk5MjdCM0VEM0U3PC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDpCMjhFQThDMjg0RkZERTExQjRBMzhCRkM2OTVDN0VFQTwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6QjVBMTY1MjFEQTJBREYxMTlERTVEQzBENzhFMTU4NzA8L3JkZjpsaT4gPHJkZjps aT51dWlkOkJDNDY2MTM1QjUwQ0RFMTE5NzU2RjgxREM5OTY3QzJEPC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDpCQ0NFNjFFQjQ0QzREQjExQjkyNUQ1OTk2MzQ1ODI5RTwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6QzRBQURENDEwOUE2REUxMUFBNTdDNERCMDJGMUYzN0U8L3JkZjpsaT4gPHJkZjpsaT51dWlk OkNBNEUwMzRFN0UxQURGMTFCQUJDRDc0NDcyQ0VFMEFFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpD RjI2ODczRTcyMTBERDExQjkxMEFBMDUxMDIzRDc0QTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RDI5 MjU0NEFGNDY3REQxMThCMDA4OTk3OEM1MzVEMjc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkQ1NzQy OEFFODc2MkRFMTFCOTM0RTBCQzM5ODE1NzFEPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpENjIzRTJG Q0NCNDRERjExQTY1OTk5MDQ0Njc3OTY0MjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RDY3MzNBNTRG QTUwREQxMUIxOTBBQkM1RjE4MkZCMzQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkQ2N0I3M0QyM0U4 RjExREVCMTgxQTg1RTU1NEFCNzIzPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpEQUNCNDJBQzBENTdE RjExOUU2MTgzQTkyMUI2MEY2RDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6REIyODI0NzI3NjVGREYx MTlGNjFDNTQzREQxNTI4Mzg8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkRDMERDODZDOUZFNUREMTFB REIyOUM1QkZCRDZERkE0PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpERTI4MjQ3Mjc2NUZERjExOUY2 MUM1NDNERDE1MjgzODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RTFCMEQ0MDM5OUVBREUxMTlDNTNB MjRGRjQwMkE5REQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkUxQ0VDNjNCNzFFRkRDMTFBQzcxOEYy RkIwNEQ1QjNGPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpFMUVGQTg4OUI5QjJERTExOUFEQUZGQkVE NjQxRDAwNzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RTQyODI0NzI3NjVGREYxMTlGNjFDNTQzREQx NTI4Mzg8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkU2RjEyMDNEMkVFOURFMTFCRDcyQzM3RTlDNUIw QjkzPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpFNzI2QUI2N0ExRDdERTExQTFBRThBMzg4QkYxMUZE QjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RThERUZGRkM3NTVGREYxMTlGNjFDNTQzREQxNTI4Mzg8 L3JkZjpsaT4gPHJkZjpsaT51dWlkOkVCNjlCMTg4ODYwNkRFMTFCMzgwQzlERkZGNUVEQjZCPC9y ZGY6bGk+IDxyZGY6bGk+dXVpZDpGODZBRUEzNjc5MzZERTExOUZDOThDNkY3MDY0NjE3NDwvcmRm OmxpPiA8cmRmOmxpPnV1aWQ6RjhEQzI0MTA4NDYyREUxMUEyOThCRDAwNzIyMjBFMEI8L3JkZjps aT4gPHJkZjpsaT51dWlkOkY5NUMxQTJFMjU3OERDMTFBQkI3RTdCMENGMzRENzhFPC9yZGY6bGk+ IDxyZGY6bGk+dXVpZDpGOTc0ODZDMUUyNEZERjExODNDNzk5NjcxMEQwOTlEQzwvcmRmOmxpPiA8 cmRmOmxpPnV1aWQ6Rjk3NkM0MUNCMTU2REUxMTgxRDk4NkU1NDU2QUE5Q0M8L3JkZjpsaT4gPHJk ZjpsaT51dWlkOkZBMUVFNjY5MkQzRkREMTE5NkFDOTU2REEzREIxOUMzPC9yZGY6bGk+IDxyZGY6 bGk+dXVpZDpGREQ2RDAxQ0M3MDhERTExQTE1QUIyODM4RjNBRUJGRTwvcmRmOmxpPiA8cmRmOmxp PnV1aWQ6RkY2MjE2ODBFOEE1REMxMThGRkVDN0YzNEY2QkQxMUQ8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjAxODAxMTc0MDcyMDY4MTE4REJCOUQ4RUNDMzFCQ0VEPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDowMjdCNjkwRUZDNUJFMjExOUZEM0ZFMUY1MjM1RTEyMjwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6MDI4MDExNzQwNzIwNjgxMTg4QzZBQjdGRDBGNTY4NEM8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjAyODAxMTc0MDcyMDY4MTE4REJCRTJGMzlDNThGMjRCPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDowMzgwMTE3NDA3MjA2ODExOEY2MkFGMzVDNEQyNDExQTwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6MDREMzQwMTBGRjJEMTFERjgyM0RDMUU3OUFFRUVGMTU8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjA1NDI2NjBFMkZFMDExRTBBRTUyQUUyNjhGQzBFMkVEPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDowNjA2REJDOTEwRkZERjExQTQ1NTg1MDk3MkZDOTBCRDwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6MDYzNUQzREYwRDVGMTFFMUIwNzBBMjZBNjJFRkQzNjI8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjA3MEM2QzU2RUI0NzExREZCNjNFRTY3NDg0MDJEQzAwPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDowNzgwMTE3NDA3MjA2ODExOERCQjlEOEVDQzMxQkNFRDwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6MDhDNjA3NUIyODIwNjgxMUExNjk4NzFCQ0NCQkY0ODY8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjBBMzg5MDFBNEMxOEUwMTFCMjU3OThGOEQ3RkUyRkQzPC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDowQTgwMTE3NDA3MjA2ODExODA4M0M2MUY0RUI2MDg5MjwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6MEE4MDExNzQwNzIwNjgxMTkyQjA5NENBQjJGM0Q4MzA8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjBDRTdDM0MyNzVFRURFMTE4Q0RFREY4QTgxMTJFRDM4PC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoxMkVDREZDQzY5MThFMDExODMxN0E1MTI2QjE4NEM5Qzwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MTNCMDg2NTA4RUZCRTExMTg2MzJDMzdFQTA5NEVCOTk8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjE1ODhBQkE2NEI3RURGMTE4QkIzRkQzRkZGRTUwRkJD PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoxODQwN0VBNDlGNzRERjExQjlBREY1MDFCMUZFRUM1 QjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MThBM0IyREZGRTE3REYxMUExQTNGNkUyQkUzODcy RDU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjE4QTZBNUZBQjkxM0UwMTE4MERBQ0VCMUU0QjA4 MEZDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoxOEI5QkIwQjAzRTcxMUUwODRDODkxRDQyMTBE QUM4MzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MTk0QjU0MzZBNTZGRTExMTg0NDVEREM4MzVG QzkzMkY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjFCNkE4NjJGRTc5MEU1MTE5RjgyQzEwOURD RTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoxRDZFNDM3M0FDNUZERjExQTY4RUQyNTFG RjIzRUMzNDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MUY3M0UxQkE1NzNDRTAxMUFENzdCMkNG NUY5N0FBQkQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjIwMjI3RDFCRDlFQ0RFMTE4Rjg0Qjgy OEE4Rjk2OEYwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyMTZBODYyRkU3OTBFNTExOUY4MkMx MDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjFBQjQ5NTExM0ZGREUxMTk3RDVE QjYwOTI3MDE1NTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjIxQ0NGNzgyMjJEMkUyMTFCMkIz RDRFNUUwQjEyNzJDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyM0I5ODI1QzJGREUxMUUwOEI4 NUFCQjQxODY1QTRGMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjRFMTA1OTU0MkY1MTFFMThC RDQ5NTMyMkI4QzY1NDg8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjI1MEYzN0ZEQkU2NURGMTE5 NkEyRTUzODZFQjdFRkJGPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyNjJENUYxRjE3MUVFMjEx QkFDNjg1OUNFNkNCMEVGMjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Mjc0OURBQzE2OUUwREYx MUJBRTJBOUY0RkExQzczMEU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjI3RTAyOTNBNzhGNURG MTE5RjEwODNCNTdBNTk4NDE5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyOEVFQTlCNzlBRDVE RjExOTY0OEY4NTExQjc0MTdEMzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MkI0OURBQzE2OUUw REYxMUJBRTJBOUY0RkExQzczMEU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjJCQkI3RUYzMTIy MDY4MTE4REJCRDFFRjI2NzQyRDNDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyQzI3RUFDN0Iy NjFERjExODdDRkVDODVBNjA3N0E4NzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MkQ3NjM1MDgx NEZGREUxMTk3RDVEQjYwOTI3MDE1NTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjJFNEM4MDY2 REYwQ0UzMTFCMDJERDE2RUM5ODQ5RjBBPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyRUFGQTJC QzY5MjI2ODExODhDNkYxNkJFQjUwN0ZCQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MzJCQTY4 MTREOUVDRTIxMThBRjNGRTVGRjQ2NjNGMEE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjMzN0FG RkRERTkwMkUxMTE4RDlFQTA2OTk5Nzg3RkIxPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozNDFB QjI3RDRDMTJFMDExOEQzM0E0MzY0NjZEOTU3NzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Mzgy QkZGMjNFOEVGREYxMTlDMTg5MjkxRDFEQkRENzQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjM4 RTlEMzVENDkxNURGMTFCMTMxODIyM0M2QThFREU5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoz QTZDQUYyNzJCMTlFMDExODRERDhGQkQxMTAzNDAwODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 M0E3Njc4M0NEMEE4REYxMUIyQTE5RDUwRkYyMUI4RDk8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjNCQzZDRTEyQzM3MERGMTE4NTBDQjcyREI5RDJDQjkyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDozRDAyRTYyQURGOENERjExODFEQ0NCOEU4Qjc3RjMxRjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6M0YyODQwQkJEQUY0REYxMTlCOUZFRDY2QjY4NzVBNzc8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjQxODdDMTQxNzczMkRGMTE5RDczQkM2NTdFMTlFMzM2PC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDo0MjY5NTZBNjNDN0VERjExQTVBNEU5MDY1RkFDNzA0QzwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6NDJEN0FEMTQ0NDIzNjgxMThEQkI5RDhFQ0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjQzNTE1REUzQkIzN0UxMTFCMDVDODNGRTQzQ0JFODIzPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDo0NEJBNjEwRkY3MTVFMDExODUwRkE5MDFCNEMxQjY3NTwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6NDgwQjdFNDZBRjc4REYxMUE4MjVDRjhERTVEOTFERjc8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjRCNEVEQUZGNUNGN0UxMTE4NjM1OTQyMDBBNjk2RDFDPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDo0RDdDMTY3N0RBQUJFMDExODQzMUY2RTUxMUZGMTQxMjwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6NEU1RDI4NzExODIzNjgxMUE5NjFBRTU2RDQ4QUNENTA8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjUyRDIyQUZFNTYyMDY4MTE5MTA5OTFCOUM3QjkzOUI5PC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDo1M0E0QkIwRTM3MDdFMzExOUIyNEU3MTY5MURENjg3RTwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6NTQwOTJFRTc3RDE0RTExMUE2OTFGNjhBNzM0RDAwNkM8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjU0M0E3OThGMTMwN0UwMTE4NDZGRThDMDREM0M4REVDPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDo1NEMzRjlGOEJEQUVERjExQTVEQzk1OUM4MkFCQzlFMTwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6NTU0REFFODVGQzBBRTExMUE3RURGNzQ0Q0FDOUEzMzA8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjU1NUE5RUU4MTEyQjY4MTE4NzFGRjlDMzJGODIxNUE3PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDo1NTlGQ0QzQjUyN0FERjExODkxNERFQjEzNTE3NjFGMTwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6NTYxNEMxMzQ5NjM3RTAxMTgyNTdENDg5ODA3NzdDMTg8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjU3QUNGMTUwNjkyQTY4MTE4NzFGRjlDMzJGODIxNUE3PC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1OTQwOEU0Q0JFRkZFMDExOUI0MkY0ODMxNDE0MDMzQjwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NUI2REQyQjc0NTg0REYxMUI3MjQ4QjdEREY3OTRBMUE8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjVDNUVENTIyMjgyRURGMTFBNDYzQkZFOUIxOEZDQUQ3 PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo1Qzc5QzJGMjM2MEJERjExOEUyQkM0NjUwNkZBODY5 ODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NUQ2Q0VBMjZGRDg4MTFERjlFN0RBQUU5RjVEODhB QjI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjYwNjQwQTVDNTgyNkUwMTE4MkNBRDM4RUNFRENF MjY4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2MkE1NkUyRUQ1RTdERjExODFEN0QxRDdCQzky OUMwNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NjJDMjEwNEZFNzkwRTUxMTlGODJDMTA5RENF NTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjYzMUQzMTZGMEM0NzExRTBCQzBFQUExQkFD Qzc2MDM3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2MzlCMUREMjk3RDVERjExOTY0OEY4NTEx Qjc0MTdEMzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NjNBRUY5MTA1MzA1RTAxMTg2N0Y4OUIw MjExRTRGN0E8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjY0NzRDODNDNjg3Q0RGMTE4RTFGOTlE NjlCMzUyNUNDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2NDg4NkNDOEJGM0RFMDExODhCQkMw NTc4MUVCQUVENjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NjVDMjEwNEZFNzkwRTUxMTlGODJD MTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjY4OUIxREQyOTdENURGMTE5NjQ4 Rjg1MTFCNzQxN0QzPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2OEMyNUIwNjMyRURFMTExQTU3 QkYwMzMxMDQyMkVFNDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Njk0MDQzM0NFNzkwRTUxMTlG ODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjZDNDA0MzNDRTc5MEU1MTE5 RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2RTI4MkRDQTdGMTdFMDEx QjA3Mzk4NjZFOUFEMEM4MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NkY0MDQzM0NFNzkwRTUx MTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjcwMjEyQThDMkZERjEx RTA5QUQyODZBQTY1MzM0QTI3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3MDM5RURBMDUwMzcx MUUwQTJGM0UyM0U3OUI0NkFGNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NzM5RDdFOUZFQkFE REYxMUFBREVBREEzNTYyMjIwODM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjc1NTE1MzIyQUI1 Q0UyMTFBNzgwRUNEQkFENUM1N0RFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3NkJDM0Y3RTUz M0JFMDExODFEQUYzM0EzMDgzODZFRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Nzc2Q0QyM0Iy RkRFMTFFMEIxMzBCRTQ4NzhERjQ0RDU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjc3N0M0QUE0 MTcwRkUwMTFCNDIyODE1MzAyNUVGMENFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3ODgyMDBC MzMyNjFERjExQjM4Rjk5ODg3NUNDODY1NDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6N0FCQzNG N0U1MzNCRTAxMTgxREFGMzNBMzA4Mzg2RUU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjdFMEJC RUMwMDk4NURGMTE4NEIyRUU1OThEOTk1QTExPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4MkMw MUYzNjZFRjNERjExOUI4QUNGMjY4QTI3ODZBMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6ODM0 MjU1REM2RDNCRTAxMTgxREFGMzNBMzA4Mzg2RUU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjg0 Qzc2RTVDQTYxRUUwMTE5QjYyQzFBNzJDRERCQjJEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4 NTBGRDM4ODM5MENFMzExQjUxODlDMDNFQTEzMDI0NzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 ODYxQ0IxMjkxMTZDREYxMUEwODFEQUM2NTU0OUZGRjg8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk Ojg4QTEyMzExNjRENzExREZBNjk3ODUyMUQ2MERGNDYwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDo4QURCREZEMzdBNkZFMTExODQ0NUREQzgzNUZDOTMyRjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6OEI5MDg1OEZCNTczREYxMUJGQkJGMDA3NTlBM0Q0NTI8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjhCQ0ZBNjdCQjkwNkUzMTFBODFCQjkxNDdDN0UxNjNEPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDo5MEM1RDUyNjY0NzlERjExODY1Q0VFRjA5ODUxRkQ3OTwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6OTFGRjA1MUUwRkQzREYxMUIyRDFDNTFGNTlCNUZCMjk8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjk0MEREQzM1MDEyMTY4MTE4OEM2OEE5NDgyMTEyMjUyPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDo5NTkxNkYzNjcxNDRFMTExQUQ4NjhBMzgxN0IzODMxNTwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6OTZGQUVDQjAwMTVFREYxMUE4NzhBNTRFQjY2NDBFQjg8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjk3ODhBREI3NjYzRURGMTE4MjAwRjA5NzlEOEI5NTIxPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDo5ODVERjE4QzE4MjA2ODExOTJCMEQ0QjY5RkU1QUY4RDwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6OUIwQkM5MEU3NkI0REYxMUEzNjVFRjUyNTc3NjIzODE8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjlFNjY0NjRCNDJGREUyMTFBQTlGQjA5RDE2ODk0RjdFPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDo5RTdDMUY3N0ZDMjA2ODExOTk0Q0I5RkI1QjYzNTNBNDwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6OUVGN0Q5MkZDMzkyREYxMUFFRDZBNTlCMEVGNzExNDk8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOkEzQTYyMkNBODcxRkRGMTE4NTQ3QzU5NzUzNjE5OThEPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDpBNDU3MUE5NUU0NTBFMDExQUZCOUUwMEM3NTcyRTY2NTwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6QTZBQzBGOUM3MzNDRTAxMUIyQ0ZCMjMzQTQ3Q0Y1Qjk8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOkE3QkUxMEEwMzYwOERGMTE5MjREQjAzNTc3OTIxM0JBPC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDpBOTU2RkIwNUU0RkNERjExOTBBNkQxMDM3N0RGNTZCRDwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6QUFFNzY4RkY4RDZBREYxMTgyOTBDQkI5NEM1Q0Y0RjA8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOkFCQTY4NERCMDEwN0UwMTFCRTE5OEQ3NzUzNDZFMzEyPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpBQkMzRjhBNDI3MUNFMDExOEZDQUFCRDMwOTI0RDI5Njwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QUM3QzRGNkUyODA4RTMxMThGQjFERUQzNjQ0NzNCM0I8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkFFMThCN0I4MDZBOTExRTA4NUZERjM1QTMwQkE1NkFE PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCMTFEMzYwQzI1RjFERjExOTQ0NUE1RkQ4OTVENzgx RTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjFCNjFCMUNCNjlCREUxMUI2OTVDNkI5NzVENzUx Q0U8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkIxRkJDMkFDMkZERTExRTA5QUU5QzRBNkRGOUE0 MUY5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCMkU0QkI2MzQzRDVERjExOUJCREMxQkIyQjUx MDBBNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjVDMUQ2QkI3RDlGRTIxMTk1REE4OEIxQzg4 RDYzREU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkI1RDVEM0JDQzYwQURGMTE5NzQzQjVGRjk1 NjQ0NzlGPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCNkYyNzExQkJFQkJERjExOTZGNUI0NEQz QTlCRDZGNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjlCRjZBMTMzRDlFREUxMTg2NUVCNjBE QjM3RDlDREU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkJDQjcxMTkyN0JDQUUwMTFCNTRFQUM3 RDM0NjlFRTQ1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDMUZENDIyNDAyNEQxMUUwQjlFN0Q5 MjNERDc5MTdDRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzIzMkI5MzAwRjIwNjgxMThGNjJB NkE2RDQyMjNENTA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkMyNkMwRDQ5NTI2N0RGMTFCMkU1 QzhDQTJBMjBCNTAxPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDNDc2MjdCMkE0RjVERjExQUE2 QkY2NjFCRjc1MjIxQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzU1M0QyREVCNjFCRTIxMTky RTVDMUIxQjFERTdCMzY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkM2NUNBNzUzQTZCNURGMTE5 ODY2RDZCMTEwMDVCRTdCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDNjZDMEQ0OTUyNjdERjEx QjJFNUM4Q0EyQTIwQjUwMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzcxMTBFNUY1MDc2REYx MThFNjFBQ0QxNzlEMDYyNDQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkM4QzNBRDBGOTgxMEUw MTE5RTNFRUQ2REE1MkJCMDIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDQTJEODI5M0UxMURF MDExQjhGRDgxN0NDODk4MUQ0QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Q0M0QUI1OTFBN0RD REYxMUJGNzlGQTYyQjUxREY2Qzc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkNERTg4QkNFNEI2 RkRGMTFCMjE4QjAwRDg0N0RDMjk3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDRkJCREI1MjBD NDUxMUUwQTQzQUFEOUM0RTVBODgzNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDBCRjEyNjUy ODA5RTMxMThBMjFEOTVERUExNTkxQjE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkQzMzE4NDMx QTg2NEUxMTE5NUY5OTdCQTc0QkE0OUM1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpENDdGQjdE NDk2QjBFMDExOTUxRUMzMkMyNkIzNDc2NDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDVFQkY2 QUEyQjY3REYxMUIzODg5NDczMzJFNTU4QzQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkQ2NzY2 RjYxMTcxMkUwMTE4RDMzQTQzNjQ2NkQ5NTc3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpEOTAy MjIwREU3RURERjExODQ4OEFBQ0E2RTVGMjI1MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDlF NjgxNzQxREQ5MTFFMDhBMkU5NkQzMjY5NDExNDM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRB Qzg1MDc4NTRENURGMTFBMDk0REYwMUU2RURFMzIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpE QjFFNEMxQ0U4N0FERjExOENCN0ZFQTdDRDc0RDM1QjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 REMxMDg1MjMyQ0I0RTIxMUI2NDU4NEFDQ0U2QTdFNUY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OkREMUM2RDJBRkEyMzY4MTFBN0JBODkyMTM1QzEzODcyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDpERTRENkJFMjBDNkJERTExODg2OEQ1RDRGQ0NDRTdFQTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6REVDOURBOEYxQzIwNjgxMThEQkI5RDhFQ0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOkRFRjYwRkE1MDlCMEUyMTE5M0E3RTI3Njg4MEUxNTUwPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDpFMDI0MUU0MUI0RkVERjExQTQwQ0QzQzFCMzQzRDU5MjwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6RTAyQzE5MEU0MjZFREYxMUIyNERFOTA4QUNDQUMwOTU8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOkUwNkY3ODZERkNCMURGMTE5OERGQjIwRjkwRDNBQTZFPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDpFMDk5MEZCREFDM0FFMDExOERDOUJGNTc0NzYxNTMzRDwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6RTBCNTA1NzM1MEREREYxMTgyNzFBNjlBRkM2NTY4OEQ8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOkU3NDdDMEY4MEY2NURGMTE5QTk0QzVEOEQxODg5NTVCPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDpFNzk0MDc4RERFNjRERjExOEE1M0Q0RUZFMjBDMzUxODwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6RTdEMzQ3N0YwQzQ4MTFFMDg4QURENkVENUEzRDg5REU8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOkU3REQ1MjY0MUExOUUwMTE5NUYxQkE0NzRGMkMwQkFFPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDpFODEyQTM3MUZDNENERjExQkU1NTkyNjdGNTNBMEJBRjwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6RThBODJFQTJDQzA4RTMxMTg2MkZCQzJENDU2RjMwMTg8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOkU4QzE1NjBFOTIxN0UwMTFBRkZCQTY1NDE5QUYxMENCPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDpFQTEyQTM3MUZDNENERjExQkU1NTkyNjdGNTNBMEJBRjwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6RUI4NDY5MjAzQkZBREQxMThCNEE4MjhEOEVGRDUzMEE8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOkVFQzE1NjBFOTIxN0UwMTFBRkZCQTY1NDE5QUYxMENCPC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDpFRjg0NDFDMDY1RTdERjExQjhBQkJCRjdGRkE2QjBDNDwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjFEMjEyQTQ3OTQ1REUxMTk5OEZCRUQyMjkzRDlFMjc8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOkYyOTg2RjQxNkIxRURGMTE5ODk4QUNEQkRGNUYxMjVFPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGNDgwOUVCMkJBMDhFMzExOTAxNjgxRTg0MDRGRkZBRTwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjVDOTQ5RDRGQjY4REYxMUJCMjc5Rjk4RjA2NzM2MEE8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY2QTNGREI1MDcyMDY4MTE4M0Q0Qzg4M0Q1NEZEMjE3 PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGNkNFNzI1MTRCMjA2ODExQTEzOEJDRDU3NTRBQ0Qy QjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Rjc3RjExNzQwNzIwNjgxMTgwODNFQjgzQzYyQkQ3 QzE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY3N0YxMTc0MDcyMDY4MTE4OTI2QzI3Nzk4Qzk2 Q0U1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGN0RFNjcwMTFGRUNFMjExQkM5QTk2RjA2QTk1 NkFFNDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjhBM0ZEQjUwNzIwNjgxMTgzRDRDODgzRDU0 RkQyMTc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY4RTVCRTQxQzgxOTExRTBCMDMzRUVGQUFG MUUyODczPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGOUQyQkMwQTAzOThERjExOEUwREZCQ0Mz OUYxRDcwQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkFDRDVBNzAzMzI1RTIxMTgwNkRCNTA4 RkE2NzVEOUU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkZCQkY0OTZDMkZERTExRTA4Mzg3RDMw MTgwNzU3NTg5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGQkQzRDlCNjA4NTcxMUUwQkE3REU1 OEM2MTQ2OUUwNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkJGOTlFQjc1NjdEREYxMUE3NEVF NkNFMDM5OTQ0MjI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkZDMTMzQTgyRDEwRDExRTBBMDhB OTc5NjUxOThFRjdDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGQzdGMTE3NDA3MjA2ODExOTQ1 N0I5MzM5N0NDRjM2RjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkVDNTJEMzk3NjYzREYxMUIy NjE5NEREMTM0MjdGOEI8L3JkZjpsaT4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFu Y2VzdG9ycz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0 IGVuZD0idyI/Pv/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIA CQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAA M2Rlc2MAAAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIs AAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcA AAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdU UkMAAAQ8AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQt UGFja2FyZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAA EnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAA AAAAAG+iAAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVz YwAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cu aWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MA AAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAA AAAAAAAALklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAA AAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24g aW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGlu IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQ zxQAA+3MAAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAA AAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAj ACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4A sgC3ALwAwQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFS AVkBYAFnAW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8C OAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNa A2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE 0wThBPAE/gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaM Bp0GrwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYI qgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsL CyILOQtRC2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN 3g34DhMOLg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1 ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoU ixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhl GIoYrxjVGPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMc zBz1HR4dRx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1 IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocm tyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5 LG4soizXLQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioy YzKbMtQzDTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjI OQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/ 4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1 R3tHwEgFSEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBP SU+TT91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeS V+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdg qmD8YU9homH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnx akhqn2r3a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0 FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5i fsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJ mYn+imSKyoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0 lV+VyZY0lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNih R6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24 ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7 LrunvCG8m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8 yTrJuco4yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjX XNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN 5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD1 3vZt9vv3ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkQAAAAAH/2wCE AAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgMD AwMDAwMDAwMBAQEBAQEBAQEBAQICAQICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDA//AABEIAyADIAMBEQACEQEDEQH/3QAEAGT/xAGiAAAABgIDAQAAAAAA AAAAAAAHCAYFBAkDCgIBAAsBAAAGAwEBAQAAAAAAAAAAAAYFBAMHAggBCQAKCxAAAgEDBAEDAwID AwMCBgl1AQIDBBEFEgYhBxMiAAgxFEEyIxUJUUIWYSQzF1JxgRhikSVDobHwJjRyChnB0TUn4VM2 gvGSokRUc0VGN0djKFVWVxqywtLi8mSDdJOEZaOzw9PjKThm83UqOTpISUpYWVpnaGlqdnd4eXqF hoeIiYqUlZaXmJmapKWmp6ipqrS1tre4ubrExcbHyMnK1NXW19jZ2uTl5ufo6er09fb3+Pn6EQAC AQMCBAQDBQQEBAYGBW0BAgMRBCESBTEGACITQVEHMmEUcQhCgSORFVKhYhYzCbEkwdFDcvAX4YI0 JZJTGGNE8aKyJjUZVDZFZCcKc4OTRnTC0uLyVWV1VjeEhaOzw9Pj8ykalKS0xNTk9JWltcXV5fUo R1dmOHaGlqa2xtbm9md3h5ent8fX5/dIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqq usra6vr/2gAMAwEAAhEDEQA/ANAgH/b+22Wn2dLUcUAJz1z1H/D3SnT2skdcfdumyQBU8Ove/db6 97917ri3493Tz6Zcd1euPu/VOuVv6ce6a/l06U81OevarcHj3rR8+va6UDcesgsRwR9b29t+fDp9 aMKgitevOPSb/wBPz/xX3tfiHXpVXw2qPLqMHIUr/X/kft2grXz6QCQiPw/LrPHbSP6/n/Hn22/H pXBp0D16ye6dKeve/de697917rhpP9P95Hu1R0wQRg9de99a697917rw9662DTrJ7r0/1737r3Xv fuvde9+691737r3Xvfuvde9+691737r3WMfX3bpgHPXPX71p6tVf4eu/euneur/4f7z/AMa97p8+ m9TenXfvXTgNeuVrfnn3rj5dWI0/iz1zV+eT7904kme49cm5/wB59+Pl1d89YtJ/4179XpjQacOu PvfVePXTfi/vY6o9MV65WPvXW9S+vUmlqpKduLvGSdcRJKOP9SVt+PdJIw4zx9eldleS2zYJaOuV rg/l1nmijlRqiEMup7+P8KD/AI+6KxUhW6V3EEM0bXMAIBPw+Q6gshW1zyRew+o9vdFkilNPdnqX R5OsopA0Euk/6lgHQ/nlSCPofbMtvFKtHWo6XbfvW4bbIHtJqfIgEfsOOnR9wVNQdU4Uk8cKFAtx cAW+vtlbONMLw6On5pvLs1uWH2AAdeRVrtcvKm3JC3LNYcf8lH34kRY6qiJuIeUjT/lPTPUwSwt+ 4pUHmzX+n0vz/X2pVw3DoivLaaFv1EI+3/D1gU2ufx7sf59ModNf4eso/wB49+6fH29vXf5v+Pfu t1zXru/HIF/9j/yL37q1fXriCf6+/DqgJPn13fn37q2rPXgxH0P+8+/Y61qp1JiYH6/63+29svUE 9KIivnw69Kyj9PAt/tyR/wAR78la9amZOC9N7ck+3h0WydxYdYtJ93qOmdDdde/dU4ddH6e7L8Q6 ak4r137v051iP092PDpOeHXYF/futgEmg65Af1H++/1veifn1dV9V65e2unAAooOve/db670t/T/ AHke9VHXuuS/n3o9OoKV65e9dXpnhnrsKf8AW96r1cITx6zot/8Ae/eiaCp6Uoo9OswUD/H/AH34 9tM9eHTg4ddsP6r9fp/vvr70CRwPVgAeJ6xSQN9RfkkD/igN/bgcdMy27YPUZkZbXB/3r250leMr SvDrjYe/V6boBwHXBvqf9h/vXuw4dNEUOeuve+tde9+691737r3XvfuvdcwLcn3UnpxB5167P096 6ueHXvfut9cdP+P+8e916b8P59cveunOve/deAoKde9+6913Yf09+z03pb168AT/AK/v2OnFDEcM 9cmJHHvQ6ddiMdcD9Pex0yxoOvWHv1evaRWvWRFY/QfX3o9PRq3pjqasYFr/AF/330/1vbTMW+zp csdOPXcrBQQvH/Ffr70oqaHq0zBRRR03fU3Pt/opYsST59dBQfoPfq9eEYOAOosgPkYfnVb28vwj otlU+K489VOn2CnJICi/5JP+8f7f2idxwrjoU21qWIAXHX//0NAUce9+XSgVU/PrJ7Z6fBDCo697 91vrqw+vveo+vVNHdqrjroj8jg+96/l1plNarx68dVuLe/dnWmDsOHXH251TrmDf3UinTqtqrjro 8m3vY9etNk6R1iuQf8V966T1KnjkdZdZfg/kc/8AFfddKjPSjxmk7TxI6j+79I+pMX6fr9CePbT8 R0ttiNPHNesvunSvr3v3Xuve/de697917rn710x1g/P+x93695/n1737rXDrw/r791sevWT3Xp/r 3v3Xuve/de697917r3v3Xuve/de6x8/4+7dMZ+fXrH37r1D1k916f697917ru3vVem9fy66uPe+r 1HXVx/X/AHv36h60GB679+6t1zvYD3qnHpzVQL10WJ9+6qzlvs64+99V697917r1h/T/AHv37qun 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 PVlFSOuYtYe6nj04tafLrv37q/zpjrwF/euHXgK9eAJ9+r14KTw6zqoAv+b/AOH+3/r790pRAor1 0SD/AIe9Y62SD15vx78etN5dcSOPfvn1Rh28OuAUn3uvTaqT9nUiKPU1gL2/3v3RmoPn0pij1GgH TnEnF2P1/qL/ANLe2eja3iotW4dekcICB/T+lvr/AIfT37rUjKlVXqHf6n/X/wB5Pu4JFadIipLV 8uuQU/63utOvBPU9ZEhZvx/rAf8AGvfq9Px2pbgMdccTStLkZ2P0gMl/66mYoo/19N/d7mQLBGK5 NOmtisTPu90SvbEW/aTQfyr0/V5j8Lw3J9N9K/gr9P8AbH2jh1Fg/Qp3RojbyW4NRSuPUdf/0tAY Gw9+p0qDUBHn1z9tdPde9669x697317r3v3WiwXieuOr3fR8+qeJnhjrPGiFS8rmOJCoIQXlkJPK RjgXsPqeB78BT7emZZSOxPi/wdKnANiEq3p81TmKCqgH2blr+IzXKVE5XiR7Afqvp/AHuj6yuDgH PSTFa1r/AKv5dLKinGC14LLY4ZXA5hiJ6SKcRJkgQzQ19BM+uOg3bjAwMEwGiojvFMGU2NgwYaDx HSeZGDCdGAYedK0+R9VPmPLiOkJuPa8+Glp6ikm/iWByayz4bMxRMkdXDE+iemqYrM1Dlse7COqp nOuJ7Eao3jd/agpIY9GNq7XoKotJVHcvEj5/NT5NwP21HSbkh8f+cst7H6jV/wAk/wCt70JNfw9K pbZogPGIUH9v7OsLJbT6WAb6FvqeeTb3YEHz6TyR6StFIB9eJ6lLEqC49R/r7aZi3Hh0Zx2yRAFR VvXrr/ff4e9dVI86dd3Pv3WtK+nXXv3Vuve/de697917rH7v0n697117h1m/P+v7p1fivzHWLUf6 /wC9e70HVamlPLrr3vrXXvfuvdZT7bHTiefXXvfTnXvfuvde9+691737r3Xvfuvde9+691737r3X ZPv3VVWn29SIImlNlBZh+Byf9h7ozBcnpbbQvNhBVh1zaJ1bQwIYf7x/j79qUitervC6HS6kHrkY k08j1fS9/wDD/ivums1+XXjElDUd3UJl0m3+Pt7pC66Dw669+6910Pz/ALD/AIn3s+XTa/Eesgjc i4U2/r7rUevShYpGFQuOuYQr9ffuPTix6eJ6d6bIGClaLRG2n1Lq/UCSBpH4Jv7TSQh3BqaHo6td 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 PyJ6/9k= --gas1mX1Qbw=_aozdAkx6HFIG1JQwAFicKK Content-Type: image/jpeg; name="14-1.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="14-1.jpg" Content-ID: Content-Description: Photo /9j/4SVZRXhpZgAASUkqAAgAAAAQAAABAwABAAAAwAwAAAEBAwABAAAA2hEAAAIBAwADAAAAzgAA AAYBAwABAAAAAgAAAA8BAgASAAAA1AAAABABAgAMAAAA5gAAABIBAwABAAAAAQAAABUBAwABAAAA AwAAABoBBQABAAAA8gAAABsBBQABAAAA+gAAACgBAwABAAAAAwAAADEBAgAeAAAAAgEAADIBAgAU AAAAIAEAADsBAgAIAAAANAEAAJiCAgAPAAAAPAEAAGmHBAABAAAATAEAAOQDAAAIAAgACABOSUtP TiBDT1JQT1JBVElPTgBOSUtPTiBENzAwMACA/AoAECcAAID8CgAQJwAAQWRvYmUgUGhvdG9zaG9w IENTNiAoV2luZG93cykAMjAxNToxMToyOSAyMjo1OTo0OQBtYnpoYW5nAENvcHlSaWdodEAyMDEy AAAoAJqCBQABAAAAMgMAAJ2CBQABAAAAOgMAACKIAwABAAAAAQAAACeIAwABAAAAZAAAADCIAwAB AAAAAgAAAACQBwAEAAAAMDIyMQOQAgAUAAAAQgMAAASQAgAUAAAAVgMAAAGSCgABAAAAagMAAAKS BQABAAAAcgMAAASSCgABAAAAegMAAAWSBQABAAAAggMAAAeSAwABAAAAAgAAAAiSAwABAAAAAAAA AAmSAwABAAAAEAAAAAqSBQABAAAAigMAAJCSAgADAAAAMzAAAJGSAgADAAAAMzAAAJKSAgADAAAA MzAAAAGgAwABAAAAAQAAAAKgBAABAAAAIAMAAAOgBAABAAAAIAMAABeiAwABAAAAAgAAAACjBwAB AAAAAwAAAAGjBwABAAAAAQAAAAKjBwAIAAAAkgMAAAGkAwABAAAAAAAAAAKkAwABAAAAAQAAAAOk AwABAAAAAAAAAASkBQABAAAAmgMAAAWkAwABAAAAnQAAAAakAwABAAAAAAAAAAekAwABAAAAAAAA AAikAwABAAAAAAAAAAmkAwABAAAAAAAAAAqkAwABAAAAAgAAAAykAwABAAAAAAAAADGkAgAIAAAA ogMAADKkBQAEAAAAqgMAADSkAgAYAAAAygMAAAAAAAABAAAAfQAAAAgAAAABAAAAMjAxNToxMToy MiAxMDoxNDowMgAyMDE1OjExOjIyIDEwOjE0OjAyABhKagBAQg8ABgAAAAEAAAACAAAABgAAADIA AAAKAAAAGgQAAAoAAAACAAIAAAEBAgEAAAABAAAAMjA1MzE3MwC0AAAACgAAABoEAAAKAAAAIwAA AAoAAAA4AAAACgAAADE4LjAtMTA1LjAgbW0gZi8zLjUtNS42AAAABgADAQMAAQAAAAYAAAAaAQUA AQAAADIEAAAbAQUAAQAAADoEAAAoAQMAAQAAAAIAAAABAgQAAQAAAEIEAAACAgQAAQAAAA8hAAAA AAAASAAAAAEAAABIAAAAAQAAAP/Y/+0ADEFkb2JlX0NNAAH/7gAOQWRvYmUAZIAAAAAB/9sAhAAM CAgICQgMCQkMEQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMAQ0LCw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAz/wAARCACgAKADASIAAhEBAxEB/90ABAAK/8QBPwAAAQUBAQEBAQEAAAAA AAAAAwABAgQFBgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYI BQMMMwEAAhEDBCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkST VGRFwqN0NhfSVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3 x9fn9xEAAgIBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJD UxVjczTxJQYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaG lqa2xtbm9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwDzcVWESBxyrWNc5jSIh0yD3laHRvqz1XOy ixtW1w1PrH02u/kyVqHorsbKdXYxjnVjY41v3tjw3fvNUrBI+FocZ9+WxrNx11IPBW1hY2K2K3Yz rq7pDiNXtjuzd9FyzxWGENgtg6ERwur6c8iutrKiGEN3GBJ/e2/uoSNKgLVhdC+zS+hxI5ZvEGO8 /wApb+NS8MY7cS4DntKhRV652uET/wBSVrVUNY0Aa/7FBKTPGPZrurLR6gEmPo+KHczJfQ/02/pH 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 DaaxtqpDGbW+mxCYJGmiYkA66vrWOzrHTun5BObRdZX+kc+4B4dsH6QufS+rY2z/AIxaPS+qZGR0 mvPycJ+ObW7vRa9jzt/Nc31jjP8A0jf0vp/zldf84vKfq51P6s9LY7J6p0+/Pzm2h+OGvDKA1oDm usZ+fc23/Stuqetfrf8AjP6leWjo9X2Gtn+Et222H+q0g1Vt/e/nFEIzBq78SyXAiyK8nr/rD1jI 6LhDqrMI5NVdgFzHWCstY72+rLBf/hHMZ/1xed/Wj603/WS9lnpnFxKta8UuFkWEbLbvWbXS/wDS MDfYqud9Z+vdQxvsebmOsxXEONQYxjSQZbu9JjHO935qzm1HVzYgchSwB/Sq/BjkR0/FfgEqoWfp XeH0tVYe8wgA/pmz5TpPdGSA6mOdlVT+HOrIAHJAIcP85ykwn1DuEy1wnsII9hI+l7VFgYGho4bo ddCJ/wBXKDLBWzfsa8/RG4gCT+kP7m7aig7FP6gALWl0ExtGv/RduRHNZawS8iPoggMM87vTa0f9 8SxeoWPa6siqtu0w5xgDhv0xXZ7/APR73qWW52wVlwssYZh0EEfvBvtRY3//2f/tKnRQaG90b3No b3AgMy4wADhCSU0EBAAAAAAAYxwBWgADGyVHHAFaAAMbJUccAVoAAxslRxwBWgADGyVHHAIAAAIA GRwCUAAHbWJ6aGFuZxwCNwAIMjAxNTExMjIcAjwACzEwMTQwMiswMDAwHAJ0AA5Db3B5UmlnaHRA MjAxMgA4QklNBCUAAAAAABCRr1UOECNE5kysTmTezGkvOEJJTQQ6AAAAAADXAAAAEAAAAAEAAAAA AAtwcmludE91dHB1dAAAAAUAAAAAUHN0U2Jvb2wBAAAAAEludGVlbnVtAAAAAEludGUAAAAASW1n IAAAAA9wcmludFNpeHRlZW5CaXRib29sAAAAAAtwcmludGVyTmFtZVRFWFQAAAABAAAAAAAPcHJp bnRQcm9vZlNldHVwT2JqYwAAAAVoIWg3i75/bgAAAAAACnByb29mU2V0dXAAAAABAAAAAEJsdG5l bnVtAAAADGJ1aWx0aW5Qcm9vZgAAAAlwcm9vZkNNWUsAOEJJTQQ7AAAAAAItAAAAEAAAAAEAAAAA ABJwcmludE91dHB1dE9wdGlvbnMAAAAXAAAAAENwdG5ib29sAAAAAABDbGJyYm9vbAAAAAAAUmdz TWJvb2wAAAAAAENybkNib29sAAAAAABDbnRDYm9vbAAAAAAATGJsc2Jvb2wAAAAAAE5ndHZib29s AAAAAABFbWxEYm9vbAAAAAAASW50cmJvb2wAAAAAAEJja2dPYmpjAAAAAQAAAAAAAFJHQkMAAAAD AAAAAFJkICBkb3ViQG/gAAAAAAAAAAAAR3JuIGRvdWJAb+AAAAAAAAAAAABCbCAgZG91YkBv4AAA AAAAAAAAAEJyZFRVbnRGI1JsdAAAAAAAAAAAAAAAAEJsZCBVbnRGI1JsdAAAAAAAAAAAAAAAAFJz bHRVbnRGI1JsdEDJt64gAAAAAAAACnZlY3RvckRhdGFib29sAQAAAABQZ1BzZW51bQAAAABQZ1Bz AAAAAFBnUEMAAAAATGVmdFVudEYjUmx0AAAAAAAAAAAAAAAAVG9wIFVudEYjUmx0AAAAAAAAAAAA AAAAU2NsIFVudEYjUHJjQFkAAAAAAAAAAAAQY3JvcFdoZW5QcmludGluZ2Jvb2wAAAAADmNyb3BS ZWN0Qm90dG9tbG9uZwAAAAAAAAAMY3JvcFJlY3RMZWZ0bG9uZwAAAAAAAAANY3JvcFJlY3RSaWdo dGxvbmcAAAAAAAAAC2Nyb3BSZWN0VG9wbG9uZwAAAAAAOEJJTQPtAAAAAAAQALbhSAACAAIAtuFI AAIAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQPyAAAAAAAKAAD///////8AADhCSU0E DQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0nEAAA AAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYA AAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP// //////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//// /////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQI AAAAAAAVAAAAAQAAAkAAAAJAAAAAAQAAEroBADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAAz0A AAAGAAAAAAAAAAAAAAMgAAADIAAAAAQAMwAwAC0AMQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAA AAAAAAAAAAADIAAAAyAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAA AAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcA AAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAyAAAAAAUmdodGxvbmcAAAMgAAAABnNs aWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAA B2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2Vu ZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAA AQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxv bmcAAAMgAAAAAFJnaHRsb25nAAADIAAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAA AAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxi b29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6 QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdk ZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAA CXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRs b25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhC SU0EFAAAAAAABAAAABs4QklNBAwAAAAAISsAAAABAAAAoAAAAKAAAAHgAAEsAAAAIQ8AGAAB/9j/ 7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgT ExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4U FA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAKAA oAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEB AQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEy BhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80Yn lKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUB AAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMX ZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAM AwEAAhEDEQA/APNxVYRIHHKtY1zmNIiHTIPeVodG+rPVc7KLG1bXDU+sfTa7+TJWoeiuxsp1djGO dWNjjW/e2PDd+81SsEj4Whxn35bGs3HXUg8FbWFjYrYrdjOurukOI1e2O7N30XLPFYYQ2C2DoRHC 6vpzyK62sqIYQ3cYEn97b+6hI0qAtWF0L7NL6HEjlm8QY7z/AClv41LwxjtxLgOe0qFFXrna4RP/ AFJWtVQ1jQBr/sUEpM8Y9mu6stHqASY+j4odzMl9D/Tb+keCB2V8taBqq+dl4+Dh35dxiuhhe4eM fQbp++/axNBXkPGdW+q/VjpTtvFn0uAQfBznLk+ofVzqtF2x1DiSYlvuB+Dh7VvdY+t1/ol7HbCw 7nmSC0SGNMfRduc5Yd31rz7CGhzhAG6Z9pd21U4Mh2YTjie7Gv6r5Ik5Q2NLZaQR7T23j91XMbpl eLjWMewWPLZrc0g+7sgY5+sfU3BuLUW0k+624+kzv9F1231PY3d7GLRo+qf1htYLLr6qRdLccN3O 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 Ecxn/XF539aPrTf9ZL2WemcXEq1rxS4WRYRstu9ZtdL/ANIwN9iq531n691DG+x5uY6zFcQ41BjG NJBlu70mMc73fmrObUdXNiByFLAH9Kr8GORHT8V+ASqhZ+ld4fS1Vh7zCAD+mbPlOk90ZIDqY52V VP4c6sgAckAhw/znKTCfUO4TLXCewgj2Ej6XtUWBgaGjhuh10In/AFcoMsFbN+xrz9EbiAJP6Q/u btqKDsU/qAAtaXQTG0a/9F25Ec1lrBLyI+iCAwzzu9NrR/3xLF6hY9rqyKq27TDnGAOG/TFdnv8A 9HvepZbnbBWXCyxhmHQQR+8G+1Fjf//ZADhCSU0EIQAAAAAAVQAAAAEBAAAADwBBAGQAbwBiAGUA IABQAGgAbwB0AG8AcwBoAG8AcAAAABMAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABD AFMANgAAAAEAOEJJTQQGAAAAAAAHAAgAAAABAQD/4SpbaHR0cDovL25zLmFkb2JlLmNvbS94YXAv MS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/ PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAg Q29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxy ZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4 LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOmRjPSJodHRwOi8vcHVy bC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hh cC8xLjAvIiB4bWxuczphdXg9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvYXV4LyIgeG1s bnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4 bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6 Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9 Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmNy cz0iaHR0cDovL25zLmFkb2JlLmNvbS9jYW1lcmEtcmF3LXNldHRpbmdzLzEuMC8iIGRjOmZvcm1h dD0iaW1hZ2UvanBlZyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5k b3dzKSIgeG1wOk1vZGlmeURhdGU9IjIwMTUtMTEtMjlUMjI6NTk6NDkrMDg6MDAiIHhtcDpDcmVh dGVEYXRlPSIyMDE1LTExLTIyVDEwOjE0OjAyIiB4bXA6UmF0aW5nPSIwIiB4bXA6TWV0YWRhdGFE YXRlPSIyMDE1LTExLTI5VDIyOjU5OjQ5KzA4OjAwIiBhdXg6U2VyaWFsTnVtYmVyPSIyMDUzMTcz IiBhdXg6TGVuc0luZm89IjE4MC8xMCAxMDUwLzEwIDM1LzEwIDU2LzEwIiBhdXg6TGVucz0iMTgu MC0xMDUuMCBtbSBmLzMuNS01LjYiIGF1eDpMZW5zSUQ9IjE1OCIgYXV4OkltYWdlTnVtYmVyPSIy MzUxNCIgYXV4OkFwcHJveGltYXRlRm9jdXNEaXN0YW5jZT0iMjExLzEwMCIgcGhvdG9zaG9wOkRh dGVDcmVhdGVkPSIyMDE1LTExLTIyVDEwOjE0OjAyLjAwMyIgcGhvdG9zaG9wOkxlZ2FjeUlQVENE aWdlc3Q9Ijc5M0E2MTY4REI4MzdDRjA2OEY1NDBDMzZBNTk0QjU0IiBwaG90b3Nob3A6Q29sb3JN b2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHhtcE1NOkRv Y3VtZW50SUQ9InhtcC5kaWQ6MUU2QTg2MkZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjAiIHhtcE1N Ok9yaWdpbmFsRG9jdW1lbnRJRD0iODhFM0FDNENFNURCQTBCRjM1MUNBQjlCMDA3RDhBNDAiIHht cE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RUFDQkIzNEFBNTk2RTUxMUE4NDU4NTAzNTBFNzJFRkIi IGNyczpSYXdGaWxlTmFtZT0iRFNDXzMxNDguTkVGIiBjcnM6VmVyc2lvbj0iNy4wIiBjcnM6UHJv Y2Vzc1ZlcnNpb249IjYuNyIgY3JzOldoaXRlQmFsYW5jZT0iQXMgU2hvdCIgY3JzOlRlbXBlcmF0 dXJlPSI1NTUwIiBjcnM6VGludD0iKzUiIGNyczpFeHBvc3VyZT0iMC4wMCIgY3JzOlNoYWRvd3M9 IjUiIGNyczpCcmlnaHRuZXNzPSIrNTAiIGNyczpDb250cmFzdD0iKzI1IiBjcnM6U2F0dXJhdGlv bj0iMCIgY3JzOlNoYXJwbmVzcz0iMjUiIGNyczpMdW1pbmFuY2VTbW9vdGhpbmc9IjAiIGNyczpD b2xvck5vaXNlUmVkdWN0aW9uPSIyNSIgY3JzOlZpZ25ldHRlQW1vdW50PSIwIiBjcnM6U2hhZG93 VGludD0iMCIgY3JzOlJlZEh1ZT0iMCIgY3JzOlJlZFNhdHVyYXRpb249IjAiIGNyczpHcmVlbkh1 ZT0iMCIgY3JzOkdyZWVuU2F0dXJhdGlvbj0iMCIgY3JzOkJsdWVIdWU9IjAiIGNyczpCbHVlU2F0 dXJhdGlvbj0iMCIgY3JzOkZpbGxMaWdodD0iMCIgY3JzOlZpYnJhbmNlPSIwIiBjcnM6SGlnaGxp Z2h0UmVjb3Zlcnk9IjAiIGNyczpDbGFyaXR5PSIwIiBjcnM6RGVmcmluZ2U9IjAiIGNyczpIdWVB ZGp1c3RtZW50UmVkPSIwIiBjcnM6SHVlQWRqdXN0bWVudE9yYW5nZT0iMCIgY3JzOkh1ZUFkanVz dG1lbnRZZWxsb3c9IjAiIGNyczpIdWVBZGp1c3RtZW50R3JlZW49IjAiIGNyczpIdWVBZGp1c3Rt ZW50QXF1YT0iMCIgY3JzOkh1ZUFkanVzdG1lbnRCbHVlPSIwIiBjcnM6SHVlQWRqdXN0bWVudFB1 cnBsZT0iMCIgY3JzOkh1ZUFkanVzdG1lbnRNYWdlbnRhPSIwIiBjcnM6U2F0dXJhdGlvbkFkanVz dG1lbnRSZWQ9IjAiIGNyczpTYXR1cmF0aW9uQWRqdXN0bWVudE9yYW5nZT0iMCIgY3JzOlNhdHVy YXRpb25BZGp1c3RtZW50WWVsbG93PSIwIiBjcnM6U2F0dXJhdGlvbkFkanVzdG1lbnRHcmVlbj0i MCIgY3JzOlNhdHVyYXRpb25BZGp1c3RtZW50QXF1YT0iMCIgY3JzOlNhdHVyYXRpb25BZGp1c3Rt ZW50Qmx1ZT0iMCIgY3JzOlNhdHVyYXRpb25BZGp1c3RtZW50UHVycGxlPSIwIiBjcnM6U2F0dXJh dGlvbkFkanVzdG1lbnRNYWdlbnRhPSIwIiBjcnM6THVtaW5hbmNlQWRqdXN0bWVudFJlZD0iMCIg Y3JzOkx1bWluYW5jZUFkanVzdG1lbnRPcmFuZ2U9IjAiIGNyczpMdW1pbmFuY2VBZGp1c3RtZW50 WWVsbG93PSIwIiBjcnM6THVtaW5hbmNlQWRqdXN0bWVudEdyZWVuPSIwIiBjcnM6THVtaW5hbmNl QWRqdXN0bWVudEFxdWE9IjAiIGNyczpMdW1pbmFuY2VBZGp1c3RtZW50Qmx1ZT0iMCIgY3JzOkx1 bWluYW5jZUFkanVzdG1lbnRQdXJwbGU9IjAiIGNyczpMdW1pbmFuY2VBZGp1c3RtZW50TWFnZW50 YT0iMCIgY3JzOlNwbGl0VG9uaW5nU2hhZG93SHVlPSIwIiBjcnM6U3BsaXRUb25pbmdTaGFkb3dT YXR1cmF0aW9uPSIwIiBjcnM6U3BsaXRUb25pbmdIaWdobGlnaHRIdWU9IjAiIGNyczpTcGxpdFRv bmluZ0hpZ2hsaWdodFNhdHVyYXRpb249IjAiIGNyczpTcGxpdFRvbmluZ0JhbGFuY2U9IjAiIGNy czpQYXJhbWV0cmljU2hhZG93cz0iMCIgY3JzOlBhcmFtZXRyaWNEYXJrcz0iMCIgY3JzOlBhcmFt ZXRyaWNMaWdodHM9IjAiIGNyczpQYXJhbWV0cmljSGlnaGxpZ2h0cz0iMCIgY3JzOlBhcmFtZXRy aWNTaGFkb3dTcGxpdD0iMjUiIGNyczpQYXJhbWV0cmljTWlkdG9uZVNwbGl0PSI1MCIgY3JzOlBh cmFtZXRyaWNIaWdobGlnaHRTcGxpdD0iNzUiIGNyczpTaGFycGVuUmFkaXVzPSIrMS4wIiBjcnM6 U2hhcnBlbkRldGFpbD0iMjUiIGNyczpTaGFycGVuRWRnZU1hc2tpbmc9IjAiIGNyczpQb3N0Q3Jv cFZpZ25ldHRlQW1vdW50PSIwIiBjcnM6R3JhaW5BbW91bnQ9IjAiIGNyczpDb2xvck5vaXNlUmVk dWN0aW9uRGV0YWlsPSI1MCIgY3JzOkxlbnNQcm9maWxlRW5hYmxlPSIwIiBjcnM6TGVuc01hbnVh bERpc3RvcnRpb25BbW91bnQ9IjAiIGNyczpQZXJzcGVjdGl2ZVZlcnRpY2FsPSIwIiBjcnM6UGVy c3BlY3RpdmVIb3Jpem9udGFsPSIwIiBjcnM6UGVyc3BlY3RpdmVSb3RhdGU9IjAuMCIgY3JzOlBl cnNwZWN0aXZlU2NhbGU9IjEwMCIgY3JzOkF1dG9MYXRlcmFsQ0E9IjAiIGNyczpFeHBvc3VyZTIw MTI9IjAuMDAiIGNyczpDb250cmFzdDIwMTI9IjAiIGNyczpIaWdobGlnaHRzMjAxMj0iMCIgY3Jz OlNoYWRvd3MyMDEyPSIwIiBjcnM6V2hpdGVzMjAxMj0iMCIgY3JzOkJsYWNrczIwMTI9IjAiIGNy czpDbGFyaXR5MjAxMj0iMCIgY3JzOkNvbnZlcnRUb0dyYXlzY2FsZT0iRmFsc2UiIGNyczpUb25l Q3VydmVOYW1lPSJNZWRpdW0gQ29udHJhc3QiIGNyczpUb25lQ3VydmVOYW1lMjAxMj0iTGluZWFy IiBjcnM6Q2FtZXJhUHJvZmlsZT0iQWRvYmUgU3RhbmRhcmQiIGNyczpDYW1lcmFQcm9maWxlRGln ZXN0PSIyRkVBM0VBOTJENURGRTc3RkJCNzdDQ0FEODRDNDc2OSIgY3JzOkxlbnNQcm9maWxlU2V0 dXA9IkxlbnNEZWZhdWx0cyIgY3JzOkhhc1NldHRpbmdzPSJUcnVlIiBjcnM6SGFzQ3JvcD0iRmFs c2UiIGNyczpBbHJlYWR5QXBwbGllZD0iVHJ1ZSI+IDxkYzpjcmVhdG9yPiA8cmRmOlNlcT4gPHJk ZjpsaT5tYnpoYW5nPC9yZGY6bGk+IDwvcmRmOlNlcT4gPC9kYzpjcmVhdG9yPiA8ZGM6cmlnaHRz PiA8cmRmOkFsdD4gPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ij5Db3B5UmlnaHRAMjAxMjwv cmRmOmxpPiA8L3JkZjpBbHQ+IDwvZGM6cmlnaHRzPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0 b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT4xMDY3ODc0NTk4RkE1MUYwNTA3NjE1NzI0OERDNDA5MTwv cmRmOmxpPiA8cmRmOmxpPjIwQTAzNzgwMjk0MDU4NTA4REY5MTU2OTY4REQyODFEPC9yZGY6bGk+ IDxyZGY6bGk+M0QxMzEyMUU2QTBCNkQzNjBBMDAwNjgzREU5QzgzMTc8L3JkZjpsaT4gPHJkZjps aT41Rjk5NzAxOUU4OTc2NERGMUNCMEMwNzA1NjEyNThFOTwvcmRmOmxpPiA8cmRmOmxpPjc1Mjc0 MzQxMjIxNTUzMUE1RTMwNjRBQ0VFMzk5QjE2PC9yZGY6bGk+IDxyZGY6bGk+RkE2RUFBRjlGQURD QjQ2N0E5QkE1MzI3MEIzRjQ2MkY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjYwNDQ1RDg2QTI5 NkU1MTFBODQ1ODUwMzUwRTcyRUZCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5NUY1MDRDOUU3 OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OThGNTA0QzlF NzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkFBRjc2OTc2 RTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDMDY1NUY5 MEU3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzM2NTVG OTBFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkM2NjU1 RjkwRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGNURE NzBBQ0U3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjhE RDcwQUNFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkZC REQ3MEFDRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpG RTMwQjY2MkU3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhv dG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6 bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NzMzNjgy RkU3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMCIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0yMlQxNTowMzo1 MSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENhbWVyYSBSYXcg Ny4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iL21ldGFkYXRhIi8+IDxyZGY6bGkgc3RFdnQ6 YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBpbWFnZS94 LW5pa29uLW5lZiB0byBpbWFnZS90aWZmIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIg c3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxRTZBODYyRkU3OTBFNTExOUY4MkMxMDlEQ0U1NzJC MCIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0yMlQxNTowNDowMSswODowMCIgc3RFdnQ6c29mdHdhcmVB Z2VudD0iQWRvYmUgUGhvdG9zaG9wIENhbWVyYSBSYXcgNy4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hh bmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9 InhtcC5paWQ6NjA1NTFFRTBFOTkwRTUxMUJFOTI4OEIwMDNBOEU0NDEiIHN0RXZ0OndoZW49IjIw MTUtMTEtMjJUMTU6MjM6MTIrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rv c2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0 aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvdGlmZiB0byBpbWFn ZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJz PSJjb252ZXJ0ZWQgZnJvbSBpbWFnZS90aWZmIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2 dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjYxNTUxRUUwRTk5MEU1 MTFCRTkyODhCMDAzQThFNDQxIiBzdEV2dDp3aGVuPSIyMDE1LTExLTIyVDE1OjIzOjEyKzA4OjAw IiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RF dnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3Rh bmNlSUQ9InhtcC5paWQ6NUI0NDVEODZBMjk2RTUxMUE4NDU4NTAzNTBFNzJFRkIiIHN0RXZ0Ondo ZW49IjIwMTUtMTEtMjlUMjI6MTE6MDcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2Jl IFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RF dnQ6YWN0aW9uPSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gaW1hZ2UvanBlZyB0 byBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9u PSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBpbWFnZS9qcGVnIHRv IGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249 InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjVDNDQ1RDg2QTI5NkU1MTFBODQ1ODUw MzUwRTcyRUZCIiBzdEV2dDp3aGVuPSIyMDE1LTExLTI5VDIyOjExOjA3KzA4OjAwIiBzdEV2dDpz b2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdl ZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9Inht cC5paWQ6RTlDQkIzNEFBNTk2RTUxMUE4NDU4NTAzNTBFNzJFRkIiIHN0RXZ0OndoZW49IjIwMTUt MTEtMjlUMjI6NTk6NDkrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hv cCBDUzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9u PSJjb252ZXJ0ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImZyb20gYXBwbGljYXRpb24vdm5kLmFkb2Jl LnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVk IiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUu cGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBz dEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkVBQ0JCMzRBQTU5NkU1MTFBODQ1ODUwMzUwRTcyRUZC IiBzdEV2dDp3aGVuPSIyMDE1LTExLTI5VDIyOjU5OjQ5KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFn ZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8 L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3Rh bmNlSUQ9InhtcC5paWQ6RTlDQkIzNEFBNTk2RTUxMUE4NDU4NTAzNTBFNzJFRkIiIHN0UmVmOmRv Y3VtZW50SUQ9InhtcC5kaWQ6MUU2QTg2MkZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjAiIHN0UmVm Om9yaWdpbmFsRG9jdW1lbnRJRD0iODhFM0FDNENFNURCQTBCRjM1MUNBQjlCMDA3RDhBNDAiLz4g PGNyczpUb25lQ3VydmU+IDxyZGY6U2VxPiA8cmRmOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4z MiwgMjI8L3JkZjpsaT4gPHJkZjpsaT42NCwgNTY8L3JkZjpsaT4gPHJkZjpsaT4xMjgsIDEyODwv cmRmOmxpPiA8cmRmOmxpPjE5MiwgMTk2PC9yZGY6bGk+IDxyZGY6bGk+MjU1LCAyNTU8L3JkZjps aT4gPC9yZGY6U2VxPiA8L2NyczpUb25lQ3VydmU+IDxjcnM6VG9uZUN1cnZlUmVkPiA8cmRmOlNl cT4gPHJkZjpsaT4wLCAwPC9yZGY6bGk+IDxyZGY6bGk+MjU1LCAyNTU8L3JkZjpsaT4gPC9yZGY6 U2VxPiA8L2NyczpUb25lQ3VydmVSZWQ+IDxjcnM6VG9uZUN1cnZlR3JlZW4+IDxyZGY6U2VxPiA8 cmRmOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUsIDI1NTwvcmRmOmxpPiA8L3JkZjpTZXE+ IDwvY3JzOlRvbmVDdXJ2ZUdyZWVuPiA8Y3JzOlRvbmVDdXJ2ZUJsdWU+IDxyZGY6U2VxPiA8cmRm OmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUsIDI1NTwvcmRmOmxpPiA8L3JkZjpTZXE+IDwv Y3JzOlRvbmVDdXJ2ZUJsdWU+IDxjcnM6VG9uZUN1cnZlUFYyMDEyPiA8cmRmOlNlcT4gPHJkZjps aT4wLCAwPC9yZGY6bGk+IDxyZGY6bGk+MjU1LCAyNTU8L3JkZjpsaT4gPC9yZGY6U2VxPiA8L2Ny czpUb25lQ3VydmVQVjIwMTI+IDxjcnM6VG9uZUN1cnZlUFYyMDEyUmVkPiA8cmRmOlNlcT4gPHJk ZjpsaT4wLCAwPC9yZGY6bGk+IDxyZGY6bGk+MjU1LCAyNTU8L3JkZjpsaT4gPC9yZGY6U2VxPiA8 L2NyczpUb25lQ3VydmVQVjIwMTJSZWQ+IDxjcnM6VG9uZUN1cnZlUFYyMDEyR3JlZW4+IDxyZGY6 U2VxPiA8cmRmOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUsIDI1NTwvcmRmOmxpPiA8L3Jk ZjpTZXE+IDwvY3JzOlRvbmVDdXJ2ZVBWMjAxMkdyZWVuPiA8Y3JzOlRvbmVDdXJ2ZVBWMjAxMkJs dWU+IDxyZGY6U2VxPiA8cmRmOmxpPjAsIDA8L3JkZjpsaT4gPHJkZjpsaT4yNTUsIDI1NTwvcmRm OmxpPiA8L3JkZjpTZXE+IDwvY3JzOlRvbmVDdXJ2ZVBWMjAxMkJsdWU+IDwvcmRmOkRlc2NyaXB0 aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9InciPz7/4gxYSUNDX1BST0ZJ TEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMg c1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAA ABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAAC VAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFz AAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0 ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNR AAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAA AGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3 LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAA AAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAA AAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAA AABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkA XgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDr APAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEB qQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKi AqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD 7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3 BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08H YQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmP CaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIM KgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8J DyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUS ZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYD FiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6U Hr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2Yj lCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijU KQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIu ty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTY NRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7 qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1 QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdK fUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8 UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVb RVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RA ZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbblu Em5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gR eG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC 9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/ jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ /JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKz OLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBw wOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbO ts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q 3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vs hu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH /Jj9Kf26/kv+3P9t////7gAOQWRvYmUAZEAAAAAB/9sAhAABAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAwMDAwMDAwMDAQEBAQEBAQEBAQECAgEC AgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwP/wAARCAMg AyADAREAAhEBAxEB/90ABABk/8QBogAAAAYCAwEAAAAAAAAAAAAABwgGBQQJAwoCAQALAQAABgMB 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 /Mp7X3EdtZrGdedJ7QyeTot6d37gpJa+hMmGkiM+y+sdpU0sGT7A3qlPVRSS0tKVosXDIr19TCzx JIw1worJJ8R4U8+nHhYadK/pngTwP59bRvx8/kjfBPolars3421e+/kj3P0kuYx2/GyW9sbjO7tg 5qopJ8ZlJG6Ry8e3cPicxR0LyilUSwViyzIKWsMrxn20bmRwqGERhgckmpA+dafb8urJH4Tt4hqB wp/L8vn04yZHbeH2zi5tjZatzOMzuazOI2tlqGOunwqbp27RTVmW6v3litx4qi3lsne2Jip2kzWA ykVJuqFNFdjZ8vTaVNlLVYFdBFMea18/z8s6W4Bq46v4bBgzMCOPnn0I44HmeI8wOnjKPjdybJ2P uE0R2TV5cV6VGx4quWvq9vbuoa7E0+M3bQZeF6RMma6DcqQR1sJpXyuHraaW0NRTyI2mU6o1IHiF qHGKU+Kma04+vS6EiJpKtqCLUUpkZqvyyOGR0VGure0txdzVe1ZqYY3FbeyldsanzFSlTHLurZO8 MLSUNYhzhbxVlHt/flBQVL0brJ9rBlC8TohchRLZBIVSP9RTpeuadpCt8x2n7MGnTKbgBOXoYwKi gHkQaH0qGA8qmuejUZndPd3c3wSrZen9qSYzsdOvm672uJ66kwm8drb6yOPodv8AbSbQxmJMjZLM bbweOqdK/ZRzwvkEXxuCZi5AkEF14MjARhyCfIgcD8iflg+Rx0UyNJKryKP1CCck0B9fWn8/l047 NpcpsDqrv35jbE212TvPt3t3afX2W3n8ct3dfnbtPhe7dpYDbGFym5J6kyJuep2huSmwE06VNRGl JFUVXpYtYe6OpmMMMtFkQaA2O5K0Wg4YwSa1xXgceiU6pdLDRp+Gv4gPJvPVwXgPI9F4+UvRGwf5 ifSO6905rf8Am8dt7P5jZXYfTm/auiqKnNfGjumj29Sdbb/6y7M2O8MlVD1NuSnnosjXPQSR1beK erhimmpFikvBNJD49vIul1WkijJDLUq6H8VUJPkDQgGtOn2jWRIXjJoa6fmPOvoVPaRx8+tOvv34 +7/6G7P371J2ftyPZ/Z3XOXq6Lde1hViuoMxQyS2xu8ev8tq+z3RtXNIwloamlcrUU0qyNpI5UyV FE4yAY9GFKgg+h+dOk4JrwND/q/1U6LwKWeSKeWiEky00EktXSkKtfTwQSLTzyNCbSyxQzMFcBTL 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 --gas1mX1Qbw=_aozdAkx6HFIG1JQwAFicKK Content-Type: image/jpeg; name="12-1.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="12-1.jpg" Content-ID: Content-Description: Photo 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 AxslRxwBWgADGyVHHAIAAAIAAAA4QklNBCUAAAAAABDHXRfldLVu9du+OZTA6XlcOEJJTQQ6AAAA AADXAAAAEAAAAAEAAAAAAAtwcmludE91dHB1dAAAAAUAAAAAUHN0U2Jvb2wBAAAAAEludGVlbnVt AAAAAEludGUAAAAASW1nIAAAAA9wcmludFNpeHRlZW5CaXRib29sAAAAAAtwcmludGVyTmFtZVRF WFQAAAABAAAAAAAPcHJpbnRQcm9vZlNldHVwT2JqYwAAAAVoIWg3i75/bgAAAAAACnByb29mU2V0 dXAAAAABAAAAAEJsdG5lbnVtAAAADGJ1aWx0aW5Qcm9vZgAAAAlwcm9vZkNNWUsAOEJJTQQ7AAAA AAItAAAAEAAAAAEAAAAAABJwcmludE91dHB1dE9wdGlvbnMAAAAXAAAAAENwdG5ib29sAAAAAABD bGJyYm9vbAAAAAAAUmdzTWJvb2wAAAAAAENybkNib29sAAAAAABDbnRDYm9vbAAAAAAATGJsc2Jv b2wAAAAAAE5ndHZib29sAAAAAABFbWxEYm9vbAAAAAAASW50cmJvb2wAAAAAAEJja2dPYmpjAAAA AQAAAAAAAFJHQkMAAAADAAAAAFJkICBkb3ViQG/gAAAAAAAAAAAAR3JuIGRvdWJAb+AAAAAAAAAA AABCbCAgZG91YkBv4AAAAAAAAAAAAEJyZFRVbnRGI1JsdAAAAAAAAAAAAAAAAEJsZCBVbnRGI1Js dAAAAAAAAAAAAAAAAFJzbHRVbnRGI1B4bEBSAAAAAAAAAAAACnZlY3RvckRhdGFib29sAQAAAABQ Z1BzZW51bQAAAABQZ1BzAAAAAFBnUEMAAAAATGVmdFVudEYjUmx0AAAAAAAAAAAAAAAAVG9wIFVu dEYjUmx0AAAAAAAAAAAAAAAAU2NsIFVudEYjUHJjQFkAAAAAAAAAAAAQY3JvcFdoZW5QcmludGlu Z2Jvb2wAAAAADmNyb3BSZWN0Qm90dG9tbG9uZwAAAAAAAAAMY3JvcFJlY3RMZWZ0bG9uZwAAAAAA AAANY3JvcFJlY3RSaWdodGxvbmcAAAAAAAAAC2Nyb3BSZWN0VG9wbG9uZwAAAAAAOEJJTQPtAAAA AAAQAEgAAAABAAIASAAAAAEAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAE AAAAeDhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEA AAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAy AAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA//////////// /////////////////wPoAAAAAP////////////////////////////8D6AAAAAD///////////// ////////////////A+gAAAAA/////////////////////////////wPoAAA4QklNBAAAAAAAAAIA ADhCSU0EAgAAAAAAAgAAOEJJTQQwAAAAAAABAQA4QklNBC0AAAAAAAYAAQAAAIo4QklNBAgAAAAA AB8AAAABAAACQAAAAkAAAAADAAAUQAEAABgAAAAASoAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoA AAAAAzcAAAAGAAAAAAAAAAAAAAMgAAADIAAAAAEAMgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAA AAAAAAAAAAADIAAAAyAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAA AAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcA AAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAyAAAAAAUmdodGxvbmcAAAMgAAAABnNs aWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAA B2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2Vu ZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAA AQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxv bmcAAAMgAAAAAFJnaHRsb25nAAADIAAAAAN1cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAA AAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxi b29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6 QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdk ZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAA CXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRs b25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAAADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhC SU0EFAAAAAAABAAAAIo4QklNBAwAAAAAG0AAAAABAAAAoAAAAKAAAAHgAAEsAAAAGyQAGAAB/9j/ 7QAMQWRvYmVfQ00AAf/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgT ExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4U FA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAKAA oAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEB AQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEy BhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80Yn lKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUB AAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMX ZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAM AwEAAhEDEQA/APKlJrNw8D+b4FISCtDGrb9mbWRPqe7bOh/qO/Mubt/tpKJpzoPdMrFtHvcA7cZ9 ruAYH0TP0Xt/OQCCDBEEdikkFZJOmQUuBKUGYTJ0kstIGsEcpidZCinSTdqlIp+yYmUkLJwEpTtO qShSjAUVJ0SmSSVJJJDVJC4CcASJ7pp7DlPtlw8hJSXAP//Q8tJn5q9U4ehWSIDgPgS3u6P+rZ+k WfySVbrbbTDmfpa5BdUZB/rD/wAmxJEtW1UG223sfLmy0zYYbxDA57P5p/7mR9BAysMsBIl1bBrM b654Fgb9Nn8tifD3Oyi+p2rm+3bEyfzdv0N/t91f+E/wauNcwu9sAtJ2gEtAI/0TnfzP/he72JLb ouKQWmOU0ouU0MyHhugnQRtj+x+agoMlrpJk4BSSpGxsa2+dpDGN+lY7QD/vzv7KlhY32nLrpedr CZscNIY33WH/ADVf3sLy2A1lMgN3Q1gH5k/nu3uRAtBNNQ4NYMerB11LfD+1uQrcK+pnqEB1f7zT P3t+m1WnuDmtLzJf9HaNQD7g3b/J/wC/qeLkuEstn2geqRzt7WCfb7f8KjQRZctJvK1Oo9LbVT69 Lw5wG6xjZjafo21/vf2FlhAikgrkSdExSJSQSVeakOPBQVvpvTMzqmUMXFbucRue9xhjGD6Vtz/z K2/+o6/0iSrpHRj232tqordda8wytjS5xP8AJY33OUbGvZY5jmljmS17XCCCD7g4L0xmDgfUboN3 UKgLupWAU1XvHudc8bmVsr/wdFH9Isr/AD/T/Tf4NlXmThY5+6wlzny4uJkknlziUSKSJE3Q0f/R 8r7BWqrmhjGWgtA+hYOPn/5iqxPHxRqsh1bS0jcyI2n4ykgtmhzfUe9xA3e0GJa4Dl1jG/S3P/wr P5tGD3TtfoX6MLyHAj92u76Nn/F2qpSGlrPTd7uXMMxP7zY9zP7KsB3qAtIgkatOs/2R7LP+MrSW lrZtZFu88O0g6ajTuq5qPb7lbymltEBxdWDo067Z/wBG/wD6piqB5ENJ9vf4IFlgQRRYwUtVYLmn jUeKg6omDBEiRPceKVrzjrY23ulsczEy8zXc0NYwxOste5v9p3osSfU6s+hOoAL/ADeQPp/1dyPj tZT0/GptkNte/IubHLW7fT8P0fsahtdWXWOtEnl4aCTLv5TfpfSYxPGzEd2s55Y8tALj9CoSZE+3 Rrf3l1v1e+oHUsmz1+qv/ZuO2GWB8faHuf8ApK/0Fn9H/wCMyP0n/ALa/wAX3SKOmUDq3V8GrHFx H2PLy3BtpIPss9O8tpxMf8yt/wDSMl/p/wCBRPrh9afrDi0PoxcX9n499sV51I9Z1jLD6jHMsDdl N1rXb7W7fUf/AID/AEiSHkOodPyejZFePk/oyyw2YeUAPTuYwy0V2f4O6jf7W+r+h9TZ/N2MXO52 P6F7gz+aeZrPOh7f2V2v+Mx/p3dNqLt7Geq/iA4bq2/me33Maub6s1goZY1sy7a0j6Oo3/521I9f BUeni44akVMbydArnTOj5PUsxmLR9Nxmx5ktrrB991pH5jJ/tv8A0df6RMtl4TVjbqWXQehZfW8z 0Kf0dLIORkES1jTx4b7bP8FV+f8AyKvVtr9Y6N0TE6ZRVi4dPpus27SYL5H0snJf+fZtd6n/AAFf 81XV+iYpdB6Zg9L6eyjEb7W8Md9Kx/0X33c/zjm/+iP5qpZH16+sX7NxrOkYz46nmt/X7d0mml3u GM0tJ/Wcn6dzvzKv+tp+kRZY4xM5cIeU+unXR1bqYxsR+/p/T91WO4cWPJ/WMv8Aleu9vt/4Jc44 AOb+cdQYUjY36Dfa3/X/ADUwA3t7umZ8oUdkmy2REACI111L/9Lys8JAnhIg/BIRKSl5+Xmj15JA 22De0/f8Qq4BJgcpyC2e48UlOg1zbAdrvUDhDm/nx/3/APtqi+ose5v0g088afP6KjKJoQA8ag6H +CShoxDWjUuj4a/+RarVE3bKY2gAitx1Jd+7/VVbtp+A/wC/FXOlteepY4hxG6STJ0b+kf8A5rGp Ks3Y3DqZrawHNJ9tFYpkGQGtjeCCfpb/AN3/ANV9N/i+HSc5g6eKGty6XWZGTk6G3aCz0Hhzvb9n cx32e2rZZ6Vnp/orftS5HrYdj0BhEG52hn80a7f6v9b3ro/8VJnqmaBtFn2Zoa7/AAkerX6vpifo /Q9X2/6JO6oOr3HX+r9FxMllfVKg8ybcaghzhuaPb61DN3qV2evc3fb+gpyPR/4KxS6fZh2dPovw Nz+ntpr9AscRFVQ9Cuhz7P023cz0/d+lXC/WR7HfWbqVjnywigMLjPsdTXcHM/k7rVt/VjNbi/VR t+SSMbAsy3PaOXVVObayutzv+FyX1Vf8IitLy3+M7MGR9YmUNhv2XGrrfW0ANa95dftAH7tVlLFi PaTgVus4a0WMdJPtJFL2lv8A237lW6rm5Ofm3Z+Sd12W91ryOJJ+h/1r6Cu21F/SsfY3c+xpaxgE kklughNOtskCYkEbtSnHyMu9mJiV+tdcdrGtI55J59jWN977H+ypn6RemdA6JT0nDNUBwkOy73Ag 22AfQrLtrm0Vz+j/AM/+fyFl/VrorsbGOU8ta+1gbkXCJAmfQqf/AOpP09v6T+jVVLpcrqrehdNP VuqCafoYeJwXvAJrbLm7v9bcm/8A0SUYgaqnllPf8Gt9Z/rLi/VnCFjC23rV7ZxaCB+gDh/Ssir6 LHMY5v2fHXkj7773vuue6y25xdY9zpc5zvdY8ud9N7nImfl39Rssz8lxtybXl91h1kuP+u1CJNv0 I2jX3eP7sfyU2Rtlxw4djZIBFfpX/wB6ya0fRrBngtOkH+UmYybC2PzSW6xyoitwqFrXcfm+SQJJ LmExsIOvGhdA+l+4m99WW/luNdaHWL//0/LHRAA4T1zOgn4qJMlSbH+5JTEGJTl086JMjvqE7oLY BJSUxI4RBEcSD4D+9RaNz2NnnTVTxqhY/wB7gysavcewSU2sGjT7Xe1vpMn02vIh72/yf9HX/hPz P8GlXdkOym37g8B25xaeFZv/AE1DBtqAqaGV7Hnft/Nr2u2ezc7d9H1FU+wPefY5rY/eMFOpTd6l azItxnBwdFdgaONeWM/6Sh0a/JwczHzcZ3pW49rS210gMdO17Loj1KbK9zLq/wDC1ID6MgVelktM B25lrC1/k525rvcrvTg/ZZTefVYfc2wGSQdHfS+lt/lJbqGj6fg5PTeqNyep4lL2QRVcz0nCxjSR 6T7We+i6t9D/ALVV+ks9Ol/o/wCCXPfXT6wMOI7pPTWj7A5ldeVeWOkuFn2puMLLAz6Ta7MjJs2b 8iz+2rX1I+s/ROh4OZh9TsfRbYfUqsLf0djGN2sorfP6PI+n7L/S/wCMWX9d/rtg/WKrEw8Ou5mN TNthv2sc+wjZX7Gut3ejXu/r+olr10XSEAZVctuE3VfvacPq/wCY8Ldq2trdS6XE9pd+b/ZXdfVX odzqmZGUAKqmBjGuLIhxD3PvY5zb6qbm/wAxbX/OfQWJ9Xvq9ldc6mG+mW41XuvO4A+mD9FxcTt9 T+b9v859D/SWV+oWfYsSh/U+oltOFhVkHeILmz6e1zdX2Vb/ANE3b/Ssj2f8WgsLSzsnA6F0x3V8 9sNbriYtmjrHn6D7WiPVfa4exn5lH6b/AI3y76xfWTqX1izW5fUH/Qbsx6WaV1t8GN/ff9K2z/0X 6daP9bfrBl/WHPbmWE14g3MxMcmfTaD79zfo+rd7H2f9boZ+hpqWGWmAIQJUAyrc0b2O/OBj+tCN j1tFQcdA6Zn46FNj44cd9gOn0WjQk+On5iOK6AdWgnWZh3/kv7SaY2ywzcFekSoEC/FG91W0saRP bbrHwhRNLy14rY4N0cQ72xtH+d71br9rZaBqRLtYH9loQslz6ang+1ztIOh1+l/LSEQETzzmekel RD//1PLI807eD200UZTjj5JKUGmOEnCBon3GJ7J2Ne9wYxpc5xhoHcpKS4OPdkZdddQl3JIE7W93 n+qtCpwxayK3PZUR7tsMD4lu71LT7v8AitjFGqtuPWKoA3a2vL3Eu/lVMx9z/Sq96euu4gNoxnvJ MNO91Y4kjY1+5OAUzss6drtrtc2BtdBGvLfp7fzlV9NokvAraSS31DAce/0Q52/87/g1YtqdTra6 qgl0FrHepbxrLnOsd7Z/NQRj3u9QOlrnc2PEAtb+c9r935p/4NJCF1OPUAXudY08trEDn993/VKY saxpdRV6TJIa9zi4T+77drLP8xSc4VAhv6UgAEnStvERX7d/9tGqqfbFl8O2n2HvHy2pAWp676sY GH0j6vH65dZeM68vNfSOnuMsF4Lq2WZDf9M19dljWf8AaOhj7/6R6foc50fo3U/rD1WvHxhNkusy r9oaxoLt73u2DYxnub7GN/74xWMHp2Rm07n3irDpc51jnOJbWS1pstFJittllNTN/wDUr/4Bdj9V SfUx+ndJpbRhueXXZNr5ue1vsFjqGta/1LLHfo97/wBH/wBWpEDS9VCy7uJ0np/SemFrC1mFjj1M m14DCSGzvbdP6N+3+X6dWL/pP8N5h9cfrZb9YcsV1HZgUGamatFjgNgvcz+RX+ixa3/zVP8Aw196 2v8AGL9YndQ6jZ0Dp9h/Z+IQy/aYFlrdXtfH0qqLf+3Mj/iaVxzcMNrG2HPnbY53Y7vpN/slEqCP b6mPZXy9oFjR/U9pH/bb0Gpm4Bz52+Akkq/WKmPa0tJLd24gQBqPb/wjdqpW2CuxzNmgMjX80+5v LfamlSdplpB0HaNIUmklpDXEMb9IjTX4bmqoL2QRtMnzn/qmojLKiRy0DV0hro/qoIpNY4MJkkBv iBP722dxcqN1psMDRo+i3wHyT22b3e0Q3kCP+k6EOIBSSA//1fKipDiE0SnEpKV+aVdxmfZq/Ve1 vq2N9gf7oa7Vr/T/AOE/6hV8Wn1siqgmBZY1p+BI1Wlm41/6XIMvY2A1zfotY0lvvRClY1PUMlsY tTWMDv0lljWhu4AQ17nt2+1v0WIttXpCOoZocSZNVLjt4gMe2prfzVnXXXPh1hJjs6TEjQliH7i1 0gw2NBpzwjanRGRj47CzFpDbIkvdG1vZ3tG63dtf+dfYguymFu65zyRpH53HtIQToxxeIeRDWnQ/ yIDVr/Vzo1/ULN49Oyxod6Qvk1Ma32m6xg+lvf8AoK9/6Pf/ADiBNKpzaJvvgAMrP0mt5IGn6X/v q1cfHfkP2s9rWwHujRoOjQP5f/na1PrFRcOrMwK6mV0Vb6cW/ZsZaKzN93qtaftHp2/ovb9D/g/o KfSMDMzLm9P6YGfa3EOfbO8Mg7Tqz27f+5OT/wBYx0TLhj4lFWWVTXZTD0/pzm04eD+kyrY3y73B rrKtp+0eu7+j1Wep9r/nv9B6d7rfVaegYwo6eDT1e+smphInDx3jZ9qv9u6rqOYz3V42/wDVfW/0 X2etWMu3C+rfRacp7zn5t4a7p1Fr3ONjtgFub1J52+ti4r/6LRt2f4L+eyctcFbfbk5GRdkWG628 ufZa/l7nOcXWGP6rU2EbNlJNCgsz0msa1hDSO0zP9YpNuacr0oEOgbuNRp/1TmoDmwZEShf9qGWT tIIDg7QDX6UqQnRaHQ2mz3N1eyWDgT7v9foql1BpaWWRLDI2mfHe3c3+3tV11g2vcwAEueW1gD+t HtP5u/6SHm178N41OyHt/sna7j4vTTsly3kuaNABPAACaIAI0JM/lTkEtAGsHlO3Xb8/yFMSxc3W FGIBU3HXzhRcIbCKn//W8rieFJvMH4FM0wUhEpKdDpFe7O3tBdsaS1g5LiPT0/lN3OsWvWWZFuy0 FzPTgga7iAGO37SxrXez9xVenVVMwrWXbmG1oO4cl0OdDX67XMbt/t71N9Rfkl1D9jnjadocCIDX FkfSb6fv9R9fsThsppX4t1Nlh9Mmpz/0buYDvcwz7v8ABqvsZW4sM66nyH7n8ty3mkXUuDgfYSGx G3UfTfZ+f9Df/r6aybMV7mOtaPSrHO7uSHO5Ht2sZVu/89pEKQCsP+jJaD74jn91v0fpuK6rozjj 9NufVDLm7W2DcWtI3+ttc9kvY33b/wBDVZdb6PprU6B/i9x8rplOX1X1WuvAtpxWO2bWO91dmRG7 9Nc39L6bP5r9Gta/6h4bMV37Pudj5pILPVc61lm33Nrs9R3s93+FqUZnE3Gj59GQYpVxaeXVxLum s67ddlV0bXillBoaQ0VvAazHda1hc6t77m1eqy3K9T+v/NrRbndB+q1DMV9X2jMDrRW9jntssoBG /a+oVt9G6z9EzJv/AJy6rKu/R3UemrPSMgdAxbsezGIyxuORLm82Aua9rx+idU93qehf9Bn+H/TV +hZRuw6erYWbmOi226/Hqyuov21V1U49bW7/AF+oFlTPUf8ApP1P17/9N9m9T06wCCQZdNgtIIsB 5Lqedm57/wBoZwh+USG7G7am11D24uI382jFbsr2/wDoyxZdLzsAiIY1q2PrL1XDzsiijAEdOwKm 42OQNvqEn1cnK2lrH/p3t/P/AEnpfTWOHGXCNAGj5wpx06MaiWyJ18kLIsJY5oA2kfNSdCE+SCOA gVBt02l3TrdphzWgOaPzvzWn+z7VfBa5jATNbxsJ59pHj+63f7FR6fjXO6dlZIDTSx7KHNPO94su Yf6uzGsVjHeLaHVyPozJBGm3a1v9lAFcQ5Arc0lrhqzc0/EaJACATzCPlNczId7dXgO+JIh//Ta9 BrjUAkHsE1SM86apjPwUiQCYOkqBkkfFJT//1/K/gjYtPrXtYZLBLn/1Wje//otQY7+HK0ek1gTc 6ILgzXnaPe/T+v6KQU7VbS3CYWkWb5dMkAkz6u13s/l71WDLX3vbA9UEvbOg2Gf0dLa3fRsn9z1P 0nporWDHmobmuPLJLgTBLXulvt2qDbGOBDXAv2tfvYwiGujdqyGttb+Z7lIhfGrDqnVuAElzd22Y M7fUbr/N/wDf0szIppx6rLKg51rmuNJ4FVR9RzN8fTvY3Y9Tqtqx8P13jaQ32MOu52h2bvd/WZ/6 rVPGwMzqeQ2/IeKMa5/pi23Rmp27K2zutt02elV/burQJoJD7L0zrfTusYrc7Cta+q3VzSQH1k81 XMn9HZX/AOq/0ahl5lPuue9rceoHfYTt2Fnu9Rx/Naz85/5n859BcXccH6q9Le6jbRcGbXAOD7bb HTbjOxns21Or27H5WTssr9L9HTs/R0rl+r/XTrHVcX7La5tUjbfZTuYbGx/NPaHbPT/kqvwE7M/u ADXdufWb60W9S696mDc5jMSt1FeVQ41m0bt7rPZ6fsd+7/1xZGXkZGZBvstyrQDtda91m2eXbrXO aq1OLa125wiPoj4ox3t0I+lp96sRjQprykSbYVs9rWuOu0DyG47f/PacH6bwNHOJE+CQc0NgGSSS omwhFDBxPjEocHdpyilxPIgnuojYOJJ8UCl6X6t4bcz6oddbX/SG2MvZ4zQ197P85n2hqxumPNgO 4md0E+UTK3/8W+UxubnYbwSy9jbgPEVudVa3/MyFk5GD+zs62nh1FxrfodsVuO3w+lXte1Mh80h9 WSY9ET/gtHqbGtdU5hLgDBeeCCfUbtVIt9o8f9i2M+tr8V25p3BskmJlnv5b+d6SxfVaNIJb+KMt 1gYmBryUp2kHw/Kig47hoHf3f9JScynbIB43eBhNtIBN+D//0PLgW7YIkjUzoFs4NbWPpYTs9MR4 +5385Gnu5WQ6C1oB1mT21C1NzrKTsdGst83D8yf3XORimXRu12WOs9Yh0jUN0BOu127d7drfah3P ZAr27WE7S0mZES1zvzvc72bEGm9hLKnueH2jcGTOsfnz+8h5+Qzc1mg9pce4J1btJ/7+ndFqPqN4 NVVTNCwl7zqCD+bOjWbvatL6vdYw6cRmPk3WY11V3q0WNBcyPz/oTZTY/wDmN9df6X1f0ln6usCp hysja92xplz3nXa0ak6lDvLTYdghg0aCZ0/rJkhe64Gne+t/Uq85+G2t5t2VE2OdA97nH1PYz21/ R+h7/wDjFiY7Wm1of9GZn4aqNLQ5xB4gz8/arFNQrfumYBA07lGIqvBBNklviTrIM6gqOQXCsxED Uu8D2QWFzHDYfbyWniEO4PeSbHDb2aPyqQnRalZmM9EYjQfRadzLCOSBs9xTbWD4qLTpHlEdoCdp gw2I/dd2/qlJSzjAUCyGFztCTACI1ri5xJmIEdh30QrXyIQKnV+pNra/rFWHWenuba2uRILnN+g7 Vv5vu/rrQ+uWPkUdYZm0j1Bl1/pAYG91UVna39/0vRfX7fU/rrmcB7mdRx7GVuucy5jm1NkFxkOa 1sf1V3/1srGX9XXZzKXU3Y9tZax/dpaardzhLNztzPofuKPS/wBq/Xh367PL12svwxE7QS6Xay0j a76P9rcsB1MPLCYLSQZ8jCvYmWWWubGtgHptHifaW+7+V7kDKc5uQ57dGv17f2/+m1GSAwpx3HU+ 1nM9z8EQvAlwAAbAAjxnhCqdqTMAanXRFDhqZG7v8CP/ACTlGbtsY+HhFad7f//ZOEJJTQQhAAAA AABVAAAAAQEAAAAPAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwAAAAEwBBAGQAbwBiAGUA IABQAGgAbwB0AG8AcwBoAG8AcAAgAEMAUwA2AAAAAQA4QklNBAEAAAAAEfoABgAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArgAAAAEAAAAAAAAAAAAA AAAAAAAAAAAAAQCHrhQA6UeuAIeuFADpR64Ah64UAOlHrgABAIYUegDpR64AhhR6AOlHrgCGFHoA 6UeuAAEAhCj1AOnrhQCEKPUA6euFAIQo9QDp64UAAQCCj1wA6j1wAIKPXADqPXAAgo9cAOo9cAAB AICj1wDqPXAAgKPXAOo9cACAo9cA6j1wAAEAgAAAAOo9cACAAAAA6j1wAIAAAADqPXAAAgB27u4A 0RERAGI9cAC/Cj0AX1woALxERAABAF5mZgC7hR4AXmZmALuFHgBeZmYAu4UeAAEAXmZmALo9cABe ZmYAuj1wAF5mZgC6PXAAAQBeuFEAuUeuAF64UQC5R64AXrhRALlHrgABAF+uFAC4UesAX64UALhR 6wBfrhQAuFHrAAIAbmZmAK5LFwB0euEAo4UeAHVVVQCjoG0AAQB1wo8Ao9cKAHXCjwCj1woAdcKP AKPXCgABAHa4UQCkKPUAdrhRAKQo9QB2uFEApCj1AAEAhu7uALGZmQCK4UcAtCj1AI7ToAC2uFEA AgCXksUAvJYvAKTMzAC+ZmYAqWL8AL7u7gABAKo9cAC/rhQAqj1wAL+uFACqPXAAv64UAAEAqo9c AMFHrgCqj1wAwUeuAKqPXADBR64AAQCq/JYAwiIiAKrhRwDCj1wAqsX5AML8lgABAKrhRwDEzMwA quFHAMTMzACq4UcAxMzMAAEAquFHAMYUegCq4UcAxhR6AKrhRwDGFHoAAQCpmZkAx1woAKmZmQDH XCgAqZmZAMdcKAABAKgAAADHXCgAqAAAAMdcKACoAAAAx1woAAEApp0DAMdcKACmFHoAx1woAKWL 8gDHXCgAAQCkeuEAx1woAKPXCgDHXCgAozMzAMdcKAABAKIG0wDHXCgAoZmZAMdcKAChLF8Ax1wo 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 KPUAw4UeAHQo9QDDhR4AdCj1AMOFHgABAHMzMwDB64UAczMzAMHrhQBzMzMAweuFAAEAco9cAMCj 1wByj1wAwKPXAHKPXADAo9cAAQBxR64Av64UAHFHrgC/rhQAcUeuAL+uFAABAHAAAAC/Cj0AcAAA AL8KPQBwAAAAvwo9AAEAbwo9AL5mZgBvCj0AvmZmAG8KPQC+ZmYAAQBtcKMAvR64AG1wowC9HrgA bXCjAL0euAABAGwo9QC71woAbCj1ALvXCgBsKPUAu9cKAAEAao9cALqPXABqj1wAuo9cAGqPXAC6 j1wAAQBp64UAuo9cAGnrhQC6j1wAaeuFALqPXAABAGlHrgC6j1wAaUeuALqPXABpR64Auo9cAAEA brhRAMBR6wBuuFEAwFHrAG64UQDAUesAAQBx64UAwuFHAHHrhQDC4UcAceuFAMLhRwABAHPXCgDE euEAc9cKAMR64QBz1woAxHrhAAEAdXCjAMYUegB1cKMAxhR6AHVwowDGFHoAAQB3XCgAxwo9AHdc KADHCj0Ad1woAMcKPQABAHlHrgDIo9cAeUeuAMij1wB5R64AyKPXAAEAezMzAMo9cAB7MzMAyj1w AHszMwDKPXAAAQB8euEAy4UeAHx64QDLhR4AfHrhAMuFHgABAH1wowDMzMwAfXCjAMzMzAB9cKMA zMzMAAEAfcKPAM1wowB9wo8AzXCjAH3CjwDNcKMAAQB9wo8AzmZmAH3CjwDOZmYAfcKPAM5mZgAB AHzMzADOZmYAfMzMAM5mZgB8zMwAzmZmAAEAfF+SAM0DaQB71woAzMzMAHtOgQDMli8AAQB6PXAA zCj1AHo9cADMKPUAej1wAMwo9QABAHlHrgDL1woAeUeuAMvXCgB5R64Ay9cKAAEAeAAAAMszMwB4 AAAAyzMzAHgAAADLMzMAAQB2uFEAyo9cAHa4UQDKj1wAdrhRAMqPXAABAHZmZgDLMzMAdmZmAMsz MwB2ZmYAyzMzAAEAd1woAMx64QB3XCgAzHrhAHdcKADMeuEAAQB4UesAzXCjAHhR6wDNcKMAeFHr AM1wowABAHlHrgDOFHoAeUeuAM4UegB5R64AzhR6AAEAeo9cAM9cKAB6j1wAz1woAHqPXADPXCgA AQB7MzMA0FHrAHszMwDQUesAezMzANBR6wABAHx64QDQ9cIAfHrhAND1wgB86BsA0UeuAAEAfXCj ANHrhQB9cKMA0euFAH1wowDR64UAAQB8zMwA0j1wAHzMzADSPXAAfMzMANI9cAABAH3CjwDTMzMA fcKPANMzMwB9wo8A0zMzAAEAfrhRANPXCgB+uFEA09cKAH64UQDT1woAAQCAAAAA1R64AIAAAADV HrgAgAAAANUeuAABAIDadADV+SwAgUeuANZmZgCBtOgA1tOgAAEAgo9cANgAAACCj1wA2AAAAIKP XADYAAAAAQCDMzMA2PXCAIMzMwDY9cIAgzMzANj1wgABAIUeuADa4UcAhR64ANrhRwCFHrgA2uFH AAEAhXCjANvXCgCFcKMA29cKAIVwowDb1woAAQCD1woA29cKAIPXCgDb1woAg9cKANvXCgABAIKP XADa4UcAgo9cANrhRwCCj1wA2uFHAAEAgPXCANo9cACA9cIA2j1wAID1wgDaPXAAAQB/XCgA2euF AH9cKADZ64UAf1woANnrhQABAH4UegDZR64AfhR6ANlHrgB+FHoA2UeuAAEAfMzMANij1wB8zMwA 2KPXAHzMzADYo9cAAQB7MzMA164UAHszMwDXrhQAezMzANeuFAABAHnrhQDXrhQAeeuFANeuFAB5 64UA164UAAEAeo9cANj1wgB6j1wA2PXCAHqPXADY9cIAAQB7hR4A2ZmZAHuFHgDZmZkAe4UeANmZ mQABAHx64QDaPXAAfHrhANo9cAB8euEA2j1wAAEAfcKPANrhRwB9wo8A2uFHAH3CjwDa4UcAAQB/ rhQA24UeAH+uFADbhR4Af64UANuFHgABAICj1wDcKPUAgKPXANwo9QCAo9cA3Cj1AAEAgeuFAN0e uACB64UA3R64AIHrhQDdHrgAAQCDMzMA3R64AIMzMwDdHrgAgzMzAN0euAABAIUeuADdwo8AhR64 AN3CjwCFHrgA3cKPAAEAhmZmAN64UQCGZmYA3rhRAIZmZgDeuFEAAQCFwo8A364UAIXCjwDfrhQA hcKPAN+uFAABAITMzADfrhQAhMzMAN+uFACEzMwA364UAAEAg4UeAN+uFACDhR4A364UAIOFHgDf rhQAAQCDMzMA4FHrAIMzMwDgUesAgzMzAOBR6wABAIQo9QDhR64AhCj1AOFHrgCEKPUA4UeuAAEA hMzMAOHrhQCEzMwA4euFAITMzADh64UAAQCEzMwA4uFHAITMzADi4UcAhMzMAOLhRwABAIPXCgDj hR4Ag9cKAOOFHgCD1woA44UeAAEAgo9cAOPXCgCCj1wA49cKAIKPXADj1woAAQCCj1wA5MzMAIKP XADkzMwAgo9cAOTMzAABAIKPXADmFHoAgo9cAOYUegCCj1wA5hR6AAEAgzMzAOa4UQCDMzMA5rhR AIMzMwDmuFEAAQCEzMwA5rhRAITMzADmuFEAhMzMAOa4UQABAIcKPQDoAAAAhwo9AOgAAACHCj0A 6AAAAAEAh1woAOhR6wCHXCgA6FHrAIdcKADoUes4QklNBAYAAAAAAAcACAAAAAEBAP/hW8dodHRw Oi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1w Q2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8i IHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0x NDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8x OTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIg eG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDov L3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUu Y29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4w L3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94 YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRv YmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBD UzYgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxNS0xMS0xN1QyMjozMjoyMiswODowMCIg eG1wOk1ldGFkYXRhRGF0ZT0iMjAxNS0xMS0yMlQxNzoxMTozNyswODowMCIgeG1wOk1vZGlmeURh dGU9IjIwMTUtMTEtMjJUMTc6MTE6MzcrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgeG1w TU06SW5zdGFuY2VJRD0ieG1wLmlpZDpFMUY2NDk1M0Y3OTBFNTExQUFBOUM2MzM5MjU3RDNDRCIg eG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBQ0U0REUwMzM4OERFNTExOTI5QzkxREJGREI4NjE5 RCIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOkFDRTRERTAzMzg4REU1MTE5MjlD OTFEQkZEQjg2MTlEIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmls ZT0ic1JHQiBJRUM2MTk2Ni0yLjEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkg c3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkFDRTRERTAz Mzg4REU1MTE5MjlDOTFEQkZEQjg2MTlEIiBzdEV2dDp3aGVuPSIyMDE1LTExLTE3VDIyOjMyOjIy KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dz KSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5p aWQ6QURFNERFMDMzODhERTUxMTkyOUM5MURCRkRCODYxOUQiIHN0RXZ0OndoZW49IjIwMTUtMTEt MTdUMjI6NDI6MzErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBD UzYgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJz YXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMEY2NDk1M0Y3OTBFNTExQUFBOUM2MzM5 MjU3RDNDRCIgc3RFdnQ6d2hlbj0iMjAxNS0xMS0yMlQxNzoxMTozNyswODowMCIgc3RFdnQ6c29m dHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9 Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNvbnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0i ZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJk ZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBm cm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRm OmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RTFGNjQ5 NTNGNzkwRTUxMUFBQTlDNjMzOTI1N0QzQ0QiIHN0RXZ0OndoZW49IjIwMTUtMTEtMjJUMTc6MTE6 MzcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRv d3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1w TU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFMEY2NDk1M0Y3OTBFNTEx QUFBOUM2MzM5MjU3RDNDRCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQ0U0REUwMzM4OERF NTExOTI5QzkxREJGREI4NjE5RCIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOkFD RTRERTAzMzg4REU1MTE5MjlDOTFEQkZEQjg2MTlEIi8+IDxwaG90b3Nob3A6RG9jdW1lbnRBbmNl c3RvcnM+IDxyZGY6QmFnPiA8cmRmOmxpPjExMDM1RkQzNDMxNDY3QkI4REJFQ0MzQjkyQTIwMTQw PC9yZGY6bGk+IDxyZGY6bGk+NTgyN0RGMTY4QTVGRTcyMzBDOEFFQzdCOEFEMkJBQTI8L3JkZjps aT4gPHJkZjpsaT43RkIyNzA2RDVEMjMxOEQ2NEM1ODFDRjdENkQxN0Y5ODwvcmRmOmxpPiA8cmRm OmxpPjkxMUJFNzQyMjcwMDkxRjFFMjZDRjI2N0YwMDVEOTBGPC9yZGY6bGk+IDxyZGY6bGk+OTVD QjJCNjY0OTNDQzMyODk3Q0Y0NDREMUM0QkM4MEU8L3JkZjpsaT4gPHJkZjpsaT5BRTA5QjZBRkQz MDYzMEIwMDk2ODhDMUVDRUI0NzgzRjwvcmRmOmxpPiA8cmRmOmxpPkFFQUQ4Nzg1MTk2MDgxRkMy RkYzMEE3QUZFMUVEMzkzPC9yZGY6bGk+IDxyZGY6bGk+QjU5QTk3RDA2MThCMjJGNjJDOEU1RUFE MEUyMUI4Rjc8L3JkZjpsaT4gPHJkZjpsaT5CQ0FFNEZCMkU5NUJFMzUzNzZGQjhCRTlCMDlFRTQw MzwvcmRmOmxpPiA8cmRmOmxpPkRDNzA3NDVGNzRCOEU2MTAyOTI0QkE1Mzc1MDAzNjgxPC9yZGY6 bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjA1N2JlM2I5LWFhMGEtMTFkZS05MTkw LWNlZDQ5MzdkYzNiOTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDowZjQ4 MGE5My04YTkyLTExZDktYmU4OC1hZGY1NTBlY2NmNDg8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpk b2NpZDpwaG90b3Nob3A6MGY1NTM2YWUtMjkzOC0xMWRlLWE1OTktYWI5YWIzM2E5ZGQ0PC9yZGY6 bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjE1OTI5MWFmLWUyODYtMTFkOC05ZGVm LWM5ZGFjZjE1YjQ3ZjwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDoyOTY3 YmQ3NC02OTM0LTExZGYtODE0ZC04ZWM3M2M4OTA4Y2Q8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpk b2NpZDpwaG90b3Nob3A6NTBlNjQzODgtZjJhOC0xMWQ4LWJhMzctYjUwNTcyM2IyN2E1PC9yZGY6 bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjYxMmFhMDAyLTE0MjEtMTFkOS04MDcw LWNjZmE3MWIzZDI3NTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDo2ZDZm Y2FjZC04OTFlLTExZGEtYjUxNi04NTY2MGFjMTFmMjk8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpk b2NpZDpwaG90b3Nob3A6ODdiYjQ5NmItN2Q4ZS0xMWRjLWJmZTktYjA1N2I3MjE3YjI5PC9yZGY6 bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjhkZjI0MWQxLTUyMTAtMTFkZC05NGRk LWZhMTNhMzQ2ZDQ2YjwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpiMTcz MWQyNS0xMmFhLTExZDgtOTBlNC1iN2MxZjI3ZDkxZDY8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpk b2NpZDpwaG90b3Nob3A6YmEyNjBkNmMtYWI5Yi0xMWRhLWJkNTMtYmQzZWIwNGEyYzRkPC9yZGY6 bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmM0ZjliNzFhLThjNjEtMTFkYS04YTc0 LWVlYTlkYTlkYzlhMDwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjNjVk ZTQwZS1iZWViLTExZGMtOTVkMi04MTU2M2QwNTkzZTM8L3JkZjpsaT4gPHJkZjpsaT5hZG9iZTpk b2NpZDpwaG90b3Nob3A6Y2U2ZGMwM2ItZTk3Yi0xMWRkLTg0MmUtZjk5NWVhNTJkNjVlPC9yZGY6 bGk+IDxyZGY6bGk+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmY1MzYxY2Y3LWQ1MTctMTFlMS04YThk LWU1NDFlNGIxYTY3NTwvcmRmOmxpPiA8cmRmOmxpPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDpmYzY3 NmY2Yy1iYjliLTExZGItODQxYy05ZWZlNDk4YTNlNzQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjAy QkVDOEI1MUQ3Q0RDMTE5NzU2OTEzQURGMzcxNzFDPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxMjVF QUM0ODlGRjRERTExOEQ3OEEyM0Y5ODZFNzQ5RjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MTJDNDg4 Q0IxM0UyREUxMThCMTVDMTkwOTMwQUQ2Qjc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjE4OTE0NzlF MjNCRkRCMTE4OEQ0QjE0QTk0OUQ0RDZBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxQzY4MTgyQTQ4 NzVERTExQTk5MkZEMkRDNkU5ODMwRDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MUNFODhDMUJEMTlE RTExMUEyMTBERUVGQjgyRDc2OTY8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjFENkJBMTc3Q0M3RURF MTFCQjdCQzk1QkQ3ODVGNEM5PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoxRTM2QUIwNEE2NjNFMDEx OTVEQzhERjlFNEVGRkY5NTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MUY1QUYzQjY3MjI5REYxMTlG RkFCMjZFMjQwQzcxQkI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjFGODYzNTVDNzVCRURFMTFBODE0 QjRGRDFENTc5NUIxPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoyMDhDNDQ1MDdFMTNERjExODgyRkQz NTUwNDA4NTM4MzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MkMyN0ZEQTZGQ0VEREUxMTkyMTU5NTk0 NEJGMEE5ODU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjJEQkREMUJGQ0UxRERGMTE5QUJFQzE0OTMz MUQzMTREPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDoyREJGNzQ1MDNDMDFERTExOUVEQkExNDc3OTA0 MEUxQTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6MkU3M0Q4RkExQUQ5REYxMTlBM0ZDRTcwQkJBNzI2 OUY8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjMyQUQ5MDFDMTU0MERGMTFCQTIyRUI4MzkwRTQyN0ZB PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDozMzEzNzgxNUZEOEZERTExQkYxQTlGODlGQzc4MERFODwv cmRmOmxpPiA8cmRmOmxpPnV1aWQ6MzgyMjI3NDE5NjUwREUxMTgyOEVCNzlCN0ZGODdCNDY8L3Jk ZjpsaT4gPHJkZjpsaT51dWlkOjNBNDY3NzgxNUUyOURGMTFBMEIwODdERjg5N0Y1QzU2PC9yZGY6 bGk+IDxyZGY6bGk+dXVpZDozQjdGNThGMTlENkNFMTExQTM1QkNEOERFRDE5OTI4NjwvcmRmOmxp PiA8cmRmOmxpPnV1aWQ6M0UwOUE4NjJGMzUwREQxMTk3NjBBQzY3MkEwNjVDOEE8L3JkZjpsaT4g PHJkZjpsaT51dWlkOjNFNDAzNzdGRDM3RERFMTFCRDMyRUZDODg0MjRGQkI1PC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDozRkFBQjMxREM3RjNERTExQkZCM0JCNjFBRTFBMTk4QjwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6NDU3RDAyOTU1MDU1REYxMThCNTlEOTU5RDlGQ0Q1MEI8L3JkZjpsaT4gPHJkZjps aT51dWlkOjQ2MjI3NEJGRkE3Q0RDMTFCQUMzRTFGMzc1MDI1RjdCPC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDo0ODhFN0QyMTY0MTdERjExQUIzMDk2REI1OUJFODI3ODwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6NEJENjRFM0Q1OTFBREYxMTlBNDQ4MTZFNDI2RDE0Q0M8L3JkZjpsaT4gPHJkZjpsaT51dWlk OjRENDc1MzBEQkZCMURFMTE4MzhDQjc5QkIwMjlDNTMzPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo1 MDc3M0I2MjlEODBERTExOUM1QUY5NkNDRjJCMEZFMTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NTE3 NTk4NjcxNzA1REUxMUFBN0NGN0E0N0IzM0UzMTU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjUyQTBG MzlDMjVCRkRCMTE4OEQ0QjE0QTk0OUQ0RDZBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo1NjVDMzBE NDNBMDhERjExQTYxREIyMjdFRERGNTlGODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Njk3RTY3MDg3 RjYyREUxMUEyOThCRDAwNzIyMjBFMEI8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjY5OTU1MkU4ODQ2 MkRFMTFBMjk4QkQwMDcyMjIwRTBCPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo2QTM3QzZCQkQ0RjlE RTExQjNBMjhENTEwNkVGNDI5NjwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NkIwQzc0NDY4NjYyREUx MUI5MzRFMEJDMzk4MTU3MUQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjZDMUNFRTk5RkYwQ0RFMTE4 QjYwODA4Njg2RDFDREE2PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo2QzcwN0VCNTRDNEVERjExOUJG NjlGNUU3Q0MzODVENDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6NzFFMjIxMjg2NzhDREYxMTgxOTZE MUNFQkExMUM1Njc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjc0MjAwQTg1N0UzRERDMTFCNjYxRDM5 MDQxMjU5QTg2PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo3NTk4MDBDNEE1RDlERDExOUEwMEUxQkMw QzYxOTUxQzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6N0FGMjZGQTA3NjVGREYxMTlGNjFDNTQzREQx NTI4Mzg8L3JkZjpsaT4gPHJkZjpsaT51dWlkOjdEODJBNEQ5RjUzOERGMTE4OUFGQ0QyNzI5NDY2 OTg1PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDo4M0ZBMTEzODg5NjJERTExQjkzNEUwQkMzOTgxNTcx RDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6ODRGM0JDOTA5MDZEREYxMThGRDNCRUM3NTcyNEU0MzE8 L3JkZjpsaT4gPHJkZjpsaT51dWlkOjg5NkMwRkNCREEzMkRGMTFBNDczQjIxQzQ5RDE3NTdFPC9y ZGY6bGk+IDxyZGY6bGk+dXVpZDo4QzhCNEYzMTdFMUFERjExQkFCQ0Q3NDQ3MkNFRTBBRTwvcmRm OmxpPiA8cmRmOmxpPnV1aWQ6OTFDNkI5REQ3RDFBREYxMUJBQkNENzQ0NzJDRUUwQUU8L3JkZjps aT4gPHJkZjpsaT51dWlkOjlCRkM5QkRDQURGQ0RGMTFBMjM1QTEyN0RFRkZEQzU5PC9yZGY6bGk+ IDxyZGY6bGk+dXVpZDo5RDBDMTExQTYzQzQxMUREODUzNjhCMDhDNzM0NUYxRTwvcmRmOmxpPiA8 cmRmOmxpPnV1aWQ6OUREREMxNEE1ODcyREYxMUFDRTU5RjU4MUUyRUZCM0Q8L3JkZjpsaT4gPHJk ZjpsaT51dWlkOkEwNjM5NzlBNUY0RURGMTFBODg1OUZDMDM0RTVCRUEzPC9yZGY6bGk+IDxyZGY6 bGk+dXVpZDpBMUU4NzdGNThGMzRERTExQUQ2MEM1OUZBMjdGOEFDOTwvcmRmOmxpPiA8cmRmOmxp PnV1aWQ6QTJCMzM4RkM4NzYyREUxMUI5MzRFMEJDMzk4MTU3MUQ8L3JkZjpsaT4gPHJkZjpsaT51 dWlkOkE1MkIyQkUyRDUwNERFMTE4NTMyQTc1MzYyOEU5NTg3PC9yZGY6bGk+IDxyZGY6bGk+dXVp ZDpBNTgwMkU2NDREMzhERTExODdEOENFMEZFMDhCMDBEODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6 QUZFQzk1M0U4QjI5REExMTlEQUVFOTkyN0IzRUQzRTc8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkIy OEVBOEMyODRGRkRFMTFCNEEzOEJGQzY5NUM3RUVBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpCNUEx NjUyMURBMkFERjExOURFNURDMEQ3OEUxNTg3MDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6QkM0NjYx MzVCNTBDREUxMTk3NTZGODFEQzk5NjdDMkQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkJDQ0U2MUVC NDRDNERCMTFCOTI1RDU5OTYzNDU4MjlFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpDNEFBREQ0MTA5 QTZERTExQUE1N0M0REIwMkYxRjM3RTwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6Q0E0RTAzNEU3RTFB REYxMUJBQkNENzQ0NzJDRUUwQUU8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkNGMjY4NzNFNzIxMERE MTFCOTEwQUEwNTEwMjNENzRBPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpEMjkyNTQ0QUY0NjdERDEx OEIwMDg5OTc4QzUzNUQyNzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RDU3NDI4QUU4NzYyREUxMUI5 MzRFMEJDMzk4MTU3MUQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkQ2MjNFMkZDQ0I0NERGMTFBNjU5 OTkwNDQ2Nzc5NjQyPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpENjczM0E1NEZBNTBERDExQjE5MEFC QzVGMTgyRkIzNDwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RDY3QjczRDIzRThGMTFERUIxODFBODVF NTU0QUI3MjM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkRBQ0I0MkFDMEQ1N0RGMTE5RTYxODNBOTIx QjYwRjZEPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpEQjI4MjQ3Mjc2NUZERjExOUY2MUM1NDNERDE1 MjgzODwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6REMwREM4NkM5RkU1REQxMUFEQjI5QzVCRkJENkRG QTQ8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkRFMjgyNDcyNzY1RkRGMTE5RjYxQzU0M0REMTUyODM4 PC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpFMUIwRDQwMzk5RUFERTExOUM1M0EyNEZGNDAyQTlERDwv cmRmOmxpPiA8cmRmOmxpPnV1aWQ6RTFDRUM2M0I3MUVGREMxMUFDNzE4RjJGQjA0RDVCM0Y8L3Jk ZjpsaT4gPHJkZjpsaT51dWlkOkUxRUZBODg5QjlCMkRFMTE5QURBRkZCRUQ2NDFEMDA3PC9yZGY6 bGk+IDxyZGY6bGk+dXVpZDpFNDI4MjQ3Mjc2NUZERjExOUY2MUM1NDNERDE1MjgzODwvcmRmOmxp PiA8cmRmOmxpPnV1aWQ6RTZGMTIwM0QyRUU5REUxMUJENzJDMzdFOUM1QjBCOTM8L3JkZjpsaT4g PHJkZjpsaT51dWlkOkU3MjZBQjY3QTFEN0RFMTFBMUFFOEEzODhCRjExRkRCPC9yZGY6bGk+IDxy ZGY6bGk+dXVpZDpFOERFRkZGQzc1NUZERjExOUY2MUM1NDNERDE1MjgzODwvcmRmOmxpPiA8cmRm OmxpPnV1aWQ6RUI2OUIxODg4NjA2REUxMUIzODBDOURGRkY1RURCNkI8L3JkZjpsaT4gPHJkZjps aT51dWlkOkY4NkFFQTM2NzkzNkRFMTE5RkM5OEM2RjcwNjQ2MTc0PC9yZGY6bGk+IDxyZGY6bGk+ dXVpZDpGOERDMjQxMDg0NjJERTExQTI5OEJEMDA3MjIyMEUwQjwvcmRmOmxpPiA8cmRmOmxpPnV1 aWQ6Rjk1QzFBMkUyNTc4REMxMUFCQjdFN0IwQ0YzNEQ3OEU8L3JkZjpsaT4gPHJkZjpsaT51dWlk OkY5NzQ4NkMxRTI0RkRGMTE4M0M3OTk2NzEwRDA5OURDPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpG OTc2QzQxQ0IxNTZERTExODFEOTg2RTU0NTZBQTlDQzwvcmRmOmxpPiA8cmRmOmxpPnV1aWQ6RkEx RUU2NjkyRDNGREQxMTk2QUM5NTZEQTNEQjE5QzM8L3JkZjpsaT4gPHJkZjpsaT51dWlkOkZERDZE MDFDQzcwOERFMTFBMTVBQjI4MzhGM0FFQkZFPC9yZGY6bGk+IDxyZGY6bGk+dXVpZDpGRjYyMTY4 MEU4QTVEQzExOEZGRUM3RjM0RjZCRDExRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDE4MDEx NzQwNzIwNjgxMThEQkI5RDhFQ0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjAyN0I2 OTBFRkM1QkUyMTE5RkQzRkUxRjUyMzVFMTIyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDowMjgw MTE3NDA3MjA2ODExODhDNkFCN0ZEMEY1Njg0QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MDI4 MDExNzQwNzIwNjgxMThEQkJFMkYzOUM1OEYyNEI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjAz ODAxMTc0MDcyMDY4MTE4RjYyQUYzNUM0RDI0MTFBPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDow NEQzNDAxMEZGMkQxMURGODIzREMxRTc5QUVFRUYxNTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 MDU0MjY2MEUyRkUwMTFFMEFFNTJBRTI2OEZDMEUyRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjA2MDZEQkM5MTBGRkRGMTFBNDU1ODUwOTcyRkM5MEJEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDowNjM1RDNERjBENUYxMUUxQjA3MEEyNkE2MkVGRDM2MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6MDcwQzZDNTZFQjQ3MTFERkI2M0VFNjc0ODQwMkRDMDA8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjA3ODAxMTc0MDcyMDY4MTE4REJCOUQ4RUNDMzFCQ0VEPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDowOEM2MDc1QjI4MjA2ODExQTE2OTg3MUJDQ0JCRjQ4NjwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6MEEzODkwMUE0QzE4RTAxMUIyNTc5OEY4RDdGRTJGRDM8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjBBODAxMTc0MDcyMDY4MTE4MDgzQzYxRjRFQjYwODkyPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDowQTgwMTE3NDA3MjA2ODExOTJCMDk0Q0FCMkYzRDgzMDwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6MENFN0MzQzI3NUVFREUxMThDREVERjhBODExMkVEMzg8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjEyRUNERkNDNjkxOEUwMTE4MzE3QTUxMjZCMTg0QzlDPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDoxM0IwODY1MDhFRkJFMTExODYzMkMzN0VBMDk0RUI5OTwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6MTU4OEFCQTY0QjdFREYxMThCQjNGRDNGRkZFNTBGQkM8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjE4NDA3RUE0OUY3NERGMTFCOUFERjUwMUIxRkVFQzVCPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDoxOEEzQjJERkZFMTdERjExQTFBM0Y2RTJCRTM4NzJENTwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6MThBNkE1RkFCOTEzRTAxMTgwREFDRUIxRTRCMDgwRkM8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjE4QjlCQjBCMDNFNzExRTA4NEM4OTFENDIxMERBQzgzPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDoxOTRCNTQzNkE1NkZFMTExODQ0NUREQzgzNUZDOTMyRjwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6MUI2QTg2MkZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjFENkU0MzczQUM1RkRGMTFBNjhFRDI1MUZGMjNFQzM0PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDoxRjczRTFCQTU3M0NFMDExQUQ3N0IyQ0Y1Rjk3QUFCRDwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjAyMjdEMUJEOUVDREUxMThGODRCODI4QThGOTY4RjA8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjIxNkE4NjJGRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyMUFCNDk1MTEzRkZERTExOTdENURCNjA5MjcwMTU1Mjwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjFDQ0Y3ODIyMkQyRTIxMUIyQjNENEU1RTBCMTI3MkM8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjIzQjk4MjVDMkZERTExRTA4Qjg1QUJCNDE4NjVBNEYw PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyNEUxMDU5NTQyRjUxMUUxOEJENDk1MzIyQjhDNjU0 ODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjUwRjM3RkRCRTY1REYxMTk2QTJFNTM4NkVCN0VG QkY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjI2MkQ1RjFGMTcxRUUyMTFCQUM2ODU5Q0U2Q0Iw RUYyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyNzQ5REFDMTY5RTBERjExQkFFMkE5RjRGQTFD NzMwRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MjdFMDI5M0E3OEY1REYxMTlGMTA4M0I1N0E1 OTg0MTk8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjI4RUVBOUI3OUFENURGMTE5NjQ4Rjg1MTFC NzQxN0QzPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyQjQ5REFDMTY5RTBERjExQkFFMkE5RjRG QTFDNzMwRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MkJCQjdFRjMxMjIwNjgxMThEQkJEMUVG MjY3NDJEM0M8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjJDMjdFQUM3QjI2MURGMTE4N0NGRUM4 NUE2MDc3QTg3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDoyRDc2MzUwODE0RkZERTExOTdENURC NjA5MjcwMTU1MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MkU0QzgwNjZERjBDRTMxMUIwMkRE MTZFQzk4NDlGMEE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjJFQUZBMkJDNjkyMjY4MTE4OEM2 RjE2QkVCNTA3RkJDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozMkJBNjgxNEQ5RUNFMjExOEFG M0ZFNUZGNDY2M0YwQTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MzM3QUZGRERFOTAyRTExMThE OUVBMDY5OTk3ODdGQjE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjM0MUFCMjdENEMxMkUwMTE4 RDMzQTQzNjQ2NkQ5NTc3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozODJCRkYyM0U4RUZERjEx OUMxODkyOTFEMURCREQ3NDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6MzhFOUQzNUQ0OTE1REYx MUIxMzE4MjIzQzZBOEVERTk8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjNBNkNBRjI3MkIxOUUw MTE4NEREOEZCRDExMDM0MDA4PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozQTc2NzgzQ0QwQThE RjExQjJBMTlENTBGRjIxQjhEOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6M0JDNkNFMTJDMzcw REYxMTg1MENCNzJEQjlEMkNCOTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjNEMDJFNjJBREY4 Q0RGMTE4MURDQ0I4RThCNzdGMzFGPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDozRjI4NDBCQkRB RjRERjExOUI5RkVENjZCNjg3NUE3NzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NDE4N0MxNDE3 NzMyREYxMTlENzNCQzY1N0UxOUUzMzY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjQyNjk1NkE2 M0M3RURGMTFBNUE0RTkwNjVGQUM3MDRDPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0MkQ3QUQx NDQ0MjM2ODExOERCQjlEOEVDQzMxQkNFRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NDM1MTVE RTNCQjM3RTExMUIwNUM4M0ZFNDNDQkU4MjM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjQ0QkE2 MTBGRjcxNUUwMTE4NTBGQTkwMUI0QzFCNjc1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0ODBC N0U0NkFGNzhERjExQTgyNUNGOERFNUQ5MURGNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NEI0 RURBRkY1Q0Y3RTExMTg2MzU5NDIwMEE2OTZEMUM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjRE N0MxNjc3REFBQkUwMTE4NDMxRjZFNTExRkYxNDEyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo0 RTVEMjg3MTE4MjM2ODExQTk2MUFFNTZENDhBQ0Q1MDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 NTJEMjJBRkU1NjIwNjgxMTkxMDk5MUI5QzdCOTM5Qjk8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OjUzQTRCQjBFMzcwN0UzMTE5QjI0RTcxNjkxREQ2ODdFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDo1NDA5MkVFNzdEMTRFMTExQTY5MUY2OEE3MzREMDA2QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6NTQzQTc5OEYxMzA3RTAxMTg0NkZFOEMwNEQzQzhERUM8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjU0QzNGOUY4QkRBRURGMTFBNURDOTU5QzgyQUJDOUUxPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDo1NTREQUU4NUZDMEFFMTExQTdFREY3NDRDQUM5QTMzMDwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6NTU1QTlFRTgxMTJCNjgxMTg3MUZGOUMzMkY4MjE1QTc8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOjU1OUZDRDNCNTI3QURGMTE4OTE0REVCMTM1MTc2MUYxPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDo1NjE0QzEzNDk2MzdFMDExODI1N0Q0ODk4MDc3N0MxODwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6NTdBQ0YxNTA2OTJBNjgxMTg3MUZGOUMzMkY4MjE1QTc8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOjU5NDA4RTRDQkVGRkUwMTE5QjQyRjQ4MzE0MTQwMzNCPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDo1QjZERDJCNzQ1ODRERjExQjcyNDhCN0RERjc5NEExQTwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6NUM1RUQ1MjIyODJFREYxMUE0NjNCRkU5QjE4RkNBRDc8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOjVDNzlDMkYyMzYwQkRGMTE4RTJCQzQ2NTA2RkE4Njk4PC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDo1RDZDRUEyNkZEODgxMURGOUU3REFBRTlGNUQ4OEFCMjwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6NjA2NDBBNUM1ODI2RTAxMTgyQ0FEMzhFQ0VEQ0UyNjg8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOjYyQTU2RTJFRDVFN0RGMTE4MUQ3RDFEN0JDOTI5QzA3PC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDo2MkMyMTA0RkU3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6NjMxRDMxNkYwQzQ3MTFFMEJDMEVBQTFCQUNDNzYwMzc8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOjYzOUIxREQyOTdENURGMTE5NjQ4Rjg1MTFCNzQxN0QzPC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDo2M0FFRjkxMDUzMDVFMDExODY3Rjg5QjAyMTFFNEY3QTwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6NjQ3NEM4M0M2ODdDREYxMThFMUY5OUQ2OUIzNTI1Q0M8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOjY0ODg2Q0M4QkYzREUwMTE4OEJCQzA1NzgxRUJBRUQ2PC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2NUMyMTA0RkU3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Njg5QjFERDI5N0Q1REYxMTk2NDhGODUxMUI3NDE3RDM8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjY4QzIxMDRGRTc5MEU1MTE5RjgyQzEwOURDRTU3MkIw PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2OEMyNUIwNjMyRURFMTExQTU3QkYwMzMxMDQyMkVF NDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Njk0MDQzM0NFNzkwRTUxMTlGODJDMTA5RENFNTcy QjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjZCQzIxMDRGRTc5MEU1MTE5RjgyQzEwOURDRTU3 MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2QzQwNDMzQ0U3OTBFNTExOUY4MkMxMDlEQ0U1 NzJCMDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NkUyODJEQ0E3RjE3RTAxMUIwNzM5ODY2RTlB RDBDODE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjZGNDA0MzNDRTc5MEU1MTE5RjgyQzEwOURD RTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3MDIxMkE4QzJGREYxMUUwOUFEMjg2QUE2 NTMzNEEyNzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NzAzOUVEQTA1MDM3MTFFMEEyRjNFMjNF NzlCNDZBRjY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjczOUQ3RTlGRUJBRERGMTFBQURFQURB MzU2MjIyMDgzPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3NTUxNTMyMkFCNUNFMjExQTc4MEVD REJBRDVDNTdERTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6NzZCQzNGN0U1MzNCRTAxMTgxREFG MzNBMzA4Mzg2RUU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjc3NTE1Q0U1RTc5MEU1MTE5Rjgy QzEwOURDRTU3MkIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3NzZDRDIzQjJGREUxMUUwQjEz MEJFNDg3OERGNDRENTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Nzc3QzRBQTQxNzBGRTAxMUI0 MjI4MTUzMDI1RUYwQ0U8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjc4ODIwMEIzMzI2MURGMTFC MzhGOTk4ODc1Q0M4NjU0PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo3QUJDM0Y3RTUzM0JFMDEx ODFEQUYzM0EzMDgzODZFRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6N0UwQkJFQzAwOTg1REYx MTg0QjJFRTU5OEQ5OTVBMTE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjgyQzAxRjM2NkVGM0RG MTE5QjhBQ0YyNjhBMjc4NkExPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4MzQyNTVEQzZEM0JF MDExODFEQUYzM0EzMDgzODZFRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6ODRDNzZFNUNBNjFF RTAxMTlCNjJDMUE3MkNEREJCMkQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjg1MEZEMzg4Mzkw Q0UzMTFCNTE4OUMwM0VBMTMwMjQ3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4NjFDQjEyOTEx NkNERjExQTA4MURBQzY1NTQ5RkZGODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6ODhBMTIzMTE2 NEQ3MTFERkE2OTc4NTIxRDYwREY0NjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjhBREJERkQz N0E2RkUxMTE4NDQ1RERDODM1RkM5MzJGPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo4QjkwODU4 RkI1NzNERjExQkZCQkYwMDc1OUEzRDQ1MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OEJDRkE2 N0JCOTA2RTMxMUE4MUJCOTE0N0M3RTE2M0Q8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjkwQzVE NTI2NjQ3OURGMTE4NjVDRUVGMDk4NTFGRDc5PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5MUZG MDUxRTBGRDNERjExQjJEMUM1MUY1OUI1RkIyOTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6OTQw RERDMzUwMTIxNjgxMTg4QzY4QTk0ODIxMTIyNTI8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOjk1 OTE2RjM2NzE0NEUxMTFBRDg2OEEzODE3QjM4MzE1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo5 NkZBRUNCMDAxNUVERjExQTg3OEE1NEVCNjY0MEVCODwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 OTc4OEFEQjc2NjNFREYxMTgyMDBGMDk3OUQ4Qjk1MjE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk Ojk4NURGMThDMTgyMDY4MTE5MkIwRDRCNjlGRTVBRjhEPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDo5QjBCQzkwRTc2QjRERjExQTM2NUVGNTI1Nzc2MjM4MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6OUU2NjQ2NEI0MkZERTIxMUFBOUZCMDlEMTY4OTRGN0U8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOjlFN0MxRjc3RkMyMDY4MTE5OTRDQjlGQjVCNjM1M0E0PC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDo5RUY3RDkyRkMzOTJERjExQUVENkE1OUIwRUY3MTE0OTwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6QTFGNzY5NzZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOkEzQTYyMkNBODcxRkRGMTE4NTQ3QzU5NzUzNjE5OThEPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDpBNDU3MUE5NUU0NTBFMDExQUZCOUUwMEM3NTcyRTY2NTwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6QTRGNzY5NzZFNzkwRTUxMTlGODJDMTA5RENFNTcyQjA8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOkE2QUMwRjlDNzMzQ0UwMTFCMkNGQjIzM0E0N0NGNUI5PC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDpBNkY3Njk3NkU3OTBFNTExOUY4MkMxMDlEQ0U1NzJCMDwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6QTdCRTEwQTAzNjA4REYxMTkyNERCMDM1Nzc5MjEzQkE8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOkE3Rjc2OTc2RTc5MEU1MTE5RjgyQzEwOURDRTU3MkIwPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDpBOTU2RkIwNUU0RkNERjExOTBBNkQxMDM3N0RGNTZCRDwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6QUFFNzY4RkY4RDZBREYxMTgyOTBDQkI5NEM1Q0Y0RjA8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOkFCQTY4NERCMDEwN0UwMTFCRTE5OEQ3NzUzNDZFMzEyPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDpBQkMzRjhBNDI3MUNFMDExOEZDQUFCRDMwOTI0RDI5NjwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6QUM3QzRGNkUyODA4RTMxMThGQjFERUQzNjQ0NzNCM0I8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOkFFMThCN0I4MDZBOTExRTA4NUZERjM1QTMwQkE1NkFEPC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDpCMTFEMzYwQzI1RjFERjExOTQ0NUE1RkQ4OTVENzgxRTwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjFCNjFCMUNCNjlCREUxMUI2OTVDNkI5NzVENzUxQ0U8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOkIxRkJDMkFDMkZERTExRTA5QUU5QzRBNkRGOUE0MUY5PC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCMkU0QkI2MzQzRDVERjExOUJCREMxQkIyQjUxMDBBNjwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjVDMUQ2QkI3RDlGRTIxMTk1REE4OEIxQzg4RDYzREU8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkI1RDVEM0JDQzYwQURGMTE5NzQzQjVGRjk1NjQ0NzlG PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpCNkYyNzExQkJFQkJERjExOTZGNUI0NEQzQTlCRDZG NjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QjlCRjZBMTMzRDlFREUxMTg2NUVCNjBEQjM3RDlD REU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkJDQjcxMTkyN0JDQUUwMTFCNTRFQUM3RDM0NjlF RTQ1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDMUZENDIyNDAyNEQxMUUwQjlFN0Q5MjNERDc5 MTdDRTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzIzMkI5MzAwRjIwNjgxMThGNjJBNkE2RDQy MjNENTA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkMyNkMwRDQ5NTI2N0RGMTFCMkU1QzhDQTJB MjBCNTAxPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDNDc2MjdCMkE0RjVERjExQUE2QkY2NjFC Rjc1MjIxQzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzU1M0QyREVCNjFCRTIxMTkyRTVDMUIx QjFERTdCMzY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkM2NUNBNzUzQTZCNURGMTE5ODY2RDZC MTEwMDVCRTdCPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDNjZDMEQ0OTUyNjdERjExQjJFNUM4 Q0EyQTIwQjUwMTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6QzcxMTBFNUY1MDc2REYxMThFNjFB Q0QxNzlEMDYyNDQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkM4QzNBRDBGOTgxMEUwMTE5RTNF RUQ2REE1MkJCMDIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDQTJEODI5M0UxMURFMDExQjhG RDgxN0NDODk4MUQ0QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6Q0M0QUI1OTFBN0RDREYxMUJG NzlGQTYyQjUxREY2Qzc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkNERTg4QkNFNEI2RkRGMTFC MjE4QjAwRDg0N0RDMjk3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpDRkJCREI1MjBDNDUxMUUw QTQzQUFEOUM0RTVBODgzNjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDBCRjEyNjUyODA5RTMx MThBMjFEOTVERUExNTkxQjE8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkQzMzE4NDMxQTg2NEUx MTE5NUY5OTdCQTc0QkE0OUM1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpENDdGQjdENDk2QjBF MDExOTUxRUMzMkMyNkIzNDc2NDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDVFQkY2QUEyQjY3 REYxMUIzODg5NDczMzJFNTU4QzQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkQ2NzY2RjYxMTcx MkUwMTE4RDMzQTQzNjQ2NkQ5NTc3PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpEOTAyMjIwREU3 RURERjExODQ4OEFBQ0E2RTVGMjI1MTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RDlFNjgxNzQx REQ5MTFFMDhBMkU5NkQzMjY5NDExNDM8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRBQzg1MDc4 NTRENURGMTFBMDk0REYwMUU2RURFMzIwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpEQjFFNEMx Q0U4N0FERjExOENCN0ZFQTdDRDc0RDM1QjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6REMxMDg1 MjMyQ0I0RTIxMUI2NDU4NEFDQ0U2QTdFNUY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkREMUM2 RDJBRkEyMzY4MTFBN0JBODkyMTM1QzEzODcyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpERTRE NkJFMjBDNkJERTExODg2OEQ1RDRGQ0NDRTdFQTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6REVD OURBOEYxQzIwNjgxMThEQkI5RDhFQ0MzMUJDRUQ8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkRF RjYwRkE1MDlCMEUyMTE5M0E3RTI3Njg4MEUxNTUwPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpF MDI0MUU0MUI0RkVERjExQTQwQ0QzQzFCMzQzRDU5MjwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6 RTAyQzE5MEU0MjZFREYxMUIyNERFOTA4QUNDQUMwOTU8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlk OkUwNkY3ODZERkNCMURGMTE5OERGQjIwRjkwRDNBQTZFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRp ZDpFMDk5MEZCREFDM0FFMDExOERDOUJGNTc0NzYxNTMzRDwvcmRmOmxpPiA8cmRmOmxpPnhtcC5k aWQ6RTBCNTA1NzM1MEREREYxMTgyNzFBNjlBRkM2NTY4OEQ8L3JkZjpsaT4gPHJkZjpsaT54bXAu ZGlkOkU3NDdDMEY4MEY2NURGMTE5QTk0QzVEOEQxODg5NTVCPC9yZGY6bGk+IDxyZGY6bGk+eG1w LmRpZDpFNzk0MDc4RERFNjRERjExOEE1M0Q0RUZFMjBDMzUxODwvcmRmOmxpPiA8cmRmOmxpPnht cC5kaWQ6RTdEMzQ3N0YwQzQ4MTFFMDg4QURENkVENUEzRDg5REU8L3JkZjpsaT4gPHJkZjpsaT54 bXAuZGlkOkU3REQ1MjY0MUExOUUwMTE5NUYxQkE0NzRGMkMwQkFFPC9yZGY6bGk+IDxyZGY6bGk+ eG1wLmRpZDpFODEyQTM3MUZDNENERjExQkU1NTkyNjdGNTNBMEJBRjwvcmRmOmxpPiA8cmRmOmxp PnhtcC5kaWQ6RThBODJFQTJDQzA4RTMxMTg2MkZCQzJENDU2RjMwMTg8L3JkZjpsaT4gPHJkZjps aT54bXAuZGlkOkU4QzE1NjBFOTIxN0UwMTFBRkZCQTY1NDE5QUYxMENCPC9yZGY6bGk+IDxyZGY6 bGk+eG1wLmRpZDpFQTEyQTM3MUZDNENERjExQkU1NTkyNjdGNTNBMEJBRjwvcmRmOmxpPiA8cmRm OmxpPnhtcC5kaWQ6RUI4NDY5MjAzQkZBREQxMThCNEE4MjhEOEVGRDUzMEE8L3JkZjpsaT4gPHJk ZjpsaT54bXAuZGlkOkVFQzE1NjBFOTIxN0UwMTFBRkZCQTY1NDE5QUYxMENCPC9yZGY6bGk+IDxy ZGY6bGk+eG1wLmRpZDpFRjg0NDFDMDY1RTdERjExQjhBQkJCRjdGRkE2QjBDNDwvcmRmOmxpPiA8 cmRmOmxpPnhtcC5kaWQ6RjFEMjEyQTQ3OTQ1REUxMTk5OEZCRUQyMjkzRDlFMjc8L3JkZjpsaT4g PHJkZjpsaT54bXAuZGlkOkYyOTg2RjQxNkIxRURGMTE5ODk4QUNEQkRGNUYxMjVFPC9yZGY6bGk+ IDxyZGY6bGk+eG1wLmRpZDpGNDgwOUVCMkJBMDhFMzExOTAxNjgxRTg0MDRGRkZBRTwvcmRmOmxp PiA8cmRmOmxpPnhtcC5kaWQ6RjVDOTQ5RDRGQjY4REYxMUJCMjc5Rjk4RjA2NzM2MEE8L3JkZjps aT4gPHJkZjpsaT54bXAuZGlkOkY2QTNGREI1MDcyMDY4MTE4M0Q0Qzg4M0Q1NEZEMjE3PC9yZGY6 bGk+IDxyZGY6bGk+eG1wLmRpZDpGNkNFNzI1MTRCMjA2ODExQTEzOEJDRDU3NTRBQ0QyQjwvcmRm OmxpPiA8cmRmOmxpPnhtcC5kaWQ6Rjc3RjExNzQwNzIwNjgxMTgwODNFQjgzQzYyQkQ3QzE8L3Jk ZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY3N0YxMTc0MDcyMDY4MTE4OTI2QzI3Nzk4Qzk2Q0U1PC9y ZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGN0RFNjcwMTFGRUNFMjExQkM5QTk2RjA2QTk1NkFFNDwv cmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RjhBM0ZEQjUwNzIwNjgxMTgzRDRDODgzRDU0RkQyMTc8 L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkY4RTVCRTQxQzgxOTExRTBCMDMzRUVGQUFGMUUyODcz PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGOUQyQkMwQTAzOThERjExOEUwREZCQ0MzOUYxRDcw QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkEzMEI2NjJFNzkwRTUxMTlGODJDMTA5RENFNTcy QjA8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkZBQ0Q1QTcwMzMyNUUyMTE4MDZEQjUwOEZBNjc1 RDlFPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGQkJGNDk2QzJGREUxMUUwODM4N0QzMDE4MDc1 NzU4OTwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkJEM0Q5QjYwODU3MTFFMEJBN0RFNThDNjE0 NjlFMDc8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkZCRjk5RUI3NTY3RERGMTFBNzRFRTZDRTAz OTk0NDIyPC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDpGQzEzM0E4MkQxMEQxMUUwQTA4QTk3OTY1 MTk4RUY3QzwvcmRmOmxpPiA8cmRmOmxpPnhtcC5kaWQ6RkM3RjExNzQwNzIwNjgxMTk0NTdCOTMz OTdDQ0YzNkY8L3JkZjpsaT4gPHJkZjpsaT54bXAuZGlkOkZFQzUyRDM5NzY2M0RGMTFCMjYxOTRE RDEzNDI3RjhCPC9yZGY6bGk+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6RG9jdW1lbnRBbmNlc3Rv cnM+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9 InciPz7/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNj AAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRi WFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAA ACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAE PAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2th cmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdC IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABv ogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAA AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5j aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAA AC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAA AC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAA AAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElF QzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2 MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAA AAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0A MgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8 AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWAB ZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJL AlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3ID fgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8G wAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjS COcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkL UQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4T Di4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETER TxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y 1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0e HUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h +yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs 1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLU Mw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5 fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0Bk QKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BI BUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/d UCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9Y fVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFP YaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q 92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTM dSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/ hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opk isqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmW NJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqIm opajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGv Fq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7wh vJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk 2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/n qegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb7 94r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7gAOQWRvYmUAZEAAAAAB/9sAhAABAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAwMDAwMD AwMDAQEBAQEBAQEBAQECAgECAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwP/wAARCAMgAyADAREAAhEBAxEB/90ABABk/8QBogAAAAYCAwEAAAAAAAAAAAAA BwgGBQQJAwoCAQALAQAABgMBAQEAAAAAAAAAAAAGBQQDBwIIAQkACgsQAAIBAwQBAwMCAwMDAgYJ dQECAwQRBRIGIQcTIgAIMRRBMiMVCVFCFmEkMxdScYEYYpElQ6Gx8CY0cgoZwdE1J+FTNoLxkqJE VHNFRjdHYyhVVlcassLS4vJkg3SThGWjs8PT4yk4ZvN1Kjk6SElKWFlaZ2hpanZ3eHl6hYaHiImK lJWWl5iZmqSlpqeoqaq0tba3uLm6xMXGx8jJytTV1tfY2drk5ebn6Onq9PX29/j5+hEAAgEDAgQE AwUEBAQGBgVtAQIDEQQhEgUxBgAiE0FRBzJhFHEIQoEjkRVSoWIWMwmxJMHRQ3LwF+GCNCWSUxhj RPGisiY1GVQ2RWQnCnODk0Z0wtLi8lVldVY3hIWjs8PT4/MpGpSktMTU5PSVpbXF1eX1KEdXZjh2 hpamtsbW5vZnd4eXp7fH1+f3SFhoeIiYqLjI2Oj4OUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6 /9oADAMBAAIRAxEAPwDQHB9tEdLlanXPV71Tp3XUdcfe+qE069791qo69791vri3vY6acZ4dcfe+ qDrnb3qvTunzHXtVuD79Tr2ulAesgsRwR9fp7p0+KEVBFa9ecDSbj8fn35Sajr0qr4bVHl1G1kLp 45/Pt2ma9IBIRGY6Y6zR20j/AGP+x590bj0qgp4Y9eufuvT3Xvfutde9+6911b3vqpHXXv3Wqde9 +68OPXfv3Vhjrv3rrfXvfuvde9+6313791vrr37qvXvfuvde9+691737r3XXvfWgc9d39669Ude9 +6316/v3W6nrle/vXV61p1ytb3rq9Keeeuatzz791dHoc9dt78erNmvWPT/sPfq9M6PPrife+qkD h1xPvfVDTr3v3Xq9S6Wqkp24JaMn1xEnQw/oR9PbckauM8fXpbZ3ktswoS0dcrXB/LqRNDHKjVEI ZdTX8f4UH6i/+B91VipCt0quIIpo2uYAQCfh8h1AdStrnki9vyPboz0WOpTTnPUyjylZQuGp5dNv 7LAOh/11a4PHtqW3imFHXpft+9bhtsge0mofQgEfsOOnR9wVFQdU9iTxZVCgW/IAt9fbC2UaYXh0 cyc03l2a3JFfQADryKtaHl/Tx+Bcs1v+K+/E+DReqoi7iHlI0/5T0zVUEsLfuKVB+ga/0/rz/X2q RwwweiK8tpoG/UQj7f8AD1gU297PTCGg+XWUf7x7308v2465fnj6f6319+6tXPXd+OQPeurV9euA J/r7302CajPXLV+PeqDq2rPXtdvz/vPv1B1rVTqVEwI59tMDXpTCy+fDr0rKBx/T/effkBrnr0zJ wXptbkn28Oi2QFiesdvdq9M6eure/dVIp1xPvY6bbj11731rrife+qE9d29+62B13711YD5dcveu rgU67966tTru3v3W6ddj3rq4HXK3vVer6c9cgPeurhes6Lf34mnT6qPTrMFA/wB490Jr04PLHWQq D9R9fdakcOnNIPHqPJTt9Rzcn/kQ93DjpmW3bBp1GZCtuD7uD0leMinXC3vfTdCPLrife+mzg566 9+61173vrXXvfuvde96691yA96PTij59dn37qx669+6r163v3Xqde9+691yt711cDy68ffutkddW 976pQ9dgE+9dWVSfLrmSfp9Peh06xIx1jPuw6ZJ69b37r1M9ZUUm1h9fdT/Lp+NW9OpyRAWv9fbT PXpckVKV67lbSpt78oqc9bmYKKAdNhuSSfbw6KmqST14Lf36vXgleorg62H+1W9vA9o6LpVPisPP VTp+gpjcAC/+J/3j/b+0byD1x0KLa0ZiAFx1/9DQFHHtvpUKg9ch7104D13791brq3Pv1eqac168 Qfx73XrxU8R10b29+x1o6iOuPvfTdD+XXMH3rp0GvXR9+60c46x3I/2H0926ZqQeOR1l1l+D+RY/ 8V/1/ddIGen/ABmk7SOI6j+3OkfUiL9P1+hPtp+PS22I0UrmvWX3Xp/rr37rXXvfuvde9+69173v rXXXv3XvPr3v3WuGeve/dbHr13711vr3v3Xuve/de697917r3v3Xuve/de669761nr3v3Xqdd+9d b697917r3v3Xq9d39+6tXr1/eqdeDdcvfurjrlf3qnV9VAOui1/fqdVL164+99U8+ve/deOeHXVv e69a0nrNCup0H5LAcf4+6scHpRAgZkHmT0rmxtXPAIYoFgiiCvIF5MjWsHBI+hvz7LRPEjl2fUx4 dDp9nv7m2EEFsI4UALU/EfX/AD9J6vx01IymRWGpdQ1CxIva6/1F/a2KZJK6T0Fdy2q4sWXxkI1C or6fLptCcm/HH+39vV6KBHk6sY66AN7e9nrSqa0A6UtLTvFCkwcKt7+Mmzkf630t7QyOGYpToWWd q8Nulx4oAr8Pn9vXDMTRzpGQLOlrtf8AULccf4e92yMmqpx1rfbiK5SEhaSrxNeI6T/0+ntX0GMA 44dZF59+HTq91OsmpRxf6/U/0/rb37pwsoxXri0g+n++/wCNe/AdUaRQKdYS5PvdOmGlJ4ddaj79 Tqus+Z67Df19+p1YOfPrMj2HvVPLp9Gx1yZ78f74+9Cg6sW8usLe99MsR1jPvfTJHXE+7DptuuB9 7HTbdde99V69791qnXdvfurAV67966sBTru3vXVqdcveurAdd+/dWAz12B711cDrKqn8/wCw96+f TyqfPrMqc8+9E9PBeswQD6e6FvXpwJ1zCc/4W911dOCLPyp14i3P+8+/cetEFckY65K4tb3or04s wIpTPWCZQRqAPHtxPQ9J5lByo6gE/X24OkDHJ64H3bpo9de99U697117r3vfXuve/de69f3rrYNB 13f36nW9RPXL3rq4/l1737rdM9d29663Trv37rfXgLm3v3VgtTSvXMr79nq5Qdd2t9Peq9WAoMcO uLHn37j025zXrh7302ePXJVuR78erotSPTpyiQKLn6n2w7VPy6NIUCip6y2J916eoSOos1/p7dTp HKDXrB47/j+nu1R0z4Yx1zVLH+v+w45/2P49+qKdbC0OOoMcZlq1T/VT2/2Gq5/3ge3SdMZPy6K4 YjPfRx+Zk/y56VxcUSxs0JkVr62XjTb6f7x7LaGYkBqenQ7Mi7esTPblkPEjy6//0dAb230s67Hv XVhjrl791br3v3Xuve/de669+60eB66Hv3Wh9nSp21V7eoauBs3h5s7T1LtTV1PDO1K9Fj5l8UlX QSrwcvEW1wmQGEFQGVtXptpJHHovuZJST4UgUDh51Pofl60z+zrJu3azbflpq2gqhlttZgTTYHNx poWqiifTLR1sILfYZmh1BamnY6kJDDUjKx9QilePV7e6W4BBXTMvxL6fMeoPkekafex063XE+99N mvXXvfVeskVtXP1IsP8Ajfuj8On7cgSZ4kY6k+2+lxHXXv3Wuve/de697917r3v3Xuve/da69791 vr3v3Xuve99a66Hv3WgevX9+63Udd+9db697917r3v3Xuve/de697917r3v3Xuu/fut0x11791rr 3v3XuuwPfurAZ65lTYfj3Xp0oQB1xNx731Q1HEdcfe+m+ve/de67Hv3Wweuwfej1cHz6zQyGKVHA BKsGA+v0PurDUCvr0ot5DFKkigVBr0ItJkTUUquZVRyyxsrXHpA9TccAeySWERyEaccepY2/dzd2 UcrTBZCwU19PM9MeTiqchUFwbpGvjiRSSAqn/H63PPtZbvHAlPM5PQY3mG83a8aRTVEGlQM4H+fJ 6TLwss3jb/VaT/t+f9t7XhqrqHDoIPAyzeG/rQ9O8GNSU/tSIdJ4LkKT/iATyb+0zzlfiXo8ttoS 4akEy49SB/h8+s1VDMlgQSV9J0/SwA/3m/usbqa0PT97BcR6V0ksMY6bKhGtpcFW/Ht9COI4dE1y rjslFG6bmUg+3q9FjoR9nXV7fT6+/de1aRjj1wvf3unTZYmtT14n37qpPXH3vqnXvfut165X966v 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 0RCXD1ir/vP+x/g6K/h8waZZdt5+GRcaZpqeWGeN0qcVV38UsviYB0lifg35SxtY397ZdXcpz0eg 8CCCP8PSvpqn+HSvgszC+c2vm5UkaSBoYpMklPH4IMthpp0EFDuqghRhHIbJXRgxSXBB96DhlKnD D+R9f846TSxGMieFqMOHp9h9VP8Axk5HQVZ3HQYrJ1FJS18OTpFEUtJXwJJEtRT1EMc8XlglAlpa yFZPHPC1zDMrJc6bmwrQV49LVk8VQ+gqfT5/b5j0PmM9Ny/Qf63up4npYldK9dlj71Tqxc9d39+6 2CSePXMX91PTq1/Lru/+w966tUefXvfuvfZ1737r3Xvfuvde9+691737r3Xvfuvde9+6911b3vqt Ouvfuq9e9769117917rv3rrfXr+/deB69f37r1T1737rXXr+/der8+uwffurA9cr+9dOV679662T UV64+99V65qbfT3rq6tpNR1MWr/bKG2r6qf8Rb22Y818ul63tIWjPHy681Y8ijUbkC3+w/H+Pvwj VT1572SZBratOo7ya/r7uBTpK8moEdYD7sOkzGnWMn3YdMMSfPr3+t79175A9ch70enFHXMH3rp0 E+vXd/eqdbDEn59ZQOASLe9dPqMA064kfX37rRUZPn1w976aPXvfuvDrnpOm9uL2/wBj7105pqoI GOuQH+Hv3VwPl1nXXJZTcKPoP+Kf4+6mi1NM9PKXchSe3y6yeKPXwCtj9Cb8/wCPH5911GnVzHHr IoR1PQKiam0m1rEc2/5F7aOT0axqkceptJpTrC8wJJP+sPx7sFPAdJZLkMWY9N0rl+foPbwFBTot lYtUnqOR7t0lI66t731oDh13711unXIC/vVerha9cwPfunAP29ZFsCP95t78eGOnRjqSoFvp7aJP TygEV6wym3Fv99/xPu68K9NP29YBJa4Hu3zp0yJQKjrJHLzz/vj70RXq6SgnpxiOrn6j2yRQ9GcD a88R1NRbg/7D/D6n20xp0aRpUEnh1kMZ0n/WJ91DZHTjJVT02zALe3F+f9t7fXJHRPcqqV04r0zu 1yf8T7UAdEcj1YivXD+vvfTfr10Pe+qgU67966tXr3v3W+I69791rr3v3W6dcwL+9E9OKteuvfuq nj163v3W6VHXIce9dXU0PWYG9ve+lANadet/yP37qpz1ic+/efTMhGOsY97PTS9cveurcevKOffj 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 MHj1kNme6n0f6l7FksNTamIA/wBj9Le9r0zJig6Od8ed1YjH0Em1B9xS5eetXL1mPyKuFy9MKZEo 6jGU0sf78bBiQFubG9rH34ceiTcI5NQm4xcMeX29Dniq2HLR5eliSYS1dbUYZsFVKjMKMM8tU1PR NGFMc8KFRbSAx59pqMWbOK4HSEigTzFK16AndP8AEOrv41T7Bpa+v2huShy6ZPa7l5K3bVdQ08KV u5qEIJTQrD51V47BJAQv9LPq9Kqa6fnxB6WxFLvSLlwJVIo38Qr8J6XO3q6pqqem3Xiaijh21X+O LC1/ji8rxxRUlMMdWQo5WGqhEX7isQ3k5+nuoJFSAAK9J5VCs0Lg+KOI/wAo6AftfrilydPnN6ba hjjrKXOV8GVxFFGGhNKXZ6edQLD7hKdC0hUMrMfrf3upBPp0vsrsxlIJj2FRQniD/m6K3Lq8mhw4 KgJpkUq6Gw9JVuRY+7H1HR4vw/LoacVIuGibbW6oBlts5oU0pjofHJKJUi0Ll9tVT6Vg3NjImAKc RZGEeKT1aCWdQk+TD9o/zg+Y/PpJKjoyzwmjj9n2H+if+MnIx0H269rVO1sisH3MOUxNfF97gc9R rIMfnMXIxEVXTGQB4pkPoqIH/dpp1aNwGX3YNXBFGHH/AFeY9D0YW1wtwhZQQwNGU8VPof8AIeBG R0mLe/V6VhfXriyX97Bp1R49XWO1j7vXpOVoaeXXNfdT06g6zj6W9tnpWvCnXfv3Vs9e9+63Tr3v 3Xuve/da+zrr37rx69791rr3v3Xuve/daOeuNve+q0PXdvfut069b37r1OuvfutU69731rro+/da Ir11b37rVOuXv3Vuve/de697117r3v3W+vW9+63T59d+/db+Q669+6p173vr3XG3v1eqlevafe69 aCdZBwPdOnwKAdd+/dbp1yUe6np1AMV6zAfke/Y6fAxUceuJPP19+PVCTXj1wb34dUfj11x/r+/d ax1lT/H34efTyU4nh1JJAF/qPz/h/r+6UzTp3gK06x+Qnj6e7aRx61rr176gWFyOb/7z73w48Ot9 dqWFwT9P6/j/AIn3ogenXgSMdY3kIJ54P+sT73QYx0276Tx64pdjcfj6/wDE+/cOtJ3GvXIgX/2P vfEdWIFeuPv1B1U9et79Tr1Ou9K/k2/3m/vXWyq+Z64kL9b+/dUKpk9cCR/X37PTZKjIPWNn4/w9 2C9MvLilcdYvJx/vXu+npP4+COuFyPz7tTprUQa16zx/19tt0rh4Vr1Lhm0/4n8f19tstePS+GfT kcenamfWLn6A8f77/X9p3FMdHdlIXHceB6cwbi9uOf8Abf63tN5/Po1GRwx1EqIlcG9v6Af63HPt 5GI6R3MCyKa9NVTABGLWuPpb/efahGJbolurYLGPXqJDGLlmvZfbjE+XHpFDGAatXHUwASAEhQt/ p9b+2j28OPS0ASU1UC9dSGJAAFBH54F+Pzf3sBm8+vSGJRRRUdQpCpb0i3+9e3B0hl0lu0dYzYe9 jpo0HDrq/vdOq1PXIGw966uraQeur39+60TUmvXfv3Xh13z/ALz711cVz69cgfevPq4PXT/T3vz6 rJ8PWH3fpMfTru/vXXq8OuQNveunAaddgn3rq4JrjrOtzxbn/ff19+8qnp9SeHU2NT/vvp7ZY9LI UJ8upiLa1+P8PdD0ZRIBTUadcpZUQEkgWAtz/h+f8felUkjq888cSnU3l0wTTF3Yi9r8f639f9j7 VKtAOgxcXBeRiOHXFWPFj72etIzGmenWmiqmdft40DlQWnmBKJ+LBR+p/wDevaeRowDrY09B59HF pFetIBaxLrIy7Vov2DzP8h59OD45X9VVNLVyfjUbQoT9dEK+lR/t/bAuCMRoFX+f7ejOTaVko99c PPL8zRR9iDA6TiWijqwP7Mmlf9gWA/3n2vNWaL7OgnGVhhvgPJ6D+YHUuggPjTjlzqP+x/T/ALx7 bmfuPoOl212xMUZp3Ma/5ulfRRaF1EHi1/6/T+n9PZZK2onofbbBoXWRgdf/19BSoaQKkbuWC30g /Qf63tKgWpYDj0fXDShI4pHJC8Pl9nUYWP1936SihOevK2hwQqMRdgH5Xj6Flv6gD+Pz7uor0luH 0AAefUqkiR3eSRgkMIMjhbB5D/YijQEcu31/Cr/sPdhk6vLpid/ChWIAeIf5fPrmLuoL8hWC3W5U cajbniw+v597IocdJwSRnh04UNHJkKyhx0YaSTIVFPRxBPWzPXVSQqI1AuX8b/Qf092GBXpl3Csz eS5P5CvR/uw9oYbdm39ux46lfbW7qfKbfxG1snS6oqpDEPt9bVNOEc08VHA7fqvGVBNvewQ6R0FH /wAPQdt53hkct3REEsDkH/Ueg32H2jmdu7npNt9iNTU2ToEqcbh9zvMEpK2SociefKZKR5Yqiqaz Ksht63s9rX90BBNaVI/1Y6UzWySRGe0B0nivmPsHp0Oe3KxNxZXN1ZieOto8Lhtu1tBXIl8rLl83 k8pUSwVEKn7iWSgo4zwWBS1wePdKtX5Z6RsumNR5Fq/ZQf7PQV7yw9f1Rk6jdWzcVLk9oVuQFTuj Zkqv4aGuijldMrjQqkUeqJwHGk6rWP40+4faDj/V6dKYmW7UQTyUlAor+f2N/k6EDam6Nm7u2zRZ HbzVT0uKxZo8xR1gH8RxWSqpJITTZ6NV/wArgkRpHhmjJBRLcWID6U0AEZA/1f4ek1xDLBMUk4Hg fIj5f5eigd87Rgw+88b/AAqGaSbceJizIjEb/wCVNVZGvp4JKZeSySx06qoHN1sefdGohUDgRXo8 2yUtav4hoENPswOg/wBvZylSGXBZtWkxlUVijqHZxU4l0cPaEkM0Smaxa1iSF/At7akjJIkU0YdL 6/s/1fy6XcUkVAlbtHdjTZLbeVqXyVNWUqieqpK2SMKNybaU6FfIwq4WupLrFkoENiJkRhT+1CkH TIvy8vMH5H+R6TMrQSLPBQECnyI/hb5eh/Cfl0j99dabl2DJQTZKOnyOBzVLDX7e3XhpWrtu56hq I1limocgqKqzqptLBKI54XBV0FvewagVFD/m6NLa7huahTSUcVPEfb/nGOg/976VddEe916qVr1x HHvfVAKdcgfeiOnFbrIOR7r08DUde9+63Trv3rrdP2dd29+63Troj37rRB669761Trr37rVOve/d a697917roe99aAp13711vr3v3Xuure99VIPXXv3WqHr3vfWuve/de697917r3v3XuuvfuvV679+6 91737r3XV/futVA661e906rrqcDrv3rq/XIe9dWFOu/eurVr13791YHHXIe9Hq69ZVPHvQ6fU0GD 10w/P59+6qwrmmeuJHHv3VSDQddW9+6qFqeHWVRew9+rjp9QDTqaqALZiLfn/intosScdLERQpLN jrBJb8AD/D+v+J93Wvn0nfOVHUfWR9OP949249MayOuJc8m/v3VTIcnrgTf3unTZapyeuSyFPp+f r9bf8b9+pXqyy+Hw65+QN9eL+/Up04JVbrztYD6X+o/1vfuvSNpUevWEuf6+906TtI1ePXtZ9+09 e8UkAHrjq97p1TXTrot79TqpkHl1gZufbgHSN3JPXD3bprrsc+9dWAr1IX6W/r7bPHpbHXTT16lR RFiP999fbbN59LoYqkevT/SRBF/BBH0/4n/b+0krE/b0JbKERpX16zzSaBa/Fuf6n+nttFrnpTNK EFScdRfMpNvx/X+v/FPbunpH9UrNpAx11I6NcMBwOD+L2tz78ARwPWppIpKhl+zqBIVAsLC9+fr7 eWpz0VylRQKB1HZ7Cy8AH+vJP9ePd6eZ49J2amB1haQn3anTLy14dYi3++/x97p0wXP5dcSfe+my SevXPv1Ovaj13qPv1Ot6zgdd3966uD1yHvXVgeu7+/dWr13f3rrdaddm1uffh1ZqFc9YPd+kh49d j349bX165D3rpwdZkQn3U9KI0PHqbHF9Prf22zVx0tjiqRjqYqhVubC3P09t8ejBUEa1YAU6jzVK r+k8/wCBv7sqE8eHSae6VfhPTXI5dixJN/b4FB0TSyGRy1ePWK3u3TNKnPUuniLEE3Cjm/8AX/D2 27U+3pbbQliCcKOlBBJo4AA+gtfn/X/23tHIuroU20mgAAAdSmkHCjk/W97D/Yn8+2gp49KmcGij j0i5CzSywL/uypb/AG+tgB/tz7NlA0q58l6j2Vnaaa2UfHMf8JHS1oaMIq3H0AA/wA4Hsqml1E+n UibbYKiL28B04VEwgjsOG+g/qT/S39PbCKXb5dG93cC1h0p8fDr/0NCmTHu9OWYXdAGUjni1yP68 ey0TKJKDgehxJtcj2hZsyLkfZ6dM0kRQXIsR+D7VAg8OiGWIoDUUI65xpJOEp4oQ7MS62UeRmsBz IeRGBwBwCfbummAc9FJmXW0sh7F/4oD7fPqbJSRUsoofKjVDtaqkt6A/F4ImHJSP6E/lvp9Pd/hG PLpHradi5wtcf6v9WOsE4ikCxwRzEpqMxBKqyE6Vsp5B4H4ufehUZJx04ccOPSl2nlsbhd04rM5S Kskx2KqjWTJQJC9WDHG0FMyrMyRaUmZWYkggDjm3vbfDSueksqNLFIiU1sKZ4dH7xObw+fq9iDAz tW4dotxZ+WWJmDRy0uJTFQLFErftzCoyjjxuF9aG/PPvUdBJppinQfdHRZhIKSYH86/4B0hty7Nx +6QcPWfYBNUQozGVlqoIJ5JpJ6hFRFT76Npbvf6GwPHurL3jSwr1eGd4e9a1/l/xXSU2xkMj1Zlp tr5+uqp6mtqKHI7fz9QgWkkp8dRS00GP8rTkJVKItMY4uW+pvb3enEHj/hHT8gF2BPCgFAQQONTm v2dGWh3LHu7G19W2KDijocdkc7jtTJUVtIsrzV9JDFIR/lKxLG8dxyQb/X3WuleHb/qqPz8ukWjS /Hzpj/D+3oDOx8Pldrbrqt/dWY5pqMbfocrv7GU0qClqaXN1U1PjYZ8TEJTTZAQ0kkzsbFSQwHJB szq1HXAP8j0rtyrwm1u2xqoh9MVOfTgKdF43Xvul3F2LtjcNLNVS4/Cja1JDDVoYpKZKKrFbV0fj LWRYqqolU/hvqOD7qWOta+XRtBbGOymiYDW2r5jIwf2U6W/aPVTVz5XdG36OOhroWp5sjtynB0Vd P9ojTZLGrzJ53ca5ItP1Ylf6Fw4zSnSGzvdOiGVqxngfT5H5dAzgszTtB/Bc7rNDWPEYK9FaStxb wAeKKic2McjVCqjXPovq+g9ppEJIeM0Yf6v2dHPyOV6FLGbm3J17jWxlSKPKYSuYw5fau4I/4lsT d9M7feLUUUzsVwm44iGu8XiLtaSNrllOlKSggg/4D6Y/b9o6SSW9ZNYB8qMvxqeH5r/q4dQcl1pg d8UtfneopaoV1DTmuzvV+Znjbc+GRI3esm27VN4l3ZiIXS8YjX7xUdVZHYFjrvRgrAlfX/P/AJ+l MG4GLTHeEaTgSDgf9N/Cf5fZ0AjqyMyOrI6Eq6sCrKwNirKbEEH8H3fj0b4IBHXH3vr3XG3v1eql T12CR79QdbDEdZRyPdD0oXIr13b37q1D13b+vvXVqZz13puPfs9W0VHXRB9+r1QqeurH3uvVdJ49 dW9+r1orTrr3vqtOuvfuvU69791rr3v3Xuve/de697917rq3vfWqdet7916ma9et791qg66Pv3Wj 1x976pTOOPXve+tHrrn37rRqOHXXv3Ws+fXh78etAHrmPeunQKdd+9db679+6uOuXvXV6Y67H096 6sK0r1lVTa/vXz6fVTp65qCTx72T1cA14ddsv+sL/wCPHuvHrZUHjx64Hj3vHVDjrtTY/S/v3lx6 2MeXUkPxzbj+h+vulM46eDYoR1iPrPFhzb/H3YdvVDQ16xshte3HvfE9UZf2dYWFvex0ncBcdYr2 Pu9Okxahp14n8+9dbJHEnPXr+99aqDw69c+9dbqevW/p791qhPDrog2t+fe6jrRVqU8+uNj+T73X 0HTekgnU3XEnjg397A6ozYwa9cLX+nu1adNaSxxx69pN7e/V69oNadcwlyOOB7qW6eWKpApjrMCA fdKE9Kgyg0p1KgkJYKv9f9v7bYChr0sgkLEKo6e4Cy/1/qR/Qe0zAdCK2LKM9Yp2JIsePe1FOmLp 2JAB7eobvoF/9t7dAr0XPJoFa9RjUm1jY/1930D06TG6xQ56wmV2PJ4920gDpgzOzHOOuieP+J9+ 68Wxw64H3vpon066976qCc9et79Xr2k8eure/daoeuwPfutgdd+9dW67+nv3W6069791uvXfvXW6 08+vE+/deJFD1wt7tXprT1yAv70T04q16kRwlre6EgcelUcJNOp8cNh9D7aZiejCO386dSfSg4sT /vuPdOPSyqRLihPTdVTknQp4PJsf94/w9vIvmePRXd3LE6FOOoDE3tf26B0WOxqRXriPe+qD16yI LsB9b+6np9FqwHTrGulbfX/fc+07Gp6N4l0rwz1NgTXb/C/P+++vtt2oOjG3TXknqQbWsBcjgW/I /rz/AIe6ZrWuOlmKUAz0xUdP5MuIiOFmkcg88AM4v/r8e1cr0ttXyHQZ2+08XfvBIwJGP7AT/m6X J0xLYfW3H+t7KBVj8upLJS3j0r8XTXUSknUbG3FiOb/4f63tRGtcdEV3MWfUx4df/9HRIiYLGp5A Cgn/AGwvcW/PshYVY9S/CwVFYVpT/VjpgyUkUcolCKxZ9QVh6DoFyCOARqtcfke19qrEUJwB0D+Y pIkq6CkkjYp5Acaf4Pz650ULUkdTk6hRG62SniVAqPVyDyk6U+iUyENpFhrKj8e164889Aedw5WB eA4/6v5ft6b0qaiilEtRTLNFI19EykMPzYSCxRiWGq3Pupo3A56dVdIwM9YaSpsxV4h5Hk1mQsyp pUF/GQLm3p4A+ptfj3sitK9abgzA9C309ikzddumhakp66WowUa/byvEtRJSffxtVrRpJZHn0xqT Y8KDwfdJuApxr0X3jaEhNSFD/wCToRsbtPdvWWOqd9bQkp9y7dyaNjs5gqV6qmzGEmUiqVXh0GZD TlrqyalcXBB/DiqxTWCDT9o/2Pn0maeO6K29x2SA9rcQfLPQybOzuB3PU4jMYnITGCkV03HQqkf8 Zp6aPSaw1GPLeSKSCUEa9NntccH20B+oDWlOkc0TxBkdOPA+X5HzHUDsTC7e3Hm8btl62oyGJr83 DSU1bS1MrtS4yLFVdXC5jMYemqqSrdS1yVB4I9vS6dYKtVQP9X5jrVs8kKtIuHA9PmP8nTDt3ei7 Q3BTUOara6qxFSsFFTbvqaZ42r5qowRQ4vd9LBNJDA0SQaIKqKweMKXB5I8SpoBwp+3pxofGRmiU CUZKj/Ctf5g/l0YDZqrSbx7HgMIp6rP7gwm3WwRSGoQx7f27SqKivdl1qKw10jJfhlYEW9p5CYgw pVT/ACrw/L59J3bXFCPIAn9pz/g/l1XZ3ZTUtF2pveLGQCipYs5KkFNGhiWBY4YDZV+qOsgP+N7+ 7K1aA+VOhLYj/FIM17ejobQyWK3Vt2LNUdW09NWyU8D5CVk89Dk1R56nFZNUAmp6i5Glr6WRvSSt valACtSKdBmeN4JijDI8vIj1HQT9i9FT1mPy25Nv0VRFl2roKqowcJjfEZOlNDNWVWRxdTJHGkNa I4/MyayjqGW1+DUxHiP9Vel1puPhskUzfo0Ir5j/AGP8/Rdsfu+bHoMPuOgfL46OlEKY/IB4Z6KO crM0lN5k1xVVSjK+rm6BQp0n2meInKmjV6P1IoGBBHy6dxiFhnpdxbDytdO9AGr4YaeqNPm9vm4a HRLGwkMusMFT1K4Bvx7osrA6Zl+VeqPEjhqUzxHkftH+o9LjIU+3exKVW3LX4vC7zr5wMP2DSwyU u291VSxA1GC3nRWX+7m5ImZAKjxqjn9QZGWT294enUVyCa/n/s8ft6RQ3E1m2lEZoF+KMnuUV+JD +Jfl/gOOgJ3Bt3NbWytThc/jqjGZKlK+SnnUeqNxqinglQtDU0s6ENHLGzRyKQVJHugIIqOhBDLF cIJYXDIf9VD6H5cemW3vfThHXve+tdZ4wP8AY/090PSuECh9euen3qnTun5dd6R/the9xx79jrek evWSMC/1vxz702B1dAPI16yGNTc/T/W91DHh1coMnrC4RPqefdga+XTTaV4nrjo1C45H++/p73jr WkNkZ64mM+/fn1Qx164affq9U8Pjjrjb3uvVCvl11b37qtKddn37rZ66976r11791qnXvfuvde9+ 6911b3vqpHXXvfVeve/de66t791ojrjb3uvVCvXID3rqwHXfv3VuuwPeurAdd+9dW679+6t1kjUy MEH1JsP9f3Ummenok8Rgg4nh08yQRQ0q+VWjlPpFj/T82/ofadXZ5DpIKdHktrDb2ieNGy3BwOm4 MF4/2P8AxT2+QT0VgitOuXD/AI+n5/x964db+XWNxa/+9+7DI6q/n1hv/T3rpkt6deVj/j/re9nr SMTWvUiIXP8Ah/xPvTHHz6URitOsst9PpHui8c9OSVp2jpuYEXv/ALf28Oi2QMK149Yz7t0wRXr1 vfuvAV699Pfut0p137114Z65e9dOcOuLH/ff097A6o7EDrgb+7DplqmnXE/63vY6ow+XXXN/e+q5 rXrnYW/1/deniABUceutXvdOqhzwHDrscn3o8OtrUtXqbTD9wE/Qe2nOD0ZWgIcE8OnjyWH59puj 8S6QKdYHck3v9Px7sB0kklZmrXqJPYgE8/XkfT/D26nn0imoRk16gsv59uA9FzoTny67UW9+PVkF OPXuffuvVPXre/dbIx14L78T15UzTrkV/wB696r1cr1w976bIp1737rXXvfuvde9+691737r3Xfv 3WxXrlb/AH3++/r71Xq9OvBT79XqwQk8OpUcV7f090Zqfb0qji4DqdGoH1vYckj/AA9tHJ6XwqoF TWg6zqwb9P0H+8+68OPStHWT4BgdYZGX9K/43Puw9eks7J8KcemyRQCbD/ivt8cB0VyAZoM9Rvdu khBPEZ65BSeB79XqyoWNAOpcMR1Am9h/vfttmAHHPS2CE6genqCmL/Xjj/eP8P8Abe0ryBej+2tC /EeX8unCKAhVUC9r/i3+N/8AYD2wz1JPRpBakKqgVp1n8AH0t/j/AEvx9PdNRPn0p+kC0pk9MtK8 cWfqQfoYmUfT/OCKFj/0KfauQM1nH9v8qnoP2MkUHNF5q4aCPzCqf8h6c5Zxdjq+pNufp/h7Tqhx jo4nuas7auJx03vKWN2I0qpt/U3/AD7UBQBjz6K3mJYszDSB1//S0P4ZCQoJ+qgf7YD/AIj2SOtK kdStBISqivEdMru9XXRxwxxupnZYdY4vEPVIbmwhRvUxtyAB7M7ePSig/ERU9R/vl8ZriZ1YfToS q/kKFvtrwPUuqmVqulpYn101ACA7cq81/I8r/RWeSYlj+fb54HoPQrxcjJ6iTTVX+UQT6xC7eME2 CR+O7sxLC4eT6tb/AFvdQBgjj0oNeHl01RIyamZiI3W62B5ubK9m/SdINvz7vXPVHwox0LnT1bkM bupZcZiky8suIzS11EssUNbJj6aKnqJZcVJMREcnCELRRkgORpuL+/EE4rnpBehWgOtyAGFD5Vzx +Xr0dXZ2Z2/k6ygEGRMQgyL4z+NV0L0dSk8kFPN/DtzUDxxlJGmtAxYcEDS5Fz7rRwDpNGI6JnVs qyitK4yD8x8uglPW0VRHtzKbTz77a7GpRnJ8nkYqeSGLI5GXK108qTFDLBW0upzEP1aYwAwYAD23 roWpkg5H+bpYLpu5JIw1uQKD0FP5Hpt21urP7n39jNqbpxmLwm4MLNm5p6jGT/YU2eq6iGkpIfHE 14mMQSRyEazXNlUgj3V38NXmGVI9OHVpIIktzLCxMTU4+Wf9VOl1j8Hi6mtXbmWx8VaMzmMZQ1dN UQSJQPjjXRyTPK7GPx0ymHSkqHWrcAj25GyFlPkR0jZpBpZGIoCa+daeXSS3ZQbj6N7Aqa3aOVr9 x47IyS1dZhstWzVNZUUFLFAixQ1cnkn+9xlMyRQzKxLRKoIOmxclor6a4IqD/hHz+fSiGSO8i0Tq FZcBgKZPqPQ8T8/t6K52FuKn3dvTcG5KPy+LM1YrljnUJPHJNTweSCZRceSGbUhI9LFbjgj2wV04 PDoQWyGOCONuKinRqcL1ruHF4bHbj6++9bcGW/i1RldnVLSLic9RrWV1TDJQeWQouSbDyQNSSrYr KrLxcXdVu7Rq8+iGSeOQmO5FYxSjfiUin8q8R6H5dDtsXctDunZG5JMbFXJJhKTLRZ3C5apaDL7a qMbtyqjlmyFEHlZJajIa/EzIEcqwFiNIfhk7jGRn/N6dF1xC0LLqoVOVI4Gvof8AVx6g7w6ewm+a HaFHkaQCXP4TGU8WVpoqCGrxsuM2xLU0lc1Ssf3M6yrAq1EbtYqFHBF/dyofS1c8Ps+3q0V1LbSS tG3Ak04g54U4fMdET3L1/vrqrIGvWGplxqF5octSwyiJqTzvSxPXRlW+2EzoQFYlT+Dz7TOle1xn oRW19DdAaW0y+h/yevUfE5em3HVTyeXG4rNVFM9NLT1cCtg85G8bh46umK6YqjlfG6kSIw1KwIHt kB4T25TpTIiyAB6gjIIwR9n+qn29KldwY+fGU+zd/UtbkMHjzLDjKgMtVu3Y0kyJep27kJGRNybV MqgyUEregH0eOSzG4CPlDn/Vx6R6Z7aUzwELIePkknyYfhb0Yf4MdB3u3YuT2vHS5OKenzu1cqz/ AMD3ZidcuJySqTqp5GZRLjsrABaaknCTRMPoV0sa0PmOji2vo7kFKFLgfEh4j7PUehHSHHv3Ssce s8JAcFvp9D/sfdG4GnHpVAQHGrh1JlHj5P5vb/D+hHuqnV0ql/SHd1CJ9udF5NTxx1mRxGLjk/Q3 /wCI91IrjpQrhFBGeub1V1sFsf6396EdDXq73YZaBc9RXcu1yef98PbgFB0iklMjVJz15GZSCpIt z/vv9f3ogHiOtxu6EaT06rpdQw/I5H+9j2wSQadHChXUMPTriYb/AI/33/E+9h+qGE+nWFoT+B7t qB6aMR9OsTIR9fdhngemilOuJUj8e/dVKUFadcLe/V6b0nrjb3vqtOvW9760R6dde/dap1737rXX vfuvddW9761T166t791WnXre/deoeve/dep12Pfutgdd+9dW697917r3v3Xq56ywyeKWOS19DK1j yODf6e9MNSkevT0EvgzRy/wkHp8yNZDUxQ6f1j1G/wBBq/H+Nh7SwRtGz14dCPdL+C8itwn9oMn8 /Lpnv7VdEdc168H+oH++/r711oPxHn1xY3Hv1etOSQeu0AIsRx/j795dbQAilMdcioHAtf8Aw9+4 jh1sqAKDj10FdBc/T8fj36oOOtBWUVJx1mSUn8E2H++/HupUdOrJXh1HlIN/63P+wPuwxTpiYgr8 +o309349IQCvXvfutnro/wBfe+qn169f37r1R13f3rq1evH3vrRFR11pJ+n09+r69a0E4Xh1x0H3 uvVDGR14Dn36vXgtD14n34deY9cfe+m+sif0t/r+6t0oizinU6EgMB9P6+2m4HoyhIqo6dIkLH6f Xj/H2nJpno4t4zIcjB6zyUgC3H190WWp6US2K6MfF03vCBfUCbf1+n/G/b4c9FclvorUdQJFsT/v v9b26D0XSLmvWH3bpgjrsf7f3rrY6yBL+9dPhK56yFAov/r/APE+/Dj1fQoz59Ym9+p00/WM+7dM EZ669+611737rfXvfutdd29+6tTrkBf3qvTgUnrIqE/6/wDvv9h70eHTix+Z6zqgBAYgE/QH6n/i nvRPGg6eAGASK9ZXeKFbXDP/AKkH/ez+PbYDMfl087wwqasDJ6de+8jKhLEcWJH++v734ZB49W+u jMYjpQ0oadZ4Wslw1/6Efn/H/X91bicdPQOFjJDefl10ASSQP+J9660oLFiB1jki1fQc/wBfdlen HpuSGvAdRvASfd9Q6S+DU8Os0UFj/U+6s/p09DASQKdPNPSfkj62t/xv2leXyHR/bWNKGmenWKCw +n+v+B/sP9h7Ts1ePR5BakCtM9SAv10jgcXPuleFelaqM6BgddEiwH497APHrTMtAo4dIeZzHmnb 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 +RPX/9k= --gas1mX1Qbw=_aozdAkx6HFIG1JQwAFicKK-- From bfoster@redhat.com Tue Aug 30 15:28:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3C1727CA0 for ; Tue, 30 Aug 2016 15:28:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E3717304039 for ; Tue, 30 Aug 2016 13:28:24 -0700 (PDT) X-ASG-Debug-ID: 1472588903-0bf81509b03bae20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id m3zQnlb5mx7rhuBS (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Tue, 30 Aug 2016 13:28:23 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 04ACC81246; Tue, 30 Aug 2016 20:28:23 +0000 (UTC) Received: from bfoster.bfoster (dhcp-41-98.bos.redhat.com [10.18.41.98]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7UKSM9I026582; Tue, 30 Aug 2016 16:28:22 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1435B1208AB; Tue, 30 Aug 2016 16:28:21 -0400 (EDT) Date: Tue, 30 Aug 2016 16:28:21 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path Message-ID: <20160830202820.GA16503@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: rewrite and optimize the delalloc write path References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-5-git-send-email-hch@lst.de> <20160825143708.GD25041@bfoster.bfoster> <20160826143344.GB21535@lst.de> <20160826160339.GC17728@bfoster.bfoster> <20160826160753.GD17728@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160826160753.GD17728@bfoster.bfoster> User-Agent: Mutt/1.6.2 (2016-07-01) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Tue, 30 Aug 2016 20:28:23 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472588903 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3759 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 26, 2016 at 12:07:53PM -0400, Brian Foster wrote: > On Fri, Aug 26, 2016 at 12:03:39PM -0400, Brian Foster wrote: > > On Fri, Aug 26, 2016 at 04:33:44PM +0200, Christoph Hellwig wrote: > > > On Thu, Aug 25, 2016 at 10:37:09AM -0400, Brian Foster wrote: > ... > > > (we could potentially re-derive offset_fsb from offset if we don't > > > mind the inefficieny and recalculate maxbytes_fsb. This already > > > assumes mp is trivially derived from ip) > > > > > > and return > > > > > > alloc_blocks, end_fsb > > > > > > so the function would be quite a monster in terms of its calling > > > convention. Additionally we'd have the related by not qute the > > > same if blocks around XFS_MOUNT_DFLT_IOSIZE and the isize split > > > over two functions, which doesn't exactly help understanding > > > the flow. > > > > > > > Not quite sure I follow the last bit, but I don't necessarily think the > > whole thing has to be boxed into a helper to clean it up. E.g., I'd do > > something like the appended diff (compile tested only). > > > > ... and if the function signature is really an issue, trade off idx & > prev for a conditional base preallocation size (applies on top of the > previous diff): > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 45e5268..c748429 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -381,7 +381,7 @@ STATIC xfs_fsblock_t > xfs_iomap_prealloc_size( > struct xfs_inode *ip, > xfs_off_t offset, > - struct xfs_bmbt_irec *prev) > + xfs_extlen_t base) > { > struct xfs_mount *mp = ip->i_mount; > int shift = 0; > @@ -406,8 +406,8 @@ xfs_iomap_prealloc_size( > * always extends to MAXEXTLEN rather than falling short due to things > * like stripe unit/width alignment of real extents. > */ > - if (prev->br_blockcount <= (MAXEXTLEN >> 1)) > - alloc_blocks = prev->br_blockcount << 1; > + if (base <= (MAXEXTLEN >> 1)) > + alloc_blocks = base << 1; > else > alloc_blocks = XFS_B_TO_FSB(mp, offset); > if (!alloc_blocks) > @@ -506,12 +506,10 @@ xfs_iomap_prealloc( > struct xfs_inode *ip, > loff_t offset, > loff_t count, > - xfs_extnum_t idx, > - struct xfs_bmbt_irec *prev) > + xfs_extlen_t base) > { > struct xfs_mount *mp = ip->i_mount; > xfs_fsblock_t alloc_blocks; > - xfs_fileoff_t offset_fsb = XFS_B_TO_FSBT(mp, offset); > > if (offset + count <= XFS_ISIZE(ip)) > return 0; > @@ -526,12 +524,11 @@ xfs_iomap_prealloc( > */ > if ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) || > XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, mp->m_dalign) || > - idx == 0 || > - prev->br_startoff + prev->br_blockcount < offset_fsb) > + !base) > alloc_blocks = mp->m_writeio_blocks; > else > alloc_blocks = > - xfs_iomap_prealloc_size(ip, offset, prev); > + xfs_iomap_prealloc_size(ip, offset, base); > > return alloc_blocks; > } > @@ -603,8 +600,15 @@ xfs_file_iomap_begin_delay( > end_fsb = orig_end_fsb = > min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); > > - if (eof) > - prealloc = xfs_iomap_prealloc(ip, offset, count, idx, &prev); > + if (eof) { > + xfs_extlen_t base = 0; > + > + /* use prev extent as base if contiguous */ > + if (idx > 0 && > + prev.br_startoff + prev.br_blockcount < offset_fsb) This should probably be: startoff + blockcount == offset_fsb Brian > + base = prev.br_blockcount; > + prealloc = xfs_iomap_prealloc(ip, offset, count, base); > + } > if (prealloc) { > xfs_off_t aligned_offset; > xfs_extlen_t align; > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Aug 30 16:02:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 261FC7CA0 for ; Tue, 30 Aug 2016 16:02:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D9811304048 for ; Tue, 30 Aug 2016 14:02:16 -0700 (PDT) X-ASG-Debug-ID: 1472590932-0bf57c1b09d78c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 5My07qy0pIrEZyI3 for ; Tue, 30 Aug 2016 14:02:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2CuKADy88VXEAI1LHlcHBmDGAEBAQEBHld8gnmDeZwRAgoMAQEBAQEBBoEQAYtghhaEEByFewQCgWVNAQIBAQEBAQIGAQEBAQEBAQE3QIU+IxgkNAUlAwctiEO+SQ4ehUiKIYF+C4MHBYgtkSOGIIkEgWGNfgKQQYUWKjSGbAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail07.adl2.internode.on.net with ESMTP; 31 Aug 2016 06:31:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1beqA2-0004jT-Bv; Wed, 31 Aug 2016 07:01:34 +1000 Date: Wed, 31 Aug 2016 07:01:34 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-xfs@vger.kernel.org Subject: [ANNOUNCE] xfs: for-next branch updated to ea78d80 Message-ID: <20160830210134.GV19025@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfs: for-next branch updated to ea78d80 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Uu2n37VG4rOBDVuR" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1472590933 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 692 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32466 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Uu2n37VG4rOBDVuR Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The for-next branch of the xfs kernel repository at git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git has just been updated with another regression fix. -Dave. The new head of the for-next branch is commit: ea78d80 xfs: track log done items directly in the deferred pending work item New Commits: Darrick J. Wong (1): [ea78d80] xfs: track log done items directly in the deferred pending = work item Code Diffstat: fs/xfs/libxfs/xfs_defer.c | 17 ++++------------- fs/xfs/libxfs/xfs_defer.h | 2 +- fs/xfs/xfs_trace.h | 2 +- 3 files changed, 6 insertions(+), 15 deletions(-) --=20 Dave Chinner david@fromorbit.com --Uu2n37VG4rOBDVuR Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJXxfQtAAoJEK3oKUf0dfodh7QQAIlpUa1n169KB6V95G90x1ek jIhBkWme6WrLM5adbV9Ip8cXI+V7UHdkF7HDXYBsproNC9oCqiCzWJTQ2r3vzuhN aQJET9jaD72k3N5l+LtdKKc1G3Re2q1FuBysVMIEh+xkIGCOvF/xcq17eNj/Nwl/ r1UNKAadGuD9WI0ghaRNwfl05bJw9JWgaGNDSPbW2/zy9Nc+npjw1Saf/o+ab9A1 rVq5ML9/Ia21ai7SyldEqJRpZpSSv9xPWzsI2Y5fVg4gdeg5t9arMmzw2LYw3d4B 6+aZjdiJxyPtcBNpfuBDFdlgAxu5WmAlf2Ja8YGeX6eEYLexwBiSccd2ajDa21DI 9EkLqiYM3STmOzNYPG81KjqIalRHMC8D3KH8NLZmn7Gus4fWiqH6gzn1epgEoFye hfXurazL4smh8rcY9lNjXK6hufjgPB0ENkC2Y1Kp3LslL8mNulO1KhuKeOWkOCTO Hq0Tsu6fyjL2SKl00nWum9F1E1vpbbsMeL/QxeuzkH26EvFmPAIl1dpIdAYVm16S LAch6gEp3pEX6kS+WXq90LBa53zDre3xivX0xJiKeDovkv8I2C1DPJQ3jXLc52IH I+O3FkQrJfoxWXNzF9rcljbbnzDPeSCCT7q0CBlOMA3YpcClLs7ZYHbY4AUEWJKc 6uQ6jp+5o5Jz7IKflfeY =gO5J -----END PGP SIGNATURE----- --Uu2n37VG4rOBDVuR-- From fkimasyu@ares.eonet.ne.jp Tue Aug 30 16:40:20 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,T_DKIM_INVALID,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 85C9A7CA0 for ; Tue, 30 Aug 2016 16:40:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 48033304043 for ; Tue, 30 Aug 2016 14:40:17 -0700 (PDT) X-ASG-Debug-ID: 1472593212-0bf57c1b09d90c0001-NocioJ Received: from mta02.eonet.ne.jp (mta02.eonet.ne.jp [203.140.81.51]) by cuda.sgi.com with ESMTP id QPqLmGtJmiTF3EZv (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 30 Aug 2016 14:40:14 -0700 (PDT) X-Barracuda-Envelope-From: fkimasyu@ares.eonet.ne.jp X-Barracuda-Effective-Source-IP: mta02.eonet.ne.jp[203.140.81.51] X-Barracuda-Apparent-Source-IP: 203.140.81.51 Received: from mailmbsa1nc4.mozu.eo.k-opti.ad.jp (mbs03.eonet.ne.jp [60.56.6.201]) by mailauthmsa12.mozu.eo.k-opti.ad.jp with ESMTP id u7ULDNXt012533; Wed, 31 Aug 2016 06:13:23 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ares.eonet.ne.jp; s=k02; t=1472591772; bh=0pOz/39yuRSt1MynoZx34yhbEGlVSA0/gC/J0QHIgFs=; h=Date:From:Reply-To:In-Reply-To:Subject; b=vTAPIQKqpj7CtxHa8XtkBE709zJ0QG8+53L1c+ZdLn+mPbrPPsciuKX86+AcINmQv cvdyci3i5eG6v5DHz1I+ScuyCEt3z9l3Hi37GTsk4wxiWSFwS1IIiGVgI4Oti0C5s5 RWXMr1Tkg4qwoe5scLpxN5wHqWsp1ymVqpoX73xM= Date: Wed, 31 Aug 2016 06:13:23 +0900 (JST) From: Ruth Williams Reply-To: "ruthwilliams221@yahoo.co.jp" Message-ID: <1787843111.75110365.1472591603757.JavaMail.root@ares.eonet.ne.jp> In-Reply-To: <358462507.75110364.1472591595282.JavaMail.root@ares.eonet.ne.jp> Subject: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [::ffff:178.162.216.36] X-Mailer: Zimbra Mailer (ZimbraWebClient - GC52 (Win)/0.0) X-Authenticated-User: fkimasyu@ares.eonet.ne.jp Thread-Topic: =?utf-8?Q?K=C3=B6nnen?= Sie mir helfen zu investieren !!! Thread-Index: KJL5PN5LGtHZK77JugeukjZyUp+qZA== X-Barracuda-Connect: mta02.eonet.ne.jp[203.140.81.51] X-Barracuda-Start-Time: 1472593213 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 409 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.89 X-Barracuda-Spam-Status: No, SCORE=1.89 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e, DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS, PLING_PLING, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.46 PLING_PLING Subject has lots of exclamation marks 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e To: undisclosed-recipients:; Sehr geehrte Damen und Herren, Ich brauche Ihre Unterst=C3=BCtzung in Ihrem Land zu verlagern und zu inves= tieren. Ich bitte Sie um Hilfe, weil ich nicht das Wissen =C3=BCber Gesch= =C3=A4ft und die Regeln, die ihr Land f=C3=BCr eine sichere Investition f= =C3=BChren. Werden Sie versprechen, mit mir aufrichtig zu sein? Bitte kontaktieren Sie mich f=C3=BCr weitere Details! Mit freundlichen Gr=C3=BC=C3=9Fen, Fr=C3=A4ulein Ruth Williams From fkimasyu@ares.eonet.ne.jp Tue Aug 30 16:50:43 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,T_DKIM_INVALID,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A3E4D7CA0 for ; Tue, 30 Aug 2016 16:50:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 27688AC002 for ; Tue, 30 Aug 2016 14:50:40 -0700 (PDT) X-ASG-Debug-ID: 1472593835-0bf57b53143f45e0001-NocioJ Received: from mta02.eonet.ne.jp (mta02.eonet.ne.jp [203.140.81.48]) by cuda.sgi.com with ESMTP id 1IhR6GDYdjPibIil (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 30 Aug 2016 14:50:37 -0700 (PDT) X-Barracuda-Envelope-From: fkimasyu@ares.eonet.ne.jp X-Barracuda-Effective-Source-IP: mta02.eonet.ne.jp[203.140.81.48] X-Barracuda-Apparent-Source-IP: 203.140.81.48 Received: from mailmbsa1nc4.mozu.eo.k-opti.ad.jp (mbs03.eonet.ne.jp [60.56.6.201]) by mailauthmsa11.mozu.eo.k-opti.ad.jp with ESMTP id u7ULR5Gw007845; Wed, 31 Aug 2016 06:27:05 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ares.eonet.ne.jp; s=k02; t=1472592588; bh=0pOz/39yuRSt1MynoZx34yhbEGlVSA0/gC/J0QHIgFs=; h=Date:From:Reply-To:In-Reply-To:Subject; b=H1Kneyj0dDdgCZY/jUHAoY00EJtT2J3mGUWoK0tjEybYHhropSrA8Nnn4Cg8eFYLy W75YxPUvwDAO7A4/x73uChwqLG5biJmy1Kv5AWp3ue5keweKrYBw/QgCbLg4bpOp8D EMwGuQee7Coc6gxp550EDDRztk6mBiqPxSZWoPxg= Date: Wed, 31 Aug 2016 06:27:05 +0900 (JST) From: Ruth Williams Reply-To: "ruthwilliams221@yahoo.co.jp" Message-ID: <1482324040.75112059.1472592425771.JavaMail.root@ares.eonet.ne.jp> In-Reply-To: <1318114480.75112035.1472592415340.JavaMail.root@ares.eonet.ne.jp> Subject: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [::ffff:91.109.30.78] X-Mailer: Zimbra Mailer (ZimbraWebClient - GC52 (Win)/0.0) X-Authenticated-User: fkimasyu@ares.eonet.ne.jp Thread-Topic: =?utf-8?Q?K=C3=B6nnen?= Sie mir helfen zu investieren !!! Thread-Index: d1ci/0KV9ZxRNtMY5v20E7bJEEwGNQ== X-Barracuda-Connect: mta02.eonet.ne.jp[203.140.81.48] X-Barracuda-Start-Time: 1472593836 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 409 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.89 X-Barracuda-Spam-Status: No, SCORE=1.89 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e, DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS, PLING_PLING, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32468 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.46 PLING_PLING Subject has lots of exclamation marks 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e To: undisclosed-recipients:; Sehr geehrte Damen und Herren, Ich brauche Ihre Unterst=C3=BCtzung in Ihrem Land zu verlagern und zu inves= tieren. Ich bitte Sie um Hilfe, weil ich nicht das Wissen =C3=BCber Gesch= =C3=A4ft und die Regeln, die ihr Land f=C3=BCr eine sichere Investition f= =C3=BChren. Werden Sie versprechen, mit mir aufrichtig zu sein? Bitte kontaktieren Sie mich f=C3=BCr weitere Details! Mit freundlichen Gr=C3=BC=C3=9Fen, Fr=C3=A4ulein Ruth Williams From fkimasyu@ares.eonet.ne.jp Tue Aug 30 16:50:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,T_DKIM_INVALID,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2FAD97CA0 for ; Tue, 30 Aug 2016 16:50:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B71E4AC002 for ; Tue, 30 Aug 2016 14:50:55 -0700 (PDT) X-ASG-Debug-ID: 1472593852-0bf8155c753c8060001-NocioJ Received: from mta02.eonet.ne.jp (mta02.eonet.ne.jp [203.140.81.50]) by cuda.sgi.com with ESMTP id CzGx1ATHohWOsaop (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 30 Aug 2016 14:50:53 -0700 (PDT) X-Barracuda-Envelope-From: fkimasyu@ares.eonet.ne.jp X-Barracuda-Effective-Source-IP: mta02.eonet.ne.jp[203.140.81.50] X-Barracuda-Apparent-Source-IP: 203.140.81.50 Received: from mailmbsa1nc4.mozu.eo.k-opti.ad.jp (mbs03.eonet.ne.jp [60.56.6.201]) by mailauthmsa11.mozu.eo.k-opti.ad.jp with ESMTP id u7ULToUf014625; Wed, 31 Aug 2016 06:29:51 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ares.eonet.ne.jp; s=k02; t=1472592743; bh=0pOz/39yuRSt1MynoZx34yhbEGlVSA0/gC/J0QHIgFs=; h=Date:From:Reply-To:In-Reply-To:Subject; b=OVf4532DXb5XWpyLqMHDJmRbiocRMDYnSl/qnZc5rK1uP4h0DE27C+W2t34MLcVep l5Yn3mzs8U7LRi4td+jY5I6+BtQjQq3Pn0c5/TFIi7ipagOLvj6bBXVpRcLipeTRGz fZppujg4mds2nKR5XDdLGtvrJIumhSE0DsiAXufU= Date: Wed, 31 Aug 2016 06:29:50 +0900 (JST) From: Ruth Williams Reply-To: "ruthwilliams221@yahoo.co.jp" Message-ID: <1060528865.75112336.1472592590909.JavaMail.root@ares.eonet.ne.jp> In-Reply-To: <1318114480.75112035.1472592415340.JavaMail.root@ares.eonet.ne.jp> Subject: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [::ffff:91.109.30.78] X-Mailer: Zimbra Mailer (ZimbraWebClient - GC52 (Win)/0.0) X-Authenticated-User: fkimasyu@ares.eonet.ne.jp Thread-Topic: =?utf-8?Q?K=C3=B6nnen?= Sie mir helfen zu investieren !!! Thread-Index: Ir28pfusX1ppJSv59hcvXqkt5fbd0A== X-Barracuda-Connect: mta02.eonet.ne.jp[203.140.81.50] X-Barracuda-Start-Time: 1472593852 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 409 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.89 X-Barracuda-Spam-Status: No, SCORE=1.89 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e, DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS, PLING_PLING, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.46 PLING_PLING Subject has lots of exclamation marks 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e To: undisclosed-recipients:; Sehr geehrte Damen und Herren, Ich brauche Ihre Unterst=C3=BCtzung in Ihrem Land zu verlagern und zu inves= tieren. Ich bitte Sie um Hilfe, weil ich nicht das Wissen =C3=BCber Gesch= =C3=A4ft und die Regeln, die ihr Land f=C3=BCr eine sichere Investition f= =C3=BChren. Werden Sie versprechen, mit mir aufrichtig zu sein? Bitte kontaktieren Sie mich f=C3=BCr weitere Details! Mit freundlichen Gr=C3=BC=C3=9Fen, Fr=C3=A4ulein Ruth Williams From fkimasyu@ares.eonet.ne.jp Tue Aug 30 16:55:00 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,T_DKIM_INVALID,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 839B87CA0 for ; Tue, 30 Aug 2016 16:55:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0469CAC002 for ; Tue, 30 Aug 2016 14:54:59 -0700 (PDT) X-ASG-Debug-ID: 1472594096-0bf8155c753c8b70001-NocioJ Received: from mta02.eonet.ne.jp (mta02.eonet.ne.jp [203.140.81.49]) by cuda.sgi.com with ESMTP id NTEos0ZAW13do2qw (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 30 Aug 2016 14:54:57 -0700 (PDT) X-Barracuda-Envelope-From: fkimasyu@ares.eonet.ne.jp X-Barracuda-Effective-Source-IP: mta02.eonet.ne.jp[203.140.81.49] X-Barracuda-Apparent-Source-IP: 203.140.81.49 Received: from mailmbsa1nc4.mozu.eo.k-opti.ad.jp (mbs03.eonet.ne.jp [60.56.6.201]) by mailauthmsa12.mozu.eo.k-opti.ad.jp with ESMTP id u7ULSRxF027755; Wed, 31 Aug 2016 06:28:27 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ares.eonet.ne.jp; s=k02; t=1472592676; bh=0pOz/39yuRSt1MynoZx34yhbEGlVSA0/gC/J0QHIgFs=; h=Date:From:Reply-To:In-Reply-To:Subject; b=W7SSFsCrfofebTaVNq5mRf50D8hrIz9FDATVJl4BnW4YYj1x+C0V35h1tArpd4moJ C3PBkbsBGcANYqA5cVWMJiaW3RoN8aiXkYboBTTjjsvLeEEa859DGNmsJF+frqUCiq bqJ5UBqcS95UezcLqENARkFb3bLgcI2NoCGQihO8= Date: Wed, 31 Aug 2016 06:28:27 +0900 (JST) From: Ruth Williams Reply-To: "ruthwilliams221@yahoo.co.jp" Message-ID: <1869825920.75112222.1472592507355.JavaMail.root@ares.eonet.ne.jp> In-Reply-To: <1318114480.75112035.1472592415340.JavaMail.root@ares.eonet.ne.jp> Subject: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [::ffff:91.109.30.78] X-Mailer: Zimbra Mailer (ZimbraWebClient - GC52 (Win)/0.0) X-Authenticated-User: fkimasyu@ares.eonet.ne.jp Thread-Topic: =?utf-8?Q?K=C3=B6nnen?= Sie mir helfen zu investieren !!! Thread-Index: Yr/ypuiKbYxpExEo1OkLjLDuWW9+DA== X-Barracuda-Connect: mta02.eonet.ne.jp[203.140.81.49] X-Barracuda-Start-Time: 1472594097 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 409 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.89 X-Barracuda-Spam-Status: No, SCORE=1.89 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e, DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS, PLING_PLING, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.46 PLING_PLING Subject has lots of exclamation marks 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e To: undisclosed-recipients:; Sehr geehrte Damen und Herren, Ich brauche Ihre Unterst=C3=BCtzung in Ihrem Land zu verlagern und zu inves= tieren. Ich bitte Sie um Hilfe, weil ich nicht das Wissen =C3=BCber Gesch= =C3=A4ft und die Regeln, die ihr Land f=C3=BCr eine sichere Investition f= =C3=BChren. Werden Sie versprechen, mit mir aufrichtig zu sein? Bitte kontaktieren Sie mich f=C3=BCr weitere Details! Mit freundlichen Gr=C3=BC=C3=9Fen, Fr=C3=A4ulein Ruth Williams From fkimasyu@ares.eonet.ne.jp Tue Aug 30 16:55:45 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,T_DKIM_INVALID,T_FRT_CONTACT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D94237CA0 for ; Tue, 30 Aug 2016 16:55:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AB30E8F8052 for ; Tue, 30 Aug 2016 14:55:42 -0700 (PDT) X-ASG-Debug-ID: 1472594137-0bf57c1b0bda870001-NocioJ Received: from mta02.eonet.ne.jp (mta02.eonet.ne.jp [203.140.81.49]) by cuda.sgi.com with ESMTP id 4ATTpeWPD1CJrrOk (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 30 Aug 2016 14:55:38 -0700 (PDT) X-Barracuda-Envelope-From: fkimasyu@ares.eonet.ne.jp X-Barracuda-Effective-Source-IP: mta02.eonet.ne.jp[203.140.81.49] X-Barracuda-Apparent-Source-IP: 203.140.81.49 Received: from mailmbsa1nc4.mozu.eo.k-opti.ad.jp (mbs03.eonet.ne.jp [60.56.6.201]) by mailauthmsa12.mozu.eo.k-opti.ad.jp with ESMTP id u7UL0TCC008823; Wed, 31 Aug 2016 06:00:29 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ares.eonet.ne.jp; s=k02; t=1472590886; bh=0pOz/39yuRSt1MynoZx34yhbEGlVSA0/gC/J0QHIgFs=; h=Date:From:Reply-To:In-Reply-To:Subject; b=EnyUzib0YAjxgPrhdKNhCFuFaIcDDTNGN+rLt2rC6E+jlStTLnMQ9QaLIkk52X7xB Vh6fevnks4IbMqJzY/+mjm/aaUJ6Pu82XOW/bABXWajP9GOK6iXoDOR6Hqd99lzrg4 2otVYNZAAUrjBFEBhqumzsz+saL5uY+uYBs//g+w= Date: Wed, 31 Aug 2016 06:00:29 +0900 (JST) From: Ruth Williams Reply-To: "ruthwilliams221@yahoo.co.jp" Message-ID: <1274743559.75109215.1472590829452.JavaMail.root@ares.eonet.ne.jp> In-Reply-To: <1640794472.75109043.1472590693142.JavaMail.root@ares.eonet.ne.jp> Subject: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?utf-8?Q?K=C3=B6nnen_Sie_mir_helfen_zu_investieren_!!!?= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Originating-IP: [::ffff:103.10.197.218] X-Mailer: Zimbra Mailer (ZimbraWebClient - GC52 (Win)/0.0) X-Authenticated-User: fkimasyu@ares.eonet.ne.jp Thread-Topic: =?utf-8?Q?K=C3=B6nnen?= Sie mir helfen zu investieren !!! Thread-Index: bjB8n6EzIoKtWZzFwmXcB80YPJ45Gg== X-Barracuda-Connect: mta02.eonet.ne.jp[203.140.81.49] X-Barracuda-Start-Time: 1472594138 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 409 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.89 X-Barracuda-Spam-Status: No, SCORE=1.89 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC7_SA298e, DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS, PLING_PLING, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32468 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.46 PLING_PLING Subject has lots of exclamation marks 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e To: undisclosed-recipients:; Sehr geehrte Damen und Herren, Ich brauche Ihre Unterst=C3=BCtzung in Ihrem Land zu verlagern und zu inves= tieren. Ich bitte Sie um Hilfe, weil ich nicht das Wissen =C3=BCber Gesch= =C3=A4ft und die Regeln, die ihr Land f=C3=BCr eine sichere Investition f= =C3=BChren. Werden Sie versprechen, mit mir aufrichtig zu sein? Bitte kontaktieren Sie mich f=C3=BCr weitere Details! Mit freundlichen Gr=C3=BC=C3=9Fen, Fr=C3=A4ulein Ruth Williams From david@fromorbit.com Tue Aug 30 18:03:56 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 287DA7CA0 for ; Tue, 30 Aug 2016 18:03:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E0E9C8F8050 for ; Tue, 30 Aug 2016 16:03:52 -0700 (PDT) X-ASG-Debug-ID: 1472598222-0bf8155c773d2e00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id lYgVUijvmxdDOVfK for ; Tue, 30 Aug 2016 16:03:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2AFJABGEMZXEAI1LHlcHAEBBAEBgykBAQEBAR6BU4J5g3mcKwEBAQEBAQaMcYNrgiuEEIYXBAICgWRNAQIBAQEBAQIGAQEBAQEBAQE3QIRiAQEEOhwjEAgDDgoJJQ8FJQMHGhOIQ748AQEIAiUehUiFFYocBZlQjySPYUiMAIN5g0+BRyo0hmwBAQE Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail07.adl2.internode.on.net with ESMTP; 31 Aug 2016 08:33:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1bes3s-0004zF-Tw; Wed, 31 Aug 2016 09:03:20 +1000 Date: Wed, 31 Aug 2016 09:03:20 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case Message-ID: <20160830230320.GW19025@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: make xfs_inode_set_eofblocks_tag cheaper for the common case References: <1471816273-28940-1-git-send-email-hch@lst.de> <1471816273-28940-4-git-send-email-hch@lst.de> <20160825123808.GC25041@bfoster.bfoster> <20160826142616.GA21535@lst.de> <20160826160209.GB17728@bfoster.bfoster> <20160830144006.GA14504@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160830144006.GA14504@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1472598222 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 1039 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32473 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 30, 2016 at 04:40:06PM +0200, Christoph Hellwig wrote: > On Fri, Aug 26, 2016 at 12:02:09PM -0400, Brian Foster wrote: > > > I don't think taking it should be too bad, but given the ops ordering > > > it also seems entirely pointless to even take it. > > > > > > > Then why are we taking it? I assumed it at least served as a memory > > barrier... > > I meant to take it for that early check, not in general. > > I guess this is another hint we should try to look into using proper > atomic bitops here.. I think we've looked at that in the past, but there were cases where we have to do things atomically with setting/clearing the flags and that required the spinlock to protect the flag modifications as well. IIRC there are also cases where we have to check/set multiple flags at once, which we cannot do with atomic bit ops. Perhaps the code has changed enough that there isn't a problem anymore, but I don't think that is the case... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 30 19:01:33 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 75D6D7CA0 for ; Tue, 30 Aug 2016 19:01:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B77D8F8052 for ; Tue, 30 Aug 2016 17:01:29 -0700 (PDT) X-ASG-Debug-ID: 1472601686-0bf8155c743d8710001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id iCevv1LF95TPEwAW for ; Tue, 30 Aug 2016 17:01:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2BGJQAjHcZXEAI1LHlcHAEBBAEBgykBAQEBAR6BU4J5g3mcKwEBAQEBAQaMcYYWhBCGFwICAQECgWNNAQIBAQEBAQIGAQEBAQEBAQE3QIRiAQEEOhwjEAgDDgoJJQ8FJQMHGhOIQ74lAQEBBwIBJB6FSIUVihwFiC2RI48kj2FIjACDeYMbHIFfKjSGbAEBAQ Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail07.adl2.internode.on.net with ESMTP; 31 Aug 2016 09:30:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1besxX-00053z-KE; Wed, 31 Aug 2016 10:00:51 +1000 Date: Wed, 31 Aug 2016 10:00:51 +1000 From: Dave Chinner To: Zorro Lang Cc: fstests@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs/187: fix new sb_features2 ftype stop case running Message-ID: <20160831000051.GV22388@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs/187: fix new sb_features2 ftype stop case running References: <1472542532-16497-1-git-send-email-zlang@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1472542532-16497-1-git-send-email-zlang@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1472601686 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 3473 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32475 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Tue, Aug 30, 2016 at 03:35:32PM +0800, Zorro Lang wrote: > This case is too old, at that time there's no "ftype" feature for > XFS. Due to this case need to clear features2 bits when mkfs.xfs, > so ftype bit stop case running for long time. > > We care 6 features2 bits in this case: > > "ATTR2, LAZYSBCOUNT, PROJID32BIT, CRC, FTYPE, FINOBT" > > ATTR2 and LAZYSBCOUNT bits will be tested in case. FINBOT will be > disabled if CRC=0. So this patch only check and disable PROJID32BIT, > CRC and FTYPE features when mkfs.xfs. > > Signed-off-by: Zorro Lang > --- > > Hi, > > I think we shouldn't skip this case if user doesn't specify suitable > MKFS_OPTIONS and MOUNT_OPTIONS. Because this case need complex options, > nearly no one will specify these all options for xfstests at same time. > > Thanks, > Zorro > > tests/xfs/187 | 51 ++++++++++++++++++++++++++++----------------------- > 1 file changed, 28 insertions(+), 23 deletions(-) > > diff --git a/tests/xfs/187 b/tests/xfs/187 > index 836b924..5e7c677 100755 > --- a/tests/xfs/187 > +++ b/tests/xfs/187 > @@ -31,7 +31,6 @@ seq=`basename $0` > seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > -here=`pwd` > tmp=/tmp/$$ > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > @@ -58,24 +57,32 @@ _supported_os Linux > > _require_scratch > _require_attrs > -_require_attr_v1 > -_require_projid16bit > > rm -f $seqres.full > - > +_scratch_mkfs >/dev/null 2>&1 > # Reset the options so that we can control what is going on here > -export MKFS_OPTIONS="" > -export MOUNT_OPTIONS="" > - > -# lazysb, attr2 and other feature bits are held in features2 and will require > -# morebitsbit on So test with lazysb and without it to see if the morebitsbit is > -# okay etc. If the mkfs defaults change, these need to change as well. > -export MKFS_NO_LAZY="-m crc=0 -l lazy-count=0 -i projid32bit=0" > -export MKFS_LAZY="-m crc=0 -l lazy-count=1 -i projid32bit=0" > +MKFS_OPTIONS="" > +MOUNT_OPTIONS="" > +ver2=`$XFS_DB_PROG -c version $SCRATCH_DEV | sed -n -e "s/,/ /g" \ > + -e "s/.*MOREBITS\(.*\)/\1/p"` > +# clear features2 bits which we won't test > +for b in $ver2; do > + case $b in > + CRC) > + MKFS_OPTIONS="$MKFS_OPTIONS -m crc=0" > + ;; > + PROJID32BIT) > + MKFS_OPTIONS="$MKFS_OPTIONS -i projid32bit=0" > + ;; > + FTYPE) > + MKFS_OPTIONS="$MKFS_OPTIONS -n ftype=0" > + ;; > + esac > +done We're doing stuff like this in way too many places to keep old tests working with new xfsprogs as the defaults change and new options are added. This is not maintainable in the long run. I think we need to start marking test as requiring "old" filesystem formats, and we configure the mkfs options required to create such a filesystem in one place. i.e. add a rule: _require_old_xfs_format() { # calculate necessary additional options to ensure # 16 bit project id, no CRCs, and no ftype. BASIC_MKFS_OPTIONS=..... # add "old" option to default mkfs option set export MKFS_OPTION=S"$MKFS_OPTIONS $BASIC_MKFS_OPTIONS" } And now any specific test that relies on a format not having CRCs, ftype, etc, can simply _require_old_xfs_format(), and so we can get rid of all the per-test magic we have to futz mkfs options into the "old" format the test requires. Cheers, Dave. -- Dave Chinner david@fromorbit.com From eguan@redhat.com Wed Aug 31 03:56:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C7C577CA0 for ; Wed, 31 Aug 2016 03:56:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2510CAC003 for ; Wed, 31 Aug 2016 01:56:05 -0700 (PDT) X-ASG-Debug-ID: 1472633763-0bf57b5313442190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zH9gVHbrV8Fe36s0 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 31 Aug 2016 01:56:03 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 02F0D4E4CC for ; Wed, 31 Aug 2016 08:56:03 +0000 (UTC) Received: from localhost (dhcp-13-153.nay.redhat.com [10.66.13.153]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7V8u1jZ023276 for ; Wed, 31 Aug 2016 04:56:02 -0400 Date: Wed, 31 Aug 2016 16:56:01 +0800 From: Eryu Guan To: xfs@oss.sgi.com Subject: Re: BUG: Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c Message-ID: <20160831085601.GR27776@eguan.usersys.redhat.com> X-ASG-Orig-Subj: Re: BUG: Internal error xfs_trans_cancel at line 984 of file fs/xfs/xfs_trans.c References: <20160829103754.GH27776@eguan.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <20160829103754.GH27776@eguan.usersys.redhat.com> User-Agent: Mutt/1.6.1 (2016-04-27) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 31 Aug 2016 08:56:03 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472633763 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 4177 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 29, 2016 at 06:37:54PM +0800, Eryu Guan wrote: > Hi, >=20 > I've hit an XFS internal error then filesystem shutdown with 4.8-rc3 > kernel but not with 4.8-rc2 Sometimes I hit the following warning instead of the fs shutdown, if I lowered the stress load. [15276.032482] ------------[ cut here ]------------ [15276.055649] WARNING: CPU: 1 PID: 5535 at fs/xfs/xfs_aops.c:1069 xfs_vm_r= eleasepage+0x106/0x130 [xfs] [15276.101221] Modules linked in: xt_CHECKSUM ipt_MASQUERADE nf_nat_masquer= ade_ipv4 tun ipt_REJECT nf_reject_ipv4 ip6t_rpfilter ip6t_REJECT nf_reject_= ipv6 xt_conntrack ip_set nfnetlink ebtable_nat ebtable_broute bridge stp ll= c ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle= ip6table_security ip6table_raw iptable_nat nf_conntrack_ipv4 nf_defrag_ipv= 4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_r= aw ebtable_filter ebtables ip6table_filter ip6_tables iptable_filter intel_= rapl sb_edac edac_core x86_pkg_temp_thermal intel_powerclamp coretemp kvm_i= ntel kvm irqbypass crct10dif_pclmul crc32_pclmul ghash_clmulni_intel aesni_= intel lrw gf128mul iTCO_wdt glue_helper ipmi_ssif ablk_helper iTCO_vendor_s= upport cryptd i2c_i801 hpwdt ipmi_si hpilo sg pcspkr wmi i2c_smbus ioatdma = ipmi_msghandler pcc_cpufreq lpc_ich dca shpchp acpi_cpufreq acpi_power_mete= r nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c sd_mo= d mgag200 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_= sys_fops ttm drm tg3 uas ptp serio_raw usb_storage crc32c_intel hpsa i2c_co= re pps_core scsi_transport_sas fjes dm_mirror dm_region_hash dm_log dm_mod [15276.593111] CPU: 1 PID: 5535 Comm: bash-shared-map Not tainted 4.8.0-rc3= #1 [15276.627509] Hardware name: HP ProLiant DL360 Gen9, BIOS P89 05/06/2015 [15276.658663] 0000000000000286 00000000b9ab484d ffff88085269f500 ffffffff= 8135c53c [15276.693463] 0000000000000000 0000000000000000 ffff88085269f540 ffffffff= 8108d661 [15276.728306] 0000042d18524440 ffffea0018524460 ffffea0018524440 ffff8808= 5e615028 [15276.762986] Call Trace: [15276.774250] [] dump_stack+0x63/0x87 [15276.798320] [] __warn+0xd1/0xf0 [15276.820742] [] warn_slowpath_null+0x1d/0x20 [15276.848141] [] xfs_vm_releasepage+0x106/0x130 [xfs] [15276.878802] [] try_to_release_page+0x3d/0x60 [15276.906568] [] shrink_page_list+0x83c/0x9b0 [15276.933952] [] shrink_inactive_list+0x21d/0x570 [15276.962881] [] shrink_node_memcg+0x51e/0x7d0 [15276.990564] [] ? mem_cgroup_iter+0x127/0x2c0 [15277.017923] [] shrink_node+0xe1/0x310 [15277.042940] [] do_try_to_free_pages+0xeb/0x370 [15277.071624] [] try_to_free_pages+0xef/0x1b0 [15277.100457] [] __alloc_pages_slowpath+0x33d/0x865 [15277.132333] [] __alloc_pages_nodemask+0x2d4/0x320 [15277.162990] [] alloc_pages_current+0x88/0x120 [15277.191163] [] __page_cache_alloc+0xae/0xc0 [15277.218596] [] __do_page_cache_readahead+0xf8/0x250 [15277.249416] [] ? mark_buffer_dirty+0x91/0x120 [15277.277823] [] ? radix_tree_lookup+0xd/0x10 [15277.305062] [] ondemand_readahead+0x135/0x260 [15277.332764] [] page_cache_async_readahead+0x6c/0x70 [15277.363440] [] filemap_fault+0x393/0x550 [15277.389663] [] xfs_filemap_fault+0x5f/0xf0 [xfs] [15277.418997] [] __do_fault+0x7f/0x100 [15277.443617] [] ? xfs_vm_set_page_dirty+0xc4/0x1e0 [xf= s] [15277.475880] [] handle_mm_fault+0x65d/0x1300 [15277.503198] [] __do_page_fault+0x1cb/0x4a0 [15277.530218] [] do_page_fault+0x30/0x80 [15277.555708] [] page_fault+0x28/0x30 [15277.579871] ---[ end trace 5211814c2a051103 ]--- And I'm still trying to find a more reliable & efficient reproducer. Thanks, Eryu From cmaiolino@redhat.com Wed Aug 31 04:49:38 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 448B87CA0 for ; Wed, 31 Aug 2016 04:49:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF8C6304032 for ; Wed, 31 Aug 2016 02:49:37 -0700 (PDT) X-ASG-Debug-ID: 1472636975-0bf57c1b0b129180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Lz6OkoPXGPLIxd0I (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 31 Aug 2016 02:49:36 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AAFC790E54 for ; Wed, 31 Aug 2016 09:49:35 +0000 (UTC) Received: from redhat.com (gfs-i24c-02.mpc.lab.eng.bos.redhat.com [10.16.144.214]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7V9nXUi001666 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 31 Aug 2016 05:49:35 -0400 Date: Wed, 31 Aug 2016 05:49:33 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: Document error handlers behavior [V2] Message-ID: <20160831094933.GC54371@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: Document error handlers behavior [V2] Mail-Followup-To: xfs@oss.sgi.com References: <1470734124-65204-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1470734124-65204-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.24 (2015-08-30) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Wed, 31 Aug 2016 09:49:35 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472636976 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 5185 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi folks, any comments on this? Cheers On Tue, Aug 09, 2016 at 05:15:24AM -0400, Carlos Maiolino wrote: > Document the implementation of error handlers into sysfs. > > Changelog: > > V2: > - Add a description of the precedence order of each option, focusing on > the behavior of "fail_at_unmount" which was not well explained in V1 > > Signed-off-by: Carlos Maiolino > --- > Documentation/filesystems/xfs.txt | 94 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 94 insertions(+) > > diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt > index 8146e9f..d483e0b 100644 > --- a/Documentation/filesystems/xfs.txt > +++ b/Documentation/filesystems/xfs.txt > @@ -348,3 +348,97 @@ Removed Sysctls > ---- ------- > fs.xfs.xfsbufd_centisec v4.0 > fs.xfs.age_buffer_centisecs v4.0 > + > +Error handling > +============== > + > +XFS can act differently according with the type of error found > +during its operation. The implementation introduces the following > +concepts to the error handler: > + > + -failure speed: > + Defines how fast XFS should shutdown in case of a specific > + error is found during the filesystem operation. It can > + shutdown immediately, after a defined number of tries, or > + simply try forever, which was the old behavior and is now > + set as default behavior, except during unmount time, where > + in case of a error is found while unmounting, the filesystem > + will shutdown. > + > + -error classes: > + Specifies the subsystem/location where the error handlers > + configure the behavior for, such as metadata or memory allocation. > + > + -error handlers: > + Defines the behavior for a specific error. > + > +The filesystem behavior during an error can be set via sysfs files, where, the > +errors are organized with the following structure: > + > + /sys/fs/xfs//error/// > + > +Each directory contains: > + > + /sys/fs/xfs//error/ > + > + fail_at_unmount (Min: 0 Default: 1 Max: 1) > + Defines the global error behavior during unmount time. If set to > + "1", XFS will shutdown in case of any error is found, otherwise, > + if set to "0", the filesystem will indefinitely retry to cleanly > + unmount the filesystem. > + > + subdirectories > + Contains specific error handlers configuration > + (Ex: /sys/fs/xfs//error/metadata). > + > + /sys/fs/xfs//error// > + > + The contents of this directory are specific, since each > + might need to handle different types of errors. All directory > + though, contains the "default" directory, which is a global configuration > + for errors not available for independent configuration. > + > + /sys/fs/xfs//error// > + > + Contains the failure speed configuration files for each specific error, > + including the "default" behavior, which contains the same configuration > + options as the specific errors. > + > + The available configurations for each error type are: > + > + max_retries (Min: -1 Default: -1 Max: INTMAX) > + Define how many tries the filesystem is allowed to retry its > + operations during the specific error, before shutdown the > + filesystem. Setting this file to "-1", will set XFS to retry > + forever in the specific error, setting it to "0", will make > + XFS to fail immediately after the specific error is found, > + while setting it to a "N" value, where N is greater than 0, > + will make XFS retry "N" times before shutdown. > + > + retry_timeout_seconds (Min: 0 Default: 0 Max: INTMAX) > + Define the amount of time (in seconds) that the filesystem is > + allowed to retry its operations when the specific error is > + found. "0" means no wait time. > + > + > + > + Order of precedence: > + "max_retries" takes precedence over "retry_timeout_seconds", > + where, "retry_timeout_seconds" will only be tested if > + "max_retries" limit was not reached yet or is set to retry > + forever ("-1"). If "max_retries" limit is reached, the > + filesystem will shutdown, wether or not "retry_timeout_seconds" > + has been reached. > + > + "fail_at_unmount" on the other hand, works independently of the > + remainder options. It will only be tested during unmount time, > + but, it will shutdown the filesystem independent of the limits > + set into "max_retries" or "retry_timeout_seconds". > + It has been added because sysfs configuration can't be changed > + after an unmount is triggered, once the sysfs directory from > + the filesystem being unmounted will be detached from the sysfs > + tree, so, even if the sysadmin wants to make XFS retry forever > + for any error during the filesystem operation, the filesystem > + can still be properly unmounted if any error was detected and > + "fail_at_unmount" is set. Otherwise, the umount process get > + stuck forever. > -- > 2.5.5 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From zlang@redhat.com Wed Aug 31 06:19:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 090EA7CA0 for ; Wed, 31 Aug 2016 06:19:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AE564304032 for ; Wed, 31 Aug 2016 04:19:04 -0700 (PDT) X-ASG-Debug-ID: 1472642343-0bf8155c7742aeb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FWEUFByKMyUWnX9u (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 31 Aug 2016 04:19:03 -0700 (PDT) X-Barracuda-Envelope-From: zlang@redhat.com X-Barracuda-Effective-Source-IP: mx1.redhat.com[209.132.183.28] X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E213B3B755; Wed, 31 Aug 2016 11:19:02 +0000 (UTC) Received: from localhost (dhcp-13-34.nay.redhat.com [10.66.13.34]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u7VBJ1I3000552; Wed, 31 Aug 2016 07:19:02 -0400 From: Zorro Lang To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com, Zorro Lang Subject: [PATCH v2] xfs/187: fix new sb_features2 stop case running Date: Wed, 31 Aug 2016 19:18:56 +0800 X-ASG-Orig-Subj: [PATCH v2] xfs/187: fix new sb_features2 stop case running Message-Id: <1472642336-28112-1-git-send-email-zlang@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 31 Aug 2016 11:19:02 +0000 (UTC) X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1472642343 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 6678 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This case is too old, at that time there's no "ftype" feature for XFS. Due to this case need to clear features2 bits when mkfs.xfs, so ftype bit stop case running for long time. New common function _require_old_xfs_format() will help to fix this problem. Call it as: _require_old_xfs_format ATTR2 LAZYSBCOUNT Then it'll help to clear all features2 bits, besides ATTR2 and LAZYSBCOUNT which will be tested in case. Signed-off-by: Zorro Lang --- Hi, V2 add a new common function _require_old_xfs_format(), which help to to make sure no features2 xfs bits will be set. But mostly we still want to test some features2 bits, so I make this function won't deal with those features which are specified by arguments. For clear CRC feature, we can set MKFS_OPTIONS="$MKFS_OPTIONS -m crc=0" simply. But if the user specify crc=1/0 in local.config file, the test can't continue running. So I check if it has been set in the function. Please tell me if you have better way to implement this function:) By the way, did I miss some features2? Thanks, Zorro common/rc | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/187 | 36 ++++++++++------------------ 2 files changed, 87 insertions(+), 24 deletions(-) diff --git a/common/rc b/common/rc index 3fb0600..29e2987 100644 --- a/common/rc +++ b/common/rc @@ -3923,6 +3923,81 @@ _require_xfs_mkfs_without_validation() fi } +# Make sure no features2 bits in XFS, besides those features are +# specified by arguments. All current features2 names as below: +# "CRC FINOBT PROJID32BIT ATTR2 LAZYSBCOUNT FTYPE" +_require_old_xfs_format() +{ + local skiplist="$*" + local ftr2="" + local b + local opts + + _scratch_mkfs >/dev/null 2>&1 + ftr2=`$XFS_DB_PROG -c version $SCRATCH_DEV | tr 'a-z' 'A-Z' |\ + sed -n -e "s/,/ /g" -e "s/.*MOREBITS\(.*\)/\1/p"` + + for b in `echo $skiplist | tr 'a-z' 'A-Z'`; do + i=`echo $ftr2 | sed -n -e "s/\(.*\)$b\(.*\)/\1\2/p"` + if [ -n "$b" ]; then + ftr2="$i" + fi + done + + for b in $ftr2; do + case $b in + CRC) + if echo $MKFS_OPTIONS | grep -q "crc=1"; then + MKFS_OPTIONS=`echo $MKFS_OPTIONS | \ + sed -e "s/crc=1/crc=0/g"` + else + MKFS_OPTIONS="$MKFS_OPTIONS -m crc=0" + fi + ;; + FINOBT) + if echo $MKFS_OPTIONS | grep -q "finobt=1"; then + MKFS_OPTIONS=`echo $MKFS_OPTIONS | \ + sed -e "s/finobt=1/finobt=0/g"` + else + MKFS_OPTIONS="$MKFS_OPTIONS -m finobt=0" + fi + ;; + PROJID32BIT) + if echo $MKFS_OPTIONS | grep -q "projid32bit=1"; then + MKFS_OPTIONS=`echo $MKFS_OPTIONS | \ + sed -e "s/projid32bit=1/projid32bit=0/g"` + else + MKFS_OPTIONS="$MKFS_OPTIONS -i projid32bit=0" + fi + ;; + ATTR2) + if echo $MKFS_OPTIONS | grep -q "attr="; then + MKFS_OPTIONS=`echo $MKFS_OPTIONS | \ + sed -e "s/attr=[0-9]/attr=1/g"` + else + MKFS_OPTIONS="$MKFS_OPTIONS -i attr=1" + fi + ;; + LAZYSBCOUNT) + if echo $MKFS_OPTIONS | grep -q "lazy-count=1"; then + MKFS_OPTIONS=`echo $MKFS_OPTIONS | \ + sed -e "s/lazy-count=1/lazy-count=0/g"` + else + MKFS_OPTIONS="$MKFS_OPTIONS -l lazy-count=0" + fi + ;; + FTYPE) + if echo $MKFS_OPTIONS | grep -q "ftype=1"; then + MKFS_OPTIONS=`echo $MKFS_OPTIONS | \ + sed -e "s/ftype=1/ftype=0/g"` + else + MKFS_OPTIONS="$MKFS_OPTIONS -n ftype=0" + fi + ;; + esac + done +} + init_rc ################################################################################ diff --git a/tests/xfs/187 b/tests/xfs/187 index 836b924..ffc851c 100755 --- a/tests/xfs/187 +++ b/tests/xfs/187 @@ -31,7 +31,6 @@ seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" -here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! trap "_cleanup; exit \$status" 0 1 2 3 15 @@ -57,25 +56,16 @@ _supported_fs xfs _supported_os Linux _require_scratch +# clear features2 bits which we won't test +_require_old_xfs_format ATTR2 LAZYSBCOUNT _require_attrs -_require_attr_v1 -_require_projid16bit rm -f $seqres.full - -# Reset the options so that we can control what is going on here -export MKFS_OPTIONS="" -export MOUNT_OPTIONS="" - -# lazysb, attr2 and other feature bits are held in features2 and will require -# morebitsbit on So test with lazysb and without it to see if the morebitsbit is -# okay etc. If the mkfs defaults change, these need to change as well. -export MKFS_NO_LAZY="-m crc=0 -l lazy-count=0 -i projid32bit=0" -export MKFS_LAZY="-m crc=0 -l lazy-count=1 -i projid32bit=0" +_scratch_mkfs >/dev/null 2>&1 # Make sure that when we think we are testing with morebits off # that we really are. -_scratch_mkfs -i attr=1 $MKFS_NO_LAZY >/dev/null 2>&1 +_scratch_mkfs -i attr=1 -l lazy-count=0 >/dev/null 2>&1 $XFS_DB_PROG -c version $SCRATCH_DEV 2>&1 >$tmp.db if grep -i morebits $tmp.db then @@ -90,13 +80,13 @@ echo "*** 1. test attr2 mkfs and then noattr2 mount ***" echo "" echo "attr2 fs" echo "" -_scratch_mkfs -i attr=2 $MKFS_NO_LAZY >/dev/null 2>&1 +_scratch_mkfs -i attr=2 -l lazy-count=0 >/dev/null 2>&1 $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version echo "" echo "noattr2 fs" echo "" _scratch_mount -o noattr2 -$UMOUNT_PROG $SCRATCH_MNT +_scratch_unmount $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version # adding an EA will ensure the ATTR1 flag is turned on @@ -105,7 +95,7 @@ echo "*** 2. test attr2 mkfs and then noattr2 mount with 1 EA ***" echo "" echo "attr2 fs" echo "" -_scratch_mkfs -i attr=2 $MKFS_NO_LAZY >/dev/null 2>&1 +_scratch_mkfs -i attr=2 -l lazy-count=0 >/dev/null 2>&1 $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version echo "" echo "noattr2 fs" @@ -115,8 +105,8 @@ cd $SCRATCH_MNT touch testfile $SETFATTR_PROG -n user.test -v 0xbabe testfile $GETFATTR_PROG testfile -cd $here -$UMOUNT_PROG $SCRATCH_MNT +cd - >/dev/null +_scratch_unmount $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version echo "" @@ -125,16 +115,14 @@ echo "" echo "" echo "attr2 fs" echo "" -_scratch_mkfs -i attr=2 $MKFS_LAZY >/dev/null 2>&1 +_scratch_mkfs -i attr=2 -l lazy-count=1 >/dev/null 2>&1 $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version echo "" echo "noattr2 fs" echo "" _scratch_mount -o noattr2 -cd $SCRATCH_MNT -touch testfile -cd $here -$UMOUNT_PROG $SCRATCH_MNT +touch $SCRATCH_MNT/testfile +_scratch_unmount $XFS_DB_PROG -r -c version $SCRATCH_DEV 2>&1 | _filter_version # success, all done -- 2.7.4 From Sales.51@stoneproducts.net Wed Aug 31 06:31:25 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E8A3E7CA0 for ; Wed, 31 Aug 2016 06:31:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04E3AAC002 for ; Wed, 31 Aug 2016 04:31:20 -0700 (PDT) X-ASG-Debug-ID: 1472643073-0bf57c1b0a135140001-NocioJ Received: from stoneproducts.net ([125.112.84.210]) by cuda.sgi.com with SMTP id 8uPhGQzAVljK5dy7 for ; Wed, 31 Aug 2016 04:31:14 -0700 (PDT) X-Barracuda-Envelope-From: Sales.51@stoneproducts.net X-Barracuda-Effective-Source-IP: UNKNOWN[125.112.84.210] X-Barracuda-Apparent-Source-IP: 125.112.84.210 Received: from DESKTOP-7L1Q1QC[127.0.0.1] by DESKTOP-7L1Q1QC[127.0.0.1] (SMTPD32); Wed, 31 Aug 2016 16:41:34 +0800 From: "stone.h@maystargift.com" Subject: Lanyards for exhibition/work/advertising/events To: xfs@oss.sgi.com X-ASG-Orig-Subj: Lanyards for exhibition/work/advertising/events Content-Type: multipart/mixed; charset=UTF-8; boundary="liASLlu1YhBuu=_2TCO2QH9mTxFyOAGSE7" MIME-Version: 1.0 Sender: Sales.51@stoneproducts.net Reply-To: stone.h@maystargift.com Date: Wed, 31 Aug 2016 16:41:34 +0800 X-Mailer: Foxmail 6, 13, 102, 15 [cn] X-Barracuda-Connect: UNKNOWN[125.112.84.210] X-Barracuda-Start-Time: 1472643074 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 14800 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.91 X-Barracuda-Spam-Status: No, SCORE=0.91 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20160831113120.7EE621940063@cuda.sgi.com> This is a multi-part message in MIME format --liASLlu1YhBuu=_2TCO2QH9mTxFyOAGSE7 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 Content-Disposition: inline PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48SEVBRD4NCjxNRVRBIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIg aHR0cC1lcXVpdj1jb250ZW50LXR5cGU+DQo8TUVUQSBuYW1lPUdFTkVSQVRPUiBjb250ZW50PSJN U0hUTUwgMTEuMDAuMTAyNDAuMTY3MjQiPjwvSEVBRD4NCjxCT0RZPg0KPFA+PFNQQU4gDQpzdHls ZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiDlrovkvZM7IG1zby1zcGFjZXJ1bjog JiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1hc2NpaS1mb250 LWZhbWlseTogQXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1iaWRpLWZv bnQtZmFtaWx5OiBBcmlhbCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQt RkFNSUxZOiBBcmlhbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJu aW5nOiAxLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+R29vZCANCmRh eSAhPC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQiPjxT UEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1m YXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPkdsYWQgDQp0byBrbm93IHRoYXQgeW91IG5lZWQg dGhlIHJoaW5lc3RvbmUmbmJzcDtsYW55YXJkcyBpbiB5b3VyIG1hcmtldCBmcm9tIHlvdXIgDQp3 ZWJpc3RlICwgc29ycnkgdG8gYm90aGVyIHlvdSAhPC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05v cm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0 OyBGT05ULUZBTUlMWTogQXJpYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZv bnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPldl IA0KaGF2ZSBiZWVuIGEgcmhpbmVzdG9uZSBsYW55YXJkcyBtYW51ZmFjdHVyZXIgYW5kIHN1cHBs aWVyIGZvciBtb3JlIHRoYW4gNnllYXJzIA0KaW4gQ2hpbmEgLCB3ZSBjYW4gcHJvdmlkZSA8L1NQ QU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBwdCI+PFNQQU4gDQpz dHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IOWui+S9kyI+eW91IA0KYW55IGtpbmRzIG9mJm5ic3A7cmhpbmVzdG9uZSBp dGVtcyZuYnNwOywgc3VjaCBhcyA8L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxl PSJNQVJHSU46IDBwdCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFN SUxZOiBBcmlhbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5n OiAxLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PEZPTlQgDQpjb2xv cj0jZmYwMDAwPnJoaW5lc3RvbmUgbGFueWFyZHM8L0ZPTlQ+ICwgPC9TUEFOPjwvUD4NCjxQIGNs YXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0la RTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZMiPnJoaW5lc3RvbmUgDQpiYWRnZSByZWVscyAsJm5ic3A7PC9TUEFOPjwvUD4NCjxQIGNs YXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQiPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0la RTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl rovkvZMiPjxGT05UIA0KY29sb3I9IzAwODAwMD5yaGluZXN0b25lIGJhZGdlIGhvbGRlcnMgLDwv Rk9OVD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBwdCI+ PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgbXNv LXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PEZPTlQgDQpjb2xvcj0jMDAwMGZmPnJoaW5l c3RvbmUgYnJhY2VsZXRzICwgPC9GT05UPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwg c3R5bGU9Ik1BUkdJTjogMHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9O VC1GQU1JTFk6IEFyaWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtl cm5pbmc6IDEuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48Rk9OVCAN CmNvbG9yPSNmZjAwODA+cmhpbmVzdG9uZSBoYWlyIGJhbmRzICwgPC9GT05UPjwvU1BBTj48L1A+ DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMHB0Ij48U1BBTiANCnN0eWxlPSJG T05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBtc28tc3BhY2VydW46ICYjMzk7 eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZh bWlseTog5a6L5L2TIj48Rk9OVCANCmNvbG9yPSNmZjAwODA+PEZPTlQgY29sb3I9IzAwODAwMD5y aGluZXN0b25lIGtleWNoYWlucyAsPC9GT05UPiANCjwvRk9OVD48L1NQQU4+PC9QPg0KPFAgY2xh c3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBwdCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpF OiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWu i+S9kyI+YXMgDQp3ZWxsIGFzIDMgcm93cyByaGluZXN0b25lIGxhbnlhcmRzIC4uIDwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMHB0Ij48U1BBTiANCnN0eWxl PSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TIj48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0 eWxlPSJNQVJHSU46IDBwdCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQt RkFNSUxZOiBBcmlhbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJu aW5nOiAxLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PElNRyANCnN0 eWxlPSJIRUlHSFQ6IDM1OXB4OyBXSURUSDogNzY3cHgiIGJvcmRlcj0wIGhzcGFjZT0wIGFsdD0i IiANCnNyYz0iY2lkOmltZzAuanBnIiB3aWR0aD04OTMgYWxpZ249YmFzZWxpbmUgDQpoZWlnaHQ9 Mzk4PjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMHB0Ij48 U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48L1NQQU4+Jm5ic3A7PC9QPg0KPFAgY2xhc3M9 TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBwdCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAx MC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9 kyI+PEZPTlQgDQpjb2xvcj0jZmYwMDAwPllvdSBuZWVkcyB0aGUgbGFueWFyZHMgLCBhbmQgd2Ug cHJvZHVjZSB0aGUgbGFueWFyZHMgISBUaGF0IA0KaXMmbmJzcDtpdCAhPC9GT05UPjwvU1BBTj48 L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMHB0Ij48U1BBTiANCnN0eWxl PSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBtc28tc3BhY2VydW46ICYj Mzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250 LWZhbWlseTog5a6L5L2TIj5TbyANCkkgYW0gd3JpdGluZyB0byB5b3UgaXMganVzdCBob3BlIHlv dSBjYW4gc2hhcmUgdGhlIGlucXVpcmVzIG9mIHRoZSBsYW55YXJkcyB3aXRoIA0KbWUgaW4gZnV0 dXJlICwgPC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQi PjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1z by1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPkkgDQp3aWxsIGRvIDwvU1BBTj48U1BBTiAN CnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tZmFyZWFz dC1mb250LWZhbWlseTog5a6L5L2TIj5teSANCmJlc3QgdG8gc3VwcG9ydCB5b3VyIG1hcmtldCB3 aXRoIG15IGJlc3Qgb2ZmZXJzIGFuZCB0b3AgcXVhbGl0eSAuIDwvU1BBTj48L1A+DQo8UCBjbGFz cz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMHB0Ij48Rk9OVCBjb2xvcj0jMDAwMGZmPjxTUEFO IA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPlNhbXBsZXMgDQphbmQgcGljdHVyZXMgY2FuIGJlIHBy b3ZpZGVkIDwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1J TFk6IEFyaWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6 IDEuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj5pZiANCnlvdSBuZWVk ICEgPC9TUEFOPjwvRk9OVD48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjog MHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFs OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj5BbnkgDQpuZWVkcyBvciBpbnF1aXJp ZXMgYWJvdXQgPEZPTlQgY29sb3I9I2ZmMDA4MD5yaGluZXN0b25lIC8gYmxpbmcgLyBjcnlzdGFs IA0KbGFueWFyZHM8L0ZPTlQ+ICwganVzdCBmZWVsIGZyZWUgdG8gY29udGFjdCB3aXRoIG1lIC4g PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQiPjxTUEFO IA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPllvdXIgDQplYXJseSByZXBseSBpcyBoaWdobHkgYXBw cmVjaWF0ZWQgITwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjog MHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFs OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0 OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj48L1NQQU4+Jm5ic3A7PC9QPg0KPFAg Y2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBwdCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1T SVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYj Mzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6 IOWui+S9kyI+WW91cnMgDQpzaW5jZXJlbHkgLDwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3Jt YWwgc3R5bGU9Ik1BUkdJTjogMHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsg Rk9OVC1GQU1JTFk6IEFyaWFsOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250 LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2TIj5TdG9u ZSANCkh1PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwcHQi PjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IG1z by1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMS4wMDAwcHQ7IG1z by1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPjwvU1BBTj4mbmJzcDs8L1A+DQo8UCBjbGFz cz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMHB0Ij48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6 IDEwLjVwdDsgRk9OVC1GQU1JTFk6IOWui+S9kzsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlh bDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFy aWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpz dHlsZT0iVEVYVC1BTElHTjoganVzdGlmeTsgVEVYVC1KVVNUSUZZOiBpbnRlci1pZGVvZ3JhcGg7 IE1BUkdJTjogMHB0OyBMSU5FLUhFSUdIVDogMTUuNzVwdDsgVEVYVC1JTkRFTlQ6IDBwdDsgbXNv LXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1qdXN0aWZ5PjxTUEFOIA0Kc3R5bGU9 IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTog5b6u6L2v6ZuF6buROyBURVhULVRSQU5T Rk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1z cGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1h c2NpaS1mb250LWZhbWlseTogQXJpYWw7IG1zby1oYW5zaS1mb250LWZhbWlseTogQXJpYWw7IG1z by1iaWRpLWZvbnQtZmFtaWx5OiBBcmlhbCI+U2FsZXMmbmJzcDtNYW5hZ2VyIA0KPC9TUEFOPjxT UEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IFRFWFQt VFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsg bXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsg bXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9r+mbhem7kSI+Jm5ic3A7x4AgDQo8L1NQQU4+ PEI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IFRF WFQtVFJBTlNGT1JNOiBub25lOyBGT05ULVdFSUdIVDogYm9sZDsgQ09MT1I6IHJnYigxMTIsMTcz LDcxKTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBt c28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+rui9 r+mbhem7kSI+WWl3dSANCk1heSBTdGFyIENyYWZ0ICZhbXA7IEdpZnQgQ28uLEx0ZDwvU1BBTj48 L0I+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBDYWxpYnJp OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDEuMDAwMHB0 OyBtc28tYmlkaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBOZXcgUm9tYW4mIzM5OzsgbXNvLWZh cmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PG86cD48L286cD48L1NQQU4+PC9QPg0KPFAgY2xh c3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGp1c3RpZnk7IFRFWFQtSlVTVElGWTog aW50ZXItaWRlb2dyYXBoOyBNQVJHSU46IDBwdDsgTElORS1IRUlHSFQ6IDE1Ljc1cHQ7IFRFWFQt SU5ERU5UOiAwcHQ7IG1zby1wYWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249anVzdGlm eT48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBU RVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IExFVFRFUi1TUEFDSU5HOiAw cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAw cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5EiPjNyZCANCkZsb29yLFVu aXQgMSxCdWlsZGluZyAzMyxYaWFmYW4gVmlsbGFnZSxZaXd1IENpdHkgMzIyMDA4LENoaW5hPC9T UEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQ2FsaWJy aTsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBw dDsgbXNvLWJpZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1m YXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZMiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNs YXNzPU1zb05vcm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5OyBURVhULUpVU1RJRlk6 IGludGVyLWlkZW9ncmFwaDsgTUFSR0lOOiAwcHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0OyBURVhU LUlOREVOVDogMHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWp1c3Rp Znk+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsg VEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMTEyLDE3Myw3MSk7IExFVFRFUi1TUEFD SU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzog MC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5EiPlRlbDwvU1BB Tj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBU RVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IExFVFRFUi1TUEFDSU5HOiAw cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAw cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5EiPiZuYnNwOzogDQorODYg NTc5IDg1NTA5NTkzICZuYnNwO8eAICZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULVNJ WkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09M T1I6IHJnYigxMTIsMTczLDcxKTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAm IzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9u dC1mYW1pbHk6IOW+rui9r+mbhem7kSI+RmF4PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0la RTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xP UjogcmdiKDAsMCwwKTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3ll cyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1p bHk6IOW+rui9r+mbhem7kSI+Jm5ic3A7OiANCis4NiA1NzkgODU1MDk1OTMgPC9TUEFOPjxTUEFO IA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQ2FsaWJyaTsgbXNvLXNw YWNlcnVuOiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAxLjAwMDBwdDsgbXNvLWJp ZGktZm9udC1mYW1pbHk6ICYjMzk7VGltZXMgTmV3IFJvbWFuJiMzOTs7IG1zby1mYXJlYXN0LWZv bnQtZmFtaWx5OiDlrovkvZMiPjxvOnA+PC9vOnA+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05v cm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBqdXN0aWZ5OyBURVhULUpVU1RJRlk6IGludGVyLWlk ZW9ncmFwaDsgTUFSR0lOOiAwcHQ7IExJTkUtSEVJR0hUOiAxNS43NXB0OyBURVhULUlOREVOVDog MHB0OyBtc28tcGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWp1c3RpZnk+PFNQQU4g DQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgVEVYVC1UUkFO U0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMTEyLDE3Myw3MSk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7 IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7 IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmIj5Nb2IgDQo8L1NQQU4+PFNQQU4g DQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgVEVYVC1UUkFO U0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBMRVRURVItU1BBQ0lORzogMHB0OyBtc28t c3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28t ZmFyZWFzdC1mb250LWZhbWlseTogc2Fucy1zZXJpZiI+OiANCis4NjwvU1BBTj48U1BBTiANCnN0 eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBURVhULVRSQU5TRk9S TTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5EiPiZuYnNwOzwvU1BBTj48U1BBTiANCnN0eWxl PSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBURVhULVRSQU5TRk9STTog bm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1 bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0 LWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmIj4xODk1Nzk5NzYwMCANCihXaGF0c0FwcCkgJm5ic3A7 x4AgPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTog QXJpYWw7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDExMiwxNzMsNzEpOyBMRVRU RVItU1BBQ0lORzogMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtl cm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogc2Fucy1zZXJpZiI+U2t5 cGU8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBB cmlhbDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBMRVRURVItU1BB Q0lORzogMHB0OyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6 IDAuMDAwMHB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTogc2Fucy1zZXJpZiI+Jm5ic3A7OiAN Cmh1cXVuZ2FuZyAmbmJzcDs8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7 IEZPTlQtRkFNSUxZOiBDYWxpYnJpOyBtc28tc3BhY2VydW46ICYjMzk7eWVzJiMzOTs7IG1zby1m b250LWtlcm5pbmc6IDEuMDAwMHB0OyBtc28tYmlkaS1mb250LWZhbWlseTogJiMzOTtUaW1lcyBO ZXcgUm9tYW4mIzM5OzsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kyI+PG86cD48L286 cD48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGp1 c3RpZnk7IFRFWFQtSlVTVElGWTogaW50ZXItaWRlb2dyYXBoOyBNQVJHSU46IDBwdDsgbXNvLXBh Z2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1qdXN0aWZ5PjxTUEFOIA0Kc3R5bGU9IkZP TlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IFRFWFQtVFJBTlNGT1JNOiBub25l OyBDT0xPUjogcmdiKDExMiwxNzMsNzEpOyBMRVRURVItU1BBQ0lORzogMHB0OyBtc28tc3BhY2Vy dW46ICYjMzk7eWVzJiMzOTs7IG1zby1mb250LWtlcm5pbmc6IDAuMDAwMHB0OyBtc28tZmFyZWFz dC1mb250LWZhbWlseTogc2Fucy1zZXJpZiI+RS1tYWlsIA0KPC9TUEFOPjxTUEFOIA0Kc3R5bGU9 IkZPTlQtU0laRTogMTAuNXB0OyBGT05ULUZBTUlMWTogQXJpYWw7IFRFWFQtVFJBTlNGT1JNOiBu b25lOyBDT0xPUjogcmdiKDAsMCwwKTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVu OiAmIzM5O3llcyYjMzk7OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3Qt Zm9udC1mYW1pbHk6IHNhbnMtc2VyaWYiPjo8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpF OiAxMC41cHQ7IEZPTlQtRkFNSUxZOiBBcmlhbDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IENPTE9S OiByZ2IoMTEyLDE3Myw3MSk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMz OTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQt ZmFtaWx5OiBzYW5zLXNlcmlmIj4mbmJzcDs8L1NQQU4+PFNQQU4+PEEgDQpocmVmPSJtYWlsdG86 c3RvbmUuaEBtYXlzdGFyZ2lmdC5jb20iPjxVPjxTUEFOIGNsYXNzPTE1IA0Kc3R5bGU9IkZPTlQt U0laRTogMTAuNXB0OyBURVhULURFQ09SQVRJT046IHVuZGVybGluZTsgRk9OVC1GQU1JTFk6IEFy aWFsOyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IExFVFRFUi1TUEFD SU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzog MC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyB0ZXh0LXVuZGVy bGluZTogc2luZ2xlIj5zdG9uZS5oQG1heXN0YXJnaWZ0LmNvbTwvU1BBTj48L1U+PC9BPjwvU1BB Tj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBU RVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IExFVFRFUi1TUEFDSU5HOiAw cHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAw cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmIj4mbmJzcDvHgCANCjwvU1BB Tj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEwLjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBU RVhULVRSQU5TRk9STTogbm9uZTsgRk9OVC1XRUlHSFQ6IG5vcm1hbDsgQ09MT1I6IHJnYigxMTIs MTczLDcxKTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IOW+ rui9r+mbhem7kSI+d2Vic2l0ZSANCjwvU1BBTj48U1BBTiANCnN0eWxlPSJGT05ULVNJWkU6IDEw LjVwdDsgRk9OVC1GQU1JTFk6IEFyaWFsOyBURVhULVRSQU5TRk9STTogbm9uZTsgQ09MT1I6IHJn YigwLDAsMCk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFjZXJ1bjogJiMzOTt5ZXMmIzM5 OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDl vq7ova/pm4Xpu5EiPjo8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiAxMC41cHQ7IEZP TlQtRkFNSUxZOiDlvq7ova/pm4Xpu5E7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdi KDAsMCwwKTsgTEVUVEVSLVNQQUNJTkc6IDBwdDsgbXNvLXNwYWNlcnVuOiAmIzM5O3llcyYjMzk7 OyBtc28tZm9udC1rZXJuaW5nOiAwLjAwMDBwdDsgbXNvLWFzY2lpLWZvbnQtZmFtaWx5OiBBcmlh bDsgbXNvLWhhbnNpLWZvbnQtZmFtaWx5OiBBcmlhbDsgbXNvLWJpZGktZm9udC1mYW1pbHk6IEFy aWFsIj4mbmJzcDs8L1NQQU4+PFNQQU4+PEEgDQpocmVmPSJodHRwOi8vd3d3Lm1heXN0YXJnaWZ0 LmNvbS8iPjxVPjxTUEFOIGNsYXNzPTE1IA0Kc3R5bGU9IkZPTlQtU0laRTogMTAuNXB0OyBURVhU LURFQ09SQVRJT046IHVuZGVybGluZTsgRk9OVC1GQU1JTFk6IEFyaWFsOyBURVhULVRSQU5TRk9S TTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IExFVFRFUi1TUEFDSU5HOiAwcHQ7IG1zby1zcGFj ZXJ1bjogJiMzOTt5ZXMmIzM5OzsgbXNvLWZvbnQta2VybmluZzogMC4wMDAwcHQ7IG1zby1mYXJl YXN0LWZvbnQtZmFtaWx5OiDlvq7ova/pm4Xpu5E7IHRleHQtdW5kZXJsaW5lOiBzaW5nbGUiPnd3 dy5tYXlzdGFyZ2lmdC5jb208L1NQQU4+PC9VPjwvQT48L1NQQU4+PCEtLUVuZEZyYWdtZW50LS0+ PC9TUEFOPjwvUD48IS0tRW5kRnJhZ21lbnQtLT48L0JPRFk+PC9IVE1MPg0KDQo= --liASLlu1YhBuu=_2TCO2QH9mTxFyOAGSE7 Content-Type: image/jpeg; name="=?GB2312?B?1+q0+DIuanBn?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?GB2312?B?1+q0+DIuanBn?=" Content-ID: Content-Description: Photo /9j/4AAQSkZJRgABAQEAMgAyAAD/4RDcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAGAAAISodpAAQA AAABAAAIUJydAAEAAAAMAAAQyOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFN0b25lAAAFkAMAAgAA ABQAABCekAQAAgAAABQAABCykpEAAgAAAAM4OAAAkpIAAgAAAAM4OAAA6hwABwAACAwAAAiSAAAA ABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAMjAxNjowODoxNyAxNDoxNjoyNgAyMDE2OjA4OjE3IDE0OjE2OjI2AAAAUwB0AG8A bgBlAAAA/+ELGGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfv u78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0i YWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5 OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6 ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1 cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVp ZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTYtMDgtMTdUMTQ6MTY6 MjYuODgyPC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9u IHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHht bG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJk ZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt bnMjIj48cmRmOmxpPlN0b25lPC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwv cmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/b AEMAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUM DxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/AABEIAY8DfQMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA AAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU MoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG BwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS 8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri 4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APq7xkufFut/9fs3/oZrJUVr+Mf+Rt1v/r9m /wDQzWStfSw+FHnyeo4cU8U0HkUuc1ZNyRTT8iowOKevpQO5IvTOKUccUi0p4YUgH9RQPpSdqUUh jx7UpFMBNOBz1pAPjbnmplPtVfGKlRuKBkuaVTTRzQOKAJ81Ih5qEHIp6Ng0BcsU3ABp6HIxTZFw KBhnOKcCMVBG53YNTAYPrSuMerU5hlaib5eakVsjIoAjBwakVuailGORQj9+tO4FtW7UyRc80ivT sgigCNT8wq3E+BxVTAqeE8UATyPuTmmWq4bNNkziprUcUATT4KYrGljME29encVsSnIIqpsDkgig DwP9pf4CWPxT8PHULW3B1mzRmtyuAWOPuk1+d/mXej3s+l38T2t7bOY5I5BgqRX6/wAyeRKUIzG/ UV8e/tkfs7vqcb+MvD9qDfRYN2i5LPGB1UDqelc8lyu6NE+bTqfKGmrnULYj/nqv86/XP9oPxPrO i+MbCDTtWvrGBtPRzHbXLxqW8yQZwCBnAHPtX5AeHr0NqUETH5kmVT9Qa/W39pYZ8b6f/wBg2P8A 9GSVKSdSPzHf3WcGPiB4n/6GLVv/AANk/wDiqd/wn/ifH/Ixar/4Gyf/ABVYCjFPxmuvlj2MeZm6 vj7xN38Rar/4Gyf/ABVSDx74m/6GHVf/AANk/wDiqwAPanoBmjlj2Fdm+PHniX/oYdV/8DJP/iqe vjvxL/0MGqf+Bkn/AMVWDin4wKOSPYLs3x488SZ/5GDVP/AyT/4qpF8deI+/iDVP/AyT/GudX2FS qO9HLHsO7OhXxz4jP/Mf1P8A8DJP8aePHHiL/oPan/4GSf41zynHtTi9Plj2HdnQjxx4i769qf8A 4GSf40f8Jx4h/wCg9qX/AIGSf41zjThetZXiPxhp3hPQ77V9TmEFhZQtPNJjOFAycDufalyx7Bdn dDxt4hP/ADHtS/8AAuT/ABqQeNPEOB/xPdS/8C5P8a+DLb/goVeXniQ29r4Rhm08yMsam6KzOP4S TjA9Twa+pPhN8WNH+LXh9tQ0wS280LeXc2dwMSQvjOPcehHX25FRH2c/hsO7W56kvjPxCf8AmO6l /wCBcn+NPHjLxB/0HdR/8C5P8aw1Ge9SqOKvkj2C7Nn/AITLX/8AoOal/wCBcn+NL/wmWv8A/Qb1 H/wLk/xrHH0owSaOSPYLs3E8Y68f+Y3qP/gVJ/jTj4w17H/Ib1H/AMCn/wAaxUp9HLHsF2bA8Ya9 /wBBrUP/AAKk/wAad/wmOu/9BnUP/Ap/8axuppwAo5Y9guzYHjDXc/8AIZ1D/wACn/xpR4w1z/oM 6h/4FP8A41kgCnYFHLHsF2ao8X65/wBBrUP/AAKf/GnDxdrhOP7Z1D/wKf8AxrIFKB8wo5Y9h3Zt r4s1wj/kM3//AIFP/jTh4r1v/oMX/wD4Ev8A41kLxTgeaOWPYLs2B4q1v/oMX/8A4Ev/AI04eKta /wCgvf8A/gS/+NZAp4zijkj2Fdmr/wAJVrX/AEF7/wD8CX/xpf8AhKta/wCgvff+BL/41lDrTgtH JHsF2ag8V6zn/kLX3/gS/wDjSjxVrP8A0Fr7/wACH/xrLC5pwFHJHsO7NUeKNZ/6C19/4Ev/AI0o 8Uazn/kLX3/gQ/8AjWUMin5xRyR7DuzuPiB461nwb+zzfeI9Ouj/AGvbiPZPOPN+9dKhzuzn5WI5 r5cH7YHxMP8AzFbX/wAAo/8ACvoT40n/AIxP1f6Q/wDpalfCSDJBrhpU4ScrrqypSatY9tX9r34l H/mKWv8A4BR/4VIv7XXxJJ51S1/8Ao/8K8UXg1Mo6V0exp/yojmfc9qH7W3xI/6Clr/4Bx/4VKn7 WfxGbrqdr/4Bx/4V4opyanTrmj2VP+VBzPue0r+1f8RT/wAxO2/8A4/8KmX9qv4iH/mJ23/gHH/h XjMfJqdOOafsaf8AKg5n3PYx+1R8Qv8AoJW3/gHH/hUq/tSfEEj/AJCVt/4CR/4V42r9qsRnIo9l T/lQcz7nrw/aj+IHfUrb/wABI/8ACnL+1D8QD/zErb/wEj/wryLIp8fSl7Gn/Kg5n3PXV/af8fnr qNt/4CR/4UD9p/x9nH9o25/7dI/8K8nBFIWGaPZU/wCVBzPuet/8NP8Aj4Ef8TC3/wDASP8Awpf+ GnvHpHGo2/8A4CR/4V5G0gApgn7Ueyp/yofM+57AP2nfHvfUbf8A8BI/8KlH7TXjs/8AMRt//AWP /CvHRNmpFlzR7Kn/ACoOZ9z2AftM+O/+ghb/APgKn+FOH7S/jrH/ACELf/wFT/CvIVl45qQSj1o9 lT/lQcz7nrI/aY8dE4/tC3/8BU/wp3/DS3joYzqFvj/r1T/CvJklBNSKwcdc5o9lT/lQ+Z9z1gft KeOSf+P+3/8AAVP8Kd/w0j45x/x/2/8A4Cp/hXlKnpUo5p+yp/yoOZ9z1L/hpHxz/wA/9v8A+Aqf 4Uf8NIeOf+ghb/8AgKn+FeYBaUDin7Gn/Kg5n3PTz+0h45/5/wC3/wDAVP8ACk/4aQ8c/wDP/b/+ Aqf4V5nt46UbM0exp/yoOZnpv/DSHjj/AJ/7f/wFT/Cj/ho/xz/z/wBv/wCAqf4V5ns/CkI/Gj2N P+VBzM9LP7SPjoZ/0+3/APAVP8Kib9pTx2P+Yhb/APgKn+FecEcVC680exp/yoOZnpf/AA0t4876 hb/+Aqf4UD9pbx5/0ELf/wABU/wrzEx85pNoWj2NP+VBzPuen/8ADS3jv/oIW/8A4Cp/hT/+GlPH X/P/AG//AICp/hXlhHNPUHFHsaf8qDmZ6kv7Sfjo9dQt8/8AXqn+FI37SXjsf8xC3/8AAVP8K8wA zTgoNHsaf8qGpM9x8Zf8jZrXr9tm/wDQzWQvatfxkP8Airda/wCv2b/0M1j5xVQ+FHNLcmFKODUa GpK0JHdaevFRgGn496VxkitSnkVGDTw3FIY4nAFKOTzTd2RRSGSA4pQaaDilPBHpSuOw/OadGaaK UHFICdGxStkGoVbmps7lFFwsOVu1Sp9ah71IGx0oGW4jUpUMKqxvyPSrancKAK7xbeR2pyvkDnpT myGxUKkI2O1AyZhkU1HAOCaeoyKr3EsduQZJETPTcQM0rgTycfQ1FyD7GnROk0YKsHU9CDkUEfhQ MVGyPepM5A9qhI2n608HGCTjNMRLjIqWI4qIHHFPQ800BM1TQ8DioQc1LGdopgLNk1AqHOc1OxBF MUYFAEUkIn4PWqF3aR3Mb2twgdHBADDitNeGzUN7AJlBHBpNXDbU/OX9qL4AT/DHxxb+JNEt5G0W /ugZoo0OLeQsD+ANfoB+0rz430//ALBsf/oySq3ifwxZeMtIm03UIhLHKNjAgH8RnvVv9pdf+K40 /wD7B0f/AKMkrliuWql6msmnG55IDipQAaj28CpFHFdxzi8CnqKQCpVwOtACgcU4LyKbG24n0qTb n6UAOC4HrSqcnFJjHSnCgYY702STbTjnpUMx60DKV9cmNCc4xXy7+2T4xnt/ho+nwyyR/bLuOJ9h 4ZQGYg+3yj8q+mNQBZGr5K/bA0yS68HrIquwt7lZTt6AYK5P51jVb5HYpbnhnwP8C23inw/44upL cTXdnYq1s2MlXyX49z5e36MR3r1X9kfxe+hfF2zTzV+yavA1vITEIwW6rjaeDuVRgjoeMZxWL+xh fRNq3ibS5MM1xbxzBT3VSyt/6GK5LwrnwZ4zsLhbm0sX0vVngaR3LSKUfIJXHGdmM/yrLCxTih1H qfqVE27FT4IFZ+mXS3dpDNGdySIHU+oIyK0F5FdZA4DA4pQPejBxSjPoaAFBP4U9RxTQCaftoGAP PcU4UmKcBjFADx704A0gXNPxQAm3rTgORTgDnilxyKAFUYHJqREJ7fiaRAB2/Gpl5oAAmM0oHFG4 CnUAAAozmjA5pccUAGSKcDSY5pQOKAFzSjmkzRnAoGbfxp/5NP1f6Q/+lqV8KJX3X8Z/+TTtW+kP /palfCqDiuKhvL1ZU+hIuKlBqJetS5rqIJVFTR8VEhqeMZoAniPep16c1BFxUynNAEqDkZqZSBUI 6+lSr0FAEq8mn5ximR8jNTBRigBQcrmoZX281IM4xVO7fCmlcBr3QBxmoGvAG61j3moeS5JNQR6g JO/FTcdjpIbrdUkl+IFJJrEguv7pqjrmo/Z7Z3zjAzTuFjcn19QRhqltda8wjDZrxbRL/VvEly7w LeiO41FLK3a2g84ERqZJsKPmJCkEj+7zxg15ZeftBeIrDXdXstP+ztBZysiSmIuxUOACOeTyMVzz rxgrs6KNGVafJHc+0re53qPWrccgxXnXwu8YP4w8HWGpSlPPcMkvljA3oxViB2yRn8a7aO4yQM1v GXMk0ZTi4ScH0NeN85qzG2cVmwuSavwtwKu5BaUZpwXBNIpwwXB5Gc44qXGcU7gNxRtBNP25pdgJ xTuFxhXimhanC4HrTSKYyFl4PemMlWCtMdcjrj6UAVymKYyZ5qwVppXigCsFwafinMoBpduRQA0C lGQKcFoxjqKAPbvGRx4u1rj/AJfZv/QzWKa2vGQ/4q7Wv+v2b/0M1jkZrKHwoyluAHIxzUyHtUIG KkXhqsRYXmlPSmJyKkzxSERgkVKp4qNhkZ70sfFFyiXFIaUc0Y4qQGq2DUobioCcGlViODzSuUTl vSgHPtUaijdg81LYyYGpYzisq68QaXYFRcajawswZgrzKCQv3sDPOO9Zt18SPD1luDX4lcRCbZDG zkqTgYwOvt1A5OBWU61On8ckhqLeyOqHPIqVBk15nqHxx0a0Ia3t7m8hD7WmQDbt7MMEnk+oHc8C sNfj5c3mBBpsULeYYHALT+WxBIk/gJQYwRjJJ445rz6uaYSim5T+7X8jeOHqy2ie3LgVPE3rXzpq Xxf8ZX0Eo0+D7PNLDujH2YRmORT0BfIIfHOegbjnkZd3feNdSuvtMl5e26BxKiz3bKillHmA7MLg H7oyQB65zXl1OI8JHSKb/r+un6Gywc+rR7748+J3hX4baWdQ8S61baXbAgAyEsxJzjCqCxzg9B2r x2f9ub4Rm6CJrN3IM485bCXbj15Gf0rw74raRpMPgS+07VdYtJiIJFhsIJV812JBj5G4ttIG0H1P PJryL4OeG/Ab6tZ/2loXiG+1eOVWVWvI0tEYHPzgRFmGR0BGa9DAZi8dBzUbW7/0jGrRVJ2vc/Rb w58TdI+KWmM/g7WYrqEx5e7RTmIkkKpVsFScMeR0X3Bqh4i8M6CpL+IfFLicLuPmXy2yj3CKVFeB ie70RrZ5tMk/4RuSZVlsrgq8nl5BV9yqCVO5uAeBjGc8/RXhvwf4UewjutH0vSJIWwyzRQIxz15b Gc/XmvUT5nqZ2seU6trP9ih5/Buvazqu3llhjedI/fcw5H/fQPcVr6B+0Xc3nha7vdWWCyutObyL r7LB5xmbjDxh5I8E5Hy4bB4Ndp43ja50x7VZzidSm2FdxIPHGM149oPwcfTpjbWctrLID5i2zO++ EbvuyGN1ycqrYPIOAfmBAG3F2iOyerPXb22+IGs6Hp+p6dJqmmwXDwv9kktIJr14nIyBH5YjjO3n 5pHI5yoxXfeKvhjPJJs1K5uL63R3a2kRVTYrHIBKAZIGBz6V454o+Bz+LJp9c8R69dtfvEFkIZVi AAGDhgecADd1wBzXneleOPB3iOw0bwwnhqC6XSJpYLrxVZSxoJY9wAZ1jXe4GVXfgrnPXnCbad2C S6H014Sg1OyF7aX0zXFtA4W1lm/1pTHIY9wDwCfcdq6FTg15U3gW40TSkOh6/eQqqgRC2kzGg/hw vIOOPvZz3r0jS5Ll9MtHvPLF4YU88QnKeZgbtp7jOcVtF9GRJdS+z4xipo2yOarIOmanQ1ZJMelI OlJnNHUUAAPFIDnI7UHj3pAeaAIpLfbIrgc5FZX7S3/I82H/AGDk/wDRkldAhDFQfUVgftK/8jxY /wDYOT/0ZJWT/ix+ZX2WeTAA9qco5pvTtTvSuoyHhcVIFBxTEqVcUACqFpwbApeDSE4oGSbgtJuz zmqF7c+UhOa+Zf2tPjNrng/w3b6fpGYLXUS8F3eICZIl44U5GCRnn2qZSUVdgk+h9Uq4dcqQw9Qa ZJg1+ZnwV/aL8S/CO+jWK4bUNDnkVpbC4mzCAc5O7BKSdORx6g8V+gfw4+KGhfFLQI9T0a4Jyqma 1mG2aBiMgMv8iOD2JrKFWNTYpxaN+7VSDXhHx98PjWfCup2wBy8TDI+le+3CZWvPfHemi6s5VK5B BGKuSurAj8/fgB4qHgz4s6RNM2y3uZDZzZOAA/Az9G2n8K7T4k3VponxA8SWUl5FZSpqgu0WKzDz lXAcsrdM/vCMH0ry34naFJ4U8c6jbrujAm86Js84Jz+hyPwrr/Fuuy+NNQh1iKS933+kQtcraxBw 0ybo23nPyjMeQcHsa5sJNwk4L+vxRVVJq5+kPwZ1uLXvht4fvIpJJkNqsfmSjDsU+Qlh2JK5xXep givA/wBkC+ab4Tw2rxvCbS5ljEcswlcA4fLMAM8sa97TkCu53TdzJEy4NOzTAOlKFG7PepZQ8Dil xgUKKfjikMYFOalC+1IBmnhPSgBVGKkA4pqinbqdwHhcDikPUUK2elOIz3oAQGpEGaaFAqROaYCr weakxzSGlWgAxSgYop3OMA80AJjNKBSDilGRQAUp4pAMmg5zQBtfGj/k07V/pD/6WpXwstfdXxn/ AOTT9W+kP/palfCyVxUPt+rLn0HipU5xmo1qRRiulmZMhqxHjBqvEOlWoxQhj4jyRVmJetQKADVl ewpgPCZqVE6U2NSanRDSAVEFSjA6UKuKcByKAGhc1n6khVSelayrUF9B50LcUgPMfFWqQ6dbyT3E qQRRjLSSMFA/E15pr3xLFu1nb6abS9e4kUKk0/lxvyDguCAODnk8+4zWN+1JrWo6TLp1sEZdMkct IwGQXBBAYencc88+leJ6Q8V/aLbxyRMbo/vRKyqFjRieDj5Tgnvnjg9q6cPThVdlL310/rd/f6GG IjKdNxvZPr/X9eZ9MeBfE99ZST2KTXGrxafbzXGqLPtEtkyS7SI23Hz02srcc43YyFrqfF2pxy6F LcQyB0ZMhga+f/B/xHg0u1jsfFSXF7pwtbpdK1CIhLm2mk2BPOOMsnyAc8EMccjj2zxXai+h1VJr +CW9nkvJ31a02f2dfyiOJxHEVOFfLP35yBjdxXRPDe0i3DSS6f1/TPmYZlVy+qqOLV4vaX9f8OvP cp/Cpk0/wzZXlxYy5EWpaj9osbjZKSFMS5UkjeoJYDA3oSOcV8lxkHxXqUc2Qs6OxMS9Mru4X06f QV9ceJQ+ieC7yz1tLS11Pw7oMdkQlobeVLl5siBpVyDKAjukh4YBx3NfK/iGI6F8QnjJdBLCEITg tlNuM9gT1PpmvmMVF+zafQ/QMrqxeJpVI2abXo18uh9R/s6a1HP4IZI5C6R3GASu3kxozDGezFhn vjNe0Wl1vxzXzN+zVqJ/sG+hcgSJIrNhgRyWXoOn3en49691PiG10iFXuZAryCTyY+8zIhYqvqcD p7j1rWjWhToKc3ZL9C8whJ4ufd2f3pP9Tv7Ri9akCYwe1fPcvx2vre6tdWt7ZV8Pt5UT28m0yiQq DIPvAggg4OMHIB5r3XQfFOj63Z6fPa38DC/j8y2RnAeQd8LnJx7U8LjqGMv7J7HDUpSpW5upvxr8 uakAwKVEwKcQB1Nejc5xmOacFzTlGRkU8LyKYEYXNLtp4AOfalx7UwImXio2SrBXIx0prL1qgKrK fpUeKsOPSoiCDSAjZaQelSFc0m3BplDMUp4p2KSgD2vxiP8AirNb9fts3/oZrJQc1r+MAT4t1v8A 6/Zv/QzWOOvXFYxfuoya1HMMHNJ1GRUd1f2lkpa5uoLZRGZS00qoAgOC2SegJAz71zep/E/wvpKn ztXglf5SI7bMzNn0C5zgAk+nfqK554vD09JVEvmi1Tm9kdYjYqZckV5Zqn7QXhnTEkKRX93tdFDR whUIYZU7nIxkZwDydp4xzXOSftJXN3pyyWWjQWtxudG86dp0GOhBjUZAyCfXkL0JrzZ51goK6nf0 TN44WrLoe7AcEU0HHevmm8+LXj7xFbKLSC4sxJCNyw2PlEEc53sxwWI65wFboTVSDQviF4ouPNlu L1fnE6NcXLS7JOMlVTKqBzgBeOtcNTiHCx2T/BGywU+rPpXVPEWm6Iu6/v7azXDH9/Kqk7RlsAnn A5rnrz4v+GbZcRXc9/MUEiw2dtJIzAnGBxjPBOCQQASeK8o0f4H61HPHdXV/5HlzGcEAIo74JJ3E fX0Gc1p3PgHwho373VNXtUKBt2Z2lJ3D5s9Dzjn1xXmS4iqS0pQ/P/gGqwtNfFI6HWf2gtFsFHkW c1w3mIPmlRcxtwXwCW4ORgjJ+nNZkfxj13VuLHTrZNrMjlFaXgj5GGSnTvkckjGBzXK3XxL+Ffhg iKC5fUJU+VVtow4+gIDEfnVC++P1pFbxvpHg2eSFzsjmv9wjY+27g/TFaRxmZ4n4INfh/X3i5cPD zOqbxR461kiJbiWEOvlvHEEjZSCMODjILd8HgcU6Twf4r1gSy399Iqy4dvMc4SQDAdQxwOO349TX Kap41+KElpFJNpy+GrCaMSpK1u6IIycB9+Au30Oeaxr7wv4n1C/WPUddu7t3Kq40+Tzl+YZBzBvy MA5PbB9K6oYLMq9nKVv6+4zlXowPQJvCOn6ZbhL/AMR21oiuJCYZFVuDnHy7uM9u9YF5rfw305ZP tGr3OrSbndhFucuzfeOQ3JOPSsG4+Ec+kzRz3+jj7PMjSpdateiNZYhtPmIGKlwQw+Uc54xkYret PDWm+HpJLSfW9HdyybpNCsGvvLXewZ4pAApwuGKP83GM5OK1hkFSprUqP5aGcsfGOxnwfErQ1RU0 HwVqF7tG1fNjCAjr1ABAz71cl8TePr+LfaeG9M0K3IwJL9w23/vr/GtlPCazQvLb2vi3X4DN9mkj mmGmW+4AYKO2dhLOmY5Bzz1+7XFP4p0XwhDcG9g8I6ZcSGVQ+oambqcsCVeRQGJV1xgKcqxB4I21 1R4cwq96pq/MweYN6JE1xJ4pu4pH1H4k2dpEsZkeDR0807c4yBGGPX096tW3w2hu7ZLuceK/E4lZ QhyY4pck5K5b5sYOQATxnGATXHSfHrQdOghht/E+p68rCOaW10HQUtASDkKsuFMMmQpZo9wJH8Vc /wCKfiU95dW507wNrOpR3Ugc3PinUWBuycGU+UnAYnq6tnkk84x308uy/D+9GK0/r5EqtiqzUILV /n5dz0q/8OeHbGJJE0Xw9DFJzCJLs3s1yu3+FYhlHDZUq+3kHBPWvGfjH8RPFHwJ8VWjeB/E0dpb 6hGzyNpMDpGrqcBV82NXHylSRyMk4Jr061h+Mmha1H/xKfDHg+W7jWERyW0DGSOU4jDtMWMhGCQT k8EnNdN4e+AOkeOPG/he4+L/AI803xvbvqR0NdKgvpFlikKKFMTR7QQHaNWJxwOvAFdMpUXTXsl5 p9H/AFsWqOJTi6i0km15paXXz3PEvAn7c/xcv5Da3ltZeNo0ySuqWCyPFwRlJE2upwT1Y/SvoKbW bnV9Vg1JLDXfCmkW8ZWeCOxkljf7rB18vzFXGW5CjHUnnC/VWjfsGfBHw6HfTfB4tJHXa0n264ck e4eQj9K+cPihpWj/ALM/xRtpPCOqWGuaNrsflzaWtxG9zbOpA3oFPIAxkHaDlckda5VNS0ZSVti5 YaRpV+ZNRGoa3LHdrmS+a3uf3qn1ZI1DD65rz74ieHfDXgfSprzwrcamNYX57cWwuI5BIf4xlef6 9MjNbWop4f8AiPeXtzp0utpPckPIbK/itYEOOkhB+dh6lD7cYrzvXfhjeWEUqW3iTRtPcMGCS6lc 3BKjq0iBfn/4AmK0drXSLW+rNHRfjHdePNQ00ePXm1FNKYI+mSWTx2s7heDcKdg3EMrD5toI+6RV z4hat498ARXWr6JFpXgzw9dyt9kh0yCKKZARlQ8yruJJB5VgORgDFcdefEzUbDS10bRpZdMtDEUf VvPy9zOBh5icb9vAVVU8IoznHNK48P6FFo+gT2Om614h8VuzL9qsdQdIImKZ3bTDuJ+8cLswO7YJ OaafqVax7/8ACPULjxl4PtfEd7YXnifWpmMyJLKx2Kp2HdNKWwd6Px1x1HQn2fwl46bW9UbSbvRr jSLtIDMqO4kQqrBWAYdxuTqOc8dDXhXgj45z+GJR4ek0W38NCSQSma6jkKKzLjDs0nGdowFUDP1J HrVj4+0jQdXYa5qtol7L+7b7LbORHzjaxG7byORngj5gMVvCSRk02emLinqcVRs9Qt762S4tJ47q 3fO2WFw6tzjgjg81bjbcOa6TInDU4NUYwaUE0wH96ToaBzTsYFACxt+8T6isP9pX/kebH/sHJ/6M krciH7xfqKxP2lf+R4sf+wcn/oySsX/Fj8yvss8mBIpy8npmhaevSusyFHFPWmdacD70gJAcU13x TlGaGTJpgZeoqZUYV478U/h1B4v0ye2uYhKjqeGGa9xkt949azL7S1mQgrmokk1ZlJ2Py88f/DHU /hhqzTi2+36RvyVlDFcej4IPfg0vw2+Iet+ANVj1rQ7ySCOLYLiXYXESZP7spuwyH0/LBr7/APGv w1tdetJYpYVcOCCCM18Y/F39nrUvBN5LqmhQmS3GS9ttDYHqoPH4flXnTpOm+aOxupKW59lfBn4/ 6P8AFvTooTjTtdEIlksJHBMidPMjOfmX17qeD6nrPEkPmQv9K/Lfw54ludA1GK/sbiawuIZkkk8q RVmDDndH8vyn73Ho2DX2j8F/2mLT4gWFrpPiCWG21xl2x3CsBHcHJAVv7khwfl6HqvXA3pVlLSW5 nKFtjxr9q7wqlvPZ6ukWHLmF3A6ggkZ+hB/OvE/Bs88l8YVa8dFQny7OUI3JA79Rz0r7T+PXhQeJ fBWpwRpvmEZkjA6ll+YfqK+J/B1tHceJ7aGVIXR9wInkKJ0PcdKIxtiYW6scn+7dz73/AGHbR9K8 K6tZs9nsZ4blYrSVnKllOd+ejcDIHHFfVET8V8N/sU6ydN+JOuaK8luu+1YpDAMkBHG0s4GH4Y8+ /vX3HFyoNd1RRUmoqxhFtrUnz0FPXimIvNSKMd6zLQoOKkXB69Kj704DtQBJkZ6U4kiogDnk1LjO KBigk0oU80LinjmgBVXFO4JxSKPanbfemA/GacPypBkAUooAcPWlHIpAtKoOaYDxwKWmjmlzimAp 4pM0Yox70AOBooxQFzQBt/Gj/k1DV/pD/wClqV8Koc9K+6vjQP8AjFDVx7Q/+lqV8LxrgVw0ft+r NJ9BYzk1Oq1HGoFWEXIrqMwTIq1GenFQqKsQDg5FAD1HIqzHziogKmiNAFmIHg1YjFRR5AqeP8qA HAYFOUc0oGacRikA4dqcVyCOtIBxTu2KYHnHxP8Ah3Z+NNHubW4iEiyLgjuD2I9CK+G/HPgTW/hd qN1DmRtOuMxmVOA65ztb0PAr9H7lQQQa88+IXgax8U6dPDcQpIHXBDDrWM6fP7y0aKUraHxfpepj xHBNJ5ii4kQpK0rSOggUg+XIPU44OeT7nI3vAPxB1D4eC8gksm1DwxdRTxz2V9GX+xmUGISEdmGB huPTuQee+I3w0vPAupzSWau1mT80RJPGc4PqKp2fiWHVLFmlaOG8GWlkdV/fHflIiD1T3+gPAGPa w+LjirQrvlqLZ9/66999zz8VhIVYOEo3i/w9P6/A+v8AV9Kg8aeFbqDTfEk914W1R7hbS4WR5ZL6 VJITEt0xjwFRnYg4BXPUAq1fK/x50ptG+I4gZo3mhY28hAJXejkEcgHH4VY8L/EDV/AFzrFtbNus L2F7PU7DIb7OJJBuaHnBI2Lg+p79a3rqCz12ERNGps3llXSJNQhUXEJ88vi5YNwSGP3s/kTXj5xV o0qbdb3Z/n/Wt+1mmedk2GxmCxHsovmp7p9v+D5dd0O+D+p3Hhm3vdsI87UlZdO2xkpcyRuwx1GB 82Afauy8d+MrXR7a9k1WYp9oklzp6vvOkX6YX92c/OSq4PUDPPtwGteL4PDVveWtijvqWo7lngRS kkc3mbg0GPuIQF4HXkdgaqaDoV3qXiG01zX7uC81QyRTrbXCB7YRkNw5B5YlQNo/vHksMV+eShWx VpVnamr2Xf8Arv8Ao2j7zE4qEZSqJe8zodBstX+KGvSahq7eZd3NxZ3Vv4YcOsmshiFZi2RtBA3H 5gTvyD3rRtPER8N6xpsWjG5IkvrkW+lxITNBMGCxxoAxJxhMZA6YOaxrQarr9zb+GvDFlcXs1wIJ 0WQnzraRcks0n8EWXPGRkKpODX1f8EfgHZ/D9213WZV1rxdcDM184ysOeqxDt6Z6n2HFevhcDOrK /wAMFsv6/wCH8zwpOVWXNUZ6h4WTUU8N6YurNv1MW6faTx/rMfNnHGc+nFaLrnmplXNOAyK+uWiD YhiOOvFSgD0o2cZp2MCrATGTSbeaUHBpx5oAZjimsuCakxj2ppGaYEDDFROM1YYYqFuvSgCPFI1S FeKawpjRHigpmnAcUu2mNHP/ABf+MXjCb4leLdH00CzS21y9gE9ra+ZII1lKgksSuepxgEkHoMVw 0H/CwfFSW8F5NeyWSo2+1a6JDlt3D4wx6jPXIOBtxkd98Yv2nfBHhP4n+LNLi0Z9Q1S11e6gnAhB bzFlYMRweMgnNedS/tY+N9eQr4d8Etb2+WUXN0jhEwMnOwMOBzjr7V+TTo5pipSiou13a9/w2PWV WjT1sjd0n4L+KrqSJnSGGNIzGkUkJkVB2OJcDA6ADAA5HPzV0ln8C7m3jc6n4ia3iaIQskUvkqE4 yMKCMHAJyTk8nnmvPNLvP2h/iLaXl0/k+HNNtWEc9w8JidCwBQBHZCS25cEgDqc8VSm+CGs6tYf2 t4t+KcSzQTNaT6bBdM7GbCEFfILhlAfcSCTxjbXRS4bzCu71JJa/10MZ5hThpfzPUrnwl8M/DoZ9 X1yxmbkuzlXbPck5PPviqLfGP4ReHJxb2Tm+uG+6tqmdx/4Dj+VcLon7N3gnVrWxvIda1TVdRkma 2e3sdJe4mbJ4nUyKu0MQoVSAfmJya9B0T4H+GtL1HS4m8Ea7d3k7PZXNvqd3Fp0ImUMyIGBGWKjc c564HTFezR4Th/y/qN/8D16HFPMn9lf1/n5DdO+PSas9sugeEreyjuHZI77VZo4YsgE5Y8sOncc5 FZx+JnjXXru3gvPFHhvwzFcCXCWpe9mQoxUKUVRy2Dj5vTOMjOneeEvDFlqen7bLwF4SkEFxaSS6 7rLXWydCFMmMfIRsO05wc9ORUq/G/wAGMlxDcfEKANLYCB7Lwd4ZIVmjY4TzGzuLE53jbkenFe1S yHLsPa8L6dX+PY5Xi61T4X1/r7jnI/AOt+KWmW+8TeMtdke2jMQsNMWzgFzIcJEzyvnaSRg8E+nS ul0/4ReF9Eub+11Pwxo9vdC8jhS88YeJPPaIIN0qskfC/dI+YHr3zmua8QfEqw8VT6ndTaN4z1u7 ns0SK41i9jtYWlXcFaRcqSq5UjABBU465qz4XXxp47g1Oy8MeDvClgzSR3izpA+o3EMcez5Fkbhl LAEg5yWr2I4fDUU+SKW2y/EyTrzte/X/AIZ7fedX4dvdB8N3LTaeuh6ZbLdSvBc6N4ckupFK/KsB kcch13kEZAIycZqca5rN1oKxarZ+JLuL7DLJaz3moJYQwtgec+xdokiHmIRjkEHI7155DqPjLUg1 ve+OtRsIbSVr1IbXyLCKJnJBKbSXUckYwMA9OaxpfCng6PxZDpd9qL+MIbeRVuZrC4n1MQocGSQH 5VAGT/CeRW9OrCrZ01dPXTy7P8zuq5Ti8NJQxK5Hyt+9pot97X8up1+r+O/D/hixkin1Pwbpt2BF ND/Z4fUblI8qNiEEq33QxSQAjcRxznOv/i3ZXrJp1ldeNPF9hb3vnRHS7RdOt3VhmRkYhXjOWkAX lcNwB0O9pmi6Z4GOq6nH4FhbSdOJU/2u0dg218+U7JxL6Ej696848WfH7RNM09oVk8OWcgj+zMWR r+Xecb5U8xgFbGF7Y+bHt5OKzWOHmqcPel1t3OqnklevB1sPapBWu1KKUdL8r5mm3rqtTR0XXfEE mv7tE+HmjYLSeTbeIdQe9cIX/dARIQVK8D5MZwPfORqfiTx3Z6ve+H9Z8dL4dnngW1u7DTdKjtSU 27grmUKd20gbjzjAzk4Pkdr+1AlnrU1y+saqhgk8+3NgscA8xHBj4VWwAMnGSMkelUdO/aTSM6vc J8PLTXNcvJYAusavvnnjf5i/39w3OefovSumrVqSUHTd1K9+6t3SfXpv1PWxmTYGhTqewxCk1H3e /O9nbVOKW65ou7SPoax/Z20jXrI3GueNb7XFu7X+0BDJqM10023CqpSNSpc9lDE4UntXVWHwP+Fe hahe2ek+Gb/XprULNJcTpHYQwxo4E+9pzk7QQuV6knHSvm3VP2vfjJrsxi06S08NwS3zzpbafAsf lMEVNm1c/KFUYJXk5615Td3/AIm1e9kvtV8WXskt1vhmK3DoTyWaN2GARzkkZGWGA1dHsZ1Irli7 93ofN4TCVZYeartqf2bWSXr5b7H1tr37R3gLQJorLQ9D8N+GrWzmJ866U310VbcoR+cEqG3dxnAz xXjvxR/aM0Dxdp1ppYv9X1mTT52axNlttYQGOW+RQeWYnoRgBRgGvDb2w8MaekgbU47uZ4yfNI3M Ccck5PPXgjI45Jpt34s0WFfJ0uxa6mAXbN5Zw7ZzyCc7QAMKc8gk5zwVaPvVIcyjGXS/M1otPPXW 9rr5H0sa1OGFhh/ZxU4p+/d813dXjr7rs7abWvuezeDf2tPFvhPVLi7tfCFrqV0bM2Cz6uj3Twsc bG3SZI2qAADwBnsSKwZvil8UPFvifTNVE0GkyxuhiMCgeWgYbflGSQWPHHU+mK87HjvWbpF+x6TF BCsmwTXJyBnnYzsQBnBJ6ZOT6YzpPFusXCyNcaxKZyJMJbx7yGP3g5OMg+o3dPasY08HShyScnG6 0Wi0f9W9TmwVd5bRdHDVJRi73s3rdu+u+t3p5n6HXn/BWPW9MR9M1bwhpUOoRpsmMLyyoTjkhSQM f8CNeCaX8SdH8S2cd1aSQW155vmQC9hjMSP08stklN3IBZSAMYPGa+a9OvZL0yS6jp66hOoAjkvf N4HZf3ZHv1r2TwQk/hvSLS71y2Ph21vyZbGO0lkUSkcGVhI5IUYHRSGxjPFc3KpN8i0/rc8ltReh 9ReH/HmheNo5bS5s9M8N3NnAsL/2okbPFJ0bBxhjnAUHrkkr0FYH/CjPDes3ai7ivfPuFeS2nuJy HlA5I2oco2Pm2EA47ZDAct4e0zw/4h+IenxeIIrXX9C1CNjp19YkFrSU7eMxDJbfx84I559B2fje y0vTbE22maGvie9gkRoLpi5FowYYS6DHy1LdDgLw2CFIqVvdor0ZmD4ead8O7S91iHUBrmoRQvBp dg4E5ildSnmSsv3UUMTs+8SOcAc6/wAM/GVnNrdifE/iqDw8i208d5JZrAZ2cBDFtyW2qTnciIh+ VcliflyL3w58RfEdjazW97pdjYzxLKINPURBY2AxlnHyDnlsqBzk1ueV4J+HnhWxN2x1jUbW9Y3W pxMJfLlkQFyofkgLEAGxn907LjIqX7r00K3Rm+GdY+HN34vm1W4XxT4nuheM9uuqwwiZGGNu197H ap+7gAZ5xXvemfE3Q7u3fS4PC15BH92NYkSRWPGRuBAJBPPv1xXlng740eBv7Is7b4m3+qarq7Tm aeXS1IRrcpmOKbIRlZDEUKocEOSSRXpHw2/aU+H2r+IYNA8O6JrD2euXYa0m8Q3Pk2tmxUBUi2LI I0OANo4z19aqE/MmSOo8K67a+GZItOuNGvdKtb+6AtbiQq6SSSHowUnyyTgdwTzkZr0PaRXnGs+O jp3ip9P8R21lp6Wc4KBfMucMDlXV1AHoRuUfmK77SdYstesY73T7lLu1ckCSM8ZBwQfQgggg8jFd VNp6IykrblxTg5NTKwPNQ59KUE9zWxBY6ng0uDUKtzUoYZoAkj/1i/UVhftLf8jxYf8AYOT/ANGS VvRn94v1FYH7S3/I82H/AGDk/wDRklYv+LH5lfZZ5OrkU5XzUZ60Zrq1MicDLZzUqjAqurhaUy0A Wl4p4OT1zVQTgDrWfqXi3SNCx/aOp2djlS4+0zrHkDqeT0FJsaTbsjcAHXvSGMMOmfrXEN8bPAql f+Kt0c7kLjbeRnIGc9D7Gli+N3gSYRlPFmksJFLqftScgde/b0rJ1IL7S+86Y4XES+Gm38n/AF1O vmskcdAa5nxD4Ot9VgdHjDAjHIqSD4seDLkKY/FWjsCpcH7dH0HU9e36VpQeMfD99HmDWtPnUrvz HdIw2+vB6VSlF7Mh0Ksd4tfJnxj8cf2XZJJpdY8Pg2t+p3lU+UOf6H3r5jMmp6RqE9jNHJZX5ZUm gYyE3RDBgG59QOR61+s1yunamhVJ4Zcru+RweD3r5/8Ajl+zjpfjm0kuIFW21BATHPGMEH0PqK5a lG/vQGpNaSPD/hp+0MZrL+xPFMkjgBkF3Kp323OAspPLDkfP1/veteLeLNOj8N/EK6giaAWyXO6N mXfGI2+ZTjuAGFVfGng7WPA+syWerxNHcKf3VwFGyXnOST1/GsGS8kkeMO7tLDgbmYMOCfu+3tXK 6rTXN0L5T6f/AGU9WTTvi5orJcySQzs8Oy1jxaAtEe5wVbd2x3r9FbY5UGvy0+EWqy2Xj3w7f209 zeQ2t1BLP5YWERjzOd64+fj0xx9K/UW0lBjU+or25rZ/1+pxo0EbFSLzUCNjv1qZHFZFjyo4OOel OWnKm/p6VIIPQUAMHPWnjHFMf5Ryagt7k3d4La1ikurkjIihXJA9T2A9zge9K6W49y2oqUDjNZk/ iLSLKbyrrX9CtZgcGGbVIhID6HBKg/Vq2I13xRyAAxyjdHIrB0ceqspKn8DUqcXomU4tbjUHJpzZ xRtINJ0Gf51ZA4GnCm9+tLu5oAeDigHNJu6UoPFMBQcUuabuGaCQadxjxQenFMo3AGlcB+SD7U8G mA0oOaYG78Z+f2UdW+kP/palfCw4FfdPxl/5NS1b6Q/+lqV8MLjcAe9cVH7fqzSfQdHxU8RqBFOT ViMcV0mZMq96sRDFRRjj61YROetMCVBz6VLHGN+e9MVelTL1FAFmMVYRaro3NTjdmkBIoqTbxTY1 5zUuDQAL70Nwp9KUDrmo5GAFAFW4fg81zmr3AVTzWrfXixh81w+uauMtg1LdhpHG+P8ARbbxBZyR yKPMxw2Oa+T/ABr4Fu9H1hUt42Msr7YxGM72J4AHqa+sdTuw0ckjOqKil2ZmAVQO5JrzjxHex297 fybRLFBHJHNKEOdpC4eBlb5sliM4xt55B48PH4ynh423l0R2UaUpvyOS8L+D44NIFvrQhi1C2aSG 5mcBRpR8yPLy7gS7EnaFX7uWwCayvF3i4aY0umWtpFNd3Tnz4BGriaTcSkoCj5ThgNo68564rqNQ hvPG19NBpirYQRwHbcSSNtuoy3yvKT1cscFs4G0Y5Ga5jwn4dh8PxLqF6ZWleeKN7mJGWa1l81/l i57iPluueBjHzeGvbV2sTjW5SdrL00X3dPl1u3pVqwor2dIt+AtAjsn/ALUvrqM6zLJDJFc3EiGF ciTzInVgcsflHoPfIYdP4d8H3Xitra3sbT+zdKcxB3ukVvLnSIeYQcAs/wA+dvQBl3ZwCeNvbi6v 3Z7QQw3CwocEsYfkAU7Cesh39emc7cZAr6F+GvifRvEuh313Z21npXieytpobjw+5MapbpaqJLyD ERHnExnPr3GAcfU4TK51rVMRpf4fP+u3bU+UzDHTwaVRQ5lfXy/rvsetfCrwNo3gnSvs+mwYkkO6 e5lO6adv7zt1P8hXptvgDAryPwnr7NGrp5slszTFC8TLJHGkxiHnjGEc4U4zg7hj0Hpel6glwikH mvSdJ0vdasejh8TTxUPaUndfl6m2tKFwfakjwRTwMUjpALQUxT0AzSkVQEaxZp22pNvy0mOPagCN hxTGHepiKYy9aAIGFRFOanI4phXNAERXH1pmPapSPzpCBTAiC5GaMU/FLjHaqGVPjCNH+GXxM8c3 N/beA9El1eee5jvb1pLq6T95IzSHKsY5JRIeAVUbfYVwXxC/aq+HWi6e8On/ABG13VXv7aK4u7bR 4ordPPU5EfERGwbm3DPOwDdXzt8f/hX4i1f46fFfxB5SXdjb+KtSEU0quyqxupGWPJZQDjtz7cc1 xlz4AsLfwbdajf6xZ6dq6oPLsZIGa4XaRukwsZDJtDDcGPI6HtyU8X70KaSTffRdl2tb1Lnllbkl VafKnbu11fe90e263+2T4IQX9voHgjUNaurtYn8/V7+SfM6qwM20kkn5iAp6AA1zfij9sfxj4s1a 4k8NeGdH8KpPJCGtbG3C7tjZVc4ByWbJwcnjgYrzHQbHTpiLy205r+OaXcZriUQIegjVZByGO4Nh gOh611Fh8Rf+EKv4YjrHh7R7u3aSJ5F04Xjb3UEtIpyPkJAVlBOVzyRWdPGRnVVKVVc3M42672vf VW87/ofQT4c9ng5YyWkFFSXnpeyXfyXpudBb/F/43/EzWLvUrDXdTe7kmF5c/YbcpDGYcEPuIxhO Bx6L14pvxJ8EeNdD1LTm8Z61qIudVj/tGKbUNRyJ4mO3eEiLEs3vg4HNcbJ8YNF0lLj+y73XtRu5 HeKea1mNrE9sc/KCPmKsdpKsvQAV0lv+0nOmlaGth8NNDa903d5t5qkb3IuGI+U7WIIK8EYYgew4 roxUuWcqWG5pWWjdrPutG/6seH9WlRcK8lCcZa8sbqSvHRybVt7ab6NNdT1TwZ8FfAVq2o2s3i+y 1vULZIp1/wCEe0l7/wAzefnQSEYUxgEksMEnBIr0K2+Cl9pbX+qRaFq8Oj2Ecd0INd1BNNkktedw ZE2nc5VumcD8q+Q9K+JPxCt5JE0/xIdKaSB4THYSKitE53OMoCMDnPPr71HqN7rPiia3j13xZqOq owEaCe6kkHlDO1cEnbyeMZHXHOM97oNtKhFteaS7efmVg41qUvaSV20077a9fXzPo3w54q8L+CvG GoeI5PFXhzw5qFveRvDYRW39ouY5vlK+axBbylO7oOVHNN1T9rXw54b8dDHiDxJ4y8P2TSQW5sz/ AGcksLx5YgYVx+82nBPRcDjivmr/AIRmwjliCgylAVZVX5t2M4YZCkDnupwMnHQaEOnyWaK1laWs KvAYyZ2DK656Mcc8gjJBywwuameAxFRvmm7XvbyXTRanrzqTnVnPlXK1ypPXlXSzVrtW3PVNQ/a2 n0W8EvhP4X6bpWoIJQ97qCSXMrCTOwkNwpVc4IPqenFeFQ+LPGuj/wBqPb6zPponPkXEKylVCs27 A/hUZ9CP1rQngvbuOVbjVPs8H3PLVFUBs5CMWO1HPt02nPNZlvY6fFLDczRnUXJ3Fv8Aj5MTLkDe oydvTAI5ySc8CrhhXSl7js/u/K/meVUw1Od3W1vvfXYzPE3im/8AEN/dXOveKLvVbi4ud1wPOZjI ef3meVP8/pWRbxWDFPI026v28ljJ+6IBBIAcEn1I7D06nNdpFqSSSQLF4d3W0Dnck2I1Q8bgxB3b cn5m4ODjjAFQBdSu4VCwx2cUq7vkj3kM3CuPuKSwJCrzgAkYIrWGXe9ZK/y/z06lKeGoqykreSM7 T9P1GK2P2PSIU8q3A3zTgh2DZLHaNvykr8rHAJHU8VLqWgeJCzXZuo47hYEeOJYgd6tg9CS284ye OnUgGrMllcLvM2sFAUwxtysYwoyCuASqruBI4ydwHSqV7Z6LDbPJPfPNNjzf39wWLKSOeGA3t7Ag AknkZrs+qcsWtvWVvy9V9wnjKa0gmylrOjahA7LfeK45omn8zbbyjy3wPnYHONwyQMA5PTis2Lw7 o8jp5t7earcsrho7cH53Odu04P3RgndjPI6DJ2T4n8NadLIGiikZSmZIk3A98qQBwvIHIycE8jFZ mofELTfka0spmkDsp5C5j7AnncTn5twOcDnHFcNWODi7yqJ+Wr/4HTt1M/bzl8MPvGWfheN3RotI aaNiPnmdQGQEgZA3FGYgeuevTOdWPwtrMsTQPJBYLtIKRxFg553MwPTbjbuUdVAGeDWNB421+6KL ax7Ain94m+Q5I4JIJweFAxjGBwOa39A+F3xW8bpF9h0jVTaz4iEpTyYTtzwWbC8bT1PavNrZnlGC herJ282orb5eb+7c3pYbHYl2oxb9E2PHhTTrWRbm/uTfSblQre3BXkDCxvyADxzlvlAI6irUPizQ NCtZI4buIcGJBbxBW2j7xZtudzdF44znORWzpv7JnifUbpJNU1Kws2ktmvFga6+1TSxrjO1Ygd2c 16Sf2PPDECWs8Oo65q6yRxzrbWelmNpAWAkKs3ZQV4ySM96+ar8d5PhJJUVFvuk5de60+99H5nuU eE80xCvONl5tL8NzwvV/H8GqRRRWRurW4ZB/poYoSM/c7koMevUZ+nY/Df4J+KvHuo2d/c6Tqd7p U06GW+FrcSo6ZAxvRT16dR9a9/0n4CeAPCckNxD4Jvb6K3mUm413UUiDwuu0EqGGMtngqOK/R79n /W4fFngTQLUy2kjaJCbaaC1nMyRuh2QgseWKxjnPcg9RmuHAcW0M9xElTTulfWyulpsm3237kZnw 7iMpoRqVWmm7aX069Ufl9o/g+/8Ahfp+paaqw2ZuHT7ZYSWxcSJkbhl9zDjOSFbHHU13OlWni34t 6dCNH1+GHRYswzJEHcA4AKuruTu6/KQoAI45IH2l+194y8IWPh++8LaxpF/c61eac1xY3lraCRIS WKjc+dwG7AbAP3hwSRXwjY3P2+w0f/hFobW21a1ijttQ1nS7qdZZCoG/MJjVjnPXOCWHJzX0Ckpa s+f2WhW1n4L6/FaTK3je6i0PTpnQT3MhEckxzmONcncwJYEjv8oGQcZvhD4Z+ONT1xFUfYdFiYXF 3f3dvHbxGEZ3yzrtDbdpP3vmY8AbiDXpsvhLxyFhn0e0jjNvEI7S61Pd58SY/hjLuiE9/wBc15n4 x174oWV6nh/U75bg3k8bx29rD5zqQ6kN5SFcAlQCdvPrVSStomgXqev6JY+DbK7vLC4Gn2/hnWv9 N+33sjQ26S4LW63MigbxKEOFbIBBPPGZ7qDwzq13a33iXxz4XaygdLmHS9E826W3h25VStvuO8N1 Z8j5SAoryX4ofDmS+jtFi1drjUdNt4re5sLK3WdEuMkuCd/ARpBGS3HyjqOa7iL9i/UbzTrU/wBk wNMsbS3F9qGpxSSyyLkCBYwwjUHAOQxADe1EW3ewNWPoOL4leGF8PWcek6Xqur2MsK+XPa6escTg gcgySLx9cHnpXWeA9Pt7HR5Jbe1ltFu5ftDpNjduKqvQEgcKowCeQTnmuA8C/AuLwP4SsPDUviqe 409o/Nawhuo2KSksTHlOSAOg+prd8Kadd+GPEcGnWmsy3OkAyRvaX0u8qduQI93zZBA+UcYLHHGa 6It6ORk10R6MB604CmbqcG6CuozHigNz1pKAc0ATRP8AOv1FY37So/4rmx/7Byf+jJK1oh+8X6is n9pUf8VzYn/qHJ/6MkrF/wAWPzK+yzyUDmmufwpwPNIxzXUZEEkxQ1XlvNn0qWY4FY+oswU4zSKP Gf2r/i3qfgXwjp9tot29jd6hMwe5iYB1jUZIX0JJHI9D618OXGqq8dwLu/jluJGUN5mZQeclvM5I P068/j9fftKfDGT4kaXayQTG3vrPd5bMMo4OMq3cdOor5C1P4PeKNOmZG05pQD9+JgQf615OKjKU 9dj06Fd0oWglf7yvLrtlGbja/n/KqrldofjqeeCPbr3qU+ItOmhmR5JzvlBOdo3qQcsQDwQccA4P PNVF+GHiSRsDSps++B/WtOz+Cnie6xmyWIH+/Iv9M1wexu9n+J3rMq6Vlb/wFf5eX9XYh8T2RjkU STcyZJQqGfrhgcHZ1OVHBz7VYTxJbSzZGoTW480AsgwApzkooACr6r344rXsf2c9cuADNdWkIPYF 2P8A6DW5a/swyOB52tBD3CWpP82FH1Tm6HXHPMVBW0+63btbsv6bOem8S2zXE80essZTdYLtBkbS Scqu7hDnkdavQ+KLoBVh1+zVZbsRHfldoGPlI5/d88MemDXRR/svW4B3a3Mfpagf+zVM37NWnRLk 6peMfaNRT+py/qxss/raXgtPOXl/e8l/Vjkr7W7jW7iGO91DSbuJpGLxXE0nyAH7rM3y5x90jNVo 9Nt7uKxVtJsLyEb1U292IyRwcNzwwz075rodR+A1rZqTHqF0ceqD/GuJ1jwMdL3BLmZuc4ZO/wCd RLDTWtzaGeUmrVKKf3frF9jpLeKWT7Ax0vVpI9j4SK5WRcDbhlG07RzyPpzXuOlftjeN9IEa3FvJ NGE3b7rTOp7fddfl9T1r5V0rRdVutNkvk3w2Qk8qSbd8qn/ax0GadJ4k1jS5Z4l1CfYCFkeOQkHI 7c8gitZQxcEpOTs/N/rfzKhmWUVLqdDX0i+j7cvl/W/2jpv7dOqxM639tpM+1QwKQz2+4nPyjLP7 c9Oa6/T/ANtu1ud4fRbWXywMta6mCWY/wgPGuT+P518P6F4h8S66Hhj1GGaW4XJt7ggtInPA4PGc 8DFbdzL4ijMrXnh7T597KS0dsqkAdgQBjPf1rJVcdFaO/wB3/APQUuGa+8HHf+Zfzf3p+XT/AIP6 B/D79pSz8e+M9G8O2+lXtpcahfQ2TzmSGSOPeRk/K5JwD/d69a+15/B2i2gsrZbAzCVthl8x8jAz k4P/ANavyC/ZF12zn/aW8EG80C20kNqYkN0jMoiPllVULnaAW29upr9iLfTodJu9JsbdZGiVpZAz sZCMgk5Y+5rvoVa1SF6ujPlc3o4CjiOXL5c0Ld29de8Y/k/U4L4seELXQ/DcuoaWzb4pFjeDduyW 6Y75yRx71y+v+GU0fT18ORudgVX1OZDg3cxGSpP9xc4C/nzXafHPxhH8NPBp1W50qLWxPqsGLZp2 hCjrvLAE/Lsz0Nc3rl9PqesXFxcab/ZTsiboRcCdXY5JkVx1DBl9OnSumLcpJM8W1ldHA3vgDRp4 DEbCHaR02ivPLzxWP2e9SW9iEt74euZVS70dWz5m443Rg8LIOoIxnGDx09puSApxXgf7QvhS517R y8C75Y2V405+8DkY984xW1SK5dCYN3szvPFvxrm8IX9vNe+GtRXRLpVkjnkTy7hIyActCTuJGenH Q4zxnvovEWmXNvNPHeRyRwRefMUO4xR4+8wHKj6186/Fbwr8QtS1HTIPFGn2cl9pOmR2QsrJhNbT lF/dyS+arKTkIWXb24Ipfgj450Xw5BLoviaO60LWHs/sK3axZVFJYthR0DbsEqG6D7uKyjVmlqi3 BH03GQxYYYbfvFkKgfXIpWTjIrxW4+Fmj3qfaNM1eSMj7k1tch0/A8iqWla54u8A67Z29zqZ13Rp ZkieO4G6VQSBlW65GeB07YrdTe7Rny9j3UtigNmmvx06Ui8fWtiB7daAMUZzQ3K8UAO3UZqKMOPv YNS59qAHrTgOaYM9qeARTA3/AIx8/sp6t9If/S1K+FzwwNfdPxi5/ZU1X6Q/+liV8KSk7xiuOj9r 1ZpPoWUGTkVMi5NR2/bNTL96uozJ4RirSjC1XQAYq1HyOBSAE5qwgzUKISasRYDcmgCWNeRmrajM YPvVdOAfWrEfMdAEsfAp461EjAqOadv4oAVnwTWdfXixI2Tipbm5VFbJxXAeLfFMdqrKHGelS3Ya Vw8ReIFhDgNXn2pa3JOZPJRp3CM+1VJA2qWOSAeyn34Ncz4l8XzXLExkpHIXjSduFLhc7QT1OSvP Tn14qpqQTStIgmeULefam8q0aOG5ktLlUTcXYMGIbGMEbeBk9a+Zx+aeyao0NZv+v67fg++jh7rm noiDVdalSeG5u2UWphkljgDsg1KEsoMbKy4UAq34oe4Fc5Y3VjeX17Dqun3NxZW9hNPC8O1GtcyI F8z1jG4gjqSR/u1dljZEl1C8RRLO8skMALGPzQu4ouckseOPcfWqt7B5upjMctlOJWitrSON2kST ciutwN3DFVbCgckYwM8eVTpezmp1XzVH87f1/WlkTXxKXuUy5eamiCJHvptUQQQ2SWrt/wAftrHc Ha6krmNAqIMcnBJ6FlHRR/BLXtX8H32sauPsV1LAVhgt4xFIsYyRuHbqeOpGM9MV3PwB+GFtd3t7 rmtQPc6lZXbRQJPhkgbAclP++/wOe/J981OwWbT54yMhkI/SvosLgtPaVtWcC3u9z8yNM1+TT4fI v4ZLmyaVmbezYkZE2oM54KnuPXnPSuz025891upL9o76OZfK1IbQxnkfJST5iQACeSMHBB4GRzmv 6X9j1rUNPlVDFBq8sOJHwBuz/wB89Bz04rWvvCfiHwToOmazEHudHuoA8U69LZnxu3AdcEcH1wRg 17uXZnvhsSrwXXt2+7fye2jd+7H5aoU4VobTX6K/S2v5b9D6R8CfGV/GGvT2+s/YdP8AENyXmuEM UYtNekWWAwwMSMJyhyc8AdOpPovh3xHJaak+nYmkurVkt72BlO+C5LSgxrwPMUeUfmA4yAR1NfHO kajBeRrbzqLjTzEPIdSfNtVSRh5xbOcH6dx0xg+p+EPiXc6JPocfiWQzWQeAaZ4l2hprBJLgySO+ cgnDv1BHXoRXv1qSUV7TWD2l/n/ns/J3S/O6mCrZfVdfA/OP+XdeW66XR9iaRq0d5CrBgfpWyjbq 8O8G+II9PsNNhkuora4uLeOS0i3MyT2yQvmbKIdsjtFyhxyepJr0Hw740i1RMjPBw2QRg+h9DXi1 aMqMrPY+jwOYUsdC8NJLdf10O0UcU/Gagt7hZFBU9asqQaxPUDHajZjr3p+AaXbTAgIwaZjNTstR nqKAImWoiuOlWStQkc0AQkZphTmp2TP1pu0g0ARgYoYYxUhTFIOetUNHxv8AtP8AxAh0b45fEyK1 0qC6nTxBfxfaL24JeKUzuNyrFtXbtHSTJ9TkV4z46+KGqeLY44Li603TbYJ5P2PSLPYAueTubPJz k4erH7WHjCZv2jviraQ2ltAIPFWqx+adzs/+mS5PzFgp/wB0LXjq388+4uGmYjAznCnPUf4HNeTO rCcFBq6Xc9KjWnh3z0pNS11u7676+Z0VrNp1vvS5E9yGBxifAB7EjBz+dI+s6ZAsZhtRBJGCrYJb zM55Y5GO3AFZltYapqUsSRwO4lG1EVcK2OvAABx3/Wrdp4buJDG7XEMQlVjlWDEAYzlVyR7ZH8qu DqSfuR/AylWl1Zfg8T2o2E2T3DJGY8s3GOx6dqdb+KWgEYWzSRVXaPOYt/IirWm+CFnaPzDM7NAZ /LYrCxHbZvx5nfhQSe2a6XRPBmhJLB9pja7d0wiwyfupGOQQ7sFaNgcEfKRwR2NetRwWNqtX9310 OSWJUdnf0MCx8X3CTboo7SFsZ+63J/Dv/hW3Zt4x18Nc2GjSzRbhG1zDanYrMRgFyMKScc5BNdxp 8i6LELmx0LR/DylFliudTdZLmJE/5aIWwrhmUj5QSenNOufidbahFeQ6hrOu+LnuRDcGC0i+zW7T fxK3G75QBjHBNfRQy+NFf7XiGvw/9Ks38os5Hjq0tKS/X8tPxKQ8DaraWdtqGs+LNK0WKY+RLD5f nSwqrEE7EBBwV/hOefc1peGPB1v4jt450bXfEatI0MkhYWVnK3zbT5jdMKuTu5O4AdxSI3iPWVuL fwh8O7bRLWd43SWeLzpo9uDxI+TyRng1sWnwB+KnilpLnVdZlso5HMsrNM3JO3Oeenyr+QpyxeWY f4Iuf3vt1lZdP5SL4uonzSt/Xl/mRf8ACPaJoMoGoHQ7Z0OyVnaTUbhlGcO4zt+Ygn5T04rldf8A iV4fto5BDdXeqXBwsiALHCzcgMqKPlC5YAZ4yO2RXSXfwZ8A+HZFTxP49TUroH/j0spGupN3ptj3 YP1xVSHxR8LfDsxi0rw3JdOjbPtOsy+Sobn/AJZoHc9McgfhXmYjP3FctKEYL7/wVl36G9LASqe8 7y/rvv8AicSfiDqd+sCaJoLOyRfZx5sJP7vrjcDk5OScnncR0wKt2/gv4qeMJxcvFLCcsxkdAnBG DnjnjjntXRH4y65eNaxaHp1tp0UrMpj02wVWAHQiSTfn3wF6Vy2peJtd1oWz6trK3Ec6yxfPM9yO OcmPJ2HBAHA9uhr5mvnVSqmpVG12Wi/D1PcpZRUurxUfN6iv8B3tVaXXPGGn2YjALxwv5zoCccqm SOT6VZs/g94aa+e0trjW9dvUK/u7ZEhVlIzuUkkkAc8CqD6paW0Yabzrq5EKYkvSFZW6BPLOVkRc dNoyc/hdvPHdnJDPbrM1zF5iSrYWMZitl2Y3kb/mQ8AfKO56Dg/N4nMardqUNe7u/wAtPxR9Bh8o w6XNiJ/dZfnr+DOstPg34I00xza5qVjYWrk7fKmlv5jjACEIUCN1+8MccZ5rqtC+E/hy3sI57fwZ d3FwbQsZ9cnS0hSQFRI6gbSyDzBg89PxryQ/GfxHDIx0e1tdP2IJ0K2yPO4bIVXdl/eAB+45z6VV /wCEf8afEqOOVW1jxNMtwVjhjWSSMREkt833Uye3HWvn5YTNsbL36vKvu/CNn2v776/P2oY3J8u1 p0lJ+ev4yv8A+kn0PH8UPDvgfRbq2Gv6LosLxRahb6ZoVotw5YFcRF2A+c4Ukkdmrl/En7U3hSFr n+x7DWdXdLtbqEXl2/luDgzFkUqBk8AEMACeB0riNN/Zd8Sqbf8AtefTPDr5klK31yJJ2Rl5Hkpn IABPbqfSvTvht+x7p/irT7S+tRqviHTi4tU1EgWGnBySSjyncw5POfUDuBVUeDsM5e0rtyfrbt21 e3Vvd9zDEcZYjWOHior7/wDgfgeZH9q3xbY3VuPD2laNoBhmaSNobdAzJIDtUtgZCg+3vSWXj74z fECQFNW12QASRJPaRCNGDnP3jt6n+mK+wvCH7L/gnwrqa2d5cW8d+k/lnTvCmmnUrxQB1ad94+Zi ijAUjd2IOPdXuNF+Hmh293cWvhv4bWdxFJBJeeIbhbrUGaIFt3lMQqvtXgbusg4PFfQUuH8tou/s Yt92rvr1d31Z8xWz/Ma+9Zr0dvysfAng79hn40fFXULWPV559Mjlk+ym51q5kCIyrkKSfboFB9q+ 4P2Mf2d4fgRqcVvceNrjxG+ooyG10i5uUtba6iYiQSFHCOWVcDeM/KMDvXk3xC/4KE+B2Wez0TSN Y+IOsyW8EsdxqHFvb3i8MyRAAAbSeQDkt6ZJ4zwj+0b8dvi98TfD9poVhB4K8NnXbe7eC2s2e3tz wo89kGfLIU5zgdTngY9eMKVGNopJHiVa1SrrUlf1P0x+I3gvwl400a4i13TLK+tol82a6ulBW2VQ SXL9iozj6+ma+B/FuseGfAHxi1668Ea1Yatp89tB9gtfPj2yyDdvjYNhmxxhkycFcE4YV+i0uk3+ s+GpNO1a+gaa5hMVxLZW2xGDDDAJIz8HPcmvgr9rb9lE/DPw7/wmukak1/Bb3UETo8YjmgVnVFWP bgYwQoC4OccGnCVtLiViex17xf4ks5JQbGKKWMGKQu0QBYZ4XYWJX7uScHriuB8Y6D408OaLcXOj 3+l6RJzJcXtpF5D47v5h4VuuXUKSDgmtHQvDPiHxVoo1DUfDtpq1xG/k79Us47i5hjUYVBCZYxFn 7xwzE7uTkcauiaZ/Zd2De+BITJGd0NxJax28aEdx5ly5U+6g12WTWtxarY8n8F+Fda8c3CR6XFJ4 WCWoae5ntUlferqkckRdSV3FyOeRnP0m+KHwbi8LazpGoeIfGOpanrku8yxIqyzyQhG4VACSSwVV H1PRWI6v42+LfEeljS7XSZLHS9PlnjubsxAyu7I2UZpsDocKoVQASTxkmsjwF41F58dtJ8S/2Zay eXdzyxHUbthLM7KVjRY1PLJk/KzbTtHTisdI6WLd2r3PU/gJ8Er7V7K7k1jTLrT7ZbeK6jj1C3VY ip3EBpW+84HJAwBkc11OoeDvCc16I7K+tTqBkCi50xluPKcHI+aLKq4IyNxHIHIrhta8Jav4h8dp N478Ya3rGj6m8g0gW5LpaXLNvgb7PHlXAxtKqvIPtXtN3p/iyy0jSZbnw/pNh4nmtw0hUEQog+VX cD+NuflHAAGT2GyuvdsZvvc68ksAduM84Pak31yHh7xVqw1WLRvEdnBDqE+421zY7vJmCqWKkNyr BVJz0OD079cvNdadzFokRqkDCoRTgaoCeM/vF+orJ/aX/wCR4sf+wcn/AKMkrThOJF+orM/aX/5H iw/7Byf+jJKxf8WPzK+yzyRTxSHinDGKXAIrqMiuyb+1V5LESA5Gav8AlilEdIaMC78NQXa4eMEH 1FY0/wAN9OnPzWyH8K7tY+BThACaQ7nnJ+FOmE5Fsg/CnL8L9PXgQL+VekeRzThAB2pWRXMzzlPh nZ9oR+VOHw3th0iH5V6QkAz6VILYHtmiwczPMT8OrfH+qH5VE/w4tznMQ/KvVRar120otFPalYLs 8X1H4XW0qHMI/KvMfGnwkthDIwgGQD2r6uurRSpGK4Pxhpga3k+XtUuCe41Jo/Ny50OXSNV8R2Rs 0lW2m8zzZrnZHEuQ3KEjf1HHNb9v8G77x54ZvPEegT2txd28rQSwWUeyIjYpwowMHDfjW58V/D8V p8RtVVtPs7p7my85JLy4MKxsu7JHIDHAHFe4fsUTR67ZeJ9OkvIr3yfs7qkcIRUBDj8TwKHBSpKL /rf0/Um9pto+N9OiutMnlt4w9neQum+wfd5ssgPWMgZUj2Pf0r6h+Bnxb8N+J5bfQPFq29rqLKAl 6yFUDZI8qbIwrejdDkdD19C+PP7MNp4sjfUtLX7Dq8fzRzxDBJHIz+NfF+teHL3wzrD6frcP9naj b8xyCHet227jeWbGOnb1zXA1Ki/I6E1I/RK8+AGl3sqXFrF9mukO6OeH5WU+xr0bwvJ8UtF8mKPx xfvaxgAJcIkpx6ZZTWR+wH8PvHfi3wF9u8azrY6Gy50m3kQC6aMMRuTk/uBwFLAk84+XGforxH4L Gj+Y1rKLu3jO12XG6M+jY/n7GuiMqcmQ+ZHnHiqHVfGelGDXdQk1CUIVXcqqoz1IVQAD+Fc14U+I EnhSzt/DPjRntYLMeTpniBkZoDF/DDcEAlCvRXwRjg9M13sibWINVZ7OG5BSWJZEPBVlyK1dNPbQ lS7l6Kwl1G3Fxp/kajbuMpPaXUUkbD13B8D8cVnWOk6fHrUGoajPb6ldWjiSDTbRxKiSDo88g+Ub TyEUkk4J44rLTwF4dWfzhotkJc53eSuf5VuRQx28axxIsaLwFUYApck5aSegXitkO1MHVrqWafDy SMWYnua5bWfh1pOvoVu7OKYerKCRXVKME1KpArblVrE3Z5pD8EdOtZVktLu6tGHQxyHI+hPSt7wp 8LdM8LSxyRvLMYvuLI3yr3zjvXXBqfuqeSN72HzMeTn1pAKBS549askceRSZ9aAKRgcUAOBFGc0g HFOAzQAq9KeDTBTwRQB0Hxhx/wAMp6r9If8A0sSvhdxliRX3P8Yv+TUtV+kP/palfDo5NclH7Xqz SfQfDwKsKOQahQY7VMCMgV0mZZjGOcVZj61DEM96tRqPxoGA4OKmUdKZjOD3FSquFoAlz3p4mCoc mq08nlRNWObyS6l8uM4A6n0pCsbq3qDvWfqfiCGwiLO+MVSjnsTA8ovUlReGkjbcqn3I4FeT/E/x hY6BDPe3t0X0632gpA43zu2dkSnBAJ2sSxBChScE4Uw5JIqx02v/ABFQxOIzu7DHJJrgZ0bWZbia +mMghiFxJaW0sTNHC8TMs0hLjAB2EoOSDztJAbj/AAl4xvNcSbxDf6rZWWiNdCwk0yCUJJbKwwJY k3iRsCQ56lwsmWBANd5ffDzxbrnivVPDPh3S7/UrXR90iXFpG0zNaGBQA5IOVKqpXJwM4UHNfN5l LGVnGhhlZS3f9bfm/K2vbQ9lFOU+hzWt6z/ZctzYF5tTvkjWxkuZGkijNukaCGSJSTsPBHT5kIwB k1itpt3NF/aV1O9ze3byQmRo3aYyCISIzAKcK5ZcHuSTzgmkWC306yvCsatcWWWeylwoWFoziYlj hiHK/J3285ziuo8LfDK9+IOp3MGny/adN3+Rea/Mm0XkIjRV8tVfAYFCfXkFiCSK8jD4dUZKlh1z Se8v8uy/rzMK+LlVfLHY5Oz8H3fiW/u7G1tTdazL5nnxKWWPR7gOFJAYfMpRAM5J5HUrz6Z8IPhC urT+ILiawutV1i01ywtILqyCpH5j4ecMAQUZgwKMeMrgY7e16L4K0zwN4c+x2ERAVP3k8rb5ZWx9 52PJP+RXKfAxreeyvLplsoZb3xu0LTXEzQlo1twMuQRlFZflP8Lkknmvp6ODjQSctZM50rI7bwVF dSz+I769BN5d6vczSFoPIYncF5TJ2n5eRnrXSXKEwsPUVjeAI5X8NwyzvLJJLLNMzTNuc7pWbk9z z1roZk+Q160dEB+dHxg0/wDsb4oeMo/IDHzYrpHwMr8y5xn1yeK+sfgJo1n4t+DlnY6hbrMIJJ7Z 1kjxx5jEDb2+VhxXzz+09ozw/FfUHRXIutLMhCHAOw5JPqABn8K+gv2Sr5rnwbqsDpJGUvVlVZZR I214IiDu75OT9OO1ePR93GSj3v8AofW4iPPk1Ob6SS6/37+XY8Y+MH7Nmo+AruTW/C8Ut3pe7fPZ RY82Jc5PlnBOPVf51wPhTXfLtvs8rf2pZylRd2MUTO24xPtWNSoxgLyPVR9R+jTWcdypSRQynggi vEPGn7MXhu4+JOgeJpHm03SBexyaqlmoy8efmIzwrYz82K+pwWLlhJcslzU3uvXt0+WzPjqtNVFr ueVeG4vEHgrTdHsJdE/4SD4d+KNVt7GD7QTE5mCnEUU25cKPNIJJwpBHY1+ofwn+DC+D/CzeFNb0 i31i2nt0u77WppFZru8bh1CAAqEUKFbjgDvmvzN/bMn8beOfi5pvgqx0ZLXQtHtT/wAItoWjrvja w27hJGF5kYrGSSOflIwCpFfT/wCwp+054o1D4YSaZrZbWholx9iH21yk4j2gphznOBkYYE/KOe1e bVrzruUIq0b6Lsu1/I5IYGjRqOvBe893+tvPr3GfEDxf4c8E+Pdf8OWV1OZbC4MSWk6N5v3QfTkE 52nqQM1b0rS/EWr20d293p+nRSDckLs8smOxOwFR/wB9Z9qp/tNfEMeKviNo2szaI9roWlQNHLe2 ZP2pJGIzLuUZdYwR8v8ACJGYZzit7w9NaRaRarYz/aLTYGjlMm/cp5Bz361nByejPS0SKsd5faTK sWpeQ6E4E9s5K+2QwVh9cYzxnNbqkOoI71i+MrFdV8P3SFtsqIWikHVWA4NQfDbWn8ReEbO7f/WD dE57FlODj6HI/CtU2nysTta6OhK5J7VG8fFWWTHNIUGK0JKwXK1Cy1ZYHNRFSe1AEWMYppGalYYF MoAYVppSpOopCDTBH5oftQQRxftKfFiVo7RM+L9W+dyWf/j7l5K56fhXm67TGWjmmWUH92tvCEBB 6/N1+mc/hX6jfEP9jTwNrfxa8Y69qEV1c3Wo61eXkoM5VQ0k7scAY45q9o/7L/w60Qq0Xhq0kkH8 c6+YSfXLZrKEEoq0UW56n5a6fpl3fqY4bK4uSHykcbFhj+LgAnJwv+cV6V4Y+G3jfWPKTTvDt3Ai 7/LeO1IcKQfkcvgMvOOnOOa/Sp/DfhLwVZG6nh0zR7WPgzTbIUX6scCvMfGf7X3wu8EpILS8k1+W M7SukQeYgbsDIcJ2PRj0rZYiVDVyt+BHK6mkVc+Z/Dn7KPxA1EwNd6fbRRAszQ3twxQlu4SPbtP4 4/CvQ/Dn7EusJHF/aHieaAJG0e2yAhyrfeUsOWB981geNP8AgoDr+oxMPCvh+z02MkqJbpzczZ9Q o2qv47hXiPin47+PvGcyNrXiS8vIpSQbRZvKh4PIaKLA9RyK4amcKmuWM38tPysd9LLK1XVxsvP+ mfTd78Ffgr8L1X/hJvEdm08QwIJrjzpR7CNct+lYOpftDfCjwcDF4Z8JT6pIillluVW0iYDPQkFz yMfdFfIMtyyAhnYtGu5lY7cqcbSAevXPTvmrr6ekayCUxWhjVQriNyJnYrlec4YAnPAxtIrx55lN /wAOP6np08sgtas/0Pc9b/bD8Y6t5keiWOneH7bYSGsrLz5V6nlpDjp3C15v4g8e+JfGkEv9uate X6fKT9tumcKdwztjBCL908Y6VzsOn6fJqb293qMsUMRES3BgIHAztIY4GTwORgcn0FT+0NNtBCZZ Eu5W3CWOaUhFP8LL5fPGT1PJ9q5JTxddX5rI7orL8M7NXa+ff/gbGlem3tvOj+0tMgdcRkeUGGOc op6+/wDjTLKcRSC5tIYbdVfzQdoO0Bffc235sZIx+VUrDzNQMH9nadfXkiI0Z+z2m/fnOfmOR0P9 04/DNbUWm6tdT28lzpdrCrKIx9unKhQMn/VwbSBweMGsoYCpL4pmtTOKEXanT06EAuftc6RzFmjC CZBNKM7m5wrsQqgk55B7nkitnQ/hj4l8S3xistIvru0M6bZoYCIHXuN/CZPA645PNdbpUPimK2hj 0+a2sC8Zz/YmhxJNtOeftDqJG6dckjIx1rQ0jwob+F38Q3y380m+JH1jU5JQJe7DBABXkkNnnHXm u6ngKcdXqeXWzerV+HQhH7NupaXexyeJ/EHh/wAKBpGlVdRvENyyEAYaKLcG79xnJrbsvh38MvCN s02oarrviCSCEySx6bZRWSxqxyDmQlyrFhyh4B/Cs/Sn07S9HmhkNxBBcWpgMkEQtwAp+bzQw+fJ yMhgQMHtio5NfsZbuFrW3gmvIF8thZo99I/UI0cgAQhRj5XOM9CR07oUqUNEjzKmJq1NZSO+0nUP DumAR+EPhjYNeCSJUu9QEmpeaGzuZHfaAy46f4V0l54w1qaJDrWvyaTZo8mxNPRJGfB+WJ7eIoUG Mkli2eCMivN7GTxrrcZtjoc+yZ1KQXMxt4pgCC263i5ZjgDKEN05PFdvo/wQ8f3M0Fxf6vb+CYbu eRopnk+xSxMgYuu9y10qgjHTBZh6ipq4qjh1+8kl+H4HHKcVrJi22paT4c09Wj0uOB8sYtb8Qal5 IPzfvfsrDywTuLfK6ueOeRza1H9oHRpxLbpFqvjeZU328OlW66Xp8coYYWVNuyVeuWEYJ45B5HQe D/gN4FtX0++fQfEnj/VbkTC58iF1ga4G4qPPkA+9t3fNg4cE8giuxNxoHhjT7eG8t/B/gHTr+wkt muJ2Gp3kM0WfMkAJMY3bNq4bP7zIzjjyK2eUo+7Ti2/6+fR9DleIgttTiLnx5+0R8RXXTtCsLf4Y eH7mSBzBoWnNDAuXCo7ysNq5IHQgHb0wDWLa/st6RL4kS8+KPjtdSvpb9rG5WS9kvrxZ9u45RARt GRk7vUdcVoeMP2sPhelrJDqlx4k+IOoXVr+/Sedre2+0xnEDCNNpUbdxwH/jPU81yC/Hb4k+MoNQ i+H/AMPtN8I2Gp2MdlPdJbCKQ4ILy+Z8pJc5Bzu4OK4XXzPFu1OHKv67/Pp2Fz1mrpWR9FeEPhP4 b+HE2lTWngQWVoJHsbzUPFk8NpCJJGxA6QcuxOQ3I4CEdc4x/F/7SPw58C3Edp4m8ZHxHbTWsmnX +jeEofIhWSBsxyFwwcljjkEDg9R18HvPgj46+ISG++IvxGuXtJyzMkl0y27tErZAY/L8oDjhTj5v ervh/wCA3gGfTHXRNM1DVpGtAf7UcrFaR3DAko08w2ttU7iFUdAAcnA9KhwzjcVJVMTP+vn+i7Hg 4nN8BhburV5mt1HW3q9l87H6Yfs0ftJ6B8fvh/p+p6ZFfxX8cYivLaa1lIgkHQNNt8skrtfAbOGG cV59+0B8A/FvxF8V3+pade6ldaXO0b/2fdXpeGALHtYQw79vzHDZxkEHA5rlP2J9Q8P+CPE134c0 /UdHt4NetzPaaRp1y9wyPbkrI7SMzbmYNyRxhVHOK+qvid4vl8B/D/W9dsbaC+vrG2aeG0nm8pZm XnbuwTnGcADk8d69uvQeEqezlqz28vx0MwoRxFK6T77q3Rnw3Zf2n8Iom8OWWmXmoQszy7IUH2q0 5AclWKq4ywxkqee+K5PxHNb+MVnSG+1qTUHmFutmltdRRRyEgbXVFYu4yOGYk8DcK2PGXxA1H4te K7rV9Qezs/7Q0yKNrW0MiJbzK8bFH+dHcsu5DgjJUcYPO34f8PeILez1jTNNk0m3vLN4rK3+zWkk UEMbx75iEEhO9g0ahgehkGPmNFrnqJ2OLXwzpPgrw9dWB8QXfiDUJV+ay1eCS9srV/75iiR42cHp ubK91JpglXxHodu+iakmo6v56q1tpTzxTW9oBkNDExjeTIBB25K7sgkdO1b4XeKobYodP0i7btIt /LAR+HlP/OvGvFHwj8YaN4ksJS1lY2UTtJGILl5Zo9oaQhTsXgbScccdO1Eqbiroaknoeu/Br9or w14T03Vh/wAKq1G1ku7iSGxWK789ord8K6rIRvClgzEqo5ODzgn0LSfjlfz+HrSytfAUun6XpcPl W819qcsksi5+6S0IOMZ5OcV5z4b+LEui6HcSeILC2t/FiBEe4u/LWW/QBgrRqzp5rBsZIIyrEn5h 83rfg/4gfD3S/Bfhq5+JniOKHWdaRnayjR1hjkXAMX7oEj+9hjzk9hwotR1b1BrsjsotBvbr+xdc m+xPaXdoLi3aDczoWXJG44/hbqAMgnpzmS3u7a8Mn2e4inMZw4icNtPvjpWYmq6B438AHw9pviTw 5eSveMXtfDcwilayUkxo6bt/93d2OPQkVyGr+AV8Hsuq+H4mt9WtwfKTlhLnqjL3B6EVvTk7XMpL oekA0ZFIWVycYwemDkfnSBgOvH1rpMyaL/WJ9RWZ+0wceOrD/sHJ/wCjJK0oj+8T6isz9pkZ8dWH /YOT/wBGSVk/4sfmUvhZ5MOe1PAz0FMH1qQHFdRkPC8U4J0pgc1IjE0gH7OKkUdM00cd6dj3pAPX lqlC55qFOoqdTzQUSBccUuOaVCadjpQABR9Kcq0DAxTlNAEMyDBzXLeJbNZbZ+O3WuslYFDkVx/i 7UBaWrtjOBSYz4t/aV8H3N7ruk3Fpp41CfzTEsW0tuyQRwOSOOR6Zr2P9in4TfETRvEeqXWqeGdY g0mWyO2aTS5YIGk3ocqzAbiRnoMYWvuD9n06FoXw00TWYbIy6lrEkoluI4w0hZHZdpY9FG3AHc9u a9C8LRXOgabJZ6XYXk5kunmMmoyEY8wl2JOMdSRhcjkc5yK4nXcbqKN/Zp6s+etW04mJwy8+mK8S 1f4eeD/E3xM8MReLrKCTSf7Sg84zDCkbxwx7KTgH2Jr61+JekLH4huXaIRGdEmMY7Ej5v/Hga8L8 e+AYdetZY2XO4EZrd/vIepmvdZ9hnStIs/EsR0vT4otXSyS2+0RptWG1DZCDtjI6Dnp6Vbiawtln sUAkiRWkuZmIKqTydxJ788dh7V8q/BT49+I/hVaDw54xsr3X9EhG2x1K2HmXEKjpG4JG4Dsc8dPS tHxD+0PrXjr4i2Gh+GvC0h8FpDPea19qcQXNxGi7mK4OEAwAMn5iQCVHNcDjKO5urM6fWJbSXUpI 7MmRXdvKVASzDPGAOagk0q9t4jJPZXVtGP457d41/NgK4w6uPFDaifB/iDVrPw7dMk4kRTA7syDK JJgS7V4GDgZLYz1rnX0XxN4YuBe6N4r1m3uEO7DXjujf7ysSrfiDXapSaukYtK+p6fsIx3oNQeAf FH/CxbG7tb63hsvFNjEZ3FsuyK+iHDOqdFkXI3AcHOR1IFlx81awlzENWE4Bp2M008U4PjrWggVc HFPIFIDuNP7CgBwXIpC20gc5NKOKUAGgBFLY54pw6UppR1oAbj2pQKceaQnFAB3pVpFO6lFAHQ/G E4/ZR1X6Q/8ApalfDq819w/GL/k1HVfpD/6WJXw+nCqK5KP2vVmkuhOpC0+EZYUzbxz1qaEbSK6S C5GoAqzGuQO1V4jngVZjBHU/hQA9F+UjofWpUPygZqJ5BGpbsKqJrVvJEzrIjBTzg9KQxuuTeTbO xOBisHwtaW2tq13qbI1mWIgs5SNkgBwZJF/iBIIVD8uBuIbcu3ifGHjmTxZfz6VYXX2e1QtHuRlW S4cfeAZvlRAeCx7g9MZp3gvV/D+qXWn2GpaaWneGG3juJGLI5SFAEyDgEADjvjvWEpJysWk7XPYN Y1/SrTTf9MuYvJRdoV3G1fb0r5X+KmgReKNZvr0Wbw6LFt80MhVnkYgKQOoOOpIzjHGCDX0XrVpo ng/Tzd2mlW325iIrdY4182WRuFUHryfyGSelcn4s0qHRvBjwXsiSXcmZ55B/FKeTj2HAHoAKJxur CTs7nztF8MtK8NabdeIbq4hSJIvOisYtzeXkkbTuHJB47j3PNfWv7HX7YXh34X/A7xVYeItds9O8 RSX+/S4lsHnmk3oMtJjAcAjqzZ69eBXz1r+ny+ONN0TSNJtmkku4RGY7ZSysdoklKA5LMSDnHyqT wBzjs1+AFnC3heGTQ44oRPt+yjUllZ3KE5Zk2jnaSSTnoOAMVzdLItxvoz6C+Knwc0H4nXfhHx5o OpT6foWs2kt/c6LGfKZ5JCm5iqswVHMYOzOVK4/3b+naTbaLZRWdnbx21vCu1Iol2qo9ABWd4e8V 22n+ToDWqaXLboEjtV27Ao/uFSVIH+yTiuhP7wZrpo0oU1eC33OflUdkcd441ZdP0m5YkDCE/pXN fAm9i8N+CfD19dTz2cos9b8QLLPaK8UZYiNGJOd8Tq5Ug9GK4HOaufFGzknitYAMJcXEcLD1VmAI /WutsvCMdnPHpVhpsdvo/wBglsXaK5lVhBIfntwgO3y24JHc1o4Ob0G5JIk8C2otfCOjwBAnl2kS 7RnAwg9a25EOMU3ToPskX2UoYzCzx7GHICsQP5VakTcCBzWlraBe58bfta6RGfHXhyZ0RluI5rY7 32KCy8Et2wefwrf/AGLdajMGp2J8tGkt4JlVRhmZWkRy3qR+7zjsy969Q8U/s/QftBfErS/D95qc +kRW8El6s0Cgs+0qNoz0656HpXq3wy/ZI8MeA4PEWo6ZZ67Dq9pNcrHPqLIsdwpKM7xqnG19gwD0 x788Kw83iFVWx7McfRjgJ4WafNe6+9b6+T6dS3DwKr61qUFnp0zXBURbTkN0q2IypxXnvj2N9e8U aL4dBIguGae5CkgmJMZH0JK55HGcc12Sdlc8dK555ceHdQ+IuoQXMG+0sNLYjT7i4vYrQxM8gy0M svON0fCpn5s9CDXaaZpXjXwTqet3ctlYtZ3t2buaWJowrOyqGeR4t20kjkuvzHnOTivUZ9Mspvsv m2sM32YKIQ6AiPaMLtGMDA6Y6dq534k6VNq2ii7sTImpWDefCYW2u4AIdAR/eUkDtnae1ZKMleVy /dZwHii/1jSfEUOsXOlzy6fdwi3nWCVJEDDJBGSuMg9SP4QO9VPB3i6Dwzd3dpbvJ9gSTzBYSriR I2G7zIh0YA7gVUnIXcPmyG6j4S+J4vFuiXllcbJzbOEJxhXU4KsB2GCD7E4GMCpPEXww8N6v4gMU 0N3ZfaLHcrabcCLLRP8AeIZHAI81T8oXkZ6kmhX3iNpbMwvF3xx0yBRptr5t5dXQCxC2jMm7dwv3 R3yMV6H8J9PGkeCLO3Z0aRi8rhG3AMxLNgjqMk18+TfD+48NeJ9btNJjnup57TYGmKyyhgctJHhV 2h1lXIAyDvGSM57PwjaeMfhZa3+sz2tz4g8CCZU/tCzSSRrQlELBoyN2xXZo9y5H7vp3Mqb5rzG4 q2h7+wGM0wHNZXhzxNYeJ9OivLC6jubeRdyvEwYEVrYFdZiRkc1Gy85/OpiKYwJWgCB14qHGDVhg fSoiuDQBGRigqaftxSj8KYzwn4/ft3XfhH4v+ONA0vwnFcNpmrXtibm6uiA8qTugYKFBK/KDjP49 6+f/ABf+3H8SddtiUvrHQbbJjZNJh2yMQP78gfH4Yrzr9qCXVNQ/aa+LNvbQ3E4TxdqyoqZIH+mS 9MVxFr8M/EN9H5twkGnozbcXEoV/++fvfpXzntcVPaVkexfCQj8N3/X9blrxD4+1XxRM99qurX+p XpY/vbucylRzwpckjt0xisJdUkkk3TMgXqxkbczH1OTzjNddpnwda8haT7fcXjeYEX7HasY2GcE7 2247Y45rrdK+D1lY27G+0ZbV0lAeTVr8I6Kcbf3S4LdQeD6il7B1PidyPrnJ/DSR5QmqxkGM3Mzp 5gPlxgsnfJ25HPJx9auW2n32o+ZJZaTfXMKsMSFSEA7huMfqK9kGh6V4evoyLq3JWRVdtEs1kjQc Hlm5GORwTz1rpdP8PXniWaWXTvDOsazcmQkzXt2zqyjgMNgwWOeh6CtY4WK6GUsZVl1PC4PB+s3j zyFdN08MFkCGbzSRkYCqCxPrWnafDi7uCrtf3lyrMGzp9qUiz/vNt2nj+7+NfTHhP9n34jXLK1vo Vjo6lhIMW6KmeOMuWdPqo5Irv9P/AGNvEeryRS614meIJnCCRpiN33sn5QR1wCOBxzXTHD22RySq yk9WfIC/CzTdOjAvI41umy+y/vcsFHfamCRweR6jpWtpuiaNZZa3hMoDj5tPsQVHPGJGGRnBGCev tzX2O/7Kvw88IW5fxJ4iit4WA3LczQ2ynHocBuvoa19L+H3wss1tzo3g/UfFRmlWGK4isZJIJJT9 1RPPtiJ4/vUp+zoq9SSivNmTn3PkOK9W4sXspYrq8WOcEQzTGQl8clo4yTx6jPLHNbmh+FPE+o/Z xp/h66MIJXba6YUYLkEkmUgMDz3719Zz+KtM8O2tj5Fj4Z8LxzX0lg0NxcC6vbfy9weRraEAFAUI yJe4qppHjK/8Q6to62dl4k1+zvLma3kjS0XRLF2VXMKxzt8+XKgkebwAep4ry6ua4OlrGTl6L9dj F14I8Hsvgt4+u2jl1Gyt7GyWYug1TUNsakn5QsaABMH+ENjnHvWjov7NVwEe6uNZvrqGSOSZjo+n FYfLBy7i4kG0jJ+9v7+9d9qnimfwne6Jeat4q8MfDxpGvNMvbyKd9V1FWUHdJIWJyoKIF+fOecck V5k/x48CPDYCNvF3xL1Y2k9jc2xd4LOSNT/o6ssWG2llRmG/jpzXnyzetVdsNSv63f5afiZ+2nJe 4jttB+Dvwr06LVJda1Syk1aysoryGGWdtSnl80EopAKjdwCVVm++ORWu9mmkaLrY8P8AhGVtKS2j urbxDrzppkIhBIkkiQGPeGJRUXLnJ6nIryzSPGvxTOnWB8N+ENC+HscFnNbTatOBDPOj/ed3yXyF AAy3GK43WdHt9SMK+OfizeaskVoI0stJZnRYlOViyMjG7kA45596uOEzXFO85cq+78v8+plOUl/E lb+vI918R/GrRvh2+sWE3ji0tGtbmG+tdJ8FwhIpJCPmRpZAC4VVjJYKcn3zXnGoftSWUOsXkXwu 8BT6xIbxLu31XWIje3O4Ekndg+XufYxAxyD/AHuOQ8OWPgozCDwH8O7rxZfgZa81LM6QsOWLKu5c YxzvXk13VxN4g06Db4n8Vad4DhcwzQaF4ft0kvZo2ZgFjZclSQufvMOR26+nhuGlNqdR83n0+/8A 4J5eIzLA4R8tSV5duv8A4CtTH8QXf7QXxYlF/r2vP4WsI5zdRvJdC3WB2UA4wScBRgZYU7wv+yPo 2qvLda1r974gMUT3TvCxjtWUfeInc7CcjnD54PYHHdWcDWuotrOmaRb6THzexa949vWeS9gEW1gk IOFJL9cL8rjgY45vxH8YPCLRx2ltd6x8RtZtX8+0YRFLH94294WjUgMoIxhs5DEdsD6qjk2Cwcea pZfh/wAP935nzcuIsXipeyy6h87Xt620Xza9NDo/DPhHwJoQhtfC2jRajrE9l50dvp8Szzxzf3JZ nyikAOcHrt68jOr4p8e2nhi1ZrrWtG8HQun9p2kYH9o34MQx5LbiI1JdScIwwUx1Y15jcp8UPHke xprL4e+H/Pea3trZhbGMOApHy7QxxkZIz8zeprpvh9+yDo11eWQn0jXPGF1LI0aSPCYbXcuS+JJS iEDDZ27uh4zXWsTSpK2Hp/Pb/g/kVLKcbjbSzPE8q/l0f4aR7dJddTzfxH8ftO1rUWj8HeHb3xDr JeGaLV9VD3k0cm7fJtTG1MtgfKuPlrVi8AfH/wCNE7PdzT6Hp0lybpftM/lbGIxlQuWGBgAYGABX 1Ho/g/SfBdnZJDq/grwjFJE0v2fe19d7FIBASMKu/ORjLdOM1tjRrrUzYi10vxr44Weyysqr/Yll 9oOTtY/JuVVDZOW5AwSenLUnXrX552XZaI9bD4XLMFb2dPna6vV/jt8jw/4afsxp8HNZh13VfG1v ba0kTBZDtRlDYDFSTuYnpnPfHevpD4X+Erfxp8QdNsNZg8Q6toskb+ZqtxG1vbJOArRxfOoLbgTy AR93nmua13Vbb4XTR3TeIvAfwrtrmBJGhLnVb+MxNyNzDJYs3XJHy8E5zVHwv8ZdK8f+Mp2+Hy+N Pi7rttNbaos8Ua2mm294eG8ziNVUKoADZHBxnljzOEIxavY9VYyrUa5IafofZ95+z94Cv4Ejn0NW aPBSVbiVXRgchlIbgggEEelfNnie80b4NfGfxnZ6hd/6DeW1re2rSzxKXZVMZVQzKN3DA/8AXNQB yAfrJ/EWrjRvtMfhe/a72bvsbz2ytn0LCUr+RNfnR8T/AIZSaFeXf2uG60db/UFI0y6/eyF2k3L5 kmASq9flxwpPJJJ8mnztt3PoU1azPRde/av+HOi28huNTkinXIMMkLKc+mSMZrij8bvCvjq4Zhqd jbxSAEIJ1uLoqCG2iOIts5AycknGPlBYHN8W6PdukHhh57LxLaznH2GRfst/bW+0kCSaIeXtIBO1 1zgcZ25Hi1z4K8B2Guy5thZuG+W3/tR5oIyP9pLU7s+zj6itnOf2iuVdD32XTNO+Il9JcwWov7Ox tZY1e9AjilllASOMZywb7z8qOIzjpVK7/Zpjg0Q3N3NY2zxrlFigDEe2ZC36YrA0PxbqNh4N1H+x ZtMP2K4t5msrUiNo7ciUSvEVYvknydzMzORtByAFOj4G+MPhbSNTGpeLtI1zxnq2nQx3VjHc7J7a 3iZ5D5al3+WMxMM+YPlkCkex7RJ3aBxdtD6F+Hvwh8M+LfhhpGq6b4abw/d2loYtSungIjnWMHMk e7/WM2MgrxyQW4GeYubLxFpM0V1FoMVzokBybWTUZmuGTPXbnygfYL7e9XY/20PC/inxFba/pvgr XLm6itZNPSIXpSCWJjzlEDKwyOG9OnWussvGg8QaJLc2fh/VVfeICskaCJZCFZkMm7qA393njpmn T1+JEu60RsaTqtrrWm29/Yv5lpOu6NiNp9CCOxBBBHYg1aZFdlJUEryD6VW0bT003Sra1SAW6Rgk Rht2CzFmye5JYk/WrWK7Ve2pzskhP7xPqKzv2mf+R6sP+wcn/oyStCL/AFieuRWf+0yAfHNgD/0D k/8ARklZv+LH5lL4WeSinqc1GOwp3411GZKCcehp6Z71GvNSqRUgSZyOaUEimA496cpyKAJkOKlU 5qFQQBUiE/jQMsqeKduqIN2qQY+tADwQ31p+044FMj61KFzz6UAQOmQc1x/jCwe4tH2jJxXbBOTk 8VBdWUcwIIzn2pDOD+EH7VkvwVt/+EV1jQptQ0hZ5Jhc2j/v4A5BJ8s8Oud3QjB69RXZn9rdNQlu L3QrvxPrskEuFsotLhS2UnGEmlxuHXoBnnGT96vPPHPgjSfE0xsZLaF5NrSPLIPlhQcs7HsAK5H4 b+KdX+G2tX3hTwb4XlvPCOoACeXV1G1rjORcpEegGAMHqBzzivPnFRlpqdKd0fSul+KNe8WWA1Lx EqxX853eQgwsK9kA9B7k8k881HPAJOtebXfjPxR4duhJqGlabqFiPvf2fG1rMo9iCVOPQivQtG1S 18RaPBqVhK1xZSnbuddskbjrHIOzD8j1HFdMJW91qxlKOl0yOWzjWM5QH8KrfC2KK7vfiDuUealp bW4XHPlSO+8fQhRn6VpyR7uO1cTP4hf4W+NP7enieXQb+3NlqSx9Y1Jykv8AwE5+gYntVVFoKD1O +SzhtIVihjWKNOAqjAFU76FXjYH0q2Lq3v7SK8sbiO7s513xXERyrr6j+o7d65bxlrMmm6ZM8f3t pxVppq5NtRngG8TS/jD4cWKRVuJLkoI9wy6lSr8d/lJP4V6BqkaR6hcrGf3aysq49MnFfMnwm8da X8P/ABFr3i3xZLM2v6U7rp9g0bCQ+dHlZSDxjy8gexJ4yN3U/BPxHejXtZtby+uH0O4Vbqym1BmB ctgkxlgCVIcdQDlenU1zxmuc1lHQ9lP8qM4HWpTCHjV1YMjDIZTkEUwrgV1mIqmng81EBj1pyk56 UATZ4pydaiU5p4NAEhOBmkLfhSdRxTT1oAcZMEDrmnZ9ajVSTk1JwBzQA0/OrA5UHjIp0ahEVQSc DHPU0oWnACgDoPjCf+MUdV+kP/palfEA+4CPWvuD4vjP7Keqj2h/9LEr4hij+XB5rko/b9Way6Eo BKHsafBycU5F+UClgXDn0roILkI/OraLge1QR1ZjGRjvTFc4Txx8QbXQTLaIr3FxsLGOJSzAeuBz 3r588LePNRuFvdMW4eBIpGM93qBMSRhmO3IwW/8AHe4HpX0h4V16Dw5quv298scF492z+aw5kjwN nJ9AenbJ9TnnX0Oz+InxO0y6htpfsWnPuv7u2IjLx4yIt/qTtPHIHIrlqcz1TNYpHIeFfgOb7XrO S61qS48OgfZpdUETQoJQMsFHLvsYjJQHlxwME10HjD4cv4Els76K4js4lvYnSxuHPnFtxIGMZznj 5grEnkADj2PxJ4ctfEF1BKJrrTUt4hbwQWE7RRxRAk7Qo4PJJJOSSTzXHeIPB2laRPpwMLTfarkQ z3d3K00hTax2bnJ2hmVVIGAd2O9JUmtQ5zgLPx/rOvav/aS6LcXEiborIFGeKJehdQoO929QQMcA 8nNseC9b8ZSHVPFCT2+j2/7xra6Uw+djnZ5fBVPVn5wflJzuX2M+INN0m3aW4mhto1X5y+FAAri/ FmtTeO9LuEAew8MKhaSeUbHveOFUHkR+rH73QcHNU4N6SYr22Om+FumafNpJ15ZY7+61VGaS5A4C Mc+WvAwvTdjqw7hVx0eieGrHQZ5ZbYzuWGFE87yiJc52puJ2jpwPQegrw74e/FKXwz4Vs7NtLmfT 7JRHNdR4PljuSmd2Ac9B2r3rTb+O/sILmJ1eOVA6spyCD0NOHK0u4Sumcr8UdFF1or6tagx6jYDz 45E+8wXkr+Wcf4ZB6nwnqia74c0/UBj9/CGOOgPcfmDXJ/FLxNFonhS9UfvLiZDFFEv3nduAoHqS a1/A1hL4W+HOkWlz/rre0BcdwTk4/DNabS0J6GT8XtYhtNKhS3je61XzVa2tYVLySyAghQo5JzXS r8RdT0/TbS50K8/sXXJFjkureeOJ7qzgIJctDJ3BGOmSRgc1yXw0uxfXOseJbsoJpHaGKV+sMI6h T0UMuCSOobBwAc3vD6mXxfDrM0eyLUIpYLcOMHyxsaPI99sr+uGAPIpKTd7bBKK6k3hHxrdeKfF+ p3d1dXPk3Mayxx3qIjySMSXdQqLxnGe2W46V6Ci5Oa4T4o6Yq6b/AG7ZjydS0/EoaMcyIOqn14zj /AkHq9B1dNX0Gz1BCCs0Qc7TkA9x+BzRG60YPuh6aqPBPjHQ/FaoZI7GQpdIvVoHBV8DuQDke4r2 v4u/Fy18N+DNC1jQNV0+5tNVvorUTDbKGjdW5Az6gA8HGelfNOnpL8Ttcv7Q3ktjoFg3lzyW+PNu JP7iEghQB1Yg+gB5xh+PfhDoWh6hp2saXpjrb2Rb7RHFI7vKhUjeecsyttbjBIDAckUpTf2SHTTd 2eq292t0NyENn0rivGyNoXjPQfEBU+QElspW7Lv2sCf++D+OB3qnHrkXhPVLTbP5mjXxHkS796Lk ZHzdcY9Sfr0FeiXdha6xp7211GJIJRyO/sQexB5zVfEtNy/hYyG9jnjV0cMCM5Brj/GHju00G4+z yzpGxUsdx7Vpj4dywxbNO1p7PBP7qaLfER7EHKfTDD02jAHmPxN8MWngGS61bW9QuNdkvkRItPtI WSFimSQ8v39vIJVVGcfeHUROo4rYuMbsPhRqun6Le65qkEE8umT3b+beRENDBuCt0HIXOST0XIzx 09M1mT+0Le3vtOIuLi1PmxhCMSoRhkz7jkdtwUnpXn3wWv7rU9VjvIH099Ovrd5Hjgby3CLIUiby SqlAQMrkYKkcgrivU28EaQzs0MD2oYkslpPJAjHuSqMAT9RTp6x0JlozkNEu4NY+JVvPZOJkisla Rx/Dt8wFD6MDLGSp5rf8N3yv4u8R6LeGWy8K64iW168FyYJvtAYbJIiORj5QTxwT1xx0GmaFYaOr Cys4LXdgMYYwpbHTJHXqfzq5LaQXMbpJEjK4IJxzyADz+A/IVcocysJSszhdA8Gafomgy67pSPpu o3jHUJ4kYmMs3JQqeOBgZ4JIznJOe50XUE1fSrS9jGEnjDgfWuf1nwZfX9v9nsdbNnbPgSwyW/mF h/FtYMu3I7YOOxxgDp7Gzi0+zhtYF2xRIEUewqoqwpEjKMU0rg4qUjNNZaskrOvNRslWSmSabtFA FMQP5rMXJUgALjpT/L9qn2UhHNMD5O+NngVtV+N3xLis7bXNWml8SX08KWNqqQiU3EhIkcc4ByOD zwcVHp/7OfjS/wBajvNK8PwaRb/u33ajMZJA6nJIY5YZ79favsH4m/Fzwf4Q8Wa419qFrZltXubZ 97qriQSMGYx/6wruGNwUgnpmuBg+OGua5rQtdA8HvcWRuXtk1LUrv7Dbzbc7mR5UAIGD7+1eJ9aw lNe9NClUSe555D+yX4m125ll1rxX9minAEsFkpUFR0B27VYDnAKkV2Xhz9jXwPozebd+fqErNuYy OEBP0XFc9rPx01E3Onz6n4+0PRbG81CWxbT/AA5bfb72BELDzWLgqckDG0cg5APSsmWS+8WwpIfD /ijxNp666lmb3xLrD6faXsbEiOERKUCMdyljt6L3ziuOrnGFp/DFy/Lr1enQwdZLY9VubD4QfDUt JdSaLbXEBCsCVmuFJ6DaNz/TinQfG7TbqS3g8L+D9Z1VZ51tYbuS1FlaNMQSE82UrhsDpjP414Tq OvR+ALuWJfGfgPwTFY+IUl8jSbf7bexngH5toDwxAnAJJbBHGcVyviD4j+G/EJ1O1ik8cfEyeTXE vkjDGx025TjzJCgAKSt8yggHaCMdxXG82xVZ8uHp/m/+B+JPtJS2R734n/aC1HRFK6vrPhvwoyX4 sriytmfVL63T+OXauxCAPrk1z0Pi3UPFN48pu/HPiqIaolsITs0fT3t35jEk0ezbI5ZQAW4HWvOL O0+JHiNb+Hwp4A0HwPZXN7Hd293KhnvrZYwoSMTHkqNuSD1JOa3Nd+D/AIx1uDUb/wCIfxOuktdS uVmvILeVbWCWZQMZC4UEAd8YHJxSeGzPE/HPlXrb8Ff8yP3j6nWX+tr4Qu9UimtvAPw2Ol6vC8+p XFx/auqRhySiqeTIihjk56DpXP8Ai39orwVdaVPoQ1TxZ8VbyPV1vRcWUbWNlKm4O21EYbSSzgYA x1B714lq3jL4I/D/AFC+trTSrjxXqNscJeTyg28zjr+8+Y49CBg47DmsfVv2vrsadNbeEfDNloLs w8uaOFZXgUD1YFWJPUlRgdOeaI5LQTvWqXfl/m7spUpS6HtekeNfH0sd4Ph/8L9F8G+bfreW2rai gnvLdRjbHvbJYZyTuJzk8Vx/jhdf16/e5+JHxolZ3vyZLDR5GcQ3BzuJjizswCRkgY6e1eC+KviB 448WreJ4g12aNZlF79lnncI3Xb5cYOxe+AAKw57aWS5uUja6v5XtxMCT5BL9S2z+IBQ3554r1aWX 4WnrClfzev5haMNG1+f9feent4i+Gfh2RGsPCt74ivEuWikfXbpULYxhlUFjySeuMY7ngWB8ZfE0 cRisY7LQIoGMJisrVbdtzr97B3uwQcjA9z2Fed301pE921vNY2kVxClwqwyGUgJ91N5+dXLKSenY 9Ou1o0+o3v2mx8OWk+ofaVSY3ht2e7NycjbHKqbxkHhS23gk5NetTgk+3oc1avLl938dP82bsl1c eIbc3V9qscNgkgtkur2ZroLFyWZlJMq7m2ksI1+8OlbFlFo9jLPc2GjXHiARbF+2apN5dtEWKhBH OuCMkg/NtwMjrzXY6D+x78QvHt4t/e20fhbSJ3WJ9V8SSrB86ZZsKuBgYIyUOeSSO3oXhr9mb4d6 lrumnX/GF34xv7yVhPpXhSyRQmwbIiFUeWFbaOijg56ZNenD3b2jf+v66fM+cr81ZJOo0n0V/wBH d+vMtttzx2TxWj3DpqmuXLXCp9gk03wlCtvPtEYGZJkGyVBtjHLZO0gYGSex+H2n/EyfT5p/AHgq 38P6fCJZZNWe0WW4liYnazySYQYC8Y4yvFfRx+Hun/DXwvC1v4J8OfDqN7d7CTWfE10lxOJ8BvOS IhtpAjbAyOXHYV5v4x/at+GvlWt3qur67481eaF7a+0q1d4LCUQhhATGgHyswDFd3c5FayryS5nO 35/e/wBLHHTwNKTcFS5/J/D1+yrf+Tc3qc/p37Lei2ZmX4j+NHbXbGS3t/7ILG+ljEjHgJG+OApJ UHjjOO/rPhr4aaH4OtL290HwheahaaddLN9v1u4i020ksUC7pgp2s4dg6jJPDL68+HQftLfFnxPb R2/gPwDb+HRLYtaXF6YdksrlgfN804k3AKoGWPf1qhH8E/jV8Qt8/izx5dWFtJarazRxzthoEAIR sbQQNoPOema4JV6MLytfz/4LPoYYPGVIqLaguy0/BH0zqPxE0n4VaZqU+r+JfBPhXWLCQakqaVaC 7vHjmDiK3Vm2BtoOWIJ+92615X44/av+D2kwNbW2peLfijqllOpsnlma2tpPNYPcYChCu4ll6N94 4OK5nSv2M/CXhu0l1LxFLqF5DD5RkudUc2sJLkiPG7azhiDjaGFeyeGvht4J8MSTt4O8MNrUWnzR TTXf2dNPtZLYcyt503MgJGwFccnPavlsZxPgsLoqibXSOvbrolutG+p61DIXPWpd+un/AATw/Rfj /wDFzxK1rZ/Dj4YaX4Rgj1E3VrcfYszbdm1Imd8bwBz0OfpxWyvwh+O/xg1ER/EH4m6jo1k8ssjL JI9rbKyAl9vCDgZHyqQDxXrnin4l2vgjTrpvEvifw/4SvtIuY75LDw4guLqVpvlSNpHIC7FPzBd3 DHsMHxLxp+2x4I0iWa18I+G7zxHqFtqAbT9S1iZrs+UNrNtVsYLSDJ+U5BxyMY+UqcSZjj3y4Cj8 3r8+i6p7vS/Y92llWFw6vO39ep0/w+/Y9+Hd4dNntU1vx3eT2zztLbR5tDcA4SB7h/kTdtJJKg4K 9M19P/ADXdD+HvjnRYrO08O+EtM1hP7CbSbO4ElzPeQ8+Y7LlDhm2ryTiU/Svz88cfHv44fEWQ6h PfDwJo/2z+0InnnFp5cgXYpUnDEhcDgc4rgPC/gjXb3xnp15pWsXviHX7a6+1xPG7QqsiZcyq7kM cFM5VeSK68vyjOsTio18RVen2Vro76WVl21s9jqfsZx9lRhds/oFndo7eR41V5FUlVZtoJxwCew9 6/Of9oH4k+JviZrljd67ok3h1dHYv9j0lBdXEyMvG596FGUFsYwRv5GcY5b4C/tmeJfhV4quG+KO vX/ivRJo3jltY5VuZbSQdCQxG0jbgqSPv9yK9i8T/wDBT34eXVnKlh4R1LVrQjG29EUSuPpl6+1q 4Wthans6kbM4p05UXy1FZnKaD4R1PW/Cem3WieH9N/s3UfNupYbm7ltpWjMhEaM3luzAqgkYnli4 znauNL/hF7/TbfZP8P4XQD/mGX0Up/KURV534T+NtxrPhTxJquk3Gp+HrdtXkuYdFitFvhZ20jZX ADLIsZY8leAWHA3ZOun7RWp+WlvcahZrePhV87Tb6NWJ6fKLduv+9WsJJLUwabOP+IHgp9Uv4U0v wrrGiX9w4tw6JFtbedu1hFIxOd2OOeTXQ+H408OrfeCobnS2tLHTVtNQnFrvubp5A8hTzAwHlqxd Dg9VXGdwrQ1zxFrs1nNKdWuX1ORDstNN0G7jByOQXZGfBHBA2qe4NcZdac3jHwZ4z1c+HNQsX+ww 6e9rLEIzLcG4ikxHuzlQkbsSRwB0yRUT1d0UuzPqj4b6H/wnGkWL6FYaTplm+n2t0GM5cxpKrYXY q8MChypYYzW0vg3X/BGh+MLOxN5elRHe20swjjsp7mQLGSNpMuIwqkjIB/Ovzy8FfB7Wr7TJ5bW8 TSnLhUNotzezkAAAlogQnQDpXqnggeJ/BOoRT69qfiO00+2Af7bZm8+zcEYEyOuMHuChXrk1fvy3 M/dWx77NpPjKyk/tFvEEjTD5mhCDyj6/Ifk/8drufDutHxBo8N89v9llYukkQJKhkcqSpPY4yPTO DkgmuB0e/wDEWsaastjrces2znaGniiKqBwRmJUbcOnzHI7816FolpLY6bDDM+91XHChQvfAA4HJ J9ySTySa6EtdEQzQi/1i/UVnftNf8j1Yf9g6P/0ZJWjD99PqKzP2nD/xXdh/2DU/9GS1L/ix+YL4 WeTdRTlNRhvSnAkjiusgmVuaeME1CORUiGpAl64py5XvTRTgelICdDkVKuKrIc1IGIoAnBG71NTK 2cVWU5qUZagZYRsnipVz1zVaNdgPPWpRkDigRL2+tR3UnlQO3cCnDOBkUy6TfCy+ooGc94DtYtXs tWvJl8x7m8ER3f8APNMnb/30AfzrrDbQxnKRqp9hXCfDXURpmqa3oNwQksU32yEHq8TcNj1wSSfw 9a72Vx1ByD0xWFPeV+5pPoY+s2kc8DgjPHpWR8KXNl4h1zShxbXVo1xt7CSMgqR6dTn6UvjvxTF4 Y0K71CcMYoI2kYAc4Arw7wx4m+KdnrOmeLlsIbbRdSt5yYJYf3S22BuBcfOXxjGB1HGeRUVpLbqV TXU+qM7veq19ZQahbvDPGJI3GGVhkGrSfdBDI644aNtyt7g9x70cEmulamJ5cvwkv/Dd7PceDvEV 1oCTHdJYuiz2jn3ifIqwvhHxzqAxqfimzRR0ksNMjjmHurnJU+4xXpAApSOOlR7OJXMzwvxR8DLU NNfW17dJqLfNJePIWlkP+0x5Nc18KFvND1W88LpewLqk2ppqUIu7P7S1+4JyMbGBKnJIOP4CGBjA P0be2qzxkEZ4rx74j/DGbVHjv9Oke01K2cTW9xEcMjjkEEVlUpJrQ0jN9Tsdb+MPjDwtMJNf8H2F 3YKf3kmju8c6juSHJDke+M+orvPD3iXSvGWi2+q6PdLdWkwOMja6EYyrKeVYZGQf1BBPl/hH4uRe LYxoPjSBNI8SquwXEmFt74j+IE8K57r0J6dQKwtK0KXwB8XtJudOVjb31yLS4tlYhdshClsD0OG/ 4DUxbjqhySZ7y2QMUgPPWnTHLVHnFdZgSKe9SA5xUAPFSDkCgCXpS445poPGKdQAqilApBwKARnm gB4BFOXmm7qcDTA6L4vf8mq6p9If/SxK+I0GTxX258Xef2VtU+kP/pYlfE8S4FcdD7XqzWXQlRal VOaSPBqUD5s10mRNGoNWohjmoYlGKsA4oGZ+s+HtO1xlN7apOw4DZKtj0yCDj2rSt/LtkSG3ijt4 UAVY4kCKAOwApjKWxmpI0+alZXuO/QtK5OM80l3ZQajbPb3UKXEMgw0ci7lYe4NEYx1qwAMZpiOC 1e28M+G9RtlurVGlY5h+0MZAhHdQxIX8K80+OXxDF/p40vS9890zBtkOckDk5x0UdSfTNbnxV0PV fiP4jtrPw1p4u9R0jMklxJL5cMQYdHb3x0GScHA61z3wu+FWpXXihtE8WQiyuJS15dzQncZ4o8Ns iYMAAP7uCSccdTXHUm9YpG0YrRj/AAn8MdYn0C1uYbqZ9U1EFp4XKkJIVjPPfbhgxbkdBlTnPr+g +AfGehaJZaZa3mlPBbxLEsjzOCoAwMjZn8s16ECyIpfAkIGcHIGBgKPYAAAegFOErVcabS3E5XOP 0b4XxWmpJqviG+XW9RjyYYlUi3gJ7gHlm9zjHYZwa1vEl5/oVwhPLqVFbjZPJNcB8V7+XSPDl1dQ KZJlQ7EXqzdgK1SUU2Re55r8N/FdrdXa+HdQuI4rK2m2NC7Ya6cYG0g9UBXkD7x46Ag+w+IrlIJN Nu1IJgvYsD13nyj+khP4V826PoEVlBDLNE1jc3bs8dzOEZr1vMZWdASCwDqQRwucAlSwr2XV/BHi uS20eyW5gne4uIFWQzhOUPmsWD4YfLG3Y84HNYQnZWZpJG58T/E0Vl4avII8yzyoUSNOWYngADuT XReDNKl0b4Z6bZv80sVoSD1yDkg/iCDVfQfhVbWtwt9rd0uq3qnMcUefIiP97JALt6cAL15OCvbS KpQrj5cYxW0byfMyHorHD/BySKHwNbsMCaWR5Jh3DliWB/HJ/GuyucTx4bkeleMaxqF38L9T1MKc 6PLIblHJ+5k/MD9D+Qx2BI0vCnxnsPEtoywrL9pUbvLeJkZl/vAMBkcjn3FKMkvde42nuct8b/Ct 1oGh3d7o1/LBag+e2nEq0aSg7hJHuB288lQQCeeDnPo/gLxjeXnhbT7u7tvt1t5Sq9zYK7SRMAOJ YD+8U9OBvPOSBWBe+F9W+JspQ25i0hJAs8ko+RvWMerEdQOgOfQH0W48Kxwm3lsJnsb2GJYluEAP mKo4WRejj8iMnBGTQl7zaE9rGvpuoW+o2yXNpPHcQP0eNgwPrWZ420ODX9BuIJollZVZ4iRyj4IB HoeT+dULbS9Yj1yC7FtZ2zM2Lue3nbZcpjGWjK8P0wcnA43EcV1TxiVWU9CMc1ra6syE7M+afEUV 54R8J+CvG+hW0VlPb6fNpmow28IWO5eCUrh2zu3tGI3Gc8k+pr0r4H+Mdf8AGdrqF5qMEDaQwjax vImOZSc712nn5eB25yOxxu+EL1/DdxqmiylYLZLp7qJAfvFwAz9eOAo9Pl+tL4Y1gXPjfVbC2j32 qwi4ecc5ctjDHuevJ5wAOgFYU4uLWprJ3R2WKQDB9qkxg0beK6jEAwHNSA4PsajVOc1KBlfpQAoO TSlc05VGM0uKdgIXXnimCPFWCtJtFOwFfFIV9qsbBSbaLAeF/HTxHDoPxJ1GfUfFngPwvYp4w1CN xp1pHe6qytNMDJeRMcMAOMHpnPXFePN8QPB+qSQ29vpPjb4nm11eSeO1vJ2tdNeBiSxRVwyM7Ek9 h7074+/GH4R+A/jn8RTB4Nutf8SJ4m1AXbXjrHF5v2mTzCp+c43ZwMDj8q851P8Abc8SOslr4W8M 6VoUZkBhaO386VVA+6d3yn6hR0r4uGU0Obmq1G/JfPrv17mToXk2e2aJJ8Xdaga38MeEfDnw+tP7 RS/t7yOzWS+hKNlEMpHzBeOGHapL79mq/wBZN3qPxG+Id3do8/2q6SW6EMPmt/GVyBuPTOM18weK v2ifil4+t3tr7XJtOsZ5PmjtQYULDHHy84GRwDjpXIeJbnV545RrfiW61GbcAYnumkycD5uSeO3P XFezTweHp+9Clfzf+bIcqUHy8yv5as+17nw38AvhBpa31zqWkX8v8CRXKXMzH3RSzge5XFcD4m/b f8OaGJrXwT4USTBCxXFwgUdeSOvXoAQPX2r5Lu49PjaaK0Q3WANssu7dnvjBx19a1vDvhHxJ4oiu YfD2g6jqSQp5s72tq8giXoWYgfKPcnFdfNP4Y2XpqHtKduaz+eh3vjr9p74leN1uoZ70aRYzYL20 I2JtHQFTkds5AyT+FeaXt5qXiCaOK/1q81a4VAsMSF5+T0UE9OfT1/CvVz+xp8V0iuZ9Y0iLQLaC BLmd9SvYYhGrn5QQWyGOD8vXjpxXZ6d+zJ4S0S+voPEfxSgvby2sGkii8LW0lyryAZaJpcBRhcbi ePm6mmsPUqayT+ZjLHUqekWvlqfN1jpZVgklpCrzxM0Ul1LtC46kcjn0B/I9K07S3W+Kx/apJ45I CzW9tF5QBB+VcY5J9cH8e30vofww8Amy1GTw34N1bxVb2unBpdW1iYCG1lIPzvFbsAowAQHkJ65y eK3hpul6BE637W+nvJpQkgsPD8SC2uIscK8oKFW7nPmMeM81008KlqcVTGynotz5htfCniKO5hZN EitWNqXMc8Zcsn94q5JB+gFeieCP2b/EXi62trjUb5bbRBCka6nfPstrYyuqhWduV+/ngc4Pocew y+NYvBehvpen6Rb+HbObTUuEu/EUkf8AaIIzuNvI6K0gJ4ARc8AA9TU6+KJvHGpG7s9N8R+ONQks xt1G4iSytmnxgJKkitujUY+6FJ5HfI1VOlDWT17GPNiKvu01p3/r/Mo+HfgR8M/DBmWf7d40vVLR eTZYFpIiqCZFu+ApBDYG0gkdQATXrH/CSQ/DzTIrqP8A4Rv4SW2nOLhXvkWXxBJGwIQMhwswYFsE D04CjJw5fAvxH8aedpN94i0/wBpGqxJby+GvDCmFboZPG0sXZjnBx14GK0PD/wCzD4S8Nz+bcaNd 6neLMls95rTiBVmOMKyykSHqM7Y2xkV5+KzXB4P+JOMPVpP7tzqo5XiK/wDEbfpr/wAA57xB+0F4 RudR1CPw34e8T/FnUhdQ3FrqOtu0VgxyrS7rc4X5mDD7vQ+g50F8d/tD+PIbiHTV0f4c6TNcpciP SrNVkiCABVDHPAxn8T24r3HS/Bem6Rpf70W/h1Y9RFg5VEgAXarb1edQx++p/wBSeM/UZkPjLS5y lraaVceN00/UXkdLO0YwCIKcPcXMqgbQ5KrtVOYt3JGa+NxXGmEjeNFSqNdlZfe9T3aGRRWskvnr +G3U8Oh/ZRbxpqqav4y8Rav4y1K6kY7zI8okccsARwDx0yK9W8I/Afwd4T060vV03TdEt5UmYTav IsMgEWd+Y+WP3T/WofFPxctPhxaX1tr3jDS/DY0e5YwWPhVDdMXn3GRWmkwUKBzgAn72RkLivIbz 4+6ddXoT4d+BbjUrmC6e6tfEHia63qbeLaGZJJSEBLqCcA9dvI4HjU84zzNp8mW0LX2ajzP5t6dY vRPqe1TwFGLUXr5f8BH0v4fNtf6Ppt1oXh691p54nVmjUWlgJt2EHmsA5XI5x2IzjpXMat8YtH8J 36y+KfF3h7wnpuoWcunlPDr+feExY3yNMynG9goXOcgnoQ2Pkrx18UfH/i7SLM+Jvirpthp12H1Y W9g5luULgKseAFBODjavAwetecQaF8Pjc2k8MGv+LpLi38mSa5byYo71sbQxA3bRuGeT+Ne1HgvO Me+bNMQop9HK769NtNNo9DuVFUlpFR9Wl/wT3zxv+234P0/VFvfCvh6fxFrElm8Umpa7K9yFmHyx OqPtjG1QMEL/ABH3B8W8dfH34o/Eu3lm1TVbjTNKjsIrV4LSIiNYF4XGcLyQOQecVXfWTpkqLY2G l+DrC8DW5h8vzrowAjlZCHfLlyOAM7Bg8E1W0uyufFuqabcwDUNf1IRS2t1dXnDwuQM5TcxdFVyO ducHgBefqMJwVl2CaS9+XS6/Jav091aGdSM5u3P92n/B/A5WwsJtXulkGn3Gu3slu08c99OxWUKO cbcNwFI++fu8V19rpGveHobmJ7628NPHaJK2n6fGkF+pbBxtx5kny7j97gYJ92/8JJeXcUFst4tt a3aSJdaRocYe3kjBUquFOY2Y7s5OflB6YFaeheEdettLtnttMttHhSCRJdR1xo3eNn6tGxC7MZOM 5IyfavpY4bA4TR62/rZfq0csqeHpP33d/wBdNX99inpFs0d5NrlvpUmrad5as+o64S1rIseCyyxj cVZmRsZbvwPS/qXiaG9006ffaxJdR24WaHSdMj8yJJDn5IpEwqgY5yTjccZOavyeHNNvbhpNW1u/ 8X30UccLRWp/dBR9xTIxCYHXgk89OatHxVoukD7NYQxWDRz+VLHp9uLudFGckyEFRk7RkIep54rK tn9HCJwpK3l9/SP6t673PoMDl+Px0f8AZKNofzSfJHp1dr7p2u9NdjED3Wq5t4vDsel6fdSLHJqN 0S92yEjgBdseeP7pPbPAx95fD3/glTpenGz1LUvHsl2XjDtbQ6cjxkMORl3YHgn5se47V8Nz61qL vFcT2ljossc5aK51uYy3ChuV2r/CQpB7dK/Wz9jT4sWfxV+BGj3sep/b59JLaVd3UoVC8kIADEA9 0KH8a+dlmU8dNuWjXpt8lZGGfZHVy2lTr1Kik5aWS5baXW9m+utrabnD+OP2QbDwp4Y1e9066l1C 2Nu8l7G0jxzOoGWYEMQSAM4GPb0r5r0jx/qmpabd28i2V/crM8KfYDJFdGNWICGeGN4uR1IC7uMk 8V9Rfta/tC3Pw9Wwh8O+MNIt4mhm+2WUSJc3UrjbsjA5Cq2TliRgA9SQK8q8L+FfDHiCY28HhrTo 4Gt47tBHCksKpIAyrkoMHBBxjj1NbU7z0kfH6xVzzyL4e6frHk48FQafcsQ+99blncH/AGlSNc/g 4+tdNeWHiTw7rMGq+JLK31vwvCgiis4o2zp4GP3iKWO9uBlnJYgAbh94eoaf8LdAtWBhs5bL2sbq a3H5Rsoo8TeEtBtNIuTONVuQI2bym1S6fcACTwZOeAa6fZJakc7ehkR+NrPTLdJtX0+5trGRd8Gq 2cbXVpPGejBkBaPjqHUbTkZOKF+Jfh7WbKePQXPimaRTGLSxjLq5PG13I2IPXcR369K8V8Maqnhu S907+wdLuFF6BY2GrRNcO7NguolyPLRV+fAHHzZPOa+sfhn4ffxhdavYF7PRZ9HuEtbmO3QSbg0K SBoznaASzAEg8oetCqq2opQtsc38LPCl94Y8NQx6pJHLqkqRG58kkoGSJIwATy3CDLHkkntiuutb 23vlJtp4rgKMnynDYH4Uo8M6l4n0e6uLKy1zwzeaNqEsDSTzDfqEJUfvlAAAGewAxyR1zXFat4Li 09Rf2zul/ATKtyWzJu6k7jzzzn1yc5zVxm5K8SXFLRnew/6xe3IrL/adP/FeWH/YNj/9Gy1Y0HUZ NV0vT72WEQS3EMcrxjorMoJA9sniqv7T5x480/8A7Bsf/oyWle9SL9Q2TPJAfWlVufWo92acK6zM mU81Kpx7VApNSK3FAE6tTwxqBTxT1bmkBZQ08VAjU8Pk0gLEfNTAe3NVRIR0qZJeKYywpNSjNVle pVk4xSAnB9+KcQOlV8kCnZ6Y60Acx4w8Ftq00GoafcNYavandBcx8kH0I7qe4qLTfGF/YQ/Z9c0a 9huRx9p0xVnt5P8Aa2Eh1+gyPeuw5IwcU0x+wrOUE3fqWpW0OH1/VdO1SykH9ganr8hHFvfhbWzP pv5Lt9MYPSvELDxz498QfFBrDWdPM4uont/sdlNHbQ20Co20wuykRooPzDkkcnkZr6W1OItCw9u1 eBeM7qTwj4v0zXGjEtvbzhbmNhkPC3Eike6kj8a5qlPTmvqaxnfQ+jvANilr4B0BIpjdWqWyWsN0 0gcSlF29Qevynj2PpWnLmNumK8Q8eat408GeLU1Dw3dpN4bs5RNb6PJErwbWjAYgnnL5J3ZzljyM 17L4W8TWHj7w1a63p4KRzDbJA5y8Mg+8je4/UEHjNaU5v4WRKPVE6Mal3ZFMI2nHSonk2n2rpMif GfxpstskgIYA0xJ88VLG+evJoA5zWvh9pXiBDHeWscq/7S9Kv+GvBNh4bWMwNNL5Y2x+dIX8sei5 6D2raDAU/eAKVluO7JD8xoK1EH7ipA9MQoFOGRSA80ZwaAJAckCpAKjXk1IDimA7aTRsJ6igNTgf egAAxTwtID0pwH407AdD8XB/xivqn0h/9LEr4nUEV9s/FwY/ZZ1Qe0P/AKWJXxVGM9a4qP2vVmku hNGKnRcmo4155qwo5HeukgkjHzVOMY9ajRCOamRQTzQIcq0+Nec0KMCpVXIoGPVanReMdj2qOPGK nA6UAcJY+Ij4E1fV7G9iaOG7nN1DMicShgAQT3IwB9AKu+EtOn8ReKG8S3UEsNjDEY7PcSnmMT8z 44yuOB1Bye612SKrFGZQShDKSM4I6Ee9WWkaUksxYk5yaz5fuLuIz7mzipY+1QqpNWYkrQkp6/fP pmk3N2iGRokL7B3xXgnx01bWbyGw8MajYy6Vc6qxRGbDKUAy5DAlTgdeeO+M17x4pvhpXh++uyuV iiZyD6AVyXgr4bw2U8Hi3xHO2ueIHtjFDDeMXgsYWyfKRO5+Y5JyOw6ZOFTmekS423ZzngLwrodn ofhjT5fD19e3dhYfaFlguhdW1zvmOJIm3YUM0JJ3Fc4wQcZPrGl2N3cai2p6kqx3GwxwWyNuECEg nJ/idsDJ6DAA7loPCV/FraT6lHZR2KKi2CRwkeWViklI2L/CMuw29sVvJmnTikhSepYVs4pQc8da jQcmn9BWxB4x8erS6t0sZ4NhjWdZG8x9ijGSCW7YIB/Cn/C7Wbq/+Icuk6tpum3txZxS/aL17CCc XHKFXScqWkQhlIbODk+lV/2gzdeIX0TwvY5+1atexWqcZwWYLk+3PPtmu/1vxB4a0bxlYXWhab9i 0y403+z1K6cbaRpbaUrISNoJX96mD044rlavUNk7RO8nunlVAT8qDaiAYVV9ABwB7Cq+dxqK2mFx AkiHcjgMD7VMFNdSMWOAzTlGDzxSoMUuOaoRR1HRbHVci6gDkjAZWKsPTkc8f/W6E1FoXhyx8PCZ bKNlMzbnd3LknGO/Tp2rSKnNKBzSsr3Hdj8U7b+NCDin49qYDdp4p69cHoacBSheaYgQbTin4FG2 lAzVANxRtyOacOKdtoAgK0YxU+zimiPigD8xf2kb6wg/aM+KcNrob3+qHxjquWkUOr5u5RgLg5OT kfhxWPoXwj+I+vLNcaf4Qk0y2N6kKy3saW3lzfKQoMuCcZUkdAGBIHFfbnxV8VeHtC+JniyyufEl hoDN4qvrqe202yRrrK3TfvPO4/encTtO7ofQ15trvxR8IGKV18NaxrlwZPOWXVb02/lxnaAhjTar FypBO05Xb6U4UIqK5pfckvx3Pl6lecpSShfV/E2192x4bP8As33r/aH8TeOdKsZjIFSC0Zpt64BZ yDtwo6DAJJGAOM16JafspeD9HsdSu5rLxh4pktFimDS2f9nwLC3WSRnVvvYO0KTnBOTitq48f+Jp bLUm0PSbLw5YhEu5pdP02ONOchdzOAWRQ3QIc4DckAjF8TXNzrmoao3iDxHc3c5sTcp9okkuftE3 TjeyhMAsAVQheQBVclJO/Lf1ZPPWa5VOy7Jf5f5nTaxZeCvAs+rWGi+F/CNqTZLPIlu76vPFsDAx LMA6xvnl2LY4GOwFPxr8cfFuuXUsGk6lqOn22oWIeeOytUhZ0TPlptiO1EUM3Bc8ct6UaR4J1K9n gj0/wben7VpeIP7ckYHcqszPA7BAwABO0K2MdGPzBdG8Pa5qmsWkOuTCO6m0144ryS4aFEUBiWlD xu33lIAwpOPlzuyOetjsPhk3UqKNtbabem/TsaU8NOs/di5eb/q34nE3PhuY3M9z4g15Gl1Gye8Y zzm5E8g56KyoD83RySOc4OActdX0YmyjtbGe6RtNZGS6u8eXIOSUwsajpnBD8juTgemeH/hl4Z0W 90wapqV5fyPGRdJYaZ5wWLcOC0u4K5zgbQMc8nOK7rw/oGgaPrUdnoHw5uJb+C6RnttRvllmaAld kWYsje3O7cRtHpXy2M4pwmG+BOT16W/GVuqPoKGT1anxuy/rojzCOHVfEa6TI0uo6kraaYGMbmwj R85VXe4Q7uTk+Wvr8xLZHfeEvgd4ouYxFPcf8I3awwxWN+NGtJUV/MOFMs9wThjvH3NuAeABXotx b+KrCLUf7Tu/Bnw7EeuQxTywRJNexFQjRxxqobCJgMfnUkkinaVFpXiLT9cL6H4j+IVyb9NRTV9V leytZIY1AaVt8qgAHeByTyAAK+QxXGuJlf2FNL583l0svxZ7NHJKEF7+v9f10Muz+CvgX4aXt4La 1tvEN3p9zDbTGxgm1O4lLbd2GChYyFJA3E5YYxXf31zZ6Yl/NcaJNoei2urW1os+u34tZGhJQuot otjMzKXbDfw+hBrjNf8AjRa/DrRbiw1TxxonhezkUasth4Pty7xnCCODJdVywAZid/VvUGvJdQ/a SstbtLt/BHwxuPEFysKwSaxqQkvVa7kwDLiQhUbBOG2nGfSvBpV8+zuSjQU5p/y6Lp2svxZ7UMNR pvlUdfvZ9C6n41ht5/FGi+ENH1XW4YrtL+SfSETTbGCJVjJcuvLDKOAdw6nuM1x3iz4j6X4LXxI+ veJtF8KCRI9QtrHw6FvrpSrKsUM00gO18qjttbrk8Zr5m8c/EX4n+NVns/FXjfT/AA3ZQi10ltLt pvtMoX5cBViDDpljyMkEe1chqXhfw7pHiK9gt9N1r4hyWt1bxLqOpO1tbhSQChAJ+83Ay4GMV9Pg fDzMKyTxslTva+7k9unqn0Oj3o7K3r/lq/wPXfGn7X/hPTNW1eHwZ4dufGV/qEaQnUvEai8dnYky mNSAELAhRgdFFcb49+KXx3+J+mXt1fSDwvoE88NobaR4rJItuNi4O0hV3g9O+e1UrjUL3R7rVNO1 bVtJ8BJHqkDPYaBAjSKQAckKeVQAHPqc81et2tobrVtUi8J3GvNbXi3yav4omZbd7YgIMxnADMSG 6HAA+lfpWA4DyrBpe0TnKPV79Omr6J/CvkV7Fyb55Nfh/nL8EcDZ/B+4vruS6uNfvPEurw3q28sG iQPcDBUkk3D7VHAPTdjqauah8PrLSbm4j1fV4NFWK5NtmS6N7cIqhgySKgXaMqnOz+MdTwen8ReK otMnvrW/8aG+uBdR3UGk+GkMMTSSFSwinA+XaCwCnpnuaitPE0Ecdwug+FbfTXvYv3GuazKVuIwu wvIykkOd+0qTn15Oa+mqRyzLIWnJLyv+ibf3uPorm9HL5VJclGDlLqldv52u+j3cfkclb+GtPS7l h0vw3e6riVbxTft5QaHogjdefmLocdeMDnJq5dSanokjD+3To96LlQ1rpEJiuYQ2S4fGA20Y6vwR j1x7n8APGfwautN8QD4v6hqPiS/kijmstK0hJUtgwDAosURVCwG0gtgV4XdahBpmpqdF0+GzsY1m iWfU1D3fOcMUYn2Hy9mxXiV8/oUYf7LDf/t1fctf/Jn6HZhssnUr1KEny8lr2Tlum9OS/bW81bXs yO20zT9QWU6fopeMTfapi2+6VolDAfKuFTOST+8PI44Fa0tul0ggvI21VraKS+jgnn8xULnn93F8 q5IH3pBgYrLGqS6nAk32a+8Qy3FubAyyyMlskhLfMYwRjCnoeMgnrUEuoS3pS21fU0W1jkW2OnaI qbZIow3y8cjkdejbgc18zXzfF1/dvyp9Erfha7+7Xue7TyfL4xcqknJa63Sjo7auLUV9m/7yVr3s zR1LxBe6alzb2+q22iOkaLHZ6RDG07O2Cfu5IOM/xmqxt73VkF7FpbvBcIGGra/OZMpHtydrH+Jg DwOjVreDfh74y157IeHvDEOlJAZCt7dIXlYvgb8tyDgDp74xXsHhD9iu/wBW8iXxNqlxeBFCiHcQ ij0FYLD4vEJczsvP/Jf5nmTzXJMulJ4enzS6cqvb/t+cbdVrGF7rR2Z8+XeuWd7NCl1fXviC5MRf 7Lpo8qBJcbUAIG7AULx7e9dX4W8BfEDxC88eg6aPDmnXCLGFVdrBR1yRyxOepPp6V9s+Cf2afDXh SJBb6dCGH8W0En8a9S0zwdZ6eiiOBFA9BXdSyulH+Jr+X3HhYvi7MK7/AHD9n5pty6q3M25Ws9k0 ttNEfCmi/sS6trUrXOs6rLLLM2+QKuAT617J4E/ZUn8NWSWEWt30ViGLfZ4WEaknqSVAJPvmvqOD TY04CgCr0Nqqdq9SFKnTVoqx8dVrVa0nOrJtvq9WeRxfBDSLHQ5LYWyzOwyWl+Ysfcmn+DtYh+GU H2C8spH0cOT9ot0LyWueu5Ry0ffIyV54IxXrrRArgisXVPDVvf8ALLhv7w61Uo32M1K25oaNruj+ I7fz9J1G11CPGSbaVX2+zAHg+xwa574hSpZWMF0LuG3mikDIs77Ul7FCf9oEjHX0Brl9W+Bmka1d GaaBBKTkyqgDH6kDJrU8LfBLw/4cuhdJaiW4/wCeknJqWptWZV4p3R4P8RvAUfjObUJ4YLxZ5pQY GXTHU42gMd4TLLnO3dg98LkiofA37K2opBJqFtqupaBJIylP3zedsHOGw2FBPVefujntX18toiKF CAKOgxUgiUDGKlUo3u9QdR7I8W+Ffhq58N/EB9J8ZeOfEKaVc2jfZbiDW7u3EU4ZccCQqcjd1HYV 0eneD/GJuTDfeMJ72w3nIaFHeVc93cF+R3zmu6udDtLu4jmlhSR0OVZlyRV8AADjpTVKKdxObasM sLdbWOGFSxC45Y5J9ye5rO/ah48e6f8A9g2P/wBGy1rRn96h9xWR+1Ef+K+0/n/mGx/+jZaH/Fj8 wXws8hDVIpqIc1IvbtXWQSDnvUi8VGp4p4OKBEgOO9PHJqMdakUUASAnFSJ71EpzUqkUrASKfxqR BmmLgCnq1Fhkwx0NSqRVZTg+9SqxoAsZp4NQL16088CgCXfzSqxINMA3VKmBmpAr3EIkGMda88+I fgpda02ZQuSVPSvTCo6iobi1EyYK5pNXGnY8p+GHie21bQ/+EU1mTy9e09PJiWQH/SIFGEYHplRh cdcKDzzi/wDCmebwp8SNT0La32DVIGuEUdEmj5J9gVLZ9SBWj4g+GC6lexX9jcNYahE2Y7iIcj2I PBHqD1re8K+ELjStUbVdRuY7q/MZiDRIVAU4zwSeuBWHI1oacyZ1U3DnAqHBPapSQWyTTutdNjIg CgHHQ+lWIwQOKay+2TTwMHigCRD2p44pg/Wnc0AKB74p4OKYBz1p5osA7JzThzUY6elPDetOwEin AOOtSZNR8HtTgR/9aiwDwM0HkimqaeoosA9aep55pmadimB0vxb5/Za1P6Q/+liV8VRLzX2r8WRn 9lrU/pD/AOliV8XxACuGj9v1ZrLoTxpViNRxUaDip41zXSZkh4AFSxrg0zbkip1xQgHKuMVIoOKV F4zUgx2p2AI0OQKsheKYgqYDj3oGIq81Moz2pqpg1Mq5pAKi81Mgpqr+dSLQBFqGnQ6tp9zZXC7o LiNo3A9CMVy0fhLxKlh9hXVLJoFOxZZt4k2+uApH6/412idKVXySCCMUmrgnYraJo8GgaVb2FuzS JEMtIwwXY8s2O2Tk496vLz7UiVIqZ4ppCYKDUoXIxSquD7U7OKdhHH6PBHJ8Sbi8k8oz6bErQCVA zKz7hvXI4IAxkf3q6iD4mX8fxI0uGZknvY7acQzFeTE+0yKwGB96OIg/72e1Z2r+EV1O++3Wt6+n X2zZ5yJ5ikZ6FcjP5jt9CeHvA1toGr3GrTX82ranNEIfPljEaxJnJVFBPU4ySew6c5y5dTS+lzoZ G8yWR9oTc7OQOmScn+dKExijGealC8VsZjQuKCuDUgXB570u0GgCPGBmnKoIp22nKnNOwCBTjNSK M04JwRTkXHFOwxAtKBmn7TilA5piGgdaUCnhaCOaAG4pCKeFzQRgUANHSjOKUjNJjNAIwvG//BOe 78U+NfFfiOPX7FJta12fUxCoMO2KWcylWdULlvmxwcZ59qz73/gnZ4jtZ9SXRta8O21vczxTRPPF I88JTBwJijS8kZOHGe/pXehj61KrkDrXIo1VtP8AA5pYejJu6f3nAz/8E7fFGs3uo3mseM7S4uru IRGWF5QWXBG1yylmHI5J9q19D/YG1vQJgbfV9HWOWLybpYzJGZEHYME3AkgfNnjJGCOD10bnGc5q dGNcNbAyr3U6rs+2n5GtOFGntBfmYdl+xn4o0+5sZE1TRriO2DRlZ5pd7wfw2+8R5EeC2epO7Ixj mtZ/sTeLbm7hN5r/AId0+IXwvJJrWyNxM2NpVB5ihQoIPGMHdk7sYrrEcjuasIxHevIlw1g53cru /m337vzZ6Cxko7Iyh+x/rFvqX2y41eLxTLPeG4vBruoS+TOijEaNBHEI2xwfmBxjAAFO1P8AZV8e a7b6xay+MdK0HSrydbtNK0Kz8pBIuNqmRgSqgqpyq5POe1bSOT3qVX965Xwjl7d2n+Nvuvb8NjVZ hVWxxVx+x/4r8Nale3XgtvC1nNc2TQPd6zNc3tw0z43zlnQ4br9zbnivNfF37AHxt+IsJTxF8WdK a0EUNoNMsopkgaBNuRuIJUkqDwOpNfQYJ9TUgau7CcO4HBzVSEFJrrJc35t9hvH1WfLI/wCCW3in T/7QfTL7wetzNPHJbXepNdXktqqjBVSyAHOP4gcZ9gavXP8AwTK+I/iy4uT4p+J+nGxuLhZptP0q 0aGNgMDg4wp2gDhewzX00GxzSiQnGOlfWxxWKguWM0l2UUl9ysNZhVW3+X5HzYn/AATF1vwxcTP4 Uu/C0MgvI7mC+1fzrmdETB2EeXjlgckYODipr/8A4Jo+OvFM+pzeJ/iTaail2y3S2VpC9vB9oHC7 shjsUAAY5r6NU4bO4/TNWFkI61qsfjFoppLsopL8N/mWsxrbLRdlp+X6nzNq/wDwTY8Xw6lfP4Z1 DwfotreWi2jy3S3N3dJyS8iyMoIc5/QVgXf/AAS0+I3iPURe+JviNpusSMV82FBLFHIiACNSoTBA we3evrtXzUiyH1xXJiK+LxEeSdVqPZKy/A3p5pXhLm0a7W067rZ7vc+Nh/wSp8fW0loNN8V+FdIi tyzI8cE00gZsbmyyA5+UY5rMf/gkZ49uJLOe58d6HdTxMRKLgTujpxhVG0beh9e1fb/mGnLLj1ry I4CMdU9e+7/E2rZ3jcQuWpL3f5UlGP8A4DGy6HxVb/8ABJzx3bxWATxn4fX7MTldkrHnklHMfyng Y4OMk5zU91/wSa8XsMp4u0C7ljufMgmvFuPMWMbsKWA56qeMcr719oeeO5pN4zS+oR/m/wA/vvcF nWLta6t2suX/AMBty/en5nyRpf8AwSm8R3r7/Efj2wugZTM0dhbNCCx45IAJwOBXrngv/gnfoXgx E8htPklHWR0YsT65Ir1wMDTga6aeH9l8DS+R5uJxdfFy5sRNyfmyjp/7Nj6agWG5skA/uqw/pWpH 8DLyMcXtqPwb/Coc0hbNb2q/zfgcdo9i6PgtfL0vrb8m/wAKePg1fj/l+tvyb/Cs8GjOaLVf5vwC 0expj4PX4/5frb8m/wAKePhFfj/l+tvyb/Csqgk+tHLV/m/ALR7GqfhDfn/l+tvyb/Cj/hUN9/z/ AFt+Tf4VlZPrRmjlq/zfgFo9jWHwivh/y+235N/hSn4SX/8Az+235N/hWOWNMLdBmjlqfzfgFo9j b/4VJf8A/P8AW/5N/hS/8Klvv+f23/Jv8Kwi/vSbqOWr/N+Avd7G8fhLf/8AP7bfk3+FIPhJf/8A P9bfk3+FYJemE+9HJU/m/APd7HRr8Jb4MD9tt+Dno3+Fc/8AHH4SeIPHniu0v9Kjga3jskgYyyhD uDuTx9GFWNBb/ifad/18x/8AoQrX+KrsuvW4DEA2y9D/ALTVm1UVWK5vwHoo7Hj4/Zw8ZD/ljZ/+ BAp4/Zz8ZA/6mz/8CR/hXTPK/wDfb8zTDJJ/fb866uWr/Mvu/wCCZc0exz4/Z18Y/wDPGz/8CB/h Th+zv4w/55Wn/gQP8K3TLJ/fb86b5smD87fnRy1f5l93/BDmj2MYfs8+MP8AnlZ/+BAp3/DPXi// AJ5Wn/gQP8K1POkP8bfnTTLJ/fb86OWr/Mvu/wCCF49jP/4Z88X/APPG0/8AAgf4U9P2fvFo6xWn /gQP8K0RNJj77fnTTNJnG9sfWjlq/wAy+7/gjvHsVB8AvFv/ADytP/Agf4Uf8KB8WD/llaf+BA/w q0Zn/vt+ZpPNfH+sb8zRy1f5l93/AAQvHsRL8BfFneK0/wC/4/wqQfAfxUP+Wdr/AN/xSmeQD77f nSGaQj/WN+dHLV/mX3f8ELx7D/8AhRfikf8ALK1/7/igfAzxSP8Alnan/tuKrvNJ/wA9G/OmGZ+z sfxo5av8y+7/AIIXj2L6/A/xQv8Ayztf+/4pf+FIeKMf6u15/wCm4qh5snZ2/OkM0h/jb86OWr/M vu/4I7x7GmvwR8TAf6u1z/13FO/4Up4m/wCedr/3/FZHmyZxvb86QzyD/lo350ctT+Zfd/wQvHsb K/BXxMDzHbf9/hTx8F/EvdLb/v8ACsMTSEf6xvzoaaT++35mjlqfzL7v+CF49jd/4Uv4k/5523/f 4U4fBnxIP+Wdt/3+FcvLPIp++/4E0zz5P+ej/maOWr/Mvu/4IXj2Os/4Uz4j/uW3/f4U4fBvxEB/ q7b/AL/CuTE8n/PRvzNKZ5Mf6xv++jRy1f5l93/BC8ex1g+DniIH/V23/f4U7/hT3iL+5b/9/hXH efJ/z0b/AL6NAnk/56N/31Ry1f5l93/BC8ex2Q+D3iEf8s7f/v8ACnD4QeIf+edv/wB/hXFmaT/n o/8A30aaZpP+ej/99UctX+Zfd/wQvHsdt/wqDxD/AHLf/v8ACl/4VD4h/wCedt/3+FcI0sn/AD0f /vo0xppSOJX/AO+jRy1f5l93/BC8ex36/CPxEP8Alnb/APf4U4fCPxB3S3/7/CvOWmlB/wBa/wD3 0aabiX/nq/8A30aOWr/Mvu/4IXj2PSh8JNf/ALlv/wB/hTh8JtfB+5b/APf4V5kLiU/8tX/76NAu Zf8Ano//AH0aOWr/ADL7v+CF49j0/wD4VTr39y3/AO/opw+FOvD+C3/7+ivK5JZSM+Y//fRqq8su f9a//fRo5av8y+7/AIIXj2Pafiz4U1V/2edT0W3s5b7U8Rbbe0Qyu3+lIxwFGTgc/ga+Rk+E/jQD nwjrn/gum/8Aia+z/D2s3WjfCrQri2cCVmKEsN3GXPf6Cqp+IGsj/ltH/wB+xXHS9oua1t2aScdL nyDH8KvGY/5lLWx/3D5f/iasp8LPGQHPhTWv/BfL/wDE19ZH4ha0P+W0f/fsUn/Cw9a/57x/9+hW /wC+7IzvA+UR8LfGOf8AkVNa/wDACX/4mpk+F/jDv4W1n/wAl/8Aia+pj8RNaH/LeP8A79LSf8LF 1v8A57x/9+hTXtuyC8D5hX4ZeLwMHwvrP/gBL/8AE09Phl4uB/5FfWP/AABl/wDia+mT8R9bHSeP /v0KafiRrn/PeP8A79Cn++7IV4Hzcvw08Wj/AJljWP8AwBl/+JqVfhv4swP+KY1f/wAAZP8A4mvo v/hZOuZ/18f/AH6Wj/hZOuf894/+/S0r1uyKvE+eF+G/ivv4Z1f/AMApP/ialX4deKv+ha1cf9uU n+FfQJ+JWu/894/+/QpP+Fl67/z3j/79Cl++7ILxPAx8OfFWf+Rb1Yf9uUn+FSL8OvFI/wCZc1X/ AMA5P8K92PxM13/nvH/36Wmn4m69/wA94/8Av0tP992QrxPDx8PPE4/5lzVf/AKT/Cg/DvxOSD/w jmq/+Acn+Fe3H4n6+M/v4/8Av0tNPxR8QAf8fEX/AH6Wj992QXgeLr8PvE4/5l3VP/AOT/CpF8Ae J/8AoXtV/wDAOT/CvYv+FpeIMf8AHxF/36Wmn4qeIcf8fEX/AH5Wi9bsgvA8jXwB4m7+HtU/8A5P 8Kd/wgHiX/oXtU/8A5P8K9X/AOFq+Ih/y8Rf9+Vph+LHiIf8vEX/AH5Wnet2Qe4eXDwF4lA/5F/V P/AOT/CnL4D8S9/D+pj/ALc5P8K9NPxa8Rj/AJeIv+/K00/FvxGP+XiH/vytF63ZBeJ5wvgTxIP+ YBqf/gHJ/hUq+BfEeOdA1P8A8BJP8K9APxd8Sf8APxD/AN+Vo/4W94k/5+If+/K0XrdkHuHAf8IL 4jOP+JDqX/gJJ/hS/wDCC+Iv+gDqX/gJJ/hXdn4v+Jf+fmH/AL8rSH4weJf+fmH/AL8rRet2Q/dO HHgXxERzoOpf+Akn+FOHgbxCP+YFqX/gI/8AhXaH4weJv+fmH/vyv+FNPxi8Tj/l5h/78L/hRet2 Qe6ciPA/iH/oBaj/AOAr/wCFA8EeIf8AoBaj/wCAr/4V1f8AwuTxR/z9Q/8AfhaQ/GXxQP8Al6h/ 78LRzVuyD3TmB4J8Qf8AQD1H/wABX/wpR4I8Qf8AQD1H/wABX/wrpD8Z/FH/AD9Q/wDfhaYfjT4q H/L1B/34WnzVuyD3TA/4QnxB/wBAPUf/AAFf/Ck/4QnxBn/kB6j/AOAr/wCFbh+NnivtdQf9+F/w pp+N3isf8vUP/fhf8KXNW7IPdMU+CfEH/QD1H/wFf/Cmt4J8Q9tD1H/wFf8Awrab44eK/wDn6h/7 8LUZ+OXiwf8AL3B/34WjnrdkFomR/wAIT4hx/wAgPUf/AAFf/Cj/AIQjxD/0A9R/8BX/AMK1D8df Fuf+PuD/AL8L/hXp/wAFfHWreNU1c6rKkptjF5eyMLjdvz0+gqJ1atOPM0ilGLeh4YHqZTmqqnFS q2K6kczLaECp0aqaNip42yaBltDg1Oj1VU1NGccUCLaPipVb3qspqYdKBlhWxTxLUKc1KkeBSuUS A5p2TTVXA5p6n2pDBXxUglpuM1S1bUrTRNPnvr+5is7OFd0k0zBVUe5NBUVc0BJT1mHevj7xZ+3R Pdaqbb4feC7zxPZQuyS6hMxhiYg9EOCD9T+Vcjp/7e/jTSdXVPEfgvS7e06ui6mkUoGeo3Mc4B6Y 5rF1YLdnXGhKS0PvHzhnrUiuCOteAeAP2xPhx42toVuNcttD1B8hrS9mUAHngP0PA9uuOte22N9F fW6TW00dxCwyskTBlP0Iq1KMtUKdGdPWSNUPS7xVVJOKk81UQs5CqOpPanY52TiTjtThJXz58Uv2 pLfQ59S0fwfp66zrNowjkvrpxHp9u3BO+TcCxAP3V549K8pvfiN8ffEBF/Y+IdBsIpEBSCxszJDj sQzgk9etJ2RN29j7aL+lBevhy1/at+MXwweH/hNfCtl4l0eLie+0sMk2P7xHTj/dA9+9fS3wa+Pv hH446IL3w9fgXSD/AEjTbghbmD/eXPI9xkfjxQmnsF2vi0PTd1KHFV9+KPN3VVii1mkMgFV/MwPe kL5NVYCx5uaN9Vg3NO3YosIlL00t71EzYHWqt5qdrYQmW5uIreMdXlcKB+Jp8rY7FzdzSbq5Wz+K HhLUL4WVv4l0qa7JIEKXaFiR6DPPWulSVZEDIwZW5BByCKbi1uIlLUzdTd2aZuz9KViTR0E/8T/T B/08xf8AoQrZ+K3/ACH7f/r1X/0N6wvD5/4qDTP+vqL/ANCFbvxW/wCRgt/+vVf/AEN65pfxo+hX 2GcQx60wninMaaea7DnGk8UxzkY6U/FNbigBhNIOaCKAMGgY4UE8UZprUDENISK5j4g/Enw98LvD 8uteJNRj06xjO0FgWaRuyqo5J+lfnl8d/wBvzxT46e40vwfv8MaIw2GZGBuphnqX/gz6L+ZrKdWN PctRbP0D8bfGPwT8OgR4i8TafpkoxmCSYNNz38tctj3xXjWu/wDBQX4UaRO0Vvcanqu19vmWtphS PUb2X+VflvqGrXeq3UlxeXMt1PISzyzOWZj6kmq4cmuKWKf2Uaqmfpf/AMPH/h6zqDo+uYIOSIou PT+P/PvXW+HP26PhTr8kccmqXWlyPtGL22IAJ9Su4cdzX5To3rVlDwKlYqY/Zo/bnwx410LxnZLd 6Hq1nqtuRnfazB8fUDkfjWyTmvxa+H/xA1zwDrkOpaLqM1jcxEMGjfj/AIEOhH1r9R/2cfjtZ/Gz wRHeGWMazZhYr6FD/FjhwPRufoQRXZTrKpp1M3CyueuL9+mtwaYsg3Vi+N/Fdt4M8LalrN1IiR2s JZd5wGfoi/UsQPxrpSu7IlanK/FX9oXwP8GolXxFqoW+ZCyafar5twwx/dH3QexYgH1rwC8/4KW+ E4rwpD4W1OW23MBK08atj+E7Rkc9+ePevhb4o+L9S8Y+L9T1TU7lrq8uZ3d5DnB5OAAeQB2FcazE 151XEuMnGK2NvZrqfqR4U/b6+F/iWZIb2bUNAkZQS19b7o93oDGWP4kAV7t4e8WaP4tsVvNF1S01 W1OP3tpMsgGRkA4PB9jX4iI5GK6fwd8QPEXga/F5oGsXmlXAIJa2mZN2OzAdR7GiOK/mRLp9mftY p4FONfCvwO/4KBT+fBpfxDgWWN2x/bVqm0oP9uJRgj3XB9jX2voXiLTfFGlW+p6Tew39hcLuiuIH DKw+v9K7YTjNXizN6aM0DRSbhRViCjFOxTaBjGFMI5qYjNMagCCRahIqywzULLQBHjB60lOIzTaA FHQ1FIgxmpBSGgD2uzGPhHoH/XX+slYBFdDbDHwl0H/rr/WSuePWuKl19WOe4ymMKkIppFdRmRkU xhUhFMI5pkDMn60mKCaBjGaAGlc0hGKV5UjQu7BEUZLMcAVz0PxE8KXV99ih8TaPLeZ2/Z0vojJn 02hs0Bc3SOaSnbgQO4ptIoSmGn4pMc0DI2WmsvFSsDivM/il+0D4M+Eki22tahJNqbIZBpunxGe5 2AZLFR90Y5yxFDaS1EehlRUZFeXfCP8Aab8A/Gq5ez8Paqy6milzp97H5UxUdSo5DY77Scd69TK8 UJp6oZEwzTGWpSKYwxxTAgcYqMirDLkVFsoAjIGKYRntUpGKaRQBEVpuKkbik60hke3NIRUhFIQc 1VwImUVEwFWSPao2SkxlcjmmMBU7LUZWkMgKjtUbKKslKjKg9qBFbbUTLVto89KY0dAyky17d+zY MReIPrB/7Urxh04r2r9nAYj1/wCsH/tSuXE/wmaQ3PH1bNSqcVWU4qUNiuo5y0hqxG2Kpo9ToT61 Iy4pz3qdDVVCeKsIadwLMZovNRttKs5bu9uIrW0hUvJNM4REUdSSeAKjM6QRtI5CqoySa/Nn9rz9 o7Vvi54uvvCXhy+kt/B+muI7h4c/6VKDgk4+8N3Cr3Iz7iJzUFzMEm3ZHvvxY/4KO+DPCDy2XhCx l8VX68faGzDbKfqRubB9AAfWvI4v+ClvxGivoZp/BelmxIz5SwzqXGAchix7Edu9fN+k+CpTqcen aHZz63rgVWlis2YRwAgHEsvB3jLKyrtUYHzMc16BH8BPF8iPPN4W0WItllVp7pnTJB4bzM9sck8E 1w+1qz20+RuqcVvqfc/7Pn7bPhT4336aJd2knhnxIwylncybo5/ZHwOe+CB7Zr6QaIqM1+Lmp6Dr HgXXLe9uEuNJv7aZZoJt7TQhg24YY/OmOAM7s9zX6MeCf2jp9Iu/Cz+JFz4W8UwxGz1BgQ1jcuvE L8cxtg7WyTkNnjGOinUctJbg4W1R9Elgikk4Ar5E+NPimX4/+P5/BFhdS2fg3w+/m67dRyFFuX/h gyD04JJ9PSvo74t+JU8F+BdZ1Zn2ra2skoYeynFfnt4m8YTfD/4GWqR5OreIN2r6hKuc4lbMYb2+ 6Ov8GO9OrNRR34Oh7WVm7Lv2S1bHfF34x6boktt4c8PXNv4d8PRRgNNboTdTpjgKNuI+mMnPXODj Fed6H8UC94bLwt4A07WJsbnvJne7upR3ZpGwRnjsB7em18FPgVfeME/4TDX4zc3N6xmt4plyApOf MI6ZPb0GD9ON+LnhnVPgf8T7PWtPjNtHO3noACEYj76kDse49zXG+e3O9iqleE3aMbL11+fT8EaH iPT9P8TyJD4i0K78F6tKMRXUkJSFm9ieo/znvW/8Fvjf4/8A2cfGVvpU11LqWjytlbCWTdBdR9SY WPRzgAYHJOPr9M+EG0n4meBbDU/s8N9pmoQBngmUOoPRlIPcHI/CvD/jR8JU0BI9IVpH0W9DSaRc SHc9lcrz5O4n7pHI74BHYGrnCUffiyqU/aS5Uve/B+X+R+jPw78eaV8TPCOneItHmE1jeR7h2KMO GU+4OR+FfPn7b/7QbfDfwa2g6WVOo6tHJAZFl2tCuBk4HJ4avFv2EvjLP4f17VPDGpS7LfUIHnWN iB5d1Gdr9yfmG09ssxx0rk7yzT9ob9qINe23laNaE3V4JWJPlQDDAg/dVmwuPT3rZVG4XW5yVoJS 02OK8Afs8+IfiTZQaz4r1WfQNEKgwKULSOpPBCkgKCTnPJJOcc5r0b4deKNN+A+qXlv4b8Ry+JrO +8y3t7XV1+ywxtFgyS+Y5CELnG1TuOeccA+q2WnXPxv1t9RZrnS/Amn3DwWcMMhifUnQlGfK4Ii6 8d+nGDmj47+Hx8a+PLXSovC0D2MFmLDQbq6uRa2AuoyJJkJxg/I4TaMHIBH3TQoqGq3Od6qx6hqO mfES4keafwnpWoaT5OY7e21Fftbt/tMyrHg+2Mcda+X/ABvHdfDXxba+OPCEE3g7xnZs0174buVI MsQB3svAWRcZztyCMnqDX6JW0ax2sUanhFC8AdhXH/Ez4e6T4+0N7TUoAZUy9vdR/LNbvjh426g/ oehyOK2lFvYSa2Zv/Br4oWHxi+HGj+J7B03XUQFzChz5E4H7yM9xg9M9QQe9dLq2tWmh2M13ezpb 28Q3PI5wAK+Rv2PfHFj8NvHPjL4Xai/2e5tmk1AXErKqTuMbnUfwloyjFeQNjEHnA4L9oH4/X3xf 1e98M6JO0GgrIY/MhkI81UILytx06KFzwWBPIxXVRSnHnlsv6sXCN732R6t4o/bhttT8RvoPgi2t L26BZFub9mCOw9FX5iOvOMDGSQOa5jVP24fFXw01Wz/4S/SNI1XSbuR0SXSHeOVQrAMfnyGHXGOD jrXzN8GNPsND1rU9fWMtBGzwxzAPlI0xvZXRtyljiPP+37ivffE/7Ptv4+8O29xr1qx1RoQVdXO6 2GPljU9wowOepBPevRnThDBqq1acnovLz0vqejUo0aeHU5/FLb08z7H+FnxV8O/GDwtDr3hu9+1W jHZIjKVkhkwCUceoyOmQexNdgeK/J74X+Ndf/ZC+MFn9ouJZvDd3MIr2DnbLFnBOOm5Q24e/41+i XxP+NGl+F/hO/ivTLuK7hvIv9BlX7rMwPOD/AHcEkf7JFedRi68lGK17Hnxi5S5Opm/Gf9oTSPhl b3MEbR3mpRRmR49+EiHbeR3PZep9q/PHxd8dfG3xo8aMtvFe6vBu+Swg3FdnfKpjA9e386nv77xH 8btSstFt1ZrnVZTcy3LbiYoAcEtnk+vJ5LDHWvrXwZ8NNF+C3w2v5NPtUR7e2aWSdxmS4lC8Fm75 OAB0GeK68TyxlGjQ8rvq2+nob1VGNoQPlHVPBfiLWbd5NBgsLq0aFZBay20UVxGeMhZFUMcHjJYE +/NdB8B/2r/F/wAGvFEekeJ5bzUNCMmy5srwlpYM4G6MtyMYHGcEZ+tfQXwj8CrcWpkkYSrbQm3j BQggBsM2csp3OH5UjhRxzXnv7SXwQTV9Ik1KzgC6lagsrqMF17qarH4f6rW5IvVJX9S8XQ9hU9m9 7I+7dK1a11vTbXULGdLmzuolmhljOVdGGQR9QatbsCvkf/gn58TX1vwXqfg++mzd6RJ51srH5vJc /MMY/hf1P8YHavrUnivO31POvc0PD7/8VDpn/X1F/wChiug+Kwz4gt/+vVf/AEN65vw9z4i0vt/p UX/oQrpfit/yMFv/ANeq/wDoT1zS/jR9GV9hnENUZNPamECutGA0nvTSDTjR+NMYzFIRTs0maQxp 6VyvxM+IWm/C7wTqfiTVWxbWcZYRjrK54VB7k4FdSTivnL9tzwZqXjb4c6faWB4S7LuG+79w4ye3 cD6+9Zzk4xbR14ehLEVFTirt7H52/HL446/8bvF9xq2r3LfZlZltLNT+7t485CjgZ+uMnvXmp5ro /EPgLW/D1zLHeadcRbGK5aMivTPgB+z0PiVfLf67ex6bokb4MZkVZrgjqAD90ep/L1HkWlUl5ms4 SpPlmrNdzyvwp4G1zxvfiz0TTLjUJuM+ShIX3Y9B+NfQPhT9iLXruFJdane3ZgCYbfblf+BHOfyr 7V8FeFfCngTR4rLThp+mWcS/dWRVH1JJ5Pua0tQ+KngHQUBu/FOkhumyG5WV+mfupk/pXbHDRSvN nN7T+VHyjb/sUeFYlxfXmvW7AfM6ywlfr/q68g+Jfwk8EaJfppPgrxJqXivxA77Rp1raLMq887pV IAx7A++K+jP2ifjD4I8f6JBo+mX99Mkdyn2tUaWzWSEnDcEAvj0K4681xnxO1KP4O6B4esPh7YWm nHV98ZnUAzO/yBCWJ3NjcepxnHbg5VPZrSKN+Sqleaav5Hjuj/BeTw34s03T/HEdxZ28wjmnists rQxvvAJG4F2DIPkXPXrng/Q37L/jSw8PfGltEg0gaUuo2ZgHlklFYIJljPJ+6Vm25+baQDnArhvj JJd+BvF+lQ6xrt34vi0i6MK30EkcRnniZfNRcDcFDbkyc98ZrxXxZ4w1XSdVS902WbRZJIsIlvOF eEqzAfdwQwy2WPJLMe9YJ8klLsL7Nj9eUvASOa+bv2z/AIirpHh/TPD6sE+1ubqZ2JVQifdGR6nJ x1+UfWvz6svjj4/06VHg8Ya0rRtuXN9IcH8TXY+DPibffELxpp134+1W81WxtE2SzyKszrACzEBW I3HJPU98Zr1KeLpp3sRRTjNSmtEZGq2cWtwPfJaJcPbkG5gTKmeEc717ggDk9cfN2Y19FeGf2Yvg 38W/BNvrvhnU9a0uWRdssDTpMbaUDlHUpnj6jIwe9dN8Nr7Sz4x8HeNPCHh+01HTLjS7uPxBoSiG ETCNQheNGIG7mP5U5ygbq5rh7rwH4u+C+rQeMvCkMM9jqCPPe6JbyFoZolbLBTtAEiAglVzjO5Mp uVPOTipe+tDeq1OTlT08jyv4k/spaz4MeWbSNTg16zTnGwwT4/3TkH8G/CvFprSexmeG4ieGVDhk kUgg/Sv1A8AeJNH+Jnh+HVLKNlVxtlt7hNskL91YH+fQ9qp+OP2cPB/xCtXW901Le6I+W7thskU+ vofxraWHUlemznU+5+ZsZINevfAr9oHxD8FNeSewma50iZ1+2adIfkmUdcf3Wx0YfqOKn+Nn7M/i H4QyteAHVNAZsJfRLzH6CRf4T79D+leRKCDXMualLsy3aSP2O+HXxJ0j4m+FbLXtGnEttcL80ZI3 xPj5kcdmH/1+ldYkuRX5ffsofGO5+GnxBtbS4uWXQ9TYW1zE74jRmICy4JwCDgZ9Ca/S6yvhMoIO a9WnUVRXOdqxrhs0oqGJw3ep1xWxIlNYZpxpCM0ARbcE+9MYCpiMYqNgKAK7DFMIqdhUTCkMZ3pC falNNNAHt9t/ySXQv+uv9ZK54A5robTn4S6D/wBdf6yVgkcVx0uvqxz3I2HBphqQimMK6EzMYwxU TdalYgdTXgvjv4ueIfHPiq78C/CsQvf2h2av4muF3Wml5/gXtJN/s9u/chtpasnd2R654p8S2vhT RrvULkPL5ETSLbxDMkpAyEQd2PQDuTXyV4d/bS8a+L/EbW2m+GdGtELH7PoupyzQX10oPSORgIyx 7L1J6A16N+zpoV5qN74sutZ1y88U6dp2qPp+nXeqNvllkjA+0S+mwyEhV7BcEnAxpftff8IwPgbr s+vqFeFAdOmjX97Hd/8ALLYRyOevtmobk1daDsluc94HW4/a4uLnX9eF5pnw9s5BbWnh9JzGb6dQ DJJcMhyyKThVBAOMn39Rv/gP8M5NM+xS+CdAS3A2grYRo4H++AGB985r41/Zn+OWs+F/hdF4H8G2 iax401XVJZIDcZ8iyt/JhBmk9fm3YH5+h91tv2WJvF6rffEbxhrPijUZPmaFLloLaM9wka4AFRGS krtXZo046LRG3eeDfE/wXzqfgG/ufEnhmP5rnwlqFwZnSPubOVsspA/5ZsSDz3wK9S8C+PtH+Ifh y21rRrjzrWbIZHG2SJx96N1/hYHgj+mK8dP7KOk6AvneDvEuv+FL1eUa2vmlhJ/243JDD2rzPSNd 8W/AL4qXGoeMDZWug6n+71DUYGEdveS4JS4WP+CXGd4GAcE9cZrVdBaH2hurE8XeM9E8BaJPrHiD UoNL06EfNPO2AT2AHVifQZNfOvxB/b28E+F/Dlzc6Nb6nrFy6Olnci0aO0eYDgF3IJAOM4BOK+f/ AIJ/tDWXxa+MMOufGW7hudK061K6aksJ+w210zghmjVSuSobDN02g9hiZVYp2vqCi2e9+N/2vte1 m80vRvh/4Lv5JtdkNrper6whgSd8cyRREZZFB3Fz8oA5HavB/wBoL4Y+Jf2ePAN/qer/ABC/tPxF 4snaC6trazCvcIVzLunYmQxjKjaABlhxX0N4I8X6NqOu+Kvjv4ruksvDdkH0nw55o6WyMQ8qL3eV wQMc8MOhr4h/ao/aL1j4++LFElsdN0PTXdbHT3X94gOAWkP99sDjtj8TjUlaN2/QqK1skeRaBq95 oWoQX9jcyWl7AwkinhYo8bA8EMORXvPgr9q343f2jHa6T4jk1mVgStnexRSvJj+Fdw3Mx7BTk9s1 8+pFIhBeNlBG4HHGKspqEtoyPA5jlVgysDgjBzke9cUJuOzN5RT3R+lnwI/aR8f+NvCcuseIPBce p2aSeUtz4dlSSVGH3hLBvLqw44wPp0rvtQ/al+HWiQI+taxNoczNs+zX9nMkob/dCn86+OfhD8fb m/1iPXNJkt9J8fxKq3lgxEVl4lgUD5XycLdddrcbj7nB+yIbb4fftSeA7e8v9Kg1O3OY3iuE2Xdh MPvxlhho3B64PPHUV6UJtrR3ZztJMzZf2w/hKi5TxT9obssVjcEn/wAh1VP7WOhahldA8K+LvEjk 4U2GjuU/FmxiqK+DviJ8ESJfDFz/AMLD8KxddH1RlXUrdPSGfGJMD+FueABWo/7VfgaDwxPqLyXc WrQyrbN4cktympfaG4WIQnkknuOPftVcz6u39eorIrt8XvinrR/4k/wfubeI9JtX1aGA/inWmt40 +OUH7x/h5oVyneKHWAr/AJsMUyLxZ8b/ABion07w14f8FWDfMra9cvcXO31KR8KfZq8l8VftAeNN K1SXTbDx/Y+IdRiJSWHw34b+0xxt6NK8qp+RNJytq2O3kevWf7SKaHfQWPxD8Kan4CnmYRx3lzi4 sGb0+0JwD9Rj1Nex29zFeQRzwSpNDIodJI2DKwPIII6ivhPXf2gvixFpF1HrmjW+u6NJGwuINT0a Py2THO4RTEgY744q7+yH+07aabqz+CNZjltNOvronRiGaVLUsT/o+T820kjb15Jz1zSjVV+VsHFp XPuSgjNcx42+IWj+APD0usapOfIVhFFFCN8s8pOFjjUfeYnjH59DXmmseNfincaRLrs6+Fvh7oSj eo1+V5rkL28zaQik/wB3k54rZySJsz3Aim4r5r+G/wC1Vqmo+KV0fxBpUWqaZJkReJdBtbhLQHn7 6zKCBx94HH1r6O0/UbXVbdbi0njuIW6PGciiMlLVA7rRkhWo2TP0qc80mAaoRUdcVG2cVadce9RE BqTKK4fHWmt81SyRHtULApTAY4445r2b9nQAR6965gz/AORK8bVtw969n/Z3GI9d+sH/ALPXLif4 TNIfEeJK1SoarKeakVsV1GBcVqnjPAzVNGzVmNuKkZdjNTK20VURuBTpJMLxQB5r+0l4/wD+EE+E fiPUI5ZIrk2rw27xHDCVwVU59ic/hX5j+DPDk2pyJDabZdZu7qO0tY2YFvPlBLSEYPEad+CrOD2N feP7XXia1XwZqGgTMvm32n3M6BmA5hCv39enHrXz/wDsdeA5NR+JWk3d8nFnpsmphTniWeQxgkHo dijp6CuSteU1E1pq12fVfwc+CGj/AAy8J2tja26tMFDT3DL880mOWJ/p26V2954fhmi+WMYx6V1E MAVAB0xim3Efy4ArqS5VZCbvqfOnxW+GNtrlnKGgVsA9RXMeN9It2/Zc0yd45HXSRayS28lhPErp h0YCXeF3bVLBsctGoA4yfoTxRZA2s2Rk7Cf0r5o/aju4/DH7PllbhcSnVLG0UNE6HMFqC4HJUqTJ 078HPUVnUSs2F+h2evfGG68V/sfa6+o3SvqmmxyaVNcrx5pACq/BPLqyN6fOBXzB4ls5viR8RfDX hWKST7LJNbWUwUkBY4413AD6BjVEa3HYfB7X7GO6a5/tSztJiAylYmjnliw4GMMUt4yOv3vcVtfs 3+J7X/hoO0trq1iYS6gzR3TE74maCRAo5xhmZffIFcU5czimenRk4U523a/r8j718NeDrbTrGCCG FY4o0CIijAUAYAFeR/tkfCOPxX8JL2+toN19pf8ApUZA52j7w/LNfS+nWgWNccCovEWkRavo93ZT IHimiZCp7giu6S5lY81PU+Dv2DPGQvtO17wdcuDJbkahaKeu04WQD6HYf+BGvb/jT4fOpfDjWSg/ 0nTU/tK3YdVeH5zj6qGX/gVfG2jXc/7OP7SEckoaKys74xy+j2shwTjvhTn6qK+1vjZ4w03wr8ON b1C5nQxXNo8FuFOfOkkUhAvrnP5ZNYU3eDi+hrdxkpR3Pjpb0eG/izbahZnyLa5hmvS0W3O427hx gYwPkB9Rk9TXQ/BmCXxBqeq6NateR6r4w1BbOXUEyjpZx4nuJQ38O9HjwOhH1zXn3iRPtjW9w00K jS7Fpkhl2oZWMijaBnLfLuOP9k+9e4fsK6BLe65r+u3M/wBqXT7SK0gJH+reQDeAT3CxIv0OOlc1 Jtysermdvbysra3++36n1ZJFYeHtMitLaJLPTdPgCJHGPljjReMfQCuE+GWnWniLVrK9jtNY8T+F dXKa3pesajOYrfTrxJC1zDFCOv7xoxk9lHJ210nxA1fUtA8L3+oaRPZ2+rRbTatfFfLLBgSMEHcd oY7cHOOhrI/ZnW31uy1vxDYane3+m6hdB4orgkRwSlQ0wjjwAg3FRjnhBz1A72tUjxX3PerdyFAz Tro+ZCwPpTY4sLxTLkskZ+laCufmZ+1+8nhn9omXULdpow1tBcTGBirFclGGR6gAfjXEWGunwt8P NZvVDJql+y2UZbAZCxZ5W/752fQ12f7cN4n/AAujU0M5RhpUEaqv8Z83dtP4c/gK8e1G5u9ctrG3 jlN0sEf2hjnptgjL89OAhFcPO05RTOhaqx9Cfsq+E18TeMdH0F4Y2t7VRqN2VQ8hMMOSMcuYwwHU BTzX6APoCPDt2jp0r5Z/4J7eGVmsvE/iFolBdorONgm0A/NI46kdGi6egr7PEIx04r2K1Tnkktlo hV5uUrdFofE37Z/wqW+8Gy6tBD++tD5m4Dnj/wCtkfjXy5pXxh1e6+FU/hS9u2nsLPzJrSJz90vh WA9hkNj1ZjX6g/FjwrF4l8HapZMm7zYGABHfHFfj/eWb6Jqeo2bnY1rO0TKeMrkof5iuJ1ZUKinD qmhwk1aS3R90/sbeDYD4WuvEDojz3cq28TqPuwog4Hp8zNn3HtXqvx88YL4N8K6daxLuur24DKMg ACPBDEkEcSGLr2zXO/saPbTfCKC2t5ROtlez27OBjJ3Bs4+jCvK/2q/EFz4m+N1p4ZtC0ps4ILWO 3ByGml+fJAIP8aDP19Dn0sLNfWI1JdNf1LoTtW9o+jv9x9PfAnRUi8DxXO3c8p8rzTGEZxGSpJwc EGTzCDxww4ra8a+HY7/Tp0KAhlI5ro/CWgReFvDOl6RCS0dlbpAHPVtqgFj7k5J+tP1tUFlMzYAV STn6VniK7xFaVV9WZVqzr1XUfU/PT4C+Kv8AhWv7TckefLtLnUWspBnAAkfaM+wLCv0tEmRX5IWO qm9+MQ1O3Y/v9dSSIj087cP5DvX6zRvlB9K5lsc7+Jmv4bfPiPS/+vqL/wBDFdR8VzjxBb/9eq/+ hPXJ+GW/4qPSv+vuL/0MV1nxX/5D9v8A9eq/+hvXPL+NH0L+wziCaYaewphFdaMBpppbmnYxSEUM YzODzSM3NKRzSGkUhpNcZ8VtLbWfB19DHH5s0YE0a7tvzKQev0BrtT+tZ+pWwngdWUMrDBB7ipau ejhKvsKkaq3TT+4+JdSlcu3nMvLNG8irgqjA7cDtmQcsMdfevPdWmtrBQGtrGVrq0/eKqAETJn5V JXg8gn6dTX0J8Qfg/eWkkraE6LCD8tvJx5ajkbc+hHevAdd8GeJ4rhhJot3Ey3CzRPBDv2Jg+Zhg SAxIBAHXPPasqzuk7Xf9f8MftazfAYuEZxmm+ztdbdH93Y5HWtZRWimRrOMzwgRbAq75BjnO0YAy voDz1rj9T1Sa7t1P2iW5SaMqMKVDnnllBwoGePXFdlqfhDW9729pomrrI1yTFJFbvxb9CqjHJJIP GO/rVVvg94v1544IvDGvSR7h5DeQ0aqgAGMsMLnnvivKmpOW1/69DxcVWoRT5ZR/BL9Oz+880kuY beBJpLPKyxld00hJLDqwwRjHOOtJ4u+Jup+ItN0vTbplddMUpbXA+9yqDk45xtOD716f4g/Zr8Z6 D4futau/DkdtbRfvA11do0yADpsU4OfcV5T4b8Fax8RtTe1tIobaKF8yzyAKqE9eg/Qenaj2VSFm 1oz4bMMTQrL2cJpyj2+79DvL/wCIXhTQb62ubSyv9euG0yC6c30g8ptVaP8AeTMdu5kRm+VckEjJ JzXI6V8KPGvjYtfW+mMFmYt5lywVpMnOcHt74r6E+HPwF8PeEo4p7j/ibaiPm864HyIfVE6D6nJ9 69x8M6dGjgKigfSuyGH5tZHz8p2PhG9/Zq8dWylzpkUmcnEcy/1xVXw34c1b4e6jcv4g8JnUrGSB 45Ip2ZVTI++HjPBHXk4r9KZNIhkiGYlPHpXC+KfB1neMQ8KkHqCOtU8NHoyfaHxJ4Yv77wxp8Ov6 fql/Zx27uNPntpxugkPDq2PusVAOeOgOCCKgt/HetaPqt3PNM8l3JC00sk0hkcvIu5XznqCwPrnO a7X43fBu58Dx3GqaLamfRZyDcQKTiA56lR1Xrz2z+NeKrfGG8M0kMUqH940cqsYz6LgcjGR+lYxi 1NRZa97Y7/4c/GfxR8Lrq9m0i6ZLWeQfaVmiE0csoHBZjyM89GHUkV774Z/bvaFli13w2k6ADdda bPtHvhGz/wChV8lTwXEcUds4mdZQLhwefkxjcRk+h54xnmlllM6TtuVyCsfAzIAB1B5x19e1e6qU G2l/X5nRKlBn3nP+2B8Mtc017TVbXUUtrqPbJb3VmsispHQhWb8jXxh8VNM8LL4xuJPBFzPdaHcH zI47iJo2gJ6pluoHY+nX1PNS3eyZ8XE3yjALKGJH/wBapYb+R5xukKsCDlY1Az/gaVTC0puzk/w/ zFGjBPRnQeAPBF14k8SadZRyKjzSru4JMYyDuPGOnPB7V+nnhnVMW8SbshVC/XFfB/wDs3TVTqLr lj8qFuSO5wfxxX13oPiKztSiT3kMTn+FnAP5VyuNKj7sX95jVSvaJ7TZ3W8CtKOQNXK6Rc+ZGrBt wIyCORXRW0mRVXOYu54opqYp2OKYhG6VE4yDzUxqJutMCFhUbDFTMM5qJhSGRMKTrTyKTGKQHtto P+LTaF/10/rJWA1dBaf8kn0L/rp/WSsA1x0tn6sc9xjZNRtxUhqN+a6EZM8J/af+JWqeH9M0bwd4 Yn+z+KfFM5tIJ1GWtYAMzTD3C9Pxx0ra+HPgCH4e+C7XRdIh+zWsKFmY8yTyEfNJI38TMeSfwHAF cX+0FZr4R+LXgf4gX0bSaHZRzadezBSwtfM+5KR6Z4J7fiK9r0TVbLXNMgu7C5hu7SZA0c0Dh0ce oI4NCXvahtH1PA/2ZNVuH+FdpEWCG0uLv7WzHG2T7RIzlvzzXyr+2R+0XqfxHsLPR9OsVtvCH2p5 rW8mz5t88RaMyBc8R5LAcckH0wPoD45eG/FHwQtvGmp+G7ZtR8G+J4ZvtsMZxJplzIpVpl/2Gzz6 e2Ofj79qbxJpGo2fw9sdIETR2Hh2zheSEghm2BmB9wzNn3J71hVbUGl0KTTlHz/yb/Q6n9jDwjP4 z8c61FY+K9R8MarbWazQXNgsZ3ruAYOrL8yglOOK+xpfGfxS+EwEniK0t/iN4cT/AFmpaNB9n1GB e7Pb52yD/cOepr85/gf4m1jw/wDEPT7fw9qa6PrV+rWTXboJFRGA42nqcr+ZHpX0t8VNM13wP8Nd S8TX3xP8X3OrRhY4Ira9FvA8rNgDYAcADJwD2rKi/cduhtNanuvjH9szwjZWlhaeEhL4v8SaooWy 060QjbIxwqyk4KnPVevBzgc14Z43+FPxZ1iw8QeMvHcnhTUbxLWSSGHU76RxpybScQRKPJDehfdy B9a5H9mj4R65r8d942stUEWpy3Draz3ke8z9RJIW6jcxYZHJwc9a5r9qT4y6/d7vBV6tvBNZTH7W 9qc+a4HAJ6YGeg79eRTlUbjzT2GqaWqZ4t8Q/iFrXjO4sYNW1WXUY9NgFraowCxwoOygcfj1OB6C voT4Talp/hT9nBPC63lnZa549vJLi8vLsqFsNLgOxpW3dyUkCDuWOOcV84+APh1rPxG8R2GlaZbq 817KYopLiURRFgu4jeeuAQSBk+g5rvviN8MvEfwfu5PD2qaZZa1ql1bEw3a77iSGAcExrnCj0Yrk c4IxXLByu5tFyStY5Kf4oaxLaaV4en1O7fw1pt088Fij7lgLkbjGGzyBnGc4JJ6k57v4z6T8PL+7 8Nal8Nb+V7C/hWG602/z9qtrlQqlpByW353ZXIyGx2A8UmV0gjVlKuGOQeoq/wCHr4WOq2kz/dSQ Hnt79Kzc3Z3NaUIynFSdk3qfRHh/T/8AhEI9JdbHTtXjkzpt3aagXe1eKYlPn2gsuJFWQHIYHaQt ee/En4E+JvBYutVfSn/sgOTvgEkiW6k8BmZFOOcZxXpccSav4burVlc3DwDax+Ux5GASOqgkRMCd o+bvzn6a+G/xEtvHXgHTbi8jina5thDdwygMpcDZIpB6gkHg9qnCJVU4N7Hv59h1h6sKkFo1b7v+ BY/NGJ2jYMpKsvIIPSvc/gd+0vrfw58b22pzv9qt7gCHVY2fDXqDo7EnHmqM4bjPQnkmr/7SH7Ow 8FTTeJfDMTS+HpW3T2y/M1kx/nH6Ht0Pavn1eK196lKx83pJH7Q+GPGul+MdBstY0m8S8sLuMSRS oeo9COxB4IPIIIr5r/bK0zR7HxP8PvFV9c3Gi29vc3EFzq2lIou45DGGtyD1YK6E49Cema+fv2Uf j/8A8K41dtA1e6aPRb+QbJZHxFbyHjcc9AeMnpxz6j0H9u7xXFe+HfCtgMO73UtwGBzhVQD9d4/K u1zU6bkYqLUrGn8Rvjt4wf4Vvo2qXEepaZqrxW0HjXRuIJbdmAkEyjmGXbkEe5AHGa+gfhP8PPCW g+F9POi29pcWzRBkuIirh/cMOv1r8xPDHxD1fwpaahYWsxl0rUYjFeadN80MykdSOzDsw5H6V9R/ s1eEm1nwDbXuleKNZ8FaysjpIkEvmW04B+WRoX4JxgcEDg1NOpzyHKPKtD2X9srxHY+DvgpfW8Uc aX2rSpZQ4UZCn5pD/wB8qR/wIV+bX2popQQxGOcjrn1r778e/B7W/iBp8Wn+NfiTLrmmwv5sMNtp MFsyvggNvBPryMc18K+L/Cd94N8U3uj6gmJreQruX7rr2ZfYjn8ayxHNdNouG1j29fjt42+IbeFt WupZoYfB1uiyanBbrcESnKpcSxt9/Cqqn0wWHJOfUvhn8a7D4vfEaGb4kyxXQsgIdDt0iK6XcTKS JJsP96Q8bQwwM+uK+aPhF8Tbj4aeKEvApn024Xyb60PKzRHrx0yOo/wJrtfDPw3PjXRPEl14YvxJ PaahKx06Q/uriIndE6f8832kgH2we9OEm9tROK9D9FIvGEJTYIMRgYwF4x9K5DxfpMt1p81z4N1t fCuu5DqxjD28pBzsdDwAemQOPQ14x+zP8dZprTTtA8XhkNw7W2narN0kkQ4NvKe0o4xnqCPUE/U0 mkWV7CQ8KNkeldyamroy20Z4p8Ov2t7C81ubwx48sh4W8Q2sv2eSfObOR+3z/wAGcZGSQRzur6Fh uEmjWSNw6sMhlOQRXyf4/wDA+nn9oaHSjBFJZ6xoT/aoHXKuUk+ViPXgAHqMcVpeENe1n9nvxLp2 iarcy33gTUphb2k1wxZ9NmP3ULHrGe2entg5UZPqDXVH1ASDUTIKSC4WdAy96lxke9WIhz2NRuoI 96lkGOelRNn2xQMrPHjpXs37OpJj17PrB/7PXkBXNex/s9LtTXfcwf8As9c2I/hMuHxHgyyc4qQy bRnPFVc4rx/9qH4uy/C34bXkun7zrF8Db2pRSfKz96U+gUHj3K11NqKuzDyR61aeJ7O4vvsiSEzG TYqhGOeMg5xjntzzW/FcKehyfT0r8urT4wX2mafa6R4G8SapEfsP2m4j1C0FxI10q42QsqswyM9f lGB6V6j8Lvi74z0bwzp2v+E4NQ1bSIpDFrOm6tOZ2MoG6WaI/eUck7VOP9ng1zRrxk7GnI0ffqS8 dMfU0SsCh+YA+hryP4c/tIeC/iLeSafZamLPVEkMYsb8eRNIfVFb7w+nPqBXqEkm9Otbpp7E2Z8t /tJ+G5NS+IWkXiwrMtzY3GmTFtxKRuCW2Acbipft24o/ZJjjXxtqKyHN8ujW8VwuchZI7i4ibHt8 gPbr0rrPjrPBcXEOl20sg1t42uIBCuWjA43Z6DqcZ64PXFfPHwg8e+I/h5rq+NFs4L+a4txbazHc bl8xFIxOpUcEYwxw2MFiMZI55+7O5rHY/RNBgUx+lc/8PfH+lfEnw5HqumEpz5c9s5BeGTAJUkcH gggjggg10DtxXQmmrojbRnLeLGEen3DsCQsbEgfSvg/9q7xFZ3/gTS7K0YM02sT3isFIzHt2Lkhi p+52A7cc197a+cW0nGeDXwP8fPh/Fda9pOiWLxW0lxcEQ+cwSOKPksWPoMlievOO4FZ1vgYR1Z5j Mktj8MkYmBTNZQiSFkJkfdNdsHGRxgKOVIHK5zzWH4cS90qdfF1o0q/ZL2PE8agmJwFdWx04wfyF ez+H/BM3xB0vVAbVobAMkFtt+VHitoHiTjJ+YNuLHuXJ7123w6+GXhLUPB1/pumRzoyxK1/9oB3O y5PmAEkZUDIA/uMMfNmuB0nKx305qO/9I+x/g18SLD4oeBNO1y0dBJInl3MCtkwTLw6H8eQe4IPe u0l2upFfnYkXxH/Z41i4fw7CsVqZS5WCMtFLHjCxspyCBjgnDDPDctns5v2zPiPJamyi8OaYdVKk iYJ+6x2/5bkZxzjOc8YrqjWja09GZzw007wV0Vf23/hVaXTnxN58VlJCm15HOA/oPc+lfN0vinxR 410/wtpus3b3Fjp6fZtMtm4aRs4UsucnAKrnsB9c+tTeFviv8ZfEpvtduV82P/UtcKskUGccxIvy KwGfnG4g45zzX0P8LP2ddL8J+TfXlvHe6thS95Ou+QsBjcGbJX6LgegFYuLqyfLojemvq7jOoldd D48+Ivw/uvCkGhRakjvfardofLHSMbhgH3wW/EmvV/2H/GB07xNrej3JSCHWczW0W7gSR5yB65Xf z/0zrC/bluxb+OdGso5H2QwPK8UXVT0RiewySPzrsbj4Sah4Q+GPg/X9It0TXdL05LobmKFZSvmd R1+Y4IPBGQcU4xUJtR6GNerKvJzluz0b9qbUEi0nw3p4hDXMl3Je200w/wBHhmiTEbS+o3SDAOQx 4wcgV7X8CNLksPhjoBnVFuLm3F1JsJI/efMoBPPClRz2Ar40+P3xLg+JGleGSIp3v7eBv7Q0KE5a CTKHztynJRflIYHBD54wRX3/AOHLCPS9IsrOMAJbwJEoHoqgD+VdMWnJ2OV7I1lTCjjiqeoR4iat JMEVynxQ8Y2Hw98D6x4g1BwlvY27SkE43tj5VHuTgD3Na7En5afte6sNb+OHiueKSNobeaGyAOCc qgzj6Mrc/wCNcdpviFdMtNWilt1E7ae1uu0EFMxrGWHIycqAf94nHUVV16e/8Y+KCZLR7jUb25l1 G5EfLsH+f8AFyf8AgVdDoOgS+ILS3js7dZdV061ml8lNqi5tid7qAMEsBLNk+kWAeBXn005SbXVn Wkffv/BP+wFt8ALW62qGvb+4nO3vjan8kr6cUYXpzXyn+wx8QvDh+Hlv4Ntbzy9TtHmuIrecgPJE 7lgQM/eGcEfj0NfU6twOa9KzXxbnJK/M7lHV4RLbOpGQRX5DftM+Gf8AhFvjV4ns0QiKaT7QgA7M N3+Nfr/esPJYn0r8uv254EHxu3xdZbCMtj/eYf0rlrr3UzWHU9g/4J/+KTFpmq6HcyoftLi7twG5 3KqpIp9DgRkeoB9DWVeQx6l+3iLW4O9F1SKVQyA4ZIVdee33Vr5v8DeJdR8E6vo2q6Bc3A1+xlDL blMxvGRkYweckupGBw3vXrV98X9Ev/2i/DfxEjU2aSvbyapbEc27oBHKVOPmGwBgepzjANdNGTUf wGk4qXmj9Lg1ePftR/EyH4dfCzU2WYLqeoobKzQH5izDDMPZVyc+uPWsHxb+2f8ADzQLB5NNvpte u9vyQWkLKpPbLuAAPpn6V8h+Mfifq3xp8bxaxrMBvvLOzT9DtAWXrwuBzgnlm6tjA9lfsYlf4I+B rzV/jR4O0yVGbE8WoTRddif6zJGOMoFP/AhX6kxfcAr5x/Zg+CV34PkvPFniLD+JdUB3JgYt0Jzt GOhOB04AwK+jFOKtKwjV8M4HiTSv+vuL/wBDFdf8VjjxBb/9eq/+hvXG+GW/4qbSf+vuL/0MV2Hx X/5GC3/69V/9DeuaX8aPoX9hnElutNNOZeKYRXUYDW6UdBSkUmKBiEU3bTyKTqaCjP1nVBo9ibgw S3BztEcSliTjvjoPevnDxt+0BeaZrsdvqNxY2MtxJ5VlpT7tzPsxlpDgKAxOXPGOgBFfTN9Zfb7J 4QxRiOCK8K+Nnw/u7nwk6280I1WGQG33wo8svP3Iy7qAx69GPHArnnzLY1gzzEfH/WbjxDpVreS2 bWlwYhhICxEecSEuhkDnodynaARnJzXocHibQta1NrGxvQ12fmRSjASA55UkYP3W468dK8Ae2mj0 OOVbWOaLRyWnnFxmGMrlQHQkGQgkZA43YGR0D7bUFk+y3VnfnS7qGePyL6QlmmLRk7REM+X0H1Ab O7rRTm3o/l/X/DLpc+0y7IJ5jScqycNFyvRJ672td+t16n0hElzbt90kVdi1CZBgg1xnww+LFp4j NtpesstnqropieQqq3IPQgBjgnj2OeK9dTREdc7QRXTFp6nyOY5fiMuqujiI2fTs13T6nm3xDnkv fB9/Gy71whKlN3G4ZPtXxzdaJefDTxVcTCLGg38hkEwx/o77gv7zHCgnHPTkV+hOp+FIL/Tbm1lU eXKhU8c9K+dfEfheOG3vNMvBui5hltyxWN13DIc8sR82ePfryK9ijho4yi6d7SWqPzfMMxq5Rjae IteEtH/Xft8yl4R0+a+jidjuDAEEdDXrOg6CqBSwr5J8UP42+HlrFp/hTWlsrQ5uvIu4wWt0/wCe cbuDvQdePTsMis+1/aZ+MWiKVaXRb5EODLPHEob8mXPQ8jivCrt4abpVVZo+/wAJzY/DxxdCLcJb Oz72/NH3YNPCx9M1g61ofnAsFr5JH7Y3xdsoI5LjQPDflSY2SyBlVvTB8/B6GtG6/aj+Mwi3XHhj Q4FYdTC/T1GZqxVaPQpwa3Pbda0RjHJG8e+NgVZWGQR6Gvmn4yfD7wb4T8OX7W1lHY6tenbAEkZn dsg4VScAcc4wAK9R8YftOjUrI2+haFJaXAh3S3+qjZGDgbvKjBy+CeMlRXkXimOyl1u41dLi91S5 ZcC91DAYkICwWMDCLuOQBwBjk9a7Y4aVfW1l3PIxOaUcKuWL5pdl+vb8znfhf8JbbxBa3bahqd7Y 3cg2K9uwGUI+YNkfMD6ZHSugvf2SNSuYY007xNaXCoSUF1G0WPy3dya1fAGl6jPm6AZFlO5Rz07f pXsug6Zfsq5Yis72laOx6NCrU9mnN6s+e0/Y88WtNn+1tFUFs7vMkIA7jGyultP2SjpFkHub2bxJ rDfLbaVp0bKsjD5juYAsQAGOAAeOo619BXXl6LbK97dRwMykxiZwgcgdMnp9TxXFP4wPiC01Nrl4 9G8N2suy9uEuIhqhwMEWZJUsG6nbn64zXfQoVK2r0R52PzdYOPLF3n2/zPD5LLXvC+vDS9btf7KP S3S2JS2ZBxhcH5sEEHJJBBBwQRXXJPeSWyJBMsUyNuXcuVkGOh9K9XHh/TNe8P2el6xp0Q0O+Kw6 AmnpaQSTHb/rruXeXikwVO84yByCMivPtT8G6l4G8QS6HdSJqsSGMJc2rrM0RddyJLsJAJHIPRux yCB8XnuWYnD1PrNP3kvnb5HVlOc4fMV7N+7Pt39P8t0eifCn4v3OiNFY6mpaHo0Tfej9Sp7j/PrX 014f1iy1yxS5srhLiFujIc49j6V8mab4HuYis+pTRaekfzKWO6QD6dvxP4V23wpSx8P+J/P0pr2c SrtuJVkPkv6ZUfKSPXk+9dOAxOIqJKrTaXn/AFf7/wAT1KsIq7TPpZBxUgFVrO4+0RK/TNWsV7py DScUxhmpCppj0DIiDmoyKkPBo2hh7igCu4IpKe4IOKZ0oGe22g/4tRoX/XT+slYDV0Fn/wAkp0L/ AK6f1krBbiuOls/VjnuQnntTGqRmqMnJNboyZka/o9vrVhNa3UMdxBKpV45VDKwPUEHqK+TPjf4F f4AeD9b8YeBPEF94SaIATaTGfOs7kuwT5Y2/1b/NkMOmOAK+w5cYIr5F/wCCjmqzaf8ABrTYYlPl 3OqxrKw7gRyED88H8KJ25W+wlvY+VfDv7Z3xF/4R2/8AC+tXVt4l0q/tZbNjqKfvkRkKkiVcEtz1 bdzXgnim7uZrmzmugoFtAIYlHIAXhfx71LoYW+1a2h3bNz8nHQDk/wBa6iDwPdeONE1FrB1knshG 32RUJkk3EjK46429P/rA+c+epG251LlTKfifwldfDW/0S/iLiG+tIbyC5T76ybVLgHsQ3P4ivbNH +JcPxn+Hn/CNeJrd5rizuEuUvLZwv2ggFVVlHIbLDkcEZ6Ec8Z481/Tr/wCG2maXezLc3QVGtEtz ulVlG3p2HYg/zFeOLd6l4W1j5o5bG5iKvtb7ykjIz6USl7J+7sy42n8R+rHwR8EweD/AumWhTAt7 cIqfQfqc96/NvW/C+q/E34zxaWis1/rWoYDEZ2+Y24ucdgp3H2FfR3wB/bKCLb6L4uk/chQkd9gl h/veo6fr7CuI8CeOtB8C/tA3GtypDdWFtf3cCXUfJELyOgnX1KjGcZ+Vj3rSpKNSMUmNRabZ7Z4l /ZU17T/DVr4Z8PeNLf8AsG0nF1ZpqOnr9qs5Qclo54ypJJ9RXPfC7UYvA/jjXdI+ICvc+NtQz5Wu Xz74r23H3UhJ4QDH3e/4AD6st44dVtIruGdbiCZQ8csbblZSMggjqK83+Nnw00vx94SubK9tVaaJ WktZ14kikA4Kt29x3rq5EtYnPe+5+fvww8IWfxN+Kf8AZN+ZEgvzcOzxnBUhWcEfiorf+Jf7K3ib weWn0cf27YZyPJGJkHuvf8Pyqf8AZwDWPxYjufL3lIp1I7pgKufx3Yr7WgAv7cErXNToxqRfNuay k47Hx58PNRefTLeG4jkS4jXy5o5sZWTOw8EfKfuHAVnOzqKy9W8e638GvHZ1C13S6XqJM09jMSFZ txD45JDAgjJ59R2r6C+L3hiPTpLTV4rfYXJhmZFOWxlgCFG45XzB94DpmvDPidoK694KunSLfPZu JRJHgouAFkHyjYMjY3BP1NeXKLw1WyPvKi/tTK4yXxR1+a3/AMz6d+HHxE8PfFDQmm0+dLqF0CXN pMPmj3DlHU/iPQ818y/tE/s+TfD68k17Qoml8NXD/NGvJs2P8J/2Ceh/A9ifEPBXjvW/h9rK3+jX slnOvDAcq49GU8H8a+7PhF8cvD3xn0aXSruJI9ReArdadcAFJVPDbM/eHt1Gfxr1IzjiI8stGfAt Om79D4Q+gxVq+1C51GxMFxNLOyY8sSOWCgADAB6cKo47ADsMepftAfBC4+FusfbLAPP4cvHPkSnk wt18pz/I9x7g15EvNckouDcWapp6hpNpLd6tZWLqd88scY9fmIA/nX6kfDbwlY2+nwKtqihUAzjr X5k+G7eS48UaY6XLWs/2iMiZVDMhBGGAPUjjjvX3p4I+GOt+I9Ljmm+KniGKUqDH9hWO2QHtuUA5 +mRXVhrq9kZ1D3jVfCFnc2p2x7GA7V8yftH/AAIj8XaNJq2nq39t6dC3lxqB+/TOSh9xzj3J9a6H 4X/tNzaR8Qbr4ZeNLg6nqNvfPY23iFIxFHNjhRKp6MT8oIzkkdfvH17xnGlpbzzMQqBSxJ7DHNdf u1YtGSbiz8pDlGIIwehFepfs7eOf+EN8fQpPKI9P1FDb3G44AIyUb8Dx9GNeceJb23uvFGrG2AWF rmR4wBgbSxxxVWFsHnvxXlRlySuuh0tXVj6u8HXOh3XwR+I3iHxCjwaLqeqz3enhAPNSQkLE0ecf PuH5A54zXvX7Ovx0svGfwhg1XVtSjF/pMJi1R5TgpsziRs9dygHI75Havgv4rfE6LWPD3hfwnpCv Bo2kWkbzKwK+bdFBuYjuBkgH3b1rF+HHiBU1eHSb/UZdP0DUbiCPUvLbCvEsgPzew611KtyysjNx urn358Gorz4u/EzWviTdwPbaS0Y07R45RhmgVsl/+BMM/ia9I+OHguDxZ8N9csmQM/2V3iOOkijc h/76Arxy4/bV+GfgfSotO0CG91gW0Yihhs7fyogAMAbnxgfQGuGvP24dd8eXsmhab4XtLGLU0ayt zPdkyLLJ8qOWIVQATkjH410c8EuW9yEne59N/AzxVN4n+GnhzUbhzJPLaIsrnqzr8jH8SpP416aj bhXmPwm8Lr4L8FaJoayidrK3CSSr0Zz8zEe24nFelwH5BW/qQiRlDDFQmMrU56U00AQMlew/s+Ah Nd+sP/s9eRMuD7V7B+z/AP6vW/rD/wCz1zYn+EzSHxI+cbi4ESFicACviL9pX4peMdE8Y6tok0+l JoWv2LLaSXiE+REFZWAIJ+ZuecEZZcdK+yfEVj/ammTWpLKJFxlWKkfQiviP44/s6eKLnVL/AFfz 7nxP5keyMXMuJoAMkBDjaR7YHfnJzV1+bl90zilfU4v4e+MLvRrnw94h0TUbPVteaxbS7rS5NO8t IIlPyfMoG9jwdwyT0NdXD8R/EngLwxqlnaEwNqTyXF6Li3VfJuJN2/ytpwBg8bhxzgDvz3wye38P fYNOvLZBd2pZvNMDR3FrIMnBGCX+YjHX7vTiux+IXijTPEfhm+kmhstQIXzY75FKSh9wG2RAwOWA UAA8dxgnGVOHucyY5S1szlfgV4T1b4jePLTwzpuom40NmjvdRkkhVzbonVUY5xuJ2jp7jiv0yt08 i3jiXGxFCgbR0H4V4Z+yV8G0+Ffw8inu4Qmu6ri5uyw+aMY+SP8A4CDz7k17v2rSlDljd9Spu7se R2uix6l8TPGlxcKGuljt44c9RD5fb23b/wBa8F1vwTcSeF7u3s1I1PSNQa7gj3lBJtdiASOcEGRM /Wvpnx14Q1KXU4PEHh64S21eFDE8cozFcx9djge/QjkV4pruleN/E0brpWlHTdYtLy6ErxgzRmLY krEjaCVG9ieQBtBzxVTslqC12M34M69faX4h1if4bwb4GtYp7/SL4HyklG5fJ4O6KVSJCSu5TkYT kV7PH8ddStoD/aXgu/huF3Bkt7u3IBB5x5rxN0IP3ehzXhnhHRdf8JyL4j8PziPV3VU1Gyu/9TeH AIZiAMMQQyuAOGGRjivSrT4/IYSuq6Jq2mzoBv8ALtmuY89OHjB4z6gfSohouwSRoav8W/Euvedb aT4PktOdpvNSuo2iXnBIERcNjOcblyO9eJ+LdHv49TNjBcvqvi/W1EUk+3iKIEbiAOEiU8he7YBL HBHoOs/FHWPE3+j+HdCuQZflF9qo8mJQf4hGMyNj0wv1rt/g98KRo1xPql/LLfapdlWuLqY8uRnA AHCqMnCjpnucmtHqrXJSsO0X4YL4J8BaNBZ2zzfYTmdBy8iMhVue5GVb32+9eaabp2saR4ktrHSL KCZb+6cqDHIsghJwzPlMD7zYGe2SMYz9c3NukemyhVBIjOB+FReHtNtryytL9UVmkgiIbHQBFAH4 Yx+BqJRvZIuMrXZz15YWF4iR6zozaVbkBFu1uBcRJ6eZlFZR/tcgd8DmoD8INLt7pg1nFvU4PANe gXcUMsMkUoUxFSHyOMVS8K2V3Y6c8F7J5hilKQ85KxDGxT7gcH3BqrWdg53YzdO8H2tgoEcKqPYV pyaakUZ4xgVsnaKiuAHjI9asi9z4G/aM+zWHxw0mbUbeOS1uY2ti04BU5ztAyOu4rX1D4fsLfxF8 PLBnkSRhbhH+YHBHHP5VxX7RfwvttetIdSaCCS8ilC28k8IkEbH+IA8ZAB613Pw8+GOnWvgq0trx ftE8W5JBltiOp2naCTgZXOe+ayV02jR20Z8mfHj4cSeG0uda06eDRrQRsLu9SNT0GEXHUhyQrEdN qHBxXtfgj9qu502zjTxpoU8Vutql0Na09QYZYyAd5jLZGNwyELnvgCtf4j+BrWO6s9O1CD+09FvL mNVinO4wShsowJ6rkcqePwJB8u0PV2+Dtq+gePbSdtMiDS2mt6ZayS20cRY/upNoJXb2OOmOBjmF 7sm9gauj3if9q/4bW1iJ1155pGj8yO1Szn8+QHptQoDz+VfLf7RXxZ1f4q6Iuu61aS6B8OrRybLS 7hil3q1xg+XuA6L1J5+VQTycVpeJP2kfhV4bRZdCsbjxLqSJtgWG2MCL6Au4BA+imuW8H/CDx1+1 V48s9c8Z282j+E4V3W9tF8iiPIwkak5G7qXI5x9ME5c3ux1FFW1Ln7F3wQl8Qwax471qFx9pWS0s YpEwrKQN8gyOn8Ix6NXm2v20nwZ+LTB7cvHZTPFGAmS0bNuVR8wHzAvHnHAlbrX6d6D4Rs/DujW2 n2Vulta28YjjijGFRQMAAV8lftrfCe4T+zPFml7iyBhdiAYkVQ+I3B7EMr/Tg10U4qMfZ9/zNab5 m4vqeEeFfhTqh8fXlr4b1VU1GNl1PQ4mk8s31ucN+7kyMSquOMgnDkEbefofwh+2X4g8L3g0Xxx4 auYblI2Zmn/0eaMgEhTuwrgjGGO3qPvdT5L8HPg7rfxo+HV7r73Or6NfaPqZSLVw8otxIcPlewKn dnZggbeucHsfE6fGfTNQXQNam0DxU1pi2X+1rFZcmR9uTgAMR5ZO7HTca0jWuuWor2+8uTUvjV/w Z7C/7Y3gy98Om8me9huADvtYbZ5SPmKj5lG3nHc14DpPwmvP2mfiLeeNtSL2fhwSeTBEcGR0Tovc ckkkjI5IzxXS+Cf2T7vXtQS+8bXsFwgAA03SoRbQEZPDbAu78q+q/Dnhe20Wwgs7O2jtbWFQkcMK BURR2AHSpkoy6GL5Y6RPzc+MngK++HHjNYY1k+y2khmtADj90W3FVPsckDPXmvcfCHwh8LfHXwvb 61HDEuoZ8u6lsmCkSgAkkDI5BDYPI3YPINeo/Hf4Wr8TNVaztH+zXekw/aDKB1Z8hB9PlfP0FeT/ AAY8Dn4KN411vVtVntr61sDLpemWRYC6ud4Hz5BBQDJKnsTyCAauUlbnXz/z/wAzSTuk47nU6X+x PoglLXE15OCQfmkx/IV7T8N/gL4c8AKjafp0UcwGDMw3Of8AgR5rsvh94ysvHnhHT9Ztomt2njHm 28gw0UmPmU/Q1uXF9b2KB55o4F/vSMFH61Cd9jBu5atoVhQADGKnzxVCz1a01AsLW6huCvURSBsf XFXATVIk1PDDZ8S6R/19w/8AoYrs/iv/AMjDb/8AXqv/AKG9cT4YP/FT6R/1+Q/+hiu3+K3/ACMN v/16r/6G9c0v40fQr7DOJNMbmn44pO1dJgR8EdaTOD604gUHp7UxjSfagDrzVf8AtK08ieX7VD5U AJlk8wbY8DJ3Htgc81R8PeNNB8Wtdro2r2mptakLOLaUOYyemcdM4P5Uhm1HyaxviD4A0H4j+E7r Rte0yLVLOUA+VISpyCCMMCCDkDkEVtJgHGQT6VKGIyKl6hsfnL41+DniP4N+JtQuvDNldNo7hljt pJWmaBSQWKMx5O4ZwevHcZqz4evNM8S51XR/JOovI66iurbWmdY4hkwIDlHGScdRjrzivvvWtDtN ZhaO4hVwRjJFfK/xs/ZmuYLybxF4RKWmqBW3x7QY5gQQQRjhsdG/mKzUHT1hqt7f5dn+ezPrsnz+ eAapV/ep/ivT/LbyPHLi3s7TSl3K9pYqkSxyTqjasWaUHpu4UksucAHceAa9q+Ffx2ufD17b6D4t KpaSbhZ37zB2CK2B5pHsRnuO4rwrQ/FNpDdva3UUvhrxTZm3gmvro+dLMgG3ywm05BOBuUdOoNII ZdML2dzZXel3F4lzIbGJMz3yE5Tk5KkgnGBzjjniojKKs4/15P8Ar0ctj9HxVPC5rhrTfNGWzXR9 PNPy+W2h+hVpJDfQpNDIssTjcrocgj1BrgfiV8PjrC/2hZqVuohz82Cw3A56e3TvXz78MvjbqXw5 1h9NmjkvNHMyRjTXkL3NrujD5zjHXI647nbmvrrwj4r0jx1o0Wo6VdLdWsvGQCCD3BB5BFelQxDh Lmg9Ufh3EPDjpRcKseek9n/Wz89u3U+Hfi/omuXFzpKaF4fbVb1pplG/mGJQcEkP93OccenGDmvO PF3w88Q2MmnWWq2V9ca3iN/OjCNbzAKzbS5YFWBYrvYEnHHBAr9EfE3hO2sLsXlvbPI84/eeWpbB HTgfU15N4/sNDuLm3uNRurq2e1l81bdF8olijxlt23dwkjcZweOK48fP6xWlUa3t+RzZPGpl+XQy /m5oRcmvm29fPXf8Oh87XUOr6r4RtJ38P3V5PbwCMw20aRK2FUvLIDkyucEZJHIwAFAr1fQPCGle J/AGl3EJLq1sMmWIxupA5UqemOn4U/w78Oo08baHqPhjU5721nllku7dCQNqpk7hxjuSO+OBWlq2 t3dvYavaLBH9qHnhUtAdpYltuPc8fjXBTjZnoTemh8lT2GbmUpbi0Jh8xwzCd5MsOiZwhOByfb3r pPDPhWfxdrPkRxubZHIndmO7Hy4Vj746DoK7bwj8GNb8QwwnULNdIhKCOVIh88ij1646+tev2ul+ HvhpYQ29xIkT4/d28Y3zP6naOex5PHvX0ssRzLkpLf8ArY+Ew+WOEvbYtpW6b/e/01/Qg8MeAILe CNPKwFGMUnifx94Z8FW8ifaBJOpMbS28YnED52jcgZS3Oc4PGOSOM8n4u+Kt1fxyW1nBHDpbArJM hkKBM43PIu0qeh2jjj5iQcVxCeJ7dEt51vWaWNFSS+CnfGokAwIll+dOQMkcgLn+6daGEV71fu/z Hjc3tHkwy+f+R2B1NfEF40ur3IvVuFaRfCwmZrbUFVhucypIyoUK425GNo6ZNWYbm4ubqK8F7JPf 2M0kdtfyyzRr4XO3asbsYSGQcDv0bgE5rlr+6sNG0LU47yz/ALK0ZInkvLR3T7TcK8ihbiHzFVkU k5x0AbkEZFee6l481rx7qcuieDIhbWAkmgOpWkTQfaYGARdyZ5bbuyzZPzkdApHoVq9PDxtJ/L/g f159j5PD4PEZjVbprrq3svn/AMP81t1nxA+Nt14SXUdB8MPJN4kv3aHWrsmK8tdTjeM/vcFcoTvy EwCCSTgnA4j4O2Xibwxq+p3mn6fPc6rfRJbia5Y+XEg/2RwTwAPQAjvXu/we/Zwt9GjS7vo/tF4/ zu8nJJPXJNfQmj+A7GzUFbVFYdwtfL15zxM+aTt5H6XgMBRy+nyQV2933/4B8++FPg5qeu3KX/ii 9m1GbO4QMcRKfZRxXu3hzwvFpyIkcSoq8AAY4rq4tDjiHyqBVyGzCY4qFFLY9NyuS2cflRgYxVsC olGFwKkQHOKskU0wjvipvKOOlNxQBAy5FMHDD0qwy+lQleaYyN1zwagYFTirZFQuM80gPaLT/klO hf8AXT+slYLDIzW9b/8AJKdD/wCun9ZKwT09q5KWz9WVPchfimkYpzDJpjGugzIJMEmvgP8A4Kd+ K2RfB3hxGYKxmvpR2PRE/wDZ/wA6+/JOK/J79v3xmPFH7QN/axyF4NJto7FecgEZZv8Ax5j+VZVp WpsuMdUzw7wMif2750u3yoLeWR92cfcIGce5Fdh+z142/sjxxFMZfLcwzJsKbt7bCU4/3gP/ANeK 43w5FjRvElztZtlkFyvYmROv5GuT0S/m0zVra7gcpNDIsikHHIORXFGp7Jwl8/6+4tLnc/u/r7z7 V1z4RWtvq9r4p8PWEF7dadJb281owUJcTurBmU59QcMM8lcgGp9V8MaD4/L3NjZw22sWp8u/0+5i XzODyrjHzAEcEZFa3wv+IEXiHRtO1yIm4ezG9IxgyDUZCDuUEfMFZUJUjkAEEZrudR+G+meL9b0W xFwNP1aSZ7q88RWTokUTSR7kjDdjvDxlCcZz1wa+lq4SFaDq0tL6+W2/l0+bsc0arhLlkfJvxY/Z +u/Ddk3iDw7FJPpqgvc2i5Z7X1Ydyn6jvxyPKNL1d7GUSlUlBbDiUHBz1zggnjBx7Dua+5LbWdc8 HWgvPEdkL7QnuHtI9asF3BmUciSIcggdSoI9q8U+NnwJsbqwm8aeA2ivtIf95eWVmdwhPUuoHIX+ 8vVfp0+fxOFnSk1azW6PQo1otp9Gb/wH/aUvfhtFFpsxk1rw2QHax3hp7POT+5JwHXgkp2x1BzX1 to/j/wAO/EfQ2vdB1OC/iK/PGpxJGfR0PKn6ivy4tbl8iT+BWGd74wx6Lvx8jkKSZB8rd+9bnhnx TqGg6hHPYTXSajHkCS1kEVxnbgKm07ZEBHLYOQelY0sS46M6auFuuaB698BNJSPxlrbscXkFzNFL CU5TLLjnv908V9f+GrMPAoIzXwp8PvilF4K8RalqKtFqst46SXS3TfZpDLIcttJyDhs54Ar6d8G/ tReD4mEGrQ6hpEiyGB3eDz4xIMfKGiLZPPTGa7aVSnbc4J05x0aPRPiN4OXxF4W1CyCBpinmwjAP 7xDuXrxyRjn1r5Ukjt5zKr5mt2Hlqx+bIAOF3yYUEqWTheCowK+q4fjh8PdYiDW3i3S1z2uJxAfy fBr5x8fPpOm+NNVFnqNg2nzH7Rb3VrdRgZkJcAsu5uJAwwuOG5IFcuMhGaU0fYcOYmMHPD1Nnr/m fLfjfwJe6FqN/PBC02mxOp+0RglQr5KHkA4OCM4xkGue0fWLzRL+G8sbiW0uom3JLC5VlPqCOa+s dHv7DT9Z0zVryKOfRtQP2HUFm+5JDKcEEMxLbH2twOF+ua4f4/8A7Mj+DGuNe8Kt9t0MZea0V90t qPUd2T9R3z1rkhTk4cy6f1c8rM8MsHiXT6PVejPTvhP8bNK+Nfhubwf4uhjN/LBsZmIC3IGPmX0k B549Mj0Hzr8UPh3d/DbxPNp8pM9o5L2tzjAlT/4odCP8RXBaZe3OnXcVxbySQzRsGSSMlWUjuCK9 q8eeMh8Sfhta39wduo6dIFkU4BkYgAkex610qSrQfNujxGvZvTZnlCOQ6uCVIwQR2NfYXwF/aU8P W/h+2sPFWoLpmpQsIhcyK3lzLj5WLAHDdc544znmvjeIlgCcge4rb8NXkulataXv2JL+NHBa3mh8 yOVe6lSCDkVFOo4O6NJR5j0T9pK4sT8ZtQ1XQ9Rt9QsdRjivY57KVXUNtCtyp67lJ9ea+mofjnZ+ N/2c9U1iW5VtYstPa0vUJwwuCuxW+jEgg+5Havlj4m3Hw/1a0WTw3pd1pOouBIMJ5cTA9Vwzfqor k9M8SXei6Fq2jxTxLBfxRrdKrbvN2PuQgqCMg56npmq9r7OT13NI0ZTs7PTyOLupyl+8i8/OQcd6 1ZYZbSeSGaNo5kJVkcYZT6EVGLO0iusM/mYkAyTtzxnPf9RWrqOotr85u5zJd3kqgyzuWdnckDJJ OO3pXHzqJ1QwtSo7WMXVoGltI7hQW8s+WxzwAeR/7NWdbEqwf07etfU/wf8AhDbeP/hT4kguEjhl urny7eYctG0a5B9hlug9/avmvXNBuvDOs3ml3sZhubWRo3UjuO9bSg0lLuc0lyycexHA2yX5TlG5 Gf5Vp2+ofZZUkWQpIjBlKnkEcg1jJ8w2E9en1qSI44xjHUUJ2Mz9V/2fPHMXj34e6Nq+7M0sIScd MSr8r/qCfxr2CNvlHpXwf+wj8RPLm1TwpcSYGfttqCe3CyAf+On8TX3Tay74wfavYjLmimclrOxb yM0daYDmjODVDHkZFeu/AEYTXPrD/wCz15Cpr1/4Bn5Nb+sP/s9c+J/hMun8SPm4jcKhm02K4GHU EH1qVTzU6V1mR5340+Bvh3xtAVu7TypxylxAdkiH1BFebeHf2TJLT4h6ZqeqX8GqaNYubhQ8W2eW QEbBJgYYA8574xX0ogqdQBUSjGW6Gm1sTWyCNQAOB6VZFV48Z9KlMip1IFAEjJuH4V89/tL+H7zR 9G/4SLTb5rW4t5Y8o8uyJxuAO7Jx0yO+QcYPFepeN/jH4P8Ah1Cz69rlrZSAZFvv3zN9I1yx/Kvk n43fti6d44sDpOkaAZLFJ0l+06i4HmbTkDyx0H1b8KzqOKi1JlRvdNHuvwxj0fWbaayjvLd9QaGK 5FnE+4xW7oGhySBuO1gCcDpjtXSTfDaGaYnbivlX4bftZJ4KsrO4u/DVtczmaW3kktm8thANrqAS CThnbgnHTpX118Mvjt4J+KEMY0jVIo79hltPuiIp1Pf5T976qSKinNNWNJb3Rf0D4fWtiwYRjPrX f6bp6W6AAYApIUQdMCvCfif+1Vonwr+IeseHNbuxYLbWMVzbkWzy+c7BiUyvQ8LjOB7+mkpKKuzP Vn0M6oyFSeCOlcxZXGp+EJ5UtrVdS0uVzILYvseJieSjYOAepBBGfTmvkCD9ujXf+Fea1qTtpkXi q3vALTRZrGbLWpwQ7Yf+6SS2QOOnIz3Pwf8A2ifiB451jw2NZsfDg07WbG4vYv7NeTzk8shcOGch eWGevQ9DWDqwloUotHpGsfEfSb7xtdRW+n6jFrdkscqS3d7mKI+YF8tIkABZuc5zwCccce16epFn CWzvKhmyckk8nNfNHiGe3uPjt4ajtFmkV7lbm8uBbsgd9jpHCc/3AzNnoS/tX0xE5CBacN2Enoiz kA0jnjpTNxOMgU4ksORityDh/ivo0+reFLlbYbriLEsYA6kf/WzR4T8SWmpwJdW8qiG/hWfYWGUl VQrofQ42ceqtXXXaCRNp5BGOa87ufClhpuqrmHynluklt3TI3722yocdSAzN9CccKahp3uirq1mc N4k8SXtxrNq+q3tuoRvtn9mbQrwxg4BPO7jIJJ4JxgV02s+Bf+EhiKSHzraVeVPKsp/nXk3xm0yT 4b+NrzWdHkMkbW0Rlt5ZPl2m7t90YHTaQrHB6E8V9T6Z5F5p1rcQlTFLGrpjpgjIrOF22maS0SaP MvDHwK0LTbpLpdMtknVdgkWFQwX0yB09q9X0vSLfS4VSGNUA7AVYij29KnHat0rbGTdwdvl56Vw/ iaGz1Pw5qEN4N5shJ5ybSzGMszK4UckfNt47r7jPcEV5t8ZrLboTahFbGeW1UtiN/LYqRggN2pS2 uVHc+ffFOoeNtT8J2PgvwZqN/wD8I/8A2kNT8i2QxNF5eS6SMwHlpnDfNxkDgkgH1/wFoeseL7// AISfxJYCwufJWGK1KgElS/70jccZV8AE5HOeoxrfBnWP+Fh+E01prmeSynmd7W1ml3CKMOQoYDAL ADBbGSQT3r0xLVYl2gDFZ04WfP3HKV9DIt9KSIcKBV+KAqBxVxYgO1KEA7VuQeWeLtStvh/4iv8A V76C4uLW/SON/s43lAuedvU4Ldj/ABnjiuF8aHw7400iF9MmF9eXbYt7e2w024deAeMZGSTgZ5Ir 1T4uQSLpen3MU/2d4rgMGKqfmB3r1Bx8yL+BNP8ABmnrDatMYbUyvI7s1qipGGLkkqoAwvTA9AKy vrymnS5neFfhhBpfh+0trmSVbjYpn8iZ0V3xjkKQCB0GRzgZrZg8KvpbeZaSxFumZrdDx9VCn9a6 YSYHC4pjktya122IMhNNubu9tJrh4lFu29fKjKsTgjrk8c9K2S5Heo1agtxVIRreFXz4n0fn/l8h /wDQxXe/Fb/kYLf/AK9V/wDQnrzzwq2PFejf9fsP/oYr0P4q/wDIwW//AF6r/wChPXNL+NH0K+wz iTjNNJpW70wrk10mNhDivAP2hfiymn6vp3hfStRVLyOUTahFu8tCmBsjZz67gxUcle44r3/HNeY+ PPh3Z/2tPrtholtNqdxhZbkIBKQBjhuo49DUyejsUldo+TfGviO28Ja4yPfXtq2q2sp1E28K+RKv 8K+USpxlSCHbpyPQ+JQfFLxDoWla+2majLp39qWohlOnxpElxGG27mUAbAdxHy4znnkZr7k8ZfDm z8W+HRpN5CumWkiOjpHGMsSuB6DjJPPcCvjL4o+AtJ8B2+qR3njHSjqlnP5b6PHNM17c25aMohUR iIYwX5bvxnAzyybutbGySGfBzUPEGlQahrdh4ok8N6o4EdtPNv23RA8xo9wbHJCDaQ2TnjivoPw7 +1N8QLe4iHmafr8Tx+avlup8xQTuTnYEkGOBk59GPNeKeEfiT4GudPstLj8SaxoFruBkFxBHOnmL zG4C4IAycjHOR0xmtE2mn+IpbJYdf8P6ncTXHnSvJB9nnS4AAGXXcNrbemAOOmea/RcJg8KqMYRc ZvrZp66PrfyWi6rzPt6ODw3sowjaT+Tu9H1bt0WkfyZ9K6X+2ratBv1Pw5cGM5aOWzcusiDqwyMH afvAE4967nSP2ofh5r2+OTVTZsFUkXURAYN0IxkleOuMdM4yBXxpFHc38cF1Z6VcW19cv5lvJpmp iUWs6KCwCsSwDqpPbqBnoKpSskKNI3mQxIWFlYa5pwC7xnzoDIMcZT5c9MHoeaieU0ZPWNvvX/pV vy7dzlnlNGSu1bzV1/6VZee3bvp9U/Fj4T+C/jBvuNA1uxtvE1md0U9nOnnQuMnDLnOODlSO1fN6 alqHgjVZvDPjWB9M1EQNFb+II98k7DzN2YT6YLfJxjgiuT/sySaxFrZyW9+rQmSGWO43BkXd5luy nbGrLt3DJJ6Y3Z4fqE13eacxvHvb+1NsJIheq1yPKVhhxI2FWSMmNGCjkFhkV41TJ7v2lOVvVXT8 ui7arXXToa5f7bLanPRleD3T1T+ei7fN+h6TqRurTU2NzcNpkVzenyLu1jLPqgCkN5gI+Xrk7uQO CD8po8D+I9Y8Aa1a3WkW5sr8WqEaXagzRXQ3EEkhueMHrgfMQT0rlNI8YXFhZ3FmsWk3+nvCXlVC 3zbgqLcQByCDnZuC4KkHgAc1tP1aGGO30S6+2WWmhF3yfZg9yrE71JnVuEYkAE/KdzcDGRhVyuv8 cNd+ttfV2Wtt/vvufcPH4XErkqP3Xo77dnrqree+mq6n3P8ADb416N8Q4WthKlvqkB8ue2Lcbx12 t/EM12eoeHrDV0ImhRwfUV8CWviLTtSa0uIb+3tryCWVbA2WEUSt9z7QxPDkjrnncTlq96+Ev7SU qSwaP4yaJJAi7dZgO+2kbgEFgNoOSMkHA3c4xXDUw9aGsoO3fp9/9X6HwWaZLSpxeJwMk4btX20v /S+5s9Rv/hTbby9pK9qf+mZ4NYmtWWmeDoFbUbkGUg7IVG+WTHXag5PAJOOgBJrG8e/tFIrzad4a 2vc7A0V00YnW5DFQoi2NwTvU5bseAeleC+K/EV3rl0wv2vby2F0VLblkubR0XcDK7RglCSOBgctj nKnalg5S1nofk+MzunS9yh7z79P+D+vS+x2/if42CWEppmzT7SRXCXGC8oZSAVlU7REDk87iQR1A +YeYzz2+uTaheSXV1JHC80pUEymHYBtYyMWLJ0ycjox43AtHLZ2VwhltIrWS+aGMi3gcCK7iLAli YyCrbeSo/wCmg+Xbiuc8TeMdK8KaQ08mtxTxyedLZQxzeYyBpChhZSA5woOTwOfR816sYwoq+y7/ ANf15nyVWvXxk0m2326fd/w/e26L9pJbDUso9ldRIsLyN5qpDLGI9/AGxi4znlcg544IOV4i+JOk eGltZJLpvEOrxxwmBriNJlmhLMTGYygZCORuLZxgLwBXl3iL4vX/AInuJrazu4tE0uWUyxWwuN7R ZAGFJPyjgccngc55rqvhxZfD3QH/ALQ8R64ryrJtkH2eaXY/PDYU4Pynr6V5dbMl8ND7/wCv69T6 LC5DKo1Uxb07f1/XpZGp4X8A+KvjVe2smrNLb6RAWENsWLbVLbsZPJGTwOg7AV9f/DD4Mab4SsYo 4LZVYAZbHJrynTf2qfhl4Nt2jis9Yufs7iOVbezUGPsCd7rkfTNM1X/gof4e0xJV0nwpdXzRuBi4 u1iDqe6lVcZHcHHsTXlOrFvmnK7PrqdGNGCp0o2SPrrTtJjt4wAoGPatIRhRjGK+BfE//BQbxhL5 kGiaLpEEoBlQqstz8oPKsSUHABJZQR9MGvMfE/7V3xR8SyyQt4vmsLO8USWzW7JbmJlI3fPGqnGQ wAYnr361LrwWxqoM/TXX/Eek+FdPe+1jUrTTLReDNeTrEmfTLEDNfH/if/goPdafdalBp/hWzzbS mOKSW+aVJlzw4KqvB4I+tfK9t45u9Tlh1bU9RaeS4H2W8ed3muJM4PmHduVj8uef17c54js5IIYW aOVUQ+UDNH5bFeSjEe4yPotYyrN/DoWopbn1doH7f3jHXLi4i/sTQoGVSyDZM2f/ACIK0v8Ahtv4 i6dawX17oPhw2cyCRBH5ocrxyB5pz15HGK+LdCvzpusQz5wobB9x0NfQ3wr8Mab440/V9Pldhf2J 82Fd3BhfqAPZif8AvoVgp1JTtc35Ycidtj7a/Z6+PVv8bPC91dTwQ6fq9jP5NzaxMWXBGUdc84YZ /FTXqhYGvzb+A3iab4QfGCO1u5TDaXEv9mXYbgYY5hkP0OBn0Y1+imn3QuIVOeCK76U3OOu5zTjy yaLrHFRtinnGKYcVsQRtTGxUpAzUTdaAPZoOfhVoX/XT+slYDHtXQW//ACSrQ8f89P6yVz5Ga5KW z9WVPdEbVE1SuCBUTCughFa4fZGxPavxG+OHiAeKPi34t1QElLnUp5Fzxhd5wPyr9pPGOppo3hjV 9QcgJa2ksxJ6YVCf6V+FmtTm41W7lJyXlZifqTXJiX7qRvFGxZARfD7WpCGBluYURwRg7Q2Qe5+8 D+VcrpOk3WovM1tGZTAnmMB1xmujuGkX4fwIwcRyX8pU5+UkJHnj16V63+yF4Qi8Qaxr008QliSK OLDDI+YnP8q5uXnnGHl/wRQ0Un5nH/BTx9qXgnxfphtUe6jmuFQ2ZcqpkYFFk9mQtuH0x0Jr7d0K 7ttYsJNJi1pIYJx52sa0rBoZmkXzIkbIzG3mDbn3zzzXiHxQ/Zoh0rVrXXrBp7bTYHaa9W0A81VV SQyA8E5xweora8J+K10eznEcQ0nwrbsZTZTAyPqe0lwGH3iGUo6liVwzAH19vA4iWElyTenTy87e V7276nPWgqiuj6Jv5YPFWg3bTGPRvCccZvdN0ycoj3FwJEiliQjkglWH0cnZWW/w207x34+1Pxba m48G2Oo2U9xYSWF2kDXEkLLGIipGxyTlipXJ54HfG8DfEvSvEmr3eq63E9omi3EOp2/hS5nLlbaU szvESD5kYOxgAuAV5CnArstX0q61HT5v+EluhZDTjZz6ToqTCNpI7iYyyxoFzgcBe+APu8Cvo2qV enok09F1te2ke8vhcpO1rvQ868oS/P8AzflvZeR8f+Ov2cfFF++teItJtrZVs+L2G0VrdmLj5iqE YwTwVHBPRRXiWqaPfac8kF5ZvaZcDZPGfKb5+Qh6xDnnDYPOT0r9H9Y1TUPFl2VsZk8MeBfEGrFb izu3EdqfLjB3SSYGMmMtwoz0J615v4g1SxvNG1LwPptoZZL3W2+ya7Ghks5EhkCsLe2AJkD5Ughs Nx0xXh4nKaVRylS92Wjte6itnzPTVPp5nrYbMatOKhUXNH7rvy8v8j4WvpGS3ngfzCGjKRtIqzLh G4WFxkKMA5PsRnmoZjOfMvIbaW2tIZ4pFks7gusLMcg8n5nO09cdK+s/Enwr+H7eBdT2web4vgvm tIbTTpXTU7mPcd0ksIAjRFOBkYxgA88141q/whgl0eTUZb/+z50QefFLbH7PagPsH76PCls9yvU8 Zrw6uX1qd5RaaTtfv9/c9WnjqM1Zpq/Q84ttcvtOSCFtVv7Ym5WWWC4j3ooOzMkhzyCR93HQe9Vn 1+6jgCpqdlLi4HytbbC2QOvy8J7fWuph+GGvXFnc6zoc6XWmtKxj8q7QyPsIy3lttZhkj+EVzGpa JqNpDNuhu2EEgLGaxH3sD5WPYdODXA41aekk/wATqn7GouaEvy8/P9P+DKnia4j03V1EmksXnXbm 3RpN3zf6r5ThMde33e9VZ9dnhnuVdrN2CmI+XEpRiDjMZAxn3+lZ9xAWsbiQtCrNcKfmhKvyG6cf d/8ArVJqDLPNqs7TaapWYKscEbICMt/qlAxt4784IpNtrc5r8r2Rbl1uUYZWsCXi2/LEAvBHUFfv c9aifVprUQKLiwlOzJ2Qg7eOhyvJqlqmqLqFzJN5dlAGCr5VrBsTAxwBjjpknvn8KnnvFafH2m1/ dxhVZLULzke3t161jJOzdzvo1KcpJWS+7y9C9Bq0riBTcoihCf3SYOfQ8DpnrzQbq4kSNJ5pmVIy 6rg/JnHI68dMDiqsNyZBHi5Yv5XyiNAM9ODz0/wq1Bpl5qItooIJZzPmKFUOWLjGQv5j86hRlLY7 HWhFrX9O3Z/1+VMzMsDrtLMyrhy3X1K4PtzwaDqDR28qAxtGzBSxwzHBB4Y8j6AivXrX9lzxZeW7 S3jadpkJPmPvmZmUAHoFz/OvIW0Wd7u3hgG2OWXylaX90S/A5BPAG4c1p7Kcd0cU68ejuRrMrEOm F3MzLxkkj1zW/wCFfDeq+Jr6K30vT7vUCzRxlIFYgA5PJHQfWtzStLtPhh8UrOx1+xttY0zep3XU e5XRv4gCcE9RzxkV95+ETp8dhbnTIYYbN0VoxAgRduOMAe1dNLDe0bUnaxzvGKFnFXMf4OeDLzwV 8OtK0zUI0j1BVeS4VCCA7MWxkdSAQPwrxb9rn4QG9tF8ZabB++gAjvkQdU7P+HQ+30r6tjTzFzVe /wBJt9TsZ7O6iWa3nQxyRuMhlIwQa9eVNShyHjcz5uY/KUDv3qU/ON/fo3+Ndx8avhvL8MPH1/pJ VvsbHzrSQ/xRN0/Ecg/SuJjBjIJGVYYI9q8izi7M23Ox+FHjWXwB480bXIiQttOPNUfxRnhx/wB8 k1+sfhfV49S0+CaFxJHIgdXU5BBGQa/HBUMMm0/UH1HrX6J/scfEQ+KfhpaWc8u680pvsbgnkoBm M/8AfJx/wE134eW8Tnmup9OA5paghlDKDU4bNdhAoHHWvYPgD9zXPrD/AOz147nt0r2D9n8/u9c+ sP8A7PXNiP4TNIfEfNaNVqM9Kz4myeatxt0rsMS8hqZSBVVGqdOaQFgPgZrxH4tHVvHh1TT7LxPe +GLDT3khZbBCJbx1tvPb94B8qqGQHH98k8Dj2iZtsRrxvQdYlhvvH6qscxTVppEjn37TjSlDYKg4 4IJ/3RnpgzLou4d2eLar+yHodj9on1DxPey3Ch3kZs87YElYlmj6hn2n8+QRWjY/sp+FdFnuLy38 SSXLRC4SOO6jQrKFEWMgp8uRK4PXBUD+LNeNeEPjRqHhm71vT9ahbxNoWp/JcWd7M5YbchWRzkoQ OPoB6DHM+KPEEN1qLS6Fe6xBZSA5t7y5LmMnGQGB+YEAdQOg9K47xtdLU21vufU2q/sjaTeD+yP7 bltLK3kkcPFYgElbpYMkKvoxPX7w2dcGq8X7DmlRTwfZvF1xHO80aKTbSKVZrl4eyE7hszjAySQO VNfLEHiLX03FNa1FBIuGAu5BkZBwfm9QD9QDVqHxV4o3qU17VV8rBUpeSfL8xbI54+Yk/Uk0rp9A 1XU+5PD8XiL4C6ZbX2s+M7jxHpLtp6HTb9N0qLcuy70lJydmAcdGGcAYJHzB+1ha3fi748eKLKO8 igs3vLG1cOcvuFsWGBxkAFs8jnFfQuoQXL/s4+ERJE9x5yaM8zu0wC7ryRQ53ZDMcAZPUHjCqN3z p8Sr23vPjz4hnmhWZrnWZ4QxTLIIrZQCpzwS2AD04PvTnrFLvb9SW7Xfa/6Hm3hjxLoVpe6fpFxP fabezXz2eqeJkuGLTaeyhDH5Z3YAAHPOAPy7Twvoel+HPi7YweGtYuNL8PWs8z6X4rFi8pvJfLUi F2OEdAykdB1PPQ1yfxJ8SSWmheCZLO7mXUra33BkYYt32JuVs5O/BU9sbvcY3te+NWrSfCzRvh/q XhKMHTxFJNcCY7nt45BxtUZjJKgFs/hyK4tE7G6vYv8AiL4leNfE3iI69JezW+pwvEZZdOdo4Imj +RNq5x2zxnPXpivb/hZ+2vr3h147PxraPrliMA39pGEuY/dlGFcfkfrR8Pv2fNcuPDcm2x0/TYbj z5rYC9aZUSWFVjXcFJYLjBPcHjHObl54LuP+EyufDpiBuJpXWO4wojy08UwzwT9xCDwecDp074Qq W5j6ShluWVaalUxii7arl2fbc+o/Anxq8GfEOJDouvW08zDP2WVvKmH/AABsH8hiu9GCua+D7rUr zQtau9DvUW2m0y4ii2fujuObi4RwSBlcMv1Pp0H2h4O1KW68EaLd3GPtElhDI+P7xjBP61un0OXN cqpZfSpVqNX2kal7aW2t5vuaN/d29lC81xNHBEgyzyNtUD3JrxL4gftT+F/C4lt9FceItRXj/R2x Ah95MYP/AAHP4V4rc+L4vHMHiePVdQbXdDvb6F9X1WZGd/CQW8kEcUEZGZPNVMEKDxjtzVDw9pV1 q2lnxTYeDLe/uDA2hLosaKIfJFvsGoFuonMhLYPPAOOlZc99Ej5+3c4Lxr8Vtb8SeLLrX9QggRJb fy0BjdoF2yRsFwxI/hyf92vUfgt+15feE9D03SfEGm/2tpUI2JqFm/78KSSMqTh8ZxwRwO9Ry+AZ 7aO70pdEl1Ow8NO95pEtxa4/4SF3micw3K5/dqqiRQeOOM81LpHwcuL6Cz0abQprHTdZK6jqGpwx xrNo8wE5+yQKW+aIs8QzjoB/dFZpSi27DbTVj6w8EfFnwp4/hRtF1q2uZSMm1Ztk6/WNsMPyxXaA ZAIr4N1rwn9jml1G/wDCdtZ65eafOLjRYCpi02yitkWTUI3UtmVSruE655xzivbPgr8X7fTPgV4r 1+XUrvXtK8OXl3FZXd4MT3NuiK8e73O/A9Bgdq2jO+jIa7H0LJIEXLEAe9eGftAftAeCPB/hbVdL udbhm1eWFkjs7T97IG/2scL+OK+T/EPxk8Z/Fa38y91K/jt7lQy6baTtFG2Y5pdgC/eJAjCg5PI6 5OPO7rwLpPniOW6SadZPKZ4b1XV33wRjqMjczTEdTjaf4WNetLLsRKN42189T044CrZSTR7V8FP2 jNE0Jp7NPEWpaHp1nMuozFtPidJYt0cUkexDwDlDwMjDHnPH3B4Q8baD490aLVdA1S21Wwk4E1u+ 7B9COqn2ODX5aan4VtNR0m5a3thbIYVIliWNW2BDIAQCM5Cxknnqx7c2vCdv4n+EOsS6h4U8U3Nn cxlhJGkR2ShWnGHQ5Vh+4J5Bxk+hrOOW4yG8NPVf5jll2Ieqj+KP1cJH0FcL8RvjR4R+F1m02u6v BBNtylojb55Pog5/E8e9fLWo/tb+LNZ8DW2j3cFnaa7eX8Vq9/YytFmAuUcgHlXOBgqTwWIAwM+F XtnosiDU9YaVZbkFklulmkaR/JDdSTu+Yrz/ALY7ZxtHL60leTUf8WhEMDUavO0fXQ9a+LH7Zup/ EC1uLHw/on2PTYWEn2ics8pwcAnbgKCSB1PXrWz4J/a/uvC1vpo1XREuJJ4FF+sbmN4ZFZlwgORt ChTtPcnnpjwm213w3pwvEtgipIkkZCQS4kBE+3OTggHyDz7ejU+PXvC9hvCxxXMbOwWNrZ/kXdNg jPbBiHXIwO4JprL1u68PvNPqSa1qx+8/QDwJ8fPBnxBSNdN1iGK8f/lyu2EUwPoFP3v+Ak16GXDD g8V+YNlr3h/UtVigt7S3813+VDbFVbBU4zkHkb+OOnHJG37l/Zt8R3fiD4ZWjXUplNvIbeN2JJZA ikZJ68sfTjGABwIr4P2NP2impK9tDlrYf2UebmT6aHrGaRm7ZqLeRTXeuBM5DX8Kt/xVejD/AKfY f/QxXo/xWOPEFv8A9eq/+hvXmfhFt3i3Rf8Ar9h/9DFelfFc/wDFQW/p9lX/ANCeuaX8aPoV9hnF HFMORT6buFdRiNLc+lLwwx1FIybqnW0lVAxjYIejFTilcZlah4dstVjaO4gSZG6pIoIP4GvNvHHw Si1WA/2PJFpE23aJYbeNjtxjHIPGK9Y8fahZ/DmHw02oXUTSa3frYogYAx7o3cPz1GUVf+BCrfxo i/4VJ8Ktb8XnGpSaZEkrWg/dqVMiqx3c4ADE9O1YupT2ZXLJanwFrv7AEbMzxXzu3ptAFebeIv2J df0re1m7sBz8pIr07VP+CiOrxR6gsXhvSlks5sb3ecrMhOAMbRsbjBySMkYrB1D9vPxdfahcW0Wk afCstobhFTT5Glg/d7hgNIBIM98DIHGKj9z0NE6iPDdT+Dvj7wo5MUl5FtYNuQnOR0ORzUC/EX4l eHPMjmne5XzROonjzskGRuHvyf8A9dejXX7WnjjXJdInmitI7a7kNtMkGnR7NwIGQzElX5Bw3GT7 VwHiP4peKtW0q+a5eR57K5VGnNlbwlVYH/WRhTkcHBHHTnnnanjK1DWjVkvmdlLFYij8EmvRjpvj ouoiZfEPhS0l+cXEckEOx1lDKTgrjAbGGHofUVo6X8UPCtxdu9je6p4cvXK3MUouPMS3lCjeuXBY qx3HjHYdq4LXhPNq+tJPGkSpH50ULXoC5LAZRhjOM52kjp3rCvfDtrfvpsS3VtG1xbku8bSySLIB n5155JGAF9enFd8c8xkHeVpeq1+9Wf8AwyPQjmldPmlZvzSv167/ANLse5Wuo6ddJHcaZrWm6hbB JJrC21KBopc7WEtuCNzY2quOQCX45zV230K+s9Qjgj0S+VSGvIU06bzjPbvlJICAW3AMVHzY+VeQ a8V+Gvwe17x7qWn2/h/UEa6uJim4v5SxIDgsZGKqDyMLnJyK+qfh98BbvwvaXljon9oa9440a8VN QhvoontIgoLM0KkkSYJKlRuJy2MZwfcwmZvEpOdJrzvdf+TJv7mefjeJ8HglatH3uiT/ADum0YFh 8OZr+LT7/wAQXcel6XfPstrrxFp7RtdxsMqqsgb96pJ+f0284GK6HSdXstPuZESGbTgiTS3ukz3T tcX0aqPmiEqlQ2GUgMSQVJX0rettLi+3S61o0reK/DUzPd6rNJaui6MfmUqgbdtCnkOrAEAbuM1L aSyaxfwRaFrVrqurQ2obT/HFzeNbXSlpGJh2Sd8biAcH5l+f+Gt51HN3/r8dfv08j8nzTPsVmjft NIdley9d27dVe63TRmXmi6atmst41xY+E7028VmLMQXmqwyjcwWVEZWCk5znAIUEDIArL17VLXQU bUL2ay0TUIIHuZor4Ok19BLhMuwI3Z3EnnLKQeSM1x/xQ+NmjeCLyefT0bVNeuZJ4NVttVtI/PEg jEYkEiqNmTubPDblyc5JrxvwrL4g+IMt3fXRXUY9Js2+yQyXXlrCVywEYLDcVyT1J4H0rj9rzVfY U/ek/nbr0u/z+RtlWRYnM5RduWP597L/AC0e92zpPFfxXvPE9jBp/hK1jtNNivYkhupiokglIP3S MHZ05bjKg4BJrzvxB8MtchnuLxr+x1yNohcG6tJjIrgk5AyAdwIOVAz7YBr0/Q7DTfDmk2llqc2q aZbTuk98L203QX8LHO+NVw7FX2cbuQM8c1rXMMF/FLKkWmTzyXQhW1tJGhUxb8R3fkLgHPGcnkKM jvVSy1YmFsQ3zabaW76at/NX8z9bwWRYbA0uSEfe016935/gv8/BG0ubS3mSSKdT5QuYHNvs8wAj 5sE8rjd+nFWY43kV1S2lYT2fnqnmjl14L/o2FPr0r2bWbCwt9T1eO7N1aiydUubqS23ojv3RIyqh GG3IJOQBjdnFMl8BaXcXNl5tlYiS0XAtBONwJJwkzMUURtkYJJII255AryJ5HNNqE1fs9/u1f4Gs sBO9k9f66b/geQCKHUBal4ooXvIW3SzXDYDr1dhjIJ2t3I57U6wvzbyac7zQxxTwtZ3BSHcY4yxG W7MTlvwFdTffD6a3t7a2gjS3E148izuuRCwA/cmVgqZAzwGIJ9OKseHvhfqHiyS7W58TaPoenXdx 5xlu1lRJHBIwuEK5BJGAfxNeVPAYmnKzhr/XzOKVCpHdHGaZvs1F3JNeM+nyeU8UUZAjiY4PzE/J u3NgYPJzxWn/AGdb28mqW72Km7hdLuG4v7lVYocZGfuP94HGfzNfTXg/9iew8X7bi7+K1nqK3agN HpYQ7wD05c9COmODXrWh/wDBPj4eWO1tQudT1hxgZuLnaPyUCsXh6sdJK3qc0ny7nwm3ibT7dp0a 7CWeoR+dJb6ZDh4JccL83HdhwfQ+1T+D9OuviVr1p4ftNPWGa8Rlmv5SxLMoZw7dgOADgZPNfpRo n7Jfw00FV+zeGbQlf4pV3n8zms7X9F+D2la7J4bvNT0fQ9YiC7rdrhbWQBgCBnIzkEcA0OjLqyOd dj49g/Y/ugFkvfE1lb46mOAv/NhXUaf8DLbRDG9t49+x3aJ5bT2qiJ2XjgkSZxwK+o7X9nHwLdql zDp9vqUbcrM8hmDfQknNbth8FfC+nY8nQ7GMjuIF/wAKr2F9WUqltj49/wCFCWeoXVzPceNpdRmn XbvmQSMMdOd/Jr7Q+G094nhvT4L2c3dzFAiSXJTZ5rAYLY5xnrWlZ+DbCzGIrWKMDsqAVtWunpbg bVA9q2p0lDYzlPm3LanIFNY0/bimkZrYgYTUbLmpSKjJNAHs1v8A8kq0P/rp/WSueY4GK6K3/wCS V6H/ANdP6vXPtXJS2fqyp7ohb3qNqlfrUZ5PFbolI80/aIvTp/wT8ayg4P8AZc6Aj/aQr/WvxPvB ++kbOck1+0/7S1t9q+CHjOMZ402V8DvtG7+lfizeLsnkXuGIrixO6Oq2htzrJJ4CsNwby1vZ9pOc Z2x59vTp7V9R/sI6YsujeIJ8ZY3aJ+SZ/rXzNpa/bfh/ex7WJtLwOCBwBInPP/bOvq79gECTQfEc XdbyNvzT/wCtRS/ixfl+hjH4JLz/AFPrn/hH4byyKSRqwI5BGc18vePvBbeCPHmxLK41q6mRpdOW TLQWUWVRHxu4MTOQTgqEZcjivsXTbfMeDzxXEfF7wJd+LfDUkGmXp0vVIpY5re8ThlKuGK56gMBg /hkHGK7pamSPkHx5o13pcmneJ5tbtX+IMl1HFBYwR4jCGJT5Tuq7ZFfJUYwOnTJr3n4WfFLSfiNr +n6/4kspr6/0pjBqGkXTASI4iMaq4YcqvVTjnB75x5ZZava+E3aDwZ4WkvtTXYraxrjD5Wt52MkE sj5Q4LJgsvGVUn5c1l+L/AerfDnUdY8QjXrFvHMGqmzGn26lTdKUWVkljQMJPvMu5TwVXpmpp1Z0 W5U3a6afo9wcI1LKS9D6Aht7nXLO7sPEHiSys/Buj202oW8F+USOOZ2clI1PLffwFyB8xwOmOBfx HLcW3hMeGodT8J6rodlNe3Wq8S3t2kqAK0CgARKm1h8+QA/fJrw/4p/FO68XWdvYj7PHKyeZ5EVy HjhcA7lbK4d+oHYduea848M/EfxN4L/te107Wr+zttRt2sr1Y5lZXgbAdMHr1HTHT0roebxUrSjd K1kvhvs7rrdb67nt0+HcROmp83K5d97brXp92x7peWVvolxZarb2Fhrs90JrjULOxun8xOVOb644 MZYAkKDkDOAM1zMMs2lKdW1PVpE8NTHZLZ31ox02FyMhIlJYzOpY/MR8pXJByCOr+DMUGseF7x7m xs0eW2NvapBH5UKPt+SZ1XBkYZJOTz3qxYfBXxE9tdR3mq2+riTmBJYwY7YbiSIozgJnuR6D0rtd aEo3i369WvJdLf1Y8SdGVKo6crXT6bX9Tzq8fUHmWCHSrF/Dd+uVurLykvmiZjKrKvPkZx3GQuee cVl2MNjoryeGrVdUsVuZmLzQ3Rlt4iwA8yRkX96R/dUD7uOproLnwH4tv7e403xH4Omi0/dvhGny JGS+MZkn2n5fmf5R1J56ZrlrcxySXPh4vqOlf2bERHfSRtKVKv8A6uOMZBLM3DEgck1g3G759e/+ fr8w16Gxotxo3w91C70WWbTfFN5qewQz6hpW8kEME2eZt8sZPJx6U7TfDWj6Dqus2vinQ9E1TVXV RaW1ncN5W5twXa0ZIJ3cbTjGBmsfSUl8QTR+FUntp9dhuWP27U0VHj2N/wAtZmJKrgHC+vGa6DTd Jj1eD/hH4F0298ax3myPU4rogQ7GziJidrKR/FyOeADzW0VGalzq99+/lK9nZd+pLurWe39WMXT/ AAjpXhyTVdJ8WaI41s2qNZWkMpyZXB8t2IbaoJYHkkjb90ZzXKHw5YpYarpcw2eJImWR2uYypiC/ M6s3TJGABz1524Od+a8j1C0newhmPie1v5JbrUd/mRRQR5XaM5BGSPmIxgVzus6tEmnWPiCy320k cywSq6Aec5BfzScY7DgkkkE9MCueqocz91L5W9LaKyatvr1ZonKy1/rzMS7ltorbTtQsozFLb4tn 8qBY8Bs/Ozj+MnI/XPYej/s/eFra81l9Uk8t/sM0qxpncVckYJzzwB+ua87kto9Vmv5rV3ntLuQM ZJQCxfIZ2Bxx827HsaTwjrOsfDfxG95p5DscCe1kJ2XKk8fRupBHSvOlrK8QVaMfi2PqX44eKT4b +FetXCMVmmh+zRleu6T5cj6Ak/hXyJ4ftQlgjTw3jfacyz/ulBNuGGNkjZwS2BwPxOcV9Iaj4r0b 40eBb/RY52sdRlj3C0nOyRJFIZSP7y5A5GePSvnq+0xbezubRrQReXM8booeWaCQbgsZYhQR8u7v jOe+K8/E3upHu4JRqNxRb8cXZ1zwrbpdSC4vdNbbb3ihiJY8DdGSQPmXI5xyAfx9x/Y/+J51TT5P C17MWubUGW13ADMefmXOeSCc9Oma8ejBto3hvUM0cZe0t7CWcqJ5tw3ylVwAPm9OMDOduao+HhP8 N/iBa6xpUpns7S88l5Qh2nBG4fMBxg+3UdKypYi80+pvi8tqYaPOleDtr2b7/mu61WjP0jsW3JVs R5rP8O3EeoWNvcxHdHMiyKfUEZFdAkAIr30fOyVj59/aw+FR8b+A31a0h36ro4adNo+Z4v41/IBv w96+DOgPrX65z2QmhdHUMjAgg9CK/Nn9oX4Zt8MviTqFlFGU026P2qzOOAjH7v8AwE5H5V5+JhZ8 6NIO6sebMPMQN0Kfyr339jnx4fDHxLGmSybbXWI/JIJ481csh/8AQh/wKvBIjz7d6vaBqk/h/XLS +tn2XFpOk0TZ6FSCP5Vz05cskxyV0fsTpdyJYl5rSVuK4D4b+J4PEvhzTdSt2zDdwJMvOcBgDj8K 7yI5Ar1jnJsZFewfs/j93rn1h/8AZ68ePy17F+z+cx639Yf/AGeubE/wmaQ+I+YkOKsRtgVUVqnV sYrsMS8j1ZR/eqKN0qxG1AEtw/7pvpXhegsrf8LDnkQiNdZuC0oJBG3TFAAwwJ5IOBz6ZNe3XJ/d N9K8EsBNNH42toZIIVm1K/eRiFZzttLYL3yOWGO55xjkiJdPUOj9P8jyv9nvw14E8TSajY65psF7 qhkMsMs8jDcvQqADjjr6817jF8Bfh5eqYm8O26kf3HdT+jV8IaH4nu9C1Vbu1maKeKTcrqcEHNfQ ngv9qi9tXhGtWouYBw0sPDj3x0NZ0akLWkipxe6PWNV/ZR8GXsTfYFudMm7NHKXX8Q2f51R8Efs8 w+BfBfj2TVobXUbmawmFpcbA3lqEfkAj5W+6c/hXbeCPi74d8bbBp2oK1wRzBKNjj8D1/Cur8Xai LTwH4kmY/KmnXDflG1dXJB6oxcpJNHm95p0MXwT8IqiqSYtERGSNADnUWJ53E55GeO/OAVFeS/tC /s421v4wbWNOvbuzvNRma6cx+ZIfMeaJCUCkbTiQ/XAAGSK9r1mxSx+Efgi3eKMuk3huMNFtG1jc Mxz8ob+Ikgn+JT82Tt0f2hYlnm0uEhVZlXDmMMVzc24OMkev/wCoc1xRipqzXQ+jybDwxOYU6NRX Tb0+TZ8L+A/gHrnxSh1e6S7kvn0y7+yuwuQW+78pG7OR8uPwr3Dwl+xjeNpk8+peK9U069uoXtJo 4GVw8BIJRj3BIzj6V0/7H4hig8bwONtwdYYlTjAALD0FfRTqYjk4wP5UUaMJQTktTysVenWnCOyb KngjQLX4e+B9K0ZLh5rfTLRYBPIAC4UcsQK898GJ/wAJR48utXyQkEjynPbPCj/PpU/xR8blYBo9 lIBI/wDr3B6D+7Wj8KdPOn+FpLqTAlu5C2f9leB+ufzrtSSVkcV7u55F4nb+0vix43dWbzbe8sgq jcflFhKW4APqefrjHJr7H8Pw/Z/C2nQ4xss40/JAK+JLq8nm8eeP5Yow4OsGMnaSQq6fIp53AcZz j257A/dUMPlWCIuAFjA/SuZO/wB7/M+1zfTK8BH+7J/kfCkwsnfRrHxJbss51XytJXRl3Q3FudSk E328jlXGF2ZP3Qf9mvWvBWjR+F/iw9hZyMlk0LSrHnggr0Prg5/KvHZJDp2pyR6cZPDkVz4gH26K 9/e/24RqbBZLfJHliM/K23OS/OT09409Vb4qJIAMppeWI7Hfj+RpUloz5BvU9IursITjGfpWZPe9 T0BqK7mA43ZqhLcAZBP4+tdKSMrnzx8YZo5/jAJdSt9RvBDA32OKx3EeaEUx+btI/db+XzxjOfUd TrF/qCfsvfF2fVNQ07UtRm1iZZrrSNv2V2ZbcER7eMDO3j0rE+Mt4bP4m6XJFr6eGxPZyxzXjR79 6FGDRgergbfxpfGqNon7Jnj+1Ph0eFGfXoY00cOJPJBFsQMjglhhuP71cbXvtG8dWib9la2tpNcu L5IBHJDZxRlSAdrCC1Ayc9cbh0zy2ecgeX/tjWltYfE6W0soEs7Sa3jupYIBtSSY7syEDjceea9r /Znto7ODxPOAAJLgkHBAB86ZCOVB6RJ/9bkV41+2QVPxNgmZchtPjA5xzuevbzezqu3l+R2Y5/7X JdkvyR87SwqqlhwPTNVhczwE+VPLFnIykhHBBHY+hI/E1YlYgN8tUZG+b1FfNc0ou8XYxjJp6M9c sJp2g8Mrc3Mk0Vxqdktw7EuDgOxyc4OWkYkHHr3JPqfiPw9BrP7N6amkCxXWlapG7DAwqS28IYDB PGQnU59hXnmk6ctxomhXEyvb/Z9csYsMhygYHPT5jkp2PY85JNe26eDefs7+NbZwzBUgdWbd8wSC 3w3zcj7n+FfcYu8sLNPo4/8ApKZ7OKlfDu/RxX4HypI/l9OnpVd5wvPUVDcy7SeCKpvOSefyr43m PBsb/ha4z4jsW5+V88Y9Dxz/AIH6Hof0Y/ZdUj4YQuxzvuXwfUAKB+g9/qep/NbwxO0evWzDqu5h np90+3+fbrX6Wfsvnd8JdOfrvmnPTH/LQj+lepTnfCOP979DaWlG3n+h6y3eo2PSpGqCZFk2lhna cj61zHMa/g//AJG7Rf8Ar9h/9DFenfFYZ8QW/wD16r/6G9eX+Ef+Rv0PH/P9B/6MFeofFc48QW// AF6r/wChvXNL+NH0L+wziHHFRpHsz71Ifek/CusxNLQbaC9vTBMzoZI2WNoxkhscH+fNcT4Q+Kvi C5s3htbTTbHR7MFpZb7zZDCmeTJJvwSecADntmustNcm8PF7uGBbiQKRsY4B/HtXkHjLxTL40vP7 LubT7JpUbFv7OtI/LiYnqWx97/659TXNUTbNYbHF/tN/CU6L8OdL8TT+Jba8uTrMl5bbQ3mNb3Uu /czFslVCxgfLxzycjH0z8e43vv2Q/F4mmNxN/wAItJKZX6uywb9xz3yM818sfEKz0PVNahm1axuj JaxLFHbWSSsGUBeW2gkhioJX7vtxWd8Zf2sPHcngi7+H2neG9Nh0a60cabLrus6gFlmSSHY58kfP uGSDheCK45QaabNb3i0j4Tvo1fWtdjaTUJS1t5kpigVXDb1IJGRuByeeOvTiq9tNLe3fhhpIr24Z 4/K8tpdkTDLKAjg/LwACPboamtfhb8RNSvbhrGO+vBIDCbpC4WVAcjBbB2nGeQPpW/p37JvxL1dY gbRolX7gklwF+gFO0nsmGi3ZwlxZP/Yl00dpLFJa32PMmu/miyucFdoz0OWwOcUskBW78SQPaWQJ RZFiubrBjww/1bnGTz0J5AI56H2bSf2CPHN+oW4vre2QnOMk11Fz/wAE/n0TSJtV17xHKtrEQZpY LZmWMd2dudqjqSauNGpN2UfyMalanSi5TlZHzhavH/bOmSRz6ejXVkIWRIzN8/llQHj5yScdAck9 D39q+GnwMv5/DcHiHxFPHb2fhwtdSaHGFt9UmjaQCNkEiZCMzHIPOMfLyDXpPw/+B3hL4eaiw0wW upXt7ZxXGieN5b6SGKxuJGUIpXBUnB/uHBPUYOPTNF1i88R68sljfeR8UNMng0z+1tVkiez1GNRg qjBctkqVz0YdTkivdw2W8vvVvu/z/r7z4PMuIZS/d4Pbv/l1/VeRTv7fSdF8P2+n3a36/C7VLuGG 3jtvIl1C2udu8mYqDtJ3EkDBII5zwXXOn3NvJ4dtdas3trmV7htCuPClqrTXKhdoiuRE53DohHUF m5I3VBZ6xP4b0+48YeErK+02GK/uJPEq30MU9nLGQF3RKnOwsSAMEAqoz8przzxB8QbHwzZap4X0 GystXklghu7TXrSV4JrCaU+ZIrP1xg4MYJ55wOce1KcaMby0X9f138j5KlRq4uooU05N38/ve3VX 6NbnY+J/EOkaEun+JPER0rRr3SYRYaz4U0iaXTHlMsnzSFcKCduAVHORzkEGvmL4x/tCar41t5/D ehM7eG7W/a40uS4iAmtogCFSPuo5JPcnHAxWxrfhvVPH+tTahq9/cavqVy4eW4lPBbAGQPoOpyfe u28Ffs/Q70lmh3H3FfPYjF1avuUtEfoeX5HSw9qmJ96f4L/M+QNQ8Ma1HE99c28zROdz3BBbk92P 9at6Po+tR2n2+2l8iJCwRiWG9gBlVwOT8w496/Szw78IdOitBDJZxvGwwysuQRXB+Nv2Pzp162v+ BY4Fu4wznRrs/uGYj70R/gfIBAOVOB0FeS6FSm1OnLU+0w1WlGdqq08uh8caT8TfGfha8huJZ547 oZljFwheR1Y4cKWBwGxz0ziuhtvjZpR3Q614QtEuIJFH+h7raSXClXjmZcEgk5PfjFdjcaXpZ07U NI1vSbvTfFNvj7Zf3xUyhBwU8pzgjCrtKnvwexNZ+HGiMtvaXESWWm/al+z31vb5kvPlGNx6oD97 GNwDgkHiu2lmuOprljU5l2dna+lnfbb07Nn3dLLq84c2FrKcfv3732ei8vMz9J8a+GrqB7Ox1yfS YpsXDWt2qvbeXnYbd5ABIcR4/i5xgYODXQW1o2tJq5XUNC8To9skcPmsLJ7+FMPtEW3mVAQPvgjA 5Jrirn4JWJs44Z3mj126DJYWFuUMWAeskw4yMnP0wSKwpfhF4j07WRZW2oKJIVjmM/mkRI7AFSJP u9x8wOPevWhn9SyValv2btrd2ad1fytt6mU8JjaKXPSun2767ra+vY9RttGu9L1CKzvNG1uK1t7O RmWeIzCSMABXCoJFUrk8ngA9jzTFa3vobFLaa0uLhWWQXFyVW6eNWwske0MYmAwWUjn5j8x6cNp+ m/FTwfbr/Z9zqEUKyCXdbyE5Izxnnjk5HQ9watat8Y/FMscVprXhyyvLG0YG0tLizUpBhcEE4ywP JIPUnPYV6UM1wklaV4+q8v7rS79PzPG+sUL8rbi/NfLpbz6fmdc2mvZ2Wo3IzJOJP3klpdgkqORM HJDHggMirkYPCk8aL614l0GDUf7D1PVLBIo0umjtbiaONQQR5sSJt38qRhsgbeTk15xL8XfD87pE 3hEaYu9ZhcWtxIrQSbsnZHu24I4A4xmtmH4reEdRluJDBq2kPdspUW1150ls6q2D5snJUkg4yP4v aun2+DqrkhVj+XX/AArt3/4Gj9hP3YzX5df8K7d/+B6jpfx88fW2pi1j8W3kskkKzP8AaCsgA258 w4DbE6ZULuGQBnmvnP4xeJtU8TfEXU9T1K6S9vZSm+5gcsj4QDKk849sDHTA6V6lpvirSLjULK4t fElvDb28MkUsd9YK0UMoAw0Ue4eYrZI59MkE4rxvxxG1x4l1KZDbnMzE/ZF2R9eSq9h6V5GbQgsP Fxtv0t29X+n+Xn4ynCnSVrXv0t29X+S/yZ4V+JHijwXd+foevahpcmcn7LcNGG+oBwfxr6l+E37X PxZ/skXt5aWHi7TYnMcgmAguBgA8OoC9x1DGvjwRgHdnB6Yr6f8Agd4JvdS+FJvIbzyI3llZoWQF WwcZ5Ht+lfKU3K9os8ZpPc+u/hJ+1J4W+KmoDSfs93o2ug7HsrpNw391Dj05+8FPHSvZzgGvz8/Z l0abQ7qx1kuZrq9u2uCzZ4wSB+PU596+69H1OS9t0aQAE+lehTk5LUxkrM2M8UhoDZFNNakDGPXP GKYRnBpZFDqVYZU9RQFCABRgCmM9lt/+SV6H/wBdP6vWAeK34P8Aklmh/wDXT+r1z7muOls/Vlz6 ELim9AaeeTTGPBrYSOW8e6KviPwpq2lv928tZICc4+8pH9a/EnxzoE3h7xLqFjMpEkMzqcjGcEjN fuhepuiavz6/bG/ZxubvW7jxHo9oGiuW3S+UOQ/uPx49fwrnxC9256FOjKsuWCu+39dT5v8AhL4W g1/4feK5XVvNhkiVXBUBQVduc9clAoA5JYV7X+wVe/Ydf8XaY3pBKPwLg/zFcd+z5Y2Phqx8b+GP F1zFoZ1S1jFtLfYRfMXcVYbuOG2EGr/7NfiCx8DfFK+u766it7K6sHWR1beFcOpA+XOeA3T29acU uSnO+10/xPKhzRrVKUl5r7j9GdMIaJanvbUSRnIyCK8Nv/2ntD0mzc6Vpeoa1KmBvMf2aEE9Ms/z Y75CmvIfiP8AtJeKPEofTVuBpxmYCG00ssqSL3DzcOTwR8uwYPINayqxir3PewmS47F+9Gm1Hu9F /wAH5HRftHaxaafqMMOl619jTyprPVLbT/kLCQggvKoIRgwGchmxjjjNfL0t0iXT3a3kb3aSM0uq OZYZLhFTHBCnkkdTz07VPrFzNfXha4iN3ciRml02CFxFGADg5RsdgTjsM1miO6lmjilvVlvVi/0U Q3u2NDnO1twwQAeeeR34NeTVqyqS12/r+rH32X5Ph8vabXNPvb8l/wAO79jPmT7db+YJGXTZPLVl +2K0iux+9gjPUdMfjWTcRmxdGnWRY/NCAOgYFzkKWPuK6O8v7eTF/qVxdizlOy7nESXCw7RgBAOp ySATgdOR1r0PTtJXWU8R+ENC8Kzs00aX+n3mv3rRSNAGDtGEiPls0kZwQcbeeemFCnzSv0OPNsxh hIuFN3m/w8/8kdn8JW8nQLVQAu4b9o7A8j+leyaTMcLzXzzFOfgz4K8La3e35vrPVomMlg8RRrco SH8mVmIkVcAYJzzwe1ezeC/FumeKbJbnTbpLhRjen3ZIyR0ZTyp+te1Gopep+a2sj0W1uioHNTXA huU3PFG7L0ZlBIrHhnwB2q0l18uDViOQ1LwdoMepSXY0TTxcyEl5hbIHbJycnGTzXzX4+8M3vhbx /eQWTmM6lJ59kUj3b0LKZInIGdg+bAGfujjoa+rdWO5SR1rzvx94aTxbok9p5htrgoQk6KC6gkEq DxgNgA81lUi5x0Z6+V16dDEJVV7r0fl5nzdbaLa+KIzaQL9khv2S3hUL5aKq7Q8srHG7POMnOfTO KrfGTx3d6x8P9H8NXkcslxY3h8q9MRRbqFVZEf2bnBHrz3rqNH8PzLdXNhc2j6dqNwmGtZ7UuqRB NzTJzuUtgYIAAwOa1dc0PT/EHhgLfWywWcqm20cG1mDxMs3Lk9DgPknJzk9elebeck79nf8AD7v+ CkfpGMySGOoXgrTV2trej2t+mi7X4v4d+GopvCdqVBJb5/mHrWr4s+H0l7pqXdqh+0QAkhRlmTvg dyP8a3/CNtJouoN4f1JDb36O6QyMjJHdBTglMgcjuvUfSvVbXQSluDt5HNerRS5Vbofi+Lw9SjWn Qrx5Xs12Pl/SdJhnKw3c0doxOIpJt4jiYAkLGVyRIemcYBPPGabrGg6i+pW9xfySrLcHY8eouQhj VXViZBsErYbjB56EnNexeNvhwIXfVNLQrk5lgRAxTjHyL0we/cduOK42KH7C63Ekn2aAQzSM8ZM9 mu5dvzHcDuJbPsSOOOe6WGpYqnZ7/l/X3Hz1LHYrKMTGVrpa26SXl29Vqnrp14rT5J5YI00+O5he 8LW+mRrHHC1vEyMrysw5wcEZLdAxOeKtWZsZ1EduYbvSNPUqjsHd7u4kjPVVxu+dc9e6jJFbV74c upPtb6VbRQ6sNPs5Zb+FwY4ocKGfLgFNwIyAOzDp1xriW3sFmUrJHp+mK0SyJfiHzriKTcHKqCdx yeM554OBx8NiaFTDVOWf3/193rv3P6GyjG4TM8J7Wi1K+jTT0evuuzsr25pLpBLkerie2/A745Se E7ex0PX0urjSI7aJl1FrZkaz3A4SRecoNrYYc4HcdPrLTry31GzhurWaO5t5kDxyxMGV1PIII6iv zK1dbVYJJJmsEv13us0Uss/nIzgoB0GSGx6YHIBzXqPwl+Nes/Dme2s7cy3n2yVJDpckJhtCjgYa Nm5jYk5yPkPUjuPUw2MbXLUPj80yiNKTlhndb2vrtfy6a2tpdLfQ+8NmRXzt+2j8Ol8SfDpddgi3 XujSeYWUcmFsBx+HB/A11/h79qPwDrkSh9TlsLvZvktp7WQmP1yyqVI9wau+JPi78OPFHh3UNNn8 V6U0F5bvCyvcBchlIPWvUk41ItX3PlNYSs90fmegwetPuAEWCTPJJU/p/jVy7042t/cxIRNDC7AS qflYAn5s9MVn6lOnnRxI4cpksV6ZOOAe/SvKs1qzZtXsfen7F3jNtV+Hf9myvul0y4aIZ6+W3zL+ pYfhX1XZTCSNa/Pj9iTXTa+K9Z04tgXFqs+PdGx/7PX3ro1xuRea9Wm+aCZg9Gb4GB7V7D8ABiPX PrD/AOz143bbgpDOXOcgn09K9m+AQwmt/WH/ANnrLE/wmVD4j5aQ5qaM9KqoasRkDvXYYluNhVhG xVNDVhD70DHztmJq+cLqHyNQ8XyAIDJeX0e87eht7UkHJGcruGM+vI5z9GzH9230r571W3fZ49lm nP2ZL24CR+ZgKTa2u48qVAOVBLceo6VEunqLa/ofDNvc7p5ATjDH+daVvfvGCFbrWno2n2t15VwQ FnXncACG5wQQRg1r6z4RtLxTdaUrW8vV7Vzlc/7B6j6H8686MJWujouupkaXrt1plzHPbTPDKh3K 6Ngg19Y+DfjGfHfwS8VQahKp1Wy06aOQ9PMUoQrfXsf/AK9fHbo9q5jmVkYdVYYrU0TxFdaRHex2 0hRbqFoJQOjIcHH5gVrTqOmxSipI+9/EmoXN18NPAo8yVUbVfDkcqBztODuGQR9MAdMHHGai/aev BbXuhI6s8THLhEBYBZYmyCenK/T1qHWtUnufA3gTezFLjU/Df34pU3YG4kZYjqOuOfbij9pp0bXP D4nuVhtkDPJG7EKw3LycegzyOeemMkbR+H5I97IHbM6T83/6Szxv9lTVzY6/qAcsi3d7cqQ2Qchy RnPOeO9e2fEn4ljRzJp1gwa6CZklPSPPYepr5e+EuptpET3dtgNHf3DpngcStgYyfyya6K/1ObUL +SaaRnlkfe5J6k81dGVqaPDxKvXm/Nm7ZXNzq9+o3M0kjYJPJJJr6Nsimm6HbWy42QxKn1wK8E+H 1tAdUW6lbEcGCCT1btXqepeJoDbGKFmdscEDGK6Ucj8jxvw3qZh8b+LbiOQLLJrl71CHIW22Y+bJ P3+nsfqPvRf9R/wH1r8/fhtIs+raq0pZh/buo7VbzCDkQL24B+b9ee1foAWxFjHauWF9fU+zzvTB 4GK/k/yPhPVlhvNSkbT3PiuGx19TeT34VW8OSNqMhENuG5KS4Ykr3UYxzn2HwVejUPFfiLUs5jjZ bWMjp8v3v1AP414V46uwJvP1NhPPZ6rc/wBk/wBhAlYwNQdpBqG3GGztKFs8LzjivZPBbw6F4Qtp ZZAHuMzOx6sWPH6Yoo7s+QkdrdXwGTnntWTeakFQAsFJ7k1yup+LmbIiRU7bnOf0FcrqGsyXzHzp WPoOgrpciFEyfiVrFzd/EvQW0qDS9QuTBJHt1XPkL8r/ADcdx1Hb6VD40k0+P9mS/ttLOr/Y7zxd Aitralbtm8qJnZgTkAsrFcn7pXNcT4ni/tfxzpMMujya4qsWW1jlEZ4H3ix7Dv1+hrrfHuqx6x8F fDgl18eJUv8Axou7U1jMAlCwBSFXHAXGwYz90YzxXPS9+ul3a/NHXSV5xXmel/s9yk+FtXdm3A3D KPTHnztgckfxduPTjBPgn7W94JfiTAOpWxjGf+BPXtH7P9+sfw3kmZvmluQ+SQchokfk4HPznrz7 185ftKasmq/Eq6dHDokEShlORgru/wDZq9TNJJ1JNdysU+bFTZ5TdNuYkHg9azplLnpnpV93U5OP qM0lgiyzopG7dNGuPXLexFfOJc0kiY7n0NpemhPhVLev/qP+Ek0xUVc4AAkBxgnHBA6dvTCr6BoF yP8AhRXjeMPEAkciboUVVfaNpPHHJXr6Y+g5e+tfs37Omo3EwJEfiS1DovDDbK3H3Rg4Pv8Ah90W I9aWw+AfiwtOXJZoNpGNmZ2UKPmPbk+5PXqfuMU/3dddE4/+ko9fE2dOpbvE+YrmbDEE81S3GRwv qcCieYsTmooJSLhD6EGvh2zx0jotCxBrsTA48sgjt/CTn/OPqOo/S39mKMJ8GNAwc7vPOf8Ats4/ z/IdK/M/w/MyeIoHPBLY5+hH9a/TX9mps/Bfw4Q24FZjnOc/vn7161DXC/8Ab36GlT+GvX9D05mx xUZ6VIx4NRMag5TU8IH/AIq/RP8Ar+g/9GLXqPxWGfEFvxn/AEZf/Q3ry3wef+Ku0P8A6/oP/Ri1 6p8Vf+Rgt/8Ar2X/ANCeuaX8aPoV9lnEEUm3mnEc5pK6kZBgEYIyPQ1Rm0a1lcv5ahvUCrpOKAaQ GTJoFs+cxqT64rJu/AWlXU3mS2ULyf3mQE11oHtSFM0Aczb+D7K3ACW8aj2UVdOlWtnC0smyKNBl nYgAD3NdHbafJMhcRt5SkB5ApKrn1ro/iF8G7bx58OrnQ7HUJNM1B1E1pqcBwyTDlS2PvISACp7e 4BqJVIwa5gcZOLcdz5+8Z/Emy0cX+naZLBDr9vbG8is9RhkjN1GuMrGuASWyQpxgkH0rzDXPFZew sfHd3H9msbyzGm654X07VhJOzykq7OjYKDyx0DDGBwOc7Vv4b8Uz3ttbWEupQfFbwpssri71W4g8 qa1G6QiMlfmByACf4Tkk5Fcvpni6+M58beEINY0x3vJD4o1W902O5tpYgQzOuAMAkMODhVHGAOPp aNKEI3h+f9f10PyPMMbiMVUcKzsk9u3lpv8Ap1ZWm01tPsf7C1YXWrfDHXNVjtdJ07Tri2kurNkG 4byAdpAbJAIJI5IHXA+IF1d+AtJnsfH2u+RrGi+fqXh7StS05JUZCQsa+arEEfKNqjIzuGDjbWL4 0+JWgfDk6v4b8JrpPjGx1e1a4/tGW0aKeynfIyGBHlEdQBzwOOCT5DBBqnii7sZL24m1S7tYRbQT TZIhjHRUBzge/J98Vz4nFxoPljq/6/rv6Ho5ZlFXHpVJ+7D8/wCuuyfmdD4v+Jus/EDVn1BYz4Yt ruwitLuw0uR4luyMF3dAcJuYA4AB4GcHOXeF/BE+pCOOKAQWw+6iLgCuz8E/CeSZkluELE8817n4 Z8CQ2MahYwMe1eLKU6r5qjP0TDYWhg4clGNvz+84fwd8MYrRULRAn6V6ppHhaOBVATGK6HT9DWEL 8orfttPCHpRY6WzKsdIWNR8uK14rEKOBVyK2CirCxYFAjzj4ofA3wv8AFnTRBrViPtcY/cX8HyTw n/Zb09jke1fH3j74YeM/gJd3NzeQjxHoUrR+TqrQ+fHAFOAZYTna20kBhwMnBGa/QvYMGobqwhvb d4Z41licYZHGQR6YrCdJTfMnZ91uengswxGX1OehL5dD84NPNnqdnImiyNBDPduty19mRbjeucRk jg9cA85C4Ymq8QN7oy2kObPTxAzxaJcRktczqwOVORnOV4yDjjnHP0b8Vv2RrY3Laz4LSC3lWTz5 NFuc/ZJm5ztwcxk5/h49q+Z7rX9U8P8AilNN8Q6PPaaylxJHaR3RC+RG+T+6fGGwcYyCOTxk1wzU 6ek9ttNrfp6ap9Ufp+W8QYfGxVOo+Sfnon6Pp91vLqdto3jnUfC2oygCRrtgm3Qb5VWO3jYAbcnk YKgc4wGBwcmvXvC/iL4eePy2na/p1po+rK/kukuDFI/+y/Qcg/KeRjHPU+E6Zptve6ZJEhuLvTYo Gi1HVFiZrpCjDKockFNoPGTgE5AwDVa4FqbV7iFHv9EjeG5t7QqwuyQdjZxxgktkjIBAPBODv7Sp BKT1X9fl3V0trI9DMcnw+YJSqR1e0lv+t9FZb/8Abp9La9+yD4K1tS8dkkZYZBSvMfEf7BWmSB2s pWT0B5pPA/xh8WeB5YljkbVLGeYLDpcwO5YjnaVZiSOvOCwBG3jivoLwT8fvDPi9XhnnGkX6S+U1 vduuCcZG1wSpyPfPtW8XTq6W1PzXG5FjMHL9378e63+7X8Lo+OtQ/YputFu4pp/MuLJJFMqwjDlM 87ffFeieIPAPwf8AEOIdS0RtCugoQSrC8JGBgZKZX8TX0h4e+MvgLxn4sv8AwvpviCyu9Zs2KSWo bG8gciMnh8c52k4wa3dV+H+jaup8+yifPqgNL2UWvdPneZrRnw5rX7GPh3xBbvceEvFwPGRFPtmX 6blwR+Rq34C8AfE/4Uaa3h6bT7DWNCkL7Lm3mO633EknBAJGT0x3r6mv/gB4dml86G3azmHIkt3K MPoRUafC/WdL4sdfmniHSO+QSj/vrhv1rP2Ti7ofMjxL4ZeG/wDhHDoWmbg7Wy7HcDAYhTk49zX1 B4fGLZPpXHjwLqc91DLcW1oJY2yZ42JYj8h/Ou80jT3tYVV+orogmlqRJp7GkvSlJ45/SkC4pc+t akDG/Om080hHWmB7LBx8LNE/66f1eueaugg/5JZof/XT/wCOVgEVx0tn6s0l0IzUbDNSmo2HNbko rTrmMiuN8T6PDqNnPBPEssUilWVuhFdu6jFZeoWYkQ8Zo3OylNwd0fFnxB8C/wDCO6m8EtrHdWzs Xhmkj3ZGDwfcfT3rhDaC3Q29rHaxxMAkkao25sc9OORweevXivs7xV4UtdYgkt7yBZ4XHKt29wex 968W8Z/BiPTrZrzT726WIN86Nhyg9QTzgfy9adOjeVoo/Ssu4twVCHLmT5Wl8Vrq3y1R8+3zXjTS qgubuZV8wmMeUkyHHrjnn8/QZrEvtMjiK21zuSwnK/Zre0bfIknUkkjIPHb0Iz0r1y78BTRwTSm6 lnbdCyruJ5ZgPl6AjJGRkcEdjXPa94PuNOe4fTbzS5LeCVTJp9/HJavM5252tkEHLAZA7cda655Z iJJvk/L/AIf8TDGeI/C9N8v1vnb25Yyfbd2tbVLV+uqPMk0W51G7jgtLVoLoSC3/ALO0+NhPdKTn dkZBPQj7x6jivXvBH7Keq3KRX3iMjRtOSYTx6YuJZ3A5Akcg4HJ4yTg44rrfDPxH8SeDbCcaX8O/ DlpLCn727GruzHjOCzRlu/QtXOfEj4o+PvEI1CxufElj4ft4bVZTHolufOdmLAIZGZmU5Ucrt4au aOVV3K8oP8j4DMPELAVk44OqkvLWX4LTdbHO/FPVfh78Jodf0rSvDEOp+J9Tt0Xbb3jxRWSr0eVA drZ4AU8nr35wPD/iPXfFA8F+JrXU4vD0ag6RqFlpVqdOV4FLbsXKIRIWiLB2PzDaeteQ+O47ay1e fTtJSeSd2HnTyuWkY4G9ic8knPftVzS9IbUNMi0q8WV7FWEgi3EKHxjcB6471hVpezk4X18tjxcP ini4+2tZPXXf5npJXwO48aeFrKwm8Zaw2LnQpmEs1xlEBMfmqNhRUByMYOO5wBf8VXfif4lQ+F/G fh3Ro/C5WSHTNR1M3SNcJKJNjSTIiqNjZUAMD9z35s6z4m1+1ufAuq+HNHs7i90GL7PPI6CJp4xh Y0bygrbVUc4OTWpqejaXP4v1m18ZfEZofDXiC2+0W5sVFoqXDSEhXDjIAKvxkjoTgjIxa3OxaG7r fxdHwu8Q2WheKbu11dLoKbfVtI+bzAfu74eoJ/2M9egr0Hw/4u0jxRD5mlalb3oH3ljcb09mXqp9 iK+X9AudOazs9O8LeC7zXvGXhicXyahMHdZYVk3fOuecZRcY4x17Cz8TbTU/iFZ6Z8Vby90vw3ZC WK1vtO0Scvd2x3lWfbwdxALYByAenemqkkOyZ9W3Nv5q+1c3qdp5BJPCjnJ7V4V8Qtc13S4dN1v4 f+KPEV14EkiQXOtanG7xxOZNmF3puwMd+54rL+LGjX89ppGvW3ifWPFvhZ8C8Jm2LIQSXVYwq/KF TliuORzVur2QKJr+L/GPh688WJpuks93rNw8cN1e29z5UVrCrZfL4IGc4JHA796l+1peSxXrmw89 pXtbS2XU2EezYUMgAyesYIGc5K8civI7i4spPFCah4UP2OxuUEU9uE5RcDKgkdTgEn15r13wroN1 Po9vFaSxRCAMwiaBMuSQ3L4znKjk5rFXm7/ov67/AIdj9CyPiGOFSw2Lfu9JdvX/AD8ktlpQvjp+ sWc8c9qJoUuiZJJL6aSeCRhn92BnBVudwzlmOehx0PhL4maj4aiSy1xD4l0xYwRq1in76LplZEON +M43LycE4Nc9q9rLpsx+1Wd5GtpblIZlYLNkvnc6rw4yCfQlvasx2nijhxdjzJAXnurUklD1Csgz juMjng+9OLlGWmn9f1+LufYY/K8FnEFKqrtrSS3+/Z/PTd3R7Xp+uaH4stmudD1K2v0x88cb/Ovs yH5lP1FcV4n+Hcd0t0+nSjT7maIwn5N0RViC2U6c+orzTUdPs9auBeC3Sa6YbLe4spTHKFA++RkH jA/QVFHLr0Kuth4y1QR/dVLtTLnnn5mB4Ga3jXnF3S+4/OsdwdWa5YSjUj9z/HT7mzrPEPhDUfKv ZG0eGWS+u7e2hnsT5hJQ5LGBWG4MXH3oiDg4IO4HE1zwja3Uet6xZXlxp1na3LJb6NLaQteTyug8 1WVeIwq7zk9AOOa5PXte1O2hZdQ8VX90pPCRsYg3HBwoB69Oa0fBmqXOu6MPDd3czy6JJdfbGgkb LNLgjcz/AHjwxGM45rSpiaWKTp1of8B9z4unk2Y5DiFUwtZRtZNN35o3TadnZp262OO1m8l+1J9q kvTZWqr5sVxPHCzSsNu0beRnZ6ZC5z61mO1x5CoipqV7cqwRVZ5JIY1yDjnHIX/vkHpX0Bqn7P1h r7Xd3p95BbS3BDR20sJ8qEd1UgkgY4yQT+JzXl/xG+EniPwZLd31/E+ox3DCQ6tbSsUgJyGDKACM 5A+g4rxKuGdLWG39fofX0cyni9MR8b3u0/Pfze9+y9Th2li3qykzWMAQFABAQSvPHJ6gjPPA6jNR RmSK3iEc87ISQscdwQVBYjYcjHbIx/epjxBFBbY9sm5I7iBQiyMOuSecc59cYH0kI83/AFkQWRpG VZGBbcefmJP59K5YVpUn7rOytgaWMv7WOv4+v/D3XmZOpzXNzFIm2QFRuYzyl3OMjJz3wcfhWNax ksOCSa7tLKK8XmDzVJDF7cht7dD9Bz+lWtM8Jw312iBZOcfKY9oPXnr7V0Ku6stVqePVyiWFhzQk mv6+X3M9N/Y9sJf+FgXV3g+VDZMGbtlmXA/Q1996DcZjXmvmj4GeErPwpphW3jxJOQ0r4+96D6da +h9BmwiivbpLlhY8KaszvLV9yjmvafgF/qta+sP/ALPXh1jJuUV7h8ADmLW/rD/7PWWJ/hMIfEj5 TQ9KsRnpVNDmrCGuwyLaHFWE7VTRqsRv70hliQDyzXgGszRyp43tcZuF1edgwRyVT+zoSckHGM4P TIxnnpXv2d6GvC/FXhWDQ9e8U6hezpbxapOskc8joioTaNEASzDA3ohyOmfU1M1ohdz4s0tmtokU 8FSQfzNdBYaltIGcZ9a9Ttvh18Pbq4YSazYRKEeQMdTBOfJEgVgJBnDZU46k4HQmpz4F+GawzPFq Fs3lrOwDaidzYaIoF/e8tteQdOSpPQYPGotLc0uefb7PUF2XdvHKccFhk/gay7vwdZ3Ss1qxt27D OVr2vRPCPws0+9e2vdStblkuAnmJfyFGQXW0kMGOMxHIPOApJHIFallP8H9E0uNbpYbm4M0SySC7 mzt82ZXIUA4G1Yj9GGO5Fuz3sLXdI7rWt0fgz4eFooyV1vw5EX8tFYYg56Nkj8O/OT0b+1hMft2l oAgwn32B+U5OOe3Trx0HPUG54Xuo/irY6Dpulak0unaPqOlXrDyyUK28B4DFByGABG4kZ445LP2j mdvEtjEgQs0UQywXgGQ5wT0+v9cVSV4v0PosgV8zpr/F/wCks+WPh/Lt8MB8cPcTsCAOcyv6cV1t vILiZUHLHgDua5jwJrVjZeHk0zVY7m1vIZpHVmhciRXdnBBwc8E/ka6qw8TeHtOd5End5BgkyRPx xnP3eOOailKKgrs8erRq+0k+V7voejaHbJp9lHCQMhckjrnvWlBKShJHB6GvP4viRpcpx50pZcfK sL+uPT1wPrVofEnS/s5KNcS4UtlLaQ8YJ/u+isfwPpXUqsF1MVh60toP7mUfhvayR6heTryH1u8x uCkDNzaqSMnPf0/rX6CHPlE57V+ffwtmlnhgmKSQS3eoT3DW7ghgGvLRlyNv90g9e46cV+gTndCe ucVjBLdH1OfJxo4OLVrU0fnl4mCwTazAIj4YkutVuJpTclZh4hxqLBGiGQYjFuZT1z834eg3WpyS xxLu/dxoI1X+6AMcV5/r0hKeJLqwWXXTp+qXEupJqik/2Ug1A7PsHHPmBjuHr6YNLN8SdGSJn+2g pHw+Y2yvseOD9aVNqN7nyb1OxubwsCV6AgVk3N47Z3EFRnoOprmbj4g2CvIqRXkmxC7olpJ8q8ZY 8dORz7io4vGKXk9tCmm6m8lyC0CfY3TzR833c4B+434qfQ1bmu4WMfUbyJ/G8AuJdXgcpIkJ0j75 kKgBXORiM5O456V2Pxbnuovh/wCCbfU5NPa5XXtSnnOkYa2/cqFwnPIwuCT1Oc1xeii68QeItO1e 3nk0fTrwT21nJIqsdTuAF/0NcbtpkyqbiABvzmuo+JVjLp2j+DtPfSf+Eb+zJ4klGnJIHFq3mSL5 Ybo23GMjjqegq8EufFQ9V+aOrDq9aC8zc0LXW8PfC60sIwsE8wJkRf4cKqEfiUNfOfxD1Ian4pvZ VbcFKxA9chFC/wBK9E1bxX5kN3DtIkjuJ1wCvP7x8YAx6eg/lXj8tlPPIz5ibc3Xzk65A9fcfnXT mKqTrStF2u+g61N+2m0ur/MoNIQe9XfD7ONZsNoDZuI2wwyDhsn8P0oGkXDFSDbkMu4H7RH0wD/e 9CD+foavaJo9xba1ZvMAsauxZlcEKFBJORnptPPPQ8HBFcGGo1JVoe69108wpwk5pWPpm/Qn9kC9 uZ0AabxFC5IxjG6Mcc4x19P6nzL4i+JJLPwRPokfyxS37tnnEirPOSRkDgHb2+vNe36p4Svtb/Yr mGm2kk8y3QuzEuWZhG6q5HAJIKMccnjGW6n5x8R32nXzRC9uLWU/vGVbeVQFLyl8tyecSY56bf8A Z5+jqXrLEU00m2t36no/xlVin1/Jnm8p64xUQUhsjiu0t9H0nUZdttaTyLwB5TMxJyuegb1b9OuD u6Gz8BT3UcIt/DepXR43eXp1w/Yf7A9W7/icAnxf7OfWrFfM4/q9t5JfM4rw/K/9sQSbM7mPX3H+ fX6Hof05/ZslaX4MeHXf7xWUk+v75+f85+p618R6V8IvFmryW9rY+Dr+KQlQsjWfkIPu5Ls5Hv27 eh4++fhJ4Mk+H3w80bQppUmntYj5roMKXZi7Y74yx5PWul04UKPsozUtb6ehjX5YxUFK+vQ7FjUT U5jTGNcxxGn4QIHi/Q/+v6D/ANGLXq3xV/5GC3/69l/9DevJvB5/4rHQv+v+D/0Ytes/FX/kP2// AF6r/wChvXLL+NH0L+wziiaaD+FKRRiuoyExSY5pw60hagQoq1Z2M99L5dvE0z+ijNVQ1R+I4dc0 LR/+Es0CS4vm0yBnfS4JCRM5bb80YGWABDfeBwp9qicuVFJXOn8V+J7zwR4V0nSpbFrBNXuXsptX 2JLFYgxswldScEkgKAeM/QKc79n7WbnQvC2laLqjGO3laWPT7lsiGfa7HEBIH7tlG6MHkKCOdoJ8 v8J+ONe1zwX4s8Z+IYv7ZtbO0/dWF8T9lnlLAqgjHy4GAemc4Ncl+0N+0zeeLX0Pw9oCf2Jbxol/ dXEsId4TGVP7tsYBVsBTx69gK85ptvzOpdj2L9q/4J6d4s0uHx3apbw+IPD0Zlc3EphivLcAkxSM MdMkr9Sv8XH5sfEH44TeL9Rx4OtpPCui3lmLe4tNOmdYbg8hyik/dbHUjJ54z8x9Q+N/7UfiL4/e F7PwcZL9dOt5D9tjsoQg1UA/KskobKL6hR83PIzWJ4C+EN5qEsV3qNuqNtVUiVcJGgGFRR2AHGK7 qGIrwp+xi9Dx6+VYWviViaqu106P1/qx594K+Gt1q3lAwmKHrtx19zX0F4L+FcFksZMQyPau68M+ AorCNFEQGPau+07QkhUYXFVGKR6LfQwtH8Lx20agIBj2rqrLS1QD5RV+3sfLA4q/HBjHFaGZVgtA oHFW1hAFSpHUmAKVwIVTAp2OaftwOKNvNIY3bRinkcUlAEbKOc81wPxO+Dvhz4oaU9prGnxzEg7J duHQ+oPUV6A3A96YeRT8hn59eO/2fPFHwl1i3u7T7R4j8MwTeYbTzCJEXnOOzdTwf61U8L6zpvim 5N35kejeKJ4pbS0GnW6xxRkE4WVP+Wbc43fLwO/f9BL/AE+G+haKaNZEYYIYZr52+MX7K+keKjJq Gmxmx1AZKywfKwP9fxrnVL2T5qS+XT/NPs0fV5XxDiMBJQq+/Ds/0PBfE+lvaXV5aa5GUc2cd1c6 7a4lLNu3BQclRuKj+6e/PfyX4p/FGRGv9F0W6S6tZnUzaioKyynaC27pli2ck5IIODyc+m+LPhf8 XfCXgTURpVyLrTt7xXFtZJtuWi24Z9mPmGCRwcjGcd6+VRut5yjg7SeQw/pXJUab2tfe/wA+vX1a TPdzjiGliKfJgrrm3b39PP16dGWrK8k0y5jnt5pIrmNxKlxCxV0I5BBHII65r72/ZX/ah1/xbp39 neLrG4urS3PlReIkXI6DCz474I+cD/eA5NfI/wAJPgxqfxP1aMtFNaaLE+bi9xgEf3U9WIP4d/Q/ V2ta54f+B3hix02xtA7HCW9jG2Gf1dj/AFPU1UG4e9fQ/P7c2h9ewXMdxEroyujDIKnIIpw2k14l 8MviJHc6ZDc2pkawfAktX+/bvjJA/Pp0PUe/sGn3MF4izxMHVxkMO9d0Z82qMnG25fC4NGBilFB4 rQgYVzTStPJppORTAZ0pOlKcU3OKBHskH/JLND/66f8AxysBjXQQj/i1uif9dP8A45XPEZrjpbP1 ZpLoNNMIzTyMVGSd3tWxKEIqN4twqXGDS4yKDVMw7/TBKDxXNanoImjkjZAVYEEGu/aIMMVUn08O DgVrCVjGtBVI2Z80eK/BE2m3MS+T9osWuhIFdAVTC4Xk9OQMHsQPSvLvFFzdyrAJprvyL+62yLJE t3DtXLKQww3SNR+fHevtK80OKcYkjDL0IIyK4DXvgn4e1SZpvsRgnzkSW8jRkHp2PvX0FHM3GPLU Vz8xx3CUKlV1cNLlv0aur+XbW3R7Hx1e6hCLfU5QLbE94saMulukmF2g/eOMfI3X0461yerXmreK L7ULHRrW4uFllSPL7UiRE5xsAwRuz1JPI/D7Jf8AZ58Ow7VNpJOqsXC3EzyKGOcnDEjPJ59zWxYf C6x05BHBaxxIvACKBisq+PdRWhp/X/BOzL+Go4efPXfNbb8Lfkj5H8C/s9m2Xz71POvJTukkK8kn 09K9Ls/gHFtDCDn6V9FWPg+KEgiMflW/a6GkYA2CvFdj72C5VZHzKPhPPp4zHGQB6Cua8VfCfTvE M1tLq2nrcTWxBjk5DLg5A9xnsa+yG0GGUcoPyrJvvAttcAnYOfaoaT0ZspHxr8RdA8beJPGel65o Gvp4eaGJLa5NlEIpJIwec8EPx2OBwK5jUPA9r8KPiLDqfhTwZP43stStWS8TW2UiKVm+8CoI6Dnc D97g19n3/wAL4pDlEAP0rHuPhSxzhiv0FZOknqXzI+Tr3wjr/gTWbS2wPF/h7UBLcS6NcTmHTtMk ZwwCxnKsBlsAY/Cubtvhldad4hvF0G8uDpdygWSFkAR2ySc/7IJOFr7IHwfhZt0qmRvVua07L4Z2 loRiFRj2pexQc/Y+WPDHwF8i2TMWBnOAO5612+l/DufSOEjOBX0bbeFIoQAEAH0qwfDELggoPyrV RjHZENtngN14UttVthBqFms6j7rMvzIfVT1Brhte+BSXL3Eul6k1s82N4lG1j0GN644xnHFfV0/g yJwcL+lZF54BEmcA/hTcYvc9HB5njMD/ALvUaXbdfc9D4/1/4PatC800lxptwoVUjMgGUXHzEYA5 z61514m8H6qrtDbSRysAYgLVX2hB0GT79a+67n4WRXBO9c/Wqq/CO1jf/UqPwrOdNTPYq8RY6vBx qNa9lqfn/YfBPXNRuPPug5Y85bJNeg+GPhhPokqsysSPavstPhxbRKB5Q/Ko5vhvA3SMD8KiFCEd jwp15T1Z4RpUc1tGFwRitb7Q0sTRyqJI2G0qwyCPQivVpvhvEB9zH4VRk+HqITgfpW/KYOdz558T /A7QPFMjzW0LaReMOJLUfIP+AdPyxXnOsfsxeJ7CctpMsV/ExCjDhGVR3Ibofoa+y4/BogYEJ09q lfRHiXAXFcs8JSqatWfkd1HMsRQVou67PU+GH+BHiuziLXOmW1rF0LNIAcbumFbPb+VdT4L+Hstp OgkUM+fmKrgfhX1FqfhSS/J3qWHpTNK8BJA+fLA/CiGEhS+EVbMKuJ+PT0MvwdorWkEahe1enaNb lVGah03QRAgG2uhsrHy8cV1pWPPk7mlYDAHFe5/AD/Va39Yf/Z68Tt4tor234ADEWtfWH/2euXE/ wmOHxHyWjYqwjdKpoc1ZTj612GRcUkipUqujVMvGKCi5GTjrUNxplveH99Gsn+8M05G6VZRs0hFK LwvpqnizhH/ABVlfDmnA4+xw/wDfAq2rcdamQ0AVYvDunqeLOH/vgVI/hrTpD81lCf8AgAq+nQZq ZBxSYENhpdvp6gQRJEP9gYrgvij8Op/GV9Z3MDhWhZNwZVIdVcMV5U4zjGe2c816QpytPC7vSkdW HxNXCVVWou0l1/A+YB+zPq7pCJGtJfLjSP5yMYWGSPj5OMmQH/gOO+Q2b9l3VruyMP2izjlIKmXG fl8uJOm0c/uic/7Xsc/U6Lx0p6oF7CocItWsey+Iczf/AC9/CP8AkfM5/Zd1CWfzhdQxs0hdgAMf 8fPnAD5fTC/r7Uyz/ZU163iSM6zaMqoIx+4IxiGSP1/6aE/hivp5W+lPVyafLG97CfEGZv8A5ffh H/I8R8C/s9Xmj61a3ut6pDqAt5PNQRRMrEgxFQzFyCo8lQBgdT7Y96lUbCB6VDGeBmpNwx1pnlYr GYjGyU8RNyaPm7VvgRrEms6vcf6JfLaTy33hnzB5Y0+7lmSaR5go/fruXhXyBwKoW/7NWpXbPBfP ayWGqx/adeijVla8vgZWEsTZzCm6RSUXAO09AcV9O+WpOetSIoHSp5I9jjuz5rtv2X9Vuba1k1LW oLjUpcQarPHYxpHfWirEqW/l9IwBFywyTn2rRj/ZXBtrxF1ye0mM3/Evu7aNEn022zITawPjKxnz SD649zn6HxSgDNHJHsGp4hB+zVpVve6lKLy5S1vbM2X2CMhbe3UxojvCuMpIwjBLZySSas+Pf2dt I8WeDtJ0O1llsG0qBoLS6X55EDLhi2fvZ6n356817KRTBVx9x3joxxk4u6ep8jz/ALEt7eTGSTxS ImLMx8m0ZASWdsnEnUGQ4PbA98sT9g/YQV8UOpBBGIG4wVP/AD0/2P1Ptj684NLkV1fWq/8AMzo+ s1n9o+Ol/YJuUdSvjOYqqhVVrY4AChf+enooH0rS039iKSO6h+3+JRcWiAqypaFZCCCDhi5weSen Xtyc/WvamHrTjia0dpMlYiqtpMx9B8MWPh7w9aaNaQhLK2iESIeePU+pPU1jD4XeFobt7ldB0/z3 OWk+zJuJ9ziuvJxxUbc1ztuTu9zBu7uzMh8P2FqgWK0hjUcAKgGKl/s6FRxEo/CrtNIJ70hFZbVE 5CgH6VIeB7U4mmMaAGMc012oY8VG7U0gNTwef+Ky0L/r/g/9GLXrXxV/5D9v/wBeq/8Aob15D4OP /FZaD/1/wf8Aoxa9e+K3/IwW/wD16r/6G9cs/wCNH0L+wzijQTR17UhPNdJkLyKaxpcikJzQAwsc Va0TUIdG1iLUJYmlEasjKvOVIweO9V8cUmKTV1Yadjzn4pfEq31aC18G+EtAns9Hgm82eQQeTGW7 BR6cn6/hXJL8LodcjLajB5ocYKHpXtcmnwSsWaNd3rihbNFGAoxURgkVzHk+l/CPStLOYLKOP6LX TWXhaO3xiMAewrs/syjsKXyQK0JuYMGlrHjArQitQoHFW/LG7jrT9oFAiER4PTj1qQKKUinAcZoA aQBSY5p3ekzzQAEUpoHWjGaVgE7U3HOaUigjjigZGTz6U0+lOb3popjGHmoZkDA5FTOuBjNMYdqA OE8UaTd2khu7aISx9XiHGfp7185fE39lbwx8VNbg17TJm0e880NqFvCgAnHf5f4H/wBocHqRk5r7 MESSJtYAg+tcj4j8Ch5jfaa3kXYHOBw49CO9YzpqRal0Z4TeWdr8OPCa22laYVhs1EcVrCvf1b8e Sa89h8CN4ikl1HXVN9qF4cRxDg57Kv8AdA9e1fRN/Y/2gkkcsPkX6DDRP/EPb1FcvY6bHazyTgYb G35+sa/3R6Dv/wDqFYu19TZbaGL4L8G2fgjTGiRi0z/PcTu2dzfU9h0H+Nd98O/Ekd01wIjJsL4A cYBx/EPr/hXDlpfFN99ltSfsMbfO4/5aH/CvUvDHhqOxiTagXA9K1pxe5E2tjtYJd6A1NnI96rwR lFxU5roMRrDmmkU/ORTadhEZppHSnv1pnegZ7JDx8LND/wCun/xyuf5zXQRf8ks0P/rp/wDHKwK4 qWz9WaS6DTTCM4zUmMU2tiBDRSE0Ak0Ahfajp9KM4pAwPvQUMcK3UVXktgR0q2VzzQygiqTJaTMe Wzyc4qL7Fg9K2WjB7UwxD0qrk8pmx2oXtU6wYNWvKFLsxSCxXEVO8sVLt5FBGKB2IDCG7VG9sp7V axyaaQaAsZ72Qz0qFrJeOK1AA1MaOgDNNoD2pPso9KvstNKA07jKf2cHimtbjutXNuKQrQUZ72in sKgmsRuBxWoydqYyHFArmS1iMZApv2Jf7orU2cc00pzTEZj6ajjpVabRVYnAFbvl0pj9qCTlpNBB /hH5VXfw6p5K/pXYmNcdKieIUxHGv4eTH3RTBoix/wANda1vkdOaga29qQznY9O29BVmO0ArV+zg HpTTDg9KBlVIMV7F8BU2x619Yf8A2evKfLxXrXwLGI9Z+sP/ALPXLif4TLp/EfHynFWIzx1r21P2 StbXrrlif+AP/hUy/so60v8AzGrH/vh/8Kv6xS/mBwkeKIfep0Jr2hf2VdZH/Masf++H/wAKkH7L Wsj/AJjNl/3w/wDhR9YpfzByS7HjSHNWY2r19f2XtYX/AJjFl/3w/wDhUi/sxauP+YxZf98P/hR9 YpfzByS7HkiGp1avWl/Zp1cf8xez/wC+G/wqQfs26sP+YtZ/98P/AIUvrFL+YOSXY8oRuKnV+K9U X9nLVV/5i1n/AN8t/hTx+zrqo/5itp/3y3+FHt6XcfJLseVqxz7VMp4r1Ff2edUH/MUtP++W/wAK kX9n3VAOdUtD/wABap9vT7hyS7Hl6OQOOakD8c16evwA1Nf+Ypa/98tTx8BNT/6Cdr/3y3+FHt6f cXJLseXKSTUqnmvSz8BNVP8AzFLT/vlv8KUfATUx/wAxO1/75b/Cj29PuHJLsebq4HFOWbmvRx8B tT76na/98t/hTh8B9SH/ADErX/vlqPb0+4ckux5yr807zMGvR/8AhRWo/wDQStv++Wpf+FF6j/0E rb/vlqft6fcOSXY86DjvSlq9FHwN1H/oI23/AHy1OHwP1Ef8xG2/75aj29PuHJLsecFqN+R2r0c/ A/USf+Qjbf8AfLUf8KO1D/oI23/fLUe3p9w5JdjzVmoBxXpR+B+o/wDQRtR/wFqZ/wAKM1LP/ISt f++Wo9vT7hyS7HnW+ms/HFekD4GakP8AmJW3/fLUh+BmpHn+0rb/AL5an9Ypdw5JdjzXdmmZwc16 afgXqP8A0Erb/vlqafgTqR/5iVr/AN8tR9Yp9x8kjzXdkUwtivTf+FE6ljH9pWv/AHy1NPwH1I/8 xO1/75aj6xS7i5JdjzBmqMtXqJ+Aupf9BO1/75b/AApp+Aepn/mJ2v8A3y3+FH1il3Dkl2PK3fNQ s1erH9n/AFQ/8xS1/wC+W/wprfs+aof+Ypaf98t/hT+sUu4ckux594MJ/wCEz0H/AK/4P/Ri17D8 Vv8AkYLf/r1X/wBCesrQfgRqWk67pt++pWrpa3Mc7IqtlgrAkD8q7fxp4Ju/EmpxXME8MSJCIyJM 5yGY9h71zyrQdVST0sVyvlaPKaaa7n/hVGpf8/dr/wCPf4Un/Cp9R/5+7X/x7/Cuj29L+Yz5Jdji No/Gm7a7r/hU+o/8/dr/AOPf4Un/AAqfUf8An7tf/Hv8KPb0v5g5JdjhelIa7o/CbUf+fu1/Nv8A CkHwl1L/AJ/LX/x7/Cj29L+YOSXY4ZgShAJUnjI7Ui8KATuPqe9d3/wqbUv+fu1/Nv8ACg/CXUv+ fu1/Nv8ACj29L+YOSXY4bFIV/Gu5/wCFS6l/z+Wv/j3+FH/CpdS/5/LX/wAe/wAKPb0v5h8kuxwY UZ96Qiu9/wCFSal/z+Wv/j3+FJ/wqPUv+fy1/wDHv8KPb0v5g5JdjgsY5FFd4fhFqX/P5a/+Pf4U n/CodS/5/LX/AMe/wo+sUv5g5JdjhMUEc13n/CotS/5/LX82/wAKP+FRal/z+Wv5t/hR7el/MHJL scFiiu8/4VDqX/P5a/m3+FJ/wqHU/wDn8tfzb/Cj29L+YOSXY4XFMNd9/wAKh1P/AJ/LX82/wpp+ D+p/8/lr+bf4Ue3pfzBySOAPSm4wa78/B3U+f9NtP/Hv8KT/AIU7qn/P7af+Pf4Ue3pfzD5Jdjz8 gYphGK9CPwb1Q/8AL7afm3+FIfgzqn/P7afm3+FHt6X8wckux58G5qdJfxFdz/wpjVP+f20/8e/w oHwZ1Qf8vtp+bf4Ue3pfzByS7HmmteG7XWowWHlzrykq8EGvJPiP4G1yaW3trW3KJJxcXkbAK6dh jrn3/n2+qh8HtUUcXtp+bf4Uk3wd1SZNrXloR/wL/Cs5VaMt2UlJbHzZ4Q8HLpVvGhjC7fau7t7U RKBXp3/Cj9SHS8sx/wB9f4U7/hSWqf8AP7Z/m3+FaqvSX2ieWXY83X5aUmvRj8EtV/5/rP8AN/8A Cmn4I6t/z/Wf5v8A4UfWKX8wckux51u/OkJr0X/hSGrf8/1n+b/4Uh+B+rn/AJf7P83/AMKf1il/ MLkl2POWxTDXpH/CjtXx/wAf1n+bf4UH4Hauf+X6z/N/8KPrFL+YOSXY24xn4W6H/wBdf/jlc/7V 1+s6PL4f8B6Zp87pJLBMFZo84PDnj865CsKLum13ZU9GGKTFLSCtyBGHSkAzSk00mgAYcEUioF6U v1oJxTAUUGk3UA0hhikIp2aM1QDCKCPSlJzRmi4rDCuT6UmKeaQimFiPFIcZFO6GkYUBYjxzQ1Lj mjsKAIZBTcZqRhmm4oGRlaaRjtUrDNMYZphqRmmsM08ikxigREVpNuKlIxTTTAixigHIp5xTTxQI aelRlcjuKeWx9KCRQBCRjNRkVOcGmlR1FAFdkzzTGQCrDYHNREgnFBJFivVfgcMJrH1i/wDZ68tO M16n8D/uax9Yv/Z65sT/AAma0/iP/9k= --liASLlu1YhBuu=_2TCO2QH9mTxFyOAGSE7-- From sandeen@sandeen.net Wed Aug 31 09:18:41 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-100.0 required=5.0 tests=USER_IN_WHITELIST autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F48E7CA0 for ; Wed, 31 Aug 2016 09:18:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D63618F8040 for ; Wed, 31 Aug 2016 07:18:40 -0700 (PDT) X-ASG-Debug-ID: 1472653115-0bf8155c75443a90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id bZDC2hBa10vEYwZS for ; Wed, 31 Aug 2016 07:18:35 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Effective-Source-IP: sandeen.net[63.231.237.45] X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.0.0.4] (liberator [10.0.0.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E53309A for ; Wed, 31 Aug 2016 09:18:35 -0500 (CDT) Subject: Re: [PATCH] xfs: Document error handlers behavior [V2] To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfs: Document error handlers behavior [V2] References: <1470734124-65204-1-git-send-email-cmaiolino@redhat.com> From: Eric Sandeen Message-ID: <5d4e9f1e-0c7d-6804-5d19-d38dbd8d05cf@sandeen.net> Date: Wed, 31 Aug 2016 09:18:25 -0500 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 In-Reply-To: <1470734124-65204-1-git-send-email-cmaiolino@redhat.com> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="TgF0JhGbI7Sxmwc8A77F2W1D8SacFUDs7" X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1472653115 X-Barracuda-URL: https://192.48.157.11:443/cgi-mod/mark.cgi X-ASG-Orig-Subj: Re: [PATCH] xfs: Document error handlers behavior [V2] X-Barracuda-Scan-Msg-Size: 7862 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32488 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --TgF0JhGbI7Sxmwc8A77F2W1D8SacFUDs7 Content-Type: multipart/mixed; boundary="59rUIDKH1Sp6wTRl3CSlI2GHJL1CDmQDg"; protected-headers="v1" From: Eric Sandeen To: xfs@oss.sgi.com Message-ID: <5d4e9f1e-0c7d-6804-5d19-d38dbd8d05cf@sandeen.net> Subject: Re: [PATCH] xfs: Document error handlers behavior [V2] References: <1470734124-65204-1-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1470734124-65204-1-git-send-email-cmaiolino@redhat.com> --59rUIDKH1Sp6wTRl3CSlI2GHJL1CDmQDg Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable On 8/9/16 4:15 AM, Carlos Maiolino wrote: > Document the implementation of error handlers into sysfs. >=20 > Changelog: >=20 > V2: > - Add a description of the precedence order of each option, focusing o= n > the behavior of "fail_at_unmount" which was not well explained in V1= Global: s/shutdown/shut down/g > Signed-off-by: Carlos Maiolino > --- > Documentation/filesystems/xfs.txt | 94 +++++++++++++++++++++++++++++++= ++++++++ > 1 file changed, 94 insertions(+) >=20 > diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesyst= ems/xfs.txt > index 8146e9f..d483e0b 100644 > --- a/Documentation/filesystems/xfs.txt > +++ b/Documentation/filesystems/xfs.txt > @@ -348,3 +348,97 @@ Removed Sysctls > ---- ------- > fs.xfs.xfsbufd_centisec v4.0 > fs.xfs.age_buffer_centisecs v4.0 > + > +Error handling > +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > + > +XFS can act differently according with the type of error found "according to" > +during its operation. The implementation introduces the following > +concepts to the error handler: > + > + -failure speed: > + Defines how fast XFS should shutdown in case of a specific > + error is found during the filesystem operation. It can > + shutdown immediately, after a defined number of tries, or > + simply try forever, which was the old behavior and is now > + set as default behavior, except during unmount time, where > + in case of a error is found while unmounting, the filesystem > + will shutdown. Defines how fast XFS should shut down when a specific error is found during filesystem operation. It can shut down immediately, after a defined number of retries or after a set time period, or simply retry forever. The old "retry forever" behavior is still the default, except during unmount, where any IOs retrying due to errors will be cancelled and unmount will be allowed to proceed. > + > + -error classes: > + Specifies the subsystem/location where the error handlers > + configure the behavior for, such as metadata or memory allocation. Specifies the subsystem/location for the error handlers, such as metadata or memory allocation. Only metadata IO errors are handled=20 at this time. > + > + -error handlers: > + Defines the behavior for a specific error. > + > +The filesystem behavior during an error can be set via sysfs files, wh= ere, the s/where,/where/ > +errors are organized with the following structure: > + > + /sys/fs/xfs//error/// where is the device name for the mounted filesystem. > + > +Each directory contains: > + > + /sys/fs/xfs//error/ > + > + fail_at_unmount (Min: 0 Default: 1 Max: 1) > + Defines the global error behavior during unmount time. If set to > + "1", XFS will shutdown in case of any error is found, otherwise, > + if set to "0", the filesystem will indefinitely retry to cleanly > + unmount the filesystem. Defines the global error behavior at unmount time. If set to the default= value of 1, XFS will cancel any pending IO retries, shut down, and unmount. If se= t to 0, pending IO retries may prevent the filesystem from unmounting. > + > + subdirectories > + Contains specific error handlers configuration > + (Ex: /sys/fs/xfs//error/metadata). + (Ex: /sys/fs/xfs//error/metadata, see below) > + > + /sys/fs/xfs//error// > + Directory containing configuration for a specific error ; currently only the "metadata" is implemented. > + The contents of this directory are specific, since each > + might need to handle different types of errors. Remove this part: > + All directory > + though, contains the "default" directory, which is a global configura= tion > + for errors not available for independent configuration. because there is no "default" under the - and you haven't describ= ed yet, anyway... "default" is covered properly below. > + > + /sys/fs/xfs//error// /sys/fs/xfs//error/// to indicate that it is a directory, not a file. > + > + Contains the failure speed configuration files for each specific erro= r, > + including the "default" behavior, which contains the same configurati= on > + options as the specific errors. > + > + The available configurations for each error type are: Contains the failure speed configuration files for specific errors in thi= s , as well as a "default" behavior. Each directory contain= s the following configuration files; the first condition met for a specific= configuration will cause the filesystem to shut down: > + > + max_retries (Min: -1 Default: -1 Max: INTMAX) > + Define how many tries the filesystem is allowed to retry its > + operations during the specific error, before shutdown the > + filesystem. Setting this file to "-1", will set XFS to retry > + forever in the specific error, setting it to "0", will make > + XFS to fail immediately after the specific error is found, > + while setting it to a "N" value, where N is greater than 0, > + will make XFS retry "N" times before shutdown. Defines the allowed number of retries of a specific error before the file= system will shut down. The default value of "-1" will cause XFS to retry foreve= r for this specific error. Setting it to "0" will cause XFS to fail immedi= ately when the specific error is found, and setting it to "N," where N is great= er than 0, will make XFS retry "N" times before shutting down. > + > + retry_timeout_seconds (Min: 0 Default: 0 Max: INTMAX) > + Define the amount of time (in seconds) that the filesystem is > + allowed to retry its operations when the specific error is > + found. "0" means no wait time. does "no wait time" mean shut down immediately, or ignore the wait time altogether? I think it is the latter, so: Define the amount of time (in seconds) that the filesystem is allowed to retry its operations when this specific error is found. The default value of "0" will cause XFS to retry forever. Right? As an aside, I'm not sure why we don't have the consistency of "-1" meaning "ignore this setting" as we do for max_retries. Dave, think it's= too late to change that? > + > + > + > + Order of precedence: > + "max_retries" takes precedence over "retry_timeout_seconds", > + where, "retry_timeout_seconds" will only be tested if > + "max_retries" limit was not reached yet or is set to retry > + forever ("-1"). If "max_retries" limit is reached, the > + filesystem will shutdown, wether or not "retry_timeout_seconds" > + has been reached. This doesn't seem quite right. Isn't it simply the *first* threshold to = be reached, whether it is max_retries or retry_timeout_seconds? So that's n= ot really an order of precedence. I think: I think that all of this can be simply moved up to the descriptions above= =2E > + "fail_at_unmount" on the other hand, works independently of the > + remainder options. It will only be tested during unmount time, > + but, it will shutdown the filesystem independent of the limits > + set into "max_retries" or "retry_timeout_seconds". > + It has been added because sysfs configuration can't be changed > + after an unmount is triggered, once the sysfs directory from > + the filesystem being unmounted will be detached from the sysfs > + tree, so, even if the sysadmin wants to make XFS retry forever > + for any error during the filesystem operation, the filesystem > + can still be properly unmounted if any error was detected and > + "fail_at_unmount" is set. Otherwise, the umount process get > + stuck forever. >=20 I'd leave this all out. --59rUIDKH1Sp6wTRl3CSlI2GHJL1CDmQDg-- --TgF0JhGbI7Sxmwc8A77F2W1D8SacFUDs7 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org iQIcBAEBAgAGBQJXxuc7AAoJECCuFpLhPd7gGeoP/jmWHAolrQOXuz33tRRLFHjZ aqqGJalJi0I80f9QevUcnqa62tCjtameL4sUCsEzuyK6Z0gHkX97pnxY8elqL3gd 1p6zFdWj6JSFCRRHGJuVasq8CZguyx8TCOvZUJ+3aQgK8dtQgjOHKT2OkyaZQflO qh6bdxIxl4W/Vhie4lso+l4OQixoTOFTDP+Lx4El1qxiijan8bzhnXCRaOTC3EWX Aiy8xzVDYwslkL+dql+3KFYkrrIH3Nec81TjHU8bVqJtYUCS2qWxpPuYeIKitsHB dYdT04H3+FBFnOmqmZwUVHzt8HxE4oJ1DjEWqCd8DWQPz1T7Y6GDQHkLGbyMUEdP iwJA6YtbjLVHl71pMLJ9cA49gZC7BmPsKXuBqitr/+wFofIzafs6vf7hX2plTfBQ UW74YrYV9TdhMQXZ1+n8wMq4COPXamfHgqElgOABXA92igp/pnhVptSljK0SI1Q+ SmHrYEJsP3Jj4dj9vg9Iat+fzh8jdsPZSFT5Tqc7GMrHWUWlSAPzCbmWg8JXjcSx fwLGRdOFSkbT7uf9jBXPgVQ8Ys7BTLebIHHs58erUKtkndZf+6I9wmQrTH28p+Kt y5qMekQ4HgQsxMNqYtxdVLca0JSWKfEF7cWNYygkZY5zEyIIrildZgNlu3ehgsM0 Wuz2P8DFSzbFQFx3fekG =uNzY -----END PGP SIGNATURE----- --TgF0JhGbI7Sxmwc8A77F2W1D8SacFUDs7-- From webmaster@leworm.fr Wed Aug 31 17:15:08 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B23F77CA0 for ; Wed, 31 Aug 2016 17:15:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 00B92AC002 for ; Wed, 31 Aug 2016 15:15:07 -0700 (PDT) X-ASG-Debug-ID: 1472681697-0bf57b53134a9aa0001-NocioJ Received: from s16055305.onlinehome-server.info (s16055305.onlinehome-server.info [82.165.40.108]) by cuda.sgi.com with ESMTP id aCpH1eW4yHoMHcWt (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO) for ; Wed, 31 Aug 2016 15:14:58 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@leworm.fr X-Barracuda-Effective-Source-IP: s16055305.onlinehome-server.info[82.165.40.108] X-Barracuda-Apparent-Source-IP: 82.165.40.108 X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network Received: from tolkqc.net (unknown [93.155.149.197]) by s16055305.onlinehome-server.info (Postfix) with ESMTPSA id 008AC10A36; Thu, 1 Sep 2016 00:21:25 +0200 (CEST) From: webmaster To: "tarik belaam" , "xfs" , "xorox" , "vicente.gonzalez" Subject: Re: fantastic Date: Thu, 1 Sep 2016 01:14:53 +0300 X-ASG-Orig-Subj: Re: fantastic Message-ID: <00008f21b480$ec58ae80$e1889e86$@leworm.fr> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_002E_014A5730.2E55131A" X-Mailer: Microsoft Outlook 15.0 Thread-Index: AdIJz8JUyz9+nJA9ZBPXAV6lMxDXeQ== Content-Language: de X-Barracuda-Connect: s16055305.onlinehome-server.info[82.165.40.108] X-Barracuda-Start-Time: 1472681698 X-Barracuda-Encrypted: ECDHE-RSA-AES256-GCM-SHA384 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2501 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32509 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message This is a multipart message in MIME format. ------=_NextPart_000_002E_014A5730.2E55131A Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hey friend, If you were looking for something really fantastic and cool, than you found it! Just take a look Sincerely, webmaster ------=_NextPart_000_002E_014A5730.2E55131A Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

<= span lang=3DEN-US>Hey friend,

 

 

<= span lang=3DEN-US>If you were looking for something really fantastic a= nd cool, than you found it! Just take a look http://wostestofro.frenchpressk= nits.com/e2xfzg

 

Sincerely, webmaster

------=_NextPart_000_002E_014A5730.2E55131A-- From dave@fromorbit.com Wed Aug 31 17:35:50 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A017D7CA0 for ; Wed, 31 Aug 2016 17:35:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D7D7304032 for ; Wed, 31 Aug 2016 15:35:47 -0700 (PDT) X-ASG-Debug-ID: 1472682944-0bf57b53144abb90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id iXyeV875tVuQ52HO for ; Wed, 31 Aug 2016 15:35:44 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Effective-Source-IP: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A2C0GACAWsdXEAI1LHldg1ABAQEBAR6BU4ZynBABAQEBAQEGkwuCD4lqOhMBAgEBAQEBAQEGAQEBAQEBAQE3QIUPLyMYGBhSAwctiEW+XoVniSVvDYUQBZlQjzKPUwKQQSABgisBC4I9KjSEPoIuAQEB Received: from ppp121-44-53-2.lns20.syd4.internode.on.net (HELO dastard) ([121.44.53.2]) by ipmail05.adl6.internode.on.net with ESMTP; 01 Sep 2016 08:04:56 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1bfE5u-0007ik-UR; Thu, 01 Sep 2016 08:34:54 +1000 Received: from dave by disappointment with local (Exim 4.87) (envelope-from ) id 1bfE5j-0004KB-Mg; Thu, 01 Sep 2016 08:34:43 +1000 From: Dave Chinner To: linux-xfs@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] db: write via array indexing doesn't work Date: Thu, 1 Sep 2016 08:34:43 +1000 X-ASG-Orig-Subj: [PATCH] db: write via array indexing doesn't work Message-Id: <1472682883-16585-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.8.0.rc3 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1472682944 X-Barracuda-URL: https://192.48.176.25:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 2358 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32509 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header From: Dave Chinner This command to write a specific AGFL index: # xfs_db -x -c "agfl 0" -c "write -d bno[32] 78" /dev/ram0 doesn't write to array index 32 - it incorrectly writes to /somewhere/ in the entire array range. The issue here is that the write_struct() code assumes that the object it is printing always a structure member and any array indexes will be exposed as children of the parent type. This works just fine for structures with internal arrays, but when the type being decoded is an array, we get a direct reference to the offset to be written in the parent object. Hence we need to take into account the array index returned by the parent object parsing when calculating the size of the region to be modified rather than using fcount() as that results in the size always being set to the size of the entire array and the modification being written to the wrong place. Signed-off-by: Dave Chinner --- db/write.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/db/write.c b/db/write.c index 82a0c74..5c83874 100644 --- a/db/write.c +++ b/db/write.c @@ -701,8 +701,24 @@ write_struct( sfl = sfl->child; } + /* + * For structures, fsize * fcount tells us the size of the region we are + * modifying, which is usually a single structure member and is pointed + * to by the last child in the list. + * + * However, if the base structure is an array and we have a direct index + * into the array (e.g. write bno[5]) then we are returned a single + * flist object with the offset pointing directly at the location we + * need to modify. The length of the object we are modifying is then + * determined by the size of the individual array entry (fsize) and the + * indexes defined in the object, not the overall size of the array + * (which is what fcount returns). + */ bit_length = fsize(sfl->fld, iocur_top->data, parentoffset, 0); - bit_length *= fcount(sfl->fld, iocur_top->data, parentoffset); + if (sfl->fld->flags & FLD_ARRAY) + bit_length *= sfl->high - sfl->low + 1; + else + bit_length *= fcount(sfl->fld, iocur_top->data, parentoffset); /* convert this to a generic conversion routine */ /* should be able to handle str, num, or even labels */ -- 2.8.0.rc3 From bounce@jeftinaputovanja.rs Wed Aug 31 18:02:44 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_IMAGE_RATIO_06, HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0C2DB7CA0 for ; Wed, 31 Aug 2016 18:02:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 419C5AC002 for ; Wed, 31 Aug 2016 16:02:40 -0700 (PDT) X-ASG-Debug-ID: 1472684551-0bf57c1b0917f7f0001-NocioJ Received: from mxgate07.dmz.gr (mxgate07.dmz.gr [95.215.44.144]) by cuda.sgi.com with ESMTP id OAGMFXiecImNEKmK for ; Wed, 31 Aug 2016 16:02:32 -0700 (PDT) X-Barracuda-Envelope-From: bounce@jeftinaputovanja.rs X-Barracuda-Effective-Source-IP: mxgate07.dmz.gr[95.215.44.144] X-Barracuda-Apparent-Source-IP: 95.215.44.144 DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=62881; s=acy; t=1472684550; c=relaxed/simple; h=from:to:subject; d=jeftinaputovanja.rs; bh=8SkFppXbL9uwglxaiVYyJcUgfRI=; b=DguAXG7um9+YFWz1ccX3flx9XyVpYKl+r6Uawj+HfhZrtzBYDv6Xy7nSI2IS YRgDJZxBCUGwMSc9mA5hSKx8pRQVlQL+zs7l4chruk5HnQPRau1aB7zAhaCO ykp/KHiicXfnAHTOW58vo1xiJ5bLOvUNfE1a6H6GabQFzR8ulCM= Date: Thu, 1 Sep 2016 02:02:30 +0300 To: Xfs From: Jeftina putovanja Reply-To: Jeftina putovanja Subject: 4-dnevno putovanje u Milano za 130 evra po osobi i druge ponude X-Mailer: PHPMailer 5.2.6 (https://github.com/PHPMailer/PHPMailer/) X-ASG-Orig-Subj: 4-dnevno putovanje u Milano za 130 evra po osobi i druge ponude MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_22f890beb296d144e36dbca7e51bab10" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mxgate07.dmz.gr[95.215.44.144] X-Barracuda-Start-Time: 1472684552 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 62611 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_IMAGE_RATIO_06, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32510 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_RATIO_06 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20160831230239.A80BE1940063@cuda.sgi.com> --b1_22f890beb296d144e36dbca7e51bab10 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Email Newsletter of this month. PoÅ¡alji prijatelju! ( http://jeftinaputovanja.rs/index.php?option=com_acymailing&ctrl=archive&task=forward&mailid=228&key=21Flyb8d&subid=21978-MaU0Br9QPqpHsN&tmpl=component ) PONUDE NA DAN: 01/09/2016. ........................................................................................................................................ Predlažemo: 4-dnevno putovanje u Milano iz NiÅ¡a, 26-29 Novembar, za 130 evra po osobi U cenu su uraÄunate: Avionske karte NiÅ¡ - Milano - NiÅ¡, direktni letovi Aerodromske takse i ruÄni prtljag SmeÅ¡taj 3 noći u dvokrevetnoj sobi u eko-hotelu sa 3* 4-dnevno putovanje u Berlin iz NiÅ¡a, 17-20 Novembar, za 115 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=13:4-dnevno-putovanje-u-berlin-iz-nisa-17-20-novembar-za-115-evra-po-osobi ) NIÅ  - BERLIN Kada: 17-20 Novembar Avionski prevoz + hotel 3* Broj noćenja: 3 cena aranžmana 115€/osobi 4-dnevno putovanje u Veneciju iz TemiÅ¡vara, 19-22 Novembar, za 125 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=21:4-dnevno-putovanje-u-veneciju-iz-temisvara-19-22-novembar-za-125-evra-po-osobi ) TEMIÅ VAR - VENECIJA Kada: 19-22 Novembar Avionski prevoz + hotel 3* Broj noćenja: 3 cena aranžmana 125€/osobi 4-dnevno putovanje u Diseldorf iz NiÅ¡a, 3-6 Novembar, za 130 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=20:4-dnevno-putovanje-u-diseldorf-iz-nisa-3-6-novembar-za-130-evra-po-osobi ) NIÅ  - DISELDORF Kada: 3-6 Novembar Avionski prevoz + hotel 3* Broj noćenja: 3 cena aranžmana 130€/osobi 3-dnevno putovanje u Malme iz Beograda, 25-27 Novembar, za 135 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=15:3-dnevno-putovanje-u-malme-iz-beograda-25-27-novembar-za-135-evra-po-osobi ) BEOGRAD - MALME Kada: 25-27 Novembar Avionski prevoz + hotel 4* Broj noćenja: 2 cena aranžmana 135€/osobi 4-dnevno putovanje u Bratislavu iz NiÅ¡a, 18-21 Novembar, za 135 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=19:4-dnevno-putovanje-u-bratislavu-iz-nisa-18-21-novembar-za-135-evra-po-osobi ) NIÅ  - BRATISLAVA Kada: 18-21 Novembar Avionski prevoz + hotel 4* Broj noćenja: 3 cena aranžmana 135€/osobi 3-dnevno putovanje u Rim iz TemiÅ¡vara, 27-29 Oktobar, za 135 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=23:3-dnevno-putovanje-u-rim-iz-temisvara-27-29-oktobar-za-135-evra-po-osobi ) TEMIÅ VAR - RIM Kada: 27-29 Oktobar Avionski prevoz + hotel 4* Broj noćenja: 2 cena aranžmana 135€/osobi 3-dnevno putovanje u Pariz iz Beograda, 22-24 Novembar, za 145 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=24:3-dnevno-putovanje-u-pariz-iz-beograda-22-24-novembar-za-145-evra-po-osobi ) TEMIÅ VAR - RIM Kada: 22-24 Novembar Avionski prevoz + hotel 3* Broj noćenja: 2 cena aranžmana 145€/osobi 4-dnevno putovanje u Barselonu iz TemiÅ¡vara, 11-14 Novembar, za 160 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=14:4-dnevno-putovanje-u-barselonu-iz-temisvara-11-14-novembar-za-160-evra-po-osobi ) TEMIÅ VAR - BARSELONA Kada: 11-14 Novembar Avionski prevoz + hotel 4* Broj noćenja: 3 cena aranžmana 160€/osobi 8-dnevno putovanje u Larnaku (Kipar) iz Beograda, 13-20 Novembar, za 170 evra po osobi ( http://jeftinaputovanja.rs/index.php?option=com_k2&view=item&id=16:8-dnevno-putovanje-u-larnaku-kipar-iz-beograda-13-20-novembar-za-170-evra-po-osobi ) BEOGRAD - LARNAKA Kada: 13-20 Novembar Avionski prevoz + hotel 3* Broj noćenja: 7 cena aranžmana 170€/osobi www.jeftinaputovanja.rs ( http://www.jeftinaputovanja.rs ) Broj licence ОТP 47/2014 od 26/5/2014. Direktni telefon: 066 60 20 500 (Viber) Ukoliko viÅ¡e ne želite da primate naÅ¡e ponude ili Vam je mail poslat greÅ¡kom - iskreno Vam se izvinjavamo i molimo Vas da kliknete OVDE ZA UKLANJANJE SA NAÅ E LISTE (UNSUBSCRIBE) ( http://jeftinaputovanja.rs/index.php?subid=21978&option=com_acymailing&ctrl=user&task=saveunsub&key=MaU0Br9QPqpHsN&unsuball=1 ).U sluÄaju da imate bilo kakav problem sa ovim linkom, molimo Vas da odgovorite na ovaj mail i da napiÅ¡ete reÄ Odjava ili Unsubscribe. --b1_22f890beb296d144e36dbca7e51bab10 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit 4-dnevno putovanje u Milano za 130 evra po osobi i druge ponude
{forward} Pošalji prijatelju!{/forward}
 
milano nl sr

 

PONUDE NA DAN: 01/09/2016.

........................................................................................................................................

Predlažemo:
4-dnevno putovanje u Milano iz Niša,
26-29 Novembar, za 130 evra po osobi

 

           U cenu su uračunate:

                blue tick Avionske karte Niš - Milano - Niš, direktni letovi
                blue tick Aerodromske takse i ručni prtljag

                blue tick Smeštaj 3 noći u dvokrevetnoj sobi u eko-hotelu sa 3*

 

4-dnevno putovanje u Berlin iz Niša, 17-20 Novembar, za 115 evra po osobi

NIŠ - BERLIN

Kada: 17-20 Novembar
Avionski prevoz + hotel 3*
Broj noćenja: 3

cena aranžmana

115€/osobi

4-dnevno putovanje u Veneciju iz Temišvara, 19-22 Novembar, za 125 evra po osobi

TEMIŠVAR - VENECIJA

Kada: 19-22 Novembar
Avionski prevoz + hotel 3*
Broj noćenja: 3

cena aranžmana

125€/osobi


4-dnevno putovanje u Diseldorf iz Niša, 3-6 Novembar, za 130 evra po osobi

NIŠ - DISELDORF

Kada: 3-6 Novembar
Avionski prevoz + hotel 3*
Broj noćenja: 3

cena aranžmana

130€/osobi


3-dnevno putovanje u Malme iz Beograda, 25-27 Novembar, za 135 evra po osobi

BEOGRAD - MALME

Kada: 25-27 Novembar
Avionski prevoz + hotel 4*
Broj noćenja: 2

cena aranžmana

135€/osobi


4-dnevno putovanje u Bratislavu iz Niša, 18-21 Novembar, za 135 evra po osobi

NIŠ - BRATISLAVA

Kada: 18-21 Novembar
Avionski prevoz + hotel 4*
Broj noćenja: 3

cena aranžmana

135€/osobi


3-dnevno putovanje u Rim iz Temišvara, 27-29 Oktobar, za 135 evra po osobi

TEMIŠVAR - RIM

Kada: 27-29 Oktobar
Avionski prevoz + hotel 4*
Broj noćenja: 2

cena aranžmana

135€/osobi


3-dnevno putovanje u Pariz iz Beograda, 22-24 Novembar, za 145 evra po osobi

TEMIŠVAR - RIM

Kada: 22-24 Novembar
Avionski prevoz + hotel 3*
Broj noćenja: 2

cena aranžmana

145€/osobi


4-dnevno putovanje u Barselonu iz Temišvara, 11-14 Novembar, za 160 evra po osobi

TEMIŠVAR - BARSELONA

Kada: 11-14 Novembar
Avionski prevoz + hotel 4*
Broj noćenja: 3

cena aranžmana

160€/osobi


8-dnevno putovanje u Larnaku (Kipar) iz Beograda, 13-20 Novembar, za 170 evra po osobi

BEOGRAD - LARNAKA

Kada: 13-20 Novembar
Avionski prevoz + hotel 3*
Broj noćenja: 7

cena aranžmana

170€/osobi


 

    

logo
www.jeftinaputovanja.rs  
Broj licence ОТP 47/2014 od 26/5/2014.

Direktni telefon: 
066 60 20 500 (Viber)

 

Ukoliko više ne želite da primate naše ponude ili Vam je mail poslat greškom - iskreno Vam se izvinjavamo i molimo Vas da kliknete OVDE ZA UKLANJANJE SA NAŠE LISTE (UNSUBSCRIBE).U slučaju da imate bilo kakav problem sa ovim linkom, molimo Vas da odgovorite na ovaj mail i da napišete reč Odjava ili Unsubscribe.

 

--b1_22f890beb296d144e36dbca7e51bab10-- From bounces+2504343-36b9-xfs=oss.sgi.com@sendgrid.net Wed Aug 31 19:28:21 2016 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MIME_HTML_ONLY,SPOOFED_URL_HOST,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A23027CA0 for ; Wed, 31 Aug 2016 19:28:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D2AB304032 for ; Wed, 31 Aug 2016 17:28:21 -0700 (PDT) X-ASG-Debug-ID: 1472689690-0bf57c1b0a187d20001-NocioJ Received: from o1.sg.stampready.net (o1.sg.stampready.net [167.89.86.23]) by cuda.sgi.com with ESMTP id 3iGPwUMJtMfqt4Ow (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 31 Aug 2016 17:28:11 -0700 (PDT) X-Barracuda-Envelope-From: bounces+2504343-36b9-xfs=oss.sgi.com@sendgrid.net X-Barracuda-Effective-Source-IP: o1.sg.stampready.net[167.89.86.23] X-Barracuda-Apparent-Source-IP: 167.89.86.23 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.net; h=content-transfer-encoding:content-type:from:mime-version:subject:to; s=smtpapi; bh=BF/K0+Pxpo0dAZt51IELDr9ojYk=; b=gPUbjV0vCIn/SHoef0 PDD6zo1Ow6EF9IL7FTbQxLRI1yyexFCFhipsg0ATtjoLfDb6Tpw3dGJ1b5Vqsx/c mwZaKG6tqWYIwAl9yaWWih1+3W3AzAtRd+WaX/FOFcSrbfYPzq5b0V9AF0dT8sUp 6Cl3j39GMJJGjzzHLzDsBjMxY= Received: by filter0429p1mdw1.sendgrid.net with SMTP id filter0429p1mdw1.25061.57C775D51A 2016-09-01 00:27:01.400385328 +0000 UTC Received: from MjUwNDM0Mw (srv1.n-i-c-e.nl [128.140.221.60]) by ismtpd0004p1lon1.sendgrid.net (SG) with HTTP id ebf-HFLdS8OWXUzBN37FtA for ; Thu, 01 Sep 2016 00:27:01.372 +0000 (UTC) Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8 Date: Thu, 01 Sep 2016 00:27:01 +0000 From: "KOA CCTV" Mime-Version: 1.0 Subject: Labor Day Greeting and Special Promotion To: xfs@oss.sgi.com X-ASG-Orig-Subj: Labor Day Greeting and Special Promotion Message-ID: X-SG-EID: GPcH5AR4FNxUx3/k94obBuFzds479X57W1U837jaM3c5nJPwJ4YIJwH3F8MnQMdxwyOwBaAb2Jry7F KnZIFuzVu1xJ1/54lDxsVaHkhG1LkOqimGSnvOe6+7C09d3oJnIeGiunZ5gmwUP+BTkQk3+0dX3nob q3+lgbyv0AJAcpMBRvfD2Aj0MnWsabgnPeba7tqQ2uAcxWmb51TL+qm0vA== X-SG-ID: R3ufbdLo2r/cRGFtfGlyBnuluGc4rBVq9Koh9wvmVJM7bnymEg2sD2zt8HRaZGwN0/32KGlAuqWOQD PKvdgeZqNLU98XXd6Fhe8JME4u22YIHzZZkRMvD5fObh9VffnXq1+0r2oL7DNvSjKv/beVAqnX85oa sI8+5MaR/q0HSmSN2zy0B3GffBqC9Uq/INlO8jS+MWvC5e2CvdXT08mYFw== X-Barracuda-Connect: o1.sg.stampready.net[167.89.86.23] X-Barracuda-Start-Time: 1472689691 X-Barracuda-Encrypted: ECDHE-RSA-AES128-GCM-SHA256 X-Barracuda-URL: https://192.48.176.15:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 83367 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.17 X-Barracuda-Spam-Status: No, SCORE=0.17 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.32515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message = Labor Day Greeting an= d Special Promotion =09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09 =09=09=09=09=09 =09=09=09=09
3D"img"

 

HOME Wha= t's New
Specials
=20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
KOA CCTV
Wholesale Distributor of CCTV Camer= as, DVR & NVR
KOACCTV sp= ecializes in the wholesale distribution of CCTV Cameras, DVRs, Audio, Video= and Home Innovation. We support many top leading manufacturers and carry a= ll respected lines including Hikvision, HEOS, Lutron, Denon, Boston Acousti= cs, Monitor Audio, Klein Tools, Fibaro, Z-Wave etc. All installers and res= ellers are welcome.
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20
1
 
SEP
 
Sales Event
 
-10% OFF on all products.
Use 
"09012016" = Promo Code for Discount.
 
               =                      = ;                     &nb= sp;                     &= nbsp;                    =                     &nbs= p;                     &n= bsp;                     =                      = ;                     &nb= sp;                     &= nbsp;      
3D"img"

 

                 = ;                                    = ;                  

 

Smart Control at Home & Business
cloud-enabled automation system for professional integrators
Learn mo= re
NEW BRANDS
3D"icon"
3D"icon"

3D"icon"
=20=20=20=20 =20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20
3D"img" =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20
OLP-201=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20
3D""  Learn More=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
 =20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
3D"img" =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20
Wired-IR3=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20
3D""  Learn = More=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
 =20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
3D"img" =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20
Wired= -232
=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20 =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20
3D""  Learn More=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20
 
=09=09=09=09
3D"im=
 
3D"1i=
 
3D"4i=
 
3D"3i=
 
3D"2i=
=09=09=09=09=09
3D"im=
 
3D"1i=
 
3D"4i=
 
3D"3i=
 
3D"2i=
=09=09=09
3D"im=
 
3D"1i=
 
3D"4i=
 
3D"3i=
 
3D"2i=
=09=09=09=09=09
3D"im=
 
3D"1i=
 
3D"4i=
 
3D"3i=
 
3D"2i=
3D"im=
 
3D"1i=
 
3D"4i=
 
3D"3i=
 
3D"2i=
=09=09=09=09 =09=09=09=09=09 =09=09=09=09
KOA= CCTV
7306 COLDWATER CA= NYON AVE
Unit 1
North Hollywood, CA 91605
http://www.koacctv.com
Unsubscribe
3D""